116da78b7SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */ 27ac9a364SKalle Valo /****************************************************************************** 37ac9a364SKalle Valo * 47ac9a364SKalle Valo * Copyright(c) 2003 - 2011 Intel Corporation. All rights reserved. 57ac9a364SKalle Valo * 67ac9a364SKalle Valo * Contact Information: 77ac9a364SKalle Valo * Intel Linux Wireless <ilw@linux.intel.com> 87ac9a364SKalle Valo * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 97ac9a364SKalle Valo * 107ac9a364SKalle Valo *****************************************************************************/ 117ac9a364SKalle Valo #ifndef __il_core_h__ 127ac9a364SKalle Valo #define __il_core_h__ 137ac9a364SKalle Valo 147ac9a364SKalle Valo #include <linux/interrupt.h> 157ac9a364SKalle Valo #include <linux/pci.h> /* for struct pci_device_id */ 167ac9a364SKalle Valo #include <linux/kernel.h> 177ac9a364SKalle Valo #include <linux/leds.h> 187ac9a364SKalle Valo #include <linux/wait.h> 197ac9a364SKalle Valo #include <linux/io.h> 207ac9a364SKalle Valo #include <net/mac80211.h> 217ac9a364SKalle Valo #include <net/ieee80211_radiotap.h> 227ac9a364SKalle Valo 237ac9a364SKalle Valo #include "commands.h" 247ac9a364SKalle Valo #include "csr.h" 257ac9a364SKalle Valo #include "prph.h" 267ac9a364SKalle Valo 277ac9a364SKalle Valo struct il_host_cmd; 287ac9a364SKalle Valo struct il_cmd; 297ac9a364SKalle Valo struct il_tx_queue; 307ac9a364SKalle Valo 317ac9a364SKalle Valo #define IL_ERR(f, a...) dev_err(&il->pci_dev->dev, f, ## a) 327ac9a364SKalle Valo #define IL_WARN(f, a...) dev_warn(&il->pci_dev->dev, f, ## a) 33438f3d13SStanislaw Gruszka #define IL_WARN_ONCE(f, a...) dev_warn_once(&il->pci_dev->dev, f, ## a) 347ac9a364SKalle Valo #define IL_INFO(f, a...) dev_info(&il->pci_dev->dev, f, ## a) 357ac9a364SKalle Valo 367ac9a364SKalle Valo #define RX_QUEUE_SIZE 256 377ac9a364SKalle Valo #define RX_QUEUE_MASK 255 387ac9a364SKalle Valo #define RX_QUEUE_SIZE_LOG 8 397ac9a364SKalle Valo 407ac9a364SKalle Valo /* 417ac9a364SKalle Valo * RX related structures and functions 427ac9a364SKalle Valo */ 437ac9a364SKalle Valo #define RX_FREE_BUFFERS 64 447ac9a364SKalle Valo #define RX_LOW_WATERMARK 8 457ac9a364SKalle Valo 467ac9a364SKalle Valo #define U32_PAD(n) ((4-(n))&0x3) 477ac9a364SKalle Valo 487ac9a364SKalle Valo /* CT-KILL constants */ 497ac9a364SKalle Valo #define CT_KILL_THRESHOLD_LEGACY 110 /* in Celsius */ 507ac9a364SKalle Valo 517ac9a364SKalle Valo /* Default noise level to report when noise measurement is not available. 527ac9a364SKalle Valo * This may be because we're: 537ac9a364SKalle Valo * 1) Not associated (4965, no beacon stats being sent to driver) 547ac9a364SKalle Valo * 2) Scanning (noise measurement does not apply to associated channel) 557ac9a364SKalle Valo * 3) Receiving CCK (3945 delivers noise info only for OFDM frames) 567ac9a364SKalle Valo * Use default noise value of -127 ... this is below the range of measurable 577ac9a364SKalle Valo * Rx dBm for either 3945 or 4965, so it can indicate "unmeasurable" to user. 587ac9a364SKalle Valo * Also, -127 works better than 0 when averaging frames with/without 597ac9a364SKalle Valo * noise info (e.g. averaging might be done in app); measured dBm values are 607ac9a364SKalle Valo * always negative ... using a negative value as the default keeps all 617ac9a364SKalle Valo * averages within an s8's (used in some apps) range of negative values. */ 627ac9a364SKalle Valo #define IL_NOISE_MEAS_NOT_AVAILABLE (-127) 637ac9a364SKalle Valo 647ac9a364SKalle Valo /* 657ac9a364SKalle Valo * RTS threshold here is total size [2347] minus 4 FCS bytes 667ac9a364SKalle Valo * Per spec: 677ac9a364SKalle Valo * a value of 0 means RTS on all data/management packets 687ac9a364SKalle Valo * a value > max MSDU size means no RTS 697ac9a364SKalle Valo * else RTS for data/management frames where MPDU is larger 707ac9a364SKalle Valo * than RTS value. 717ac9a364SKalle Valo */ 727ac9a364SKalle Valo #define DEFAULT_RTS_THRESHOLD 2347U 737ac9a364SKalle Valo #define MIN_RTS_THRESHOLD 0U 747ac9a364SKalle Valo #define MAX_RTS_THRESHOLD 2347U 757ac9a364SKalle Valo #define MAX_MSDU_SIZE 2304U 767ac9a364SKalle Valo #define MAX_MPDU_SIZE 2346U 777ac9a364SKalle Valo #define DEFAULT_BEACON_INTERVAL 100U 787ac9a364SKalle Valo #define DEFAULT_SHORT_RETRY_LIMIT 7U 797ac9a364SKalle Valo #define DEFAULT_LONG_RETRY_LIMIT 4U 807ac9a364SKalle Valo 817ac9a364SKalle Valo struct il_rx_buf { 827ac9a364SKalle Valo dma_addr_t page_dma; 837ac9a364SKalle Valo struct page *page; 847ac9a364SKalle Valo struct list_head list; 857ac9a364SKalle Valo }; 867ac9a364SKalle Valo 877ac9a364SKalle Valo #define rxb_addr(r) page_address(r->page) 887ac9a364SKalle Valo 897ac9a364SKalle Valo /* defined below */ 907ac9a364SKalle Valo struct il_device_cmd; 917ac9a364SKalle Valo 927ac9a364SKalle Valo struct il_cmd_meta { 937ac9a364SKalle Valo /* only for SYNC commands, iff the reply skb is wanted */ 947ac9a364SKalle Valo struct il_host_cmd *source; 957ac9a364SKalle Valo /* 967ac9a364SKalle Valo * only for ASYNC commands 977ac9a364SKalle Valo * (which is somewhat stupid -- look at common.c for instance 987ac9a364SKalle Valo * which duplicates a bunch of code because the callback isn't 997ac9a364SKalle Valo * invoked for SYNC commands, if it were and its result passed 1007ac9a364SKalle Valo * through it would be simpler...) 1017ac9a364SKalle Valo */ 1027ac9a364SKalle Valo void (*callback) (struct il_priv *il, struct il_device_cmd *cmd, 1037ac9a364SKalle Valo struct il_rx_pkt *pkt); 1047ac9a364SKalle Valo 1057ac9a364SKalle Valo /* The CMD_SIZE_HUGE flag bit indicates that the command 1067ac9a364SKalle Valo * structure is stored at the end of the shared queue memory. */ 1077ac9a364SKalle Valo u32 flags; 1087ac9a364SKalle Valo 1097ac9a364SKalle Valo DEFINE_DMA_UNMAP_ADDR(mapping); 1107ac9a364SKalle Valo DEFINE_DMA_UNMAP_LEN(len); 1117ac9a364SKalle Valo }; 1127ac9a364SKalle Valo 1137ac9a364SKalle Valo /* 1147ac9a364SKalle Valo * Generic queue structure 1157ac9a364SKalle Valo * 1167ac9a364SKalle Valo * Contains common data for Rx and Tx queues 1177ac9a364SKalle Valo */ 1187ac9a364SKalle Valo struct il_queue { 1197ac9a364SKalle Valo int n_bd; /* number of BDs in this queue */ 1207ac9a364SKalle Valo int write_ptr; /* 1-st empty entry (idx) host_w */ 1217ac9a364SKalle Valo int read_ptr; /* last used entry (idx) host_r */ 1227ac9a364SKalle Valo /* use for monitoring and recovering the stuck queue */ 1237ac9a364SKalle Valo dma_addr_t dma_addr; /* physical addr for BD's */ 1247ac9a364SKalle Valo int n_win; /* safe queue win */ 1257ac9a364SKalle Valo u32 id; 1267ac9a364SKalle Valo int low_mark; /* low watermark, resume queue if free 1277ac9a364SKalle Valo * space more than this */ 1287ac9a364SKalle Valo int high_mark; /* high watermark, stop queue if free 1297ac9a364SKalle Valo * space less than this */ 1307ac9a364SKalle Valo }; 1317ac9a364SKalle Valo 1327ac9a364SKalle Valo /** 1337ac9a364SKalle Valo * struct il_tx_queue - Tx Queue for DMA 1347ac9a364SKalle Valo * @q: generic Rx/Tx queue descriptor 1357ac9a364SKalle Valo * @bd: base of circular buffer of TFDs 1367ac9a364SKalle Valo * @cmd: array of command/TX buffer pointers 1377ac9a364SKalle Valo * @meta: array of meta data for each command/tx buffer 1387ac9a364SKalle Valo * @dma_addr_cmd: physical address of cmd/tx buffer array 1397ac9a364SKalle Valo * @skbs: array of per-TFD socket buffer pointers 1407ac9a364SKalle Valo * @time_stamp: time (in jiffies) of last read_ptr change 1417ac9a364SKalle Valo * @need_update: indicates need to update read/write idx 1427ac9a364SKalle Valo * @sched_retry: indicates queue is high-throughput aggregation (HT AGG) enabled 1437ac9a364SKalle Valo * 1447ac9a364SKalle Valo * A Tx queue consists of circular buffer of BDs (a.k.a. TFDs, transmit frame 1457ac9a364SKalle Valo * descriptors) and required locking structures. 1467ac9a364SKalle Valo */ 1477ac9a364SKalle Valo #define TFD_TX_CMD_SLOTS 256 1487ac9a364SKalle Valo #define TFD_CMD_SLOTS 32 1497ac9a364SKalle Valo 1507ac9a364SKalle Valo struct il_tx_queue { 1517ac9a364SKalle Valo struct il_queue q; 1527ac9a364SKalle Valo void *tfds; 1537ac9a364SKalle Valo struct il_device_cmd **cmd; 1547ac9a364SKalle Valo struct il_cmd_meta *meta; 1557ac9a364SKalle Valo struct sk_buff **skbs; 1567ac9a364SKalle Valo unsigned long time_stamp; 1577ac9a364SKalle Valo u8 need_update; 1587ac9a364SKalle Valo u8 sched_retry; 1597ac9a364SKalle Valo u8 active; 1607ac9a364SKalle Valo u8 swq_id; 1617ac9a364SKalle Valo }; 1627ac9a364SKalle Valo 1637ac9a364SKalle Valo /* 1647ac9a364SKalle Valo * EEPROM access time values: 1657ac9a364SKalle Valo * 1667ac9a364SKalle Valo * Driver initiates EEPROM read by writing byte address << 1 to CSR_EEPROM_REG. 1677ac9a364SKalle Valo * Driver then polls CSR_EEPROM_REG for CSR_EEPROM_REG_READ_VALID_MSK (0x1). 1687ac9a364SKalle Valo * When polling, wait 10 uSec between polling loops, up to a maximum 5000 uSec. 1697ac9a364SKalle Valo * Driver reads 16-bit value from bits 31-16 of CSR_EEPROM_REG. 1707ac9a364SKalle Valo */ 1717ac9a364SKalle Valo #define IL_EEPROM_ACCESS_TIMEOUT 5000 /* uSec */ 1727ac9a364SKalle Valo 1737ac9a364SKalle Valo #define IL_EEPROM_SEM_TIMEOUT 10 /* microseconds */ 1747ac9a364SKalle Valo #define IL_EEPROM_SEM_RETRY_LIMIT 1000 /* number of attempts (not time) */ 1757ac9a364SKalle Valo 1767ac9a364SKalle Valo /* 1777ac9a364SKalle Valo * Regulatory channel usage flags in EEPROM struct il4965_eeprom_channel.flags. 1787ac9a364SKalle Valo * 1797ac9a364SKalle Valo * IBSS and/or AP operation is allowed *only* on those channels with 1807ac9a364SKalle Valo * (VALID && IBSS && ACTIVE && !RADAR). This restriction is in place because 1817ac9a364SKalle Valo * RADAR detection is not supported by the 4965 driver, but is a 1827ac9a364SKalle Valo * requirement for establishing a new network for legal operation on channels 1837ac9a364SKalle Valo * requiring RADAR detection or restricting ACTIVE scanning. 1847ac9a364SKalle Valo * 1857ac9a364SKalle Valo * NOTE: "WIDE" flag does not indicate anything about "HT40" 40 MHz channels. 1867ac9a364SKalle Valo * It only indicates that 20 MHz channel use is supported; HT40 channel 1877ac9a364SKalle Valo * usage is indicated by a separate set of regulatory flags for each 1887ac9a364SKalle Valo * HT40 channel pair. 1897ac9a364SKalle Valo * 1907ac9a364SKalle Valo * NOTE: Using a channel inappropriately will result in a uCode error! 1917ac9a364SKalle Valo */ 1927ac9a364SKalle Valo #define IL_NUM_TX_CALIB_GROUPS 5 1937ac9a364SKalle Valo enum { 1947ac9a364SKalle Valo EEPROM_CHANNEL_VALID = (1 << 0), /* usable for this SKU/geo */ 1957ac9a364SKalle Valo EEPROM_CHANNEL_IBSS = (1 << 1), /* usable as an IBSS channel */ 1967ac9a364SKalle Valo /* Bit 2 Reserved */ 1977ac9a364SKalle Valo EEPROM_CHANNEL_ACTIVE = (1 << 3), /* active scanning allowed */ 1987ac9a364SKalle Valo EEPROM_CHANNEL_RADAR = (1 << 4), /* radar detection required */ 1997ac9a364SKalle Valo EEPROM_CHANNEL_WIDE = (1 << 5), /* 20 MHz channel okay */ 2007ac9a364SKalle Valo /* Bit 6 Reserved (was Narrow Channel) */ 2017ac9a364SKalle Valo EEPROM_CHANNEL_DFS = (1 << 7), /* dynamic freq selection candidate */ 2027ac9a364SKalle Valo }; 2037ac9a364SKalle Valo 2047ac9a364SKalle Valo /* SKU Capabilities */ 2057ac9a364SKalle Valo /* 3945 only */ 2067ac9a364SKalle Valo #define EEPROM_SKU_CAP_SW_RF_KILL_ENABLE (1 << 0) 2077ac9a364SKalle Valo #define EEPROM_SKU_CAP_HW_RF_KILL_ENABLE (1 << 1) 2087ac9a364SKalle Valo 2097ac9a364SKalle Valo /* *regulatory* channel data format in eeprom, one for each channel. 2107ac9a364SKalle Valo * There are separate entries for HT40 (40 MHz) vs. normal (20 MHz) channels. */ 2117ac9a364SKalle Valo struct il_eeprom_channel { 2127ac9a364SKalle Valo u8 flags; /* EEPROM_CHANNEL_* flags copied from EEPROM */ 2137ac9a364SKalle Valo s8 max_power_avg; /* max power (dBm) on this chnl, limit 31 */ 2147ac9a364SKalle Valo } __packed; 2157ac9a364SKalle Valo 2167ac9a364SKalle Valo /* 3945 Specific */ 2177ac9a364SKalle Valo #define EEPROM_3945_EEPROM_VERSION (0x2f) 2187ac9a364SKalle Valo 2197ac9a364SKalle Valo /* 4965 has two radio transmitters (and 3 radio receivers) */ 2207ac9a364SKalle Valo #define EEPROM_TX_POWER_TX_CHAINS (2) 2217ac9a364SKalle Valo 2227ac9a364SKalle Valo /* 4965 has room for up to 8 sets of txpower calibration data */ 2237ac9a364SKalle Valo #define EEPROM_TX_POWER_BANDS (8) 2247ac9a364SKalle Valo 2257ac9a364SKalle Valo /* 4965 factory calibration measures txpower gain settings for 2267ac9a364SKalle Valo * each of 3 target output levels */ 2277ac9a364SKalle Valo #define EEPROM_TX_POWER_MEASUREMENTS (3) 2287ac9a364SKalle Valo 2297ac9a364SKalle Valo /* 4965 Specific */ 2307ac9a364SKalle Valo /* 4965 driver does not work with txpower calibration version < 5 */ 2317ac9a364SKalle Valo #define EEPROM_4965_TX_POWER_VERSION (5) 2327ac9a364SKalle Valo #define EEPROM_4965_EEPROM_VERSION (0x2f) 2337ac9a364SKalle Valo #define EEPROM_4965_CALIB_VERSION_OFFSET (2*0xB6) /* 2 bytes */ 2347ac9a364SKalle Valo #define EEPROM_4965_CALIB_TXPOWER_OFFSET (2*0xE8) /* 48 bytes */ 2357ac9a364SKalle Valo #define EEPROM_4965_BOARD_REVISION (2*0x4F) /* 2 bytes */ 2367ac9a364SKalle Valo #define EEPROM_4965_BOARD_PBA (2*0x56+1) /* 9 bytes */ 2377ac9a364SKalle Valo 2387ac9a364SKalle Valo /* 2.4 GHz */ 2397ac9a364SKalle Valo extern const u8 il_eeprom_band_1[14]; 2407ac9a364SKalle Valo 2417ac9a364SKalle Valo /* 2427ac9a364SKalle Valo * factory calibration data for one txpower level, on one channel, 2437ac9a364SKalle Valo * measured on one of the 2 tx chains (radio transmitter and associated 2447ac9a364SKalle Valo * antenna). EEPROM contains: 2457ac9a364SKalle Valo * 2467ac9a364SKalle Valo * 1) Temperature (degrees Celsius) of device when measurement was made. 2477ac9a364SKalle Valo * 2487ac9a364SKalle Valo * 2) Gain table idx used to achieve the target measurement power. 2497ac9a364SKalle Valo * This refers to the "well-known" gain tables (see 4965.h). 2507ac9a364SKalle Valo * 2517ac9a364SKalle Valo * 3) Actual measured output power, in half-dBm ("34" = 17 dBm). 2527ac9a364SKalle Valo * 2537ac9a364SKalle Valo * 4) RF power amplifier detector level measurement (not used). 2547ac9a364SKalle Valo */ 2557ac9a364SKalle Valo struct il_eeprom_calib_measure { 2567ac9a364SKalle Valo u8 temperature; /* Device temperature (Celsius) */ 2577ac9a364SKalle Valo u8 gain_idx; /* Index into gain table */ 2587ac9a364SKalle Valo u8 actual_pow; /* Measured RF output power, half-dBm */ 2597ac9a364SKalle Valo s8 pa_det; /* Power amp detector level (not used) */ 2607ac9a364SKalle Valo } __packed; 2617ac9a364SKalle Valo 2627ac9a364SKalle Valo /* 2637ac9a364SKalle Valo * measurement set for one channel. EEPROM contains: 2647ac9a364SKalle Valo * 2657ac9a364SKalle Valo * 1) Channel number measured 2667ac9a364SKalle Valo * 2677ac9a364SKalle Valo * 2) Measurements for each of 3 power levels for each of 2 radio transmitters 2687ac9a364SKalle Valo * (a.k.a. "tx chains") (6 measurements altogether) 2697ac9a364SKalle Valo */ 2707ac9a364SKalle Valo struct il_eeprom_calib_ch_info { 2717ac9a364SKalle Valo u8 ch_num; 2727ac9a364SKalle Valo struct il_eeprom_calib_measure 2737ac9a364SKalle Valo measurements[EEPROM_TX_POWER_TX_CHAINS] 2747ac9a364SKalle Valo [EEPROM_TX_POWER_MEASUREMENTS]; 2757ac9a364SKalle Valo } __packed; 2767ac9a364SKalle Valo 2777ac9a364SKalle Valo /* 2787ac9a364SKalle Valo * txpower subband info. 2797ac9a364SKalle Valo * 2807ac9a364SKalle Valo * For each frequency subband, EEPROM contains the following: 2817ac9a364SKalle Valo * 2827ac9a364SKalle Valo * 1) First and last channels within range of the subband. "0" values 2837ac9a364SKalle Valo * indicate that this sample set is not being used. 2847ac9a364SKalle Valo * 2857ac9a364SKalle Valo * 2) Sample measurement sets for 2 channels close to the range endpoints. 2867ac9a364SKalle Valo */ 2877ac9a364SKalle Valo struct il_eeprom_calib_subband_info { 2887ac9a364SKalle Valo u8 ch_from; /* channel number of lowest channel in subband */ 2897ac9a364SKalle Valo u8 ch_to; /* channel number of highest channel in subband */ 2907ac9a364SKalle Valo struct il_eeprom_calib_ch_info ch1; 2917ac9a364SKalle Valo struct il_eeprom_calib_ch_info ch2; 2927ac9a364SKalle Valo } __packed; 2937ac9a364SKalle Valo 2947ac9a364SKalle Valo /* 2957ac9a364SKalle Valo * txpower calibration info. EEPROM contains: 2967ac9a364SKalle Valo * 2977ac9a364SKalle Valo * 1) Factory-measured saturation power levels (maximum levels at which 2987ac9a364SKalle Valo * tx power amplifier can output a signal without too much distortion). 2997ac9a364SKalle Valo * There is one level for 2.4 GHz band and one for 5 GHz band. These 3007ac9a364SKalle Valo * values apply to all channels within each of the bands. 3017ac9a364SKalle Valo * 3027ac9a364SKalle Valo * 2) Factory-measured power supply voltage level. This is assumed to be 3037ac9a364SKalle Valo * constant (i.e. same value applies to all channels/bands) while the 3047ac9a364SKalle Valo * factory measurements are being made. 3057ac9a364SKalle Valo * 3067ac9a364SKalle Valo * 3) Up to 8 sets of factory-measured txpower calibration values. 3077ac9a364SKalle Valo * These are for different frequency ranges, since txpower gain 3087ac9a364SKalle Valo * characteristics of the analog radio circuitry vary with frequency. 3097ac9a364SKalle Valo * 3107ac9a364SKalle Valo * Not all sets need to be filled with data; 3117ac9a364SKalle Valo * struct il_eeprom_calib_subband_info contains range of channels 3127ac9a364SKalle Valo * (0 if unused) for each set of data. 3137ac9a364SKalle Valo */ 3147ac9a364SKalle Valo struct il_eeprom_calib_info { 3157ac9a364SKalle Valo u8 saturation_power24; /* half-dBm (e.g. "34" = 17 dBm) */ 3167ac9a364SKalle Valo u8 saturation_power52; /* half-dBm */ 3177ac9a364SKalle Valo __le16 voltage; /* signed */ 3187ac9a364SKalle Valo struct il_eeprom_calib_subband_info band_info[EEPROM_TX_POWER_BANDS]; 3197ac9a364SKalle Valo } __packed; 3207ac9a364SKalle Valo 3217ac9a364SKalle Valo /* General */ 3227ac9a364SKalle Valo #define EEPROM_DEVICE_ID (2*0x08) /* 2 bytes */ 3237ac9a364SKalle Valo #define EEPROM_MAC_ADDRESS (2*0x15) /* 6 bytes */ 3247ac9a364SKalle Valo #define EEPROM_BOARD_REVISION (2*0x35) /* 2 bytes */ 3257ac9a364SKalle Valo #define EEPROM_BOARD_PBA_NUMBER (2*0x3B+1) /* 9 bytes */ 3267ac9a364SKalle Valo #define EEPROM_VERSION (2*0x44) /* 2 bytes */ 3277ac9a364SKalle Valo #define EEPROM_SKU_CAP (2*0x45) /* 2 bytes */ 3287ac9a364SKalle Valo #define EEPROM_OEM_MODE (2*0x46) /* 2 bytes */ 3297ac9a364SKalle Valo #define EEPROM_WOWLAN_MODE (2*0x47) /* 2 bytes */ 3307ac9a364SKalle Valo #define EEPROM_RADIO_CONFIG (2*0x48) /* 2 bytes */ 3317ac9a364SKalle Valo #define EEPROM_NUM_MAC_ADDRESS (2*0x4C) /* 2 bytes */ 3327ac9a364SKalle Valo 3337ac9a364SKalle Valo /* The following masks are to be applied on EEPROM_RADIO_CONFIG */ 3347ac9a364SKalle Valo #define EEPROM_RF_CFG_TYPE_MSK(x) (x & 0x3) /* bits 0-1 */ 3357ac9a364SKalle Valo #define EEPROM_RF_CFG_STEP_MSK(x) ((x >> 2) & 0x3) /* bits 2-3 */ 3367ac9a364SKalle Valo #define EEPROM_RF_CFG_DASH_MSK(x) ((x >> 4) & 0x3) /* bits 4-5 */ 3377ac9a364SKalle Valo #define EEPROM_RF_CFG_PNUM_MSK(x) ((x >> 6) & 0x3) /* bits 6-7 */ 3387ac9a364SKalle Valo #define EEPROM_RF_CFG_TX_ANT_MSK(x) ((x >> 8) & 0xF) /* bits 8-11 */ 3397ac9a364SKalle Valo #define EEPROM_RF_CFG_RX_ANT_MSK(x) ((x >> 12) & 0xF) /* bits 12-15 */ 3407ac9a364SKalle Valo 3417ac9a364SKalle Valo #define EEPROM_3945_RF_CFG_TYPE_MAX 0x0 3427ac9a364SKalle Valo #define EEPROM_4965_RF_CFG_TYPE_MAX 0x1 3437ac9a364SKalle Valo 3447ac9a364SKalle Valo /* 3457ac9a364SKalle Valo * Per-channel regulatory data. 3467ac9a364SKalle Valo * 3477ac9a364SKalle Valo * Each channel that *might* be supported by iwl has a fixed location 3487ac9a364SKalle Valo * in EEPROM containing EEPROM_CHANNEL_* usage flags (LSB) and max regulatory 3497ac9a364SKalle Valo * txpower (MSB). 3507ac9a364SKalle Valo * 3517ac9a364SKalle Valo * Entries immediately below are for 20 MHz channel width. HT40 (40 MHz) 3527ac9a364SKalle Valo * channels (only for 4965, not supported by 3945) appear later in the EEPROM. 3537ac9a364SKalle Valo * 3547ac9a364SKalle Valo * 2.4 GHz channels 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 3557ac9a364SKalle Valo */ 3567ac9a364SKalle Valo #define EEPROM_REGULATORY_SKU_ID (2*0x60) /* 4 bytes */ 3577ac9a364SKalle Valo #define EEPROM_REGULATORY_BAND_1 (2*0x62) /* 2 bytes */ 3587ac9a364SKalle Valo #define EEPROM_REGULATORY_BAND_1_CHANNELS (2*0x63) /* 28 bytes */ 3597ac9a364SKalle Valo 3607ac9a364SKalle Valo /* 3617ac9a364SKalle Valo * 4.9 GHz channels 183, 184, 185, 187, 188, 189, 192, 196, 3627ac9a364SKalle Valo * 5.0 GHz channels 7, 8, 11, 12, 16 3637ac9a364SKalle Valo * (4915-5080MHz) (none of these is ever supported) 3647ac9a364SKalle Valo */ 3657ac9a364SKalle Valo #define EEPROM_REGULATORY_BAND_2 (2*0x71) /* 2 bytes */ 3667ac9a364SKalle Valo #define EEPROM_REGULATORY_BAND_2_CHANNELS (2*0x72) /* 26 bytes */ 3677ac9a364SKalle Valo 3687ac9a364SKalle Valo /* 3697ac9a364SKalle Valo * 5.2 GHz channels 34, 36, 38, 40, 42, 44, 46, 48, 52, 56, 60, 64 3707ac9a364SKalle Valo * (5170-5320MHz) 3717ac9a364SKalle Valo */ 3727ac9a364SKalle Valo #define EEPROM_REGULATORY_BAND_3 (2*0x7F) /* 2 bytes */ 3737ac9a364SKalle Valo #define EEPROM_REGULATORY_BAND_3_CHANNELS (2*0x80) /* 24 bytes */ 3747ac9a364SKalle Valo 3757ac9a364SKalle Valo /* 3767ac9a364SKalle Valo * 5.5 GHz channels 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140 3777ac9a364SKalle Valo * (5500-5700MHz) 3787ac9a364SKalle Valo */ 3797ac9a364SKalle Valo #define EEPROM_REGULATORY_BAND_4 (2*0x8C) /* 2 bytes */ 3807ac9a364SKalle Valo #define EEPROM_REGULATORY_BAND_4_CHANNELS (2*0x8D) /* 22 bytes */ 3817ac9a364SKalle Valo 3827ac9a364SKalle Valo /* 3837ac9a364SKalle Valo * 5.7 GHz channels 145, 149, 153, 157, 161, 165 3847ac9a364SKalle Valo * (5725-5825MHz) 3857ac9a364SKalle Valo */ 3867ac9a364SKalle Valo #define EEPROM_REGULATORY_BAND_5 (2*0x98) /* 2 bytes */ 3877ac9a364SKalle Valo #define EEPROM_REGULATORY_BAND_5_CHANNELS (2*0x99) /* 12 bytes */ 3887ac9a364SKalle Valo 3897ac9a364SKalle Valo /* 3907ac9a364SKalle Valo * 2.4 GHz HT40 channels 1 (5), 2 (6), 3 (7), 4 (8), 5 (9), 6 (10), 7 (11) 3917ac9a364SKalle Valo * 3927ac9a364SKalle Valo * The channel listed is the center of the lower 20 MHz half of the channel. 3937ac9a364SKalle Valo * The overall center frequency is actually 2 channels (10 MHz) above that, 3947ac9a364SKalle Valo * and the upper half of each HT40 channel is centered 4 channels (20 MHz) away 3957ac9a364SKalle Valo * from the lower half; e.g. the upper half of HT40 channel 1 is channel 5, 3967ac9a364SKalle Valo * and the overall HT40 channel width centers on channel 3. 3977ac9a364SKalle Valo * 3987ac9a364SKalle Valo * NOTE: The RXON command uses 20 MHz channel numbers to specify the 3997ac9a364SKalle Valo * control channel to which to tune. RXON also specifies whether the 4007ac9a364SKalle Valo * control channel is the upper or lower half of a HT40 channel. 4017ac9a364SKalle Valo * 4027ac9a364SKalle Valo * NOTE: 4965 does not support HT40 channels on 2.4 GHz. 4037ac9a364SKalle Valo */ 4047ac9a364SKalle Valo #define EEPROM_4965_REGULATORY_BAND_24_HT40_CHANNELS (2*0xA0) /* 14 bytes */ 4057ac9a364SKalle Valo 4067ac9a364SKalle Valo /* 4077ac9a364SKalle Valo * 5.2 GHz HT40 channels 36 (40), 44 (48), 52 (56), 60 (64), 4087ac9a364SKalle Valo * 100 (104), 108 (112), 116 (120), 124 (128), 132 (136), 149 (153), 157 (161) 4097ac9a364SKalle Valo */ 4107ac9a364SKalle Valo #define EEPROM_4965_REGULATORY_BAND_52_HT40_CHANNELS (2*0xA8) /* 22 bytes */ 4117ac9a364SKalle Valo 4127ac9a364SKalle Valo #define EEPROM_REGULATORY_BAND_NO_HT40 (0) 4137ac9a364SKalle Valo 4147ac9a364SKalle Valo int il_eeprom_init(struct il_priv *il); 4157ac9a364SKalle Valo void il_eeprom_free(struct il_priv *il); 4167ac9a364SKalle Valo const u8 *il_eeprom_query_addr(const struct il_priv *il, size_t offset); 4177ac9a364SKalle Valo u16 il_eeprom_query16(const struct il_priv *il, size_t offset); 4187ac9a364SKalle Valo int il_init_channel_map(struct il_priv *il); 4197ac9a364SKalle Valo void il_free_channel_map(struct il_priv *il); 4207ac9a364SKalle Valo const struct il_channel_info *il_get_channel_info(const struct il_priv *il, 42157fbcce3SJohannes Berg enum nl80211_band band, 4227ac9a364SKalle Valo u16 channel); 4237ac9a364SKalle Valo 4247ac9a364SKalle Valo #define IL_NUM_SCAN_RATES (2) 4257ac9a364SKalle Valo 4267ac9a364SKalle Valo struct il4965_channel_tgd_info { 4277ac9a364SKalle Valo u8 type; 4287ac9a364SKalle Valo s8 max_power; 4297ac9a364SKalle Valo }; 4307ac9a364SKalle Valo 4317ac9a364SKalle Valo struct il4965_channel_tgh_info { 4327ac9a364SKalle Valo s64 last_radar_time; 4337ac9a364SKalle Valo }; 4347ac9a364SKalle Valo 4357ac9a364SKalle Valo #define IL4965_MAX_RATE (33) 4367ac9a364SKalle Valo 4377ac9a364SKalle Valo struct il3945_clip_group { 4387ac9a364SKalle Valo /* maximum power level to prevent clipping for each rate, derived by 4397ac9a364SKalle Valo * us from this band's saturation power in EEPROM */ 4407ac9a364SKalle Valo const s8 clip_powers[IL_MAX_RATES]; 4417ac9a364SKalle Valo }; 4427ac9a364SKalle Valo 4437ac9a364SKalle Valo /* current Tx power values to use, one for each rate for each channel. 4447ac9a364SKalle Valo * requested power is limited by: 4457ac9a364SKalle Valo * -- regulatory EEPROM limits for this channel 4467ac9a364SKalle Valo * -- hardware capabilities (clip-powers) 4477ac9a364SKalle Valo * -- spectrum management 4487ac9a364SKalle Valo * -- user preference (e.g. iwconfig) 4497ac9a364SKalle Valo * when requested power is set, base power idx must also be set. */ 4507ac9a364SKalle Valo struct il3945_channel_power_info { 4517ac9a364SKalle Valo struct il3945_tx_power tpc; /* actual radio and DSP gain settings */ 4527ac9a364SKalle Valo s8 power_table_idx; /* actual (compenst'd) idx into gain table */ 4537ac9a364SKalle Valo s8 base_power_idx; /* gain idx for power at factory temp. */ 4547ac9a364SKalle Valo s8 requested_power; /* power (dBm) requested for this chnl/rate */ 4557ac9a364SKalle Valo }; 4567ac9a364SKalle Valo 4577ac9a364SKalle Valo /* current scan Tx power values to use, one for each scan rate for each 4587ac9a364SKalle Valo * channel. */ 4597ac9a364SKalle Valo struct il3945_scan_power_info { 4607ac9a364SKalle Valo struct il3945_tx_power tpc; /* actual radio and DSP gain settings */ 4617ac9a364SKalle Valo s8 power_table_idx; /* actual (compenst'd) idx into gain table */ 4627ac9a364SKalle Valo s8 requested_power; /* scan pwr (dBm) requested for chnl/rate */ 4637ac9a364SKalle Valo }; 4647ac9a364SKalle Valo 4657ac9a364SKalle Valo /* 4667ac9a364SKalle Valo * One for each channel, holds all channel setup data 4677ac9a364SKalle Valo * Some of the fields (e.g. eeprom and flags/max_power_avg) are redundant 4687ac9a364SKalle Valo * with one another! 4697ac9a364SKalle Valo */ 4707ac9a364SKalle Valo struct il_channel_info { 4717ac9a364SKalle Valo struct il4965_channel_tgd_info tgd; 4727ac9a364SKalle Valo struct il4965_channel_tgh_info tgh; 4737ac9a364SKalle Valo struct il_eeprom_channel eeprom; /* EEPROM regulatory limit */ 4747ac9a364SKalle Valo struct il_eeprom_channel ht40_eeprom; /* EEPROM regulatory limit for 4757ac9a364SKalle Valo * HT40 channel */ 4767ac9a364SKalle Valo 4777ac9a364SKalle Valo u8 channel; /* channel number */ 4787ac9a364SKalle Valo u8 flags; /* flags copied from EEPROM */ 4797ac9a364SKalle Valo s8 max_power_avg; /* (dBm) regul. eeprom, normal Tx, any rate */ 4807ac9a364SKalle Valo s8 curr_txpow; /* (dBm) regulatory/spectrum/user (not h/w) limit */ 4817ac9a364SKalle Valo s8 min_power; /* always 0 */ 4827ac9a364SKalle Valo s8 scan_power; /* (dBm) regul. eeprom, direct scans, any rate */ 4837ac9a364SKalle Valo 4847ac9a364SKalle Valo u8 group_idx; /* 0-4, maps channel to group1/2/3/4/5 */ 4857ac9a364SKalle Valo u8 band_idx; /* 0-4, maps channel to band1/2/3/4/5 */ 48657fbcce3SJohannes Berg enum nl80211_band band; 4877ac9a364SKalle Valo 4887ac9a364SKalle Valo /* HT40 channel info */ 4897ac9a364SKalle Valo s8 ht40_max_power_avg; /* (dBm) regul. eeprom, normal Tx, any rate */ 4907ac9a364SKalle Valo u8 ht40_flags; /* flags copied from EEPROM */ 4917ac9a364SKalle Valo u8 ht40_extension_channel; /* HT_IE_EXT_CHANNEL_* */ 4927ac9a364SKalle Valo 4937ac9a364SKalle Valo /* Radio/DSP gain settings for each "normal" data Tx rate. 4947ac9a364SKalle Valo * These include, in addition to RF and DSP gain, a few fields for 4957ac9a364SKalle Valo * remembering/modifying gain settings (idxes). */ 4967ac9a364SKalle Valo struct il3945_channel_power_info power_info[IL4965_MAX_RATE]; 4977ac9a364SKalle Valo 4987ac9a364SKalle Valo /* Radio/DSP gain settings for each scan rate, for directed scans. */ 4997ac9a364SKalle Valo struct il3945_scan_power_info scan_pwr_info[IL_NUM_SCAN_RATES]; 5007ac9a364SKalle Valo }; 5017ac9a364SKalle Valo 5027ac9a364SKalle Valo #define IL_TX_FIFO_BK 0 /* shared */ 5037ac9a364SKalle Valo #define IL_TX_FIFO_BE 1 5047ac9a364SKalle Valo #define IL_TX_FIFO_VI 2 /* shared */ 5057ac9a364SKalle Valo #define IL_TX_FIFO_VO 3 5067ac9a364SKalle Valo #define IL_TX_FIFO_UNUSED -1 5077ac9a364SKalle Valo 5087ac9a364SKalle Valo /* Minimum number of queues. MAX_NUM is defined in hw specific files. 5097ac9a364SKalle Valo * Set the minimum to accommodate the 4 standard TX queues, 1 command 5107ac9a364SKalle Valo * queue, 2 (unused) HCCA queues, and 4 HT queues (one for each AC) */ 5117ac9a364SKalle Valo #define IL_MIN_NUM_QUEUES 10 5127ac9a364SKalle Valo 5137ac9a364SKalle Valo #define IL_DEFAULT_CMD_QUEUE_NUM 4 5147ac9a364SKalle Valo 5157ac9a364SKalle Valo #define IEEE80211_DATA_LEN 2304 5167ac9a364SKalle Valo #define IEEE80211_4ADDR_LEN 30 5177ac9a364SKalle Valo #define IEEE80211_HLEN (IEEE80211_4ADDR_LEN) 5187ac9a364SKalle Valo #define IEEE80211_FRAME_LEN (IEEE80211_DATA_LEN + IEEE80211_HLEN) 5197ac9a364SKalle Valo 5207ac9a364SKalle Valo struct il_frame { 5217ac9a364SKalle Valo union { 5227ac9a364SKalle Valo struct ieee80211_hdr frame; 5237ac9a364SKalle Valo struct il_tx_beacon_cmd beacon; 5247ac9a364SKalle Valo u8 raw[IEEE80211_FRAME_LEN]; 5257ac9a364SKalle Valo u8 cmd[360]; 5267ac9a364SKalle Valo } u; 5277ac9a364SKalle Valo struct list_head list; 5287ac9a364SKalle Valo }; 5297ac9a364SKalle Valo 5307ac9a364SKalle Valo enum { 5317ac9a364SKalle Valo CMD_SYNC = 0, 5327ac9a364SKalle Valo CMD_SIZE_NORMAL = 0, 5337ac9a364SKalle Valo CMD_NO_SKB = 0, 5347ac9a364SKalle Valo CMD_SIZE_HUGE = (1 << 0), 5357ac9a364SKalle Valo CMD_ASYNC = (1 << 1), 5367ac9a364SKalle Valo CMD_WANT_SKB = (1 << 2), 5377ac9a364SKalle Valo CMD_MAPPED = (1 << 3), 5387ac9a364SKalle Valo }; 5397ac9a364SKalle Valo 5407ac9a364SKalle Valo #define DEF_CMD_PAYLOAD_SIZE 320 5417ac9a364SKalle Valo 5427ac9a364SKalle Valo /** 5437ac9a364SKalle Valo * struct il_device_cmd 5447ac9a364SKalle Valo * 5457ac9a364SKalle Valo * For allocation of the command and tx queues, this establishes the overall 5467ac9a364SKalle Valo * size of the largest command we send to uCode, except for a scan command 5477ac9a364SKalle Valo * (which is relatively huge; space is allocated separately). 5487ac9a364SKalle Valo */ 5497ac9a364SKalle Valo struct il_device_cmd { 5507ac9a364SKalle Valo struct il_cmd_header hdr; /* uCode API */ 5517ac9a364SKalle Valo union { 5527ac9a364SKalle Valo u32 flags; 5537ac9a364SKalle Valo u8 val8; 5547ac9a364SKalle Valo u16 val16; 5557ac9a364SKalle Valo u32 val32; 5567ac9a364SKalle Valo struct il_tx_cmd tx; 5577ac9a364SKalle Valo u8 payload[DEF_CMD_PAYLOAD_SIZE]; 5587ac9a364SKalle Valo } __packed cmd; 5597ac9a364SKalle Valo } __packed; 5607ac9a364SKalle Valo 5617ac9a364SKalle Valo #define TFD_MAX_PAYLOAD_SIZE (sizeof(struct il_device_cmd)) 5627ac9a364SKalle Valo 5637ac9a364SKalle Valo struct il_host_cmd { 5647ac9a364SKalle Valo const void *data; 5657ac9a364SKalle Valo unsigned long reply_page; 5667ac9a364SKalle Valo void (*callback) (struct il_priv *il, struct il_device_cmd *cmd, 5677ac9a364SKalle Valo struct il_rx_pkt *pkt); 5687ac9a364SKalle Valo u32 flags; 5697ac9a364SKalle Valo u16 len; 5707ac9a364SKalle Valo u8 id; 5717ac9a364SKalle Valo }; 5727ac9a364SKalle Valo 5737ac9a364SKalle Valo #define SUP_RATE_11A_MAX_NUM_CHANNELS 8 5747ac9a364SKalle Valo #define SUP_RATE_11B_MAX_NUM_CHANNELS 4 5757ac9a364SKalle Valo #define SUP_RATE_11G_MAX_NUM_CHANNELS 12 5767ac9a364SKalle Valo 5777ac9a364SKalle Valo /** 5787ac9a364SKalle Valo * struct il_rx_queue - Rx queue 5797ac9a364SKalle Valo * @bd: driver's pointer to buffer of receive buffer descriptors (rbd) 5807ac9a364SKalle Valo * @bd_dma: bus address of buffer of receive buffer descriptors (rbd) 5817ac9a364SKalle Valo * @read: Shared idx to newest available Rx buffer 5827ac9a364SKalle Valo * @write: Shared idx to oldest written Rx packet 5837ac9a364SKalle Valo * @free_count: Number of pre-allocated buffers in rx_free 5847ac9a364SKalle Valo * @rx_free: list of free SKBs for use 5857ac9a364SKalle Valo * @rx_used: List of Rx buffers with no SKB 5867ac9a364SKalle Valo * @need_update: flag to indicate we need to update read/write idx 5877ac9a364SKalle Valo * @rb_stts: driver's pointer to receive buffer status 5887ac9a364SKalle Valo * @rb_stts_dma: bus address of receive buffer status 5897ac9a364SKalle Valo * 5907ac9a364SKalle Valo * NOTE: rx_free and rx_used are used as a FIFO for il_rx_bufs 5917ac9a364SKalle Valo */ 5927ac9a364SKalle Valo struct il_rx_queue { 5937ac9a364SKalle Valo __le32 *bd; 5947ac9a364SKalle Valo dma_addr_t bd_dma; 5957ac9a364SKalle Valo struct il_rx_buf pool[RX_QUEUE_SIZE + RX_FREE_BUFFERS]; 5967ac9a364SKalle Valo struct il_rx_buf *queue[RX_QUEUE_SIZE]; 5977ac9a364SKalle Valo u32 read; 5987ac9a364SKalle Valo u32 write; 5997ac9a364SKalle Valo u32 free_count; 6007ac9a364SKalle Valo u32 write_actual; 6017ac9a364SKalle Valo struct list_head rx_free; 6027ac9a364SKalle Valo struct list_head rx_used; 6037ac9a364SKalle Valo int need_update; 6047ac9a364SKalle Valo struct il_rb_status *rb_stts; 6057ac9a364SKalle Valo dma_addr_t rb_stts_dma; 6067ac9a364SKalle Valo spinlock_t lock; 6077ac9a364SKalle Valo }; 6087ac9a364SKalle Valo 6097ac9a364SKalle Valo #define IL_SUPPORTED_RATES_IE_LEN 8 6107ac9a364SKalle Valo 6117ac9a364SKalle Valo #define MAX_TID_COUNT 9 6127ac9a364SKalle Valo 6137ac9a364SKalle Valo #define IL_INVALID_RATE 0xFF 6147ac9a364SKalle Valo #define IL_INVALID_VALUE -1 6157ac9a364SKalle Valo 6167ac9a364SKalle Valo /** 6177ac9a364SKalle Valo * struct il_ht_agg -- aggregation status while waiting for block-ack 6187ac9a364SKalle Valo * @txq_id: Tx queue used for Tx attempt 6197ac9a364SKalle Valo * @frame_count: # frames attempted by Tx command 6207ac9a364SKalle Valo * @wait_for_ba: Expect block-ack before next Tx reply 6217ac9a364SKalle Valo * @start_idx: Index of 1st Transmit Frame Descriptor (TFD) in Tx win 6227ac9a364SKalle Valo * @bitmap0: Low order bitmap, one bit for each frame pending ACK in Tx win 6237ac9a364SKalle Valo * @bitmap1: High order, one bit for each frame pending ACK in Tx win 6247ac9a364SKalle Valo * @rate_n_flags: Rate at which Tx was attempted 6257ac9a364SKalle Valo * 6267ac9a364SKalle Valo * If C_TX indicates that aggregation was attempted, driver must wait 6277ac9a364SKalle Valo * for block ack (N_COMPRESSED_BA). This struct stores tx reply info 6287ac9a364SKalle Valo * until block ack arrives. 6297ac9a364SKalle Valo */ 6307ac9a364SKalle Valo struct il_ht_agg { 6317ac9a364SKalle Valo u16 txq_id; 6327ac9a364SKalle Valo u16 frame_count; 6337ac9a364SKalle Valo u16 wait_for_ba; 6347ac9a364SKalle Valo u16 start_idx; 6357ac9a364SKalle Valo u64 bitmap; 6367ac9a364SKalle Valo u32 rate_n_flags; 6377ac9a364SKalle Valo #define IL_AGG_OFF 0 6387ac9a364SKalle Valo #define IL_AGG_ON 1 6397ac9a364SKalle Valo #define IL_EMPTYING_HW_QUEUE_ADDBA 2 6407ac9a364SKalle Valo #define IL_EMPTYING_HW_QUEUE_DELBA 3 6417ac9a364SKalle Valo u8 state; 6427ac9a364SKalle Valo }; 6437ac9a364SKalle Valo 6447ac9a364SKalle Valo struct il_tid_data { 6457ac9a364SKalle Valo u16 seq_number; /* 4965 only */ 6467ac9a364SKalle Valo u16 tfds_in_queue; 6477ac9a364SKalle Valo struct il_ht_agg agg; 6487ac9a364SKalle Valo }; 6497ac9a364SKalle Valo 6507ac9a364SKalle Valo struct il_hw_key { 6517ac9a364SKalle Valo u32 cipher; 6527ac9a364SKalle Valo int keylen; 6537ac9a364SKalle Valo u8 keyidx; 6547ac9a364SKalle Valo u8 key[32]; 6557ac9a364SKalle Valo }; 6567ac9a364SKalle Valo 6577ac9a364SKalle Valo union il_ht_rate_supp { 6587ac9a364SKalle Valo u16 rates; 6597ac9a364SKalle Valo struct { 6607ac9a364SKalle Valo u8 siso_rate; 6617ac9a364SKalle Valo u8 mimo_rate; 6627ac9a364SKalle Valo }; 6637ac9a364SKalle Valo }; 6647ac9a364SKalle Valo 6657ac9a364SKalle Valo #define CFG_HT_RX_AMPDU_FACTOR_8K (0x0) 6667ac9a364SKalle Valo #define CFG_HT_RX_AMPDU_FACTOR_16K (0x1) 6677ac9a364SKalle Valo #define CFG_HT_RX_AMPDU_FACTOR_32K (0x2) 6687ac9a364SKalle Valo #define CFG_HT_RX_AMPDU_FACTOR_64K (0x3) 6697ac9a364SKalle Valo #define CFG_HT_RX_AMPDU_FACTOR_DEF CFG_HT_RX_AMPDU_FACTOR_64K 6707ac9a364SKalle Valo #define CFG_HT_RX_AMPDU_FACTOR_MAX CFG_HT_RX_AMPDU_FACTOR_64K 6717ac9a364SKalle Valo #define CFG_HT_RX_AMPDU_FACTOR_MIN CFG_HT_RX_AMPDU_FACTOR_8K 6727ac9a364SKalle Valo 6737ac9a364SKalle Valo /* 6747ac9a364SKalle Valo * Maximal MPDU density for TX aggregation 6757ac9a364SKalle Valo * 4 - 2us density 6767ac9a364SKalle Valo * 5 - 4us density 6777ac9a364SKalle Valo * 6 - 8us density 6787ac9a364SKalle Valo * 7 - 16us density 6797ac9a364SKalle Valo */ 6807ac9a364SKalle Valo #define CFG_HT_MPDU_DENSITY_2USEC (0x4) 6817ac9a364SKalle Valo #define CFG_HT_MPDU_DENSITY_4USEC (0x5) 6827ac9a364SKalle Valo #define CFG_HT_MPDU_DENSITY_8USEC (0x6) 6837ac9a364SKalle Valo #define CFG_HT_MPDU_DENSITY_16USEC (0x7) 6847ac9a364SKalle Valo #define CFG_HT_MPDU_DENSITY_DEF CFG_HT_MPDU_DENSITY_4USEC 6857ac9a364SKalle Valo #define CFG_HT_MPDU_DENSITY_MAX CFG_HT_MPDU_DENSITY_16USEC 6867ac9a364SKalle Valo #define CFG_HT_MPDU_DENSITY_MIN (0x1) 6877ac9a364SKalle Valo 6887ac9a364SKalle Valo struct il_ht_config { 6897ac9a364SKalle Valo bool single_chain_sufficient; 6907ac9a364SKalle Valo enum ieee80211_smps_mode smps; /* current smps mode */ 6917ac9a364SKalle Valo }; 6927ac9a364SKalle Valo 6937ac9a364SKalle Valo /* QoS structures */ 6947ac9a364SKalle Valo struct il_qos_info { 6957ac9a364SKalle Valo int qos_active; 6967ac9a364SKalle Valo struct il_qosparam_cmd def_qos_parm; 6977ac9a364SKalle Valo }; 6987ac9a364SKalle Valo 6997ac9a364SKalle Valo /* 7007ac9a364SKalle Valo * Structure should be accessed with sta_lock held. When station addition 7017ac9a364SKalle Valo * is in progress (IL_STA_UCODE_INPROGRESS) it is possible to access only 7027ac9a364SKalle Valo * the commands (il_addsta_cmd and il_link_quality_cmd) without 7037ac9a364SKalle Valo * sta_lock held. 7047ac9a364SKalle Valo */ 7057ac9a364SKalle Valo struct il_station_entry { 7067ac9a364SKalle Valo struct il_addsta_cmd sta; 7077ac9a364SKalle Valo struct il_tid_data tid[MAX_TID_COUNT]; 7087ac9a364SKalle Valo u8 used; 7097ac9a364SKalle Valo struct il_hw_key keyinfo; 7107ac9a364SKalle Valo struct il_link_quality_cmd *lq; 7117ac9a364SKalle Valo }; 7127ac9a364SKalle Valo 7137ac9a364SKalle Valo struct il_station_priv_common { 7147ac9a364SKalle Valo u8 sta_id; 7157ac9a364SKalle Valo }; 7167ac9a364SKalle Valo 7177ac9a364SKalle Valo /** 7187ac9a364SKalle Valo * struct il_vif_priv - driver's ilate per-interface information 7197ac9a364SKalle Valo * 7207ac9a364SKalle Valo * When mac80211 allocates a virtual interface, it can allocate 7217ac9a364SKalle Valo * space for us to put data into. 7227ac9a364SKalle Valo */ 7237ac9a364SKalle Valo struct il_vif_priv { 7247ac9a364SKalle Valo u8 ibss_bssid_sta_id; 7257ac9a364SKalle Valo }; 7267ac9a364SKalle Valo 7277ac9a364SKalle Valo /* one for each uCode image (inst/data, boot/init/runtime) */ 7287ac9a364SKalle Valo struct fw_desc { 7297ac9a364SKalle Valo void *v_addr; /* access by driver */ 7307ac9a364SKalle Valo dma_addr_t p_addr; /* access by card's busmaster DMA */ 7317ac9a364SKalle Valo u32 len; /* bytes */ 7327ac9a364SKalle Valo }; 7337ac9a364SKalle Valo 7347ac9a364SKalle Valo /* uCode file layout */ 7357ac9a364SKalle Valo struct il_ucode_header { 7367ac9a364SKalle Valo __le32 ver; /* major/minor/API/serial */ 7377ac9a364SKalle Valo struct { 7387ac9a364SKalle Valo __le32 inst_size; /* bytes of runtime code */ 7397ac9a364SKalle Valo __le32 data_size; /* bytes of runtime data */ 7407ac9a364SKalle Valo __le32 init_size; /* bytes of init code */ 7417ac9a364SKalle Valo __le32 init_data_size; /* bytes of init data */ 7427ac9a364SKalle Valo __le32 boot_size; /* bytes of bootstrap code */ 7437ac9a364SKalle Valo u8 data[0]; /* in same order as sizes */ 7447ac9a364SKalle Valo } v1; 7457ac9a364SKalle Valo }; 7467ac9a364SKalle Valo 7477ac9a364SKalle Valo struct il4965_ibss_seq { 7487ac9a364SKalle Valo u8 mac[ETH_ALEN]; 7497ac9a364SKalle Valo u16 seq_num; 7507ac9a364SKalle Valo u16 frag_num; 7517ac9a364SKalle Valo unsigned long packet_time; 7527ac9a364SKalle Valo struct list_head list; 7537ac9a364SKalle Valo }; 7547ac9a364SKalle Valo 7557ac9a364SKalle Valo struct il_sensitivity_ranges { 7567ac9a364SKalle Valo u16 min_nrg_cck; 7577ac9a364SKalle Valo u16 max_nrg_cck; 7587ac9a364SKalle Valo 7597ac9a364SKalle Valo u16 nrg_th_cck; 7607ac9a364SKalle Valo u16 nrg_th_ofdm; 7617ac9a364SKalle Valo 7627ac9a364SKalle Valo u16 auto_corr_min_ofdm; 7637ac9a364SKalle Valo u16 auto_corr_min_ofdm_mrc; 7647ac9a364SKalle Valo u16 auto_corr_min_ofdm_x1; 7657ac9a364SKalle Valo u16 auto_corr_min_ofdm_mrc_x1; 7667ac9a364SKalle Valo 7677ac9a364SKalle Valo u16 auto_corr_max_ofdm; 7687ac9a364SKalle Valo u16 auto_corr_max_ofdm_mrc; 7697ac9a364SKalle Valo u16 auto_corr_max_ofdm_x1; 7707ac9a364SKalle Valo u16 auto_corr_max_ofdm_mrc_x1; 7717ac9a364SKalle Valo 7727ac9a364SKalle Valo u16 auto_corr_max_cck; 7737ac9a364SKalle Valo u16 auto_corr_max_cck_mrc; 7747ac9a364SKalle Valo u16 auto_corr_min_cck; 7757ac9a364SKalle Valo u16 auto_corr_min_cck_mrc; 7767ac9a364SKalle Valo 7777ac9a364SKalle Valo u16 barker_corr_th_min; 7787ac9a364SKalle Valo u16 barker_corr_th_min_mrc; 7797ac9a364SKalle Valo u16 nrg_th_cca; 7807ac9a364SKalle Valo }; 7817ac9a364SKalle Valo 7827ac9a364SKalle Valo /** 7837ac9a364SKalle Valo * struct il_hw_params 7847ac9a364SKalle Valo * @bcast_id: f/w broadcast station ID 7857ac9a364SKalle Valo * @max_txq_num: Max # Tx queues supported 7867ac9a364SKalle Valo * @dma_chnl_num: Number of Tx DMA/FIFO channels 7877ac9a364SKalle Valo * @scd_bc_tbls_size: size of scheduler byte count tables 7887ac9a364SKalle Valo * @tfd_size: TFD size 7897ac9a364SKalle Valo * @tx/rx_chains_num: Number of TX/RX chains 7907ac9a364SKalle Valo * @valid_tx/rx_ant: usable antennas 7917ac9a364SKalle Valo * @max_rxq_size: Max # Rx frames in Rx queue (must be power-of-2) 7927ac9a364SKalle Valo * @max_rxq_log: Log-base-2 of max_rxq_size 7937ac9a364SKalle Valo * @rx_page_order: Rx buffer page order 7947ac9a364SKalle Valo * @rx_wrt_ptr_reg: FH{39}_RSCSR_CHNL0_WPTR 7957ac9a364SKalle Valo * @max_stations: 7967ac9a364SKalle Valo * @ht40_channel: is 40MHz width possible in band 2.4 79757fbcce3SJohannes Berg * BIT(NL80211_BAND_5GHZ) BIT(NL80211_BAND_5GHZ) 7987ac9a364SKalle Valo * @sw_crypto: 0 for hw, 1 for sw 7997ac9a364SKalle Valo * @max_xxx_size: for ucode uses 8007ac9a364SKalle Valo * @ct_kill_threshold: temperature threshold 8017ac9a364SKalle Valo * @beacon_time_tsf_bits: number of valid tsf bits for beacon time 8027ac9a364SKalle Valo * @struct il_sensitivity_ranges: range of sensitivity values 8037ac9a364SKalle Valo */ 8047ac9a364SKalle Valo struct il_hw_params { 8057ac9a364SKalle Valo u8 bcast_id; 8067ac9a364SKalle Valo u8 max_txq_num; 8077ac9a364SKalle Valo u8 dma_chnl_num; 8087ac9a364SKalle Valo u16 scd_bc_tbls_size; 8097ac9a364SKalle Valo u32 tfd_size; 8107ac9a364SKalle Valo u8 tx_chains_num; 8117ac9a364SKalle Valo u8 rx_chains_num; 8127ac9a364SKalle Valo u8 valid_tx_ant; 8137ac9a364SKalle Valo u8 valid_rx_ant; 8147ac9a364SKalle Valo u16 max_rxq_size; 8157ac9a364SKalle Valo u16 max_rxq_log; 8167ac9a364SKalle Valo u32 rx_page_order; 8177ac9a364SKalle Valo u32 rx_wrt_ptr_reg; 8187ac9a364SKalle Valo u8 max_stations; 8197ac9a364SKalle Valo u8 ht40_channel; 8207ac9a364SKalle Valo u8 max_beacon_itrvl; /* in 1024 ms */ 8217ac9a364SKalle Valo u32 max_inst_size; 8227ac9a364SKalle Valo u32 max_data_size; 8237ac9a364SKalle Valo u32 max_bsm_size; 8247ac9a364SKalle Valo u32 ct_kill_threshold; /* value in hw-dependent units */ 8257ac9a364SKalle Valo u16 beacon_time_tsf_bits; 8267ac9a364SKalle Valo const struct il_sensitivity_ranges *sens; 8277ac9a364SKalle Valo }; 8287ac9a364SKalle Valo 8297ac9a364SKalle Valo /****************************************************************************** 8307ac9a364SKalle Valo * 8317ac9a364SKalle Valo * Functions implemented in core module which are forward declared here 8327ac9a364SKalle Valo * for use by iwl-[4-5].c 8337ac9a364SKalle Valo * 8347ac9a364SKalle Valo * NOTE: The implementation of these functions are not hardware specific 8357ac9a364SKalle Valo * which is why they are in the core module files. 8367ac9a364SKalle Valo * 8377ac9a364SKalle Valo * Naming convention -- 8387ac9a364SKalle Valo * il_ <-- Is part of iwlwifi 8397ac9a364SKalle Valo * iwlXXXX_ <-- Hardware specific (implemented in iwl-XXXX.c for XXXX) 8407ac9a364SKalle Valo * il4965_bg_ <-- Called from work queue context 8417ac9a364SKalle Valo * il4965_mac_ <-- mac80211 callback 8427ac9a364SKalle Valo * 8437ac9a364SKalle Valo ****************************************************************************/ 8447ac9a364SKalle Valo void il4965_update_chain_flags(struct il_priv *il); 8457ac9a364SKalle Valo extern const u8 il_bcast_addr[ETH_ALEN]; 8467ac9a364SKalle Valo int il_queue_space(const struct il_queue *q); 8477ac9a364SKalle Valo static inline int 8487ac9a364SKalle Valo il_queue_used(const struct il_queue *q, int i) 8497ac9a364SKalle Valo { 8507ac9a364SKalle Valo return q->write_ptr >= q->read_ptr ? (i >= q->read_ptr && 8517ac9a364SKalle Valo i < q->write_ptr) : !(i < 8527ac9a364SKalle Valo q->read_ptr 8537ac9a364SKalle Valo && i >= 8547ac9a364SKalle Valo q-> 8557ac9a364SKalle Valo write_ptr); 8567ac9a364SKalle Valo } 8577ac9a364SKalle Valo 8587ac9a364SKalle Valo static inline u8 8597ac9a364SKalle Valo il_get_cmd_idx(struct il_queue *q, u32 idx, int is_huge) 8607ac9a364SKalle Valo { 8617ac9a364SKalle Valo /* 8627ac9a364SKalle Valo * This is for init calibration result and scan command which 8637ac9a364SKalle Valo * required buffer > TFD_MAX_PAYLOAD_SIZE, 8647ac9a364SKalle Valo * the big buffer at end of command array 8657ac9a364SKalle Valo */ 8667ac9a364SKalle Valo if (is_huge) 8677ac9a364SKalle Valo return q->n_win; /* must be power of 2 */ 8687ac9a364SKalle Valo 8697ac9a364SKalle Valo /* Otherwise, use normal size buffers */ 8707ac9a364SKalle Valo return idx & (q->n_win - 1); 8717ac9a364SKalle Valo } 8727ac9a364SKalle Valo 8737ac9a364SKalle Valo struct il_dma_ptr { 8747ac9a364SKalle Valo dma_addr_t dma; 8757ac9a364SKalle Valo void *addr; 8767ac9a364SKalle Valo size_t size; 8777ac9a364SKalle Valo }; 8787ac9a364SKalle Valo 8797ac9a364SKalle Valo #define IL_OPERATION_MODE_AUTO 0 8807ac9a364SKalle Valo #define IL_OPERATION_MODE_HT_ONLY 1 8817ac9a364SKalle Valo #define IL_OPERATION_MODE_MIXED 2 8827ac9a364SKalle Valo #define IL_OPERATION_MODE_20MHZ 3 8837ac9a364SKalle Valo 8847ac9a364SKalle Valo #define IL_TX_CRC_SIZE 4 8857ac9a364SKalle Valo #define IL_TX_DELIMITER_SIZE 4 8867ac9a364SKalle Valo 8877ac9a364SKalle Valo #define TX_POWER_IL_ILLEGAL_VOLTAGE -10000 8887ac9a364SKalle Valo 8897ac9a364SKalle Valo /* Sensitivity and chain noise calibration */ 8907ac9a364SKalle Valo #define INITIALIZATION_VALUE 0xFFFF 8917ac9a364SKalle Valo #define IL4965_CAL_NUM_BEACONS 20 8927ac9a364SKalle Valo #define IL_CAL_NUM_BEACONS 16 8937ac9a364SKalle Valo #define MAXIMUM_ALLOWED_PATHLOSS 15 8947ac9a364SKalle Valo 8957ac9a364SKalle Valo #define CHAIN_NOISE_MAX_DELTA_GAIN_CODE 3 8967ac9a364SKalle Valo 8977ac9a364SKalle Valo #define MAX_FA_OFDM 50 8987ac9a364SKalle Valo #define MIN_FA_OFDM 5 8997ac9a364SKalle Valo #define MAX_FA_CCK 50 9007ac9a364SKalle Valo #define MIN_FA_CCK 5 9017ac9a364SKalle Valo 9027ac9a364SKalle Valo #define AUTO_CORR_STEP_OFDM 1 9037ac9a364SKalle Valo 9047ac9a364SKalle Valo #define AUTO_CORR_STEP_CCK 3 9057ac9a364SKalle Valo #define AUTO_CORR_MAX_TH_CCK 160 9067ac9a364SKalle Valo 9077ac9a364SKalle Valo #define NRG_DIFF 2 9087ac9a364SKalle Valo #define NRG_STEP_CCK 2 9097ac9a364SKalle Valo #define NRG_MARGIN 8 9107ac9a364SKalle Valo #define MAX_NUMBER_CCK_NO_FA 100 9117ac9a364SKalle Valo 9127ac9a364SKalle Valo #define AUTO_CORR_CCK_MIN_VAL_DEF (125) 9137ac9a364SKalle Valo 9147ac9a364SKalle Valo #define CHAIN_A 0 9157ac9a364SKalle Valo #define CHAIN_B 1 9167ac9a364SKalle Valo #define CHAIN_C 2 9177ac9a364SKalle Valo #define CHAIN_NOISE_DELTA_GAIN_INIT_VAL 4 9187ac9a364SKalle Valo #define ALL_BAND_FILTER 0xFF00 9197ac9a364SKalle Valo #define IN_BAND_FILTER 0xFF 9207ac9a364SKalle Valo #define MIN_AVERAGE_NOISE_MAX_VALUE 0xFFFFFFFF 9217ac9a364SKalle Valo 9227ac9a364SKalle Valo #define NRG_NUM_PREV_STAT_L 20 9237ac9a364SKalle Valo #define NUM_RX_CHAINS 3 9247ac9a364SKalle Valo 9257ac9a364SKalle Valo enum il4965_false_alarm_state { 9267ac9a364SKalle Valo IL_FA_TOO_MANY = 0, 9277ac9a364SKalle Valo IL_FA_TOO_FEW = 1, 9287ac9a364SKalle Valo IL_FA_GOOD_RANGE = 2, 9297ac9a364SKalle Valo }; 9307ac9a364SKalle Valo 9317ac9a364SKalle Valo enum il4965_chain_noise_state { 9327ac9a364SKalle Valo IL_CHAIN_NOISE_ALIVE = 0, /* must be 0 */ 9337ac9a364SKalle Valo IL_CHAIN_NOISE_ACCUMULATE, 9347ac9a364SKalle Valo IL_CHAIN_NOISE_CALIBRATED, 9357ac9a364SKalle Valo IL_CHAIN_NOISE_DONE, 9367ac9a364SKalle Valo }; 9377ac9a364SKalle Valo 9387ac9a364SKalle Valo enum ucode_type { 9397ac9a364SKalle Valo UCODE_NONE = 0, 9407ac9a364SKalle Valo UCODE_INIT, 9417ac9a364SKalle Valo UCODE_RT 9427ac9a364SKalle Valo }; 9437ac9a364SKalle Valo 9447ac9a364SKalle Valo /* Sensitivity calib data */ 9457ac9a364SKalle Valo struct il_sensitivity_data { 9467ac9a364SKalle Valo u32 auto_corr_ofdm; 9477ac9a364SKalle Valo u32 auto_corr_ofdm_mrc; 9487ac9a364SKalle Valo u32 auto_corr_ofdm_x1; 9497ac9a364SKalle Valo u32 auto_corr_ofdm_mrc_x1; 9507ac9a364SKalle Valo u32 auto_corr_cck; 9517ac9a364SKalle Valo u32 auto_corr_cck_mrc; 9527ac9a364SKalle Valo 9537ac9a364SKalle Valo u32 last_bad_plcp_cnt_ofdm; 9547ac9a364SKalle Valo u32 last_fa_cnt_ofdm; 9557ac9a364SKalle Valo u32 last_bad_plcp_cnt_cck; 9567ac9a364SKalle Valo u32 last_fa_cnt_cck; 9577ac9a364SKalle Valo 9587ac9a364SKalle Valo u32 nrg_curr_state; 9597ac9a364SKalle Valo u32 nrg_prev_state; 9607ac9a364SKalle Valo u32 nrg_value[10]; 9617ac9a364SKalle Valo u8 nrg_silence_rssi[NRG_NUM_PREV_STAT_L]; 9627ac9a364SKalle Valo u32 nrg_silence_ref; 9637ac9a364SKalle Valo u32 nrg_energy_idx; 9647ac9a364SKalle Valo u32 nrg_silence_idx; 9657ac9a364SKalle Valo u32 nrg_th_cck; 9667ac9a364SKalle Valo s32 nrg_auto_corr_silence_diff; 9677ac9a364SKalle Valo u32 num_in_cck_no_fa; 9687ac9a364SKalle Valo u32 nrg_th_ofdm; 9697ac9a364SKalle Valo 9707ac9a364SKalle Valo u16 barker_corr_th_min; 9717ac9a364SKalle Valo u16 barker_corr_th_min_mrc; 9727ac9a364SKalle Valo u16 nrg_th_cca; 9737ac9a364SKalle Valo }; 9747ac9a364SKalle Valo 9757ac9a364SKalle Valo /* Chain noise (differential Rx gain) calib data */ 9767ac9a364SKalle Valo struct il_chain_noise_data { 9777ac9a364SKalle Valo u32 active_chains; 9787ac9a364SKalle Valo u32 chain_noise_a; 9797ac9a364SKalle Valo u32 chain_noise_b; 9807ac9a364SKalle Valo u32 chain_noise_c; 9817ac9a364SKalle Valo u32 chain_signal_a; 9827ac9a364SKalle Valo u32 chain_signal_b; 9837ac9a364SKalle Valo u32 chain_signal_c; 9847ac9a364SKalle Valo u16 beacon_count; 9857ac9a364SKalle Valo u8 disconn_array[NUM_RX_CHAINS]; 9867ac9a364SKalle Valo u8 delta_gain_code[NUM_RX_CHAINS]; 9877ac9a364SKalle Valo u8 radio_write; 9887ac9a364SKalle Valo u8 state; 9897ac9a364SKalle Valo }; 9907ac9a364SKalle Valo 9917ac9a364SKalle Valo #define EEPROM_SEM_TIMEOUT 10 /* milliseconds */ 9927ac9a364SKalle Valo #define EEPROM_SEM_RETRY_LIMIT 1000 /* number of attempts (not time) */ 9937ac9a364SKalle Valo 9947ac9a364SKalle Valo #define IL_TRAFFIC_ENTRIES (256) 9957ac9a364SKalle Valo #define IL_TRAFFIC_ENTRY_SIZE (64) 9967ac9a364SKalle Valo 9977ac9a364SKalle Valo enum { 9987ac9a364SKalle Valo MEASUREMENT_READY = (1 << 0), 9997ac9a364SKalle Valo MEASUREMENT_ACTIVE = (1 << 1), 10007ac9a364SKalle Valo }; 10017ac9a364SKalle Valo 10027ac9a364SKalle Valo /* interrupt stats */ 10037ac9a364SKalle Valo struct isr_stats { 10047ac9a364SKalle Valo u32 hw; 10057ac9a364SKalle Valo u32 sw; 10067ac9a364SKalle Valo u32 err_code; 10077ac9a364SKalle Valo u32 sch; 10087ac9a364SKalle Valo u32 alive; 10097ac9a364SKalle Valo u32 rfkill; 10107ac9a364SKalle Valo u32 ctkill; 10117ac9a364SKalle Valo u32 wakeup; 10127ac9a364SKalle Valo u32 rx; 10137ac9a364SKalle Valo u32 handlers[IL_CN_MAX]; 10147ac9a364SKalle Valo u32 tx; 10157ac9a364SKalle Valo u32 unhandled; 10167ac9a364SKalle Valo }; 10177ac9a364SKalle Valo 10187ac9a364SKalle Valo /* management stats */ 10197ac9a364SKalle Valo enum il_mgmt_stats { 10207ac9a364SKalle Valo MANAGEMENT_ASSOC_REQ = 0, 10217ac9a364SKalle Valo MANAGEMENT_ASSOC_RESP, 10227ac9a364SKalle Valo MANAGEMENT_REASSOC_REQ, 10237ac9a364SKalle Valo MANAGEMENT_REASSOC_RESP, 10247ac9a364SKalle Valo MANAGEMENT_PROBE_REQ, 10257ac9a364SKalle Valo MANAGEMENT_PROBE_RESP, 10267ac9a364SKalle Valo MANAGEMENT_BEACON, 10277ac9a364SKalle Valo MANAGEMENT_ATIM, 10287ac9a364SKalle Valo MANAGEMENT_DISASSOC, 10297ac9a364SKalle Valo MANAGEMENT_AUTH, 10307ac9a364SKalle Valo MANAGEMENT_DEAUTH, 10317ac9a364SKalle Valo MANAGEMENT_ACTION, 10327ac9a364SKalle Valo MANAGEMENT_MAX, 10337ac9a364SKalle Valo }; 10347ac9a364SKalle Valo /* control stats */ 10357ac9a364SKalle Valo enum il_ctrl_stats { 10367ac9a364SKalle Valo CONTROL_BACK_REQ = 0, 10377ac9a364SKalle Valo CONTROL_BACK, 10387ac9a364SKalle Valo CONTROL_PSPOLL, 10397ac9a364SKalle Valo CONTROL_RTS, 10407ac9a364SKalle Valo CONTROL_CTS, 10417ac9a364SKalle Valo CONTROL_ACK, 10427ac9a364SKalle Valo CONTROL_CFEND, 10437ac9a364SKalle Valo CONTROL_CFENDACK, 10447ac9a364SKalle Valo CONTROL_MAX, 10457ac9a364SKalle Valo }; 10467ac9a364SKalle Valo 10477ac9a364SKalle Valo struct traffic_stats { 10487ac9a364SKalle Valo #ifdef CONFIG_IWLEGACY_DEBUGFS 10497ac9a364SKalle Valo u32 mgmt[MANAGEMENT_MAX]; 10507ac9a364SKalle Valo u32 ctrl[CONTROL_MAX]; 10517ac9a364SKalle Valo u32 data_cnt; 10527ac9a364SKalle Valo u64 data_bytes; 10537ac9a364SKalle Valo #endif 10547ac9a364SKalle Valo }; 10557ac9a364SKalle Valo 10567ac9a364SKalle Valo /* 10577ac9a364SKalle Valo * host interrupt timeout value 10587ac9a364SKalle Valo * used with setting interrupt coalescing timer 10597ac9a364SKalle Valo * the CSR_INT_COALESCING is an 8 bit register in 32-usec unit 10607ac9a364SKalle Valo * 10617ac9a364SKalle Valo * default interrupt coalescing timer is 64 x 32 = 2048 usecs 10627ac9a364SKalle Valo * default interrupt coalescing calibration timer is 16 x 32 = 512 usecs 10637ac9a364SKalle Valo */ 10647ac9a364SKalle Valo #define IL_HOST_INT_TIMEOUT_MAX (0xFF) 10657ac9a364SKalle Valo #define IL_HOST_INT_TIMEOUT_DEF (0x40) 10667ac9a364SKalle Valo #define IL_HOST_INT_TIMEOUT_MIN (0x0) 10677ac9a364SKalle Valo #define IL_HOST_INT_CALIB_TIMEOUT_MAX (0xFF) 10687ac9a364SKalle Valo #define IL_HOST_INT_CALIB_TIMEOUT_DEF (0x10) 10697ac9a364SKalle Valo #define IL_HOST_INT_CALIB_TIMEOUT_MIN (0x0) 10707ac9a364SKalle Valo 10717ac9a364SKalle Valo #define IL_DELAY_NEXT_FORCE_FW_RELOAD (HZ*5) 10727ac9a364SKalle Valo 10737ac9a364SKalle Valo /* TX queue watchdog timeouts in mSecs */ 10747ac9a364SKalle Valo #define IL_DEF_WD_TIMEOUT (2000) 10757ac9a364SKalle Valo #define IL_LONG_WD_TIMEOUT (10000) 10767ac9a364SKalle Valo #define IL_MAX_WD_TIMEOUT (120000) 10777ac9a364SKalle Valo 10787ac9a364SKalle Valo struct il_force_reset { 10797ac9a364SKalle Valo int reset_request_count; 10807ac9a364SKalle Valo int reset_success_count; 10817ac9a364SKalle Valo int reset_reject_count; 10827ac9a364SKalle Valo unsigned long reset_duration; 10837ac9a364SKalle Valo unsigned long last_force_reset_jiffies; 10847ac9a364SKalle Valo }; 10857ac9a364SKalle Valo 10867ac9a364SKalle Valo /* extend beacon time format bit shifting */ 10877ac9a364SKalle Valo /* 10887ac9a364SKalle Valo * for _3945 devices 10897ac9a364SKalle Valo * bits 31:24 - extended 10907ac9a364SKalle Valo * bits 23:0 - interval 10917ac9a364SKalle Valo */ 10927ac9a364SKalle Valo #define IL3945_EXT_BEACON_TIME_POS 24 10937ac9a364SKalle Valo /* 10947ac9a364SKalle Valo * for _4965 devices 10957ac9a364SKalle Valo * bits 31:22 - extended 10967ac9a364SKalle Valo * bits 21:0 - interval 10977ac9a364SKalle Valo */ 10987ac9a364SKalle Valo #define IL4965_EXT_BEACON_TIME_POS 22 10997ac9a364SKalle Valo 11007ac9a364SKalle Valo struct il_rxon_context { 11017ac9a364SKalle Valo struct ieee80211_vif *vif; 11027ac9a364SKalle Valo }; 11037ac9a364SKalle Valo 11047ac9a364SKalle Valo struct il_power_mgr { 11057ac9a364SKalle Valo struct il_powertable_cmd sleep_cmd; 11067ac9a364SKalle Valo struct il_powertable_cmd sleep_cmd_next; 11077ac9a364SKalle Valo int debug_sleep_level_override; 11087ac9a364SKalle Valo bool pci_pm; 11097ac9a364SKalle Valo bool ps_disabled; 11107ac9a364SKalle Valo }; 11117ac9a364SKalle Valo 11127ac9a364SKalle Valo struct il_priv { 11137ac9a364SKalle Valo struct ieee80211_hw *hw; 11147ac9a364SKalle Valo struct ieee80211_channel *ieee_channels; 11157ac9a364SKalle Valo struct ieee80211_rate *ieee_rates; 11167ac9a364SKalle Valo 11177ac9a364SKalle Valo struct il_cfg *cfg; 11187ac9a364SKalle Valo const struct il_ops *ops; 11197ac9a364SKalle Valo #ifdef CONFIG_IWLEGACY_DEBUGFS 11207ac9a364SKalle Valo const struct il_debugfs_ops *debugfs_ops; 11217ac9a364SKalle Valo #endif 11227ac9a364SKalle Valo 11237ac9a364SKalle Valo /* temporary frame storage list */ 11247ac9a364SKalle Valo struct list_head free_frames; 11257ac9a364SKalle Valo int frames_count; 11267ac9a364SKalle Valo 112757fbcce3SJohannes Berg enum nl80211_band band; 11287ac9a364SKalle Valo int alloc_rxb_page; 11297ac9a364SKalle Valo 11307ac9a364SKalle Valo void (*handlers[IL_CN_MAX]) (struct il_priv *il, 11317ac9a364SKalle Valo struct il_rx_buf *rxb); 11327ac9a364SKalle Valo 113357fbcce3SJohannes Berg struct ieee80211_supported_band bands[NUM_NL80211_BANDS]; 11347ac9a364SKalle Valo 11357ac9a364SKalle Valo /* spectrum measurement report caching */ 11367ac9a364SKalle Valo struct il_spectrum_notification measure_report; 11377ac9a364SKalle Valo u8 measurement_status; 11387ac9a364SKalle Valo 11397ac9a364SKalle Valo /* ucode beacon time */ 11407ac9a364SKalle Valo u32 ucode_beacon_time; 11417ac9a364SKalle Valo int missed_beacon_threshold; 11427ac9a364SKalle Valo 11437ac9a364SKalle Valo /* track IBSS manager (last beacon) status */ 11447ac9a364SKalle Valo u32 ibss_manager; 11457ac9a364SKalle Valo 11467ac9a364SKalle Valo /* force reset */ 11477ac9a364SKalle Valo struct il_force_reset force_reset; 11487ac9a364SKalle Valo 11497ac9a364SKalle Valo /* we allocate array of il_channel_info for NIC's valid channels. 11507ac9a364SKalle Valo * Access via channel # using indirect idx array */ 11517ac9a364SKalle Valo struct il_channel_info *channel_info; /* channel info array */ 11527ac9a364SKalle Valo u8 channel_count; /* # of channels */ 11537ac9a364SKalle Valo 11547ac9a364SKalle Valo /* thermal calibration */ 11557ac9a364SKalle Valo s32 temperature; /* degrees Kelvin */ 11567ac9a364SKalle Valo s32 last_temperature; 11577ac9a364SKalle Valo 11587ac9a364SKalle Valo /* Scan related variables */ 11597ac9a364SKalle Valo unsigned long scan_start; 11607ac9a364SKalle Valo unsigned long scan_start_tsf; 11617ac9a364SKalle Valo void *scan_cmd; 116257fbcce3SJohannes Berg enum nl80211_band scan_band; 11637ac9a364SKalle Valo struct cfg80211_scan_request *scan_request; 11647ac9a364SKalle Valo struct ieee80211_vif *scan_vif; 116557fbcce3SJohannes Berg u8 scan_tx_ant[NUM_NL80211_BANDS]; 11667ac9a364SKalle Valo u8 mgmt_tx_ant; 11677ac9a364SKalle Valo 11687ac9a364SKalle Valo /* spinlock */ 11697ac9a364SKalle Valo spinlock_t lock; /* protect general shared data */ 11707ac9a364SKalle Valo spinlock_t hcmd_lock; /* protect hcmd */ 11717ac9a364SKalle Valo spinlock_t reg_lock; /* protect hw register access */ 11727ac9a364SKalle Valo struct mutex mutex; 11737ac9a364SKalle Valo 11747ac9a364SKalle Valo /* basic pci-network driver stuff */ 11757ac9a364SKalle Valo struct pci_dev *pci_dev; 11767ac9a364SKalle Valo 11777ac9a364SKalle Valo /* pci hardware address support */ 11787ac9a364SKalle Valo void __iomem *hw_base; 11797ac9a364SKalle Valo u32 hw_rev; 11807ac9a364SKalle Valo u32 hw_wa_rev; 11817ac9a364SKalle Valo u8 rev_id; 11827ac9a364SKalle Valo 11837ac9a364SKalle Valo /* command queue number */ 11847ac9a364SKalle Valo u8 cmd_queue; 11857ac9a364SKalle Valo 11867ac9a364SKalle Valo /* max number of station keys */ 11877ac9a364SKalle Valo u8 sta_key_max_num; 11887ac9a364SKalle Valo 11897ac9a364SKalle Valo /* EEPROM MAC addresses */ 11907ac9a364SKalle Valo struct mac_address addresses[1]; 11917ac9a364SKalle Valo 11927ac9a364SKalle Valo /* uCode images, save to reload in case of failure */ 11937ac9a364SKalle Valo int fw_idx; /* firmware we're trying to load */ 11947ac9a364SKalle Valo u32 ucode_ver; /* version of ucode, copy of 11957ac9a364SKalle Valo il_ucode.ver */ 11967ac9a364SKalle Valo struct fw_desc ucode_code; /* runtime inst */ 11977ac9a364SKalle Valo struct fw_desc ucode_data; /* runtime data original */ 11987ac9a364SKalle Valo struct fw_desc ucode_data_backup; /* runtime data save/restore */ 11997ac9a364SKalle Valo struct fw_desc ucode_init; /* initialization inst */ 12007ac9a364SKalle Valo struct fw_desc ucode_init_data; /* initialization data */ 12017ac9a364SKalle Valo struct fw_desc ucode_boot; /* bootstrap inst */ 12027ac9a364SKalle Valo enum ucode_type ucode_type; 12037ac9a364SKalle Valo u8 ucode_write_complete; /* the image write is complete */ 12047ac9a364SKalle Valo char firmware_name[25]; 12057ac9a364SKalle Valo 12067ac9a364SKalle Valo struct ieee80211_vif *vif; 12077ac9a364SKalle Valo 12087ac9a364SKalle Valo struct il_qos_info qos_data; 12097ac9a364SKalle Valo 12107ac9a364SKalle Valo struct { 12117ac9a364SKalle Valo bool enabled; 12127ac9a364SKalle Valo bool is_40mhz; 12137ac9a364SKalle Valo bool non_gf_sta_present; 12147ac9a364SKalle Valo u8 protection; 12157ac9a364SKalle Valo u8 extension_chan_offset; 12167ac9a364SKalle Valo } ht; 12177ac9a364SKalle Valo 12187ac9a364SKalle Valo /* 12197ac9a364SKalle Valo * We declare this const so it can only be 12207ac9a364SKalle Valo * changed via explicit cast within the 12217ac9a364SKalle Valo * routines that actually update the physical 12227ac9a364SKalle Valo * hardware. 12237ac9a364SKalle Valo */ 12247ac9a364SKalle Valo const struct il_rxon_cmd active; 12257ac9a364SKalle Valo struct il_rxon_cmd staging; 12267ac9a364SKalle Valo 12277ac9a364SKalle Valo struct il_rxon_time_cmd timing; 12287ac9a364SKalle Valo 12297ac9a364SKalle Valo __le16 switch_channel; 12307ac9a364SKalle Valo 12317ac9a364SKalle Valo /* 1st responses from initialize and runtime uCode images. 12327ac9a364SKalle Valo * _4965's initialize alive response contains some calibration data. */ 12337ac9a364SKalle Valo struct il_init_alive_resp card_alive_init; 12347ac9a364SKalle Valo struct il_alive_resp card_alive; 12357ac9a364SKalle Valo 12367ac9a364SKalle Valo u16 active_rate; 12377ac9a364SKalle Valo 12387ac9a364SKalle Valo u8 start_calib; 12397ac9a364SKalle Valo struct il_sensitivity_data sensitivity_data; 12407ac9a364SKalle Valo struct il_chain_noise_data chain_noise_data; 12417ac9a364SKalle Valo __le16 sensitivity_tbl[HD_TBL_SIZE]; 12427ac9a364SKalle Valo 12437ac9a364SKalle Valo struct il_ht_config current_ht_config; 12447ac9a364SKalle Valo 12457ac9a364SKalle Valo /* Rate scaling data */ 12467ac9a364SKalle Valo u8 retry_rate; 12477ac9a364SKalle Valo 12487ac9a364SKalle Valo wait_queue_head_t wait_command_queue; 12497ac9a364SKalle Valo 12507ac9a364SKalle Valo int activity_timer_active; 12517ac9a364SKalle Valo 12527ac9a364SKalle Valo /* Rx and Tx DMA processing queues */ 12537ac9a364SKalle Valo struct il_rx_queue rxq; 12547ac9a364SKalle Valo struct il_tx_queue *txq; 12557ac9a364SKalle Valo unsigned long txq_ctx_active_msk; 12567ac9a364SKalle Valo struct il_dma_ptr kw; /* keep warm address */ 12577ac9a364SKalle Valo struct il_dma_ptr scd_bc_tbls; 12587ac9a364SKalle Valo 12597ac9a364SKalle Valo u32 scd_base_addr; /* scheduler sram base address */ 12607ac9a364SKalle Valo 12617ac9a364SKalle Valo unsigned long status; 12627ac9a364SKalle Valo 12637ac9a364SKalle Valo /* counts mgmt, ctl, and data packets */ 12647ac9a364SKalle Valo struct traffic_stats tx_stats; 12657ac9a364SKalle Valo struct traffic_stats rx_stats; 12667ac9a364SKalle Valo 12677ac9a364SKalle Valo /* counts interrupts */ 12687ac9a364SKalle Valo struct isr_stats isr_stats; 12697ac9a364SKalle Valo 12707ac9a364SKalle Valo struct il_power_mgr power_data; 12717ac9a364SKalle Valo 12727ac9a364SKalle Valo /* context information */ 12737ac9a364SKalle Valo u8 bssid[ETH_ALEN]; /* used only on 3945 but filled by core */ 12747ac9a364SKalle Valo 12757ac9a364SKalle Valo /* station table variables */ 12767ac9a364SKalle Valo 12777ac9a364SKalle Valo /* Note: if lock and sta_lock are needed, lock must be acquired first */ 12787ac9a364SKalle Valo spinlock_t sta_lock; 12797ac9a364SKalle Valo int num_stations; 12807ac9a364SKalle Valo struct il_station_entry stations[IL_STATION_COUNT]; 12817ac9a364SKalle Valo unsigned long ucode_key_table; 12827ac9a364SKalle Valo 12837ac9a364SKalle Valo /* queue refcounts */ 12847ac9a364SKalle Valo #define IL_MAX_HW_QUEUES 32 12857ac9a364SKalle Valo unsigned long queue_stopped[BITS_TO_LONGS(IL_MAX_HW_QUEUES)]; 12867ac9a364SKalle Valo #define IL_STOP_REASON_PASSIVE 0 12877ac9a364SKalle Valo unsigned long stop_reason; 12887ac9a364SKalle Valo /* for each AC */ 12897ac9a364SKalle Valo atomic_t queue_stop_count[4]; 12907ac9a364SKalle Valo 12917ac9a364SKalle Valo /* Indication if ieee80211_ops->open has been called */ 12927ac9a364SKalle Valo u8 is_open; 12937ac9a364SKalle Valo 12947ac9a364SKalle Valo u8 mac80211_registered; 12957ac9a364SKalle Valo 12967ac9a364SKalle Valo /* eeprom -- this is in the card's little endian byte order */ 12977ac9a364SKalle Valo u8 *eeprom; 12987ac9a364SKalle Valo struct il_eeprom_calib_info *calib_info; 12997ac9a364SKalle Valo 13007ac9a364SKalle Valo enum nl80211_iftype iw_mode; 13017ac9a364SKalle Valo 13027ac9a364SKalle Valo /* Last Rx'd beacon timestamp */ 13037ac9a364SKalle Valo u64 timestamp; 13047ac9a364SKalle Valo 13057ac9a364SKalle Valo union { 13064c73195eSJavier Martinez Canillas #if IS_ENABLED(CONFIG_IWL3945) 13077ac9a364SKalle Valo struct { 13087ac9a364SKalle Valo void *shared_virt; 13097ac9a364SKalle Valo dma_addr_t shared_phys; 13107ac9a364SKalle Valo 13117ac9a364SKalle Valo struct delayed_work thermal_periodic; 13127ac9a364SKalle Valo struct delayed_work rfkill_poll; 13137ac9a364SKalle Valo 13147ac9a364SKalle Valo struct il3945_notif_stats stats; 13157ac9a364SKalle Valo #ifdef CONFIG_IWLEGACY_DEBUGFS 13167ac9a364SKalle Valo struct il3945_notif_stats accum_stats; 13177ac9a364SKalle Valo struct il3945_notif_stats delta_stats; 13187ac9a364SKalle Valo struct il3945_notif_stats max_delta; 13197ac9a364SKalle Valo #endif 13207ac9a364SKalle Valo 13217ac9a364SKalle Valo u32 sta_supp_rates; 13227ac9a364SKalle Valo int last_rx_rssi; /* From Rx packet stats */ 13237ac9a364SKalle Valo 13247ac9a364SKalle Valo /* Rx'd packet timing information */ 13257ac9a364SKalle Valo u32 last_beacon_time; 13267ac9a364SKalle Valo u64 last_tsf; 13277ac9a364SKalle Valo 13287ac9a364SKalle Valo /* 13297ac9a364SKalle Valo * each calibration channel group in the 13307ac9a364SKalle Valo * EEPROM has a derived clip setting for 13317ac9a364SKalle Valo * each rate. 13327ac9a364SKalle Valo */ 13337ac9a364SKalle Valo const struct il3945_clip_group clip_groups[5]; 13347ac9a364SKalle Valo 13357ac9a364SKalle Valo } _3945; 13367ac9a364SKalle Valo #endif 13374c73195eSJavier Martinez Canillas #if IS_ENABLED(CONFIG_IWL4965) 13387ac9a364SKalle Valo struct { 13397ac9a364SKalle Valo struct il_rx_phy_res last_phy_res; 13407ac9a364SKalle Valo bool last_phy_res_valid; 13417ac9a364SKalle Valo u32 ampdu_ref; 13427ac9a364SKalle Valo 13437ac9a364SKalle Valo struct completion firmware_loading_complete; 13447ac9a364SKalle Valo 13457ac9a364SKalle Valo /* 13467ac9a364SKalle Valo * chain noise reset and gain commands are the 13477ac9a364SKalle Valo * two extra calibration commands follows the standard 13487ac9a364SKalle Valo * phy calibration commands 13497ac9a364SKalle Valo */ 13507ac9a364SKalle Valo u8 phy_calib_chain_noise_reset_cmd; 13517ac9a364SKalle Valo u8 phy_calib_chain_noise_gain_cmd; 13527ac9a364SKalle Valo 13537ac9a364SKalle Valo u8 key_mapping_keys; 13547ac9a364SKalle Valo struct il_wep_key wep_keys[WEP_KEYS_MAX]; 13557ac9a364SKalle Valo 13567ac9a364SKalle Valo struct il_notif_stats stats; 13577ac9a364SKalle Valo #ifdef CONFIG_IWLEGACY_DEBUGFS 13587ac9a364SKalle Valo struct il_notif_stats accum_stats; 13597ac9a364SKalle Valo struct il_notif_stats delta_stats; 13607ac9a364SKalle Valo struct il_notif_stats max_delta; 13617ac9a364SKalle Valo #endif 13627ac9a364SKalle Valo 13637ac9a364SKalle Valo } _4965; 13647ac9a364SKalle Valo #endif 13657ac9a364SKalle Valo }; 13667ac9a364SKalle Valo 13677ac9a364SKalle Valo struct il_hw_params hw_params; 13687ac9a364SKalle Valo 13697ac9a364SKalle Valo u32 inta_mask; 13707ac9a364SKalle Valo 13717ac9a364SKalle Valo struct workqueue_struct *workqueue; 13727ac9a364SKalle Valo 13737ac9a364SKalle Valo struct work_struct restart; 13747ac9a364SKalle Valo struct work_struct scan_completed; 13757ac9a364SKalle Valo struct work_struct rx_replenish; 13767ac9a364SKalle Valo struct work_struct abort_scan; 13777ac9a364SKalle Valo 13787ac9a364SKalle Valo bool beacon_enabled; 13797ac9a364SKalle Valo struct sk_buff *beacon_skb; 13807ac9a364SKalle Valo 13817ac9a364SKalle Valo struct work_struct tx_flush; 13827ac9a364SKalle Valo 13837ac9a364SKalle Valo struct tasklet_struct irq_tasklet; 13847ac9a364SKalle Valo 13857ac9a364SKalle Valo struct delayed_work init_alive_start; 13867ac9a364SKalle Valo struct delayed_work alive_start; 13877ac9a364SKalle Valo struct delayed_work scan_check; 13887ac9a364SKalle Valo 13897ac9a364SKalle Valo /* TX Power */ 13907ac9a364SKalle Valo s8 tx_power_user_lmt; 13917ac9a364SKalle Valo s8 tx_power_device_lmt; 13927ac9a364SKalle Valo s8 tx_power_next; 13937ac9a364SKalle Valo 13947ac9a364SKalle Valo #ifdef CONFIG_IWLEGACY_DEBUG 13957ac9a364SKalle Valo /* debugging info */ 13967ac9a364SKalle Valo u32 debug_level; /* per device debugging will override global 13977ac9a364SKalle Valo il_debug_level if set */ 13987ac9a364SKalle Valo #endif /* CONFIG_IWLEGACY_DEBUG */ 13997ac9a364SKalle Valo #ifdef CONFIG_IWLEGACY_DEBUGFS 14007ac9a364SKalle Valo /* debugfs */ 14017ac9a364SKalle Valo u16 tx_traffic_idx; 14027ac9a364SKalle Valo u16 rx_traffic_idx; 14037ac9a364SKalle Valo u8 *tx_traffic; 14047ac9a364SKalle Valo u8 *rx_traffic; 14057ac9a364SKalle Valo struct dentry *debugfs_dir; 14067ac9a364SKalle Valo u32 dbgfs_sram_offset, dbgfs_sram_len; 14077ac9a364SKalle Valo bool disable_ht40; 14087ac9a364SKalle Valo #endif /* CONFIG_IWLEGACY_DEBUGFS */ 14097ac9a364SKalle Valo 14107ac9a364SKalle Valo struct work_struct txpower_work; 14117ac9a364SKalle Valo bool disable_sens_cal; 14127ac9a364SKalle Valo bool disable_chain_noise_cal; 14137ac9a364SKalle Valo bool disable_tx_power_cal; 14147ac9a364SKalle Valo struct work_struct run_time_calib_work; 14157ac9a364SKalle Valo struct timer_list stats_periodic; 14167ac9a364SKalle Valo struct timer_list watchdog; 14177ac9a364SKalle Valo bool hw_ready; 14187ac9a364SKalle Valo 14197ac9a364SKalle Valo struct led_classdev led; 14207ac9a364SKalle Valo unsigned long blink_on, blink_off; 14217ac9a364SKalle Valo bool led_registered; 14227ac9a364SKalle Valo }; /*il_priv */ 14237ac9a364SKalle Valo 14247ac9a364SKalle Valo static inline void 14257ac9a364SKalle Valo il_txq_ctx_activate(struct il_priv *il, int txq_id) 14267ac9a364SKalle Valo { 14277ac9a364SKalle Valo set_bit(txq_id, &il->txq_ctx_active_msk); 14287ac9a364SKalle Valo } 14297ac9a364SKalle Valo 14307ac9a364SKalle Valo static inline void 14317ac9a364SKalle Valo il_txq_ctx_deactivate(struct il_priv *il, int txq_id) 14327ac9a364SKalle Valo { 14337ac9a364SKalle Valo clear_bit(txq_id, &il->txq_ctx_active_msk); 14347ac9a364SKalle Valo } 14357ac9a364SKalle Valo 14367ac9a364SKalle Valo static inline int 14377ac9a364SKalle Valo il_is_associated(struct il_priv *il) 14387ac9a364SKalle Valo { 14397ac9a364SKalle Valo return (il->active.filter_flags & RXON_FILTER_ASSOC_MSK) ? 1 : 0; 14407ac9a364SKalle Valo } 14417ac9a364SKalle Valo 14427ac9a364SKalle Valo static inline int 14437ac9a364SKalle Valo il_is_any_associated(struct il_priv *il) 14447ac9a364SKalle Valo { 14457ac9a364SKalle Valo return il_is_associated(il); 14467ac9a364SKalle Valo } 14477ac9a364SKalle Valo 14487ac9a364SKalle Valo static inline int 14497ac9a364SKalle Valo il_is_channel_valid(const struct il_channel_info *ch_info) 14507ac9a364SKalle Valo { 14517ac9a364SKalle Valo if (ch_info == NULL) 14527ac9a364SKalle Valo return 0; 14537ac9a364SKalle Valo return (ch_info->flags & EEPROM_CHANNEL_VALID) ? 1 : 0; 14547ac9a364SKalle Valo } 14557ac9a364SKalle Valo 14567ac9a364SKalle Valo static inline int 14577ac9a364SKalle Valo il_is_channel_radar(const struct il_channel_info *ch_info) 14587ac9a364SKalle Valo { 14597ac9a364SKalle Valo return (ch_info->flags & EEPROM_CHANNEL_RADAR) ? 1 : 0; 14607ac9a364SKalle Valo } 14617ac9a364SKalle Valo 14627ac9a364SKalle Valo static inline u8 14637ac9a364SKalle Valo il_is_channel_a_band(const struct il_channel_info *ch_info) 14647ac9a364SKalle Valo { 146557fbcce3SJohannes Berg return ch_info->band == NL80211_BAND_5GHZ; 14667ac9a364SKalle Valo } 14677ac9a364SKalle Valo 14687ac9a364SKalle Valo static inline int 14697ac9a364SKalle Valo il_is_channel_passive(const struct il_channel_info *ch) 14707ac9a364SKalle Valo { 14717ac9a364SKalle Valo return (!(ch->flags & EEPROM_CHANNEL_ACTIVE)) ? 1 : 0; 14727ac9a364SKalle Valo } 14737ac9a364SKalle Valo 14747ac9a364SKalle Valo static inline int 14757ac9a364SKalle Valo il_is_channel_ibss(const struct il_channel_info *ch) 14767ac9a364SKalle Valo { 14777ac9a364SKalle Valo return (ch->flags & EEPROM_CHANNEL_IBSS) ? 1 : 0; 14787ac9a364SKalle Valo } 14797ac9a364SKalle Valo 14807ac9a364SKalle Valo static inline void 14817ac9a364SKalle Valo __il_free_pages(struct il_priv *il, struct page *page) 14827ac9a364SKalle Valo { 14837ac9a364SKalle Valo __free_pages(page, il->hw_params.rx_page_order); 14847ac9a364SKalle Valo il->alloc_rxb_page--; 14857ac9a364SKalle Valo } 14867ac9a364SKalle Valo 14877ac9a364SKalle Valo static inline void 14887ac9a364SKalle Valo il_free_pages(struct il_priv *il, unsigned long page) 14897ac9a364SKalle Valo { 14907ac9a364SKalle Valo free_pages(page, il->hw_params.rx_page_order); 14917ac9a364SKalle Valo il->alloc_rxb_page--; 14927ac9a364SKalle Valo } 14937ac9a364SKalle Valo 14947ac9a364SKalle Valo #define IWLWIFI_VERSION "in-tree:" 14957ac9a364SKalle Valo #define DRV_COPYRIGHT "Copyright(c) 2003-2011 Intel Corporation" 14967ac9a364SKalle Valo #define DRV_AUTHOR "<ilw@linux.intel.com>" 14977ac9a364SKalle Valo 14987ac9a364SKalle Valo #define IL_PCI_DEVICE(dev, subdev, cfg) \ 14997ac9a364SKalle Valo .vendor = PCI_VENDOR_ID_INTEL, .device = (dev), \ 15007ac9a364SKalle Valo .subvendor = PCI_ANY_ID, .subdevice = (subdev), \ 15017ac9a364SKalle Valo .driver_data = (kernel_ulong_t)&(cfg) 15027ac9a364SKalle Valo 15037ac9a364SKalle Valo #define TIME_UNIT 1024 15047ac9a364SKalle Valo 15057ac9a364SKalle Valo #define IL_SKU_G 0x1 15067ac9a364SKalle Valo #define IL_SKU_A 0x2 15077ac9a364SKalle Valo #define IL_SKU_N 0x8 15087ac9a364SKalle Valo 15097ac9a364SKalle Valo #define IL_CMD(x) case x: return #x 15107ac9a364SKalle Valo 15117ac9a364SKalle Valo /* Size of one Rx buffer in host DRAM */ 15127ac9a364SKalle Valo #define IL_RX_BUF_SIZE_3K (3 * 1000) /* 3945 only */ 15137ac9a364SKalle Valo #define IL_RX_BUF_SIZE_4K (4 * 1024) 15147ac9a364SKalle Valo #define IL_RX_BUF_SIZE_8K (8 * 1024) 15157ac9a364SKalle Valo 15167ac9a364SKalle Valo #ifdef CONFIG_IWLEGACY_DEBUGFS 15177ac9a364SKalle Valo struct il_debugfs_ops { 15187ac9a364SKalle Valo ssize_t(*rx_stats_read) (struct file *file, char __user *user_buf, 15197ac9a364SKalle Valo size_t count, loff_t *ppos); 15207ac9a364SKalle Valo ssize_t(*tx_stats_read) (struct file *file, char __user *user_buf, 15217ac9a364SKalle Valo size_t count, loff_t *ppos); 15227ac9a364SKalle Valo ssize_t(*general_stats_read) (struct file *file, 15237ac9a364SKalle Valo char __user *user_buf, size_t count, 15247ac9a364SKalle Valo loff_t *ppos); 15257ac9a364SKalle Valo }; 15267ac9a364SKalle Valo #endif 15277ac9a364SKalle Valo 15287ac9a364SKalle Valo struct il_ops { 15297ac9a364SKalle Valo /* Handling TX */ 15307ac9a364SKalle Valo void (*txq_update_byte_cnt_tbl) (struct il_priv *il, 15317ac9a364SKalle Valo struct il_tx_queue *txq, 15327ac9a364SKalle Valo u16 byte_cnt); 15337ac9a364SKalle Valo int (*txq_attach_buf_to_tfd) (struct il_priv *il, 15347ac9a364SKalle Valo struct il_tx_queue *txq, dma_addr_t addr, 15357ac9a364SKalle Valo u16 len, u8 reset, u8 pad); 15367ac9a364SKalle Valo void (*txq_free_tfd) (struct il_priv *il, struct il_tx_queue *txq); 15377ac9a364SKalle Valo int (*txq_init) (struct il_priv *il, struct il_tx_queue *txq); 15387ac9a364SKalle Valo /* alive notification after init uCode load */ 15397ac9a364SKalle Valo void (*init_alive_start) (struct il_priv *il); 15407ac9a364SKalle Valo /* check validity of rtc data address */ 15417ac9a364SKalle Valo int (*is_valid_rtc_data_addr) (u32 addr); 15427ac9a364SKalle Valo /* 1st ucode load */ 15437ac9a364SKalle Valo int (*load_ucode) (struct il_priv *il); 15447ac9a364SKalle Valo 15457ac9a364SKalle Valo void (*dump_nic_error_log) (struct il_priv *il); 15467ac9a364SKalle Valo int (*dump_fh) (struct il_priv *il, char **buf, bool display); 15477ac9a364SKalle Valo int (*set_channel_switch) (struct il_priv *il, 15487ac9a364SKalle Valo struct ieee80211_channel_switch *ch_switch); 15497ac9a364SKalle Valo /* power management */ 15507ac9a364SKalle Valo int (*apm_init) (struct il_priv *il); 15517ac9a364SKalle Valo 15527ac9a364SKalle Valo /* tx power */ 15537ac9a364SKalle Valo int (*send_tx_power) (struct il_priv *il); 15547ac9a364SKalle Valo void (*update_chain_flags) (struct il_priv *il); 15557ac9a364SKalle Valo 15567ac9a364SKalle Valo /* eeprom operations */ 15577ac9a364SKalle Valo int (*eeprom_acquire_semaphore) (struct il_priv *il); 15587ac9a364SKalle Valo void (*eeprom_release_semaphore) (struct il_priv *il); 15597ac9a364SKalle Valo 15607ac9a364SKalle Valo int (*rxon_assoc) (struct il_priv *il); 15617ac9a364SKalle Valo int (*commit_rxon) (struct il_priv *il); 15627ac9a364SKalle Valo void (*set_rxon_chain) (struct il_priv *il); 15637ac9a364SKalle Valo 15647ac9a364SKalle Valo u16(*get_hcmd_size) (u8 cmd_id, u16 len); 15657ac9a364SKalle Valo u16(*build_addsta_hcmd) (const struct il_addsta_cmd *cmd, u8 *data); 15667ac9a364SKalle Valo 15677ac9a364SKalle Valo int (*request_scan) (struct il_priv *il, struct ieee80211_vif *vif); 15687ac9a364SKalle Valo void (*post_scan) (struct il_priv *il); 15697ac9a364SKalle Valo void (*post_associate) (struct il_priv *il); 15707ac9a364SKalle Valo void (*config_ap) (struct il_priv *il); 15717ac9a364SKalle Valo /* station management */ 15727ac9a364SKalle Valo int (*update_bcast_stations) (struct il_priv *il); 15737ac9a364SKalle Valo int (*manage_ibss_station) (struct il_priv *il, 15747ac9a364SKalle Valo struct ieee80211_vif *vif, bool add); 15757ac9a364SKalle Valo 15767ac9a364SKalle Valo int (*send_led_cmd) (struct il_priv *il, struct il_led_cmd *led_cmd); 15777ac9a364SKalle Valo }; 15787ac9a364SKalle Valo 15797ac9a364SKalle Valo struct il_mod_params { 15807ac9a364SKalle Valo int sw_crypto; /* def: 0 = using hardware encryption */ 15817ac9a364SKalle Valo int disable_hw_scan; /* def: 0 = use h/w scan */ 15827ac9a364SKalle Valo int num_of_queues; /* def: HW dependent */ 15837ac9a364SKalle Valo int disable_11n; /* def: 0 = 11n capabilities enabled */ 15847ac9a364SKalle Valo int amsdu_size_8K; /* def: 0 = disable 8K amsdu size */ 15857ac9a364SKalle Valo int antenna; /* def: 0 = both antennas (use diversity) */ 15867ac9a364SKalle Valo int restart_fw; /* def: 1 = restart firmware */ 15877ac9a364SKalle Valo }; 15887ac9a364SKalle Valo 15897ac9a364SKalle Valo #define IL_LED_SOLID 11 15907ac9a364SKalle Valo #define IL_DEF_LED_INTRVL cpu_to_le32(1000) 15917ac9a364SKalle Valo 15927ac9a364SKalle Valo #define IL_LED_ACTIVITY (0<<1) 15937ac9a364SKalle Valo #define IL_LED_LINK (1<<1) 15947ac9a364SKalle Valo 15957ac9a364SKalle Valo /* 15967ac9a364SKalle Valo * LED mode 15977ac9a364SKalle Valo * IL_LED_DEFAULT: use device default 15987ac9a364SKalle Valo * IL_LED_RF_STATE: turn LED on/off based on RF state 15997ac9a364SKalle Valo * LED ON = RF ON 16007ac9a364SKalle Valo * LED OFF = RF OFF 16017ac9a364SKalle Valo * IL_LED_BLINK: adjust led blink rate based on blink table 16027ac9a364SKalle Valo */ 16037ac9a364SKalle Valo enum il_led_mode { 16047ac9a364SKalle Valo IL_LED_DEFAULT, 16057ac9a364SKalle Valo IL_LED_RF_STATE, 16067ac9a364SKalle Valo IL_LED_BLINK, 16077ac9a364SKalle Valo }; 16087ac9a364SKalle Valo 16097ac9a364SKalle Valo void il_leds_init(struct il_priv *il); 16107ac9a364SKalle Valo void il_leds_exit(struct il_priv *il); 16117ac9a364SKalle Valo 16127ac9a364SKalle Valo /** 16137ac9a364SKalle Valo * struct il_cfg 16147ac9a364SKalle Valo * @fw_name_pre: Firmware filename prefix. The api version and extension 16157ac9a364SKalle Valo * (.ucode) will be added to filename before loading from disk. The 16167ac9a364SKalle Valo * filename is constructed as fw_name_pre<api>.ucode. 16177ac9a364SKalle Valo * @ucode_api_max: Highest version of uCode API supported by driver. 16187ac9a364SKalle Valo * @ucode_api_min: Lowest version of uCode API supported by driver. 16197ac9a364SKalle Valo * @scan_antennas: available antenna for scan operation 16207ac9a364SKalle Valo * @led_mode: 0=blinking, 1=On(RF On)/Off(RF Off) 16217ac9a364SKalle Valo * 16227ac9a364SKalle Valo * We enable the driver to be backward compatible wrt API version. The 16237ac9a364SKalle Valo * driver specifies which APIs it supports (with @ucode_api_max being the 16247ac9a364SKalle Valo * highest and @ucode_api_min the lowest). Firmware will only be loaded if 16257ac9a364SKalle Valo * it has a supported API version. The firmware's API version will be 16267ac9a364SKalle Valo * stored in @il_priv, enabling the driver to make runtime changes based 16277ac9a364SKalle Valo * on firmware version used. 16287ac9a364SKalle Valo * 16297ac9a364SKalle Valo * For example, 16307ac9a364SKalle Valo * if (IL_UCODE_API(il->ucode_ver) >= 2) { 16317ac9a364SKalle Valo * Driver interacts with Firmware API version >= 2. 16327ac9a364SKalle Valo * } else { 16337ac9a364SKalle Valo * Driver interacts with Firmware API version 1. 16347ac9a364SKalle Valo * } 16357ac9a364SKalle Valo * 16367ac9a364SKalle Valo * The ideal usage of this infrastructure is to treat a new ucode API 16377ac9a364SKalle Valo * release as a new hardware revision. That is, through utilizing the 16387ac9a364SKalle Valo * il_hcmd_utils_ops etc. we accommodate different command structures 16397ac9a364SKalle Valo * and flows between hardware versions as well as their API 16407ac9a364SKalle Valo * versions. 16417ac9a364SKalle Valo * 16427ac9a364SKalle Valo */ 16437ac9a364SKalle Valo struct il_cfg { 16447ac9a364SKalle Valo /* params specific to an individual device within a device family */ 16457ac9a364SKalle Valo const char *name; 16467ac9a364SKalle Valo const char *fw_name_pre; 16477ac9a364SKalle Valo const unsigned int ucode_api_max; 16487ac9a364SKalle Valo const unsigned int ucode_api_min; 16497ac9a364SKalle Valo u8 valid_tx_ant; 16507ac9a364SKalle Valo u8 valid_rx_ant; 16517ac9a364SKalle Valo unsigned int sku; 16527ac9a364SKalle Valo u16 eeprom_ver; 16537ac9a364SKalle Valo u16 eeprom_calib_ver; 16547ac9a364SKalle Valo /* module based parameters which can be set from modprobe cmd */ 16557ac9a364SKalle Valo const struct il_mod_params *mod_params; 16567ac9a364SKalle Valo /* params not likely to change within a device family */ 16577ac9a364SKalle Valo struct il_base_params *base_params; 16587ac9a364SKalle Valo /* params likely to change within a device family */ 165957fbcce3SJohannes Berg u8 scan_rx_antennas[NUM_NL80211_BANDS]; 16607ac9a364SKalle Valo enum il_led_mode led_mode; 16617ac9a364SKalle Valo 16627ac9a364SKalle Valo int eeprom_size; 16637ac9a364SKalle Valo int num_of_queues; /* def: HW dependent */ 16647ac9a364SKalle Valo int num_of_ampdu_queues; /* def: HW dependent */ 16657ac9a364SKalle Valo /* for il_apm_init() */ 16667ac9a364SKalle Valo u32 pll_cfg_val; 16677ac9a364SKalle Valo bool set_l0s; 16687ac9a364SKalle Valo bool use_bsm; 16697ac9a364SKalle Valo 16707ac9a364SKalle Valo u16 led_compensation; 16717ac9a364SKalle Valo int chain_noise_num_beacons; 16727ac9a364SKalle Valo unsigned int wd_timeout; 16737ac9a364SKalle Valo bool temperature_kelvin; 16747ac9a364SKalle Valo const bool ucode_tracing; 16757ac9a364SKalle Valo const bool sensitivity_calib_by_driver; 16767ac9a364SKalle Valo const bool chain_noise_calib_by_driver; 16777ac9a364SKalle Valo 16787ac9a364SKalle Valo const u32 regulatory_bands[7]; 16797ac9a364SKalle Valo }; 16807ac9a364SKalle Valo 16817ac9a364SKalle Valo /*************************** 16827ac9a364SKalle Valo * L i b * 16837ac9a364SKalle Valo ***************************/ 16847ac9a364SKalle Valo 16857ac9a364SKalle Valo int il_mac_conf_tx(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 16867ac9a364SKalle Valo u16 queue, const struct ieee80211_tx_queue_params *params); 16877ac9a364SKalle Valo int il_mac_tx_last_beacon(struct ieee80211_hw *hw); 16887ac9a364SKalle Valo 16897ac9a364SKalle Valo void il_set_rxon_hwcrypto(struct il_priv *il, int hw_decrypt); 16907ac9a364SKalle Valo int il_check_rxon_cmd(struct il_priv *il); 16917ac9a364SKalle Valo int il_full_rxon_required(struct il_priv *il); 16927ac9a364SKalle Valo int il_set_rxon_channel(struct il_priv *il, struct ieee80211_channel *ch); 169357fbcce3SJohannes Berg void il_set_flags_for_band(struct il_priv *il, enum nl80211_band band, 16947ac9a364SKalle Valo struct ieee80211_vif *vif); 169557fbcce3SJohannes Berg u8 il_get_single_channel_number(struct il_priv *il, enum nl80211_band band); 16967ac9a364SKalle Valo void il_set_rxon_ht(struct il_priv *il, struct il_ht_config *ht_conf); 16977ac9a364SKalle Valo bool il_is_ht40_tx_allowed(struct il_priv *il, 16987ac9a364SKalle Valo struct ieee80211_sta_ht_cap *ht_cap); 16997ac9a364SKalle Valo void il_connection_init_rx_config(struct il_priv *il); 17007ac9a364SKalle Valo void il_set_rate(struct il_priv *il); 17017ac9a364SKalle Valo int il_set_decrypted_flag(struct il_priv *il, struct ieee80211_hdr *hdr, 17027ac9a364SKalle Valo u32 decrypt_res, struct ieee80211_rx_status *stats); 17037ac9a364SKalle Valo void il_irq_handle_error(struct il_priv *il); 17047ac9a364SKalle Valo int il_mac_add_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif); 17057ac9a364SKalle Valo void il_mac_remove_interface(struct ieee80211_hw *hw, 17067ac9a364SKalle Valo struct ieee80211_vif *vif); 17077ac9a364SKalle Valo int il_mac_change_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 17087ac9a364SKalle Valo enum nl80211_iftype newtype, bool newp2p); 17097ac9a364SKalle Valo void il_mac_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 17107ac9a364SKalle Valo u32 queues, bool drop); 17117ac9a364SKalle Valo int il_alloc_txq_mem(struct il_priv *il); 17127ac9a364SKalle Valo void il_free_txq_mem(struct il_priv *il); 17137ac9a364SKalle Valo 17147ac9a364SKalle Valo #ifdef CONFIG_IWLEGACY_DEBUGFS 17157ac9a364SKalle Valo void il_update_stats(struct il_priv *il, bool is_tx, __le16 fc, u16 len); 17167ac9a364SKalle Valo #else 17177ac9a364SKalle Valo static inline void 17187ac9a364SKalle Valo il_update_stats(struct il_priv *il, bool is_tx, __le16 fc, u16 len) 17197ac9a364SKalle Valo { 17207ac9a364SKalle Valo } 17217ac9a364SKalle Valo #endif 17227ac9a364SKalle Valo 17237ac9a364SKalle Valo /***************************************************** 17247ac9a364SKalle Valo * Handlers 17257ac9a364SKalle Valo ***************************************************/ 17267ac9a364SKalle Valo void il_hdl_pm_sleep(struct il_priv *il, struct il_rx_buf *rxb); 17277ac9a364SKalle Valo void il_hdl_pm_debug_stats(struct il_priv *il, struct il_rx_buf *rxb); 17287ac9a364SKalle Valo void il_hdl_error(struct il_priv *il, struct il_rx_buf *rxb); 17297ac9a364SKalle Valo void il_hdl_csa(struct il_priv *il, struct il_rx_buf *rxb); 17307ac9a364SKalle Valo 17317ac9a364SKalle Valo /***************************************************** 17327ac9a364SKalle Valo * RX 17337ac9a364SKalle Valo ******************************************************/ 17347ac9a364SKalle Valo void il_cmd_queue_unmap(struct il_priv *il); 17357ac9a364SKalle Valo void il_cmd_queue_free(struct il_priv *il); 17367ac9a364SKalle Valo int il_rx_queue_alloc(struct il_priv *il); 17377ac9a364SKalle Valo void il_rx_queue_update_write_ptr(struct il_priv *il, struct il_rx_queue *q); 17387ac9a364SKalle Valo int il_rx_queue_space(const struct il_rx_queue *q); 17397ac9a364SKalle Valo void il_tx_cmd_complete(struct il_priv *il, struct il_rx_buf *rxb); 17407ac9a364SKalle Valo 17417ac9a364SKalle Valo void il_hdl_spectrum_measurement(struct il_priv *il, struct il_rx_buf *rxb); 17427ac9a364SKalle Valo void il_recover_from_stats(struct il_priv *il, struct il_rx_pkt *pkt); 17437ac9a364SKalle Valo void il_chswitch_done(struct il_priv *il, bool is_success); 17447ac9a364SKalle Valo 17457ac9a364SKalle Valo /***************************************************** 17467ac9a364SKalle Valo * TX 17477ac9a364SKalle Valo ******************************************************/ 17487ac9a364SKalle Valo void il_txq_update_write_ptr(struct il_priv *il, struct il_tx_queue *txq); 17497ac9a364SKalle Valo int il_tx_queue_init(struct il_priv *il, u32 txq_id); 17507ac9a364SKalle Valo void il_tx_queue_reset(struct il_priv *il, u32 txq_id); 17517ac9a364SKalle Valo void il_tx_queue_unmap(struct il_priv *il, int txq_id); 17527ac9a364SKalle Valo void il_tx_queue_free(struct il_priv *il, int txq_id); 17537ac9a364SKalle Valo void il_setup_watchdog(struct il_priv *il); 17547ac9a364SKalle Valo /***************************************************** 17557ac9a364SKalle Valo * TX power 17567ac9a364SKalle Valo ****************************************************/ 17577ac9a364SKalle Valo int il_set_tx_power(struct il_priv *il, s8 tx_power, bool force); 17587ac9a364SKalle Valo 17597ac9a364SKalle Valo /******************************************************************************* 17607ac9a364SKalle Valo * Rate 17617ac9a364SKalle Valo ******************************************************************************/ 17627ac9a364SKalle Valo 17637ac9a364SKalle Valo u8 il_get_lowest_plcp(struct il_priv *il); 17647ac9a364SKalle Valo 17657ac9a364SKalle Valo /******************************************************************************* 17667ac9a364SKalle Valo * Scanning 17677ac9a364SKalle Valo ******************************************************************************/ 17687ac9a364SKalle Valo void il_init_scan_params(struct il_priv *il); 17697ac9a364SKalle Valo int il_scan_cancel(struct il_priv *il); 17707ac9a364SKalle Valo int il_scan_cancel_timeout(struct il_priv *il, unsigned long ms); 17717ac9a364SKalle Valo void il_force_scan_end(struct il_priv *il); 17727ac9a364SKalle Valo int il_mac_hw_scan(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 17737ac9a364SKalle Valo struct ieee80211_scan_request *hw_req); 17747ac9a364SKalle Valo void il_internal_short_hw_scan(struct il_priv *il); 17757ac9a364SKalle Valo int il_force_reset(struct il_priv *il, bool external); 17767ac9a364SKalle Valo u16 il_fill_probe_req(struct il_priv *il, struct ieee80211_mgmt *frame, 17777ac9a364SKalle Valo const u8 *ta, const u8 *ie, int ie_len, int left); 17787ac9a364SKalle Valo void il_setup_rx_scan_handlers(struct il_priv *il); 177957fbcce3SJohannes Berg u16 il_get_active_dwell_time(struct il_priv *il, enum nl80211_band band, 17807ac9a364SKalle Valo u8 n_probes); 178157fbcce3SJohannes Berg u16 il_get_passive_dwell_time(struct il_priv *il, enum nl80211_band band, 17827ac9a364SKalle Valo struct ieee80211_vif *vif); 17837ac9a364SKalle Valo void il_setup_scan_deferred_work(struct il_priv *il); 17847ac9a364SKalle Valo void il_cancel_scan_deferred_work(struct il_priv *il); 17857ac9a364SKalle Valo 17867ac9a364SKalle Valo /* For faster active scanning, scan will move to the next channel if fewer than 17877ac9a364SKalle Valo * PLCP_QUIET_THRESH packets are heard on this channel within 17887ac9a364SKalle Valo * ACTIVE_QUIET_TIME after sending probe request. This shortens the dwell 17897ac9a364SKalle Valo * time if it's a quiet channel (nothing responded to our probe, and there's 17907ac9a364SKalle Valo * no other traffic). 17917ac9a364SKalle Valo * Disable "quiet" feature by setting PLCP_QUIET_THRESH to 0. */ 17927ac9a364SKalle Valo #define IL_ACTIVE_QUIET_TIME cpu_to_le16(10) /* msec */ 17937ac9a364SKalle Valo #define IL_PLCP_QUIET_THRESH cpu_to_le16(1) /* packets */ 17947ac9a364SKalle Valo 17957ac9a364SKalle Valo #define IL_SCAN_CHECK_WATCHDOG (HZ * 7) 17967ac9a364SKalle Valo 17977ac9a364SKalle Valo /***************************************************** 17987ac9a364SKalle Valo * S e n d i n g H o s t C o m m a n d s * 17997ac9a364SKalle Valo *****************************************************/ 18007ac9a364SKalle Valo 18017ac9a364SKalle Valo const char *il_get_cmd_string(u8 cmd); 18027ac9a364SKalle Valo int __must_check il_send_cmd_sync(struct il_priv *il, struct il_host_cmd *cmd); 18037ac9a364SKalle Valo int il_send_cmd(struct il_priv *il, struct il_host_cmd *cmd); 18047ac9a364SKalle Valo int __must_check il_send_cmd_pdu(struct il_priv *il, u8 id, u16 len, 18057ac9a364SKalle Valo const void *data); 18067ac9a364SKalle Valo int il_send_cmd_pdu_async(struct il_priv *il, u8 id, u16 len, const void *data, 18077ac9a364SKalle Valo void (*callback) (struct il_priv *il, 18087ac9a364SKalle Valo struct il_device_cmd *cmd, 18097ac9a364SKalle Valo struct il_rx_pkt *pkt)); 18107ac9a364SKalle Valo 18117ac9a364SKalle Valo int il_enqueue_hcmd(struct il_priv *il, struct il_host_cmd *cmd); 18127ac9a364SKalle Valo 18137ac9a364SKalle Valo /***************************************************** 18147ac9a364SKalle Valo * PCI * 18157ac9a364SKalle Valo *****************************************************/ 18167ac9a364SKalle Valo 18172b77839bSKees Cook void il_bg_watchdog(struct timer_list *t); 18187ac9a364SKalle Valo u32 il_usecs_to_beacons(struct il_priv *il, u32 usec, u32 beacon_interval); 18197ac9a364SKalle Valo __le32 il_add_beacon_time(struct il_priv *il, u32 base, u32 addon, 18207ac9a364SKalle Valo u32 beacon_interval); 18217ac9a364SKalle Valo 18227ac9a364SKalle Valo #ifdef CONFIG_PM_SLEEP 18237ac9a364SKalle Valo extern const struct dev_pm_ops il_pm_ops; 18247ac9a364SKalle Valo 18257ac9a364SKalle Valo #define IL_LEGACY_PM_OPS (&il_pm_ops) 18267ac9a364SKalle Valo 18277ac9a364SKalle Valo #else /* !CONFIG_PM_SLEEP */ 18287ac9a364SKalle Valo 18297ac9a364SKalle Valo #define IL_LEGACY_PM_OPS NULL 18307ac9a364SKalle Valo 18317ac9a364SKalle Valo #endif /* !CONFIG_PM_SLEEP */ 18327ac9a364SKalle Valo 18337ac9a364SKalle Valo /***************************************************** 18347ac9a364SKalle Valo * Error Handling Debugging 18357ac9a364SKalle Valo ******************************************************/ 18367ac9a364SKalle Valo void il4965_dump_nic_error_log(struct il_priv *il); 18377ac9a364SKalle Valo #ifdef CONFIG_IWLEGACY_DEBUG 18387ac9a364SKalle Valo void il_print_rx_config_cmd(struct il_priv *il); 18397ac9a364SKalle Valo #else 18407ac9a364SKalle Valo static inline void 18417ac9a364SKalle Valo il_print_rx_config_cmd(struct il_priv *il) 18427ac9a364SKalle Valo { 18437ac9a364SKalle Valo } 18447ac9a364SKalle Valo #endif 18457ac9a364SKalle Valo 18467ac9a364SKalle Valo void il_clear_isr_stats(struct il_priv *il); 18477ac9a364SKalle Valo 18487ac9a364SKalle Valo /***************************************************** 18497ac9a364SKalle Valo * GEOS 18507ac9a364SKalle Valo ******************************************************/ 18517ac9a364SKalle Valo int il_init_geos(struct il_priv *il); 18527ac9a364SKalle Valo void il_free_geos(struct il_priv *il); 18537ac9a364SKalle Valo 18547ac9a364SKalle Valo /*************** DRIVER STATUS FUNCTIONS *****/ 18557ac9a364SKalle Valo 18567ac9a364SKalle Valo #define S_HCMD_ACTIVE 0 /* host command in progress */ 18577ac9a364SKalle Valo /* 1 is unused (used to be S_HCMD_SYNC_ACTIVE) */ 18587ac9a364SKalle Valo #define S_INT_ENABLED 2 18597ac9a364SKalle Valo #define S_RFKILL 3 18607ac9a364SKalle Valo #define S_CT_KILL 4 18617ac9a364SKalle Valo #define S_INIT 5 18627ac9a364SKalle Valo #define S_ALIVE 6 18637ac9a364SKalle Valo #define S_READY 7 18647ac9a364SKalle Valo #define S_TEMPERATURE 8 18657ac9a364SKalle Valo #define S_GEO_CONFIGURED 9 18667ac9a364SKalle Valo #define S_EXIT_PENDING 10 18677ac9a364SKalle Valo #define S_STATS 12 18687ac9a364SKalle Valo #define S_SCANNING 13 18697ac9a364SKalle Valo #define S_SCAN_ABORTING 14 18707ac9a364SKalle Valo #define S_SCAN_HW 15 18717ac9a364SKalle Valo #define S_POWER_PMI 16 18727ac9a364SKalle Valo #define S_FW_ERROR 17 18737ac9a364SKalle Valo #define S_CHANNEL_SWITCH_PENDING 18 18747ac9a364SKalle Valo 18757ac9a364SKalle Valo static inline int 18767ac9a364SKalle Valo il_is_ready(struct il_priv *il) 18777ac9a364SKalle Valo { 18787ac9a364SKalle Valo /* The adapter is 'ready' if READY and GEO_CONFIGURED bits are 18797ac9a364SKalle Valo * set but EXIT_PENDING is not */ 18807ac9a364SKalle Valo return test_bit(S_READY, &il->status) && 18817ac9a364SKalle Valo test_bit(S_GEO_CONFIGURED, &il->status) && 18827ac9a364SKalle Valo !test_bit(S_EXIT_PENDING, &il->status); 18837ac9a364SKalle Valo } 18847ac9a364SKalle Valo 18857ac9a364SKalle Valo static inline int 18867ac9a364SKalle Valo il_is_alive(struct il_priv *il) 18877ac9a364SKalle Valo { 18887ac9a364SKalle Valo return test_bit(S_ALIVE, &il->status); 18897ac9a364SKalle Valo } 18907ac9a364SKalle Valo 18917ac9a364SKalle Valo static inline int 18927ac9a364SKalle Valo il_is_init(struct il_priv *il) 18937ac9a364SKalle Valo { 18947ac9a364SKalle Valo return test_bit(S_INIT, &il->status); 18957ac9a364SKalle Valo } 18967ac9a364SKalle Valo 18977ac9a364SKalle Valo static inline int 18987ac9a364SKalle Valo il_is_rfkill(struct il_priv *il) 18997ac9a364SKalle Valo { 19007ac9a364SKalle Valo return test_bit(S_RFKILL, &il->status); 19017ac9a364SKalle Valo } 19027ac9a364SKalle Valo 19037ac9a364SKalle Valo static inline int 19047ac9a364SKalle Valo il_is_ctkill(struct il_priv *il) 19057ac9a364SKalle Valo { 19067ac9a364SKalle Valo return test_bit(S_CT_KILL, &il->status); 19077ac9a364SKalle Valo } 19087ac9a364SKalle Valo 19097ac9a364SKalle Valo static inline int 19107ac9a364SKalle Valo il_is_ready_rf(struct il_priv *il) 19117ac9a364SKalle Valo { 19127ac9a364SKalle Valo 19137ac9a364SKalle Valo if (il_is_rfkill(il)) 19147ac9a364SKalle Valo return 0; 19157ac9a364SKalle Valo 19167ac9a364SKalle Valo return il_is_ready(il); 19177ac9a364SKalle Valo } 19187ac9a364SKalle Valo 19197ac9a364SKalle Valo void il_send_bt_config(struct il_priv *il); 19207ac9a364SKalle Valo int il_send_stats_request(struct il_priv *il, u8 flags, bool clear); 19217ac9a364SKalle Valo void il_apm_stop(struct il_priv *il); 19227ac9a364SKalle Valo void _il_apm_stop(struct il_priv *il); 19237ac9a364SKalle Valo 19247ac9a364SKalle Valo int il_apm_init(struct il_priv *il); 19257ac9a364SKalle Valo 19267ac9a364SKalle Valo int il_send_rxon_timing(struct il_priv *il); 19277ac9a364SKalle Valo 19287ac9a364SKalle Valo static inline int 19297ac9a364SKalle Valo il_send_rxon_assoc(struct il_priv *il) 19307ac9a364SKalle Valo { 19317ac9a364SKalle Valo return il->ops->rxon_assoc(il); 19327ac9a364SKalle Valo } 19337ac9a364SKalle Valo 19347ac9a364SKalle Valo static inline int 19357ac9a364SKalle Valo il_commit_rxon(struct il_priv *il) 19367ac9a364SKalle Valo { 19377ac9a364SKalle Valo return il->ops->commit_rxon(il); 19387ac9a364SKalle Valo } 19397ac9a364SKalle Valo 19407ac9a364SKalle Valo static inline const struct ieee80211_supported_band * 194157fbcce3SJohannes Berg il_get_hw_mode(struct il_priv *il, enum nl80211_band band) 19427ac9a364SKalle Valo { 19437ac9a364SKalle Valo return il->hw->wiphy->bands[band]; 19447ac9a364SKalle Valo } 19457ac9a364SKalle Valo 19467ac9a364SKalle Valo /* mac80211 handlers */ 19477ac9a364SKalle Valo int il_mac_config(struct ieee80211_hw *hw, u32 changed); 19487ac9a364SKalle Valo void il_mac_reset_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif); 19497ac9a364SKalle Valo void il_mac_bss_info_changed(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 19507ac9a364SKalle Valo struct ieee80211_bss_conf *bss_conf, u32 changes); 19517ac9a364SKalle Valo void il_tx_cmd_protection(struct il_priv *il, struct ieee80211_tx_info *info, 19527ac9a364SKalle Valo __le16 fc, __le32 *tx_flags); 19537ac9a364SKalle Valo 19547ac9a364SKalle Valo irqreturn_t il_isr(int irq, void *data); 19557ac9a364SKalle Valo 19567ac9a364SKalle Valo void il_set_bit(struct il_priv *p, u32 r, u32 m); 19577ac9a364SKalle Valo void il_clear_bit(struct il_priv *p, u32 r, u32 m); 19587ac9a364SKalle Valo bool _il_grab_nic_access(struct il_priv *il); 19597ac9a364SKalle Valo int _il_poll_bit(struct il_priv *il, u32 addr, u32 bits, u32 mask, int timeout); 19607ac9a364SKalle Valo int il_poll_bit(struct il_priv *il, u32 addr, u32 mask, int timeout); 19617ac9a364SKalle Valo u32 il_rd_prph(struct il_priv *il, u32 reg); 19627ac9a364SKalle Valo void il_wr_prph(struct il_priv *il, u32 addr, u32 val); 19637ac9a364SKalle Valo u32 il_read_targ_mem(struct il_priv *il, u32 addr); 19647ac9a364SKalle Valo void il_write_targ_mem(struct il_priv *il, u32 addr, u32 val); 19657ac9a364SKalle Valo 19667ac9a364SKalle Valo static inline bool il_need_reclaim(struct il_priv *il, struct il_rx_pkt *pkt) 19677ac9a364SKalle Valo { 19687ac9a364SKalle Valo /* Reclaim a command buffer only if this packet is a response 19697ac9a364SKalle Valo * to a (driver-originated) command. If the packet (e.g. Rx frame) 19707ac9a364SKalle Valo * originated from uCode, there is no command buffer to reclaim. 19717ac9a364SKalle Valo * Ucode should set SEQ_RX_FRAME bit if ucode-originated, but 19727ac9a364SKalle Valo * apparently a few don't get set; catch them here. 19737ac9a364SKalle Valo */ 19747ac9a364SKalle Valo return !(pkt->hdr.sequence & SEQ_RX_FRAME) && 19757ac9a364SKalle Valo pkt->hdr.cmd != N_STATS && pkt->hdr.cmd != C_TX && 19767ac9a364SKalle Valo pkt->hdr.cmd != N_RX_PHY && pkt->hdr.cmd != N_RX && 19777ac9a364SKalle Valo pkt->hdr.cmd != N_RX_MPDU && pkt->hdr.cmd != N_COMPRESSED_BA; 19787ac9a364SKalle Valo } 19797ac9a364SKalle Valo 19807ac9a364SKalle Valo static inline void 19817ac9a364SKalle Valo _il_write8(struct il_priv *il, u32 ofs, u8 val) 19827ac9a364SKalle Valo { 19837ac9a364SKalle Valo writeb(val, il->hw_base + ofs); 19847ac9a364SKalle Valo } 19857ac9a364SKalle Valo #define il_write8(il, ofs, val) _il_write8(il, ofs, val) 19867ac9a364SKalle Valo 19877ac9a364SKalle Valo static inline void 19887ac9a364SKalle Valo _il_wr(struct il_priv *il, u32 ofs, u32 val) 19897ac9a364SKalle Valo { 19907ac9a364SKalle Valo writel(val, il->hw_base + ofs); 19917ac9a364SKalle Valo } 19927ac9a364SKalle Valo 19937ac9a364SKalle Valo static inline u32 19947ac9a364SKalle Valo _il_rd(struct il_priv *il, u32 ofs) 19957ac9a364SKalle Valo { 19967ac9a364SKalle Valo return readl(il->hw_base + ofs); 19977ac9a364SKalle Valo } 19987ac9a364SKalle Valo 19997ac9a364SKalle Valo static inline void 20007ac9a364SKalle Valo _il_clear_bit(struct il_priv *il, u32 reg, u32 mask) 20017ac9a364SKalle Valo { 20027ac9a364SKalle Valo _il_wr(il, reg, _il_rd(il, reg) & ~mask); 20037ac9a364SKalle Valo } 20047ac9a364SKalle Valo 20057ac9a364SKalle Valo static inline void 20067ac9a364SKalle Valo _il_set_bit(struct il_priv *il, u32 reg, u32 mask) 20077ac9a364SKalle Valo { 20087ac9a364SKalle Valo _il_wr(il, reg, _il_rd(il, reg) | mask); 20097ac9a364SKalle Valo } 20107ac9a364SKalle Valo 20117ac9a364SKalle Valo static inline void 20127ac9a364SKalle Valo _il_release_nic_access(struct il_priv *il) 20137ac9a364SKalle Valo { 20147ac9a364SKalle Valo _il_clear_bit(il, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ); 20157ac9a364SKalle Valo } 20167ac9a364SKalle Valo 20177ac9a364SKalle Valo static inline u32 20187ac9a364SKalle Valo il_rd(struct il_priv *il, u32 reg) 20197ac9a364SKalle Valo { 20207ac9a364SKalle Valo u32 value; 20217ac9a364SKalle Valo unsigned long reg_flags; 20227ac9a364SKalle Valo 20237ac9a364SKalle Valo spin_lock_irqsave(&il->reg_lock, reg_flags); 20247ac9a364SKalle Valo _il_grab_nic_access(il); 20257ac9a364SKalle Valo value = _il_rd(il, reg); 20267ac9a364SKalle Valo _il_release_nic_access(il); 20277ac9a364SKalle Valo spin_unlock_irqrestore(&il->reg_lock, reg_flags); 20287ac9a364SKalle Valo return value; 20297ac9a364SKalle Valo } 20307ac9a364SKalle Valo 20317ac9a364SKalle Valo static inline void 20327ac9a364SKalle Valo il_wr(struct il_priv *il, u32 reg, u32 value) 20337ac9a364SKalle Valo { 20347ac9a364SKalle Valo unsigned long reg_flags; 20357ac9a364SKalle Valo 20367ac9a364SKalle Valo spin_lock_irqsave(&il->reg_lock, reg_flags); 20377ac9a364SKalle Valo if (likely(_il_grab_nic_access(il))) { 20387ac9a364SKalle Valo _il_wr(il, reg, value); 20397ac9a364SKalle Valo _il_release_nic_access(il); 20407ac9a364SKalle Valo } 20417ac9a364SKalle Valo spin_unlock_irqrestore(&il->reg_lock, reg_flags); 20427ac9a364SKalle Valo } 20437ac9a364SKalle Valo 20447ac9a364SKalle Valo static inline u32 20457ac9a364SKalle Valo _il_rd_prph(struct il_priv *il, u32 reg) 20467ac9a364SKalle Valo { 20477ac9a364SKalle Valo _il_wr(il, HBUS_TARG_PRPH_RADDR, reg | (3 << 24)); 20487ac9a364SKalle Valo return _il_rd(il, HBUS_TARG_PRPH_RDAT); 20497ac9a364SKalle Valo } 20507ac9a364SKalle Valo 20517ac9a364SKalle Valo static inline void 20527ac9a364SKalle Valo _il_wr_prph(struct il_priv *il, u32 addr, u32 val) 20537ac9a364SKalle Valo { 20547ac9a364SKalle Valo _il_wr(il, HBUS_TARG_PRPH_WADDR, ((addr & 0x0000FFFF) | (3 << 24))); 20557ac9a364SKalle Valo _il_wr(il, HBUS_TARG_PRPH_WDAT, val); 20567ac9a364SKalle Valo } 20577ac9a364SKalle Valo 20587ac9a364SKalle Valo static inline void 20597ac9a364SKalle Valo il_set_bits_prph(struct il_priv *il, u32 reg, u32 mask) 20607ac9a364SKalle Valo { 20617ac9a364SKalle Valo unsigned long reg_flags; 20627ac9a364SKalle Valo 20637ac9a364SKalle Valo spin_lock_irqsave(&il->reg_lock, reg_flags); 20647ac9a364SKalle Valo if (likely(_il_grab_nic_access(il))) { 20657ac9a364SKalle Valo _il_wr_prph(il, reg, (_il_rd_prph(il, reg) | mask)); 20667ac9a364SKalle Valo _il_release_nic_access(il); 20677ac9a364SKalle Valo } 20687ac9a364SKalle Valo spin_unlock_irqrestore(&il->reg_lock, reg_flags); 20697ac9a364SKalle Valo } 20707ac9a364SKalle Valo 20717ac9a364SKalle Valo static inline void 20727ac9a364SKalle Valo il_set_bits_mask_prph(struct il_priv *il, u32 reg, u32 bits, u32 mask) 20737ac9a364SKalle Valo { 20747ac9a364SKalle Valo unsigned long reg_flags; 20757ac9a364SKalle Valo 20767ac9a364SKalle Valo spin_lock_irqsave(&il->reg_lock, reg_flags); 20777ac9a364SKalle Valo if (likely(_il_grab_nic_access(il))) { 20787ac9a364SKalle Valo _il_wr_prph(il, reg, ((_il_rd_prph(il, reg) & mask) | bits)); 20797ac9a364SKalle Valo _il_release_nic_access(il); 20807ac9a364SKalle Valo } 20817ac9a364SKalle Valo spin_unlock_irqrestore(&il->reg_lock, reg_flags); 20827ac9a364SKalle Valo } 20837ac9a364SKalle Valo 20847ac9a364SKalle Valo static inline void 20857ac9a364SKalle Valo il_clear_bits_prph(struct il_priv *il, u32 reg, u32 mask) 20867ac9a364SKalle Valo { 20877ac9a364SKalle Valo unsigned long reg_flags; 20887ac9a364SKalle Valo u32 val; 20897ac9a364SKalle Valo 20907ac9a364SKalle Valo spin_lock_irqsave(&il->reg_lock, reg_flags); 20917ac9a364SKalle Valo if (likely(_il_grab_nic_access(il))) { 20927ac9a364SKalle Valo val = _il_rd_prph(il, reg); 20937ac9a364SKalle Valo _il_wr_prph(il, reg, (val & ~mask)); 20947ac9a364SKalle Valo _il_release_nic_access(il); 20957ac9a364SKalle Valo } 20967ac9a364SKalle Valo spin_unlock_irqrestore(&il->reg_lock, reg_flags); 20977ac9a364SKalle Valo } 20987ac9a364SKalle Valo 20997ac9a364SKalle Valo #define HW_KEY_DYNAMIC 0 21007ac9a364SKalle Valo #define HW_KEY_DEFAULT 1 21017ac9a364SKalle Valo 21027ac9a364SKalle Valo #define IL_STA_DRIVER_ACTIVE BIT(0) /* driver entry is active */ 21037ac9a364SKalle Valo #define IL_STA_UCODE_ACTIVE BIT(1) /* ucode entry is active */ 21047ac9a364SKalle Valo #define IL_STA_UCODE_INPROGRESS BIT(2) /* ucode entry is in process of 21057ac9a364SKalle Valo being activated */ 21067ac9a364SKalle Valo #define IL_STA_LOCAL BIT(3) /* station state not directed by mac80211; 21077ac9a364SKalle Valo (this is for the IBSS BSSID stations) */ 21087ac9a364SKalle Valo #define IL_STA_BCAST BIT(4) /* this station is the special bcast station */ 21097ac9a364SKalle Valo 21107ac9a364SKalle Valo void il_restore_stations(struct il_priv *il); 21117ac9a364SKalle Valo void il_clear_ucode_stations(struct il_priv *il); 21127ac9a364SKalle Valo void il_dealloc_bcast_stations(struct il_priv *il); 21137ac9a364SKalle Valo int il_get_free_ucode_key_idx(struct il_priv *il); 21147ac9a364SKalle Valo int il_send_add_sta(struct il_priv *il, struct il_addsta_cmd *sta, u8 flags); 21157ac9a364SKalle Valo int il_add_station_common(struct il_priv *il, const u8 *addr, bool is_ap, 21167ac9a364SKalle Valo struct ieee80211_sta *sta, u8 *sta_id_r); 21177ac9a364SKalle Valo int il_remove_station(struct il_priv *il, const u8 sta_id, const u8 * addr); 21187ac9a364SKalle Valo int il_mac_sta_remove(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 21197ac9a364SKalle Valo struct ieee80211_sta *sta); 21207ac9a364SKalle Valo 21217ac9a364SKalle Valo u8 il_prep_station(struct il_priv *il, const u8 *addr, bool is_ap, 21227ac9a364SKalle Valo struct ieee80211_sta *sta); 21237ac9a364SKalle Valo 21247ac9a364SKalle Valo int il_send_lq_cmd(struct il_priv *il, struct il_link_quality_cmd *lq, 21257ac9a364SKalle Valo u8 flags, bool init); 21267ac9a364SKalle Valo 21277ac9a364SKalle Valo /** 21287ac9a364SKalle Valo * il_clear_driver_stations - clear knowledge of all stations from driver 21297ac9a364SKalle Valo * @il: iwl il struct 21307ac9a364SKalle Valo * 21317ac9a364SKalle Valo * This is called during il_down() to make sure that in the case 21327ac9a364SKalle Valo * we're coming there from a hardware restart mac80211 will be 21337ac9a364SKalle Valo * able to reconfigure stations -- if we're getting there in the 21347ac9a364SKalle Valo * normal down flow then the stations will already be cleared. 21357ac9a364SKalle Valo */ 21367ac9a364SKalle Valo static inline void 21377ac9a364SKalle Valo il_clear_driver_stations(struct il_priv *il) 21387ac9a364SKalle Valo { 21397ac9a364SKalle Valo unsigned long flags; 21407ac9a364SKalle Valo 21417ac9a364SKalle Valo spin_lock_irqsave(&il->sta_lock, flags); 21427ac9a364SKalle Valo memset(il->stations, 0, sizeof(il->stations)); 21437ac9a364SKalle Valo il->num_stations = 0; 21447ac9a364SKalle Valo il->ucode_key_table = 0; 21457ac9a364SKalle Valo spin_unlock_irqrestore(&il->sta_lock, flags); 21467ac9a364SKalle Valo } 21477ac9a364SKalle Valo 21487ac9a364SKalle Valo static inline int 21497ac9a364SKalle Valo il_sta_id(struct ieee80211_sta *sta) 21507ac9a364SKalle Valo { 21517ac9a364SKalle Valo if (WARN_ON(!sta)) 21527ac9a364SKalle Valo return IL_INVALID_STATION; 21537ac9a364SKalle Valo 21547ac9a364SKalle Valo return ((struct il_station_priv_common *)sta->drv_priv)->sta_id; 21557ac9a364SKalle Valo } 21567ac9a364SKalle Valo 21577ac9a364SKalle Valo /** 21587ac9a364SKalle Valo * il_sta_id_or_broadcast - return sta_id or broadcast sta 21597ac9a364SKalle Valo * @il: iwl il 21607ac9a364SKalle Valo * @context: the current context 21617ac9a364SKalle Valo * @sta: mac80211 station 21627ac9a364SKalle Valo * 21637ac9a364SKalle Valo * In certain circumstances mac80211 passes a station pointer 21647ac9a364SKalle Valo * that may be %NULL, for example during TX or key setup. In 21657ac9a364SKalle Valo * that case, we need to use the broadcast station, so this 21667ac9a364SKalle Valo * inline wraps that pattern. 21677ac9a364SKalle Valo */ 21687ac9a364SKalle Valo static inline int 21697ac9a364SKalle Valo il_sta_id_or_broadcast(struct il_priv *il, struct ieee80211_sta *sta) 21707ac9a364SKalle Valo { 21717ac9a364SKalle Valo int sta_id; 21727ac9a364SKalle Valo 21737ac9a364SKalle Valo if (!sta) 21747ac9a364SKalle Valo return il->hw_params.bcast_id; 21757ac9a364SKalle Valo 21767ac9a364SKalle Valo sta_id = il_sta_id(sta); 21777ac9a364SKalle Valo 21787ac9a364SKalle Valo /* 21797ac9a364SKalle Valo * mac80211 should not be passing a partially 21807ac9a364SKalle Valo * initialised station! 21817ac9a364SKalle Valo */ 21827ac9a364SKalle Valo WARN_ON(sta_id == IL_INVALID_STATION); 21837ac9a364SKalle Valo 21847ac9a364SKalle Valo return sta_id; 21857ac9a364SKalle Valo } 21867ac9a364SKalle Valo 21877ac9a364SKalle Valo /** 21887ac9a364SKalle Valo * il_queue_inc_wrap - increment queue idx, wrap back to beginning 21897ac9a364SKalle Valo * @idx -- current idx 21907ac9a364SKalle Valo * @n_bd -- total number of entries in queue (must be power of 2) 21917ac9a364SKalle Valo */ 21927ac9a364SKalle Valo static inline int 21937ac9a364SKalle Valo il_queue_inc_wrap(int idx, int n_bd) 21947ac9a364SKalle Valo { 21957ac9a364SKalle Valo return ++idx & (n_bd - 1); 21967ac9a364SKalle Valo } 21977ac9a364SKalle Valo 21987ac9a364SKalle Valo /** 21997ac9a364SKalle Valo * il_queue_dec_wrap - decrement queue idx, wrap back to end 22007ac9a364SKalle Valo * @idx -- current idx 22017ac9a364SKalle Valo * @n_bd -- total number of entries in queue (must be power of 2) 22027ac9a364SKalle Valo */ 22037ac9a364SKalle Valo static inline int 22047ac9a364SKalle Valo il_queue_dec_wrap(int idx, int n_bd) 22057ac9a364SKalle Valo { 22067ac9a364SKalle Valo return --idx & (n_bd - 1); 22077ac9a364SKalle Valo } 22087ac9a364SKalle Valo 22097ac9a364SKalle Valo /* TODO: Move fw_desc functions to iwl-pci.ko */ 22107ac9a364SKalle Valo static inline void 22117ac9a364SKalle Valo il_free_fw_desc(struct pci_dev *pci_dev, struct fw_desc *desc) 22127ac9a364SKalle Valo { 22137ac9a364SKalle Valo if (desc->v_addr) 22147ac9a364SKalle Valo dma_free_coherent(&pci_dev->dev, desc->len, desc->v_addr, 22157ac9a364SKalle Valo desc->p_addr); 22167ac9a364SKalle Valo desc->v_addr = NULL; 22177ac9a364SKalle Valo desc->len = 0; 22187ac9a364SKalle Valo } 22197ac9a364SKalle Valo 22207ac9a364SKalle Valo static inline int 22217ac9a364SKalle Valo il_alloc_fw_desc(struct pci_dev *pci_dev, struct fw_desc *desc) 22227ac9a364SKalle Valo { 22237ac9a364SKalle Valo if (!desc->len) { 22247ac9a364SKalle Valo desc->v_addr = NULL; 22257ac9a364SKalle Valo return -EINVAL; 22267ac9a364SKalle Valo } 22277ac9a364SKalle Valo 22287ac9a364SKalle Valo desc->v_addr = dma_alloc_coherent(&pci_dev->dev, desc->len, 22297ac9a364SKalle Valo &desc->p_addr, GFP_KERNEL); 22307ac9a364SKalle Valo return (desc->v_addr != NULL) ? 0 : -ENOMEM; 22317ac9a364SKalle Valo } 22327ac9a364SKalle Valo 22337ac9a364SKalle Valo /* 22347ac9a364SKalle Valo * we have 8 bits used like this: 22357ac9a364SKalle Valo * 22367ac9a364SKalle Valo * 7 6 5 4 3 2 1 0 22377ac9a364SKalle Valo * | | | | | | | | 22387ac9a364SKalle Valo * | | | | | | +-+-------- AC queue (0-3) 22397ac9a364SKalle Valo * | | | | | | 22407ac9a364SKalle Valo * | +-+-+-+-+------------ HW queue ID 22417ac9a364SKalle Valo * | 22427ac9a364SKalle Valo * +---------------------- unused 22437ac9a364SKalle Valo */ 22447ac9a364SKalle Valo static inline void 22457ac9a364SKalle Valo il_set_swq_id(struct il_tx_queue *txq, u8 ac, u8 hwq) 22467ac9a364SKalle Valo { 22477ac9a364SKalle Valo BUG_ON(ac > 3); /* only have 2 bits */ 22487ac9a364SKalle Valo BUG_ON(hwq > 31); /* only use 5 bits */ 22497ac9a364SKalle Valo 22507ac9a364SKalle Valo txq->swq_id = (hwq << 2) | ac; 22517ac9a364SKalle Valo } 22527ac9a364SKalle Valo 22537ac9a364SKalle Valo static inline void 22547ac9a364SKalle Valo _il_wake_queue(struct il_priv *il, u8 ac) 22557ac9a364SKalle Valo { 22567ac9a364SKalle Valo if (atomic_dec_return(&il->queue_stop_count[ac]) <= 0) 22577ac9a364SKalle Valo ieee80211_wake_queue(il->hw, ac); 22587ac9a364SKalle Valo } 22597ac9a364SKalle Valo 22607ac9a364SKalle Valo static inline void 22617ac9a364SKalle Valo _il_stop_queue(struct il_priv *il, u8 ac) 22627ac9a364SKalle Valo { 22637ac9a364SKalle Valo if (atomic_inc_return(&il->queue_stop_count[ac]) > 0) 22647ac9a364SKalle Valo ieee80211_stop_queue(il->hw, ac); 22657ac9a364SKalle Valo } 22667ac9a364SKalle Valo static inline void 22677ac9a364SKalle Valo il_wake_queue(struct il_priv *il, struct il_tx_queue *txq) 22687ac9a364SKalle Valo { 22697ac9a364SKalle Valo u8 queue = txq->swq_id; 22707ac9a364SKalle Valo u8 ac = queue & 3; 22717ac9a364SKalle Valo u8 hwq = (queue >> 2) & 0x1f; 22727ac9a364SKalle Valo 22737ac9a364SKalle Valo if (test_and_clear_bit(hwq, il->queue_stopped)) 22747ac9a364SKalle Valo _il_wake_queue(il, ac); 22757ac9a364SKalle Valo } 22767ac9a364SKalle Valo 22777ac9a364SKalle Valo static inline void 22787ac9a364SKalle Valo il_stop_queue(struct il_priv *il, struct il_tx_queue *txq) 22797ac9a364SKalle Valo { 22807ac9a364SKalle Valo u8 queue = txq->swq_id; 22817ac9a364SKalle Valo u8 ac = queue & 3; 22827ac9a364SKalle Valo u8 hwq = (queue >> 2) & 0x1f; 22837ac9a364SKalle Valo 22847ac9a364SKalle Valo if (!test_and_set_bit(hwq, il->queue_stopped)) 22857ac9a364SKalle Valo _il_stop_queue(il, ac); 22867ac9a364SKalle Valo } 22877ac9a364SKalle Valo 22887ac9a364SKalle Valo static inline void 22897ac9a364SKalle Valo il_wake_queues_by_reason(struct il_priv *il, int reason) 22907ac9a364SKalle Valo { 22917ac9a364SKalle Valo u8 ac; 22927ac9a364SKalle Valo 22937ac9a364SKalle Valo if (test_and_clear_bit(reason, &il->stop_reason)) 22947ac9a364SKalle Valo for (ac = 0; ac < 4; ac++) 22957ac9a364SKalle Valo _il_wake_queue(il, ac); 22967ac9a364SKalle Valo } 22977ac9a364SKalle Valo 22987ac9a364SKalle Valo static inline void 22997ac9a364SKalle Valo il_stop_queues_by_reason(struct il_priv *il, int reason) 23007ac9a364SKalle Valo { 23017ac9a364SKalle Valo u8 ac; 23027ac9a364SKalle Valo 23037ac9a364SKalle Valo if (!test_and_set_bit(reason, &il->stop_reason)) 23047ac9a364SKalle Valo for (ac = 0; ac < 4; ac++) 23057ac9a364SKalle Valo _il_stop_queue(il, ac); 23067ac9a364SKalle Valo } 23077ac9a364SKalle Valo 23087ac9a364SKalle Valo #ifdef ieee80211_stop_queue 23097ac9a364SKalle Valo #undef ieee80211_stop_queue 23107ac9a364SKalle Valo #endif 23117ac9a364SKalle Valo 23127ac9a364SKalle Valo #define ieee80211_stop_queue DO_NOT_USE_ieee80211_stop_queue 23137ac9a364SKalle Valo 23147ac9a364SKalle Valo #ifdef ieee80211_wake_queue 23157ac9a364SKalle Valo #undef ieee80211_wake_queue 23167ac9a364SKalle Valo #endif 23177ac9a364SKalle Valo 23187ac9a364SKalle Valo #define ieee80211_wake_queue DO_NOT_USE_ieee80211_wake_queue 23197ac9a364SKalle Valo 23207ac9a364SKalle Valo static inline void 23217ac9a364SKalle Valo il_disable_interrupts(struct il_priv *il) 23227ac9a364SKalle Valo { 23237ac9a364SKalle Valo clear_bit(S_INT_ENABLED, &il->status); 23247ac9a364SKalle Valo 23257ac9a364SKalle Valo /* disable interrupts from uCode/NIC to host */ 23267ac9a364SKalle Valo _il_wr(il, CSR_INT_MASK, 0x00000000); 23277ac9a364SKalle Valo 23287ac9a364SKalle Valo /* acknowledge/clear/reset any interrupts still pending 23297ac9a364SKalle Valo * from uCode or flow handler (Rx/Tx DMA) */ 23307ac9a364SKalle Valo _il_wr(il, CSR_INT, 0xffffffff); 23317ac9a364SKalle Valo _il_wr(il, CSR_FH_INT_STATUS, 0xffffffff); 23327ac9a364SKalle Valo } 23337ac9a364SKalle Valo 23347ac9a364SKalle Valo static inline void 23357ac9a364SKalle Valo il_enable_rfkill_int(struct il_priv *il) 23367ac9a364SKalle Valo { 23377ac9a364SKalle Valo _il_wr(il, CSR_INT_MASK, CSR_INT_BIT_RF_KILL); 23387ac9a364SKalle Valo } 23397ac9a364SKalle Valo 23407ac9a364SKalle Valo static inline void 23417ac9a364SKalle Valo il_enable_interrupts(struct il_priv *il) 23427ac9a364SKalle Valo { 23437ac9a364SKalle Valo set_bit(S_INT_ENABLED, &il->status); 23447ac9a364SKalle Valo _il_wr(il, CSR_INT_MASK, il->inta_mask); 23457ac9a364SKalle Valo } 23467ac9a364SKalle Valo 23477ac9a364SKalle Valo /** 23487ac9a364SKalle Valo * il_beacon_time_mask_low - mask of lower 32 bit of beacon time 23497ac9a364SKalle Valo * @il -- pointer to il_priv data structure 23507ac9a364SKalle Valo * @tsf_bits -- number of bits need to shift for masking) 23517ac9a364SKalle Valo */ 23527ac9a364SKalle Valo static inline u32 23537ac9a364SKalle Valo il_beacon_time_mask_low(struct il_priv *il, u16 tsf_bits) 23547ac9a364SKalle Valo { 23557ac9a364SKalle Valo return (1 << tsf_bits) - 1; 23567ac9a364SKalle Valo } 23577ac9a364SKalle Valo 23587ac9a364SKalle Valo /** 23597ac9a364SKalle Valo * il_beacon_time_mask_high - mask of higher 32 bit of beacon time 23607ac9a364SKalle Valo * @il -- pointer to il_priv data structure 23617ac9a364SKalle Valo * @tsf_bits -- number of bits need to shift for masking) 23627ac9a364SKalle Valo */ 23637ac9a364SKalle Valo static inline u32 23647ac9a364SKalle Valo il_beacon_time_mask_high(struct il_priv *il, u16 tsf_bits) 23657ac9a364SKalle Valo { 23667ac9a364SKalle Valo return ((1 << (32 - tsf_bits)) - 1) << tsf_bits; 23677ac9a364SKalle Valo } 23687ac9a364SKalle Valo 23697ac9a364SKalle Valo /** 23707ac9a364SKalle Valo * struct il_rb_status - reseve buffer status host memory mapped FH registers 23717ac9a364SKalle Valo * 23727ac9a364SKalle Valo * @closed_rb_num [0:11] - Indicates the idx of the RB which was closed 23737ac9a364SKalle Valo * @closed_fr_num [0:11] - Indicates the idx of the RX Frame which was closed 23747ac9a364SKalle Valo * @finished_rb_num [0:11] - Indicates the idx of the current RB 23757ac9a364SKalle Valo * in which the last frame was written to 23767ac9a364SKalle Valo * @finished_fr_num [0:11] - Indicates the idx of the RX Frame 23777ac9a364SKalle Valo * which was transferred 23787ac9a364SKalle Valo */ 23797ac9a364SKalle Valo struct il_rb_status { 23807ac9a364SKalle Valo __le16 closed_rb_num; 23817ac9a364SKalle Valo __le16 closed_fr_num; 23827ac9a364SKalle Valo __le16 finished_rb_num; 23837ac9a364SKalle Valo __le16 finished_fr_nam; 23847ac9a364SKalle Valo __le32 __unused; /* 3945 only */ 23857ac9a364SKalle Valo } __packed; 23867ac9a364SKalle Valo 23877ac9a364SKalle Valo #define TFD_QUEUE_SIZE_MAX 256 23887ac9a364SKalle Valo #define TFD_QUEUE_SIZE_BC_DUP 64 23897ac9a364SKalle Valo #define TFD_QUEUE_BC_SIZE (TFD_QUEUE_SIZE_MAX + TFD_QUEUE_SIZE_BC_DUP) 23907ac9a364SKalle Valo #define IL_TX_DMA_MASK DMA_BIT_MASK(36) 23917ac9a364SKalle Valo #define IL_NUM_OF_TBS 20 23927ac9a364SKalle Valo 23937ac9a364SKalle Valo static inline u8 23947ac9a364SKalle Valo il_get_dma_hi_addr(dma_addr_t addr) 23957ac9a364SKalle Valo { 23967ac9a364SKalle Valo return (sizeof(addr) > sizeof(u32) ? (addr >> 16) >> 16 : 0) & 0xF; 23977ac9a364SKalle Valo } 23987ac9a364SKalle Valo 23997ac9a364SKalle Valo /** 24007ac9a364SKalle Valo * struct il_tfd_tb transmit buffer descriptor within transmit frame descriptor 24017ac9a364SKalle Valo * 24027ac9a364SKalle Valo * This structure contains dma address and length of transmission address 24037ac9a364SKalle Valo * 24047ac9a364SKalle Valo * @lo: low [31:0] portion of the dma address of TX buffer every even is 24057ac9a364SKalle Valo * unaligned on 16 bit boundary 24067ac9a364SKalle Valo * @hi_n_len: 0-3 [35:32] portion of dma 24077ac9a364SKalle Valo * 4-15 length of the tx buffer 24087ac9a364SKalle Valo */ 24097ac9a364SKalle Valo struct il_tfd_tb { 24107ac9a364SKalle Valo __le32 lo; 24117ac9a364SKalle Valo __le16 hi_n_len; 24127ac9a364SKalle Valo } __packed; 24137ac9a364SKalle Valo 24147ac9a364SKalle Valo /** 24157ac9a364SKalle Valo * struct il_tfd 24167ac9a364SKalle Valo * 24177ac9a364SKalle Valo * Transmit Frame Descriptor (TFD) 24187ac9a364SKalle Valo * 24197ac9a364SKalle Valo * @ __reserved1[3] reserved 24207ac9a364SKalle Valo * @ num_tbs 0-4 number of active tbs 24217ac9a364SKalle Valo * 5 reserved 24227ac9a364SKalle Valo * 6-7 padding (not used) 24237ac9a364SKalle Valo * @ tbs[20] transmit frame buffer descriptors 24247ac9a364SKalle Valo * @ __pad padding 24257ac9a364SKalle Valo * 24267ac9a364SKalle Valo * Each Tx queue uses a circular buffer of 256 TFDs stored in host DRAM. 24277ac9a364SKalle Valo * Both driver and device share these circular buffers, each of which must be 24287ac9a364SKalle Valo * contiguous 256 TFDs x 128 bytes-per-TFD = 32 KBytes 24297ac9a364SKalle Valo * 24307ac9a364SKalle Valo * Driver must indicate the physical address of the base of each 24317ac9a364SKalle Valo * circular buffer via the FH49_MEM_CBBC_QUEUE registers. 24327ac9a364SKalle Valo * 24337ac9a364SKalle Valo * Each TFD contains pointer/size information for up to 20 data buffers 24347ac9a364SKalle Valo * in host DRAM. These buffers collectively contain the (one) frame described 24357ac9a364SKalle Valo * by the TFD. Each buffer must be a single contiguous block of memory within 24367ac9a364SKalle Valo * itself, but buffers may be scattered in host DRAM. Each buffer has max size 24377ac9a364SKalle Valo * of (4K - 4). The concatenates all of a TFD's buffers into a single 24387ac9a364SKalle Valo * Tx frame, up to 8 KBytes in size. 24397ac9a364SKalle Valo * 24407ac9a364SKalle Valo * A maximum of 255 (not 256!) TFDs may be on a queue waiting for Tx. 24417ac9a364SKalle Valo */ 24427ac9a364SKalle Valo struct il_tfd { 24437ac9a364SKalle Valo u8 __reserved1[3]; 24447ac9a364SKalle Valo u8 num_tbs; 24457ac9a364SKalle Valo struct il_tfd_tb tbs[IL_NUM_OF_TBS]; 24467ac9a364SKalle Valo __le32 __pad; 24477ac9a364SKalle Valo } __packed; 24487ac9a364SKalle Valo /* PCI registers */ 24497ac9a364SKalle Valo #define PCI_CFG_RETRY_TIMEOUT 0x041 24507ac9a364SKalle Valo 24517ac9a364SKalle Valo struct il_rate_info { 24527ac9a364SKalle Valo u8 plcp; /* uCode API: RATE_6M_PLCP, etc. */ 24537ac9a364SKalle Valo u8 plcp_siso; /* uCode API: RATE_SISO_6M_PLCP, etc. */ 24547ac9a364SKalle Valo u8 plcp_mimo2; /* uCode API: RATE_MIMO2_6M_PLCP, etc. */ 24557ac9a364SKalle Valo u8 ieee; /* MAC header: RATE_6M_IEEE, etc. */ 24567ac9a364SKalle Valo u8 prev_ieee; /* previous rate in IEEE speeds */ 24577ac9a364SKalle Valo u8 next_ieee; /* next rate in IEEE speeds */ 24587ac9a364SKalle Valo u8 prev_rs; /* previous rate used in rs algo */ 24597ac9a364SKalle Valo u8 next_rs; /* next rate used in rs algo */ 24607ac9a364SKalle Valo u8 prev_rs_tgg; /* previous rate used in TGG rs algo */ 24617ac9a364SKalle Valo u8 next_rs_tgg; /* next rate used in TGG rs algo */ 24627ac9a364SKalle Valo }; 24637ac9a364SKalle Valo 24647ac9a364SKalle Valo struct il3945_rate_info { 24657ac9a364SKalle Valo u8 plcp; /* uCode API: RATE_6M_PLCP, etc. */ 24667ac9a364SKalle Valo u8 ieee; /* MAC header: RATE_6M_IEEE, etc. */ 24677ac9a364SKalle Valo u8 prev_ieee; /* previous rate in IEEE speeds */ 24687ac9a364SKalle Valo u8 next_ieee; /* next rate in IEEE speeds */ 24697ac9a364SKalle Valo u8 prev_rs; /* previous rate used in rs algo */ 24707ac9a364SKalle Valo u8 next_rs; /* next rate used in rs algo */ 24717ac9a364SKalle Valo u8 prev_rs_tgg; /* previous rate used in TGG rs algo */ 24727ac9a364SKalle Valo u8 next_rs_tgg; /* next rate used in TGG rs algo */ 24737ac9a364SKalle Valo u8 table_rs_idx; /* idx in rate scale table cmd */ 24747ac9a364SKalle Valo u8 prev_table_rs; /* prev in rate table cmd */ 24757ac9a364SKalle Valo }; 24767ac9a364SKalle Valo 24777ac9a364SKalle Valo /* 24787ac9a364SKalle Valo * These serve as idxes into 24797ac9a364SKalle Valo * struct il_rate_info il_rates[RATE_COUNT]; 24807ac9a364SKalle Valo */ 24817ac9a364SKalle Valo enum { 24827ac9a364SKalle Valo RATE_1M_IDX = 0, 24837ac9a364SKalle Valo RATE_2M_IDX, 24847ac9a364SKalle Valo RATE_5M_IDX, 24857ac9a364SKalle Valo RATE_11M_IDX, 24867ac9a364SKalle Valo RATE_6M_IDX, 24877ac9a364SKalle Valo RATE_9M_IDX, 24887ac9a364SKalle Valo RATE_12M_IDX, 24897ac9a364SKalle Valo RATE_18M_IDX, 24907ac9a364SKalle Valo RATE_24M_IDX, 24917ac9a364SKalle Valo RATE_36M_IDX, 24927ac9a364SKalle Valo RATE_48M_IDX, 24937ac9a364SKalle Valo RATE_54M_IDX, 24947ac9a364SKalle Valo RATE_60M_IDX, 24957ac9a364SKalle Valo RATE_COUNT, 24967ac9a364SKalle Valo RATE_COUNT_LEGACY = RATE_COUNT - 1, /* Excluding 60M */ 24977ac9a364SKalle Valo RATE_COUNT_3945 = RATE_COUNT - 1, 24987ac9a364SKalle Valo RATE_INVM_IDX = RATE_COUNT, 24997ac9a364SKalle Valo RATE_INVALID = RATE_COUNT, 25007ac9a364SKalle Valo }; 25017ac9a364SKalle Valo 25027ac9a364SKalle Valo enum { 25037ac9a364SKalle Valo RATE_6M_IDX_TBL = 0, 25047ac9a364SKalle Valo RATE_9M_IDX_TBL, 25057ac9a364SKalle Valo RATE_12M_IDX_TBL, 25067ac9a364SKalle Valo RATE_18M_IDX_TBL, 25077ac9a364SKalle Valo RATE_24M_IDX_TBL, 25087ac9a364SKalle Valo RATE_36M_IDX_TBL, 25097ac9a364SKalle Valo RATE_48M_IDX_TBL, 25107ac9a364SKalle Valo RATE_54M_IDX_TBL, 25117ac9a364SKalle Valo RATE_1M_IDX_TBL, 25127ac9a364SKalle Valo RATE_2M_IDX_TBL, 25137ac9a364SKalle Valo RATE_5M_IDX_TBL, 25147ac9a364SKalle Valo RATE_11M_IDX_TBL, 25157ac9a364SKalle Valo RATE_INVM_IDX_TBL = RATE_INVM_IDX - 1, 25167ac9a364SKalle Valo }; 25177ac9a364SKalle Valo 25187ac9a364SKalle Valo enum { 25197ac9a364SKalle Valo IL_FIRST_OFDM_RATE = RATE_6M_IDX, 25207ac9a364SKalle Valo IL39_LAST_OFDM_RATE = RATE_54M_IDX, 25217ac9a364SKalle Valo IL_LAST_OFDM_RATE = RATE_60M_IDX, 25227ac9a364SKalle Valo IL_FIRST_CCK_RATE = RATE_1M_IDX, 25237ac9a364SKalle Valo IL_LAST_CCK_RATE = RATE_11M_IDX, 25247ac9a364SKalle Valo }; 25257ac9a364SKalle Valo 25267ac9a364SKalle Valo /* #define vs. enum to keep from defaulting to 'large integer' */ 25277ac9a364SKalle Valo #define RATE_6M_MASK (1 << RATE_6M_IDX) 25287ac9a364SKalle Valo #define RATE_9M_MASK (1 << RATE_9M_IDX) 25297ac9a364SKalle Valo #define RATE_12M_MASK (1 << RATE_12M_IDX) 25307ac9a364SKalle Valo #define RATE_18M_MASK (1 << RATE_18M_IDX) 25317ac9a364SKalle Valo #define RATE_24M_MASK (1 << RATE_24M_IDX) 25327ac9a364SKalle Valo #define RATE_36M_MASK (1 << RATE_36M_IDX) 25337ac9a364SKalle Valo #define RATE_48M_MASK (1 << RATE_48M_IDX) 25347ac9a364SKalle Valo #define RATE_54M_MASK (1 << RATE_54M_IDX) 25357ac9a364SKalle Valo #define RATE_60M_MASK (1 << RATE_60M_IDX) 25367ac9a364SKalle Valo #define RATE_1M_MASK (1 << RATE_1M_IDX) 25377ac9a364SKalle Valo #define RATE_2M_MASK (1 << RATE_2M_IDX) 25387ac9a364SKalle Valo #define RATE_5M_MASK (1 << RATE_5M_IDX) 25397ac9a364SKalle Valo #define RATE_11M_MASK (1 << RATE_11M_IDX) 25407ac9a364SKalle Valo 25417ac9a364SKalle Valo /* uCode API values for legacy bit rates, both OFDM and CCK */ 25427ac9a364SKalle Valo enum { 25437ac9a364SKalle Valo RATE_6M_PLCP = 13, 25447ac9a364SKalle Valo RATE_9M_PLCP = 15, 25457ac9a364SKalle Valo RATE_12M_PLCP = 5, 25467ac9a364SKalle Valo RATE_18M_PLCP = 7, 25477ac9a364SKalle Valo RATE_24M_PLCP = 9, 25487ac9a364SKalle Valo RATE_36M_PLCP = 11, 25497ac9a364SKalle Valo RATE_48M_PLCP = 1, 25507ac9a364SKalle Valo RATE_54M_PLCP = 3, 25517ac9a364SKalle Valo RATE_60M_PLCP = 3, /*FIXME:RS:should be removed */ 25527ac9a364SKalle Valo RATE_1M_PLCP = 10, 25537ac9a364SKalle Valo RATE_2M_PLCP = 20, 25547ac9a364SKalle Valo RATE_5M_PLCP = 55, 25557ac9a364SKalle Valo RATE_11M_PLCP = 110, 25567ac9a364SKalle Valo /*FIXME:RS:add RATE_LEGACY_INVM_PLCP = 0, */ 25577ac9a364SKalle Valo }; 25587ac9a364SKalle Valo 25597ac9a364SKalle Valo /* uCode API values for OFDM high-throughput (HT) bit rates */ 25607ac9a364SKalle Valo enum { 25617ac9a364SKalle Valo RATE_SISO_6M_PLCP = 0, 25627ac9a364SKalle Valo RATE_SISO_12M_PLCP = 1, 25637ac9a364SKalle Valo RATE_SISO_18M_PLCP = 2, 25647ac9a364SKalle Valo RATE_SISO_24M_PLCP = 3, 25657ac9a364SKalle Valo RATE_SISO_36M_PLCP = 4, 25667ac9a364SKalle Valo RATE_SISO_48M_PLCP = 5, 25677ac9a364SKalle Valo RATE_SISO_54M_PLCP = 6, 25687ac9a364SKalle Valo RATE_SISO_60M_PLCP = 7, 25697ac9a364SKalle Valo RATE_MIMO2_6M_PLCP = 0x8, 25707ac9a364SKalle Valo RATE_MIMO2_12M_PLCP = 0x9, 25717ac9a364SKalle Valo RATE_MIMO2_18M_PLCP = 0xa, 25727ac9a364SKalle Valo RATE_MIMO2_24M_PLCP = 0xb, 25737ac9a364SKalle Valo RATE_MIMO2_36M_PLCP = 0xc, 25747ac9a364SKalle Valo RATE_MIMO2_48M_PLCP = 0xd, 25757ac9a364SKalle Valo RATE_MIMO2_54M_PLCP = 0xe, 25767ac9a364SKalle Valo RATE_MIMO2_60M_PLCP = 0xf, 25777ac9a364SKalle Valo RATE_SISO_INVM_PLCP, 25787ac9a364SKalle Valo RATE_MIMO2_INVM_PLCP = RATE_SISO_INVM_PLCP, 25797ac9a364SKalle Valo }; 25807ac9a364SKalle Valo 25817ac9a364SKalle Valo /* MAC header values for bit rates */ 25827ac9a364SKalle Valo enum { 25837ac9a364SKalle Valo RATE_6M_IEEE = 12, 25847ac9a364SKalle Valo RATE_9M_IEEE = 18, 25857ac9a364SKalle Valo RATE_12M_IEEE = 24, 25867ac9a364SKalle Valo RATE_18M_IEEE = 36, 25877ac9a364SKalle Valo RATE_24M_IEEE = 48, 25887ac9a364SKalle Valo RATE_36M_IEEE = 72, 25897ac9a364SKalle Valo RATE_48M_IEEE = 96, 25907ac9a364SKalle Valo RATE_54M_IEEE = 108, 25917ac9a364SKalle Valo RATE_60M_IEEE = 120, 25927ac9a364SKalle Valo RATE_1M_IEEE = 2, 25937ac9a364SKalle Valo RATE_2M_IEEE = 4, 25947ac9a364SKalle Valo RATE_5M_IEEE = 11, 25957ac9a364SKalle Valo RATE_11M_IEEE = 22, 25967ac9a364SKalle Valo }; 25977ac9a364SKalle Valo 25987ac9a364SKalle Valo #define IL_CCK_BASIC_RATES_MASK \ 25997ac9a364SKalle Valo (RATE_1M_MASK | \ 26007ac9a364SKalle Valo RATE_2M_MASK) 26017ac9a364SKalle Valo 26027ac9a364SKalle Valo #define IL_CCK_RATES_MASK \ 26037ac9a364SKalle Valo (IL_CCK_BASIC_RATES_MASK | \ 26047ac9a364SKalle Valo RATE_5M_MASK | \ 26057ac9a364SKalle Valo RATE_11M_MASK) 26067ac9a364SKalle Valo 26077ac9a364SKalle Valo #define IL_OFDM_BASIC_RATES_MASK \ 26087ac9a364SKalle Valo (RATE_6M_MASK | \ 26097ac9a364SKalle Valo RATE_12M_MASK | \ 26107ac9a364SKalle Valo RATE_24M_MASK) 26117ac9a364SKalle Valo 26127ac9a364SKalle Valo #define IL_OFDM_RATES_MASK \ 26137ac9a364SKalle Valo (IL_OFDM_BASIC_RATES_MASK | \ 26147ac9a364SKalle Valo RATE_9M_MASK | \ 26157ac9a364SKalle Valo RATE_18M_MASK | \ 26167ac9a364SKalle Valo RATE_36M_MASK | \ 26177ac9a364SKalle Valo RATE_48M_MASK | \ 26187ac9a364SKalle Valo RATE_54M_MASK) 26197ac9a364SKalle Valo 26207ac9a364SKalle Valo #define IL_BASIC_RATES_MASK \ 26217ac9a364SKalle Valo (IL_OFDM_BASIC_RATES_MASK | \ 26227ac9a364SKalle Valo IL_CCK_BASIC_RATES_MASK) 26237ac9a364SKalle Valo 26247ac9a364SKalle Valo #define RATES_MASK ((1 << RATE_COUNT) - 1) 26257ac9a364SKalle Valo #define RATES_MASK_3945 ((1 << RATE_COUNT_3945) - 1) 26267ac9a364SKalle Valo 26277ac9a364SKalle Valo #define IL_INVALID_VALUE -1 26287ac9a364SKalle Valo 26297ac9a364SKalle Valo #define IL_MIN_RSSI_VAL -100 26307ac9a364SKalle Valo #define IL_MAX_RSSI_VAL 0 26317ac9a364SKalle Valo 26327ac9a364SKalle Valo /* These values specify how many Tx frame attempts before 26337ac9a364SKalle Valo * searching for a new modulation mode */ 26347ac9a364SKalle Valo #define IL_LEGACY_FAILURE_LIMIT 160 26357ac9a364SKalle Valo #define IL_LEGACY_SUCCESS_LIMIT 480 26367ac9a364SKalle Valo #define IL_LEGACY_TBL_COUNT 160 26377ac9a364SKalle Valo 26387ac9a364SKalle Valo #define IL_NONE_LEGACY_FAILURE_LIMIT 400 26397ac9a364SKalle Valo #define IL_NONE_LEGACY_SUCCESS_LIMIT 4500 26407ac9a364SKalle Valo #define IL_NONE_LEGACY_TBL_COUNT 1500 26417ac9a364SKalle Valo 26427ac9a364SKalle Valo /* Success ratio (ACKed / attempted tx frames) values (perfect is 128 * 100) */ 26437ac9a364SKalle Valo #define IL_RS_GOOD_RATIO 12800 /* 100% */ 26447ac9a364SKalle Valo #define RATE_SCALE_SWITCH 10880 /* 85% */ 26457ac9a364SKalle Valo #define RATE_HIGH_TH 10880 /* 85% */ 26467ac9a364SKalle Valo #define RATE_INCREASE_TH 6400 /* 50% */ 26477ac9a364SKalle Valo #define RATE_DECREASE_TH 1920 /* 15% */ 26487ac9a364SKalle Valo 26497ac9a364SKalle Valo /* possible actions when in legacy mode */ 26507ac9a364SKalle Valo #define IL_LEGACY_SWITCH_ANTENNA1 0 26517ac9a364SKalle Valo #define IL_LEGACY_SWITCH_ANTENNA2 1 26527ac9a364SKalle Valo #define IL_LEGACY_SWITCH_SISO 2 26537ac9a364SKalle Valo #define IL_LEGACY_SWITCH_MIMO2_AB 3 26547ac9a364SKalle Valo #define IL_LEGACY_SWITCH_MIMO2_AC 4 26557ac9a364SKalle Valo #define IL_LEGACY_SWITCH_MIMO2_BC 5 26567ac9a364SKalle Valo 26577ac9a364SKalle Valo /* possible actions when in siso mode */ 26587ac9a364SKalle Valo #define IL_SISO_SWITCH_ANTENNA1 0 26597ac9a364SKalle Valo #define IL_SISO_SWITCH_ANTENNA2 1 26607ac9a364SKalle Valo #define IL_SISO_SWITCH_MIMO2_AB 2 26617ac9a364SKalle Valo #define IL_SISO_SWITCH_MIMO2_AC 3 26627ac9a364SKalle Valo #define IL_SISO_SWITCH_MIMO2_BC 4 26637ac9a364SKalle Valo #define IL_SISO_SWITCH_GI 5 26647ac9a364SKalle Valo 26657ac9a364SKalle Valo /* possible actions when in mimo mode */ 26667ac9a364SKalle Valo #define IL_MIMO2_SWITCH_ANTENNA1 0 26677ac9a364SKalle Valo #define IL_MIMO2_SWITCH_ANTENNA2 1 26687ac9a364SKalle Valo #define IL_MIMO2_SWITCH_SISO_A 2 26697ac9a364SKalle Valo #define IL_MIMO2_SWITCH_SISO_B 3 26707ac9a364SKalle Valo #define IL_MIMO2_SWITCH_SISO_C 4 26717ac9a364SKalle Valo #define IL_MIMO2_SWITCH_GI 5 26727ac9a364SKalle Valo 26737ac9a364SKalle Valo #define IL_MAX_SEARCH IL_MIMO2_SWITCH_GI 26747ac9a364SKalle Valo 26757ac9a364SKalle Valo #define IL_ACTION_LIMIT 3 /* # possible actions */ 26767ac9a364SKalle Valo 26777ac9a364SKalle Valo #define LQ_SIZE 2 /* 2 mode tables: "Active" and "Search" */ 26787ac9a364SKalle Valo 26797ac9a364SKalle Valo /* load per tid defines for A-MPDU activation */ 26807ac9a364SKalle Valo #define IL_AGG_TPT_THREHOLD 0 26817ac9a364SKalle Valo #define IL_AGG_LOAD_THRESHOLD 10 26827ac9a364SKalle Valo #define IL_AGG_ALL_TID 0xff 26837ac9a364SKalle Valo #define TID_QUEUE_CELL_SPACING 50 /*mS */ 26847ac9a364SKalle Valo #define TID_QUEUE_MAX_SIZE 20 26857ac9a364SKalle Valo #define TID_ROUND_VALUE 5 /* mS */ 26867ac9a364SKalle Valo #define TID_MAX_LOAD_COUNT 8 26877ac9a364SKalle Valo 26887ac9a364SKalle Valo #define TID_MAX_TIME_DIFF ((TID_QUEUE_MAX_SIZE - 1) * TID_QUEUE_CELL_SPACING) 26897ac9a364SKalle Valo #define TIME_WRAP_AROUND(x, y) (((y) > (x)) ? (y) - (x) : (0-(x)) + (y)) 26907ac9a364SKalle Valo 26917ac9a364SKalle Valo extern const struct il_rate_info il_rates[RATE_COUNT]; 26927ac9a364SKalle Valo 26937ac9a364SKalle Valo enum il_table_type { 26947ac9a364SKalle Valo LQ_NONE, 26957ac9a364SKalle Valo LQ_G, /* legacy types */ 26967ac9a364SKalle Valo LQ_A, 26977ac9a364SKalle Valo LQ_SISO, /* high-throughput types */ 26987ac9a364SKalle Valo LQ_MIMO2, 26997ac9a364SKalle Valo LQ_MAX, 27007ac9a364SKalle Valo }; 27017ac9a364SKalle Valo 27027ac9a364SKalle Valo #define is_legacy(tbl) ((tbl) == LQ_G || (tbl) == LQ_A) 27037ac9a364SKalle Valo #define is_siso(tbl) ((tbl) == LQ_SISO) 27047ac9a364SKalle Valo #define is_mimo2(tbl) ((tbl) == LQ_MIMO2) 27057ac9a364SKalle Valo #define is_mimo(tbl) (is_mimo2(tbl)) 27067ac9a364SKalle Valo #define is_Ht(tbl) (is_siso(tbl) || is_mimo(tbl)) 27077ac9a364SKalle Valo #define is_a_band(tbl) ((tbl) == LQ_A) 27087ac9a364SKalle Valo #define is_g_and(tbl) ((tbl) == LQ_G) 27097ac9a364SKalle Valo 27107ac9a364SKalle Valo #define ANT_NONE 0x0 27117ac9a364SKalle Valo #define ANT_A BIT(0) 27127ac9a364SKalle Valo #define ANT_B BIT(1) 27137ac9a364SKalle Valo #define ANT_AB (ANT_A | ANT_B) 27147ac9a364SKalle Valo #define ANT_C BIT(2) 27157ac9a364SKalle Valo #define ANT_AC (ANT_A | ANT_C) 27167ac9a364SKalle Valo #define ANT_BC (ANT_B | ANT_C) 27177ac9a364SKalle Valo #define ANT_ABC (ANT_AB | ANT_C) 27187ac9a364SKalle Valo 27197ac9a364SKalle Valo #define IL_MAX_MCS_DISPLAY_SIZE 12 27207ac9a364SKalle Valo 27217ac9a364SKalle Valo struct il_rate_mcs_info { 27227ac9a364SKalle Valo char mbps[IL_MAX_MCS_DISPLAY_SIZE]; 27237ac9a364SKalle Valo char mcs[IL_MAX_MCS_DISPLAY_SIZE]; 27247ac9a364SKalle Valo }; 27257ac9a364SKalle Valo 27267ac9a364SKalle Valo /** 27277ac9a364SKalle Valo * struct il_rate_scale_data -- tx success history for one rate 27287ac9a364SKalle Valo */ 27297ac9a364SKalle Valo struct il_rate_scale_data { 27307ac9a364SKalle Valo u64 data; /* bitmap of successful frames */ 27317ac9a364SKalle Valo s32 success_counter; /* number of frames successful */ 27327ac9a364SKalle Valo s32 success_ratio; /* per-cent * 128 */ 27337ac9a364SKalle Valo s32 counter; /* number of frames attempted */ 27347ac9a364SKalle Valo s32 average_tpt; /* success ratio * expected throughput */ 27357ac9a364SKalle Valo unsigned long stamp; 27367ac9a364SKalle Valo }; 27377ac9a364SKalle Valo 27387ac9a364SKalle Valo /** 27397ac9a364SKalle Valo * struct il_scale_tbl_info -- tx params and success history for all rates 27407ac9a364SKalle Valo * 27417ac9a364SKalle Valo * There are two of these in struct il_lq_sta, 27427ac9a364SKalle Valo * one for "active", and one for "search". 27437ac9a364SKalle Valo */ 27447ac9a364SKalle Valo struct il_scale_tbl_info { 27457ac9a364SKalle Valo enum il_table_type lq_type; 27467ac9a364SKalle Valo u8 ant_type; 27477ac9a364SKalle Valo u8 is_SGI; /* 1 = short guard interval */ 27487ac9a364SKalle Valo u8 is_ht40; /* 1 = 40 MHz channel width */ 27497ac9a364SKalle Valo u8 is_dup; /* 1 = duplicated data streams */ 27507ac9a364SKalle Valo u8 action; /* change modulation; IL_[LEGACY/SISO/MIMO]_SWITCH_* */ 27517ac9a364SKalle Valo u8 max_search; /* maximun number of tables we can search */ 27527ac9a364SKalle Valo s32 *expected_tpt; /* throughput metrics; expected_tpt_G, etc. */ 27537ac9a364SKalle Valo u32 current_rate; /* rate_n_flags, uCode API format */ 27547ac9a364SKalle Valo struct il_rate_scale_data win[RATE_COUNT]; /* rate histories */ 27557ac9a364SKalle Valo }; 27567ac9a364SKalle Valo 27577ac9a364SKalle Valo struct il_traffic_load { 27587ac9a364SKalle Valo unsigned long time_stamp; /* age of the oldest stats */ 27597ac9a364SKalle Valo u32 packet_count[TID_QUEUE_MAX_SIZE]; /* packet count in this time 27607ac9a364SKalle Valo * slice */ 27617ac9a364SKalle Valo u32 total; /* total num of packets during the 27627ac9a364SKalle Valo * last TID_MAX_TIME_DIFF */ 27637ac9a364SKalle Valo u8 queue_count; /* number of queues that has 27647ac9a364SKalle Valo * been used since the last cleanup */ 27657ac9a364SKalle Valo u8 head; /* start of the circular buffer */ 27667ac9a364SKalle Valo }; 27677ac9a364SKalle Valo 27687ac9a364SKalle Valo /** 27697ac9a364SKalle Valo * struct il_lq_sta -- driver's rate scaling ilate structure 27707ac9a364SKalle Valo * 27717ac9a364SKalle Valo * Pointer to this gets passed back and forth between driver and mac80211. 27727ac9a364SKalle Valo */ 27737ac9a364SKalle Valo struct il_lq_sta { 27747ac9a364SKalle Valo u8 active_tbl; /* idx of active table, range 0-1 */ 27757ac9a364SKalle Valo u8 enable_counter; /* indicates HT mode */ 27767ac9a364SKalle Valo u8 stay_in_tbl; /* 1: disallow, 0: allow search for new mode */ 27777ac9a364SKalle Valo u8 search_better_tbl; /* 1: currently trying alternate mode */ 27787ac9a364SKalle Valo s32 last_tpt; 27797ac9a364SKalle Valo 27807ac9a364SKalle Valo /* The following determine when to search for a new mode */ 27817ac9a364SKalle Valo u32 table_count_limit; 27827ac9a364SKalle Valo u32 max_failure_limit; /* # failed frames before new search */ 27837ac9a364SKalle Valo u32 max_success_limit; /* # successful frames before new search */ 27847ac9a364SKalle Valo u32 table_count; 27857ac9a364SKalle Valo u32 total_failed; /* total failed frames, any/all rates */ 27867ac9a364SKalle Valo u32 total_success; /* total successful frames, any/all rates */ 27877ac9a364SKalle Valo u64 flush_timer; /* time staying in mode before new search */ 27887ac9a364SKalle Valo 27897ac9a364SKalle Valo u8 action_counter; /* # mode-switch actions tried */ 27907ac9a364SKalle Valo u8 is_green; 27917ac9a364SKalle Valo u8 is_dup; 279257fbcce3SJohannes Berg enum nl80211_band band; 27937ac9a364SKalle Valo 27947ac9a364SKalle Valo /* The following are bitmaps of rates; RATE_6M_MASK, etc. */ 27957ac9a364SKalle Valo u32 supp_rates; 27967ac9a364SKalle Valo u16 active_legacy_rate; 27977ac9a364SKalle Valo u16 active_siso_rate; 27987ac9a364SKalle Valo u16 active_mimo2_rate; 27997ac9a364SKalle Valo s8 max_rate_idx; /* Max rate set by user */ 28007ac9a364SKalle Valo u8 missed_rate_counter; 28017ac9a364SKalle Valo 28027ac9a364SKalle Valo struct il_link_quality_cmd lq; 28037ac9a364SKalle Valo struct il_scale_tbl_info lq_info[LQ_SIZE]; /* "active", "search" */ 28047ac9a364SKalle Valo struct il_traffic_load load[TID_MAX_LOAD_COUNT]; 28057ac9a364SKalle Valo u8 tx_agg_tid_en; 28067ac9a364SKalle Valo #ifdef CONFIG_MAC80211_DEBUGFS 28077ac9a364SKalle Valo u32 dbg_fixed_rate; 28087ac9a364SKalle Valo #endif 28097ac9a364SKalle Valo struct il_priv *drv; 28107ac9a364SKalle Valo 28117ac9a364SKalle Valo /* used to be in sta_info */ 28127ac9a364SKalle Valo int last_txrate_idx; 28137ac9a364SKalle Valo /* last tx rate_n_flags */ 28147ac9a364SKalle Valo u32 last_rate_n_flags; 28157ac9a364SKalle Valo /* packets destined for this STA are aggregated */ 28167ac9a364SKalle Valo u8 is_agg; 28177ac9a364SKalle Valo }; 28187ac9a364SKalle Valo 28197ac9a364SKalle Valo /* 28207ac9a364SKalle Valo * il_station_priv: Driver's ilate station information 28217ac9a364SKalle Valo * 28227ac9a364SKalle Valo * When mac80211 creates a station it reserves some space (hw->sta_data_size) 28237ac9a364SKalle Valo * in the structure for use by driver. This structure is places in that 28247ac9a364SKalle Valo * space. 28257ac9a364SKalle Valo * 28267ac9a364SKalle Valo * The common struct MUST be first because it is shared between 28277ac9a364SKalle Valo * 3945 and 4965! 28287ac9a364SKalle Valo */ 28297ac9a364SKalle Valo struct il_station_priv { 28307ac9a364SKalle Valo struct il_station_priv_common common; 28317ac9a364SKalle Valo struct il_lq_sta lq_sta; 28327ac9a364SKalle Valo atomic_t pending_frames; 28337ac9a364SKalle Valo bool client; 28347ac9a364SKalle Valo bool asleep; 28357ac9a364SKalle Valo }; 28367ac9a364SKalle Valo 28377ac9a364SKalle Valo static inline u8 28387ac9a364SKalle Valo il4965_num_of_ant(u8 m) 28397ac9a364SKalle Valo { 28407ac9a364SKalle Valo return !!(m & ANT_A) + !!(m & ANT_B) + !!(m & ANT_C); 28417ac9a364SKalle Valo } 28427ac9a364SKalle Valo 28437ac9a364SKalle Valo static inline u8 28447ac9a364SKalle Valo il4965_first_antenna(u8 mask) 28457ac9a364SKalle Valo { 28467ac9a364SKalle Valo if (mask & ANT_A) 28477ac9a364SKalle Valo return ANT_A; 28487ac9a364SKalle Valo if (mask & ANT_B) 28497ac9a364SKalle Valo return ANT_B; 28507ac9a364SKalle Valo return ANT_C; 28517ac9a364SKalle Valo } 28527ac9a364SKalle Valo 28537ac9a364SKalle Valo /** 28547ac9a364SKalle Valo * il3945_rate_scale_init - Initialize the rate scale table based on assoc info 28557ac9a364SKalle Valo * 28567ac9a364SKalle Valo * The specific throughput table used is based on the type of network 28577ac9a364SKalle Valo * the associated with, including A, B, G, and G w/ TGG protection 28587ac9a364SKalle Valo */ 28597ac9a364SKalle Valo void il3945_rate_scale_init(struct ieee80211_hw *hw, s32 sta_id); 28607ac9a364SKalle Valo 28617ac9a364SKalle Valo /* Initialize station's rate scaling information after adding station */ 28627ac9a364SKalle Valo void il4965_rs_rate_init(struct il_priv *il, struct ieee80211_sta *sta, 28637ac9a364SKalle Valo u8 sta_id); 28647ac9a364SKalle Valo void il3945_rs_rate_init(struct il_priv *il, struct ieee80211_sta *sta, 28657ac9a364SKalle Valo u8 sta_id); 28667ac9a364SKalle Valo 28677ac9a364SKalle Valo /** 28687ac9a364SKalle Valo * il_rate_control_register - Register the rate control algorithm callbacks 28697ac9a364SKalle Valo * 28707ac9a364SKalle Valo * Since the rate control algorithm is hardware specific, there is no need 28717ac9a364SKalle Valo * or reason to place it as a stand alone module. The driver can call 28727ac9a364SKalle Valo * il_rate_control_register in order to register the rate control callbacks 28737ac9a364SKalle Valo * with the mac80211 subsystem. This should be performed prior to calling 28747ac9a364SKalle Valo * ieee80211_register_hw 28757ac9a364SKalle Valo * 28767ac9a364SKalle Valo */ 28777ac9a364SKalle Valo int il4965_rate_control_register(void); 28787ac9a364SKalle Valo int il3945_rate_control_register(void); 28797ac9a364SKalle Valo 28807ac9a364SKalle Valo /** 28817ac9a364SKalle Valo * il_rate_control_unregister - Unregister the rate control callbacks 28827ac9a364SKalle Valo * 28837ac9a364SKalle Valo * This should be called after calling ieee80211_unregister_hw, but before 28847ac9a364SKalle Valo * the driver is unloaded. 28857ac9a364SKalle Valo */ 28867ac9a364SKalle Valo void il4965_rate_control_unregister(void); 28877ac9a364SKalle Valo void il3945_rate_control_unregister(void); 28887ac9a364SKalle Valo 28897ac9a364SKalle Valo int il_power_update_mode(struct il_priv *il, bool force); 28907ac9a364SKalle Valo void il_power_initialize(struct il_priv *il); 28917ac9a364SKalle Valo 28927ac9a364SKalle Valo extern u32 il_debug_level; 28937ac9a364SKalle Valo 28947ac9a364SKalle Valo #ifdef CONFIG_IWLEGACY_DEBUG 28957ac9a364SKalle Valo /* 28967ac9a364SKalle Valo * il_get_debug_level: Return active debug level for device 28977ac9a364SKalle Valo * 28987ac9a364SKalle Valo * Using sysfs it is possible to set per device debug level. This debug 28997ac9a364SKalle Valo * level will be used if set, otherwise the global debug level which can be 29007ac9a364SKalle Valo * set via module parameter is used. 29017ac9a364SKalle Valo */ 29027ac9a364SKalle Valo static inline u32 29037ac9a364SKalle Valo il_get_debug_level(struct il_priv *il) 29047ac9a364SKalle Valo { 29057ac9a364SKalle Valo if (il->debug_level) 29067ac9a364SKalle Valo return il->debug_level; 29077ac9a364SKalle Valo else 29087ac9a364SKalle Valo return il_debug_level; 29097ac9a364SKalle Valo } 29107ac9a364SKalle Valo #else 29117ac9a364SKalle Valo static inline u32 29127ac9a364SKalle Valo il_get_debug_level(struct il_priv *il) 29137ac9a364SKalle Valo { 29147ac9a364SKalle Valo return il_debug_level; 29157ac9a364SKalle Valo } 29167ac9a364SKalle Valo #endif 29177ac9a364SKalle Valo 29187ac9a364SKalle Valo #define il_print_hex_error(il, p, len) \ 29197ac9a364SKalle Valo do { \ 29207ac9a364SKalle Valo print_hex_dump(KERN_ERR, "iwl data: ", \ 29217ac9a364SKalle Valo DUMP_PREFIX_OFFSET, 16, 1, p, len, 1); \ 29227ac9a364SKalle Valo } while (0) 29237ac9a364SKalle Valo 29247ac9a364SKalle Valo #ifdef CONFIG_IWLEGACY_DEBUG 29257ac9a364SKalle Valo #define IL_DBG(level, fmt, args...) \ 29267ac9a364SKalle Valo do { \ 29277ac9a364SKalle Valo if (il_get_debug_level(il) & level) \ 2928*e4ff7d6bSSebastian Andrzej Siewior dev_err(&il->hw->wiphy->dev, "%s " fmt, __func__, \ 2929*e4ff7d6bSSebastian Andrzej Siewior ##args); \ 29307ac9a364SKalle Valo } while (0) 29317ac9a364SKalle Valo 29327ac9a364SKalle Valo #define il_print_hex_dump(il, level, p, len) \ 29337ac9a364SKalle Valo do { \ 29347ac9a364SKalle Valo if (il_get_debug_level(il) & level) \ 29357ac9a364SKalle Valo print_hex_dump(KERN_DEBUG, "iwl data: ", \ 29367ac9a364SKalle Valo DUMP_PREFIX_OFFSET, 16, 1, p, len, 1); \ 29377ac9a364SKalle Valo } while (0) 29387ac9a364SKalle Valo 29397ac9a364SKalle Valo #else 29407ac9a364SKalle Valo #define IL_DBG(level, fmt, args...) 29417ac9a364SKalle Valo static inline void 29427ac9a364SKalle Valo il_print_hex_dump(struct il_priv *il, int level, const void *p, u32 len) 29437ac9a364SKalle Valo { 29447ac9a364SKalle Valo } 29457ac9a364SKalle Valo #endif /* CONFIG_IWLEGACY_DEBUG */ 29467ac9a364SKalle Valo 29477ac9a364SKalle Valo #ifdef CONFIG_IWLEGACY_DEBUGFS 294871ee1284SGreg Kroah-Hartman void il_dbgfs_register(struct il_priv *il, const char *name); 29497ac9a364SKalle Valo void il_dbgfs_unregister(struct il_priv *il); 29507ac9a364SKalle Valo #else 295171ee1284SGreg Kroah-Hartman static inline void il_dbgfs_register(struct il_priv *il, const char *name) 29527ac9a364SKalle Valo { 29537ac9a364SKalle Valo } 29547ac9a364SKalle Valo 29557ac9a364SKalle Valo static inline void 29567ac9a364SKalle Valo il_dbgfs_unregister(struct il_priv *il) 29577ac9a364SKalle Valo { 29587ac9a364SKalle Valo } 29597ac9a364SKalle Valo #endif /* CONFIG_IWLEGACY_DEBUGFS */ 29607ac9a364SKalle Valo 29617ac9a364SKalle Valo /* 29627ac9a364SKalle Valo * To use the debug system: 29637ac9a364SKalle Valo * 29647ac9a364SKalle Valo * If you are defining a new debug classification, simply add it to the #define 29657ac9a364SKalle Valo * list here in the form of 29667ac9a364SKalle Valo * 29677ac9a364SKalle Valo * #define IL_DL_xxxx VALUE 29687ac9a364SKalle Valo * 29697ac9a364SKalle Valo * where xxxx should be the name of the classification (for example, WEP). 29707ac9a364SKalle Valo * 29717ac9a364SKalle Valo * You then need to either add a IL_xxxx_DEBUG() macro definition for your 29727ac9a364SKalle Valo * classification, or use IL_DBG(IL_DL_xxxx, ...) whenever you want 29737ac9a364SKalle Valo * to send output to that classification. 29747ac9a364SKalle Valo * 29757ac9a364SKalle Valo * The active debug levels can be accessed via files 29767ac9a364SKalle Valo * 29777ac9a364SKalle Valo * /sys/module/iwl4965/parameters/debug 29787ac9a364SKalle Valo * /sys/module/iwl3945/parameters/debug 29797ac9a364SKalle Valo * /sys/class/net/wlan0/device/debug_level 29807ac9a364SKalle Valo * 29817ac9a364SKalle Valo * when CONFIG_IWLEGACY_DEBUG=y. 29827ac9a364SKalle Valo */ 29837ac9a364SKalle Valo 29847ac9a364SKalle Valo /* 0x0000000F - 0x00000001 */ 29857ac9a364SKalle Valo #define IL_DL_INFO (1 << 0) 29867ac9a364SKalle Valo #define IL_DL_MAC80211 (1 << 1) 29877ac9a364SKalle Valo #define IL_DL_HCMD (1 << 2) 29887ac9a364SKalle Valo #define IL_DL_STATE (1 << 3) 29897ac9a364SKalle Valo /* 0x000000F0 - 0x00000010 */ 29907ac9a364SKalle Valo #define IL_DL_MACDUMP (1 << 4) 29917ac9a364SKalle Valo #define IL_DL_HCMD_DUMP (1 << 5) 29927ac9a364SKalle Valo #define IL_DL_EEPROM (1 << 6) 29937ac9a364SKalle Valo #define IL_DL_RADIO (1 << 7) 29947ac9a364SKalle Valo /* 0x00000F00 - 0x00000100 */ 29957ac9a364SKalle Valo #define IL_DL_POWER (1 << 8) 29967ac9a364SKalle Valo #define IL_DL_TEMP (1 << 9) 29977ac9a364SKalle Valo #define IL_DL_NOTIF (1 << 10) 29987ac9a364SKalle Valo #define IL_DL_SCAN (1 << 11) 29997ac9a364SKalle Valo /* 0x0000F000 - 0x00001000 */ 30007ac9a364SKalle Valo #define IL_DL_ASSOC (1 << 12) 30017ac9a364SKalle Valo #define IL_DL_DROP (1 << 13) 30027ac9a364SKalle Valo #define IL_DL_TXPOWER (1 << 14) 30037ac9a364SKalle Valo #define IL_DL_AP (1 << 15) 30047ac9a364SKalle Valo /* 0x000F0000 - 0x00010000 */ 30057ac9a364SKalle Valo #define IL_DL_FW (1 << 16) 30067ac9a364SKalle Valo #define IL_DL_RF_KILL (1 << 17) 30077ac9a364SKalle Valo #define IL_DL_FW_ERRORS (1 << 18) 30087ac9a364SKalle Valo #define IL_DL_LED (1 << 19) 30097ac9a364SKalle Valo /* 0x00F00000 - 0x00100000 */ 30107ac9a364SKalle Valo #define IL_DL_RATE (1 << 20) 30117ac9a364SKalle Valo #define IL_DL_CALIB (1 << 21) 30127ac9a364SKalle Valo #define IL_DL_WEP (1 << 22) 30137ac9a364SKalle Valo #define IL_DL_TX (1 << 23) 30147ac9a364SKalle Valo /* 0x0F000000 - 0x01000000 */ 30157ac9a364SKalle Valo #define IL_DL_RX (1 << 24) 30167ac9a364SKalle Valo #define IL_DL_ISR (1 << 25) 30177ac9a364SKalle Valo #define IL_DL_HT (1 << 26) 30187ac9a364SKalle Valo /* 0xF0000000 - 0x10000000 */ 30197ac9a364SKalle Valo #define IL_DL_11H (1 << 28) 30207ac9a364SKalle Valo #define IL_DL_STATS (1 << 29) 30217ac9a364SKalle Valo #define IL_DL_TX_REPLY (1 << 30) 30227ac9a364SKalle Valo #define IL_DL_QOS (1 << 31) 30237ac9a364SKalle Valo 30247ac9a364SKalle Valo #define D_INFO(f, a...) IL_DBG(IL_DL_INFO, f, ## a) 30257ac9a364SKalle Valo #define D_MAC80211(f, a...) IL_DBG(IL_DL_MAC80211, f, ## a) 30267ac9a364SKalle Valo #define D_MACDUMP(f, a...) IL_DBG(IL_DL_MACDUMP, f, ## a) 30277ac9a364SKalle Valo #define D_TEMP(f, a...) IL_DBG(IL_DL_TEMP, f, ## a) 30287ac9a364SKalle Valo #define D_SCAN(f, a...) IL_DBG(IL_DL_SCAN, f, ## a) 30297ac9a364SKalle Valo #define D_RX(f, a...) IL_DBG(IL_DL_RX, f, ## a) 30307ac9a364SKalle Valo #define D_TX(f, a...) IL_DBG(IL_DL_TX, f, ## a) 30317ac9a364SKalle Valo #define D_ISR(f, a...) IL_DBG(IL_DL_ISR, f, ## a) 30327ac9a364SKalle Valo #define D_LED(f, a...) IL_DBG(IL_DL_LED, f, ## a) 30337ac9a364SKalle Valo #define D_WEP(f, a...) IL_DBG(IL_DL_WEP, f, ## a) 30347ac9a364SKalle Valo #define D_HC(f, a...) IL_DBG(IL_DL_HCMD, f, ## a) 30357ac9a364SKalle Valo #define D_HC_DUMP(f, a...) IL_DBG(IL_DL_HCMD_DUMP, f, ## a) 30367ac9a364SKalle Valo #define D_EEPROM(f, a...) IL_DBG(IL_DL_EEPROM, f, ## a) 30377ac9a364SKalle Valo #define D_CALIB(f, a...) IL_DBG(IL_DL_CALIB, f, ## a) 30387ac9a364SKalle Valo #define D_FW(f, a...) IL_DBG(IL_DL_FW, f, ## a) 30397ac9a364SKalle Valo #define D_RF_KILL(f, a...) IL_DBG(IL_DL_RF_KILL, f, ## a) 30407ac9a364SKalle Valo #define D_DROP(f, a...) IL_DBG(IL_DL_DROP, f, ## a) 30417ac9a364SKalle Valo #define D_AP(f, a...) IL_DBG(IL_DL_AP, f, ## a) 30427ac9a364SKalle Valo #define D_TXPOWER(f, a...) IL_DBG(IL_DL_TXPOWER, f, ## a) 30437ac9a364SKalle Valo #define D_RATE(f, a...) IL_DBG(IL_DL_RATE, f, ## a) 30447ac9a364SKalle Valo #define D_NOTIF(f, a...) IL_DBG(IL_DL_NOTIF, f, ## a) 30457ac9a364SKalle Valo #define D_ASSOC(f, a...) IL_DBG(IL_DL_ASSOC, f, ## a) 30467ac9a364SKalle Valo #define D_HT(f, a...) IL_DBG(IL_DL_HT, f, ## a) 30477ac9a364SKalle Valo #define D_STATS(f, a...) IL_DBG(IL_DL_STATS, f, ## a) 30487ac9a364SKalle Valo #define D_TX_REPLY(f, a...) IL_DBG(IL_DL_TX_REPLY, f, ## a) 30497ac9a364SKalle Valo #define D_QOS(f, a...) IL_DBG(IL_DL_QOS, f, ## a) 30507ac9a364SKalle Valo #define D_RADIO(f, a...) IL_DBG(IL_DL_RADIO, f, ## a) 30517ac9a364SKalle Valo #define D_POWER(f, a...) IL_DBG(IL_DL_POWER, f, ## a) 30527ac9a364SKalle Valo #define D_11H(f, a...) IL_DBG(IL_DL_11H, f, ## a) 30537ac9a364SKalle Valo 30547ac9a364SKalle Valo #endif /* __il_core_h__ */ 3055