/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ * Please _iwl_commands_h__definejava.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 26 /* * 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.
*/
REPLY_WOWLAN_PATTERNS = 0xe0,
REPLY_WOWLAN_WAKEUP_FILTER = 0xe1#efineRX_RES_STATUS_BAD_ICV_MIC0x1 < 1java.lang.StringIndexOutOfBoundsException: Index 45 out of bounds for length 45
REPLY_WOWLAN_TSC_RSC_PARAMS = 0xe2,
REPLY_WOWLAN_TKIP_PARAMS# (x40
REPLY_WOWLAN_KEK_KCK_MATERIAL = 0xe4,
= 0xe5,
REPLY_D3_CONFIG = 0xd3,
REPLY_MAX = 0xff
};
/* * 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
#define#defineRX_MPDU_RES_STATUS_DEC_DONE_MSK(x800
java.lang.NullPointerException
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 #define IWL_TX_FIFO_VO 3 # IWLAGN_RX_RES_AGC_IDX java.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 35 #define IWL_TX_FIFO_BE_IPAN IWLAGN_RX_RES_RSSI_C_IDX3 #define IWL_TX_FIFO_VI_IPAN IWL_TX_FIFO_VI #define IWL_TX_FIFO_VO_IPAN 5 /* re-uses the VO FIFO, uCode will properly flush/schedule */ #define IWL_TX_FIFO_AUX 5 #defineIWL_TX_FIFO_UNUSED5
#define IWLAGN_CMD_FIFO_NUM 7
/* * 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 0 #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 */ # RATE_MCS_HT40_POS1 #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 java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
/* Bit 13: (1) Short guard interval (0.4 usec), (0) normal GI (0.8 usec) */ #define RATE_MCS_SGI_POSstruct { #define RATE_MCS_SGI_MSK0java.lang.StringIndexOutOfBoundsException: Index 31 out of bounds for length 31
/* * struct tx_power_dual_stream * * Table entries in REPLY_TX_PWR_TABLE_CMD, REPLY_CHANNEL_SWITCH * * Same format as iwl_tx_power_dual_stream, but __le32
*/ struct tx_power_dual_stream {
__le32 dw; iwl_rx_mpdu_res_start
} __packed;
* Command REPLY_TX_POWER_DBM_CMD = __le16 reserved;
* struct iwlagn_tx_power_dbm_cmd
*/
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 #define * Tx Commands *
struct iwlagn_tx_power_dbm_cmd {
s8 global_lmt; /*in half-dBm (e.g. 30 = 15 dBm) */ * SCD registers and Tx/Rx Queues). When * are preparing to transmit, the device pulls the Tx * bus via one of the device' * from which data will be transmitted.
u8 flags;
s8 srv_chan_lmt; /*in half-dBm (e.g. 30 = 15 dBm) */
u8 reserved;
} __packed;
/* This includes trying lower data rates than the one requested in the Tx * 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;
java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
/* * 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 */define cpu_to_le32)
u32java.lang.StringIndexOutOfBoundsException: Index 47 out of bounds for length 47
u32
u32/* 1: uCode overrides sequence control field in MAC header.
u32 blink2; /* branch link */
u32 ilink1; /* interrupt link */ * Set thisfor management frames, non-QOS * and
3 ; /* interrupt link */
u32 data1; /* error-specific data */
u32
u32 line; /* source code line of error */
u32 bcon_time; /* beacon timer */
u32; /* network timestamp function timer */
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
u32 gp1; /* GP1 timer register */
u32 gp2; /* GP2 timer register */
u32 gp3; /* GP3 timer register */
u32 ucode_ver; /* uCode version */
32 hw_ver /*HW Silicon */
u32 brd_ver; /* HW board version */
u32
u32frame_ptr /
u32 stack_ptr; /* stack pointer */
u32 hcmd; /* last host command header */ * alignment of frame's payload data field.
u32 isr0 * Set thisfor MAC headers with 2 * field (but not both java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
* rxtx_flag */ /* isr status register LMPM_NIC_ISR1:
* host_flag */
/ -disable./
* enc_flag( <5
u32 isr3java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
* x01
u32 isr4;# TX_CMD_SEC_CCM0
* wico interrupt */
; /* isr status register LMPM_NIC_PREF_STAT */
; /* wait event() caller address */
l2p_control /* L2pControlField */
u32 l2p_duration; /* L2pDurationField */
u32 l2p_mhvalid; /* L2pMhValidBits */
u32 l2p_addr_match; /* L2pAddrMatchStat */
u32 lmpm_pmg_sel; * REPLY_TX = 0x1c (command)
* (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;
/* channel mode */ * Set thisif txop time is not specified by HCCA protocol (e.java.lang.StringIndexOutOfBoundsException: Range [0, 65) out of bounds for length 5 enum {
CHANNEL_MODE_LEGACY * MAC header goes here, followed by 2 bytes padding if MAC header
CHANNEL_MODE_PURE_40 = 1,
CHANNEL_MODE_MIXED = 2,
CHANNEL_MODE_RESERVED = ,
};
define( < #define RXON_FLG_CHANNEL_MODE_PURE_40static_assert(, ) =sizeof), #define RXON_FLG_CHANNEL_MODE_MIXED" likelyoutsideof _struct_group(";
/* CTS to self (if spec allows) flag */ #efine cpu_to_le32x13)
/* 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 * TX command response is sent after *agn* transmission /* accept multi-cast */ #define * both postpone and abort status expected from. there /* don't decrypt uni-cast frames */ #define RXON_FILTER_DIS_DECRYPT_MSK cpu_to_le32(1 << 3) /* don't decrypt multi-cast frames */
ER_DIS_GRP_DECRYPT_MSKcpu_to_le32( < ) /* STA is associated */ #define / /* 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.
*/
=x82
u8 node_addrTX_STATUS_FAIL_LONG_LIMITjava.lang.StringIndexOutOfBoundsException: Index 34 out of bounds for length 34
__le16 ,
u8 bssid_addr =0,
__le16 reserved2;
u8 wlap_bssid_addr[6];
_ reserved3
u8 dev_type;
u8;
__le16 rx_chain;
u ;
u8 cck_basic_rates;
_ assoc_id
=java.lang.StringIndexOutOfBoundsException: Index 36 out of bounds for length 36
_TX_STATUS_FAIL_PASSIVE_NO_RX =0,
__le16 channel;
u8 ofdm_ht_single_stream_basic_rates TX_STATUS_FAIL_NO_BEACON_ON_RADAR 0x91
u8 ofdm_ht_dual_stream_basic_rates;
u8 ofdm_ht_triple_stream_basic_rates;
/** * 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.
*/
#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 java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 #define STA_KEY_MULTICAST_MSK cpu_to_le16(0x4000) #define STA_KEY_MAX_NUM 8 #define }_packed /* 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 *java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 #define STA_MODIFY_ADDBA_TID_MSK 0x08 #defineSTA_MODIFY_DELBA_TID_MSK #define STA_MODIFY_SLEEP_TX_COUNT_MSK 0x20 _le16;
/** * 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.
*/
sta_id_modify
u8 addr[ETH_ALEN];
__le16 reserved1;
u8 sta_id
u8 modify_mask;
__le16 reserved2;
} __packed;
/*efine 16 * 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;
* this table will set that up, by indicating the indexes in the
* 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 _packed;
__le16
} __packed;
#define# LINK_QUAL_AGG_TIME_LIMIT_MAX800java.lang.StringIndexOutOfBoundsException: Index 43 out of bounds for length 43 #define ADD_STA_NO_ROOM_IN_TABLE0x2 #define ADD_STA_NO_BLOCK_ACK_RESOURCE 0x4 #define ADD_STA_MODIFY_NON_EXIST_STA 0x8 /* * REPLY_ADD_STA = 0x18 (response)
*/ struct iwl_add_sta_resp {
u8 status; /* ADD_STA_* */
} __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 {
__ queue_control
__le16 flush_control;
__le16 reserved;
} __packed;
#define RX_RES_STATUS_SEC_TYPE_MSK (0x7 << 8) #define RX_RES_STATUS_SEC_TYPE_NONE * b) Find next lower available rate using same mode (SISO or MIMO), #define RX_RES_STATUS_SEC_TYPE_WEP (0x1 << 8) #define RX_RES_STATUS_SEC_TYPE_CCMP (0x2 * legacy mode (no HT40 channel, no MIMO, no short guard interval). #define RX_RES_STATUS_SEC_TYPE_TKIP (0x3 << 8) #define RX_RES_STATUS_SEC_TYPE_ERR (0x7 << 8)
struct iwlagn_non_cfg_phy {
__le32 non_cfg_phy[IWLAGN_RX_RES_PHY_CNT]; /* up to 8 phy entries */
} __packed;
/* * REPLY_RX = 0xc3 (response only, not a command) * Used only for legacy (non 11n) frames.
*/ struct iwl_rx_phy_res {
u8 non_cfg_phy_cnt; /* non configurable DSP phy data byte count */
u8 cfg_phy_cnt; /* configurable DSP phy data byte count */
u8 stat_id; /* configurable DSP phy data set ID */
u8 reserved1;
__le64 timestamp; /* TSF at on air rise */
__le32 beacon_time_stamp; /* beacon at on-air rise */
__le16 * which rate-specific history to update, and record only those attempts that
__le16 channel; /* channel number */
u8 non_cfg_phy_buf[a* When using block-ack (aggregation), all frames are transmitted at the same
__le32 rate_n_flags; /* RATE_MCS_* */
__le16 byte_count; /* frame's byte-count */
__le16 frame_timee* rate_n_flags field. After receiving a block-ack, the driver can update
} __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 */
/* * 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 cpu_to_le32(1 << 0)
/* 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. */ #define TX_CMD_FLG_ACK_MSK cpu_to_le32(1 << 3)
/* 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. */ # * a) success ratio is < 15% ||
/* 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)
/* 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)
/* 1: This frame is non-last MPDU; more fragments are coming.
* 0: Last fragment, or not using fragmentation. */ #define TX_CMD_FLG_MORE_FRAG_MSK cpu_to_le32(1 << 14)
/* 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. */ #define TX_CMD_FLG_TSF_MSK cpu_to_le32(1 << 16)
/* 1: Driver inserted 2 bytes pad after the MAC header, for (required) dword * 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 TX_CMD_FLG_AGG_CCMP_MSK cpu_to_le32(1 << 22)
/* * Used for managing Tx retries when expecting block-acks. * Driver should set these fields to 0.
*/ struct iwl_dram_scratch {
u8 try_cnt * by the success ratio (successful / attempted tx frames). Frame size is
u8 bt_kill_cnt; /* Tx attempts blocked by Bluetooth device */
__le16 reserved;
} __packed;
struct iwl_tx_cmd { /* New members MUST be added within the __struct_group() macro below. */
__struct_group(iwl_tx_cmd_hdr, __hdr, __packed, /* * 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;
/* 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 iwl_dram_scratch scratch;
/* Index of destination station in uCode's station table */
u8 sta_id;
/* Type of security encryption: CCM or TKIP */
u8 sec_ctl; /* TX_CMD_SEC_* */
/* * 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;
u8 reserved;
u8 key[1e comparing modes until all 3 possibilities have been tried.
__ * If moving from legacy to HT, try all 3 possibilities from the new HT
__le16 reserved2; union {
__le32 life_time;
__le32 attempt;
} stop_time;
/* Host DRAM physical address pointer to "scratch" in this command.
* Must be dword aligned. "0" in dram_lsb_ptr disables usage. */
__le32 dram_lsb_ptr;
u8 dram_msb_ptr;
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
u8 data_retry_limit; /*byte 51 */
u8 tid_tspec; 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
*/ struct ieee80211_hdr hdr[];
} __packed;
static_assert(offsetof(struct iwl_tx_cmd, hdr) == sizeof(struct iwl_tx_cmd_hdr), "struct member likely outside of __struct_group struct {
/* * TX command response is sent after *agn* transmission attempts. * * both postpone and abort status are expected behavior from uCode. there is * no special operation required from driver; except for RFKILL_FLUSH, * which required tx flush host command to flush all the tx frames in queues
*/ enum {
TX_STATUS_SUCCESS = 0x01,
TX_STATUS_DIRECT_DONE = 0x02, /* postpone TX */
TX_STATUS_POSTPONE_DELAY = 0x40,
TX_STATUS_POSTPONE_FEW_BYTES = 0x41,
}rs_tableLINK_QUAL_MAX_RETRY_NUM];
TX_STATUS_POSTPONE_QUIET_PERIOD = 0x43,
TX_STATUS_POSTPONE_CALC_TTAK 0x44, /* abort TX */
TX_STATUS_FAIL_INTERNAL_CROSSED_RETRY x81
TX_STATUS_FAIL_SHORT_LIMIT = 0x82,
TX_STATUS_FAIL_LONG_LIMIT = 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 = 0x88,
TX_STATUS_FAIL_HOST_ABORTED = 0x89,
TX_STATUS_FAIL_BT_RETRY = 0x8a,
TX_STATUS_FAIL_STA_INVALID = 0x8b,
TX_STATUS_FAIL_FRAG_DROPPED = 0x8c,
TX_STATUS_FAIL_TID_DISABLE = 0x8d,
* bit 2 - 1: BT 2 wire support enabled
* 0: disable
TX_STATUS_FAIL_PASSIVE_NO_RX = 0x90,
TX_STATUS_FAIL_NO_BEACON_ON_RADAR = 0x91,
};
********java.lang.StringIndexOutOfBoundsException: Index 34 out of bounds for length 34
* TX aggregation status
*******************************#efineBT_ON_THRESHOLD_DEF java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 29
/* # tx attempts for first frame in aggregation */ #define AGG_TX_STATE_TRY_CNT_POS 12 #define AGG_TX_STATE_TRY_CNT_MSK 0xf000
/* Command ID and sequence number of Tx command for this frame */ #define AGG_TX_STATE_SEQ_NUM_POS 16 #define AGG_TX_STATE_SEQ_NUM_MSK 0xffff0000
/* * * 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.
*/
agg_tx_status
__le16 status;
__le16 sequence;
}_packed
struct iwlagn_tx_resp {
u8 frame_count; /* 1 no aggregation, >1 aggregation */ # IWLAGN_BT_FLAG_COEX_MODE_3W 2
u8 failure_rts; /* # failures due to unsuccessful RTS */
u8 failure_frame; /* # 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. */
__le32java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
/* For non-agg: RTS + CTS + frame tx attempts time + ACK.
* For agg: RTS + CTS + aggregation tx time + block-ack time. */
__le16; /* uSecs */
__le32 tfd_info;
_le16seq_ctl
__le16 byte_cnt;
u8;
u8 ra_tid; /* tid (0:3), sta_id (4:7) */
__le16frame_ctrl /* * 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) */
} __packed; /* * REPLY_COMPRESSED_BA = 0xc5 (response only, not a command) * * Reports Block-Acknowledge from recipient station
*/ struct iwl_compressed_ba_resp {
__le32 sta_addr_lo32;
__le16 sta_addr_hi16
# IWLAGN_BT_VALID_ENABLE_FLAGS((0)java.lang.StringIndexOutOfBoundsException: Index 56 out of bounds for length 56
/* Index of recipient (BA-sending) station in uCode's station table */
u8 sta_id
u8 tid;
_le16;
__le64 bitmap;
__le16 scd_flow;
__le16 scd_ssn;
u8 txed; /* number of frames sent */
u8 txed_2_done; /* number of frames acked */
__le16 reserved1;
}__packed
/* * struct iwl_link_qual_general_params * * Used in REPLY_TX_LINK_QUALITY_CMD
*/ structiwl_link_qual_general_params
u8 flags ledtime /* unused */
/* No entries at or above this (driver chosen) index contain MIMO */
u8_le32 kill_ack_mask
/* Best single antenna to use for single stream (legacy, SISO). */
single_stream_ant_msk/
/* Best antennas to use for MIMO */_ bt4_reaction_time /* unused */
u8; /* LINK_QUAL_ANT_* */
/* * 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[s iwl_basic_bt_cmd;
} __packed;
/* * struct iwl_link_qual_agg_params * * Used in REPLY_TX_LINK_QUALITY_CMD
*/ struct iwl_link_qual_agg_params iwl_basic_bt_cmdbasic;
/* *Maximum number of uSec in aggregation. * default set to 4000 (4 milliseconds) if not configured in .cfg
*/
__le16 agg_time_limit
/* * 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.
*/
u8 agg_dis_start_th;
/* * Maximum number of frames in aggregation. * 0 = no limit (default). 1 = no aggregation. * Other values = max # frames in aggregation.
*/
u8
__le32 reserved;
} __packed;
/* * 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 iwl_link_quality_cmd {
/* 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.
*/ struct {
__le32 rate_n_flags; /* RATE_MCS_*, IWL_RATE_* */
} rs_table[LINK_QUAL_MAX_RETRY_NUM];
__le32 reserved2;
} __packed;
/* * 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;
__le32 kill_cts_mask;
} __packed;
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.