iwl-shared.h revision 3c607d27c818cf4a5d28f2c73b18a88f8fbdfa33
1/****************************************************************************** 2 * 3 * This file is provided under a dual BSD/GPLv2 license. When using or 4 * redistributing this file, you may do so under either license. 5 * 6 * GPL LICENSE SUMMARY 7 * 8 * Copyright(c) 2007 - 2011 Intel Corporation. All rights reserved. 9 * 10 * This program is free software; you can redistribute it and/or modify 11 * it under the terms of version 2 of the GNU General Public License as 12 * published by the Free Software Foundation. 13 * 14 * This program is distributed in the hope that it will be useful, but 15 * WITHOUT ANY WARRANTY; without even the implied warranty of 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 17 * General Public License for more details. 18 * 19 * You should have received a copy of the GNU General Public License 20 * along with this program; if not, write to the Free Software 21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110, 22 * USA 23 * 24 * The full GNU General Public License is included in this distribution 25 * in the file called LICENSE.GPL. 26 * 27 * Contact Information: 28 * Intel Linux Wireless <ilw@linux.intel.com> 29 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 30 * 31 * BSD LICENSE 32 * 33 * Copyright(c) 2005 - 2011 Intel Corporation. All rights reserved. 34 * All rights reserved. 35 * 36 * Redistribution and use in source and binary forms, with or without 37 * modification, are permitted provided that the following conditions 38 * are met: 39 * 40 * * Redistributions of source code must retain the above copyright 41 * notice, this list of conditions and the following disclaimer. 42 * * Redistributions in binary form must reproduce the above copyright 43 * notice, this list of conditions and the following disclaimer in 44 * the documentation and/or other materials provided with the 45 * distribution. 46 * * Neither the name Intel Corporation nor the names of its 47 * contributors may be used to endorse or promote products derived 48 * from this software without specific prior written permission. 49 * 50 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 51 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 52 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 53 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 54 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 55 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 56 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 57 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 58 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 59 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 60 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 61 * 62 *****************************************************************************/ 63#ifndef __iwl_shared_h__ 64#define __iwl_shared_h__ 65 66#include <linux/types.h> 67#include <linux/spinlock.h> 68#include <linux/mutex.h> 69#include <linux/gfp.h> 70#include <linux/mm.h> /* for page_address */ 71#include <net/mac80211.h> 72 73#include "iwl-commands.h" 74 75/** 76 * DOC: shared area - role and goal 77 * 78 * The shared area contains all the data exported by the upper layer to the 79 * other layers. Since the bus and transport layer shouldn't dereference 80 * iwl_priv, all the data needed by the upper layer and the transport / bus 81 * layer must be here. 82 * The shared area also holds pointer to all the other layers. This allows a 83 * layer to call a function from another layer. 84 * 85 * NOTE: All the layers hold a pointer to the shared area which must be shrd. 86 * A few macros assume that (_m)->shrd points to the shared area no matter 87 * what _m is. 88 * 89 * gets notifications about enumeration, suspend, resume. 90 * For the moment, the bus layer is not a linux kernel module as itself, and 91 * the module_init function of the driver must call the bus specific 92 * registration functions. These functions are listed at the end of this file. 93 * For the moment, there is only one implementation of this interface: PCI-e. 94 * This implementation is iwl-pci.c 95 */ 96 97struct iwl_cfg; 98struct iwl_bus; 99struct iwl_priv; 100struct iwl_sensitivity_ranges; 101struct iwl_trans_ops; 102 103#define DRV_NAME "iwlwifi" 104#define IWLWIFI_VERSION "in-tree:" 105#define DRV_COPYRIGHT "Copyright(c) 2003-2011 Intel Corporation" 106#define DRV_AUTHOR "<ilw@linux.intel.com>" 107 108extern struct iwl_mod_params iwlagn_mod_params; 109 110/** 111 * struct iwl_mod_params 112 * 113 * Holds the module parameters 114 * 115 * @sw_crypto: using hardware encryption, default = 0 116 * @num_of_queues: number of tx queue, HW dependent 117 * @disable_11n: 11n capabilities enabled, default = 0 118 * @amsdu_size_8K: enable 8K amsdu size, default = 1 119 * @antenna: both antennas (use diversity), default = 0 120 * @restart_fw: restart firmware, default = 1 121 * @plcp_check: enable plcp health check, default = true 122 * @ack_check: disable ack health check, default = false 123 * @wd_disable: enable stuck queue check, default = false 124 * @bt_coex_active: enable bt coex, default = true 125 * @led_mode: system default, default = 0 126 * @no_sleep_autoadjust: disable autoadjust, default = true 127 * @power_save: disable power save, default = false 128 * @power_level: power level, default = 1 129 * @debug_level: levels are IWL_DL_* 130 * @ant_coupling: antenna coupling in dB, default = 0 131 * @bt_ch_announce: BT channel inhibition, default = enable 132 * @wanted_ucode_alternative: ucode alternative to use, default = 1 133 * @auto_agg: enable agg. without check, default = true 134 */ 135struct iwl_mod_params { 136 int sw_crypto; 137 int num_of_queues; 138 int disable_11n; 139 int amsdu_size_8K; 140 int antenna; 141 int restart_fw; 142 bool plcp_check; 143 bool ack_check; 144 bool wd_disable; 145 bool bt_coex_active; 146 int led_mode; 147 bool no_sleep_autoadjust; 148 bool power_save; 149 int power_level; 150 u32 debug_level; 151 int ant_coupling; 152 bool bt_ch_announce; 153 int wanted_ucode_alternative; 154 bool auto_agg; 155}; 156 157/** 158 * struct iwl_hw_params 159 * 160 * Holds the module parameters 161 * 162 * @max_txq_num: Max # Tx queues supported 163 * @num_ampdu_queues: num of ampdu queues 164 * @tx_chains_num: Number of TX chains 165 * @rx_chains_num: Number of RX chains 166 * @valid_tx_ant: usable antennas for TX 167 * @valid_rx_ant: usable antennas for RX 168 * @max_stations: the maximal number of stations 169 * @ht40_channel: is 40MHz width possible: BIT(IEEE80211_BAND_XXX) 170 * @sku: sku read from EEPROM 171 * @rx_page_order: Rx buffer page order 172 * @max_inst_size: for ucode use 173 * @max_data_size: for ucode use 174 * @ct_kill_threshold: temperature threshold - in hw dependent unit 175 * @ct_kill_exit_threshold: when to reeable the device - in hw dependent unit 176 * relevant for 1000, 6000 and up 177 * @wd_timeout: TX queues watchdog timeout 178 * @calib_init_cfg: setup initial calibrations for the hw 179 * @calib_rt_cfg: setup runtime calibrations for the hw 180 * @struct iwl_sensitivity_ranges: range of sensitivity values 181 */ 182struct iwl_hw_params { 183 u8 max_txq_num; 184 u8 num_ampdu_queues; 185 u8 tx_chains_num; 186 u8 rx_chains_num; 187 u8 valid_tx_ant; 188 u8 valid_rx_ant; 189 u8 max_stations; 190 u8 ht40_channel; 191 bool shadow_reg_enable; 192 u16 sku; 193 u32 rx_page_order; 194 u32 max_inst_size; 195 u32 max_data_size; 196 u32 ct_kill_threshold; 197 u32 ct_kill_exit_threshold; 198 unsigned int wd_timeout; 199 200 u32 calib_init_cfg; 201 u32 calib_rt_cfg; 202 const struct iwl_sensitivity_ranges *sens; 203}; 204 205/** 206 * enum iwl_agg_state 207 * 208 * The state machine of the BA agreement establishment / tear down. 209 * These states relate to a specific RA / TID. 210 * 211 * @IWL_AGG_OFF: aggregation is not used 212 * @IWL_AGG_ON: aggregation session is up 213 * @IWL_EMPTYING_HW_QUEUE_ADDBA: establishing a BA session - waiting for the 214 * HW queue to be empty from packets for this RA /TID. 215 * @IWL_EMPTYING_HW_QUEUE_DELBA: tearing down a BA session - waiting for the 216 * HW queue to be empty from packets for this RA /TID. 217 */ 218enum iwl_agg_state { 219 IWL_AGG_OFF = 0, 220 IWL_AGG_ON, 221 IWL_EMPTYING_HW_QUEUE_ADDBA, 222 IWL_EMPTYING_HW_QUEUE_DELBA, 223}; 224 225/** 226 * struct iwl_ht_agg - aggregation state machine 227 228 * This structs holds the states for the BA agreement establishment and tear 229 * down. It also holds the state during the BA session itself. This struct is 230 * duplicated for each RA / TID. 231 232 * @rate_n_flags: Rate at which Tx was attempted. Holds the data between the 233 * Tx response (REPLY_TX), and the block ack notification 234 * (REPLY_COMPRESSED_BA). 235 * @state: state of the BA agreement establishment / tear down. 236 * @txq_id: Tx queue used by the BA session - used by the transport layer. 237 * Needed by the upper layer for debugfs only. 238 * @wait_for_ba: Expect block-ack before next Tx reply 239 */ 240struct iwl_ht_agg { 241 u32 rate_n_flags; 242 enum iwl_agg_state state; 243 u16 txq_id; 244 bool wait_for_ba; 245}; 246 247/** 248 * struct iwl_tid_data - one for each RA / TID 249 250 * This structs holds the states for each RA / TID. 251 252 * @seq_number: the next WiFi sequence number to use 253 * @tfds_in_queue: number of packets sent to the HW queues. 254 * Exported for debugfs only 255 * @agg: aggregation state machine 256 */ 257struct iwl_tid_data { 258 u16 seq_number; 259 u16 tfds_in_queue; 260 struct iwl_ht_agg agg; 261}; 262 263/** 264 * struct iwl_shared - shared fields for all the layers of the driver 265 * 266 * @dbg_level_dev: dbg level set per device. Prevails on 267 * iwlagn_mod_params.debug_level if set (!= 0) 268 * @ucode_owner: IWL_OWNERSHIP_* 269 * @cmd_queue: command queue number 270 * @status: STATUS_* 271 * @valid_contexts: microcode/device supports multiple contexts 272 * @bus: pointer to the bus layer data 273 * @priv: pointer to the upper layer data 274 * @hw_params: see struct iwl_hw_params 275 * @workqueue: the workqueue used by all the layers of the driver 276 * @lock: protect general shared data 277 * @sta_lock: protects the station table. 278 * If lock and sta_lock are needed, lock must be acquired first. 279 * @mutex: 280 */ 281struct iwl_shared { 282#ifdef CONFIG_IWLWIFI_DEBUG 283 u32 dbg_level_dev; 284#endif /* CONFIG_IWLWIFI_DEBUG */ 285 286#define IWL_OWNERSHIP_DRIVER 0 287#define IWL_OWNERSHIP_TM 1 288 u8 ucode_owner; 289 u8 cmd_queue; 290 unsigned long status; 291 bool wowlan; 292 u8 valid_contexts; 293 294 struct iwl_bus *bus; 295 struct iwl_priv *priv; 296 struct iwl_trans *trans; 297 struct iwl_hw_params hw_params; 298 299 struct workqueue_struct *workqueue; 300 spinlock_t lock; 301 spinlock_t sta_lock; 302 struct mutex mutex; 303 304 struct iwl_tid_data tid_data[IWLAGN_STATION_COUNT][IWL_MAX_TID_COUNT]; 305 306 wait_queue_head_t wait_command_queue; 307}; 308 309/*Whatever _m is (iwl_trans, iwl_priv, iwl_bus, these macros will work */ 310#define priv(_m) ((_m)->shrd->priv) 311#define bus(_m) ((_m)->shrd->bus) 312#define trans(_m) ((_m)->shrd->trans) 313#define hw_params(_m) ((_m)->shrd->hw_params) 314 315#ifdef CONFIG_IWLWIFI_DEBUG 316/* 317 * iwl_get_debug_level: Return active debug level for device 318 * 319 * Using sysfs it is possible to set per device debug level. This debug 320 * level will be used if set, otherwise the global debug level which can be 321 * set via module parameter is used. 322 */ 323static inline u32 iwl_get_debug_level(struct iwl_shared *shrd) 324{ 325 if (shrd->dbg_level_dev) 326 return shrd->dbg_level_dev; 327 else 328 return iwlagn_mod_params.debug_level; 329} 330#else 331static inline u32 iwl_get_debug_level(struct iwl_shared *shrd) 332{ 333 return iwlagn_mod_params.debug_level; 334} 335#endif 336 337static inline void iwl_free_pages(struct iwl_shared *shrd, unsigned long page) 338{ 339 free_pages(page, shrd->hw_params.rx_page_order); 340} 341 342/** 343 * iwl_queue_inc_wrap - increment queue index, wrap back to beginning 344 * @index -- current index 345 * @n_bd -- total number of entries in queue (must be power of 2) 346 */ 347static inline int iwl_queue_inc_wrap(int index, int n_bd) 348{ 349 return ++index & (n_bd - 1); 350} 351 352/** 353 * iwl_queue_dec_wrap - decrement queue index, wrap back to end 354 * @index -- current index 355 * @n_bd -- total number of entries in queue (must be power of 2) 356 */ 357static inline int iwl_queue_dec_wrap(int index, int n_bd) 358{ 359 return --index & (n_bd - 1); 360} 361 362struct iwl_rx_mem_buffer { 363 dma_addr_t page_dma; 364 struct page *page; 365 struct list_head list; 366}; 367 368#define rxb_addr(r) page_address(r->page) 369 370/* 371 * mac80211 queues, ACs, hardware queues, FIFOs. 372 * 373 * Cf. http://wireless.kernel.org/en/developers/Documentation/mac80211/queues 374 * 375 * Mac80211 uses the following numbers, which we get as from it 376 * by way of skb_get_queue_mapping(skb): 377 * 378 * VO 0 379 * VI 1 380 * BE 2 381 * BK 3 382 * 383 * 384 * Regular (not A-MPDU) frames are put into hardware queues corresponding 385 * to the FIFOs, see comments in iwl-prph.h. Aggregated frames get their 386 * own queue per aggregation session (RA/TID combination), such queues are 387 * set up to map into FIFOs too, for which we need an AC->FIFO mapping. In 388 * order to map frames to the right queue, we also need an AC->hw queue 389 * mapping. This is implemented here. 390 * 391 * Due to the way hw queues are set up (by the hw specific modules like 392 * iwl-4965.c, iwl-5000.c etc.), the AC->hw queue mapping is the identity 393 * mapping. 394 */ 395 396static const u8 tid_to_ac[] = { 397 IEEE80211_AC_BE, 398 IEEE80211_AC_BK, 399 IEEE80211_AC_BK, 400 IEEE80211_AC_BE, 401 IEEE80211_AC_VI, 402 IEEE80211_AC_VI, 403 IEEE80211_AC_VO, 404 IEEE80211_AC_VO 405}; 406 407static inline int get_ac_from_tid(u16 tid) 408{ 409 if (likely(tid < ARRAY_SIZE(tid_to_ac))) 410 return tid_to_ac[tid]; 411 412 /* no support for TIDs 8-15 yet */ 413 return -EINVAL; 414} 415 416enum iwl_rxon_context_id { 417 IWL_RXON_CTX_BSS, 418 IWL_RXON_CTX_PAN, 419 420 NUM_IWL_RXON_CTX 421}; 422 423int iwl_probe(struct iwl_bus *bus, const struct iwl_trans_ops *trans_ops, 424 struct iwl_cfg *cfg); 425void __devexit iwl_remove(struct iwl_priv * priv); 426struct iwl_device_cmd; 427int __must_check iwl_rx_dispatch(struct iwl_priv *priv, 428 struct iwl_rx_mem_buffer *rxb, 429 struct iwl_device_cmd *cmd); 430 431int iwlagn_hw_valid_rtc_data_addr(u32 addr); 432void iwl_start_tx_ba_trans_ready(struct iwl_priv *priv, 433 enum iwl_rxon_context_id ctx, 434 u8 sta_id, u8 tid); 435void iwl_stop_tx_ba_trans_ready(struct iwl_priv *priv, 436 enum iwl_rxon_context_id ctx, 437 u8 sta_id, u8 tid); 438void iwl_set_hw_rfkill_state(struct iwl_priv *priv, bool state); 439void iwl_nic_config(struct iwl_priv *priv); 440void iwl_free_skb(struct iwl_priv *priv, struct sk_buff *skb); 441void iwl_apm_stop(struct iwl_priv *priv); 442int iwl_apm_init(struct iwl_priv *priv); 443void iwlagn_fw_error(struct iwl_priv *priv, bool ondemand); 444const char *get_cmd_string(u8 cmd); 445bool iwl_check_for_ct_kill(struct iwl_priv *priv); 446 447void iwl_stop_sw_queue(struct iwl_priv *priv, u8 ac); 448void iwl_wake_sw_queue(struct iwl_priv *priv, u8 ac); 449 450#ifdef CONFIG_IWLWIFI_DEBUGFS 451void iwl_reset_traffic_log(struct iwl_priv *priv); 452#endif /* CONFIG_IWLWIFI_DEBUGFS */ 453 454#ifdef CONFIG_IWLWIFI_DEBUG 455void iwl_print_rx_config_cmd(struct iwl_priv *priv, 456 enum iwl_rxon_context_id ctxid); 457#else 458static inline void iwl_print_rx_config_cmd(struct iwl_priv *priv, 459 enum iwl_rxon_context_id ctxid) 460{ 461} 462#endif 463 464#define IWL_CMD(x) case x: return #x 465#define IWL_MASK(lo, hi) ((1 << (hi)) | ((1 << (hi)) - (1 << (lo)))) 466 467#define IWL_TRAFFIC_ENTRIES (256) 468#define IWL_TRAFFIC_ENTRY_SIZE (64) 469 470/***************************************************** 471* DRIVER STATUS FUNCTIONS 472******************************************************/ 473#define STATUS_HCMD_ACTIVE 0 /* host command in progress */ 474/* 1 is unused (used to be STATUS_HCMD_SYNC_ACTIVE) */ 475#define STATUS_INT_ENABLED 2 476#define STATUS_RF_KILL_HW 3 477#define STATUS_CT_KILL 4 478#define STATUS_INIT 5 479#define STATUS_ALIVE 6 480#define STATUS_READY 7 481#define STATUS_TEMPERATURE 8 482#define STATUS_GEO_CONFIGURED 9 483#define STATUS_EXIT_PENDING 10 484#define STATUS_STATISTICS 12 485#define STATUS_SCANNING 13 486#define STATUS_SCAN_ABORTING 14 487#define STATUS_SCAN_HW 15 488#define STATUS_POWER_PMI 16 489#define STATUS_FW_ERROR 17 490#define STATUS_DEVICE_ENABLED 18 491#define STATUS_CHANNEL_SWITCH_PENDING 19 492#define STATUS_SCAN_COMPLETE 20 493 494static inline int iwl_is_ready(struct iwl_shared *shrd) 495{ 496 /* The adapter is 'ready' if READY and GEO_CONFIGURED bits are 497 * set but EXIT_PENDING is not */ 498 return test_bit(STATUS_READY, &shrd->status) && 499 test_bit(STATUS_GEO_CONFIGURED, &shrd->status) && 500 !test_bit(STATUS_EXIT_PENDING, &shrd->status); 501} 502 503static inline int iwl_is_alive(struct iwl_shared *shrd) 504{ 505 return test_bit(STATUS_ALIVE, &shrd->status); 506} 507 508static inline int iwl_is_init(struct iwl_shared *shrd) 509{ 510 return test_bit(STATUS_INIT, &shrd->status); 511} 512 513static inline int iwl_is_rfkill_hw(struct iwl_shared *shrd) 514{ 515 return test_bit(STATUS_RF_KILL_HW, &shrd->status); 516} 517 518static inline int iwl_is_rfkill(struct iwl_shared *shrd) 519{ 520 return iwl_is_rfkill_hw(shrd); 521} 522 523static inline int iwl_is_ctkill(struct iwl_shared *shrd) 524{ 525 return test_bit(STATUS_CT_KILL, &shrd->status); 526} 527 528static inline int iwl_is_ready_rf(struct iwl_shared *shrd) 529{ 530 if (iwl_is_rfkill(shrd)) 531 return 0; 532 533 return iwl_is_ready(shrd); 534} 535 536#endif /* #__iwl_shared_h__ */ 537