iwl-shared.h revision 859cfb0a99369cf51dc2125ebc3476382a15c322
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/*This files includes all the types / functions that are exported by the 76 * upper layer to the bus and transport layer */ 77 78struct iwl_cfg; 79struct iwl_bus; 80struct iwl_priv; 81struct iwl_sensitivity_ranges; 82struct iwl_trans_ops; 83 84#define DRV_NAME "iwlagn" 85#define IWLWIFI_VERSION "in-tree:" 86#define DRV_COPYRIGHT "Copyright(c) 2003-2011 Intel Corporation" 87#define DRV_AUTHOR "<ilw@linux.intel.com>" 88 89extern struct iwl_mod_params iwlagn_mod_params; 90 91/** 92 * struct iwl_mod_params 93 * @sw_crypto: using hardware encryption, default = 0 94 * @num_of_queues: number of tx queue, HW dependent 95 * @disable_11n: 11n capabilities enabled, default = 0 96 * @amsdu_size_8K: enable 8K amsdu size, default = 1 97 * @antenna: both antennas (use diversity), default = 0 98 * @restart_fw: restart firmware, default = 1 99 * @plcp_check: enable plcp health check, default = true 100 * @ack_check: disable ack health check, default = false 101 * @wd_disable: enable stuck queue check, default = false 102 * @bt_coex_active: enable bt coex, default = true 103 * @led_mode: system default, default = 0 104 * @no_sleep_autoadjust: disable autoadjust, default = true 105 * @power_save: disable power save, default = false 106 * @power_level: power level, default = 1 107 * @debug_level: levels are IWL_DL_* 108 * @ant_coupling: antenna coupling in dB, default = 0 109 * @bt_ch_announce: BT channel inhibition, default = enable 110 * @wanted_ucode_alternative: ucode alternative to use, default = 1 111 * @auto_agg: enable agg. without check, default = true 112 */ 113struct iwl_mod_params { 114 int sw_crypto; 115 int num_of_queues; 116 int disable_11n; 117 int amsdu_size_8K; 118 int antenna; 119 int restart_fw; 120 bool plcp_check; 121 bool ack_check; 122 bool wd_disable; 123 bool bt_coex_active; 124 int led_mode; 125 bool no_sleep_autoadjust; 126 bool power_save; 127 int power_level; 128 u32 debug_level; 129 int ant_coupling; 130 bool bt_ch_announce; 131 int wanted_ucode_alternative; 132 bool auto_agg; 133}; 134 135/** 136 * struct iwl_hw_params 137 * @max_txq_num: Max # Tx queues supported 138 * @num_ampdu_queues: num of ampdu queues 139 * @tx/rx_chains_num: Number of TX/RX chains 140 * @valid_tx/rx_ant: usable antennas 141 * @max_stations: 142 * @ht40_channel: is 40MHz width possible in band 2.4 143 * @beacon_time_tsf_bits: number of valid tsf bits for beacon time 144 * @sku: 145 * @rx_page_order: Rx buffer page order 146 * @rx_wrt_ptr_reg: FH{39}_RSCSR_CHNL0_WPTR 147 * BIT(IEEE80211_BAND_5GHZ) BIT(IEEE80211_BAND_5GHZ) 148 * @sw_crypto: 0 for hw, 1 for sw 149 * @max_xxx_size: for ucode uses 150 * @ct_kill_threshold: temperature threshold 151 * @wd_timeout: TX queues watchdog timeout 152 * @calib_init_cfg: setup initial calibrations for the hw 153 * @calib_rt_cfg: setup runtime calibrations for the hw 154 * @struct iwl_sensitivity_ranges: range of sensitivity values 155 */ 156struct iwl_hw_params { 157 u8 max_txq_num; 158 u8 num_ampdu_queues; 159 u8 tx_chains_num; 160 u8 rx_chains_num; 161 u8 valid_tx_ant; 162 u8 valid_rx_ant; 163 u8 max_stations; 164 u8 ht40_channel; 165 bool shadow_reg_enable; 166 u16 beacon_time_tsf_bits; 167 u16 sku; 168 u32 rx_page_order; 169 u32 max_inst_size; 170 u32 max_data_size; 171 u32 ct_kill_threshold; /* value in hw-dependent units */ 172 u32 ct_kill_exit_threshold; /* value in hw-dependent units */ 173 /* for 1000, 6000 series and up */ 174 unsigned int wd_timeout; 175 176 u32 calib_init_cfg; 177 u32 calib_rt_cfg; 178 const struct iwl_sensitivity_ranges *sens; 179}; 180 181/** 182 * struct iwl_ht_agg - aggregation status while waiting for block-ack 183 * @txq_id: Tx queue used for Tx attempt 184 * @wait_for_ba: Expect block-ack before next Tx reply 185 * @rate_n_flags: Rate at which Tx was attempted 186 * 187 * If REPLY_TX indicates that aggregation was attempted, driver must wait 188 * for block ack (REPLY_COMPRESSED_BA). This struct stores tx reply info 189 * until block ack arrives. 190 */ 191struct iwl_ht_agg { 192 u16 txq_id; 193 u16 wait_for_ba; 194 u32 rate_n_flags; 195#define IWL_AGG_OFF 0 196#define IWL_AGG_ON 1 197#define IWL_EMPTYING_HW_QUEUE_ADDBA 2 198#define IWL_EMPTYING_HW_QUEUE_DELBA 3 199 u8 state; 200}; 201 202struct iwl_tid_data { 203 u16 seq_number; /* agn only */ 204 u16 tfds_in_queue; 205 struct iwl_ht_agg agg; 206}; 207 208/** 209 * struct iwl_shared - shared fields for all the layers of the driver 210 * 211 * @dbg_level_dev: dbg level set per device. Prevails on 212 * iwlagn_mod_params.debug_level if set (!= 0) 213 * @ucode_owner: IWL_OWNERSHIP_* 214 * @cmd_queue: command queue number 215 * @status: STATUS_* 216 * @valid_contexts: microcode/device supports multiple contexts 217 * @bus: pointer to the bus layer data 218 * @priv: pointer to the upper layer data 219 * @hw_params: see struct iwl_hw_params 220 * @workqueue: the workqueue used by all the layers of the driver 221 * @lock: protect general shared data 222 * @sta_lock: protects the station table. 223 * If lock and sta_lock are needed, lock must be acquired first. 224 * @mutex: 225 */ 226struct iwl_shared { 227#ifdef CONFIG_IWLWIFI_DEBUG 228 u32 dbg_level_dev; 229#endif /* CONFIG_IWLWIFI_DEBUG */ 230 231#define IWL_OWNERSHIP_DRIVER 0 232#define IWL_OWNERSHIP_TM 1 233 u8 ucode_owner; 234 u8 cmd_queue; 235 unsigned long status; 236 bool wowlan; 237 u8 valid_contexts; 238 239 struct iwl_bus *bus; 240 struct iwl_priv *priv; 241 struct iwl_trans *trans; 242 struct iwl_hw_params hw_params; 243 244 struct workqueue_struct *workqueue; 245 spinlock_t lock; 246 spinlock_t sta_lock; 247 struct mutex mutex; 248 249 struct iwl_tid_data tid_data[IWLAGN_STATION_COUNT][IWL_MAX_TID_COUNT]; 250 251 wait_queue_head_t wait_command_queue; 252}; 253 254/*Whatever _m is (iwl_trans, iwl_priv, iwl_bus, these macros will work */ 255#define priv(_m) ((_m)->shrd->priv) 256#define bus(_m) ((_m)->shrd->bus) 257#define trans(_m) ((_m)->shrd->trans) 258#define hw_params(_m) ((_m)->shrd->hw_params) 259 260#ifdef CONFIG_IWLWIFI_DEBUG 261/* 262 * iwl_get_debug_level: Return active debug level for device 263 * 264 * Using sysfs it is possible to set per device debug level. This debug 265 * level will be used if set, otherwise the global debug level which can be 266 * set via module parameter is used. 267 */ 268static inline u32 iwl_get_debug_level(struct iwl_shared *shrd) 269{ 270 if (shrd->dbg_level_dev) 271 return shrd->dbg_level_dev; 272 else 273 return iwlagn_mod_params.debug_level; 274} 275#else 276static inline u32 iwl_get_debug_level(struct iwl_shared *shrd) 277{ 278 return iwlagn_mod_params.debug_level; 279} 280#endif 281 282static inline void iwl_free_pages(struct iwl_shared *shrd, unsigned long page) 283{ 284 free_pages(page, shrd->hw_params.rx_page_order); 285} 286 287/** 288 * iwl_queue_inc_wrap - increment queue index, wrap back to beginning 289 * @index -- current index 290 * @n_bd -- total number of entries in queue (must be power of 2) 291 */ 292static inline int iwl_queue_inc_wrap(int index, int n_bd) 293{ 294 return ++index & (n_bd - 1); 295} 296 297/** 298 * iwl_queue_dec_wrap - decrement queue index, wrap back to end 299 * @index -- current index 300 * @n_bd -- total number of entries in queue (must be power of 2) 301 */ 302static inline int iwl_queue_dec_wrap(int index, int n_bd) 303{ 304 return --index & (n_bd - 1); 305} 306 307struct iwl_rx_mem_buffer { 308 dma_addr_t page_dma; 309 struct page *page; 310 struct list_head list; 311}; 312 313#define rxb_addr(r) page_address(r->page) 314 315/* 316 * mac80211 queues, ACs, hardware queues, FIFOs. 317 * 318 * Cf. http://wireless.kernel.org/en/developers/Documentation/mac80211/queues 319 * 320 * Mac80211 uses the following numbers, which we get as from it 321 * by way of skb_get_queue_mapping(skb): 322 * 323 * VO 0 324 * VI 1 325 * BE 2 326 * BK 3 327 * 328 * 329 * Regular (not A-MPDU) frames are put into hardware queues corresponding 330 * to the FIFOs, see comments in iwl-prph.h. Aggregated frames get their 331 * own queue per aggregation session (RA/TID combination), such queues are 332 * set up to map into FIFOs too, for which we need an AC->FIFO mapping. In 333 * order to map frames to the right queue, we also need an AC->hw queue 334 * mapping. This is implemented here. 335 * 336 * Due to the way hw queues are set up (by the hw specific modules like 337 * iwl-4965.c, iwl-5000.c etc.), the AC->hw queue mapping is the identity 338 * mapping. 339 */ 340 341static const u8 tid_to_ac[] = { 342 IEEE80211_AC_BE, 343 IEEE80211_AC_BK, 344 IEEE80211_AC_BK, 345 IEEE80211_AC_BE, 346 IEEE80211_AC_VI, 347 IEEE80211_AC_VI, 348 IEEE80211_AC_VO, 349 IEEE80211_AC_VO 350}; 351 352static inline int get_ac_from_tid(u16 tid) 353{ 354 if (likely(tid < ARRAY_SIZE(tid_to_ac))) 355 return tid_to_ac[tid]; 356 357 /* no support for TIDs 8-15 yet */ 358 return -EINVAL; 359} 360 361enum iwl_rxon_context_id { 362 IWL_RXON_CTX_BSS, 363 IWL_RXON_CTX_PAN, 364 365 NUM_IWL_RXON_CTX 366}; 367 368#ifdef CONFIG_PM 369int iwl_suspend(struct iwl_priv *priv); 370int iwl_resume(struct iwl_priv *priv); 371#endif /* !CONFIG_PM */ 372 373int iwl_probe(struct iwl_bus *bus, const struct iwl_trans_ops *trans_ops, 374 struct iwl_cfg *cfg); 375void __devexit iwl_remove(struct iwl_priv * priv); 376 377void iwl_rx_dispatch(struct iwl_priv *priv, struct iwl_rx_mem_buffer *rxb); 378int iwlagn_hw_valid_rtc_data_addr(u32 addr); 379void iwl_start_tx_ba_trans_ready(struct iwl_priv *priv, 380 enum iwl_rxon_context_id ctx, 381 u8 sta_id, u8 tid); 382void iwl_stop_tx_ba_trans_ready(struct iwl_priv *priv, 383 enum iwl_rxon_context_id ctx, 384 u8 sta_id, u8 tid); 385void iwl_set_hw_rfkill_state(struct iwl_priv *priv, bool state); 386void iwl_nic_config(struct iwl_priv *priv); 387void iwl_free_skb(struct iwl_priv *priv, struct sk_buff *skb); 388void iwl_apm_stop(struct iwl_priv *priv); 389int iwl_apm_init(struct iwl_priv *priv); 390void iwlagn_fw_error(struct iwl_priv *priv, bool ondemand); 391const char *get_cmd_string(u8 cmd); 392bool iwl_check_for_ct_kill(struct iwl_priv *priv); 393 394void iwl_stop_sw_queue(struct iwl_priv *priv, u8 ac); 395void iwl_wake_sw_queue(struct iwl_priv *priv, u8 ac); 396 397#ifdef CONFIG_IWLWIFI_DEBUGFS 398void iwl_reset_traffic_log(struct iwl_priv *priv); 399#endif /* CONFIG_IWLWIFI_DEBUGFS */ 400 401#ifdef CONFIG_IWLWIFI_DEBUG 402void iwl_print_rx_config_cmd(struct iwl_priv *priv, u8 ctxid); 403#else 404static inline void iwl_print_rx_config_cmd(struct iwl_priv *priv, u8 ctxid) 405{ 406} 407#endif 408 409#define IWL_CMD(x) case x: return #x 410#define IWL_MASK(lo, hi) ((1 << (hi)) | ((1 << (hi)) - (1 << (lo)))) 411 412#define IWL_TRAFFIC_ENTRIES (256) 413#define IWL_TRAFFIC_ENTRY_SIZE (64) 414 415/***************************************************** 416* DRIVER STATUS FUNCTIONS 417******************************************************/ 418#define STATUS_HCMD_ACTIVE 0 /* host command in progress */ 419/* 1 is unused (used to be STATUS_HCMD_SYNC_ACTIVE) */ 420#define STATUS_INT_ENABLED 2 421#define STATUS_RF_KILL_HW 3 422#define STATUS_CT_KILL 4 423#define STATUS_INIT 5 424#define STATUS_ALIVE 6 425#define STATUS_READY 7 426#define STATUS_TEMPERATURE 8 427#define STATUS_GEO_CONFIGURED 9 428#define STATUS_EXIT_PENDING 10 429#define STATUS_STATISTICS 12 430#define STATUS_SCANNING 13 431#define STATUS_SCAN_ABORTING 14 432#define STATUS_SCAN_HW 15 433#define STATUS_POWER_PMI 16 434#define STATUS_FW_ERROR 17 435#define STATUS_DEVICE_ENABLED 18 436#define STATUS_CHANNEL_SWITCH_PENDING 19 437 438static inline int iwl_is_ready(struct iwl_shared *shrd) 439{ 440 /* The adapter is 'ready' if READY and GEO_CONFIGURED bits are 441 * set but EXIT_PENDING is not */ 442 return test_bit(STATUS_READY, &shrd->status) && 443 test_bit(STATUS_GEO_CONFIGURED, &shrd->status) && 444 !test_bit(STATUS_EXIT_PENDING, &shrd->status); 445} 446 447static inline int iwl_is_alive(struct iwl_shared *shrd) 448{ 449 return test_bit(STATUS_ALIVE, &shrd->status); 450} 451 452static inline int iwl_is_init(struct iwl_shared *shrd) 453{ 454 return test_bit(STATUS_INIT, &shrd->status); 455} 456 457static inline int iwl_is_rfkill_hw(struct iwl_shared *shrd) 458{ 459 return test_bit(STATUS_RF_KILL_HW, &shrd->status); 460} 461 462static inline int iwl_is_rfkill(struct iwl_shared *shrd) 463{ 464 return iwl_is_rfkill_hw(shrd); 465} 466 467static inline int iwl_is_ctkill(struct iwl_shared *shrd) 468{ 469 return test_bit(STATUS_CT_KILL, &shrd->status); 470} 471 472static inline int iwl_is_ready_rf(struct iwl_shared *shrd) 473{ 474 if (iwl_is_rfkill(shrd)) 475 return 0; 476 477 return iwl_is_ready(shrd); 478} 479 480#endif /* #__iwl_shared_h__ */ 481