1 /******************************************************************************
3 Copyright(c) 2003 - 2005 Intel Corporation. All rights reserved.
5 802.11 status code portion of this file from ethereal-0.10.6:
6 Copyright 2000, Axis Communications AB
7 Ethereal - Network traffic analyzer
8 By Gerald Combs <gerald@ethereal.com>
9 Copyright 1998 Gerald Combs
11 This program is free software; you can redistribute it and/or modify it
12 under the terms of version 2 of the GNU General Public License as
13 published by the Free Software Foundation.
15 This program is distributed in the hope that it will be useful, but WITHOUT
16 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
17 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
20 You should have received a copy of the GNU General Public License along with
21 this program; if not, write to the Free Software Foundation, Inc., 59
22 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24 The full GNU General Public License is included in this distribution in the
28 James P. Ketrenos <ipw2100-admin@linux.intel.com>
29 Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
31 ******************************************************************************/
35 #define IPW2200_VERSION "1.0.5"
36 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2200/2915 Network Driver"
37 #define DRV_COPYRIGHT "Copyright(c) 2003-2005 Intel Corporation"
38 #define DRV_VERSION IPW2200_VERSION
40 #define ETH_P_80211_STATS (ETH_P_80211_RAW + 1)
42 MODULE_DESCRIPTION(DRV_DESCRIPTION);
43 MODULE_VERSION(DRV_VERSION);
44 MODULE_AUTHOR(DRV_COPYRIGHT);
45 MODULE_LICENSE("GPL");
47 static int cmdlog = 0;
49 static int channel = 0;
52 static u32 ipw_debug_level;
53 static int associate = 1;
54 static int auto_create = 1;
56 static int disable = 0;
57 static int hwcrypto = 1;
58 static const char ipw_modes[] = {
63 static int qos_enable = 0;
64 static int qos_burst_enable = 0;
65 static int qos_no_ack_mask = 0;
66 static int burst_duration_CCK = 0;
67 static int burst_duration_OFDM = 0;
69 static struct ieee80211_qos_parameters def_qos_parameters_OFDM = {
70 {QOS_TX0_CW_MIN_OFDM, QOS_TX1_CW_MIN_OFDM, QOS_TX2_CW_MIN_OFDM,
72 {QOS_TX0_CW_MAX_OFDM, QOS_TX1_CW_MAX_OFDM, QOS_TX2_CW_MAX_OFDM,
74 {QOS_TX0_AIFS, QOS_TX1_AIFS, QOS_TX2_AIFS, QOS_TX3_AIFS},
75 {QOS_TX0_ACM, QOS_TX1_ACM, QOS_TX2_ACM, QOS_TX3_ACM},
76 {QOS_TX0_TXOP_LIMIT_OFDM, QOS_TX1_TXOP_LIMIT_OFDM,
77 QOS_TX2_TXOP_LIMIT_OFDM, QOS_TX3_TXOP_LIMIT_OFDM}
80 static struct ieee80211_qos_parameters def_qos_parameters_CCK = {
81 {QOS_TX0_CW_MIN_CCK, QOS_TX1_CW_MIN_CCK, QOS_TX2_CW_MIN_CCK,
83 {QOS_TX0_CW_MAX_CCK, QOS_TX1_CW_MAX_CCK, QOS_TX2_CW_MAX_CCK,
85 {QOS_TX0_AIFS, QOS_TX1_AIFS, QOS_TX2_AIFS, QOS_TX3_AIFS},
86 {QOS_TX0_ACM, QOS_TX1_ACM, QOS_TX2_ACM, QOS_TX3_ACM},
87 {QOS_TX0_TXOP_LIMIT_CCK, QOS_TX1_TXOP_LIMIT_CCK, QOS_TX2_TXOP_LIMIT_CCK,
88 QOS_TX3_TXOP_LIMIT_CCK}
91 static struct ieee80211_qos_parameters def_parameters_OFDM = {
92 {DEF_TX0_CW_MIN_OFDM, DEF_TX1_CW_MIN_OFDM, DEF_TX2_CW_MIN_OFDM,
94 {DEF_TX0_CW_MAX_OFDM, DEF_TX1_CW_MAX_OFDM, DEF_TX2_CW_MAX_OFDM,
96 {DEF_TX0_AIFS, DEF_TX1_AIFS, DEF_TX2_AIFS, DEF_TX3_AIFS},
97 {DEF_TX0_ACM, DEF_TX1_ACM, DEF_TX2_ACM, DEF_TX3_ACM},
98 {DEF_TX0_TXOP_LIMIT_OFDM, DEF_TX1_TXOP_LIMIT_OFDM,
99 DEF_TX2_TXOP_LIMIT_OFDM, DEF_TX3_TXOP_LIMIT_OFDM}
102 static struct ieee80211_qos_parameters def_parameters_CCK = {
103 {DEF_TX0_CW_MIN_CCK, DEF_TX1_CW_MIN_CCK, DEF_TX2_CW_MIN_CCK,
105 {DEF_TX0_CW_MAX_CCK, DEF_TX1_CW_MAX_CCK, DEF_TX2_CW_MAX_CCK,
107 {DEF_TX0_AIFS, DEF_TX1_AIFS, DEF_TX2_AIFS, DEF_TX3_AIFS},
108 {DEF_TX0_ACM, DEF_TX1_ACM, DEF_TX2_ACM, DEF_TX3_ACM},
109 {DEF_TX0_TXOP_LIMIT_CCK, DEF_TX1_TXOP_LIMIT_CCK, DEF_TX2_TXOP_LIMIT_CCK,
110 DEF_TX3_TXOP_LIMIT_CCK}
113 static u8 qos_oui[QOS_OUI_LEN] = { 0x00, 0x50, 0xF2 };
115 static int from_priority_to_tx_queue[] = {
116 IPW_TX_QUEUE_1, IPW_TX_QUEUE_2, IPW_TX_QUEUE_2, IPW_TX_QUEUE_1,
117 IPW_TX_QUEUE_3, IPW_TX_QUEUE_3, IPW_TX_QUEUE_4, IPW_TX_QUEUE_4
120 static u32 ipw_qos_get_burst_duration(struct ipw_priv *priv);
122 static int ipw_send_qos_params_command(struct ipw_priv *priv, struct ieee80211_qos_parameters
124 static int ipw_send_qos_info_command(struct ipw_priv *priv, struct ieee80211_qos_information_element
126 #endif /* CONFIG_IPW_QOS */
128 static void ipw_remove_current_network(struct ipw_priv *priv);
129 static void ipw_rx(struct ipw_priv *priv);
130 static int ipw_queue_tx_reclaim(struct ipw_priv *priv,
131 struct clx2_tx_queue *txq, int qindex);
132 static int ipw_queue_reset(struct ipw_priv *priv);
134 static int ipw_queue_tx_hcmd(struct ipw_priv *priv, int hcmd, void *buf,
137 static void ipw_tx_queue_free(struct ipw_priv *);
139 static struct ipw_rx_queue *ipw_rx_queue_alloc(struct ipw_priv *);
140 static void ipw_rx_queue_free(struct ipw_priv *, struct ipw_rx_queue *);
141 static void ipw_rx_queue_replenish(void *);
142 static int ipw_up(struct ipw_priv *);
143 static void ipw_bg_up(void *);
144 static void ipw_down(struct ipw_priv *);
145 static void ipw_bg_down(void *);
146 static int ipw_config(struct ipw_priv *);
147 static int init_supported_rates(struct ipw_priv *priv,
148 struct ipw_supported_rates *prates);
149 static void ipw_set_hwcrypto_keys(struct ipw_priv *);
150 static void ipw_send_wep_keys(struct ipw_priv *, int);
152 static int ipw_is_valid_channel(struct ieee80211_device *, u8);
153 static int ipw_channel_to_index(struct ieee80211_device *, u8);
154 static u8 ipw_freq_to_channel(struct ieee80211_device *, u32);
155 static int ipw_set_geo(struct ieee80211_device *, const struct ieee80211_geo *);
156 static const struct ieee80211_geo *ipw_get_geo(struct ieee80211_device *);
158 static int snprint_line(char *buf, size_t count,
159 const u8 * data, u32 len, u32 ofs)
164 out = snprintf(buf, count, "%08X", ofs);
166 for (l = 0, i = 0; i < 2; i++) {
167 out += snprintf(buf + out, count - out, " ");
168 for (j = 0; j < 8 && l < len; j++, l++)
169 out += snprintf(buf + out, count - out, "%02X ",
172 out += snprintf(buf + out, count - out, " ");
175 out += snprintf(buf + out, count - out, " ");
176 for (l = 0, i = 0; i < 2; i++) {
177 out += snprintf(buf + out, count - out, " ");
178 for (j = 0; j < 8 && l < len; j++, l++) {
179 c = data[(i * 8 + j)];
180 if (!isascii(c) || !isprint(c))
183 out += snprintf(buf + out, count - out, "%c", c);
187 out += snprintf(buf + out, count - out, " ");
193 static void printk_buf(int level, const u8 * data, u32 len)
197 if (!(ipw_debug_level & level))
201 snprint_line(line, sizeof(line), &data[ofs],
203 printk(KERN_DEBUG "%s\n", line);
205 len -= min(len, 16U);
209 static int snprintk_buf(u8 * output, size_t size, const u8 * data, size_t len)
215 while (size && len) {
216 out = snprint_line(output, size, &data[ofs],
217 min_t(size_t, len, 16U), ofs);
222 len -= min_t(size_t, len, 16U);
228 static u32 _ipw_read_reg32(struct ipw_priv *priv, u32 reg);
229 #define ipw_read_reg32(a, b) _ipw_read_reg32(a, b)
231 static u8 _ipw_read_reg8(struct ipw_priv *ipw, u32 reg);
232 #define ipw_read_reg8(a, b) _ipw_read_reg8(a, b)
234 static void _ipw_write_reg8(struct ipw_priv *priv, u32 reg, u8 value);
235 static inline void ipw_write_reg8(struct ipw_priv *a, u32 b, u8 c)
237 IPW_DEBUG_IO("%s %d: write_indirect8(0x%08X, 0x%08X)\n", __FILE__,
238 __LINE__, (u32) (b), (u32) (c));
239 _ipw_write_reg8(a, b, c);
242 static void _ipw_write_reg16(struct ipw_priv *priv, u32 reg, u16 value);
243 static inline void ipw_write_reg16(struct ipw_priv *a, u32 b, u16 c)
245 IPW_DEBUG_IO("%s %d: write_indirect16(0x%08X, 0x%08X)\n", __FILE__,
246 __LINE__, (u32) (b), (u32) (c));
247 _ipw_write_reg16(a, b, c);
250 static void _ipw_write_reg32(struct ipw_priv *priv, u32 reg, u32 value);
251 static inline void ipw_write_reg32(struct ipw_priv *a, u32 b, u32 c)
253 IPW_DEBUG_IO("%s %d: write_indirect32(0x%08X, 0x%08X)\n", __FILE__,
254 __LINE__, (u32) (b), (u32) (c));
255 _ipw_write_reg32(a, b, c);
258 #define _ipw_write8(ipw, ofs, val) writeb((val), (ipw)->hw_base + (ofs))
259 #define ipw_write8(ipw, ofs, val) \
260 IPW_DEBUG_IO("%s %d: write_direct8(0x%08X, 0x%08X)\n", __FILE__, __LINE__, (u32)(ofs), (u32)(val)); \
261 _ipw_write8(ipw, ofs, val)
263 #define _ipw_write16(ipw, ofs, val) writew((val), (ipw)->hw_base + (ofs))
264 #define ipw_write16(ipw, ofs, val) \
265 IPW_DEBUG_IO("%s %d: write_direct16(0x%08X, 0x%08X)\n", __FILE__, __LINE__, (u32)(ofs), (u32)(val)); \
266 _ipw_write16(ipw, ofs, val)
268 #define _ipw_write32(ipw, ofs, val) writel((val), (ipw)->hw_base + (ofs))
269 #define ipw_write32(ipw, ofs, val) \
270 IPW_DEBUG_IO("%s %d: write_direct32(0x%08X, 0x%08X)\n", __FILE__, __LINE__, (u32)(ofs), (u32)(val)); \
271 _ipw_write32(ipw, ofs, val)
273 #define _ipw_read8(ipw, ofs) readb((ipw)->hw_base + (ofs))
274 static inline u8 __ipw_read8(char *f, u32 l, struct ipw_priv *ipw, u32 ofs)
276 IPW_DEBUG_IO("%s %d: read_direct8(0x%08X)\n", f, l, (u32) (ofs));
277 return _ipw_read8(ipw, ofs);
280 #define ipw_read8(ipw, ofs) __ipw_read8(__FILE__, __LINE__, ipw, ofs)
282 #define _ipw_read16(ipw, ofs) readw((ipw)->hw_base + (ofs))
283 static inline u16 __ipw_read16(char *f, u32 l, struct ipw_priv *ipw, u32 ofs)
285 IPW_DEBUG_IO("%s %d: read_direct16(0x%08X)\n", f, l, (u32) (ofs));
286 return _ipw_read16(ipw, ofs);
289 #define ipw_read16(ipw, ofs) __ipw_read16(__FILE__, __LINE__, ipw, ofs)
291 #define _ipw_read32(ipw, ofs) readl((ipw)->hw_base + (ofs))
292 static inline u32 __ipw_read32(char *f, u32 l, struct ipw_priv *ipw, u32 ofs)
294 IPW_DEBUG_IO("%s %d: read_direct32(0x%08X)\n", f, l, (u32) (ofs));
295 return _ipw_read32(ipw, ofs);
298 #define ipw_read32(ipw, ofs) __ipw_read32(__FILE__, __LINE__, ipw, ofs)
300 static void _ipw_read_indirect(struct ipw_priv *, u32, u8 *, int);
301 static inline void __ipw_read_indirect(const char *f, int l,
302 struct ipw_priv *a, u32 b, u8 * c, int d)
304 IPW_DEBUG_IO("%s %d: read_indirect(0x%08X) %d bytes\n", f, l, (u32) (b),
306 _ipw_read_indirect(a, b, c, d);
309 #define ipw_read_indirect(a, b, c, d) __ipw_read_indirect(__FILE__, __LINE__, a, b, c, d)
311 static void _ipw_write_indirect(struct ipw_priv *priv, u32 addr, u8 * data,
313 #define ipw_write_indirect(a, b, c, d) \
314 IPW_DEBUG_IO("%s %d: write_indirect(0x%08X) %d bytes\n", __FILE__, __LINE__, (u32)(b), d); \
315 _ipw_write_indirect(a, b, c, d)
317 /* indirect write s */
318 static void _ipw_write_reg32(struct ipw_priv *priv, u32 reg, u32 value)
320 IPW_DEBUG_IO(" %p : reg = 0x%8X : value = 0x%8X\n", priv, reg, value);
321 _ipw_write32(priv, IPW_INDIRECT_ADDR, reg);
322 _ipw_write32(priv, IPW_INDIRECT_DATA, value);
325 static void _ipw_write_reg8(struct ipw_priv *priv, u32 reg, u8 value)
327 IPW_DEBUG_IO(" reg = 0x%8X : value = 0x%8X\n", reg, value);
328 _ipw_write32(priv, IPW_INDIRECT_ADDR, reg & IPW_INDIRECT_ADDR_MASK);
329 _ipw_write8(priv, IPW_INDIRECT_DATA, value);
332 static void _ipw_write_reg16(struct ipw_priv *priv, u32 reg, u16 value)
334 IPW_DEBUG_IO(" reg = 0x%8X : value = 0x%8X\n", reg, value);
335 _ipw_write32(priv, IPW_INDIRECT_ADDR, reg & IPW_INDIRECT_ADDR_MASK);
336 _ipw_write16(priv, IPW_INDIRECT_DATA, value);
339 /* indirect read s */
341 static u8 _ipw_read_reg8(struct ipw_priv *priv, u32 reg)
344 _ipw_write32(priv, IPW_INDIRECT_ADDR, reg & IPW_INDIRECT_ADDR_MASK);
345 IPW_DEBUG_IO(" reg = 0x%8X : \n", reg);
346 word = _ipw_read32(priv, IPW_INDIRECT_DATA);
347 return (word >> ((reg & 0x3) * 8)) & 0xff;
350 static u32 _ipw_read_reg32(struct ipw_priv *priv, u32 reg)
354 IPW_DEBUG_IO("%p : reg = 0x%08x\n", priv, reg);
356 _ipw_write32(priv, IPW_INDIRECT_ADDR, reg);
357 value = _ipw_read32(priv, IPW_INDIRECT_DATA);
358 IPW_DEBUG_IO(" reg = 0x%4X : value = 0x%4x \n", reg, value);
362 /* iterative/auto-increment 32 bit reads and writes */
363 static void _ipw_read_indirect(struct ipw_priv *priv, u32 addr, u8 * buf,
366 u32 aligned_addr = addr & IPW_INDIRECT_ADDR_MASK;
367 u32 dif_len = addr - aligned_addr;
370 IPW_DEBUG_IO("addr = %i, buf = %p, num = %i\n", addr, buf, num);
376 /* Read the first nibble byte by byte */
377 if (unlikely(dif_len)) {
378 _ipw_write32(priv, IPW_INDIRECT_ADDR, aligned_addr);
379 /* Start reading at aligned_addr + dif_len */
380 for (i = dif_len; ((i < 4) && (num > 0)); i++, num--)
381 *buf++ = _ipw_read8(priv, IPW_INDIRECT_DATA + i);
385 _ipw_write32(priv, IPW_AUTOINC_ADDR, aligned_addr);
386 for (; num >= 4; buf += 4, aligned_addr += 4, num -= 4)
387 *(u32 *) buf = _ipw_read32(priv, IPW_AUTOINC_DATA);
389 /* Copy the last nibble */
391 _ipw_write32(priv, IPW_INDIRECT_ADDR, aligned_addr);
392 for (i = 0; num > 0; i++, num--)
393 *buf++ = ipw_read8(priv, IPW_INDIRECT_DATA + i);
397 static void _ipw_write_indirect(struct ipw_priv *priv, u32 addr, u8 * buf,
400 u32 aligned_addr = addr & IPW_INDIRECT_ADDR_MASK;
401 u32 dif_len = addr - aligned_addr;
404 IPW_DEBUG_IO("addr = %i, buf = %p, num = %i\n", addr, buf, num);
410 /* Write the first nibble byte by byte */
411 if (unlikely(dif_len)) {
412 _ipw_write32(priv, IPW_INDIRECT_ADDR, aligned_addr);
413 /* Start reading at aligned_addr + dif_len */
414 for (i = dif_len; ((i < 4) && (num > 0)); i++, num--, buf++)
415 _ipw_write8(priv, IPW_INDIRECT_DATA + i, *buf);
419 _ipw_write32(priv, IPW_AUTOINC_ADDR, aligned_addr);
420 for (; num >= 4; buf += 4, aligned_addr += 4, num -= 4)
421 _ipw_write32(priv, IPW_AUTOINC_DATA, *(u32 *) buf);
423 /* Copy the last nibble */
425 _ipw_write32(priv, IPW_INDIRECT_ADDR, aligned_addr);
426 for (i = 0; num > 0; i++, num--, buf++)
427 _ipw_write8(priv, IPW_INDIRECT_DATA + i, *buf);
431 static void ipw_write_direct(struct ipw_priv *priv, u32 addr, void *buf,
434 memcpy_toio((priv->hw_base + addr), buf, num);
437 static inline void ipw_set_bit(struct ipw_priv *priv, u32 reg, u32 mask)
439 ipw_write32(priv, reg, ipw_read32(priv, reg) | mask);
442 static inline void ipw_clear_bit(struct ipw_priv *priv, u32 reg, u32 mask)
444 ipw_write32(priv, reg, ipw_read32(priv, reg) & ~mask);
447 static inline void ipw_enable_interrupts(struct ipw_priv *priv)
449 if (priv->status & STATUS_INT_ENABLED)
451 priv->status |= STATUS_INT_ENABLED;
452 ipw_write32(priv, IPW_INTA_MASK_R, IPW_INTA_MASK_ALL);
455 static inline void ipw_disable_interrupts(struct ipw_priv *priv)
457 if (!(priv->status & STATUS_INT_ENABLED))
459 priv->status &= ~STATUS_INT_ENABLED;
460 ipw_write32(priv, IPW_INTA_MASK_R, ~IPW_INTA_MASK_ALL);
463 #ifdef CONFIG_IPW_DEBUG
464 static char *ipw_error_desc(u32 val)
467 case IPW_FW_ERROR_OK:
469 case IPW_FW_ERROR_FAIL:
471 case IPW_FW_ERROR_MEMORY_UNDERFLOW:
472 return "MEMORY_UNDERFLOW";
473 case IPW_FW_ERROR_MEMORY_OVERFLOW:
474 return "MEMORY_OVERFLOW";
475 case IPW_FW_ERROR_BAD_PARAM:
477 case IPW_FW_ERROR_BAD_CHECKSUM:
478 return "BAD_CHECKSUM";
479 case IPW_FW_ERROR_NMI_INTERRUPT:
480 return "NMI_INTERRUPT";
481 case IPW_FW_ERROR_BAD_DATABASE:
482 return "BAD_DATABASE";
483 case IPW_FW_ERROR_ALLOC_FAIL:
485 case IPW_FW_ERROR_DMA_UNDERRUN:
486 return "DMA_UNDERRUN";
487 case IPW_FW_ERROR_DMA_STATUS:
489 case IPW_FW_ERROR_DINO_ERROR:
491 case IPW_FW_ERROR_EEPROM_ERROR:
492 return "EEPROM_ERROR";
493 case IPW_FW_ERROR_SYSASSERT:
495 case IPW_FW_ERROR_FATAL_ERROR:
496 return "FATAL_ERROR";
498 return "UNKNOWN_ERROR";
502 static void ipw_dump_error_log(struct ipw_priv *priv,
503 struct ipw_fw_error *error)
508 IPW_ERROR("Error allocating and capturing error log. "
509 "Nothing to dump.\n");
513 IPW_ERROR("Start IPW Error Log Dump:\n");
514 IPW_ERROR("Status: 0x%08X, Config: %08X\n",
515 error->status, error->config);
517 for (i = 0; i < error->elem_len; i++)
518 IPW_ERROR("%s %i 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n",
519 ipw_error_desc(error->elem[i].desc),
521 error->elem[i].blink1,
522 error->elem[i].blink2,
523 error->elem[i].link1,
524 error->elem[i].link2, error->elem[i].data);
525 for (i = 0; i < error->log_len; i++)
526 IPW_ERROR("%i\t0x%08x\t%i\n",
528 error->log[i].event, error->log[i].data);
532 static inline int ipw_is_init(struct ipw_priv *priv)
534 return (priv->status & STATUS_INIT) ? 1 : 0;
537 static int ipw_get_ordinal(struct ipw_priv *priv, u32 ord, void *val, u32 * len)
539 u32 addr, field_info, field_len, field_count, total_len;
541 IPW_DEBUG_ORD("ordinal = %i\n", ord);
543 if (!priv || !val || !len) {
544 IPW_DEBUG_ORD("Invalid argument\n");
548 /* verify device ordinal tables have been initialized */
549 if (!priv->table0_addr || !priv->table1_addr || !priv->table2_addr) {
550 IPW_DEBUG_ORD("Access ordinals before initialization\n");
554 switch (IPW_ORD_TABLE_ID_MASK & ord) {
555 case IPW_ORD_TABLE_0_MASK:
557 * TABLE 0: Direct access to a table of 32 bit values
559 * This is a very simple table with the data directly
560 * read from the table
563 /* remove the table id from the ordinal */
564 ord &= IPW_ORD_TABLE_VALUE_MASK;
567 if (ord > priv->table0_len) {
568 IPW_DEBUG_ORD("ordinal value (%i) longer then "
569 "max (%i)\n", ord, priv->table0_len);
573 /* verify we have enough room to store the value */
574 if (*len < sizeof(u32)) {
575 IPW_DEBUG_ORD("ordinal buffer length too small, "
576 "need %zd\n", sizeof(u32));
580 IPW_DEBUG_ORD("Reading TABLE0[%i] from offset 0x%08x\n",
581 ord, priv->table0_addr + (ord << 2));
585 *((u32 *) val) = ipw_read32(priv, priv->table0_addr + ord);
588 case IPW_ORD_TABLE_1_MASK:
590 * TABLE 1: Indirect access to a table of 32 bit values
592 * This is a fairly large table of u32 values each
593 * representing starting addr for the data (which is
597 /* remove the table id from the ordinal */
598 ord &= IPW_ORD_TABLE_VALUE_MASK;
601 if (ord > priv->table1_len) {
602 IPW_DEBUG_ORD("ordinal value too long\n");
606 /* verify we have enough room to store the value */
607 if (*len < sizeof(u32)) {
608 IPW_DEBUG_ORD("ordinal buffer length too small, "
609 "need %zd\n", sizeof(u32));
614 ipw_read_reg32(priv, (priv->table1_addr + (ord << 2)));
618 case IPW_ORD_TABLE_2_MASK:
620 * TABLE 2: Indirect access to a table of variable sized values
622 * This table consist of six values, each containing
623 * - dword containing the starting offset of the data
624 * - dword containing the lengh in the first 16bits
625 * and the count in the second 16bits
628 /* remove the table id from the ordinal */
629 ord &= IPW_ORD_TABLE_VALUE_MASK;
632 if (ord > priv->table2_len) {
633 IPW_DEBUG_ORD("ordinal value too long\n");
637 /* get the address of statistic */
638 addr = ipw_read_reg32(priv, priv->table2_addr + (ord << 3));
640 /* get the second DW of statistics ;
641 * two 16-bit words - first is length, second is count */
644 priv->table2_addr + (ord << 3) +
647 /* get each entry length */
648 field_len = *((u16 *) & field_info);
650 /* get number of entries */
651 field_count = *(((u16 *) & field_info) + 1);
653 /* abort if not enought memory */
654 total_len = field_len * field_count;
655 if (total_len > *len) {
664 IPW_DEBUG_ORD("addr = 0x%08x, total_len = %i, "
665 "field_info = 0x%08x\n",
666 addr, total_len, field_info);
667 ipw_read_indirect(priv, addr, val, total_len);
671 IPW_DEBUG_ORD("Invalid ordinal!\n");
679 static void ipw_init_ordinals(struct ipw_priv *priv)
681 priv->table0_addr = IPW_ORDINALS_TABLE_LOWER;
682 priv->table0_len = ipw_read32(priv, priv->table0_addr);
684 IPW_DEBUG_ORD("table 0 offset at 0x%08x, len = %i\n",
685 priv->table0_addr, priv->table0_len);
687 priv->table1_addr = ipw_read32(priv, IPW_ORDINALS_TABLE_1);
688 priv->table1_len = ipw_read_reg32(priv, priv->table1_addr);
690 IPW_DEBUG_ORD("table 1 offset at 0x%08x, len = %i\n",
691 priv->table1_addr, priv->table1_len);
693 priv->table2_addr = ipw_read32(priv, IPW_ORDINALS_TABLE_2);
694 priv->table2_len = ipw_read_reg32(priv, priv->table2_addr);
695 priv->table2_len &= 0x0000ffff; /* use first two bytes */
697 IPW_DEBUG_ORD("table 2 offset at 0x%08x, len = %i\n",
698 priv->table2_addr, priv->table2_len);
702 u32 ipw_register_toggle(u32 reg)
704 reg &= ~IPW_START_STANDBY;
705 if (reg & IPW_GATE_ODMA)
706 reg &= ~IPW_GATE_ODMA;
707 if (reg & IPW_GATE_IDMA)
708 reg &= ~IPW_GATE_IDMA;
709 if (reg & IPW_GATE_ADMA)
710 reg &= ~IPW_GATE_ADMA;
716 * - On radio ON, turn on any LEDs that require to be on during start
717 * - On initialization, start unassociated blink
718 * - On association, disable unassociated blink
719 * - On disassociation, start unassociated blink
720 * - On radio OFF, turn off any LEDs started during radio on
723 #define LD_TIME_LINK_ON 300
724 #define LD_TIME_LINK_OFF 2700
725 #define LD_TIME_ACT_ON 250
727 void ipw_led_link_on(struct ipw_priv *priv)
732 /* If configured to not use LEDs, or nic_type is 1,
733 * then we don't toggle a LINK led */
734 if (priv->config & CFG_NO_LED || priv->nic_type == EEPROM_NIC_TYPE_1)
737 spin_lock_irqsave(&priv->lock, flags);
739 if (!(priv->status & STATUS_RF_KILL_MASK) &&
740 !(priv->status & STATUS_LED_LINK_ON)) {
741 IPW_DEBUG_LED("Link LED On\n");
742 led = ipw_read_reg32(priv, IPW_EVENT_REG);
743 led |= priv->led_association_on;
745 led = ipw_register_toggle(led);
747 IPW_DEBUG_LED("Reg: 0x%08X\n", led);
748 ipw_write_reg32(priv, IPW_EVENT_REG, led);
750 priv->status |= STATUS_LED_LINK_ON;
752 /* If we aren't associated, schedule turning the LED off */
753 if (!(priv->status & STATUS_ASSOCIATED))
754 queue_delayed_work(priv->workqueue,
759 spin_unlock_irqrestore(&priv->lock, flags);
762 static void ipw_bg_led_link_on(void *data)
764 struct ipw_priv *priv = data;
766 ipw_led_link_on(data);
770 void ipw_led_link_off(struct ipw_priv *priv)
775 /* If configured not to use LEDs, or nic type is 1,
776 * then we don't goggle the LINK led. */
777 if (priv->config & CFG_NO_LED || priv->nic_type == EEPROM_NIC_TYPE_1)
780 spin_lock_irqsave(&priv->lock, flags);
782 if (priv->status & STATUS_LED_LINK_ON) {
783 led = ipw_read_reg32(priv, IPW_EVENT_REG);
784 led &= priv->led_association_off;
785 led = ipw_register_toggle(led);
787 IPW_DEBUG_LED("Reg: 0x%08X\n", led);
788 ipw_write_reg32(priv, IPW_EVENT_REG, led);
790 IPW_DEBUG_LED("Link LED Off\n");
792 priv->status &= ~STATUS_LED_LINK_ON;
794 /* If we aren't associated and the radio is on, schedule
795 * turning the LED on (blink while unassociated) */
796 if (!(priv->status & STATUS_RF_KILL_MASK) &&
797 !(priv->status & STATUS_ASSOCIATED))
798 queue_delayed_work(priv->workqueue, &priv->led_link_on,
803 spin_unlock_irqrestore(&priv->lock, flags);
806 static void ipw_bg_led_link_off(void *data)
808 struct ipw_priv *priv = data;
810 ipw_led_link_off(data);
814 static inline void __ipw_led_activity_on(struct ipw_priv *priv)
818 if (priv->config & CFG_NO_LED)
821 if (priv->status & STATUS_RF_KILL_MASK)
824 if (!(priv->status & STATUS_LED_ACT_ON)) {
825 led = ipw_read_reg32(priv, IPW_EVENT_REG);
826 led |= priv->led_activity_on;
828 led = ipw_register_toggle(led);
830 IPW_DEBUG_LED("Reg: 0x%08X\n", led);
831 ipw_write_reg32(priv, IPW_EVENT_REG, led);
833 IPW_DEBUG_LED("Activity LED On\n");
835 priv->status |= STATUS_LED_ACT_ON;
837 cancel_delayed_work(&priv->led_act_off);
838 queue_delayed_work(priv->workqueue, &priv->led_act_off,
841 /* Reschedule LED off for full time period */
842 cancel_delayed_work(&priv->led_act_off);
843 queue_delayed_work(priv->workqueue, &priv->led_act_off,
848 void ipw_led_activity_on(struct ipw_priv *priv)
851 spin_lock_irqsave(&priv->lock, flags);
852 __ipw_led_activity_on(priv);
853 spin_unlock_irqrestore(&priv->lock, flags);
856 void ipw_led_activity_off(struct ipw_priv *priv)
861 if (priv->config & CFG_NO_LED)
864 spin_lock_irqsave(&priv->lock, flags);
866 if (priv->status & STATUS_LED_ACT_ON) {
867 led = ipw_read_reg32(priv, IPW_EVENT_REG);
868 led &= priv->led_activity_off;
870 led = ipw_register_toggle(led);
872 IPW_DEBUG_LED("Reg: 0x%08X\n", led);
873 ipw_write_reg32(priv, IPW_EVENT_REG, led);
875 IPW_DEBUG_LED("Activity LED Off\n");
877 priv->status &= ~STATUS_LED_ACT_ON;
880 spin_unlock_irqrestore(&priv->lock, flags);
883 static void ipw_bg_led_activity_off(void *data)
885 struct ipw_priv *priv = data;
887 ipw_led_activity_off(data);
891 void ipw_led_band_on(struct ipw_priv *priv)
896 /* Only nic type 1 supports mode LEDs */
897 if (priv->config & CFG_NO_LED ||
898 priv->nic_type != EEPROM_NIC_TYPE_1 || !priv->assoc_network)
901 spin_lock_irqsave(&priv->lock, flags);
903 led = ipw_read_reg32(priv, IPW_EVENT_REG);
904 if (priv->assoc_network->mode == IEEE_A) {
905 led |= priv->led_ofdm_on;
906 led &= priv->led_association_off;
907 IPW_DEBUG_LED("Mode LED On: 802.11a\n");
908 } else if (priv->assoc_network->mode == IEEE_G) {
909 led |= priv->led_ofdm_on;
910 led |= priv->led_association_on;
911 IPW_DEBUG_LED("Mode LED On: 802.11g\n");
913 led &= priv->led_ofdm_off;
914 led |= priv->led_association_on;
915 IPW_DEBUG_LED("Mode LED On: 802.11b\n");
918 led = ipw_register_toggle(led);
920 IPW_DEBUG_LED("Reg: 0x%08X\n", led);
921 ipw_write_reg32(priv, IPW_EVENT_REG, led);
923 spin_unlock_irqrestore(&priv->lock, flags);
926 void ipw_led_band_off(struct ipw_priv *priv)
931 /* Only nic type 1 supports mode LEDs */
932 if (priv->config & CFG_NO_LED || priv->nic_type != EEPROM_NIC_TYPE_1)
935 spin_lock_irqsave(&priv->lock, flags);
937 led = ipw_read_reg32(priv, IPW_EVENT_REG);
938 led &= priv->led_ofdm_off;
939 led &= priv->led_association_off;
941 led = ipw_register_toggle(led);
943 IPW_DEBUG_LED("Reg: 0x%08X\n", led);
944 ipw_write_reg32(priv, IPW_EVENT_REG, led);
946 spin_unlock_irqrestore(&priv->lock, flags);
949 void ipw_led_radio_on(struct ipw_priv *priv)
951 ipw_led_link_on(priv);
954 void ipw_led_radio_off(struct ipw_priv *priv)
956 ipw_led_activity_off(priv);
957 ipw_led_link_off(priv);
960 void ipw_led_link_up(struct ipw_priv *priv)
962 /* Set the Link Led on for all nic types */
963 ipw_led_link_on(priv);
966 void ipw_led_link_down(struct ipw_priv *priv)
968 ipw_led_activity_off(priv);
969 ipw_led_link_off(priv);
971 if (priv->status & STATUS_RF_KILL_MASK)
972 ipw_led_radio_off(priv);
975 void ipw_led_init(struct ipw_priv *priv)
977 priv->nic_type = priv->eeprom[EEPROM_NIC_TYPE];
979 /* Set the default PINs for the link and activity leds */
980 priv->led_activity_on = IPW_ACTIVITY_LED;
981 priv->led_activity_off = ~(IPW_ACTIVITY_LED);
983 priv->led_association_on = IPW_ASSOCIATED_LED;
984 priv->led_association_off = ~(IPW_ASSOCIATED_LED);
986 /* Set the default PINs for the OFDM leds */
987 priv->led_ofdm_on = IPW_OFDM_LED;
988 priv->led_ofdm_off = ~(IPW_OFDM_LED);
990 switch (priv->nic_type) {
991 case EEPROM_NIC_TYPE_1:
992 /* In this NIC type, the LEDs are reversed.... */
993 priv->led_activity_on = IPW_ASSOCIATED_LED;
994 priv->led_activity_off = ~(IPW_ASSOCIATED_LED);
995 priv->led_association_on = IPW_ACTIVITY_LED;
996 priv->led_association_off = ~(IPW_ACTIVITY_LED);
998 if (!(priv->config & CFG_NO_LED))
999 ipw_led_band_on(priv);
1001 /* And we don't blink link LEDs for this nic, so
1002 * just return here */
1005 case EEPROM_NIC_TYPE_3:
1006 case EEPROM_NIC_TYPE_2:
1007 case EEPROM_NIC_TYPE_4:
1008 case EEPROM_NIC_TYPE_0:
1012 IPW_DEBUG_INFO("Unknown NIC type from EEPROM: %d\n",
1014 priv->nic_type = EEPROM_NIC_TYPE_0;
1018 if (!(priv->config & CFG_NO_LED)) {
1019 if (priv->status & STATUS_ASSOCIATED)
1020 ipw_led_link_on(priv);
1022 ipw_led_link_off(priv);
1026 void ipw_led_shutdown(struct ipw_priv *priv)
1028 ipw_led_activity_off(priv);
1029 ipw_led_link_off(priv);
1030 ipw_led_band_off(priv);
1031 cancel_delayed_work(&priv->led_link_on);
1032 cancel_delayed_work(&priv->led_link_off);
1033 cancel_delayed_work(&priv->led_act_off);
1037 * The following adds a new attribute to the sysfs representation
1038 * of this device driver (i.e. a new file in /sys/bus/pci/drivers/ipw/)
1039 * used for controling the debug level.
1041 * See the level definitions in ipw for details.
1043 static ssize_t show_debug_level(struct device_driver *d, char *buf)
1045 return sprintf(buf, "0x%08X\n", ipw_debug_level);
1048 static ssize_t store_debug_level(struct device_driver *d, const char *buf,
1051 char *p = (char *)buf;
1054 if (p[1] == 'x' || p[1] == 'X' || p[0] == 'x' || p[0] == 'X') {
1056 if (p[0] == 'x' || p[0] == 'X')
1058 val = simple_strtoul(p, &p, 16);
1060 val = simple_strtoul(p, &p, 10);
1062 printk(KERN_INFO DRV_NAME
1063 ": %s is not in hex or decimal form.\n", buf);
1065 ipw_debug_level = val;
1067 return strnlen(buf, count);
1070 static DRIVER_ATTR(debug_level, S_IWUSR | S_IRUGO,
1071 show_debug_level, store_debug_level);
1073 static inline u32 ipw_get_event_log_len(struct ipw_priv *priv)
1075 return ipw_read_reg32(priv, ipw_read32(priv, IPW_EVENT_LOG));
1078 static void ipw_capture_event_log(struct ipw_priv *priv,
1079 u32 log_len, struct ipw_event *log)
1084 base = ipw_read32(priv, IPW_EVENT_LOG);
1085 ipw_read_indirect(priv, base + sizeof(base) + sizeof(u32),
1086 (u8 *) log, sizeof(*log) * log_len);
1090 static struct ipw_fw_error *ipw_alloc_error_log(struct ipw_priv *priv)
1092 struct ipw_fw_error *error;
1093 u32 log_len = ipw_get_event_log_len(priv);
1094 u32 base = ipw_read32(priv, IPW_ERROR_LOG);
1095 u32 elem_len = ipw_read_reg32(priv, base);
1097 error = kmalloc(sizeof(*error) +
1098 sizeof(*error->elem) * elem_len +
1099 sizeof(*error->log) * log_len, GFP_ATOMIC);
1101 IPW_ERROR("Memory allocation for firmware error log "
1105 error->jiffies = jiffies;
1106 error->status = priv->status;
1107 error->config = priv->config;
1108 error->elem_len = elem_len;
1109 error->log_len = log_len;
1110 error->elem = (struct ipw_error_elem *)error->payload;
1111 error->log = (struct ipw_event *)(error->elem +
1112 (sizeof(*error->elem) * elem_len));
1114 ipw_capture_event_log(priv, log_len, error->log);
1117 ipw_read_indirect(priv, base + sizeof(base), (u8 *) error->elem,
1118 sizeof(*error->elem) * elem_len);
1123 static void ipw_free_error_log(struct ipw_fw_error *error)
1129 static ssize_t show_event_log(struct device *d,
1130 struct device_attribute *attr, char *buf)
1132 struct ipw_priv *priv = dev_get_drvdata(d);
1133 u32 log_len = ipw_get_event_log_len(priv);
1134 struct ipw_event log[log_len];
1137 ipw_capture_event_log(priv, log_len, log);
1139 len += snprintf(buf + len, PAGE_SIZE - len, "%08X", log_len);
1140 for (i = 0; i < log_len; i++)
1141 len += snprintf(buf + len, PAGE_SIZE - len,
1143 log[i].time, log[i].event, log[i].data);
1144 len += snprintf(buf + len, PAGE_SIZE - len, "\n");
1148 static DEVICE_ATTR(event_log, S_IRUGO, show_event_log, NULL);
1150 static ssize_t show_error(struct device *d,
1151 struct device_attribute *attr, char *buf)
1153 struct ipw_priv *priv = dev_get_drvdata(d);
1157 len += snprintf(buf + len, PAGE_SIZE - len,
1158 "%08lX%08X%08X%08X",
1159 priv->error->jiffies,
1160 priv->error->status,
1161 priv->error->config, priv->error->elem_len);
1162 for (i = 0; i < priv->error->elem_len; i++)
1163 len += snprintf(buf + len, PAGE_SIZE - len,
1164 "\n%08X%08X%08X%08X%08X%08X%08X",
1165 priv->error->elem[i].time,
1166 priv->error->elem[i].desc,
1167 priv->error->elem[i].blink1,
1168 priv->error->elem[i].blink2,
1169 priv->error->elem[i].link1,
1170 priv->error->elem[i].link2,
1171 priv->error->elem[i].data);
1173 len += snprintf(buf + len, PAGE_SIZE - len,
1174 "\n%08X", priv->error->log_len);
1175 for (i = 0; i < priv->error->log_len; i++)
1176 len += snprintf(buf + len, PAGE_SIZE - len,
1178 priv->error->log[i].time,
1179 priv->error->log[i].event,
1180 priv->error->log[i].data);
1181 len += snprintf(buf + len, PAGE_SIZE - len, "\n");
1185 static ssize_t clear_error(struct device *d,
1186 struct device_attribute *attr,
1187 const char *buf, size_t count)
1189 struct ipw_priv *priv = dev_get_drvdata(d);
1191 ipw_free_error_log(priv->error);
1197 static DEVICE_ATTR(error, S_IRUGO | S_IWUSR, show_error, clear_error);
1199 static ssize_t show_cmd_log(struct device *d,
1200 struct device_attribute *attr, char *buf)
1202 struct ipw_priv *priv = dev_get_drvdata(d);
1206 for (i = (priv->cmdlog_pos + 1) % priv->cmdlog_len;
1207 (i != priv->cmdlog_pos) && (PAGE_SIZE - len);
1208 i = (i + 1) % priv->cmdlog_len) {
1210 snprintf(buf + len, PAGE_SIZE - len,
1211 "\n%08lX%08X%08X%08X\n", priv->cmdlog[i].jiffies,
1212 priv->cmdlog[i].retcode, priv->cmdlog[i].cmd.cmd,
1213 priv->cmdlog[i].cmd.len);
1215 snprintk_buf(buf + len, PAGE_SIZE - len,
1216 (u8 *) priv->cmdlog[i].cmd.param,
1217 priv->cmdlog[i].cmd.len);
1218 len += snprintf(buf + len, PAGE_SIZE - len, "\n");
1220 len += snprintf(buf + len, PAGE_SIZE - len, "\n");
1224 static DEVICE_ATTR(cmd_log, S_IRUGO, show_cmd_log, NULL);
1226 static ssize_t show_scan_age(struct device *d, struct device_attribute *attr,
1229 struct ipw_priv *priv = dev_get_drvdata(d);
1230 return sprintf(buf, "%d\n", priv->ieee->scan_age);
1233 static ssize_t store_scan_age(struct device *d, struct device_attribute *attr,
1234 const char *buf, size_t count)
1236 struct ipw_priv *priv = dev_get_drvdata(d);
1237 #ifdef CONFIG_IPW_DEBUG
1238 struct net_device *dev = priv->net_dev;
1240 char buffer[] = "00000000";
1242 (sizeof(buffer) - 1) > count ? count : sizeof(buffer) - 1;
1246 IPW_DEBUG_INFO("enter\n");
1248 strncpy(buffer, buf, len);
1251 if (p[1] == 'x' || p[1] == 'X' || p[0] == 'x' || p[0] == 'X') {
1253 if (p[0] == 'x' || p[0] == 'X')
1255 val = simple_strtoul(p, &p, 16);
1257 val = simple_strtoul(p, &p, 10);
1259 IPW_DEBUG_INFO("%s: user supplied invalid value.\n", dev->name);
1261 priv->ieee->scan_age = val;
1262 IPW_DEBUG_INFO("set scan_age = %u\n", priv->ieee->scan_age);
1265 IPW_DEBUG_INFO("exit\n");
1269 static DEVICE_ATTR(scan_age, S_IWUSR | S_IRUGO, show_scan_age, store_scan_age);
1271 static ssize_t show_led(struct device *d, struct device_attribute *attr,
1274 struct ipw_priv *priv = dev_get_drvdata(d);
1275 return sprintf(buf, "%d\n", (priv->config & CFG_NO_LED) ? 0 : 1);
1278 static ssize_t store_led(struct device *d, struct device_attribute *attr,
1279 const char *buf, size_t count)
1281 struct ipw_priv *priv = dev_get_drvdata(d);
1283 IPW_DEBUG_INFO("enter\n");
1289 IPW_DEBUG_LED("Disabling LED control.\n");
1290 priv->config |= CFG_NO_LED;
1291 ipw_led_shutdown(priv);
1293 IPW_DEBUG_LED("Enabling LED control.\n");
1294 priv->config &= ~CFG_NO_LED;
1298 IPW_DEBUG_INFO("exit\n");
1302 static DEVICE_ATTR(led, S_IWUSR | S_IRUGO, show_led, store_led);
1304 static ssize_t show_status(struct device *d,
1305 struct device_attribute *attr, char *buf)
1307 struct ipw_priv *p = d->driver_data;
1308 return sprintf(buf, "0x%08x\n", (int)p->status);
1311 static DEVICE_ATTR(status, S_IRUGO, show_status, NULL);
1313 static ssize_t show_cfg(struct device *d, struct device_attribute *attr,
1316 struct ipw_priv *p = d->driver_data;
1317 return sprintf(buf, "0x%08x\n", (int)p->config);
1320 static DEVICE_ATTR(cfg, S_IRUGO, show_cfg, NULL);
1322 static ssize_t show_nic_type(struct device *d,
1323 struct device_attribute *attr, char *buf)
1325 struct ipw_priv *priv = d->driver_data;
1326 return sprintf(buf, "TYPE: %d\n", priv->nic_type);
1329 static DEVICE_ATTR(nic_type, S_IRUGO, show_nic_type, NULL);
1331 static ssize_t show_ucode_version(struct device *d,
1332 struct device_attribute *attr, char *buf)
1334 u32 len = sizeof(u32), tmp = 0;
1335 struct ipw_priv *p = d->driver_data;
1337 if (ipw_get_ordinal(p, IPW_ORD_STAT_UCODE_VERSION, &tmp, &len))
1340 return sprintf(buf, "0x%08x\n", tmp);
1343 static DEVICE_ATTR(ucode_version, S_IWUSR | S_IRUGO, show_ucode_version, NULL);
1345 static ssize_t show_rtc(struct device *d, struct device_attribute *attr,
1348 u32 len = sizeof(u32), tmp = 0;
1349 struct ipw_priv *p = d->driver_data;
1351 if (ipw_get_ordinal(p, IPW_ORD_STAT_RTC, &tmp, &len))
1354 return sprintf(buf, "0x%08x\n", tmp);
1357 static DEVICE_ATTR(rtc, S_IWUSR | S_IRUGO, show_rtc, NULL);
1360 * Add a device attribute to view/control the delay between eeprom
1363 static ssize_t show_eeprom_delay(struct device *d,
1364 struct device_attribute *attr, char *buf)
1366 int n = ((struct ipw_priv *)d->driver_data)->eeprom_delay;
1367 return sprintf(buf, "%i\n", n);
1369 static ssize_t store_eeprom_delay(struct device *d,
1370 struct device_attribute *attr,
1371 const char *buf, size_t count)
1373 struct ipw_priv *p = d->driver_data;
1374 sscanf(buf, "%i", &p->eeprom_delay);
1375 return strnlen(buf, count);
1378 static DEVICE_ATTR(eeprom_delay, S_IWUSR | S_IRUGO,
1379 show_eeprom_delay, store_eeprom_delay);
1381 static ssize_t show_command_event_reg(struct device *d,
1382 struct device_attribute *attr, char *buf)
1385 struct ipw_priv *p = d->driver_data;
1387 reg = ipw_read_reg32(p, IPW_INTERNAL_CMD_EVENT);
1388 return sprintf(buf, "0x%08x\n", reg);
1390 static ssize_t store_command_event_reg(struct device *d,
1391 struct device_attribute *attr,
1392 const char *buf, size_t count)
1395 struct ipw_priv *p = d->driver_data;
1397 sscanf(buf, "%x", ®);
1398 ipw_write_reg32(p, IPW_INTERNAL_CMD_EVENT, reg);
1399 return strnlen(buf, count);
1402 static DEVICE_ATTR(command_event_reg, S_IWUSR | S_IRUGO,
1403 show_command_event_reg, store_command_event_reg);
1405 static ssize_t show_mem_gpio_reg(struct device *d,
1406 struct device_attribute *attr, char *buf)
1409 struct ipw_priv *p = d->driver_data;
1411 reg = ipw_read_reg32(p, 0x301100);
1412 return sprintf(buf, "0x%08x\n", reg);
1414 static ssize_t store_mem_gpio_reg(struct device *d,
1415 struct device_attribute *attr,
1416 const char *buf, size_t count)
1419 struct ipw_priv *p = d->driver_data;
1421 sscanf(buf, "%x", ®);
1422 ipw_write_reg32(p, 0x301100, reg);
1423 return strnlen(buf, count);
1426 static DEVICE_ATTR(mem_gpio_reg, S_IWUSR | S_IRUGO,
1427 show_mem_gpio_reg, store_mem_gpio_reg);
1429 static ssize_t show_indirect_dword(struct device *d,
1430 struct device_attribute *attr, char *buf)
1433 struct ipw_priv *priv = d->driver_data;
1435 if (priv->status & STATUS_INDIRECT_DWORD)
1436 reg = ipw_read_reg32(priv, priv->indirect_dword);
1440 return sprintf(buf, "0x%08x\n", reg);
1442 static ssize_t store_indirect_dword(struct device *d,
1443 struct device_attribute *attr,
1444 const char *buf, size_t count)
1446 struct ipw_priv *priv = d->driver_data;
1448 sscanf(buf, "%x", &priv->indirect_dword);
1449 priv->status |= STATUS_INDIRECT_DWORD;
1450 return strnlen(buf, count);
1453 static DEVICE_ATTR(indirect_dword, S_IWUSR | S_IRUGO,
1454 show_indirect_dword, store_indirect_dword);
1456 static ssize_t show_indirect_byte(struct device *d,
1457 struct device_attribute *attr, char *buf)
1460 struct ipw_priv *priv = d->driver_data;
1462 if (priv->status & STATUS_INDIRECT_BYTE)
1463 reg = ipw_read_reg8(priv, priv->indirect_byte);
1467 return sprintf(buf, "0x%02x\n", reg);
1469 static ssize_t store_indirect_byte(struct device *d,
1470 struct device_attribute *attr,
1471 const char *buf, size_t count)
1473 struct ipw_priv *priv = d->driver_data;
1475 sscanf(buf, "%x", &priv->indirect_byte);
1476 priv->status |= STATUS_INDIRECT_BYTE;
1477 return strnlen(buf, count);
1480 static DEVICE_ATTR(indirect_byte, S_IWUSR | S_IRUGO,
1481 show_indirect_byte, store_indirect_byte);
1483 static ssize_t show_direct_dword(struct device *d,
1484 struct device_attribute *attr, char *buf)
1487 struct ipw_priv *priv = d->driver_data;
1489 if (priv->status & STATUS_DIRECT_DWORD)
1490 reg = ipw_read32(priv, priv->direct_dword);
1494 return sprintf(buf, "0x%08x\n", reg);
1496 static ssize_t store_direct_dword(struct device *d,
1497 struct device_attribute *attr,
1498 const char *buf, size_t count)
1500 struct ipw_priv *priv = d->driver_data;
1502 sscanf(buf, "%x", &priv->direct_dword);
1503 priv->status |= STATUS_DIRECT_DWORD;
1504 return strnlen(buf, count);
1507 static DEVICE_ATTR(direct_dword, S_IWUSR | S_IRUGO,
1508 show_direct_dword, store_direct_dword);
1510 static inline int rf_kill_active(struct ipw_priv *priv)
1512 if (0 == (ipw_read32(priv, 0x30) & 0x10000))
1513 priv->status |= STATUS_RF_KILL_HW;
1515 priv->status &= ~STATUS_RF_KILL_HW;
1517 return (priv->status & STATUS_RF_KILL_HW) ? 1 : 0;
1520 static ssize_t show_rf_kill(struct device *d, struct device_attribute *attr,
1523 /* 0 - RF kill not enabled
1524 1 - SW based RF kill active (sysfs)
1525 2 - HW based RF kill active
1526 3 - Both HW and SW baed RF kill active */
1527 struct ipw_priv *priv = d->driver_data;
1528 int val = ((priv->status & STATUS_RF_KILL_SW) ? 0x1 : 0x0) |
1529 (rf_kill_active(priv) ? 0x2 : 0x0);
1530 return sprintf(buf, "%i\n", val);
1533 static int ipw_radio_kill_sw(struct ipw_priv *priv, int disable_radio)
1535 if ((disable_radio ? 1 : 0) ==
1536 ((priv->status & STATUS_RF_KILL_SW) ? 1 : 0))
1539 IPW_DEBUG_RF_KILL("Manual SW RF Kill set to: RADIO %s\n",
1540 disable_radio ? "OFF" : "ON");
1542 if (disable_radio) {
1543 priv->status |= STATUS_RF_KILL_SW;
1545 if (priv->workqueue)
1546 cancel_delayed_work(&priv->request_scan);
1547 queue_work(priv->workqueue, &priv->down);
1549 priv->status &= ~STATUS_RF_KILL_SW;
1550 if (rf_kill_active(priv)) {
1551 IPW_DEBUG_RF_KILL("Can not turn radio back on - "
1552 "disabled by HW switch\n");
1553 /* Make sure the RF_KILL check timer is running */
1554 cancel_delayed_work(&priv->rf_kill);
1555 queue_delayed_work(priv->workqueue, &priv->rf_kill,
1558 queue_work(priv->workqueue, &priv->up);
1564 static ssize_t store_rf_kill(struct device *d, struct device_attribute *attr,
1565 const char *buf, size_t count)
1567 struct ipw_priv *priv = d->driver_data;
1569 ipw_radio_kill_sw(priv, buf[0] == '1');
1574 static DEVICE_ATTR(rf_kill, S_IWUSR | S_IRUGO, show_rf_kill, store_rf_kill);
1576 static ssize_t show_speed_scan(struct device *d, struct device_attribute *attr,
1579 struct ipw_priv *priv = (struct ipw_priv *)d->driver_data;
1580 int pos = 0, len = 0;
1581 if (priv->config & CFG_SPEED_SCAN) {
1582 while (priv->speed_scan[pos] != 0)
1583 len += sprintf(&buf[len], "%d ",
1584 priv->speed_scan[pos++]);
1585 return len + sprintf(&buf[len], "\n");
1588 return sprintf(buf, "0\n");
1591 static ssize_t store_speed_scan(struct device *d, struct device_attribute *attr,
1592 const char *buf, size_t count)
1594 struct ipw_priv *priv = (struct ipw_priv *)d->driver_data;
1595 int channel, pos = 0;
1596 const char *p = buf;
1598 /* list of space separated channels to scan, optionally ending with 0 */
1599 while ((channel = simple_strtol(p, NULL, 0))) {
1600 if (pos == MAX_SPEED_SCAN - 1) {
1601 priv->speed_scan[pos] = 0;
1605 if (ipw_is_valid_channel(priv->ieee, channel))
1606 priv->speed_scan[pos++] = channel;
1608 IPW_WARNING("Skipping invalid channel request: %d\n",
1613 while (*p == ' ' || *p == '\t')
1618 priv->config &= ~CFG_SPEED_SCAN;
1620 priv->speed_scan_pos = 0;
1621 priv->config |= CFG_SPEED_SCAN;
1627 static DEVICE_ATTR(speed_scan, S_IWUSR | S_IRUGO, show_speed_scan,
1630 static ssize_t show_net_stats(struct device *d, struct device_attribute *attr,
1633 struct ipw_priv *priv = (struct ipw_priv *)d->driver_data;
1634 return sprintf(buf, "%c\n", (priv->config & CFG_NET_STATS) ? '1' : '0');
1637 static ssize_t store_net_stats(struct device *d, struct device_attribute *attr,
1638 const char *buf, size_t count)
1640 struct ipw_priv *priv = (struct ipw_priv *)d->driver_data;
1642 priv->config |= CFG_NET_STATS;
1644 priv->config &= ~CFG_NET_STATS;
1649 static DEVICE_ATTR(net_stats, S_IWUSR | S_IRUGO,
1650 show_net_stats, store_net_stats);
1652 static void notify_wx_assoc_event(struct ipw_priv *priv)
1654 union iwreq_data wrqu;
1655 wrqu.ap_addr.sa_family = ARPHRD_ETHER;
1656 if (priv->status & STATUS_ASSOCIATED)
1657 memcpy(wrqu.ap_addr.sa_data, priv->bssid, ETH_ALEN);
1659 memset(wrqu.ap_addr.sa_data, 0, ETH_ALEN);
1660 wireless_send_event(priv->net_dev, SIOCGIWAP, &wrqu, NULL);
1663 static void ipw_irq_tasklet(struct ipw_priv *priv)
1665 u32 inta, inta_mask, handled = 0;
1666 unsigned long flags;
1669 spin_lock_irqsave(&priv->lock, flags);
1671 inta = ipw_read32(priv, IPW_INTA_RW);
1672 inta_mask = ipw_read32(priv, IPW_INTA_MASK_R);
1673 inta &= (IPW_INTA_MASK_ALL & inta_mask);
1675 /* Add any cached INTA values that need to be handled */
1676 inta |= priv->isr_inta;
1678 /* handle all the justifications for the interrupt */
1679 if (inta & IPW_INTA_BIT_RX_TRANSFER) {
1681 handled |= IPW_INTA_BIT_RX_TRANSFER;
1684 if (inta & IPW_INTA_BIT_TX_CMD_QUEUE) {
1685 IPW_DEBUG_HC("Command completed.\n");
1686 rc = ipw_queue_tx_reclaim(priv, &priv->txq_cmd, -1);
1687 priv->status &= ~STATUS_HCMD_ACTIVE;
1688 wake_up_interruptible(&priv->wait_command_queue);
1689 handled |= IPW_INTA_BIT_TX_CMD_QUEUE;
1692 if (inta & IPW_INTA_BIT_TX_QUEUE_1) {
1693 IPW_DEBUG_TX("TX_QUEUE_1\n");
1694 rc = ipw_queue_tx_reclaim(priv, &priv->txq[0], 0);
1695 handled |= IPW_INTA_BIT_TX_QUEUE_1;
1698 if (inta & IPW_INTA_BIT_TX_QUEUE_2) {
1699 IPW_DEBUG_TX("TX_QUEUE_2\n");
1700 rc = ipw_queue_tx_reclaim(priv, &priv->txq[1], 1);
1701 handled |= IPW_INTA_BIT_TX_QUEUE_2;
1704 if (inta & IPW_INTA_BIT_TX_QUEUE_3) {
1705 IPW_DEBUG_TX("TX_QUEUE_3\n");
1706 rc = ipw_queue_tx_reclaim(priv, &priv->txq[2], 2);
1707 handled |= IPW_INTA_BIT_TX_QUEUE_3;
1710 if (inta & IPW_INTA_BIT_TX_QUEUE_4) {
1711 IPW_DEBUG_TX("TX_QUEUE_4\n");
1712 rc = ipw_queue_tx_reclaim(priv, &priv->txq[3], 3);
1713 handled |= IPW_INTA_BIT_TX_QUEUE_4;
1716 if (inta & IPW_INTA_BIT_STATUS_CHANGE) {
1717 IPW_WARNING("STATUS_CHANGE\n");
1718 handled |= IPW_INTA_BIT_STATUS_CHANGE;
1721 if (inta & IPW_INTA_BIT_BEACON_PERIOD_EXPIRED) {
1722 IPW_WARNING("TX_PERIOD_EXPIRED\n");
1723 handled |= IPW_INTA_BIT_BEACON_PERIOD_EXPIRED;
1726 if (inta & IPW_INTA_BIT_SLAVE_MODE_HOST_CMD_DONE) {
1727 IPW_WARNING("HOST_CMD_DONE\n");
1728 handled |= IPW_INTA_BIT_SLAVE_MODE_HOST_CMD_DONE;
1731 if (inta & IPW_INTA_BIT_FW_INITIALIZATION_DONE) {
1732 IPW_WARNING("FW_INITIALIZATION_DONE\n");
1733 handled |= IPW_INTA_BIT_FW_INITIALIZATION_DONE;
1736 if (inta & IPW_INTA_BIT_FW_CARD_DISABLE_PHY_OFF_DONE) {
1737 IPW_WARNING("PHY_OFF_DONE\n");
1738 handled |= IPW_INTA_BIT_FW_CARD_DISABLE_PHY_OFF_DONE;
1741 if (inta & IPW_INTA_BIT_RF_KILL_DONE) {
1742 IPW_DEBUG_RF_KILL("RF_KILL_DONE\n");
1743 priv->status |= STATUS_RF_KILL_HW;
1744 wake_up_interruptible(&priv->wait_command_queue);
1745 priv->status &= ~(STATUS_ASSOCIATED | STATUS_ASSOCIATING);
1746 cancel_delayed_work(&priv->request_scan);
1747 schedule_work(&priv->link_down);
1748 queue_delayed_work(priv->workqueue, &priv->rf_kill, 2 * HZ);
1749 handled |= IPW_INTA_BIT_RF_KILL_DONE;
1752 if (inta & IPW_INTA_BIT_FATAL_ERROR) {
1753 IPW_ERROR("Firmware error detected. Restarting.\n");
1755 IPW_ERROR("Sysfs 'error' log already exists.\n");
1756 #ifdef CONFIG_IPW_DEBUG
1757 if (ipw_debug_level & IPW_DL_FW_ERRORS) {
1758 struct ipw_fw_error *error =
1759 ipw_alloc_error_log(priv);
1760 ipw_dump_error_log(priv, error);
1762 ipw_free_error_log(error);
1766 priv->error = ipw_alloc_error_log(priv);
1768 IPW_ERROR("Sysfs 'error' log captured.\n");
1770 IPW_ERROR("Error allocating sysfs 'error' "
1772 #ifdef CONFIG_IPW_DEBUG
1773 if (ipw_debug_level & IPW_DL_FW_ERRORS)
1774 ipw_dump_error_log(priv, priv->error);
1778 /* XXX: If hardware encryption is for WPA/WPA2,
1779 * we have to notify the supplicant. */
1780 if (priv->ieee->sec.encrypt) {
1781 priv->status &= ~STATUS_ASSOCIATED;
1782 notify_wx_assoc_event(priv);
1785 /* Keep the restart process from trying to send host
1786 * commands by clearing the INIT status bit */
1787 priv->status &= ~STATUS_INIT;
1789 /* Cancel currently queued command. */
1790 priv->status &= ~STATUS_HCMD_ACTIVE;
1791 wake_up_interruptible(&priv->wait_command_queue);
1793 queue_work(priv->workqueue, &priv->adapter_restart);
1794 handled |= IPW_INTA_BIT_FATAL_ERROR;
1797 if (inta & IPW_INTA_BIT_PARITY_ERROR) {
1798 IPW_ERROR("Parity error\n");
1799 handled |= IPW_INTA_BIT_PARITY_ERROR;
1802 if (handled != inta) {
1803 IPW_ERROR("Unhandled INTA bits 0x%08x\n", inta & ~handled);
1806 /* enable all interrupts */
1807 ipw_enable_interrupts(priv);
1809 spin_unlock_irqrestore(&priv->lock, flags);
1812 #ifdef CONFIG_IPW_DEBUG
1813 #define IPW_CMD(x) case IPW_CMD_ ## x : return #x
1814 static char *get_cmd_string(u8 cmd)
1817 IPW_CMD(HOST_COMPLETE);
1818 IPW_CMD(POWER_DOWN);
1819 IPW_CMD(SYSTEM_CONFIG);
1820 IPW_CMD(MULTICAST_ADDRESS);
1822 IPW_CMD(ADAPTER_ADDRESS);
1824 IPW_CMD(RTS_THRESHOLD);
1825 IPW_CMD(FRAG_THRESHOLD);
1826 IPW_CMD(POWER_MODE);
1828 IPW_CMD(TGI_TX_KEY);
1829 IPW_CMD(SCAN_REQUEST);
1830 IPW_CMD(SCAN_REQUEST_EXT);
1832 IPW_CMD(SUPPORTED_RATES);
1833 IPW_CMD(SCAN_ABORT);
1835 IPW_CMD(QOS_PARAMETERS);
1836 IPW_CMD(DINO_CONFIG);
1837 IPW_CMD(RSN_CAPABILITIES);
1839 IPW_CMD(CARD_DISABLE);
1840 IPW_CMD(SEED_NUMBER);
1842 IPW_CMD(COUNTRY_INFO);
1843 IPW_CMD(AIRONET_INFO);
1844 IPW_CMD(AP_TX_POWER);
1846 IPW_CMD(CCX_VER_INFO);
1847 IPW_CMD(SET_CALIBRATION);
1848 IPW_CMD(SENSITIVITY_CALIB);
1849 IPW_CMD(RETRY_LIMIT);
1850 IPW_CMD(IPW_PRE_POWER_DOWN);
1851 IPW_CMD(VAP_BEACON_TEMPLATE);
1852 IPW_CMD(VAP_DTIM_PERIOD);
1853 IPW_CMD(EXT_SUPPORTED_RATES);
1854 IPW_CMD(VAP_LOCAL_TX_PWR_CONSTRAINT);
1855 IPW_CMD(VAP_QUIET_INTERVALS);
1856 IPW_CMD(VAP_CHANNEL_SWITCH);
1857 IPW_CMD(VAP_MANDATORY_CHANNELS);
1858 IPW_CMD(VAP_CELL_PWR_LIMIT);
1859 IPW_CMD(VAP_CF_PARAM_SET);
1860 IPW_CMD(VAP_SET_BEACONING_STATE);
1861 IPW_CMD(MEASUREMENT);
1862 IPW_CMD(POWER_CAPABILITY);
1863 IPW_CMD(SUPPORTED_CHANNELS);
1864 IPW_CMD(TPC_REPORT);
1866 IPW_CMD(PRODUCTION_COMMAND);
1873 #define HOST_COMPLETE_TIMEOUT HZ
1874 static int ipw_send_cmd(struct ipw_priv *priv, struct host_cmd *cmd)
1877 unsigned long flags;
1879 spin_lock_irqsave(&priv->lock, flags);
1880 if (priv->status & STATUS_HCMD_ACTIVE) {
1881 IPW_ERROR("Failed to send %s: Already sending a command.\n",
1882 get_cmd_string(cmd->cmd));
1883 spin_unlock_irqrestore(&priv->lock, flags);
1887 priv->status |= STATUS_HCMD_ACTIVE;
1890 priv->cmdlog[priv->cmdlog_pos].jiffies = jiffies;
1891 priv->cmdlog[priv->cmdlog_pos].cmd.cmd = cmd->cmd;
1892 priv->cmdlog[priv->cmdlog_pos].cmd.len = cmd->len;
1893 memcpy(priv->cmdlog[priv->cmdlog_pos].cmd.param, cmd->param,
1895 priv->cmdlog[priv->cmdlog_pos].retcode = -1;
1898 IPW_DEBUG_HC("%s command (#%d) %d bytes: 0x%08X\n",
1899 get_cmd_string(cmd->cmd), cmd->cmd, cmd->len,
1901 printk_buf(IPW_DL_HOST_COMMAND, (u8 *) cmd->param, cmd->len);
1903 rc = ipw_queue_tx_hcmd(priv, cmd->cmd, &cmd->param, cmd->len, 0);
1905 priv->status &= ~STATUS_HCMD_ACTIVE;
1906 IPW_ERROR("Failed to send %s: Reason %d\n",
1907 get_cmd_string(cmd->cmd), rc);
1908 spin_unlock_irqrestore(&priv->lock, flags);
1911 spin_unlock_irqrestore(&priv->lock, flags);
1913 rc = wait_event_interruptible_timeout(priv->wait_command_queue,
1915 status & STATUS_HCMD_ACTIVE),
1916 HOST_COMPLETE_TIMEOUT);
1918 spin_lock_irqsave(&priv->lock, flags);
1919 if (priv->status & STATUS_HCMD_ACTIVE) {
1920 IPW_ERROR("Failed to send %s: Command timed out.\n",
1921 get_cmd_string(cmd->cmd));
1922 priv->status &= ~STATUS_HCMD_ACTIVE;
1923 spin_unlock_irqrestore(&priv->lock, flags);
1927 spin_unlock_irqrestore(&priv->lock, flags);
1930 if (priv->status & STATUS_RF_KILL_HW) {
1931 IPW_ERROR("Failed to send %s: Aborted due to RF kill switch.\n",
1932 get_cmd_string(cmd->cmd));
1939 priv->cmdlog[priv->cmdlog_pos++].retcode = rc;
1940 priv->cmdlog_pos %= priv->cmdlog_len;
1945 static int ipw_send_host_complete(struct ipw_priv *priv)
1947 struct host_cmd cmd = {
1948 .cmd = IPW_CMD_HOST_COMPLETE,
1953 IPW_ERROR("Invalid args\n");
1957 return ipw_send_cmd(priv, &cmd);
1960 static int ipw_send_system_config(struct ipw_priv *priv,
1961 struct ipw_sys_config *config)
1963 struct host_cmd cmd = {
1964 .cmd = IPW_CMD_SYSTEM_CONFIG,
1965 .len = sizeof(*config)
1968 if (!priv || !config) {
1969 IPW_ERROR("Invalid args\n");
1973 memcpy(cmd.param, config, sizeof(*config));
1974 return ipw_send_cmd(priv, &cmd);
1977 static int ipw_send_ssid(struct ipw_priv *priv, u8 * ssid, int len)
1979 struct host_cmd cmd = {
1980 .cmd = IPW_CMD_SSID,
1981 .len = min(len, IW_ESSID_MAX_SIZE)
1984 if (!priv || !ssid) {
1985 IPW_ERROR("Invalid args\n");
1989 memcpy(cmd.param, ssid, cmd.len);
1990 return ipw_send_cmd(priv, &cmd);
1993 static int ipw_send_adapter_address(struct ipw_priv *priv, u8 * mac)
1995 struct host_cmd cmd = {
1996 .cmd = IPW_CMD_ADAPTER_ADDRESS,
2000 if (!priv || !mac) {
2001 IPW_ERROR("Invalid args\n");
2005 IPW_DEBUG_INFO("%s: Setting MAC to " MAC_FMT "\n",
2006 priv->net_dev->name, MAC_ARG(mac));
2008 memcpy(cmd.param, mac, ETH_ALEN);
2009 return ipw_send_cmd(priv, &cmd);
2013 * NOTE: This must be executed from our workqueue as it results in udelay
2014 * being called which may corrupt the keyboard if executed on default
2017 static void ipw_adapter_restart(void *adapter)
2019 struct ipw_priv *priv = adapter;
2021 if (priv->status & STATUS_RF_KILL_MASK)
2026 if (priv->assoc_network &&
2027 (priv->assoc_network->capability & WLAN_CAPABILITY_IBSS))
2028 ipw_remove_current_network(priv);
2031 IPW_ERROR("Failed to up device\n");
2036 static void ipw_bg_adapter_restart(void *data)
2038 struct ipw_priv *priv = data;
2040 ipw_adapter_restart(data);
2044 #define IPW_SCAN_CHECK_WATCHDOG (5 * HZ)
2046 static void ipw_scan_check(void *data)
2048 struct ipw_priv *priv = data;
2049 if (priv->status & (STATUS_SCANNING | STATUS_SCAN_ABORTING)) {
2050 IPW_DEBUG_SCAN("Scan completion watchdog resetting "
2051 "adapter (%dms).\n",
2052 IPW_SCAN_CHECK_WATCHDOG / 100);
2053 queue_work(priv->workqueue, &priv->adapter_restart);
2057 static void ipw_bg_scan_check(void *data)
2059 struct ipw_priv *priv = data;
2061 ipw_scan_check(data);
2065 static int ipw_send_scan_request_ext(struct ipw_priv *priv,
2066 struct ipw_scan_request_ext *request)
2068 struct host_cmd cmd = {
2069 .cmd = IPW_CMD_SCAN_REQUEST_EXT,
2070 .len = sizeof(*request)
2073 memcpy(cmd.param, request, sizeof(*request));
2074 return ipw_send_cmd(priv, &cmd);
2077 static int ipw_send_scan_abort(struct ipw_priv *priv)
2079 struct host_cmd cmd = {
2080 .cmd = IPW_CMD_SCAN_ABORT,
2085 IPW_ERROR("Invalid args\n");
2089 return ipw_send_cmd(priv, &cmd);
2092 static int ipw_set_sensitivity(struct ipw_priv *priv, u16 sens)
2094 struct host_cmd cmd = {
2095 .cmd = IPW_CMD_SENSITIVITY_CALIB,
2096 .len = sizeof(struct ipw_sensitivity_calib)
2098 struct ipw_sensitivity_calib *calib = (struct ipw_sensitivity_calib *)
2100 calib->beacon_rssi_raw = sens;
2101 return ipw_send_cmd(priv, &cmd);
2104 static int ipw_send_associate(struct ipw_priv *priv,
2105 struct ipw_associate *associate)
2107 struct host_cmd cmd = {
2108 .cmd = IPW_CMD_ASSOCIATE,
2109 .len = sizeof(*associate)
2112 struct ipw_associate tmp_associate;
2113 memcpy(&tmp_associate, associate, sizeof(*associate));
2114 tmp_associate.policy_support =
2115 cpu_to_le16(tmp_associate.policy_support);
2116 tmp_associate.assoc_tsf_msw = cpu_to_le32(tmp_associate.assoc_tsf_msw);
2117 tmp_associate.assoc_tsf_lsw = cpu_to_le32(tmp_associate.assoc_tsf_lsw);
2118 tmp_associate.capability = cpu_to_le16(tmp_associate.capability);
2119 tmp_associate.listen_interval =
2120 cpu_to_le16(tmp_associate.listen_interval);
2121 tmp_associate.beacon_interval =
2122 cpu_to_le16(tmp_associate.beacon_interval);
2123 tmp_associate.atim_window = cpu_to_le16(tmp_associate.atim_window);
2125 if (!priv || !associate) {
2126 IPW_ERROR("Invalid args\n");
2130 memcpy(cmd.param, &tmp_associate, sizeof(*associate));
2131 return ipw_send_cmd(priv, &cmd);
2134 static int ipw_send_supported_rates(struct ipw_priv *priv,
2135 struct ipw_supported_rates *rates)
2137 struct host_cmd cmd = {
2138 .cmd = IPW_CMD_SUPPORTED_RATES,
2139 .len = sizeof(*rates)
2142 if (!priv || !rates) {
2143 IPW_ERROR("Invalid args\n");
2147 memcpy(cmd.param, rates, sizeof(*rates));
2148 return ipw_send_cmd(priv, &cmd);
2151 static int ipw_set_random_seed(struct ipw_priv *priv)
2153 struct host_cmd cmd = {
2154 .cmd = IPW_CMD_SEED_NUMBER,
2159 IPW_ERROR("Invalid args\n");
2163 get_random_bytes(&cmd.param, sizeof(u32));
2165 return ipw_send_cmd(priv, &cmd);
2168 static int ipw_send_card_disable(struct ipw_priv *priv, u32 phy_off)
2170 struct host_cmd cmd = {
2171 .cmd = IPW_CMD_CARD_DISABLE,
2176 IPW_ERROR("Invalid args\n");
2180 *((u32 *) & cmd.param) = phy_off;
2182 return ipw_send_cmd(priv, &cmd);
2185 static int ipw_send_tx_power(struct ipw_priv *priv, struct ipw_tx_power *power)
2187 struct host_cmd cmd = {
2188 .cmd = IPW_CMD_TX_POWER,
2189 .len = sizeof(*power)
2192 if (!priv || !power) {
2193 IPW_ERROR("Invalid args\n");
2197 memcpy(cmd.param, power, sizeof(*power));
2198 return ipw_send_cmd(priv, &cmd);
2201 static int ipw_set_tx_power(struct ipw_priv *priv)
2203 const struct ieee80211_geo *geo = ipw_get_geo(priv->ieee);
2204 struct ipw_tx_power tx_power;
2208 memset(&tx_power, 0, sizeof(tx_power));
2210 /* configure device for 'G' band */
2211 tx_power.ieee_mode = IPW_G_MODE;
2212 tx_power.num_channels = geo->bg_channels;
2213 for (i = 0; i < geo->bg_channels; i++) {
2214 max_power = geo->bg[i].max_power;
2215 tx_power.channels_tx_power[i].channel_number =
2217 tx_power.channels_tx_power[i].tx_power = max_power ?
2218 min(max_power, priv->tx_power) : priv->tx_power;
2220 if (ipw_send_tx_power(priv, &tx_power))
2223 /* configure device to also handle 'B' band */
2224 tx_power.ieee_mode = IPW_B_MODE;
2225 if (ipw_send_tx_power(priv, &tx_power))
2228 /* configure device to also handle 'A' band */
2229 if (priv->ieee->abg_true) {
2230 tx_power.ieee_mode = IPW_A_MODE;
2231 tx_power.num_channels = geo->a_channels;
2232 for (i = 0; i < tx_power.num_channels; i++) {
2233 max_power = geo->a[i].max_power;
2234 tx_power.channels_tx_power[i].channel_number =
2236 tx_power.channels_tx_power[i].tx_power = max_power ?
2237 min(max_power, priv->tx_power) : priv->tx_power;
2239 if (ipw_send_tx_power(priv, &tx_power))
2245 static int ipw_send_rts_threshold(struct ipw_priv *priv, u16 rts)
2247 struct ipw_rts_threshold rts_threshold = {
2248 .rts_threshold = rts,
2250 struct host_cmd cmd = {
2251 .cmd = IPW_CMD_RTS_THRESHOLD,
2252 .len = sizeof(rts_threshold)
2256 IPW_ERROR("Invalid args\n");
2260 memcpy(cmd.param, &rts_threshold, sizeof(rts_threshold));
2261 return ipw_send_cmd(priv, &cmd);
2264 static int ipw_send_frag_threshold(struct ipw_priv *priv, u16 frag)
2266 struct ipw_frag_threshold frag_threshold = {
2267 .frag_threshold = frag,
2269 struct host_cmd cmd = {
2270 .cmd = IPW_CMD_FRAG_THRESHOLD,
2271 .len = sizeof(frag_threshold)
2275 IPW_ERROR("Invalid args\n");
2279 memcpy(cmd.param, &frag_threshold, sizeof(frag_threshold));
2280 return ipw_send_cmd(priv, &cmd);
2283 static int ipw_send_power_mode(struct ipw_priv *priv, u32 mode)
2285 struct host_cmd cmd = {
2286 .cmd = IPW_CMD_POWER_MODE,
2289 u32 *param = (u32 *) (&cmd.param);
2292 IPW_ERROR("Invalid args\n");
2296 /* If on battery, set to 3, if AC set to CAM, else user
2299 case IPW_POWER_BATTERY:
2300 *param = IPW_POWER_INDEX_3;
2303 *param = IPW_POWER_MODE_CAM;
2310 return ipw_send_cmd(priv, &cmd);
2313 static int ipw_send_retry_limit(struct ipw_priv *priv, u8 slimit, u8 llimit)
2315 struct ipw_retry_limit retry_limit = {
2316 .short_retry_limit = slimit,
2317 .long_retry_limit = llimit
2319 struct host_cmd cmd = {
2320 .cmd = IPW_CMD_RETRY_LIMIT,
2321 .len = sizeof(retry_limit)
2325 IPW_ERROR("Invalid args\n");
2329 memcpy(cmd.param, &retry_limit, sizeof(retry_limit));
2330 return ipw_send_cmd(priv, &cmd);
2334 * The IPW device contains a Microwire compatible EEPROM that stores
2335 * various data like the MAC address. Usually the firmware has exclusive
2336 * access to the eeprom, but during device initialization (before the
2337 * device driver has sent the HostComplete command to the firmware) the
2338 * device driver has read access to the EEPROM by way of indirect addressing
2339 * through a couple of memory mapped registers.
2341 * The following is a simplified implementation for pulling data out of the
2342 * the eeprom, along with some helper functions to find information in
2343 * the per device private data's copy of the eeprom.
2345 * NOTE: To better understand how these functions work (i.e what is a chip
2346 * select and why do have to keep driving the eeprom clock?), read
2347 * just about any data sheet for a Microwire compatible EEPROM.
2350 /* write a 32 bit value into the indirect accessor register */
2351 static inline void eeprom_write_reg(struct ipw_priv *p, u32 data)
2353 ipw_write_reg32(p, FW_MEM_REG_EEPROM_ACCESS, data);
2355 /* the eeprom requires some time to complete the operation */
2356 udelay(p->eeprom_delay);
2361 /* perform a chip select operation */
2362 static inline void eeprom_cs(struct ipw_priv *priv)
2364 eeprom_write_reg(priv, 0);
2365 eeprom_write_reg(priv, EEPROM_BIT_CS);
2366 eeprom_write_reg(priv, EEPROM_BIT_CS | EEPROM_BIT_SK);
2367 eeprom_write_reg(priv, EEPROM_BIT_CS);
2370 /* perform a chip select operation */
2371 static inline void eeprom_disable_cs(struct ipw_priv *priv)
2373 eeprom_write_reg(priv, EEPROM_BIT_CS);
2374 eeprom_write_reg(priv, 0);
2375 eeprom_write_reg(priv, EEPROM_BIT_SK);
2378 /* push a single bit down to the eeprom */
2379 static inline void eeprom_write_bit(struct ipw_priv *p, u8 bit)
2381 int d = (bit ? EEPROM_BIT_DI : 0);
2382 eeprom_write_reg(p, EEPROM_BIT_CS | d);
2383 eeprom_write_reg(p, EEPROM_BIT_CS | d | EEPROM_BIT_SK);
2386 /* push an opcode followed by an address down to the eeprom */
2387 static void eeprom_op(struct ipw_priv *priv, u8 op, u8 addr)
2392 eeprom_write_bit(priv, 1);
2393 eeprom_write_bit(priv, op & 2);
2394 eeprom_write_bit(priv, op & 1);
2395 for (i = 7; i >= 0; i--) {
2396 eeprom_write_bit(priv, addr & (1 << i));
2400 /* pull 16 bits off the eeprom, one bit at a time */
2401 static u16 eeprom_read_u16(struct ipw_priv *priv, u8 addr)
2406 /* Send READ Opcode */
2407 eeprom_op(priv, EEPROM_CMD_READ, addr);
2409 /* Send dummy bit */
2410 eeprom_write_reg(priv, EEPROM_BIT_CS);
2412 /* Read the byte off the eeprom one bit at a time */
2413 for (i = 0; i < 16; i++) {
2415 eeprom_write_reg(priv, EEPROM_BIT_CS | EEPROM_BIT_SK);
2416 eeprom_write_reg(priv, EEPROM_BIT_CS);
2417 data = ipw_read_reg32(priv, FW_MEM_REG_EEPROM_ACCESS);
2418 r = (r << 1) | ((data & EEPROM_BIT_DO) ? 1 : 0);
2421 /* Send another dummy bit */
2422 eeprom_write_reg(priv, 0);
2423 eeprom_disable_cs(priv);
2428 /* helper function for pulling the mac address out of the private */
2429 /* data's copy of the eeprom data */
2430 static void eeprom_parse_mac(struct ipw_priv *priv, u8 * mac)
2432 memcpy(mac, &priv->eeprom[EEPROM_MAC_ADDRESS], 6);
2436 * Either the device driver (i.e. the host) or the firmware can
2437 * load eeprom data into the designated region in SRAM. If neither
2438 * happens then the FW will shutdown with a fatal error.
2440 * In order to signal the FW to load the EEPROM, the EEPROM_LOAD_DISABLE
2441 * bit needs region of shared SRAM needs to be non-zero.
2443 static void ipw_eeprom_init_sram(struct ipw_priv *priv)
2446 u16 *eeprom = (u16 *) priv->eeprom;
2448 IPW_DEBUG_TRACE(">>\n");
2450 /* read entire contents of eeprom into private buffer */
2451 for (i = 0; i < 128; i++)
2452 eeprom[i] = le16_to_cpu(eeprom_read_u16(priv, (u8) i));
2455 If the data looks correct, then copy it to our private
2456 copy. Otherwise let the firmware know to perform the operation
2459 if ((priv->eeprom + EEPROM_VERSION) != 0) {
2460 IPW_DEBUG_INFO("Writing EEPROM data into SRAM\n");
2462 /* write the eeprom data to sram */
2463 for (i = 0; i < IPW_EEPROM_IMAGE_SIZE; i++)
2464 ipw_write8(priv, IPW_EEPROM_DATA + i, priv->eeprom[i]);
2466 /* Do not load eeprom data on fatal error or suspend */
2467 ipw_write32(priv, IPW_EEPROM_LOAD_DISABLE, 0);
2469 IPW_DEBUG_INFO("Enabling FW initializationg of SRAM\n");
2471 /* Load eeprom data on fatal error or suspend */
2472 ipw_write32(priv, IPW_EEPROM_LOAD_DISABLE, 1);
2475 IPW_DEBUG_TRACE("<<\n");
2478 static inline void ipw_zero_memory(struct ipw_priv *priv, u32 start, u32 count)
2483 _ipw_write32(priv, IPW_AUTOINC_ADDR, start);
2485 _ipw_write32(priv, IPW_AUTOINC_DATA, 0);
2488 static inline void ipw_fw_dma_reset_command_blocks(struct ipw_priv *priv)
2490 ipw_zero_memory(priv, IPW_SHARED_SRAM_DMA_CONTROL,
2491 CB_NUMBER_OF_ELEMENTS_SMALL *
2492 sizeof(struct command_block));
2495 static int ipw_fw_dma_enable(struct ipw_priv *priv)
2496 { /* start dma engine but no transfers yet */
2498 IPW_DEBUG_FW(">> : \n");
2501 ipw_fw_dma_reset_command_blocks(priv);
2503 /* Write CB base address */
2504 ipw_write_reg32(priv, IPW_DMA_I_CB_BASE, IPW_SHARED_SRAM_DMA_CONTROL);
2506 IPW_DEBUG_FW("<< : \n");
2510 static void ipw_fw_dma_abort(struct ipw_priv *priv)
2514 IPW_DEBUG_FW(">> :\n");
2516 //set the Stop and Abort bit
2517 control = DMA_CONTROL_SMALL_CB_CONST_VALUE | DMA_CB_STOP_AND_ABORT;
2518 ipw_write_reg32(priv, IPW_DMA_I_DMA_CONTROL, control);
2519 priv->sram_desc.last_cb_index = 0;
2521 IPW_DEBUG_FW("<< \n");
2524 static int ipw_fw_dma_write_command_block(struct ipw_priv *priv, int index,
2525 struct command_block *cb)
2528 IPW_SHARED_SRAM_DMA_CONTROL +
2529 (sizeof(struct command_block) * index);
2530 IPW_DEBUG_FW(">> :\n");
2532 ipw_write_indirect(priv, address, (u8 *) cb,
2533 (int)sizeof(struct command_block));
2535 IPW_DEBUG_FW("<< :\n");
2540 static int ipw_fw_dma_kick(struct ipw_priv *priv)
2545 IPW_DEBUG_FW(">> :\n");
2547 for (index = 0; index < priv->sram_desc.last_cb_index; index++)
2548 ipw_fw_dma_write_command_block(priv, index,
2549 &priv->sram_desc.cb_list[index]);
2551 /* Enable the DMA in the CSR register */
2552 ipw_clear_bit(priv, IPW_RESET_REG,
2553 IPW_RESET_REG_MASTER_DISABLED |
2554 IPW_RESET_REG_STOP_MASTER);
2556 /* Set the Start bit. */
2557 control = DMA_CONTROL_SMALL_CB_CONST_VALUE | DMA_CB_START;
2558 ipw_write_reg32(priv, IPW_DMA_I_DMA_CONTROL, control);
2560 IPW_DEBUG_FW("<< :\n");
2564 static void ipw_fw_dma_dump_command_block(struct ipw_priv *priv)
2567 u32 register_value = 0;
2568 u32 cb_fields_address = 0;
2570 IPW_DEBUG_FW(">> :\n");
2571 address = ipw_read_reg32(priv, IPW_DMA_I_CURRENT_CB);
2572 IPW_DEBUG_FW_INFO("Current CB is 0x%x \n", address);
2574 /* Read the DMA Controlor register */
2575 register_value = ipw_read_reg32(priv, IPW_DMA_I_DMA_CONTROL);
2576 IPW_DEBUG_FW_INFO("IPW_DMA_I_DMA_CONTROL is 0x%x \n", register_value);
2578 /* Print the CB values */
2579 cb_fields_address = address;
2580 register_value = ipw_read_reg32(priv, cb_fields_address);
2581 IPW_DEBUG_FW_INFO("Current CB ControlField is 0x%x \n", register_value);
2583 cb_fields_address += sizeof(u32);
2584 register_value = ipw_read_reg32(priv, cb_fields_address);
2585 IPW_DEBUG_FW_INFO("Current CB Source Field is 0x%x \n", register_value);
2587 cb_fields_address += sizeof(u32);
2588 register_value = ipw_read_reg32(priv, cb_fields_address);
2589 IPW_DEBUG_FW_INFO("Current CB Destination Field is 0x%x \n",
2592 cb_fields_address += sizeof(u32);
2593 register_value = ipw_read_reg32(priv, cb_fields_address);
2594 IPW_DEBUG_FW_INFO("Current CB Status Field is 0x%x \n", register_value);
2596 IPW_DEBUG_FW(">> :\n");
2599 static int ipw_fw_dma_command_block_index(struct ipw_priv *priv)
2601 u32 current_cb_address = 0;
2602 u32 current_cb_index = 0;
2604 IPW_DEBUG_FW("<< :\n");
2605 current_cb_address = ipw_read_reg32(priv, IPW_DMA_I_CURRENT_CB);
2607 current_cb_index = (current_cb_address - IPW_SHARED_SRAM_DMA_CONTROL) /
2608 sizeof(struct command_block);
2610 IPW_DEBUG_FW_INFO("Current CB index 0x%x address = 0x%X \n",
2611 current_cb_index, current_cb_address);
2613 IPW_DEBUG_FW(">> :\n");
2614 return current_cb_index;
2618 static int ipw_fw_dma_add_command_block(struct ipw_priv *priv,
2622 int interrupt_enabled, int is_last)
2625 u32 control = CB_VALID | CB_SRC_LE | CB_DEST_LE | CB_SRC_AUTOINC |
2626 CB_SRC_IO_GATED | CB_DEST_AUTOINC | CB_SRC_SIZE_LONG |
2628 struct command_block *cb;
2629 u32 last_cb_element = 0;
2631 IPW_DEBUG_FW_INFO("src_address=0x%x dest_address=0x%x length=0x%x\n",
2632 src_address, dest_address, length);
2634 if (priv->sram_desc.last_cb_index >= CB_NUMBER_OF_ELEMENTS_SMALL)
2637 last_cb_element = priv->sram_desc.last_cb_index;
2638 cb = &priv->sram_desc.cb_list[last_cb_element];
2639 priv->sram_desc.last_cb_index++;
2641 /* Calculate the new CB control word */
2642 if (interrupt_enabled)
2643 control |= CB_INT_ENABLED;
2646 control |= CB_LAST_VALID;
2650 /* Calculate the CB Element's checksum value */
2651 cb->status = control ^ src_address ^ dest_address;
2653 /* Copy the Source and Destination addresses */
2654 cb->dest_addr = dest_address;
2655 cb->source_addr = src_address;
2657 /* Copy the Control Word last */
2658 cb->control = control;
2663 static int ipw_fw_dma_add_buffer(struct ipw_priv *priv,
2664 u32 src_phys, u32 dest_address, u32 length)
2666 u32 bytes_left = length;
2668 u32 dest_offset = 0;
2670 IPW_DEBUG_FW(">> \n");
2671 IPW_DEBUG_FW_INFO("src_phys=0x%x dest_address=0x%x length=0x%x\n",
2672 src_phys, dest_address, length);
2673 while (bytes_left > CB_MAX_LENGTH) {
2674 status = ipw_fw_dma_add_command_block(priv,
2675 src_phys + src_offset,
2678 CB_MAX_LENGTH, 0, 0);
2680 IPW_DEBUG_FW_INFO(": Failed\n");
2683 IPW_DEBUG_FW_INFO(": Added new cb\n");
2685 src_offset += CB_MAX_LENGTH;
2686 dest_offset += CB_MAX_LENGTH;
2687 bytes_left -= CB_MAX_LENGTH;
2690 /* add the buffer tail */
2691 if (bytes_left > 0) {
2693 ipw_fw_dma_add_command_block(priv, src_phys + src_offset,
2694 dest_address + dest_offset,
2697 IPW_DEBUG_FW_INFO(": Failed on the buffer tail\n");
2701 (": Adding new cb - the buffer tail\n");
2704 IPW_DEBUG_FW("<< \n");
2708 static int ipw_fw_dma_wait(struct ipw_priv *priv)
2710 u32 current_index = 0;
2713 IPW_DEBUG_FW(">> : \n");
2715 current_index = ipw_fw_dma_command_block_index(priv);
2716 IPW_DEBUG_FW_INFO("sram_desc.last_cb_index:0x%8X\n",
2717 (int)priv->sram_desc.last_cb_index);
2719 while (current_index < priv->sram_desc.last_cb_index) {
2721 current_index = ipw_fw_dma_command_block_index(priv);
2725 if (watchdog > 400) {
2726 IPW_DEBUG_FW_INFO("Timeout\n");
2727 ipw_fw_dma_dump_command_block(priv);
2728 ipw_fw_dma_abort(priv);
2733 ipw_fw_dma_abort(priv);
2735 /*Disable the DMA in the CSR register */
2736 ipw_set_bit(priv, IPW_RESET_REG,
2737 IPW_RESET_REG_MASTER_DISABLED | IPW_RESET_REG_STOP_MASTER);
2739 IPW_DEBUG_FW("<< dmaWaitSync \n");
2743 static void ipw_remove_current_network(struct ipw_priv *priv)
2745 struct list_head *element, *safe;
2746 struct ieee80211_network *network = NULL;
2747 unsigned long flags;
2749 spin_lock_irqsave(&priv->ieee->lock, flags);
2750 list_for_each_safe(element, safe, &priv->ieee->network_list) {
2751 network = list_entry(element, struct ieee80211_network, list);
2752 if (!memcmp(network->bssid, priv->bssid, ETH_ALEN)) {
2754 list_add_tail(&network->list,
2755 &priv->ieee->network_free_list);
2758 spin_unlock_irqrestore(&priv->ieee->lock, flags);
2762 * Check that card is still alive.
2763 * Reads debug register from domain0.
2764 * If card is present, pre-defined value should
2768 * @return 1 if card is present, 0 otherwise
2770 static inline int ipw_alive(struct ipw_priv *priv)
2772 return ipw_read32(priv, 0x90) == 0xd55555d5;
2775 static inline int ipw_poll_bit(struct ipw_priv *priv, u32 addr, u32 mask,
2781 if ((ipw_read32(priv, addr) & mask) == mask)
2785 } while (i < timeout);
2790 /* These functions load the firmware and micro code for the operation of
2791 * the ipw hardware. It assumes the buffer has all the bits for the
2792 * image and the caller is handling the memory allocation and clean up.
2795 static int ipw_stop_master(struct ipw_priv *priv)
2799 IPW_DEBUG_TRACE(">> \n");
2800 /* stop master. typical delay - 0 */
2801 ipw_set_bit(priv, IPW_RESET_REG, IPW_RESET_REG_STOP_MASTER);
2803 rc = ipw_poll_bit(priv, IPW_RESET_REG,
2804 IPW_RESET_REG_MASTER_DISABLED, 100);
2806 IPW_ERROR("stop master failed in 10ms\n");
2810 IPW_DEBUG_INFO("stop master %dms\n", rc);
2815 static void ipw_arc_release(struct ipw_priv *priv)
2817 IPW_DEBUG_TRACE(">> \n");
2820 ipw_clear_bit(priv, IPW_RESET_REG, CBD_RESET_REG_PRINCETON_RESET);
2822 /* no one knows timing, for safety add some delay */
2836 #define IPW_FW_MAJOR_VERSION 2
2837 #define IPW_FW_MINOR_VERSION 3
2839 #define IPW_FW_MINOR(x) ((x & 0xff) >> 8)
2840 #define IPW_FW_MAJOR(x) (x & 0xff)
2842 #define IPW_FW_VERSION ((IPW_FW_MINOR_VERSION << 8) | IPW_FW_MAJOR_VERSION)
2844 #define IPW_FW_PREFIX "ipw-" __stringify(IPW_FW_MAJOR_VERSION) \
2845 "." __stringify(IPW_FW_MINOR_VERSION) "-"
2847 #if IPW_FW_MAJOR_VERSION >= 2 && IPW_FW_MINOR_VERSION > 0
2848 #define IPW_FW_NAME(x) IPW_FW_PREFIX "" x ".fw"
2850 #define IPW_FW_NAME(x) "ipw2200_" x ".fw"
2853 static int ipw_load_ucode(struct ipw_priv *priv, u8 * data, size_t len)
2855 int rc = 0, i, addr;
2859 image = (u16 *) data;
2861 IPW_DEBUG_TRACE(">> \n");
2863 rc = ipw_stop_master(priv);
2868 // spin_lock_irqsave(&priv->lock, flags);
2870 for (addr = IPW_SHARED_LOWER_BOUND;
2871 addr < IPW_REGISTER_DOMAIN1_END; addr += 4) {
2872 ipw_write32(priv, addr, 0);
2875 /* no ucode (yet) */
2876 memset(&priv->dino_alive, 0, sizeof(priv->dino_alive));
2877 /* destroy DMA queues */
2878 /* reset sequence */
2880 ipw_write_reg32(priv, IPW_MEM_HALT_AND_RESET, IPW_BIT_HALT_RESET_ON);
2881 ipw_arc_release(priv);
2882 ipw_write_reg32(priv, IPW_MEM_HALT_AND_RESET, IPW_BIT_HALT_RESET_OFF);
2886 ipw_write_reg32(priv, IPW_INTERNAL_CMD_EVENT, IPW_BASEBAND_POWER_DOWN);
2889 ipw_write_reg32(priv, IPW_INTERNAL_CMD_EVENT, 0);
2892 /* enable ucode store */
2893 ipw_write_reg8(priv, DINO_CONTROL_REG, 0x0);
2894 ipw_write_reg8(priv, DINO_CONTROL_REG, DINO_ENABLE_CS);
2900 * Do NOT set indirect address register once and then
2901 * store data to indirect data register in the loop.
2902 * It seems very reasonable, but in this case DINO do not
2903 * accept ucode. It is essential to set address each time.
2905 /* load new ipw uCode */
2906 for (i = 0; i < len / 2; i++)
2907 ipw_write_reg16(priv, IPW_BASEBAND_CONTROL_STORE,
2908 cpu_to_le16(image[i]));
2911 ipw_write_reg8(priv, IPW_BASEBAND_CONTROL_STATUS, 0);
2912 ipw_write_reg8(priv, IPW_BASEBAND_CONTROL_STATUS, DINO_ENABLE_SYSTEM);
2914 /* this is where the igx / win driver deveates from the VAP driver. */
2916 /* wait for alive response */
2917 for (i = 0; i < 100; i++) {
2918 /* poll for incoming data */
2919 cr = ipw_read_reg8(priv, IPW_BASEBAND_CONTROL_STATUS);
2920 if (cr & DINO_RXFIFO_DATA)
2925 if (cr & DINO_RXFIFO_DATA) {
2926 /* alive_command_responce size is NOT multiple of 4 */
2927 u32 response_buffer[(sizeof(priv->dino_alive) + 3) / 4];
2929 for (i = 0; i < ARRAY_SIZE(response_buffer); i++)
2930 response_buffer[i] =
2931 le32_to_cpu(ipw_read_reg32(priv,
2932 IPW_BASEBAND_RX_FIFO_READ));
2933 memcpy(&priv->dino_alive, response_buffer,
2934 sizeof(priv->dino_alive));
2935 if (priv->dino_alive.alive_command == 1
2936 && priv->dino_alive.ucode_valid == 1) {
2939 ("Microcode OK, rev. %d (0x%x) dev. %d (0x%x) "
2940 "of %02d/%02d/%02d %02d:%02d\n",
2941 priv->dino_alive.software_revision,
2942 priv->dino_alive.software_revision,
2943 priv->dino_alive.device_identifier,
2944 priv->dino_alive.device_identifier,
2945 priv->dino_alive.time_stamp[0],
2946 priv->dino_alive.time_stamp[1],
2947 priv->dino_alive.time_stamp[2],
2948 priv->dino_alive.time_stamp[3],
2949 priv->dino_alive.time_stamp[4]);
2951 IPW_DEBUG_INFO("Microcode is not alive\n");
2955 IPW_DEBUG_INFO("No alive response from DINO\n");
2959 /* disable DINO, otherwise for some reason
2960 firmware have problem getting alive resp. */
2961 ipw_write_reg8(priv, IPW_BASEBAND_CONTROL_STATUS, 0);
2963 // spin_unlock_irqrestore(&priv->lock, flags);
2968 static int ipw_load_firmware(struct ipw_priv *priv, u8 * data, size_t len)
2972 struct fw_chunk *chunk;
2973 dma_addr_t shared_phys;
2976 IPW_DEBUG_TRACE("<< : \n");
2977 shared_virt = pci_alloc_consistent(priv->pci_dev, len, &shared_phys);
2982 memmove(shared_virt, data, len);
2985 rc = ipw_fw_dma_enable(priv);
2987 if (priv->sram_desc.last_cb_index > 0) {
2988 /* the DMA is already ready this would be a bug. */
2994 chunk = (struct fw_chunk *)(data + offset);
2995 offset += sizeof(struct fw_chunk);
2996 /* build DMA packet and queue up for sending */
2997 /* dma to chunk->address, the chunk->length bytes from data +
3000 rc = ipw_fw_dma_add_buffer(priv, shared_phys + offset,
3001 le32_to_cpu(chunk->address),
3002 le32_to_cpu(chunk->length));
3004 IPW_DEBUG_INFO("dmaAddBuffer Failed\n");
3008 offset += le32_to_cpu(chunk->length);
3009 } while (offset < len);
3011 /* Run the DMA and wait for the answer */
3012 rc = ipw_fw_dma_kick(priv);
3014 IPW_ERROR("dmaKick Failed\n");
3018 rc = ipw_fw_dma_wait(priv);
3020 IPW_ERROR("dmaWaitSync Failed\n");
3024 pci_free_consistent(priv->pci_dev, len, shared_virt, shared_phys);
3029 static int ipw_stop_nic(struct ipw_priv *priv)
3034 ipw_write32(priv, IPW_RESET_REG, IPW_RESET_REG_STOP_MASTER);
3036 rc = ipw_poll_bit(priv, IPW_RESET_REG,
3037 IPW_RESET_REG_MASTER_DISABLED, 500);
3039 IPW_ERROR("wait for reg master disabled failed\n");
3043 ipw_set_bit(priv, IPW_RESET_REG, CBD_RESET_REG_PRINCETON_RESET);
3048 static void ipw_start_nic(struct ipw_priv *priv)
3050 IPW_DEBUG_TRACE(">>\n");
3052 /* prvHwStartNic release ARC */
3053 ipw_clear_bit(priv, IPW_RESET_REG,
3054 IPW_RESET_REG_MASTER_DISABLED |
3055 IPW_RESET_REG_STOP_MASTER |
3056 CBD_RESET_REG_PRINCETON_RESET);
3058 /* enable power management */
3059 ipw_set_bit(priv, IPW_GP_CNTRL_RW,
3060 IPW_GP_CNTRL_BIT_HOST_ALLOWS_STANDBY);
3062 IPW_DEBUG_TRACE("<<\n");
3065 static int ipw_init_nic(struct ipw_priv *priv)
3069 IPW_DEBUG_TRACE(">>\n");
3072 /* set "initialization complete" bit to move adapter to D0 state */
3073 ipw_set_bit(priv, IPW_GP_CNTRL_RW, IPW_GP_CNTRL_BIT_INIT_DONE);
3075 /* low-level PLL activation */
3076 ipw_write32(priv, IPW_READ_INT_REGISTER,
3077 IPW_BIT_INT_HOST_SRAM_READ_INT_REGISTER);
3079 /* wait for clock stabilization */
3080 rc = ipw_poll_bit(priv, IPW_GP_CNTRL_RW,
3081 IPW_GP_CNTRL_BIT_CLOCK_READY, 250);
3083 IPW_DEBUG_INFO("FAILED wait for clock stablization\n");
3085 /* assert SW reset */
3086 ipw_set_bit(priv, IPW_RESET_REG, IPW_RESET_REG_SW_RESET);
3090 /* set "initialization complete" bit to move adapter to D0 state */
3091 ipw_set_bit(priv, IPW_GP_CNTRL_RW, IPW_GP_CNTRL_BIT_INIT_DONE);
3093 IPW_DEBUG_TRACE(">>\n");
3097 /* Call this function from process context, it will sleep in request_firmware.
3098 * Probe is an ok place to call this from.
3100 static int ipw_reset_nic(struct ipw_priv *priv)
3103 unsigned long flags;
3105 IPW_DEBUG_TRACE(">>\n");
3107 rc = ipw_init_nic(priv);
3109 spin_lock_irqsave(&priv->lock, flags);
3110 /* Clear the 'host command active' bit... */
3111 priv->status &= ~STATUS_HCMD_ACTIVE;
3112 wake_up_interruptible(&priv->wait_command_queue);
3113 priv->status &= ~(STATUS_SCANNING | STATUS_SCAN_ABORTING);
3114 wake_up_interruptible(&priv->wait_state);
3115 spin_unlock_irqrestore(&priv->lock, flags);
3117 IPW_DEBUG_TRACE("<<\n");
3121 static int ipw_get_fw(struct ipw_priv *priv,
3122 const struct firmware **fw, const char *name)
3124 struct fw_header *header;
3127 /* ask firmware_class module to get the boot firmware off disk */
3128 rc = request_firmware(fw, name, &priv->pci_dev->dev);
3130 IPW_ERROR("%s load failed: Reason %d\n", name, rc);
3134 header = (struct fw_header *)(*fw)->data;
3135 if (IPW_FW_MAJOR(le32_to_cpu(header->version)) != IPW_FW_MAJOR_VERSION) {
3136 IPW_ERROR("'%s' firmware version not compatible (%d != %d)\n",
3138 IPW_FW_MAJOR(le32_to_cpu(header->version)),
3139 IPW_FW_MAJOR_VERSION);
3143 IPW_DEBUG_INFO("Loading firmware '%s' file v%d.%d (%zd bytes)\n",
3145 IPW_FW_MAJOR(le32_to_cpu(header->version)),
3146 IPW_FW_MINOR(le32_to_cpu(header->version)),
3147 (*fw)->size - sizeof(struct fw_header));
3151 #define IPW_RX_BUF_SIZE (3000)
3153 static inline void ipw_rx_queue_reset(struct ipw_priv *priv,
3154 struct ipw_rx_queue *rxq)
3156 unsigned long flags;
3159 spin_lock_irqsave(&rxq->lock, flags);
3161 INIT_LIST_HEAD(&rxq->rx_free);
3162 INIT_LIST_HEAD(&rxq->rx_used);
3164 /* Fill the rx_used queue with _all_ of the Rx buffers */
3165 for (i = 0; i < RX_FREE_BUFFERS + RX_QUEUE_SIZE; i++) {
3166 /* In the reset function, these buffers may have been allocated
3167 * to an SKB, so we need to unmap and free potential storage */
3168 if (rxq->pool[i].skb != NULL) {
3169 pci_unmap_single(priv->pci_dev, rxq->pool[i].dma_addr,
3170 IPW_RX_BUF_SIZE, PCI_DMA_FROMDEVICE);
3171 dev_kfree_skb(rxq->pool[i].skb);
3172 rxq->pool[i].skb = NULL;
3174 list_add_tail(&rxq->pool[i].list, &rxq->rx_used);
3177 /* Set us so that we have processed and used all buffers, but have
3178 * not restocked the Rx queue with fresh buffers */
3179 rxq->read = rxq->write = 0;
3180 rxq->processed = RX_QUEUE_SIZE - 1;
3181 rxq->free_count = 0;
3182 spin_unlock_irqrestore(&rxq->lock, flags);
3186 static int fw_loaded = 0;
3187 static const struct firmware *bootfw = NULL;
3188 static const struct firmware *firmware = NULL;
3189 static const struct firmware *ucode = NULL;
3191 static void free_firmware(void)
3194 release_firmware(bootfw);
3195 release_firmware(ucode);
3196 release_firmware(firmware);
3197 bootfw = ucode = firmware = NULL;
3202 #define free_firmware() do {} while (0)
3205 static int ipw_load(struct ipw_priv *priv)
3208 const struct firmware *bootfw = NULL;
3209 const struct firmware *firmware = NULL;
3210 const struct firmware *ucode = NULL;
3212 int rc = 0, retries = 3;
3217 rc = ipw_get_fw(priv, &bootfw, IPW_FW_NAME("boot"));
3221 switch (priv->ieee->iw_mode) {
3223 rc = ipw_get_fw(priv, &ucode,
3224 IPW_FW_NAME("ibss_ucode"));
3228 rc = ipw_get_fw(priv, &firmware, IPW_FW_NAME("ibss"));
3231 #ifdef CONFIG_IPW2200_MONITOR
3232 case IW_MODE_MONITOR:
3233 rc = ipw_get_fw(priv, &ucode,
3234 IPW_FW_NAME("sniffer_ucode"));
3238 rc = ipw_get_fw(priv, &firmware,
3239 IPW_FW_NAME("sniffer"));
3243 rc = ipw_get_fw(priv, &ucode, IPW_FW_NAME("bss_ucode"));
3247 rc = ipw_get_fw(priv, &firmware, IPW_FW_NAME("bss"));
3263 priv->rxq = ipw_rx_queue_alloc(priv);
3265 ipw_rx_queue_reset(priv, priv->rxq);
3267 IPW_ERROR("Unable to initialize Rx queue\n");
3272 /* Ensure interrupts are disabled */
3273 ipw_write32(priv, IPW_INTA_MASK_R, ~IPW_INTA_MASK_ALL);
3274 priv->status &= ~STATUS_INT_ENABLED;
3276 /* ack pending interrupts */
3277 ipw_write32(priv, IPW_INTA_RW, IPW_INTA_MASK_ALL);
3281 rc = ipw_reset_nic(priv);
3283 IPW_ERROR("Unable to reset NIC\n");
3287 ipw_zero_memory(priv, IPW_NIC_SRAM_LOWER_BOUND,
3288 IPW_NIC_SRAM_UPPER_BOUND - IPW_NIC_SRAM_LOWER_BOUND);
3290 /* DMA the initial boot firmware into the device */
3291 rc = ipw_load_firmware(priv, bootfw->data + sizeof(struct fw_header),
3292 bootfw->size - sizeof(struct fw_header));
3294 IPW_ERROR("Unable to load boot firmware\n");
3298 /* kick start the device */
3299 ipw_start_nic(priv);
3301 /* wait for the device to finish it's initial startup sequence */
3302 rc = ipw_poll_bit(priv, IPW_INTA_RW,
3303 IPW_INTA_BIT_FW_INITIALIZATION_DONE, 500);
3305 IPW_ERROR("device failed to boot initial fw image\n");
3308 IPW_DEBUG_INFO("initial device response after %dms\n", rc);
3310 /* ack fw init done interrupt */
3311 ipw_write32(priv, IPW_INTA_RW, IPW_INTA_BIT_FW_INITIALIZATION_DONE);
3313 /* DMA the ucode into the device */
3314 rc = ipw_load_ucode(priv, ucode->data + sizeof(struct fw_header),
3315 ucode->size - sizeof(struct fw_header));
3317 IPW_ERROR("Unable to load ucode\n");
3324 /* DMA bss firmware into the device */
3325 rc = ipw_load_firmware(priv, firmware->data +
3326 sizeof(struct fw_header),
3327 firmware->size - sizeof(struct fw_header));
3329 IPW_ERROR("Unable to load firmware\n");
3333 ipw_write32(priv, IPW_EEPROM_LOAD_DISABLE, 0);
3335 rc = ipw_queue_reset(priv);
3337 IPW_ERROR("Unable to initialize queues\n");
3341 /* Ensure interrupts are disabled */
3342 ipw_write32(priv, IPW_INTA_MASK_R, ~IPW_INTA_MASK_ALL);
3343 /* ack pending interrupts */
3344 ipw_write32(priv, IPW_INTA_RW, IPW_INTA_MASK_ALL);
3346 /* kick start the device */
3347 ipw_start_nic(priv);
3349 if (ipw_read32(priv, IPW_INTA_RW) & IPW_INTA_BIT_PARITY_ERROR) {
3351 IPW_WARNING("Parity error. Retrying init.\n");
3356 IPW_ERROR("TODO: Handle parity error -- schedule restart?\n");
3361 /* wait for the device */
3362 rc = ipw_poll_bit(priv, IPW_INTA_RW,
3363 IPW_INTA_BIT_FW_INITIALIZATION_DONE, 500);
3365 IPW_ERROR("device failed to start after 500ms\n");
3368 IPW_DEBUG_INFO("device response after %dms\n", rc);
3370 /* ack fw init done interrupt */
3371 ipw_write32(priv, IPW_INTA_RW, IPW_INTA_BIT_FW_INITIALIZATION_DONE);
3373 /* read eeprom data and initialize the eeprom region of sram */
3374 priv->eeprom_delay = 1;
3375 ipw_eeprom_init_sram(priv);
3377 /* enable interrupts */
3378 ipw_enable_interrupts(priv);
3380 /* Ensure our queue has valid packets */
3381 ipw_rx_queue_replenish(priv);
3383 ipw_write32(priv, IPW_RX_READ_INDEX, priv->rxq->read);
3385 /* ack pending interrupts */
3386 ipw_write32(priv, IPW_INTA_RW, IPW_INTA_MASK_ALL);
3389 release_firmware(bootfw);
3390 release_firmware(ucode);
3391 release_firmware(firmware);
3397 ipw_rx_queue_free(priv, priv->rxq);
3400 ipw_tx_queue_free(priv);
3402 release_firmware(bootfw);
3404 release_firmware(ucode);
3406 release_firmware(firmware);
3409 bootfw = ucode = firmware = NULL;
3418 * Theory of operation
3420 * A queue is a circular buffers with 'Read' and 'Write' pointers.
3421 * 2 empty entries always kept in the buffer to protect from overflow.
3423 * For Tx queue, there are low mark and high mark limits. If, after queuing
3424 * the packet for Tx, free space become < low mark, Tx queue stopped. When
3425 * reclaiming packets (on 'tx done IRQ), if free space become > high mark,
3428 * The IPW operates with six queues, one receive queue in the device's
3429 * sram, one transmit queue for sending commands to the device firmware,
3430 * and four transmit queues for data.
3432 * The four transmit queues allow for performing quality of service (qos)
3433 * transmissions as per the 802.11 protocol. Currently Linux does not
3434 * provide a mechanism to the user for utilizing prioritized queues, so
3435 * we only utilize the first data transmit queue (queue1).
3439 * Driver allocates buffers of this size for Rx
3442 static inline int ipw_queue_space(const struct clx2_queue *q)
3444 int s = q->last_used - q->first_empty;
3447 s -= 2; /* keep some reserve to not confuse empty and full situations */
3453 static inline int ipw_queue_inc_wrap(int index, int n_bd)
3455 return (++index == n_bd) ? 0 : index;
3459 * Initialize common DMA queue structure
3461 * @param q queue to init
3462 * @param count Number of BD's to allocate. Should be power of 2
3463 * @param read_register Address for 'read' register
3464 * (not offset within BAR, full address)
3465 * @param write_register Address for 'write' register
3466 * (not offset within BAR, full address)
3467 * @param base_register Address for 'base' register
3468 * (not offset within BAR, full address)
3469 * @param size Address for 'size' register
3470 * (not offset within BAR, full address)
3472 static void ipw_queue_init(struct ipw_priv *priv, struct clx2_queue *q,
3473 int count, u32 read, u32 write, u32 base, u32 size)
3477 q->low_mark = q->n_bd / 4;
3478 if (q->low_mark < 4)
3481 q->high_mark = q->n_bd / 8;
3482 if (q->high_mark < 2)
3485 q->first_empty = q->last_used = 0;
3489 ipw_write32(priv, base, q->dma_addr);
3490 ipw_write32(priv, size, count);
3491 ipw_write32(priv, read, 0);
3492 ipw_write32(priv, write, 0);
3494 _ipw_read32(priv, 0x90);
3497 static int ipw_queue_tx_init(struct ipw_priv *priv,
3498 struct clx2_tx_queue *q,
3499 int count, u32 read, u32 write, u32 base, u32 size)
3501 struct pci_dev *dev = priv->pci_dev;
3503 q->txb = kmalloc(sizeof(q->txb[0]) * count, GFP_KERNEL);
3505 IPW_ERROR("vmalloc for auxilary BD structures failed\n");
3510 pci_alloc_consistent(dev, sizeof(q->bd[0]) * count, &q->q.dma_addr);
3512 IPW_ERROR("pci_alloc_consistent(%zd) failed\n",
3513 sizeof(q->bd[0]) * count);
3519 ipw_queue_init(priv, &q->q, count, read, write, base, size);
3524 * Free one TFD, those at index [txq->q.last_used].
3525 * Do NOT advance any indexes
3530 static void ipw_queue_tx_free_tfd(struct ipw_priv *priv,
3531 struct clx2_tx_queue *txq)
3533 struct tfd_frame *bd = &txq->bd[txq->q.last_used];
3534 struct pci_dev *dev = priv->pci_dev;
3538 if (bd->control_flags.message_type == TX_HOST_COMMAND_TYPE)
3539 /* nothing to cleanup after for host commands */
3543 if (le32_to_cpu(bd->u.data.num_chunks) > NUM_TFD_CHUNKS) {
3544 IPW_ERROR("Too many chunks: %i\n",
3545 le32_to_cpu(bd->u.data.num_chunks));
3546 /** @todo issue fatal error, it is quite serious situation */
3550 /* unmap chunks if any */
3551 for (i = 0; i < le32_to_cpu(bd->u.data.num_chunks); i++) {
3552 pci_unmap_single(dev, le32_to_cpu(bd->u.data.chunk_ptr[i]),
3553 le16_to_cpu(bd->u.data.chunk_len[i]),
3555 if (txq->txb[txq->q.last_used]) {
3556 ieee80211_txb_free(txq->txb[txq->q.last_used]);
3557 txq->txb[txq->q.last_used] = NULL;
3563 * Deallocate DMA queue.
3565 * Empty queue by removing and destroying all BD's.
3571 static void ipw_queue_tx_free(struct ipw_priv *priv, struct clx2_tx_queue *txq)
3573 struct clx2_queue *q = &txq->q;
3574 struct pci_dev *dev = priv->pci_dev;
3579 /* first, empty all BD's */
3580 for (; q->first_empty != q->last_used;
3581 q->last_used = ipw_queue_inc_wrap(q->last_used, q->n_bd)) {
3582 ipw_queue_tx_free_tfd(priv, txq);
3585 /* free buffers belonging to queue itself */
3586 pci_free_consistent(dev, sizeof(txq->bd[0]) * q->n_bd, txq->bd,
3590 /* 0 fill whole structure */
3591 memset(txq, 0, sizeof(*txq));
3595 * Destroy all DMA queues and structures
3599 static void ipw_tx_queue_free(struct ipw_priv *priv)
3602 ipw_queue_tx_free(priv, &priv->txq_cmd);
3605 ipw_queue_tx_free(priv, &priv->txq[0]);
3606 ipw_queue_tx_free(priv, &priv->txq[1]);
3607 ipw_queue_tx_free(priv, &priv->txq[2]);
3608 ipw_queue_tx_free(priv, &priv->txq[3]);
3611 static inline void ipw_create_bssid(struct ipw_priv *priv, u8 * bssid)
3613 /* First 3 bytes are manufacturer */
3614 bssid[0] = priv->mac_addr[0];
3615 bssid[1] = priv->mac_addr[1];
3616 bssid[2] = priv->mac_addr[2];
3618 /* Last bytes are random */
3619 get_random_bytes(&bssid[3], ETH_ALEN - 3);
3621 bssid[0] &= 0xfe; /* clear multicast bit */
3622 bssid[0] |= 0x02; /* set local assignment bit (IEEE802) */
3625 static inline u8 ipw_add_station(struct ipw_priv *priv, u8 * bssid)
3627 struct ipw_station_entry entry;
3630 for (i = 0; i < priv->num_stations; i++) {
3631 if (!memcmp(priv->stations[i], bssid, ETH_ALEN)) {
3632 /* Another node is active in network */
3633 priv->missed_adhoc_beacons = 0;
3634 if (!(priv->config & CFG_STATIC_CHANNEL))
3635 /* when other nodes drop out, we drop out */
3636 priv->config &= ~CFG_ADHOC_PERSIST;
3642 if (i == MAX_STATIONS)
3643 return IPW_INVALID_STATION;
3645 IPW_DEBUG_SCAN("Adding AdHoc station: " MAC_FMT "\n", MAC_ARG(bssid));
3648 entry.support_mode = 0;
3649 memcpy(entry.mac_addr, bssid, ETH_ALEN);
3650 memcpy(priv->stations[i], bssid, ETH_ALEN);
3651 ipw_write_direct(priv, IPW_STATION_TABLE_LOWER + i * sizeof(entry),
3652 &entry, sizeof(entry));
3653 priv->num_stations++;
3658 static inline u8 ipw_find_station(struct ipw_priv *priv, u8 * bssid)
3662 for (i = 0; i < priv->num_stations; i++)
3663 if (!memcmp(priv->stations[i], bssid, ETH_ALEN))
3666 return IPW_INVALID_STATION;
3669 static void ipw_send_disassociate(struct ipw_priv *priv, int quiet)
3673 if (!(priv->status & (STATUS_ASSOCIATING | STATUS_ASSOCIATED))) {
3674 IPW_DEBUG_ASSOC("Disassociating while not associated.\n");
3678 IPW_DEBUG_ASSOC("Disassocation attempt from " MAC_FMT " "
3680 MAC_ARG(priv->assoc_request.bssid),
3681 priv->assoc_request.channel);
3683 priv->status &= ~(STATUS_ASSOCIATING | STATUS_ASSOCIATED);
3684 priv->status |= STATUS_DISASSOCIATING;
3687 priv->assoc_request.assoc_type = HC_DISASSOC_QUIET;
3689 priv->assoc_request.assoc_type = HC_DISASSOCIATE;
3690 err = ipw_send_associate(priv, &priv->assoc_request);
3692 IPW_DEBUG_HC("Attempt to send [dis]associate command "
3699 static int ipw_disassociate(void *data)
3701 struct ipw_priv *priv = data;
3702 if (!(priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING)))
3704 ipw_send_disassociate(data, 0);
3708 static void ipw_bg_disassociate(void *data)
3710 struct ipw_priv *priv = data;
3712 ipw_disassociate(data);
3716 static void ipw_system_config(void *data)
3718 struct ipw_priv *priv = data;
3719 ipw_send_system_config(priv, &priv->sys_config);
3722 struct ipw_status_code {
3727 static const struct ipw_status_code ipw_status_codes[] = {
3728 {0x00, "Successful"},
3729 {0x01, "Unspecified failure"},
3730 {0x0A, "Cannot support all requested capabilities in the "
3731 "Capability information field"},
3732 {0x0B, "Reassociation denied due to inability to confirm that "
3733 "association exists"},
3734 {0x0C, "Association denied due to reason outside the scope of this "
3737 "Responding station does not support the specified authentication "
3740 "Received an Authentication frame with authentication sequence "
3741 "transaction sequence number out of expected sequence"},
3742 {0x0F, "Authentication rejected because of challenge failure"},
3743 {0x10, "Authentication rejected due to timeout waiting for next "
3744 "frame in sequence"},
3745 {0x11, "Association denied because AP is unable to handle additional "
3746 "associated stations"},
3748 "Association denied due to requesting station not supporting all "
3749 "of the datarates in the BSSBasicServiceSet Parameter"},
3751 "Association denied due to requesting station not supporting "
3752 "short preamble operation"},
3754 "Association denied due to requesting station not supporting "
3757 "Association denied due to requesting station not supporting "
3760 "Association denied due to requesting station not supporting "
3761 "short slot operation"},
3763 "Association denied due to requesting station not supporting "
3764 "DSSS-OFDM operation"},
3765 {0x28, "Invalid Information Element"},
3766 {0x29, "Group Cipher is not valid"},
3767 {0x2A, "Pairwise Cipher is not valid"},
3768 {0x2B, "AKMP is not valid"},
3769 {0x2C, "Unsupported RSN IE version"},
3770 {0x2D, "Invalid RSN IE Capabilities"},
3771 {0x2E, "Cipher suite is rejected per security policy"},
3774 #ifdef CONFIG_IPW_DEBUG
3775 static const char *ipw_get_status_code(u16 status)
3778 for (i = 0; i < ARRAY_SIZE(ipw_status_codes); i++)
3779 if (ipw_status_codes[i].status == (status & 0xff))
3780 return ipw_status_codes[i].reason;
3781 return "Unknown status value.";
3785 static void inline average_init(struct average *avg)
3787 memset(avg, 0, sizeof(*avg));
3790 static void inline average_add(struct average *avg, s16 val)
3792 avg->sum -= avg->entries[avg->pos];
3794 avg->entries[avg->pos++] = val;
3795 if (unlikely(avg->pos == AVG_ENTRIES)) {
3801 static s16 inline average_value(struct average *avg)
3803 if (!unlikely(avg->init)) {
3805 return avg->sum / avg->pos;
3809 return avg->sum / AVG_ENTRIES;
3812 static void ipw_reset_stats(struct ipw_priv *priv)
3814 u32 len = sizeof(u32);
3818 average_init(&priv->average_missed_beacons);
3819 average_init(&priv->average_rssi);
3820 average_init(&priv->average_noise);
3822 priv->last_rate = 0;
3823 priv->last_missed_beacons = 0;
3824 priv->last_rx_packets = 0;
3825 priv->last_tx_packets = 0;
3826 priv->last_tx_failures = 0;
3828 /* Firmware managed, reset only when NIC is restarted, so we have to
3829 * normalize on the current value */
3830 ipw_get_ordinal(priv, IPW_ORD_STAT_RX_ERR_CRC,
3831 &priv->last_rx_err, &len);
3832 ipw_get_ordinal(priv, IPW_ORD_STAT_TX_FAILURE,
3833 &priv->last_tx_failures, &len);
3835 /* Driver managed, reset with each association */
3836 priv->missed_adhoc_beacons = 0;
3837 priv->missed_beacons = 0;
3838 priv->tx_packets = 0;
3839 priv->rx_packets = 0;
3843 static inline u32 ipw_get_max_rate(struct ipw_priv *priv)
3846 u32 mask = priv->rates_mask;
3847 /* If currently associated in B mode, restrict the maximum
3848 * rate match to B rates */
3849 if (priv->assoc_request.ieee_mode == IPW_B_MODE)
3850 mask &= IEEE80211_CCK_RATES_MASK;
3852 /* TODO: Verify that the rate is supported by the current rates
3855 while (i && !(mask & i))
3858 case IEEE80211_CCK_RATE_1MB_MASK:
3860 case IEEE80211_CCK_RATE_2MB_MASK:
3862 case IEEE80211_CCK_RATE_5MB_MASK:
3864 case IEEE80211_OFDM_RATE_6MB_MASK:
3866 case IEEE80211_OFDM_RATE_9MB_MASK:
3868 case IEEE80211_CCK_RATE_11MB_MASK:
3870 case IEEE80211_OFDM_RATE_12MB_MASK:
3872 case IEEE80211_OFDM_RATE_18MB_MASK:
3874 case IEEE80211_OFDM_RATE_24MB_MASK:
3876 case IEEE80211_OFDM_RATE_36MB_MASK:
3878 case IEEE80211_OFDM_RATE_48MB_MASK:
3880 case IEEE80211_OFDM_RATE_54MB_MASK:
3884 if (priv->ieee->mode == IEEE_B)
3890 static u32 ipw_get_current_rate(struct ipw_priv *priv)
3892 u32 rate, len = sizeof(rate);
3895 if (!(priv->status & STATUS_ASSOCIATED))
3898 if (priv->tx_packets > IPW_REAL_RATE_RX_PACKET_THRESHOLD) {
3899 err = ipw_get_ordinal(priv, IPW_ORD_STAT_TX_CURR_RATE, &rate,
3902 IPW_DEBUG_INFO("failed querying ordinals.\n");
3906 return ipw_get_max_rate(priv);
3909 case IPW_TX_RATE_1MB:
3911 case IPW_TX_RATE_2MB:
3913 case IPW_TX_RATE_5MB:
3915 case IPW_TX_RATE_6MB:
3917 case IPW_TX_RATE_9MB:
3919 case IPW_TX_RATE_11MB:
3921 case IPW_TX_RATE_12MB:
3923 case IPW_TX_RATE_18MB:
3925 case IPW_TX_RATE_24MB:
3927 case IPW_TX_RATE_36MB:
3929 case IPW_TX_RATE_48MB:
3931 case IPW_TX_RATE_54MB:
3938 #define IPW_STATS_INTERVAL (2 * HZ)
3939 static void ipw_gather_stats(struct ipw_priv *priv)
3941 u32 rx_err, rx_err_delta, rx_packets_delta;
3942 u32 tx_failures, tx_failures_delta, tx_packets_delta;
3943 u32 missed_beacons_percent, missed_beacons_delta;
3945 u32 len = sizeof(u32);
3947 u32 beacon_quality, signal_quality, tx_quality, rx_quality,
3951 if (!(priv->status & STATUS_ASSOCIATED)) {
3956 /* Update the statistics */
3957 ipw_get_ordinal(priv, IPW_ORD_STAT_MISSED_BEACONS,
3958 &priv->missed_beacons, &len);
3959 missed_beacons_delta = priv->missed_beacons - priv->last_missed_beacons;
3960 priv->last_missed_beacons = priv->missed_beacons;
3961 if (priv->assoc_request.beacon_interval) {
3962 missed_beacons_percent = missed_beacons_delta *
3963 (HZ * priv->assoc_request.beacon_interval) /
3964 (IPW_STATS_INTERVAL * 10);
3966 missed_beacons_percent = 0;
3968 average_add(&priv->average_missed_beacons, missed_beacons_percent);
3970 ipw_get_ordinal(priv, IPW_ORD_STAT_RX_ERR_CRC, &rx_err, &len);
3971 rx_err_delta = rx_err - priv->last_rx_err;
3972 priv->last_rx_err = rx_err;
3974 ipw_get_ordinal(priv, IPW_ORD_STAT_TX_FAILURE, &tx_failures, &len);
3975 tx_failures_delta = tx_failures - priv->last_tx_failures;
3976 priv->last_tx_failures = tx_failures;
3978 rx_packets_delta = priv->rx_packets - priv->last_rx_packets;
3979 priv->last_rx_packets = priv->rx_packets;
3981 tx_packets_delta = priv->tx_packets - priv->last_tx_packets;
3982 priv->last_tx_packets = priv->tx_packets;
3984 /* Calculate quality based on the following:
3986 * Missed beacon: 100% = 0, 0% = 70% missed
3987 * Rate: 60% = 1Mbs, 100% = Max
3988 * Rx and Tx errors represent a straight % of total Rx/Tx
3989 * RSSI: 100% = > -50, 0% = < -80
3990 * Rx errors: 100% = 0, 0% = 50% missed
3992 * The lowest computed quality is used.
3995 #define BEACON_THRESHOLD 5
3996 beacon_quality = 100 - missed_beacons_percent;
3997 if (beacon_quality < BEACON_THRESHOLD)
4000 beacon_quality = (beacon_quality - BEACON_THRESHOLD) * 100 /
4001 (100 - BEACON_THRESHOLD);
4002 IPW_DEBUG_STATS("Missed beacon: %3d%% (%d%%)\n",
4003 beacon_quality, missed_beacons_percent);
4005 priv->last_rate = ipw_get_current_rate(priv);
4006 max_rate = ipw_get_max_rate(priv);
4007 rate_quality = priv->last_rate * 40 / max_rate + 60;
4008 IPW_DEBUG_STATS("Rate quality : %3d%% (%dMbs)\n",
4009 rate_quality, priv->last_rate / 1000000);
4011 if (rx_packets_delta > 100 && rx_packets_delta + rx_err_delta)
4012 rx_quality = 100 - (rx_err_delta * 100) /
4013 (rx_packets_delta + rx_err_delta);
4016 IPW_DEBUG_STATS("Rx quality : %3d%% (%u errors, %u packets)\n",
4017 rx_quality, rx_err_delta, rx_packets_delta);
4019 if (tx_packets_delta > 100 && tx_packets_delta + tx_failures_delta)
4020 tx_quality = 100 - (tx_failures_delta * 100) /
4021 (tx_packets_delta + tx_failures_delta);
4024 IPW_DEBUG_STATS("Tx quality : %3d%% (%u errors, %u packets)\n",
4025 tx_quality, tx_failures_delta, tx_packets_delta);
4027 rssi = average_value(&priv->average_rssi);
4030 (priv->ieee->perfect_rssi - priv->ieee->worst_rssi) *
4031 (priv->ieee->perfect_rssi - priv->ieee->worst_rssi) -
4032 (priv->ieee->perfect_rssi - rssi) *
4033 (15 * (priv->ieee->perfect_rssi - priv->ieee->worst_rssi) +
4034 62 * (priv->ieee->perfect_rssi - rssi))) /
4035 ((priv->ieee->perfect_rssi - priv->ieee->worst_rssi) *
4036 (priv->ieee->perfect_rssi - priv->ieee->worst_rssi));
4037 if (signal_quality > 100)
4038 signal_quality = 100;
4039 else if (signal_quality < 1)
4042 IPW_DEBUG_STATS("Signal level : %3d%% (%d dBm)\n",
4043 signal_quality, rssi);
4045 quality = min(beacon_quality,
4047 min(tx_quality, min(rx_quality, signal_quality))));
4048 if (quality == beacon_quality)
4049 IPW_DEBUG_STATS("Quality (%d%%): Clamped to missed beacons.\n",
4051 if (quality == rate_quality)
4052 IPW_DEBUG_STATS("Quality (%d%%): Clamped to rate quality.\n",
4054 if (quality == tx_quality)
4055 IPW_DEBUG_STATS("Quality (%d%%): Clamped to Tx quality.\n",
4057 if (quality == rx_quality)
4058 IPW_DEBUG_STATS("Quality (%d%%): Clamped to Rx quality.\n",
4060 if (quality == signal_quality)
4061 IPW_DEBUG_STATS("Quality (%d%%): Clamped to signal quality.\n",
4064 priv->quality = quality;
4066 queue_delayed_work(priv->workqueue, &priv->gather_stats,
4067 IPW_STATS_INTERVAL);
4070 static void ipw_bg_gather_stats(void *data)
4072 struct ipw_priv *priv = data;
4074 ipw_gather_stats(data);
4078 static inline void ipw_handle_missed_beacon(struct ipw_priv *priv,
4081 priv->notif_missed_beacons = missed_count;
4083 if (missed_count > priv->disassociate_threshold &&
4084 priv->status & STATUS_ASSOCIATED) {
4085 /* If associated and we've hit the missed
4086 * beacon threshold, disassociate, turn
4087 * off roaming, and abort any active scans */
4088 IPW_DEBUG(IPW_DL_INFO | IPW_DL_NOTIF |
4089 IPW_DL_STATE | IPW_DL_ASSOC,
4090 "Missed beacon: %d - disassociate\n", missed_count);
4091 priv->status &= ~STATUS_ROAMING;
4092 if (priv->status & STATUS_SCANNING) {
4093 IPW_DEBUG(IPW_DL_INFO | IPW_DL_NOTIF |
4095 "Aborting scan with missed beacon.\n");
4096 queue_work(priv->workqueue, &priv->abort_scan);
4099 queue_work(priv->workqueue, &priv->disassociate);
4103 if (priv->status & STATUS_ROAMING) {
4104 /* If we are currently roaming, then just
4105 * print a debug statement... */
4106 IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE,
4107 "Missed beacon: %d - roam in progress\n",
4112 if (missed_count > priv->roaming_threshold) {
4113 /* If we are not already roaming, set the ROAM
4114 * bit in the status and kick off a scan */
4115 IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE,
4116 "Missed beacon: %d - initiate "
4117 "roaming\n", missed_count);
4118 if (!(priv->status & STATUS_ROAMING)) {
4119 priv->status |= STATUS_ROAMING;
4120 if (!(priv->status & STATUS_SCANNING))
4121 queue_work(priv->workqueue,
4122 &priv->request_scan);
4127 if (priv->status & STATUS_SCANNING) {
4128 /* Stop scan to keep fw from getting
4129 * stuck (only if we aren't roaming --
4130 * otherwise we'll never scan more than 2 or 3
4132 IPW_DEBUG(IPW_DL_INFO | IPW_DL_NOTIF | IPW_DL_STATE,
4133 "Aborting scan with missed beacon.\n");
4134 queue_work(priv->workqueue, &priv->abort_scan);
4137 IPW_DEBUG_NOTIF("Missed beacon: %d\n", missed_count);
4142 * Handle host notification packet.
4143 * Called from interrupt routine
4145 static inline void ipw_rx_notification(struct ipw_priv *priv,
4146 struct ipw_rx_notification *notif)
4148 notif->size = le16_to_cpu(notif->size);
4150 IPW_DEBUG_NOTIF("type = %i (%d bytes)\n", notif->subtype, notif->size);
4152 switch (notif->subtype) {
4153 case HOST_NOTIFICATION_STATUS_ASSOCIATED:{
4154 struct notif_association *assoc = ¬if->u.assoc;
4156 switch (assoc->state) {
4157 case CMAS_ASSOCIATED:{
4158 IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE |
4160 "associated: '%s' " MAC_FMT
4162 escape_essid(priv->essid,
4164 MAC_ARG(priv->bssid));
4166 switch (priv->ieee->iw_mode) {
4168 memcpy(priv->ieee->bssid,
4169 priv->bssid, ETH_ALEN);
4173 memcpy(priv->ieee->bssid,
4174 priv->bssid, ETH_ALEN);
4176 /* clear out the station table */
4177 priv->num_stations = 0;
4180 ("queueing adhoc check\n");
4181 queue_delayed_work(priv->
4191 priv->status &= ~STATUS_ASSOCIATING;
4192 priv->status |= STATUS_ASSOCIATED;
4193 queue_work(priv->workqueue,
4194 &priv->system_config);
4196 #ifdef CONFIG_IPW_QOS
4197 #define IPW_GET_PACKET_STYPE(x) WLAN_FC_GET_STYPE( \
4198 le16_to_cpu(((struct ieee80211_hdr *)(x))->frame_ctl))
4199 if ((priv->status & STATUS_AUTH) &&
4200 (IPW_GET_PACKET_STYPE(¬if->u.raw)
4201 == IEEE80211_STYPE_ASSOC_RESP)) {
4204 ieee80211_assoc_response)
4206 && (notif->size <= 2314)) {
4219 ieee80211_rx_mgt(priv->
4224 ¬if->u.raw, &stats);
4229 schedule_work(&priv->link_up);
4234 case CMAS_AUTHENTICATED:{
4236 status & (STATUS_ASSOCIATED |
4238 #ifdef CONFIG_IPW_DEBUG
4239 struct notif_authenticate *auth
4241 IPW_DEBUG(IPW_DL_NOTIF |
4244 "deauthenticated: '%s' "
4246 ": (0x%04X) - %s \n",
4251 MAC_ARG(priv->bssid),
4252 ntohs(auth->status),
4259 ~(STATUS_ASSOCIATING |
4263 schedule_work(&priv->link_down);
4267 IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE |
4269 "authenticated: '%s' " MAC_FMT
4271 escape_essid(priv->essid,
4273 MAC_ARG(priv->bssid));
4278 if (priv->status & STATUS_AUTH) {
4280 ieee80211_assoc_response
4284 ieee80211_assoc_response
4286 IPW_DEBUG(IPW_DL_NOTIF |
4289 "association failed (0x%04X): %s\n",
4290 ntohs(resp->status),
4296 IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE |
4298 "disassociated: '%s' " MAC_FMT
4300 escape_essid(priv->essid,
4302 MAC_ARG(priv->bssid));
4305 ~(STATUS_DISASSOCIATING |
4306 STATUS_ASSOCIATING |
4307 STATUS_ASSOCIATED | STATUS_AUTH);
4308 if (priv->assoc_network
4309 && (priv->assoc_network->
4311 WLAN_CAPABILITY_IBSS))
4312 ipw_remove_current_network
4315 schedule_work(&priv->link_down);
4320 case CMAS_RX_ASSOC_RESP:
4324 IPW_ERROR("assoc: unknown (%d)\n",
4332 case HOST_NOTIFICATION_STATUS_AUTHENTICATE:{
4333 struct notif_authenticate *auth = ¬if->u.auth;
4334 switch (auth->state) {
4335 case CMAS_AUTHENTICATED:
4336 IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE,
4337 "authenticated: '%s' " MAC_FMT " \n",
4338 escape_essid(priv->essid,
4340 MAC_ARG(priv->bssid));
4341 priv->status |= STATUS_AUTH;
4345 if (priv->status & STATUS_AUTH) {
4346 IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE |
4348 "authentication failed (0x%04X): %s\n",
4349 ntohs(auth->status),
4350 ipw_get_status_code(ntohs
4354 IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE |
4356 "deauthenticated: '%s' " MAC_FMT "\n",
4357 escape_essid(priv->essid,
4359 MAC_ARG(priv->bssid));
4361 priv->status &= ~(STATUS_ASSOCIATING |
4365 schedule_work(&priv->link_down);
4368 case CMAS_TX_AUTH_SEQ_1:
4369 IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE |
4370 IPW_DL_ASSOC, "AUTH_SEQ_1\n");
4372 case CMAS_RX_AUTH_SEQ_2:
4373 IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE |
4374 IPW_DL_ASSOC, "AUTH_SEQ_2\n");
4376 case CMAS_AUTH_SEQ_1_PASS:
4377 IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE |
4378 IPW_DL_ASSOC, "AUTH_SEQ_1_PASS\n");
4380 case CMAS_AUTH_SEQ_1_FAIL:
4381 IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE |
4382 IPW_DL_ASSOC, "AUTH_SEQ_1_FAIL\n");
4384 case CMAS_TX_AUTH_SEQ_3:
4385 IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE |
4386 IPW_DL_ASSOC, "AUTH_SEQ_3\n");
4388 case CMAS_RX_AUTH_SEQ_4:
4389 IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE |
4390 IPW_DL_ASSOC, "RX_AUTH_SEQ_4\n");
4392 case CMAS_AUTH_SEQ_2_PASS:
4393 IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE |
4394 IPW_DL_ASSOC, "AUTH_SEQ_2_PASS\n");
4396 case CMAS_AUTH_SEQ_2_FAIL:
4397 IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE |
4398 IPW_DL_ASSOC, "AUT_SEQ_2_FAIL\n");
4401 IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE |
4402 IPW_DL_ASSOC, "TX_ASSOC\n");
4404 case CMAS_RX_ASSOC_RESP:
4405 IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE |
4406 IPW_DL_ASSOC, "RX_ASSOC_RESP\n");
4409 case CMAS_ASSOCIATED:
4410 IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE |
4411 IPW_DL_ASSOC, "ASSOCIATED\n");
4414 IPW_DEBUG_NOTIF("auth: failure - %d\n",
4421 case HOST_NOTIFICATION_STATUS_SCAN_CHANNEL_RESULT:{
4422 struct notif_channel_result *x =
4423 ¬if->u.channel_result;
4425 if (notif->size == sizeof(*x)) {
4426 IPW_DEBUG_SCAN("Scan result for channel %d\n",
4429 IPW_DEBUG_SCAN("Scan result of wrong size %d "
4430 "(should be %zd)\n",
4431 notif->size, sizeof(*x));
4436 case HOST_NOTIFICATION_STATUS_SCAN_COMPLETED:{
4437 struct notif_scan_complete *x = ¬if->u.scan_complete;
4438 if (notif->size == sizeof(*x)) {
4440 ("Scan completed: type %d, %d channels, "
4441 "%d status\n", x->scan_type,
4442 x->num_channels, x->status);
4444 IPW_ERROR("Scan completed of wrong size %d "
4445 "(should be %zd)\n",
4446 notif->size, sizeof(*x));
4450 ~(STATUS_SCANNING | STATUS_SCAN_ABORTING);
4452 cancel_delayed_work(&priv->scan_check);
4454 if (priv->status & STATUS_EXIT_PENDING)
4457 priv->ieee->scans++;
4459 #ifdef CONFIG_IPW2200_MONITOR
4460 if (priv->ieee->iw_mode == IW_MODE_MONITOR) {
4461 priv->status |= STATUS_SCAN_FORCED;
4462 queue_work(priv->workqueue,
4463 &priv->request_scan);
4466 priv->status &= ~STATUS_SCAN_FORCED;
4467 #endif /* CONFIG_IPW2200_MONITOR */
4469 if (!(priv->status & (STATUS_ASSOCIATED |
4470 STATUS_ASSOCIATING |
4472 STATUS_DISASSOCIATING)))
4473 queue_work(priv->workqueue, &priv->associate);
4474 else if (priv->status & STATUS_ROAMING) {
4475 /* If a scan completed and we are in roam mode, then
4476 * the scan that completed was the one requested as a
4477 * result of entering roam... so, schedule the
4479 queue_work(priv->workqueue, &priv->roam);
4480 } else if (priv->status & STATUS_SCAN_PENDING)
4481 queue_work(priv->workqueue,
4482 &priv->request_scan);
4483 else if (priv->config & CFG_BACKGROUND_SCAN
4484 && priv->status & STATUS_ASSOCIATED)
4485 queue_delayed_work(priv->workqueue,
4486 &priv->request_scan, HZ);
4490 case HOST_NOTIFICATION_STATUS_FRAG_LENGTH:{
4491 struct notif_frag_length *x = ¬if->u.frag_len;
4493 if (notif->size == sizeof(*x))
4494 IPW_ERROR("Frag length: %d\n",
4495 le16_to_cpu(x->frag_length));
4497 IPW_ERROR("Frag length of wrong size %d "
4498 "(should be %zd)\n",
4499 notif->size, sizeof(*x));
4503 case HOST_NOTIFICATION_STATUS_LINK_DETERIORATION:{
4504 struct notif_link_deterioration *x =
4505 ¬if->u.link_deterioration;
4507 if (notif->size == sizeof(*x)) {
4508 IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE,
4509 "link deterioration: '%s' " MAC_FMT
4510 " \n", escape_essid(priv->essid,
4512 MAC_ARG(priv->bssid));
4513 memcpy(&priv->last_link_deterioration, x,
4516 IPW_ERROR("Link Deterioration of wrong size %d "
4517 "(should be %zd)\n",
4518 notif->size, sizeof(*x));
4523 case HOST_NOTIFICATION_DINO_CONFIG_RESPONSE:{
4524 IPW_ERROR("Dino config\n");
4526 && priv->hcmd->cmd != HOST_CMD_DINO_CONFIG)
4527 IPW_ERROR("Unexpected DINO_CONFIG_RESPONSE\n");
4532 case HOST_NOTIFICATION_STATUS_BEACON_STATE:{
4533 struct notif_beacon_state *x = ¬if->u.beacon_state;
4534 if (notif->size != sizeof(*x)) {
4536 ("Beacon state of wrong size %d (should "
4537 "be %zd)\n", notif->size, sizeof(*x));
4541 if (le32_to_cpu(x->state) ==
4542 HOST_NOTIFICATION_STATUS_BEACON_MISSING)
4543 ipw_handle_missed_beacon(priv,
4550 case HOST_NOTIFICATION_STATUS_TGI_TX_KEY:{
4551 struct notif_tgi_tx_key *x = ¬if->u.tgi_tx_key;
4552 if (notif->size == sizeof(*x)) {
4553 IPW_ERROR("TGi Tx Key: state 0x%02x sec type "
4554 "0x%02x station %d\n",
4555 x->key_state, x->security_type,
4561 ("TGi Tx Key of wrong size %d (should be %zd)\n",
4562 notif->size, sizeof(*x));
4566 case HOST_NOTIFICATION_CALIB_KEEP_RESULTS:{
4567 struct notif_calibration *x = ¬if->u.calibration;
4569 if (notif->size == sizeof(*x)) {
4570 memcpy(&priv->calib, x, sizeof(*x));
4571 IPW_DEBUG_INFO("TODO: Calibration\n");
4576 ("Calibration of wrong size %d (should be %zd)\n",
4577 notif->size, sizeof(*x));
4581 case HOST_NOTIFICATION_NOISE_STATS:{
4582 if (notif->size == sizeof(u32)) {
4584 (u8) (le32_to_cpu(notif->u.noise.value) &
4586 average_add(&priv->average_noise,
4592 ("Noise stat is wrong size %d (should be %zd)\n",
4593 notif->size, sizeof(u32));
4598 IPW_ERROR("Unknown notification: "
4599 "subtype=%d,flags=0x%2x,size=%d\n",
4600 notif->subtype, notif->flags, notif->size);
4605 * Destroys all DMA structures and initialise them again
4608 * @return error code
4610 static int ipw_queue_reset(struct ipw_priv *priv)
4613 /** @todo customize queue sizes */
4614 int nTx = 64, nTxCmd = 8;
4615 ipw_tx_queue_free(priv);
4617 rc = ipw_queue_tx_init(priv, &priv->txq_cmd, nTxCmd,
4618 IPW_TX_CMD_QUEUE_READ_INDEX,
4619 IPW_TX_CMD_QUEUE_WRITE_INDEX,
4620 IPW_TX_CMD_QUEUE_BD_BASE,
4621 IPW_TX_CMD_QUEUE_BD_SIZE);
4623 IPW_ERROR("Tx Cmd queue init failed\n");
4627 rc = ipw_queue_tx_init(priv, &priv->txq[0], nTx,
4628 IPW_TX_QUEUE_0_READ_INDEX,
4629 IPW_TX_QUEUE_0_WRITE_INDEX,
4630 IPW_TX_QUEUE_0_BD_BASE, IPW_TX_QUEUE_0_BD_SIZE);
4632 IPW_ERROR("Tx 0 queue init failed\n");
4635 rc = ipw_queue_tx_init(priv, &priv->txq[1], nTx,
4636 IPW_TX_QUEUE_1_READ_INDEX,
4637 IPW_TX_QUEUE_1_WRITE_INDEX,
4638 IPW_TX_QUEUE_1_BD_BASE, IPW_TX_QUEUE_1_BD_SIZE);
4640 IPW_ERROR("Tx 1 queue init failed\n");
4643 rc = ipw_queue_tx_init(priv, &priv->txq[2], nTx,
4644 IPW_TX_QUEUE_2_READ_INDEX,
4645 IPW_TX_QUEUE_2_WRITE_INDEX,
4646 IPW_TX_QUEUE_2_BD_BASE, IPW_TX_QUEUE_2_BD_SIZE);
4648 IPW_ERROR("Tx 2 queue init failed\n");
4651 rc = ipw_queue_tx_init(priv, &priv->txq[3], nTx,
4652 IPW_TX_QUEUE_3_READ_INDEX,
4653 IPW_TX_QUEUE_3_WRITE_INDEX,
4654 IPW_TX_QUEUE_3_BD_BASE, IPW_TX_QUEUE_3_BD_SIZE);
4656 IPW_ERROR("Tx 3 queue init failed\n");
4660 priv->rx_bufs_min = 0;
4661 priv->rx_pend_max = 0;
4665 ipw_tx_queue_free(priv);
4670 * Reclaim Tx queue entries no more used by NIC.
4672 * When FW adwances 'R' index, all entries between old and
4673 * new 'R' index need to be reclaimed. As result, some free space
4674 * forms. If there is enough free space (> low mark), wake Tx queue.
4676 * @note Need to protect against garbage in 'R' index
4680 * @return Number of used entries remains in the queue
4682 static int ipw_queue_tx_reclaim(struct ipw_priv *priv,
4683 struct clx2_tx_queue *txq, int qindex)
4687 struct clx2_queue *q = &txq->q;
4689 hw_tail = ipw_read32(priv, q->reg_r);
4690 if (hw_tail >= q->n_bd) {
4692 ("Read index for DMA queue (%d) is out of range [0-%d)\n",
4696 for (; q->last_used != hw_tail;
4697 q->last_used = ipw_queue_inc_wrap(q->last_used, q->n_bd)) {
4698 ipw_queue_tx_free_tfd(priv, txq);
4702 if ((ipw_queue_space(q) > q->low_mark) &&
4704 (priv->status & STATUS_ASSOCIATED) && netif_running(priv->net_dev))
4705 netif_wake_queue(priv->net_dev);
4706 used = q->first_empty - q->last_used;
4713 static int ipw_queue_tx_hcmd(struct ipw_priv *priv, int hcmd, void *buf,
4716 struct clx2_tx_queue *txq = &priv->txq_cmd;
4717 struct clx2_queue *q = &txq->q;
4718 struct tfd_frame *tfd;
4720 if (ipw_queue_space(q) < (sync ? 1 : 2)) {
4721 IPW_ERROR("No space for Tx\n");
4725 tfd = &txq->bd[q->first_empty];
4726 txq->txb[q->first_empty] = NULL;
4728 memset(tfd, 0, sizeof(*tfd));
4729 tfd->control_flags.message_type = TX_HOST_COMMAND_TYPE;
4730 tfd->control_flags.control_bits = TFD_NEED_IRQ_MASK;
4732 tfd->u.cmd.index = hcmd;
4733 tfd->u.cmd.length = len;
4734 memcpy(tfd->u.cmd.payload, buf, len);
4735 q->first_empty = ipw_queue_inc_wrap(q->first_empty, q->n_bd);
4736 ipw_write32(priv, q->reg_w, q->first_empty);
4737 _ipw_read32(priv, 0x90);
4743 * Rx theory of operation
4745 * The host allocates 32 DMA target addresses and passes the host address
4746 * to the firmware at register IPW_RFDS_TABLE_LOWER + N * RFD_SIZE where N is
4750 * The host/firmware share two index registers for managing the Rx buffers.
4752 * The READ index maps to the first position that the firmware may be writing
4753 * to -- the driver can read up to (but not including) this position and get
4755 * The READ index is managed by the firmware once the card is enabled.
4757 * The WRITE index maps to the last position the driver has read from -- the
4758 * position preceding WRITE is the last slot the firmware can place a packet.
4760 * The queue is empty (no good data) if WRITE = READ - 1, and is full if
4763 * During initialization the host sets up the READ queue position to the first
4764 * INDEX position, and WRITE to the last (READ - 1 wrapped)
4766 * When the firmware places a packet in a buffer it will advance the READ index
4767 * and fire the RX interrupt. The driver can then query the READ index and
4768 * process as many packets as possible, moving the WRITE index forward as it
4769 * resets the Rx queue buffers with new memory.
4771 * The management in the driver is as follows:
4772 * + A list of pre-allocated SKBs is stored in ipw->rxq->rx_free. When
4773 * ipw->rxq->free_count drops to or below RX_LOW_WATERMARK, work is scheduled
4774 * to replensish the ipw->rxq->rx_free.
4775 * + In ipw_rx_queue_replenish (scheduled) if 'processed' != 'read' then the
4776 * ipw->rxq is replenished and the READ INDEX is updated (updating the
4777 * 'processed' and 'read' driver indexes as well)
4778 * + A received packet is processed and handed to the kernel network stack,
4779 * detached from the ipw->rxq. The driver 'processed' index is updated.
4780 * + The Host/Firmware ipw->rxq is replenished at tasklet time from the rx_free
4781 * list. If there are no allocated buffers in ipw->rxq->rx_free, the READ
4782 * INDEX is not incremented and ipw->status(RX_STALLED) is set. If there
4783 * were enough free buffers and RX_STALLED is set it is cleared.
4788 * ipw_rx_queue_alloc() Allocates rx_free
4789 * ipw_rx_queue_replenish() Replenishes rx_free list from rx_used, and calls
4790 * ipw_rx_queue_restock
4791 * ipw_rx_queue_restock() Moves available buffers from rx_free into Rx
4792 * queue, updates firmware pointers, and updates
4793 * the WRITE index. If insufficient rx_free buffers
4794 * are available, schedules ipw_rx_queue_replenish
4796 * -- enable interrupts --
4797 * ISR - ipw_rx() Detach ipw_rx_mem_buffers from pool up to the
4798 * READ INDEX, detaching the SKB from the pool.
4799 * Moves the packet buffer from queue to rx_used.
4800 * Calls ipw_rx_queue_restock to refill any empty
4807 * If there are slots in the RX queue that need to be restocked,
4808 * and we have free pre-allocated buffers, fill the ranks as much
4809 * as we can pulling from rx_free.
4811 * This moves the 'write' index forward to catch up with 'processed', and
4812 * also updates the memory address in the firmware to reference the new
4815 static void ipw_rx_queue_restock(struct ipw_priv *priv)
4817 struct ipw_rx_queue *rxq = priv->rxq;
4818 struct list_head *element;
4819 struct ipw_rx_mem_buffer *rxb;
4820 unsigned long flags;
4823 spin_lock_irqsave(&rxq->lock, flags);
4825 while ((rxq->write != rxq->processed) && (rxq->free_count)) {
4826 element = rxq->rx_free.next;
4827 rxb = list_entry(element, struct ipw_rx_mem_buffer, list);
4830 ipw_write32(priv, IPW_RFDS_TABLE_LOWER + rxq->write * RFD_SIZE,
4832 rxq->queue[rxq->write] = rxb;
4833 rxq->write = (rxq->write + 1) % RX_QUEUE_SIZE;
4836 spin_unlock_irqrestore(&rxq->lock, flags);
4838 /* If the pre-allocated buffer pool is dropping low, schedule to
4840 if (rxq->free_count <= RX_LOW_WATERMARK)
4841 queue_work(priv->workqueue, &priv->rx_replenish);
4843 /* If we've added more space for the firmware to place data, tell it */
4844 if (write != rxq->write)
4845 ipw_write32(priv, IPW_RX_WRITE_INDEX, rxq->write);
4849 * Move all used packet from rx_used to rx_free, allocating a new SKB for each.
4850 * Also restock the Rx queue via ipw_rx_queue_restock.
4852 * This is called as a scheduled work item (except for during intialization)
4854 static void ipw_rx_queue_replenish(void *data)
4856 struct ipw_priv *priv = data;
4857 struct ipw_rx_queue *rxq = priv->rxq;
4858 struct list_head *element;
4859 struct ipw_rx_mem_buffer *rxb;
4860 unsigned long flags;
4862 spin_lock_irqsave(&rxq->lock, flags);
4863 while (!list_empty(&rxq->rx_used)) {
4864 element = rxq->rx_used.next;
4865 rxb = list_entry(element, struct ipw_rx_mem_buffer, list);
4866 rxb->skb = alloc_skb(IPW_RX_BUF_SIZE, GFP_ATOMIC);
4868 printk(KERN_CRIT "%s: Can not allocate SKB buffers.\n",
4869 priv->net_dev->name);
4870 /* We don't reschedule replenish work here -- we will
4871 * call the restock method and if it still needs
4872 * more buffers it will schedule replenish */
4877 rxb->rxb = (struct ipw_rx_buffer *)rxb->skb->data;
4879 pci_map_single(priv->pci_dev, rxb->skb->data,
4880 IPW_RX_BUF_SIZE, PCI_DMA_FROMDEVICE);
4882 list_add_tail(&rxb->list, &rxq->rx_free);
4885 spin_unlock_irqrestore(&rxq->lock, flags);
4887 ipw_rx_queue_restock(priv);
4890 static void ipw_bg_rx_queue_replenish(void *data)
4892 struct ipw_priv *priv = data;
4894 ipw_rx_queue_replenish(data);
4898 /* Assumes that the skb field of the buffers in 'pool' is kept accurate.
4899 * If an SKB has been detached, the POOL needs to have it's SKB set to NULL
4900 * This free routine walks the list of POOL entries and if SKB is set to
4901 * non NULL it is unmapped and freed
4903 static void ipw_rx_queue_free(struct ipw_priv *priv, struct ipw_rx_queue *rxq)
4910 for (i = 0; i < RX_QUEUE_SIZE + RX_FREE_BUFFERS; i++) {
4911 if (rxq->pool[i].skb != NULL) {
4912 pci_unmap_single(priv->pci_dev, rxq->pool[i].dma_addr,
4913 IPW_RX_BUF_SIZE, PCI_DMA_FROMDEVICE);
4914 dev_kfree_skb(rxq->pool[i].skb);
4921 static struct ipw_rx_queue *ipw_rx_queue_alloc(struct ipw_priv *priv)
4923 struct ipw_rx_queue *rxq;
4926 rxq = (struct ipw_rx_queue *)kmalloc(sizeof(*rxq), GFP_KERNEL);
4927 if (unlikely(!rxq)) {
4928 IPW_ERROR("memory allocation failed\n");
4931 memset(rxq, 0, sizeof(*rxq));
4932 spin_lock_init(&rxq->lock);
4933 INIT_LIST_HEAD(&rxq->rx_free);
4934 INIT_LIST_HEAD(&rxq->rx_used);
4936 /* Fill the rx_used queue with _all_ of the Rx buffers */
4937 for (i = 0; i < RX_FREE_BUFFERS + RX_QUEUE_SIZE; i++)
4938 list_add_tail(&rxq->pool[i].list, &rxq->rx_used);
4940 /* Set us so that we have processed and used all buffers, but have
4941 * not restocked the Rx queue with fresh buffers */
4942 rxq->read = rxq->write = 0;
4943 rxq->processed = RX_QUEUE_SIZE - 1;
4944 rxq->free_count = 0;
4949 static int ipw_is_rate_in_mask(struct ipw_priv *priv, int ieee_mode, u8 rate)
4951 rate &= ~IEEE80211_BASIC_RATE_MASK;
4952 if (ieee_mode == IEEE_A) {
4954 case IEEE80211_OFDM_RATE_6MB:
4955 return priv->rates_mask & IEEE80211_OFDM_RATE_6MB_MASK ?
4957 case IEEE80211_OFDM_RATE_9MB:
4958 return priv->rates_mask & IEEE80211_OFDM_RATE_9MB_MASK ?
4960 case IEEE80211_OFDM_RATE_12MB:
4962 rates_mask & IEEE80211_OFDM_RATE_12MB_MASK ? 1 : 0;
4963 case IEEE80211_OFDM_RATE_18MB:
4965 rates_mask & IEEE80211_OFDM_RATE_18MB_MASK ? 1 : 0;
4966 case IEEE80211_OFDM_RATE_24MB:
4968 rates_mask & IEEE80211_OFDM_RATE_24MB_MASK ? 1 : 0;
4969 case IEEE80211_OFDM_RATE_36MB:
4971 rates_mask & IEEE80211_OFDM_RATE_36MB_MASK ? 1 : 0;
4972 case IEEE80211_OFDM_RATE_48MB:
4974 rates_mask & IEEE80211_OFDM_RATE_48MB_MASK ? 1 : 0;
4975 case IEEE80211_OFDM_RATE_54MB:
4977 rates_mask & IEEE80211_OFDM_RATE_54MB_MASK ? 1 : 0;
4985 case IEEE80211_CCK_RATE_1MB:
4986 return priv->rates_mask & IEEE80211_CCK_RATE_1MB_MASK ? 1 : 0;
4987 case IEEE80211_CCK_RATE_2MB:
4988 return priv->rates_mask & IEEE80211_CCK_RATE_2MB_MASK ? 1 : 0;
4989 case IEEE80211_CCK_RATE_5MB:
4990 return priv->rates_mask & IEEE80211_CCK_RATE_5MB_MASK ? 1 : 0;
4991 case IEEE80211_CCK_RATE_11MB:
4992 return priv->rates_mask & IEEE80211_CCK_RATE_11MB_MASK ? 1 : 0;
4995 /* If we are limited to B modulations, bail at this point */
4996 if (ieee_mode == IEEE_B)
5001 case IEEE80211_OFDM_RATE_6MB:
5002 return priv->rates_mask & IEEE80211_OFDM_RATE_6MB_MASK ? 1 : 0;
5003 case IEEE80211_OFDM_RATE_9MB:
5004 return priv->rates_mask & IEEE80211_OFDM_RATE_9MB_MASK ? 1 : 0;
5005 case IEEE80211_OFDM_RATE_12MB:
5006 return priv->rates_mask & IEEE80211_OFDM_RATE_12MB_MASK ? 1 : 0;
5007 case IEEE80211_OFDM_RATE_18MB:
5008 return priv->rates_mask & IEEE80211_OFDM_RATE_18MB_MASK ? 1 : 0;
5009 case IEEE80211_OFDM_RATE_24MB:
5010 return priv->rates_mask & IEEE80211_OFDM_RATE_24MB_MASK ? 1 : 0;
5011 case IEEE80211_OFDM_RATE_36MB:
5012 return priv->rates_mask & IEEE80211_OFDM_RATE_36MB_MASK ? 1 : 0;
5013 case IEEE80211_OFDM_RATE_48MB:
5014 return priv->rates_mask & IEEE80211_OFDM_RATE_48MB_MASK ? 1 : 0;
5015 case IEEE80211_OFDM_RATE_54MB:
5016 return priv->rates_mask & IEEE80211_OFDM_RATE_54MB_MASK ? 1 : 0;
5022 static int ipw_compatible_rates(struct ipw_priv *priv,
5023 const struct ieee80211_network *network,
5024 struct ipw_supported_rates *rates)
5028 memset(rates, 0, sizeof(*rates));
5029 num_rates = min(network->rates_len, (u8) IPW_MAX_RATES);
5030 rates->num_rates = 0;
5031 for (i = 0; i < num_rates; i++) {
5032 if (!ipw_is_rate_in_mask(priv, network->mode,
5033 network->rates[i])) {
5035 if (network->rates[i] & IEEE80211_BASIC_RATE_MASK) {
5036 IPW_DEBUG_SCAN("Adding masked mandatory "
5039 rates->supported_rates[rates->num_rates++] =
5044 IPW_DEBUG_SCAN("Rate %02X masked : 0x%08X\n",
5045 network->rates[i], priv->rates_mask);
5049 rates->supported_rates[rates->num_rates++] = network->rates[i];
5052 num_rates = min(network->rates_ex_len,
5053 (u8) (IPW_MAX_RATES - num_rates));
5054 for (i = 0; i < num_rates; i++) {
5055 if (!ipw_is_rate_in_mask(priv, network->mode,
5056 network->rates_ex[i])) {
5057 if (network->rates_ex[i] & IEEE80211_BASIC_RATE_MASK) {
5058 IPW_DEBUG_SCAN("Adding masked mandatory "
5060 network->rates_ex[i]);
5061 rates->supported_rates[rates->num_rates++] =
5066 IPW_DEBUG_SCAN("Rate %02X masked : 0x%08X\n",
5067 network->rates_ex[i], priv->rates_mask);
5071 rates->supported_rates[rates->num_rates++] =
5072 network->rates_ex[i];
5078 static inline void ipw_copy_rates(struct ipw_supported_rates *dest,
5079 const struct ipw_supported_rates *src)
5082 for (i = 0; i < src->num_rates; i++)
5083 dest->supported_rates[i] = src->supported_rates[i];
5084 dest->num_rates = src->num_rates;
5087 /* TODO: Look at sniffed packets in the air to determine if the basic rate
5088 * mask should ever be used -- right now all callers to add the scan rates are
5089 * set with the modulation = CCK, so BASIC_RATE_MASK is never set... */
5090 static void ipw_add_cck_scan_rates(struct ipw_supported_rates *rates,
5091 u8 modulation, u32 rate_mask)
5093 u8 basic_mask = (IEEE80211_OFDM_MODULATION == modulation) ?
5094 IEEE80211_BASIC_RATE_MASK : 0;
5096 if (rate_mask & IEEE80211_CCK_RATE_1MB_MASK)
5097 rates->supported_rates[rates->num_rates++] =
5098 IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_1MB;
5100 if (rate_mask & IEEE80211_CCK_RATE_2MB_MASK)
5101 rates->supported_rates[rates->num_rates++] =
5102 IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_2MB;
5104 if (rate_mask & IEEE80211_CCK_RATE_5MB_MASK)
5105 rates->supported_rates[rates->num_rates++] = basic_mask |
5106 IEEE80211_CCK_RATE_5MB;
5108 if (rate_mask & IEEE80211_CCK_RATE_11MB_MASK)
5109 rates->supported_rates[rates->num_rates++] = basic_mask |
5110 IEEE80211_CCK_RATE_11MB;
5113 static void ipw_add_ofdm_scan_rates(struct ipw_supported_rates *rates,
5114 u8 modulation, u32 rate_mask)
5116 u8 basic_mask = (IEEE80211_OFDM_MODULATION == modulation) ?
5117 IEEE80211_BASIC_RATE_MASK : 0;
5119 if (rate_mask & IEEE80211_OFDM_RATE_6MB_MASK)
5120 rates->supported_rates[rates->num_rates++] = basic_mask |
5121 IEEE80211_OFDM_RATE_6MB;
5123 if (rate_mask & IEEE80211_OFDM_RATE_9MB_MASK)
5124 rates->supported_rates[rates->num_rates++] =
5125 IEEE80211_OFDM_RATE_9MB;
5127 if (rate_mask & IEEE80211_OFDM_RATE_12MB_MASK)
5128 rates->supported_rates[rates->num_rates++] = basic_mask |
5129 IEEE80211_OFDM_RATE_12MB;
5131 if (rate_mask & IEEE80211_OFDM_RATE_18MB_MASK)
5132 rates->supported_rates[rates->num_rates++] =
5133 IEEE80211_OFDM_RATE_18MB;
5135 if (rate_mask & IEEE80211_OFDM_RATE_24MB_MASK)
5136 rates->supported_rates[rates->num_rates++] = basic_mask |
5137 IEEE80211_OFDM_RATE_24MB;
5139 if (rate_mask & IEEE80211_OFDM_RATE_36MB_MASK)
5140 rates->supported_rates[rates->num_rates++] =
5141 IEEE80211_OFDM_RATE_36MB;
5143 if (rate_mask & IEEE80211_OFDM_RATE_48MB_MASK)
5144 rates->supported_rates[rates->num_rates++] =
5145 IEEE80211_OFDM_RATE_48MB;
5147 if (rate_mask & IEEE80211_OFDM_RATE_54MB_MASK)
5148 rates->supported_rates[rates->num_rates++] =
5149 IEEE80211_OFDM_RATE_54MB;
5152 struct ipw_network_match {
5153 struct ieee80211_network *network;
5154 struct ipw_supported_rates rates;
5157 static int ipw_find_adhoc_network(struct ipw_priv *priv,
5158 struct ipw_network_match *match,
5159 struct ieee80211_network *network,
5162 struct ipw_supported_rates rates;
5164 /* Verify that this network's capability is compatible with the
5165 * current mode (AdHoc or Infrastructure) */
5166 if ((priv->ieee->iw_mode == IW_MODE_ADHOC &&
5167 !(network->capability & WLAN_CAPABILITY_IBSS))) {
5168 IPW_DEBUG_MERGE("Network '%s (" MAC_FMT ")' excluded due to "
5169 "capability mismatch.\n",
5170 escape_essid(network->ssid, network->ssid_len),
5171 MAC_ARG(network->bssid));
5175 /* If we do not have an ESSID for this AP, we can not associate with
5177 if (network->flags & NETWORK_EMPTY_ESSID) {
5178 IPW_DEBUG_MERGE("Network '%s (" MAC_FMT ")' excluded "
5179 "because of hidden ESSID.\n",
5180 escape_essid(network->ssid, network->ssid_len),
5181 MAC_ARG(network->bssid));
5185 if (unlikely(roaming)) {
5186 /* If we are roaming, then ensure check if this is a valid
5187 * network to try and roam to */
5188 if ((network->ssid_len != match->network->ssid_len) ||
5189 memcmp(network->ssid, match->network->ssid,
5190 network->ssid_len)) {
5191 IPW_DEBUG_MERGE("Netowrk '%s (" MAC_FMT ")' excluded "
5192 "because of non-network ESSID.\n",
5193 escape_essid(network->ssid,
5195 MAC_ARG(network->bssid));
5199 /* If an ESSID has been configured then compare the broadcast
5201 if ((priv->config & CFG_STATIC_ESSID) &&
5202 ((network->ssid_len != priv->essid_len) ||
5203 memcmp(network->ssid, priv->essid,
5204 min(network->ssid_len, priv->essid_len)))) {
5205 char escaped[IW_ESSID_MAX_SIZE * 2 + 1];
5208 escape_essid(network->ssid, network->ssid_len),
5210 IPW_DEBUG_MERGE("Network '%s (" MAC_FMT ")' excluded "
5211 "because of ESSID mismatch: '%s'.\n",
5212 escaped, MAC_ARG(network->bssid),
5213 escape_essid(priv->essid,
5219 /* If the old network rate is better than this one, don't bother
5220 * testing everything else. */
5222 if (network->time_stamp[0] < match->network->time_stamp[0]) {
5223 IPW_DEBUG_MERGE("Network '%s excluded because newer than "
5224 "current network.\n",
5225 escape_essid(match->network->ssid,
5226 match->network->ssid_len));
5228 } else if (network->time_stamp[1] < match->network->time_stamp[1]) {
5229 IPW_DEBUG_MERGE("Network '%s excluded because newer than "
5230 "current network.\n",
5231 escape_essid(match->network->ssid,
5232 match->network->ssid_len));
5236 /* Now go through and see if the requested network is valid... */
5237 if (priv->ieee->scan_age != 0 &&
5238 time_after(jiffies, network->last_scanned + priv->ieee->scan_age)) {
5239 IPW_DEBUG_MERGE("Network '%s (" MAC_FMT ")' excluded "
5240 "because of age: %lums.\n",
5241 escape_essid(network->ssid, network->ssid_len),
5242 MAC_ARG(network->bssid),
5243 1000 * (jiffies - network->last_scanned) / HZ);
5247 if ((priv->config & CFG_STATIC_CHANNEL) &&
5248 (network->channel != priv->channel)) {
5249 IPW_DEBUG_MERGE("Network '%s (" MAC_FMT ")' excluded "
5250 "because of channel mismatch: %d != %d.\n",
5251 escape_essid(network->ssid, network->ssid_len),
5252 MAC_ARG(network->bssid),
5253 network->channel, priv->channel);
5257 /* Verify privacy compatability */
5258 if (((priv->capability & CAP_PRIVACY_ON) ? 1 : 0) !=
5259 ((network->capability & WLAN_CAPABILITY_PRIVACY) ? 1 : 0)) {
5260 IPW_DEBUG_MERGE("Network '%s (" MAC_FMT ")' excluded "
5261 "because of privacy mismatch: %s != %s.\n",
5262 escape_essid(network->ssid, network->ssid_len),
5263 MAC_ARG(network->bssid),
5265 capability & CAP_PRIVACY_ON ? "on" : "off",
5267 capability & WLAN_CAPABILITY_PRIVACY ? "on" :
5272 if (!memcmp(network->bssid, priv->bssid, ETH_ALEN)) {
5273 IPW_DEBUG_MERGE("Network '%s (" MAC_FMT ")' excluded "
5274 "because of the same BSSID match: " MAC_FMT
5275 ".\n", escape_essid(network->ssid,
5277 MAC_ARG(network->bssid), MAC_ARG(priv->bssid));
5281 /* Filter out any incompatible freq / mode combinations */
5282 if (!ieee80211_is_valid_mode(priv->ieee, network->mode)) {
5283 IPW_DEBUG_MERGE("Network '%s (" MAC_FMT ")' excluded "
5284 "because of invalid frequency/mode "
5286 escape_essid(network->ssid, network->ssid_len),
5287 MAC_ARG(network->bssid));
5291 /* Ensure that the rates supported by the driver are compatible with
5292 * this AP, including verification of basic rates (mandatory) */
5293 if (!ipw_compatible_rates(priv, network, &rates)) {
5294 IPW_DEBUG_MERGE("Network '%s (" MAC_FMT ")' excluded "
5295 "because configured rate mask excludes "
5296 "AP mandatory rate.\n",
5297 escape_essid(network->ssid, network->ssid_len),
5298 MAC_ARG(network->bssid));
5302 if (rates.num_rates == 0) {
5303 IPW_DEBUG_MERGE("Network '%s (" MAC_FMT ")' excluded "
5304 "because of no compatible rates.\n",
5305 escape_essid(network->ssid, network->ssid_len),
5306 MAC_ARG(network->bssid));
5310 /* TODO: Perform any further minimal comparititive tests. We do not
5311 * want to put too much policy logic here; intelligent scan selection
5312 * should occur within a generic IEEE 802.11 user space tool. */
5314 /* Set up 'new' AP to this network */
5315 ipw_copy_rates(&match->rates, &rates);
5316 match->network = network;
5317 IPW_DEBUG_MERGE("Network '%s (" MAC_FMT ")' is a viable match.\n",
5318 escape_essid(network->ssid, network->ssid_len),
5319 MAC_ARG(network->bssid));
5324 static void ipw_merge_adhoc_network(void *data)
5326 struct ipw_priv *priv = data;
5327 struct ieee80211_network *network = NULL;
5328 struct ipw_network_match match = {
5329 .network = priv->assoc_network
5332 if ((priv->status & STATUS_ASSOCIATED) &&
5333 (priv->ieee->iw_mode == IW_MODE_ADHOC)) {
5334 /* First pass through ROAM process -- look for a better
5336 unsigned long flags;
5338 spin_lock_irqsave(&priv->ieee->lock, flags);
5339 list_for_each_entry(network, &priv->ieee->network_list, list) {
5340 if (network != priv->assoc_network)
5341 ipw_find_adhoc_network(priv, &match, network,
5344 spin_unlock_irqrestore(&priv->ieee->lock, flags);
5346 if (match.network == priv->assoc_network) {
5347 IPW_DEBUG_MERGE("No better ADHOC in this network to "
5353 if ((priv->ieee->iw_mode == IW_MODE_ADHOC)) {
5354 IPW_DEBUG_MERGE("remove network %s\n",
5355 escape_essid(priv->essid,
5357 ipw_remove_current_network(priv);
5360 ipw_disassociate(priv);
5361 priv->assoc_network = match.network;
5367 static int ipw_best_network(struct ipw_priv *priv,
5368 struct ipw_network_match *match,
5369 struct ieee80211_network *network, int roaming)
5371 struct ipw_supported_rates rates;
5373 /* Verify that this network's capability is compatible with the
5374 * current mode (AdHoc or Infrastructure) */
5375 if ((priv->ieee->iw_mode == IW_MODE_INFRA &&
5376 !(network->capability & WLAN_CAPABILITY_ESS)) ||
5377 (priv->ieee->iw_mode == IW_MODE_ADHOC &&
5378 !(network->capability & WLAN_CAPABILITY_IBSS))) {
5379 IPW_DEBUG_ASSOC("Network '%s (" MAC_FMT ")' excluded due to "
5380 "capability mismatch.\n",
5381 escape_essid(network->ssid, network->ssid_len),
5382 MAC_ARG(network->bssid));
5386 /* If we do not have an ESSID for this AP, we can not associate with
5388 if (network->flags & NETWORK_EMPTY_ESSID) {
5389 IPW_DEBUG_ASSOC("Network '%s (" MAC_FMT ")' excluded "
5390 "because of hidden ESSID.\n",
5391 escape_essid(network->ssid, network->ssid_len),
5392 MAC_ARG(network->bssid));
5396 if (unlikely(roaming)) {
5397 /* If we are roaming, then ensure check if this is a valid
5398 * network to try and roam to */
5399 if ((network->ssid_len != match->network->ssid_len) ||
5400 memcmp(network->ssid, match->network->ssid,
5401 network->ssid_len)) {
5402 IPW_DEBUG_ASSOC("Netowrk '%s (" MAC_FMT ")' excluded "
5403 "because of non-network ESSID.\n",
5404 escape_essid(network->ssid,
5406 MAC_ARG(network->bssid));
5410 /* If an ESSID has been configured then compare the broadcast
5412 if ((priv->config & CFG_STATIC_ESSID) &&
5413 ((network->ssid_len != priv->essid_len) ||
5414 memcmp(network->ssid, priv->essid,
5415 min(network->ssid_len, priv->essid_len)))) {
5416 char escaped[IW_ESSID_MAX_SIZE * 2 + 1];
5418 escape_essid(network->ssid, network->ssid_len),
5420 IPW_DEBUG_ASSOC("Network '%s (" MAC_FMT ")' excluded "
5421 "because of ESSID mismatch: '%s'.\n",
5422 escaped, MAC_ARG(network->bssid),
5423 escape_essid(priv->essid,
5429 /* If the old network rate is better than this one, don't bother
5430 * testing everything else. */
5431 if (match->network && match->network->stats.rssi > network->stats.rssi) {
5432 char escaped[IW_ESSID_MAX_SIZE * 2 + 1];
5434 escape_essid(network->ssid, network->ssid_len),
5436 IPW_DEBUG_ASSOC("Network '%s (" MAC_FMT ")' excluded because "
5437 "'%s (" MAC_FMT ")' has a stronger signal.\n",
5438 escaped, MAC_ARG(network->bssid),
5439 escape_essid(match->network->ssid,
5440 match->network->ssid_len),
5441 MAC_ARG(match->network->bssid));
5445 /* If this network has already had an association attempt within the
5446 * last 3 seconds, do not try and associate again... */
5447 if (network->last_associate &&
5448 time_after(network->last_associate + (HZ * 3UL), jiffies)) {
5449 IPW_DEBUG_ASSOC("Network '%s (" MAC_FMT ")' excluded "
5450 "because of storming (%lus since last "
5451 "assoc attempt).\n",
5452 escape_essid(network->ssid, network->ssid_len),
5453 MAC_ARG(network->bssid),
5454 (jiffies - network->last_associate) / HZ);
5458 /* Now go through and see if the requested network is valid... */
5459 if (priv->ieee->scan_age != 0 &&
5460 time_after(jiffies, network->last_scanned + priv->ieee->scan_age)) {
5461 IPW_DEBUG_ASSOC("Network '%s (" MAC_FMT ")' excluded "
5462 "because of age: %lums.\n",
5463 escape_essid(network->ssid, network->ssid_len),
5464 MAC_ARG(network->bssid),
5465 1000 * (jiffies - network->last_scanned) / HZ);
5469 if ((priv->config & CFG_STATIC_CHANNEL) &&
5470 (network->channel != priv->channel)) {
5471 IPW_DEBUG_ASSOC("Network '%s (" MAC_FMT ")' excluded "
5472 "because of channel mismatch: %d != %d.\n",
5473 escape_essid(network->ssid, network->ssid_len),
5474 MAC_ARG(network->bssid),
5475 network->channel, priv->channel);
5479 /* Verify privacy compatability */
5480 if (((priv->capability & CAP_PRIVACY_ON) ? 1 : 0) !=
5481 ((network->capability & WLAN_CAPABILITY_PRIVACY) ? 1 : 0)) {
5482 IPW_DEBUG_ASSOC("Network '%s (" MAC_FMT ")' excluded "
5483 "because of privacy mismatch: %s != %s.\n",
5484 escape_essid(network->ssid, network->ssid_len),
5485 MAC_ARG(network->bssid),
5486 priv->capability & CAP_PRIVACY_ON ? "on" :
5488 network->capability &
5489 WLAN_CAPABILITY_PRIVACY ? "on" : "off");
5493 if ((priv->config & CFG_STATIC_BSSID) &&
5494 memcmp(network->bssid, priv->bssid, ETH_ALEN)) {
5495 IPW_DEBUG_ASSOC("Network '%s (" MAC_FMT ")' excluded "
5496 "because of BSSID mismatch: " MAC_FMT ".\n",
5497 escape_essid(network->ssid, network->ssid_len),
5498 MAC_ARG(network->bssid), MAC_ARG(priv->bssid));
5502 /* Filter out any incompatible freq / mode combinations */
5503 if (!ieee80211_is_valid_mode(priv->ieee, network->mode)) {
5504 IPW_DEBUG_ASSOC("Network '%s (" MAC_FMT ")' excluded "
5505 "because of invalid frequency/mode "
5507 escape_essid(network->ssid, network->ssid_len),
5508 MAC_ARG(network->bssid));
5512 /* Filter out invalid channel in current GEO */
5513 if (!ipw_is_valid_channel(priv->ieee, network->channel)) {
5514 IPW_DEBUG_ASSOC("Network '%s (" MAC_FMT ")' excluded "
5515 "because of invalid channel in current GEO\n",
5516 escape_essid(network->ssid, network->ssid_len),
5517 MAC_ARG(network->bssid));
5521 /* Ensure that the rates supported by the driver are compatible with
5522 * this AP, including verification of basic rates (mandatory) */
5523 if (!ipw_compatible_rates(priv, network, &rates)) {
5524 IPW_DEBUG_ASSOC("Network '%s (" MAC_FMT ")' excluded "
5525 "because configured rate mask excludes "
5526 "AP mandatory rate.\n",
5527 escape_essid(network->ssid, network->ssid_len),
5528 MAC_ARG(network->bssid));
5532 if (rates.num_rates == 0) {
5533 IPW_DEBUG_ASSOC("Network '%s (" MAC_FMT ")' excluded "
5534 "because of no compatible rates.\n",
5535 escape_essid(network->ssid, network->ssid_len),
5536 MAC_ARG(network->bssid));
5540 /* TODO: Perform any further minimal comparititive tests. We do not
5541 * want to put too much policy logic here; intelligent scan selection
5542 * should occur within a generic IEEE 802.11 user space tool. */
5544 /* Set up 'new' AP to this network */
5545 ipw_copy_rates(&match->rates, &rates);
5546 match->network = network;
5548 IPW_DEBUG_ASSOC("Network '%s (" MAC_FMT ")' is a viable match.\n",
5549 escape_essid(network->ssid, network->ssid_len),
5550 MAC_ARG(network->bssid));
5555 static void ipw_adhoc_create(struct ipw_priv *priv,
5556 struct ieee80211_network *network)
5558 const struct ieee80211_geo *geo = ipw_get_geo(priv->ieee);
5562 * For the purposes of scanning, we can set our wireless mode
5563 * to trigger scans across combinations of bands, but when it
5564 * comes to creating a new ad-hoc network, we have tell the FW
5565 * exactly which band to use.
5567 * We also have the possibility of an invalid channel for the
5568 * chossen band. Attempting to create a new ad-hoc network
5569 * with an invalid channel for wireless mode will trigger a
5573 switch (ipw_is_valid_channel(priv->ieee, priv->channel)) {
5574 case IEEE80211_52GHZ_BAND:
5575 network->mode = IEEE_A;
5576 i = ipw_channel_to_index(priv->ieee, priv->channel);
5579 if (geo->a[i].flags & IEEE80211_CH_PASSIVE_ONLY) {
5580 IPW_WARNING("Overriding invalid channel\n");
5581 priv->channel = geo->a[0].channel;
5585 case IEEE80211_24GHZ_BAND:
5586 if (priv->ieee->mode & IEEE_G)
5587 network->mode = IEEE_G;
5589 network->mode = IEEE_B;
5590 i = ipw_channel_to_index(priv->ieee, priv->channel);
5593 if (geo->bg[i].flags & IEEE80211_CH_PASSIVE_ONLY) {
5594 IPW_WARNING("Overriding invalid channel\n");
5595 priv->channel = geo->bg[0].channel;
5600 IPW_WARNING("Overriding invalid channel\n");
5601 if (priv->ieee->mode & IEEE_A) {
5602 network->mode = IEEE_A;
5603 priv->channel = geo->a[0].channel;
5604 } else if (priv->ieee->mode & IEEE_G) {
5605 network->mode = IEEE_G;
5606 priv->channel = geo->bg[0].channel;
5608 network->mode = IEEE_B;
5609 priv->channel = geo->bg[0].channel;
5614 network->channel = priv->channel;
5615 priv->config |= CFG_ADHOC_PERSIST;
5616 ipw_create_bssid(priv, network->bssid);
5617 network->ssid_len = priv->essid_len;
5618 memcpy(network->ssid, priv->essid, priv->essid_len);
5619 memset(&network->stats, 0, sizeof(network->stats));
5620 network->capability = WLAN_CAPABILITY_IBSS;
5621 if (!(priv->config & CFG_PREAMBLE_LONG))
5622 network->capability |= WLAN_CAPABILITY_SHORT_PREAMBLE;
5623 if (priv->capability & CAP_PRIVACY_ON)
5624 network->capability |= WLAN_CAPABILITY_PRIVACY;
5625 network->rates_len = min(priv->rates.num_rates, MAX_RATES_LENGTH);
5626 memcpy(network->rates, priv->rates.supported_rates, network->rates_len);
5627 network->rates_ex_len = priv->rates.num_rates - network->rates_len;
5628 memcpy(network->rates_ex,
5629 &priv->rates.supported_rates[network->rates_len],
5630 network->rates_ex_len);
5631 network->last_scanned = 0;
5633 network->last_associate = 0;
5634 network->time_stamp[0] = 0;
5635 network->time_stamp[1] = 0;
5636 network->beacon_interval = 100; /* Default */
5637 network->listen_interval = 10; /* Default */
5638 network->atim_window = 0; /* Default */
5639 network->wpa_ie_len = 0;
5640 network->rsn_ie_len = 0;
5643 static void ipw_send_tgi_tx_key(struct ipw_priv *priv, int type, int index)
5645 struct ipw_tgi_tx_key *key;
5646 struct host_cmd cmd = {
5647 .cmd = IPW_CMD_TGI_TX_KEY,
5651 if (!(priv->ieee->sec.flags & (1 << index)))
5654 key = (struct ipw_tgi_tx_key *)&cmd.param;
5655 key->key_id = index;
5656 memcpy(key->key, priv->ieee->sec.keys[index], SCM_TEMPORAL_KEY_LENGTH);
5657 key->security_type = type;
5658 key->station_index = 0; /* always 0 for BSS */
5660 /* 0 for new key; previous value of counter (after fatal error) */
5661 key->tx_counter[0] = 0;
5662 key->tx_counter[1] = 0;
5664 ipw_send_cmd(priv, &cmd);
5667 static void ipw_send_wep_keys(struct ipw_priv *priv, int type)
5669 struct ipw_wep_key *key;
5671 struct host_cmd cmd = {
5672 .cmd = IPW_CMD_WEP_KEY,
5676 key = (struct ipw_wep_key *)&cmd.param;
5677 key->cmd_id = DINO_CMD_WEP_KEY;
5680 /* Note: AES keys cannot be set for multiple times.
5681 * Only set it at the first time. */
5682 for (i = 0; i < 4; i++) {
5683 key->key_index = i | type;
5684 if (!(priv->ieee->sec.flags & (1 << i))) {
5689 key->key_size = priv->ieee->sec.key_sizes[i];
5690 memcpy(key->key, priv->ieee->sec.keys[i], key->key_size);
5692 ipw_send_cmd(priv, &cmd);
5696 static void ipw_set_hw_decrypt_unicast(struct ipw_priv *priv, int level)
5698 if (priv->ieee->host_encrypt)
5703 priv->sys_config.disable_unicast_decryption = 0;
5704 priv->ieee->host_decrypt = 0;
5707 priv->sys_config.disable_unicast_decryption = 1;
5708 priv->ieee->host_decrypt = 1;
5711 priv->sys_config.disable_unicast_decryption = 0;
5712 priv->ieee->host_decrypt = 0;
5715 priv->sys_config.disable_unicast_decryption = 1;
5722 static void ipw_set_hw_decrypt_multicast(struct ipw_priv *priv, int level)
5724 if (priv->ieee->host_encrypt)
5729 priv->sys_config.disable_multicast_decryption = 0;
5732 priv->sys_config.disable_multicast_decryption = 1;
5735 priv->sys_config.disable_multicast_decryption = 0;
5738 priv->sys_config.disable_multicast_decryption = 1;
5745 static void ipw_set_hwcrypto_keys(struct ipw_priv *priv)
5747 switch (priv->ieee->sec.level) {
5749 if (priv->ieee->sec.flags & SEC_ACTIVE_KEY)
5750 ipw_send_tgi_tx_key(priv,
5751 DCT_FLAG_EXT_SECURITY_CCM,
5752 priv->ieee->sec.active_key);
5754 ipw_send_wep_keys(priv, DCW_WEP_KEY_SEC_TYPE_CCM);
5757 if (priv->ieee->sec.flags & SEC_ACTIVE_KEY)
5758 ipw_send_tgi_tx_key(priv,
5759 DCT_FLAG_EXT_SECURITY_TKIP,
5760 priv->ieee->sec.active_key);
5763 ipw_send_wep_keys(priv, DCW_WEP_KEY_SEC_TYPE_WEP);
5770 ipw_set_hw_decrypt_unicast(priv, priv->ieee->sec.level);
5771 ipw_set_hw_decrypt_multicast(priv, priv->ieee->sec.level);
5774 static void ipw_adhoc_check(void *data)
5776 struct ipw_priv *priv = data;
5778 if (priv->missed_adhoc_beacons++ > priv->disassociate_threshold &&
5779 !(priv->config & CFG_ADHOC_PERSIST)) {
5780 IPW_DEBUG(IPW_DL_INFO | IPW_DL_NOTIF |
5781 IPW_DL_STATE | IPW_DL_ASSOC,
5782 "Missed beacon: %d - disassociate\n",
5783 priv->missed_adhoc_beacons);
5784 ipw_remove_current_network(priv);
5785 ipw_disassociate(priv);
5789 queue_delayed_work(priv->workqueue, &priv->adhoc_check,
5790 priv->assoc_request.beacon_interval);
5793 static void ipw_bg_adhoc_check(void *data)
5795 struct ipw_priv *priv = data;
5797 ipw_adhoc_check(data);
5801 #ifdef CONFIG_IPW_DEBUG
5802 static void ipw_debug_config(struct ipw_priv *priv)
5804 IPW_DEBUG_INFO("Scan completed, no valid APs matched "
5805 "[CFG 0x%08X]\n", priv->config);
5806 if (priv->config & CFG_STATIC_CHANNEL)
5807 IPW_DEBUG_INFO("Channel locked to %d\n", priv->channel);
5809 IPW_DEBUG_INFO("Channel unlocked.\n");
5810 if (priv->config & CFG_STATIC_ESSID)
5811 IPW_DEBUG_INFO("ESSID locked to '%s'\n",
5812 escape_essid(priv->essid, priv->essid_len));
5814 IPW_DEBUG_INFO("ESSID unlocked.\n");
5815 if (priv->config & CFG_STATIC_BSSID)
5816 IPW_DEBUG_INFO("BSSID locked to " MAC_FMT "\n",
5817 MAC_ARG(priv->bssid));
5819 IPW_DEBUG_INFO("BSSID unlocked.\n");
5820 if (priv->capability & CAP_PRIVACY_ON)
5821 IPW_DEBUG_INFO("PRIVACY on\n");
5823 IPW_DEBUG_INFO("PRIVACY off\n");
5824 IPW_DEBUG_INFO("RATE MASK: 0x%08X\n", priv->rates_mask);
5827 #define ipw_debug_config(x) do {} while (0)
5830 static inline void ipw_set_fixed_rate(struct ipw_priv *priv, int mode)
5832 /* TODO: Verify that this works... */
5833 struct ipw_fixed_rate fr = {
5834 .tx_rates = priv->rates_mask
5839 /* Identify 'current FW band' and match it with the fixed
5842 switch (priv->ieee->freq_band) {
5843 case IEEE80211_52GHZ_BAND: /* A only */
5845 if (priv->rates_mask & ~IEEE80211_OFDM_RATES_MASK) {
5846 /* Invalid fixed rate mask */
5848 ("invalid fixed rate mask in ipw_set_fixed_rate\n");
5853 fr.tx_rates >>= IEEE80211_OFDM_SHIFT_MASK_A;
5856 default: /* 2.4Ghz or Mixed */
5858 if (mode == IEEE_B) {
5859 if (fr.tx_rates & ~IEEE80211_CCK_RATES_MASK) {
5860 /* Invalid fixed rate mask */
5862 ("invalid fixed rate mask in ipw_set_fixed_rate\n");
5869 if (fr.tx_rates & ~(IEEE80211_CCK_RATES_MASK |
5870 IEEE80211_OFDM_RATES_MASK)) {
5871 /* Invalid fixed rate mask */
5873 ("invalid fixed rate mask in ipw_set_fixed_rate\n");
5878 if (IEEE80211_OFDM_RATE_6MB_MASK & fr.tx_rates) {
5879 mask |= (IEEE80211_OFDM_RATE_6MB_MASK >> 1);
5880 fr.tx_rates &= ~IEEE80211_OFDM_RATE_6MB_MASK;
5883 if (IEEE80211_OFDM_RATE_9MB_MASK & fr.tx_rates) {
5884 mask |= (IEEE80211_OFDM_RATE_9MB_MASK >> 1);
5885 fr.tx_rates &= ~IEEE80211_OFDM_RATE_9MB_MASK;
5888 if (IEEE80211_OFDM_RATE_12MB_MASK & fr.tx_rates) {
5889 mask |= (IEEE80211_OFDM_RATE_12MB_MASK >> 1);
5890 fr.tx_rates &= ~IEEE80211_OFDM_RATE_12MB_MASK;
5893 fr.tx_rates |= mask;
5897 reg = ipw_read32(priv, IPW_MEM_FIXED_OVERRIDE);
5898 ipw_write_reg32(priv, reg, *(u32 *) & fr);
5901 static void ipw_abort_scan(struct ipw_priv *priv)
5905 if (priv->status & STATUS_SCAN_ABORTING) {
5906 IPW_DEBUG_HC("Ignoring concurrent scan abort request.\n");
5909 priv->status |= STATUS_SCAN_ABORTING;
5911 err = ipw_send_scan_abort(priv);
5913 IPW_DEBUG_HC("Request to abort scan failed.\n");
5916 static void ipw_add_scan_channels(struct ipw_priv *priv,
5917 struct ipw_scan_request_ext *scan,
5920 int channel_index = 0;
5921 const struct ieee80211_geo *geo;
5924 geo = ipw_get_geo(priv->ieee);
5926 if (priv->ieee->freq_band & IEEE80211_52GHZ_BAND) {
5927 int start = channel_index;
5928 for (i = 0; i < geo->a_channels; i++) {
5929 if ((priv->status & STATUS_ASSOCIATED) &&
5930 geo->a[i].channel == priv->channel)
5933 scan->channels_list[channel_index] = geo->a[i].channel;
5934 ipw_set_scan_type(scan, channel_index,
5936 flags & IEEE80211_CH_PASSIVE_ONLY ?
5937 IPW_SCAN_PASSIVE_FULL_DWELL_SCAN :
5941 if (start != channel_index) {
5942 scan->channels_list[start] = (u8) (IPW_A_MODE << 6) |
5943 (channel_index - start);
5948 if (priv->ieee->freq_band & IEEE80211_24GHZ_BAND) {
5949 int start = channel_index;
5950 if (priv->config & CFG_SPEED_SCAN) {
5952 u8 channels[IEEE80211_24GHZ_CHANNELS] = {
5953 /* nop out the list */
5958 while (channel_index < IPW_SCAN_CHANNELS) {
5960 priv->speed_scan[priv->speed_scan_pos];
5962 priv->speed_scan_pos = 0;
5963 channel = priv->speed_scan[0];
5965 if ((priv->status & STATUS_ASSOCIATED) &&
5966 channel == priv->channel) {
5967 priv->speed_scan_pos++;
5971 /* If this channel has already been
5972 * added in scan, break from loop
5973 * and this will be the first channel
5976 if (channels[channel - 1] != 0)
5979 channels[channel - 1] = 1;
5980 priv->speed_scan_pos++;
5982 scan->channels_list[channel_index] = channel;
5984 ipw_channel_to_index(priv->ieee, channel);
5985 ipw_set_scan_type(scan, channel_index,
5988 IEEE80211_CH_PASSIVE_ONLY ?
5989 IPW_SCAN_PASSIVE_FULL_DWELL_SCAN
5993 for (i = 0; i < geo->bg_channels; i++) {
5994 if ((priv->status & STATUS_ASSOCIATED) &&
5995 geo->bg[i].channel == priv->channel)
5998 scan->channels_list[channel_index] =
6000 ipw_set_scan_type(scan, channel_index,
6003 IEEE80211_CH_PASSIVE_ONLY ?
6004 IPW_SCAN_PASSIVE_FULL_DWELL_SCAN
6009 if (start != channel_index) {
6010 scan->channels_list[start] = (u8) (IPW_B_MODE << 6) |
6011 (channel_index - start);
6016 static int ipw_request_scan(struct ipw_priv *priv)
6018 struct ipw_scan_request_ext scan;
6019 int err = 0, scan_type;
6021 if (!(priv->status & STATUS_INIT) ||
6022 (priv->status & STATUS_EXIT_PENDING))
6027 if (priv->status & STATUS_SCANNING) {
6028 IPW_DEBUG_HC("Concurrent scan requested. Ignoring.\n");
6029 priv->status |= STATUS_SCAN_PENDING;
6033 if (!(priv->status & STATUS_SCAN_FORCED) &&
6034 priv->status & STATUS_SCAN_ABORTING) {
6035 IPW_DEBUG_HC("Scan request while abort pending. Queuing.\n");
6036 priv->status |= STATUS_SCAN_PENDING;
6040 if (priv->status & STATUS_RF_KILL_MASK) {
6041 IPW_DEBUG_HC("Aborting scan due to RF Kill activation\n");
6042 priv->status |= STATUS_SCAN_PENDING;
6046 memset(&scan, 0, sizeof(scan));
6048 if (priv->config & CFG_SPEED_SCAN)
6049 scan.dwell_time[IPW_SCAN_ACTIVE_BROADCAST_SCAN] =
6052 scan.dwell_time[IPW_SCAN_ACTIVE_BROADCAST_SCAN] =
6055 scan.dwell_time[IPW_SCAN_ACTIVE_BROADCAST_AND_DIRECT_SCAN] =
6057 scan.dwell_time[IPW_SCAN_PASSIVE_FULL_DWELL_SCAN] = cpu_to_le16(120);
6059 scan.full_scan_index = cpu_to_le32(ieee80211_get_scans(priv->ieee));
6061 #ifdef CONFIG_IPW2200_MONITOR
6062 if (priv->ieee->iw_mode == IW_MODE_MONITOR) {
6066 switch (ipw_is_valid_channel(priv->ieee, priv->channel)) {
6067 case IEEE80211_52GHZ_BAND:
6068 band = (u8) (IPW_A_MODE << 6) | 1;
6069 channel = priv->channel;
6072 case IEEE80211_24GHZ_BAND:
6073 band = (u8) (IPW_B_MODE << 6) | 1;
6074 channel = priv->channel;
6078 band = (u8) (IPW_B_MODE << 6) | 1;
6083 scan.channels_list[0] = band;
6084 scan.channels_list[1] = channel;
6085 ipw_set_scan_type(&scan, 1, IPW_SCAN_PASSIVE_FULL_DWELL_SCAN);
6087 /* NOTE: The card will sit on this channel for this time
6088 * period. Scan aborts are timing sensitive and frequently
6089 * result in firmware restarts. As such, it is best to
6090 * set a small dwell_time here and just keep re-issuing
6091 * scans. Otherwise fast channel hopping will not actually
6094 * TODO: Move SPEED SCAN support to all modes and bands */
6095 scan.dwell_time[IPW_SCAN_PASSIVE_FULL_DWELL_SCAN] =
6098 #endif /* CONFIG_IPW2200_MONITOR */
6099 /* If we are roaming, then make this a directed scan for the
6100 * current network. Otherwise, ensure that every other scan
6101 * is a fast channel hop scan */
6102 if ((priv->status & STATUS_ROAMING)
6103 || (!(priv->status & STATUS_ASSOCIATED)
6104 && (priv->config & CFG_STATIC_ESSID)
6105 && (le32_to_cpu(scan.full_scan_index) % 2))) {
6106 err = ipw_send_ssid(priv, priv->essid, priv->essid_len);
6108 IPW_DEBUG_HC("Attempt to send SSID command "
6113 scan_type = IPW_SCAN_ACTIVE_BROADCAST_AND_DIRECT_SCAN;
6115 scan_type = IPW_SCAN_ACTIVE_BROADCAST_SCAN;
6117 ipw_add_scan_channels(priv, &scan, scan_type);
6118 #ifdef CONFIG_IPW2200_MONITOR
6122 err = ipw_send_scan_request_ext(priv, &scan);
6124 IPW_DEBUG_HC("Sending scan command failed: %08X\n", err);
6128 priv->status |= STATUS_SCANNING;
6129 priv->status &= ~STATUS_SCAN_PENDING;
6130 queue_delayed_work(priv->workqueue, &priv->scan_check,
6131 IPW_SCAN_CHECK_WATCHDOG);
6137 static void ipw_bg_abort_scan(void *data)
6139 struct ipw_priv *priv = data;
6141 ipw_abort_scan(data);
6145 #if WIRELESS_EXT < 18
6146 /* Support for wpa_supplicant before WE-18, deprecated. */
6148 /* following definitions must match definitions in driver_ipw.c */
6150 #define IPW_IOCTL_WPA_SUPPLICANT SIOCIWFIRSTPRIV+30
6152 #define IPW_CMD_SET_WPA_PARAM 1
6153 #define IPW_CMD_SET_WPA_IE 2
6154 #define IPW_CMD_SET_ENCRYPTION 3
6155 #define IPW_CMD_MLME 4
6157 #define IPW_PARAM_WPA_ENABLED 1
6158 #define IPW_PARAM_TKIP_COUNTERMEASURES 2
6159 #define IPW_PARAM_DROP_UNENCRYPTED 3
6160 #define IPW_PARAM_PRIVACY_INVOKED 4
6161 #define IPW_PARAM_AUTH_ALGS 5
6162 #define IPW_PARAM_IEEE_802_1X 6
6164 #define IPW_MLME_STA_DEAUTH 1
6165 #define IPW_MLME_STA_DISASSOC 2
6167 #define IPW_CRYPT_ERR_UNKNOWN_ALG 2
6168 #define IPW_CRYPT_ERR_UNKNOWN_ADDR 3
6169 #define IPW_CRYPT_ERR_CRYPT_INIT_FAILED 4
6170 #define IPW_CRYPT_ERR_KEY_SET_FAILED 5
6171 #define IPW_CRYPT_ERR_TX_KEY_SET_FAILED 6
6172 #define IPW_CRYPT_ERR_CARD_CONF_FAILED 7
6174 #define IPW_CRYPT_ALG_NAME_LEN 16
6178 u8 sta_addr[ETH_ALEN];
6194 u8 alg[IPW_CRYPT_ALG_NAME_LEN];
6198 u8 seq[8]; /* sequence counter (set: RX, get: TX) */
6206 /* end of driver_ipw.c code */
6209 static int ipw_wpa_enable(struct ipw_priv *priv, int value)
6211 /* This is called when wpa_supplicant loads and closes the driver
6216 #if WIRELESS_EXT < 18
6217 #define IW_AUTH_ALG_OPEN_SYSTEM 0x1
6218 #define IW_AUTH_ALG_SHARED_KEY 0x2
6221 static int ipw_wpa_set_auth_algs(struct ipw_priv *priv, int value)
6223 struct ieee80211_device *ieee = priv->ieee;
6224 struct ieee80211_security sec = {
6225 .flags = SEC_AUTH_MODE,
6229 if (value & IW_AUTH_ALG_SHARED_KEY) {
6230 sec.auth_mode = WLAN_AUTH_SHARED_KEY;
6232 } else if (value & IW_AUTH_ALG_OPEN_SYSTEM) {
6233 sec.auth_mode = WLAN_AUTH_OPEN;
6238 if (ieee->set_security)
6239 ieee->set_security(ieee->dev, &sec);
6246 void ipw_wpa_assoc_frame(struct ipw_priv *priv, char *wpa_ie, int wpa_ie_len)
6248 /* make sure WPA is enabled */
6249 ipw_wpa_enable(priv, 1);
6251 ipw_disassociate(priv);
6254 static int ipw_set_rsn_capa(struct ipw_priv *priv,
6255 char *capabilities, int length)
6257 struct host_cmd cmd = {
6258 .cmd = IPW_CMD_RSN_CAPABILITIES,
6262 IPW_DEBUG_HC("HOST_CMD_RSN_CAPABILITIES\n");
6264 memcpy(cmd.param, capabilities, length);
6265 return ipw_send_cmd(priv, &cmd);
6268 #if WIRELESS_EXT < 18
6269 static int ipw_wpa_set_param(struct net_device *dev, u8 name, u32 value)
6271 struct ipw_priv *priv = ieee80211_priv(dev);
6272 struct ieee80211_crypt_data *crypt;
6273 unsigned long flags;
6277 case IPW_PARAM_WPA_ENABLED:
6278 ret = ipw_wpa_enable(priv, value);
6281 case IPW_PARAM_TKIP_COUNTERMEASURES:
6282 crypt = priv->ieee->crypt[priv->ieee->tx_keyidx];
6283 if (!crypt || !crypt->ops->set_flags || !crypt->ops->get_flags) {
6284 IPW_WARNING("Can't set TKIP countermeasures: "
6285 "crypt not set!\n");
6289 flags = crypt->ops->get_flags(crypt->priv);
6292 flags |= IEEE80211_CRYPTO_TKIP_COUNTERMEASURES;
6294 flags &= ~IEEE80211_CRYPTO_TKIP_COUNTERMEASURES;
6296 crypt->ops->set_flags(flags, crypt->priv);
6300 case IPW_PARAM_DROP_UNENCRYPTED:{
6303 * wpa_supplicant calls set_wpa_enabled when the driver
6304 * is loaded and unloaded, regardless of if WPA is being
6305 * used. No other calls are made which can be used to
6306 * determine if encryption will be used or not prior to
6307 * association being expected. If encryption is not being
6308 * used, drop_unencrypted is set to false, else true -- we
6309 * can use this to determine if the CAP_PRIVACY_ON bit should
6312 struct ieee80211_security sec = {
6313 .flags = SEC_ENABLED,
6316 priv->ieee->drop_unencrypted = value;
6317 /* We only change SEC_LEVEL for open mode. Others
6318 * are set by ipw_wpa_set_encryption.
6321 sec.flags |= SEC_LEVEL;
6322 sec.level = SEC_LEVEL_0;
6324 sec.flags |= SEC_LEVEL;
6325 sec.level = SEC_LEVEL_1;
6327 if (priv->ieee->set_security)
6328 priv->ieee->set_security(priv->ieee->dev, &sec);
6332 case IPW_PARAM_PRIVACY_INVOKED:
6333 priv->ieee->privacy_invoked = value;
6336 case IPW_PARAM_AUTH_ALGS:
6337 ret = ipw_wpa_set_auth_algs(priv, value);
6340 case IPW_PARAM_IEEE_802_1X:
6341 priv->ieee->ieee802_1x = value;
6345 IPW_ERROR("%s: Unknown WPA param: %d\n", dev->name, name);
6352 static int ipw_wpa_mlme(struct net_device *dev, int command, int reason)
6354 struct ipw_priv *priv = ieee80211_priv(dev);
6358 case IPW_MLME_STA_DEAUTH:
6362 case IPW_MLME_STA_DISASSOC:
6363 ipw_disassociate(priv);
6367 IPW_ERROR("%s: Unknown MLME request: %d\n", dev->name, command);
6374 static int ipw_wpa_ie_cipher2level(u8 cipher)
6381 case 5: /* WEP104 */
6391 static int ipw_wpa_set_wpa_ie(struct net_device *dev,
6392 struct ipw_param *param, int plen)
6394 struct ipw_priv *priv = ieee80211_priv(dev);
6395 struct ieee80211_device *ieee = priv->ieee;
6400 if (param->u.wpa_ie.len > MAX_WPA_IE_LEN ||
6401 (param->u.wpa_ie.len && param->u.wpa_ie.data == NULL))
6404 if (param->u.wpa_ie.len) {
6405 buf = kmalloc(param->u.wpa_ie.len, GFP_KERNEL);
6409 memcpy(buf, param->u.wpa_ie.data, param->u.wpa_ie.len);
6410 kfree(ieee->wpa_ie);
6412 ieee->wpa_ie_len = param->u.wpa_ie.len;
6414 kfree(ieee->wpa_ie);
6415 ieee->wpa_ie = NULL;
6416 ieee->wpa_ie_len = 0;
6420 if (priv->ieee->host_encrypt)
6423 /* HACK: Parse wpa_ie here to get pairwise suite, otherwise
6424 * we need to change driver_ipw.c from wpa_supplicant. This
6425 * is OK since -Dipw is deprecated. The -Dwext driver has a
6426 * clean way to handle this. */
6427 gtk = ptk = (u8 *) ieee->wpa_ie;
6428 if (ieee->wpa_ie[0] == 0x30) { /* RSN IE */
6430 ptk += 4 + 4 + 2 + 3;
6431 } else { /* WPA IE */
6433 ptk += 8 + 4 + 2 + 3;
6436 if (ptk - (u8 *) ieee->wpa_ie > ieee->wpa_ie_len)
6439 level = ipw_wpa_ie_cipher2level(*gtk);
6440 ipw_set_hw_decrypt_multicast(priv, level);
6442 level = ipw_wpa_ie_cipher2level(*ptk);
6443 ipw_set_hw_decrypt_unicast(priv, level);
6446 ipw_wpa_assoc_frame(priv, ieee->wpa_ie, ieee->wpa_ie_len);
6450 /* implementation borrowed from hostap driver */
6452 static int ipw_wpa_set_encryption(struct net_device *dev,
6453 struct ipw_param *param, int param_len)
6456 struct ipw_priv *priv = ieee80211_priv(dev);
6457 struct ieee80211_device *ieee = priv->ieee;
6458 struct ieee80211_crypto_ops *ops;
6459 struct ieee80211_crypt_data **crypt;
6461 struct ieee80211_security sec = {
6465 param->u.crypt.err = 0;
6466 param->u.crypt.alg[IPW_CRYPT_ALG_NAME_LEN - 1] = '\0';
6469 (int)((char *)param->u.crypt.key - (char *)param) +
6470 param->u.crypt.key_len) {
6471 IPW_DEBUG_INFO("Len mismatch %d, %d\n", param_len,
6472 param->u.crypt.key_len);
6475 if (param->sta_addr[0] == 0xff && param->sta_addr[1] == 0xff &&
6476 param->sta_addr[2] == 0xff && param->sta_addr[3] == 0xff &&
6477 param->sta_addr[4] == 0xff && param->sta_addr[5] == 0xff) {
6478 if (param->u.crypt.idx >= WEP_KEYS)
6480 crypt = &ieee->crypt[param->u.crypt.idx];
6485 sec.flags |= SEC_ENABLED | SEC_ENCRYPT;
6486 if (strcmp(param->u.crypt.alg, "none") == 0) {
6490 sec.level = SEC_LEVEL_0;
6491 sec.flags |= SEC_LEVEL;
6492 ieee80211_crypt_delayed_deinit(ieee, crypt);
6499 /* IPW HW cannot build TKIP MIC, host decryption still needed. */
6500 if (strcmp(param->u.crypt.alg, "TKIP") == 0)
6501 ieee->host_encrypt_msdu = 1;
6503 if (!(ieee->host_encrypt || ieee->host_encrypt_msdu ||
6504 ieee->host_decrypt))
6505 goto skip_host_crypt;
6507 ops = ieee80211_get_crypto_ops(param->u.crypt.alg);
6508 if (ops == NULL && strcmp(param->u.crypt.alg, "WEP") == 0) {
6509 request_module("ieee80211_crypt_wep");
6510 ops = ieee80211_get_crypto_ops(param->u.crypt.alg);
6511 } else if (ops == NULL && strcmp(param->u.crypt.alg, "TKIP") == 0) {
6512 request_module("ieee80211_crypt_tkip");
6513 ops = ieee80211_get_crypto_ops(param->u.crypt.alg);
6514 } else if (ops == NULL && strcmp(param->u.crypt.alg, "CCMP") == 0) {
6515 request_module("ieee80211_crypt_ccmp");
6516 ops = ieee80211_get_crypto_ops(param->u.crypt.alg);
6519 IPW_DEBUG_INFO("%s: unknown crypto alg '%s'\n",
6520 dev->name, param->u.crypt.alg);
6521 param->u.crypt.err = IPW_CRYPT_ERR_UNKNOWN_ALG;
6526 if (*crypt == NULL || (*crypt)->ops != ops) {
6527 struct ieee80211_crypt_data *new_crypt;
6529 ieee80211_crypt_delayed_deinit(ieee, crypt);
6531 new_crypt = (struct ieee80211_crypt_data *)
6532 kmalloc(sizeof(*new_crypt), GFP_KERNEL);
6533 if (new_crypt == NULL) {
6537 memset(new_crypt, 0, sizeof(struct ieee80211_crypt_data));
6538 new_crypt->ops = ops;
6539 if (new_crypt->ops && try_module_get(new_crypt->ops->owner))
6541 new_crypt->ops->init(param->u.crypt.idx);
6543 if (new_crypt->priv == NULL) {
6545 param->u.crypt.err = IPW_CRYPT_ERR_CRYPT_INIT_FAILED;
6553 if (param->u.crypt.key_len > 0 && (*crypt)->ops->set_key &&
6554 (*crypt)->ops->set_key(param->u.crypt.key,
6555 param->u.crypt.key_len, param->u.crypt.seq,
6556 (*crypt)->priv) < 0) {
6557 IPW_DEBUG_INFO("%s: key setting failed\n", dev->name);
6558 param->u.crypt.err = IPW_CRYPT_ERR_KEY_SET_FAILED;
6564 if (param->u.crypt.set_tx) {
6565 ieee->tx_keyidx = param->u.crypt.idx;
6566 sec.active_key = param->u.crypt.idx;
6567 sec.flags |= SEC_ACTIVE_KEY;
6569 sec.flags &= ~SEC_ACTIVE_KEY;
6571 if (param->u.crypt.alg != NULL) {
6572 memcpy(sec.keys[param->u.crypt.idx],
6573 param->u.crypt.key, param->u.crypt.key_len);
6574 sec.key_sizes[param->u.crypt.idx] = param->u.crypt.key_len;
6575 sec.flags |= (1 << param->u.crypt.idx);
6577 if (strcmp(param->u.crypt.alg, "WEP") == 0) {
6578 sec.flags |= SEC_LEVEL;
6579 sec.level = SEC_LEVEL_1;
6580 } else if (strcmp(param->u.crypt.alg, "TKIP") == 0) {
6581 sec.flags |= SEC_LEVEL;
6582 sec.level = SEC_LEVEL_2;
6583 } else if (strcmp(param->u.crypt.alg, "CCMP") == 0) {
6584 sec.flags |= SEC_LEVEL;
6585 sec.level = SEC_LEVEL_3;
6589 if (ieee->set_security)
6590 ieee->set_security(ieee->dev, &sec);
6592 /* Do not reset port if card is in Managed mode since resetting will
6593 * generate new IEEE 802.11 authentication which may end up in looping
6594 * with IEEE 802.1X. If your hardware requires a reset after WEP
6595 * configuration (for example... Prism2), implement the reset_port in
6596 * the callbacks structures used to initialize the 802.11 stack. */
6597 if (ieee->reset_on_keychange &&
6598 ieee->iw_mode != IW_MODE_INFRA &&
6599 ieee->reset_port && ieee->reset_port(dev)) {
6600 IPW_DEBUG_INFO("%s: reset_port failed\n", dev->name);
6601 param->u.crypt.err = IPW_CRYPT_ERR_CARD_CONF_FAILED;
6608 static int ipw_wpa_supplicant(struct net_device *dev, struct iw_point *p)
6610 struct ipw_param *param;
6611 struct ipw_priv *priv = ieee80211_priv(dev);
6614 IPW_DEBUG_INFO("wpa_supplicant: len=%d\n", p->length);
6616 if (p->length < sizeof(struct ipw_param) || !p->pointer)
6619 param = (struct ipw_param *)kmalloc(p->length, GFP_KERNEL);
6623 if (copy_from_user(param, p->pointer, p->length)) {
6629 switch (param->cmd) {
6631 case IPW_CMD_SET_WPA_PARAM:
6632 ret = ipw_wpa_set_param(dev, param->u.wpa_param.name,
6633 param->u.wpa_param.value);
6636 case IPW_CMD_SET_WPA_IE:
6637 ret = ipw_wpa_set_wpa_ie(dev, param, p->length);
6640 case IPW_CMD_SET_ENCRYPTION:
6641 ret = ipw_wpa_set_encryption(dev, param, p->length);
6645 ret = ipw_wpa_mlme(dev, param->u.mlme.command,
6646 param->u.mlme.reason_code);
6650 IPW_ERROR("%s: Unknown WPA supplicant request: %d\n",
6651 dev->name, param->cmd);
6656 if (ret == 0 && copy_to_user(p->pointer, param, p->length))
6668 static int ipw_wx_set_genie(struct net_device *dev,
6669 struct iw_request_info *info,
6670 union iwreq_data *wrqu, char *extra)
6672 struct ipw_priv *priv = ieee80211_priv(dev);
6673 struct ieee80211_device *ieee = priv->ieee;
6677 if (wrqu->data.length > MAX_WPA_IE_LEN ||
6678 (wrqu->data.length && extra == NULL))
6683 //if (!ieee->wpa_enabled) {
6684 // err = -EOPNOTSUPP;
6688 if (wrqu->data.length) {
6689 buf = kmalloc(wrqu->data.length, GFP_KERNEL);
6695 memcpy(buf, extra, wrqu->data.length);
6696 kfree(ieee->wpa_ie);
6698 ieee->wpa_ie_len = wrqu->data.length;
6700 kfree(ieee->wpa_ie);
6701 ieee->wpa_ie = NULL;
6702 ieee->wpa_ie_len = 0;
6705 ipw_wpa_assoc_frame(priv, ieee->wpa_ie, ieee->wpa_ie_len);
6712 static int ipw_wx_get_genie(struct net_device *dev,
6713 struct iw_request_info *info,
6714 union iwreq_data *wrqu, char *extra)
6716 struct ipw_priv *priv = ieee80211_priv(dev);
6717 struct ieee80211_device *ieee = priv->ieee;
6722 //if (!ieee->wpa_enabled) {
6723 // err = -EOPNOTSUPP;
6727 if (ieee->wpa_ie_len == 0 || ieee->wpa_ie == NULL) {
6728 wrqu->data.length = 0;
6732 if (wrqu->data.length < ieee->wpa_ie_len) {
6737 wrqu->data.length = ieee->wpa_ie_len;
6738 memcpy(extra, ieee->wpa_ie, ieee->wpa_ie_len);
6745 static int wext_cipher2level(int cipher)
6748 case IW_AUTH_CIPHER_NONE:
6750 case IW_AUTH_CIPHER_WEP40:
6751 case IW_AUTH_CIPHER_WEP104:
6753 case IW_AUTH_CIPHER_TKIP:
6755 case IW_AUTH_CIPHER_CCMP:
6763 static int ipw_wx_set_auth(struct net_device *dev,
6764 struct iw_request_info *info,
6765 union iwreq_data *wrqu, char *extra)
6767 struct ipw_priv *priv = ieee80211_priv(dev);
6768 struct ieee80211_device *ieee = priv->ieee;
6769 struct iw_param *param = &wrqu->param;
6770 struct ieee80211_crypt_data *crypt;
6771 unsigned long flags;
6774 switch (param->flags & IW_AUTH_INDEX) {
6775 case IW_AUTH_WPA_VERSION:
6777 case IW_AUTH_CIPHER_PAIRWISE:
6778 ipw_set_hw_decrypt_unicast(priv,
6779 wext_cipher2level(param->value));
6781 case IW_AUTH_CIPHER_GROUP:
6782 ipw_set_hw_decrypt_multicast(priv,
6783 wext_cipher2level(param->value));
6785 case IW_AUTH_KEY_MGMT:
6787 * ipw2200 does not use these parameters
6791 case IW_AUTH_TKIP_COUNTERMEASURES:
6792 crypt = priv->ieee->crypt[priv->ieee->tx_keyidx];
6793 if (!crypt || !crypt->ops->set_flags || !crypt->ops->get_flags) {
6794 IPW_WARNING("Can't set TKIP countermeasures: "
6795 "crypt not set!\n");
6799 flags = crypt->ops->get_flags(crypt->priv);
6802 flags |= IEEE80211_CRYPTO_TKIP_COUNTERMEASURES;
6804 flags &= ~IEEE80211_CRYPTO_TKIP_COUNTERMEASURES;
6806 crypt->ops->set_flags(flags, crypt->priv);
6810 case IW_AUTH_DROP_UNENCRYPTED:{
6813 * wpa_supplicant calls set_wpa_enabled when the driver
6814 * is loaded and unloaded, regardless of if WPA is being
6815 * used. No other calls are made which can be used to
6816 * determine if encryption will be used or not prior to
6817 * association being expected. If encryption is not being
6818 * used, drop_unencrypted is set to false, else true -- we
6819 * can use this to determine if the CAP_PRIVACY_ON bit should
6822 struct ieee80211_security sec = {
6823 .flags = SEC_ENABLED,
6824 .enabled = param->value,
6826 priv->ieee->drop_unencrypted = param->value;
6827 /* We only change SEC_LEVEL for open mode. Others
6828 * are set by ipw_wpa_set_encryption.
6830 if (!param->value) {
6831 sec.flags |= SEC_LEVEL;
6832 sec.level = SEC_LEVEL_0;
6834 sec.flags |= SEC_LEVEL;
6835 sec.level = SEC_LEVEL_1;
6837 if (priv->ieee->set_security)
6838 priv->ieee->set_security(priv->ieee->dev, &sec);
6842 case IW_AUTH_80211_AUTH_ALG:
6843 ret = ipw_wpa_set_auth_algs(priv, param->value);
6846 case IW_AUTH_WPA_ENABLED:
6847 ret = ipw_wpa_enable(priv, param->value);
6850 case IW_AUTH_RX_UNENCRYPTED_EAPOL:
6851 ieee->ieee802_1x = param->value;
6854 //case IW_AUTH_ROAMING_CONTROL:
6855 case IW_AUTH_PRIVACY_INVOKED:
6856 ieee->privacy_invoked = param->value;
6866 static int ipw_wx_get_auth(struct net_device *dev,
6867 struct iw_request_info *info,
6868 union iwreq_data *wrqu, char *extra)
6870 struct ipw_priv *priv = ieee80211_priv(dev);
6871 struct ieee80211_device *ieee = priv->ieee;
6872 struct ieee80211_crypt_data *crypt;
6873 struct iw_param *param = &wrqu->param;
6876 switch (param->flags & IW_AUTH_INDEX) {
6877 case IW_AUTH_WPA_VERSION:
6878 case IW_AUTH_CIPHER_PAIRWISE:
6879 case IW_AUTH_CIPHER_GROUP:
6880 case IW_AUTH_KEY_MGMT:
6882 * wpa_supplicant will control these internally
6887 case IW_AUTH_TKIP_COUNTERMEASURES:
6888 crypt = priv->ieee->crypt[priv->ieee->tx_keyidx];
6889 if (!crypt || !crypt->ops->get_flags) {
6890 IPW_WARNING("Can't get TKIP countermeasures: "
6891 "crypt not set!\n");
6895 param->value = (crypt->ops->get_flags(crypt->priv) &
6896 IEEE80211_CRYPTO_TKIP_COUNTERMEASURES) ? 1 : 0;
6900 case IW_AUTH_DROP_UNENCRYPTED:
6901 param->value = ieee->drop_unencrypted;
6904 case IW_AUTH_80211_AUTH_ALG:
6905 param->value = ieee->sec.auth_mode;
6908 case IW_AUTH_WPA_ENABLED:
6909 param->value = ieee->wpa_enabled;
6912 case IW_AUTH_RX_UNENCRYPTED_EAPOL:
6913 param->value = ieee->ieee802_1x;
6916 case IW_AUTH_ROAMING_CONTROL:
6917 case IW_AUTH_PRIVACY_INVOKED:
6918 param->value = ieee->privacy_invoked;
6927 /* SIOCSIWENCODEEXT */
6928 static int ipw_wx_set_encodeext(struct net_device *dev,
6929 struct iw_request_info *info,
6930 union iwreq_data *wrqu, char *extra)
6932 struct ipw_priv *priv = ieee80211_priv(dev);
6933 struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;
6936 /* IPW HW can't build TKIP MIC, host decryption still needed */
6937 if (ext->alg == IW_ENCODE_ALG_TKIP) {
6938 priv->ieee->host_encrypt = 0;
6939 priv->ieee->host_encrypt_msdu = 1;
6940 priv->ieee->host_decrypt = 1;
6942 priv->ieee->host_encrypt = 0;
6943 priv->ieee->host_encrypt_msdu = 0;
6944 priv->ieee->host_decrypt = 0;
6948 return ieee80211_wx_set_encodeext(priv->ieee, info, wrqu, extra);
6951 /* SIOCGIWENCODEEXT */
6952 static int ipw_wx_get_encodeext(struct net_device *dev,
6953 struct iw_request_info *info,
6954 union iwreq_data *wrqu, char *extra)
6956 struct ipw_priv *priv = ieee80211_priv(dev);
6957 return ieee80211_wx_get_encodeext(priv->ieee, info, wrqu, extra);
6961 static int ipw_wx_set_mlme(struct net_device *dev,
6962 struct iw_request_info *info,
6963 union iwreq_data *wrqu, char *extra)
6965 struct ipw_priv *priv = ieee80211_priv(dev);
6966 struct iw_mlme *mlme = (struct iw_mlme *)extra;
6969 reason = cpu_to_le16(mlme->reason_code);
6971 switch (mlme->cmd) {
6972 case IW_MLME_DEAUTH:
6976 case IW_MLME_DISASSOC:
6977 ipw_disassociate(priv);
6987 #ifdef CONFIG_IPW_QOS
6991 * get the modulation type of the current network or
6992 * the card current mode
6994 u8 ipw_qos_current_mode(struct ipw_priv * priv)
6998 if (priv->status & STATUS_ASSOCIATED) {
6999 unsigned long flags;
7001 spin_lock_irqsave(&priv->ieee->lock, flags);
7002 mode = priv->assoc_network->mode;
7003 spin_unlock_irqrestore(&priv->ieee->lock, flags);
7005 mode = priv->ieee->mode;
7007 IPW_DEBUG_QOS("QoS network/card mode %d \n", mode);
7012 * Handle management frame beacon and probe response
7014 static int ipw_qos_handle_probe_reponse(struct ipw_priv *priv,
7016 struct ieee80211_network *network)
7018 u32 size = sizeof(struct ieee80211_qos_parameters);
7020 if (network->capability & WLAN_CAPABILITY_IBSS)
7021 network->qos_data.active = network->qos_data.supported;
7023 if (network->flags & NETWORK_HAS_QOS_MASK) {
7024 if (active_network &&
7025 (network->flags & NETWORK_HAS_QOS_PARAMETERS))
7026 network->qos_data.active = network->qos_data.supported;
7028 if ((network->qos_data.active == 1) && (active_network == 1) &&
7029 (network->flags & NETWORK_HAS_QOS_PARAMETERS) &&
7030 (network->qos_data.old_param_count !=
7031 network->qos_data.param_count)) {
7032 network->qos_data.old_param_count =
7033 network->qos_data.param_count;
7034 schedule_work(&priv->qos_activate);
7035 IPW_DEBUG_QOS("QoS parameters change call "
7039 if ((priv->ieee->mode == IEEE_B) || (network->mode == IEEE_B))
7040 memcpy(&network->qos_data.parameters,
7041 &def_parameters_CCK, size);
7043 memcpy(&network->qos_data.parameters,
7044 &def_parameters_OFDM, size);
7046 if ((network->qos_data.active == 1) && (active_network == 1)) {
7047 IPW_DEBUG_QOS("QoS was disabled call qos_activate \n");
7048 schedule_work(&priv->qos_activate);
7051 network->qos_data.active = 0;
7052 network->qos_data.supported = 0;
7054 if ((priv->status & STATUS_ASSOCIATED) &&
7055 (priv->ieee->iw_mode == IW_MODE_ADHOC) && (active_network == 0)) {
7056 if (memcmp(network->bssid, priv->bssid, ETH_ALEN))
7057 if ((network->capability & WLAN_CAPABILITY_IBSS) &&
7058 !(network->flags & NETWORK_EMPTY_ESSID))
7059 if ((network->ssid_len ==
7060 priv->assoc_network->ssid_len) &&
7061 !memcmp(network->ssid,
7062 priv->assoc_network->ssid,
7063 network->ssid_len)) {
7064 queue_work(priv->workqueue,
7065 &priv->merge_networks);
7073 * This function set up the firmware to support QoS. It sends
7074 * IPW_CMD_QOS_PARAMETERS and IPW_CMD_WME_INFO
7076 static int ipw_qos_activate(struct ipw_priv *priv,
7077 struct ieee80211_qos_data *qos_network_data)
7080 struct ieee80211_qos_parameters qos_parameters[QOS_QOS_SETS];
7081 struct ieee80211_qos_parameters *active_one = NULL;
7082 u32 size = sizeof(struct ieee80211_qos_parameters);
7087 type = ipw_qos_current_mode(priv);
7089 active_one = &(qos_parameters[QOS_PARAM_SET_DEF_CCK]);
7090 memcpy(active_one, priv->qos_data.def_qos_parm_CCK, size);
7091 active_one = &(qos_parameters[QOS_PARAM_SET_DEF_OFDM]);
7092 memcpy(active_one, priv->qos_data.def_qos_parm_OFDM, size);
7094 if (qos_network_data == NULL) {
7095 if (type == IEEE_B) {
7096 IPW_DEBUG_QOS("QoS activate network mode %d\n", type);
7097 active_one = &def_parameters_CCK;
7099 active_one = &def_parameters_OFDM;
7101 memcpy(&qos_parameters[QOS_PARAM_SET_ACTIVE], active_one, size);
7102 burst_duration = ipw_qos_get_burst_duration(priv);
7103 for (i = 0; i < QOS_QUEUE_NUM; i++)
7104 qos_parameters[QOS_PARAM_SET_ACTIVE].tx_op_limit[i] =
7105 (u16) burst_duration;
7106 } else if (priv->ieee->iw_mode == IW_MODE_ADHOC) {
7107 if (type == IEEE_B) {
7108 IPW_DEBUG_QOS("QoS activate IBSS nework mode %d\n",
7110 if (priv->qos_data.qos_enable == 0)
7111 active_one = &def_parameters_CCK;
7113 active_one = priv->qos_data.def_qos_parm_CCK;
7115 if (priv->qos_data.qos_enable == 0)
7116 active_one = &def_parameters_OFDM;
7118 active_one = priv->qos_data.def_qos_parm_OFDM;
7120 memcpy(&qos_parameters[QOS_PARAM_SET_ACTIVE], active_one, size);
7122 unsigned long flags;
7125 spin_lock_irqsave(&priv->ieee->lock, flags);
7126 active_one = &(qos_network_data->parameters);
7127 qos_network_data->old_param_count =
7128 qos_network_data->param_count;
7129 memcpy(&qos_parameters[QOS_PARAM_SET_ACTIVE], active_one, size);
7130 active = qos_network_data->supported;
7131 spin_unlock_irqrestore(&priv->ieee->lock, flags);
7134 burst_duration = ipw_qos_get_burst_duration(priv);
7135 for (i = 0; i < QOS_QUEUE_NUM; i++)
7136 qos_parameters[QOS_PARAM_SET_ACTIVE].
7137 tx_op_limit[i] = (u16) burst_duration;
7141 IPW_DEBUG_QOS("QoS sending IPW_CMD_QOS_PARAMETERS\n");
7142 err = ipw_send_qos_params_command(priv,
7143 (struct ieee80211_qos_parameters *)
7144 &(qos_parameters[0]));
7146 IPW_DEBUG_QOS("QoS IPW_CMD_QOS_PARAMETERS failed\n");
7152 * send IPW_CMD_WME_INFO to the firmware
7154 static int ipw_qos_set_info_element(struct ipw_priv *priv)
7157 struct ieee80211_qos_information_element qos_info;
7162 qos_info.elementID = QOS_ELEMENT_ID;
7163 qos_info.length = sizeof(struct ieee80211_qos_information_element) - 2;
7165 qos_info.version = QOS_VERSION_1;
7166 qos_info.ac_info = 0;
7168 memcpy(qos_info.qui, qos_oui, QOS_OUI_LEN);
7169 qos_info.qui_type = QOS_OUI_TYPE;
7170 qos_info.qui_subtype = QOS_OUI_INFO_SUB_TYPE;
7172 ret = ipw_send_qos_info_command(priv, &qos_info);
7174 IPW_DEBUG_QOS("QoS error calling ipw_send_qos_info_command\n");
7180 * Set the QoS parameter with the association request structure
7182 static int ipw_qos_association(struct ipw_priv *priv,
7183 struct ieee80211_network *network)
7186 struct ieee80211_qos_data *qos_data = NULL;
7187 struct ieee80211_qos_data ibss_data = {
7192 switch (priv->ieee->iw_mode) {
7194 if (!(network->capability & WLAN_CAPABILITY_IBSS))
7197 qos_data = &ibss_data;
7201 qos_data = &network->qos_data;
7209 err = ipw_qos_activate(priv, qos_data);
7211 priv->assoc_request.policy_support &= ~HC_QOS_SUPPORT_ASSOC;
7215 if (priv->qos_data.qos_enable && qos_data->supported) {
7216 IPW_DEBUG_QOS("QoS will be enabled for this association\n");
7217 priv->assoc_request.policy_support |= HC_QOS_SUPPORT_ASSOC;
7218 return ipw_qos_set_info_element(priv);
7225 * handling the beaconing responces. if we get different QoS setting
7226 * of the network from the the associated setting adjust the QoS
7229 static int ipw_qos_association_resp(struct ipw_priv *priv,
7230 struct ieee80211_network *network)
7233 unsigned long flags;
7234 u32 size = sizeof(struct ieee80211_qos_parameters);
7235 int set_qos_param = 0;
7237 if ((priv == NULL) || (network == NULL) ||
7238 (priv->assoc_network == NULL))
7241 if (!(priv->status & STATUS_ASSOCIATED))
7244 if ((priv->ieee->iw_mode != IW_MODE_INFRA))
7247 spin_lock_irqsave(&priv->ieee->lock, flags);
7248 if (network->flags & NETWORK_HAS_QOS_PARAMETERS) {
7249 memcpy(&priv->assoc_network->qos_data, &network->qos_data,
7250 sizeof(struct ieee80211_qos_data));
7251 priv->assoc_network->qos_data.active = 1;
7252 if ((network->qos_data.old_param_count !=
7253 network->qos_data.param_count)) {
7255 network->qos_data.old_param_count =
7256 network->qos_data.param_count;
7260 if ((network->mode == IEEE_B) || (priv->ieee->mode == IEEE_B))
7261 memcpy(&priv->assoc_network->qos_data.parameters,
7262 &def_parameters_CCK, size);
7264 memcpy(&priv->assoc_network->qos_data.parameters,
7265 &def_parameters_OFDM, size);
7266 priv->assoc_network->qos_data.active = 0;
7267 priv->assoc_network->qos_data.supported = 0;
7271 spin_unlock_irqrestore(&priv->ieee->lock, flags);
7273 if (set_qos_param == 1)
7274 schedule_work(&priv->qos_activate);
7279 static u32 ipw_qos_get_burst_duration(struct ipw_priv *priv)
7286 if (!(priv->ieee->modulation & IEEE80211_OFDM_MODULATION))
7287 ret = priv->qos_data.burst_duration_CCK;
7289 ret = priv->qos_data.burst_duration_OFDM;
7295 * Initialize the setting of QoS global
7297 static void ipw_qos_init(struct ipw_priv *priv, int enable,
7298 int burst_enable, u32 burst_duration_CCK,
7299 u32 burst_duration_OFDM)
7301 priv->qos_data.qos_enable = enable;
7303 if (priv->qos_data.qos_enable) {
7304 priv->qos_data.def_qos_parm_CCK = &def_qos_parameters_CCK;
7305 priv->qos_data.def_qos_parm_OFDM = &def_qos_parameters_OFDM;
7306 IPW_DEBUG_QOS("QoS is enabled\n");
7308 priv->qos_data.def_qos_parm_CCK = &def_parameters_CCK;
7309 priv->qos_data.def_qos_parm_OFDM = &def_parameters_OFDM;
7310 IPW_DEBUG_QOS("QoS is not enabled\n");
7313 priv->qos_data.burst_enable = burst_enable;
7316 priv->qos_data.burst_duration_CCK = burst_duration_CCK;
7317 priv->qos_data.burst_duration_OFDM = burst_duration_OFDM;
7319 priv->qos_data.burst_duration_CCK = 0;
7320 priv->qos_data.burst_duration_OFDM = 0;
7325 * map the packet priority to the right TX Queue
7327 static int ipw_get_tx_queue_number(struct ipw_priv *priv, u16 priority)
7329 if (priority > 7 || !priv->qos_data.qos_enable)
7332 return from_priority_to_tx_queue[priority] - 1;
7336 * add QoS parameter to the TX command
7338 static int ipw_qos_set_tx_queue_command(struct ipw_priv *priv,
7340 struct tfd_data *tfd, u8 unicast)
7343 int tx_queue_id = 0;
7344 struct ieee80211_qos_data *qos_data = NULL;
7345 int active, supported;
7346 unsigned long flags;
7348 if (!(priv->status & STATUS_ASSOCIATED))
7351 qos_data = &priv->assoc_network->qos_data;
7353 spin_lock_irqsave(&priv->ieee->lock, flags);
7355 if (priv->ieee->iw_mode == IW_MODE_ADHOC) {
7357 qos_data->active = 0;
7359 qos_data->active = qos_data->supported;
7362 active = qos_data->active;
7363 supported = qos_data->supported;
7365 spin_unlock_irqrestore(&priv->ieee->lock, flags);
7367 IPW_DEBUG_QOS("QoS %d network is QoS active %d supported %d "
7369 priv->qos_data.qos_enable, active, supported, unicast);
7370 if (active && priv->qos_data.qos_enable) {
7371 ret = from_priority_to_tx_queue[priority];
7372 tx_queue_id = ret - 1;
7373 IPW_DEBUG_QOS("QoS packet priority is %d \n", priority);
7374 if (priority <= 7) {
7375 tfd->tx_flags_ext |= DCT_FLAG_EXT_QOS_ENABLED;
7376 tfd->tfd.tfd_26.mchdr.qos_ctrl = priority;
7377 tfd->tfd.tfd_26.mchdr.frame_ctl |=
7378 IEEE80211_STYPE_QOS_DATA;
7380 if (priv->qos_data.qos_no_ack_mask &
7381 (1UL << tx_queue_id)) {
7382 tfd->tx_flags &= ~DCT_FLAG_ACK_REQD;
7383 tfd->tfd.tfd_26.mchdr.qos_ctrl |=
7393 * background support to run QoS activate functionality
7395 static void ipw_bg_qos_activate(void *data)
7397 struct ipw_priv *priv = data;
7404 if (priv->status & STATUS_ASSOCIATED)
7405 ipw_qos_activate(priv, &(priv->assoc_network->qos_data));
7411 * Handler for probe responce and beacon frame
7413 static int ipw_handle_management(struct net_device *dev,
7414 struct ieee80211_network *network, u16 type)
7416 struct ipw_priv *priv = ieee80211_priv(dev);
7419 if (priv->status & STATUS_ASSOCIATED && network == priv->assoc_network)
7425 case IEEE80211_STYPE_PROBE_RESP:
7426 case IEEE80211_STYPE_BEACON:
7427 ipw_qos_handle_probe_reponse(priv, active_network, network);
7429 case IEEE80211_STYPE_ASSOC_RESP:
7430 ipw_qos_association_resp(priv, network);
7439 static int ipw_send_qos_params_command(struct ipw_priv *priv, struct ieee80211_qos_parameters
7442 struct host_cmd cmd = {
7443 .cmd = IPW_CMD_QOS_PARAMETERS,
7444 .len = (sizeof(struct ieee80211_qos_parameters) * 3)
7447 memcpy(cmd.param, qos_param, sizeof(*qos_param) * 3);
7448 return ipw_send_cmd(priv, &cmd);
7451 static int ipw_send_qos_info_command(struct ipw_priv *priv, struct ieee80211_qos_information_element
7454 struct host_cmd cmd = {
7455 .cmd = IPW_CMD_WME_INFO,
7456 .len = sizeof(*qos_param)
7459 memcpy(cmd.param, qos_param, sizeof(*qos_param));
7460 return ipw_send_cmd(priv, &cmd);
7463 #endif /* CONFIG_IPW_QOS */
7465 static int ipw_associate_network(struct ipw_priv *priv,
7466 struct ieee80211_network *network,
7467 struct ipw_supported_rates *rates, int roaming)
7471 if (priv->config & CFG_FIXED_RATE)
7472 ipw_set_fixed_rate(priv, network->mode);
7474 if (!(priv->config & CFG_STATIC_ESSID)) {
7475 priv->essid_len = min(network->ssid_len,
7476 (u8) IW_ESSID_MAX_SIZE);
7477 memcpy(priv->essid, network->ssid, priv->essid_len);
7480 network->last_associate = jiffies;
7482 memset(&priv->assoc_request, 0, sizeof(priv->assoc_request));
7483 priv->assoc_request.channel = network->channel;
7484 if ((priv->capability & CAP_PRIVACY_ON) &&
7485 (priv->capability & CAP_SHARED_KEY)) {
7486 priv->assoc_request.auth_type = AUTH_SHARED_KEY;
7487 priv->assoc_request.auth_key = priv->ieee->sec.active_key;
7489 if ((priv->capability & CAP_PRIVACY_ON) &&
7490 (priv->ieee->sec.level == SEC_LEVEL_1) &&
7491 !(priv->ieee->host_encrypt || priv->ieee->host_decrypt))
7492 ipw_send_wep_keys(priv, DCW_WEP_KEY_SEC_TYPE_WEP);
7494 priv->assoc_request.auth_type = AUTH_OPEN;
7495 priv->assoc_request.auth_key = 0;
7498 if (priv->ieee->wpa_ie_len) {
7499 priv->assoc_request.policy_support = 0x02; /* RSN active */
7500 ipw_set_rsn_capa(priv, priv->ieee->wpa_ie,
7501 priv->ieee->wpa_ie_len);
7505 * It is valid for our ieee device to support multiple modes, but
7506 * when it comes to associating to a given network we have to choose
7509 if (network->mode & priv->ieee->mode & IEEE_A)
7510 priv->assoc_request.ieee_mode = IPW_A_MODE;
7511 else if (network->mode & priv->ieee->mode & IEEE_G)
7512 priv->assoc_request.ieee_mode = IPW_G_MODE;
7513 else if (network->mode & priv->ieee->mode & IEEE_B)
7514 priv->assoc_request.ieee_mode = IPW_B_MODE;
7516 priv->assoc_request.capability = network->capability;
7517 if ((network->capability & WLAN_CAPABILITY_SHORT_PREAMBLE)
7518 && !(priv->config & CFG_PREAMBLE_LONG)) {
7519 priv->assoc_request.preamble_length = DCT_FLAG_SHORT_PREAMBLE;
7521 priv->assoc_request.preamble_length = DCT_FLAG_LONG_PREAMBLE;
7523 /* Clear the short preamble if we won't be supporting it */
7524 priv->assoc_request.capability &=
7525 ~WLAN_CAPABILITY_SHORT_PREAMBLE;
7528 /* Clear capability bits that aren't used in Ad Hoc */
7529 if (priv->ieee->iw_mode == IW_MODE_ADHOC)
7530 priv->assoc_request.capability &=
7531 ~WLAN_CAPABILITY_SHORT_SLOT_TIME;
7533 IPW_DEBUG_ASSOC("%sssocation attempt: '%s', channel %d, "
7534 "802.11%c [%d], %s[:%s], enc=%s%s%s%c%c\n",
7535 roaming ? "Rea" : "A",
7536 escape_essid(priv->essid, priv->essid_len),
7538 ipw_modes[priv->assoc_request.ieee_mode],
7540 (priv->assoc_request.preamble_length ==
7541 DCT_FLAG_LONG_PREAMBLE) ? "long" : "short",
7542 network->capability &
7543 WLAN_CAPABILITY_SHORT_PREAMBLE ? "short" : "long",
7544 priv->capability & CAP_PRIVACY_ON ? "on " : "off",
7545 priv->capability & CAP_PRIVACY_ON ?
7546 (priv->capability & CAP_SHARED_KEY ? "(shared)" :
7548 priv->capability & CAP_PRIVACY_ON ? " key=" : "",
7549 priv->capability & CAP_PRIVACY_ON ?
7550 '1' + priv->ieee->sec.active_key : '.',
7551 priv->capability & CAP_PRIVACY_ON ? '.' : ' ');
7553 priv->assoc_request.beacon_interval = network->beacon_interval;
7554 if ((priv->ieee->iw_mode == IW_MODE_ADHOC) &&
7555 (network->time_stamp[0] == 0) && (network->time_stamp[1] == 0)) {
7556 priv->assoc_request.assoc_type = HC_IBSS_START;
7557 priv->assoc_request.assoc_tsf_msw = 0;
7558 priv->assoc_request.assoc_tsf_lsw = 0;
7560 if (unlikely(roaming))
7561 priv->assoc_request.assoc_type = HC_REASSOCIATE;
7563 priv->assoc_request.assoc_type = HC_ASSOCIATE;
7564 priv->assoc_request.assoc_tsf_msw = network->time_stamp[1];
7565 priv->assoc_request.assoc_tsf_lsw = network->time_stamp[0];
7568 memcpy(priv->assoc_request.bssid, network->bssid, ETH_ALEN);
7570 if (priv->ieee->iw_mode == IW_MODE_ADHOC) {
7571 memset(&priv->assoc_request.dest, 0xFF, ETH_ALEN);
7572 priv->assoc_request.atim_window = network->atim_window;
7574 memcpy(priv->assoc_request.dest, network->bssid, ETH_ALEN);
7575 priv->assoc_request.atim_window = 0;
7578 priv->assoc_request.listen_interval = network->listen_interval;
7580 err = ipw_send_ssid(priv, priv->essid, priv->essid_len);
7582 IPW_DEBUG_HC("Attempt to send SSID command failed.\n");
7586 rates->ieee_mode = priv->assoc_request.ieee_mode;
7587 rates->purpose = IPW_RATE_CONNECT;
7588 ipw_send_supported_rates(priv, rates);
7590 if (priv->assoc_request.ieee_mode == IPW_G_MODE)
7591 priv->sys_config.dot11g_auto_detection = 1;
7593 priv->sys_config.dot11g_auto_detection = 0;
7595 if (priv->ieee->iw_mode == IW_MODE_ADHOC)
7596 priv->sys_config.answer_broadcast_ssid_probe = 1;
7598 priv->sys_config.answer_broadcast_ssid_probe = 0;
7600 err = ipw_send_system_config(priv, &priv->sys_config);
7602 IPW_DEBUG_HC("Attempt to send sys config command failed.\n");
7606 IPW_DEBUG_ASSOC("Association sensitivity: %d\n", network->stats.rssi);
7607 err = ipw_set_sensitivity(priv, network->stats.rssi + IPW_RSSI_TO_DBM);
7609 IPW_DEBUG_HC("Attempt to send associate command failed.\n");
7614 * If preemption is enabled, it is possible for the association
7615 * to complete before we return from ipw_send_associate. Therefore
7616 * we have to be sure and update our priviate data first.
7618 priv->channel = network->channel;
7619 memcpy(priv->bssid, network->bssid, ETH_ALEN);
7620 priv->status |= STATUS_ASSOCIATING;
7621 priv->status &= ~STATUS_SECURITY_UPDATED;
7623 priv->assoc_network = network;
7625 #ifdef CONFIG_IPW_QOS
7626 ipw_qos_association(priv, network);
7629 err = ipw_send_associate(priv, &priv->assoc_request);
7631 IPW_DEBUG_HC("Attempt to send associate command failed.\n");
7635 IPW_DEBUG(IPW_DL_STATE, "associating: '%s' " MAC_FMT " \n",
7636 escape_essid(priv->essid, priv->essid_len),
7637 MAC_ARG(priv->bssid));
7642 static void ipw_roam(void *data)
7644 struct ipw_priv *priv = data;
7645 struct ieee80211_network *network = NULL;
7646 struct ipw_network_match match = {
7647 .network = priv->assoc_network
7650 /* The roaming process is as follows:
7652 * 1. Missed beacon threshold triggers the roaming process by
7653 * setting the status ROAM bit and requesting a scan.
7654 * 2. When the scan completes, it schedules the ROAM work
7655 * 3. The ROAM work looks at all of the known networks for one that
7656 * is a better network than the currently associated. If none
7657 * found, the ROAM process is over (ROAM bit cleared)
7658 * 4. If a better network is found, a disassociation request is
7660 * 5. When the disassociation completes, the roam work is again
7661 * scheduled. The second time through, the driver is no longer
7662 * associated, and the newly selected network is sent an
7663 * association request.
7664 * 6. At this point ,the roaming process is complete and the ROAM
7665 * status bit is cleared.
7668 /* If we are no longer associated, and the roaming bit is no longer
7669 * set, then we are not actively roaming, so just return */
7670 if (!(priv->status & (STATUS_ASSOCIATED | STATUS_ROAMING)))
7673 if (priv->status & STATUS_ASSOCIATED) {
7674 /* First pass through ROAM process -- look for a better
7676 unsigned long flags;
7677 u8 rssi = priv->assoc_network->stats.rssi;
7678 priv->assoc_network->stats.rssi = -128;
7679 spin_lock_irqsave(&priv->ieee->lock, flags);
7680 list_for_each_entry(network, &priv->ieee->network_list, list) {
7681 if (network != priv->assoc_network)
7682 ipw_best_network(priv, &match, network, 1);
7684 spin_unlock_irqrestore(&priv->ieee->lock, flags);
7685 priv->assoc_network->stats.rssi = rssi;
7687 if (match.network == priv->assoc_network) {
7688 IPW_DEBUG_ASSOC("No better APs in this network to "
7690 priv->status &= ~STATUS_ROAMING;
7691 ipw_debug_config(priv);
7695 ipw_send_disassociate(priv, 1);
7696 priv->assoc_network = match.network;
7701 /* Second pass through ROAM process -- request association */
7702 ipw_compatible_rates(priv, priv->assoc_network, &match.rates);
7703 ipw_associate_network(priv, priv->assoc_network, &match.rates, 1);
7704 priv->status &= ~STATUS_ROAMING;
7707 static void ipw_bg_roam(void *data)
7709 struct ipw_priv *priv = data;
7715 static int ipw_associate(void *data)
7717 struct ipw_priv *priv = data;
7719 struct ieee80211_network *network = NULL;
7720 struct ipw_network_match match = {
7723 struct ipw_supported_rates *rates;
7724 struct list_head *element;
7725 unsigned long flags;
7727 if (priv->ieee->iw_mode == IW_MODE_MONITOR) {
7728 IPW_DEBUG_ASSOC("Not attempting association (monitor mode)\n");
7732 if (priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING)) {
7733 IPW_DEBUG_ASSOC("Not attempting association (already in "
7738 if (!ipw_is_init(priv) || (priv->status & STATUS_SCANNING)) {
7739 IPW_DEBUG_ASSOC("Not attempting association (scanning or not "
7744 if (!(priv->config & CFG_ASSOCIATE) &&
7745 !(priv->config & (CFG_STATIC_ESSID |
7746 CFG_STATIC_CHANNEL | CFG_STATIC_BSSID))) {
7747 IPW_DEBUG_ASSOC("Not attempting association (associate=0)\n");
7751 /* Protect our use of the network_list */
7752 spin_lock_irqsave(&priv->ieee->lock, flags);
7753 list_for_each_entry(network, &priv->ieee->network_list, list)
7754 ipw_best_network(priv, &match, network, 0);
7756 network = match.network;
7757 rates = &match.rates;
7759 if (network == NULL &&
7760 priv->ieee->iw_mode == IW_MODE_ADHOC &&
7761 priv->config & CFG_ADHOC_CREATE &&
7762 priv->config & CFG_STATIC_ESSID &&
7763 priv->config & CFG_STATIC_CHANNEL &&
7764 !list_empty(&priv->ieee->network_free_list)) {
7765 element = priv->ieee->network_free_list.next;
7766 network = list_entry(element, struct ieee80211_network, list);
7767 ipw_adhoc_create(priv, network);
7768 rates = &priv->rates;
7770 list_add_tail(&network->list, &priv->ieee->network_list);
7772 spin_unlock_irqrestore(&priv->ieee->lock, flags);
7774 /* If we reached the end of the list, then we don't have any valid
7777 ipw_debug_config(priv);
7779 if (!(priv->status & STATUS_SCANNING)) {
7780 if (!(priv->config & CFG_SPEED_SCAN))
7781 queue_delayed_work(priv->workqueue,
7782 &priv->request_scan,
7785 queue_work(priv->workqueue,
7786 &priv->request_scan);
7792 ipw_associate_network(priv, network, rates, 0);
7797 static void ipw_bg_associate(void *data)
7799 struct ipw_priv *priv = data;
7801 ipw_associate(data);
7805 static void ipw_rebuild_decrypted_skb(struct ipw_priv *priv,
7806 struct sk_buff *skb)
7808 struct ieee80211_hdr *hdr;
7811 hdr = (struct ieee80211_hdr *)skb->data;
7812 fc = le16_to_cpu(hdr->frame_ctl);
7813 if (!(fc & IEEE80211_FCTL_PROTECTED))
7816 fc &= ~IEEE80211_FCTL_PROTECTED;
7817 hdr->frame_ctl = cpu_to_le16(fc);
7818 switch (priv->ieee->sec.level) {
7820 /* Remove CCMP HDR */
7821 memmove(skb->data + IEEE80211_3ADDR_LEN,
7822 skb->data + IEEE80211_3ADDR_LEN + 8,
7823 skb->len - IEEE80211_3ADDR_LEN - 8);
7824 if (fc & IEEE80211_FCTL_MOREFRAGS)
7825 skb_trim(skb, skb->len - 16); /* 2*MIC */
7827 skb_trim(skb, skb->len - 8); /* MIC */
7833 memmove(skb->data + IEEE80211_3ADDR_LEN,
7834 skb->data + IEEE80211_3ADDR_LEN + 4,
7835 skb->len - IEEE80211_3ADDR_LEN - 4);
7836 if (fc & IEEE80211_FCTL_MOREFRAGS)
7837 skb_trim(skb, skb->len - 8); /* 2*ICV */
7839 skb_trim(skb, skb->len - 4); /* ICV */
7844 printk(KERN_ERR "Unknow security level %d\n",
7845 priv->ieee->sec.level);
7850 static void ipw_handle_data_packet(struct ipw_priv *priv,
7851 struct ipw_rx_mem_buffer *rxb,
7852 struct ieee80211_rx_stats *stats)
7854 struct ipw_rx_packet *pkt = (struct ipw_rx_packet *)rxb->skb->data;
7856 /* We received data from the HW, so stop the watchdog */
7857 priv->net_dev->trans_start = jiffies;
7859 /* We only process data packets if the
7860 * interface is open */
7861 if (unlikely((le16_to_cpu(pkt->u.frame.length) + IPW_RX_FRAME_SIZE) >
7862 skb_tailroom(rxb->skb))) {
7863 priv->ieee->stats.rx_errors++;
7864 priv->wstats.discard.misc++;
7865 IPW_DEBUG_DROP("Corruption detected! Oh no!\n");
7867 } else if (unlikely(!netif_running(priv->net_dev))) {
7868 priv->ieee->stats.rx_dropped++;
7869 priv->wstats.discard.misc++;
7870 IPW_DEBUG_DROP("Dropping packet while interface is not up.\n");
7874 /* Advance skb->data to the start of the actual payload */
7875 skb_reserve(rxb->skb, offsetof(struct ipw_rx_packet, u.frame.data));
7877 /* Set the size of the skb to the size of the frame */
7878 skb_put(rxb->skb, le16_to_cpu(pkt->u.frame.length));
7880 IPW_DEBUG_RX("Rx packet of %d bytes.\n", rxb->skb->len);
7882 /* HW decrypt will not clear the WEP bit, MIC, PN, etc. */
7883 if (!priv->ieee->host_decrypt)
7884 ipw_rebuild_decrypted_skb(priv, rxb->skb);
7886 if (!ieee80211_rx(priv->ieee, rxb->skb, stats))
7887 priv->ieee->stats.rx_errors++;
7888 else { /* ieee80211_rx succeeded, so it now owns the SKB */
7890 __ipw_led_activity_on(priv);
7894 static inline int is_network_packet(struct ipw_priv *priv,
7895 struct ieee80211_hdr_4addr *header)
7897 /* Filter incoming packets to determine if they are targetted toward
7898 * this network, discarding packets coming from ourselves */
7899 switch (priv->ieee->iw_mode) {
7900 case IW_MODE_ADHOC: /* Header: Dest. | Source | BSSID */
7901 /* packets from our adapter are dropped (echo) */
7902 if (!memcmp(header->addr2, priv->net_dev->dev_addr, ETH_ALEN))
7905 /* multicast packets to our IBSS go through */
7906 if (is_multicast_ether_addr(header->addr1))
7907 return !memcmp(header->addr3, priv->bssid, ETH_ALEN);
7909 /* packets to our adapter go through */
7910 return !memcmp(header->addr1, priv->net_dev->dev_addr,
7913 case IW_MODE_INFRA: /* Header: Dest. | AP{BSSID} | Source */
7914 /* packets from our adapter are dropped (echo) */
7915 if (!memcmp(header->addr3, priv->net_dev->dev_addr, ETH_ALEN))
7918 /* {broad,multi}cast packets to our IBSS go through */
7919 if (is_multicast_ether_addr(header->addr1))
7920 return !memcmp(header->addr2, priv->bssid, ETH_ALEN);
7922 /* packets to our adapter go through */
7923 return !memcmp(header->addr1, priv->net_dev->dev_addr,
7930 #define IPW_PACKET_RETRY_TIME HZ
7932 static inline int is_duplicate_packet(struct ipw_priv *priv,
7933 struct ieee80211_hdr_4addr *header)
7935 u16 sc = le16_to_cpu(header->seq_ctl);
7936 u16 seq = WLAN_GET_SEQ_SEQ(sc);
7937 u16 frag = WLAN_GET_SEQ_FRAG(sc);
7938 u16 *last_seq, *last_frag;
7939 unsigned long *last_time;
7941 switch (priv->ieee->iw_mode) {
7944 struct list_head *p;
7945 struct ipw_ibss_seq *entry = NULL;
7946 u8 *mac = header->addr2;
7947 int index = mac[5] % IPW_IBSS_MAC_HASH_SIZE;
7949 __list_for_each(p, &priv->ibss_mac_hash[index]) {
7951 list_entry(p, struct ipw_ibss_seq, list);
7952 if (!memcmp(entry->mac, mac, ETH_ALEN))
7955 if (p == &priv->ibss_mac_hash[index]) {
7956 entry = kmalloc(sizeof(*entry), GFP_ATOMIC);
7959 ("Cannot malloc new mac entry\n");
7962 memcpy(entry->mac, mac, ETH_ALEN);
7963 entry->seq_num = seq;
7964 entry->frag_num = frag;
7965 entry->packet_time = jiffies;
7966 list_add(&entry->list,
7967 &priv->ibss_mac_hash[index]);
7970 last_seq = &entry->seq_num;
7971 last_frag = &entry->frag_num;
7972 last_time = &entry->packet_time;
7976 last_seq = &priv->last_seq_num;
7977 last_frag = &priv->last_frag_num;
7978 last_time = &priv->last_packet_time;
7983 if ((*last_seq == seq) &&
7984 time_after(*last_time + IPW_PACKET_RETRY_TIME, jiffies)) {
7985 if (*last_frag == frag)
7987 if (*last_frag + 1 != frag)
7988 /* out-of-order fragment */
7994 *last_time = jiffies;
7998 /* Comment this line now since we observed the card receives
7999 * duplicate packets but the FCTL_RETRY bit is not set in the
8000 * IBSS mode with fragmentation enabled.
8001 BUG_ON(!(le16_to_cpu(header->frame_ctl) & IEEE80211_FCTL_RETRY)); */
8005 static void ipw_handle_mgmt_packet(struct ipw_priv *priv,
8006 struct ipw_rx_mem_buffer *rxb,
8007 struct ieee80211_rx_stats *stats)
8009 struct sk_buff *skb = rxb->skb;
8010 struct ipw_rx_packet *pkt = (struct ipw_rx_packet *)skb->data;
8011 struct ieee80211_hdr_4addr *header = (struct ieee80211_hdr_4addr *)
8012 (skb->data + IPW_RX_FRAME_SIZE);
8014 ieee80211_rx_mgt(priv->ieee, header, stats);
8016 if (priv->ieee->iw_mode == IW_MODE_ADHOC &&
8017 ((WLAN_FC_GET_STYPE(le16_to_cpu(header->frame_ctl)) ==
8018 IEEE80211_STYPE_PROBE_RESP) ||
8019 (WLAN_FC_GET_STYPE(le16_to_cpu(header->frame_ctl)) ==
8020 IEEE80211_STYPE_BEACON))) {
8021 if (!memcmp(header->addr3, priv->bssid, ETH_ALEN))
8022 ipw_add_station(priv, header->addr2);
8025 if (priv->config & CFG_NET_STATS) {
8026 IPW_DEBUG_HC("sending stat packet\n");
8028 /* Set the size of the skb to the size of the full
8029 * ipw header and 802.11 frame */
8030 skb_put(skb, le16_to_cpu(pkt->u.frame.length) +
8033 /* Advance past the ipw packet header to the 802.11 frame */
8034 skb_pull(skb, IPW_RX_FRAME_SIZE);
8036 /* Push the ieee80211_rx_stats before the 802.11 frame */
8037 memcpy(skb_push(skb, sizeof(*stats)), stats, sizeof(*stats));
8039 skb->dev = priv->ieee->dev;
8041 /* Point raw at the ieee80211_stats */
8042 skb->mac.raw = skb->data;
8044 skb->pkt_type = PACKET_OTHERHOST;
8045 skb->protocol = __constant_htons(ETH_P_80211_STATS);
8046 memset(skb->cb, 0, sizeof(rxb->skb->cb));
8053 * Main entry function for recieving a packet with 80211 headers. This
8054 * should be called when ever the FW has notified us that there is a new
8055 * skb in the recieve queue.
8057 static void ipw_rx(struct ipw_priv *priv)
8059 struct ipw_rx_mem_buffer *rxb;
8060 struct ipw_rx_packet *pkt;
8061 struct ieee80211_hdr_4addr *header;
8065 r = ipw_read32(priv, IPW_RX_READ_INDEX);
8066 w = ipw_read32(priv, IPW_RX_WRITE_INDEX);
8067 i = (priv->rxq->processed + 1) % RX_QUEUE_SIZE;
8070 rxb = priv->rxq->queue[i];
8071 #ifdef CONFIG_IPW_DEBUG
8072 if (unlikely(rxb == NULL)) {
8073 printk(KERN_CRIT "Queue not allocated!\n");
8077 priv->rxq->queue[i] = NULL;
8079 pci_dma_sync_single_for_cpu(priv->pci_dev, rxb->dma_addr,
8081 PCI_DMA_FROMDEVICE);
8083 pkt = (struct ipw_rx_packet *)rxb->skb->data;
8084 IPW_DEBUG_RX("Packet: type=%02X seq=%02X bits=%02X\n",
8085 pkt->header.message_type,
8086 pkt->header.rx_seq_num, pkt->header.control_bits);
8088 switch (pkt->header.message_type) {
8089 case RX_FRAME_TYPE: /* 802.11 frame */ {
8090 struct ieee80211_rx_stats stats = {
8092 le16_to_cpu(pkt->u.frame.rssi_dbm) -
8095 le16_to_cpu(pkt->u.frame.signal),
8097 le16_to_cpu(pkt->u.frame.noise),
8098 .rate = pkt->u.frame.rate,
8099 .mac_time = jiffies,
8101 pkt->u.frame.received_channel,
8104 control & (1 << 0)) ?
8105 IEEE80211_24GHZ_BAND :
8106 IEEE80211_52GHZ_BAND,
8107 .len = le16_to_cpu(pkt->u.frame.length),
8110 if (stats.rssi != 0)
8111 stats.mask |= IEEE80211_STATMASK_RSSI;
8112 if (stats.signal != 0)
8113 stats.mask |= IEEE80211_STATMASK_SIGNAL;
8114 if (stats.noise != 0)
8115 stats.mask |= IEEE80211_STATMASK_NOISE;
8116 if (stats.rate != 0)
8117 stats.mask |= IEEE80211_STATMASK_RATE;
8121 #ifdef CONFIG_IPW2200_MONITOR
8122 if (priv->ieee->iw_mode == IW_MODE_MONITOR) {
8123 ipw_handle_data_packet(priv, rxb,
8130 (struct ieee80211_hdr_4addr *)(rxb->skb->
8133 /* TODO: Check Ad-Hoc dest/source and make sure
8134 * that we are actually parsing these packets
8135 * correctly -- we should probably use the
8136 * frame control of the packet and disregard
8137 * the current iw_mode */
8140 is_network_packet(priv, header);
8141 if (network_packet && priv->assoc_network) {
8142 priv->assoc_network->stats.rssi =
8144 average_add(&priv->average_rssi,
8146 priv->last_rx_rssi = stats.rssi;
8149 IPW_DEBUG_RX("Frame: len=%u\n",
8150 le16_to_cpu(pkt->u.frame.length));
8152 if (le16_to_cpu(pkt->u.frame.length) <
8153 frame_hdr_len(header)) {
8155 ("Received packet is too small. "
8157 priv->ieee->stats.rx_errors++;
8158 priv->wstats.discard.misc++;
8162 switch (WLAN_FC_GET_TYPE
8163 (le16_to_cpu(header->frame_ctl))) {
8165 case IEEE80211_FTYPE_MGMT:
8166 ipw_handle_mgmt_packet(priv, rxb,
8170 case IEEE80211_FTYPE_CTL:
8173 case IEEE80211_FTYPE_DATA:
8174 if (unlikely(!network_packet ||
8175 is_duplicate_packet(priv,
8178 IPW_DEBUG_DROP("Dropping: "
8191 ipw_handle_data_packet(priv, rxb,
8199 case RX_HOST_NOTIFICATION_TYPE:{
8201 ("Notification: subtype=%02X flags=%02X size=%d\n",
8202 pkt->u.notification.subtype,
8203 pkt->u.notification.flags,
8204 pkt->u.notification.size);
8205 ipw_rx_notification(priv, &pkt->u.notification);
8210 IPW_DEBUG_RX("Bad Rx packet of type %d\n",
8211 pkt->header.message_type);
8215 /* For now we just don't re-use anything. We can tweak this
8216 * later to try and re-use notification packets and SKBs that
8217 * fail to Rx correctly */
8218 if (rxb->skb != NULL) {
8219 dev_kfree_skb_any(rxb->skb);
8223 pci_unmap_single(priv->pci_dev, rxb->dma_addr,
8224 IPW_RX_BUF_SIZE, PCI_DMA_FROMDEVICE);
8225 list_add_tail(&rxb->list, &priv->rxq->rx_used);
8227 i = (i + 1) % RX_QUEUE_SIZE;
8230 /* Backtrack one entry */
8231 priv->rxq->processed = (i ? i : RX_QUEUE_SIZE) - 1;
8233 ipw_rx_queue_restock(priv);
8236 #define DEFAULT_RTS_THRESHOLD 2304U
8237 #define MIN_RTS_THRESHOLD 1U
8238 #define MAX_RTS_THRESHOLD 2304U
8239 #define DEFAULT_BEACON_INTERVAL 100U
8240 #define DEFAULT_SHORT_RETRY_LIMIT 7U
8241 #define DEFAULT_LONG_RETRY_LIMIT 4U
8243 static int ipw_sw_reset(struct ipw_priv *priv, int init)
8245 int band, modulation;
8246 int old_mode = priv->ieee->iw_mode;
8248 /* Initialize module parameter values here */
8251 /* We default to disabling the LED code as right now it causes
8252 * too many systems to lock up... */
8254 priv->config |= CFG_NO_LED;
8257 priv->config |= CFG_ASSOCIATE;
8259 IPW_DEBUG_INFO("Auto associate disabled.\n");
8262 priv->config |= CFG_ADHOC_CREATE;
8264 IPW_DEBUG_INFO("Auto adhoc creation disabled.\n");
8267 priv->status |= STATUS_RF_KILL_SW;
8268 IPW_DEBUG_INFO("Radio disabled.\n");
8272 priv->config |= CFG_STATIC_CHANNEL;
8273 priv->channel = channel;
8274 IPW_DEBUG_INFO("Bind to static channel %d\n", channel);
8275 /* TODO: Validate that provided channel is in range */
8277 #ifdef CONFIG_IPW_QOS
8278 ipw_qos_init(priv, qos_enable, qos_burst_enable,
8279 burst_duration_CCK, burst_duration_OFDM);
8280 #endif /* CONFIG_IPW_QOS */
8284 priv->ieee->iw_mode = IW_MODE_ADHOC;
8285 priv->net_dev->type = ARPHRD_ETHER;
8288 #ifdef CONFIG_IPW2200_MONITOR
8290 priv->ieee->iw_mode = IW_MODE_MONITOR;
8291 priv->net_dev->type = ARPHRD_IEEE80211;
8296 priv->net_dev->type = ARPHRD_ETHER;
8297 priv->ieee->iw_mode = IW_MODE_INFRA;
8302 priv->ieee->host_encrypt = 0;
8303 priv->ieee->host_encrypt_msdu = 0;
8304 priv->ieee->host_decrypt = 0;
8306 IPW_DEBUG_INFO("Hardware crypto [%s]\n", hwcrypto ? "on" : "off");
8308 /* IPW2200/2915 is abled to do hardware fragmentation. */
8309 priv->ieee->host_open_frag = 0;
8311 if ((priv->pci_dev->device == 0x4223) ||
8312 (priv->pci_dev->device == 0x4224)) {
8314 printk(KERN_INFO DRV_NAME
8315 ": Detected Intel PRO/Wireless 2915ABG Network "
8317 priv->ieee->abg_true = 1;
8318 band = IEEE80211_52GHZ_BAND | IEEE80211_24GHZ_BAND;
8319 modulation = IEEE80211_OFDM_MODULATION |
8320 IEEE80211_CCK_MODULATION;
8321 priv->adapter = IPW_2915ABG;
8322 priv->ieee->mode = IEEE_A | IEEE_G | IEEE_B;
8325 printk(KERN_INFO DRV_NAME
8326 ": Detected Intel PRO/Wireless 2200BG Network "
8329 priv->ieee->abg_true = 0;
8330 band = IEEE80211_24GHZ_BAND;
8331 modulation = IEEE80211_OFDM_MODULATION |
8332 IEEE80211_CCK_MODULATION;
8333 priv->adapter = IPW_2200BG;
8334 priv->ieee->mode = IEEE_G | IEEE_B;
8337 priv->ieee->freq_band = band;
8338 priv->ieee->modulation = modulation;
8340 priv->rates_mask = IEEE80211_DEFAULT_RATES_MASK;
8342 priv->disassociate_threshold = IPW_MB_DISASSOCIATE_THRESHOLD_DEFAULT;
8343 priv->roaming_threshold = IPW_MB_ROAMING_THRESHOLD_DEFAULT;
8345 priv->rts_threshold = DEFAULT_RTS_THRESHOLD;
8346 priv->short_retry_limit = DEFAULT_SHORT_RETRY_LIMIT;
8347 priv->long_retry_limit = DEFAULT_LONG_RETRY_LIMIT;
8349 /* If power management is turned on, default to AC mode */
8350 priv->power_mode = IPW_POWER_AC;
8351 priv->tx_power = IPW_TX_POWER_DEFAULT;
8353 return old_mode == priv->ieee->iw_mode;
8357 * This file defines the Wireless Extension handlers. It does not
8358 * define any methods of hardware manipulation and relies on the
8359 * functions defined in ipw_main to provide the HW interaction.
8361 * The exception to this is the use of the ipw_get_ordinal()
8362 * function used to poll the hardware vs. making unecessary calls.
8366 static int ipw_wx_get_name(struct net_device *dev,
8367 struct iw_request_info *info,
8368 union iwreq_data *wrqu, char *extra)
8370 struct ipw_priv *priv = ieee80211_priv(dev);
8372 if (priv->status & STATUS_RF_KILL_MASK)
8373 strcpy(wrqu->name, "radio off");
8374 else if (!(priv->status & STATUS_ASSOCIATED))
8375 strcpy(wrqu->name, "unassociated");
8377 snprintf(wrqu->name, IFNAMSIZ, "IEEE 802.11%c",
8378 ipw_modes[priv->assoc_request.ieee_mode]);
8379 IPW_DEBUG_WX("Name: %s\n", wrqu->name);
8384 static int ipw_set_channel(struct ipw_priv *priv, u8 channel)
8387 IPW_DEBUG_INFO("Setting channel to ANY (0)\n");
8388 priv->config &= ~CFG_STATIC_CHANNEL;
8389 IPW_DEBUG_ASSOC("Attempting to associate with new "
8391 ipw_associate(priv);
8395 priv->config |= CFG_STATIC_CHANNEL;
8397 if (priv->channel == channel) {
8398 IPW_DEBUG_INFO("Request to set channel to current value (%d)\n",
8403 IPW_DEBUG_INFO("Setting channel to %i\n", (int)channel);
8404 priv->channel = channel;
8406 #ifdef CONFIG_IPW2200_MONITOR
8407 if (priv->ieee->iw_mode == IW_MODE_MONITOR) {
8409 if (priv->status & STATUS_SCANNING) {
8410 IPW_DEBUG_SCAN("Scan abort triggered due to "
8411 "channel change.\n");
8412 ipw_abort_scan(priv);
8415 for (i = 1000; i && (priv->status & STATUS_SCANNING); i--)
8418 if (priv->status & STATUS_SCANNING)
8419 IPW_DEBUG_SCAN("Still scanning...\n");
8421 IPW_DEBUG_SCAN("Took %dms to abort current scan\n",
8426 #endif /* CONFIG_IPW2200_MONITOR */
8428 /* Network configuration changed -- force [re]association */
8429 IPW_DEBUG_ASSOC("[re]association triggered due to channel change.\n");
8430 if (!ipw_disassociate(priv))
8431 ipw_associate(priv);
8436 static int ipw_wx_set_freq(struct net_device *dev,
8437 struct iw_request_info *info,
8438 union iwreq_data *wrqu, char *extra)
8440 struct ipw_priv *priv = ieee80211_priv(dev);
8441 const struct ieee80211_geo *geo = ipw_get_geo(priv->ieee);
8442 struct iw_freq *fwrq = &wrqu->freq;
8448 IPW_DEBUG_WX("SET Freq/Channel -> any\n");
8450 ret = ipw_set_channel(priv, 0);
8454 /* if setting by freq convert to channel */
8456 channel = ipw_freq_to_channel(priv->ieee, fwrq->m);
8462 if (!(band = ipw_is_valid_channel(priv->ieee, channel)))
8465 if (priv->ieee->iw_mode == IW_MODE_ADHOC) {
8466 i = ipw_channel_to_index(priv->ieee, channel);
8470 flags = (band == IEEE80211_24GHZ_BAND) ?
8471 geo->bg[i].flags : geo->a[i].flags;
8472 if (flags & IEEE80211_CH_PASSIVE_ONLY) {
8473 IPW_DEBUG_WX("Invalid Ad-Hoc channel for 802.11a\n");
8478 IPW_DEBUG_WX("SET Freq/Channel -> %d \n", fwrq->m);
8480 ret = ipw_set_channel(priv, channel);
8485 static int ipw_wx_get_freq(struct net_device *dev,
8486 struct iw_request_info *info,
8487 union iwreq_data *wrqu, char *extra)
8489 struct ipw_priv *priv = ieee80211_priv(dev);
8493 /* If we are associated, trying to associate, or have a statically
8494 * configured CHANNEL then return that; otherwise return ANY */
8496 if (priv->config & CFG_STATIC_CHANNEL ||
8497 priv->status & (STATUS_ASSOCIATING | STATUS_ASSOCIATED))
8498 wrqu->freq.m = priv->channel;
8503 IPW_DEBUG_WX("GET Freq/Channel -> %d \n", priv->channel);
8507 static int ipw_wx_set_mode(struct net_device *dev,
8508 struct iw_request_info *info,
8509 union iwreq_data *wrqu, char *extra)
8511 struct ipw_priv *priv = ieee80211_priv(dev);
8514 IPW_DEBUG_WX("Set MODE: %d\n", wrqu->mode);
8516 switch (wrqu->mode) {
8517 #ifdef CONFIG_IPW2200_MONITOR
8518 case IW_MODE_MONITOR:
8524 wrqu->mode = IW_MODE_INFRA;
8529 if (wrqu->mode == priv->ieee->iw_mode)
8534 ipw_sw_reset(priv, 0);
8536 #ifdef CONFIG_IPW2200_MONITOR
8537 if (priv->ieee->iw_mode == IW_MODE_MONITOR)
8538 priv->net_dev->type = ARPHRD_ETHER;
8540 if (wrqu->mode == IW_MODE_MONITOR)
8541 priv->net_dev->type = ARPHRD_IEEE80211;
8542 #endif /* CONFIG_IPW2200_MONITOR */
8544 /* Free the existing firmware and reset the fw_loaded
8545 * flag so ipw_load() will bring in the new firmawre */
8548 priv->ieee->iw_mode = wrqu->mode;
8550 queue_work(priv->workqueue, &priv->adapter_restart);
8555 static int ipw_wx_get_mode(struct net_device *dev,
8556 struct iw_request_info *info,
8557 union iwreq_data *wrqu, char *extra)
8559 struct ipw_priv *priv = ieee80211_priv(dev);
8561 wrqu->mode = priv->ieee->iw_mode;
8562 IPW_DEBUG_WX("Get MODE -> %d\n", wrqu->mode);
8567 /* Values are in microsecond */
8568 static const s32 timeout_duration[] = {
8576 static const s32 period_duration[] = {
8584 static int ipw_wx_get_range(struct net_device *dev,
8585 struct iw_request_info *info,
8586 union iwreq_data *wrqu, char *extra)
8588 struct ipw_priv *priv = ieee80211_priv(dev);
8589 struct iw_range *range = (struct iw_range *)extra;
8590 const struct ieee80211_geo *geo = ipw_get_geo(priv->ieee);
8593 wrqu->data.length = sizeof(*range);
8594 memset(range, 0, sizeof(*range));
8596 /* 54Mbs == ~27 Mb/s real (802.11g) */
8597 range->throughput = 27 * 1000 * 1000;
8599 range->max_qual.qual = 100;
8600 /* TODO: Find real max RSSI and stick here */
8601 range->max_qual.level = 0;
8602 range->max_qual.noise = priv->ieee->worst_rssi + 0x100;
8603 range->max_qual.updated = 7; /* Updated all three */
8605 range->avg_qual.qual = 70;
8606 /* TODO: Find real 'good' to 'bad' threshol value for RSSI */
8607 range->avg_qual.level = 0; /* FIXME to real average level */
8608 range->avg_qual.noise = 0;
8609 range->avg_qual.updated = 7; /* Updated all three */
8611 range->num_bitrates = min(priv->rates.num_rates, (u8) IW_MAX_BITRATES);
8613 for (i = 0; i < range->num_bitrates; i++)
8614 range->bitrate[i] = (priv->rates.supported_rates[i] & 0x7F) *
8617 range->max_rts = DEFAULT_RTS_THRESHOLD;
8618 range->min_frag = MIN_FRAG_THRESHOLD;
8619 range->max_frag = MAX_FRAG_THRESHOLD;
8621 range->encoding_size[0] = 5;
8622 range->encoding_size[1] = 13;
8623 range->num_encoding_sizes = 2;
8624 range->max_encoding_tokens = WEP_KEYS;
8626 /* Set the Wireless Extension versions */
8627 range->we_version_compiled = WIRELESS_EXT;
8628 range->we_version_source = 16;
8631 if (priv->ieee->mode & (IEEE_B | IEEE_G)) {
8632 for (j = 0; j < geo->bg_channels && i < IW_MAX_FREQUENCIES;
8634 range->freq[i].i = geo->bg[j].channel;
8635 range->freq[i].m = geo->bg[j].freq * 100000;
8636 range->freq[i].e = 1;
8640 if (priv->ieee->mode & IEEE_A) {
8641 for (j = 0; j < geo->a_channels && i < IW_MAX_FREQUENCIES;
8643 range->freq[i].i = geo->a[j].channel;
8644 range->freq[i].m = geo->a[j].freq * 100000;
8645 range->freq[i].e = 1;
8649 range->num_channels = i;
8650 range->num_frequency = i;
8653 IPW_DEBUG_WX("GET Range\n");
8657 static int ipw_wx_set_wap(struct net_device *dev,
8658 struct iw_request_info *info,
8659 union iwreq_data *wrqu, char *extra)
8661 struct ipw_priv *priv = ieee80211_priv(dev);
8663 static const unsigned char any[] = {
8664 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
8666 static const unsigned char off[] = {
8667 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
8670 if (wrqu->ap_addr.sa_family != ARPHRD_ETHER)
8673 if (!memcmp(any, wrqu->ap_addr.sa_data, ETH_ALEN) ||
8674 !memcmp(off, wrqu->ap_addr.sa_data, ETH_ALEN)) {
8675 /* we disable mandatory BSSID association */
8676 IPW_DEBUG_WX("Setting AP BSSID to ANY\n");
8677 priv->config &= ~CFG_STATIC_BSSID;
8678 IPW_DEBUG_ASSOC("Attempting to associate with new "
8680 ipw_associate(priv);
8685 priv->config |= CFG_STATIC_BSSID;
8686 if (!memcmp(priv->bssid, wrqu->ap_addr.sa_data, ETH_ALEN)) {
8687 IPW_DEBUG_WX("BSSID set to current BSSID.\n");
8692 IPW_DEBUG_WX("Setting mandatory BSSID to " MAC_FMT "\n",
8693 MAC_ARG(wrqu->ap_addr.sa_data));
8695 memcpy(priv->bssid, wrqu->ap_addr.sa_data, ETH_ALEN);
8697 /* Network configuration changed -- force [re]association */
8698 IPW_DEBUG_ASSOC("[re]association triggered due to BSSID change.\n");
8699 if (!ipw_disassociate(priv))
8700 ipw_associate(priv);
8706 static int ipw_wx_get_wap(struct net_device *dev,
8707 struct iw_request_info *info,
8708 union iwreq_data *wrqu, char *extra)
8710 struct ipw_priv *priv = ieee80211_priv(dev);
8711 /* If we are associated, trying to associate, or have a statically
8712 * configured BSSID then return that; otherwise return ANY */
8714 if (priv->config & CFG_STATIC_BSSID ||
8715 priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING)) {
8716 wrqu->ap_addr.sa_family = ARPHRD_ETHER;
8717 memcpy(wrqu->ap_addr.sa_data, priv->bssid, ETH_ALEN);
8719 memset(wrqu->ap_addr.sa_data, 0, ETH_ALEN);
8721 IPW_DEBUG_WX("Getting WAP BSSID: " MAC_FMT "\n",
8722 MAC_ARG(wrqu->ap_addr.sa_data));
8727 static int ipw_wx_set_essid(struct net_device *dev,
8728 struct iw_request_info *info,
8729 union iwreq_data *wrqu, char *extra)
8731 struct ipw_priv *priv = ieee80211_priv(dev);
8732 char *essid = ""; /* ANY */
8735 if (wrqu->essid.flags && wrqu->essid.length) {
8736 length = wrqu->essid.length - 1;
8740 IPW_DEBUG_WX("Setting ESSID to ANY\n");
8741 if ((priv->config & CFG_STATIC_ESSID) &&
8742 !(priv->status & (STATUS_ASSOCIATED |
8743 STATUS_ASSOCIATING))) {
8744 IPW_DEBUG_ASSOC("Attempting to associate with new "
8746 priv->config &= ~CFG_STATIC_ESSID;
8747 ipw_associate(priv);
8753 length = min(length, IW_ESSID_MAX_SIZE);
8755 priv->config |= CFG_STATIC_ESSID;
8757 if (priv->essid_len == length && !memcmp(priv->essid, extra, length)) {
8758 IPW_DEBUG_WX("ESSID set to current ESSID.\n");
8763 IPW_DEBUG_WX("Setting ESSID: '%s' (%d)\n", escape_essid(essid, length),
8766 priv->essid_len = length;
8767 memcpy(priv->essid, essid, priv->essid_len);
8769 /* Network configuration changed -- force [re]association */
8770 IPW_DEBUG_ASSOC("[re]association triggered due to ESSID change.\n");
8771 if (!ipw_disassociate(priv))
8772 ipw_associate(priv);
8778 static int ipw_wx_get_essid(struct net_device *dev,
8779 struct iw_request_info *info,
8780 union iwreq_data *wrqu, char *extra)
8782 struct ipw_priv *priv = ieee80211_priv(dev);
8784 /* If we are associated, trying to associate, or have a statically
8785 * configured ESSID then return that; otherwise return ANY */
8787 if (priv->config & CFG_STATIC_ESSID ||
8788 priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING)) {
8789 IPW_DEBUG_WX("Getting essid: '%s'\n",
8790 escape_essid(priv->essid, priv->essid_len));
8791 memcpy(extra, priv->essid, priv->essid_len);
8792 wrqu->essid.length = priv->essid_len;
8793 wrqu->essid.flags = 1; /* active */
8795 IPW_DEBUG_WX("Getting essid: ANY\n");
8796 wrqu->essid.length = 0;
8797 wrqu->essid.flags = 0; /* active */
8803 static int ipw_wx_set_nick(struct net_device *dev,
8804 struct iw_request_info *info,
8805 union iwreq_data *wrqu, char *extra)
8807 struct ipw_priv *priv = ieee80211_priv(dev);
8809 IPW_DEBUG_WX("Setting nick to '%s'\n", extra);
8810 if (wrqu->data.length > IW_ESSID_MAX_SIZE)
8813 wrqu->data.length = min((size_t) wrqu->data.length, sizeof(priv->nick));
8814 memset(priv->nick, 0, sizeof(priv->nick));
8815 memcpy(priv->nick, extra, wrqu->data.length);
8816 IPW_DEBUG_TRACE("<<\n");
8822 static int ipw_wx_get_nick(struct net_device *dev,
8823 struct iw_request_info *info,
8824 union iwreq_data *wrqu, char *extra)
8826 struct ipw_priv *priv = ieee80211_priv(dev);
8827 IPW_DEBUG_WX("Getting nick\n");
8829 wrqu->data.length = strlen(priv->nick) + 1;
8830 memcpy(extra, priv->nick, wrqu->data.length);
8831 wrqu->data.flags = 1; /* active */
8836 static int ipw_wx_set_rate(struct net_device *dev,
8837 struct iw_request_info *info,
8838 union iwreq_data *wrqu, char *extra)
8840 /* TODO: We should use semaphores or locks for access to priv */
8841 struct ipw_priv *priv = ieee80211_priv(dev);
8842 u32 target_rate = wrqu->bitrate.value;
8845 /* value = -1, fixed = 0 means auto only, so we should use all rates offered by AP */
8846 /* value = X, fixed = 1 means only rate X */
8847 /* value = X, fixed = 0 means all rates lower equal X */
8849 if (target_rate == -1) {
8851 mask = IEEE80211_DEFAULT_RATES_MASK;
8852 /* Now we should reassociate */
8857 fixed = wrqu->bitrate.fixed;
8859 if (target_rate == 1000000 || !fixed)
8860 mask |= IEEE80211_CCK_RATE_1MB_MASK;
8861 if (target_rate == 1000000)
8864 if (target_rate == 2000000 || !fixed)
8865 mask |= IEEE80211_CCK_RATE_2MB_MASK;
8866 if (target_rate == 2000000)
8869 if (target_rate == 5500000 || !fixed)
8870 mask |= IEEE80211_CCK_RATE_5MB_MASK;
8871 if (target_rate == 5500000)
8874 if (target_rate == 6000000 || !fixed)
8875 mask |= IEEE80211_OFDM_RATE_6MB_MASK;
8876 if (target_rate == 6000000)
8879 if (target_rate == 9000000 || !fixed)
8880 mask |= IEEE80211_OFDM_RATE_9MB_MASK;
8881 if (target_rate == 9000000)
8884 if (target_rate == 11000000 || !fixed)
8885 mask |= IEEE80211_CCK_RATE_11MB_MASK;
8886 if (target_rate == 11000000)
8889 if (target_rate == 12000000 || !fixed)
8890 mask |= IEEE80211_OFDM_RATE_12MB_MASK;
8891 if (target_rate == 12000000)
8894 if (target_rate == 18000000 || !fixed)
8895 mask |= IEEE80211_OFDM_RATE_18MB_MASK;
8896 if (target_rate == 18000000)
8899 if (target_rate == 24000000 || !fixed)
8900 mask |= IEEE80211_OFDM_RATE_24MB_MASK;
8901 if (target_rate == 24000000)
8904 if (target_rate == 36000000 || !fixed)
8905 mask |= IEEE80211_OFDM_RATE_36MB_MASK;
8906 if (target_rate == 36000000)
8909 if (target_rate == 48000000 || !fixed)
8910 mask |= IEEE80211_OFDM_RATE_48MB_MASK;
8911 if (target_rate == 48000000)
8914 if (target_rate == 54000000 || !fixed)
8915 mask |= IEEE80211_OFDM_RATE_54MB_MASK;
8916 if (target_rate == 54000000)
8919 IPW_DEBUG_WX("invalid rate specified, returning error\n");
8923 IPW_DEBUG_WX("Setting rate mask to 0x%08X [%s]\n",
8924 mask, fixed ? "fixed" : "sub-rates");
8926 if (mask == IEEE80211_DEFAULT_RATES_MASK) {
8927 priv->config &= ~CFG_FIXED_RATE;
8928 ipw_set_fixed_rate(priv, priv->ieee->mode);
8930 priv->config |= CFG_FIXED_RATE;
8932 if (priv->rates_mask == mask) {
8933 IPW_DEBUG_WX("Mask set to current mask.\n");
8938 priv->rates_mask = mask;
8940 /* Network configuration changed -- force [re]association */
8941 IPW_DEBUG_ASSOC("[re]association triggered due to rates change.\n");
8942 if (!ipw_disassociate(priv))
8943 ipw_associate(priv);
8949 static int ipw_wx_get_rate(struct net_device *dev,
8950 struct iw_request_info *info,
8951 union iwreq_data *wrqu, char *extra)
8953 struct ipw_priv *priv = ieee80211_priv(dev);
8955 wrqu->bitrate.value = priv->last_rate;
8957 IPW_DEBUG_WX("GET Rate -> %d \n", wrqu->bitrate.value);
8961 static int ipw_wx_set_rts(struct net_device *dev,
8962 struct iw_request_info *info,
8963 union iwreq_data *wrqu, char *extra)
8965 struct ipw_priv *priv = ieee80211_priv(dev);
8967 if (wrqu->rts.disabled)
8968 priv->rts_threshold = DEFAULT_RTS_THRESHOLD;
8970 if (wrqu->rts.value < MIN_RTS_THRESHOLD ||
8971 wrqu->rts.value > MAX_RTS_THRESHOLD) {
8975 priv->rts_threshold = wrqu->rts.value;
8978 ipw_send_rts_threshold(priv, priv->rts_threshold);
8980 IPW_DEBUG_WX("SET RTS Threshold -> %d \n", priv->rts_threshold);
8984 static int ipw_wx_get_rts(struct net_device *dev,
8985 struct iw_request_info *info,
8986 union iwreq_data *wrqu, char *extra)
8988 struct ipw_priv *priv = ieee80211_priv(dev);
8990 wrqu->rts.value = priv->rts_threshold;
8991 wrqu->rts.fixed = 0; /* no auto select */
8992 wrqu->rts.disabled = (wrqu->rts.value == DEFAULT_RTS_THRESHOLD);
8994 IPW_DEBUG_WX("GET RTS Threshold -> %d \n", wrqu->rts.value);
8998 static int ipw_wx_set_txpow(struct net_device *dev,
8999 struct iw_request_info *info,
9000 union iwreq_data *wrqu, char *extra)
9002 struct ipw_priv *priv = ieee80211_priv(dev);
9006 if (ipw_radio_kill_sw(priv, wrqu->power.disabled)) {
9011 if (!wrqu->power.fixed)
9012 wrqu->power.value = IPW_TX_POWER_DEFAULT;
9014 if (wrqu->power.flags != IW_TXPOW_DBM) {
9019 if ((wrqu->power.value > IPW_TX_POWER_MAX) ||
9020 (wrqu->power.value < IPW_TX_POWER_MIN)) {
9025 priv->tx_power = wrqu->power.value;
9026 err = ipw_set_tx_power(priv);
9032 static int ipw_wx_get_txpow(struct net_device *dev,
9033 struct iw_request_info *info,
9034 union iwreq_data *wrqu, char *extra)
9036 struct ipw_priv *priv = ieee80211_priv(dev);
9038 wrqu->power.value = priv->tx_power;
9039 wrqu->power.fixed = 1;
9040 wrqu->power.flags = IW_TXPOW_DBM;
9041 wrqu->power.disabled = (priv->status & STATUS_RF_KILL_MASK) ? 1 : 0;
9044 IPW_DEBUG_WX("GET TX Power -> %s %d \n",
9045 wrqu->power.disabled ? "OFF" : "ON", wrqu->power.value);
9050 static int ipw_wx_set_frag(struct net_device *dev,
9051 struct iw_request_info *info,
9052 union iwreq_data *wrqu, char *extra)
9054 struct ipw_priv *priv = ieee80211_priv(dev);
9056 if (wrqu->frag.disabled)
9057 priv->ieee->fts = DEFAULT_FTS;
9059 if (wrqu->frag.value < MIN_FRAG_THRESHOLD ||
9060 wrqu->frag.value > MAX_FRAG_THRESHOLD) {
9065 priv->ieee->fts = wrqu->frag.value & ~0x1;
9068 ipw_send_frag_threshold(priv, wrqu->frag.value);
9070 IPW_DEBUG_WX("SET Frag Threshold -> %d \n", wrqu->frag.value);
9074 static int ipw_wx_get_frag(struct net_device *dev,
9075 struct iw_request_info *info,
9076 union iwreq_data *wrqu, char *extra)
9078 struct ipw_priv *priv = ieee80211_priv(dev);
9080 wrqu->frag.value = priv->ieee->fts;
9081 wrqu->frag.fixed = 0; /* no auto select */
9082 wrqu->frag.disabled = (wrqu->frag.value == DEFAULT_FTS);
9084 IPW_DEBUG_WX("GET Frag Threshold -> %d \n", wrqu->frag.value);
9089 static int ipw_wx_set_retry(struct net_device *dev,
9090 struct iw_request_info *info,
9091 union iwreq_data *wrqu, char *extra)
9093 struct ipw_priv *priv = ieee80211_priv(dev);
9095 if (wrqu->retry.flags & IW_RETRY_LIFETIME || wrqu->retry.disabled)
9098 if (!(wrqu->retry.flags & IW_RETRY_LIMIT))
9101 if (wrqu->retry.value < 0 || wrqu->retry.value > 255)
9105 if (wrqu->retry.flags & IW_RETRY_MIN)
9106 priv->short_retry_limit = (u8) wrqu->retry.value;
9107 else if (wrqu->retry.flags & IW_RETRY_MAX)
9108 priv->long_retry_limit = (u8) wrqu->retry.value;
9110 priv->short_retry_limit = (u8) wrqu->retry.value;
9111 priv->long_retry_limit = (u8) wrqu->retry.value;
9114 ipw_send_retry_limit(priv, priv->short_retry_limit,
9115 priv->long_retry_limit);
9117 IPW_DEBUG_WX("SET retry limit -> short:%d long:%d\n",
9118 priv->short_retry_limit, priv->long_retry_limit);
9122 static int ipw_wx_get_retry(struct net_device *dev,
9123 struct iw_request_info *info,
9124 union iwreq_data *wrqu, char *extra)
9126 struct ipw_priv *priv = ieee80211_priv(dev);
9129 wrqu->retry.disabled = 0;
9131 if ((wrqu->retry.flags & IW_RETRY_TYPE) == IW_RETRY_LIFETIME) {
9136 if (wrqu->retry.flags & IW_RETRY_MAX) {
9137 wrqu->retry.flags = IW_RETRY_LIMIT | IW_RETRY_MAX;
9138 wrqu->retry.value = priv->long_retry_limit;
9139 } else if (wrqu->retry.flags & IW_RETRY_MIN) {
9140 wrqu->retry.flags = IW_RETRY_LIMIT | IW_RETRY_MIN;
9141 wrqu->retry.value = priv->short_retry_limit;
9143 wrqu->retry.flags = IW_RETRY_LIMIT;
9144 wrqu->retry.value = priv->short_retry_limit;
9148 IPW_DEBUG_WX("GET retry -> %d \n", wrqu->retry.value);
9153 #if WIRELESS_EXT > 17
9154 static int ipw_request_direct_scan(struct ipw_priv *priv, char *essid,
9157 struct ipw_scan_request_ext scan;
9158 int err = 0, scan_type;
9162 if (priv->status & STATUS_RF_KILL_MASK) {
9163 IPW_DEBUG_HC("Aborting scan due to RF kill activation\n");
9164 priv->status |= STATUS_SCAN_PENDING;
9168 IPW_DEBUG_HC("starting request direct scan!\n");
9170 if (priv->status & (STATUS_SCANNING | STATUS_SCAN_ABORTING)) {
9171 err = wait_event_interruptible(priv->wait_state,
9173 status & (STATUS_SCANNING |
9174 STATUS_SCAN_ABORTING)));
9176 IPW_DEBUG_HC("aborting direct scan");
9180 memset(&scan, 0, sizeof(scan));
9182 if (priv->config & CFG_SPEED_SCAN)
9183 scan.dwell_time[IPW_SCAN_ACTIVE_BROADCAST_SCAN] =
9186 scan.dwell_time[IPW_SCAN_ACTIVE_BROADCAST_SCAN] =
9189 scan.dwell_time[IPW_SCAN_ACTIVE_BROADCAST_AND_DIRECT_SCAN] =
9191 scan.dwell_time[IPW_SCAN_PASSIVE_FULL_DWELL_SCAN] = cpu_to_le16(120);
9192 scan.dwell_time[IPW_SCAN_ACTIVE_DIRECT_SCAN] = cpu_to_le16(20);
9194 scan.full_scan_index = cpu_to_le32(ieee80211_get_scans(priv->ieee));
9196 err = ipw_send_ssid(priv, essid, essid_len);
9198 IPW_DEBUG_HC("Attempt to send SSID command failed\n");
9201 scan_type = IPW_SCAN_ACTIVE_BROADCAST_AND_DIRECT_SCAN;
9203 ipw_add_scan_channels(priv, &scan, scan_type);
9205 err = ipw_send_scan_request_ext(priv, &scan);
9207 IPW_DEBUG_HC("Sending scan command failed: %08X\n", err);
9211 priv->status |= STATUS_SCANNING;
9217 #endif /* WIRELESS_EXT > 17 */
9219 static int ipw_wx_set_scan(struct net_device *dev,
9220 struct iw_request_info *info,
9221 union iwreq_data *wrqu, char *extra)
9223 struct ipw_priv *priv = ieee80211_priv(dev);
9224 #if WIRELESS_EXT > 17
9225 struct iw_scan_req *req = NULL;
9226 if (wrqu->data.length
9227 && wrqu->data.length == sizeof(struct iw_scan_req)) {
9228 req = (struct iw_scan_req *)extra;
9229 if (wrqu->data.flags & IW_SCAN_THIS_ESSID) {
9230 ipw_request_direct_scan(priv, req->essid,
9236 IPW_DEBUG_WX("Start scan\n");
9238 queue_work(priv->workqueue, &priv->request_scan);
9243 static int ipw_wx_get_scan(struct net_device *dev,
9244 struct iw_request_info *info,
9245 union iwreq_data *wrqu, char *extra)
9247 struct ipw_priv *priv = ieee80211_priv(dev);
9248 return ieee80211_wx_get_scan(priv->ieee, info, wrqu, extra);
9251 static int ipw_wx_set_encode(struct net_device *dev,
9252 struct iw_request_info *info,
9253 union iwreq_data *wrqu, char *key)
9255 struct ipw_priv *priv = ieee80211_priv(dev);
9257 u32 cap = priv->capability;
9260 ret = ieee80211_wx_set_encode(priv->ieee, info, wrqu, key);
9262 /* In IBSS mode, we need to notify the firmware to update
9263 * the beacon info after we changed the capability. */
9264 if (cap != priv->capability &&
9265 priv->ieee->iw_mode == IW_MODE_ADHOC &&
9266 priv->status & STATUS_ASSOCIATED)
9267 ipw_disassociate(priv);
9273 static int ipw_wx_get_encode(struct net_device *dev,
9274 struct iw_request_info *info,
9275 union iwreq_data *wrqu, char *key)
9277 struct ipw_priv *priv = ieee80211_priv(dev);
9278 return ieee80211_wx_get_encode(priv->ieee, info, wrqu, key);
9281 static int ipw_wx_set_power(struct net_device *dev,
9282 struct iw_request_info *info,
9283 union iwreq_data *wrqu, char *extra)
9285 struct ipw_priv *priv = ieee80211_priv(dev);
9288 if (wrqu->power.disabled) {
9289 priv->power_mode = IPW_POWER_LEVEL(priv->power_mode);
9290 err = ipw_send_power_mode(priv, IPW_POWER_MODE_CAM);
9292 IPW_DEBUG_WX("failed setting power mode.\n");
9296 IPW_DEBUG_WX("SET Power Management Mode -> off\n");
9301 switch (wrqu->power.flags & IW_POWER_MODE) {
9302 case IW_POWER_ON: /* If not specified */
9303 case IW_POWER_MODE: /* If set all mask */
9304 case IW_POWER_ALL_R: /* If explicitely state all */
9306 default: /* Otherwise we don't support it */
9307 IPW_DEBUG_WX("SET PM Mode: %X not supported.\n",
9313 /* If the user hasn't specified a power management mode yet, default
9315 if (IPW_POWER_LEVEL(priv->power_mode) == IPW_POWER_AC)
9316 priv->power_mode = IPW_POWER_ENABLED | IPW_POWER_BATTERY;
9318 priv->power_mode = IPW_POWER_ENABLED | priv->power_mode;
9319 err = ipw_send_power_mode(priv, IPW_POWER_LEVEL(priv->power_mode));
9321 IPW_DEBUG_WX("failed setting power mode.\n");
9326 IPW_DEBUG_WX("SET Power Management Mode -> 0x%02X\n", priv->power_mode);
9331 static int ipw_wx_get_power(struct net_device *dev,
9332 struct iw_request_info *info,
9333 union iwreq_data *wrqu, char *extra)
9335 struct ipw_priv *priv = ieee80211_priv(dev);
9337 if (!(priv->power_mode & IPW_POWER_ENABLED))
9338 wrqu->power.disabled = 1;
9340 wrqu->power.disabled = 0;
9343 IPW_DEBUG_WX("GET Power Management Mode -> %02X\n", priv->power_mode);
9348 static int ipw_wx_set_powermode(struct net_device *dev,
9349 struct iw_request_info *info,
9350 union iwreq_data *wrqu, char *extra)
9352 struct ipw_priv *priv = ieee80211_priv(dev);
9353 int mode = *(int *)extra;
9356 if ((mode < 1) || (mode > IPW_POWER_LIMIT)) {
9357 mode = IPW_POWER_AC;
9358 priv->power_mode = mode;
9360 priv->power_mode = IPW_POWER_ENABLED | mode;
9363 if (priv->power_mode != mode) {
9364 err = ipw_send_power_mode(priv, mode);
9367 IPW_DEBUG_WX("failed setting power mode.\n");
9376 #define MAX_WX_STRING 80
9377 static int ipw_wx_get_powermode(struct net_device *dev,
9378 struct iw_request_info *info,
9379 union iwreq_data *wrqu, char *extra)
9381 struct ipw_priv *priv = ieee80211_priv(dev);
9382 int level = IPW_POWER_LEVEL(priv->power_mode);
9385 p += snprintf(p, MAX_WX_STRING, "Power save level: %d ", level);
9389 p += snprintf(p, MAX_WX_STRING - (p - extra), "(AC)");
9391 case IPW_POWER_BATTERY:
9392 p += snprintf(p, MAX_WX_STRING - (p - extra), "(BATTERY)");
9395 p += snprintf(p, MAX_WX_STRING - (p - extra),
9396 "(Timeout %dms, Period %dms)",
9397 timeout_duration[level - 1] / 1000,
9398 period_duration[level - 1] / 1000);
9401 if (!(priv->power_mode & IPW_POWER_ENABLED))
9402 p += snprintf(p, MAX_WX_STRING - (p - extra), " OFF");
9404 wrqu->data.length = p - extra + 1;
9409 static int ipw_wx_set_wireless_mode(struct net_device *dev,
9410 struct iw_request_info *info,
9411 union iwreq_data *wrqu, char *extra)
9413 struct ipw_priv *priv = ieee80211_priv(dev);
9414 int mode = *(int *)extra;
9415 u8 band = 0, modulation = 0;
9417 if (mode == 0 || mode & ~IEEE_MODE_MASK) {
9418 IPW_WARNING("Attempt to set invalid wireless mode: %d\n", mode);
9422 if (priv->adapter == IPW_2915ABG) {
9423 priv->ieee->abg_true = 1;
9424 if (mode & IEEE_A) {
9425 band |= IEEE80211_52GHZ_BAND;
9426 modulation |= IEEE80211_OFDM_MODULATION;
9428 priv->ieee->abg_true = 0;
9430 if (mode & IEEE_A) {
9431 IPW_WARNING("Attempt to set 2200BG into "
9437 priv->ieee->abg_true = 0;
9440 if (mode & IEEE_B) {
9441 band |= IEEE80211_24GHZ_BAND;
9442 modulation |= IEEE80211_CCK_MODULATION;
9444 priv->ieee->abg_true = 0;
9446 if (mode & IEEE_G) {
9447 band |= IEEE80211_24GHZ_BAND;
9448 modulation |= IEEE80211_OFDM_MODULATION;
9450 priv->ieee->abg_true = 0;
9452 priv->ieee->mode = mode;
9453 priv->ieee->freq_band = band;
9454 priv->ieee->modulation = modulation;
9455 init_supported_rates(priv, &priv->rates);
9457 /* Network configuration changed -- force [re]association */
9458 IPW_DEBUG_ASSOC("[re]association triggered due to mode change.\n");
9459 if (!ipw_disassociate(priv)) {
9460 ipw_send_supported_rates(priv, &priv->rates);
9461 ipw_associate(priv);
9464 /* Update the band LEDs */
9465 ipw_led_band_on(priv);
9467 IPW_DEBUG_WX("PRIV SET MODE: %c%c%c\n",
9468 mode & IEEE_A ? 'a' : '.',
9469 mode & IEEE_B ? 'b' : '.', mode & IEEE_G ? 'g' : '.');
9474 static int ipw_wx_get_wireless_mode(struct net_device *dev,
9475 struct iw_request_info *info,
9476 union iwreq_data *wrqu, char *extra)
9478 struct ipw_priv *priv = ieee80211_priv(dev);
9480 switch (priv->ieee->mode) {
9482 strncpy(extra, "802.11a (1)", MAX_WX_STRING);
9485 strncpy(extra, "802.11b (2)", MAX_WX_STRING);
9487 case IEEE_A | IEEE_B:
9488 strncpy(extra, "802.11ab (3)", MAX_WX_STRING);
9491 strncpy(extra, "802.11g (4)", MAX_WX_STRING);
9493 case IEEE_A | IEEE_G:
9494 strncpy(extra, "802.11ag (5)", MAX_WX_STRING);
9496 case IEEE_B | IEEE_G:
9497 strncpy(extra, "802.11bg (6)", MAX_WX_STRING);
9499 case IEEE_A | IEEE_B | IEEE_G:
9500 strncpy(extra, "802.11abg (7)", MAX_WX_STRING);
9503 strncpy(extra, "unknown", MAX_WX_STRING);
9507 IPW_DEBUG_WX("PRIV GET MODE: %s\n", extra);
9509 wrqu->data.length = strlen(extra) + 1;
9515 static int ipw_wx_set_preamble(struct net_device *dev,
9516 struct iw_request_info *info,
9517 union iwreq_data *wrqu, char *extra)
9519 struct ipw_priv *priv = ieee80211_priv(dev);
9520 int mode = *(int *)extra;
9522 /* Switching from SHORT -> LONG requires a disassociation */
9524 if (!(priv->config & CFG_PREAMBLE_LONG)) {
9525 priv->config |= CFG_PREAMBLE_LONG;
9527 /* Network configuration changed -- force [re]association */
9529 ("[re]association triggered due to preamble change.\n");
9530 if (!ipw_disassociate(priv))
9531 ipw_associate(priv);
9537 priv->config &= ~CFG_PREAMBLE_LONG;
9548 static int ipw_wx_get_preamble(struct net_device *dev,
9549 struct iw_request_info *info,
9550 union iwreq_data *wrqu, char *extra)
9552 struct ipw_priv *priv = ieee80211_priv(dev);
9554 if (priv->config & CFG_PREAMBLE_LONG)
9555 snprintf(wrqu->name, IFNAMSIZ, "long (1)");
9557 snprintf(wrqu->name, IFNAMSIZ, "auto (0)");
9562 #ifdef CONFIG_IPW2200_MONITOR
9563 static int ipw_wx_set_monitor(struct net_device *dev,
9564 struct iw_request_info *info,
9565 union iwreq_data *wrqu, char *extra)
9567 struct ipw_priv *priv = ieee80211_priv(dev);
9568 int *parms = (int *)extra;
9569 int enable = (parms[0] > 0);
9571 IPW_DEBUG_WX("SET MONITOR: %d %d\n", enable, parms[1]);
9573 if (priv->ieee->iw_mode != IW_MODE_MONITOR) {
9574 priv->net_dev->type = ARPHRD_IEEE80211;
9575 queue_work(priv->workqueue, &priv->adapter_restart);
9578 ipw_set_channel(priv, parms[1]);
9580 if (priv->ieee->iw_mode != IW_MODE_MONITOR) {
9584 priv->net_dev->type = ARPHRD_ETHER;
9585 queue_work(priv->workqueue, &priv->adapter_restart);
9591 #endif // CONFIG_IPW2200_MONITOR
9593 static int ipw_wx_reset(struct net_device *dev,
9594 struct iw_request_info *info,
9595 union iwreq_data *wrqu, char *extra)
9597 struct ipw_priv *priv = ieee80211_priv(dev);
9598 IPW_DEBUG_WX("RESET\n");
9599 queue_work(priv->workqueue, &priv->adapter_restart);
9603 static int ipw_wx_sw_reset(struct net_device *dev,
9604 struct iw_request_info *info,
9605 union iwreq_data *wrqu, char *extra)
9607 struct ipw_priv *priv = ieee80211_priv(dev);
9608 union iwreq_data wrqu_sec = {
9610 .flags = IW_ENCODE_DISABLED,
9615 IPW_DEBUG_WX("SW_RESET\n");
9619 ret = ipw_sw_reset(priv, 0);
9622 ipw_adapter_restart(priv);
9625 /* The SW reset bit might have been toggled on by the 'disable'
9626 * module parameter, so take appropriate action */
9627 ipw_radio_kill_sw(priv, priv->status & STATUS_RF_KILL_SW);
9630 ieee80211_wx_set_encode(priv->ieee, info, &wrqu_sec, NULL);
9633 if (!(priv->status & STATUS_RF_KILL_MASK)) {
9634 /* Configuration likely changed -- force [re]association */
9635 IPW_DEBUG_ASSOC("[re]association triggered due to sw "
9637 if (!ipw_disassociate(priv))
9638 ipw_associate(priv);
9646 /* Rebase the WE IOCTLs to zero for the handler array */
9647 #define IW_IOCTL(x) [(x)-SIOCSIWCOMMIT]
9648 static iw_handler ipw_wx_handlers[] = {
9649 IW_IOCTL(SIOCGIWNAME) = ipw_wx_get_name,
9650 IW_IOCTL(SIOCSIWFREQ) = ipw_wx_set_freq,
9651 IW_IOCTL(SIOCGIWFREQ) = ipw_wx_get_freq,
9652 IW_IOCTL(SIOCSIWMODE) = ipw_wx_set_mode,
9653 IW_IOCTL(SIOCGIWMODE) = ipw_wx_get_mode,
9654 IW_IOCTL(SIOCGIWRANGE) = ipw_wx_get_range,
9655 IW_IOCTL(SIOCSIWAP) = ipw_wx_set_wap,
9656 IW_IOCTL(SIOCGIWAP) = ipw_wx_get_wap,
9657 IW_IOCTL(SIOCSIWSCAN) = ipw_wx_set_scan,
9658 IW_IOCTL(SIOCGIWSCAN) = ipw_wx_get_scan,
9659 IW_IOCTL(SIOCSIWESSID) = ipw_wx_set_essid,
9660 IW_IOCTL(SIOCGIWESSID) = ipw_wx_get_essid,
9661 IW_IOCTL(SIOCSIWNICKN) = ipw_wx_set_nick,
9662 IW_IOCTL(SIOCGIWNICKN) = ipw_wx_get_nick,
9663 IW_IOCTL(SIOCSIWRATE) = ipw_wx_set_rate,
9664 IW_IOCTL(SIOCGIWRATE) = ipw_wx_get_rate,
9665 IW_IOCTL(SIOCSIWRTS) = ipw_wx_set_rts,
9666 IW_IOCTL(SIOCGIWRTS) = ipw_wx_get_rts,
9667 IW_IOCTL(SIOCSIWFRAG) = ipw_wx_set_frag,
9668 IW_IOCTL(SIOCGIWFRAG) = ipw_wx_get_frag,
9669 IW_IOCTL(SIOCSIWTXPOW) = ipw_wx_set_txpow,
9670 IW_IOCTL(SIOCGIWTXPOW) = ipw_wx_get_txpow,
9671 IW_IOCTL(SIOCSIWRETRY) = ipw_wx_set_retry,
9672 IW_IOCTL(SIOCGIWRETRY) = ipw_wx_get_retry,
9673 IW_IOCTL(SIOCSIWENCODE) = ipw_wx_set_encode,
9674 IW_IOCTL(SIOCGIWENCODE) = ipw_wx_get_encode,
9675 IW_IOCTL(SIOCSIWPOWER) = ipw_wx_set_power,
9676 IW_IOCTL(SIOCGIWPOWER) = ipw_wx_get_power,
9677 IW_IOCTL(SIOCSIWSPY) = iw_handler_set_spy,
9678 IW_IOCTL(SIOCGIWSPY) = iw_handler_get_spy,
9679 IW_IOCTL(SIOCSIWTHRSPY) = iw_handler_set_thrspy,
9680 IW_IOCTL(SIOCGIWTHRSPY) = iw_handler_get_thrspy,
9681 #if WIRELESS_EXT > 17
9682 IW_IOCTL(SIOCSIWGENIE) = ipw_wx_set_genie,
9683 IW_IOCTL(SIOCGIWGENIE) = ipw_wx_get_genie,
9684 IW_IOCTL(SIOCSIWMLME) = ipw_wx_set_mlme,
9685 IW_IOCTL(SIOCSIWAUTH) = ipw_wx_set_auth,
9686 IW_IOCTL(SIOCGIWAUTH) = ipw_wx_get_auth,
9687 IW_IOCTL(SIOCSIWENCODEEXT) = ipw_wx_set_encodeext,
9688 IW_IOCTL(SIOCGIWENCODEEXT) = ipw_wx_get_encodeext,
9693 IPW_PRIV_SET_POWER = SIOCIWFIRSTPRIV,
9697 IPW_PRIV_SET_PREAMBLE,
9698 IPW_PRIV_GET_PREAMBLE,
9701 #ifdef CONFIG_IPW2200_MONITOR
9702 IPW_PRIV_SET_MONITOR,
9706 static struct iw_priv_args ipw_priv_args[] = {
9708 .cmd = IPW_PRIV_SET_POWER,
9709 .set_args = IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9710 .name = "set_power"},
9712 .cmd = IPW_PRIV_GET_POWER,
9713 .get_args = IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | MAX_WX_STRING,
9714 .name = "get_power"},
9716 .cmd = IPW_PRIV_SET_MODE,
9717 .set_args = IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9718 .name = "set_mode"},
9720 .cmd = IPW_PRIV_GET_MODE,
9721 .get_args = IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | MAX_WX_STRING,
9722 .name = "get_mode"},
9724 .cmd = IPW_PRIV_SET_PREAMBLE,
9725 .set_args = IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9726 .name = "set_preamble"},
9728 .cmd = IPW_PRIV_GET_PREAMBLE,
9729 .get_args = IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | IFNAMSIZ,
9730 .name = "get_preamble"},
9733 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 0, 0, "reset"},
9736 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 0, 0, "sw_reset"},
9737 #ifdef CONFIG_IPW2200_MONITOR
9739 IPW_PRIV_SET_MONITOR,
9740 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2, 0, "monitor"},
9741 #endif /* CONFIG_IPW2200_MONITOR */
9744 static iw_handler ipw_priv_handler[] = {
9745 ipw_wx_set_powermode,
9746 ipw_wx_get_powermode,
9747 ipw_wx_set_wireless_mode,
9748 ipw_wx_get_wireless_mode,
9749 ipw_wx_set_preamble,
9750 ipw_wx_get_preamble,
9753 #ifdef CONFIG_IPW2200_MONITOR
9758 static struct iw_handler_def ipw_wx_handler_def = {
9759 .standard = ipw_wx_handlers,
9760 .num_standard = ARRAY_SIZE(ipw_wx_handlers),
9761 .num_private = ARRAY_SIZE(ipw_priv_handler),
9762 .num_private_args = ARRAY_SIZE(ipw_priv_args),
9763 .private = ipw_priv_handler,
9764 .private_args = ipw_priv_args,
9767 static struct iw_public_data ipw_wx_data;
9770 * Get wireless statistics.
9771 * Called by /proc/net/wireless
9772 * Also called by SIOCGIWSTATS
9774 static struct iw_statistics *ipw_get_wireless_stats(struct net_device *dev)
9776 struct ipw_priv *priv = ieee80211_priv(dev);
9777 struct iw_statistics *wstats;
9779 wstats = &priv->wstats;
9781 /* if hw is disabled, then ipw_get_ordinal() can't be called.
9782 * netdev->get_wireless_stats seems to be called before fw is
9783 * initialized. STATUS_ASSOCIATED will only be set if the hw is up
9784 * and associated; if not associcated, the values are all meaningless
9785 * anyway, so set them all to NULL and INVALID */
9786 if (!(priv->status & STATUS_ASSOCIATED)) {
9787 wstats->miss.beacon = 0;
9788 wstats->discard.retries = 0;
9789 wstats->qual.qual = 0;
9790 wstats->qual.level = 0;
9791 wstats->qual.noise = 0;
9792 wstats->qual.updated = 7;
9793 wstats->qual.updated |= IW_QUAL_NOISE_INVALID |
9794 IW_QUAL_QUAL_INVALID | IW_QUAL_LEVEL_INVALID;
9798 wstats->qual.qual = priv->quality;
9799 wstats->qual.level = average_value(&priv->average_rssi);
9800 wstats->qual.noise = average_value(&priv->average_noise);
9801 wstats->qual.updated = IW_QUAL_QUAL_UPDATED | IW_QUAL_LEVEL_UPDATED |
9802 IW_QUAL_NOISE_UPDATED;
9804 wstats->miss.beacon = average_value(&priv->average_missed_beacons);
9805 wstats->discard.retries = priv->last_tx_failures;
9806 wstats->discard.code = priv->ieee->ieee_stats.rx_discards_undecryptable;
9808 /* if (ipw_get_ordinal(priv, IPW_ORD_STAT_TX_RETRY, &tx_retry, &len))
9809 goto fail_get_ordinal;
9810 wstats->discard.retries += tx_retry; */
9815 /* net device stuff */
9817 static inline void init_sys_config(struct ipw_sys_config *sys_config)
9819 memset(sys_config, 0, sizeof(struct ipw_sys_config));
9820 sys_config->bt_coexistence = 1; /* We may need to look into prvStaBtConfig */
9821 sys_config->answer_broadcast_ssid_probe = 0;
9822 sys_config->accept_all_data_frames = 0;
9823 sys_config->accept_non_directed_frames = 1;
9824 sys_config->exclude_unicast_unencrypted = 0;
9825 sys_config->disable_unicast_decryption = 1;
9826 sys_config->exclude_multicast_unencrypted = 0;
9827 sys_config->disable_multicast_decryption = 1;
9828 sys_config->antenna_diversity = CFG_SYS_ANTENNA_BOTH;
9829 sys_config->pass_crc_to_host = 0; /* TODO: See if 1 gives us FCS */
9830 sys_config->dot11g_auto_detection = 0;
9831 sys_config->enable_cts_to_self = 0;
9832 sys_config->bt_coexist_collision_thr = 0;
9833 sys_config->pass_noise_stats_to_host = 1; //1 -- fix for 256
9836 static int ipw_net_open(struct net_device *dev)
9838 struct ipw_priv *priv = ieee80211_priv(dev);
9839 IPW_DEBUG_INFO("dev->open\n");
9840 /* we should be verifying the device is ready to be opened */
9842 if (!(priv->status & STATUS_RF_KILL_MASK) &&
9843 (priv->status & STATUS_ASSOCIATED))
9844 netif_start_queue(dev);
9849 static int ipw_net_stop(struct net_device *dev)
9851 IPW_DEBUG_INFO("dev->close\n");
9852 netif_stop_queue(dev);
9859 modify to send one tfd per fragment instead of using chunking. otherwise
9860 we need to heavily modify the ieee80211_skb_to_txb.
9863 static inline int ipw_tx_skb(struct ipw_priv *priv, struct ieee80211_txb *txb,
9866 struct ieee80211_hdr_3addr *hdr = (struct ieee80211_hdr_3addr *)
9867 txb->fragments[0]->data;
9869 struct tfd_frame *tfd;
9870 #ifdef CONFIG_IPW_QOS
9871 int tx_id = ipw_get_tx_queue_number(priv, pri);
9872 struct clx2_tx_queue *txq = &priv->txq[tx_id];
9874 struct clx2_tx_queue *txq = &priv->txq[0];
9876 struct clx2_queue *q = &txq->q;
9877 u8 id, hdr_len, unicast;
9878 u16 remaining_bytes;
9881 /* If there isn't room in the queue, we return busy and let the
9882 * network stack requeue the packet for us */
9883 if (ipw_queue_space(q) < q->high_mark)
9884 return NETDEV_TX_BUSY;
9886 switch (priv->ieee->iw_mode) {
9888 hdr_len = IEEE80211_3ADDR_LEN;
9889 unicast = !is_multicast_ether_addr(hdr->addr1);
9890 id = ipw_find_station(priv, hdr->addr1);
9891 if (id == IPW_INVALID_STATION) {
9892 id = ipw_add_station(priv, hdr->addr1);
9893 if (id == IPW_INVALID_STATION) {
9894 IPW_WARNING("Attempt to send data to "
9895 "invalid cell: " MAC_FMT "\n",
9896 MAC_ARG(hdr->addr1));
9904 unicast = !is_multicast_ether_addr(hdr->addr3);
9905 hdr_len = IEEE80211_3ADDR_LEN;
9910 tfd = &txq->bd[q->first_empty];
9911 txq->txb[q->first_empty] = txb;
9912 memset(tfd, 0, sizeof(*tfd));
9913 tfd->u.data.station_number = id;
9915 tfd->control_flags.message_type = TX_FRAME_TYPE;
9916 tfd->control_flags.control_bits = TFD_NEED_IRQ_MASK;
9918 tfd->u.data.cmd_id = DINO_CMD_TX;
9919 tfd->u.data.len = cpu_to_le16(txb->payload_size);
9920 remaining_bytes = txb->payload_size;
9922 if (priv->assoc_request.ieee_mode == IPW_B_MODE)
9923 tfd->u.data.tx_flags_ext |= DCT_FLAG_EXT_MODE_CCK;
9925 tfd->u.data.tx_flags_ext |= DCT_FLAG_EXT_MODE_OFDM;
9927 if (priv->assoc_request.preamble_length == DCT_FLAG_SHORT_PREAMBLE)
9928 tfd->u.data.tx_flags |= DCT_FLAG_SHORT_PREAMBLE;
9930 fc = le16_to_cpu(hdr->frame_ctl);
9931 hdr->frame_ctl = cpu_to_le16(fc & ~IEEE80211_FCTL_MOREFRAGS);
9933 memcpy(&tfd->u.data.tfd.tfd_24.mchdr, hdr, hdr_len);
9935 if (likely(unicast))
9936 tfd->u.data.tx_flags |= DCT_FLAG_ACK_REQD;
9938 if (txb->encrypted && !priv->ieee->host_encrypt) {
9939 switch (priv->ieee->sec.level) {
9941 tfd->u.data.tfd.tfd_24.mchdr.frame_ctl |=
9942 IEEE80211_FCTL_PROTECTED;
9943 /* XXX: ACK flag must be set for CCMP even if it
9944 * is a multicast/broadcast packet, because CCMP
9945 * group communication encrypted by GTK is
9946 * actually done by the AP. */
9948 tfd->u.data.tx_flags |= DCT_FLAG_ACK_REQD;
9950 tfd->u.data.tx_flags &= ~DCT_FLAG_NO_WEP;
9951 tfd->u.data.tx_flags_ext |= DCT_FLAG_EXT_SECURITY_CCM;
9952 tfd->u.data.key_index = 0;
9953 tfd->u.data.key_index |= DCT_WEP_INDEX_USE_IMMEDIATE;
9956 tfd->u.data.tfd.tfd_24.mchdr.frame_ctl |=
9957 IEEE80211_FCTL_PROTECTED;
9958 tfd->u.data.tx_flags &= ~DCT_FLAG_NO_WEP;
9959 tfd->u.data.tx_flags_ext |= DCT_FLAG_EXT_SECURITY_TKIP;
9960 tfd->u.data.key_index = DCT_WEP_INDEX_USE_IMMEDIATE;
9963 tfd->u.data.tfd.tfd_24.mchdr.frame_ctl |=
9964 IEEE80211_FCTL_PROTECTED;
9965 tfd->u.data.key_index = priv->ieee->tx_keyidx;
9966 if (priv->ieee->sec.key_sizes[priv->ieee->tx_keyidx] <=
9968 tfd->u.data.key_index |= DCT_WEP_KEY_64Bit;
9970 tfd->u.data.key_index |= DCT_WEP_KEY_128Bit;
9975 printk(KERN_ERR "Unknow security level %d\n",
9976 priv->ieee->sec.level);
9980 /* No hardware encryption */
9981 tfd->u.data.tx_flags |= DCT_FLAG_NO_WEP;
9983 #ifdef CONFIG_IPW_QOS
9984 ipw_qos_set_tx_queue_command(priv, pri, &(tfd->u.data), unicast);
9985 #endif /* CONFIG_IPW_QOS */
9988 tfd->u.data.num_chunks = cpu_to_le32(min((u8) (NUM_TFD_CHUNKS - 2),
9990 IPW_DEBUG_FRAG("%i fragments being sent as %i chunks.\n",
9991 txb->nr_frags, le32_to_cpu(tfd->u.data.num_chunks));
9992 for (i = 0; i < le32_to_cpu(tfd->u.data.num_chunks); i++) {
9993 IPW_DEBUG_FRAG("Adding fragment %i of %i (%d bytes).\n",
9994 i, le32_to_cpu(tfd->u.data.num_chunks),
9995 txb->fragments[i]->len - hdr_len);
9996 IPW_DEBUG_TX("Dumping TX packet frag %i of %i (%d bytes):\n",
9997 i, tfd->u.data.num_chunks,
9998 txb->fragments[i]->len - hdr_len);
9999 printk_buf(IPW_DL_TX, txb->fragments[i]->data + hdr_len,
10000 txb->fragments[i]->len - hdr_len);
10002 tfd->u.data.chunk_ptr[i] =
10003 cpu_to_le32(pci_map_single
10005 txb->fragments[i]->data + hdr_len,
10006 txb->fragments[i]->len - hdr_len,
10007 PCI_DMA_TODEVICE));
10008 tfd->u.data.chunk_len[i] =
10009 cpu_to_le16(txb->fragments[i]->len - hdr_len);
10012 if (i != txb->nr_frags) {
10013 struct sk_buff *skb;
10014 u16 remaining_bytes = 0;
10017 for (j = i; j < txb->nr_frags; j++)
10018 remaining_bytes += txb->fragments[j]->len - hdr_len;
10020 printk(KERN_INFO "Trying to reallocate for %d bytes\n",
10022 skb = alloc_skb(remaining_bytes, GFP_ATOMIC);
10024 tfd->u.data.chunk_len[i] = cpu_to_le16(remaining_bytes);
10025 for (j = i; j < txb->nr_frags; j++) {
10026 int size = txb->fragments[j]->len - hdr_len;
10028 printk(KERN_INFO "Adding frag %d %d...\n",
10030 memcpy(skb_put(skb, size),
10031 txb->fragments[j]->data + hdr_len, size);
10033 dev_kfree_skb_any(txb->fragments[i]);
10034 txb->fragments[i] = skb;
10035 tfd->u.data.chunk_ptr[i] =
10036 cpu_to_le32(pci_map_single
10037 (priv->pci_dev, skb->data,
10038 tfd->u.data.chunk_len[i],
10039 PCI_DMA_TODEVICE));
10041 tfd->u.data.num_chunks =
10042 cpu_to_le32(le32_to_cpu(tfd->u.data.num_chunks) +
10048 q->first_empty = ipw_queue_inc_wrap(q->first_empty, q->n_bd);
10049 ipw_write32(priv, q->reg_w, q->first_empty);
10051 return NETDEV_TX_OK;
10054 IPW_DEBUG_DROP("Silently dropping Tx packet.\n");
10055 ieee80211_txb_free(txb);
10056 return NETDEV_TX_OK;
10059 static int ipw_net_is_queue_full(struct net_device *dev, int pri)
10061 struct ipw_priv *priv = ieee80211_priv(dev);
10062 #ifdef CONFIG_IPW_QOS
10063 int tx_id = ipw_get_tx_queue_number(priv, pri);
10064 struct clx2_tx_queue *txq = &priv->txq[tx_id];
10066 struct clx2_tx_queue *txq = &priv->txq[0];
10067 #endif /* CONFIG_IPW_QOS */
10069 if (ipw_queue_space(&txq->q) < txq->q.high_mark)
10075 static int ipw_net_hard_start_xmit(struct ieee80211_txb *txb,
10076 struct net_device *dev, int pri)
10078 struct ipw_priv *priv = ieee80211_priv(dev);
10079 unsigned long flags;
10082 IPW_DEBUG_TX("dev->xmit(%d bytes)\n", txb->payload_size);
10083 spin_lock_irqsave(&priv->lock, flags);
10085 if (!(priv->status & STATUS_ASSOCIATED)) {
10086 IPW_DEBUG_INFO("Tx attempt while not associated.\n");
10087 priv->ieee->stats.tx_carrier_errors++;
10088 netif_stop_queue(dev);
10092 ret = ipw_tx_skb(priv, txb, pri);
10093 if (ret == NETDEV_TX_OK)
10094 __ipw_led_activity_on(priv);
10095 spin_unlock_irqrestore(&priv->lock, flags);
10100 spin_unlock_irqrestore(&priv->lock, flags);
10104 static struct net_device_stats *ipw_net_get_stats(struct net_device *dev)
10106 struct ipw_priv *priv = ieee80211_priv(dev);
10108 priv->ieee->stats.tx_packets = priv->tx_packets;
10109 priv->ieee->stats.rx_packets = priv->rx_packets;
10110 return &priv->ieee->stats;
10113 static void ipw_net_set_multicast_list(struct net_device *dev)
10118 static int ipw_net_set_mac_address(struct net_device *dev, void *p)
10120 struct ipw_priv *priv = ieee80211_priv(dev);
10121 struct sockaddr *addr = p;
10122 if (!is_valid_ether_addr(addr->sa_data))
10123 return -EADDRNOTAVAIL;
10125 priv->config |= CFG_CUSTOM_MAC;
10126 memcpy(priv->mac_addr, addr->sa_data, ETH_ALEN);
10127 printk(KERN_INFO "%s: Setting MAC to " MAC_FMT "\n",
10128 priv->net_dev->name, MAC_ARG(priv->mac_addr));
10129 queue_work(priv->workqueue, &priv->adapter_restart);
10134 static void ipw_ethtool_get_drvinfo(struct net_device *dev,
10135 struct ethtool_drvinfo *info)
10137 struct ipw_priv *p = ieee80211_priv(dev);
10142 strcpy(info->driver, DRV_NAME);
10143 strcpy(info->version, DRV_VERSION);
10145 len = sizeof(vers);
10146 ipw_get_ordinal(p, IPW_ORD_STAT_FW_VERSION, vers, &len);
10147 len = sizeof(date);
10148 ipw_get_ordinal(p, IPW_ORD_STAT_FW_DATE, date, &len);
10150 snprintf(info->fw_version, sizeof(info->fw_version), "%s (%s)",
10152 strcpy(info->bus_info, pci_name(p->pci_dev));
10153 info->eedump_len = IPW_EEPROM_IMAGE_SIZE;
10156 static u32 ipw_ethtool_get_link(struct net_device *dev)
10158 struct ipw_priv *priv = ieee80211_priv(dev);
10159 return (priv->status & STATUS_ASSOCIATED) != 0;
10162 static int ipw_ethtool_get_eeprom_len(struct net_device *dev)
10164 return IPW_EEPROM_IMAGE_SIZE;
10167 static int ipw_ethtool_get_eeprom(struct net_device *dev,
10168 struct ethtool_eeprom *eeprom, u8 * bytes)
10170 struct ipw_priv *p = ieee80211_priv(dev);
10172 if (eeprom->offset + eeprom->len > IPW_EEPROM_IMAGE_SIZE)
10175 memcpy(bytes, &p->eeprom[eeprom->offset], eeprom->len);
10180 static int ipw_ethtool_set_eeprom(struct net_device *dev,
10181 struct ethtool_eeprom *eeprom, u8 * bytes)
10183 struct ipw_priv *p = ieee80211_priv(dev);
10186 if (eeprom->offset + eeprom->len > IPW_EEPROM_IMAGE_SIZE)
10189 memcpy(&p->eeprom[eeprom->offset], bytes, eeprom->len);
10190 for (i = IPW_EEPROM_DATA;
10191 i < IPW_EEPROM_DATA + IPW_EEPROM_IMAGE_SIZE; i++)
10192 ipw_write8(p, i, p->eeprom[i]);
10197 static struct ethtool_ops ipw_ethtool_ops = {
10198 .get_link = ipw_ethtool_get_link,
10199 .get_drvinfo = ipw_ethtool_get_drvinfo,
10200 .get_eeprom_len = ipw_ethtool_get_eeprom_len,
10201 .get_eeprom = ipw_ethtool_get_eeprom,
10202 .set_eeprom = ipw_ethtool_set_eeprom,
10205 static irqreturn_t ipw_isr(int irq, void *data, struct pt_regs *regs)
10207 struct ipw_priv *priv = data;
10208 u32 inta, inta_mask;
10213 spin_lock(&priv->lock);
10215 if (!(priv->status & STATUS_INT_ENABLED)) {
10220 inta = ipw_read32(priv, IPW_INTA_RW);
10221 inta_mask = ipw_read32(priv, IPW_INTA_MASK_R);
10223 if (inta == 0xFFFFFFFF) {
10224 /* Hardware disappeared */
10225 IPW_WARNING("IRQ INTA == 0xFFFFFFFF\n");
10229 if (!(inta & (IPW_INTA_MASK_ALL & inta_mask))) {
10230 /* Shared interrupt */
10234 /* tell the device to stop sending interrupts */
10235 ipw_disable_interrupts(priv);
10237 /* ack current interrupts */
10238 inta &= (IPW_INTA_MASK_ALL & inta_mask);
10239 ipw_write32(priv, IPW_INTA_RW, inta);
10241 /* Cache INTA value for our tasklet */
10242 priv->isr_inta = inta;
10244 tasklet_schedule(&priv->irq_tasklet);
10246 spin_unlock(&priv->lock);
10248 return IRQ_HANDLED;
10250 spin_unlock(&priv->lock);
10254 static void ipw_rf_kill(void *adapter)
10256 struct ipw_priv *priv = adapter;
10257 unsigned long flags;
10259 spin_lock_irqsave(&priv->lock, flags);
10261 if (rf_kill_active(priv)) {
10262 IPW_DEBUG_RF_KILL("RF Kill active, rescheduling GPIO check\n");
10263 if (priv->workqueue)
10264 queue_delayed_work(priv->workqueue,
10265 &priv->rf_kill, 2 * HZ);
10269 /* RF Kill is now disabled, so bring the device back up */
10271 if (!(priv->status & STATUS_RF_KILL_MASK)) {
10272 IPW_DEBUG_RF_KILL("HW RF Kill no longer active, restarting "
10275 /* we can not do an adapter restart while inside an irq lock */
10276 queue_work(priv->workqueue, &priv->adapter_restart);
10278 IPW_DEBUG_RF_KILL("HW RF Kill deactivated. SW RF Kill still "
10282 spin_unlock_irqrestore(&priv->lock, flags);
10285 static void ipw_bg_rf_kill(void *data)
10287 struct ipw_priv *priv = data;
10293 void ipw_link_up(struct ipw_priv *priv)
10295 priv->last_seq_num = -1;
10296 priv->last_frag_num = -1;
10297 priv->last_packet_time = 0;
10299 netif_carrier_on(priv->net_dev);
10300 if (netif_queue_stopped(priv->net_dev)) {
10301 IPW_DEBUG_NOTIF("waking queue\n");
10302 netif_wake_queue(priv->net_dev);
10304 IPW_DEBUG_NOTIF("starting queue\n");
10305 netif_start_queue(priv->net_dev);
10308 cancel_delayed_work(&priv->request_scan);
10309 ipw_reset_stats(priv);
10310 /* Ensure the rate is updated immediately */
10311 priv->last_rate = ipw_get_current_rate(priv);
10312 ipw_gather_stats(priv);
10313 ipw_led_link_up(priv);
10314 notify_wx_assoc_event(priv);
10316 if (priv->config & CFG_BACKGROUND_SCAN)
10317 queue_delayed_work(priv->workqueue, &priv->request_scan, HZ);
10320 static void ipw_bg_link_up(void *data)
10322 struct ipw_priv *priv = data;
10328 void ipw_link_down(struct ipw_priv *priv)
10330 ipw_led_link_down(priv);
10331 netif_carrier_off(priv->net_dev);
10332 netif_stop_queue(priv->net_dev);
10333 notify_wx_assoc_event(priv);
10335 /* Cancel any queued work ... */
10336 cancel_delayed_work(&priv->request_scan);
10337 cancel_delayed_work(&priv->adhoc_check);
10338 cancel_delayed_work(&priv->gather_stats);
10340 ipw_reset_stats(priv);
10342 if (!(priv->status & STATUS_EXIT_PENDING)) {
10343 /* Queue up another scan... */
10344 queue_work(priv->workqueue, &priv->request_scan);
10348 static void ipw_bg_link_down(void *data)
10350 struct ipw_priv *priv = data;
10352 ipw_link_down(data);
10356 static int ipw_setup_deferred_work(struct ipw_priv *priv)
10360 priv->workqueue = create_workqueue(DRV_NAME);
10361 init_waitqueue_head(&priv->wait_command_queue);
10362 init_waitqueue_head(&priv->wait_state);
10364 INIT_WORK(&priv->adhoc_check, ipw_bg_adhoc_check, priv);
10365 INIT_WORK(&priv->associate, ipw_bg_associate, priv);
10366 INIT_WORK(&priv->disassociate, ipw_bg_disassociate, priv);
10367 INIT_WORK(&priv->system_config, ipw_system_config, priv);
10368 INIT_WORK(&priv->rx_replenish, ipw_bg_rx_queue_replenish, priv);
10369 INIT_WORK(&priv->adapter_restart, ipw_bg_adapter_restart, priv);
10370 INIT_WORK(&priv->rf_kill, ipw_bg_rf_kill, priv);
10371 INIT_WORK(&priv->up, (void (*)(void *))ipw_bg_up, priv);
10372 INIT_WORK(&priv->down, (void (*)(void *))ipw_bg_down, priv);
10373 INIT_WORK(&priv->request_scan,
10374 (void (*)(void *))ipw_request_scan, priv);
10375 INIT_WORK(&priv->gather_stats,
10376 (void (*)(void *))ipw_bg_gather_stats, priv);
10377 INIT_WORK(&priv->abort_scan, (void (*)(void *))ipw_bg_abort_scan, priv);
10378 INIT_WORK(&priv->roam, ipw_bg_roam, priv);
10379 INIT_WORK(&priv->scan_check, ipw_bg_scan_check, priv);
10380 INIT_WORK(&priv->link_up, (void (*)(void *))ipw_bg_link_up, priv);
10381 INIT_WORK(&priv->link_down, (void (*)(void *))ipw_bg_link_down, priv);
10382 INIT_WORK(&priv->led_link_on, (void (*)(void *))ipw_bg_led_link_on,
10384 INIT_WORK(&priv->led_link_off, (void (*)(void *))ipw_bg_led_link_off,
10386 INIT_WORK(&priv->led_act_off, (void (*)(void *))ipw_bg_led_activity_off,
10388 INIT_WORK(&priv->merge_networks,
10389 (void (*)(void *))ipw_merge_adhoc_network, priv);
10391 #ifdef CONFIG_IPW_QOS
10392 INIT_WORK(&priv->qos_activate, (void (*)(void *))ipw_bg_qos_activate,
10394 #endif /* CONFIG_IPW_QOS */
10396 tasklet_init(&priv->irq_tasklet, (void (*)(unsigned long))
10397 ipw_irq_tasklet, (unsigned long)priv);
10402 static void shim__set_security(struct net_device *dev,
10403 struct ieee80211_security *sec)
10405 struct ipw_priv *priv = ieee80211_priv(dev);
10407 for (i = 0; i < 4; i++) {
10408 if (sec->flags & (1 << i)) {
10409 priv->ieee->sec.encode_alg[i] = sec->encode_alg[i];
10410 priv->ieee->sec.key_sizes[i] = sec->key_sizes[i];
10411 if (sec->key_sizes[i] == 0)
10412 priv->ieee->sec.flags &= ~(1 << i);
10414 memcpy(priv->ieee->sec.keys[i], sec->keys[i],
10415 sec->key_sizes[i]);
10416 priv->ieee->sec.flags |= (1 << i);
10418 priv->status |= STATUS_SECURITY_UPDATED;
10419 } else if (sec->level != SEC_LEVEL_1)
10420 priv->ieee->sec.flags &= ~(1 << i);
10423 if (sec->flags & SEC_ACTIVE_KEY) {
10424 if (sec->active_key <= 3) {
10425 priv->ieee->sec.active_key = sec->active_key;
10426 priv->ieee->sec.flags |= SEC_ACTIVE_KEY;
10428 priv->ieee->sec.flags &= ~SEC_ACTIVE_KEY;
10429 priv->status |= STATUS_SECURITY_UPDATED;
10431 priv->ieee->sec.flags &= ~SEC_ACTIVE_KEY;
10433 if ((sec->flags & SEC_AUTH_MODE) &&
10434 (priv->ieee->sec.auth_mode != sec->auth_mode)) {
10435 priv->ieee->sec.auth_mode = sec->auth_mode;
10436 priv->ieee->sec.flags |= SEC_AUTH_MODE;
10437 if (sec->auth_mode == WLAN_AUTH_SHARED_KEY)
10438 priv->capability |= CAP_SHARED_KEY;
10440 priv->capability &= ~CAP_SHARED_KEY;
10441 priv->status |= STATUS_SECURITY_UPDATED;
10444 if (sec->flags & SEC_ENABLED && priv->ieee->sec.enabled != sec->enabled) {
10445 priv->ieee->sec.flags |= SEC_ENABLED;
10446 priv->ieee->sec.enabled = sec->enabled;
10447 priv->status |= STATUS_SECURITY_UPDATED;
10449 priv->capability |= CAP_PRIVACY_ON;
10451 priv->capability &= ~CAP_PRIVACY_ON;
10454 if (sec->flags & SEC_ENCRYPT)
10455 priv->ieee->sec.encrypt = sec->encrypt;
10457 if (sec->flags & SEC_LEVEL && priv->ieee->sec.level != sec->level) {
10458 priv->ieee->sec.level = sec->level;
10459 priv->ieee->sec.flags |= SEC_LEVEL;
10460 priv->status |= STATUS_SECURITY_UPDATED;
10463 if (!priv->ieee->host_encrypt && (sec->flags & SEC_ENCRYPT))
10464 ipw_set_hwcrypto_keys(priv);
10466 /* To match current functionality of ipw2100 (which works well w/
10467 * various supplicants, we don't force a disassociate if the
10468 * privacy capability changes ... */
10470 if ((priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING)) &&
10471 (((priv->assoc_request.capability &
10472 WLAN_CAPABILITY_PRIVACY) && !sec->enabled) ||
10473 (!(priv->assoc_request.capability &
10474 WLAN_CAPABILITY_PRIVACY) && sec->enabled))) {
10475 IPW_DEBUG_ASSOC("Disassociating due to capability "
10477 ipw_disassociate(priv);
10482 static int init_supported_rates(struct ipw_priv *priv,
10483 struct ipw_supported_rates *rates)
10485 /* TODO: Mask out rates based on priv->rates_mask */
10487 memset(rates, 0, sizeof(*rates));
10488 /* configure supported rates */
10489 switch (priv->ieee->freq_band) {
10490 case IEEE80211_52GHZ_BAND:
10491 rates->ieee_mode = IPW_A_MODE;
10492 rates->purpose = IPW_RATE_CAPABILITIES;
10493 ipw_add_ofdm_scan_rates(rates, IEEE80211_CCK_MODULATION,
10494 IEEE80211_OFDM_DEFAULT_RATES_MASK);
10497 default: /* Mixed or 2.4Ghz */
10498 rates->ieee_mode = IPW_G_MODE;
10499 rates->purpose = IPW_RATE_CAPABILITIES;
10500 ipw_add_cck_scan_rates(rates, IEEE80211_CCK_MODULATION,
10501 IEEE80211_CCK_DEFAULT_RATES_MASK);
10502 if (priv->ieee->modulation & IEEE80211_OFDM_MODULATION) {
10503 ipw_add_ofdm_scan_rates(rates, IEEE80211_CCK_MODULATION,
10504 IEEE80211_OFDM_DEFAULT_RATES_MASK);
10512 static int ipw_config(struct ipw_priv *priv)
10514 /* This is only called from ipw_up, which resets/reloads the firmware
10515 so, we don't need to first disable the card before we configure
10517 if (ipw_set_tx_power(priv))
10520 /* initialize adapter address */
10521 if (ipw_send_adapter_address(priv, priv->net_dev->dev_addr))
10524 /* set basic system config settings */
10525 init_sys_config(&priv->sys_config);
10526 if (priv->ieee->iw_mode == IW_MODE_ADHOC)
10527 priv->sys_config.answer_broadcast_ssid_probe = 1;
10529 priv->sys_config.answer_broadcast_ssid_probe = 0;
10531 if (ipw_send_system_config(priv, &priv->sys_config))
10534 init_supported_rates(priv, &priv->rates);
10535 if (ipw_send_supported_rates(priv, &priv->rates))
10538 /* Set request-to-send threshold */
10539 if (priv->rts_threshold) {
10540 if (ipw_send_rts_threshold(priv, priv->rts_threshold))
10543 #ifdef CONFIG_IPW_QOS
10544 IPW_DEBUG_QOS("QoS: call ipw_qos_activate\n");
10545 ipw_qos_activate(priv, NULL);
10546 #endif /* CONFIG_IPW_QOS */
10548 if (ipw_set_random_seed(priv))
10551 /* final state transition to the RUN state */
10552 if (ipw_send_host_complete(priv))
10555 priv->status |= STATUS_INIT;
10557 ipw_led_init(priv);
10558 ipw_led_radio_on(priv);
10559 priv->notif_missed_beacons = 0;
10561 /* Set hardware WEP key if it is configured. */
10562 if ((priv->capability & CAP_PRIVACY_ON) &&
10563 (priv->ieee->sec.level == SEC_LEVEL_1) &&
10564 !(priv->ieee->host_encrypt || priv->ieee->host_decrypt))
10565 ipw_set_hwcrypto_keys(priv);
10576 * These tables have been tested in conjunction with the
10577 * Intel PRO/Wireless 2200BG and 2915ABG Network Connection Adapters.
10579 * Altering this values, using it on other hardware, or in geographies
10580 * not intended for resale of the above mentioned Intel adapters has
10584 static const struct ieee80211_geo ipw_geos[] = {
10588 .bg = {{2412, 1}, {2417, 2}, {2422, 3},
10589 {2427, 4}, {2432, 5}, {2437, 6},
10590 {2442, 7}, {2447, 8}, {2452, 9},
10591 {2457, 10}, {2462, 11}},
10594 { /* Custom US/Canada */
10597 .bg = {{2412, 1}, {2417, 2}, {2422, 3},
10598 {2427, 4}, {2432, 5}, {2437, 6},
10599 {2442, 7}, {2447, 8}, {2452, 9},
10600 {2457, 10}, {2462, 11}},
10606 {5260, 52, IEEE80211_CH_PASSIVE_ONLY},
10607 {5280, 56, IEEE80211_CH_PASSIVE_ONLY},
10608 {5300, 60, IEEE80211_CH_PASSIVE_ONLY},
10609 {5320, 64, IEEE80211_CH_PASSIVE_ONLY}},
10612 { /* Rest of World */
10615 .bg = {{2412, 1}, {2417, 2}, {2422, 3},
10616 {2427, 4}, {2432, 5}, {2437, 6},
10617 {2442, 7}, {2447, 8}, {2452, 9},
10618 {2457, 10}, {2462, 11}, {2467, 12},
10622 { /* Custom USA & Europe & High */
10625 .bg = {{2412, 1}, {2417, 2}, {2422, 3},
10626 {2427, 4}, {2432, 5}, {2437, 6},
10627 {2442, 7}, {2447, 8}, {2452, 9},
10628 {2457, 10}, {2462, 11}},
10634 {5260, 52, IEEE80211_CH_PASSIVE_ONLY},
10635 {5280, 56, IEEE80211_CH_PASSIVE_ONLY},
10636 {5300, 60, IEEE80211_CH_PASSIVE_ONLY},
10637 {5320, 64, IEEE80211_CH_PASSIVE_ONLY},
10645 { /* Custom NA & Europe */
10648 .bg = {{2412, 1}, {2417, 2}, {2422, 3},
10649 {2427, 4}, {2432, 5}, {2437, 6},
10650 {2442, 7}, {2447, 8}, {2452, 9},
10651 {2457, 10}, {2462, 11}},
10657 {5260, 52, IEEE80211_CH_PASSIVE_ONLY},
10658 {5280, 56, IEEE80211_CH_PASSIVE_ONLY},
10659 {5300, 60, IEEE80211_CH_PASSIVE_ONLY},
10660 {5320, 64, IEEE80211_CH_PASSIVE_ONLY},
10661 {5745, 149, IEEE80211_CH_PASSIVE_ONLY},
10662 {5765, 153, IEEE80211_CH_PASSIVE_ONLY},
10663 {5785, 157, IEEE80211_CH_PASSIVE_ONLY},
10664 {5805, 161, IEEE80211_CH_PASSIVE_ONLY},
10665 {5825, 165, IEEE80211_CH_PASSIVE_ONLY}},
10668 { /* Custom Japan */
10671 .bg = {{2412, 1}, {2417, 2}, {2422, 3},
10672 {2427, 4}, {2432, 5}, {2437, 6},
10673 {2442, 7}, {2447, 8}, {2452, 9},
10674 {2457, 10}, {2462, 11}},
10676 .a = {{5170, 34}, {5190, 38},
10677 {5210, 42}, {5230, 46}},
10683 .bg = {{2412, 1}, {2417, 2}, {2422, 3},
10684 {2427, 4}, {2432, 5}, {2437, 6},
10685 {2442, 7}, {2447, 8}, {2452, 9},
10686 {2457, 10}, {2462, 11}},
10692 .bg = {{2412, 1}, {2417, 2}, {2422, 3},
10693 {2427, 4}, {2432, 5}, {2437, 6},
10694 {2442, 7}, {2447, 8}, {2452, 9},
10695 {2457, 10}, {2462, 11}, {2467, 12},
10702 {5260, 52, IEEE80211_CH_PASSIVE_ONLY},
10703 {5280, 56, IEEE80211_CH_PASSIVE_ONLY},
10704 {5300, 60, IEEE80211_CH_PASSIVE_ONLY},
10705 {5320, 64, IEEE80211_CH_PASSIVE_ONLY},
10706 {5500, 100, IEEE80211_CH_PASSIVE_ONLY},
10707 {5520, 104, IEEE80211_CH_PASSIVE_ONLY},
10708 {5540, 108, IEEE80211_CH_PASSIVE_ONLY},
10709 {5560, 112, IEEE80211_CH_PASSIVE_ONLY},
10710 {5580, 116, IEEE80211_CH_PASSIVE_ONLY},
10711 {5600, 120, IEEE80211_CH_PASSIVE_ONLY},
10712 {5620, 124, IEEE80211_CH_PASSIVE_ONLY},
10713 {5640, 128, IEEE80211_CH_PASSIVE_ONLY},
10714 {5660, 132, IEEE80211_CH_PASSIVE_ONLY},
10715 {5680, 136, IEEE80211_CH_PASSIVE_ONLY},
10716 {5700, 140, IEEE80211_CH_PASSIVE_ONLY}},
10719 { /* Custom Japan */
10722 .bg = {{2412, 1}, {2417, 2}, {2422, 3},
10723 {2427, 4}, {2432, 5}, {2437, 6},
10724 {2442, 7}, {2447, 8}, {2452, 9},
10725 {2457, 10}, {2462, 11}, {2467, 12},
10726 {2472, 13}, {2484, 14, IEEE80211_CH_B_ONLY}},
10728 .a = {{5170, 34}, {5190, 38},
10729 {5210, 42}, {5230, 46}},
10735 .bg = {{2412, 1}, {2417, 2}, {2422, 3},
10736 {2427, 4}, {2432, 5}, {2437, 6},
10737 {2442, 7}, {2447, 8}, {2452, 9},
10738 {2457, 10}, {2462, 11},
10739 {2467, 12, IEEE80211_CH_PASSIVE_ONLY},
10740 {2472, 13, IEEE80211_CH_PASSIVE_ONLY}},
10742 .a = {{5745, 149}, {5765, 153},
10743 {5785, 157}, {5805, 161}},
10746 { /* Custom Europe */
10749 .bg = {{2412, 1}, {2417, 2}, {2422, 3},
10750 {2427, 4}, {2432, 5}, {2437, 6},
10751 {2442, 7}, {2447, 8}, {2452, 9},
10752 {2457, 10}, {2462, 11},
10753 {2467, 12}, {2472, 13}},
10755 .a = {{5180, 36}, {5200, 40},
10756 {5220, 44}, {5240, 48}},
10762 .bg = {{2412, 1}, {2417, 2}, {2422, 3},
10763 {2427, 4}, {2432, 5}, {2437, 6},
10764 {2442, 7}, {2447, 8}, {2452, 9},
10765 {2457, 10}, {2462, 11},
10766 {2467, 12, IEEE80211_CH_PASSIVE_ONLY},
10767 {2472, 13, IEEE80211_CH_PASSIVE_ONLY}},
10769 .a = {{5180, 36, IEEE80211_CH_PASSIVE_ONLY},
10770 {5200, 40, IEEE80211_CH_PASSIVE_ONLY},
10771 {5220, 44, IEEE80211_CH_PASSIVE_ONLY},
10772 {5240, 48, IEEE80211_CH_PASSIVE_ONLY},
10773 {5260, 52, IEEE80211_CH_PASSIVE_ONLY},
10774 {5280, 56, IEEE80211_CH_PASSIVE_ONLY},
10775 {5300, 60, IEEE80211_CH_PASSIVE_ONLY},
10776 {5320, 64, IEEE80211_CH_PASSIVE_ONLY},
10777 {5500, 100, IEEE80211_CH_PASSIVE_ONLY},
10778 {5520, 104, IEEE80211_CH_PASSIVE_ONLY},
10779 {5540, 108, IEEE80211_CH_PASSIVE_ONLY},
10780 {5560, 112, IEEE80211_CH_PASSIVE_ONLY},
10781 {5580, 116, IEEE80211_CH_PASSIVE_ONLY},
10782 {5600, 120, IEEE80211_CH_PASSIVE_ONLY},
10783 {5620, 124, IEEE80211_CH_PASSIVE_ONLY},
10784 {5640, 128, IEEE80211_CH_PASSIVE_ONLY},
10785 {5660, 132, IEEE80211_CH_PASSIVE_ONLY},
10786 {5680, 136, IEEE80211_CH_PASSIVE_ONLY},
10787 {5700, 140, IEEE80211_CH_PASSIVE_ONLY},
10788 {5745, 149, IEEE80211_CH_PASSIVE_ONLY},
10789 {5765, 153, IEEE80211_CH_PASSIVE_ONLY},
10790 {5785, 157, IEEE80211_CH_PASSIVE_ONLY},
10791 {5805, 161, IEEE80211_CH_PASSIVE_ONLY},
10792 {5825, 165, IEEE80211_CH_PASSIVE_ONLY}},
10798 .bg = {{2412, 1}, {2417, 2}, {2422, 3},
10799 {2427, 4}, {2432, 5}, {2437, 6},
10800 {2442, 7}, {2447, 8}, {2452, 9},
10801 {2457, 10}, {2462, 11}},
10803 .a = {{5180, 36, IEEE80211_CH_PASSIVE_ONLY},
10804 {5200, 40, IEEE80211_CH_PASSIVE_ONLY},
10805 {5220, 44, IEEE80211_CH_PASSIVE_ONLY},
10806 {5240, 48, IEEE80211_CH_PASSIVE_ONLY},
10807 {5260, 52, IEEE80211_CH_PASSIVE_ONLY},
10808 {5280, 56, IEEE80211_CH_PASSIVE_ONLY},
10809 {5300, 60, IEEE80211_CH_PASSIVE_ONLY},
10810 {5320, 64, IEEE80211_CH_PASSIVE_ONLY},
10811 {5745, 149, IEEE80211_CH_PASSIVE_ONLY},
10812 {5765, 153, IEEE80211_CH_PASSIVE_ONLY},
10813 {5785, 157, IEEE80211_CH_PASSIVE_ONLY},
10814 {5805, 161, IEEE80211_CH_PASSIVE_ONLY},
10815 {5825, 165, IEEE80211_CH_PASSIVE_ONLY}},
10819 /* GEO code borrowed from ieee80211_geo.c */
10820 static int ipw_is_valid_channel(struct ieee80211_device *ieee, u8 channel)
10824 /* Driver needs to initialize the geography map before using
10825 * these helper functions */
10826 BUG_ON(ieee->geo.bg_channels == 0 && ieee->geo.a_channels == 0);
10828 if (ieee->freq_band & IEEE80211_24GHZ_BAND)
10829 for (i = 0; i < ieee->geo.bg_channels; i++)
10830 /* NOTE: If G mode is currently supported but
10831 * this is a B only channel, we don't see it
10833 if ((ieee->geo.bg[i].channel == channel) &&
10834 (!(ieee->mode & IEEE_G) ||
10835 !(ieee->geo.bg[i].flags & IEEE80211_CH_B_ONLY)))
10836 return IEEE80211_24GHZ_BAND;
10838 if (ieee->freq_band & IEEE80211_52GHZ_BAND)
10839 for (i = 0; i < ieee->geo.a_channels; i++)
10840 if (ieee->geo.a[i].channel == channel)
10841 return IEEE80211_52GHZ_BAND;
10846 static int ipw_channel_to_index(struct ieee80211_device *ieee, u8 channel)
10850 /* Driver needs to initialize the geography map before using
10851 * these helper functions */
10852 BUG_ON(ieee->geo.bg_channels == 0 && ieee->geo.a_channels == 0);
10854 if (ieee->freq_band & IEEE80211_24GHZ_BAND)
10855 for (i = 0; i < ieee->geo.bg_channels; i++)
10856 if (ieee->geo.bg[i].channel == channel)
10859 if (ieee->freq_band & IEEE80211_52GHZ_BAND)
10860 for (i = 0; i < ieee->geo.a_channels; i++)
10861 if (ieee->geo.a[i].channel == channel)
10867 static u8 ipw_freq_to_channel(struct ieee80211_device *ieee, u32 freq)
10871 /* Driver needs to initialize the geography map before using
10872 * these helper functions */
10873 BUG_ON(ieee->geo.bg_channels == 0 && ieee->geo.a_channels == 0);
10877 if (ieee->freq_band & IEEE80211_24GHZ_BAND)
10878 for (i = 0; i < ieee->geo.bg_channels; i++)
10879 if (ieee->geo.bg[i].freq == freq)
10880 return ieee->geo.bg[i].channel;
10882 if (ieee->freq_band & IEEE80211_52GHZ_BAND)
10883 for (i = 0; i < ieee->geo.a_channels; i++)
10884 if (ieee->geo.a[i].freq == freq)
10885 return ieee->geo.a[i].channel;
10890 static int ipw_set_geo(struct ieee80211_device *ieee,
10891 const struct ieee80211_geo *geo)
10893 memcpy(ieee->geo.name, geo->name, 3);
10894 ieee->geo.name[3] = '\0';
10895 ieee->geo.bg_channels = geo->bg_channels;
10896 ieee->geo.a_channels = geo->a_channels;
10897 memcpy(ieee->geo.bg, geo->bg, geo->bg_channels *
10898 sizeof(struct ieee80211_channel));
10899 memcpy(ieee->geo.a, geo->a, ieee->geo.a_channels *
10900 sizeof(struct ieee80211_channel));
10904 static const struct ieee80211_geo *ipw_get_geo(struct ieee80211_device *ieee)
10909 #define MAX_HW_RESTARTS 5
10910 static int ipw_up(struct ipw_priv *priv)
10914 if (priv->status & STATUS_EXIT_PENDING)
10917 if (cmdlog && !priv->cmdlog) {
10918 priv->cmdlog = kmalloc(sizeof(*priv->cmdlog) * cmdlog,
10920 if (priv->cmdlog == NULL) {
10921 IPW_ERROR("Error allocating %d command log entries.\n",
10924 memset(priv->cmdlog, 0, sizeof(*priv->cmdlog) * cmdlog);
10925 priv->cmdlog_len = cmdlog;
10929 for (i = 0; i < MAX_HW_RESTARTS; i++) {
10930 /* Load the microcode, firmware, and eeprom.
10931 * Also start the clocks. */
10932 rc = ipw_load(priv);
10934 IPW_ERROR("Unable to load firmware: 0x%08X\n", rc);
10938 ipw_init_ordinals(priv);
10939 if (!(priv->config & CFG_CUSTOM_MAC))
10940 eeprom_parse_mac(priv, priv->mac_addr);
10941 memcpy(priv->net_dev->dev_addr, priv->mac_addr, ETH_ALEN);
10943 for (j = 0; j < ARRAY_SIZE(ipw_geos); j++) {
10944 if (!memcmp(&priv->eeprom[EEPROM_COUNTRY_CODE],
10945 ipw_geos[j].name, 3))
10948 if (j == ARRAY_SIZE(ipw_geos))
10950 if (ipw_set_geo(priv->ieee, &ipw_geos[j])) {
10951 IPW_WARNING("Could not set geography.");
10955 IPW_DEBUG_INFO("Geography %03d [%s] detected.\n",
10956 j, priv->ieee->geo.name);
10958 if (priv->status & STATUS_RF_KILL_SW) {
10959 IPW_WARNING("Radio disabled by module parameter.\n");
10961 } else if (rf_kill_active(priv)) {
10962 IPW_WARNING("Radio Frequency Kill Switch is On:\n"
10963 "Kill switch must be turned off for "
10964 "wireless networking to work.\n");
10965 queue_delayed_work(priv->workqueue, &priv->rf_kill,
10970 rc = ipw_config(priv);
10972 IPW_DEBUG_INFO("Configured device on count %i\n", i);
10974 /* If configure to try and auto-associate, kick
10976 queue_work(priv->workqueue, &priv->request_scan);
10981 IPW_DEBUG_INFO("Device configuration failed: 0x%08X\n", rc);
10982 IPW_DEBUG_INFO("Failed to config device on retry %d of %d\n",
10983 i, MAX_HW_RESTARTS);
10985 /* We had an error bringing up the hardware, so take it
10986 * all the way back down so we can try again */
10990 /* tried to restart and config the device for as long as our
10991 * patience could withstand */
10992 IPW_ERROR("Unable to initialize device after %d attempts.\n", i);
10997 static void ipw_bg_up(void *data)
10999 struct ipw_priv *priv = data;
11005 static void ipw_deinit(struct ipw_priv *priv)
11009 if (priv->status & STATUS_SCANNING) {
11010 IPW_DEBUG_INFO("Aborting scan during shutdown.\n");
11011 ipw_abort_scan(priv);
11014 if (priv->status & STATUS_ASSOCIATED) {
11015 IPW_DEBUG_INFO("Disassociating during shutdown.\n");
11016 ipw_disassociate(priv);
11019 ipw_led_shutdown(priv);
11021 /* Wait up to 1s for status to change to not scanning and not
11022 * associated (disassociation can take a while for a ful 802.11
11024 for (i = 1000; i && (priv->status &
11025 (STATUS_DISASSOCIATING |
11026 STATUS_ASSOCIATED | STATUS_SCANNING)); i--)
11029 if (priv->status & (STATUS_DISASSOCIATING |
11030 STATUS_ASSOCIATED | STATUS_SCANNING))
11031 IPW_DEBUG_INFO("Still associated or scanning...\n");
11033 IPW_DEBUG_INFO("Took %dms to de-init\n", 1000 - i);
11035 /* Attempt to disable the card */
11036 ipw_send_card_disable(priv, 0);
11038 priv->status &= ~STATUS_INIT;
11041 static void ipw_down(struct ipw_priv *priv)
11043 int exit_pending = priv->status & STATUS_EXIT_PENDING;
11045 priv->status |= STATUS_EXIT_PENDING;
11047 if (ipw_is_init(priv))
11050 /* Wipe out the EXIT_PENDING status bit if we are not actually
11051 * exiting the module */
11053 priv->status &= ~STATUS_EXIT_PENDING;
11055 /* tell the device to stop sending interrupts */
11056 ipw_disable_interrupts(priv);
11058 /* Clear all bits but the RF Kill */
11059 priv->status &= STATUS_RF_KILL_MASK | STATUS_EXIT_PENDING;
11060 netif_carrier_off(priv->net_dev);
11061 netif_stop_queue(priv->net_dev);
11063 ipw_stop_nic(priv);
11065 ipw_led_radio_off(priv);
11068 static void ipw_bg_down(void *data)
11070 struct ipw_priv *priv = data;
11076 #if WIRELESS_EXT < 18
11077 static int ipw_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
11079 struct iwreq *wrq = (struct iwreq *)rq;
11082 case IPW_IOCTL_WPA_SUPPLICANT:
11083 ret = ipw_wpa_supplicant(dev, &wrq->u.data);
11087 return -EOPNOTSUPP;
11090 return -EOPNOTSUPP;
11094 /* Called by register_netdev() */
11095 static int ipw_net_init(struct net_device *dev)
11097 struct ipw_priv *priv = ieee80211_priv(dev);
11100 if (ipw_up(priv)) {
11109 /* PCI driver stuff */
11110 static struct pci_device_id card_ids[] = {
11111 {PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, 0x2701, 0, 0, 0},
11112 {PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, 0x2702, 0, 0, 0},
11113 {PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, 0x2711, 0, 0, 0},
11114 {PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, 0x2712, 0, 0, 0},
11115 {PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, 0x2721, 0, 0, 0},
11116 {PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, 0x2722, 0, 0, 0},
11117 {PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, 0x2731, 0, 0, 0},
11118 {PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, 0x2732, 0, 0, 0},
11119 {PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, 0x2741, 0, 0, 0},
11120 {PCI_VENDOR_ID_INTEL, 0x1043, 0x103c, 0x2741, 0, 0, 0},
11121 {PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, 0x2742, 0, 0, 0},
11122 {PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, 0x2751, 0, 0, 0},
11123 {PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, 0x2752, 0, 0, 0},
11124 {PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, 0x2753, 0, 0, 0},
11125 {PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, 0x2754, 0, 0, 0},
11126 {PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, 0x2761, 0, 0, 0},
11127 {PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, 0x2762, 0, 0, 0},
11128 {PCI_VENDOR_ID_INTEL, 0x104f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
11129 {PCI_VENDOR_ID_INTEL, 0x4220, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, /* BG */
11130 {PCI_VENDOR_ID_INTEL, 0x4221, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, /* BG */
11131 {PCI_VENDOR_ID_INTEL, 0x4223, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, /* ABG */
11132 {PCI_VENDOR_ID_INTEL, 0x4224, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, /* ABG */
11134 /* required last entry */
11138 MODULE_DEVICE_TABLE(pci, card_ids);
11140 static struct attribute *ipw_sysfs_entries[] = {
11141 &dev_attr_rf_kill.attr,
11142 &dev_attr_direct_dword.attr,
11143 &dev_attr_indirect_byte.attr,
11144 &dev_attr_indirect_dword.attr,
11145 &dev_attr_mem_gpio_reg.attr,
11146 &dev_attr_command_event_reg.attr,
11147 &dev_attr_nic_type.attr,
11148 &dev_attr_status.attr,
11149 &dev_attr_cfg.attr,
11150 &dev_attr_error.attr,
11151 &dev_attr_event_log.attr,
11152 &dev_attr_cmd_log.attr,
11153 &dev_attr_eeprom_delay.attr,
11154 &dev_attr_ucode_version.attr,
11155 &dev_attr_rtc.attr,
11156 &dev_attr_scan_age.attr,
11157 &dev_attr_led.attr,
11158 &dev_attr_speed_scan.attr,
11159 &dev_attr_net_stats.attr,
11163 static struct attribute_group ipw_attribute_group = {
11164 .name = NULL, /* put in device directory */
11165 .attrs = ipw_sysfs_entries,
11168 static int ipw_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
11171 struct net_device *net_dev;
11172 void __iomem *base;
11174 struct ipw_priv *priv;
11177 net_dev = alloc_ieee80211(sizeof(struct ipw_priv));
11178 if (net_dev == NULL) {
11183 priv = ieee80211_priv(net_dev);
11184 priv->ieee = netdev_priv(net_dev);
11186 priv->net_dev = net_dev;
11187 priv->pci_dev = pdev;
11188 #ifdef CONFIG_IPW_DEBUG
11189 ipw_debug_level = debug;
11191 spin_lock_init(&priv->lock);
11192 for (i = 0; i < IPW_IBSS_MAC_HASH_SIZE; i++)
11193 INIT_LIST_HEAD(&priv->ibss_mac_hash[i]);
11195 init_MUTEX(&priv->sem);
11196 if (pci_enable_device(pdev)) {
11198 goto out_free_ieee80211;
11201 pci_set_master(pdev);
11203 err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
11205 err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
11207 printk(KERN_WARNING DRV_NAME ": No suitable DMA available.\n");
11208 goto out_pci_disable_device;
11211 pci_set_drvdata(pdev, priv);
11213 err = pci_request_regions(pdev, DRV_NAME);
11215 goto out_pci_disable_device;
11217 /* We disable the RETRY_TIMEOUT register (0x41) to keep
11218 * PCI Tx retries from interfering with C3 CPU state */
11219 pci_read_config_dword(pdev, 0x40, &val);
11220 if ((val & 0x0000ff00) != 0)
11221 pci_write_config_dword(pdev, 0x40, val & 0xffff00ff);
11223 length = pci_resource_len(pdev, 0);
11224 priv->hw_len = length;
11226 base = ioremap_nocache(pci_resource_start(pdev, 0), length);
11229 goto out_pci_release_regions;
11232 priv->hw_base = base;
11233 IPW_DEBUG_INFO("pci_resource_len = 0x%08x\n", length);
11234 IPW_DEBUG_INFO("pci_resource_base = %p\n", base);
11236 err = ipw_setup_deferred_work(priv);
11238 IPW_ERROR("Unable to setup deferred work\n");
11242 ipw_sw_reset(priv, 1);
11244 err = request_irq(pdev->irq, ipw_isr, SA_SHIRQ, DRV_NAME, priv);
11246 IPW_ERROR("Error allocating IRQ %d\n", pdev->irq);
11247 goto out_destroy_workqueue;
11250 SET_MODULE_OWNER(net_dev);
11251 SET_NETDEV_DEV(net_dev, &pdev->dev);
11253 ipw_wx_data.spy_data = &priv->ieee->spy_data;
11254 ipw_wx_data.ieee80211 = priv->ieee;
11258 priv->ieee->hard_start_xmit = ipw_net_hard_start_xmit;
11259 priv->ieee->set_security = shim__set_security;
11260 priv->ieee->is_queue_full = ipw_net_is_queue_full;
11262 #ifdef CONFIG_IPW_QOS
11263 priv->ieee->handle_management = ipw_handle_management;
11264 #endif /* CONFIG_IPW_QOS */
11266 priv->ieee->perfect_rssi = -20;
11267 priv->ieee->worst_rssi = -85;
11269 net_dev->open = ipw_net_open;
11270 net_dev->stop = ipw_net_stop;
11271 net_dev->init = ipw_net_init;
11272 #if WIRELESS_EXT < 18
11273 net_dev->do_ioctl = ipw_ioctl;
11275 net_dev->get_stats = ipw_net_get_stats;
11276 net_dev->set_multicast_list = ipw_net_set_multicast_list;
11277 net_dev->set_mac_address = ipw_net_set_mac_address;
11278 net_dev->get_wireless_stats = ipw_get_wireless_stats;
11279 net_dev->wireless_data = &ipw_wx_data;
11280 net_dev->wireless_handlers = &ipw_wx_handler_def;
11281 net_dev->ethtool_ops = &ipw_ethtool_ops;
11282 net_dev->irq = pdev->irq;
11283 net_dev->base_addr = (unsigned long)priv->hw_base;
11284 net_dev->mem_start = pci_resource_start(pdev, 0);
11285 net_dev->mem_end = net_dev->mem_start + pci_resource_len(pdev, 0) - 1;
11287 err = sysfs_create_group(&pdev->dev.kobj, &ipw_attribute_group);
11289 IPW_ERROR("failed to create sysfs device attributes\n");
11291 goto out_release_irq;
11295 err = register_netdev(net_dev);
11297 IPW_ERROR("failed to register network device\n");
11298 goto out_remove_sysfs;
11303 sysfs_remove_group(&pdev->dev.kobj, &ipw_attribute_group);
11305 free_irq(pdev->irq, priv);
11306 out_destroy_workqueue:
11307 destroy_workqueue(priv->workqueue);
11308 priv->workqueue = NULL;
11310 iounmap(priv->hw_base);
11311 out_pci_release_regions:
11312 pci_release_regions(pdev);
11313 out_pci_disable_device:
11314 pci_disable_device(pdev);
11315 pci_set_drvdata(pdev, NULL);
11316 out_free_ieee80211:
11317 free_ieee80211(priv->net_dev);
11322 static void ipw_pci_remove(struct pci_dev *pdev)
11324 struct ipw_priv *priv = pci_get_drvdata(pdev);
11325 struct list_head *p, *q;
11333 priv->status |= STATUS_EXIT_PENDING;
11335 sysfs_remove_group(&pdev->dev.kobj, &ipw_attribute_group);
11339 unregister_netdev(priv->net_dev);
11342 ipw_rx_queue_free(priv, priv->rxq);
11345 ipw_tx_queue_free(priv);
11347 if (priv->cmdlog) {
11348 kfree(priv->cmdlog);
11349 priv->cmdlog = NULL;
11351 /* ipw_down will ensure that there is no more pending work
11352 * in the workqueue's, so we can safely remove them now. */
11353 cancel_delayed_work(&priv->adhoc_check);
11354 cancel_delayed_work(&priv->gather_stats);
11355 cancel_delayed_work(&priv->request_scan);
11356 cancel_delayed_work(&priv->rf_kill);
11357 cancel_delayed_work(&priv->scan_check);
11358 destroy_workqueue(priv->workqueue);
11359 priv->workqueue = NULL;
11361 /* Free MAC hash list for ADHOC */
11362 for (i = 0; i < IPW_IBSS_MAC_HASH_SIZE; i++) {
11363 list_for_each_safe(p, q, &priv->ibss_mac_hash[i]) {
11364 kfree(list_entry(p, struct ipw_ibss_seq, list));
11370 ipw_free_error_log(priv->error);
11371 priv->error = NULL;
11374 free_irq(pdev->irq, priv);
11375 iounmap(priv->hw_base);
11376 pci_release_regions(pdev);
11377 pci_disable_device(pdev);
11378 pci_set_drvdata(pdev, NULL);
11379 free_ieee80211(priv->net_dev);
11384 static int ipw_pci_suspend(struct pci_dev *pdev, pm_message_t state)
11386 struct ipw_priv *priv = pci_get_drvdata(pdev);
11387 struct net_device *dev = priv->net_dev;
11389 printk(KERN_INFO "%s: Going into suspend...\n", dev->name);
11391 /* Take down the device; powers it off, etc. */
11394 /* Remove the PRESENT state of the device */
11395 netif_device_detach(dev);
11397 pci_save_state(pdev);
11398 pci_disable_device(pdev);
11399 pci_set_power_state(pdev, pci_choose_state(pdev, state));
11404 static int ipw_pci_resume(struct pci_dev *pdev)
11406 struct ipw_priv *priv = pci_get_drvdata(pdev);
11407 struct net_device *dev = priv->net_dev;
11410 printk(KERN_INFO "%s: Coming out of suspend...\n", dev->name);
11412 pci_set_power_state(pdev, PCI_D0);
11413 pci_enable_device(pdev);
11414 pci_restore_state(pdev);
11417 * Suspend/Resume resets the PCI configuration space, so we have to
11418 * re-disable the RETRY_TIMEOUT register (0x41) to keep PCI Tx retries
11419 * from interfering with C3 CPU state. pci_restore_state won't help
11420 * here since it only restores the first 64 bytes pci config header.
11422 pci_read_config_dword(pdev, 0x40, &val);
11423 if ((val & 0x0000ff00) != 0)
11424 pci_write_config_dword(pdev, 0x40, val & 0xffff00ff);
11426 /* Set the device back into the PRESENT state; this will also wake
11427 * the queue of needed */
11428 netif_device_attach(dev);
11430 /* Bring the device back up */
11431 queue_work(priv->workqueue, &priv->up);
11437 /* driver initialization stuff */
11438 static struct pci_driver ipw_driver = {
11440 .id_table = card_ids,
11441 .probe = ipw_pci_probe,
11442 .remove = __devexit_p(ipw_pci_remove),
11444 .suspend = ipw_pci_suspend,
11445 .resume = ipw_pci_resume,
11449 static int __init ipw_init(void)
11453 printk(KERN_INFO DRV_NAME ": " DRV_DESCRIPTION ", " DRV_VERSION "\n");
11454 printk(KERN_INFO DRV_NAME ": " DRV_COPYRIGHT "\n");
11456 ret = pci_module_init(&ipw_driver);
11458 IPW_ERROR("Unable to initialize PCI module\n");
11462 ret = driver_create_file(&ipw_driver.driver, &driver_attr_debug_level);
11464 IPW_ERROR("Unable to create driver sysfs file\n");
11465 pci_unregister_driver(&ipw_driver);
11472 static void __exit ipw_exit(void)
11474 driver_remove_file(&ipw_driver.driver, &driver_attr_debug_level);
11475 pci_unregister_driver(&ipw_driver);
11478 module_param(disable, int, 0444);
11479 MODULE_PARM_DESC(disable, "manually disable the radio (default 0 [radio on])");
11481 module_param(associate, int, 0444);
11482 MODULE_PARM_DESC(associate, "auto associate when scanning (default on)");
11484 module_param(auto_create, int, 0444);
11485 MODULE_PARM_DESC(auto_create, "auto create adhoc network (default on)");
11487 module_param(led, int, 0444);
11488 MODULE_PARM_DESC(led, "enable led control on some systems (default 0 off)\n");
11490 module_param(debug, int, 0444);
11491 MODULE_PARM_DESC(debug, "debug output mask");
11493 module_param(channel, int, 0444);
11494 MODULE_PARM_DESC(channel, "channel to limit associate to (default 0 [ANY])");
11496 #ifdef CONFIG_IPW_QOS
11497 module_param(qos_enable, int, 0444);
11498 MODULE_PARM_DESC(qos_enable, "enable all QoS functionalitis");
11500 module_param(qos_burst_enable, int, 0444);
11501 MODULE_PARM_DESC(qos_burst_enable, "enable QoS burst mode");
11503 module_param(qos_no_ack_mask, int, 0444);
11504 MODULE_PARM_DESC(qos_no_ack_mask, "mask Tx_Queue to no ack");
11506 module_param(burst_duration_CCK, int, 0444);
11507 MODULE_PARM_DESC(burst_duration_CCK, "set CCK burst value");
11509 module_param(burst_duration_OFDM, int, 0444);
11510 MODULE_PARM_DESC(burst_duration_OFDM, "set OFDM burst value");
11511 #endif /* CONFIG_IPW_QOS */
11513 #ifdef CONFIG_IPW2200_MONITOR
11514 module_param(mode, int, 0444);
11515 MODULE_PARM_DESC(mode, "network mode (0=BSS,1=IBSS,2=Monitor)");
11517 module_param(mode, int, 0444);
11518 MODULE_PARM_DESC(mode, "network mode (0=BSS,1=IBSS)");
11521 module_param(hwcrypto, int, 0444);
11522 MODULE_PARM_DESC(hwcrypto, "enable hardware crypto (default on)");
11524 module_param(cmdlog, int, 0444);
11525 MODULE_PARM_DESC(cmdlog,
11526 "allocate a ring buffer for logging firmware commands");
11528 module_exit(ipw_exit);
11529 module_init(ipw_init);