
This patch replaces union tsf with u64 This also allows to use iwl_error_res and iwl_rxon_time_cmd instead of 3945 structures Signed-off-by: Tomas Winkler <tomas.winkler@intel.com> Acked-by: Samuel Ortiz <sameo@linux.intel.com> Signed-off-by: Reinette Chatre <reinette.chatre@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
769 lines
26 KiB
C
769 lines
26 KiB
C
/******************************************************************************
|
|
*
|
|
* 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));
|
|
|
|
/******************************************************************************
|
|
* (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_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 iwl_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__ */
|