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