1 // SPDX-License-Identifier: GPL-2.0-only
2 /******************************************************************************
4 Copyright(c) 2003 - 2006 Intel Corporation. All rights reserved.
6 802.11 status code portion of this file from ethereal-0.10.6:
7 Copyright 2000, Axis Communications AB
8 Ethereal - Network traffic analyzer
9 By Gerald Combs <gerald@ethereal.com>
10 Copyright 1998 Gerald Combs
14 Intel Linux Wireless <ilw@linux.intel.com>
15 Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
17 ******************************************************************************/
19 #include <linux/sched.h>
20 #include <linux/slab.h>
21 #include <net/cfg80211-wext.h>
32 #ifdef CONFIG_IPW2200_DEBUG
38 #ifdef CONFIG_IPW2200_MONITOR
44 #ifdef CONFIG_IPW2200_PROMISCUOUS
50 #ifdef CONFIG_IPW2200_RADIOTAP
56 #ifdef CONFIG_IPW2200_QOS
62 #define IPW2200_VERSION "1.2.2" VK VD VM VP VR VQ
63 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2200/2915 Network Driver"
64 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
65 #define DRV_VERSION IPW2200_VERSION
67 #define ETH_P_80211_STATS (ETH_P_80211_RAW + 1)
69 MODULE_DESCRIPTION(DRV_DESCRIPTION
);
70 MODULE_VERSION(DRV_VERSION
);
71 MODULE_AUTHOR(DRV_COPYRIGHT
);
72 MODULE_LICENSE("GPL");
73 MODULE_FIRMWARE("ipw2200-ibss.fw");
74 #ifdef CONFIG_IPW2200_MONITOR
75 MODULE_FIRMWARE("ipw2200-sniffer.fw");
77 MODULE_FIRMWARE("ipw2200-bss.fw");
79 static int cmdlog
= 0;
81 static int default_channel
= 0;
82 static int network_mode
= 0;
84 static u32 ipw_debug_level
;
86 static int auto_create
= 1;
87 static int led_support
= 1;
88 static int disable
= 0;
89 static int bt_coexist
= 0;
90 static int hwcrypto
= 0;
91 static int roaming
= 1;
92 static const char ipw_modes
[] = {
95 static int antenna
= CFG_SYS_ANTENNA_BOTH
;
97 #ifdef CONFIG_IPW2200_PROMISCUOUS
98 static int rtap_iface
= 0; /* def: 0 -- do not create rtap interface */
101 static struct ieee80211_rate ipw2200_rates
[] = {
103 { .bitrate
= 20, .flags
= IEEE80211_RATE_SHORT_PREAMBLE
},
104 { .bitrate
= 55, .flags
= IEEE80211_RATE_SHORT_PREAMBLE
},
105 { .bitrate
= 110, .flags
= IEEE80211_RATE_SHORT_PREAMBLE
},
116 #define ipw2200_a_rates (ipw2200_rates + 4)
117 #define ipw2200_num_a_rates 8
118 #define ipw2200_bg_rates (ipw2200_rates + 0)
119 #define ipw2200_num_bg_rates 12
121 /* Ugly macro to convert literal channel numbers into their mhz equivalents
122 * There are certianly some conditions that will break this (like feeding it '30')
123 * but they shouldn't arise since nothing talks on channel 30. */
124 #define ieee80211chan2mhz(x) \
126 (((x) == 14) ? 2484 : ((x) * 5) + 2407) : \
129 #ifdef CONFIG_IPW2200_QOS
130 static int qos_enable
= 0;
131 static int qos_burst_enable
= 0;
132 static int qos_no_ack_mask
= 0;
133 static int burst_duration_CCK
= 0;
134 static int burst_duration_OFDM
= 0;
136 static struct libipw_qos_parameters def_qos_parameters_OFDM
= {
137 {QOS_TX0_CW_MIN_OFDM
, QOS_TX1_CW_MIN_OFDM
, QOS_TX2_CW_MIN_OFDM
,
138 QOS_TX3_CW_MIN_OFDM
},
139 {QOS_TX0_CW_MAX_OFDM
, QOS_TX1_CW_MAX_OFDM
, QOS_TX2_CW_MAX_OFDM
,
140 QOS_TX3_CW_MAX_OFDM
},
141 {QOS_TX0_AIFS
, QOS_TX1_AIFS
, QOS_TX2_AIFS
, QOS_TX3_AIFS
},
142 {QOS_TX0_ACM
, QOS_TX1_ACM
, QOS_TX2_ACM
, QOS_TX3_ACM
},
143 {QOS_TX0_TXOP_LIMIT_OFDM
, QOS_TX1_TXOP_LIMIT_OFDM
,
144 QOS_TX2_TXOP_LIMIT_OFDM
, QOS_TX3_TXOP_LIMIT_OFDM
}
147 static struct libipw_qos_parameters def_qos_parameters_CCK
= {
148 {QOS_TX0_CW_MIN_CCK
, QOS_TX1_CW_MIN_CCK
, QOS_TX2_CW_MIN_CCK
,
150 {QOS_TX0_CW_MAX_CCK
, QOS_TX1_CW_MAX_CCK
, QOS_TX2_CW_MAX_CCK
,
152 {QOS_TX0_AIFS
, QOS_TX1_AIFS
, QOS_TX2_AIFS
, QOS_TX3_AIFS
},
153 {QOS_TX0_ACM
, QOS_TX1_ACM
, QOS_TX2_ACM
, QOS_TX3_ACM
},
154 {QOS_TX0_TXOP_LIMIT_CCK
, QOS_TX1_TXOP_LIMIT_CCK
, QOS_TX2_TXOP_LIMIT_CCK
,
155 QOS_TX3_TXOP_LIMIT_CCK
}
158 static struct libipw_qos_parameters def_parameters_OFDM
= {
159 {DEF_TX0_CW_MIN_OFDM
, DEF_TX1_CW_MIN_OFDM
, DEF_TX2_CW_MIN_OFDM
,
160 DEF_TX3_CW_MIN_OFDM
},
161 {DEF_TX0_CW_MAX_OFDM
, DEF_TX1_CW_MAX_OFDM
, DEF_TX2_CW_MAX_OFDM
,
162 DEF_TX3_CW_MAX_OFDM
},
163 {DEF_TX0_AIFS
, DEF_TX1_AIFS
, DEF_TX2_AIFS
, DEF_TX3_AIFS
},
164 {DEF_TX0_ACM
, DEF_TX1_ACM
, DEF_TX2_ACM
, DEF_TX3_ACM
},
165 {DEF_TX0_TXOP_LIMIT_OFDM
, DEF_TX1_TXOP_LIMIT_OFDM
,
166 DEF_TX2_TXOP_LIMIT_OFDM
, DEF_TX3_TXOP_LIMIT_OFDM
}
169 static struct libipw_qos_parameters def_parameters_CCK
= {
170 {DEF_TX0_CW_MIN_CCK
, DEF_TX1_CW_MIN_CCK
, DEF_TX2_CW_MIN_CCK
,
172 {DEF_TX0_CW_MAX_CCK
, DEF_TX1_CW_MAX_CCK
, DEF_TX2_CW_MAX_CCK
,
174 {DEF_TX0_AIFS
, DEF_TX1_AIFS
, DEF_TX2_AIFS
, DEF_TX3_AIFS
},
175 {DEF_TX0_ACM
, DEF_TX1_ACM
, DEF_TX2_ACM
, DEF_TX3_ACM
},
176 {DEF_TX0_TXOP_LIMIT_CCK
, DEF_TX1_TXOP_LIMIT_CCK
, DEF_TX2_TXOP_LIMIT_CCK
,
177 DEF_TX3_TXOP_LIMIT_CCK
}
180 static u8 qos_oui
[QOS_OUI_LEN
] = { 0x00, 0x50, 0xF2 };
182 static int from_priority_to_tx_queue
[] = {
183 IPW_TX_QUEUE_1
, IPW_TX_QUEUE_2
, IPW_TX_QUEUE_2
, IPW_TX_QUEUE_1
,
184 IPW_TX_QUEUE_3
, IPW_TX_QUEUE_3
, IPW_TX_QUEUE_4
, IPW_TX_QUEUE_4
187 static u32
ipw_qos_get_burst_duration(struct ipw_priv
*priv
);
189 static int ipw_send_qos_params_command(struct ipw_priv
*priv
, struct libipw_qos_parameters
191 static int ipw_send_qos_info_command(struct ipw_priv
*priv
, struct libipw_qos_information_element
193 #endif /* CONFIG_IPW2200_QOS */
195 static struct iw_statistics
*ipw_get_wireless_stats(struct net_device
*dev
);
196 static void ipw_remove_current_network(struct ipw_priv
*priv
);
197 static void ipw_rx(struct ipw_priv
*priv
);
198 static int ipw_queue_tx_reclaim(struct ipw_priv
*priv
,
199 struct clx2_tx_queue
*txq
, int qindex
);
200 static int ipw_queue_reset(struct ipw_priv
*priv
);
202 static int ipw_queue_tx_hcmd(struct ipw_priv
*priv
, int hcmd
, void *buf
,
205 static void ipw_tx_queue_free(struct ipw_priv
*);
207 static struct ipw_rx_queue
*ipw_rx_queue_alloc(struct ipw_priv
*);
208 static void ipw_rx_queue_free(struct ipw_priv
*, struct ipw_rx_queue
*);
209 static void ipw_rx_queue_replenish(void *);
210 static int ipw_up(struct ipw_priv
*);
211 static void ipw_bg_up(struct work_struct
*work
);
212 static void ipw_down(struct ipw_priv
*);
213 static void ipw_bg_down(struct work_struct
*work
);
214 static int ipw_config(struct ipw_priv
*);
215 static int init_supported_rates(struct ipw_priv
*priv
,
216 struct ipw_supported_rates
*prates
);
217 static void ipw_set_hwcrypto_keys(struct ipw_priv
*);
218 static void ipw_send_wep_keys(struct ipw_priv
*, int);
220 static int snprint_line(char *buf
, size_t count
,
221 const u8
* data
, u32 len
, u32 ofs
)
226 out
= scnprintf(buf
, count
, "%08X", ofs
);
228 for (l
= 0, i
= 0; i
< 2; i
++) {
229 out
+= scnprintf(buf
+ out
, count
- out
, " ");
230 for (j
= 0; j
< 8 && l
< len
; j
++, l
++)
231 out
+= scnprintf(buf
+ out
, count
- out
, "%02X ",
234 out
+= scnprintf(buf
+ out
, count
- out
, " ");
237 out
+= scnprintf(buf
+ out
, count
- out
, " ");
238 for (l
= 0, i
= 0; i
< 2; i
++) {
239 out
+= scnprintf(buf
+ out
, count
- out
, " ");
240 for (j
= 0; j
< 8 && l
< len
; j
++, l
++) {
241 c
= data
[(i
* 8 + j
)];
242 if (!isascii(c
) || !isprint(c
))
245 out
+= scnprintf(buf
+ out
, count
- out
, "%c", c
);
249 out
+= scnprintf(buf
+ out
, count
- out
, " ");
255 static void printk_buf(int level
, const u8
* data
, u32 len
)
259 if (!(ipw_debug_level
& level
))
263 snprint_line(line
, sizeof(line
), &data
[ofs
],
265 printk(KERN_DEBUG
"%s\n", line
);
267 len
-= min(len
, 16U);
271 static int snprintk_buf(u8
* output
, size_t size
, const u8
* data
, size_t len
)
277 while (size
&& len
) {
278 out
= snprint_line(output
, size
, &data
[ofs
],
279 min_t(size_t, len
, 16U), ofs
);
284 len
-= min_t(size_t, len
, 16U);
290 /* alias for 32-bit indirect read (for SRAM/reg above 4K), with debug wrapper */
291 static u32
_ipw_read_reg32(struct ipw_priv
*priv
, u32 reg
);
292 #define ipw_read_reg32(a, b) _ipw_read_reg32(a, b)
294 /* alias for 8-bit indirect read (for SRAM/reg above 4K), with debug wrapper */
295 static u8
_ipw_read_reg8(struct ipw_priv
*ipw
, u32 reg
);
296 #define ipw_read_reg8(a, b) _ipw_read_reg8(a, b)
298 /* 8-bit indirect write (for SRAM/reg above 4K), with debug wrapper */
299 static void _ipw_write_reg8(struct ipw_priv
*priv
, u32 reg
, u8 value
);
300 static inline void ipw_write_reg8(struct ipw_priv
*a
, u32 b
, u8 c
)
302 IPW_DEBUG_IO("%s %d: write_indirect8(0x%08X, 0x%08X)\n", __FILE__
,
303 __LINE__
, (u32
) (b
), (u32
) (c
));
304 _ipw_write_reg8(a
, b
, c
);
307 /* 16-bit indirect write (for SRAM/reg above 4K), with debug wrapper */
308 static void _ipw_write_reg16(struct ipw_priv
*priv
, u32 reg
, u16 value
);
309 static inline void ipw_write_reg16(struct ipw_priv
*a
, u32 b
, u16 c
)
311 IPW_DEBUG_IO("%s %d: write_indirect16(0x%08X, 0x%08X)\n", __FILE__
,
312 __LINE__
, (u32
) (b
), (u32
) (c
));
313 _ipw_write_reg16(a
, b
, c
);
316 /* 32-bit indirect write (for SRAM/reg above 4K), with debug wrapper */
317 static void _ipw_write_reg32(struct ipw_priv
*priv
, u32 reg
, u32 value
);
318 static inline void ipw_write_reg32(struct ipw_priv
*a
, u32 b
, u32 c
)
320 IPW_DEBUG_IO("%s %d: write_indirect32(0x%08X, 0x%08X)\n", __FILE__
,
321 __LINE__
, (u32
) (b
), (u32
) (c
));
322 _ipw_write_reg32(a
, b
, c
);
325 /* 8-bit direct write (low 4K) */
326 static inline void _ipw_write8(struct ipw_priv
*ipw
, unsigned long ofs
,
329 writeb(val
, ipw
->hw_base
+ ofs
);
332 /* 8-bit direct write (for low 4K of SRAM/regs), with debug wrapper */
333 #define ipw_write8(ipw, ofs, val) do { \
334 IPW_DEBUG_IO("%s %d: write_direct8(0x%08X, 0x%08X)\n", __FILE__, \
335 __LINE__, (u32)(ofs), (u32)(val)); \
336 _ipw_write8(ipw, ofs, val); \
339 /* 16-bit direct write (low 4K) */
340 static inline void _ipw_write16(struct ipw_priv
*ipw
, unsigned long ofs
,
343 writew(val
, ipw
->hw_base
+ ofs
);
346 /* 16-bit direct write (for low 4K of SRAM/regs), with debug wrapper */
347 #define ipw_write16(ipw, ofs, val) do { \
348 IPW_DEBUG_IO("%s %d: write_direct16(0x%08X, 0x%08X)\n", __FILE__, \
349 __LINE__, (u32)(ofs), (u32)(val)); \
350 _ipw_write16(ipw, ofs, val); \
353 /* 32-bit direct write (low 4K) */
354 static inline void _ipw_write32(struct ipw_priv
*ipw
, unsigned long ofs
,
357 writel(val
, ipw
->hw_base
+ ofs
);
360 /* 32-bit direct write (for low 4K of SRAM/regs), with debug wrapper */
361 #define ipw_write32(ipw, ofs, val) do { \
362 IPW_DEBUG_IO("%s %d: write_direct32(0x%08X, 0x%08X)\n", __FILE__, \
363 __LINE__, (u32)(ofs), (u32)(val)); \
364 _ipw_write32(ipw, ofs, val); \
367 /* 8-bit direct read (low 4K) */
368 static inline u8
_ipw_read8(struct ipw_priv
*ipw
, unsigned long ofs
)
370 return readb(ipw
->hw_base
+ ofs
);
373 /* alias to 8-bit direct read (low 4K of SRAM/regs), with debug wrapper */
374 #define ipw_read8(ipw, ofs) ({ \
375 IPW_DEBUG_IO("%s %d: read_direct8(0x%08X)\n", __FILE__, __LINE__, \
377 _ipw_read8(ipw, ofs); \
380 /* 16-bit direct read (low 4K) */
381 static inline u16
_ipw_read16(struct ipw_priv
*ipw
, unsigned long ofs
)
383 return readw(ipw
->hw_base
+ ofs
);
386 /* alias to 16-bit direct read (low 4K of SRAM/regs), with debug wrapper */
387 #define ipw_read16(ipw, ofs) ({ \
388 IPW_DEBUG_IO("%s %d: read_direct16(0x%08X)\n", __FILE__, __LINE__, \
390 _ipw_read16(ipw, ofs); \
393 /* 32-bit direct read (low 4K) */
394 static inline u32
_ipw_read32(struct ipw_priv
*ipw
, unsigned long ofs
)
396 return readl(ipw
->hw_base
+ ofs
);
399 /* alias to 32-bit direct read (low 4K of SRAM/regs), with debug wrapper */
400 #define ipw_read32(ipw, ofs) ({ \
401 IPW_DEBUG_IO("%s %d: read_direct32(0x%08X)\n", __FILE__, __LINE__, \
403 _ipw_read32(ipw, ofs); \
406 static void _ipw_read_indirect(struct ipw_priv
*, u32
, u8
*, int);
407 /* alias to multi-byte read (SRAM/regs above 4K), with debug wrapper */
408 #define ipw_read_indirect(a, b, c, d) ({ \
409 IPW_DEBUG_IO("%s %d: read_indirect(0x%08X) %u bytes\n", __FILE__, \
410 __LINE__, (u32)(b), (u32)(d)); \
411 _ipw_read_indirect(a, b, c, d); \
414 /* alias to multi-byte read (SRAM/regs above 4K), with debug wrapper */
415 static void _ipw_write_indirect(struct ipw_priv
*priv
, u32 addr
, u8
* data
,
417 #define ipw_write_indirect(a, b, c, d) do { \
418 IPW_DEBUG_IO("%s %d: write_indirect(0x%08X) %u bytes\n", __FILE__, \
419 __LINE__, (u32)(b), (u32)(d)); \
420 _ipw_write_indirect(a, b, c, d); \
423 /* 32-bit indirect write (above 4K) */
424 static void _ipw_write_reg32(struct ipw_priv
*priv
, u32 reg
, u32 value
)
426 IPW_DEBUG_IO(" %p : reg = 0x%8X : value = 0x%8X\n", priv
, reg
, value
);
427 _ipw_write32(priv
, IPW_INDIRECT_ADDR
, reg
);
428 _ipw_write32(priv
, IPW_INDIRECT_DATA
, value
);
431 /* 8-bit indirect write (above 4K) */
432 static void _ipw_write_reg8(struct ipw_priv
*priv
, u32 reg
, u8 value
)
434 u32 aligned_addr
= reg
& IPW_INDIRECT_ADDR_MASK
; /* dword align */
435 u32 dif_len
= reg
- aligned_addr
;
437 IPW_DEBUG_IO(" reg = 0x%8X : value = 0x%8X\n", reg
, value
);
438 _ipw_write32(priv
, IPW_INDIRECT_ADDR
, aligned_addr
);
439 _ipw_write8(priv
, IPW_INDIRECT_DATA
+ dif_len
, value
);
442 /* 16-bit indirect write (above 4K) */
443 static void _ipw_write_reg16(struct ipw_priv
*priv
, u32 reg
, u16 value
)
445 u32 aligned_addr
= reg
& IPW_INDIRECT_ADDR_MASK
; /* dword align */
446 u32 dif_len
= (reg
- aligned_addr
) & (~0x1ul
);
448 IPW_DEBUG_IO(" reg = 0x%8X : value = 0x%8X\n", reg
, value
);
449 _ipw_write32(priv
, IPW_INDIRECT_ADDR
, aligned_addr
);
450 _ipw_write16(priv
, IPW_INDIRECT_DATA
+ dif_len
, value
);
453 /* 8-bit indirect read (above 4K) */
454 static u8
_ipw_read_reg8(struct ipw_priv
*priv
, u32 reg
)
457 _ipw_write32(priv
, IPW_INDIRECT_ADDR
, reg
& IPW_INDIRECT_ADDR_MASK
);
458 IPW_DEBUG_IO(" reg = 0x%8X :\n", reg
);
459 word
= _ipw_read32(priv
, IPW_INDIRECT_DATA
);
460 return (word
>> ((reg
& 0x3) * 8)) & 0xff;
463 /* 32-bit indirect read (above 4K) */
464 static u32
_ipw_read_reg32(struct ipw_priv
*priv
, u32 reg
)
468 IPW_DEBUG_IO("%p : reg = 0x%08x\n", priv
, reg
);
470 _ipw_write32(priv
, IPW_INDIRECT_ADDR
, reg
);
471 value
= _ipw_read32(priv
, IPW_INDIRECT_DATA
);
472 IPW_DEBUG_IO(" reg = 0x%4X : value = 0x%4x\n", reg
, value
);
476 /* General purpose, no alignment requirement, iterative (multi-byte) read, */
477 /* for area above 1st 4K of SRAM/reg space */
478 static void _ipw_read_indirect(struct ipw_priv
*priv
, u32 addr
, u8
* buf
,
481 u32 aligned_addr
= addr
& IPW_INDIRECT_ADDR_MASK
; /* dword align */
482 u32 dif_len
= addr
- aligned_addr
;
485 IPW_DEBUG_IO("addr = %i, buf = %p, num = %i\n", addr
, buf
, num
);
491 /* Read the first dword (or portion) byte by byte */
492 if (unlikely(dif_len
)) {
493 _ipw_write32(priv
, IPW_INDIRECT_ADDR
, aligned_addr
);
494 /* Start reading at aligned_addr + dif_len */
495 for (i
= dif_len
; ((i
< 4) && (num
> 0)); i
++, num
--)
496 *buf
++ = _ipw_read8(priv
, IPW_INDIRECT_DATA
+ i
);
500 /* Read all of the middle dwords as dwords, with auto-increment */
501 _ipw_write32(priv
, IPW_AUTOINC_ADDR
, aligned_addr
);
502 for (; num
>= 4; buf
+= 4, aligned_addr
+= 4, num
-= 4)
503 *(u32
*) buf
= _ipw_read32(priv
, IPW_AUTOINC_DATA
);
505 /* Read the last dword (or portion) byte by byte */
507 _ipw_write32(priv
, IPW_INDIRECT_ADDR
, aligned_addr
);
508 for (i
= 0; num
> 0; i
++, num
--)
509 *buf
++ = ipw_read8(priv
, IPW_INDIRECT_DATA
+ i
);
513 /* General purpose, no alignment requirement, iterative (multi-byte) write, */
514 /* for area above 1st 4K of SRAM/reg space */
515 static void _ipw_write_indirect(struct ipw_priv
*priv
, u32 addr
, u8
* buf
,
518 u32 aligned_addr
= addr
& IPW_INDIRECT_ADDR_MASK
; /* dword align */
519 u32 dif_len
= addr
- aligned_addr
;
522 IPW_DEBUG_IO("addr = %i, buf = %p, num = %i\n", addr
, buf
, num
);
528 /* Write the first dword (or portion) byte by byte */
529 if (unlikely(dif_len
)) {
530 _ipw_write32(priv
, IPW_INDIRECT_ADDR
, aligned_addr
);
531 /* Start writing at aligned_addr + dif_len */
532 for (i
= dif_len
; ((i
< 4) && (num
> 0)); i
++, num
--, buf
++)
533 _ipw_write8(priv
, IPW_INDIRECT_DATA
+ i
, *buf
);
537 /* Write all of the middle dwords as dwords, with auto-increment */
538 _ipw_write32(priv
, IPW_AUTOINC_ADDR
, aligned_addr
);
539 for (; num
>= 4; buf
+= 4, aligned_addr
+= 4, num
-= 4)
540 _ipw_write32(priv
, IPW_AUTOINC_DATA
, *(u32
*) buf
);
542 /* Write the last dword (or portion) byte by byte */
544 _ipw_write32(priv
, IPW_INDIRECT_ADDR
, aligned_addr
);
545 for (i
= 0; num
> 0; i
++, num
--, buf
++)
546 _ipw_write8(priv
, IPW_INDIRECT_DATA
+ i
, *buf
);
550 /* General purpose, no alignment requirement, iterative (multi-byte) write, */
551 /* for 1st 4K of SRAM/regs space */
552 static void ipw_write_direct(struct ipw_priv
*priv
, u32 addr
, void *buf
,
555 memcpy_toio((priv
->hw_base
+ addr
), buf
, num
);
558 /* Set bit(s) in low 4K of SRAM/regs */
559 static inline void ipw_set_bit(struct ipw_priv
*priv
, u32 reg
, u32 mask
)
561 ipw_write32(priv
, reg
, ipw_read32(priv
, reg
) | mask
);
564 /* Clear bit(s) in low 4K of SRAM/regs */
565 static inline void ipw_clear_bit(struct ipw_priv
*priv
, u32 reg
, u32 mask
)
567 ipw_write32(priv
, reg
, ipw_read32(priv
, reg
) & ~mask
);
570 static inline void __ipw_enable_interrupts(struct ipw_priv
*priv
)
572 if (priv
->status
& STATUS_INT_ENABLED
)
574 priv
->status
|= STATUS_INT_ENABLED
;
575 ipw_write32(priv
, IPW_INTA_MASK_R
, IPW_INTA_MASK_ALL
);
578 static inline void __ipw_disable_interrupts(struct ipw_priv
*priv
)
580 if (!(priv
->status
& STATUS_INT_ENABLED
))
582 priv
->status
&= ~STATUS_INT_ENABLED
;
583 ipw_write32(priv
, IPW_INTA_MASK_R
, ~IPW_INTA_MASK_ALL
);
586 static inline void ipw_enable_interrupts(struct ipw_priv
*priv
)
590 spin_lock_irqsave(&priv
->irq_lock
, flags
);
591 __ipw_enable_interrupts(priv
);
592 spin_unlock_irqrestore(&priv
->irq_lock
, flags
);
595 static inline void ipw_disable_interrupts(struct ipw_priv
*priv
)
599 spin_lock_irqsave(&priv
->irq_lock
, flags
);
600 __ipw_disable_interrupts(priv
);
601 spin_unlock_irqrestore(&priv
->irq_lock
, flags
);
604 static char *ipw_error_desc(u32 val
)
607 case IPW_FW_ERROR_OK
:
609 case IPW_FW_ERROR_FAIL
:
611 case IPW_FW_ERROR_MEMORY_UNDERFLOW
:
612 return "MEMORY_UNDERFLOW";
613 case IPW_FW_ERROR_MEMORY_OVERFLOW
:
614 return "MEMORY_OVERFLOW";
615 case IPW_FW_ERROR_BAD_PARAM
:
617 case IPW_FW_ERROR_BAD_CHECKSUM
:
618 return "BAD_CHECKSUM";
619 case IPW_FW_ERROR_NMI_INTERRUPT
:
620 return "NMI_INTERRUPT";
621 case IPW_FW_ERROR_BAD_DATABASE
:
622 return "BAD_DATABASE";
623 case IPW_FW_ERROR_ALLOC_FAIL
:
625 case IPW_FW_ERROR_DMA_UNDERRUN
:
626 return "DMA_UNDERRUN";
627 case IPW_FW_ERROR_DMA_STATUS
:
629 case IPW_FW_ERROR_DINO_ERROR
:
631 case IPW_FW_ERROR_EEPROM_ERROR
:
632 return "EEPROM_ERROR";
633 case IPW_FW_ERROR_SYSASSERT
:
635 case IPW_FW_ERROR_FATAL_ERROR
:
636 return "FATAL_ERROR";
638 return "UNKNOWN_ERROR";
642 static void ipw_dump_error_log(struct ipw_priv
*priv
,
643 struct ipw_fw_error
*error
)
648 IPW_ERROR("Error allocating and capturing error log. "
649 "Nothing to dump.\n");
653 IPW_ERROR("Start IPW Error Log Dump:\n");
654 IPW_ERROR("Status: 0x%08X, Config: %08X\n",
655 error
->status
, error
->config
);
657 for (i
= 0; i
< error
->elem_len
; i
++)
658 IPW_ERROR("%s %i 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n",
659 ipw_error_desc(error
->elem
[i
].desc
),
661 error
->elem
[i
].blink1
,
662 error
->elem
[i
].blink2
,
663 error
->elem
[i
].link1
,
664 error
->elem
[i
].link2
, error
->elem
[i
].data
);
665 for (i
= 0; i
< error
->log_len
; i
++)
666 IPW_ERROR("%i\t0x%08x\t%i\n",
668 error
->log
[i
].data
, error
->log
[i
].event
);
671 static inline int ipw_is_init(struct ipw_priv
*priv
)
673 return (priv
->status
& STATUS_INIT
) ? 1 : 0;
676 static int ipw_get_ordinal(struct ipw_priv
*priv
, u32 ord
, void *val
, u32
* len
)
678 u32 addr
, field_info
, field_len
, field_count
, total_len
;
680 IPW_DEBUG_ORD("ordinal = %i\n", ord
);
682 if (!priv
|| !val
|| !len
) {
683 IPW_DEBUG_ORD("Invalid argument\n");
687 /* verify device ordinal tables have been initialized */
688 if (!priv
->table0_addr
|| !priv
->table1_addr
|| !priv
->table2_addr
) {
689 IPW_DEBUG_ORD("Access ordinals before initialization\n");
693 switch (IPW_ORD_TABLE_ID_MASK
& ord
) {
694 case IPW_ORD_TABLE_0_MASK
:
696 * TABLE 0: Direct access to a table of 32 bit values
698 * This is a very simple table with the data directly
699 * read from the table
702 /* remove the table id from the ordinal */
703 ord
&= IPW_ORD_TABLE_VALUE_MASK
;
706 if (ord
> priv
->table0_len
) {
707 IPW_DEBUG_ORD("ordinal value (%i) longer then "
708 "max (%i)\n", ord
, priv
->table0_len
);
712 /* verify we have enough room to store the value */
713 if (*len
< sizeof(u32
)) {
714 IPW_DEBUG_ORD("ordinal buffer length too small, "
715 "need %zd\n", sizeof(u32
));
719 IPW_DEBUG_ORD("Reading TABLE0[%i] from offset 0x%08x\n",
720 ord
, priv
->table0_addr
+ (ord
<< 2));
724 *((u32
*) val
) = ipw_read32(priv
, priv
->table0_addr
+ ord
);
727 case IPW_ORD_TABLE_1_MASK
:
729 * TABLE 1: Indirect access to a table of 32 bit values
731 * This is a fairly large table of u32 values each
732 * representing starting addr for the data (which is
736 /* remove the table id from the ordinal */
737 ord
&= IPW_ORD_TABLE_VALUE_MASK
;
740 if (ord
> priv
->table1_len
) {
741 IPW_DEBUG_ORD("ordinal value too long\n");
745 /* verify we have enough room to store the value */
746 if (*len
< sizeof(u32
)) {
747 IPW_DEBUG_ORD("ordinal buffer length too small, "
748 "need %zd\n", sizeof(u32
));
753 ipw_read_reg32(priv
, (priv
->table1_addr
+ (ord
<< 2)));
757 case IPW_ORD_TABLE_2_MASK
:
759 * TABLE 2: Indirect access to a table of variable sized values
761 * This table consist of six values, each containing
762 * - dword containing the starting offset of the data
763 * - dword containing the lengh in the first 16bits
764 * and the count in the second 16bits
767 /* remove the table id from the ordinal */
768 ord
&= IPW_ORD_TABLE_VALUE_MASK
;
771 if (ord
> priv
->table2_len
) {
772 IPW_DEBUG_ORD("ordinal value too long\n");
776 /* get the address of statistic */
777 addr
= ipw_read_reg32(priv
, priv
->table2_addr
+ (ord
<< 3));
779 /* get the second DW of statistics ;
780 * two 16-bit words - first is length, second is count */
783 priv
->table2_addr
+ (ord
<< 3) +
786 /* get each entry length */
787 field_len
= *((u16
*) & field_info
);
789 /* get number of entries */
790 field_count
= *(((u16
*) & field_info
) + 1);
792 /* abort if not enough memory */
793 total_len
= field_len
* field_count
;
794 if (total_len
> *len
) {
803 IPW_DEBUG_ORD("addr = 0x%08x, total_len = %i, "
804 "field_info = 0x%08x\n",
805 addr
, total_len
, field_info
);
806 ipw_read_indirect(priv
, addr
, val
, total_len
);
810 IPW_DEBUG_ORD("Invalid ordinal!\n");
818 static void ipw_init_ordinals(struct ipw_priv
*priv
)
820 priv
->table0_addr
= IPW_ORDINALS_TABLE_LOWER
;
821 priv
->table0_len
= ipw_read32(priv
, priv
->table0_addr
);
823 IPW_DEBUG_ORD("table 0 offset at 0x%08x, len = %i\n",
824 priv
->table0_addr
, priv
->table0_len
);
826 priv
->table1_addr
= ipw_read32(priv
, IPW_ORDINALS_TABLE_1
);
827 priv
->table1_len
= ipw_read_reg32(priv
, priv
->table1_addr
);
829 IPW_DEBUG_ORD("table 1 offset at 0x%08x, len = %i\n",
830 priv
->table1_addr
, priv
->table1_len
);
832 priv
->table2_addr
= ipw_read32(priv
, IPW_ORDINALS_TABLE_2
);
833 priv
->table2_len
= ipw_read_reg32(priv
, priv
->table2_addr
);
834 priv
->table2_len
&= 0x0000ffff; /* use first two bytes */
836 IPW_DEBUG_ORD("table 2 offset at 0x%08x, len = %i\n",
837 priv
->table2_addr
, priv
->table2_len
);
841 static u32
ipw_register_toggle(u32 reg
)
843 reg
&= ~IPW_START_STANDBY
;
844 if (reg
& IPW_GATE_ODMA
)
845 reg
&= ~IPW_GATE_ODMA
;
846 if (reg
& IPW_GATE_IDMA
)
847 reg
&= ~IPW_GATE_IDMA
;
848 if (reg
& IPW_GATE_ADMA
)
849 reg
&= ~IPW_GATE_ADMA
;
855 * - On radio ON, turn on any LEDs that require to be on during start
856 * - On initialization, start unassociated blink
857 * - On association, disable unassociated blink
858 * - On disassociation, start unassociated blink
859 * - On radio OFF, turn off any LEDs started during radio on
862 #define LD_TIME_LINK_ON msecs_to_jiffies(300)
863 #define LD_TIME_LINK_OFF msecs_to_jiffies(2700)
864 #define LD_TIME_ACT_ON msecs_to_jiffies(250)
866 static void ipw_led_link_on(struct ipw_priv
*priv
)
871 /* If configured to not use LEDs, or nic_type is 1,
872 * then we don't toggle a LINK led */
873 if (priv
->config
& CFG_NO_LED
|| priv
->nic_type
== EEPROM_NIC_TYPE_1
)
876 spin_lock_irqsave(&priv
->lock
, flags
);
878 if (!(priv
->status
& STATUS_RF_KILL_MASK
) &&
879 !(priv
->status
& STATUS_LED_LINK_ON
)) {
880 IPW_DEBUG_LED("Link LED On\n");
881 led
= ipw_read_reg32(priv
, IPW_EVENT_REG
);
882 led
|= priv
->led_association_on
;
884 led
= ipw_register_toggle(led
);
886 IPW_DEBUG_LED("Reg: 0x%08X\n", led
);
887 ipw_write_reg32(priv
, IPW_EVENT_REG
, led
);
889 priv
->status
|= STATUS_LED_LINK_ON
;
891 /* If we aren't associated, schedule turning the LED off */
892 if (!(priv
->status
& STATUS_ASSOCIATED
))
893 schedule_delayed_work(&priv
->led_link_off
,
897 spin_unlock_irqrestore(&priv
->lock
, flags
);
900 static void ipw_bg_led_link_on(struct work_struct
*work
)
902 struct ipw_priv
*priv
=
903 container_of(work
, struct ipw_priv
, led_link_on
.work
);
904 mutex_lock(&priv
->mutex
);
905 ipw_led_link_on(priv
);
906 mutex_unlock(&priv
->mutex
);
909 static void ipw_led_link_off(struct ipw_priv
*priv
)
914 /* If configured not to use LEDs, or nic type is 1,
915 * then we don't goggle the LINK led. */
916 if (priv
->config
& CFG_NO_LED
|| priv
->nic_type
== EEPROM_NIC_TYPE_1
)
919 spin_lock_irqsave(&priv
->lock
, flags
);
921 if (priv
->status
& STATUS_LED_LINK_ON
) {
922 led
= ipw_read_reg32(priv
, IPW_EVENT_REG
);
923 led
&= priv
->led_association_off
;
924 led
= ipw_register_toggle(led
);
926 IPW_DEBUG_LED("Reg: 0x%08X\n", led
);
927 ipw_write_reg32(priv
, IPW_EVENT_REG
, led
);
929 IPW_DEBUG_LED("Link LED Off\n");
931 priv
->status
&= ~STATUS_LED_LINK_ON
;
933 /* If we aren't associated and the radio is on, schedule
934 * turning the LED on (blink while unassociated) */
935 if (!(priv
->status
& STATUS_RF_KILL_MASK
) &&
936 !(priv
->status
& STATUS_ASSOCIATED
))
937 schedule_delayed_work(&priv
->led_link_on
,
942 spin_unlock_irqrestore(&priv
->lock
, flags
);
945 static void ipw_bg_led_link_off(struct work_struct
*work
)
947 struct ipw_priv
*priv
=
948 container_of(work
, struct ipw_priv
, led_link_off
.work
);
949 mutex_lock(&priv
->mutex
);
950 ipw_led_link_off(priv
);
951 mutex_unlock(&priv
->mutex
);
954 static void __ipw_led_activity_on(struct ipw_priv
*priv
)
958 if (priv
->config
& CFG_NO_LED
)
961 if (priv
->status
& STATUS_RF_KILL_MASK
)
964 if (!(priv
->status
& STATUS_LED_ACT_ON
)) {
965 led
= ipw_read_reg32(priv
, IPW_EVENT_REG
);
966 led
|= priv
->led_activity_on
;
968 led
= ipw_register_toggle(led
);
970 IPW_DEBUG_LED("Reg: 0x%08X\n", led
);
971 ipw_write_reg32(priv
, IPW_EVENT_REG
, led
);
973 IPW_DEBUG_LED("Activity LED On\n");
975 priv
->status
|= STATUS_LED_ACT_ON
;
977 cancel_delayed_work(&priv
->led_act_off
);
978 schedule_delayed_work(&priv
->led_act_off
, LD_TIME_ACT_ON
);
980 /* Reschedule LED off for full time period */
981 cancel_delayed_work(&priv
->led_act_off
);
982 schedule_delayed_work(&priv
->led_act_off
, LD_TIME_ACT_ON
);
987 void ipw_led_activity_on(struct ipw_priv
*priv
)
990 spin_lock_irqsave(&priv
->lock
, flags
);
991 __ipw_led_activity_on(priv
);
992 spin_unlock_irqrestore(&priv
->lock
, flags
);
996 static void ipw_led_activity_off(struct ipw_priv
*priv
)
1001 if (priv
->config
& CFG_NO_LED
)
1004 spin_lock_irqsave(&priv
->lock
, flags
);
1006 if (priv
->status
& STATUS_LED_ACT_ON
) {
1007 led
= ipw_read_reg32(priv
, IPW_EVENT_REG
);
1008 led
&= priv
->led_activity_off
;
1010 led
= ipw_register_toggle(led
);
1012 IPW_DEBUG_LED("Reg: 0x%08X\n", led
);
1013 ipw_write_reg32(priv
, IPW_EVENT_REG
, led
);
1015 IPW_DEBUG_LED("Activity LED Off\n");
1017 priv
->status
&= ~STATUS_LED_ACT_ON
;
1020 spin_unlock_irqrestore(&priv
->lock
, flags
);
1023 static void ipw_bg_led_activity_off(struct work_struct
*work
)
1025 struct ipw_priv
*priv
=
1026 container_of(work
, struct ipw_priv
, led_act_off
.work
);
1027 mutex_lock(&priv
->mutex
);
1028 ipw_led_activity_off(priv
);
1029 mutex_unlock(&priv
->mutex
);
1032 static void ipw_led_band_on(struct ipw_priv
*priv
)
1034 unsigned long flags
;
1037 /* Only nic type 1 supports mode LEDs */
1038 if (priv
->config
& CFG_NO_LED
||
1039 priv
->nic_type
!= EEPROM_NIC_TYPE_1
|| !priv
->assoc_network
)
1042 spin_lock_irqsave(&priv
->lock
, flags
);
1044 led
= ipw_read_reg32(priv
, IPW_EVENT_REG
);
1045 if (priv
->assoc_network
->mode
== IEEE_A
) {
1046 led
|= priv
->led_ofdm_on
;
1047 led
&= priv
->led_association_off
;
1048 IPW_DEBUG_LED("Mode LED On: 802.11a\n");
1049 } else if (priv
->assoc_network
->mode
== IEEE_G
) {
1050 led
|= priv
->led_ofdm_on
;
1051 led
|= priv
->led_association_on
;
1052 IPW_DEBUG_LED("Mode LED On: 802.11g\n");
1054 led
&= priv
->led_ofdm_off
;
1055 led
|= priv
->led_association_on
;
1056 IPW_DEBUG_LED("Mode LED On: 802.11b\n");
1059 led
= ipw_register_toggle(led
);
1061 IPW_DEBUG_LED("Reg: 0x%08X\n", led
);
1062 ipw_write_reg32(priv
, IPW_EVENT_REG
, led
);
1064 spin_unlock_irqrestore(&priv
->lock
, flags
);
1067 static void ipw_led_band_off(struct ipw_priv
*priv
)
1069 unsigned long flags
;
1072 /* Only nic type 1 supports mode LEDs */
1073 if (priv
->config
& CFG_NO_LED
|| priv
->nic_type
!= EEPROM_NIC_TYPE_1
)
1076 spin_lock_irqsave(&priv
->lock
, flags
);
1078 led
= ipw_read_reg32(priv
, IPW_EVENT_REG
);
1079 led
&= priv
->led_ofdm_off
;
1080 led
&= priv
->led_association_off
;
1082 led
= ipw_register_toggle(led
);
1084 IPW_DEBUG_LED("Reg: 0x%08X\n", led
);
1085 ipw_write_reg32(priv
, IPW_EVENT_REG
, led
);
1087 spin_unlock_irqrestore(&priv
->lock
, flags
);
1090 static void ipw_led_radio_on(struct ipw_priv
*priv
)
1092 ipw_led_link_on(priv
);
1095 static void ipw_led_radio_off(struct ipw_priv
*priv
)
1097 ipw_led_activity_off(priv
);
1098 ipw_led_link_off(priv
);
1101 static void ipw_led_link_up(struct ipw_priv
*priv
)
1103 /* Set the Link Led on for all nic types */
1104 ipw_led_link_on(priv
);
1107 static void ipw_led_link_down(struct ipw_priv
*priv
)
1109 ipw_led_activity_off(priv
);
1110 ipw_led_link_off(priv
);
1112 if (priv
->status
& STATUS_RF_KILL_MASK
)
1113 ipw_led_radio_off(priv
);
1116 static void ipw_led_init(struct ipw_priv
*priv
)
1118 priv
->nic_type
= priv
->eeprom
[EEPROM_NIC_TYPE
];
1120 /* Set the default PINs for the link and activity leds */
1121 priv
->led_activity_on
= IPW_ACTIVITY_LED
;
1122 priv
->led_activity_off
= ~(IPW_ACTIVITY_LED
);
1124 priv
->led_association_on
= IPW_ASSOCIATED_LED
;
1125 priv
->led_association_off
= ~(IPW_ASSOCIATED_LED
);
1127 /* Set the default PINs for the OFDM leds */
1128 priv
->led_ofdm_on
= IPW_OFDM_LED
;
1129 priv
->led_ofdm_off
= ~(IPW_OFDM_LED
);
1131 switch (priv
->nic_type
) {
1132 case EEPROM_NIC_TYPE_1
:
1133 /* In this NIC type, the LEDs are reversed.... */
1134 priv
->led_activity_on
= IPW_ASSOCIATED_LED
;
1135 priv
->led_activity_off
= ~(IPW_ASSOCIATED_LED
);
1136 priv
->led_association_on
= IPW_ACTIVITY_LED
;
1137 priv
->led_association_off
= ~(IPW_ACTIVITY_LED
);
1139 if (!(priv
->config
& CFG_NO_LED
))
1140 ipw_led_band_on(priv
);
1142 /* And we don't blink link LEDs for this nic, so
1143 * just return here */
1146 case EEPROM_NIC_TYPE_3
:
1147 case EEPROM_NIC_TYPE_2
:
1148 case EEPROM_NIC_TYPE_4
:
1149 case EEPROM_NIC_TYPE_0
:
1153 IPW_DEBUG_INFO("Unknown NIC type from EEPROM: %d\n",
1155 priv
->nic_type
= EEPROM_NIC_TYPE_0
;
1159 if (!(priv
->config
& CFG_NO_LED
)) {
1160 if (priv
->status
& STATUS_ASSOCIATED
)
1161 ipw_led_link_on(priv
);
1163 ipw_led_link_off(priv
);
1167 static void ipw_led_shutdown(struct ipw_priv
*priv
)
1169 ipw_led_activity_off(priv
);
1170 ipw_led_link_off(priv
);
1171 ipw_led_band_off(priv
);
1172 cancel_delayed_work(&priv
->led_link_on
);
1173 cancel_delayed_work(&priv
->led_link_off
);
1174 cancel_delayed_work(&priv
->led_act_off
);
1178 * The following adds a new attribute to the sysfs representation
1179 * of this device driver (i.e. a new file in /sys/bus/pci/drivers/ipw/)
1180 * used for controlling the debug level.
1182 * See the level definitions in ipw for details.
1184 static ssize_t
debug_level_show(struct device_driver
*d
, char *buf
)
1186 return sprintf(buf
, "0x%08X\n", ipw_debug_level
);
1189 static ssize_t
debug_level_store(struct device_driver
*d
, const char *buf
,
1192 char *p
= (char *)buf
;
1195 if (p
[1] == 'x' || p
[1] == 'X' || p
[0] == 'x' || p
[0] == 'X') {
1197 if (p
[0] == 'x' || p
[0] == 'X')
1199 val
= simple_strtoul(p
, &p
, 16);
1201 val
= simple_strtoul(p
, &p
, 10);
1203 printk(KERN_INFO DRV_NAME
1204 ": %s is not in hex or decimal form.\n", buf
);
1206 ipw_debug_level
= val
;
1208 return strnlen(buf
, count
);
1210 static DRIVER_ATTR_RW(debug_level
);
1212 static inline u32
ipw_get_event_log_len(struct ipw_priv
*priv
)
1214 /* length = 1st dword in log */
1215 return ipw_read_reg32(priv
, ipw_read32(priv
, IPW_EVENT_LOG
));
1218 static void ipw_capture_event_log(struct ipw_priv
*priv
,
1219 u32 log_len
, struct ipw_event
*log
)
1224 base
= ipw_read32(priv
, IPW_EVENT_LOG
);
1225 ipw_read_indirect(priv
, base
+ sizeof(base
) + sizeof(u32
),
1226 (u8
*) log
, sizeof(*log
) * log_len
);
1230 static struct ipw_fw_error
*ipw_alloc_error_log(struct ipw_priv
*priv
)
1232 struct ipw_fw_error
*error
;
1233 u32 log_len
= ipw_get_event_log_len(priv
);
1234 u32 base
= ipw_read32(priv
, IPW_ERROR_LOG
);
1235 u32 elem_len
= ipw_read_reg32(priv
, base
);
1237 error
= kmalloc(sizeof(*error
) +
1238 sizeof(*error
->elem
) * elem_len
+
1239 sizeof(*error
->log
) * log_len
, GFP_ATOMIC
);
1241 IPW_ERROR("Memory allocation for firmware error log "
1245 error
->jiffies
= jiffies
;
1246 error
->status
= priv
->status
;
1247 error
->config
= priv
->config
;
1248 error
->elem_len
= elem_len
;
1249 error
->log_len
= log_len
;
1250 error
->elem
= (struct ipw_error_elem
*)error
->payload
;
1251 error
->log
= (struct ipw_event
*)(error
->elem
+ elem_len
);
1253 ipw_capture_event_log(priv
, log_len
, error
->log
);
1256 ipw_read_indirect(priv
, base
+ sizeof(base
), (u8
*) error
->elem
,
1257 sizeof(*error
->elem
) * elem_len
);
1262 static ssize_t
show_event_log(struct device
*d
,
1263 struct device_attribute
*attr
, char *buf
)
1265 struct ipw_priv
*priv
= dev_get_drvdata(d
);
1266 u32 log_len
= ipw_get_event_log_len(priv
);
1268 struct ipw_event
*log
;
1271 /* not using min() because of its strict type checking */
1272 log_size
= PAGE_SIZE
/ sizeof(*log
) > log_len
?
1273 sizeof(*log
) * log_len
: PAGE_SIZE
;
1274 log
= kzalloc(log_size
, GFP_KERNEL
);
1276 IPW_ERROR("Unable to allocate memory for log\n");
1279 log_len
= log_size
/ sizeof(*log
);
1280 ipw_capture_event_log(priv
, log_len
, log
);
1282 len
+= scnprintf(buf
+ len
, PAGE_SIZE
- len
, "%08X", log_len
);
1283 for (i
= 0; i
< log_len
; i
++)
1284 len
+= scnprintf(buf
+ len
, PAGE_SIZE
- len
,
1286 log
[i
].time
, log
[i
].event
, log
[i
].data
);
1287 len
+= scnprintf(buf
+ len
, PAGE_SIZE
- len
, "\n");
1292 static DEVICE_ATTR(event_log
, 0444, show_event_log
, NULL
);
1294 static ssize_t
show_error(struct device
*d
,
1295 struct device_attribute
*attr
, char *buf
)
1297 struct ipw_priv
*priv
= dev_get_drvdata(d
);
1301 len
+= scnprintf(buf
+ len
, PAGE_SIZE
- len
,
1302 "%08lX%08X%08X%08X",
1303 priv
->error
->jiffies
,
1304 priv
->error
->status
,
1305 priv
->error
->config
, priv
->error
->elem_len
);
1306 for (i
= 0; i
< priv
->error
->elem_len
; i
++)
1307 len
+= scnprintf(buf
+ len
, PAGE_SIZE
- len
,
1308 "\n%08X%08X%08X%08X%08X%08X%08X",
1309 priv
->error
->elem
[i
].time
,
1310 priv
->error
->elem
[i
].desc
,
1311 priv
->error
->elem
[i
].blink1
,
1312 priv
->error
->elem
[i
].blink2
,
1313 priv
->error
->elem
[i
].link1
,
1314 priv
->error
->elem
[i
].link2
,
1315 priv
->error
->elem
[i
].data
);
1317 len
+= scnprintf(buf
+ len
, PAGE_SIZE
- len
,
1318 "\n%08X", priv
->error
->log_len
);
1319 for (i
= 0; i
< priv
->error
->log_len
; i
++)
1320 len
+= scnprintf(buf
+ len
, PAGE_SIZE
- len
,
1322 priv
->error
->log
[i
].time
,
1323 priv
->error
->log
[i
].event
,
1324 priv
->error
->log
[i
].data
);
1325 len
+= scnprintf(buf
+ len
, PAGE_SIZE
- len
, "\n");
1329 static ssize_t
clear_error(struct device
*d
,
1330 struct device_attribute
*attr
,
1331 const char *buf
, size_t count
)
1333 struct ipw_priv
*priv
= dev_get_drvdata(d
);
1340 static DEVICE_ATTR(error
, 0644, show_error
, clear_error
);
1342 static ssize_t
show_cmd_log(struct device
*d
,
1343 struct device_attribute
*attr
, char *buf
)
1345 struct ipw_priv
*priv
= dev_get_drvdata(d
);
1349 for (i
= (priv
->cmdlog_pos
+ 1) % priv
->cmdlog_len
;
1350 (i
!= priv
->cmdlog_pos
) && (len
< PAGE_SIZE
);
1351 i
= (i
+ 1) % priv
->cmdlog_len
) {
1353 scnprintf(buf
+ len
, PAGE_SIZE
- len
,
1354 "\n%08lX%08X%08X%08X\n", priv
->cmdlog
[i
].jiffies
,
1355 priv
->cmdlog
[i
].retcode
, priv
->cmdlog
[i
].cmd
.cmd
,
1356 priv
->cmdlog
[i
].cmd
.len
);
1358 snprintk_buf(buf
+ len
, PAGE_SIZE
- len
,
1359 (u8
*) priv
->cmdlog
[i
].cmd
.param
,
1360 priv
->cmdlog
[i
].cmd
.len
);
1361 len
+= scnprintf(buf
+ len
, PAGE_SIZE
- len
, "\n");
1363 len
+= scnprintf(buf
+ len
, PAGE_SIZE
- len
, "\n");
1367 static DEVICE_ATTR(cmd_log
, 0444, show_cmd_log
, NULL
);
1369 #ifdef CONFIG_IPW2200_PROMISCUOUS
1370 static void ipw_prom_free(struct ipw_priv
*priv
);
1371 static int ipw_prom_alloc(struct ipw_priv
*priv
);
1372 static ssize_t
store_rtap_iface(struct device
*d
,
1373 struct device_attribute
*attr
,
1374 const char *buf
, size_t count
)
1376 struct ipw_priv
*priv
= dev_get_drvdata(d
);
1387 if (netif_running(priv
->prom_net_dev
)) {
1388 IPW_WARNING("Interface is up. Cannot unregister.\n");
1392 ipw_prom_free(priv
);
1400 rc
= ipw_prom_alloc(priv
);
1410 IPW_ERROR("Failed to register promiscuous network "
1411 "device (error %d).\n", rc
);
1417 static ssize_t
show_rtap_iface(struct device
*d
,
1418 struct device_attribute
*attr
,
1421 struct ipw_priv
*priv
= dev_get_drvdata(d
);
1423 return sprintf(buf
, "%s", priv
->prom_net_dev
->name
);
1432 static DEVICE_ATTR(rtap_iface
, 0600, show_rtap_iface
, store_rtap_iface
);
1434 static ssize_t
store_rtap_filter(struct device
*d
,
1435 struct device_attribute
*attr
,
1436 const char *buf
, size_t count
)
1438 struct ipw_priv
*priv
= dev_get_drvdata(d
);
1440 if (!priv
->prom_priv
) {
1441 IPW_ERROR("Attempting to set filter without "
1442 "rtap_iface enabled.\n");
1446 priv
->prom_priv
->filter
= simple_strtol(buf
, NULL
, 0);
1448 IPW_DEBUG_INFO("Setting rtap filter to " BIT_FMT16
"\n",
1449 BIT_ARG16(priv
->prom_priv
->filter
));
1454 static ssize_t
show_rtap_filter(struct device
*d
,
1455 struct device_attribute
*attr
,
1458 struct ipw_priv
*priv
= dev_get_drvdata(d
);
1459 return sprintf(buf
, "0x%04X",
1460 priv
->prom_priv
? priv
->prom_priv
->filter
: 0);
1463 static DEVICE_ATTR(rtap_filter
, 0600, show_rtap_filter
, store_rtap_filter
);
1466 static ssize_t
show_scan_age(struct device
*d
, struct device_attribute
*attr
,
1469 struct ipw_priv
*priv
= dev_get_drvdata(d
);
1470 return sprintf(buf
, "%d\n", priv
->ieee
->scan_age
);
1473 static ssize_t
store_scan_age(struct device
*d
, struct device_attribute
*attr
,
1474 const char *buf
, size_t count
)
1476 struct ipw_priv
*priv
= dev_get_drvdata(d
);
1477 struct net_device
*dev
= priv
->net_dev
;
1478 char buffer
[] = "00000000";
1480 (sizeof(buffer
) - 1) > count
? count
: sizeof(buffer
) - 1;
1484 IPW_DEBUG_INFO("enter\n");
1486 strncpy(buffer
, buf
, len
);
1489 if (p
[1] == 'x' || p
[1] == 'X' || p
[0] == 'x' || p
[0] == 'X') {
1491 if (p
[0] == 'x' || p
[0] == 'X')
1493 val
= simple_strtoul(p
, &p
, 16);
1495 val
= simple_strtoul(p
, &p
, 10);
1497 IPW_DEBUG_INFO("%s: user supplied invalid value.\n", dev
->name
);
1499 priv
->ieee
->scan_age
= val
;
1500 IPW_DEBUG_INFO("set scan_age = %u\n", priv
->ieee
->scan_age
);
1503 IPW_DEBUG_INFO("exit\n");
1507 static DEVICE_ATTR(scan_age
, 0644, show_scan_age
, store_scan_age
);
1509 static ssize_t
show_led(struct device
*d
, struct device_attribute
*attr
,
1512 struct ipw_priv
*priv
= dev_get_drvdata(d
);
1513 return sprintf(buf
, "%d\n", (priv
->config
& CFG_NO_LED
) ? 0 : 1);
1516 static ssize_t
store_led(struct device
*d
, struct device_attribute
*attr
,
1517 const char *buf
, size_t count
)
1519 struct ipw_priv
*priv
= dev_get_drvdata(d
);
1521 IPW_DEBUG_INFO("enter\n");
1527 IPW_DEBUG_LED("Disabling LED control.\n");
1528 priv
->config
|= CFG_NO_LED
;
1529 ipw_led_shutdown(priv
);
1531 IPW_DEBUG_LED("Enabling LED control.\n");
1532 priv
->config
&= ~CFG_NO_LED
;
1536 IPW_DEBUG_INFO("exit\n");
1540 static DEVICE_ATTR(led
, 0644, show_led
, store_led
);
1542 static ssize_t
show_status(struct device
*d
,
1543 struct device_attribute
*attr
, char *buf
)
1545 struct ipw_priv
*p
= dev_get_drvdata(d
);
1546 return sprintf(buf
, "0x%08x\n", (int)p
->status
);
1549 static DEVICE_ATTR(status
, 0444, show_status
, NULL
);
1551 static ssize_t
show_cfg(struct device
*d
, struct device_attribute
*attr
,
1554 struct ipw_priv
*p
= dev_get_drvdata(d
);
1555 return sprintf(buf
, "0x%08x\n", (int)p
->config
);
1558 static DEVICE_ATTR(cfg
, 0444, show_cfg
, NULL
);
1560 static ssize_t
show_nic_type(struct device
*d
,
1561 struct device_attribute
*attr
, char *buf
)
1563 struct ipw_priv
*priv
= dev_get_drvdata(d
);
1564 return sprintf(buf
, "TYPE: %d\n", priv
->nic_type
);
1567 static DEVICE_ATTR(nic_type
, 0444, show_nic_type
, NULL
);
1569 static ssize_t
show_ucode_version(struct device
*d
,
1570 struct device_attribute
*attr
, char *buf
)
1572 u32 len
= sizeof(u32
), tmp
= 0;
1573 struct ipw_priv
*p
= dev_get_drvdata(d
);
1575 if (ipw_get_ordinal(p
, IPW_ORD_STAT_UCODE_VERSION
, &tmp
, &len
))
1578 return sprintf(buf
, "0x%08x\n", tmp
);
1581 static DEVICE_ATTR(ucode_version
, 0644, show_ucode_version
, NULL
);
1583 static ssize_t
show_rtc(struct device
*d
, struct device_attribute
*attr
,
1586 u32 len
= sizeof(u32
), tmp
= 0;
1587 struct ipw_priv
*p
= dev_get_drvdata(d
);
1589 if (ipw_get_ordinal(p
, IPW_ORD_STAT_RTC
, &tmp
, &len
))
1592 return sprintf(buf
, "0x%08x\n", tmp
);
1595 static DEVICE_ATTR(rtc
, 0644, show_rtc
, NULL
);
1598 * Add a device attribute to view/control the delay between eeprom
1601 static ssize_t
show_eeprom_delay(struct device
*d
,
1602 struct device_attribute
*attr
, char *buf
)
1604 struct ipw_priv
*p
= dev_get_drvdata(d
);
1605 int n
= p
->eeprom_delay
;
1606 return sprintf(buf
, "%i\n", n
);
1608 static ssize_t
store_eeprom_delay(struct device
*d
,
1609 struct device_attribute
*attr
,
1610 const char *buf
, size_t count
)
1612 struct ipw_priv
*p
= dev_get_drvdata(d
);
1613 sscanf(buf
, "%i", &p
->eeprom_delay
);
1614 return strnlen(buf
, count
);
1617 static DEVICE_ATTR(eeprom_delay
, 0644, show_eeprom_delay
, store_eeprom_delay
);
1619 static ssize_t
show_command_event_reg(struct device
*d
,
1620 struct device_attribute
*attr
, char *buf
)
1623 struct ipw_priv
*p
= dev_get_drvdata(d
);
1625 reg
= ipw_read_reg32(p
, IPW_INTERNAL_CMD_EVENT
);
1626 return sprintf(buf
, "0x%08x\n", reg
);
1628 static ssize_t
store_command_event_reg(struct device
*d
,
1629 struct device_attribute
*attr
,
1630 const char *buf
, size_t count
)
1633 struct ipw_priv
*p
= dev_get_drvdata(d
);
1635 sscanf(buf
, "%x", ®
);
1636 ipw_write_reg32(p
, IPW_INTERNAL_CMD_EVENT
, reg
);
1637 return strnlen(buf
, count
);
1640 static DEVICE_ATTR(command_event_reg
, 0644,
1641 show_command_event_reg
, store_command_event_reg
);
1643 static ssize_t
show_mem_gpio_reg(struct device
*d
,
1644 struct device_attribute
*attr
, char *buf
)
1647 struct ipw_priv
*p
= dev_get_drvdata(d
);
1649 reg
= ipw_read_reg32(p
, 0x301100);
1650 return sprintf(buf
, "0x%08x\n", reg
);
1652 static ssize_t
store_mem_gpio_reg(struct device
*d
,
1653 struct device_attribute
*attr
,
1654 const char *buf
, size_t count
)
1657 struct ipw_priv
*p
= dev_get_drvdata(d
);
1659 sscanf(buf
, "%x", ®
);
1660 ipw_write_reg32(p
, 0x301100, reg
);
1661 return strnlen(buf
, count
);
1664 static DEVICE_ATTR(mem_gpio_reg
, 0644, show_mem_gpio_reg
, store_mem_gpio_reg
);
1666 static ssize_t
show_indirect_dword(struct device
*d
,
1667 struct device_attribute
*attr
, char *buf
)
1670 struct ipw_priv
*priv
= dev_get_drvdata(d
);
1672 if (priv
->status
& STATUS_INDIRECT_DWORD
)
1673 reg
= ipw_read_reg32(priv
, priv
->indirect_dword
);
1677 return sprintf(buf
, "0x%08x\n", reg
);
1679 static ssize_t
store_indirect_dword(struct device
*d
,
1680 struct device_attribute
*attr
,
1681 const char *buf
, size_t count
)
1683 struct ipw_priv
*priv
= dev_get_drvdata(d
);
1685 sscanf(buf
, "%x", &priv
->indirect_dword
);
1686 priv
->status
|= STATUS_INDIRECT_DWORD
;
1687 return strnlen(buf
, count
);
1690 static DEVICE_ATTR(indirect_dword
, 0644,
1691 show_indirect_dword
, store_indirect_dword
);
1693 static ssize_t
show_indirect_byte(struct device
*d
,
1694 struct device_attribute
*attr
, char *buf
)
1697 struct ipw_priv
*priv
= dev_get_drvdata(d
);
1699 if (priv
->status
& STATUS_INDIRECT_BYTE
)
1700 reg
= ipw_read_reg8(priv
, priv
->indirect_byte
);
1704 return sprintf(buf
, "0x%02x\n", reg
);
1706 static ssize_t
store_indirect_byte(struct device
*d
,
1707 struct device_attribute
*attr
,
1708 const char *buf
, size_t count
)
1710 struct ipw_priv
*priv
= dev_get_drvdata(d
);
1712 sscanf(buf
, "%x", &priv
->indirect_byte
);
1713 priv
->status
|= STATUS_INDIRECT_BYTE
;
1714 return strnlen(buf
, count
);
1717 static DEVICE_ATTR(indirect_byte
, 0644,
1718 show_indirect_byte
, store_indirect_byte
);
1720 static ssize_t
show_direct_dword(struct device
*d
,
1721 struct device_attribute
*attr
, char *buf
)
1724 struct ipw_priv
*priv
= dev_get_drvdata(d
);
1726 if (priv
->status
& STATUS_DIRECT_DWORD
)
1727 reg
= ipw_read32(priv
, priv
->direct_dword
);
1731 return sprintf(buf
, "0x%08x\n", reg
);
1733 static ssize_t
store_direct_dword(struct device
*d
,
1734 struct device_attribute
*attr
,
1735 const char *buf
, size_t count
)
1737 struct ipw_priv
*priv
= dev_get_drvdata(d
);
1739 sscanf(buf
, "%x", &priv
->direct_dword
);
1740 priv
->status
|= STATUS_DIRECT_DWORD
;
1741 return strnlen(buf
, count
);
1744 static DEVICE_ATTR(direct_dword
, 0644, show_direct_dword
, store_direct_dword
);
1746 static int rf_kill_active(struct ipw_priv
*priv
)
1748 if (0 == (ipw_read32(priv
, 0x30) & 0x10000)) {
1749 priv
->status
|= STATUS_RF_KILL_HW
;
1750 wiphy_rfkill_set_hw_state(priv
->ieee
->wdev
.wiphy
, true);
1752 priv
->status
&= ~STATUS_RF_KILL_HW
;
1753 wiphy_rfkill_set_hw_state(priv
->ieee
->wdev
.wiphy
, false);
1756 return (priv
->status
& STATUS_RF_KILL_HW
) ? 1 : 0;
1759 static ssize_t
show_rf_kill(struct device
*d
, struct device_attribute
*attr
,
1762 /* 0 - RF kill not enabled
1763 1 - SW based RF kill active (sysfs)
1764 2 - HW based RF kill active
1765 3 - Both HW and SW baed RF kill active */
1766 struct ipw_priv
*priv
= dev_get_drvdata(d
);
1767 int val
= ((priv
->status
& STATUS_RF_KILL_SW
) ? 0x1 : 0x0) |
1768 (rf_kill_active(priv
) ? 0x2 : 0x0);
1769 return sprintf(buf
, "%i\n", val
);
1772 static int ipw_radio_kill_sw(struct ipw_priv
*priv
, int disable_radio
)
1774 if ((disable_radio
? 1 : 0) ==
1775 ((priv
->status
& STATUS_RF_KILL_SW
) ? 1 : 0))
1778 IPW_DEBUG_RF_KILL("Manual SW RF Kill set to: RADIO %s\n",
1779 disable_radio
? "OFF" : "ON");
1781 if (disable_radio
) {
1782 priv
->status
|= STATUS_RF_KILL_SW
;
1784 cancel_delayed_work(&priv
->request_scan
);
1785 cancel_delayed_work(&priv
->request_direct_scan
);
1786 cancel_delayed_work(&priv
->request_passive_scan
);
1787 cancel_delayed_work(&priv
->scan_event
);
1788 schedule_work(&priv
->down
);
1790 priv
->status
&= ~STATUS_RF_KILL_SW
;
1791 if (rf_kill_active(priv
)) {
1792 IPW_DEBUG_RF_KILL("Can not turn radio back on - "
1793 "disabled by HW switch\n");
1794 /* Make sure the RF_KILL check timer is running */
1795 cancel_delayed_work(&priv
->rf_kill
);
1796 schedule_delayed_work(&priv
->rf_kill
,
1797 round_jiffies_relative(2 * HZ
));
1799 schedule_work(&priv
->up
);
1805 static ssize_t
store_rf_kill(struct device
*d
, struct device_attribute
*attr
,
1806 const char *buf
, size_t count
)
1808 struct ipw_priv
*priv
= dev_get_drvdata(d
);
1810 ipw_radio_kill_sw(priv
, buf
[0] == '1');
1815 static DEVICE_ATTR(rf_kill
, 0644, show_rf_kill
, store_rf_kill
);
1817 static ssize_t
show_speed_scan(struct device
*d
, struct device_attribute
*attr
,
1820 struct ipw_priv
*priv
= dev_get_drvdata(d
);
1821 int pos
= 0, len
= 0;
1822 if (priv
->config
& CFG_SPEED_SCAN
) {
1823 while (priv
->speed_scan
[pos
] != 0)
1824 len
+= sprintf(&buf
[len
], "%d ",
1825 priv
->speed_scan
[pos
++]);
1826 return len
+ sprintf(&buf
[len
], "\n");
1829 return sprintf(buf
, "0\n");
1832 static ssize_t
store_speed_scan(struct device
*d
, struct device_attribute
*attr
,
1833 const char *buf
, size_t count
)
1835 struct ipw_priv
*priv
= dev_get_drvdata(d
);
1836 int channel
, pos
= 0;
1837 const char *p
= buf
;
1839 /* list of space separated channels to scan, optionally ending with 0 */
1840 while ((channel
= simple_strtol(p
, NULL
, 0))) {
1841 if (pos
== MAX_SPEED_SCAN
- 1) {
1842 priv
->speed_scan
[pos
] = 0;
1846 if (libipw_is_valid_channel(priv
->ieee
, channel
))
1847 priv
->speed_scan
[pos
++] = channel
;
1849 IPW_WARNING("Skipping invalid channel request: %d\n",
1854 while (*p
== ' ' || *p
== '\t')
1859 priv
->config
&= ~CFG_SPEED_SCAN
;
1861 priv
->speed_scan_pos
= 0;
1862 priv
->config
|= CFG_SPEED_SCAN
;
1868 static DEVICE_ATTR(speed_scan
, 0644, show_speed_scan
, store_speed_scan
);
1870 static ssize_t
show_net_stats(struct device
*d
, struct device_attribute
*attr
,
1873 struct ipw_priv
*priv
= dev_get_drvdata(d
);
1874 return sprintf(buf
, "%c\n", (priv
->config
& CFG_NET_STATS
) ? '1' : '0');
1877 static ssize_t
store_net_stats(struct device
*d
, struct device_attribute
*attr
,
1878 const char *buf
, size_t count
)
1880 struct ipw_priv
*priv
= dev_get_drvdata(d
);
1882 priv
->config
|= CFG_NET_STATS
;
1884 priv
->config
&= ~CFG_NET_STATS
;
1889 static DEVICE_ATTR(net_stats
, 0644, show_net_stats
, store_net_stats
);
1891 static ssize_t
show_channels(struct device
*d
,
1892 struct device_attribute
*attr
,
1895 struct ipw_priv
*priv
= dev_get_drvdata(d
);
1896 const struct libipw_geo
*geo
= libipw_get_geo(priv
->ieee
);
1899 len
= sprintf(&buf
[len
],
1900 "Displaying %d channels in 2.4Ghz band "
1901 "(802.11bg):\n", geo
->bg_channels
);
1903 for (i
= 0; i
< geo
->bg_channels
; i
++) {
1904 len
+= sprintf(&buf
[len
], "%d: BSS%s%s, %s, Band %s.\n",
1906 geo
->bg
[i
].flags
& LIBIPW_CH_RADAR_DETECT
?
1907 " (radar spectrum)" : "",
1908 ((geo
->bg
[i
].flags
& LIBIPW_CH_NO_IBSS
) ||
1909 (geo
->bg
[i
].flags
& LIBIPW_CH_RADAR_DETECT
))
1911 geo
->bg
[i
].flags
& LIBIPW_CH_PASSIVE_ONLY
?
1912 "passive only" : "active/passive",
1913 geo
->bg
[i
].flags
& LIBIPW_CH_B_ONLY
?
1917 len
+= sprintf(&buf
[len
],
1918 "Displaying %d channels in 5.2Ghz band "
1919 "(802.11a):\n", geo
->a_channels
);
1920 for (i
= 0; i
< geo
->a_channels
; i
++) {
1921 len
+= sprintf(&buf
[len
], "%d: BSS%s%s, %s.\n",
1923 geo
->a
[i
].flags
& LIBIPW_CH_RADAR_DETECT
?
1924 " (radar spectrum)" : "",
1925 ((geo
->a
[i
].flags
& LIBIPW_CH_NO_IBSS
) ||
1926 (geo
->a
[i
].flags
& LIBIPW_CH_RADAR_DETECT
))
1928 geo
->a
[i
].flags
& LIBIPW_CH_PASSIVE_ONLY
?
1929 "passive only" : "active/passive");
1935 static DEVICE_ATTR(channels
, 0400, show_channels
, NULL
);
1937 static void notify_wx_assoc_event(struct ipw_priv
*priv
)
1939 union iwreq_data wrqu
;
1940 wrqu
.ap_addr
.sa_family
= ARPHRD_ETHER
;
1941 if (priv
->status
& STATUS_ASSOCIATED
)
1942 memcpy(wrqu
.ap_addr
.sa_data
, priv
->bssid
, ETH_ALEN
);
1944 eth_zero_addr(wrqu
.ap_addr
.sa_data
);
1945 wireless_send_event(priv
->net_dev
, SIOCGIWAP
, &wrqu
, NULL
);
1948 static void ipw_irq_tasklet(struct tasklet_struct
*t
)
1950 struct ipw_priv
*priv
= from_tasklet(priv
, t
, irq_tasklet
);
1951 u32 inta
, inta_mask
, handled
= 0;
1952 unsigned long flags
;
1954 spin_lock_irqsave(&priv
->irq_lock
, flags
);
1956 inta
= ipw_read32(priv
, IPW_INTA_RW
);
1957 inta_mask
= ipw_read32(priv
, IPW_INTA_MASK_R
);
1959 if (inta
== 0xFFFFFFFF) {
1960 /* Hardware disappeared */
1961 IPW_WARNING("TASKLET INTA == 0xFFFFFFFF\n");
1962 /* Only handle the cached INTA values */
1965 inta
&= (IPW_INTA_MASK_ALL
& inta_mask
);
1967 /* Add any cached INTA values that need to be handled */
1968 inta
|= priv
->isr_inta
;
1970 spin_unlock_irqrestore(&priv
->irq_lock
, flags
);
1972 spin_lock_irqsave(&priv
->lock
, flags
);
1974 /* handle all the justifications for the interrupt */
1975 if (inta
& IPW_INTA_BIT_RX_TRANSFER
) {
1977 handled
|= IPW_INTA_BIT_RX_TRANSFER
;
1980 if (inta
& IPW_INTA_BIT_TX_CMD_QUEUE
) {
1981 IPW_DEBUG_HC("Command completed.\n");
1982 ipw_queue_tx_reclaim(priv
, &priv
->txq_cmd
, -1);
1983 priv
->status
&= ~STATUS_HCMD_ACTIVE
;
1984 wake_up_interruptible(&priv
->wait_command_queue
);
1985 handled
|= IPW_INTA_BIT_TX_CMD_QUEUE
;
1988 if (inta
& IPW_INTA_BIT_TX_QUEUE_1
) {
1989 IPW_DEBUG_TX("TX_QUEUE_1\n");
1990 ipw_queue_tx_reclaim(priv
, &priv
->txq
[0], 0);
1991 handled
|= IPW_INTA_BIT_TX_QUEUE_1
;
1994 if (inta
& IPW_INTA_BIT_TX_QUEUE_2
) {
1995 IPW_DEBUG_TX("TX_QUEUE_2\n");
1996 ipw_queue_tx_reclaim(priv
, &priv
->txq
[1], 1);
1997 handled
|= IPW_INTA_BIT_TX_QUEUE_2
;
2000 if (inta
& IPW_INTA_BIT_TX_QUEUE_3
) {
2001 IPW_DEBUG_TX("TX_QUEUE_3\n");
2002 ipw_queue_tx_reclaim(priv
, &priv
->txq
[2], 2);
2003 handled
|= IPW_INTA_BIT_TX_QUEUE_3
;
2006 if (inta
& IPW_INTA_BIT_TX_QUEUE_4
) {
2007 IPW_DEBUG_TX("TX_QUEUE_4\n");
2008 ipw_queue_tx_reclaim(priv
, &priv
->txq
[3], 3);
2009 handled
|= IPW_INTA_BIT_TX_QUEUE_4
;
2012 if (inta
& IPW_INTA_BIT_STATUS_CHANGE
) {
2013 IPW_WARNING("STATUS_CHANGE\n");
2014 handled
|= IPW_INTA_BIT_STATUS_CHANGE
;
2017 if (inta
& IPW_INTA_BIT_BEACON_PERIOD_EXPIRED
) {
2018 IPW_WARNING("TX_PERIOD_EXPIRED\n");
2019 handled
|= IPW_INTA_BIT_BEACON_PERIOD_EXPIRED
;
2022 if (inta
& IPW_INTA_BIT_SLAVE_MODE_HOST_CMD_DONE
) {
2023 IPW_WARNING("HOST_CMD_DONE\n");
2024 handled
|= IPW_INTA_BIT_SLAVE_MODE_HOST_CMD_DONE
;
2027 if (inta
& IPW_INTA_BIT_FW_INITIALIZATION_DONE
) {
2028 IPW_WARNING("FW_INITIALIZATION_DONE\n");
2029 handled
|= IPW_INTA_BIT_FW_INITIALIZATION_DONE
;
2032 if (inta
& IPW_INTA_BIT_FW_CARD_DISABLE_PHY_OFF_DONE
) {
2033 IPW_WARNING("PHY_OFF_DONE\n");
2034 handled
|= IPW_INTA_BIT_FW_CARD_DISABLE_PHY_OFF_DONE
;
2037 if (inta
& IPW_INTA_BIT_RF_KILL_DONE
) {
2038 IPW_DEBUG_RF_KILL("RF_KILL_DONE\n");
2039 priv
->status
|= STATUS_RF_KILL_HW
;
2040 wiphy_rfkill_set_hw_state(priv
->ieee
->wdev
.wiphy
, true);
2041 wake_up_interruptible(&priv
->wait_command_queue
);
2042 priv
->status
&= ~(STATUS_ASSOCIATED
| STATUS_ASSOCIATING
);
2043 cancel_delayed_work(&priv
->request_scan
);
2044 cancel_delayed_work(&priv
->request_direct_scan
);
2045 cancel_delayed_work(&priv
->request_passive_scan
);
2046 cancel_delayed_work(&priv
->scan_event
);
2047 schedule_work(&priv
->link_down
);
2048 schedule_delayed_work(&priv
->rf_kill
, 2 * HZ
);
2049 handled
|= IPW_INTA_BIT_RF_KILL_DONE
;
2052 if (inta
& IPW_INTA_BIT_FATAL_ERROR
) {
2053 IPW_WARNING("Firmware error detected. Restarting.\n");
2055 IPW_DEBUG_FW("Sysfs 'error' log already exists.\n");
2056 if (ipw_debug_level
& IPW_DL_FW_ERRORS
) {
2057 struct ipw_fw_error
*error
=
2058 ipw_alloc_error_log(priv
);
2059 ipw_dump_error_log(priv
, error
);
2063 priv
->error
= ipw_alloc_error_log(priv
);
2065 IPW_DEBUG_FW("Sysfs 'error' log captured.\n");
2067 IPW_DEBUG_FW("Error allocating sysfs 'error' "
2069 if (ipw_debug_level
& IPW_DL_FW_ERRORS
)
2070 ipw_dump_error_log(priv
, priv
->error
);
2073 /* XXX: If hardware encryption is for WPA/WPA2,
2074 * we have to notify the supplicant. */
2075 if (priv
->ieee
->sec
.encrypt
) {
2076 priv
->status
&= ~STATUS_ASSOCIATED
;
2077 notify_wx_assoc_event(priv
);
2080 /* Keep the restart process from trying to send host
2081 * commands by clearing the INIT status bit */
2082 priv
->status
&= ~STATUS_INIT
;
2084 /* Cancel currently queued command. */
2085 priv
->status
&= ~STATUS_HCMD_ACTIVE
;
2086 wake_up_interruptible(&priv
->wait_command_queue
);
2088 schedule_work(&priv
->adapter_restart
);
2089 handled
|= IPW_INTA_BIT_FATAL_ERROR
;
2092 if (inta
& IPW_INTA_BIT_PARITY_ERROR
) {
2093 IPW_ERROR("Parity error\n");
2094 handled
|= IPW_INTA_BIT_PARITY_ERROR
;
2097 if (handled
!= inta
) {
2098 IPW_ERROR("Unhandled INTA bits 0x%08x\n", inta
& ~handled
);
2101 spin_unlock_irqrestore(&priv
->lock
, flags
);
2103 /* enable all interrupts */
2104 ipw_enable_interrupts(priv
);
2107 #define IPW_CMD(x) case IPW_CMD_ ## x : return #x
2108 static char *get_cmd_string(u8 cmd
)
2111 IPW_CMD(HOST_COMPLETE
);
2112 IPW_CMD(POWER_DOWN
);
2113 IPW_CMD(SYSTEM_CONFIG
);
2114 IPW_CMD(MULTICAST_ADDRESS
);
2116 IPW_CMD(ADAPTER_ADDRESS
);
2118 IPW_CMD(RTS_THRESHOLD
);
2119 IPW_CMD(FRAG_THRESHOLD
);
2120 IPW_CMD(POWER_MODE
);
2122 IPW_CMD(TGI_TX_KEY
);
2123 IPW_CMD(SCAN_REQUEST
);
2124 IPW_CMD(SCAN_REQUEST_EXT
);
2126 IPW_CMD(SUPPORTED_RATES
);
2127 IPW_CMD(SCAN_ABORT
);
2129 IPW_CMD(QOS_PARAMETERS
);
2130 IPW_CMD(DINO_CONFIG
);
2131 IPW_CMD(RSN_CAPABILITIES
);
2133 IPW_CMD(CARD_DISABLE
);
2134 IPW_CMD(SEED_NUMBER
);
2136 IPW_CMD(COUNTRY_INFO
);
2137 IPW_CMD(AIRONET_INFO
);
2138 IPW_CMD(AP_TX_POWER
);
2140 IPW_CMD(CCX_VER_INFO
);
2141 IPW_CMD(SET_CALIBRATION
);
2142 IPW_CMD(SENSITIVITY_CALIB
);
2143 IPW_CMD(RETRY_LIMIT
);
2144 IPW_CMD(IPW_PRE_POWER_DOWN
);
2145 IPW_CMD(VAP_BEACON_TEMPLATE
);
2146 IPW_CMD(VAP_DTIM_PERIOD
);
2147 IPW_CMD(EXT_SUPPORTED_RATES
);
2148 IPW_CMD(VAP_LOCAL_TX_PWR_CONSTRAINT
);
2149 IPW_CMD(VAP_QUIET_INTERVALS
);
2150 IPW_CMD(VAP_CHANNEL_SWITCH
);
2151 IPW_CMD(VAP_MANDATORY_CHANNELS
);
2152 IPW_CMD(VAP_CELL_PWR_LIMIT
);
2153 IPW_CMD(VAP_CF_PARAM_SET
);
2154 IPW_CMD(VAP_SET_BEACONING_STATE
);
2155 IPW_CMD(MEASUREMENT
);
2156 IPW_CMD(POWER_CAPABILITY
);
2157 IPW_CMD(SUPPORTED_CHANNELS
);
2158 IPW_CMD(TPC_REPORT
);
2160 IPW_CMD(PRODUCTION_COMMAND
);
2166 #define HOST_COMPLETE_TIMEOUT HZ
2168 static int __ipw_send_cmd(struct ipw_priv
*priv
, struct host_cmd
*cmd
)
2171 unsigned long flags
;
2172 unsigned long now
, end
;
2174 spin_lock_irqsave(&priv
->lock
, flags
);
2175 if (priv
->status
& STATUS_HCMD_ACTIVE
) {
2176 IPW_ERROR("Failed to send %s: Already sending a command.\n",
2177 get_cmd_string(cmd
->cmd
));
2178 spin_unlock_irqrestore(&priv
->lock
, flags
);
2182 priv
->status
|= STATUS_HCMD_ACTIVE
;
2185 priv
->cmdlog
[priv
->cmdlog_pos
].jiffies
= jiffies
;
2186 priv
->cmdlog
[priv
->cmdlog_pos
].cmd
.cmd
= cmd
->cmd
;
2187 priv
->cmdlog
[priv
->cmdlog_pos
].cmd
.len
= cmd
->len
;
2188 memcpy(priv
->cmdlog
[priv
->cmdlog_pos
].cmd
.param
, cmd
->param
,
2190 priv
->cmdlog
[priv
->cmdlog_pos
].retcode
= -1;
2193 IPW_DEBUG_HC("%s command (#%d) %d bytes: 0x%08X\n",
2194 get_cmd_string(cmd
->cmd
), cmd
->cmd
, cmd
->len
,
2197 #ifndef DEBUG_CMD_WEP_KEY
2198 if (cmd
->cmd
== IPW_CMD_WEP_KEY
)
2199 IPW_DEBUG_HC("WEP_KEY command masked out for secure.\n");
2202 printk_buf(IPW_DL_HOST_COMMAND
, (u8
*) cmd
->param
, cmd
->len
);
2204 rc
= ipw_queue_tx_hcmd(priv
, cmd
->cmd
, cmd
->param
, cmd
->len
, 0);
2206 priv
->status
&= ~STATUS_HCMD_ACTIVE
;
2207 IPW_ERROR("Failed to send %s: Reason %d\n",
2208 get_cmd_string(cmd
->cmd
), rc
);
2209 spin_unlock_irqrestore(&priv
->lock
, flags
);
2212 spin_unlock_irqrestore(&priv
->lock
, flags
);
2215 end
= now
+ HOST_COMPLETE_TIMEOUT
;
2217 rc
= wait_event_interruptible_timeout(priv
->wait_command_queue
,
2219 status
& STATUS_HCMD_ACTIVE
),
2223 if (time_before(now
, end
))
2229 spin_lock_irqsave(&priv
->lock
, flags
);
2230 if (priv
->status
& STATUS_HCMD_ACTIVE
) {
2231 IPW_ERROR("Failed to send %s: Command timed out.\n",
2232 get_cmd_string(cmd
->cmd
));
2233 priv
->status
&= ~STATUS_HCMD_ACTIVE
;
2234 spin_unlock_irqrestore(&priv
->lock
, flags
);
2238 spin_unlock_irqrestore(&priv
->lock
, flags
);
2242 if (priv
->status
& STATUS_RF_KILL_HW
) {
2243 IPW_ERROR("Failed to send %s: Aborted due to RF kill switch.\n",
2244 get_cmd_string(cmd
->cmd
));
2251 priv
->cmdlog
[priv
->cmdlog_pos
++].retcode
= rc
;
2252 priv
->cmdlog_pos
%= priv
->cmdlog_len
;
2257 static int ipw_send_cmd_simple(struct ipw_priv
*priv
, u8 command
)
2259 struct host_cmd cmd
= {
2263 return __ipw_send_cmd(priv
, &cmd
);
2266 static int ipw_send_cmd_pdu(struct ipw_priv
*priv
, u8 command
, u8 len
,
2269 struct host_cmd cmd
= {
2275 return __ipw_send_cmd(priv
, &cmd
);
2278 static int ipw_send_host_complete(struct ipw_priv
*priv
)
2281 IPW_ERROR("Invalid args\n");
2285 return ipw_send_cmd_simple(priv
, IPW_CMD_HOST_COMPLETE
);
2288 static int ipw_send_system_config(struct ipw_priv
*priv
)
2290 return ipw_send_cmd_pdu(priv
, IPW_CMD_SYSTEM_CONFIG
,
2291 sizeof(priv
->sys_config
),
2295 static int ipw_send_ssid(struct ipw_priv
*priv
, u8
* ssid
, int len
)
2297 if (!priv
|| !ssid
) {
2298 IPW_ERROR("Invalid args\n");
2302 return ipw_send_cmd_pdu(priv
, IPW_CMD_SSID
, min(len
, IW_ESSID_MAX_SIZE
),
2306 static int ipw_send_adapter_address(struct ipw_priv
*priv
, u8
* mac
)
2308 if (!priv
|| !mac
) {
2309 IPW_ERROR("Invalid args\n");
2313 IPW_DEBUG_INFO("%s: Setting MAC to %pM\n",
2314 priv
->net_dev
->name
, mac
);
2316 return ipw_send_cmd_pdu(priv
, IPW_CMD_ADAPTER_ADDRESS
, ETH_ALEN
, mac
);
2319 static void ipw_adapter_restart(void *adapter
)
2321 struct ipw_priv
*priv
= adapter
;
2323 if (priv
->status
& STATUS_RF_KILL_MASK
)
2328 if (priv
->assoc_network
&&
2329 (priv
->assoc_network
->capability
& WLAN_CAPABILITY_IBSS
))
2330 ipw_remove_current_network(priv
);
2333 IPW_ERROR("Failed to up device\n");
2338 static void ipw_bg_adapter_restart(struct work_struct
*work
)
2340 struct ipw_priv
*priv
=
2341 container_of(work
, struct ipw_priv
, adapter_restart
);
2342 mutex_lock(&priv
->mutex
);
2343 ipw_adapter_restart(priv
);
2344 mutex_unlock(&priv
->mutex
);
2347 static void ipw_abort_scan(struct ipw_priv
*priv
);
2349 #define IPW_SCAN_CHECK_WATCHDOG (5 * HZ)
2351 static void ipw_scan_check(void *data
)
2353 struct ipw_priv
*priv
= data
;
2355 if (priv
->status
& STATUS_SCAN_ABORTING
) {
2356 IPW_DEBUG_SCAN("Scan completion watchdog resetting "
2357 "adapter after (%dms).\n",
2358 jiffies_to_msecs(IPW_SCAN_CHECK_WATCHDOG
));
2359 schedule_work(&priv
->adapter_restart
);
2360 } else if (priv
->status
& STATUS_SCANNING
) {
2361 IPW_DEBUG_SCAN("Scan completion watchdog aborting scan "
2363 jiffies_to_msecs(IPW_SCAN_CHECK_WATCHDOG
));
2364 ipw_abort_scan(priv
);
2365 schedule_delayed_work(&priv
->scan_check
, HZ
);
2369 static void ipw_bg_scan_check(struct work_struct
*work
)
2371 struct ipw_priv
*priv
=
2372 container_of(work
, struct ipw_priv
, scan_check
.work
);
2373 mutex_lock(&priv
->mutex
);
2374 ipw_scan_check(priv
);
2375 mutex_unlock(&priv
->mutex
);
2378 static int ipw_send_scan_request_ext(struct ipw_priv
*priv
,
2379 struct ipw_scan_request_ext
*request
)
2381 return ipw_send_cmd_pdu(priv
, IPW_CMD_SCAN_REQUEST_EXT
,
2382 sizeof(*request
), request
);
2385 static int ipw_send_scan_abort(struct ipw_priv
*priv
)
2388 IPW_ERROR("Invalid args\n");
2392 return ipw_send_cmd_simple(priv
, IPW_CMD_SCAN_ABORT
);
2395 static int ipw_set_sensitivity(struct ipw_priv
*priv
, u16 sens
)
2397 struct ipw_sensitivity_calib calib
= {
2398 .beacon_rssi_raw
= cpu_to_le16(sens
),
2401 return ipw_send_cmd_pdu(priv
, IPW_CMD_SENSITIVITY_CALIB
, sizeof(calib
),
2405 static int ipw_send_associate(struct ipw_priv
*priv
,
2406 struct ipw_associate
*associate
)
2408 if (!priv
|| !associate
) {
2409 IPW_ERROR("Invalid args\n");
2413 return ipw_send_cmd_pdu(priv
, IPW_CMD_ASSOCIATE
, sizeof(*associate
),
2417 static int ipw_send_supported_rates(struct ipw_priv
*priv
,
2418 struct ipw_supported_rates
*rates
)
2420 if (!priv
|| !rates
) {
2421 IPW_ERROR("Invalid args\n");
2425 return ipw_send_cmd_pdu(priv
, IPW_CMD_SUPPORTED_RATES
, sizeof(*rates
),
2429 static int ipw_set_random_seed(struct ipw_priv
*priv
)
2434 IPW_ERROR("Invalid args\n");
2438 get_random_bytes(&val
, sizeof(val
));
2440 return ipw_send_cmd_pdu(priv
, IPW_CMD_SEED_NUMBER
, sizeof(val
), &val
);
2443 static int ipw_send_card_disable(struct ipw_priv
*priv
, u32 phy_off
)
2445 __le32 v
= cpu_to_le32(phy_off
);
2447 IPW_ERROR("Invalid args\n");
2451 return ipw_send_cmd_pdu(priv
, IPW_CMD_CARD_DISABLE
, sizeof(v
), &v
);
2454 static int ipw_send_tx_power(struct ipw_priv
*priv
, struct ipw_tx_power
*power
)
2456 if (!priv
|| !power
) {
2457 IPW_ERROR("Invalid args\n");
2461 return ipw_send_cmd_pdu(priv
, IPW_CMD_TX_POWER
, sizeof(*power
), power
);
2464 static int ipw_set_tx_power(struct ipw_priv
*priv
)
2466 const struct libipw_geo
*geo
= libipw_get_geo(priv
->ieee
);
2467 struct ipw_tx_power tx_power
;
2471 memset(&tx_power
, 0, sizeof(tx_power
));
2473 /* configure device for 'G' band */
2474 tx_power
.ieee_mode
= IPW_G_MODE
;
2475 tx_power
.num_channels
= geo
->bg_channels
;
2476 for (i
= 0; i
< geo
->bg_channels
; i
++) {
2477 max_power
= geo
->bg
[i
].max_power
;
2478 tx_power
.channels_tx_power
[i
].channel_number
=
2480 tx_power
.channels_tx_power
[i
].tx_power
= max_power
?
2481 min(max_power
, priv
->tx_power
) : priv
->tx_power
;
2483 if (ipw_send_tx_power(priv
, &tx_power
))
2486 /* configure device to also handle 'B' band */
2487 tx_power
.ieee_mode
= IPW_B_MODE
;
2488 if (ipw_send_tx_power(priv
, &tx_power
))
2491 /* configure device to also handle 'A' band */
2492 if (priv
->ieee
->abg_true
) {
2493 tx_power
.ieee_mode
= IPW_A_MODE
;
2494 tx_power
.num_channels
= geo
->a_channels
;
2495 for (i
= 0; i
< tx_power
.num_channels
; i
++) {
2496 max_power
= geo
->a
[i
].max_power
;
2497 tx_power
.channels_tx_power
[i
].channel_number
=
2499 tx_power
.channels_tx_power
[i
].tx_power
= max_power
?
2500 min(max_power
, priv
->tx_power
) : priv
->tx_power
;
2502 if (ipw_send_tx_power(priv
, &tx_power
))
2508 static int ipw_send_rts_threshold(struct ipw_priv
*priv
, u16 rts
)
2510 struct ipw_rts_threshold rts_threshold
= {
2511 .rts_threshold
= cpu_to_le16(rts
),
2515 IPW_ERROR("Invalid args\n");
2519 return ipw_send_cmd_pdu(priv
, IPW_CMD_RTS_THRESHOLD
,
2520 sizeof(rts_threshold
), &rts_threshold
);
2523 static int ipw_send_frag_threshold(struct ipw_priv
*priv
, u16 frag
)
2525 struct ipw_frag_threshold frag_threshold
= {
2526 .frag_threshold
= cpu_to_le16(frag
),
2530 IPW_ERROR("Invalid args\n");
2534 return ipw_send_cmd_pdu(priv
, IPW_CMD_FRAG_THRESHOLD
,
2535 sizeof(frag_threshold
), &frag_threshold
);
2538 static int ipw_send_power_mode(struct ipw_priv
*priv
, u32 mode
)
2543 IPW_ERROR("Invalid args\n");
2547 /* If on battery, set to 3, if AC set to CAM, else user
2550 case IPW_POWER_BATTERY
:
2551 param
= cpu_to_le32(IPW_POWER_INDEX_3
);
2554 param
= cpu_to_le32(IPW_POWER_MODE_CAM
);
2557 param
= cpu_to_le32(mode
);
2561 return ipw_send_cmd_pdu(priv
, IPW_CMD_POWER_MODE
, sizeof(param
),
2565 static int ipw_send_retry_limit(struct ipw_priv
*priv
, u8 slimit
, u8 llimit
)
2567 struct ipw_retry_limit retry_limit
= {
2568 .short_retry_limit
= slimit
,
2569 .long_retry_limit
= llimit
2573 IPW_ERROR("Invalid args\n");
2577 return ipw_send_cmd_pdu(priv
, IPW_CMD_RETRY_LIMIT
, sizeof(retry_limit
),
2582 * The IPW device contains a Microwire compatible EEPROM that stores
2583 * various data like the MAC address. Usually the firmware has exclusive
2584 * access to the eeprom, but during device initialization (before the
2585 * device driver has sent the HostComplete command to the firmware) the
2586 * device driver has read access to the EEPROM by way of indirect addressing
2587 * through a couple of memory mapped registers.
2589 * The following is a simplified implementation for pulling data out of the
2590 * the eeprom, along with some helper functions to find information in
2591 * the per device private data's copy of the eeprom.
2593 * NOTE: To better understand how these functions work (i.e what is a chip
2594 * select and why do have to keep driving the eeprom clock?), read
2595 * just about any data sheet for a Microwire compatible EEPROM.
2598 /* write a 32 bit value into the indirect accessor register */
2599 static inline void eeprom_write_reg(struct ipw_priv
*p
, u32 data
)
2601 ipw_write_reg32(p
, FW_MEM_REG_EEPROM_ACCESS
, data
);
2603 /* the eeprom requires some time to complete the operation */
2604 udelay(p
->eeprom_delay
);
2607 /* perform a chip select operation */
2608 static void eeprom_cs(struct ipw_priv
*priv
)
2610 eeprom_write_reg(priv
, 0);
2611 eeprom_write_reg(priv
, EEPROM_BIT_CS
);
2612 eeprom_write_reg(priv
, EEPROM_BIT_CS
| EEPROM_BIT_SK
);
2613 eeprom_write_reg(priv
, EEPROM_BIT_CS
);
2616 /* perform a chip select operation */
2617 static void eeprom_disable_cs(struct ipw_priv
*priv
)
2619 eeprom_write_reg(priv
, EEPROM_BIT_CS
);
2620 eeprom_write_reg(priv
, 0);
2621 eeprom_write_reg(priv
, EEPROM_BIT_SK
);
2624 /* push a single bit down to the eeprom */
2625 static inline void eeprom_write_bit(struct ipw_priv
*p
, u8 bit
)
2627 int d
= (bit
? EEPROM_BIT_DI
: 0);
2628 eeprom_write_reg(p
, EEPROM_BIT_CS
| d
);
2629 eeprom_write_reg(p
, EEPROM_BIT_CS
| d
| EEPROM_BIT_SK
);
2632 /* push an opcode followed by an address down to the eeprom */
2633 static void eeprom_op(struct ipw_priv
*priv
, u8 op
, u8 addr
)
2638 eeprom_write_bit(priv
, 1);
2639 eeprom_write_bit(priv
, op
& 2);
2640 eeprom_write_bit(priv
, op
& 1);
2641 for (i
= 7; i
>= 0; i
--) {
2642 eeprom_write_bit(priv
, addr
& (1 << i
));
2646 /* pull 16 bits off the eeprom, one bit at a time */
2647 static u16
eeprom_read_u16(struct ipw_priv
*priv
, u8 addr
)
2652 /* Send READ Opcode */
2653 eeprom_op(priv
, EEPROM_CMD_READ
, addr
);
2655 /* Send dummy bit */
2656 eeprom_write_reg(priv
, EEPROM_BIT_CS
);
2658 /* Read the byte off the eeprom one bit at a time */
2659 for (i
= 0; i
< 16; i
++) {
2661 eeprom_write_reg(priv
, EEPROM_BIT_CS
| EEPROM_BIT_SK
);
2662 eeprom_write_reg(priv
, EEPROM_BIT_CS
);
2663 data
= ipw_read_reg32(priv
, FW_MEM_REG_EEPROM_ACCESS
);
2664 r
= (r
<< 1) | ((data
& EEPROM_BIT_DO
) ? 1 : 0);
2667 /* Send another dummy bit */
2668 eeprom_write_reg(priv
, 0);
2669 eeprom_disable_cs(priv
);
2674 /* helper function for pulling the mac address out of the private */
2675 /* data's copy of the eeprom data */
2676 static void eeprom_parse_mac(struct ipw_priv
*priv
, u8
* mac
)
2678 memcpy(mac
, &priv
->eeprom
[EEPROM_MAC_ADDRESS
], ETH_ALEN
);
2681 static void ipw_read_eeprom(struct ipw_priv
*priv
)
2684 __le16
*eeprom
= (__le16
*) priv
->eeprom
;
2686 IPW_DEBUG_TRACE(">>\n");
2688 /* read entire contents of eeprom into private buffer */
2689 for (i
= 0; i
< 128; i
++)
2690 eeprom
[i
] = cpu_to_le16(eeprom_read_u16(priv
, (u8
) i
));
2692 IPW_DEBUG_TRACE("<<\n");
2696 * Either the device driver (i.e. the host) or the firmware can
2697 * load eeprom data into the designated region in SRAM. If neither
2698 * happens then the FW will shutdown with a fatal error.
2700 * In order to signal the FW to load the EEPROM, the EEPROM_LOAD_DISABLE
2701 * bit needs region of shared SRAM needs to be non-zero.
2703 static void ipw_eeprom_init_sram(struct ipw_priv
*priv
)
2707 IPW_DEBUG_TRACE(">>\n");
2710 If the data looks correct, then copy it to our private
2711 copy. Otherwise let the firmware know to perform the operation
2714 if (priv
->eeprom
[EEPROM_VERSION
] != 0) {
2715 IPW_DEBUG_INFO("Writing EEPROM data into SRAM\n");
2717 /* write the eeprom data to sram */
2718 for (i
= 0; i
< IPW_EEPROM_IMAGE_SIZE
; i
++)
2719 ipw_write8(priv
, IPW_EEPROM_DATA
+ i
, priv
->eeprom
[i
]);
2721 /* Do not load eeprom data on fatal error or suspend */
2722 ipw_write32(priv
, IPW_EEPROM_LOAD_DISABLE
, 0);
2724 IPW_DEBUG_INFO("Enabling FW initialization of SRAM\n");
2726 /* Load eeprom data on fatal error or suspend */
2727 ipw_write32(priv
, IPW_EEPROM_LOAD_DISABLE
, 1);
2730 IPW_DEBUG_TRACE("<<\n");
2733 static void ipw_zero_memory(struct ipw_priv
*priv
, u32 start
, u32 count
)
2738 _ipw_write32(priv
, IPW_AUTOINC_ADDR
, start
);
2740 _ipw_write32(priv
, IPW_AUTOINC_DATA
, 0);
2743 static inline void ipw_fw_dma_reset_command_blocks(struct ipw_priv
*priv
)
2745 ipw_zero_memory(priv
, IPW_SHARED_SRAM_DMA_CONTROL
,
2746 CB_NUMBER_OF_ELEMENTS_SMALL
*
2747 sizeof(struct command_block
));
2750 static int ipw_fw_dma_enable(struct ipw_priv
*priv
)
2751 { /* start dma engine but no transfers yet */
2753 IPW_DEBUG_FW(">> :\n");
2756 ipw_fw_dma_reset_command_blocks(priv
);
2758 /* Write CB base address */
2759 ipw_write_reg32(priv
, IPW_DMA_I_CB_BASE
, IPW_SHARED_SRAM_DMA_CONTROL
);
2761 IPW_DEBUG_FW("<< :\n");
2765 static void ipw_fw_dma_abort(struct ipw_priv
*priv
)
2769 IPW_DEBUG_FW(">> :\n");
2771 /* set the Stop and Abort bit */
2772 control
= DMA_CONTROL_SMALL_CB_CONST_VALUE
| DMA_CB_STOP_AND_ABORT
;
2773 ipw_write_reg32(priv
, IPW_DMA_I_DMA_CONTROL
, control
);
2774 priv
->sram_desc
.last_cb_index
= 0;
2776 IPW_DEBUG_FW("<<\n");
2779 static int ipw_fw_dma_write_command_block(struct ipw_priv
*priv
, int index
,
2780 struct command_block
*cb
)
2783 IPW_SHARED_SRAM_DMA_CONTROL
+
2784 (sizeof(struct command_block
) * index
);
2785 IPW_DEBUG_FW(">> :\n");
2787 ipw_write_indirect(priv
, address
, (u8
*) cb
,
2788 (int)sizeof(struct command_block
));
2790 IPW_DEBUG_FW("<< :\n");
2795 static int ipw_fw_dma_kick(struct ipw_priv
*priv
)
2800 IPW_DEBUG_FW(">> :\n");
2802 for (index
= 0; index
< priv
->sram_desc
.last_cb_index
; index
++)
2803 ipw_fw_dma_write_command_block(priv
, index
,
2804 &priv
->sram_desc
.cb_list
[index
]);
2806 /* Enable the DMA in the CSR register */
2807 ipw_clear_bit(priv
, IPW_RESET_REG
,
2808 IPW_RESET_REG_MASTER_DISABLED
|
2809 IPW_RESET_REG_STOP_MASTER
);
2811 /* Set the Start bit. */
2812 control
= DMA_CONTROL_SMALL_CB_CONST_VALUE
| DMA_CB_START
;
2813 ipw_write_reg32(priv
, IPW_DMA_I_DMA_CONTROL
, control
);
2815 IPW_DEBUG_FW("<< :\n");
2819 static void ipw_fw_dma_dump_command_block(struct ipw_priv
*priv
)
2822 u32 register_value
= 0;
2823 u32 cb_fields_address
= 0;
2825 IPW_DEBUG_FW(">> :\n");
2826 address
= ipw_read_reg32(priv
, IPW_DMA_I_CURRENT_CB
);
2827 IPW_DEBUG_FW_INFO("Current CB is 0x%x\n", address
);
2829 /* Read the DMA Controlor register */
2830 register_value
= ipw_read_reg32(priv
, IPW_DMA_I_DMA_CONTROL
);
2831 IPW_DEBUG_FW_INFO("IPW_DMA_I_DMA_CONTROL is 0x%x\n", register_value
);
2833 /* Print the CB values */
2834 cb_fields_address
= address
;
2835 register_value
= ipw_read_reg32(priv
, cb_fields_address
);
2836 IPW_DEBUG_FW_INFO("Current CB Control Field is 0x%x\n", register_value
);
2838 cb_fields_address
+= sizeof(u32
);
2839 register_value
= ipw_read_reg32(priv
, cb_fields_address
);
2840 IPW_DEBUG_FW_INFO("Current CB Source Field is 0x%x\n", register_value
);
2842 cb_fields_address
+= sizeof(u32
);
2843 register_value
= ipw_read_reg32(priv
, cb_fields_address
);
2844 IPW_DEBUG_FW_INFO("Current CB Destination Field is 0x%x\n",
2847 cb_fields_address
+= sizeof(u32
);
2848 register_value
= ipw_read_reg32(priv
, cb_fields_address
);
2849 IPW_DEBUG_FW_INFO("Current CB Status Field is 0x%x\n", register_value
);
2851 IPW_DEBUG_FW(">> :\n");
2854 static int ipw_fw_dma_command_block_index(struct ipw_priv
*priv
)
2856 u32 current_cb_address
= 0;
2857 u32 current_cb_index
= 0;
2859 IPW_DEBUG_FW("<< :\n");
2860 current_cb_address
= ipw_read_reg32(priv
, IPW_DMA_I_CURRENT_CB
);
2862 current_cb_index
= (current_cb_address
- IPW_SHARED_SRAM_DMA_CONTROL
) /
2863 sizeof(struct command_block
);
2865 IPW_DEBUG_FW_INFO("Current CB index 0x%x address = 0x%X\n",
2866 current_cb_index
, current_cb_address
);
2868 IPW_DEBUG_FW(">> :\n");
2869 return current_cb_index
;
2873 static int ipw_fw_dma_add_command_block(struct ipw_priv
*priv
,
2877 int interrupt_enabled
, int is_last
)
2880 u32 control
= CB_VALID
| CB_SRC_LE
| CB_DEST_LE
| CB_SRC_AUTOINC
|
2881 CB_SRC_IO_GATED
| CB_DEST_AUTOINC
| CB_SRC_SIZE_LONG
|
2883 struct command_block
*cb
;
2884 u32 last_cb_element
= 0;
2886 IPW_DEBUG_FW_INFO("src_address=0x%x dest_address=0x%x length=0x%x\n",
2887 src_address
, dest_address
, length
);
2889 if (priv
->sram_desc
.last_cb_index
>= CB_NUMBER_OF_ELEMENTS_SMALL
)
2892 last_cb_element
= priv
->sram_desc
.last_cb_index
;
2893 cb
= &priv
->sram_desc
.cb_list
[last_cb_element
];
2894 priv
->sram_desc
.last_cb_index
++;
2896 /* Calculate the new CB control word */
2897 if (interrupt_enabled
)
2898 control
|= CB_INT_ENABLED
;
2901 control
|= CB_LAST_VALID
;
2905 /* Calculate the CB Element's checksum value */
2906 cb
->status
= control
^ src_address
^ dest_address
;
2908 /* Copy the Source and Destination addresses */
2909 cb
->dest_addr
= dest_address
;
2910 cb
->source_addr
= src_address
;
2912 /* Copy the Control Word last */
2913 cb
->control
= control
;
2918 static int ipw_fw_dma_add_buffer(struct ipw_priv
*priv
, dma_addr_t
*src_address
,
2919 int nr
, u32 dest_address
, u32 len
)
2924 IPW_DEBUG_FW(">>\n");
2925 IPW_DEBUG_FW_INFO("nr=%d dest_address=0x%x len=0x%x\n",
2926 nr
, dest_address
, len
);
2928 for (i
= 0; i
< nr
; i
++) {
2929 size
= min_t(u32
, len
- i
* CB_MAX_LENGTH
, CB_MAX_LENGTH
);
2930 ret
= ipw_fw_dma_add_command_block(priv
, src_address
[i
],
2932 i
* CB_MAX_LENGTH
, size
,
2935 IPW_DEBUG_FW_INFO(": Failed\n");
2938 IPW_DEBUG_FW_INFO(": Added new cb\n");
2941 IPW_DEBUG_FW("<<\n");
2945 static int ipw_fw_dma_wait(struct ipw_priv
*priv
)
2947 u32 current_index
= 0, previous_index
;
2950 IPW_DEBUG_FW(">> :\n");
2952 current_index
= ipw_fw_dma_command_block_index(priv
);
2953 IPW_DEBUG_FW_INFO("sram_desc.last_cb_index:0x%08X\n",
2954 (int)priv
->sram_desc
.last_cb_index
);
2956 while (current_index
< priv
->sram_desc
.last_cb_index
) {
2958 previous_index
= current_index
;
2959 current_index
= ipw_fw_dma_command_block_index(priv
);
2961 if (previous_index
< current_index
) {
2965 if (++watchdog
> 400) {
2966 IPW_DEBUG_FW_INFO("Timeout\n");
2967 ipw_fw_dma_dump_command_block(priv
);
2968 ipw_fw_dma_abort(priv
);
2973 ipw_fw_dma_abort(priv
);
2975 /*Disable the DMA in the CSR register */
2976 ipw_set_bit(priv
, IPW_RESET_REG
,
2977 IPW_RESET_REG_MASTER_DISABLED
| IPW_RESET_REG_STOP_MASTER
);
2979 IPW_DEBUG_FW("<< dmaWaitSync\n");
2983 static void ipw_remove_current_network(struct ipw_priv
*priv
)
2985 struct list_head
*element
, *safe
;
2986 struct libipw_network
*network
= NULL
;
2987 unsigned long flags
;
2989 spin_lock_irqsave(&priv
->ieee
->lock
, flags
);
2990 list_for_each_safe(element
, safe
, &priv
->ieee
->network_list
) {
2991 network
= list_entry(element
, struct libipw_network
, list
);
2992 if (ether_addr_equal(network
->bssid
, priv
->bssid
)) {
2994 list_add_tail(&network
->list
,
2995 &priv
->ieee
->network_free_list
);
2998 spin_unlock_irqrestore(&priv
->ieee
->lock
, flags
);
3002 * Check that card is still alive.
3003 * Reads debug register from domain0.
3004 * If card is present, pre-defined value should
3008 * @return 1 if card is present, 0 otherwise
3010 static inline int ipw_alive(struct ipw_priv
*priv
)
3012 return ipw_read32(priv
, 0x90) == 0xd55555d5;
3015 /* timeout in msec, attempted in 10-msec quanta */
3016 static int ipw_poll_bit(struct ipw_priv
*priv
, u32 addr
, u32 mask
,
3022 if ((ipw_read32(priv
, addr
) & mask
) == mask
)
3026 } while (i
< timeout
);
3031 /* These functions load the firmware and micro code for the operation of
3032 * the ipw hardware. It assumes the buffer has all the bits for the
3033 * image and the caller is handling the memory allocation and clean up.
3036 static int ipw_stop_master(struct ipw_priv
*priv
)
3040 IPW_DEBUG_TRACE(">>\n");
3041 /* stop master. typical delay - 0 */
3042 ipw_set_bit(priv
, IPW_RESET_REG
, IPW_RESET_REG_STOP_MASTER
);
3044 /* timeout is in msec, polled in 10-msec quanta */
3045 rc
= ipw_poll_bit(priv
, IPW_RESET_REG
,
3046 IPW_RESET_REG_MASTER_DISABLED
, 100);
3048 IPW_ERROR("wait for stop master failed after 100ms\n");
3052 IPW_DEBUG_INFO("stop master %dms\n", rc
);
3057 static void ipw_arc_release(struct ipw_priv
*priv
)
3059 IPW_DEBUG_TRACE(">>\n");
3062 ipw_clear_bit(priv
, IPW_RESET_REG
, CBD_RESET_REG_PRINCETON_RESET
);
3064 /* no one knows timing, for safety add some delay */
3073 static int ipw_load_ucode(struct ipw_priv
*priv
, u8
* data
, size_t len
)
3075 int rc
= 0, i
, addr
;
3079 image
= (__le16
*) data
;
3081 IPW_DEBUG_TRACE(">>\n");
3083 rc
= ipw_stop_master(priv
);
3088 for (addr
= IPW_SHARED_LOWER_BOUND
;
3089 addr
< IPW_REGISTER_DOMAIN1_END
; addr
+= 4) {
3090 ipw_write32(priv
, addr
, 0);
3093 /* no ucode (yet) */
3094 memset(&priv
->dino_alive
, 0, sizeof(priv
->dino_alive
));
3095 /* destroy DMA queues */
3096 /* reset sequence */
3098 ipw_write_reg32(priv
, IPW_MEM_HALT_AND_RESET
, IPW_BIT_HALT_RESET_ON
);
3099 ipw_arc_release(priv
);
3100 ipw_write_reg32(priv
, IPW_MEM_HALT_AND_RESET
, IPW_BIT_HALT_RESET_OFF
);
3104 ipw_write_reg32(priv
, IPW_INTERNAL_CMD_EVENT
, IPW_BASEBAND_POWER_DOWN
);
3107 ipw_write_reg32(priv
, IPW_INTERNAL_CMD_EVENT
, 0);
3110 /* enable ucode store */
3111 ipw_write_reg8(priv
, IPW_BASEBAND_CONTROL_STATUS
, 0x0);
3112 ipw_write_reg8(priv
, IPW_BASEBAND_CONTROL_STATUS
, DINO_ENABLE_CS
);
3118 * Do NOT set indirect address register once and then
3119 * store data to indirect data register in the loop.
3120 * It seems very reasonable, but in this case DINO do not
3121 * accept ucode. It is essential to set address each time.
3123 /* load new ipw uCode */
3124 for (i
= 0; i
< len
/ 2; i
++)
3125 ipw_write_reg16(priv
, IPW_BASEBAND_CONTROL_STORE
,
3126 le16_to_cpu(image
[i
]));
3129 ipw_write_reg8(priv
, IPW_BASEBAND_CONTROL_STATUS
, 0);
3130 ipw_write_reg8(priv
, IPW_BASEBAND_CONTROL_STATUS
, DINO_ENABLE_SYSTEM
);
3132 /* this is where the igx / win driver deveates from the VAP driver. */
3134 /* wait for alive response */
3135 for (i
= 0; i
< 100; i
++) {
3136 /* poll for incoming data */
3137 cr
= ipw_read_reg8(priv
, IPW_BASEBAND_CONTROL_STATUS
);
3138 if (cr
& DINO_RXFIFO_DATA
)
3143 if (cr
& DINO_RXFIFO_DATA
) {
3144 /* alive_command_responce size is NOT multiple of 4 */
3145 __le32 response_buffer
[(sizeof(priv
->dino_alive
) + 3) / 4];
3147 for (i
= 0; i
< ARRAY_SIZE(response_buffer
); i
++)
3148 response_buffer
[i
] =
3149 cpu_to_le32(ipw_read_reg32(priv
,
3150 IPW_BASEBAND_RX_FIFO_READ
));
3151 memcpy(&priv
->dino_alive
, response_buffer
,
3152 sizeof(priv
->dino_alive
));
3153 if (priv
->dino_alive
.alive_command
== 1
3154 && priv
->dino_alive
.ucode_valid
== 1) {
3157 ("Microcode OK, rev. %d (0x%x) dev. %d (0x%x) "
3158 "of %02d/%02d/%02d %02d:%02d\n",
3159 priv
->dino_alive
.software_revision
,
3160 priv
->dino_alive
.software_revision
,
3161 priv
->dino_alive
.device_identifier
,
3162 priv
->dino_alive
.device_identifier
,
3163 priv
->dino_alive
.time_stamp
[0],
3164 priv
->dino_alive
.time_stamp
[1],
3165 priv
->dino_alive
.time_stamp
[2],
3166 priv
->dino_alive
.time_stamp
[3],
3167 priv
->dino_alive
.time_stamp
[4]);
3169 IPW_DEBUG_INFO("Microcode is not alive\n");
3173 IPW_DEBUG_INFO("No alive response from DINO\n");
3177 /* disable DINO, otherwise for some reason
3178 firmware have problem getting alive resp. */
3179 ipw_write_reg8(priv
, IPW_BASEBAND_CONTROL_STATUS
, 0);
3184 static int ipw_load_firmware(struct ipw_priv
*priv
, u8
* data
, size_t len
)
3188 struct fw_chunk
*chunk
;
3191 struct dma_pool
*pool
;
3195 IPW_DEBUG_TRACE("<< :\n");
3197 virts
= kmalloc_array(CB_NUMBER_OF_ELEMENTS_SMALL
, sizeof(void *),
3202 phys
= kmalloc_array(CB_NUMBER_OF_ELEMENTS_SMALL
, sizeof(dma_addr_t
),
3208 pool
= dma_pool_create("ipw2200", &priv
->pci_dev
->dev
, CB_MAX_LENGTH
, 0,
3211 IPW_ERROR("dma_pool_create failed\n");
3218 ret
= ipw_fw_dma_enable(priv
);
3220 /* the DMA is already ready this would be a bug. */
3221 BUG_ON(priv
->sram_desc
.last_cb_index
> 0);
3229 chunk
= (struct fw_chunk
*)(data
+ offset
);
3230 offset
+= sizeof(struct fw_chunk
);
3231 chunk_len
= le32_to_cpu(chunk
->length
);
3232 start
= data
+ offset
;
3234 nr
= (chunk_len
+ CB_MAX_LENGTH
- 1) / CB_MAX_LENGTH
;
3235 for (i
= 0; i
< nr
; i
++) {
3236 virts
[total_nr
] = dma_pool_alloc(pool
, GFP_KERNEL
,
3238 if (!virts
[total_nr
]) {
3242 size
= min_t(u32
, chunk_len
- i
* CB_MAX_LENGTH
,
3244 memcpy(virts
[total_nr
], start
, size
);
3247 /* We don't support fw chunk larger than 64*8K */
3248 BUG_ON(total_nr
> CB_NUMBER_OF_ELEMENTS_SMALL
);
3251 /* build DMA packet and queue up for sending */
3252 /* dma to chunk->address, the chunk->length bytes from data +
3255 ret
= ipw_fw_dma_add_buffer(priv
, &phys
[total_nr
- nr
],
3256 nr
, le32_to_cpu(chunk
->address
),
3259 IPW_DEBUG_INFO("dmaAddBuffer Failed\n");
3263 offset
+= chunk_len
;
3264 } while (offset
< len
);
3266 /* Run the DMA and wait for the answer */
3267 ret
= ipw_fw_dma_kick(priv
);
3269 IPW_ERROR("dmaKick Failed\n");
3273 ret
= ipw_fw_dma_wait(priv
);
3275 IPW_ERROR("dmaWaitSync Failed\n");
3279 for (i
= 0; i
< total_nr
; i
++)
3280 dma_pool_free(pool
, virts
[i
], phys
[i
]);
3282 dma_pool_destroy(pool
);
3290 static int ipw_stop_nic(struct ipw_priv
*priv
)
3295 ipw_write32(priv
, IPW_RESET_REG
, IPW_RESET_REG_STOP_MASTER
);
3297 rc
= ipw_poll_bit(priv
, IPW_RESET_REG
,
3298 IPW_RESET_REG_MASTER_DISABLED
, 500);
3300 IPW_ERROR("wait for reg master disabled failed after 500ms\n");
3304 ipw_set_bit(priv
, IPW_RESET_REG
, CBD_RESET_REG_PRINCETON_RESET
);
3309 static void ipw_start_nic(struct ipw_priv
*priv
)
3311 IPW_DEBUG_TRACE(">>\n");
3313 /* prvHwStartNic release ARC */
3314 ipw_clear_bit(priv
, IPW_RESET_REG
,
3315 IPW_RESET_REG_MASTER_DISABLED
|
3316 IPW_RESET_REG_STOP_MASTER
|
3317 CBD_RESET_REG_PRINCETON_RESET
);
3319 /* enable power management */
3320 ipw_set_bit(priv
, IPW_GP_CNTRL_RW
,
3321 IPW_GP_CNTRL_BIT_HOST_ALLOWS_STANDBY
);
3323 IPW_DEBUG_TRACE("<<\n");
3326 static int ipw_init_nic(struct ipw_priv
*priv
)
3330 IPW_DEBUG_TRACE(">>\n");
3333 /* set "initialization complete" bit to move adapter to D0 state */
3334 ipw_set_bit(priv
, IPW_GP_CNTRL_RW
, IPW_GP_CNTRL_BIT_INIT_DONE
);
3336 /* low-level PLL activation */
3337 ipw_write32(priv
, IPW_READ_INT_REGISTER
,
3338 IPW_BIT_INT_HOST_SRAM_READ_INT_REGISTER
);
3340 /* wait for clock stabilization */
3341 rc
= ipw_poll_bit(priv
, IPW_GP_CNTRL_RW
,
3342 IPW_GP_CNTRL_BIT_CLOCK_READY
, 250);
3344 IPW_DEBUG_INFO("FAILED wait for clock stablization\n");
3346 /* assert SW reset */
3347 ipw_set_bit(priv
, IPW_RESET_REG
, IPW_RESET_REG_SW_RESET
);
3351 /* set "initialization complete" bit to move adapter to D0 state */
3352 ipw_set_bit(priv
, IPW_GP_CNTRL_RW
, IPW_GP_CNTRL_BIT_INIT_DONE
);
3354 IPW_DEBUG_TRACE(">>\n");
3358 /* Call this function from process context, it will sleep in request_firmware.
3359 * Probe is an ok place to call this from.
3361 static int ipw_reset_nic(struct ipw_priv
*priv
)
3364 unsigned long flags
;
3366 IPW_DEBUG_TRACE(">>\n");
3368 rc
= ipw_init_nic(priv
);
3370 spin_lock_irqsave(&priv
->lock
, flags
);
3371 /* Clear the 'host command active' bit... */
3372 priv
->status
&= ~STATUS_HCMD_ACTIVE
;
3373 wake_up_interruptible(&priv
->wait_command_queue
);
3374 priv
->status
&= ~(STATUS_SCANNING
| STATUS_SCAN_ABORTING
);
3375 wake_up_interruptible(&priv
->wait_state
);
3376 spin_unlock_irqrestore(&priv
->lock
, flags
);
3378 IPW_DEBUG_TRACE("<<\n");
3391 static int ipw_get_fw(struct ipw_priv
*priv
,
3392 const struct firmware
**raw
, const char *name
)
3397 /* ask firmware_class module to get the boot firmware off disk */
3398 rc
= request_firmware(raw
, name
, &priv
->pci_dev
->dev
);
3400 IPW_ERROR("%s request_firmware failed: Reason %d\n", name
, rc
);
3404 if ((*raw
)->size
< sizeof(*fw
)) {
3405 IPW_ERROR("%s is too small (%zd)\n", name
, (*raw
)->size
);
3409 fw
= (void *)(*raw
)->data
;
3411 if ((*raw
)->size
< sizeof(*fw
) + le32_to_cpu(fw
->boot_size
) +
3412 le32_to_cpu(fw
->ucode_size
) + le32_to_cpu(fw
->fw_size
)) {
3413 IPW_ERROR("%s is too small or corrupt (%zd)\n",
3414 name
, (*raw
)->size
);
3418 IPW_DEBUG_INFO("Read firmware '%s' image v%d.%d (%zd bytes)\n",
3420 le32_to_cpu(fw
->ver
) >> 16,
3421 le32_to_cpu(fw
->ver
) & 0xff,
3422 (*raw
)->size
- sizeof(*fw
));
3426 #define IPW_RX_BUF_SIZE (3000)
3428 static void ipw_rx_queue_reset(struct ipw_priv
*priv
,
3429 struct ipw_rx_queue
*rxq
)
3431 unsigned long flags
;
3434 spin_lock_irqsave(&rxq
->lock
, flags
);
3436 INIT_LIST_HEAD(&rxq
->rx_free
);
3437 INIT_LIST_HEAD(&rxq
->rx_used
);
3439 /* Fill the rx_used queue with _all_ of the Rx buffers */
3440 for (i
= 0; i
< RX_FREE_BUFFERS
+ RX_QUEUE_SIZE
; i
++) {
3441 /* In the reset function, these buffers may have been allocated
3442 * to an SKB, so we need to unmap and free potential storage */
3443 if (rxq
->pool
[i
].skb
!= NULL
) {
3444 dma_unmap_single(&priv
->pci_dev
->dev
,
3445 rxq
->pool
[i
].dma_addr
,
3446 IPW_RX_BUF_SIZE
, DMA_FROM_DEVICE
);
3447 dev_kfree_skb(rxq
->pool
[i
].skb
);
3448 rxq
->pool
[i
].skb
= NULL
;
3450 list_add_tail(&rxq
->pool
[i
].list
, &rxq
->rx_used
);
3453 /* Set us so that we have processed and used all buffers, but have
3454 * not restocked the Rx queue with fresh buffers */
3455 rxq
->read
= rxq
->write
= 0;
3456 rxq
->free_count
= 0;
3457 spin_unlock_irqrestore(&rxq
->lock
, flags
);
3461 static int fw_loaded
= 0;
3462 static const struct firmware
*raw
= NULL
;
3464 static void free_firmware(void)
3467 release_firmware(raw
);
3473 #define free_firmware() do {} while (0)
3476 static int ipw_load(struct ipw_priv
*priv
)
3479 const struct firmware
*raw
= NULL
;
3482 u8
*boot_img
, *ucode_img
, *fw_img
;
3484 int rc
= 0, retries
= 3;
3486 switch (priv
->ieee
->iw_mode
) {
3488 name
= "ipw2200-ibss.fw";
3490 #ifdef CONFIG_IPW2200_MONITOR
3491 case IW_MODE_MONITOR
:
3492 name
= "ipw2200-sniffer.fw";
3496 name
= "ipw2200-bss.fw";
3508 rc
= ipw_get_fw(priv
, &raw
, name
);
3515 fw
= (void *)raw
->data
;
3516 boot_img
= &fw
->data
[0];
3517 ucode_img
= &fw
->data
[le32_to_cpu(fw
->boot_size
)];
3518 fw_img
= &fw
->data
[le32_to_cpu(fw
->boot_size
) +
3519 le32_to_cpu(fw
->ucode_size
)];
3522 priv
->rxq
= ipw_rx_queue_alloc(priv
);
3524 ipw_rx_queue_reset(priv
, priv
->rxq
);
3526 IPW_ERROR("Unable to initialize Rx queue\n");
3532 /* Ensure interrupts are disabled */
3533 ipw_write32(priv
, IPW_INTA_MASK_R
, ~IPW_INTA_MASK_ALL
);
3534 priv
->status
&= ~STATUS_INT_ENABLED
;
3536 /* ack pending interrupts */
3537 ipw_write32(priv
, IPW_INTA_RW
, IPW_INTA_MASK_ALL
);
3541 rc
= ipw_reset_nic(priv
);
3543 IPW_ERROR("Unable to reset NIC\n");
3547 ipw_zero_memory(priv
, IPW_NIC_SRAM_LOWER_BOUND
,
3548 IPW_NIC_SRAM_UPPER_BOUND
- IPW_NIC_SRAM_LOWER_BOUND
);
3550 /* DMA the initial boot firmware into the device */
3551 rc
= ipw_load_firmware(priv
, boot_img
, le32_to_cpu(fw
->boot_size
));
3553 IPW_ERROR("Unable to load boot firmware: %d\n", rc
);
3557 /* kick start the device */
3558 ipw_start_nic(priv
);
3560 /* wait for the device to finish its initial startup sequence */
3561 rc
= ipw_poll_bit(priv
, IPW_INTA_RW
,
3562 IPW_INTA_BIT_FW_INITIALIZATION_DONE
, 500);
3564 IPW_ERROR("device failed to boot initial fw image\n");
3567 IPW_DEBUG_INFO("initial device response after %dms\n", rc
);
3569 /* ack fw init done interrupt */
3570 ipw_write32(priv
, IPW_INTA_RW
, IPW_INTA_BIT_FW_INITIALIZATION_DONE
);
3572 /* DMA the ucode into the device */
3573 rc
= ipw_load_ucode(priv
, ucode_img
, le32_to_cpu(fw
->ucode_size
));
3575 IPW_ERROR("Unable to load ucode: %d\n", rc
);
3582 /* DMA bss firmware into the device */
3583 rc
= ipw_load_firmware(priv
, fw_img
, le32_to_cpu(fw
->fw_size
));
3585 IPW_ERROR("Unable to load firmware: %d\n", rc
);
3592 ipw_write32(priv
, IPW_EEPROM_LOAD_DISABLE
, 0);
3594 rc
= ipw_queue_reset(priv
);
3596 IPW_ERROR("Unable to initialize queues\n");
3600 /* Ensure interrupts are disabled */
3601 ipw_write32(priv
, IPW_INTA_MASK_R
, ~IPW_INTA_MASK_ALL
);
3602 /* ack pending interrupts */
3603 ipw_write32(priv
, IPW_INTA_RW
, IPW_INTA_MASK_ALL
);
3605 /* kick start the device */
3606 ipw_start_nic(priv
);
3608 if (ipw_read32(priv
, IPW_INTA_RW
) & IPW_INTA_BIT_PARITY_ERROR
) {
3610 IPW_WARNING("Parity error. Retrying init.\n");
3615 IPW_ERROR("TODO: Handle parity error -- schedule restart?\n");
3620 /* wait for the device */
3621 rc
= ipw_poll_bit(priv
, IPW_INTA_RW
,
3622 IPW_INTA_BIT_FW_INITIALIZATION_DONE
, 500);
3624 IPW_ERROR("device failed to start within 500ms\n");
3627 IPW_DEBUG_INFO("device response after %dms\n", rc
);
3629 /* ack fw init done interrupt */
3630 ipw_write32(priv
, IPW_INTA_RW
, IPW_INTA_BIT_FW_INITIALIZATION_DONE
);
3632 /* read eeprom data */
3633 priv
->eeprom_delay
= 1;
3634 ipw_read_eeprom(priv
);
3635 /* initialize the eeprom region of sram */
3636 ipw_eeprom_init_sram(priv
);
3638 /* enable interrupts */
3639 ipw_enable_interrupts(priv
);
3641 /* Ensure our queue has valid packets */
3642 ipw_rx_queue_replenish(priv
);
3644 ipw_write32(priv
, IPW_RX_READ_INDEX
, priv
->rxq
->read
);
3646 /* ack pending interrupts */
3647 ipw_write32(priv
, IPW_INTA_RW
, IPW_INTA_MASK_ALL
);
3650 release_firmware(raw
);
3656 ipw_rx_queue_free(priv
, priv
->rxq
);
3659 ipw_tx_queue_free(priv
);
3660 release_firmware(raw
);
3672 * Theory of operation
3674 * A queue is a circular buffers with 'Read' and 'Write' pointers.
3675 * 2 empty entries always kept in the buffer to protect from overflow.
3677 * For Tx queue, there are low mark and high mark limits. If, after queuing
3678 * the packet for Tx, free space become < low mark, Tx queue stopped. When
3679 * reclaiming packets (on 'tx done IRQ), if free space become > high mark,
3682 * The IPW operates with six queues, one receive queue in the device's
3683 * sram, one transmit queue for sending commands to the device firmware,
3684 * and four transmit queues for data.
3686 * The four transmit queues allow for performing quality of service (qos)
3687 * transmissions as per the 802.11 protocol. Currently Linux does not
3688 * provide a mechanism to the user for utilizing prioritized queues, so
3689 * we only utilize the first data transmit queue (queue1).
3693 * Driver allocates buffers of this size for Rx
3697 * ipw_rx_queue_space - Return number of free slots available in queue.
3699 static int ipw_rx_queue_space(const struct ipw_rx_queue
*q
)
3701 int s
= q
->read
- q
->write
;
3704 /* keep some buffer to not confuse full and empty queue */
3711 static inline int ipw_tx_queue_space(const struct clx2_queue
*q
)
3713 int s
= q
->last_used
- q
->first_empty
;
3716 s
-= 2; /* keep some reserve to not confuse empty and full situations */
3722 static inline int ipw_queue_inc_wrap(int index
, int n_bd
)
3724 return (++index
== n_bd
) ? 0 : index
;
3728 * Initialize common DMA queue structure
3730 * @param q queue to init
3731 * @param count Number of BD's to allocate. Should be power of 2
3732 * @param read_register Address for 'read' register
3733 * (not offset within BAR, full address)
3734 * @param write_register Address for 'write' register
3735 * (not offset within BAR, full address)
3736 * @param base_register Address for 'base' register
3737 * (not offset within BAR, full address)
3738 * @param size Address for 'size' register
3739 * (not offset within BAR, full address)
3741 static void ipw_queue_init(struct ipw_priv
*priv
, struct clx2_queue
*q
,
3742 int count
, u32 read
, u32 write
, u32 base
, u32 size
)
3746 q
->low_mark
= q
->n_bd
/ 4;
3747 if (q
->low_mark
< 4)
3750 q
->high_mark
= q
->n_bd
/ 8;
3751 if (q
->high_mark
< 2)
3754 q
->first_empty
= q
->last_used
= 0;
3758 ipw_write32(priv
, base
, q
->dma_addr
);
3759 ipw_write32(priv
, size
, count
);
3760 ipw_write32(priv
, read
, 0);
3761 ipw_write32(priv
, write
, 0);
3763 _ipw_read32(priv
, 0x90);
3766 static int ipw_queue_tx_init(struct ipw_priv
*priv
,
3767 struct clx2_tx_queue
*q
,
3768 int count
, u32 read
, u32 write
, u32 base
, u32 size
)
3770 struct pci_dev
*dev
= priv
->pci_dev
;
3772 q
->txb
= kmalloc_array(count
, sizeof(q
->txb
[0]), GFP_KERNEL
);
3777 dma_alloc_coherent(&dev
->dev
, sizeof(q
->bd
[0]) * count
,
3778 &q
->q
.dma_addr
, GFP_KERNEL
);
3780 IPW_ERROR("pci_alloc_consistent(%zd) failed\n",
3781 sizeof(q
->bd
[0]) * count
);
3787 ipw_queue_init(priv
, &q
->q
, count
, read
, write
, base
, size
);
3792 * Free one TFD, those at index [txq->q.last_used].
3793 * Do NOT advance any indexes
3798 static void ipw_queue_tx_free_tfd(struct ipw_priv
*priv
,
3799 struct clx2_tx_queue
*txq
)
3801 struct tfd_frame
*bd
= &txq
->bd
[txq
->q
.last_used
];
3802 struct pci_dev
*dev
= priv
->pci_dev
;
3806 if (bd
->control_flags
.message_type
== TX_HOST_COMMAND_TYPE
)
3807 /* nothing to cleanup after for host commands */
3811 if (le32_to_cpu(bd
->u
.data
.num_chunks
) > NUM_TFD_CHUNKS
) {
3812 IPW_ERROR("Too many chunks: %i\n",
3813 le32_to_cpu(bd
->u
.data
.num_chunks
));
3814 /* @todo issue fatal error, it is quite serious situation */
3818 /* unmap chunks if any */
3819 for (i
= 0; i
< le32_to_cpu(bd
->u
.data
.num_chunks
); i
++) {
3820 dma_unmap_single(&dev
->dev
,
3821 le32_to_cpu(bd
->u
.data
.chunk_ptr
[i
]),
3822 le16_to_cpu(bd
->u
.data
.chunk_len
[i
]),
3824 if (txq
->txb
[txq
->q
.last_used
]) {
3825 libipw_txb_free(txq
->txb
[txq
->q
.last_used
]);
3826 txq
->txb
[txq
->q
.last_used
] = NULL
;
3832 * Deallocate DMA queue.
3834 * Empty queue by removing and destroying all BD's.
3840 static void ipw_queue_tx_free(struct ipw_priv
*priv
, struct clx2_tx_queue
*txq
)
3842 struct clx2_queue
*q
= &txq
->q
;
3843 struct pci_dev
*dev
= priv
->pci_dev
;
3848 /* first, empty all BD's */
3849 for (; q
->first_empty
!= q
->last_used
;
3850 q
->last_used
= ipw_queue_inc_wrap(q
->last_used
, q
->n_bd
)) {
3851 ipw_queue_tx_free_tfd(priv
, txq
);
3854 /* free buffers belonging to queue itself */
3855 dma_free_coherent(&dev
->dev
, sizeof(txq
->bd
[0]) * q
->n_bd
, txq
->bd
,
3859 /* 0 fill whole structure */
3860 memset(txq
, 0, sizeof(*txq
));
3864 * Destroy all DMA queues and structures
3868 static void ipw_tx_queue_free(struct ipw_priv
*priv
)
3871 ipw_queue_tx_free(priv
, &priv
->txq_cmd
);
3874 ipw_queue_tx_free(priv
, &priv
->txq
[0]);
3875 ipw_queue_tx_free(priv
, &priv
->txq
[1]);
3876 ipw_queue_tx_free(priv
, &priv
->txq
[2]);
3877 ipw_queue_tx_free(priv
, &priv
->txq
[3]);
3880 static void ipw_create_bssid(struct ipw_priv
*priv
, u8
* bssid
)
3882 /* First 3 bytes are manufacturer */
3883 bssid
[0] = priv
->mac_addr
[0];
3884 bssid
[1] = priv
->mac_addr
[1];
3885 bssid
[2] = priv
->mac_addr
[2];
3887 /* Last bytes are random */
3888 get_random_bytes(&bssid
[3], ETH_ALEN
- 3);
3890 bssid
[0] &= 0xfe; /* clear multicast bit */
3891 bssid
[0] |= 0x02; /* set local assignment bit (IEEE802) */
3894 static u8
ipw_add_station(struct ipw_priv
*priv
, u8
* bssid
)
3896 struct ipw_station_entry entry
;
3899 for (i
= 0; i
< priv
->num_stations
; i
++) {
3900 if (ether_addr_equal(priv
->stations
[i
], bssid
)) {
3901 /* Another node is active in network */
3902 priv
->missed_adhoc_beacons
= 0;
3903 if (!(priv
->config
& CFG_STATIC_CHANNEL
))
3904 /* when other nodes drop out, we drop out */
3905 priv
->config
&= ~CFG_ADHOC_PERSIST
;
3911 if (i
== MAX_STATIONS
)
3912 return IPW_INVALID_STATION
;
3914 IPW_DEBUG_SCAN("Adding AdHoc station: %pM\n", bssid
);
3917 entry
.support_mode
= 0;
3918 memcpy(entry
.mac_addr
, bssid
, ETH_ALEN
);
3919 memcpy(priv
->stations
[i
], bssid
, ETH_ALEN
);
3920 ipw_write_direct(priv
, IPW_STATION_TABLE_LOWER
+ i
* sizeof(entry
),
3921 &entry
, sizeof(entry
));
3922 priv
->num_stations
++;
3927 static u8
ipw_find_station(struct ipw_priv
*priv
, u8
* bssid
)
3931 for (i
= 0; i
< priv
->num_stations
; i
++)
3932 if (ether_addr_equal(priv
->stations
[i
], bssid
))
3935 return IPW_INVALID_STATION
;
3938 static void ipw_send_disassociate(struct ipw_priv
*priv
, int quiet
)
3942 if (priv
->status
& STATUS_ASSOCIATING
) {
3943 IPW_DEBUG_ASSOC("Disassociating while associating.\n");
3944 schedule_work(&priv
->disassociate
);
3948 if (!(priv
->status
& STATUS_ASSOCIATED
)) {
3949 IPW_DEBUG_ASSOC("Disassociating while not associated.\n");
3953 IPW_DEBUG_ASSOC("Disassociation attempt from %pM "
3955 priv
->assoc_request
.bssid
,
3956 priv
->assoc_request
.channel
);
3958 priv
->status
&= ~(STATUS_ASSOCIATING
| STATUS_ASSOCIATED
);
3959 priv
->status
|= STATUS_DISASSOCIATING
;
3962 priv
->assoc_request
.assoc_type
= HC_DISASSOC_QUIET
;
3964 priv
->assoc_request
.assoc_type
= HC_DISASSOCIATE
;
3966 err
= ipw_send_associate(priv
, &priv
->assoc_request
);
3968 IPW_DEBUG_HC("Attempt to send [dis]associate command "
3975 static int ipw_disassociate(void *data
)
3977 struct ipw_priv
*priv
= data
;
3978 if (!(priv
->status
& (STATUS_ASSOCIATED
| STATUS_ASSOCIATING
)))
3980 ipw_send_disassociate(data
, 0);
3981 netif_carrier_off(priv
->net_dev
);
3985 static void ipw_bg_disassociate(struct work_struct
*work
)
3987 struct ipw_priv
*priv
=
3988 container_of(work
, struct ipw_priv
, disassociate
);
3989 mutex_lock(&priv
->mutex
);
3990 ipw_disassociate(priv
);
3991 mutex_unlock(&priv
->mutex
);
3994 static void ipw_system_config(struct work_struct
*work
)
3996 struct ipw_priv
*priv
=
3997 container_of(work
, struct ipw_priv
, system_config
);
3999 #ifdef CONFIG_IPW2200_PROMISCUOUS
4000 if (priv
->prom_net_dev
&& netif_running(priv
->prom_net_dev
)) {
4001 priv
->sys_config
.accept_all_data_frames
= 1;
4002 priv
->sys_config
.accept_non_directed_frames
= 1;
4003 priv
->sys_config
.accept_all_mgmt_bcpr
= 1;
4004 priv
->sys_config
.accept_all_mgmt_frames
= 1;
4008 ipw_send_system_config(priv
);
4011 struct ipw_status_code
{
4016 static const struct ipw_status_code ipw_status_codes
[] = {
4017 {0x00, "Successful"},
4018 {0x01, "Unspecified failure"},
4019 {0x0A, "Cannot support all requested capabilities in the "
4020 "Capability information field"},
4021 {0x0B, "Reassociation denied due to inability to confirm that "
4022 "association exists"},
4023 {0x0C, "Association denied due to reason outside the scope of this "
4026 "Responding station does not support the specified authentication "
4029 "Received an Authentication frame with authentication sequence "
4030 "transaction sequence number out of expected sequence"},
4031 {0x0F, "Authentication rejected because of challenge failure"},
4032 {0x10, "Authentication rejected due to timeout waiting for next "
4033 "frame in sequence"},
4034 {0x11, "Association denied because AP is unable to handle additional "
4035 "associated stations"},
4037 "Association denied due to requesting station not supporting all "
4038 "of the datarates in the BSSBasicServiceSet Parameter"},
4040 "Association denied due to requesting station not supporting "
4041 "short preamble operation"},
4043 "Association denied due to requesting station not supporting "
4046 "Association denied due to requesting station not supporting "
4049 "Association denied due to requesting station not supporting "
4050 "short slot operation"},
4052 "Association denied due to requesting station not supporting "
4053 "DSSS-OFDM operation"},
4054 {0x28, "Invalid Information Element"},
4055 {0x29, "Group Cipher is not valid"},
4056 {0x2A, "Pairwise Cipher is not valid"},
4057 {0x2B, "AKMP is not valid"},
4058 {0x2C, "Unsupported RSN IE version"},
4059 {0x2D, "Invalid RSN IE Capabilities"},
4060 {0x2E, "Cipher suite is rejected per security policy"},
4063 static const char *ipw_get_status_code(u16 status
)
4066 for (i
= 0; i
< ARRAY_SIZE(ipw_status_codes
); i
++)
4067 if (ipw_status_codes
[i
].status
== (status
& 0xff))
4068 return ipw_status_codes
[i
].reason
;
4069 return "Unknown status value.";
4072 static inline void average_init(struct average
*avg
)
4074 memset(avg
, 0, sizeof(*avg
));
4077 #define DEPTH_RSSI 8
4078 #define DEPTH_NOISE 16
4079 static s16
exponential_average(s16 prev_avg
, s16 val
, u8 depth
)
4081 return ((depth
-1)*prev_avg
+ val
)/depth
;
4084 static void average_add(struct average
*avg
, s16 val
)
4086 avg
->sum
-= avg
->entries
[avg
->pos
];
4088 avg
->entries
[avg
->pos
++] = val
;
4089 if (unlikely(avg
->pos
== AVG_ENTRIES
)) {
4095 static s16
average_value(struct average
*avg
)
4097 if (!unlikely(avg
->init
)) {
4099 return avg
->sum
/ avg
->pos
;
4103 return avg
->sum
/ AVG_ENTRIES
;
4106 static void ipw_reset_stats(struct ipw_priv
*priv
)
4108 u32 len
= sizeof(u32
);
4112 average_init(&priv
->average_missed_beacons
);
4113 priv
->exp_avg_rssi
= -60;
4114 priv
->exp_avg_noise
= -85 + 0x100;
4116 priv
->last_rate
= 0;
4117 priv
->last_missed_beacons
= 0;
4118 priv
->last_rx_packets
= 0;
4119 priv
->last_tx_packets
= 0;
4120 priv
->last_tx_failures
= 0;
4122 /* Firmware managed, reset only when NIC is restarted, so we have to
4123 * normalize on the current value */
4124 ipw_get_ordinal(priv
, IPW_ORD_STAT_RX_ERR_CRC
,
4125 &priv
->last_rx_err
, &len
);
4126 ipw_get_ordinal(priv
, IPW_ORD_STAT_TX_FAILURE
,
4127 &priv
->last_tx_failures
, &len
);
4129 /* Driver managed, reset with each association */
4130 priv
->missed_adhoc_beacons
= 0;
4131 priv
->missed_beacons
= 0;
4132 priv
->tx_packets
= 0;
4133 priv
->rx_packets
= 0;
4137 static u32
ipw_get_max_rate(struct ipw_priv
*priv
)
4140 u32 mask
= priv
->rates_mask
;
4141 /* If currently associated in B mode, restrict the maximum
4142 * rate match to B rates */
4143 if (priv
->assoc_request
.ieee_mode
== IPW_B_MODE
)
4144 mask
&= LIBIPW_CCK_RATES_MASK
;
4146 /* TODO: Verify that the rate is supported by the current rates
4149 while (i
&& !(mask
& i
))
4152 case LIBIPW_CCK_RATE_1MB_MASK
:
4154 case LIBIPW_CCK_RATE_2MB_MASK
:
4156 case LIBIPW_CCK_RATE_5MB_MASK
:
4158 case LIBIPW_OFDM_RATE_6MB_MASK
:
4160 case LIBIPW_OFDM_RATE_9MB_MASK
:
4162 case LIBIPW_CCK_RATE_11MB_MASK
:
4164 case LIBIPW_OFDM_RATE_12MB_MASK
:
4166 case LIBIPW_OFDM_RATE_18MB_MASK
:
4168 case LIBIPW_OFDM_RATE_24MB_MASK
:
4170 case LIBIPW_OFDM_RATE_36MB_MASK
:
4172 case LIBIPW_OFDM_RATE_48MB_MASK
:
4174 case LIBIPW_OFDM_RATE_54MB_MASK
:
4178 if (priv
->ieee
->mode
== IEEE_B
)
4184 static u32
ipw_get_current_rate(struct ipw_priv
*priv
)
4186 u32 rate
, len
= sizeof(rate
);
4189 if (!(priv
->status
& STATUS_ASSOCIATED
))
4192 if (priv
->tx_packets
> IPW_REAL_RATE_RX_PACKET_THRESHOLD
) {
4193 err
= ipw_get_ordinal(priv
, IPW_ORD_STAT_TX_CURR_RATE
, &rate
,
4196 IPW_DEBUG_INFO("failed querying ordinals.\n");
4200 return ipw_get_max_rate(priv
);
4203 case IPW_TX_RATE_1MB
:
4205 case IPW_TX_RATE_2MB
:
4207 case IPW_TX_RATE_5MB
:
4209 case IPW_TX_RATE_6MB
:
4211 case IPW_TX_RATE_9MB
:
4213 case IPW_TX_RATE_11MB
:
4215 case IPW_TX_RATE_12MB
:
4217 case IPW_TX_RATE_18MB
:
4219 case IPW_TX_RATE_24MB
:
4221 case IPW_TX_RATE_36MB
:
4223 case IPW_TX_RATE_48MB
:
4225 case IPW_TX_RATE_54MB
:
4232 #define IPW_STATS_INTERVAL (2 * HZ)
4233 static void ipw_gather_stats(struct ipw_priv
*priv
)
4235 u32 rx_err
, rx_err_delta
, rx_packets_delta
;
4236 u32 tx_failures
, tx_failures_delta
, tx_packets_delta
;
4237 u32 missed_beacons_percent
, missed_beacons_delta
;
4239 u32 len
= sizeof(u32
);
4241 u32 beacon_quality
, signal_quality
, tx_quality
, rx_quality
,
4245 if (!(priv
->status
& STATUS_ASSOCIATED
)) {
4250 /* Update the statistics */
4251 ipw_get_ordinal(priv
, IPW_ORD_STAT_MISSED_BEACONS
,
4252 &priv
->missed_beacons
, &len
);
4253 missed_beacons_delta
= priv
->missed_beacons
- priv
->last_missed_beacons
;
4254 priv
->last_missed_beacons
= priv
->missed_beacons
;
4255 if (priv
->assoc_request
.beacon_interval
) {
4256 missed_beacons_percent
= missed_beacons_delta
*
4257 (HZ
* le16_to_cpu(priv
->assoc_request
.beacon_interval
)) /
4258 (IPW_STATS_INTERVAL
* 10);
4260 missed_beacons_percent
= 0;
4262 average_add(&priv
->average_missed_beacons
, missed_beacons_percent
);
4264 ipw_get_ordinal(priv
, IPW_ORD_STAT_RX_ERR_CRC
, &rx_err
, &len
);
4265 rx_err_delta
= rx_err
- priv
->last_rx_err
;
4266 priv
->last_rx_err
= rx_err
;
4268 ipw_get_ordinal(priv
, IPW_ORD_STAT_TX_FAILURE
, &tx_failures
, &len
);
4269 tx_failures_delta
= tx_failures
- priv
->last_tx_failures
;
4270 priv
->last_tx_failures
= tx_failures
;
4272 rx_packets_delta
= priv
->rx_packets
- priv
->last_rx_packets
;
4273 priv
->last_rx_packets
= priv
->rx_packets
;
4275 tx_packets_delta
= priv
->tx_packets
- priv
->last_tx_packets
;
4276 priv
->last_tx_packets
= priv
->tx_packets
;
4278 /* Calculate quality based on the following:
4280 * Missed beacon: 100% = 0, 0% = 70% missed
4281 * Rate: 60% = 1Mbs, 100% = Max
4282 * Rx and Tx errors represent a straight % of total Rx/Tx
4283 * RSSI: 100% = > -50, 0% = < -80
4284 * Rx errors: 100% = 0, 0% = 50% missed
4286 * The lowest computed quality is used.
4289 #define BEACON_THRESHOLD 5
4290 beacon_quality
= 100 - missed_beacons_percent
;
4291 if (beacon_quality
< BEACON_THRESHOLD
)
4294 beacon_quality
= (beacon_quality
- BEACON_THRESHOLD
) * 100 /
4295 (100 - BEACON_THRESHOLD
);
4296 IPW_DEBUG_STATS("Missed beacon: %3d%% (%d%%)\n",
4297 beacon_quality
, missed_beacons_percent
);
4299 priv
->last_rate
= ipw_get_current_rate(priv
);
4300 max_rate
= ipw_get_max_rate(priv
);
4301 rate_quality
= priv
->last_rate
* 40 / max_rate
+ 60;
4302 IPW_DEBUG_STATS("Rate quality : %3d%% (%dMbs)\n",
4303 rate_quality
, priv
->last_rate
/ 1000000);
4305 if (rx_packets_delta
> 100 && rx_packets_delta
+ rx_err_delta
)
4306 rx_quality
= 100 - (rx_err_delta
* 100) /
4307 (rx_packets_delta
+ rx_err_delta
);
4310 IPW_DEBUG_STATS("Rx quality : %3d%% (%u errors, %u packets)\n",
4311 rx_quality
, rx_err_delta
, rx_packets_delta
);
4313 if (tx_packets_delta
> 100 && tx_packets_delta
+ tx_failures_delta
)
4314 tx_quality
= 100 - (tx_failures_delta
* 100) /
4315 (tx_packets_delta
+ tx_failures_delta
);
4318 IPW_DEBUG_STATS("Tx quality : %3d%% (%u errors, %u packets)\n",
4319 tx_quality
, tx_failures_delta
, tx_packets_delta
);
4321 rssi
= priv
->exp_avg_rssi
;
4324 (priv
->ieee
->perfect_rssi
- priv
->ieee
->worst_rssi
) *
4325 (priv
->ieee
->perfect_rssi
- priv
->ieee
->worst_rssi
) -
4326 (priv
->ieee
->perfect_rssi
- rssi
) *
4327 (15 * (priv
->ieee
->perfect_rssi
- priv
->ieee
->worst_rssi
) +
4328 62 * (priv
->ieee
->perfect_rssi
- rssi
))) /
4329 ((priv
->ieee
->perfect_rssi
- priv
->ieee
->worst_rssi
) *
4330 (priv
->ieee
->perfect_rssi
- priv
->ieee
->worst_rssi
));
4331 if (signal_quality
> 100)
4332 signal_quality
= 100;
4333 else if (signal_quality
< 1)
4336 IPW_DEBUG_STATS("Signal level : %3d%% (%d dBm)\n",
4337 signal_quality
, rssi
);
4339 quality
= min(rx_quality
, signal_quality
);
4340 quality
= min(tx_quality
, quality
);
4341 quality
= min(rate_quality
, quality
);
4342 quality
= min(beacon_quality
, quality
);
4343 if (quality
== beacon_quality
)
4344 IPW_DEBUG_STATS("Quality (%d%%): Clamped to missed beacons.\n",
4346 if (quality
== rate_quality
)
4347 IPW_DEBUG_STATS("Quality (%d%%): Clamped to rate quality.\n",
4349 if (quality
== tx_quality
)
4350 IPW_DEBUG_STATS("Quality (%d%%): Clamped to Tx quality.\n",
4352 if (quality
== rx_quality
)
4353 IPW_DEBUG_STATS("Quality (%d%%): Clamped to Rx quality.\n",
4355 if (quality
== signal_quality
)
4356 IPW_DEBUG_STATS("Quality (%d%%): Clamped to signal quality.\n",
4359 priv
->quality
= quality
;
4361 schedule_delayed_work(&priv
->gather_stats
, IPW_STATS_INTERVAL
);
4364 static void ipw_bg_gather_stats(struct work_struct
*work
)
4366 struct ipw_priv
*priv
=
4367 container_of(work
, struct ipw_priv
, gather_stats
.work
);
4368 mutex_lock(&priv
->mutex
);
4369 ipw_gather_stats(priv
);
4370 mutex_unlock(&priv
->mutex
);
4373 /* Missed beacon behavior:
4374 * 1st missed -> roaming_threshold, just wait, don't do any scan/roam.
4375 * roaming_threshold -> disassociate_threshold, scan and roam for better signal.
4376 * Above disassociate threshold, give up and stop scanning.
4377 * Roaming is disabled if disassociate_threshold <= roaming_threshold */
4378 static void ipw_handle_missed_beacon(struct ipw_priv
*priv
,
4381 priv
->notif_missed_beacons
= missed_count
;
4383 if (missed_count
> priv
->disassociate_threshold
&&
4384 priv
->status
& STATUS_ASSOCIATED
) {
4385 /* If associated and we've hit the missed
4386 * beacon threshold, disassociate, turn
4387 * off roaming, and abort any active scans */
4388 IPW_DEBUG(IPW_DL_INFO
| IPW_DL_NOTIF
|
4389 IPW_DL_STATE
| IPW_DL_ASSOC
,
4390 "Missed beacon: %d - disassociate\n", missed_count
);
4391 priv
->status
&= ~STATUS_ROAMING
;
4392 if (priv
->status
& STATUS_SCANNING
) {
4393 IPW_DEBUG(IPW_DL_INFO
| IPW_DL_NOTIF
|
4395 "Aborting scan with missed beacon.\n");
4396 schedule_work(&priv
->abort_scan
);
4399 schedule_work(&priv
->disassociate
);
4403 if (priv
->status
& STATUS_ROAMING
) {
4404 /* If we are currently roaming, then just
4405 * print a debug statement... */
4406 IPW_DEBUG(IPW_DL_NOTIF
| IPW_DL_STATE
,
4407 "Missed beacon: %d - roam in progress\n",
4413 (missed_count
> priv
->roaming_threshold
&&
4414 missed_count
<= priv
->disassociate_threshold
)) {
4415 /* If we are not already roaming, set the ROAM
4416 * bit in the status and kick off a scan.
4417 * This can happen several times before we reach
4418 * disassociate_threshold. */
4419 IPW_DEBUG(IPW_DL_NOTIF
| IPW_DL_STATE
,
4420 "Missed beacon: %d - initiate "
4421 "roaming\n", missed_count
);
4422 if (!(priv
->status
& STATUS_ROAMING
)) {
4423 priv
->status
|= STATUS_ROAMING
;
4424 if (!(priv
->status
& STATUS_SCANNING
))
4425 schedule_delayed_work(&priv
->request_scan
, 0);
4430 if (priv
->status
& STATUS_SCANNING
&&
4431 missed_count
> IPW_MB_SCAN_CANCEL_THRESHOLD
) {
4432 /* Stop scan to keep fw from getting
4433 * stuck (only if we aren't roaming --
4434 * otherwise we'll never scan more than 2 or 3
4436 IPW_DEBUG(IPW_DL_INFO
| IPW_DL_NOTIF
| IPW_DL_STATE
,
4437 "Aborting scan with missed beacon.\n");
4438 schedule_work(&priv
->abort_scan
);
4441 IPW_DEBUG_NOTIF("Missed beacon: %d\n", missed_count
);
4444 static void ipw_scan_event(struct work_struct
*work
)
4446 union iwreq_data wrqu
;
4448 struct ipw_priv
*priv
=
4449 container_of(work
, struct ipw_priv
, scan_event
.work
);
4451 wrqu
.data
.length
= 0;
4452 wrqu
.data
.flags
= 0;
4453 wireless_send_event(priv
->net_dev
, SIOCGIWSCAN
, &wrqu
, NULL
);
4456 static void handle_scan_event(struct ipw_priv
*priv
)
4458 /* Only userspace-requested scan completion events go out immediately */
4459 if (!priv
->user_requested_scan
) {
4460 schedule_delayed_work(&priv
->scan_event
,
4461 round_jiffies_relative(msecs_to_jiffies(4000)));
4463 priv
->user_requested_scan
= 0;
4464 mod_delayed_work(system_wq
, &priv
->scan_event
, 0);
4469 * Handle host notification packet.
4470 * Called from interrupt routine
4472 static void ipw_rx_notification(struct ipw_priv
*priv
,
4473 struct ipw_rx_notification
*notif
)
4475 u16 size
= le16_to_cpu(notif
->size
);
4477 IPW_DEBUG_NOTIF("type = %i (%d bytes)\n", notif
->subtype
, size
);
4479 switch (notif
->subtype
) {
4480 case HOST_NOTIFICATION_STATUS_ASSOCIATED
:{
4481 struct notif_association
*assoc
= ¬if
->u
.assoc
;
4483 switch (assoc
->state
) {
4484 case CMAS_ASSOCIATED
:{
4485 IPW_DEBUG(IPW_DL_NOTIF
| IPW_DL_STATE
|
4487 "associated: '%*pE' %pM\n",
4488 priv
->essid_len
, priv
->essid
,
4491 switch (priv
->ieee
->iw_mode
) {
4493 memcpy(priv
->ieee
->bssid
,
4494 priv
->bssid
, ETH_ALEN
);
4498 memcpy(priv
->ieee
->bssid
,
4499 priv
->bssid
, ETH_ALEN
);
4501 /* clear out the station table */
4502 priv
->num_stations
= 0;
4505 ("queueing adhoc check\n");
4506 schedule_delayed_work(
4514 priv
->status
&= ~STATUS_ASSOCIATING
;
4515 priv
->status
|= STATUS_ASSOCIATED
;
4516 schedule_work(&priv
->system_config
);
4518 #ifdef CONFIG_IPW2200_QOS
4519 #define IPW_GET_PACKET_STYPE(x) WLAN_FC_GET_STYPE( \
4520 le16_to_cpu(((struct ieee80211_hdr *)(x))->frame_control))
4521 if ((priv
->status
& STATUS_AUTH
) &&
4522 (IPW_GET_PACKET_STYPE(¬if
->u
.raw
)
4523 == IEEE80211_STYPE_ASSOC_RESP
)) {
4526 libipw_assoc_response
)
4528 && (size
<= 2314)) {
4538 libipw_rx_mgt(priv
->
4543 ¬if
->u
.raw
, &stats
);
4548 schedule_work(&priv
->link_up
);
4553 case CMAS_AUTHENTICATED
:{
4555 status
& (STATUS_ASSOCIATED
|
4557 struct notif_authenticate
*auth
4559 IPW_DEBUG(IPW_DL_NOTIF
|
4562 "deauthenticated: '%*pE' %pM: (0x%04X) - %s\n",
4566 le16_to_cpu(auth
->status
),
4572 ~(STATUS_ASSOCIATING
|
4576 schedule_work(&priv
->link_down
);
4580 IPW_DEBUG(IPW_DL_NOTIF
| IPW_DL_STATE
|
4582 "authenticated: '%*pE' %pM\n",
4583 priv
->essid_len
, priv
->essid
,
4589 if (priv
->status
& STATUS_AUTH
) {
4591 libipw_assoc_response
4595 libipw_assoc_response
4597 IPW_DEBUG(IPW_DL_NOTIF
|
4600 "association failed (0x%04X): %s\n",
4601 le16_to_cpu(resp
->status
),
4607 IPW_DEBUG(IPW_DL_NOTIF
| IPW_DL_STATE
|
4609 "disassociated: '%*pE' %pM\n",
4610 priv
->essid_len
, priv
->essid
,
4614 ~(STATUS_DISASSOCIATING
|
4615 STATUS_ASSOCIATING
|
4616 STATUS_ASSOCIATED
| STATUS_AUTH
);
4617 if (priv
->assoc_network
4618 && (priv
->assoc_network
->
4620 WLAN_CAPABILITY_IBSS
))
4621 ipw_remove_current_network
4624 schedule_work(&priv
->link_down
);
4629 case CMAS_RX_ASSOC_RESP
:
4633 IPW_ERROR("assoc: unknown (%d)\n",
4641 case HOST_NOTIFICATION_STATUS_AUTHENTICATE
:{
4642 struct notif_authenticate
*auth
= ¬if
->u
.auth
;
4643 switch (auth
->state
) {
4644 case CMAS_AUTHENTICATED
:
4645 IPW_DEBUG(IPW_DL_NOTIF
| IPW_DL_STATE
,
4646 "authenticated: '%*pE' %pM\n",
4647 priv
->essid_len
, priv
->essid
,
4649 priv
->status
|= STATUS_AUTH
;
4653 if (priv
->status
& STATUS_AUTH
) {
4654 IPW_DEBUG(IPW_DL_NOTIF
| IPW_DL_STATE
|
4656 "authentication failed (0x%04X): %s\n",
4657 le16_to_cpu(auth
->status
),
4658 ipw_get_status_code(le16_to_cpu
4662 IPW_DEBUG(IPW_DL_NOTIF
| IPW_DL_STATE
|
4664 "deauthenticated: '%*pE' %pM\n",
4665 priv
->essid_len
, priv
->essid
,
4668 priv
->status
&= ~(STATUS_ASSOCIATING
|
4672 schedule_work(&priv
->link_down
);
4675 case CMAS_TX_AUTH_SEQ_1
:
4676 IPW_DEBUG(IPW_DL_NOTIF
| IPW_DL_STATE
|
4677 IPW_DL_ASSOC
, "AUTH_SEQ_1\n");
4679 case CMAS_RX_AUTH_SEQ_2
:
4680 IPW_DEBUG(IPW_DL_NOTIF
| IPW_DL_STATE
|
4681 IPW_DL_ASSOC
, "AUTH_SEQ_2\n");
4683 case CMAS_AUTH_SEQ_1_PASS
:
4684 IPW_DEBUG(IPW_DL_NOTIF
| IPW_DL_STATE
|
4685 IPW_DL_ASSOC
, "AUTH_SEQ_1_PASS\n");
4687 case CMAS_AUTH_SEQ_1_FAIL
:
4688 IPW_DEBUG(IPW_DL_NOTIF
| IPW_DL_STATE
|
4689 IPW_DL_ASSOC
, "AUTH_SEQ_1_FAIL\n");
4691 case CMAS_TX_AUTH_SEQ_3
:
4692 IPW_DEBUG(IPW_DL_NOTIF
| IPW_DL_STATE
|
4693 IPW_DL_ASSOC
, "AUTH_SEQ_3\n");
4695 case CMAS_RX_AUTH_SEQ_4
:
4696 IPW_DEBUG(IPW_DL_NOTIF
| IPW_DL_STATE
|
4697 IPW_DL_ASSOC
, "RX_AUTH_SEQ_4\n");
4699 case CMAS_AUTH_SEQ_2_PASS
:
4700 IPW_DEBUG(IPW_DL_NOTIF
| IPW_DL_STATE
|
4701 IPW_DL_ASSOC
, "AUTH_SEQ_2_PASS\n");
4703 case CMAS_AUTH_SEQ_2_FAIL
:
4704 IPW_DEBUG(IPW_DL_NOTIF
| IPW_DL_STATE
|
4705 IPW_DL_ASSOC
, "AUT_SEQ_2_FAIL\n");
4708 IPW_DEBUG(IPW_DL_NOTIF
| IPW_DL_STATE
|
4709 IPW_DL_ASSOC
, "TX_ASSOC\n");
4711 case CMAS_RX_ASSOC_RESP
:
4712 IPW_DEBUG(IPW_DL_NOTIF
| IPW_DL_STATE
|
4713 IPW_DL_ASSOC
, "RX_ASSOC_RESP\n");
4716 case CMAS_ASSOCIATED
:
4717 IPW_DEBUG(IPW_DL_NOTIF
| IPW_DL_STATE
|
4718 IPW_DL_ASSOC
, "ASSOCIATED\n");
4721 IPW_DEBUG_NOTIF("auth: failure - %d\n",
4728 case HOST_NOTIFICATION_STATUS_SCAN_CHANNEL_RESULT
:{
4729 struct notif_channel_result
*x
=
4730 ¬if
->u
.channel_result
;
4732 if (size
== sizeof(*x
)) {
4733 IPW_DEBUG_SCAN("Scan result for channel %d\n",
4736 IPW_DEBUG_SCAN("Scan result of wrong size %d "
4737 "(should be %zd)\n",
4743 case HOST_NOTIFICATION_STATUS_SCAN_COMPLETED
:{
4744 struct notif_scan_complete
*x
= ¬if
->u
.scan_complete
;
4745 if (size
== sizeof(*x
)) {
4747 ("Scan completed: type %d, %d channels, "
4748 "%d status\n", x
->scan_type
,
4749 x
->num_channels
, x
->status
);
4751 IPW_ERROR("Scan completed of wrong size %d "
4752 "(should be %zd)\n",
4757 ~(STATUS_SCANNING
| STATUS_SCAN_ABORTING
);
4759 wake_up_interruptible(&priv
->wait_state
);
4760 cancel_delayed_work(&priv
->scan_check
);
4762 if (priv
->status
& STATUS_EXIT_PENDING
)
4765 priv
->ieee
->scans
++;
4767 #ifdef CONFIG_IPW2200_MONITOR
4768 if (priv
->ieee
->iw_mode
== IW_MODE_MONITOR
) {
4769 priv
->status
|= STATUS_SCAN_FORCED
;
4770 schedule_delayed_work(&priv
->request_scan
, 0);
4773 priv
->status
&= ~STATUS_SCAN_FORCED
;
4774 #endif /* CONFIG_IPW2200_MONITOR */
4776 /* Do queued direct scans first */
4777 if (priv
->status
& STATUS_DIRECT_SCAN_PENDING
)
4778 schedule_delayed_work(&priv
->request_direct_scan
, 0);
4780 if (!(priv
->status
& (STATUS_ASSOCIATED
|
4781 STATUS_ASSOCIATING
|
4783 STATUS_DISASSOCIATING
)))
4784 schedule_work(&priv
->associate
);
4785 else if (priv
->status
& STATUS_ROAMING
) {
4786 if (x
->status
== SCAN_COMPLETED_STATUS_COMPLETE
)
4787 /* If a scan completed and we are in roam mode, then
4788 * the scan that completed was the one requested as a
4789 * result of entering roam... so, schedule the
4791 schedule_work(&priv
->roam
);
4793 /* Don't schedule if we aborted the scan */
4794 priv
->status
&= ~STATUS_ROAMING
;
4795 } else if (priv
->status
& STATUS_SCAN_PENDING
)
4796 schedule_delayed_work(&priv
->request_scan
, 0);
4797 else if (priv
->config
& CFG_BACKGROUND_SCAN
4798 && priv
->status
& STATUS_ASSOCIATED
)
4799 schedule_delayed_work(&priv
->request_scan
,
4800 round_jiffies_relative(HZ
));
4802 /* Send an empty event to user space.
4803 * We don't send the received data on the event because
4804 * it would require us to do complex transcoding, and
4805 * we want to minimise the work done in the irq handler
4806 * Use a request to extract the data.
4807 * Also, we generate this even for any scan, regardless
4808 * on how the scan was initiated. User space can just
4809 * sync on periodic scan to get fresh data...
4811 if (x
->status
== SCAN_COMPLETED_STATUS_COMPLETE
)
4812 handle_scan_event(priv
);
4816 case HOST_NOTIFICATION_STATUS_FRAG_LENGTH
:{
4817 struct notif_frag_length
*x
= ¬if
->u
.frag_len
;
4819 if (size
== sizeof(*x
))
4820 IPW_ERROR("Frag length: %d\n",
4821 le16_to_cpu(x
->frag_length
));
4823 IPW_ERROR("Frag length of wrong size %d "
4824 "(should be %zd)\n",
4829 case HOST_NOTIFICATION_STATUS_LINK_DETERIORATION
:{
4830 struct notif_link_deterioration
*x
=
4831 ¬if
->u
.link_deterioration
;
4833 if (size
== sizeof(*x
)) {
4834 IPW_DEBUG(IPW_DL_NOTIF
| IPW_DL_STATE
,
4835 "link deterioration: type %d, cnt %d\n",
4836 x
->silence_notification_type
,
4838 memcpy(&priv
->last_link_deterioration
, x
,
4841 IPW_ERROR("Link Deterioration of wrong size %d "
4842 "(should be %zd)\n",
4848 case HOST_NOTIFICATION_DINO_CONFIG_RESPONSE
:{
4849 IPW_ERROR("Dino config\n");
4851 && priv
->hcmd
->cmd
!= HOST_CMD_DINO_CONFIG
)
4852 IPW_ERROR("Unexpected DINO_CONFIG_RESPONSE\n");
4857 case HOST_NOTIFICATION_STATUS_BEACON_STATE
:{
4858 struct notif_beacon_state
*x
= ¬if
->u
.beacon_state
;
4859 if (size
!= sizeof(*x
)) {
4861 ("Beacon state of wrong size %d (should "
4862 "be %zd)\n", size
, sizeof(*x
));
4866 if (le32_to_cpu(x
->state
) ==
4867 HOST_NOTIFICATION_STATUS_BEACON_MISSING
)
4868 ipw_handle_missed_beacon(priv
,
4875 case HOST_NOTIFICATION_STATUS_TGI_TX_KEY
:{
4876 struct notif_tgi_tx_key
*x
= ¬if
->u
.tgi_tx_key
;
4877 if (size
== sizeof(*x
)) {
4878 IPW_ERROR("TGi Tx Key: state 0x%02x sec type "
4879 "0x%02x station %d\n",
4880 x
->key_state
, x
->security_type
,
4886 ("TGi Tx Key of wrong size %d (should be %zd)\n",
4891 case HOST_NOTIFICATION_CALIB_KEEP_RESULTS
:{
4892 struct notif_calibration
*x
= ¬if
->u
.calibration
;
4894 if (size
== sizeof(*x
)) {
4895 memcpy(&priv
->calib
, x
, sizeof(*x
));
4896 IPW_DEBUG_INFO("TODO: Calibration\n");
4901 ("Calibration of wrong size %d (should be %zd)\n",
4906 case HOST_NOTIFICATION_NOISE_STATS
:{
4907 if (size
== sizeof(u32
)) {
4908 priv
->exp_avg_noise
=
4909 exponential_average(priv
->exp_avg_noise
,
4910 (u8
) (le32_to_cpu(notif
->u
.noise
.value
) & 0xff),
4916 ("Noise stat is wrong size %d (should be %zd)\n",
4922 IPW_DEBUG_NOTIF("Unknown notification: "
4923 "subtype=%d,flags=0x%2x,size=%d\n",
4924 notif
->subtype
, notif
->flags
, size
);
4929 * Destroys all DMA structures and initialise them again
4932 * @return error code
4934 static int ipw_queue_reset(struct ipw_priv
*priv
)
4937 /* @todo customize queue sizes */
4938 int nTx
= 64, nTxCmd
= 8;
4939 ipw_tx_queue_free(priv
);
4941 rc
= ipw_queue_tx_init(priv
, &priv
->txq_cmd
, nTxCmd
,
4942 IPW_TX_CMD_QUEUE_READ_INDEX
,
4943 IPW_TX_CMD_QUEUE_WRITE_INDEX
,
4944 IPW_TX_CMD_QUEUE_BD_BASE
,
4945 IPW_TX_CMD_QUEUE_BD_SIZE
);
4947 IPW_ERROR("Tx Cmd queue init failed\n");
4951 rc
= ipw_queue_tx_init(priv
, &priv
->txq
[0], nTx
,
4952 IPW_TX_QUEUE_0_READ_INDEX
,
4953 IPW_TX_QUEUE_0_WRITE_INDEX
,
4954 IPW_TX_QUEUE_0_BD_BASE
, IPW_TX_QUEUE_0_BD_SIZE
);
4956 IPW_ERROR("Tx 0 queue init failed\n");
4959 rc
= ipw_queue_tx_init(priv
, &priv
->txq
[1], nTx
,
4960 IPW_TX_QUEUE_1_READ_INDEX
,
4961 IPW_TX_QUEUE_1_WRITE_INDEX
,
4962 IPW_TX_QUEUE_1_BD_BASE
, IPW_TX_QUEUE_1_BD_SIZE
);
4964 IPW_ERROR("Tx 1 queue init failed\n");
4967 rc
= ipw_queue_tx_init(priv
, &priv
->txq
[2], nTx
,
4968 IPW_TX_QUEUE_2_READ_INDEX
,
4969 IPW_TX_QUEUE_2_WRITE_INDEX
,
4970 IPW_TX_QUEUE_2_BD_BASE
, IPW_TX_QUEUE_2_BD_SIZE
);
4972 IPW_ERROR("Tx 2 queue init failed\n");
4975 rc
= ipw_queue_tx_init(priv
, &priv
->txq
[3], nTx
,
4976 IPW_TX_QUEUE_3_READ_INDEX
,
4977 IPW_TX_QUEUE_3_WRITE_INDEX
,
4978 IPW_TX_QUEUE_3_BD_BASE
, IPW_TX_QUEUE_3_BD_SIZE
);
4980 IPW_ERROR("Tx 3 queue init failed\n");
4984 priv
->rx_bufs_min
= 0;
4985 priv
->rx_pend_max
= 0;
4989 ipw_tx_queue_free(priv
);
4994 * Reclaim Tx queue entries no more used by NIC.
4996 * When FW advances 'R' index, all entries between old and
4997 * new 'R' index need to be reclaimed. As result, some free space
4998 * forms. If there is enough free space (> low mark), wake Tx queue.
5000 * @note Need to protect against garbage in 'R' index
5004 * @return Number of used entries remains in the queue
5006 static int ipw_queue_tx_reclaim(struct ipw_priv
*priv
,
5007 struct clx2_tx_queue
*txq
, int qindex
)
5011 struct clx2_queue
*q
= &txq
->q
;
5013 hw_tail
= ipw_read32(priv
, q
->reg_r
);
5014 if (hw_tail
>= q
->n_bd
) {
5016 ("Read index for DMA queue (%d) is out of range [0-%d)\n",
5020 for (; q
->last_used
!= hw_tail
;
5021 q
->last_used
= ipw_queue_inc_wrap(q
->last_used
, q
->n_bd
)) {
5022 ipw_queue_tx_free_tfd(priv
, txq
);
5026 if ((ipw_tx_queue_space(q
) > q
->low_mark
) &&
5028 netif_wake_queue(priv
->net_dev
);
5029 used
= q
->first_empty
- q
->last_used
;
5036 static int ipw_queue_tx_hcmd(struct ipw_priv
*priv
, int hcmd
, void *buf
,
5039 struct clx2_tx_queue
*txq
= &priv
->txq_cmd
;
5040 struct clx2_queue
*q
= &txq
->q
;
5041 struct tfd_frame
*tfd
;
5043 if (ipw_tx_queue_space(q
) < (sync
? 1 : 2)) {
5044 IPW_ERROR("No space for Tx\n");
5048 tfd
= &txq
->bd
[q
->first_empty
];
5049 txq
->txb
[q
->first_empty
] = NULL
;
5051 memset(tfd
, 0, sizeof(*tfd
));
5052 tfd
->control_flags
.message_type
= TX_HOST_COMMAND_TYPE
;
5053 tfd
->control_flags
.control_bits
= TFD_NEED_IRQ_MASK
;
5055 tfd
->u
.cmd
.index
= hcmd
;
5056 tfd
->u
.cmd
.length
= len
;
5057 memcpy(tfd
->u
.cmd
.payload
, buf
, len
);
5058 q
->first_empty
= ipw_queue_inc_wrap(q
->first_empty
, q
->n_bd
);
5059 ipw_write32(priv
, q
->reg_w
, q
->first_empty
);
5060 _ipw_read32(priv
, 0x90);
5066 * Rx theory of operation
5068 * The host allocates 32 DMA target addresses and passes the host address
5069 * to the firmware at register IPW_RFDS_TABLE_LOWER + N * RFD_SIZE where N is
5073 * The host/firmware share two index registers for managing the Rx buffers.
5075 * The READ index maps to the first position that the firmware may be writing
5076 * to -- the driver can read up to (but not including) this position and get
5078 * The READ index is managed by the firmware once the card is enabled.
5080 * The WRITE index maps to the last position the driver has read from -- the
5081 * position preceding WRITE is the last slot the firmware can place a packet.
5083 * The queue is empty (no good data) if WRITE = READ - 1, and is full if
5086 * During initialization the host sets up the READ queue position to the first
5087 * INDEX position, and WRITE to the last (READ - 1 wrapped)
5089 * When the firmware places a packet in a buffer it will advance the READ index
5090 * and fire the RX interrupt. The driver can then query the READ index and
5091 * process as many packets as possible, moving the WRITE index forward as it
5092 * resets the Rx queue buffers with new memory.
5094 * The management in the driver is as follows:
5095 * + A list of pre-allocated SKBs is stored in ipw->rxq->rx_free. When
5096 * ipw->rxq->free_count drops to or below RX_LOW_WATERMARK, work is scheduled
5097 * to replensish the ipw->rxq->rx_free.
5098 * + In ipw_rx_queue_replenish (scheduled) if 'processed' != 'read' then the
5099 * ipw->rxq is replenished and the READ INDEX is updated (updating the
5100 * 'processed' and 'read' driver indexes as well)
5101 * + A received packet is processed and handed to the kernel network stack,
5102 * detached from the ipw->rxq. The driver 'processed' index is updated.
5103 * + The Host/Firmware ipw->rxq is replenished at tasklet time from the rx_free
5104 * list. If there are no allocated buffers in ipw->rxq->rx_free, the READ
5105 * INDEX is not incremented and ipw->status(RX_STALLED) is set. If there
5106 * were enough free buffers and RX_STALLED is set it is cleared.
5111 * ipw_rx_queue_alloc() Allocates rx_free
5112 * ipw_rx_queue_replenish() Replenishes rx_free list from rx_used, and calls
5113 * ipw_rx_queue_restock
5114 * ipw_rx_queue_restock() Moves available buffers from rx_free into Rx
5115 * queue, updates firmware pointers, and updates
5116 * the WRITE index. If insufficient rx_free buffers
5117 * are available, schedules ipw_rx_queue_replenish
5119 * -- enable interrupts --
5120 * ISR - ipw_rx() Detach ipw_rx_mem_buffers from pool up to the
5121 * READ INDEX, detaching the SKB from the pool.
5122 * Moves the packet buffer from queue to rx_used.
5123 * Calls ipw_rx_queue_restock to refill any empty
5130 * If there are slots in the RX queue that need to be restocked,
5131 * and we have free pre-allocated buffers, fill the ranks as much
5132 * as we can pulling from rx_free.
5134 * This moves the 'write' index forward to catch up with 'processed', and
5135 * also updates the memory address in the firmware to reference the new
5138 static void ipw_rx_queue_restock(struct ipw_priv
*priv
)
5140 struct ipw_rx_queue
*rxq
= priv
->rxq
;
5141 struct list_head
*element
;
5142 struct ipw_rx_mem_buffer
*rxb
;
5143 unsigned long flags
;
5146 spin_lock_irqsave(&rxq
->lock
, flags
);
5148 while ((ipw_rx_queue_space(rxq
) > 0) && (rxq
->free_count
)) {
5149 element
= rxq
->rx_free
.next
;
5150 rxb
= list_entry(element
, struct ipw_rx_mem_buffer
, list
);
5153 ipw_write32(priv
, IPW_RFDS_TABLE_LOWER
+ rxq
->write
* RFD_SIZE
,
5155 rxq
->queue
[rxq
->write
] = rxb
;
5156 rxq
->write
= (rxq
->write
+ 1) % RX_QUEUE_SIZE
;
5159 spin_unlock_irqrestore(&rxq
->lock
, flags
);
5161 /* If the pre-allocated buffer pool is dropping low, schedule to
5163 if (rxq
->free_count
<= RX_LOW_WATERMARK
)
5164 schedule_work(&priv
->rx_replenish
);
5166 /* If we've added more space for the firmware to place data, tell it */
5167 if (write
!= rxq
->write
)
5168 ipw_write32(priv
, IPW_RX_WRITE_INDEX
, rxq
->write
);
5172 * Move all used packet from rx_used to rx_free, allocating a new SKB for each.
5173 * Also restock the Rx queue via ipw_rx_queue_restock.
5175 * This is called as a scheduled work item (except for during initialization)
5177 static void ipw_rx_queue_replenish(void *data
)
5179 struct ipw_priv
*priv
= data
;
5180 struct ipw_rx_queue
*rxq
= priv
->rxq
;
5181 struct list_head
*element
;
5182 struct ipw_rx_mem_buffer
*rxb
;
5183 unsigned long flags
;
5185 spin_lock_irqsave(&rxq
->lock
, flags
);
5186 while (!list_empty(&rxq
->rx_used
)) {
5187 element
= rxq
->rx_used
.next
;
5188 rxb
= list_entry(element
, struct ipw_rx_mem_buffer
, list
);
5189 rxb
->skb
= alloc_skb(IPW_RX_BUF_SIZE
, GFP_ATOMIC
);
5191 printk(KERN_CRIT
"%s: Can not allocate SKB buffers.\n",
5192 priv
->net_dev
->name
);
5193 /* We don't reschedule replenish work here -- we will
5194 * call the restock method and if it still needs
5195 * more buffers it will schedule replenish */
5201 dma_map_single(&priv
->pci_dev
->dev
, rxb
->skb
->data
,
5202 IPW_RX_BUF_SIZE
, DMA_FROM_DEVICE
);
5204 list_add_tail(&rxb
->list
, &rxq
->rx_free
);
5207 spin_unlock_irqrestore(&rxq
->lock
, flags
);
5209 ipw_rx_queue_restock(priv
);
5212 static void ipw_bg_rx_queue_replenish(struct work_struct
*work
)
5214 struct ipw_priv
*priv
=
5215 container_of(work
, struct ipw_priv
, rx_replenish
);
5216 mutex_lock(&priv
->mutex
);
5217 ipw_rx_queue_replenish(priv
);
5218 mutex_unlock(&priv
->mutex
);
5221 /* Assumes that the skb field of the buffers in 'pool' is kept accurate.
5222 * If an SKB has been detached, the POOL needs to have its SKB set to NULL
5223 * This free routine walks the list of POOL entries and if SKB is set to
5224 * non NULL it is unmapped and freed
5226 static void ipw_rx_queue_free(struct ipw_priv
*priv
, struct ipw_rx_queue
*rxq
)
5233 for (i
= 0; i
< RX_QUEUE_SIZE
+ RX_FREE_BUFFERS
; i
++) {
5234 if (rxq
->pool
[i
].skb
!= NULL
) {
5235 dma_unmap_single(&priv
->pci_dev
->dev
,
5236 rxq
->pool
[i
].dma_addr
,
5237 IPW_RX_BUF_SIZE
, DMA_FROM_DEVICE
);
5238 dev_kfree_skb(rxq
->pool
[i
].skb
);
5245 static struct ipw_rx_queue
*ipw_rx_queue_alloc(struct ipw_priv
*priv
)
5247 struct ipw_rx_queue
*rxq
;
5250 rxq
= kzalloc(sizeof(*rxq
), GFP_KERNEL
);
5251 if (unlikely(!rxq
)) {
5252 IPW_ERROR("memory allocation failed\n");
5255 spin_lock_init(&rxq
->lock
);
5256 INIT_LIST_HEAD(&rxq
->rx_free
);
5257 INIT_LIST_HEAD(&rxq
->rx_used
);
5259 /* Fill the rx_used queue with _all_ of the Rx buffers */
5260 for (i
= 0; i
< RX_FREE_BUFFERS
+ RX_QUEUE_SIZE
; i
++)
5261 list_add_tail(&rxq
->pool
[i
].list
, &rxq
->rx_used
);
5263 /* Set us so that we have processed and used all buffers, but have
5264 * not restocked the Rx queue with fresh buffers */
5265 rxq
->read
= rxq
->write
= 0;
5266 rxq
->free_count
= 0;
5271 static int ipw_is_rate_in_mask(struct ipw_priv
*priv
, int ieee_mode
, u8 rate
)
5273 rate
&= ~LIBIPW_BASIC_RATE_MASK
;
5274 if (ieee_mode
== IEEE_A
) {
5276 case LIBIPW_OFDM_RATE_6MB
:
5277 return priv
->rates_mask
& LIBIPW_OFDM_RATE_6MB_MASK
?
5279 case LIBIPW_OFDM_RATE_9MB
:
5280 return priv
->rates_mask
& LIBIPW_OFDM_RATE_9MB_MASK
?
5282 case LIBIPW_OFDM_RATE_12MB
:
5284 rates_mask
& LIBIPW_OFDM_RATE_12MB_MASK
? 1 : 0;
5285 case LIBIPW_OFDM_RATE_18MB
:
5287 rates_mask
& LIBIPW_OFDM_RATE_18MB_MASK
? 1 : 0;
5288 case LIBIPW_OFDM_RATE_24MB
:
5290 rates_mask
& LIBIPW_OFDM_RATE_24MB_MASK
? 1 : 0;
5291 case LIBIPW_OFDM_RATE_36MB
:
5293 rates_mask
& LIBIPW_OFDM_RATE_36MB_MASK
? 1 : 0;
5294 case LIBIPW_OFDM_RATE_48MB
:
5296 rates_mask
& LIBIPW_OFDM_RATE_48MB_MASK
? 1 : 0;
5297 case LIBIPW_OFDM_RATE_54MB
:
5299 rates_mask
& LIBIPW_OFDM_RATE_54MB_MASK
? 1 : 0;
5307 case LIBIPW_CCK_RATE_1MB
:
5308 return priv
->rates_mask
& LIBIPW_CCK_RATE_1MB_MASK
? 1 : 0;
5309 case LIBIPW_CCK_RATE_2MB
:
5310 return priv
->rates_mask
& LIBIPW_CCK_RATE_2MB_MASK
? 1 : 0;
5311 case LIBIPW_CCK_RATE_5MB
:
5312 return priv
->rates_mask
& LIBIPW_CCK_RATE_5MB_MASK
? 1 : 0;
5313 case LIBIPW_CCK_RATE_11MB
:
5314 return priv
->rates_mask
& LIBIPW_CCK_RATE_11MB_MASK
? 1 : 0;
5317 /* If we are limited to B modulations, bail at this point */
5318 if (ieee_mode
== IEEE_B
)
5323 case LIBIPW_OFDM_RATE_6MB
:
5324 return priv
->rates_mask
& LIBIPW_OFDM_RATE_6MB_MASK
? 1 : 0;
5325 case LIBIPW_OFDM_RATE_9MB
:
5326 return priv
->rates_mask
& LIBIPW_OFDM_RATE_9MB_MASK
? 1 : 0;
5327 case LIBIPW_OFDM_RATE_12MB
:
5328 return priv
->rates_mask
& LIBIPW_OFDM_RATE_12MB_MASK
? 1 : 0;
5329 case LIBIPW_OFDM_RATE_18MB
:
5330 return priv
->rates_mask
& LIBIPW_OFDM_RATE_18MB_MASK
? 1 : 0;
5331 case LIBIPW_OFDM_RATE_24MB
:
5332 return priv
->rates_mask
& LIBIPW_OFDM_RATE_24MB_MASK
? 1 : 0;
5333 case LIBIPW_OFDM_RATE_36MB
:
5334 return priv
->rates_mask
& LIBIPW_OFDM_RATE_36MB_MASK
? 1 : 0;
5335 case LIBIPW_OFDM_RATE_48MB
:
5336 return priv
->rates_mask
& LIBIPW_OFDM_RATE_48MB_MASK
? 1 : 0;
5337 case LIBIPW_OFDM_RATE_54MB
:
5338 return priv
->rates_mask
& LIBIPW_OFDM_RATE_54MB_MASK
? 1 : 0;
5344 static int ipw_compatible_rates(struct ipw_priv
*priv
,
5345 const struct libipw_network
*network
,
5346 struct ipw_supported_rates
*rates
)
5350 memset(rates
, 0, sizeof(*rates
));
5351 num_rates
= min(network
->rates_len
, (u8
) IPW_MAX_RATES
);
5352 rates
->num_rates
= 0;
5353 for (i
= 0; i
< num_rates
; i
++) {
5354 if (!ipw_is_rate_in_mask(priv
, network
->mode
,
5355 network
->rates
[i
])) {
5357 if (network
->rates
[i
] & LIBIPW_BASIC_RATE_MASK
) {
5358 IPW_DEBUG_SCAN("Adding masked mandatory "
5361 rates
->supported_rates
[rates
->num_rates
++] =
5366 IPW_DEBUG_SCAN("Rate %02X masked : 0x%08X\n",
5367 network
->rates
[i
], priv
->rates_mask
);
5371 rates
->supported_rates
[rates
->num_rates
++] = network
->rates
[i
];
5374 num_rates
= min(network
->rates_ex_len
,
5375 (u8
) (IPW_MAX_RATES
- num_rates
));
5376 for (i
= 0; i
< num_rates
; i
++) {
5377 if (!ipw_is_rate_in_mask(priv
, network
->mode
,
5378 network
->rates_ex
[i
])) {
5379 if (network
->rates_ex
[i
] & LIBIPW_BASIC_RATE_MASK
) {
5380 IPW_DEBUG_SCAN("Adding masked mandatory "
5382 network
->rates_ex
[i
]);
5383 rates
->supported_rates
[rates
->num_rates
++] =
5388 IPW_DEBUG_SCAN("Rate %02X masked : 0x%08X\n",
5389 network
->rates_ex
[i
], priv
->rates_mask
);
5393 rates
->supported_rates
[rates
->num_rates
++] =
5394 network
->rates_ex
[i
];
5400 static void ipw_copy_rates(struct ipw_supported_rates
*dest
,
5401 const struct ipw_supported_rates
*src
)
5404 for (i
= 0; i
< src
->num_rates
; i
++)
5405 dest
->supported_rates
[i
] = src
->supported_rates
[i
];
5406 dest
->num_rates
= src
->num_rates
;
5409 /* TODO: Look at sniffed packets in the air to determine if the basic rate
5410 * mask should ever be used -- right now all callers to add the scan rates are
5411 * set with the modulation = CCK, so BASIC_RATE_MASK is never set... */
5412 static void ipw_add_cck_scan_rates(struct ipw_supported_rates
*rates
,
5413 u8 modulation
, u32 rate_mask
)
5415 u8 basic_mask
= (LIBIPW_OFDM_MODULATION
== modulation
) ?
5416 LIBIPW_BASIC_RATE_MASK
: 0;
5418 if (rate_mask
& LIBIPW_CCK_RATE_1MB_MASK
)
5419 rates
->supported_rates
[rates
->num_rates
++] =
5420 LIBIPW_BASIC_RATE_MASK
| LIBIPW_CCK_RATE_1MB
;
5422 if (rate_mask
& LIBIPW_CCK_RATE_2MB_MASK
)
5423 rates
->supported_rates
[rates
->num_rates
++] =
5424 LIBIPW_BASIC_RATE_MASK
| LIBIPW_CCK_RATE_2MB
;
5426 if (rate_mask
& LIBIPW_CCK_RATE_5MB_MASK
)
5427 rates
->supported_rates
[rates
->num_rates
++] = basic_mask
|
5428 LIBIPW_CCK_RATE_5MB
;
5430 if (rate_mask
& LIBIPW_CCK_RATE_11MB_MASK
)
5431 rates
->supported_rates
[rates
->num_rates
++] = basic_mask
|
5432 LIBIPW_CCK_RATE_11MB
;
5435 static void ipw_add_ofdm_scan_rates(struct ipw_supported_rates
*rates
,
5436 u8 modulation
, u32 rate_mask
)
5438 u8 basic_mask
= (LIBIPW_OFDM_MODULATION
== modulation
) ?
5439 LIBIPW_BASIC_RATE_MASK
: 0;
5441 if (rate_mask
& LIBIPW_OFDM_RATE_6MB_MASK
)
5442 rates
->supported_rates
[rates
->num_rates
++] = basic_mask
|
5443 LIBIPW_OFDM_RATE_6MB
;
5445 if (rate_mask
& LIBIPW_OFDM_RATE_9MB_MASK
)
5446 rates
->supported_rates
[rates
->num_rates
++] =
5447 LIBIPW_OFDM_RATE_9MB
;
5449 if (rate_mask
& LIBIPW_OFDM_RATE_12MB_MASK
)
5450 rates
->supported_rates
[rates
->num_rates
++] = basic_mask
|
5451 LIBIPW_OFDM_RATE_12MB
;
5453 if (rate_mask
& LIBIPW_OFDM_RATE_18MB_MASK
)
5454 rates
->supported_rates
[rates
->num_rates
++] =
5455 LIBIPW_OFDM_RATE_18MB
;
5457 if (rate_mask
& LIBIPW_OFDM_RATE_24MB_MASK
)
5458 rates
->supported_rates
[rates
->num_rates
++] = basic_mask
|
5459 LIBIPW_OFDM_RATE_24MB
;
5461 if (rate_mask
& LIBIPW_OFDM_RATE_36MB_MASK
)
5462 rates
->supported_rates
[rates
->num_rates
++] =
5463 LIBIPW_OFDM_RATE_36MB
;
5465 if (rate_mask
& LIBIPW_OFDM_RATE_48MB_MASK
)
5466 rates
->supported_rates
[rates
->num_rates
++] =
5467 LIBIPW_OFDM_RATE_48MB
;
5469 if (rate_mask
& LIBIPW_OFDM_RATE_54MB_MASK
)
5470 rates
->supported_rates
[rates
->num_rates
++] =
5471 LIBIPW_OFDM_RATE_54MB
;
5474 struct ipw_network_match
{
5475 struct libipw_network
*network
;
5476 struct ipw_supported_rates rates
;
5479 static int ipw_find_adhoc_network(struct ipw_priv
*priv
,
5480 struct ipw_network_match
*match
,
5481 struct libipw_network
*network
,
5484 struct ipw_supported_rates rates
;
5486 /* Verify that this network's capability is compatible with the
5487 * current mode (AdHoc or Infrastructure) */
5488 if ((priv
->ieee
->iw_mode
== IW_MODE_ADHOC
&&
5489 !(network
->capability
& WLAN_CAPABILITY_IBSS
))) {
5490 IPW_DEBUG_MERGE("Network '%*pE (%pM)' excluded due to capability mismatch.\n",
5491 network
->ssid_len
, network
->ssid
,
5496 if (unlikely(roaming
)) {
5497 /* If we are roaming, then ensure check if this is a valid
5498 * network to try and roam to */
5499 if ((network
->ssid_len
!= match
->network
->ssid_len
) ||
5500 memcmp(network
->ssid
, match
->network
->ssid
,
5501 network
->ssid_len
)) {
5502 IPW_DEBUG_MERGE("Network '%*pE (%pM)' excluded because of non-network ESSID.\n",
5503 network
->ssid_len
, network
->ssid
,
5508 /* If an ESSID has been configured then compare the broadcast
5510 if ((priv
->config
& CFG_STATIC_ESSID
) &&
5511 ((network
->ssid_len
!= priv
->essid_len
) ||
5512 memcmp(network
->ssid
, priv
->essid
,
5513 min(network
->ssid_len
, priv
->essid_len
)))) {
5514 IPW_DEBUG_MERGE("Network '%*pE (%pM)' excluded because of ESSID mismatch: '%*pE'.\n",
5515 network
->ssid_len
, network
->ssid
,
5516 network
->bssid
, priv
->essid_len
,
5522 /* If the old network rate is better than this one, don't bother
5523 * testing everything else. */
5525 if (network
->time_stamp
[0] < match
->network
->time_stamp
[0]) {
5526 IPW_DEBUG_MERGE("Network '%*pE excluded because newer than current network.\n",
5527 match
->network
->ssid_len
, match
->network
->ssid
);
5529 } else if (network
->time_stamp
[1] < match
->network
->time_stamp
[1]) {
5530 IPW_DEBUG_MERGE("Network '%*pE excluded because newer than current network.\n",
5531 match
->network
->ssid_len
, match
->network
->ssid
);
5535 /* Now go through and see if the requested network is valid... */
5536 if (priv
->ieee
->scan_age
!= 0 &&
5537 time_after(jiffies
, network
->last_scanned
+ priv
->ieee
->scan_age
)) {
5538 IPW_DEBUG_MERGE("Network '%*pE (%pM)' excluded because of age: %ums.\n",
5539 network
->ssid_len
, network
->ssid
,
5541 jiffies_to_msecs(jiffies
-
5542 network
->last_scanned
));
5546 if ((priv
->config
& CFG_STATIC_CHANNEL
) &&
5547 (network
->channel
!= priv
->channel
)) {
5548 IPW_DEBUG_MERGE("Network '%*pE (%pM)' excluded because of channel mismatch: %d != %d.\n",
5549 network
->ssid_len
, network
->ssid
,
5551 network
->channel
, priv
->channel
);
5555 /* Verify privacy compatibility */
5556 if (((priv
->capability
& CAP_PRIVACY_ON
) ? 1 : 0) !=
5557 ((network
->capability
& WLAN_CAPABILITY_PRIVACY
) ? 1 : 0)) {
5558 IPW_DEBUG_MERGE("Network '%*pE (%pM)' excluded because of privacy mismatch: %s != %s.\n",
5559 network
->ssid_len
, network
->ssid
,
5562 capability
& CAP_PRIVACY_ON
? "on" : "off",
5564 capability
& WLAN_CAPABILITY_PRIVACY
? "on" :
5569 if (ether_addr_equal(network
->bssid
, priv
->bssid
)) {
5570 IPW_DEBUG_MERGE("Network '%*pE (%pM)' excluded because of the same BSSID match: %pM.\n",
5571 network
->ssid_len
, network
->ssid
,
5572 network
->bssid
, priv
->bssid
);
5576 /* Filter out any incompatible freq / mode combinations */
5577 if (!libipw_is_valid_mode(priv
->ieee
, network
->mode
)) {
5578 IPW_DEBUG_MERGE("Network '%*pE (%pM)' excluded because of invalid frequency/mode combination.\n",
5579 network
->ssid_len
, network
->ssid
,
5584 /* Ensure that the rates supported by the driver are compatible with
5585 * this AP, including verification of basic rates (mandatory) */
5586 if (!ipw_compatible_rates(priv
, network
, &rates
)) {
5587 IPW_DEBUG_MERGE("Network '%*pE (%pM)' excluded because configured rate mask excludes AP mandatory rate.\n",
5588 network
->ssid_len
, network
->ssid
,
5593 if (rates
.num_rates
== 0) {
5594 IPW_DEBUG_MERGE("Network '%*pE (%pM)' excluded because of no compatible rates.\n",
5595 network
->ssid_len
, network
->ssid
,
5600 /* TODO: Perform any further minimal comparititive tests. We do not
5601 * want to put too much policy logic here; intelligent scan selection
5602 * should occur within a generic IEEE 802.11 user space tool. */
5604 /* Set up 'new' AP to this network */
5605 ipw_copy_rates(&match
->rates
, &rates
);
5606 match
->network
= network
;
5607 IPW_DEBUG_MERGE("Network '%*pE (%pM)' is a viable match.\n",
5608 network
->ssid_len
, network
->ssid
, network
->bssid
);
5613 static void ipw_merge_adhoc_network(struct work_struct
*work
)
5615 struct ipw_priv
*priv
=
5616 container_of(work
, struct ipw_priv
, merge_networks
);
5617 struct libipw_network
*network
= NULL
;
5618 struct ipw_network_match match
= {
5619 .network
= priv
->assoc_network
5622 if ((priv
->status
& STATUS_ASSOCIATED
) &&
5623 (priv
->ieee
->iw_mode
== IW_MODE_ADHOC
)) {
5624 /* First pass through ROAM process -- look for a better
5626 unsigned long flags
;
5628 spin_lock_irqsave(&priv
->ieee
->lock
, flags
);
5629 list_for_each_entry(network
, &priv
->ieee
->network_list
, list
) {
5630 if (network
!= priv
->assoc_network
)
5631 ipw_find_adhoc_network(priv
, &match
, network
,
5634 spin_unlock_irqrestore(&priv
->ieee
->lock
, flags
);
5636 if (match
.network
== priv
->assoc_network
) {
5637 IPW_DEBUG_MERGE("No better ADHOC in this network to "
5642 mutex_lock(&priv
->mutex
);
5643 if (priv
->ieee
->iw_mode
== IW_MODE_ADHOC
) {
5644 IPW_DEBUG_MERGE("remove network %*pE\n",
5645 priv
->essid_len
, priv
->essid
);
5646 ipw_remove_current_network(priv
);
5649 ipw_disassociate(priv
);
5650 priv
->assoc_network
= match
.network
;
5651 mutex_unlock(&priv
->mutex
);
5656 static int ipw_best_network(struct ipw_priv
*priv
,
5657 struct ipw_network_match
*match
,
5658 struct libipw_network
*network
, int roaming
)
5660 struct ipw_supported_rates rates
;
5662 /* Verify that this network's capability is compatible with the
5663 * current mode (AdHoc or Infrastructure) */
5664 if ((priv
->ieee
->iw_mode
== IW_MODE_INFRA
&&
5665 !(network
->capability
& WLAN_CAPABILITY_ESS
)) ||
5666 (priv
->ieee
->iw_mode
== IW_MODE_ADHOC
&&
5667 !(network
->capability
& WLAN_CAPABILITY_IBSS
))) {
5668 IPW_DEBUG_ASSOC("Network '%*pE (%pM)' excluded due to capability mismatch.\n",
5669 network
->ssid_len
, network
->ssid
,
5674 if (unlikely(roaming
)) {
5675 /* If we are roaming, then ensure check if this is a valid
5676 * network to try and roam to */
5677 if ((network
->ssid_len
!= match
->network
->ssid_len
) ||
5678 memcmp(network
->ssid
, match
->network
->ssid
,
5679 network
->ssid_len
)) {
5680 IPW_DEBUG_ASSOC("Network '%*pE (%pM)' excluded because of non-network ESSID.\n",
5681 network
->ssid_len
, network
->ssid
,
5686 /* If an ESSID has been configured then compare the broadcast
5688 if ((priv
->config
& CFG_STATIC_ESSID
) &&
5689 ((network
->ssid_len
!= priv
->essid_len
) ||
5690 memcmp(network
->ssid
, priv
->essid
,
5691 min(network
->ssid_len
, priv
->essid_len
)))) {
5692 IPW_DEBUG_ASSOC("Network '%*pE (%pM)' excluded because of ESSID mismatch: '%*pE'.\n",
5693 network
->ssid_len
, network
->ssid
,
5694 network
->bssid
, priv
->essid_len
,
5700 /* If the old network rate is better than this one, don't bother
5701 * testing everything else. */
5702 if (match
->network
&& match
->network
->stats
.rssi
> network
->stats
.rssi
) {
5703 IPW_DEBUG_ASSOC("Network '%*pE (%pM)' excluded because '%*pE (%pM)' has a stronger signal.\n",
5704 network
->ssid_len
, network
->ssid
,
5705 network
->bssid
, match
->network
->ssid_len
,
5706 match
->network
->ssid
, match
->network
->bssid
);
5710 /* If this network has already had an association attempt within the
5711 * last 3 seconds, do not try and associate again... */
5712 if (network
->last_associate
&&
5713 time_after(network
->last_associate
+ (HZ
* 3UL), jiffies
)) {
5714 IPW_DEBUG_ASSOC("Network '%*pE (%pM)' excluded because of storming (%ums since last assoc attempt).\n",
5715 network
->ssid_len
, network
->ssid
,
5717 jiffies_to_msecs(jiffies
-
5718 network
->last_associate
));
5722 /* Now go through and see if the requested network is valid... */
5723 if (priv
->ieee
->scan_age
!= 0 &&
5724 time_after(jiffies
, network
->last_scanned
+ priv
->ieee
->scan_age
)) {
5725 IPW_DEBUG_ASSOC("Network '%*pE (%pM)' excluded because of age: %ums.\n",
5726 network
->ssid_len
, network
->ssid
,
5728 jiffies_to_msecs(jiffies
-
5729 network
->last_scanned
));
5733 if ((priv
->config
& CFG_STATIC_CHANNEL
) &&
5734 (network
->channel
!= priv
->channel
)) {
5735 IPW_DEBUG_ASSOC("Network '%*pE (%pM)' excluded because of channel mismatch: %d != %d.\n",
5736 network
->ssid_len
, network
->ssid
,
5738 network
->channel
, priv
->channel
);
5742 /* Verify privacy compatibility */
5743 if (((priv
->capability
& CAP_PRIVACY_ON
) ? 1 : 0) !=
5744 ((network
->capability
& WLAN_CAPABILITY_PRIVACY
) ? 1 : 0)) {
5745 IPW_DEBUG_ASSOC("Network '%*pE (%pM)' excluded because of privacy mismatch: %s != %s.\n",
5746 network
->ssid_len
, network
->ssid
,
5748 priv
->capability
& CAP_PRIVACY_ON
? "on" :
5750 network
->capability
&
5751 WLAN_CAPABILITY_PRIVACY
? "on" : "off");
5755 if ((priv
->config
& CFG_STATIC_BSSID
) &&
5756 !ether_addr_equal(network
->bssid
, priv
->bssid
)) {
5757 IPW_DEBUG_ASSOC("Network '%*pE (%pM)' excluded because of BSSID mismatch: %pM.\n",
5758 network
->ssid_len
, network
->ssid
,
5759 network
->bssid
, priv
->bssid
);
5763 /* Filter out any incompatible freq / mode combinations */
5764 if (!libipw_is_valid_mode(priv
->ieee
, network
->mode
)) {
5765 IPW_DEBUG_ASSOC("Network '%*pE (%pM)' excluded because of invalid frequency/mode combination.\n",
5766 network
->ssid_len
, network
->ssid
,
5771 /* Filter out invalid channel in current GEO */
5772 if (!libipw_is_valid_channel(priv
->ieee
, network
->channel
)) {
5773 IPW_DEBUG_ASSOC("Network '%*pE (%pM)' excluded because of invalid channel in current GEO\n",
5774 network
->ssid_len
, network
->ssid
,
5779 /* Ensure that the rates supported by the driver are compatible with
5780 * this AP, including verification of basic rates (mandatory) */
5781 if (!ipw_compatible_rates(priv
, network
, &rates
)) {
5782 IPW_DEBUG_ASSOC("Network '%*pE (%pM)' excluded because configured rate mask excludes AP mandatory rate.\n",
5783 network
->ssid_len
, network
->ssid
,
5788 if (rates
.num_rates
== 0) {
5789 IPW_DEBUG_ASSOC("Network '%*pE (%pM)' excluded because of no compatible rates.\n",
5790 network
->ssid_len
, network
->ssid
,
5795 /* TODO: Perform any further minimal comparititive tests. We do not
5796 * want to put too much policy logic here; intelligent scan selection
5797 * should occur within a generic IEEE 802.11 user space tool. */
5799 /* Set up 'new' AP to this network */
5800 ipw_copy_rates(&match
->rates
, &rates
);
5801 match
->network
= network
;
5803 IPW_DEBUG_ASSOC("Network '%*pE (%pM)' is a viable match.\n",
5804 network
->ssid_len
, network
->ssid
, network
->bssid
);
5809 static void ipw_adhoc_create(struct ipw_priv
*priv
,
5810 struct libipw_network
*network
)
5812 const struct libipw_geo
*geo
= libipw_get_geo(priv
->ieee
);
5816 * For the purposes of scanning, we can set our wireless mode
5817 * to trigger scans across combinations of bands, but when it
5818 * comes to creating a new ad-hoc network, we have tell the FW
5819 * exactly which band to use.
5821 * We also have the possibility of an invalid channel for the
5822 * chossen band. Attempting to create a new ad-hoc network
5823 * with an invalid channel for wireless mode will trigger a
5827 switch (libipw_is_valid_channel(priv
->ieee
, priv
->channel
)) {
5828 case LIBIPW_52GHZ_BAND
:
5829 network
->mode
= IEEE_A
;
5830 i
= libipw_channel_to_index(priv
->ieee
, priv
->channel
);
5832 if (geo
->a
[i
].flags
& LIBIPW_CH_PASSIVE_ONLY
) {
5833 IPW_WARNING("Overriding invalid channel\n");
5834 priv
->channel
= geo
->a
[0].channel
;
5838 case LIBIPW_24GHZ_BAND
:
5839 if (priv
->ieee
->mode
& IEEE_G
)
5840 network
->mode
= IEEE_G
;
5842 network
->mode
= IEEE_B
;
5843 i
= libipw_channel_to_index(priv
->ieee
, priv
->channel
);
5845 if (geo
->bg
[i
].flags
& LIBIPW_CH_PASSIVE_ONLY
) {
5846 IPW_WARNING("Overriding invalid channel\n");
5847 priv
->channel
= geo
->bg
[0].channel
;
5852 IPW_WARNING("Overriding invalid channel\n");
5853 if (priv
->ieee
->mode
& IEEE_A
) {
5854 network
->mode
= IEEE_A
;
5855 priv
->channel
= geo
->a
[0].channel
;
5856 } else if (priv
->ieee
->mode
& IEEE_G
) {
5857 network
->mode
= IEEE_G
;
5858 priv
->channel
= geo
->bg
[0].channel
;
5860 network
->mode
= IEEE_B
;
5861 priv
->channel
= geo
->bg
[0].channel
;
5866 network
->channel
= priv
->channel
;
5867 priv
->config
|= CFG_ADHOC_PERSIST
;
5868 ipw_create_bssid(priv
, network
->bssid
);
5869 network
->ssid_len
= priv
->essid_len
;
5870 memcpy(network
->ssid
, priv
->essid
, priv
->essid_len
);
5871 memset(&network
->stats
, 0, sizeof(network
->stats
));
5872 network
->capability
= WLAN_CAPABILITY_IBSS
;
5873 if (!(priv
->config
& CFG_PREAMBLE_LONG
))
5874 network
->capability
|= WLAN_CAPABILITY_SHORT_PREAMBLE
;
5875 if (priv
->capability
& CAP_PRIVACY_ON
)
5876 network
->capability
|= WLAN_CAPABILITY_PRIVACY
;
5877 network
->rates_len
= min(priv
->rates
.num_rates
, MAX_RATES_LENGTH
);
5878 memcpy(network
->rates
, priv
->rates
.supported_rates
, network
->rates_len
);
5879 network
->rates_ex_len
= priv
->rates
.num_rates
- network
->rates_len
;
5880 memcpy(network
->rates_ex
,
5881 &priv
->rates
.supported_rates
[network
->rates_len
],
5882 network
->rates_ex_len
);
5883 network
->last_scanned
= 0;
5885 network
->last_associate
= 0;
5886 network
->time_stamp
[0] = 0;
5887 network
->time_stamp
[1] = 0;
5888 network
->beacon_interval
= 100; /* Default */
5889 network
->listen_interval
= 10; /* Default */
5890 network
->atim_window
= 0; /* Default */
5891 network
->wpa_ie_len
= 0;
5892 network
->rsn_ie_len
= 0;
5895 static void ipw_send_tgi_tx_key(struct ipw_priv
*priv
, int type
, int index
)
5897 struct ipw_tgi_tx_key key
;
5899 if (!(priv
->ieee
->sec
.flags
& (1 << index
)))
5903 memcpy(key
.key
, priv
->ieee
->sec
.keys
[index
], SCM_TEMPORAL_KEY_LENGTH
);
5904 key
.security_type
= type
;
5905 key
.station_index
= 0; /* always 0 for BSS */
5907 /* 0 for new key; previous value of counter (after fatal error) */
5908 key
.tx_counter
[0] = cpu_to_le32(0);
5909 key
.tx_counter
[1] = cpu_to_le32(0);
5911 ipw_send_cmd_pdu(priv
, IPW_CMD_TGI_TX_KEY
, sizeof(key
), &key
);
5914 static void ipw_send_wep_keys(struct ipw_priv
*priv
, int type
)
5916 struct ipw_wep_key key
;
5919 key
.cmd_id
= DINO_CMD_WEP_KEY
;
5922 /* Note: AES keys cannot be set for multiple times.
5923 * Only set it at the first time. */
5924 for (i
= 0; i
< 4; i
++) {
5925 key
.key_index
= i
| type
;
5926 if (!(priv
->ieee
->sec
.flags
& (1 << i
))) {
5931 key
.key_size
= priv
->ieee
->sec
.key_sizes
[i
];
5932 memcpy(key
.key
, priv
->ieee
->sec
.keys
[i
], key
.key_size
);
5934 ipw_send_cmd_pdu(priv
, IPW_CMD_WEP_KEY
, sizeof(key
), &key
);
5938 static void ipw_set_hw_decrypt_unicast(struct ipw_priv
*priv
, int level
)
5940 if (priv
->ieee
->host_encrypt
)
5945 priv
->sys_config
.disable_unicast_decryption
= 0;
5946 priv
->ieee
->host_decrypt
= 0;
5949 priv
->sys_config
.disable_unicast_decryption
= 1;
5950 priv
->ieee
->host_decrypt
= 1;
5953 priv
->sys_config
.disable_unicast_decryption
= 0;
5954 priv
->ieee
->host_decrypt
= 0;
5957 priv
->sys_config
.disable_unicast_decryption
= 1;
5964 static void ipw_set_hw_decrypt_multicast(struct ipw_priv
*priv
, int level
)
5966 if (priv
->ieee
->host_encrypt
)
5971 priv
->sys_config
.disable_multicast_decryption
= 0;
5974 priv
->sys_config
.disable_multicast_decryption
= 1;
5977 priv
->sys_config
.disable_multicast_decryption
= 0;
5980 priv
->sys_config
.disable_multicast_decryption
= 1;
5987 static void ipw_set_hwcrypto_keys(struct ipw_priv
*priv
)
5989 switch (priv
->ieee
->sec
.level
) {
5991 if (priv
->ieee
->sec
.flags
& SEC_ACTIVE_KEY
)
5992 ipw_send_tgi_tx_key(priv
,
5993 DCT_FLAG_EXT_SECURITY_CCM
,
5994 priv
->ieee
->sec
.active_key
);
5996 if (!priv
->ieee
->host_mc_decrypt
)
5997 ipw_send_wep_keys(priv
, DCW_WEP_KEY_SEC_TYPE_CCM
);
6000 if (priv
->ieee
->sec
.flags
& SEC_ACTIVE_KEY
)
6001 ipw_send_tgi_tx_key(priv
,
6002 DCT_FLAG_EXT_SECURITY_TKIP
,
6003 priv
->ieee
->sec
.active_key
);
6006 ipw_send_wep_keys(priv
, DCW_WEP_KEY_SEC_TYPE_WEP
);
6007 ipw_set_hw_decrypt_unicast(priv
, priv
->ieee
->sec
.level
);
6008 ipw_set_hw_decrypt_multicast(priv
, priv
->ieee
->sec
.level
);
6016 static void ipw_adhoc_check(void *data
)
6018 struct ipw_priv
*priv
= data
;
6020 if (priv
->missed_adhoc_beacons
++ > priv
->disassociate_threshold
&&
6021 !(priv
->config
& CFG_ADHOC_PERSIST
)) {
6022 IPW_DEBUG(IPW_DL_INFO
| IPW_DL_NOTIF
|
6023 IPW_DL_STATE
| IPW_DL_ASSOC
,
6024 "Missed beacon: %d - disassociate\n",
6025 priv
->missed_adhoc_beacons
);
6026 ipw_remove_current_network(priv
);
6027 ipw_disassociate(priv
);
6031 schedule_delayed_work(&priv
->adhoc_check
,
6032 le16_to_cpu(priv
->assoc_request
.beacon_interval
));
6035 static void ipw_bg_adhoc_check(struct work_struct
*work
)
6037 struct ipw_priv
*priv
=
6038 container_of(work
, struct ipw_priv
, adhoc_check
.work
);
6039 mutex_lock(&priv
->mutex
);
6040 ipw_adhoc_check(priv
);
6041 mutex_unlock(&priv
->mutex
);
6044 static void ipw_debug_config(struct ipw_priv
*priv
)
6046 IPW_DEBUG_INFO("Scan completed, no valid APs matched "
6047 "[CFG 0x%08X]\n", priv
->config
);
6048 if (priv
->config
& CFG_STATIC_CHANNEL
)
6049 IPW_DEBUG_INFO("Channel locked to %d\n", priv
->channel
);
6051 IPW_DEBUG_INFO("Channel unlocked.\n");
6052 if (priv
->config
& CFG_STATIC_ESSID
)
6053 IPW_DEBUG_INFO("ESSID locked to '%*pE'\n",
6054 priv
->essid_len
, priv
->essid
);
6056 IPW_DEBUG_INFO("ESSID unlocked.\n");
6057 if (priv
->config
& CFG_STATIC_BSSID
)
6058 IPW_DEBUG_INFO("BSSID locked to %pM\n", priv
->bssid
);
6060 IPW_DEBUG_INFO("BSSID unlocked.\n");
6061 if (priv
->capability
& CAP_PRIVACY_ON
)
6062 IPW_DEBUG_INFO("PRIVACY on\n");
6064 IPW_DEBUG_INFO("PRIVACY off\n");
6065 IPW_DEBUG_INFO("RATE MASK: 0x%08X\n", priv
->rates_mask
);
6068 static void ipw_set_fixed_rate(struct ipw_priv
*priv
, int mode
)
6070 /* TODO: Verify that this works... */
6071 struct ipw_fixed_rate fr
;
6074 u16 new_tx_rates
= priv
->rates_mask
;
6076 /* Identify 'current FW band' and match it with the fixed
6079 switch (priv
->ieee
->freq_band
) {
6080 case LIBIPW_52GHZ_BAND
: /* A only */
6082 if (priv
->rates_mask
& ~LIBIPW_OFDM_RATES_MASK
) {
6083 /* Invalid fixed rate mask */
6085 ("invalid fixed rate mask in ipw_set_fixed_rate\n");
6090 new_tx_rates
>>= LIBIPW_OFDM_SHIFT_MASK_A
;
6093 default: /* 2.4Ghz or Mixed */
6095 if (mode
== IEEE_B
) {
6096 if (new_tx_rates
& ~LIBIPW_CCK_RATES_MASK
) {
6097 /* Invalid fixed rate mask */
6099 ("invalid fixed rate mask in ipw_set_fixed_rate\n");
6106 if (new_tx_rates
& ~(LIBIPW_CCK_RATES_MASK
|
6107 LIBIPW_OFDM_RATES_MASK
)) {
6108 /* Invalid fixed rate mask */
6110 ("invalid fixed rate mask in ipw_set_fixed_rate\n");
6115 if (LIBIPW_OFDM_RATE_6MB_MASK
& new_tx_rates
) {
6116 mask
|= (LIBIPW_OFDM_RATE_6MB_MASK
>> 1);
6117 new_tx_rates
&= ~LIBIPW_OFDM_RATE_6MB_MASK
;
6120 if (LIBIPW_OFDM_RATE_9MB_MASK
& new_tx_rates
) {
6121 mask
|= (LIBIPW_OFDM_RATE_9MB_MASK
>> 1);
6122 new_tx_rates
&= ~LIBIPW_OFDM_RATE_9MB_MASK
;
6125 if (LIBIPW_OFDM_RATE_12MB_MASK
& new_tx_rates
) {
6126 mask
|= (LIBIPW_OFDM_RATE_12MB_MASK
>> 1);
6127 new_tx_rates
&= ~LIBIPW_OFDM_RATE_12MB_MASK
;
6130 new_tx_rates
|= mask
;
6134 fr
.tx_rates
= cpu_to_le16(new_tx_rates
);
6136 reg
= ipw_read32(priv
, IPW_MEM_FIXED_OVERRIDE
);
6137 ipw_write_reg32(priv
, reg
, *(u32
*) & fr
);
6140 static void ipw_abort_scan(struct ipw_priv
*priv
)
6144 if (priv
->status
& STATUS_SCAN_ABORTING
) {
6145 IPW_DEBUG_HC("Ignoring concurrent scan abort request.\n");
6148 priv
->status
|= STATUS_SCAN_ABORTING
;
6150 err
= ipw_send_scan_abort(priv
);
6152 IPW_DEBUG_HC("Request to abort scan failed.\n");
6155 static void ipw_add_scan_channels(struct ipw_priv
*priv
,
6156 struct ipw_scan_request_ext
*scan
,
6159 int channel_index
= 0;
6160 const struct libipw_geo
*geo
;
6163 geo
= libipw_get_geo(priv
->ieee
);
6165 if (priv
->ieee
->freq_band
& LIBIPW_52GHZ_BAND
) {
6166 int start
= channel_index
;
6167 for (i
= 0; i
< geo
->a_channels
; i
++) {
6168 if ((priv
->status
& STATUS_ASSOCIATED
) &&
6169 geo
->a
[i
].channel
== priv
->channel
)
6172 scan
->channels_list
[channel_index
] = geo
->a
[i
].channel
;
6173 ipw_set_scan_type(scan
, channel_index
,
6175 flags
& LIBIPW_CH_PASSIVE_ONLY
?
6176 IPW_SCAN_PASSIVE_FULL_DWELL_SCAN
:
6180 if (start
!= channel_index
) {
6181 scan
->channels_list
[start
] = (u8
) (IPW_A_MODE
<< 6) |
6182 (channel_index
- start
);
6187 if (priv
->ieee
->freq_band
& LIBIPW_24GHZ_BAND
) {
6188 int start
= channel_index
;
6189 if (priv
->config
& CFG_SPEED_SCAN
) {
6191 u8 channels
[LIBIPW_24GHZ_CHANNELS
] = {
6192 /* nop out the list */
6197 while (channel_index
< IPW_SCAN_CHANNELS
- 1) {
6199 priv
->speed_scan
[priv
->speed_scan_pos
];
6201 priv
->speed_scan_pos
= 0;
6202 channel
= priv
->speed_scan
[0];
6204 if ((priv
->status
& STATUS_ASSOCIATED
) &&
6205 channel
== priv
->channel
) {
6206 priv
->speed_scan_pos
++;
6210 /* If this channel has already been
6211 * added in scan, break from loop
6212 * and this will be the first channel
6215 if (channels
[channel
- 1] != 0)
6218 channels
[channel
- 1] = 1;
6219 priv
->speed_scan_pos
++;
6221 scan
->channels_list
[channel_index
] = channel
;
6223 libipw_channel_to_index(priv
->ieee
, channel
);
6224 ipw_set_scan_type(scan
, channel_index
,
6227 LIBIPW_CH_PASSIVE_ONLY
?
6228 IPW_SCAN_PASSIVE_FULL_DWELL_SCAN
6232 for (i
= 0; i
< geo
->bg_channels
; i
++) {
6233 if ((priv
->status
& STATUS_ASSOCIATED
) &&
6234 geo
->bg
[i
].channel
== priv
->channel
)
6237 scan
->channels_list
[channel_index
] =
6239 ipw_set_scan_type(scan
, channel_index
,
6242 LIBIPW_CH_PASSIVE_ONLY
?
6243 IPW_SCAN_PASSIVE_FULL_DWELL_SCAN
6248 if (start
!= channel_index
) {
6249 scan
->channels_list
[start
] = (u8
) (IPW_B_MODE
<< 6) |
6250 (channel_index
- start
);
6255 static int ipw_passive_dwell_time(struct ipw_priv
*priv
)
6257 /* staying on passive channels longer than the DTIM interval during a
6258 * scan, while associated, causes the firmware to cancel the scan
6259 * without notification. Hence, don't stay on passive channels longer
6260 * than the beacon interval.
6262 if (priv
->status
& STATUS_ASSOCIATED
6263 && priv
->assoc_network
->beacon_interval
> 10)
6264 return priv
->assoc_network
->beacon_interval
- 10;
6269 static int ipw_request_scan_helper(struct ipw_priv
*priv
, int type
, int direct
)
6271 struct ipw_scan_request_ext scan
;
6272 int err
= 0, scan_type
;
6274 if (!(priv
->status
& STATUS_INIT
) ||
6275 (priv
->status
& STATUS_EXIT_PENDING
))
6278 mutex_lock(&priv
->mutex
);
6280 if (direct
&& (priv
->direct_scan_ssid_len
== 0)) {
6281 IPW_DEBUG_HC("Direct scan requested but no SSID to scan for\n");
6282 priv
->status
&= ~STATUS_DIRECT_SCAN_PENDING
;
6286 if (priv
->status
& STATUS_SCANNING
) {
6287 IPW_DEBUG_HC("Concurrent scan requested. Queuing.\n");
6288 priv
->status
|= direct
? STATUS_DIRECT_SCAN_PENDING
:
6289 STATUS_SCAN_PENDING
;
6293 if (!(priv
->status
& STATUS_SCAN_FORCED
) &&
6294 priv
->status
& STATUS_SCAN_ABORTING
) {
6295 IPW_DEBUG_HC("Scan request while abort pending. Queuing.\n");
6296 priv
->status
|= direct
? STATUS_DIRECT_SCAN_PENDING
:
6297 STATUS_SCAN_PENDING
;
6301 if (priv
->status
& STATUS_RF_KILL_MASK
) {
6302 IPW_DEBUG_HC("Queuing scan due to RF Kill activation\n");
6303 priv
->status
|= direct
? STATUS_DIRECT_SCAN_PENDING
:
6304 STATUS_SCAN_PENDING
;
6308 memset(&scan
, 0, sizeof(scan
));
6309 scan
.full_scan_index
= cpu_to_le32(libipw_get_scans(priv
->ieee
));
6311 if (type
== IW_SCAN_TYPE_PASSIVE
) {
6312 IPW_DEBUG_WX("use passive scanning\n");
6313 scan_type
= IPW_SCAN_PASSIVE_FULL_DWELL_SCAN
;
6314 scan
.dwell_time
[IPW_SCAN_PASSIVE_FULL_DWELL_SCAN
] =
6315 cpu_to_le16(ipw_passive_dwell_time(priv
));
6316 ipw_add_scan_channels(priv
, &scan
, scan_type
);
6320 /* Use active scan by default. */
6321 if (priv
->config
& CFG_SPEED_SCAN
)
6322 scan
.dwell_time
[IPW_SCAN_ACTIVE_BROADCAST_SCAN
] =
6325 scan
.dwell_time
[IPW_SCAN_ACTIVE_BROADCAST_SCAN
] =
6328 scan
.dwell_time
[IPW_SCAN_ACTIVE_BROADCAST_AND_DIRECT_SCAN
] =
6331 scan
.dwell_time
[IPW_SCAN_PASSIVE_FULL_DWELL_SCAN
] =
6332 cpu_to_le16(ipw_passive_dwell_time(priv
));
6333 scan
.dwell_time
[IPW_SCAN_ACTIVE_DIRECT_SCAN
] = cpu_to_le16(20);
6335 #ifdef CONFIG_IPW2200_MONITOR
6336 if (priv
->ieee
->iw_mode
== IW_MODE_MONITOR
) {
6340 switch (libipw_is_valid_channel(priv
->ieee
, priv
->channel
)) {
6341 case LIBIPW_52GHZ_BAND
:
6342 band
= (u8
) (IPW_A_MODE
<< 6) | 1;
6343 channel
= priv
->channel
;
6346 case LIBIPW_24GHZ_BAND
:
6347 band
= (u8
) (IPW_B_MODE
<< 6) | 1;
6348 channel
= priv
->channel
;
6352 band
= (u8
) (IPW_B_MODE
<< 6) | 1;
6357 scan
.channels_list
[0] = band
;
6358 scan
.channels_list
[1] = channel
;
6359 ipw_set_scan_type(&scan
, 1, IPW_SCAN_PASSIVE_FULL_DWELL_SCAN
);
6361 /* NOTE: The card will sit on this channel for this time
6362 * period. Scan aborts are timing sensitive and frequently
6363 * result in firmware restarts. As such, it is best to
6364 * set a small dwell_time here and just keep re-issuing
6365 * scans. Otherwise fast channel hopping will not actually
6368 * TODO: Move SPEED SCAN support to all modes and bands */
6369 scan
.dwell_time
[IPW_SCAN_PASSIVE_FULL_DWELL_SCAN
] =
6372 #endif /* CONFIG_IPW2200_MONITOR */
6373 /* Honor direct scans first, otherwise if we are roaming make
6374 * this a direct scan for the current network. Finally,
6375 * ensure that every other scan is a fast channel hop scan */
6377 err
= ipw_send_ssid(priv
, priv
->direct_scan_ssid
,
6378 priv
->direct_scan_ssid_len
);
6380 IPW_DEBUG_HC("Attempt to send SSID command "
6385 scan_type
= IPW_SCAN_ACTIVE_BROADCAST_AND_DIRECT_SCAN
;
6386 } else if ((priv
->status
& STATUS_ROAMING
)
6387 || (!(priv
->status
& STATUS_ASSOCIATED
)
6388 && (priv
->config
& CFG_STATIC_ESSID
)
6389 && (le32_to_cpu(scan
.full_scan_index
) % 2))) {
6390 err
= ipw_send_ssid(priv
, priv
->essid
, priv
->essid_len
);
6392 IPW_DEBUG_HC("Attempt to send SSID command "
6397 scan_type
= IPW_SCAN_ACTIVE_BROADCAST_AND_DIRECT_SCAN
;
6399 scan_type
= IPW_SCAN_ACTIVE_BROADCAST_SCAN
;
6401 ipw_add_scan_channels(priv
, &scan
, scan_type
);
6402 #ifdef CONFIG_IPW2200_MONITOR
6407 err
= ipw_send_scan_request_ext(priv
, &scan
);
6409 IPW_DEBUG_HC("Sending scan command failed: %08X\n", err
);
6413 priv
->status
|= STATUS_SCANNING
;
6415 priv
->status
&= ~STATUS_DIRECT_SCAN_PENDING
;
6416 priv
->direct_scan_ssid_len
= 0;
6418 priv
->status
&= ~STATUS_SCAN_PENDING
;
6420 schedule_delayed_work(&priv
->scan_check
, IPW_SCAN_CHECK_WATCHDOG
);
6422 mutex_unlock(&priv
->mutex
);
6426 static void ipw_request_passive_scan(struct work_struct
*work
)
6428 struct ipw_priv
*priv
=
6429 container_of(work
, struct ipw_priv
, request_passive_scan
.work
);
6430 ipw_request_scan_helper(priv
, IW_SCAN_TYPE_PASSIVE
, 0);
6433 static void ipw_request_scan(struct work_struct
*work
)
6435 struct ipw_priv
*priv
=
6436 container_of(work
, struct ipw_priv
, request_scan
.work
);
6437 ipw_request_scan_helper(priv
, IW_SCAN_TYPE_ACTIVE
, 0);
6440 static void ipw_request_direct_scan(struct work_struct
*work
)
6442 struct ipw_priv
*priv
=
6443 container_of(work
, struct ipw_priv
, request_direct_scan
.work
);
6444 ipw_request_scan_helper(priv
, IW_SCAN_TYPE_ACTIVE
, 1);
6447 static void ipw_bg_abort_scan(struct work_struct
*work
)
6449 struct ipw_priv
*priv
=
6450 container_of(work
, struct ipw_priv
, abort_scan
);
6451 mutex_lock(&priv
->mutex
);
6452 ipw_abort_scan(priv
);
6453 mutex_unlock(&priv
->mutex
);
6456 static int ipw_wpa_enable(struct ipw_priv
*priv
, int value
)
6458 /* This is called when wpa_supplicant loads and closes the driver
6460 priv
->ieee
->wpa_enabled
= value
;
6464 static int ipw_wpa_set_auth_algs(struct ipw_priv
*priv
, int value
)
6466 struct libipw_device
*ieee
= priv
->ieee
;
6467 struct libipw_security sec
= {
6468 .flags
= SEC_AUTH_MODE
,
6472 if (value
& IW_AUTH_ALG_SHARED_KEY
) {
6473 sec
.auth_mode
= WLAN_AUTH_SHARED_KEY
;
6475 } else if (value
& IW_AUTH_ALG_OPEN_SYSTEM
) {
6476 sec
.auth_mode
= WLAN_AUTH_OPEN
;
6478 } else if (value
& IW_AUTH_ALG_LEAP
) {
6479 sec
.auth_mode
= WLAN_AUTH_LEAP
;
6484 if (ieee
->set_security
)
6485 ieee
->set_security(ieee
->dev
, &sec
);
6492 static void ipw_wpa_assoc_frame(struct ipw_priv
*priv
, char *wpa_ie
,
6495 /* make sure WPA is enabled */
6496 ipw_wpa_enable(priv
, 1);
6499 static int ipw_set_rsn_capa(struct ipw_priv
*priv
,
6500 char *capabilities
, int length
)
6502 IPW_DEBUG_HC("HOST_CMD_RSN_CAPABILITIES\n");
6504 return ipw_send_cmd_pdu(priv
, IPW_CMD_RSN_CAPABILITIES
, length
,
6513 static int ipw_wx_set_genie(struct net_device
*dev
,
6514 struct iw_request_info
*info
,
6515 union iwreq_data
*wrqu
, char *extra
)
6517 struct ipw_priv
*priv
= libipw_priv(dev
);
6518 struct libipw_device
*ieee
= priv
->ieee
;
6522 if (wrqu
->data
.length
> MAX_WPA_IE_LEN
||
6523 (wrqu
->data
.length
&& extra
== NULL
))
6526 if (wrqu
->data
.length
) {
6527 buf
= kmemdup(extra
, wrqu
->data
.length
, GFP_KERNEL
);
6533 kfree(ieee
->wpa_ie
);
6535 ieee
->wpa_ie_len
= wrqu
->data
.length
;
6537 kfree(ieee
->wpa_ie
);
6538 ieee
->wpa_ie
= NULL
;
6539 ieee
->wpa_ie_len
= 0;
6542 ipw_wpa_assoc_frame(priv
, ieee
->wpa_ie
, ieee
->wpa_ie_len
);
6548 static int ipw_wx_get_genie(struct net_device
*dev
,
6549 struct iw_request_info
*info
,
6550 union iwreq_data
*wrqu
, char *extra
)
6552 struct ipw_priv
*priv
= libipw_priv(dev
);
6553 struct libipw_device
*ieee
= priv
->ieee
;
6556 if (ieee
->wpa_ie_len
== 0 || ieee
->wpa_ie
== NULL
) {
6557 wrqu
->data
.length
= 0;
6561 if (wrqu
->data
.length
< ieee
->wpa_ie_len
) {
6566 wrqu
->data
.length
= ieee
->wpa_ie_len
;
6567 memcpy(extra
, ieee
->wpa_ie
, ieee
->wpa_ie_len
);
6573 static int wext_cipher2level(int cipher
)
6576 case IW_AUTH_CIPHER_NONE
:
6578 case IW_AUTH_CIPHER_WEP40
:
6579 case IW_AUTH_CIPHER_WEP104
:
6581 case IW_AUTH_CIPHER_TKIP
:
6583 case IW_AUTH_CIPHER_CCMP
:
6591 static int ipw_wx_set_auth(struct net_device
*dev
,
6592 struct iw_request_info
*info
,
6593 union iwreq_data
*wrqu
, char *extra
)
6595 struct ipw_priv
*priv
= libipw_priv(dev
);
6596 struct libipw_device
*ieee
= priv
->ieee
;
6597 struct iw_param
*param
= &wrqu
->param
;
6598 struct lib80211_crypt_data
*crypt
;
6599 unsigned long flags
;
6602 switch (param
->flags
& IW_AUTH_INDEX
) {
6603 case IW_AUTH_WPA_VERSION
:
6605 case IW_AUTH_CIPHER_PAIRWISE
:
6606 ipw_set_hw_decrypt_unicast(priv
,
6607 wext_cipher2level(param
->value
));
6609 case IW_AUTH_CIPHER_GROUP
:
6610 ipw_set_hw_decrypt_multicast(priv
,
6611 wext_cipher2level(param
->value
));
6613 case IW_AUTH_KEY_MGMT
:
6615 * ipw2200 does not use these parameters
6619 case IW_AUTH_TKIP_COUNTERMEASURES
:
6620 crypt
= priv
->ieee
->crypt_info
.crypt
[priv
->ieee
->crypt_info
.tx_keyidx
];
6621 if (!crypt
|| !crypt
->ops
->set_flags
|| !crypt
->ops
->get_flags
)
6624 flags
= crypt
->ops
->get_flags(crypt
->priv
);
6627 flags
|= IEEE80211_CRYPTO_TKIP_COUNTERMEASURES
;
6629 flags
&= ~IEEE80211_CRYPTO_TKIP_COUNTERMEASURES
;
6631 crypt
->ops
->set_flags(flags
, crypt
->priv
);
6635 case IW_AUTH_DROP_UNENCRYPTED
:{
6638 * wpa_supplicant calls set_wpa_enabled when the driver
6639 * is loaded and unloaded, regardless of if WPA is being
6640 * used. No other calls are made which can be used to
6641 * determine if encryption will be used or not prior to
6642 * association being expected. If encryption is not being
6643 * used, drop_unencrypted is set to false, else true -- we
6644 * can use this to determine if the CAP_PRIVACY_ON bit should
6647 struct libipw_security sec
= {
6648 .flags
= SEC_ENABLED
,
6649 .enabled
= param
->value
,
6651 priv
->ieee
->drop_unencrypted
= param
->value
;
6652 /* We only change SEC_LEVEL for open mode. Others
6653 * are set by ipw_wpa_set_encryption.
6655 if (!param
->value
) {
6656 sec
.flags
|= SEC_LEVEL
;
6657 sec
.level
= SEC_LEVEL_0
;
6659 sec
.flags
|= SEC_LEVEL
;
6660 sec
.level
= SEC_LEVEL_1
;
6662 if (priv
->ieee
->set_security
)
6663 priv
->ieee
->set_security(priv
->ieee
->dev
, &sec
);
6667 case IW_AUTH_80211_AUTH_ALG
:
6668 ret
= ipw_wpa_set_auth_algs(priv
, param
->value
);
6671 case IW_AUTH_WPA_ENABLED
:
6672 ret
= ipw_wpa_enable(priv
, param
->value
);
6673 ipw_disassociate(priv
);
6676 case IW_AUTH_RX_UNENCRYPTED_EAPOL
:
6677 ieee
->ieee802_1x
= param
->value
;
6680 case IW_AUTH_PRIVACY_INVOKED
:
6681 ieee
->privacy_invoked
= param
->value
;
6691 static int ipw_wx_get_auth(struct net_device
*dev
,
6692 struct iw_request_info
*info
,
6693 union iwreq_data
*wrqu
, char *extra
)
6695 struct ipw_priv
*priv
= libipw_priv(dev
);
6696 struct libipw_device
*ieee
= priv
->ieee
;
6697 struct lib80211_crypt_data
*crypt
;
6698 struct iw_param
*param
= &wrqu
->param
;
6700 switch (param
->flags
& IW_AUTH_INDEX
) {
6701 case IW_AUTH_WPA_VERSION
:
6702 case IW_AUTH_CIPHER_PAIRWISE
:
6703 case IW_AUTH_CIPHER_GROUP
:
6704 case IW_AUTH_KEY_MGMT
:
6706 * wpa_supplicant will control these internally
6710 case IW_AUTH_TKIP_COUNTERMEASURES
:
6711 crypt
= priv
->ieee
->crypt_info
.crypt
[priv
->ieee
->crypt_info
.tx_keyidx
];
6712 if (!crypt
|| !crypt
->ops
->get_flags
)
6715 param
->value
= (crypt
->ops
->get_flags(crypt
->priv
) &
6716 IEEE80211_CRYPTO_TKIP_COUNTERMEASURES
) ? 1 : 0;
6720 case IW_AUTH_DROP_UNENCRYPTED
:
6721 param
->value
= ieee
->drop_unencrypted
;
6724 case IW_AUTH_80211_AUTH_ALG
:
6725 param
->value
= ieee
->sec
.auth_mode
;
6728 case IW_AUTH_WPA_ENABLED
:
6729 param
->value
= ieee
->wpa_enabled
;
6732 case IW_AUTH_RX_UNENCRYPTED_EAPOL
:
6733 param
->value
= ieee
->ieee802_1x
;
6736 case IW_AUTH_ROAMING_CONTROL
:
6737 case IW_AUTH_PRIVACY_INVOKED
:
6738 param
->value
= ieee
->privacy_invoked
;
6747 /* SIOCSIWENCODEEXT */
6748 static int ipw_wx_set_encodeext(struct net_device
*dev
,
6749 struct iw_request_info
*info
,
6750 union iwreq_data
*wrqu
, char *extra
)
6752 struct ipw_priv
*priv
= libipw_priv(dev
);
6753 struct iw_encode_ext
*ext
= (struct iw_encode_ext
*)extra
;
6756 if (ext
->alg
== IW_ENCODE_ALG_TKIP
) {
6757 /* IPW HW can't build TKIP MIC,
6758 host decryption still needed */
6759 if (ext
->ext_flags
& IW_ENCODE_EXT_GROUP_KEY
)
6760 priv
->ieee
->host_mc_decrypt
= 1;
6762 priv
->ieee
->host_encrypt
= 0;
6763 priv
->ieee
->host_encrypt_msdu
= 1;
6764 priv
->ieee
->host_decrypt
= 1;
6767 priv
->ieee
->host_encrypt
= 0;
6768 priv
->ieee
->host_encrypt_msdu
= 0;
6769 priv
->ieee
->host_decrypt
= 0;
6770 priv
->ieee
->host_mc_decrypt
= 0;
6774 return libipw_wx_set_encodeext(priv
->ieee
, info
, wrqu
, extra
);
6777 /* SIOCGIWENCODEEXT */
6778 static int ipw_wx_get_encodeext(struct net_device
*dev
,
6779 struct iw_request_info
*info
,
6780 union iwreq_data
*wrqu
, char *extra
)
6782 struct ipw_priv
*priv
= libipw_priv(dev
);
6783 return libipw_wx_get_encodeext(priv
->ieee
, info
, wrqu
, extra
);
6787 static int ipw_wx_set_mlme(struct net_device
*dev
,
6788 struct iw_request_info
*info
,
6789 union iwreq_data
*wrqu
, char *extra
)
6791 struct ipw_priv
*priv
= libipw_priv(dev
);
6792 struct iw_mlme
*mlme
= (struct iw_mlme
*)extra
;
6794 switch (mlme
->cmd
) {
6795 case IW_MLME_DEAUTH
:
6796 /* silently ignore */
6799 case IW_MLME_DISASSOC
:
6800 ipw_disassociate(priv
);
6809 #ifdef CONFIG_IPW2200_QOS
6813 * get the modulation type of the current network or
6814 * the card current mode
6816 static u8
ipw_qos_current_mode(struct ipw_priv
* priv
)
6820 if (priv
->status
& STATUS_ASSOCIATED
) {
6821 unsigned long flags
;
6823 spin_lock_irqsave(&priv
->ieee
->lock
, flags
);
6824 mode
= priv
->assoc_network
->mode
;
6825 spin_unlock_irqrestore(&priv
->ieee
->lock
, flags
);
6827 mode
= priv
->ieee
->mode
;
6829 IPW_DEBUG_QOS("QoS network/card mode %d\n", mode
);
6834 * Handle management frame beacon and probe response
6836 static int ipw_qos_handle_probe_response(struct ipw_priv
*priv
,
6838 struct libipw_network
*network
)
6840 u32 size
= sizeof(struct libipw_qos_parameters
);
6842 if (network
->capability
& WLAN_CAPABILITY_IBSS
)
6843 network
->qos_data
.active
= network
->qos_data
.supported
;
6845 if (network
->flags
& NETWORK_HAS_QOS_MASK
) {
6846 if (active_network
&&
6847 (network
->flags
& NETWORK_HAS_QOS_PARAMETERS
))
6848 network
->qos_data
.active
= network
->qos_data
.supported
;
6850 if ((network
->qos_data
.active
== 1) && (active_network
== 1) &&
6851 (network
->flags
& NETWORK_HAS_QOS_PARAMETERS
) &&
6852 (network
->qos_data
.old_param_count
!=
6853 network
->qos_data
.param_count
)) {
6854 network
->qos_data
.old_param_count
=
6855 network
->qos_data
.param_count
;
6856 schedule_work(&priv
->qos_activate
);
6857 IPW_DEBUG_QOS("QoS parameters change call "
6861 if ((priv
->ieee
->mode
== IEEE_B
) || (network
->mode
== IEEE_B
))
6862 memcpy(&network
->qos_data
.parameters
,
6863 &def_parameters_CCK
, size
);
6865 memcpy(&network
->qos_data
.parameters
,
6866 &def_parameters_OFDM
, size
);
6868 if ((network
->qos_data
.active
== 1) && (active_network
== 1)) {
6869 IPW_DEBUG_QOS("QoS was disabled call qos_activate\n");
6870 schedule_work(&priv
->qos_activate
);
6873 network
->qos_data
.active
= 0;
6874 network
->qos_data
.supported
= 0;
6876 if ((priv
->status
& STATUS_ASSOCIATED
) &&
6877 (priv
->ieee
->iw_mode
== IW_MODE_ADHOC
) && (active_network
== 0)) {
6878 if (!ether_addr_equal(network
->bssid
, priv
->bssid
))
6879 if (network
->capability
& WLAN_CAPABILITY_IBSS
)
6880 if ((network
->ssid_len
==
6881 priv
->assoc_network
->ssid_len
) &&
6882 !memcmp(network
->ssid
,
6883 priv
->assoc_network
->ssid
,
6884 network
->ssid_len
)) {
6885 schedule_work(&priv
->merge_networks
);
6893 * This function set up the firmware to support QoS. It sends
6894 * IPW_CMD_QOS_PARAMETERS and IPW_CMD_WME_INFO
6896 static int ipw_qos_activate(struct ipw_priv
*priv
,
6897 struct libipw_qos_data
*qos_network_data
)
6900 struct libipw_qos_parameters qos_parameters
[QOS_QOS_SETS
];
6901 struct libipw_qos_parameters
*active_one
= NULL
;
6902 u32 size
= sizeof(struct libipw_qos_parameters
);
6907 type
= ipw_qos_current_mode(priv
);
6909 active_one
= &(qos_parameters
[QOS_PARAM_SET_DEF_CCK
]);
6910 memcpy(active_one
, priv
->qos_data
.def_qos_parm_CCK
, size
);
6911 active_one
= &(qos_parameters
[QOS_PARAM_SET_DEF_OFDM
]);
6912 memcpy(active_one
, priv
->qos_data
.def_qos_parm_OFDM
, size
);
6914 if (qos_network_data
== NULL
) {
6915 if (type
== IEEE_B
) {
6916 IPW_DEBUG_QOS("QoS activate network mode %d\n", type
);
6917 active_one
= &def_parameters_CCK
;
6919 active_one
= &def_parameters_OFDM
;
6921 memcpy(&qos_parameters
[QOS_PARAM_SET_ACTIVE
], active_one
, size
);
6922 burst_duration
= ipw_qos_get_burst_duration(priv
);
6923 for (i
= 0; i
< QOS_QUEUE_NUM
; i
++)
6924 qos_parameters
[QOS_PARAM_SET_ACTIVE
].tx_op_limit
[i
] =
6925 cpu_to_le16(burst_duration
);
6926 } else if (priv
->ieee
->iw_mode
== IW_MODE_ADHOC
) {
6927 if (type
== IEEE_B
) {
6928 IPW_DEBUG_QOS("QoS activate IBSS network mode %d\n",
6930 if (priv
->qos_data
.qos_enable
== 0)
6931 active_one
= &def_parameters_CCK
;
6933 active_one
= priv
->qos_data
.def_qos_parm_CCK
;
6935 if (priv
->qos_data
.qos_enable
== 0)
6936 active_one
= &def_parameters_OFDM
;
6938 active_one
= priv
->qos_data
.def_qos_parm_OFDM
;
6940 memcpy(&qos_parameters
[QOS_PARAM_SET_ACTIVE
], active_one
, size
);
6942 unsigned long flags
;
6945 spin_lock_irqsave(&priv
->ieee
->lock
, flags
);
6946 active_one
= &(qos_network_data
->parameters
);
6947 qos_network_data
->old_param_count
=
6948 qos_network_data
->param_count
;
6949 memcpy(&qos_parameters
[QOS_PARAM_SET_ACTIVE
], active_one
, size
);
6950 active
= qos_network_data
->supported
;
6951 spin_unlock_irqrestore(&priv
->ieee
->lock
, flags
);
6954 burst_duration
= ipw_qos_get_burst_duration(priv
);
6955 for (i
= 0; i
< QOS_QUEUE_NUM
; i
++)
6956 qos_parameters
[QOS_PARAM_SET_ACTIVE
].
6957 tx_op_limit
[i
] = cpu_to_le16(burst_duration
);
6961 IPW_DEBUG_QOS("QoS sending IPW_CMD_QOS_PARAMETERS\n");
6962 err
= ipw_send_qos_params_command(priv
, &qos_parameters
[0]);
6964 IPW_DEBUG_QOS("QoS IPW_CMD_QOS_PARAMETERS failed\n");
6970 * send IPW_CMD_WME_INFO to the firmware
6972 static int ipw_qos_set_info_element(struct ipw_priv
*priv
)
6975 struct libipw_qos_information_element qos_info
;
6980 qos_info
.elementID
= QOS_ELEMENT_ID
;
6981 qos_info
.length
= sizeof(struct libipw_qos_information_element
) - 2;
6983 qos_info
.version
= QOS_VERSION_1
;
6984 qos_info
.ac_info
= 0;
6986 memcpy(qos_info
.qui
, qos_oui
, QOS_OUI_LEN
);
6987 qos_info
.qui_type
= QOS_OUI_TYPE
;
6988 qos_info
.qui_subtype
= QOS_OUI_INFO_SUB_TYPE
;
6990 ret
= ipw_send_qos_info_command(priv
, &qos_info
);
6992 IPW_DEBUG_QOS("QoS error calling ipw_send_qos_info_command\n");
6998 * Set the QoS parameter with the association request structure
7000 static int ipw_qos_association(struct ipw_priv
*priv
,
7001 struct libipw_network
*network
)
7004 struct libipw_qos_data
*qos_data
= NULL
;
7005 struct libipw_qos_data ibss_data
= {
7010 switch (priv
->ieee
->iw_mode
) {
7012 BUG_ON(!(network
->capability
& WLAN_CAPABILITY_IBSS
));
7014 qos_data
= &ibss_data
;
7018 qos_data
= &network
->qos_data
;
7026 err
= ipw_qos_activate(priv
, qos_data
);
7028 priv
->assoc_request
.policy_support
&= ~HC_QOS_SUPPORT_ASSOC
;
7032 if (priv
->qos_data
.qos_enable
&& qos_data
->supported
) {
7033 IPW_DEBUG_QOS("QoS will be enabled for this association\n");
7034 priv
->assoc_request
.policy_support
|= HC_QOS_SUPPORT_ASSOC
;
7035 return ipw_qos_set_info_element(priv
);
7042 * handling the beaconing responses. if we get different QoS setting
7043 * off the network from the associated setting, adjust the QoS
7046 static void ipw_qos_association_resp(struct ipw_priv
*priv
,
7047 struct libipw_network
*network
)
7049 unsigned long flags
;
7050 u32 size
= sizeof(struct libipw_qos_parameters
);
7051 int set_qos_param
= 0;
7053 if ((priv
== NULL
) || (network
== NULL
) ||
7054 (priv
->assoc_network
== NULL
))
7057 if (!(priv
->status
& STATUS_ASSOCIATED
))
7060 if ((priv
->ieee
->iw_mode
!= IW_MODE_INFRA
))
7063 spin_lock_irqsave(&priv
->ieee
->lock
, flags
);
7064 if (network
->flags
& NETWORK_HAS_QOS_PARAMETERS
) {
7065 memcpy(&priv
->assoc_network
->qos_data
, &network
->qos_data
,
7066 sizeof(struct libipw_qos_data
));
7067 priv
->assoc_network
->qos_data
.active
= 1;
7068 if ((network
->qos_data
.old_param_count
!=
7069 network
->qos_data
.param_count
)) {
7071 network
->qos_data
.old_param_count
=
7072 network
->qos_data
.param_count
;
7076 if ((network
->mode
== IEEE_B
) || (priv
->ieee
->mode
== IEEE_B
))
7077 memcpy(&priv
->assoc_network
->qos_data
.parameters
,
7078 &def_parameters_CCK
, size
);
7080 memcpy(&priv
->assoc_network
->qos_data
.parameters
,
7081 &def_parameters_OFDM
, size
);
7082 priv
->assoc_network
->qos_data
.active
= 0;
7083 priv
->assoc_network
->qos_data
.supported
= 0;
7087 spin_unlock_irqrestore(&priv
->ieee
->lock
, flags
);
7089 if (set_qos_param
== 1)
7090 schedule_work(&priv
->qos_activate
);
7093 static u32
ipw_qos_get_burst_duration(struct ipw_priv
*priv
)
7100 if (!(priv
->ieee
->modulation
& LIBIPW_OFDM_MODULATION
))
7101 ret
= priv
->qos_data
.burst_duration_CCK
;
7103 ret
= priv
->qos_data
.burst_duration_OFDM
;
7109 * Initialize the setting of QoS global
7111 static void ipw_qos_init(struct ipw_priv
*priv
, int enable
,
7112 int burst_enable
, u32 burst_duration_CCK
,
7113 u32 burst_duration_OFDM
)
7115 priv
->qos_data
.qos_enable
= enable
;
7117 if (priv
->qos_data
.qos_enable
) {
7118 priv
->qos_data
.def_qos_parm_CCK
= &def_qos_parameters_CCK
;
7119 priv
->qos_data
.def_qos_parm_OFDM
= &def_qos_parameters_OFDM
;
7120 IPW_DEBUG_QOS("QoS is enabled\n");
7122 priv
->qos_data
.def_qos_parm_CCK
= &def_parameters_CCK
;
7123 priv
->qos_data
.def_qos_parm_OFDM
= &def_parameters_OFDM
;
7124 IPW_DEBUG_QOS("QoS is not enabled\n");
7127 priv
->qos_data
.burst_enable
= burst_enable
;
7130 priv
->qos_data
.burst_duration_CCK
= burst_duration_CCK
;
7131 priv
->qos_data
.burst_duration_OFDM
= burst_duration_OFDM
;
7133 priv
->qos_data
.burst_duration_CCK
= 0;
7134 priv
->qos_data
.burst_duration_OFDM
= 0;
7139 * map the packet priority to the right TX Queue
7141 static int ipw_get_tx_queue_number(struct ipw_priv
*priv
, u16 priority
)
7143 if (priority
> 7 || !priv
->qos_data
.qos_enable
)
7146 return from_priority_to_tx_queue
[priority
] - 1;
7149 static int ipw_is_qos_active(struct net_device
*dev
,
7150 struct sk_buff
*skb
)
7152 struct ipw_priv
*priv
= libipw_priv(dev
);
7153 struct libipw_qos_data
*qos_data
= NULL
;
7154 int active
, supported
;
7155 u8
*daddr
= skb
->data
+ ETH_ALEN
;
7156 int unicast
= !is_multicast_ether_addr(daddr
);
7158 if (!(priv
->status
& STATUS_ASSOCIATED
))
7161 qos_data
= &priv
->assoc_network
->qos_data
;
7163 if (priv
->ieee
->iw_mode
== IW_MODE_ADHOC
) {
7165 qos_data
->active
= 0;
7167 qos_data
->active
= qos_data
->supported
;
7169 active
= qos_data
->active
;
7170 supported
= qos_data
->supported
;
7171 IPW_DEBUG_QOS("QoS %d network is QoS active %d supported %d "
7173 priv
->qos_data
.qos_enable
, active
, supported
, unicast
);
7174 if (active
&& priv
->qos_data
.qos_enable
)
7181 * add QoS parameter to the TX command
7183 static int ipw_qos_set_tx_queue_command(struct ipw_priv
*priv
,
7185 struct tfd_data
*tfd
)
7187 int tx_queue_id
= 0;
7190 tx_queue_id
= from_priority_to_tx_queue
[priority
] - 1;
7191 tfd
->tx_flags_ext
|= DCT_FLAG_EXT_QOS_ENABLED
;
7193 if (priv
->qos_data
.qos_no_ack_mask
& (1UL << tx_queue_id
)) {
7194 tfd
->tx_flags
&= ~DCT_FLAG_ACK_REQD
;
7195 tfd
->tfd
.tfd_26
.mchdr
.qos_ctrl
|= cpu_to_le16(CTRL_QOS_NO_ACK
);
7201 * background support to run QoS activate functionality
7203 static void ipw_bg_qos_activate(struct work_struct
*work
)
7205 struct ipw_priv
*priv
=
7206 container_of(work
, struct ipw_priv
, qos_activate
);
7208 mutex_lock(&priv
->mutex
);
7210 if (priv
->status
& STATUS_ASSOCIATED
)
7211 ipw_qos_activate(priv
, &(priv
->assoc_network
->qos_data
));
7213 mutex_unlock(&priv
->mutex
);
7216 static int ipw_handle_probe_response(struct net_device
*dev
,
7217 struct libipw_probe_response
*resp
,
7218 struct libipw_network
*network
)
7220 struct ipw_priv
*priv
= libipw_priv(dev
);
7221 int active_network
= ((priv
->status
& STATUS_ASSOCIATED
) &&
7222 (network
== priv
->assoc_network
));
7224 ipw_qos_handle_probe_response(priv
, active_network
, network
);
7229 static int ipw_handle_beacon(struct net_device
*dev
,
7230 struct libipw_beacon
*resp
,
7231 struct libipw_network
*network
)
7233 struct ipw_priv
*priv
= libipw_priv(dev
);
7234 int active_network
= ((priv
->status
& STATUS_ASSOCIATED
) &&
7235 (network
== priv
->assoc_network
));
7237 ipw_qos_handle_probe_response(priv
, active_network
, network
);
7242 static int ipw_handle_assoc_response(struct net_device
*dev
,
7243 struct libipw_assoc_response
*resp
,
7244 struct libipw_network
*network
)
7246 struct ipw_priv
*priv
= libipw_priv(dev
);
7247 ipw_qos_association_resp(priv
, network
);
7251 static int ipw_send_qos_params_command(struct ipw_priv
*priv
, struct libipw_qos_parameters
7254 return ipw_send_cmd_pdu(priv
, IPW_CMD_QOS_PARAMETERS
,
7255 sizeof(*qos_param
) * 3, qos_param
);
7258 static int ipw_send_qos_info_command(struct ipw_priv
*priv
, struct libipw_qos_information_element
7261 return ipw_send_cmd_pdu(priv
, IPW_CMD_WME_INFO
, sizeof(*qos_param
),
7265 #endif /* CONFIG_IPW2200_QOS */
7267 static int ipw_associate_network(struct ipw_priv
*priv
,
7268 struct libipw_network
*network
,
7269 struct ipw_supported_rates
*rates
, int roaming
)
7273 if (priv
->config
& CFG_FIXED_RATE
)
7274 ipw_set_fixed_rate(priv
, network
->mode
);
7276 if (!(priv
->config
& CFG_STATIC_ESSID
)) {
7277 priv
->essid_len
= min(network
->ssid_len
,
7278 (u8
) IW_ESSID_MAX_SIZE
);
7279 memcpy(priv
->essid
, network
->ssid
, priv
->essid_len
);
7282 network
->last_associate
= jiffies
;
7284 memset(&priv
->assoc_request
, 0, sizeof(priv
->assoc_request
));
7285 priv
->assoc_request
.channel
= network
->channel
;
7286 priv
->assoc_request
.auth_key
= 0;
7288 if ((priv
->capability
& CAP_PRIVACY_ON
) &&
7289 (priv
->ieee
->sec
.auth_mode
== WLAN_AUTH_SHARED_KEY
)) {
7290 priv
->assoc_request
.auth_type
= AUTH_SHARED_KEY
;
7291 priv
->assoc_request
.auth_key
= priv
->ieee
->sec
.active_key
;
7293 if (priv
->ieee
->sec
.level
== SEC_LEVEL_1
)
7294 ipw_send_wep_keys(priv
, DCW_WEP_KEY_SEC_TYPE_WEP
);
7296 } else if ((priv
->capability
& CAP_PRIVACY_ON
) &&
7297 (priv
->ieee
->sec
.auth_mode
== WLAN_AUTH_LEAP
))
7298 priv
->assoc_request
.auth_type
= AUTH_LEAP
;
7300 priv
->assoc_request
.auth_type
= AUTH_OPEN
;
7302 if (priv
->ieee
->wpa_ie_len
) {
7303 priv
->assoc_request
.policy_support
= cpu_to_le16(0x02); /* RSN active */
7304 ipw_set_rsn_capa(priv
, priv
->ieee
->wpa_ie
,
7305 priv
->ieee
->wpa_ie_len
);
7309 * It is valid for our ieee device to support multiple modes, but
7310 * when it comes to associating to a given network we have to choose
7313 if (network
->mode
& priv
->ieee
->mode
& IEEE_A
)
7314 priv
->assoc_request
.ieee_mode
= IPW_A_MODE
;
7315 else if (network
->mode
& priv
->ieee
->mode
& IEEE_G
)
7316 priv
->assoc_request
.ieee_mode
= IPW_G_MODE
;
7317 else if (network
->mode
& priv
->ieee
->mode
& IEEE_B
)
7318 priv
->assoc_request
.ieee_mode
= IPW_B_MODE
;
7320 priv
->assoc_request
.capability
= cpu_to_le16(network
->capability
);
7321 if ((network
->capability
& WLAN_CAPABILITY_SHORT_PREAMBLE
)
7322 && !(priv
->config
& CFG_PREAMBLE_LONG
)) {
7323 priv
->assoc_request
.preamble_length
= DCT_FLAG_SHORT_PREAMBLE
;
7325 priv
->assoc_request
.preamble_length
= DCT_FLAG_LONG_PREAMBLE
;
7327 /* Clear the short preamble if we won't be supporting it */
7328 priv
->assoc_request
.capability
&=
7329 ~cpu_to_le16(WLAN_CAPABILITY_SHORT_PREAMBLE
);
7332 /* Clear capability bits that aren't used in Ad Hoc */
7333 if (priv
->ieee
->iw_mode
== IW_MODE_ADHOC
)
7334 priv
->assoc_request
.capability
&=
7335 ~cpu_to_le16(WLAN_CAPABILITY_SHORT_SLOT_TIME
);
7337 IPW_DEBUG_ASSOC("%ssociation attempt: '%*pE', channel %d, 802.11%c [%d], %s[:%s], enc=%s%s%s%c%c\n",
7338 roaming
? "Rea" : "A",
7339 priv
->essid_len
, priv
->essid
,
7341 ipw_modes
[priv
->assoc_request
.ieee_mode
],
7343 (priv
->assoc_request
.preamble_length
==
7344 DCT_FLAG_LONG_PREAMBLE
) ? "long" : "short",
7345 network
->capability
&
7346 WLAN_CAPABILITY_SHORT_PREAMBLE
? "short" : "long",
7347 priv
->capability
& CAP_PRIVACY_ON
? "on " : "off",
7348 priv
->capability
& CAP_PRIVACY_ON
?
7349 (priv
->capability
& CAP_SHARED_KEY
? "(shared)" :
7351 priv
->capability
& CAP_PRIVACY_ON
? " key=" : "",
7352 priv
->capability
& CAP_PRIVACY_ON
?
7353 '1' + priv
->ieee
->sec
.active_key
: '.',
7354 priv
->capability
& CAP_PRIVACY_ON
? '.' : ' ');
7356 priv
->assoc_request
.beacon_interval
= cpu_to_le16(network
->beacon_interval
);
7357 if ((priv
->ieee
->iw_mode
== IW_MODE_ADHOC
) &&
7358 (network
->time_stamp
[0] == 0) && (network
->time_stamp
[1] == 0)) {
7359 priv
->assoc_request
.assoc_type
= HC_IBSS_START
;
7360 priv
->assoc_request
.assoc_tsf_msw
= 0;
7361 priv
->assoc_request
.assoc_tsf_lsw
= 0;
7363 if (unlikely(roaming
))
7364 priv
->assoc_request
.assoc_type
= HC_REASSOCIATE
;
7366 priv
->assoc_request
.assoc_type
= HC_ASSOCIATE
;
7367 priv
->assoc_request
.assoc_tsf_msw
= cpu_to_le32(network
->time_stamp
[1]);
7368 priv
->assoc_request
.assoc_tsf_lsw
= cpu_to_le32(network
->time_stamp
[0]);
7371 memcpy(priv
->assoc_request
.bssid
, network
->bssid
, ETH_ALEN
);
7373 if (priv
->ieee
->iw_mode
== IW_MODE_ADHOC
) {
7374 eth_broadcast_addr(priv
->assoc_request
.dest
);
7375 priv
->assoc_request
.atim_window
= cpu_to_le16(network
->atim_window
);
7377 memcpy(priv
->assoc_request
.dest
, network
->bssid
, ETH_ALEN
);
7378 priv
->assoc_request
.atim_window
= 0;
7381 priv
->assoc_request
.listen_interval
= cpu_to_le16(network
->listen_interval
);
7383 err
= ipw_send_ssid(priv
, priv
->essid
, priv
->essid_len
);
7385 IPW_DEBUG_HC("Attempt to send SSID command failed.\n");
7389 rates
->ieee_mode
= priv
->assoc_request
.ieee_mode
;
7390 rates
->purpose
= IPW_RATE_CONNECT
;
7391 ipw_send_supported_rates(priv
, rates
);
7393 if (priv
->assoc_request
.ieee_mode
== IPW_G_MODE
)
7394 priv
->sys_config
.dot11g_auto_detection
= 1;
7396 priv
->sys_config
.dot11g_auto_detection
= 0;
7398 if (priv
->ieee
->iw_mode
== IW_MODE_ADHOC
)
7399 priv
->sys_config
.answer_broadcast_ssid_probe
= 1;
7401 priv
->sys_config
.answer_broadcast_ssid_probe
= 0;
7403 err
= ipw_send_system_config(priv
);
7405 IPW_DEBUG_HC("Attempt to send sys config command failed.\n");
7409 IPW_DEBUG_ASSOC("Association sensitivity: %d\n", network
->stats
.rssi
);
7410 err
= ipw_set_sensitivity(priv
, network
->stats
.rssi
+ IPW_RSSI_TO_DBM
);
7412 IPW_DEBUG_HC("Attempt to send associate command failed.\n");
7417 * If preemption is enabled, it is possible for the association
7418 * to complete before we return from ipw_send_associate. Therefore
7419 * we have to be sure and update our priviate data first.
7421 priv
->channel
= network
->channel
;
7422 memcpy(priv
->bssid
, network
->bssid
, ETH_ALEN
);
7423 priv
->status
|= STATUS_ASSOCIATING
;
7424 priv
->status
&= ~STATUS_SECURITY_UPDATED
;
7426 priv
->assoc_network
= network
;
7428 #ifdef CONFIG_IPW2200_QOS
7429 ipw_qos_association(priv
, network
);
7432 err
= ipw_send_associate(priv
, &priv
->assoc_request
);
7434 IPW_DEBUG_HC("Attempt to send associate command failed.\n");
7438 IPW_DEBUG(IPW_DL_STATE
, "associating: '%*pE' %pM\n",
7439 priv
->essid_len
, priv
->essid
, priv
->bssid
);
7444 static void ipw_roam(void *data
)
7446 struct ipw_priv
*priv
= data
;
7447 struct libipw_network
*network
= NULL
;
7448 struct ipw_network_match match
= {
7449 .network
= priv
->assoc_network
7452 /* The roaming process is as follows:
7454 * 1. Missed beacon threshold triggers the roaming process by
7455 * setting the status ROAM bit and requesting a scan.
7456 * 2. When the scan completes, it schedules the ROAM work
7457 * 3. The ROAM work looks at all of the known networks for one that
7458 * is a better network than the currently associated. If none
7459 * found, the ROAM process is over (ROAM bit cleared)
7460 * 4. If a better network is found, a disassociation request is
7462 * 5. When the disassociation completes, the roam work is again
7463 * scheduled. The second time through, the driver is no longer
7464 * associated, and the newly selected network is sent an
7465 * association request.
7466 * 6. At this point ,the roaming process is complete and the ROAM
7467 * status bit is cleared.
7470 /* If we are no longer associated, and the roaming bit is no longer
7471 * set, then we are not actively roaming, so just return */
7472 if (!(priv
->status
& (STATUS_ASSOCIATED
| STATUS_ROAMING
)))
7475 if (priv
->status
& STATUS_ASSOCIATED
) {
7476 /* First pass through ROAM process -- look for a better
7478 unsigned long flags
;
7479 u8 rssi
= priv
->assoc_network
->stats
.rssi
;
7480 priv
->assoc_network
->stats
.rssi
= -128;
7481 spin_lock_irqsave(&priv
->ieee
->lock
, flags
);
7482 list_for_each_entry(network
, &priv
->ieee
->network_list
, list
) {
7483 if (network
!= priv
->assoc_network
)
7484 ipw_best_network(priv
, &match
, network
, 1);
7486 spin_unlock_irqrestore(&priv
->ieee
->lock
, flags
);
7487 priv
->assoc_network
->stats
.rssi
= rssi
;
7489 if (match
.network
== priv
->assoc_network
) {
7490 IPW_DEBUG_ASSOC("No better APs in this network to "
7492 priv
->status
&= ~STATUS_ROAMING
;
7493 ipw_debug_config(priv
);
7497 ipw_send_disassociate(priv
, 1);
7498 priv
->assoc_network
= match
.network
;
7503 /* Second pass through ROAM process -- request association */
7504 ipw_compatible_rates(priv
, priv
->assoc_network
, &match
.rates
);
7505 ipw_associate_network(priv
, priv
->assoc_network
, &match
.rates
, 1);
7506 priv
->status
&= ~STATUS_ROAMING
;
7509 static void ipw_bg_roam(struct work_struct
*work
)
7511 struct ipw_priv
*priv
=
7512 container_of(work
, struct ipw_priv
, roam
);
7513 mutex_lock(&priv
->mutex
);
7515 mutex_unlock(&priv
->mutex
);
7518 static int ipw_associate(void *data
)
7520 struct ipw_priv
*priv
= data
;
7522 struct libipw_network
*network
= NULL
;
7523 struct ipw_network_match match
= {
7526 struct ipw_supported_rates
*rates
;
7527 struct list_head
*element
;
7528 unsigned long flags
;
7530 if (priv
->ieee
->iw_mode
== IW_MODE_MONITOR
) {
7531 IPW_DEBUG_ASSOC("Not attempting association (monitor mode)\n");
7535 if (priv
->status
& (STATUS_ASSOCIATED
| STATUS_ASSOCIATING
)) {
7536 IPW_DEBUG_ASSOC("Not attempting association (already in "
7541 if (priv
->status
& STATUS_DISASSOCIATING
) {
7542 IPW_DEBUG_ASSOC("Not attempting association (in disassociating)\n");
7543 schedule_work(&priv
->associate
);
7547 if (!ipw_is_init(priv
) || (priv
->status
& STATUS_SCANNING
)) {
7548 IPW_DEBUG_ASSOC("Not attempting association (scanning or not "
7553 if (!(priv
->config
& CFG_ASSOCIATE
) &&
7554 !(priv
->config
& (CFG_STATIC_ESSID
| CFG_STATIC_BSSID
))) {
7555 IPW_DEBUG_ASSOC("Not attempting association (associate=0)\n");
7559 /* Protect our use of the network_list */
7560 spin_lock_irqsave(&priv
->ieee
->lock
, flags
);
7561 list_for_each_entry(network
, &priv
->ieee
->network_list
, list
)
7562 ipw_best_network(priv
, &match
, network
, 0);
7564 network
= match
.network
;
7565 rates
= &match
.rates
;
7567 if (network
== NULL
&&
7568 priv
->ieee
->iw_mode
== IW_MODE_ADHOC
&&
7569 priv
->config
& CFG_ADHOC_CREATE
&&
7570 priv
->config
& CFG_STATIC_ESSID
&&
7571 priv
->config
& CFG_STATIC_CHANNEL
) {
7572 /* Use oldest network if the free list is empty */
7573 if (list_empty(&priv
->ieee
->network_free_list
)) {
7574 struct libipw_network
*oldest
= NULL
;
7575 struct libipw_network
*target
;
7577 list_for_each_entry(target
, &priv
->ieee
->network_list
, list
) {
7578 if ((oldest
== NULL
) ||
7579 (target
->last_scanned
< oldest
->last_scanned
))
7583 /* If there are no more slots, expire the oldest */
7584 list_del(&oldest
->list
);
7586 IPW_DEBUG_ASSOC("Expired '%*pE' (%pM) from network list.\n",
7587 target
->ssid_len
, target
->ssid
,
7589 list_add_tail(&target
->list
,
7590 &priv
->ieee
->network_free_list
);
7593 element
= priv
->ieee
->network_free_list
.next
;
7594 network
= list_entry(element
, struct libipw_network
, list
);
7595 ipw_adhoc_create(priv
, network
);
7596 rates
= &priv
->rates
;
7598 list_add_tail(&network
->list
, &priv
->ieee
->network_list
);
7600 spin_unlock_irqrestore(&priv
->ieee
->lock
, flags
);
7602 /* If we reached the end of the list, then we don't have any valid
7605 ipw_debug_config(priv
);
7607 if (!(priv
->status
& STATUS_SCANNING
)) {
7608 if (!(priv
->config
& CFG_SPEED_SCAN
))
7609 schedule_delayed_work(&priv
->request_scan
,
7612 schedule_delayed_work(&priv
->request_scan
, 0);
7618 ipw_associate_network(priv
, network
, rates
, 0);
7623 static void ipw_bg_associate(struct work_struct
*work
)
7625 struct ipw_priv
*priv
=
7626 container_of(work
, struct ipw_priv
, associate
);
7627 mutex_lock(&priv
->mutex
);
7628 ipw_associate(priv
);
7629 mutex_unlock(&priv
->mutex
);
7632 static void ipw_rebuild_decrypted_skb(struct ipw_priv
*priv
,
7633 struct sk_buff
*skb
)
7635 struct ieee80211_hdr
*hdr
;
7638 hdr
= (struct ieee80211_hdr
*)skb
->data
;
7639 fc
= le16_to_cpu(hdr
->frame_control
);
7640 if (!(fc
& IEEE80211_FCTL_PROTECTED
))
7643 fc
&= ~IEEE80211_FCTL_PROTECTED
;
7644 hdr
->frame_control
= cpu_to_le16(fc
);
7645 switch (priv
->ieee
->sec
.level
) {
7647 /* Remove CCMP HDR */
7648 memmove(skb
->data
+ LIBIPW_3ADDR_LEN
,
7649 skb
->data
+ LIBIPW_3ADDR_LEN
+ 8,
7650 skb
->len
- LIBIPW_3ADDR_LEN
- 8);
7651 skb_trim(skb
, skb
->len
- 16); /* CCMP_HDR_LEN + CCMP_MIC_LEN */
7657 memmove(skb
->data
+ LIBIPW_3ADDR_LEN
,
7658 skb
->data
+ LIBIPW_3ADDR_LEN
+ 4,
7659 skb
->len
- LIBIPW_3ADDR_LEN
- 4);
7660 skb_trim(skb
, skb
->len
- 8); /* IV + ICV */
7665 printk(KERN_ERR
"Unknown security level %d\n",
7666 priv
->ieee
->sec
.level
);
7671 static void ipw_handle_data_packet(struct ipw_priv
*priv
,
7672 struct ipw_rx_mem_buffer
*rxb
,
7673 struct libipw_rx_stats
*stats
)
7675 struct net_device
*dev
= priv
->net_dev
;
7676 struct libipw_hdr_4addr
*hdr
;
7677 struct ipw_rx_packet
*pkt
= (struct ipw_rx_packet
*)rxb
->skb
->data
;
7679 /* We received data from the HW, so stop the watchdog */
7680 netif_trans_update(dev
);
7682 /* We only process data packets if the
7683 * interface is open */
7684 if (unlikely((le16_to_cpu(pkt
->u
.frame
.length
) + IPW_RX_FRAME_SIZE
) >
7685 skb_tailroom(rxb
->skb
))) {
7686 dev
->stats
.rx_errors
++;
7687 priv
->wstats
.discard
.misc
++;
7688 IPW_DEBUG_DROP("Corruption detected! Oh no!\n");
7690 } else if (unlikely(!netif_running(priv
->net_dev
))) {
7691 dev
->stats
.rx_dropped
++;
7692 priv
->wstats
.discard
.misc
++;
7693 IPW_DEBUG_DROP("Dropping packet while interface is not up.\n");
7697 /* Advance skb->data to the start of the actual payload */
7698 skb_reserve(rxb
->skb
, offsetof(struct ipw_rx_packet
, u
.frame
.data
));
7700 /* Set the size of the skb to the size of the frame */
7701 skb_put(rxb
->skb
, le16_to_cpu(pkt
->u
.frame
.length
));
7703 IPW_DEBUG_RX("Rx packet of %d bytes.\n", rxb
->skb
->len
);
7705 /* HW decrypt will not clear the WEP bit, MIC, PN, etc. */
7706 hdr
= (struct libipw_hdr_4addr
*)rxb
->skb
->data
;
7707 if (priv
->ieee
->iw_mode
!= IW_MODE_MONITOR
&&
7708 (is_multicast_ether_addr(hdr
->addr1
) ?
7709 !priv
->ieee
->host_mc_decrypt
: !priv
->ieee
->host_decrypt
))
7710 ipw_rebuild_decrypted_skb(priv
, rxb
->skb
);
7712 if (!libipw_rx(priv
->ieee
, rxb
->skb
, stats
))
7713 dev
->stats
.rx_errors
++;
7714 else { /* libipw_rx succeeded, so it now owns the SKB */
7716 __ipw_led_activity_on(priv
);
7720 #ifdef CONFIG_IPW2200_RADIOTAP
7721 static void ipw_handle_data_packet_monitor(struct ipw_priv
*priv
,
7722 struct ipw_rx_mem_buffer
*rxb
,
7723 struct libipw_rx_stats
*stats
)
7725 struct net_device
*dev
= priv
->net_dev
;
7726 struct ipw_rx_packet
*pkt
= (struct ipw_rx_packet
*)rxb
->skb
->data
;
7727 struct ipw_rx_frame
*frame
= &pkt
->u
.frame
;
7729 /* initial pull of some data */
7730 u16 received_channel
= frame
->received_channel
;
7731 u8 antennaAndPhy
= frame
->antennaAndPhy
;
7732 s8 antsignal
= frame
->rssi_dbm
- IPW_RSSI_TO_DBM
; /* call it signed anyhow */
7733 u16 pktrate
= frame
->rate
;
7735 /* Magic struct that slots into the radiotap header -- no reason
7736 * to build this manually element by element, we can write it much
7737 * more efficiently than we can parse it. ORDER MATTERS HERE */
7738 struct ipw_rt_hdr
*ipw_rt
;
7740 unsigned short len
= le16_to_cpu(pkt
->u
.frame
.length
);
7742 /* We received data from the HW, so stop the watchdog */
7743 netif_trans_update(dev
);
7745 /* We only process data packets if the
7746 * interface is open */
7747 if (unlikely((le16_to_cpu(pkt
->u
.frame
.length
) + IPW_RX_FRAME_SIZE
) >
7748 skb_tailroom(rxb
->skb
))) {
7749 dev
->stats
.rx_errors
++;
7750 priv
->wstats
.discard
.misc
++;
7751 IPW_DEBUG_DROP("Corruption detected! Oh no!\n");
7753 } else if (unlikely(!netif_running(priv
->net_dev
))) {
7754 dev
->stats
.rx_dropped
++;
7755 priv
->wstats
.discard
.misc
++;
7756 IPW_DEBUG_DROP("Dropping packet while interface is not up.\n");
7760 /* Libpcap 0.9.3+ can handle variable length radiotap, so we'll use
7762 if (len
> IPW_RX_BUF_SIZE
- sizeof(struct ipw_rt_hdr
)) {
7763 /* FIXME: Should alloc bigger skb instead */
7764 dev
->stats
.rx_dropped
++;
7765 priv
->wstats
.discard
.misc
++;
7766 IPW_DEBUG_DROP("Dropping too large packet in monitor\n");
7770 /* copy the frame itself */
7771 memmove(rxb
->skb
->data
+ sizeof(struct ipw_rt_hdr
),
7772 rxb
->skb
->data
+ IPW_RX_FRAME_SIZE
, len
);
7774 ipw_rt
= (struct ipw_rt_hdr
*)rxb
->skb
->data
;
7776 ipw_rt
->rt_hdr
.it_version
= PKTHDR_RADIOTAP_VERSION
;
7777 ipw_rt
->rt_hdr
.it_pad
= 0; /* always good to zero */
7778 ipw_rt
->rt_hdr
.it_len
= cpu_to_le16(sizeof(struct ipw_rt_hdr
)); /* total header+data */
7780 /* Big bitfield of all the fields we provide in radiotap */
7781 ipw_rt
->rt_hdr
.it_present
= cpu_to_le32(
7782 (1 << IEEE80211_RADIOTAP_TSFT
) |
7783 (1 << IEEE80211_RADIOTAP_FLAGS
) |
7784 (1 << IEEE80211_RADIOTAP_RATE
) |
7785 (1 << IEEE80211_RADIOTAP_CHANNEL
) |
7786 (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL
) |
7787 (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE
) |
7788 (1 << IEEE80211_RADIOTAP_ANTENNA
));
7790 /* Zero the flags, we'll add to them as we go */
7791 ipw_rt
->rt_flags
= 0;
7792 ipw_rt
->rt_tsf
= (u64
)(frame
->parent_tsf
[3] << 24 |
7793 frame
->parent_tsf
[2] << 16 |
7794 frame
->parent_tsf
[1] << 8 |
7795 frame
->parent_tsf
[0]);
7797 /* Convert signal to DBM */
7798 ipw_rt
->rt_dbmsignal
= antsignal
;
7799 ipw_rt
->rt_dbmnoise
= (s8
) le16_to_cpu(frame
->noise
);
7801 /* Convert the channel data and set the flags */
7802 ipw_rt
->rt_channel
= cpu_to_le16(ieee80211chan2mhz(received_channel
));
7803 if (received_channel
> 14) { /* 802.11a */
7804 ipw_rt
->rt_chbitmask
=
7805 cpu_to_le16((IEEE80211_CHAN_OFDM
| IEEE80211_CHAN_5GHZ
));
7806 } else if (antennaAndPhy
& 32) { /* 802.11b */
7807 ipw_rt
->rt_chbitmask
=
7808 cpu_to_le16((IEEE80211_CHAN_CCK
| IEEE80211_CHAN_2GHZ
));
7809 } else { /* 802.11g */
7810 ipw_rt
->rt_chbitmask
=
7811 cpu_to_le16(IEEE80211_CHAN_OFDM
| IEEE80211_CHAN_2GHZ
);
7814 /* set the rate in multiples of 500k/s */
7816 case IPW_TX_RATE_1MB
:
7817 ipw_rt
->rt_rate
= 2;
7819 case IPW_TX_RATE_2MB
:
7820 ipw_rt
->rt_rate
= 4;
7822 case IPW_TX_RATE_5MB
:
7823 ipw_rt
->rt_rate
= 10;
7825 case IPW_TX_RATE_6MB
:
7826 ipw_rt
->rt_rate
= 12;
7828 case IPW_TX_RATE_9MB
:
7829 ipw_rt
->rt_rate
= 18;
7831 case IPW_TX_RATE_11MB
:
7832 ipw_rt
->rt_rate
= 22;
7834 case IPW_TX_RATE_12MB
:
7835 ipw_rt
->rt_rate
= 24;
7837 case IPW_TX_RATE_18MB
:
7838 ipw_rt
->rt_rate
= 36;
7840 case IPW_TX_RATE_24MB
:
7841 ipw_rt
->rt_rate
= 48;
7843 case IPW_TX_RATE_36MB
:
7844 ipw_rt
->rt_rate
= 72;
7846 case IPW_TX_RATE_48MB
:
7847 ipw_rt
->rt_rate
= 96;
7849 case IPW_TX_RATE_54MB
:
7850 ipw_rt
->rt_rate
= 108;
7853 ipw_rt
->rt_rate
= 0;
7857 /* antenna number */
7858 ipw_rt
->rt_antenna
= (antennaAndPhy
& 3); /* Is this right? */
7860 /* set the preamble flag if we have it */
7861 if ((antennaAndPhy
& 64))
7862 ipw_rt
->rt_flags
|= IEEE80211_RADIOTAP_F_SHORTPRE
;
7864 /* Set the size of the skb to the size of the frame */
7865 skb_put(rxb
->skb
, len
+ sizeof(struct ipw_rt_hdr
));
7867 IPW_DEBUG_RX("Rx packet of %d bytes.\n", rxb
->skb
->len
);
7869 if (!libipw_rx(priv
->ieee
, rxb
->skb
, stats
))
7870 dev
->stats
.rx_errors
++;
7871 else { /* libipw_rx succeeded, so it now owns the SKB */
7873 /* no LED during capture */
7878 #ifdef CONFIG_IPW2200_PROMISCUOUS
7879 #define libipw_is_probe_response(fc) \
7880 ((fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_MGMT && \
7881 (fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_PROBE_RESP )
7883 #define libipw_is_management(fc) \
7884 ((fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_MGMT)
7886 #define libipw_is_control(fc) \
7887 ((fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_CTL)
7889 #define libipw_is_data(fc) \
7890 ((fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_DATA)
7892 #define libipw_is_assoc_request(fc) \
7893 ((fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_ASSOC_REQ)
7895 #define libipw_is_reassoc_request(fc) \
7896 ((fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_REASSOC_REQ)
7898 static void ipw_handle_promiscuous_rx(struct ipw_priv
*priv
,
7899 struct ipw_rx_mem_buffer
*rxb
,
7900 struct libipw_rx_stats
*stats
)
7902 struct net_device
*dev
= priv
->prom_net_dev
;
7903 struct ipw_rx_packet
*pkt
= (struct ipw_rx_packet
*)rxb
->skb
->data
;
7904 struct ipw_rx_frame
*frame
= &pkt
->u
.frame
;
7905 struct ipw_rt_hdr
*ipw_rt
;
7907 /* First cache any information we need before we overwrite
7908 * the information provided in the skb from the hardware */
7909 struct ieee80211_hdr
*hdr
;
7910 u16 channel
= frame
->received_channel
;
7911 u8 phy_flags
= frame
->antennaAndPhy
;
7912 s8 signal
= frame
->rssi_dbm
- IPW_RSSI_TO_DBM
;
7913 s8 noise
= (s8
) le16_to_cpu(frame
->noise
);
7914 u8 rate
= frame
->rate
;
7915 unsigned short len
= le16_to_cpu(pkt
->u
.frame
.length
);
7916 struct sk_buff
*skb
;
7918 u16 filter
= priv
->prom_priv
->filter
;
7920 /* If the filter is set to not include Rx frames then return */
7921 if (filter
& IPW_PROM_NO_RX
)
7924 /* We received data from the HW, so stop the watchdog */
7925 netif_trans_update(dev
);
7927 if (unlikely((len
+ IPW_RX_FRAME_SIZE
) > skb_tailroom(rxb
->skb
))) {
7928 dev
->stats
.rx_errors
++;
7929 IPW_DEBUG_DROP("Corruption detected! Oh no!\n");
7933 /* We only process data packets if the interface is open */
7934 if (unlikely(!netif_running(dev
))) {
7935 dev
->stats
.rx_dropped
++;
7936 IPW_DEBUG_DROP("Dropping packet while interface is not up.\n");
7940 /* Libpcap 0.9.3+ can handle variable length radiotap, so we'll use
7942 if (len
> IPW_RX_BUF_SIZE
- sizeof(struct ipw_rt_hdr
)) {
7943 /* FIXME: Should alloc bigger skb instead */
7944 dev
->stats
.rx_dropped
++;
7945 IPW_DEBUG_DROP("Dropping too large packet in monitor\n");
7949 hdr
= (void *)rxb
->skb
->data
+ IPW_RX_FRAME_SIZE
;
7950 if (libipw_is_management(le16_to_cpu(hdr
->frame_control
))) {
7951 if (filter
& IPW_PROM_NO_MGMT
)
7953 if (filter
& IPW_PROM_MGMT_HEADER_ONLY
)
7955 } else if (libipw_is_control(le16_to_cpu(hdr
->frame_control
))) {
7956 if (filter
& IPW_PROM_NO_CTL
)
7958 if (filter
& IPW_PROM_CTL_HEADER_ONLY
)
7960 } else if (libipw_is_data(le16_to_cpu(hdr
->frame_control
))) {
7961 if (filter
& IPW_PROM_NO_DATA
)
7963 if (filter
& IPW_PROM_DATA_HEADER_ONLY
)
7967 /* Copy the SKB since this is for the promiscuous side */
7968 skb
= skb_copy(rxb
->skb
, GFP_ATOMIC
);
7970 IPW_ERROR("skb_clone failed for promiscuous copy.\n");
7974 /* copy the frame data to write after where the radiotap header goes */
7975 ipw_rt
= (void *)skb
->data
;
7978 len
= libipw_get_hdrlen(le16_to_cpu(hdr
->frame_control
));
7980 memcpy(ipw_rt
->payload
, hdr
, len
);
7982 ipw_rt
->rt_hdr
.it_version
= PKTHDR_RADIOTAP_VERSION
;
7983 ipw_rt
->rt_hdr
.it_pad
= 0; /* always good to zero */
7984 ipw_rt
->rt_hdr
.it_len
= cpu_to_le16(sizeof(*ipw_rt
)); /* total header+data */
7986 /* Set the size of the skb to the size of the frame */
7987 skb_put(skb
, sizeof(*ipw_rt
) + len
);
7989 /* Big bitfield of all the fields we provide in radiotap */
7990 ipw_rt
->rt_hdr
.it_present
= cpu_to_le32(
7991 (1 << IEEE80211_RADIOTAP_TSFT
) |
7992 (1 << IEEE80211_RADIOTAP_FLAGS
) |
7993 (1 << IEEE80211_RADIOTAP_RATE
) |
7994 (1 << IEEE80211_RADIOTAP_CHANNEL
) |
7995 (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL
) |
7996 (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE
) |
7997 (1 << IEEE80211_RADIOTAP_ANTENNA
));
7999 /* Zero the flags, we'll add to them as we go */
8000 ipw_rt
->rt_flags
= 0;
8001 ipw_rt
->rt_tsf
= (u64
)(frame
->parent_tsf
[3] << 24 |
8002 frame
->parent_tsf
[2] << 16 |
8003 frame
->parent_tsf
[1] << 8 |
8004 frame
->parent_tsf
[0]);
8006 /* Convert to DBM */
8007 ipw_rt
->rt_dbmsignal
= signal
;
8008 ipw_rt
->rt_dbmnoise
= noise
;
8010 /* Convert the channel data and set the flags */
8011 ipw_rt
->rt_channel
= cpu_to_le16(ieee80211chan2mhz(channel
));
8012 if (channel
> 14) { /* 802.11a */
8013 ipw_rt
->rt_chbitmask
=
8014 cpu_to_le16((IEEE80211_CHAN_OFDM
| IEEE80211_CHAN_5GHZ
));
8015 } else if (phy_flags
& (1 << 5)) { /* 802.11b */
8016 ipw_rt
->rt_chbitmask
=
8017 cpu_to_le16((IEEE80211_CHAN_CCK
| IEEE80211_CHAN_2GHZ
));
8018 } else { /* 802.11g */
8019 ipw_rt
->rt_chbitmask
=
8020 cpu_to_le16(IEEE80211_CHAN_OFDM
| IEEE80211_CHAN_2GHZ
);
8023 /* set the rate in multiples of 500k/s */
8025 case IPW_TX_RATE_1MB
:
8026 ipw_rt
->rt_rate
= 2;
8028 case IPW_TX_RATE_2MB
:
8029 ipw_rt
->rt_rate
= 4;
8031 case IPW_TX_RATE_5MB
:
8032 ipw_rt
->rt_rate
= 10;
8034 case IPW_TX_RATE_6MB
:
8035 ipw_rt
->rt_rate
= 12;
8037 case IPW_TX_RATE_9MB
:
8038 ipw_rt
->rt_rate
= 18;
8040 case IPW_TX_RATE_11MB
:
8041 ipw_rt
->rt_rate
= 22;
8043 case IPW_TX_RATE_12MB
:
8044 ipw_rt
->rt_rate
= 24;
8046 case IPW_TX_RATE_18MB
:
8047 ipw_rt
->rt_rate
= 36;
8049 case IPW_TX_RATE_24MB
:
8050 ipw_rt
->rt_rate
= 48;
8052 case IPW_TX_RATE_36MB
:
8053 ipw_rt
->rt_rate
= 72;
8055 case IPW_TX_RATE_48MB
:
8056 ipw_rt
->rt_rate
= 96;
8058 case IPW_TX_RATE_54MB
:
8059 ipw_rt
->rt_rate
= 108;
8062 ipw_rt
->rt_rate
= 0;
8066 /* antenna number */
8067 ipw_rt
->rt_antenna
= (phy_flags
& 3);
8069 /* set the preamble flag if we have it */
8070 if (phy_flags
& (1 << 6))
8071 ipw_rt
->rt_flags
|= IEEE80211_RADIOTAP_F_SHORTPRE
;
8073 IPW_DEBUG_RX("Rx packet of %d bytes.\n", skb
->len
);
8075 if (!libipw_rx(priv
->prom_priv
->ieee
, skb
, stats
)) {
8076 dev
->stats
.rx_errors
++;
8077 dev_kfree_skb_any(skb
);
8082 static int is_network_packet(struct ipw_priv
*priv
,
8083 struct libipw_hdr_4addr
*header
)
8085 /* Filter incoming packets to determine if they are targeted toward
8086 * this network, discarding packets coming from ourselves */
8087 switch (priv
->ieee
->iw_mode
) {
8088 case IW_MODE_ADHOC
: /* Header: Dest. | Source | BSSID */
8089 /* packets from our adapter are dropped (echo) */
8090 if (ether_addr_equal(header
->addr2
, priv
->net_dev
->dev_addr
))
8093 /* {broad,multi}cast packets to our BSSID go through */
8094 if (is_multicast_ether_addr(header
->addr1
))
8095 return ether_addr_equal(header
->addr3
, priv
->bssid
);
8097 /* packets to our adapter go through */
8098 return ether_addr_equal(header
->addr1
,
8099 priv
->net_dev
->dev_addr
);
8101 case IW_MODE_INFRA
: /* Header: Dest. | BSSID | Source */
8102 /* packets from our adapter are dropped (echo) */
8103 if (ether_addr_equal(header
->addr3
, priv
->net_dev
->dev_addr
))
8106 /* {broad,multi}cast packets to our BSS go through */
8107 if (is_multicast_ether_addr(header
->addr1
))
8108 return ether_addr_equal(header
->addr2
, priv
->bssid
);
8110 /* packets to our adapter go through */
8111 return ether_addr_equal(header
->addr1
,
8112 priv
->net_dev
->dev_addr
);
8118 #define IPW_PACKET_RETRY_TIME HZ
8120 static int is_duplicate_packet(struct ipw_priv
*priv
,
8121 struct libipw_hdr_4addr
*header
)
8123 u16 sc
= le16_to_cpu(header
->seq_ctl
);
8124 u16 seq
= WLAN_GET_SEQ_SEQ(sc
);
8125 u16 frag
= WLAN_GET_SEQ_FRAG(sc
);
8126 u16
*last_seq
, *last_frag
;
8127 unsigned long *last_time
;
8129 switch (priv
->ieee
->iw_mode
) {
8132 struct list_head
*p
;
8133 struct ipw_ibss_seq
*entry
= NULL
;
8134 u8
*mac
= header
->addr2
;
8135 int index
= mac
[5] % IPW_IBSS_MAC_HASH_SIZE
;
8137 list_for_each(p
, &priv
->ibss_mac_hash
[index
]) {
8139 list_entry(p
, struct ipw_ibss_seq
, list
);
8140 if (ether_addr_equal(entry
->mac
, mac
))
8143 if (p
== &priv
->ibss_mac_hash
[index
]) {
8144 entry
= kmalloc(sizeof(*entry
), GFP_ATOMIC
);
8147 ("Cannot malloc new mac entry\n");
8150 memcpy(entry
->mac
, mac
, ETH_ALEN
);
8151 entry
->seq_num
= seq
;
8152 entry
->frag_num
= frag
;
8153 entry
->packet_time
= jiffies
;
8154 list_add(&entry
->list
,
8155 &priv
->ibss_mac_hash
[index
]);
8158 last_seq
= &entry
->seq_num
;
8159 last_frag
= &entry
->frag_num
;
8160 last_time
= &entry
->packet_time
;
8164 last_seq
= &priv
->last_seq_num
;
8165 last_frag
= &priv
->last_frag_num
;
8166 last_time
= &priv
->last_packet_time
;
8171 if ((*last_seq
== seq
) &&
8172 time_after(*last_time
+ IPW_PACKET_RETRY_TIME
, jiffies
)) {
8173 if (*last_frag
== frag
)
8175 if (*last_frag
+ 1 != frag
)
8176 /* out-of-order fragment */
8182 *last_time
= jiffies
;
8186 /* Comment this line now since we observed the card receives
8187 * duplicate packets but the FCTL_RETRY bit is not set in the
8188 * IBSS mode with fragmentation enabled.
8189 BUG_ON(!(le16_to_cpu(header->frame_control) & IEEE80211_FCTL_RETRY)); */
8193 static void ipw_handle_mgmt_packet(struct ipw_priv
*priv
,
8194 struct ipw_rx_mem_buffer
*rxb
,
8195 struct libipw_rx_stats
*stats
)
8197 struct sk_buff
*skb
= rxb
->skb
;
8198 struct ipw_rx_packet
*pkt
= (struct ipw_rx_packet
*)skb
->data
;
8199 struct libipw_hdr_4addr
*header
= (struct libipw_hdr_4addr
*)
8200 (skb
->data
+ IPW_RX_FRAME_SIZE
);
8202 libipw_rx_mgt(priv
->ieee
, header
, stats
);
8204 if (priv
->ieee
->iw_mode
== IW_MODE_ADHOC
&&
8205 ((WLAN_FC_GET_STYPE(le16_to_cpu(header
->frame_ctl
)) ==
8206 IEEE80211_STYPE_PROBE_RESP
) ||
8207 (WLAN_FC_GET_STYPE(le16_to_cpu(header
->frame_ctl
)) ==
8208 IEEE80211_STYPE_BEACON
))) {
8209 if (ether_addr_equal(header
->addr3
, priv
->bssid
))
8210 ipw_add_station(priv
, header
->addr2
);
8213 if (priv
->config
& CFG_NET_STATS
) {
8214 IPW_DEBUG_HC("sending stat packet\n");
8216 /* Set the size of the skb to the size of the full
8217 * ipw header and 802.11 frame */
8218 skb_put(skb
, le16_to_cpu(pkt
->u
.frame
.length
) +
8221 /* Advance past the ipw packet header to the 802.11 frame */
8222 skb_pull(skb
, IPW_RX_FRAME_SIZE
);
8224 /* Push the libipw_rx_stats before the 802.11 frame */
8225 memcpy(skb_push(skb
, sizeof(*stats
)), stats
, sizeof(*stats
));
8227 skb
->dev
= priv
->ieee
->dev
;
8229 /* Point raw at the libipw_stats */
8230 skb_reset_mac_header(skb
);
8232 skb
->pkt_type
= PACKET_OTHERHOST
;
8233 skb
->protocol
= cpu_to_be16(ETH_P_80211_STATS
);
8234 memset(skb
->cb
, 0, sizeof(rxb
->skb
->cb
));
8241 * Main entry function for receiving a packet with 80211 headers. This
8242 * should be called when ever the FW has notified us that there is a new
8243 * skb in the receive queue.
8245 static void ipw_rx(struct ipw_priv
*priv
)
8247 struct ipw_rx_mem_buffer
*rxb
;
8248 struct ipw_rx_packet
*pkt
;
8249 struct libipw_hdr_4addr
*header
;
8254 r
= ipw_read32(priv
, IPW_RX_READ_INDEX
);
8255 ipw_read32(priv
, IPW_RX_WRITE_INDEX
);
8256 i
= priv
->rxq
->read
;
8258 if (ipw_rx_queue_space (priv
->rxq
) > (RX_QUEUE_SIZE
/ 2))
8262 rxb
= priv
->rxq
->queue
[i
];
8263 if (unlikely(rxb
== NULL
)) {
8264 printk(KERN_CRIT
"Queue not allocated!\n");
8267 priv
->rxq
->queue
[i
] = NULL
;
8269 dma_sync_single_for_cpu(&priv
->pci_dev
->dev
, rxb
->dma_addr
,
8270 IPW_RX_BUF_SIZE
, DMA_FROM_DEVICE
);
8272 pkt
= (struct ipw_rx_packet
*)rxb
->skb
->data
;
8273 IPW_DEBUG_RX("Packet: type=%02X seq=%02X bits=%02X\n",
8274 pkt
->header
.message_type
,
8275 pkt
->header
.rx_seq_num
, pkt
->header
.control_bits
);
8277 switch (pkt
->header
.message_type
) {
8278 case RX_FRAME_TYPE
: /* 802.11 frame */ {
8279 struct libipw_rx_stats stats
= {
8280 .rssi
= pkt
->u
.frame
.rssi_dbm
-
8283 pkt
->u
.frame
.rssi_dbm
-
8284 IPW_RSSI_TO_DBM
+ 0x100,
8286 le16_to_cpu(pkt
->u
.frame
.noise
),
8287 .rate
= pkt
->u
.frame
.rate
,
8288 .mac_time
= jiffies
,
8290 pkt
->u
.frame
.received_channel
,
8293 control
& (1 << 0)) ?
8296 .len
= le16_to_cpu(pkt
->u
.frame
.length
),
8299 if (stats
.rssi
!= 0)
8300 stats
.mask
|= LIBIPW_STATMASK_RSSI
;
8301 if (stats
.signal
!= 0)
8302 stats
.mask
|= LIBIPW_STATMASK_SIGNAL
;
8303 if (stats
.noise
!= 0)
8304 stats
.mask
|= LIBIPW_STATMASK_NOISE
;
8305 if (stats
.rate
!= 0)
8306 stats
.mask
|= LIBIPW_STATMASK_RATE
;
8310 #ifdef CONFIG_IPW2200_PROMISCUOUS
8311 if (priv
->prom_net_dev
&& netif_running(priv
->prom_net_dev
))
8312 ipw_handle_promiscuous_rx(priv
, rxb
, &stats
);
8315 #ifdef CONFIG_IPW2200_MONITOR
8316 if (priv
->ieee
->iw_mode
== IW_MODE_MONITOR
) {
8317 #ifdef CONFIG_IPW2200_RADIOTAP
8319 ipw_handle_data_packet_monitor(priv
,
8323 ipw_handle_data_packet(priv
, rxb
,
8331 (struct libipw_hdr_4addr
*)(rxb
->skb
->
8334 /* TODO: Check Ad-Hoc dest/source and make sure
8335 * that we are actually parsing these packets
8336 * correctly -- we should probably use the
8337 * frame control of the packet and disregard
8338 * the current iw_mode */
8341 is_network_packet(priv
, header
);
8342 if (network_packet
&& priv
->assoc_network
) {
8343 priv
->assoc_network
->stats
.rssi
=
8345 priv
->exp_avg_rssi
=
8346 exponential_average(priv
->exp_avg_rssi
,
8347 stats
.rssi
, DEPTH_RSSI
);
8350 IPW_DEBUG_RX("Frame: len=%u\n",
8351 le16_to_cpu(pkt
->u
.frame
.length
));
8353 if (le16_to_cpu(pkt
->u
.frame
.length
) <
8354 libipw_get_hdrlen(le16_to_cpu(
8355 header
->frame_ctl
))) {
8357 ("Received packet is too small. "
8359 priv
->net_dev
->stats
.rx_errors
++;
8360 priv
->wstats
.discard
.misc
++;
8364 switch (WLAN_FC_GET_TYPE
8365 (le16_to_cpu(header
->frame_ctl
))) {
8367 case IEEE80211_FTYPE_MGMT
:
8368 ipw_handle_mgmt_packet(priv
, rxb
,
8372 case IEEE80211_FTYPE_CTL
:
8375 case IEEE80211_FTYPE_DATA
:
8376 if (unlikely(!network_packet
||
8377 is_duplicate_packet(priv
,
8380 IPW_DEBUG_DROP("Dropping: "
8390 ipw_handle_data_packet(priv
, rxb
,
8398 case RX_HOST_NOTIFICATION_TYPE
:{
8400 ("Notification: subtype=%02X flags=%02X size=%d\n",
8401 pkt
->u
.notification
.subtype
,
8402 pkt
->u
.notification
.flags
,
8403 le16_to_cpu(pkt
->u
.notification
.size
));
8404 ipw_rx_notification(priv
, &pkt
->u
.notification
);
8409 IPW_DEBUG_RX("Bad Rx packet of type %d\n",
8410 pkt
->header
.message_type
);
8414 /* For now we just don't re-use anything. We can tweak this
8415 * later to try and re-use notification packets and SKBs that
8416 * fail to Rx correctly */
8417 if (rxb
->skb
!= NULL
) {
8418 dev_kfree_skb_any(rxb
->skb
);
8422 dma_unmap_single(&priv
->pci_dev
->dev
, rxb
->dma_addr
,
8423 IPW_RX_BUF_SIZE
, DMA_FROM_DEVICE
);
8424 list_add_tail(&rxb
->list
, &priv
->rxq
->rx_used
);
8426 i
= (i
+ 1) % RX_QUEUE_SIZE
;
8428 /* If there are a lot of unsued frames, restock the Rx queue
8429 * so the ucode won't assert */
8431 priv
->rxq
->read
= i
;
8432 ipw_rx_queue_replenish(priv
);
8436 /* Backtrack one entry */
8437 priv
->rxq
->read
= i
;
8438 ipw_rx_queue_restock(priv
);
8441 #define DEFAULT_RTS_THRESHOLD 2304U
8442 #define MIN_RTS_THRESHOLD 1U
8443 #define MAX_RTS_THRESHOLD 2304U
8444 #define DEFAULT_BEACON_INTERVAL 100U
8445 #define DEFAULT_SHORT_RETRY_LIMIT 7U
8446 #define DEFAULT_LONG_RETRY_LIMIT 4U
8450 * @option: options to control different reset behaviour
8451 * 0 = reset everything except the 'disable' module_param
8452 * 1 = reset everything and print out driver info (for probe only)
8453 * 2 = reset everything
8455 static int ipw_sw_reset(struct ipw_priv
*priv
, int option
)
8457 int band
, modulation
;
8458 int old_mode
= priv
->ieee
->iw_mode
;
8460 /* Initialize module parameter values here */
8463 /* We default to disabling the LED code as right now it causes
8464 * too many systems to lock up... */
8466 priv
->config
|= CFG_NO_LED
;
8469 priv
->config
|= CFG_ASSOCIATE
;
8471 IPW_DEBUG_INFO("Auto associate disabled.\n");
8474 priv
->config
|= CFG_ADHOC_CREATE
;
8476 IPW_DEBUG_INFO("Auto adhoc creation disabled.\n");
8478 priv
->config
&= ~CFG_STATIC_ESSID
;
8479 priv
->essid_len
= 0;
8480 memset(priv
->essid
, 0, IW_ESSID_MAX_SIZE
);
8482 if (disable
&& option
) {
8483 priv
->status
|= STATUS_RF_KILL_SW
;
8484 IPW_DEBUG_INFO("Radio disabled.\n");
8487 if (default_channel
!= 0) {
8488 priv
->config
|= CFG_STATIC_CHANNEL
;
8489 priv
->channel
= default_channel
;
8490 IPW_DEBUG_INFO("Bind to static channel %d\n", default_channel
);
8491 /* TODO: Validate that provided channel is in range */
8493 #ifdef CONFIG_IPW2200_QOS
8494 ipw_qos_init(priv
, qos_enable
, qos_burst_enable
,
8495 burst_duration_CCK
, burst_duration_OFDM
);
8496 #endif /* CONFIG_IPW2200_QOS */
8498 switch (network_mode
) {
8500 priv
->ieee
->iw_mode
= IW_MODE_ADHOC
;
8501 priv
->net_dev
->type
= ARPHRD_ETHER
;
8504 #ifdef CONFIG_IPW2200_MONITOR
8506 priv
->ieee
->iw_mode
= IW_MODE_MONITOR
;
8507 #ifdef CONFIG_IPW2200_RADIOTAP
8508 priv
->net_dev
->type
= ARPHRD_IEEE80211_RADIOTAP
;
8510 priv
->net_dev
->type
= ARPHRD_IEEE80211
;
8516 priv
->net_dev
->type
= ARPHRD_ETHER
;
8517 priv
->ieee
->iw_mode
= IW_MODE_INFRA
;
8522 priv
->ieee
->host_encrypt
= 0;
8523 priv
->ieee
->host_encrypt_msdu
= 0;
8524 priv
->ieee
->host_decrypt
= 0;
8525 priv
->ieee
->host_mc_decrypt
= 0;
8527 IPW_DEBUG_INFO("Hardware crypto [%s]\n", hwcrypto
? "on" : "off");
8529 /* IPW2200/2915 is abled to do hardware fragmentation. */
8530 priv
->ieee
->host_open_frag
= 0;
8532 if ((priv
->pci_dev
->device
== 0x4223) ||
8533 (priv
->pci_dev
->device
== 0x4224)) {
8535 printk(KERN_INFO DRV_NAME
8536 ": Detected Intel PRO/Wireless 2915ABG Network "
8538 priv
->ieee
->abg_true
= 1;
8539 band
= LIBIPW_52GHZ_BAND
| LIBIPW_24GHZ_BAND
;
8540 modulation
= LIBIPW_OFDM_MODULATION
|
8541 LIBIPW_CCK_MODULATION
;
8542 priv
->adapter
= IPW_2915ABG
;
8543 priv
->ieee
->mode
= IEEE_A
| IEEE_G
| IEEE_B
;
8546 printk(KERN_INFO DRV_NAME
8547 ": Detected Intel PRO/Wireless 2200BG Network "
8550 priv
->ieee
->abg_true
= 0;
8551 band
= LIBIPW_24GHZ_BAND
;
8552 modulation
= LIBIPW_OFDM_MODULATION
|
8553 LIBIPW_CCK_MODULATION
;
8554 priv
->adapter
= IPW_2200BG
;
8555 priv
->ieee
->mode
= IEEE_G
| IEEE_B
;
8558 priv
->ieee
->freq_band
= band
;
8559 priv
->ieee
->modulation
= modulation
;
8561 priv
->rates_mask
= LIBIPW_DEFAULT_RATES_MASK
;
8563 priv
->disassociate_threshold
= IPW_MB_DISASSOCIATE_THRESHOLD_DEFAULT
;
8564 priv
->roaming_threshold
= IPW_MB_ROAMING_THRESHOLD_DEFAULT
;
8566 priv
->rts_threshold
= DEFAULT_RTS_THRESHOLD
;
8567 priv
->short_retry_limit
= DEFAULT_SHORT_RETRY_LIMIT
;
8568 priv
->long_retry_limit
= DEFAULT_LONG_RETRY_LIMIT
;
8570 /* If power management is turned on, default to AC mode */
8571 priv
->power_mode
= IPW_POWER_AC
;
8572 priv
->tx_power
= IPW_TX_POWER_DEFAULT
;
8574 return old_mode
== priv
->ieee
->iw_mode
;
8578 * This file defines the Wireless Extension handlers. It does not
8579 * define any methods of hardware manipulation and relies on the
8580 * functions defined in ipw_main to provide the HW interaction.
8582 * The exception to this is the use of the ipw_get_ordinal()
8583 * function used to poll the hardware vs. making unnecessary calls.
8587 static int ipw_set_channel(struct ipw_priv
*priv
, u8 channel
)
8590 IPW_DEBUG_INFO("Setting channel to ANY (0)\n");
8591 priv
->config
&= ~CFG_STATIC_CHANNEL
;
8592 IPW_DEBUG_ASSOC("Attempting to associate with new "
8594 ipw_associate(priv
);
8598 priv
->config
|= CFG_STATIC_CHANNEL
;
8600 if (priv
->channel
== channel
) {
8601 IPW_DEBUG_INFO("Request to set channel to current value (%d)\n",
8606 IPW_DEBUG_INFO("Setting channel to %i\n", (int)channel
);
8607 priv
->channel
= channel
;
8609 #ifdef CONFIG_IPW2200_MONITOR
8610 if (priv
->ieee
->iw_mode
== IW_MODE_MONITOR
) {
8612 if (priv
->status
& STATUS_SCANNING
) {
8613 IPW_DEBUG_SCAN("Scan abort triggered due to "
8614 "channel change.\n");
8615 ipw_abort_scan(priv
);
8618 for (i
= 1000; i
&& (priv
->status
& STATUS_SCANNING
); i
--)
8621 if (priv
->status
& STATUS_SCANNING
)
8622 IPW_DEBUG_SCAN("Still scanning...\n");
8624 IPW_DEBUG_SCAN("Took %dms to abort current scan\n",
8629 #endif /* CONFIG_IPW2200_MONITOR */
8631 /* Network configuration changed -- force [re]association */
8632 IPW_DEBUG_ASSOC("[re]association triggered due to channel change.\n");
8633 if (!ipw_disassociate(priv
))
8634 ipw_associate(priv
);
8639 static int ipw_wx_set_freq(struct net_device
*dev
,
8640 struct iw_request_info
*info
,
8641 union iwreq_data
*wrqu
, char *extra
)
8643 struct ipw_priv
*priv
= libipw_priv(dev
);
8644 const struct libipw_geo
*geo
= libipw_get_geo(priv
->ieee
);
8645 struct iw_freq
*fwrq
= &wrqu
->freq
;
8651 IPW_DEBUG_WX("SET Freq/Channel -> any\n");
8652 mutex_lock(&priv
->mutex
);
8653 ret
= ipw_set_channel(priv
, 0);
8654 mutex_unlock(&priv
->mutex
);
8657 /* if setting by freq convert to channel */
8659 channel
= libipw_freq_to_channel(priv
->ieee
, fwrq
->m
);
8665 if (!(band
= libipw_is_valid_channel(priv
->ieee
, channel
)))
8668 if (priv
->ieee
->iw_mode
== IW_MODE_ADHOC
) {
8669 i
= libipw_channel_to_index(priv
->ieee
, channel
);
8673 flags
= (band
== LIBIPW_24GHZ_BAND
) ?
8674 geo
->bg
[i
].flags
: geo
->a
[i
].flags
;
8675 if (flags
& LIBIPW_CH_PASSIVE_ONLY
) {
8676 IPW_DEBUG_WX("Invalid Ad-Hoc channel for 802.11a\n");
8681 IPW_DEBUG_WX("SET Freq/Channel -> %d\n", fwrq
->m
);
8682 mutex_lock(&priv
->mutex
);
8683 ret
= ipw_set_channel(priv
, channel
);
8684 mutex_unlock(&priv
->mutex
);
8688 static int ipw_wx_get_freq(struct net_device
*dev
,
8689 struct iw_request_info
*info
,
8690 union iwreq_data
*wrqu
, char *extra
)
8692 struct ipw_priv
*priv
= libipw_priv(dev
);
8696 /* If we are associated, trying to associate, or have a statically
8697 * configured CHANNEL then return that; otherwise return ANY */
8698 mutex_lock(&priv
->mutex
);
8699 if (priv
->config
& CFG_STATIC_CHANNEL
||
8700 priv
->status
& (STATUS_ASSOCIATING
| STATUS_ASSOCIATED
)) {
8703 i
= libipw_channel_to_index(priv
->ieee
, priv
->channel
);
8707 switch (libipw_is_valid_channel(priv
->ieee
, priv
->channel
)) {
8708 case LIBIPW_52GHZ_BAND
:
8709 wrqu
->freq
.m
= priv
->ieee
->geo
.a
[i
].freq
* 100000;
8712 case LIBIPW_24GHZ_BAND
:
8713 wrqu
->freq
.m
= priv
->ieee
->geo
.bg
[i
].freq
* 100000;
8722 mutex_unlock(&priv
->mutex
);
8723 IPW_DEBUG_WX("GET Freq/Channel -> %d\n", priv
->channel
);
8727 static int ipw_wx_set_mode(struct net_device
*dev
,
8728 struct iw_request_info
*info
,
8729 union iwreq_data
*wrqu
, char *extra
)
8731 struct ipw_priv
*priv
= libipw_priv(dev
);
8734 IPW_DEBUG_WX("Set MODE: %d\n", wrqu
->mode
);
8736 switch (wrqu
->mode
) {
8737 #ifdef CONFIG_IPW2200_MONITOR
8738 case IW_MODE_MONITOR
:
8744 wrqu
->mode
= IW_MODE_INFRA
;
8749 if (wrqu
->mode
== priv
->ieee
->iw_mode
)
8752 mutex_lock(&priv
->mutex
);
8754 ipw_sw_reset(priv
, 0);
8756 #ifdef CONFIG_IPW2200_MONITOR
8757 if (priv
->ieee
->iw_mode
== IW_MODE_MONITOR
)
8758 priv
->net_dev
->type
= ARPHRD_ETHER
;
8760 if (wrqu
->mode
== IW_MODE_MONITOR
)
8761 #ifdef CONFIG_IPW2200_RADIOTAP
8762 priv
->net_dev
->type
= ARPHRD_IEEE80211_RADIOTAP
;
8764 priv
->net_dev
->type
= ARPHRD_IEEE80211
;
8766 #endif /* CONFIG_IPW2200_MONITOR */
8768 /* Free the existing firmware and reset the fw_loaded
8769 * flag so ipw_load() will bring in the new firmware */
8772 priv
->ieee
->iw_mode
= wrqu
->mode
;
8774 schedule_work(&priv
->adapter_restart
);
8775 mutex_unlock(&priv
->mutex
);
8779 static int ipw_wx_get_mode(struct net_device
*dev
,
8780 struct iw_request_info
*info
,
8781 union iwreq_data
*wrqu
, char *extra
)
8783 struct ipw_priv
*priv
= libipw_priv(dev
);
8784 mutex_lock(&priv
->mutex
);
8785 wrqu
->mode
= priv
->ieee
->iw_mode
;
8786 IPW_DEBUG_WX("Get MODE -> %d\n", wrqu
->mode
);
8787 mutex_unlock(&priv
->mutex
);
8791 /* Values are in microsecond */
8792 static const s32 timeout_duration
[] = {
8800 static const s32 period_duration
[] = {
8808 static int ipw_wx_get_range(struct net_device
*dev
,
8809 struct iw_request_info
*info
,
8810 union iwreq_data
*wrqu
, char *extra
)
8812 struct ipw_priv
*priv
= libipw_priv(dev
);
8813 struct iw_range
*range
= (struct iw_range
*)extra
;
8814 const struct libipw_geo
*geo
= libipw_get_geo(priv
->ieee
);
8817 wrqu
->data
.length
= sizeof(*range
);
8818 memset(range
, 0, sizeof(*range
));
8820 /* 54Mbs == ~27 Mb/s real (802.11g) */
8821 range
->throughput
= 27 * 1000 * 1000;
8823 range
->max_qual
.qual
= 100;
8824 /* TODO: Find real max RSSI and stick here */
8825 range
->max_qual
.level
= 0;
8826 range
->max_qual
.noise
= 0;
8827 range
->max_qual
.updated
= 7; /* Updated all three */
8829 range
->avg_qual
.qual
= 70;
8830 /* TODO: Find real 'good' to 'bad' threshold value for RSSI */
8831 range
->avg_qual
.level
= 0; /* FIXME to real average level */
8832 range
->avg_qual
.noise
= 0;
8833 range
->avg_qual
.updated
= 7; /* Updated all three */
8834 mutex_lock(&priv
->mutex
);
8835 range
->num_bitrates
= min(priv
->rates
.num_rates
, (u8
) IW_MAX_BITRATES
);
8837 for (i
= 0; i
< range
->num_bitrates
; i
++)
8838 range
->bitrate
[i
] = (priv
->rates
.supported_rates
[i
] & 0x7F) *
8841 range
->max_rts
= DEFAULT_RTS_THRESHOLD
;
8842 range
->min_frag
= MIN_FRAG_THRESHOLD
;
8843 range
->max_frag
= MAX_FRAG_THRESHOLD
;
8845 range
->encoding_size
[0] = 5;
8846 range
->encoding_size
[1] = 13;
8847 range
->num_encoding_sizes
= 2;
8848 range
->max_encoding_tokens
= WEP_KEYS
;
8850 /* Set the Wireless Extension versions */
8851 range
->we_version_compiled
= WIRELESS_EXT
;
8852 range
->we_version_source
= 18;
8855 if (priv
->ieee
->mode
& (IEEE_B
| IEEE_G
)) {
8856 for (j
= 0; j
< geo
->bg_channels
&& i
< IW_MAX_FREQUENCIES
; j
++) {
8857 if ((priv
->ieee
->iw_mode
== IW_MODE_ADHOC
) &&
8858 (geo
->bg
[j
].flags
& LIBIPW_CH_PASSIVE_ONLY
))
8861 range
->freq
[i
].i
= geo
->bg
[j
].channel
;
8862 range
->freq
[i
].m
= geo
->bg
[j
].freq
* 100000;
8863 range
->freq
[i
].e
= 1;
8868 if (priv
->ieee
->mode
& IEEE_A
) {
8869 for (j
= 0; j
< geo
->a_channels
&& i
< IW_MAX_FREQUENCIES
; j
++) {
8870 if ((priv
->ieee
->iw_mode
== IW_MODE_ADHOC
) &&
8871 (geo
->a
[j
].flags
& LIBIPW_CH_PASSIVE_ONLY
))
8874 range
->freq
[i
].i
= geo
->a
[j
].channel
;
8875 range
->freq
[i
].m
= geo
->a
[j
].freq
* 100000;
8876 range
->freq
[i
].e
= 1;
8881 range
->num_channels
= i
;
8882 range
->num_frequency
= i
;
8884 mutex_unlock(&priv
->mutex
);
8886 /* Event capability (kernel + driver) */
8887 range
->event_capa
[0] = (IW_EVENT_CAPA_K_0
|
8888 IW_EVENT_CAPA_MASK(SIOCGIWTHRSPY
) |
8889 IW_EVENT_CAPA_MASK(SIOCGIWAP
) |
8890 IW_EVENT_CAPA_MASK(SIOCGIWSCAN
));
8891 range
->event_capa
[1] = IW_EVENT_CAPA_K_1
;
8893 range
->enc_capa
= IW_ENC_CAPA_WPA
| IW_ENC_CAPA_WPA2
|
8894 IW_ENC_CAPA_CIPHER_TKIP
| IW_ENC_CAPA_CIPHER_CCMP
;
8896 range
->scan_capa
= IW_SCAN_CAPA_ESSID
| IW_SCAN_CAPA_TYPE
;
8898 IPW_DEBUG_WX("GET Range\n");
8902 static int ipw_wx_set_wap(struct net_device
*dev
,
8903 struct iw_request_info
*info
,
8904 union iwreq_data
*wrqu
, char *extra
)
8906 struct ipw_priv
*priv
= libipw_priv(dev
);
8908 if (wrqu
->ap_addr
.sa_family
!= ARPHRD_ETHER
)
8910 mutex_lock(&priv
->mutex
);
8911 if (is_broadcast_ether_addr(wrqu
->ap_addr
.sa_data
) ||
8912 is_zero_ether_addr(wrqu
->ap_addr
.sa_data
)) {
8913 /* we disable mandatory BSSID association */
8914 IPW_DEBUG_WX("Setting AP BSSID to ANY\n");
8915 priv
->config
&= ~CFG_STATIC_BSSID
;
8916 IPW_DEBUG_ASSOC("Attempting to associate with new "
8918 ipw_associate(priv
);
8919 mutex_unlock(&priv
->mutex
);
8923 priv
->config
|= CFG_STATIC_BSSID
;
8924 if (ether_addr_equal(priv
->bssid
, wrqu
->ap_addr
.sa_data
)) {
8925 IPW_DEBUG_WX("BSSID set to current BSSID.\n");
8926 mutex_unlock(&priv
->mutex
);
8930 IPW_DEBUG_WX("Setting mandatory BSSID to %pM\n",
8931 wrqu
->ap_addr
.sa_data
);
8933 memcpy(priv
->bssid
, wrqu
->ap_addr
.sa_data
, ETH_ALEN
);
8935 /* Network configuration changed -- force [re]association */
8936 IPW_DEBUG_ASSOC("[re]association triggered due to BSSID change.\n");
8937 if (!ipw_disassociate(priv
))
8938 ipw_associate(priv
);
8940 mutex_unlock(&priv
->mutex
);
8944 static int ipw_wx_get_wap(struct net_device
*dev
,
8945 struct iw_request_info
*info
,
8946 union iwreq_data
*wrqu
, char *extra
)
8948 struct ipw_priv
*priv
= libipw_priv(dev
);
8950 /* If we are associated, trying to associate, or have a statically
8951 * configured BSSID then return that; otherwise return ANY */
8952 mutex_lock(&priv
->mutex
);
8953 if (priv
->config
& CFG_STATIC_BSSID
||
8954 priv
->status
& (STATUS_ASSOCIATED
| STATUS_ASSOCIATING
)) {
8955 wrqu
->ap_addr
.sa_family
= ARPHRD_ETHER
;
8956 memcpy(wrqu
->ap_addr
.sa_data
, priv
->bssid
, ETH_ALEN
);
8958 eth_zero_addr(wrqu
->ap_addr
.sa_data
);
8960 IPW_DEBUG_WX("Getting WAP BSSID: %pM\n",
8961 wrqu
->ap_addr
.sa_data
);
8962 mutex_unlock(&priv
->mutex
);
8966 static int ipw_wx_set_essid(struct net_device
*dev
,
8967 struct iw_request_info
*info
,
8968 union iwreq_data
*wrqu
, char *extra
)
8970 struct ipw_priv
*priv
= libipw_priv(dev
);
8973 mutex_lock(&priv
->mutex
);
8975 if (!wrqu
->essid
.flags
)
8977 IPW_DEBUG_WX("Setting ESSID to ANY\n");
8978 ipw_disassociate(priv
);
8979 priv
->config
&= ~CFG_STATIC_ESSID
;
8980 ipw_associate(priv
);
8981 mutex_unlock(&priv
->mutex
);
8985 length
= min((int)wrqu
->essid
.length
, IW_ESSID_MAX_SIZE
);
8987 priv
->config
|= CFG_STATIC_ESSID
;
8989 if (priv
->essid_len
== length
&& !memcmp(priv
->essid
, extra
, length
)
8990 && (priv
->status
& (STATUS_ASSOCIATED
| STATUS_ASSOCIATING
))) {
8991 IPW_DEBUG_WX("ESSID set to current ESSID.\n");
8992 mutex_unlock(&priv
->mutex
);
8996 IPW_DEBUG_WX("Setting ESSID: '%*pE' (%d)\n", length
, extra
, length
);
8998 priv
->essid_len
= length
;
8999 memcpy(priv
->essid
, extra
, priv
->essid_len
);
9001 /* Network configuration changed -- force [re]association */
9002 IPW_DEBUG_ASSOC("[re]association triggered due to ESSID change.\n");
9003 if (!ipw_disassociate(priv
))
9004 ipw_associate(priv
);
9006 mutex_unlock(&priv
->mutex
);
9010 static int ipw_wx_get_essid(struct net_device
*dev
,
9011 struct iw_request_info
*info
,
9012 union iwreq_data
*wrqu
, char *extra
)
9014 struct ipw_priv
*priv
= libipw_priv(dev
);
9016 /* If we are associated, trying to associate, or have a statically
9017 * configured ESSID then return that; otherwise return ANY */
9018 mutex_lock(&priv
->mutex
);
9019 if (priv
->config
& CFG_STATIC_ESSID
||
9020 priv
->status
& (STATUS_ASSOCIATED
| STATUS_ASSOCIATING
)) {
9021 IPW_DEBUG_WX("Getting essid: '%*pE'\n",
9022 priv
->essid_len
, priv
->essid
);
9023 memcpy(extra
, priv
->essid
, priv
->essid_len
);
9024 wrqu
->essid
.length
= priv
->essid_len
;
9025 wrqu
->essid
.flags
= 1; /* active */
9027 IPW_DEBUG_WX("Getting essid: ANY\n");
9028 wrqu
->essid
.length
= 0;
9029 wrqu
->essid
.flags
= 0; /* active */
9031 mutex_unlock(&priv
->mutex
);
9035 static int ipw_wx_set_nick(struct net_device
*dev
,
9036 struct iw_request_info
*info
,
9037 union iwreq_data
*wrqu
, char *extra
)
9039 struct ipw_priv
*priv
= libipw_priv(dev
);
9041 IPW_DEBUG_WX("Setting nick to '%s'\n", extra
);
9042 if (wrqu
->data
.length
> IW_ESSID_MAX_SIZE
)
9044 mutex_lock(&priv
->mutex
);
9045 wrqu
->data
.length
= min_t(size_t, wrqu
->data
.length
, sizeof(priv
->nick
));
9046 memset(priv
->nick
, 0, sizeof(priv
->nick
));
9047 memcpy(priv
->nick
, extra
, wrqu
->data
.length
);
9048 IPW_DEBUG_TRACE("<<\n");
9049 mutex_unlock(&priv
->mutex
);
9054 static int ipw_wx_get_nick(struct net_device
*dev
,
9055 struct iw_request_info
*info
,
9056 union iwreq_data
*wrqu
, char *extra
)
9058 struct ipw_priv
*priv
= libipw_priv(dev
);
9059 IPW_DEBUG_WX("Getting nick\n");
9060 mutex_lock(&priv
->mutex
);
9061 wrqu
->data
.length
= strlen(priv
->nick
);
9062 memcpy(extra
, priv
->nick
, wrqu
->data
.length
);
9063 wrqu
->data
.flags
= 1; /* active */
9064 mutex_unlock(&priv
->mutex
);
9068 static int ipw_wx_set_sens(struct net_device
*dev
,
9069 struct iw_request_info
*info
,
9070 union iwreq_data
*wrqu
, char *extra
)
9072 struct ipw_priv
*priv
= libipw_priv(dev
);
9075 IPW_DEBUG_WX("Setting roaming threshold to %d\n", wrqu
->sens
.value
);
9076 IPW_DEBUG_WX("Setting disassociate threshold to %d\n", 3*wrqu
->sens
.value
);
9077 mutex_lock(&priv
->mutex
);
9079 if (wrqu
->sens
.fixed
== 0)
9081 priv
->roaming_threshold
= IPW_MB_ROAMING_THRESHOLD_DEFAULT
;
9082 priv
->disassociate_threshold
= IPW_MB_DISASSOCIATE_THRESHOLD_DEFAULT
;
9085 if ((wrqu
->sens
.value
> IPW_MB_ROAMING_THRESHOLD_MAX
) ||
9086 (wrqu
->sens
.value
< IPW_MB_ROAMING_THRESHOLD_MIN
)) {
9091 priv
->roaming_threshold
= wrqu
->sens
.value
;
9092 priv
->disassociate_threshold
= 3*wrqu
->sens
.value
;
9094 mutex_unlock(&priv
->mutex
);
9098 static int ipw_wx_get_sens(struct net_device
*dev
,
9099 struct iw_request_info
*info
,
9100 union iwreq_data
*wrqu
, char *extra
)
9102 struct ipw_priv
*priv
= libipw_priv(dev
);
9103 mutex_lock(&priv
->mutex
);
9104 wrqu
->sens
.fixed
= 1;
9105 wrqu
->sens
.value
= priv
->roaming_threshold
;
9106 mutex_unlock(&priv
->mutex
);
9108 IPW_DEBUG_WX("GET roaming threshold -> %s %d\n",
9109 wrqu
->power
.disabled
? "OFF" : "ON", wrqu
->power
.value
);
9114 static int ipw_wx_set_rate(struct net_device
*dev
,
9115 struct iw_request_info
*info
,
9116 union iwreq_data
*wrqu
, char *extra
)
9118 /* TODO: We should use semaphores or locks for access to priv */
9119 struct ipw_priv
*priv
= libipw_priv(dev
);
9120 u32 target_rate
= wrqu
->bitrate
.value
;
9123 /* value = -1, fixed = 0 means auto only, so we should use all rates offered by AP */
9124 /* value = X, fixed = 1 means only rate X */
9125 /* value = X, fixed = 0 means all rates lower equal X */
9127 if (target_rate
== -1) {
9129 mask
= LIBIPW_DEFAULT_RATES_MASK
;
9130 /* Now we should reassociate */
9135 fixed
= wrqu
->bitrate
.fixed
;
9137 if (target_rate
== 1000000 || !fixed
)
9138 mask
|= LIBIPW_CCK_RATE_1MB_MASK
;
9139 if (target_rate
== 1000000)
9142 if (target_rate
== 2000000 || !fixed
)
9143 mask
|= LIBIPW_CCK_RATE_2MB_MASK
;
9144 if (target_rate
== 2000000)
9147 if (target_rate
== 5500000 || !fixed
)
9148 mask
|= LIBIPW_CCK_RATE_5MB_MASK
;
9149 if (target_rate
== 5500000)
9152 if (target_rate
== 6000000 || !fixed
)
9153 mask
|= LIBIPW_OFDM_RATE_6MB_MASK
;
9154 if (target_rate
== 6000000)
9157 if (target_rate
== 9000000 || !fixed
)
9158 mask
|= LIBIPW_OFDM_RATE_9MB_MASK
;
9159 if (target_rate
== 9000000)
9162 if (target_rate
== 11000000 || !fixed
)
9163 mask
|= LIBIPW_CCK_RATE_11MB_MASK
;
9164 if (target_rate
== 11000000)
9167 if (target_rate
== 12000000 || !fixed
)
9168 mask
|= LIBIPW_OFDM_RATE_12MB_MASK
;
9169 if (target_rate
== 12000000)
9172 if (target_rate
== 18000000 || !fixed
)
9173 mask
|= LIBIPW_OFDM_RATE_18MB_MASK
;
9174 if (target_rate
== 18000000)
9177 if (target_rate
== 24000000 || !fixed
)
9178 mask
|= LIBIPW_OFDM_RATE_24MB_MASK
;
9179 if (target_rate
== 24000000)
9182 if (target_rate
== 36000000 || !fixed
)
9183 mask
|= LIBIPW_OFDM_RATE_36MB_MASK
;
9184 if (target_rate
== 36000000)
9187 if (target_rate
== 48000000 || !fixed
)
9188 mask
|= LIBIPW_OFDM_RATE_48MB_MASK
;
9189 if (target_rate
== 48000000)
9192 if (target_rate
== 54000000 || !fixed
)
9193 mask
|= LIBIPW_OFDM_RATE_54MB_MASK
;
9194 if (target_rate
== 54000000)
9197 IPW_DEBUG_WX("invalid rate specified, returning error\n");
9201 IPW_DEBUG_WX("Setting rate mask to 0x%08X [%s]\n",
9202 mask
, fixed
? "fixed" : "sub-rates");
9203 mutex_lock(&priv
->mutex
);
9204 if (mask
== LIBIPW_DEFAULT_RATES_MASK
) {
9205 priv
->config
&= ~CFG_FIXED_RATE
;
9206 ipw_set_fixed_rate(priv
, priv
->ieee
->mode
);
9208 priv
->config
|= CFG_FIXED_RATE
;
9210 if (priv
->rates_mask
== mask
) {
9211 IPW_DEBUG_WX("Mask set to current mask.\n");
9212 mutex_unlock(&priv
->mutex
);
9216 priv
->rates_mask
= mask
;
9218 /* Network configuration changed -- force [re]association */
9219 IPW_DEBUG_ASSOC("[re]association triggered due to rates change.\n");
9220 if (!ipw_disassociate(priv
))
9221 ipw_associate(priv
);
9223 mutex_unlock(&priv
->mutex
);
9227 static int ipw_wx_get_rate(struct net_device
*dev
,
9228 struct iw_request_info
*info
,
9229 union iwreq_data
*wrqu
, char *extra
)
9231 struct ipw_priv
*priv
= libipw_priv(dev
);
9232 mutex_lock(&priv
->mutex
);
9233 wrqu
->bitrate
.value
= priv
->last_rate
;
9234 wrqu
->bitrate
.fixed
= (priv
->config
& CFG_FIXED_RATE
) ? 1 : 0;
9235 mutex_unlock(&priv
->mutex
);
9236 IPW_DEBUG_WX("GET Rate -> %d\n", wrqu
->bitrate
.value
);
9240 static int ipw_wx_set_rts(struct net_device
*dev
,
9241 struct iw_request_info
*info
,
9242 union iwreq_data
*wrqu
, char *extra
)
9244 struct ipw_priv
*priv
= libipw_priv(dev
);
9245 mutex_lock(&priv
->mutex
);
9246 if (wrqu
->rts
.disabled
|| !wrqu
->rts
.fixed
)
9247 priv
->rts_threshold
= DEFAULT_RTS_THRESHOLD
;
9249 if (wrqu
->rts
.value
< MIN_RTS_THRESHOLD
||
9250 wrqu
->rts
.value
> MAX_RTS_THRESHOLD
) {
9251 mutex_unlock(&priv
->mutex
);
9254 priv
->rts_threshold
= wrqu
->rts
.value
;
9257 ipw_send_rts_threshold(priv
, priv
->rts_threshold
);
9258 mutex_unlock(&priv
->mutex
);
9259 IPW_DEBUG_WX("SET RTS Threshold -> %d\n", priv
->rts_threshold
);
9263 static int ipw_wx_get_rts(struct net_device
*dev
,
9264 struct iw_request_info
*info
,
9265 union iwreq_data
*wrqu
, char *extra
)
9267 struct ipw_priv
*priv
= libipw_priv(dev
);
9268 mutex_lock(&priv
->mutex
);
9269 wrqu
->rts
.value
= priv
->rts_threshold
;
9270 wrqu
->rts
.fixed
= 0; /* no auto select */
9271 wrqu
->rts
.disabled
= (wrqu
->rts
.value
== DEFAULT_RTS_THRESHOLD
);
9272 mutex_unlock(&priv
->mutex
);
9273 IPW_DEBUG_WX("GET RTS Threshold -> %d\n", wrqu
->rts
.value
);
9277 static int ipw_wx_set_txpow(struct net_device
*dev
,
9278 struct iw_request_info
*info
,
9279 union iwreq_data
*wrqu
, char *extra
)
9281 struct ipw_priv
*priv
= libipw_priv(dev
);
9284 mutex_lock(&priv
->mutex
);
9285 if (ipw_radio_kill_sw(priv
, wrqu
->power
.disabled
)) {
9290 if (!wrqu
->power
.fixed
)
9291 wrqu
->power
.value
= IPW_TX_POWER_DEFAULT
;
9293 if (wrqu
->power
.flags
!= IW_TXPOW_DBM
) {
9298 if ((wrqu
->power
.value
> IPW_TX_POWER_MAX
) ||
9299 (wrqu
->power
.value
< IPW_TX_POWER_MIN
)) {
9304 priv
->tx_power
= wrqu
->power
.value
;
9305 err
= ipw_set_tx_power(priv
);
9307 mutex_unlock(&priv
->mutex
);
9311 static int ipw_wx_get_txpow(struct net_device
*dev
,
9312 struct iw_request_info
*info
,
9313 union iwreq_data
*wrqu
, char *extra
)
9315 struct ipw_priv
*priv
= libipw_priv(dev
);
9316 mutex_lock(&priv
->mutex
);
9317 wrqu
->power
.value
= priv
->tx_power
;
9318 wrqu
->power
.fixed
= 1;
9319 wrqu
->power
.flags
= IW_TXPOW_DBM
;
9320 wrqu
->power
.disabled
= (priv
->status
& STATUS_RF_KILL_MASK
) ? 1 : 0;
9321 mutex_unlock(&priv
->mutex
);
9323 IPW_DEBUG_WX("GET TX Power -> %s %d\n",
9324 wrqu
->power
.disabled
? "OFF" : "ON", wrqu
->power
.value
);
9329 static int ipw_wx_set_frag(struct net_device
*dev
,
9330 struct iw_request_info
*info
,
9331 union iwreq_data
*wrqu
, char *extra
)
9333 struct ipw_priv
*priv
= libipw_priv(dev
);
9334 mutex_lock(&priv
->mutex
);
9335 if (wrqu
->frag
.disabled
|| !wrqu
->frag
.fixed
)
9336 priv
->ieee
->fts
= DEFAULT_FTS
;
9338 if (wrqu
->frag
.value
< MIN_FRAG_THRESHOLD
||
9339 wrqu
->frag
.value
> MAX_FRAG_THRESHOLD
) {
9340 mutex_unlock(&priv
->mutex
);
9344 priv
->ieee
->fts
= wrqu
->frag
.value
& ~0x1;
9347 ipw_send_frag_threshold(priv
, wrqu
->frag
.value
);
9348 mutex_unlock(&priv
->mutex
);
9349 IPW_DEBUG_WX("SET Frag Threshold -> %d\n", wrqu
->frag
.value
);
9353 static int ipw_wx_get_frag(struct net_device
*dev
,
9354 struct iw_request_info
*info
,
9355 union iwreq_data
*wrqu
, char *extra
)
9357 struct ipw_priv
*priv
= libipw_priv(dev
);
9358 mutex_lock(&priv
->mutex
);
9359 wrqu
->frag
.value
= priv
->ieee
->fts
;
9360 wrqu
->frag
.fixed
= 0; /* no auto select */
9361 wrqu
->frag
.disabled
= (wrqu
->frag
.value
== DEFAULT_FTS
);
9362 mutex_unlock(&priv
->mutex
);
9363 IPW_DEBUG_WX("GET Frag Threshold -> %d\n", wrqu
->frag
.value
);
9368 static int ipw_wx_set_retry(struct net_device
*dev
,
9369 struct iw_request_info
*info
,
9370 union iwreq_data
*wrqu
, char *extra
)
9372 struct ipw_priv
*priv
= libipw_priv(dev
);
9374 if (wrqu
->retry
.flags
& IW_RETRY_LIFETIME
|| wrqu
->retry
.disabled
)
9377 if (!(wrqu
->retry
.flags
& IW_RETRY_LIMIT
))
9380 if (wrqu
->retry
.value
< 0 || wrqu
->retry
.value
>= 255)
9383 mutex_lock(&priv
->mutex
);
9384 if (wrqu
->retry
.flags
& IW_RETRY_SHORT
)
9385 priv
->short_retry_limit
= (u8
) wrqu
->retry
.value
;
9386 else if (wrqu
->retry
.flags
& IW_RETRY_LONG
)
9387 priv
->long_retry_limit
= (u8
) wrqu
->retry
.value
;
9389 priv
->short_retry_limit
= (u8
) wrqu
->retry
.value
;
9390 priv
->long_retry_limit
= (u8
) wrqu
->retry
.value
;
9393 ipw_send_retry_limit(priv
, priv
->short_retry_limit
,
9394 priv
->long_retry_limit
);
9395 mutex_unlock(&priv
->mutex
);
9396 IPW_DEBUG_WX("SET retry limit -> short:%d long:%d\n",
9397 priv
->short_retry_limit
, priv
->long_retry_limit
);
9401 static int ipw_wx_get_retry(struct net_device
*dev
,
9402 struct iw_request_info
*info
,
9403 union iwreq_data
*wrqu
, char *extra
)
9405 struct ipw_priv
*priv
= libipw_priv(dev
);
9407 mutex_lock(&priv
->mutex
);
9408 wrqu
->retry
.disabled
= 0;
9410 if ((wrqu
->retry
.flags
& IW_RETRY_TYPE
) == IW_RETRY_LIFETIME
) {
9411 mutex_unlock(&priv
->mutex
);
9415 if (wrqu
->retry
.flags
& IW_RETRY_LONG
) {
9416 wrqu
->retry
.flags
= IW_RETRY_LIMIT
| IW_RETRY_LONG
;
9417 wrqu
->retry
.value
= priv
->long_retry_limit
;
9418 } else if (wrqu
->retry
.flags
& IW_RETRY_SHORT
) {
9419 wrqu
->retry
.flags
= IW_RETRY_LIMIT
| IW_RETRY_SHORT
;
9420 wrqu
->retry
.value
= priv
->short_retry_limit
;
9422 wrqu
->retry
.flags
= IW_RETRY_LIMIT
;
9423 wrqu
->retry
.value
= priv
->short_retry_limit
;
9425 mutex_unlock(&priv
->mutex
);
9427 IPW_DEBUG_WX("GET retry -> %d\n", wrqu
->retry
.value
);
9432 static int ipw_wx_set_scan(struct net_device
*dev
,
9433 struct iw_request_info
*info
,
9434 union iwreq_data
*wrqu
, char *extra
)
9436 struct ipw_priv
*priv
= libipw_priv(dev
);
9437 struct iw_scan_req
*req
= (struct iw_scan_req
*)extra
;
9438 struct delayed_work
*work
= NULL
;
9440 mutex_lock(&priv
->mutex
);
9442 priv
->user_requested_scan
= 1;
9444 if (wrqu
->data
.length
== sizeof(struct iw_scan_req
)) {
9445 if (wrqu
->data
.flags
& IW_SCAN_THIS_ESSID
) {
9446 int len
= min((int)req
->essid_len
,
9447 (int)sizeof(priv
->direct_scan_ssid
));
9448 memcpy(priv
->direct_scan_ssid
, req
->essid
, len
);
9449 priv
->direct_scan_ssid_len
= len
;
9450 work
= &priv
->request_direct_scan
;
9451 } else if (req
->scan_type
== IW_SCAN_TYPE_PASSIVE
) {
9452 work
= &priv
->request_passive_scan
;
9455 /* Normal active broadcast scan */
9456 work
= &priv
->request_scan
;
9459 mutex_unlock(&priv
->mutex
);
9461 IPW_DEBUG_WX("Start scan\n");
9463 schedule_delayed_work(work
, 0);
9468 static int ipw_wx_get_scan(struct net_device
*dev
,
9469 struct iw_request_info
*info
,
9470 union iwreq_data
*wrqu
, char *extra
)
9472 struct ipw_priv
*priv
= libipw_priv(dev
);
9473 return libipw_wx_get_scan(priv
->ieee
, info
, wrqu
, extra
);
9476 static int ipw_wx_set_encode(struct net_device
*dev
,
9477 struct iw_request_info
*info
,
9478 union iwreq_data
*wrqu
, char *key
)
9480 struct ipw_priv
*priv
= libipw_priv(dev
);
9482 u32 cap
= priv
->capability
;
9484 mutex_lock(&priv
->mutex
);
9485 ret
= libipw_wx_set_encode(priv
->ieee
, info
, wrqu
, key
);
9487 /* In IBSS mode, we need to notify the firmware to update
9488 * the beacon info after we changed the capability. */
9489 if (cap
!= priv
->capability
&&
9490 priv
->ieee
->iw_mode
== IW_MODE_ADHOC
&&
9491 priv
->status
& STATUS_ASSOCIATED
)
9492 ipw_disassociate(priv
);
9494 mutex_unlock(&priv
->mutex
);
9498 static int ipw_wx_get_encode(struct net_device
*dev
,
9499 struct iw_request_info
*info
,
9500 union iwreq_data
*wrqu
, char *key
)
9502 struct ipw_priv
*priv
= libipw_priv(dev
);
9503 return libipw_wx_get_encode(priv
->ieee
, info
, wrqu
, key
);
9506 static int ipw_wx_set_power(struct net_device
*dev
,
9507 struct iw_request_info
*info
,
9508 union iwreq_data
*wrqu
, char *extra
)
9510 struct ipw_priv
*priv
= libipw_priv(dev
);
9512 mutex_lock(&priv
->mutex
);
9513 if (wrqu
->power
.disabled
) {
9514 priv
->power_mode
= IPW_POWER_LEVEL(priv
->power_mode
);
9515 err
= ipw_send_power_mode(priv
, IPW_POWER_MODE_CAM
);
9517 IPW_DEBUG_WX("failed setting power mode.\n");
9518 mutex_unlock(&priv
->mutex
);
9521 IPW_DEBUG_WX("SET Power Management Mode -> off\n");
9522 mutex_unlock(&priv
->mutex
);
9526 switch (wrqu
->power
.flags
& IW_POWER_MODE
) {
9527 case IW_POWER_ON
: /* If not specified */
9528 case IW_POWER_MODE
: /* If set all mask */
9529 case IW_POWER_ALL_R
: /* If explicitly state all */
9531 default: /* Otherwise we don't support it */
9532 IPW_DEBUG_WX("SET PM Mode: %X not supported.\n",
9534 mutex_unlock(&priv
->mutex
);
9538 /* If the user hasn't specified a power management mode yet, default
9540 if (IPW_POWER_LEVEL(priv
->power_mode
) == IPW_POWER_AC
)
9541 priv
->power_mode
= IPW_POWER_ENABLED
| IPW_POWER_BATTERY
;
9543 priv
->power_mode
= IPW_POWER_ENABLED
| priv
->power_mode
;
9545 err
= ipw_send_power_mode(priv
, IPW_POWER_LEVEL(priv
->power_mode
));
9547 IPW_DEBUG_WX("failed setting power mode.\n");
9548 mutex_unlock(&priv
->mutex
);
9552 IPW_DEBUG_WX("SET Power Management Mode -> 0x%02X\n", priv
->power_mode
);
9553 mutex_unlock(&priv
->mutex
);
9557 static int ipw_wx_get_power(struct net_device
*dev
,
9558 struct iw_request_info
*info
,
9559 union iwreq_data
*wrqu
, char *extra
)
9561 struct ipw_priv
*priv
= libipw_priv(dev
);
9562 mutex_lock(&priv
->mutex
);
9563 if (!(priv
->power_mode
& IPW_POWER_ENABLED
))
9564 wrqu
->power
.disabled
= 1;
9566 wrqu
->power
.disabled
= 0;
9568 mutex_unlock(&priv
->mutex
);
9569 IPW_DEBUG_WX("GET Power Management Mode -> %02X\n", priv
->power_mode
);
9574 static int ipw_wx_set_powermode(struct net_device
*dev
,
9575 struct iw_request_info
*info
,
9576 union iwreq_data
*wrqu
, char *extra
)
9578 struct ipw_priv
*priv
= libipw_priv(dev
);
9579 int mode
= *(int *)extra
;
9582 mutex_lock(&priv
->mutex
);
9583 if ((mode
< 1) || (mode
> IPW_POWER_LIMIT
))
9584 mode
= IPW_POWER_AC
;
9586 if (IPW_POWER_LEVEL(priv
->power_mode
) != mode
) {
9587 err
= ipw_send_power_mode(priv
, mode
);
9589 IPW_DEBUG_WX("failed setting power mode.\n");
9590 mutex_unlock(&priv
->mutex
);
9593 priv
->power_mode
= IPW_POWER_ENABLED
| mode
;
9595 mutex_unlock(&priv
->mutex
);
9599 #define MAX_WX_STRING 80
9600 static int ipw_wx_get_powermode(struct net_device
*dev
,
9601 struct iw_request_info
*info
,
9602 union iwreq_data
*wrqu
, char *extra
)
9604 struct ipw_priv
*priv
= libipw_priv(dev
);
9605 int level
= IPW_POWER_LEVEL(priv
->power_mode
);
9608 p
+= scnprintf(p
, MAX_WX_STRING
, "Power save level: %d ", level
);
9612 p
+= scnprintf(p
, MAX_WX_STRING
- (p
- extra
), "(AC)");
9614 case IPW_POWER_BATTERY
:
9615 p
+= scnprintf(p
, MAX_WX_STRING
- (p
- extra
), "(BATTERY)");
9618 p
+= scnprintf(p
, MAX_WX_STRING
- (p
- extra
),
9619 "(Timeout %dms, Period %dms)",
9620 timeout_duration
[level
- 1] / 1000,
9621 period_duration
[level
- 1] / 1000);
9624 if (!(priv
->power_mode
& IPW_POWER_ENABLED
))
9625 p
+= scnprintf(p
, MAX_WX_STRING
- (p
- extra
), " OFF");
9627 wrqu
->data
.length
= p
- extra
+ 1;
9632 static int ipw_wx_set_wireless_mode(struct net_device
*dev
,
9633 struct iw_request_info
*info
,
9634 union iwreq_data
*wrqu
, char *extra
)
9636 struct ipw_priv
*priv
= libipw_priv(dev
);
9637 int mode
= *(int *)extra
;
9638 u8 band
= 0, modulation
= 0;
9640 if (mode
== 0 || mode
& ~IEEE_MODE_MASK
) {
9641 IPW_WARNING("Attempt to set invalid wireless mode: %d\n", mode
);
9644 mutex_lock(&priv
->mutex
);
9645 if (priv
->adapter
== IPW_2915ABG
) {
9646 priv
->ieee
->abg_true
= 1;
9647 if (mode
& IEEE_A
) {
9648 band
|= LIBIPW_52GHZ_BAND
;
9649 modulation
|= LIBIPW_OFDM_MODULATION
;
9651 priv
->ieee
->abg_true
= 0;
9653 if (mode
& IEEE_A
) {
9654 IPW_WARNING("Attempt to set 2200BG into "
9656 mutex_unlock(&priv
->mutex
);
9660 priv
->ieee
->abg_true
= 0;
9663 if (mode
& IEEE_B
) {
9664 band
|= LIBIPW_24GHZ_BAND
;
9665 modulation
|= LIBIPW_CCK_MODULATION
;
9667 priv
->ieee
->abg_true
= 0;
9669 if (mode
& IEEE_G
) {
9670 band
|= LIBIPW_24GHZ_BAND
;
9671 modulation
|= LIBIPW_OFDM_MODULATION
;
9673 priv
->ieee
->abg_true
= 0;
9675 priv
->ieee
->mode
= mode
;
9676 priv
->ieee
->freq_band
= band
;
9677 priv
->ieee
->modulation
= modulation
;
9678 init_supported_rates(priv
, &priv
->rates
);
9680 /* Network configuration changed -- force [re]association */
9681 IPW_DEBUG_ASSOC("[re]association triggered due to mode change.\n");
9682 if (!ipw_disassociate(priv
)) {
9683 ipw_send_supported_rates(priv
, &priv
->rates
);
9684 ipw_associate(priv
);
9687 /* Update the band LEDs */
9688 ipw_led_band_on(priv
);
9690 IPW_DEBUG_WX("PRIV SET MODE: %c%c%c\n",
9691 mode
& IEEE_A
? 'a' : '.',
9692 mode
& IEEE_B
? 'b' : '.', mode
& IEEE_G
? 'g' : '.');
9693 mutex_unlock(&priv
->mutex
);
9697 static int ipw_wx_get_wireless_mode(struct net_device
*dev
,
9698 struct iw_request_info
*info
,
9699 union iwreq_data
*wrqu
, char *extra
)
9701 struct ipw_priv
*priv
= libipw_priv(dev
);
9702 mutex_lock(&priv
->mutex
);
9703 switch (priv
->ieee
->mode
) {
9705 strncpy(extra
, "802.11a (1)", MAX_WX_STRING
);
9708 strncpy(extra
, "802.11b (2)", MAX_WX_STRING
);
9710 case IEEE_A
| IEEE_B
:
9711 strncpy(extra
, "802.11ab (3)", MAX_WX_STRING
);
9714 strncpy(extra
, "802.11g (4)", MAX_WX_STRING
);
9716 case IEEE_A
| IEEE_G
:
9717 strncpy(extra
, "802.11ag (5)", MAX_WX_STRING
);
9719 case IEEE_B
| IEEE_G
:
9720 strncpy(extra
, "802.11bg (6)", MAX_WX_STRING
);
9722 case IEEE_A
| IEEE_B
| IEEE_G
:
9723 strncpy(extra
, "802.11abg (7)", MAX_WX_STRING
);
9726 strncpy(extra
, "unknown", MAX_WX_STRING
);
9729 extra
[MAX_WX_STRING
- 1] = '\0';
9731 IPW_DEBUG_WX("PRIV GET MODE: %s\n", extra
);
9733 wrqu
->data
.length
= strlen(extra
) + 1;
9734 mutex_unlock(&priv
->mutex
);
9739 static int ipw_wx_set_preamble(struct net_device
*dev
,
9740 struct iw_request_info
*info
,
9741 union iwreq_data
*wrqu
, char *extra
)
9743 struct ipw_priv
*priv
= libipw_priv(dev
);
9744 int mode
= *(int *)extra
;
9745 mutex_lock(&priv
->mutex
);
9746 /* Switching from SHORT -> LONG requires a disassociation */
9748 if (!(priv
->config
& CFG_PREAMBLE_LONG
)) {
9749 priv
->config
|= CFG_PREAMBLE_LONG
;
9751 /* Network configuration changed -- force [re]association */
9753 ("[re]association triggered due to preamble change.\n");
9754 if (!ipw_disassociate(priv
))
9755 ipw_associate(priv
);
9761 priv
->config
&= ~CFG_PREAMBLE_LONG
;
9764 mutex_unlock(&priv
->mutex
);
9768 mutex_unlock(&priv
->mutex
);
9772 static int ipw_wx_get_preamble(struct net_device
*dev
,
9773 struct iw_request_info
*info
,
9774 union iwreq_data
*wrqu
, char *extra
)
9776 struct ipw_priv
*priv
= libipw_priv(dev
);
9777 mutex_lock(&priv
->mutex
);
9778 if (priv
->config
& CFG_PREAMBLE_LONG
)
9779 snprintf(wrqu
->name
, IFNAMSIZ
, "long (1)");
9781 snprintf(wrqu
->name
, IFNAMSIZ
, "auto (0)");
9782 mutex_unlock(&priv
->mutex
);
9786 #ifdef CONFIG_IPW2200_MONITOR
9787 static int ipw_wx_set_monitor(struct net_device
*dev
,
9788 struct iw_request_info
*info
,
9789 union iwreq_data
*wrqu
, char *extra
)
9791 struct ipw_priv
*priv
= libipw_priv(dev
);
9792 int *parms
= (int *)extra
;
9793 int enable
= (parms
[0] > 0);
9794 mutex_lock(&priv
->mutex
);
9795 IPW_DEBUG_WX("SET MONITOR: %d %d\n", enable
, parms
[1]);
9797 if (priv
->ieee
->iw_mode
!= IW_MODE_MONITOR
) {
9798 #ifdef CONFIG_IPW2200_RADIOTAP
9799 priv
->net_dev
->type
= ARPHRD_IEEE80211_RADIOTAP
;
9801 priv
->net_dev
->type
= ARPHRD_IEEE80211
;
9803 schedule_work(&priv
->adapter_restart
);
9806 ipw_set_channel(priv
, parms
[1]);
9808 if (priv
->ieee
->iw_mode
!= IW_MODE_MONITOR
) {
9809 mutex_unlock(&priv
->mutex
);
9812 priv
->net_dev
->type
= ARPHRD_ETHER
;
9813 schedule_work(&priv
->adapter_restart
);
9815 mutex_unlock(&priv
->mutex
);
9819 #endif /* CONFIG_IPW2200_MONITOR */
9821 static int ipw_wx_reset(struct net_device
*dev
,
9822 struct iw_request_info
*info
,
9823 union iwreq_data
*wrqu
, char *extra
)
9825 struct ipw_priv
*priv
= libipw_priv(dev
);
9826 IPW_DEBUG_WX("RESET\n");
9827 schedule_work(&priv
->adapter_restart
);
9831 static int ipw_wx_sw_reset(struct net_device
*dev
,
9832 struct iw_request_info
*info
,
9833 union iwreq_data
*wrqu
, char *extra
)
9835 struct ipw_priv
*priv
= libipw_priv(dev
);
9836 union iwreq_data wrqu_sec
= {
9838 .flags
= IW_ENCODE_DISABLED
,
9843 IPW_DEBUG_WX("SW_RESET\n");
9845 mutex_lock(&priv
->mutex
);
9847 ret
= ipw_sw_reset(priv
, 2);
9850 ipw_adapter_restart(priv
);
9853 /* The SW reset bit might have been toggled on by the 'disable'
9854 * module parameter, so take appropriate action */
9855 ipw_radio_kill_sw(priv
, priv
->status
& STATUS_RF_KILL_SW
);
9857 mutex_unlock(&priv
->mutex
);
9858 libipw_wx_set_encode(priv
->ieee
, info
, &wrqu_sec
, NULL
);
9859 mutex_lock(&priv
->mutex
);
9861 if (!(priv
->status
& STATUS_RF_KILL_MASK
)) {
9862 /* Configuration likely changed -- force [re]association */
9863 IPW_DEBUG_ASSOC("[re]association triggered due to sw "
9865 if (!ipw_disassociate(priv
))
9866 ipw_associate(priv
);
9869 mutex_unlock(&priv
->mutex
);
9874 /* Rebase the WE IOCTLs to zero for the handler array */
9875 static iw_handler ipw_wx_handlers
[] = {
9876 IW_HANDLER(SIOCGIWNAME
, (iw_handler
)cfg80211_wext_giwname
),
9877 IW_HANDLER(SIOCSIWFREQ
, ipw_wx_set_freq
),
9878 IW_HANDLER(SIOCGIWFREQ
, ipw_wx_get_freq
),
9879 IW_HANDLER(SIOCSIWMODE
, ipw_wx_set_mode
),
9880 IW_HANDLER(SIOCGIWMODE
, ipw_wx_get_mode
),
9881 IW_HANDLER(SIOCSIWSENS
, ipw_wx_set_sens
),
9882 IW_HANDLER(SIOCGIWSENS
, ipw_wx_get_sens
),
9883 IW_HANDLER(SIOCGIWRANGE
, ipw_wx_get_range
),
9884 IW_HANDLER(SIOCSIWAP
, ipw_wx_set_wap
),
9885 IW_HANDLER(SIOCGIWAP
, ipw_wx_get_wap
),
9886 IW_HANDLER(SIOCSIWSCAN
, ipw_wx_set_scan
),
9887 IW_HANDLER(SIOCGIWSCAN
, ipw_wx_get_scan
),
9888 IW_HANDLER(SIOCSIWESSID
, ipw_wx_set_essid
),
9889 IW_HANDLER(SIOCGIWESSID
, ipw_wx_get_essid
),
9890 IW_HANDLER(SIOCSIWNICKN
, ipw_wx_set_nick
),
9891 IW_HANDLER(SIOCGIWNICKN
, ipw_wx_get_nick
),
9892 IW_HANDLER(SIOCSIWRATE
, ipw_wx_set_rate
),
9893 IW_HANDLER(SIOCGIWRATE
, ipw_wx_get_rate
),
9894 IW_HANDLER(SIOCSIWRTS
, ipw_wx_set_rts
),
9895 IW_HANDLER(SIOCGIWRTS
, ipw_wx_get_rts
),
9896 IW_HANDLER(SIOCSIWFRAG
, ipw_wx_set_frag
),
9897 IW_HANDLER(SIOCGIWFRAG
, ipw_wx_get_frag
),
9898 IW_HANDLER(SIOCSIWTXPOW
, ipw_wx_set_txpow
),
9899 IW_HANDLER(SIOCGIWTXPOW
, ipw_wx_get_txpow
),
9900 IW_HANDLER(SIOCSIWRETRY
, ipw_wx_set_retry
),
9901 IW_HANDLER(SIOCGIWRETRY
, ipw_wx_get_retry
),
9902 IW_HANDLER(SIOCSIWENCODE
, ipw_wx_set_encode
),
9903 IW_HANDLER(SIOCGIWENCODE
, ipw_wx_get_encode
),
9904 IW_HANDLER(SIOCSIWPOWER
, ipw_wx_set_power
),
9905 IW_HANDLER(SIOCGIWPOWER
, ipw_wx_get_power
),
9906 IW_HANDLER(SIOCSIWSPY
, iw_handler_set_spy
),
9907 IW_HANDLER(SIOCGIWSPY
, iw_handler_get_spy
),
9908 IW_HANDLER(SIOCSIWTHRSPY
, iw_handler_set_thrspy
),
9909 IW_HANDLER(SIOCGIWTHRSPY
, iw_handler_get_thrspy
),
9910 IW_HANDLER(SIOCSIWGENIE
, ipw_wx_set_genie
),
9911 IW_HANDLER(SIOCGIWGENIE
, ipw_wx_get_genie
),
9912 IW_HANDLER(SIOCSIWMLME
, ipw_wx_set_mlme
),
9913 IW_HANDLER(SIOCSIWAUTH
, ipw_wx_set_auth
),
9914 IW_HANDLER(SIOCGIWAUTH
, ipw_wx_get_auth
),
9915 IW_HANDLER(SIOCSIWENCODEEXT
, ipw_wx_set_encodeext
),
9916 IW_HANDLER(SIOCGIWENCODEEXT
, ipw_wx_get_encodeext
),
9920 IPW_PRIV_SET_POWER
= SIOCIWFIRSTPRIV
,
9924 IPW_PRIV_SET_PREAMBLE
,
9925 IPW_PRIV_GET_PREAMBLE
,
9928 #ifdef CONFIG_IPW2200_MONITOR
9929 IPW_PRIV_SET_MONITOR
,
9933 static struct iw_priv_args ipw_priv_args
[] = {
9935 .cmd
= IPW_PRIV_SET_POWER
,
9936 .set_args
= IW_PRIV_TYPE_INT
| IW_PRIV_SIZE_FIXED
| 1,
9937 .name
= "set_power"},
9939 .cmd
= IPW_PRIV_GET_POWER
,
9940 .get_args
= IW_PRIV_TYPE_CHAR
| IW_PRIV_SIZE_FIXED
| MAX_WX_STRING
,
9941 .name
= "get_power"},
9943 .cmd
= IPW_PRIV_SET_MODE
,
9944 .set_args
= IW_PRIV_TYPE_INT
| IW_PRIV_SIZE_FIXED
| 1,
9945 .name
= "set_mode"},
9947 .cmd
= IPW_PRIV_GET_MODE
,
9948 .get_args
= IW_PRIV_TYPE_CHAR
| IW_PRIV_SIZE_FIXED
| MAX_WX_STRING
,
9949 .name
= "get_mode"},
9951 .cmd
= IPW_PRIV_SET_PREAMBLE
,
9952 .set_args
= IW_PRIV_TYPE_INT
| IW_PRIV_SIZE_FIXED
| 1,
9953 .name
= "set_preamble"},
9955 .cmd
= IPW_PRIV_GET_PREAMBLE
,
9956 .get_args
= IW_PRIV_TYPE_CHAR
| IW_PRIV_SIZE_FIXED
| IFNAMSIZ
,
9957 .name
= "get_preamble"},
9960 IW_PRIV_TYPE_INT
| IW_PRIV_SIZE_FIXED
| 0, 0, "reset"},
9963 IW_PRIV_TYPE_INT
| IW_PRIV_SIZE_FIXED
| 0, 0, "sw_reset"},
9964 #ifdef CONFIG_IPW2200_MONITOR
9966 IPW_PRIV_SET_MONITOR
,
9967 IW_PRIV_TYPE_INT
| IW_PRIV_SIZE_FIXED
| 2, 0, "monitor"},
9968 #endif /* CONFIG_IPW2200_MONITOR */
9971 static iw_handler ipw_priv_handler
[] = {
9972 ipw_wx_set_powermode
,
9973 ipw_wx_get_powermode
,
9974 ipw_wx_set_wireless_mode
,
9975 ipw_wx_get_wireless_mode
,
9976 ipw_wx_set_preamble
,
9977 ipw_wx_get_preamble
,
9980 #ifdef CONFIG_IPW2200_MONITOR
9985 static const struct iw_handler_def ipw_wx_handler_def
= {
9986 .standard
= ipw_wx_handlers
,
9987 .num_standard
= ARRAY_SIZE(ipw_wx_handlers
),
9988 .num_private
= ARRAY_SIZE(ipw_priv_handler
),
9989 .num_private_args
= ARRAY_SIZE(ipw_priv_args
),
9990 .private = ipw_priv_handler
,
9991 .private_args
= ipw_priv_args
,
9992 .get_wireless_stats
= ipw_get_wireless_stats
,
9996 * Get wireless statistics.
9997 * Called by /proc/net/wireless
9998 * Also called by SIOCGIWSTATS
10000 static struct iw_statistics
*ipw_get_wireless_stats(struct net_device
*dev
)
10002 struct ipw_priv
*priv
= libipw_priv(dev
);
10003 struct iw_statistics
*wstats
;
10005 wstats
= &priv
->wstats
;
10007 /* if hw is disabled, then ipw_get_ordinal() can't be called.
10008 * netdev->get_wireless_stats seems to be called before fw is
10009 * initialized. STATUS_ASSOCIATED will only be set if the hw is up
10010 * and associated; if not associcated, the values are all meaningless
10011 * anyway, so set them all to NULL and INVALID */
10012 if (!(priv
->status
& STATUS_ASSOCIATED
)) {
10013 wstats
->miss
.beacon
= 0;
10014 wstats
->discard
.retries
= 0;
10015 wstats
->qual
.qual
= 0;
10016 wstats
->qual
.level
= 0;
10017 wstats
->qual
.noise
= 0;
10018 wstats
->qual
.updated
= 7;
10019 wstats
->qual
.updated
|= IW_QUAL_NOISE_INVALID
|
10020 IW_QUAL_QUAL_INVALID
| IW_QUAL_LEVEL_INVALID
;
10024 wstats
->qual
.qual
= priv
->quality
;
10025 wstats
->qual
.level
= priv
->exp_avg_rssi
;
10026 wstats
->qual
.noise
= priv
->exp_avg_noise
;
10027 wstats
->qual
.updated
= IW_QUAL_QUAL_UPDATED
| IW_QUAL_LEVEL_UPDATED
|
10028 IW_QUAL_NOISE_UPDATED
| IW_QUAL_DBM
;
10030 wstats
->miss
.beacon
= average_value(&priv
->average_missed_beacons
);
10031 wstats
->discard
.retries
= priv
->last_tx_failures
;
10032 wstats
->discard
.code
= priv
->ieee
->ieee_stats
.rx_discards_undecryptable
;
10034 /* if (ipw_get_ordinal(priv, IPW_ORD_STAT_TX_RETRY, &tx_retry, &len))
10035 goto fail_get_ordinal;
10036 wstats->discard.retries += tx_retry; */
10041 /* net device stuff */
10043 static void init_sys_config(struct ipw_sys_config
*sys_config
)
10045 memset(sys_config
, 0, sizeof(struct ipw_sys_config
));
10046 sys_config
->bt_coexistence
= 0;
10047 sys_config
->answer_broadcast_ssid_probe
= 0;
10048 sys_config
->accept_all_data_frames
= 0;
10049 sys_config
->accept_non_directed_frames
= 1;
10050 sys_config
->exclude_unicast_unencrypted
= 0;
10051 sys_config
->disable_unicast_decryption
= 1;
10052 sys_config
->exclude_multicast_unencrypted
= 0;
10053 sys_config
->disable_multicast_decryption
= 1;
10054 if (antenna
< CFG_SYS_ANTENNA_BOTH
|| antenna
> CFG_SYS_ANTENNA_B
)
10055 antenna
= CFG_SYS_ANTENNA_BOTH
;
10056 sys_config
->antenna_diversity
= antenna
;
10057 sys_config
->pass_crc_to_host
= 0; /* TODO: See if 1 gives us FCS */
10058 sys_config
->dot11g_auto_detection
= 0;
10059 sys_config
->enable_cts_to_self
= 0;
10060 sys_config
->bt_coexist_collision_thr
= 0;
10061 sys_config
->pass_noise_stats_to_host
= 1; /* 1 -- fix for 256 */
10062 sys_config
->silence_threshold
= 0x1e;
10065 static int ipw_net_open(struct net_device
*dev
)
10067 IPW_DEBUG_INFO("dev->open\n");
10068 netif_start_queue(dev
);
10072 static int ipw_net_stop(struct net_device
*dev
)
10074 IPW_DEBUG_INFO("dev->close\n");
10075 netif_stop_queue(dev
);
10082 modify to send one tfd per fragment instead of using chunking. otherwise
10083 we need to heavily modify the libipw_skb_to_txb.
10086 static int ipw_tx_skb(struct ipw_priv
*priv
, struct libipw_txb
*txb
,
10089 struct libipw_hdr_3addrqos
*hdr
= (struct libipw_hdr_3addrqos
*)
10090 txb
->fragments
[0]->data
;
10092 struct tfd_frame
*tfd
;
10093 #ifdef CONFIG_IPW2200_QOS
10094 int tx_id
= ipw_get_tx_queue_number(priv
, pri
);
10095 struct clx2_tx_queue
*txq
= &priv
->txq
[tx_id
];
10097 struct clx2_tx_queue
*txq
= &priv
->txq
[0];
10099 struct clx2_queue
*q
= &txq
->q
;
10100 u8 id
, hdr_len
, unicast
;
10103 if (!(priv
->status
& STATUS_ASSOCIATED
))
10106 hdr_len
= libipw_get_hdrlen(le16_to_cpu(hdr
->frame_ctl
));
10107 switch (priv
->ieee
->iw_mode
) {
10108 case IW_MODE_ADHOC
:
10109 unicast
= !is_multicast_ether_addr(hdr
->addr1
);
10110 id
= ipw_find_station(priv
, hdr
->addr1
);
10111 if (id
== IPW_INVALID_STATION
) {
10112 id
= ipw_add_station(priv
, hdr
->addr1
);
10113 if (id
== IPW_INVALID_STATION
) {
10114 IPW_WARNING("Attempt to send data to "
10115 "invalid cell: %pM\n",
10122 case IW_MODE_INFRA
:
10124 unicast
= !is_multicast_ether_addr(hdr
->addr3
);
10129 tfd
= &txq
->bd
[q
->first_empty
];
10130 txq
->txb
[q
->first_empty
] = txb
;
10131 memset(tfd
, 0, sizeof(*tfd
));
10132 tfd
->u
.data
.station_number
= id
;
10134 tfd
->control_flags
.message_type
= TX_FRAME_TYPE
;
10135 tfd
->control_flags
.control_bits
= TFD_NEED_IRQ_MASK
;
10137 tfd
->u
.data
.cmd_id
= DINO_CMD_TX
;
10138 tfd
->u
.data
.len
= cpu_to_le16(txb
->payload_size
);
10140 if (priv
->assoc_request
.ieee_mode
== IPW_B_MODE
)
10141 tfd
->u
.data
.tx_flags_ext
|= DCT_FLAG_EXT_MODE_CCK
;
10143 tfd
->u
.data
.tx_flags_ext
|= DCT_FLAG_EXT_MODE_OFDM
;
10145 if (priv
->assoc_request
.preamble_length
== DCT_FLAG_SHORT_PREAMBLE
)
10146 tfd
->u
.data
.tx_flags
|= DCT_FLAG_SHORT_PREAMBLE
;
10148 fc
= le16_to_cpu(hdr
->frame_ctl
);
10149 hdr
->frame_ctl
= cpu_to_le16(fc
& ~IEEE80211_FCTL_MOREFRAGS
);
10151 memcpy(&tfd
->u
.data
.tfd
.tfd_24
.mchdr
, hdr
, hdr_len
);
10153 if (likely(unicast
))
10154 tfd
->u
.data
.tx_flags
|= DCT_FLAG_ACK_REQD
;
10156 if (txb
->encrypted
&& !priv
->ieee
->host_encrypt
) {
10157 switch (priv
->ieee
->sec
.level
) {
10159 tfd
->u
.data
.tfd
.tfd_24
.mchdr
.frame_ctl
|=
10160 cpu_to_le16(IEEE80211_FCTL_PROTECTED
);
10161 /* XXX: ACK flag must be set for CCMP even if it
10162 * is a multicast/broadcast packet, because CCMP
10163 * group communication encrypted by GTK is
10164 * actually done by the AP. */
10166 tfd
->u
.data
.tx_flags
|= DCT_FLAG_ACK_REQD
;
10168 tfd
->u
.data
.tx_flags
&= ~DCT_FLAG_NO_WEP
;
10169 tfd
->u
.data
.tx_flags_ext
|= DCT_FLAG_EXT_SECURITY_CCM
;
10170 tfd
->u
.data
.key_index
= 0;
10171 tfd
->u
.data
.key_index
|= DCT_WEP_INDEX_USE_IMMEDIATE
;
10174 tfd
->u
.data
.tfd
.tfd_24
.mchdr
.frame_ctl
|=
10175 cpu_to_le16(IEEE80211_FCTL_PROTECTED
);
10176 tfd
->u
.data
.tx_flags
&= ~DCT_FLAG_NO_WEP
;
10177 tfd
->u
.data
.tx_flags_ext
|= DCT_FLAG_EXT_SECURITY_TKIP
;
10178 tfd
->u
.data
.key_index
= DCT_WEP_INDEX_USE_IMMEDIATE
;
10181 tfd
->u
.data
.tfd
.tfd_24
.mchdr
.frame_ctl
|=
10182 cpu_to_le16(IEEE80211_FCTL_PROTECTED
);
10183 tfd
->u
.data
.key_index
= priv
->ieee
->crypt_info
.tx_keyidx
;
10184 if (priv
->ieee
->sec
.key_sizes
[priv
->ieee
->crypt_info
.tx_keyidx
] <=
10186 tfd
->u
.data
.key_index
|= DCT_WEP_KEY_64Bit
;
10188 tfd
->u
.data
.key_index
|= DCT_WEP_KEY_128Bit
;
10193 printk(KERN_ERR
"Unknown security level %d\n",
10194 priv
->ieee
->sec
.level
);
10198 /* No hardware encryption */
10199 tfd
->u
.data
.tx_flags
|= DCT_FLAG_NO_WEP
;
10201 #ifdef CONFIG_IPW2200_QOS
10202 if (fc
& IEEE80211_STYPE_QOS_DATA
)
10203 ipw_qos_set_tx_queue_command(priv
, pri
, &(tfd
->u
.data
));
10204 #endif /* CONFIG_IPW2200_QOS */
10207 tfd
->u
.data
.num_chunks
= cpu_to_le32(min((u8
) (NUM_TFD_CHUNKS
- 2),
10209 IPW_DEBUG_FRAG("%i fragments being sent as %i chunks.\n",
10210 txb
->nr_frags
, le32_to_cpu(tfd
->u
.data
.num_chunks
));
10211 for (i
= 0; i
< le32_to_cpu(tfd
->u
.data
.num_chunks
); i
++) {
10212 IPW_DEBUG_FRAG("Adding fragment %i of %i (%d bytes).\n",
10213 i
, le32_to_cpu(tfd
->u
.data
.num_chunks
),
10214 txb
->fragments
[i
]->len
- hdr_len
);
10215 IPW_DEBUG_TX("Dumping TX packet frag %i of %i (%d bytes):\n",
10216 i
, tfd
->u
.data
.num_chunks
,
10217 txb
->fragments
[i
]->len
- hdr_len
);
10218 printk_buf(IPW_DL_TX
, txb
->fragments
[i
]->data
+ hdr_len
,
10219 txb
->fragments
[i
]->len
- hdr_len
);
10221 tfd
->u
.data
.chunk_ptr
[i
] =
10222 cpu_to_le32(dma_map_single(&priv
->pci_dev
->dev
,
10223 txb
->fragments
[i
]->data
+ hdr_len
,
10224 txb
->fragments
[i
]->len
- hdr_len
,
10226 tfd
->u
.data
.chunk_len
[i
] =
10227 cpu_to_le16(txb
->fragments
[i
]->len
- hdr_len
);
10230 if (i
!= txb
->nr_frags
) {
10231 struct sk_buff
*skb
;
10232 u16 remaining_bytes
= 0;
10235 for (j
= i
; j
< txb
->nr_frags
; j
++)
10236 remaining_bytes
+= txb
->fragments
[j
]->len
- hdr_len
;
10238 printk(KERN_INFO
"Trying to reallocate for %d bytes\n",
10240 skb
= alloc_skb(remaining_bytes
, GFP_ATOMIC
);
10242 tfd
->u
.data
.chunk_len
[i
] = cpu_to_le16(remaining_bytes
);
10243 for (j
= i
; j
< txb
->nr_frags
; j
++) {
10244 int size
= txb
->fragments
[j
]->len
- hdr_len
;
10246 printk(KERN_INFO
"Adding frag %d %d...\n",
10249 txb
->fragments
[j
]->data
+ hdr_len
,
10252 dev_kfree_skb_any(txb
->fragments
[i
]);
10253 txb
->fragments
[i
] = skb
;
10254 tfd
->u
.data
.chunk_ptr
[i
] =
10255 cpu_to_le32(dma_map_single(&priv
->pci_dev
->dev
,
10260 le32_add_cpu(&tfd
->u
.data
.num_chunks
, 1);
10265 q
->first_empty
= ipw_queue_inc_wrap(q
->first_empty
, q
->n_bd
);
10266 ipw_write32(priv
, q
->reg_w
, q
->first_empty
);
10268 if (ipw_tx_queue_space(q
) < q
->high_mark
)
10269 netif_stop_queue(priv
->net_dev
);
10271 return NETDEV_TX_OK
;
10274 IPW_DEBUG_DROP("Silently dropping Tx packet.\n");
10275 libipw_txb_free(txb
);
10276 return NETDEV_TX_OK
;
10279 static int ipw_net_is_queue_full(struct net_device
*dev
, int pri
)
10281 struct ipw_priv
*priv
= libipw_priv(dev
);
10282 #ifdef CONFIG_IPW2200_QOS
10283 int tx_id
= ipw_get_tx_queue_number(priv
, pri
);
10284 struct clx2_tx_queue
*txq
= &priv
->txq
[tx_id
];
10286 struct clx2_tx_queue
*txq
= &priv
->txq
[0];
10287 #endif /* CONFIG_IPW2200_QOS */
10289 if (ipw_tx_queue_space(&txq
->q
) < txq
->q
.high_mark
)
10295 #ifdef CONFIG_IPW2200_PROMISCUOUS
10296 static void ipw_handle_promiscuous_tx(struct ipw_priv
*priv
,
10297 struct libipw_txb
*txb
)
10299 struct libipw_rx_stats dummystats
;
10300 struct ieee80211_hdr
*hdr
;
10302 u16 filter
= priv
->prom_priv
->filter
;
10305 if (filter
& IPW_PROM_NO_TX
)
10308 memset(&dummystats
, 0, sizeof(dummystats
));
10310 /* Filtering of fragment chains is done against the first fragment */
10311 hdr
= (void *)txb
->fragments
[0]->data
;
10312 if (libipw_is_management(le16_to_cpu(hdr
->frame_control
))) {
10313 if (filter
& IPW_PROM_NO_MGMT
)
10315 if (filter
& IPW_PROM_MGMT_HEADER_ONLY
)
10317 } else if (libipw_is_control(le16_to_cpu(hdr
->frame_control
))) {
10318 if (filter
& IPW_PROM_NO_CTL
)
10320 if (filter
& IPW_PROM_CTL_HEADER_ONLY
)
10322 } else if (libipw_is_data(le16_to_cpu(hdr
->frame_control
))) {
10323 if (filter
& IPW_PROM_NO_DATA
)
10325 if (filter
& IPW_PROM_DATA_HEADER_ONLY
)
10329 for(n
=0; n
<txb
->nr_frags
; ++n
) {
10330 struct sk_buff
*src
= txb
->fragments
[n
];
10331 struct sk_buff
*dst
;
10332 struct ieee80211_radiotap_header
*rt_hdr
;
10336 hdr
= (void *)src
->data
;
10337 len
= libipw_get_hdrlen(le16_to_cpu(hdr
->frame_control
));
10341 dst
= alloc_skb(len
+ sizeof(*rt_hdr
) + sizeof(u16
)*2, GFP_ATOMIC
);
10345 rt_hdr
= skb_put(dst
, sizeof(*rt_hdr
));
10347 rt_hdr
->it_version
= PKTHDR_RADIOTAP_VERSION
;
10348 rt_hdr
->it_pad
= 0;
10349 rt_hdr
->it_present
= 0; /* after all, it's just an idea */
10350 rt_hdr
->it_present
|= cpu_to_le32(1 << IEEE80211_RADIOTAP_CHANNEL
);
10352 *(__le16
*)skb_put(dst
, sizeof(u16
)) = cpu_to_le16(
10353 ieee80211chan2mhz(priv
->channel
));
10354 if (priv
->channel
> 14) /* 802.11a */
10355 *(__le16
*)skb_put(dst
, sizeof(u16
)) =
10356 cpu_to_le16(IEEE80211_CHAN_OFDM
|
10357 IEEE80211_CHAN_5GHZ
);
10358 else if (priv
->ieee
->mode
== IEEE_B
) /* 802.11b */
10359 *(__le16
*)skb_put(dst
, sizeof(u16
)) =
10360 cpu_to_le16(IEEE80211_CHAN_CCK
|
10361 IEEE80211_CHAN_2GHZ
);
10363 *(__le16
*)skb_put(dst
, sizeof(u16
)) =
10364 cpu_to_le16(IEEE80211_CHAN_OFDM
|
10365 IEEE80211_CHAN_2GHZ
);
10367 rt_hdr
->it_len
= cpu_to_le16(dst
->len
);
10369 skb_copy_from_linear_data(src
, skb_put(dst
, len
), len
);
10371 if (!libipw_rx(priv
->prom_priv
->ieee
, dst
, &dummystats
))
10372 dev_kfree_skb_any(dst
);
10377 static netdev_tx_t
ipw_net_hard_start_xmit(struct libipw_txb
*txb
,
10378 struct net_device
*dev
, int pri
)
10380 struct ipw_priv
*priv
= libipw_priv(dev
);
10381 unsigned long flags
;
10384 IPW_DEBUG_TX("dev->xmit(%d bytes)\n", txb
->payload_size
);
10385 spin_lock_irqsave(&priv
->lock
, flags
);
10387 #ifdef CONFIG_IPW2200_PROMISCUOUS
10388 if (rtap_iface
&& netif_running(priv
->prom_net_dev
))
10389 ipw_handle_promiscuous_tx(priv
, txb
);
10392 ret
= ipw_tx_skb(priv
, txb
, pri
);
10393 if (ret
== NETDEV_TX_OK
)
10394 __ipw_led_activity_on(priv
);
10395 spin_unlock_irqrestore(&priv
->lock
, flags
);
10400 static void ipw_net_set_multicast_list(struct net_device
*dev
)
10405 static int ipw_net_set_mac_address(struct net_device
*dev
, void *p
)
10407 struct ipw_priv
*priv
= libipw_priv(dev
);
10408 struct sockaddr
*addr
= p
;
10410 if (!is_valid_ether_addr(addr
->sa_data
))
10411 return -EADDRNOTAVAIL
;
10412 mutex_lock(&priv
->mutex
);
10413 priv
->config
|= CFG_CUSTOM_MAC
;
10414 memcpy(priv
->mac_addr
, addr
->sa_data
, ETH_ALEN
);
10415 printk(KERN_INFO
"%s: Setting MAC to %pM\n",
10416 priv
->net_dev
->name
, priv
->mac_addr
);
10417 schedule_work(&priv
->adapter_restart
);
10418 mutex_unlock(&priv
->mutex
);
10422 static void ipw_ethtool_get_drvinfo(struct net_device
*dev
,
10423 struct ethtool_drvinfo
*info
)
10425 struct ipw_priv
*p
= libipw_priv(dev
);
10430 strlcpy(info
->driver
, DRV_NAME
, sizeof(info
->driver
));
10431 strlcpy(info
->version
, DRV_VERSION
, sizeof(info
->version
));
10433 len
= sizeof(vers
);
10434 ipw_get_ordinal(p
, IPW_ORD_STAT_FW_VERSION
, vers
, &len
);
10435 len
= sizeof(date
);
10436 ipw_get_ordinal(p
, IPW_ORD_STAT_FW_DATE
, date
, &len
);
10438 snprintf(info
->fw_version
, sizeof(info
->fw_version
), "%s (%s)",
10440 strlcpy(info
->bus_info
, pci_name(p
->pci_dev
),
10441 sizeof(info
->bus_info
));
10444 static u32
ipw_ethtool_get_link(struct net_device
*dev
)
10446 struct ipw_priv
*priv
= libipw_priv(dev
);
10447 return (priv
->status
& STATUS_ASSOCIATED
) != 0;
10450 static int ipw_ethtool_get_eeprom_len(struct net_device
*dev
)
10452 return IPW_EEPROM_IMAGE_SIZE
;
10455 static int ipw_ethtool_get_eeprom(struct net_device
*dev
,
10456 struct ethtool_eeprom
*eeprom
, u8
* bytes
)
10458 struct ipw_priv
*p
= libipw_priv(dev
);
10460 if (eeprom
->offset
+ eeprom
->len
> IPW_EEPROM_IMAGE_SIZE
)
10462 mutex_lock(&p
->mutex
);
10463 memcpy(bytes
, &p
->eeprom
[eeprom
->offset
], eeprom
->len
);
10464 mutex_unlock(&p
->mutex
);
10468 static int ipw_ethtool_set_eeprom(struct net_device
*dev
,
10469 struct ethtool_eeprom
*eeprom
, u8
* bytes
)
10471 struct ipw_priv
*p
= libipw_priv(dev
);
10474 if (eeprom
->offset
+ eeprom
->len
> IPW_EEPROM_IMAGE_SIZE
)
10476 mutex_lock(&p
->mutex
);
10477 memcpy(&p
->eeprom
[eeprom
->offset
], bytes
, eeprom
->len
);
10478 for (i
= 0; i
< IPW_EEPROM_IMAGE_SIZE
; i
++)
10479 ipw_write8(p
, i
+ IPW_EEPROM_DATA
, p
->eeprom
[i
]);
10480 mutex_unlock(&p
->mutex
);
10484 static const struct ethtool_ops ipw_ethtool_ops
= {
10485 .get_link
= ipw_ethtool_get_link
,
10486 .get_drvinfo
= ipw_ethtool_get_drvinfo
,
10487 .get_eeprom_len
= ipw_ethtool_get_eeprom_len
,
10488 .get_eeprom
= ipw_ethtool_get_eeprom
,
10489 .set_eeprom
= ipw_ethtool_set_eeprom
,
10492 static irqreturn_t
ipw_isr(int irq
, void *data
)
10494 struct ipw_priv
*priv
= data
;
10495 u32 inta
, inta_mask
;
10500 spin_lock(&priv
->irq_lock
);
10502 if (!(priv
->status
& STATUS_INT_ENABLED
)) {
10503 /* IRQ is disabled */
10507 inta
= ipw_read32(priv
, IPW_INTA_RW
);
10508 inta_mask
= ipw_read32(priv
, IPW_INTA_MASK_R
);
10510 if (inta
== 0xFFFFFFFF) {
10511 /* Hardware disappeared */
10512 IPW_WARNING("IRQ INTA == 0xFFFFFFFF\n");
10516 if (!(inta
& (IPW_INTA_MASK_ALL
& inta_mask
))) {
10517 /* Shared interrupt */
10521 /* tell the device to stop sending interrupts */
10522 __ipw_disable_interrupts(priv
);
10524 /* ack current interrupts */
10525 inta
&= (IPW_INTA_MASK_ALL
& inta_mask
);
10526 ipw_write32(priv
, IPW_INTA_RW
, inta
);
10528 /* Cache INTA value for our tasklet */
10529 priv
->isr_inta
= inta
;
10531 tasklet_schedule(&priv
->irq_tasklet
);
10533 spin_unlock(&priv
->irq_lock
);
10535 return IRQ_HANDLED
;
10537 spin_unlock(&priv
->irq_lock
);
10541 static void ipw_rf_kill(void *adapter
)
10543 struct ipw_priv
*priv
= adapter
;
10544 unsigned long flags
;
10546 spin_lock_irqsave(&priv
->lock
, flags
);
10548 if (rf_kill_active(priv
)) {
10549 IPW_DEBUG_RF_KILL("RF Kill active, rescheduling GPIO check\n");
10550 schedule_delayed_work(&priv
->rf_kill
, 2 * HZ
);
10554 /* RF Kill is now disabled, so bring the device back up */
10556 if (!(priv
->status
& STATUS_RF_KILL_MASK
)) {
10557 IPW_DEBUG_RF_KILL("HW RF Kill no longer active, restarting "
10560 /* we can not do an adapter restart while inside an irq lock */
10561 schedule_work(&priv
->adapter_restart
);
10563 IPW_DEBUG_RF_KILL("HW RF Kill deactivated. SW RF Kill still "
10567 spin_unlock_irqrestore(&priv
->lock
, flags
);
10570 static void ipw_bg_rf_kill(struct work_struct
*work
)
10572 struct ipw_priv
*priv
=
10573 container_of(work
, struct ipw_priv
, rf_kill
.work
);
10574 mutex_lock(&priv
->mutex
);
10576 mutex_unlock(&priv
->mutex
);
10579 static void ipw_link_up(struct ipw_priv
*priv
)
10581 priv
->last_seq_num
= -1;
10582 priv
->last_frag_num
= -1;
10583 priv
->last_packet_time
= 0;
10585 netif_carrier_on(priv
->net_dev
);
10587 cancel_delayed_work(&priv
->request_scan
);
10588 cancel_delayed_work(&priv
->request_direct_scan
);
10589 cancel_delayed_work(&priv
->request_passive_scan
);
10590 cancel_delayed_work(&priv
->scan_event
);
10591 ipw_reset_stats(priv
);
10592 /* Ensure the rate is updated immediately */
10593 priv
->last_rate
= ipw_get_current_rate(priv
);
10594 ipw_gather_stats(priv
);
10595 ipw_led_link_up(priv
);
10596 notify_wx_assoc_event(priv
);
10598 if (priv
->config
& CFG_BACKGROUND_SCAN
)
10599 schedule_delayed_work(&priv
->request_scan
, HZ
);
10602 static void ipw_bg_link_up(struct work_struct
*work
)
10604 struct ipw_priv
*priv
=
10605 container_of(work
, struct ipw_priv
, link_up
);
10606 mutex_lock(&priv
->mutex
);
10608 mutex_unlock(&priv
->mutex
);
10611 static void ipw_link_down(struct ipw_priv
*priv
)
10613 ipw_led_link_down(priv
);
10614 netif_carrier_off(priv
->net_dev
);
10615 notify_wx_assoc_event(priv
);
10617 /* Cancel any queued work ... */
10618 cancel_delayed_work(&priv
->request_scan
);
10619 cancel_delayed_work(&priv
->request_direct_scan
);
10620 cancel_delayed_work(&priv
->request_passive_scan
);
10621 cancel_delayed_work(&priv
->adhoc_check
);
10622 cancel_delayed_work(&priv
->gather_stats
);
10624 ipw_reset_stats(priv
);
10626 if (!(priv
->status
& STATUS_EXIT_PENDING
)) {
10627 /* Queue up another scan... */
10628 schedule_delayed_work(&priv
->request_scan
, 0);
10630 cancel_delayed_work(&priv
->scan_event
);
10633 static void ipw_bg_link_down(struct work_struct
*work
)
10635 struct ipw_priv
*priv
=
10636 container_of(work
, struct ipw_priv
, link_down
);
10637 mutex_lock(&priv
->mutex
);
10638 ipw_link_down(priv
);
10639 mutex_unlock(&priv
->mutex
);
10642 static void ipw_setup_deferred_work(struct ipw_priv
*priv
)
10644 init_waitqueue_head(&priv
->wait_command_queue
);
10645 init_waitqueue_head(&priv
->wait_state
);
10647 INIT_DELAYED_WORK(&priv
->adhoc_check
, ipw_bg_adhoc_check
);
10648 INIT_WORK(&priv
->associate
, ipw_bg_associate
);
10649 INIT_WORK(&priv
->disassociate
, ipw_bg_disassociate
);
10650 INIT_WORK(&priv
->system_config
, ipw_system_config
);
10651 INIT_WORK(&priv
->rx_replenish
, ipw_bg_rx_queue_replenish
);
10652 INIT_WORK(&priv
->adapter_restart
, ipw_bg_adapter_restart
);
10653 INIT_DELAYED_WORK(&priv
->rf_kill
, ipw_bg_rf_kill
);
10654 INIT_WORK(&priv
->up
, ipw_bg_up
);
10655 INIT_WORK(&priv
->down
, ipw_bg_down
);
10656 INIT_DELAYED_WORK(&priv
->request_scan
, ipw_request_scan
);
10657 INIT_DELAYED_WORK(&priv
->request_direct_scan
, ipw_request_direct_scan
);
10658 INIT_DELAYED_WORK(&priv
->request_passive_scan
, ipw_request_passive_scan
);
10659 INIT_DELAYED_WORK(&priv
->scan_event
, ipw_scan_event
);
10660 INIT_DELAYED_WORK(&priv
->gather_stats
, ipw_bg_gather_stats
);
10661 INIT_WORK(&priv
->abort_scan
, ipw_bg_abort_scan
);
10662 INIT_WORK(&priv
->roam
, ipw_bg_roam
);
10663 INIT_DELAYED_WORK(&priv
->scan_check
, ipw_bg_scan_check
);
10664 INIT_WORK(&priv
->link_up
, ipw_bg_link_up
);
10665 INIT_WORK(&priv
->link_down
, ipw_bg_link_down
);
10666 INIT_DELAYED_WORK(&priv
->led_link_on
, ipw_bg_led_link_on
);
10667 INIT_DELAYED_WORK(&priv
->led_link_off
, ipw_bg_led_link_off
);
10668 INIT_DELAYED_WORK(&priv
->led_act_off
, ipw_bg_led_activity_off
);
10669 INIT_WORK(&priv
->merge_networks
, ipw_merge_adhoc_network
);
10671 #ifdef CONFIG_IPW2200_QOS
10672 INIT_WORK(&priv
->qos_activate
, ipw_bg_qos_activate
);
10673 #endif /* CONFIG_IPW2200_QOS */
10675 tasklet_setup(&priv
->irq_tasklet
, ipw_irq_tasklet
);
10678 static void shim__set_security(struct net_device
*dev
,
10679 struct libipw_security
*sec
)
10681 struct ipw_priv
*priv
= libipw_priv(dev
);
10683 for (i
= 0; i
< 4; i
++) {
10684 if (sec
->flags
& (1 << i
)) {
10685 priv
->ieee
->sec
.encode_alg
[i
] = sec
->encode_alg
[i
];
10686 priv
->ieee
->sec
.key_sizes
[i
] = sec
->key_sizes
[i
];
10687 if (sec
->key_sizes
[i
] == 0)
10688 priv
->ieee
->sec
.flags
&= ~(1 << i
);
10690 memcpy(priv
->ieee
->sec
.keys
[i
], sec
->keys
[i
],
10691 sec
->key_sizes
[i
]);
10692 priv
->ieee
->sec
.flags
|= (1 << i
);
10694 priv
->status
|= STATUS_SECURITY_UPDATED
;
10695 } else if (sec
->level
!= SEC_LEVEL_1
)
10696 priv
->ieee
->sec
.flags
&= ~(1 << i
);
10699 if (sec
->flags
& SEC_ACTIVE_KEY
) {
10700 priv
->ieee
->sec
.active_key
= sec
->active_key
;
10701 priv
->ieee
->sec
.flags
|= SEC_ACTIVE_KEY
;
10702 priv
->status
|= STATUS_SECURITY_UPDATED
;
10704 priv
->ieee
->sec
.flags
&= ~SEC_ACTIVE_KEY
;
10706 if ((sec
->flags
& SEC_AUTH_MODE
) &&
10707 (priv
->ieee
->sec
.auth_mode
!= sec
->auth_mode
)) {
10708 priv
->ieee
->sec
.auth_mode
= sec
->auth_mode
;
10709 priv
->ieee
->sec
.flags
|= SEC_AUTH_MODE
;
10710 if (sec
->auth_mode
== WLAN_AUTH_SHARED_KEY
)
10711 priv
->capability
|= CAP_SHARED_KEY
;
10713 priv
->capability
&= ~CAP_SHARED_KEY
;
10714 priv
->status
|= STATUS_SECURITY_UPDATED
;
10717 if (sec
->flags
& SEC_ENABLED
&& priv
->ieee
->sec
.enabled
!= sec
->enabled
) {
10718 priv
->ieee
->sec
.flags
|= SEC_ENABLED
;
10719 priv
->ieee
->sec
.enabled
= sec
->enabled
;
10720 priv
->status
|= STATUS_SECURITY_UPDATED
;
10722 priv
->capability
|= CAP_PRIVACY_ON
;
10724 priv
->capability
&= ~CAP_PRIVACY_ON
;
10727 if (sec
->flags
& SEC_ENCRYPT
)
10728 priv
->ieee
->sec
.encrypt
= sec
->encrypt
;
10730 if (sec
->flags
& SEC_LEVEL
&& priv
->ieee
->sec
.level
!= sec
->level
) {
10731 priv
->ieee
->sec
.level
= sec
->level
;
10732 priv
->ieee
->sec
.flags
|= SEC_LEVEL
;
10733 priv
->status
|= STATUS_SECURITY_UPDATED
;
10736 if (!priv
->ieee
->host_encrypt
&& (sec
->flags
& SEC_ENCRYPT
))
10737 ipw_set_hwcrypto_keys(priv
);
10739 /* To match current functionality of ipw2100 (which works well w/
10740 * various supplicants, we don't force a disassociate if the
10741 * privacy capability changes ... */
10743 if ((priv
->status
& (STATUS_ASSOCIATED
| STATUS_ASSOCIATING
)) &&
10744 (((priv
->assoc_request
.capability
&
10745 cpu_to_le16(WLAN_CAPABILITY_PRIVACY
)) && !sec
->enabled
) ||
10746 (!(priv
->assoc_request
.capability
&
10747 cpu_to_le16(WLAN_CAPABILITY_PRIVACY
)) && sec
->enabled
))) {
10748 IPW_DEBUG_ASSOC("Disassociating due to capability "
10750 ipw_disassociate(priv
);
10755 static int init_supported_rates(struct ipw_priv
*priv
,
10756 struct ipw_supported_rates
*rates
)
10758 /* TODO: Mask out rates based on priv->rates_mask */
10760 memset(rates
, 0, sizeof(*rates
));
10761 /* configure supported rates */
10762 switch (priv
->ieee
->freq_band
) {
10763 case LIBIPW_52GHZ_BAND
:
10764 rates
->ieee_mode
= IPW_A_MODE
;
10765 rates
->purpose
= IPW_RATE_CAPABILITIES
;
10766 ipw_add_ofdm_scan_rates(rates
, LIBIPW_CCK_MODULATION
,
10767 LIBIPW_OFDM_DEFAULT_RATES_MASK
);
10770 default: /* Mixed or 2.4Ghz */
10771 rates
->ieee_mode
= IPW_G_MODE
;
10772 rates
->purpose
= IPW_RATE_CAPABILITIES
;
10773 ipw_add_cck_scan_rates(rates
, LIBIPW_CCK_MODULATION
,
10774 LIBIPW_CCK_DEFAULT_RATES_MASK
);
10775 if (priv
->ieee
->modulation
& LIBIPW_OFDM_MODULATION
) {
10776 ipw_add_ofdm_scan_rates(rates
, LIBIPW_CCK_MODULATION
,
10777 LIBIPW_OFDM_DEFAULT_RATES_MASK
);
10785 static int ipw_config(struct ipw_priv
*priv
)
10787 /* This is only called from ipw_up, which resets/reloads the firmware
10788 so, we don't need to first disable the card before we configure
10790 if (ipw_set_tx_power(priv
))
10793 /* initialize adapter address */
10794 if (ipw_send_adapter_address(priv
, priv
->net_dev
->dev_addr
))
10797 /* set basic system config settings */
10798 init_sys_config(&priv
->sys_config
);
10800 /* Support Bluetooth if we have BT h/w on board, and user wants to.
10801 * Does not support BT priority yet (don't abort or defer our Tx) */
10803 unsigned char bt_caps
= priv
->eeprom
[EEPROM_SKU_CAPABILITY
];
10805 if (bt_caps
& EEPROM_SKU_CAP_BT_CHANNEL_SIG
)
10806 priv
->sys_config
.bt_coexistence
10807 |= CFG_BT_COEXISTENCE_SIGNAL_CHNL
;
10808 if (bt_caps
& EEPROM_SKU_CAP_BT_OOB
)
10809 priv
->sys_config
.bt_coexistence
10810 |= CFG_BT_COEXISTENCE_OOB
;
10813 #ifdef CONFIG_IPW2200_PROMISCUOUS
10814 if (priv
->prom_net_dev
&& netif_running(priv
->prom_net_dev
)) {
10815 priv
->sys_config
.accept_all_data_frames
= 1;
10816 priv
->sys_config
.accept_non_directed_frames
= 1;
10817 priv
->sys_config
.accept_all_mgmt_bcpr
= 1;
10818 priv
->sys_config
.accept_all_mgmt_frames
= 1;
10822 if (priv
->ieee
->iw_mode
== IW_MODE_ADHOC
)
10823 priv
->sys_config
.answer_broadcast_ssid_probe
= 1;
10825 priv
->sys_config
.answer_broadcast_ssid_probe
= 0;
10827 if (ipw_send_system_config(priv
))
10830 init_supported_rates(priv
, &priv
->rates
);
10831 if (ipw_send_supported_rates(priv
, &priv
->rates
))
10834 /* Set request-to-send threshold */
10835 if (priv
->rts_threshold
) {
10836 if (ipw_send_rts_threshold(priv
, priv
->rts_threshold
))
10839 #ifdef CONFIG_IPW2200_QOS
10840 IPW_DEBUG_QOS("QoS: call ipw_qos_activate\n");
10841 ipw_qos_activate(priv
, NULL
);
10842 #endif /* CONFIG_IPW2200_QOS */
10844 if (ipw_set_random_seed(priv
))
10847 /* final state transition to the RUN state */
10848 if (ipw_send_host_complete(priv
))
10851 priv
->status
|= STATUS_INIT
;
10853 ipw_led_init(priv
);
10854 ipw_led_radio_on(priv
);
10855 priv
->notif_missed_beacons
= 0;
10857 /* Set hardware WEP key if it is configured. */
10858 if ((priv
->capability
& CAP_PRIVACY_ON
) &&
10859 (priv
->ieee
->sec
.level
== SEC_LEVEL_1
) &&
10860 !(priv
->ieee
->host_encrypt
|| priv
->ieee
->host_decrypt
))
10861 ipw_set_hwcrypto_keys(priv
);
10872 * These tables have been tested in conjunction with the
10873 * Intel PRO/Wireless 2200BG and 2915ABG Network Connection Adapters.
10875 * Altering this values, using it on other hardware, or in geographies
10876 * not intended for resale of the above mentioned Intel adapters has
10879 * Remember to update the table in README.ipw2200 when changing this
10883 static const struct libipw_geo ipw_geos
[] = {
10887 .bg
= {{2412, 1}, {2417, 2}, {2422, 3},
10888 {2427, 4}, {2432, 5}, {2437, 6},
10889 {2442, 7}, {2447, 8}, {2452, 9},
10890 {2457, 10}, {2462, 11}},
10893 { /* Custom US/Canada */
10896 .bg
= {{2412, 1}, {2417, 2}, {2422, 3},
10897 {2427, 4}, {2432, 5}, {2437, 6},
10898 {2442, 7}, {2447, 8}, {2452, 9},
10899 {2457, 10}, {2462, 11}},
10905 {5260, 52, LIBIPW_CH_PASSIVE_ONLY
},
10906 {5280, 56, LIBIPW_CH_PASSIVE_ONLY
},
10907 {5300, 60, LIBIPW_CH_PASSIVE_ONLY
},
10908 {5320, 64, LIBIPW_CH_PASSIVE_ONLY
}},
10911 { /* Rest of World */
10914 .bg
= {{2412, 1}, {2417, 2}, {2422, 3},
10915 {2427, 4}, {2432, 5}, {2437, 6},
10916 {2442, 7}, {2447, 8}, {2452, 9},
10917 {2457, 10}, {2462, 11}, {2467, 12},
10921 { /* Custom USA & Europe & High */
10924 .bg
= {{2412, 1}, {2417, 2}, {2422, 3},
10925 {2427, 4}, {2432, 5}, {2437, 6},
10926 {2442, 7}, {2447, 8}, {2452, 9},
10927 {2457, 10}, {2462, 11}},
10933 {5260, 52, LIBIPW_CH_PASSIVE_ONLY
},
10934 {5280, 56, LIBIPW_CH_PASSIVE_ONLY
},
10935 {5300, 60, LIBIPW_CH_PASSIVE_ONLY
},
10936 {5320, 64, LIBIPW_CH_PASSIVE_ONLY
},
10944 { /* Custom NA & Europe */
10947 .bg
= {{2412, 1}, {2417, 2}, {2422, 3},
10948 {2427, 4}, {2432, 5}, {2437, 6},
10949 {2442, 7}, {2447, 8}, {2452, 9},
10950 {2457, 10}, {2462, 11}},
10956 {5260, 52, LIBIPW_CH_PASSIVE_ONLY
},
10957 {5280, 56, LIBIPW_CH_PASSIVE_ONLY
},
10958 {5300, 60, LIBIPW_CH_PASSIVE_ONLY
},
10959 {5320, 64, LIBIPW_CH_PASSIVE_ONLY
},
10960 {5745, 149, LIBIPW_CH_PASSIVE_ONLY
},
10961 {5765, 153, LIBIPW_CH_PASSIVE_ONLY
},
10962 {5785, 157, LIBIPW_CH_PASSIVE_ONLY
},
10963 {5805, 161, LIBIPW_CH_PASSIVE_ONLY
},
10964 {5825, 165, LIBIPW_CH_PASSIVE_ONLY
}},
10967 { /* Custom Japan */
10970 .bg
= {{2412, 1}, {2417, 2}, {2422, 3},
10971 {2427, 4}, {2432, 5}, {2437, 6},
10972 {2442, 7}, {2447, 8}, {2452, 9},
10973 {2457, 10}, {2462, 11}},
10975 .a
= {{5170, 34}, {5190, 38},
10976 {5210, 42}, {5230, 46}},
10982 .bg
= {{2412, 1}, {2417, 2}, {2422, 3},
10983 {2427, 4}, {2432, 5}, {2437, 6},
10984 {2442, 7}, {2447, 8}, {2452, 9},
10985 {2457, 10}, {2462, 11}},
10991 .bg
= {{2412, 1}, {2417, 2}, {2422, 3},
10992 {2427, 4}, {2432, 5}, {2437, 6},
10993 {2442, 7}, {2447, 8}, {2452, 9},
10994 {2457, 10}, {2462, 11}, {2467, 12},
11001 {5260, 52, LIBIPW_CH_PASSIVE_ONLY
},
11002 {5280, 56, LIBIPW_CH_PASSIVE_ONLY
},
11003 {5300, 60, LIBIPW_CH_PASSIVE_ONLY
},
11004 {5320, 64, LIBIPW_CH_PASSIVE_ONLY
},
11005 {5500, 100, LIBIPW_CH_PASSIVE_ONLY
},
11006 {5520, 104, LIBIPW_CH_PASSIVE_ONLY
},
11007 {5540, 108, LIBIPW_CH_PASSIVE_ONLY
},
11008 {5560, 112, LIBIPW_CH_PASSIVE_ONLY
},
11009 {5580, 116, LIBIPW_CH_PASSIVE_ONLY
},
11010 {5600, 120, LIBIPW_CH_PASSIVE_ONLY
},
11011 {5620, 124, LIBIPW_CH_PASSIVE_ONLY
},
11012 {5640, 128, LIBIPW_CH_PASSIVE_ONLY
},
11013 {5660, 132, LIBIPW_CH_PASSIVE_ONLY
},
11014 {5680, 136, LIBIPW_CH_PASSIVE_ONLY
},
11015 {5700, 140, LIBIPW_CH_PASSIVE_ONLY
}},
11018 { /* Custom Japan */
11021 .bg
= {{2412, 1}, {2417, 2}, {2422, 3},
11022 {2427, 4}, {2432, 5}, {2437, 6},
11023 {2442, 7}, {2447, 8}, {2452, 9},
11024 {2457, 10}, {2462, 11}, {2467, 12},
11025 {2472, 13}, {2484, 14, LIBIPW_CH_B_ONLY
}},
11027 .a
= {{5170, 34}, {5190, 38},
11028 {5210, 42}, {5230, 46}},
11031 { /* Rest of World */
11034 .bg
= {{2412, 1}, {2417, 2}, {2422, 3},
11035 {2427, 4}, {2432, 5}, {2437, 6},
11036 {2442, 7}, {2447, 8}, {2452, 9},
11037 {2457, 10}, {2462, 11}, {2467, 12},
11038 {2472, 13}, {2484, 14, LIBIPW_CH_B_ONLY
|
11039 LIBIPW_CH_PASSIVE_ONLY
}},
11045 .bg
= {{2412, 1}, {2417, 2}, {2422, 3},
11046 {2427, 4}, {2432, 5}, {2437, 6},
11047 {2442, 7}, {2447, 8}, {2452, 9},
11048 {2457, 10}, {2462, 11},
11049 {2467, 12, LIBIPW_CH_PASSIVE_ONLY
},
11050 {2472, 13, LIBIPW_CH_PASSIVE_ONLY
}},
11052 .a
= {{5745, 149}, {5765, 153},
11053 {5785, 157}, {5805, 161}},
11056 { /* Custom Europe */
11059 .bg
= {{2412, 1}, {2417, 2}, {2422, 3},
11060 {2427, 4}, {2432, 5}, {2437, 6},
11061 {2442, 7}, {2447, 8}, {2452, 9},
11062 {2457, 10}, {2462, 11},
11063 {2467, 12}, {2472, 13}},
11065 .a
= {{5180, 36}, {5200, 40},
11066 {5220, 44}, {5240, 48}},
11072 .bg
= {{2412, 1}, {2417, 2}, {2422, 3},
11073 {2427, 4}, {2432, 5}, {2437, 6},
11074 {2442, 7}, {2447, 8}, {2452, 9},
11075 {2457, 10}, {2462, 11},
11076 {2467, 12, LIBIPW_CH_PASSIVE_ONLY
},
11077 {2472, 13, LIBIPW_CH_PASSIVE_ONLY
}},
11079 .a
= {{5180, 36, LIBIPW_CH_PASSIVE_ONLY
},
11080 {5200, 40, LIBIPW_CH_PASSIVE_ONLY
},
11081 {5220, 44, LIBIPW_CH_PASSIVE_ONLY
},
11082 {5240, 48, LIBIPW_CH_PASSIVE_ONLY
},
11083 {5260, 52, LIBIPW_CH_PASSIVE_ONLY
},
11084 {5280, 56, LIBIPW_CH_PASSIVE_ONLY
},
11085 {5300, 60, LIBIPW_CH_PASSIVE_ONLY
},
11086 {5320, 64, LIBIPW_CH_PASSIVE_ONLY
},
11087 {5500, 100, LIBIPW_CH_PASSIVE_ONLY
},
11088 {5520, 104, LIBIPW_CH_PASSIVE_ONLY
},
11089 {5540, 108, LIBIPW_CH_PASSIVE_ONLY
},
11090 {5560, 112, LIBIPW_CH_PASSIVE_ONLY
},
11091 {5580, 116, LIBIPW_CH_PASSIVE_ONLY
},
11092 {5600, 120, LIBIPW_CH_PASSIVE_ONLY
},
11093 {5620, 124, LIBIPW_CH_PASSIVE_ONLY
},
11094 {5640, 128, LIBIPW_CH_PASSIVE_ONLY
},
11095 {5660, 132, LIBIPW_CH_PASSIVE_ONLY
},
11096 {5680, 136, LIBIPW_CH_PASSIVE_ONLY
},
11097 {5700, 140, LIBIPW_CH_PASSIVE_ONLY
},
11098 {5745, 149, LIBIPW_CH_PASSIVE_ONLY
},
11099 {5765, 153, LIBIPW_CH_PASSIVE_ONLY
},
11100 {5785, 157, LIBIPW_CH_PASSIVE_ONLY
},
11101 {5805, 161, LIBIPW_CH_PASSIVE_ONLY
},
11102 {5825, 165, LIBIPW_CH_PASSIVE_ONLY
}},
11108 .bg
= {{2412, 1}, {2417, 2}, {2422, 3},
11109 {2427, 4}, {2432, 5}, {2437, 6},
11110 {2442, 7}, {2447, 8}, {2452, 9},
11111 {2457, 10}, {2462, 11}},
11113 .a
= {{5180, 36, LIBIPW_CH_PASSIVE_ONLY
},
11114 {5200, 40, LIBIPW_CH_PASSIVE_ONLY
},
11115 {5220, 44, LIBIPW_CH_PASSIVE_ONLY
},
11116 {5240, 48, LIBIPW_CH_PASSIVE_ONLY
},
11117 {5260, 52, LIBIPW_CH_PASSIVE_ONLY
},
11118 {5280, 56, LIBIPW_CH_PASSIVE_ONLY
},
11119 {5300, 60, LIBIPW_CH_PASSIVE_ONLY
},
11120 {5320, 64, LIBIPW_CH_PASSIVE_ONLY
},
11121 {5745, 149, LIBIPW_CH_PASSIVE_ONLY
},
11122 {5765, 153, LIBIPW_CH_PASSIVE_ONLY
},
11123 {5785, 157, LIBIPW_CH_PASSIVE_ONLY
},
11124 {5805, 161, LIBIPW_CH_PASSIVE_ONLY
},
11125 {5825, 165, LIBIPW_CH_PASSIVE_ONLY
}},
11129 static void ipw_set_geo(struct ipw_priv
*priv
)
11133 for (j
= 0; j
< ARRAY_SIZE(ipw_geos
); j
++) {
11134 if (!memcmp(&priv
->eeprom
[EEPROM_COUNTRY_CODE
],
11135 ipw_geos
[j
].name
, 3))
11139 if (j
== ARRAY_SIZE(ipw_geos
)) {
11140 IPW_WARNING("SKU [%c%c%c] not recognized.\n",
11141 priv
->eeprom
[EEPROM_COUNTRY_CODE
+ 0],
11142 priv
->eeprom
[EEPROM_COUNTRY_CODE
+ 1],
11143 priv
->eeprom
[EEPROM_COUNTRY_CODE
+ 2]);
11147 libipw_set_geo(priv
->ieee
, &ipw_geos
[j
]);
11150 #define MAX_HW_RESTARTS 5
11151 static int ipw_up(struct ipw_priv
*priv
)
11155 /* Age scan list entries found before suspend */
11156 if (priv
->suspend_time
) {
11157 libipw_networks_age(priv
->ieee
, priv
->suspend_time
);
11158 priv
->suspend_time
= 0;
11161 if (priv
->status
& STATUS_EXIT_PENDING
)
11164 if (cmdlog
&& !priv
->cmdlog
) {
11165 priv
->cmdlog
= kcalloc(cmdlog
, sizeof(*priv
->cmdlog
),
11167 if (priv
->cmdlog
== NULL
) {
11168 IPW_ERROR("Error allocating %d command log entries.\n",
11172 priv
->cmdlog_len
= cmdlog
;
11176 for (i
= 0; i
< MAX_HW_RESTARTS
; i
++) {
11177 /* Load the microcode, firmware, and eeprom.
11178 * Also start the clocks. */
11179 rc
= ipw_load(priv
);
11181 IPW_ERROR("Unable to load firmware: %d\n", rc
);
11185 ipw_init_ordinals(priv
);
11186 if (!(priv
->config
& CFG_CUSTOM_MAC
))
11187 eeprom_parse_mac(priv
, priv
->mac_addr
);
11188 memcpy(priv
->net_dev
->dev_addr
, priv
->mac_addr
, ETH_ALEN
);
11192 if (priv
->status
& STATUS_RF_KILL_SW
) {
11193 IPW_WARNING("Radio disabled by module parameter.\n");
11195 } else if (rf_kill_active(priv
)) {
11196 IPW_WARNING("Radio Frequency Kill Switch is On:\n"
11197 "Kill switch must be turned off for "
11198 "wireless networking to work.\n");
11199 schedule_delayed_work(&priv
->rf_kill
, 2 * HZ
);
11203 rc
= ipw_config(priv
);
11205 IPW_DEBUG_INFO("Configured device on count %i\n", i
);
11207 /* If configure to try and auto-associate, kick
11209 schedule_delayed_work(&priv
->request_scan
, 0);
11214 IPW_DEBUG_INFO("Device configuration failed: 0x%08X\n", rc
);
11215 IPW_DEBUG_INFO("Failed to config device on retry %d of %d\n",
11216 i
, MAX_HW_RESTARTS
);
11218 /* We had an error bringing up the hardware, so take it
11219 * all the way back down so we can try again */
11223 /* tried to restart and config the device for as long as our
11224 * patience could withstand */
11225 IPW_ERROR("Unable to initialize device after %d attempts.\n", i
);
11230 static void ipw_bg_up(struct work_struct
*work
)
11232 struct ipw_priv
*priv
=
11233 container_of(work
, struct ipw_priv
, up
);
11234 mutex_lock(&priv
->mutex
);
11236 mutex_unlock(&priv
->mutex
);
11239 static void ipw_deinit(struct ipw_priv
*priv
)
11243 if (priv
->status
& STATUS_SCANNING
) {
11244 IPW_DEBUG_INFO("Aborting scan during shutdown.\n");
11245 ipw_abort_scan(priv
);
11248 if (priv
->status
& STATUS_ASSOCIATED
) {
11249 IPW_DEBUG_INFO("Disassociating during shutdown.\n");
11250 ipw_disassociate(priv
);
11253 ipw_led_shutdown(priv
);
11255 /* Wait up to 1s for status to change to not scanning and not
11256 * associated (disassociation can take a while for a ful 802.11
11258 for (i
= 1000; i
&& (priv
->status
&
11259 (STATUS_DISASSOCIATING
|
11260 STATUS_ASSOCIATED
| STATUS_SCANNING
)); i
--)
11263 if (priv
->status
& (STATUS_DISASSOCIATING
|
11264 STATUS_ASSOCIATED
| STATUS_SCANNING
))
11265 IPW_DEBUG_INFO("Still associated or scanning...\n");
11267 IPW_DEBUG_INFO("Took %dms to de-init\n", 1000 - i
);
11269 /* Attempt to disable the card */
11270 ipw_send_card_disable(priv
, 0);
11272 priv
->status
&= ~STATUS_INIT
;
11275 static void ipw_down(struct ipw_priv
*priv
)
11277 int exit_pending
= priv
->status
& STATUS_EXIT_PENDING
;
11279 priv
->status
|= STATUS_EXIT_PENDING
;
11281 if (ipw_is_init(priv
))
11284 /* Wipe out the EXIT_PENDING status bit if we are not actually
11285 * exiting the module */
11287 priv
->status
&= ~STATUS_EXIT_PENDING
;
11289 /* tell the device to stop sending interrupts */
11290 ipw_disable_interrupts(priv
);
11292 /* Clear all bits but the RF Kill */
11293 priv
->status
&= STATUS_RF_KILL_MASK
| STATUS_EXIT_PENDING
;
11294 netif_carrier_off(priv
->net_dev
);
11296 ipw_stop_nic(priv
);
11298 ipw_led_radio_off(priv
);
11301 static void ipw_bg_down(struct work_struct
*work
)
11303 struct ipw_priv
*priv
=
11304 container_of(work
, struct ipw_priv
, down
);
11305 mutex_lock(&priv
->mutex
);
11307 mutex_unlock(&priv
->mutex
);
11310 static int ipw_wdev_init(struct net_device
*dev
)
11313 struct ipw_priv
*priv
= libipw_priv(dev
);
11314 const struct libipw_geo
*geo
= libipw_get_geo(priv
->ieee
);
11315 struct wireless_dev
*wdev
= &priv
->ieee
->wdev
;
11317 memcpy(wdev
->wiphy
->perm_addr
, priv
->mac_addr
, ETH_ALEN
);
11319 /* fill-out priv->ieee->bg_band */
11320 if (geo
->bg_channels
) {
11321 struct ieee80211_supported_band
*bg_band
= &priv
->ieee
->bg_band
;
11323 bg_band
->band
= NL80211_BAND_2GHZ
;
11324 bg_band
->n_channels
= geo
->bg_channels
;
11325 bg_band
->channels
= kcalloc(geo
->bg_channels
,
11326 sizeof(struct ieee80211_channel
),
11328 if (!bg_band
->channels
) {
11332 /* translate geo->bg to bg_band.channels */
11333 for (i
= 0; i
< geo
->bg_channels
; i
++) {
11334 bg_band
->channels
[i
].band
= NL80211_BAND_2GHZ
;
11335 bg_band
->channels
[i
].center_freq
= geo
->bg
[i
].freq
;
11336 bg_band
->channels
[i
].hw_value
= geo
->bg
[i
].channel
;
11337 bg_band
->channels
[i
].max_power
= geo
->bg
[i
].max_power
;
11338 if (geo
->bg
[i
].flags
& LIBIPW_CH_PASSIVE_ONLY
)
11339 bg_band
->channels
[i
].flags
|=
11340 IEEE80211_CHAN_NO_IR
;
11341 if (geo
->bg
[i
].flags
& LIBIPW_CH_NO_IBSS
)
11342 bg_band
->channels
[i
].flags
|=
11343 IEEE80211_CHAN_NO_IR
;
11344 if (geo
->bg
[i
].flags
& LIBIPW_CH_RADAR_DETECT
)
11345 bg_band
->channels
[i
].flags
|=
11346 IEEE80211_CHAN_RADAR
;
11347 /* No equivalent for LIBIPW_CH_80211H_RULES,
11348 LIBIPW_CH_UNIFORM_SPREADING, or
11349 LIBIPW_CH_B_ONLY... */
11351 /* point at bitrate info */
11352 bg_band
->bitrates
= ipw2200_bg_rates
;
11353 bg_band
->n_bitrates
= ipw2200_num_bg_rates
;
11355 wdev
->wiphy
->bands
[NL80211_BAND_2GHZ
] = bg_band
;
11358 /* fill-out priv->ieee->a_band */
11359 if (geo
->a_channels
) {
11360 struct ieee80211_supported_band
*a_band
= &priv
->ieee
->a_band
;
11362 a_band
->band
= NL80211_BAND_5GHZ
;
11363 a_band
->n_channels
= geo
->a_channels
;
11364 a_band
->channels
= kcalloc(geo
->a_channels
,
11365 sizeof(struct ieee80211_channel
),
11367 if (!a_band
->channels
) {
11371 /* translate geo->a to a_band.channels */
11372 for (i
= 0; i
< geo
->a_channels
; i
++) {
11373 a_band
->channels
[i
].band
= NL80211_BAND_5GHZ
;
11374 a_band
->channels
[i
].center_freq
= geo
->a
[i
].freq
;
11375 a_band
->channels
[i
].hw_value
= geo
->a
[i
].channel
;
11376 a_band
->channels
[i
].max_power
= geo
->a
[i
].max_power
;
11377 if (geo
->a
[i
].flags
& LIBIPW_CH_PASSIVE_ONLY
)
11378 a_band
->channels
[i
].flags
|=
11379 IEEE80211_CHAN_NO_IR
;
11380 if (geo
->a
[i
].flags
& LIBIPW_CH_NO_IBSS
)
11381 a_band
->channels
[i
].flags
|=
11382 IEEE80211_CHAN_NO_IR
;
11383 if (geo
->a
[i
].flags
& LIBIPW_CH_RADAR_DETECT
)
11384 a_band
->channels
[i
].flags
|=
11385 IEEE80211_CHAN_RADAR
;
11386 /* No equivalent for LIBIPW_CH_80211H_RULES,
11387 LIBIPW_CH_UNIFORM_SPREADING, or
11388 LIBIPW_CH_B_ONLY... */
11390 /* point at bitrate info */
11391 a_band
->bitrates
= ipw2200_a_rates
;
11392 a_band
->n_bitrates
= ipw2200_num_a_rates
;
11394 wdev
->wiphy
->bands
[NL80211_BAND_5GHZ
] = a_band
;
11397 wdev
->wiphy
->cipher_suites
= ipw_cipher_suites
;
11398 wdev
->wiphy
->n_cipher_suites
= ARRAY_SIZE(ipw_cipher_suites
);
11400 set_wiphy_dev(wdev
->wiphy
, &priv
->pci_dev
->dev
);
11402 /* With that information in place, we can now register the wiphy... */
11403 if (wiphy_register(wdev
->wiphy
))
11409 /* PCI driver stuff */
11410 static const struct pci_device_id card_ids
[] = {
11411 {PCI_VENDOR_ID_INTEL
, 0x1043, 0x8086, 0x2701, 0, 0, 0},
11412 {PCI_VENDOR_ID_INTEL
, 0x1043, 0x8086, 0x2702, 0, 0, 0},
11413 {PCI_VENDOR_ID_INTEL
, 0x1043, 0x8086, 0x2711, 0, 0, 0},
11414 {PCI_VENDOR_ID_INTEL
, 0x1043, 0x8086, 0x2712, 0, 0, 0},
11415 {PCI_VENDOR_ID_INTEL
, 0x1043, 0x8086, 0x2721, 0, 0, 0},
11416 {PCI_VENDOR_ID_INTEL
, 0x1043, 0x8086, 0x2722, 0, 0, 0},
11417 {PCI_VENDOR_ID_INTEL
, 0x1043, 0x8086, 0x2731, 0, 0, 0},
11418 {PCI_VENDOR_ID_INTEL
, 0x1043, 0x8086, 0x2732, 0, 0, 0},
11419 {PCI_VENDOR_ID_INTEL
, 0x1043, 0x8086, 0x2741, 0, 0, 0},
11420 {PCI_VENDOR_ID_INTEL
, 0x1043, 0x103c, 0x2741, 0, 0, 0},
11421 {PCI_VENDOR_ID_INTEL
, 0x1043, 0x8086, 0x2742, 0, 0, 0},
11422 {PCI_VENDOR_ID_INTEL
, 0x1043, 0x8086, 0x2751, 0, 0, 0},
11423 {PCI_VENDOR_ID_INTEL
, 0x1043, 0x8086, 0x2752, 0, 0, 0},
11424 {PCI_VENDOR_ID_INTEL
, 0x1043, 0x8086, 0x2753, 0, 0, 0},
11425 {PCI_VENDOR_ID_INTEL
, 0x1043, 0x8086, 0x2754, 0, 0, 0},
11426 {PCI_VENDOR_ID_INTEL
, 0x1043, 0x8086, 0x2761, 0, 0, 0},
11427 {PCI_VENDOR_ID_INTEL
, 0x1043, 0x8086, 0x2762, 0, 0, 0},
11428 {PCI_VDEVICE(INTEL
, 0x104f), 0},
11429 {PCI_VDEVICE(INTEL
, 0x4220), 0}, /* BG */
11430 {PCI_VDEVICE(INTEL
, 0x4221), 0}, /* BG */
11431 {PCI_VDEVICE(INTEL
, 0x4223), 0}, /* ABG */
11432 {PCI_VDEVICE(INTEL
, 0x4224), 0}, /* ABG */
11434 /* required last entry */
11438 MODULE_DEVICE_TABLE(pci
, card_ids
);
11440 static struct attribute
*ipw_sysfs_entries
[] = {
11441 &dev_attr_rf_kill
.attr
,
11442 &dev_attr_direct_dword
.attr
,
11443 &dev_attr_indirect_byte
.attr
,
11444 &dev_attr_indirect_dword
.attr
,
11445 &dev_attr_mem_gpio_reg
.attr
,
11446 &dev_attr_command_event_reg
.attr
,
11447 &dev_attr_nic_type
.attr
,
11448 &dev_attr_status
.attr
,
11449 &dev_attr_cfg
.attr
,
11450 &dev_attr_error
.attr
,
11451 &dev_attr_event_log
.attr
,
11452 &dev_attr_cmd_log
.attr
,
11453 &dev_attr_eeprom_delay
.attr
,
11454 &dev_attr_ucode_version
.attr
,
11455 &dev_attr_rtc
.attr
,
11456 &dev_attr_scan_age
.attr
,
11457 &dev_attr_led
.attr
,
11458 &dev_attr_speed_scan
.attr
,
11459 &dev_attr_net_stats
.attr
,
11460 &dev_attr_channels
.attr
,
11461 #ifdef CONFIG_IPW2200_PROMISCUOUS
11462 &dev_attr_rtap_iface
.attr
,
11463 &dev_attr_rtap_filter
.attr
,
11468 static const struct attribute_group ipw_attribute_group
= {
11469 .name
= NULL
, /* put in device directory */
11470 .attrs
= ipw_sysfs_entries
,
11473 #ifdef CONFIG_IPW2200_PROMISCUOUS
11474 static int ipw_prom_open(struct net_device
*dev
)
11476 struct ipw_prom_priv
*prom_priv
= libipw_priv(dev
);
11477 struct ipw_priv
*priv
= prom_priv
->priv
;
11479 IPW_DEBUG_INFO("prom dev->open\n");
11480 netif_carrier_off(dev
);
11482 if (priv
->ieee
->iw_mode
!= IW_MODE_MONITOR
) {
11483 priv
->sys_config
.accept_all_data_frames
= 1;
11484 priv
->sys_config
.accept_non_directed_frames
= 1;
11485 priv
->sys_config
.accept_all_mgmt_bcpr
= 1;
11486 priv
->sys_config
.accept_all_mgmt_frames
= 1;
11488 ipw_send_system_config(priv
);
11494 static int ipw_prom_stop(struct net_device
*dev
)
11496 struct ipw_prom_priv
*prom_priv
= libipw_priv(dev
);
11497 struct ipw_priv
*priv
= prom_priv
->priv
;
11499 IPW_DEBUG_INFO("prom dev->stop\n");
11501 if (priv
->ieee
->iw_mode
!= IW_MODE_MONITOR
) {
11502 priv
->sys_config
.accept_all_data_frames
= 0;
11503 priv
->sys_config
.accept_non_directed_frames
= 0;
11504 priv
->sys_config
.accept_all_mgmt_bcpr
= 0;
11505 priv
->sys_config
.accept_all_mgmt_frames
= 0;
11507 ipw_send_system_config(priv
);
11513 static netdev_tx_t
ipw_prom_hard_start_xmit(struct sk_buff
*skb
,
11514 struct net_device
*dev
)
11516 IPW_DEBUG_INFO("prom dev->xmit\n");
11517 dev_kfree_skb(skb
);
11518 return NETDEV_TX_OK
;
11521 static const struct net_device_ops ipw_prom_netdev_ops
= {
11522 .ndo_open
= ipw_prom_open
,
11523 .ndo_stop
= ipw_prom_stop
,
11524 .ndo_start_xmit
= ipw_prom_hard_start_xmit
,
11525 .ndo_set_mac_address
= eth_mac_addr
,
11526 .ndo_validate_addr
= eth_validate_addr
,
11529 static int ipw_prom_alloc(struct ipw_priv
*priv
)
11533 if (priv
->prom_net_dev
)
11536 priv
->prom_net_dev
= alloc_libipw(sizeof(struct ipw_prom_priv
), 1);
11537 if (priv
->prom_net_dev
== NULL
)
11540 priv
->prom_priv
= libipw_priv(priv
->prom_net_dev
);
11541 priv
->prom_priv
->ieee
= netdev_priv(priv
->prom_net_dev
);
11542 priv
->prom_priv
->priv
= priv
;
11544 strcpy(priv
->prom_net_dev
->name
, "rtap%d");
11545 memcpy(priv
->prom_net_dev
->dev_addr
, priv
->mac_addr
, ETH_ALEN
);
11547 priv
->prom_net_dev
->type
= ARPHRD_IEEE80211_RADIOTAP
;
11548 priv
->prom_net_dev
->netdev_ops
= &ipw_prom_netdev_ops
;
11550 priv
->prom_net_dev
->min_mtu
= 68;
11551 priv
->prom_net_dev
->max_mtu
= LIBIPW_DATA_LEN
;
11553 priv
->prom_priv
->ieee
->iw_mode
= IW_MODE_MONITOR
;
11554 SET_NETDEV_DEV(priv
->prom_net_dev
, &priv
->pci_dev
->dev
);
11556 rc
= register_netdev(priv
->prom_net_dev
);
11558 free_libipw(priv
->prom_net_dev
, 1);
11559 priv
->prom_net_dev
= NULL
;
11566 static void ipw_prom_free(struct ipw_priv
*priv
)
11568 if (!priv
->prom_net_dev
)
11571 unregister_netdev(priv
->prom_net_dev
);
11572 free_libipw(priv
->prom_net_dev
, 1);
11574 priv
->prom_net_dev
= NULL
;
11579 static const struct net_device_ops ipw_netdev_ops
= {
11580 .ndo_open
= ipw_net_open
,
11581 .ndo_stop
= ipw_net_stop
,
11582 .ndo_set_rx_mode
= ipw_net_set_multicast_list
,
11583 .ndo_set_mac_address
= ipw_net_set_mac_address
,
11584 .ndo_start_xmit
= libipw_xmit
,
11585 .ndo_validate_addr
= eth_validate_addr
,
11588 static int ipw_pci_probe(struct pci_dev
*pdev
,
11589 const struct pci_device_id
*ent
)
11592 struct net_device
*net_dev
;
11593 void __iomem
*base
;
11595 struct ipw_priv
*priv
;
11598 net_dev
= alloc_libipw(sizeof(struct ipw_priv
), 0);
11599 if (net_dev
== NULL
) {
11604 priv
= libipw_priv(net_dev
);
11605 priv
->ieee
= netdev_priv(net_dev
);
11607 priv
->net_dev
= net_dev
;
11608 priv
->pci_dev
= pdev
;
11609 ipw_debug_level
= debug
;
11610 spin_lock_init(&priv
->irq_lock
);
11611 spin_lock_init(&priv
->lock
);
11612 for (i
= 0; i
< IPW_IBSS_MAC_HASH_SIZE
; i
++)
11613 INIT_LIST_HEAD(&priv
->ibss_mac_hash
[i
]);
11615 mutex_init(&priv
->mutex
);
11616 if (pci_enable_device(pdev
)) {
11618 goto out_free_libipw
;
11621 pci_set_master(pdev
);
11623 err
= dma_set_mask(&pdev
->dev
, DMA_BIT_MASK(32));
11625 err
= dma_set_coherent_mask(&pdev
->dev
, DMA_BIT_MASK(32));
11627 printk(KERN_WARNING DRV_NAME
": No suitable DMA available.\n");
11628 goto out_pci_disable_device
;
11631 pci_set_drvdata(pdev
, priv
);
11633 err
= pci_request_regions(pdev
, DRV_NAME
);
11635 goto out_pci_disable_device
;
11637 /* We disable the RETRY_TIMEOUT register (0x41) to keep
11638 * PCI Tx retries from interfering with C3 CPU state */
11639 pci_read_config_dword(pdev
, 0x40, &val
);
11640 if ((val
& 0x0000ff00) != 0)
11641 pci_write_config_dword(pdev
, 0x40, val
& 0xffff00ff);
11643 length
= pci_resource_len(pdev
, 0);
11644 priv
->hw_len
= length
;
11646 base
= pci_ioremap_bar(pdev
, 0);
11649 goto out_pci_release_regions
;
11652 priv
->hw_base
= base
;
11653 IPW_DEBUG_INFO("pci_resource_len = 0x%08x\n", length
);
11654 IPW_DEBUG_INFO("pci_resource_base = %p\n", base
);
11656 ipw_setup_deferred_work(priv
);
11658 ipw_sw_reset(priv
, 1);
11660 err
= request_irq(pdev
->irq
, ipw_isr
, IRQF_SHARED
, DRV_NAME
, priv
);
11662 IPW_ERROR("Error allocating IRQ %d\n", pdev
->irq
);
11666 SET_NETDEV_DEV(net_dev
, &pdev
->dev
);
11668 mutex_lock(&priv
->mutex
);
11670 priv
->ieee
->hard_start_xmit
= ipw_net_hard_start_xmit
;
11671 priv
->ieee
->set_security
= shim__set_security
;
11672 priv
->ieee
->is_queue_full
= ipw_net_is_queue_full
;
11674 #ifdef CONFIG_IPW2200_QOS
11675 priv
->ieee
->is_qos_active
= ipw_is_qos_active
;
11676 priv
->ieee
->handle_probe_response
= ipw_handle_beacon
;
11677 priv
->ieee
->handle_beacon
= ipw_handle_probe_response
;
11678 priv
->ieee
->handle_assoc_response
= ipw_handle_assoc_response
;
11679 #endif /* CONFIG_IPW2200_QOS */
11681 priv
->ieee
->perfect_rssi
= -20;
11682 priv
->ieee
->worst_rssi
= -85;
11684 net_dev
->netdev_ops
= &ipw_netdev_ops
;
11685 priv
->wireless_data
.spy_data
= &priv
->ieee
->spy_data
;
11686 net_dev
->wireless_data
= &priv
->wireless_data
;
11687 net_dev
->wireless_handlers
= &ipw_wx_handler_def
;
11688 net_dev
->ethtool_ops
= &ipw_ethtool_ops
;
11690 net_dev
->min_mtu
= 68;
11691 net_dev
->max_mtu
= LIBIPW_DATA_LEN
;
11693 err
= sysfs_create_group(&pdev
->dev
.kobj
, &ipw_attribute_group
);
11695 IPW_ERROR("failed to create sysfs device attributes\n");
11696 mutex_unlock(&priv
->mutex
);
11697 goto out_release_irq
;
11700 if (ipw_up(priv
)) {
11701 mutex_unlock(&priv
->mutex
);
11703 goto out_remove_sysfs
;
11706 mutex_unlock(&priv
->mutex
);
11708 err
= ipw_wdev_init(net_dev
);
11710 IPW_ERROR("failed to register wireless device\n");
11711 goto out_remove_sysfs
;
11714 err
= register_netdev(net_dev
);
11716 IPW_ERROR("failed to register network device\n");
11717 goto out_unregister_wiphy
;
11720 #ifdef CONFIG_IPW2200_PROMISCUOUS
11722 err
= ipw_prom_alloc(priv
);
11724 IPW_ERROR("Failed to register promiscuous network "
11725 "device (error %d).\n", err
);
11726 unregister_netdev(priv
->net_dev
);
11727 goto out_unregister_wiphy
;
11732 printk(KERN_INFO DRV_NAME
": Detected geography %s (%d 802.11bg "
11733 "channels, %d 802.11a channels)\n",
11734 priv
->ieee
->geo
.name
, priv
->ieee
->geo
.bg_channels
,
11735 priv
->ieee
->geo
.a_channels
);
11739 out_unregister_wiphy
:
11740 wiphy_unregister(priv
->ieee
->wdev
.wiphy
);
11741 kfree(priv
->ieee
->a_band
.channels
);
11742 kfree(priv
->ieee
->bg_band
.channels
);
11744 sysfs_remove_group(&pdev
->dev
.kobj
, &ipw_attribute_group
);
11746 free_irq(pdev
->irq
, priv
);
11748 iounmap(priv
->hw_base
);
11749 out_pci_release_regions
:
11750 pci_release_regions(pdev
);
11751 out_pci_disable_device
:
11752 pci_disable_device(pdev
);
11754 free_libipw(priv
->net_dev
, 0);
11759 static void ipw_pci_remove(struct pci_dev
*pdev
)
11761 struct ipw_priv
*priv
= pci_get_drvdata(pdev
);
11762 struct list_head
*p
, *q
;
11768 mutex_lock(&priv
->mutex
);
11770 priv
->status
|= STATUS_EXIT_PENDING
;
11772 sysfs_remove_group(&pdev
->dev
.kobj
, &ipw_attribute_group
);
11774 mutex_unlock(&priv
->mutex
);
11776 unregister_netdev(priv
->net_dev
);
11779 ipw_rx_queue_free(priv
, priv
->rxq
);
11782 ipw_tx_queue_free(priv
);
11784 if (priv
->cmdlog
) {
11785 kfree(priv
->cmdlog
);
11786 priv
->cmdlog
= NULL
;
11789 /* make sure all works are inactive */
11790 cancel_delayed_work_sync(&priv
->adhoc_check
);
11791 cancel_work_sync(&priv
->associate
);
11792 cancel_work_sync(&priv
->disassociate
);
11793 cancel_work_sync(&priv
->system_config
);
11794 cancel_work_sync(&priv
->rx_replenish
);
11795 cancel_work_sync(&priv
->adapter_restart
);
11796 cancel_delayed_work_sync(&priv
->rf_kill
);
11797 cancel_work_sync(&priv
->up
);
11798 cancel_work_sync(&priv
->down
);
11799 cancel_delayed_work_sync(&priv
->request_scan
);
11800 cancel_delayed_work_sync(&priv
->request_direct_scan
);
11801 cancel_delayed_work_sync(&priv
->request_passive_scan
);
11802 cancel_delayed_work_sync(&priv
->scan_event
);
11803 cancel_delayed_work_sync(&priv
->gather_stats
);
11804 cancel_work_sync(&priv
->abort_scan
);
11805 cancel_work_sync(&priv
->roam
);
11806 cancel_delayed_work_sync(&priv
->scan_check
);
11807 cancel_work_sync(&priv
->link_up
);
11808 cancel_work_sync(&priv
->link_down
);
11809 cancel_delayed_work_sync(&priv
->led_link_on
);
11810 cancel_delayed_work_sync(&priv
->led_link_off
);
11811 cancel_delayed_work_sync(&priv
->led_act_off
);
11812 cancel_work_sync(&priv
->merge_networks
);
11814 /* Free MAC hash list for ADHOC */
11815 for (i
= 0; i
< IPW_IBSS_MAC_HASH_SIZE
; i
++) {
11816 list_for_each_safe(p
, q
, &priv
->ibss_mac_hash
[i
]) {
11818 kfree(list_entry(p
, struct ipw_ibss_seq
, list
));
11822 kfree(priv
->error
);
11823 priv
->error
= NULL
;
11825 #ifdef CONFIG_IPW2200_PROMISCUOUS
11826 ipw_prom_free(priv
);
11829 free_irq(pdev
->irq
, priv
);
11830 iounmap(priv
->hw_base
);
11831 pci_release_regions(pdev
);
11832 pci_disable_device(pdev
);
11833 /* wiphy_unregister needs to be here, before free_libipw */
11834 wiphy_unregister(priv
->ieee
->wdev
.wiphy
);
11835 kfree(priv
->ieee
->a_band
.channels
);
11836 kfree(priv
->ieee
->bg_band
.channels
);
11837 free_libipw(priv
->net_dev
, 0);
11841 static int __maybe_unused
ipw_pci_suspend(struct device
*dev_d
)
11843 struct ipw_priv
*priv
= dev_get_drvdata(dev_d
);
11844 struct net_device
*dev
= priv
->net_dev
;
11846 printk(KERN_INFO
"%s: Going into suspend...\n", dev
->name
);
11848 /* Take down the device; powers it off, etc. */
11851 /* Remove the PRESENT state of the device */
11852 netif_device_detach(dev
);
11854 priv
->suspend_at
= ktime_get_boottime_seconds();
11859 static int __maybe_unused
ipw_pci_resume(struct device
*dev_d
)
11861 struct pci_dev
*pdev
= to_pci_dev(dev_d
);
11862 struct ipw_priv
*priv
= pci_get_drvdata(pdev
);
11863 struct net_device
*dev
= priv
->net_dev
;
11866 printk(KERN_INFO
"%s: Coming out of suspend...\n", dev
->name
);
11869 * Suspend/Resume resets the PCI configuration space, so we have to
11870 * re-disable the RETRY_TIMEOUT register (0x41) to keep PCI Tx retries
11871 * from interfering with C3 CPU state. pci_restore_state won't help
11872 * here since it only restores the first 64 bytes pci config header.
11874 pci_read_config_dword(pdev
, 0x40, &val
);
11875 if ((val
& 0x0000ff00) != 0)
11876 pci_write_config_dword(pdev
, 0x40, val
& 0xffff00ff);
11878 /* Set the device back into the PRESENT state; this will also wake
11879 * the queue of needed */
11880 netif_device_attach(dev
);
11882 priv
->suspend_time
= ktime_get_boottime_seconds() - priv
->suspend_at
;
11884 /* Bring the device back up */
11885 schedule_work(&priv
->up
);
11890 static void ipw_pci_shutdown(struct pci_dev
*pdev
)
11892 struct ipw_priv
*priv
= pci_get_drvdata(pdev
);
11894 /* Take down the device; powers it off, etc. */
11897 pci_disable_device(pdev
);
11900 static SIMPLE_DEV_PM_OPS(ipw_pci_pm_ops
, ipw_pci_suspend
, ipw_pci_resume
);
11902 /* driver initialization stuff */
11903 static struct pci_driver ipw_driver
= {
11905 .id_table
= card_ids
,
11906 .probe
= ipw_pci_probe
,
11907 .remove
= ipw_pci_remove
,
11908 .driver
.pm
= &ipw_pci_pm_ops
,
11909 .shutdown
= ipw_pci_shutdown
,
11912 static int __init
ipw_init(void)
11916 printk(KERN_INFO DRV_NAME
": " DRV_DESCRIPTION
", " DRV_VERSION
"\n");
11917 printk(KERN_INFO DRV_NAME
": " DRV_COPYRIGHT
"\n");
11919 ret
= pci_register_driver(&ipw_driver
);
11921 IPW_ERROR("Unable to initialize PCI module\n");
11925 ret
= driver_create_file(&ipw_driver
.driver
, &driver_attr_debug_level
);
11927 IPW_ERROR("Unable to create driver sysfs file\n");
11928 pci_unregister_driver(&ipw_driver
);
11935 static void __exit
ipw_exit(void)
11937 driver_remove_file(&ipw_driver
.driver
, &driver_attr_debug_level
);
11938 pci_unregister_driver(&ipw_driver
);
11941 module_param(disable
, int, 0444);
11942 MODULE_PARM_DESC(disable
, "manually disable the radio (default 0 [radio on])");
11944 module_param(associate
, int, 0444);
11945 MODULE_PARM_DESC(associate
, "auto associate when scanning (default off)");
11947 module_param(auto_create
, int, 0444);
11948 MODULE_PARM_DESC(auto_create
, "auto create adhoc network (default on)");
11950 module_param_named(led
, led_support
, int, 0444);
11951 MODULE_PARM_DESC(led
, "enable led control on some systems (default 1 on)");
11953 module_param(debug
, int, 0444);
11954 MODULE_PARM_DESC(debug
, "debug output mask");
11956 module_param_named(channel
, default_channel
, int, 0444);
11957 MODULE_PARM_DESC(channel
, "channel to limit associate to (default 0 [ANY])");
11959 #ifdef CONFIG_IPW2200_PROMISCUOUS
11960 module_param(rtap_iface
, int, 0444);
11961 MODULE_PARM_DESC(rtap_iface
, "create the rtap interface (1 - create, default 0)");
11964 #ifdef CONFIG_IPW2200_QOS
11965 module_param(qos_enable
, int, 0444);
11966 MODULE_PARM_DESC(qos_enable
, "enable all QoS functionalities");
11968 module_param(qos_burst_enable
, int, 0444);
11969 MODULE_PARM_DESC(qos_burst_enable
, "enable QoS burst mode");
11971 module_param(qos_no_ack_mask
, int, 0444);
11972 MODULE_PARM_DESC(qos_no_ack_mask
, "mask Tx_Queue to no ack");
11974 module_param(burst_duration_CCK
, int, 0444);
11975 MODULE_PARM_DESC(burst_duration_CCK
, "set CCK burst value");
11977 module_param(burst_duration_OFDM
, int, 0444);
11978 MODULE_PARM_DESC(burst_duration_OFDM
, "set OFDM burst value");
11979 #endif /* CONFIG_IPW2200_QOS */
11981 #ifdef CONFIG_IPW2200_MONITOR
11982 module_param_named(mode
, network_mode
, int, 0444);
11983 MODULE_PARM_DESC(mode
, "network mode (0=BSS,1=IBSS,2=Monitor)");
11985 module_param_named(mode
, network_mode
, int, 0444);
11986 MODULE_PARM_DESC(mode
, "network mode (0=BSS,1=IBSS)");
11989 module_param(bt_coexist
, int, 0444);
11990 MODULE_PARM_DESC(bt_coexist
, "enable bluetooth coexistence (default off)");
11992 module_param(hwcrypto
, int, 0444);
11993 MODULE_PARM_DESC(hwcrypto
, "enable hardware crypto (default off)");
11995 module_param(cmdlog
, int, 0444);
11996 MODULE_PARM_DESC(cmdlog
,
11997 "allocate a ring buffer for logging firmware commands");
11999 module_param(roaming
, int, 0444);
12000 MODULE_PARM_DESC(roaming
, "enable roaming support (default on)");
12002 module_param(antenna
, int, 0444);
12003 MODULE_PARM_DESC(antenna
, "select antenna 1=Main, 3=Aux, default 0 [both], 2=slow_diversity (choose the one with lower background noise)");
12005 module_exit(ipw_exit
);
12006 module_init(ipw_init
);