Updated driver version stamps for ipw2100 (1.1.3) and ipw2200 (1.0.7)
[safe/jmp/linux-2.6] / drivers / net / wireless / ipw2200.c
1 /******************************************************************************
2
3   Copyright(c) 2003 - 2005 Intel Corporation. All rights reserved.
4
5   802.11 status code portion of this file from ethereal-0.10.6:
6     Copyright 2000, Axis Communications AB
7     Ethereal - Network traffic analyzer
8     By Gerald Combs <gerald@ethereal.com>
9     Copyright 1998 Gerald Combs
10
11   This program is free software; you can redistribute it and/or modify it
12   under the terms of version 2 of the GNU General Public License as
13   published by the Free Software Foundation.
14
15   This program is distributed in the hope that it will be useful, but WITHOUT
16   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
17   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
18   more details.
19
20   You should have received a copy of the GNU General Public License along with
21   this program; if not, write to the Free Software Foundation, Inc., 59
22   Temple Place - Suite 330, Boston, MA  02111-1307, USA.
23
24   The full GNU General Public License is included in this distribution in the
25   file called LICENSE.
26
27   Contact Information:
28   James P. Ketrenos <ipw2100-admin@linux.intel.com>
29   Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
30
31 ******************************************************************************/
32
33 #include "ipw2200.h"
34
35 #define IPW2200_VERSION "1.0.7"
36 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2200/2915 Network Driver"
37 #define DRV_COPYRIGHT   "Copyright(c) 2003-2005 Intel Corporation"
38 #define DRV_VERSION     IPW2200_VERSION
39
40 #define ETH_P_80211_STATS (ETH_P_80211_RAW + 1)
41
42 MODULE_DESCRIPTION(DRV_DESCRIPTION);
43 MODULE_VERSION(DRV_VERSION);
44 MODULE_AUTHOR(DRV_COPYRIGHT);
45 MODULE_LICENSE("GPL");
46
47 static int cmdlog = 0;
48 static int debug = 0;
49 static int channel = 0;
50 static int mode = 0;
51
52 static u32 ipw_debug_level;
53 static int associate = 1;
54 static int auto_create = 1;
55 static int led = 0;
56 static int disable = 0;
57 static int hwcrypto = 1;
58 static const char ipw_modes[] = {
59         'a', 'b', 'g', '?'
60 };
61
62 #ifdef CONFIG_IPW_QOS
63 static int qos_enable = 0;
64 static int qos_burst_enable = 0;
65 static int qos_no_ack_mask = 0;
66 static int burst_duration_CCK = 0;
67 static int burst_duration_OFDM = 0;
68
69 static struct ieee80211_qos_parameters def_qos_parameters_OFDM = {
70         {QOS_TX0_CW_MIN_OFDM, QOS_TX1_CW_MIN_OFDM, QOS_TX2_CW_MIN_OFDM,
71          QOS_TX3_CW_MIN_OFDM},
72         {QOS_TX0_CW_MAX_OFDM, QOS_TX1_CW_MAX_OFDM, QOS_TX2_CW_MAX_OFDM,
73          QOS_TX3_CW_MAX_OFDM},
74         {QOS_TX0_AIFS, QOS_TX1_AIFS, QOS_TX2_AIFS, QOS_TX3_AIFS},
75         {QOS_TX0_ACM, QOS_TX1_ACM, QOS_TX2_ACM, QOS_TX3_ACM},
76         {QOS_TX0_TXOP_LIMIT_OFDM, QOS_TX1_TXOP_LIMIT_OFDM,
77          QOS_TX2_TXOP_LIMIT_OFDM, QOS_TX3_TXOP_LIMIT_OFDM}
78 };
79
80 static struct ieee80211_qos_parameters def_qos_parameters_CCK = {
81         {QOS_TX0_CW_MIN_CCK, QOS_TX1_CW_MIN_CCK, QOS_TX2_CW_MIN_CCK,
82          QOS_TX3_CW_MIN_CCK},
83         {QOS_TX0_CW_MAX_CCK, QOS_TX1_CW_MAX_CCK, QOS_TX2_CW_MAX_CCK,
84          QOS_TX3_CW_MAX_CCK},
85         {QOS_TX0_AIFS, QOS_TX1_AIFS, QOS_TX2_AIFS, QOS_TX3_AIFS},
86         {QOS_TX0_ACM, QOS_TX1_ACM, QOS_TX2_ACM, QOS_TX3_ACM},
87         {QOS_TX0_TXOP_LIMIT_CCK, QOS_TX1_TXOP_LIMIT_CCK, QOS_TX2_TXOP_LIMIT_CCK,
88          QOS_TX3_TXOP_LIMIT_CCK}
89 };
90
91 static struct ieee80211_qos_parameters def_parameters_OFDM = {
92         {DEF_TX0_CW_MIN_OFDM, DEF_TX1_CW_MIN_OFDM, DEF_TX2_CW_MIN_OFDM,
93          DEF_TX3_CW_MIN_OFDM},
94         {DEF_TX0_CW_MAX_OFDM, DEF_TX1_CW_MAX_OFDM, DEF_TX2_CW_MAX_OFDM,
95          DEF_TX3_CW_MAX_OFDM},
96         {DEF_TX0_AIFS, DEF_TX1_AIFS, DEF_TX2_AIFS, DEF_TX3_AIFS},
97         {DEF_TX0_ACM, DEF_TX1_ACM, DEF_TX2_ACM, DEF_TX3_ACM},
98         {DEF_TX0_TXOP_LIMIT_OFDM, DEF_TX1_TXOP_LIMIT_OFDM,
99          DEF_TX2_TXOP_LIMIT_OFDM, DEF_TX3_TXOP_LIMIT_OFDM}
100 };
101
102 static struct ieee80211_qos_parameters def_parameters_CCK = {
103         {DEF_TX0_CW_MIN_CCK, DEF_TX1_CW_MIN_CCK, DEF_TX2_CW_MIN_CCK,
104          DEF_TX3_CW_MIN_CCK},
105         {DEF_TX0_CW_MAX_CCK, DEF_TX1_CW_MAX_CCK, DEF_TX2_CW_MAX_CCK,
106          DEF_TX3_CW_MAX_CCK},
107         {DEF_TX0_AIFS, DEF_TX1_AIFS, DEF_TX2_AIFS, DEF_TX3_AIFS},
108         {DEF_TX0_ACM, DEF_TX1_ACM, DEF_TX2_ACM, DEF_TX3_ACM},
109         {DEF_TX0_TXOP_LIMIT_CCK, DEF_TX1_TXOP_LIMIT_CCK, DEF_TX2_TXOP_LIMIT_CCK,
110          DEF_TX3_TXOP_LIMIT_CCK}
111 };
112
113 static u8 qos_oui[QOS_OUI_LEN] = { 0x00, 0x50, 0xF2 };
114
115 static int from_priority_to_tx_queue[] = {
116         IPW_TX_QUEUE_1, IPW_TX_QUEUE_2, IPW_TX_QUEUE_2, IPW_TX_QUEUE_1,
117         IPW_TX_QUEUE_3, IPW_TX_QUEUE_3, IPW_TX_QUEUE_4, IPW_TX_QUEUE_4
118 };
119
120 static u32 ipw_qos_get_burst_duration(struct ipw_priv *priv);
121
122 static int ipw_send_qos_params_command(struct ipw_priv *priv, struct ieee80211_qos_parameters
123                                        *qos_param);
124 static int ipw_send_qos_info_command(struct ipw_priv *priv, struct ieee80211_qos_information_element
125                                      *qos_param);
126 #endif                          /* CONFIG_IPW_QOS */
127
128 static void ipw_remove_current_network(struct ipw_priv *priv);
129 static void ipw_rx(struct ipw_priv *priv);
130 static int ipw_queue_tx_reclaim(struct ipw_priv *priv,
131                                 struct clx2_tx_queue *txq, int qindex);
132 static int ipw_queue_reset(struct ipw_priv *priv);
133
134 static int ipw_queue_tx_hcmd(struct ipw_priv *priv, int hcmd, void *buf,
135                              int len, int sync);
136
137 static void ipw_tx_queue_free(struct ipw_priv *);
138
139 static struct ipw_rx_queue *ipw_rx_queue_alloc(struct ipw_priv *);
140 static void ipw_rx_queue_free(struct ipw_priv *, struct ipw_rx_queue *);
141 static void ipw_rx_queue_replenish(void *);
142 static int ipw_up(struct ipw_priv *);
143 static void ipw_bg_up(void *);
144 static void ipw_down(struct ipw_priv *);
145 static void ipw_bg_down(void *);
146 static int ipw_config(struct ipw_priv *);
147 static int init_supported_rates(struct ipw_priv *priv,
148                                 struct ipw_supported_rates *prates);
149 static void ipw_set_hwcrypto_keys(struct ipw_priv *);
150 static void ipw_send_wep_keys(struct ipw_priv *, int);
151
152 static int ipw_is_valid_channel(struct ieee80211_device *, u8);
153 static int ipw_channel_to_index(struct ieee80211_device *, u8);
154 static u8 ipw_freq_to_channel(struct ieee80211_device *, u32);
155 static int ipw_set_geo(struct ieee80211_device *, const struct ieee80211_geo *);
156 static const struct ieee80211_geo *ipw_get_geo(struct ieee80211_device *);
157
158 static int snprint_line(char *buf, size_t count,
159                         const u8 * data, u32 len, u32 ofs)
160 {
161         int out, i, j, l;
162         char c;
163
164         out = snprintf(buf, count, "%08X", ofs);
165
166         for (l = 0, i = 0; i < 2; i++) {
167                 out += snprintf(buf + out, count - out, " ");
168                 for (j = 0; j < 8 && l < len; j++, l++)
169                         out += snprintf(buf + out, count - out, "%02X ",
170                                         data[(i * 8 + j)]);
171                 for (; j < 8; j++)
172                         out += snprintf(buf + out, count - out, "   ");
173         }
174
175         out += snprintf(buf + out, count - out, " ");
176         for (l = 0, i = 0; i < 2; i++) {
177                 out += snprintf(buf + out, count - out, " ");
178                 for (j = 0; j < 8 && l < len; j++, l++) {
179                         c = data[(i * 8 + j)];
180                         if (!isascii(c) || !isprint(c))
181                                 c = '.';
182
183                         out += snprintf(buf + out, count - out, "%c", c);
184                 }
185
186                 for (; j < 8; j++)
187                         out += snprintf(buf + out, count - out, " ");
188         }
189
190         return out;
191 }
192
193 static void printk_buf(int level, const u8 * data, u32 len)
194 {
195         char line[81];
196         u32 ofs = 0;
197         if (!(ipw_debug_level & level))
198                 return;
199
200         while (len) {
201                 snprint_line(line, sizeof(line), &data[ofs],
202                              min(len, 16U), ofs);
203                 printk(KERN_DEBUG "%s\n", line);
204                 ofs += 16;
205                 len -= min(len, 16U);
206         }
207 }
208
209 static int snprintk_buf(u8 * output, size_t size, const u8 * data, size_t len)
210 {
211         size_t out = size;
212         u32 ofs = 0;
213         int total = 0;
214
215         while (size && len) {
216                 out = snprint_line(output, size, &data[ofs],
217                                    min_t(size_t, len, 16U), ofs);
218
219                 ofs += 16;
220                 output += out;
221                 size -= out;
222                 len -= min_t(size_t, len, 16U);
223                 total += out;
224         }
225         return total;
226 }
227
228 static u32 _ipw_read_reg32(struct ipw_priv *priv, u32 reg);
229 #define ipw_read_reg32(a, b) _ipw_read_reg32(a, b)
230
231 static u8 _ipw_read_reg8(struct ipw_priv *ipw, u32 reg);
232 #define ipw_read_reg8(a, b) _ipw_read_reg8(a, b)
233
234 static void _ipw_write_reg8(struct ipw_priv *priv, u32 reg, u8 value);
235 static inline void ipw_write_reg8(struct ipw_priv *a, u32 b, u8 c)
236 {
237         IPW_DEBUG_IO("%s %d: write_indirect8(0x%08X, 0x%08X)\n", __FILE__,
238                      __LINE__, (u32) (b), (u32) (c));
239         _ipw_write_reg8(a, b, c);
240 }
241
242 static void _ipw_write_reg16(struct ipw_priv *priv, u32 reg, u16 value);
243 static inline void ipw_write_reg16(struct ipw_priv *a, u32 b, u16 c)
244 {
245         IPW_DEBUG_IO("%s %d: write_indirect16(0x%08X, 0x%08X)\n", __FILE__,
246                      __LINE__, (u32) (b), (u32) (c));
247         _ipw_write_reg16(a, b, c);
248 }
249
250 static void _ipw_write_reg32(struct ipw_priv *priv, u32 reg, u32 value);
251 static inline void ipw_write_reg32(struct ipw_priv *a, u32 b, u32 c)
252 {
253         IPW_DEBUG_IO("%s %d: write_indirect32(0x%08X, 0x%08X)\n", __FILE__,
254                      __LINE__, (u32) (b), (u32) (c));
255         _ipw_write_reg32(a, b, c);
256 }
257
258 #define _ipw_write8(ipw, ofs, val) writeb((val), (ipw)->hw_base + (ofs))
259 #define ipw_write8(ipw, ofs, val) \
260  IPW_DEBUG_IO("%s %d: write_direct8(0x%08X, 0x%08X)\n", __FILE__, __LINE__, (u32)(ofs), (u32)(val)); \
261  _ipw_write8(ipw, ofs, val)
262
263 #define _ipw_write16(ipw, ofs, val) writew((val), (ipw)->hw_base + (ofs))
264 #define ipw_write16(ipw, ofs, val) \
265  IPW_DEBUG_IO("%s %d: write_direct16(0x%08X, 0x%08X)\n", __FILE__, __LINE__, (u32)(ofs), (u32)(val)); \
266  _ipw_write16(ipw, ofs, val)
267
268 #define _ipw_write32(ipw, ofs, val) writel((val), (ipw)->hw_base + (ofs))
269 #define ipw_write32(ipw, ofs, val) \
270  IPW_DEBUG_IO("%s %d: write_direct32(0x%08X, 0x%08X)\n", __FILE__, __LINE__, (u32)(ofs), (u32)(val)); \
271  _ipw_write32(ipw, ofs, val)
272
273 #define _ipw_read8(ipw, ofs) readb((ipw)->hw_base + (ofs))
274 static inline u8 __ipw_read8(char *f, u32 l, struct ipw_priv *ipw, u32 ofs)
275 {
276         IPW_DEBUG_IO("%s %d: read_direct8(0x%08X)\n", f, l, (u32) (ofs));
277         return _ipw_read8(ipw, ofs);
278 }
279
280 #define ipw_read8(ipw, ofs) __ipw_read8(__FILE__, __LINE__, ipw, ofs)
281
282 #define _ipw_read16(ipw, ofs) readw((ipw)->hw_base + (ofs))
283 static inline u16 __ipw_read16(char *f, u32 l, struct ipw_priv *ipw, u32 ofs)
284 {
285         IPW_DEBUG_IO("%s %d: read_direct16(0x%08X)\n", f, l, (u32) (ofs));
286         return _ipw_read16(ipw, ofs);
287 }
288
289 #define ipw_read16(ipw, ofs) __ipw_read16(__FILE__, __LINE__, ipw, ofs)
290
291 #define _ipw_read32(ipw, ofs) readl((ipw)->hw_base + (ofs))
292 static inline u32 __ipw_read32(char *f, u32 l, struct ipw_priv *ipw, u32 ofs)
293 {
294         IPW_DEBUG_IO("%s %d: read_direct32(0x%08X)\n", f, l, (u32) (ofs));
295         return _ipw_read32(ipw, ofs);
296 }
297
298 #define ipw_read32(ipw, ofs) __ipw_read32(__FILE__, __LINE__, ipw, ofs)
299
300 static void _ipw_read_indirect(struct ipw_priv *, u32, u8 *, int);
301 static inline void __ipw_read_indirect(const char *f, int l,
302                                        struct ipw_priv *a, u32 b, u8 * c, int d)
303 {
304         IPW_DEBUG_IO("%s %d: read_indirect(0x%08X) %d bytes\n", f, l, (u32) (b),
305                      d);
306         _ipw_read_indirect(a, b, c, d);
307 }
308
309 #define ipw_read_indirect(a, b, c, d) __ipw_read_indirect(__FILE__, __LINE__, a, b, c, d)
310
311 static void _ipw_write_indirect(struct ipw_priv *priv, u32 addr, u8 * data,
312                                 int num);
313 #define ipw_write_indirect(a, b, c, d) \
314         IPW_DEBUG_IO("%s %d: write_indirect(0x%08X) %d bytes\n", __FILE__, __LINE__, (u32)(b), d); \
315         _ipw_write_indirect(a, b, c, d)
316
317 /* indirect write s */
318 static void _ipw_write_reg32(struct ipw_priv *priv, u32 reg, u32 value)
319 {
320         IPW_DEBUG_IO(" %p : reg = 0x%8X : value = 0x%8X\n", priv, reg, value);
321         _ipw_write32(priv, IPW_INDIRECT_ADDR, reg);
322         _ipw_write32(priv, IPW_INDIRECT_DATA, value);
323 }
324
325 static void _ipw_write_reg8(struct ipw_priv *priv, u32 reg, u8 value)
326 {
327         IPW_DEBUG_IO(" reg = 0x%8X : value = 0x%8X\n", reg, value);
328         _ipw_write32(priv, IPW_INDIRECT_ADDR, reg & IPW_INDIRECT_ADDR_MASK);
329         _ipw_write8(priv, IPW_INDIRECT_DATA, value);
330 }
331
332 static void _ipw_write_reg16(struct ipw_priv *priv, u32 reg, u16 value)
333 {
334         IPW_DEBUG_IO(" reg = 0x%8X : value = 0x%8X\n", reg, value);
335         _ipw_write32(priv, IPW_INDIRECT_ADDR, reg & IPW_INDIRECT_ADDR_MASK);
336         _ipw_write16(priv, IPW_INDIRECT_DATA, value);
337 }
338
339 /* indirect read s */
340
341 static u8 _ipw_read_reg8(struct ipw_priv *priv, u32 reg)
342 {
343         u32 word;
344         _ipw_write32(priv, IPW_INDIRECT_ADDR, reg & IPW_INDIRECT_ADDR_MASK);
345         IPW_DEBUG_IO(" reg = 0x%8X : \n", reg);
346         word = _ipw_read32(priv, IPW_INDIRECT_DATA);
347         return (word >> ((reg & 0x3) * 8)) & 0xff;
348 }
349
350 static u32 _ipw_read_reg32(struct ipw_priv *priv, u32 reg)
351 {
352         u32 value;
353
354         IPW_DEBUG_IO("%p : reg = 0x%08x\n", priv, reg);
355
356         _ipw_write32(priv, IPW_INDIRECT_ADDR, reg);
357         value = _ipw_read32(priv, IPW_INDIRECT_DATA);
358         IPW_DEBUG_IO(" reg = 0x%4X : value = 0x%4x \n", reg, value);
359         return value;
360 }
361
362 /* iterative/auto-increment 32 bit reads and writes */
363 static void _ipw_read_indirect(struct ipw_priv *priv, u32 addr, u8 * buf,
364                                int num)
365 {
366         u32 aligned_addr = addr & IPW_INDIRECT_ADDR_MASK;
367         u32 dif_len = addr - aligned_addr;
368         u32 i;
369
370         IPW_DEBUG_IO("addr = %i, buf = %p, num = %i\n", addr, buf, num);
371
372         if (num <= 0) {
373                 return;
374         }
375
376         /* Read the first nibble byte by byte */
377         if (unlikely(dif_len)) {
378                 _ipw_write32(priv, IPW_INDIRECT_ADDR, aligned_addr);
379                 /* Start reading at aligned_addr + dif_len */
380                 for (i = dif_len; ((i < 4) && (num > 0)); i++, num--)
381                         *buf++ = _ipw_read8(priv, IPW_INDIRECT_DATA + i);
382                 aligned_addr += 4;
383         }
384
385         _ipw_write32(priv, IPW_AUTOINC_ADDR, aligned_addr);
386         for (; num >= 4; buf += 4, aligned_addr += 4, num -= 4)
387                 *(u32 *) buf = _ipw_read32(priv, IPW_AUTOINC_DATA);
388
389         /* Copy the last nibble */
390         if (unlikely(num)) {
391                 _ipw_write32(priv, IPW_INDIRECT_ADDR, aligned_addr);
392                 for (i = 0; num > 0; i++, num--)
393                         *buf++ = ipw_read8(priv, IPW_INDIRECT_DATA + i);
394         }
395 }
396
397 static void _ipw_write_indirect(struct ipw_priv *priv, u32 addr, u8 * buf,
398                                 int num)
399 {
400         u32 aligned_addr = addr & IPW_INDIRECT_ADDR_MASK;
401         u32 dif_len = addr - aligned_addr;
402         u32 i;
403
404         IPW_DEBUG_IO("addr = %i, buf = %p, num = %i\n", addr, buf, num);
405
406         if (num <= 0) {
407                 return;
408         }
409
410         /* Write the first nibble byte by byte */
411         if (unlikely(dif_len)) {
412                 _ipw_write32(priv, IPW_INDIRECT_ADDR, aligned_addr);
413                 /* Start reading at aligned_addr + dif_len */
414                 for (i = dif_len; ((i < 4) && (num > 0)); i++, num--, buf++)
415                         _ipw_write8(priv, IPW_INDIRECT_DATA + i, *buf);
416                 aligned_addr += 4;
417         }
418
419         _ipw_write32(priv, IPW_AUTOINC_ADDR, aligned_addr);
420         for (; num >= 4; buf += 4, aligned_addr += 4, num -= 4)
421                 _ipw_write32(priv, IPW_AUTOINC_DATA, *(u32 *) buf);
422
423         /* Copy the last nibble */
424         if (unlikely(num)) {
425                 _ipw_write32(priv, IPW_INDIRECT_ADDR, aligned_addr);
426                 for (i = 0; num > 0; i++, num--, buf++)
427                         _ipw_write8(priv, IPW_INDIRECT_DATA + i, *buf);
428         }
429 }
430
431 static void ipw_write_direct(struct ipw_priv *priv, u32 addr, void *buf,
432                              int num)
433 {
434         memcpy_toio((priv->hw_base + addr), buf, num);
435 }
436
437 static inline void ipw_set_bit(struct ipw_priv *priv, u32 reg, u32 mask)
438 {
439         ipw_write32(priv, reg, ipw_read32(priv, reg) | mask);
440 }
441
442 static inline void ipw_clear_bit(struct ipw_priv *priv, u32 reg, u32 mask)
443 {
444         ipw_write32(priv, reg, ipw_read32(priv, reg) & ~mask);
445 }
446
447 static inline void ipw_enable_interrupts(struct ipw_priv *priv)
448 {
449         if (priv->status & STATUS_INT_ENABLED)
450                 return;
451         priv->status |= STATUS_INT_ENABLED;
452         ipw_write32(priv, IPW_INTA_MASK_R, IPW_INTA_MASK_ALL);
453 }
454
455 static inline void ipw_disable_interrupts(struct ipw_priv *priv)
456 {
457         if (!(priv->status & STATUS_INT_ENABLED))
458                 return;
459         priv->status &= ~STATUS_INT_ENABLED;
460         ipw_write32(priv, IPW_INTA_MASK_R, ~IPW_INTA_MASK_ALL);
461 }
462
463 #ifdef CONFIG_IPW_DEBUG
464 static char *ipw_error_desc(u32 val)
465 {
466         switch (val) {
467         case IPW_FW_ERROR_OK:
468                 return "ERROR_OK";
469         case IPW_FW_ERROR_FAIL:
470                 return "ERROR_FAIL";
471         case IPW_FW_ERROR_MEMORY_UNDERFLOW:
472                 return "MEMORY_UNDERFLOW";
473         case IPW_FW_ERROR_MEMORY_OVERFLOW:
474                 return "MEMORY_OVERFLOW";
475         case IPW_FW_ERROR_BAD_PARAM:
476                 return "BAD_PARAM";
477         case IPW_FW_ERROR_BAD_CHECKSUM:
478                 return "BAD_CHECKSUM";
479         case IPW_FW_ERROR_NMI_INTERRUPT:
480                 return "NMI_INTERRUPT";
481         case IPW_FW_ERROR_BAD_DATABASE:
482                 return "BAD_DATABASE";
483         case IPW_FW_ERROR_ALLOC_FAIL:
484                 return "ALLOC_FAIL";
485         case IPW_FW_ERROR_DMA_UNDERRUN:
486                 return "DMA_UNDERRUN";
487         case IPW_FW_ERROR_DMA_STATUS:
488                 return "DMA_STATUS";
489         case IPW_FW_ERROR_DINO_ERROR:
490                 return "DINO_ERROR";
491         case IPW_FW_ERROR_EEPROM_ERROR:
492                 return "EEPROM_ERROR";
493         case IPW_FW_ERROR_SYSASSERT:
494                 return "SYSASSERT";
495         case IPW_FW_ERROR_FATAL_ERROR:
496                 return "FATAL_ERROR";
497         default:
498                 return "UNKNOWN_ERROR";
499         }
500 }
501
502 static void ipw_dump_error_log(struct ipw_priv *priv,
503                                struct ipw_fw_error *error)
504 {
505         u32 i;
506
507         if (!error) {
508                 IPW_ERROR("Error allocating and capturing error log.  "
509                           "Nothing to dump.\n");
510                 return;
511         }
512
513         IPW_ERROR("Start IPW Error Log Dump:\n");
514         IPW_ERROR("Status: 0x%08X, Config: %08X\n",
515                   error->status, error->config);
516
517         for (i = 0; i < error->elem_len; i++)
518                 IPW_ERROR("%s %i 0x%08x  0x%08x  0x%08x  0x%08x  0x%08x\n",
519                           ipw_error_desc(error->elem[i].desc),
520                           error->elem[i].time,
521                           error->elem[i].blink1,
522                           error->elem[i].blink2,
523                           error->elem[i].link1,
524                           error->elem[i].link2, error->elem[i].data);
525         for (i = 0; i < error->log_len; i++)
526                 IPW_ERROR("%i\t0x%08x\t%i\n",
527                           error->log[i].time,
528                           error->log[i].event, error->log[i].data);
529 }
530 #endif
531
532 static inline int ipw_is_init(struct ipw_priv *priv)
533 {
534         return (priv->status & STATUS_INIT) ? 1 : 0;
535 }
536
537 static int ipw_get_ordinal(struct ipw_priv *priv, u32 ord, void *val, u32 * len)
538 {
539         u32 addr, field_info, field_len, field_count, total_len;
540
541         IPW_DEBUG_ORD("ordinal = %i\n", ord);
542
543         if (!priv || !val || !len) {
544                 IPW_DEBUG_ORD("Invalid argument\n");
545                 return -EINVAL;
546         }
547
548         /* verify device ordinal tables have been initialized */
549         if (!priv->table0_addr || !priv->table1_addr || !priv->table2_addr) {
550                 IPW_DEBUG_ORD("Access ordinals before initialization\n");
551                 return -EINVAL;
552         }
553
554         switch (IPW_ORD_TABLE_ID_MASK & ord) {
555         case IPW_ORD_TABLE_0_MASK:
556                 /*
557                  * TABLE 0: Direct access to a table of 32 bit values
558                  *
559                  * This is a very simple table with the data directly
560                  * read from the table
561                  */
562
563                 /* remove the table id from the ordinal */
564                 ord &= IPW_ORD_TABLE_VALUE_MASK;
565
566                 /* boundary check */
567                 if (ord > priv->table0_len) {
568                         IPW_DEBUG_ORD("ordinal value (%i) longer then "
569                                       "max (%i)\n", ord, priv->table0_len);
570                         return -EINVAL;
571                 }
572
573                 /* verify we have enough room to store the value */
574                 if (*len < sizeof(u32)) {
575                         IPW_DEBUG_ORD("ordinal buffer length too small, "
576                                       "need %zd\n", sizeof(u32));
577                         return -EINVAL;
578                 }
579
580                 IPW_DEBUG_ORD("Reading TABLE0[%i] from offset 0x%08x\n",
581                               ord, priv->table0_addr + (ord << 2));
582
583                 *len = sizeof(u32);
584                 ord <<= 2;
585                 *((u32 *) val) = ipw_read32(priv, priv->table0_addr + ord);
586                 break;
587
588         case IPW_ORD_TABLE_1_MASK:
589                 /*
590                  * TABLE 1: Indirect access to a table of 32 bit values
591                  *
592                  * This is a fairly large table of u32 values each
593                  * representing starting addr for the data (which is
594                  * also a u32)
595                  */
596
597                 /* remove the table id from the ordinal */
598                 ord &= IPW_ORD_TABLE_VALUE_MASK;
599
600                 /* boundary check */
601                 if (ord > priv->table1_len) {
602                         IPW_DEBUG_ORD("ordinal value too long\n");
603                         return -EINVAL;
604                 }
605
606                 /* verify we have enough room to store the value */
607                 if (*len < sizeof(u32)) {
608                         IPW_DEBUG_ORD("ordinal buffer length too small, "
609                                       "need %zd\n", sizeof(u32));
610                         return -EINVAL;
611                 }
612
613                 *((u32 *) val) =
614                     ipw_read_reg32(priv, (priv->table1_addr + (ord << 2)));
615                 *len = sizeof(u32);
616                 break;
617
618         case IPW_ORD_TABLE_2_MASK:
619                 /*
620                  * TABLE 2: Indirect access to a table of variable sized values
621                  *
622                  * This table consist of six values, each containing
623                  *     - dword containing the starting offset of the data
624                  *     - dword containing the lengh in the first 16bits
625                  *       and the count in the second 16bits
626                  */
627
628                 /* remove the table id from the ordinal */
629                 ord &= IPW_ORD_TABLE_VALUE_MASK;
630
631                 /* boundary check */
632                 if (ord > priv->table2_len) {
633                         IPW_DEBUG_ORD("ordinal value too long\n");
634                         return -EINVAL;
635                 }
636
637                 /* get the address of statistic */
638                 addr = ipw_read_reg32(priv, priv->table2_addr + (ord << 3));
639
640                 /* get the second DW of statistics ;
641                  * two 16-bit words - first is length, second is count */
642                 field_info =
643                     ipw_read_reg32(priv,
644                                    priv->table2_addr + (ord << 3) +
645                                    sizeof(u32));
646
647                 /* get each entry length */
648                 field_len = *((u16 *) & field_info);
649
650                 /* get number of entries */
651                 field_count = *(((u16 *) & field_info) + 1);
652
653                 /* abort if not enought memory */
654                 total_len = field_len * field_count;
655                 if (total_len > *len) {
656                         *len = total_len;
657                         return -EINVAL;
658                 }
659
660                 *len = total_len;
661                 if (!total_len)
662                         return 0;
663
664                 IPW_DEBUG_ORD("addr = 0x%08x, total_len = %i, "
665                               "field_info = 0x%08x\n",
666                               addr, total_len, field_info);
667                 ipw_read_indirect(priv, addr, val, total_len);
668                 break;
669
670         default:
671                 IPW_DEBUG_ORD("Invalid ordinal!\n");
672                 return -EINVAL;
673
674         }
675
676         return 0;
677 }
678
679 static void ipw_init_ordinals(struct ipw_priv *priv)
680 {
681         priv->table0_addr = IPW_ORDINALS_TABLE_LOWER;
682         priv->table0_len = ipw_read32(priv, priv->table0_addr);
683
684         IPW_DEBUG_ORD("table 0 offset at 0x%08x, len = %i\n",
685                       priv->table0_addr, priv->table0_len);
686
687         priv->table1_addr = ipw_read32(priv, IPW_ORDINALS_TABLE_1);
688         priv->table1_len = ipw_read_reg32(priv, priv->table1_addr);
689
690         IPW_DEBUG_ORD("table 1 offset at 0x%08x, len = %i\n",
691                       priv->table1_addr, priv->table1_len);
692
693         priv->table2_addr = ipw_read32(priv, IPW_ORDINALS_TABLE_2);
694         priv->table2_len = ipw_read_reg32(priv, priv->table2_addr);
695         priv->table2_len &= 0x0000ffff; /* use first two bytes */
696
697         IPW_DEBUG_ORD("table 2 offset at 0x%08x, len = %i\n",
698                       priv->table2_addr, priv->table2_len);
699
700 }
701
702 u32 ipw_register_toggle(u32 reg)
703 {
704         reg &= ~IPW_START_STANDBY;
705         if (reg & IPW_GATE_ODMA)
706                 reg &= ~IPW_GATE_ODMA;
707         if (reg & IPW_GATE_IDMA)
708                 reg &= ~IPW_GATE_IDMA;
709         if (reg & IPW_GATE_ADMA)
710                 reg &= ~IPW_GATE_ADMA;
711         return reg;
712 }
713
714 /*
715  * LED behavior:
716  * - On radio ON, turn on any LEDs that require to be on during start
717  * - On initialization, start unassociated blink
718  * - On association, disable unassociated blink
719  * - On disassociation, start unassociated blink
720  * - On radio OFF, turn off any LEDs started during radio on
721  *
722  */
723 #define LD_TIME_LINK_ON 300
724 #define LD_TIME_LINK_OFF 2700
725 #define LD_TIME_ACT_ON 250
726
727 void ipw_led_link_on(struct ipw_priv *priv)
728 {
729         unsigned long flags;
730         u32 led;
731
732         /* If configured to not use LEDs, or nic_type is 1,
733          * then we don't toggle a LINK led */
734         if (priv->config & CFG_NO_LED || priv->nic_type == EEPROM_NIC_TYPE_1)
735                 return;
736
737         spin_lock_irqsave(&priv->lock, flags);
738
739         if (!(priv->status & STATUS_RF_KILL_MASK) &&
740             !(priv->status & STATUS_LED_LINK_ON)) {
741                 IPW_DEBUG_LED("Link LED On\n");
742                 led = ipw_read_reg32(priv, IPW_EVENT_REG);
743                 led |= priv->led_association_on;
744
745                 led = ipw_register_toggle(led);
746
747                 IPW_DEBUG_LED("Reg: 0x%08X\n", led);
748                 ipw_write_reg32(priv, IPW_EVENT_REG, led);
749
750                 priv->status |= STATUS_LED_LINK_ON;
751
752                 /* If we aren't associated, schedule turning the LED off */
753                 if (!(priv->status & STATUS_ASSOCIATED))
754                         queue_delayed_work(priv->workqueue,
755                                            &priv->led_link_off,
756                                            LD_TIME_LINK_ON);
757         }
758
759         spin_unlock_irqrestore(&priv->lock, flags);
760 }
761
762 static void ipw_bg_led_link_on(void *data)
763 {
764         struct ipw_priv *priv = data;
765         down(&priv->sem);
766         ipw_led_link_on(data);
767         up(&priv->sem);
768 }
769
770 void ipw_led_link_off(struct ipw_priv *priv)
771 {
772         unsigned long flags;
773         u32 led;
774
775         /* If configured not to use LEDs, or nic type is 1,
776          * then we don't goggle the LINK led. */
777         if (priv->config & CFG_NO_LED || priv->nic_type == EEPROM_NIC_TYPE_1)
778                 return;
779
780         spin_lock_irqsave(&priv->lock, flags);
781
782         if (priv->status & STATUS_LED_LINK_ON) {
783                 led = ipw_read_reg32(priv, IPW_EVENT_REG);
784                 led &= priv->led_association_off;
785                 led = ipw_register_toggle(led);
786
787                 IPW_DEBUG_LED("Reg: 0x%08X\n", led);
788                 ipw_write_reg32(priv, IPW_EVENT_REG, led);
789
790                 IPW_DEBUG_LED("Link LED Off\n");
791
792                 priv->status &= ~STATUS_LED_LINK_ON;
793
794                 /* If we aren't associated and the radio is on, schedule
795                  * turning the LED on (blink while unassociated) */
796                 if (!(priv->status & STATUS_RF_KILL_MASK) &&
797                     !(priv->status & STATUS_ASSOCIATED))
798                         queue_delayed_work(priv->workqueue, &priv->led_link_on,
799                                            LD_TIME_LINK_OFF);
800
801         }
802
803         spin_unlock_irqrestore(&priv->lock, flags);
804 }
805
806 static void ipw_bg_led_link_off(void *data)
807 {
808         struct ipw_priv *priv = data;
809         down(&priv->sem);
810         ipw_led_link_off(data);
811         up(&priv->sem);
812 }
813
814 static inline void __ipw_led_activity_on(struct ipw_priv *priv)
815 {
816         u32 led;
817
818         if (priv->config & CFG_NO_LED)
819                 return;
820
821         if (priv->status & STATUS_RF_KILL_MASK)
822                 return;
823
824         if (!(priv->status & STATUS_LED_ACT_ON)) {
825                 led = ipw_read_reg32(priv, IPW_EVENT_REG);
826                 led |= priv->led_activity_on;
827
828                 led = ipw_register_toggle(led);
829
830                 IPW_DEBUG_LED("Reg: 0x%08X\n", led);
831                 ipw_write_reg32(priv, IPW_EVENT_REG, led);
832
833                 IPW_DEBUG_LED("Activity LED On\n");
834
835                 priv->status |= STATUS_LED_ACT_ON;
836
837                 cancel_delayed_work(&priv->led_act_off);
838                 queue_delayed_work(priv->workqueue, &priv->led_act_off,
839                                    LD_TIME_ACT_ON);
840         } else {
841                 /* Reschedule LED off for full time period */
842                 cancel_delayed_work(&priv->led_act_off);
843                 queue_delayed_work(priv->workqueue, &priv->led_act_off,
844                                    LD_TIME_ACT_ON);
845         }
846 }
847
848 void ipw_led_activity_on(struct ipw_priv *priv)
849 {
850         unsigned long flags;
851         spin_lock_irqsave(&priv->lock, flags);
852         __ipw_led_activity_on(priv);
853         spin_unlock_irqrestore(&priv->lock, flags);
854 }
855
856 void ipw_led_activity_off(struct ipw_priv *priv)
857 {
858         unsigned long flags;
859         u32 led;
860
861         if (priv->config & CFG_NO_LED)
862                 return;
863
864         spin_lock_irqsave(&priv->lock, flags);
865
866         if (priv->status & STATUS_LED_ACT_ON) {
867                 led = ipw_read_reg32(priv, IPW_EVENT_REG);
868                 led &= priv->led_activity_off;
869
870                 led = ipw_register_toggle(led);
871
872                 IPW_DEBUG_LED("Reg: 0x%08X\n", led);
873                 ipw_write_reg32(priv, IPW_EVENT_REG, led);
874
875                 IPW_DEBUG_LED("Activity LED Off\n");
876
877                 priv->status &= ~STATUS_LED_ACT_ON;
878         }
879
880         spin_unlock_irqrestore(&priv->lock, flags);
881 }
882
883 static void ipw_bg_led_activity_off(void *data)
884 {
885         struct ipw_priv *priv = data;
886         down(&priv->sem);
887         ipw_led_activity_off(data);
888         up(&priv->sem);
889 }
890
891 void ipw_led_band_on(struct ipw_priv *priv)
892 {
893         unsigned long flags;
894         u32 led;
895
896         /* Only nic type 1 supports mode LEDs */
897         if (priv->config & CFG_NO_LED ||
898             priv->nic_type != EEPROM_NIC_TYPE_1 || !priv->assoc_network)
899                 return;
900
901         spin_lock_irqsave(&priv->lock, flags);
902
903         led = ipw_read_reg32(priv, IPW_EVENT_REG);
904         if (priv->assoc_network->mode == IEEE_A) {
905                 led |= priv->led_ofdm_on;
906                 led &= priv->led_association_off;
907                 IPW_DEBUG_LED("Mode LED On: 802.11a\n");
908         } else if (priv->assoc_network->mode == IEEE_G) {
909                 led |= priv->led_ofdm_on;
910                 led |= priv->led_association_on;
911                 IPW_DEBUG_LED("Mode LED On: 802.11g\n");
912         } else {
913                 led &= priv->led_ofdm_off;
914                 led |= priv->led_association_on;
915                 IPW_DEBUG_LED("Mode LED On: 802.11b\n");
916         }
917
918         led = ipw_register_toggle(led);
919
920         IPW_DEBUG_LED("Reg: 0x%08X\n", led);
921         ipw_write_reg32(priv, IPW_EVENT_REG, led);
922
923         spin_unlock_irqrestore(&priv->lock, flags);
924 }
925
926 void ipw_led_band_off(struct ipw_priv *priv)
927 {
928         unsigned long flags;
929         u32 led;
930
931         /* Only nic type 1 supports mode LEDs */
932         if (priv->config & CFG_NO_LED || priv->nic_type != EEPROM_NIC_TYPE_1)
933                 return;
934
935         spin_lock_irqsave(&priv->lock, flags);
936
937         led = ipw_read_reg32(priv, IPW_EVENT_REG);
938         led &= priv->led_ofdm_off;
939         led &= priv->led_association_off;
940
941         led = ipw_register_toggle(led);
942
943         IPW_DEBUG_LED("Reg: 0x%08X\n", led);
944         ipw_write_reg32(priv, IPW_EVENT_REG, led);
945
946         spin_unlock_irqrestore(&priv->lock, flags);
947 }
948
949 void ipw_led_radio_on(struct ipw_priv *priv)
950 {
951         ipw_led_link_on(priv);
952 }
953
954 void ipw_led_radio_off(struct ipw_priv *priv)
955 {
956         ipw_led_activity_off(priv);
957         ipw_led_link_off(priv);
958 }
959
960 void ipw_led_link_up(struct ipw_priv *priv)
961 {
962         /* Set the Link Led on for all nic types */
963         ipw_led_link_on(priv);
964 }
965
966 void ipw_led_link_down(struct ipw_priv *priv)
967 {
968         ipw_led_activity_off(priv);
969         ipw_led_link_off(priv);
970
971         if (priv->status & STATUS_RF_KILL_MASK)
972                 ipw_led_radio_off(priv);
973 }
974
975 void ipw_led_init(struct ipw_priv *priv)
976 {
977         priv->nic_type = priv->eeprom[EEPROM_NIC_TYPE];
978
979         /* Set the default PINs for the link and activity leds */
980         priv->led_activity_on = IPW_ACTIVITY_LED;
981         priv->led_activity_off = ~(IPW_ACTIVITY_LED);
982
983         priv->led_association_on = IPW_ASSOCIATED_LED;
984         priv->led_association_off = ~(IPW_ASSOCIATED_LED);
985
986         /* Set the default PINs for the OFDM leds */
987         priv->led_ofdm_on = IPW_OFDM_LED;
988         priv->led_ofdm_off = ~(IPW_OFDM_LED);
989
990         switch (priv->nic_type) {
991         case EEPROM_NIC_TYPE_1:
992                 /* In this NIC type, the LEDs are reversed.... */
993                 priv->led_activity_on = IPW_ASSOCIATED_LED;
994                 priv->led_activity_off = ~(IPW_ASSOCIATED_LED);
995                 priv->led_association_on = IPW_ACTIVITY_LED;
996                 priv->led_association_off = ~(IPW_ACTIVITY_LED);
997
998                 if (!(priv->config & CFG_NO_LED))
999                         ipw_led_band_on(priv);
1000
1001                 /* And we don't blink link LEDs for this nic, so
1002                  * just return here */
1003                 return;
1004
1005         case EEPROM_NIC_TYPE_3:
1006         case EEPROM_NIC_TYPE_2:
1007         case EEPROM_NIC_TYPE_4:
1008         case EEPROM_NIC_TYPE_0:
1009                 break;
1010
1011         default:
1012                 IPW_DEBUG_INFO("Unknown NIC type from EEPROM: %d\n",
1013                                priv->nic_type);
1014                 priv->nic_type = EEPROM_NIC_TYPE_0;
1015                 break;
1016         }
1017
1018         if (!(priv->config & CFG_NO_LED)) {
1019                 if (priv->status & STATUS_ASSOCIATED)
1020                         ipw_led_link_on(priv);
1021                 else
1022                         ipw_led_link_off(priv);
1023         }
1024 }
1025
1026 void ipw_led_shutdown(struct ipw_priv *priv)
1027 {
1028         ipw_led_activity_off(priv);
1029         ipw_led_link_off(priv);
1030         ipw_led_band_off(priv);
1031         cancel_delayed_work(&priv->led_link_on);
1032         cancel_delayed_work(&priv->led_link_off);
1033         cancel_delayed_work(&priv->led_act_off);
1034 }
1035
1036 /*
1037  * The following adds a new attribute to the sysfs representation
1038  * of this device driver (i.e. a new file in /sys/bus/pci/drivers/ipw/)
1039  * used for controling the debug level.
1040  *
1041  * See the level definitions in ipw for details.
1042  */
1043 static ssize_t show_debug_level(struct device_driver *d, char *buf)
1044 {
1045         return sprintf(buf, "0x%08X\n", ipw_debug_level);
1046 }
1047
1048 static ssize_t store_debug_level(struct device_driver *d, const char *buf,
1049                                  size_t count)
1050 {
1051         char *p = (char *)buf;
1052         u32 val;
1053
1054         if (p[1] == 'x' || p[1] == 'X' || p[0] == 'x' || p[0] == 'X') {
1055                 p++;
1056                 if (p[0] == 'x' || p[0] == 'X')
1057                         p++;
1058                 val = simple_strtoul(p, &p, 16);
1059         } else
1060                 val = simple_strtoul(p, &p, 10);
1061         if (p == buf)
1062                 printk(KERN_INFO DRV_NAME
1063                        ": %s is not in hex or decimal form.\n", buf);
1064         else
1065                 ipw_debug_level = val;
1066
1067         return strnlen(buf, count);
1068 }
1069
1070 static DRIVER_ATTR(debug_level, S_IWUSR | S_IRUGO,
1071                    show_debug_level, store_debug_level);
1072
1073 static inline u32 ipw_get_event_log_len(struct ipw_priv *priv)
1074 {
1075         return ipw_read_reg32(priv, ipw_read32(priv, IPW_EVENT_LOG));
1076 }
1077
1078 static void ipw_capture_event_log(struct ipw_priv *priv,
1079                                   u32 log_len, struct ipw_event *log)
1080 {
1081         u32 base;
1082
1083         if (log_len) {
1084                 base = ipw_read32(priv, IPW_EVENT_LOG);
1085                 ipw_read_indirect(priv, base + sizeof(base) + sizeof(u32),
1086                                   (u8 *) log, sizeof(*log) * log_len);
1087         }
1088 }
1089
1090 static struct ipw_fw_error *ipw_alloc_error_log(struct ipw_priv *priv)
1091 {
1092         struct ipw_fw_error *error;
1093         u32 log_len = ipw_get_event_log_len(priv);
1094         u32 base = ipw_read32(priv, IPW_ERROR_LOG);
1095         u32 elem_len = ipw_read_reg32(priv, base);
1096
1097         error = kmalloc(sizeof(*error) +
1098                         sizeof(*error->elem) * elem_len +
1099                         sizeof(*error->log) * log_len, GFP_ATOMIC);
1100         if (!error) {
1101                 IPW_ERROR("Memory allocation for firmware error log "
1102                           "failed.\n");
1103                 return NULL;
1104         }
1105         error->jiffies = jiffies;
1106         error->status = priv->status;
1107         error->config = priv->config;
1108         error->elem_len = elem_len;
1109         error->log_len = log_len;
1110         error->elem = (struct ipw_error_elem *)error->payload;
1111         error->log = (struct ipw_event *)(error->elem +
1112                                           (sizeof(*error->elem) * elem_len));
1113
1114         ipw_capture_event_log(priv, log_len, error->log);
1115
1116         if (elem_len)
1117                 ipw_read_indirect(priv, base + sizeof(base), (u8 *) error->elem,
1118                                   sizeof(*error->elem) * elem_len);
1119
1120         return error;
1121 }
1122
1123 static void ipw_free_error_log(struct ipw_fw_error *error)
1124 {
1125         if (error)
1126                 kfree(error);
1127 }
1128
1129 static ssize_t show_event_log(struct device *d,
1130                               struct device_attribute *attr, char *buf)
1131 {
1132         struct ipw_priv *priv = dev_get_drvdata(d);
1133         u32 log_len = ipw_get_event_log_len(priv);
1134         struct ipw_event log[log_len];
1135         u32 len = 0, i;
1136
1137         ipw_capture_event_log(priv, log_len, log);
1138
1139         len += snprintf(buf + len, PAGE_SIZE - len, "%08X", log_len);
1140         for (i = 0; i < log_len; i++)
1141                 len += snprintf(buf + len, PAGE_SIZE - len,
1142                                 "\n%08X%08X%08X",
1143                                 log[i].time, log[i].event, log[i].data);
1144         len += snprintf(buf + len, PAGE_SIZE - len, "\n");
1145         return len;
1146 }
1147
1148 static DEVICE_ATTR(event_log, S_IRUGO, show_event_log, NULL);
1149
1150 static ssize_t show_error(struct device *d,
1151                           struct device_attribute *attr, char *buf)
1152 {
1153         struct ipw_priv *priv = dev_get_drvdata(d);
1154         u32 len = 0, i;
1155         if (!priv->error)
1156                 return 0;
1157         len += snprintf(buf + len, PAGE_SIZE - len,
1158                         "%08lX%08X%08X%08X",
1159                         priv->error->jiffies,
1160                         priv->error->status,
1161                         priv->error->config, priv->error->elem_len);
1162         for (i = 0; i < priv->error->elem_len; i++)
1163                 len += snprintf(buf + len, PAGE_SIZE - len,
1164                                 "\n%08X%08X%08X%08X%08X%08X%08X",
1165                                 priv->error->elem[i].time,
1166                                 priv->error->elem[i].desc,
1167                                 priv->error->elem[i].blink1,
1168                                 priv->error->elem[i].blink2,
1169                                 priv->error->elem[i].link1,
1170                                 priv->error->elem[i].link2,
1171                                 priv->error->elem[i].data);
1172
1173         len += snprintf(buf + len, PAGE_SIZE - len,
1174                         "\n%08X", priv->error->log_len);
1175         for (i = 0; i < priv->error->log_len; i++)
1176                 len += snprintf(buf + len, PAGE_SIZE - len,
1177                                 "\n%08X%08X%08X",
1178                                 priv->error->log[i].time,
1179                                 priv->error->log[i].event,
1180                                 priv->error->log[i].data);
1181         len += snprintf(buf + len, PAGE_SIZE - len, "\n");
1182         return len;
1183 }
1184
1185 static ssize_t clear_error(struct device *d,
1186                            struct device_attribute *attr,
1187                            const char *buf, size_t count)
1188 {
1189         struct ipw_priv *priv = dev_get_drvdata(d);
1190         if (priv->error) {
1191                 ipw_free_error_log(priv->error);
1192                 priv->error = NULL;
1193         }
1194         return count;
1195 }
1196
1197 static DEVICE_ATTR(error, S_IRUGO | S_IWUSR, show_error, clear_error);
1198
1199 static ssize_t show_cmd_log(struct device *d,
1200                             struct device_attribute *attr, char *buf)
1201 {
1202         struct ipw_priv *priv = dev_get_drvdata(d);
1203         u32 len = 0, i;
1204         if (!priv->cmdlog)
1205                 return 0;
1206         for (i = (priv->cmdlog_pos + 1) % priv->cmdlog_len;
1207              (i != priv->cmdlog_pos) && (PAGE_SIZE - len);
1208              i = (i + 1) % priv->cmdlog_len) {
1209                 len +=
1210                     snprintf(buf + len, PAGE_SIZE - len,
1211                              "\n%08lX%08X%08X%08X\n", priv->cmdlog[i].jiffies,
1212                              priv->cmdlog[i].retcode, priv->cmdlog[i].cmd.cmd,
1213                              priv->cmdlog[i].cmd.len);
1214                 len +=
1215                     snprintk_buf(buf + len, PAGE_SIZE - len,
1216                                  (u8 *) priv->cmdlog[i].cmd.param,
1217                                  priv->cmdlog[i].cmd.len);
1218                 len += snprintf(buf + len, PAGE_SIZE - len, "\n");
1219         }
1220         len += snprintf(buf + len, PAGE_SIZE - len, "\n");
1221         return len;
1222 }
1223
1224 static DEVICE_ATTR(cmd_log, S_IRUGO, show_cmd_log, NULL);
1225
1226 static ssize_t show_scan_age(struct device *d, struct device_attribute *attr,
1227                              char *buf)
1228 {
1229         struct ipw_priv *priv = dev_get_drvdata(d);
1230         return sprintf(buf, "%d\n", priv->ieee->scan_age);
1231 }
1232
1233 static ssize_t store_scan_age(struct device *d, struct device_attribute *attr,
1234                               const char *buf, size_t count)
1235 {
1236         struct ipw_priv *priv = dev_get_drvdata(d);
1237 #ifdef CONFIG_IPW_DEBUG
1238         struct net_device *dev = priv->net_dev;
1239 #endif
1240         char buffer[] = "00000000";
1241         unsigned long len =
1242             (sizeof(buffer) - 1) > count ? count : sizeof(buffer) - 1;
1243         unsigned long val;
1244         char *p = buffer;
1245
1246         IPW_DEBUG_INFO("enter\n");
1247
1248         strncpy(buffer, buf, len);
1249         buffer[len] = 0;
1250
1251         if (p[1] == 'x' || p[1] == 'X' || p[0] == 'x' || p[0] == 'X') {
1252                 p++;
1253                 if (p[0] == 'x' || p[0] == 'X')
1254                         p++;
1255                 val = simple_strtoul(p, &p, 16);
1256         } else
1257                 val = simple_strtoul(p, &p, 10);
1258         if (p == buffer) {
1259                 IPW_DEBUG_INFO("%s: user supplied invalid value.\n", dev->name);
1260         } else {
1261                 priv->ieee->scan_age = val;
1262                 IPW_DEBUG_INFO("set scan_age = %u\n", priv->ieee->scan_age);
1263         }
1264
1265         IPW_DEBUG_INFO("exit\n");
1266         return len;
1267 }
1268
1269 static DEVICE_ATTR(scan_age, S_IWUSR | S_IRUGO, show_scan_age, store_scan_age);
1270
1271 static ssize_t show_led(struct device *d, struct device_attribute *attr,
1272                         char *buf)
1273 {
1274         struct ipw_priv *priv = dev_get_drvdata(d);
1275         return sprintf(buf, "%d\n", (priv->config & CFG_NO_LED) ? 0 : 1);
1276 }
1277
1278 static ssize_t store_led(struct device *d, struct device_attribute *attr,
1279                          const char *buf, size_t count)
1280 {
1281         struct ipw_priv *priv = dev_get_drvdata(d);
1282
1283         IPW_DEBUG_INFO("enter\n");
1284
1285         if (count == 0)
1286                 return 0;
1287
1288         if (*buf == 0) {
1289                 IPW_DEBUG_LED("Disabling LED control.\n");
1290                 priv->config |= CFG_NO_LED;
1291                 ipw_led_shutdown(priv);
1292         } else {
1293                 IPW_DEBUG_LED("Enabling LED control.\n");
1294                 priv->config &= ~CFG_NO_LED;
1295                 ipw_led_init(priv);
1296         }
1297
1298         IPW_DEBUG_INFO("exit\n");
1299         return count;
1300 }
1301
1302 static DEVICE_ATTR(led, S_IWUSR | S_IRUGO, show_led, store_led);
1303
1304 static ssize_t show_status(struct device *d,
1305                            struct device_attribute *attr, char *buf)
1306 {
1307         struct ipw_priv *p = d->driver_data;
1308         return sprintf(buf, "0x%08x\n", (int)p->status);
1309 }
1310
1311 static DEVICE_ATTR(status, S_IRUGO, show_status, NULL);
1312
1313 static ssize_t show_cfg(struct device *d, struct device_attribute *attr,
1314                         char *buf)
1315 {
1316         struct ipw_priv *p = d->driver_data;
1317         return sprintf(buf, "0x%08x\n", (int)p->config);
1318 }
1319
1320 static DEVICE_ATTR(cfg, S_IRUGO, show_cfg, NULL);
1321
1322 static ssize_t show_nic_type(struct device *d,
1323                              struct device_attribute *attr, char *buf)
1324 {
1325         struct ipw_priv *priv = d->driver_data;
1326         return sprintf(buf, "TYPE: %d\n", priv->nic_type);
1327 }
1328
1329 static DEVICE_ATTR(nic_type, S_IRUGO, show_nic_type, NULL);
1330
1331 static ssize_t show_ucode_version(struct device *d,
1332                                   struct device_attribute *attr, char *buf)
1333 {
1334         u32 len = sizeof(u32), tmp = 0;
1335         struct ipw_priv *p = d->driver_data;
1336
1337         if (ipw_get_ordinal(p, IPW_ORD_STAT_UCODE_VERSION, &tmp, &len))
1338                 return 0;
1339
1340         return sprintf(buf, "0x%08x\n", tmp);
1341 }
1342
1343 static DEVICE_ATTR(ucode_version, S_IWUSR | S_IRUGO, show_ucode_version, NULL);
1344
1345 static ssize_t show_rtc(struct device *d, struct device_attribute *attr,
1346                         char *buf)
1347 {
1348         u32 len = sizeof(u32), tmp = 0;
1349         struct ipw_priv *p = d->driver_data;
1350
1351         if (ipw_get_ordinal(p, IPW_ORD_STAT_RTC, &tmp, &len))
1352                 return 0;
1353
1354         return sprintf(buf, "0x%08x\n", tmp);
1355 }
1356
1357 static DEVICE_ATTR(rtc, S_IWUSR | S_IRUGO, show_rtc, NULL);
1358
1359 /*
1360  * Add a device attribute to view/control the delay between eeprom
1361  * operations.
1362  */
1363 static ssize_t show_eeprom_delay(struct device *d,
1364                                  struct device_attribute *attr, char *buf)
1365 {
1366         int n = ((struct ipw_priv *)d->driver_data)->eeprom_delay;
1367         return sprintf(buf, "%i\n", n);
1368 }
1369 static ssize_t store_eeprom_delay(struct device *d,
1370                                   struct device_attribute *attr,
1371                                   const char *buf, size_t count)
1372 {
1373         struct ipw_priv *p = d->driver_data;
1374         sscanf(buf, "%i", &p->eeprom_delay);
1375         return strnlen(buf, count);
1376 }
1377
1378 static DEVICE_ATTR(eeprom_delay, S_IWUSR | S_IRUGO,
1379                    show_eeprom_delay, store_eeprom_delay);
1380
1381 static ssize_t show_command_event_reg(struct device *d,
1382                                       struct device_attribute *attr, char *buf)
1383 {
1384         u32 reg = 0;
1385         struct ipw_priv *p = d->driver_data;
1386
1387         reg = ipw_read_reg32(p, IPW_INTERNAL_CMD_EVENT);
1388         return sprintf(buf, "0x%08x\n", reg);
1389 }
1390 static ssize_t store_command_event_reg(struct device *d,
1391                                        struct device_attribute *attr,
1392                                        const char *buf, size_t count)
1393 {
1394         u32 reg;
1395         struct ipw_priv *p = d->driver_data;
1396
1397         sscanf(buf, "%x", &reg);
1398         ipw_write_reg32(p, IPW_INTERNAL_CMD_EVENT, reg);
1399         return strnlen(buf, count);
1400 }
1401
1402 static DEVICE_ATTR(command_event_reg, S_IWUSR | S_IRUGO,
1403                    show_command_event_reg, store_command_event_reg);
1404
1405 static ssize_t show_mem_gpio_reg(struct device *d,
1406                                  struct device_attribute *attr, char *buf)
1407 {
1408         u32 reg = 0;
1409         struct ipw_priv *p = d->driver_data;
1410
1411         reg = ipw_read_reg32(p, 0x301100);
1412         return sprintf(buf, "0x%08x\n", reg);
1413 }
1414 static ssize_t store_mem_gpio_reg(struct device *d,
1415                                   struct device_attribute *attr,
1416                                   const char *buf, size_t count)
1417 {
1418         u32 reg;
1419         struct ipw_priv *p = d->driver_data;
1420
1421         sscanf(buf, "%x", &reg);
1422         ipw_write_reg32(p, 0x301100, reg);
1423         return strnlen(buf, count);
1424 }
1425
1426 static DEVICE_ATTR(mem_gpio_reg, S_IWUSR | S_IRUGO,
1427                    show_mem_gpio_reg, store_mem_gpio_reg);
1428
1429 static ssize_t show_indirect_dword(struct device *d,
1430                                    struct device_attribute *attr, char *buf)
1431 {
1432         u32 reg = 0;
1433         struct ipw_priv *priv = d->driver_data;
1434
1435         if (priv->status & STATUS_INDIRECT_DWORD)
1436                 reg = ipw_read_reg32(priv, priv->indirect_dword);
1437         else
1438                 reg = 0;
1439
1440         return sprintf(buf, "0x%08x\n", reg);
1441 }
1442 static ssize_t store_indirect_dword(struct device *d,
1443                                     struct device_attribute *attr,
1444                                     const char *buf, size_t count)
1445 {
1446         struct ipw_priv *priv = d->driver_data;
1447
1448         sscanf(buf, "%x", &priv->indirect_dword);
1449         priv->status |= STATUS_INDIRECT_DWORD;
1450         return strnlen(buf, count);
1451 }
1452
1453 static DEVICE_ATTR(indirect_dword, S_IWUSR | S_IRUGO,
1454                    show_indirect_dword, store_indirect_dword);
1455
1456 static ssize_t show_indirect_byte(struct device *d,
1457                                   struct device_attribute *attr, char *buf)
1458 {
1459         u8 reg = 0;
1460         struct ipw_priv *priv = d->driver_data;
1461
1462         if (priv->status & STATUS_INDIRECT_BYTE)
1463                 reg = ipw_read_reg8(priv, priv->indirect_byte);
1464         else
1465                 reg = 0;
1466
1467         return sprintf(buf, "0x%02x\n", reg);
1468 }
1469 static ssize_t store_indirect_byte(struct device *d,
1470                                    struct device_attribute *attr,
1471                                    const char *buf, size_t count)
1472 {
1473         struct ipw_priv *priv = d->driver_data;
1474
1475         sscanf(buf, "%x", &priv->indirect_byte);
1476         priv->status |= STATUS_INDIRECT_BYTE;
1477         return strnlen(buf, count);
1478 }
1479
1480 static DEVICE_ATTR(indirect_byte, S_IWUSR | S_IRUGO,
1481                    show_indirect_byte, store_indirect_byte);
1482
1483 static ssize_t show_direct_dword(struct device *d,
1484                                  struct device_attribute *attr, char *buf)
1485 {
1486         u32 reg = 0;
1487         struct ipw_priv *priv = d->driver_data;
1488
1489         if (priv->status & STATUS_DIRECT_DWORD)
1490                 reg = ipw_read32(priv, priv->direct_dword);
1491         else
1492                 reg = 0;
1493
1494         return sprintf(buf, "0x%08x\n", reg);
1495 }
1496 static ssize_t store_direct_dword(struct device *d,
1497                                   struct device_attribute *attr,
1498                                   const char *buf, size_t count)
1499 {
1500         struct ipw_priv *priv = d->driver_data;
1501
1502         sscanf(buf, "%x", &priv->direct_dword);
1503         priv->status |= STATUS_DIRECT_DWORD;
1504         return strnlen(buf, count);
1505 }
1506
1507 static DEVICE_ATTR(direct_dword, S_IWUSR | S_IRUGO,
1508                    show_direct_dword, store_direct_dword);
1509
1510 static inline int rf_kill_active(struct ipw_priv *priv)
1511 {
1512         if (0 == (ipw_read32(priv, 0x30) & 0x10000))
1513                 priv->status |= STATUS_RF_KILL_HW;
1514         else
1515                 priv->status &= ~STATUS_RF_KILL_HW;
1516
1517         return (priv->status & STATUS_RF_KILL_HW) ? 1 : 0;
1518 }
1519
1520 static ssize_t show_rf_kill(struct device *d, struct device_attribute *attr,
1521                             char *buf)
1522 {
1523         /* 0 - RF kill not enabled
1524            1 - SW based RF kill active (sysfs)
1525            2 - HW based RF kill active
1526            3 - Both HW and SW baed RF kill active */
1527         struct ipw_priv *priv = d->driver_data;
1528         int val = ((priv->status & STATUS_RF_KILL_SW) ? 0x1 : 0x0) |
1529             (rf_kill_active(priv) ? 0x2 : 0x0);
1530         return sprintf(buf, "%i\n", val);
1531 }
1532
1533 static int ipw_radio_kill_sw(struct ipw_priv *priv, int disable_radio)
1534 {
1535         if ((disable_radio ? 1 : 0) ==
1536             ((priv->status & STATUS_RF_KILL_SW) ? 1 : 0))
1537                 return 0;
1538
1539         IPW_DEBUG_RF_KILL("Manual SW RF Kill set to: RADIO  %s\n",
1540                           disable_radio ? "OFF" : "ON");
1541
1542         if (disable_radio) {
1543                 priv->status |= STATUS_RF_KILL_SW;
1544
1545                 if (priv->workqueue)
1546                         cancel_delayed_work(&priv->request_scan);
1547                 queue_work(priv->workqueue, &priv->down);
1548         } else {
1549                 priv->status &= ~STATUS_RF_KILL_SW;
1550                 if (rf_kill_active(priv)) {
1551                         IPW_DEBUG_RF_KILL("Can not turn radio back on - "
1552                                           "disabled by HW switch\n");
1553                         /* Make sure the RF_KILL check timer is running */
1554                         cancel_delayed_work(&priv->rf_kill);
1555                         queue_delayed_work(priv->workqueue, &priv->rf_kill,
1556                                            2 * HZ);
1557                 } else
1558                         queue_work(priv->workqueue, &priv->up);
1559         }
1560
1561         return 1;
1562 }
1563
1564 static ssize_t store_rf_kill(struct device *d, struct device_attribute *attr,
1565                              const char *buf, size_t count)
1566 {
1567         struct ipw_priv *priv = d->driver_data;
1568
1569         ipw_radio_kill_sw(priv, buf[0] == '1');
1570
1571         return count;
1572 }
1573
1574 static DEVICE_ATTR(rf_kill, S_IWUSR | S_IRUGO, show_rf_kill, store_rf_kill);
1575
1576 static ssize_t show_speed_scan(struct device *d, struct device_attribute *attr,
1577                                char *buf)
1578 {
1579         struct ipw_priv *priv = (struct ipw_priv *)d->driver_data;
1580         int pos = 0, len = 0;
1581         if (priv->config & CFG_SPEED_SCAN) {
1582                 while (priv->speed_scan[pos] != 0)
1583                         len += sprintf(&buf[len], "%d ",
1584                                        priv->speed_scan[pos++]);
1585                 return len + sprintf(&buf[len], "\n");
1586         }
1587
1588         return sprintf(buf, "0\n");
1589 }
1590
1591 static ssize_t store_speed_scan(struct device *d, struct device_attribute *attr,
1592                                 const char *buf, size_t count)
1593 {
1594         struct ipw_priv *priv = (struct ipw_priv *)d->driver_data;
1595         int channel, pos = 0;
1596         const char *p = buf;
1597
1598         /* list of space separated channels to scan, optionally ending with 0 */
1599         while ((channel = simple_strtol(p, NULL, 0))) {
1600                 if (pos == MAX_SPEED_SCAN - 1) {
1601                         priv->speed_scan[pos] = 0;
1602                         break;
1603                 }
1604
1605                 if (ipw_is_valid_channel(priv->ieee, channel))
1606                         priv->speed_scan[pos++] = channel;
1607                 else
1608                         IPW_WARNING("Skipping invalid channel request: %d\n",
1609                                     channel);
1610                 p = strchr(p, ' ');
1611                 if (!p)
1612                         break;
1613                 while (*p == ' ' || *p == '\t')
1614                         p++;
1615         }
1616
1617         if (pos == 0)
1618                 priv->config &= ~CFG_SPEED_SCAN;
1619         else {
1620                 priv->speed_scan_pos = 0;
1621                 priv->config |= CFG_SPEED_SCAN;
1622         }
1623
1624         return count;
1625 }
1626
1627 static DEVICE_ATTR(speed_scan, S_IWUSR | S_IRUGO, show_speed_scan,
1628                    store_speed_scan);
1629
1630 static ssize_t show_net_stats(struct device *d, struct device_attribute *attr,
1631                               char *buf)
1632 {
1633         struct ipw_priv *priv = (struct ipw_priv *)d->driver_data;
1634         return sprintf(buf, "%c\n", (priv->config & CFG_NET_STATS) ? '1' : '0');
1635 }
1636
1637 static ssize_t store_net_stats(struct device *d, struct device_attribute *attr,
1638                                const char *buf, size_t count)
1639 {
1640         struct ipw_priv *priv = (struct ipw_priv *)d->driver_data;
1641         if (buf[0] == '1')
1642                 priv->config |= CFG_NET_STATS;
1643         else
1644                 priv->config &= ~CFG_NET_STATS;
1645
1646         return count;
1647 }
1648
1649 static DEVICE_ATTR(net_stats, S_IWUSR | S_IRUGO,
1650                    show_net_stats, store_net_stats);
1651
1652 static void notify_wx_assoc_event(struct ipw_priv *priv)
1653 {
1654         union iwreq_data wrqu;
1655         wrqu.ap_addr.sa_family = ARPHRD_ETHER;
1656         if (priv->status & STATUS_ASSOCIATED)
1657                 memcpy(wrqu.ap_addr.sa_data, priv->bssid, ETH_ALEN);
1658         else
1659                 memset(wrqu.ap_addr.sa_data, 0, ETH_ALEN);
1660         wireless_send_event(priv->net_dev, SIOCGIWAP, &wrqu, NULL);
1661 }
1662
1663 static void ipw_irq_tasklet(struct ipw_priv *priv)
1664 {
1665         u32 inta, inta_mask, handled = 0;
1666         unsigned long flags;
1667         int rc = 0;
1668
1669         spin_lock_irqsave(&priv->lock, flags);
1670
1671         inta = ipw_read32(priv, IPW_INTA_RW);
1672         inta_mask = ipw_read32(priv, IPW_INTA_MASK_R);
1673         inta &= (IPW_INTA_MASK_ALL & inta_mask);
1674
1675         /* Add any cached INTA values that need to be handled */
1676         inta |= priv->isr_inta;
1677
1678         /* handle all the justifications for the interrupt */
1679         if (inta & IPW_INTA_BIT_RX_TRANSFER) {
1680                 ipw_rx(priv);
1681                 handled |= IPW_INTA_BIT_RX_TRANSFER;
1682         }
1683
1684         if (inta & IPW_INTA_BIT_TX_CMD_QUEUE) {
1685                 IPW_DEBUG_HC("Command completed.\n");
1686                 rc = ipw_queue_tx_reclaim(priv, &priv->txq_cmd, -1);
1687                 priv->status &= ~STATUS_HCMD_ACTIVE;
1688                 wake_up_interruptible(&priv->wait_command_queue);
1689                 handled |= IPW_INTA_BIT_TX_CMD_QUEUE;
1690         }
1691
1692         if (inta & IPW_INTA_BIT_TX_QUEUE_1) {
1693                 IPW_DEBUG_TX("TX_QUEUE_1\n");
1694                 rc = ipw_queue_tx_reclaim(priv, &priv->txq[0], 0);
1695                 handled |= IPW_INTA_BIT_TX_QUEUE_1;
1696         }
1697
1698         if (inta & IPW_INTA_BIT_TX_QUEUE_2) {
1699                 IPW_DEBUG_TX("TX_QUEUE_2\n");
1700                 rc = ipw_queue_tx_reclaim(priv, &priv->txq[1], 1);
1701                 handled |= IPW_INTA_BIT_TX_QUEUE_2;
1702         }
1703
1704         if (inta & IPW_INTA_BIT_TX_QUEUE_3) {
1705                 IPW_DEBUG_TX("TX_QUEUE_3\n");
1706                 rc = ipw_queue_tx_reclaim(priv, &priv->txq[2], 2);
1707                 handled |= IPW_INTA_BIT_TX_QUEUE_3;
1708         }
1709
1710         if (inta & IPW_INTA_BIT_TX_QUEUE_4) {
1711                 IPW_DEBUG_TX("TX_QUEUE_4\n");
1712                 rc = ipw_queue_tx_reclaim(priv, &priv->txq[3], 3);
1713                 handled |= IPW_INTA_BIT_TX_QUEUE_4;
1714         }
1715
1716         if (inta & IPW_INTA_BIT_STATUS_CHANGE) {
1717                 IPW_WARNING("STATUS_CHANGE\n");
1718                 handled |= IPW_INTA_BIT_STATUS_CHANGE;
1719         }
1720
1721         if (inta & IPW_INTA_BIT_BEACON_PERIOD_EXPIRED) {
1722                 IPW_WARNING("TX_PERIOD_EXPIRED\n");
1723                 handled |= IPW_INTA_BIT_BEACON_PERIOD_EXPIRED;
1724         }
1725
1726         if (inta & IPW_INTA_BIT_SLAVE_MODE_HOST_CMD_DONE) {
1727                 IPW_WARNING("HOST_CMD_DONE\n");
1728                 handled |= IPW_INTA_BIT_SLAVE_MODE_HOST_CMD_DONE;
1729         }
1730
1731         if (inta & IPW_INTA_BIT_FW_INITIALIZATION_DONE) {
1732                 IPW_WARNING("FW_INITIALIZATION_DONE\n");
1733                 handled |= IPW_INTA_BIT_FW_INITIALIZATION_DONE;
1734         }
1735
1736         if (inta & IPW_INTA_BIT_FW_CARD_DISABLE_PHY_OFF_DONE) {
1737                 IPW_WARNING("PHY_OFF_DONE\n");
1738                 handled |= IPW_INTA_BIT_FW_CARD_DISABLE_PHY_OFF_DONE;
1739         }
1740
1741         if (inta & IPW_INTA_BIT_RF_KILL_DONE) {
1742                 IPW_DEBUG_RF_KILL("RF_KILL_DONE\n");
1743                 priv->status |= STATUS_RF_KILL_HW;
1744                 wake_up_interruptible(&priv->wait_command_queue);
1745                 priv->status &= ~(STATUS_ASSOCIATED | STATUS_ASSOCIATING);
1746                 cancel_delayed_work(&priv->request_scan);
1747                 schedule_work(&priv->link_down);
1748                 queue_delayed_work(priv->workqueue, &priv->rf_kill, 2 * HZ);
1749                 handled |= IPW_INTA_BIT_RF_KILL_DONE;
1750         }
1751
1752         if (inta & IPW_INTA_BIT_FATAL_ERROR) {
1753                 IPW_ERROR("Firmware error detected.  Restarting.\n");
1754                 if (priv->error) {
1755                         IPW_ERROR("Sysfs 'error' log already exists.\n");
1756 #ifdef CONFIG_IPW_DEBUG
1757                         if (ipw_debug_level & IPW_DL_FW_ERRORS) {
1758                                 struct ipw_fw_error *error =
1759                                     ipw_alloc_error_log(priv);
1760                                 ipw_dump_error_log(priv, error);
1761                                 if (error)
1762                                         ipw_free_error_log(error);
1763                         }
1764 #endif
1765                 } else {
1766                         priv->error = ipw_alloc_error_log(priv);
1767                         if (priv->error)
1768                                 IPW_ERROR("Sysfs 'error' log captured.\n");
1769                         else
1770                                 IPW_ERROR("Error allocating sysfs 'error' "
1771                                           "log.\n");
1772 #ifdef CONFIG_IPW_DEBUG
1773                         if (ipw_debug_level & IPW_DL_FW_ERRORS)
1774                                 ipw_dump_error_log(priv, priv->error);
1775 #endif
1776                 }
1777
1778                 /* XXX: If hardware encryption is for WPA/WPA2,
1779                  * we have to notify the supplicant. */
1780                 if (priv->ieee->sec.encrypt) {
1781                         priv->status &= ~STATUS_ASSOCIATED;
1782                         notify_wx_assoc_event(priv);
1783                 }
1784
1785                 /* Keep the restart process from trying to send host
1786                  * commands by clearing the INIT status bit */
1787                 priv->status &= ~STATUS_INIT;
1788
1789                 /* Cancel currently queued command. */
1790                 priv->status &= ~STATUS_HCMD_ACTIVE;
1791                 wake_up_interruptible(&priv->wait_command_queue);
1792
1793                 queue_work(priv->workqueue, &priv->adapter_restart);
1794                 handled |= IPW_INTA_BIT_FATAL_ERROR;
1795         }
1796
1797         if (inta & IPW_INTA_BIT_PARITY_ERROR) {
1798                 IPW_ERROR("Parity error\n");
1799                 handled |= IPW_INTA_BIT_PARITY_ERROR;
1800         }
1801
1802         if (handled != inta) {
1803                 IPW_ERROR("Unhandled INTA bits 0x%08x\n", inta & ~handled);
1804         }
1805
1806         /* enable all interrupts */
1807         ipw_enable_interrupts(priv);
1808
1809         spin_unlock_irqrestore(&priv->lock, flags);
1810 }
1811
1812 #define IPW_CMD(x) case IPW_CMD_ ## x : return #x
1813 static char *get_cmd_string(u8 cmd)
1814 {
1815         switch (cmd) {
1816                 IPW_CMD(HOST_COMPLETE);
1817                 IPW_CMD(POWER_DOWN);
1818                 IPW_CMD(SYSTEM_CONFIG);
1819                 IPW_CMD(MULTICAST_ADDRESS);
1820                 IPW_CMD(SSID);
1821                 IPW_CMD(ADAPTER_ADDRESS);
1822                 IPW_CMD(PORT_TYPE);
1823                 IPW_CMD(RTS_THRESHOLD);
1824                 IPW_CMD(FRAG_THRESHOLD);
1825                 IPW_CMD(POWER_MODE);
1826                 IPW_CMD(WEP_KEY);
1827                 IPW_CMD(TGI_TX_KEY);
1828                 IPW_CMD(SCAN_REQUEST);
1829                 IPW_CMD(SCAN_REQUEST_EXT);
1830                 IPW_CMD(ASSOCIATE);
1831                 IPW_CMD(SUPPORTED_RATES);
1832                 IPW_CMD(SCAN_ABORT);
1833                 IPW_CMD(TX_FLUSH);
1834                 IPW_CMD(QOS_PARAMETERS);
1835                 IPW_CMD(DINO_CONFIG);
1836                 IPW_CMD(RSN_CAPABILITIES);
1837                 IPW_CMD(RX_KEY);
1838                 IPW_CMD(CARD_DISABLE);
1839                 IPW_CMD(SEED_NUMBER);
1840                 IPW_CMD(TX_POWER);
1841                 IPW_CMD(COUNTRY_INFO);
1842                 IPW_CMD(AIRONET_INFO);
1843                 IPW_CMD(AP_TX_POWER);
1844                 IPW_CMD(CCKM_INFO);
1845                 IPW_CMD(CCX_VER_INFO);
1846                 IPW_CMD(SET_CALIBRATION);
1847                 IPW_CMD(SENSITIVITY_CALIB);
1848                 IPW_CMD(RETRY_LIMIT);
1849                 IPW_CMD(IPW_PRE_POWER_DOWN);
1850                 IPW_CMD(VAP_BEACON_TEMPLATE);
1851                 IPW_CMD(VAP_DTIM_PERIOD);
1852                 IPW_CMD(EXT_SUPPORTED_RATES);
1853                 IPW_CMD(VAP_LOCAL_TX_PWR_CONSTRAINT);
1854                 IPW_CMD(VAP_QUIET_INTERVALS);
1855                 IPW_CMD(VAP_CHANNEL_SWITCH);
1856                 IPW_CMD(VAP_MANDATORY_CHANNELS);
1857                 IPW_CMD(VAP_CELL_PWR_LIMIT);
1858                 IPW_CMD(VAP_CF_PARAM_SET);
1859                 IPW_CMD(VAP_SET_BEACONING_STATE);
1860                 IPW_CMD(MEASUREMENT);
1861                 IPW_CMD(POWER_CAPABILITY);
1862                 IPW_CMD(SUPPORTED_CHANNELS);
1863                 IPW_CMD(TPC_REPORT);
1864                 IPW_CMD(WME_INFO);
1865                 IPW_CMD(PRODUCTION_COMMAND);
1866         default:
1867                 return "UNKNOWN";
1868         }
1869 }
1870
1871 #define HOST_COMPLETE_TIMEOUT HZ
1872 static int ipw_send_cmd(struct ipw_priv *priv, struct host_cmd *cmd)
1873 {
1874         int rc = 0;
1875         unsigned long flags;
1876
1877         spin_lock_irqsave(&priv->lock, flags);
1878         if (priv->status & STATUS_HCMD_ACTIVE) {
1879                 IPW_ERROR("Failed to send %s: Already sending a command.\n",
1880                           get_cmd_string(cmd->cmd));
1881                 spin_unlock_irqrestore(&priv->lock, flags);
1882                 return -EAGAIN;
1883         }
1884
1885         priv->status |= STATUS_HCMD_ACTIVE;
1886
1887         if (priv->cmdlog) {
1888                 priv->cmdlog[priv->cmdlog_pos].jiffies = jiffies;
1889                 priv->cmdlog[priv->cmdlog_pos].cmd.cmd = cmd->cmd;
1890                 priv->cmdlog[priv->cmdlog_pos].cmd.len = cmd->len;
1891                 memcpy(priv->cmdlog[priv->cmdlog_pos].cmd.param, cmd->param,
1892                        cmd->len);
1893                 priv->cmdlog[priv->cmdlog_pos].retcode = -1;
1894         }
1895
1896         IPW_DEBUG_HC("%s command (#%d) %d bytes: 0x%08X\n",
1897                      get_cmd_string(cmd->cmd), cmd->cmd, cmd->len,
1898                      priv->status);
1899         printk_buf(IPW_DL_HOST_COMMAND, (u8 *) cmd->param, cmd->len);
1900
1901         rc = ipw_queue_tx_hcmd(priv, cmd->cmd, &cmd->param, cmd->len, 0);
1902         if (rc) {
1903                 priv->status &= ~STATUS_HCMD_ACTIVE;
1904                 IPW_ERROR("Failed to send %s: Reason %d\n",
1905                           get_cmd_string(cmd->cmd), rc);
1906                 spin_unlock_irqrestore(&priv->lock, flags);
1907                 goto exit;
1908         }
1909         spin_unlock_irqrestore(&priv->lock, flags);
1910
1911         rc = wait_event_interruptible_timeout(priv->wait_command_queue,
1912                                               !(priv->
1913                                                 status & STATUS_HCMD_ACTIVE),
1914                                               HOST_COMPLETE_TIMEOUT);
1915         if (rc == 0) {
1916                 spin_lock_irqsave(&priv->lock, flags);
1917                 if (priv->status & STATUS_HCMD_ACTIVE) {
1918                         IPW_ERROR("Failed to send %s: Command timed out.\n",
1919                                   get_cmd_string(cmd->cmd));
1920                         priv->status &= ~STATUS_HCMD_ACTIVE;
1921                         spin_unlock_irqrestore(&priv->lock, flags);
1922                         rc = -EIO;
1923                         goto exit;
1924                 }
1925                 spin_unlock_irqrestore(&priv->lock, flags);
1926         } else
1927                 rc = 0;
1928
1929         if (priv->status & STATUS_RF_KILL_HW) {
1930                 IPW_ERROR("Failed to send %s: Aborted due to RF kill switch.\n",
1931                           get_cmd_string(cmd->cmd));
1932                 rc = -EIO;
1933                 goto exit;
1934         }
1935
1936       exit:
1937         if (priv->cmdlog) {
1938                 priv->cmdlog[priv->cmdlog_pos++].retcode = rc;
1939                 priv->cmdlog_pos %= priv->cmdlog_len;
1940         }
1941         return rc;
1942 }
1943
1944 static int ipw_send_host_complete(struct ipw_priv *priv)
1945 {
1946         struct host_cmd cmd = {
1947                 .cmd = IPW_CMD_HOST_COMPLETE,
1948                 .len = 0
1949         };
1950
1951         if (!priv) {
1952                 IPW_ERROR("Invalid args\n");
1953                 return -1;
1954         }
1955
1956         return ipw_send_cmd(priv, &cmd);
1957 }
1958
1959 static int ipw_send_system_config(struct ipw_priv *priv,
1960                                   struct ipw_sys_config *config)
1961 {
1962         struct host_cmd cmd = {
1963                 .cmd = IPW_CMD_SYSTEM_CONFIG,
1964                 .len = sizeof(*config)
1965         };
1966
1967         if (!priv || !config) {
1968                 IPW_ERROR("Invalid args\n");
1969                 return -1;
1970         }
1971
1972         memcpy(cmd.param, config, sizeof(*config));
1973         return ipw_send_cmd(priv, &cmd);
1974 }
1975
1976 static int ipw_send_ssid(struct ipw_priv *priv, u8 * ssid, int len)
1977 {
1978         struct host_cmd cmd = {
1979                 .cmd = IPW_CMD_SSID,
1980                 .len = min(len, IW_ESSID_MAX_SIZE)
1981         };
1982
1983         if (!priv || !ssid) {
1984                 IPW_ERROR("Invalid args\n");
1985                 return -1;
1986         }
1987
1988         memcpy(cmd.param, ssid, cmd.len);
1989         return ipw_send_cmd(priv, &cmd);
1990 }
1991
1992 static int ipw_send_adapter_address(struct ipw_priv *priv, u8 * mac)
1993 {
1994         struct host_cmd cmd = {
1995                 .cmd = IPW_CMD_ADAPTER_ADDRESS,
1996                 .len = ETH_ALEN
1997         };
1998
1999         if (!priv || !mac) {
2000                 IPW_ERROR("Invalid args\n");
2001                 return -1;
2002         }
2003
2004         IPW_DEBUG_INFO("%s: Setting MAC to " MAC_FMT "\n",
2005                        priv->net_dev->name, MAC_ARG(mac));
2006
2007         memcpy(cmd.param, mac, ETH_ALEN);
2008         return ipw_send_cmd(priv, &cmd);
2009 }
2010
2011 /*
2012  * NOTE: This must be executed from our workqueue as it results in udelay
2013  * being called which may corrupt the keyboard if executed on default
2014  * workqueue
2015  */
2016 static void ipw_adapter_restart(void *adapter)
2017 {
2018         struct ipw_priv *priv = adapter;
2019
2020         if (priv->status & STATUS_RF_KILL_MASK)
2021                 return;
2022
2023         ipw_down(priv);
2024
2025         if (priv->assoc_network &&
2026             (priv->assoc_network->capability & WLAN_CAPABILITY_IBSS))
2027                 ipw_remove_current_network(priv);
2028
2029         if (ipw_up(priv)) {
2030                 IPW_ERROR("Failed to up device\n");
2031                 return;
2032         }
2033 }
2034
2035 static void ipw_bg_adapter_restart(void *data)
2036 {
2037         struct ipw_priv *priv = data;
2038         down(&priv->sem);
2039         ipw_adapter_restart(data);
2040         up(&priv->sem);
2041 }
2042
2043 #define IPW_SCAN_CHECK_WATCHDOG (5 * HZ)
2044
2045 static void ipw_scan_check(void *data)
2046 {
2047         struct ipw_priv *priv = data;
2048         if (priv->status & (STATUS_SCANNING | STATUS_SCAN_ABORTING)) {
2049                 IPW_DEBUG_SCAN("Scan completion watchdog resetting "
2050                                "adapter (%dms).\n",
2051                                IPW_SCAN_CHECK_WATCHDOG / 100);
2052                 queue_work(priv->workqueue, &priv->adapter_restart);
2053         }
2054 }
2055
2056 static void ipw_bg_scan_check(void *data)
2057 {
2058         struct ipw_priv *priv = data;
2059         down(&priv->sem);
2060         ipw_scan_check(data);
2061         up(&priv->sem);
2062 }
2063
2064 static int ipw_send_scan_request_ext(struct ipw_priv *priv,
2065                                      struct ipw_scan_request_ext *request)
2066 {
2067         struct host_cmd cmd = {
2068                 .cmd = IPW_CMD_SCAN_REQUEST_EXT,
2069                 .len = sizeof(*request)
2070         };
2071
2072         memcpy(cmd.param, request, sizeof(*request));
2073         return ipw_send_cmd(priv, &cmd);
2074 }
2075
2076 static int ipw_send_scan_abort(struct ipw_priv *priv)
2077 {
2078         struct host_cmd cmd = {
2079                 .cmd = IPW_CMD_SCAN_ABORT,
2080                 .len = 0
2081         };
2082
2083         if (!priv) {
2084                 IPW_ERROR("Invalid args\n");
2085                 return -1;
2086         }
2087
2088         return ipw_send_cmd(priv, &cmd);
2089 }
2090
2091 static int ipw_set_sensitivity(struct ipw_priv *priv, u16 sens)
2092 {
2093         struct host_cmd cmd = {
2094                 .cmd = IPW_CMD_SENSITIVITY_CALIB,
2095                 .len = sizeof(struct ipw_sensitivity_calib)
2096         };
2097         struct ipw_sensitivity_calib *calib = (struct ipw_sensitivity_calib *)
2098             &cmd.param;
2099         calib->beacon_rssi_raw = sens;
2100         return ipw_send_cmd(priv, &cmd);
2101 }
2102
2103 static int ipw_send_associate(struct ipw_priv *priv,
2104                               struct ipw_associate *associate)
2105 {
2106         struct host_cmd cmd = {
2107                 .cmd = IPW_CMD_ASSOCIATE,
2108                 .len = sizeof(*associate)
2109         };
2110
2111         struct ipw_associate tmp_associate;
2112         memcpy(&tmp_associate, associate, sizeof(*associate));
2113         tmp_associate.policy_support =
2114             cpu_to_le16(tmp_associate.policy_support);
2115         tmp_associate.assoc_tsf_msw = cpu_to_le32(tmp_associate.assoc_tsf_msw);
2116         tmp_associate.assoc_tsf_lsw = cpu_to_le32(tmp_associate.assoc_tsf_lsw);
2117         tmp_associate.capability = cpu_to_le16(tmp_associate.capability);
2118         tmp_associate.listen_interval =
2119             cpu_to_le16(tmp_associate.listen_interval);
2120         tmp_associate.beacon_interval =
2121             cpu_to_le16(tmp_associate.beacon_interval);
2122         tmp_associate.atim_window = cpu_to_le16(tmp_associate.atim_window);
2123
2124         if (!priv || !associate) {
2125                 IPW_ERROR("Invalid args\n");
2126                 return -1;
2127         }
2128
2129         memcpy(cmd.param, &tmp_associate, sizeof(*associate));
2130         return ipw_send_cmd(priv, &cmd);
2131 }
2132
2133 static int ipw_send_supported_rates(struct ipw_priv *priv,
2134                                     struct ipw_supported_rates *rates)
2135 {
2136         struct host_cmd cmd = {
2137                 .cmd = IPW_CMD_SUPPORTED_RATES,
2138                 .len = sizeof(*rates)
2139         };
2140
2141         if (!priv || !rates) {
2142                 IPW_ERROR("Invalid args\n");
2143                 return -1;
2144         }
2145
2146         memcpy(cmd.param, rates, sizeof(*rates));
2147         return ipw_send_cmd(priv, &cmd);
2148 }
2149
2150 static int ipw_set_random_seed(struct ipw_priv *priv)
2151 {
2152         struct host_cmd cmd = {
2153                 .cmd = IPW_CMD_SEED_NUMBER,
2154                 .len = sizeof(u32)
2155         };
2156
2157         if (!priv) {
2158                 IPW_ERROR("Invalid args\n");
2159                 return -1;
2160         }
2161
2162         get_random_bytes(&cmd.param, sizeof(u32));
2163
2164         return ipw_send_cmd(priv, &cmd);
2165 }
2166
2167 static int ipw_send_card_disable(struct ipw_priv *priv, u32 phy_off)
2168 {
2169         struct host_cmd cmd = {
2170                 .cmd = IPW_CMD_CARD_DISABLE,
2171                 .len = sizeof(u32)
2172         };
2173
2174         if (!priv) {
2175                 IPW_ERROR("Invalid args\n");
2176                 return -1;
2177         }
2178
2179         *((u32 *) & cmd.param) = phy_off;
2180
2181         return ipw_send_cmd(priv, &cmd);
2182 }
2183
2184 static int ipw_send_tx_power(struct ipw_priv *priv, struct ipw_tx_power *power)
2185 {
2186         struct host_cmd cmd = {
2187                 .cmd = IPW_CMD_TX_POWER,
2188                 .len = sizeof(*power)
2189         };
2190
2191         if (!priv || !power) {
2192                 IPW_ERROR("Invalid args\n");
2193                 return -1;
2194         }
2195
2196         memcpy(cmd.param, power, sizeof(*power));
2197         return ipw_send_cmd(priv, &cmd);
2198 }
2199
2200 static int ipw_set_tx_power(struct ipw_priv *priv)
2201 {
2202         const struct ieee80211_geo *geo = ipw_get_geo(priv->ieee);
2203         struct ipw_tx_power tx_power;
2204         s8 max_power;
2205         int i;
2206
2207         memset(&tx_power, 0, sizeof(tx_power));
2208
2209         /* configure device for 'G' band */
2210         tx_power.ieee_mode = IPW_G_MODE;
2211         tx_power.num_channels = geo->bg_channels;
2212         for (i = 0; i < geo->bg_channels; i++) {
2213                 max_power = geo->bg[i].max_power;
2214                 tx_power.channels_tx_power[i].channel_number =
2215                     geo->bg[i].channel;
2216                 tx_power.channels_tx_power[i].tx_power = max_power ?
2217                     min(max_power, priv->tx_power) : priv->tx_power;
2218         }
2219         if (ipw_send_tx_power(priv, &tx_power))
2220                 return -EIO;
2221
2222         /* configure device to also handle 'B' band */
2223         tx_power.ieee_mode = IPW_B_MODE;
2224         if (ipw_send_tx_power(priv, &tx_power))
2225                 return -EIO;
2226
2227         /* configure device to also handle 'A' band */
2228         if (priv->ieee->abg_true) {
2229                 tx_power.ieee_mode = IPW_A_MODE;
2230                 tx_power.num_channels = geo->a_channels;
2231                 for (i = 0; i < tx_power.num_channels; i++) {
2232                         max_power = geo->a[i].max_power;
2233                         tx_power.channels_tx_power[i].channel_number =
2234                             geo->a[i].channel;
2235                         tx_power.channels_tx_power[i].tx_power = max_power ?
2236                             min(max_power, priv->tx_power) : priv->tx_power;
2237                 }
2238                 if (ipw_send_tx_power(priv, &tx_power))
2239                         return -EIO;
2240         }
2241         return 0;
2242 }
2243
2244 static int ipw_send_rts_threshold(struct ipw_priv *priv, u16 rts)
2245 {
2246         struct ipw_rts_threshold rts_threshold = {
2247                 .rts_threshold = rts,
2248         };
2249         struct host_cmd cmd = {
2250                 .cmd = IPW_CMD_RTS_THRESHOLD,
2251                 .len = sizeof(rts_threshold)
2252         };
2253
2254         if (!priv) {
2255                 IPW_ERROR("Invalid args\n");
2256                 return -1;
2257         }
2258
2259         memcpy(cmd.param, &rts_threshold, sizeof(rts_threshold));
2260         return ipw_send_cmd(priv, &cmd);
2261 }
2262
2263 static int ipw_send_frag_threshold(struct ipw_priv *priv, u16 frag)
2264 {
2265         struct ipw_frag_threshold frag_threshold = {
2266                 .frag_threshold = frag,
2267         };
2268         struct host_cmd cmd = {
2269                 .cmd = IPW_CMD_FRAG_THRESHOLD,
2270                 .len = sizeof(frag_threshold)
2271         };
2272
2273         if (!priv) {
2274                 IPW_ERROR("Invalid args\n");
2275                 return -1;
2276         }
2277
2278         memcpy(cmd.param, &frag_threshold, sizeof(frag_threshold));
2279         return ipw_send_cmd(priv, &cmd);
2280 }
2281
2282 static int ipw_send_power_mode(struct ipw_priv *priv, u32 mode)
2283 {
2284         struct host_cmd cmd = {
2285                 .cmd = IPW_CMD_POWER_MODE,
2286                 .len = sizeof(u32)
2287         };
2288         u32 *param = (u32 *) (&cmd.param);
2289
2290         if (!priv) {
2291                 IPW_ERROR("Invalid args\n");
2292                 return -1;
2293         }
2294
2295         /* If on battery, set to 3, if AC set to CAM, else user
2296          * level */
2297         switch (mode) {
2298         case IPW_POWER_BATTERY:
2299                 *param = IPW_POWER_INDEX_3;
2300                 break;
2301         case IPW_POWER_AC:
2302                 *param = IPW_POWER_MODE_CAM;
2303                 break;
2304         default:
2305                 *param = mode;
2306                 break;
2307         }
2308
2309         return ipw_send_cmd(priv, &cmd);
2310 }
2311
2312 static int ipw_send_retry_limit(struct ipw_priv *priv, u8 slimit, u8 llimit)
2313 {
2314         struct ipw_retry_limit retry_limit = {
2315                 .short_retry_limit = slimit,
2316                 .long_retry_limit = llimit
2317         };
2318         struct host_cmd cmd = {
2319                 .cmd = IPW_CMD_RETRY_LIMIT,
2320                 .len = sizeof(retry_limit)
2321         };
2322
2323         if (!priv) {
2324                 IPW_ERROR("Invalid args\n");
2325                 return -1;
2326         }
2327
2328         memcpy(cmd.param, &retry_limit, sizeof(retry_limit));
2329         return ipw_send_cmd(priv, &cmd);
2330 }
2331
2332 /*
2333  * The IPW device contains a Microwire compatible EEPROM that stores
2334  * various data like the MAC address.  Usually the firmware has exclusive
2335  * access to the eeprom, but during device initialization (before the
2336  * device driver has sent the HostComplete command to the firmware) the
2337  * device driver has read access to the EEPROM by way of indirect addressing
2338  * through a couple of memory mapped registers.
2339  *
2340  * The following is a simplified implementation for pulling data out of the
2341  * the eeprom, along with some helper functions to find information in
2342  * the per device private data's copy of the eeprom.
2343  *
2344  * NOTE: To better understand how these functions work (i.e what is a chip
2345  *       select and why do have to keep driving the eeprom clock?), read
2346  *       just about any data sheet for a Microwire compatible EEPROM.
2347  */
2348
2349 /* write a 32 bit value into the indirect accessor register */
2350 static inline void eeprom_write_reg(struct ipw_priv *p, u32 data)
2351 {
2352         ipw_write_reg32(p, FW_MEM_REG_EEPROM_ACCESS, data);
2353
2354         /* the eeprom requires some time to complete the operation */
2355         udelay(p->eeprom_delay);
2356
2357         return;
2358 }
2359
2360 /* perform a chip select operation */
2361 static inline void eeprom_cs(struct ipw_priv *priv)
2362 {
2363         eeprom_write_reg(priv, 0);
2364         eeprom_write_reg(priv, EEPROM_BIT_CS);
2365         eeprom_write_reg(priv, EEPROM_BIT_CS | EEPROM_BIT_SK);
2366         eeprom_write_reg(priv, EEPROM_BIT_CS);
2367 }
2368
2369 /* perform a chip select operation */
2370 static inline void eeprom_disable_cs(struct ipw_priv *priv)
2371 {
2372         eeprom_write_reg(priv, EEPROM_BIT_CS);
2373         eeprom_write_reg(priv, 0);
2374         eeprom_write_reg(priv, EEPROM_BIT_SK);
2375 }
2376
2377 /* push a single bit down to the eeprom */
2378 static inline void eeprom_write_bit(struct ipw_priv *p, u8 bit)
2379 {
2380         int d = (bit ? EEPROM_BIT_DI : 0);
2381         eeprom_write_reg(p, EEPROM_BIT_CS | d);
2382         eeprom_write_reg(p, EEPROM_BIT_CS | d | EEPROM_BIT_SK);
2383 }
2384
2385 /* push an opcode followed by an address down to the eeprom */
2386 static void eeprom_op(struct ipw_priv *priv, u8 op, u8 addr)
2387 {
2388         int i;
2389
2390         eeprom_cs(priv);
2391         eeprom_write_bit(priv, 1);
2392         eeprom_write_bit(priv, op & 2);
2393         eeprom_write_bit(priv, op & 1);
2394         for (i = 7; i >= 0; i--) {
2395                 eeprom_write_bit(priv, addr & (1 << i));
2396         }
2397 }
2398
2399 /* pull 16 bits off the eeprom, one bit at a time */
2400 static u16 eeprom_read_u16(struct ipw_priv *priv, u8 addr)
2401 {
2402         int i;
2403         u16 r = 0;
2404
2405         /* Send READ Opcode */
2406         eeprom_op(priv, EEPROM_CMD_READ, addr);
2407
2408         /* Send dummy bit */
2409         eeprom_write_reg(priv, EEPROM_BIT_CS);
2410
2411         /* Read the byte off the eeprom one bit at a time */
2412         for (i = 0; i < 16; i++) {
2413                 u32 data = 0;
2414                 eeprom_write_reg(priv, EEPROM_BIT_CS | EEPROM_BIT_SK);
2415                 eeprom_write_reg(priv, EEPROM_BIT_CS);
2416                 data = ipw_read_reg32(priv, FW_MEM_REG_EEPROM_ACCESS);
2417                 r = (r << 1) | ((data & EEPROM_BIT_DO) ? 1 : 0);
2418         }
2419
2420         /* Send another dummy bit */
2421         eeprom_write_reg(priv, 0);
2422         eeprom_disable_cs(priv);
2423
2424         return r;
2425 }
2426
2427 /* helper function for pulling the mac address out of the private */
2428 /* data's copy of the eeprom data                                 */
2429 static void eeprom_parse_mac(struct ipw_priv *priv, u8 * mac)
2430 {
2431         memcpy(mac, &priv->eeprom[EEPROM_MAC_ADDRESS], 6);
2432 }
2433
2434 /*
2435  * Either the device driver (i.e. the host) or the firmware can
2436  * load eeprom data into the designated region in SRAM.  If neither
2437  * happens then the FW will shutdown with a fatal error.
2438  *
2439  * In order to signal the FW to load the EEPROM, the EEPROM_LOAD_DISABLE
2440  * bit needs region of shared SRAM needs to be non-zero.
2441  */
2442 static void ipw_eeprom_init_sram(struct ipw_priv *priv)
2443 {
2444         int i;
2445         u16 *eeprom = (u16 *) priv->eeprom;
2446
2447         IPW_DEBUG_TRACE(">>\n");
2448
2449         /* read entire contents of eeprom into private buffer */
2450         for (i = 0; i < 128; i++)
2451                 eeprom[i] = le16_to_cpu(eeprom_read_u16(priv, (u8) i));
2452
2453         /*
2454            If the data looks correct, then copy it to our private
2455            copy.  Otherwise let the firmware know to perform the operation
2456            on it's own
2457          */
2458         if ((priv->eeprom + EEPROM_VERSION) != 0) {
2459                 IPW_DEBUG_INFO("Writing EEPROM data into SRAM\n");
2460
2461                 /* write the eeprom data to sram */
2462                 for (i = 0; i < IPW_EEPROM_IMAGE_SIZE; i++)
2463                         ipw_write8(priv, IPW_EEPROM_DATA + i, priv->eeprom[i]);
2464
2465                 /* Do not load eeprom data on fatal error or suspend */
2466                 ipw_write32(priv, IPW_EEPROM_LOAD_DISABLE, 0);
2467         } else {
2468                 IPW_DEBUG_INFO("Enabling FW initializationg of SRAM\n");
2469
2470                 /* Load eeprom data on fatal error or suspend */
2471                 ipw_write32(priv, IPW_EEPROM_LOAD_DISABLE, 1);
2472         }
2473
2474         IPW_DEBUG_TRACE("<<\n");
2475 }
2476
2477 static inline void ipw_zero_memory(struct ipw_priv *priv, u32 start, u32 count)
2478 {
2479         count >>= 2;
2480         if (!count)
2481                 return;
2482         _ipw_write32(priv, IPW_AUTOINC_ADDR, start);
2483         while (count--)
2484                 _ipw_write32(priv, IPW_AUTOINC_DATA, 0);
2485 }
2486
2487 static inline void ipw_fw_dma_reset_command_blocks(struct ipw_priv *priv)
2488 {
2489         ipw_zero_memory(priv, IPW_SHARED_SRAM_DMA_CONTROL,
2490                         CB_NUMBER_OF_ELEMENTS_SMALL *
2491                         sizeof(struct command_block));
2492 }
2493
2494 static int ipw_fw_dma_enable(struct ipw_priv *priv)
2495 {                               /* start dma engine but no transfers yet */
2496
2497         IPW_DEBUG_FW(">> : \n");
2498
2499         /* Start the dma */
2500         ipw_fw_dma_reset_command_blocks(priv);
2501
2502         /* Write CB base address */
2503         ipw_write_reg32(priv, IPW_DMA_I_CB_BASE, IPW_SHARED_SRAM_DMA_CONTROL);
2504
2505         IPW_DEBUG_FW("<< : \n");
2506         return 0;
2507 }
2508
2509 static void ipw_fw_dma_abort(struct ipw_priv *priv)
2510 {
2511         u32 control = 0;
2512
2513         IPW_DEBUG_FW(">> :\n");
2514
2515         //set the Stop and Abort bit
2516         control = DMA_CONTROL_SMALL_CB_CONST_VALUE | DMA_CB_STOP_AND_ABORT;
2517         ipw_write_reg32(priv, IPW_DMA_I_DMA_CONTROL, control);
2518         priv->sram_desc.last_cb_index = 0;
2519
2520         IPW_DEBUG_FW("<< \n");
2521 }
2522
2523 static int ipw_fw_dma_write_command_block(struct ipw_priv *priv, int index,
2524                                           struct command_block *cb)
2525 {
2526         u32 address =
2527             IPW_SHARED_SRAM_DMA_CONTROL +
2528             (sizeof(struct command_block) * index);
2529         IPW_DEBUG_FW(">> :\n");
2530
2531         ipw_write_indirect(priv, address, (u8 *) cb,
2532                            (int)sizeof(struct command_block));
2533
2534         IPW_DEBUG_FW("<< :\n");
2535         return 0;
2536
2537 }
2538
2539 static int ipw_fw_dma_kick(struct ipw_priv *priv)
2540 {
2541         u32 control = 0;
2542         u32 index = 0;
2543
2544         IPW_DEBUG_FW(">> :\n");
2545
2546         for (index = 0; index < priv->sram_desc.last_cb_index; index++)
2547                 ipw_fw_dma_write_command_block(priv, index,
2548                                                &priv->sram_desc.cb_list[index]);
2549
2550         /* Enable the DMA in the CSR register */
2551         ipw_clear_bit(priv, IPW_RESET_REG,
2552                       IPW_RESET_REG_MASTER_DISABLED |
2553                       IPW_RESET_REG_STOP_MASTER);
2554
2555         /* Set the Start bit. */
2556         control = DMA_CONTROL_SMALL_CB_CONST_VALUE | DMA_CB_START;
2557         ipw_write_reg32(priv, IPW_DMA_I_DMA_CONTROL, control);
2558
2559         IPW_DEBUG_FW("<< :\n");
2560         return 0;
2561 }
2562
2563 static void ipw_fw_dma_dump_command_block(struct ipw_priv *priv)
2564 {
2565         u32 address;
2566         u32 register_value = 0;
2567         u32 cb_fields_address = 0;
2568
2569         IPW_DEBUG_FW(">> :\n");
2570         address = ipw_read_reg32(priv, IPW_DMA_I_CURRENT_CB);
2571         IPW_DEBUG_FW_INFO("Current CB is 0x%x \n", address);
2572
2573         /* Read the DMA Controlor register */
2574         register_value = ipw_read_reg32(priv, IPW_DMA_I_DMA_CONTROL);
2575         IPW_DEBUG_FW_INFO("IPW_DMA_I_DMA_CONTROL is 0x%x \n", register_value);
2576
2577         /* Print the CB values */
2578         cb_fields_address = address;
2579         register_value = ipw_read_reg32(priv, cb_fields_address);
2580         IPW_DEBUG_FW_INFO("Current CB ControlField is 0x%x \n", register_value);
2581
2582         cb_fields_address += sizeof(u32);
2583         register_value = ipw_read_reg32(priv, cb_fields_address);
2584         IPW_DEBUG_FW_INFO("Current CB Source Field is 0x%x \n", register_value);
2585
2586         cb_fields_address += sizeof(u32);
2587         register_value = ipw_read_reg32(priv, cb_fields_address);
2588         IPW_DEBUG_FW_INFO("Current CB Destination Field is 0x%x \n",
2589                           register_value);
2590
2591         cb_fields_address += sizeof(u32);
2592         register_value = ipw_read_reg32(priv, cb_fields_address);
2593         IPW_DEBUG_FW_INFO("Current CB Status Field is 0x%x \n", register_value);
2594
2595         IPW_DEBUG_FW(">> :\n");
2596 }
2597
2598 static int ipw_fw_dma_command_block_index(struct ipw_priv *priv)
2599 {
2600         u32 current_cb_address = 0;
2601         u32 current_cb_index = 0;
2602
2603         IPW_DEBUG_FW("<< :\n");
2604         current_cb_address = ipw_read_reg32(priv, IPW_DMA_I_CURRENT_CB);
2605
2606         current_cb_index = (current_cb_address - IPW_SHARED_SRAM_DMA_CONTROL) /
2607             sizeof(struct command_block);
2608
2609         IPW_DEBUG_FW_INFO("Current CB index 0x%x address = 0x%X \n",
2610                           current_cb_index, current_cb_address);
2611
2612         IPW_DEBUG_FW(">> :\n");
2613         return current_cb_index;
2614
2615 }
2616
2617 static int ipw_fw_dma_add_command_block(struct ipw_priv *priv,
2618                                         u32 src_address,
2619                                         u32 dest_address,
2620                                         u32 length,
2621                                         int interrupt_enabled, int is_last)
2622 {
2623
2624         u32 control = CB_VALID | CB_SRC_LE | CB_DEST_LE | CB_SRC_AUTOINC |
2625             CB_SRC_IO_GATED | CB_DEST_AUTOINC | CB_SRC_SIZE_LONG |
2626             CB_DEST_SIZE_LONG;
2627         struct command_block *cb;
2628         u32 last_cb_element = 0;
2629
2630         IPW_DEBUG_FW_INFO("src_address=0x%x dest_address=0x%x length=0x%x\n",
2631                           src_address, dest_address, length);
2632
2633         if (priv->sram_desc.last_cb_index >= CB_NUMBER_OF_ELEMENTS_SMALL)
2634                 return -1;
2635
2636         last_cb_element = priv->sram_desc.last_cb_index;
2637         cb = &priv->sram_desc.cb_list[last_cb_element];
2638         priv->sram_desc.last_cb_index++;
2639
2640         /* Calculate the new CB control word */
2641         if (interrupt_enabled)
2642                 control |= CB_INT_ENABLED;
2643
2644         if (is_last)
2645                 control |= CB_LAST_VALID;
2646
2647         control |= length;
2648
2649         /* Calculate the CB Element's checksum value */
2650         cb->status = control ^ src_address ^ dest_address;
2651
2652         /* Copy the Source and Destination addresses */
2653         cb->dest_addr = dest_address;
2654         cb->source_addr = src_address;
2655
2656         /* Copy the Control Word last */
2657         cb->control = control;
2658
2659         return 0;
2660 }
2661
2662 static int ipw_fw_dma_add_buffer(struct ipw_priv *priv,
2663                                  u32 src_phys, u32 dest_address, u32 length)
2664 {
2665         u32 bytes_left = length;
2666         u32 src_offset = 0;
2667         u32 dest_offset = 0;
2668         int status = 0;
2669         IPW_DEBUG_FW(">> \n");
2670         IPW_DEBUG_FW_INFO("src_phys=0x%x dest_address=0x%x length=0x%x\n",
2671                           src_phys, dest_address, length);
2672         while (bytes_left > CB_MAX_LENGTH) {
2673                 status = ipw_fw_dma_add_command_block(priv,
2674                                                       src_phys + src_offset,
2675                                                       dest_address +
2676                                                       dest_offset,
2677                                                       CB_MAX_LENGTH, 0, 0);
2678                 if (status) {
2679                         IPW_DEBUG_FW_INFO(": Failed\n");
2680                         return -1;
2681                 } else
2682                         IPW_DEBUG_FW_INFO(": Added new cb\n");
2683
2684                 src_offset += CB_MAX_LENGTH;
2685                 dest_offset += CB_MAX_LENGTH;
2686                 bytes_left -= CB_MAX_LENGTH;
2687         }
2688
2689         /* add the buffer tail */
2690         if (bytes_left > 0) {
2691                 status =
2692                     ipw_fw_dma_add_command_block(priv, src_phys + src_offset,
2693                                                  dest_address + dest_offset,
2694                                                  bytes_left, 0, 0);
2695                 if (status) {
2696                         IPW_DEBUG_FW_INFO(": Failed on the buffer tail\n");
2697                         return -1;
2698                 } else
2699                         IPW_DEBUG_FW_INFO
2700                             (": Adding new cb - the buffer tail\n");
2701         }
2702
2703         IPW_DEBUG_FW("<< \n");
2704         return 0;
2705 }
2706
2707 static int ipw_fw_dma_wait(struct ipw_priv *priv)
2708 {
2709         u32 current_index = 0;
2710         u32 watchdog = 0;
2711
2712         IPW_DEBUG_FW(">> : \n");
2713
2714         current_index = ipw_fw_dma_command_block_index(priv);
2715         IPW_DEBUG_FW_INFO("sram_desc.last_cb_index:0x%8X\n",
2716                           (int)priv->sram_desc.last_cb_index);
2717
2718         while (current_index < priv->sram_desc.last_cb_index) {
2719                 udelay(50);
2720                 current_index = ipw_fw_dma_command_block_index(priv);
2721
2722                 watchdog++;
2723
2724                 if (watchdog > 400) {
2725                         IPW_DEBUG_FW_INFO("Timeout\n");
2726                         ipw_fw_dma_dump_command_block(priv);
2727                         ipw_fw_dma_abort(priv);
2728                         return -1;
2729                 }
2730         }
2731
2732         ipw_fw_dma_abort(priv);
2733
2734         /*Disable the DMA in the CSR register */
2735         ipw_set_bit(priv, IPW_RESET_REG,
2736                     IPW_RESET_REG_MASTER_DISABLED | IPW_RESET_REG_STOP_MASTER);
2737
2738         IPW_DEBUG_FW("<< dmaWaitSync \n");
2739         return 0;
2740 }
2741
2742 static void ipw_remove_current_network(struct ipw_priv *priv)
2743 {
2744         struct list_head *element, *safe;
2745         struct ieee80211_network *network = NULL;
2746         unsigned long flags;
2747
2748         spin_lock_irqsave(&priv->ieee->lock, flags);
2749         list_for_each_safe(element, safe, &priv->ieee->network_list) {
2750                 network = list_entry(element, struct ieee80211_network, list);
2751                 if (!memcmp(network->bssid, priv->bssid, ETH_ALEN)) {
2752                         list_del(element);
2753                         list_add_tail(&network->list,
2754                                       &priv->ieee->network_free_list);
2755                 }
2756         }
2757         spin_unlock_irqrestore(&priv->ieee->lock, flags);
2758 }
2759
2760 /**
2761  * Check that card is still alive.
2762  * Reads debug register from domain0.
2763  * If card is present, pre-defined value should
2764  * be found there.
2765  *
2766  * @param priv
2767  * @return 1 if card is present, 0 otherwise
2768  */
2769 static inline int ipw_alive(struct ipw_priv *priv)
2770 {
2771         return ipw_read32(priv, 0x90) == 0xd55555d5;
2772 }
2773
2774 static inline int ipw_poll_bit(struct ipw_priv *priv, u32 addr, u32 mask,
2775                                int timeout)
2776 {
2777         int i = 0;
2778
2779         do {
2780                 if ((ipw_read32(priv, addr) & mask) == mask)
2781                         return i;
2782                 mdelay(10);
2783                 i += 10;
2784         } while (i < timeout);
2785
2786         return -ETIME;
2787 }
2788
2789 /* These functions load the firmware and micro code for the operation of
2790  * the ipw hardware.  It assumes the buffer has all the bits for the
2791  * image and the caller is handling the memory allocation and clean up.
2792  */
2793
2794 static int ipw_stop_master(struct ipw_priv *priv)
2795 {
2796         int rc;
2797
2798         IPW_DEBUG_TRACE(">> \n");
2799         /* stop master. typical delay - 0 */
2800         ipw_set_bit(priv, IPW_RESET_REG, IPW_RESET_REG_STOP_MASTER);
2801
2802         rc = ipw_poll_bit(priv, IPW_RESET_REG,
2803                           IPW_RESET_REG_MASTER_DISABLED, 100);
2804         if (rc < 0) {
2805                 IPW_ERROR("stop master failed in 10ms\n");
2806                 return -1;
2807         }
2808
2809         IPW_DEBUG_INFO("stop master %dms\n", rc);
2810
2811         return rc;
2812 }
2813
2814 static void ipw_arc_release(struct ipw_priv *priv)
2815 {
2816         IPW_DEBUG_TRACE(">> \n");
2817         mdelay(5);
2818
2819         ipw_clear_bit(priv, IPW_RESET_REG, CBD_RESET_REG_PRINCETON_RESET);
2820
2821         /* no one knows timing, for safety add some delay */
2822         mdelay(5);
2823 }
2824
2825 struct fw_header {
2826         u32 version;
2827         u32 mode;
2828 };
2829
2830 struct fw_chunk {
2831         u32 address;
2832         u32 length;
2833 };
2834
2835 #define IPW_FW_MAJOR_VERSION 2
2836 #define IPW_FW_MINOR_VERSION 3
2837
2838 #define IPW_FW_MINOR(x) ((x & 0xff) >> 8)
2839 #define IPW_FW_MAJOR(x) (x & 0xff)
2840
2841 #define IPW_FW_VERSION ((IPW_FW_MINOR_VERSION << 8) | IPW_FW_MAJOR_VERSION)
2842
2843 #define IPW_FW_PREFIX "ipw-" __stringify(IPW_FW_MAJOR_VERSION) \
2844 "." __stringify(IPW_FW_MINOR_VERSION) "-"
2845
2846 #if IPW_FW_MAJOR_VERSION >= 2 && IPW_FW_MINOR_VERSION > 0
2847 #define IPW_FW_NAME(x) IPW_FW_PREFIX "" x ".fw"
2848 #else
2849 #define IPW_FW_NAME(x) "ipw2200_" x ".fw"
2850 #endif
2851
2852 static int ipw_load_ucode(struct ipw_priv *priv, u8 * data, size_t len)
2853 {
2854         int rc = 0, i, addr;
2855         u8 cr = 0;
2856         u16 *image;
2857
2858         image = (u16 *) data;
2859
2860         IPW_DEBUG_TRACE(">> \n");
2861
2862         rc = ipw_stop_master(priv);
2863
2864         if (rc < 0)
2865                 return rc;
2866
2867 //      spin_lock_irqsave(&priv->lock, flags);
2868
2869         for (addr = IPW_SHARED_LOWER_BOUND;
2870              addr < IPW_REGISTER_DOMAIN1_END; addr += 4) {
2871                 ipw_write32(priv, addr, 0);
2872         }
2873
2874         /* no ucode (yet) */
2875         memset(&priv->dino_alive, 0, sizeof(priv->dino_alive));
2876         /* destroy DMA queues */
2877         /* reset sequence */
2878
2879         ipw_write_reg32(priv, IPW_MEM_HALT_AND_RESET, IPW_BIT_HALT_RESET_ON);
2880         ipw_arc_release(priv);
2881         ipw_write_reg32(priv, IPW_MEM_HALT_AND_RESET, IPW_BIT_HALT_RESET_OFF);
2882         mdelay(1);
2883
2884         /* reset PHY */
2885         ipw_write_reg32(priv, IPW_INTERNAL_CMD_EVENT, IPW_BASEBAND_POWER_DOWN);
2886         mdelay(1);
2887
2888         ipw_write_reg32(priv, IPW_INTERNAL_CMD_EVENT, 0);
2889         mdelay(1);
2890
2891         /* enable ucode store */
2892         ipw_write_reg8(priv, DINO_CONTROL_REG, 0x0);
2893         ipw_write_reg8(priv, DINO_CONTROL_REG, DINO_ENABLE_CS);
2894         mdelay(1);
2895
2896         /* write ucode */
2897         /**
2898          * @bug
2899          * Do NOT set indirect address register once and then
2900          * store data to indirect data register in the loop.
2901          * It seems very reasonable, but in this case DINO do not
2902          * accept ucode. It is essential to set address each time.
2903          */
2904         /* load new ipw uCode */
2905         for (i = 0; i < len / 2; i++)
2906                 ipw_write_reg16(priv, IPW_BASEBAND_CONTROL_STORE,
2907                                 cpu_to_le16(image[i]));
2908
2909         /* enable DINO */
2910         ipw_write_reg8(priv, IPW_BASEBAND_CONTROL_STATUS, 0);
2911         ipw_write_reg8(priv, IPW_BASEBAND_CONTROL_STATUS, DINO_ENABLE_SYSTEM);
2912
2913         /* this is where the igx / win driver deveates from the VAP driver. */
2914
2915         /* wait for alive response */
2916         for (i = 0; i < 100; i++) {
2917                 /* poll for incoming data */
2918                 cr = ipw_read_reg8(priv, IPW_BASEBAND_CONTROL_STATUS);
2919                 if (cr & DINO_RXFIFO_DATA)
2920                         break;
2921                 mdelay(1);
2922         }
2923
2924         if (cr & DINO_RXFIFO_DATA) {
2925                 /* alive_command_responce size is NOT multiple of 4 */
2926                 u32 response_buffer[(sizeof(priv->dino_alive) + 3) / 4];
2927
2928                 for (i = 0; i < ARRAY_SIZE(response_buffer); i++)
2929                         response_buffer[i] =
2930                             le32_to_cpu(ipw_read_reg32(priv,
2931                                                        IPW_BASEBAND_RX_FIFO_READ));
2932                 memcpy(&priv->dino_alive, response_buffer,
2933                        sizeof(priv->dino_alive));
2934                 if (priv->dino_alive.alive_command == 1
2935                     && priv->dino_alive.ucode_valid == 1) {
2936                         rc = 0;
2937                         IPW_DEBUG_INFO
2938                             ("Microcode OK, rev. %d (0x%x) dev. %d (0x%x) "
2939                              "of %02d/%02d/%02d %02d:%02d\n",
2940                              priv->dino_alive.software_revision,
2941                              priv->dino_alive.software_revision,
2942                              priv->dino_alive.device_identifier,
2943                              priv->dino_alive.device_identifier,
2944                              priv->dino_alive.time_stamp[0],
2945                              priv->dino_alive.time_stamp[1],
2946                              priv->dino_alive.time_stamp[2],
2947                              priv->dino_alive.time_stamp[3],
2948                              priv->dino_alive.time_stamp[4]);
2949                 } else {
2950                         IPW_DEBUG_INFO("Microcode is not alive\n");
2951                         rc = -EINVAL;
2952                 }
2953         } else {
2954                 IPW_DEBUG_INFO("No alive response from DINO\n");
2955                 rc = -ETIME;
2956         }
2957
2958         /* disable DINO, otherwise for some reason
2959            firmware have problem getting alive resp. */
2960         ipw_write_reg8(priv, IPW_BASEBAND_CONTROL_STATUS, 0);
2961
2962 //      spin_unlock_irqrestore(&priv->lock, flags);
2963
2964         return rc;
2965 }
2966
2967 static int ipw_load_firmware(struct ipw_priv *priv, u8 * data, size_t len)
2968 {
2969         int rc = -1;
2970         int offset = 0;
2971         struct fw_chunk *chunk;
2972         dma_addr_t shared_phys;
2973         u8 *shared_virt;
2974
2975         IPW_DEBUG_TRACE("<< : \n");
2976         shared_virt = pci_alloc_consistent(priv->pci_dev, len, &shared_phys);
2977
2978         if (!shared_virt)
2979                 return -ENOMEM;
2980
2981         memmove(shared_virt, data, len);
2982
2983         /* Start the Dma */
2984         rc = ipw_fw_dma_enable(priv);
2985
2986         if (priv->sram_desc.last_cb_index > 0) {
2987                 /* the DMA is already ready this would be a bug. */
2988                 BUG();
2989                 goto out;
2990         }
2991
2992         do {
2993                 chunk = (struct fw_chunk *)(data + offset);
2994                 offset += sizeof(struct fw_chunk);
2995                 /* build DMA packet and queue up for sending */
2996                 /* dma to chunk->address, the chunk->length bytes from data +
2997                  * offeset*/
2998                 /* Dma loading */
2999                 rc = ipw_fw_dma_add_buffer(priv, shared_phys + offset,
3000                                            le32_to_cpu(chunk->address),
3001                                            le32_to_cpu(chunk->length));
3002                 if (rc) {
3003                         IPW_DEBUG_INFO("dmaAddBuffer Failed\n");
3004                         goto out;
3005                 }
3006
3007                 offset += le32_to_cpu(chunk->length);
3008         } while (offset < len);
3009
3010         /* Run the DMA and wait for the answer */
3011         rc = ipw_fw_dma_kick(priv);
3012         if (rc) {
3013                 IPW_ERROR("dmaKick Failed\n");
3014                 goto out;
3015         }
3016
3017         rc = ipw_fw_dma_wait(priv);
3018         if (rc) {
3019                 IPW_ERROR("dmaWaitSync Failed\n");
3020                 goto out;
3021         }
3022       out:
3023         pci_free_consistent(priv->pci_dev, len, shared_virt, shared_phys);
3024         return rc;
3025 }
3026
3027 /* stop nic */
3028 static int ipw_stop_nic(struct ipw_priv *priv)
3029 {
3030         int rc = 0;
3031
3032         /* stop */
3033         ipw_write32(priv, IPW_RESET_REG, IPW_RESET_REG_STOP_MASTER);
3034
3035         rc = ipw_poll_bit(priv, IPW_RESET_REG,
3036                           IPW_RESET_REG_MASTER_DISABLED, 500);
3037         if (rc < 0) {
3038                 IPW_ERROR("wait for reg master disabled failed\n");
3039                 return rc;
3040         }
3041
3042         ipw_set_bit(priv, IPW_RESET_REG, CBD_RESET_REG_PRINCETON_RESET);
3043
3044         return rc;
3045 }
3046
3047 static void ipw_start_nic(struct ipw_priv *priv)
3048 {
3049         IPW_DEBUG_TRACE(">>\n");
3050
3051         /* prvHwStartNic  release ARC */
3052         ipw_clear_bit(priv, IPW_RESET_REG,
3053                       IPW_RESET_REG_MASTER_DISABLED |
3054                       IPW_RESET_REG_STOP_MASTER |
3055                       CBD_RESET_REG_PRINCETON_RESET);
3056
3057         /* enable power management */
3058         ipw_set_bit(priv, IPW_GP_CNTRL_RW,
3059                     IPW_GP_CNTRL_BIT_HOST_ALLOWS_STANDBY);
3060
3061         IPW_DEBUG_TRACE("<<\n");
3062 }
3063
3064 static int ipw_init_nic(struct ipw_priv *priv)
3065 {
3066         int rc;
3067
3068         IPW_DEBUG_TRACE(">>\n");
3069         /* reset */
3070         /*prvHwInitNic */
3071         /* set "initialization complete" bit to move adapter to D0 state */
3072         ipw_set_bit(priv, IPW_GP_CNTRL_RW, IPW_GP_CNTRL_BIT_INIT_DONE);
3073
3074         /* low-level PLL activation */
3075         ipw_write32(priv, IPW_READ_INT_REGISTER,
3076                     IPW_BIT_INT_HOST_SRAM_READ_INT_REGISTER);
3077
3078         /* wait for clock stabilization */
3079         rc = ipw_poll_bit(priv, IPW_GP_CNTRL_RW,
3080                           IPW_GP_CNTRL_BIT_CLOCK_READY, 250);
3081         if (rc < 0)
3082                 IPW_DEBUG_INFO("FAILED wait for clock stablization\n");
3083
3084         /* assert SW reset */
3085         ipw_set_bit(priv, IPW_RESET_REG, IPW_RESET_REG_SW_RESET);
3086
3087         udelay(10);
3088
3089         /* set "initialization complete" bit to move adapter to D0 state */
3090         ipw_set_bit(priv, IPW_GP_CNTRL_RW, IPW_GP_CNTRL_BIT_INIT_DONE);
3091
3092         IPW_DEBUG_TRACE(">>\n");
3093         return 0;
3094 }
3095
3096 /* Call this function from process context, it will sleep in request_firmware.
3097  * Probe is an ok place to call this from.
3098  */
3099 static int ipw_reset_nic(struct ipw_priv *priv)
3100 {
3101         int rc = 0;
3102         unsigned long flags;
3103
3104         IPW_DEBUG_TRACE(">>\n");
3105
3106         rc = ipw_init_nic(priv);
3107
3108         spin_lock_irqsave(&priv->lock, flags);
3109         /* Clear the 'host command active' bit... */
3110         priv->status &= ~STATUS_HCMD_ACTIVE;
3111         wake_up_interruptible(&priv->wait_command_queue);
3112         priv->status &= ~(STATUS_SCANNING | STATUS_SCAN_ABORTING);
3113         wake_up_interruptible(&priv->wait_state);
3114         spin_unlock_irqrestore(&priv->lock, flags);
3115
3116         IPW_DEBUG_TRACE("<<\n");
3117         return rc;
3118 }
3119
3120 static int ipw_get_fw(struct ipw_priv *priv,
3121                       const struct firmware **fw, const char *name)
3122 {
3123         struct fw_header *header;
3124         int rc;
3125
3126         /* ask firmware_class module to get the boot firmware off disk */
3127         rc = request_firmware(fw, name, &priv->pci_dev->dev);
3128         if (rc < 0) {
3129                 IPW_ERROR("%s load failed: Reason %d\n", name, rc);
3130                 return rc;
3131         }
3132
3133         header = (struct fw_header *)(*fw)->data;
3134         if (IPW_FW_MAJOR(le32_to_cpu(header->version)) != IPW_FW_MAJOR_VERSION) {
3135                 IPW_ERROR("'%s' firmware version not compatible (%d != %d)\n",
3136                           name,
3137                           IPW_FW_MAJOR(le32_to_cpu(header->version)),
3138                           IPW_FW_MAJOR_VERSION);
3139                 return -EINVAL;
3140         }
3141
3142         IPW_DEBUG_INFO("Loading firmware '%s' file v%d.%d (%zd bytes)\n",
3143                        name,
3144                        IPW_FW_MAJOR(le32_to_cpu(header->version)),
3145                        IPW_FW_MINOR(le32_to_cpu(header->version)),
3146                        (*fw)->size - sizeof(struct fw_header));
3147         return 0;
3148 }
3149
3150 #define IPW_RX_BUF_SIZE (3000)
3151
3152 static inline void ipw_rx_queue_reset(struct ipw_priv *priv,
3153                                       struct ipw_rx_queue *rxq)
3154 {
3155         unsigned long flags;
3156         int i;
3157
3158         spin_lock_irqsave(&rxq->lock, flags);
3159
3160         INIT_LIST_HEAD(&rxq->rx_free);
3161         INIT_LIST_HEAD(&rxq->rx_used);
3162
3163         /* Fill the rx_used queue with _all_ of the Rx buffers */
3164         for (i = 0; i < RX_FREE_BUFFERS + RX_QUEUE_SIZE; i++) {
3165                 /* In the reset function, these buffers may have been allocated
3166                  * to an SKB, so we need to unmap and free potential storage */
3167                 if (rxq->pool[i].skb != NULL) {
3168                         pci_unmap_single(priv->pci_dev, rxq->pool[i].dma_addr,
3169                                          IPW_RX_BUF_SIZE, PCI_DMA_FROMDEVICE);
3170                         dev_kfree_skb(rxq->pool[i].skb);
3171                         rxq->pool[i].skb = NULL;
3172                 }
3173                 list_add_tail(&rxq->pool[i].list, &rxq->rx_used);
3174         }
3175
3176         /* Set us so that we have processed and used all buffers, but have
3177          * not restocked the Rx queue with fresh buffers */
3178         rxq->read = rxq->write = 0;
3179         rxq->processed = RX_QUEUE_SIZE - 1;
3180         rxq->free_count = 0;
3181         spin_unlock_irqrestore(&rxq->lock, flags);
3182 }
3183
3184 #ifdef CONFIG_PM
3185 static int fw_loaded = 0;
3186 static const struct firmware *bootfw = NULL;
3187 static const struct firmware *firmware = NULL;
3188 static const struct firmware *ucode = NULL;
3189
3190 static void free_firmware(void)
3191 {
3192         if (fw_loaded) {
3193                 release_firmware(bootfw);
3194                 release_firmware(ucode);
3195                 release_firmware(firmware);
3196                 bootfw = ucode = firmware = NULL;
3197                 fw_loaded = 0;
3198         }
3199 }
3200 #else
3201 #define free_firmware() do {} while (0)
3202 #endif
3203
3204 static int ipw_load(struct ipw_priv *priv)
3205 {
3206 #ifndef CONFIG_PM
3207         const struct firmware *bootfw = NULL;
3208         const struct firmware *firmware = NULL;
3209         const struct firmware *ucode = NULL;
3210 #endif
3211         int rc = 0, retries = 3;
3212
3213 #ifdef CONFIG_PM
3214         if (!fw_loaded) {
3215 #endif
3216                 rc = ipw_get_fw(priv, &bootfw, IPW_FW_NAME("boot"));
3217                 if (rc)
3218                         goto error;
3219
3220                 switch (priv->ieee->iw_mode) {
3221                 case IW_MODE_ADHOC:
3222                         rc = ipw_get_fw(priv, &ucode,
3223                                         IPW_FW_NAME("ibss_ucode"));
3224                         if (rc)
3225                                 goto error;
3226
3227                         rc = ipw_get_fw(priv, &firmware, IPW_FW_NAME("ibss"));
3228                         break;
3229
3230 #ifdef CONFIG_IPW2200_MONITOR
3231                 case IW_MODE_MONITOR:
3232                         rc = ipw_get_fw(priv, &ucode,
3233                                         IPW_FW_NAME("sniffer_ucode"));
3234                         if (rc)
3235                                 goto error;
3236
3237                         rc = ipw_get_fw(priv, &firmware,
3238                                         IPW_FW_NAME("sniffer"));
3239                         break;
3240 #endif
3241                 case IW_MODE_INFRA:
3242                         rc = ipw_get_fw(priv, &ucode, IPW_FW_NAME("bss_ucode"));
3243                         if (rc)
3244                                 goto error;
3245
3246                         rc = ipw_get_fw(priv, &firmware, IPW_FW_NAME("bss"));
3247                         break;
3248
3249                 default:
3250                         rc = -EINVAL;
3251                 }
3252
3253                 if (rc)
3254                         goto error;
3255
3256 #ifdef CONFIG_PM
3257                 fw_loaded = 1;
3258         }
3259 #endif
3260
3261         if (!priv->rxq)
3262                 priv->rxq = ipw_rx_queue_alloc(priv);
3263         else
3264                 ipw_rx_queue_reset(priv, priv->rxq);
3265         if (!priv->rxq) {
3266                 IPW_ERROR("Unable to initialize Rx queue\n");
3267                 goto error;
3268         }
3269
3270       retry:
3271         /* Ensure interrupts are disabled */
3272         ipw_write32(priv, IPW_INTA_MASK_R, ~IPW_INTA_MASK_ALL);
3273         priv->status &= ~STATUS_INT_ENABLED;
3274
3275         /* ack pending interrupts */
3276         ipw_write32(priv, IPW_INTA_RW, IPW_INTA_MASK_ALL);
3277
3278         ipw_stop_nic(priv);
3279
3280         rc = ipw_reset_nic(priv);
3281         if (rc) {
3282                 IPW_ERROR("Unable to reset NIC\n");
3283                 goto error;
3284         }
3285
3286         ipw_zero_memory(priv, IPW_NIC_SRAM_LOWER_BOUND,
3287                         IPW_NIC_SRAM_UPPER_BOUND - IPW_NIC_SRAM_LOWER_BOUND);
3288
3289         /* DMA the initial boot firmware into the device */
3290         rc = ipw_load_firmware(priv, bootfw->data + sizeof(struct fw_header),
3291                                bootfw->size - sizeof(struct fw_header));
3292         if (rc < 0) {
3293                 IPW_ERROR("Unable to load boot firmware: %d\n", rc);
3294                 goto error;
3295         }
3296
3297         /* kick start the device */
3298         ipw_start_nic(priv);
3299
3300         /* wait for the device to finish it's initial startup sequence */
3301         rc = ipw_poll_bit(priv, IPW_INTA_RW,
3302                           IPW_INTA_BIT_FW_INITIALIZATION_DONE, 500);
3303         if (rc < 0) {
3304                 IPW_ERROR("device failed to boot initial fw image\n");
3305                 goto error;
3306         }
3307         IPW_DEBUG_INFO("initial device response after %dms\n", rc);
3308
3309         /* ack fw init done interrupt */
3310         ipw_write32(priv, IPW_INTA_RW, IPW_INTA_BIT_FW_INITIALIZATION_DONE);
3311
3312         /* DMA the ucode into the device */
3313         rc = ipw_load_ucode(priv, ucode->data + sizeof(struct fw_header),
3314                             ucode->size - sizeof(struct fw_header));
3315         if (rc < 0) {
3316                 IPW_ERROR("Unable to load ucode: %d\n", rc);
3317                 goto error;
3318         }
3319
3320         /* stop nic */
3321         ipw_stop_nic(priv);
3322
3323         /* DMA bss firmware into the device */
3324         rc = ipw_load_firmware(priv, firmware->data +
3325                                sizeof(struct fw_header),
3326                                firmware->size - sizeof(struct fw_header));
3327         if (rc < 0) {
3328                 IPW_ERROR("Unable to load firmware: %d\n", rc);
3329                 goto error;
3330         }
3331
3332         ipw_write32(priv, IPW_EEPROM_LOAD_DISABLE, 0);
3333
3334         rc = ipw_queue_reset(priv);
3335         if (rc) {
3336                 IPW_ERROR("Unable to initialize queues\n");
3337                 goto error;
3338         }
3339
3340         /* Ensure interrupts are disabled */
3341         ipw_write32(priv, IPW_INTA_MASK_R, ~IPW_INTA_MASK_ALL);
3342         /* ack pending interrupts */
3343         ipw_write32(priv, IPW_INTA_RW, IPW_INTA_MASK_ALL);
3344
3345         /* kick start the device */
3346         ipw_start_nic(priv);
3347
3348         if (ipw_read32(priv, IPW_INTA_RW) & IPW_INTA_BIT_PARITY_ERROR) {
3349                 if (retries > 0) {
3350                         IPW_WARNING("Parity error.  Retrying init.\n");
3351                         retries--;
3352                         goto retry;
3353                 }
3354
3355                 IPW_ERROR("TODO: Handle parity error -- schedule restart?\n");
3356                 rc = -EIO;
3357                 goto error;
3358         }
3359
3360         /* wait for the device */
3361         rc = ipw_poll_bit(priv, IPW_INTA_RW,
3362                           IPW_INTA_BIT_FW_INITIALIZATION_DONE, 500);
3363         if (rc < 0) {
3364                 IPW_ERROR("device failed to start after 500ms\n");
3365                 goto error;
3366         }
3367         IPW_DEBUG_INFO("device response after %dms\n", rc);
3368
3369         /* ack fw init done interrupt */
3370         ipw_write32(priv, IPW_INTA_RW, IPW_INTA_BIT_FW_INITIALIZATION_DONE);
3371
3372         /* read eeprom data and initialize the eeprom region of sram */
3373         priv->eeprom_delay = 1;
3374         ipw_eeprom_init_sram(priv);
3375
3376         /* enable interrupts */
3377         ipw_enable_interrupts(priv);
3378
3379         /* Ensure our queue has valid packets */
3380         ipw_rx_queue_replenish(priv);
3381
3382         ipw_write32(priv, IPW_RX_READ_INDEX, priv->rxq->read);
3383
3384         /* ack pending interrupts */
3385         ipw_write32(priv, IPW_INTA_RW, IPW_INTA_MASK_ALL);
3386
3387 #ifndef CONFIG_PM
3388         release_firmware(bootfw);
3389         release_firmware(ucode);
3390         release_firmware(firmware);
3391 #endif
3392         return 0;
3393
3394       error:
3395         if (priv->rxq) {
3396                 ipw_rx_queue_free(priv, priv->rxq);
3397                 priv->rxq = NULL;
3398         }
3399         ipw_tx_queue_free(priv);
3400         if (bootfw)
3401                 release_firmware(bootfw);
3402         if (ucode)
3403                 release_firmware(ucode);
3404         if (firmware)
3405                 release_firmware(firmware);
3406 #ifdef CONFIG_PM
3407         fw_loaded = 0;
3408         bootfw = ucode = firmware = NULL;
3409 #endif
3410
3411         return rc;
3412 }
3413
3414 /**
3415  * DMA services
3416  *
3417  * Theory of operation
3418  *
3419  * A queue is a circular buffers with 'Read' and 'Write' pointers.
3420  * 2 empty entries always kept in the buffer to protect from overflow.
3421  *
3422  * For Tx queue, there are low mark and high mark limits. If, after queuing
3423  * the packet for Tx, free space become < low mark, Tx queue stopped. When
3424  * reclaiming packets (on 'tx done IRQ), if free space become > high mark,
3425  * Tx queue resumed.
3426  *
3427  * The IPW operates with six queues, one receive queue in the device's
3428  * sram, one transmit queue for sending commands to the device firmware,
3429  * and four transmit queues for data.
3430  *
3431  * The four transmit queues allow for performing quality of service (qos)
3432  * transmissions as per the 802.11 protocol.  Currently Linux does not
3433  * provide a mechanism to the user for utilizing prioritized queues, so
3434  * we only utilize the first data transmit queue (queue1).
3435  */
3436
3437 /**
3438  * Driver allocates buffers of this size for Rx
3439  */
3440
3441 static inline int ipw_queue_space(const struct clx2_queue *q)
3442 {
3443         int s = q->last_used - q->first_empty;
3444         if (s <= 0)
3445                 s += q->n_bd;
3446         s -= 2;                 /* keep some reserve to not confuse empty and full situations */
3447         if (s < 0)
3448                 s = 0;
3449         return s;
3450 }
3451
3452 static inline int ipw_queue_inc_wrap(int index, int n_bd)
3453 {
3454         return (++index == n_bd) ? 0 : index;
3455 }
3456
3457 /**
3458  * Initialize common DMA queue structure
3459  *
3460  * @param q                queue to init
3461  * @param count            Number of BD's to allocate. Should be power of 2
3462  * @param read_register    Address for 'read' register
3463  *                         (not offset within BAR, full address)
3464  * @param write_register   Address for 'write' register
3465  *                         (not offset within BAR, full address)
3466  * @param base_register    Address for 'base' register
3467  *                         (not offset within BAR, full address)
3468  * @param size             Address for 'size' register
3469  *                         (not offset within BAR, full address)
3470  */
3471 static void ipw_queue_init(struct ipw_priv *priv, struct clx2_queue *q,
3472                            int count, u32 read, u32 write, u32 base, u32 size)
3473 {
3474         q->n_bd = count;
3475
3476         q->low_mark = q->n_bd / 4;
3477         if (q->low_mark < 4)
3478                 q->low_mark = 4;
3479
3480         q->high_mark = q->n_bd / 8;
3481         if (q->high_mark < 2)
3482                 q->high_mark = 2;
3483
3484         q->first_empty = q->last_used = 0;
3485         q->reg_r = read;
3486         q->reg_w = write;
3487
3488         ipw_write32(priv, base, q->dma_addr);
3489         ipw_write32(priv, size, count);
3490         ipw_write32(priv, read, 0);
3491         ipw_write32(priv, write, 0);
3492
3493         _ipw_read32(priv, 0x90);
3494 }
3495
3496 static int ipw_queue_tx_init(struct ipw_priv *priv,
3497                              struct clx2_tx_queue *q,
3498                              int count, u32 read, u32 write, u32 base, u32 size)
3499 {
3500         struct pci_dev *dev = priv->pci_dev;
3501
3502         q->txb = kmalloc(sizeof(q->txb[0]) * count, GFP_KERNEL);
3503         if (!q->txb) {
3504                 IPW_ERROR("vmalloc for auxilary BD structures failed\n");
3505                 return -ENOMEM;
3506         }
3507
3508         q->bd =
3509             pci_alloc_consistent(dev, sizeof(q->bd[0]) * count, &q->q.dma_addr);
3510         if (!q->bd) {
3511                 IPW_ERROR("pci_alloc_consistent(%zd) failed\n",
3512                           sizeof(q->bd[0]) * count);
3513                 kfree(q->txb);
3514                 q->txb = NULL;
3515                 return -ENOMEM;
3516         }
3517
3518         ipw_queue_init(priv, &q->q, count, read, write, base, size);
3519         return 0;
3520 }
3521
3522 /**
3523  * Free one TFD, those at index [txq->q.last_used].
3524  * Do NOT advance any indexes
3525  *
3526  * @param dev
3527  * @param txq
3528  */
3529 static void ipw_queue_tx_free_tfd(struct ipw_priv *priv,
3530                                   struct clx2_tx_queue *txq)
3531 {
3532         struct tfd_frame *bd = &txq->bd[txq->q.last_used];
3533         struct pci_dev *dev = priv->pci_dev;
3534         int i;
3535
3536         /* classify bd */
3537         if (bd->control_flags.message_type == TX_HOST_COMMAND_TYPE)
3538                 /* nothing to cleanup after for host commands */
3539                 return;
3540
3541         /* sanity check */
3542         if (le32_to_cpu(bd->u.data.num_chunks) > NUM_TFD_CHUNKS) {
3543                 IPW_ERROR("Too many chunks: %i\n",
3544                           le32_to_cpu(bd->u.data.num_chunks));
3545                 /** @todo issue fatal error, it is quite serious situation */
3546                 return;
3547         }
3548
3549         /* unmap chunks if any */
3550         for (i = 0; i < le32_to_cpu(bd->u.data.num_chunks); i++) {
3551                 pci_unmap_single(dev, le32_to_cpu(bd->u.data.chunk_ptr[i]),
3552                                  le16_to_cpu(bd->u.data.chunk_len[i]),
3553                                  PCI_DMA_TODEVICE);
3554                 if (txq->txb[txq->q.last_used]) {
3555                         ieee80211_txb_free(txq->txb[txq->q.last_used]);
3556                         txq->txb[txq->q.last_used] = NULL;
3557                 }
3558         }
3559 }
3560
3561 /**
3562  * Deallocate DMA queue.
3563  *
3564  * Empty queue by removing and destroying all BD's.
3565  * Free all buffers.
3566  *
3567  * @param dev
3568  * @param q
3569  */
3570 static void ipw_queue_tx_free(struct ipw_priv *priv, struct clx2_tx_queue *txq)
3571 {
3572         struct clx2_queue *q = &txq->q;
3573         struct pci_dev *dev = priv->pci_dev;
3574
3575         if (q->n_bd == 0)
3576                 return;
3577
3578         /* first, empty all BD's */
3579         for (; q->first_empty != q->last_used;
3580              q->last_used = ipw_queue_inc_wrap(q->last_used, q->n_bd)) {
3581                 ipw_queue_tx_free_tfd(priv, txq);
3582         }
3583
3584         /* free buffers belonging to queue itself */
3585         pci_free_consistent(dev, sizeof(txq->bd[0]) * q->n_bd, txq->bd,
3586                             q->dma_addr);
3587         kfree(txq->txb);
3588
3589         /* 0 fill whole structure */
3590         memset(txq, 0, sizeof(*txq));
3591 }
3592
3593 /**
3594  * Destroy all DMA queues and structures
3595  *
3596  * @param priv
3597  */
3598 static void ipw_tx_queue_free(struct ipw_priv *priv)
3599 {
3600         /* Tx CMD queue */
3601         ipw_queue_tx_free(priv, &priv->txq_cmd);
3602
3603         /* Tx queues */
3604         ipw_queue_tx_free(priv, &priv->txq[0]);
3605         ipw_queue_tx_free(priv, &priv->txq[1]);
3606         ipw_queue_tx_free(priv, &priv->txq[2]);
3607         ipw_queue_tx_free(priv, &priv->txq[3]);
3608 }
3609
3610 static inline void ipw_create_bssid(struct ipw_priv *priv, u8 * bssid)
3611 {
3612         /* First 3 bytes are manufacturer */
3613         bssid[0] = priv->mac_addr[0];
3614         bssid[1] = priv->mac_addr[1];
3615         bssid[2] = priv->mac_addr[2];
3616
3617         /* Last bytes are random */
3618         get_random_bytes(&bssid[3], ETH_ALEN - 3);
3619
3620         bssid[0] &= 0xfe;       /* clear multicast bit */
3621         bssid[0] |= 0x02;       /* set local assignment bit (IEEE802) */
3622 }
3623
3624 static inline u8 ipw_add_station(struct ipw_priv *priv, u8 * bssid)
3625 {
3626         struct ipw_station_entry entry;
3627         int i;
3628
3629         for (i = 0; i < priv->num_stations; i++) {
3630                 if (!memcmp(priv->stations[i], bssid, ETH_ALEN)) {
3631                         /* Another node is active in network */
3632                         priv->missed_adhoc_beacons = 0;
3633                         if (!(priv->config & CFG_STATIC_CHANNEL))
3634                                 /* when other nodes drop out, we drop out */
3635                                 priv->config &= ~CFG_ADHOC_PERSIST;
3636
3637                         return i;
3638                 }
3639         }
3640
3641         if (i == MAX_STATIONS)
3642                 return IPW_INVALID_STATION;
3643
3644         IPW_DEBUG_SCAN("Adding AdHoc station: " MAC_FMT "\n", MAC_ARG(bssid));
3645
3646         entry.reserved = 0;
3647         entry.support_mode = 0;
3648         memcpy(entry.mac_addr, bssid, ETH_ALEN);
3649         memcpy(priv->stations[i], bssid, ETH_ALEN);
3650         ipw_write_direct(priv, IPW_STATION_TABLE_LOWER + i * sizeof(entry),
3651                          &entry, sizeof(entry));
3652         priv->num_stations++;
3653
3654         return i;
3655 }
3656
3657 static inline u8 ipw_find_station(struct ipw_priv *priv, u8 * bssid)
3658 {
3659         int i;
3660
3661         for (i = 0; i < priv->num_stations; i++)
3662                 if (!memcmp(priv->stations[i], bssid, ETH_ALEN))
3663                         return i;
3664
3665         return IPW_INVALID_STATION;
3666 }
3667
3668 static void ipw_send_disassociate(struct ipw_priv *priv, int quiet)
3669 {
3670         int err;
3671
3672         if (priv->status & STATUS_ASSOCIATING) {
3673                 IPW_DEBUG_ASSOC("Disassociating while associating.\n");
3674                 queue_work(priv->workqueue, &priv->disassociate);
3675                 return;
3676         }
3677
3678         if (!(priv->status & STATUS_ASSOCIATED)) {
3679                 IPW_DEBUG_ASSOC("Disassociating while not associated.\n");
3680                 return;
3681         }
3682
3683         IPW_DEBUG_ASSOC("Disassocation attempt from " MAC_FMT " "
3684                         "on channel %d.\n",
3685                         MAC_ARG(priv->assoc_request.bssid),
3686                         priv->assoc_request.channel);
3687
3688         priv->status &= ~(STATUS_ASSOCIATING | STATUS_ASSOCIATED);
3689         priv->status |= STATUS_DISASSOCIATING;
3690
3691         if (quiet)
3692                 priv->assoc_request.assoc_type = HC_DISASSOC_QUIET;
3693         else
3694                 priv->assoc_request.assoc_type = HC_DISASSOCIATE;
3695
3696         err = ipw_send_associate(priv, &priv->assoc_request);
3697         if (err) {
3698                 IPW_DEBUG_HC("Attempt to send [dis]associate command "
3699                              "failed.\n");
3700                 return;
3701         }
3702
3703 }
3704
3705 static int ipw_disassociate(void *data)
3706 {
3707         struct ipw_priv *priv = data;
3708         if (!(priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING)))
3709                 return 0;
3710         ipw_send_disassociate(data, 0);
3711         return 1;
3712 }
3713
3714 static void ipw_bg_disassociate(void *data)
3715 {
3716         struct ipw_priv *priv = data;
3717         down(&priv->sem);
3718         ipw_disassociate(data);
3719         up(&priv->sem);
3720 }
3721
3722 static void ipw_system_config(void *data)
3723 {
3724         struct ipw_priv *priv = data;
3725         ipw_send_system_config(priv, &priv->sys_config);
3726 }
3727
3728 struct ipw_status_code {
3729         u16 status;
3730         const char *reason;
3731 };
3732
3733 static const struct ipw_status_code ipw_status_codes[] = {
3734         {0x00, "Successful"},
3735         {0x01, "Unspecified failure"},
3736         {0x0A, "Cannot support all requested capabilities in the "
3737          "Capability information field"},
3738         {0x0B, "Reassociation denied due to inability to confirm that "
3739          "association exists"},
3740         {0x0C, "Association denied due to reason outside the scope of this "
3741          "standard"},
3742         {0x0D,
3743          "Responding station does not support the specified authentication "
3744          "algorithm"},
3745         {0x0E,
3746          "Received an Authentication frame with authentication sequence "
3747          "transaction sequence number out of expected sequence"},
3748         {0x0F, "Authentication rejected because of challenge failure"},
3749         {0x10, "Authentication rejected due to timeout waiting for next "
3750          "frame in sequence"},
3751         {0x11, "Association denied because AP is unable to handle additional "
3752          "associated stations"},
3753         {0x12,
3754          "Association denied due to requesting station not supporting all "
3755          "of the datarates in the BSSBasicServiceSet Parameter"},
3756         {0x13,
3757          "Association denied due to requesting station not supporting "
3758          "short preamble operation"},
3759         {0x14,
3760          "Association denied due to requesting station not supporting "
3761          "PBCC encoding"},
3762         {0x15,
3763          "Association denied due to requesting station not supporting "
3764          "channel agility"},
3765         {0x19,
3766          "Association denied due to requesting station not supporting "
3767          "short slot operation"},
3768         {0x1A,
3769          "Association denied due to requesting station not supporting "
3770          "DSSS-OFDM operation"},
3771         {0x28, "Invalid Information Element"},
3772         {0x29, "Group Cipher is not valid"},
3773         {0x2A, "Pairwise Cipher is not valid"},
3774         {0x2B, "AKMP is not valid"},
3775         {0x2C, "Unsupported RSN IE version"},
3776         {0x2D, "Invalid RSN IE Capabilities"},
3777         {0x2E, "Cipher suite is rejected per security policy"},
3778 };
3779
3780 #ifdef CONFIG_IPW_DEBUG
3781 static const char *ipw_get_status_code(u16 status)
3782 {
3783         int i;
3784         for (i = 0; i < ARRAY_SIZE(ipw_status_codes); i++)
3785                 if (ipw_status_codes[i].status == (status & 0xff))
3786                         return ipw_status_codes[i].reason;
3787         return "Unknown status value.";
3788 }
3789 #endif
3790
3791 static void inline average_init(struct average *avg)
3792 {
3793         memset(avg, 0, sizeof(*avg));
3794 }
3795
3796 static void inline average_add(struct average *avg, s16 val)
3797 {
3798         avg->sum -= avg->entries[avg->pos];
3799         avg->sum += val;
3800         avg->entries[avg->pos++] = val;
3801         if (unlikely(avg->pos == AVG_ENTRIES)) {
3802                 avg->init = 1;
3803                 avg->pos = 0;
3804         }
3805 }
3806
3807 static s16 inline average_value(struct average *avg)
3808 {
3809         if (!unlikely(avg->init)) {
3810                 if (avg->pos)
3811                         return avg->sum / avg->pos;
3812                 return 0;
3813         }
3814
3815         return avg->sum / AVG_ENTRIES;
3816 }
3817
3818 static void ipw_reset_stats(struct ipw_priv *priv)
3819 {
3820         u32 len = sizeof(u32);
3821
3822         priv->quality = 0;
3823
3824         average_init(&priv->average_missed_beacons);
3825         average_init(&priv->average_rssi);
3826         average_init(&priv->average_noise);
3827
3828         priv->last_rate = 0;
3829         priv->last_missed_beacons = 0;
3830         priv->last_rx_packets = 0;
3831         priv->last_tx_packets = 0;
3832         priv->last_tx_failures = 0;
3833
3834         /* Firmware managed, reset only when NIC is restarted, so we have to
3835          * normalize on the current value */
3836         ipw_get_ordinal(priv, IPW_ORD_STAT_RX_ERR_CRC,
3837                         &priv->last_rx_err, &len);
3838         ipw_get_ordinal(priv, IPW_ORD_STAT_TX_FAILURE,
3839                         &priv->last_tx_failures, &len);
3840
3841         /* Driver managed, reset with each association */
3842         priv->missed_adhoc_beacons = 0;
3843         priv->missed_beacons = 0;
3844         priv->tx_packets = 0;
3845         priv->rx_packets = 0;
3846
3847 }
3848
3849 static inline u32 ipw_get_max_rate(struct ipw_priv *priv)
3850 {
3851         u32 i = 0x80000000;
3852         u32 mask = priv->rates_mask;
3853         /* If currently associated in B mode, restrict the maximum
3854          * rate match to B rates */
3855         if (priv->assoc_request.ieee_mode == IPW_B_MODE)
3856                 mask &= IEEE80211_CCK_RATES_MASK;
3857
3858         /* TODO: Verify that the rate is supported by the current rates
3859          * list. */
3860
3861         while (i && !(mask & i))
3862                 i >>= 1;
3863         switch (i) {
3864         case IEEE80211_CCK_RATE_1MB_MASK:
3865                 return 1000000;
3866         case IEEE80211_CCK_RATE_2MB_MASK:
3867                 return 2000000;
3868         case IEEE80211_CCK_RATE_5MB_MASK:
3869                 return 5500000;
3870         case IEEE80211_OFDM_RATE_6MB_MASK:
3871                 return 6000000;
3872         case IEEE80211_OFDM_RATE_9MB_MASK:
3873                 return 9000000;
3874         case IEEE80211_CCK_RATE_11MB_MASK:
3875                 return 11000000;
3876         case IEEE80211_OFDM_RATE_12MB_MASK:
3877                 return 12000000;
3878         case IEEE80211_OFDM_RATE_18MB_MASK:
3879                 return 18000000;
3880         case IEEE80211_OFDM_RATE_24MB_MASK:
3881                 return 24000000;
3882         case IEEE80211_OFDM_RATE_36MB_MASK:
3883                 return 36000000;
3884         case IEEE80211_OFDM_RATE_48MB_MASK:
3885                 return 48000000;
3886         case IEEE80211_OFDM_RATE_54MB_MASK:
3887                 return 54000000;
3888         }
3889
3890         if (priv->ieee->mode == IEEE_B)
3891                 return 11000000;
3892         else
3893                 return 54000000;
3894 }
3895
3896 static u32 ipw_get_current_rate(struct ipw_priv *priv)
3897 {
3898         u32 rate, len = sizeof(rate);
3899         int err;
3900
3901         if (!(priv->status & STATUS_ASSOCIATED))
3902                 return 0;
3903
3904         if (priv->tx_packets > IPW_REAL_RATE_RX_PACKET_THRESHOLD) {
3905                 err = ipw_get_ordinal(priv, IPW_ORD_STAT_TX_CURR_RATE, &rate,
3906                                       &len);
3907                 if (err) {
3908                         IPW_DEBUG_INFO("failed querying ordinals.\n");
3909                         return 0;
3910                 }
3911         } else
3912                 return ipw_get_max_rate(priv);
3913
3914         switch (rate) {
3915         case IPW_TX_RATE_1MB:
3916                 return 1000000;
3917         case IPW_TX_RATE_2MB:
3918                 return 2000000;
3919         case IPW_TX_RATE_5MB:
3920                 return 5500000;
3921         case IPW_TX_RATE_6MB:
3922                 return 6000000;
3923         case IPW_TX_RATE_9MB:
3924                 return 9000000;
3925         case IPW_TX_RATE_11MB:
3926                 return 11000000;
3927         case IPW_TX_RATE_12MB:
3928                 return 12000000;
3929         case IPW_TX_RATE_18MB:
3930                 return 18000000;
3931         case IPW_TX_RATE_24MB:
3932                 return 24000000;
3933         case IPW_TX_RATE_36MB:
3934                 return 36000000;
3935         case IPW_TX_RATE_48MB:
3936                 return 48000000;
3937         case IPW_TX_RATE_54MB:
3938                 return 54000000;
3939         }
3940
3941         return 0;
3942 }
3943
3944 #define IPW_STATS_INTERVAL (2 * HZ)
3945 static void ipw_gather_stats(struct ipw_priv *priv)
3946 {
3947         u32 rx_err, rx_err_delta, rx_packets_delta;
3948         u32 tx_failures, tx_failures_delta, tx_packets_delta;
3949         u32 missed_beacons_percent, missed_beacons_delta;
3950         u32 quality = 0;
3951         u32 len = sizeof(u32);
3952         s16 rssi;
3953         u32 beacon_quality, signal_quality, tx_quality, rx_quality,
3954             rate_quality;
3955         u32 max_rate;
3956
3957         if (!(priv->status & STATUS_ASSOCIATED)) {
3958                 priv->quality = 0;
3959                 return;
3960         }
3961
3962         /* Update the statistics */
3963         ipw_get_ordinal(priv, IPW_ORD_STAT_MISSED_BEACONS,
3964                         &priv->missed_beacons, &len);
3965         missed_beacons_delta = priv->missed_beacons - priv->last_missed_beacons;
3966         priv->last_missed_beacons = priv->missed_beacons;
3967         if (priv->assoc_request.beacon_interval) {
3968                 missed_beacons_percent = missed_beacons_delta *
3969                     (HZ * priv->assoc_request.beacon_interval) /
3970                     (IPW_STATS_INTERVAL * 10);
3971         } else {
3972                 missed_beacons_percent = 0;
3973         }
3974         average_add(&priv->average_missed_beacons, missed_beacons_percent);
3975
3976         ipw_get_ordinal(priv, IPW_ORD_STAT_RX_ERR_CRC, &rx_err, &len);
3977         rx_err_delta = rx_err - priv->last_rx_err;
3978         priv->last_rx_err = rx_err;
3979
3980         ipw_get_ordinal(priv, IPW_ORD_STAT_TX_FAILURE, &tx_failures, &len);
3981         tx_failures_delta = tx_failures - priv->last_tx_failures;
3982         priv->last_tx_failures = tx_failures;
3983
3984         rx_packets_delta = priv->rx_packets - priv->last_rx_packets;
3985         priv->last_rx_packets = priv->rx_packets;
3986
3987         tx_packets_delta = priv->tx_packets - priv->last_tx_packets;
3988         priv->last_tx_packets = priv->tx_packets;
3989
3990         /* Calculate quality based on the following:
3991          *
3992          * Missed beacon: 100% = 0, 0% = 70% missed
3993          * Rate: 60% = 1Mbs, 100% = Max
3994          * Rx and Tx errors represent a straight % of total Rx/Tx
3995          * RSSI: 100% = > -50,  0% = < -80
3996          * Rx errors: 100% = 0, 0% = 50% missed
3997          *
3998          * The lowest computed quality is used.
3999          *
4000          */
4001 #define BEACON_THRESHOLD 5
4002         beacon_quality = 100 - missed_beacons_percent;
4003         if (beacon_quality < BEACON_THRESHOLD)
4004                 beacon_quality = 0;
4005         else
4006                 beacon_quality = (beacon_quality - BEACON_THRESHOLD) * 100 /
4007                     (100 - BEACON_THRESHOLD);
4008         IPW_DEBUG_STATS("Missed beacon: %3d%% (%d%%)\n",
4009                         beacon_quality, missed_beacons_percent);
4010
4011         priv->last_rate = ipw_get_current_rate(priv);
4012         max_rate = ipw_get_max_rate(priv);
4013         rate_quality = priv->last_rate * 40 / max_rate + 60;
4014         IPW_DEBUG_STATS("Rate quality : %3d%% (%dMbs)\n",
4015                         rate_quality, priv->last_rate / 1000000);
4016
4017         if (rx_packets_delta > 100 && rx_packets_delta + rx_err_delta)
4018                 rx_quality = 100 - (rx_err_delta * 100) /
4019                     (rx_packets_delta + rx_err_delta);
4020         else
4021                 rx_quality = 100;
4022         IPW_DEBUG_STATS("Rx quality   : %3d%% (%u errors, %u packets)\n",
4023                         rx_quality, rx_err_delta, rx_packets_delta);
4024
4025         if (tx_packets_delta > 100 && tx_packets_delta + tx_failures_delta)
4026                 tx_quality = 100 - (tx_failures_delta * 100) /
4027                     (tx_packets_delta + tx_failures_delta);
4028         else
4029                 tx_quality = 100;
4030         IPW_DEBUG_STATS("Tx quality   : %3d%% (%u errors, %u packets)\n",
4031                         tx_quality, tx_failures_delta, tx_packets_delta);
4032
4033         rssi = average_value(&priv->average_rssi);
4034         signal_quality =
4035             (100 *
4036              (priv->ieee->perfect_rssi - priv->ieee->worst_rssi) *
4037              (priv->ieee->perfect_rssi - priv->ieee->worst_rssi) -
4038              (priv->ieee->perfect_rssi - rssi) *
4039              (15 * (priv->ieee->perfect_rssi - priv->ieee->worst_rssi) +
4040               62 * (priv->ieee->perfect_rssi - rssi))) /
4041             ((priv->ieee->perfect_rssi - priv->ieee->worst_rssi) *
4042              (priv->ieee->perfect_rssi - priv->ieee->worst_rssi));
4043         if (signal_quality > 100)
4044                 signal_quality = 100;
4045         else if (signal_quality < 1)
4046                 signal_quality = 0;
4047
4048         IPW_DEBUG_STATS("Signal level : %3d%% (%d dBm)\n",
4049                         signal_quality, rssi);
4050
4051         quality = min(beacon_quality,
4052                       min(rate_quality,
4053                           min(tx_quality, min(rx_quality, signal_quality))));
4054         if (quality == beacon_quality)
4055                 IPW_DEBUG_STATS("Quality (%d%%): Clamped to missed beacons.\n",
4056                                 quality);
4057         if (quality == rate_quality)
4058                 IPW_DEBUG_STATS("Quality (%d%%): Clamped to rate quality.\n",
4059                                 quality);
4060         if (quality == tx_quality)
4061                 IPW_DEBUG_STATS("Quality (%d%%): Clamped to Tx quality.\n",
4062                                 quality);
4063         if (quality == rx_quality)
4064                 IPW_DEBUG_STATS("Quality (%d%%): Clamped to Rx quality.\n",
4065                                 quality);
4066         if (quality == signal_quality)
4067                 IPW_DEBUG_STATS("Quality (%d%%): Clamped to signal quality.\n",
4068                                 quality);
4069
4070         priv->quality = quality;
4071
4072         queue_delayed_work(priv->workqueue, &priv->gather_stats,
4073                            IPW_STATS_INTERVAL);
4074 }
4075
4076 static void ipw_bg_gather_stats(void *data)
4077 {
4078         struct ipw_priv *priv = data;
4079         down(&priv->sem);
4080         ipw_gather_stats(data);
4081         up(&priv->sem);
4082 }
4083
4084 static inline void ipw_handle_missed_beacon(struct ipw_priv *priv,
4085                                             int missed_count)
4086 {
4087         priv->notif_missed_beacons = missed_count;
4088
4089         if (missed_count > priv->disassociate_threshold &&
4090             priv->status & STATUS_ASSOCIATED) {
4091                 /* If associated and we've hit the missed
4092                  * beacon threshold, disassociate, turn
4093                  * off roaming, and abort any active scans */
4094                 IPW_DEBUG(IPW_DL_INFO | IPW_DL_NOTIF |
4095                           IPW_DL_STATE | IPW_DL_ASSOC,
4096                           "Missed beacon: %d - disassociate\n", missed_count);
4097                 priv->status &= ~STATUS_ROAMING;
4098                 if (priv->status & STATUS_SCANNING) {
4099                         IPW_DEBUG(IPW_DL_INFO | IPW_DL_NOTIF |
4100                                   IPW_DL_STATE,
4101                                   "Aborting scan with missed beacon.\n");
4102                         queue_work(priv->workqueue, &priv->abort_scan);
4103                 }
4104
4105                 queue_work(priv->workqueue, &priv->disassociate);
4106                 return;
4107         }
4108
4109         if (priv->status & STATUS_ROAMING) {
4110                 /* If we are currently roaming, then just
4111                  * print a debug statement... */
4112                 IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE,
4113                           "Missed beacon: %d - roam in progress\n",
4114                           missed_count);
4115                 return;
4116         }
4117
4118         if (missed_count > priv->roaming_threshold) {
4119                 /* If we are not already roaming, set the ROAM
4120                  * bit in the status and kick off a scan */
4121                 IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE,
4122                           "Missed beacon: %d - initiate "
4123                           "roaming\n", missed_count);
4124                 if (!(priv->status & STATUS_ROAMING)) {
4125                         priv->status |= STATUS_ROAMING;
4126                         if (!(priv->status & STATUS_SCANNING))
4127                                 queue_work(priv->workqueue,
4128                                            &priv->request_scan);
4129                 }
4130                 return;
4131         }
4132
4133         if (priv->status & STATUS_SCANNING) {
4134                 /* Stop scan to keep fw from getting
4135                  * stuck (only if we aren't roaming --
4136                  * otherwise we'll never scan more than 2 or 3
4137                  * channels..) */
4138                 IPW_DEBUG(IPW_DL_INFO | IPW_DL_NOTIF | IPW_DL_STATE,
4139                           "Aborting scan with missed beacon.\n");
4140                 queue_work(priv->workqueue, &priv->abort_scan);
4141         }
4142
4143         IPW_DEBUG_NOTIF("Missed beacon: %d\n", missed_count);
4144
4145 }
4146
4147 /**
4148  * Handle host notification packet.
4149  * Called from interrupt routine
4150  */
4151 static inline void ipw_rx_notification(struct ipw_priv *priv,
4152                                        struct ipw_rx_notification *notif)
4153 {
4154         notif->size = le16_to_cpu(notif->size);
4155
4156         IPW_DEBUG_NOTIF("type = %i (%d bytes)\n", notif->subtype, notif->size);
4157
4158         switch (notif->subtype) {
4159         case HOST_NOTIFICATION_STATUS_ASSOCIATED:{
4160                         struct notif_association *assoc = &notif->u.assoc;
4161
4162                         switch (assoc->state) {
4163                         case CMAS_ASSOCIATED:{
4164                                         IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE |
4165                                                   IPW_DL_ASSOC,
4166                                                   "associated: '%s' " MAC_FMT
4167                                                   " \n",
4168                                                   escape_essid(priv->essid,
4169                                                                priv->essid_len),
4170                                                   MAC_ARG(priv->bssid));
4171
4172                                         switch (priv->ieee->iw_mode) {
4173                                         case IW_MODE_INFRA:
4174                                                 memcpy(priv->ieee->bssid,
4175                                                        priv->bssid, ETH_ALEN);
4176                                                 break;
4177
4178                                         case IW_MODE_ADHOC:
4179                                                 memcpy(priv->ieee->bssid,
4180                                                        priv->bssid, ETH_ALEN);
4181
4182                                                 /* clear out the station table */
4183                                                 priv->num_stations = 0;
4184
4185                                                 IPW_DEBUG_ASSOC
4186                                                     ("queueing adhoc check\n");
4187                                                 queue_delayed_work(priv->
4188                                                                    workqueue,
4189                                                                    &priv->
4190                                                                    adhoc_check,
4191                                                                    priv->
4192                                                                    assoc_request.
4193                                                                    beacon_interval);
4194                                                 break;
4195                                         }
4196
4197                                         priv->status &= ~STATUS_ASSOCIATING;
4198                                         priv->status |= STATUS_ASSOCIATED;
4199                                         queue_work(priv->workqueue,
4200                                                    &priv->system_config);
4201
4202 #ifdef CONFIG_IPW_QOS
4203 #define IPW_GET_PACKET_STYPE(x) WLAN_FC_GET_STYPE( \
4204                          le16_to_cpu(((struct ieee80211_hdr *)(x))->frame_ctl))
4205                                         if ((priv->status & STATUS_AUTH) &&
4206                                             (IPW_GET_PACKET_STYPE(&notif->u.raw)
4207                                              == IEEE80211_STYPE_ASSOC_RESP)) {
4208                                                 if ((sizeof
4209                                                      (struct
4210                                                       ieee80211_assoc_response)
4211                                                      <= notif->size)
4212                                                     && (notif->size <= 2314)) {
4213                                                         struct
4214                                                         ieee80211_rx_stats
4215                                                             stats = {
4216                                                                 .len =
4217                                                                     notif->
4218                                                                     size - 1,
4219                                                         };
4220
4221                                                         IPW_DEBUG_QOS
4222                                                             ("QoS Associate "
4223                                                              "size %d\n",
4224                                                              notif->size);
4225                                                         ieee80211_rx_mgt(priv->
4226                                                                          ieee,
4227                                                                          (struct
4228                                                                           ieee80211_hdr_4addr
4229                                                                           *)
4230                                                                          &notif->u.raw, &stats);
4231                                                 }
4232                                         }
4233 #endif
4234
4235                                         schedule_work(&priv->link_up);
4236
4237                                         break;
4238                                 }
4239
4240                         case CMAS_AUTHENTICATED:{
4241                                         if (priv->
4242                                             status & (STATUS_ASSOCIATED |
4243                                                       STATUS_AUTH)) {
4244 #ifdef CONFIG_IPW_DEBUG
4245                                                 struct notif_authenticate *auth
4246                                                     = &notif->u.auth;
4247                                                 IPW_DEBUG(IPW_DL_NOTIF |
4248                                                           IPW_DL_STATE |
4249                                                           IPW_DL_ASSOC,
4250                                                           "deauthenticated: '%s' "
4251                                                           MAC_FMT
4252                                                           ": (0x%04X) - %s \n",
4253                                                           escape_essid(priv->
4254                                                                        essid,
4255                                                                        priv->
4256                                                                        essid_len),
4257                                                           MAC_ARG(priv->bssid),
4258                                                           ntohs(auth->status),
4259                                                           ipw_get_status_code
4260                                                           (ntohs
4261                                                            (auth->status)));
4262 #endif
4263
4264                                                 priv->status &=
4265                                                     ~(STATUS_ASSOCIATING |
4266                                                       STATUS_AUTH |
4267                                                       STATUS_ASSOCIATED);
4268
4269                                                 schedule_work(&priv->link_down);
4270                                                 break;
4271                                         }
4272
4273                                         IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE |
4274                                                   IPW_DL_ASSOC,
4275                                                   "authenticated: '%s' " MAC_FMT
4276                                                   "\n",
4277                                                   escape_essid(priv->essid,
4278                                                                priv->essid_len),
4279                                                   MAC_ARG(priv->bssid));
4280                                         break;
4281                                 }
4282
4283                         case CMAS_INIT:{
4284                                         if (priv->status & STATUS_AUTH) {
4285                                                 struct
4286                                                     ieee80211_assoc_response
4287                                                 *resp;
4288                                                 resp =
4289                                                     (struct
4290                                                      ieee80211_assoc_response
4291                                                      *)&notif->u.raw;
4292                                                 IPW_DEBUG(IPW_DL_NOTIF |
4293                                                           IPW_DL_STATE |
4294                                                           IPW_DL_ASSOC,
4295                                                           "association failed (0x%04X): %s\n",
4296                                                           ntohs(resp->status),
4297                                                           ipw_get_status_code
4298                                                           (ntohs
4299                                                            (resp->status)));
4300                                         }
4301
4302                                         IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE |
4303                                                   IPW_DL_ASSOC,
4304                                                   "disassociated: '%s' " MAC_FMT
4305                                                   " \n",
4306                                                   escape_essid(priv->essid,
4307                                                                priv->essid_len),
4308                                                   MAC_ARG(priv->bssid));
4309
4310                                         priv->status &=
4311                                             ~(STATUS_DISASSOCIATING |
4312                                               STATUS_ASSOCIATING |
4313                                               STATUS_ASSOCIATED | STATUS_AUTH);
4314                                         if (priv->assoc_network
4315                                             && (priv->assoc_network->
4316                                                 capability &
4317                                                 WLAN_CAPABILITY_IBSS))
4318                                                 ipw_remove_current_network
4319                                                     (priv);
4320
4321                                         schedule_work(&priv->link_down);
4322
4323                                         break;
4324                                 }
4325
4326                         case CMAS_RX_ASSOC_RESP:
4327                                 break;
4328
4329                         default:
4330                                 IPW_ERROR("assoc: unknown (%d)\n",
4331                                           assoc->state);
4332                                 break;
4333                         }
4334
4335                         break;
4336                 }
4337
4338         case HOST_NOTIFICATION_STATUS_AUTHENTICATE:{
4339                         struct notif_authenticate *auth = &notif->u.auth;
4340                         switch (auth->state) {
4341                         case CMAS_AUTHENTICATED:
4342                                 IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE,
4343                                           "authenticated: '%s' " MAC_FMT " \n",
4344                                           escape_essid(priv->essid,
4345                                                        priv->essid_len),
4346                                           MAC_ARG(priv->bssid));
4347                                 priv->status |= STATUS_AUTH;
4348                                 break;
4349
4350                         case CMAS_INIT:
4351                                 if (priv->status & STATUS_AUTH) {
4352                                         IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE |
4353                                                   IPW_DL_ASSOC,
4354                                                   "authentication failed (0x%04X): %s\n",
4355                                                   ntohs(auth->status),
4356                                                   ipw_get_status_code(ntohs
4357                                                                       (auth->
4358                                                                        status)));
4359                                 }
4360                                 IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE |
4361                                           IPW_DL_ASSOC,
4362                                           "deauthenticated: '%s' " MAC_FMT "\n",
4363                                           escape_essid(priv->essid,
4364                                                        priv->essid_len),
4365                                           MAC_ARG(priv->bssid));
4366
4367                                 priv->status &= ~(STATUS_ASSOCIATING |
4368                                                   STATUS_AUTH |
4369                                                   STATUS_ASSOCIATED);
4370
4371                                 schedule_work(&priv->link_down);
4372                                 break;
4373
4374                         case CMAS_TX_AUTH_SEQ_1:
4375                                 IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE |
4376                                           IPW_DL_ASSOC, "AUTH_SEQ_1\n");
4377                                 break;
4378                         case CMAS_RX_AUTH_SEQ_2:
4379                                 IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE |
4380                                           IPW_DL_ASSOC, "AUTH_SEQ_2\n");
4381                                 break;
4382                         case CMAS_AUTH_SEQ_1_PASS:
4383                                 IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE |
4384                                           IPW_DL_ASSOC, "AUTH_SEQ_1_PASS\n");
4385                                 break;
4386                         case CMAS_AUTH_SEQ_1_FAIL:
4387                                 IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE |
4388                                           IPW_DL_ASSOC, "AUTH_SEQ_1_FAIL\n");
4389                                 break;
4390                         case CMAS_TX_AUTH_SEQ_3:
4391                                 IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE |
4392                                           IPW_DL_ASSOC, "AUTH_SEQ_3\n");
4393                                 break;
4394                         case CMAS_RX_AUTH_SEQ_4:
4395                                 IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE |
4396                                           IPW_DL_ASSOC, "RX_AUTH_SEQ_4\n");
4397                                 break;
4398                         case CMAS_AUTH_SEQ_2_PASS:
4399                                 IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE |
4400                                           IPW_DL_ASSOC, "AUTH_SEQ_2_PASS\n");
4401                                 break;
4402                         case CMAS_AUTH_SEQ_2_FAIL:
4403                                 IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE |
4404                                           IPW_DL_ASSOC, "AUT_SEQ_2_FAIL\n");
4405                                 break;
4406                         case CMAS_TX_ASSOC:
4407                                 IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE |
4408                                           IPW_DL_ASSOC, "TX_ASSOC\n");
4409                                 break;
4410                         case CMAS_RX_ASSOC_RESP:
4411                                 IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE |
4412                                           IPW_DL_ASSOC, "RX_ASSOC_RESP\n");
4413
4414                                 break;
4415                         case CMAS_ASSOCIATED:
4416                                 IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE |
4417                                           IPW_DL_ASSOC, "ASSOCIATED\n");
4418                                 break;
4419                         default:
4420                                 IPW_DEBUG_NOTIF("auth: failure - %d\n",
4421                                                 auth->state);
4422                                 break;
4423                         }
4424                         break;
4425                 }
4426
4427         case HOST_NOTIFICATION_STATUS_SCAN_CHANNEL_RESULT:{
4428                         struct notif_channel_result *x =
4429                             &notif->u.channel_result;
4430
4431                         if (notif->size == sizeof(*x)) {
4432                                 IPW_DEBUG_SCAN("Scan result for channel %d\n",
4433                                                x->channel_num);
4434                         } else {
4435                                 IPW_DEBUG_SCAN("Scan result of wrong size %d "
4436                                                "(should be %zd)\n",
4437                                                notif->size, sizeof(*x));
4438                         }
4439                         break;
4440                 }
4441
4442         case HOST_NOTIFICATION_STATUS_SCAN_COMPLETED:{
4443                         struct notif_scan_complete *x = &notif->u.scan_complete;
4444                         if (notif->size == sizeof(*x)) {
4445                                 IPW_DEBUG_SCAN
4446                                     ("Scan completed: type %d, %d channels, "
4447                                      "%d status\n", x->scan_type,
4448                                      x->num_channels, x->status);
4449                         } else {
4450                                 IPW_ERROR("Scan completed of wrong size %d "
4451                                           "(should be %zd)\n",
4452                                           notif->size, sizeof(*x));
4453                         }
4454
4455                         priv->status &=
4456                             ~(STATUS_SCANNING | STATUS_SCAN_ABORTING);
4457
4458                         wake_up_interruptible(&priv->wait_state);
4459                         cancel_delayed_work(&priv->scan_check);
4460
4461                         if (priv->status & STATUS_EXIT_PENDING)
4462                                 break;
4463
4464                         priv->ieee->scans++;
4465
4466 #ifdef CONFIG_IPW2200_MONITOR
4467                         if (priv->ieee->iw_mode == IW_MODE_MONITOR) {
4468                                 priv->status |= STATUS_SCAN_FORCED;
4469                                 queue_work(priv->workqueue,
4470                                            &priv->request_scan);
4471                                 break;
4472                         }
4473                         priv->status &= ~STATUS_SCAN_FORCED;
4474 #endif                          /* CONFIG_IPW2200_MONITOR */
4475
4476                         if (!(priv->status & (STATUS_ASSOCIATED |
4477                                               STATUS_ASSOCIATING |
4478                                               STATUS_ROAMING |
4479                                               STATUS_DISASSOCIATING)))
4480                                 queue_work(priv->workqueue, &priv->associate);
4481                         else if (priv->status & STATUS_ROAMING) {
4482                                 /* If a scan completed and we are in roam mode, then
4483                                  * the scan that completed was the one requested as a
4484                                  * result of entering roam... so, schedule the
4485                                  * roam work */
4486                                 queue_work(priv->workqueue, &priv->roam);
4487                         } else if (priv->status & STATUS_SCAN_PENDING)
4488                                 queue_work(priv->workqueue,
4489                                            &priv->request_scan);
4490                         else if (priv->config & CFG_BACKGROUND_SCAN
4491                                  && priv->status & STATUS_ASSOCIATED)
4492                                 queue_delayed_work(priv->workqueue,
4493                                                    &priv->request_scan, HZ);
4494                         break;
4495                 }
4496
4497         case HOST_NOTIFICATION_STATUS_FRAG_LENGTH:{
4498                         struct notif_frag_length *x = &notif->u.frag_len;
4499
4500                         if (notif->size == sizeof(*x))
4501                                 IPW_ERROR("Frag length: %d\n",
4502                                           le16_to_cpu(x->frag_length));
4503                         else
4504                                 IPW_ERROR("Frag length of wrong size %d "
4505                                           "(should be %zd)\n",
4506                                           notif->size, sizeof(*x));
4507                         break;
4508                 }
4509
4510         case HOST_NOTIFICATION_STATUS_LINK_DETERIORATION:{
4511                         struct notif_link_deterioration *x =
4512                             &notif->u.link_deterioration;
4513
4514                         if (notif->size == sizeof(*x)) {
4515                                 IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE,
4516                                           "link deterioration: '%s' " MAC_FMT
4517                                           " \n", escape_essid(priv->essid,
4518                                                               priv->essid_len),
4519                                           MAC_ARG(priv->bssid));
4520                                 memcpy(&priv->last_link_deterioration, x,
4521                                        sizeof(*x));
4522                         } else {
4523                                 IPW_ERROR("Link Deterioration of wrong size %d "
4524                                           "(should be %zd)\n",
4525                                           notif->size, sizeof(*x));
4526                         }
4527                         break;
4528                 }
4529
4530         case HOST_NOTIFICATION_DINO_CONFIG_RESPONSE:{
4531                         IPW_ERROR("Dino config\n");
4532                         if (priv->hcmd
4533                             && priv->hcmd->cmd != HOST_CMD_DINO_CONFIG)
4534                                 IPW_ERROR("Unexpected DINO_CONFIG_RESPONSE\n");
4535
4536                         break;
4537                 }
4538
4539         case HOST_NOTIFICATION_STATUS_BEACON_STATE:{
4540                         struct notif_beacon_state *x = &notif->u.beacon_state;
4541                         if (notif->size != sizeof(*x)) {
4542                                 IPW_ERROR
4543                                     ("Beacon state of wrong size %d (should "
4544                                      "be %zd)\n", notif->size, sizeof(*x));
4545                                 break;
4546                         }
4547
4548                         if (le32_to_cpu(x->state) ==
4549                             HOST_NOTIFICATION_STATUS_BEACON_MISSING)
4550                                 ipw_handle_missed_beacon(priv,
4551                                                          le32_to_cpu(x->
4552                                                                      number));
4553
4554                         break;
4555                 }
4556
4557         case HOST_NOTIFICATION_STATUS_TGI_TX_KEY:{
4558                         struct notif_tgi_tx_key *x = &notif->u.tgi_tx_key;
4559                         if (notif->size == sizeof(*x)) {
4560                                 IPW_ERROR("TGi Tx Key: state 0x%02x sec type "
4561                                           "0x%02x station %d\n",
4562                                           x->key_state, x->security_type,
4563                                           x->station_index);
4564                                 break;
4565                         }
4566
4567                         IPW_ERROR
4568                             ("TGi Tx Key of wrong size %d (should be %zd)\n",
4569                              notif->size, sizeof(*x));
4570                         break;
4571                 }
4572
4573         case HOST_NOTIFICATION_CALIB_KEEP_RESULTS:{
4574                         struct notif_calibration *x = &notif->u.calibration;
4575
4576                         if (notif->size == sizeof(*x)) {
4577                                 memcpy(&priv->calib, x, sizeof(*x));
4578                                 IPW_DEBUG_INFO("TODO: Calibration\n");
4579                                 break;
4580                         }
4581
4582                         IPW_ERROR
4583                             ("Calibration of wrong size %d (should be %zd)\n",
4584                              notif->size, sizeof(*x));
4585                         break;
4586                 }
4587
4588         case HOST_NOTIFICATION_NOISE_STATS:{
4589                         if (notif->size == sizeof(u32)) {
4590                                 priv->last_noise =
4591                                     (u8) (le32_to_cpu(notif->u.noise.value) &
4592                                           0xff);
4593                                 average_add(&priv->average_noise,
4594                                             priv->last_noise);
4595                                 break;
4596                         }
4597
4598                         IPW_ERROR
4599                             ("Noise stat is wrong size %d (should be %zd)\n",
4600                              notif->size, sizeof(u32));
4601                         break;
4602                 }
4603
4604         default:
4605                 IPW_ERROR("Unknown notification: "
4606                           "subtype=%d,flags=0x%2x,size=%d\n",
4607                           notif->subtype, notif->flags, notif->size);
4608         }
4609 }
4610
4611 /**
4612  * Destroys all DMA structures and initialise them again
4613  *
4614  * @param priv
4615  * @return error code
4616  */
4617 static int ipw_queue_reset(struct ipw_priv *priv)
4618 {
4619         int rc = 0;
4620         /** @todo customize queue sizes */
4621         int nTx = 64, nTxCmd = 8;
4622         ipw_tx_queue_free(priv);
4623         /* Tx CMD queue */
4624         rc = ipw_queue_tx_init(priv, &priv->txq_cmd, nTxCmd,
4625                                IPW_TX_CMD_QUEUE_READ_INDEX,
4626                                IPW_TX_CMD_QUEUE_WRITE_INDEX,
4627                                IPW_TX_CMD_QUEUE_BD_BASE,
4628                                IPW_TX_CMD_QUEUE_BD_SIZE);
4629         if (rc) {
4630                 IPW_ERROR("Tx Cmd queue init failed\n");
4631                 goto error;
4632         }
4633         /* Tx queue(s) */
4634         rc = ipw_queue_tx_init(priv, &priv->txq[0], nTx,
4635                                IPW_TX_QUEUE_0_READ_INDEX,
4636                                IPW_TX_QUEUE_0_WRITE_INDEX,
4637                                IPW_TX_QUEUE_0_BD_BASE, IPW_TX_QUEUE_0_BD_SIZE);
4638         if (rc) {
4639                 IPW_ERROR("Tx 0 queue init failed\n");
4640                 goto error;
4641         }
4642         rc = ipw_queue_tx_init(priv, &priv->txq[1], nTx,
4643                                IPW_TX_QUEUE_1_READ_INDEX,
4644                                IPW_TX_QUEUE_1_WRITE_INDEX,
4645                                IPW_TX_QUEUE_1_BD_BASE, IPW_TX_QUEUE_1_BD_SIZE);
4646         if (rc) {
4647                 IPW_ERROR("Tx 1 queue init failed\n");
4648                 goto error;
4649         }
4650         rc = ipw_queue_tx_init(priv, &priv->txq[2], nTx,
4651                                IPW_TX_QUEUE_2_READ_INDEX,
4652                                IPW_TX_QUEUE_2_WRITE_INDEX,
4653                                IPW_TX_QUEUE_2_BD_BASE, IPW_TX_QUEUE_2_BD_SIZE);
4654         if (rc) {
4655                 IPW_ERROR("Tx 2 queue init failed\n");
4656                 goto error;
4657         }
4658         rc = ipw_queue_tx_init(priv, &priv->txq[3], nTx,
4659                                IPW_TX_QUEUE_3_READ_INDEX,
4660                                IPW_TX_QUEUE_3_WRITE_INDEX,
4661                                IPW_TX_QUEUE_3_BD_BASE, IPW_TX_QUEUE_3_BD_SIZE);
4662         if (rc) {
4663                 IPW_ERROR("Tx 3 queue init failed\n");
4664                 goto error;
4665         }
4666         /* statistics */
4667         priv->rx_bufs_min = 0;
4668         priv->rx_pend_max = 0;
4669         return rc;
4670
4671       error:
4672         ipw_tx_queue_free(priv);
4673         return rc;
4674 }
4675
4676 /**
4677  * Reclaim Tx queue entries no more used by NIC.
4678  *
4679  * When FW adwances 'R' index, all entries between old and
4680  * new 'R' index need to be reclaimed. As result, some free space
4681  * forms. If there is enough free space (> low mark), wake Tx queue.
4682  *
4683  * @note Need to protect against garbage in 'R' index
4684  * @param priv
4685  * @param txq
4686  * @param qindex
4687  * @return Number of used entries remains in the queue
4688  */
4689 static int ipw_queue_tx_reclaim(struct ipw_priv *priv,
4690                                 struct clx2_tx_queue *txq, int qindex)
4691 {
4692         u32 hw_tail;
4693         int used;
4694         struct clx2_queue *q = &txq->q;
4695
4696         hw_tail = ipw_read32(priv, q->reg_r);
4697         if (hw_tail >= q->n_bd) {
4698                 IPW_ERROR
4699                     ("Read index for DMA queue (%d) is out of range [0-%d)\n",
4700                      hw_tail, q->n_bd);
4701                 goto done;
4702         }
4703         for (; q->last_used != hw_tail;
4704              q->last_used = ipw_queue_inc_wrap(q->last_used, q->n_bd)) {
4705                 ipw_queue_tx_free_tfd(priv, txq);
4706                 priv->tx_packets++;
4707         }
4708       done:
4709         if ((ipw_queue_space(q) > q->low_mark) &&
4710             (qindex >= 0) &&
4711             (priv->status & STATUS_ASSOCIATED) && netif_running(priv->net_dev))
4712                 netif_wake_queue(priv->net_dev);
4713         used = q->first_empty - q->last_used;
4714         if (used < 0)
4715                 used += q->n_bd;
4716
4717         return used;
4718 }
4719
4720 static int ipw_queue_tx_hcmd(struct ipw_priv *priv, int hcmd, void *buf,
4721                              int len, int sync)
4722 {
4723         struct clx2_tx_queue *txq = &priv->txq_cmd;
4724         struct clx2_queue *q = &txq->q;
4725         struct tfd_frame *tfd;
4726
4727         if (ipw_queue_space(q) < (sync ? 1 : 2)) {
4728                 IPW_ERROR("No space for Tx\n");
4729                 return -EBUSY;
4730         }
4731
4732         tfd = &txq->bd[q->first_empty];
4733         txq->txb[q->first_empty] = NULL;
4734
4735         memset(tfd, 0, sizeof(*tfd));
4736         tfd->control_flags.message_type = TX_HOST_COMMAND_TYPE;
4737         tfd->control_flags.control_bits = TFD_NEED_IRQ_MASK;
4738         priv->hcmd_seq++;
4739         tfd->u.cmd.index = hcmd;
4740         tfd->u.cmd.length = len;
4741         memcpy(tfd->u.cmd.payload, buf, len);
4742         q->first_empty = ipw_queue_inc_wrap(q->first_empty, q->n_bd);
4743         ipw_write32(priv, q->reg_w, q->first_empty);
4744         _ipw_read32(priv, 0x90);
4745
4746         return 0;
4747 }
4748
4749 /*
4750  * Rx theory of operation
4751  *
4752  * The host allocates 32 DMA target addresses and passes the host address
4753  * to the firmware at register IPW_RFDS_TABLE_LOWER + N * RFD_SIZE where N is
4754  * 0 to 31
4755  *
4756  * Rx Queue Indexes
4757  * The host/firmware share two index registers for managing the Rx buffers.
4758  *
4759  * The READ index maps to the first position that the firmware may be writing
4760  * to -- the driver can read up to (but not including) this position and get
4761  * good data.
4762  * The READ index is managed by the firmware once the card is enabled.
4763  *
4764  * The WRITE index maps to the last position the driver has read from -- the
4765  * position preceding WRITE is the last slot the firmware can place a packet.
4766  *
4767  * The queue is empty (no good data) if WRITE = READ - 1, and is full if
4768  * WRITE = READ.
4769  *
4770  * During initialization the host sets up the READ queue position to the first
4771  * INDEX position, and WRITE to the last (READ - 1 wrapped)
4772  *
4773  * When the firmware places a packet in a buffer it will advance the READ index
4774  * and fire the RX interrupt.  The driver can then query the READ index and
4775  * process as many packets as possible, moving the WRITE index forward as it
4776  * resets the Rx queue buffers with new memory.
4777  *
4778  * The management in the driver is as follows:
4779  * + A list of pre-allocated SKBs is stored in ipw->rxq->rx_free.  When
4780  *   ipw->rxq->free_count drops to or below RX_LOW_WATERMARK, work is scheduled
4781  *   to replensish the ipw->rxq->rx_free.
4782  * + In ipw_rx_queue_replenish (scheduled) if 'processed' != 'read' then the
4783  *   ipw->rxq is replenished and the READ INDEX is updated (updating the
4784  *   'processed' and 'read' driver indexes as well)
4785  * + A received packet is processed and handed to the kernel network stack,
4786  *   detached from the ipw->rxq.  The driver 'processed' index is updated.
4787  * + The Host/Firmware ipw->rxq is replenished at tasklet time from the rx_free
4788  *   list. If there are no allocated buffers in ipw->rxq->rx_free, the READ
4789  *   INDEX is not incremented and ipw->status(RX_STALLED) is set.  If there
4790  *   were enough free buffers and RX_STALLED is set it is cleared.
4791  *
4792  *
4793  * Driver sequence:
4794  *
4795  * ipw_rx_queue_alloc()       Allocates rx_free
4796  * ipw_rx_queue_replenish()   Replenishes rx_free list from rx_used, and calls
4797  *                            ipw_rx_queue_restock
4798  * ipw_rx_queue_restock()     Moves available buffers from rx_free into Rx
4799  *                            queue, updates firmware pointers, and updates
4800  *                            the WRITE index.  If insufficient rx_free buffers
4801  *                            are available, schedules ipw_rx_queue_replenish
4802  *
4803  * -- enable interrupts --
4804  * ISR - ipw_rx()             Detach ipw_rx_mem_buffers from pool up to the
4805  *                            READ INDEX, detaching the SKB from the pool.
4806  *                            Moves the packet buffer from queue to rx_used.
4807  *                            Calls ipw_rx_queue_restock to refill any empty
4808  *                            slots.
4809  * ...
4810  *
4811  */
4812
4813 /*
4814  * If there are slots in the RX queue that  need to be restocked,
4815  * and we have free pre-allocated buffers, fill the ranks as much
4816  * as we can pulling from rx_free.
4817  *
4818  * This moves the 'write' index forward to catch up with 'processed', and
4819  * also updates the memory address in the firmware to reference the new
4820  * target buffer.
4821  */
4822 static void ipw_rx_queue_restock(struct ipw_priv *priv)
4823 {
4824         struct ipw_rx_queue *rxq = priv->rxq;
4825         struct list_head *element;
4826         struct ipw_rx_mem_buffer *rxb;
4827         unsigned long flags;
4828         int write;
4829
4830         spin_lock_irqsave(&rxq->lock, flags);
4831         write = rxq->write;
4832         while ((rxq->write != rxq->processed) && (rxq->free_count)) {
4833                 element = rxq->rx_free.next;
4834                 rxb = list_entry(element, struct ipw_rx_mem_buffer, list);
4835                 list_del(element);
4836
4837                 ipw_write32(priv, IPW_RFDS_TABLE_LOWER + rxq->write * RFD_SIZE,
4838                             rxb->dma_addr);
4839                 rxq->queue[rxq->write] = rxb;
4840                 rxq->write = (rxq->write + 1) % RX_QUEUE_SIZE;
4841                 rxq->free_count--;
4842         }
4843         spin_unlock_irqrestore(&rxq->lock, flags);
4844
4845         /* If the pre-allocated buffer pool is dropping low, schedule to
4846          * refill it */
4847         if (rxq->free_count <= RX_LOW_WATERMARK)
4848                 queue_work(priv->workqueue, &priv->rx_replenish);
4849
4850         /* If we've added more space for the firmware to place data, tell it */
4851         if (write != rxq->write)
4852                 ipw_write32(priv, IPW_RX_WRITE_INDEX, rxq->write);
4853 }
4854
4855 /*
4856  * Move all used packet from rx_used to rx_free, allocating a new SKB for each.
4857  * Also restock the Rx queue via ipw_rx_queue_restock.
4858  *
4859  * This is called as a scheduled work item (except for during intialization)
4860  */
4861 static void ipw_rx_queue_replenish(void *data)
4862 {
4863         struct ipw_priv *priv = data;
4864         struct ipw_rx_queue *rxq = priv->rxq;
4865         struct list_head *element;
4866         struct ipw_rx_mem_buffer *rxb;
4867         unsigned long flags;
4868
4869         spin_lock_irqsave(&rxq->lock, flags);
4870         while (!list_empty(&rxq->rx_used)) {
4871                 element = rxq->rx_used.next;
4872                 rxb = list_entry(element, struct ipw_rx_mem_buffer, list);
4873                 rxb->skb = alloc_skb(IPW_RX_BUF_SIZE, GFP_ATOMIC);
4874                 if (!rxb->skb) {
4875                         printk(KERN_CRIT "%s: Can not allocate SKB buffers.\n",
4876                                priv->net_dev->name);
4877                         /* We don't reschedule replenish work here -- we will
4878                          * call the restock method and if it still needs
4879                          * more buffers it will schedule replenish */
4880                         break;
4881                 }
4882                 list_del(element);
4883
4884                 rxb->rxb = (struct ipw_rx_buffer *)rxb->skb->data;
4885                 rxb->dma_addr =
4886                     pci_map_single(priv->pci_dev, rxb->skb->data,
4887                                    IPW_RX_BUF_SIZE, PCI_DMA_FROMDEVICE);
4888
4889                 list_add_tail(&rxb->list, &rxq->rx_free);
4890                 rxq->free_count++;
4891         }
4892         spin_unlock_irqrestore(&rxq->lock, flags);
4893
4894         ipw_rx_queue_restock(priv);
4895 }
4896
4897 static void ipw_bg_rx_queue_replenish(void *data)
4898 {
4899         struct ipw_priv *priv = data;
4900         down(&priv->sem);
4901         ipw_rx_queue_replenish(data);
4902         up(&priv->sem);
4903 }
4904
4905 /* Assumes that the skb field of the buffers in 'pool' is kept accurate.
4906  * If an SKB has been detached, the POOL needs to have it's SKB set to NULL
4907  * This free routine walks the list of POOL entries and if SKB is set to
4908  * non NULL it is unmapped and freed
4909  */
4910 static void ipw_rx_queue_free(struct ipw_priv *priv, struct ipw_rx_queue *rxq)
4911 {
4912         int i;
4913
4914         if (!rxq)
4915                 return;
4916
4917         for (i = 0; i < RX_QUEUE_SIZE + RX_FREE_BUFFERS; i++) {
4918                 if (rxq->pool[i].skb != NULL) {
4919                         pci_unmap_single(priv->pci_dev, rxq->pool[i].dma_addr,
4920                                          IPW_RX_BUF_SIZE, PCI_DMA_FROMDEVICE);
4921                         dev_kfree_skb(rxq->pool[i].skb);
4922                 }
4923         }
4924
4925         kfree(rxq);
4926 }
4927
4928 static struct ipw_rx_queue *ipw_rx_queue_alloc(struct ipw_priv *priv)
4929 {
4930         struct ipw_rx_queue *rxq;
4931         int i;
4932
4933         rxq = (struct ipw_rx_queue *)kmalloc(sizeof(*rxq), GFP_KERNEL);
4934         if (unlikely(!rxq)) {
4935                 IPW_ERROR("memory allocation failed\n");
4936                 return NULL;
4937         }
4938         memset(rxq, 0, sizeof(*rxq));
4939         spin_lock_init(&rxq->lock);
4940         INIT_LIST_HEAD(&rxq->rx_free);
4941         INIT_LIST_HEAD(&rxq->rx_used);
4942
4943         /* Fill the rx_used queue with _all_ of the Rx buffers */
4944         for (i = 0; i < RX_FREE_BUFFERS + RX_QUEUE_SIZE; i++)
4945                 list_add_tail(&rxq->pool[i].list, &rxq->rx_used);
4946
4947         /* Set us so that we have processed and used all buffers, but have
4948          * not restocked the Rx queue with fresh buffers */
4949         rxq->read = rxq->write = 0;
4950         rxq->processed = RX_QUEUE_SIZE - 1;
4951         rxq->free_count = 0;
4952
4953         return rxq;
4954 }
4955
4956 static int ipw_is_rate_in_mask(struct ipw_priv *priv, int ieee_mode, u8 rate)
4957 {
4958         rate &= ~IEEE80211_BASIC_RATE_MASK;
4959         if (ieee_mode == IEEE_A) {
4960                 switch (rate) {
4961                 case IEEE80211_OFDM_RATE_6MB:
4962                         return priv->rates_mask & IEEE80211_OFDM_RATE_6MB_MASK ?
4963                             1 : 0;
4964                 case IEEE80211_OFDM_RATE_9MB:
4965                         return priv->rates_mask & IEEE80211_OFDM_RATE_9MB_MASK ?
4966                             1 : 0;
4967                 case IEEE80211_OFDM_RATE_12MB:
4968                         return priv->
4969                             rates_mask & IEEE80211_OFDM_RATE_12MB_MASK ? 1 : 0;
4970                 case IEEE80211_OFDM_RATE_18MB:
4971                         return priv->
4972                             rates_mask & IEEE80211_OFDM_RATE_18MB_MASK ? 1 : 0;
4973                 case IEEE80211_OFDM_RATE_24MB:
4974                         return priv->
4975                             rates_mask & IEEE80211_OFDM_RATE_24MB_MASK ? 1 : 0;
4976                 case IEEE80211_OFDM_RATE_36MB:
4977                         return priv->
4978                             rates_mask & IEEE80211_OFDM_RATE_36MB_MASK ? 1 : 0;
4979                 case IEEE80211_OFDM_RATE_48MB:
4980                         return priv->
4981                             rates_mask & IEEE80211_OFDM_RATE_48MB_MASK ? 1 : 0;
4982                 case IEEE80211_OFDM_RATE_54MB:
4983                         return priv->
4984                             rates_mask & IEEE80211_OFDM_RATE_54MB_MASK ? 1 : 0;
4985                 default:
4986                         return 0;
4987                 }
4988         }
4989
4990         /* B and G mixed */
4991         switch (rate) {
4992         case IEEE80211_CCK_RATE_1MB:
4993                 return priv->rates_mask & IEEE80211_CCK_RATE_1MB_MASK ? 1 : 0;
4994         case IEEE80211_CCK_RATE_2MB:
4995                 return priv->rates_mask & IEEE80211_CCK_RATE_2MB_MASK ? 1 : 0;
4996         case IEEE80211_CCK_RATE_5MB:
4997                 return priv->rates_mask & IEEE80211_CCK_RATE_5MB_MASK ? 1 : 0;
4998         case IEEE80211_CCK_RATE_11MB:
4999                 return priv->rates_mask & IEEE80211_CCK_RATE_11MB_MASK ? 1 : 0;
5000         }
5001
5002         /* If we are limited to B modulations, bail at this point */
5003         if (ieee_mode == IEEE_B)
5004                 return 0;
5005
5006         /* G */
5007         switch (rate) {
5008         case IEEE80211_OFDM_RATE_6MB:
5009                 return priv->rates_mask & IEEE80211_OFDM_RATE_6MB_MASK ? 1 : 0;
5010         case IEEE80211_OFDM_RATE_9MB:
5011                 return priv->rates_mask & IEEE80211_OFDM_RATE_9MB_MASK ? 1 : 0;
5012         case IEEE80211_OFDM_RATE_12MB:
5013                 return priv->rates_mask & IEEE80211_OFDM_RATE_12MB_MASK ? 1 : 0;
5014         case IEEE80211_OFDM_RATE_18MB:
5015                 return priv->rates_mask & IEEE80211_OFDM_RATE_18MB_MASK ? 1 : 0;
5016         case IEEE80211_OFDM_RATE_24MB:
5017                 return priv->rates_mask & IEEE80211_OFDM_RATE_24MB_MASK ? 1 : 0;
5018         case IEEE80211_OFDM_RATE_36MB:
5019                 return priv->rates_mask & IEEE80211_OFDM_RATE_36MB_MASK ? 1 : 0;
5020         case IEEE80211_OFDM_RATE_48MB:
5021                 return priv->rates_mask & IEEE80211_OFDM_RATE_48MB_MASK ? 1 : 0;
5022         case IEEE80211_OFDM_RATE_54MB:
5023                 return priv->rates_mask & IEEE80211_OFDM_RATE_54MB_MASK ? 1 : 0;
5024         }
5025
5026         return 0;
5027 }
5028
5029 static int ipw_compatible_rates(struct ipw_priv *priv,
5030                                 const struct ieee80211_network *network,
5031                                 struct ipw_supported_rates *rates)
5032 {
5033         int num_rates, i;
5034
5035         memset(rates, 0, sizeof(*rates));
5036         num_rates = min(network->rates_len, (u8) IPW_MAX_RATES);
5037         rates->num_rates = 0;
5038         for (i = 0; i < num_rates; i++) {
5039                 if (!ipw_is_rate_in_mask(priv, network->mode,
5040                                          network->rates[i])) {
5041
5042                         if (network->rates[i] & IEEE80211_BASIC_RATE_MASK) {
5043                                 IPW_DEBUG_SCAN("Adding masked mandatory "
5044                                                "rate %02X\n",
5045                                                network->rates[i]);
5046                                 rates->supported_rates[rates->num_rates++] =
5047                                     network->rates[i];
5048                                 continue;
5049                         }
5050
5051                         IPW_DEBUG_SCAN("Rate %02X masked : 0x%08X\n",
5052                                        network->rates[i], priv->rates_mask);
5053                         continue;
5054                 }
5055
5056                 rates->supported_rates[rates->num_rates++] = network->rates[i];
5057         }
5058
5059         num_rates = min(network->rates_ex_len,
5060                         (u8) (IPW_MAX_RATES - num_rates));
5061         for (i = 0; i < num_rates; i++) {
5062                 if (!ipw_is_rate_in_mask(priv, network->mode,
5063                                          network->rates_ex[i])) {
5064                         if (network->rates_ex[i] & IEEE80211_BASIC_RATE_MASK) {
5065                                 IPW_DEBUG_SCAN("Adding masked mandatory "
5066                                                "rate %02X\n",
5067                                                network->rates_ex[i]);
5068                                 rates->supported_rates[rates->num_rates++] =
5069                                     network->rates[i];
5070                                 continue;
5071                         }
5072
5073                         IPW_DEBUG_SCAN("Rate %02X masked : 0x%08X\n",
5074                                        network->rates_ex[i], priv->rates_mask);
5075                         continue;
5076                 }
5077
5078                 rates->supported_rates[rates->num_rates++] =
5079                     network->rates_ex[i];
5080         }
5081
5082         return 1;
5083 }
5084
5085 static inline void ipw_copy_rates(struct ipw_supported_rates *dest,
5086                                   const struct ipw_supported_rates *src)
5087 {
5088         u8 i;
5089         for (i = 0; i < src->num_rates; i++)
5090                 dest->supported_rates[i] = src->supported_rates[i];
5091         dest->num_rates = src->num_rates;
5092 }
5093
5094 /* TODO: Look at sniffed packets in the air to determine if the basic rate
5095  * mask should ever be used -- right now all callers to add the scan rates are
5096  * set with the modulation = CCK, so BASIC_RATE_MASK is never set... */
5097 static void ipw_add_cck_scan_rates(struct ipw_supported_rates *rates,
5098                                    u8 modulation, u32 rate_mask)
5099 {
5100         u8 basic_mask = (IEEE80211_OFDM_MODULATION == modulation) ?
5101             IEEE80211_BASIC_RATE_MASK : 0;
5102
5103         if (rate_mask & IEEE80211_CCK_RATE_1MB_MASK)
5104                 rates->supported_rates[rates->num_rates++] =
5105                     IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_1MB;
5106
5107         if (rate_mask & IEEE80211_CCK_RATE_2MB_MASK)
5108                 rates->supported_rates[rates->num_rates++] =
5109                     IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_2MB;
5110
5111         if (rate_mask & IEEE80211_CCK_RATE_5MB_MASK)
5112                 rates->supported_rates[rates->num_rates++] = basic_mask |
5113                     IEEE80211_CCK_RATE_5MB;
5114
5115         if (rate_mask & IEEE80211_CCK_RATE_11MB_MASK)
5116                 rates->supported_rates[rates->num_rates++] = basic_mask |
5117                     IEEE80211_CCK_RATE_11MB;
5118 }
5119
5120 static void ipw_add_ofdm_scan_rates(struct ipw_supported_rates *rates,
5121                                     u8 modulation, u32 rate_mask)
5122 {
5123         u8 basic_mask = (IEEE80211_OFDM_MODULATION == modulation) ?
5124             IEEE80211_BASIC_RATE_MASK : 0;
5125
5126         if (rate_mask & IEEE80211_OFDM_RATE_6MB_MASK)
5127                 rates->supported_rates[rates->num_rates++] = basic_mask |
5128                     IEEE80211_OFDM_RATE_6MB;
5129
5130         if (rate_mask & IEEE80211_OFDM_RATE_9MB_MASK)
5131                 rates->supported_rates[rates->num_rates++] =
5132                     IEEE80211_OFDM_RATE_9MB;
5133
5134         if (rate_mask & IEEE80211_OFDM_RATE_12MB_MASK)
5135                 rates->supported_rates[rates->num_rates++] = basic_mask |
5136                     IEEE80211_OFDM_RATE_12MB;
5137
5138         if (rate_mask & IEEE80211_OFDM_RATE_18MB_MASK)
5139                 rates->supported_rates[rates->num_rates++] =
5140                     IEEE80211_OFDM_RATE_18MB;
5141
5142         if (rate_mask & IEEE80211_OFDM_RATE_24MB_MASK)
5143                 rates->supported_rates[rates->num_rates++] = basic_mask |
5144                     IEEE80211_OFDM_RATE_24MB;
5145
5146         if (rate_mask & IEEE80211_OFDM_RATE_36MB_MASK)
5147                 rates->supported_rates[rates->num_rates++] =
5148                     IEEE80211_OFDM_RATE_36MB;
5149
5150         if (rate_mask & IEEE80211_OFDM_RATE_48MB_MASK)
5151                 rates->supported_rates[rates->num_rates++] =
5152                     IEEE80211_OFDM_RATE_48MB;
5153
5154         if (rate_mask & IEEE80211_OFDM_RATE_54MB_MASK)
5155                 rates->supported_rates[rates->num_rates++] =
5156                     IEEE80211_OFDM_RATE_54MB;
5157 }
5158
5159 struct ipw_network_match {
5160         struct ieee80211_network *network;
5161         struct ipw_supported_rates rates;
5162 };
5163
5164 static int ipw_find_adhoc_network(struct ipw_priv *priv,
5165                                   struct ipw_network_match *match,
5166                                   struct ieee80211_network *network,
5167                                   int roaming)
5168 {
5169         struct ipw_supported_rates rates;
5170
5171         /* Verify that this network's capability is compatible with the
5172          * current mode (AdHoc or Infrastructure) */
5173         if ((priv->ieee->iw_mode == IW_MODE_ADHOC &&
5174              !(network->capability & WLAN_CAPABILITY_IBSS))) {
5175                 IPW_DEBUG_MERGE("Network '%s (" MAC_FMT ")' excluded due to "
5176                                 "capability mismatch.\n",
5177                                 escape_essid(network->ssid, network->ssid_len),
5178                                 MAC_ARG(network->bssid));
5179                 return 0;
5180         }
5181
5182         /* If we do not have an ESSID for this AP, we can not associate with
5183          * it */
5184         if (network->flags & NETWORK_EMPTY_ESSID) {
5185                 IPW_DEBUG_MERGE("Network '%s (" MAC_FMT ")' excluded "
5186                                 "because of hidden ESSID.\n",
5187                                 escape_essid(network->ssid, network->ssid_len),
5188                                 MAC_ARG(network->bssid));
5189                 return 0;
5190         }
5191
5192         if (unlikely(roaming)) {
5193                 /* If we are roaming, then ensure check if this is a valid
5194                  * network to try and roam to */
5195                 if ((network->ssid_len != match->network->ssid_len) ||
5196                     memcmp(network->ssid, match->network->ssid,
5197                            network->ssid_len)) {
5198                         IPW_DEBUG_MERGE("Netowrk '%s (" MAC_FMT ")' excluded "
5199                                         "because of non-network ESSID.\n",
5200                                         escape_essid(network->ssid,
5201                                                      network->ssid_len),
5202                                         MAC_ARG(network->bssid));
5203                         return 0;
5204                 }
5205         } else {
5206                 /* If an ESSID has been configured then compare the broadcast
5207                  * ESSID to ours */
5208                 if ((priv->config & CFG_STATIC_ESSID) &&
5209                     ((network->ssid_len != priv->essid_len) ||
5210                      memcmp(network->ssid, priv->essid,
5211                             min(network->ssid_len, priv->essid_len)))) {
5212                         char escaped[IW_ESSID_MAX_SIZE * 2 + 1];
5213
5214                         strncpy(escaped,
5215                                 escape_essid(network->ssid, network->ssid_len),
5216                                 sizeof(escaped));
5217                         IPW_DEBUG_MERGE("Network '%s (" MAC_FMT ")' excluded "
5218                                         "because of ESSID mismatch: '%s'.\n",
5219                                         escaped, MAC_ARG(network->bssid),
5220                                         escape_essid(priv->essid,
5221                                                      priv->essid_len));
5222                         return 0;
5223                 }
5224         }
5225
5226         /* If the old network rate is better than this one, don't bother
5227          * testing everything else. */
5228
5229         if (network->time_stamp[0] < match->network->time_stamp[0]) {
5230                 IPW_DEBUG_MERGE("Network '%s excluded because newer than "
5231                                 "current network.\n",
5232                                 escape_essid(match->network->ssid,
5233                                              match->network->ssid_len));
5234                 return 0;
5235         } else if (network->time_stamp[1] < match->network->time_stamp[1]) {
5236                 IPW_DEBUG_MERGE("Network '%s excluded because newer than "
5237                                 "current network.\n",
5238                                 escape_essid(match->network->ssid,
5239                                              match->network->ssid_len));
5240                 return 0;
5241         }
5242
5243         /* Now go through and see if the requested network is valid... */
5244         if (priv->ieee->scan_age != 0 &&
5245             time_after(jiffies, network->last_scanned + priv->ieee->scan_age)) {
5246                 IPW_DEBUG_MERGE("Network '%s (" MAC_FMT ")' excluded "
5247                                 "because of age: %lums.\n",
5248                                 escape_essid(network->ssid, network->ssid_len),
5249                                 MAC_ARG(network->bssid),
5250                                 1000 * (jiffies - network->last_scanned) / HZ);
5251                 return 0;
5252         }
5253
5254         if ((priv->config & CFG_STATIC_CHANNEL) &&
5255             (network->channel != priv->channel)) {
5256                 IPW_DEBUG_MERGE("Network '%s (" MAC_FMT ")' excluded "
5257                                 "because of channel mismatch: %d != %d.\n",
5258                                 escape_essid(network->ssid, network->ssid_len),
5259                                 MAC_ARG(network->bssid),
5260                                 network->channel, priv->channel);
5261                 return 0;
5262         }
5263
5264         /* Verify privacy compatability */
5265         if (((priv->capability & CAP_PRIVACY_ON) ? 1 : 0) !=
5266             ((network->capability & WLAN_CAPABILITY_PRIVACY) ? 1 : 0)) {
5267                 IPW_DEBUG_MERGE("Network '%s (" MAC_FMT ")' excluded "
5268                                 "because of privacy mismatch: %s != %s.\n",
5269                                 escape_essid(network->ssid, network->ssid_len),
5270                                 MAC_ARG(network->bssid),
5271                                 priv->
5272                                 capability & CAP_PRIVACY_ON ? "on" : "off",
5273                                 network->
5274                                 capability & WLAN_CAPABILITY_PRIVACY ? "on" :
5275                                 "off");
5276                 return 0;
5277         }
5278
5279         if (!memcmp(network->bssid, priv->bssid, ETH_ALEN)) {
5280                 IPW_DEBUG_MERGE("Network '%s (" MAC_FMT ")' excluded "
5281                                 "because of the same BSSID match: " MAC_FMT
5282                                 ".\n", escape_essid(network->ssid,
5283                                                     network->ssid_len),
5284                                 MAC_ARG(network->bssid), MAC_ARG(priv->bssid));
5285                 return 0;
5286         }
5287
5288         /* Filter out any incompatible freq / mode combinations */
5289         if (!ieee80211_is_valid_mode(priv->ieee, network->mode)) {
5290                 IPW_DEBUG_MERGE("Network '%s (" MAC_FMT ")' excluded "
5291                                 "because of invalid frequency/mode "
5292                                 "combination.\n",
5293                                 escape_essid(network->ssid, network->ssid_len),
5294                                 MAC_ARG(network->bssid));
5295                 return 0;
5296         }
5297
5298         /* Ensure that the rates supported by the driver are compatible with
5299          * this AP, including verification of basic rates (mandatory) */
5300         if (!ipw_compatible_rates(priv, network, &rates)) {
5301                 IPW_DEBUG_MERGE("Network '%s (" MAC_FMT ")' excluded "
5302                                 "because configured rate mask excludes "
5303                                 "AP mandatory rate.\n",
5304                                 escape_essid(network->ssid, network->ssid_len),
5305                                 MAC_ARG(network->bssid));
5306                 return 0;
5307         }
5308
5309         if (rates.num_rates == 0) {
5310                 IPW_DEBUG_MERGE("Network '%s (" MAC_FMT ")' excluded "
5311                                 "because of no compatible rates.\n",
5312                                 escape_essid(network->ssid, network->ssid_len),
5313                                 MAC_ARG(network->bssid));
5314                 return 0;
5315         }
5316
5317         /* TODO: Perform any further minimal comparititive tests.  We do not
5318          * want to put too much policy logic here; intelligent scan selection
5319          * should occur within a generic IEEE 802.11 user space tool.  */
5320
5321         /* Set up 'new' AP to this network */
5322         ipw_copy_rates(&match->rates, &rates);
5323         match->network = network;
5324         IPW_DEBUG_MERGE("Network '%s (" MAC_FMT ")' is a viable match.\n",
5325                         escape_essid(network->ssid, network->ssid_len),
5326                         MAC_ARG(network->bssid));
5327
5328         return 1;
5329 }
5330
5331 static void ipw_merge_adhoc_network(void *data)
5332 {
5333         struct ipw_priv *priv = data;
5334         struct ieee80211_network *network = NULL;
5335         struct ipw_network_match match = {
5336                 .network = priv->assoc_network
5337         };
5338
5339         if ((priv->status & STATUS_ASSOCIATED) &&
5340             (priv->ieee->iw_mode == IW_MODE_ADHOC)) {
5341                 /* First pass through ROAM process -- look for a better
5342                  * network */
5343                 unsigned long flags;
5344
5345                 spin_lock_irqsave(&priv->ieee->lock, flags);
5346                 list_for_each_entry(network, &priv->ieee->network_list, list) {
5347                         if (network != priv->assoc_network)
5348                                 ipw_find_adhoc_network(priv, &match, network,
5349                                                        1);
5350                 }
5351                 spin_unlock_irqrestore(&priv->ieee->lock, flags);
5352
5353                 if (match.network == priv->assoc_network) {
5354                         IPW_DEBUG_MERGE("No better ADHOC in this network to "
5355                                         "merge to.\n");
5356                         return;
5357                 }
5358
5359                 down(&priv->sem);
5360                 if ((priv->ieee->iw_mode == IW_MODE_ADHOC)) {
5361                         IPW_DEBUG_MERGE("remove network %s\n",
5362                                         escape_essid(priv->essid,
5363                                                      priv->essid_len));
5364                         ipw_remove_current_network(priv);
5365                 }
5366
5367                 ipw_disassociate(priv);
5368                 priv->assoc_network = match.network;
5369                 up(&priv->sem);
5370                 return;
5371         }
5372 }
5373
5374 static int ipw_best_network(struct ipw_priv *priv,
5375                             struct ipw_network_match *match,
5376                             struct ieee80211_network *network, int roaming)
5377 {
5378         struct ipw_supported_rates rates;
5379
5380         /* Verify that this network's capability is compatible with the
5381          * current mode (AdHoc or Infrastructure) */
5382         if ((priv->ieee->iw_mode == IW_MODE_INFRA &&
5383              !(network->capability & WLAN_CAPABILITY_ESS)) ||
5384             (priv->ieee->iw_mode == IW_MODE_ADHOC &&
5385              !(network->capability & WLAN_CAPABILITY_IBSS))) {
5386                 IPW_DEBUG_ASSOC("Network '%s (" MAC_FMT ")' excluded due to "
5387                                 "capability mismatch.\n",
5388                                 escape_essid(network->ssid, network->ssid_len),
5389                                 MAC_ARG(network->bssid));
5390                 return 0;
5391         }
5392
5393         /* If we do not have an ESSID for this AP, we can not associate with
5394          * it */
5395         if (network->flags & NETWORK_EMPTY_ESSID) {
5396                 IPW_DEBUG_ASSOC("Network '%s (" MAC_FMT ")' excluded "
5397                                 "because of hidden ESSID.\n",
5398                                 escape_essid(network->ssid, network->ssid_len),
5399                                 MAC_ARG(network->bssid));
5400                 return 0;
5401         }
5402
5403         if (unlikely(roaming)) {
5404                 /* If we are roaming, then ensure check if this is a valid
5405                  * network to try and roam to */
5406                 if ((network->ssid_len != match->network->ssid_len) ||
5407                     memcmp(network->ssid, match->network->ssid,
5408                            network->ssid_len)) {
5409                         IPW_DEBUG_ASSOC("Netowrk '%s (" MAC_FMT ")' excluded "
5410                                         "because of non-network ESSID.\n",
5411                                         escape_essid(network->ssid,
5412                                                      network->ssid_len),
5413                                         MAC_ARG(network->bssid));
5414                         return 0;
5415                 }
5416         } else {
5417                 /* If an ESSID has been configured then compare the broadcast
5418                  * ESSID to ours */
5419                 if ((priv->config & CFG_STATIC_ESSID) &&
5420                     ((network->ssid_len != priv->essid_len) ||
5421                      memcmp(network->ssid, priv->essid,
5422                             min(network->ssid_len, priv->essid_len)))) {
5423                         char escaped[IW_ESSID_MAX_SIZE * 2 + 1];
5424                         strncpy(escaped,
5425                                 escape_essid(network->ssid, network->ssid_len),
5426                                 sizeof(escaped));
5427                         IPW_DEBUG_ASSOC("Network '%s (" MAC_FMT ")' excluded "
5428                                         "because of ESSID mismatch: '%s'.\n",
5429                                         escaped, MAC_ARG(network->bssid),
5430                                         escape_essid(priv->essid,
5431                                                      priv->essid_len));
5432                         return 0;
5433                 }
5434         }
5435
5436         /* If the old network rate is better than this one, don't bother
5437          * testing everything else. */
5438         if (match->network && match->network->stats.rssi > network->stats.rssi) {
5439                 char escaped[IW_ESSID_MAX_SIZE * 2 + 1];
5440                 strncpy(escaped,
5441                         escape_essid(network->ssid, network->ssid_len),
5442                         sizeof(escaped));
5443                 IPW_DEBUG_ASSOC("Network '%s (" MAC_FMT ")' excluded because "
5444                                 "'%s (" MAC_FMT ")' has a stronger signal.\n",
5445                                 escaped, MAC_ARG(network->bssid),
5446                                 escape_essid(match->network->ssid,
5447                                              match->network->ssid_len),
5448                                 MAC_ARG(match->network->bssid));
5449                 return 0;
5450         }
5451
5452         /* If this network has already had an association attempt within the
5453          * last 3 seconds, do not try and associate again... */
5454         if (network->last_associate &&
5455             time_after(network->last_associate + (HZ * 3UL), jiffies)) {
5456                 IPW_DEBUG_ASSOC("Network '%s (" MAC_FMT ")' excluded "
5457                                 "because of storming (%lus since last "
5458                                 "assoc attempt).\n",
5459                                 escape_essid(network->ssid, network->ssid_len),
5460                                 MAC_ARG(network->bssid),
5461                                 (jiffies - network->last_associate) / HZ);
5462                 return 0;
5463         }
5464
5465         /* Now go through and see if the requested network is valid... */
5466         if (priv->ieee->scan_age != 0 &&
5467             time_after(jiffies, network->last_scanned + priv->ieee->scan_age)) {
5468                 IPW_DEBUG_ASSOC("Network '%s (" MAC_FMT ")' excluded "
5469                                 "because of age: %lums.\n",
5470                                 escape_essid(network->ssid, network->ssid_len),
5471                                 MAC_ARG(network->bssid),
5472                                 1000 * (jiffies - network->last_scanned) / HZ);
5473                 return 0;
5474         }
5475
5476         if ((priv->config & CFG_STATIC_CHANNEL) &&
5477             (network->channel != priv->channel)) {
5478                 IPW_DEBUG_ASSOC("Network '%s (" MAC_FMT ")' excluded "
5479                                 "because of channel mismatch: %d != %d.\n",
5480                                 escape_essid(network->ssid, network->ssid_len),
5481                                 MAC_ARG(network->bssid),
5482                                 network->channel, priv->channel);
5483                 return 0;
5484         }
5485
5486         /* Verify privacy compatability */
5487         if (((priv->capability & CAP_PRIVACY_ON) ? 1 : 0) !=
5488             ((network->capability & WLAN_CAPABILITY_PRIVACY) ? 1 : 0)) {
5489                 IPW_DEBUG_ASSOC("Network '%s (" MAC_FMT ")' excluded "
5490                                 "because of privacy mismatch: %s != %s.\n",
5491                                 escape_essid(network->ssid, network->ssid_len),
5492                                 MAC_ARG(network->bssid),
5493                                 priv->capability & CAP_PRIVACY_ON ? "on" :
5494                                 "off",
5495                                 network->capability &
5496                                 WLAN_CAPABILITY_PRIVACY ? "on" : "off");
5497                 return 0;
5498         }
5499
5500         if (!priv->ieee->wpa_enabled && (network->wpa_ie_len > 0 ||
5501                                          network->rsn_ie_len > 0)) {
5502                 IPW_DEBUG_ASSOC("Network '%s (" MAC_FMT ")' excluded "
5503                                 "because of WPA capability mismatch.\n",
5504                                 escape_essid(network->ssid, network->ssid_len),
5505                                 MAC_ARG(network->bssid));
5506                 return 0;
5507         }
5508
5509         if ((priv->config & CFG_STATIC_BSSID) &&
5510             memcmp(network->bssid, priv->bssid, ETH_ALEN)) {
5511                 IPW_DEBUG_ASSOC("Network '%s (" MAC_FMT ")' excluded "
5512                                 "because of BSSID mismatch: " MAC_FMT ".\n",
5513                                 escape_essid(network->ssid, network->ssid_len),
5514                                 MAC_ARG(network->bssid), MAC_ARG(priv->bssid));
5515                 return 0;
5516         }
5517
5518         /* Filter out any incompatible freq / mode combinations */
5519         if (!ieee80211_is_valid_mode(priv->ieee, network->mode)) {
5520                 IPW_DEBUG_ASSOC("Network '%s (" MAC_FMT ")' excluded "
5521                                 "because of invalid frequency/mode "
5522                                 "combination.\n",
5523                                 escape_essid(network->ssid, network->ssid_len),
5524                                 MAC_ARG(network->bssid));
5525                 return 0;
5526         }
5527
5528         /* Filter out invalid channel in current GEO */
5529         if (!ipw_is_valid_channel(priv->ieee, network->channel)) {
5530                 IPW_DEBUG_ASSOC("Network '%s (" MAC_FMT ")' excluded "
5531                                 "because of invalid channel in current GEO\n",
5532                                 escape_essid(network->ssid, network->ssid_len),
5533                                 MAC_ARG(network->bssid));
5534                 return 0;
5535         }
5536
5537         /* Ensure that the rates supported by the driver are compatible with
5538          * this AP, including verification of basic rates (mandatory) */
5539         if (!ipw_compatible_rates(priv, network, &rates)) {
5540                 IPW_DEBUG_ASSOC("Network '%s (" MAC_FMT ")' excluded "
5541                                 "because configured rate mask excludes "
5542                                 "AP mandatory rate.\n",
5543                                 escape_essid(network->ssid, network->ssid_len),
5544                                 MAC_ARG(network->bssid));
5545                 return 0;
5546         }
5547
5548         if (rates.num_rates == 0) {
5549                 IPW_DEBUG_ASSOC("Network '%s (" MAC_FMT ")' excluded "
5550                                 "because of no compatible rates.\n",
5551                                 escape_essid(network->ssid, network->ssid_len),
5552                                 MAC_ARG(network->bssid));
5553                 return 0;
5554         }
5555
5556         /* TODO: Perform any further minimal comparititive tests.  We do not
5557          * want to put too much policy logic here; intelligent scan selection
5558          * should occur within a generic IEEE 802.11 user space tool.  */
5559
5560         /* Set up 'new' AP to this network */
5561         ipw_copy_rates(&match->rates, &rates);
5562         match->network = network;
5563
5564         IPW_DEBUG_ASSOC("Network '%s (" MAC_FMT ")' is a viable match.\n",
5565                         escape_essid(network->ssid, network->ssid_len),
5566                         MAC_ARG(network->bssid));
5567
5568         return 1;
5569 }
5570
5571 static void ipw_adhoc_create(struct ipw_priv *priv,
5572                              struct ieee80211_network *network)
5573 {
5574         const struct ieee80211_geo *geo = ipw_get_geo(priv->ieee);
5575         int i;
5576
5577         /*
5578          * For the purposes of scanning, we can set our wireless mode
5579          * to trigger scans across combinations of bands, but when it
5580          * comes to creating a new ad-hoc network, we have tell the FW
5581          * exactly which band to use.
5582          *
5583          * We also have the possibility of an invalid channel for the
5584          * chossen band.  Attempting to create a new ad-hoc network
5585          * with an invalid channel for wireless mode will trigger a
5586          * FW fatal error.
5587          *
5588          */
5589         switch (ipw_is_valid_channel(priv->ieee, priv->channel)) {
5590         case IEEE80211_52GHZ_BAND:
5591                 network->mode = IEEE_A;
5592                 i = ipw_channel_to_index(priv->ieee, priv->channel);
5593                 if (i == -1)
5594                         BUG();
5595                 if (geo->a[i].flags & IEEE80211_CH_PASSIVE_ONLY) {
5596                         IPW_WARNING("Overriding invalid channel\n");
5597                         priv->channel = geo->a[0].channel;
5598                 }
5599                 break;
5600
5601         case IEEE80211_24GHZ_BAND:
5602                 if (priv->ieee->mode & IEEE_G)
5603                         network->mode = IEEE_G;
5604                 else
5605                         network->mode = IEEE_B;
5606                 i = ipw_channel_to_index(priv->ieee, priv->channel);
5607                 if (i == -1)
5608                         BUG();
5609                 if (geo->bg[i].flags & IEEE80211_CH_PASSIVE_ONLY) {
5610                         IPW_WARNING("Overriding invalid channel\n");
5611                         priv->channel = geo->bg[0].channel;
5612                 }
5613                 break;
5614
5615         default:
5616                 IPW_WARNING("Overriding invalid channel\n");
5617                 if (priv->ieee->mode & IEEE_A) {
5618                         network->mode = IEEE_A;
5619                         priv->channel = geo->a[0].channel;
5620                 } else if (priv->ieee->mode & IEEE_G) {
5621                         network->mode = IEEE_G;
5622                         priv->channel = geo->bg[0].channel;
5623                 } else {
5624                         network->mode = IEEE_B;
5625                         priv->channel = geo->bg[0].channel;
5626                 }
5627                 break;
5628         }
5629
5630         network->channel = priv->channel;
5631         priv->config |= CFG_ADHOC_PERSIST;
5632         ipw_create_bssid(priv, network->bssid);
5633         network->ssid_len = priv->essid_len;
5634         memcpy(network->ssid, priv->essid, priv->essid_len);
5635         memset(&network->stats, 0, sizeof(network->stats));
5636         network->capability = WLAN_CAPABILITY_IBSS;
5637         if (!(priv->config & CFG_PREAMBLE_LONG))
5638                 network->capability |= WLAN_CAPABILITY_SHORT_PREAMBLE;
5639         if (priv->capability & CAP_PRIVACY_ON)
5640                 network->capability |= WLAN_CAPABILITY_PRIVACY;
5641         network->rates_len = min(priv->rates.num_rates, MAX_RATES_LENGTH);
5642         memcpy(network->rates, priv->rates.supported_rates, network->rates_len);
5643         network->rates_ex_len = priv->rates.num_rates - network->rates_len;
5644         memcpy(network->rates_ex,
5645                &priv->rates.supported_rates[network->rates_len],
5646                network->rates_ex_len);
5647         network->last_scanned = 0;
5648         network->flags = 0;
5649         network->last_associate = 0;
5650         network->time_stamp[0] = 0;
5651         network->time_stamp[1] = 0;
5652         network->beacon_interval = 100; /* Default */
5653         network->listen_interval = 10;  /* Default */
5654         network->atim_window = 0;       /* Default */
5655         network->wpa_ie_len = 0;
5656         network->rsn_ie_len = 0;
5657 }
5658
5659 static void ipw_send_tgi_tx_key(struct ipw_priv *priv, int type, int index)
5660 {
5661         struct ipw_tgi_tx_key *key;
5662         struct host_cmd cmd = {
5663                 .cmd = IPW_CMD_TGI_TX_KEY,
5664                 .len = sizeof(*key)
5665         };
5666
5667         if (!(priv->ieee->sec.flags & (1 << index)))
5668                 return;
5669
5670         key = (struct ipw_tgi_tx_key *)&cmd.param;
5671         key->key_id = index;
5672         memcpy(key->key, priv->ieee->sec.keys[index], SCM_TEMPORAL_KEY_LENGTH);
5673         key->security_type = type;
5674         key->station_index = 0; /* always 0 for BSS */
5675         key->flags = 0;
5676         /* 0 for new key; previous value of counter (after fatal error) */
5677         key->tx_counter[0] = 0;
5678         key->tx_counter[1] = 0;
5679
5680         ipw_send_cmd(priv, &cmd);
5681 }
5682
5683 static void ipw_send_wep_keys(struct ipw_priv *priv, int type)
5684 {
5685         struct ipw_wep_key *key;
5686         int i;
5687         struct host_cmd cmd = {
5688                 .cmd = IPW_CMD_WEP_KEY,
5689                 .len = sizeof(*key)
5690         };
5691
5692         key = (struct ipw_wep_key *)&cmd.param;
5693         key->cmd_id = DINO_CMD_WEP_KEY;
5694         key->seq_num = 0;
5695
5696         /* Note: AES keys cannot be set for multiple times.
5697          * Only set it at the first time. */
5698         for (i = 0; i < 4; i++) {
5699                 key->key_index = i | type;
5700                 if (!(priv->ieee->sec.flags & (1 << i))) {
5701                         key->key_size = 0;
5702                         continue;
5703                 }
5704
5705                 key->key_size = priv->ieee->sec.key_sizes[i];
5706                 memcpy(key->key, priv->ieee->sec.keys[i], key->key_size);
5707
5708                 ipw_send_cmd(priv, &cmd);
5709         }
5710 }
5711
5712 static void ipw_set_hw_decrypt_unicast(struct ipw_priv *priv, int level)
5713 {
5714         if (priv->ieee->host_encrypt)
5715                 return;
5716
5717         switch (level) {
5718         case SEC_LEVEL_3:
5719                 priv->sys_config.disable_unicast_decryption = 0;
5720                 priv->ieee->host_decrypt = 0;
5721                 break;
5722         case SEC_LEVEL_2:
5723                 priv->sys_config.disable_unicast_decryption = 1;
5724                 priv->ieee->host_decrypt = 1;
5725                 break;
5726         case SEC_LEVEL_1:
5727                 priv->sys_config.disable_unicast_decryption = 0;
5728                 priv->ieee->host_decrypt = 0;
5729                 break;
5730         case SEC_LEVEL_0:
5731                 priv->sys_config.disable_unicast_decryption = 1;
5732                 break;
5733         default:
5734                 break;
5735         }
5736 }
5737
5738 static void ipw_set_hw_decrypt_multicast(struct ipw_priv *priv, int level)
5739 {
5740         if (priv->ieee->host_encrypt)
5741                 return;
5742
5743         switch (level) {
5744         case SEC_LEVEL_3:
5745                 priv->sys_config.disable_multicast_decryption = 0;
5746                 break;
5747         case SEC_LEVEL_2:
5748                 priv->sys_config.disable_multicast_decryption = 1;
5749                 break;
5750         case SEC_LEVEL_1:
5751                 priv->sys_config.disable_multicast_decryption = 0;
5752                 break;
5753         case SEC_LEVEL_0:
5754                 priv->sys_config.disable_multicast_decryption = 1;
5755                 break;
5756         default:
5757                 break;
5758         }
5759 }
5760
5761 static void ipw_set_hwcrypto_keys(struct ipw_priv *priv)
5762 {
5763         switch (priv->ieee->sec.level) {
5764         case SEC_LEVEL_3:
5765                 if (priv->ieee->sec.flags & SEC_ACTIVE_KEY)
5766                         ipw_send_tgi_tx_key(priv,
5767                                             DCT_FLAG_EXT_SECURITY_CCM,
5768                                             priv->ieee->sec.active_key);
5769
5770                 if (!priv->ieee->host_mc_decrypt)
5771                         ipw_send_wep_keys(priv, DCW_WEP_KEY_SEC_TYPE_CCM);
5772                 break;
5773         case SEC_LEVEL_2:
5774                 if (priv->ieee->sec.flags & SEC_ACTIVE_KEY)
5775                         ipw_send_tgi_tx_key(priv,
5776                                             DCT_FLAG_EXT_SECURITY_TKIP,
5777                                             priv->ieee->sec.active_key);
5778                 break;
5779         case SEC_LEVEL_1:
5780                 ipw_send_wep_keys(priv, DCW_WEP_KEY_SEC_TYPE_WEP);
5781                 ipw_set_hw_decrypt_unicast(priv, priv->ieee->sec.level);
5782                 ipw_set_hw_decrypt_multicast(priv, priv->ieee->sec.level);
5783                 break;
5784         case SEC_LEVEL_0:
5785         default:
5786                 break;
5787         }
5788 }
5789
5790 static void ipw_adhoc_check(void *data)
5791 {
5792         struct ipw_priv *priv = data;
5793
5794         if (priv->missed_adhoc_beacons++ > priv->disassociate_threshold &&
5795             !(priv->config & CFG_ADHOC_PERSIST)) {
5796                 IPW_DEBUG(IPW_DL_INFO | IPW_DL_NOTIF |
5797                           IPW_DL_STATE | IPW_DL_ASSOC,
5798                           "Missed beacon: %d - disassociate\n",
5799                           priv->missed_adhoc_beacons);
5800                 ipw_remove_current_network(priv);
5801                 ipw_disassociate(priv);
5802                 return;
5803         }
5804
5805         queue_delayed_work(priv->workqueue, &priv->adhoc_check,
5806                            priv->assoc_request.beacon_interval);
5807 }
5808
5809 static void ipw_bg_adhoc_check(void *data)
5810 {
5811         struct ipw_priv *priv = data;
5812         down(&priv->sem);
5813         ipw_adhoc_check(data);
5814         up(&priv->sem);
5815 }
5816
5817 #ifdef CONFIG_IPW_DEBUG
5818 static void ipw_debug_config(struct ipw_priv *priv)
5819 {
5820         IPW_DEBUG_INFO("Scan completed, no valid APs matched "
5821                        "[CFG 0x%08X]\n", priv->config);
5822         if (priv->config & CFG_STATIC_CHANNEL)
5823                 IPW_DEBUG_INFO("Channel locked to %d\n", priv->channel);
5824         else
5825                 IPW_DEBUG_INFO("Channel unlocked.\n");
5826         if (priv->config & CFG_STATIC_ESSID)
5827                 IPW_DEBUG_INFO("ESSID locked to '%s'\n",
5828                                escape_essid(priv->essid, priv->essid_len));
5829         else
5830                 IPW_DEBUG_INFO("ESSID unlocked.\n");
5831         if (priv->config & CFG_STATIC_BSSID)
5832                 IPW_DEBUG_INFO("BSSID locked to " MAC_FMT "\n",
5833                                MAC_ARG(priv->bssid));
5834         else
5835                 IPW_DEBUG_INFO("BSSID unlocked.\n");
5836         if (priv->capability & CAP_PRIVACY_ON)
5837                 IPW_DEBUG_INFO("PRIVACY on\n");
5838         else
5839                 IPW_DEBUG_INFO("PRIVACY off\n");
5840         IPW_DEBUG_INFO("RATE MASK: 0x%08X\n", priv->rates_mask);
5841 }
5842 #else
5843 #define ipw_debug_config(x) do {} while (0)
5844 #endif
5845
5846 static inline void ipw_set_fixed_rate(struct ipw_priv *priv, int mode)
5847 {
5848         /* TODO: Verify that this works... */
5849         struct ipw_fixed_rate fr = {
5850                 .tx_rates = priv->rates_mask
5851         };
5852         u32 reg;
5853         u16 mask = 0;
5854
5855         /* Identify 'current FW band' and match it with the fixed
5856          * Tx rates */
5857
5858         switch (priv->ieee->freq_band) {
5859         case IEEE80211_52GHZ_BAND:      /* A only */
5860                 /* IEEE_A */
5861                 if (priv->rates_mask & ~IEEE80211_OFDM_RATES_MASK) {
5862                         /* Invalid fixed rate mask */
5863                         IPW_DEBUG_WX
5864                             ("invalid fixed rate mask in ipw_set_fixed_rate\n");
5865                         fr.tx_rates = 0;
5866                         break;
5867                 }
5868
5869                 fr.tx_rates >>= IEEE80211_OFDM_SHIFT_MASK_A;
5870                 break;
5871
5872         default:                /* 2.4Ghz or Mixed */
5873                 /* IEEE_B */
5874                 if (mode == IEEE_B) {
5875                         if (fr.tx_rates & ~IEEE80211_CCK_RATES_MASK) {
5876                                 /* Invalid fixed rate mask */
5877                                 IPW_DEBUG_WX
5878                                     ("invalid fixed rate mask in ipw_set_fixed_rate\n");
5879                                 fr.tx_rates = 0;
5880                         }
5881                         break;
5882                 }
5883
5884                 /* IEEE_G */
5885                 if (fr.tx_rates & ~(IEEE80211_CCK_RATES_MASK |
5886                                     IEEE80211_OFDM_RATES_MASK)) {
5887                         /* Invalid fixed rate mask */
5888                         IPW_DEBUG_WX
5889                             ("invalid fixed rate mask in ipw_set_fixed_rate\n");
5890                         fr.tx_rates = 0;
5891                         break;
5892                 }
5893
5894                 if (IEEE80211_OFDM_RATE_6MB_MASK & fr.tx_rates) {
5895                         mask |= (IEEE80211_OFDM_RATE_6MB_MASK >> 1);
5896                         fr.tx_rates &= ~IEEE80211_OFDM_RATE_6MB_MASK;
5897                 }
5898
5899                 if (IEEE80211_OFDM_RATE_9MB_MASK & fr.tx_rates) {
5900                         mask |= (IEEE80211_OFDM_RATE_9MB_MASK >> 1);
5901                         fr.tx_rates &= ~IEEE80211_OFDM_RATE_9MB_MASK;
5902                 }
5903
5904                 if (IEEE80211_OFDM_RATE_12MB_MASK & fr.tx_rates) {
5905                         mask |= (IEEE80211_OFDM_RATE_12MB_MASK >> 1);
5906                         fr.tx_rates &= ~IEEE80211_OFDM_RATE_12MB_MASK;
5907                 }
5908
5909                 fr.tx_rates |= mask;
5910                 break;
5911         }
5912
5913         reg = ipw_read32(priv, IPW_MEM_FIXED_OVERRIDE);
5914         ipw_write_reg32(priv, reg, *(u32 *) & fr);
5915 }
5916
5917 static void ipw_abort_scan(struct ipw_priv *priv)
5918 {
5919         int err;
5920
5921         if (priv->status & STATUS_SCAN_ABORTING) {
5922                 IPW_DEBUG_HC("Ignoring concurrent scan abort request.\n");
5923                 return;
5924         }
5925         priv->status |= STATUS_SCAN_ABORTING;
5926
5927         err = ipw_send_scan_abort(priv);
5928         if (err)
5929                 IPW_DEBUG_HC("Request to abort scan failed.\n");
5930 }
5931
5932 static void ipw_add_scan_channels(struct ipw_priv *priv,
5933                                   struct ipw_scan_request_ext *scan,
5934                                   int scan_type)
5935 {
5936         int channel_index = 0;
5937         const struct ieee80211_geo *geo;
5938         int i;
5939
5940         geo = ipw_get_geo(priv->ieee);
5941
5942         if (priv->ieee->freq_band & IEEE80211_52GHZ_BAND) {
5943                 int start = channel_index;
5944                 for (i = 0; i < geo->a_channels; i++) {
5945                         if ((priv->status & STATUS_ASSOCIATED) &&
5946                             geo->a[i].channel == priv->channel)
5947                                 continue;
5948                         channel_index++;
5949                         scan->channels_list[channel_index] = geo->a[i].channel;
5950                         ipw_set_scan_type(scan, channel_index,
5951                                           geo->a[i].
5952                                           flags & IEEE80211_CH_PASSIVE_ONLY ?
5953                                           IPW_SCAN_PASSIVE_FULL_DWELL_SCAN :
5954                                           scan_type);
5955                 }
5956
5957                 if (start != channel_index) {
5958                         scan->channels_list[start] = (u8) (IPW_A_MODE << 6) |
5959                             (channel_index - start);
5960                         channel_index++;
5961                 }
5962         }
5963
5964         if (priv->ieee->freq_band & IEEE80211_24GHZ_BAND) {
5965                 int start = channel_index;
5966                 if (priv->config & CFG_SPEED_SCAN) {
5967                         int index;
5968                         u8 channels[IEEE80211_24GHZ_CHANNELS] = {
5969                                 /* nop out the list */
5970                                 [0] = 0
5971                         };
5972
5973                         u8 channel;
5974                         while (channel_index < IPW_SCAN_CHANNELS) {
5975                                 channel =
5976                                     priv->speed_scan[priv->speed_scan_pos];
5977                                 if (channel == 0) {
5978                                         priv->speed_scan_pos = 0;
5979                                         channel = priv->speed_scan[0];
5980                                 }
5981                                 if ((priv->status & STATUS_ASSOCIATED) &&
5982                                     channel == priv->channel) {
5983                                         priv->speed_scan_pos++;
5984                                         continue;
5985                                 }
5986
5987                                 /* If this channel has already been
5988                                  * added in scan, break from loop
5989                                  * and this will be the first channel
5990                                  * in the next scan.
5991                                  */
5992                                 if (channels[channel - 1] != 0)
5993                                         break;
5994
5995                                 channels[channel - 1] = 1;
5996                                 priv->speed_scan_pos++;
5997                                 channel_index++;
5998                                 scan->channels_list[channel_index] = channel;
5999                                 index =
6000                                     ipw_channel_to_index(priv->ieee, channel);
6001                                 ipw_set_scan_type(scan, channel_index,
6002                                                   geo->bg[index].
6003                                                   flags &
6004                                                   IEEE80211_CH_PASSIVE_ONLY ?
6005                                                   IPW_SCAN_PASSIVE_FULL_DWELL_SCAN
6006                                                   : scan_type);
6007                         }
6008                 } else {
6009                         for (i = 0; i < geo->bg_channels; i++) {
6010                                 if ((priv->status & STATUS_ASSOCIATED) &&
6011                                     geo->bg[i].channel == priv->channel)
6012                                         continue;
6013                                 channel_index++;
6014                                 scan->channels_list[channel_index] =
6015                                     geo->bg[i].channel;
6016                                 ipw_set_scan_type(scan, channel_index,
6017                                                   geo->bg[i].
6018                                                   flags &
6019                                                   IEEE80211_CH_PASSIVE_ONLY ?
6020                                                   IPW_SCAN_PASSIVE_FULL_DWELL_SCAN
6021                                                   : scan_type);
6022                         }
6023                 }
6024
6025                 if (start != channel_index) {
6026                         scan->channels_list[start] = (u8) (IPW_B_MODE << 6) |
6027                             (channel_index - start);
6028                 }
6029         }
6030 }
6031
6032 static int ipw_request_scan(struct ipw_priv *priv)
6033 {
6034         struct ipw_scan_request_ext scan;
6035         int err = 0, scan_type;
6036
6037         if (!(priv->status & STATUS_INIT) ||
6038             (priv->status & STATUS_EXIT_PENDING))
6039                 return 0;
6040
6041         down(&priv->sem);
6042
6043         if (priv->status & STATUS_SCANNING) {
6044                 IPW_DEBUG_HC("Concurrent scan requested.  Ignoring.\n");
6045                 priv->status |= STATUS_SCAN_PENDING;
6046                 goto done;
6047         }
6048
6049         if (!(priv->status & STATUS_SCAN_FORCED) &&
6050             priv->status & STATUS_SCAN_ABORTING) {
6051                 IPW_DEBUG_HC("Scan request while abort pending.  Queuing.\n");
6052                 priv->status |= STATUS_SCAN_PENDING;
6053                 goto done;
6054         }
6055
6056         if (priv->status & STATUS_RF_KILL_MASK) {
6057                 IPW_DEBUG_HC("Aborting scan due to RF Kill activation\n");
6058                 priv->status |= STATUS_SCAN_PENDING;
6059                 goto done;
6060         }
6061
6062         memset(&scan, 0, sizeof(scan));
6063
6064         if (priv->config & CFG_SPEED_SCAN)
6065                 scan.dwell_time[IPW_SCAN_ACTIVE_BROADCAST_SCAN] =
6066                     cpu_to_le16(30);
6067         else
6068                 scan.dwell_time[IPW_SCAN_ACTIVE_BROADCAST_SCAN] =
6069                     cpu_to_le16(20);
6070
6071         scan.dwell_time[IPW_SCAN_ACTIVE_BROADCAST_AND_DIRECT_SCAN] =
6072             cpu_to_le16(20);
6073         scan.dwell_time[IPW_SCAN_PASSIVE_FULL_DWELL_SCAN] = cpu_to_le16(120);
6074
6075         scan.full_scan_index = cpu_to_le32(ieee80211_get_scans(priv->ieee));
6076
6077 #ifdef CONFIG_IPW2200_MONITOR
6078         if (priv->ieee->iw_mode == IW_MODE_MONITOR) {
6079                 u8 channel;
6080                 u8 band = 0;
6081
6082                 switch (ipw_is_valid_channel(priv->ieee, priv->channel)) {
6083                 case IEEE80211_52GHZ_BAND:
6084                         band = (u8) (IPW_A_MODE << 6) | 1;
6085                         channel = priv->channel;
6086                         break;
6087
6088                 case IEEE80211_24GHZ_BAND:
6089                         band = (u8) (IPW_B_MODE << 6) | 1;
6090                         channel = priv->channel;
6091                         break;
6092
6093                 default:
6094                         band = (u8) (IPW_B_MODE << 6) | 1;
6095                         channel = 9;
6096                         break;
6097                 }
6098
6099                 scan.channels_list[0] = band;
6100                 scan.channels_list[1] = channel;
6101                 ipw_set_scan_type(&scan, 1, IPW_SCAN_PASSIVE_FULL_DWELL_SCAN);
6102
6103                 /* NOTE:  The card will sit on this channel for this time
6104                  * period.  Scan aborts are timing sensitive and frequently
6105                  * result in firmware restarts.  As such, it is best to
6106                  * set a small dwell_time here and just keep re-issuing
6107                  * scans.  Otherwise fast channel hopping will not actually
6108                  * hop channels.
6109                  *
6110                  * TODO: Move SPEED SCAN support to all modes and bands */
6111                 scan.dwell_time[IPW_SCAN_PASSIVE_FULL_DWELL_SCAN] =
6112                     cpu_to_le16(2000);
6113         } else {
6114 #endif                          /* CONFIG_IPW2200_MONITOR */
6115                 /* If we are roaming, then make this a directed scan for the
6116                  * current network.  Otherwise, ensure that every other scan
6117                  * is a fast channel hop scan */
6118                 if ((priv->status & STATUS_ROAMING)
6119                     || (!(priv->status & STATUS_ASSOCIATED)
6120                         && (priv->config & CFG_STATIC_ESSID)
6121                         && (le32_to_cpu(scan.full_scan_index) % 2))) {
6122                         err = ipw_send_ssid(priv, priv->essid, priv->essid_len);
6123                         if (err) {
6124                                 IPW_DEBUG_HC("Attempt to send SSID command "
6125                                              "failed.\n");
6126                                 goto done;
6127                         }
6128
6129                         scan_type = IPW_SCAN_ACTIVE_BROADCAST_AND_DIRECT_SCAN;
6130                 } else
6131                         scan_type = IPW_SCAN_ACTIVE_BROADCAST_SCAN;
6132
6133                 ipw_add_scan_channels(priv, &scan, scan_type);
6134 #ifdef CONFIG_IPW2200_MONITOR
6135         }
6136 #endif
6137
6138         err = ipw_send_scan_request_ext(priv, &scan);
6139         if (err) {
6140                 IPW_DEBUG_HC("Sending scan command failed: %08X\n", err);
6141                 goto done;
6142         }
6143
6144         priv->status |= STATUS_SCANNING;
6145         priv->status &= ~STATUS_SCAN_PENDING;
6146         queue_delayed_work(priv->workqueue, &priv->scan_check,
6147                            IPW_SCAN_CHECK_WATCHDOG);
6148       done:
6149         up(&priv->sem);
6150         return err;
6151 }
6152
6153 static void ipw_bg_abort_scan(void *data)
6154 {
6155         struct ipw_priv *priv = data;
6156         down(&priv->sem);
6157         ipw_abort_scan(data);
6158         up(&priv->sem);
6159 }
6160
6161 #if WIRELESS_EXT < 18
6162 /* Support for wpa_supplicant before WE-18, deprecated. */
6163
6164 /* following definitions must match definitions in driver_ipw.c */
6165
6166 #define IPW_IOCTL_WPA_SUPPLICANT                SIOCIWFIRSTPRIV+30
6167
6168 #define IPW_CMD_SET_WPA_PARAM                   1
6169 #define IPW_CMD_SET_WPA_IE                      2
6170 #define IPW_CMD_SET_ENCRYPTION                  3
6171 #define IPW_CMD_MLME                            4
6172
6173 #define IPW_PARAM_WPA_ENABLED                   1
6174 #define IPW_PARAM_TKIP_COUNTERMEASURES          2
6175 #define IPW_PARAM_DROP_UNENCRYPTED              3
6176 #define IPW_PARAM_PRIVACY_INVOKED               4
6177 #define IPW_PARAM_AUTH_ALGS                     5
6178 #define IPW_PARAM_IEEE_802_1X                   6
6179
6180 #define IPW_MLME_STA_DEAUTH                     1
6181 #define IPW_MLME_STA_DISASSOC                   2
6182
6183 #define IPW_CRYPT_ERR_UNKNOWN_ALG               2
6184 #define IPW_CRYPT_ERR_UNKNOWN_ADDR              3
6185 #define IPW_CRYPT_ERR_CRYPT_INIT_FAILED         4
6186 #define IPW_CRYPT_ERR_KEY_SET_FAILED            5
6187 #define IPW_CRYPT_ERR_TX_KEY_SET_FAILED         6
6188 #define IPW_CRYPT_ERR_CARD_CONF_FAILED          7
6189
6190 #define IPW_CRYPT_ALG_NAME_LEN                  16
6191
6192 struct ipw_param {
6193         u32 cmd;
6194         u8 sta_addr[ETH_ALEN];
6195         union {
6196                 struct {
6197                         u8 name;
6198                         u32 value;
6199                 } wpa_param;
6200                 struct {
6201                         u32 len;
6202                         u8 reserved[32];
6203                         u8 data[0];
6204                 } wpa_ie;
6205                 struct {
6206                         u32 command;
6207                         u32 reason_code;
6208                 } mlme;
6209                 struct {
6210                         u8 alg[IPW_CRYPT_ALG_NAME_LEN];
6211                         u8 set_tx;
6212                         u32 err;
6213                         u8 idx;
6214                         u8 seq[8];      /* sequence counter (set: RX, get: TX) */
6215                         u16 key_len;
6216                         u8 key[0];
6217                 } crypt;
6218
6219         } u;
6220 };
6221
6222 /* end of driver_ipw.c code */
6223 #endif
6224
6225 static int ipw_wpa_enable(struct ipw_priv *priv, int value)
6226 {
6227         /* This is called when wpa_supplicant loads and closes the driver
6228          * interface. */
6229         priv->ieee->wpa_enabled = value;
6230         return 0;
6231 }
6232
6233 #if WIRELESS_EXT < 18
6234 #define IW_AUTH_ALG_OPEN_SYSTEM                 0x1
6235 #define IW_AUTH_ALG_SHARED_KEY                  0x2
6236 #endif
6237
6238 static int ipw_wpa_set_auth_algs(struct ipw_priv *priv, int value)
6239 {
6240         struct ieee80211_device *ieee = priv->ieee;
6241         struct ieee80211_security sec = {
6242                 .flags = SEC_AUTH_MODE,
6243         };
6244         int ret = 0;
6245
6246         if (value & IW_AUTH_ALG_SHARED_KEY) {
6247                 sec.auth_mode = WLAN_AUTH_SHARED_KEY;
6248                 ieee->open_wep = 0;
6249         } else if (value & IW_AUTH_ALG_OPEN_SYSTEM) {
6250                 sec.auth_mode = WLAN_AUTH_OPEN;
6251                 ieee->open_wep = 1;
6252         } else
6253                 return -EINVAL;
6254
6255         if (ieee->set_security)
6256                 ieee->set_security(ieee->dev, &sec);
6257         else
6258                 ret = -EOPNOTSUPP;
6259
6260         return ret;
6261 }
6262
6263 void ipw_wpa_assoc_frame(struct ipw_priv *priv, char *wpa_ie, int wpa_ie_len)
6264 {
6265         /* make sure WPA is enabled */
6266         ipw_wpa_enable(priv, 1);
6267
6268         ipw_disassociate(priv);
6269 }
6270
6271 static int ipw_set_rsn_capa(struct ipw_priv *priv,
6272                             char *capabilities, int length)
6273 {
6274         struct host_cmd cmd = {
6275                 .cmd = IPW_CMD_RSN_CAPABILITIES,
6276                 .len = length,
6277         };
6278
6279         IPW_DEBUG_HC("HOST_CMD_RSN_CAPABILITIES\n");
6280
6281         memcpy(cmd.param, capabilities, length);
6282         return ipw_send_cmd(priv, &cmd);
6283 }
6284
6285 #if WIRELESS_EXT < 18
6286 static int ipw_wpa_set_param(struct net_device *dev, u8 name, u32 value)
6287 {
6288         struct ipw_priv *priv = ieee80211_priv(dev);
6289         struct ieee80211_crypt_data *crypt;
6290         unsigned long flags;
6291         int ret = 0;
6292
6293         switch (name) {
6294         case IPW_PARAM_WPA_ENABLED:
6295                 ret = ipw_wpa_enable(priv, value);
6296                 break;
6297
6298         case IPW_PARAM_TKIP_COUNTERMEASURES:
6299                 crypt = priv->ieee->crypt[priv->ieee->tx_keyidx];
6300                 if (!crypt || !crypt->ops->set_flags || !crypt->ops->get_flags) {
6301                         IPW_WARNING("Can't set TKIP countermeasures: "
6302                                     "crypt not set!\n");
6303                         break;
6304                 }
6305
6306                 flags = crypt->ops->get_flags(crypt->priv);
6307
6308                 if (value)
6309                         flags |= IEEE80211_CRYPTO_TKIP_COUNTERMEASURES;
6310                 else
6311                         flags &= ~IEEE80211_CRYPTO_TKIP_COUNTERMEASURES;
6312
6313                 crypt->ops->set_flags(flags, crypt->priv);
6314
6315                 break;
6316
6317         case IPW_PARAM_DROP_UNENCRYPTED:{
6318                         /* HACK:
6319                          *
6320                          * wpa_supplicant calls set_wpa_enabled when the driver
6321                          * is loaded and unloaded, regardless of if WPA is being
6322                          * used.  No other calls are made which can be used to
6323                          * determine if encryption will be used or not prior to
6324                          * association being expected.  If encryption is not being
6325                          * used, drop_unencrypted is set to false, else true -- we
6326                          * can use this to determine if the CAP_PRIVACY_ON bit should
6327                          * be set.
6328                          */
6329                         struct ieee80211_security sec = {
6330                                 .flags = SEC_ENABLED,
6331                                 .enabled = value,
6332                         };
6333                         priv->ieee->drop_unencrypted = value;
6334                         /* We only change SEC_LEVEL for open mode. Others
6335                          * are set by ipw_wpa_set_encryption.
6336                          */
6337                         if (!value) {
6338                                 sec.flags |= SEC_LEVEL;
6339                                 sec.level = SEC_LEVEL_0;
6340                         } else {
6341                                 sec.flags |= SEC_LEVEL;
6342                                 sec.level = SEC_LEVEL_1;
6343                         }
6344                         if (priv->ieee->set_security)
6345                                 priv->ieee->set_security(priv->ieee->dev, &sec);
6346                         break;
6347                 }
6348
6349         case IPW_PARAM_PRIVACY_INVOKED:
6350                 priv->ieee->privacy_invoked = value;
6351                 break;
6352
6353         case IPW_PARAM_AUTH_ALGS:
6354                 ret = ipw_wpa_set_auth_algs(priv, value);
6355                 break;
6356
6357         case IPW_PARAM_IEEE_802_1X:
6358                 priv->ieee->ieee802_1x = value;
6359                 break;
6360
6361         default:
6362                 IPW_ERROR("%s: Unknown WPA param: %d\n", dev->name, name);
6363                 ret = -EOPNOTSUPP;
6364         }
6365
6366         return ret;
6367 }
6368
6369 static int ipw_wpa_mlme(struct net_device *dev, int command, int reason)
6370 {
6371         struct ipw_priv *priv = ieee80211_priv(dev);
6372         int ret = 0;
6373
6374         switch (command) {
6375         case IPW_MLME_STA_DEAUTH:
6376                 // silently ignore
6377                 break;
6378
6379         case IPW_MLME_STA_DISASSOC:
6380                 ipw_disassociate(priv);
6381                 break;
6382
6383         default:
6384                 IPW_ERROR("%s: Unknown MLME request: %d\n", dev->name, command);
6385                 ret = -EOPNOTSUPP;
6386         }
6387
6388         return ret;
6389 }
6390
6391 static int ipw_wpa_ie_cipher2level(u8 cipher)
6392 {
6393         switch (cipher) {
6394         case 4:         /* CCMP */
6395                 return SEC_LEVEL_3;
6396         case 2:         /* TKIP */
6397                 return SEC_LEVEL_2;
6398         case 5:         /* WEP104 */
6399         case 1:         /* WEP40 */
6400                 return SEC_LEVEL_1;
6401         case 0:         /* NONE */
6402                 return SEC_LEVEL_0;
6403         default:
6404                 return -1;
6405         }
6406 }
6407
6408 static int ipw_wpa_set_wpa_ie(struct net_device *dev,
6409                               struct ipw_param *param, int plen)
6410 {
6411         struct ipw_priv *priv = ieee80211_priv(dev);
6412         struct ieee80211_device *ieee = priv->ieee;
6413         u8 *buf;
6414         u8 *ptk, *gtk;
6415         int level;
6416
6417         if (param->u.wpa_ie.len > MAX_WPA_IE_LEN ||
6418             (param->u.wpa_ie.len && param->u.wpa_ie.data == NULL))
6419                 return -EINVAL;
6420
6421         if (param->u.wpa_ie.len) {
6422                 buf = kmalloc(param->u.wpa_ie.len, GFP_KERNEL);
6423                 if (buf == NULL)
6424                         return -ENOMEM;
6425
6426                 memcpy(buf, param->u.wpa_ie.data, param->u.wpa_ie.len);
6427                 kfree(ieee->wpa_ie);
6428                 ieee->wpa_ie = buf;
6429                 ieee->wpa_ie_len = param->u.wpa_ie.len;
6430         } else {
6431                 kfree(ieee->wpa_ie);
6432                 ieee->wpa_ie = NULL;
6433                 ieee->wpa_ie_len = 0;
6434                 goto done;
6435         }
6436
6437         if (priv->ieee->host_encrypt)
6438                 goto done;
6439
6440         /* HACK: Parse wpa_ie here to get pairwise suite, otherwise
6441          * we need to change driver_ipw.c from wpa_supplicant. This
6442          * is OK since -Dipw is deprecated. The -Dwext driver has a
6443          * clean way to handle this. */
6444         gtk = ptk = (u8 *) ieee->wpa_ie;
6445         if (ieee->wpa_ie[0] == 0x30) {  /* RSN IE */
6446                 gtk += 4 + 3;
6447                 ptk += 4 + 4 + 2 + 3;
6448         } else {                /* WPA IE */
6449                 gtk += 8 + 3;
6450                 ptk += 8 + 4 + 2 + 3;
6451         }
6452
6453         if (ptk - (u8 *) ieee->wpa_ie > ieee->wpa_ie_len)
6454                 return -EINVAL;
6455
6456         level = ipw_wpa_ie_cipher2level(*gtk);
6457         ipw_set_hw_decrypt_multicast(priv, level);
6458
6459         level = ipw_wpa_ie_cipher2level(*ptk);
6460         ipw_set_hw_decrypt_unicast(priv, level);
6461
6462       done:
6463         ipw_wpa_assoc_frame(priv, ieee->wpa_ie, ieee->wpa_ie_len);
6464         return 0;
6465 }
6466
6467 /* implementation borrowed from hostap driver */
6468
6469 static int ipw_wpa_set_encryption(struct net_device *dev,
6470                                   struct ipw_param *param, int param_len)
6471 {
6472         int ret = 0;
6473         int group_key = 0;
6474         struct ipw_priv *priv = ieee80211_priv(dev);
6475         struct ieee80211_device *ieee = priv->ieee;
6476         struct ieee80211_crypto_ops *ops;
6477         struct ieee80211_crypt_data **crypt;
6478
6479         struct ieee80211_security sec = {
6480                 .flags = 0,
6481         };
6482
6483         param->u.crypt.err = 0;
6484         param->u.crypt.alg[IPW_CRYPT_ALG_NAME_LEN - 1] = '\0';
6485
6486         if (param_len !=
6487             (int)((char *)param->u.crypt.key - (char *)param) +
6488             param->u.crypt.key_len) {
6489                 IPW_DEBUG_INFO("Len mismatch %d, %d\n", param_len,
6490                                param->u.crypt.key_len);
6491                 return -EINVAL;
6492         }
6493         if (param->sta_addr[0] == 0xff && param->sta_addr[1] == 0xff &&
6494             param->sta_addr[2] == 0xff && param->sta_addr[3] == 0xff &&
6495             param->sta_addr[4] == 0xff && param->sta_addr[5] == 0xff) {
6496                 if (param->u.crypt.idx >= WEP_KEYS)
6497                         return -EINVAL;
6498                 crypt = &ieee->crypt[param->u.crypt.idx];
6499         } else {
6500                 return -EINVAL;
6501         }
6502
6503         if (param->u.crypt.idx != 0)
6504                 group_key = 1;
6505
6506         sec.flags |= SEC_ENABLED | SEC_ENCRYPT;
6507         if (strcmp(param->u.crypt.alg, "none") == 0) {
6508                 if (crypt) {
6509                         sec.enabled = 0;
6510                         sec.encrypt = 0;
6511                         sec.level = SEC_LEVEL_0;
6512                         sec.flags |= SEC_LEVEL;
6513                         ieee80211_crypt_delayed_deinit(ieee, crypt);
6514                 }
6515                 goto done;
6516         }
6517         sec.enabled = 1;
6518         sec.encrypt = 1;
6519
6520         /* IPW HW cannot build TKIP MIC, host decryption still needed. */
6521         if (strcmp(param->u.crypt.alg, "TKIP") == 0) {
6522                 if (group_key)
6523                         ieee->host_mc_decrypt = 1;
6524                 else
6525                         ieee->host_encrypt_msdu = 1;
6526         }
6527
6528         /*if (!(ieee->host_encrypt || ieee->host_encrypt_msdu ||
6529            ieee->host_decrypt))
6530            goto skip_host_crypt; */
6531         if (group_key ? !ieee->host_mc_decrypt :
6532             !(ieee->host_encrypt || ieee->host_decrypt ||
6533               ieee->host_encrypt_msdu))
6534                 goto skip_host_crypt;
6535
6536         ops = ieee80211_get_crypto_ops(param->u.crypt.alg);
6537         if (ops == NULL && strcmp(param->u.crypt.alg, "WEP") == 0) {
6538                 request_module("ieee80211_crypt_wep");
6539                 ops = ieee80211_get_crypto_ops(param->u.crypt.alg);
6540         } else if (ops == NULL && strcmp(param->u.crypt.alg, "TKIP") == 0) {
6541                 request_module("ieee80211_crypt_tkip");
6542                 ops = ieee80211_get_crypto_ops(param->u.crypt.alg);
6543         } else if (ops == NULL && strcmp(param->u.crypt.alg, "CCMP") == 0) {
6544                 request_module("ieee80211_crypt_ccmp");
6545                 ops = ieee80211_get_crypto_ops(param->u.crypt.alg);
6546         }
6547         if (ops == NULL) {
6548                 IPW_DEBUG_INFO("%s: unknown crypto alg '%s'\n",
6549                                dev->name, param->u.crypt.alg);
6550                 param->u.crypt.err = IPW_CRYPT_ERR_UNKNOWN_ALG;
6551                 ret = -EINVAL;
6552                 goto done;
6553         }
6554
6555         if (*crypt == NULL || (*crypt)->ops != ops) {
6556                 struct ieee80211_crypt_data *new_crypt;
6557
6558                 ieee80211_crypt_delayed_deinit(ieee, crypt);
6559
6560                 new_crypt = (struct ieee80211_crypt_data *)
6561                     kmalloc(sizeof(*new_crypt), GFP_KERNEL);
6562                 if (new_crypt == NULL) {
6563                         ret = -ENOMEM;
6564                         goto done;
6565                 }
6566                 memset(new_crypt, 0, sizeof(struct ieee80211_crypt_data));
6567                 new_crypt->ops = ops;
6568                 if (new_crypt->ops && try_module_get(new_crypt->ops->owner))
6569                         new_crypt->priv =
6570                             new_crypt->ops->init(param->u.crypt.idx);
6571
6572                 if (new_crypt->priv == NULL) {
6573                         kfree(new_crypt);
6574                         param->u.crypt.err = IPW_CRYPT_ERR_CRYPT_INIT_FAILED;
6575                         ret = -EINVAL;
6576                         goto done;
6577                 }
6578
6579                 *crypt = new_crypt;
6580         }
6581
6582         if (param->u.crypt.key_len > 0 && (*crypt)->ops->set_key &&
6583             (*crypt)->ops->set_key(param->u.crypt.key,
6584                                    param->u.crypt.key_len, param->u.crypt.seq,
6585                                    (*crypt)->priv) < 0) {
6586                 IPW_DEBUG_INFO("%s: key setting failed\n", dev->name);
6587                 param->u.crypt.err = IPW_CRYPT_ERR_KEY_SET_FAILED;
6588                 ret = -EINVAL;
6589                 goto done;
6590         }
6591
6592       skip_host_crypt:
6593         if (param->u.crypt.set_tx) {
6594                 ieee->tx_keyidx = param->u.crypt.idx;
6595                 sec.active_key = param->u.crypt.idx;
6596                 sec.flags |= SEC_ACTIVE_KEY;
6597         } else
6598                 sec.flags &= ~SEC_ACTIVE_KEY;
6599
6600         if (param->u.crypt.alg != NULL) {
6601                 memcpy(sec.keys[param->u.crypt.idx],
6602                        param->u.crypt.key, param->u.crypt.key_len);
6603                 sec.key_sizes[param->u.crypt.idx] = param->u.crypt.key_len;
6604                 sec.flags |= (1 << param->u.crypt.idx);
6605
6606                 if (strcmp(param->u.crypt.alg, "WEP") == 0) {
6607                         sec.flags |= SEC_LEVEL;
6608                         sec.level = SEC_LEVEL_1;
6609                 } else if (strcmp(param->u.crypt.alg, "TKIP") == 0) {
6610                         sec.flags |= SEC_LEVEL;
6611                         sec.level = SEC_LEVEL_2;
6612                 } else if (strcmp(param->u.crypt.alg, "CCMP") == 0) {
6613                         sec.flags |= SEC_LEVEL;
6614                         sec.level = SEC_LEVEL_3;
6615                 }
6616                 /* Don't set sec level for group keys. */
6617                 if (group_key)
6618                         sec.flags &= ~SEC_LEVEL;
6619         }
6620       done:
6621         if (ieee->set_security)
6622                 ieee->set_security(ieee->dev, &sec);
6623
6624         /* Do not reset port if card is in Managed mode since resetting will
6625          * generate new IEEE 802.11 authentication which may end up in looping
6626          * with IEEE 802.1X.  If your hardware requires a reset after WEP
6627          * configuration (for example... Prism2), implement the reset_port in
6628          * the callbacks structures used to initialize the 802.11 stack. */
6629         if (ieee->reset_on_keychange &&
6630             ieee->iw_mode != IW_MODE_INFRA &&
6631             ieee->reset_port && ieee->reset_port(dev)) {
6632                 IPW_DEBUG_INFO("%s: reset_port failed\n", dev->name);
6633                 param->u.crypt.err = IPW_CRYPT_ERR_CARD_CONF_FAILED;
6634                 return -EINVAL;
6635         }
6636
6637         return ret;
6638 }
6639
6640 static int ipw_wpa_supplicant(struct net_device *dev, struct iw_point *p)
6641 {
6642         struct ipw_param *param;
6643         struct ipw_priv *priv = ieee80211_priv(dev);
6644         int ret = 0;
6645
6646         IPW_DEBUG_INFO("wpa_supplicant: len=%d\n", p->length);
6647
6648         if (p->length < sizeof(struct ipw_param) || !p->pointer)
6649                 return -EINVAL;
6650
6651         param = (struct ipw_param *)kmalloc(p->length, GFP_KERNEL);
6652         if (param == NULL)
6653                 return -ENOMEM;
6654
6655         if (copy_from_user(param, p->pointer, p->length)) {
6656                 kfree(param);
6657                 return -EFAULT;
6658         }
6659
6660         down(&priv->sem);
6661         switch (param->cmd) {
6662
6663         case IPW_CMD_SET_WPA_PARAM:
6664                 ret = ipw_wpa_set_param(dev, param->u.wpa_param.name,
6665                                         param->u.wpa_param.value);
6666                 break;
6667
6668         case IPW_CMD_SET_WPA_IE:
6669                 ret = ipw_wpa_set_wpa_ie(dev, param, p->length);
6670                 break;
6671
6672         case IPW_CMD_SET_ENCRYPTION:
6673                 ret = ipw_wpa_set_encryption(dev, param, p->length);
6674                 break;
6675
6676         case IPW_CMD_MLME:
6677                 ret = ipw_wpa_mlme(dev, param->u.mlme.command,
6678                                    param->u.mlme.reason_code);
6679                 break;
6680
6681         default:
6682                 IPW_ERROR("%s: Unknown WPA supplicant request: %d\n",
6683                           dev->name, param->cmd);
6684                 ret = -EOPNOTSUPP;
6685         }
6686
6687         up(&priv->sem);
6688         if (ret == 0 && copy_to_user(p->pointer, param, p->length))
6689                 ret = -EFAULT;
6690
6691         kfree(param);
6692         return ret;
6693 }
6694 #else
6695 /*
6696  * WE-18 support
6697  */
6698
6699 /* SIOCSIWGENIE */
6700 static int ipw_wx_set_genie(struct net_device *dev,
6701                             struct iw_request_info *info,
6702                             union iwreq_data *wrqu, char *extra)
6703 {
6704         struct ipw_priv *priv = ieee80211_priv(dev);
6705         struct ieee80211_device *ieee = priv->ieee;
6706         u8 *buf;
6707         int err = 0;
6708
6709         if (wrqu->data.length > MAX_WPA_IE_LEN ||
6710             (wrqu->data.length && extra == NULL))
6711                 return -EINVAL;
6712
6713         //down(&priv->sem);
6714
6715         //if (!ieee->wpa_enabled) {
6716         //      err = -EOPNOTSUPP;
6717         //      goto out;
6718         //}
6719
6720         if (wrqu->data.length) {
6721                 buf = kmalloc(wrqu->data.length, GFP_KERNEL);
6722                 if (buf == NULL) {
6723                         err = -ENOMEM;
6724                         goto out;
6725                 }
6726
6727                 memcpy(buf, extra, wrqu->data.length);
6728                 kfree(ieee->wpa_ie);
6729                 ieee->wpa_ie = buf;
6730                 ieee->wpa_ie_len = wrqu->data.length;
6731         } else {
6732                 kfree(ieee->wpa_ie);
6733                 ieee->wpa_ie = NULL;
6734                 ieee->wpa_ie_len = 0;
6735         }
6736
6737         ipw_wpa_assoc_frame(priv, ieee->wpa_ie, ieee->wpa_ie_len);
6738       out:
6739         //up(&priv->sem);
6740         return err;
6741 }
6742
6743 /* SIOCGIWGENIE */
6744 static int ipw_wx_get_genie(struct net_device *dev,
6745                             struct iw_request_info *info,
6746                             union iwreq_data *wrqu, char *extra)
6747 {
6748         struct ipw_priv *priv = ieee80211_priv(dev);
6749         struct ieee80211_device *ieee = priv->ieee;
6750         int err = 0;
6751
6752         //down(&priv->sem);
6753
6754         //if (!ieee->wpa_enabled) {
6755         //      err = -EOPNOTSUPP;
6756         //      goto out;
6757         //}
6758
6759         if (ieee->wpa_ie_len == 0 || ieee->wpa_ie == NULL) {
6760                 wrqu->data.length = 0;
6761                 goto out;
6762         }
6763
6764         if (wrqu->data.length < ieee->wpa_ie_len) {
6765                 err = -E2BIG;
6766                 goto out;
6767         }
6768
6769         wrqu->data.length = ieee->wpa_ie_len;
6770         memcpy(extra, ieee->wpa_ie, ieee->wpa_ie_len);
6771
6772       out:
6773         //up(&priv->sem);
6774         return err;
6775 }
6776
6777 static int wext_cipher2level(int cipher)
6778 {
6779         switch (cipher) {
6780         case IW_AUTH_CIPHER_NONE:
6781                 return SEC_LEVEL_0;
6782         case IW_AUTH_CIPHER_WEP40:
6783         case IW_AUTH_CIPHER_WEP104:
6784                 return SEC_LEVEL_1;
6785         case IW_AUTH_CIPHER_TKIP:
6786                 return SEC_LEVEL_2;
6787         case IW_AUTH_CIPHER_CCMP:
6788                 return SEC_LEVEL_3;
6789         default:
6790                 return -1;
6791         }
6792 }
6793
6794 /* SIOCSIWAUTH */
6795 static int ipw_wx_set_auth(struct net_device *dev,
6796                            struct iw_request_info *info,
6797                            union iwreq_data *wrqu, char *extra)
6798 {
6799         struct ipw_priv *priv = ieee80211_priv(dev);
6800         struct ieee80211_device *ieee = priv->ieee;
6801         struct iw_param *param = &wrqu->param;
6802         struct ieee80211_crypt_data *crypt;
6803         unsigned long flags;
6804         int ret = 0;
6805
6806         switch (param->flags & IW_AUTH_INDEX) {
6807         case IW_AUTH_WPA_VERSION:
6808                 break;
6809         case IW_AUTH_CIPHER_PAIRWISE:
6810                 ipw_set_hw_decrypt_unicast(priv,
6811                                            wext_cipher2level(param->value));
6812                 break;
6813         case IW_AUTH_CIPHER_GROUP:
6814                 ipw_set_hw_decrypt_multicast(priv,
6815                                              wext_cipher2level(param->value));
6816                 break;
6817         case IW_AUTH_KEY_MGMT:
6818                 /*
6819                  * ipw2200 does not use these parameters
6820                  */
6821                 break;
6822
6823         case IW_AUTH_TKIP_COUNTERMEASURES:
6824                 crypt = priv->ieee->crypt[priv->ieee->tx_keyidx];
6825                 if (!crypt || !crypt->ops->set_flags || !crypt->ops->get_flags) {
6826                         IPW_WARNING("Can't set TKIP countermeasures: "
6827                                     "crypt not set!\n");
6828                         break;
6829                 }
6830
6831                 flags = crypt->ops->get_flags(crypt->priv);
6832
6833                 if (param->value)
6834                         flags |= IEEE80211_CRYPTO_TKIP_COUNTERMEASURES;
6835                 else
6836                         flags &= ~IEEE80211_CRYPTO_TKIP_COUNTERMEASURES;
6837
6838                 crypt->ops->set_flags(flags, crypt->priv);
6839
6840                 break;
6841
6842         case IW_AUTH_DROP_UNENCRYPTED:{
6843                         /* HACK:
6844                          *
6845                          * wpa_supplicant calls set_wpa_enabled when the driver
6846                          * is loaded and unloaded, regardless of if WPA is being
6847                          * used.  No other calls are made which can be used to
6848                          * determine if encryption will be used or not prior to
6849                          * association being expected.  If encryption is not being
6850                          * used, drop_unencrypted is set to false, else true -- we
6851                          * can use this to determine if the CAP_PRIVACY_ON bit should
6852                          * be set.
6853                          */
6854                         struct ieee80211_security sec = {
6855                                 .flags = SEC_ENABLED,
6856                                 .enabled = param->value,
6857                         };
6858                         priv->ieee->drop_unencrypted = param->value;
6859                         /* We only change SEC_LEVEL for open mode. Others
6860                          * are set by ipw_wpa_set_encryption.
6861                          */
6862                         if (!param->value) {
6863                                 sec.flags |= SEC_LEVEL;
6864                                 sec.level = SEC_LEVEL_0;
6865                         } else {
6866                                 sec.flags |= SEC_LEVEL;
6867                                 sec.level = SEC_LEVEL_1;
6868                         }
6869                         if (priv->ieee->set_security)
6870                                 priv->ieee->set_security(priv->ieee->dev, &sec);
6871                         break;
6872                 }
6873
6874         case IW_AUTH_80211_AUTH_ALG:
6875                 ret = ipw_wpa_set_auth_algs(priv, param->value);
6876                 break;
6877
6878         case IW_AUTH_WPA_ENABLED:
6879                 ret = ipw_wpa_enable(priv, param->value);
6880                 break;
6881
6882         case IW_AUTH_RX_UNENCRYPTED_EAPOL:
6883                 ieee->ieee802_1x = param->value;
6884                 break;
6885
6886                 //case IW_AUTH_ROAMING_CONTROL:
6887         case IW_AUTH_PRIVACY_INVOKED:
6888                 ieee->privacy_invoked = param->value;
6889                 break;
6890
6891         default:
6892                 return -EOPNOTSUPP;
6893         }
6894         return ret;
6895 }
6896
6897 /* SIOCGIWAUTH */
6898 static int ipw_wx_get_auth(struct net_device *dev,
6899                            struct iw_request_info *info,
6900                            union iwreq_data *wrqu, char *extra)
6901 {
6902         struct ipw_priv *priv = ieee80211_priv(dev);
6903         struct ieee80211_device *ieee = priv->ieee;
6904         struct ieee80211_crypt_data *crypt;
6905         struct iw_param *param = &wrqu->param;
6906         int ret = 0;
6907
6908         switch (param->flags & IW_AUTH_INDEX) {
6909         case IW_AUTH_WPA_VERSION:
6910         case IW_AUTH_CIPHER_PAIRWISE:
6911         case IW_AUTH_CIPHER_GROUP:
6912         case IW_AUTH_KEY_MGMT:
6913                 /*
6914                  * wpa_supplicant will control these internally
6915                  */
6916                 ret = -EOPNOTSUPP;
6917                 break;
6918
6919         case IW_AUTH_TKIP_COUNTERMEASURES:
6920                 crypt = priv->ieee->crypt[priv->ieee->tx_keyidx];
6921                 if (!crypt || !crypt->ops->get_flags) {
6922                         IPW_WARNING("Can't get TKIP countermeasures: "
6923                                     "crypt not set!\n");
6924                         break;
6925                 }
6926
6927                 param->value = (crypt->ops->get_flags(crypt->priv) &
6928                                 IEEE80211_CRYPTO_TKIP_COUNTERMEASURES) ? 1 : 0;
6929
6930                 break;
6931
6932         case IW_AUTH_DROP_UNENCRYPTED:
6933                 param->value = ieee->drop_unencrypted;
6934                 break;
6935
6936         case IW_AUTH_80211_AUTH_ALG:
6937                 param->value = ieee->sec.auth_mode;
6938                 break;
6939
6940         case IW_AUTH_WPA_ENABLED:
6941                 param->value = ieee->wpa_enabled;
6942                 break;
6943
6944         case IW_AUTH_RX_UNENCRYPTED_EAPOL:
6945                 param->value = ieee->ieee802_1x;
6946                 break;
6947
6948         case IW_AUTH_ROAMING_CONTROL:
6949         case IW_AUTH_PRIVACY_INVOKED:
6950                 param->value = ieee->privacy_invoked;
6951                 break;
6952
6953         default:
6954                 return -EOPNOTSUPP;
6955         }
6956         return 0;
6957 }
6958
6959 /* SIOCSIWENCODEEXT */
6960 static int ipw_wx_set_encodeext(struct net_device *dev,
6961                                 struct iw_request_info *info,
6962                                 union iwreq_data *wrqu, char *extra)
6963 {
6964         struct ipw_priv *priv = ieee80211_priv(dev);
6965         struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;
6966
6967         if (hwcrypto) {
6968                 if (ext->alg == IW_ENCODE_ALG_TKIP) {
6969                         /* IPW HW can't build TKIP MIC,
6970                            host decryption still needed */
6971                         if (ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY)
6972                                 priv->ieee->host_mc_decrypt = 1;
6973                         else {
6974                                 priv->ieee->host_encrypt = 0;
6975                                 priv->ieee->host_encrypt_msdu = 1;
6976                                 priv->ieee->host_decrypt = 1;
6977                         }
6978                 } else {
6979                         priv->ieee->host_encrypt = 0;
6980                         priv->ieee->host_encrypt_msdu = 0;
6981                         priv->ieee->host_decrypt = 0;
6982                         priv->ieee->host_mc_decrypt = 0;
6983                 }
6984         }
6985
6986         return ieee80211_wx_set_encodeext(priv->ieee, info, wrqu, extra);
6987 }
6988
6989 /* SIOCGIWENCODEEXT */
6990 static int ipw_wx_get_encodeext(struct net_device *dev,
6991                                 struct iw_request_info *info,
6992                                 union iwreq_data *wrqu, char *extra)
6993 {
6994         struct ipw_priv *priv = ieee80211_priv(dev);
6995         return ieee80211_wx_get_encodeext(priv->ieee, info, wrqu, extra);
6996 }
6997
6998 /* SIOCSIWMLME */
6999 static int ipw_wx_set_mlme(struct net_device *dev,
7000                            struct iw_request_info *info,
7001                            union iwreq_data *wrqu, char *extra)
7002 {
7003         struct ipw_priv *priv = ieee80211_priv(dev);
7004         struct iw_mlme *mlme = (struct iw_mlme *)extra;
7005         u16 reason;
7006
7007         reason = cpu_to_le16(mlme->reason_code);
7008
7009         switch (mlme->cmd) {
7010         case IW_MLME_DEAUTH:
7011                 // silently ignore
7012                 break;
7013
7014         case IW_MLME_DISASSOC:
7015                 ipw_disassociate(priv);
7016                 break;
7017
7018         default:
7019                 return -EOPNOTSUPP;
7020         }
7021         return 0;
7022 }
7023 #endif
7024
7025 #ifdef CONFIG_IPW_QOS
7026
7027 /* QoS */
7028 /*
7029 * get the modulation type of the current network or
7030 * the card current mode
7031 */
7032 u8 ipw_qos_current_mode(struct ipw_priv * priv)
7033 {
7034         u8 mode = 0;
7035
7036         if (priv->status & STATUS_ASSOCIATED) {
7037                 unsigned long flags;
7038
7039                 spin_lock_irqsave(&priv->ieee->lock, flags);
7040                 mode = priv->assoc_network->mode;
7041                 spin_unlock_irqrestore(&priv->ieee->lock, flags);
7042         } else {
7043                 mode = priv->ieee->mode;
7044         }
7045         IPW_DEBUG_QOS("QoS network/card mode %d \n", mode);
7046         return mode;
7047 }
7048
7049 /*
7050 * Handle management frame beacon and probe response
7051 */
7052 static int ipw_qos_handle_probe_response(struct ipw_priv *priv,
7053                                          int active_network,
7054                                          struct ieee80211_network *network)
7055 {
7056         u32 size = sizeof(struct ieee80211_qos_parameters);
7057
7058         if (network->capability & WLAN_CAPABILITY_IBSS)
7059                 network->qos_data.active = network->qos_data.supported;
7060
7061         if (network->flags & NETWORK_HAS_QOS_MASK) {
7062                 if (active_network &&
7063                     (network->flags & NETWORK_HAS_QOS_PARAMETERS))
7064                         network->qos_data.active = network->qos_data.supported;
7065
7066                 if ((network->qos_data.active == 1) && (active_network == 1) &&
7067                     (network->flags & NETWORK_HAS_QOS_PARAMETERS) &&
7068                     (network->qos_data.old_param_count !=
7069                      network->qos_data.param_count)) {
7070                         network->qos_data.old_param_count =
7071                             network->qos_data.param_count;
7072                         schedule_work(&priv->qos_activate);
7073                         IPW_DEBUG_QOS("QoS parameters change call "
7074                                       "qos_activate\n");
7075                 }
7076         } else {
7077                 if ((priv->ieee->mode == IEEE_B) || (network->mode == IEEE_B))
7078                         memcpy(&network->qos_data.parameters,
7079                                &def_parameters_CCK, size);
7080                 else
7081                         memcpy(&network->qos_data.parameters,
7082                                &def_parameters_OFDM, size);
7083
7084                 if ((network->qos_data.active == 1) && (active_network == 1)) {
7085                         IPW_DEBUG_QOS("QoS was disabled call qos_activate \n");
7086                         schedule_work(&priv->qos_activate);
7087                 }
7088
7089                 network->qos_data.active = 0;
7090                 network->qos_data.supported = 0;
7091         }
7092         if ((priv->status & STATUS_ASSOCIATED) &&
7093             (priv->ieee->iw_mode == IW_MODE_ADHOC) && (active_network == 0)) {
7094                 if (memcmp(network->bssid, priv->bssid, ETH_ALEN))
7095                         if ((network->capability & WLAN_CAPABILITY_IBSS) &&
7096                             !(network->flags & NETWORK_EMPTY_ESSID))
7097                                 if ((network->ssid_len ==
7098                                      priv->assoc_network->ssid_len) &&
7099                                     !memcmp(network->ssid,
7100                                             priv->assoc_network->ssid,
7101                                             network->ssid_len)) {
7102                                         queue_work(priv->workqueue,
7103                                                    &priv->merge_networks);
7104                                 }
7105         }
7106
7107         return 0;
7108 }
7109
7110 /*
7111 * This function set up the firmware to support QoS. It sends
7112 * IPW_CMD_QOS_PARAMETERS and IPW_CMD_WME_INFO
7113 */
7114 static int ipw_qos_activate(struct ipw_priv *priv,
7115                             struct ieee80211_qos_data *qos_network_data)
7116 {
7117         int err;
7118         struct ieee80211_qos_parameters qos_parameters[QOS_QOS_SETS];
7119         struct ieee80211_qos_parameters *active_one = NULL;
7120         u32 size = sizeof(struct ieee80211_qos_parameters);
7121         u32 burst_duration;
7122         int i;
7123         u8 type;
7124
7125         type = ipw_qos_current_mode(priv);
7126
7127         active_one = &(qos_parameters[QOS_PARAM_SET_DEF_CCK]);
7128         memcpy(active_one, priv->qos_data.def_qos_parm_CCK, size);
7129         active_one = &(qos_parameters[QOS_PARAM_SET_DEF_OFDM]);
7130         memcpy(active_one, priv->qos_data.def_qos_parm_OFDM, size);
7131
7132         if (qos_network_data == NULL) {
7133                 if (type == IEEE_B) {
7134                         IPW_DEBUG_QOS("QoS activate network mode %d\n", type);
7135                         active_one = &def_parameters_CCK;
7136                 } else
7137                         active_one = &def_parameters_OFDM;
7138
7139                 memcpy(&qos_parameters[QOS_PARAM_SET_ACTIVE], active_one, size);
7140                 burst_duration = ipw_qos_get_burst_duration(priv);
7141                 for (i = 0; i < QOS_QUEUE_NUM; i++)
7142                         qos_parameters[QOS_PARAM_SET_ACTIVE].tx_op_limit[i] =
7143                             (u16) burst_duration;
7144         } else if (priv->ieee->iw_mode == IW_MODE_ADHOC) {
7145                 if (type == IEEE_B) {
7146                         IPW_DEBUG_QOS("QoS activate IBSS nework mode %d\n",
7147                                       type);
7148                         if (priv->qos_data.qos_enable == 0)
7149                                 active_one = &def_parameters_CCK;
7150                         else
7151                                 active_one = priv->qos_data.def_qos_parm_CCK;
7152                 } else {
7153                         if (priv->qos_data.qos_enable == 0)
7154                                 active_one = &def_parameters_OFDM;
7155                         else
7156                                 active_one = priv->qos_data.def_qos_parm_OFDM;
7157                 }
7158                 memcpy(&qos_parameters[QOS_PARAM_SET_ACTIVE], active_one, size);
7159         } else {
7160                 unsigned long flags;
7161                 int active;
7162
7163                 spin_lock_irqsave(&priv->ieee->lock, flags);
7164                 active_one = &(qos_network_data->parameters);
7165                 qos_network_data->old_param_count =
7166                     qos_network_data->param_count;
7167                 memcpy(&qos_parameters[QOS_PARAM_SET_ACTIVE], active_one, size);
7168                 active = qos_network_data->supported;
7169                 spin_unlock_irqrestore(&priv->ieee->lock, flags);
7170
7171                 if (active == 0) {
7172                         burst_duration = ipw_qos_get_burst_duration(priv);
7173                         for (i = 0; i < QOS_QUEUE_NUM; i++)
7174                                 qos_parameters[QOS_PARAM_SET_ACTIVE].
7175                                     tx_op_limit[i] = (u16) burst_duration;
7176                 }
7177         }
7178
7179         IPW_DEBUG_QOS("QoS sending IPW_CMD_QOS_PARAMETERS\n");
7180         err = ipw_send_qos_params_command(priv,
7181                                           (struct ieee80211_qos_parameters *)
7182                                           &(qos_parameters[0]));
7183         if (err)
7184                 IPW_DEBUG_QOS("QoS IPW_CMD_QOS_PARAMETERS failed\n");
7185
7186         return err;
7187 }
7188
7189 /*
7190 * send IPW_CMD_WME_INFO to the firmware
7191 */
7192 static int ipw_qos_set_info_element(struct ipw_priv *priv)
7193 {
7194         int ret = 0;
7195         struct ieee80211_qos_information_element qos_info;
7196
7197         if (priv == NULL)
7198                 return -1;
7199
7200         qos_info.elementID = QOS_ELEMENT_ID;
7201         qos_info.length = sizeof(struct ieee80211_qos_information_element) - 2;
7202
7203         qos_info.version = QOS_VERSION_1;
7204         qos_info.ac_info = 0;
7205
7206         memcpy(qos_info.qui, qos_oui, QOS_OUI_LEN);
7207         qos_info.qui_type = QOS_OUI_TYPE;
7208         qos_info.qui_subtype = QOS_OUI_INFO_SUB_TYPE;
7209
7210         ret = ipw_send_qos_info_command(priv, &qos_info);
7211         if (ret != 0) {
7212                 IPW_DEBUG_QOS("QoS error calling ipw_send_qos_info_command\n");
7213         }
7214         return ret;
7215 }
7216
7217 /*
7218 * Set the QoS parameter with the association request structure
7219 */
7220 static int ipw_qos_association(struct ipw_priv *priv,
7221                                struct ieee80211_network *network)
7222 {
7223         int err = 0;
7224         struct ieee80211_qos_data *qos_data = NULL;
7225         struct ieee80211_qos_data ibss_data = {
7226                 .supported = 1,
7227                 .active = 1,
7228         };
7229
7230         switch (priv->ieee->iw_mode) {
7231         case IW_MODE_ADHOC:
7232                 if (!(network->capability & WLAN_CAPABILITY_IBSS))
7233                         BUG();
7234
7235                 qos_data = &ibss_data;
7236                 break;
7237
7238         case IW_MODE_INFRA:
7239                 qos_data = &network->qos_data;
7240                 break;
7241
7242         default:
7243                 BUG();
7244                 break;
7245         }
7246
7247         err = ipw_qos_activate(priv, qos_data);
7248         if (err) {
7249                 priv->assoc_request.policy_support &= ~HC_QOS_SUPPORT_ASSOC;
7250                 return err;
7251         }
7252
7253         if (priv->qos_data.qos_enable && qos_data->supported) {
7254                 IPW_DEBUG_QOS("QoS will be enabled for this association\n");
7255                 priv->assoc_request.policy_support |= HC_QOS_SUPPORT_ASSOC;
7256                 return ipw_qos_set_info_element(priv);
7257         }
7258
7259         return 0;
7260 }
7261
7262 /*
7263 * handling the beaconing responces. if we get different QoS setting
7264 * of the network from the the associated setting adjust the QoS
7265 * setting
7266 */
7267 static int ipw_qos_association_resp(struct ipw_priv *priv,
7268                                     struct ieee80211_network *network)
7269 {
7270         int ret = 0;
7271         unsigned long flags;
7272         u32 size = sizeof(struct ieee80211_qos_parameters);
7273         int set_qos_param = 0;
7274
7275         if ((priv == NULL) || (network == NULL) ||
7276             (priv->assoc_network == NULL))
7277                 return ret;
7278
7279         if (!(priv->status & STATUS_ASSOCIATED))
7280                 return ret;
7281
7282         if ((priv->ieee->iw_mode != IW_MODE_INFRA))
7283                 return ret;
7284
7285         spin_lock_irqsave(&priv->ieee->lock, flags);
7286         if (network->flags & NETWORK_HAS_QOS_PARAMETERS) {
7287                 memcpy(&priv->assoc_network->qos_data, &network->qos_data,
7288                        sizeof(struct ieee80211_qos_data));
7289                 priv->assoc_network->qos_data.active = 1;
7290                 if ((network->qos_data.old_param_count !=
7291                      network->qos_data.param_count)) {
7292                         set_qos_param = 1;
7293                         network->qos_data.old_param_count =
7294                             network->qos_data.param_count;
7295                 }
7296
7297         } else {
7298                 if ((network->mode == IEEE_B) || (priv->ieee->mode == IEEE_B))
7299                         memcpy(&priv->assoc_network->qos_data.parameters,
7300                                &def_parameters_CCK, size);
7301                 else
7302                         memcpy(&priv->assoc_network->qos_data.parameters,
7303                                &def_parameters_OFDM, size);
7304                 priv->assoc_network->qos_data.active = 0;
7305                 priv->assoc_network->qos_data.supported = 0;
7306                 set_qos_param = 1;
7307         }
7308
7309         spin_unlock_irqrestore(&priv->ieee->lock, flags);
7310
7311         if (set_qos_param == 1)
7312                 schedule_work(&priv->qos_activate);
7313
7314         return ret;
7315 }
7316
7317 static u32 ipw_qos_get_burst_duration(struct ipw_priv *priv)
7318 {
7319         u32 ret = 0;
7320
7321         if ((priv == NULL))
7322                 return 0;
7323
7324         if (!(priv->ieee->modulation & IEEE80211_OFDM_MODULATION))
7325                 ret = priv->qos_data.burst_duration_CCK;
7326         else
7327                 ret = priv->qos_data.burst_duration_OFDM;
7328
7329         return ret;
7330 }
7331
7332 /*
7333 * Initialize the setting of QoS global
7334 */
7335 static void ipw_qos_init(struct ipw_priv *priv, int enable,
7336                          int burst_enable, u32 burst_duration_CCK,
7337                          u32 burst_duration_OFDM)
7338 {
7339         priv->qos_data.qos_enable = enable;
7340
7341         if (priv->qos_data.qos_enable) {
7342                 priv->qos_data.def_qos_parm_CCK = &def_qos_parameters_CCK;
7343                 priv->qos_data.def_qos_parm_OFDM = &def_qos_parameters_OFDM;
7344                 IPW_DEBUG_QOS("QoS is enabled\n");
7345         } else {
7346                 priv->qos_data.def_qos_parm_CCK = &def_parameters_CCK;
7347                 priv->qos_data.def_qos_parm_OFDM = &def_parameters_OFDM;
7348                 IPW_DEBUG_QOS("QoS is not enabled\n");
7349         }
7350
7351         priv->qos_data.burst_enable = burst_enable;
7352
7353         if (burst_enable) {
7354                 priv->qos_data.burst_duration_CCK = burst_duration_CCK;
7355                 priv->qos_data.burst_duration_OFDM = burst_duration_OFDM;
7356         } else {
7357                 priv->qos_data.burst_duration_CCK = 0;
7358                 priv->qos_data.burst_duration_OFDM = 0;
7359         }
7360 }
7361
7362 /*
7363 * map the packet priority to the right TX Queue
7364 */
7365 static int ipw_get_tx_queue_number(struct ipw_priv *priv, u16 priority)
7366 {
7367         if (priority > 7 || !priv->qos_data.qos_enable)
7368                 priority = 0;
7369
7370         return from_priority_to_tx_queue[priority] - 1;
7371 }
7372
7373 /*
7374 * add QoS parameter to the TX command
7375 */
7376 static int ipw_qos_set_tx_queue_command(struct ipw_priv *priv,
7377                                         u16 priority,
7378                                         struct tfd_data *tfd, u8 unicast)
7379 {
7380         int ret = 0;
7381         int tx_queue_id = 0;
7382         struct ieee80211_qos_data *qos_data = NULL;
7383         int active, supported;
7384         unsigned long flags;
7385
7386         if (!(priv->status & STATUS_ASSOCIATED))
7387                 return 0;
7388
7389         qos_data = &priv->assoc_network->qos_data;
7390
7391         spin_lock_irqsave(&priv->ieee->lock, flags);
7392
7393         if (priv->ieee->iw_mode == IW_MODE_ADHOC) {
7394                 if (unicast == 0)
7395                         qos_data->active = 0;
7396                 else
7397                         qos_data->active = qos_data->supported;
7398         }
7399
7400         active = qos_data->active;
7401         supported = qos_data->supported;
7402
7403         spin_unlock_irqrestore(&priv->ieee->lock, flags);
7404
7405         IPW_DEBUG_QOS("QoS  %d network is QoS active %d  supported %d  "
7406                       "unicast %d\n",
7407                       priv->qos_data.qos_enable, active, supported, unicast);
7408         if (active && priv->qos_data.qos_enable) {
7409                 ret = from_priority_to_tx_queue[priority];
7410                 tx_queue_id = ret - 1;
7411                 IPW_DEBUG_QOS("QoS packet priority is %d \n", priority);
7412                 if (priority <= 7) {
7413                         tfd->tx_flags_ext |= DCT_FLAG_EXT_QOS_ENABLED;
7414                         tfd->tfd.tfd_26.mchdr.qos_ctrl = priority;
7415                         tfd->tfd.tfd_26.mchdr.frame_ctl |=
7416                             IEEE80211_STYPE_QOS_DATA;
7417
7418                         if (priv->qos_data.qos_no_ack_mask &
7419                             (1UL << tx_queue_id)) {
7420                                 tfd->tx_flags &= ~DCT_FLAG_ACK_REQD;
7421                                 tfd->tfd.tfd_26.mchdr.qos_ctrl |=
7422                                     CTRL_QOS_NO_ACK;
7423                         }
7424                 }
7425         }
7426
7427         return ret;
7428 }
7429
7430 /*
7431 * background support to run QoS activate functionality
7432 */
7433 static void ipw_bg_qos_activate(void *data)
7434 {
7435         struct ipw_priv *priv = data;
7436
7437         if (priv == NULL)
7438                 return;
7439
7440         down(&priv->sem);
7441
7442         if (priv->status & STATUS_ASSOCIATED)
7443                 ipw_qos_activate(priv, &(priv->assoc_network->qos_data));
7444
7445         up(&priv->sem);
7446 }
7447
7448 static int ipw_handle_probe_response(struct net_device *dev,
7449                                      struct ieee80211_probe_response *resp,
7450                                      struct ieee80211_network *network)
7451 {
7452         struct ipw_priv *priv = ieee80211_priv(dev);
7453         int active_network = ((priv->status & STATUS_ASSOCIATED) &&
7454                               (network == priv->assoc_network));
7455
7456         ipw_qos_handle_probe_response(priv, active_network, network);
7457
7458         return 0;
7459 }
7460
7461 static int ipw_handle_beacon(struct net_device *dev,
7462                              struct ieee80211_beacon *resp,
7463                              struct ieee80211_network *network)
7464 {
7465         struct ipw_priv *priv = ieee80211_priv(dev);
7466         int active_network = ((priv->status & STATUS_ASSOCIATED) &&
7467                               (network == priv->assoc_network));
7468
7469         ipw_qos_handle_probe_response(priv, active_network, network);
7470
7471         return 0;
7472 }
7473
7474 static int ipw_handle_assoc_response(struct net_device *dev,
7475                                      struct ieee80211_assoc_response *resp,
7476                                      struct ieee80211_network *network)
7477 {
7478         struct ipw_priv *priv = ieee80211_priv(dev);
7479         ipw_qos_association_resp(priv, network);
7480         return 0;
7481 }
7482
7483 static int ipw_send_qos_params_command(struct ipw_priv *priv, struct ieee80211_qos_parameters
7484                                        *qos_param)
7485 {
7486         struct host_cmd cmd = {
7487                 .cmd = IPW_CMD_QOS_PARAMETERS,
7488                 .len = (sizeof(struct ieee80211_qos_parameters) * 3)
7489         };
7490
7491         memcpy(cmd.param, qos_param, sizeof(*qos_param) * 3);
7492         return ipw_send_cmd(priv, &cmd);
7493 }
7494
7495 static int ipw_send_qos_info_command(struct ipw_priv *priv, struct ieee80211_qos_information_element
7496                                      *qos_param)
7497 {
7498         struct host_cmd cmd = {
7499                 .cmd = IPW_CMD_WME_INFO,
7500                 .len = sizeof(*qos_param)
7501         };
7502
7503         memcpy(cmd.param, qos_param, sizeof(*qos_param));
7504         return ipw_send_cmd(priv, &cmd);
7505 }
7506
7507 #endif                          /* CONFIG_IPW_QOS */
7508
7509 static int ipw_associate_network(struct ipw_priv *priv,
7510                                  struct ieee80211_network *network,
7511                                  struct ipw_supported_rates *rates, int roaming)
7512 {
7513         int err;
7514
7515         if (priv->config & CFG_FIXED_RATE)
7516                 ipw_set_fixed_rate(priv, network->mode);
7517
7518         if (!(priv->config & CFG_STATIC_ESSID)) {
7519                 priv->essid_len = min(network->ssid_len,
7520                                       (u8) IW_ESSID_MAX_SIZE);
7521                 memcpy(priv->essid, network->ssid, priv->essid_len);
7522         }
7523
7524         network->last_associate = jiffies;
7525
7526         memset(&priv->assoc_request, 0, sizeof(priv->assoc_request));
7527         priv->assoc_request.channel = network->channel;
7528         if ((priv->capability & CAP_PRIVACY_ON) &&
7529             (priv->capability & CAP_SHARED_KEY)) {
7530                 priv->assoc_request.auth_type = AUTH_SHARED_KEY;
7531                 priv->assoc_request.auth_key = priv->ieee->sec.active_key;
7532
7533                 if ((priv->capability & CAP_PRIVACY_ON) &&
7534                     (priv->ieee->sec.level == SEC_LEVEL_1) &&
7535                     !(priv->ieee->host_encrypt || priv->ieee->host_decrypt))
7536                         ipw_send_wep_keys(priv, DCW_WEP_KEY_SEC_TYPE_WEP);
7537         } else {
7538                 priv->assoc_request.auth_type = AUTH_OPEN;
7539                 priv->assoc_request.auth_key = 0;
7540         }
7541
7542         if (priv->ieee->wpa_ie_len) {
7543                 priv->assoc_request.policy_support = 0x02;      /* RSN active */
7544                 ipw_set_rsn_capa(priv, priv->ieee->wpa_ie,
7545                                  priv->ieee->wpa_ie_len);
7546         }
7547
7548         /*
7549          * It is valid for our ieee device to support multiple modes, but
7550          * when it comes to associating to a given network we have to choose
7551          * just one mode.
7552          */
7553         if (network->mode & priv->ieee->mode & IEEE_A)
7554                 priv->assoc_request.ieee_mode = IPW_A_MODE;
7555         else if (network->mode & priv->ieee->mode & IEEE_G)
7556                 priv->assoc_request.ieee_mode = IPW_G_MODE;
7557         else if (network->mode & priv->ieee->mode & IEEE_B)
7558                 priv->assoc_request.ieee_mode = IPW_B_MODE;
7559
7560         priv->assoc_request.capability = network->capability;
7561         if ((network->capability & WLAN_CAPABILITY_SHORT_PREAMBLE)
7562             && !(priv->config & CFG_PREAMBLE_LONG)) {
7563                 priv->assoc_request.preamble_length = DCT_FLAG_SHORT_PREAMBLE;
7564         } else {
7565                 priv->assoc_request.preamble_length = DCT_FLAG_LONG_PREAMBLE;
7566
7567                 /* Clear the short preamble if we won't be supporting it */
7568                 priv->assoc_request.capability &=
7569                     ~WLAN_CAPABILITY_SHORT_PREAMBLE;
7570         }
7571
7572         /* Clear capability bits that aren't used in Ad Hoc */
7573         if (priv->ieee->iw_mode == IW_MODE_ADHOC)
7574                 priv->assoc_request.capability &=
7575                     ~WLAN_CAPABILITY_SHORT_SLOT_TIME;
7576
7577         IPW_DEBUG_ASSOC("%sssocation attempt: '%s', channel %d, "
7578                         "802.11%c [%d], %s[:%s], enc=%s%s%s%c%c\n",
7579                         roaming ? "Rea" : "A",
7580                         escape_essid(priv->essid, priv->essid_len),
7581                         network->channel,
7582                         ipw_modes[priv->assoc_request.ieee_mode],
7583                         rates->num_rates,
7584                         (priv->assoc_request.preamble_length ==
7585                          DCT_FLAG_LONG_PREAMBLE) ? "long" : "short",
7586                         network->capability &
7587                         WLAN_CAPABILITY_SHORT_PREAMBLE ? "short" : "long",
7588                         priv->capability & CAP_PRIVACY_ON ? "on " : "off",
7589                         priv->capability & CAP_PRIVACY_ON ?
7590                         (priv->capability & CAP_SHARED_KEY ? "(shared)" :
7591                          "(open)") : "",
7592                         priv->capability & CAP_PRIVACY_ON ? " key=" : "",
7593                         priv->capability & CAP_PRIVACY_ON ?
7594                         '1' + priv->ieee->sec.active_key : '.',
7595                         priv->capability & CAP_PRIVACY_ON ? '.' : ' ');
7596
7597         priv->assoc_request.beacon_interval = network->beacon_interval;
7598         if ((priv->ieee->iw_mode == IW_MODE_ADHOC) &&
7599             (network->time_stamp[0] == 0) && (network->time_stamp[1] == 0)) {
7600                 priv->assoc_request.assoc_type = HC_IBSS_START;
7601                 priv->assoc_request.assoc_tsf_msw = 0;
7602                 priv->assoc_request.assoc_tsf_lsw = 0;
7603         } else {
7604                 if (unlikely(roaming))
7605                         priv->assoc_request.assoc_type = HC_REASSOCIATE;
7606                 else
7607                         priv->assoc_request.assoc_type = HC_ASSOCIATE;
7608                 priv->assoc_request.assoc_tsf_msw = network->time_stamp[1];
7609                 priv->assoc_request.assoc_tsf_lsw = network->time_stamp[0];
7610         }
7611
7612         memcpy(priv->assoc_request.bssid, network->bssid, ETH_ALEN);
7613
7614         if (priv->ieee->iw_mode == IW_MODE_ADHOC) {
7615                 memset(&priv->assoc_request.dest, 0xFF, ETH_ALEN);
7616                 priv->assoc_request.atim_window = network->atim_window;
7617         } else {
7618                 memcpy(priv->assoc_request.dest, network->bssid, ETH_ALEN);
7619                 priv->assoc_request.atim_window = 0;
7620         }
7621
7622         priv->assoc_request.listen_interval = network->listen_interval;
7623
7624         err = ipw_send_ssid(priv, priv->essid, priv->essid_len);
7625         if (err) {
7626                 IPW_DEBUG_HC("Attempt to send SSID command failed.\n");
7627                 return err;
7628         }
7629
7630         rates->ieee_mode = priv->assoc_request.ieee_mode;
7631         rates->purpose = IPW_RATE_CONNECT;
7632         ipw_send_supported_rates(priv, rates);
7633
7634         if (priv->assoc_request.ieee_mode == IPW_G_MODE)
7635                 priv->sys_config.dot11g_auto_detection = 1;
7636         else
7637                 priv->sys_config.dot11g_auto_detection = 0;
7638
7639         if (priv->ieee->iw_mode == IW_MODE_ADHOC)
7640                 priv->sys_config.answer_broadcast_ssid_probe = 1;
7641         else
7642                 priv->sys_config.answer_broadcast_ssid_probe = 0;
7643
7644         err = ipw_send_system_config(priv, &priv->sys_config);
7645         if (err) {
7646                 IPW_DEBUG_HC("Attempt to send sys config command failed.\n");
7647                 return err;
7648         }
7649
7650         IPW_DEBUG_ASSOC("Association sensitivity: %d\n", network->stats.rssi);
7651         err = ipw_set_sensitivity(priv, network->stats.rssi + IPW_RSSI_TO_DBM);
7652         if (err) {
7653                 IPW_DEBUG_HC("Attempt to send associate command failed.\n");
7654                 return err;
7655         }
7656
7657         /*
7658          * If preemption is enabled, it is possible for the association
7659          * to complete before we return from ipw_send_associate.  Therefore
7660          * we have to be sure and update our priviate data first.
7661          */
7662         priv->channel = network->channel;
7663         memcpy(priv->bssid, network->bssid, ETH_ALEN);
7664         priv->status |= STATUS_ASSOCIATING;
7665         priv->status &= ~STATUS_SECURITY_UPDATED;
7666
7667         priv->assoc_network = network;
7668
7669 #ifdef CONFIG_IPW_QOS
7670         ipw_qos_association(priv, network);
7671 #endif
7672
7673         err = ipw_send_associate(priv, &priv->assoc_request);
7674         if (err) {
7675                 IPW_DEBUG_HC("Attempt to send associate command failed.\n");
7676                 return err;
7677         }
7678
7679         IPW_DEBUG(IPW_DL_STATE, "associating: '%s' " MAC_FMT " \n",
7680                   escape_essid(priv->essid, priv->essid_len),
7681                   MAC_ARG(priv->bssid));
7682
7683         return 0;
7684 }
7685
7686 static void ipw_roam(void *data)
7687 {
7688         struct ipw_priv *priv = data;
7689         struct ieee80211_network *network = NULL;
7690         struct ipw_network_match match = {
7691                 .network = priv->assoc_network
7692         };
7693
7694         /* The roaming process is as follows:
7695          *
7696          * 1.  Missed beacon threshold triggers the roaming process by
7697          *     setting the status ROAM bit and requesting a scan.
7698          * 2.  When the scan completes, it schedules the ROAM work
7699          * 3.  The ROAM work looks at all of the known networks for one that
7700          *     is a better network than the currently associated.  If none
7701          *     found, the ROAM process is over (ROAM bit cleared)
7702          * 4.  If a better network is found, a disassociation request is
7703          *     sent.
7704          * 5.  When the disassociation completes, the roam work is again
7705          *     scheduled.  The second time through, the driver is no longer
7706          *     associated, and the newly selected network is sent an
7707          *     association request.
7708          * 6.  At this point ,the roaming process is complete and the ROAM
7709          *     status bit is cleared.
7710          */
7711
7712         /* If we are no longer associated, and the roaming bit is no longer
7713          * set, then we are not actively roaming, so just return */
7714         if (!(priv->status & (STATUS_ASSOCIATED | STATUS_ROAMING)))
7715                 return;
7716
7717         if (priv->status & STATUS_ASSOCIATED) {
7718                 /* First pass through ROAM process -- look for a better
7719                  * network */
7720                 unsigned long flags;
7721                 u8 rssi = priv->assoc_network->stats.rssi;
7722                 priv->assoc_network->stats.rssi = -128;
7723                 spin_lock_irqsave(&priv->ieee->lock, flags);
7724                 list_for_each_entry(network, &priv->ieee->network_list, list) {
7725                         if (network != priv->assoc_network)
7726                                 ipw_best_network(priv, &match, network, 1);
7727                 }
7728                 spin_unlock_irqrestore(&priv->ieee->lock, flags);
7729                 priv->assoc_network->stats.rssi = rssi;
7730
7731                 if (match.network == priv->assoc_network) {
7732                         IPW_DEBUG_ASSOC("No better APs in this network to "
7733                                         "roam to.\n");
7734                         priv->status &= ~STATUS_ROAMING;
7735                         ipw_debug_config(priv);
7736                         return;
7737                 }
7738
7739                 ipw_send_disassociate(priv, 1);
7740                 priv->assoc_network = match.network;
7741
7742                 return;
7743         }
7744
7745         /* Second pass through ROAM process -- request association */
7746         ipw_compatible_rates(priv, priv->assoc_network, &match.rates);
7747         ipw_associate_network(priv, priv->assoc_network, &match.rates, 1);
7748         priv->status &= ~STATUS_ROAMING;
7749 }
7750
7751 static void ipw_bg_roam(void *data)
7752 {
7753         struct ipw_priv *priv = data;
7754         down(&priv->sem);
7755         ipw_roam(data);
7756         up(&priv->sem);
7757 }
7758
7759 static int ipw_associate(void *data)
7760 {
7761         struct ipw_priv *priv = data;
7762
7763         struct ieee80211_network *network = NULL;
7764         struct ipw_network_match match = {
7765                 .network = NULL
7766         };
7767         struct ipw_supported_rates *rates;
7768         struct list_head *element;
7769         unsigned long flags;
7770
7771         if (priv->ieee->iw_mode == IW_MODE_MONITOR) {
7772                 IPW_DEBUG_ASSOC("Not attempting association (monitor mode)\n");
7773                 return 0;
7774         }
7775
7776         if (priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING)) {
7777                 IPW_DEBUG_ASSOC("Not attempting association (already in "
7778                                 "progress)\n");
7779                 return 0;
7780         }
7781
7782         if (priv->status & STATUS_DISASSOCIATING) {
7783                 IPW_DEBUG_ASSOC("Not attempting association (in "
7784                                 "disassociating)\n ");
7785                 queue_work(priv->workqueue, &priv->associate);
7786                 return 0;
7787         }
7788
7789         if (!ipw_is_init(priv) || (priv->status & STATUS_SCANNING)) {
7790                 IPW_DEBUG_ASSOC("Not attempting association (scanning or not "
7791                                 "initialized)\n");
7792                 return 0;
7793         }
7794
7795         if (!(priv->config & CFG_ASSOCIATE) &&
7796             !(priv->config & (CFG_STATIC_ESSID |
7797                               CFG_STATIC_CHANNEL | CFG_STATIC_BSSID))) {
7798                 IPW_DEBUG_ASSOC("Not attempting association (associate=0)\n");
7799                 return 0;
7800         }
7801
7802         /* Protect our use of the network_list */
7803         spin_lock_irqsave(&priv->ieee->lock, flags);
7804         list_for_each_entry(network, &priv->ieee->network_list, list)
7805             ipw_best_network(priv, &match, network, 0);
7806
7807         network = match.network;
7808         rates = &match.rates;
7809
7810         if (network == NULL &&
7811             priv->ieee->iw_mode == IW_MODE_ADHOC &&
7812             priv->config & CFG_ADHOC_CREATE &&
7813             priv->config & CFG_STATIC_ESSID &&
7814             priv->config & CFG_STATIC_CHANNEL &&
7815             !list_empty(&priv->ieee->network_free_list)) {
7816                 element = priv->ieee->network_free_list.next;
7817                 network = list_entry(element, struct ieee80211_network, list);
7818                 ipw_adhoc_create(priv, network);
7819                 rates = &priv->rates;
7820                 list_del(element);
7821                 list_add_tail(&network->list, &priv->ieee->network_list);
7822         }
7823         spin_unlock_irqrestore(&priv->ieee->lock, flags);
7824
7825         /* If we reached the end of the list, then we don't have any valid
7826          * matching APs */
7827         if (!network) {
7828                 ipw_debug_config(priv);
7829
7830                 if (!(priv->status & STATUS_SCANNING)) {
7831                         if (!(priv->config & CFG_SPEED_SCAN))
7832                                 queue_delayed_work(priv->workqueue,
7833                                                    &priv->request_scan,
7834                                                    SCAN_INTERVAL);
7835                         else
7836                                 queue_work(priv->workqueue,
7837                                            &priv->request_scan);
7838                 }
7839
7840                 return 0;
7841         }
7842
7843         ipw_associate_network(priv, network, rates, 0);
7844
7845         return 1;
7846 }
7847
7848 static void ipw_bg_associate(void *data)
7849 {
7850         struct ipw_priv *priv = data;
7851         down(&priv->sem);
7852         ipw_associate(data);
7853         up(&priv->sem);
7854 }
7855
7856 static void ipw_rebuild_decrypted_skb(struct ipw_priv *priv,
7857                                       struct sk_buff *skb)
7858 {
7859         struct ieee80211_hdr *hdr;
7860         u16 fc;
7861
7862         hdr = (struct ieee80211_hdr *)skb->data;
7863         fc = le16_to_cpu(hdr->frame_ctl);
7864         if (!(fc & IEEE80211_FCTL_PROTECTED))
7865                 return;
7866
7867         fc &= ~IEEE80211_FCTL_PROTECTED;
7868         hdr->frame_ctl = cpu_to_le16(fc);
7869         switch (priv->ieee->sec.level) {
7870         case SEC_LEVEL_3:
7871                 /* Remove CCMP HDR */
7872                 memmove(skb->data + IEEE80211_3ADDR_LEN,
7873                         skb->data + IEEE80211_3ADDR_LEN + 8,
7874                         skb->len - IEEE80211_3ADDR_LEN - 8);
7875                 skb_trim(skb, skb->len - 16);   /* CCMP_HDR_LEN + CCMP_MIC_LEN */
7876                 break;
7877         case SEC_LEVEL_2:
7878                 break;
7879         case SEC_LEVEL_1:
7880                 /* Remove IV */
7881                 memmove(skb->data + IEEE80211_3ADDR_LEN,
7882                         skb->data + IEEE80211_3ADDR_LEN + 4,
7883                         skb->len - IEEE80211_3ADDR_LEN - 4);
7884                 skb_trim(skb, skb->len - 8);    /* IV + ICV */
7885                 break;
7886         case SEC_LEVEL_0:
7887                 break;
7888         default:
7889                 printk(KERN_ERR "Unknow security level %d\n",
7890                        priv->ieee->sec.level);
7891                 break;
7892         }
7893 }
7894
7895 static void ipw_handle_data_packet(struct ipw_priv *priv,
7896                                    struct ipw_rx_mem_buffer *rxb,
7897                                    struct ieee80211_rx_stats *stats)
7898 {
7899         struct ieee80211_hdr_4addr *hdr;
7900         struct ipw_rx_packet *pkt = (struct ipw_rx_packet *)rxb->skb->data;
7901
7902         /* We received data from the HW, so stop the watchdog */
7903         priv->net_dev->trans_start = jiffies;
7904
7905         /* We only process data packets if the
7906          * interface is open */
7907         if (unlikely((le16_to_cpu(pkt->u.frame.length) + IPW_RX_FRAME_SIZE) >
7908                      skb_tailroom(rxb->skb))) {
7909                 priv->ieee->stats.rx_errors++;
7910                 priv->wstats.discard.misc++;
7911                 IPW_DEBUG_DROP("Corruption detected! Oh no!\n");
7912                 return;
7913         } else if (unlikely(!netif_running(priv->net_dev))) {
7914                 priv->ieee->stats.rx_dropped++;
7915                 priv->wstats.discard.misc++;
7916                 IPW_DEBUG_DROP("Dropping packet while interface is not up.\n");
7917                 return;
7918         }
7919
7920         /* Advance skb->data to the start of the actual payload */
7921         skb_reserve(rxb->skb, offsetof(struct ipw_rx_packet, u.frame.data));
7922
7923         /* Set the size of the skb to the size of the frame */
7924         skb_put(rxb->skb, le16_to_cpu(pkt->u.frame.length));
7925
7926         IPW_DEBUG_RX("Rx packet of %d bytes.\n", rxb->skb->len);
7927
7928         /* HW decrypt will not clear the WEP bit, MIC, PN, etc. */
7929         hdr = (struct ieee80211_hdr_4addr *)rxb->skb->data;
7930         if (priv->ieee->iw_mode != IW_MODE_MONITOR &&
7931             (is_multicast_ether_addr(hdr->addr1) ?
7932              !priv->ieee->host_mc_decrypt : !priv->ieee->host_decrypt))
7933                 ipw_rebuild_decrypted_skb(priv, rxb->skb);
7934
7935         if (!ieee80211_rx(priv->ieee, rxb->skb, stats))
7936                 priv->ieee->stats.rx_errors++;
7937         else {                  /* ieee80211_rx succeeded, so it now owns the SKB */
7938                 rxb->skb = NULL;
7939                 __ipw_led_activity_on(priv);
7940         }
7941 }
7942
7943 #ifdef CONFIG_IEEE80211_RADIOTAP
7944 static void ipw_handle_data_packet_monitor(struct ipw_priv *priv,
7945                                            struct ipw_rx_mem_buffer *rxb,
7946                                            struct ieee80211_rx_stats *stats)
7947 {
7948         struct ipw_rx_packet *pkt = (struct ipw_rx_packet *)rxb->skb->data;
7949         struct ipw_rx_frame *frame = &pkt->u.frame;
7950
7951         /* initial pull of some data */
7952         u16 received_channel = frame->received_channel;
7953         u8 antennaAndPhy = frame->antennaAndPhy;
7954         s8 antsignal = frame->rssi_dbm - IPW_RSSI_TO_DBM;       /* call it signed anyhow */
7955         u16 pktrate = frame->rate;
7956
7957         /* Magic struct that slots into the radiotap header -- no reason
7958          * to build this manually element by element, we can write it much
7959          * more efficiently than we can parse it. ORDER MATTERS HERE */
7960         struct ipw_rt_hdr {
7961                 struct ieee80211_radiotap_header rt_hdr;
7962                 u8 rt_flags;    /* radiotap packet flags */
7963                 u8 rt_rate;     /* rate in 500kb/s */
7964                 u16 rt_channel; /* channel in mhz */
7965                 u16 rt_chbitmask;       /* channel bitfield */
7966                 s8 rt_dbmsignal;        /* signal in dbM, kluged to signed */
7967                 u8 rt_antenna;  /* antenna number */
7968         } *ipw_rt;
7969
7970         short len = le16_to_cpu(pkt->u.frame.length);
7971
7972         /* We received data from the HW, so stop the watchdog */
7973         priv->net_dev->trans_start = jiffies;
7974
7975         /* We only process data packets if the
7976          * interface is open */
7977         if (unlikely((le16_to_cpu(pkt->u.frame.length) + IPW_RX_FRAME_SIZE) >
7978                      skb_tailroom(rxb->skb))) {
7979                 priv->ieee->stats.rx_errors++;
7980                 priv->wstats.discard.misc++;
7981                 IPW_DEBUG_DROP("Corruption detected! Oh no!\n");
7982                 return;
7983         } else if (unlikely(!netif_running(priv->net_dev))) {
7984                 priv->ieee->stats.rx_dropped++;
7985                 priv->wstats.discard.misc++;
7986                 IPW_DEBUG_DROP("Dropping packet while interface is not up.\n");
7987                 return;
7988         }
7989
7990         /* Libpcap 0.9.3+ can handle variable length radiotap, so we'll use
7991          * that now */
7992         if (len > IPW_RX_BUF_SIZE - sizeof(struct ipw_rt_hdr)) {
7993                 /* FIXME: Should alloc bigger skb instead */
7994                 priv->ieee->stats.rx_dropped++;
7995                 priv->wstats.discard.misc++;
7996                 IPW_DEBUG_DROP("Dropping too large packet in monitor\n");
7997                 return;
7998         }
7999
8000         /* copy the frame itself */
8001         memmove(rxb->skb->data + sizeof(struct ipw_rt_hdr),
8002                 rxb->skb->data + IPW_RX_FRAME_SIZE, len);
8003
8004         /* Zero the radiotap static buffer  ...  We only need to zero the bytes NOT
8005          * part of our real header, saves a little time.
8006          *
8007          * No longer necessary since we fill in all our data.  Purge before merging
8008          * patch officially.
8009          * memset(rxb->skb->data + sizeof(struct ipw_rt_hdr), 0,
8010          *        IEEE80211_RADIOTAP_HDRLEN - sizeof(struct ipw_rt_hdr));
8011          */
8012
8013         ipw_rt = (struct ipw_rt_hdr *)rxb->skb->data;
8014
8015         ipw_rt->rt_hdr.it_version = PKTHDR_RADIOTAP_VERSION;
8016         ipw_rt->rt_hdr.it_pad = 0;      /* always good to zero */
8017         ipw_rt->rt_hdr.it_len = sizeof(struct ipw_rt_hdr);      /* total header+data */
8018
8019         /* Big bitfield of all the fields we provide in radiotap */
8020         ipw_rt->rt_hdr.it_present =
8021             ((1 << IEEE80211_RADIOTAP_FLAGS) |
8022              (1 << IEEE80211_RADIOTAP_RATE) |
8023              (1 << IEEE80211_RADIOTAP_CHANNEL) |
8024              (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) |
8025              (1 << IEEE80211_RADIOTAP_ANTENNA));
8026
8027         /* Zero the flags, we'll add to them as we go */
8028         ipw_rt->rt_flags = 0;
8029
8030         /* Convert signal to DBM */
8031         ipw_rt->rt_dbmsignal = antsignal;
8032
8033         /* Convert the channel data and set the flags */
8034         ipw_rt->rt_channel = cpu_to_le16(ieee80211chan2mhz(received_channel));
8035         if (received_channel > 14) {    /* 802.11a */
8036                 ipw_rt->rt_chbitmask =
8037                     cpu_to_le16((IEEE80211_CHAN_OFDM | IEEE80211_CHAN_5GHZ));
8038         } else if (antennaAndPhy & 32) {        /* 802.11b */
8039                 ipw_rt->rt_chbitmask =
8040                     cpu_to_le16((IEEE80211_CHAN_CCK | IEEE80211_CHAN_2GHZ));
8041         } else {                /* 802.11g */
8042                 ipw_rt->rt_chbitmask =
8043                     (IEEE80211_CHAN_OFDM | IEEE80211_CHAN_2GHZ);
8044         }
8045
8046         /* set the rate in multiples of 500k/s */
8047         switch (pktrate) {
8048         case IPW_TX_RATE_1MB:
8049                 ipw_rt->rt_rate = 2;
8050                 break;
8051         case IPW_TX_RATE_2MB:
8052                 ipw_rt->rt_rate = 4;
8053                 break;
8054         case IPW_TX_RATE_5MB:
8055                 ipw_rt->rt_rate = 10;
8056                 break;
8057         case IPW_TX_RATE_6MB:
8058                 ipw_rt->rt_rate = 12;
8059                 break;
8060         case IPW_TX_RATE_9MB:
8061                 ipw_rt->rt_rate = 18;
8062                 break;
8063         case IPW_TX_RATE_11MB:
8064                 ipw_rt->rt_rate = 22;
8065                 break;
8066         case IPW_TX_RATE_12MB:
8067                 ipw_rt->rt_rate = 24;
8068                 break;
8069         case IPW_TX_RATE_18MB:
8070                 ipw_rt->rt_rate = 36;
8071                 break;
8072         case IPW_TX_RATE_24MB:
8073                 ipw_rt->rt_rate = 48;
8074                 break;
8075         case IPW_TX_RATE_36MB:
8076                 ipw_rt->rt_rate = 72;
8077                 break;
8078         case IPW_TX_RATE_48MB:
8079                 ipw_rt->rt_rate = 96;
8080                 break;
8081         case IPW_TX_RATE_54MB:
8082                 ipw_rt->rt_rate = 108;
8083                 break;
8084         default:
8085                 ipw_rt->rt_rate = 0;
8086                 break;
8087         }
8088
8089         /* antenna number */
8090         ipw_rt->rt_antenna = (antennaAndPhy & 3);       /* Is this right? */
8091
8092         /* set the preamble flag if we have it */
8093         if ((antennaAndPhy & 64))
8094                 ipw_rt->rt_flags |= IEEE80211_RADIOTAP_F_SHORTPRE;
8095
8096         /* Set the size of the skb to the size of the frame */
8097         skb_put(rxb->skb, len + sizeof(struct ipw_rt_hdr));
8098
8099         IPW_DEBUG_RX("Rx packet of %d bytes.\n", rxb->skb->len);
8100
8101         if (!ieee80211_rx(priv->ieee, rxb->skb, stats))
8102                 priv->ieee->stats.rx_errors++;
8103         else {                  /* ieee80211_rx succeeded, so it now owns the SKB */
8104                 rxb->skb = NULL;
8105                 /* no LED during capture */
8106         }
8107 }
8108 #endif
8109
8110 static inline int is_network_packet(struct ipw_priv *priv,
8111                                     struct ieee80211_hdr_4addr *header)
8112 {
8113         /* Filter incoming packets to determine if they are targetted toward
8114          * this network, discarding packets coming from ourselves */
8115         switch (priv->ieee->iw_mode) {
8116         case IW_MODE_ADHOC:     /* Header: Dest. | Source    | BSSID */
8117                 /* packets from our adapter are dropped (echo) */
8118                 if (!memcmp(header->addr2, priv->net_dev->dev_addr, ETH_ALEN))
8119                         return 0;
8120
8121                 /* {broad,multi}cast packets to our BSSID go through */
8122                 if (is_multicast_ether_addr(header->addr1) ||
8123                     is_broadcast_ether_addr(header->addr1))
8124                         return !memcmp(header->addr3, priv->bssid, ETH_ALEN);
8125
8126                 /* packets to our adapter go through */
8127                 return !memcmp(header->addr1, priv->net_dev->dev_addr,
8128                                ETH_ALEN);
8129
8130         case IW_MODE_INFRA:     /* Header: Dest. | BSSID | Source */
8131                 /* packets from our adapter are dropped (echo) */
8132                 if (!memcmp(header->addr3, priv->net_dev->dev_addr, ETH_ALEN))
8133                         return 0;
8134
8135                 /* {broad,multi}cast packets to our BSS go through */
8136                 if (is_multicast_ether_addr(header->addr1) ||
8137                     is_broadcast_ether_addr(header->addr1))
8138                         return !memcmp(header->addr2, priv->bssid, ETH_ALEN);
8139
8140                 /* packets to our adapter go through */
8141                 return !memcmp(header->addr1, priv->net_dev->dev_addr,
8142                                ETH_ALEN);
8143         }
8144
8145         return 1;
8146 }
8147
8148 #define IPW_PACKET_RETRY_TIME HZ
8149
8150 static inline int is_duplicate_packet(struct ipw_priv *priv,
8151                                       struct ieee80211_hdr_4addr *header)
8152 {
8153         u16 sc = le16_to_cpu(header->seq_ctl);
8154         u16 seq = WLAN_GET_SEQ_SEQ(sc);
8155         u16 frag = WLAN_GET_SEQ_FRAG(sc);
8156         u16 *last_seq, *last_frag;
8157         unsigned long *last_time;
8158
8159         switch (priv->ieee->iw_mode) {
8160         case IW_MODE_ADHOC:
8161                 {
8162                         struct list_head *p;
8163                         struct ipw_ibss_seq *entry = NULL;
8164                         u8 *mac = header->addr2;
8165                         int index = mac[5] % IPW_IBSS_MAC_HASH_SIZE;
8166
8167                         __list_for_each(p, &priv->ibss_mac_hash[index]) {
8168                                 entry =
8169                                     list_entry(p, struct ipw_ibss_seq, list);
8170                                 if (!memcmp(entry->mac, mac, ETH_ALEN))
8171                                         break;
8172                         }
8173                         if (p == &priv->ibss_mac_hash[index]) {
8174                                 entry = kmalloc(sizeof(*entry), GFP_ATOMIC);
8175                                 if (!entry) {
8176                                         IPW_ERROR
8177                                             ("Cannot malloc new mac entry\n");
8178                                         return 0;
8179                                 }
8180                                 memcpy(entry->mac, mac, ETH_ALEN);
8181                                 entry->seq_num = seq;
8182                                 entry->frag_num = frag;
8183                                 entry->packet_time = jiffies;
8184                                 list_add(&entry->list,
8185                                          &priv->ibss_mac_hash[index]);
8186                                 return 0;
8187                         }
8188                         last_seq = &entry->seq_num;
8189                         last_frag = &entry->frag_num;
8190                         last_time = &entry->packet_time;
8191                         break;
8192                 }
8193         case IW_MODE_INFRA:
8194                 last_seq = &priv->last_seq_num;
8195                 last_frag = &priv->last_frag_num;
8196                 last_time = &priv->last_packet_time;
8197                 break;
8198         default:
8199                 return 0;
8200         }
8201         if ((*last_seq == seq) &&
8202             time_after(*last_time + IPW_PACKET_RETRY_TIME, jiffies)) {
8203                 if (*last_frag == frag)
8204                         goto drop;
8205                 if (*last_frag + 1 != frag)
8206                         /* out-of-order fragment */
8207                         goto drop;
8208         } else
8209                 *last_seq = seq;
8210
8211         *last_frag = frag;
8212         *last_time = jiffies;
8213         return 0;
8214
8215       drop:
8216         /* Comment this line now since we observed the card receives
8217          * duplicate packets but the FCTL_RETRY bit is not set in the
8218          * IBSS mode with fragmentation enabled.
8219          BUG_ON(!(le16_to_cpu(header->frame_ctl) & IEEE80211_FCTL_RETRY)); */
8220         return 1;
8221 }
8222
8223 static void ipw_handle_mgmt_packet(struct ipw_priv *priv,
8224                                    struct ipw_rx_mem_buffer *rxb,
8225                                    struct ieee80211_rx_stats *stats)
8226 {
8227         struct sk_buff *skb = rxb->skb;
8228         struct ipw_rx_packet *pkt = (struct ipw_rx_packet *)skb->data;
8229         struct ieee80211_hdr_4addr *header = (struct ieee80211_hdr_4addr *)
8230             (skb->data + IPW_RX_FRAME_SIZE);
8231
8232         ieee80211_rx_mgt(priv->ieee, header, stats);
8233
8234         if (priv->ieee->iw_mode == IW_MODE_ADHOC &&
8235             ((WLAN_FC_GET_STYPE(le16_to_cpu(header->frame_ctl)) ==
8236               IEEE80211_STYPE_PROBE_RESP) ||
8237              (WLAN_FC_GET_STYPE(le16_to_cpu(header->frame_ctl)) ==
8238               IEEE80211_STYPE_BEACON))) {
8239                 if (!memcmp(header->addr3, priv->bssid, ETH_ALEN))
8240                         ipw_add_station(priv, header->addr2);
8241         }
8242
8243         if (priv->config & CFG_NET_STATS) {
8244                 IPW_DEBUG_HC("sending stat packet\n");
8245
8246                 /* Set the size of the skb to the size of the full
8247                  * ipw header and 802.11 frame */
8248                 skb_put(skb, le16_to_cpu(pkt->u.frame.length) +
8249                         IPW_RX_FRAME_SIZE);
8250
8251                 /* Advance past the ipw packet header to the 802.11 frame */
8252                 skb_pull(skb, IPW_RX_FRAME_SIZE);
8253
8254                 /* Push the ieee80211_rx_stats before the 802.11 frame */
8255                 memcpy(skb_push(skb, sizeof(*stats)), stats, sizeof(*stats));
8256
8257                 skb->dev = priv->ieee->dev;
8258
8259                 /* Point raw at the ieee80211_stats */
8260                 skb->mac.raw = skb->data;
8261
8262                 skb->pkt_type = PACKET_OTHERHOST;
8263                 skb->protocol = __constant_htons(ETH_P_80211_STATS);
8264                 memset(skb->cb, 0, sizeof(rxb->skb->cb));
8265                 netif_rx(skb);
8266                 rxb->skb = NULL;
8267         }
8268 }
8269
8270 /*
8271  * Main entry function for recieving a packet with 80211 headers.  This
8272  * should be called when ever the FW has notified us that there is a new
8273  * skb in the recieve queue.
8274  */
8275 static void ipw_rx(struct ipw_priv *priv)
8276 {
8277         struct ipw_rx_mem_buffer *rxb;
8278         struct ipw_rx_packet *pkt;
8279         struct ieee80211_hdr_4addr *header;
8280         u32 r, w, i;
8281         u8 network_packet;
8282
8283         r = ipw_read32(priv, IPW_RX_READ_INDEX);
8284         w = ipw_read32(priv, IPW_RX_WRITE_INDEX);
8285         i = (priv->rxq->processed + 1) % RX_QUEUE_SIZE;
8286
8287         while (i != r) {
8288                 rxb = priv->rxq->queue[i];
8289 #ifdef CONFIG_IPW_DEBUG
8290                 if (unlikely(rxb == NULL)) {
8291                         printk(KERN_CRIT "Queue not allocated!\n");
8292                         break;
8293                 }
8294 #endif
8295                 priv->rxq->queue[i] = NULL;
8296
8297                 pci_dma_sync_single_for_cpu(priv->pci_dev, rxb->dma_addr,
8298                                             IPW_RX_BUF_SIZE,
8299                                             PCI_DMA_FROMDEVICE);
8300
8301                 pkt = (struct ipw_rx_packet *)rxb->skb->data;
8302                 IPW_DEBUG_RX("Packet: type=%02X seq=%02X bits=%02X\n",
8303                              pkt->header.message_type,
8304                              pkt->header.rx_seq_num, pkt->header.control_bits);
8305
8306                 switch (pkt->header.message_type) {
8307                 case RX_FRAME_TYPE:     /* 802.11 frame */  {
8308                                 struct ieee80211_rx_stats stats = {
8309                                         .rssi =
8310                                             le16_to_cpu(pkt->u.frame.rssi_dbm) -
8311                                             IPW_RSSI_TO_DBM,
8312                                         .signal =
8313                                             le16_to_cpu(pkt->u.frame.signal),
8314                                         .noise =
8315                                             le16_to_cpu(pkt->u.frame.noise),
8316                                         .rate = pkt->u.frame.rate,
8317                                         .mac_time = jiffies,
8318                                         .received_channel =
8319                                             pkt->u.frame.received_channel,
8320                                         .freq =
8321                                             (pkt->u.frame.
8322                                              control & (1 << 0)) ?
8323                                             IEEE80211_24GHZ_BAND :
8324                                             IEEE80211_52GHZ_BAND,
8325                                         .len = le16_to_cpu(pkt->u.frame.length),
8326                                 };
8327
8328                                 if (stats.rssi != 0)
8329                                         stats.mask |= IEEE80211_STATMASK_RSSI;
8330                                 if (stats.signal != 0)
8331                                         stats.mask |= IEEE80211_STATMASK_SIGNAL;
8332                                 if (stats.noise != 0)
8333                                         stats.mask |= IEEE80211_STATMASK_NOISE;
8334                                 if (stats.rate != 0)
8335                                         stats.mask |= IEEE80211_STATMASK_RATE;
8336
8337                                 priv->rx_packets++;
8338
8339 #ifdef CONFIG_IPW2200_MONITOR
8340                                 if (priv->ieee->iw_mode == IW_MODE_MONITOR) {
8341 #ifdef CONFIG_IEEE80211_RADIOTAP
8342                                         ipw_handle_data_packet_monitor(priv,
8343                                                                        rxb,
8344                                                                        &stats);
8345 #else
8346                                         ipw_handle_data_packet(priv, rxb,
8347                                                                &stats);
8348 #endif
8349                                         break;
8350                                 }
8351 #endif
8352
8353                                 header =
8354                                     (struct ieee80211_hdr_4addr *)(rxb->skb->
8355                                                                    data +
8356                                                                    IPW_RX_FRAME_SIZE);
8357                                 /* TODO: Check Ad-Hoc dest/source and make sure
8358                                  * that we are actually parsing these packets
8359                                  * correctly -- we should probably use the
8360                                  * frame control of the packet and disregard
8361                                  * the current iw_mode */
8362
8363                                 network_packet =
8364                                     is_network_packet(priv, header);
8365                                 if (network_packet && priv->assoc_network) {
8366                                         priv->assoc_network->stats.rssi =
8367                                             stats.rssi;
8368                                         average_add(&priv->average_rssi,
8369                                                     stats.rssi);
8370                                         priv->last_rx_rssi = stats.rssi;
8371                                 }
8372
8373                                 IPW_DEBUG_RX("Frame: len=%u\n",
8374                                              le16_to_cpu(pkt->u.frame.length));
8375
8376                                 if (le16_to_cpu(pkt->u.frame.length) <
8377                                     frame_hdr_len(header)) {
8378                                         IPW_DEBUG_DROP
8379                                             ("Received packet is too small. "
8380                                              "Dropping.\n");
8381                                         priv->ieee->stats.rx_errors++;
8382                                         priv->wstats.discard.misc++;
8383                                         break;
8384                                 }
8385
8386                                 switch (WLAN_FC_GET_TYPE
8387                                         (le16_to_cpu(header->frame_ctl))) {
8388
8389                                 case IEEE80211_FTYPE_MGMT:
8390                                         ipw_handle_mgmt_packet(priv, rxb,
8391                                                                &stats);
8392                                         break;
8393
8394                                 case IEEE80211_FTYPE_CTL:
8395                                         break;
8396
8397                                 case IEEE80211_FTYPE_DATA:
8398                                         if (unlikely(!network_packet ||
8399                                                      is_duplicate_packet(priv,
8400                                                                          header)))
8401                                         {
8402                                                 IPW_DEBUG_DROP("Dropping: "
8403                                                                MAC_FMT ", "
8404                                                                MAC_FMT ", "
8405                                                                MAC_FMT "\n",
8406                                                                MAC_ARG(header->
8407                                                                        addr1),
8408                                                                MAC_ARG(header->
8409                                                                        addr2),
8410                                                                MAC_ARG(header->
8411                                                                        addr3));
8412                                                 break;
8413                                         }
8414
8415                                         ipw_handle_data_packet(priv, rxb,
8416                                                                &stats);
8417
8418                                         break;
8419                                 }
8420                                 break;
8421                         }
8422
8423                 case RX_HOST_NOTIFICATION_TYPE:{
8424                                 IPW_DEBUG_RX
8425                                     ("Notification: subtype=%02X flags=%02X size=%d\n",
8426                                      pkt->u.notification.subtype,
8427                                      pkt->u.notification.flags,
8428                                      pkt->u.notification.size);
8429                                 ipw_rx_notification(priv, &pkt->u.notification);
8430                                 break;
8431                         }
8432
8433                 default:
8434                         IPW_DEBUG_RX("Bad Rx packet of type %d\n",
8435                                      pkt->header.message_type);
8436                         break;
8437                 }
8438
8439                 /* For now we just don't re-use anything.  We can tweak this
8440                  * later to try and re-use notification packets and SKBs that
8441                  * fail to Rx correctly */
8442                 if (rxb->skb != NULL) {
8443                         dev_kfree_skb_any(rxb->skb);
8444                         rxb->skb = NULL;
8445                 }
8446
8447                 pci_unmap_single(priv->pci_dev, rxb->dma_addr,
8448                                  IPW_RX_BUF_SIZE, PCI_DMA_FROMDEVICE);
8449                 list_add_tail(&rxb->list, &priv->rxq->rx_used);
8450
8451                 i = (i + 1) % RX_QUEUE_SIZE;
8452         }
8453
8454         /* Backtrack one entry */
8455         priv->rxq->processed = (i ? i : RX_QUEUE_SIZE) - 1;
8456
8457         ipw_rx_queue_restock(priv);
8458 }
8459
8460 #define DEFAULT_RTS_THRESHOLD     2304U
8461 #define MIN_RTS_THRESHOLD         1U
8462 #define MAX_RTS_THRESHOLD         2304U
8463 #define DEFAULT_BEACON_INTERVAL   100U
8464 #define DEFAULT_SHORT_RETRY_LIMIT 7U
8465 #define DEFAULT_LONG_RETRY_LIMIT  4U
8466
8467 static int ipw_sw_reset(struct ipw_priv *priv, int init)
8468 {
8469         int band, modulation;
8470         int old_mode = priv->ieee->iw_mode;
8471
8472         /* Initialize module parameter values here */
8473         priv->config = 0;
8474
8475         /* We default to disabling the LED code as right now it causes
8476          * too many systems to lock up... */
8477         if (!led)
8478                 priv->config |= CFG_NO_LED;
8479
8480         if (associate)
8481                 priv->config |= CFG_ASSOCIATE;
8482         else
8483                 IPW_DEBUG_INFO("Auto associate disabled.\n");
8484
8485         if (auto_create)
8486                 priv->config |= CFG_ADHOC_CREATE;
8487         else
8488                 IPW_DEBUG_INFO("Auto adhoc creation disabled.\n");
8489
8490         if (disable) {
8491                 priv->status |= STATUS_RF_KILL_SW;
8492                 IPW_DEBUG_INFO("Radio disabled.\n");
8493         }
8494
8495         if (channel != 0) {
8496                 priv->config |= CFG_STATIC_CHANNEL;
8497                 priv->channel = channel;
8498                 IPW_DEBUG_INFO("Bind to static channel %d\n", channel);
8499                 /* TODO: Validate that provided channel is in range */
8500         }
8501 #ifdef CONFIG_IPW_QOS
8502         ipw_qos_init(priv, qos_enable, qos_burst_enable,
8503                      burst_duration_CCK, burst_duration_OFDM);
8504 #endif                          /* CONFIG_IPW_QOS */
8505
8506         switch (mode) {
8507         case 1:
8508                 priv->ieee->iw_mode = IW_MODE_ADHOC;
8509                 priv->net_dev->type = ARPHRD_ETHER;
8510
8511                 break;
8512 #ifdef CONFIG_IPW2200_MONITOR
8513         case 2:
8514                 priv->ieee->iw_mode = IW_MODE_MONITOR;
8515 #ifdef CONFIG_IEEE80211_RADIOTAP
8516                 priv->net_dev->type = ARPHRD_IEEE80211_RADIOTAP;
8517 #else
8518                 priv->net_dev->type = ARPHRD_IEEE80211;
8519 #endif
8520                 break;
8521 #endif
8522         default:
8523         case 0:
8524                 priv->net_dev->type = ARPHRD_ETHER;
8525                 priv->ieee->iw_mode = IW_MODE_INFRA;
8526                 break;
8527         }
8528
8529         if (hwcrypto) {
8530                 priv->ieee->host_encrypt = 0;
8531                 priv->ieee->host_encrypt_msdu = 0;
8532                 priv->ieee->host_decrypt = 0;
8533                 priv->ieee->host_mc_decrypt = 0;
8534         }
8535         IPW_DEBUG_INFO("Hardware crypto [%s]\n", hwcrypto ? "on" : "off");
8536
8537         /* IPW2200/2915 is abled to do hardware fragmentation. */
8538         priv->ieee->host_open_frag = 0;
8539
8540         if ((priv->pci_dev->device == 0x4223) ||
8541             (priv->pci_dev->device == 0x4224)) {
8542                 if (init)
8543                         printk(KERN_INFO DRV_NAME
8544                                ": Detected Intel PRO/Wireless 2915ABG Network "
8545                                "Connection\n");
8546                 priv->ieee->abg_true = 1;
8547                 band = IEEE80211_52GHZ_BAND | IEEE80211_24GHZ_BAND;
8548                 modulation = IEEE80211_OFDM_MODULATION |
8549                     IEEE80211_CCK_MODULATION;
8550                 priv->adapter = IPW_2915ABG;
8551                 priv->ieee->mode = IEEE_A | IEEE_G | IEEE_B;
8552         } else {
8553                 if (init)
8554                         printk(KERN_INFO DRV_NAME
8555                                ": Detected Intel PRO/Wireless 2200BG Network "
8556                                "Connection\n");
8557
8558                 priv->ieee->abg_true = 0;
8559                 band = IEEE80211_24GHZ_BAND;
8560                 modulation = IEEE80211_OFDM_MODULATION |
8561                     IEEE80211_CCK_MODULATION;
8562                 priv->adapter = IPW_2200BG;
8563                 priv->ieee->mode = IEEE_G | IEEE_B;
8564         }
8565
8566         priv->ieee->freq_band = band;
8567         priv->ieee->modulation = modulation;
8568
8569         priv->rates_mask = IEEE80211_DEFAULT_RATES_MASK;
8570
8571         priv->disassociate_threshold = IPW_MB_DISASSOCIATE_THRESHOLD_DEFAULT;
8572         priv->roaming_threshold = IPW_MB_ROAMING_THRESHOLD_DEFAULT;
8573
8574         priv->rts_threshold = DEFAULT_RTS_THRESHOLD;
8575         priv->short_retry_limit = DEFAULT_SHORT_RETRY_LIMIT;
8576         priv->long_retry_limit = DEFAULT_LONG_RETRY_LIMIT;
8577
8578         /* If power management is turned on, default to AC mode */
8579         priv->power_mode = IPW_POWER_AC;
8580         priv->tx_power = IPW_TX_POWER_DEFAULT;
8581
8582         return old_mode == priv->ieee->iw_mode;
8583 }
8584
8585 /*
8586  * This file defines the Wireless Extension handlers.  It does not
8587  * define any methods of hardware manipulation and relies on the
8588  * functions defined in ipw_main to provide the HW interaction.
8589  *
8590  * The exception to this is the use of the ipw_get_ordinal()
8591  * function used to poll the hardware vs. making unecessary calls.
8592  *
8593  */
8594
8595 static int ipw_wx_get_name(struct net_device *dev,
8596                            struct iw_request_info *info,
8597                            union iwreq_data *wrqu, char *extra)
8598 {
8599         struct ipw_priv *priv = ieee80211_priv(dev);
8600         down(&priv->sem);
8601         if (priv->status & STATUS_RF_KILL_MASK)
8602                 strcpy(wrqu->name, "radio off");
8603         else if (!(priv->status & STATUS_ASSOCIATED))
8604                 strcpy(wrqu->name, "unassociated");
8605         else
8606                 snprintf(wrqu->name, IFNAMSIZ, "IEEE 802.11%c",
8607                          ipw_modes[priv->assoc_request.ieee_mode]);
8608         IPW_DEBUG_WX("Name: %s\n", wrqu->name);
8609         up(&priv->sem);
8610         return 0;
8611 }
8612
8613 static int ipw_set_channel(struct ipw_priv *priv, u8 channel)
8614 {
8615         if (channel == 0) {
8616                 IPW_DEBUG_INFO("Setting channel to ANY (0)\n");
8617                 priv->config &= ~CFG_STATIC_CHANNEL;
8618                 IPW_DEBUG_ASSOC("Attempting to associate with new "
8619                                 "parameters.\n");
8620                 ipw_associate(priv);
8621                 return 0;
8622         }
8623
8624         priv->config |= CFG_STATIC_CHANNEL;
8625
8626         if (priv->channel == channel) {
8627                 IPW_DEBUG_INFO("Request to set channel to current value (%d)\n",
8628                                channel);
8629                 return 0;
8630         }
8631
8632         IPW_DEBUG_INFO("Setting channel to %i\n", (int)channel);
8633         priv->channel = channel;
8634
8635 #ifdef CONFIG_IPW2200_MONITOR
8636         if (priv->ieee->iw_mode == IW_MODE_MONITOR) {
8637                 int i;
8638                 if (priv->status & STATUS_SCANNING) {
8639                         IPW_DEBUG_SCAN("Scan abort triggered due to "
8640                                        "channel change.\n");
8641                         ipw_abort_scan(priv);
8642                 }
8643
8644                 for (i = 1000; i && (priv->status & STATUS_SCANNING); i--)
8645                         udelay(10);
8646
8647                 if (priv->status & STATUS_SCANNING)
8648                         IPW_DEBUG_SCAN("Still scanning...\n");
8649                 else
8650                         IPW_DEBUG_SCAN("Took %dms to abort current scan\n",
8651                                        1000 - i);
8652
8653                 return 0;
8654         }
8655 #endif                          /* CONFIG_IPW2200_MONITOR */
8656
8657         /* Network configuration changed -- force [re]association */
8658         IPW_DEBUG_ASSOC("[re]association triggered due to channel change.\n");
8659         if (!ipw_disassociate(priv))
8660                 ipw_associate(priv);
8661
8662         return 0;
8663 }
8664
8665 static int ipw_wx_set_freq(struct net_device *dev,
8666                            struct iw_request_info *info,
8667                            union iwreq_data *wrqu, char *extra)
8668 {
8669         struct ipw_priv *priv = ieee80211_priv(dev);
8670         const struct ieee80211_geo *geo = ipw_get_geo(priv->ieee);
8671         struct iw_freq *fwrq = &wrqu->freq;
8672         int ret = 0, i;
8673         u8 channel, flags;
8674         int band;
8675
8676         if (fwrq->m == 0) {
8677                 IPW_DEBUG_WX("SET Freq/Channel -> any\n");
8678                 down(&priv->sem);
8679                 ret = ipw_set_channel(priv, 0);
8680                 up(&priv->sem);
8681                 return ret;
8682         }
8683         /* if setting by freq convert to channel */
8684         if (fwrq->e == 1) {
8685                 channel = ipw_freq_to_channel(priv->ieee, fwrq->m);
8686                 if (channel == 0)
8687                         return -EINVAL;
8688         } else
8689                 channel = fwrq->m;
8690
8691         if (!(band = ipw_is_valid_channel(priv->ieee, channel)))
8692                 return -EINVAL;
8693
8694         if (priv->ieee->iw_mode == IW_MODE_ADHOC) {
8695                 i = ipw_channel_to_index(priv->ieee, channel);
8696                 if (i == -1)
8697                         return -EINVAL;
8698
8699                 flags = (band == IEEE80211_24GHZ_BAND) ?
8700                     geo->bg[i].flags : geo->a[i].flags;
8701                 if (flags & IEEE80211_CH_PASSIVE_ONLY) {
8702                         IPW_DEBUG_WX("Invalid Ad-Hoc channel for 802.11a\n");
8703                         return -EINVAL;
8704                 }
8705         }
8706
8707         IPW_DEBUG_WX("SET Freq/Channel -> %d \n", fwrq->m);
8708         down(&priv->sem);
8709         ret = ipw_set_channel(priv, channel);
8710         up(&priv->sem);
8711         return ret;
8712 }
8713
8714 static int ipw_wx_get_freq(struct net_device *dev,
8715                            struct iw_request_info *info,
8716                            union iwreq_data *wrqu, char *extra)
8717 {
8718         struct ipw_priv *priv = ieee80211_priv(dev);
8719
8720         wrqu->freq.e = 0;
8721
8722         /* If we are associated, trying to associate, or have a statically
8723          * configured CHANNEL then return that; otherwise return ANY */
8724         down(&priv->sem);
8725         if (priv->config & CFG_STATIC_CHANNEL ||
8726             priv->status & (STATUS_ASSOCIATING | STATUS_ASSOCIATED))
8727                 wrqu->freq.m = priv->channel;
8728         else
8729                 wrqu->freq.m = 0;
8730
8731         up(&priv->sem);
8732         IPW_DEBUG_WX("GET Freq/Channel -> %d \n", priv->channel);
8733         return 0;
8734 }
8735
8736 static int ipw_wx_set_mode(struct net_device *dev,
8737                            struct iw_request_info *info,
8738                            union iwreq_data *wrqu, char *extra)
8739 {
8740         struct ipw_priv *priv = ieee80211_priv(dev);
8741         int err = 0;
8742
8743         IPW_DEBUG_WX("Set MODE: %d\n", wrqu->mode);
8744
8745         switch (wrqu->mode) {
8746 #ifdef CONFIG_IPW2200_MONITOR
8747         case IW_MODE_MONITOR:
8748 #endif
8749         case IW_MODE_ADHOC:
8750         case IW_MODE_INFRA:
8751                 break;
8752         case IW_MODE_AUTO:
8753                 wrqu->mode = IW_MODE_INFRA;
8754                 break;
8755         default:
8756                 return -EINVAL;
8757         }
8758         if (wrqu->mode == priv->ieee->iw_mode)
8759                 return 0;
8760
8761         down(&priv->sem);
8762
8763         ipw_sw_reset(priv, 0);
8764
8765 #ifdef CONFIG_IPW2200_MONITOR
8766         if (priv->ieee->iw_mode == IW_MODE_MONITOR)
8767                 priv->net_dev->type = ARPHRD_ETHER;
8768
8769         if (wrqu->mode == IW_MODE_MONITOR)
8770 #ifdef CONFIG_IEEE80211_RADIOTAP
8771                 priv->net_dev->type = ARPHRD_IEEE80211_RADIOTAP;
8772 #else
8773                 priv->net_dev->type = ARPHRD_IEEE80211;
8774 #endif
8775 #endif                          /* CONFIG_IPW2200_MONITOR */
8776
8777         /* Free the existing firmware and reset the fw_loaded
8778          * flag so ipw_load() will bring in the new firmawre */
8779         free_firmware();
8780
8781         priv->ieee->iw_mode = wrqu->mode;
8782
8783         queue_work(priv->workqueue, &priv->adapter_restart);
8784         up(&priv->sem);
8785         return err;
8786 }
8787
8788 static int ipw_wx_get_mode(struct net_device *dev,
8789                            struct iw_request_info *info,
8790                            union iwreq_data *wrqu, char *extra)
8791 {
8792         struct ipw_priv *priv = ieee80211_priv(dev);
8793         down(&priv->sem);
8794         wrqu->mode = priv->ieee->iw_mode;
8795         IPW_DEBUG_WX("Get MODE -> %d\n", wrqu->mode);
8796         up(&priv->sem);
8797         return 0;
8798 }
8799
8800 /* Values are in microsecond */
8801 static const s32 timeout_duration[] = {
8802         350000,
8803         250000,
8804         75000,
8805         37000,
8806         25000,
8807 };
8808
8809 static const s32 period_duration[] = {
8810         400000,
8811         700000,
8812         1000000,
8813         1000000,
8814         1000000
8815 };
8816
8817 static int ipw_wx_get_range(struct net_device *dev,
8818                             struct iw_request_info *info,
8819                             union iwreq_data *wrqu, char *extra)
8820 {
8821         struct ipw_priv *priv = ieee80211_priv(dev);
8822         struct iw_range *range = (struct iw_range *)extra;
8823         const struct ieee80211_geo *geo = ipw_get_geo(priv->ieee);
8824         int i = 0, j;
8825
8826         wrqu->data.length = sizeof(*range);
8827         memset(range, 0, sizeof(*range));
8828
8829         /* 54Mbs == ~27 Mb/s real (802.11g) */
8830         range->throughput = 27 * 1000 * 1000;
8831
8832         range->max_qual.qual = 100;
8833         /* TODO: Find real max RSSI and stick here */
8834         range->max_qual.level = 0;
8835         range->max_qual.noise = priv->ieee->worst_rssi + 0x100;
8836         range->max_qual.updated = 7;    /* Updated all three */
8837
8838         range->avg_qual.qual = 70;
8839         /* TODO: Find real 'good' to 'bad' threshol value for RSSI */
8840         range->avg_qual.level = 0;      /* FIXME to real average level */
8841         range->avg_qual.noise = 0;
8842         range->avg_qual.updated = 7;    /* Updated all three */
8843         down(&priv->sem);
8844         range->num_bitrates = min(priv->rates.num_rates, (u8) IW_MAX_BITRATES);
8845
8846         for (i = 0; i < range->num_bitrates; i++)
8847                 range->bitrate[i] = (priv->rates.supported_rates[i] & 0x7F) *
8848                     500000;
8849
8850         range->max_rts = DEFAULT_RTS_THRESHOLD;
8851         range->min_frag = MIN_FRAG_THRESHOLD;
8852         range->max_frag = MAX_FRAG_THRESHOLD;
8853
8854         range->encoding_size[0] = 5;
8855         range->encoding_size[1] = 13;
8856         range->num_encoding_sizes = 2;
8857         range->max_encoding_tokens = WEP_KEYS;
8858
8859         /* Set the Wireless Extension versions */
8860         range->we_version_compiled = WIRELESS_EXT;
8861         range->we_version_source = 16;
8862
8863         i = 0;
8864         if (priv->ieee->mode & (IEEE_B | IEEE_G)) {
8865                 for (j = 0; j < geo->bg_channels && i < IW_MAX_FREQUENCIES;
8866                      i++, j++) {
8867                         range->freq[i].i = geo->bg[j].channel;
8868                         range->freq[i].m = geo->bg[j].freq * 100000;
8869                         range->freq[i].e = 1;
8870                 }
8871         }
8872
8873         if (priv->ieee->mode & IEEE_A) {
8874                 for (j = 0; j < geo->a_channels && i < IW_MAX_FREQUENCIES;
8875                      i++, j++) {
8876                         range->freq[i].i = geo->a[j].channel;
8877                         range->freq[i].m = geo->a[j].freq * 100000;
8878                         range->freq[i].e = 1;
8879                 }
8880         }
8881
8882         range->num_channels = i;
8883         range->num_frequency = i;
8884
8885         up(&priv->sem);
8886         IPW_DEBUG_WX("GET Range\n");
8887         return 0;
8888 }
8889
8890 static int ipw_wx_set_wap(struct net_device *dev,
8891                           struct iw_request_info *info,
8892                           union iwreq_data *wrqu, char *extra)
8893 {
8894         struct ipw_priv *priv = ieee80211_priv(dev);
8895
8896         static const unsigned char any[] = {
8897                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
8898         };
8899         static const unsigned char off[] = {
8900                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
8901         };
8902
8903         if (wrqu->ap_addr.sa_family != ARPHRD_ETHER)
8904                 return -EINVAL;
8905         down(&priv->sem);
8906         if (!memcmp(any, wrqu->ap_addr.sa_data, ETH_ALEN) ||
8907             !memcmp(off, wrqu->ap_addr.sa_data, ETH_ALEN)) {
8908                 /* we disable mandatory BSSID association */
8909                 IPW_DEBUG_WX("Setting AP BSSID to ANY\n");
8910                 priv->config &= ~CFG_STATIC_BSSID;
8911                 IPW_DEBUG_ASSOC("Attempting to associate with new "
8912                                 "parameters.\n");
8913                 ipw_associate(priv);
8914                 up(&priv->sem);
8915                 return 0;
8916         }
8917
8918         priv->config |= CFG_STATIC_BSSID;
8919         if (!memcmp(priv->bssid, wrqu->ap_addr.sa_data, ETH_ALEN)) {
8920                 IPW_DEBUG_WX("BSSID set to current BSSID.\n");
8921                 up(&priv->sem);
8922                 return 0;
8923         }
8924
8925         IPW_DEBUG_WX("Setting mandatory BSSID to " MAC_FMT "\n",
8926                      MAC_ARG(wrqu->ap_addr.sa_data));
8927
8928         memcpy(priv->bssid, wrqu->ap_addr.sa_data, ETH_ALEN);
8929
8930         /* Network configuration changed -- force [re]association */
8931         IPW_DEBUG_ASSOC("[re]association triggered due to BSSID change.\n");
8932         if (!ipw_disassociate(priv))
8933                 ipw_associate(priv);
8934
8935         up(&priv->sem);
8936         return 0;
8937 }
8938
8939 static int ipw_wx_get_wap(struct net_device *dev,
8940                           struct iw_request_info *info,
8941                           union iwreq_data *wrqu, char *extra)
8942 {
8943         struct ipw_priv *priv = ieee80211_priv(dev);
8944         /* If we are associated, trying to associate, or have a statically
8945          * configured BSSID then return that; otherwise return ANY */
8946         down(&priv->sem);
8947         if (priv->config & CFG_STATIC_BSSID ||
8948             priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING)) {
8949                 wrqu->ap_addr.sa_family = ARPHRD_ETHER;
8950                 memcpy(wrqu->ap_addr.sa_data, priv->bssid, ETH_ALEN);
8951         } else
8952                 memset(wrqu->ap_addr.sa_data, 0, ETH_ALEN);
8953
8954         IPW_DEBUG_WX("Getting WAP BSSID: " MAC_FMT "\n",
8955                      MAC_ARG(wrqu->ap_addr.sa_data));
8956         up(&priv->sem);
8957         return 0;
8958 }
8959
8960 static int ipw_wx_set_essid(struct net_device *dev,
8961                             struct iw_request_info *info,
8962                             union iwreq_data *wrqu, char *extra)
8963 {
8964         struct ipw_priv *priv = ieee80211_priv(dev);
8965         char *essid = "";       /* ANY */
8966         int length = 0;
8967         down(&priv->sem);
8968         if (wrqu->essid.flags && wrqu->essid.length) {
8969                 length = wrqu->essid.length - 1;
8970                 essid = extra;
8971         }
8972         if (length == 0) {
8973                 IPW_DEBUG_WX("Setting ESSID to ANY\n");
8974                 if ((priv->config & CFG_STATIC_ESSID) &&
8975                     !(priv->status & (STATUS_ASSOCIATED |
8976                                       STATUS_ASSOCIATING))) {
8977                         IPW_DEBUG_ASSOC("Attempting to associate with new "
8978                                         "parameters.\n");
8979                         priv->config &= ~CFG_STATIC_ESSID;
8980                         ipw_associate(priv);
8981                 }
8982                 up(&priv->sem);
8983                 return 0;
8984         }
8985
8986         length = min(length, IW_ESSID_MAX_SIZE);
8987
8988         priv->config |= CFG_STATIC_ESSID;
8989
8990         if (priv->essid_len == length && !memcmp(priv->essid, extra, length)) {
8991                 IPW_DEBUG_WX("ESSID set to current ESSID.\n");
8992                 up(&priv->sem);
8993                 return 0;
8994         }
8995
8996         IPW_DEBUG_WX("Setting ESSID: '%s' (%d)\n", escape_essid(essid, length),
8997                      length);
8998
8999         priv->essid_len = length;
9000         memcpy(priv->essid, essid, priv->essid_len);
9001
9002         /* Network configuration changed -- force [re]association */
9003         IPW_DEBUG_ASSOC("[re]association triggered due to ESSID change.\n");
9004         if (!ipw_disassociate(priv))
9005                 ipw_associate(priv);
9006
9007         up(&priv->sem);
9008         return 0;
9009 }
9010
9011 static int ipw_wx_get_essid(struct net_device *dev,
9012                             struct iw_request_info *info,
9013                             union iwreq_data *wrqu, char *extra)
9014 {
9015         struct ipw_priv *priv = ieee80211_priv(dev);
9016
9017         /* If we are associated, trying to associate, or have a statically
9018          * configured ESSID then return that; otherwise return ANY */
9019         down(&priv->sem);
9020         if (priv->config & CFG_STATIC_ESSID ||
9021             priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING)) {
9022                 IPW_DEBUG_WX("Getting essid: '%s'\n",
9023                              escape_essid(priv->essid, priv->essid_len));
9024                 memcpy(extra, priv->essid, priv->essid_len);
9025                 wrqu->essid.length = priv->essid_len;
9026                 wrqu->essid.flags = 1;  /* active */
9027         } else {
9028                 IPW_DEBUG_WX("Getting essid: ANY\n");
9029                 wrqu->essid.length = 0;
9030                 wrqu->essid.flags = 0;  /* active */
9031         }
9032         up(&priv->sem);
9033         return 0;
9034 }
9035
9036 static int ipw_wx_set_nick(struct net_device *dev,
9037                            struct iw_request_info *info,
9038                            union iwreq_data *wrqu, char *extra)
9039 {
9040         struct ipw_priv *priv = ieee80211_priv(dev);
9041
9042         IPW_DEBUG_WX("Setting nick to '%s'\n", extra);
9043         if (wrqu->data.length > IW_ESSID_MAX_SIZE)
9044                 return -E2BIG;
9045         down(&priv->sem);
9046         wrqu->data.length = min((size_t) wrqu->data.length, sizeof(priv->nick));
9047         memset(priv->nick, 0, sizeof(priv->nick));
9048         memcpy(priv->nick, extra, wrqu->data.length);
9049         IPW_DEBUG_TRACE("<<\n");
9050         up(&priv->sem);
9051         return 0;
9052
9053 }
9054
9055 static int ipw_wx_get_nick(struct net_device *dev,
9056                            struct iw_request_info *info,
9057                            union iwreq_data *wrqu, char *extra)
9058 {
9059         struct ipw_priv *priv = ieee80211_priv(dev);
9060         IPW_DEBUG_WX("Getting nick\n");
9061         down(&priv->sem);
9062         wrqu->data.length = strlen(priv->nick) + 1;
9063         memcpy(extra, priv->nick, wrqu->data.length);
9064         wrqu->data.flags = 1;   /* active */
9065         up(&priv->sem);
9066         return 0;
9067 }
9068
9069 static int ipw_wx_set_rate(struct net_device *dev,
9070                            struct iw_request_info *info,
9071                            union iwreq_data *wrqu, char *extra)
9072 {
9073         /* TODO: We should use semaphores or locks for access to priv */
9074         struct ipw_priv *priv = ieee80211_priv(dev);
9075         u32 target_rate = wrqu->bitrate.value;
9076         u32 fixed, mask;
9077
9078         /* value = -1, fixed = 0 means auto only, so we should use all rates offered by AP */
9079         /* value = X, fixed = 1 means only rate X */
9080         /* value = X, fixed = 0 means all rates lower equal X */
9081
9082         if (target_rate == -1) {
9083                 fixed = 0;
9084                 mask = IEEE80211_DEFAULT_RATES_MASK;
9085                 /* Now we should reassociate */
9086                 goto apply;
9087         }
9088
9089         mask = 0;
9090         fixed = wrqu->bitrate.fixed;
9091
9092         if (target_rate == 1000000 || !fixed)
9093                 mask |= IEEE80211_CCK_RATE_1MB_MASK;
9094         if (target_rate == 1000000)
9095                 goto apply;
9096
9097         if (target_rate == 2000000 || !fixed)
9098                 mask |= IEEE80211_CCK_RATE_2MB_MASK;
9099         if (target_rate == 2000000)
9100                 goto apply;
9101
9102         if (target_rate == 5500000 || !fixed)
9103                 mask |= IEEE80211_CCK_RATE_5MB_MASK;
9104         if (target_rate == 5500000)
9105                 goto apply;
9106
9107         if (target_rate == 6000000 || !fixed)
9108                 mask |= IEEE80211_OFDM_RATE_6MB_MASK;
9109         if (target_rate == 6000000)
9110                 goto apply;
9111
9112         if (target_rate == 9000000 || !fixed)
9113                 mask |= IEEE80211_OFDM_RATE_9MB_MASK;
9114         if (target_rate == 9000000)
9115                 goto apply;
9116
9117         if (target_rate == 11000000 || !fixed)
9118                 mask |= IEEE80211_CCK_RATE_11MB_MASK;
9119         if (target_rate == 11000000)
9120                 goto apply;
9121
9122         if (target_rate == 12000000 || !fixed)
9123                 mask |= IEEE80211_OFDM_RATE_12MB_MASK;
9124         if (target_rate == 12000000)
9125                 goto apply;
9126
9127         if (target_rate == 18000000 || !fixed)
9128                 mask |= IEEE80211_OFDM_RATE_18MB_MASK;
9129         if (target_rate == 18000000)
9130                 goto apply;
9131
9132         if (target_rate == 24000000 || !fixed)
9133                 mask |= IEEE80211_OFDM_RATE_24MB_MASK;
9134         if (target_rate == 24000000)
9135                 goto apply;
9136
9137         if (target_rate == 36000000 || !fixed)
9138                 mask |= IEEE80211_OFDM_RATE_36MB_MASK;
9139         if (target_rate == 36000000)
9140                 goto apply;
9141
9142         if (target_rate == 48000000 || !fixed)
9143                 mask |= IEEE80211_OFDM_RATE_48MB_MASK;
9144         if (target_rate == 48000000)
9145                 goto apply;
9146
9147         if (target_rate == 54000000 || !fixed)
9148                 mask |= IEEE80211_OFDM_RATE_54MB_MASK;
9149         if (target_rate == 54000000)
9150                 goto apply;
9151
9152         IPW_DEBUG_WX("invalid rate specified, returning error\n");
9153         return -EINVAL;
9154
9155       apply:
9156         IPW_DEBUG_WX("Setting rate mask to 0x%08X [%s]\n",
9157                      mask, fixed ? "fixed" : "sub-rates");
9158         down(&priv->sem);
9159         if (mask == IEEE80211_DEFAULT_RATES_MASK) {
9160                 priv->config &= ~CFG_FIXED_RATE;
9161                 ipw_set_fixed_rate(priv, priv->ieee->mode);
9162         } else
9163                 priv->config |= CFG_FIXED_RATE;
9164
9165         if (priv->rates_mask == mask) {
9166                 IPW_DEBUG_WX("Mask set to current mask.\n");
9167                 up(&priv->sem);
9168                 return 0;
9169         }
9170
9171         priv->rates_mask = mask;
9172
9173         /* Network configuration changed -- force [re]association */
9174         IPW_DEBUG_ASSOC("[re]association triggered due to rates change.\n");
9175         if (!ipw_disassociate(priv))
9176                 ipw_associate(priv);
9177
9178         up(&priv->sem);
9179         return 0;
9180 }
9181
9182 static int ipw_wx_get_rate(struct net_device *dev,
9183                            struct iw_request_info *info,
9184                            union iwreq_data *wrqu, char *extra)
9185 {
9186         struct ipw_priv *priv = ieee80211_priv(dev);
9187         down(&priv->sem);
9188         wrqu->bitrate.value = priv->last_rate;
9189         up(&priv->sem);
9190         IPW_DEBUG_WX("GET Rate -> %d \n", wrqu->bitrate.value);
9191         return 0;
9192 }
9193
9194 static int ipw_wx_set_rts(struct net_device *dev,
9195                           struct iw_request_info *info,
9196                           union iwreq_data *wrqu, char *extra)
9197 {
9198         struct ipw_priv *priv = ieee80211_priv(dev);
9199         down(&priv->sem);
9200         if (wrqu->rts.disabled)
9201                 priv->rts_threshold = DEFAULT_RTS_THRESHOLD;
9202         else {
9203                 if (wrqu->rts.value < MIN_RTS_THRESHOLD ||
9204                     wrqu->rts.value > MAX_RTS_THRESHOLD) {
9205                         up(&priv->sem);
9206                         return -EINVAL;
9207                 }
9208                 priv->rts_threshold = wrqu->rts.value;
9209         }
9210
9211         ipw_send_rts_threshold(priv, priv->rts_threshold);
9212         up(&priv->sem);
9213         IPW_DEBUG_WX("SET RTS Threshold -> %d \n", priv->rts_threshold);
9214         return 0;
9215 }
9216
9217 static int ipw_wx_get_rts(struct net_device *dev,
9218                           struct iw_request_info *info,
9219                           union iwreq_data *wrqu, char *extra)
9220 {
9221         struct ipw_priv *priv = ieee80211_priv(dev);
9222         down(&priv->sem);
9223         wrqu->rts.value = priv->rts_threshold;
9224         wrqu->rts.fixed = 0;    /* no auto select */
9225         wrqu->rts.disabled = (wrqu->rts.value == DEFAULT_RTS_THRESHOLD);
9226         up(&priv->sem);
9227         IPW_DEBUG_WX("GET RTS Threshold -> %d \n", wrqu->rts.value);
9228         return 0;
9229 }
9230
9231 static int ipw_wx_set_txpow(struct net_device *dev,
9232                             struct iw_request_info *info,
9233                             union iwreq_data *wrqu, char *extra)
9234 {
9235         struct ipw_priv *priv = ieee80211_priv(dev);
9236         int err = 0;
9237
9238         down(&priv->sem);
9239         if (ipw_radio_kill_sw(priv, wrqu->power.disabled)) {
9240                 err = -EINPROGRESS;
9241                 goto out;
9242         }
9243
9244         if (!wrqu->power.fixed)
9245                 wrqu->power.value = IPW_TX_POWER_DEFAULT;
9246
9247         if (wrqu->power.flags != IW_TXPOW_DBM) {
9248                 err = -EINVAL;
9249                 goto out;
9250         }
9251
9252         if ((wrqu->power.value > IPW_TX_POWER_MAX) ||
9253             (wrqu->power.value < IPW_TX_POWER_MIN)) {
9254                 err = -EINVAL;
9255                 goto out;
9256         }
9257
9258         priv->tx_power = wrqu->power.value;
9259         err = ipw_set_tx_power(priv);
9260       out:
9261         up(&priv->sem);
9262         return err;
9263 }
9264
9265 static int ipw_wx_get_txpow(struct net_device *dev,
9266                             struct iw_request_info *info,
9267                             union iwreq_data *wrqu, char *extra)
9268 {
9269         struct ipw_priv *priv = ieee80211_priv(dev);
9270         down(&priv->sem);
9271         wrqu->power.value = priv->tx_power;
9272         wrqu->power.fixed = 1;
9273         wrqu->power.flags = IW_TXPOW_DBM;
9274         wrqu->power.disabled = (priv->status & STATUS_RF_KILL_MASK) ? 1 : 0;
9275         up(&priv->sem);
9276
9277         IPW_DEBUG_WX("GET TX Power -> %s %d \n",
9278                      wrqu->power.disabled ? "OFF" : "ON", wrqu->power.value);
9279
9280         return 0;
9281 }
9282
9283 static int ipw_wx_set_frag(struct net_device *dev,
9284                            struct iw_request_info *info,
9285                            union iwreq_data *wrqu, char *extra)
9286 {
9287         struct ipw_priv *priv = ieee80211_priv(dev);
9288         down(&priv->sem);
9289         if (wrqu->frag.disabled)
9290                 priv->ieee->fts = DEFAULT_FTS;
9291         else {
9292                 if (wrqu->frag.value < MIN_FRAG_THRESHOLD ||
9293                     wrqu->frag.value > MAX_FRAG_THRESHOLD) {
9294                         up(&priv->sem);
9295                         return -EINVAL;
9296                 }
9297
9298                 priv->ieee->fts = wrqu->frag.value & ~0x1;
9299         }
9300
9301         ipw_send_frag_threshold(priv, wrqu->frag.value);
9302         up(&priv->sem);
9303         IPW_DEBUG_WX("SET Frag Threshold -> %d \n", wrqu->frag.value);
9304         return 0;
9305 }
9306
9307 static int ipw_wx_get_frag(struct net_device *dev,
9308                            struct iw_request_info *info,
9309                            union iwreq_data *wrqu, char *extra)
9310 {
9311         struct ipw_priv *priv = ieee80211_priv(dev);
9312         down(&priv->sem);
9313         wrqu->frag.value = priv->ieee->fts;
9314         wrqu->frag.fixed = 0;   /* no auto select */
9315         wrqu->frag.disabled = (wrqu->frag.value == DEFAULT_FTS);
9316         up(&priv->sem);
9317         IPW_DEBUG_WX("GET Frag Threshold -> %d \n", wrqu->frag.value);
9318
9319         return 0;
9320 }
9321
9322 static int ipw_wx_set_retry(struct net_device *dev,
9323                             struct iw_request_info *info,
9324                             union iwreq_data *wrqu, char *extra)
9325 {
9326         struct ipw_priv *priv = ieee80211_priv(dev);
9327
9328         if (wrqu->retry.flags & IW_RETRY_LIFETIME || wrqu->retry.disabled)
9329                 return -EINVAL;
9330
9331         if (!(wrqu->retry.flags & IW_RETRY_LIMIT))
9332                 return 0;
9333
9334         if (wrqu->retry.value < 0 || wrqu->retry.value > 255)
9335                 return -EINVAL;
9336
9337         down(&priv->sem);
9338         if (wrqu->retry.flags & IW_RETRY_MIN)
9339                 priv->short_retry_limit = (u8) wrqu->retry.value;
9340         else if (wrqu->retry.flags & IW_RETRY_MAX)
9341                 priv->long_retry_limit = (u8) wrqu->retry.value;
9342         else {
9343                 priv->short_retry_limit = (u8) wrqu->retry.value;
9344                 priv->long_retry_limit = (u8) wrqu->retry.value;
9345         }
9346
9347         ipw_send_retry_limit(priv, priv->short_retry_limit,
9348                              priv->long_retry_limit);
9349         up(&priv->sem);
9350         IPW_DEBUG_WX("SET retry limit -> short:%d long:%d\n",
9351                      priv->short_retry_limit, priv->long_retry_limit);
9352         return 0;
9353 }
9354
9355 static int ipw_wx_get_retry(struct net_device *dev,
9356                             struct iw_request_info *info,
9357                             union iwreq_data *wrqu, char *extra)
9358 {
9359         struct ipw_priv *priv = ieee80211_priv(dev);
9360
9361         down(&priv->sem);
9362         wrqu->retry.disabled = 0;
9363
9364         if ((wrqu->retry.flags & IW_RETRY_TYPE) == IW_RETRY_LIFETIME) {
9365                 up(&priv->sem);
9366                 return -EINVAL;
9367         }
9368
9369         if (wrqu->retry.flags & IW_RETRY_MAX) {
9370                 wrqu->retry.flags = IW_RETRY_LIMIT | IW_RETRY_MAX;
9371                 wrqu->retry.value = priv->long_retry_limit;
9372         } else if (wrqu->retry.flags & IW_RETRY_MIN) {
9373                 wrqu->retry.flags = IW_RETRY_LIMIT | IW_RETRY_MIN;
9374                 wrqu->retry.value = priv->short_retry_limit;
9375         } else {
9376                 wrqu->retry.flags = IW_RETRY_LIMIT;
9377                 wrqu->retry.value = priv->short_retry_limit;
9378         }
9379         up(&priv->sem);
9380
9381         IPW_DEBUG_WX("GET retry -> %d \n", wrqu->retry.value);
9382
9383         return 0;
9384 }
9385
9386 #if WIRELESS_EXT > 17
9387 static int ipw_request_direct_scan(struct ipw_priv *priv, char *essid,
9388                                    int essid_len)
9389 {
9390         struct ipw_scan_request_ext scan;
9391         int err = 0, scan_type;
9392
9393         down(&priv->sem);
9394
9395         if (priv->status & STATUS_RF_KILL_MASK) {
9396                 IPW_DEBUG_HC("Aborting scan due to RF kill activation\n");
9397                 priv->status |= STATUS_SCAN_PENDING;
9398                 goto done;
9399         }
9400
9401         IPW_DEBUG_HC("starting request direct scan!\n");
9402
9403         if (priv->status & (STATUS_SCANNING | STATUS_SCAN_ABORTING)) {
9404                 err = wait_event_interruptible(priv->wait_state,
9405                                                !(priv->
9406                                                  status & (STATUS_SCANNING |
9407                                                            STATUS_SCAN_ABORTING)));
9408                 if (err) {
9409                         IPW_DEBUG_HC("aborting direct scan");
9410                         goto done;
9411                 }
9412         }
9413         memset(&scan, 0, sizeof(scan));
9414
9415         if (priv->config & CFG_SPEED_SCAN)
9416                 scan.dwell_time[IPW_SCAN_ACTIVE_BROADCAST_SCAN] =
9417                     cpu_to_le16(30);
9418         else
9419                 scan.dwell_time[IPW_SCAN_ACTIVE_BROADCAST_SCAN] =
9420                     cpu_to_le16(20);
9421
9422         scan.dwell_time[IPW_SCAN_ACTIVE_BROADCAST_AND_DIRECT_SCAN] =
9423             cpu_to_le16(20);
9424         scan.dwell_time[IPW_SCAN_PASSIVE_FULL_DWELL_SCAN] = cpu_to_le16(120);
9425         scan.dwell_time[IPW_SCAN_ACTIVE_DIRECT_SCAN] = cpu_to_le16(20);
9426
9427         scan.full_scan_index = cpu_to_le32(ieee80211_get_scans(priv->ieee));
9428
9429         err = ipw_send_ssid(priv, essid, essid_len);
9430         if (err) {
9431                 IPW_DEBUG_HC("Attempt to send SSID command failed\n");
9432                 goto done;
9433         }
9434         scan_type = IPW_SCAN_ACTIVE_BROADCAST_AND_DIRECT_SCAN;
9435
9436         ipw_add_scan_channels(priv, &scan, scan_type);
9437
9438         err = ipw_send_scan_request_ext(priv, &scan);
9439         if (err) {
9440                 IPW_DEBUG_HC("Sending scan command failed: %08X\n", err);
9441                 goto done;
9442         }
9443
9444         priv->status |= STATUS_SCANNING;
9445
9446       done:
9447         up(&priv->sem);
9448         return err;
9449 }
9450 #endif                          /* WIRELESS_EXT > 17 */
9451
9452 static int ipw_wx_set_scan(struct net_device *dev,
9453                            struct iw_request_info *info,
9454                            union iwreq_data *wrqu, char *extra)
9455 {
9456         struct ipw_priv *priv = ieee80211_priv(dev);
9457 #if WIRELESS_EXT > 17
9458         struct iw_scan_req *req = NULL;
9459         if (wrqu->data.length
9460             && wrqu->data.length == sizeof(struct iw_scan_req)) {
9461                 req = (struct iw_scan_req *)extra;
9462                 if (wrqu->data.flags & IW_SCAN_THIS_ESSID) {
9463                         ipw_request_direct_scan(priv, req->essid,
9464                                                 req->essid_len);
9465                         return 0;
9466                 }
9467         }
9468 #endif
9469         IPW_DEBUG_WX("Start scan\n");
9470
9471         queue_work(priv->workqueue, &priv->request_scan);
9472
9473         return 0;
9474 }
9475
9476 static int ipw_wx_get_scan(struct net_device *dev,
9477                            struct iw_request_info *info,
9478                            union iwreq_data *wrqu, char *extra)
9479 {
9480         struct ipw_priv *priv = ieee80211_priv(dev);
9481         return ieee80211_wx_get_scan(priv->ieee, info, wrqu, extra);
9482 }
9483
9484 static int ipw_wx_set_encode(struct net_device *dev,
9485                              struct iw_request_info *info,
9486                              union iwreq_data *wrqu, char *key)
9487 {
9488         struct ipw_priv *priv = ieee80211_priv(dev);
9489         int ret;
9490         u32 cap = priv->capability;
9491
9492         down(&priv->sem);
9493         ret = ieee80211_wx_set_encode(priv->ieee, info, wrqu, key);
9494
9495         /* In IBSS mode, we need to notify the firmware to update
9496          * the beacon info after we changed the capability. */
9497         if (cap != priv->capability &&
9498             priv->ieee->iw_mode == IW_MODE_ADHOC &&
9499             priv->status & STATUS_ASSOCIATED)
9500                 ipw_disassociate(priv);
9501
9502         up(&priv->sem);
9503         return ret;
9504 }
9505
9506 static int ipw_wx_get_encode(struct net_device *dev,
9507                              struct iw_request_info *info,
9508                              union iwreq_data *wrqu, char *key)
9509 {
9510         struct ipw_priv *priv = ieee80211_priv(dev);
9511         return ieee80211_wx_get_encode(priv->ieee, info, wrqu, key);
9512 }
9513
9514 static int ipw_wx_set_power(struct net_device *dev,
9515                             struct iw_request_info *info,
9516                             union iwreq_data *wrqu, char *extra)
9517 {
9518         struct ipw_priv *priv = ieee80211_priv(dev);
9519         int err;
9520         down(&priv->sem);
9521         if (wrqu->power.disabled) {
9522                 priv->power_mode = IPW_POWER_LEVEL(priv->power_mode);
9523                 err = ipw_send_power_mode(priv, IPW_POWER_MODE_CAM);
9524                 if (err) {
9525                         IPW_DEBUG_WX("failed setting power mode.\n");
9526                         up(&priv->sem);
9527                         return err;
9528                 }
9529                 IPW_DEBUG_WX("SET Power Management Mode -> off\n");
9530                 up(&priv->sem);
9531                 return 0;
9532         }
9533
9534         switch (wrqu->power.flags & IW_POWER_MODE) {
9535         case IW_POWER_ON:       /* If not specified */
9536         case IW_POWER_MODE:     /* If set all mask */
9537         case IW_POWER_ALL_R:    /* If explicitely state all */
9538                 break;
9539         default:                /* Otherwise we don't support it */
9540                 IPW_DEBUG_WX("SET PM Mode: %X not supported.\n",
9541                              wrqu->power.flags);
9542                 up(&priv->sem);
9543                 return -EOPNOTSUPP;
9544         }
9545
9546         /* If the user hasn't specified a power management mode yet, default
9547          * to BATTERY */
9548         if (IPW_POWER_LEVEL(priv->power_mode) == IPW_POWER_AC)
9549                 priv->power_mode = IPW_POWER_ENABLED | IPW_POWER_BATTERY;
9550         else
9551                 priv->power_mode = IPW_POWER_ENABLED | priv->power_mode;
9552         err = ipw_send_power_mode(priv, IPW_POWER_LEVEL(priv->power_mode));
9553         if (err) {
9554                 IPW_DEBUG_WX("failed setting power mode.\n");
9555                 up(&priv->sem);
9556                 return err;
9557         }
9558
9559         IPW_DEBUG_WX("SET Power Management Mode -> 0x%02X\n", priv->power_mode);
9560         up(&priv->sem);
9561         return 0;
9562 }
9563
9564 static int ipw_wx_get_power(struct net_device *dev,
9565                             struct iw_request_info *info,
9566                             union iwreq_data *wrqu, char *extra)
9567 {
9568         struct ipw_priv *priv = ieee80211_priv(dev);
9569         down(&priv->sem);
9570         if (!(priv->power_mode & IPW_POWER_ENABLED))
9571                 wrqu->power.disabled = 1;
9572         else
9573                 wrqu->power.disabled = 0;
9574
9575         up(&priv->sem);
9576         IPW_DEBUG_WX("GET Power Management Mode -> %02X\n", priv->power_mode);
9577
9578         return 0;
9579 }
9580
9581 static int ipw_wx_set_powermode(struct net_device *dev,
9582                                 struct iw_request_info *info,
9583                                 union iwreq_data *wrqu, char *extra)
9584 {
9585         struct ipw_priv *priv = ieee80211_priv(dev);
9586         int mode = *(int *)extra;
9587         int err;
9588         down(&priv->sem);
9589         if ((mode < 1) || (mode > IPW_POWER_LIMIT)) {
9590                 mode = IPW_POWER_AC;
9591                 priv->power_mode = mode;
9592         } else {
9593                 priv->power_mode = IPW_POWER_ENABLED | mode;
9594         }
9595
9596         if (priv->power_mode != mode) {
9597                 err = ipw_send_power_mode(priv, mode);
9598
9599                 if (err) {
9600                         IPW_DEBUG_WX("failed setting power mode.\n");
9601                         up(&priv->sem);
9602                         return err;
9603                 }
9604         }
9605         up(&priv->sem);
9606         return 0;
9607 }
9608
9609 #define MAX_WX_STRING 80
9610 static int ipw_wx_get_powermode(struct net_device *dev,
9611                                 struct iw_request_info *info,
9612                                 union iwreq_data *wrqu, char *extra)
9613 {
9614         struct ipw_priv *priv = ieee80211_priv(dev);
9615         int level = IPW_POWER_LEVEL(priv->power_mode);
9616         char *p = extra;
9617
9618         p += snprintf(p, MAX_WX_STRING, "Power save level: %d ", level);
9619
9620         switch (level) {
9621         case IPW_POWER_AC:
9622                 p += snprintf(p, MAX_WX_STRING - (p - extra), "(AC)");
9623                 break;
9624         case IPW_POWER_BATTERY:
9625                 p += snprintf(p, MAX_WX_STRING - (p - extra), "(BATTERY)");
9626                 break;
9627         default:
9628                 p += snprintf(p, MAX_WX_STRING - (p - extra),
9629                               "(Timeout %dms, Period %dms)",
9630                               timeout_duration[level - 1] / 1000,
9631                               period_duration[level - 1] / 1000);
9632         }
9633
9634         if (!(priv->power_mode & IPW_POWER_ENABLED))
9635                 p += snprintf(p, MAX_WX_STRING - (p - extra), " OFF");
9636
9637         wrqu->data.length = p - extra + 1;
9638
9639         return 0;
9640 }
9641
9642 static int ipw_wx_set_wireless_mode(struct net_device *dev,
9643                                     struct iw_request_info *info,
9644                                     union iwreq_data *wrqu, char *extra)
9645 {
9646         struct ipw_priv *priv = ieee80211_priv(dev);
9647         int mode = *(int *)extra;
9648         u8 band = 0, modulation = 0;
9649
9650         if (mode == 0 || mode & ~IEEE_MODE_MASK) {
9651                 IPW_WARNING("Attempt to set invalid wireless mode: %d\n", mode);
9652                 return -EINVAL;
9653         }
9654         down(&priv->sem);
9655         if (priv->adapter == IPW_2915ABG) {
9656                 priv->ieee->abg_true = 1;
9657                 if (mode & IEEE_A) {
9658                         band |= IEEE80211_52GHZ_BAND;
9659                         modulation |= IEEE80211_OFDM_MODULATION;
9660                 } else
9661                         priv->ieee->abg_true = 0;
9662         } else {
9663                 if (mode & IEEE_A) {
9664                         IPW_WARNING("Attempt to set 2200BG into "
9665                                     "802.11a mode\n");
9666                         up(&priv->sem);
9667                         return -EINVAL;
9668                 }
9669
9670                 priv->ieee->abg_true = 0;
9671         }
9672
9673         if (mode & IEEE_B) {
9674                 band |= IEEE80211_24GHZ_BAND;
9675                 modulation |= IEEE80211_CCK_MODULATION;
9676         } else
9677                 priv->ieee->abg_true = 0;
9678
9679         if (mode & IEEE_G) {
9680                 band |= IEEE80211_24GHZ_BAND;
9681                 modulation |= IEEE80211_OFDM_MODULATION;
9682         } else
9683                 priv->ieee->abg_true = 0;
9684
9685         priv->ieee->mode = mode;
9686         priv->ieee->freq_band = band;
9687         priv->ieee->modulation = modulation;
9688         init_supported_rates(priv, &priv->rates);
9689
9690         /* Network configuration changed -- force [re]association */
9691         IPW_DEBUG_ASSOC("[re]association triggered due to mode change.\n");
9692         if (!ipw_disassociate(priv)) {
9693                 ipw_send_supported_rates(priv, &priv->rates);
9694                 ipw_associate(priv);
9695         }
9696
9697         /* Update the band LEDs */
9698         ipw_led_band_on(priv);
9699
9700         IPW_DEBUG_WX("PRIV SET MODE: %c%c%c\n",
9701                      mode & IEEE_A ? 'a' : '.',
9702                      mode & IEEE_B ? 'b' : '.', mode & IEEE_G ? 'g' : '.');
9703         up(&priv->sem);
9704         return 0;
9705 }
9706
9707 static int ipw_wx_get_wireless_mode(struct net_device *dev,
9708                                     struct iw_request_info *info,
9709                                     union iwreq_data *wrqu, char *extra)
9710 {
9711         struct ipw_priv *priv = ieee80211_priv(dev);
9712         down(&priv->sem);
9713         switch (priv->ieee->mode) {
9714         case IEEE_A:
9715                 strncpy(extra, "802.11a (1)", MAX_WX_STRING);
9716                 break;
9717         case IEEE_B:
9718                 strncpy(extra, "802.11b (2)", MAX_WX_STRING);
9719                 break;
9720         case IEEE_A | IEEE_B:
9721                 strncpy(extra, "802.11ab (3)", MAX_WX_STRING);
9722                 break;
9723         case IEEE_G:
9724                 strncpy(extra, "802.11g (4)", MAX_WX_STRING);
9725                 break;
9726         case IEEE_A | IEEE_G:
9727                 strncpy(extra, "802.11ag (5)", MAX_WX_STRING);
9728                 break;
9729         case IEEE_B | IEEE_G:
9730                 strncpy(extra, "802.11bg (6)", MAX_WX_STRING);
9731                 break;
9732         case IEEE_A | IEEE_B | IEEE_G:
9733                 strncpy(extra, "802.11abg (7)", MAX_WX_STRING);
9734                 break;
9735         default:
9736                 strncpy(extra, "unknown", MAX_WX_STRING);
9737                 break;
9738         }
9739
9740         IPW_DEBUG_WX("PRIV GET MODE: %s\n", extra);
9741
9742         wrqu->data.length = strlen(extra) + 1;
9743         up(&priv->sem);
9744
9745         return 0;
9746 }
9747
9748 static int ipw_wx_set_preamble(struct net_device *dev,
9749                                struct iw_request_info *info,
9750                                union iwreq_data *wrqu, char *extra)
9751 {
9752         struct ipw_priv *priv = ieee80211_priv(dev);
9753         int mode = *(int *)extra;
9754         down(&priv->sem);
9755         /* Switching from SHORT -> LONG requires a disassociation */
9756         if (mode == 1) {
9757                 if (!(priv->config & CFG_PREAMBLE_LONG)) {
9758                         priv->config |= CFG_PREAMBLE_LONG;
9759
9760                         /* Network configuration changed -- force [re]association */
9761                         IPW_DEBUG_ASSOC
9762                             ("[re]association triggered due to preamble change.\n");
9763                         if (!ipw_disassociate(priv))
9764                                 ipw_associate(priv);
9765                 }
9766                 goto done;
9767         }
9768
9769         if (mode == 0) {
9770                 priv->config &= ~CFG_PREAMBLE_LONG;
9771                 goto done;
9772         }
9773         up(&priv->sem);
9774         return -EINVAL;
9775
9776       done:
9777         up(&priv->sem);
9778         return 0;
9779 }
9780
9781 static int ipw_wx_get_preamble(struct net_device *dev,
9782                                struct iw_request_info *info,
9783                                union iwreq_data *wrqu, char *extra)
9784 {
9785         struct ipw_priv *priv = ieee80211_priv(dev);
9786         down(&priv->sem);
9787         if (priv->config & CFG_PREAMBLE_LONG)
9788                 snprintf(wrqu->name, IFNAMSIZ, "long (1)");
9789         else
9790                 snprintf(wrqu->name, IFNAMSIZ, "auto (0)");
9791         up(&priv->sem);
9792         return 0;
9793 }
9794
9795 #ifdef CONFIG_IPW2200_MONITOR
9796 static int ipw_wx_set_monitor(struct net_device *dev,
9797                               struct iw_request_info *info,
9798                               union iwreq_data *wrqu, char *extra)
9799 {
9800         struct ipw_priv *priv = ieee80211_priv(dev);
9801         int *parms = (int *)extra;
9802         int enable = (parms[0] > 0);
9803         down(&priv->sem);
9804         IPW_DEBUG_WX("SET MONITOR: %d %d\n", enable, parms[1]);
9805         if (enable) {
9806                 if (priv->ieee->iw_mode != IW_MODE_MONITOR) {
9807 #ifdef CONFIG_IEEE80211_RADIOTAP
9808                         priv->net_dev->type = ARPHRD_IEEE80211_RADIOTAP;
9809 #else
9810                         priv->net_dev->type = ARPHRD_IEEE80211;
9811 #endif
9812                         queue_work(priv->workqueue, &priv->adapter_restart);
9813                 }
9814
9815                 ipw_set_channel(priv, parms[1]);
9816         } else {
9817                 if (priv->ieee->iw_mode != IW_MODE_MONITOR) {
9818                         up(&priv->sem);
9819                         return 0;
9820                 }
9821                 priv->net_dev->type = ARPHRD_ETHER;
9822                 queue_work(priv->workqueue, &priv->adapter_restart);
9823         }
9824         up(&priv->sem);
9825         return 0;
9826 }
9827
9828 #endif                          // CONFIG_IPW2200_MONITOR
9829
9830 static int ipw_wx_reset(struct net_device *dev,
9831                         struct iw_request_info *info,
9832                         union iwreq_data *wrqu, char *extra)
9833 {
9834         struct ipw_priv *priv = ieee80211_priv(dev);
9835         IPW_DEBUG_WX("RESET\n");
9836         queue_work(priv->workqueue, &priv->adapter_restart);
9837         return 0;
9838 }
9839
9840 static int ipw_wx_sw_reset(struct net_device *dev,
9841                            struct iw_request_info *info,
9842                            union iwreq_data *wrqu, char *extra)
9843 {
9844         struct ipw_priv *priv = ieee80211_priv(dev);
9845         union iwreq_data wrqu_sec = {
9846                 .encoding = {
9847                              .flags = IW_ENCODE_DISABLED,
9848                              },
9849         };
9850         int ret;
9851
9852         IPW_DEBUG_WX("SW_RESET\n");
9853
9854         down(&priv->sem);
9855
9856         ret = ipw_sw_reset(priv, 0);
9857         if (!ret) {
9858                 free_firmware();
9859                 ipw_adapter_restart(priv);
9860         }
9861
9862         /* The SW reset bit might have been toggled on by the 'disable'
9863          * module parameter, so take appropriate action */
9864         ipw_radio_kill_sw(priv, priv->status & STATUS_RF_KILL_SW);
9865
9866         up(&priv->sem);
9867         ieee80211_wx_set_encode(priv->ieee, info, &wrqu_sec, NULL);
9868         down(&priv->sem);
9869
9870         if (!(priv->status & STATUS_RF_KILL_MASK)) {
9871                 /* Configuration likely changed -- force [re]association */
9872                 IPW_DEBUG_ASSOC("[re]association triggered due to sw "
9873                                 "reset.\n");
9874                 if (!ipw_disassociate(priv))
9875                         ipw_associate(priv);
9876         }
9877
9878         up(&priv->sem);
9879
9880         return 0;
9881 }
9882
9883 /* Rebase the WE IOCTLs to zero for the handler array */
9884 #define IW_IOCTL(x) [(x)-SIOCSIWCOMMIT]
9885 static iw_handler ipw_wx_handlers[] = {
9886         IW_IOCTL(SIOCGIWNAME) = ipw_wx_get_name,
9887         IW_IOCTL(SIOCSIWFREQ) = ipw_wx_set_freq,
9888         IW_IOCTL(SIOCGIWFREQ) = ipw_wx_get_freq,
9889         IW_IOCTL(SIOCSIWMODE) = ipw_wx_set_mode,
9890         IW_IOCTL(SIOCGIWMODE) = ipw_wx_get_mode,
9891         IW_IOCTL(SIOCGIWRANGE) = ipw_wx_get_range,
9892         IW_IOCTL(SIOCSIWAP) = ipw_wx_set_wap,
9893         IW_IOCTL(SIOCGIWAP) = ipw_wx_get_wap,
9894         IW_IOCTL(SIOCSIWSCAN) = ipw_wx_set_scan,
9895         IW_IOCTL(SIOCGIWSCAN) = ipw_wx_get_scan,
9896         IW_IOCTL(SIOCSIWESSID) = ipw_wx_set_essid,
9897         IW_IOCTL(SIOCGIWESSID) = ipw_wx_get_essid,
9898         IW_IOCTL(SIOCSIWNICKN) = ipw_wx_set_nick,
9899         IW_IOCTL(SIOCGIWNICKN) = ipw_wx_get_nick,
9900         IW_IOCTL(SIOCSIWRATE) = ipw_wx_set_rate,
9901         IW_IOCTL(SIOCGIWRATE) = ipw_wx_get_rate,
9902         IW_IOCTL(SIOCSIWRTS) = ipw_wx_set_rts,
9903         IW_IOCTL(SIOCGIWRTS) = ipw_wx_get_rts,
9904         IW_IOCTL(SIOCSIWFRAG) = ipw_wx_set_frag,
9905         IW_IOCTL(SIOCGIWFRAG) = ipw_wx_get_frag,
9906         IW_IOCTL(SIOCSIWTXPOW) = ipw_wx_set_txpow,
9907         IW_IOCTL(SIOCGIWTXPOW) = ipw_wx_get_txpow,
9908         IW_IOCTL(SIOCSIWRETRY) = ipw_wx_set_retry,
9909         IW_IOCTL(SIOCGIWRETRY) = ipw_wx_get_retry,
9910         IW_IOCTL(SIOCSIWENCODE) = ipw_wx_set_encode,
9911         IW_IOCTL(SIOCGIWENCODE) = ipw_wx_get_encode,
9912         IW_IOCTL(SIOCSIWPOWER) = ipw_wx_set_power,
9913         IW_IOCTL(SIOCGIWPOWER) = ipw_wx_get_power,
9914         IW_IOCTL(SIOCSIWSPY) = iw_handler_set_spy,
9915         IW_IOCTL(SIOCGIWSPY) = iw_handler_get_spy,
9916         IW_IOCTL(SIOCSIWTHRSPY) = iw_handler_set_thrspy,
9917         IW_IOCTL(SIOCGIWTHRSPY) = iw_handler_get_thrspy,
9918 #if WIRELESS_EXT > 17
9919         IW_IOCTL(SIOCSIWGENIE) = ipw_wx_set_genie,
9920         IW_IOCTL(SIOCGIWGENIE) = ipw_wx_get_genie,
9921         IW_IOCTL(SIOCSIWMLME) = ipw_wx_set_mlme,
9922         IW_IOCTL(SIOCSIWAUTH) = ipw_wx_set_auth,
9923         IW_IOCTL(SIOCGIWAUTH) = ipw_wx_get_auth,
9924         IW_IOCTL(SIOCSIWENCODEEXT) = ipw_wx_set_encodeext,
9925         IW_IOCTL(SIOCGIWENCODEEXT) = ipw_wx_get_encodeext,
9926 #endif
9927 };
9928
9929 enum {
9930         IPW_PRIV_SET_POWER = SIOCIWFIRSTPRIV,
9931         IPW_PRIV_GET_POWER,
9932         IPW_PRIV_SET_MODE,
9933         IPW_PRIV_GET_MODE,
9934         IPW_PRIV_SET_PREAMBLE,
9935         IPW_PRIV_GET_PREAMBLE,
9936         IPW_PRIV_RESET,
9937         IPW_PRIV_SW_RESET,
9938 #ifdef CONFIG_IPW2200_MONITOR
9939         IPW_PRIV_SET_MONITOR,
9940 #endif
9941 };
9942
9943 static struct iw_priv_args ipw_priv_args[] = {
9944         {
9945          .cmd = IPW_PRIV_SET_POWER,
9946          .set_args = IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9947          .name = "set_power"},
9948         {
9949          .cmd = IPW_PRIV_GET_POWER,
9950          .get_args = IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | MAX_WX_STRING,
9951          .name = "get_power"},
9952         {
9953          .cmd = IPW_PRIV_SET_MODE,
9954          .set_args = IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9955          .name = "set_mode"},
9956         {
9957          .cmd = IPW_PRIV_GET_MODE,
9958          .get_args = IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | MAX_WX_STRING,
9959          .name = "get_mode"},
9960         {
9961          .cmd = IPW_PRIV_SET_PREAMBLE,
9962          .set_args = IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9963          .name = "set_preamble"},
9964         {
9965          .cmd = IPW_PRIV_GET_PREAMBLE,
9966          .get_args = IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | IFNAMSIZ,
9967          .name = "get_preamble"},
9968         {
9969          IPW_PRIV_RESET,
9970          IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 0, 0, "reset"},
9971         {
9972          IPW_PRIV_SW_RESET,
9973          IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 0, 0, "sw_reset"},
9974 #ifdef CONFIG_IPW2200_MONITOR
9975         {
9976          IPW_PRIV_SET_MONITOR,
9977          IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2, 0, "monitor"},
9978 #endif                          /* CONFIG_IPW2200_MONITOR */
9979 };
9980
9981 static iw_handler ipw_priv_handler[] = {
9982         ipw_wx_set_powermode,
9983         ipw_wx_get_powermode,
9984         ipw_wx_set_wireless_mode,
9985         ipw_wx_get_wireless_mode,
9986         ipw_wx_set_preamble,
9987         ipw_wx_get_preamble,
9988         ipw_wx_reset,
9989         ipw_wx_sw_reset,
9990 #ifdef CONFIG_IPW2200_MONITOR
9991         ipw_wx_set_monitor,
9992 #endif
9993 };
9994
9995 static struct iw_handler_def ipw_wx_handler_def = {
9996         .standard = ipw_wx_handlers,
9997         .num_standard = ARRAY_SIZE(ipw_wx_handlers),
9998         .num_private = ARRAY_SIZE(ipw_priv_handler),
9999         .num_private_args = ARRAY_SIZE(ipw_priv_args),
10000         .private = ipw_priv_handler,
10001         .private_args = ipw_priv_args,
10002 };
10003
10004 static struct iw_public_data ipw_wx_data;
10005
10006 /*
10007  * Get wireless statistics.
10008  * Called by /proc/net/wireless
10009  * Also called by SIOCGIWSTATS
10010  */
10011 static struct iw_statistics *ipw_get_wireless_stats(struct net_device *dev)
10012 {
10013         struct ipw_priv *priv = ieee80211_priv(dev);
10014         struct iw_statistics *wstats;
10015
10016         wstats = &priv->wstats;
10017
10018         /* if hw is disabled, then ipw_get_ordinal() can't be called.
10019          * netdev->get_wireless_stats seems to be called before fw is
10020          * initialized.  STATUS_ASSOCIATED will only be set if the hw is up
10021          * and associated; if not associcated, the values are all meaningless
10022          * anyway, so set them all to NULL and INVALID */
10023         if (!(priv->status & STATUS_ASSOCIATED)) {
10024                 wstats->miss.beacon = 0;
10025                 wstats->discard.retries = 0;
10026                 wstats->qual.qual = 0;
10027                 wstats->qual.level = 0;
10028                 wstats->qual.noise = 0;
10029                 wstats->qual.updated = 7;
10030                 wstats->qual.updated |= IW_QUAL_NOISE_INVALID |
10031                     IW_QUAL_QUAL_INVALID | IW_QUAL_LEVEL_INVALID;
10032                 return wstats;
10033         }
10034
10035         wstats->qual.qual = priv->quality;
10036         wstats->qual.level = average_value(&priv->average_rssi);
10037         wstats->qual.noise = average_value(&priv->average_noise);
10038         wstats->qual.updated = IW_QUAL_QUAL_UPDATED | IW_QUAL_LEVEL_UPDATED |
10039             IW_QUAL_NOISE_UPDATED;
10040
10041         wstats->miss.beacon = average_value(&priv->average_missed_beacons);
10042         wstats->discard.retries = priv->last_tx_failures;
10043         wstats->discard.code = priv->ieee->ieee_stats.rx_discards_undecryptable;
10044
10045 /*      if (ipw_get_ordinal(priv, IPW_ORD_STAT_TX_RETRY, &tx_retry, &len))
10046         goto fail_get_ordinal;
10047         wstats->discard.retries += tx_retry; */
10048
10049         return wstats;
10050 }
10051
10052 /* net device stuff */
10053
10054 static inline void init_sys_config(struct ipw_sys_config *sys_config)
10055 {
10056         memset(sys_config, 0, sizeof(struct ipw_sys_config));
10057         sys_config->bt_coexistence = 1; /* We may need to look into prvStaBtConfig */
10058         sys_config->answer_broadcast_ssid_probe = 0;
10059         sys_config->accept_all_data_frames = 0;
10060         sys_config->accept_non_directed_frames = 1;
10061         sys_config->exclude_unicast_unencrypted = 0;
10062         sys_config->disable_unicast_decryption = 1;
10063         sys_config->exclude_multicast_unencrypted = 0;
10064         sys_config->disable_multicast_decryption = 1;
10065         sys_config->antenna_diversity = CFG_SYS_ANTENNA_BOTH;
10066         sys_config->pass_crc_to_host = 0;       /* TODO: See if 1 gives us FCS */
10067         sys_config->dot11g_auto_detection = 0;
10068         sys_config->enable_cts_to_self = 0;
10069         sys_config->bt_coexist_collision_thr = 0;
10070         sys_config->pass_noise_stats_to_host = 1;       //1 -- fix for 256
10071 }
10072
10073 static int ipw_net_open(struct net_device *dev)
10074 {
10075         struct ipw_priv *priv = ieee80211_priv(dev);
10076         IPW_DEBUG_INFO("dev->open\n");
10077         /* we should be verifying the device is ready to be opened */
10078         down(&priv->sem);
10079         if (!(priv->status & STATUS_RF_KILL_MASK) &&
10080             (priv->status & STATUS_ASSOCIATED))
10081                 netif_start_queue(dev);
10082         up(&priv->sem);
10083         return 0;
10084 }
10085
10086 static int ipw_net_stop(struct net_device *dev)
10087 {
10088         IPW_DEBUG_INFO("dev->close\n");
10089         netif_stop_queue(dev);
10090         return 0;
10091 }
10092
10093 /*
10094 todo:
10095
10096 modify to send one tfd per fragment instead of using chunking.  otherwise
10097 we need to heavily modify the ieee80211_skb_to_txb.
10098 */
10099
10100 static inline int ipw_tx_skb(struct ipw_priv *priv, struct ieee80211_txb *txb,
10101                              int pri)
10102 {
10103         struct ieee80211_hdr_3addr *hdr = (struct ieee80211_hdr_3addr *)
10104             txb->fragments[0]->data;
10105         int i = 0;
10106         struct tfd_frame *tfd;
10107 #ifdef CONFIG_IPW_QOS
10108         int tx_id = ipw_get_tx_queue_number(priv, pri);
10109         struct clx2_tx_queue *txq = &priv->txq[tx_id];
10110 #else
10111         struct clx2_tx_queue *txq = &priv->txq[0];
10112 #endif
10113         struct clx2_queue *q = &txq->q;
10114         u8 id, hdr_len, unicast;
10115         u16 remaining_bytes;
10116         int fc;
10117
10118         /* If there isn't room in the queue, we return busy and let the
10119          * network stack requeue the packet for us */
10120         if (ipw_queue_space(q) < q->high_mark)
10121                 return NETDEV_TX_BUSY;
10122
10123         switch (priv->ieee->iw_mode) {
10124         case IW_MODE_ADHOC:
10125                 hdr_len = IEEE80211_3ADDR_LEN;
10126                 unicast = !is_multicast_ether_addr(hdr->addr1);
10127                 id = ipw_find_station(priv, hdr->addr1);
10128                 if (id == IPW_INVALID_STATION) {
10129                         id = ipw_add_station(priv, hdr->addr1);
10130                         if (id == IPW_INVALID_STATION) {
10131                                 IPW_WARNING("Attempt to send data to "
10132                                             "invalid cell: " MAC_FMT "\n",
10133                                             MAC_ARG(hdr->addr1));
10134                                 goto drop;
10135                         }
10136                 }
10137                 break;
10138
10139         case IW_MODE_INFRA:
10140         default:
10141                 unicast = !is_multicast_ether_addr(hdr->addr3);
10142                 hdr_len = IEEE80211_3ADDR_LEN;
10143                 id = 0;
10144                 break;
10145         }
10146
10147         tfd = &txq->bd[q->first_empty];
10148         txq->txb[q->first_empty] = txb;
10149         memset(tfd, 0, sizeof(*tfd));
10150         tfd->u.data.station_number = id;
10151
10152         tfd->control_flags.message_type = TX_FRAME_TYPE;
10153         tfd->control_flags.control_bits = TFD_NEED_IRQ_MASK;
10154
10155         tfd->u.data.cmd_id = DINO_CMD_TX;
10156         tfd->u.data.len = cpu_to_le16(txb->payload_size);
10157         remaining_bytes = txb->payload_size;
10158
10159         if (priv->assoc_request.ieee_mode == IPW_B_MODE)
10160                 tfd->u.data.tx_flags_ext |= DCT_FLAG_EXT_MODE_CCK;
10161         else
10162                 tfd->u.data.tx_flags_ext |= DCT_FLAG_EXT_MODE_OFDM;
10163
10164         if (priv->assoc_request.preamble_length == DCT_FLAG_SHORT_PREAMBLE)
10165                 tfd->u.data.tx_flags |= DCT_FLAG_SHORT_PREAMBLE;
10166
10167         fc = le16_to_cpu(hdr->frame_ctl);
10168         hdr->frame_ctl = cpu_to_le16(fc & ~IEEE80211_FCTL_MOREFRAGS);
10169
10170         memcpy(&tfd->u.data.tfd.tfd_24.mchdr, hdr, hdr_len);
10171
10172         if (likely(unicast))
10173                 tfd->u.data.tx_flags |= DCT_FLAG_ACK_REQD;
10174
10175         if (txb->encrypted && !priv->ieee->host_encrypt) {
10176                 switch (priv->ieee->sec.level) {
10177                 case SEC_LEVEL_3:
10178                         tfd->u.data.tfd.tfd_24.mchdr.frame_ctl |=
10179                             IEEE80211_FCTL_PROTECTED;
10180                         /* XXX: ACK flag must be set for CCMP even if it
10181                          * is a multicast/broadcast packet, because CCMP
10182                          * group communication encrypted by GTK is
10183                          * actually done by the AP. */
10184                         if (!unicast)
10185                                 tfd->u.data.tx_flags |= DCT_FLAG_ACK_REQD;
10186
10187                         tfd->u.data.tx_flags &= ~DCT_FLAG_NO_WEP;
10188                         tfd->u.data.tx_flags_ext |= DCT_FLAG_EXT_SECURITY_CCM;
10189                         tfd->u.data.key_index = 0;
10190                         tfd->u.data.key_index |= DCT_WEP_INDEX_USE_IMMEDIATE;
10191                         break;
10192                 case SEC_LEVEL_2:
10193                         tfd->u.data.tfd.tfd_24.mchdr.frame_ctl |=
10194                             IEEE80211_FCTL_PROTECTED;
10195                         tfd->u.data.tx_flags &= ~DCT_FLAG_NO_WEP;
10196                         tfd->u.data.tx_flags_ext |= DCT_FLAG_EXT_SECURITY_TKIP;
10197                         tfd->u.data.key_index = DCT_WEP_INDEX_USE_IMMEDIATE;
10198                         break;
10199                 case SEC_LEVEL_1:
10200                         tfd->u.data.tfd.tfd_24.mchdr.frame_ctl |=
10201                             IEEE80211_FCTL_PROTECTED;
10202                         tfd->u.data.key_index = priv->ieee->tx_keyidx;
10203                         if (priv->ieee->sec.key_sizes[priv->ieee->tx_keyidx] <=
10204                             40)
10205                                 tfd->u.data.key_index |= DCT_WEP_KEY_64Bit;
10206                         else
10207                                 tfd->u.data.key_index |= DCT_WEP_KEY_128Bit;
10208                         break;
10209                 case SEC_LEVEL_0:
10210                         break;
10211                 default:
10212                         printk(KERN_ERR "Unknow security level %d\n",
10213                                priv->ieee->sec.level);
10214                         break;
10215                 }
10216         } else
10217                 /* No hardware encryption */
10218                 tfd->u.data.tx_flags |= DCT_FLAG_NO_WEP;
10219
10220 #ifdef CONFIG_IPW_QOS
10221         ipw_qos_set_tx_queue_command(priv, pri, &(tfd->u.data), unicast);
10222 #endif                          /* CONFIG_IPW_QOS */
10223
10224         /* payload */
10225         tfd->u.data.num_chunks = cpu_to_le32(min((u8) (NUM_TFD_CHUNKS - 2),
10226                                                  txb->nr_frags));
10227         IPW_DEBUG_FRAG("%i fragments being sent as %i chunks.\n",
10228                        txb->nr_frags, le32_to_cpu(tfd->u.data.num_chunks));
10229         for (i = 0; i < le32_to_cpu(tfd->u.data.num_chunks); i++) {
10230                 IPW_DEBUG_FRAG("Adding fragment %i of %i (%d bytes).\n",
10231                                i, le32_to_cpu(tfd->u.data.num_chunks),
10232                                txb->fragments[i]->len - hdr_len);
10233                 IPW_DEBUG_TX("Dumping TX packet frag %i of %i (%d bytes):\n",
10234                              i, tfd->u.data.num_chunks,
10235                              txb->fragments[i]->len - hdr_len);
10236                 printk_buf(IPW_DL_TX, txb->fragments[i]->data + hdr_len,
10237                            txb->fragments[i]->len - hdr_len);
10238
10239                 tfd->u.data.chunk_ptr[i] =
10240                     cpu_to_le32(pci_map_single
10241                                 (priv->pci_dev,
10242                                  txb->fragments[i]->data + hdr_len,
10243                                  txb->fragments[i]->len - hdr_len,
10244                                  PCI_DMA_TODEVICE));
10245                 tfd->u.data.chunk_len[i] =
10246                     cpu_to_le16(txb->fragments[i]->len - hdr_len);
10247         }
10248
10249         if (i != txb->nr_frags) {
10250                 struct sk_buff *skb;
10251                 u16 remaining_bytes = 0;
10252                 int j;
10253
10254                 for (j = i; j < txb->nr_frags; j++)
10255                         remaining_bytes += txb->fragments[j]->len - hdr_len;
10256
10257                 printk(KERN_INFO "Trying to reallocate for %d bytes\n",
10258                        remaining_bytes);
10259                 skb = alloc_skb(remaining_bytes, GFP_ATOMIC);
10260                 if (skb != NULL) {
10261                         tfd->u.data.chunk_len[i] = cpu_to_le16(remaining_bytes);
10262                         for (j = i; j < txb->nr_frags; j++) {
10263                                 int size = txb->fragments[j]->len - hdr_len;
10264
10265                                 printk(KERN_INFO "Adding frag %d %d...\n",
10266                                        j, size);
10267                                 memcpy(skb_put(skb, size),
10268                                        txb->fragments[j]->data + hdr_len, size);
10269                         }
10270                         dev_kfree_skb_any(txb->fragments[i]);
10271                         txb->fragments[i] = skb;
10272                         tfd->u.data.chunk_ptr[i] =
10273                             cpu_to_le32(pci_map_single
10274                                         (priv->pci_dev, skb->data,
10275                                          tfd->u.data.chunk_len[i],
10276                                          PCI_DMA_TODEVICE));
10277
10278                         tfd->u.data.num_chunks =
10279                             cpu_to_le32(le32_to_cpu(tfd->u.data.num_chunks) +
10280                                         1);
10281                 }
10282         }
10283
10284         /* kick DMA */
10285         q->first_empty = ipw_queue_inc_wrap(q->first_empty, q->n_bd);
10286         ipw_write32(priv, q->reg_w, q->first_empty);
10287
10288         return NETDEV_TX_OK;
10289
10290       drop:
10291         IPW_DEBUG_DROP("Silently dropping Tx packet.\n");
10292         ieee80211_txb_free(txb);
10293         return NETDEV_TX_OK;
10294 }
10295
10296 static int ipw_net_is_queue_full(struct net_device *dev, int pri)
10297 {
10298         struct ipw_priv *priv = ieee80211_priv(dev);
10299 #ifdef CONFIG_IPW_QOS
10300         int tx_id = ipw_get_tx_queue_number(priv, pri);
10301         struct clx2_tx_queue *txq = &priv->txq[tx_id];
10302 #else
10303         struct clx2_tx_queue *txq = &priv->txq[0];
10304 #endif                          /* CONFIG_IPW_QOS */
10305
10306         if (ipw_queue_space(&txq->q) < txq->q.high_mark)
10307                 return 1;
10308
10309         return 0;
10310 }
10311
10312 static int ipw_net_hard_start_xmit(struct ieee80211_txb *txb,
10313                                    struct net_device *dev, int pri)
10314 {
10315         struct ipw_priv *priv = ieee80211_priv(dev);
10316         unsigned long flags;
10317         int ret;
10318
10319         IPW_DEBUG_TX("dev->xmit(%d bytes)\n", txb->payload_size);
10320         spin_lock_irqsave(&priv->lock, flags);
10321
10322         if (!(priv->status & STATUS_ASSOCIATED)) {
10323                 IPW_DEBUG_INFO("Tx attempt while not associated.\n");
10324                 priv->ieee->stats.tx_carrier_errors++;
10325                 netif_stop_queue(dev);
10326                 goto fail_unlock;
10327         }
10328
10329         ret = ipw_tx_skb(priv, txb, pri);
10330         if (ret == NETDEV_TX_OK)
10331                 __ipw_led_activity_on(priv);
10332         spin_unlock_irqrestore(&priv->lock, flags);
10333
10334         return ret;
10335
10336       fail_unlock:
10337         spin_unlock_irqrestore(&priv->lock, flags);
10338         return 1;
10339 }
10340
10341 static struct net_device_stats *ipw_net_get_stats(struct net_device *dev)
10342 {
10343         struct ipw_priv *priv = ieee80211_priv(dev);
10344
10345         priv->ieee->stats.tx_packets = priv->tx_packets;
10346         priv->ieee->stats.rx_packets = priv->rx_packets;
10347         return &priv->ieee->stats;
10348 }
10349
10350 static void ipw_net_set_multicast_list(struct net_device *dev)
10351 {
10352
10353 }
10354
10355 static int ipw_net_set_mac_address(struct net_device *dev, void *p)
10356 {
10357         struct ipw_priv *priv = ieee80211_priv(dev);
10358         struct sockaddr *addr = p;
10359         if (!is_valid_ether_addr(addr->sa_data))
10360                 return -EADDRNOTAVAIL;
10361         down(&priv->sem);
10362         priv->config |= CFG_CUSTOM_MAC;
10363         memcpy(priv->mac_addr, addr->sa_data, ETH_ALEN);
10364         printk(KERN_INFO "%s: Setting MAC to " MAC_FMT "\n",
10365                priv->net_dev->name, MAC_ARG(priv->mac_addr));
10366         queue_work(priv->workqueue, &priv->adapter_restart);
10367         up(&priv->sem);
10368         return 0;
10369 }
10370
10371 static void ipw_ethtool_get_drvinfo(struct net_device *dev,
10372                                     struct ethtool_drvinfo *info)
10373 {
10374         struct ipw_priv *p = ieee80211_priv(dev);
10375         char vers[64];
10376         char date[32];
10377         u32 len;
10378
10379         strcpy(info->driver, DRV_NAME);
10380         strcpy(info->version, DRV_VERSION);
10381
10382         len = sizeof(vers);
10383         ipw_get_ordinal(p, IPW_ORD_STAT_FW_VERSION, vers, &len);
10384         len = sizeof(date);
10385         ipw_get_ordinal(p, IPW_ORD_STAT_FW_DATE, date, &len);
10386
10387         snprintf(info->fw_version, sizeof(info->fw_version), "%s (%s)",
10388                  vers, date);
10389         strcpy(info->bus_info, pci_name(p->pci_dev));
10390         info->eedump_len = IPW_EEPROM_IMAGE_SIZE;
10391 }
10392
10393 static u32 ipw_ethtool_get_link(struct net_device *dev)
10394 {
10395         struct ipw_priv *priv = ieee80211_priv(dev);
10396         return (priv->status & STATUS_ASSOCIATED) != 0;
10397 }
10398
10399 static int ipw_ethtool_get_eeprom_len(struct net_device *dev)
10400 {
10401         return IPW_EEPROM_IMAGE_SIZE;
10402 }
10403
10404 static int ipw_ethtool_get_eeprom(struct net_device *dev,
10405                                   struct ethtool_eeprom *eeprom, u8 * bytes)
10406 {
10407         struct ipw_priv *p = ieee80211_priv(dev);
10408
10409         if (eeprom->offset + eeprom->len > IPW_EEPROM_IMAGE_SIZE)
10410                 return -EINVAL;
10411         down(&p->sem);
10412         memcpy(bytes, &p->eeprom[eeprom->offset], eeprom->len);
10413         up(&p->sem);
10414         return 0;
10415 }
10416
10417 static int ipw_ethtool_set_eeprom(struct net_device *dev,
10418                                   struct ethtool_eeprom *eeprom, u8 * bytes)
10419 {
10420         struct ipw_priv *p = ieee80211_priv(dev);
10421         int i;
10422
10423         if (eeprom->offset + eeprom->len > IPW_EEPROM_IMAGE_SIZE)
10424                 return -EINVAL;
10425         down(&p->sem);
10426         memcpy(&p->eeprom[eeprom->offset], bytes, eeprom->len);
10427         for (i = IPW_EEPROM_DATA;
10428              i < IPW_EEPROM_DATA + IPW_EEPROM_IMAGE_SIZE; i++)
10429                 ipw_write8(p, i, p->eeprom[i]);
10430         up(&p->sem);
10431         return 0;
10432 }
10433
10434 static struct ethtool_ops ipw_ethtool_ops = {
10435         .get_link = ipw_ethtool_get_link,
10436         .get_drvinfo = ipw_ethtool_get_drvinfo,
10437         .get_eeprom_len = ipw_ethtool_get_eeprom_len,
10438         .get_eeprom = ipw_ethtool_get_eeprom,
10439         .set_eeprom = ipw_ethtool_set_eeprom,
10440 };
10441
10442 static irqreturn_t ipw_isr(int irq, void *data, struct pt_regs *regs)
10443 {
10444         struct ipw_priv *priv = data;
10445         u32 inta, inta_mask;
10446
10447         if (!priv)
10448                 return IRQ_NONE;
10449
10450         spin_lock(&priv->lock);
10451
10452         if (!(priv->status & STATUS_INT_ENABLED)) {
10453                 /* Shared IRQ */
10454                 goto none;
10455         }
10456
10457         inta = ipw_read32(priv, IPW_INTA_RW);
10458         inta_mask = ipw_read32(priv, IPW_INTA_MASK_R);
10459
10460         if (inta == 0xFFFFFFFF) {
10461                 /* Hardware disappeared */
10462                 IPW_WARNING("IRQ INTA == 0xFFFFFFFF\n");
10463                 goto none;
10464         }
10465
10466         if (!(inta & (IPW_INTA_MASK_ALL & inta_mask))) {
10467                 /* Shared interrupt */
10468                 goto none;
10469         }
10470
10471         /* tell the device to stop sending interrupts */
10472         ipw_disable_interrupts(priv);
10473
10474         /* ack current interrupts */
10475         inta &= (IPW_INTA_MASK_ALL & inta_mask);
10476         ipw_write32(priv, IPW_INTA_RW, inta);
10477
10478         /* Cache INTA value for our tasklet */
10479         priv->isr_inta = inta;
10480
10481         tasklet_schedule(&priv->irq_tasklet);
10482
10483         spin_unlock(&priv->lock);
10484
10485         return IRQ_HANDLED;
10486       none:
10487         spin_unlock(&priv->lock);
10488         return IRQ_NONE;
10489 }
10490
10491 static void ipw_rf_kill(void *adapter)
10492 {
10493         struct ipw_priv *priv = adapter;
10494         unsigned long flags;
10495
10496         spin_lock_irqsave(&priv->lock, flags);
10497
10498         if (rf_kill_active(priv)) {
10499                 IPW_DEBUG_RF_KILL("RF Kill active, rescheduling GPIO check\n");
10500                 if (priv->workqueue)
10501                         queue_delayed_work(priv->workqueue,
10502                                            &priv->rf_kill, 2 * HZ);
10503                 goto exit_unlock;
10504         }
10505
10506         /* RF Kill is now disabled, so bring the device back up */
10507
10508         if (!(priv->status & STATUS_RF_KILL_MASK)) {
10509                 IPW_DEBUG_RF_KILL("HW RF Kill no longer active, restarting "
10510                                   "device\n");
10511
10512                 /* we can not do an adapter restart while inside an irq lock */
10513                 queue_work(priv->workqueue, &priv->adapter_restart);
10514         } else
10515                 IPW_DEBUG_RF_KILL("HW RF Kill deactivated.  SW RF Kill still "
10516                                   "enabled\n");
10517
10518       exit_unlock:
10519         spin_unlock_irqrestore(&priv->lock, flags);
10520 }
10521
10522 static void ipw_bg_rf_kill(void *data)
10523 {
10524         struct ipw_priv *priv = data;
10525         down(&priv->sem);
10526         ipw_rf_kill(data);
10527         up(&priv->sem);
10528 }
10529
10530 void ipw_link_up(struct ipw_priv *priv)
10531 {
10532         priv->last_seq_num = -1;
10533         priv->last_frag_num = -1;
10534         priv->last_packet_time = 0;
10535
10536         netif_carrier_on(priv->net_dev);
10537         if (netif_queue_stopped(priv->net_dev)) {
10538                 IPW_DEBUG_NOTIF("waking queue\n");
10539                 netif_wake_queue(priv->net_dev);
10540         } else {
10541                 IPW_DEBUG_NOTIF("starting queue\n");
10542                 netif_start_queue(priv->net_dev);
10543         }
10544
10545         cancel_delayed_work(&priv->request_scan);
10546         ipw_reset_stats(priv);
10547         /* Ensure the rate is updated immediately */
10548         priv->last_rate = ipw_get_current_rate(priv);
10549         ipw_gather_stats(priv);
10550         ipw_led_link_up(priv);
10551         notify_wx_assoc_event(priv);
10552
10553         if (priv->config & CFG_BACKGROUND_SCAN)
10554                 queue_delayed_work(priv->workqueue, &priv->request_scan, HZ);
10555 }
10556
10557 static void ipw_bg_link_up(void *data)
10558 {
10559         struct ipw_priv *priv = data;
10560         down(&priv->sem);
10561         ipw_link_up(data);
10562         up(&priv->sem);
10563 }
10564
10565 void ipw_link_down(struct ipw_priv *priv)
10566 {
10567         ipw_led_link_down(priv);
10568         netif_carrier_off(priv->net_dev);
10569         netif_stop_queue(priv->net_dev);
10570         notify_wx_assoc_event(priv);
10571
10572         /* Cancel any queued work ... */
10573         cancel_delayed_work(&priv->request_scan);
10574         cancel_delayed_work(&priv->adhoc_check);
10575         cancel_delayed_work(&priv->gather_stats);
10576
10577         ipw_reset_stats(priv);
10578
10579         if (!(priv->status & STATUS_EXIT_PENDING)) {
10580                 /* Queue up another scan... */
10581                 queue_work(priv->workqueue, &priv->request_scan);
10582         }
10583 }
10584
10585 static void ipw_bg_link_down(void *data)
10586 {
10587         struct ipw_priv *priv = data;
10588         down(&priv->sem);
10589         ipw_link_down(data);
10590         up(&priv->sem);
10591 }
10592
10593 static int ipw_setup_deferred_work(struct ipw_priv *priv)
10594 {
10595         int ret = 0;
10596
10597         priv->workqueue = create_workqueue(DRV_NAME);
10598         init_waitqueue_head(&priv->wait_command_queue);
10599         init_waitqueue_head(&priv->wait_state);
10600
10601         INIT_WORK(&priv->adhoc_check, ipw_bg_adhoc_check, priv);
10602         INIT_WORK(&priv->associate, ipw_bg_associate, priv);
10603         INIT_WORK(&priv->disassociate, ipw_bg_disassociate, priv);
10604         INIT_WORK(&priv->system_config, ipw_system_config, priv);
10605         INIT_WORK(&priv->rx_replenish, ipw_bg_rx_queue_replenish, priv);
10606         INIT_WORK(&priv->adapter_restart, ipw_bg_adapter_restart, priv);
10607         INIT_WORK(&priv->rf_kill, ipw_bg_rf_kill, priv);
10608         INIT_WORK(&priv->up, (void (*)(void *))ipw_bg_up, priv);
10609         INIT_WORK(&priv->down, (void (*)(void *))ipw_bg_down, priv);
10610         INIT_WORK(&priv->request_scan,
10611                   (void (*)(void *))ipw_request_scan, priv);
10612         INIT_WORK(&priv->gather_stats,
10613                   (void (*)(void *))ipw_bg_gather_stats, priv);
10614         INIT_WORK(&priv->abort_scan, (void (*)(void *))ipw_bg_abort_scan, priv);
10615         INIT_WORK(&priv->roam, ipw_bg_roam, priv);
10616         INIT_WORK(&priv->scan_check, ipw_bg_scan_check, priv);
10617         INIT_WORK(&priv->link_up, (void (*)(void *))ipw_bg_link_up, priv);
10618         INIT_WORK(&priv->link_down, (void (*)(void *))ipw_bg_link_down, priv);
10619         INIT_WORK(&priv->led_link_on, (void (*)(void *))ipw_bg_led_link_on,
10620                   priv);
10621         INIT_WORK(&priv->led_link_off, (void (*)(void *))ipw_bg_led_link_off,
10622                   priv);
10623         INIT_WORK(&priv->led_act_off, (void (*)(void *))ipw_bg_led_activity_off,
10624                   priv);
10625         INIT_WORK(&priv->merge_networks,
10626                   (void (*)(void *))ipw_merge_adhoc_network, priv);
10627
10628 #ifdef CONFIG_IPW_QOS
10629         INIT_WORK(&priv->qos_activate, (void (*)(void *))ipw_bg_qos_activate,
10630                   priv);
10631 #endif                          /* CONFIG_IPW_QOS */
10632
10633         tasklet_init(&priv->irq_tasklet, (void (*)(unsigned long))
10634                      ipw_irq_tasklet, (unsigned long)priv);
10635
10636         return ret;
10637 }
10638
10639 static void shim__set_security(struct net_device *dev,
10640                                struct ieee80211_security *sec)
10641 {
10642         struct ipw_priv *priv = ieee80211_priv(dev);
10643         int i;
10644         for (i = 0; i < 4; i++) {
10645                 if (sec->flags & (1 << i)) {
10646                         priv->ieee->sec.encode_alg[i] = sec->encode_alg[i];
10647                         priv->ieee->sec.key_sizes[i] = sec->key_sizes[i];
10648                         if (sec->key_sizes[i] == 0)
10649                                 priv->ieee->sec.flags &= ~(1 << i);
10650                         else {
10651                                 memcpy(priv->ieee->sec.keys[i], sec->keys[i],
10652                                        sec->key_sizes[i]);
10653                                 priv->ieee->sec.flags |= (1 << i);
10654                         }
10655                         priv->status |= STATUS_SECURITY_UPDATED;
10656                 } else if (sec->level != SEC_LEVEL_1)
10657                         priv->ieee->sec.flags &= ~(1 << i);
10658         }
10659
10660         if (sec->flags & SEC_ACTIVE_KEY) {
10661                 if (sec->active_key <= 3) {
10662                         priv->ieee->sec.active_key = sec->active_key;
10663                         priv->ieee->sec.flags |= SEC_ACTIVE_KEY;
10664                 } else
10665                         priv->ieee->sec.flags &= ~SEC_ACTIVE_KEY;
10666                 priv->status |= STATUS_SECURITY_UPDATED;
10667         } else
10668                 priv->ieee->sec.flags &= ~SEC_ACTIVE_KEY;
10669
10670         if ((sec->flags & SEC_AUTH_MODE) &&
10671             (priv->ieee->sec.auth_mode != sec->auth_mode)) {
10672                 priv->ieee->sec.auth_mode = sec->auth_mode;
10673                 priv->ieee->sec.flags |= SEC_AUTH_MODE;
10674                 if (sec->auth_mode == WLAN_AUTH_SHARED_KEY)
10675                         priv->capability |= CAP_SHARED_KEY;
10676                 else
10677                         priv->capability &= ~CAP_SHARED_KEY;
10678                 priv->status |= STATUS_SECURITY_UPDATED;
10679         }
10680
10681         if (sec->flags & SEC_ENABLED && priv->ieee->sec.enabled != sec->enabled) {
10682                 priv->ieee->sec.flags |= SEC_ENABLED;
10683                 priv->ieee->sec.enabled = sec->enabled;
10684                 priv->status |= STATUS_SECURITY_UPDATED;
10685                 if (sec->enabled)
10686                         priv->capability |= CAP_PRIVACY_ON;
10687                 else
10688                         priv->capability &= ~CAP_PRIVACY_ON;
10689         }
10690
10691         if (sec->flags & SEC_ENCRYPT)
10692                 priv->ieee->sec.encrypt = sec->encrypt;
10693
10694         if (sec->flags & SEC_LEVEL && priv->ieee->sec.level != sec->level) {
10695                 priv->ieee->sec.level = sec->level;
10696                 priv->ieee->sec.flags |= SEC_LEVEL;
10697                 priv->status |= STATUS_SECURITY_UPDATED;
10698         }
10699
10700         if (!priv->ieee->host_encrypt && (sec->flags & SEC_ENCRYPT))
10701                 ipw_set_hwcrypto_keys(priv);
10702
10703         /* To match current functionality of ipw2100 (which works well w/
10704          * various supplicants, we don't force a disassociate if the
10705          * privacy capability changes ... */
10706 #if 0
10707         if ((priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING)) &&
10708             (((priv->assoc_request.capability &
10709                WLAN_CAPABILITY_PRIVACY) && !sec->enabled) ||
10710              (!(priv->assoc_request.capability &
10711                 WLAN_CAPABILITY_PRIVACY) && sec->enabled))) {
10712                 IPW_DEBUG_ASSOC("Disassociating due to capability "
10713                                 "change.\n");
10714                 ipw_disassociate(priv);
10715         }
10716 #endif
10717 }
10718
10719 static int init_supported_rates(struct ipw_priv *priv,
10720                                 struct ipw_supported_rates *rates)
10721 {
10722         /* TODO: Mask out rates based on priv->rates_mask */
10723
10724         memset(rates, 0, sizeof(*rates));
10725         /* configure supported rates */
10726         switch (priv->ieee->freq_band) {
10727         case IEEE80211_52GHZ_BAND:
10728                 rates->ieee_mode = IPW_A_MODE;
10729                 rates->purpose = IPW_RATE_CAPABILITIES;
10730                 ipw_add_ofdm_scan_rates(rates, IEEE80211_CCK_MODULATION,
10731                                         IEEE80211_OFDM_DEFAULT_RATES_MASK);
10732                 break;
10733
10734         default:                /* Mixed or 2.4Ghz */
10735                 rates->ieee_mode = IPW_G_MODE;
10736                 rates->purpose = IPW_RATE_CAPABILITIES;
10737                 ipw_add_cck_scan_rates(rates, IEEE80211_CCK_MODULATION,
10738                                        IEEE80211_CCK_DEFAULT_RATES_MASK);
10739                 if (priv->ieee->modulation & IEEE80211_OFDM_MODULATION) {
10740                         ipw_add_ofdm_scan_rates(rates, IEEE80211_CCK_MODULATION,
10741                                                 IEEE80211_OFDM_DEFAULT_RATES_MASK);
10742                 }
10743                 break;
10744         }
10745
10746         return 0;
10747 }
10748
10749 static int ipw_config(struct ipw_priv *priv)
10750 {
10751         /* This is only called from ipw_up, which resets/reloads the firmware
10752            so, we don't need to first disable the card before we configure
10753            it */
10754         if (ipw_set_tx_power(priv))
10755                 goto error;
10756
10757         /* initialize adapter address */
10758         if (ipw_send_adapter_address(priv, priv->net_dev->dev_addr))
10759                 goto error;
10760
10761         /* set basic system config settings */
10762         init_sys_config(&priv->sys_config);
10763         if (priv->ieee->iw_mode == IW_MODE_ADHOC)
10764                 priv->sys_config.answer_broadcast_ssid_probe = 1;
10765         else
10766                 priv->sys_config.answer_broadcast_ssid_probe = 0;
10767
10768         if (ipw_send_system_config(priv, &priv->sys_config))
10769                 goto error;
10770
10771         init_supported_rates(priv, &priv->rates);
10772         if (ipw_send_supported_rates(priv, &priv->rates))
10773                 goto error;
10774
10775         /* Set request-to-send threshold */
10776         if (priv->rts_threshold) {
10777                 if (ipw_send_rts_threshold(priv, priv->rts_threshold))
10778                         goto error;
10779         }
10780 #ifdef CONFIG_IPW_QOS
10781         IPW_DEBUG_QOS("QoS: call ipw_qos_activate\n");
10782         ipw_qos_activate(priv, NULL);
10783 #endif                          /* CONFIG_IPW_QOS */
10784
10785         if (ipw_set_random_seed(priv))
10786                 goto error;
10787
10788         /* final state transition to the RUN state */
10789         if (ipw_send_host_complete(priv))
10790                 goto error;
10791
10792         priv->status |= STATUS_INIT;
10793
10794         ipw_led_init(priv);
10795         ipw_led_radio_on(priv);
10796         priv->notif_missed_beacons = 0;
10797
10798         /* Set hardware WEP key if it is configured. */
10799         if ((priv->capability & CAP_PRIVACY_ON) &&
10800             (priv->ieee->sec.level == SEC_LEVEL_1) &&
10801             !(priv->ieee->host_encrypt || priv->ieee->host_decrypt))
10802                 ipw_set_hwcrypto_keys(priv);
10803
10804         return 0;
10805
10806       error:
10807         return -EIO;
10808 }
10809
10810 /*
10811  * NOTE:
10812  *
10813  * These tables have been tested in conjunction with the
10814  * Intel PRO/Wireless 2200BG and 2915ABG Network Connection Adapters.
10815  *
10816  * Altering this values, using it on other hardware, or in geographies
10817  * not intended for resale of the above mentioned Intel adapters has
10818  * not been tested.
10819  *
10820  */
10821 static const struct ieee80211_geo ipw_geos[] = {
10822         {                       /* Restricted */
10823          "---",
10824          .bg_channels = 11,
10825          .bg = {{2412, 1}, {2417, 2}, {2422, 3},
10826                 {2427, 4}, {2432, 5}, {2437, 6},
10827                 {2442, 7}, {2447, 8}, {2452, 9},
10828                 {2457, 10}, {2462, 11}},
10829          },
10830
10831         {                       /* Custom US/Canada */
10832          "ZZF",
10833          .bg_channels = 11,
10834          .bg = {{2412, 1}, {2417, 2}, {2422, 3},
10835                 {2427, 4}, {2432, 5}, {2437, 6},
10836                 {2442, 7}, {2447, 8}, {2452, 9},
10837                 {2457, 10}, {2462, 11}},
10838          .a_channels = 8,
10839          .a = {{5180, 36},
10840                {5200, 40},
10841                {5220, 44},
10842                {5240, 48},
10843                {5260, 52, IEEE80211_CH_PASSIVE_ONLY},
10844                {5280, 56, IEEE80211_CH_PASSIVE_ONLY},
10845                {5300, 60, IEEE80211_CH_PASSIVE_ONLY},
10846                {5320, 64, IEEE80211_CH_PASSIVE_ONLY}},
10847          },
10848
10849         {                       /* Rest of World */
10850          "ZZD",
10851          .bg_channels = 13,
10852          .bg = {{2412, 1}, {2417, 2}, {2422, 3},
10853                 {2427, 4}, {2432, 5}, {2437, 6},
10854                 {2442, 7}, {2447, 8}, {2452, 9},
10855                 {2457, 10}, {2462, 11}, {2467, 12},
10856                 {2472, 13}},
10857          },
10858
10859         {                       /* Custom USA & Europe & High */
10860          "ZZA",
10861          .bg_channels = 11,
10862          .bg = {{2412, 1}, {2417, 2}, {2422, 3},
10863                 {2427, 4}, {2432, 5}, {2437, 6},
10864                 {2442, 7}, {2447, 8}, {2452, 9},
10865                 {2457, 10}, {2462, 11}},
10866          .a_channels = 13,
10867          .a = {{5180, 36},
10868                {5200, 40},
10869                {5220, 44},
10870                {5240, 48},
10871                {5260, 52, IEEE80211_CH_PASSIVE_ONLY},
10872                {5280, 56, IEEE80211_CH_PASSIVE_ONLY},
10873                {5300, 60, IEEE80211_CH_PASSIVE_ONLY},
10874                {5320, 64, IEEE80211_CH_PASSIVE_ONLY},
10875                {5745, 149},
10876                {5765, 153},
10877                {5785, 157},
10878                {5805, 161},
10879                {5825, 165}},
10880          },
10881
10882         {                       /* Custom NA & Europe */
10883          "ZZB",
10884          .bg_channels = 11,
10885          .bg = {{2412, 1}, {2417, 2}, {2422, 3},
10886                 {2427, 4}, {2432, 5}, {2437, 6},
10887                 {2442, 7}, {2447, 8}, {2452, 9},
10888                 {2457, 10}, {2462, 11}},
10889          .a_channels = 13,
10890          .a = {{5180, 36},
10891                {5200, 40},
10892                {5220, 44},
10893                {5240, 48},
10894                {5260, 52, IEEE80211_CH_PASSIVE_ONLY},
10895                {5280, 56, IEEE80211_CH_PASSIVE_ONLY},
10896                {5300, 60, IEEE80211_CH_PASSIVE_ONLY},
10897                {5320, 64, IEEE80211_CH_PASSIVE_ONLY},
10898                {5745, 149, IEEE80211_CH_PASSIVE_ONLY},
10899                {5765, 153, IEEE80211_CH_PASSIVE_ONLY},
10900                {5785, 157, IEEE80211_CH_PASSIVE_ONLY},
10901                {5805, 161, IEEE80211_CH_PASSIVE_ONLY},
10902                {5825, 165, IEEE80211_CH_PASSIVE_ONLY}},
10903          },
10904
10905         {                       /* Custom Japan */
10906          "ZZC",
10907          .bg_channels = 11,
10908          .bg = {{2412, 1}, {2417, 2}, {2422, 3},
10909                 {2427, 4}, {2432, 5}, {2437, 6},
10910                 {2442, 7}, {2447, 8}, {2452, 9},
10911                 {2457, 10}, {2462, 11}},
10912          .a_channels = 4,
10913          .a = {{5170, 34}, {5190, 38},
10914                {5210, 42}, {5230, 46}},
10915          },
10916
10917         {                       /* Custom */
10918          "ZZM",
10919          .bg_channels = 11,
10920          .bg = {{2412, 1}, {2417, 2}, {2422, 3},
10921                 {2427, 4}, {2432, 5}, {2437, 6},
10922                 {2442, 7}, {2447, 8}, {2452, 9},
10923                 {2457, 10}, {2462, 11}},
10924          },
10925
10926         {                       /* Europe */
10927          "ZZE",
10928          .bg_channels = 13,
10929          .bg = {{2412, 1}, {2417, 2}, {2422, 3},
10930                 {2427, 4}, {2432, 5}, {2437, 6},
10931                 {2442, 7}, {2447, 8}, {2452, 9},
10932                 {2457, 10}, {2462, 11}, {2467, 12},
10933                 {2472, 13}},
10934          .a_channels = 19,
10935          .a = {{5180, 36},
10936                {5200, 40},
10937                {5220, 44},
10938                {5240, 48},
10939                {5260, 52, IEEE80211_CH_PASSIVE_ONLY},
10940                {5280, 56, IEEE80211_CH_PASSIVE_ONLY},
10941                {5300, 60, IEEE80211_CH_PASSIVE_ONLY},
10942                {5320, 64, IEEE80211_CH_PASSIVE_ONLY},
10943                {5500, 100, IEEE80211_CH_PASSIVE_ONLY},
10944                {5520, 104, IEEE80211_CH_PASSIVE_ONLY},
10945                {5540, 108, IEEE80211_CH_PASSIVE_ONLY},
10946                {5560, 112, IEEE80211_CH_PASSIVE_ONLY},
10947                {5580, 116, IEEE80211_CH_PASSIVE_ONLY},
10948                {5600, 120, IEEE80211_CH_PASSIVE_ONLY},
10949                {5620, 124, IEEE80211_CH_PASSIVE_ONLY},
10950                {5640, 128, IEEE80211_CH_PASSIVE_ONLY},
10951                {5660, 132, IEEE80211_CH_PASSIVE_ONLY},
10952                {5680, 136, IEEE80211_CH_PASSIVE_ONLY},
10953                {5700, 140, IEEE80211_CH_PASSIVE_ONLY}},
10954          },
10955
10956         {                       /* Custom Japan */
10957          "ZZJ",
10958          .bg_channels = 14,
10959          .bg = {{2412, 1}, {2417, 2}, {2422, 3},
10960                 {2427, 4}, {2432, 5}, {2437, 6},
10961                 {2442, 7}, {2447, 8}, {2452, 9},
10962                 {2457, 10}, {2462, 11}, {2467, 12},
10963                 {2472, 13}, {2484, 14, IEEE80211_CH_B_ONLY}},
10964          .a_channels = 4,
10965          .a = {{5170, 34}, {5190, 38},
10966                {5210, 42}, {5230, 46}},
10967          },
10968
10969         {                       /* High Band */
10970          "ZZH",
10971          .bg_channels = 13,
10972          .bg = {{2412, 1}, {2417, 2}, {2422, 3},
10973                 {2427, 4}, {2432, 5}, {2437, 6},
10974                 {2442, 7}, {2447, 8}, {2452, 9},
10975                 {2457, 10}, {2462, 11},
10976                 {2467, 12, IEEE80211_CH_PASSIVE_ONLY},
10977                 {2472, 13, IEEE80211_CH_PASSIVE_ONLY}},
10978          .a_channels = 4,
10979          .a = {{5745, 149}, {5765, 153},
10980                {5785, 157}, {5805, 161}},
10981          },
10982
10983         {                       /* Custom Europe */
10984          "ZZG",
10985          .bg_channels = 13,
10986          .bg = {{2412, 1}, {2417, 2}, {2422, 3},
10987                 {2427, 4}, {2432, 5}, {2437, 6},
10988                 {2442, 7}, {2447, 8}, {2452, 9},
10989                 {2457, 10}, {2462, 11},
10990                 {2467, 12}, {2472, 13}},
10991          .a_channels = 4,
10992          .a = {{5180, 36}, {5200, 40},
10993                {5220, 44}, {5240, 48}},
10994          },
10995
10996         {                       /* Europe */
10997          "ZZK",
10998          .bg_channels = 13,
10999          .bg = {{2412, 1}, {2417, 2}, {2422, 3},
11000                 {2427, 4}, {2432, 5}, {2437, 6},
11001                 {2442, 7}, {2447, 8}, {2452, 9},
11002                 {2457, 10}, {2462, 11},
11003                 {2467, 12, IEEE80211_CH_PASSIVE_ONLY},
11004                 {2472, 13, IEEE80211_CH_PASSIVE_ONLY}},
11005          .a_channels = 24,
11006          .a = {{5180, 36, IEEE80211_CH_PASSIVE_ONLY},
11007                {5200, 40, IEEE80211_CH_PASSIVE_ONLY},
11008                {5220, 44, IEEE80211_CH_PASSIVE_ONLY},
11009                {5240, 48, IEEE80211_CH_PASSIVE_ONLY},
11010                {5260, 52, IEEE80211_CH_PASSIVE_ONLY},
11011                {5280, 56, IEEE80211_CH_PASSIVE_ONLY},
11012                {5300, 60, IEEE80211_CH_PASSIVE_ONLY},
11013                {5320, 64, IEEE80211_CH_PASSIVE_ONLY},
11014                {5500, 100, IEEE80211_CH_PASSIVE_ONLY},
11015                {5520, 104, IEEE80211_CH_PASSIVE_ONLY},
11016                {5540, 108, IEEE80211_CH_PASSIVE_ONLY},
11017                {5560, 112, IEEE80211_CH_PASSIVE_ONLY},
11018                {5580, 116, IEEE80211_CH_PASSIVE_ONLY},
11019                {5600, 120, IEEE80211_CH_PASSIVE_ONLY},
11020                {5620, 124, IEEE80211_CH_PASSIVE_ONLY},
11021                {5640, 128, IEEE80211_CH_PASSIVE_ONLY},
11022                {5660, 132, IEEE80211_CH_PASSIVE_ONLY},
11023                {5680, 136, IEEE80211_CH_PASSIVE_ONLY},
11024                {5700, 140, IEEE80211_CH_PASSIVE_ONLY},
11025                {5745, 149, IEEE80211_CH_PASSIVE_ONLY},
11026                {5765, 153, IEEE80211_CH_PASSIVE_ONLY},
11027                {5785, 157, IEEE80211_CH_PASSIVE_ONLY},
11028                {5805, 161, IEEE80211_CH_PASSIVE_ONLY},
11029                {5825, 165, IEEE80211_CH_PASSIVE_ONLY}},
11030          },
11031
11032         {                       /* Europe */
11033          "ZZL",
11034          .bg_channels = 11,
11035          .bg = {{2412, 1}, {2417, 2}, {2422, 3},
11036                 {2427, 4}, {2432, 5}, {2437, 6},
11037                 {2442, 7}, {2447, 8}, {2452, 9},
11038                 {2457, 10}, {2462, 11}},
11039          .a_channels = 13,
11040          .a = {{5180, 36, IEEE80211_CH_PASSIVE_ONLY},
11041                {5200, 40, IEEE80211_CH_PASSIVE_ONLY},
11042                {5220, 44, IEEE80211_CH_PASSIVE_ONLY},
11043                {5240, 48, IEEE80211_CH_PASSIVE_ONLY},
11044                {5260, 52, IEEE80211_CH_PASSIVE_ONLY},
11045                {5280, 56, IEEE80211_CH_PASSIVE_ONLY},
11046                {5300, 60, IEEE80211_CH_PASSIVE_ONLY},
11047                {5320, 64, IEEE80211_CH_PASSIVE_ONLY},
11048                {5745, 149, IEEE80211_CH_PASSIVE_ONLY},
11049                {5765, 153, IEEE80211_CH_PASSIVE_ONLY},
11050                {5785, 157, IEEE80211_CH_PASSIVE_ONLY},
11051                {5805, 161, IEEE80211_CH_PASSIVE_ONLY},
11052                {5825, 165, IEEE80211_CH_PASSIVE_ONLY}},
11053          }
11054 };
11055
11056 /* GEO code borrowed from ieee80211_geo.c */
11057 static int ipw_is_valid_channel(struct ieee80211_device *ieee, u8 channel)
11058 {
11059         int i;
11060
11061         /* Driver needs to initialize the geography map before using
11062          * these helper functions */
11063         BUG_ON(ieee->geo.bg_channels == 0 && ieee->geo.a_channels == 0);
11064
11065         if (ieee->freq_band & IEEE80211_24GHZ_BAND)
11066                 for (i = 0; i < ieee->geo.bg_channels; i++)
11067                         /* NOTE: If G mode is currently supported but
11068                          * this is a B only channel, we don't see it
11069                          * as valid. */
11070                         if ((ieee->geo.bg[i].channel == channel) &&
11071                             (!(ieee->mode & IEEE_G) ||
11072                              !(ieee->geo.bg[i].flags & IEEE80211_CH_B_ONLY)))
11073                                 return IEEE80211_24GHZ_BAND;
11074
11075         if (ieee->freq_band & IEEE80211_52GHZ_BAND)
11076                 for (i = 0; i < ieee->geo.a_channels; i++)
11077                         if (ieee->geo.a[i].channel == channel)
11078                                 return IEEE80211_52GHZ_BAND;
11079
11080         return 0;
11081 }
11082
11083 static int ipw_channel_to_index(struct ieee80211_device *ieee, u8 channel)
11084 {
11085         int i;
11086
11087         /* Driver needs to initialize the geography map before using
11088          * these helper functions */
11089         BUG_ON(ieee->geo.bg_channels == 0 && ieee->geo.a_channels == 0);
11090
11091         if (ieee->freq_band & IEEE80211_24GHZ_BAND)
11092                 for (i = 0; i < ieee->geo.bg_channels; i++)
11093                         if (ieee->geo.bg[i].channel == channel)
11094                                 return i;
11095
11096         if (ieee->freq_band & IEEE80211_52GHZ_BAND)
11097                 for (i = 0; i < ieee->geo.a_channels; i++)
11098                         if (ieee->geo.a[i].channel == channel)
11099                                 return i;
11100
11101         return -1;
11102 }
11103
11104 static u8 ipw_freq_to_channel(struct ieee80211_device *ieee, u32 freq)
11105 {
11106         int i;
11107
11108         /* Driver needs to initialize the geography map before using
11109          * these helper functions */
11110         BUG_ON(ieee->geo.bg_channels == 0 && ieee->geo.a_channels == 0);
11111
11112         freq /= 100000;
11113
11114         if (ieee->freq_band & IEEE80211_24GHZ_BAND)
11115                 for (i = 0; i < ieee->geo.bg_channels; i++)
11116                         if (ieee->geo.bg[i].freq == freq)
11117                                 return ieee->geo.bg[i].channel;
11118
11119         if (ieee->freq_band & IEEE80211_52GHZ_BAND)
11120                 for (i = 0; i < ieee->geo.a_channels; i++)
11121                         if (ieee->geo.a[i].freq == freq)
11122                                 return ieee->geo.a[i].channel;
11123
11124         return 0;
11125 }
11126
11127 static int ipw_set_geo(struct ieee80211_device *ieee,
11128                        const struct ieee80211_geo *geo)
11129 {
11130         memcpy(ieee->geo.name, geo->name, 3);
11131         ieee->geo.name[3] = '\0';
11132         ieee->geo.bg_channels = geo->bg_channels;
11133         ieee->geo.a_channels = geo->a_channels;
11134         memcpy(ieee->geo.bg, geo->bg, geo->bg_channels *
11135                sizeof(struct ieee80211_channel));
11136         memcpy(ieee->geo.a, geo->a, ieee->geo.a_channels *
11137                sizeof(struct ieee80211_channel));
11138         return 0;
11139 }
11140
11141 static const struct ieee80211_geo *ipw_get_geo(struct ieee80211_device *ieee)
11142 {
11143         return &ieee->geo;
11144 }
11145
11146 #define MAX_HW_RESTARTS 5
11147 static int ipw_up(struct ipw_priv *priv)
11148 {
11149         int rc, i, j;
11150
11151         if (priv->status & STATUS_EXIT_PENDING)
11152                 return -EIO;
11153
11154         if (cmdlog && !priv->cmdlog) {
11155                 priv->cmdlog = kmalloc(sizeof(*priv->cmdlog) * cmdlog,
11156                                        GFP_KERNEL);
11157                 if (priv->cmdlog == NULL) {
11158                         IPW_ERROR("Error allocating %d command log entries.\n",
11159                                   cmdlog);
11160                 } else {
11161                         memset(priv->cmdlog, 0, sizeof(*priv->cmdlog) * cmdlog);
11162                         priv->cmdlog_len = cmdlog;
11163                 }
11164         }
11165
11166         for (i = 0; i < MAX_HW_RESTARTS; i++) {
11167                 /* Load the microcode, firmware, and eeprom.
11168                  * Also start the clocks. */
11169                 rc = ipw_load(priv);
11170                 if (rc) {
11171                         IPW_ERROR("Unable to load firmware: %d\n", rc);
11172                         return rc;
11173                 }
11174
11175                 ipw_init_ordinals(priv);
11176                 if (!(priv->config & CFG_CUSTOM_MAC))
11177                         eeprom_parse_mac(priv, priv->mac_addr);
11178                 memcpy(priv->net_dev->dev_addr, priv->mac_addr, ETH_ALEN);
11179
11180                 for (j = 0; j < ARRAY_SIZE(ipw_geos); j++) {
11181                         if (!memcmp(&priv->eeprom[EEPROM_COUNTRY_CODE],
11182                                     ipw_geos[j].name, 3))
11183                                 break;
11184                 }
11185                 if (j == ARRAY_SIZE(ipw_geos))
11186                         j = 0;
11187                 if (ipw_set_geo(priv->ieee, &ipw_geos[j])) {
11188                         IPW_WARNING("Could not set geography.");
11189                         return 0;
11190                 }
11191
11192                 IPW_DEBUG_INFO("Geography %03d [%s] detected.\n",
11193                                j, priv->ieee->geo.name);
11194
11195                 if (priv->status & STATUS_RF_KILL_SW) {
11196                         IPW_WARNING("Radio disabled by module parameter.\n");
11197                         return 0;
11198                 } else if (rf_kill_active(priv)) {
11199                         IPW_WARNING("Radio Frequency Kill Switch is On:\n"
11200                                     "Kill switch must be turned off for "
11201                                     "wireless networking to work.\n");
11202                         queue_delayed_work(priv->workqueue, &priv->rf_kill,
11203                                            2 * HZ);
11204                         return 0;
11205                 }
11206
11207                 rc = ipw_config(priv);
11208                 if (!rc) {
11209                         IPW_DEBUG_INFO("Configured device on count %i\n", i);
11210
11211                         /* If configure to try and auto-associate, kick
11212                          * off a scan. */
11213                         queue_work(priv->workqueue, &priv->request_scan);
11214
11215                         return 0;
11216                 }
11217
11218                 IPW_DEBUG_INFO("Device configuration failed: 0x%08X\n", rc);
11219                 IPW_DEBUG_INFO("Failed to config device on retry %d of %d\n",
11220                                i, MAX_HW_RESTARTS);
11221
11222                 /* We had an error bringing up the hardware, so take it
11223                  * all the way back down so we can try again */
11224                 ipw_down(priv);
11225         }
11226
11227         /* tried to restart and config the device for as long as our
11228          * patience could withstand */
11229         IPW_ERROR("Unable to initialize device after %d attempts.\n", i);
11230
11231         return -EIO;
11232 }
11233
11234 static void ipw_bg_up(void *data)
11235 {
11236         struct ipw_priv *priv = data;
11237         down(&priv->sem);
11238         ipw_up(data);
11239         up(&priv->sem);
11240 }
11241
11242 static void ipw_deinit(struct ipw_priv *priv)
11243 {
11244         int i;
11245
11246         if (priv->status & STATUS_SCANNING) {
11247                 IPW_DEBUG_INFO("Aborting scan during shutdown.\n");
11248                 ipw_abort_scan(priv);
11249         }
11250
11251         if (priv->status & STATUS_ASSOCIATED) {
11252                 IPW_DEBUG_INFO("Disassociating during shutdown.\n");
11253                 ipw_disassociate(priv);
11254         }
11255
11256         ipw_led_shutdown(priv);
11257
11258         /* Wait up to 1s for status to change to not scanning and not
11259          * associated (disassociation can take a while for a ful 802.11
11260          * exchange */
11261         for (i = 1000; i && (priv->status &
11262                              (STATUS_DISASSOCIATING |
11263                               STATUS_ASSOCIATED | STATUS_SCANNING)); i--)
11264                 udelay(10);
11265
11266         if (priv->status & (STATUS_DISASSOCIATING |
11267                             STATUS_ASSOCIATED | STATUS_SCANNING))
11268                 IPW_DEBUG_INFO("Still associated or scanning...\n");
11269         else
11270                 IPW_DEBUG_INFO("Took %dms to de-init\n", 1000 - i);
11271
11272         /* Attempt to disable the card */
11273         ipw_send_card_disable(priv, 0);
11274
11275         priv->status &= ~STATUS_INIT;
11276 }
11277
11278 static void ipw_down(struct ipw_priv *priv)
11279 {
11280         int exit_pending = priv->status & STATUS_EXIT_PENDING;
11281
11282         priv->status |= STATUS_EXIT_PENDING;
11283
11284         if (ipw_is_init(priv))
11285                 ipw_deinit(priv);
11286
11287         /* Wipe out the EXIT_PENDING status bit if we are not actually
11288          * exiting the module */
11289         if (!exit_pending)
11290                 priv->status &= ~STATUS_EXIT_PENDING;
11291
11292         /* tell the device to stop sending interrupts */
11293         ipw_disable_interrupts(priv);
11294
11295         /* Clear all bits but the RF Kill */
11296         priv->status &= STATUS_RF_KILL_MASK | STATUS_EXIT_PENDING;
11297         netif_carrier_off(priv->net_dev);
11298         netif_stop_queue(priv->net_dev);
11299
11300         ipw_stop_nic(priv);
11301
11302         ipw_led_radio_off(priv);
11303 }
11304
11305 static void ipw_bg_down(void *data)
11306 {
11307         struct ipw_priv *priv = data;
11308         down(&priv->sem);
11309         ipw_down(data);
11310         up(&priv->sem);
11311 }
11312
11313 #if WIRELESS_EXT < 18
11314 static int ipw_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
11315 {
11316         struct iwreq *wrq = (struct iwreq *)rq;
11317         int ret = -1;
11318         switch (cmd) {
11319         case IPW_IOCTL_WPA_SUPPLICANT:
11320                 ret = ipw_wpa_supplicant(dev, &wrq->u.data);
11321                 return ret;
11322
11323         default:
11324                 return -EOPNOTSUPP;
11325         }
11326
11327         return -EOPNOTSUPP;
11328 }
11329 #endif
11330
11331 /* Called by register_netdev() */
11332 static int ipw_net_init(struct net_device *dev)
11333 {
11334         struct ipw_priv *priv = ieee80211_priv(dev);
11335         down(&priv->sem);
11336
11337         if (ipw_up(priv)) {
11338                 up(&priv->sem);
11339                 return -EIO;
11340         }
11341
11342         up(&priv->sem);
11343         return 0;
11344 }
11345
11346 /* PCI driver stuff */
11347 static struct pci_device_id card_ids[] = {
11348         {PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, 0x2701, 0, 0, 0},
11349         {PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, 0x2702, 0, 0, 0},
11350         {PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, 0x2711, 0, 0, 0},
11351         {PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, 0x2712, 0, 0, 0},
11352         {PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, 0x2721, 0, 0, 0},
11353         {PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, 0x2722, 0, 0, 0},
11354         {PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, 0x2731, 0, 0, 0},
11355         {PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, 0x2732, 0, 0, 0},
11356         {PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, 0x2741, 0, 0, 0},
11357         {PCI_VENDOR_ID_INTEL, 0x1043, 0x103c, 0x2741, 0, 0, 0},
11358         {PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, 0x2742, 0, 0, 0},
11359         {PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, 0x2751, 0, 0, 0},
11360         {PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, 0x2752, 0, 0, 0},
11361         {PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, 0x2753, 0, 0, 0},
11362         {PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, 0x2754, 0, 0, 0},
11363         {PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, 0x2761, 0, 0, 0},
11364         {PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, 0x2762, 0, 0, 0},
11365         {PCI_VENDOR_ID_INTEL, 0x104f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
11366         {PCI_VENDOR_ID_INTEL, 0x4220, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, /* BG */
11367         {PCI_VENDOR_ID_INTEL, 0x4221, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, /* BG */
11368         {PCI_VENDOR_ID_INTEL, 0x4223, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, /* ABG */
11369         {PCI_VENDOR_ID_INTEL, 0x4224, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, /* ABG */
11370
11371         /* required last entry */
11372         {0,}
11373 };
11374
11375 MODULE_DEVICE_TABLE(pci, card_ids);
11376
11377 static struct attribute *ipw_sysfs_entries[] = {
11378         &dev_attr_rf_kill.attr,
11379         &dev_attr_direct_dword.attr,
11380         &dev_attr_indirect_byte.attr,
11381         &dev_attr_indirect_dword.attr,
11382         &dev_attr_mem_gpio_reg.attr,
11383         &dev_attr_command_event_reg.attr,
11384         &dev_attr_nic_type.attr,
11385         &dev_attr_status.attr,
11386         &dev_attr_cfg.attr,
11387         &dev_attr_error.attr,
11388         &dev_attr_event_log.attr,
11389         &dev_attr_cmd_log.attr,
11390         &dev_attr_eeprom_delay.attr,
11391         &dev_attr_ucode_version.attr,
11392         &dev_attr_rtc.attr,
11393         &dev_attr_scan_age.attr,
11394         &dev_attr_led.attr,
11395         &dev_attr_speed_scan.attr,
11396         &dev_attr_net_stats.attr,
11397         NULL
11398 };
11399
11400 static struct attribute_group ipw_attribute_group = {
11401         .name = NULL,           /* put in device directory */
11402         .attrs = ipw_sysfs_entries,
11403 };
11404
11405 static int ipw_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
11406 {
11407         int err = 0;
11408         struct net_device *net_dev;
11409         void __iomem *base;
11410         u32 length, val;
11411         struct ipw_priv *priv;
11412         int i;
11413
11414         net_dev = alloc_ieee80211(sizeof(struct ipw_priv));
11415         if (net_dev == NULL) {
11416                 err = -ENOMEM;
11417                 goto out;
11418         }
11419
11420         priv = ieee80211_priv(net_dev);
11421         priv->ieee = netdev_priv(net_dev);
11422
11423         priv->net_dev = net_dev;
11424         priv->pci_dev = pdev;
11425 #ifdef CONFIG_IPW_DEBUG
11426         ipw_debug_level = debug;
11427 #endif
11428         spin_lock_init(&priv->lock);
11429         for (i = 0; i < IPW_IBSS_MAC_HASH_SIZE; i++)
11430                 INIT_LIST_HEAD(&priv->ibss_mac_hash[i]);
11431
11432         init_MUTEX(&priv->sem);
11433         if (pci_enable_device(pdev)) {
11434                 err = -ENODEV;
11435                 goto out_free_ieee80211;
11436         }
11437
11438         pci_set_master(pdev);
11439
11440         err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
11441         if (!err)
11442                 err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
11443         if (err) {
11444                 printk(KERN_WARNING DRV_NAME ": No suitable DMA available.\n");
11445                 goto out_pci_disable_device;
11446         }
11447
11448         pci_set_drvdata(pdev, priv);
11449
11450         err = pci_request_regions(pdev, DRV_NAME);
11451         if (err)
11452                 goto out_pci_disable_device;
11453
11454         /* We disable the RETRY_TIMEOUT register (0x41) to keep
11455          * PCI Tx retries from interfering with C3 CPU state */
11456         pci_read_config_dword(pdev, 0x40, &val);
11457         if ((val & 0x0000ff00) != 0)
11458                 pci_write_config_dword(pdev, 0x40, val & 0xffff00ff);
11459
11460         length = pci_resource_len(pdev, 0);
11461         priv->hw_len = length;
11462
11463         base = ioremap_nocache(pci_resource_start(pdev, 0), length);
11464         if (!base) {
11465                 err = -ENODEV;
11466                 goto out_pci_release_regions;
11467         }
11468
11469         priv->hw_base = base;
11470         IPW_DEBUG_INFO("pci_resource_len = 0x%08x\n", length);
11471         IPW_DEBUG_INFO("pci_resource_base = %p\n", base);
11472
11473         err = ipw_setup_deferred_work(priv);
11474         if (err) {
11475                 IPW_ERROR("Unable to setup deferred work\n");
11476                 goto out_iounmap;
11477         }
11478
11479         ipw_sw_reset(priv, 1);
11480
11481         err = request_irq(pdev->irq, ipw_isr, SA_SHIRQ, DRV_NAME, priv);
11482         if (err) {
11483                 IPW_ERROR("Error allocating IRQ %d\n", pdev->irq);
11484                 goto out_destroy_workqueue;
11485         }
11486
11487         SET_MODULE_OWNER(net_dev);
11488         SET_NETDEV_DEV(net_dev, &pdev->dev);
11489
11490         ipw_wx_data.spy_data = &priv->ieee->spy_data;
11491         ipw_wx_data.ieee80211 = priv->ieee;
11492
11493         down(&priv->sem);
11494
11495         priv->ieee->hard_start_xmit = ipw_net_hard_start_xmit;
11496         priv->ieee->set_security = shim__set_security;
11497         priv->ieee->is_queue_full = ipw_net_is_queue_full;
11498
11499 #ifdef CONFIG_IPW_QOS
11500         priv->ieee->handle_probe_response = ipw_handle_beacon;
11501         priv->ieee->handle_beacon = ipw_handle_probe_response;
11502         priv->ieee->handle_assoc_response = ipw_handle_assoc_response;
11503 #endif                          /* CONFIG_IPW_QOS */
11504
11505         priv->ieee->perfect_rssi = -20;
11506         priv->ieee->worst_rssi = -85;
11507
11508         net_dev->open = ipw_net_open;
11509         net_dev->stop = ipw_net_stop;
11510         net_dev->init = ipw_net_init;
11511 #if WIRELESS_EXT < 18
11512         net_dev->do_ioctl = ipw_ioctl;
11513 #endif
11514         net_dev->get_stats = ipw_net_get_stats;
11515         net_dev->set_multicast_list = ipw_net_set_multicast_list;
11516         net_dev->set_mac_address = ipw_net_set_mac_address;
11517         net_dev->get_wireless_stats = ipw_get_wireless_stats;
11518         net_dev->wireless_data = &ipw_wx_data;
11519         net_dev->wireless_handlers = &ipw_wx_handler_def;
11520         net_dev->ethtool_ops = &ipw_ethtool_ops;
11521         net_dev->irq = pdev->irq;
11522         net_dev->base_addr = (unsigned long)priv->hw_base;
11523         net_dev->mem_start = pci_resource_start(pdev, 0);
11524         net_dev->mem_end = net_dev->mem_start + pci_resource_len(pdev, 0) - 1;
11525
11526         err = sysfs_create_group(&pdev->dev.kobj, &ipw_attribute_group);
11527         if (err) {
11528                 IPW_ERROR("failed to create sysfs device attributes\n");
11529                 up(&priv->sem);
11530                 goto out_release_irq;
11531         }
11532
11533         up(&priv->sem);
11534         err = register_netdev(net_dev);
11535         if (err) {
11536                 IPW_ERROR("failed to register network device\n");
11537                 goto out_remove_sysfs;
11538         }
11539         return 0;
11540
11541       out_remove_sysfs:
11542         sysfs_remove_group(&pdev->dev.kobj, &ipw_attribute_group);
11543       out_release_irq:
11544         free_irq(pdev->irq, priv);
11545       out_destroy_workqueue:
11546         destroy_workqueue(priv->workqueue);
11547         priv->workqueue = NULL;
11548       out_iounmap:
11549         iounmap(priv->hw_base);
11550       out_pci_release_regions:
11551         pci_release_regions(pdev);
11552       out_pci_disable_device:
11553         pci_disable_device(pdev);
11554         pci_set_drvdata(pdev, NULL);
11555       out_free_ieee80211:
11556         free_ieee80211(priv->net_dev);
11557       out:
11558         return err;
11559 }
11560
11561 static void ipw_pci_remove(struct pci_dev *pdev)
11562 {
11563         struct ipw_priv *priv = pci_get_drvdata(pdev);
11564         struct list_head *p, *q;
11565         int i;
11566
11567         if (!priv)
11568                 return;
11569
11570         down(&priv->sem);
11571
11572         priv->status |= STATUS_EXIT_PENDING;
11573         ipw_down(priv);
11574         sysfs_remove_group(&pdev->dev.kobj, &ipw_attribute_group);
11575
11576         up(&priv->sem);
11577
11578         unregister_netdev(priv->net_dev);
11579
11580         if (priv->rxq) {
11581                 ipw_rx_queue_free(priv, priv->rxq);
11582                 priv->rxq = NULL;
11583         }
11584         ipw_tx_queue_free(priv);
11585
11586         if (priv->cmdlog) {
11587                 kfree(priv->cmdlog);
11588                 priv->cmdlog = NULL;
11589         }
11590         /* ipw_down will ensure that there is no more pending work
11591          * in the workqueue's, so we can safely remove them now. */
11592         cancel_delayed_work(&priv->adhoc_check);
11593         cancel_delayed_work(&priv->gather_stats);
11594         cancel_delayed_work(&priv->request_scan);
11595         cancel_delayed_work(&priv->rf_kill);
11596         cancel_delayed_work(&priv->scan_check);
11597         destroy_workqueue(priv->workqueue);
11598         priv->workqueue = NULL;
11599
11600         /* Free MAC hash list for ADHOC */
11601         for (i = 0; i < IPW_IBSS_MAC_HASH_SIZE; i++) {
11602                 list_for_each_safe(p, q, &priv->ibss_mac_hash[i]) {
11603                         kfree(list_entry(p, struct ipw_ibss_seq, list));
11604                         list_del(p);
11605                 }
11606         }
11607
11608         if (priv->error) {
11609                 ipw_free_error_log(priv->error);
11610                 priv->error = NULL;
11611         }
11612
11613         free_irq(pdev->irq, priv);
11614         iounmap(priv->hw_base);
11615         pci_release_regions(pdev);
11616         pci_disable_device(pdev);
11617         pci_set_drvdata(pdev, NULL);
11618         free_ieee80211(priv->net_dev);
11619         free_firmware();
11620 }
11621
11622 #ifdef CONFIG_PM
11623 static int ipw_pci_suspend(struct pci_dev *pdev, pm_message_t state)
11624 {
11625         struct ipw_priv *priv = pci_get_drvdata(pdev);
11626         struct net_device *dev = priv->net_dev;
11627
11628         printk(KERN_INFO "%s: Going into suspend...\n", dev->name);
11629
11630         /* Take down the device; powers it off, etc. */
11631         ipw_down(priv);
11632
11633         /* Remove the PRESENT state of the device */
11634         netif_device_detach(dev);
11635
11636         pci_save_state(pdev);
11637         pci_disable_device(pdev);
11638         pci_set_power_state(pdev, pci_choose_state(pdev, state));
11639
11640         return 0;
11641 }
11642
11643 static int ipw_pci_resume(struct pci_dev *pdev)
11644 {
11645         struct ipw_priv *priv = pci_get_drvdata(pdev);
11646         struct net_device *dev = priv->net_dev;
11647         u32 val;
11648
11649         printk(KERN_INFO "%s: Coming out of suspend...\n", dev->name);
11650
11651         pci_set_power_state(pdev, PCI_D0);
11652         pci_enable_device(pdev);
11653         pci_restore_state(pdev);
11654
11655         /*
11656          * Suspend/Resume resets the PCI configuration space, so we have to
11657          * re-disable the RETRY_TIMEOUT register (0x41) to keep PCI Tx retries
11658          * from interfering with C3 CPU state. pci_restore_state won't help
11659          * here since it only restores the first 64 bytes pci config header.
11660          */
11661         pci_read_config_dword(pdev, 0x40, &val);
11662         if ((val & 0x0000ff00) != 0)
11663                 pci_write_config_dword(pdev, 0x40, val & 0xffff00ff);
11664
11665         /* Set the device back into the PRESENT state; this will also wake
11666          * the queue of needed */
11667         netif_device_attach(dev);
11668
11669         /* Bring the device back up */
11670         queue_work(priv->workqueue, &priv->up);
11671
11672         return 0;
11673 }
11674 #endif
11675
11676 /* driver initialization stuff */
11677 static struct pci_driver ipw_driver = {
11678         .name = DRV_NAME,
11679         .id_table = card_ids,
11680         .probe = ipw_pci_probe,
11681         .remove = __devexit_p(ipw_pci_remove),
11682 #ifdef CONFIG_PM
11683         .suspend = ipw_pci_suspend,
11684         .resume = ipw_pci_resume,
11685 #endif
11686 };
11687
11688 static int __init ipw_init(void)
11689 {
11690         int ret;
11691
11692         printk(KERN_INFO DRV_NAME ": " DRV_DESCRIPTION ", " DRV_VERSION "\n");
11693         printk(KERN_INFO DRV_NAME ": " DRV_COPYRIGHT "\n");
11694
11695         ret = pci_module_init(&ipw_driver);
11696         if (ret) {
11697                 IPW_ERROR("Unable to initialize PCI module\n");
11698                 return ret;
11699         }
11700
11701         ret = driver_create_file(&ipw_driver.driver, &driver_attr_debug_level);
11702         if (ret) {
11703                 IPW_ERROR("Unable to create driver sysfs file\n");
11704                 pci_unregister_driver(&ipw_driver);
11705                 return ret;
11706         }
11707
11708         return ret;
11709 }
11710
11711 static void __exit ipw_exit(void)
11712 {
11713         driver_remove_file(&ipw_driver.driver, &driver_attr_debug_level);
11714         pci_unregister_driver(&ipw_driver);
11715 }
11716
11717 module_param(disable, int, 0444);
11718 MODULE_PARM_DESC(disable, "manually disable the radio (default 0 [radio on])");
11719
11720 module_param(associate, int, 0444);
11721 MODULE_PARM_DESC(associate, "auto associate when scanning (default on)");
11722
11723 module_param(auto_create, int, 0444);
11724 MODULE_PARM_DESC(auto_create, "auto create adhoc network (default on)");
11725
11726 module_param(led, int, 0444);
11727 MODULE_PARM_DESC(led, "enable led control on some systems (default 0 off)\n");
11728
11729 module_param(debug, int, 0444);
11730 MODULE_PARM_DESC(debug, "debug output mask");
11731
11732 module_param(channel, int, 0444);
11733 MODULE_PARM_DESC(channel, "channel to limit associate to (default 0 [ANY])");
11734
11735 #ifdef CONFIG_IPW_QOS
11736 module_param(qos_enable, int, 0444);
11737 MODULE_PARM_DESC(qos_enable, "enable all QoS functionalitis");
11738
11739 module_param(qos_burst_enable, int, 0444);
11740 MODULE_PARM_DESC(qos_burst_enable, "enable QoS burst mode");
11741
11742 module_param(qos_no_ack_mask, int, 0444);
11743 MODULE_PARM_DESC(qos_no_ack_mask, "mask Tx_Queue to no ack");
11744
11745 module_param(burst_duration_CCK, int, 0444);
11746 MODULE_PARM_DESC(burst_duration_CCK, "set CCK burst value");
11747
11748 module_param(burst_duration_OFDM, int, 0444);
11749 MODULE_PARM_DESC(burst_duration_OFDM, "set OFDM burst value");
11750 #endif                          /* CONFIG_IPW_QOS */
11751
11752 #ifdef CONFIG_IPW2200_MONITOR
11753 module_param(mode, int, 0444);
11754 MODULE_PARM_DESC(mode, "network mode (0=BSS,1=IBSS,2=Monitor)");
11755 #else
11756 module_param(mode, int, 0444);
11757 MODULE_PARM_DESC(mode, "network mode (0=BSS,1=IBSS)");
11758 #endif
11759
11760 module_param(hwcrypto, int, 0444);
11761 MODULE_PARM_DESC(hwcrypto, "enable hardware crypto (default on)");
11762
11763 module_param(cmdlog, int, 0444);
11764 MODULE_PARM_DESC(cmdlog,
11765                  "allocate a ring buffer for logging firmware commands");
11766
11767 module_exit(ipw_exit);
11768 module_init(ipw_init);