iwl-core.h 24.6 KB
Newer Older
Tomas Winkler's avatar
Tomas Winkler committed
1
2
3
4
5
6
7
/******************************************************************************
 *
 * This file is provided under a dual BSD/GPLv2 license.  When using or
 * redistributing this file, you may do so under either license.
 *
 * GPL LICENSE SUMMARY
 *
Wey-Yi Guy's avatar
Wey-Yi Guy committed
8
 * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
Tomas Winkler's avatar
Tomas Winkler committed
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of version 2 of the GNU General Public License as
 * published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110,
 * USA
 *
 * The full GNU General Public License is included in this distribution
 * in the file called LICENSE.GPL.
 *
 * Contact Information:
28
 *  Intel Linux Wireless <ilw@linux.intel.com>
Tomas Winkler's avatar
Tomas Winkler committed
29
30
31
32
 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
 *
 * BSD LICENSE
 *
Wey-Yi Guy's avatar
Wey-Yi Guy committed
33
 * Copyright(c) 2005 - 2011 Intel Corporation. All rights reserved.
Tomas Winkler's avatar
Tomas Winkler committed
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *  * Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *  * Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *  * Neither the name Intel Corporation nor the names of its
 *    contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *****************************************************************************/

#ifndef __iwl_core_h__
#define __iwl_core_h__

Johannes Berg's avatar
Johannes Berg committed
66
67
#include "iwl-dev.h"

68
69
70
71
72
73
74
/************************
 * forward declarations *
 ************************/
struct iwl_host_cmd;
struct iwl_cmd;


75
#define IWLWIFI_VERSION "in-tree:"
Wey-Yi Guy's avatar
Wey-Yi Guy committed
76
#define DRV_COPYRIGHT	"Copyright(c) 2003-2011 Intel Corporation"
77
#define DRV_AUTHOR     "<ilw@linux.intel.com>"
Tomas Winkler's avatar
Tomas Winkler committed
78

Tomas Winkler's avatar
Tomas Winkler committed
79
80
81
82
83
#define IWL_PCI_DEVICE(dev, subdev, cfg) \
	.vendor = PCI_VENDOR_ID_INTEL,  .device = (dev), \
	.subvendor = PCI_ANY_ID, .subdevice = (subdev), \
	.driver_data = (kernel_ulong_t)&(cfg)

84
85
#define TIME_UNIT		1024

Tomas Winkler's avatar
Tomas Winkler committed
86
87
88
89
#define IWL_SKU_G       0x1
#define IWL_SKU_A       0x2
#define IWL_SKU_N       0x8

90
91
#define IWL_CMD(x) case x: return #x

92
struct iwl_hcmd_ops {
93
94
95
96
	int (*rxon_assoc)(struct iwl_priv *priv, struct iwl_rxon_context *ctx);
	int (*commit_rxon)(struct iwl_priv *priv, struct iwl_rxon_context *ctx);
	void (*set_rxon_chain)(struct iwl_priv *priv,
			       struct iwl_rxon_context *ctx);
97
	int (*set_tx_ant)(struct iwl_priv *priv, u8 valid_tx_ant);
98
	void (*send_bt_config)(struct iwl_priv *priv);
Johannes Berg's avatar
Johannes Berg committed
99
	int (*set_pan_params)(struct iwl_priv *priv);
100
};
101

102
struct iwl_hcmd_utils_ops {
Gregory Greenman's avatar
Gregory Greenman committed
103
	u16 (*get_hcmd_size)(u8 cmd_id, u16 len);
104
	u16 (*build_addsta_hcmd)(const struct iwl_addsta_cmd *cmd, u8 *data);
105
106
107
	void (*gain_computation)(struct iwl_priv *priv,
			u32 *average_noise,
			u16 min_average_noise_antennat_i,
108
109
			u32 min_average_noise,
			u8 default_chain);
110
	void (*chain_noise_reset)(struct iwl_priv *priv);
Johannes Berg's avatar
Johannes Berg committed
111
112
113
	void (*tx_cmd_protection)(struct iwl_priv *priv,
				  struct ieee80211_tx_info *info,
				  __le16 fc, __le32 *tx_flags);
114
115
	int  (*calc_rssi)(struct iwl_priv *priv,
			  struct iwl_rx_phy_res *rx_resp);
116
	int (*request_scan)(struct iwl_priv *priv, struct ieee80211_vif *vif);
117
	void (*post_scan)(struct iwl_priv *priv);
118
119
};

120
121
122
123
124
struct iwl_apm_ops {
	int (*init)(struct iwl_priv *priv);
	void (*config)(struct iwl_priv *priv);
};

125
126
127
128
129
130
131
struct iwl_debugfs_ops {
	ssize_t (*rx_stats_read)(struct file *file, char __user *user_buf,
				 size_t count, loff_t *ppos);
	ssize_t (*tx_stats_read)(struct file *file, char __user *user_buf,
				 size_t count, loff_t *ppos);
	ssize_t (*general_stats_read)(struct file *file, char __user *user_buf,
				      size_t count, loff_t *ppos);
132
133
	ssize_t (*bt_stats_read)(struct file *file, char __user *user_buf,
				 size_t count, loff_t *ppos);
134
135
	ssize_t (*reply_tx_error)(struct file *file, char __user *user_buf,
				 size_t count, loff_t *ppos);
136
137
};

138
139
140
141
struct iwl_temp_ops {
	void (*temperature)(struct iwl_priv *priv);
};

142
143
144
145
146
147
struct iwl_tt_ops {
	bool (*lower_power_detection)(struct iwl_priv *priv);
	u8 (*tt_power_mode)(struct iwl_priv *priv);
	bool (*ct_kill_check)(struct iwl_priv *priv);
};

148
struct iwl_lib_ops {
149
	/* set hw dependent parameters */
Tomas Winkler's avatar
Tomas Winkler committed
150
	int (*set_hw_params)(struct iwl_priv *priv);
151
	/* Handling TX */
152
	void (*txq_update_byte_cnt_tbl)(struct iwl_priv *priv,
153
					struct iwl_tx_queue *txq,
154
					u16 byte_cnt);
155
156
157
	void (*txq_inval_byte_cnt_tbl)(struct iwl_priv *priv,
				       struct iwl_tx_queue *txq);
	void (*txq_set_sched)(struct iwl_priv *priv, u32 mask);
158
159
160
161
162
163
	int (*txq_attach_buf_to_tfd)(struct iwl_priv *priv,
				     struct iwl_tx_queue *txq,
				     dma_addr_t addr,
				     u16 len, u8 reset, u8 pad);
	void (*txq_free_tfd)(struct iwl_priv *priv,
			     struct iwl_tx_queue *txq);
164
165
	int (*txq_init)(struct iwl_priv *priv,
			struct iwl_tx_queue *txq);
166
167
	/* setup Rx handler */
	void (*rx_handler_setup)(struct iwl_priv *priv);
168
169
170
171
	/* setup deferred work */
	void (*setup_deferred_work)(struct iwl_priv *priv);
	/* cancel deferred work */
	void (*cancel_deferred_work)(struct iwl_priv *priv);
172
173
	/* check validity of rtc data address */
	int (*is_valid_rtc_data_addr)(u32 addr);
174
175
	int (*set_channel_switch)(struct iwl_priv *priv,
				  struct ieee80211_channel_switch *ch_switch);
176
177
178
	/* power management */
	struct iwl_apm_ops apm_ops;

179
	/* power */
180
	int (*send_tx_power) (struct iwl_priv *priv);
181
	void (*update_chain_flags)(struct iwl_priv *priv);
182

183
184
	/* eeprom operations (as defined in iwl-eeprom.h) */
	struct iwl_eeprom_ops eeprom_ops;
185
186
187

	/* temperature */
	struct iwl_temp_ops temp_ops;
188

189
	int (*txfifo_flush)(struct iwl_priv *priv, u16 flush_control);
190
	void (*dev_txfifo_flush)(struct iwl_priv *priv, u16 flush_control);
191

192
	struct iwl_debugfs_ops debugfs_ops;
193
194
195

	/* thermal throttling */
	struct iwl_tt_ops tt_ops;
196
197
};

Johannes Berg's avatar
Johannes Berg committed
198
199
200
201
struct iwl_led_ops {
	int (*cmd)(struct iwl_priv *priv, struct iwl_led_cmd *led_cmd);
};

202
203
204
205
206
/* NIC specific ops */
struct iwl_nic_ops {
	void (*additional_nic_config)(struct iwl_priv *priv);
};

207
208
209
210
211
212
213
214
215
struct iwl_legacy_ops {
	void (*post_associate)(struct iwl_priv *priv);
	void (*config_ap)(struct iwl_priv *priv);
	/* station management */
	int (*update_bcast_stations)(struct iwl_priv *priv);
	int (*manage_ibss_station)(struct iwl_priv *priv,
				   struct ieee80211_vif *vif, bool add);
};

216
217
struct iwl_ops {
	const struct iwl_lib_ops *lib;
218
	const struct iwl_hcmd_ops *hcmd;
219
	const struct iwl_hcmd_utils_ops *utils;
220
	const struct iwl_nic_ops *nic;
221
	const struct iwl_legacy_ops *legacy;
222
	const struct ieee80211_ops *ieee80211_ops;
223
224
};

225
struct iwl_mod_params {
226
	int sw_crypto;		/* def: 0 = using hardware encryption */
227
	int num_of_queues;	/* def: HW dependent */
228
	int disable_11n;	/* def: 0 = 11n capabilities enabled */
229
230
	int amsdu_size_8K;	/* def: 1 = enable 8K amsdu size */
	int antenna;  		/* def: 0 = both antennas (use diversity) */
231
	int restart_fw;		/* def: 1 = restart firmware */
232
233
	bool plcp_check;	/* def: true = enable plcp health check */
	bool ack_check;		/* def: false = disable ack health check */
234
235
};

236
/*
237
238
 * @max_ll_items: max number of OTP blocks
 * @shadow_ram_support: shadow support for OTP memory
239
240
241
 * @led_compensation: compensate on the led on/off time per HW according
 *	to the deviation to achieve the desired led frequency.
 *	The detail algorithm is described in iwl-led.c
242
 * @chain_noise_num_beacons: number of beacons used to compute chain noise
243
 * @adv_thermal_throttle: support advance thermal throttle
244
 * @support_ct_kill_exit: support ct kill exit condition
245
 * @support_wimax_coexist: support wimax/wifi co-exist
246
247
 * @plcp_delta_threshold: plcp error rate threshold used to trigger
 *	radio tuning when there is a high receiving plcp error rate
248
 * @chain_noise_scale: default chain noise scale used for gain computation
249
 * @wd_timeout: TX queues watchdog timeout
250
251
 * @temperature_kelvin: temperature report by uCode in kelvin
 * @max_event_log_size: size of event log buffer size for ucode event logging
Wey-Yi Guy's avatar
Wey-Yi Guy committed
252
 * @shadow_reg_enable: HW shadhow register bit
253
 */
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
struct iwl_base_params {
	int eeprom_size;
	int num_of_queues;	/* def: HW dependent */
	int num_of_ampdu_queues;/* def: HW dependent */
	/* for iwl_apm_init() */
	u32 pll_cfg_val;

	const u16 max_ll_items;
	const bool shadow_ram_support;
	u16 led_compensation;
	int chain_noise_num_beacons;
	bool adv_thermal_throttle;
	bool support_ct_kill_exit;
	const bool support_wimax_coexist;
	u8 plcp_delta_threshold;
	s32 chain_noise_scale;
270
	unsigned int wd_timeout;
271
272
	bool temperature_kelvin;
	u32 max_event_log_size;
Wey-Yi Guy's avatar
Wey-Yi Guy committed
273
	const bool shadow_reg_enable;
274
275
};
/*
276
 * @advanced_bt_coexist: support advanced bt coexist
277
 * @bt_init_traffic_load: specify initial bt traffic load
Wey-Yi Guy's avatar
Wey-Yi Guy committed
278
 * @bt_prio_boost: default bt priority boost value
279
 * @agg_time_limit: maximum number of uSec in aggregation
280
281
 * @ampdu_factor: Maximum A-MPDU length factor
 * @ampdu_density: Minimum A-MPDU spacing
282
 * @bt_sco_disable: uCode should not response to BT in SCO/ESCO mode
283
284
285
286
287
288
289
290
*/
struct iwl_bt_params {
	bool advanced_bt_coexist;
	u8 bt_init_traffic_load;
	u8 bt_prio_boost;
	u16 agg_time_limit;
	u8 ampdu_factor;
	u8 ampdu_density;
291
	bool bt_sco_disable;
292
	bool bt_session_2;
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
};
/*
 * @use_rts_for_aggregation: use rts/cts protection for HT traffic
*/
struct iwl_ht_params {
	const bool ht_greenfield_support; /* if used set to true */
	bool use_rts_for_aggregation;
};

/**
 * struct iwl_cfg
 * @fw_name_pre: Firmware filename prefix. The api version and extension
 *	(.ucode) will be added to filename before loading from disk. The
 *	filename is constructed as fw_name_pre<api>.ucode.
 * @ucode_api_max: Highest version of uCode API supported by driver.
 * @ucode_api_min: Lowest version of uCode API supported by driver.
 * @pa_type: used by 6000 series only to identify the type of Power Amplifier
 * @need_dc_calib: need to perform init dc calibration
311
 * @need_temp_offset_calib: need to perform temperature offset calibration
312
 * @scan_antennas: available antenna for scan operation
313
 * @led_mode: 0=blinking, 1=On(RF On)/Off(RF Off)
314
 * @adv_pm: advance power management
Wey-Yi Guy's avatar
Wey-Yi Guy committed
315
 * @rx_with_siso_diversity: 1x1 device with rx antenna diversity
316
 * @internal_wimax_coex: internal wifi/wimax combo device
317
 * @iq_invert: I/Q inversion
318
 * @disable_otp_refresh: disable OTP refresh current limit
319
320
321
322
323
324
325
326
327
328
 *
 * We enable the driver to be backward compatible wrt API version. The
 * driver specifies which APIs it supports (with @ucode_api_max being the
 * highest and @ucode_api_min the lowest). Firmware will only be loaded if
 * it has a supported API version. The firmware's API version will be
 * stored in @iwl_priv, enabling the driver to make runtime changes based
 * on firmware version used.
 *
 * For example,
 * if (IWL_UCODE_API(priv->ucode_ver) >= 2) {
329
 *	Driver interacts with Firmware API version >= 2.
330
 * } else {
331
 *	Driver interacts with Firmware API version 1.
332
333
334
335
336
337
338
 * }
 *
 * The ideal usage of this infrastructure is to treat a new ucode API
 * release as a new hardware revision. That is, through utilizing the
 * iwl_hcmd_utils_ops etc. we accommodate different command structures
 * and flows between hardware versions (4965/5000) as well as their API
 * versions.
339
 *
340
 */
Tomas Winkler's avatar
Tomas Winkler committed
341
struct iwl_cfg {
342
	/* params specific to an individual device within a device family */
Tomas Winkler's avatar
Tomas Winkler committed
343
	const char *name;
344
345
346
	const char *fw_name_pre;
	const unsigned int ucode_api_max;
	const unsigned int ucode_api_min;
347
348
	u8   valid_tx_ant;
	u8   valid_rx_ant;
Tomas Winkler's avatar
Tomas Winkler committed
349
	unsigned int sku;
350
351
	u16  eeprom_ver;
	u16  eeprom_calib_ver;
352
	const struct iwl_ops *ops;
353
	/* module based parameters which can be set from modprobe cmd */
354
	const struct iwl_mod_params *mod_params;
355
356
357
358
359
360
361
	/* params not likely to change within a device family */
	struct iwl_base_params *base_params;
	/* params likely to change within a device family */
	struct iwl_ht_params *ht_params;
	struct iwl_bt_params *bt_params;
	enum iwl_pa_type pa_type;	  /* if used set to IWL_PA_SYSTEM */
	const bool need_dc_calib;	  /* if used set to true */
362
	const bool need_temp_offset_calib; /* if used set to true */
363
	u8 scan_rx_antennas[IEEE80211_NUM_BANDS];
364
	enum iwl_led_mode led_mode;
365
	const bool adv_pm;
Wey-Yi Guy's avatar
Wey-Yi Guy committed
366
	const bool rx_with_siso_diversity;
367
	const bool internal_wimax_coex;
368
	const bool iq_invert;
369
	const bool disable_otp_refresh;
Tomas Winkler's avatar
Tomas Winkler committed
370
371
};

372
373
374
375
/***************************
 *   L i b                 *
 ***************************/

376
struct ieee80211_hw *iwl_alloc_all(struct iwl_cfg *cfg);
377
378
int iwl_mac_conf_tx(struct ieee80211_hw *hw, u16 queue,
		    const struct ieee80211_tx_queue_params *params);
379
int iwl_mac_tx_last_beacon(struct ieee80211_hw *hw);
380
381
382
383
384
385
void iwl_set_rxon_hwcrypto(struct iwl_priv *priv, struct iwl_rxon_context *ctx,
			   int hw_decrypt);
int iwl_check_rxon_cmd(struct iwl_priv *priv, struct iwl_rxon_context *ctx);
int iwl_full_rxon_required(struct iwl_priv *priv, struct iwl_rxon_context *ctx);
int iwl_set_rxon_channel(struct iwl_priv *priv, struct ieee80211_channel *ch,
			 struct iwl_rxon_context *ctx);
386
void iwl_set_flags_for_band(struct iwl_priv *priv,
387
			    struct iwl_rxon_context *ctx,
388
389
			    enum ieee80211_band band,
			    struct ieee80211_vif *vif);
Abhijeet Kolekar's avatar
Abhijeet Kolekar committed
390
391
u8 iwl_get_single_channel_number(struct iwl_priv *priv,
				  enum ieee80211_band band);
392
void iwl_set_rxon_ht(struct iwl_priv *priv, struct iwl_ht_config *ht_conf);
393
394
395
bool iwl_is_ht40_tx_allowed(struct iwl_priv *priv,
			    struct iwl_rxon_context *ctx,
			    struct ieee80211_sta_ht_cap *ht_cap);
396
void iwl_connection_init_rx_config(struct iwl_priv *priv,
397
				   struct iwl_rxon_context *ctx);
398
void iwl_set_rate(struct iwl_priv *priv);
399
void iwl_irq_handle_error(struct iwl_priv *priv);
400
int iwl_mac_add_interface(struct ieee80211_hw *hw,
401
			  struct ieee80211_vif *vif);
402
void iwl_mac_remove_interface(struct ieee80211_hw *hw,
403
			      struct ieee80211_vif *vif);
404
405
406
int iwl_mac_change_interface(struct ieee80211_hw *hw,
			     struct ieee80211_vif *vif,
			     enum nl80211_iftype newtype, bool newp2p);
407
408
int iwl_alloc_txq_mem(struct iwl_priv *priv);
void iwl_free_txq_mem(struct iwl_priv *priv);
409

410
411
412
413
414
415
416
417
#ifdef CONFIG_IWLWIFI_DEBUGFS
int iwl_alloc_traffic_mem(struct iwl_priv *priv);
void iwl_free_traffic_mem(struct iwl_priv *priv);
void iwl_reset_traffic_log(struct iwl_priv *priv);
void iwl_dbg_log_tx_data_frame(struct iwl_priv *priv,
				u16 length, struct ieee80211_hdr *header);
void iwl_dbg_log_rx_data_frame(struct iwl_priv *priv,
				u16 length, struct ieee80211_hdr *header);
418
419
const char *get_mgmt_string(int cmd);
const char *get_ctrl_string(int cmd);
420
void iwl_clear_traffic_stats(struct iwl_priv *priv);
421
422
void iwl_update_stats(struct iwl_priv *priv, bool is_tx, __le16 fc,
		      u16 len);
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
#else
static inline int iwl_alloc_traffic_mem(struct iwl_priv *priv)
{
	return 0;
}
static inline void iwl_free_traffic_mem(struct iwl_priv *priv)
{
}
static inline void iwl_reset_traffic_log(struct iwl_priv *priv)
{
}
static inline void iwl_dbg_log_tx_data_frame(struct iwl_priv *priv,
		      u16 length, struct ieee80211_hdr *header)
{
}
static inline void iwl_dbg_log_rx_data_frame(struct iwl_priv *priv,
		      u16 length, struct ieee80211_hdr *header)
{
}
442
443
444
445
static inline void iwl_update_stats(struct iwl_priv *priv, bool is_tx,
				    __le16 fc, u16 len)
{
}
446
#endif
447

448
449
450
/*****************************************************
* RX
******************************************************/
451
void iwl_cmd_queue_free(struct iwl_priv *priv);
452
void iwl_cmd_queue_unmap(struct iwl_priv *priv);
453
int iwl_rx_queue_alloc(struct iwl_priv *priv);
454
void iwl_rx_queue_update_write_ptr(struct iwl_priv *priv,
455
456
				  struct iwl_rx_queue *q);
int iwl_rx_queue_space(const struct iwl_rx_queue *q);
457
void iwl_tx_cmd_complete(struct iwl_priv *priv, struct iwl_rx_mem_buffer *rxb);
458

459
void iwl_chswitch_done(struct iwl_priv *priv, bool is_success);
460

461
462
/* TX helpers */

463
464
465
/*****************************************************
* TX
******************************************************/
466
void iwl_txq_update_write_ptr(struct iwl_priv *priv, struct iwl_tx_queue *txq);
467
468
int iwl_tx_queue_init(struct iwl_priv *priv, struct iwl_tx_queue *txq,
		      int slots_num, u32 txq_id);
469
470
void iwl_tx_queue_reset(struct iwl_priv *priv, struct iwl_tx_queue *txq,
			int slots_num, u32 txq_id);
471
void iwl_tx_queue_free(struct iwl_priv *priv, int txq_id);
472
void iwl_tx_queue_unmap(struct iwl_priv *priv, int txq_id);
473
void iwl_setup_watchdog(struct iwl_priv *priv);
474
475
476
477
478
/*****************************************************
 * TX power
 ****************************************************/
int iwl_set_tx_power(struct iwl_priv *priv, s8 tx_power, bool force);

479
480
481
482
/*******************************************************************************
 * Rate
 ******************************************************************************/

483
484
u8 iwl_rate_get_lowest_plcp(struct iwl_priv *priv,
			    struct iwl_rxon_context *ctx);
485

486
487
488
/*******************************************************************************
 * Scanning
 ******************************************************************************/
489
void iwl_init_scan_params(struct iwl_priv *priv);
490
491
int iwl_scan_cancel(struct iwl_priv *priv);
int iwl_scan_cancel_timeout(struct iwl_priv *priv, unsigned long ms);
492
void iwl_force_scan_end(struct iwl_priv *priv);
493
494
495
int iwl_mac_hw_scan(struct ieee80211_hw *hw,
		    struct ieee80211_vif *vif,
		    struct cfg80211_scan_request *req);
Johannes Berg's avatar
Johannes Berg committed
496
void iwl_internal_short_hw_scan(struct iwl_priv *priv);
497
int iwl_force_reset(struct iwl_priv *priv, int mode, bool external);
Johannes Berg's avatar
Johannes Berg committed
498
u16 iwl_fill_probe_req(struct iwl_priv *priv, struct ieee80211_mgmt *frame,
499
		       const u8 *ta, const u8 *ie, int ie_len, int left);
500
void iwl_setup_rx_scan_handlers(struct iwl_priv *priv);
Samuel Ortiz's avatar
Samuel Ortiz committed
501
502
503
504
u16 iwl_get_active_dwell_time(struct iwl_priv *priv,
			      enum ieee80211_band band,
			      u8 n_probes);
u16 iwl_get_passive_dwell_time(struct iwl_priv *priv,
505
506
			       enum ieee80211_band band,
			       struct ieee80211_vif *vif);
507
void iwl_setup_scan_deferred_work(struct iwl_priv *priv);
508
void iwl_cancel_scan_deferred_work(struct iwl_priv *priv);
Johannes Berg's avatar
Johannes Berg committed
509
510
511
512
int __must_check iwl_scan_initiate(struct iwl_priv *priv,
				   struct ieee80211_vif *vif,
				   enum iwl_scan_type scan_type,
				   enum ieee80211_band band);
513

Samuel Ortiz's avatar
Samuel Ortiz committed
514
515
516
517
518
519
/* For faster active scanning, scan will move to the next channel if fewer than
 * PLCP_QUIET_THRESH packets are heard on this channel within
 * ACTIVE_QUIET_TIME after sending probe request.  This shortens the dwell
 * time if it's a quiet channel (nothing responded to our probe, and there's
 * no other traffic).
 * Disable "quiet" feature by setting PLCP_QUIET_THRESH to 0. */
520
521
#define IWL_ACTIVE_QUIET_TIME       cpu_to_le16(10)  /* msec */
#define IWL_PLCP_QUIET_THRESH       cpu_to_le16(1)  /* packets */
Samuel Ortiz's avatar
Samuel Ortiz committed
522

523
#define IWL_SCAN_CHECK_WATCHDOG		(HZ * 7)
Samuel Ortiz's avatar
Samuel Ortiz committed
524

525
526
527
528
529
/*****************************************************
 *   S e n d i n g     H o s t     C o m m a n d s   *
 *****************************************************/

const char *get_cmd_string(u8 cmd);
530
531
int __must_check iwl_send_cmd_sync(struct iwl_priv *priv,
				   struct iwl_host_cmd *cmd);
532
int iwl_send_cmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd);
533
534
int __must_check iwl_send_cmd_pdu(struct iwl_priv *priv, u8 id,
				  u16 len, const void *data);
535
536
int iwl_send_cmd_pdu_async(struct iwl_priv *priv, u8 id, u16 len,
			   const void *data,
537
538
			   void (*callback)(struct iwl_priv *priv,
					    struct iwl_device_cmd *cmd,
Zhu Yi's avatar
Zhu Yi committed
539
					    struct iwl_rx_packet *pkt));
540
541

int iwl_enqueue_hcmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd);
542

543

544
545
546
/*****************************************************
 * PCI						     *
 *****************************************************/
Mohamed Abbas's avatar
Mohamed Abbas committed
547

548
549
550
551
552
553
554
555
static inline u16 iwl_pcie_link_ctl(struct iwl_priv *priv)
{
	int pos;
	u16 pci_lnk_ctl;
	pos = pci_find_capability(priv->pci_dev, PCI_CAP_ID_EXP);
	pci_read_config_word(priv->pci_dev, pos + PCI_EXP_LNKCTL, &pci_lnk_ctl);
	return pci_lnk_ctl;
}
556

557
void iwl_bg_watchdog(unsigned long data);
558
559
560
u32 iwl_usecs_to_beacons(struct iwl_priv *priv, u32 usec, u32 beacon_interval);
__le32 iwl_add_beacon_time(struct iwl_priv *priv, u32 base,
			   u32 addon, u32 beacon_interval);
561

562
#ifdef CONFIG_PM
563
564
565
566
567
568
569
570
571
572
573
int iwl_pci_suspend(struct device *device);
int iwl_pci_resume(struct device *device);
extern const struct dev_pm_ops iwl_pm_ops;

#define IWL_PM_OPS	(&iwl_pm_ops)

#else /* !CONFIG_PM */

#define IWL_PM_OPS	NULL

#endif /* !CONFIG_PM */
574

575
576
577
/*****************************************************
*  Error Handling Debugging
******************************************************/
578
void iwl_dump_nic_error_log(struct iwl_priv *priv);
Wey-Yi Guy's avatar
Wey-Yi Guy committed
579
580
int iwl_dump_nic_event_log(struct iwl_priv *priv,
			   bool full_log, char **buf, bool display);
581
582
void iwl_dump_csr(struct iwl_priv *priv);
int iwl_dump_fh(struct iwl_priv *priv, char **buf, bool display);
583
#ifdef CONFIG_IWLWIFI_DEBUG
584
585
void iwl_print_rx_config_cmd(struct iwl_priv *priv,
			     struct iwl_rxon_context *ctx);
586
#else
587
588
static inline void iwl_print_rx_config_cmd(struct iwl_priv *priv,
					   struct iwl_rxon_context *ctx)
589
590
{
}
591
592
#endif

593
void iwl_clear_isr_stats(struct iwl_priv *priv);
594

595
596
597
598
599
/*****************************************************
*  GEOS
******************************************************/
int iwlcore_init_geos(struct iwl_priv *priv);
void iwlcore_free_geos(struct iwl_priv *priv);
600

601
602
603
/*************** DRIVER STATUS FUNCTIONS   *****/

#define STATUS_HCMD_ACTIVE	0	/* host command in progress */
604
/* 1 is unused (used to be STATUS_HCMD_SYNC_ACTIVE) */
605
606
#define STATUS_INT_ENABLED	2
#define STATUS_RF_KILL_HW	3
607
#define STATUS_CT_KILL		4
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
#define STATUS_INIT		5
#define STATUS_ALIVE		6
#define STATUS_READY		7
#define STATUS_TEMPERATURE	8
#define STATUS_GEO_CONFIGURED	9
#define STATUS_EXIT_PENDING	10
#define STATUS_STATISTICS	12
#define STATUS_SCANNING		13
#define STATUS_SCAN_ABORTING	14
#define STATUS_SCAN_HW		15
#define STATUS_POWER_PMI	16
#define STATUS_FW_ERROR		17


static inline int iwl_is_ready(struct iwl_priv *priv)
{
	/* The adapter is 'ready' if READY and GEO_CONFIGURED bits are
	 * set but EXIT_PENDING is not */
	return test_bit(STATUS_READY, &priv->status) &&
	       test_bit(STATUS_GEO_CONFIGURED, &priv->status) &&
	       !test_bit(STATUS_EXIT_PENDING, &priv->status);
}

static inline int iwl_is_alive(struct iwl_priv *priv)
{
	return test_bit(STATUS_ALIVE, &priv->status);
}

static inline int iwl_is_init(struct iwl_priv *priv)
{
	return test_bit(STATUS_INIT, &priv->status);
}

641
642
643
644
645
static inline int iwl_is_rfkill_hw(struct iwl_priv *priv)
{
	return test_bit(STATUS_RF_KILL_HW, &priv->status);
}

646
647
static inline int iwl_is_rfkill(struct iwl_priv *priv)
{
648
	return iwl_is_rfkill_hw(priv);
649
650
}

651
652
653
654
655
static inline int iwl_is_ctkill(struct iwl_priv *priv)
{
	return test_bit(STATUS_CT_KILL, &priv->status);
}

656
657
658
659
660
661
662
663
664
static inline int iwl_is_ready_rf(struct iwl_priv *priv)
{

	if (iwl_is_rfkill(priv))
		return 0;

	return iwl_is_ready(priv);
}

665
extern void iwl_send_bt_config(struct iwl_priv *priv);
666
667
extern int iwl_send_statistics_request(struct iwl_priv *priv,
				       u8 flags, bool clear);
668
void iwl_apm_stop(struct iwl_priv *priv);
669
int iwl_apm_init(struct iwl_priv *priv);
670

671
int iwl_send_rxon_timing(struct iwl_priv *priv, struct iwl_rxon_context *ctx);
672
673
static inline int iwl_send_rxon_assoc(struct iwl_priv *priv,
				      struct iwl_rxon_context *ctx)
674
{
675
	return priv->cfg->ops->hcmd->rxon_assoc(priv, ctx);
676
}
677
678
static inline int iwlcore_commit_rxon(struct iwl_priv *priv,
				      struct iwl_rxon_context *ctx)
679
{
680
	return priv->cfg->ops->hcmd->commit_rxon(priv, ctx);
681
}
682
683
684
685
686
static inline const struct ieee80211_supported_band *iwl_get_hw_mode(
			struct iwl_priv *priv, enum ieee80211_band band)
{
	return priv->hw->wiphy->bands[band];
}
687

688
689
690
691
692
693
static inline bool iwl_advanced_bt_coexist(struct iwl_priv *priv)
{
	return priv->cfg->bt_params &&
	       priv->cfg->bt_params->advanced_bt_coexist;
}

694
extern bool bt_coex_active;
695
extern bool bt_siso_mode;
696

697
698
699

void iwlagn_fw_error(struct iwl_priv *priv, bool ondemand);

Tomas Winkler's avatar
Tomas Winkler committed
700
#endif /* __iwl_core_h__ */