~ubuntu-branches/ubuntu/hardy/linux-backports-modules-2.6.24/hardy-security

« back to all changes in this revision

Viewing changes to updates/wireless/iwlwifi/iwlwifi/origin/iwl-3945.h

  • Committer: Bazaar Package Importer
  • Author(s): , Ben Collins
  • Date: 2008-04-02 06:59:04 UTC
  • Revision ID: james.westby@ubuntu.com-20080402065904-e5knh2gn2hms3xbb
Tags: 2.6.24-14.11
[Ben Collins]

* iwlwifi: Update to iwlwifi-1.2.25 and mac80211-10.0.4
  - LP: #200950
* ubuntu: Slight cleanups to module hiearchy and Makefiles
* mac80211: Enable LED triggers
* iwlwifi: Add LED trigger support (rx and tx only)
  - LP: #176090

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/******************************************************************************
 
2
 *
 
3
 * Copyright(c) 2003 - 2007 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-3945.h) for driver implementation definitions.
 
28
 * Please use iwl-3945-commands.h for uCode API definitions.
 
29
 * Please use iwl-3945-hw.h for hardware-related definitions.
 
30
 */
 
31
 
 
32
#ifndef __iwl_3945_h__
 
33
#define __iwl_3945_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
/* Hardware specific file defines the PCI IDs table for that hardware module */
 
40
extern struct pci_device_id iwl3945_hw_card_ids[];
 
41
 
 
42
#define DRV_NAME        "iwl3945"
 
43
#include "iwl-3945-hw.h"
 
44
#include "iwl-prph.h"
 
45
#include "iwl-3945-debug.h"
 
46
 
 
47
/* Default noise level to report when noise measurement is not available.
 
48
 *   This may be because we're:
 
49
 *   1)  Not associated (4965, no beacon statistics being sent to driver)
 
50
 *   2)  Scanning (noise measurement does not apply to associated channel)
 
51
 *   3)  Receiving CCK (3945 delivers noise info only for OFDM frames)
 
52
 * Use default noise value of -127 ... this is below the range of measurable
 
53
 *   Rx dBm for either 3945 or 4965, so it can indicate "unmeasurable" to user.
 
54
 *   Also, -127 works better than 0 when averaging frames with/without
 
55
 *   noise info (e.g. averaging might be done in app); measured dBm values are
 
56
 *   always negative ... using a negative value as the default keeps all
 
57
 *   averages within an s8's (used in some apps) range of negative values. */
 
58
#define IWL_NOISE_MEAS_NOT_AVAILABLE (-127)
 
59
 
 
60
/* Module parameters accessible from iwl-*.c */
 
61
extern int iwl3945_param_hwcrypto;
 
62
extern int iwl3945_param_queues_num;
 
63
 
 
64
enum iwl3945_antenna {
 
65
        IWL_ANTENNA_DIVERSITY,
 
66
        IWL_ANTENNA_MAIN,
 
67
        IWL_ANTENNA_AUX
 
68
};
 
69
 
 
70
/*
 
71
 * RTS threshold here is total size [2347] minus 4 FCS bytes
 
72
 * Per spec:
 
73
 *   a value of 0 means RTS on all data/management packets
 
74
 *   a value > max MSDU size means no RTS
 
75
 * else RTS for data/management frames where MPDU is larger
 
76
 *   than RTS value.
 
77
 */
 
78
#define DEFAULT_RTS_THRESHOLD     2347U
 
79
#define MIN_RTS_THRESHOLD         0U
 
80
#define MAX_RTS_THRESHOLD         2347U
 
81
#define MAX_MSDU_SIZE             2304U
 
82
#define MAX_MPDU_SIZE             2346U
 
83
#define DEFAULT_BEACON_INTERVAL   100U
 
84
#define DEFAULT_SHORT_RETRY_LIMIT 7U
 
85
#define DEFAULT_LONG_RETRY_LIMIT  4U
 
86
 
 
87
struct iwl3945_rx_mem_buffer {
 
88
        dma_addr_t dma_addr;
 
89
        struct sk_buff *skb;
 
90
        struct list_head list;
 
91
};
 
92
 
 
93
struct iwl3945_rt_rx_hdr {
 
94
        struct ieee80211_radiotap_header rt_hdr;
 
95
        __le64 rt_tsf;          /* TSF */
 
96
        u8 rt_flags;            /* radiotap packet flags */
 
97
        u8 rt_rate;             /* rate in 500kb/s */
 
98
        __le16 rt_channelMHz;   /* channel in MHz */
 
99
        __le16 rt_chbitmask;    /* channel bitfield */
 
100
        s8 rt_dbmsignal;        /* signal in dBm, kluged to signed */
 
101
        s8 rt_dbmnoise;
 
102
        u8 rt_antenna;          /* antenna number */
 
103
        u8 payload[0];          /* payload... */
 
104
} __attribute__ ((packed));
 
105
 
 
106
struct iwl3945_rt_tx_hdr {
 
107
        struct ieee80211_radiotap_header rt_hdr;
 
108
        u8 rt_rate;             /* rate in 500kb/s */
 
109
        __le16 rt_channel;      /* channel in mHz */
 
110
        __le16 rt_chbitmask;    /* channel bitfield */
 
111
        s8 rt_dbmsignal;        /* signal in dBm, kluged to signed */
 
112
        u8 rt_antenna;          /* antenna number */
 
113
        u8 payload[0];          /* payload... */
 
114
} __attribute__ ((packed));
 
115
 
 
116
/*
 
117
 * Generic queue structure
 
118
 *
 
119
 * Contains common data for Rx and Tx queues
 
120
 */
 
121
struct iwl3945_queue {
 
122
        int n_bd;              /* number of BDs in this queue */
 
123
        int write_ptr;       /* 1-st empty entry (index) host_w*/
 
124
        int read_ptr;         /* last used entry (index) host_r*/
 
125
        dma_addr_t dma_addr;   /* physical addr for BD's */
 
126
        int n_window;          /* safe queue window */
 
127
        u32 id;
 
128
        int low_mark;          /* low watermark, resume queue if free
 
129
                                * space more than this */
 
130
        int high_mark;         /* high watermark, stop queue if free
 
131
                                * space less than this */
 
132
} __attribute__ ((packed));
 
133
 
 
134
#define MAX_NUM_OF_TBS          (20)
 
135
 
 
136
/* One for each TFD */
 
137
struct iwl3945_tx_info {
 
138
        struct iwlwifi_ieee80211_tx_status status;
 
139
        struct sk_buff *skb[MAX_NUM_OF_TBS];
 
140
};
 
141
 
 
142
/**
 
143
 * struct iwl3945_tx_queue - Tx Queue for DMA
 
144
 * @q: generic Rx/Tx queue descriptor
 
145
 * @bd: base of circular buffer of TFDs
 
146
 * @cmd: array of command/Tx buffers
 
147
 * @dma_addr_cmd: physical address of cmd/tx buffer array
 
148
 * @txb: array of per-TFD driver data
 
149
 * @need_update: indicates need to update read/write index
 
150
 *
 
151
 * A Tx queue consists of circular buffer of BDs (a.k.a. TFDs, transmit frame
 
152
 * descriptors) and required locking structures.
 
153
 */
 
154
struct iwl3945_tx_queue {
 
155
        struct iwl3945_queue q;
 
156
        struct iwl3945_tfd_frame *bd;
 
157
        struct iwl3945_cmd *cmd;
 
158
        dma_addr_t dma_addr_cmd;
 
159
        struct iwl3945_tx_info *txb;
 
160
        int need_update;
 
161
        int active;
 
162
};
 
163
 
 
164
#define IWL_NUM_SCAN_RATES         (2)
 
165
 
 
166
struct iwl3945_channel_tgd_info {
 
167
        u8 type;
 
168
        s8 max_power;
 
169
};
 
170
 
 
171
struct iwl3945_channel_tgh_info {
 
172
        s64 last_radar_time;
 
173
};
 
174
 
 
175
/* current Tx power values to use, one for each rate for each channel.
 
176
 * requested power is limited by:
 
177
 * -- regulatory EEPROM limits for this channel
 
178
 * -- hardware capabilities (clip-powers)
 
179
 * -- spectrum management
 
180
 * -- user preference (e.g. iwconfig)
 
181
 * when requested power is set, base power index must also be set. */
 
182
struct iwl3945_channel_power_info {
 
183
        struct iwl3945_tx_power tpc;    /* actual radio and DSP gain settings */
 
184
        s8 power_table_index;   /* actual (compenst'd) index into gain table */
 
185
        s8 base_power_index;    /* gain index for power at factory temp. */
 
186
        s8 requested_power;     /* power (dBm) requested for this chnl/rate */
 
187
};
 
188
 
 
189
/* current scan Tx power values to use, one for each scan rate for each
 
190
 * channel. */
 
191
struct iwl3945_scan_power_info {
 
192
        struct iwl3945_tx_power tpc;    /* actual radio and DSP gain settings */
 
193
        s8 power_table_index;   /* actual (compenst'd) index into gain table */
 
194
        s8 requested_power;     /* scan pwr (dBm) requested for chnl/rate */
 
195
};
 
196
 
 
197
/*
 
198
 * One for each channel, holds all channel setup data
 
199
 * Some of the fields (e.g. eeprom and flags/max_power_avg) are redundant
 
200
 *     with one another!
 
201
 */
 
202
#define IWL4965_MAX_RATE (33)
 
203
 
 
204
struct iwl3945_channel_info {
 
205
        struct iwl3945_channel_tgd_info tgd;
 
206
        struct iwl3945_channel_tgh_info tgh;
 
207
        struct iwl3945_eeprom_channel eeprom;   /* EEPROM regulatory limit */
 
208
        struct iwl3945_eeprom_channel fat_eeprom;       /* EEPROM regulatory limit for
 
209
                                                 * FAT channel */
 
210
 
 
211
        u8 channel;       /* channel number */
 
212
        u8 flags;         /* flags copied from EEPROM */
 
213
        s8 max_power_avg; /* (dBm) regul. eeprom, normal Tx, any rate */
 
214
        s8 curr_txpow;    /* (dBm) regulatory/spectrum/user (not h/w) */
 
215
        s8 min_power;     /* always 0 */
 
216
        s8 scan_power;    /* (dBm) regul. eeprom, direct scans, any rate */
 
217
 
 
218
        u8 group_index;   /* 0-4, maps channel to group1/2/3/4/5 */
 
219
        u8 band_index;    /* 0-4, maps channel to band1/2/3/4/5 */
 
220
        u8 phymode;       /* MODE_IEEE80211{A,B,G} */
 
221
 
 
222
        /* Radio/DSP gain settings for each "normal" data Tx rate.
 
223
         * These include, in addition to RF and DSP gain, a few fields for
 
224
         *   remembering/modifying gain settings (indexes). */
 
225
        struct iwl3945_channel_power_info power_info[IWL4965_MAX_RATE];
 
226
 
 
227
        /* Radio/DSP gain settings for each scan rate, for directed scans. */
 
228
        struct iwl3945_scan_power_info scan_pwr_info[IWL_NUM_SCAN_RATES];
 
229
};
 
230
 
 
231
struct iwl3945_clip_group {
 
232
        /* maximum power level to prevent clipping for each rate, derived by
 
233
         *   us from this band's saturation power in EEPROM */
 
234
        const s8 clip_powers[IWL_MAX_RATES];
 
235
};
 
236
 
 
237
#include "iwl-3945-rs.h"
 
238
 
 
239
#define IWL_TX_FIFO_AC0 0
 
240
#define IWL_TX_FIFO_AC1 1
 
241
#define IWL_TX_FIFO_AC2 2
 
242
#define IWL_TX_FIFO_AC3 3
 
243
#define IWL_TX_FIFO_HCCA_1      5
 
244
#define IWL_TX_FIFO_HCCA_2      6
 
245
#define IWL_TX_FIFO_NONE        7
 
246
 
 
247
/* Minimum number of queues. MAX_NUM is defined in hw specific files */
 
248
#define IWL_MIN_NUM_QUEUES      4
 
249
 
 
250
/* Power management (not Tx power) structures */
 
251
 
 
252
struct iwl3945_power_vec_entry {
 
253
        struct iwl3945_powertable_cmd cmd;
 
254
        u8 no_dtim;
 
255
};
 
256
#define IWL_POWER_RANGE_0  (0)
 
257
#define IWL_POWER_RANGE_1  (1)
 
258
 
 
259
#define IWL_POWER_MODE_CAM      0x00    /* Continuously Aware Mode, always on */
 
260
#define IWL_POWER_INDEX_3       0x03
 
261
#define IWL_POWER_INDEX_5       0x05
 
262
#define IWL_POWER_AC            0x06
 
263
#define IWL_POWER_BATTERY       0x07
 
264
#define IWL_POWER_LIMIT         0x07
 
265
#define IWL_POWER_MASK          0x0F
 
266
#define IWL_POWER_ENABLED       0x10
 
267
#define IWL_POWER_LEVEL(x)      ((x) & IWL_POWER_MASK)
 
268
 
 
269
struct iwl3945_power_mgr {
 
270
        spinlock_t lock;
 
271
        struct iwl3945_power_vec_entry pwr_range_0[IWL_POWER_AC];
 
272
        struct iwl3945_power_vec_entry pwr_range_1[IWL_POWER_AC];
 
273
        u8 active_index;
 
274
        u32 dtim_val;
 
275
};
 
276
 
 
277
#define IEEE80211_DATA_LEN              2304
 
278
#define IEEE80211_4ADDR_LEN             30
 
279
#define IEEE80211_HLEN                  (IEEE80211_4ADDR_LEN)
 
280
#define IEEE80211_FRAME_LEN             (IEEE80211_DATA_LEN + IEEE80211_HLEN)
 
281
 
 
282
struct iwl3945_frame {
 
283
        union {
 
284
                struct ieee80211_hdr frame;
 
285
                struct iwl3945_tx_beacon_cmd beacon;
 
286
                u8 raw[IEEE80211_FRAME_LEN];
 
287
                u8 cmd[360];
 
288
        } u;
 
289
        struct list_head list;
 
290
};
 
291
 
 
292
#define SEQ_TO_QUEUE(x)  ((x >> 8) & 0xbf)
 
293
#define QUEUE_TO_SEQ(x)  ((x & 0xbf) << 8)
 
294
#define SEQ_TO_INDEX(x) (x & 0xff)
 
295
#define INDEX_TO_SEQ(x) (x & 0xff)
 
296
#define SEQ_HUGE_FRAME  (0x4000)
 
297
#define SEQ_RX_FRAME    __constant_cpu_to_le16(0x8000)
 
298
#define SEQ_TO_SN(seq) (((seq) & IEEE80211_SCTL_SEQ) >> 4)
 
299
#define SN_TO_SEQ(ssn) (((ssn) << 4) & IEEE80211_SCTL_SEQ)
 
300
#define MAX_SN ((IEEE80211_SCTL_SEQ) >> 4)
 
301
 
 
302
enum {
 
303
        /* CMD_SIZE_NORMAL = 0, */
 
304
        CMD_SIZE_HUGE = (1 << 0),
 
305
        /* CMD_SYNC = 0, */
 
306
        CMD_ASYNC = (1 << 1),
 
307
        /* CMD_NO_SKB = 0, */
 
308
        CMD_WANT_SKB = (1 << 2),
 
309
};
 
310
 
 
311
struct iwl3945_cmd;
 
312
struct iwl3945_priv;
 
313
 
 
314
struct iwl3945_cmd_meta {
 
315
        struct iwl3945_cmd_meta *source;
 
316
        union {
 
317
                struct sk_buff *skb;
 
318
                int (*callback)(struct iwl3945_priv *priv,
 
319
                                struct iwl3945_cmd *cmd, struct sk_buff *skb);
 
320
        } __attribute__ ((packed)) u;
 
321
 
 
322
        /* The CMD_SIZE_HUGE flag bit indicates that the command
 
323
         * structure is stored at the end of the shared queue memory. */
 
324
        u32 flags;
 
325
 
 
326
} __attribute__ ((packed));
 
327
 
 
328
/**
 
329
 * struct iwl3945_cmd
 
330
 *
 
331
 * For allocation of the command and tx queues, this establishes the overall
 
332
 * size of the largest command we send to uCode, except for a scan command
 
333
 * (which is relatively huge; space is allocated separately).
 
334
 */
 
335
struct iwl3945_cmd {
 
336
        struct iwl3945_cmd_meta meta;
 
337
        struct iwl3945_cmd_header hdr;
 
338
        union {
 
339
                struct iwl3945_addsta_cmd addsta;
 
340
                struct iwl3945_led_cmd led;
 
341
                u32 flags;
 
342
                u8 val8;
 
343
                u16 val16;
 
344
                u32 val32;
 
345
                struct iwl3945_bt_cmd bt;
 
346
                struct iwl3945_rxon_time_cmd rxon_time;
 
347
                struct iwl3945_powertable_cmd powertable;
 
348
                struct iwl3945_qosparam_cmd qosparam;
 
349
                struct iwl3945_tx_cmd tx;
 
350
                struct iwl3945_tx_beacon_cmd tx_beacon;
 
351
                struct iwl3945_rxon_assoc_cmd rxon_assoc;
 
352
                u8 *indirect;
 
353
                u8 payload[360];
 
354
        } __attribute__ ((packed)) cmd;
 
355
} __attribute__ ((packed));
 
356
 
 
357
struct iwl3945_host_cmd {
 
358
        u8 id;
 
359
        u16 len;
 
360
        struct iwl3945_cmd_meta meta;
 
361
        const void *data;
 
362
};
 
363
 
 
364
#define TFD_MAX_PAYLOAD_SIZE (sizeof(struct iwl3945_cmd) - \
 
365
                              sizeof(struct iwl3945_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 iwl3945_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 iwl3945_rx_mem_buffers
 
388
 */
 
389
struct iwl3945_rx_queue {
 
390
        __le32 *bd;
 
391
        dma_addr_t dma_addr;
 
392
        struct iwl3945_rx_mem_buffer pool[RX_QUEUE_SIZE + RX_FREE_BUFFERS];
 
393
        struct iwl3945_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
#define STATUS_CONF_PENDING     17
 
432
 
 
433
#define MAX_TID_COUNT        9
 
434
 
 
435
#define IWL_INVALID_RATE     0xFF
 
436
#define IWL_INVALID_VALUE    -1
 
437
 
 
438
struct iwl3945_tid_data {
 
439
        u16 seq_number;
 
440
};
 
441
 
 
442
struct iwl3945_hw_key {
 
443
        ieee80211_key_alg alg;
 
444
        int keylen;
 
445
        u8 key[32];
 
446
};
 
447
 
 
448
union iwl3945_ht_rate_supp {
 
449
        u16 rates;
 
450
        struct {
 
451
                u8 siso_rate;
 
452
                u8 mimo_rate;
 
453
        };
 
454
};
 
455
 
 
456
#ifdef CONFIG_IWL3945_QOS
 
457
 
 
458
union iwl3945_qos_capabity {
 
459
        struct {
 
460
                u8 edca_count:4;        /* bit 0-3 */
 
461
                u8 q_ack:1;             /* bit 4 */
 
462
                u8 queue_request:1;     /* bit 5 */
 
463
                u8 txop_request:1;      /* bit 6 */
 
464
                u8 reserved:1;          /* bit 7 */
 
465
        } q_AP;
 
466
        struct {
 
467
                u8 acvo_APSD:1;         /* bit 0 */
 
468
                u8 acvi_APSD:1;         /* bit 1 */
 
469
                u8 ac_bk_APSD:1;        /* bit 2 */
 
470
                u8 ac_be_APSD:1;        /* bit 3 */
 
471
                u8 q_ack:1;             /* bit 4 */
 
472
                u8 max_len:2;           /* bit 5-6 */
 
473
                u8 more_data_ack:1;     /* bit 7 */
 
474
        } q_STA;
 
475
        u8 val;
 
476
};
 
477
 
 
478
/* QoS structures */
 
479
struct iwl3945_qos_info {
 
480
        int qos_enable;
 
481
        int qos_active;
 
482
        union iwl3945_qos_capabity qos_cap;
 
483
        struct iwl3945_qosparam_cmd def_qos_parm;
 
484
};
 
485
#endif /*CONFIG_IWL3945_QOS */
 
486
 
 
487
#define STA_PS_STATUS_WAKE             0
 
488
#define STA_PS_STATUS_SLEEP            1
 
489
 
 
490
struct iwl3945_station_entry {
 
491
        struct iwl3945_addsta_cmd sta;
 
492
        struct iwl3945_tid_data tid[MAX_TID_COUNT];
 
493
        union {
 
494
                struct {
 
495
                        u8 rate;
 
496
                        u8 flags;
 
497
                } s;
 
498
                u16 rate_n_flags;
 
499
        } current_rate;
 
500
        u8 used;
 
501
        u8 ps_status;
 
502
        struct iwl3945_hw_key keyinfo;
 
503
};
 
504
 
 
505
/* one for each uCode image (inst/data, boot/init/runtime) */
 
506
struct fw_desc {
 
507
        void *v_addr;           /* access by driver */
 
508
        dma_addr_t p_addr;      /* access by card's busmaster DMA */
 
509
        u32 len;                /* bytes */
 
510
};
 
511
 
 
512
/* uCode file layout */
 
513
struct iwl3945_ucode {
 
514
        __le32 ver;             /* major/minor/subminor */
 
515
        __le32 inst_size;       /* bytes of runtime instructions */
 
516
        __le32 data_size;       /* bytes of runtime data */
 
517
        __le32 init_size;       /* bytes of initialization instructions */
 
518
        __le32 init_data_size;  /* bytes of initialization data */
 
519
        __le32 boot_size;       /* bytes of bootstrap instructions */
 
520
        u8 data[0];             /* data in same order as "size" elements */
 
521
};
 
522
 
 
523
#define IWL_IBSS_MAC_HASH_SIZE 32
 
524
 
 
525
struct iwl3945_ibss_seq {
 
526
        u8 mac[ETH_ALEN];
 
527
        u16 seq_num;
 
528
        u16 frag_num;
 
529
        unsigned long packet_time;
 
530
        struct list_head list;
 
531
};
 
532
 
 
533
/**
 
534
 * struct iwl4965_driver_hw_info
 
535
 * @max_txq_num: Max # Tx queues supported
 
536
 * @ac_queue_count: # Tx queues for EDCA Access Categories (AC)
 
537
 * @tx_cmd_len: Size of Tx command (but not including frame itself)
 
538
 * @max_rxq_size: Max # Rx frames in Rx queue (must be power-of-2)
 
539
 * @rx_buffer_size:
 
540
 * @max_rxq_log: Log-base-2 of max_rxq_size
 
541
 * @max_stations:
 
542
 * @bcast_sta_id:
 
543
 * @shared_virt: Pointer to driver/uCode shared Tx Byte Counts and Rx status
 
544
 * @shared_phys: Physical Pointer to Tx Byte Counts and Rx status
 
545
 */
 
546
struct iwl3945_driver_hw_info {
 
547
        u16 max_txq_num;
 
548
        u16 ac_queue_count;
 
549
        u16 tx_cmd_len;
 
550
        u16 max_rxq_size;
 
551
        u32 rx_buffer_size;
 
552
        u16 max_rxq_log;
 
553
        u8  max_stations;
 
554
        u8  bcast_sta_id;
 
555
        void *shared_virt;
 
556
        dma_addr_t shared_phys;
 
557
};
 
558
 
 
559
#define IWL_RX_HDR(x) ((struct iwl3945_rx_frame_hdr *)(\
 
560
                       x->u.rx_frame.stats.payload + \
 
561
                       x->u.rx_frame.stats.phy_count))
 
562
#define IWL_RX_END(x) ((struct iwl3945_rx_frame_end *)(\
 
563
                       IWL_RX_HDR(x)->payload + \
 
564
                       le16_to_cpu(IWL_RX_HDR(x)->len)))
 
565
#define IWL_RX_STATS(x) (&x->u.rx_frame.stats)
 
566
#define IWL_RX_DATA(x) (IWL_RX_HDR(x)->payload)
 
567
 
 
568
 
 
569
/******************************************************************************
 
570
 *
 
571
 * Functions implemented in iwl-base.c which are forward declared here
 
572
 * for use by iwl-*.c
 
573
 *
 
574
 *****************************************************************************/
 
575
struct iwl3945_addsta_cmd;
 
576
extern int iwl3945_send_add_station(struct iwl3945_priv *priv,
 
577
                                struct iwl3945_addsta_cmd *sta, u8 flags);
 
578
extern u8 iwl3945_add_station(struct iwl3945_priv *priv, const u8 *bssid,
 
579
                          int is_ap, u8 flags);
 
580
extern int iwl3945_is_network_packet(struct iwl3945_priv *priv,
 
581
                                 struct ieee80211_hdr *header);
 
582
extern int iwl3945_power_init_handle(struct iwl3945_priv *priv);
 
583
extern int iwl3945_eeprom_init(struct iwl3945_priv *priv);
 
584
#ifdef CONFIG_IWL3945_DEBUG
 
585
extern void iwl3945_report_frame(struct iwl3945_priv *priv,
 
586
                             struct iwl3945_rx_packet *pkt,
 
587
                             struct ieee80211_hdr *header, int group100);
 
588
#else
 
589
static inline void iwl3945_report_frame(struct iwl3945_priv *priv,
 
590
                                    struct iwl3945_rx_packet *pkt,
 
591
                                    struct ieee80211_hdr *header,
 
592
                                    int group100) {}
 
593
#endif
 
594
extern void iwl3945_handle_data_packet_monitor(struct iwl3945_priv *priv,
 
595
                                           struct iwl3945_rx_mem_buffer *rxb,
 
596
                                           void *data, short len,
 
597
                                           struct ieee80211_rx_status *stats,
 
598
                                           u16 phy_flags);
 
599
extern int iwl3945_is_duplicate_packet(struct iwl3945_priv *priv,
 
600
                                       struct ieee80211_hdr *header);
 
601
extern int iwl3945_rx_queue_alloc(struct iwl3945_priv *priv);
 
602
extern void iwl3945_rx_queue_reset(struct iwl3945_priv *priv,
 
603
                               struct iwl3945_rx_queue *rxq);
 
604
extern int iwl3945_calc_db_from_ratio(int sig_ratio);
 
605
extern int iwl3945_calc_sig_qual(int rssi_dbm, int noise_dbm);
 
606
extern int iwl3945_tx_queue_init(struct iwl3945_priv *priv,
 
607
                             struct iwl3945_tx_queue *txq, int count, u32 id);
 
608
extern void iwl3945_rx_replenish(void *data);
 
609
extern void iwl3945_tx_queue_free(struct iwl3945_priv *priv, struct iwl3945_tx_queue *txq);
 
610
extern int iwl3945_send_cmd_pdu(struct iwl3945_priv *priv, u8 id, u16 len,
 
611
                            const void *data);
 
612
extern int __must_check iwl3945_send_cmd(struct iwl3945_priv *priv,
 
613
                struct iwl3945_host_cmd *cmd);
 
614
extern unsigned int iwl3945_fill_beacon_frame(struct iwl3945_priv *priv,
 
615
                                        struct ieee80211_hdr *hdr,
 
616
                                        const u8 *dest, int left);
 
617
extern int iwl3945_rx_queue_update_write_ptr(struct iwl3945_priv *priv,
 
618
                                         struct iwl3945_rx_queue *q);
 
619
extern int iwl3945_send_statistics_request(struct iwl3945_priv *priv);
 
620
extern void iwl3945_set_decrypted_flag(struct iwl3945_priv *priv, struct sk_buff *skb,
 
621
                                   u32 decrypt_res,
 
622
                                   struct ieee80211_rx_status *stats);
 
623
extern const u8 iwl3945_broadcast_addr[ETH_ALEN];
 
624
 
 
625
/*
 
626
 * Currently used by iwl-3945-rs... look at restructuring so that it doesn't
 
627
 * call this... todo... fix that.
 
628
*/
 
629
extern u8 iwl3945_sync_station(struct iwl3945_priv *priv, int sta_id,
 
630
                           u16 tx_rate, u8 flags);
 
631
 
 
632
/******************************************************************************
 
633
 *
 
634
 * Functions implemented in iwl-[34]*.c which are forward declared here
 
635
 * for use by iwl-base.c
 
636
 *
 
637
 * NOTE:  The implementation of these functions are hardware specific
 
638
 * which is why they are in the hardware specific files (vs. iwl-base.c)
 
639
 *
 
640
 * Naming convention --
 
641
 * iwl3945_         <-- Its part of iwlwifi (should be changed to iwl3945_)
 
642
 * iwl3945_hw_      <-- Hardware specific (implemented in iwl-XXXX.c by all HW)
 
643
 * iwlXXXX_     <-- Hardware specific (implemented in iwl-XXXX.c for XXXX)
 
644
 * iwl3945_bg_      <-- Called from work queue context
 
645
 * iwl3945_mac_     <-- mac80211 callback
 
646
 *
 
647
 ****************************************************************************/
 
648
extern void iwl3945_hw_rx_handler_setup(struct iwl3945_priv *priv);
 
649
extern void iwl3945_hw_setup_deferred_work(struct iwl3945_priv *priv);
 
650
extern void iwl3945_hw_cancel_deferred_work(struct iwl3945_priv *priv);
 
651
extern int iwl3945_hw_rxq_stop(struct iwl3945_priv *priv);
 
652
extern int iwl3945_hw_set_hw_setting(struct iwl3945_priv *priv);
 
653
extern int iwl3945_hw_nic_init(struct iwl3945_priv *priv);
 
654
extern int iwl3945_hw_nic_stop_master(struct iwl3945_priv *priv);
 
655
extern void iwl3945_hw_txq_ctx_free(struct iwl3945_priv *priv);
 
656
extern void iwl3945_hw_txq_ctx_stop(struct iwl3945_priv *priv);
 
657
extern int iwl3945_hw_nic_reset(struct iwl3945_priv *priv);
 
658
extern int iwl3945_hw_txq_attach_buf_to_tfd(struct iwl3945_priv *priv, void *tfd,
 
659
                                        dma_addr_t addr, u16 len);
 
660
extern int iwl3945_hw_txq_free_tfd(struct iwl3945_priv *priv, struct iwl3945_tx_queue *txq);
 
661
extern int iwl3945_hw_get_temperature(struct iwl3945_priv *priv);
 
662
extern int iwl3945_hw_tx_queue_init(struct iwl3945_priv *priv,
 
663
                                struct iwl3945_tx_queue *txq);
 
664
extern unsigned int iwl3945_hw_get_beacon_cmd(struct iwl3945_priv *priv,
 
665
                                 struct iwl3945_frame *frame, u8 rate);
 
666
extern int iwl3945_hw_get_rx_read(struct iwl3945_priv *priv);
 
667
extern void iwl3945_hw_build_tx_cmd_rate(struct iwl3945_priv *priv,
 
668
                                     struct iwl3945_cmd *cmd,
 
669
                                     struct ieee80211_tx_control *ctrl,
 
670
                                     struct ieee80211_hdr *hdr,
 
671
                                     int sta_id, int tx_id);
 
672
extern int iwl3945_hw_reg_send_txpower(struct iwl3945_priv *priv);
 
673
extern int iwl3945_hw_reg_set_txpower(struct iwl3945_priv *priv, s8 power);
 
674
extern void iwl3945_hw_rx_statistics(struct iwl3945_priv *priv,
 
675
                                 struct iwl3945_rx_mem_buffer *rxb);
 
676
extern void iwl3945_disable_events(struct iwl3945_priv *priv);
 
677
extern int iwl4965_get_temperature(const struct iwl3945_priv *priv);
 
678
 
 
679
/**
 
680
 * iwl3945_hw_find_station - Find station id for a given BSSID
 
681
 * @bssid: MAC address of station ID to find
 
682
 *
 
683
 * NOTE:  This should not be hardware specific but the code has
 
684
 * not yet been merged into a single common layer for managing the
 
685
 * station tables.
 
686
 */
 
687
extern u8 iwl3945_hw_find_station(struct iwl3945_priv *priv, const u8 *bssid);
 
688
 
 
689
extern int iwl3945_hw_channel_switch(struct iwl3945_priv *priv, u16 channel);
 
690
 
 
691
/*
 
692
 * Forward declare iwl-3945.c functions for iwl-base.c
 
693
 */
 
694
extern int iwl3945_eeprom_acquire_semaphore(struct iwl3945_priv *priv);
 
695
extern __le32 iwl3945_get_antenna_flags(const struct iwl3945_priv *priv);
 
696
extern int iwl3945_init_hw_rate_table(struct iwl3945_priv *priv);
 
697
extern void iwl3945_reg_txpower_periodic(struct iwl3945_priv *priv);
 
698
extern int iwl3945_txpower_set_from_eeprom(struct iwl3945_priv *priv);
 
699
extern u8 iwl3945_sync_sta(struct iwl3945_priv *priv, int sta_id,
 
700
                 u16 tx_rate, u8 flags);
 
701
 
 
702
 
 
703
#ifdef CONFIG_IWL3945_SPECTRUM_MEASUREMENT
 
704
 
 
705
enum {
 
706
        MEASUREMENT_READY = (1 << 0),
 
707
        MEASUREMENT_ACTIVE = (1 << 1),
 
708
};
 
709
 
 
710
#endif
 
711
 
 
712
struct iwl3945_priv {
 
713
 
 
714
        /* ieee device used by generic ieee processing code */
 
715
        struct ieee80211_hw *hw;
 
716
        struct ieee80211_channel *ieee_channels;
 
717
        struct ieee80211_rate *ieee_rates;
 
718
 
 
719
        /* temporary frame storage list */
 
720
        struct list_head free_frames;
 
721
        int frames_count;
 
722
 
 
723
        u8 phymode;
 
724
        int alloc_rxb_skb;
 
725
 
 
726
        void (*rx_handlers[REPLY_MAX])(struct iwl3945_priv *priv,
 
727
                                       struct iwl3945_rx_mem_buffer *rxb);
 
728
 
 
729
        const struct ieee80211_hw_mode *modes;
 
730
 
 
731
#ifdef CONFIG_IWL3945_SPECTRUM_MEASUREMENT
 
732
        /* spectrum measurement report caching */
 
733
        struct iwl3945_spectrum_notification measure_report;
 
734
        u8 measurement_status;
 
735
#endif
 
736
        /* ucode beacon time */
 
737
        u32 ucode_beacon_time;
 
738
 
 
739
        /* we allocate array of iwl3945_channel_info for NIC's valid channels.
 
740
         *    Access via channel # using indirect index array */
 
741
        struct iwl3945_channel_info *channel_info;      /* channel info array */
 
742
        u8 channel_count;       /* # of channels */
 
743
 
 
744
        /* each calibration channel group in the EEPROM has a derived
 
745
         * clip setting for each rate. */
 
746
        const struct iwl3945_clip_group clip_groups[5];
 
747
 
 
748
        /* thermal calibration */
 
749
        s32 temperature;        /* degrees Kelvin */
 
750
        s32 last_temperature;
 
751
 
 
752
        /* Scan related variables */
 
753
        unsigned long last_scan_jiffies;
 
754
        unsigned long next_scan_jiffies;
 
755
        unsigned long scan_start;
 
756
        unsigned long scan_pass_start;
 
757
        unsigned long scan_start_tsf;
 
758
        int scan_bands;
 
759
        int one_direct_scan;
 
760
        u8 direct_ssid_len;
 
761
        u8 direct_ssid[IW_ESSID_MAX_SIZE];
 
762
        struct iwl3945_scan_cmd *scan;
 
763
        u8 only_active_channel;
 
764
 
 
765
        /* spinlock */
 
766
        spinlock_t lock;        /* protect general shared data */
 
767
        spinlock_t hcmd_lock;   /* protect hcmd */
 
768
        struct mutex mutex;
 
769
 
 
770
        /* basic pci-network driver stuff */
 
771
        struct pci_dev *pci_dev;
 
772
 
 
773
        /* pci hardware address support */
 
774
        void __iomem *hw_base;
 
775
 
 
776
        /* uCode images, save to reload in case of failure */
 
777
        struct fw_desc ucode_code;      /* runtime inst */
 
778
        struct fw_desc ucode_data;      /* runtime data original */
 
779
        struct fw_desc ucode_data_backup;       /* runtime data save/restore */
 
780
        struct fw_desc ucode_init;      /* initialization inst */
 
781
        struct fw_desc ucode_init_data; /* initialization data */
 
782
        struct fw_desc ucode_boot;      /* bootstrap inst */
 
783
 
 
784
 
 
785
        struct iwl3945_rxon_time_cmd rxon_timing;
 
786
 
 
787
        /* We declare this const so it can only be
 
788
         * changed via explicit cast within the
 
789
         * routines that actually update the physical
 
790
         * hardware */
 
791
        const struct iwl3945_rxon_cmd active_rxon;
 
792
        struct iwl3945_rxon_cmd staging_rxon;
 
793
 
 
794
        int error_recovering;
 
795
        struct iwl3945_rxon_cmd recovery_rxon;
 
796
 
 
797
        /* 1st responses from initialize and runtime uCode images.
 
798
         * 4965's initialize alive response contains some calibration data. */
 
799
        struct iwl3945_init_alive_resp card_alive_init;
 
800
        struct iwl3945_alive_resp card_alive;
 
801
 
 
802
#ifdef LED
 
803
        /* LED related variables */
 
804
        struct iwl3945_activity_blink activity;
 
805
        unsigned long led_packets;
 
806
        int led_state;
 
807
#endif
 
808
 
 
809
        u16 active_rate;
 
810
        u16 active_rate_basic;
 
811
 
 
812
        u8 call_post_assoc_from_beacon;
 
813
        u8 assoc_station_added;
 
814
        /* Rate scaling data */
 
815
        s8 data_retry_limit;
 
816
        u8 retry_rate;
 
817
 
 
818
        wait_queue_head_t wait_command_queue;
 
819
 
 
820
        int activity_timer_active;
 
821
 
 
822
        /* Rx and Tx DMA processing queues */
 
823
        struct iwl3945_rx_queue rxq;
 
824
        struct iwl3945_tx_queue txq[IWL_MAX_NUM_QUEUES];
 
825
 
 
826
        unsigned long status;
 
827
        u32 config;
 
828
 
 
829
        int last_rx_rssi;       /* From Rx packet statisitics */
 
830
        int last_rx_noise;      /* From beacon statistics */
 
831
 
 
832
        struct iwl3945_power_mgr power_data;
 
833
 
 
834
        struct iwl3945_notif_statistics statistics;
 
835
        unsigned long last_statistics_time;
 
836
 
 
837
        /* context information */
 
838
        u8 essid[IW_ESSID_MAX_SIZE];
 
839
        u8 essid_len;
 
840
        u16 rates_mask;
 
841
 
 
842
        u32 power_mode;
 
843
        u32 antenna;
 
844
        u8 bssid[ETH_ALEN];
 
845
        u16 rts_threshold;
 
846
        u8 mac_addr[ETH_ALEN];
 
847
 
 
848
        /*station table variables */
 
849
        spinlock_t sta_lock;
 
850
        int num_stations;
 
851
        struct iwl3945_station_entry stations[IWL_STATION_COUNT];
 
852
 
 
853
        /* Indication if ieee80211_ops->open has been called */
 
854
        int is_open;
 
855
 
 
856
        u8 mac80211_registered;
 
857
        int is_abg;
 
858
 
 
859
        u32 notif_missed_beacons;
 
860
 
 
861
        /* Rx'd packet timing information */
 
862
        u32 last_beacon_time;
 
863
        u64 last_tsf;
 
864
 
 
865
        /* Duplicate packet detection */
 
866
        u16 last_seq_num;
 
867
        u16 last_frag_num;
 
868
        unsigned long last_packet_time;
 
869
 
 
870
        /* Hash table for finding stations in IBSS network */
 
871
        struct list_head ibss_mac_hash[IWL_IBSS_MAC_HASH_SIZE];
 
872
 
 
873
        /* eeprom */
 
874
        struct iwl3945_eeprom eeprom;
 
875
 
 
876
        int iw_mode;
 
877
 
 
878
        struct sk_buff *ibss_beacon;
 
879
 
 
880
        /* Last Rx'd beacon timestamp */
 
881
        u32 timestamp0;
 
882
        u32 timestamp1;
 
883
        u16 beacon_int;
 
884
        struct iwl3945_driver_hw_info hw_setting;
 
885
        int interface_id;
 
886
 
 
887
        /* Current association information needed to configure the
 
888
         * hardware */
 
889
        u16 assoc_id;
 
890
        u16 assoc_capability;
 
891
        u8 ps_mode;
 
892
 
 
893
#ifdef CONFIG_IWL3945_QOS
 
894
        struct iwl3945_qos_info qos_data;
 
895
#endif /*CONFIG_IWL3945_QOS */
 
896
 
 
897
        struct workqueue_struct *workqueue;
 
898
 
 
899
        struct work_struct up;
 
900
        struct work_struct restart;
 
901
        struct work_struct calibrated_work;
 
902
        struct work_struct scan_completed;
 
903
        struct work_struct rx_replenish;
 
904
        struct work_struct rf_kill;
 
905
        struct work_struct abort_scan;
 
906
        struct work_struct update_link_led;
 
907
        struct work_struct auth_work;
 
908
        struct work_struct report_work;
 
909
        struct work_struct request_scan;
 
910
        struct work_struct beacon_update;
 
911
 
 
912
        struct tasklet_struct irq_tasklet;
 
913
 
 
914
        struct delayed_work init_alive_start;
 
915
        struct delayed_work alive_start;
 
916
        struct delayed_work activity_timer;
 
917
        struct delayed_work thermal_periodic;
 
918
        struct delayed_work gather_stats;
 
919
        struct delayed_work scan_check;
 
920
        struct delayed_work post_associate;
 
921
 
 
922
#define IWL_DEFAULT_TX_POWER 0x0F
 
923
        s8 user_txpower_limit;
 
924
        s8 max_channel_txpower_limit;
 
925
 
 
926
#ifdef CONFIG_PM
 
927
        u32 pm_state[16];
 
928
#endif
 
929
 
 
930
#ifdef CONFIG_IWL3945_DEBUG
 
931
        /* debugging info */
 
932
        u32 framecnt_to_us;
 
933
        atomic_t restrict_refcnt;
 
934
#endif
 
935
};                              /*iwl3945_priv */
 
936
 
 
937
static inline int iwl3945_is_associated(struct iwl3945_priv *priv)
 
938
{
 
939
        return (priv->active_rxon.filter_flags & RXON_FILTER_ASSOC_MSK) ? 1 : 0;
 
940
}
 
941
 
 
942
static inline int is_channel_valid(const struct iwl3945_channel_info *ch_info)
 
943
{
 
944
        if (ch_info == NULL)
 
945
                return 0;
 
946
        return (ch_info->flags & EEPROM_CHANNEL_VALID) ? 1 : 0;
 
947
}
 
948
 
 
949
static inline int is_channel_narrow(const struct iwl3945_channel_info *ch_info)
 
950
{
 
951
        return (ch_info->flags & EEPROM_CHANNEL_NARROW) ? 1 : 0;
 
952
}
 
953
 
 
954
static inline int is_channel_radar(const struct iwl3945_channel_info *ch_info)
 
955
{
 
956
        return (ch_info->flags & EEPROM_CHANNEL_RADAR) ? 1 : 0;
 
957
}
 
958
 
 
959
static inline u8 is_channel_a_band(const struct iwl3945_channel_info *ch_info)
 
960
{
 
961
        return ch_info->phymode == MODE_IEEE80211A;
 
962
}
 
963
 
 
964
static inline u8 is_channel_bg_band(const struct iwl3945_channel_info *ch_info)
 
965
{
 
966
        return ((ch_info->phymode == MODE_IEEE80211B) ||
 
967
                (ch_info->phymode == MODE_IEEE80211G));
 
968
}
 
969
 
 
970
static inline int is_channel_passive(const struct iwl3945_channel_info *ch)
 
971
{
 
972
        return (!(ch->flags & EEPROM_CHANNEL_ACTIVE)) ? 1 : 0;
 
973
}
 
974
 
 
975
static inline int is_channel_ibss(const struct iwl3945_channel_info *ch)
 
976
{
 
977
        return ((ch->flags & EEPROM_CHANNEL_IBSS)) ? 1 : 0;
 
978
}
 
979
 
 
980
extern const struct iwl3945_channel_info *iwl3945_get_channel_info(
 
981
        const struct iwl3945_priv *priv, int phymode, u16 channel);
 
982
 
 
983
/* Requires full declaration of iwl3945_priv before including */
 
984
#include "iwl-3945-io.h"
 
985
 
 
986
#endif