Lines Matching +full:pci +full:- +full:host +full:- +full:cam +full:- +full:generic

1 // SPDX-License-Identifier: GPL-2.0-only
4 Copyright(c) 2003 - 2006 Intel Corporation. All rights reserved.
6 802.11 status code portion of this file from ethereal-0.10.6:
8 Ethereal - Network traffic analyzer
15 Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
21 #include <net/cfg80211-wext.h>
64 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
73 MODULE_FIRMWARE("ipw2200-ibss.fw");
75 MODULE_FIRMWARE("ipw2200-sniffer.fw");
77 MODULE_FIRMWARE("ipw2200-bss.fw");
98 static int rtap_iface = 0; /* def: 0 -- do not create rtap interface */
229 out += scnprintf(buf + out, count - out, " "); in snprint_line()
231 out += scnprintf(buf + out, count - out, "%02X ", in snprint_line()
234 out += scnprintf(buf + out, count - out, " "); in snprint_line()
237 out += scnprintf(buf + out, count - out, " "); in snprint_line()
239 out += scnprintf(buf + out, count - out, " "); in snprint_line()
245 out += scnprintf(buf + out, count - out, "%c", c); in snprint_line()
249 out += scnprintf(buf + out, count - out, " "); in snprint_line()
267 len -= min(len, 16U); in printk_buf()
283 size -= out; in snprintk_buf()
284 len -= min_t(size_t, len, 16U); in snprintk_buf()
290 /* alias for 32-bit indirect read (for SRAM/reg above 4K), with debug wrapper */
294 /* alias for 8-bit indirect read (for SRAM/reg above 4K), with debug wrapper */
298 /* 8-bit indirect write (for SRAM/reg above 4K), with debug wrapper */
307 /* 16-bit indirect write (for SRAM/reg above 4K), with debug wrapper */
316 /* 32-bit indirect write (for SRAM/reg above 4K), with debug wrapper */
325 /* 8-bit direct write (low 4K) */
329 writeb(val, ipw->hw_base + ofs); in _ipw_write8()
332 /* 8-bit direct write (for low 4K of SRAM/regs), with debug wrapper */
339 /* 16-bit direct write (low 4K) */
343 writew(val, ipw->hw_base + ofs); in _ipw_write16()
346 /* 16-bit direct write (for low 4K of SRAM/regs), with debug wrapper */
353 /* 32-bit direct write (low 4K) */
357 writel(val, ipw->hw_base + ofs); in _ipw_write32()
360 /* 32-bit direct write (for low 4K of SRAM/regs), with debug wrapper */
367 /* 8-bit direct read (low 4K) */
370 return readb(ipw->hw_base + ofs); in _ipw_read8()
373 /* alias to 8-bit direct read (low 4K of SRAM/regs), with debug wrapper */
380 /* 16-bit direct read (low 4K) */
383 return readw(ipw->hw_base + ofs); in _ipw_read16()
386 /* alias to 16-bit direct read (low 4K of SRAM/regs), with debug wrapper */
393 /* 32-bit direct read (low 4K) */
396 return readl(ipw->hw_base + ofs); in _ipw_read32()
399 /* alias to 32-bit direct read (low 4K of SRAM/regs), with debug wrapper */
407 /* alias to multi-byte read (SRAM/regs above 4K), with debug wrapper */
414 /* alias to multi-byte read (SRAM/regs above 4K), with debug wrapper */
423 /* 32-bit indirect write (above 4K) */
431 /* 8-bit indirect write (above 4K) */
435 u32 dif_len = reg - aligned_addr; in _ipw_write_reg8()
442 /* 16-bit indirect write (above 4K) */
446 u32 dif_len = (reg - aligned_addr) & (~0x1ul); in _ipw_write_reg16()
453 /* 8-bit indirect read (above 4K) */
463 /* 32-bit indirect read (above 4K) */
476 /* General purpose, no alignment requirement, iterative (multi-byte) read, */
482 u32 dif_len = addr - aligned_addr; in _ipw_read_indirect()
495 for (i = dif_len; ((i < 4) && (num > 0)); i++, num--) in _ipw_read_indirect()
500 /* Read all of the middle dwords as dwords, with auto-increment */ in _ipw_read_indirect()
502 for (; num >= 4; buf += 4, aligned_addr += 4, num -= 4) in _ipw_read_indirect()
508 for (i = 0; num > 0; i++, num--) in _ipw_read_indirect()
513 /* General purpose, no alignment requirement, iterative (multi-byte) write, */
519 u32 dif_len = addr - aligned_addr; in _ipw_write_indirect()
532 for (i = dif_len; ((i < 4) && (num > 0)); i++, num--, buf++) in _ipw_write_indirect()
537 /* Write all of the middle dwords as dwords, with auto-increment */ in _ipw_write_indirect()
539 for (; num >= 4; buf += 4, aligned_addr += 4, num -= 4) in _ipw_write_indirect()
545 for (i = 0; num > 0; i++, num--, buf++) in _ipw_write_indirect()
550 /* General purpose, no alignment requirement, iterative (multi-byte) write, */
555 memcpy_toio((priv->hw_base + addr), buf, num); in ipw_write_direct()
572 if (priv->status & STATUS_INT_ENABLED) in __ipw_enable_interrupts()
574 priv->status |= STATUS_INT_ENABLED; in __ipw_enable_interrupts()
580 if (!(priv->status & STATUS_INT_ENABLED)) in __ipw_disable_interrupts()
582 priv->status &= ~STATUS_INT_ENABLED; in __ipw_disable_interrupts()
590 spin_lock_irqsave(&priv->irq_lock, flags); in ipw_enable_interrupts()
592 spin_unlock_irqrestore(&priv->irq_lock, flags); in ipw_enable_interrupts()
599 spin_lock_irqsave(&priv->irq_lock, flags); in ipw_disable_interrupts()
601 spin_unlock_irqrestore(&priv->irq_lock, flags); in ipw_disable_interrupts()
655 error->status, error->config); in ipw_dump_error_log()
657 for (i = 0; i < error->elem_len; i++) in ipw_dump_error_log()
659 ipw_error_desc(error->elem[i].desc), in ipw_dump_error_log()
660 error->elem[i].time, in ipw_dump_error_log()
661 error->elem[i].blink1, in ipw_dump_error_log()
662 error->elem[i].blink2, in ipw_dump_error_log()
663 error->elem[i].link1, in ipw_dump_error_log()
664 error->elem[i].link2, error->elem[i].data); in ipw_dump_error_log()
665 for (i = 0; i < error->log_len; i++) in ipw_dump_error_log()
667 error->log[i].time, in ipw_dump_error_log()
668 error->log[i].data, error->log[i].event); in ipw_dump_error_log()
673 return (priv->status & STATUS_INIT) ? 1 : 0; in ipw_is_init()
684 return -EINVAL; in ipw_get_ordinal()
688 if (!priv->table0_addr || !priv->table1_addr || !priv->table2_addr) { in ipw_get_ordinal()
690 return -EINVAL; in ipw_get_ordinal()
706 if (ord > priv->table0_len) { in ipw_get_ordinal()
708 "max (%i)\n", ord, priv->table0_len); in ipw_get_ordinal()
709 return -EINVAL; in ipw_get_ordinal()
716 return -EINVAL; in ipw_get_ordinal()
720 ord, priv->table0_addr + (ord << 2)); in ipw_get_ordinal()
724 *((u32 *) val) = ipw_read32(priv, priv->table0_addr + ord); in ipw_get_ordinal()
740 if (ord > priv->table1_len) { in ipw_get_ordinal()
742 return -EINVAL; in ipw_get_ordinal()
749 return -EINVAL; in ipw_get_ordinal()
753 ipw_read_reg32(priv, (priv->table1_addr + (ord << 2))); in ipw_get_ordinal()
762 * - dword containing the starting offset of the data in ipw_get_ordinal()
763 * - dword containing the lengh in the first 16bits in ipw_get_ordinal()
771 if (ord > priv->table2_len) { in ipw_get_ordinal()
773 return -EINVAL; in ipw_get_ordinal()
777 addr = ipw_read_reg32(priv, priv->table2_addr + (ord << 3)); in ipw_get_ordinal()
780 * two 16-bit words - first is length, second is count */ in ipw_get_ordinal()
783 priv->table2_addr + (ord << 3) + in ipw_get_ordinal()
796 return -EINVAL; in ipw_get_ordinal()
811 return -EINVAL; in ipw_get_ordinal()
820 priv->table0_addr = IPW_ORDINALS_TABLE_LOWER; in ipw_init_ordinals()
821 priv->table0_len = ipw_read32(priv, priv->table0_addr); in ipw_init_ordinals()
824 priv->table0_addr, priv->table0_len); in ipw_init_ordinals()
826 priv->table1_addr = ipw_read32(priv, IPW_ORDINALS_TABLE_1); in ipw_init_ordinals()
827 priv->table1_len = ipw_read_reg32(priv, priv->table1_addr); in ipw_init_ordinals()
830 priv->table1_addr, priv->table1_len); in ipw_init_ordinals()
832 priv->table2_addr = ipw_read32(priv, IPW_ORDINALS_TABLE_2); in ipw_init_ordinals()
833 priv->table2_len = ipw_read_reg32(priv, priv->table2_addr); in ipw_init_ordinals()
834 priv->table2_len &= 0x0000ffff; /* use first two bytes */ in ipw_init_ordinals()
837 priv->table2_addr, priv->table2_len); in ipw_init_ordinals()
855 * - On radio ON, turn on any LEDs that require to be on during start
856 * - On initialization, start unassociated blink
857 * - On association, disable unassociated blink
858 * - On disassociation, start unassociated blink
859 * - On radio OFF, turn off any LEDs started during radio on
873 if (priv->config & CFG_NO_LED || priv->nic_type == EEPROM_NIC_TYPE_1) in ipw_led_link_on()
876 spin_lock_irqsave(&priv->lock, flags); in ipw_led_link_on()
878 if (!(priv->status & STATUS_RF_KILL_MASK) && in ipw_led_link_on()
879 !(priv->status & STATUS_LED_LINK_ON)) { in ipw_led_link_on()
882 led |= priv->led_association_on; in ipw_led_link_on()
889 priv->status |= STATUS_LED_LINK_ON; in ipw_led_link_on()
892 if (!(priv->status & STATUS_ASSOCIATED)) in ipw_led_link_on()
893 schedule_delayed_work(&priv->led_link_off, in ipw_led_link_on()
897 spin_unlock_irqrestore(&priv->lock, flags); in ipw_led_link_on()
904 mutex_lock(&priv->mutex); in ipw_bg_led_link_on()
906 mutex_unlock(&priv->mutex); in ipw_bg_led_link_on()
916 if (priv->config & CFG_NO_LED || priv->nic_type == EEPROM_NIC_TYPE_1) in ipw_led_link_off()
919 spin_lock_irqsave(&priv->lock, flags); in ipw_led_link_off()
921 if (priv->status & STATUS_LED_LINK_ON) { in ipw_led_link_off()
923 led &= priv->led_association_off; in ipw_led_link_off()
931 priv->status &= ~STATUS_LED_LINK_ON; in ipw_led_link_off()
935 if (!(priv->status & STATUS_RF_KILL_MASK) && in ipw_led_link_off()
936 !(priv->status & STATUS_ASSOCIATED)) in ipw_led_link_off()
937 schedule_delayed_work(&priv->led_link_on, in ipw_led_link_off()
942 spin_unlock_irqrestore(&priv->lock, flags); in ipw_led_link_off()
949 mutex_lock(&priv->mutex); in ipw_bg_led_link_off()
951 mutex_unlock(&priv->mutex); in ipw_bg_led_link_off()
958 if (priv->config & CFG_NO_LED) in __ipw_led_activity_on()
961 if (priv->status & STATUS_RF_KILL_MASK) in __ipw_led_activity_on()
964 if (!(priv->status & STATUS_LED_ACT_ON)) { in __ipw_led_activity_on()
966 led |= priv->led_activity_on; in __ipw_led_activity_on()
975 priv->status |= STATUS_LED_ACT_ON; in __ipw_led_activity_on()
977 cancel_delayed_work(&priv->led_act_off); in __ipw_led_activity_on()
978 schedule_delayed_work(&priv->led_act_off, LD_TIME_ACT_ON); in __ipw_led_activity_on()
981 cancel_delayed_work(&priv->led_act_off); in __ipw_led_activity_on()
982 schedule_delayed_work(&priv->led_act_off, LD_TIME_ACT_ON); in __ipw_led_activity_on()
990 spin_lock_irqsave(&priv->lock, flags);
992 spin_unlock_irqrestore(&priv->lock, flags);
1001 if (priv->config & CFG_NO_LED) in ipw_led_activity_off()
1004 spin_lock_irqsave(&priv->lock, flags); in ipw_led_activity_off()
1006 if (priv->status & STATUS_LED_ACT_ON) { in ipw_led_activity_off()
1008 led &= priv->led_activity_off; in ipw_led_activity_off()
1017 priv->status &= ~STATUS_LED_ACT_ON; in ipw_led_activity_off()
1020 spin_unlock_irqrestore(&priv->lock, flags); in ipw_led_activity_off()
1027 mutex_lock(&priv->mutex); in ipw_bg_led_activity_off()
1029 mutex_unlock(&priv->mutex); in ipw_bg_led_activity_off()
1038 if (priv->config & CFG_NO_LED || in ipw_led_band_on()
1039 priv->nic_type != EEPROM_NIC_TYPE_1 || !priv->assoc_network) in ipw_led_band_on()
1042 spin_lock_irqsave(&priv->lock, flags); in ipw_led_band_on()
1045 if (priv->assoc_network->mode == IEEE_A) { in ipw_led_band_on()
1046 led |= priv->led_ofdm_on; in ipw_led_band_on()
1047 led &= priv->led_association_off; in ipw_led_band_on()
1049 } else if (priv->assoc_network->mode == IEEE_G) { in ipw_led_band_on()
1050 led |= priv->led_ofdm_on; in ipw_led_band_on()
1051 led |= priv->led_association_on; in ipw_led_band_on()
1054 led &= priv->led_ofdm_off; in ipw_led_band_on()
1055 led |= priv->led_association_on; in ipw_led_band_on()
1064 spin_unlock_irqrestore(&priv->lock, flags); in ipw_led_band_on()
1073 if (priv->config & CFG_NO_LED || priv->nic_type != EEPROM_NIC_TYPE_1) in ipw_led_band_off()
1076 spin_lock_irqsave(&priv->lock, flags); in ipw_led_band_off()
1079 led &= priv->led_ofdm_off; in ipw_led_band_off()
1080 led &= priv->led_association_off; in ipw_led_band_off()
1087 spin_unlock_irqrestore(&priv->lock, flags); in ipw_led_band_off()
1112 if (priv->status & STATUS_RF_KILL_MASK) in ipw_led_link_down()
1118 priv->nic_type = priv->eeprom[EEPROM_NIC_TYPE]; in ipw_led_init()
1121 priv->led_activity_on = IPW_ACTIVITY_LED; in ipw_led_init()
1122 priv->led_activity_off = ~(IPW_ACTIVITY_LED); in ipw_led_init()
1124 priv->led_association_on = IPW_ASSOCIATED_LED; in ipw_led_init()
1125 priv->led_association_off = ~(IPW_ASSOCIATED_LED); in ipw_led_init()
1128 priv->led_ofdm_on = IPW_OFDM_LED; in ipw_led_init()
1129 priv->led_ofdm_off = ~(IPW_OFDM_LED); in ipw_led_init()
1131 switch (priv->nic_type) { in ipw_led_init()
1134 priv->led_activity_on = IPW_ASSOCIATED_LED; in ipw_led_init()
1135 priv->led_activity_off = ~(IPW_ASSOCIATED_LED); in ipw_led_init()
1136 priv->led_association_on = IPW_ACTIVITY_LED; in ipw_led_init()
1137 priv->led_association_off = ~(IPW_ACTIVITY_LED); in ipw_led_init()
1139 if (!(priv->config & CFG_NO_LED)) in ipw_led_init()
1154 priv->nic_type); in ipw_led_init()
1155 priv->nic_type = EEPROM_NIC_TYPE_0; in ipw_led_init()
1159 if (!(priv->config & CFG_NO_LED)) { in ipw_led_init()
1160 if (priv->status & STATUS_ASSOCIATED) in ipw_led_init()
1172 cancel_delayed_work(&priv->led_link_on); in ipw_led_shutdown()
1173 cancel_delayed_work(&priv->led_link_off); in ipw_led_shutdown()
1174 cancel_delayed_work(&priv->led_act_off); in ipw_led_shutdown()
1179 * of this device driver (i.e. a new file in /sys/bus/pci/drivers/ipw/)
1238 sizeof(*error->elem) * elem_len + in ipw_alloc_error_log()
1239 sizeof(*error->log) * log_len, GFP_ATOMIC); in ipw_alloc_error_log()
1245 error->jiffies = jiffies; in ipw_alloc_error_log()
1246 error->status = priv->status; in ipw_alloc_error_log()
1247 error->config = priv->config; in ipw_alloc_error_log()
1248 error->elem_len = elem_len; in ipw_alloc_error_log()
1249 error->log_len = log_len; in ipw_alloc_error_log()
1250 error->elem = (struct ipw_error_elem *)error->payload; in ipw_alloc_error_log()
1251 error->log = (struct ipw_event *)(error->elem + elem_len); in ipw_alloc_error_log()
1253 ipw_capture_event_log(priv, log_len, error->log); in ipw_alloc_error_log()
1256 ipw_read_indirect(priv, base + sizeof(base), (u8 *) error->elem, in ipw_alloc_error_log()
1257 sizeof(*error->elem) * elem_len); in ipw_alloc_error_log()
1282 len += scnprintf(buf + len, PAGE_SIZE - len, "%08X", log_len); in show_event_log()
1284 len += scnprintf(buf + len, PAGE_SIZE - len, in show_event_log()
1287 len += scnprintf(buf + len, PAGE_SIZE - len, "\n"); in show_event_log()
1299 if (!priv->error) in show_error()
1301 len += scnprintf(buf + len, PAGE_SIZE - len, in show_error()
1303 priv->error->jiffies, in show_error()
1304 priv->error->status, in show_error()
1305 priv->error->config, priv->error->elem_len); in show_error()
1306 for (i = 0; i < priv->error->elem_len; i++) in show_error()
1307 len += scnprintf(buf + len, PAGE_SIZE - len, in show_error()
1309 priv->error->elem[i].time, in show_error()
1310 priv->error->elem[i].desc, in show_error()
1311 priv->error->elem[i].blink1, in show_error()
1312 priv->error->elem[i].blink2, in show_error()
1313 priv->error->elem[i].link1, in show_error()
1314 priv->error->elem[i].link2, in show_error()
1315 priv->error->elem[i].data); in show_error()
1317 len += scnprintf(buf + len, PAGE_SIZE - len, in show_error()
1318 "\n%08X", priv->error->log_len); in show_error()
1319 for (i = 0; i < priv->error->log_len; i++) in show_error()
1320 len += scnprintf(buf + len, PAGE_SIZE - len, in show_error()
1322 priv->error->log[i].time, in show_error()
1323 priv->error->log[i].event, in show_error()
1324 priv->error->log[i].data); in show_error()
1325 len += scnprintf(buf + len, PAGE_SIZE - len, "\n"); in show_error()
1335 kfree(priv->error); in clear_error()
1336 priv->error = NULL; in clear_error()
1347 if (!priv->cmdlog) in show_cmd_log()
1349 for (i = (priv->cmdlog_pos + 1) % priv->cmdlog_len; in show_cmd_log()
1350 (i != priv->cmdlog_pos) && (len < PAGE_SIZE); in show_cmd_log()
1351 i = (i + 1) % priv->cmdlog_len) { in show_cmd_log()
1353 scnprintf(buf + len, PAGE_SIZE - len, in show_cmd_log()
1354 "\n%08lX%08X%08X%08X\n", priv->cmdlog[i].jiffies, in show_cmd_log()
1355 priv->cmdlog[i].retcode, priv->cmdlog[i].cmd.cmd, in show_cmd_log()
1356 priv->cmdlog[i].cmd.len); in show_cmd_log()
1358 snprintk_buf(buf + len, PAGE_SIZE - len, in show_cmd_log()
1359 (u8 *) priv->cmdlog[i].cmd.param, in show_cmd_log()
1360 priv->cmdlog[i].cmd.len); in show_cmd_log()
1361 len += scnprintf(buf + len, PAGE_SIZE - len, "\n"); in show_cmd_log()
1363 len += scnprintf(buf + len, PAGE_SIZE - len, "\n"); in show_cmd_log()
1380 return -EINVAL; in store_rtap_iface()
1387 if (netif_running(priv->prom_net_dev)) { in store_rtap_iface()
1406 return -EINVAL; in store_rtap_iface()
1423 return sprintf(buf, "%s", priv->prom_net_dev->name); in show_rtap_iface()
1425 buf[0] = '-'; in show_rtap_iface()
1440 if (!priv->prom_priv) { in store_rtap_filter()
1443 return -EPERM; in store_rtap_filter()
1446 priv->prom_priv->filter = simple_strtol(buf, NULL, 0); in store_rtap_filter()
1449 BIT_ARG16(priv->prom_priv->filter)); in store_rtap_filter()
1460 priv->prom_priv ? priv->prom_priv->filter : 0); in show_rtap_filter()
1470 return sprintf(buf, "%d\n", priv->ieee->scan_age); in show_scan_age()
1477 struct net_device *dev = priv->net_dev; in store_scan_age()
1480 (sizeof(buffer) - 1) > count ? count : sizeof(buffer) - 1; in store_scan_age()
1497 IPW_DEBUG_INFO("%s: user supplied invalid value.\n", dev->name); in store_scan_age()
1499 priv->ieee->scan_age = val; in store_scan_age()
1500 IPW_DEBUG_INFO("set scan_age = %u\n", priv->ieee->scan_age); in store_scan_age()
1513 return sprintf(buf, "%d\n", (priv->config & CFG_NO_LED) ? 0 : 1); in show_led()
1528 priv->config |= CFG_NO_LED; in store_led()
1532 priv->config &= ~CFG_NO_LED; in store_led()
1546 return sprintf(buf, "0x%08x\n", (int)p->status); in show_status()
1555 return sprintf(buf, "0x%08x\n", (int)p->config); in show_cfg()
1564 return sprintf(buf, "TYPE: %d\n", priv->nic_type); in show_nic_type()
1605 int n = p->eeprom_delay; in show_eeprom_delay()
1613 sscanf(buf, "%i", &p->eeprom_delay); in store_eeprom_delay()
1672 if (priv->status & STATUS_INDIRECT_DWORD) in show_indirect_dword()
1673 reg = ipw_read_reg32(priv, priv->indirect_dword); in show_indirect_dword()
1685 sscanf(buf, "%x", &priv->indirect_dword); in store_indirect_dword()
1686 priv->status |= STATUS_INDIRECT_DWORD; in store_indirect_dword()
1699 if (priv->status & STATUS_INDIRECT_BYTE) in show_indirect_byte()
1700 reg = ipw_read_reg8(priv, priv->indirect_byte); in show_indirect_byte()
1712 sscanf(buf, "%x", &priv->indirect_byte); in store_indirect_byte()
1713 priv->status |= STATUS_INDIRECT_BYTE; in store_indirect_byte()
1726 if (priv->status & STATUS_DIRECT_DWORD) in show_direct_dword()
1727 reg = ipw_read32(priv, priv->direct_dword); in show_direct_dword()
1739 sscanf(buf, "%x", &priv->direct_dword); in store_direct_dword()
1740 priv->status |= STATUS_DIRECT_DWORD; in store_direct_dword()
1749 priv->status |= STATUS_RF_KILL_HW; in rf_kill_active()
1750 wiphy_rfkill_set_hw_state(priv->ieee->wdev.wiphy, true); in rf_kill_active()
1752 priv->status &= ~STATUS_RF_KILL_HW; in rf_kill_active()
1753 wiphy_rfkill_set_hw_state(priv->ieee->wdev.wiphy, false); in rf_kill_active()
1756 return (priv->status & STATUS_RF_KILL_HW) ? 1 : 0; in rf_kill_active()
1762 /* 0 - RF kill not enabled in show_rf_kill()
1763 1 - SW based RF kill active (sysfs) in show_rf_kill()
1764 2 - HW based RF kill active in show_rf_kill()
1765 3 - Both HW and SW baed RF kill active */ in show_rf_kill()
1767 int val = ((priv->status & STATUS_RF_KILL_SW) ? 0x1 : 0x0) | in show_rf_kill()
1775 ((priv->status & STATUS_RF_KILL_SW) ? 1 : 0)) in ipw_radio_kill_sw()
1782 priv->status |= STATUS_RF_KILL_SW; in ipw_radio_kill_sw()
1784 cancel_delayed_work(&priv->request_scan); in ipw_radio_kill_sw()
1785 cancel_delayed_work(&priv->request_direct_scan); in ipw_radio_kill_sw()
1786 cancel_delayed_work(&priv->request_passive_scan); in ipw_radio_kill_sw()
1787 cancel_delayed_work(&priv->scan_event); in ipw_radio_kill_sw()
1788 schedule_work(&priv->down); in ipw_radio_kill_sw()
1790 priv->status &= ~STATUS_RF_KILL_SW; in ipw_radio_kill_sw()
1792 IPW_DEBUG_RF_KILL("Can not turn radio back on - " in ipw_radio_kill_sw()
1795 cancel_delayed_work(&priv->rf_kill); in ipw_radio_kill_sw()
1796 schedule_delayed_work(&priv->rf_kill, in ipw_radio_kill_sw()
1799 schedule_work(&priv->up); in ipw_radio_kill_sw()
1822 if (priv->config & CFG_SPEED_SCAN) { in show_speed_scan()
1823 while (priv->speed_scan[pos] != 0) in show_speed_scan()
1825 priv->speed_scan[pos++]); in show_speed_scan()
1841 if (pos == MAX_SPEED_SCAN - 1) { in store_speed_scan()
1842 priv->speed_scan[pos] = 0; in store_speed_scan()
1846 if (libipw_is_valid_channel(priv->ieee, channel)) in store_speed_scan()
1847 priv->speed_scan[pos++] = channel; in store_speed_scan()
1859 priv->config &= ~CFG_SPEED_SCAN; in store_speed_scan()
1861 priv->speed_scan_pos = 0; in store_speed_scan()
1862 priv->config |= CFG_SPEED_SCAN; in store_speed_scan()
1874 return sprintf(buf, "%c\n", (priv->config & CFG_NET_STATS) ? '1' : '0'); in show_net_stats()
1882 priv->config |= CFG_NET_STATS; in store_net_stats()
1884 priv->config &= ~CFG_NET_STATS; in store_net_stats()
1896 const struct libipw_geo *geo = libipw_get_geo(priv->ieee); in show_channels()
1901 "(802.11bg):\n", geo->bg_channels); in show_channels()
1903 for (i = 0; i < geo->bg_channels; i++) { in show_channels()
1905 geo->bg[i].channel, in show_channels()
1906 geo->bg[i].flags & LIBIPW_CH_RADAR_DETECT ? in show_channels()
1908 ((geo->bg[i].flags & LIBIPW_CH_NO_IBSS) || in show_channels()
1909 (geo->bg[i].flags & LIBIPW_CH_RADAR_DETECT)) in show_channels()
1911 geo->bg[i].flags & LIBIPW_CH_PASSIVE_ONLY ? in show_channels()
1913 geo->bg[i].flags & LIBIPW_CH_B_ONLY ? in show_channels()
1919 "(802.11a):\n", geo->a_channels); in show_channels()
1920 for (i = 0; i < geo->a_channels; i++) { in show_channels()
1922 geo->a[i].channel, in show_channels()
1923 geo->a[i].flags & LIBIPW_CH_RADAR_DETECT ? in show_channels()
1925 ((geo->a[i].flags & LIBIPW_CH_NO_IBSS) || in show_channels()
1926 (geo->a[i].flags & LIBIPW_CH_RADAR_DETECT)) in show_channels()
1928 geo->a[i].flags & LIBIPW_CH_PASSIVE_ONLY ? in show_channels()
1941 if (priv->status & STATUS_ASSOCIATED) in notify_wx_assoc_event()
1942 memcpy(wrqu.ap_addr.sa_data, priv->bssid, ETH_ALEN); in notify_wx_assoc_event()
1945 wireless_send_event(priv->net_dev, SIOCGIWAP, &wrqu, NULL); in notify_wx_assoc_event()
1954 spin_lock_irqsave(&priv->irq_lock, flags); in ipw_irq_tasklet()
1968 inta |= priv->isr_inta; in ipw_irq_tasklet()
1970 spin_unlock_irqrestore(&priv->irq_lock, flags); in ipw_irq_tasklet()
1972 spin_lock_irqsave(&priv->lock, flags); in ipw_irq_tasklet()
1982 ipw_queue_tx_reclaim(priv, &priv->txq_cmd, -1); in ipw_irq_tasklet()
1983 priv->status &= ~STATUS_HCMD_ACTIVE; in ipw_irq_tasklet()
1984 wake_up_interruptible(&priv->wait_command_queue); in ipw_irq_tasklet()
1990 ipw_queue_tx_reclaim(priv, &priv->txq[0], 0); in ipw_irq_tasklet()
1996 ipw_queue_tx_reclaim(priv, &priv->txq[1], 1); in ipw_irq_tasklet()
2002 ipw_queue_tx_reclaim(priv, &priv->txq[2], 2); in ipw_irq_tasklet()
2008 ipw_queue_tx_reclaim(priv, &priv->txq[3], 3); in ipw_irq_tasklet()
2039 priv->status |= STATUS_RF_KILL_HW; in ipw_irq_tasklet()
2040 wiphy_rfkill_set_hw_state(priv->ieee->wdev.wiphy, true); in ipw_irq_tasklet()
2041 wake_up_interruptible(&priv->wait_command_queue); in ipw_irq_tasklet()
2042 priv->status &= ~(STATUS_ASSOCIATED | STATUS_ASSOCIATING); in ipw_irq_tasklet()
2043 cancel_delayed_work(&priv->request_scan); in ipw_irq_tasklet()
2044 cancel_delayed_work(&priv->request_direct_scan); in ipw_irq_tasklet()
2045 cancel_delayed_work(&priv->request_passive_scan); in ipw_irq_tasklet()
2046 cancel_delayed_work(&priv->scan_event); in ipw_irq_tasklet()
2047 schedule_work(&priv->link_down); in ipw_irq_tasklet()
2048 schedule_delayed_work(&priv->rf_kill, 2 * HZ); in ipw_irq_tasklet()
2054 if (priv->error) { in ipw_irq_tasklet()
2063 priv->error = ipw_alloc_error_log(priv); in ipw_irq_tasklet()
2064 if (priv->error) in ipw_irq_tasklet()
2070 ipw_dump_error_log(priv, priv->error); in ipw_irq_tasklet()
2075 if (priv->ieee->sec.encrypt) { in ipw_irq_tasklet()
2076 priv->status &= ~STATUS_ASSOCIATED; in ipw_irq_tasklet()
2080 /* Keep the restart process from trying to send host in ipw_irq_tasklet()
2082 priv->status &= ~STATUS_INIT; in ipw_irq_tasklet()
2085 priv->status &= ~STATUS_HCMD_ACTIVE; in ipw_irq_tasklet()
2086 wake_up_interruptible(&priv->wait_command_queue); in ipw_irq_tasklet()
2088 schedule_work(&priv->adapter_restart); in ipw_irq_tasklet()
2101 spin_unlock_irqrestore(&priv->lock, flags); in ipw_irq_tasklet()
2174 spin_lock_irqsave(&priv->lock, flags); in __ipw_send_cmd()
2175 if (priv->status & STATUS_HCMD_ACTIVE) { in __ipw_send_cmd()
2177 get_cmd_string(cmd->cmd)); in __ipw_send_cmd()
2178 spin_unlock_irqrestore(&priv->lock, flags); in __ipw_send_cmd()
2179 return -EAGAIN; in __ipw_send_cmd()
2182 priv->status |= STATUS_HCMD_ACTIVE; in __ipw_send_cmd()
2184 if (priv->cmdlog) { in __ipw_send_cmd()
2185 priv->cmdlog[priv->cmdlog_pos].jiffies = jiffies; in __ipw_send_cmd()
2186 priv->cmdlog[priv->cmdlog_pos].cmd.cmd = cmd->cmd; in __ipw_send_cmd()
2187 priv->cmdlog[priv->cmdlog_pos].cmd.len = cmd->len; in __ipw_send_cmd()
2188 memcpy(priv->cmdlog[priv->cmdlog_pos].cmd.param, cmd->param, in __ipw_send_cmd()
2189 cmd->len); in __ipw_send_cmd()
2190 priv->cmdlog[priv->cmdlog_pos].retcode = -1; in __ipw_send_cmd()
2194 get_cmd_string(cmd->cmd), cmd->cmd, cmd->len, in __ipw_send_cmd()
2195 priv->status); in __ipw_send_cmd()
2198 if (cmd->cmd == IPW_CMD_WEP_KEY) in __ipw_send_cmd()
2202 printk_buf(IPW_DL_HOST_COMMAND, (u8 *) cmd->param, cmd->len); in __ipw_send_cmd()
2204 rc = ipw_queue_tx_hcmd(priv, cmd->cmd, cmd->param, cmd->len, 0); in __ipw_send_cmd()
2206 priv->status &= ~STATUS_HCMD_ACTIVE; in __ipw_send_cmd()
2208 get_cmd_string(cmd->cmd), rc); in __ipw_send_cmd()
2209 spin_unlock_irqrestore(&priv->lock, flags); in __ipw_send_cmd()
2212 spin_unlock_irqrestore(&priv->lock, flags); in __ipw_send_cmd()
2217 rc = wait_event_interruptible_timeout(priv->wait_command_queue, in __ipw_send_cmd()
2218 !(priv-> in __ipw_send_cmd()
2220 end - now); in __ipw_send_cmd()
2229 spin_lock_irqsave(&priv->lock, flags); in __ipw_send_cmd()
2230 if (priv->status & STATUS_HCMD_ACTIVE) { in __ipw_send_cmd()
2232 get_cmd_string(cmd->cmd)); in __ipw_send_cmd()
2233 priv->status &= ~STATUS_HCMD_ACTIVE; in __ipw_send_cmd()
2234 spin_unlock_irqrestore(&priv->lock, flags); in __ipw_send_cmd()
2235 rc = -EIO; in __ipw_send_cmd()
2238 spin_unlock_irqrestore(&priv->lock, flags); in __ipw_send_cmd()
2242 if (priv->status & STATUS_RF_KILL_HW) { in __ipw_send_cmd()
2244 get_cmd_string(cmd->cmd)); in __ipw_send_cmd()
2245 rc = -EIO; in __ipw_send_cmd()
2250 if (priv->cmdlog) { in __ipw_send_cmd()
2251 priv->cmdlog[priv->cmdlog_pos++].retcode = rc; in __ipw_send_cmd()
2252 priv->cmdlog_pos %= priv->cmdlog_len; in __ipw_send_cmd()
2282 return -1; in ipw_send_host_complete()
2291 sizeof(priv->sys_config), in ipw_send_system_config()
2292 &priv->sys_config); in ipw_send_system_config()
2299 return -1; in ipw_send_ssid()
2310 return -1; in ipw_send_adapter_address()
2314 priv->net_dev->name, mac); in ipw_send_adapter_address()
2323 if (priv->status & STATUS_RF_KILL_MASK) in ipw_adapter_restart()
2328 if (priv->assoc_network && in ipw_adapter_restart()
2329 (priv->assoc_network->capability & WLAN_CAPABILITY_IBSS)) in ipw_adapter_restart()
2342 mutex_lock(&priv->mutex); in ipw_bg_adapter_restart()
2344 mutex_unlock(&priv->mutex); in ipw_bg_adapter_restart()
2355 if (priv->status & STATUS_SCAN_ABORTING) { in ipw_scan_check()
2359 schedule_work(&priv->adapter_restart); in ipw_scan_check()
2360 } else if (priv->status & STATUS_SCANNING) { in ipw_scan_check()
2365 schedule_delayed_work(&priv->scan_check, HZ); in ipw_scan_check()
2373 mutex_lock(&priv->mutex); in ipw_bg_scan_check()
2375 mutex_unlock(&priv->mutex); in ipw_bg_scan_check()
2389 return -1; in ipw_send_scan_abort()
2410 return -1; in ipw_send_associate()
2422 return -1; in ipw_send_supported_rates()
2435 return -1; in ipw_set_random_seed()
2448 return -1; in ipw_send_card_disable()
2458 return -1; in ipw_send_tx_power()
2466 const struct libipw_geo *geo = libipw_get_geo(priv->ieee); in ipw_set_tx_power()
2475 tx_power.num_channels = geo->bg_channels; in ipw_set_tx_power()
2476 for (i = 0; i < geo->bg_channels; i++) { in ipw_set_tx_power()
2477 max_power = geo->bg[i].max_power; in ipw_set_tx_power()
2479 geo->bg[i].channel; in ipw_set_tx_power()
2481 min(max_power, priv->tx_power) : priv->tx_power; in ipw_set_tx_power()
2484 return -EIO; in ipw_set_tx_power()
2489 return -EIO; in ipw_set_tx_power()
2492 if (priv->ieee->abg_true) { in ipw_set_tx_power()
2494 tx_power.num_channels = geo->a_channels; in ipw_set_tx_power()
2496 max_power = geo->a[i].max_power; in ipw_set_tx_power()
2498 geo->a[i].channel; in ipw_set_tx_power()
2500 min(max_power, priv->tx_power) : priv->tx_power; in ipw_set_tx_power()
2503 return -EIO; in ipw_set_tx_power()
2516 return -1; in ipw_send_rts_threshold()
2531 return -1; in ipw_send_frag_threshold()
2544 return -1; in ipw_send_power_mode()
2547 /* If on battery, set to 3, if AC set to CAM, else user in ipw_send_power_mode()
2574 return -1; in ipw_send_retry_limit()
2604 udelay(p->eeprom_delay); in eeprom_write_reg()
2641 for (i = 7; i >= 0; i--) { in eeprom_op()
2678 memcpy(mac, &priv->eeprom[EEPROM_MAC_ADDRESS], ETH_ALEN); in eeprom_parse_mac()
2684 __le16 *eeprom = (__le16 *) priv->eeprom; in ipw_read_eeprom()
2696 * Either the device driver (i.e. the host) or the firmware can
2701 * bit needs region of shared SRAM needs to be non-zero.
2714 if (priv->eeprom[EEPROM_VERSION] != 0) { in ipw_eeprom_init_sram()
2719 ipw_write8(priv, IPW_EEPROM_DATA + i, priv->eeprom[i]); in ipw_eeprom_init_sram()
2739 while (count--) in ipw_zero_memory()
2774 priv->sram_desc.last_cb_index = 0; in ipw_fw_dma_abort()
2802 for (index = 0; index < priv->sram_desc.last_cb_index; index++) in ipw_fw_dma_kick()
2804 &priv->sram_desc.cb_list[index]); in ipw_fw_dma_kick()
2862 current_cb_index = (current_cb_address - IPW_SHARED_SRAM_DMA_CONTROL) / in ipw_fw_dma_command_block_index()
2889 if (priv->sram_desc.last_cb_index >= CB_NUMBER_OF_ELEMENTS_SMALL) in ipw_fw_dma_add_command_block()
2890 return -1; in ipw_fw_dma_add_command_block()
2892 last_cb_element = priv->sram_desc.last_cb_index; in ipw_fw_dma_add_command_block()
2893 cb = &priv->sram_desc.cb_list[last_cb_element]; in ipw_fw_dma_add_command_block()
2894 priv->sram_desc.last_cb_index++; in ipw_fw_dma_add_command_block()
2906 cb->status = control ^ src_address ^ dest_address; in ipw_fw_dma_add_command_block()
2909 cb->dest_addr = dest_address; in ipw_fw_dma_add_command_block()
2910 cb->source_addr = src_address; in ipw_fw_dma_add_command_block()
2913 cb->control = control; in ipw_fw_dma_add_command_block()
2929 size = min_t(u32, len - i * CB_MAX_LENGTH, CB_MAX_LENGTH); in ipw_fw_dma_add_buffer()
2936 return -1; in ipw_fw_dma_add_buffer()
2954 (int)priv->sram_desc.last_cb_index); in ipw_fw_dma_wait()
2956 while (current_index < priv->sram_desc.last_cb_index) { in ipw_fw_dma_wait()
2969 return -1; in ipw_fw_dma_wait()
2989 spin_lock_irqsave(&priv->ieee->lock, flags); in ipw_remove_current_network()
2990 list_for_each_safe(element, safe, &priv->ieee->network_list) { in ipw_remove_current_network()
2992 if (ether_addr_equal(network->bssid, priv->bssid)) { in ipw_remove_current_network()
2994 list_add_tail(&network->list, in ipw_remove_current_network()
2995 &priv->ieee->network_free_list); in ipw_remove_current_network()
2998 spin_unlock_irqrestore(&priv->ieee->lock, flags); in ipw_remove_current_network()
3004 * If card is present, pre-defined value should
3015 /* timeout in msec, attempted in 10-msec quanta */
3028 return -ETIME; in ipw_poll_bit()
3041 /* stop master. typical delay - 0 */ in ipw_stop_master()
3044 /* timeout is in msec, polled in 10-msec quanta */ in ipw_stop_master()
3049 return -1; in ipw_stop_master()
3094 memset(&priv->dino_alive, 0, sizeof(priv->dino_alive)); in ipw_load_ucode()
3145 __le32 response_buffer[(sizeof(priv->dino_alive) + 3) / 4]; in ipw_load_ucode()
3151 memcpy(&priv->dino_alive, response_buffer, in ipw_load_ucode()
3152 sizeof(priv->dino_alive)); in ipw_load_ucode()
3153 if (priv->dino_alive.alive_command == 1 in ipw_load_ucode()
3154 && priv->dino_alive.ucode_valid == 1) { in ipw_load_ucode()
3159 priv->dino_alive.software_revision, in ipw_load_ucode()
3160 priv->dino_alive.software_revision, in ipw_load_ucode()
3161 priv->dino_alive.device_identifier, in ipw_load_ucode()
3162 priv->dino_alive.device_identifier, in ipw_load_ucode()
3163 priv->dino_alive.time_stamp[0], in ipw_load_ucode()
3164 priv->dino_alive.time_stamp[1], in ipw_load_ucode()
3165 priv->dino_alive.time_stamp[2], in ipw_load_ucode()
3166 priv->dino_alive.time_stamp[3], in ipw_load_ucode()
3167 priv->dino_alive.time_stamp[4]); in ipw_load_ucode()
3170 rc = -EINVAL; in ipw_load_ucode()
3174 rc = -ETIME; in ipw_load_ucode()
3186 int ret = -1; in ipw_load_firmware()
3200 return -ENOMEM; in ipw_load_firmware()
3206 return -ENOMEM; in ipw_load_firmware()
3208 pool = dma_pool_create("ipw2200", &priv->pci_dev->dev, CB_MAX_LENGTH, 0, in ipw_load_firmware()
3214 return -ENOMEM; in ipw_load_firmware()
3221 BUG_ON(priv->sram_desc.last_cb_index > 0); in ipw_load_firmware()
3231 chunk_len = le32_to_cpu(chunk->length); in ipw_load_firmware()
3234 nr = (chunk_len + CB_MAX_LENGTH - 1) / CB_MAX_LENGTH; in ipw_load_firmware()
3239 ret = -ENOMEM; in ipw_load_firmware()
3242 size = min_t(u32, chunk_len - i * CB_MAX_LENGTH, in ipw_load_firmware()
3252 /* dma to chunk->address, the chunk->length bytes from data + in ipw_load_firmware()
3255 ret = ipw_fw_dma_add_buffer(priv, &phys[total_nr - nr], in ipw_load_firmware()
3256 nr, le32_to_cpu(chunk->address), in ipw_load_firmware()
3336 /* low-level PLL activation */ in ipw_init_nic()
3370 spin_lock_irqsave(&priv->lock, flags); in ipw_reset_nic()
3371 /* Clear the 'host command active' bit... */ in ipw_reset_nic()
3372 priv->status &= ~STATUS_HCMD_ACTIVE; in ipw_reset_nic()
3373 wake_up_interruptible(&priv->wait_command_queue); in ipw_reset_nic()
3374 priv->status &= ~(STATUS_SCANNING | STATUS_SCAN_ABORTING); in ipw_reset_nic()
3375 wake_up_interruptible(&priv->wait_state); in ipw_reset_nic()
3376 spin_unlock_irqrestore(&priv->lock, flags); in ipw_reset_nic()
3398 rc = request_firmware(raw, name, &priv->pci_dev->dev); in ipw_get_fw()
3404 if ((*raw)->size < sizeof(*fw)) { in ipw_get_fw()
3405 IPW_ERROR("%s is too small (%zd)\n", name, (*raw)->size); in ipw_get_fw()
3406 return -EINVAL; in ipw_get_fw()
3409 fw = (void *)(*raw)->data; in ipw_get_fw()
3411 if ((*raw)->size < sizeof(*fw) + le32_to_cpu(fw->boot_size) + in ipw_get_fw()
3412 le32_to_cpu(fw->ucode_size) + le32_to_cpu(fw->fw_size)) { in ipw_get_fw()
3414 name, (*raw)->size); in ipw_get_fw()
3415 return -EINVAL; in ipw_get_fw()
3420 le32_to_cpu(fw->ver) >> 16, in ipw_get_fw()
3421 le32_to_cpu(fw->ver) & 0xff, in ipw_get_fw()
3422 (*raw)->size - sizeof(*fw)); in ipw_get_fw()
3434 spin_lock_irqsave(&rxq->lock, flags); in ipw_rx_queue_reset()
3436 INIT_LIST_HEAD(&rxq->rx_free); in ipw_rx_queue_reset()
3437 INIT_LIST_HEAD(&rxq->rx_used); in ipw_rx_queue_reset()
3443 if (rxq->pool[i].skb != NULL) { in ipw_rx_queue_reset()
3444 dma_unmap_single(&priv->pci_dev->dev, in ipw_rx_queue_reset()
3445 rxq->pool[i].dma_addr, in ipw_rx_queue_reset()
3447 dev_kfree_skb(rxq->pool[i].skb); in ipw_rx_queue_reset()
3448 rxq->pool[i].skb = NULL; in ipw_rx_queue_reset()
3450 list_add_tail(&rxq->pool[i].list, &rxq->rx_used); in ipw_rx_queue_reset()
3455 rxq->read = rxq->write = 0; in ipw_rx_queue_reset()
3456 rxq->free_count = 0; in ipw_rx_queue_reset()
3457 spin_unlock_irqrestore(&rxq->lock, flags); in ipw_rx_queue_reset()
3486 switch (priv->ieee->iw_mode) { in ipw_load()
3488 name = "ipw2200-ibss.fw"; in ipw_load()
3492 name = "ipw2200-sniffer.fw"; in ipw_load()
3496 name = "ipw2200-bss.fw"; in ipw_load()
3501 rc = -EINVAL; in ipw_load()
3515 fw = (void *)raw->data; in ipw_load()
3516 boot_img = &fw->data[0]; in ipw_load()
3517 ucode_img = &fw->data[le32_to_cpu(fw->boot_size)]; in ipw_load()
3518 fw_img = &fw->data[le32_to_cpu(fw->boot_size) + in ipw_load()
3519 le32_to_cpu(fw->ucode_size)]; in ipw_load()
3521 if (!priv->rxq) in ipw_load()
3522 priv->rxq = ipw_rx_queue_alloc(priv); in ipw_load()
3524 ipw_rx_queue_reset(priv, priv->rxq); in ipw_load()
3525 if (!priv->rxq) { in ipw_load()
3527 rc = -ENOMEM; in ipw_load()
3534 priv->status &= ~STATUS_INT_ENABLED; in ipw_load()
3548 IPW_NIC_SRAM_UPPER_BOUND - IPW_NIC_SRAM_LOWER_BOUND); in ipw_load()
3551 rc = ipw_load_firmware(priv, boot_img, le32_to_cpu(fw->boot_size)); in ipw_load()
3573 rc = ipw_load_ucode(priv, ucode_img, le32_to_cpu(fw->ucode_size)); in ipw_load()
3583 rc = ipw_load_firmware(priv, fw_img, le32_to_cpu(fw->fw_size)); in ipw_load()
3611 retries--; in ipw_load()
3615 IPW_ERROR("TODO: Handle parity error -- schedule restart?\n"); in ipw_load()
3616 rc = -EIO; in ipw_load()
3633 priv->eeprom_delay = 1; in ipw_load()
3644 ipw_write32(priv, IPW_RX_READ_INDEX, priv->rxq->read); in ipw_load()
3655 if (priv->rxq) { in ipw_load()
3656 ipw_rx_queue_free(priv, priv->rxq); in ipw_load()
3657 priv->rxq = NULL; in ipw_load()
3697 * ipw_rx_queue_space - Return number of free slots available in queue.
3701 int s = q->read - q->write; in ipw_rx_queue_space()
3705 s -= 2; in ipw_rx_queue_space()
3713 int s = q->last_used - q->first_empty; in ipw_tx_queue_space()
3715 s += q->n_bd; in ipw_tx_queue_space()
3716 s -= 2; /* keep some reserve to not confuse empty and full situations */ in ipw_tx_queue_space()
3744 q->n_bd = count; in ipw_queue_init()
3746 q->low_mark = q->n_bd / 4; in ipw_queue_init()
3747 if (q->low_mark < 4) in ipw_queue_init()
3748 q->low_mark = 4; in ipw_queue_init()
3750 q->high_mark = q->n_bd / 8; in ipw_queue_init()
3751 if (q->high_mark < 2) in ipw_queue_init()
3752 q->high_mark = 2; in ipw_queue_init()
3754 q->first_empty = q->last_used = 0; in ipw_queue_init()
3755 q->reg_r = read; in ipw_queue_init()
3756 q->reg_w = write; in ipw_queue_init()
3758 ipw_write32(priv, base, q->dma_addr); in ipw_queue_init()
3770 struct pci_dev *dev = priv->pci_dev; in ipw_queue_tx_init()
3772 q->txb = kmalloc_array(count, sizeof(q->txb[0]), GFP_KERNEL); in ipw_queue_tx_init()
3773 if (!q->txb) in ipw_queue_tx_init()
3774 return -ENOMEM; in ipw_queue_tx_init()
3776 q->bd = in ipw_queue_tx_init()
3777 dma_alloc_coherent(&dev->dev, sizeof(q->bd[0]) * count, in ipw_queue_tx_init()
3778 &q->q.dma_addr, GFP_KERNEL); in ipw_queue_tx_init()
3779 if (!q->bd) { in ipw_queue_tx_init()
3781 sizeof(q->bd[0]) * count); in ipw_queue_tx_init()
3782 kfree(q->txb); in ipw_queue_tx_init()
3783 q->txb = NULL; in ipw_queue_tx_init()
3784 return -ENOMEM; in ipw_queue_tx_init()
3787 ipw_queue_init(priv, &q->q, count, read, write, base, size); in ipw_queue_tx_init()
3792 * Free one TFD, those at index [txq->q.last_used].
3801 struct tfd_frame *bd = &txq->bd[txq->q.last_used]; in ipw_queue_tx_free_tfd()
3802 struct pci_dev *dev = priv->pci_dev; in ipw_queue_tx_free_tfd()
3806 if (bd->control_flags.message_type == TX_HOST_COMMAND_TYPE) in ipw_queue_tx_free_tfd()
3807 /* nothing to cleanup after for host commands */ in ipw_queue_tx_free_tfd()
3811 if (le32_to_cpu(bd->u.data.num_chunks) > NUM_TFD_CHUNKS) { in ipw_queue_tx_free_tfd()
3813 le32_to_cpu(bd->u.data.num_chunks)); in ipw_queue_tx_free_tfd()
3819 for (i = 0; i < le32_to_cpu(bd->u.data.num_chunks); i++) { in ipw_queue_tx_free_tfd()
3820 dma_unmap_single(&dev->dev, in ipw_queue_tx_free_tfd()
3821 le32_to_cpu(bd->u.data.chunk_ptr[i]), in ipw_queue_tx_free_tfd()
3822 le16_to_cpu(bd->u.data.chunk_len[i]), in ipw_queue_tx_free_tfd()
3824 if (txq->txb[txq->q.last_used]) { in ipw_queue_tx_free_tfd()
3825 libipw_txb_free(txq->txb[txq->q.last_used]); in ipw_queue_tx_free_tfd()
3826 txq->txb[txq->q.last_used] = NULL; in ipw_queue_tx_free_tfd()
3842 struct clx2_queue *q = &txq->q; in ipw_queue_tx_free()
3843 struct pci_dev *dev = priv->pci_dev; in ipw_queue_tx_free()
3845 if (q->n_bd == 0) in ipw_queue_tx_free()
3849 for (; q->first_empty != q->last_used; in ipw_queue_tx_free()
3850 q->last_used = ipw_queue_inc_wrap(q->last_used, q->n_bd)) { in ipw_queue_tx_free()
3855 dma_free_coherent(&dev->dev, sizeof(txq->bd[0]) * q->n_bd, txq->bd, in ipw_queue_tx_free()
3856 q->dma_addr); in ipw_queue_tx_free()
3857 kfree(txq->txb); in ipw_queue_tx_free()
3871 ipw_queue_tx_free(priv, &priv->txq_cmd); in ipw_tx_queue_free()
3874 ipw_queue_tx_free(priv, &priv->txq[0]); in ipw_tx_queue_free()
3875 ipw_queue_tx_free(priv, &priv->txq[1]); in ipw_tx_queue_free()
3876 ipw_queue_tx_free(priv, &priv->txq[2]); in ipw_tx_queue_free()
3877 ipw_queue_tx_free(priv, &priv->txq[3]); in ipw_tx_queue_free()
3883 bssid[0] = priv->mac_addr[0]; in ipw_create_bssid()
3884 bssid[1] = priv->mac_addr[1]; in ipw_create_bssid()
3885 bssid[2] = priv->mac_addr[2]; in ipw_create_bssid()
3888 get_random_bytes(&bssid[3], ETH_ALEN - 3); in ipw_create_bssid()
3899 for (i = 0; i < priv->num_stations; i++) { in ipw_add_station()
3900 if (ether_addr_equal(priv->stations[i], bssid)) { in ipw_add_station()
3902 priv->missed_adhoc_beacons = 0; in ipw_add_station()
3903 if (!(priv->config & CFG_STATIC_CHANNEL)) in ipw_add_station()
3905 priv->config &= ~CFG_ADHOC_PERSIST; in ipw_add_station()
3919 memcpy(priv->stations[i], bssid, ETH_ALEN); in ipw_add_station()
3922 priv->num_stations++; in ipw_add_station()
3931 for (i = 0; i < priv->num_stations; i++) in ipw_find_station()
3932 if (ether_addr_equal(priv->stations[i], bssid)) in ipw_find_station()
3942 if (priv->status & STATUS_ASSOCIATING) { in ipw_send_disassociate()
3944 schedule_work(&priv->disassociate); in ipw_send_disassociate()
3948 if (!(priv->status & STATUS_ASSOCIATED)) { in ipw_send_disassociate()
3955 priv->assoc_request.bssid, in ipw_send_disassociate()
3956 priv->assoc_request.channel); in ipw_send_disassociate()
3958 priv->status &= ~(STATUS_ASSOCIATING | STATUS_ASSOCIATED); in ipw_send_disassociate()
3959 priv->status |= STATUS_DISASSOCIATING; in ipw_send_disassociate()
3962 priv->assoc_request.assoc_type = HC_DISASSOC_QUIET; in ipw_send_disassociate()
3964 priv->assoc_request.assoc_type = HC_DISASSOCIATE; in ipw_send_disassociate()
3966 err = ipw_send_associate(priv, &priv->assoc_request); in ipw_send_disassociate()
3978 if (!(priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING))) in ipw_disassociate()
3981 netif_carrier_off(priv->net_dev); in ipw_disassociate()
3989 mutex_lock(&priv->mutex); in ipw_bg_disassociate()
3991 mutex_unlock(&priv->mutex); in ipw_bg_disassociate()
4000 if (priv->prom_net_dev && netif_running(priv->prom_net_dev)) { in ipw_system_config()
4001 priv->sys_config.accept_all_data_frames = 1; in ipw_system_config()
4002 priv->sys_config.accept_non_directed_frames = 1; in ipw_system_config()
4003 priv->sys_config.accept_all_mgmt_bcpr = 1; in ipw_system_config()
4004 priv->sys_config.accept_all_mgmt_frames = 1; in ipw_system_config()
4053 "DSSS-OFDM operation"},
4081 return ((depth-1)*prev_avg + val)/depth; in exponential_average()
4086 avg->sum -= avg->entries[avg->pos]; in average_add()
4087 avg->sum += val; in average_add()
4088 avg->entries[avg->pos++] = val; in average_add()
4089 if (unlikely(avg->pos == AVG_ENTRIES)) { in average_add()
4090 avg->init = 1; in average_add()
4091 avg->pos = 0; in average_add()
4097 if (!unlikely(avg->init)) { in average_value()
4098 if (avg->pos) in average_value()
4099 return avg->sum / avg->pos; in average_value()
4103 return avg->sum / AVG_ENTRIES; in average_value()
4110 priv->quality = 0; in ipw_reset_stats()
4112 average_init(&priv->average_missed_beacons); in ipw_reset_stats()
4113 priv->exp_avg_rssi = -60; in ipw_reset_stats()
4114 priv->exp_avg_noise = -85 + 0x100; in ipw_reset_stats()
4116 priv->last_rate = 0; in ipw_reset_stats()
4117 priv->last_missed_beacons = 0; in ipw_reset_stats()
4118 priv->last_rx_packets = 0; in ipw_reset_stats()
4119 priv->last_tx_packets = 0; in ipw_reset_stats()
4120 priv->last_tx_failures = 0; in ipw_reset_stats()
4125 &priv->last_rx_err, &len); in ipw_reset_stats()
4127 &priv->last_tx_failures, &len); in ipw_reset_stats()
4130 priv->missed_adhoc_beacons = 0; in ipw_reset_stats()
4131 priv->missed_beacons = 0; in ipw_reset_stats()
4132 priv->tx_packets = 0; in ipw_reset_stats()
4133 priv->rx_packets = 0; in ipw_reset_stats()
4140 u32 mask = priv->rates_mask; in ipw_get_max_rate()
4143 if (priv->assoc_request.ieee_mode == IPW_B_MODE) in ipw_get_max_rate()
4178 if (priv->ieee->mode == IEEE_B) in ipw_get_max_rate()
4189 if (!(priv->status & STATUS_ASSOCIATED)) in ipw_get_current_rate()
4192 if (priv->tx_packets > IPW_REAL_RATE_RX_PACKET_THRESHOLD) { in ipw_get_current_rate()
4245 if (!(priv->status & STATUS_ASSOCIATED)) { in ipw_gather_stats()
4246 priv->quality = 0; in ipw_gather_stats()
4252 &priv->missed_beacons, &len); in ipw_gather_stats()
4253 missed_beacons_delta = priv->missed_beacons - priv->last_missed_beacons; in ipw_gather_stats()
4254 priv->last_missed_beacons = priv->missed_beacons; in ipw_gather_stats()
4255 if (priv->assoc_request.beacon_interval) { in ipw_gather_stats()
4257 (HZ * le16_to_cpu(priv->assoc_request.beacon_interval)) / in ipw_gather_stats()
4262 average_add(&priv->average_missed_beacons, missed_beacons_percent); in ipw_gather_stats()
4265 rx_err_delta = rx_err - priv->last_rx_err; in ipw_gather_stats()
4266 priv->last_rx_err = rx_err; in ipw_gather_stats()
4269 tx_failures_delta = tx_failures - priv->last_tx_failures; in ipw_gather_stats()
4270 priv->last_tx_failures = tx_failures; in ipw_gather_stats()
4272 rx_packets_delta = priv->rx_packets - priv->last_rx_packets; in ipw_gather_stats()
4273 priv->last_rx_packets = priv->rx_packets; in ipw_gather_stats()
4275 tx_packets_delta = priv->tx_packets - priv->last_tx_packets; in ipw_gather_stats()
4276 priv->last_tx_packets = priv->tx_packets; in ipw_gather_stats()
4283 * RSSI: 100% = > -50, 0% = < -80 in ipw_gather_stats()
4290 beacon_quality = 100 - missed_beacons_percent; in ipw_gather_stats()
4294 beacon_quality = (beacon_quality - BEACON_THRESHOLD) * 100 / in ipw_gather_stats()
4295 (100 - BEACON_THRESHOLD); in ipw_gather_stats()
4299 priv->last_rate = ipw_get_current_rate(priv); in ipw_gather_stats()
4301 rate_quality = priv->last_rate * 40 / max_rate + 60; in ipw_gather_stats()
4303 rate_quality, priv->last_rate / 1000000); in ipw_gather_stats()
4306 rx_quality = 100 - (rx_err_delta * 100) / in ipw_gather_stats()
4314 tx_quality = 100 - (tx_failures_delta * 100) / in ipw_gather_stats()
4321 rssi = priv->exp_avg_rssi; in ipw_gather_stats()
4324 (priv->ieee->perfect_rssi - priv->ieee->worst_rssi) * in ipw_gather_stats()
4325 (priv->ieee->perfect_rssi - priv->ieee->worst_rssi) - in ipw_gather_stats()
4326 (priv->ieee->perfect_rssi - rssi) * in ipw_gather_stats()
4327 (15 * (priv->ieee->perfect_rssi - priv->ieee->worst_rssi) + in ipw_gather_stats()
4328 62 * (priv->ieee->perfect_rssi - rssi))) / in ipw_gather_stats()
4329 ((priv->ieee->perfect_rssi - priv->ieee->worst_rssi) * in ipw_gather_stats()
4330 (priv->ieee->perfect_rssi - priv->ieee->worst_rssi)); in ipw_gather_stats()
4359 priv->quality = quality; in ipw_gather_stats()
4361 schedule_delayed_work(&priv->gather_stats, IPW_STATS_INTERVAL); in ipw_gather_stats()
4368 mutex_lock(&priv->mutex); in ipw_bg_gather_stats()
4370 mutex_unlock(&priv->mutex); in ipw_bg_gather_stats()
4374 * 1st missed -> roaming_threshold, just wait, don't do any scan/roam.
4375 * roaming_threshold -> disassociate_threshold, scan and roam for better signal.
4381 priv->notif_missed_beacons = missed_count; in ipw_handle_missed_beacon()
4383 if (missed_count > priv->disassociate_threshold && in ipw_handle_missed_beacon()
4384 priv->status & STATUS_ASSOCIATED) { in ipw_handle_missed_beacon()
4390 "Missed beacon: %d - disassociate\n", missed_count); in ipw_handle_missed_beacon()
4391 priv->status &= ~STATUS_ROAMING; in ipw_handle_missed_beacon()
4392 if (priv->status & STATUS_SCANNING) { in ipw_handle_missed_beacon()
4396 schedule_work(&priv->abort_scan); in ipw_handle_missed_beacon()
4399 schedule_work(&priv->disassociate); in ipw_handle_missed_beacon()
4403 if (priv->status & STATUS_ROAMING) { in ipw_handle_missed_beacon()
4407 "Missed beacon: %d - roam in progress\n", in ipw_handle_missed_beacon()
4413 (missed_count > priv->roaming_threshold && in ipw_handle_missed_beacon()
4414 missed_count <= priv->disassociate_threshold)) { in ipw_handle_missed_beacon()
4420 "Missed beacon: %d - initiate " in ipw_handle_missed_beacon()
4422 if (!(priv->status & STATUS_ROAMING)) { in ipw_handle_missed_beacon()
4423 priv->status |= STATUS_ROAMING; in ipw_handle_missed_beacon()
4424 if (!(priv->status & STATUS_SCANNING)) in ipw_handle_missed_beacon()
4425 schedule_delayed_work(&priv->request_scan, 0); in ipw_handle_missed_beacon()
4430 if (priv->status & STATUS_SCANNING && in ipw_handle_missed_beacon()
4433 * stuck (only if we aren't roaming -- in ipw_handle_missed_beacon()
4438 schedule_work(&priv->abort_scan); in ipw_handle_missed_beacon()
4453 wireless_send_event(priv->net_dev, SIOCGIWSCAN, &wrqu, NULL); in ipw_scan_event()
4458 /* Only userspace-requested scan completion events go out immediately */ in handle_scan_event()
4459 if (!priv->user_requested_scan) { in handle_scan_event()
4460 schedule_delayed_work(&priv->scan_event, in handle_scan_event()
4463 priv->user_requested_scan = 0; in handle_scan_event()
4464 mod_delayed_work(system_wq, &priv->scan_event, 0); in handle_scan_event()
4469 * Handle host notification packet.
4475 u16 size = le16_to_cpu(notif->size); in ipw_rx_notification()
4477 IPW_DEBUG_NOTIF("type = %i (%d bytes)\n", notif->subtype, size); in ipw_rx_notification()
4479 switch (notif->subtype) { in ipw_rx_notification()
4481 struct notif_association *assoc = &notif->u.assoc; in ipw_rx_notification()
4483 switch (assoc->state) { in ipw_rx_notification()
4488 priv->essid_len, priv->essid, in ipw_rx_notification()
4489 priv->bssid); in ipw_rx_notification()
4491 switch (priv->ieee->iw_mode) { in ipw_rx_notification()
4493 memcpy(priv->ieee->bssid, in ipw_rx_notification()
4494 priv->bssid, ETH_ALEN); in ipw_rx_notification()
4498 memcpy(priv->ieee->bssid, in ipw_rx_notification()
4499 priv->bssid, ETH_ALEN); in ipw_rx_notification()
4502 priv->num_stations = 0; in ipw_rx_notification()
4507 &priv->adhoc_check, in ipw_rx_notification()
4508 le16_to_cpu(priv-> in ipw_rx_notification()
4514 priv->status &= ~STATUS_ASSOCIATING; in ipw_rx_notification()
4515 priv->status |= STATUS_ASSOCIATED; in ipw_rx_notification()
4516 schedule_work(&priv->system_config); in ipw_rx_notification()
4520 le16_to_cpu(((struct ieee80211_hdr *)(x))->frame_control)) in ipw_rx_notification()
4521 if ((priv->status & STATUS_AUTH) && in ipw_rx_notification()
4522 (IPW_GET_PACKET_STYPE(&notif->u.raw) in ipw_rx_notification()
4532 .len = size - 1, in ipw_rx_notification()
4538 libipw_rx_mgt(priv-> in ipw_rx_notification()
4543 &notif->u.raw, &stats); in ipw_rx_notification()
4548 schedule_work(&priv->link_up); in ipw_rx_notification()
4554 if (priv-> in ipw_rx_notification()
4558 = &notif->u.auth; in ipw_rx_notification()
4562 "deauthenticated: '%*pE' %pM: (0x%04X) - %s\n", in ipw_rx_notification()
4563 priv->essid_len, in ipw_rx_notification()
4564 priv->essid, in ipw_rx_notification()
4565 priv->bssid, in ipw_rx_notification()
4566 le16_to_cpu(auth->status), in ipw_rx_notification()
4569 (auth->status))); in ipw_rx_notification()
4571 priv->status &= in ipw_rx_notification()
4576 schedule_work(&priv->link_down); in ipw_rx_notification()
4583 priv->essid_len, priv->essid, in ipw_rx_notification()
4584 priv->bssid); in ipw_rx_notification()
4589 if (priv->status & STATUS_AUTH) { in ipw_rx_notification()
4596 *)&notif->u.raw; in ipw_rx_notification()
4601 le16_to_cpu(resp->status), in ipw_rx_notification()
4604 (resp->status))); in ipw_rx_notification()
4610 priv->essid_len, priv->essid, in ipw_rx_notification()
4611 priv->bssid); in ipw_rx_notification()
4613 priv->status &= in ipw_rx_notification()
4617 if (priv->assoc_network in ipw_rx_notification()
4618 && (priv->assoc_network-> in ipw_rx_notification()
4624 schedule_work(&priv->link_down); in ipw_rx_notification()
4634 assoc->state); in ipw_rx_notification()
4642 struct notif_authenticate *auth = &notif->u.auth; in ipw_rx_notification()
4643 switch (auth->state) { in ipw_rx_notification()
4647 priv->essid_len, priv->essid, in ipw_rx_notification()
4648 priv->bssid); in ipw_rx_notification()
4649 priv->status |= STATUS_AUTH; in ipw_rx_notification()
4653 if (priv->status & STATUS_AUTH) { in ipw_rx_notification()
4657 le16_to_cpu(auth->status), in ipw_rx_notification()
4659 (auth-> in ipw_rx_notification()
4665 priv->essid_len, priv->essid, in ipw_rx_notification()
4666 priv->bssid); in ipw_rx_notification()
4668 priv->status &= ~(STATUS_ASSOCIATING | in ipw_rx_notification()
4672 schedule_work(&priv->link_down); in ipw_rx_notification()
4721 IPW_DEBUG_NOTIF("auth: failure - %d\n", in ipw_rx_notification()
4722 auth->state); in ipw_rx_notification()
4730 &notif->u.channel_result; in ipw_rx_notification()
4734 x->channel_num); in ipw_rx_notification()
4744 struct notif_scan_complete *x = &notif->u.scan_complete; in ipw_rx_notification()
4748 "%d status\n", x->scan_type, in ipw_rx_notification()
4749 x->num_channels, x->status); in ipw_rx_notification()
4756 priv->status &= in ipw_rx_notification()
4759 wake_up_interruptible(&priv->wait_state); in ipw_rx_notification()
4760 cancel_delayed_work(&priv->scan_check); in ipw_rx_notification()
4762 if (priv->status & STATUS_EXIT_PENDING) in ipw_rx_notification()
4765 priv->ieee->scans++; in ipw_rx_notification()
4768 if (priv->ieee->iw_mode == IW_MODE_MONITOR) { in ipw_rx_notification()
4769 priv->status |= STATUS_SCAN_FORCED; in ipw_rx_notification()
4770 schedule_delayed_work(&priv->request_scan, 0); in ipw_rx_notification()
4773 priv->status &= ~STATUS_SCAN_FORCED; in ipw_rx_notification()
4777 if (priv->status & STATUS_DIRECT_SCAN_PENDING) in ipw_rx_notification()
4778 schedule_delayed_work(&priv->request_direct_scan, 0); in ipw_rx_notification()
4780 if (!(priv->status & (STATUS_ASSOCIATED | in ipw_rx_notification()
4784 schedule_work(&priv->associate); in ipw_rx_notification()
4785 else if (priv->status & STATUS_ROAMING) { in ipw_rx_notification()
4786 if (x->status == SCAN_COMPLETED_STATUS_COMPLETE) in ipw_rx_notification()
4791 schedule_work(&priv->roam); in ipw_rx_notification()
4794 priv->status &= ~STATUS_ROAMING; in ipw_rx_notification()
4795 } else if (priv->status & STATUS_SCAN_PENDING) in ipw_rx_notification()
4796 schedule_delayed_work(&priv->request_scan, 0); in ipw_rx_notification()
4797 else if (priv->config & CFG_BACKGROUND_SCAN in ipw_rx_notification()
4798 && priv->status & STATUS_ASSOCIATED) in ipw_rx_notification()
4799 schedule_delayed_work(&priv->request_scan, in ipw_rx_notification()
4811 if (x->status == SCAN_COMPLETED_STATUS_COMPLETE) in ipw_rx_notification()
4817 struct notif_frag_length *x = &notif->u.frag_len; in ipw_rx_notification()
4821 le16_to_cpu(x->frag_length)); in ipw_rx_notification()
4831 &notif->u.link_deterioration; in ipw_rx_notification()
4836 x->silence_notification_type, in ipw_rx_notification()
4837 x->silence_count); in ipw_rx_notification()
4838 memcpy(&priv->last_link_deterioration, x, in ipw_rx_notification()
4850 if (priv->hcmd in ipw_rx_notification()
4851 && priv->hcmd->cmd != HOST_CMD_DINO_CONFIG) in ipw_rx_notification()
4858 struct notif_beacon_state *x = &notif->u.beacon_state; in ipw_rx_notification()
4866 if (le32_to_cpu(x->state) == in ipw_rx_notification()
4869 le32_to_cpu(x-> in ipw_rx_notification()
4876 struct notif_tgi_tx_key *x = &notif->u.tgi_tx_key; in ipw_rx_notification()
4880 x->key_state, x->security_type, in ipw_rx_notification()
4881 x->station_index); in ipw_rx_notification()
4892 struct notif_calibration *x = &notif->u.calibration; in ipw_rx_notification()
4895 memcpy(&priv->calib, x, sizeof(*x)); in ipw_rx_notification()
4908 priv->exp_avg_noise = in ipw_rx_notification()
4909 exponential_average(priv->exp_avg_noise, in ipw_rx_notification()
4910 (u8) (le32_to_cpu(notif->u.noise.value) & 0xff), in ipw_rx_notification()
4924 notif->subtype, notif->flags, size); in ipw_rx_notification()
4941 rc = ipw_queue_tx_init(priv, &priv->txq_cmd, nTxCmd, in ipw_queue_reset()
4951 rc = ipw_queue_tx_init(priv, &priv->txq[0], nTx, in ipw_queue_reset()
4959 rc = ipw_queue_tx_init(priv, &priv->txq[1], nTx, in ipw_queue_reset()
4967 rc = ipw_queue_tx_init(priv, &priv->txq[2], nTx, in ipw_queue_reset()
4975 rc = ipw_queue_tx_init(priv, &priv->txq[3], nTx, in ipw_queue_reset()
4984 priv->rx_bufs_min = 0; in ipw_queue_reset()
4985 priv->rx_pend_max = 0; in ipw_queue_reset()
5011 struct clx2_queue *q = &txq->q; in ipw_queue_tx_reclaim()
5013 hw_tail = ipw_read32(priv, q->reg_r); in ipw_queue_tx_reclaim()
5014 if (hw_tail >= q->n_bd) { in ipw_queue_tx_reclaim()
5016 ("Read index for DMA queue (%d) is out of range [0-%d)\n", in ipw_queue_tx_reclaim()
5017 hw_tail, q->n_bd); in ipw_queue_tx_reclaim()
5020 for (; q->last_used != hw_tail; in ipw_queue_tx_reclaim()
5021 q->last_used = ipw_queue_inc_wrap(q->last_used, q->n_bd)) { in ipw_queue_tx_reclaim()
5023 priv->tx_packets++; in ipw_queue_tx_reclaim()
5026 if ((ipw_tx_queue_space(q) > q->low_mark) && in ipw_queue_tx_reclaim()
5028 netif_wake_queue(priv->net_dev); in ipw_queue_tx_reclaim()
5029 used = q->first_empty - q->last_used; in ipw_queue_tx_reclaim()
5031 used += q->n_bd; in ipw_queue_tx_reclaim()
5039 struct clx2_tx_queue *txq = &priv->txq_cmd; in ipw_queue_tx_hcmd()
5040 struct clx2_queue *q = &txq->q; in ipw_queue_tx_hcmd()
5045 return -EBUSY; in ipw_queue_tx_hcmd()
5048 tfd = &txq->bd[q->first_empty]; in ipw_queue_tx_hcmd()
5049 txq->txb[q->first_empty] = NULL; in ipw_queue_tx_hcmd()
5052 tfd->control_flags.message_type = TX_HOST_COMMAND_TYPE; in ipw_queue_tx_hcmd()
5053 tfd->control_flags.control_bits = TFD_NEED_IRQ_MASK; in ipw_queue_tx_hcmd()
5054 priv->hcmd_seq++; in ipw_queue_tx_hcmd()
5055 tfd->u.cmd.index = hcmd; in ipw_queue_tx_hcmd()
5056 tfd->u.cmd.length = len; in ipw_queue_tx_hcmd()
5057 memcpy(tfd->u.cmd.payload, buf, len); in ipw_queue_tx_hcmd()
5058 q->first_empty = ipw_queue_inc_wrap(q->first_empty, q->n_bd); in ipw_queue_tx_hcmd()
5059 ipw_write32(priv, q->reg_w, q->first_empty); in ipw_queue_tx_hcmd()
5068 * The host allocates 32 DMA target addresses and passes the host address
5073 * The host/firmware share two index registers for managing the Rx buffers.
5076 * to -- the driver can read up to (but not including) this position and get
5080 * The WRITE index maps to the last position the driver has read from -- the
5083 * The queue is empty (no good data) if WRITE = READ - 1, and is full if
5086 * During initialization the host sets up the READ queue position to the first
5087 * INDEX position, and WRITE to the last (READ - 1 wrapped)
5095 * + A list of pre-allocated SKBs is stored in ipw->rxq->rx_free. When
5096 * ipw->rxq->free_count drops to or below RX_LOW_WATERMARK, work is scheduled
5097 * to replensish the ipw->rxq->rx_free.
5099 * ipw->rxq is replenished and the READ INDEX is updated (updating the
5102 * detached from the ipw->rxq. The driver 'processed' index is updated.
5103 * + The Host/Firmware ipw->rxq is replenished at tasklet time from the rx_free
5104 * list. If there are no allocated buffers in ipw->rxq->rx_free, the READ
5105 * INDEX is not incremented and ipw->status(RX_STALLED) is set. If there
5119 * -- enable interrupts --
5120 * ISR - ipw_rx() Detach ipw_rx_mem_buffers from pool up to the
5131 * and we have free pre-allocated buffers, fill the ranks as much
5140 struct ipw_rx_queue *rxq = priv->rxq; in ipw_rx_queue_restock()
5146 spin_lock_irqsave(&rxq->lock, flags); in ipw_rx_queue_restock()
5147 write = rxq->write; in ipw_rx_queue_restock()
5148 while ((ipw_rx_queue_space(rxq) > 0) && (rxq->free_count)) { in ipw_rx_queue_restock()
5149 element = rxq->rx_free.next; in ipw_rx_queue_restock()
5153 ipw_write32(priv, IPW_RFDS_TABLE_LOWER + rxq->write * RFD_SIZE, in ipw_rx_queue_restock()
5154 rxb->dma_addr); in ipw_rx_queue_restock()
5155 rxq->queue[rxq->write] = rxb; in ipw_rx_queue_restock()
5156 rxq->write = (rxq->write + 1) % RX_QUEUE_SIZE; in ipw_rx_queue_restock()
5157 rxq->free_count--; in ipw_rx_queue_restock()
5159 spin_unlock_irqrestore(&rxq->lock, flags); in ipw_rx_queue_restock()
5161 /* If the pre-allocated buffer pool is dropping low, schedule to in ipw_rx_queue_restock()
5163 if (rxq->free_count <= RX_LOW_WATERMARK) in ipw_rx_queue_restock()
5164 schedule_work(&priv->rx_replenish); in ipw_rx_queue_restock()
5167 if (write != rxq->write) in ipw_rx_queue_restock()
5168 ipw_write32(priv, IPW_RX_WRITE_INDEX, rxq->write); in ipw_rx_queue_restock()
5180 struct ipw_rx_queue *rxq = priv->rxq; in ipw_rx_queue_replenish()
5185 spin_lock_irqsave(&rxq->lock, flags); in ipw_rx_queue_replenish()
5186 while (!list_empty(&rxq->rx_used)) { in ipw_rx_queue_replenish()
5187 element = rxq->rx_used.next; in ipw_rx_queue_replenish()
5189 rxb->skb = alloc_skb(IPW_RX_BUF_SIZE, GFP_ATOMIC); in ipw_rx_queue_replenish()
5190 if (!rxb->skb) { in ipw_rx_queue_replenish()
5192 priv->net_dev->name); in ipw_rx_queue_replenish()
5193 /* We don't reschedule replenish work here -- we will in ipw_rx_queue_replenish()
5200 rxb->dma_addr = in ipw_rx_queue_replenish()
5201 dma_map_single(&priv->pci_dev->dev, rxb->skb->data, in ipw_rx_queue_replenish()
5204 list_add_tail(&rxb->list, &rxq->rx_free); in ipw_rx_queue_replenish()
5205 rxq->free_count++; in ipw_rx_queue_replenish()
5207 spin_unlock_irqrestore(&rxq->lock, flags); in ipw_rx_queue_replenish()
5216 mutex_lock(&priv->mutex); in ipw_bg_rx_queue_replenish()
5218 mutex_unlock(&priv->mutex); in ipw_bg_rx_queue_replenish()
5234 if (rxq->pool[i].skb != NULL) { in ipw_rx_queue_free()
5235 dma_unmap_single(&priv->pci_dev->dev, in ipw_rx_queue_free()
5236 rxq->pool[i].dma_addr, in ipw_rx_queue_free()
5238 dev_kfree_skb(rxq->pool[i].skb); in ipw_rx_queue_free()
5255 spin_lock_init(&rxq->lock); in ipw_rx_queue_alloc()
5256 INIT_LIST_HEAD(&rxq->rx_free); in ipw_rx_queue_alloc()
5257 INIT_LIST_HEAD(&rxq->rx_used); in ipw_rx_queue_alloc()
5261 list_add_tail(&rxq->pool[i].list, &rxq->rx_used); in ipw_rx_queue_alloc()
5265 rxq->read = rxq->write = 0; in ipw_rx_queue_alloc()
5266 rxq->free_count = 0; in ipw_rx_queue_alloc()
5277 return priv->rates_mask & LIBIPW_OFDM_RATE_6MB_MASK ? in ipw_is_rate_in_mask()
5280 return priv->rates_mask & LIBIPW_OFDM_RATE_9MB_MASK ? in ipw_is_rate_in_mask()
5283 return priv-> in ipw_is_rate_in_mask()
5286 return priv-> in ipw_is_rate_in_mask()
5289 return priv-> in ipw_is_rate_in_mask()
5292 return priv-> in ipw_is_rate_in_mask()
5295 return priv-> in ipw_is_rate_in_mask()
5298 return priv-> in ipw_is_rate_in_mask()
5308 return priv->rates_mask & LIBIPW_CCK_RATE_1MB_MASK ? 1 : 0; in ipw_is_rate_in_mask()
5310 return priv->rates_mask & LIBIPW_CCK_RATE_2MB_MASK ? 1 : 0; in ipw_is_rate_in_mask()
5312 return priv->rates_mask & LIBIPW_CCK_RATE_5MB_MASK ? 1 : 0; in ipw_is_rate_in_mask()
5314 return priv->rates_mask & LIBIPW_CCK_RATE_11MB_MASK ? 1 : 0; in ipw_is_rate_in_mask()
5324 return priv->rates_mask & LIBIPW_OFDM_RATE_6MB_MASK ? 1 : 0; in ipw_is_rate_in_mask()
5326 return priv->rates_mask & LIBIPW_OFDM_RATE_9MB_MASK ? 1 : 0; in ipw_is_rate_in_mask()
5328 return priv->rates_mask & LIBIPW_OFDM_RATE_12MB_MASK ? 1 : 0; in ipw_is_rate_in_mask()
5330 return priv->rates_mask & LIBIPW_OFDM_RATE_18MB_MASK ? 1 : 0; in ipw_is_rate_in_mask()
5332 return priv->rates_mask & LIBIPW_OFDM_RATE_24MB_MASK ? 1 : 0; in ipw_is_rate_in_mask()
5334 return priv->rates_mask & LIBIPW_OFDM_RATE_36MB_MASK ? 1 : 0; in ipw_is_rate_in_mask()
5336 return priv->rates_mask & LIBIPW_OFDM_RATE_48MB_MASK ? 1 : 0; in ipw_is_rate_in_mask()
5338 return priv->rates_mask & LIBIPW_OFDM_RATE_54MB_MASK ? 1 : 0; in ipw_is_rate_in_mask()
5351 num_rates = min(network->rates_len, (u8) IPW_MAX_RATES); in ipw_compatible_rates()
5352 rates->num_rates = 0; in ipw_compatible_rates()
5354 if (!ipw_is_rate_in_mask(priv, network->mode, in ipw_compatible_rates()
5355 network->rates[i])) { in ipw_compatible_rates()
5357 if (network->rates[i] & LIBIPW_BASIC_RATE_MASK) { in ipw_compatible_rates()
5360 network->rates[i]); in ipw_compatible_rates()
5361 rates->supported_rates[rates->num_rates++] = in ipw_compatible_rates()
5362 network->rates[i]; in ipw_compatible_rates()
5367 network->rates[i], priv->rates_mask); in ipw_compatible_rates()
5371 rates->supported_rates[rates->num_rates++] = network->rates[i]; in ipw_compatible_rates()
5374 num_rates = min(network->rates_ex_len, in ipw_compatible_rates()
5375 (u8) (IPW_MAX_RATES - num_rates)); in ipw_compatible_rates()
5377 if (!ipw_is_rate_in_mask(priv, network->mode, in ipw_compatible_rates()
5378 network->rates_ex[i])) { in ipw_compatible_rates()
5379 if (network->rates_ex[i] & LIBIPW_BASIC_RATE_MASK) { in ipw_compatible_rates()
5382 network->rates_ex[i]); in ipw_compatible_rates()
5383 rates->supported_rates[rates->num_rates++] = in ipw_compatible_rates()
5384 network->rates[i]; in ipw_compatible_rates()
5389 network->rates_ex[i], priv->rates_mask); in ipw_compatible_rates()
5393 rates->supported_rates[rates->num_rates++] = in ipw_compatible_rates()
5394 network->rates_ex[i]; in ipw_compatible_rates()
5404 for (i = 0; i < src->num_rates; i++) in ipw_copy_rates()
5405 dest->supported_rates[i] = src->supported_rates[i]; in ipw_copy_rates()
5406 dest->num_rates = src->num_rates; in ipw_copy_rates()
5410 * mask should ever be used -- right now all callers to add the scan rates are
5419 rates->supported_rates[rates->num_rates++] = in ipw_add_cck_scan_rates()
5423 rates->supported_rates[rates->num_rates++] = in ipw_add_cck_scan_rates()
5427 rates->supported_rates[rates->num_rates++] = basic_mask | in ipw_add_cck_scan_rates()
5431 rates->supported_rates[rates->num_rates++] = basic_mask | in ipw_add_cck_scan_rates()
5442 rates->supported_rates[rates->num_rates++] = basic_mask | in ipw_add_ofdm_scan_rates()
5446 rates->supported_rates[rates->num_rates++] = in ipw_add_ofdm_scan_rates()
5450 rates->supported_rates[rates->num_rates++] = basic_mask | in ipw_add_ofdm_scan_rates()
5454 rates->supported_rates[rates->num_rates++] = in ipw_add_ofdm_scan_rates()
5458 rates->supported_rates[rates->num_rates++] = basic_mask | in ipw_add_ofdm_scan_rates()
5462 rates->supported_rates[rates->num_rates++] = in ipw_add_ofdm_scan_rates()
5466 rates->supported_rates[rates->num_rates++] = in ipw_add_ofdm_scan_rates()
5470 rates->supported_rates[rates->num_rates++] = in ipw_add_ofdm_scan_rates()
5488 if ((priv->ieee->iw_mode == IW_MODE_ADHOC && in ipw_find_adhoc_network()
5489 !(network->capability & WLAN_CAPABILITY_IBSS))) { in ipw_find_adhoc_network()
5491 network->ssid_len, network->ssid, in ipw_find_adhoc_network()
5492 network->bssid); in ipw_find_adhoc_network()
5499 if ((network->ssid_len != match->network->ssid_len) || in ipw_find_adhoc_network()
5500 memcmp(network->ssid, match->network->ssid, in ipw_find_adhoc_network()
5501 network->ssid_len)) { in ipw_find_adhoc_network()
5502 IPW_DEBUG_MERGE("Network '%*pE (%pM)' excluded because of non-network ESSID.\n", in ipw_find_adhoc_network()
5503 network->ssid_len, network->ssid, in ipw_find_adhoc_network()
5504 network->bssid); in ipw_find_adhoc_network()
5510 if ((priv->config & CFG_STATIC_ESSID) && in ipw_find_adhoc_network()
5511 ((network->ssid_len != priv->essid_len) || in ipw_find_adhoc_network()
5512 memcmp(network->ssid, priv->essid, in ipw_find_adhoc_network()
5513 min(network->ssid_len, priv->essid_len)))) { in ipw_find_adhoc_network()
5515 network->ssid_len, network->ssid, in ipw_find_adhoc_network()
5516 network->bssid, priv->essid_len, in ipw_find_adhoc_network()
5517 priv->essid); in ipw_find_adhoc_network()
5525 if (network->time_stamp[0] < match->network->time_stamp[0]) { in ipw_find_adhoc_network()
5527 match->network->ssid_len, match->network->ssid); in ipw_find_adhoc_network()
5529 } else if (network->time_stamp[1] < match->network->time_stamp[1]) { in ipw_find_adhoc_network()
5531 match->network->ssid_len, match->network->ssid); in ipw_find_adhoc_network()
5536 if (priv->ieee->scan_age != 0 && in ipw_find_adhoc_network()
5537 time_after(jiffies, network->last_scanned + priv->ieee->scan_age)) { in ipw_find_adhoc_network()
5539 network->ssid_len, network->ssid, in ipw_find_adhoc_network()
5540 network->bssid, in ipw_find_adhoc_network()
5541 jiffies_to_msecs(jiffies - in ipw_find_adhoc_network()
5542 network->last_scanned)); in ipw_find_adhoc_network()
5546 if ((priv->config & CFG_STATIC_CHANNEL) && in ipw_find_adhoc_network()
5547 (network->channel != priv->channel)) { in ipw_find_adhoc_network()
5549 network->ssid_len, network->ssid, in ipw_find_adhoc_network()
5550 network->bssid, in ipw_find_adhoc_network()
5551 network->channel, priv->channel); in ipw_find_adhoc_network()
5556 if (((priv->capability & CAP_PRIVACY_ON) ? 1 : 0) != in ipw_find_adhoc_network()
5557 ((network->capability & WLAN_CAPABILITY_PRIVACY) ? 1 : 0)) { in ipw_find_adhoc_network()
5559 network->ssid_len, network->ssid, in ipw_find_adhoc_network()
5560 network->bssid, in ipw_find_adhoc_network()
5561 priv-> in ipw_find_adhoc_network()
5563 network-> in ipw_find_adhoc_network()
5569 if (ether_addr_equal(network->bssid, priv->bssid)) { in ipw_find_adhoc_network()
5571 network->ssid_len, network->ssid, in ipw_find_adhoc_network()
5572 network->bssid, priv->bssid); in ipw_find_adhoc_network()
5577 if (!libipw_is_valid_mode(priv->ieee, network->mode)) { in ipw_find_adhoc_network()
5579 network->ssid_len, network->ssid, in ipw_find_adhoc_network()
5580 network->bssid); in ipw_find_adhoc_network()
5588 network->ssid_len, network->ssid, in ipw_find_adhoc_network()
5589 network->bssid); in ipw_find_adhoc_network()
5595 network->ssid_len, network->ssid, in ipw_find_adhoc_network()
5596 network->bssid); in ipw_find_adhoc_network()
5602 * should occur within a generic IEEE 802.11 user space tool. */ in ipw_find_adhoc_network()
5605 ipw_copy_rates(&match->rates, &rates); in ipw_find_adhoc_network()
5606 match->network = network; in ipw_find_adhoc_network()
5608 network->ssid_len, network->ssid, network->bssid); in ipw_find_adhoc_network()
5619 .network = priv->assoc_network in ipw_merge_adhoc_network()
5622 if ((priv->status & STATUS_ASSOCIATED) && in ipw_merge_adhoc_network()
5623 (priv->ieee->iw_mode == IW_MODE_ADHOC)) { in ipw_merge_adhoc_network()
5624 /* First pass through ROAM process -- look for a better in ipw_merge_adhoc_network()
5628 spin_lock_irqsave(&priv->ieee->lock, flags); in ipw_merge_adhoc_network()
5629 list_for_each_entry(network, &priv->ieee->network_list, list) { in ipw_merge_adhoc_network()
5630 if (network != priv->assoc_network) in ipw_merge_adhoc_network()
5634 spin_unlock_irqrestore(&priv->ieee->lock, flags); in ipw_merge_adhoc_network()
5636 if (match.network == priv->assoc_network) { in ipw_merge_adhoc_network()
5642 mutex_lock(&priv->mutex); in ipw_merge_adhoc_network()
5643 if (priv->ieee->iw_mode == IW_MODE_ADHOC) { in ipw_merge_adhoc_network()
5645 priv->essid_len, priv->essid); in ipw_merge_adhoc_network()
5650 priv->assoc_network = match.network; in ipw_merge_adhoc_network()
5651 mutex_unlock(&priv->mutex); in ipw_merge_adhoc_network()
5664 if ((priv->ieee->iw_mode == IW_MODE_INFRA && in ipw_best_network()
5665 !(network->capability & WLAN_CAPABILITY_ESS)) || in ipw_best_network()
5666 (priv->ieee->iw_mode == IW_MODE_ADHOC && in ipw_best_network()
5667 !(network->capability & WLAN_CAPABILITY_IBSS))) { in ipw_best_network()
5669 network->ssid_len, network->ssid, in ipw_best_network()
5670 network->bssid); in ipw_best_network()
5677 if ((network->ssid_len != match->network->ssid_len) || in ipw_best_network()
5678 memcmp(network->ssid, match->network->ssid, in ipw_best_network()
5679 network->ssid_len)) { in ipw_best_network()
5680 IPW_DEBUG_ASSOC("Network '%*pE (%pM)' excluded because of non-network ESSID.\n", in ipw_best_network()
5681 network->ssid_len, network->ssid, in ipw_best_network()
5682 network->bssid); in ipw_best_network()
5688 if ((priv->config & CFG_STATIC_ESSID) && in ipw_best_network()
5689 ((network->ssid_len != priv->essid_len) || in ipw_best_network()
5690 memcmp(network->ssid, priv->essid, in ipw_best_network()
5691 min(network->ssid_len, priv->essid_len)))) { in ipw_best_network()
5693 network->ssid_len, network->ssid, in ipw_best_network()
5694 network->bssid, priv->essid_len, in ipw_best_network()
5695 priv->essid); in ipw_best_network()
5702 if (match->network && match->network->stats.rssi > network->stats.rssi) { in ipw_best_network()
5704 network->ssid_len, network->ssid, in ipw_best_network()
5705 network->bssid, match->network->ssid_len, in ipw_best_network()
5706 match->network->ssid, match->network->bssid); in ipw_best_network()
5712 if (network->last_associate && in ipw_best_network()
5713 time_after(network->last_associate + (HZ * 3UL), jiffies)) { in ipw_best_network()
5715 network->ssid_len, network->ssid, in ipw_best_network()
5716 network->bssid, in ipw_best_network()
5717 jiffies_to_msecs(jiffies - in ipw_best_network()
5718 network->last_associate)); in ipw_best_network()
5723 if (priv->ieee->scan_age != 0 && in ipw_best_network()
5724 time_after(jiffies, network->last_scanned + priv->ieee->scan_age)) { in ipw_best_network()
5726 network->ssid_len, network->ssid, in ipw_best_network()
5727 network->bssid, in ipw_best_network()
5728 jiffies_to_msecs(jiffies - in ipw_best_network()
5729 network->last_scanned)); in ipw_best_network()
5733 if ((priv->config & CFG_STATIC_CHANNEL) && in ipw_best_network()
5734 (network->channel != priv->channel)) { in ipw_best_network()
5736 network->ssid_len, network->ssid, in ipw_best_network()
5737 network->bssid, in ipw_best_network()
5738 network->channel, priv->channel); in ipw_best_network()
5743 if (((priv->capability & CAP_PRIVACY_ON) ? 1 : 0) != in ipw_best_network()
5744 ((network->capability & WLAN_CAPABILITY_PRIVACY) ? 1 : 0)) { in ipw_best_network()
5746 network->ssid_len, network->ssid, in ipw_best_network()
5747 network->bssid, in ipw_best_network()
5748 priv->capability & CAP_PRIVACY_ON ? "on" : in ipw_best_network()
5750 network->capability & in ipw_best_network()
5755 if ((priv->config & CFG_STATIC_BSSID) && in ipw_best_network()
5756 !ether_addr_equal(network->bssid, priv->bssid)) { in ipw_best_network()
5758 network->ssid_len, network->ssid, in ipw_best_network()
5759 network->bssid, priv->bssid); in ipw_best_network()
5764 if (!libipw_is_valid_mode(priv->ieee, network->mode)) { in ipw_best_network()
5766 network->ssid_len, network->ssid, in ipw_best_network()
5767 network->bssid); in ipw_best_network()
5772 if (!libipw_is_valid_channel(priv->ieee, network->channel)) { in ipw_best_network()
5774 network->ssid_len, network->ssid, in ipw_best_network()
5775 network->bssid); in ipw_best_network()
5783 network->ssid_len, network->ssid, in ipw_best_network()
5784 network->bssid); in ipw_best_network()
5790 network->ssid_len, network->ssid, in ipw_best_network()
5791 network->bssid); in ipw_best_network()
5797 * should occur within a generic IEEE 802.11 user space tool. */ in ipw_best_network()
5800 ipw_copy_rates(&match->rates, &rates); in ipw_best_network()
5801 match->network = network; in ipw_best_network()
5804 network->ssid_len, network->ssid, network->bssid); in ipw_best_network()
5812 const struct libipw_geo *geo = libipw_get_geo(priv->ieee); in ipw_adhoc_create()
5818 * comes to creating a new ad-hoc network, we have tell the FW in ipw_adhoc_create()
5822 * chossen band. Attempting to create a new ad-hoc network in ipw_adhoc_create()
5827 switch (libipw_is_valid_channel(priv->ieee, priv->channel)) { in ipw_adhoc_create()
5829 network->mode = IEEE_A; in ipw_adhoc_create()
5830 i = libipw_channel_to_index(priv->ieee, priv->channel); in ipw_adhoc_create()
5831 BUG_ON(i == -1); in ipw_adhoc_create()
5832 if (geo->a[i].flags & LIBIPW_CH_PASSIVE_ONLY) { in ipw_adhoc_create()
5834 priv->channel = geo->a[0].channel; in ipw_adhoc_create()
5839 if (priv->ieee->mode & IEEE_G) in ipw_adhoc_create()
5840 network->mode = IEEE_G; in ipw_adhoc_create()
5842 network->mode = IEEE_B; in ipw_adhoc_create()
5843 i = libipw_channel_to_index(priv->ieee, priv->channel); in ipw_adhoc_create()
5844 BUG_ON(i == -1); in ipw_adhoc_create()
5845 if (geo->bg[i].flags & LIBIPW_CH_PASSIVE_ONLY) { in ipw_adhoc_create()
5847 priv->channel = geo->bg[0].channel; in ipw_adhoc_create()
5853 if (priv->ieee->mode & IEEE_A) { in ipw_adhoc_create()
5854 network->mode = IEEE_A; in ipw_adhoc_create()
5855 priv->channel = geo->a[0].channel; in ipw_adhoc_create()
5856 } else if (priv->ieee->mode & IEEE_G) { in ipw_adhoc_create()
5857 network->mode = IEEE_G; in ipw_adhoc_create()
5858 priv->channel = geo->bg[0].channel; in ipw_adhoc_create()
5860 network->mode = IEEE_B; in ipw_adhoc_create()
5861 priv->channel = geo->bg[0].channel; in ipw_adhoc_create()
5866 network->channel = priv->channel; in ipw_adhoc_create()
5867 priv->config |= CFG_ADHOC_PERSIST; in ipw_adhoc_create()
5868 ipw_create_bssid(priv, network->bssid); in ipw_adhoc_create()
5869 network->ssid_len = priv->essid_len; in ipw_adhoc_create()
5870 memcpy(network->ssid, priv->essid, priv->essid_len); in ipw_adhoc_create()
5871 memset(&network->stats, 0, sizeof(network->stats)); in ipw_adhoc_create()
5872 network->capability = WLAN_CAPABILITY_IBSS; in ipw_adhoc_create()
5873 if (!(priv->config & CFG_PREAMBLE_LONG)) in ipw_adhoc_create()
5874 network->capability |= WLAN_CAPABILITY_SHORT_PREAMBLE; in ipw_adhoc_create()
5875 if (priv->capability & CAP_PRIVACY_ON) in ipw_adhoc_create()
5876 network->capability |= WLAN_CAPABILITY_PRIVACY; in ipw_adhoc_create()
5877 network->rates_len = min(priv->rates.num_rates, MAX_RATES_LENGTH); in ipw_adhoc_create()
5878 memcpy(network->rates, priv->rates.supported_rates, network->rates_len); in ipw_adhoc_create()
5879 network->rates_ex_len = priv->rates.num_rates - network->rates_len; in ipw_adhoc_create()
5880 memcpy(network->rates_ex, in ipw_adhoc_create()
5881 &priv->rates.supported_rates[network->rates_len], in ipw_adhoc_create()
5882 network->rates_ex_len); in ipw_adhoc_create()
5883 network->last_scanned = 0; in ipw_adhoc_create()
5884 network->flags = 0; in ipw_adhoc_create()
5885 network->last_associate = 0; in ipw_adhoc_create()
5886 network->time_stamp[0] = 0; in ipw_adhoc_create()
5887 network->time_stamp[1] = 0; in ipw_adhoc_create()
5888 network->beacon_interval = 100; /* Default */ in ipw_adhoc_create()
5889 network->listen_interval = 10; /* Default */ in ipw_adhoc_create()
5890 network->atim_window = 0; /* Default */ in ipw_adhoc_create()
5891 network->wpa_ie_len = 0; in ipw_adhoc_create()
5892 network->rsn_ie_len = 0; in ipw_adhoc_create()
5899 if (!(priv->ieee->sec.flags & (1 << index))) in ipw_send_tgi_tx_key()
5903 memcpy(key.key, priv->ieee->sec.keys[index], SCM_TEMPORAL_KEY_LENGTH); in ipw_send_tgi_tx_key()
5926 if (!(priv->ieee->sec.flags & (1 << i))) { in ipw_send_wep_keys()
5931 key.key_size = priv->ieee->sec.key_sizes[i]; in ipw_send_wep_keys()
5932 memcpy(key.key, priv->ieee->sec.keys[i], key.key_size); in ipw_send_wep_keys()
5940 if (priv->ieee->host_encrypt) in ipw_set_hw_decrypt_unicast()
5945 priv->sys_config.disable_unicast_decryption = 0; in ipw_set_hw_decrypt_unicast()
5946 priv->ieee->host_decrypt = 0; in ipw_set_hw_decrypt_unicast()
5949 priv->sys_config.disable_unicast_decryption = 1; in ipw_set_hw_decrypt_unicast()
5950 priv->ieee->host_decrypt = 1; in ipw_set_hw_decrypt_unicast()
5953 priv->sys_config.disable_unicast_decryption = 0; in ipw_set_hw_decrypt_unicast()
5954 priv->ieee->host_decrypt = 0; in ipw_set_hw_decrypt_unicast()
5957 priv->sys_config.disable_unicast_decryption = 1; in ipw_set_hw_decrypt_unicast()
5966 if (priv->ieee->host_encrypt) in ipw_set_hw_decrypt_multicast()
5971 priv->sys_config.disable_multicast_decryption = 0; in ipw_set_hw_decrypt_multicast()
5974 priv->sys_config.disable_multicast_decryption = 1; in ipw_set_hw_decrypt_multicast()
5977 priv->sys_config.disable_multicast_decryption = 0; in ipw_set_hw_decrypt_multicast()
5980 priv->sys_config.disable_multicast_decryption = 1; in ipw_set_hw_decrypt_multicast()
5989 switch (priv->ieee->sec.level) { in ipw_set_hwcrypto_keys()
5991 if (priv->ieee->sec.flags & SEC_ACTIVE_KEY) in ipw_set_hwcrypto_keys()
5994 priv->ieee->sec.active_key); in ipw_set_hwcrypto_keys()
5996 if (!priv->ieee->host_mc_decrypt) in ipw_set_hwcrypto_keys()
6000 if (priv->ieee->sec.flags & SEC_ACTIVE_KEY) in ipw_set_hwcrypto_keys()
6003 priv->ieee->sec.active_key); in ipw_set_hwcrypto_keys()
6007 ipw_set_hw_decrypt_unicast(priv, priv->ieee->sec.level); in ipw_set_hwcrypto_keys()
6008 ipw_set_hw_decrypt_multicast(priv, priv->ieee->sec.level); in ipw_set_hwcrypto_keys()
6020 if (priv->missed_adhoc_beacons++ > priv->disassociate_threshold && in ipw_adhoc_check()
6021 !(priv->config & CFG_ADHOC_PERSIST)) { in ipw_adhoc_check()
6024 "Missed beacon: %d - disassociate\n", in ipw_adhoc_check()
6025 priv->missed_adhoc_beacons); in ipw_adhoc_check()
6031 schedule_delayed_work(&priv->adhoc_check, in ipw_adhoc_check()
6032 le16_to_cpu(priv->assoc_request.beacon_interval)); in ipw_adhoc_check()
6039 mutex_lock(&priv->mutex); in ipw_bg_adhoc_check()
6041 mutex_unlock(&priv->mutex); in ipw_bg_adhoc_check()
6047 "[CFG 0x%08X]\n", priv->config); in ipw_debug_config()
6048 if (priv->config & CFG_STATIC_CHANNEL) in ipw_debug_config()
6049 IPW_DEBUG_INFO("Channel locked to %d\n", priv->channel); in ipw_debug_config()
6052 if (priv->config & CFG_STATIC_ESSID) in ipw_debug_config()
6054 priv->essid_len, priv->essid); in ipw_debug_config()
6057 if (priv->config & CFG_STATIC_BSSID) in ipw_debug_config()
6058 IPW_DEBUG_INFO("BSSID locked to %pM\n", priv->bssid); in ipw_debug_config()
6061 if (priv->capability & CAP_PRIVACY_ON) in ipw_debug_config()
6065 IPW_DEBUG_INFO("RATE MASK: 0x%08X\n", priv->rates_mask); in ipw_debug_config()
6074 u16 new_tx_rates = priv->rates_mask; in ipw_set_fixed_rate()
6079 switch (priv->ieee->freq_band) { in ipw_set_fixed_rate()
6082 if (priv->rates_mask & ~LIBIPW_OFDM_RATES_MASK) { in ipw_set_fixed_rate()
6144 if (priv->status & STATUS_SCAN_ABORTING) { in ipw_abort_scan()
6148 priv->status |= STATUS_SCAN_ABORTING; in ipw_abort_scan()
6163 geo = libipw_get_geo(priv->ieee); in ipw_add_scan_channels()
6165 if (priv->ieee->freq_band & LIBIPW_52GHZ_BAND) { in ipw_add_scan_channels()
6167 for (i = 0; i < geo->a_channels; i++) { in ipw_add_scan_channels()
6168 if ((priv->status & STATUS_ASSOCIATED) && in ipw_add_scan_channels()
6169 geo->a[i].channel == priv->channel) in ipw_add_scan_channels()
6172 scan->channels_list[channel_index] = geo->a[i].channel; in ipw_add_scan_channels()
6174 geo->a[i]. in ipw_add_scan_channels()
6181 scan->channels_list[start] = (u8) (IPW_A_MODE << 6) | in ipw_add_scan_channels()
6182 (channel_index - start); in ipw_add_scan_channels()
6187 if (priv->ieee->freq_band & LIBIPW_24GHZ_BAND) { in ipw_add_scan_channels()
6189 if (priv->config & CFG_SPEED_SCAN) { in ipw_add_scan_channels()
6197 while (channel_index < IPW_SCAN_CHANNELS - 1) { in ipw_add_scan_channels()
6199 priv->speed_scan[priv->speed_scan_pos]; in ipw_add_scan_channels()
6201 priv->speed_scan_pos = 0; in ipw_add_scan_channels()
6202 channel = priv->speed_scan[0]; in ipw_add_scan_channels()
6204 if ((priv->status & STATUS_ASSOCIATED) && in ipw_add_scan_channels()
6205 channel == priv->channel) { in ipw_add_scan_channels()
6206 priv->speed_scan_pos++; in ipw_add_scan_channels()
6215 if (channels[channel - 1] != 0) in ipw_add_scan_channels()
6218 channels[channel - 1] = 1; in ipw_add_scan_channels()
6219 priv->speed_scan_pos++; in ipw_add_scan_channels()
6221 scan->channels_list[channel_index] = channel; in ipw_add_scan_channels()
6223 libipw_channel_to_index(priv->ieee, channel); in ipw_add_scan_channels()
6225 geo->bg[index]. in ipw_add_scan_channels()
6232 for (i = 0; i < geo->bg_channels; i++) { in ipw_add_scan_channels()
6233 if ((priv->status & STATUS_ASSOCIATED) && in ipw_add_scan_channels()
6234 geo->bg[i].channel == priv->channel) in ipw_add_scan_channels()
6237 scan->channels_list[channel_index] = in ipw_add_scan_channels()
6238 geo->bg[i].channel; in ipw_add_scan_channels()
6240 geo->bg[i]. in ipw_add_scan_channels()
6249 scan->channels_list[start] = (u8) (IPW_B_MODE << 6) | in ipw_add_scan_channels()
6250 (channel_index - start); in ipw_add_scan_channels()
6262 if (priv->status & STATUS_ASSOCIATED in ipw_passive_dwell_time()
6263 && priv->assoc_network->beacon_interval > 10) in ipw_passive_dwell_time()
6264 return priv->assoc_network->beacon_interval - 10; in ipw_passive_dwell_time()
6274 if (!(priv->status & STATUS_INIT) || in ipw_request_scan_helper()
6275 (priv->status & STATUS_EXIT_PENDING)) in ipw_request_scan_helper()
6278 mutex_lock(&priv->mutex); in ipw_request_scan_helper()
6280 if (direct && (priv->direct_scan_ssid_len == 0)) { in ipw_request_scan_helper()
6282 priv->status &= ~STATUS_DIRECT_SCAN_PENDING; in ipw_request_scan_helper()
6286 if (priv->status & STATUS_SCANNING) { in ipw_request_scan_helper()
6288 priv->status |= direct ? STATUS_DIRECT_SCAN_PENDING : in ipw_request_scan_helper()
6293 if (!(priv->status & STATUS_SCAN_FORCED) && in ipw_request_scan_helper()
6294 priv->status & STATUS_SCAN_ABORTING) { in ipw_request_scan_helper()
6296 priv->status |= direct ? STATUS_DIRECT_SCAN_PENDING : in ipw_request_scan_helper()
6301 if (priv->status & STATUS_RF_KILL_MASK) { in ipw_request_scan_helper()
6303 priv->status |= direct ? STATUS_DIRECT_SCAN_PENDING : in ipw_request_scan_helper()
6309 scan.full_scan_index = cpu_to_le32(libipw_get_scans(priv->ieee)); in ipw_request_scan_helper()
6321 if (priv->config & CFG_SPEED_SCAN) in ipw_request_scan_helper()
6336 if (priv->ieee->iw_mode == IW_MODE_MONITOR) { in ipw_request_scan_helper()
6340 switch (libipw_is_valid_channel(priv->ieee, priv->channel)) { in ipw_request_scan_helper()
6343 channel = priv->channel; in ipw_request_scan_helper()
6348 channel = priv->channel; in ipw_request_scan_helper()
6364 * set a small dwell_time here and just keep re-issuing in ipw_request_scan_helper()
6377 err = ipw_send_ssid(priv, priv->direct_scan_ssid, in ipw_request_scan_helper()
6378 priv->direct_scan_ssid_len); in ipw_request_scan_helper()
6386 } else if ((priv->status & STATUS_ROAMING) in ipw_request_scan_helper()
6387 || (!(priv->status & STATUS_ASSOCIATED) in ipw_request_scan_helper()
6388 && (priv->config & CFG_STATIC_ESSID) in ipw_request_scan_helper()
6390 err = ipw_send_ssid(priv, priv->essid, priv->essid_len); in ipw_request_scan_helper()
6413 priv->status |= STATUS_SCANNING; in ipw_request_scan_helper()
6415 priv->status &= ~STATUS_DIRECT_SCAN_PENDING; in ipw_request_scan_helper()
6416 priv->direct_scan_ssid_len = 0; in ipw_request_scan_helper()
6418 priv->status &= ~STATUS_SCAN_PENDING; in ipw_request_scan_helper()
6420 schedule_delayed_work(&priv->scan_check, IPW_SCAN_CHECK_WATCHDOG); in ipw_request_scan_helper()
6422 mutex_unlock(&priv->mutex); in ipw_request_scan_helper()
6451 mutex_lock(&priv->mutex); in ipw_bg_abort_scan()
6453 mutex_unlock(&priv->mutex); in ipw_bg_abort_scan()
6460 priv->ieee->wpa_enabled = value; in ipw_wpa_enable()
6466 struct libipw_device *ieee = priv->ieee; in ipw_wpa_set_auth_algs()
6474 ieee->open_wep = 0; in ipw_wpa_set_auth_algs()
6477 ieee->open_wep = 1; in ipw_wpa_set_auth_algs()
6480 ieee->open_wep = 1; in ipw_wpa_set_auth_algs()
6482 return -EINVAL; in ipw_wpa_set_auth_algs()
6484 if (ieee->set_security) in ipw_wpa_set_auth_algs()
6485 ieee->set_security(ieee->dev, &sec); in ipw_wpa_set_auth_algs()
6487 ret = -EOPNOTSUPP; in ipw_wpa_set_auth_algs()
6509 * WE-18 support
6518 struct libipw_device *ieee = priv->ieee; in ipw_wx_set_genie()
6522 if (wrqu->data.length > MAX_WPA_IE_LEN || in ipw_wx_set_genie()
6523 (wrqu->data.length && extra == NULL)) in ipw_wx_set_genie()
6524 return -EINVAL; in ipw_wx_set_genie()
6526 if (wrqu->data.length) { in ipw_wx_set_genie()
6527 buf = kmemdup(extra, wrqu->data.length, GFP_KERNEL); in ipw_wx_set_genie()
6529 err = -ENOMEM; in ipw_wx_set_genie()
6533 kfree(ieee->wpa_ie); in ipw_wx_set_genie()
6534 ieee->wpa_ie = buf; in ipw_wx_set_genie()
6535 ieee->wpa_ie_len = wrqu->data.length; in ipw_wx_set_genie()
6537 kfree(ieee->wpa_ie); in ipw_wx_set_genie()
6538 ieee->wpa_ie = NULL; in ipw_wx_set_genie()
6539 ieee->wpa_ie_len = 0; in ipw_wx_set_genie()
6542 ipw_wpa_assoc_frame(priv, ieee->wpa_ie, ieee->wpa_ie_len); in ipw_wx_set_genie()
6553 struct libipw_device *ieee = priv->ieee; in ipw_wx_get_genie()
6556 if (ieee->wpa_ie_len == 0 || ieee->wpa_ie == NULL) { in ipw_wx_get_genie()
6557 wrqu->data.length = 0; in ipw_wx_get_genie()
6561 if (wrqu->data.length < ieee->wpa_ie_len) { in ipw_wx_get_genie()
6562 err = -E2BIG; in ipw_wx_get_genie()
6566 wrqu->data.length = ieee->wpa_ie_len; in ipw_wx_get_genie()
6567 memcpy(extra, ieee->wpa_ie, ieee->wpa_ie_len); in ipw_wx_get_genie()
6586 return -1; in wext_cipher2level()
6596 struct libipw_device *ieee = priv->ieee; in ipw_wx_set_auth()
6597 struct iw_param *param = &wrqu->param; in ipw_wx_set_auth()
6602 switch (param->flags & IW_AUTH_INDEX) { in ipw_wx_set_auth()
6607 wext_cipher2level(param->value)); in ipw_wx_set_auth()
6611 wext_cipher2level(param->value)); in ipw_wx_set_auth()
6620 crypt = priv->ieee->crypt_info.crypt[priv->ieee->crypt_info.tx_keyidx]; in ipw_wx_set_auth()
6621 if (!crypt || !crypt->ops->set_flags || !crypt->ops->get_flags) in ipw_wx_set_auth()
6624 flags = crypt->ops->get_flags(crypt->priv); in ipw_wx_set_auth()
6626 if (param->value) in ipw_wx_set_auth()
6631 crypt->ops->set_flags(flags, crypt->priv); in ipw_wx_set_auth()
6643 * used, drop_unencrypted is set to false, else true -- we in ipw_wx_set_auth()
6649 .enabled = param->value, in ipw_wx_set_auth()
6651 priv->ieee->drop_unencrypted = param->value; in ipw_wx_set_auth()
6655 if (!param->value) { in ipw_wx_set_auth()
6662 if (priv->ieee->set_security) in ipw_wx_set_auth()
6663 priv->ieee->set_security(priv->ieee->dev, &sec); in ipw_wx_set_auth()
6668 ret = ipw_wpa_set_auth_algs(priv, param->value); in ipw_wx_set_auth()
6672 ret = ipw_wpa_enable(priv, param->value); in ipw_wx_set_auth()
6677 ieee->ieee802_1x = param->value; in ipw_wx_set_auth()
6681 ieee->privacy_invoked = param->value; in ipw_wx_set_auth()
6685 return -EOPNOTSUPP; in ipw_wx_set_auth()
6696 struct libipw_device *ieee = priv->ieee; in ipw_wx_get_auth()
6698 struct iw_param *param = &wrqu->param; in ipw_wx_get_auth()
6700 switch (param->flags & IW_AUTH_INDEX) { in ipw_wx_get_auth()
6708 return -EOPNOTSUPP; in ipw_wx_get_auth()
6711 crypt = priv->ieee->crypt_info.crypt[priv->ieee->crypt_info.tx_keyidx]; in ipw_wx_get_auth()
6712 if (!crypt || !crypt->ops->get_flags) in ipw_wx_get_auth()
6715 param->value = (crypt->ops->get_flags(crypt->priv) & in ipw_wx_get_auth()
6721 param->value = ieee->drop_unencrypted; in ipw_wx_get_auth()
6725 param->value = ieee->sec.auth_mode; in ipw_wx_get_auth()
6729 param->value = ieee->wpa_enabled; in ipw_wx_get_auth()
6733 param->value = ieee->ieee802_1x; in ipw_wx_get_auth()
6738 param->value = ieee->privacy_invoked; in ipw_wx_get_auth()
6742 return -EOPNOTSUPP; in ipw_wx_get_auth()
6756 if (ext->alg == IW_ENCODE_ALG_TKIP) { in ipw_wx_set_encodeext()
6758 host decryption still needed */ in ipw_wx_set_encodeext()
6759 if (ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY) in ipw_wx_set_encodeext()
6760 priv->ieee->host_mc_decrypt = 1; in ipw_wx_set_encodeext()
6762 priv->ieee->host_encrypt = 0; in ipw_wx_set_encodeext()
6763 priv->ieee->host_encrypt_msdu = 1; in ipw_wx_set_encodeext()
6764 priv->ieee->host_decrypt = 1; in ipw_wx_set_encodeext()
6767 priv->ieee->host_encrypt = 0; in ipw_wx_set_encodeext()
6768 priv->ieee->host_encrypt_msdu = 0; in ipw_wx_set_encodeext()
6769 priv->ieee->host_decrypt = 0; in ipw_wx_set_encodeext()
6770 priv->ieee->host_mc_decrypt = 0; in ipw_wx_set_encodeext()
6774 return libipw_wx_set_encodeext(priv->ieee, info, wrqu, extra); in ipw_wx_set_encodeext()
6783 return libipw_wx_get_encodeext(priv->ieee, info, wrqu, extra); in ipw_wx_get_encodeext()
6794 switch (mlme->cmd) { in ipw_wx_set_mlme()
6804 return -EOPNOTSUPP; in ipw_wx_set_mlme()
6820 if (priv->status & STATUS_ASSOCIATED) { in ipw_qos_current_mode()
6823 spin_lock_irqsave(&priv->ieee->lock, flags); in ipw_qos_current_mode()
6824 mode = priv->assoc_network->mode; in ipw_qos_current_mode()
6825 spin_unlock_irqrestore(&priv->ieee->lock, flags); in ipw_qos_current_mode()
6827 mode = priv->ieee->mode; in ipw_qos_current_mode()
6842 if (network->capability & WLAN_CAPABILITY_IBSS) in ipw_qos_handle_probe_response()
6843 network->qos_data.active = network->qos_data.supported; in ipw_qos_handle_probe_response()
6845 if (network->flags & NETWORK_HAS_QOS_MASK) { in ipw_qos_handle_probe_response()
6847 (network->flags & NETWORK_HAS_QOS_PARAMETERS)) in ipw_qos_handle_probe_response()
6848 network->qos_data.active = network->qos_data.supported; in ipw_qos_handle_probe_response()
6850 if ((network->qos_data.active == 1) && (active_network == 1) && in ipw_qos_handle_probe_response()
6851 (network->flags & NETWORK_HAS_QOS_PARAMETERS) && in ipw_qos_handle_probe_response()
6852 (network->qos_data.old_param_count != in ipw_qos_handle_probe_response()
6853 network->qos_data.param_count)) { in ipw_qos_handle_probe_response()
6854 network->qos_data.old_param_count = in ipw_qos_handle_probe_response()
6855 network->qos_data.param_count; in ipw_qos_handle_probe_response()
6856 schedule_work(&priv->qos_activate); in ipw_qos_handle_probe_response()
6861 if ((priv->ieee->mode == IEEE_B) || (network->mode == IEEE_B)) in ipw_qos_handle_probe_response()
6862 memcpy(&network->qos_data.parameters, in ipw_qos_handle_probe_response()
6865 memcpy(&network->qos_data.parameters, in ipw_qos_handle_probe_response()
6868 if ((network->qos_data.active == 1) && (active_network == 1)) { in ipw_qos_handle_probe_response()
6870 schedule_work(&priv->qos_activate); in ipw_qos_handle_probe_response()
6873 network->qos_data.active = 0; in ipw_qos_handle_probe_response()
6874 network->qos_data.supported = 0; in ipw_qos_handle_probe_response()
6876 if ((priv->status & STATUS_ASSOCIATED) && in ipw_qos_handle_probe_response()
6877 (priv->ieee->iw_mode == IW_MODE_ADHOC) && (active_network == 0)) { in ipw_qos_handle_probe_response()
6878 if (!ether_addr_equal(network->bssid, priv->bssid)) in ipw_qos_handle_probe_response()
6879 if (network->capability & WLAN_CAPABILITY_IBSS) in ipw_qos_handle_probe_response()
6880 if ((network->ssid_len == in ipw_qos_handle_probe_response()
6881 priv->assoc_network->ssid_len) && in ipw_qos_handle_probe_response()
6882 !memcmp(network->ssid, in ipw_qos_handle_probe_response()
6883 priv->assoc_network->ssid, in ipw_qos_handle_probe_response()
6884 network->ssid_len)) { in ipw_qos_handle_probe_response()
6885 schedule_work(&priv->merge_networks); in ipw_qos_handle_probe_response()
6910 memcpy(active_one, priv->qos_data.def_qos_parm_CCK, size); in ipw_qos_activate()
6912 memcpy(active_one, priv->qos_data.def_qos_parm_OFDM, size); in ipw_qos_activate()
6926 } else if (priv->ieee->iw_mode == IW_MODE_ADHOC) { in ipw_qos_activate()
6930 if (priv->qos_data.qos_enable == 0) in ipw_qos_activate()
6933 active_one = priv->qos_data.def_qos_parm_CCK; in ipw_qos_activate()
6935 if (priv->qos_data.qos_enable == 0) in ipw_qos_activate()
6938 active_one = priv->qos_data.def_qos_parm_OFDM; in ipw_qos_activate()
6945 spin_lock_irqsave(&priv->ieee->lock, flags); in ipw_qos_activate()
6946 active_one = &(qos_network_data->parameters); in ipw_qos_activate()
6947 qos_network_data->old_param_count = in ipw_qos_activate()
6948 qos_network_data->param_count; in ipw_qos_activate()
6950 active = qos_network_data->supported; in ipw_qos_activate()
6951 spin_unlock_irqrestore(&priv->ieee->lock, flags); in ipw_qos_activate()
6978 return -1; in ipw_qos_set_info_element()
6981 qos_info.length = sizeof(struct libipw_qos_information_element) - 2; in ipw_qos_set_info_element()
7010 switch (priv->ieee->iw_mode) { in ipw_qos_association()
7012 BUG_ON(!(network->capability & WLAN_CAPABILITY_IBSS)); in ipw_qos_association()
7018 qos_data = &network->qos_data; in ipw_qos_association()
7028 priv->assoc_request.policy_support &= ~HC_QOS_SUPPORT_ASSOC; in ipw_qos_association()
7032 if (priv->qos_data.qos_enable && qos_data->supported) { in ipw_qos_association()
7034 priv->assoc_request.policy_support |= HC_QOS_SUPPORT_ASSOC; in ipw_qos_association()
7054 (priv->assoc_network == NULL)) in ipw_qos_association_resp()
7057 if (!(priv->status & STATUS_ASSOCIATED)) in ipw_qos_association_resp()
7060 if ((priv->ieee->iw_mode != IW_MODE_INFRA)) in ipw_qos_association_resp()
7063 spin_lock_irqsave(&priv->ieee->lock, flags); in ipw_qos_association_resp()
7064 if (network->flags & NETWORK_HAS_QOS_PARAMETERS) { in ipw_qos_association_resp()
7065 memcpy(&priv->assoc_network->qos_data, &network->qos_data, in ipw_qos_association_resp()
7067 priv->assoc_network->qos_data.active = 1; in ipw_qos_association_resp()
7068 if ((network->qos_data.old_param_count != in ipw_qos_association_resp()
7069 network->qos_data.param_count)) { in ipw_qos_association_resp()
7071 network->qos_data.old_param_count = in ipw_qos_association_resp()
7072 network->qos_data.param_count; in ipw_qos_association_resp()
7076 if ((network->mode == IEEE_B) || (priv->ieee->mode == IEEE_B)) in ipw_qos_association_resp()
7077 memcpy(&priv->assoc_network->qos_data.parameters, in ipw_qos_association_resp()
7080 memcpy(&priv->assoc_network->qos_data.parameters, in ipw_qos_association_resp()
7082 priv->assoc_network->qos_data.active = 0; in ipw_qos_association_resp()
7083 priv->assoc_network->qos_data.supported = 0; in ipw_qos_association_resp()
7087 spin_unlock_irqrestore(&priv->ieee->lock, flags); in ipw_qos_association_resp()
7090 schedule_work(&priv->qos_activate); in ipw_qos_association_resp()
7100 if (!(priv->ieee->modulation & LIBIPW_OFDM_MODULATION)) in ipw_qos_get_burst_duration()
7101 ret = priv->qos_data.burst_duration_CCK; in ipw_qos_get_burst_duration()
7103 ret = priv->qos_data.burst_duration_OFDM; in ipw_qos_get_burst_duration()
7115 priv->qos_data.qos_enable = enable; in ipw_qos_init()
7117 if (priv->qos_data.qos_enable) { in ipw_qos_init()
7118 priv->qos_data.def_qos_parm_CCK = &def_qos_parameters_CCK; in ipw_qos_init()
7119 priv->qos_data.def_qos_parm_OFDM = &def_qos_parameters_OFDM; in ipw_qos_init()
7122 priv->qos_data.def_qos_parm_CCK = &def_parameters_CCK; in ipw_qos_init()
7123 priv->qos_data.def_qos_parm_OFDM = &def_parameters_OFDM; in ipw_qos_init()
7127 priv->qos_data.burst_enable = burst_enable; in ipw_qos_init()
7130 priv->qos_data.burst_duration_CCK = burst_duration_CCK; in ipw_qos_init()
7131 priv->qos_data.burst_duration_OFDM = burst_duration_OFDM; in ipw_qos_init()
7133 priv->qos_data.burst_duration_CCK = 0; in ipw_qos_init()
7134 priv->qos_data.burst_duration_OFDM = 0; in ipw_qos_init()
7143 if (priority > 7 || !priv->qos_data.qos_enable) in ipw_get_tx_queue_number()
7146 return from_priority_to_tx_queue[priority] - 1; in ipw_get_tx_queue_number()
7155 u8 *daddr = skb->data + ETH_ALEN; in ipw_is_qos_active()
7158 if (!(priv->status & STATUS_ASSOCIATED)) in ipw_is_qos_active()
7161 qos_data = &priv->assoc_network->qos_data; in ipw_is_qos_active()
7163 if (priv->ieee->iw_mode == IW_MODE_ADHOC) { in ipw_is_qos_active()
7165 qos_data->active = 0; in ipw_is_qos_active()
7167 qos_data->active = qos_data->supported; in ipw_is_qos_active()
7169 active = qos_data->active; in ipw_is_qos_active()
7170 supported = qos_data->supported; in ipw_is_qos_active()
7173 priv->qos_data.qos_enable, active, supported, unicast); in ipw_is_qos_active()
7174 if (active && priv->qos_data.qos_enable) in ipw_is_qos_active()
7190 tx_queue_id = from_priority_to_tx_queue[priority] - 1; in ipw_qos_set_tx_queue_command()
7191 tfd->tx_flags_ext |= DCT_FLAG_EXT_QOS_ENABLED; in ipw_qos_set_tx_queue_command()
7193 if (priv->qos_data.qos_no_ack_mask & (1UL << tx_queue_id)) { in ipw_qos_set_tx_queue_command()
7194 tfd->tx_flags &= ~DCT_FLAG_ACK_REQD; in ipw_qos_set_tx_queue_command()
7195 tfd->tfd.tfd_26.mchdr.qos_ctrl |= cpu_to_le16(CTRL_QOS_NO_ACK); in ipw_qos_set_tx_queue_command()
7208 mutex_lock(&priv->mutex); in ipw_bg_qos_activate()
7210 if (priv->status & STATUS_ASSOCIATED) in ipw_bg_qos_activate()
7211 ipw_qos_activate(priv, &(priv->assoc_network->qos_data)); in ipw_bg_qos_activate()
7213 mutex_unlock(&priv->mutex); in ipw_bg_qos_activate()
7221 int active_network = ((priv->status & STATUS_ASSOCIATED) && in ipw_handle_probe_response()
7222 (network == priv->assoc_network)); in ipw_handle_probe_response()
7234 int active_network = ((priv->status & STATUS_ASSOCIATED) && in ipw_handle_beacon()
7235 (network == priv->assoc_network)); in ipw_handle_beacon()
7273 if (priv->config & CFG_FIXED_RATE) in ipw_associate_network()
7274 ipw_set_fixed_rate(priv, network->mode); in ipw_associate_network()
7276 if (!(priv->config & CFG_STATIC_ESSID)) { in ipw_associate_network()
7277 priv->essid_len = min(network->ssid_len, in ipw_associate_network()
7279 memcpy(priv->essid, network->ssid, priv->essid_len); in ipw_associate_network()
7282 network->last_associate = jiffies; in ipw_associate_network()
7284 memset(&priv->assoc_request, 0, sizeof(priv->assoc_request)); in ipw_associate_network()
7285 priv->assoc_request.channel = network->channel; in ipw_associate_network()
7286 priv->assoc_request.auth_key = 0; in ipw_associate_network()
7288 if ((priv->capability & CAP_PRIVACY_ON) && in ipw_associate_network()
7289 (priv->ieee->sec.auth_mode == WLAN_AUTH_SHARED_KEY)) { in ipw_associate_network()
7290 priv->assoc_request.auth_type = AUTH_SHARED_KEY; in ipw_associate_network()
7291 priv->assoc_request.auth_key = priv->ieee->sec.active_key; in ipw_associate_network()
7293 if (priv->ieee->sec.level == SEC_LEVEL_1) in ipw_associate_network()
7296 } else if ((priv->capability & CAP_PRIVACY_ON) && in ipw_associate_network()
7297 (priv->ieee->sec.auth_mode == WLAN_AUTH_LEAP)) in ipw_associate_network()
7298 priv->assoc_request.auth_type = AUTH_LEAP; in ipw_associate_network()
7300 priv->assoc_request.auth_type = AUTH_OPEN; in ipw_associate_network()
7302 if (priv->ieee->wpa_ie_len) { in ipw_associate_network()
7303 priv->assoc_request.policy_support = cpu_to_le16(0x02); /* RSN active */ in ipw_associate_network()
7304 ipw_set_rsn_capa(priv, priv->ieee->wpa_ie, in ipw_associate_network()
7305 priv->ieee->wpa_ie_len); in ipw_associate_network()
7313 if (network->mode & priv->ieee->mode & IEEE_A) in ipw_associate_network()
7314 priv->assoc_request.ieee_mode = IPW_A_MODE; in ipw_associate_network()
7315 else if (network->mode & priv->ieee->mode & IEEE_G) in ipw_associate_network()
7316 priv->assoc_request.ieee_mode = IPW_G_MODE; in ipw_associate_network()
7317 else if (network->mode & priv->ieee->mode & IEEE_B) in ipw_associate_network()
7318 priv->assoc_request.ieee_mode = IPW_B_MODE; in ipw_associate_network()
7320 priv->assoc_request.capability = cpu_to_le16(network->capability); in ipw_associate_network()
7321 if ((network->capability & WLAN_CAPABILITY_SHORT_PREAMBLE) in ipw_associate_network()
7322 && !(priv->config & CFG_PREAMBLE_LONG)) { in ipw_associate_network()
7323 priv->assoc_request.preamble_length = DCT_FLAG_SHORT_PREAMBLE; in ipw_associate_network()
7325 priv->assoc_request.preamble_length = DCT_FLAG_LONG_PREAMBLE; in ipw_associate_network()
7328 priv->assoc_request.capability &= in ipw_associate_network()
7333 if (priv->ieee->iw_mode == IW_MODE_ADHOC) in ipw_associate_network()
7334 priv->assoc_request.capability &= in ipw_associate_network()
7339 priv->essid_len, priv->essid, in ipw_associate_network()
7340 network->channel, in ipw_associate_network()
7341 ipw_modes[priv->assoc_request.ieee_mode], in ipw_associate_network()
7342 rates->num_rates, in ipw_associate_network()
7343 (priv->assoc_request.preamble_length == in ipw_associate_network()
7345 network->capability & in ipw_associate_network()
7347 priv->capability & CAP_PRIVACY_ON ? "on " : "off", in ipw_associate_network()
7348 priv->capability & CAP_PRIVACY_ON ? in ipw_associate_network()
7349 (priv->capability & CAP_SHARED_KEY ? "(shared)" : in ipw_associate_network()
7351 priv->capability & CAP_PRIVACY_ON ? " key=" : "", in ipw_associate_network()
7352 priv->capability & CAP_PRIVACY_ON ? in ipw_associate_network()
7353 '1' + priv->ieee->sec.active_key : '.', in ipw_associate_network()
7354 priv->capability & CAP_PRIVACY_ON ? '.' : ' '); in ipw_associate_network()
7356 priv->assoc_request.beacon_interval = cpu_to_le16(network->beacon_interval); in ipw_associate_network()
7357 if ((priv->ieee->iw_mode == IW_MODE_ADHOC) && in ipw_associate_network()
7358 (network->time_stamp[0] == 0) && (network->time_stamp[1] == 0)) { in ipw_associate_network()
7359 priv->assoc_request.assoc_type = HC_IBSS_START; in ipw_associate_network()
7360 priv->assoc_request.assoc_tsf_msw = 0; in ipw_associate_network()
7361 priv->assoc_request.assoc_tsf_lsw = 0; in ipw_associate_network()
7364 priv->assoc_request.assoc_type = HC_REASSOCIATE; in ipw_associate_network()
7366 priv->assoc_request.assoc_type = HC_ASSOCIATE; in ipw_associate_network()
7367 priv->assoc_request.assoc_tsf_msw = cpu_to_le32(network->time_stamp[1]); in ipw_associate_network()
7368 priv->assoc_request.assoc_tsf_lsw = cpu_to_le32(network->time_stamp[0]); in ipw_associate_network()
7371 memcpy(priv->assoc_request.bssid, network->bssid, ETH_ALEN); in ipw_associate_network()
7373 if (priv->ieee->iw_mode == IW_MODE_ADHOC) { in ipw_associate_network()
7374 eth_broadcast_addr(priv->assoc_request.dest); in ipw_associate_network()
7375 priv->assoc_request.atim_window = cpu_to_le16(network->atim_window); in ipw_associate_network()
7377 memcpy(priv->assoc_request.dest, network->bssid, ETH_ALEN); in ipw_associate_network()
7378 priv->assoc_request.atim_window = 0; in ipw_associate_network()
7381 priv->assoc_request.listen_interval = cpu_to_le16(network->listen_interval); in ipw_associate_network()
7383 err = ipw_send_ssid(priv, priv->essid, priv->essid_len); in ipw_associate_network()
7389 rates->ieee_mode = priv->assoc_request.ieee_mode; in ipw_associate_network()
7390 rates->purpose = IPW_RATE_CONNECT; in ipw_associate_network()
7393 if (priv->assoc_request.ieee_mode == IPW_G_MODE) in ipw_associate_network()
7394 priv->sys_config.dot11g_auto_detection = 1; in ipw_associate_network()
7396 priv->sys_config.dot11g_auto_detection = 0; in ipw_associate_network()
7398 if (priv->ieee->iw_mode == IW_MODE_ADHOC) in ipw_associate_network()
7399 priv->sys_config.answer_broadcast_ssid_probe = 1; in ipw_associate_network()
7401 priv->sys_config.answer_broadcast_ssid_probe = 0; in ipw_associate_network()
7409 IPW_DEBUG_ASSOC("Association sensitivity: %d\n", network->stats.rssi); in ipw_associate_network()
7410 err = ipw_set_sensitivity(priv, network->stats.rssi + IPW_RSSI_TO_DBM); in ipw_associate_network()
7421 priv->channel = network->channel; in ipw_associate_network()
7422 memcpy(priv->bssid, network->bssid, ETH_ALEN); in ipw_associate_network()
7423 priv->status |= STATUS_ASSOCIATING; in ipw_associate_network()
7424 priv->status &= ~STATUS_SECURITY_UPDATED; in ipw_associate_network()
7426 priv->assoc_network = network; in ipw_associate_network()
7432 err = ipw_send_associate(priv, &priv->assoc_request); in ipw_associate_network()
7439 priv->essid_len, priv->essid, priv->bssid); in ipw_associate_network()
7449 .network = priv->assoc_network in ipw_roam()
7472 if (!(priv->status & (STATUS_ASSOCIATED | STATUS_ROAMING))) in ipw_roam()
7475 if (priv->status & STATUS_ASSOCIATED) { in ipw_roam()
7476 /* First pass through ROAM process -- look for a better in ipw_roam()
7479 u8 rssi = priv->assoc_network->stats.rssi; in ipw_roam()
7480 priv->assoc_network->stats.rssi = -128; in ipw_roam()
7481 spin_lock_irqsave(&priv->ieee->lock, flags); in ipw_roam()
7482 list_for_each_entry(network, &priv->ieee->network_list, list) { in ipw_roam()
7483 if (network != priv->assoc_network) in ipw_roam()
7486 spin_unlock_irqrestore(&priv->ieee->lock, flags); in ipw_roam()
7487 priv->assoc_network->stats.rssi = rssi; in ipw_roam()
7489 if (match.network == priv->assoc_network) { in ipw_roam()
7492 priv->status &= ~STATUS_ROAMING; in ipw_roam()
7498 priv->assoc_network = match.network; in ipw_roam()
7503 /* Second pass through ROAM process -- request association */ in ipw_roam()
7504 ipw_compatible_rates(priv, priv->assoc_network, &match.rates); in ipw_roam()
7505 ipw_associate_network(priv, priv->assoc_network, &match.rates, 1); in ipw_roam()
7506 priv->status &= ~STATUS_ROAMING; in ipw_roam()
7513 mutex_lock(&priv->mutex); in ipw_bg_roam()
7515 mutex_unlock(&priv->mutex); in ipw_bg_roam()
7530 if (priv->ieee->iw_mode == IW_MODE_MONITOR) { in ipw_associate()
7535 if (priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING)) { in ipw_associate()
7541 if (priv->status & STATUS_DISASSOCIATING) { in ipw_associate()
7543 schedule_work(&priv->associate); in ipw_associate()
7547 if (!ipw_is_init(priv) || (priv->status & STATUS_SCANNING)) { in ipw_associate()
7553 if (!(priv->config & CFG_ASSOCIATE) && in ipw_associate()
7554 !(priv->config & (CFG_STATIC_ESSID | CFG_STATIC_BSSID))) { in ipw_associate()
7560 spin_lock_irqsave(&priv->ieee->lock, flags); in ipw_associate()
7561 list_for_each_entry(network, &priv->ieee->network_list, list) in ipw_associate()
7568 priv->ieee->iw_mode == IW_MODE_ADHOC && in ipw_associate()
7569 priv->config & CFG_ADHOC_CREATE && in ipw_associate()
7570 priv->config & CFG_STATIC_ESSID && in ipw_associate()
7571 priv->config & CFG_STATIC_CHANNEL) { in ipw_associate()
7573 if (list_empty(&priv->ieee->network_free_list)) { in ipw_associate()
7577 list_for_each_entry(target, &priv->ieee->network_list, list) { in ipw_associate()
7579 (target->last_scanned < oldest->last_scanned)) in ipw_associate()
7584 list_del(&oldest->list); in ipw_associate()
7587 target->ssid_len, target->ssid, in ipw_associate()
7588 target->bssid); in ipw_associate()
7589 list_add_tail(&target->list, in ipw_associate()
7590 &priv->ieee->network_free_list); in ipw_associate()
7593 element = priv->ieee->network_free_list.next; in ipw_associate()
7596 rates = &priv->rates; in ipw_associate()
7598 list_add_tail(&network->list, &priv->ieee->network_list); in ipw_associate()
7600 spin_unlock_irqrestore(&priv->ieee->lock, flags); in ipw_associate()
7607 if (!(priv->status & STATUS_SCANNING)) { in ipw_associate()
7608 if (!(priv->config & CFG_SPEED_SCAN)) in ipw_associate()
7609 schedule_delayed_work(&priv->request_scan, in ipw_associate()
7612 schedule_delayed_work(&priv->request_scan, 0); in ipw_associate()
7627 mutex_lock(&priv->mutex); in ipw_bg_associate()
7629 mutex_unlock(&priv->mutex); in ipw_bg_associate()
7638 hdr = (struct ieee80211_hdr *)skb->data; in ipw_rebuild_decrypted_skb()
7639 fc = le16_to_cpu(hdr->frame_control); in ipw_rebuild_decrypted_skb()
7644 hdr->frame_control = cpu_to_le16(fc); in ipw_rebuild_decrypted_skb()
7645 switch (priv->ieee->sec.level) { in ipw_rebuild_decrypted_skb()
7648 memmove(skb->data + LIBIPW_3ADDR_LEN, in ipw_rebuild_decrypted_skb()
7649 skb->data + LIBIPW_3ADDR_LEN + 8, in ipw_rebuild_decrypted_skb()
7650 skb->len - LIBIPW_3ADDR_LEN - 8); in ipw_rebuild_decrypted_skb()
7651 skb_trim(skb, skb->len - 16); /* CCMP_HDR_LEN + CCMP_MIC_LEN */ in ipw_rebuild_decrypted_skb()
7657 memmove(skb->data + LIBIPW_3ADDR_LEN, in ipw_rebuild_decrypted_skb()
7658 skb->data + LIBIPW_3ADDR_LEN + 4, in ipw_rebuild_decrypted_skb()
7659 skb->len - LIBIPW_3ADDR_LEN - 4); in ipw_rebuild_decrypted_skb()
7660 skb_trim(skb, skb->len - 8); /* IV + ICV */ in ipw_rebuild_decrypted_skb()
7666 priv->ieee->sec.level); in ipw_rebuild_decrypted_skb()
7675 struct net_device *dev = priv->net_dev; in ipw_handle_data_packet()
7677 struct ipw_rx_packet *pkt = (struct ipw_rx_packet *)rxb->skb->data; in ipw_handle_data_packet()
7684 if (unlikely((le16_to_cpu(pkt->u.frame.length) + IPW_RX_FRAME_SIZE) > in ipw_handle_data_packet()
7685 skb_tailroom(rxb->skb))) { in ipw_handle_data_packet()
7686 dev->stats.rx_errors++; in ipw_handle_data_packet()
7687 priv->wstats.discard.misc++; in ipw_handle_data_packet()
7690 } else if (unlikely(!netif_running(priv->net_dev))) { in ipw_handle_data_packet()
7691 dev->stats.rx_dropped++; in ipw_handle_data_packet()
7692 priv->wstats.discard.misc++; in ipw_handle_data_packet()
7697 /* Advance skb->data to the start of the actual payload */ in ipw_handle_data_packet()
7698 skb_reserve(rxb->skb, offsetof(struct ipw_rx_packet, u.frame.data)); in ipw_handle_data_packet()
7701 skb_put(rxb->skb, le16_to_cpu(pkt->u.frame.length)); in ipw_handle_data_packet()
7703 IPW_DEBUG_RX("Rx packet of %d bytes.\n", rxb->skb->len); in ipw_handle_data_packet()
7706 hdr = (struct libipw_hdr_4addr *)rxb->skb->data; in ipw_handle_data_packet()
7707 if (priv->ieee->iw_mode != IW_MODE_MONITOR && in ipw_handle_data_packet()
7708 (is_multicast_ether_addr(hdr->addr1) ? in ipw_handle_data_packet()
7709 !priv->ieee->host_mc_decrypt : !priv->ieee->host_decrypt)) in ipw_handle_data_packet()
7710 ipw_rebuild_decrypted_skb(priv, rxb->skb); in ipw_handle_data_packet()
7712 if (!libipw_rx(priv->ieee, rxb->skb, stats)) in ipw_handle_data_packet()
7713 dev->stats.rx_errors++; in ipw_handle_data_packet()
7715 rxb->skb = NULL; in ipw_handle_data_packet()
7725 struct net_device *dev = priv->net_dev; in ipw_handle_data_packet_monitor()
7726 struct ipw_rx_packet *pkt = (struct ipw_rx_packet *)rxb->skb->data; in ipw_handle_data_packet_monitor()
7727 struct ipw_rx_frame *frame = &pkt->u.frame; in ipw_handle_data_packet_monitor()
7730 u16 received_channel = frame->received_channel; in ipw_handle_data_packet_monitor()
7731 u8 antennaAndPhy = frame->antennaAndPhy; in ipw_handle_data_packet_monitor()
7732 s8 antsignal = frame->rssi_dbm - IPW_RSSI_TO_DBM; /* call it signed anyhow */ in ipw_handle_data_packet_monitor()
7733 u16 pktrate = frame->rate; in ipw_handle_data_packet_monitor()
7735 /* Magic struct that slots into the radiotap header -- no reason in ipw_handle_data_packet_monitor()
7740 unsigned short len = le16_to_cpu(pkt->u.frame.length); in ipw_handle_data_packet_monitor()
7747 if (unlikely((le16_to_cpu(pkt->u.frame.length) + IPW_RX_FRAME_SIZE) > in ipw_handle_data_packet_monitor()
7748 skb_tailroom(rxb->skb))) { in ipw_handle_data_packet_monitor()
7749 dev->stats.rx_errors++; in ipw_handle_data_packet_monitor()
7750 priv->wstats.discard.misc++; in ipw_handle_data_packet_monitor()
7753 } else if (unlikely(!netif_running(priv->net_dev))) { in ipw_handle_data_packet_monitor()
7754 dev->stats.rx_dropped++; in ipw_handle_data_packet_monitor()
7755 priv->wstats.discard.misc++; in ipw_handle_data_packet_monitor()
7762 if (len > IPW_RX_BUF_SIZE - sizeof(struct ipw_rt_hdr)) { in ipw_handle_data_packet_monitor()
7764 dev->stats.rx_dropped++; in ipw_handle_data_packet_monitor()
7765 priv->wstats.discard.misc++; in ipw_handle_data_packet_monitor()
7771 memmove(rxb->skb->data + sizeof(struct ipw_rt_hdr), in ipw_handle_data_packet_monitor()
7772 rxb->skb->data + IPW_RX_FRAME_SIZE, len); in ipw_handle_data_packet_monitor()
7774 ipw_rt = (struct ipw_rt_hdr *)rxb->skb->data; in ipw_handle_data_packet_monitor()
7776 ipw_rt->rt_hdr.it_version = PKTHDR_RADIOTAP_VERSION; in ipw_handle_data_packet_monitor()
7777 ipw_rt->rt_hdr.it_pad = 0; /* always good to zero */ in ipw_handle_data_packet_monitor()
7778 ipw_rt->rt_hdr.it_len = cpu_to_le16(sizeof(struct ipw_rt_hdr)); /* total header+data */ in ipw_handle_data_packet_monitor()
7781 ipw_rt->rt_hdr.it_present = cpu_to_le32( in ipw_handle_data_packet_monitor()
7791 ipw_rt->rt_flags = 0; in ipw_handle_data_packet_monitor()
7792 ipw_rt->rt_tsf = (u64)(frame->parent_tsf[3] << 24 | in ipw_handle_data_packet_monitor()
7793 frame->parent_tsf[2] << 16 | in ipw_handle_data_packet_monitor()
7794 frame->parent_tsf[1] << 8 | in ipw_handle_data_packet_monitor()
7795 frame->parent_tsf[0]); in ipw_handle_data_packet_monitor()
7798 ipw_rt->rt_dbmsignal = antsignal; in ipw_handle_data_packet_monitor()
7799 ipw_rt->rt_dbmnoise = (s8) le16_to_cpu(frame->noise); in ipw_handle_data_packet_monitor()
7802 ipw_rt->rt_channel = cpu_to_le16(ieee80211chan2mhz(received_channel)); in ipw_handle_data_packet_monitor()
7804 ipw_rt->rt_chbitmask = in ipw_handle_data_packet_monitor()
7807 ipw_rt->rt_chbitmask = in ipw_handle_data_packet_monitor()
7810 ipw_rt->rt_chbitmask = in ipw_handle_data_packet_monitor()
7817 ipw_rt->rt_rate = 2; in ipw_handle_data_packet_monitor()
7820 ipw_rt->rt_rate = 4; in ipw_handle_data_packet_monitor()
7823 ipw_rt->rt_rate = 10; in ipw_handle_data_packet_monitor()
7826 ipw_rt->rt_rate = 12; in ipw_handle_data_packet_monitor()
7829 ipw_rt->rt_rate = 18; in ipw_handle_data_packet_monitor()
7832 ipw_rt->rt_rate = 22; in ipw_handle_data_packet_monitor()
7835 ipw_rt->rt_rate = 24; in ipw_handle_data_packet_monitor()
7838 ipw_rt->rt_rate = 36; in ipw_handle_data_packet_monitor()
7841 ipw_rt->rt_rate = 48; in ipw_handle_data_packet_monitor()
7844 ipw_rt->rt_rate = 72; in ipw_handle_data_packet_monitor()
7847 ipw_rt->rt_rate = 96; in ipw_handle_data_packet_monitor()
7850 ipw_rt->rt_rate = 108; in ipw_handle_data_packet_monitor()
7853 ipw_rt->rt_rate = 0; in ipw_handle_data_packet_monitor()
7858 ipw_rt->rt_antenna = (antennaAndPhy & 3); /* Is this right? */ in ipw_handle_data_packet_monitor()
7862 ipw_rt->rt_flags |= IEEE80211_RADIOTAP_F_SHORTPRE; in ipw_handle_data_packet_monitor()
7865 skb_put(rxb->skb, len + sizeof(struct ipw_rt_hdr)); in ipw_handle_data_packet_monitor()
7867 IPW_DEBUG_RX("Rx packet of %d bytes.\n", rxb->skb->len); in ipw_handle_data_packet_monitor()
7869 if (!libipw_rx(priv->ieee, rxb->skb, stats)) in ipw_handle_data_packet_monitor()
7870 dev->stats.rx_errors++; in ipw_handle_data_packet_monitor()
7872 rxb->skb = NULL; in ipw_handle_data_packet_monitor()
7902 struct net_device *dev = priv->prom_net_dev; in ipw_handle_promiscuous_rx()
7903 struct ipw_rx_packet *pkt = (struct ipw_rx_packet *)rxb->skb->data; in ipw_handle_promiscuous_rx()
7904 struct ipw_rx_frame *frame = &pkt->u.frame; in ipw_handle_promiscuous_rx()
7910 u16 channel = frame->received_channel; in ipw_handle_promiscuous_rx()
7911 u8 phy_flags = frame->antennaAndPhy; in ipw_handle_promiscuous_rx()
7912 s8 signal = frame->rssi_dbm - IPW_RSSI_TO_DBM; in ipw_handle_promiscuous_rx()
7913 s8 noise = (s8) le16_to_cpu(frame->noise); in ipw_handle_promiscuous_rx()
7914 u8 rate = frame->rate; in ipw_handle_promiscuous_rx()
7915 unsigned short len = le16_to_cpu(pkt->u.frame.length); in ipw_handle_promiscuous_rx()
7918 u16 filter = priv->prom_priv->filter; in ipw_handle_promiscuous_rx()
7927 if (unlikely((len + IPW_RX_FRAME_SIZE) > skb_tailroom(rxb->skb))) { in ipw_handle_promiscuous_rx()
7928 dev->stats.rx_errors++; in ipw_handle_promiscuous_rx()
7935 dev->stats.rx_dropped++; in ipw_handle_promiscuous_rx()
7942 if (len > IPW_RX_BUF_SIZE - sizeof(struct ipw_rt_hdr)) { in ipw_handle_promiscuous_rx()
7944 dev->stats.rx_dropped++; in ipw_handle_promiscuous_rx()
7949 hdr = (void *)rxb->skb->data + IPW_RX_FRAME_SIZE; in ipw_handle_promiscuous_rx()
7950 if (libipw_is_management(le16_to_cpu(hdr->frame_control))) { in ipw_handle_promiscuous_rx()
7955 } else if (libipw_is_control(le16_to_cpu(hdr->frame_control))) { in ipw_handle_promiscuous_rx()
7960 } else if (libipw_is_data(le16_to_cpu(hdr->frame_control))) { in ipw_handle_promiscuous_rx()
7968 skb = skb_copy(rxb->skb, GFP_ATOMIC); in ipw_handle_promiscuous_rx()
7975 ipw_rt = (void *)skb->data; in ipw_handle_promiscuous_rx()
7978 len = libipw_get_hdrlen(le16_to_cpu(hdr->frame_control)); in ipw_handle_promiscuous_rx()
7980 memcpy(ipw_rt->payload, hdr, len); in ipw_handle_promiscuous_rx()
7982 ipw_rt->rt_hdr.it_version = PKTHDR_RADIOTAP_VERSION; in ipw_handle_promiscuous_rx()
7983 ipw_rt->rt_hdr.it_pad = 0; /* always good to zero */ in ipw_handle_promiscuous_rx()
7984 ipw_rt->rt_hdr.it_len = cpu_to_le16(sizeof(*ipw_rt)); /* total header+data */ in ipw_handle_promiscuous_rx()
7990 ipw_rt->rt_hdr.it_present = cpu_to_le32( in ipw_handle_promiscuous_rx()
8000 ipw_rt->rt_flags = 0; in ipw_handle_promiscuous_rx()
8001 ipw_rt->rt_tsf = (u64)(frame->parent_tsf[3] << 24 | in ipw_handle_promiscuous_rx()
8002 frame->parent_tsf[2] << 16 | in ipw_handle_promiscuous_rx()
8003 frame->parent_tsf[1] << 8 | in ipw_handle_promiscuous_rx()
8004 frame->parent_tsf[0]); in ipw_handle_promiscuous_rx()
8007 ipw_rt->rt_dbmsignal = signal; in ipw_handle_promiscuous_rx()
8008 ipw_rt->rt_dbmnoise = noise; in ipw_handle_promiscuous_rx()
8011 ipw_rt->rt_channel = cpu_to_le16(ieee80211chan2mhz(channel)); in ipw_handle_promiscuous_rx()
8013 ipw_rt->rt_chbitmask = in ipw_handle_promiscuous_rx()
8016 ipw_rt->rt_chbitmask = in ipw_handle_promiscuous_rx()
8019 ipw_rt->rt_chbitmask = in ipw_handle_promiscuous_rx()
8026 ipw_rt->rt_rate = 2; in ipw_handle_promiscuous_rx()
8029 ipw_rt->rt_rate = 4; in ipw_handle_promiscuous_rx()
8032 ipw_rt->rt_rate = 10; in ipw_handle_promiscuous_rx()
8035 ipw_rt->rt_rate = 12; in ipw_handle_promiscuous_rx()
8038 ipw_rt->rt_rate = 18; in ipw_handle_promiscuous_rx()
8041 ipw_rt->rt_rate = 22; in ipw_handle_promiscuous_rx()
8044 ipw_rt->rt_rate = 24; in ipw_handle_promiscuous_rx()
8047 ipw_rt->rt_rate = 36; in ipw_handle_promiscuous_rx()
8050 ipw_rt->rt_rate = 48; in ipw_handle_promiscuous_rx()
8053 ipw_rt->rt_rate = 72; in ipw_handle_promiscuous_rx()
8056 ipw_rt->rt_rate = 96; in ipw_handle_promiscuous_rx()
8059 ipw_rt->rt_rate = 108; in ipw_handle_promiscuous_rx()
8062 ipw_rt->rt_rate = 0; in ipw_handle_promiscuous_rx()
8067 ipw_rt->rt_antenna = (phy_flags & 3); in ipw_handle_promiscuous_rx()
8071 ipw_rt->rt_flags |= IEEE80211_RADIOTAP_F_SHORTPRE; in ipw_handle_promiscuous_rx()
8073 IPW_DEBUG_RX("Rx packet of %d bytes.\n", skb->len); in ipw_handle_promiscuous_rx()
8075 if (!libipw_rx(priv->prom_priv->ieee, skb, stats)) { in ipw_handle_promiscuous_rx()
8076 dev->stats.rx_errors++; in ipw_handle_promiscuous_rx()
8087 switch (priv->ieee->iw_mode) { in is_network_packet()
8090 if (ether_addr_equal(header->addr2, priv->net_dev->dev_addr)) in is_network_packet()
8094 if (is_multicast_ether_addr(header->addr1)) in is_network_packet()
8095 return ether_addr_equal(header->addr3, priv->bssid); in is_network_packet()
8098 return ether_addr_equal(header->addr1, in is_network_packet()
8099 priv->net_dev->dev_addr); in is_network_packet()
8103 if (ether_addr_equal(header->addr3, priv->net_dev->dev_addr)) in is_network_packet()
8107 if (is_multicast_ether_addr(header->addr1)) in is_network_packet()
8108 return ether_addr_equal(header->addr2, priv->bssid); in is_network_packet()
8111 return ether_addr_equal(header->addr1, in is_network_packet()
8112 priv->net_dev->dev_addr); in is_network_packet()
8123 u16 sc = le16_to_cpu(header->seq_ctl); in is_duplicate_packet()
8129 switch (priv->ieee->iw_mode) { in is_duplicate_packet()
8134 u8 *mac = header->addr2; in is_duplicate_packet()
8137 list_for_each(p, &priv->ibss_mac_hash[index]) { in is_duplicate_packet()
8140 if (ether_addr_equal(entry->mac, mac)) in is_duplicate_packet()
8143 if (p == &priv->ibss_mac_hash[index]) { in is_duplicate_packet()
8150 memcpy(entry->mac, mac, ETH_ALEN); in is_duplicate_packet()
8151 entry->seq_num = seq; in is_duplicate_packet()
8152 entry->frag_num = frag; in is_duplicate_packet()
8153 entry->packet_time = jiffies; in is_duplicate_packet()
8154 list_add(&entry->list, in is_duplicate_packet()
8155 &priv->ibss_mac_hash[index]); in is_duplicate_packet()
8158 last_seq = &entry->seq_num; in is_duplicate_packet()
8159 last_frag = &entry->frag_num; in is_duplicate_packet()
8160 last_time = &entry->packet_time; in is_duplicate_packet()
8164 last_seq = &priv->last_seq_num; in is_duplicate_packet()
8165 last_frag = &priv->last_frag_num; in is_duplicate_packet()
8166 last_time = &priv->last_packet_time; in is_duplicate_packet()
8176 /* out-of-order fragment */ in is_duplicate_packet()
8189 BUG_ON(!(le16_to_cpu(header->frame_control) & IEEE80211_FCTL_RETRY)); */ in is_duplicate_packet()
8197 struct sk_buff *skb = rxb->skb; in ipw_handle_mgmt_packet()
8198 struct ipw_rx_packet *pkt = (struct ipw_rx_packet *)skb->data; in ipw_handle_mgmt_packet()
8200 (skb->data + IPW_RX_FRAME_SIZE); in ipw_handle_mgmt_packet()
8202 libipw_rx_mgt(priv->ieee, header, stats); in ipw_handle_mgmt_packet()
8204 if (priv->ieee->iw_mode == IW_MODE_ADHOC && in ipw_handle_mgmt_packet()
8205 ((WLAN_FC_GET_STYPE(le16_to_cpu(header->frame_ctl)) == in ipw_handle_mgmt_packet()
8207 (WLAN_FC_GET_STYPE(le16_to_cpu(header->frame_ctl)) == in ipw_handle_mgmt_packet()
8209 if (ether_addr_equal(header->addr3, priv->bssid)) in ipw_handle_mgmt_packet()
8210 ipw_add_station(priv, header->addr2); in ipw_handle_mgmt_packet()
8213 if (priv->config & CFG_NET_STATS) { in ipw_handle_mgmt_packet()
8218 skb_put(skb, le16_to_cpu(pkt->u.frame.length) + in ipw_handle_mgmt_packet()
8227 skb->dev = priv->ieee->dev; in ipw_handle_mgmt_packet()
8232 skb->pkt_type = PACKET_OTHERHOST; in ipw_handle_mgmt_packet()
8233 skb->protocol = cpu_to_be16(ETH_P_80211_STATS); in ipw_handle_mgmt_packet()
8234 memset(skb->cb, 0, sizeof(rxb->skb->cb)); in ipw_handle_mgmt_packet()
8236 rxb->skb = NULL; in ipw_handle_mgmt_packet()
8256 i = priv->rxq->read; in ipw_rx()
8258 if (ipw_rx_queue_space (priv->rxq) > (RX_QUEUE_SIZE / 2)) in ipw_rx()
8262 rxb = priv->rxq->queue[i]; in ipw_rx()
8267 priv->rxq->queue[i] = NULL; in ipw_rx()
8269 dma_sync_single_for_cpu(&priv->pci_dev->dev, rxb->dma_addr, in ipw_rx()
8272 pkt = (struct ipw_rx_packet *)rxb->skb->data; in ipw_rx()
8274 pkt->header.message_type, in ipw_rx()
8275 pkt->header.rx_seq_num, pkt->header.control_bits); in ipw_rx()
8277 switch (pkt->header.message_type) { in ipw_rx()
8280 .rssi = pkt->u.frame.rssi_dbm - in ipw_rx()
8283 pkt->u.frame.rssi_dbm - in ipw_rx()
8286 le16_to_cpu(pkt->u.frame.noise), in ipw_rx()
8287 .rate = pkt->u.frame.rate, in ipw_rx()
8290 pkt->u.frame.received_channel, in ipw_rx()
8292 (pkt->u.frame. in ipw_rx()
8296 .len = le16_to_cpu(pkt->u.frame.length), in ipw_rx()
8308 priv->rx_packets++; in ipw_rx()
8311 if (priv->prom_net_dev && netif_running(priv->prom_net_dev)) in ipw_rx()
8316 if (priv->ieee->iw_mode == IW_MODE_MONITOR) { in ipw_rx()
8331 (struct libipw_hdr_4addr *)(rxb->skb-> in ipw_rx()
8334 /* TODO: Check Ad-Hoc dest/source and make sure in ipw_rx()
8336 * correctly -- we should probably use the in ipw_rx()
8342 if (network_packet && priv->assoc_network) { in ipw_rx()
8343 priv->assoc_network->stats.rssi = in ipw_rx()
8345 priv->exp_avg_rssi = in ipw_rx()
8346 exponential_average(priv->exp_avg_rssi, in ipw_rx()
8351 le16_to_cpu(pkt->u.frame.length)); in ipw_rx()
8353 if (le16_to_cpu(pkt->u.frame.length) < in ipw_rx()
8355 header->frame_ctl))) { in ipw_rx()
8359 priv->net_dev->stats.rx_errors++; in ipw_rx()
8360 priv->wstats.discard.misc++; in ipw_rx()
8365 (le16_to_cpu(header->frame_ctl))) { in ipw_rx()
8384 header->addr1, in ipw_rx()
8385 header->addr2, in ipw_rx()
8386 header->addr3); in ipw_rx()
8401 pkt->u.notification.subtype, in ipw_rx()
8402 pkt->u.notification.flags, in ipw_rx()
8403 le16_to_cpu(pkt->u.notification.size)); in ipw_rx()
8404 ipw_rx_notification(priv, &pkt->u.notification); in ipw_rx()
8410 pkt->header.message_type); in ipw_rx()
8414 /* For now we just don't re-use anything. We can tweak this in ipw_rx()
8415 * later to try and re-use notification packets and SKBs that in ipw_rx()
8417 if (rxb->skb != NULL) { in ipw_rx()
8418 dev_kfree_skb_any(rxb->skb); in ipw_rx()
8419 rxb->skb = NULL; in ipw_rx()
8422 dma_unmap_single(&priv->pci_dev->dev, rxb->dma_addr, in ipw_rx()
8424 list_add_tail(&rxb->list, &priv->rxq->rx_used); in ipw_rx()
8431 priv->rxq->read = i; in ipw_rx()
8437 priv->rxq->read = i; in ipw_rx()
8458 int old_mode = priv->ieee->iw_mode; in ipw_sw_reset()
8461 priv->config = 0; in ipw_sw_reset()
8466 priv->config |= CFG_NO_LED; in ipw_sw_reset()
8469 priv->config |= CFG_ASSOCIATE; in ipw_sw_reset()
8474 priv->config |= CFG_ADHOC_CREATE; in ipw_sw_reset()
8478 priv->config &= ~CFG_STATIC_ESSID; in ipw_sw_reset()
8479 priv->essid_len = 0; in ipw_sw_reset()
8480 memset(priv->essid, 0, IW_ESSID_MAX_SIZE); in ipw_sw_reset()
8483 priv->status |= STATUS_RF_KILL_SW; in ipw_sw_reset()
8488 priv->config |= CFG_STATIC_CHANNEL; in ipw_sw_reset()
8489 priv->channel = default_channel; in ipw_sw_reset()
8500 priv->ieee->iw_mode = IW_MODE_ADHOC; in ipw_sw_reset()
8501 priv->net_dev->type = ARPHRD_ETHER; in ipw_sw_reset()
8506 priv->ieee->iw_mode = IW_MODE_MONITOR; in ipw_sw_reset()
8508 priv->net_dev->type = ARPHRD_IEEE80211_RADIOTAP; in ipw_sw_reset()
8510 priv->net_dev->type = ARPHRD_IEEE80211; in ipw_sw_reset()
8516 priv->net_dev->type = ARPHRD_ETHER; in ipw_sw_reset()
8517 priv->ieee->iw_mode = IW_MODE_INFRA; in ipw_sw_reset()
8522 priv->ieee->host_encrypt = 0; in ipw_sw_reset()
8523 priv->ieee->host_encrypt_msdu = 0; in ipw_sw_reset()
8524 priv->ieee->host_decrypt = 0; in ipw_sw_reset()
8525 priv->ieee->host_mc_decrypt = 0; in ipw_sw_reset()
8530 priv->ieee->host_open_frag = 0; in ipw_sw_reset()
8532 if ((priv->pci_dev->device == 0x4223) || in ipw_sw_reset()
8533 (priv->pci_dev->device == 0x4224)) { in ipw_sw_reset()
8538 priv->ieee->abg_true = 1; in ipw_sw_reset()
8542 priv->adapter = IPW_2915ABG; in ipw_sw_reset()
8543 priv->ieee->mode = IEEE_A | IEEE_G | IEEE_B; in ipw_sw_reset()
8550 priv->ieee->abg_true = 0; in ipw_sw_reset()
8554 priv->adapter = IPW_2200BG; in ipw_sw_reset()
8555 priv->ieee->mode = IEEE_G | IEEE_B; in ipw_sw_reset()
8558 priv->ieee->freq_band = band; in ipw_sw_reset()
8559 priv->ieee->modulation = modulation; in ipw_sw_reset()
8561 priv->rates_mask = LIBIPW_DEFAULT_RATES_MASK; in ipw_sw_reset()
8563 priv->disassociate_threshold = IPW_MB_DISASSOCIATE_THRESHOLD_DEFAULT; in ipw_sw_reset()
8564 priv->roaming_threshold = IPW_MB_ROAMING_THRESHOLD_DEFAULT; in ipw_sw_reset()
8566 priv->rts_threshold = DEFAULT_RTS_THRESHOLD; in ipw_sw_reset()
8567 priv->short_retry_limit = DEFAULT_SHORT_RETRY_LIMIT; in ipw_sw_reset()
8568 priv->long_retry_limit = DEFAULT_LONG_RETRY_LIMIT; in ipw_sw_reset()
8571 priv->power_mode = IPW_POWER_AC; in ipw_sw_reset()
8572 priv->tx_power = IPW_TX_POWER_DEFAULT; in ipw_sw_reset()
8574 return old_mode == priv->ieee->iw_mode; in ipw_sw_reset()
8591 priv->config &= ~CFG_STATIC_CHANNEL; in ipw_set_channel()
8598 priv->config |= CFG_STATIC_CHANNEL; in ipw_set_channel()
8600 if (priv->channel == channel) { in ipw_set_channel()
8607 priv->channel = channel; in ipw_set_channel()
8610 if (priv->ieee->iw_mode == IW_MODE_MONITOR) { in ipw_set_channel()
8612 if (priv->status & STATUS_SCANNING) { in ipw_set_channel()
8618 for (i = 1000; i && (priv->status & STATUS_SCANNING); i--) in ipw_set_channel()
8621 if (priv->status & STATUS_SCANNING) in ipw_set_channel()
8625 1000 - i); in ipw_set_channel()
8631 /* Network configuration changed -- force [re]association */ in ipw_set_channel()
8644 const struct libipw_geo *geo = libipw_get_geo(priv->ieee); in ipw_wx_set_freq()
8645 struct iw_freq *fwrq = &wrqu->freq; in ipw_wx_set_freq()
8650 if (fwrq->m == 0) { in ipw_wx_set_freq()
8651 IPW_DEBUG_WX("SET Freq/Channel -> any\n"); in ipw_wx_set_freq()
8652 mutex_lock(&priv->mutex); in ipw_wx_set_freq()
8654 mutex_unlock(&priv->mutex); in ipw_wx_set_freq()
8658 if (fwrq->e == 1) { in ipw_wx_set_freq()
8659 channel = libipw_freq_to_channel(priv->ieee, fwrq->m); in ipw_wx_set_freq()
8661 return -EINVAL; in ipw_wx_set_freq()
8663 channel = fwrq->m; in ipw_wx_set_freq()
8665 if (!(band = libipw_is_valid_channel(priv->ieee, channel))) in ipw_wx_set_freq()
8666 return -EINVAL; in ipw_wx_set_freq()
8668 if (priv->ieee->iw_mode == IW_MODE_ADHOC) { in ipw_wx_set_freq()
8669 i = libipw_channel_to_index(priv->ieee, channel); in ipw_wx_set_freq()
8670 if (i == -1) in ipw_wx_set_freq()
8671 return -EINVAL; in ipw_wx_set_freq()
8674 geo->bg[i].flags : geo->a[i].flags; in ipw_wx_set_freq()
8676 IPW_DEBUG_WX("Invalid Ad-Hoc channel for 802.11a\n"); in ipw_wx_set_freq()
8677 return -EINVAL; in ipw_wx_set_freq()
8681 IPW_DEBUG_WX("SET Freq/Channel -> %d\n", fwrq->m); in ipw_wx_set_freq()
8682 mutex_lock(&priv->mutex); in ipw_wx_set_freq()
8684 mutex_unlock(&priv->mutex); in ipw_wx_set_freq()
8694 wrqu->freq.e = 0; in ipw_wx_get_freq()
8698 mutex_lock(&priv->mutex); in ipw_wx_get_freq()
8699 if (priv->config & CFG_STATIC_CHANNEL || in ipw_wx_get_freq()
8700 priv->status & (STATUS_ASSOCIATING | STATUS_ASSOCIATED)) { in ipw_wx_get_freq()
8703 i = libipw_channel_to_index(priv->ieee, priv->channel); in ipw_wx_get_freq()
8704 BUG_ON(i == -1); in ipw_wx_get_freq()
8705 wrqu->freq.e = 1; in ipw_wx_get_freq()
8707 switch (libipw_is_valid_channel(priv->ieee, priv->channel)) { in ipw_wx_get_freq()
8709 wrqu->freq.m = priv->ieee->geo.a[i].freq * 100000; in ipw_wx_get_freq()
8713 wrqu->freq.m = priv->ieee->geo.bg[i].freq * 100000; in ipw_wx_get_freq()
8720 wrqu->freq.m = 0; in ipw_wx_get_freq()
8722 mutex_unlock(&priv->mutex); in ipw_wx_get_freq()
8723 IPW_DEBUG_WX("GET Freq/Channel -> %d\n", priv->channel); in ipw_wx_get_freq()
8734 IPW_DEBUG_WX("Set MODE: %d\n", wrqu->mode); in ipw_wx_set_mode()
8736 switch (wrqu->mode) { in ipw_wx_set_mode()
8744 wrqu->mode = IW_MODE_INFRA; in ipw_wx_set_mode()
8747 return -EINVAL; in ipw_wx_set_mode()
8749 if (wrqu->mode == priv->ieee->iw_mode) in ipw_wx_set_mode()
8752 mutex_lock(&priv->mutex); in ipw_wx_set_mode()
8757 if (priv->ieee->iw_mode == IW_MODE_MONITOR) in ipw_wx_set_mode()
8758 priv->net_dev->type = ARPHRD_ETHER; in ipw_wx_set_mode()
8760 if (wrqu->mode == IW_MODE_MONITOR) in ipw_wx_set_mode()
8762 priv->net_dev->type = ARPHRD_IEEE80211_RADIOTAP; in ipw_wx_set_mode()
8764 priv->net_dev->type = ARPHRD_IEEE80211; in ipw_wx_set_mode()
8772 priv->ieee->iw_mode = wrqu->mode; in ipw_wx_set_mode()
8774 schedule_work(&priv->adapter_restart); in ipw_wx_set_mode()
8775 mutex_unlock(&priv->mutex); in ipw_wx_set_mode()
8784 mutex_lock(&priv->mutex); in ipw_wx_get_mode()
8785 wrqu->mode = priv->ieee->iw_mode; in ipw_wx_get_mode()
8786 IPW_DEBUG_WX("Get MODE -> %d\n", wrqu->mode); in ipw_wx_get_mode()
8787 mutex_unlock(&priv->mutex); in ipw_wx_get_mode()
8814 const struct libipw_geo *geo = libipw_get_geo(priv->ieee); in ipw_wx_get_range()
8817 wrqu->data.length = sizeof(*range); in ipw_wx_get_range()
8821 range->throughput = 27 * 1000 * 1000; in ipw_wx_get_range()
8823 range->max_qual.qual = 100; in ipw_wx_get_range()
8825 range->max_qual.level = 0; in ipw_wx_get_range()
8826 range->max_qual.noise = 0; in ipw_wx_get_range()
8827 range->max_qual.updated = 7; /* Updated all three */ in ipw_wx_get_range()
8829 range->avg_qual.qual = 70; in ipw_wx_get_range()
8831 range->avg_qual.level = 0; /* FIXME to real average level */ in ipw_wx_get_range()
8832 range->avg_qual.noise = 0; in ipw_wx_get_range()
8833 range->avg_qual.updated = 7; /* Updated all three */ in ipw_wx_get_range()
8834 mutex_lock(&priv->mutex); in ipw_wx_get_range()
8835 range->num_bitrates = min(priv->rates.num_rates, (u8) IW_MAX_BITRATES); in ipw_wx_get_range()
8837 for (i = 0; i < range->num_bitrates; i++) in ipw_wx_get_range()
8838 range->bitrate[i] = (priv->rates.supported_rates[i] & 0x7F) * in ipw_wx_get_range()
8841 range->max_rts = DEFAULT_RTS_THRESHOLD; in ipw_wx_get_range()
8842 range->min_frag = MIN_FRAG_THRESHOLD; in ipw_wx_get_range()
8843 range->max_frag = MAX_FRAG_THRESHOLD; in ipw_wx_get_range()
8845 range->encoding_size[0] = 5; in ipw_wx_get_range()
8846 range->encoding_size[1] = 13; in ipw_wx_get_range()
8847 range->num_encoding_sizes = 2; in ipw_wx_get_range()
8848 range->max_encoding_tokens = WEP_KEYS; in ipw_wx_get_range()
8851 range->we_version_compiled = WIRELESS_EXT; in ipw_wx_get_range()
8852 range->we_version_source = 18; in ipw_wx_get_range()
8855 if (priv->ieee->mode & (IEEE_B | IEEE_G)) { in ipw_wx_get_range()
8856 for (j = 0; j < geo->bg_channels && i < IW_MAX_FREQUENCIES; j++) { in ipw_wx_get_range()
8857 if ((priv->ieee->iw_mode == IW_MODE_ADHOC) && in ipw_wx_get_range()
8858 (geo->bg[j].flags & LIBIPW_CH_PASSIVE_ONLY)) in ipw_wx_get_range()
8861 range->freq[i].i = geo->bg[j].channel; in ipw_wx_get_range()
8862 range->freq[i].m = geo->bg[j].freq * 100000; in ipw_wx_get_range()
8863 range->freq[i].e = 1; in ipw_wx_get_range()
8868 if (priv->ieee->mode & IEEE_A) { in ipw_wx_get_range()
8869 for (j = 0; j < geo->a_channels && i < IW_MAX_FREQUENCIES; j++) { in ipw_wx_get_range()
8870 if ((priv->ieee->iw_mode == IW_MODE_ADHOC) && in ipw_wx_get_range()
8871 (geo->a[j].flags & LIBIPW_CH_PASSIVE_ONLY)) in ipw_wx_get_range()
8874 range->freq[i].i = geo->a[j].channel; in ipw_wx_get_range()
8875 range->freq[i].m = geo->a[j].freq * 100000; in ipw_wx_get_range()
8876 range->freq[i].e = 1; in ipw_wx_get_range()
8881 range->num_channels = i; in ipw_wx_get_range()
8882 range->num_frequency = i; in ipw_wx_get_range()
8884 mutex_unlock(&priv->mutex); in ipw_wx_get_range()
8887 range->event_capa[0] = (IW_EVENT_CAPA_K_0 | in ipw_wx_get_range()
8891 range->event_capa[1] = IW_EVENT_CAPA_K_1; in ipw_wx_get_range()
8893 range->enc_capa = IW_ENC_CAPA_WPA | IW_ENC_CAPA_WPA2 | in ipw_wx_get_range()
8896 range->scan_capa = IW_SCAN_CAPA_ESSID | IW_SCAN_CAPA_TYPE; in ipw_wx_get_range()
8908 if (wrqu->ap_addr.sa_family != ARPHRD_ETHER) in ipw_wx_set_wap()
8909 return -EINVAL; in ipw_wx_set_wap()
8910 mutex_lock(&priv->mutex); in ipw_wx_set_wap()
8911 if (is_broadcast_ether_addr(wrqu->ap_addr.sa_data) || in ipw_wx_set_wap()
8912 is_zero_ether_addr(wrqu->ap_addr.sa_data)) { in ipw_wx_set_wap()
8915 priv->config &= ~CFG_STATIC_BSSID; in ipw_wx_set_wap()
8919 mutex_unlock(&priv->mutex); in ipw_wx_set_wap()
8923 priv->config |= CFG_STATIC_BSSID; in ipw_wx_set_wap()
8924 if (ether_addr_equal(priv->bssid, wrqu->ap_addr.sa_data)) { in ipw_wx_set_wap()
8926 mutex_unlock(&priv->mutex); in ipw_wx_set_wap()
8931 wrqu->ap_addr.sa_data); in ipw_wx_set_wap()
8933 memcpy(priv->bssid, wrqu->ap_addr.sa_data, ETH_ALEN); in ipw_wx_set_wap()
8935 /* Network configuration changed -- force [re]association */ in ipw_wx_set_wap()
8940 mutex_unlock(&priv->mutex); in ipw_wx_set_wap()
8952 mutex_lock(&priv->mutex); in ipw_wx_get_wap()
8953 if (priv->config & CFG_STATIC_BSSID || in ipw_wx_get_wap()
8954 priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING)) { in ipw_wx_get_wap()
8955 wrqu->ap_addr.sa_family = ARPHRD_ETHER; in ipw_wx_get_wap()
8956 memcpy(wrqu->ap_addr.sa_data, priv->bssid, ETH_ALEN); in ipw_wx_get_wap()
8958 eth_zero_addr(wrqu->ap_addr.sa_data); in ipw_wx_get_wap()
8961 wrqu->ap_addr.sa_data); in ipw_wx_get_wap()
8962 mutex_unlock(&priv->mutex); in ipw_wx_get_wap()
8973 mutex_lock(&priv->mutex); in ipw_wx_set_essid()
8975 if (!wrqu->essid.flags) in ipw_wx_set_essid()
8979 priv->config &= ~CFG_STATIC_ESSID; in ipw_wx_set_essid()
8981 mutex_unlock(&priv->mutex); in ipw_wx_set_essid()
8985 length = min((int)wrqu->essid.length, IW_ESSID_MAX_SIZE); in ipw_wx_set_essid()
8987 priv->config |= CFG_STATIC_ESSID; in ipw_wx_set_essid()
8989 if (priv->essid_len == length && !memcmp(priv->essid, extra, length) in ipw_wx_set_essid()
8990 && (priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING))) { in ipw_wx_set_essid()
8992 mutex_unlock(&priv->mutex); in ipw_wx_set_essid()
8998 priv->essid_len = length; in ipw_wx_set_essid()
8999 memcpy(priv->essid, extra, priv->essid_len); in ipw_wx_set_essid()
9001 /* Network configuration changed -- force [re]association */ in ipw_wx_set_essid()
9006 mutex_unlock(&priv->mutex); in ipw_wx_set_essid()
9018 mutex_lock(&priv->mutex); in ipw_wx_get_essid()
9019 if (priv->config & CFG_STATIC_ESSID || in ipw_wx_get_essid()
9020 priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING)) { in ipw_wx_get_essid()
9022 priv->essid_len, priv->essid); in ipw_wx_get_essid()
9023 memcpy(extra, priv->essid, priv->essid_len); in ipw_wx_get_essid()
9024 wrqu->essid.length = priv->essid_len; in ipw_wx_get_essid()
9025 wrqu->essid.flags = 1; /* active */ in ipw_wx_get_essid()
9028 wrqu->essid.length = 0; in ipw_wx_get_essid()
9029 wrqu->essid.flags = 0; /* active */ in ipw_wx_get_essid()
9031 mutex_unlock(&priv->mutex); in ipw_wx_get_essid()
9042 if (wrqu->data.length > IW_ESSID_MAX_SIZE) in ipw_wx_set_nick()
9043 return -E2BIG; in ipw_wx_set_nick()
9044 mutex_lock(&priv->mutex); in ipw_wx_set_nick()
9045 wrqu->data.length = min_t(size_t, wrqu->data.length, sizeof(priv->nick)); in ipw_wx_set_nick()
9046 memset(priv->nick, 0, sizeof(priv->nick)); in ipw_wx_set_nick()
9047 memcpy(priv->nick, extra, wrqu->data.length); in ipw_wx_set_nick()
9049 mutex_unlock(&priv->mutex); in ipw_wx_set_nick()
9060 mutex_lock(&priv->mutex); in ipw_wx_get_nick()
9061 wrqu->data.length = strlen(priv->nick); in ipw_wx_get_nick()
9062 memcpy(extra, priv->nick, wrqu->data.length); in ipw_wx_get_nick()
9063 wrqu->data.flags = 1; /* active */ in ipw_wx_get_nick()
9064 mutex_unlock(&priv->mutex); in ipw_wx_get_nick()
9075 IPW_DEBUG_WX("Setting roaming threshold to %d\n", wrqu->sens.value); in ipw_wx_set_sens()
9076 IPW_DEBUG_WX("Setting disassociate threshold to %d\n", 3*wrqu->sens.value); in ipw_wx_set_sens()
9077 mutex_lock(&priv->mutex); in ipw_wx_set_sens()
9079 if (wrqu->sens.fixed == 0) in ipw_wx_set_sens()
9081 priv->roaming_threshold = IPW_MB_ROAMING_THRESHOLD_DEFAULT; in ipw_wx_set_sens()
9082 priv->disassociate_threshold = IPW_MB_DISASSOCIATE_THRESHOLD_DEFAULT; in ipw_wx_set_sens()
9085 if ((wrqu->sens.value > IPW_MB_ROAMING_THRESHOLD_MAX) || in ipw_wx_set_sens()
9086 (wrqu->sens.value < IPW_MB_ROAMING_THRESHOLD_MIN)) { in ipw_wx_set_sens()
9087 err = -EINVAL; in ipw_wx_set_sens()
9091 priv->roaming_threshold = wrqu->sens.value; in ipw_wx_set_sens()
9092 priv->disassociate_threshold = 3*wrqu->sens.value; in ipw_wx_set_sens()
9094 mutex_unlock(&priv->mutex); in ipw_wx_set_sens()
9103 mutex_lock(&priv->mutex); in ipw_wx_get_sens()
9104 wrqu->sens.fixed = 1; in ipw_wx_get_sens()
9105 wrqu->sens.value = priv->roaming_threshold; in ipw_wx_get_sens()
9106 mutex_unlock(&priv->mutex); in ipw_wx_get_sens()
9108 IPW_DEBUG_WX("GET roaming threshold -> %s %d\n", in ipw_wx_get_sens()
9109 wrqu->power.disabled ? "OFF" : "ON", wrqu->power.value); in ipw_wx_get_sens()
9120 u32 target_rate = wrqu->bitrate.value; in ipw_wx_set_rate()
9123 /* value = -1, fixed = 0 means auto only, so we should use all rates offered by AP */ in ipw_wx_set_rate()
9127 if (target_rate == -1) { in ipw_wx_set_rate()
9135 fixed = wrqu->bitrate.fixed; in ipw_wx_set_rate()
9198 return -EINVAL; in ipw_wx_set_rate()
9202 mask, fixed ? "fixed" : "sub-rates"); in ipw_wx_set_rate()
9203 mutex_lock(&priv->mutex); in ipw_wx_set_rate()
9205 priv->config &= ~CFG_FIXED_RATE; in ipw_wx_set_rate()
9206 ipw_set_fixed_rate(priv, priv->ieee->mode); in ipw_wx_set_rate()
9208 priv->config |= CFG_FIXED_RATE; in ipw_wx_set_rate()
9210 if (priv->rates_mask == mask) { in ipw_wx_set_rate()
9212 mutex_unlock(&priv->mutex); in ipw_wx_set_rate()
9216 priv->rates_mask = mask; in ipw_wx_set_rate()
9218 /* Network configuration changed -- force [re]association */ in ipw_wx_set_rate()
9223 mutex_unlock(&priv->mutex); in ipw_wx_set_rate()
9232 mutex_lock(&priv->mutex); in ipw_wx_get_rate()
9233 wrqu->bitrate.value = priv->last_rate; in ipw_wx_get_rate()
9234 wrqu->bitrate.fixed = (priv->config & CFG_FIXED_RATE) ? 1 : 0; in ipw_wx_get_rate()
9235 mutex_unlock(&priv->mutex); in ipw_wx_get_rate()
9236 IPW_DEBUG_WX("GET Rate -> %d\n", wrqu->bitrate.value); in ipw_wx_get_rate()
9245 mutex_lock(&priv->mutex); in ipw_wx_set_rts()
9246 if (wrqu->rts.disabled || !wrqu->rts.fixed) in ipw_wx_set_rts()
9247 priv->rts_threshold = DEFAULT_RTS_THRESHOLD; in ipw_wx_set_rts()
9249 if (wrqu->rts.value < MIN_RTS_THRESHOLD || in ipw_wx_set_rts()
9250 wrqu->rts.value > MAX_RTS_THRESHOLD) { in ipw_wx_set_rts()
9251 mutex_unlock(&priv->mutex); in ipw_wx_set_rts()
9252 return -EINVAL; in ipw_wx_set_rts()
9254 priv->rts_threshold = wrqu->rts.value; in ipw_wx_set_rts()
9257 ipw_send_rts_threshold(priv, priv->rts_threshold); in ipw_wx_set_rts()
9258 mutex_unlock(&priv->mutex); in ipw_wx_set_rts()
9259 IPW_DEBUG_WX("SET RTS Threshold -> %d\n", priv->rts_threshold); in ipw_wx_set_rts()
9268 mutex_lock(&priv->mutex); in ipw_wx_get_rts()
9269 wrqu->rts.value = priv->rts_threshold; in ipw_wx_get_rts()
9270 wrqu->rts.fixed = 0; /* no auto select */ in ipw_wx_get_rts()
9271 wrqu->rts.disabled = (wrqu->rts.value == DEFAULT_RTS_THRESHOLD); in ipw_wx_get_rts()
9272 mutex_unlock(&priv->mutex); in ipw_wx_get_rts()
9273 IPW_DEBUG_WX("GET RTS Threshold -> %d\n", wrqu->rts.value); in ipw_wx_get_rts()
9284 mutex_lock(&priv->mutex); in ipw_wx_set_txpow()
9285 if (ipw_radio_kill_sw(priv, wrqu->power.disabled)) { in ipw_wx_set_txpow()
9286 err = -EINPROGRESS; in ipw_wx_set_txpow()
9290 if (!wrqu->power.fixed) in ipw_wx_set_txpow()
9291 wrqu->power.value = IPW_TX_POWER_DEFAULT; in ipw_wx_set_txpow()
9293 if (wrqu->power.flags != IW_TXPOW_DBM) { in ipw_wx_set_txpow()
9294 err = -EINVAL; in ipw_wx_set_txpow()
9298 if ((wrqu->power.value > IPW_TX_POWER_MAX) || in ipw_wx_set_txpow()
9299 (wrqu->power.value < IPW_TX_POWER_MIN)) { in ipw_wx_set_txpow()
9300 err = -EINVAL; in ipw_wx_set_txpow()
9304 priv->tx_power = wrqu->power.value; in ipw_wx_set_txpow()
9307 mutex_unlock(&priv->mutex); in ipw_wx_set_txpow()
9316 mutex_lock(&priv->mutex); in ipw_wx_get_txpow()
9317 wrqu->power.value = priv->tx_power; in ipw_wx_get_txpow()
9318 wrqu->power.fixed = 1; in ipw_wx_get_txpow()
9319 wrqu->power.flags = IW_TXPOW_DBM; in ipw_wx_get_txpow()
9320 wrqu->power.disabled = (priv->status & STATUS_RF_KILL_MASK) ? 1 : 0; in ipw_wx_get_txpow()
9321 mutex_unlock(&priv->mutex); in ipw_wx_get_txpow()
9323 IPW_DEBUG_WX("GET TX Power -> %s %d\n", in ipw_wx_get_txpow()
9324 wrqu->power.disabled ? "OFF" : "ON", wrqu->power.value); in ipw_wx_get_txpow()
9334 mutex_lock(&priv->mutex); in ipw_wx_set_frag()
9335 if (wrqu->frag.disabled || !wrqu->frag.fixed) in ipw_wx_set_frag()
9336 priv->ieee->fts = DEFAULT_FTS; in ipw_wx_set_frag()
9338 if (wrqu->frag.value < MIN_FRAG_THRESHOLD || in ipw_wx_set_frag()
9339 wrqu->frag.value > MAX_FRAG_THRESHOLD) { in ipw_wx_set_frag()
9340 mutex_unlock(&priv->mutex); in ipw_wx_set_frag()
9341 return -EINVAL; in ipw_wx_set_frag()
9344 priv->ieee->fts = wrqu->frag.value & ~0x1; in ipw_wx_set_frag()
9347 ipw_send_frag_threshold(priv, wrqu->frag.value); in ipw_wx_set_frag()
9348 mutex_unlock(&priv->mutex); in ipw_wx_set_frag()
9349 IPW_DEBUG_WX("SET Frag Threshold -> %d\n", wrqu->frag.value); in ipw_wx_set_frag()
9358 mutex_lock(&priv->mutex); in ipw_wx_get_frag()
9359 wrqu->frag.value = priv->ieee->fts; in ipw_wx_get_frag()
9360 wrqu->frag.fixed = 0; /* no auto select */ in ipw_wx_get_frag()
9361 wrqu->frag.disabled = (wrqu->frag.value == DEFAULT_FTS); in ipw_wx_get_frag()
9362 mutex_unlock(&priv->mutex); in ipw_wx_get_frag()
9363 IPW_DEBUG_WX("GET Frag Threshold -> %d\n", wrqu->frag.value); in ipw_wx_get_frag()
9374 if (wrqu->retry.flags & IW_RETRY_LIFETIME || wrqu->retry.disabled) in ipw_wx_set_retry()
9375 return -EINVAL; in ipw_wx_set_retry()
9377 if (!(wrqu->retry.flags & IW_RETRY_LIMIT)) in ipw_wx_set_retry()
9380 if (wrqu->retry.value < 0 || wrqu->retry.value >= 255) in ipw_wx_set_retry()
9381 return -EINVAL; in ipw_wx_set_retry()
9383 mutex_lock(&priv->mutex); in ipw_wx_set_retry()
9384 if (wrqu->retry.flags & IW_RETRY_SHORT) in ipw_wx_set_retry()
9385 priv->short_retry_limit = (u8) wrqu->retry.value; in ipw_wx_set_retry()
9386 else if (wrqu->retry.flags & IW_RETRY_LONG) in ipw_wx_set_retry()
9387 priv->long_retry_limit = (u8) wrqu->retry.value; in ipw_wx_set_retry()
9389 priv->short_retry_limit = (u8) wrqu->retry.value; in ipw_wx_set_retry()
9390 priv->long_retry_limit = (u8) wrqu->retry.value; in ipw_wx_set_retry()
9393 ipw_send_retry_limit(priv, priv->short_retry_limit, in ipw_wx_set_retry()
9394 priv->long_retry_limit); in ipw_wx_set_retry()
9395 mutex_unlock(&priv->mutex); in ipw_wx_set_retry()
9396 IPW_DEBUG_WX("SET retry limit -> short:%d long:%d\n", in ipw_wx_set_retry()
9397 priv->short_retry_limit, priv->long_retry_limit); in ipw_wx_set_retry()
9407 mutex_lock(&priv->mutex); in ipw_wx_get_retry()
9408 wrqu->retry.disabled = 0; in ipw_wx_get_retry()
9410 if ((wrqu->retry.flags & IW_RETRY_TYPE) == IW_RETRY_LIFETIME) { in ipw_wx_get_retry()
9411 mutex_unlock(&priv->mutex); in ipw_wx_get_retry()
9412 return -EINVAL; in ipw_wx_get_retry()
9415 if (wrqu->retry.flags & IW_RETRY_LONG) { in ipw_wx_get_retry()
9416 wrqu->retry.flags = IW_RETRY_LIMIT | IW_RETRY_LONG; in ipw_wx_get_retry()
9417 wrqu->retry.value = priv->long_retry_limit; in ipw_wx_get_retry()
9418 } else if (wrqu->retry.flags & IW_RETRY_SHORT) { in ipw_wx_get_retry()
9419 wrqu->retry.flags = IW_RETRY_LIMIT | IW_RETRY_SHORT; in ipw_wx_get_retry()
9420 wrqu->retry.value = priv->short_retry_limit; in ipw_wx_get_retry()
9422 wrqu->retry.flags = IW_RETRY_LIMIT; in ipw_wx_get_retry()
9423 wrqu->retry.value = priv->short_retry_limit; in ipw_wx_get_retry()
9425 mutex_unlock(&priv->mutex); in ipw_wx_get_retry()
9427 IPW_DEBUG_WX("GET retry -> %d\n", wrqu->retry.value); in ipw_wx_get_retry()
9440 mutex_lock(&priv->mutex); in ipw_wx_set_scan()
9442 priv->user_requested_scan = 1; in ipw_wx_set_scan()
9444 if (wrqu->data.length == sizeof(struct iw_scan_req)) { in ipw_wx_set_scan()
9445 if (wrqu->data.flags & IW_SCAN_THIS_ESSID) { in ipw_wx_set_scan()
9446 int len = min((int)req->essid_len, in ipw_wx_set_scan()
9447 (int)sizeof(priv->direct_scan_ssid)); in ipw_wx_set_scan()
9448 memcpy(priv->direct_scan_ssid, req->essid, len); in ipw_wx_set_scan()
9449 priv->direct_scan_ssid_len = len; in ipw_wx_set_scan()
9450 work = &priv->request_direct_scan; in ipw_wx_set_scan()
9451 } else if (req->scan_type == IW_SCAN_TYPE_PASSIVE) { in ipw_wx_set_scan()
9452 work = &priv->request_passive_scan; in ipw_wx_set_scan()
9456 work = &priv->request_scan; in ipw_wx_set_scan()
9459 mutex_unlock(&priv->mutex); in ipw_wx_set_scan()
9473 return libipw_wx_get_scan(priv->ieee, info, wrqu, extra); in ipw_wx_get_scan()
9482 u32 cap = priv->capability; in ipw_wx_set_encode()
9484 mutex_lock(&priv->mutex); in ipw_wx_set_encode()
9485 ret = libipw_wx_set_encode(priv->ieee, info, wrqu, key); in ipw_wx_set_encode()
9489 if (cap != priv->capability && in ipw_wx_set_encode()
9490 priv->ieee->iw_mode == IW_MODE_ADHOC && in ipw_wx_set_encode()
9491 priv->status & STATUS_ASSOCIATED) in ipw_wx_set_encode()
9494 mutex_unlock(&priv->mutex); in ipw_wx_set_encode()
9503 return libipw_wx_get_encode(priv->ieee, info, wrqu, key); in ipw_wx_get_encode()
9512 mutex_lock(&priv->mutex); in ipw_wx_set_power()
9513 if (wrqu->power.disabled) { in ipw_wx_set_power()
9514 priv->power_mode = IPW_POWER_LEVEL(priv->power_mode); in ipw_wx_set_power()
9518 mutex_unlock(&priv->mutex); in ipw_wx_set_power()
9521 IPW_DEBUG_WX("SET Power Management Mode -> off\n"); in ipw_wx_set_power()
9522 mutex_unlock(&priv->mutex); in ipw_wx_set_power()
9526 switch (wrqu->power.flags & IW_POWER_MODE) { in ipw_wx_set_power()
9533 wrqu->power.flags); in ipw_wx_set_power()
9534 mutex_unlock(&priv->mutex); in ipw_wx_set_power()
9535 return -EOPNOTSUPP; in ipw_wx_set_power()
9540 if (IPW_POWER_LEVEL(priv->power_mode) == IPW_POWER_AC) in ipw_wx_set_power()
9541 priv->power_mode = IPW_POWER_ENABLED | IPW_POWER_BATTERY; in ipw_wx_set_power()
9543 priv->power_mode = IPW_POWER_ENABLED | priv->power_mode; in ipw_wx_set_power()
9545 err = ipw_send_power_mode(priv, IPW_POWER_LEVEL(priv->power_mode)); in ipw_wx_set_power()
9548 mutex_unlock(&priv->mutex); in ipw_wx_set_power()
9552 IPW_DEBUG_WX("SET Power Management Mode -> 0x%02X\n", priv->power_mode); in ipw_wx_set_power()
9553 mutex_unlock(&priv->mutex); in ipw_wx_set_power()
9562 mutex_lock(&priv->mutex); in ipw_wx_get_power()
9563 if (!(priv->power_mode & IPW_POWER_ENABLED)) in ipw_wx_get_power()
9564 wrqu->power.disabled = 1; in ipw_wx_get_power()
9566 wrqu->power.disabled = 0; in ipw_wx_get_power()
9568 mutex_unlock(&priv->mutex); in ipw_wx_get_power()
9569 IPW_DEBUG_WX("GET Power Management Mode -> %02X\n", priv->power_mode); in ipw_wx_get_power()
9582 mutex_lock(&priv->mutex); in ipw_wx_set_powermode()
9586 if (IPW_POWER_LEVEL(priv->power_mode) != mode) { in ipw_wx_set_powermode()
9590 mutex_unlock(&priv->mutex); in ipw_wx_set_powermode()
9593 priv->power_mode = IPW_POWER_ENABLED | mode; in ipw_wx_set_powermode()
9595 mutex_unlock(&priv->mutex); in ipw_wx_set_powermode()
9605 int level = IPW_POWER_LEVEL(priv->power_mode); in ipw_wx_get_powermode()
9612 p += scnprintf(p, MAX_WX_STRING - (p - extra), "(AC)"); in ipw_wx_get_powermode()
9615 p += scnprintf(p, MAX_WX_STRING - (p - extra), "(BATTERY)"); in ipw_wx_get_powermode()
9618 p += scnprintf(p, MAX_WX_STRING - (p - extra), in ipw_wx_get_powermode()
9620 timeout_duration[level - 1] / 1000, in ipw_wx_get_powermode()
9621 period_duration[level - 1] / 1000); in ipw_wx_get_powermode()
9624 if (!(priv->power_mode & IPW_POWER_ENABLED)) in ipw_wx_get_powermode()
9625 p += scnprintf(p, MAX_WX_STRING - (p - extra), " OFF"); in ipw_wx_get_powermode()
9627 wrqu->data.length = p - extra + 1; in ipw_wx_get_powermode()
9642 return -EINVAL; in ipw_wx_set_wireless_mode()
9644 mutex_lock(&priv->mutex); in ipw_wx_set_wireless_mode()
9645 if (priv->adapter == IPW_2915ABG) { in ipw_wx_set_wireless_mode()
9646 priv->ieee->abg_true = 1; in ipw_wx_set_wireless_mode()
9651 priv->ieee->abg_true = 0; in ipw_wx_set_wireless_mode()
9656 mutex_unlock(&priv->mutex); in ipw_wx_set_wireless_mode()
9657 return -EINVAL; in ipw_wx_set_wireless_mode()
9660 priv->ieee->abg_true = 0; in ipw_wx_set_wireless_mode()
9667 priv->ieee->abg_true = 0; in ipw_wx_set_wireless_mode()
9673 priv->ieee->abg_true = 0; in ipw_wx_set_wireless_mode()
9675 priv->ieee->mode = mode; in ipw_wx_set_wireless_mode()
9676 priv->ieee->freq_band = band; in ipw_wx_set_wireless_mode()
9677 priv->ieee->modulation = modulation; in ipw_wx_set_wireless_mode()
9678 init_supported_rates(priv, &priv->rates); in ipw_wx_set_wireless_mode()
9680 /* Network configuration changed -- force [re]association */ in ipw_wx_set_wireless_mode()
9683 ipw_send_supported_rates(priv, &priv->rates); in ipw_wx_set_wireless_mode()
9693 mutex_unlock(&priv->mutex); in ipw_wx_set_wireless_mode()
9702 mutex_lock(&priv->mutex); in ipw_wx_get_wireless_mode()
9703 switch (priv->ieee->mode) { in ipw_wx_get_wireless_mode()
9729 extra[MAX_WX_STRING - 1] = '\0'; in ipw_wx_get_wireless_mode()
9733 wrqu->data.length = strlen(extra) + 1; in ipw_wx_get_wireless_mode()
9734 mutex_unlock(&priv->mutex); in ipw_wx_get_wireless_mode()
9745 mutex_lock(&priv->mutex); in ipw_wx_set_preamble()
9746 /* Switching from SHORT -> LONG requires a disassociation */ in ipw_wx_set_preamble()
9748 if (!(priv->config & CFG_PREAMBLE_LONG)) { in ipw_wx_set_preamble()
9749 priv->config |= CFG_PREAMBLE_LONG; in ipw_wx_set_preamble()
9751 /* Network configuration changed -- force [re]association */ in ipw_wx_set_preamble()
9761 priv->config &= ~CFG_PREAMBLE_LONG; in ipw_wx_set_preamble()
9764 mutex_unlock(&priv->mutex); in ipw_wx_set_preamble()
9765 return -EINVAL; in ipw_wx_set_preamble()
9768 mutex_unlock(&priv->mutex); in ipw_wx_set_preamble()
9777 mutex_lock(&priv->mutex); in ipw_wx_get_preamble()
9778 if (priv->config & CFG_PREAMBLE_LONG) in ipw_wx_get_preamble()
9779 snprintf(wrqu->name, IFNAMSIZ, "long (1)"); in ipw_wx_get_preamble()
9781 snprintf(wrqu->name, IFNAMSIZ, "auto (0)"); in ipw_wx_get_preamble()
9782 mutex_unlock(&priv->mutex); in ipw_wx_get_preamble()
9794 mutex_lock(&priv->mutex); in ipw_wx_set_monitor()
9797 if (priv->ieee->iw_mode != IW_MODE_MONITOR) { in ipw_wx_set_monitor()
9799 priv->net_dev->type = ARPHRD_IEEE80211_RADIOTAP; in ipw_wx_set_monitor()
9801 priv->net_dev->type = ARPHRD_IEEE80211; in ipw_wx_set_monitor()
9803 schedule_work(&priv->adapter_restart); in ipw_wx_set_monitor()
9808 if (priv->ieee->iw_mode != IW_MODE_MONITOR) { in ipw_wx_set_monitor()
9809 mutex_unlock(&priv->mutex); in ipw_wx_set_monitor()
9812 priv->net_dev->type = ARPHRD_ETHER; in ipw_wx_set_monitor()
9813 schedule_work(&priv->adapter_restart); in ipw_wx_set_monitor()
9815 mutex_unlock(&priv->mutex); in ipw_wx_set_monitor()
9827 schedule_work(&priv->adapter_restart); in ipw_wx_reset()
9845 mutex_lock(&priv->mutex); in ipw_wx_sw_reset()
9855 ipw_radio_kill_sw(priv, priv->status & STATUS_RF_KILL_SW); in ipw_wx_sw_reset()
9857 mutex_unlock(&priv->mutex); in ipw_wx_sw_reset()
9858 libipw_wx_set_encode(priv->ieee, info, &wrqu_sec, NULL); in ipw_wx_sw_reset()
9859 mutex_lock(&priv->mutex); in ipw_wx_sw_reset()
9861 if (!(priv->status & STATUS_RF_KILL_MASK)) { in ipw_wx_sw_reset()
9862 /* Configuration likely changed -- force [re]association */ in ipw_wx_sw_reset()
9869 mutex_unlock(&priv->mutex); in ipw_wx_sw_reset()
10005 wstats = &priv->wstats; in ipw_get_wireless_stats()
10008 * netdev->get_wireless_stats seems to be called before fw is in ipw_get_wireless_stats()
10012 if (!(priv->status & STATUS_ASSOCIATED)) { in ipw_get_wireless_stats()
10013 wstats->miss.beacon = 0; in ipw_get_wireless_stats()
10014 wstats->discard.retries = 0; in ipw_get_wireless_stats()
10015 wstats->qual.qual = 0; in ipw_get_wireless_stats()
10016 wstats->qual.level = 0; in ipw_get_wireless_stats()
10017 wstats->qual.noise = 0; in ipw_get_wireless_stats()
10018 wstats->qual.updated = 7; in ipw_get_wireless_stats()
10019 wstats->qual.updated |= IW_QUAL_NOISE_INVALID | in ipw_get_wireless_stats()
10024 wstats->qual.qual = priv->quality; in ipw_get_wireless_stats()
10025 wstats->qual.level = priv->exp_avg_rssi; in ipw_get_wireless_stats()
10026 wstats->qual.noise = priv->exp_avg_noise; in ipw_get_wireless_stats()
10027 wstats->qual.updated = IW_QUAL_QUAL_UPDATED | IW_QUAL_LEVEL_UPDATED | in ipw_get_wireless_stats()
10030 wstats->miss.beacon = average_value(&priv->average_missed_beacons); in ipw_get_wireless_stats()
10031 wstats->discard.retries = priv->last_tx_failures; in ipw_get_wireless_stats()
10032 wstats->discard.code = priv->ieee->ieee_stats.rx_discards_undecryptable; in ipw_get_wireless_stats()
10036 wstats->discard.retries += tx_retry; */ in ipw_get_wireless_stats()
10046 sys_config->bt_coexistence = 0; in init_sys_config()
10047 sys_config->answer_broadcast_ssid_probe = 0; in init_sys_config()
10048 sys_config->accept_all_data_frames = 0; in init_sys_config()
10049 sys_config->accept_non_directed_frames = 1; in init_sys_config()
10050 sys_config->exclude_unicast_unencrypted = 0; in init_sys_config()
10051 sys_config->disable_unicast_decryption = 1; in init_sys_config()
10052 sys_config->exclude_multicast_unencrypted = 0; in init_sys_config()
10053 sys_config->disable_multicast_decryption = 1; in init_sys_config()
10056 sys_config->antenna_diversity = antenna; in init_sys_config()
10057 sys_config->pass_crc_to_host = 0; /* TODO: See if 1 gives us FCS */ in init_sys_config()
10058 sys_config->dot11g_auto_detection = 0; in init_sys_config()
10059 sys_config->enable_cts_to_self = 0; in init_sys_config()
10060 sys_config->bt_coexist_collision_thr = 0; in init_sys_config()
10061 sys_config->pass_noise_stats_to_host = 1; /* 1 -- fix for 256 */ in init_sys_config()
10062 sys_config->silence_threshold = 0x1e; in init_sys_config()
10067 IPW_DEBUG_INFO("dev->open\n"); in ipw_net_open()
10074 IPW_DEBUG_INFO("dev->close\n"); in ipw_net_stop()
10090 txb->fragments[0]->data; in ipw_tx_skb()
10095 struct clx2_tx_queue *txq = &priv->txq[tx_id]; in ipw_tx_skb()
10097 struct clx2_tx_queue *txq = &priv->txq[0]; in ipw_tx_skb()
10099 struct clx2_queue *q = &txq->q; in ipw_tx_skb()
10103 if (!(priv->status & STATUS_ASSOCIATED)) in ipw_tx_skb()
10106 hdr_len = libipw_get_hdrlen(le16_to_cpu(hdr->frame_ctl)); in ipw_tx_skb()
10107 switch (priv->ieee->iw_mode) { in ipw_tx_skb()
10109 unicast = !is_multicast_ether_addr(hdr->addr1); in ipw_tx_skb()
10110 id = ipw_find_station(priv, hdr->addr1); in ipw_tx_skb()
10112 id = ipw_add_station(priv, hdr->addr1); in ipw_tx_skb()
10116 hdr->addr1); in ipw_tx_skb()
10124 unicast = !is_multicast_ether_addr(hdr->addr3); in ipw_tx_skb()
10129 tfd = &txq->bd[q->first_empty]; in ipw_tx_skb()
10130 txq->txb[q->first_empty] = txb; in ipw_tx_skb()
10132 tfd->u.data.station_number = id; in ipw_tx_skb()
10134 tfd->control_flags.message_type = TX_FRAME_TYPE; in ipw_tx_skb()
10135 tfd->control_flags.control_bits = TFD_NEED_IRQ_MASK; in ipw_tx_skb()
10137 tfd->u.data.cmd_id = DINO_CMD_TX; in ipw_tx_skb()
10138 tfd->u.data.len = cpu_to_le16(txb->payload_size); in ipw_tx_skb()
10140 if (priv->assoc_request.ieee_mode == IPW_B_MODE) in ipw_tx_skb()
10141 tfd->u.data.tx_flags_ext |= DCT_FLAG_EXT_MODE_CCK; in ipw_tx_skb()
10143 tfd->u.data.tx_flags_ext |= DCT_FLAG_EXT_MODE_OFDM; in ipw_tx_skb()
10145 if (priv->assoc_request.preamble_length == DCT_FLAG_SHORT_PREAMBLE) in ipw_tx_skb()
10146 tfd->u.data.tx_flags |= DCT_FLAG_SHORT_PREAMBLE; in ipw_tx_skb()
10148 fc = le16_to_cpu(hdr->frame_ctl); in ipw_tx_skb()
10149 hdr->frame_ctl = cpu_to_le16(fc & ~IEEE80211_FCTL_MOREFRAGS); in ipw_tx_skb()
10151 memcpy(&tfd->u.data.tfd.tfd_24.mchdr, hdr, hdr_len); in ipw_tx_skb()
10154 tfd->u.data.tx_flags |= DCT_FLAG_ACK_REQD; in ipw_tx_skb()
10156 if (txb->encrypted && !priv->ieee->host_encrypt) { in ipw_tx_skb()
10157 switch (priv->ieee->sec.level) { in ipw_tx_skb()
10159 tfd->u.data.tfd.tfd_24.mchdr.frame_ctl |= in ipw_tx_skb()
10166 tfd->u.data.tx_flags |= DCT_FLAG_ACK_REQD; in ipw_tx_skb()
10168 tfd->u.data.tx_flags &= ~DCT_FLAG_NO_WEP; in ipw_tx_skb()
10169 tfd->u.data.tx_flags_ext |= DCT_FLAG_EXT_SECURITY_CCM; in ipw_tx_skb()
10170 tfd->u.data.key_index = 0; in ipw_tx_skb()
10171 tfd->u.data.key_index |= DCT_WEP_INDEX_USE_IMMEDIATE; in ipw_tx_skb()
10174 tfd->u.data.tfd.tfd_24.mchdr.frame_ctl |= in ipw_tx_skb()
10176 tfd->u.data.tx_flags &= ~DCT_FLAG_NO_WEP; in ipw_tx_skb()
10177 tfd->u.data.tx_flags_ext |= DCT_FLAG_EXT_SECURITY_TKIP; in ipw_tx_skb()
10178 tfd->u.data.key_index = DCT_WEP_INDEX_USE_IMMEDIATE; in ipw_tx_skb()
10181 tfd->u.data.tfd.tfd_24.mchdr.frame_ctl |= in ipw_tx_skb()
10183 tfd->u.data.key_index = priv->ieee->crypt_info.tx_keyidx; in ipw_tx_skb()
10184 if (priv->ieee->sec.key_sizes[priv->ieee->crypt_info.tx_keyidx] <= in ipw_tx_skb()
10186 tfd->u.data.key_index |= DCT_WEP_KEY_64Bit; in ipw_tx_skb()
10188 tfd->u.data.key_index |= DCT_WEP_KEY_128Bit; in ipw_tx_skb()
10194 priv->ieee->sec.level); in ipw_tx_skb()
10199 tfd->u.data.tx_flags |= DCT_FLAG_NO_WEP; in ipw_tx_skb()
10203 ipw_qos_set_tx_queue_command(priv, pri, &(tfd->u.data)); in ipw_tx_skb()
10207 tfd->u.data.num_chunks = cpu_to_le32(min((u8) (NUM_TFD_CHUNKS - 2), in ipw_tx_skb()
10208 txb->nr_frags)); in ipw_tx_skb()
10210 txb->nr_frags, le32_to_cpu(tfd->u.data.num_chunks)); in ipw_tx_skb()
10211 for (i = 0; i < le32_to_cpu(tfd->u.data.num_chunks); i++) { in ipw_tx_skb()
10213 i, le32_to_cpu(tfd->u.data.num_chunks), in ipw_tx_skb()
10214 txb->fragments[i]->len - hdr_len); in ipw_tx_skb()
10216 i, tfd->u.data.num_chunks, in ipw_tx_skb()
10217 txb->fragments[i]->len - hdr_len); in ipw_tx_skb()
10218 printk_buf(IPW_DL_TX, txb->fragments[i]->data + hdr_len, in ipw_tx_skb()
10219 txb->fragments[i]->len - hdr_len); in ipw_tx_skb()
10221 tfd->u.data.chunk_ptr[i] = in ipw_tx_skb()
10222 cpu_to_le32(dma_map_single(&priv->pci_dev->dev, in ipw_tx_skb()
10223 txb->fragments[i]->data + hdr_len, in ipw_tx_skb()
10224 txb->fragments[i]->len - hdr_len, in ipw_tx_skb()
10226 tfd->u.data.chunk_len[i] = in ipw_tx_skb()
10227 cpu_to_le16(txb->fragments[i]->len - hdr_len); in ipw_tx_skb()
10230 if (i != txb->nr_frags) { in ipw_tx_skb()
10235 for (j = i; j < txb->nr_frags; j++) in ipw_tx_skb()
10236 remaining_bytes += txb->fragments[j]->len - hdr_len; in ipw_tx_skb()
10242 tfd->u.data.chunk_len[i] = cpu_to_le16(remaining_bytes); in ipw_tx_skb()
10243 for (j = i; j < txb->nr_frags; j++) { in ipw_tx_skb()
10244 int size = txb->fragments[j]->len - hdr_len; in ipw_tx_skb()
10249 txb->fragments[j]->data + hdr_len, in ipw_tx_skb()
10252 dev_kfree_skb_any(txb->fragments[i]); in ipw_tx_skb()
10253 txb->fragments[i] = skb; in ipw_tx_skb()
10254 tfd->u.data.chunk_ptr[i] = in ipw_tx_skb()
10255 cpu_to_le32(dma_map_single(&priv->pci_dev->dev, in ipw_tx_skb()
10256 skb->data, in ipw_tx_skb()
10260 le32_add_cpu(&tfd->u.data.num_chunks, 1); in ipw_tx_skb()
10265 q->first_empty = ipw_queue_inc_wrap(q->first_empty, q->n_bd); in ipw_tx_skb()
10266 ipw_write32(priv, q->reg_w, q->first_empty); in ipw_tx_skb()
10268 if (ipw_tx_queue_space(q) < q->high_mark) in ipw_tx_skb()
10269 netif_stop_queue(priv->net_dev); in ipw_tx_skb()
10284 struct clx2_tx_queue *txq = &priv->txq[tx_id]; in ipw_net_is_queue_full()
10286 struct clx2_tx_queue *txq = &priv->txq[0]; in ipw_net_is_queue_full()
10289 if (ipw_tx_queue_space(&txq->q) < txq->q.high_mark) in ipw_net_is_queue_full()
10302 u16 filter = priv->prom_priv->filter; in ipw_handle_promiscuous_tx()
10311 hdr = (void *)txb->fragments[0]->data; in ipw_handle_promiscuous_tx()
10312 if (libipw_is_management(le16_to_cpu(hdr->frame_control))) { in ipw_handle_promiscuous_tx()
10317 } else if (libipw_is_control(le16_to_cpu(hdr->frame_control))) { in ipw_handle_promiscuous_tx()
10322 } else if (libipw_is_data(le16_to_cpu(hdr->frame_control))) { in ipw_handle_promiscuous_tx()
10329 for(n=0; n<txb->nr_frags; ++n) { in ipw_handle_promiscuous_tx()
10330 struct sk_buff *src = txb->fragments[n]; in ipw_handle_promiscuous_tx()
10336 hdr = (void *)src->data; in ipw_handle_promiscuous_tx()
10337 len = libipw_get_hdrlen(le16_to_cpu(hdr->frame_control)); in ipw_handle_promiscuous_tx()
10339 len = src->len; in ipw_handle_promiscuous_tx()
10347 rt_hdr->it_version = PKTHDR_RADIOTAP_VERSION; in ipw_handle_promiscuous_tx()
10348 rt_hdr->it_pad = 0; in ipw_handle_promiscuous_tx()
10349 rt_hdr->it_present = 0; /* after all, it's just an idea */ in ipw_handle_promiscuous_tx()
10350 rt_hdr->it_present |= cpu_to_le32(1 << IEEE80211_RADIOTAP_CHANNEL); in ipw_handle_promiscuous_tx()
10353 ieee80211chan2mhz(priv->channel)); in ipw_handle_promiscuous_tx()
10354 if (priv->channel > 14) /* 802.11a */ in ipw_handle_promiscuous_tx()
10358 else if (priv->ieee->mode == IEEE_B) /* 802.11b */ in ipw_handle_promiscuous_tx()
10367 rt_hdr->it_len = cpu_to_le16(dst->len); in ipw_handle_promiscuous_tx()
10371 if (!libipw_rx(priv->prom_priv->ieee, dst, &dummystats)) in ipw_handle_promiscuous_tx()
10384 IPW_DEBUG_TX("dev->xmit(%d bytes)\n", txb->payload_size); in ipw_net_hard_start_xmit()
10385 spin_lock_irqsave(&priv->lock, flags); in ipw_net_hard_start_xmit()
10388 if (rtap_iface && netif_running(priv->prom_net_dev)) in ipw_net_hard_start_xmit()
10395 spin_unlock_irqrestore(&priv->lock, flags); in ipw_net_hard_start_xmit()
10410 if (!is_valid_ether_addr(addr->sa_data)) in ipw_net_set_mac_address()
10411 return -EADDRNOTAVAIL; in ipw_net_set_mac_address()
10412 mutex_lock(&priv->mutex); in ipw_net_set_mac_address()
10413 priv->config |= CFG_CUSTOM_MAC; in ipw_net_set_mac_address()
10414 memcpy(priv->mac_addr, addr->sa_data, ETH_ALEN); in ipw_net_set_mac_address()
10416 priv->net_dev->name, priv->mac_addr); in ipw_net_set_mac_address()
10417 schedule_work(&priv->adapter_restart); in ipw_net_set_mac_address()
10418 mutex_unlock(&priv->mutex); in ipw_net_set_mac_address()
10430 strlcpy(info->driver, DRV_NAME, sizeof(info->driver)); in ipw_ethtool_get_drvinfo()
10431 strlcpy(info->version, DRV_VERSION, sizeof(info->version)); in ipw_ethtool_get_drvinfo()
10438 snprintf(info->fw_version, sizeof(info->fw_version), "%s (%s)", in ipw_ethtool_get_drvinfo()
10440 strlcpy(info->bus_info, pci_name(p->pci_dev), in ipw_ethtool_get_drvinfo()
10441 sizeof(info->bus_info)); in ipw_ethtool_get_drvinfo()
10447 return (priv->status & STATUS_ASSOCIATED) != 0; in ipw_ethtool_get_link()
10460 if (eeprom->offset + eeprom->len > IPW_EEPROM_IMAGE_SIZE) in ipw_ethtool_get_eeprom()
10461 return -EINVAL; in ipw_ethtool_get_eeprom()
10462 mutex_lock(&p->mutex); in ipw_ethtool_get_eeprom()
10463 memcpy(bytes, &p->eeprom[eeprom->offset], eeprom->len); in ipw_ethtool_get_eeprom()
10464 mutex_unlock(&p->mutex); in ipw_ethtool_get_eeprom()
10474 if (eeprom->offset + eeprom->len > IPW_EEPROM_IMAGE_SIZE) in ipw_ethtool_set_eeprom()
10475 return -EINVAL; in ipw_ethtool_set_eeprom()
10476 mutex_lock(&p->mutex); in ipw_ethtool_set_eeprom()
10477 memcpy(&p->eeprom[eeprom->offset], bytes, eeprom->len); in ipw_ethtool_set_eeprom()
10479 ipw_write8(p, i + IPW_EEPROM_DATA, p->eeprom[i]); in ipw_ethtool_set_eeprom()
10480 mutex_unlock(&p->mutex); in ipw_ethtool_set_eeprom()
10500 spin_lock(&priv->irq_lock); in ipw_isr()
10502 if (!(priv->status & STATUS_INT_ENABLED)) { in ipw_isr()
10529 priv->isr_inta = inta; in ipw_isr()
10531 tasklet_schedule(&priv->irq_tasklet); in ipw_isr()
10533 spin_unlock(&priv->irq_lock); in ipw_isr()
10537 spin_unlock(&priv->irq_lock); in ipw_isr()
10546 spin_lock_irqsave(&priv->lock, flags); in ipw_rf_kill()
10550 schedule_delayed_work(&priv->rf_kill, 2 * HZ); in ipw_rf_kill()
10556 if (!(priv->status & STATUS_RF_KILL_MASK)) { in ipw_rf_kill()
10561 schedule_work(&priv->adapter_restart); in ipw_rf_kill()
10567 spin_unlock_irqrestore(&priv->lock, flags); in ipw_rf_kill()
10574 mutex_lock(&priv->mutex); in ipw_bg_rf_kill()
10576 mutex_unlock(&priv->mutex); in ipw_bg_rf_kill()
10581 priv->last_seq_num = -1; in ipw_link_up()
10582 priv->last_frag_num = -1; in ipw_link_up()
10583 priv->last_packet_time = 0; in ipw_link_up()
10585 netif_carrier_on(priv->net_dev); in ipw_link_up()
10587 cancel_delayed_work(&priv->request_scan); in ipw_link_up()
10588 cancel_delayed_work(&priv->request_direct_scan); in ipw_link_up()
10589 cancel_delayed_work(&priv->request_passive_scan); in ipw_link_up()
10590 cancel_delayed_work(&priv->scan_event); in ipw_link_up()
10593 priv->last_rate = ipw_get_current_rate(priv); in ipw_link_up()
10598 if (priv->config & CFG_BACKGROUND_SCAN) in ipw_link_up()
10599 schedule_delayed_work(&priv->request_scan, HZ); in ipw_link_up()
10606 mutex_lock(&priv->mutex); in ipw_bg_link_up()
10608 mutex_unlock(&priv->mutex); in ipw_bg_link_up()
10614 netif_carrier_off(priv->net_dev); in ipw_link_down()
10618 cancel_delayed_work(&priv->request_scan); in ipw_link_down()
10619 cancel_delayed_work(&priv->request_direct_scan); in ipw_link_down()
10620 cancel_delayed_work(&priv->request_passive_scan); in ipw_link_down()
10621 cancel_delayed_work(&priv->adhoc_check); in ipw_link_down()
10622 cancel_delayed_work(&priv->gather_stats); in ipw_link_down()
10626 if (!(priv->status & STATUS_EXIT_PENDING)) { in ipw_link_down()
10628 schedule_delayed_work(&priv->request_scan, 0); in ipw_link_down()
10630 cancel_delayed_work(&priv->scan_event); in ipw_link_down()
10637 mutex_lock(&priv->mutex); in ipw_bg_link_down()
10639 mutex_unlock(&priv->mutex); in ipw_bg_link_down()
10644 init_waitqueue_head(&priv->wait_command_queue); in ipw_setup_deferred_work()
10645 init_waitqueue_head(&priv->wait_state); in ipw_setup_deferred_work()
10647 INIT_DELAYED_WORK(&priv->adhoc_check, ipw_bg_adhoc_check); in ipw_setup_deferred_work()
10648 INIT_WORK(&priv->associate, ipw_bg_associate); in ipw_setup_deferred_work()
10649 INIT_WORK(&priv->disassociate, ipw_bg_disassociate); in ipw_setup_deferred_work()
10650 INIT_WORK(&priv->system_config, ipw_system_config); in ipw_setup_deferred_work()
10651 INIT_WORK(&priv->rx_replenish, ipw_bg_rx_queue_replenish); in ipw_setup_deferred_work()
10652 INIT_WORK(&priv->adapter_restart, ipw_bg_adapter_restart); in ipw_setup_deferred_work()
10653 INIT_DELAYED_WORK(&priv->rf_kill, ipw_bg_rf_kill); in ipw_setup_deferred_work()
10654 INIT_WORK(&priv->up, ipw_bg_up); in ipw_setup_deferred_work()
10655 INIT_WORK(&priv->down, ipw_bg_down); in ipw_setup_deferred_work()
10656 INIT_DELAYED_WORK(&priv->request_scan, ipw_request_scan); in ipw_setup_deferred_work()
10657 INIT_DELAYED_WORK(&priv->request_direct_scan, ipw_request_direct_scan); in ipw_setup_deferred_work()
10658 INIT_DELAYED_WORK(&priv->request_passive_scan, ipw_request_passive_scan); in ipw_setup_deferred_work()
10659 INIT_DELAYED_WORK(&priv->scan_event, ipw_scan_event); in ipw_setup_deferred_work()
10660 INIT_DELAYED_WORK(&priv->gather_stats, ipw_bg_gather_stats); in ipw_setup_deferred_work()
10661 INIT_WORK(&priv->abort_scan, ipw_bg_abort_scan); in ipw_setup_deferred_work()
10662 INIT_WORK(&priv->roam, ipw_bg_roam); in ipw_setup_deferred_work()
10663 INIT_DELAYED_WORK(&priv->scan_check, ipw_bg_scan_check); in ipw_setup_deferred_work()
10664 INIT_WORK(&priv->link_up, ipw_bg_link_up); in ipw_setup_deferred_work()
10665 INIT_WORK(&priv->link_down, ipw_bg_link_down); in ipw_setup_deferred_work()
10666 INIT_DELAYED_WORK(&priv->led_link_on, ipw_bg_led_link_on); in ipw_setup_deferred_work()
10667 INIT_DELAYED_WORK(&priv->led_link_off, ipw_bg_led_link_off); in ipw_setup_deferred_work()
10668 INIT_DELAYED_WORK(&priv->led_act_off, ipw_bg_led_activity_off); in ipw_setup_deferred_work()
10669 INIT_WORK(&priv->merge_networks, ipw_merge_adhoc_network); in ipw_setup_deferred_work()
10672 INIT_WORK(&priv->qos_activate, ipw_bg_qos_activate); in ipw_setup_deferred_work()
10675 tasklet_setup(&priv->irq_tasklet, ipw_irq_tasklet); in ipw_setup_deferred_work()
10684 if (sec->flags & (1 << i)) { in shim__set_security()
10685 priv->ieee->sec.encode_alg[i] = sec->encode_alg[i]; in shim__set_security()
10686 priv->ieee->sec.key_sizes[i] = sec->key_sizes[i]; in shim__set_security()
10687 if (sec->key_sizes[i] == 0) in shim__set_security()
10688 priv->ieee->sec.flags &= ~(1 << i); in shim__set_security()
10690 memcpy(priv->ieee->sec.keys[i], sec->keys[i], in shim__set_security()
10691 sec->key_sizes[i]); in shim__set_security()
10692 priv->ieee->sec.flags |= (1 << i); in shim__set_security()
10694 priv->status |= STATUS_SECURITY_UPDATED; in shim__set_security()
10695 } else if (sec->level != SEC_LEVEL_1) in shim__set_security()
10696 priv->ieee->sec.flags &= ~(1 << i); in shim__set_security()
10699 if (sec->flags & SEC_ACTIVE_KEY) { in shim__set_security()
10700 priv->ieee->sec.active_key = sec->active_key; in shim__set_security()
10701 priv->ieee->sec.flags |= SEC_ACTIVE_KEY; in shim__set_security()
10702 priv->status |= STATUS_SECURITY_UPDATED; in shim__set_security()
10704 priv->ieee->sec.flags &= ~SEC_ACTIVE_KEY; in shim__set_security()
10706 if ((sec->flags & SEC_AUTH_MODE) && in shim__set_security()
10707 (priv->ieee->sec.auth_mode != sec->auth_mode)) { in shim__set_security()
10708 priv->ieee->sec.auth_mode = sec->auth_mode; in shim__set_security()
10709 priv->ieee->sec.flags |= SEC_AUTH_MODE; in shim__set_security()
10710 if (sec->auth_mode == WLAN_AUTH_SHARED_KEY) in shim__set_security()
10711 priv->capability |= CAP_SHARED_KEY; in shim__set_security()
10713 priv->capability &= ~CAP_SHARED_KEY; in shim__set_security()
10714 priv->status |= STATUS_SECURITY_UPDATED; in shim__set_security()
10717 if (sec->flags & SEC_ENABLED && priv->ieee->sec.enabled != sec->enabled) { in shim__set_security()
10718 priv->ieee->sec.flags |= SEC_ENABLED; in shim__set_security()
10719 priv->ieee->sec.enabled = sec->enabled; in shim__set_security()
10720 priv->status |= STATUS_SECURITY_UPDATED; in shim__set_security()
10721 if (sec->enabled) in shim__set_security()
10722 priv->capability |= CAP_PRIVACY_ON; in shim__set_security()
10724 priv->capability &= ~CAP_PRIVACY_ON; in shim__set_security()
10727 if (sec->flags & SEC_ENCRYPT) in shim__set_security()
10728 priv->ieee->sec.encrypt = sec->encrypt; in shim__set_security()
10730 if (sec->flags & SEC_LEVEL && priv->ieee->sec.level != sec->level) { in shim__set_security()
10731 priv->ieee->sec.level = sec->level; in shim__set_security()
10732 priv->ieee->sec.flags |= SEC_LEVEL; in shim__set_security()
10733 priv->status |= STATUS_SECURITY_UPDATED; in shim__set_security()
10736 if (!priv->ieee->host_encrypt && (sec->flags & SEC_ENCRYPT)) in shim__set_security()
10743 if ((priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING)) && in shim__set_security()
10744 (((priv->assoc_request.capability & in shim__set_security()
10745 cpu_to_le16(WLAN_CAPABILITY_PRIVACY)) && !sec->enabled) || in shim__set_security()
10746 (!(priv->assoc_request.capability & in shim__set_security()
10747 cpu_to_le16(WLAN_CAPABILITY_PRIVACY)) && sec->enabled))) { in shim__set_security()
10758 /* TODO: Mask out rates based on priv->rates_mask */ in init_supported_rates()
10762 switch (priv->ieee->freq_band) { in init_supported_rates()
10764 rates->ieee_mode = IPW_A_MODE; in init_supported_rates()
10765 rates->purpose = IPW_RATE_CAPABILITIES; in init_supported_rates()
10771 rates->ieee_mode = IPW_G_MODE; in init_supported_rates()
10772 rates->purpose = IPW_RATE_CAPABILITIES; in init_supported_rates()
10775 if (priv->ieee->modulation & LIBIPW_OFDM_MODULATION) { in init_supported_rates()
10794 if (ipw_send_adapter_address(priv, priv->net_dev->dev_addr)) in ipw_config()
10798 init_sys_config(&priv->sys_config); in ipw_config()
10803 unsigned char bt_caps = priv->eeprom[EEPROM_SKU_CAPABILITY]; in ipw_config()
10806 priv->sys_config.bt_coexistence in ipw_config()
10809 priv->sys_config.bt_coexistence in ipw_config()
10814 if (priv->prom_net_dev && netif_running(priv->prom_net_dev)) { in ipw_config()
10815 priv->sys_config.accept_all_data_frames = 1; in ipw_config()
10816 priv->sys_config.accept_non_directed_frames = 1; in ipw_config()
10817 priv->sys_config.accept_all_mgmt_bcpr = 1; in ipw_config()
10818 priv->sys_config.accept_all_mgmt_frames = 1; in ipw_config()
10822 if (priv->ieee->iw_mode == IW_MODE_ADHOC) in ipw_config()
10823 priv->sys_config.answer_broadcast_ssid_probe = 1; in ipw_config()
10825 priv->sys_config.answer_broadcast_ssid_probe = 0; in ipw_config()
10830 init_supported_rates(priv, &priv->rates); in ipw_config()
10831 if (ipw_send_supported_rates(priv, &priv->rates)) in ipw_config()
10834 /* Set request-to-send threshold */ in ipw_config()
10835 if (priv->rts_threshold) { in ipw_config()
10836 if (ipw_send_rts_threshold(priv, priv->rts_threshold)) in ipw_config()
10851 priv->status |= STATUS_INIT; in ipw_config()
10855 priv->notif_missed_beacons = 0; in ipw_config()
10858 if ((priv->capability & CAP_PRIVACY_ON) && in ipw_config()
10859 (priv->ieee->sec.level == SEC_LEVEL_1) && in ipw_config()
10860 !(priv->ieee->host_encrypt || priv->ieee->host_decrypt)) in ipw_config()
10866 return -EIO; in ipw_config()
10885 "---",
11134 if (!memcmp(&priv->eeprom[EEPROM_COUNTRY_CODE], in ipw_set_geo()
11141 priv->eeprom[EEPROM_COUNTRY_CODE + 0], in ipw_set_geo()
11142 priv->eeprom[EEPROM_COUNTRY_CODE + 1], in ipw_set_geo()
11143 priv->eeprom[EEPROM_COUNTRY_CODE + 2]); in ipw_set_geo()
11147 libipw_set_geo(priv->ieee, &ipw_geos[j]); in ipw_set_geo()
11156 if (priv->suspend_time) { in ipw_up()
11157 libipw_networks_age(priv->ieee, priv->suspend_time); in ipw_up()
11158 priv->suspend_time = 0; in ipw_up()
11161 if (priv->status & STATUS_EXIT_PENDING) in ipw_up()
11162 return -EIO; in ipw_up()
11164 if (cmdlog && !priv->cmdlog) { in ipw_up()
11165 priv->cmdlog = kcalloc(cmdlog, sizeof(*priv->cmdlog), in ipw_up()
11167 if (priv->cmdlog == NULL) { in ipw_up()
11170 return -ENOMEM; in ipw_up()
11172 priv->cmdlog_len = cmdlog; in ipw_up()
11186 if (!(priv->config & CFG_CUSTOM_MAC)) in ipw_up()
11187 eeprom_parse_mac(priv, priv->mac_addr); in ipw_up()
11188 memcpy(priv->net_dev->dev_addr, priv->mac_addr, ETH_ALEN); in ipw_up()
11192 if (priv->status & STATUS_RF_KILL_SW) { in ipw_up()
11199 schedule_delayed_work(&priv->rf_kill, 2 * HZ); in ipw_up()
11207 /* If configure to try and auto-associate, kick in ipw_up()
11209 schedule_delayed_work(&priv->request_scan, 0); in ipw_up()
11227 return -EIO; in ipw_up()
11234 mutex_lock(&priv->mutex); in ipw_bg_up()
11236 mutex_unlock(&priv->mutex); in ipw_bg_up()
11243 if (priv->status & STATUS_SCANNING) { in ipw_deinit()
11248 if (priv->status & STATUS_ASSOCIATED) { in ipw_deinit()
11258 for (i = 1000; i && (priv->status & in ipw_deinit()
11260 STATUS_ASSOCIATED | STATUS_SCANNING)); i--) in ipw_deinit()
11263 if (priv->status & (STATUS_DISASSOCIATING | in ipw_deinit()
11267 IPW_DEBUG_INFO("Took %dms to de-init\n", 1000 - i); in ipw_deinit()
11272 priv->status &= ~STATUS_INIT; in ipw_deinit()
11277 int exit_pending = priv->status & STATUS_EXIT_PENDING; in ipw_down()
11279 priv->status |= STATUS_EXIT_PENDING; in ipw_down()
11287 priv->status &= ~STATUS_EXIT_PENDING; in ipw_down()
11293 priv->status &= STATUS_RF_KILL_MASK | STATUS_EXIT_PENDING; in ipw_down()
11294 netif_carrier_off(priv->net_dev); in ipw_down()
11305 mutex_lock(&priv->mutex); in ipw_bg_down()
11307 mutex_unlock(&priv->mutex); in ipw_bg_down()
11314 const struct libipw_geo *geo = libipw_get_geo(priv->ieee); in ipw_wdev_init()
11315 struct wireless_dev *wdev = &priv->ieee->wdev; in ipw_wdev_init()
11317 memcpy(wdev->wiphy->perm_addr, priv->mac_addr, ETH_ALEN); in ipw_wdev_init()
11319 /* fill-out priv->ieee->bg_band */ in ipw_wdev_init()
11320 if (geo->bg_channels) { in ipw_wdev_init()
11321 struct ieee80211_supported_band *bg_band = &priv->ieee->bg_band; in ipw_wdev_init()
11323 bg_band->band = NL80211_BAND_2GHZ; in ipw_wdev_init()
11324 bg_band->n_channels = geo->bg_channels; in ipw_wdev_init()
11325 bg_band->channels = kcalloc(geo->bg_channels, in ipw_wdev_init()
11328 if (!bg_band->channels) { in ipw_wdev_init()
11329 rc = -ENOMEM; in ipw_wdev_init()
11332 /* translate geo->bg to bg_band.channels */ in ipw_wdev_init()
11333 for (i = 0; i < geo->bg_channels; i++) { in ipw_wdev_init()
11334 bg_band->channels[i].band = NL80211_BAND_2GHZ; in ipw_wdev_init()
11335 bg_band->channels[i].center_freq = geo->bg[i].freq; in ipw_wdev_init()
11336 bg_band->channels[i].hw_value = geo->bg[i].channel; in ipw_wdev_init()
11337 bg_band->channels[i].max_power = geo->bg[i].max_power; in ipw_wdev_init()
11338 if (geo->bg[i].flags & LIBIPW_CH_PASSIVE_ONLY) in ipw_wdev_init()
11339 bg_band->channels[i].flags |= in ipw_wdev_init()
11341 if (geo->bg[i].flags & LIBIPW_CH_NO_IBSS) in ipw_wdev_init()
11342 bg_band->channels[i].flags |= in ipw_wdev_init()
11344 if (geo->bg[i].flags & LIBIPW_CH_RADAR_DETECT) in ipw_wdev_init()
11345 bg_band->channels[i].flags |= in ipw_wdev_init()
11352 bg_band->bitrates = ipw2200_bg_rates; in ipw_wdev_init()
11353 bg_band->n_bitrates = ipw2200_num_bg_rates; in ipw_wdev_init()
11355 wdev->wiphy->bands[NL80211_BAND_2GHZ] = bg_band; in ipw_wdev_init()
11358 /* fill-out priv->ieee->a_band */ in ipw_wdev_init()
11359 if (geo->a_channels) { in ipw_wdev_init()
11360 struct ieee80211_supported_band *a_band = &priv->ieee->a_band; in ipw_wdev_init()
11362 a_band->band = NL80211_BAND_5GHZ; in ipw_wdev_init()
11363 a_band->n_channels = geo->a_channels; in ipw_wdev_init()
11364 a_band->channels = kcalloc(geo->a_channels, in ipw_wdev_init()
11367 if (!a_band->channels) { in ipw_wdev_init()
11368 rc = -ENOMEM; in ipw_wdev_init()
11371 /* translate geo->a to a_band.channels */ in ipw_wdev_init()
11372 for (i = 0; i < geo->a_channels; i++) { in ipw_wdev_init()
11373 a_band->channels[i].band = NL80211_BAND_5GHZ; in ipw_wdev_init()
11374 a_band->channels[i].center_freq = geo->a[i].freq; in ipw_wdev_init()
11375 a_band->channels[i].hw_value = geo->a[i].channel; in ipw_wdev_init()
11376 a_band->channels[i].max_power = geo->a[i].max_power; in ipw_wdev_init()
11377 if (geo->a[i].flags & LIBIPW_CH_PASSIVE_ONLY) in ipw_wdev_init()
11378 a_band->channels[i].flags |= in ipw_wdev_init()
11380 if (geo->a[i].flags & LIBIPW_CH_NO_IBSS) in ipw_wdev_init()
11381 a_band->channels[i].flags |= in ipw_wdev_init()
11383 if (geo->a[i].flags & LIBIPW_CH_RADAR_DETECT) in ipw_wdev_init()
11384 a_band->channels[i].flags |= in ipw_wdev_init()
11391 a_band->bitrates = ipw2200_a_rates; in ipw_wdev_init()
11392 a_band->n_bitrates = ipw2200_num_a_rates; in ipw_wdev_init()
11394 wdev->wiphy->bands[NL80211_BAND_5GHZ] = a_band; in ipw_wdev_init()
11397 wdev->wiphy->cipher_suites = ipw_cipher_suites; in ipw_wdev_init()
11398 wdev->wiphy->n_cipher_suites = ARRAY_SIZE(ipw_cipher_suites); in ipw_wdev_init()
11400 set_wiphy_dev(wdev->wiphy, &priv->pci_dev->dev); in ipw_wdev_init()
11403 if (wiphy_register(wdev->wiphy)) in ipw_wdev_init()
11404 rc = -EIO; in ipw_wdev_init()
11409 /* PCI driver stuff */
11438 MODULE_DEVICE_TABLE(pci, card_ids);
11477 struct ipw_priv *priv = prom_priv->priv; in ipw_prom_open()
11479 IPW_DEBUG_INFO("prom dev->open\n"); in ipw_prom_open()
11482 if (priv->ieee->iw_mode != IW_MODE_MONITOR) { in ipw_prom_open()
11483 priv->sys_config.accept_all_data_frames = 1; in ipw_prom_open()
11484 priv->sys_config.accept_non_directed_frames = 1; in ipw_prom_open()
11485 priv->sys_config.accept_all_mgmt_bcpr = 1; in ipw_prom_open()
11486 priv->sys_config.accept_all_mgmt_frames = 1; in ipw_prom_open()
11497 struct ipw_priv *priv = prom_priv->priv; in ipw_prom_stop()
11499 IPW_DEBUG_INFO("prom dev->stop\n"); in ipw_prom_stop()
11501 if (priv->ieee->iw_mode != IW_MODE_MONITOR) { in ipw_prom_stop()
11502 priv->sys_config.accept_all_data_frames = 0; in ipw_prom_stop()
11503 priv->sys_config.accept_non_directed_frames = 0; in ipw_prom_stop()
11504 priv->sys_config.accept_all_mgmt_bcpr = 0; in ipw_prom_stop()
11505 priv->sys_config.accept_all_mgmt_frames = 0; in ipw_prom_stop()
11516 IPW_DEBUG_INFO("prom dev->xmit\n"); in ipw_prom_hard_start_xmit()
11533 if (priv->prom_net_dev) in ipw_prom_alloc()
11534 return -EPERM; in ipw_prom_alloc()
11536 priv->prom_net_dev = alloc_libipw(sizeof(struct ipw_prom_priv), 1); in ipw_prom_alloc()
11537 if (priv->prom_net_dev == NULL) in ipw_prom_alloc()
11538 return -ENOMEM; in ipw_prom_alloc()
11540 priv->prom_priv = libipw_priv(priv->prom_net_dev); in ipw_prom_alloc()
11541 priv->prom_priv->ieee = netdev_priv(priv->prom_net_dev); in ipw_prom_alloc()
11542 priv->prom_priv->priv = priv; in ipw_prom_alloc()
11544 strcpy(priv->prom_net_dev->name, "rtap%d"); in ipw_prom_alloc()
11545 memcpy(priv->prom_net_dev->dev_addr, priv->mac_addr, ETH_ALEN); in ipw_prom_alloc()
11547 priv->prom_net_dev->type = ARPHRD_IEEE80211_RADIOTAP; in ipw_prom_alloc()
11548 priv->prom_net_dev->netdev_ops = &ipw_prom_netdev_ops; in ipw_prom_alloc()
11550 priv->prom_net_dev->min_mtu = 68; in ipw_prom_alloc()
11551 priv->prom_net_dev->max_mtu = LIBIPW_DATA_LEN; in ipw_prom_alloc()
11553 priv->prom_priv->ieee->iw_mode = IW_MODE_MONITOR; in ipw_prom_alloc()
11554 SET_NETDEV_DEV(priv->prom_net_dev, &priv->pci_dev->dev); in ipw_prom_alloc()
11556 rc = register_netdev(priv->prom_net_dev); in ipw_prom_alloc()
11558 free_libipw(priv->prom_net_dev, 1); in ipw_prom_alloc()
11559 priv->prom_net_dev = NULL; in ipw_prom_alloc()
11568 if (!priv->prom_net_dev) in ipw_prom_free()
11571 unregister_netdev(priv->prom_net_dev); in ipw_prom_free()
11572 free_libipw(priv->prom_net_dev, 1); in ipw_prom_free()
11574 priv->prom_net_dev = NULL; in ipw_prom_free()
11600 err = -ENOMEM; in ipw_pci_probe()
11605 priv->ieee = netdev_priv(net_dev); in ipw_pci_probe()
11607 priv->net_dev = net_dev; in ipw_pci_probe()
11608 priv->pci_dev = pdev; in ipw_pci_probe()
11610 spin_lock_init(&priv->irq_lock); in ipw_pci_probe()
11611 spin_lock_init(&priv->lock); in ipw_pci_probe()
11613 INIT_LIST_HEAD(&priv->ibss_mac_hash[i]); in ipw_pci_probe()
11615 mutex_init(&priv->mutex); in ipw_pci_probe()
11617 err = -ENODEV; in ipw_pci_probe()
11623 err = dma_set_mask(&pdev->dev, DMA_BIT_MASK(32)); in ipw_pci_probe()
11625 err = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32)); in ipw_pci_probe()
11638 * PCI Tx retries from interfering with C3 CPU state */ in ipw_pci_probe()
11644 priv->hw_len = length; in ipw_pci_probe()
11648 err = -ENODEV; in ipw_pci_probe()
11652 priv->hw_base = base; in ipw_pci_probe()
11660 err = request_irq(pdev->irq, ipw_isr, IRQF_SHARED, DRV_NAME, priv); in ipw_pci_probe()
11662 IPW_ERROR("Error allocating IRQ %d\n", pdev->irq); in ipw_pci_probe()
11666 SET_NETDEV_DEV(net_dev, &pdev->dev); in ipw_pci_probe()
11668 mutex_lock(&priv->mutex); in ipw_pci_probe()
11670 priv->ieee->hard_start_xmit = ipw_net_hard_start_xmit; in ipw_pci_probe()
11671 priv->ieee->set_security = shim__set_security; in ipw_pci_probe()
11672 priv->ieee->is_queue_full = ipw_net_is_queue_full; in ipw_pci_probe()
11675 priv->ieee->is_qos_active = ipw_is_qos_active; in ipw_pci_probe()
11676 priv->ieee->handle_probe_response = ipw_handle_beacon; in ipw_pci_probe()
11677 priv->ieee->handle_beacon = ipw_handle_probe_response; in ipw_pci_probe()
11678 priv->ieee->handle_assoc_response = ipw_handle_assoc_response; in ipw_pci_probe()
11681 priv->ieee->perfect_rssi = -20; in ipw_pci_probe()
11682 priv->ieee->worst_rssi = -85; in ipw_pci_probe()
11684 net_dev->netdev_ops = &ipw_netdev_ops; in ipw_pci_probe()
11685 priv->wireless_data.spy_data = &priv->ieee->spy_data; in ipw_pci_probe()
11686 net_dev->wireless_data = &priv->wireless_data; in ipw_pci_probe()
11687 net_dev->wireless_handlers = &ipw_wx_handler_def; in ipw_pci_probe()
11688 net_dev->ethtool_ops = &ipw_ethtool_ops; in ipw_pci_probe()
11690 net_dev->min_mtu = 68; in ipw_pci_probe()
11691 net_dev->max_mtu = LIBIPW_DATA_LEN; in ipw_pci_probe()
11693 err = sysfs_create_group(&pdev->dev.kobj, &ipw_attribute_group); in ipw_pci_probe()
11696 mutex_unlock(&priv->mutex); in ipw_pci_probe()
11701 mutex_unlock(&priv->mutex); in ipw_pci_probe()
11702 err = -EIO; in ipw_pci_probe()
11706 mutex_unlock(&priv->mutex); in ipw_pci_probe()
11726 unregister_netdev(priv->net_dev); in ipw_pci_probe()
11734 priv->ieee->geo.name, priv->ieee->geo.bg_channels, in ipw_pci_probe()
11735 priv->ieee->geo.a_channels); in ipw_pci_probe()
11740 wiphy_unregister(priv->ieee->wdev.wiphy); in ipw_pci_probe()
11741 kfree(priv->ieee->a_band.channels); in ipw_pci_probe()
11742 kfree(priv->ieee->bg_band.channels); in ipw_pci_probe()
11744 sysfs_remove_group(&pdev->dev.kobj, &ipw_attribute_group); in ipw_pci_probe()
11746 free_irq(pdev->irq, priv); in ipw_pci_probe()
11748 iounmap(priv->hw_base); in ipw_pci_probe()
11754 free_libipw(priv->net_dev, 0); in ipw_pci_probe()
11768 mutex_lock(&priv->mutex); in ipw_pci_remove()
11770 priv->status |= STATUS_EXIT_PENDING; in ipw_pci_remove()
11772 sysfs_remove_group(&pdev->dev.kobj, &ipw_attribute_group); in ipw_pci_remove()
11774 mutex_unlock(&priv->mutex); in ipw_pci_remove()
11776 unregister_netdev(priv->net_dev); in ipw_pci_remove()
11778 if (priv->rxq) { in ipw_pci_remove()
11779 ipw_rx_queue_free(priv, priv->rxq); in ipw_pci_remove()
11780 priv->rxq = NULL; in ipw_pci_remove()
11784 if (priv->cmdlog) { in ipw_pci_remove()
11785 kfree(priv->cmdlog); in ipw_pci_remove()
11786 priv->cmdlog = NULL; in ipw_pci_remove()
11790 cancel_delayed_work_sync(&priv->adhoc_check); in ipw_pci_remove()
11791 cancel_work_sync(&priv->associate); in ipw_pci_remove()
11792 cancel_work_sync(&priv->disassociate); in ipw_pci_remove()
11793 cancel_work_sync(&priv->system_config); in ipw_pci_remove()
11794 cancel_work_sync(&priv->rx_replenish); in ipw_pci_remove()
11795 cancel_work_sync(&priv->adapter_restart); in ipw_pci_remove()
11796 cancel_delayed_work_sync(&priv->rf_kill); in ipw_pci_remove()
11797 cancel_work_sync(&priv->up); in ipw_pci_remove()
11798 cancel_work_sync(&priv->down); in ipw_pci_remove()
11799 cancel_delayed_work_sync(&priv->request_scan); in ipw_pci_remove()
11800 cancel_delayed_work_sync(&priv->request_direct_scan); in ipw_pci_remove()
11801 cancel_delayed_work_sync(&priv->request_passive_scan); in ipw_pci_remove()
11802 cancel_delayed_work_sync(&priv->scan_event); in ipw_pci_remove()
11803 cancel_delayed_work_sync(&priv->gather_stats); in ipw_pci_remove()
11804 cancel_work_sync(&priv->abort_scan); in ipw_pci_remove()
11805 cancel_work_sync(&priv->roam); in ipw_pci_remove()
11806 cancel_delayed_work_sync(&priv->scan_check); in ipw_pci_remove()
11807 cancel_work_sync(&priv->link_up); in ipw_pci_remove()
11808 cancel_work_sync(&priv->link_down); in ipw_pci_remove()
11809 cancel_delayed_work_sync(&priv->led_link_on); in ipw_pci_remove()
11810 cancel_delayed_work_sync(&priv->led_link_off); in ipw_pci_remove()
11811 cancel_delayed_work_sync(&priv->led_act_off); in ipw_pci_remove()
11812 cancel_work_sync(&priv->merge_networks); in ipw_pci_remove()
11816 list_for_each_safe(p, q, &priv->ibss_mac_hash[i]) { in ipw_pci_remove()
11822 kfree(priv->error); in ipw_pci_remove()
11823 priv->error = NULL; in ipw_pci_remove()
11829 free_irq(pdev->irq, priv); in ipw_pci_remove()
11830 iounmap(priv->hw_base); in ipw_pci_remove()
11834 wiphy_unregister(priv->ieee->wdev.wiphy); in ipw_pci_remove()
11835 kfree(priv->ieee->a_band.channels); in ipw_pci_remove()
11836 kfree(priv->ieee->bg_band.channels); in ipw_pci_remove()
11837 free_libipw(priv->net_dev, 0); in ipw_pci_remove()
11844 struct net_device *dev = priv->net_dev; in ipw_pci_suspend()
11846 printk(KERN_INFO "%s: Going into suspend...\n", dev->name); in ipw_pci_suspend()
11854 priv->suspend_at = ktime_get_boottime_seconds(); in ipw_pci_suspend()
11863 struct net_device *dev = priv->net_dev; in ipw_pci_resume()
11866 printk(KERN_INFO "%s: Coming out of suspend...\n", dev->name); in ipw_pci_resume()
11869 * Suspend/Resume resets the PCI configuration space, so we have to in ipw_pci_resume()
11870 * re-disable the RETRY_TIMEOUT register (0x41) to keep PCI Tx retries in ipw_pci_resume()
11872 * here since it only restores the first 64 bytes pci config header. in ipw_pci_resume()
11882 priv->suspend_time = ktime_get_boottime_seconds() - priv->suspend_at; in ipw_pci_resume()
11885 schedule_work(&priv->up); in ipw_pci_resume()
11921 IPW_ERROR("Unable to initialize PCI module\n"); in ipw_init()
11961 MODULE_PARM_DESC(rtap_iface, "create the rtap interface (1 - create, default 0)");