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