aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/iwlwifi/iwl-4965.h
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2007-10-25 05:15:50 -0400
committerDavid S. Miller <davem@davemloft.net>2008-01-28 18:03:24 -0500
commit5d08cd1dfdc57dc834c47eb9f023fcf861f3d6bf (patch)
treeabac0496b2ab958970c58c459070a8ca5f5fdde7 /drivers/net/wireless/iwlwifi/iwl-4965.h
parent416e1438d5a921046fda6fc5673d5f2c69841c06 (diff)
iwlwifi: keep 3945 and 4965 headers separate
The iwl3945 and iwl4965 devices share some common structure, but with a lot of difference split all over. Currently the two drivers share a lot of headers and use ugly preprocessor magic to manage the difference. This patch keeps two entirely separate copies of the headers to get rid of these hacks an ease future development. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Zhu Yi <yi.zhu@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl-4965.h')
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-4965.h1019
1 files changed, 1019 insertions, 0 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-4965.h b/drivers/net/wireless/iwlwifi/iwl-4965.h
index b31a7e4b7d78..bf174d3b8fbf 100644
--- a/drivers/net/wireless/iwlwifi/iwl-4965.h
+++ b/drivers/net/wireless/iwlwifi/iwl-4965.h
@@ -26,6 +26,707 @@
26#ifndef __iwl_4965_h__ 26#ifndef __iwl_4965_h__
27#define __iwl_4965_h__ 27#define __iwl_4965_h__
28 28
29#include <linux/pci.h> /* for struct pci_device_id */
30#include <linux/kernel.h>
31#include <net/ieee80211_radiotap.h>
32
33struct iwl_priv;
34
35/* Hardware specific file defines the PCI IDs table for that hardware module */
36extern struct pci_device_id iwl_hw_card_ids[];
37
38#define DRV_NAME "iwl4965"
39#include "iwl-4965-hw.h"
40#include "iwl-prph.h"
41#include "iwl-4965-debug.h"
42
43/* Default noise level to report when noise measurement is not available.
44 * This may be because we're:
45 * 1) Not associated (4965, no beacon statistics being sent to driver)
46 * 2) Scanning (noise measurement does not apply to associated channel)
47 * 3) Receiving CCK (3945 delivers noise info only for OFDM frames)
48 * Use default noise value of -127 ... this is below the range of measurable
49 * Rx dBm for either 3945 or 4965, so it can indicate "unmeasurable" to user.
50 * Also, -127 works better than 0 when averaging frames with/without
51 * noise info (e.g. averaging might be done in app); measured dBm values are
52 * always negative ... using a negative value as the default keeps all
53 * averages within an s8's (used in some apps) range of negative values. */
54#define IWL_NOISE_MEAS_NOT_AVAILABLE (-127)
55
56/* Module parameters accessible from iwl-*.c */
57extern int iwl_param_hwcrypto;
58extern int iwl_param_queues_num;
59
60enum iwl_antenna {
61 IWL_ANTENNA_DIVERSITY,
62 IWL_ANTENNA_MAIN,
63 IWL_ANTENNA_AUX
64};
65
66/*
67 * RTS threshold here is total size [2347] minus 4 FCS bytes
68 * Per spec:
69 * a value of 0 means RTS on all data/management packets
70 * a value > max MSDU size means no RTS
71 * else RTS for data/management frames where MPDU is larger
72 * than RTS value.
73 */
74#define DEFAULT_RTS_THRESHOLD 2347U
75#define MIN_RTS_THRESHOLD 0U
76#define MAX_RTS_THRESHOLD 2347U
77#define MAX_MSDU_SIZE 2304U
78#define MAX_MPDU_SIZE 2346U
79#define DEFAULT_BEACON_INTERVAL 100U
80#define DEFAULT_SHORT_RETRY_LIMIT 7U
81#define DEFAULT_LONG_RETRY_LIMIT 4U
82
83struct iwl_rx_mem_buffer {
84 dma_addr_t dma_addr;
85 struct sk_buff *skb;
86 struct list_head list;
87};
88
89struct iwl_rt_rx_hdr {
90 struct ieee80211_radiotap_header rt_hdr;
91 __le64 rt_tsf; /* TSF */
92 u8 rt_flags; /* radiotap packet flags */
93 u8 rt_rate; /* rate in 500kb/s */
94 __le16 rt_channelMHz; /* channel in MHz */
95 __le16 rt_chbitmask; /* channel bitfield */
96 s8 rt_dbmsignal; /* signal in dBm, kluged to signed */
97 s8 rt_dbmnoise;
98 u8 rt_antenna; /* antenna number */
99 u8 payload[0]; /* payload... */
100} __attribute__ ((packed));
101
102struct iwl_rt_tx_hdr {
103 struct ieee80211_radiotap_header rt_hdr;
104 u8 rt_rate; /* rate in 500kb/s */
105 __le16 rt_channel; /* channel in mHz */
106 __le16 rt_chbitmask; /* channel bitfield */
107 s8 rt_dbmsignal; /* signal in dBm, kluged to signed */
108 u8 rt_antenna; /* antenna number */
109 u8 payload[0]; /* payload... */
110} __attribute__ ((packed));
111
112/*
113 * Generic queue structure
114 *
115 * Contains common data for Rx and Tx queues
116 */
117struct iwl_queue {
118 int n_bd; /* number of BDs in this queue */
119 int write_ptr; /* 1-st empty entry (index) host_w*/
120 int read_ptr; /* last used entry (index) host_r*/
121 dma_addr_t dma_addr; /* physical addr for BD's */
122 int n_window; /* safe queue window */
123 u32 id;
124 int low_mark; /* low watermark, resume queue if free
125 * space more than this */
126 int high_mark; /* high watermark, stop queue if free
127 * space less than this */
128} __attribute__ ((packed));
129
130#define MAX_NUM_OF_TBS (20)
131
132struct iwl_tx_info {
133 struct ieee80211_tx_status status;
134 struct sk_buff *skb[MAX_NUM_OF_TBS];
135};
136
137/**
138 * struct iwl_tx_queue - Tx Queue for DMA
139 * @need_update: need to update read/write index
140 * @shed_retry: queue is HT AGG enabled
141 *
142 * Queue consists of circular buffer of BD's and required locking structures.
143 */
144struct iwl_tx_queue {
145 struct iwl_queue q;
146 struct iwl_tfd_frame *bd;
147 struct iwl_cmd *cmd;
148 dma_addr_t dma_addr_cmd;
149 struct iwl_tx_info *txb;
150 int need_update;
151 int sched_retry;
152 int active;
153};
154
155#define IWL_NUM_SCAN_RATES (2)
156
157struct iwl_channel_tgd_info {
158 u8 type;
159 s8 max_power;
160};
161
162struct iwl_channel_tgh_info {
163 s64 last_radar_time;
164};
165
166/* current Tx power values to use, one for each rate for each channel.
167 * requested power is limited by:
168 * -- regulatory EEPROM limits for this channel
169 * -- hardware capabilities (clip-powers)
170 * -- spectrum management
171 * -- user preference (e.g. iwconfig)
172 * when requested power is set, base power index must also be set. */
173struct iwl_channel_power_info {
174 struct iwl_tx_power tpc; /* actual radio and DSP gain settings */
175 s8 power_table_index; /* actual (compenst'd) index into gain table */
176 s8 base_power_index; /* gain index for power at factory temp. */
177 s8 requested_power; /* power (dBm) requested for this chnl/rate */
178};
179
180/* current scan Tx power values to use, one for each scan rate for each
181 * channel. */
182struct iwl_scan_power_info {
183 struct iwl_tx_power tpc; /* actual radio and DSP gain settings */
184 s8 power_table_index; /* actual (compenst'd) index into gain table */
185 s8 requested_power; /* scan pwr (dBm) requested for chnl/rate */
186};
187
188/* Channel unlock period is 15 seconds. If no beacon or probe response
189 * has been received within 15 seconds on a locked channel then the channel
190 * remains locked. */
191#define TX_UNLOCK_PERIOD 15
192
193/* CSA lock period is 15 seconds. If a CSA has been received on a channel in
194 * the last 15 seconds, the channel is locked */
195#define CSA_LOCK_PERIOD 15
196/*
197 * One for each channel, holds all channel setup data
198 * Some of the fields (e.g. eeprom and flags/max_power_avg) are redundant
199 * with one another!
200 */
201#define IWL4965_MAX_RATE (33)
202
203struct iwl_channel_info {
204 struct iwl_channel_tgd_info tgd;
205 struct iwl_channel_tgh_info tgh;
206 struct iwl_eeprom_channel eeprom; /* EEPROM regulatory limit */
207 struct iwl_eeprom_channel fat_eeprom; /* EEPROM regulatory limit for
208 * FAT channel */
209
210 u8 channel; /* channel number */
211 u8 flags; /* flags copied from EEPROM */
212 s8 max_power_avg; /* (dBm) regul. eeprom, normal Tx, any rate */
213 s8 curr_txpow; /* (dBm) regulatory/spectrum/user (not h/w) */
214 s8 min_power; /* always 0 */
215 s8 scan_power; /* (dBm) regul. eeprom, direct scans, any rate */
216
217 u8 group_index; /* 0-4, maps channel to group1/2/3/4/5 */
218 u8 band_index; /* 0-4, maps channel to band1/2/3/4/5 */
219 u8 phymode; /* MODE_IEEE80211{A,B,G} */
220
221 /* Radio/DSP gain settings for each "normal" data Tx rate.
222 * These include, in addition to RF and DSP gain, a few fields for
223 * remembering/modifying gain settings (indexes). */
224 struct iwl_channel_power_info power_info[IWL4965_MAX_RATE];
225
226 /* FAT channel info */
227 s8 fat_max_power_avg; /* (dBm) regul. eeprom, normal Tx, any rate */
228 s8 fat_curr_txpow; /* (dBm) regulatory/spectrum/user (not h/w) */
229 s8 fat_min_power; /* always 0 */
230 s8 fat_scan_power; /* (dBm) eeprom, direct scans, any rate */
231 u8 fat_flags; /* flags copied from EEPROM */
232 u8 fat_extension_channel;
233
234 /* Radio/DSP gain settings for each scan rate, for directed scans. */
235 struct iwl_scan_power_info scan_pwr_info[IWL_NUM_SCAN_RATES];
236};
237
238struct iwl_clip_group {
239 /* maximum power level to prevent clipping for each rate, derived by
240 * us from this band's saturation power in EEPROM */
241 const s8 clip_powers[IWL_MAX_RATES];
242};
243
244#include "iwl-4965-rs.h"
245
246#define IWL_TX_FIFO_AC0 0
247#define IWL_TX_FIFO_AC1 1
248#define IWL_TX_FIFO_AC2 2
249#define IWL_TX_FIFO_AC3 3
250#define IWL_TX_FIFO_HCCA_1 5
251#define IWL_TX_FIFO_HCCA_2 6
252#define IWL_TX_FIFO_NONE 7
253
254/* Minimum number of queues. MAX_NUM is defined in hw specific files */
255#define IWL_MIN_NUM_QUEUES 4
256
257/* Power management (not Tx power) structures */
258
259struct iwl_power_vec_entry {
260 struct iwl_powertable_cmd cmd;
261 u8 no_dtim;
262};
263#define IWL_POWER_RANGE_0 (0)
264#define IWL_POWER_RANGE_1 (1)
265
266#define IWL_POWER_MODE_CAM 0x00 /* Continuously Aware Mode, always on */
267#define IWL_POWER_INDEX_3 0x03
268#define IWL_POWER_INDEX_5 0x05
269#define IWL_POWER_AC 0x06
270#define IWL_POWER_BATTERY 0x07
271#define IWL_POWER_LIMIT 0x07
272#define IWL_POWER_MASK 0x0F
273#define IWL_POWER_ENABLED 0x10
274#define IWL_POWER_LEVEL(x) ((x) & IWL_POWER_MASK)
275
276struct iwl_power_mgr {
277 spinlock_t lock;
278 struct iwl_power_vec_entry pwr_range_0[IWL_POWER_AC];
279 struct iwl_power_vec_entry pwr_range_1[IWL_POWER_AC];
280 u8 active_index;
281 u32 dtim_val;
282};
283
284#define IEEE80211_DATA_LEN 2304
285#define IEEE80211_4ADDR_LEN 30
286#define IEEE80211_HLEN (IEEE80211_4ADDR_LEN)
287#define IEEE80211_FRAME_LEN (IEEE80211_DATA_LEN + IEEE80211_HLEN)
288
289struct iwl_frame {
290 union {
291 struct ieee80211_hdr frame;
292 struct iwl_tx_beacon_cmd beacon;
293 u8 raw[IEEE80211_FRAME_LEN];
294 u8 cmd[360];
295 } u;
296 struct list_head list;
297};
298
299#define SEQ_TO_QUEUE(x) ((x >> 8) & 0xbf)
300#define QUEUE_TO_SEQ(x) ((x & 0xbf) << 8)
301#define SEQ_TO_INDEX(x) (x & 0xff)
302#define INDEX_TO_SEQ(x) (x & 0xff)
303#define SEQ_HUGE_FRAME (0x4000)
304#define SEQ_RX_FRAME __constant_cpu_to_le16(0x8000)
305#define SEQ_TO_SN(seq) (((seq) & IEEE80211_SCTL_SEQ) >> 4)
306#define SN_TO_SEQ(ssn) (((ssn) << 4) & IEEE80211_SCTL_SEQ)
307#define MAX_SN ((IEEE80211_SCTL_SEQ) >> 4)
308
309enum {
310 /* CMD_SIZE_NORMAL = 0, */
311 CMD_SIZE_HUGE = (1 << 0),
312 /* CMD_SYNC = 0, */
313 CMD_ASYNC = (1 << 1),
314 /* CMD_NO_SKB = 0, */
315 CMD_WANT_SKB = (1 << 2),
316};
317
318struct iwl_cmd;
319struct iwl_priv;
320
321struct iwl_cmd_meta {
322 struct iwl_cmd_meta *source;
323 union {
324 struct sk_buff *skb;
325 int (*callback)(struct iwl_priv *priv,
326 struct iwl_cmd *cmd, struct sk_buff *skb);
327 } __attribute__ ((packed)) u;
328
329 /* The CMD_SIZE_HUGE flag bit indicates that the command
330 * structure is stored at the end of the shared queue memory. */
331 u32 flags;
332
333} __attribute__ ((packed));
334
335struct iwl_cmd {
336 struct iwl_cmd_meta meta;
337 struct iwl_cmd_header hdr;
338 union {
339 struct iwl_addsta_cmd addsta;
340 struct iwl_led_cmd led;
341 u32 flags;
342 u8 val8;
343 u16 val16;
344 u32 val32;
345 struct iwl_bt_cmd bt;
346 struct iwl_rxon_time_cmd rxon_time;
347 struct iwl_powertable_cmd powertable;
348 struct iwl_qosparam_cmd qosparam;
349 struct iwl_tx_cmd tx;
350 struct iwl_tx_beacon_cmd tx_beacon;
351 struct iwl_rxon_assoc_cmd rxon_assoc;
352 u8 *indirect;
353 u8 payload[360];
354 } __attribute__ ((packed)) cmd;
355} __attribute__ ((packed));
356
357struct iwl_host_cmd {
358 u8 id;
359 u16 len;
360 struct iwl_cmd_meta meta;
361 const void *data;
362};
363
364#define TFD_MAX_PAYLOAD_SIZE (sizeof(struct iwl_cmd) - \
365 sizeof(struct iwl_cmd_meta))
366
367/*
368 * RX related structures and functions
369 */
370#define RX_FREE_BUFFERS 64
371#define RX_LOW_WATERMARK 8
372
373#define SUP_RATE_11A_MAX_NUM_CHANNELS 8
374#define SUP_RATE_11B_MAX_NUM_CHANNELS 4
375#define SUP_RATE_11G_MAX_NUM_CHANNELS 12
376
377/**
378 * struct iwl_rx_queue - Rx queue
379 * @processed: Internal index to last handled Rx packet
380 * @read: Shared index to newest available Rx buffer
381 * @write: Shared index to oldest written Rx packet
382 * @free_count: Number of pre-allocated buffers in rx_free
383 * @rx_free: list of free SKBs for use
384 * @rx_used: List of Rx buffers with no SKB
385 * @need_update: flag to indicate we need to update read/write index
386 *
387 * NOTE: rx_free and rx_used are used as a FIFO for iwl_rx_mem_buffers
388 */
389struct iwl_rx_queue {
390 __le32 *bd;
391 dma_addr_t dma_addr;
392 struct iwl_rx_mem_buffer pool[RX_QUEUE_SIZE + RX_FREE_BUFFERS];
393 struct iwl_rx_mem_buffer *queue[RX_QUEUE_SIZE];
394 u32 processed;
395 u32 read;
396 u32 write;
397 u32 free_count;
398 struct list_head rx_free;
399 struct list_head rx_used;
400 int need_update;
401 spinlock_t lock;
402};
403
404#define IWL_SUPPORTED_RATES_IE_LEN 8
405
406#define SCAN_INTERVAL 100
407
408#define MAX_A_CHANNELS 252
409#define MIN_A_CHANNELS 7
410
411#define MAX_B_CHANNELS 14
412#define MIN_B_CHANNELS 1
413
414#define STATUS_HCMD_ACTIVE 0 /* host command in progress */
415#define STATUS_INT_ENABLED 1
416#define STATUS_RF_KILL_HW 2
417#define STATUS_RF_KILL_SW 3
418#define STATUS_INIT 4
419#define STATUS_ALIVE 5
420#define STATUS_READY 6
421#define STATUS_TEMPERATURE 7
422#define STATUS_GEO_CONFIGURED 8
423#define STATUS_EXIT_PENDING 9
424#define STATUS_IN_SUSPEND 10
425#define STATUS_STATISTICS 11
426#define STATUS_SCANNING 12
427#define STATUS_SCAN_ABORTING 13
428#define STATUS_SCAN_HW 14
429#define STATUS_POWER_PMI 15
430#define STATUS_FW_ERROR 16
431
432#define MAX_TID_COUNT 9
433
434#define IWL_INVALID_RATE 0xFF
435#define IWL_INVALID_VALUE -1
436
437#ifdef CONFIG_IWLWIFI_HT
438#ifdef CONFIG_IWLWIFI_HT_AGG
439struct iwl_ht_agg {
440 u16 txq_id;
441 u16 frame_count;
442 u16 wait_for_ba;
443 u16 start_idx;
444 u32 bitmap0;
445 u32 bitmap1;
446 u32 rate_n_flags;
447};
448#endif /* CONFIG_IWLWIFI_HT_AGG */
449#endif /* CONFIG_IWLWIFI_HT */
450
451struct iwl_tid_data {
452 u16 seq_number;
453#ifdef CONFIG_IWLWIFI_HT
454#ifdef CONFIG_IWLWIFI_HT_AGG
455 struct iwl_ht_agg agg;
456#endif /* CONFIG_IWLWIFI_HT_AGG */
457#endif /* CONFIG_IWLWIFI_HT */
458};
459
460struct iwl_hw_key {
461 enum ieee80211_key_alg alg;
462 int keylen;
463 u8 key[32];
464};
465
466union iwl_ht_rate_supp {
467 u16 rates;
468 struct {
469 u8 siso_rate;
470 u8 mimo_rate;
471 };
472};
473
474#ifdef CONFIG_IWLWIFI_HT
475#define CFG_HT_RX_AMPDU_FACTOR_DEF (0x3)
476#define HT_IE_MAX_AMSDU_SIZE_4K (0)
477#define CFG_HT_MPDU_DENSITY_2USEC (0x5)
478#define CFG_HT_MPDU_DENSITY_DEF CFG_HT_MPDU_DENSITY_2USEC
479
480struct sta_ht_info {
481 u8 is_ht;
482 u16 rx_mimo_ps_mode;
483 u16 tx_mimo_ps_mode;
484 u16 control_channel;
485 u8 max_amsdu_size;
486 u8 ampdu_factor;
487 u8 mpdu_density;
488 u8 operating_mode;
489 u8 supported_chan_width;
490 u8 extension_chan_offset;
491 u8 is_green_field;
492 u8 sgf;
493 u8 supp_rates[16];
494 u8 tx_chan_width;
495 u8 chan_width_cap;
496};
497#endif /*CONFIG_IWLWIFI_HT */
498
499#ifdef CONFIG_IWLWIFI_QOS
500
501union iwl_qos_capabity {
502 struct {
503 u8 edca_count:4; /* bit 0-3 */
504 u8 q_ack:1; /* bit 4 */
505 u8 queue_request:1; /* bit 5 */
506 u8 txop_request:1; /* bit 6 */
507 u8 reserved:1; /* bit 7 */
508 } q_AP;
509 struct {
510 u8 acvo_APSD:1; /* bit 0 */
511 u8 acvi_APSD:1; /* bit 1 */
512 u8 ac_bk_APSD:1; /* bit 2 */
513 u8 ac_be_APSD:1; /* bit 3 */
514 u8 q_ack:1; /* bit 4 */
515 u8 max_len:2; /* bit 5-6 */
516 u8 more_data_ack:1; /* bit 7 */
517 } q_STA;
518 u8 val;
519};
520
521/* QoS structures */
522struct iwl_qos_info {
523 int qos_enable;
524 int qos_active;
525 union iwl_qos_capabity qos_cap;
526 struct iwl_qosparam_cmd def_qos_parm;
527};
528#endif /*CONFIG_IWLWIFI_QOS */
529
530#define STA_PS_STATUS_WAKE 0
531#define STA_PS_STATUS_SLEEP 1
532
533struct iwl_station_entry {
534 struct iwl_addsta_cmd sta;
535 struct iwl_tid_data tid[MAX_TID_COUNT];
536 u8 used;
537 u8 ps_status;
538 struct iwl_hw_key keyinfo;
539};
540
541/* one for each uCode image (inst/data, boot/init/runtime) */
542struct fw_desc {
543 void *v_addr; /* access by driver */
544 dma_addr_t p_addr; /* access by card's busmaster DMA */
545 u32 len; /* bytes */
546};
547
548/* uCode file layout */
549struct iwl_ucode {
550 __le32 ver; /* major/minor/subminor */
551 __le32 inst_size; /* bytes of runtime instructions */
552 __le32 data_size; /* bytes of runtime data */
553 __le32 init_size; /* bytes of initialization instructions */
554 __le32 init_data_size; /* bytes of initialization data */
555 __le32 boot_size; /* bytes of bootstrap instructions */
556 u8 data[0]; /* data in same order as "size" elements */
557};
558
559#define IWL_IBSS_MAC_HASH_SIZE 32
560
561struct iwl_ibss_seq {
562 u8 mac[ETH_ALEN];
563 u16 seq_num;
564 u16 frag_num;
565 unsigned long packet_time;
566 struct list_head list;
567};
568
569struct iwl_driver_hw_info {
570 u16 max_txq_num;
571 u16 ac_queue_count;
572 u16 tx_cmd_len;
573 u16 max_rxq_size;
574 u32 rx_buffer_size;
575 u16 max_rxq_log;
576 u8 max_stations;
577 u8 bcast_sta_id;
578 void *shared_virt;
579 dma_addr_t shared_phys;
580};
581
582
583#define STA_FLG_RTS_MIMO_PROT_MSK __constant_cpu_to_le32(1 << 17)
584#define STA_FLG_AGG_MPDU_8US_MSK __constant_cpu_to_le32(1 << 18)
585#define STA_FLG_MAX_AGG_SIZE_POS (19)
586#define STA_FLG_MAX_AGG_SIZE_MSK __constant_cpu_to_le32(3 << 19)
587#define STA_FLG_FAT_EN_MSK __constant_cpu_to_le32(1 << 21)
588#define STA_FLG_MIMO_DIS_MSK __constant_cpu_to_le32(1 << 22)
589#define STA_FLG_AGG_MPDU_DENSITY_POS (23)
590#define STA_FLG_AGG_MPDU_DENSITY_MSK __constant_cpu_to_le32(7 << 23)
591#define HT_SHORT_GI_20MHZ_ONLY (1 << 0)
592#define HT_SHORT_GI_40MHZ_ONLY (1 << 1)
593
594
595#define IWL_RX_HDR(x) ((struct iwl_rx_frame_hdr *)(\
596 x->u.rx_frame.stats.payload + \
597 x->u.rx_frame.stats.phy_count))
598#define IWL_RX_END(x) ((struct iwl_rx_frame_end *)(\
599 IWL_RX_HDR(x)->payload + \
600 le16_to_cpu(IWL_RX_HDR(x)->len)))
601#define IWL_RX_STATS(x) (&x->u.rx_frame.stats)
602#define IWL_RX_DATA(x) (IWL_RX_HDR(x)->payload)
603
604
605/******************************************************************************
606 *
607 * Functions implemented in iwl-base.c which are forward declared here
608 * for use by iwl-*.c
609 *
610 *****************************************************************************/
611struct iwl_addsta_cmd;
612extern int iwl_send_add_station(struct iwl_priv *priv,
613 struct iwl_addsta_cmd *sta, u8 flags);
614extern u8 iwl_add_station(struct iwl_priv *priv, const u8 *bssid,
615 int is_ap, u8 flags);
616extern int iwl_is_network_packet(struct iwl_priv *priv,
617 struct ieee80211_hdr *header);
618extern int iwl_power_init_handle(struct iwl_priv *priv);
619extern int iwl_eeprom_init(struct iwl_priv *priv);
620#ifdef CONFIG_IWLWIFI_DEBUG
621extern void iwl_report_frame(struct iwl_priv *priv,
622 struct iwl_rx_packet *pkt,
623 struct ieee80211_hdr *header, int group100);
624#else
625static inline void iwl_report_frame(struct iwl_priv *priv,
626 struct iwl_rx_packet *pkt,
627 struct ieee80211_hdr *header,
628 int group100) {}
629#endif
630extern void iwl_handle_data_packet_monitor(struct iwl_priv *priv,
631 struct iwl_rx_mem_buffer *rxb,
632 void *data, short len,
633 struct ieee80211_rx_status *stats,
634 u16 phy_flags);
635extern int is_duplicate_packet(struct iwl_priv *priv, struct ieee80211_hdr
636 *header);
637extern int iwl_rx_queue_alloc(struct iwl_priv *priv);
638extern void iwl_rx_queue_reset(struct iwl_priv *priv,
639 struct iwl_rx_queue *rxq);
640extern int iwl_calc_db_from_ratio(int sig_ratio);
641extern int iwl_calc_sig_qual(int rssi_dbm, int noise_dbm);
642extern int iwl_tx_queue_init(struct iwl_priv *priv,
643 struct iwl_tx_queue *txq, int count, u32 id);
644extern void iwl_rx_replenish(void *data);
645extern void iwl_tx_queue_free(struct iwl_priv *priv, struct iwl_tx_queue *txq);
646extern int iwl_send_cmd_pdu(struct iwl_priv *priv, u8 id, u16 len,
647 const void *data);
648extern int __must_check iwl_send_cmd(struct iwl_priv *priv,
649 struct iwl_host_cmd *cmd);
650extern unsigned int iwl_fill_beacon_frame(struct iwl_priv *priv,
651 struct ieee80211_hdr *hdr,
652 const u8 *dest, int left);
653extern int iwl_rx_queue_update_write_ptr(struct iwl_priv *priv,
654 struct iwl_rx_queue *q);
655extern int iwl_send_statistics_request(struct iwl_priv *priv);
656extern void iwl_set_decrypted_flag(struct iwl_priv *priv, struct sk_buff *skb,
657 u32 decrypt_res,
658 struct ieee80211_rx_status *stats);
659extern __le16 *ieee80211_get_qos_ctrl(struct ieee80211_hdr *hdr);
660
661extern const u8 BROADCAST_ADDR[ETH_ALEN];
662
663/*
664 * Currently used by iwl-3945-rs... look at restructuring so that it doesn't
665 * call this... todo... fix that.
666*/
667extern u8 iwl_sync_station(struct iwl_priv *priv, int sta_id,
668 u16 tx_rate, u8 flags);
669
670/******************************************************************************
671 *
672 * Functions implemented in iwl-[34]*.c which are forward declared here
673 * for use by iwl-base.c
674 *
675 * NOTE: The implementation of these functions are hardware specific
676 * which is why they are in the hardware specific files (vs. iwl-base.c)
677 *
678 * Naming convention --
679 * iwl_ <-- Its part of iwlwifi (should be changed to iwl_)
680 * iwl_hw_ <-- Hardware specific (implemented in iwl-XXXX.c by all HW)
681 * iwlXXXX_ <-- Hardware specific (implemented in iwl-XXXX.c for XXXX)
682 * iwl_bg_ <-- Called from work queue context
683 * iwl_mac_ <-- mac80211 callback
684 *
685 ****************************************************************************/
686extern void iwl_hw_rx_handler_setup(struct iwl_priv *priv);
687extern void iwl_hw_setup_deferred_work(struct iwl_priv *priv);
688extern void iwl_hw_cancel_deferred_work(struct iwl_priv *priv);
689extern int iwl_hw_rxq_stop(struct iwl_priv *priv);
690extern int iwl_hw_set_hw_setting(struct iwl_priv *priv);
691extern int iwl_hw_nic_init(struct iwl_priv *priv);
692extern int iwl_hw_nic_stop_master(struct iwl_priv *priv);
693extern void iwl_hw_txq_ctx_free(struct iwl_priv *priv);
694extern void iwl_hw_txq_ctx_stop(struct iwl_priv *priv);
695extern int iwl_hw_nic_reset(struct iwl_priv *priv);
696extern int iwl_hw_txq_attach_buf_to_tfd(struct iwl_priv *priv, void *tfd,
697 dma_addr_t addr, u16 len);
698extern int iwl_hw_txq_free_tfd(struct iwl_priv *priv, struct iwl_tx_queue *txq);
699extern int iwl_hw_get_temperature(struct iwl_priv *priv);
700extern int iwl_hw_tx_queue_init(struct iwl_priv *priv,
701 struct iwl_tx_queue *txq);
702extern unsigned int iwl_hw_get_beacon_cmd(struct iwl_priv *priv,
703 struct iwl_frame *frame, u8 rate);
704extern int iwl_hw_get_rx_read(struct iwl_priv *priv);
705extern void iwl_hw_build_tx_cmd_rate(struct iwl_priv *priv,
706 struct iwl_cmd *cmd,
707 struct ieee80211_tx_control *ctrl,
708 struct ieee80211_hdr *hdr,
709 int sta_id, int tx_id);
710extern int iwl_hw_reg_send_txpower(struct iwl_priv *priv);
711extern int iwl_hw_reg_set_txpower(struct iwl_priv *priv, s8 power);
712extern void iwl_hw_rx_statistics(struct iwl_priv *priv,
713 struct iwl_rx_mem_buffer *rxb);
714extern void iwl_disable_events(struct iwl_priv *priv);
715extern int iwl4965_get_temperature(const struct iwl_priv *priv);
716
717/**
718 * iwl_hw_find_station - Find station id for a given BSSID
719 * @bssid: MAC address of station ID to find
720 *
721 * NOTE: This should not be hardware specific but the code has
722 * not yet been merged into a single common layer for managing the
723 * station tables.
724 */
725extern u8 iwl_hw_find_station(struct iwl_priv *priv, const u8 *bssid);
726
727extern int iwl_hw_channel_switch(struct iwl_priv *priv, u16 channel);
728extern int iwl_tx_queue_reclaim(struct iwl_priv *priv, int txq_id, int index);
729
29struct iwl_priv; 730struct iwl_priv;
30struct sta_ht_info; 731struct sta_ht_info;
31 732
@@ -338,4 +1039,322 @@ struct iwl_chain_noise_data {
338#define EEPROM_SEM_TIMEOUT 10 1039#define EEPROM_SEM_TIMEOUT 10
339#define EEPROM_SEM_RETRY_LIMIT 1000 1040#define EEPROM_SEM_RETRY_LIMIT 1000
340 1041
1042
1043#ifdef CONFIG_IWLWIFI_SPECTRUM_MEASUREMENT
1044
1045enum {
1046 MEASUREMENT_READY = (1 << 0),
1047 MEASUREMENT_ACTIVE = (1 << 1),
1048};
1049
1050#endif
1051
1052struct iwl_priv {
1053
1054 /* ieee device used by generic ieee processing code */
1055 struct ieee80211_hw *hw;
1056 struct ieee80211_channel *ieee_channels;
1057 struct ieee80211_rate *ieee_rates;
1058
1059 /* temporary frame storage list */
1060 struct list_head free_frames;
1061 int frames_count;
1062
1063 u8 phymode;
1064 int alloc_rxb_skb;
1065
1066 void (*rx_handlers[REPLY_MAX])(struct iwl_priv *priv,
1067 struct iwl_rx_mem_buffer *rxb);
1068
1069 const struct ieee80211_hw_mode *modes;
1070
1071#ifdef CONFIG_IWLWIFI_SPECTRUM_MEASUREMENT
1072 /* spectrum measurement report caching */
1073 struct iwl_spectrum_notification measure_report;
1074 u8 measurement_status;
1075#endif
1076 /* ucode beacon time */
1077 u32 ucode_beacon_time;
1078
1079 /* we allocate array of iwl_channel_info for NIC's valid channels.
1080 * Access via channel # using indirect index array */
1081 struct iwl_channel_info *channel_info; /* channel info array */
1082 u8 channel_count; /* # of channels */
1083
1084 /* each calibration channel group in the EEPROM has a derived
1085 * clip setting for each rate. */
1086 const struct iwl_clip_group clip_groups[5];
1087
1088 /* thermal calibration */
1089 s32 temperature; /* degrees Kelvin */
1090 s32 last_temperature;
1091
1092 /* Scan related variables */
1093 unsigned long last_scan_jiffies;
1094 unsigned long scan_start;
1095 unsigned long scan_pass_start;
1096 unsigned long scan_start_tsf;
1097 int scan_bands;
1098 int one_direct_scan;
1099 u8 direct_ssid_len;
1100 u8 direct_ssid[IW_ESSID_MAX_SIZE];
1101 struct iwl_scan_cmd *scan;
1102 u8 only_active_channel;
1103
1104 /* spinlock */
1105 spinlock_t lock; /* protect general shared data */
1106 spinlock_t hcmd_lock; /* protect hcmd */
1107 struct mutex mutex;
1108
1109 /* basic pci-network driver stuff */
1110 struct pci_dev *pci_dev;
1111
1112 /* pci hardware address support */
1113 void __iomem *hw_base;
1114
1115 /* uCode images, save to reload in case of failure */
1116 struct fw_desc ucode_code; /* runtime inst */
1117 struct fw_desc ucode_data; /* runtime data original */
1118 struct fw_desc ucode_data_backup; /* runtime data save/restore */
1119 struct fw_desc ucode_init; /* initialization inst */
1120 struct fw_desc ucode_init_data; /* initialization data */
1121 struct fw_desc ucode_boot; /* bootstrap inst */
1122
1123
1124 struct iwl_rxon_time_cmd rxon_timing;
1125
1126 /* We declare this const so it can only be
1127 * changed via explicit cast within the
1128 * routines that actually update the physical
1129 * hardware */
1130 const struct iwl_rxon_cmd active_rxon;
1131 struct iwl_rxon_cmd staging_rxon;
1132
1133 int error_recovering;
1134 struct iwl_rxon_cmd recovery_rxon;
1135
1136 /* 1st responses from initialize and runtime uCode images.
1137 * 4965's initialize alive response contains some calibration data. */
1138 struct iwl_init_alive_resp card_alive_init;
1139 struct iwl_alive_resp card_alive;
1140
1141#ifdef LED
1142 /* LED related variables */
1143 struct iwl_activity_blink activity;
1144 unsigned long led_packets;
1145 int led_state;
1146#endif
1147
1148 u16 active_rate;
1149 u16 active_rate_basic;
1150
1151 u8 call_post_assoc_from_beacon;
1152 u8 assoc_station_added;
1153 u8 use_ant_b_for_management_frame; /* Tx antenna selection */
1154 /* HT variables */
1155 u8 is_dup;
1156 u8 is_ht_enabled;
1157 u8 channel_width; /* 0=20MHZ, 1=40MHZ */
1158 u8 current_channel_width;
1159 u8 valid_antenna; /* Bit mask of antennas actually connected */
1160#ifdef CONFIG_IWLWIFI_SENSITIVITY
1161 struct iwl_sensitivity_data sensitivity_data;
1162 struct iwl_chain_noise_data chain_noise_data;
1163 u8 start_calib;
1164 __le16 sensitivity_tbl[HD_TABLE_SIZE];
1165#endif /*CONFIG_IWLWIFI_SENSITIVITY*/
1166
1167#ifdef CONFIG_IWLWIFI_HT
1168 struct sta_ht_info current_assoc_ht;
1169#endif
1170 u8 active_rate_ht[2];
1171 u8 last_phy_res[100];
1172
1173 /* Rate scaling data */
1174 struct iwl_lq_mngr lq_mngr;
1175
1176 /* Rate scaling data */
1177 s8 data_retry_limit;
1178 u8 retry_rate;
1179
1180 wait_queue_head_t wait_command_queue;
1181
1182 int activity_timer_active;
1183
1184 /* Rx and Tx DMA processing queues */
1185 struct iwl_rx_queue rxq;
1186 struct iwl_tx_queue txq[IWL_MAX_NUM_QUEUES];
1187 unsigned long txq_ctx_active_msk;
1188 struct iwl_kw kw; /* keep warm address */
1189 u32 scd_base_addr; /* scheduler sram base address */
1190
1191 unsigned long status;
1192 u32 config;
1193
1194 int last_rx_rssi; /* From Rx packet statisitics */
1195 int last_rx_noise; /* From beacon statistics */
1196
1197 struct iwl_power_mgr power_data;
1198
1199 struct iwl_notif_statistics statistics;
1200 unsigned long last_statistics_time;
1201
1202 /* context information */
1203 u8 essid[IW_ESSID_MAX_SIZE];
1204 u8 essid_len;
1205 u16 rates_mask;
1206
1207 u32 power_mode;
1208 u32 antenna;
1209 u8 bssid[ETH_ALEN];
1210 u16 rts_threshold;
1211 u8 mac_addr[ETH_ALEN];
1212
1213 /*station table variables */
1214 spinlock_t sta_lock;
1215 int num_stations;
1216 struct iwl_station_entry stations[IWL_STATION_COUNT];
1217
1218 /* Indication if ieee80211_ops->open has been called */
1219 int is_open;
1220
1221 u8 mac80211_registered;
1222 int is_abg;
1223
1224 u32 notif_missed_beacons;
1225
1226 /* Rx'd packet timing information */
1227 u32 last_beacon_time;
1228 u64 last_tsf;
1229
1230 /* Duplicate packet detection */
1231 u16 last_seq_num;
1232 u16 last_frag_num;
1233 unsigned long last_packet_time;
1234 struct list_head ibss_mac_hash[IWL_IBSS_MAC_HASH_SIZE];
1235
1236 /* eeprom */
1237 struct iwl_eeprom eeprom;
1238
1239 int iw_mode;
1240
1241 struct sk_buff *ibss_beacon;
1242
1243 /* Last Rx'd beacon timestamp */
1244 u32 timestamp0;
1245 u32 timestamp1;
1246 u16 beacon_int;
1247 struct iwl_driver_hw_info hw_setting;
1248 int interface_id;
1249
1250 /* Current association information needed to configure the
1251 * hardware */
1252 u16 assoc_id;
1253 u16 assoc_capability;
1254 u8 ps_mode;
1255
1256#ifdef CONFIG_IWLWIFI_QOS
1257 struct iwl_qos_info qos_data;
1258#endif /*CONFIG_IWLWIFI_QOS */
1259
1260 struct workqueue_struct *workqueue;
1261
1262 struct work_struct up;
1263 struct work_struct restart;
1264 struct work_struct calibrated_work;
1265 struct work_struct scan_completed;
1266 struct work_struct rx_replenish;
1267 struct work_struct rf_kill;
1268 struct work_struct abort_scan;
1269 struct work_struct update_link_led;
1270 struct work_struct auth_work;
1271 struct work_struct report_work;
1272 struct work_struct request_scan;
1273 struct work_struct beacon_update;
1274
1275 struct tasklet_struct irq_tasklet;
1276
1277 struct delayed_work init_alive_start;
1278 struct delayed_work alive_start;
1279 struct delayed_work activity_timer;
1280 struct delayed_work thermal_periodic;
1281 struct delayed_work gather_stats;
1282 struct delayed_work scan_check;
1283 struct delayed_work post_associate;
1284
1285#define IWL_DEFAULT_TX_POWER 0x0F
1286 s8 user_txpower_limit;
1287 s8 max_channel_txpower_limit;
1288
1289#ifdef CONFIG_PM
1290 u32 pm_state[16];
1291#endif
1292
1293#ifdef CONFIG_IWLWIFI_DEBUG
1294 /* debugging info */
1295 u32 framecnt_to_us;
1296 atomic_t restrict_refcnt;
1297#endif
1298
1299 struct work_struct txpower_work;
1300#ifdef CONFIG_IWLWIFI_SENSITIVITY
1301 struct work_struct sensitivity_work;
1302#endif
1303 struct work_struct statistics_work;
1304 struct timer_list statistics_periodic;
1305
1306#ifdef CONFIG_IWLWIFI_HT_AGG
1307 struct work_struct agg_work;
1308#endif
1309}; /*iwl_priv */
1310
1311static inline int iwl_is_associated(struct iwl_priv *priv)
1312{
1313 return (priv->active_rxon.filter_flags & RXON_FILTER_ASSOC_MSK) ? 1 : 0;
1314}
1315
1316static inline int is_channel_valid(const struct iwl_channel_info *ch_info)
1317{
1318 if (ch_info == NULL)
1319 return 0;
1320 return (ch_info->flags & EEPROM_CHANNEL_VALID) ? 1 : 0;
1321}
1322
1323static inline int is_channel_narrow(const struct iwl_channel_info *ch_info)
1324{
1325 return (ch_info->flags & EEPROM_CHANNEL_NARROW) ? 1 : 0;
1326}
1327
1328static inline int is_channel_radar(const struct iwl_channel_info *ch_info)
1329{
1330 return (ch_info->flags & EEPROM_CHANNEL_RADAR) ? 1 : 0;
1331}
1332
1333static inline u8 is_channel_a_band(const struct iwl_channel_info *ch_info)
1334{
1335 return ch_info->phymode == MODE_IEEE80211A;
1336}
1337
1338static inline u8 is_channel_bg_band(const struct iwl_channel_info *ch_info)
1339{
1340 return ((ch_info->phymode == MODE_IEEE80211B) ||
1341 (ch_info->phymode == MODE_IEEE80211G));
1342}
1343
1344static inline int is_channel_passive(const struct iwl_channel_info *ch)
1345{
1346 return (!(ch->flags & EEPROM_CHANNEL_ACTIVE)) ? 1 : 0;
1347}
1348
1349static inline int is_channel_ibss(const struct iwl_channel_info *ch)
1350{
1351 return ((ch->flags & EEPROM_CHANNEL_IBSS)) ? 1 : 0;
1352}
1353
1354extern const struct iwl_channel_info *iwl_get_channel_info(
1355 const struct iwl_priv *priv, int phymode, u16 channel);
1356
1357/* Requires full declaration of iwl_priv before including */
1358#include "iwl-4965-io.h"
1359
341#endif /* __iwl_4965_h__ */ 1360#endif /* __iwl_4965_h__ */