Commit | Line | Data |
---|---|---|
be663ab6 WYG |
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) 2008 - 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 | ||
e2ebc833 SG |
63 | #ifndef __il_core_h__ |
64 | #define __il_core_h__ | |
be663ab6 WYG |
65 | |
66 | /************************ | |
67 | * forward declarations * | |
68 | ************************/ | |
e2ebc833 SG |
69 | struct il_host_cmd; |
70 | struct il_cmd; | |
be663ab6 WYG |
71 | |
72 | ||
73 | #define IWLWIFI_VERSION "in-tree:" | |
74 | #define DRV_COPYRIGHT "Copyright(c) 2003-2011 Intel Corporation" | |
75 | #define DRV_AUTHOR "<ilw@linux.intel.com>" | |
76 | ||
e2ebc833 | 77 | #define IL_PCI_DEVICE(dev, subdev, cfg) \ |
be663ab6 WYG |
78 | .vendor = PCI_VENDOR_ID_INTEL, .device = (dev), \ |
79 | .subvendor = PCI_ANY_ID, .subdevice = (subdev), \ | |
80 | .driver_data = (kernel_ulong_t)&(cfg) | |
81 | ||
82 | #define TIME_UNIT 1024 | |
83 | ||
e2ebc833 SG |
84 | #define IL_SKU_G 0x1 |
85 | #define IL_SKU_A 0x2 | |
86 | #define IL_SKU_N 0x8 | |
be663ab6 | 87 | |
e2ebc833 | 88 | #define IL_CMD(x) case x: return #x |
be663ab6 | 89 | |
e2ebc833 | 90 | struct il_hcmd_ops { |
46bc8d4b SG |
91 | int (*rxon_assoc)(struct il_priv *il, struct il_rxon_context *ctx); |
92 | int (*commit_rxon)(struct il_priv *il, struct il_rxon_context *ctx); | |
93 | void (*set_rxon_chain)(struct il_priv *il, | |
e2ebc833 | 94 | struct il_rxon_context *ctx); |
be663ab6 WYG |
95 | }; |
96 | ||
e2ebc833 | 97 | struct il_hcmd_utils_ops { |
be663ab6 | 98 | u16 (*get_hcmd_size)(u8 cmd_id, u16 len); |
e2ebc833 | 99 | u16 (*build_addsta_hcmd)(const struct il_addsta_cmd *cmd, |
be663ab6 | 100 | u8 *data); |
46bc8d4b SG |
101 | int (*request_scan)(struct il_priv *il, struct ieee80211_vif *vif); |
102 | void (*post_scan)(struct il_priv *il); | |
be663ab6 WYG |
103 | }; |
104 | ||
e2ebc833 | 105 | struct il_apm_ops { |
46bc8d4b SG |
106 | int (*init)(struct il_priv *il); |
107 | void (*config)(struct il_priv *il); | |
be663ab6 WYG |
108 | }; |
109 | ||
e2ebc833 | 110 | struct il_debugfs_ops { |
be663ab6 WYG |
111 | ssize_t (*rx_stats_read)(struct file *file, char __user *user_buf, |
112 | size_t count, loff_t *ppos); | |
113 | ssize_t (*tx_stats_read)(struct file *file, char __user *user_buf, | |
114 | size_t count, loff_t *ppos); | |
115 | ssize_t (*general_stats_read)(struct file *file, char __user *user_buf, | |
116 | size_t count, loff_t *ppos); | |
117 | }; | |
118 | ||
e2ebc833 | 119 | struct il_temp_ops { |
46bc8d4b | 120 | void (*temperature)(struct il_priv *il); |
be663ab6 WYG |
121 | }; |
122 | ||
e2ebc833 | 123 | struct il_lib_ops { |
be663ab6 | 124 | /* set hw dependent parameters */ |
46bc8d4b | 125 | int (*set_hw_params)(struct il_priv *il); |
be663ab6 | 126 | /* Handling TX */ |
46bc8d4b | 127 | void (*txq_update_byte_cnt_tbl)(struct il_priv *il, |
e2ebc833 | 128 | struct il_tx_queue *txq, |
be663ab6 | 129 | u16 byte_cnt); |
46bc8d4b | 130 | int (*txq_attach_buf_to_tfd)(struct il_priv *il, |
e2ebc833 | 131 | struct il_tx_queue *txq, |
be663ab6 WYG |
132 | dma_addr_t addr, |
133 | u16 len, u8 reset, u8 pad); | |
46bc8d4b | 134 | void (*txq_free_tfd)(struct il_priv *il, |
e2ebc833 | 135 | struct il_tx_queue *txq); |
46bc8d4b | 136 | int (*txq_init)(struct il_priv *il, |
e2ebc833 | 137 | struct il_tx_queue *txq); |
be663ab6 | 138 | /* setup Rx handler */ |
d0c72347 | 139 | void (*handler_setup)(struct il_priv *il); |
be663ab6 | 140 | /* alive notification after init uCode load */ |
46bc8d4b | 141 | void (*init_alive_start)(struct il_priv *il); |
be663ab6 WYG |
142 | /* check validity of rtc data address */ |
143 | int (*is_valid_rtc_data_addr)(u32 addr); | |
144 | /* 1st ucode load */ | |
46bc8d4b | 145 | int (*load_ucode)(struct il_priv *il); |
1ba2f121 | 146 | |
46bc8d4b SG |
147 | void (*dump_nic_error_log)(struct il_priv *il); |
148 | int (*dump_fh)(struct il_priv *il, char **buf, bool display); | |
149 | int (*set_channel_switch)(struct il_priv *il, | |
be663ab6 WYG |
150 | struct ieee80211_channel_switch *ch_switch); |
151 | /* power management */ | |
e2ebc833 | 152 | struct il_apm_ops apm_ops; |
be663ab6 WYG |
153 | |
154 | /* power */ | |
46bc8d4b SG |
155 | int (*send_tx_power) (struct il_priv *il); |
156 | void (*update_chain_flags)(struct il_priv *il); | |
be663ab6 WYG |
157 | |
158 | /* eeprom operations (as defined in iwl-eeprom.h) */ | |
e2ebc833 | 159 | struct il_eeprom_ops eeprom_ops; |
be663ab6 WYG |
160 | |
161 | /* temperature */ | |
e2ebc833 | 162 | struct il_temp_ops temp_ops; |
be663ab6 | 163 | |
e2ebc833 | 164 | struct il_debugfs_ops debugfs_ops; |
be663ab6 WYG |
165 | |
166 | }; | |
167 | ||
e2ebc833 | 168 | struct il_led_ops { |
46bc8d4b | 169 | int (*cmd)(struct il_priv *il, struct il_led_cmd *led_cmd); |
be663ab6 WYG |
170 | }; |
171 | ||
e2ebc833 | 172 | struct il_legacy_ops { |
46bc8d4b SG |
173 | void (*post_associate)(struct il_priv *il); |
174 | void (*config_ap)(struct il_priv *il); | |
be663ab6 | 175 | /* station management */ |
46bc8d4b SG |
176 | int (*update_bcast_stations)(struct il_priv *il); |
177 | int (*manage_ibss_station)(struct il_priv *il, | |
be663ab6 WYG |
178 | struct ieee80211_vif *vif, bool add); |
179 | }; | |
180 | ||
e2ebc833 SG |
181 | struct il_ops { |
182 | const struct il_lib_ops *lib; | |
183 | const struct il_hcmd_ops *hcmd; | |
184 | const struct il_hcmd_utils_ops *utils; | |
185 | const struct il_led_ops *led; | |
186 | const struct il_nic_ops *nic; | |
187 | const struct il_legacy_ops *legacy; | |
be663ab6 WYG |
188 | const struct ieee80211_ops *ieee80211_ops; |
189 | }; | |
190 | ||
e2ebc833 | 191 | struct il_mod_params { |
be663ab6 WYG |
192 | int sw_crypto; /* def: 0 = using hardware encryption */ |
193 | int disable_hw_scan; /* def: 0 = use h/w scan */ | |
194 | int num_of_queues; /* def: HW dependent */ | |
195 | int disable_11n; /* def: 0 = 11n capabilities enabled */ | |
196 | int amsdu_size_8K; /* def: 1 = enable 8K amsdu size */ | |
197 | int antenna; /* def: 0 = both antennas (use diversity) */ | |
198 | int restart_fw; /* def: 1 = restart firmware */ | |
199 | }; | |
200 | ||
201 | /* | |
202 | * @led_compensation: compensate on the led on/off time per HW according | |
203 | * to the deviation to achieve the desired led frequency. | |
204 | * The detail algorithm is described in iwl-led.c | |
205 | * @chain_noise_num_beacons: number of beacons used to compute chain noise | |
be663ab6 WYG |
206 | * @wd_timeout: TX queues watchdog timeout |
207 | * @temperature_kelvin: temperature report by uCode in kelvin | |
be663ab6 WYG |
208 | * @ucode_tracing: support ucode continuous tracing |
209 | * @sensitivity_calib_by_driver: driver has the capability to perform | |
210 | * sensitivity calibration operation | |
211 | * @chain_noise_calib_by_driver: driver has the capability to perform | |
212 | * chain noise calibration operation | |
213 | */ | |
e2ebc833 | 214 | struct il_base_params { |
be663ab6 WYG |
215 | int eeprom_size; |
216 | int num_of_queues; /* def: HW dependent */ | |
217 | int num_of_ampdu_queues;/* def: HW dependent */ | |
e2ebc833 | 218 | /* for il_apm_init() */ |
be663ab6 WYG |
219 | u32 pll_cfg_val; |
220 | bool set_l0s; | |
221 | bool use_bsm; | |
222 | ||
223 | u16 led_compensation; | |
224 | int chain_noise_num_beacons; | |
be663ab6 WYG |
225 | unsigned int wd_timeout; |
226 | bool temperature_kelvin; | |
be663ab6 WYG |
227 | const bool ucode_tracing; |
228 | const bool sensitivity_calib_by_driver; | |
229 | const bool chain_noise_calib_by_driver; | |
230 | }; | |
231 | ||
232 | /** | |
e2ebc833 | 233 | * struct il_cfg |
be663ab6 WYG |
234 | * @fw_name_pre: Firmware filename prefix. The api version and extension |
235 | * (.ucode) will be added to filename before loading from disk. The | |
236 | * filename is constructed as fw_name_pre<api>.ucode. | |
237 | * @ucode_api_max: Highest version of uCode API supported by driver. | |
238 | * @ucode_api_min: Lowest version of uCode API supported by driver. | |
239 | * @scan_antennas: available antenna for scan operation | |
240 | * @led_mode: 0=blinking, 1=On(RF On)/Off(RF Off) | |
241 | * | |
242 | * We enable the driver to be backward compatible wrt API version. The | |
243 | * driver specifies which APIs it supports (with @ucode_api_max being the | |
244 | * highest and @ucode_api_min the lowest). Firmware will only be loaded if | |
245 | * it has a supported API version. The firmware's API version will be | |
e2ebc833 | 246 | * stored in @il_priv, enabling the driver to make runtime changes based |
be663ab6 WYG |
247 | * on firmware version used. |
248 | * | |
249 | * For example, | |
46bc8d4b | 250 | * if (IL_UCODE_API(il->ucode_ver) >= 2) { |
be663ab6 WYG |
251 | * Driver interacts with Firmware API version >= 2. |
252 | * } else { | |
253 | * Driver interacts with Firmware API version 1. | |
254 | * } | |
255 | * | |
256 | * The ideal usage of this infrastructure is to treat a new ucode API | |
257 | * release as a new hardware revision. That is, through utilizing the | |
e2ebc833 | 258 | * il_hcmd_utils_ops etc. we accommodate different command structures |
be663ab6 WYG |
259 | * and flows between hardware versions as well as their API |
260 | * versions. | |
261 | * | |
262 | */ | |
e2ebc833 | 263 | struct il_cfg { |
be663ab6 WYG |
264 | /* params specific to an individual device within a device family */ |
265 | const char *name; | |
266 | const char *fw_name_pre; | |
267 | const unsigned int ucode_api_max; | |
268 | const unsigned int ucode_api_min; | |
269 | u8 valid_tx_ant; | |
270 | u8 valid_rx_ant; | |
271 | unsigned int sku; | |
272 | u16 eeprom_ver; | |
273 | u16 eeprom_calib_ver; | |
e2ebc833 | 274 | const struct il_ops *ops; |
be663ab6 | 275 | /* module based parameters which can be set from modprobe cmd */ |
e2ebc833 | 276 | const struct il_mod_params *mod_params; |
be663ab6 | 277 | /* params not likely to change within a device family */ |
e2ebc833 | 278 | struct il_base_params *base_params; |
be663ab6 WYG |
279 | /* params likely to change within a device family */ |
280 | u8 scan_rx_antennas[IEEE80211_NUM_BANDS]; | |
e2ebc833 | 281 | enum il_led_mode led_mode; |
be663ab6 WYG |
282 | }; |
283 | ||
284 | /*************************** | |
285 | * L i b * | |
286 | ***************************/ | |
287 | ||
e2ebc833 SG |
288 | struct ieee80211_hw *il_alloc_all(struct il_cfg *cfg); |
289 | int il_mac_conf_tx(struct ieee80211_hw *hw, | |
8a3a3c85 | 290 | struct ieee80211_vif *vif, u16 queue, |
be663ab6 | 291 | const struct ieee80211_tx_queue_params *params); |
e2ebc833 | 292 | int il_mac_tx_last_beacon(struct ieee80211_hw *hw); |
46bc8d4b | 293 | void il_set_rxon_hwcrypto(struct il_priv *il, |
e2ebc833 | 294 | struct il_rxon_context *ctx, |
be663ab6 | 295 | int hw_decrypt); |
46bc8d4b | 296 | int il_check_rxon_cmd(struct il_priv *il, |
e2ebc833 | 297 | struct il_rxon_context *ctx); |
46bc8d4b | 298 | int il_full_rxon_required(struct il_priv *il, |
e2ebc833 | 299 | struct il_rxon_context *ctx); |
46bc8d4b | 300 | int il_set_rxon_channel(struct il_priv *il, |
be663ab6 | 301 | struct ieee80211_channel *ch, |
e2ebc833 | 302 | struct il_rxon_context *ctx); |
46bc8d4b | 303 | void il_set_flags_for_band(struct il_priv *il, |
e2ebc833 | 304 | struct il_rxon_context *ctx, |
be663ab6 WYG |
305 | enum ieee80211_band band, |
306 | struct ieee80211_vif *vif); | |
46bc8d4b | 307 | u8 il_get_single_channel_number(struct il_priv *il, |
be663ab6 | 308 | enum ieee80211_band band); |
46bc8d4b | 309 | void il_set_rxon_ht(struct il_priv *il, |
e2ebc833 | 310 | struct il_ht_config *ht_conf); |
46bc8d4b | 311 | bool il_is_ht40_tx_allowed(struct il_priv *il, |
e2ebc833 | 312 | struct il_rxon_context *ctx, |
be663ab6 | 313 | struct ieee80211_sta_ht_cap *ht_cap); |
46bc8d4b | 314 | void il_connection_init_rx_config(struct il_priv *il, |
e2ebc833 | 315 | struct il_rxon_context *ctx); |
46bc8d4b SG |
316 | void il_set_rate(struct il_priv *il); |
317 | int il_set_decrypted_flag(struct il_priv *il, | |
be663ab6 WYG |
318 | struct ieee80211_hdr *hdr, |
319 | u32 decrypt_res, | |
320 | struct ieee80211_rx_status *stats); | |
46bc8d4b | 321 | void il_irq_handle_error(struct il_priv *il); |
e2ebc833 | 322 | int il_mac_add_interface(struct ieee80211_hw *hw, |
be663ab6 | 323 | struct ieee80211_vif *vif); |
e2ebc833 | 324 | void il_mac_remove_interface(struct ieee80211_hw *hw, |
be663ab6 | 325 | struct ieee80211_vif *vif); |
e2ebc833 | 326 | int il_mac_change_interface(struct ieee80211_hw *hw, |
be663ab6 WYG |
327 | struct ieee80211_vif *vif, |
328 | enum nl80211_iftype newtype, bool newp2p); | |
46bc8d4b SG |
329 | int il_alloc_txq_mem(struct il_priv *il); |
330 | void il_txq_mem(struct il_priv *il); | |
be663ab6 | 331 | |
d3175167 | 332 | #ifdef CONFIG_IWLEGACY_DEBUGFS |
46bc8d4b SG |
333 | int il_alloc_traffic_mem(struct il_priv *il); |
334 | void il_free_traffic_mem(struct il_priv *il); | |
335 | void il_reset_traffic_log(struct il_priv *il); | |
336 | void il_dbg_log_tx_data_frame(struct il_priv *il, | |
be663ab6 | 337 | u16 length, struct ieee80211_hdr *header); |
46bc8d4b | 338 | void il_dbg_log_rx_data_frame(struct il_priv *il, |
be663ab6 | 339 | u16 length, struct ieee80211_hdr *header); |
e2ebc833 SG |
340 | const char *il_get_mgmt_string(int cmd); |
341 | const char *il_get_ctrl_string(int cmd); | |
46bc8d4b SG |
342 | void il_clear_traffic_stats(struct il_priv *il); |
343 | void il_update_stats(struct il_priv *il, bool is_tx, __le16 fc, | |
be663ab6 WYG |
344 | u16 len); |
345 | #else | |
46bc8d4b | 346 | static inline int il_alloc_traffic_mem(struct il_priv *il) |
be663ab6 WYG |
347 | { |
348 | return 0; | |
349 | } | |
46bc8d4b | 350 | static inline void il_free_traffic_mem(struct il_priv *il) |
be663ab6 WYG |
351 | { |
352 | } | |
46bc8d4b | 353 | static inline void il_reset_traffic_log(struct il_priv *il) |
be663ab6 WYG |
354 | { |
355 | } | |
46bc8d4b | 356 | static inline void il_dbg_log_tx_data_frame(struct il_priv *il, |
be663ab6 WYG |
357 | u16 length, struct ieee80211_hdr *header) |
358 | { | |
359 | } | |
46bc8d4b | 360 | static inline void il_dbg_log_rx_data_frame(struct il_priv *il, |
be663ab6 WYG |
361 | u16 length, struct ieee80211_hdr *header) |
362 | { | |
363 | } | |
46bc8d4b | 364 | static inline void il_update_stats(struct il_priv *il, bool is_tx, |
be663ab6 WYG |
365 | __le16 fc, u16 len) |
366 | { | |
367 | } | |
368 | #endif | |
369 | /***************************************************** | |
370 | * RX handlers. | |
371 | * **************************************************/ | |
d2dfb33e | 372 | void il_hdl_pm_sleep(struct il_priv *il, |
b73bb5f1 | 373 | struct il_rx_buf *rxb); |
d2dfb33e | 374 | void il_hdl_pm_debug_stats(struct il_priv *il, |
b73bb5f1 | 375 | struct il_rx_buf *rxb); |
6e9848b4 | 376 | void il_hdl_error(struct il_priv *il, |
b73bb5f1 | 377 | struct il_rx_buf *rxb); |
be663ab6 WYG |
378 | |
379 | /***************************************************** | |
380 | * RX | |
381 | ******************************************************/ | |
46bc8d4b SG |
382 | void il_cmd_queue_unmap(struct il_priv *il); |
383 | void il_cmd_queue_free(struct il_priv *il); | |
384 | int il_rx_queue_alloc(struct il_priv *il); | |
385 | void il_rx_queue_update_write_ptr(struct il_priv *il, | |
e2ebc833 SG |
386 | struct il_rx_queue *q); |
387 | int il_rx_queue_space(const struct il_rx_queue *q); | |
46bc8d4b | 388 | void il_tx_cmd_complete(struct il_priv *il, |
b73bb5f1 | 389 | struct il_rx_buf *rxb); |
be663ab6 | 390 | /* Handlers */ |
d2dfb33e | 391 | void il_hdl_spectrum_measurement(struct il_priv *il, |
b73bb5f1 | 392 | struct il_rx_buf *rxb); |
ebf0d90d | 393 | void il_recover_from_stats(struct il_priv *il, |
dcae1c64 | 394 | struct il_rx_pkt *pkt); |
46bc8d4b | 395 | void il_chswitch_done(struct il_priv *il, bool is_success); |
d2dfb33e | 396 | void il_hdl_csa(struct il_priv *il, struct il_rx_buf *rxb); |
be663ab6 WYG |
397 | |
398 | /* TX helpers */ | |
399 | ||
400 | /***************************************************** | |
401 | * TX | |
402 | ******************************************************/ | |
46bc8d4b | 403 | void il_txq_update_write_ptr(struct il_priv *il, |
e2ebc833 | 404 | struct il_tx_queue *txq); |
46bc8d4b | 405 | int il_tx_queue_init(struct il_priv *il, struct il_tx_queue *txq, |
be663ab6 | 406 | int slots_num, u32 txq_id); |
46bc8d4b | 407 | void il_tx_queue_reset(struct il_priv *il, |
e2ebc833 | 408 | struct il_tx_queue *txq, |
be663ab6 | 409 | int slots_num, u32 txq_id); |
46bc8d4b SG |
410 | void il_tx_queue_unmap(struct il_priv *il, int txq_id); |
411 | void il_tx_queue_free(struct il_priv *il, int txq_id); | |
412 | void il_setup_watchdog(struct il_priv *il); | |
be663ab6 WYG |
413 | /***************************************************** |
414 | * TX power | |
415 | ****************************************************/ | |
46bc8d4b | 416 | int il_set_tx_power(struct il_priv *il, s8 tx_power, bool force); |
be663ab6 WYG |
417 | |
418 | /******************************************************************************* | |
419 | * Rate | |
420 | ******************************************************************************/ | |
421 | ||
46bc8d4b | 422 | u8 il_get_lowest_plcp(struct il_priv *il, |
e2ebc833 | 423 | struct il_rxon_context *ctx); |
be663ab6 WYG |
424 | |
425 | /******************************************************************************* | |
426 | * Scanning | |
427 | ******************************************************************************/ | |
46bc8d4b SG |
428 | void il_init_scan_params(struct il_priv *il); |
429 | int il_scan_cancel(struct il_priv *il); | |
430 | int il_scan_cancel_timeout(struct il_priv *il, unsigned long ms); | |
431 | void il_force_scan_end(struct il_priv *il); | |
e2ebc833 | 432 | int il_mac_hw_scan(struct ieee80211_hw *hw, |
be663ab6 WYG |
433 | struct ieee80211_vif *vif, |
434 | struct cfg80211_scan_request *req); | |
46bc8d4b SG |
435 | void il_internal_short_hw_scan(struct il_priv *il); |
436 | int il_force_reset(struct il_priv *il, bool external); | |
437 | u16 il_fill_probe_req(struct il_priv *il, | |
be663ab6 WYG |
438 | struct ieee80211_mgmt *frame, |
439 | const u8 *ta, const u8 *ie, int ie_len, int left); | |
46bc8d4b SG |
440 | void il_setup_rx_scan_handlers(struct il_priv *il); |
441 | u16 il_get_active_dwell_time(struct il_priv *il, | |
be663ab6 WYG |
442 | enum ieee80211_band band, |
443 | u8 n_probes); | |
46bc8d4b | 444 | u16 il_get_passive_dwell_time(struct il_priv *il, |
be663ab6 WYG |
445 | enum ieee80211_band band, |
446 | struct ieee80211_vif *vif); | |
46bc8d4b SG |
447 | void il_setup_scan_deferred_work(struct il_priv *il); |
448 | void il_cancel_scan_deferred_work(struct il_priv *il); | |
be663ab6 WYG |
449 | |
450 | /* For faster active scanning, scan will move to the next channel if fewer than | |
451 | * PLCP_QUIET_THRESH packets are heard on this channel within | |
452 | * ACTIVE_QUIET_TIME after sending probe request. This shortens the dwell | |
453 | * time if it's a quiet channel (nothing responded to our probe, and there's | |
454 | * no other traffic). | |
455 | * Disable "quiet" feature by setting PLCP_QUIET_THRESH to 0. */ | |
e2ebc833 SG |
456 | #define IL_ACTIVE_QUIET_TIME cpu_to_le16(10) /* msec */ |
457 | #define IL_PLCP_QUIET_THRESH cpu_to_le16(1) /* packets */ | |
be663ab6 | 458 | |
e2ebc833 | 459 | #define IL_SCAN_CHECK_WATCHDOG (HZ * 7) |
be663ab6 WYG |
460 | |
461 | /***************************************************** | |
462 | * S e n d i n g H o s t C o m m a n d s * | |
463 | *****************************************************/ | |
464 | ||
e2ebc833 | 465 | const char *il_get_cmd_string(u8 cmd); |
46bc8d4b | 466 | int __must_check il_send_cmd_sync(struct il_priv *il, |
e2ebc833 | 467 | struct il_host_cmd *cmd); |
46bc8d4b SG |
468 | int il_send_cmd(struct il_priv *il, struct il_host_cmd *cmd); |
469 | int __must_check il_send_cmd_pdu(struct il_priv *il, u8 id, | |
be663ab6 | 470 | u16 len, const void *data); |
46bc8d4b | 471 | int il_send_cmd_pdu_async(struct il_priv *il, u8 id, u16 len, |
be663ab6 | 472 | const void *data, |
46bc8d4b | 473 | void (*callback)(struct il_priv *il, |
e2ebc833 | 474 | struct il_device_cmd *cmd, |
dcae1c64 | 475 | struct il_rx_pkt *pkt)); |
be663ab6 | 476 | |
46bc8d4b | 477 | int il_enqueue_hcmd(struct il_priv *il, struct il_host_cmd *cmd); |
be663ab6 WYG |
478 | |
479 | ||
480 | /***************************************************** | |
481 | * PCI * | |
482 | *****************************************************/ | |
483 | ||
46bc8d4b | 484 | static inline u16 il_pcie_link_ctl(struct il_priv *il) |
be663ab6 WYG |
485 | { |
486 | int pos; | |
487 | u16 pci_lnk_ctl; | |
46bc8d4b SG |
488 | pos = pci_pcie_cap(il->pci_dev); |
489 | pci_read_config_word(il->pci_dev, pos + PCI_EXP_LNKCTL, &pci_lnk_ctl); | |
be663ab6 WYG |
490 | return pci_lnk_ctl; |
491 | } | |
492 | ||
e2ebc833 | 493 | void il_bg_watchdog(unsigned long data); |
46bc8d4b | 494 | u32 il_usecs_to_beacons(struct il_priv *il, |
be663ab6 | 495 | u32 usec, u32 beacon_interval); |
46bc8d4b | 496 | __le32 il_add_beacon_time(struct il_priv *il, u32 base, |
be663ab6 WYG |
497 | u32 addon, u32 beacon_interval); |
498 | ||
499 | #ifdef CONFIG_PM | |
e2ebc833 SG |
500 | int il_pci_suspend(struct device *device); |
501 | int il_pci_resume(struct device *device); | |
502 | extern const struct dev_pm_ops il_pm_ops; | |
be663ab6 | 503 | |
e2ebc833 | 504 | #define IL_LEGACY_PM_OPS (&il_pm_ops) |
be663ab6 WYG |
505 | |
506 | #else /* !CONFIG_PM */ | |
507 | ||
e2ebc833 | 508 | #define IL_LEGACY_PM_OPS NULL |
be663ab6 WYG |
509 | |
510 | #endif /* !CONFIG_PM */ | |
511 | ||
512 | /***************************************************** | |
513 | * Error Handling Debugging | |
514 | ******************************************************/ | |
46bc8d4b | 515 | void il4965_dump_nic_error_log(struct il_priv *il); |
d3175167 | 516 | #ifdef CONFIG_IWLEGACY_DEBUG |
46bc8d4b | 517 | void il_print_rx_config_cmd(struct il_priv *il, |
e2ebc833 | 518 | struct il_rxon_context *ctx); |
be663ab6 | 519 | #else |
46bc8d4b | 520 | static inline void il_print_rx_config_cmd(struct il_priv *il, |
e2ebc833 | 521 | struct il_rxon_context *ctx) |
be663ab6 WYG |
522 | { |
523 | } | |
524 | #endif | |
525 | ||
46bc8d4b | 526 | void il_clear_isr_stats(struct il_priv *il); |
be663ab6 WYG |
527 | |
528 | /***************************************************** | |
529 | * GEOS | |
530 | ******************************************************/ | |
46bc8d4b SG |
531 | int il_init_geos(struct il_priv *il); |
532 | void il_free_geos(struct il_priv *il); | |
be663ab6 WYG |
533 | |
534 | /*************** DRIVER STATUS FUNCTIONS *****/ | |
535 | ||
a6766ccd SG |
536 | #define S_HCMD_ACTIVE 0 /* host command in progress */ |
537 | /* 1 is unused (used to be S_HCMD_SYNC_ACTIVE) */ | |
538 | #define S_INT_ENABLED 2 | |
539 | #define S_RF_KILL_HW 3 | |
540 | #define S_CT_KILL 4 | |
541 | #define S_INIT 5 | |
542 | #define S_ALIVE 6 | |
543 | #define S_READY 7 | |
544 | #define S_TEMPERATURE 8 | |
545 | #define S_GEO_CONFIGURED 9 | |
546 | #define S_EXIT_PENDING 10 | |
db7746f7 | 547 | #define S_STATS 12 |
a6766ccd SG |
548 | #define S_SCANNING 13 |
549 | #define S_SCAN_ABORTING 14 | |
550 | #define S_SCAN_HW 15 | |
551 | #define S_POWER_PMI 16 | |
552 | #define S_FW_ERROR 17 | |
553 | #define S_CHANNEL_SWITCH_PENDING 18 | |
be663ab6 | 554 | |
46bc8d4b | 555 | static inline int il_is_ready(struct il_priv *il) |
be663ab6 WYG |
556 | { |
557 | /* The adapter is 'ready' if READY and GEO_CONFIGURED bits are | |
558 | * set but EXIT_PENDING is not */ | |
a6766ccd SG |
559 | return test_bit(S_READY, &il->status) && |
560 | test_bit(S_GEO_CONFIGURED, &il->status) && | |
561 | !test_bit(S_EXIT_PENDING, &il->status); | |
be663ab6 WYG |
562 | } |
563 | ||
46bc8d4b | 564 | static inline int il_is_alive(struct il_priv *il) |
be663ab6 | 565 | { |
a6766ccd | 566 | return test_bit(S_ALIVE, &il->status); |
be663ab6 WYG |
567 | } |
568 | ||
46bc8d4b | 569 | static inline int il_is_init(struct il_priv *il) |
be663ab6 | 570 | { |
a6766ccd | 571 | return test_bit(S_INIT, &il->status); |
be663ab6 WYG |
572 | } |
573 | ||
46bc8d4b | 574 | static inline int il_is_rfkill_hw(struct il_priv *il) |
be663ab6 | 575 | { |
a6766ccd | 576 | return test_bit(S_RF_KILL_HW, &il->status); |
be663ab6 WYG |
577 | } |
578 | ||
46bc8d4b | 579 | static inline int il_is_rfkill(struct il_priv *il) |
be663ab6 | 580 | { |
46bc8d4b | 581 | return il_is_rfkill_hw(il); |
be663ab6 WYG |
582 | } |
583 | ||
46bc8d4b | 584 | static inline int il_is_ctkill(struct il_priv *il) |
be663ab6 | 585 | { |
a6766ccd | 586 | return test_bit(S_CT_KILL, &il->status); |
be663ab6 WYG |
587 | } |
588 | ||
46bc8d4b | 589 | static inline int il_is_ready_rf(struct il_priv *il) |
be663ab6 WYG |
590 | { |
591 | ||
46bc8d4b | 592 | if (il_is_rfkill(il)) |
be663ab6 WYG |
593 | return 0; |
594 | ||
46bc8d4b | 595 | return il_is_ready(il); |
be663ab6 WYG |
596 | } |
597 | ||
46bc8d4b | 598 | extern void il_send_bt_config(struct il_priv *il); |
ebf0d90d | 599 | extern int il_send_stats_request(struct il_priv *il, |
be663ab6 | 600 | u8 flags, bool clear); |
46bc8d4b SG |
601 | void il_apm_stop(struct il_priv *il); |
602 | int il_apm_init(struct il_priv *il); | |
be663ab6 | 603 | |
46bc8d4b | 604 | int il_send_rxon_timing(struct il_priv *il, |
e2ebc833 | 605 | struct il_rxon_context *ctx); |
46bc8d4b | 606 | static inline int il_send_rxon_assoc(struct il_priv *il, |
e2ebc833 | 607 | struct il_rxon_context *ctx) |
be663ab6 | 608 | { |
46bc8d4b | 609 | return il->cfg->ops->hcmd->rxon_assoc(il, ctx); |
be663ab6 | 610 | } |
46bc8d4b | 611 | static inline int il_commit_rxon(struct il_priv *il, |
e2ebc833 | 612 | struct il_rxon_context *ctx) |
be663ab6 | 613 | { |
46bc8d4b | 614 | return il->cfg->ops->hcmd->commit_rxon(il, ctx); |
be663ab6 | 615 | } |
e2ebc833 | 616 | static inline const struct ieee80211_supported_band *il_get_hw_mode( |
46bc8d4b | 617 | struct il_priv *il, enum ieee80211_band band) |
be663ab6 | 618 | { |
46bc8d4b | 619 | return il->hw->wiphy->bands[band]; |
be663ab6 WYG |
620 | } |
621 | ||
be663ab6 | 622 | /* mac80211 handlers */ |
e2ebc833 SG |
623 | int il_mac_config(struct ieee80211_hw *hw, u32 changed); |
624 | void il_mac_reset_tsf(struct ieee80211_hw *hw, | |
37a41b4a | 625 | struct ieee80211_vif *vif); |
e2ebc833 | 626 | void il_mac_bss_info_changed(struct ieee80211_hw *hw, |
be663ab6 WYG |
627 | struct ieee80211_vif *vif, |
628 | struct ieee80211_bss_conf *bss_conf, | |
629 | u32 changes); | |
46bc8d4b | 630 | void il_tx_cmd_protection(struct il_priv *il, |
be663ab6 WYG |
631 | struct ieee80211_tx_info *info, |
632 | __le16 fc, __le32 *tx_flags); | |
633 | ||
e2ebc833 | 634 | irqreturn_t il_isr(int irq, void *data); |
be663ab6 | 635 | |
e2ebc833 | 636 | #endif /* __il_core_h__ */ |