| /****************************************************************************** |
| * |
| * This file is provided under a dual BSD/GPLv2 license. When using or |
| * redistributing this file, you may do so under either license. |
| * |
| * GPL LICENSE SUMMARY |
| * |
| * Copyright(c) 2005 - 2008 Intel Corporation. All rights reserved. |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of version 2 of the GNU General Public License as |
| * published by the Free Software Foundation. |
| * |
| * This program is distributed in the hope that it will be useful, but |
| * WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| * General Public License for more details. |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with this program; if not, write to the Free Software |
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110, |
| * USA |
| * |
| * The full GNU General Public License is included in this distribution |
| * in the file called LICENSE.GPL. |
| * |
| * Contact Information: |
| * Intel Linux Wireless <ilw@linux.intel.com> |
| * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 |
| * |
| * BSD LICENSE |
| * |
| * Copyright(c) 2005 - 2008 Intel Corporation. All rights reserved. |
| * All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * |
| * * Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * * Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in |
| * the documentation and/or other materials provided with the |
| * distribution. |
| * * Neither the name Intel Corporation nor the names of its |
| * contributors may be used to endorse or promote products derived |
| * from this software without specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| * |
| *****************************************************************************/ |
| /* |
| * Please use this file (iwl-3945-commands.h) only for uCode API definitions. |
| * Please use iwl-3945-hw.h for hardware-related definitions. |
| * Please use iwl-3945.h for driver implementation definitions. |
| */ |
| |
| #ifndef __iwl_3945_commands_h__ |
| #define __iwl_3945_commands_h__ |
| |
| /****************************************************************************** |
| * (0) |
| * Commonly used structures and definitions: |
| * Command header, txpower |
| * |
| *****************************************************************************/ |
| /** |
| * struct iwl3945_tx_power |
| * |
| * Used in REPLY_TX_PWR_TABLE_CMD, REPLY_SCAN_CMD, REPLY_CHANNEL_SWITCH |
| * |
| * Each entry contains two values: |
| * 1) DSP gain (or sometimes called DSP attenuation). This is a fine-grained |
| * linear value that multiplies the output of the digital signal processor, |
| * before being sent to the analog radio. |
| * 2) Radio gain. This sets the analog gain of the radio Tx path. |
| * It is a coarser setting, and behaves in a logarithmic (dB) fashion. |
| * |
| * Driver obtains values from struct iwl3945_tx_power power_gain_table[][]. |
| */ |
| struct iwl3945_tx_power { |
| u8 tx_gain; /* gain for analog radio */ |
| u8 dsp_atten; /* gain for DSP */ |
| } __attribute__ ((packed)); |
| |
| /** |
| * struct iwl3945_power_per_rate |
| * |
| * Used in REPLY_TX_PWR_TABLE_CMD, REPLY_CHANNEL_SWITCH |
| */ |
| struct iwl3945_power_per_rate { |
| u8 rate; /* plcp */ |
| struct iwl3945_tx_power tpc; |
| u8 reserved; |
| } __attribute__ ((packed)); |
| |
| /****************************************************************************** |
| * (0a) |
| * Alive and Error Commands & Responses: |
| * |
| *****************************************************************************/ |
| |
| |
| /* |
| * ("Initialize") REPLY_ALIVE = 0x1 (response only, not a command) |
| * |
| * uCode issues this "initialize alive" notification once the initialization |
| * uCode image has completed its work, and is ready to load the runtime image. |
| * This is the *first* "alive" notification that the driver will receive after |
| * rebooting uCode; the "initialize" alive is indicated by subtype field == 9. |
| * |
| * See comments documenting "BSM" (bootstrap state machine). |
| */ |
| struct iwl3945_init_alive_resp { |
| u8 ucode_minor; |
| u8 ucode_major; |
| __le16 reserved1; |
| u8 sw_rev[8]; |
| u8 ver_type; |
| u8 ver_subtype; /* "9" for initialize alive */ |
| __le16 reserved2; |
| __le32 log_event_table_ptr; |
| __le32 error_event_table_ptr; |
| __le32 timestamp; |
| __le32 is_valid; |
| } __attribute__ ((packed)); |
| |
| |
| /** |
| * REPLY_ALIVE = 0x1 (response only, not a command) |
| * |
| * uCode issues this "alive" notification once the runtime image is ready |
| * to receive commands from the driver. This is the *second* "alive" |
| * notification that the driver will receive after rebooting uCode; |
| * this "alive" is indicated by subtype field != 9. |
| * |
| * See comments documenting "BSM" (bootstrap state machine). |
| * |
| * This response includes two pointers to structures within the device's |
| * data SRAM (access via HBUS_TARG_MEM_* regs) that are useful for debugging: |
| * |
| * 1) log_event_table_ptr indicates base of the event log. This traces |
| * a 256-entry history of uCode execution within a circular buffer. |
| * |
| * 2) error_event_table_ptr indicates base of the error log. This contains |
| * information about any uCode error that occurs. |
| * |
| * The Linux driver can print both logs to the system log when a uCode error |
| * occurs. |
| */ |
| struct iwl3945_alive_resp { |
| u8 ucode_minor; |
| u8 ucode_major; |
| __le16 reserved1; |
| u8 sw_rev[8]; |
| u8 ver_type; |
| u8 ver_subtype; /* not "9" for runtime alive */ |
| __le16 reserved2; |
| __le32 log_event_table_ptr; /* SRAM address for event log */ |
| __le32 error_event_table_ptr; /* SRAM address for error log */ |
| __le32 timestamp; |
| __le32 is_valid; |
| } __attribute__ ((packed)); |
| |
| union tsf { |
| u8 byte[8]; |
| __le16 word[4]; |
| __le32 dw[2]; |
| }; |
| |
| /* |
| * REPLY_ERROR = 0x2 (response only, not a command) |
| */ |
| struct iwl3945_error_resp { |
| __le32 error_type; |
| u8 cmd_id; |
| u8 reserved1; |
| __le16 bad_cmd_seq_num; |
| __le16 reserved2; |
| __le32 error_info; |
| union tsf timestamp; |
| } __attribute__ ((packed)); |
| |
| /****************************************************************************** |
| * (1) |
| * RXON Commands & Responses: |
| * |
| *****************************************************************************/ |
| |
| /** |
| * REPLY_RXON = 0x10 (command, has simple generic response) |
| * |
| * RXON tunes the radio tuner to a service channel, and sets up a number |
| * of parameters that are used primarily for Rx, but also for Tx operations. |
| * |
| * NOTE: When tuning to a new channel, driver must set the |
| * RXON_FILTER_ASSOC_MSK to 0. This will clear station-dependent |
| * info within the device, including the station tables, tx retry |
| * rate tables, and txpower tables. Driver must build a new station |
| * table and txpower table before transmitting anything on the RXON |
| * channel. |
| * |
| * NOTE: All RXONs wipe clean the internal txpower table. Driver must |
| * issue a new REPLY_TX_PWR_TABLE_CMD after each REPLY_RXON (0x10), |
| * regardless of whether RXON_FILTER_ASSOC_MSK is set. |
| */ |
| struct iwl3945_rxon_cmd { |
| u8 node_addr[6]; |
| __le16 reserved1; |
| u8 bssid_addr[6]; |
| __le16 reserved2; |
| u8 wlap_bssid_addr[6]; |
| __le16 reserved3; |
| u8 dev_type; |
| u8 air_propagation; |
| __le16 reserved4; |
| u8 ofdm_basic_rates; |
| u8 cck_basic_rates; |
| __le16 assoc_id; |
| __le32 flags; |
| __le32 filter_flags; |
| __le16 channel; |
| __le16 reserved5; |
| } __attribute__ ((packed)); |
| |
| /* |
| * REPLY_RXON_ASSOC = 0x11 (command, has simple generic response) |
| */ |
| struct iwl3945_rxon_assoc_cmd { |
| __le32 flags; |
| __le32 filter_flags; |
| u8 ofdm_basic_rates; |
| u8 cck_basic_rates; |
| __le16 reserved; |
| } __attribute__ ((packed)); |
| |
| /* |
| * REPLY_RXON_TIMING = 0x14 (command, has simple generic response) |
| */ |
| struct iwl3945_rxon_time_cmd { |
| union tsf timestamp; |
| __le16 beacon_interval; |
| __le16 atim_window; |
| __le32 beacon_init_val; |
| __le16 listen_interval; |
| __le16 reserved; |
| } __attribute__ ((packed)); |
| |
| /* |
| * REPLY_CHANNEL_SWITCH = 0x72 (command, has simple generic response) |
| */ |
| struct iwl3945_channel_switch_cmd { |
| u8 band; |
| u8 expect_beacon; |
| __le16 channel; |
| __le32 rxon_flags; |
| __le32 rxon_filter_flags; |
| __le32 switch_time; |
| struct iwl3945_power_per_rate power[IWL_MAX_RATES]; |
| } __attribute__ ((packed)); |
| |
| /****************************************************************************** |
| * (3) |
| * Add/Modify Stations Commands & Responses: |
| * |
| *****************************************************************************/ |
| /* |
| * REPLY_ADD_STA = 0x18 (command) |
| * |
| * The device contains an internal table of per-station information, |
| * with info on security keys, aggregation parameters, and Tx rates for |
| * initial Tx attempt and any retries (4965 uses REPLY_TX_LINK_QUALITY_CMD, |
| * 3945 uses REPLY_RATE_SCALE to set up rate tables). |
| * |
| * REPLY_ADD_STA sets up the table entry for one station, either creating |
| * a new entry, or modifying a pre-existing one. |
| * |
| * NOTE: RXON command (without "associated" bit set) wipes the station table |
| * clean. Moving into RF_KILL state does this also. Driver must set up |
| * new station table before transmitting anything on the RXON channel |
| * (except active scans or active measurements; those commands carry |
| * their own txpower/rate setup data). |
| * |
| * When getting started on a new channel, driver must set up the |
| * IWL_BROADCAST_ID entry (last entry in the table). For a client |
| * station in a BSS, once an AP is selected, driver sets up the AP STA |
| * in the IWL_AP_ID entry (1st entry in the table). BROADCAST and AP |
| * are all that are needed for a BSS client station. If the device is |
| * used as AP, or in an IBSS network, driver must set up station table |
| * entries for all STAs in network, starting with index IWL_STA_ID. |
| */ |
| struct iwl3945_addsta_cmd { |
| u8 mode; /* 1: modify existing, 0: add new station */ |
| u8 reserved[3]; |
| struct sta_id_modify sta; |
| struct iwl4965_keyinfo key; |
| __le32 station_flags; /* STA_FLG_* */ |
| __le32 station_flags_msk; /* STA_FLG_* */ |
| |
| /* bit field to disable (1) or enable (0) Tx for Traffic ID (TID) |
| * corresponding to bit (e.g. bit 5 controls TID 5). |
| * Set modify_mask bit STA_MODIFY_TID_DISABLE_TX to use this field. */ |
| __le16 tid_disable_tx; |
| |
| __le16 rate_n_flags; |
| |
| /* TID for which to add block-ack support. |
| * Set modify_mask bit STA_MODIFY_ADDBA_TID_MSK to use this field. */ |
| u8 add_immediate_ba_tid; |
| |
| /* TID for which to remove block-ack support. |
| * Set modify_mask bit STA_MODIFY_DELBA_TID_MSK to use this field. */ |
| u8 remove_immediate_ba_tid; |
| |
| /* Starting Sequence Number for added block-ack support. |
| * Set modify_mask bit STA_MODIFY_ADDBA_TID_MSK to use this field. */ |
| __le16 add_immediate_ba_ssn; |
| } __attribute__ ((packed)); |
| |
| |
| /****************************************************************************** |
| * (4) |
| * Rx Responses: |
| * |
| *****************************************************************************/ |
| |
| struct iwl3945_rx_frame_stats { |
| u8 phy_count; |
| u8 id; |
| u8 rssi; |
| u8 agc; |
| __le16 sig_avg; |
| __le16 noise_diff; |
| u8 payload[0]; |
| } __attribute__ ((packed)); |
| |
| struct iwl3945_rx_frame_hdr { |
| __le16 channel; |
| __le16 phy_flags; |
| u8 reserved1; |
| u8 rate; |
| __le16 len; |
| u8 payload[0]; |
| } __attribute__ ((packed)); |
| |
| |
| |
| struct iwl3945_rx_frame_end { |
| __le32 status; |
| __le64 timestamp; |
| __le32 beacon_timestamp; |
| } __attribute__ ((packed)); |
| |
| /* |
| * REPLY_3945_RX = 0x1b (response only, not a command) |
| * |
| * NOTE: DO NOT dereference from casts to this structure |
| * It is provided only for calculating minimum data set size. |
| * The actual offsets of the hdr and end are dynamic based on |
| * stats.phy_count |
| */ |
| struct iwl3945_rx_frame { |
| struct iwl3945_rx_frame_stats stats; |
| struct iwl3945_rx_frame_hdr hdr; |
| struct iwl3945_rx_frame_end end; |
| } __attribute__ ((packed)); |
| |
| /****************************************************************************** |
| * (5) |
| * Tx Commands & Responses: |
| * |
| * Driver must place each REPLY_TX command into one of the prioritized Tx |
| * queues in host DRAM, shared between driver and device. When the device's |
| * Tx scheduler and uCode are preparing to transmit, the device pulls the |
| * Tx command over the PCI bus via one of the device's Tx DMA channels, |
| * to fill an internal FIFO from which data will be transmitted. |
| * |
| * uCode handles all timing and protocol related to control frames |
| * (RTS/CTS/ACK), based on flags in the Tx command. |
| * |
| * uCode handles retrying Tx when an ACK is expected but not received. |
| * This includes trying lower data rates than the one requested in the Tx |
| * command, as set up by the REPLY_RATE_SCALE (for 3945) or |
| * REPLY_TX_LINK_QUALITY_CMD (4965). |
| * |
| * Driver sets up transmit power for various rates via REPLY_TX_PWR_TABLE_CMD. |
| * This command must be executed after every RXON command, before Tx can occur. |
| *****************************************************************************/ |
| |
| /* |
| * REPLY_TX = 0x1c (command) |
| */ |
| struct iwl3945_tx_cmd { |
| /* |
| * MPDU byte count: |
| * MAC header (24/26/30/32 bytes) + 2 bytes pad if 26/30 header size, |
| * + 8 byte IV for CCM or TKIP (not used for WEP) |
| * + Data payload |
| * + 8-byte MIC (not used for CCM/WEP) |
| * NOTE: Does not include Tx command bytes, post-MAC pad bytes, |
| * MIC (CCM) 8 bytes, ICV (WEP/TKIP/CKIP) 4 bytes, CRC 4 bytes.i |
| * Range: 14-2342 bytes. |
| */ |
| __le16 len; |
| |
| /* |
| * MPDU or MSDU byte count for next frame. |
| * Used for fragmentation and bursting, but not 11n aggregation. |
| * Same as "len", but for next frame. Set to 0 if not applicable. |
| */ |
| __le16 next_frame_len; |
| |
| __le32 tx_flags; /* TX_CMD_FLG_* */ |
| |
| u8 rate; |
| |
| /* Index of recipient station in uCode's station table */ |
| u8 sta_id; |
| u8 tid_tspec; |
| u8 sec_ctl; |
| u8 key[16]; |
| union { |
| u8 byte[8]; |
| __le16 word[4]; |
| __le32 dw[2]; |
| } tkip_mic; |
| __le32 next_frame_info; |
| union { |
| __le32 life_time; |
| __le32 attempt; |
| } stop_time; |
| u8 supp_rates[2]; |
| u8 rts_retry_limit; /*byte 50 */ |
| u8 data_retry_limit; /*byte 51 */ |
| union { |
| __le16 pm_frame_timeout; |
| __le16 attempt_duration; |
| } timeout; |
| |
| /* |
| * Duration of EDCA burst Tx Opportunity, in 32-usec units. |
| * Set this if txop time is not specified by HCCA protocol (e.g. by AP). |
| */ |
| __le16 driver_txop; |
| |
| /* |
| * MAC header goes here, followed by 2 bytes padding if MAC header |
| * length is 26 or 30 bytes, followed by payload data |
| */ |
| u8 payload[0]; |
| struct ieee80211_hdr hdr[0]; |
| } __attribute__ ((packed)); |
| |
| /* |
| * REPLY_TX = 0x1c (response) |
| */ |
| struct iwl3945_tx_resp { |
| u8 failure_rts; |
| u8 failure_frame; |
| u8 bt_kill_count; |
| u8 rate; |
| __le32 wireless_media_time; |
| __le32 status; /* TX status */ |
| } __attribute__ ((packed)); |
| |
| /* |
| * REPLY_TX_PWR_TABLE_CMD = 0x97 (command, has simple generic response) |
| */ |
| struct iwl3945_txpowertable_cmd { |
| u8 band; /* 0: 5 GHz, 1: 2.4 GHz */ |
| u8 reserved; |
| __le16 channel; |
| struct iwl3945_power_per_rate power[IWL_MAX_RATES]; |
| } __attribute__ ((packed)); |
| |
| struct iwl3945_rate_scaling_info { |
| __le16 rate_n_flags; |
| u8 try_cnt; |
| u8 next_rate_index; |
| } __attribute__ ((packed)); |
| |
| /** |
| * struct iwl3945_rate_scaling_cmd - Rate Scaling Command & Response |
| * |
| * REPLY_RATE_SCALE = 0x47 (command, has simple generic response) |
| * |
| * NOTE: The table of rates passed to the uCode via the |
| * RATE_SCALE command sets up the corresponding order of |
| * rates used for all related commands, including rate |
| * masks, etc. |
| * |
| * For example, if you set 9MB (PLCP 0x0f) as the first |
| * rate in the rate table, the bit mask for that rate |
| * when passed through ofdm_basic_rates on the REPLY_RXON |
| * command would be bit 0 (1 << 0) |
| */ |
| struct iwl3945_rate_scaling_cmd { |
| u8 table_id; |
| u8 reserved[3]; |
| struct iwl3945_rate_scaling_info table[IWL_MAX_RATES]; |
| } __attribute__ ((packed)); |
| |
| /****************************************************************************** |
| * (8) |
| * Scan Commands, Responses, Notifications: |
| * |
| *****************************************************************************/ |
| |
| /** |
| * struct iwl3945_scan_channel - entry in REPLY_SCAN_CMD channel table |
| * |
| * One for each channel in the scan list. |
| * Each channel can independently select: |
| * 1) SSID for directed active scans |
| * 2) Txpower setting (for rate specified within Tx command) |
| * 3) How long to stay on-channel (behavior may be modified by quiet_time, |
| * quiet_plcp_th, good_CRC_th) |
| * |
| * To avoid uCode errors, make sure the following are true (see comments |
| * under struct iwl3945_scan_cmd about max_out_time and quiet_time): |
| * 1) If using passive_dwell (i.e. passive_dwell != 0): |
| * active_dwell <= passive_dwell (< max_out_time if max_out_time != 0) |
| * 2) quiet_time <= active_dwell |
| * 3) If restricting off-channel time (i.e. max_out_time !=0): |
| * passive_dwell < max_out_time |
| * active_dwell < max_out_time |
| */ |
| struct iwl3945_scan_channel { |
| /* |
| * type is defined as: |
| * 0:0 1 = active, 0 = passive |
| * 1:4 SSID direct bit map; if a bit is set, then corresponding |
| * SSID IE is transmitted in probe request. |
| * 5:7 reserved |
| */ |
| u8 type; |
| u8 channel; /* band is selected by iwl3945_scan_cmd "flags" field */ |
| struct iwl3945_tx_power tpc; |
| __le16 active_dwell; /* in 1024-uSec TU (time units), typ 5-50 */ |
| __le16 passive_dwell; /* in 1024-uSec TU (time units), typ 20-500 */ |
| } __attribute__ ((packed)); |
| |
| |
| /* |
| * REPLY_SCAN_CMD = 0x80 (command) |
| * |
| * The hardware scan command is very powerful; the driver can set it up to |
| * maintain (relatively) normal network traffic while doing a scan in the |
| * background. The max_out_time and suspend_time control the ratio of how |
| * long the device stays on an associated network channel ("service channel") |
| * vs. how long it's away from the service channel, tuned to other channels |
| * for scanning. |
| * |
| * max_out_time is the max time off-channel (in usec), and suspend_time |
| * is how long (in "extended beacon" format) that the scan is "suspended" |
| * after returning to the service channel. That is, suspend_time is the |
| * time that we stay on the service channel, doing normal work, between |
| * scan segments. The driver may set these parameters differently to support |
| * scanning when associated vs. not associated, and light vs. heavy traffic |
| * loads when associated. |
| * |
| * After receiving this command, the device's scan engine does the following; |
| * |
| * 1) Sends SCAN_START notification to driver |
| * 2) Checks to see if it has time to do scan for one channel |
| * 3) Sends NULL packet, with power-save (PS) bit set to 1, |
| * to tell AP that we're going off-channel |
| * 4) Tunes to first channel in scan list, does active or passive scan |
| * 5) Sends SCAN_RESULT notification to driver |
| * 6) Checks to see if it has time to do scan on *next* channel in list |
| * 7) Repeats 4-6 until it no longer has time to scan the next channel |
| * before max_out_time expires |
| * 8) Returns to service channel |
| * 9) Sends NULL packet with PS=0 to tell AP that we're back |
| * 10) Stays on service channel until suspend_time expires |
| * 11) Repeats entire process 2-10 until list is complete |
| * 12) Sends SCAN_COMPLETE notification |
| * |
| * For fast, efficient scans, the scan command also has support for staying on |
| * a channel for just a short time, if doing active scanning and getting no |
| * responses to the transmitted probe request. This time is controlled by |
| * quiet_time, and the number of received packets below which a channel is |
| * considered "quiet" is controlled by quiet_plcp_threshold. |
| * |
| * For active scanning on channels that have regulatory restrictions against |
| * blindly transmitting, the scan can listen before transmitting, to make sure |
| * that there is already legitimate activity on the channel. If enough |
| * packets are cleanly received on the channel (controlled by good_CRC_th, |
| * typical value 1), the scan engine starts transmitting probe requests. |
| * |
| * Driver must use separate scan commands for 2.4 vs. 5 GHz bands. |
| * |
| * To avoid uCode errors, see timing restrictions described under |
| * struct iwl3945_scan_channel. |
| */ |
| struct iwl3945_scan_cmd { |
| __le16 len; |
| u8 reserved0; |
| u8 channel_count; /* # channels in channel list */ |
| __le16 quiet_time; /* dwell only this # millisecs on quiet channel |
| * (only for active scan) */ |
| __le16 quiet_plcp_th; /* quiet chnl is < this # pkts (typ. 1) */ |
| __le16 good_CRC_th; /* passive -> active promotion threshold */ |
| __le16 reserved1; |
| __le32 max_out_time; /* max usec to be away from associated (service) |
| * channel */ |
| __le32 suspend_time; /* pause scan this long (in "extended beacon |
| * format") when returning to service channel: |
| * 3945; 31:24 # beacons, 19:0 additional usec, |
| * 4965; 31:22 # beacons, 21:0 additional usec. |
| */ |
| __le32 flags; /* RXON_FLG_* */ |
| __le32 filter_flags; /* RXON_FILTER_* */ |
| |
| /* For active scans (set to all-0s for passive scans). |
| * Does not include payload. Must specify Tx rate; no rate scaling. */ |
| struct iwl3945_tx_cmd tx_cmd; |
| |
| /* For directed active scans (set to all-0s otherwise) */ |
| struct iwl_ssid_ie direct_scan[PROBE_OPTION_MAX_API1]; |
| |
| /* |
| * Probe request frame, followed by channel list. |
| * |
| * Size of probe request frame is specified by byte count in tx_cmd. |
| * Channel list follows immediately after probe request frame. |
| * Number of channels in list is specified by channel_count. |
| * Each channel in list is of type: |
| * |
| * struct iwl3945_scan_channel channels[0]; |
| * |
| * NOTE: Only one band of channels can be scanned per pass. You |
| * must not mix 2.4GHz channels and 5.2GHz channels, and you must wait |
| * for one scan to complete (i.e. receive SCAN_COMPLETE_NOTIFICATION) |
| * before requesting another scan. |
| */ |
| u8 data[0]; |
| } __attribute__ ((packed)); |
| |
| /****************************************************************************** |
| * (9) |
| * IBSS/AP Commands and Notifications: |
| * |
| *****************************************************************************/ |
| |
| /* |
| * BEACON_NOTIFICATION = 0x90 (notification only, not a command) |
| */ |
| struct iwl3945_beacon_notif { |
| struct iwl3945_tx_resp beacon_notify_hdr; |
| __le32 low_tsf; |
| __le32 high_tsf; |
| __le32 ibss_mgr_status; |
| } __attribute__ ((packed)); |
| |
| /* |
| * REPLY_TX_BEACON = 0x91 (command, has simple generic response) |
| */ |
| struct iwl3945_tx_beacon_cmd { |
| struct iwl3945_tx_cmd tx; |
| __le16 tim_idx; |
| u8 tim_size; |
| u8 reserved1; |
| struct ieee80211_hdr frame[0]; /* beacon frame */ |
| } __attribute__ ((packed)); |
| |
| /****************************************************************************** |
| * (10) |
| * Statistics Commands and Notifications: |
| * |
| *****************************************************************************/ |
| |
| struct iwl39_statistics_rx_phy { |
| __le32 ina_cnt; |
| __le32 fina_cnt; |
| __le32 plcp_err; |
| __le32 crc32_err; |
| __le32 overrun_err; |
| __le32 early_overrun_err; |
| __le32 crc32_good; |
| __le32 false_alarm_cnt; |
| __le32 fina_sync_err_cnt; |
| __le32 sfd_timeout; |
| __le32 fina_timeout; |
| __le32 unresponded_rts; |
| __le32 rxe_frame_limit_overrun; |
| __le32 sent_ack_cnt; |
| __le32 sent_cts_cnt; |
| } __attribute__ ((packed)); |
| |
| struct iwl39_statistics_rx_non_phy { |
| __le32 bogus_cts; /* CTS received when not expecting CTS */ |
| __le32 bogus_ack; /* ACK received when not expecting ACK */ |
| __le32 non_bssid_frames; /* number of frames with BSSID that |
| * doesn't belong to the STA BSSID */ |
| __le32 filtered_frames; /* count frames that were dumped in the |
| * filtering process */ |
| __le32 non_channel_beacons; /* beacons with our bss id but not on |
| * our serving channel */ |
| } __attribute__ ((packed)); |
| |
| struct iwl39_statistics_rx { |
| struct iwl39_statistics_rx_phy ofdm; |
| struct iwl39_statistics_rx_phy cck; |
| struct iwl39_statistics_rx_non_phy general; |
| } __attribute__ ((packed)); |
| |
| struct iwl39_statistics_tx { |
| __le32 preamble_cnt; |
| __le32 rx_detected_cnt; |
| __le32 bt_prio_defer_cnt; |
| __le32 bt_prio_kill_cnt; |
| __le32 few_bytes_cnt; |
| __le32 cts_timeout; |
| __le32 ack_timeout; |
| __le32 expected_ack_cnt; |
| __le32 actual_ack_cnt; |
| } __attribute__ ((packed)); |
| |
| struct iwl39_statistics_div { |
| __le32 tx_on_a; |
| __le32 tx_on_b; |
| __le32 exec_time; |
| __le32 probe_time; |
| } __attribute__ ((packed)); |
| |
| struct iwl39_statistics_general { |
| __le32 temperature; |
| struct statistics_dbg dbg; |
| __le32 sleep_time; |
| __le32 slots_out; |
| __le32 slots_idle; |
| __le32 ttl_timestamp; |
| struct iwl39_statistics_div div; |
| } __attribute__ ((packed)); |
| |
| /* |
| * STATISTICS_NOTIFICATION = 0x9d (notification only, not a command) |
| * |
| * By default, uCode issues this notification after receiving a beacon |
| * while associated. To disable this behavior, set DISABLE_NOTIF flag in the |
| * REPLY_STATISTICS_CMD 0x9c, above. |
| * |
| * Statistics counters continue to increment beacon after beacon, but are |
| * cleared when changing channels or when driver issues REPLY_STATISTICS_CMD |
| * 0x9c with CLEAR_STATS bit set (see above). |
| * |
| * uCode also issues this notification during scans. uCode clears statistics |
| * appropriately so that each notification contains statistics for only the |
| * one channel that has just been scanned. |
| */ |
| struct iwl3945_notif_statistics { |
| __le32 flag; |
| struct statistics_rx rx; |
| struct statistics_tx tx; |
| struct statistics_general general; |
| } __attribute__ ((packed)); |
| |
| |
| /****************************************************************************** |
| * (13) |
| * Union of all expected notifications/responses: |
| * |
| *****************************************************************************/ |
| |
| struct iwl3945_rx_packet { |
| __le32 len; |
| struct iwl_cmd_header hdr; |
| union { |
| struct iwl3945_alive_resp alive_frame; |
| struct iwl3945_rx_frame rx_frame; |
| struct iwl3945_tx_resp tx_resp; |
| struct iwl_spectrum_notification spectrum_notif; |
| struct iwl_csa_notification csa_notif; |
| struct iwl3945_error_resp err_resp; |
| struct iwl_card_state_notif card_state_notif; |
| struct iwl3945_beacon_notif beacon_status; |
| struct iwl_add_sta_resp add_sta; |
| struct iwl_sleep_notification sleep_notif; |
| struct iwl_spectrum_resp spectrum; |
| struct iwl3945_notif_statistics stats; |
| __le32 status; |
| u8 raw[0]; |
| } u; |
| } __attribute__ ((packed)); |
| |
| #define IWL_RX_FRAME_SIZE (4 + sizeof(struct iwl3945_rx_frame)) |
| |
| #endif /* __iwl3945_3945_commands_h__ */ |