iwl-dev.h revision 6ab33d51713d6d60c7677c0d020910a8cb37e513
1/******************************************************************************
2 *
3 * Copyright(c) 2003 - 2008 Intel Corporation. All rights reserved.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE.
20 *
21 * Contact Information:
22 * James P. Ketrenos <ipw2100-admin@linux.intel.com>
23 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
24 *
25 *****************************************************************************/
26/*
27 * Please use this file (iwl-dev.h) for driver implementation definitions.
28 * Please use iwl-commands.h for uCode API definitions.
29 * Please use iwl-4965-hw.h for hardware-related definitions.
30 */
31
32#ifndef __iwl_dev_h__
33#define __iwl_dev_h__
34
35#include <linux/pci.h> /* for struct pci_device_id */
36#include <linux/kernel.h>
37#include <net/ieee80211_radiotap.h>
38
39#define DRV_NAME        "iwlagn"
40#include "iwl-rfkill.h"
41#include "iwl-eeprom.h"
42#include "iwl-4965-hw.h"
43#include "iwl-csr.h"
44#include "iwl-prph.h"
45#include "iwl-debug.h"
46#include "iwl-led.h"
47#include "iwl-power.h"
48#include "iwl-agn-rs.h"
49
50/* configuration for the iwl4965 */
51extern struct iwl_cfg iwl4965_agn_cfg;
52extern struct iwl_cfg iwl5300_agn_cfg;
53extern struct iwl_cfg iwl5100_agn_cfg;
54extern struct iwl_cfg iwl5350_agn_cfg;
55extern struct iwl_cfg iwl5100_bg_cfg;
56extern struct iwl_cfg iwl5100_abg_cfg;
57
58/* CT-KILL constants */
59#define CT_KILL_THRESHOLD	110 /* in Celsius */
60
61/* Default noise level to report when noise measurement is not available.
62 *   This may be because we're:
63 *   1)  Not associated (4965, no beacon statistics being sent to driver)
64 *   2)  Scanning (noise measurement does not apply to associated channel)
65 *   3)  Receiving CCK (3945 delivers noise info only for OFDM frames)
66 * Use default noise value of -127 ... this is below the range of measurable
67 *   Rx dBm for either 3945 or 4965, so it can indicate "unmeasurable" to user.
68 *   Also, -127 works better than 0 when averaging frames with/without
69 *   noise info (e.g. averaging might be done in app); measured dBm values are
70 *   always negative ... using a negative value as the default keeps all
71 *   averages within an s8's (used in some apps) range of negative values. */
72#define IWL_NOISE_MEAS_NOT_AVAILABLE (-127)
73
74/*
75 * RTS threshold here is total size [2347] minus 4 FCS bytes
76 * Per spec:
77 *   a value of 0 means RTS on all data/management packets
78 *   a value > max MSDU size means no RTS
79 * else RTS for data/management frames where MPDU is larger
80 *   than RTS value.
81 */
82#define DEFAULT_RTS_THRESHOLD     2347U
83#define MIN_RTS_THRESHOLD         0U
84#define MAX_RTS_THRESHOLD         2347U
85#define MAX_MSDU_SIZE		  2304U
86#define MAX_MPDU_SIZE		  2346U
87#define DEFAULT_BEACON_INTERVAL   100U
88#define	DEFAULT_SHORT_RETRY_LIMIT 7U
89#define	DEFAULT_LONG_RETRY_LIMIT  4U
90
91struct iwl_rx_mem_buffer {
92	dma_addr_t real_dma_addr;
93	dma_addr_t aligned_dma_addr;
94	struct sk_buff *skb;
95	struct list_head list;
96};
97
98/*
99 * Generic queue structure
100 *
101 * Contains common data for Rx and Tx queues
102 */
103struct iwl_queue {
104	int n_bd;              /* number of BDs in this queue */
105	int write_ptr;       /* 1-st empty entry (index) host_w*/
106	int read_ptr;         /* last used entry (index) host_r*/
107	dma_addr_t dma_addr;   /* physical addr for BD's */
108	int n_window;	       /* safe queue window */
109	u32 id;
110	int low_mark;	       /* low watermark, resume queue if free
111				* space more than this */
112	int high_mark;         /* high watermark, stop queue if free
113				* space less than this */
114} __attribute__ ((packed));
115
116/* One for each TFD */
117struct iwl_tx_info {
118	struct sk_buff *skb[IWL_NUM_OF_TBS - 1];
119};
120
121/**
122 * struct iwl_tx_queue - Tx Queue for DMA
123 * @q: generic Rx/Tx queue descriptor
124 * @bd: base of circular buffer of TFDs
125 * @cmd: array of command/Tx buffers
126 * @dma_addr_cmd: physical address of cmd/tx buffer array
127 * @txb: array of per-TFD driver data
128 * @need_update: indicates need to update read/write index
129 * @sched_retry: indicates queue is high-throughput aggregation (HT AGG) enabled
130 *
131 * A Tx queue consists of circular buffer of BDs (a.k.a. TFDs, transmit frame
132 * descriptors) and required locking structures.
133 */
134struct iwl_tx_queue {
135	struct iwl_queue q;
136	struct iwl_tfd *tfds;
137	struct iwl_cmd *cmd[TFD_TX_CMD_SLOTS];
138	struct iwl_tx_info *txb;
139	u8 need_update;
140	u8 sched_retry;
141	u8 active;
142	u8 swq_id;
143};
144
145#define IWL_NUM_SCAN_RATES         (2)
146
147struct iwl4965_channel_tgd_info {
148	u8 type;
149	s8 max_power;
150};
151
152struct iwl4965_channel_tgh_info {
153	s64 last_radar_time;
154};
155
156/*
157 * One for each channel, holds all channel setup data
158 * Some of the fields (e.g. eeprom and flags/max_power_avg) are redundant
159 *     with one another!
160 */
161struct iwl_channel_info {
162	struct iwl4965_channel_tgd_info tgd;
163	struct iwl4965_channel_tgh_info tgh;
164	struct iwl_eeprom_channel eeprom;	/* EEPROM regulatory limit */
165	struct iwl_eeprom_channel fat_eeprom;	/* EEPROM regulatory limit for
166						 * FAT channel */
167
168	u8 channel;	  /* channel number */
169	u8 flags;	  /* flags copied from EEPROM */
170	s8 max_power_avg; /* (dBm) regul. eeprom, normal Tx, any rate */
171	s8 curr_txpow;	  /* (dBm) regulatory/spectrum/user (not h/w) limit */
172	s8 min_power;	  /* always 0 */
173	s8 scan_power;	  /* (dBm) regul. eeprom, direct scans, any rate */
174
175	u8 group_index;	  /* 0-4, maps channel to group1/2/3/4/5 */
176	u8 band_index;	  /* 0-4, maps channel to band1/2/3/4/5 */
177	enum ieee80211_band band;
178
179	/* FAT channel info */
180	s8 fat_max_power_avg;	/* (dBm) regul. eeprom, normal Tx, any rate */
181	s8 fat_curr_txpow;	/* (dBm) regulatory/spectrum/user (not h/w) */
182	s8 fat_min_power;	/* always 0 */
183	s8 fat_scan_power;	/* (dBm) eeprom, direct scans, any rate */
184	u8 fat_flags;		/* flags copied from EEPROM */
185	u8 fat_extension_channel; /* HT_IE_EXT_CHANNEL_* */
186};
187
188struct iwl4965_clip_group {
189	/* maximum power level to prevent clipping for each rate, derived by
190	 *   us from this band's saturation power in EEPROM */
191	const s8 clip_powers[IWL_MAX_RATES];
192};
193
194
195#define IWL_TX_FIFO_AC0	0
196#define IWL_TX_FIFO_AC1	1
197#define IWL_TX_FIFO_AC2	2
198#define IWL_TX_FIFO_AC3	3
199#define IWL_TX_FIFO_HCCA_1	5
200#define IWL_TX_FIFO_HCCA_2	6
201#define IWL_TX_FIFO_NONE	7
202
203/* Minimum number of queues. MAX_NUM is defined in hw specific files */
204#define IWL_MIN_NUM_QUEUES	4
205
206/* Power management (not Tx power) structures */
207
208enum iwl_pwr_src {
209	IWL_PWR_SRC_VMAIN,
210	IWL_PWR_SRC_VAUX,
211};
212
213#define IEEE80211_DATA_LEN              2304
214#define IEEE80211_4ADDR_LEN             30
215#define IEEE80211_HLEN                  (IEEE80211_4ADDR_LEN)
216#define IEEE80211_FRAME_LEN             (IEEE80211_DATA_LEN + IEEE80211_HLEN)
217
218struct iwl_frame {
219	union {
220		struct ieee80211_hdr frame;
221		struct iwl_tx_beacon_cmd beacon;
222		u8 raw[IEEE80211_FRAME_LEN];
223		u8 cmd[360];
224	} u;
225	struct list_head list;
226};
227
228#define SEQ_TO_SN(seq) (((seq) & IEEE80211_SCTL_SEQ) >> 4)
229#define SN_TO_SEQ(ssn) (((ssn) << 4) & IEEE80211_SCTL_SEQ)
230#define MAX_SN ((IEEE80211_SCTL_SEQ) >> 4)
231
232enum {
233	/* CMD_SIZE_NORMAL = 0, */
234	CMD_SIZE_HUGE = (1 << 0),
235	/* CMD_SYNC = 0, */
236	CMD_ASYNC = (1 << 1),
237	/* CMD_NO_SKB = 0, */
238	CMD_WANT_SKB = (1 << 2),
239};
240
241struct iwl_cmd;
242struct iwl_priv;
243
244struct iwl_cmd_meta {
245	struct iwl_cmd_meta *source;
246	union {
247		struct sk_buff *skb;
248		int (*callback)(struct iwl_priv *priv,
249				struct iwl_cmd *cmd, struct sk_buff *skb);
250	} __attribute__ ((packed)) u;
251
252	/* The CMD_SIZE_HUGE flag bit indicates that the command
253	 * structure is stored at the end of the shared queue memory. */
254	u32 flags;
255	DECLARE_PCI_UNMAP_ADDR(mapping)
256	DECLARE_PCI_UNMAP_LEN(len)
257} __attribute__ ((packed));
258
259#define IWL_CMD_MAX_PAYLOAD 320
260
261/**
262 * struct iwl_cmd
263 *
264 * For allocation of the command and tx queues, this establishes the overall
265 * size of the largest command we send to uCode, except for a scan command
266 * (which is relatively huge; space is allocated separately).
267 */
268struct iwl_cmd {
269	struct iwl_cmd_meta meta;	/* driver data */
270	struct iwl_cmd_header hdr;	/* uCode API */
271	union {
272		u32 flags;
273		u8 val8;
274		u16 val16;
275		u32 val32;
276		struct iwl_tx_cmd tx;
277		u8 payload[IWL_CMD_MAX_PAYLOAD];
278	} __attribute__ ((packed)) cmd;
279} __attribute__ ((packed));
280
281
282struct iwl_host_cmd {
283	u8 id;
284	u16 len;
285	struct iwl_cmd_meta meta;
286	const void *data;
287};
288
289#define TFD_MAX_PAYLOAD_SIZE (sizeof(struct iwl_cmd) - \
290			      sizeof(struct iwl_cmd_meta))
291
292/*
293 * RX related structures and functions
294 */
295#define RX_FREE_BUFFERS 64
296#define RX_LOW_WATERMARK 8
297
298#define SUP_RATE_11A_MAX_NUM_CHANNELS  8
299#define SUP_RATE_11B_MAX_NUM_CHANNELS  4
300#define SUP_RATE_11G_MAX_NUM_CHANNELS  12
301
302/**
303 * struct iwl_rx_queue - Rx queue
304 * @processed: Internal index to last handled Rx packet
305 * @read: Shared index to newest available Rx buffer
306 * @write: Shared index to oldest written Rx packet
307 * @free_count: Number of pre-allocated buffers in rx_free
308 * @rx_free: list of free SKBs for use
309 * @rx_used: List of Rx buffers with no SKB
310 * @need_update: flag to indicate we need to update read/write index
311 *
312 * NOTE:  rx_free and rx_used are used as a FIFO for iwl_rx_mem_buffers
313 */
314struct iwl_rx_queue {
315	__le32 *bd;
316	dma_addr_t dma_addr;
317	struct iwl_rx_mem_buffer pool[RX_QUEUE_SIZE + RX_FREE_BUFFERS];
318	struct iwl_rx_mem_buffer *queue[RX_QUEUE_SIZE];
319	u32 processed;
320	u32 read;
321	u32 write;
322	u32 free_count;
323	struct list_head rx_free;
324	struct list_head rx_used;
325	int need_update;
326	spinlock_t lock;
327};
328
329#define IWL_SUPPORTED_RATES_IE_LEN         8
330
331#define SCAN_INTERVAL 100
332
333#define MAX_A_CHANNELS  252
334#define MIN_A_CHANNELS  7
335
336#define MAX_B_CHANNELS  14
337#define MIN_B_CHANNELS  1
338
339#define MAX_TID_COUNT        9
340
341#define IWL_INVALID_RATE     0xFF
342#define IWL_INVALID_VALUE    -1
343
344/**
345 * struct iwl_ht_agg -- aggregation status while waiting for block-ack
346 * @txq_id: Tx queue used for Tx attempt
347 * @frame_count: # frames attempted by Tx command
348 * @wait_for_ba: Expect block-ack before next Tx reply
349 * @start_idx: Index of 1st Transmit Frame Descriptor (TFD) in Tx window
350 * @bitmap0: Low order bitmap, one bit for each frame pending ACK in Tx window
351 * @bitmap1: High order, one bit for each frame pending ACK in Tx window
352 * @rate_n_flags: Rate at which Tx was attempted
353 *
354 * If REPLY_TX indicates that aggregation was attempted, driver must wait
355 * for block ack (REPLY_COMPRESSED_BA).  This struct stores tx reply info
356 * until block ack arrives.
357 */
358struct iwl_ht_agg {
359	u16 txq_id;
360	u16 frame_count;
361	u16 wait_for_ba;
362	u16 start_idx;
363	u64 bitmap;
364	u32 rate_n_flags;
365#define IWL_AGG_OFF 0
366#define IWL_AGG_ON 1
367#define IWL_EMPTYING_HW_QUEUE_ADDBA 2
368#define IWL_EMPTYING_HW_QUEUE_DELBA 3
369	u8 state;
370};
371
372
373struct iwl_tid_data {
374	u16 seq_number;
375	u16 tfds_in_queue;
376	struct iwl_ht_agg agg;
377};
378
379struct iwl_hw_key {
380	enum ieee80211_key_alg alg;
381	int keylen;
382	u8 keyidx;
383	u8 key[32];
384};
385
386union iwl4965_ht_rate_supp {
387	u16 rates;
388	struct {
389		u8 siso_rate;
390		u8 mimo_rate;
391	};
392};
393
394#define CFG_HT_RX_AMPDU_FACTOR_DEF  (0x3)
395#define CFG_HT_MPDU_DENSITY_2USEC   (0x5)
396#define CFG_HT_MPDU_DENSITY_DEF CFG_HT_MPDU_DENSITY_2USEC
397
398struct iwl_ht_info {
399	/* self configuration data */
400	u8 is_ht;
401	u8 supported_chan_width;
402	u8 sm_ps;
403	u8 is_green_field;
404	u8 sgf;			/* HT_SHORT_GI_* short guard interval */
405	u8 max_amsdu_size;
406	u8 ampdu_factor;
407	u8 mpdu_density;
408	struct ieee80211_mcs_info mcs;
409	/* BSS related data */
410	u8 extension_chan_offset;
411	u8 tx_chan_width;
412	u8 ht_protection;
413	u8 non_GF_STA_present;
414};
415
416union iwl_qos_capabity {
417	struct {
418		u8 edca_count:4;	/* bit 0-3 */
419		u8 q_ack:1;		/* bit 4 */
420		u8 queue_request:1;	/* bit 5 */
421		u8 txop_request:1;	/* bit 6 */
422		u8 reserved:1;		/* bit 7 */
423	} q_AP;
424	struct {
425		u8 acvo_APSD:1;		/* bit 0 */
426		u8 acvi_APSD:1;		/* bit 1 */
427		u8 ac_bk_APSD:1;	/* bit 2 */
428		u8 ac_be_APSD:1;	/* bit 3 */
429		u8 q_ack:1;		/* bit 4 */
430		u8 max_len:2;		/* bit 5-6 */
431		u8 more_data_ack:1;	/* bit 7 */
432	} q_STA;
433	u8 val;
434};
435
436/* QoS structures */
437struct iwl_qos_info {
438	int qos_enable;
439	int qos_active;
440	union iwl_qos_capabity qos_cap;
441	struct iwl_qosparam_cmd def_qos_parm;
442};
443
444#define STA_PS_STATUS_WAKE             0
445#define STA_PS_STATUS_SLEEP            1
446
447struct iwl_station_entry {
448	struct iwl_addsta_cmd sta;
449	struct iwl_tid_data tid[MAX_TID_COUNT];
450	u8 used;
451	u8 ps_status;
452	struct iwl_hw_key keyinfo;
453};
454
455/* one for each uCode image (inst/data, boot/init/runtime) */
456struct fw_desc {
457	void *v_addr;		/* access by driver */
458	dma_addr_t p_addr;	/* access by card's busmaster DMA */
459	u32 len;		/* bytes */
460};
461
462/* uCode file layout */
463struct iwl_ucode {
464	__le32 ver;		/* major/minor/subminor */
465	__le32 inst_size;	/* bytes of runtime instructions */
466	__le32 data_size;	/* bytes of runtime data */
467	__le32 init_size;	/* bytes of initialization instructions */
468	__le32 init_data_size;	/* bytes of initialization data */
469	__le32 boot_size;	/* bytes of bootstrap instructions */
470	u8 data[0];		/* data in same order as "size" elements */
471};
472
473struct iwl4965_ibss_seq {
474	u8 mac[ETH_ALEN];
475	u16 seq_num;
476	u16 frag_num;
477	unsigned long packet_time;
478	struct list_head list;
479};
480
481struct iwl_sensitivity_ranges {
482	u16 min_nrg_cck;
483	u16 max_nrg_cck;
484
485	u16 nrg_th_cck;
486	u16 nrg_th_ofdm;
487
488	u16 auto_corr_min_ofdm;
489	u16 auto_corr_min_ofdm_mrc;
490	u16 auto_corr_min_ofdm_x1;
491	u16 auto_corr_min_ofdm_mrc_x1;
492
493	u16 auto_corr_max_ofdm;
494	u16 auto_corr_max_ofdm_mrc;
495	u16 auto_corr_max_ofdm_x1;
496	u16 auto_corr_max_ofdm_mrc_x1;
497
498	u16 auto_corr_max_cck;
499	u16 auto_corr_max_cck_mrc;
500	u16 auto_corr_min_cck;
501	u16 auto_corr_min_cck_mrc;
502};
503
504
505#define IWL_FAT_CHANNEL_52 BIT(IEEE80211_BAND_5GHZ)
506
507/**
508 * struct iwl_hw_params
509 * @max_txq_num: Max # Tx queues supported
510 * @tx/rx_chains_num: Number of TX/RX chains
511 * @valid_tx/rx_ant: usable antennas
512 * @max_rxq_size: Max # Rx frames in Rx queue (must be power-of-2)
513 * @max_rxq_log: Log-base-2 of max_rxq_size
514 * @rx_buf_size: Rx buffer size
515 * @max_stations:
516 * @bcast_sta_id:
517 * @fat_channel: is 40MHz width possible in band 2.4
518 * BIT(IEEE80211_BAND_5GHZ) BIT(IEEE80211_BAND_5GHZ)
519 * @sw_crypto: 0 for hw, 1 for sw
520 * @max_xxx_size: for ucode uses
521 * @ct_kill_threshold: temperature threshold
522 * @calib_init_cfg: setup initial calibrations for the hw
523 * @struct iwl_sensitivity_ranges: range of sensitivity values
524 */
525struct iwl_hw_params {
526	u16 max_txq_num;
527	u8  tx_chains_num;
528	u8  rx_chains_num;
529	u8  valid_tx_ant;
530	u8  valid_rx_ant;
531	u16 max_rxq_size;
532	u16 max_rxq_log;
533	u32 rx_buf_size;
534	u32 max_pkt_size;
535	u8  max_stations;
536	u8  bcast_sta_id;
537	u8 fat_channel;
538	u8 sw_crypto;
539	u32 max_inst_size;
540	u32 max_data_size;
541	u32 max_bsm_size;
542	u32 ct_kill_threshold; /* value in hw-dependent units */
543	u32 calib_init_cfg;
544	const struct iwl_sensitivity_ranges *sens;
545};
546
547#define HT_SHORT_GI_20MHZ	(1 << 0)
548#define HT_SHORT_GI_40MHZ	(1 << 1)
549
550
551#define IWL_RX_HDR(x) ((struct iwl4965_rx_frame_hdr *)(\
552		       x->u.rx_frame.stats.payload + \
553		       x->u.rx_frame.stats.phy_count))
554#define IWL_RX_END(x) ((struct iwl4965_rx_frame_end *)(\
555		       IWL_RX_HDR(x)->payload + \
556		       le16_to_cpu(IWL_RX_HDR(x)->len)))
557#define IWL_RX_STATS(x) (&x->u.rx_frame.stats)
558#define IWL_RX_DATA(x) (IWL_RX_HDR(x)->payload)
559
560/******************************************************************************
561 *
562 * Functions implemented in core module which are forward declared here
563 * for use by iwl-[4-5].c
564 *
565 * NOTE:  The implementation of these functions are not hardware specific
566 * which is why they are in the core module files.
567 *
568 * Naming convention --
569 * iwl_         <-- Is part of iwlwifi
570 * iwlXXXX_     <-- Hardware specific (implemented in iwl-XXXX.c for XXXX)
571 * iwl4965_bg_      <-- Called from work queue context
572 * iwl4965_mac_     <-- mac80211 callback
573 *
574 ****************************************************************************/
575struct iwl_addsta_cmd;
576extern int iwl_send_add_sta(struct iwl_priv *priv,
577			    struct iwl_addsta_cmd *sta, u8 flags);
578extern u8 iwl_add_station_flags(struct iwl_priv *priv, const u8 *addr,
579			int is_ap, u8 flags, struct ieee80211_sta_ht_cap *ht_info);
580extern void iwl_update_chain_flags(struct iwl_priv *priv);
581extern int iwl_set_pwr_src(struct iwl_priv *priv, enum iwl_pwr_src src);
582extern const u8 iwl_bcast_addr[ETH_ALEN];
583extern int iwl_rxq_stop(struct iwl_priv *priv);
584extern void iwl_txq_ctx_stop(struct iwl_priv *priv);
585extern int iwl_queue_space(const struct iwl_queue *q);
586static inline int iwl_queue_used(const struct iwl_queue *q, int i)
587{
588	return q->write_ptr > q->read_ptr ?
589		(i >= q->read_ptr && i < q->write_ptr) :
590		!(i < q->read_ptr && i >= q->write_ptr);
591}
592
593
594static inline u8 get_cmd_index(struct iwl_queue *q, u32 index, int is_huge)
595{
596	/* This is for scan command, the big buffer at end of command array */
597	if (is_huge)
598		return q->n_window;	/* must be power of 2 */
599
600	/* Otherwise, use normal size buffers */
601	return index & (q->n_window - 1);
602}
603
604
605struct iwl_priv;
606
607
608/* Structures, enum, and defines specific to the 4965 */
609
610#define IWL_KW_SIZE 0x1000	/*4k */
611
612struct iwl_kw {
613	dma_addr_t dma_addr;
614	void *v_addr;
615	size_t size;
616};
617
618#define IWL_CHANNEL_WIDTH_20MHZ   0
619#define IWL_CHANNEL_WIDTH_40MHZ   1
620
621#define IWL_OPERATION_MODE_AUTO     0
622#define IWL_OPERATION_MODE_HT_ONLY  1
623#define IWL_OPERATION_MODE_MIXED    2
624#define IWL_OPERATION_MODE_20MHZ    3
625
626#define IWL_TX_CRC_SIZE 4
627#define IWL_TX_DELIMITER_SIZE 4
628
629#define TX_POWER_IWL_ILLEGAL_VOLTAGE -10000
630
631/* Sensitivity and chain noise calibration */
632#define INTERFERENCE_DATA_AVAILABLE	__constant_cpu_to_le32(1)
633#define INITIALIZATION_VALUE		0xFFFF
634#define CAL_NUM_OF_BEACONS		20
635#define MAXIMUM_ALLOWED_PATHLOSS	15
636
637#define CHAIN_NOISE_MAX_DELTA_GAIN_CODE 3
638
639#define MAX_FA_OFDM  50
640#define MIN_FA_OFDM  5
641#define MAX_FA_CCK   50
642#define MIN_FA_CCK   5
643
644#define AUTO_CORR_STEP_OFDM       1
645
646#define AUTO_CORR_STEP_CCK     3
647#define AUTO_CORR_MAX_TH_CCK   160
648
649#define NRG_DIFF               2
650#define NRG_STEP_CCK           2
651#define NRG_MARGIN             8
652#define MAX_NUMBER_CCK_NO_FA 100
653
654#define AUTO_CORR_CCK_MIN_VAL_DEF    (125)
655
656#define CHAIN_A             0
657#define CHAIN_B             1
658#define CHAIN_C             2
659#define CHAIN_NOISE_DELTA_GAIN_INIT_VAL 4
660#define ALL_BAND_FILTER			0xFF00
661#define IN_BAND_FILTER			0xFF
662#define MIN_AVERAGE_NOISE_MAX_VALUE	0xFFFFFFFF
663
664#define NRG_NUM_PREV_STAT_L     20
665#define NUM_RX_CHAINS           3
666
667enum iwl4965_false_alarm_state {
668	IWL_FA_TOO_MANY = 0,
669	IWL_FA_TOO_FEW = 1,
670	IWL_FA_GOOD_RANGE = 2,
671};
672
673enum iwl4965_chain_noise_state {
674	IWL_CHAIN_NOISE_ALIVE = 0,  /* must be 0 */
675	IWL_CHAIN_NOISE_ACCUMULATE,
676	IWL_CHAIN_NOISE_CALIBRATED,
677	IWL_CHAIN_NOISE_DONE,
678};
679
680enum iwl4965_calib_enabled_state {
681	IWL_CALIB_DISABLED = 0,  /* must be 0 */
682	IWL_CALIB_ENABLED = 1,
683};
684
685struct statistics_general_data {
686	u32 beacon_silence_rssi_a;
687	u32 beacon_silence_rssi_b;
688	u32 beacon_silence_rssi_c;
689	u32 beacon_energy_a;
690	u32 beacon_energy_b;
691	u32 beacon_energy_c;
692};
693
694
695/*
696 * enum iwl_calib
697 * defines the order in which results of initial calibrations
698 * should be sent to the runtime uCode
699 */
700enum iwl_calib {
701	IWL_CALIB_XTAL,
702	IWL_CALIB_LO,
703	IWL_CALIB_TX_IQ,
704	IWL_CALIB_TX_IQ_PERD,
705	IWL_CALIB_MAX
706};
707
708/* Opaque calibration results */
709struct iwl_calib_result {
710	void *buf;
711	size_t buf_len;
712};
713
714enum ucode_type {
715	UCODE_NONE = 0,
716	UCODE_INIT,
717	UCODE_RT
718};
719
720/* Sensitivity calib data */
721struct iwl_sensitivity_data {
722	u32 auto_corr_ofdm;
723	u32 auto_corr_ofdm_mrc;
724	u32 auto_corr_ofdm_x1;
725	u32 auto_corr_ofdm_mrc_x1;
726	u32 auto_corr_cck;
727	u32 auto_corr_cck_mrc;
728
729	u32 last_bad_plcp_cnt_ofdm;
730	u32 last_fa_cnt_ofdm;
731	u32 last_bad_plcp_cnt_cck;
732	u32 last_fa_cnt_cck;
733
734	u32 nrg_curr_state;
735	u32 nrg_prev_state;
736	u32 nrg_value[10];
737	u8  nrg_silence_rssi[NRG_NUM_PREV_STAT_L];
738	u32 nrg_silence_ref;
739	u32 nrg_energy_idx;
740	u32 nrg_silence_idx;
741	u32 nrg_th_cck;
742	s32 nrg_auto_corr_silence_diff;
743	u32 num_in_cck_no_fa;
744	u32 nrg_th_ofdm;
745};
746
747/* Chain noise (differential Rx gain) calib data */
748struct iwl_chain_noise_data {
749	u32 active_chains;
750	u32 chain_noise_a;
751	u32 chain_noise_b;
752	u32 chain_noise_c;
753	u32 chain_signal_a;
754	u32 chain_signal_b;
755	u32 chain_signal_c;
756	u16 beacon_count;
757	u8 disconn_array[NUM_RX_CHAINS];
758	u8 delta_gain_code[NUM_RX_CHAINS];
759	u8 radio_write;
760	u8 state;
761};
762
763#define	EEPROM_SEM_TIMEOUT 10		/* milliseconds */
764#define EEPROM_SEM_RETRY_LIMIT 1000	/* number of attempts (not time) */
765
766
767enum {
768	MEASUREMENT_READY = (1 << 0),
769	MEASUREMENT_ACTIVE = (1 << 1),
770};
771
772
773#define IWL_MAX_NUM_QUEUES	20 /* FIXME: do dynamic allocation */
774
775struct iwl_priv {
776
777	/* ieee device used by generic ieee processing code */
778	struct ieee80211_hw *hw;
779	struct ieee80211_channel *ieee_channels;
780	struct ieee80211_rate *ieee_rates;
781	struct iwl_cfg *cfg;
782
783	/* temporary frame storage list */
784	struct list_head free_frames;
785	int frames_count;
786
787	enum ieee80211_band band;
788	int alloc_rxb_skb;
789
790	void (*rx_handlers[REPLY_MAX])(struct iwl_priv *priv,
791				       struct iwl_rx_mem_buffer *rxb);
792
793	struct ieee80211_supported_band bands[IEEE80211_NUM_BANDS];
794
795#ifdef CONFIG_IWLAGN_SPECTRUM_MEASUREMENT
796	/* spectrum measurement report caching */
797	struct iwl4965_spectrum_notification measure_report;
798	u8 measurement_status;
799#endif
800	/* ucode beacon time */
801	u32 ucode_beacon_time;
802
803	/* we allocate array of iwl4965_channel_info for NIC's valid channels.
804	 *    Access via channel # using indirect index array */
805	struct iwl_channel_info *channel_info;	/* channel info array */
806	u8 channel_count;	/* # of channels */
807
808	/* each calibration channel group in the EEPROM has a derived
809	 * clip setting for each rate. */
810	const struct iwl4965_clip_group clip_groups[5];
811
812	/* thermal calibration */
813	s32 temperature;	/* degrees Kelvin */
814	s32 last_temperature;
815
816	/* init calibration results */
817	struct iwl_calib_result calib_results[IWL_CALIB_MAX];
818
819	/* Scan related variables */
820	unsigned long last_scan_jiffies;
821	unsigned long next_scan_jiffies;
822	unsigned long scan_start;
823	unsigned long scan_pass_start;
824	unsigned long scan_start_tsf;
825	struct iwl_scan_cmd *scan;
826	int scan_bands;
827	int one_direct_scan;
828	u8 direct_ssid_len;
829	u8 direct_ssid[IW_ESSID_MAX_SIZE];
830	u8 scan_tx_ant[IEEE80211_NUM_BANDS];
831	u8 mgmt_tx_ant;
832
833	/* spinlock */
834	spinlock_t lock;	/* protect general shared data */
835	spinlock_t hcmd_lock;	/* protect hcmd */
836	struct mutex mutex;
837
838	/* basic pci-network driver stuff */
839	struct pci_dev *pci_dev;
840
841	/* pci hardware address support */
842	void __iomem *hw_base;
843	u32  hw_rev;
844	u32  hw_wa_rev;
845	u8   rev_id;
846
847	/* uCode images, save to reload in case of failure */
848	struct fw_desc ucode_code;	/* runtime inst */
849	struct fw_desc ucode_data;	/* runtime data original */
850	struct fw_desc ucode_data_backup;	/* runtime data save/restore */
851	struct fw_desc ucode_init;	/* initialization inst */
852	struct fw_desc ucode_init_data;	/* initialization data */
853	struct fw_desc ucode_boot;	/* bootstrap inst */
854	enum ucode_type ucode_type;
855	u8 ucode_write_complete;	/* the image write is complete */
856
857
858	struct iwl_rxon_time_cmd rxon_timing;
859
860	/* We declare this const so it can only be
861	 * changed via explicit cast within the
862	 * routines that actually update the physical
863	 * hardware */
864	const struct iwl_rxon_cmd active_rxon;
865	struct iwl_rxon_cmd staging_rxon;
866
867	int error_recovering;
868	struct iwl_rxon_cmd recovery_rxon;
869
870	/* 1st responses from initialize and runtime uCode images.
871	 * 4965's initialize alive response contains some calibration data. */
872	struct iwl_init_alive_resp card_alive_init;
873	struct iwl_alive_resp card_alive;
874#ifdef CONFIG_IWLWIFI_RFKILL
875	struct rfkill *rfkill;
876#endif
877
878#ifdef CONFIG_IWLWIFI_LEDS
879	struct iwl_led led[IWL_LED_TRG_MAX];
880	unsigned long last_blink_time;
881	u8 last_blink_rate;
882	u8 allow_blinking;
883	u64 led_tpt;
884#endif
885
886	u16 active_rate;
887	u16 active_rate_basic;
888
889	u8 assoc_station_added;
890	u8 start_calib;
891	struct iwl_sensitivity_data sensitivity_data;
892	struct iwl_chain_noise_data chain_noise_data;
893	__le16 sensitivity_tbl[HD_TABLE_SIZE];
894
895	struct iwl_ht_info current_ht_config;
896	u8 last_phy_res[100];
897
898	/* Rate scaling data */
899	s8 data_retry_limit;
900	u8 retry_rate;
901
902	wait_queue_head_t wait_command_queue;
903
904	int activity_timer_active;
905
906	/* Rx and Tx DMA processing queues */
907	struct iwl_rx_queue rxq;
908	struct iwl_tx_queue txq[IWL_MAX_NUM_QUEUES];
909	unsigned long txq_ctx_active_msk;
910	struct iwl_kw kw;	/* keep warm address */
911	u32 scd_base_addr;	/* scheduler sram base address */
912
913	unsigned long status;
914
915	int last_rx_rssi;	/* From Rx packet statistics */
916	int last_rx_noise;	/* From beacon statistics */
917
918	/* counts mgmt, ctl, and data packets */
919	struct traffic_stats {
920		u32 cnt;
921		u64 bytes;
922	} tx_stats[3], rx_stats[3];
923
924	struct iwl_power_mgr power_data;
925
926	struct iwl_notif_statistics statistics;
927	unsigned long last_statistics_time;
928
929	/* context information */
930	u16 rates_mask;
931
932	u32 power_mode;
933	u32 antenna;
934	u8 bssid[ETH_ALEN];
935	u16 rts_threshold;
936	u8 mac_addr[ETH_ALEN];
937
938	/*station table variables */
939	spinlock_t sta_lock;
940	int num_stations;
941	struct iwl_station_entry stations[IWL_STATION_COUNT];
942	struct iwl_wep_key wep_keys[WEP_KEYS_MAX];
943	u8 default_wep_key;
944	u8 key_mapping_key;
945	unsigned long ucode_key_table;
946
947	/* Indication if ieee80211_ops->open has been called */
948	u8 is_open;
949
950	u8 mac80211_registered;
951
952	/* Rx'd packet timing information */
953	u32 last_beacon_time;
954	u64 last_tsf;
955
956	/* eeprom */
957	u8 *eeprom;
958	struct iwl_eeprom_calib_info *calib_info;
959
960	enum nl80211_iftype iw_mode;
961
962	struct sk_buff *ibss_beacon;
963
964	/* Last Rx'd beacon timestamp */
965	u64 timestamp;
966	u16 beacon_int;
967	struct ieee80211_vif *vif;
968
969	struct iwl_hw_params hw_params;
970	/* driver/uCode shared Tx Byte Counts and Rx status */
971	void *shared_virt;
972	int rb_closed_offset;
973	/* Physical Pointer to Tx Byte Counts and Rx status */
974	dma_addr_t shared_phys;
975
976	/* Current association information needed to configure the
977	 * hardware */
978	u16 assoc_id;
979	u16 assoc_capability;
980
981	struct iwl_qos_info qos_data;
982
983	struct workqueue_struct *workqueue;
984
985	struct work_struct up;
986	struct work_struct restart;
987	struct work_struct calibrated_work;
988	struct work_struct scan_completed;
989	struct work_struct rx_replenish;
990	struct work_struct rf_kill;
991	struct work_struct abort_scan;
992	struct work_struct update_link_led;
993	struct work_struct auth_work;
994	struct work_struct report_work;
995	struct work_struct request_scan;
996	struct work_struct beacon_update;
997	struct work_struct set_monitor;
998
999	struct tasklet_struct irq_tasklet;
1000
1001	struct delayed_work set_power_save;
1002	struct delayed_work init_alive_start;
1003	struct delayed_work alive_start;
1004	struct delayed_work scan_check;
1005	/* TX Power */
1006	s8 tx_power_user_lmt;
1007	s8 tx_power_channel_lmt;
1008
1009#ifdef CONFIG_PM
1010	u32 pm_state[16];
1011#endif
1012
1013#ifdef CONFIG_IWLWIFI_DEBUG
1014	/* debugging info */
1015	u32 debug_level;
1016	u32 framecnt_to_us;
1017	atomic_t restrict_refcnt;
1018#ifdef CONFIG_IWLWIFI_DEBUGFS
1019	/* debugfs */
1020	struct iwl_debugfs *dbgfs;
1021#endif /* CONFIG_IWLWIFI_DEBUGFS */
1022#endif /* CONFIG_IWLWIFI_DEBUG */
1023
1024	struct work_struct txpower_work;
1025	u32 disable_sens_cal;
1026	u32 disable_chain_noise_cal;
1027	u32 disable_tx_power_cal;
1028	struct work_struct run_time_calib_work;
1029	struct timer_list statistics_periodic;
1030}; /*iwl_priv */
1031
1032static inline void iwl_txq_ctx_activate(struct iwl_priv *priv, int txq_id)
1033{
1034	set_bit(txq_id, &priv->txq_ctx_active_msk);
1035}
1036
1037static inline void iwl_txq_ctx_deactivate(struct iwl_priv *priv, int txq_id)
1038{
1039	clear_bit(txq_id, &priv->txq_ctx_active_msk);
1040}
1041
1042#ifdef CONFIG_IWLWIFI_DEBUG
1043const char *iwl_get_tx_fail_reason(u32 status);
1044#else
1045static inline const char *iwl_get_tx_fail_reason(u32 status) { return ""; }
1046#endif
1047
1048
1049static inline struct ieee80211_hdr *iwl_tx_queue_get_hdr(struct iwl_priv *priv,
1050							 int txq_id, int idx)
1051{
1052	if (priv->txq[txq_id].txb[idx].skb[0])
1053		return (struct ieee80211_hdr *)priv->txq[txq_id].
1054				txb[idx].skb[0]->data;
1055	return NULL;
1056}
1057
1058
1059static inline int iwl_is_associated(struct iwl_priv *priv)
1060{
1061	return (priv->active_rxon.filter_flags & RXON_FILTER_ASSOC_MSK) ? 1 : 0;
1062}
1063
1064static inline int is_channel_valid(const struct iwl_channel_info *ch_info)
1065{
1066	if (ch_info == NULL)
1067		return 0;
1068	return (ch_info->flags & EEPROM_CHANNEL_VALID) ? 1 : 0;
1069}
1070
1071static inline int is_channel_radar(const struct iwl_channel_info *ch_info)
1072{
1073	return (ch_info->flags & EEPROM_CHANNEL_RADAR) ? 1 : 0;
1074}
1075
1076static inline u8 is_channel_a_band(const struct iwl_channel_info *ch_info)
1077{
1078	return ch_info->band == IEEE80211_BAND_5GHZ;
1079}
1080
1081static inline u8 is_channel_bg_band(const struct iwl_channel_info *ch_info)
1082{
1083	return ch_info->band == IEEE80211_BAND_2GHZ;
1084}
1085
1086static inline int is_channel_passive(const struct iwl_channel_info *ch)
1087{
1088	return (!(ch->flags & EEPROM_CHANNEL_ACTIVE)) ? 1 : 0;
1089}
1090
1091static inline int is_channel_ibss(const struct iwl_channel_info *ch)
1092{
1093	return ((ch->flags & EEPROM_CHANNEL_IBSS)) ? 1 : 0;
1094}
1095
1096#ifdef CONFIG_IWLWIFI_DEBUG
1097static inline void iwl_print_hex_dump(struct iwl_priv *priv, int level,
1098				      void *p, u32 len)
1099{
1100	if (!(priv->debug_level & level))
1101		return;
1102
1103	print_hex_dump(KERN_DEBUG, "iwl data: ", DUMP_PREFIX_OFFSET, 16, 1,
1104			p, len, 1);
1105}
1106#else
1107static inline void iwl_print_hex_dump(struct iwl_priv *priv, int level,
1108				      void *p, u32 len)
1109{
1110}
1111#endif
1112
1113extern const struct iwl_channel_info *iwl_get_channel_info(
1114	const struct iwl_priv *priv, enum ieee80211_band band, u16 channel);
1115
1116/* Requires full declaration of iwl_priv before including */
1117
1118#endif				/* __iwl_dev_h__ */
1119