/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ /* * Copyright (C) 2005-2014, 2023-2025 Intel Corporation
*/ /* * Please use this file (commands.h) only for uCode API definitions. * Please use iwl-xxxx-hw.h for hardware-related definitions. * Please use dev.h for driver implementation definitions.
*/
/* IBSS/AP commands */
BEACON_NOTIFICATION = 0x90,
REPLY_TX_BEACON = 0x91,
WHO_IS_AWAKE_NOTIFICATION = 0x94, /* not used */
/* Miscellaneous commands */
REPLY_TX_POWER_DBM_CMD = 0x95,
QUIET_NOTIFICATION = 0x96, /* not used */
REPLY_TX_PWR_TABLE_CMD = 0x97,
REPLY_TX_POWER_DBM_CMD_V1 = 0x98, /* old version of API */
TX_ANT_CONFIGURATION_CMD = 0x98,
MEASURE_ABORT_NOTIFICATION = 0x99, /* not used */
/* Bluetooth device coexistence config command */
REPLY_BT_CONFIG = 0x9b,
/* * Minimum number of queues. MAX_NUM is defined in hw specific files. * Set the minimum to accommodate * - 4 standard TX queues * - the command queue * - 4 PAN TX queues * - the PAN multicast queue, and * - the AUX (TX during scan dwell) queue.
*/ #define IWL_MIN_NUM_QUEUES 11
/* * This queue number is required for proper operation * because the ucode will stop/start the scheduler as * required.
*/ #define IWL_IPAN_MCAST_QUEUE 8
/****************************************************************************** * (0) * Commonly used structures and definitions: * Command header, rate_n_flags, txpower *
*****************************************************************************/
/* * iwlagn rate_n_flags bit fields * * rate_n_flags format is used in following iwlagn commands: * REPLY_RX (response only) * REPLY_RX_MPDU (response only) * REPLY_TX (both command and response) * REPLY_TX_LINK_QUALITY_CMD * * High-throughput (HT) rate format for bits 7:0 (bit 8 must be "1"): * 2-0: 0) 6 Mbps * 1) 12 Mbps * 2) 18 Mbps * 3) 24 Mbps * 4) 36 Mbps * 5) 48 Mbps * 6) 54 Mbps * 7) 60 Mbps * * 4-3: 0) Single stream (SISO) * 1) Dual stream (MIMO) * 2) Triple stream (MIMO) * * 5: Value of 0x20 in bits 7:0 indicates 6 Mbps HT40 duplicate data * * Legacy OFDM rate format for bits 7:0 (bit 8 must be "0", bit 9 "0"): * 3-0: 0xD) 6 Mbps * 0xF) 9 Mbps * 0x5) 12 Mbps * 0x7) 18 Mbps * 0x9) 24 Mbps * 0xB) 36 Mbps * 0x1) 48 Mbps * 0x3) 54 Mbps * * Legacy CCK rate format for bits 7:0 (bit 8 must be "0", bit 9 "1"): * 6-0: 10) 1 Mbps * 20) 2 Mbps * 55) 5.5 Mbps * 110) 11 Mbps
*/ #define RATE_MCS_CODE_MSK 0x7 #define RATE_MCS_SPATIAL_POS 3 #define RATE_MCS_SPATIAL_MSK 0x18 #define RATE_MCS_HT_DUP_POS 5 #define RATE_MCS_HT_DUP_MSK 0x20 /* Both legacy and HT use bits 7:0 as the CCK/OFDM rate or HT MCS */ #define RATE_MCS_RATE_MSK 0xff
/* Bit 8: (1) HT format, (0) legacy format in bits 7:0 */ #define RATE_MCS_FLAGS_POS 8 #define RATE_MCS_HT_POS 8 #define RATE_MCS_HT_MSK 0x100
/* Bit 9: (1) CCK, (0) OFDM. HT (bit 8) must be "0" for this bit to be valid */ #define RATE_MCS_CCK_POS 9 #define RATE_MCS_CCK_MSK 0x200
/* Bit 10: (1) Use Green Field preamble */ #define RATE_MCS_GF_POS 10 #define RATE_MCS_GF_MSK 0x400
/* Bit 11: (1) Use 40Mhz HT40 chnl width, (0) use 20 MHz legacy chnl width */ #define RATE_MCS_HT40_POS 11 #define RATE_MCS_HT40_MSK 0x800
/* Bit 12: (1) Duplicate data on both 20MHz chnls. HT40 (bit 11) must be set. */ #define RATE_MCS_DUP_POS 12 #define RATE_MCS_DUP_MSK 0x1000
/* Bit 13: (1) Short guard interval (0.4 usec), (0) normal GI (0.8 usec) */ #define RATE_MCS_SGI_POS 13 #define RATE_MCS_SGI_MSK 0x2000
/* * Command TX_ANT_CONFIGURATION_CMD = 0x98 * This command is used to configure valid Tx antenna. * By default uCode concludes the valid antenna according to the radio flavor. * This command enables the driver to override/modify this conclusion.
*/ struct iwl_tx_ant_config_cmd {
__le32 valid;
} __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. * Its header format is: * * __le32 log_size; log capacity (in number of entries) * __le32 type; (1) timestamp with each entry, (0) no timestamp * __le32 wraps; # times uCode has wrapped to top of circular buffer * __le32 write_index; next circular buffer entry that uCode would fill * * The header is followed by the circular buffer of log entries. Entries * with timestamps have the following format: * * __le32 event_id; range 0 - 1500 * __le32 timestamp; low 32 bits of TSF (of network, if associated) * __le32 data; event_id-specific data value * * Entries without timestamps contain only event_id and data. * * * 2) error_event_table_ptr indicates base of the error log. This contains * information about any uCode error that occurs. For agn, the format * of the error log is defined by struct iwl_error_event_table. * * The Linux driver can print both logs to the system log when a uCode error * occurs.
*/
/* * Note: This structure is read from the device with IO accesses, * and the reading already does the endian conversion. As it is * read with u32-sized accesses, any members with a different size * need to be ordered correctly though!
*/ struct iwl_error_event_table {
u32 valid; /* (nonzero) valid, (0) log is empty */
u32 error_id; /* type of error */
u32 pc; /* program counter */
u32 blink1; /* branch link */
u32 blink2; /* branch link */
u32 ilink1; /* interrupt link */
u32 ilink2; /* interrupt link */
u32 data1; /* error-specific data */
u32 data2; /* error-specific data */
u32 line; /* source code line of error */
u32 bcon_time; /* beacon timer */
u32 tsf_low; /* network timestamp function timer */
u32 tsf_hi; /* network timestamp function timer */
u32 gp1; /* GP1 timer register */
u32 gp2; /* GP2 timer register */
u32 gp3; /* GP3 timer register */
u32 ucode_ver; /* uCode version */
u32 hw_ver; /* HW Silicon version */
u32 brd_ver; /* HW board version */
u32 log_pc; /* log program counter */
u32 frame_ptr; /* frame pointer */
u32 stack_ptr; /* stack pointer */
u32 hcmd; /* last host command header */
u32 isr0; /* isr status register LMPM_NIC_ISR0:
* rxtx_flag */
u32 isr1; /* isr status register LMPM_NIC_ISR1:
* host_flag */
u32 isr2; /* isr status register LMPM_NIC_ISR2:
* enc_flag */
u32 isr3; /* isr status register LMPM_NIC_ISR3:
* time_flag */
u32 isr4; /* isr status register LMPM_NIC_ISR4:
* wico interrupt */
u32 isr_pref; /* isr status register LMPM_NIC_PREF_STAT */
u32 wait_event; /* wait event() caller address */
u32 l2p_control; /* L2pControlField */
u32 l2p_duration; /* L2pDurationField */
u32 l2p_mhvalid; /* L2pMhValidBits */
u32 l2p_addr_match; /* L2pAddrMatchStat */
u32 lmpm_pmg_sel; /* indicate which clocks are turned on
* (LMPM_PMG_SEL) */
u32 u_timestamp; /* indicate when the date and time of the
* compilation */
u32 flow_handler; /* FH read/write pointers, RX credit */
} __packed;
/* CTS to self (if spec allows) flag */ #define RXON_FLG_SELF_CTS_EN cpu_to_le32(0x1<<30)
/* rx_config filter flags */ /* accept all data frames */ #define RXON_FILTER_PROMISC_MSK cpu_to_le32(1 << 0) /* pass control & management to host */ #define RXON_FILTER_CTL2HOST_MSK cpu_to_le32(1 << 1) /* accept multi-cast */ #define RXON_FILTER_ACCEPT_GRP_MSK cpu_to_le32(1 << 2) /* don't decrypt uni-cast frames */ #define RXON_FILTER_DIS_DECRYPT_MSK cpu_to_le32(1 << 3) /* don't decrypt multi-cast frames */ #define RXON_FILTER_DIS_GRP_DECRYPT_MSK cpu_to_le32(1 << 4) /* STA is associated */ #define RXON_FILTER_ASSOC_MSK cpu_to_le32(1 << 5) /* transfer to host non bssid beacons in associated state */ #define RXON_FILTER_BCON_AWARE_MSK cpu_to_le32(1 << 6)
/* * 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 iwl_ac_qos -- QOS timing params for REPLY_QOS_PARAM * One for each of 4 EDCA access categories in struct iwl_qosparam_cmd * * @cw_min: Contention window, start value in numbers of slots. * Should be a power-of-2, minus 1. Device's default is 0x0f. * @cw_max: Contention window, max value in numbers of slots. * Should be a power-of-2, minus 1. Device's default is 0x3f. * @aifsn: Number of slots in Arbitration Interframe Space (before * performing random backoff timing prior to Tx). Device default 1. * @edca_txop: Length of Tx opportunity, in uSecs. Device default is 0. * @reserved1: reserved for alignment * * Device will automatically increase contention window by (2*CW) + 1 for each * transmission retry. Device uses cw_max as a bit mask, ANDed with new CW * value, to cap the CW value.
*/ struct iwl_ac_qos {
__le16 cw_min;
__le16 cw_max;
u8 aifsn;
u8 reserved1;
__le16 edca_txop;
} __packed;
#define STA_KEY_FLG_KEYID_POS 8 #define STA_KEY_FLG_INVALID cpu_to_le16(0x0800) /* wep key is either from global key (0) or from station info array (1) */ #define STA_KEY_FLG_MAP_KEY_MSK cpu_to_le16(0x0008)
/* wep key in STA: 5-bytes (0) or 13-bytes (1) */ #define STA_KEY_FLG_KEY_SIZE_MSK cpu_to_le16(0x1000) #define STA_KEY_MULTICAST_MSK cpu_to_le16(0x4000) #define STA_KEY_MAX_NUM 8 #define STA_KEY_MAX_NUM_PAN 16 /* must not match WEP_INVALID_OFFSET */ #define IWLAGN_HW_KEY_DEFAULT 0xfe
/* Flags indicate whether to modify vs. don't change various station params */ #define STA_MODIFY_KEY_MASK 0x01 #define STA_MODIFY_TID_DISABLE_TX 0x02 #define STA_MODIFY_TX_RATE_MSK 0x04 #define STA_MODIFY_ADDBA_TID_MSK 0x08 #define STA_MODIFY_DELBA_TID_MSK 0x10 #define STA_MODIFY_SLEEP_TX_COUNT_MSK 0x20
/** * struct sta_id_modify - station modify command * @addr: station's MAC address * @reserved1: reserved for alignment * @sta_id: index of station in uCode's station table * @modify_mask: STA_MODIFY_*, 1: modify, 0: don't change * @reserved2: reserved for alignment * * Driver selects unused table index when adding new station, * or the index to a pre-existing station entry when modifying that station. * Some indexes have special purposes (IWL_AP_ID, index 0, is for AP). * * modify_mask flags select which parameters to modify vs. leave alone.
*/ struct sta_id_modify {
u8 addr[ETH_ALEN];
__le16 reserved1;
u8 sta_id;
u8 modify_mask;
__le16 reserved2;
} __packed;
/* * 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 (agn devices uses * REPLY_TX_LINK_QUALITY_CMD, * * 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.
*/
/* 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 legacy_reserved;
/* 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;
/* * Number of packets OK to transmit to station even though * it is asleep -- used to synchronise PS-poll and u-APSD * responses while ucode keeps track of STA sleep state.
*/
__le16 sleep_tx_count;
/* * REPLY_REM_STA = 0x19 (command)
*/ struct iwl_rem_sta_cmd {
u8 num_sta; /* number of removed stations */
u8 reserved[3];
u8 addr[ETH_ALEN]; /* MAC addr of the first station */
u8 reserved2[2];
} __packed;
/* * REPLY_TXFIFO_FLUSH = 0x1e(command and response) * * When using full FIFO flush this command checks the scheduler HW block WR/RD * pointers to check if all the frames were transferred by DMA into the * relevant TX FIFO queue. Only when the DMA is finished and the queue is * empty the command can finish. * This command is used to flush the TXFIFO from transmit commands, it may * operate on single or multiple queues, the command queue can't be flushed by * this command. The command response is returned when all the queue flush * operations are done. Each TX command flushed return response with the FLUSH * status set in the TX response status. When FIFO flush operation is used, * the flush operation ends when both the scheduler DMA done and TXFIFO empty * are set. * * @queue_control: bit mask for which queues to flush * @flush_control: flush controls * 0: Dump single MSDU * 1: Dump multiple MSDU according to PS, INVALID STA, TTL, TID disable. * 2: Dump all FIFO
*/ struct iwl_txfifo_flush_cmd_v3 {
__le32 queue_control;
__le16 flush_control;
__le16 reserved;
} __packed;
#define REPLY_ADD_STA =0,
GS_MOD_CCK_MSK cpu_to_le161< ) /* RX, TX, LEDs */ =01c,
java.lang.StringIndexOutOfBoundsException: Range [24, 25) out of bounds for length 24
RX_RES_PHY_FLAGS_ANTENNA_MSKx70
RX_RES_PHY_FLAGS_ANTENNA_POS # RX_RES_PHY_FLAGS_AGG_MSK(1 <<7java.lang.StringIndexOutOfBoundsException: Index 53 out of bounds for length 53
define (x7<8 # RX_RES_STATUS_SEC_TYPE_NONEx0 <8
_TYPE_WEPx1<8java.lang.StringIndexOutOfBoundsException: Index 45 out of bounds for length 45 #define RX_RES_STATUS_SEC_TYPE_CCMP0x2 < 8 #define RX_RES_STATUS_SEC_TYPE_TKIP0x3< 8) #define RX_RES_STATUS_SEC_TYPE_ERR (0x7 << 8)
#define RX_MPDU_RES_STATUS_ICV_OK (0x20) #efine RX_MPDU_RES_STATUS_MIC_OK0) #defineREPLY_WOWLAN_GET_STATUS * Minimum * Set the minimum * - 4 standard java.lang.StringIndexOutOfBoundsException: Index 23 out of bounds for length 23
0)
#define IWLAGN_RX_RES_PHY_CNT 8
define1 #define IWLAGN_RX_RES_RSSI_AB_IDX 2 #define IWLAGN_RX_RES_RSSI_C_IDX java.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 35 ## 25
* This queue number * because the ucode will stop * requiredjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 #define IWLAGN_OFDM_RSSI_INBAND_A_BITMSK 0x00ff
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 # * REPLY_RX (response * REPLY_RX_MPDUh command and ** High-throughput (HT) rate format for bits 7:0 (bit 8 must * 2-0: 0) * 1) * 2) * 3) 24 Mbps * * 5) 48 Mbps #define * 0xF) 9 * 0x5) 12 Mbps #define * 20) 2 Mbps * 55) 5.5 Mbps * 110) 11 Mbps
definex20 #define IWLAGN_OFDM_RSSI_INBAND_C_BITMSK 0x00ff #define/* Bit 8: (1) HT format, (0) legacy format in bits 7:0 */ #define IWLAGN_OFDM_RSSI_C_BIT_POSjava.lang.StringIndexOutOfBoundsException: Index 36 out of bounds for length 36
struct
__le32 non_cfg_phydefine 1java.lang.StringIndexOutOfBoundsException: Index 28 out of bounds for length 28
} __packed;
/* * REPLY_RX = 0xc3 (response only, not a command) * Used only for legacy (non 11n) frames.
*/ struct iwl_rx_phy_res
define x2000
u8 cfg_phy_cnt; /* configurable DSP phy data byte count */
u8 * bit14
u8;
_le64;/
__le32# 0x10000
_le16; /* general phy flags: band, modulation, ... */
__le16 channel 3
u8non_cfg_phy_buf32;java.lang.StringIndexOutOfBoundsException: Index 73 out of bounds for length 73
__le32 java.lang.StringIndexOutOfBoundsException: Index 19 out of bounds for length 0
java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
__le16 *
} __packed;
struct {
__le16/* __le16 reserved; } __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 (see comments for * SCD registers and Tx/Rx Queues). 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 and Tx scheduler * handle reception of block-acks; uCode updates the host driver via * REPLY_COMPRESSED_BA. * * 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_TX_LINK_QUALITY_CMD (agn). * * 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 Tx flags field */ * This command enables the driver to java.lang.StringIndexOutOfBoundsException: Range [0, 1) out of bounds for length 0
/* * 1: Use RTS/CTS protocol or CTS-to-self if spec allows it * before this frame. if CTS-to-self required check * RXON_FLG_SELF_CTS_EN status.
*/ #define TX_CMD_FLG_PROT_REQUIRE_MSK * to receive commands from the driver. This * notification that the driver will receive after * this"alive" is indicated by *
/* 1: Expect ACK from receiving station * 0: Don't expect ACK (MAC header's duration field s/b 0)
* Set this for unicast frames, but not broadcast/multicast. */ # * __le32 write_index; next circular buffer *
/* For agn devices: * 1: Use rate scale table (see REPLY_TX_LINK_QUALITY_CMD). * Tx command's initial_rate_index indicates first rate to try; * uCode walks through table for additional Tx attempts. * 0: Use Tx rate/MCS from Tx command's rate_n_flags field.
* This rate will be used for all Tx attempts; it will not be scaled. */ # * Entries without timestamps contain only event_id *
/* 1: Expect immediate block-ack.
* Set when Txing a block-ack request frame. Also set TX_CMD_FLG_ACK_MSK. */ #define TX_CMD_FLG_IMM_BA_RSP_MASK cpu_to_le32(1 << 6)
/* Tx antenna selection field; reserved (0) for agn devices. */ * read * need to be ordered # TX_CMD_FLG_ANT_SEL_MSK(0xf00
/* 1: Ignore Bluetooth priority for this frame.
* 0: Delay Tx until Bluetooth device is done (normal usage). */ #define TX_CMD_FLG_IGNORE_BT cpu_to_le32(1 << 12)
/* 1: uCode overrides sequence control field in MAC header. * 0: Driver provides sequence control field in MAC header. * Set this for management frames, non-QOS data frames, non-unicast frames,
* and also in Tx command embedded in REPLY_SCAN_CMD for active scans. */ #define TX_CMD_FLG_SEQ_CTL_MSK cpu_to_le32(1 << 13)u2ilink2
/* 1: This frame is non-last MPDU; more fragments are coming.
* 0: Last fragment, or not using fragmentation. */
tsf_low
/* 1: uCode calculates and inserts Timestamp Function (TSF) in outgoing frame. * 0: No TSF required in outgoing frame.
* Set this for transmitting beacons and probe responses. */
u ; HW version
/* 1: Driver inserted 2 bytes pad after the MAC header, for (required) dword ; /* frame pointer */ * alignment of frame's payload data field. * 0: No pad * Set this for MAC headers with 26 or 30 bytes, i.e. those with QOS or ADDR4 * field (but not both). Driver must align frame data (i.e. data following
* MAC header) to DWORD boundary. */ #define TX_CMD_FLG_MH_PAD_MSK cpu_to_le32(1 << 20)
/* accelerate aggregation support
* 0 - no CCMP encryption; 1 - CCMP encryption */ #define u32 isr1;
/* * Used for managing Tx retries when expecting block-acks. * Driver should set these fields to 0.
*/ struct ;
u8__ reserved1
u8 bt_kill_cnt; u8 ver_type
_le16;
}__packed;
structiwl_tx_cmd{ /* New members MUST be added within the __struct_group() macro below. */
__struct_group /* * 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
__le32 tx_flags; /* TX_CMD_FLG_* */
/* uCode may modify this field of the Tx command (in host DRAM!).
* Driver must also set dram_lsb_ptr and dram_msb_ptr in this cmd. */ struct cpu_to_le16x7< )
/* Rate for *all* Tx attempts, if TX_CMD_FLG_STA_RATE_MSK is cleared. */
__le32 rate_n_flags; /* RATE_MCS_* */
*/
sta_idjava.lang.StringIndexOutOfBoundsException: Index 12 out of bounds for length 12
define (x1<4
u8sec_ctl/
/* * Index into rate table (see REPLY_TX_LINK_QUALITY_CMD) for initial * Tx attempt, if TX_CMD_FLG_STA_RATE_MSK is set. Normally "0" for * data frames, this field may be used to selectively reduce initial * rate (via non-0 value) for special frames (e.g. management), while * still supporting rate scaling for all frames.
*/
u8 initial_rate_index;
;
TGg *
__le16 next_frame_flags/
le16
{
__le32 life_time;
__le32 attempt;
} stop_time;
/* * 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
*/
CHANNEL_MODE_RESERVED=3
} __packed;# RXON_FLG_CHANNEL_MODE_LEGACY cpu_to_le32CHANNEL_MODE_LEGACY< RXON_FLG_CHANNEL_MODE_POS)
(offsetofstruct iwl_tx_cmd hdr= (struct iwl_tx_cmd_hdr structmember _();
#RXON_FLG_SELF_CTS_EN(0<<0java.lang.StringIndexOutOfBoundsException: Index 51 out of bounds for length 51
attempts.
*
are behavior uCode is
* no special operation required from driver; except for RFKILL_FLUSH,
* which #define RXON_FILT cpu_to_le321< 4
*java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 3 enum {
TX_STATUS_SUCCESS = 0x01,
TX_STATUS_DIRECT_DONE = 0x02, /* postpone TX */
TX_STATUS_POSTPONE_DELAY = 0x40 * NOTE: When tuning to a new channel * RXON_FILTER_ASSOC_MSK to 0. This will clear station-dependent
TX_STATUS_POSTPONE_FEW_BYTES = 0x41,
TX_STATUS_POSTPONE_BT_PRIO = 0x42,
TX_STATUS_POSTPONE_QUIET_PERIOD = 0x43, * channel.
TX_STATUS_POSTPONE_CALC_TTAK = 0x44, /* abort TX */
* regardless of whether RXON_FILTER_ASSOC_MSK is set.
TX_STATUS_FAIL_SHORT_LIMIT 0x82,
= 0x83,
TX_STATUS_FAIL_FIFO_UNDERRUN = 0x84,
TX_STATUS_FAIL_DRAIN_FLOW = 0x85,
TX_STATUS_FAIL_RFKILL_FLUSH = 0x86,
TX_STATUS_FAIL_LIFE_EXPIRE=0x87,
TX_STATUS_FAIL_DEST_PS x88
TX_STATUS_FAIL_HOST_ABORTED = 0x89,
_le16;
TX_STATUS_FAIL_STA_INVALID air_propagation
TX_STATUS_FAIL_FRAG_DROPPED = 0 8ofdm_basic_rates
TX_STATUS_FAIL_TID_DISABLE = 0x8d __le16assoc_id;
TX_STATUS_FAIL_FIFO_FLUSHED 0x8e,
TX_STATUS_FAIL_INSUFFICIENT_CF_POLL = 0x8f,
TX_STATUS_FAIL_PASSIVE_NO_RX x90
=,
};
#define * struct iwl6000_channel_switch_cmd - channel switch command (6000 series)
AGG_TX_STATE_LAST_SENT_TRY_CNT_MSK | \
AGG_TX_STATE_LAST_SENT_BT_KILL_MSK * @channel: new channel number
/* # tx attempts for first frame in aggregation */ #efineAGG_TX_STATE_TRY_CNT_POS
;
/* Command ID and sequence number of Tx command for this frame */ #define AGG_TX_STATE_SEQ_NUM_POS 16
xffff0000
/* * REPLY_TX = 0x1c (response) * * This response may be in one of two slightly different formats, indicated * by the frame_count field: * * 1) No aggregation (frame_count == 1). This reports Tx results for * a single frame. Multiple attempts, at various bit rates, may have * been made for this frame. * * 2) Aggregation (frame_count > 1). This reports Tx results for * 2 or more frames that used block-acknowledge. All frames were * transmitted at same rate. Rate scaling may have been used if first * frame in this new agg block failed in previous agg block(s). * * Note that, for aggregation, ACK (block-ack) status is not delivered here; * block-ack has not been received by the time the agn device records * this status. * This status relates to reasons the tx might have been blocked or aborted * within the sending station (this agn device), rather than whether it was * received successfully by the destination station.
*/ struct agg_tx_status {
_structiwl_ac_qos{
__ sequence
} __packed aifsn
/* refer to ra_tid */ __; #defineIWLAGN_TX_RES_TID_POS # QOS_PARAM_FLG_UPDATE_EDCA_MSK(001
4
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
struct iwlagn_tx_resp { *
u8 frame_count; /* 1 no aggregation, >1 aggregation */
u8 bt_kill_count; java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
u8 failure_rts; /* # failures due to unsuccessful RTS */
u8 ; /* # failures due to no ACK (unused for agg) */
/* For non-agg: Rate at which frame was successful.
* For agg: Rate at which all frames were transmitted. */
__le32
/* For non-agg: RTS + CTS + frame tx attempts time + ACK.
* For agg: RTS + CTS + aggregation tx time + block-ack time. */
__le16 wireless_media_time; /* uSecs */
__le32 tfd_info;
define cpu_to_le323<<1)
__le16 byte_cnt;
u8 tlc_info;
u8 ra_tid; /* tid (0:3), sta_id (4:7) */
__le16 #define STA_FLG_AGG_MPDU_DENSITY_MSK(7 < 2) /* * For non-agg: frame status TX_STATUS_* * For agg: status of 1st frame, AGG_TX_STATE_*; other frame status * fields follow this one, up to frame_count. * Bit fields: * 11- 0: AGG_TX_STATE_* status code * 15-12: Retry count for 1st frame in aggregation (retries * occur if tx failed for this frame when it was a * member of a previous aggregation block). If rate * scaling is used, retry count indicates the rate * table entry used for all frames in the new agg. * 31-16: Sequence # for this frame's Tx cmd (not SSN!)
*/ struct agg_tx_status status; /* TX status (in aggregation -
* status of 1st frame) */
}_; /* * REPLY_COMPRESSED_BA = 0xc5 (response only, not a command) * * Reports Block-Acknowledge from recipient station
*/ struct iwl_compressed_ba_resp {
__le32 sta_addr_lo32 0x10
_ sta_addr_hi16
__le16
/* Index of recipient (BA-sending) station in uCode's station table */tkip_rx_tsc_byte2;/
u8 ;
u8 tid;
__le16 seq_ctl;
__le64 bitmap;
__le16 scd_flow;
__le16 scd_ssn;
u8 _le16tkip_rx_ttak[] /* 10-byte unicast TKIP TTAK */
txed_2_done/* number of frames acked */
_ reserved1
} __packed;
/*RS_NEW_API: only TLC_RTS remains and moved to bit 0 */ #define LINK_QUAL_FLAGS_SET_STA_TLC_RTS_MSK * @reserved2: reserved for *
/* # of EDCA prioritized tx fifos */ * Some indexes have special purposes * struct {
/* # entries in rate scale table to support Tx retries */
LINK_QUAL_MAX_RETRY_NUM6
/* Tx antenna selection values */ #define LINK_QUAL_ANT_A_MSK * initial Tx attempt * REPLY_TX_LINK_QUALITY_CMD, #define LINK_QUAL_ANT_B_MSK (1 << 1) #define LINK_QUAL_ANT_MSK * clean. Moving into RF_KILL state * new station table before transmitting anything on the RXON channel
/* * struct iwl_link_qual_general_params * * Used in REPLY_TX_LINK_QUALITY_CMD
*/ struct iwl_link_qual_general_params {
u8 flags;
/* No entries at or above this (driver chosen) index contain MIMO */
u8;
/* Best single antenna to use for single stream (legacy, SISO). */ ;
_ ;/
/* Best antennas to use for MIMO */
u8 dual_stream_ant_msk *
/* * If driver needs to use different initial rates for different * EDCA QOS access categories (as implemented by tx fifos 0-3), * this table will set that up, by indicating the indexes in the * rs_table[LINK_QUAL_MAX_RETRY_NUM] rate table at which to start. * Otherwise, driver should set all entries to 0. * * Entry usage: * 0 = Background, 1 = Best Effort (normal), 2 = Video, 3 = Voice * TX FIFOs above 3 use same value (typically 0) as TX FIFO 3.
*/
u8 start_rate_index[LINK_QUAL_AC_NUM];
}_packed
#define LINK_QUAL_AGG_FRAME_LIMIT_DEFstatus #define LINK_QUAL_AGG_FRAME_LIMIT_MAX (63java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 #efine LINK_QUAL_AGG_FRAME_LIMIT_MIN (0)
/* REPLY_REM_STA = 0x19 (command) * struct iwl_link_qual_agg_params * * Used in REPLY_TX_LINK_QUALITY_CMD
*/ struct {
/* *Maximum number of uSec in aggregation. * default set to 4000 (4 milliseconds) if not configured in .cfg
*/
__le16
/* * Number of Tx retries allowed for a frame, before that frame will * no longer be considered for the start of an aggregation sequence * (scheduler will then try to tx it as single frame). * Driver should set this to 3.
*/
;
/* * Maximum number of frames in aggregation. * 0 = no limit (default). 1 = no aggregation. * Other values = max # frames in aggregation.
*/
u8 agg_frame_cnt_limit; * operations are done. Each * status set in the TX response * the flush operation ends when * are set. *
* 2: Dump all FIFO
} __ le32;
/* * REPLY_TX_LINK_QUALITY_CMD = 0x4e (command, has simple generic response) * * For agn devices * * Each station in the agn device's internal station table has its own table * of 16 * Tx rates and modulation modes (e.g. legacy/SISO/MIMO) for retrying Tx when * an ACK is not received. This command replaces the entire table for * one station. * * NOTE: Station must already be in agn device's station table. * Use REPLY_ADD_STA. * * The rate scaling procedures described below work well. Of course, other * procedures are possible, and may work better for particular environments. * * * FILLING THE RATE TABLE * * Given a particular initial rate and mode, as determined by the rate * scaling algorithm described below, the Linux driver uses the following * formula to fill the rs_table[LINK_QUAL_MAX_RETRY_NUM] rate table in the * Link Quality command: * * * 1) If using High-throughput (HT) (SISO or MIMO) initial rate: * a) Use this same initial rate for first 3 entries. * b) Find next lower available rate using same mode (SISO or MIMO), * use for next 3 entries. If no lower rate available, switch to * legacy mode (no HT40 channel, no MIMO, no short guard interval). * c) If using MIMO, set command's mimo_delimiter to number of entries * using MIMO (3 or 6). * d) After trying 2 HT rates, switch to legacy mode (no HT40 channel, * no MIMO, no short guard interval), at the next lower bit rate * (e.g. if second HT bit rate was 54, try 48 legacy), and follow * legacy procedure for remaining table entries. * * 2) If using legacy initial rate: * a) Use the initial rate for only one entry. * b) For each following entry, reduce the rate to next lower available * rate, until reaching the lowest available rate. * c) When reducing rate, also switch antenna selection. * d) Once lowest available rate is reached, repeat this rate until * rate table is filled (16 entries), switching antenna each entry. * * * ACCUMULATING HISTORY * * The rate scaling algorithm for agn devices, as implemented in Linux driver, * uses two sets of frame Tx success history: One for the current/active * modulation mode, and one for a speculative/search mode that is being * attempted. If the speculative mode turns out to be more effective (i.e. * actual transfer rate is better), then the driver continues to use the * speculative mode as the new current active mode. * * Each history set contains, separately for each possible rate, data for a * sliding window of the 62 most recent tx attempts at that rate. The data * includes a shifting bitmap of success(1)/failure(0), and sums of successful * and attempted frames, from which the driver can additionally calculate a * success ratio (success / attempted) and number of failures * (attempted - success), and control the size of the window (attempted). * The driver uses the bit map to remove successes from the success sum, as * the oldest tx attempts fall out of the window. * * When the agn device makes multiple tx attempts for a given frame, each * attempt might be at a different rate, and have different modulation * characteristics (e.g. antenna, fat channel, short guard interval), as set * up in the rate scaling table in the Link Quality command. The driver must * determine which rate table entry was used for each tx attempt, to determine * which rate-specific history to update, and record only those attempts that * match the modulation characteristics of the history set. * * When using block-ack (aggregation), all frames are transmitted at the same * rate, since there is no per-attempt acknowledgment from the destination * station. The Tx response struct iwl_tx_resp indicates the Tx rate in * rate_n_flags field. After receiving a block-ack, the driver can update * history for the entire block all at once. * * * FINDING BEST STARTING RATE: * * When working with a selected initial modulation mode (see below), the * driver attempts to find a best initial rate. The initial rate is the * first entry in the Link Quality command's rate table. * * 1) Calculate actual throughput (success ratio * expected throughput, see * table below) for current initial rate. Do this only if enough frames * have been attempted to make the value meaningful: at least 6 failed * tx attempts, or at least 8 successes. If not enough, don't try rate * scaling yet. * * 2) Find available rates adjacent to current initial rate. Available means: * a) supported by hardware && * b) supported by association && * c) within any constraints selected by user * * 3) Gather measured throughputs for adjacent rates. These might not have * enough history to calculate a throughput. That's okay, we might try * using one of them anyway! * * 4) Try decreasing rate if, for current rate: * a) success ratio is < 15% || * b) lower adjacent rate has better measured throughput || * c) higher adjacent rate has worse throughput, and lower is unmeasured * * As a sanity check, if decrease was determined above, leave rate * unchanged if: * a) lower rate unavailable * b) success ratio at current rate > 85% (very good) * c) current measured throughput is better than expected throughput * of lower rate (under perfect 100% tx conditions, see table below) * * 5) Try increasing rate if, for current rate: * a) success ratio is < 15% || * b) both adjacent rates' throughputs are unmeasured (try it!) || * b) higher adjacent rate has better measured throughput || * c) lower adjacent rate has worse throughput, and higher is unmeasured * * As a sanity check, if increase was determined above, leave rate * unchanged if: * a) success ratio at current rate < 70%. This is not particularly * good performance; higher rate is sure to have poorer success. * * 6) Re-evaluate the rate after each tx frame. If working with block- * acknowledge, history and statistics may be calculated for the entire * block (including prior history that fits within the history windows), * before re-evaluation. * * FINDING BEST STARTING MODULATION MODE: * * After working with a modulation mode for a "while" (and doing rate scaling), * the driver searches for a new initial mode in an attempt to improve * throughput. The "while" is measured by numbers of attempted frames: * * For legacy mode, search for new mode after: * 480 successful frames, or 160 failed frames * For high-throughput modes (SISO or MIMO), search for new mode after: * 4500 successful frames, or 400 failed frames * * Mode switch possibilities are (3 for each mode): * * For legacy: * Change antenna, try SISO (if HT association), try MIMO (if HT association) * For SISO: * Change antenna, try MIMO, try shortened guard interval (SGI) * For MIMO: * Try SISO antenna A, SISO antenna B, try shortened guard interval (SGI) * * When trying a new mode, use the same bit rate as the old/current mode when * trying antenna switches and shortened guard interval. When switching to * SISO from MIMO or legacy, or to MIMO from SISO or legacy, use a rate * for which the expected throughput (under perfect conditions) is about the * same or slightly better than the actual measured throughput delivered by * the old/current mode. * * Actual throughput can be estimated by multiplying the expected throughput * by the success ratio (successful / attempted tx frames). Frame size is * not considered in this calculation; it assumes that frame size will average * out to be fairly consistent over several samples. The following are * metric values for expected throughput assuming 100% success ratio. * Only G band has support for CCK rates: * * RATE: 1 2 5 11 6 9 12 18 24 36 48 54 60 * * G: 7 13 35 58 40 57 72 98 121 154 177 186 186 * A: 0 0 0 0 40 57 72 98 121 154 177 186 186 * SISO 20MHz: 0 0 0 0 42 42 76 102 124 159 183 193 202 * SGI SISO 20MHz: 0 0 0 0 46 46 82 110 132 168 192 202 211 * MIMO 20MHz: 0 0 0 0 74 74 123 155 179 214 236 244 251 * SGI MIMO 20MHz: 0 0 0 0 81 81 131 164 188 222 243 251 257 * SISO 40MHz: 0 0 0 0 77 77 127 160 184 220 242 250 257 * SGI SISO 40MHz: 0 0 0 0 83 83 135 169 193 229 250 257 264 * MIMO 40MHz: 0 0 0 0 123 123 182 214 235 264 279 285 289 * SGI MIMO 40MHz: 0 0 0 0 131 131 191 222 242 270 284 289 293 * * After the new mode has been tried for a short while (minimum of 6 failed * frames or 8 successful frames), compare success ratio and actual throughput * estimate of the new mode with the old. If either is better with the new * mode, continue to use the new mode. * * Continue comparing modes until all 3 possibilities have been tried. * If moving from legacy to HT, try all 3 possibilities from the new HT * mode. After trying all 3, a best mode is found. Continue to use this mode * for the longer "while" described above (e.g. 480 successful frames for * legacy), and then repeat the search process. *
*/ struct;
/* Index of destination/recipient station in uCode's station table */
u8 sta_id;
u8 reserved1;
__le16 control; /* not used */ struct iwl_link_qual_general_params general_params; struct iwl_link_qual_agg_params agg_params;
/* * Rate info; when using rate-scaling, Tx command's initial_rate_index * specifies 1st Tx rate attempted, via index into this table. * agn devices works its way through table when retrying Tx.
*/
java.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 9
__ java.lang.StringIndexOutOfBoundsException: Index 6 out of bounds for length 6
[LINK_QUAL_MAX_RETRY_NUM
__le32 reserved2 =x44
} __packed =0,
/* * BT configuration enable flags: * bit 0 - 1: BT channel announcement enabled * 0: disable * bit 1 - 1: priority of BT device enabled * 0: disable * bit 2 - 1: BT 2 wire support enabled * 0: disable
*/ #define BT_COEX_DISABLEjava.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2 #define BT_ENABLE_CHANNEL_ANNOUNCE BIT #define BT_ENABLE_PRIORITY =x0 #define BT_ENABLE_2_WIRE
#define BT_AGG_THRESHOLD_DEF 1200
java.lang.NullPointerException #define |java.lang.StringIndexOutOfBoundsException: Index 47 out of bounds for length 47
/* * REPLY_BT_CONFIG = 0x9b (command, has simple generic response) * * agn devices support hardware handshake with Bluetooth device on * same platform. Bluetooth device alerts wireless device when it will Tx; * wireless device can delay or kill its own Tx to accommodate.
*/ struct iwl_bt_cmd {
u8 flags;
u8 lead_time;
u8 max_kill;
u8 reserved;
__le32 kill_ack_mask * Note that, for aggregation, ACK (block-acke the agn device records
__le32 kill_cts_mask;
} __packed;
struct {
#define }_; #define IWLAGN_BT_FLAG_COEX_MODE_SHIFT #define IWLAGN_BT_FLAG_COEX_MODE_DISABLED 0 #define java.lang.StringIndexOutOfBoundsException: Index 42 out of bounds for length 30
define 2 #define IWLAGN_BT_FLAG_COEX_MODE_4W 3
#define IWLAGN_BT_FLAG_UCODE_DEFAULT /* For non-agg: Rate at which frame was successful.
/* Disable Sync PSPoll on SCO/eSCO */ #define IWLAGN_BT_FLAG_SYNC_2_BT_DISABLE BIT(7)
#define IWLAGN_BT_PRIO_BOOST_MAX []java.lang.StringIndexOutOfBoundsException: Index 22 out of bounds for length 22 #_ ; #define IWLAGN_BT_PRIO_BOOST_DEFAULT tlc_info #define IWLAGN_BT_PRIO_BOOST_DEFAULT32 ;
#define IWLAGN_BT_KILL_ACK_MASK_DEFAULT cpu_to_le32(0xffff0000) #define IWLAGN_BT_KILL_CTS_MASK_DEFAULT cpu_to_le32(0xffff0000) #define IWLAGN_BT_KILL_ACK_CTS_MASK_SCO cpu_to_le32(0java.lang.StringIndexOutOfBoundsException: Index 61 out of bounds for length 31 #define IWLAGN_BT_KILL_ACK_CTS_MASK_REDUCE cpu_to_le32(0)
#define IWLAGN_BT3_PRIO_SAMPLE_DEFAULT 2
#define IWLAGN_BT3_T2_DEFAULTle16;
defineIWLAGN_BT_VALID_ENABLE_FLAGS cpu_to_le16BIT) #define IWLAGN_BT_VALID_BOOST cpu_to_le16(BIT(1)) #define IWLAGN_BT_VALID_MAX_KILL cpu_to_le16(BIT(2)) #define IWLAGN_BT_VALID_3W_TIMERS cpu_to_le16(BIT u8 ; #define IWLAGN_BT_VALID_KILL_ACK_MASK cpu_to_le16 _ seq_ctl #define IWLAGN_BT_VALID_KILL_CTS_MASK cpu_to_le16java.lang.StringIndexOutOfBoundsException: Index 16 out of bounds for length 16 #define};
efine 7
#define IWLAGN_BT_ALL_VALID_MSK (java.lang.StringIndexOutOfBoundsException: Index 37 out of bounds for length 3 # LINK_QUAL_FLAGS_SET_STA_TLC_RTS_MSK<0
/ #ofEDCA txfifos/
IWLAGN_BT_VALID_3W_TIMERS|
IWLAGN_BT_VALID_KILL_ACK_MASK |
IWLAGN_BT_VALID_KILL_CTS_MASK | \
define 6
IWLAGN_BT_VALID_3W_LUT)/* Tx antenna selection values */
/* * Spectrum Management
*/ #define MEASUREMENT_FILTER_FLAG *
RXON_FILTER_CTL2HOST_MSK | \
RXON_FILTER_ACCEPT_GRP_MSK | * The rate scaling procedures described below * procedures are possible, and may work better *
RXON_FILTER_DIS_DECRYPT_MSK | \
RXON_FILTER_DIS_GRP_DECRYPT_MSK | \
* scaling algorithm described below, the Linux driver * formula to fill the rs_table[LINK_QUAL_MAX_RETRY_NUM] * Link Quality command:
RXON_FILTER_BCON_AWARE_MSK)
struct iwl_measure_channel * b) Find next lower available rate using * use for next 3 entries. If no lower rate * legacy mode (no HT40 channel, no MIMO * c) Ifusing MIMO, set * using MIMO (3 or 6).
__le32 duration; /* measurement duration in extended beacon
* format */
* c) When reducing rate, also switch antenna * d) Once lowest available rate is reached, repeat this rate until
u8 type; /* see enum iwl_measure_type */
__ * The rate scaling * actual transfer rate * speculative mode as the new current active mode *
} __packed;
/* * REPLY_SPECTRUM_MEASUREMENT_CMD = 0x74 (command)
*/ struct iwl_spectrum_cmd {
__le16 len *
u8 token; /* token id */
u8 id; * characteristics (e.g. antenna, fat channel, short guard interval), as set
u8 * determine which rate table entry was used for each tx attempt, to determine
u8 periodic; /* 1 = periodic */
__le16 path_loss_timeout;
--> --------------------
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.