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