Add in some definitions required for later iwn(4) device support.

This also clarifies a few existing fields.

Tested:

* Intel 5100

Submitted by:	Cedric GROSS <cg@gross.info>
This commit is contained in:
adrian 2013-08-02 21:28:36 +00:00
parent afc0f7449d
commit 4e4d1a0f49

View File

@ -18,6 +18,9 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#define IWN_CT_KILL_THRESHOLD 114 /* in Celsius */
#define IWN_CT_KILL_EXIT_THRESHOLD 95 /* in Celsius */
#define IWN_TX_RING_COUNT 256
#define IWN_TX_RING_LOMARK 192
#define IWN_TX_RING_HIMARK 224
@ -38,6 +41,10 @@
#define IWN_ICT_SIZE 4096
#define IWN_ICT_COUNT (IWN_ICT_SIZE / sizeof (uint32_t))
/* For cards with PAN command, default is IWN_CMD_QUEUE_NUM */
#define IWN_CMD_QUEUE_NUM 4
#define IWN_PAN_CMD_QUEUE 9
/* Maximum number of DMA segments for TX. */
#define IWN_MAX_SCATTER 20
@ -89,6 +96,7 @@
#define IWN_MEM_WADDR 0x410
#define IWN_MEM_WDATA 0x418
#define IWN_MEM_RDATA 0x41c
#define IWN_TARG_MBX_C 0x430
#define IWN_PRPH_WADDR 0x444
#define IWN_PRPH_RADDR 0x448
#define IWN_PRPH_WDATA 0x44c
@ -213,17 +221,45 @@
#define IWN_GP_DRIVER_RADIO_2X2_IPA (2 << 0)
#define IWN_GP_DRIVER_CALIB_VER6 (1 << 2)
#define IWN_GP_DRIVER_6050_1X2 (1 << 3)
#define IWN_GP_DRIVER_REG_BIT_RADIO_IQ_INVERT (1 << 7)
/* Possible flags for register IWN_UCODE_GP1_CLR. */
#define IWN_UCODE_GP1_RFKILL (1 << 1)
#define IWN_UCODE_GP1_CMD_BLOCKED (1 << 2)
#define IWN_UCODE_GP1_CTEMP_STOP_RF (1 << 3)
#define IWN_UCODE_GP1_CFG_COMPLETE (1 << 5)
/* Possible flags/values for register IWN_LED. */
#define IWN_LED_BSM_CTRL (1 << 5)
#define IWN_LED_OFF 0x00000038
#define IWN_LED_ON 0x00000078
#define IWN_MAX_BLINK_TBL 10
#define IWN_LED_STATIC_ON 0
#define IWN_LED_STATIC_OFF 1
#define IWN_LED_SLOW_BLINK 2
#define IWN_LED_INT_BLINK 3
#define IWN_LED_UNIT 0x1388 /* 5 ms */
static const struct {
uint16_t tpt; /* Mb/s */
uint8_t on_time;
uint8_t off_time;
} blink_tbl[] =
{
{300, 5, 5},
{200, 8, 8},
{100, 11, 11},
{70, 13, 13},
{50, 15, 15},
{20, 17, 17},
{10, 19, 19},
{5, 22, 22},
{1, 26, 26},
{0, 33, 33},
/* SOLID_ON */
};
/* Possible flags for register IWN_DRAM_INT_TBL. */
#define IWN_DRAM_INT_TBL_WRAP_CHECK (1 << 27)
#define IWN_DRAM_INT_TBL_ENABLE (1 << 31)
@ -370,14 +406,26 @@ struct iwn_rx_status {
} __packed;
struct iwn_rx_desc {
/*
* The first 4 bytes of the RX frame header contain both the RX frame
* size and some flags.
* Bit fields:
* 31: flag flush RB request
* 30: flag ignore TC (terminal counter) request
* 29: flag fast IRQ request
* 28-14: Reserved
* 13-00: RX frame size
*/
uint32_t len;
uint8_t type;
#define IWN_UC_READY 1
#define IWN_ADD_NODE_DONE 24
#define IWN_TX_DONE 28
#define IWN_REPLY_LED_CMD 72
#define IWN5000_CALIBRATION_RESULT 102
#define IWN5000_CALIBRATION_DONE 103
#define IWN_START_SCAN 130
#define IWN_NOTIF_SCAN_RESULT 131
#define IWN_STOP_SCAN 132
#define IWN_RX_STATISTICS 156
#define IWN_BEACON_STATISTICS 157
@ -388,11 +436,23 @@ struct iwn_rx_desc {
#define IWN_RX_DONE 195
#define IWN_RX_COMPRESSED_BA 197
uint8_t flags;
uint8_t idx;
uint8_t flags; /* 0:5 reserved, 6 abort, 7 internal */
uint8_t idx; /* position within TX queue */
uint8_t qid;
/* 0:4 TX queue id - 5:6 reserved - 7 unsolicited RX
* or uCode-originated notification
*/
} __packed;
#define IWN_RX_DESC_QID_MSK 0x1F
#define IWN_UNSOLICITED_RX_NOTIF 0x80
/* CARD_STATE_NOTIFICATION */
#define IWN_STATE_CHANGE_HW_CARD_DISABLED 0x01
#define IWN_STATE_CHANGE_SW_CARD_DISABLED 0x02
#define IWN_STATE_CHANGE_CT_CARD_DISABLED 0x04
#define IWN_STATE_CHANGE_RXON_CARD_DISABLED 0x10
/* Possible RX status flags. */
#define IWN_RX_NO_CRC_ERR (1 << 0)
#define IWN_RX_NO_OVFL_ERR (1 << 1)
@ -416,6 +476,7 @@ struct iwn_tx_cmd {
#define IWN_CMD_LINK_QUALITY 78
#define IWN_CMD_SET_LED 72
#define IWN5000_CMD_WIMAX_COEX 90
#define IWN_TEMP_NOTIFICATION 98
#define IWN5000_CMD_CALIB_CONFIG 101
#define IWN5000_CMD_CALIB_RESULT 102
#define IWN5000_CMD_CALIB_COMPLETE 103
@ -432,6 +493,17 @@ struct iwn_tx_cmd {
#define IWN_CMD_PHY_CALIB 176
#define IWN_CMD_BT_COEX_PRIOTABLE 204
#define IWN_CMD_BT_COEX_PROT 205
#define IWN_CMD_BT_COEX_NOTIF 206
/* PAN commands */
#define IWN_CMD_WIPAN_PARAMS 0xb2
#define IWN_CMD_WIPAN_RXON 0xb3
#define IWN_CMD_WIPAN_RXON_TIMING 0xb4
#define IWN_CMD_WIPAN_RXON_ASSOC 0xb6
#define IWN_CMD_WIPAN_QOS_PARAM 0xb7
#define IWN_CMD_WIPAN_WEPKEY 0xb8
#define IWN_CMD_WIPAN_P2P_CHANNEL_SWITCH 0xb9
#define IWN_CMD_WIPAN_NOA_NOTIFICATION 0xbc
#define IWN_CMD_WIPAN_DEACTIVATION_COMPLETE 0xbd
uint8_t flags;
uint8_t idx;
@ -439,6 +511,27 @@ struct iwn_tx_cmd {
uint8_t data[136];
} __packed;
/*
* Structure for IWN_CMD_GET_STATISTICS = (0x9c) 156
* all devices identical.
*
* This command triggers an immediate response containing uCode statistics.
* The response is in the same format as IWN_BEACON_STATISTICS (0x9d) 157.
*
* If the CLEAR_STATS configuration flag is set, uCode will clear its
* internal copy of the statistics (counters) after issuing the response.
* This flag does not affect IWN_BEACON_STATISTICS after beacons (see below).
*
* If the DISABLE_NOTIF configuration flag is set, uCode will not issue
* IWN_BEACON_STATISTICS after received beacons. This flag
* does not affect the response to the IWN_CMD_GET_STATISTICS 0x9c itself.
*/
struct iwn_statistics_cmd {
uint32_t configuration_flags;
#define IWN_STATS_CONF_CLEAR_STATS htole32(0x1)
#define IWN_STATS_CONF_DISABLE_NOTIF htole32(0x2)
} __packed;
/* Antenna flags, used in various commands. */
#define IWN_ANT_A (1 << 0)
#define IWN_ANT_B (1 << 1)
@ -446,6 +539,7 @@ struct iwn_tx_cmd {
/* Shortcuts. */
#define IWN_ANT_AB (IWN_ANT_A | IWN_ANT_B)
#define IWN_ANT_BC (IWN_ANT_B | IWN_ANT_C)
#define IWN_ANT_AC (IWN_ANT_A | IWN_ANT_C)
#define IWN_ANT_ABC (IWN_ANT_A | IWN_ANT_B | IWN_ANT_C)
/* Structure for command IWN_CMD_RXON. */
@ -461,6 +555,8 @@ struct iwn_rxon {
#define IWN_MODE_STA 3
#define IWN_MODE_IBSS 4
#define IWN_MODE_MONITOR 6
#define IWN_MODE_2STA 8
#define IWN_MODE_P2P 9
uint8_t air;
uint16_t rxchain;
@ -544,7 +640,8 @@ struct iwn_cmd_timing {
uint16_t atim;
uint32_t binitval;
uint16_t lintval;
uint16_t reserved;
uint8_t dtim_period;
uint8_t delta_cp_bss_tbtts;
} __packed;
/* Structure for command IWN_CMD_ADD_NODE. */
@ -558,6 +655,9 @@ struct iwn_node_info {
uint16_t reserved2;
uint8_t id;
#define IWN_ID_BSS 0
#define IWN_STA_ID 1
#define IWN_PAN_ID_BCAST 14
#define IWN5000_ID_BROADCAST 15
#define IWN4965_ID_BROADCAST 31
@ -759,6 +859,11 @@ struct iwn_pmgt_cmd {
#define IWN_PS_SLEEP_OVER_DTIM (1 << 2)
#define IWN_PS_PCI_PMGT (1 << 3)
#define IWN_PS_FAST_PD (1 << 4)
#define IWN_PS_BEACON_FILTERING (1 << 5)
#define IWN_PS_SHADOW_REG (1 << 6)
#define IWN_PS_CT_KILL (1 << 7)
#define IWN_PS_BT_SCD (1 << 8)
#define IWN_PS_ADVANCED_PM (1 << 9)
uint8_t keepalive;
uint8_t debug;
@ -796,6 +901,7 @@ struct iwn_scan_hdr {
struct iwn_scan_chan {
uint32_t flags;
#define IWN_CHAN_PASSIVE (0 << 0)
#define IWN_CHAN_ACTIVE (1 << 0)
#define IWN_CHAN_NPBREQS(x) (((1 << (x)) - 1) << 1)
@ -806,9 +912,25 @@ struct iwn_scan_chan {
uint16_t passive; /* msecs */
} __packed;
#define IWN_SCAN_CRC_TH_DISABLED 0
#define IWN_SCAN_CRC_TH_DEFAULT htole16(1)
#define IWN_SCAN_CRC_TH_NEVER htole16(0xffff)
/* Maximum size of a scan command. */
#define IWN_SCAN_MAXSZ (MCLBYTES - 4)
#define IWN_ACTIVE_DWELL_TIME_24 (30) /* all times in msec */
#define IWN_ACTIVE_DWELL_TIME_52 (20)
#define IWN_ACTIVE_DWELL_FACTOR_24 (3)
#define IWN_ACTIVE_DWELL_FACTOR_52 (2)
#define IWN_PASSIVE_DWELL_TIME_24 (20) /* all times in msec */
#define IWN_PASSIVE_DWELL_TIME_52 (10)
#define IWN_PASSIVE_DWELL_BASE (100)
#define IWN_CHANNEL_TUNE_TIME (5)
#define IWN_SCAN_CHAN_TIMEOUT 2
/* Structure for command IWN_CMD_TXPOWER (4965AGN only.) */
#define IWN_RIDX_MAX 32
struct iwn4965_cmd_txpower {
@ -855,6 +977,16 @@ struct iwn_bluetooth {
struct iwn6000_btcoex_config {
uint8_t flags;
#define IWN_BT_FLAG_COEX6000_CHAN_INHIBITION 1
#define IWN_BT_FLAG_COEX6000_MODE_MASK ((1 << 3) | (1 << 4) | (1 << 5 ))
#define IWN_BT_FLAG_COEX6000_MODE_SHIFT 3
#define IWN_BT_FLAG_COEX6000_MODE_DISABLED 0
#define IWN_BT_FLAG_COEX6000_MODE_LEGACY_2W 1
#define IWN_BT_FLAG_COEX6000_MODE_3W 2
#define IWN_BT_FLAG_COEX6000_MODE_4W 3
#define IWN_BT_FLAG_UCODE_DEFAULT (1 << 6)
#define IWN_BT_FLAG_SYNC_2_BT_DISABLE (1 << 7)
uint8_t lead_time;
uint8_t max_kill;
uint8_t bt3_t7_timer;
@ -871,6 +1003,28 @@ struct iwn6000_btcoex_config {
uint16_t rx_prio_boost;
} __packed;
/* Structure for enhanced command IWN_CMD_BLUETOOTH for 2000 Series. */
struct iwn2000_btcoex_config {
uint8_t flags; /* Cf Flags in iwn6000_btcoex_config */
uint8_t lead_time;
uint8_t max_kill;
uint8_t bt3_t7_timer;
uint32_t kill_ack;
uint32_t kill_cts;
uint8_t sample_time;
uint8_t bt3_t2_timer;
uint16_t bt4_reaction;
uint32_t lookup_table[12];
uint16_t bt4_decision;
uint16_t valid;
uint32_t prio_boost; /* size change prior to iwn6000_btcoex_config */
uint8_t reserved; /* added prior to iwn6000_btcoex_config */
uint8_t tx_prio_boost;
uint16_t rx_prio_boost;
} __packed;
struct iwn_btcoex_priotable {
uint8_t calib_init1;
uint8_t calib_init2;
@ -989,6 +1143,17 @@ struct iwn5000_phy_calib_temp_offset {
uint16_t reserved;
} __packed;
struct iwn5000_phy_calib_temp_offsetv2 {
uint8_t code;
uint8_t group;
uint8_t ngroups;
uint8_t isvalid;
int16_t offset_high;
int16_t offset_low;
int16_t burnt_voltage_ref;
int16_t reserved;
} __packed;
struct iwn_phy_calib_gain {
uint8_t code;
uint8_t group;
@ -1056,6 +1221,10 @@ struct iwn_ucode_info {
} __packed;
/* Structures for IWN_TX_DONE notification. */
#define IWN_TX_STATUS_MSK 0xff
#define TX_STATUS_SUCCESS 0x01
#define TX_STATUS_DIRECT_DONE 0x02
#define IWN_TX_SUCCESS 0x00
#define IWN_TX_FAIL 0x80 /* all failures have 0x80 set */
#define IWN_TX_FAIL_SHORT_LIMIT 0x82 /* too many RTS retries */
@ -1077,7 +1246,7 @@ struct iwn4965_tx_stat {
} __packed;
struct iwn5000_tx_stat {
uint8_t nframes;
uint8_t nframes; /* 1 no aggregation, >1 aggregation */
uint8_t btkillcnt;
uint8_t rtsfailcnt;
uint8_t ackfailcnt;
@ -1089,7 +1258,7 @@ struct iwn5000_tx_stat {
uint16_t seq;
uint16_t len;
uint8_t tlc;
uint8_t ratid;
uint8_t ratid; /* tid (0:3), sta_id (4:7) */
uint8_t fc[2];
uint16_t status;
uint16_t sequence;
@ -1137,6 +1306,42 @@ struct iwn_rx_stat {
uint16_t chan;
uint8_t phybuf[32];
uint32_t rate;
/*
* rate bit fields
*
* 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
*
*/
uint16_t len;
uint16_t reserve3;
} __packed;
@ -1359,8 +1564,18 @@ struct iwn_fw_tlv {
#define IWN_FW_TLV_INIT_DATA 4
#define IWN_FW_TLV_BOOT_TEXT 5
#define IWN_FW_TLV_PBREQ_MAXLEN 6
#define IWN_FW_TLV_PAN 7
#define IWN_FW_TLV_RUNT_EVTLOG_PTR 8
#define IWN_FW_TLV_RUNT_EVTLOG_SIZE 9
#define IWN_FW_TLV_RUNT_ERRLOG_PTR 10
#define IWN_FW_TLV_INIT_EVTLOG_PTR 11
#define IWN_FW_TLV_INIT_EVTLOG_SIZE 12
#define IWN_FW_TLV_INIT_ERRLOG_PTR 13
#define IWN_FW_TLV_ENH_SENS 14
#define IWN_FW_TLV_PHY_CALIB 15
#define IWN_FW_TLV_WOWLAN_INST 16
#define IWN_FW_TLV_WOWLAN_DATA 17
#define IWN_FW_TLV_FLAGS 18
uint16_t alt;
uint32_t len;
@ -1394,6 +1609,7 @@ struct iwn_fw_tlv {
#define IWN4965_EEPROM_VOLTAGE 0x0e9
#define IWN4965_EEPROM_BANDS 0x0ea
/* Indirect offsets. */
#define IWN5000_EEPROM_NO_HT40 0x000
#define IWN5000_EEPROM_DOMAIN 0x001
#define IWN5000_EEPROM_BAND1 0x004
#define IWN5000_EEPROM_BAND2 0x013
@ -1505,6 +1721,16 @@ static const uint32_t iwn6000_regulatory_bands[IWN_NBANDS] = {
IWN5000_EEPROM_BAND7
};
static const uint32_t iwn1000_regulatory_bands[IWN_NBANDS] = {
IWN5000_EEPROM_BAND1,
IWN5000_EEPROM_BAND2,
IWN5000_EEPROM_BAND3,
IWN5000_EEPROM_BAND4,
IWN5000_EEPROM_BAND5,
IWN5000_EEPROM_BAND6,
IWN5000_EEPROM_NO_HT40,
};
#define IWN_CHAN_BANDS_COUNT 7
#define IWN_MAX_CHAN_PER_BAND 14
static const struct iwn_chan_band {
@ -1524,6 +1750,13 @@ static const struct iwn_chan_band {
{ 11, { 36, 44, 52, 60, 100, 108, 116, 124, 132, 149, 157 } }
};
static const uint8_t iwn_bss_ac_to_queue[] = {
2, 3, 1, 0,
};
static const uint8_t iwn_pan_ac_to_queue[] = {
5, 4, 6, 7,
};
#define IWN1000_OTP_NBLOCKS 3
#define IWN6000_OTP_NBLOCKS 4
#define IWN6050_OTP_NBLOCKS 7
@ -1533,6 +1766,14 @@ static const struct iwn_chan_band {
#define IWN_RIDX_OFDM6 4
#define IWN4965_MAX_PWR_INDEX 107
#define IWN_POWERSAVE_LVL_NONE 0
#define IWN_POWERSAVE_LVL_VOIP_COMPATIBLE 1
#define IWN_POWERSAVE_LVL_MAX 5
#define IWN_POWERSAVE_LVL_DEFAULT IWN_POWERSAVE_LVL_NONE
/* DTIM value to pass in for IWN_POWERSAVE_LVL_VOIP_COMPATIBLE */
#define IWN_POWERSAVE_DTIM_VOIP_COMPATIBLE 2
/*
* RF Tx gain values from highest to lowest power (values obtained from
@ -1715,6 +1956,19 @@ static const struct iwn_sensitivity_limits iwn6000_sensitivity_limits = {
100
};
/* Get value from linux kernel 3.2.+ in Drivers/net/wireless/iwlwifi/iwl-2000.c*/
static const struct iwn_sensitivity_limits iwn2030_sensitivity_limits = {
105,110,
128,232,
80,145,
128,232,
125,175,
160,310,
97,
97,
110
};
/* Map TID to TX scheduler's FIFO. */
static const uint8_t iwn_tid2fifo[] = {
1, 0, 0, 1, 2, 2, 3, 3, 7, 7, 7, 7, 7, 7, 7, 7, 3