1be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy/****************************************************************************** 2be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy * 3e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * Copyright(c) 2003 - 2011 Intel Corporation. All rights reserved. 4be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy * 5e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * This program is free software; you can redistribute it and/or modify it 6e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * under the terms of version 2 of the GNU General Public License as 7be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy * published by the Free Software Foundation. 8be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy * 9e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * This program is distributed in the hope that it will be useful, but WITHOUT 10e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 12e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * more details. 13be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy * 14e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * You should have received a copy of the GNU General Public License along with 15e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * this program; if not, write to the Free Software Foundation, Inc., 16e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA 17be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy * 18e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * The full GNU General Public License is included in this distribution in the 19e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * file called LICENSE. 20be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy * 21be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy * Contact Information: 22be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy * Intel Linux Wireless <ilw@linux.intel.com> 23be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 24be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy * 25e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka *****************************************************************************/ 26e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#ifndef __il_core_h__ 27e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define __il_core_h__ 28e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 29e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#include <linux/interrupt.h> 30e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka#include <linux/pci.h> /* for struct pci_device_id */ 31e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#include <linux/kernel.h> 32e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#include <linux/leds.h> 33e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#include <linux/wait.h> 3417d4eca6432bb1d4753d7894b824271673a1640aStanislaw Gruszka#include <linux/io.h> 3547ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka#include <net/mac80211.h> 36e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#include <net/ieee80211_radiotap.h> 37e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 3899412002a07b63781adfc3d1272d3677841d4170Stanislaw Gruszka#include "commands.h" 39e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#include "csr.h" 40e8c39d4e62a01c21330bcccd7989c9c8deac4271Stanislaw Gruszka#include "prph.h" 41e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 42e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkastruct il_host_cmd; 43e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkastruct il_cmd; 44e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkastruct il_tx_queue; 45e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 46f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define IL_ERR(f, a...) dev_err(&il->pci_dev->dev, f, ## a) 47f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define IL_WARN(f, a...) dev_warn(&il->pci_dev->dev, f, ## a) 48f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define IL_INFO(f, a...) dev_info(&il->pci_dev->dev, f, ## a) 49f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka 50e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define RX_QUEUE_SIZE 256 51e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define RX_QUEUE_MASK 255 52e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define RX_QUEUE_SIZE_LOG 8 53e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 54e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka/* 55e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * RX related structures and functions 56e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka */ 57e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define RX_FREE_BUFFERS 64 58e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define RX_LOW_WATERMARK 8 59e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 60e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define U32_PAD(n) ((4-(n))&0x3) 61e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 62e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka/* CT-KILL constants */ 63e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka#define CT_KILL_THRESHOLD_LEGACY 110 /* in Celsius */ 64e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 65e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka/* Default noise level to report when noise measurement is not available. 66e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * This may be because we're: 67e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * 1) Not associated (4965, no beacon stats being sent to driver) 68e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * 2) Scanning (noise measurement does not apply to associated channel) 69e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * 3) Receiving CCK (3945 delivers noise info only for OFDM frames) 70e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * Use default noise value of -127 ... this is below the range of measurable 71e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * Rx dBm for either 3945 or 4965, so it can indicate "unmeasurable" to user. 72e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * Also, -127 works better than 0 when averaging frames with/without 73e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * noise info (e.g. averaging might be done in app); measured dBm values are 74e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * always negative ... using a negative value as the default keeps all 75e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * averages within an s8's (used in some apps) range of negative values. */ 76e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define IL_NOISE_MEAS_NOT_AVAILABLE (-127) 77e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 78e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka/* 79e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * RTS threshold here is total size [2347] minus 4 FCS bytes 80e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * Per spec: 81e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * a value of 0 means RTS on all data/management packets 82e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * a value > max MSDU size means no RTS 83e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * else RTS for data/management frames where MPDU is larger 84e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * than RTS value. 85e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka */ 86e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define DEFAULT_RTS_THRESHOLD 2347U 87e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define MIN_RTS_THRESHOLD 0U 88e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define MAX_RTS_THRESHOLD 2347U 89e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define MAX_MSDU_SIZE 2304U 90e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define MAX_MPDU_SIZE 2346U 91e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define DEFAULT_BEACON_INTERVAL 100U 92e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define DEFAULT_SHORT_RETRY_LIMIT 7U 93e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define DEFAULT_LONG_RETRY_LIMIT 4U 94e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 95e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkastruct il_rx_buf { 96e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka dma_addr_t page_dma; 97e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct page *page; 98e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct list_head list; 99e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka}; 100e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 101e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define rxb_addr(r) page_address(r->page) 102e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 103e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka/* defined below */ 104e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkastruct il_device_cmd; 105e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 106e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkastruct il_cmd_meta { 107e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka /* only for SYNC commands, iff the reply skb is wanted */ 108e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct il_host_cmd *source; 109e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka /* 110e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * only for ASYNC commands 111e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * (which is somewhat stupid -- look at common.c for instance 112e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * which duplicates a bunch of code because the callback isn't 113e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * invoked for SYNC commands, if it were and its result passed 114e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * through it would be simpler...) 115e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka */ 1161722f8e12a9c6117d872bd19ec5919460ccdfb4eStanislaw Gruszka void (*callback) (struct il_priv *il, struct il_device_cmd *cmd, 1171722f8e12a9c6117d872bd19ec5919460ccdfb4eStanislaw Gruszka struct il_rx_pkt *pkt); 118e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 119e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka /* The CMD_SIZE_HUGE flag bit indicates that the command 120e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * structure is stored at the end of the shared queue memory. */ 121e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 flags; 122e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 123e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka DEFINE_DMA_UNMAP_ADDR(mapping); 124e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka DEFINE_DMA_UNMAP_LEN(len); 125e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka}; 126e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 127e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka/* 128e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * Generic queue structure 129e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * 130e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * Contains common data for Rx and Tx queues 131e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka */ 132e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkastruct il_queue { 133e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka int n_bd; /* number of BDs in this queue */ 134e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka int write_ptr; /* 1-st empty entry (idx) host_w */ 135e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka int read_ptr; /* last used entry (idx) host_r */ 136e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka /* use for monitoring and recovering the stuck queue */ 137e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka dma_addr_t dma_addr; /* physical addr for BD's */ 138e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka int n_win; /* safe queue win */ 139e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 id; 140e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka int low_mark; /* low watermark, resume queue if free 141e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka * space more than this */ 142e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka int high_mark; /* high watermark, stop queue if free 143e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka * space less than this */ 144e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka}; 145e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 146e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka/** 147e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * struct il_tx_queue - Tx Queue for DMA 148e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @q: generic Rx/Tx queue descriptor 149e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @bd: base of circular buffer of TFDs 150e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @cmd: array of command/TX buffer pointers 151e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @meta: array of meta data for each command/tx buffer 152e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @dma_addr_cmd: physical address of cmd/tx buffer array 15300ea99e1d86b05e7ba90d66673b536b731af87cdStanislaw Gruszka * @skbs: array of per-TFD socket buffer pointers 154e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @time_stamp: time (in jiffies) of last read_ptr change 155e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @need_update: indicates need to update read/write idx 156e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @sched_retry: indicates queue is high-throughput aggregation (HT AGG) enabled 157e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * 158e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * A Tx queue consists of circular buffer of BDs (a.k.a. TFDs, transmit frame 159e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * descriptors) and required locking structures. 160e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka */ 161e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define TFD_TX_CMD_SLOTS 256 162e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define TFD_CMD_SLOTS 32 163e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 164e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkastruct il_tx_queue { 165e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct il_queue q; 166e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka void *tfds; 167e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct il_device_cmd **cmd; 168e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct il_cmd_meta *meta; 16900ea99e1d86b05e7ba90d66673b536b731af87cdStanislaw Gruszka struct sk_buff **skbs; 170e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka unsigned long time_stamp; 171e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u8 need_update; 172e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u8 sched_retry; 173e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u8 active; 174e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u8 swq_id; 175e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka}; 176e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 17747ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka/* 17847ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * EEPROM access time values: 17947ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * 18047ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * Driver initiates EEPROM read by writing byte address << 1 to CSR_EEPROM_REG. 18147ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * Driver then polls CSR_EEPROM_REG for CSR_EEPROM_REG_READ_VALID_MSK (0x1). 18247ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * When polling, wait 10 uSec between polling loops, up to a maximum 5000 uSec. 18347ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * Driver reads 16-bit value from bits 31-16 of CSR_EEPROM_REG. 18447ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka */ 185e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka#define IL_EEPROM_ACCESS_TIMEOUT 5000 /* uSec */ 18647ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka 187e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka#define IL_EEPROM_SEM_TIMEOUT 10 /* microseconds */ 188e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka#define IL_EEPROM_SEM_RETRY_LIMIT 1000 /* number of attempts (not time) */ 18947ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka 19047ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka/* 19147ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * Regulatory channel usage flags in EEPROM struct il4965_eeprom_channel.flags. 19247ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * 19347ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * IBSS and/or AP operation is allowed *only* on those channels with 19447ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * (VALID && IBSS && ACTIVE && !RADAR). This restriction is in place because 19547ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * RADAR detection is not supported by the 4965 driver, but is a 19647ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * requirement for establishing a new network for legal operation on channels 19747ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * requiring RADAR detection or restricting ACTIVE scanning. 19847ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * 19947ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * NOTE: "WIDE" flag does not indicate anything about "HT40" 40 MHz channels. 20047ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * It only indicates that 20 MHz channel use is supported; HT40 channel 20147ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * usage is indicated by a separate set of regulatory flags for each 20247ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * HT40 channel pair. 20347ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * 20447ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * NOTE: Using a channel inappropriately will result in a uCode error! 20547ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka */ 20647ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka#define IL_NUM_TX_CALIB_GROUPS 5 20747ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszkaenum { 20847ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka EEPROM_CHANNEL_VALID = (1 << 0), /* usable for this SKU/geo */ 209e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka EEPROM_CHANNEL_IBSS = (1 << 1), /* usable as an IBSS channel */ 21047ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka /* Bit 2 Reserved */ 21147ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka EEPROM_CHANNEL_ACTIVE = (1 << 3), /* active scanning allowed */ 21247ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka EEPROM_CHANNEL_RADAR = (1 << 4), /* radar detection required */ 213e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka EEPROM_CHANNEL_WIDE = (1 << 5), /* 20 MHz channel okay */ 21447ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka /* Bit 6 Reserved (was Narrow Channel) */ 21547ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka EEPROM_CHANNEL_DFS = (1 << 7), /* dynamic freq selection candidate */ 21647ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka}; 21747ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka 21847ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka/* SKU Capabilities */ 21947ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka/* 3945 only */ 22047ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka#define EEPROM_SKU_CAP_SW_RF_KILL_ENABLE (1 << 0) 22147ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka#define EEPROM_SKU_CAP_HW_RF_KILL_ENABLE (1 << 1) 22247ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka 22347ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka/* *regulatory* channel data format in eeprom, one for each channel. 22447ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * There are separate entries for HT40 (40 MHz) vs. normal (20 MHz) channels. */ 22547ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszkastruct il_eeprom_channel { 22647ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka u8 flags; /* EEPROM_CHANNEL_* flags copied from EEPROM */ 22747ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka s8 max_power_avg; /* max power (dBm) on this chnl, limit 31 */ 22847ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka} __packed; 22947ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka 23047ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka/* 3945 Specific */ 23147ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka#define EEPROM_3945_EEPROM_VERSION (0x2f) 23247ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka 23347ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka/* 4965 has two radio transmitters (and 3 radio receivers) */ 23447ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka#define EEPROM_TX_POWER_TX_CHAINS (2) 23547ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka 23647ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka/* 4965 has room for up to 8 sets of txpower calibration data */ 23747ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka#define EEPROM_TX_POWER_BANDS (8) 23847ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka 23947ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka/* 4965 factory calibration measures txpower gain settings for 24047ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * each of 3 target output levels */ 24147ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka#define EEPROM_TX_POWER_MEASUREMENTS (3) 24247ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka 24347ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka/* 4965 Specific */ 24447ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka/* 4965 driver does not work with txpower calibration version < 5 */ 24547ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka#define EEPROM_4965_TX_POWER_VERSION (5) 24647ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka#define EEPROM_4965_EEPROM_VERSION (0x2f) 247e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka#define EEPROM_4965_CALIB_VERSION_OFFSET (2*0xB6) /* 2 bytes */ 248e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka#define EEPROM_4965_CALIB_TXPOWER_OFFSET (2*0xE8) /* 48 bytes */ 249e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka#define EEPROM_4965_BOARD_REVISION (2*0x4F) /* 2 bytes */ 250e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka#define EEPROM_4965_BOARD_PBA (2*0x56+1) /* 9 bytes */ 25147ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka 25247ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka/* 2.4 GHz */ 25347ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszkaextern const u8 il_eeprom_band_1[14]; 25447ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka 25547ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka/* 25647ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * factory calibration data for one txpower level, on one channel, 25747ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * measured on one of the 2 tx chains (radio transmitter and associated 25847ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * antenna). EEPROM contains: 25947ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * 26047ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * 1) Temperature (degrees Celsius) of device when measurement was made. 26147ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * 26247ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * 2) Gain table idx used to achieve the target measurement power. 26347ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * This refers to the "well-known" gain tables (see 4965.h). 26447ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * 26547ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * 3) Actual measured output power, in half-dBm ("34" = 17 dBm). 26647ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * 26747ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * 4) RF power amplifier detector level measurement (not used). 26847ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka */ 26947ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszkastruct il_eeprom_calib_measure { 27047ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka u8 temperature; /* Device temperature (Celsius) */ 27147ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka u8 gain_idx; /* Index into gain table */ 27247ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka u8 actual_pow; /* Measured RF output power, half-dBm */ 27347ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka s8 pa_det; /* Power amp detector level (not used) */ 27447ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka} __packed; 27547ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka 27647ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka/* 27747ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * measurement set for one channel. EEPROM contains: 27847ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * 27947ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * 1) Channel number measured 28047ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * 28147ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * 2) Measurements for each of 3 power levels for each of 2 radio transmitters 28247ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * (a.k.a. "tx chains") (6 measurements altogether) 28347ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka */ 28447ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszkastruct il_eeprom_calib_ch_info { 28547ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka u8 ch_num; 28647ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka struct il_eeprom_calib_measure 287e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka measurements[EEPROM_TX_POWER_TX_CHAINS] 288e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka [EEPROM_TX_POWER_MEASUREMENTS]; 28947ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka} __packed; 29047ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka 29147ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka/* 29247ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * txpower subband info. 29347ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * 29447ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * For each frequency subband, EEPROM contains the following: 29547ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * 29647ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * 1) First and last channels within range of the subband. "0" values 29747ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * indicate that this sample set is not being used. 29847ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * 29947ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * 2) Sample measurement sets for 2 channels close to the range endpoints. 30047ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka */ 30147ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszkastruct il_eeprom_calib_subband_info { 302e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u8 ch_from; /* channel number of lowest channel in subband */ 303e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u8 ch_to; /* channel number of highest channel in subband */ 30447ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka struct il_eeprom_calib_ch_info ch1; 30547ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka struct il_eeprom_calib_ch_info ch2; 30647ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka} __packed; 30747ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka 30847ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka/* 30947ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * txpower calibration info. EEPROM contains: 31047ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * 31147ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * 1) Factory-measured saturation power levels (maximum levels at which 31247ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * tx power amplifier can output a signal without too much distortion). 31347ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * There is one level for 2.4 GHz band and one for 5 GHz band. These 31447ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * values apply to all channels within each of the bands. 31547ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * 31647ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * 2) Factory-measured power supply voltage level. This is assumed to be 31747ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * constant (i.e. same value applies to all channels/bands) while the 31847ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * factory measurements are being made. 31947ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * 32047ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * 3) Up to 8 sets of factory-measured txpower calibration values. 32147ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * These are for different frequency ranges, since txpower gain 32247ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * characteristics of the analog radio circuitry vary with frequency. 32347ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * 32447ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * Not all sets need to be filled with data; 32547ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * struct il_eeprom_calib_subband_info contains range of channels 32647ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * (0 if unused) for each set of data. 32747ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka */ 32847ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszkastruct il_eeprom_calib_info { 32947ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka u8 saturation_power24; /* half-dBm (e.g. "34" = 17 dBm) */ 33047ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka u8 saturation_power52; /* half-dBm */ 33147ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka __le16 voltage; /* signed */ 332e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka struct il_eeprom_calib_subband_info band_info[EEPROM_TX_POWER_BANDS]; 33347ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka} __packed; 33447ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka 33547ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka/* General */ 33647ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka#define EEPROM_DEVICE_ID (2*0x08) /* 2 bytes */ 33747ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka#define EEPROM_MAC_ADDRESS (2*0x15) /* 6 bytes */ 33847ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka#define EEPROM_BOARD_REVISION (2*0x35) /* 2 bytes */ 33947ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka#define EEPROM_BOARD_PBA_NUMBER (2*0x3B+1) /* 9 bytes */ 34047ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka#define EEPROM_VERSION (2*0x44) /* 2 bytes */ 34147ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka#define EEPROM_SKU_CAP (2*0x45) /* 2 bytes */ 34247ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka#define EEPROM_OEM_MODE (2*0x46) /* 2 bytes */ 34347ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka#define EEPROM_WOWLAN_MODE (2*0x47) /* 2 bytes */ 34447ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka#define EEPROM_RADIO_CONFIG (2*0x48) /* 2 bytes */ 34547ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka#define EEPROM_NUM_MAC_ADDRESS (2*0x4C) /* 2 bytes */ 34647ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka 34747ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka/* The following masks are to be applied on EEPROM_RADIO_CONFIG */ 348e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka#define EEPROM_RF_CFG_TYPE_MSK(x) (x & 0x3) /* bits 0-1 */ 349e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka#define EEPROM_RF_CFG_STEP_MSK(x) ((x >> 2) & 0x3) /* bits 2-3 */ 350e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka#define EEPROM_RF_CFG_DASH_MSK(x) ((x >> 4) & 0x3) /* bits 4-5 */ 351e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka#define EEPROM_RF_CFG_PNUM_MSK(x) ((x >> 6) & 0x3) /* bits 6-7 */ 352e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka#define EEPROM_RF_CFG_TX_ANT_MSK(x) ((x >> 8) & 0xF) /* bits 8-11 */ 353e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka#define EEPROM_RF_CFG_RX_ANT_MSK(x) ((x >> 12) & 0xF) /* bits 12-15 */ 35447ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka 35547ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka#define EEPROM_3945_RF_CFG_TYPE_MAX 0x0 35647ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka#define EEPROM_4965_RF_CFG_TYPE_MAX 0x1 35747ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka 35847ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka/* 35947ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * Per-channel regulatory data. 36047ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * 36147ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * Each channel that *might* be supported by iwl has a fixed location 36247ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * in EEPROM containing EEPROM_CHANNEL_* usage flags (LSB) and max regulatory 36347ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * txpower (MSB). 36447ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * 36547ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * Entries immediately below are for 20 MHz channel width. HT40 (40 MHz) 36647ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * channels (only for 4965, not supported by 3945) appear later in the EEPROM. 36747ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * 36847ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * 2.4 GHz channels 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 36947ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka */ 370e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka#define EEPROM_REGULATORY_SKU_ID (2*0x60) /* 4 bytes */ 37147ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka#define EEPROM_REGULATORY_BAND_1 (2*0x62) /* 2 bytes */ 37247ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka#define EEPROM_REGULATORY_BAND_1_CHANNELS (2*0x63) /* 28 bytes */ 37347ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka 37447ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka/* 37547ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * 4.9 GHz channels 183, 184, 185, 187, 188, 189, 192, 196, 37647ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * 5.0 GHz channels 7, 8, 11, 12, 16 37747ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * (4915-5080MHz) (none of these is ever supported) 37847ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka */ 37947ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka#define EEPROM_REGULATORY_BAND_2 (2*0x71) /* 2 bytes */ 38047ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka#define EEPROM_REGULATORY_BAND_2_CHANNELS (2*0x72) /* 26 bytes */ 38147ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka 38247ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka/* 38347ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * 5.2 GHz channels 34, 36, 38, 40, 42, 44, 46, 48, 52, 56, 60, 64 38447ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * (5170-5320MHz) 38547ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka */ 38647ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka#define EEPROM_REGULATORY_BAND_3 (2*0x7F) /* 2 bytes */ 38747ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka#define EEPROM_REGULATORY_BAND_3_CHANNELS (2*0x80) /* 24 bytes */ 38847ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka 38947ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka/* 39047ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * 5.5 GHz channels 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140 39147ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * (5500-5700MHz) 39247ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka */ 39347ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka#define EEPROM_REGULATORY_BAND_4 (2*0x8C) /* 2 bytes */ 39447ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka#define EEPROM_REGULATORY_BAND_4_CHANNELS (2*0x8D) /* 22 bytes */ 39547ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka 39647ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka/* 39747ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * 5.7 GHz channels 145, 149, 153, 157, 161, 165 39847ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * (5725-5825MHz) 39947ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka */ 40047ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka#define EEPROM_REGULATORY_BAND_5 (2*0x98) /* 2 bytes */ 40147ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka#define EEPROM_REGULATORY_BAND_5_CHANNELS (2*0x99) /* 12 bytes */ 40247ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka 40347ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka/* 40447ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * 2.4 GHz HT40 channels 1 (5), 2 (6), 3 (7), 4 (8), 5 (9), 6 (10), 7 (11) 40547ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * 40647ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * The channel listed is the center of the lower 20 MHz half of the channel. 40747ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * The overall center frequency is actually 2 channels (10 MHz) above that, 40847ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * and the upper half of each HT40 channel is centered 4 channels (20 MHz) away 40947ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * from the lower half; e.g. the upper half of HT40 channel 1 is channel 5, 41047ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * and the overall HT40 channel width centers on channel 3. 41147ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * 41247ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * NOTE: The RXON command uses 20 MHz channel numbers to specify the 41347ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * control channel to which to tune. RXON also specifies whether the 41447ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * control channel is the upper or lower half of a HT40 channel. 41547ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * 41647ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * NOTE: 4965 does not support HT40 channels on 2.4 GHz. 41747ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka */ 41847ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka#define EEPROM_4965_REGULATORY_BAND_24_HT40_CHANNELS (2*0xA0) /* 14 bytes */ 41947ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka 42047ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka/* 42147ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * 5.2 GHz HT40 channels 36 (40), 44 (48), 52 (56), 60 (64), 42247ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * 100 (104), 108 (112), 116 (120), 124 (128), 132 (136), 149 (153), 157 (161) 42347ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka */ 42447ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka#define EEPROM_4965_REGULATORY_BAND_52_HT40_CHANNELS (2*0xA8) /* 22 bytes */ 42547ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka 42647ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka#define EEPROM_REGULATORY_BAND_NO_HT40 (0) 42747ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka 42847ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszkaint il_eeprom_init(struct il_priv *il); 42947ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszkavoid il_eeprom_free(struct il_priv *il); 430e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkaconst u8 *il_eeprom_query_addr(const struct il_priv *il, size_t offset); 43147ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszkau16 il_eeprom_query16(const struct il_priv *il, size_t offset); 43247ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszkaint il_init_channel_map(struct il_priv *il); 43347ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszkavoid il_free_channel_map(struct il_priv *il); 434e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkaconst struct il_channel_info *il_get_channel_info(const struct il_priv *il, 435e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka enum ieee80211_band band, 436e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u16 channel); 43747ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka 438e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define IL_NUM_SCAN_RATES (2) 439e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 440e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkastruct il4965_channel_tgd_info { 441e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u8 type; 442e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka s8 max_power; 443e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka}; 444e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 445e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkastruct il4965_channel_tgh_info { 446e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka s64 last_radar_time; 447e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka}; 448e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 449e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define IL4965_MAX_RATE (33) 450e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 451e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkastruct il3945_clip_group { 452e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka /* maximum power level to prevent clipping for each rate, derived by 453e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * us from this band's saturation power in EEPROM */ 454e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka const s8 clip_powers[IL_MAX_RATES]; 455e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka}; 456e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 457e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka/* current Tx power values to use, one for each rate for each channel. 458e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * requested power is limited by: 459e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * -- regulatory EEPROM limits for this channel 460e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * -- hardware capabilities (clip-powers) 461e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * -- spectrum management 462e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * -- user preference (e.g. iwconfig) 463e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * when requested power is set, base power idx must also be set. */ 464e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkastruct il3945_channel_power_info { 465e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct il3945_tx_power tpc; /* actual radio and DSP gain settings */ 466e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka s8 power_table_idx; /* actual (compenst'd) idx into gain table */ 467e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka s8 base_power_idx; /* gain idx for power at factory temp. */ 468e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka s8 requested_power; /* power (dBm) requested for this chnl/rate */ 469e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka}; 470e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 471e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka/* current scan Tx power values to use, one for each scan rate for each 472e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * channel. */ 473e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkastruct il3945_scan_power_info { 474e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct il3945_tx_power tpc; /* actual radio and DSP gain settings */ 475e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka s8 power_table_idx; /* actual (compenst'd) idx into gain table */ 476e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka s8 requested_power; /* scan pwr (dBm) requested for chnl/rate */ 477e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka}; 478e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 479e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka/* 480e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * One for each channel, holds all channel setup data 481e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * Some of the fields (e.g. eeprom and flags/max_power_avg) are redundant 482e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * with one another! 483e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka */ 484e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkastruct il_channel_info { 485e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct il4965_channel_tgd_info tgd; 486e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct il4965_channel_tgh_info tgh; 487e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct il_eeprom_channel eeprom; /* EEPROM regulatory limit */ 488e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct il_eeprom_channel ht40_eeprom; /* EEPROM regulatory limit for 489e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * HT40 channel */ 490e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 491e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u8 channel; /* channel number */ 492e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u8 flags; /* flags copied from EEPROM */ 493e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka s8 max_power_avg; /* (dBm) regul. eeprom, normal Tx, any rate */ 494e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka s8 curr_txpow; /* (dBm) regulatory/spectrum/user (not h/w) limit */ 495e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka s8 min_power; /* always 0 */ 496e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka s8 scan_power; /* (dBm) regul. eeprom, direct scans, any rate */ 497e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 498e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u8 group_idx; /* 0-4, maps channel to group1/2/3/4/5 */ 499e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u8 band_idx; /* 0-4, maps channel to band1/2/3/4/5 */ 500e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka enum ieee80211_band band; 501e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 502e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka /* HT40 channel info */ 503e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka s8 ht40_max_power_avg; /* (dBm) regul. eeprom, normal Tx, any rate */ 504e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u8 ht40_flags; /* flags copied from EEPROM */ 505e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u8 ht40_extension_channel; /* HT_IE_EXT_CHANNEL_* */ 506e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 507e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka /* Radio/DSP gain settings for each "normal" data Tx rate. 508e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * These include, in addition to RF and DSP gain, a few fields for 509e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * remembering/modifying gain settings (idxes). */ 510e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct il3945_channel_power_info power_info[IL4965_MAX_RATE]; 511e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 512e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka /* Radio/DSP gain settings for each scan rate, for directed scans. */ 513e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct il3945_scan_power_info scan_pwr_info[IL_NUM_SCAN_RATES]; 514e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka}; 515e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 516e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define IL_TX_FIFO_BK 0 /* shared */ 517e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define IL_TX_FIFO_BE 1 518e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define IL_TX_FIFO_VI 2 /* shared */ 519e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define IL_TX_FIFO_VO 3 520e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define IL_TX_FIFO_UNUSED -1 521e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 522e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka/* Minimum number of queues. MAX_NUM is defined in hw specific files. 523e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * Set the minimum to accommodate the 4 standard TX queues, 1 command 524e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * queue, 2 (unused) HCCA queues, and 4 HT queues (one for each AC) */ 525e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define IL_MIN_NUM_QUEUES 10 526e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 527e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define IL_DEFAULT_CMD_QUEUE_NUM 4 528e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 529e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define IEEE80211_DATA_LEN 2304 530e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define IEEE80211_4ADDR_LEN 30 531e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define IEEE80211_HLEN (IEEE80211_4ADDR_LEN) 532e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define IEEE80211_FRAME_LEN (IEEE80211_DATA_LEN + IEEE80211_HLEN) 533e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 534e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkastruct il_frame { 535e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka union { 536e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct ieee80211_hdr frame; 537e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct il_tx_beacon_cmd beacon; 538e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u8 raw[IEEE80211_FRAME_LEN]; 539e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u8 cmd[360]; 540e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka } u; 541e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct list_head list; 542e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka}; 543e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 544e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define SEQ_TO_SN(seq) (((seq) & IEEE80211_SCTL_SEQ) >> 4) 545e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define SN_TO_SEQ(ssn) (((ssn) << 4) & IEEE80211_SCTL_SEQ) 546e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define MAX_SN ((IEEE80211_SCTL_SEQ) >> 4) 547e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 548e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkaenum { 549e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka CMD_SYNC = 0, 550e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka CMD_SIZE_NORMAL = 0, 551e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka CMD_NO_SKB = 0, 552e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka CMD_SIZE_HUGE = (1 << 0), 553e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka CMD_ASYNC = (1 << 1), 554e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka CMD_WANT_SKB = (1 << 2), 555e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka CMD_MAPPED = (1 << 3), 556e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka}; 557e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 558e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define DEF_CMD_PAYLOAD_SIZE 320 559e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 560e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka/** 561e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * struct il_device_cmd 562e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * 563e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * For allocation of the command and tx queues, this establishes the overall 564e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * size of the largest command we send to uCode, except for a scan command 565e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * (which is relatively huge; space is allocated separately). 566e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka */ 567e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkastruct il_device_cmd { 568e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct il_cmd_header hdr; /* uCode API */ 569e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka union { 570e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 flags; 571e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u8 val8; 572e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u16 val16; 573e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 val32; 574e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct il_tx_cmd tx; 575e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u8 payload[DEF_CMD_PAYLOAD_SIZE]; 576e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka } __packed cmd; 577e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka} __packed; 578e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 579e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define TFD_MAX_PAYLOAD_SIZE (sizeof(struct il_device_cmd)) 580e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 581e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkastruct il_host_cmd { 582e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka const void *data; 583e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka unsigned long reply_page; 5841722f8e12a9c6117d872bd19ec5919460ccdfb4eStanislaw Gruszka void (*callback) (struct il_priv *il, struct il_device_cmd *cmd, 5851722f8e12a9c6117d872bd19ec5919460ccdfb4eStanislaw Gruszka struct il_rx_pkt *pkt); 586e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 flags; 587e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u16 len; 588e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u8 id; 589e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka}; 590e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 591e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define SUP_RATE_11A_MAX_NUM_CHANNELS 8 592e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define SUP_RATE_11B_MAX_NUM_CHANNELS 4 593e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define SUP_RATE_11G_MAX_NUM_CHANNELS 12 594e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 595e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka/** 596e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * struct il_rx_queue - Rx queue 597e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @bd: driver's pointer to buffer of receive buffer descriptors (rbd) 598e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @bd_dma: bus address of buffer of receive buffer descriptors (rbd) 599e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @read: Shared idx to newest available Rx buffer 600e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @write: Shared idx to oldest written Rx packet 601e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @free_count: Number of pre-allocated buffers in rx_free 602e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @rx_free: list of free SKBs for use 603e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @rx_used: List of Rx buffers with no SKB 604e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @need_update: flag to indicate we need to update read/write idx 605e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @rb_stts: driver's pointer to receive buffer status 606e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @rb_stts_dma: bus address of receive buffer status 607e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * 608e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * NOTE: rx_free and rx_used are used as a FIFO for il_rx_bufs 609e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka */ 610e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkastruct il_rx_queue { 611e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka __le32 *bd; 612e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka dma_addr_t bd_dma; 613e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct il_rx_buf pool[RX_QUEUE_SIZE + RX_FREE_BUFFERS]; 614e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct il_rx_buf *queue[RX_QUEUE_SIZE]; 615e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 read; 616e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 write; 617e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 free_count; 618e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 write_actual; 619e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct list_head rx_free; 620e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct list_head rx_used; 621e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka int need_update; 622e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct il_rb_status *rb_stts; 623e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka dma_addr_t rb_stts_dma; 624e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka spinlock_t lock; 625e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka}; 626e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 627e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define IL_SUPPORTED_RATES_IE_LEN 8 628e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 629e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define MAX_TID_COUNT 9 630e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 631e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define IL_INVALID_RATE 0xFF 632e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define IL_INVALID_VALUE -1 633e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 634e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka/** 635e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * struct il_ht_agg -- aggregation status while waiting for block-ack 636e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @txq_id: Tx queue used for Tx attempt 637e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @frame_count: # frames attempted by Tx command 638e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @wait_for_ba: Expect block-ack before next Tx reply 639e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @start_idx: Index of 1st Transmit Frame Descriptor (TFD) in Tx win 640e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @bitmap0: Low order bitmap, one bit for each frame pending ACK in Tx win 641e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @bitmap1: High order, one bit for each frame pending ACK in Tx win 642e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @rate_n_flags: Rate at which Tx was attempted 643e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * 644e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * If C_TX indicates that aggregation was attempted, driver must wait 645e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * for block ack (N_COMPRESSED_BA). This struct stores tx reply info 646e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * until block ack arrives. 647e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka */ 648e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkastruct il_ht_agg { 649e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u16 txq_id; 650e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u16 frame_count; 651e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u16 wait_for_ba; 652e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u16 start_idx; 653e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u64 bitmap; 654e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 rate_n_flags; 655e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define IL_AGG_OFF 0 656e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define IL_AGG_ON 1 657e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define IL_EMPTYING_HW_QUEUE_ADDBA 2 658e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define IL_EMPTYING_HW_QUEUE_DELBA 3 659e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u8 state; 660e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka}; 661e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 662e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkastruct il_tid_data { 663e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u16 seq_number; /* 4965 only */ 664e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u16 tfds_in_queue; 665e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct il_ht_agg agg; 666e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka}; 667e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 668e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkastruct il_hw_key { 669e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 cipher; 670e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka int keylen; 671e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u8 keyidx; 672e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u8 key[32]; 673e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka}; 674e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 675e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkaunion il_ht_rate_supp { 676e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u16 rates; 677e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct { 678e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u8 siso_rate; 679e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u8 mimo_rate; 680e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka }; 681e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka}; 682e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 683e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define CFG_HT_RX_AMPDU_FACTOR_8K (0x0) 684e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define CFG_HT_RX_AMPDU_FACTOR_16K (0x1) 685e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define CFG_HT_RX_AMPDU_FACTOR_32K (0x2) 686e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define CFG_HT_RX_AMPDU_FACTOR_64K (0x3) 687e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define CFG_HT_RX_AMPDU_FACTOR_DEF CFG_HT_RX_AMPDU_FACTOR_64K 688e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define CFG_HT_RX_AMPDU_FACTOR_MAX CFG_HT_RX_AMPDU_FACTOR_64K 689e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define CFG_HT_RX_AMPDU_FACTOR_MIN CFG_HT_RX_AMPDU_FACTOR_8K 690e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 691e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka/* 692e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * Maximal MPDU density for TX aggregation 693e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * 4 - 2us density 694e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * 5 - 4us density 695e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * 6 - 8us density 696e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * 7 - 16us density 697e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka */ 698e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define CFG_HT_MPDU_DENSITY_2USEC (0x4) 699e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define CFG_HT_MPDU_DENSITY_4USEC (0x5) 700e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define CFG_HT_MPDU_DENSITY_8USEC (0x6) 701e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define CFG_HT_MPDU_DENSITY_16USEC (0x7) 702e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define CFG_HT_MPDU_DENSITY_DEF CFG_HT_MPDU_DENSITY_4USEC 703e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define CFG_HT_MPDU_DENSITY_MAX CFG_HT_MPDU_DENSITY_16USEC 704e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define CFG_HT_MPDU_DENSITY_MIN (0x1) 705e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 706e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkastruct il_ht_config { 707e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka bool single_chain_sufficient; 708e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka enum ieee80211_smps_mode smps; /* current smps mode */ 709e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka}; 710e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 711e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka/* QoS structures */ 712e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkastruct il_qos_info { 713e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka int qos_active; 714e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct il_qosparam_cmd def_qos_parm; 715e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka}; 716e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 717e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka/* 718e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * Structure should be accessed with sta_lock held. When station addition 719e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * is in progress (IL_STA_UCODE_INPROGRESS) it is possible to access only 720e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * the commands (il_addsta_cmd and il_link_quality_cmd) without 721e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * sta_lock held. 722e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka */ 723e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkastruct il_station_entry { 724e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct il_addsta_cmd sta; 725e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct il_tid_data tid[MAX_TID_COUNT]; 7266aa0c25435e6383d4a4af88fae8d128200dcd471Stanislaw Gruszka u8 used; 727e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct il_hw_key keyinfo; 728e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct il_link_quality_cmd *lq; 729e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka}; 730e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 731e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkastruct il_station_priv_common { 732e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u8 sta_id; 733e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka}; 734e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 735e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka/** 736e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * struct il_vif_priv - driver's ilate per-interface information 737e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * 738e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * When mac80211 allocates a virtual interface, it can allocate 739e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * space for us to put data into. 740e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka */ 741e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkastruct il_vif_priv { 742e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u8 ibss_bssid_sta_id; 743e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka}; 744e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 745e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka/* one for each uCode image (inst/data, boot/init/runtime) */ 746e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkastruct fw_desc { 747e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka void *v_addr; /* access by driver */ 748e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka dma_addr_t p_addr; /* access by card's busmaster DMA */ 749e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 len; /* bytes */ 750e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka}; 751e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 752e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka/* uCode file layout */ 753e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkastruct il_ucode_header { 754e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka __le32 ver; /* major/minor/API/serial */ 755e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct { 756e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka __le32 inst_size; /* bytes of runtime code */ 757e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka __le32 data_size; /* bytes of runtime data */ 758e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka __le32 init_size; /* bytes of init code */ 759e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka __le32 init_data_size; /* bytes of init data */ 760e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka __le32 boot_size; /* bytes of bootstrap code */ 761e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u8 data[0]; /* in same order as sizes */ 762e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka } v1; 763e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka}; 764e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 765e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkastruct il4965_ibss_seq { 766e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u8 mac[ETH_ALEN]; 767e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u16 seq_num; 768e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u16 frag_num; 769e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka unsigned long packet_time; 770e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct list_head list; 771e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka}; 772e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 773e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkastruct il_sensitivity_ranges { 774e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u16 min_nrg_cck; 775e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u16 max_nrg_cck; 776e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 777e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u16 nrg_th_cck; 778e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u16 nrg_th_ofdm; 779e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 780e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u16 auto_corr_min_ofdm; 781e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u16 auto_corr_min_ofdm_mrc; 782e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u16 auto_corr_min_ofdm_x1; 783e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u16 auto_corr_min_ofdm_mrc_x1; 784e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 785e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u16 auto_corr_max_ofdm; 786e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u16 auto_corr_max_ofdm_mrc; 787e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u16 auto_corr_max_ofdm_x1; 788e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u16 auto_corr_max_ofdm_mrc_x1; 789e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 790e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u16 auto_corr_max_cck; 791e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u16 auto_corr_max_cck_mrc; 792e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u16 auto_corr_min_cck; 793e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u16 auto_corr_min_cck_mrc; 794e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 795e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u16 barker_corr_th_min; 796e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u16 barker_corr_th_min_mrc; 797e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u16 nrg_th_cca; 798e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka}; 799e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 800e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define KELVIN_TO_CELSIUS(x) ((x)-273) 801e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define CELSIUS_TO_KELVIN(x) ((x)+273) 802e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 803e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka/** 804e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * struct il_hw_params 805b16db50a6dc486c3a6c32cd7982a75452cb785c2Stanislaw Gruszka * @bcast_id: f/w broadcast station ID 806e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @max_txq_num: Max # Tx queues supported 807e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @dma_chnl_num: Number of Tx DMA/FIFO channels 808e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @scd_bc_tbls_size: size of scheduler byte count tables 809e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @tfd_size: TFD size 810e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @tx/rx_chains_num: Number of TX/RX chains 811e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @valid_tx/rx_ant: usable antennas 812e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @max_rxq_size: Max # Rx frames in Rx queue (must be power-of-2) 813e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @max_rxq_log: Log-base-2 of max_rxq_size 814e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @rx_page_order: Rx buffer page order 815e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @rx_wrt_ptr_reg: FH{39}_RSCSR_CHNL0_WPTR 816e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @max_stations: 817e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @ht40_channel: is 40MHz width possible in band 2.4 818e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * BIT(IEEE80211_BAND_5GHZ) BIT(IEEE80211_BAND_5GHZ) 819e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @sw_crypto: 0 for hw, 1 for sw 820e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @max_xxx_size: for ucode uses 821e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @ct_kill_threshold: temperature threshold 822e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @beacon_time_tsf_bits: number of valid tsf bits for beacon time 823e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @struct il_sensitivity_ranges: range of sensitivity values 824e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka */ 825e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkastruct il_hw_params { 826b16db50a6dc486c3a6c32cd7982a75452cb785c2Stanislaw Gruszka u8 bcast_id; 827e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u8 max_txq_num; 828e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u8 dma_chnl_num; 829e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u16 scd_bc_tbls_size; 830e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 tfd_size; 831e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u8 tx_chains_num; 832e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u8 rx_chains_num; 833e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u8 valid_tx_ant; 834e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u8 valid_rx_ant; 835e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u16 max_rxq_size; 836e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u16 max_rxq_log; 837e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 rx_page_order; 838e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 rx_wrt_ptr_reg; 839e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u8 max_stations; 840e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u8 ht40_channel; 841e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u8 max_beacon_itrvl; /* in 1024 ms */ 842e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 max_inst_size; 843e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 max_data_size; 844e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 max_bsm_size; 845e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u32 ct_kill_threshold; /* value in hw-dependent units */ 846e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u16 beacon_time_tsf_bits; 847e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka const struct il_sensitivity_ranges *sens; 848e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka}; 849e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 850e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka/****************************************************************************** 851e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * 852e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * Functions implemented in core module which are forward declared here 853e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * for use by iwl-[4-5].c 854e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * 855e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * NOTE: The implementation of these functions are not hardware specific 856e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * which is why they are in the core module files. 857e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * 858e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * Naming convention -- 859e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * il_ <-- Is part of iwlwifi 860e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * iwlXXXX_ <-- Hardware specific (implemented in iwl-XXXX.c for XXXX) 861e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * il4965_bg_ <-- Called from work queue context 862e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * il4965_mac_ <-- mac80211 callback 863e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * 864e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka ****************************************************************************/ 865e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkaextern void il4965_update_chain_flags(struct il_priv *il); 866e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkaextern const u8 il_bcast_addr[ETH_ALEN]; 867e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkaextern int il_queue_space(const struct il_queue *q); 868e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkastatic inline int 869e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkail_queue_used(const struct il_queue *q, int i) 870e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka{ 871e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka return q->write_ptr >= q->read_ptr ? (i >= q->read_ptr && 872e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka i < q->write_ptr) : !(i < 873e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka q->read_ptr 874e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka && i >= 875e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka q-> 876e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka write_ptr); 877e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka} 878e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 879e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkastatic inline u8 880e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkail_get_cmd_idx(struct il_queue *q, u32 idx, int is_huge) 881e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka{ 882e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka /* 883e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * This is for init calibration result and scan command which 884e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * required buffer > TFD_MAX_PAYLOAD_SIZE, 885e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * the big buffer at end of command array 886e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka */ 887e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka if (is_huge) 888e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka return q->n_win; /* must be power of 2 */ 889e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 890e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka /* Otherwise, use normal size buffers */ 891e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka return idx & (q->n_win - 1); 892e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka} 893e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 894e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkastruct il_dma_ptr { 895e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka dma_addr_t dma; 896e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka void *addr; 897e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka size_t size; 898e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka}; 899e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 900e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define IL_OPERATION_MODE_AUTO 0 901e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define IL_OPERATION_MODE_HT_ONLY 1 902e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define IL_OPERATION_MODE_MIXED 2 903e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define IL_OPERATION_MODE_20MHZ 3 904e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 905e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define IL_TX_CRC_SIZE 4 906e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define IL_TX_DELIMITER_SIZE 4 907e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 908e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define TX_POWER_IL_ILLEGAL_VOLTAGE -10000 909e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 910e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka/* Sensitivity and chain noise calibration */ 911e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define INITIALIZATION_VALUE 0xFFFF 912e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define IL4965_CAL_NUM_BEACONS 20 913e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define IL_CAL_NUM_BEACONS 16 914e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define MAXIMUM_ALLOWED_PATHLOSS 15 915e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 916e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define CHAIN_NOISE_MAX_DELTA_GAIN_CODE 3 917e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 918e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define MAX_FA_OFDM 50 919e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define MIN_FA_OFDM 5 920e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define MAX_FA_CCK 50 921e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define MIN_FA_CCK 5 922e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 923e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define AUTO_CORR_STEP_OFDM 1 924e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 925e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define AUTO_CORR_STEP_CCK 3 926e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define AUTO_CORR_MAX_TH_CCK 160 927e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 928e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define NRG_DIFF 2 929e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define NRG_STEP_CCK 2 930e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define NRG_MARGIN 8 931e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define MAX_NUMBER_CCK_NO_FA 100 932e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 933e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define AUTO_CORR_CCK_MIN_VAL_DEF (125) 934e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 935e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define CHAIN_A 0 936e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define CHAIN_B 1 937e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define CHAIN_C 2 938e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define CHAIN_NOISE_DELTA_GAIN_INIT_VAL 4 939e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define ALL_BAND_FILTER 0xFF00 940e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define IN_BAND_FILTER 0xFF 941e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define MIN_AVERAGE_NOISE_MAX_VALUE 0xFFFFFFFF 942e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 943e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define NRG_NUM_PREV_STAT_L 20 944e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define NUM_RX_CHAINS 3 945e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 946e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkaenum il4965_false_alarm_state { 947e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka IL_FA_TOO_MANY = 0, 948e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka IL_FA_TOO_FEW = 1, 949e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka IL_FA_GOOD_RANGE = 2, 950e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka}; 951e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 952e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkaenum il4965_chain_noise_state { 953e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka IL_CHAIN_NOISE_ALIVE = 0, /* must be 0 */ 954e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka IL_CHAIN_NOISE_ACCUMULATE, 955e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka IL_CHAIN_NOISE_CALIBRATED, 956e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka IL_CHAIN_NOISE_DONE, 957e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka}; 958e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 959e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkaenum ucode_type { 960e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka UCODE_NONE = 0, 961e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka UCODE_INIT, 962e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka UCODE_RT 963e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka}; 964e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 965e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka/* Sensitivity calib data */ 966e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkastruct il_sensitivity_data { 967e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 auto_corr_ofdm; 968e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 auto_corr_ofdm_mrc; 969e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 auto_corr_ofdm_x1; 970e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 auto_corr_ofdm_mrc_x1; 971e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 auto_corr_cck; 972e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 auto_corr_cck_mrc; 973e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 974e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 last_bad_plcp_cnt_ofdm; 975e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 last_fa_cnt_ofdm; 976e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 last_bad_plcp_cnt_cck; 977e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 last_fa_cnt_cck; 978e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 979e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 nrg_curr_state; 980e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 nrg_prev_state; 981e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 nrg_value[10]; 982e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u8 nrg_silence_rssi[NRG_NUM_PREV_STAT_L]; 983e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 nrg_silence_ref; 984e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 nrg_energy_idx; 985e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 nrg_silence_idx; 986e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 nrg_th_cck; 987e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka s32 nrg_auto_corr_silence_diff; 988e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 num_in_cck_no_fa; 989e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 nrg_th_ofdm; 990e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 991e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u16 barker_corr_th_min; 992e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u16 barker_corr_th_min_mrc; 993e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u16 nrg_th_cca; 994e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka}; 995e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 996e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka/* Chain noise (differential Rx gain) calib data */ 997e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkastruct il_chain_noise_data { 998e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 active_chains; 999e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 chain_noise_a; 1000e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 chain_noise_b; 1001e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 chain_noise_c; 1002e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 chain_signal_a; 1003e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 chain_signal_b; 1004e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 chain_signal_c; 1005e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u16 beacon_count; 1006e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u8 disconn_array[NUM_RX_CHAINS]; 1007e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u8 delta_gain_code[NUM_RX_CHAINS]; 1008e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u8 radio_write; 1009e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u8 state; 1010e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka}; 1011e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1012e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka#define EEPROM_SEM_TIMEOUT 10 /* milliseconds */ 1013e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define EEPROM_SEM_RETRY_LIMIT 1000 /* number of attempts (not time) */ 1014e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1015e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define IL_TRAFFIC_ENTRIES (256) 1016e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define IL_TRAFFIC_ENTRY_SIZE (64) 1017e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1018e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkaenum { 1019e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka MEASUREMENT_READY = (1 << 0), 1020e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka MEASUREMENT_ACTIVE = (1 << 1), 1021e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka}; 1022e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1023e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka/* interrupt stats */ 1024e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkastruct isr_stats { 1025e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 hw; 1026e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 sw; 1027e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 err_code; 1028e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 sch; 1029e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 alive; 1030e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 rfkill; 1031e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 ctkill; 1032e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 wakeup; 1033e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 rx; 1034e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 handlers[IL_CN_MAX]; 1035e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 tx; 1036e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 unhandled; 1037e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka}; 1038e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1039e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka/* management stats */ 1040e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkaenum il_mgmt_stats { 1041e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka MANAGEMENT_ASSOC_REQ = 0, 1042e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka MANAGEMENT_ASSOC_RESP, 1043e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka MANAGEMENT_REASSOC_REQ, 1044e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka MANAGEMENT_REASSOC_RESP, 1045e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka MANAGEMENT_PROBE_REQ, 1046e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka MANAGEMENT_PROBE_RESP, 1047e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka MANAGEMENT_BEACON, 1048e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka MANAGEMENT_ATIM, 1049e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka MANAGEMENT_DISASSOC, 1050e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka MANAGEMENT_AUTH, 1051e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka MANAGEMENT_DEAUTH, 1052e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka MANAGEMENT_ACTION, 1053e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka MANAGEMENT_MAX, 1054e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka}; 1055e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka/* control stats */ 1056e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkaenum il_ctrl_stats { 1057e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka CONTROL_BACK_REQ = 0, 1058e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka CONTROL_BACK, 1059e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka CONTROL_PSPOLL, 1060e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka CONTROL_RTS, 1061e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka CONTROL_CTS, 1062e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka CONTROL_ACK, 1063e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka CONTROL_CFEND, 1064e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka CONTROL_CFENDACK, 1065e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka CONTROL_MAX, 1066e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka}; 1067e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1068e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkastruct traffic_stats { 1069e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#ifdef CONFIG_IWLEGACY_DEBUGFS 1070e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 mgmt[MANAGEMENT_MAX]; 1071e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 ctrl[CONTROL_MAX]; 1072e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 data_cnt; 1073e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u64 data_bytes; 1074e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#endif 1075e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka}; 1076e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1077e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka/* 1078e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * host interrupt timeout value 1079e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * used with setting interrupt coalescing timer 1080e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * the CSR_INT_COALESCING is an 8 bit register in 32-usec unit 1081e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * 1082e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * default interrupt coalescing timer is 64 x 32 = 2048 usecs 1083e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * default interrupt coalescing calibration timer is 16 x 32 = 512 usecs 1084e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka */ 1085e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define IL_HOST_INT_TIMEOUT_MAX (0xFF) 1086e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define IL_HOST_INT_TIMEOUT_DEF (0x40) 1087e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define IL_HOST_INT_TIMEOUT_MIN (0x0) 1088e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define IL_HOST_INT_CALIB_TIMEOUT_MAX (0xFF) 1089e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define IL_HOST_INT_CALIB_TIMEOUT_DEF (0x10) 1090e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define IL_HOST_INT_CALIB_TIMEOUT_MIN (0x0) 1091e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1092e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define IL_DELAY_NEXT_FORCE_FW_RELOAD (HZ*5) 1093e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1094e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka/* TX queue watchdog timeouts in mSecs */ 1095e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define IL_DEF_WD_TIMEOUT (2000) 1096e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define IL_LONG_WD_TIMEOUT (10000) 1097e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define IL_MAX_WD_TIMEOUT (120000) 1098e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1099e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkastruct il_force_reset { 1100e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka int reset_request_count; 1101e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka int reset_success_count; 1102e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka int reset_reject_count; 1103e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka unsigned long reset_duration; 1104e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka unsigned long last_force_reset_jiffies; 1105e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka}; 1106e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1107e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka/* extend beacon time format bit shifting */ 1108e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka/* 1109e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * for _3945 devices 1110e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * bits 31:24 - extended 1111e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * bits 23:0 - interval 1112e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka */ 1113e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define IL3945_EXT_BEACON_TIME_POS 24 1114e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka/* 1115e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * for _4965 devices 1116e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * bits 31:22 - extended 1117e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * bits 21:0 - interval 1118e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka */ 1119e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define IL4965_EXT_BEACON_TIME_POS 22 1120e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1121e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkastruct il_rxon_context { 1122e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct ieee80211_vif *vif; 1123e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka}; 1124e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 112599412002a07b63781adfc3d1272d3677841d4170Stanislaw Gruszkastruct il_power_mgr { 112699412002a07b63781adfc3d1272d3677841d4170Stanislaw Gruszka struct il_powertable_cmd sleep_cmd; 112799412002a07b63781adfc3d1272d3677841d4170Stanislaw Gruszka struct il_powertable_cmd sleep_cmd_next; 112899412002a07b63781adfc3d1272d3677841d4170Stanislaw Gruszka int debug_sleep_level_override; 112999412002a07b63781adfc3d1272d3677841d4170Stanislaw Gruszka bool pci_pm; 113099412002a07b63781adfc3d1272d3677841d4170Stanislaw Gruszka}; 113199412002a07b63781adfc3d1272d3677841d4170Stanislaw Gruszka 1132e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkastruct il_priv { 1133e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct ieee80211_hw *hw; 1134e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct ieee80211_channel *ieee_channels; 1135e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct ieee80211_rate *ieee_rates; 113693b7654ec563a929a62da70324e834eeb18a2778Stanislaw Gruszka 1137e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct il_cfg *cfg; 1138c39ae9fd505ae314a7a4a159a41e3e022cfa317fStanislaw Gruszka const struct il_ops *ops; 113993b7654ec563a929a62da70324e834eeb18a2778Stanislaw Gruszka#ifdef CONFIG_IWLEGACY_DEBUGFS 114093b7654ec563a929a62da70324e834eeb18a2778Stanislaw Gruszka const struct il_debugfs_ops *debugfs_ops; 114193b7654ec563a929a62da70324e834eeb18a2778Stanislaw Gruszka#endif 1142e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1143e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka /* temporary frame storage list */ 1144e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct list_head free_frames; 1145e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka int frames_count; 1146e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1147e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka enum ieee80211_band band; 1148e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka int alloc_rxb_page; 1149e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 11501722f8e12a9c6117d872bd19ec5919460ccdfb4eStanislaw Gruszka void (*handlers[IL_CN_MAX]) (struct il_priv *il, 11511722f8e12a9c6117d872bd19ec5919460ccdfb4eStanislaw Gruszka struct il_rx_buf *rxb); 1152e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1153e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct ieee80211_supported_band bands[IEEE80211_NUM_BANDS]; 1154e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1155e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka /* spectrum measurement report caching */ 1156e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct il_spectrum_notification measure_report; 1157e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u8 measurement_status; 1158e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1159e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka /* ucode beacon time */ 1160e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 ucode_beacon_time; 1161e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka int missed_beacon_threshold; 1162e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1163e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka /* track IBSS manager (last beacon) status */ 1164e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 ibss_manager; 1165e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1166e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka /* force reset */ 1167e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct il_force_reset force_reset; 1168e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1169e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka /* we allocate array of il_channel_info for NIC's valid channels. 1170e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * Access via channel # using indirect idx array */ 1171e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct il_channel_info *channel_info; /* channel info array */ 1172e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u8 channel_count; /* # of channels */ 1173e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1174e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka /* thermal calibration */ 1175e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka s32 temperature; /* degrees Kelvin */ 1176e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka s32 last_temperature; 1177e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1178e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka /* Scan related variables */ 1179e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka unsigned long scan_start; 1180e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka unsigned long scan_start_tsf; 1181e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka void *scan_cmd; 1182e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka enum ieee80211_band scan_band; 1183e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct cfg80211_scan_request *scan_request; 1184e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct ieee80211_vif *scan_vif; 1185e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u8 scan_tx_ant[IEEE80211_NUM_BANDS]; 1186e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u8 mgmt_tx_ant; 1187e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1188e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka /* spinlock */ 1189e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka spinlock_t lock; /* protect general shared data */ 1190e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka spinlock_t hcmd_lock; /* protect hcmd */ 1191e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka spinlock_t reg_lock; /* protect hw register access */ 1192e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct mutex mutex; 1193e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1194e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka /* basic pci-network driver stuff */ 1195e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct pci_dev *pci_dev; 1196e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1197e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka /* pci hardware address support */ 1198e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka void __iomem *hw_base; 1199e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u32 hw_rev; 1200e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u32 hw_wa_rev; 1201e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u8 rev_id; 1202e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1203e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka /* command queue number */ 1204e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u8 cmd_queue; 1205e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1206e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka /* max number of station keys */ 1207e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u8 sta_key_max_num; 1208e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1209e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka /* EEPROM MAC addresses */ 1210e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct mac_address addresses[1]; 1211e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1212e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka /* uCode images, save to reload in case of failure */ 1213e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka int fw_idx; /* firmware we're trying to load */ 1214e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u32 ucode_ver; /* version of ucode, copy of 1215e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka il_ucode.ver */ 1216e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct fw_desc ucode_code; /* runtime inst */ 1217e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct fw_desc ucode_data; /* runtime data original */ 1218e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct fw_desc ucode_data_backup; /* runtime data save/restore */ 1219e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct fw_desc ucode_init; /* initialization inst */ 1220e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct fw_desc ucode_init_data; /* initialization data */ 1221e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct fw_desc ucode_boot; /* bootstrap inst */ 1222e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka enum ucode_type ucode_type; 1223e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u8 ucode_write_complete; /* the image write is complete */ 1224e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka char firmware_name[25]; 1225e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 122683007196037cc2d0bffd9f7afbe56d675779a6cbStanislaw Gruszka struct ieee80211_vif *vif; 1227e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 12288d44f2bd7554734913f1256e4f45c35454167161Stanislaw Gruszka struct il_qos_info qos_data; 12298d44f2bd7554734913f1256e4f45c35454167161Stanislaw Gruszka 12301c03c4620edc551b5bbcc87c7aca02b482d8bc51Stanislaw Gruszka struct { 12311c03c4620edc551b5bbcc87c7aca02b482d8bc51Stanislaw Gruszka bool enabled; 12321c03c4620edc551b5bbcc87c7aca02b482d8bc51Stanislaw Gruszka bool is_40mhz; 12331c03c4620edc551b5bbcc87c7aca02b482d8bc51Stanislaw Gruszka bool non_gf_sta_present; 12341c03c4620edc551b5bbcc87c7aca02b482d8bc51Stanislaw Gruszka u8 protection; 12351c03c4620edc551b5bbcc87c7aca02b482d8bc51Stanislaw Gruszka u8 extension_chan_offset; 12361c03c4620edc551b5bbcc87c7aca02b482d8bc51Stanislaw Gruszka } ht; 12371c03c4620edc551b5bbcc87c7aca02b482d8bc51Stanislaw Gruszka 1238c8b03958d4b23dc48932ec095a391f3d6447e0e9Stanislaw Gruszka /* 1239c8b03958d4b23dc48932ec095a391f3d6447e0e9Stanislaw Gruszka * We declare this const so it can only be 1240c8b03958d4b23dc48932ec095a391f3d6447e0e9Stanislaw Gruszka * changed via explicit cast within the 1241c8b03958d4b23dc48932ec095a391f3d6447e0e9Stanislaw Gruszka * routines that actually update the physical 1242c8b03958d4b23dc48932ec095a391f3d6447e0e9Stanislaw Gruszka * hardware. 1243c8b03958d4b23dc48932ec095a391f3d6447e0e9Stanislaw Gruszka */ 1244c8b03958d4b23dc48932ec095a391f3d6447e0e9Stanislaw Gruszka const struct il_rxon_cmd active; 1245c8b03958d4b23dc48932ec095a391f3d6447e0e9Stanislaw Gruszka struct il_rxon_cmd staging; 1246c8b03958d4b23dc48932ec095a391f3d6447e0e9Stanislaw Gruszka 1247c8b03958d4b23dc48932ec095a391f3d6447e0e9Stanislaw Gruszka struct il_rxon_time_cmd timing; 1248c8b03958d4b23dc48932ec095a391f3d6447e0e9Stanislaw Gruszka 1249e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka __le16 switch_channel; 1250e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1251e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka /* 1st responses from initialize and runtime uCode images. 1252e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * _4965's initialize alive response contains some calibration data. */ 1253e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct il_init_alive_resp card_alive_init; 1254e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct il_alive_resp card_alive; 1255e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1256e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u16 active_rate; 1257e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1258e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u8 start_calib; 1259e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct il_sensitivity_data sensitivity_data; 1260e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct il_chain_noise_data chain_noise_data; 1261e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka __le16 sensitivity_tbl[HD_TBL_SIZE]; 1262e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1263e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct il_ht_config current_ht_config; 1264e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1265e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka /* Rate scaling data */ 1266e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u8 retry_rate; 1267e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1268e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka wait_queue_head_t wait_command_queue; 1269e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1270e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka int activity_timer_active; 1271e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1272e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka /* Rx and Tx DMA processing queues */ 1273e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct il_rx_queue rxq; 1274e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct il_tx_queue *txq; 1275e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka unsigned long txq_ctx_active_msk; 1276e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka struct il_dma_ptr kw; /* keep warm address */ 1277e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka struct il_dma_ptr scd_bc_tbls; 1278e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1279e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 scd_base_addr; /* scheduler sram base address */ 1280e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1281e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka unsigned long status; 1282e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1283e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka /* counts mgmt, ctl, and data packets */ 1284e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct traffic_stats tx_stats; 1285e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct traffic_stats rx_stats; 1286e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1287e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka /* counts interrupts */ 1288e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct isr_stats isr_stats; 1289e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1290e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct il_power_mgr power_data; 1291e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1292e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka /* context information */ 1293e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u8 bssid[ETH_ALEN]; /* used only on 3945 but filled by core */ 1294e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1295e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka /* station table variables */ 1296e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1297e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka /* Note: if lock and sta_lock are needed, lock must be acquired first */ 1298e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka spinlock_t sta_lock; 1299e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka int num_stations; 1300e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct il_station_entry stations[IL_STATION_COUNT]; 1301e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka unsigned long ucode_key_table; 1302e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1303e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka /* queue refcounts */ 1304e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define IL_MAX_HW_QUEUES 32 1305e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka unsigned long queue_stopped[BITS_TO_LONGS(IL_MAX_HW_QUEUES)]; 1306e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka /* for each AC */ 1307e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka atomic_t queue_stop_count[4]; 1308e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1309e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka /* Indication if ieee80211_ops->open has been called */ 1310e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u8 is_open; 1311e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1312e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u8 mac80211_registered; 1313e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1314e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka /* eeprom -- this is in the card's little endian byte order */ 1315e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u8 *eeprom; 1316e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct il_eeprom_calib_info *calib_info; 1317e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1318e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka enum nl80211_iftype iw_mode; 1319e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1320e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka /* Last Rx'd beacon timestamp */ 1321e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u64 timestamp; 1322e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1323e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka union { 1324e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#if defined(CONFIG_IWL3945) || defined(CONFIG_IWL3945_MODULE) 1325e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct { 1326e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka void *shared_virt; 1327e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka dma_addr_t shared_phys; 1328e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1329e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct delayed_work thermal_periodic; 1330e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct delayed_work rfkill_poll; 1331e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1332e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct il3945_notif_stats stats; 1333e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#ifdef CONFIG_IWLEGACY_DEBUGFS 1334e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct il3945_notif_stats accum_stats; 1335e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct il3945_notif_stats delta_stats; 1336e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct il3945_notif_stats max_delta; 1337e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#endif 1338e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1339e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 sta_supp_rates; 1340e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka int last_rx_rssi; /* From Rx packet stats */ 1341e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1342e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka /* Rx'd packet timing information */ 1343e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 last_beacon_time; 1344e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u64 last_tsf; 1345e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1346e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka /* 1347e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * each calibration channel group in the 1348e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * EEPROM has a derived clip setting for 1349e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * each rate. 1350e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka */ 1351e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka const struct il3945_clip_group clip_groups[5]; 1352e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1353e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka } _3945; 1354e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#endif 1355e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#if defined(CONFIG_IWL4965) || defined(CONFIG_IWL4965_MODULE) 1356e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct { 1357e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct il_rx_phy_res last_phy_res; 1358e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka bool last_phy_res_valid; 1359e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1360e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct completion firmware_loading_complete; 1361e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1362e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka /* 1363e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * chain noise reset and gain commands are the 1364e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * two extra calibration commands follows the standard 1365e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * phy calibration commands 1366e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka */ 1367e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u8 phy_calib_chain_noise_reset_cmd; 1368e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u8 phy_calib_chain_noise_gain_cmd; 1369e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1370d735f9213d11e34e6ed074acea30b6743b3385e6Stanislaw Gruszka u8 key_mapping_keys; 1371d735f9213d11e34e6ed074acea30b6743b3385e6Stanislaw Gruszka struct il_wep_key wep_keys[WEP_KEYS_MAX]; 1372d735f9213d11e34e6ed074acea30b6743b3385e6Stanislaw Gruszka 1373e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct il_notif_stats stats; 1374e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#ifdef CONFIG_IWLEGACY_DEBUGFS 1375e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct il_notif_stats accum_stats; 1376e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct il_notif_stats delta_stats; 1377e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct il_notif_stats max_delta; 1378e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#endif 1379e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1380e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka } _4965; 1381e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#endif 1382e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka }; 1383e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1384e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct il_hw_params hw_params; 1385e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1386e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 inta_mask; 1387e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1388e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct workqueue_struct *workqueue; 1389e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1390e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct work_struct restart; 1391e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct work_struct scan_completed; 1392e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct work_struct rx_replenish; 1393e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct work_struct abort_scan; 1394e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 139583007196037cc2d0bffd9f7afbe56d675779a6cbStanislaw Gruszka bool beacon_enabled; 1396e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct sk_buff *beacon_skb; 1397e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1398e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct work_struct tx_flush; 1399e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1400e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct tasklet_struct irq_tasklet; 1401e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1402e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct delayed_work init_alive_start; 1403e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct delayed_work alive_start; 1404e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct delayed_work scan_check; 1405e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1406e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka /* TX Power */ 1407e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka s8 tx_power_user_lmt; 1408e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka s8 tx_power_device_lmt; 1409e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka s8 tx_power_next; 1410e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1411e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#ifdef CONFIG_IWLEGACY_DEBUG 1412e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka /* debugging info */ 1413e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u32 debug_level; /* per device debugging will override global 1414e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka il_debug_level if set */ 1415e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka#endif /* CONFIG_IWLEGACY_DEBUG */ 1416e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#ifdef CONFIG_IWLEGACY_DEBUGFS 1417e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka /* debugfs */ 1418e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u16 tx_traffic_idx; 1419e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u16 rx_traffic_idx; 1420e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u8 *tx_traffic; 1421e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u8 *rx_traffic; 1422e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct dentry *debugfs_dir; 1423e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 dbgfs_sram_offset, dbgfs_sram_len; 1424e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka bool disable_ht40; 1425e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka#endif /* CONFIG_IWLEGACY_DEBUGFS */ 1426e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1427e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct work_struct txpower_work; 1428e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 disable_sens_cal; 1429e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 disable_chain_noise_cal; 1430e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 disable_tx_power_cal; 1431e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct work_struct run_time_calib_work; 1432e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct timer_list stats_periodic; 1433e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct timer_list watchdog; 1434e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka bool hw_ready; 1435e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1436e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct led_classdev led; 1437e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka unsigned long blink_on, blink_off; 1438e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka bool led_registered; 1439e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka}; /*il_priv */ 1440e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1441e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkastatic inline void 1442e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkail_txq_ctx_activate(struct il_priv *il, int txq_id) 1443e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka{ 1444e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka set_bit(txq_id, &il->txq_ctx_active_msk); 1445e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka} 1446e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1447e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkastatic inline void 1448e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkail_txq_ctx_deactivate(struct il_priv *il, int txq_id) 1449e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka{ 1450e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka clear_bit(txq_id, &il->txq_ctx_active_msk); 1451e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka} 1452e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1453e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkastatic inline int 1454e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkail_is_associated(struct il_priv *il) 1455e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka{ 1456c8b03958d4b23dc48932ec095a391f3d6447e0e9Stanislaw Gruszka return (il->active.filter_flags & RXON_FILTER_ASSOC_MSK) ? 1 : 0; 1457e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka} 1458e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1459e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkastatic inline int 1460e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkail_is_any_associated(struct il_priv *il) 1461e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka{ 1462e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka return il_is_associated(il); 1463e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka} 1464e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1465e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkastatic inline int 1466e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkail_is_channel_valid(const struct il_channel_info *ch_info) 1467e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka{ 1468e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka if (ch_info == NULL) 1469e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka return 0; 1470e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka return (ch_info->flags & EEPROM_CHANNEL_VALID) ? 1 : 0; 1471e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka} 1472e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1473e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkastatic inline int 1474e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkail_is_channel_radar(const struct il_channel_info *ch_info) 1475e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka{ 1476e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka return (ch_info->flags & EEPROM_CHANNEL_RADAR) ? 1 : 0; 1477e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka} 1478e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1479e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkastatic inline u8 1480e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkail_is_channel_a_band(const struct il_channel_info *ch_info) 1481e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka{ 1482e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka return ch_info->band == IEEE80211_BAND_5GHZ; 1483e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka} 1484e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1485e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkastatic inline int 1486e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkail_is_channel_passive(const struct il_channel_info *ch) 1487e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka{ 1488e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka return (!(ch->flags & EEPROM_CHANNEL_ACTIVE)) ? 1 : 0; 1489e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka} 1490e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1491e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkastatic inline int 1492e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkail_is_channel_ibss(const struct il_channel_info *ch) 1493e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka{ 1494e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka return (ch->flags & EEPROM_CHANNEL_IBSS) ? 1 : 0; 1495e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka} 1496be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy 1497e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkastatic inline void 1498e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka__il_free_pages(struct il_priv *il, struct page *page) 1499e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka{ 1500e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka __free_pages(page, il->hw_params.rx_page_order); 1501e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka il->alloc_rxb_page--; 1502e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka} 1503e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1504e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkastatic inline void 1505e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkail_free_pages(struct il_priv *il, unsigned long page) 1506e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka{ 1507e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka free_pages(page, il->hw_params.rx_page_order); 1508e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka il->alloc_rxb_page--; 1509e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka} 1510be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy 1511be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy#define IWLWIFI_VERSION "in-tree:" 1512be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy#define DRV_COPYRIGHT "Copyright(c) 2003-2011 Intel Corporation" 1513be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy#define DRV_AUTHOR "<ilw@linux.intel.com>" 1514be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy 1515e2ebc8337d116acdc25469ec8547ae665f50a4c1Stanislaw Gruszka#define IL_PCI_DEVICE(dev, subdev, cfg) \ 1516be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy .vendor = PCI_VENDOR_ID_INTEL, .device = (dev), \ 1517be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy .subvendor = PCI_ANY_ID, .subdevice = (subdev), \ 1518be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy .driver_data = (kernel_ulong_t)&(cfg) 1519be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy 1520be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy#define TIME_UNIT 1024 1521be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy 1522e2ebc8337d116acdc25469ec8547ae665f50a4c1Stanislaw Gruszka#define IL_SKU_G 0x1 1523e2ebc8337d116acdc25469ec8547ae665f50a4c1Stanislaw Gruszka#define IL_SKU_A 0x2 1524e2ebc8337d116acdc25469ec8547ae665f50a4c1Stanislaw Gruszka#define IL_SKU_N 0x8 1525be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy 1526e2ebc8337d116acdc25469ec8547ae665f50a4c1Stanislaw Gruszka#define IL_CMD(x) case x: return #x 1527be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy 1528e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka/* Size of one Rx buffer in host DRAM */ 1529e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka#define IL_RX_BUF_SIZE_3K (3 * 1000) /* 3945 only */ 1530e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define IL_RX_BUF_SIZE_4K (4 * 1024) 1531e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define IL_RX_BUF_SIZE_8K (8 * 1024) 1532e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 15339b5e2f463ac6f53789bd5ce43d2bb4b4c01e8607Greg Dietsche#ifdef CONFIG_IWLEGACY_DEBUGFS 1534e2ebc8337d116acdc25469ec8547ae665f50a4c1Stanislaw Gruszkastruct il_debugfs_ops { 15351722f8e12a9c6117d872bd19ec5919460ccdfb4eStanislaw Gruszka ssize_t(*rx_stats_read) (struct file *file, char __user *user_buf, 15361722f8e12a9c6117d872bd19ec5919460ccdfb4eStanislaw Gruszka size_t count, loff_t *ppos); 15371722f8e12a9c6117d872bd19ec5919460ccdfb4eStanislaw Gruszka ssize_t(*tx_stats_read) (struct file *file, char __user *user_buf, 15381722f8e12a9c6117d872bd19ec5919460ccdfb4eStanislaw Gruszka size_t count, loff_t *ppos); 15391722f8e12a9c6117d872bd19ec5919460ccdfb4eStanislaw Gruszka ssize_t(*general_stats_read) (struct file *file, 15401722f8e12a9c6117d872bd19ec5919460ccdfb4eStanislaw Gruszka char __user *user_buf, size_t count, 15411722f8e12a9c6117d872bd19ec5919460ccdfb4eStanislaw Gruszka loff_t *ppos); 1542be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy}; 15439b5e2f463ac6f53789bd5ce43d2bb4b4c01e8607Greg Dietsche#endif 1544be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy 15451600b87542ce93e3dc094f6b108d8c2953e2ca0eStanislaw Gruszkastruct il_ops { 1546be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy /* Handling TX */ 15471722f8e12a9c6117d872bd19ec5919460ccdfb4eStanislaw Gruszka void (*txq_update_byte_cnt_tbl) (struct il_priv *il, 15481722f8e12a9c6117d872bd19ec5919460ccdfb4eStanislaw Gruszka struct il_tx_queue *txq, 1549e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u16 byte_cnt); 15501722f8e12a9c6117d872bd19ec5919460ccdfb4eStanislaw Gruszka int (*txq_attach_buf_to_tfd) (struct il_priv *il, 15511722f8e12a9c6117d872bd19ec5919460ccdfb4eStanislaw Gruszka struct il_tx_queue *txq, dma_addr_t addr, 1552e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u16 len, u8 reset, u8 pad); 15531722f8e12a9c6117d872bd19ec5919460ccdfb4eStanislaw Gruszka void (*txq_free_tfd) (struct il_priv *il, struct il_tx_queue *txq); 15541722f8e12a9c6117d872bd19ec5919460ccdfb4eStanislaw Gruszka int (*txq_init) (struct il_priv *il, struct il_tx_queue *txq); 1555be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy /* alive notification after init uCode load */ 15561722f8e12a9c6117d872bd19ec5919460ccdfb4eStanislaw Gruszka void (*init_alive_start) (struct il_priv *il); 1557be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy /* check validity of rtc data address */ 1558e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka int (*is_valid_rtc_data_addr) (u32 addr); 1559be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy /* 1st ucode load */ 15601722f8e12a9c6117d872bd19ec5919460ccdfb4eStanislaw Gruszka int (*load_ucode) (struct il_priv *il); 15611ba2f121f9e1d98dd838644f76fa23837dd28913Stanislaw Gruszka 15621722f8e12a9c6117d872bd19ec5919460ccdfb4eStanislaw Gruszka void (*dump_nic_error_log) (struct il_priv *il); 15631722f8e12a9c6117d872bd19ec5919460ccdfb4eStanislaw Gruszka int (*dump_fh) (struct il_priv *il, char **buf, bool display); 15641722f8e12a9c6117d872bd19ec5919460ccdfb4eStanislaw Gruszka int (*set_channel_switch) (struct il_priv *il, 15651722f8e12a9c6117d872bd19ec5919460ccdfb4eStanislaw Gruszka struct ieee80211_channel_switch *ch_switch); 1566be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy /* power management */ 1567f03ee2a87e21f76928c10d822639ec437113d312Stanislaw Gruszka int (*apm_init) (struct il_priv *il); 1568be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy 1569f03ee2a87e21f76928c10d822639ec437113d312Stanislaw Gruszka /* tx power */ 15701722f8e12a9c6117d872bd19ec5919460ccdfb4eStanislaw Gruszka int (*send_tx_power) (struct il_priv *il); 15711722f8e12a9c6117d872bd19ec5919460ccdfb4eStanislaw Gruszka void (*update_chain_flags) (struct il_priv *il); 1572be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy 157347ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka /* eeprom operations */ 1574a89268e8cdcd52680bda21ada05f2716c6466377Stanislaw Gruszka int (*eeprom_acquire_semaphore) (struct il_priv *il); 1575a89268e8cdcd52680bda21ada05f2716c6466377Stanislaw Gruszka void (*eeprom_release_semaphore) (struct il_priv *il); 1576be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy 1577c936355172a7e4aeadbbdcaae48f10e31f604899Stanislaw Gruszka int (*rxon_assoc) (struct il_priv *il); 1578c936355172a7e4aeadbbdcaae48f10e31f604899Stanislaw Gruszka int (*commit_rxon) (struct il_priv *il); 1579c936355172a7e4aeadbbdcaae48f10e31f604899Stanislaw Gruszka void (*set_rxon_chain) (struct il_priv *il); 1580c936355172a7e4aeadbbdcaae48f10e31f604899Stanislaw Gruszka 1581c936355172a7e4aeadbbdcaae48f10e31f604899Stanislaw Gruszka u16(*get_hcmd_size) (u8 cmd_id, u16 len); 1582c936355172a7e4aeadbbdcaae48f10e31f604899Stanislaw Gruszka u16(*build_addsta_hcmd) (const struct il_addsta_cmd *cmd, u8 *data); 1583c936355172a7e4aeadbbdcaae48f10e31f604899Stanislaw Gruszka 1584c936355172a7e4aeadbbdcaae48f10e31f604899Stanislaw Gruszka int (*request_scan) (struct il_priv *il, struct ieee80211_vif *vif); 1585c936355172a7e4aeadbbdcaae48f10e31f604899Stanislaw Gruszka void (*post_scan) (struct il_priv *il); 1586c936355172a7e4aeadbbdcaae48f10e31f604899Stanislaw Gruszka void (*post_associate) (struct il_priv *il); 1587c936355172a7e4aeadbbdcaae48f10e31f604899Stanislaw Gruszka void (*config_ap) (struct il_priv *il); 1588c936355172a7e4aeadbbdcaae48f10e31f604899Stanislaw Gruszka /* station management */ 1589c936355172a7e4aeadbbdcaae48f10e31f604899Stanislaw Gruszka int (*update_bcast_stations) (struct il_priv *il); 1590c936355172a7e4aeadbbdcaae48f10e31f604899Stanislaw Gruszka int (*manage_ibss_station) (struct il_priv *il, 1591c936355172a7e4aeadbbdcaae48f10e31f604899Stanislaw Gruszka struct ieee80211_vif *vif, bool add); 1592c936355172a7e4aeadbbdcaae48f10e31f604899Stanislaw Gruszka 1593c936355172a7e4aeadbbdcaae48f10e31f604899Stanislaw Gruszka int (*send_led_cmd) (struct il_priv *il, struct il_led_cmd *led_cmd); 1594be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy}; 1595be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy 1596e2ebc8337d116acdc25469ec8547ae665f50a4c1Stanislaw Gruszkastruct il_mod_params { 1597be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy int sw_crypto; /* def: 0 = using hardware encryption */ 1598be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy int disable_hw_scan; /* def: 0 = use h/w scan */ 1599be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy int num_of_queues; /* def: HW dependent */ 1600be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy int disable_11n; /* def: 0 = 11n capabilities enabled */ 1601be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy int amsdu_size_8K; /* def: 1 = enable 8K amsdu size */ 1602e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka int antenna; /* def: 0 = both antennas (use diversity) */ 1603be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy int restart_fw; /* def: 1 = restart firmware */ 1604be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy}; 1605be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy 160647ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka#define IL_LED_SOLID 11 160747ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka#define IL_DEF_LED_INTRVL cpu_to_le32(1000) 160847ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka 160947ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka#define IL_LED_ACTIVITY (0<<1) 161047ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka#define IL_LED_LINK (1<<1) 161147ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka 161247ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka/* 161347ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * LED mode 161447ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * IL_LED_DEFAULT: use device default 161547ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * IL_LED_RF_STATE: turn LED on/off based on RF state 161647ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * LED ON = RF ON 161747ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * LED OFF = RF OFF 161847ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka * IL_LED_BLINK: adjust led blink rate based on blink table 161947ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka */ 162047ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszkaenum il_led_mode { 162147ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka IL_LED_DEFAULT, 162247ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka IL_LED_RF_STATE, 162347ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka IL_LED_BLINK, 162447ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka}; 162547ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka 162647ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszkavoid il_leds_init(struct il_priv *il); 162747ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszkavoid il_leds_exit(struct il_priv *il); 162847ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka 1629be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy/** 1630e2ebc8337d116acdc25469ec8547ae665f50a4c1Stanislaw Gruszka * struct il_cfg 1631be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy * @fw_name_pre: Firmware filename prefix. The api version and extension 1632be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy * (.ucode) will be added to filename before loading from disk. The 1633be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy * filename is constructed as fw_name_pre<api>.ucode. 1634be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy * @ucode_api_max: Highest version of uCode API supported by driver. 1635be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy * @ucode_api_min: Lowest version of uCode API supported by driver. 1636be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy * @scan_antennas: available antenna for scan operation 1637be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy * @led_mode: 0=blinking, 1=On(RF On)/Off(RF Off) 1638be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy * 1639be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy * We enable the driver to be backward compatible wrt API version. The 1640be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy * driver specifies which APIs it supports (with @ucode_api_max being the 1641be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy * highest and @ucode_api_min the lowest). Firmware will only be loaded if 1642be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy * it has a supported API version. The firmware's API version will be 1643e2ebc8337d116acdc25469ec8547ae665f50a4c1Stanislaw Gruszka * stored in @il_priv, enabling the driver to make runtime changes based 1644be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy * on firmware version used. 1645be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy * 1646be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy * For example, 164746bc8d4b0e73ac75de323646d75a2333f47b84c3Stanislaw Gruszka * if (IL_UCODE_API(il->ucode_ver) >= 2) { 1648be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy * Driver interacts with Firmware API version >= 2. 1649be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy * } else { 1650be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy * Driver interacts with Firmware API version 1. 1651be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy * } 1652be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy * 1653be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy * The ideal usage of this infrastructure is to treat a new ucode API 1654be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy * release as a new hardware revision. That is, through utilizing the 1655e2ebc8337d116acdc25469ec8547ae665f50a4c1Stanislaw Gruszka * il_hcmd_utils_ops etc. we accommodate different command structures 1656be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy * and flows between hardware versions as well as their API 1657be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy * versions. 1658be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy * 1659be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy */ 1660e2ebc8337d116acdc25469ec8547ae665f50a4c1Stanislaw Gruszkastruct il_cfg { 1661be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy /* params specific to an individual device within a device family */ 1662be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy const char *name; 1663be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy const char *fw_name_pre; 1664be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy const unsigned int ucode_api_max; 1665be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy const unsigned int ucode_api_min; 1666e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u8 valid_tx_ant; 1667e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u8 valid_rx_ant; 1668be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy unsigned int sku; 1669e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u16 eeprom_ver; 1670e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u16 eeprom_calib_ver; 1671be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy /* module based parameters which can be set from modprobe cmd */ 1672e2ebc8337d116acdc25469ec8547ae665f50a4c1Stanislaw Gruszka const struct il_mod_params *mod_params; 1673be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy /* params not likely to change within a device family */ 1674e2ebc8337d116acdc25469ec8547ae665f50a4c1Stanislaw Gruszka struct il_base_params *base_params; 1675be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy /* params likely to change within a device family */ 1676be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy u8 scan_rx_antennas[IEEE80211_NUM_BANDS]; 1677e2ebc8337d116acdc25469ec8547ae665f50a4c1Stanislaw Gruszka enum il_led_mode led_mode; 167889ef1ed2d241d3dfe884055d8446a5dd94919e54Stanislaw Gruszka 167989ef1ed2d241d3dfe884055d8446a5dd94919e54Stanislaw Gruszka int eeprom_size; 168089ef1ed2d241d3dfe884055d8446a5dd94919e54Stanislaw Gruszka int num_of_queues; /* def: HW dependent */ 168189ef1ed2d241d3dfe884055d8446a5dd94919e54Stanislaw Gruszka int num_of_ampdu_queues; /* def: HW dependent */ 168289ef1ed2d241d3dfe884055d8446a5dd94919e54Stanislaw Gruszka /* for il_apm_init() */ 168389ef1ed2d241d3dfe884055d8446a5dd94919e54Stanislaw Gruszka u32 pll_cfg_val; 168489ef1ed2d241d3dfe884055d8446a5dd94919e54Stanislaw Gruszka bool set_l0s; 168589ef1ed2d241d3dfe884055d8446a5dd94919e54Stanislaw Gruszka bool use_bsm; 168689ef1ed2d241d3dfe884055d8446a5dd94919e54Stanislaw Gruszka 168789ef1ed2d241d3dfe884055d8446a5dd94919e54Stanislaw Gruszka u16 led_compensation; 168889ef1ed2d241d3dfe884055d8446a5dd94919e54Stanislaw Gruszka int chain_noise_num_beacons; 168989ef1ed2d241d3dfe884055d8446a5dd94919e54Stanislaw Gruszka unsigned int wd_timeout; 169089ef1ed2d241d3dfe884055d8446a5dd94919e54Stanislaw Gruszka bool temperature_kelvin; 169189ef1ed2d241d3dfe884055d8446a5dd94919e54Stanislaw Gruszka const bool ucode_tracing; 169289ef1ed2d241d3dfe884055d8446a5dd94919e54Stanislaw Gruszka const bool sensitivity_calib_by_driver; 169389ef1ed2d241d3dfe884055d8446a5dd94919e54Stanislaw Gruszka const bool chain_noise_calib_by_driver; 169493a984a4eec83f45abddb80724da7dcb85b4db6bStanislaw Gruszka 169593a984a4eec83f45abddb80724da7dcb85b4db6bStanislaw Gruszka const u32 regulatory_bands[7]; 1696be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy}; 1697be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy 1698be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy/*************************** 1699be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy * L i b * 1700be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy ***************************/ 1701be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy 1702e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkaint il_mac_conf_tx(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 1703e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u16 queue, const struct ieee80211_tx_queue_params *params); 1704e2ebc8337d116acdc25469ec8547ae665f50a4c1Stanislaw Gruszkaint il_mac_tx_last_beacon(struct ieee80211_hw *hw); 1705e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka 170683007196037cc2d0bffd9f7afbe56d675779a6cbStanislaw Gruszkavoid il_set_rxon_hwcrypto(struct il_priv *il, int hw_decrypt); 170783007196037cc2d0bffd9f7afbe56d675779a6cbStanislaw Gruszkaint il_check_rxon_cmd(struct il_priv *il); 170883007196037cc2d0bffd9f7afbe56d675779a6cbStanislaw Gruszkaint il_full_rxon_required(struct il_priv *il); 170983007196037cc2d0bffd9f7afbe56d675779a6cbStanislaw Gruszkaint il_set_rxon_channel(struct il_priv *il, struct ieee80211_channel *ch); 171083007196037cc2d0bffd9f7afbe56d675779a6cbStanislaw Gruszkavoid il_set_flags_for_band(struct il_priv *il, enum ieee80211_band band, 171183007196037cc2d0bffd9f7afbe56d675779a6cbStanislaw Gruszka struct ieee80211_vif *vif); 1712e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkau8 il_get_single_channel_number(struct il_priv *il, enum ieee80211_band band); 1713e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkavoid il_set_rxon_ht(struct il_priv *il, struct il_ht_config *ht_conf); 171483007196037cc2d0bffd9f7afbe56d675779a6cbStanislaw Gruszkabool il_is_ht40_tx_allowed(struct il_priv *il, 1715e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka struct ieee80211_sta_ht_cap *ht_cap); 171683007196037cc2d0bffd9f7afbe56d675779a6cbStanislaw Gruszkavoid il_connection_init_rx_config(struct il_priv *il); 171746bc8d4b0e73ac75de323646d75a2333f47b84c3Stanislaw Gruszkavoid il_set_rate(struct il_priv *il); 1718e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkaint il_set_decrypted_flag(struct il_priv *il, struct ieee80211_hdr *hdr, 1719e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u32 decrypt_res, struct ieee80211_rx_status *stats); 172046bc8d4b0e73ac75de323646d75a2333f47b84c3Stanislaw Gruszkavoid il_irq_handle_error(struct il_priv *il); 1721e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkaint il_mac_add_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif); 1722e2ebc8337d116acdc25469ec8547ae665f50a4c1Stanislaw Gruszkavoid il_mac_remove_interface(struct ieee80211_hw *hw, 1723e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka struct ieee80211_vif *vif); 1724e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkaint il_mac_change_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 1725e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka enum nl80211_iftype newtype, bool newp2p); 172646bc8d4b0e73ac75de323646d75a2333f47b84c3Stanislaw Gruszkaint il_alloc_txq_mem(struct il_priv *il); 17276668e4eb5030af96d2bde366b8f6614b34b8c96cStanislaw Gruszkavoid il_free_txq_mem(struct il_priv *il); 1728be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy 1729d31751679897441d89e6ae59da98f1424b3f7dfeStanislaw Gruszka#ifdef CONFIG_IWLEGACY_DEBUGFS 1730288f9954132cd64f60fbb8051e31d62d8c35875fStanislaw Gruszkaextern void il_update_stats(struct il_priv *il, bool is_tx, __le16 fc, u16 len); 1731be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy#else 1732e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkastatic inline void 1733e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkail_update_stats(struct il_priv *il, bool is_tx, __le16 fc, u16 len) 1734be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy{ 1735be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy} 1736be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy#endif 1737288f9954132cd64f60fbb8051e31d62d8c35875fStanislaw Gruszka 1738be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy/***************************************************** 1739288f9954132cd64f60fbb8051e31d62d8c35875fStanislaw Gruszka * Handlers 1740288f9954132cd64f60fbb8051e31d62d8c35875fStanislaw Gruszka ***************************************************/ 1741e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkavoid il_hdl_pm_sleep(struct il_priv *il, struct il_rx_buf *rxb); 1742e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkavoid il_hdl_pm_debug_stats(struct il_priv *il, struct il_rx_buf *rxb); 1743e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkavoid il_hdl_error(struct il_priv *il, struct il_rx_buf *rxb); 1744288f9954132cd64f60fbb8051e31d62d8c35875fStanislaw Gruszkavoid il_hdl_csa(struct il_priv *il, struct il_rx_buf *rxb); 1745be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy 1746be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy/***************************************************** 1747be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy* RX 1748be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy******************************************************/ 174946bc8d4b0e73ac75de323646d75a2333f47b84c3Stanislaw Gruszkavoid il_cmd_queue_unmap(struct il_priv *il); 175046bc8d4b0e73ac75de323646d75a2333f47b84c3Stanislaw Gruszkavoid il_cmd_queue_free(struct il_priv *il); 175146bc8d4b0e73ac75de323646d75a2333f47b84c3Stanislaw Gruszkaint il_rx_queue_alloc(struct il_priv *il); 1752e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkavoid il_rx_queue_update_write_ptr(struct il_priv *il, struct il_rx_queue *q); 1753e2ebc8337d116acdc25469ec8547ae665f50a4c1Stanislaw Gruszkaint il_rx_queue_space(const struct il_rx_queue *q); 1754e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkavoid il_tx_cmd_complete(struct il_priv *il, struct il_rx_buf *rxb); 1755288f9954132cd64f60fbb8051e31d62d8c35875fStanislaw Gruszka 1756e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkavoid il_hdl_spectrum_measurement(struct il_priv *il, struct il_rx_buf *rxb); 1757e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkavoid il_recover_from_stats(struct il_priv *il, struct il_rx_pkt *pkt); 175846bc8d4b0e73ac75de323646d75a2333f47b84c3Stanislaw Gruszkavoid il_chswitch_done(struct il_priv *il, bool is_success); 1759be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy 1760be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy/***************************************************** 1761be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy* TX 1762be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy******************************************************/ 1763d87c771f47460f7ca943942d508f2b9bd223a7e0Stanislaw Gruszkaextern void il_txq_update_write_ptr(struct il_priv *il, struct il_tx_queue *txq); 1764d87c771f47460f7ca943942d508f2b9bd223a7e0Stanislaw Gruszkaextern int il_tx_queue_init(struct il_priv *il, u32 txq_id); 1765d87c771f47460f7ca943942d508f2b9bd223a7e0Stanislaw Gruszkaextern void il_tx_queue_reset(struct il_priv *il, u32 txq_id); 1766d87c771f47460f7ca943942d508f2b9bd223a7e0Stanislaw Gruszkaextern void il_tx_queue_unmap(struct il_priv *il, int txq_id); 1767d87c771f47460f7ca943942d508f2b9bd223a7e0Stanislaw Gruszkaextern void il_tx_queue_free(struct il_priv *il, int txq_id); 1768d87c771f47460f7ca943942d508f2b9bd223a7e0Stanislaw Gruszkaextern void il_setup_watchdog(struct il_priv *il); 1769be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy/***************************************************** 1770be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy * TX power 1771be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy ****************************************************/ 177246bc8d4b0e73ac75de323646d75a2333f47b84c3Stanislaw Gruszkaint il_set_tx_power(struct il_priv *il, s8 tx_power, bool force); 1773be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy 1774be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy/******************************************************************************* 1775be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy * Rate 1776be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy ******************************************************************************/ 1777be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy 177883007196037cc2d0bffd9f7afbe56d675779a6cbStanislaw Gruszkau8 il_get_lowest_plcp(struct il_priv *il); 1779be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy 1780be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy/******************************************************************************* 1781be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy * Scanning 1782be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy ******************************************************************************/ 178346bc8d4b0e73ac75de323646d75a2333f47b84c3Stanislaw Gruszkavoid il_init_scan_params(struct il_priv *il); 178446bc8d4b0e73ac75de323646d75a2333f47b84c3Stanislaw Gruszkaint il_scan_cancel(struct il_priv *il); 178546bc8d4b0e73ac75de323646d75a2333f47b84c3Stanislaw Gruszkaint il_scan_cancel_timeout(struct il_priv *il, unsigned long ms); 178646bc8d4b0e73ac75de323646d75a2333f47b84c3Stanislaw Gruszkavoid il_force_scan_end(struct il_priv *il); 1787e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkaint il_mac_hw_scan(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 1788e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka struct cfg80211_scan_request *req); 178946bc8d4b0e73ac75de323646d75a2333f47b84c3Stanislaw Gruszkavoid il_internal_short_hw_scan(struct il_priv *il); 179046bc8d4b0e73ac75de323646d75a2333f47b84c3Stanislaw Gruszkaint il_force_reset(struct il_priv *il, bool external); 1791e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkau16 il_fill_probe_req(struct il_priv *il, struct ieee80211_mgmt *frame, 17921722f8e12a9c6117d872bd19ec5919460ccdfb4eStanislaw Gruszka const u8 *ta, const u8 *ie, int ie_len, int left); 179346bc8d4b0e73ac75de323646d75a2333f47b84c3Stanislaw Gruszkavoid il_setup_rx_scan_handlers(struct il_priv *il); 1794e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkau16 il_get_active_dwell_time(struct il_priv *il, enum ieee80211_band band, 1795e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u8 n_probes); 1796e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkau16 il_get_passive_dwell_time(struct il_priv *il, enum ieee80211_band band, 1797e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka struct ieee80211_vif *vif); 179846bc8d4b0e73ac75de323646d75a2333f47b84c3Stanislaw Gruszkavoid il_setup_scan_deferred_work(struct il_priv *il); 179946bc8d4b0e73ac75de323646d75a2333f47b84c3Stanislaw Gruszkavoid il_cancel_scan_deferred_work(struct il_priv *il); 1800be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy 1801be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy/* For faster active scanning, scan will move to the next channel if fewer than 1802be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy * PLCP_QUIET_THRESH packets are heard on this channel within 1803be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy * ACTIVE_QUIET_TIME after sending probe request. This shortens the dwell 1804be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy * time if it's a quiet channel (nothing responded to our probe, and there's 1805be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy * no other traffic). 1806be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy * Disable "quiet" feature by setting PLCP_QUIET_THRESH to 0. */ 1807e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka#define IL_ACTIVE_QUIET_TIME cpu_to_le16(10) /* msec */ 1808e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka#define IL_PLCP_QUIET_THRESH cpu_to_le16(1) /* packets */ 1809be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy 1810e2ebc8337d116acdc25469ec8547ae665f50a4c1Stanislaw Gruszka#define IL_SCAN_CHECK_WATCHDOG (HZ * 7) 1811be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy 1812be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy/***************************************************** 1813be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy * S e n d i n g H o s t C o m m a n d s * 1814be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy *****************************************************/ 1815be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy 1816e2ebc8337d116acdc25469ec8547ae665f50a4c1Stanislaw Gruszkaconst char *il_get_cmd_string(u8 cmd); 1817e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkaint __must_check il_send_cmd_sync(struct il_priv *il, struct il_host_cmd *cmd); 181846bc8d4b0e73ac75de323646d75a2333f47b84c3Stanislaw Gruszkaint il_send_cmd(struct il_priv *il, struct il_host_cmd *cmd); 1819e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkaint __must_check il_send_cmd_pdu(struct il_priv *il, u8 id, u16 len, 1820e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka const void *data); 1821e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkaint il_send_cmd_pdu_async(struct il_priv *il, u8 id, u16 len, const void *data, 18221722f8e12a9c6117d872bd19ec5919460ccdfb4eStanislaw Gruszka void (*callback) (struct il_priv *il, 18231722f8e12a9c6117d872bd19ec5919460ccdfb4eStanislaw Gruszka struct il_device_cmd *cmd, 18241722f8e12a9c6117d872bd19ec5919460ccdfb4eStanislaw Gruszka struct il_rx_pkt *pkt)); 1825be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy 182646bc8d4b0e73ac75de323646d75a2333f47b84c3Stanislaw Gruszkaint il_enqueue_hcmd(struct il_priv *il, struct il_host_cmd *cmd); 1827be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy 1828be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy/***************************************************** 1829be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy * PCI * 1830be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy *****************************************************/ 1831be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy 1832e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkastatic inline u16 1833e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkail_pcie_link_ctl(struct il_priv *il) 1834be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy{ 1835be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy int pos; 1836be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy u16 pci_lnk_ctl; 183746bc8d4b0e73ac75de323646d75a2333f47b84c3Stanislaw Gruszka pos = pci_pcie_cap(il->pci_dev); 183846bc8d4b0e73ac75de323646d75a2333f47b84c3Stanislaw Gruszka pci_read_config_word(il->pci_dev, pos + PCI_EXP_LNKCTL, &pci_lnk_ctl); 1839be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy return pci_lnk_ctl; 1840be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy} 1841be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy 1842e2ebc8337d116acdc25469ec8547ae665f50a4c1Stanislaw Gruszkavoid il_bg_watchdog(unsigned long data); 1843e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkau32 il_usecs_to_beacons(struct il_priv *il, u32 usec, u32 beacon_interval); 1844e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka__le32 il_add_beacon_time(struct il_priv *il, u32 base, u32 addon, 1845e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u32 beacon_interval); 1846be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy 1847be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy#ifdef CONFIG_PM 1848e2ebc8337d116acdc25469ec8547ae665f50a4c1Stanislaw Gruszkaint il_pci_suspend(struct device *device); 1849e2ebc8337d116acdc25469ec8547ae665f50a4c1Stanislaw Gruszkaint il_pci_resume(struct device *device); 1850e2ebc8337d116acdc25469ec8547ae665f50a4c1Stanislaw Gruszkaextern const struct dev_pm_ops il_pm_ops; 1851be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy 1852e2ebc8337d116acdc25469ec8547ae665f50a4c1Stanislaw Gruszka#define IL_LEGACY_PM_OPS (&il_pm_ops) 1853be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy 1854be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy#else /* !CONFIG_PM */ 1855be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy 1856e2ebc8337d116acdc25469ec8547ae665f50a4c1Stanislaw Gruszka#define IL_LEGACY_PM_OPS NULL 1857be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy 1858be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy#endif /* !CONFIG_PM */ 1859be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy 1860be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy/***************************************************** 1861be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy* Error Handling Debugging 1862be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy******************************************************/ 186346bc8d4b0e73ac75de323646d75a2333f47b84c3Stanislaw Gruszkavoid il4965_dump_nic_error_log(struct il_priv *il); 1864d31751679897441d89e6ae59da98f1424b3f7dfeStanislaw Gruszka#ifdef CONFIG_IWLEGACY_DEBUG 186583007196037cc2d0bffd9f7afbe56d675779a6cbStanislaw Gruszkavoid il_print_rx_config_cmd(struct il_priv *il); 1866be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy#else 1867e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkastatic inline void 186883007196037cc2d0bffd9f7afbe56d675779a6cbStanislaw Gruszkail_print_rx_config_cmd(struct il_priv *il) 1869be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy{ 1870be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy} 1871be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy#endif 1872be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy 187346bc8d4b0e73ac75de323646d75a2333f47b84c3Stanislaw Gruszkavoid il_clear_isr_stats(struct il_priv *il); 1874be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy 1875be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy/***************************************************** 1876be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy* GEOS 1877be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy******************************************************/ 187846bc8d4b0e73ac75de323646d75a2333f47b84c3Stanislaw Gruszkaint il_init_geos(struct il_priv *il); 187946bc8d4b0e73ac75de323646d75a2333f47b84c3Stanislaw Gruszkavoid il_free_geos(struct il_priv *il); 1880be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy 1881be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy/*************** DRIVER STATUS FUNCTIONS *****/ 1882be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy 1883a6766ccdaf9cc80d565672516d429a562d1a732dStanislaw Gruszka#define S_HCMD_ACTIVE 0 /* host command in progress */ 1884a6766ccdaf9cc80d565672516d429a562d1a732dStanislaw Gruszka/* 1 is unused (used to be S_HCMD_SYNC_ACTIVE) */ 1885a6766ccdaf9cc80d565672516d429a562d1a732dStanislaw Gruszka#define S_INT_ENABLED 2 1886bc269a8e2701aaa6c53553eaef9f0866ef03e703Stanislaw Gruszka#define S_RFKILL 3 1887a6766ccdaf9cc80d565672516d429a562d1a732dStanislaw Gruszka#define S_CT_KILL 4 1888a6766ccdaf9cc80d565672516d429a562d1a732dStanislaw Gruszka#define S_INIT 5 1889a6766ccdaf9cc80d565672516d429a562d1a732dStanislaw Gruszka#define S_ALIVE 6 1890a6766ccdaf9cc80d565672516d429a562d1a732dStanislaw Gruszka#define S_READY 7 1891a6766ccdaf9cc80d565672516d429a562d1a732dStanislaw Gruszka#define S_TEMPERATURE 8 1892a6766ccdaf9cc80d565672516d429a562d1a732dStanislaw Gruszka#define S_GEO_CONFIGURED 9 1893a6766ccdaf9cc80d565672516d429a562d1a732dStanislaw Gruszka#define S_EXIT_PENDING 10 1894db7746f78cab25ee39dd20f61d9b2e6b5993d8faStanislaw Gruszka#define S_STATS 12 1895a6766ccdaf9cc80d565672516d429a562d1a732dStanislaw Gruszka#define S_SCANNING 13 1896a6766ccdaf9cc80d565672516d429a562d1a732dStanislaw Gruszka#define S_SCAN_ABORTING 14 1897a6766ccdaf9cc80d565672516d429a562d1a732dStanislaw Gruszka#define S_SCAN_HW 15 1898a6766ccdaf9cc80d565672516d429a562d1a732dStanislaw Gruszka#define S_POWER_PMI 16 1899a6766ccdaf9cc80d565672516d429a562d1a732dStanislaw Gruszka#define S_FW_ERROR 17 1900a6766ccdaf9cc80d565672516d429a562d1a732dStanislaw Gruszka#define S_CHANNEL_SWITCH_PENDING 18 1901be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy 1902e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkastatic inline int 1903e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkail_is_ready(struct il_priv *il) 1904be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy{ 1905be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy /* The adapter is 'ready' if READY and GEO_CONFIGURED bits are 1906be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy * set but EXIT_PENDING is not */ 1907a6766ccdaf9cc80d565672516d429a562d1a732dStanislaw Gruszka return test_bit(S_READY, &il->status) && 1908e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka test_bit(S_GEO_CONFIGURED, &il->status) && 1909e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka !test_bit(S_EXIT_PENDING, &il->status); 1910be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy} 1911be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy 1912e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkastatic inline int 1913e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkail_is_alive(struct il_priv *il) 1914be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy{ 1915a6766ccdaf9cc80d565672516d429a562d1a732dStanislaw Gruszka return test_bit(S_ALIVE, &il->status); 1916be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy} 1917be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy 1918e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkastatic inline int 1919e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkail_is_init(struct il_priv *il) 1920be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy{ 1921a6766ccdaf9cc80d565672516d429a562d1a732dStanislaw Gruszka return test_bit(S_INIT, &il->status); 1922be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy} 1923be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy 1924e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkastatic inline int 1925e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkail_is_rfkill(struct il_priv *il) 1926be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy{ 19274e3bc141d480661634d0fadad7dbb1ddde70b4d4Stanislaw Gruszka return test_bit(S_RFKILL, &il->status); 1928be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy} 1929be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy 1930e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkastatic inline int 1931e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkail_is_ctkill(struct il_priv *il) 1932be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy{ 1933a6766ccdaf9cc80d565672516d429a562d1a732dStanislaw Gruszka return test_bit(S_CT_KILL, &il->status); 1934be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy} 1935be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy 1936e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkastatic inline int 1937e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkail_is_ready_rf(struct il_priv *il) 1938be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy{ 1939be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy 194046bc8d4b0e73ac75de323646d75a2333f47b84c3Stanislaw Gruszka if (il_is_rfkill(il)) 1941be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy return 0; 1942be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy 194346bc8d4b0e73ac75de323646d75a2333f47b84c3Stanislaw Gruszka return il_is_ready(il); 1944be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy} 1945be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy 194646bc8d4b0e73ac75de323646d75a2333f47b84c3Stanislaw Gruszkaextern void il_send_bt_config(struct il_priv *il); 1947e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkaextern int il_send_stats_request(struct il_priv *il, u8 flags, bool clear); 1948775ed8abde9420afc955ca7540aacdce721be6c1Stanislaw Gruszkaextern void il_apm_stop(struct il_priv *il); 1949775ed8abde9420afc955ca7540aacdce721be6c1Stanislaw Gruszkaextern void _il_apm_stop(struct il_priv *il); 1950775ed8abde9420afc955ca7540aacdce721be6c1Stanislaw Gruszka 195146bc8d4b0e73ac75de323646d75a2333f47b84c3Stanislaw Gruszkaint il_apm_init(struct il_priv *il); 1952be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy 195383007196037cc2d0bffd9f7afbe56d675779a6cbStanislaw Gruszkaint il_send_rxon_timing(struct il_priv *il); 195483007196037cc2d0bffd9f7afbe56d675779a6cbStanislaw Gruszka 1955e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkastatic inline int 195683007196037cc2d0bffd9f7afbe56d675779a6cbStanislaw Gruszkail_send_rxon_assoc(struct il_priv *il) 1957be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy{ 1958c936355172a7e4aeadbbdcaae48f10e31f604899Stanislaw Gruszka return il->ops->rxon_assoc(il); 1959be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy} 1960e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka 1961e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkastatic inline int 196283007196037cc2d0bffd9f7afbe56d675779a6cbStanislaw Gruszkail_commit_rxon(struct il_priv *il) 1963be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy{ 1964c936355172a7e4aeadbbdcaae48f10e31f604899Stanislaw Gruszka return il->ops->commit_rxon(il); 1965be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy} 1966e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka 1967e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkastatic inline const struct ieee80211_supported_band * 1968e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkail_get_hw_mode(struct il_priv *il, enum ieee80211_band band) 1969be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy{ 197046bc8d4b0e73ac75de323646d75a2333f47b84c3Stanislaw Gruszka return il->hw->wiphy->bands[band]; 1971be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy} 1972be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy 1973be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy/* mac80211 handlers */ 1974e2ebc8337d116acdc25469ec8547ae665f50a4c1Stanislaw Gruszkaint il_mac_config(struct ieee80211_hw *hw, u32 changed); 1975e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkavoid il_mac_reset_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif); 1976e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkavoid il_mac_bss_info_changed(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 1977e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka struct ieee80211_bss_conf *bss_conf, u32 changes); 1978e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkavoid il_tx_cmd_protection(struct il_priv *il, struct ieee80211_tx_info *info, 19791722f8e12a9c6117d872bd19ec5919460ccdfb4eStanislaw Gruszka __le16 fc, __le32 *tx_flags); 1980be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy 1981e2ebc8337d116acdc25469ec8547ae665f50a4c1Stanislaw Gruszkairqreturn_t il_isr(int irq, void *data); 1982be663ab67077fac8e23eb8e231a8c1c94cb32e54Wey-Yi Guy 198317d4eca6432bb1d4753d7894b824271673a1640aStanislaw Gruszkaextern void il_set_bit(struct il_priv *p, u32 r, u32 m); 198417d4eca6432bb1d4753d7894b824271673a1640aStanislaw Gruszkaextern void il_clear_bit(struct il_priv *p, u32 r, u32 m); 19851e0f32a43ae652eaa5b23dc06852938555cb8da1Stanislaw Gruszkaextern bool _il_grab_nic_access(struct il_priv *il); 198617d4eca6432bb1d4753d7894b824271673a1640aStanislaw Gruszkaextern int _il_poll_bit(struct il_priv *il, u32 addr, u32 bits, u32 mask, int timeout); 198717d4eca6432bb1d4753d7894b824271673a1640aStanislaw Gruszkaextern int il_poll_bit(struct il_priv *il, u32 addr, u32 mask, int timeout); 198817d4eca6432bb1d4753d7894b824271673a1640aStanislaw Gruszkaextern u32 il_rd_prph(struct il_priv *il, u32 reg); 198917d4eca6432bb1d4753d7894b824271673a1640aStanislaw Gruszkaextern void il_wr_prph(struct il_priv *il, u32 addr, u32 val); 199017d4eca6432bb1d4753d7894b824271673a1640aStanislaw Gruszkaextern u32 il_read_targ_mem(struct il_priv *il, u32 addr); 199117d4eca6432bb1d4753d7894b824271673a1640aStanislaw Gruszkaextern void il_write_targ_mem(struct il_priv *il, u32 addr, u32 val); 1992e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 1993e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkastatic inline void 1994e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka_il_write8(struct il_priv *il, u32 ofs, u8 val) 1995e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka{ 1996a5f16137ab8aff1208d3ea013033d0d38f15a61fStanislaw Gruszka writeb(val, il->hw_base + ofs); 1997e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka} 1998e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define il_write8(il, ofs, val) _il_write8(il, ofs, val) 1999e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 2000e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkastatic inline void 2001e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka_il_wr(struct il_priv *il, u32 ofs, u32 val) 2002e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka{ 2003a5f16137ab8aff1208d3ea013033d0d38f15a61fStanislaw Gruszka writel(val, il->hw_base + ofs); 2004e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka} 2005e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 2006e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkastatic inline u32 2007e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka_il_rd(struct il_priv *il, u32 ofs) 2008e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka{ 2009a5f16137ab8aff1208d3ea013033d0d38f15a61fStanislaw Gruszka return readl(il->hw_base + ofs); 2010e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka} 2011e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 2012e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkastatic inline void 2013e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka_il_clear_bit(struct il_priv *il, u32 reg, u32 mask) 2014e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka{ 2015e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka _il_wr(il, reg, _il_rd(il, reg) & ~mask); 2016e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka} 2017e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 2018e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkastatic inline void 201917d4eca6432bb1d4753d7894b824271673a1640aStanislaw Gruszka_il_set_bit(struct il_priv *il, u32 reg, u32 mask) 2020e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka{ 202117d4eca6432bb1d4753d7894b824271673a1640aStanislaw Gruszka _il_wr(il, reg, _il_rd(il, reg) | mask); 2022e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka} 2023e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 2024e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkastatic inline void 2025e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka_il_release_nic_access(struct il_priv *il) 2026e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka{ 2027e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka _il_clear_bit(il, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ); 20284e5ea2088b699ae86ffd96b53b916a3966535fcbStanislaw Gruszka /* 20294e5ea2088b699ae86ffd96b53b916a3966535fcbStanislaw Gruszka * In above we are reading CSR_GP_CNTRL register, what will flush any 20304e5ea2088b699ae86ffd96b53b916a3966535fcbStanislaw Gruszka * previous writes, but still want write, which clear MAC_ACCESS_REQ 20314e5ea2088b699ae86ffd96b53b916a3966535fcbStanislaw Gruszka * bit, be performed on PCI bus before any other writes scheduled on 20324e5ea2088b699ae86ffd96b53b916a3966535fcbStanislaw Gruszka * different CPUs (after we drop reg_lock). 20334e5ea2088b699ae86ffd96b53b916a3966535fcbStanislaw Gruszka */ 20344e5ea2088b699ae86ffd96b53b916a3966535fcbStanislaw Gruszka mmiowb(); 2035e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka} 2036e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 2037e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkastatic inline u32 2038e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkail_rd(struct il_priv *il, u32 reg) 2039e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka{ 2040e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 value; 2041e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka unsigned long reg_flags; 2042e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 2043e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka spin_lock_irqsave(&il->reg_lock, reg_flags); 2044e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka _il_grab_nic_access(il); 2045e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka value = _il_rd(il, reg); 2046e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka _il_release_nic_access(il); 2047e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka spin_unlock_irqrestore(&il->reg_lock, reg_flags); 2048e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka return value; 2049e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka} 2050e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 2051e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkastatic inline void 2052e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkail_wr(struct il_priv *il, u32 reg, u32 value) 2053e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka{ 2054e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka unsigned long reg_flags; 2055e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 2056e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka spin_lock_irqsave(&il->reg_lock, reg_flags); 20571e0f32a43ae652eaa5b23dc06852938555cb8da1Stanislaw Gruszka if (likely(_il_grab_nic_access(il))) { 2058e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka _il_wr(il, reg, value); 2059e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka _il_release_nic_access(il); 2060e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka } 2061e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka spin_unlock_irqrestore(&il->reg_lock, reg_flags); 2062e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka} 2063e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 2064e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkastatic inline u32 2065e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka_il_rd_prph(struct il_priv *il, u32 reg) 2066e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka{ 2067e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka _il_wr(il, HBUS_TARG_PRPH_RADDR, reg | (3 << 24)); 2068e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka return _il_rd(il, HBUS_TARG_PRPH_RDAT); 2069e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka} 2070e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 2071e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkastatic inline void 2072e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka_il_wr_prph(struct il_priv *il, u32 addr, u32 val) 2073e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka{ 2074e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka _il_wr(il, HBUS_TARG_PRPH_WADDR, ((addr & 0x0000FFFF) | (3 << 24))); 2075e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka _il_wr(il, HBUS_TARG_PRPH_WDAT, val); 2076e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka} 2077e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 2078e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkastatic inline void 2079e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkail_set_bits_prph(struct il_priv *il, u32 reg, u32 mask) 2080e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka{ 2081e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka unsigned long reg_flags; 2082e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 2083e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka spin_lock_irqsave(&il->reg_lock, reg_flags); 20841e0f32a43ae652eaa5b23dc06852938555cb8da1Stanislaw Gruszka if (likely(_il_grab_nic_access(il))) { 20851e0f32a43ae652eaa5b23dc06852938555cb8da1Stanislaw Gruszka _il_wr_prph(il, reg, (_il_rd_prph(il, reg) | mask)); 20861e0f32a43ae652eaa5b23dc06852938555cb8da1Stanislaw Gruszka _il_release_nic_access(il); 20871e0f32a43ae652eaa5b23dc06852938555cb8da1Stanislaw Gruszka } 2088e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka spin_unlock_irqrestore(&il->reg_lock, reg_flags); 2089e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka} 2090e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 2091e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkastatic inline void 2092e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkail_set_bits_mask_prph(struct il_priv *il, u32 reg, u32 bits, u32 mask) 2093e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka{ 2094e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka unsigned long reg_flags; 2095e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 2096e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka spin_lock_irqsave(&il->reg_lock, reg_flags); 20971e0f32a43ae652eaa5b23dc06852938555cb8da1Stanislaw Gruszka if (likely(_il_grab_nic_access(il))) { 20981e0f32a43ae652eaa5b23dc06852938555cb8da1Stanislaw Gruszka _il_wr_prph(il, reg, ((_il_rd_prph(il, reg) & mask) | bits)); 20991e0f32a43ae652eaa5b23dc06852938555cb8da1Stanislaw Gruszka _il_release_nic_access(il); 21001e0f32a43ae652eaa5b23dc06852938555cb8da1Stanislaw Gruszka } 2101e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka spin_unlock_irqrestore(&il->reg_lock, reg_flags); 2102e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka} 2103e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 2104e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkastatic inline void 2105e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkail_clear_bits_prph(struct il_priv *il, u32 reg, u32 mask) 2106e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka{ 2107e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka unsigned long reg_flags; 2108e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u32 val; 2109e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 2110e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka spin_lock_irqsave(&il->reg_lock, reg_flags); 21111e0f32a43ae652eaa5b23dc06852938555cb8da1Stanislaw Gruszka if (likely(_il_grab_nic_access(il))) { 21121e0f32a43ae652eaa5b23dc06852938555cb8da1Stanislaw Gruszka val = _il_rd_prph(il, reg); 21131e0f32a43ae652eaa5b23dc06852938555cb8da1Stanislaw Gruszka _il_wr_prph(il, reg, (val & ~mask)); 21141e0f32a43ae652eaa5b23dc06852938555cb8da1Stanislaw Gruszka _il_release_nic_access(il); 21151e0f32a43ae652eaa5b23dc06852938555cb8da1Stanislaw Gruszka } 2116e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka spin_unlock_irqrestore(&il->reg_lock, reg_flags); 2117e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka} 2118e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 2119e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define HW_KEY_DYNAMIC 0 2120e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define HW_KEY_DEFAULT 1 2121e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 2122e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka#define IL_STA_DRIVER_ACTIVE BIT(0) /* driver entry is active */ 2123e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka#define IL_STA_UCODE_ACTIVE BIT(1) /* ucode entry is active */ 2124e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka#define IL_STA_UCODE_INPROGRESS BIT(2) /* ucode entry is in process of 2125e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka being activated */ 2126e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka#define IL_STA_LOCAL BIT(3) /* station state not directed by mac80211; 2127e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka (this is for the IBSS BSSID stations) */ 2128e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka#define IL_STA_BCAST BIT(4) /* this station is the special bcast station */ 2129e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 213083007196037cc2d0bffd9f7afbe56d675779a6cbStanislaw Gruszkavoid il_restore_stations(struct il_priv *il); 213183007196037cc2d0bffd9f7afbe56d675779a6cbStanislaw Gruszkavoid il_clear_ucode_stations(struct il_priv *il); 2132e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkavoid il_dealloc_bcast_stations(struct il_priv *il); 2133e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkaint il_get_free_ucode_key_idx(struct il_priv *il); 2134e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkaint il_send_add_sta(struct il_priv *il, struct il_addsta_cmd *sta, u8 flags); 213583007196037cc2d0bffd9f7afbe56d675779a6cbStanislaw Gruszkaint il_add_station_common(struct il_priv *il, const u8 *addr, bool is_ap, 21361722f8e12a9c6117d872bd19ec5919460ccdfb4eStanislaw Gruszka struct ieee80211_sta *sta, u8 *sta_id_r); 2137e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkaint il_remove_station(struct il_priv *il, const u8 sta_id, const u8 * addr); 2138e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkaint il_mac_sta_remove(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 2139e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka struct ieee80211_sta *sta); 2140e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka 214183007196037cc2d0bffd9f7afbe56d675779a6cbStanislaw Gruszkau8 il_prep_station(struct il_priv *il, const u8 *addr, bool is_ap, 214283007196037cc2d0bffd9f7afbe56d675779a6cbStanislaw Gruszka struct ieee80211_sta *sta); 2143e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka 214483007196037cc2d0bffd9f7afbe56d675779a6cbStanislaw Gruszkaint il_send_lq_cmd(struct il_priv *il, struct il_link_quality_cmd *lq, 214583007196037cc2d0bffd9f7afbe56d675779a6cbStanislaw Gruszka u8 flags, bool init); 2146e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 2147e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka/** 2148e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * il_clear_driver_stations - clear knowledge of all stations from driver 2149e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @il: iwl il struct 2150e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * 2151e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * This is called during il_down() to make sure that in the case 2152e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * we're coming there from a hardware restart mac80211 will be 2153e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * able to reconfigure stations -- if we're getting there in the 2154e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * normal down flow then the stations will already be cleared. 2155e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka */ 2156e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkastatic inline void 2157e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkail_clear_driver_stations(struct il_priv *il) 2158e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka{ 2159e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka unsigned long flags; 2160e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 2161e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka spin_lock_irqsave(&il->sta_lock, flags); 2162e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka memset(il->stations, 0, sizeof(il->stations)); 2163e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka il->num_stations = 0; 2164e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka il->ucode_key_table = 0; 2165e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka spin_unlock_irqrestore(&il->sta_lock, flags); 2166e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka} 2167e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 2168e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkastatic inline int 2169e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkail_sta_id(struct ieee80211_sta *sta) 2170e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka{ 2171e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka if (WARN_ON(!sta)) 2172e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka return IL_INVALID_STATION; 2173e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 2174e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka return ((struct il_station_priv_common *)sta->drv_priv)->sta_id; 2175e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka} 2176e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 2177e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka/** 2178e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * il_sta_id_or_broadcast - return sta_id or broadcast sta 2179e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @il: iwl il 2180e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @context: the current context 2181e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @sta: mac80211 station 2182e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * 2183e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * In certain circumstances mac80211 passes a station pointer 2184e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * that may be %NULL, for example during TX or key setup. In 2185e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * that case, we need to use the broadcast station, so this 2186e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * inline wraps that pattern. 2187e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka */ 2188e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkastatic inline int 218983007196037cc2d0bffd9f7afbe56d675779a6cbStanislaw Gruszkail_sta_id_or_broadcast(struct il_priv *il, struct ieee80211_sta *sta) 2190e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka{ 2191e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka int sta_id; 2192e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 2193e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka if (!sta) 2194b16db50a6dc486c3a6c32cd7982a75452cb785c2Stanislaw Gruszka return il->hw_params.bcast_id; 2195e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 2196e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka sta_id = il_sta_id(sta); 2197e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 2198e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka /* 2199e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * mac80211 should not be passing a partially 2200e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * initialised station! 2201e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka */ 2202e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka WARN_ON(sta_id == IL_INVALID_STATION); 2203e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 2204e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka return sta_id; 2205e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka} 2206e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 2207e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka/** 2208e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * il_queue_inc_wrap - increment queue idx, wrap back to beginning 2209e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @idx -- current idx 2210e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @n_bd -- total number of entries in queue (must be power of 2) 2211e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka */ 2212e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkastatic inline int 2213e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkail_queue_inc_wrap(int idx, int n_bd) 2214e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka{ 2215e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka return ++idx & (n_bd - 1); 2216e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka} 2217e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 2218e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka/** 2219e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * il_queue_dec_wrap - decrement queue idx, wrap back to end 2220e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @idx -- current idx 2221e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @n_bd -- total number of entries in queue (must be power of 2) 2222e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka */ 2223e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkastatic inline int 2224e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkail_queue_dec_wrap(int idx, int n_bd) 2225e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka{ 2226e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka return --idx & (n_bd - 1); 2227e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka} 2228e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 2229e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka/* TODO: Move fw_desc functions to iwl-pci.ko */ 2230e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkastatic inline void 2231e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkail_free_fw_desc(struct pci_dev *pci_dev, struct fw_desc *desc) 2232e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka{ 2233e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka if (desc->v_addr) 2234e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka dma_free_coherent(&pci_dev->dev, desc->len, desc->v_addr, 2235e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka desc->p_addr); 2236e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka desc->v_addr = NULL; 2237e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka desc->len = 0; 2238e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka} 2239e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 2240e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkastatic inline int 2241e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkail_alloc_fw_desc(struct pci_dev *pci_dev, struct fw_desc *desc) 2242e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka{ 2243e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka if (!desc->len) { 2244e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka desc->v_addr = NULL; 2245e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka return -EINVAL; 2246e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka } 2247e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 2248e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka desc->v_addr = 2249e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka dma_alloc_coherent(&pci_dev->dev, desc->len, &desc->p_addr, 2250e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka GFP_KERNEL); 2251e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka return (desc->v_addr != NULL) ? 0 : -ENOMEM; 2252e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka} 2253e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 2254e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka/* 2255e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * we have 8 bits used like this: 2256e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * 2257e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * 7 6 5 4 3 2 1 0 2258e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * | | | | | | | | 2259e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * | | | | | | +-+-------- AC queue (0-3) 2260e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * | | | | | | 2261e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * | +-+-+-+-+------------ HW queue ID 2262e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * | 2263e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * +---------------------- unused 2264e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka */ 2265e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkastatic inline void 2266e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkail_set_swq_id(struct il_tx_queue *txq, u8 ac, u8 hwq) 2267e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka{ 2268e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka BUG_ON(ac > 3); /* only have 2 bits */ 2269e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka BUG_ON(hwq > 31); /* only use 5 bits */ 2270e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 2271e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka txq->swq_id = (hwq << 2) | ac; 2272e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka} 2273e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 2274e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkastatic inline void 2275e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkail_wake_queue(struct il_priv *il, struct il_tx_queue *txq) 2276e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka{ 2277e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u8 queue = txq->swq_id; 2278e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u8 ac = queue & 3; 2279e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u8 hwq = (queue >> 2) & 0x1f; 2280e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 2281e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka if (test_and_clear_bit(hwq, il->queue_stopped)) 2282e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka if (atomic_dec_return(&il->queue_stop_count[ac]) <= 0) 2283e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka ieee80211_wake_queue(il->hw, ac); 2284e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka} 2285e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 2286e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkastatic inline void 2287e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkail_stop_queue(struct il_priv *il, struct il_tx_queue *txq) 2288e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka{ 2289e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u8 queue = txq->swq_id; 2290e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u8 ac = queue & 3; 2291e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u8 hwq = (queue >> 2) & 0x1f; 2292e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 2293e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka if (!test_and_set_bit(hwq, il->queue_stopped)) 2294e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka if (atomic_inc_return(&il->queue_stop_count[ac]) > 0) 2295e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka ieee80211_stop_queue(il->hw, ac); 2296e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka} 2297e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 2298e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#ifdef ieee80211_stop_queue 2299e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#undef ieee80211_stop_queue 2300e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#endif 2301e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 2302e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define ieee80211_stop_queue DO_NOT_USE_ieee80211_stop_queue 2303e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 2304e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#ifdef ieee80211_wake_queue 2305e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#undef ieee80211_wake_queue 2306e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#endif 2307e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 2308e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define ieee80211_wake_queue DO_NOT_USE_ieee80211_wake_queue 2309e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 2310e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkastatic inline void 2311e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkail_disable_interrupts(struct il_priv *il) 2312e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka{ 2313e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka clear_bit(S_INT_ENABLED, &il->status); 2314e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 2315e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka /* disable interrupts from uCode/NIC to host */ 2316e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka _il_wr(il, CSR_INT_MASK, 0x00000000); 2317e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 2318e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka /* acknowledge/clear/reset any interrupts still pending 2319e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * from uCode or flow handler (Rx/Tx DMA) */ 2320e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka _il_wr(il, CSR_INT, 0xffffffff); 2321e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka _il_wr(il, CSR_FH_INT_STATUS, 0xffffffff); 2322e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka} 2323e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 2324e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkastatic inline void 2325e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkail_enable_rfkill_int(struct il_priv *il) 2326e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka{ 2327e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka _il_wr(il, CSR_INT_MASK, CSR_INT_BIT_RF_KILL); 2328e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka} 2329e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 2330e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkastatic inline void 2331e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkail_enable_interrupts(struct il_priv *il) 2332e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka{ 2333e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka set_bit(S_INT_ENABLED, &il->status); 2334e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka _il_wr(il, CSR_INT_MASK, il->inta_mask); 2335e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka} 2336e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 2337e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka/** 2338e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * il_beacon_time_mask_low - mask of lower 32 bit of beacon time 2339e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @il -- pointer to il_priv data structure 2340e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @tsf_bits -- number of bits need to shift for masking) 2341e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka */ 2342e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkastatic inline u32 2343e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkail_beacon_time_mask_low(struct il_priv *il, u16 tsf_bits) 2344e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka{ 2345e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka return (1 << tsf_bits) - 1; 2346e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka} 2347e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 2348e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka/** 2349e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * il_beacon_time_mask_high - mask of higher 32 bit of beacon time 2350e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @il -- pointer to il_priv data structure 2351e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @tsf_bits -- number of bits need to shift for masking) 2352e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka */ 2353e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkastatic inline u32 2354e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkail_beacon_time_mask_high(struct il_priv *il, u16 tsf_bits) 2355e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka{ 2356e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka return ((1 << (32 - tsf_bits)) - 1) << tsf_bits; 2357e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka} 2358e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 2359e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka/** 2360e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * struct il_rb_status - reseve buffer status host memory mapped FH registers 2361e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * 2362e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @closed_rb_num [0:11] - Indicates the idx of the RB which was closed 2363e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @closed_fr_num [0:11] - Indicates the idx of the RX Frame which was closed 2364e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @finished_rb_num [0:11] - Indicates the idx of the current RB 2365e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * in which the last frame was written to 2366e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @finished_fr_num [0:11] - Indicates the idx of the RX Frame 2367e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * which was transferred 2368e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka */ 2369e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkastruct il_rb_status { 2370e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka __le16 closed_rb_num; 2371e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka __le16 closed_fr_num; 2372e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka __le16 finished_rb_num; 2373e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka __le16 finished_fr_nam; 2374e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka __le32 __unused; /* 3945 only */ 2375e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka} __packed; 2376e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 2377d87c771f47460f7ca943942d508f2b9bd223a7e0Stanislaw Gruszka#define TFD_QUEUE_SIZE_MAX 256 2378d87c771f47460f7ca943942d508f2b9bd223a7e0Stanislaw Gruszka#define TFD_QUEUE_SIZE_BC_DUP 64 2379e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define TFD_QUEUE_BC_SIZE (TFD_QUEUE_SIZE_MAX + TFD_QUEUE_SIZE_BC_DUP) 2380d87c771f47460f7ca943942d508f2b9bd223a7e0Stanislaw Gruszka#define IL_TX_DMA_MASK DMA_BIT_MASK(36) 2381e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define IL_NUM_OF_TBS 20 2382e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 2383e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkastatic inline u8 2384e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkail_get_dma_hi_addr(dma_addr_t addr) 2385e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka{ 2386e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka return (sizeof(addr) > sizeof(u32) ? (addr >> 16) >> 16 : 0) & 0xF; 2387e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka} 2388e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka 2389e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka/** 2390e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * struct il_tfd_tb transmit buffer descriptor within transmit frame descriptor 2391e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * 2392e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * This structure contains dma address and length of transmission address 2393e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * 23941722f8e12a9c6117d872bd19ec5919460ccdfb4eStanislaw Gruszka * @lo: low [31:0] portion of the dma address of TX buffer every even is 23951722f8e12a9c6117d872bd19ec5919460ccdfb4eStanislaw Gruszka * unaligned on 16 bit boundary 23961722f8e12a9c6117d872bd19ec5919460ccdfb4eStanislaw Gruszka * @hi_n_len: 0-3 [35:32] portion of dma 23971722f8e12a9c6117d872bd19ec5919460ccdfb4eStanislaw Gruszka * 4-15 length of the tx buffer 2398e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka */ 2399e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkastruct il_tfd_tb { 2400e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka __le32 lo; 2401e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka __le16 hi_n_len; 2402e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka} __packed; 2403e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 2404e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka/** 2405e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * struct il_tfd 2406e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * 2407e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * Transmit Frame Descriptor (TFD) 2408e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * 2409e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @ __reserved1[3] reserved 2410e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @ num_tbs 0-4 number of active tbs 2411e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * 5 reserved 2412e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * 6-7 padding (not used) 2413e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * @ tbs[20] transmit frame buffer descriptors 24141722f8e12a9c6117d872bd19ec5919460ccdfb4eStanislaw Gruszka * @ __pad padding 2415e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * 2416e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * Each Tx queue uses a circular buffer of 256 TFDs stored in host DRAM. 2417e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * Both driver and device share these circular buffers, each of which must be 2418e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * contiguous 256 TFDs x 128 bytes-per-TFD = 32 KBytes 2419e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * 2420e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * Driver must indicate the physical address of the base of each 24219a95b37015de03aa82bf340b3ee8e97af11be910Stanislaw Gruszka * circular buffer via the FH49_MEM_CBBC_QUEUE registers. 2422e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * 2423e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * Each TFD contains pointer/size information for up to 20 data buffers 2424e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * in host DRAM. These buffers collectively contain the (one) frame described 2425e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * by the TFD. Each buffer must be a single contiguous block of memory within 2426e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * itself, but buffers may be scattered in host DRAM. Each buffer has max size 2427e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * of (4K - 4). The concatenates all of a TFD's buffers into a single 2428e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * Tx frame, up to 8 KBytes in size. 2429e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * 2430e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka * A maximum of 255 (not 256!) TFDs may be on a queue waiting for Tx. 2431e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka */ 2432e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszkastruct il_tfd { 2433e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u8 __reserved1[3]; 2434e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka u8 num_tbs; 2435e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka struct il_tfd_tb tbs[IL_NUM_OF_TBS]; 2436e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka __le32 __pad; 2437e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka} __packed; 2438e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka/* PCI registers */ 2439e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define PCI_CFG_RETRY_TIMEOUT 0x041 2440e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 2441e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka/* PCI register values */ 2442e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define PCI_CFG_LINK_CTRL_VAL_L0S_EN 0x01 2443e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka#define PCI_CFG_LINK_CTRL_VAL_L1_EN 0x02 2444e94a4099adb2ec148776975bcd953a01c6bec992Stanislaw Gruszka 24453fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszkastruct il_rate_info { 2446e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u8 plcp; /* uCode API: RATE_6M_PLCP, etc. */ 2447e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u8 plcp_siso; /* uCode API: RATE_SISO_6M_PLCP, etc. */ 2448e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u8 plcp_mimo2; /* uCode API: RATE_MIMO2_6M_PLCP, etc. */ 2449e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u8 ieee; /* MAC header: RATE_6M_IEEE, etc. */ 2450e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u8 prev_ieee; /* previous rate in IEEE speeds */ 2451e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u8 next_ieee; /* next rate in IEEE speeds */ 2452e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u8 prev_rs; /* previous rate used in rs algo */ 2453e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u8 next_rs; /* next rate used in rs algo */ 2454e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u8 prev_rs_tgg; /* previous rate used in TGG rs algo */ 2455e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u8 next_rs_tgg; /* next rate used in TGG rs algo */ 24563fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka}; 24573fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka 24583fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszkastruct il3945_rate_info { 24593fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka u8 plcp; /* uCode API: RATE_6M_PLCP, etc. */ 24603fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka u8 ieee; /* MAC header: RATE_6M_IEEE, etc. */ 24613fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka u8 prev_ieee; /* previous rate in IEEE speeds */ 24623fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka u8 next_ieee; /* next rate in IEEE speeds */ 24633fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka u8 prev_rs; /* previous rate used in rs algo */ 24643fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka u8 next_rs; /* next rate used in rs algo */ 24653fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka u8 prev_rs_tgg; /* previous rate used in TGG rs algo */ 24663fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka u8 next_rs_tgg; /* next rate used in TGG rs algo */ 24673fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka u8 table_rs_idx; /* idx in rate scale table cmd */ 24683fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka u8 prev_table_rs; /* prev in rate table cmd */ 24693fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka}; 24703fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka 24713fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka/* 24723fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka * These serve as idxes into 24733fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka * struct il_rate_info il_rates[RATE_COUNT]; 24743fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka */ 24753fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszkaenum { 24763fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_1M_IDX = 0, 24773fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_2M_IDX, 24783fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_5M_IDX, 24793fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_11M_IDX, 24803fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_6M_IDX, 24813fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_9M_IDX, 24823fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_12M_IDX, 24833fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_18M_IDX, 24843fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_24M_IDX, 24853fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_36M_IDX, 24863fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_48M_IDX, 24873fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_54M_IDX, 24883fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_60M_IDX, 24893fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_COUNT, 24903fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_COUNT_LEGACY = RATE_COUNT - 1, /* Excluding 60M */ 24913fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_COUNT_3945 = RATE_COUNT - 1, 24923fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_INVM_IDX = RATE_COUNT, 24933fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_INVALID = RATE_COUNT, 24943fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka}; 24953fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka 24963fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszkaenum { 24973fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_6M_IDX_TBL = 0, 24983fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_9M_IDX_TBL, 24993fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_12M_IDX_TBL, 25003fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_18M_IDX_TBL, 25013fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_24M_IDX_TBL, 25023fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_36M_IDX_TBL, 25033fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_48M_IDX_TBL, 25043fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_54M_IDX_TBL, 25053fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_1M_IDX_TBL, 25063fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_2M_IDX_TBL, 25073fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_5M_IDX_TBL, 25083fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_11M_IDX_TBL, 25093fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_INVM_IDX_TBL = RATE_INVM_IDX - 1, 25103fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka}; 25113fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka 25123fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszkaenum { 25133fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka IL_FIRST_OFDM_RATE = RATE_6M_IDX, 25143fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka IL39_LAST_OFDM_RATE = RATE_54M_IDX, 25153fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka IL_LAST_OFDM_RATE = RATE_60M_IDX, 25163fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka IL_FIRST_CCK_RATE = RATE_1M_IDX, 25173fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka IL_LAST_CCK_RATE = RATE_11M_IDX, 25183fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka}; 25193fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka 25203fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka/* #define vs. enum to keep from defaulting to 'large integer' */ 25213fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define RATE_6M_MASK (1 << RATE_6M_IDX) 25223fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define RATE_9M_MASK (1 << RATE_9M_IDX) 25233fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define RATE_12M_MASK (1 << RATE_12M_IDX) 25243fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define RATE_18M_MASK (1 << RATE_18M_IDX) 25253fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define RATE_24M_MASK (1 << RATE_24M_IDX) 25263fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define RATE_36M_MASK (1 << RATE_36M_IDX) 25273fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define RATE_48M_MASK (1 << RATE_48M_IDX) 25283fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define RATE_54M_MASK (1 << RATE_54M_IDX) 25293fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define RATE_60M_MASK (1 << RATE_60M_IDX) 25303fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define RATE_1M_MASK (1 << RATE_1M_IDX) 25313fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define RATE_2M_MASK (1 << RATE_2M_IDX) 25323fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define RATE_5M_MASK (1 << RATE_5M_IDX) 25333fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define RATE_11M_MASK (1 << RATE_11M_IDX) 25343fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka 25353fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka/* uCode API values for legacy bit rates, both OFDM and CCK */ 25363fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszkaenum { 2537e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka RATE_6M_PLCP = 13, 2538e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka RATE_9M_PLCP = 15, 25393fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_12M_PLCP = 5, 25403fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_18M_PLCP = 7, 25413fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_24M_PLCP = 9, 25423fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_36M_PLCP = 11, 25433fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_48M_PLCP = 1, 25443fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_54M_PLCP = 3, 2545e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka RATE_60M_PLCP = 3, /*FIXME:RS:should be removed */ 2546e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka RATE_1M_PLCP = 10, 2547e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka RATE_2M_PLCP = 20, 2548e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka RATE_5M_PLCP = 55, 25493fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_11M_PLCP = 110, 2550e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka /*FIXME:RS:add RATE_LEGACY_INVM_PLCP = 0, */ 25513fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka}; 25523fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka 25533fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka/* uCode API values for OFDM high-throughput (HT) bit rates */ 25543fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszkaenum { 25553fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_SISO_6M_PLCP = 0, 25563fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_SISO_12M_PLCP = 1, 25573fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_SISO_18M_PLCP = 2, 25583fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_SISO_24M_PLCP = 3, 25593fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_SISO_36M_PLCP = 4, 25603fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_SISO_48M_PLCP = 5, 25613fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_SISO_54M_PLCP = 6, 25623fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_SISO_60M_PLCP = 7, 2563e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka RATE_MIMO2_6M_PLCP = 0x8, 25643fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_MIMO2_12M_PLCP = 0x9, 25653fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_MIMO2_18M_PLCP = 0xa, 25663fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_MIMO2_24M_PLCP = 0xb, 25673fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_MIMO2_36M_PLCP = 0xc, 25683fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_MIMO2_48M_PLCP = 0xd, 25693fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_MIMO2_54M_PLCP = 0xe, 25703fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_MIMO2_60M_PLCP = 0xf, 25713fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_SISO_INVM_PLCP, 25723fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_MIMO2_INVM_PLCP = RATE_SISO_INVM_PLCP, 25733fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka}; 25743fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka 25753fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka/* MAC header values for bit rates */ 25763fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszkaenum { 2577e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka RATE_6M_IEEE = 12, 2578e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka RATE_9M_IEEE = 18, 25793fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_12M_IEEE = 24, 25803fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_18M_IEEE = 36, 25813fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_24M_IEEE = 48, 25823fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_36M_IEEE = 72, 25833fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_48M_IEEE = 96, 25843fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_54M_IEEE = 108, 25853fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_60M_IEEE = 120, 2586e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka RATE_1M_IEEE = 2, 2587e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka RATE_2M_IEEE = 4, 2588e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka RATE_5M_IEEE = 11, 25893fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_11M_IEEE = 22, 25903fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka}; 25913fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka 25923fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define IL_CCK_BASIC_RATES_MASK \ 25933fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka (RATE_1M_MASK | \ 25943fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_2M_MASK) 25953fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka 25963fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define IL_CCK_RATES_MASK \ 25973fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka (IL_CCK_BASIC_RATES_MASK | \ 25983fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_5M_MASK | \ 25993fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_11M_MASK) 26003fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka 26013fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define IL_OFDM_BASIC_RATES_MASK \ 26023fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka (RATE_6M_MASK | \ 26033fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_12M_MASK | \ 26043fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_24M_MASK) 26053fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka 26063fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define IL_OFDM_RATES_MASK \ 26073fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka (IL_OFDM_BASIC_RATES_MASK | \ 26083fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_9M_MASK | \ 26093fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_18M_MASK | \ 26103fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_36M_MASK | \ 26113fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_48M_MASK | \ 26123fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka RATE_54M_MASK) 26133fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka 26143fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define IL_BASIC_RATES_MASK \ 26153fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka (IL_OFDM_BASIC_RATES_MASK | \ 26163fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka IL_CCK_BASIC_RATES_MASK) 26173fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka 26183fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define RATES_MASK ((1 << RATE_COUNT) - 1) 26193fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define RATES_MASK_3945 ((1 << RATE_COUNT_3945) - 1) 26203fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka 26213fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define IL_INVALID_VALUE -1 26223fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka 26233fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define IL_MIN_RSSI_VAL -100 26243fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define IL_MAX_RSSI_VAL 0 26253fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka 26263fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka/* These values specify how many Tx frame attempts before 26273fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka * searching for a new modulation mode */ 26283fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define IL_LEGACY_FAILURE_LIMIT 160 26293fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define IL_LEGACY_SUCCESS_LIMIT 480 26303fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define IL_LEGACY_TBL_COUNT 160 26313fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka 26323fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define IL_NONE_LEGACY_FAILURE_LIMIT 400 26333fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define IL_NONE_LEGACY_SUCCESS_LIMIT 4500 26343fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define IL_NONE_LEGACY_TBL_COUNT 1500 26353fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka 26363fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka/* Success ratio (ACKed / attempted tx frames) values (perfect is 128 * 100) */ 26373fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define IL_RS_GOOD_RATIO 12800 /* 100% */ 26383fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define RATE_SCALE_SWITCH 10880 /* 85% */ 26393fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define RATE_HIGH_TH 10880 /* 85% */ 26403fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define RATE_INCREASE_TH 6400 /* 50% */ 26413fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define RATE_DECREASE_TH 1920 /* 15% */ 26423fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka 26433fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka/* possible actions when in legacy mode */ 26443fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define IL_LEGACY_SWITCH_ANTENNA1 0 26453fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define IL_LEGACY_SWITCH_ANTENNA2 1 26463fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define IL_LEGACY_SWITCH_SISO 2 26473fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define IL_LEGACY_SWITCH_MIMO2_AB 3 26483fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define IL_LEGACY_SWITCH_MIMO2_AC 4 26493fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define IL_LEGACY_SWITCH_MIMO2_BC 5 26503fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka 26513fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka/* possible actions when in siso mode */ 26523fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define IL_SISO_SWITCH_ANTENNA1 0 26533fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define IL_SISO_SWITCH_ANTENNA2 1 26543fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define IL_SISO_SWITCH_MIMO2_AB 2 26553fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define IL_SISO_SWITCH_MIMO2_AC 3 26563fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define IL_SISO_SWITCH_MIMO2_BC 4 26573fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define IL_SISO_SWITCH_GI 5 26583fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka 26593fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka/* possible actions when in mimo mode */ 26603fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define IL_MIMO2_SWITCH_ANTENNA1 0 26613fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define IL_MIMO2_SWITCH_ANTENNA2 1 26623fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define IL_MIMO2_SWITCH_SISO_A 2 26633fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define IL_MIMO2_SWITCH_SISO_B 3 26643fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define IL_MIMO2_SWITCH_SISO_C 4 26653fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define IL_MIMO2_SWITCH_GI 5 26663fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka 26673fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define IL_MAX_SEARCH IL_MIMO2_SWITCH_GI 26683fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka 26693fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define IL_ACTION_LIMIT 3 /* # possible actions */ 26703fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka 26713fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define LQ_SIZE 2 /* 2 mode tables: "Active" and "Search" */ 26723fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka 26733fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka/* load per tid defines for A-MPDU activation */ 26743fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define IL_AGG_TPT_THREHOLD 0 26753fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define IL_AGG_LOAD_THRESHOLD 10 26763fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define IL_AGG_ALL_TID 0xff 26773fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define TID_QUEUE_CELL_SPACING 50 /*mS */ 26783fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define TID_QUEUE_MAX_SIZE 20 26793fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define TID_ROUND_VALUE 5 /* mS */ 26803fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define TID_MAX_LOAD_COUNT 8 26813fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka 26823fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define TID_MAX_TIME_DIFF ((TID_QUEUE_MAX_SIZE - 1) * TID_QUEUE_CELL_SPACING) 26833fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define TIME_WRAP_AROUND(x, y) (((y) > (x)) ? (y) - (x) : (0-(x)) + (y)) 26843fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka 26853fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszkaextern const struct il_rate_info il_rates[RATE_COUNT]; 26863fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka 26873fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszkaenum il_table_type { 26883fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka LQ_NONE, 2689e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka LQ_G, /* legacy types */ 26903fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka LQ_A, 2691e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka LQ_SISO, /* high-throughput types */ 26923fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka LQ_MIMO2, 26933fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka LQ_MAX, 26943fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka}; 26953fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka 26963fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define is_legacy(tbl) ((tbl) == LQ_G || (tbl) == LQ_A) 26973fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define is_siso(tbl) ((tbl) == LQ_SISO) 26983fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define is_mimo2(tbl) ((tbl) == LQ_MIMO2) 26993fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define is_mimo(tbl) (is_mimo2(tbl)) 27003fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define is_Ht(tbl) (is_siso(tbl) || is_mimo(tbl)) 27013fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define is_a_band(tbl) ((tbl) == LQ_A) 27023fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define is_g_and(tbl) ((tbl) == LQ_G) 27033fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka 27043fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define ANT_NONE 0x0 27053fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define ANT_A BIT(0) 27063fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define ANT_B BIT(1) 27073fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define ANT_AB (ANT_A | ANT_B) 27083fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define ANT_C BIT(2) 27093fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define ANT_AC (ANT_A | ANT_C) 27103fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define ANT_BC (ANT_B | ANT_C) 27113fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define ANT_ABC (ANT_AB | ANT_C) 27123fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka 27133fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#define IL_MAX_MCS_DISPLAY_SIZE 12 27143fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka 27153fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszkastruct il_rate_mcs_info { 2716e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka char mbps[IL_MAX_MCS_DISPLAY_SIZE]; 2717e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka char mcs[IL_MAX_MCS_DISPLAY_SIZE]; 27183fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka}; 27193fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka 27203fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka/** 27213fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka * struct il_rate_scale_data -- tx success history for one rate 27223fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka */ 27233fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszkastruct il_rate_scale_data { 27243fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka u64 data; /* bitmap of successful frames */ 27253fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka s32 success_counter; /* number of frames successful */ 27263fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka s32 success_ratio; /* per-cent * 128 */ 27273fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka s32 counter; /* number of frames attempted */ 27283fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka s32 average_tpt; /* success ratio * expected throughput */ 27293fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka unsigned long stamp; 27303fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka}; 27313fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka 27323fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka/** 27333fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka * struct il_scale_tbl_info -- tx params and success history for all rates 27343fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka * 27353fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka * There are two of these in struct il_lq_sta, 27363fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka * one for "active", and one for "search". 27373fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka */ 27383fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszkastruct il_scale_tbl_info { 27393fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka enum il_table_type lq_type; 27403fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka u8 ant_type; 2741e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u8 is_SGI; /* 1 = short guard interval */ 2742e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u8 is_ht40; /* 1 = 40 MHz channel width */ 2743e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u8 is_dup; /* 1 = duplicated data streams */ 2744e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u8 action; /* change modulation; IL_[LEGACY/SISO/MIMO]_SWITCH_* */ 2745e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u8 max_search; /* maximun number of tables we can search */ 27463fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka s32 *expected_tpt; /* throughput metrics; expected_tpt_G, etc. */ 2747e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u32 current_rate; /* rate_n_flags, uCode API format */ 2748e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka struct il_rate_scale_data win[RATE_COUNT]; /* rate histories */ 27493fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka}; 27503fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka 27513fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszkastruct il_traffic_load { 27523fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka unsigned long time_stamp; /* age of the oldest stats */ 2753e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u32 packet_count[TID_QUEUE_MAX_SIZE]; /* packet count in this time 27543fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka * slice */ 2755e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u32 total; /* total num of packets during the 2756e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka * last TID_MAX_TIME_DIFF */ 2757e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u8 queue_count; /* number of queues that has 2758e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka * been used since the last cleanup */ 2759e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u8 head; /* start of the circular buffer */ 27603fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka}; 27613fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka 27623fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka/** 27633fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka * struct il_lq_sta -- driver's rate scaling ilate structure 27643fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka * 27653fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka * Pointer to this gets passed back and forth between driver and mac80211. 27663fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka */ 27673fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszkastruct il_lq_sta { 27683fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka u8 active_tbl; /* idx of active table, range 0-1 */ 27693fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka u8 enable_counter; /* indicates HT mode */ 27703fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka u8 stay_in_tbl; /* 1: disallow, 0: allow search for new mode */ 27713fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka u8 search_better_tbl; /* 1: currently trying alternate mode */ 27723fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka s32 last_tpt; 27733fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka 27743fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka /* The following determine when to search for a new mode */ 27753fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka u32 table_count_limit; 27763fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka u32 max_failure_limit; /* # failed frames before new search */ 27773fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka u32 max_success_limit; /* # successful frames before new search */ 27783fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka u32 table_count; 27793fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka u32 total_failed; /* total failed frames, any/all rates */ 27803fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka u32 total_success; /* total successful frames, any/all rates */ 27813fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka u64 flush_timer; /* time staying in mode before new search */ 27823fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka 27833fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka u8 action_counter; /* # mode-switch actions tried */ 27843fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka u8 is_green; 27853fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka u8 is_dup; 27863fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka enum ieee80211_band band; 27873fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka 27883fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka /* The following are bitmaps of rates; RATE_6M_MASK, etc. */ 27893fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka u32 supp_rates; 27903fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka u16 active_legacy_rate; 27913fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka u16 active_siso_rate; 27923fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka u16 active_mimo2_rate; 2793e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka s8 max_rate_idx; /* Max rate set by user */ 27943fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka u8 missed_rate_counter; 27953fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka 27963fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka struct il_link_quality_cmd lq; 2797e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka struct il_scale_tbl_info lq_info[LQ_SIZE]; /* "active", "search" */ 27983fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka struct il_traffic_load load[TID_MAX_LOAD_COUNT]; 27993fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka u8 tx_agg_tid_en; 28003fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#ifdef CONFIG_MAC80211_DEBUGFS 28013fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka struct dentry *rs_sta_dbgfs_scale_table_file; 28023fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka struct dentry *rs_sta_dbgfs_stats_table_file; 28033fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka struct dentry *rs_sta_dbgfs_rate_scale_data_file; 28043fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka struct dentry *rs_sta_dbgfs_tx_agg_tid_en_file; 28053fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka u32 dbg_fixed_rate; 28063fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka#endif 28073fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka struct il_priv *drv; 28083fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka 28093fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka /* used to be in sta_info */ 28103fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka int last_txrate_idx; 28113fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka /* last tx rate_n_flags */ 28123fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka u32 last_rate_n_flags; 28133fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka /* packets destined for this STA are aggregated */ 28143fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka u8 is_agg; 28153fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka}; 28163fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka 28173fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka/* 28183fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka * il_station_priv: Driver's ilate station information 28193fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka * 28203fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka * When mac80211 creates a station it reserves some space (hw->sta_data_size) 28213fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka * in the structure for use by driver. This structure is places in that 28223fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka * space. 28233fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka * 28243fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka * The common struct MUST be first because it is shared between 28253fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka * 3945 and 4965! 28263fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka */ 28273fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszkastruct il_station_priv { 28283fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka struct il_station_priv_common common; 28293fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka struct il_lq_sta lq_sta; 28303fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka atomic_t pending_frames; 28313fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka bool client; 28323fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka bool asleep; 28333fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka}; 28343fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka 2835e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkastatic inline u8 2836e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkail4965_num_of_ant(u8 m) 28373fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka{ 28383fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka return !!(m & ANT_A) + !!(m & ANT_B) + !!(m & ANT_C); 28393fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka} 28403fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka 2841e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkastatic inline u8 2842e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkail4965_first_antenna(u8 mask) 28433fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka{ 28443fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka if (mask & ANT_A) 28453fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka return ANT_A; 28463fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka if (mask & ANT_B) 28473fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka return ANT_B; 28483fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka return ANT_C; 28493fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka} 28503fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka 28513fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka/** 28523fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka * il3945_rate_scale_init - Initialize the rate scale table based on assoc info 28533fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka * 28543fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka * The specific throughput table used is based on the type of network 28553fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka * the associated with, including A, B, G, and G w/ TGG protection 28563fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka */ 28573fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszkaextern void il3945_rate_scale_init(struct ieee80211_hw *hw, s32 sta_id); 28583fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka 28593fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka/* Initialize station's rate scaling information after adding station */ 2860e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkaextern void il4965_rs_rate_init(struct il_priv *il, struct ieee80211_sta *sta, 2861e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u8 sta_id); 2862e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkaextern void il3945_rs_rate_init(struct il_priv *il, struct ieee80211_sta *sta, 2863e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka u8 sta_id); 28643fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka 28653fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka/** 28663fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka * il_rate_control_register - Register the rate control algorithm callbacks 28673fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka * 28683fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka * Since the rate control algorithm is hardware specific, there is no need 28693fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka * or reason to place it as a stand alone module. The driver can call 28703fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka * il_rate_control_register in order to register the rate control callbacks 28713fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka * with the mac80211 subsystem. This should be performed prior to calling 28723fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka * ieee80211_register_hw 28733fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka * 28743fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka */ 28753fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszkaextern int il4965_rate_control_register(void); 28763fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszkaextern int il3945_rate_control_register(void); 28773fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka 28783fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka/** 28793fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka * il_rate_control_unregister - Unregister the rate control callbacks 28803fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka * 28813fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka * This should be called after calling ieee80211_unregister_hw, but before 28823fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka * the driver is unloaded. 28833fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka */ 28843fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszkaextern void il4965_rate_control_unregister(void); 28853fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszkaextern void il3945_rate_control_unregister(void); 28863fbbf9a8083049718c44e43dc88c8e79cb0b7793Stanislaw Gruszka 288799412002a07b63781adfc3d1272d3677841d4170Stanislaw Gruszkaextern int il_power_update_mode(struct il_priv *il, bool force); 288899412002a07b63781adfc3d1272d3677841d4170Stanislaw Gruszkaextern void il_power_initialize(struct il_priv *il); 288947ef694dd47b1e97a0d766f3c74067bab3debfa5Stanislaw Gruszka 2890f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszkaextern u32 il_debug_level; 2891f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka 2892f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#ifdef CONFIG_IWLEGACY_DEBUG 2893f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka/* 2894f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka * il_get_debug_level: Return active debug level for device 2895f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka * 2896f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka * Using sysfs it is possible to set per device debug level. This debug 2897f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka * level will be used if set, otherwise the global debug level which can be 2898f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka * set via module parameter is used. 2899f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka */ 2900e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkastatic inline u32 2901e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkail_get_debug_level(struct il_priv *il) 2902f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka{ 2903f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka if (il->debug_level) 2904f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka return il->debug_level; 2905f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka else 2906f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka return il_debug_level; 2907f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka} 2908f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#else 2909e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkastatic inline u32 2910e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkail_get_debug_level(struct il_priv *il) 2911f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka{ 2912f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka return il_debug_level; 2913f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka} 2914f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#endif 2915f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka 2916f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define il_print_hex_error(il, p, len) \ 2917f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszkado { \ 2918f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka print_hex_dump(KERN_ERR, "iwl data: ", \ 2919f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka DUMP_PREFIX_OFFSET, 16, 1, p, len, 1); \ 2920f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka} while (0) 2921f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka 2922f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#ifdef CONFIG_IWLEGACY_DEBUG 2923f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define IL_DBG(level, fmt, args...) \ 2924f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszkado { \ 2925f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka if (il_get_debug_level(il) & level) \ 2926f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka dev_printk(KERN_ERR, &il->hw->wiphy->dev, \ 2927f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka "%c %s " fmt, in_interrupt() ? 'I' : 'U', \ 2928f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka __func__ , ## args); \ 2929f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka} while (0) 2930f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka 29311722f8e12a9c6117d872bd19ec5919460ccdfb4eStanislaw Gruszka#define il_print_hex_dump(il, level, p, len) \ 2932f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszkado { \ 2933f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka if (il_get_debug_level(il) & level) \ 2934f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka print_hex_dump(KERN_DEBUG, "iwl data: ", \ 2935f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka DUMP_PREFIX_OFFSET, 16, 1, p, len, 1); \ 2936f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka} while (0) 2937f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka 2938f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#else 2939f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define IL_DBG(level, fmt, args...) 2940e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkastatic inline void 2941e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkail_print_hex_dump(struct il_priv *il, int level, const void *p, u32 len) 2942e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka{ 2943e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka} 2944e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka#endif /* CONFIG_IWLEGACY_DEBUG */ 2945f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka 2946f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#ifdef CONFIG_IWLEGACY_DEBUGFS 2947f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszkaint il_dbgfs_register(struct il_priv *il, const char *name); 2948f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszkavoid il_dbgfs_unregister(struct il_priv *il); 2949f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#else 2950f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszkastatic inline int 2951f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszkail_dbgfs_register(struct il_priv *il, const char *name) 2952f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka{ 2953f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka return 0; 2954f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka} 2955e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka 2956e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkastatic inline void 2957e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszkail_dbgfs_unregister(struct il_priv *il) 2958f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka{ 2959f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka} 2960e7392364fcd1004a5e495f15cf21b1e0ef874215Stanislaw Gruszka#endif /* CONFIG_IWLEGACY_DEBUGFS */ 2961f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka 2962f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka/* 2963f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka * To use the debug system: 2964f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka * 2965f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka * If you are defining a new debug classification, simply add it to the #define 2966f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka * list here in the form of 2967f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka * 2968f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka * #define IL_DL_xxxx VALUE 2969f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka * 2970f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka * where xxxx should be the name of the classification (for example, WEP). 2971f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka * 2972f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka * You then need to either add a IL_xxxx_DEBUG() macro definition for your 2973f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka * classification, or use IL_DBG(IL_DL_xxxx, ...) whenever you want 2974f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka * to send output to that classification. 2975f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka * 2976f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka * The active debug levels can be accessed via files 2977f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka * 29781722f8e12a9c6117d872bd19ec5919460ccdfb4eStanislaw Gruszka * /sys/module/iwl4965/parameters/debug 2979f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka * /sys/module/iwl3945/parameters/debug 29801722f8e12a9c6117d872bd19ec5919460ccdfb4eStanislaw Gruszka * /sys/class/net/wlan0/device/debug_level 2981f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka * 2982f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka * when CONFIG_IWLEGACY_DEBUG=y. 2983f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka */ 2984f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka 2985f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka/* 0x0000000F - 0x00000001 */ 2986f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define IL_DL_INFO (1 << 0) 2987f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define IL_DL_MAC80211 (1 << 1) 2988f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define IL_DL_HCMD (1 << 2) 2989f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define IL_DL_STATE (1 << 3) 2990f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka/* 0x000000F0 - 0x00000010 */ 2991f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define IL_DL_MACDUMP (1 << 4) 2992f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define IL_DL_HCMD_DUMP (1 << 5) 2993f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define IL_DL_EEPROM (1 << 6) 2994f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define IL_DL_RADIO (1 << 7) 2995f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka/* 0x00000F00 - 0x00000100 */ 2996f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define IL_DL_POWER (1 << 8) 2997f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define IL_DL_TEMP (1 << 9) 2998f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define IL_DL_NOTIF (1 << 10) 2999f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define IL_DL_SCAN (1 << 11) 3000f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka/* 0x0000F000 - 0x00001000 */ 3001f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define IL_DL_ASSOC (1 << 12) 3002f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define IL_DL_DROP (1 << 13) 3003f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define IL_DL_TXPOWER (1 << 14) 3004f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define IL_DL_AP (1 << 15) 3005f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka/* 0x000F0000 - 0x00010000 */ 3006f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define IL_DL_FW (1 << 16) 3007f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define IL_DL_RF_KILL (1 << 17) 3008f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define IL_DL_FW_ERRORS (1 << 18) 3009f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define IL_DL_LED (1 << 19) 3010f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka/* 0x00F00000 - 0x00100000 */ 3011f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define IL_DL_RATE (1 << 20) 3012f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define IL_DL_CALIB (1 << 21) 3013f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define IL_DL_WEP (1 << 22) 3014f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define IL_DL_TX (1 << 23) 3015f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka/* 0x0F000000 - 0x01000000 */ 3016f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define IL_DL_RX (1 << 24) 3017f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define IL_DL_ISR (1 << 25) 3018f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define IL_DL_HT (1 << 26) 3019f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka/* 0xF0000000 - 0x10000000 */ 3020f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define IL_DL_11H (1 << 28) 3021f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define IL_DL_STATS (1 << 29) 3022f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define IL_DL_TX_REPLY (1 << 30) 3023f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define IL_DL_QOS (1 << 31) 3024f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka 3025f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define D_INFO(f, a...) IL_DBG(IL_DL_INFO, f, ## a) 3026f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define D_MAC80211(f, a...) IL_DBG(IL_DL_MAC80211, f, ## a) 3027f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define D_MACDUMP(f, a...) IL_DBG(IL_DL_MACDUMP, f, ## a) 3028f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define D_TEMP(f, a...) IL_DBG(IL_DL_TEMP, f, ## a) 3029f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define D_SCAN(f, a...) IL_DBG(IL_DL_SCAN, f, ## a) 3030f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define D_RX(f, a...) IL_DBG(IL_DL_RX, f, ## a) 3031f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define D_TX(f, a...) IL_DBG(IL_DL_TX, f, ## a) 3032f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define D_ISR(f, a...) IL_DBG(IL_DL_ISR, f, ## a) 3033f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define D_LED(f, a...) IL_DBG(IL_DL_LED, f, ## a) 3034f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define D_WEP(f, a...) IL_DBG(IL_DL_WEP, f, ## a) 3035f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define D_HC(f, a...) IL_DBG(IL_DL_HCMD, f, ## a) 3036f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define D_HC_DUMP(f, a...) IL_DBG(IL_DL_HCMD_DUMP, f, ## a) 3037f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define D_EEPROM(f, a...) IL_DBG(IL_DL_EEPROM, f, ## a) 3038f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define D_CALIB(f, a...) IL_DBG(IL_DL_CALIB, f, ## a) 3039f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define D_FW(f, a...) IL_DBG(IL_DL_FW, f, ## a) 3040f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define D_RF_KILL(f, a...) IL_DBG(IL_DL_RF_KILL, f, ## a) 3041f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define D_DROP(f, a...) IL_DBG(IL_DL_DROP, f, ## a) 3042f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define D_AP(f, a...) IL_DBG(IL_DL_AP, f, ## a) 3043f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define D_TXPOWER(f, a...) IL_DBG(IL_DL_TXPOWER, f, ## a) 3044f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define D_RATE(f, a...) IL_DBG(IL_DL_RATE, f, ## a) 3045f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define D_NOTIF(f, a...) IL_DBG(IL_DL_NOTIF, f, ## a) 3046f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define D_ASSOC(f, a...) IL_DBG(IL_DL_ASSOC, f, ## a) 3047f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define D_HT(f, a...) IL_DBG(IL_DL_HT, f, ## a) 3048f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define D_STATS(f, a...) IL_DBG(IL_DL_STATS, f, ## a) 3049f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define D_TX_REPLY(f, a...) IL_DBG(IL_DL_TX_REPLY, f, ## a) 3050f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define D_QOS(f, a...) IL_DBG(IL_DL_QOS, f, ## a) 3051f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define D_RADIO(f, a...) IL_DBG(IL_DL_RADIO, f, ## a) 3052f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define D_POWER(f, a...) IL_DBG(IL_DL_POWER, f, ## a) 3053f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka#define D_11H(f, a...) IL_DBG(IL_DL_11H, f, ## a) 3054f02579e3a81954c8f0944c7d2a95159ee48f052dStanislaw Gruszka 3055e2ebc8337d116acdc25469ec8547ae665f50a4c1Stanislaw Gruszka#endif /* __il_core_h__ */ 3056