Lines Matching +full:tx +full:- +full:sec
1 // SPDX-License-Identifier: GPL-2.0-only
4 Copyright(c) 2003 - 2006 Intel Corporation. All rights reserved.
9 Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
12 Extensions 0.26 package and copyright (c) 1997-2003 Jean Tourrilhes
16 Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen
18 Copyright (c) 2002-2003, Jouni Malinen <[email protected]>
34 Tx - Commands and Data
54 The Tx flow cycle is as follows:
68 8) For each Tx interrupt received from the firmware, the READ index is checked
84 There are two locks utilized. The first is the low level lock (priv->low_lock)
87 - Access to the Tx/Rx queue lists via priv->low_lock. The lists are as follows:
89 tx_free_list : Holds pre-allocated Tx buffers.
93 tx_pend_list : Holds used Tx buffers waiting to go into the TBD ring
97 msg_free_list : Holds pre-allocated Msg (Command) buffers
105 The flow of data on the TX side is as follows:
110 The methods that work on the TBD ring are protected via priv->low_lock.
112 - The internal data state of the device itself
113 - Access to the firmware read/write indexes for the BD queues
116 All external entry functions are locked with the priv->action_lock to ensure
134 #include <linux/dma-mapping.h>
154 #define IPW2100_VERSION "git-1.2.2"
159 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
302 /* Pre-decl until we get the code solid and then we can clean it up */
329 *val = ioread32(priv->ioaddr + reg); in read_register()
337 iowrite32(val, priv->ioaddr + reg); in write_register()
346 *val = ioread16(priv->ioaddr + reg); in read_register_word()
354 *val = ioread8(priv->ioaddr + reg); in read_register_byte()
362 iowrite16(val, priv->ioaddr + reg); in write_register_word()
370 iowrite8(val, priv->ioaddr + reg); in write_register_byte()
426 dif_len = addr - aligned_addr; in write_nic_memory()
436 len -= dif_len; in write_nic_memory()
447 dif_len = len - aligned_len; in write_nic_memory()
464 dif_len = addr - aligned_addr; in read_nic_memory()
474 len -= dif_len; in read_nic_memory()
485 dif_len = len - aligned_len; in read_nic_memory()
503 struct ipw2100_ordinals *ordinals = &priv->ordinals; in ipw2100_get_ordinal()
510 if (ordinals->table1_addr == 0) { in ipw2100_get_ordinal()
513 return -EINVAL; in ipw2100_get_ordinal()
524 return -EINVAL; in ipw2100_get_ordinal()
527 read_nic_dword(priv->net_dev, in ipw2100_get_ordinal()
528 ordinals->table1_addr + (ord << 2), &addr); in ipw2100_get_ordinal()
529 read_nic_dword(priv->net_dev, addr, val); in ipw2100_get_ordinal()
538 ord -= IPW_START_ORD_TAB_2; in ipw2100_get_ordinal()
541 read_nic_dword(priv->net_dev, in ipw2100_get_ordinal()
542 ordinals->table2_addr + (ord << 3), &addr); in ipw2100_get_ordinal()
545 * two 16-bit words - first is length, second is count */ in ipw2100_get_ordinal()
546 read_nic_dword(priv->net_dev, in ipw2100_get_ordinal()
547 ordinals->table2_addr + (ord << 3) + sizeof(u32), in ipw2100_get_ordinal()
560 return -EINVAL; in ipw2100_get_ordinal()
568 read_nic_memory(priv->net_dev, addr, total_length, val); in ipw2100_get_ordinal()
576 return -EINVAL; in ipw2100_get_ordinal()
582 struct ipw2100_ordinals *ordinals = &priv->ordinals; in ipw2100_set_ordinal()
589 return -EINVAL; in ipw2100_set_ordinal()
592 read_nic_dword(priv->net_dev, in ipw2100_set_ordinal()
593 ordinals->table1_addr + (ord << 2), &addr); in ipw2100_set_ordinal()
595 write_nic_dword(priv->net_dev, addr, *val); in ipw2100_set_ordinal()
604 return -EINVAL; in ipw2100_set_ordinal()
606 return -EINVAL; in ipw2100_set_ordinal()
618 out += scnprintf(buf + out, count - out, " "); in snprint_line()
620 out += scnprintf(buf + out, count - out, "%02X ", in snprint_line()
623 out += scnprintf(buf + out, count - out, " "); in snprint_line()
626 out += scnprintf(buf + out, count - out, " "); in snprint_line()
628 out += scnprintf(buf + out, count - out, " "); in snprint_line()
634 out += scnprintf(buf + out, count - out, "%c", c); in snprint_line()
638 out += scnprintf(buf + out, count - out, " "); in snprint_line()
656 len -= min(len, 16U); in printk_buf()
669 if (priv->reset_backoff && in schedule_reset()
670 (now - priv->last_reset > priv->reset_backoff)) in schedule_reset()
671 priv->reset_backoff = 0; in schedule_reset()
673 priv->last_reset = now; in schedule_reset()
675 if (!(priv->status & STATUS_RESET_PENDING)) { in schedule_reset()
677 priv->net_dev->name, priv->reset_backoff); in schedule_reset()
678 netif_carrier_off(priv->net_dev); in schedule_reset()
679 netif_stop_queue(priv->net_dev); in schedule_reset()
680 priv->status |= STATUS_RESET_PENDING; in schedule_reset()
681 if (priv->reset_backoff) in schedule_reset()
682 schedule_delayed_work(&priv->reset_work, in schedule_reset()
683 priv->reset_backoff * HZ); in schedule_reset()
685 schedule_delayed_work(&priv->reset_work, 0); in schedule_reset()
687 if (priv->reset_backoff < MAX_RESET_BACKOFF) in schedule_reset()
688 priv->reset_backoff++; in schedule_reset()
690 wake_up_interruptible(&priv->wait_command_queue); in schedule_reset()
693 priv->net_dev->name); in schedule_reset()
707 command_types[cmd->host_command], cmd->host_command, in ipw2100_hw_send_command()
708 cmd->host_command_length); in ipw2100_hw_send_command()
709 printk_buf(IPW_DL_HC, (u8 *) cmd->host_command_parameters, in ipw2100_hw_send_command()
710 cmd->host_command_length); in ipw2100_hw_send_command()
712 spin_lock_irqsave(&priv->low_lock, flags); in ipw2100_hw_send_command()
714 if (priv->fatal_error) { in ipw2100_hw_send_command()
717 err = -EIO; in ipw2100_hw_send_command()
721 if (!(priv->status & STATUS_RUNNING)) { in ipw2100_hw_send_command()
724 err = -EIO; in ipw2100_hw_send_command()
728 if (priv->status & STATUS_CMD_ACTIVE) { in ipw2100_hw_send_command()
731 err = -EBUSY; in ipw2100_hw_send_command()
735 if (list_empty(&priv->msg_free_list)) { in ipw2100_hw_send_command()
740 priv->status |= STATUS_CMD_ACTIVE; in ipw2100_hw_send_command()
741 priv->messages_sent++; in ipw2100_hw_send_command()
743 element = priv->msg_free_list.next; in ipw2100_hw_send_command()
746 packet->jiffy_start = jiffies; in ipw2100_hw_send_command()
749 packet->info.c_struct.cmd->host_command_reg = cmd->host_command; in ipw2100_hw_send_command()
750 packet->info.c_struct.cmd->host_command_reg1 = cmd->host_command1; in ipw2100_hw_send_command()
751 packet->info.c_struct.cmd->host_command_len_reg = in ipw2100_hw_send_command()
752 cmd->host_command_length; in ipw2100_hw_send_command()
753 packet->info.c_struct.cmd->sequence = cmd->host_command_sequence; in ipw2100_hw_send_command()
755 memcpy(packet->info.c_struct.cmd->host_command_params_reg, in ipw2100_hw_send_command()
756 cmd->host_command_parameters, in ipw2100_hw_send_command()
757 sizeof(packet->info.c_struct.cmd->host_command_params_reg)); in ipw2100_hw_send_command()
760 DEC_STAT(&priv->msg_free_stat); in ipw2100_hw_send_command()
762 list_add_tail(element, &priv->msg_pend_list); in ipw2100_hw_send_command()
763 INC_STAT(&priv->msg_pend_stat); in ipw2100_hw_send_command()
768 spin_unlock_irqrestore(&priv->low_lock, flags); in ipw2100_hw_send_command()
777 wait_event_interruptible_timeout(priv->wait_command_queue, in ipw2100_hw_send_command()
778 !(priv-> in ipw2100_hw_send_command()
785 priv->fatal_error = IPW2100_ERR_MSG_TIMEOUT; in ipw2100_hw_send_command()
786 priv->status &= ~STATUS_CMD_ACTIVE; in ipw2100_hw_send_command()
788 return -EIO; in ipw2100_hw_send_command()
791 if (priv->fatal_error) { in ipw2100_hw_send_command()
793 priv->net_dev->name); in ipw2100_hw_send_command()
794 return -EIO; in ipw2100_hw_send_command()
807 spin_unlock_irqrestore(&priv->low_lock, flags); in ipw2100_hw_send_command()
824 /* Domain 0 check - all values should be DOA_DEBUG */ in ipw2100_verify()
827 read_register(priv->net_dev, address, &data1); in ipw2100_verify()
829 return -EIO; in ipw2100_verify()
832 /* Domain 1 check - use arbitrary read/write compare */ in ipw2100_verify()
835 write_register(priv->net_dev, IPW_REG_DOMAIN_1_OFFSET + 0x32, in ipw2100_verify()
837 write_register(priv->net_dev, IPW_REG_DOMAIN_1_OFFSET + 0x36, in ipw2100_verify()
839 read_register(priv->net_dev, IPW_REG_DOMAIN_1_OFFSET + 0x32, in ipw2100_verify()
841 read_register(priv->net_dev, IPW_REG_DOMAIN_1_OFFSET + 0x36, in ipw2100_verify()
847 return -EIO; in ipw2100_verify()
880 ((priv->status & STATUS_ENABLED) ? in ipw2100_wait_for_card_state()
883 priv->status |= STATUS_ENABLED; in ipw2100_wait_for_card_state()
885 priv->status &= ~STATUS_ENABLED; in ipw2100_wait_for_card_state()
895 return -EIO; in ipw2100_wait_for_card_state()
909 write_register(priv->net_dev, IPW_REG_RESET_REG, in sw_reset_and_clock()
917 read_register(priv->net_dev, IPW_REG_RESET_REG, &r); in sw_reset_and_clock()
923 return -EIO; // TODO: better error value in sw_reset_and_clock()
927 write_register(priv->net_dev, IPW_REG_GP_CNTRL, in sw_reset_and_clock()
935 read_register(priv->net_dev, IPW_REG_GP_CNTRL, &r); in sw_reset_and_clock()
941 return -EIO; /* TODO: better error value */ in sw_reset_and_clock()
944 read_register(priv->net_dev, IPW_REG_GP_CNTRL, &r); in sw_reset_and_clock()
945 write_register(priv->net_dev, IPW_REG_GP_CNTRL, in sw_reset_and_clock()
959 5. zero-out shared mem
972 if (priv->fatal_error) { in ipw2100_download_firmware()
975 priv->net_dev->name, priv->fatal_error); in ipw2100_download_firmware()
976 return -EINVAL; in ipw2100_download_firmware()
983 priv->net_dev->name, err); in ipw2100_download_firmware()
984 priv->fatal_error = IPW2100_ERR_FW_LOAD; in ipw2100_download_firmware()
992 priv->net_dev->name, err); in ipw2100_download_firmware()
993 priv->fatal_error = IPW2100_ERR_FW_LOAD; in ipw2100_download_firmware()
997 priv->firmware_version = ipw2100_firmware.version; in ipw2100_download_firmware()
1003 priv->net_dev->name, err); in ipw2100_download_firmware()
1010 priv->net_dev->name, err); in ipw2100_download_firmware()
1015 write_nic_dword(priv->net_dev, in ipw2100_download_firmware()
1019 write_register(priv->net_dev, IPW_REG_RESET_REG, 0); in ipw2100_download_firmware()
1025 priv->net_dev->name, err); in ipw2100_download_firmware()
1030 write_nic_dword(priv->net_dev, in ipw2100_download_firmware()
1038 priv->net_dev->name, err); in ipw2100_download_firmware()
1046 priv->net_dev->name, err); in ipw2100_download_firmware()
1054 * from the disk. --YZ in ipw2100_download_firmware()
1064 write_nic_dword(priv->net_dev, address, 0); in ipw2100_download_firmware()
1067 write_nic_dword(priv->net_dev, address, 0); in ipw2100_download_firmware()
1070 write_nic_dword(priv->net_dev, address, 0); in ipw2100_download_firmware()
1073 write_nic_dword(priv->net_dev, address, 0); in ipw2100_download_firmware()
1076 write_nic_dword(priv->net_dev, address, 0); in ipw2100_download_firmware()
1087 if (priv->status & STATUS_INT_ENABLED) in ipw2100_enable_interrupts()
1089 priv->status |= STATUS_INT_ENABLED; in ipw2100_enable_interrupts()
1090 write_register(priv->net_dev, IPW_REG_INTA_MASK, IPW_INTERRUPT_MASK); in ipw2100_enable_interrupts()
1095 if (!(priv->status & STATUS_INT_ENABLED)) in ipw2100_disable_interrupts()
1097 priv->status &= ~STATUS_INT_ENABLED; in ipw2100_disable_interrupts()
1098 write_register(priv->net_dev, IPW_REG_INTA_MASK, 0x0); in ipw2100_disable_interrupts()
1103 struct ipw2100_ordinals *ord = &priv->ordinals; in ipw2100_initialize_ordinals()
1107 read_register(priv->net_dev, IPW_MEM_HOST_SHARED_ORDINALS_TABLE_1, in ipw2100_initialize_ordinals()
1108 &ord->table1_addr); in ipw2100_initialize_ordinals()
1110 read_register(priv->net_dev, IPW_MEM_HOST_SHARED_ORDINALS_TABLE_2, in ipw2100_initialize_ordinals()
1111 &ord->table2_addr); in ipw2100_initialize_ordinals()
1113 read_nic_dword(priv->net_dev, ord->table1_addr, &ord->table1_size); in ipw2100_initialize_ordinals()
1114 read_nic_dword(priv->net_dev, ord->table2_addr, &ord->table2_size); in ipw2100_initialize_ordinals()
1116 ord->table2_size &= 0x0000FFFF; in ipw2100_initialize_ordinals()
1118 IPW_DEBUG_INFO("table 1 size: %d\n", ord->table1_size); in ipw2100_initialize_ordinals()
1119 IPW_DEBUG_INFO("table 2 size: %d\n", ord->table2_size); in ipw2100_initialize_ordinals()
1132 write_register(priv->net_dev, IPW_REG_GPIO, reg); in ipw2100_hw_set_gpio()
1144 if (!(priv->hw_features & HW_FEATURE_RFKILL)) { in rf_kill_active()
1145 wiphy_rfkill_set_hw_state(priv->ieee->wdev.wiphy, false); in rf_kill_active()
1146 priv->status &= ~STATUS_RF_KILL_HW; in rf_kill_active()
1152 read_register(priv->net_dev, IPW_REG_GPIO, ®); in rf_kill_active()
1157 wiphy_rfkill_set_hw_state(priv->ieee->wdev.wiphy, true); in rf_kill_active()
1158 priv->status |= STATUS_RF_KILL_HW; in rf_kill_active()
1160 wiphy_rfkill_set_hw_state(priv->ieee->wdev.wiphy, false); in rf_kill_active()
1161 priv->status &= ~STATUS_RF_KILL_HW; in rf_kill_active()
1180 return -EIO; in ipw2100_get_hw_features()
1188 read_nic_dword(priv->net_dev, addr + 0xFC, &val); in ipw2100_get_hw_features()
1189 priv->eeprom_version = (val >> 24) & 0xFF; in ipw2100_get_hw_features()
1190 IPW_DEBUG_INFO("EEPROM version: %d\n", priv->eeprom_version); in ipw2100_get_hw_features()
1199 read_nic_dword(priv->net_dev, addr + 0x20, &val); in ipw2100_get_hw_features()
1201 priv->hw_features |= HW_FEATURE_RFKILL; in ipw2100_get_hw_features()
1204 (priv->hw_features & HW_FEATURE_RFKILL) ? "" : "not "); in ipw2100_get_hw_features()
1222 if (priv->status & STATUS_RUNNING) in ipw2100_start_adapter()
1226 * Initialize the hw - drive adapter to DO state by setting in ipw2100_start_adapter()
1233 priv->net_dev->name); in ipw2100_start_adapter()
1234 return -EIO; in ipw2100_start_adapter()
1237 /* Clear the Tx, Rx and Msg queues and the r/w indexes in ipw2100_start_adapter()
1243 /* TODO -- Look at disabling interrupts here to make sure none in ipw2100_start_adapter()
1246 /* Release ARC - clear reset bit */ in ipw2100_start_adapter()
1247 write_register(priv->net_dev, IPW_REG_RESET_REG, 0); in ipw2100_start_adapter()
1256 read_register(priv->net_dev, IPW_REG_INTA, &inta); in ipw2100_start_adapter()
1261 write_register(priv->net_dev, IPW_REG_INTA, in ipw2100_start_adapter()
1272 write_register(priv->net_dev, IPW_REG_INTA, in ipw2100_start_adapter()
1276 } while (--i); in ipw2100_start_adapter()
1280 read_register(priv->net_dev, IPW_REG_INTA, &inta); in ipw2100_start_adapter()
1281 read_register(priv->net_dev, IPW_REG_INTA_MASK, &inta_mask); in ipw2100_start_adapter()
1285 write_register(priv->net_dev, IPW_REG_INTA, inta); in ipw2100_start_adapter()
1293 priv->net_dev->name); in ipw2100_start_adapter()
1294 return -EIO; in ipw2100_start_adapter()
1298 read_register(priv->net_dev, IPW_REG_GPIO, &gpio); in ipw2100_start_adapter()
1302 write_register(priv->net_dev, IPW_REG_GPIO, gpio); in ipw2100_start_adapter()
1305 priv->status |= STATUS_RUNNING; in ipw2100_start_adapter()
1308 priv->status &= ~(STATUS_ASSOCIATING | STATUS_ASSOCIATED); in ipw2100_start_adapter()
1317 if (!priv->fatal_error) in ipw2100_reset_fatalerror()
1320 priv->fatal_errors[priv->fatal_index++] = priv->fatal_error; in ipw2100_reset_fatalerror()
1321 priv->fatal_index %= IPW2100_ERROR_QUEUE; in ipw2100_reset_fatalerror()
1322 priv->fatal_error = 0; in ipw2100_reset_fatalerror()
1336 write_register(priv->net_dev, IPW_REG_RESET_REG, in ipw2100_power_cycle_adapter()
1344 read_register(priv->net_dev, IPW_REG_RESET_REG, ®); in ipw2100_power_cycle_adapter()
1348 } while (--i); in ipw2100_power_cycle_adapter()
1350 priv->status &= ~STATUS_RESET_PENDING; in ipw2100_power_cycle_adapter()
1354 ("exit - waited too long for master assert stop\n"); in ipw2100_power_cycle_adapter()
1355 return -EIO; in ipw2100_power_cycle_adapter()
1358 write_register(priv->net_dev, IPW_REG_RESET_REG, in ipw2100_power_cycle_adapter()
1365 priv->status &= ~(STATUS_RUNNING | STATUS_ASSOCIATING | in ipw2100_power_cycle_adapter()
1400 read_nic_dword(priv->net_dev, IPW2100_CONTROL_REG, &val1); in ipw2100_hw_phy_off()
1401 read_nic_dword(priv->net_dev, IPW2100_COMMAND, &val2); in ipw2100_hw_phy_off()
1410 return -EIO; in ipw2100_hw_phy_off()
1424 if (priv->status & STATUS_ENABLED) in ipw2100_enable_adapter()
1427 mutex_lock(&priv->adapter_mutex); in ipw2100_enable_adapter()
1443 priv->net_dev->name); in ipw2100_enable_adapter()
1447 if (priv->stop_hang_check) { in ipw2100_enable_adapter()
1448 priv->stop_hang_check = 0; in ipw2100_enable_adapter()
1449 schedule_delayed_work(&priv->hang_check, HZ / 2); in ipw2100_enable_adapter()
1453 mutex_unlock(&priv->adapter_mutex); in ipw2100_enable_adapter()
1469 if (!(priv->status & STATUS_RUNNING)) in ipw2100_hw_stop_adapter()
1472 priv->status |= STATUS_STOPPING; in ipw2100_hw_stop_adapter()
1477 if (!priv->fatal_error) { in ipw2100_hw_stop_adapter()
1488 * If in D0-standby mode going directly to D3 may cause a in ipw2100_hw_stop_adapter()
1494 * out of D0-standby if it is already in that state. in ipw2100_hw_stop_adapter()
1501 * take HW out of D0-standby and prepare it for D3 state. in ipw2100_hw_stop_adapter()
1513 priv->net_dev->name, err); in ipw2100_hw_stop_adapter()
1518 priv->status &= ~STATUS_ENABLED; in ipw2100_hw_stop_adapter()
1534 write_register(priv->net_dev, IPW_REG_RESET_REG, in ipw2100_hw_stop_adapter()
1539 for (i = 5; i > 0; i--) { in ipw2100_hw_stop_adapter()
1543 read_register(priv->net_dev, IPW_REG_RESET_REG, ®); in ipw2100_hw_stop_adapter()
1552 priv->net_dev->name); in ipw2100_hw_stop_adapter()
1555 write_register(priv->net_dev, IPW_REG_RESET_REG, in ipw2100_hw_stop_adapter()
1558 priv->status &= ~(STATUS_RUNNING | STATUS_STOPPING); in ipw2100_hw_stop_adapter()
1574 if (!(priv->status & STATUS_ENABLED)) in ipw2100_disable_adapter()
1578 priv->status &= ~(STATUS_ASSOCIATED | STATUS_ASSOCIATING); in ipw2100_disable_adapter()
1580 if (!priv->stop_hang_check) { in ipw2100_disable_adapter()
1581 priv->stop_hang_check = 1; in ipw2100_disable_adapter()
1582 cancel_delayed_work(&priv->hang_check); in ipw2100_disable_adapter()
1585 mutex_lock(&priv->adapter_mutex); in ipw2100_disable_adapter()
1590 ": exit - failed to send CARD_DISABLE command\n"); in ipw2100_disable_adapter()
1597 ": exit - card failed to change to DISABLED\n"); in ipw2100_disable_adapter()
1604 mutex_unlock(&priv->adapter_mutex); in ipw2100_disable_adapter()
1623 if (!(priv->config & CFG_ASSOCIATE)) in ipw2100_set_scan_options()
1625 if ((priv->ieee->sec.flags & SEC_ENABLED) && priv->ieee->sec.enabled) in ipw2100_set_scan_options()
1627 if (priv->config & CFG_PASSIVE_SCAN) in ipw2100_set_scan_options()
1630 cmd.host_command_parameters[1] = priv->channel_mask; in ipw2100_set_scan_options()
1654 if (priv->ieee->iw_mode == IW_MODE_MONITOR) in ipw2100_start_scan()
1657 if (priv->status & STATUS_SCANNING) { in ipw2100_start_scan()
1671 priv->status |= STATUS_SCANNING; in ipw2100_start_scan()
1674 priv->status &= ~STATUS_SCANNING; in ipw2100_start_scan()
1683 "---",
1701 if (priv->suspend_time) { in ipw2100_up()
1702 libipw_networks_age(priv->ieee, priv->suspend_time); in ipw2100_up()
1703 priv->suspend_time = 0; in ipw2100_up()
1707 if (priv->status & STATUS_RF_KILL_SW) { in ipw2100_up()
1709 "switch\n", priv->net_dev->name); in ipw2100_up()
1719 spin_lock_irqsave(&priv->low_lock, flags); in ipw2100_up()
1724 spin_unlock_irqrestore(&priv->low_lock, flags); in ipw2100_up()
1726 if (priv->status & STATUS_POWERED || in ipw2100_up()
1727 (priv->status & STATUS_RESET_PENDING)) { in ipw2100_up()
1733 priv->net_dev->name); in ipw2100_up()
1737 priv->status |= STATUS_POWERED; in ipw2100_up()
1744 priv->net_dev->name); in ipw2100_up()
1755 priv->net_dev->name); in ipw2100_up()
1760 libipw_set_geo(priv->ieee, &ipw_geos[0]); in ipw2100_up()
1761 priv->ieee->freq_band = LIBIPW_24GHZ_BAND; in ipw2100_up()
1768 priv->net_dev->name); in ipw2100_up()
1772 priv->status &= ~STATUS_SCANNING; in ipw2100_up()
1776 priv->net_dev->name); in ipw2100_up()
1778 if (priv->stop_rf_kill) { in ipw2100_up()
1779 priv->stop_rf_kill = 0; in ipw2100_up()
1780 schedule_delayed_work(&priv->rf_kill, in ipw2100_up()
1795 priv->net_dev->name); in ipw2100_up()
1800 /* Enable the adapter - sends HOST_COMPLETE */ in ipw2100_up()
1805 priv->net_dev->name); in ipw2100_up()
1826 int associated = priv->status & STATUS_ASSOCIATED; in ipw2100_down()
1829 if (!priv->stop_rf_kill) { in ipw2100_down()
1830 priv->stop_rf_kill = 1; in ipw2100_down()
1831 cancel_delayed_work(&priv->rf_kill); in ipw2100_down()
1835 if (!priv->stop_hang_check) { in ipw2100_down()
1836 priv->stop_hang_check = 1; in ipw2100_down()
1837 cancel_delayed_work(&priv->hang_check); in ipw2100_down()
1841 if (priv->status & STATUS_RESET_PENDING) in ipw2100_down()
1842 cancel_delayed_work(&priv->reset_work); in ipw2100_down()
1846 spin_lock_irqsave(&priv->low_lock, flags); in ipw2100_down()
1848 spin_unlock_irqrestore(&priv->low_lock, flags); in ipw2100_down()
1852 priv->net_dev->name); in ipw2100_down()
1857 spin_lock_irqsave(&priv->low_lock, flags); in ipw2100_down()
1859 spin_unlock_irqrestore(&priv->low_lock, flags); in ipw2100_down()
1866 wireless_send_event(priv->net_dev, SIOCGIWAP, &wrqu, NULL); in ipw2100_down()
1868 priv->status &= ~(STATUS_ASSOCIATED | STATUS_ASSOCIATING); in ipw2100_down()
1869 netif_carrier_off(priv->net_dev); in ipw2100_down()
1870 netif_stop_queue(priv->net_dev); in ipw2100_down()
1876 const struct libipw_geo *geo = libipw_get_geo(priv->ieee); in ipw2100_wdev_init()
1877 struct wireless_dev *wdev = &priv->ieee->wdev; in ipw2100_wdev_init()
1880 memcpy(wdev->wiphy->perm_addr, priv->mac_addr, ETH_ALEN); in ipw2100_wdev_init()
1882 /* fill-out priv->ieee->bg_band */ in ipw2100_wdev_init()
1883 if (geo->bg_channels) { in ipw2100_wdev_init()
1884 struct ieee80211_supported_band *bg_band = &priv->ieee->bg_band; in ipw2100_wdev_init()
1886 bg_band->band = NL80211_BAND_2GHZ; in ipw2100_wdev_init()
1887 bg_band->n_channels = geo->bg_channels; in ipw2100_wdev_init()
1888 bg_band->channels = kcalloc(geo->bg_channels, in ipw2100_wdev_init()
1891 if (!bg_band->channels) { in ipw2100_wdev_init()
1893 return -ENOMEM; in ipw2100_wdev_init()
1895 /* translate geo->bg to bg_band.channels */ in ipw2100_wdev_init()
1896 for (i = 0; i < geo->bg_channels; i++) { in ipw2100_wdev_init()
1897 bg_band->channels[i].band = NL80211_BAND_2GHZ; in ipw2100_wdev_init()
1898 bg_band->channels[i].center_freq = geo->bg[i].freq; in ipw2100_wdev_init()
1899 bg_band->channels[i].hw_value = geo->bg[i].channel; in ipw2100_wdev_init()
1900 bg_band->channels[i].max_power = geo->bg[i].max_power; in ipw2100_wdev_init()
1901 if (geo->bg[i].flags & LIBIPW_CH_PASSIVE_ONLY) in ipw2100_wdev_init()
1902 bg_band->channels[i].flags |= in ipw2100_wdev_init()
1904 if (geo->bg[i].flags & LIBIPW_CH_NO_IBSS) in ipw2100_wdev_init()
1905 bg_band->channels[i].flags |= in ipw2100_wdev_init()
1907 if (geo->bg[i].flags & LIBIPW_CH_RADAR_DETECT) in ipw2100_wdev_init()
1908 bg_band->channels[i].flags |= in ipw2100_wdev_init()
1915 bg_band->bitrates = ipw2100_bg_rates; in ipw2100_wdev_init()
1916 bg_band->n_bitrates = RATE_COUNT; in ipw2100_wdev_init()
1918 wdev->wiphy->bands[NL80211_BAND_2GHZ] = bg_band; in ipw2100_wdev_init()
1921 wdev->wiphy->cipher_suites = ipw_cipher_suites; in ipw2100_wdev_init()
1922 wdev->wiphy->n_cipher_suites = ARRAY_SIZE(ipw_cipher_suites); in ipw2100_wdev_init()
1924 set_wiphy_dev(wdev->wiphy, &priv->pci_dev->dev); in ipw2100_wdev_init()
1925 if (wiphy_register(wdev->wiphy)) in ipw2100_wdev_init()
1926 return -EIO; in ipw2100_wdev_init()
1939 int associated = priv->status & STATUS_ASSOCIATED; in ipw2100_reset_adapter()
1941 spin_lock_irqsave(&priv->low_lock, flags); in ipw2100_reset_adapter()
1942 IPW_DEBUG_INFO(": %s: Restarting adapter.\n", priv->net_dev->name); in ipw2100_reset_adapter()
1943 priv->resets++; in ipw2100_reset_adapter()
1944 priv->status &= ~(STATUS_ASSOCIATED | STATUS_ASSOCIATING); in ipw2100_reset_adapter()
1945 priv->status |= STATUS_SECURITY_UPDATED; in ipw2100_reset_adapter()
1949 cancel_delayed_work(&priv->reset_work); in ipw2100_reset_adapter()
1950 priv->status |= STATUS_RESET_PENDING; in ipw2100_reset_adapter()
1951 spin_unlock_irqrestore(&priv->low_lock, flags); in ipw2100_reset_adapter()
1953 mutex_lock(&priv->action_mutex); in ipw2100_reset_adapter()
1955 priv->stop_hang_check = 1; in ipw2100_reset_adapter()
1956 cancel_delayed_work(&priv->hang_check); in ipw2100_reset_adapter()
1960 wireless_send_event(priv->net_dev, SIOCGIWAP, &wrqu, NULL); in ipw2100_reset_adapter()
1963 mutex_unlock(&priv->action_mutex); in ipw2100_reset_adapter()
2018 memcpy(priv->ieee->bssid, bssid, ETH_ALEN); in isr_indicate_associated()
2040 priv->net_dev->name, essid_len, essid, in isr_indicate_associated()
2044 if (!(priv->config & CFG_STATIC_ESSID)) { in isr_indicate_associated()
2045 priv->essid_len = min((u8) essid_len, (u8) IW_ESSID_MAX_SIZE); in isr_indicate_associated()
2046 memcpy(priv->essid, essid, priv->essid_len); in isr_indicate_associated()
2048 priv->channel = chan; in isr_indicate_associated()
2049 memcpy(priv->bssid, bssid, ETH_ALEN); in isr_indicate_associated()
2051 priv->status |= STATUS_ASSOCIATING; in isr_indicate_associated()
2052 priv->connect_start = ktime_get_boottime_seconds(); in isr_indicate_associated()
2054 schedule_delayed_work(&priv->wx_event_work, HZ / 10); in isr_indicate_associated()
2080 * disable auto association -- so we cheat by setting a bogus SSID */ in ipw2100_set_essid()
2081 if (!ssid_len && !(priv->config & CFG_ASSOCIATE)) { in ipw2100_set_essid()
2094 memset(priv->essid + ssid_len, 0, IW_ESSID_MAX_SIZE - ssid_len); in ipw2100_set_essid()
2095 memcpy(priv->essid, essid, ssid_len); in ipw2100_set_essid()
2096 priv->essid_len = ssid_len; in ipw2100_set_essid()
2101 err = -EIO; in ipw2100_set_essid()
2110 "disassociated: '%*pE' %pM\n", priv->essid_len, priv->essid, in isr_indicate_association_lost()
2111 priv->bssid); in isr_indicate_association_lost()
2113 priv->status &= ~(STATUS_ASSOCIATED | STATUS_ASSOCIATING); in isr_indicate_association_lost()
2115 if (priv->status & STATUS_STOPPING) { in isr_indicate_association_lost()
2120 eth_zero_addr(priv->bssid); in isr_indicate_association_lost()
2121 eth_zero_addr(priv->ieee->bssid); in isr_indicate_association_lost()
2123 netif_carrier_off(priv->net_dev); in isr_indicate_association_lost()
2124 netif_stop_queue(priv->net_dev); in isr_indicate_association_lost()
2126 if (!(priv->status & STATUS_RUNNING)) in isr_indicate_association_lost()
2129 if (priv->status & STATUS_SECURITY_UPDATED) in isr_indicate_association_lost()
2130 schedule_delayed_work(&priv->security_work, 0); in isr_indicate_association_lost()
2132 schedule_delayed_work(&priv->wx_event_work, 0); in isr_indicate_association_lost()
2138 priv->net_dev->name); in isr_indicate_rf_kill()
2141 wiphy_rfkill_set_hw_state(priv->ieee->wdev.wiphy, true); in isr_indicate_rf_kill()
2142 priv->status |= STATUS_RF_KILL_HW; in isr_indicate_rf_kill()
2145 priv->stop_rf_kill = 0; in isr_indicate_rf_kill()
2146 mod_delayed_work(system_wq, &priv->rf_kill, round_jiffies_relative(HZ)); in isr_indicate_rf_kill()
2157 wireless_send_event(priv->net_dev, SIOCGIWSCAN, &wrqu, NULL); in ipw2100_scan_event()
2164 priv->ieee->scans++; in isr_scan_complete()
2165 priv->status &= ~STATUS_SCANNING; in isr_scan_complete()
2167 /* Only userspace-requested scan completion events go out immediately */ in isr_scan_complete()
2168 if (!priv->user_requested_scan) { in isr_scan_complete()
2169 schedule_delayed_work(&priv->scan_event, in isr_scan_complete()
2172 priv->user_requested_scan = 0; in isr_scan_complete()
2173 mod_delayed_work(system_wq, &priv->scan_event, 0); in isr_scan_complete()
2195 priv->status |= STATUS_SCANNING; in isr_indicate_scanning()
2211 IPW2100_HANDLER(-1, NULL)
2219 priv->status & STATUS_ASSOCIATED && in isr_status_change()
2220 !(priv->status & STATUS_SCANNING)) { in isr_status_change()
2228 for (i = 0; status_handlers[i].status != -1; i++) { in isr_status_change()
2234 priv->wstats.status = status; in isr_status_change()
2246 if (cmd->host_command_reg < ARRAY_SIZE(command_types)) { in isr_rx_complete_command()
2248 command_types[cmd->host_command_reg], in isr_rx_complete_command()
2249 cmd->host_command_reg); in isr_rx_complete_command()
2252 if (cmd->host_command_reg == HOST_COMPLETE) in isr_rx_complete_command()
2253 priv->status |= STATUS_ENABLED; in isr_rx_complete_command()
2255 if (cmd->host_command_reg == CARD_DISABLE) in isr_rx_complete_command()
2256 priv->status &= ~STATUS_ENABLED; in isr_rx_complete_command()
2258 priv->status &= ~STATUS_CMD_ACTIVE; in isr_rx_complete_command()
2260 wake_up_interruptible(&priv->wait_command_queue); in isr_rx_complete_command()
2276 packet->skb = dev_alloc_skb(sizeof(struct ipw2100_rx)); in ipw2100_alloc_skb()
2277 if (!packet->skb) in ipw2100_alloc_skb()
2278 return -ENOMEM; in ipw2100_alloc_skb()
2280 packet->rxp = (struct ipw2100_rx *)packet->skb->data; in ipw2100_alloc_skb()
2281 packet->dma_addr = dma_map_single(&priv->pci_dev->dev, in ipw2100_alloc_skb()
2282 packet->skb->data, in ipw2100_alloc_skb()
2285 if (dma_mapping_error(&priv->pci_dev->dev, packet->dma_addr)) { in ipw2100_alloc_skb()
2286 dev_kfree_skb(packet->skb); in ipw2100_alloc_skb()
2287 return -ENOMEM; in ipw2100_alloc_skb()
2299 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
2303 if (!priv->snapshot[0]) in ipw2100_snapshot_free()
2306 kfree(priv->snapshot[i]); in ipw2100_snapshot_free()
2307 priv->snapshot[0] = NULL; in ipw2100_snapshot_free()
2314 if (priv->snapshot[0]) in ipw2100_snapshot_alloc()
2317 priv->snapshot[i] = kmalloc(0x1000, GFP_ATOMIC); in ipw2100_snapshot_alloc()
2318 if (!priv->snapshot[i]) { in ipw2100_snapshot_alloc()
2320 "buffer %d\n", priv->net_dev->name, i); in ipw2100_snapshot_alloc()
2322 kfree(priv->snapshot[--i]); in ipw2100_snapshot_alloc()
2323 priv->snapshot[0] = NULL; in ipw2100_snapshot_alloc()
2346 read_nic_dword(priv->net_dev, i, &tmp); in ipw2100_match_buf()
2360 if ((s - in_buf) == len) in ipw2100_match_buf()
2361 ret = (i + j) - len + 1; in ipw2100_match_buf()
2392 struct ipw2100_status *status = &priv->status_queue.drv[i]; in ipw2100_corruption_detected()
2402 write_register(priv->net_dev, IPW_REG_RESET_REG, in ipw2100_corruption_detected()
2407 read_register(priv->net_dev, IPW_REG_RESET_REG, ®); in ipw2100_corruption_detected()
2411 } while (j--); in ipw2100_corruption_detected()
2419 priv->net_dev->name, match, in ipw2100_corruption_detected()
2423 "Firmware.\n", priv->net_dev->name); in ipw2100_corruption_detected()
2425 printk_buf((u8 *) priv->status_queue.drv, in ipw2100_corruption_detected()
2429 priv->fatal_error = IPW2100_ERR_C3_CORRUPTION; in ipw2100_corruption_detected()
2430 priv->net_dev->stats.rx_errors++; in ipw2100_corruption_detected()
2437 struct net_device *dev = priv->net_dev; in isr_rx()
2438 struct ipw2100_status *status = &priv->status_queue.drv[i]; in isr_rx()
2439 struct ipw2100_rx_packet *packet = &priv->rx_buffers[i]; in isr_rx()
2443 if (unlikely(status->frame_size > skb_tailroom(packet->skb))) { in isr_rx()
2446 dev->name, in isr_rx()
2447 status->frame_size, skb_tailroom(packet->skb)); in isr_rx()
2448 dev->stats.rx_errors++; in isr_rx()
2453 dev->stats.rx_errors++; in isr_rx()
2454 priv->wstats.discard.misc++; in isr_rx()
2459 if (unlikely(priv->ieee->iw_mode != IW_MODE_MONITOR && in isr_rx()
2460 !(priv->status & STATUS_ASSOCIATED))) { in isr_rx()
2462 priv->wstats.discard.misc++; in isr_rx()
2466 dma_unmap_single(&priv->pci_dev->dev, packet->dma_addr, in isr_rx()
2469 skb_put(packet->skb, status->frame_size); in isr_rx()
2474 skb_copy_from_linear_data(packet->skb, packet_data, in isr_rx()
2475 min_t(u32, status->frame_size, in isr_rx()
2479 if (!libipw_rx(priv->ieee, packet->skb, stats)) { in isr_rx()
2482 dev->name); in isr_rx()
2483 printk_buf(IPW_DL_DROP, packet_data, status->frame_size); in isr_rx()
2485 dev->stats.rx_errors++; in isr_rx()
2488 dev_kfree_skb_any(packet->skb); in isr_rx()
2489 packet->skb = NULL; in isr_rx()
2495 "%s: Unable to allocate SKB onto RBD ring - disabling " in isr_rx()
2496 "adapter.\n", dev->name); in isr_rx()
2502 priv->rx_queue.drv[i].host_addr = packet->dma_addr; in isr_rx()
2510 struct net_device *dev = priv->net_dev; in isr_rx_monitor()
2511 struct ipw2100_status *status = &priv->status_queue.drv[i]; in isr_rx_monitor()
2512 struct ipw2100_rx_packet *packet = &priv->rx_buffers[i]; in isr_rx_monitor()
2514 /* Magic struct that slots into the radiotap header -- no reason in isr_rx_monitor()
2524 if (unlikely(status->frame_size > skb_tailroom(packet->skb) - in isr_rx_monitor()
2528 dev->name, in isr_rx_monitor()
2529 status->frame_size, in isr_rx_monitor()
2530 skb_tailroom(packet->skb)); in isr_rx_monitor()
2531 dev->stats.rx_errors++; in isr_rx_monitor()
2536 dev->stats.rx_errors++; in isr_rx_monitor()
2537 priv->wstats.discard.misc++; in isr_rx_monitor()
2542 if (unlikely(priv->config & CFG_CRC_CHECK && in isr_rx_monitor()
2543 status->flags & IPW_STATUS_FLAG_CRC_ERROR)) { in isr_rx_monitor()
2545 dev->stats.rx_errors++; in isr_rx_monitor()
2549 dma_unmap_single(&priv->pci_dev->dev, packet->dma_addr, in isr_rx_monitor()
2551 memmove(packet->skb->data + sizeof(struct ipw_rt_hdr), in isr_rx_monitor()
2552 packet->skb->data, status->frame_size); in isr_rx_monitor()
2554 ipw_rt = (struct ipw_rt_hdr *) packet->skb->data; in isr_rx_monitor()
2556 ipw_rt->rt_hdr.it_version = PKTHDR_RADIOTAP_VERSION; in isr_rx_monitor()
2557 ipw_rt->rt_hdr.it_pad = 0; /* always good to zero */ in isr_rx_monitor()
2558 ipw_rt->rt_hdr.it_len = cpu_to_le16(sizeof(struct ipw_rt_hdr)); /* total hdr+data */ in isr_rx_monitor()
2560 ipw_rt->rt_hdr.it_present = cpu_to_le32(1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL); in isr_rx_monitor()
2562 ipw_rt->rt_dbmsignal = status->rssi + IPW2100_RSSI_TO_DBM; in isr_rx_monitor()
2564 skb_put(packet->skb, status->frame_size + sizeof(struct ipw_rt_hdr)); in isr_rx_monitor()
2566 if (!libipw_rx(priv->ieee, packet->skb, stats)) { in isr_rx_monitor()
2567 dev->stats.rx_errors++; in isr_rx_monitor()
2570 dev_kfree_skb_any(packet->skb); in isr_rx_monitor()
2571 packet->skb = NULL; in isr_rx_monitor()
2577 "%s: Unable to allocate SKB onto RBD ring - disabling " in isr_rx_monitor()
2578 "adapter.\n", dev->name); in isr_rx_monitor()
2584 priv->rx_queue.drv[i].host_addr = packet->dma_addr; in isr_rx_monitor()
2591 struct ipw2100_status *status = &priv->status_queue.drv[i]; in ipw2100_corruption_check()
2592 struct ipw2100_rx *u = priv->rx_buffers[i].rxp; in ipw2100_corruption_check()
2593 u16 frame_type = status->status_fields & STATUS_TYPE_MASK; in ipw2100_corruption_check()
2597 return (status->frame_size != sizeof(u->rx_data.command)); in ipw2100_corruption_check()
2599 return (status->frame_size != sizeof(u->rx_data.status)); in ipw2100_corruption_check()
2601 return (status->frame_size < sizeof(u->rx_data.notification)); in ipw2100_corruption_check()
2607 switch (WLAN_FC_GET_TYPE(le16_to_cpu(u->rx_data.header.frame_ctl))) { in ipw2100_corruption_check()
2612 return (status->frame_size > in ipw2100_corruption_check()
2628 * Read index - firmware places packet in entry identified by the
2631 * be filled--but not yet valid.
2633 * Write index - driver fills this entry with an unused RBD entry.
2642 * The WRITE index is cached in the variable 'priv->rx_queue.next'.
2647 struct ipw2100_bd_queue *rxq = &priv->rx_queue; in __ipw2100_rx_process()
2648 struct ipw2100_status_queue *sq = &priv->status_queue; in __ipw2100_rx_process()
2657 read_register(priv->net_dev, IPW_MEM_HOST_SHARED_RX_READ_INDEX, &r); in __ipw2100_rx_process()
2658 read_register(priv->net_dev, IPW_MEM_HOST_SHARED_RX_WRITE_INDEX, &w); in __ipw2100_rx_process()
2660 if (r >= rxq->entries) { in __ipw2100_rx_process()
2661 IPW_DEBUG_RX("exit - bad read index\n"); in __ipw2100_rx_process()
2665 i = (rxq->next + 1) % rxq->entries; in __ipw2100_rx_process()
2669 r, rxq->next, i); */ in __ipw2100_rx_process()
2671 packet = &priv->rx_buffers[i]; in __ipw2100_rx_process()
2675 dma_sync_single_for_cpu(&priv->pci_dev->dev, packet->dma_addr, in __ipw2100_rx_process()
2684 u = packet->rxp; in __ipw2100_rx_process()
2685 frame_type = sq->drv[i].status_fields & STATUS_TYPE_MASK; in __ipw2100_rx_process()
2686 stats.rssi = sq->drv[i].rssi + IPW2100_RSSI_TO_DBM; in __ipw2100_rx_process()
2687 stats.len = sq->drv[i].frame_size; in __ipw2100_rx_process()
2695 priv->net_dev->name, frame_types[frame_type], in __ipw2100_rx_process()
2701 isr_rx_complete_command(priv, &u->rx_data.command); in __ipw2100_rx_process()
2705 isr_status_change(priv, u->rx_data.status); in __ipw2100_rx_process()
2711 if (priv->ieee->iw_mode == IW_MODE_MONITOR) { in __ipw2100_rx_process()
2718 switch (WLAN_FC_GET_TYPE(le16_to_cpu(u->rx_data.header.frame_ctl))) { in __ipw2100_rx_process()
2720 libipw_rx_mgt(priv->ieee, in __ipw2100_rx_process()
2721 &u->rx_data.header, &stats); in __ipw2100_rx_process()
2737 rxq->drv[i].status.info.field = 0; in __ipw2100_rx_process()
2739 i = (i + 1) % rxq->entries; in __ipw2100_rx_process()
2744 rxq->next = (i ? i : rxq->entries) - 1; in __ipw2100_rx_process()
2746 write_register(priv->net_dev, in __ipw2100_rx_process()
2747 IPW_MEM_HOST_SHARED_RX_WRITE_INDEX, rxq->next); in __ipw2100_rx_process()
2763 * TX Queue works as follows:
2765 * Read index - points to the next TBD that the firmware will
2769 * Write index - driver fills this entry with an constructed TBD
2782 * The OLDEST index is cached in the variable 'priv->tx_queue.oldest'
2792 struct ipw2100_bd_queue *txq = &priv->tx_queue; in __ipw2100_tx_process()
2800 if (list_empty(&priv->fw_pend_list)) in __ipw2100_tx_process()
2803 element = priv->fw_pend_list.next; in __ipw2100_tx_process()
2806 tbd = &txq->drv[packet->index]; in __ipw2100_tx_process()
2809 switch (packet->type) { in __ipw2100_tx_process()
2813 e = txq->oldest; in __ipw2100_tx_process()
2818 descriptors_used = tbd->num_fragments; in __ipw2100_tx_process()
2819 frag_num = tbd->num_fragments - 1; in __ipw2100_tx_process()
2820 e = txq->oldest + frag_num; in __ipw2100_tx_process()
2821 e %= txq->entries; in __ipw2100_tx_process()
2826 priv->net_dev->name); in __ipw2100_tx_process()
2834 read_register(priv->net_dev, IPW_MEM_HOST_SHARED_TX_QUEUE_READ_INDEX, in __ipw2100_tx_process()
2836 read_register(priv->net_dev, IPW_MEM_HOST_SHARED_TX_QUEUE_WRITE_INDEX, in __ipw2100_tx_process()
2838 if (w != txq->next) in __ipw2100_tx_process()
2840 priv->net_dev->name); in __ipw2100_tx_process()
2843 * txq->next is the index of the last packet written txq->oldest is in __ipw2100_tx_process()
2852 * ===>| s---->|=============== in __ipw2100_tx_process()
2855 * r---->| in __ipw2100_tx_process()
2858 * w - updated by driver in __ipw2100_tx_process()
2859 * r - updated by firmware in __ipw2100_tx_process()
2860 * s - start of oldest BD entry (txq->oldest) in __ipw2100_tx_process()
2861 * e - end of oldest BD entry in __ipw2100_tx_process()
2865 IPW_DEBUG_TX("exit - no processed packets ready to release.\n"); in __ipw2100_tx_process()
2870 DEC_STAT(&priv->fw_pend_stat); in __ipw2100_tx_process()
2874 i = txq->oldest; in __ipw2100_tx_process()
2875 IPW_DEBUG_TX("TX%d V=%p P=%04X T=%04X L=%d\n", i, in __ipw2100_tx_process()
2876 &txq->drv[i], in __ipw2100_tx_process()
2877 (u32) (txq->nic + i * sizeof(struct ipw2100_bd)), in __ipw2100_tx_process()
2878 txq->drv[i].host_addr, txq->drv[i].buf_length); in __ipw2100_tx_process()
2880 if (packet->type == DATA) { in __ipw2100_tx_process()
2881 i = (i + 1) % txq->entries; in __ipw2100_tx_process()
2883 IPW_DEBUG_TX("TX%d V=%p P=%04X T=%04X L=%d\n", i, in __ipw2100_tx_process()
2884 &txq->drv[i], in __ipw2100_tx_process()
2885 (u32) (txq->nic + i * in __ipw2100_tx_process()
2887 (u32) txq->drv[i].host_addr, in __ipw2100_tx_process()
2888 txq->drv[i].buf_length); in __ipw2100_tx_process()
2893 switch (packet->type) { in __ipw2100_tx_process()
2895 if (txq->drv[txq->oldest].status.info.fields.txType != 0) in __ipw2100_tx_process()
2899 priv->net_dev->name, txq->oldest, packet->index); in __ipw2100_tx_process()
2903 tbd = &txq->drv[(packet->index + 1 + i) % txq->entries]; in __ipw2100_tx_process()
2905 IPW_DEBUG_TX("TX%d P=%08x L=%d\n", in __ipw2100_tx_process()
2906 (packet->index + 1 + i) % txq->entries, in __ipw2100_tx_process()
2907 tbd->host_addr, tbd->buf_length); in __ipw2100_tx_process()
2909 dma_unmap_single(&priv->pci_dev->dev, tbd->host_addr, in __ipw2100_tx_process()
2910 tbd->buf_length, DMA_TO_DEVICE); in __ipw2100_tx_process()
2913 libipw_txb_free(packet->info.d_struct.txb); in __ipw2100_tx_process()
2914 packet->info.d_struct.txb = NULL; in __ipw2100_tx_process()
2916 list_add_tail(element, &priv->tx_free_list); in __ipw2100_tx_process()
2917 INC_STAT(&priv->tx_free_stat); in __ipw2100_tx_process()
2919 /* We have a free slot in the Tx queue, so wake up the in __ipw2100_tx_process()
2921 if (priv->status & STATUS_ASSOCIATED) in __ipw2100_tx_process()
2922 netif_wake_queue(priv->net_dev); in __ipw2100_tx_process()
2926 netif_trans_update(priv->net_dev); in __ipw2100_tx_process()
2931 if (txq->drv[txq->oldest].status.info.fields.txType != 1) in __ipw2100_tx_process()
2935 priv->net_dev->name, txq->oldest, packet->index); in __ipw2100_tx_process()
2938 if (packet->info.c_struct.cmd->host_command_reg < in __ipw2100_tx_process()
2941 command_types[packet->info.c_struct.cmd-> in __ipw2100_tx_process()
2943 packet->info.c_struct.cmd-> in __ipw2100_tx_process()
2945 packet->info.c_struct.cmd->cmd_status_reg); in __ipw2100_tx_process()
2948 list_add_tail(element, &priv->msg_free_list); in __ipw2100_tx_process()
2949 INC_STAT(&priv->msg_free_stat); in __ipw2100_tx_process()
2954 txq->oldest = (e + 1) % txq->entries; in __ipw2100_tx_process()
2956 txq->available += descriptors_used; in __ipw2100_tx_process()
2957 SET_STAT(&priv->txq_stat, txq->available); in __ipw2100_tx_process()
2960 jiffies - packet->jiffy_start); in __ipw2100_tx_process()
2962 return (!list_empty(&priv->fw_pend_list)); in __ipw2100_tx_process()
2975 priv->net_dev->name, i); in __ipw2100_tx_complete()
2983 struct ipw2100_bd_queue *txq = &priv->tx_queue; in ipw2100_tx_send_commands()
2985 int next = txq->next; in ipw2100_tx_send_commands()
2987 while (!list_empty(&priv->msg_pend_list)) { in ipw2100_tx_send_commands()
2994 if (txq->available <= 3) { in ipw2100_tx_send_commands()
2999 element = priv->msg_pend_list.next; in ipw2100_tx_send_commands()
3001 DEC_STAT(&priv->msg_pend_stat); in ipw2100_tx_send_commands()
3006 &txq->drv[txq->next], in ipw2100_tx_send_commands()
3007 (u32) (txq->nic + txq->next * in ipw2100_tx_send_commands()
3010 packet->index = txq->next; in ipw2100_tx_send_commands()
3012 tbd = &txq->drv[txq->next]; in ipw2100_tx_send_commands()
3015 tbd->host_addr = packet->info.c_struct.cmd_phys; in ipw2100_tx_send_commands()
3016 tbd->buf_length = sizeof(struct ipw2100_cmd_header); in ipw2100_tx_send_commands()
3019 tbd->num_fragments = 1; in ipw2100_tx_send_commands()
3020 tbd->status.info.field = in ipw2100_tx_send_commands()
3025 txq->next++; in ipw2100_tx_send_commands()
3026 txq->next %= txq->entries; in ipw2100_tx_send_commands()
3027 txq->available--; in ipw2100_tx_send_commands()
3028 DEC_STAT(&priv->txq_stat); in ipw2100_tx_send_commands()
3030 list_add_tail(element, &priv->fw_pend_list); in ipw2100_tx_send_commands()
3031 INC_STAT(&priv->fw_pend_stat); in ipw2100_tx_send_commands()
3034 if (txq->next != next) { in ipw2100_tx_send_commands()
3038 write_register(priv->net_dev, in ipw2100_tx_send_commands()
3040 txq->next); in ipw2100_tx_send_commands()
3052 struct ipw2100_bd_queue *txq = &priv->tx_queue; in ipw2100_tx_send_data()
3054 int next = txq->next; in ipw2100_tx_send_data()
3059 while (!list_empty(&priv->tx_pend_list)) { in ipw2100_tx_send_data()
3066 element = priv->tx_pend_list.next; in ipw2100_tx_send_data()
3069 if (unlikely(1 + packet->info.d_struct.txb->nr_frags > in ipw2100_tx_send_data()
3075 priv->net_dev->name); in ipw2100_tx_send_data()
3078 if (txq->available <= 3 + packet->info.d_struct.txb->nr_frags) { in ipw2100_tx_send_data()
3084 DEC_STAT(&priv->tx_pend_stat); in ipw2100_tx_send_data()
3086 tbd = &txq->drv[txq->next]; in ipw2100_tx_send_data()
3088 packet->index = txq->next; in ipw2100_tx_send_data()
3090 ipw_hdr = packet->info.d_struct.data; in ipw2100_tx_send_data()
3091 hdr = (struct libipw_hdr_3addr *)packet->info.d_struct.txb-> in ipw2100_tx_send_data()
3092 fragments[0]->data; in ipw2100_tx_send_data()
3094 if (priv->ieee->iw_mode == IW_MODE_INFRA) { in ipw2100_tx_send_data()
3097 memcpy(ipw_hdr->src_addr, hdr->addr2, ETH_ALEN); in ipw2100_tx_send_data()
3098 memcpy(ipw_hdr->dst_addr, hdr->addr3, ETH_ALEN); in ipw2100_tx_send_data()
3099 } else if (priv->ieee->iw_mode == IW_MODE_ADHOC) { in ipw2100_tx_send_data()
3102 memcpy(ipw_hdr->src_addr, hdr->addr2, ETH_ALEN); in ipw2100_tx_send_data()
3103 memcpy(ipw_hdr->dst_addr, hdr->addr1, ETH_ALEN); in ipw2100_tx_send_data()
3106 ipw_hdr->host_command_reg = SEND; in ipw2100_tx_send_data()
3107 ipw_hdr->host_command_reg1 = 0; in ipw2100_tx_send_data()
3110 ipw_hdr->needs_encryption = 0; in ipw2100_tx_send_data()
3111 ipw_hdr->encrypted = packet->info.d_struct.txb->encrypted; in ipw2100_tx_send_data()
3112 if (packet->info.d_struct.txb->nr_frags > 1) in ipw2100_tx_send_data()
3113 ipw_hdr->fragment_size = in ipw2100_tx_send_data()
3114 packet->info.d_struct.txb->frag_size - in ipw2100_tx_send_data()
3117 ipw_hdr->fragment_size = 0; in ipw2100_tx_send_data()
3119 tbd->host_addr = packet->info.d_struct.data_phys; in ipw2100_tx_send_data()
3120 tbd->buf_length = sizeof(struct ipw2100_data_header); in ipw2100_tx_send_data()
3121 tbd->num_fragments = 1 + packet->info.d_struct.txb->nr_frags; in ipw2100_tx_send_data()
3122 tbd->status.info.field = in ipw2100_tx_send_data()
3125 txq->next++; in ipw2100_tx_send_data()
3126 txq->next %= txq->entries; in ipw2100_tx_send_data()
3128 IPW_DEBUG_TX("data header tbd TX%d P=%08x L=%d\n", in ipw2100_tx_send_data()
3129 packet->index, tbd->host_addr, tbd->buf_length); in ipw2100_tx_send_data()
3131 if (packet->info.d_struct.txb->nr_frags > 1) in ipw2100_tx_send_data()
3132 IPW_DEBUG_FRAG("fragment Tx: %d frames\n", in ipw2100_tx_send_data()
3133 packet->info.d_struct.txb->nr_frags); in ipw2100_tx_send_data()
3136 for (i = 0; i < packet->info.d_struct.txb->nr_frags; i++) { in ipw2100_tx_send_data()
3137 tbd = &txq->drv[txq->next]; in ipw2100_tx_send_data()
3138 if (i == packet->info.d_struct.txb->nr_frags - 1) in ipw2100_tx_send_data()
3139 tbd->status.info.field = in ipw2100_tx_send_data()
3143 tbd->status.info.field = in ipw2100_tx_send_data()
3147 tbd->buf_length = packet->info.d_struct.txb-> in ipw2100_tx_send_data()
3148 fragments[i]->len - LIBIPW_3ADDR_LEN; in ipw2100_tx_send_data()
3150 tbd->host_addr = dma_map_single(&priv->pci_dev->dev, in ipw2100_tx_send_data()
3151 packet->info.d_struct. in ipw2100_tx_send_data()
3152 txb->fragments[i]->data + in ipw2100_tx_send_data()
3154 tbd->buf_length, in ipw2100_tx_send_data()
3156 if (dma_mapping_error(&priv->pci_dev->dev, tbd->host_addr)) { in ipw2100_tx_send_data()
3161 IPW_DEBUG_TX("data frag tbd TX%d P=%08x L=%d\n", in ipw2100_tx_send_data()
3162 txq->next, tbd->host_addr, in ipw2100_tx_send_data()
3163 tbd->buf_length); in ipw2100_tx_send_data()
3165 dma_sync_single_for_device(&priv->pci_dev->dev, in ipw2100_tx_send_data()
3166 tbd->host_addr, in ipw2100_tx_send_data()
3167 tbd->buf_length, in ipw2100_tx_send_data()
3170 txq->next++; in ipw2100_tx_send_data()
3171 txq->next %= txq->entries; in ipw2100_tx_send_data()
3174 txq->available -= 1 + packet->info.d_struct.txb->nr_frags; in ipw2100_tx_send_data()
3175 SET_STAT(&priv->txq_stat, txq->available); in ipw2100_tx_send_data()
3177 list_add_tail(element, &priv->fw_pend_list); in ipw2100_tx_send_data()
3178 INC_STAT(&priv->fw_pend_stat); in ipw2100_tx_send_data()
3181 if (txq->next != next) { in ipw2100_tx_send_data()
3184 write_register(priv->net_dev, in ipw2100_tx_send_data()
3186 txq->next); in ipw2100_tx_send_data()
3193 struct net_device *dev = priv->net_dev; in ipw2100_irq_tasklet()
3197 spin_lock_irqsave(&priv->low_lock, flags); in ipw2100_irq_tasklet()
3202 IPW_DEBUG_ISR("enter - INTA: 0x%08lX\n", in ipw2100_irq_tasklet()
3205 priv->in_isr++; in ipw2100_irq_tasklet()
3206 priv->interrupts++; in ipw2100_irq_tasklet()
3217 priv->inta_other++; in ipw2100_irq_tasklet()
3220 read_nic_dword(dev, IPW_NIC_FATAL_ERROR, &priv->fatal_error); in ipw2100_irq_tasklet()
3222 priv->net_dev->name, priv->fatal_error); in ipw2100_irq_tasklet()
3224 read_nic_dword(dev, IPW_ERROR_ADDR(priv->fatal_error), &tmp); in ipw2100_irq_tasklet()
3226 priv->net_dev->name, tmp); in ipw2100_irq_tasklet()
3235 priv->inta_other++; in ipw2100_irq_tasklet()
3242 priv->rx_interrupts++; in ipw2100_irq_tasklet()
3251 IPW_DEBUG_ISR("TX interrupt\n"); in ipw2100_irq_tasklet()
3253 priv->tx_interrupts++; in ipw2100_irq_tasklet()
3263 IPW_DEBUG_ISR("TX complete\n"); in ipw2100_irq_tasklet()
3264 priv->inta_other++; in ipw2100_irq_tasklet()
3272 priv->inta_other++; in ipw2100_irq_tasklet()
3278 priv->inta_other++; in ipw2100_irq_tasklet()
3293 priv->inta_other++; in ipw2100_irq_tasklet()
3299 priv->inta_other++; in ipw2100_irq_tasklet()
3304 priv->in_isr--; in ipw2100_irq_tasklet()
3307 spin_unlock_irqrestore(&priv->low_lock, flags); in ipw2100_irq_tasklet()
3320 spin_lock(&priv->low_lock); in ipw2100_interrupt()
3326 if (!(priv->status & STATUS_INT_ENABLED)) { in ipw2100_interrupt()
3331 read_register(priv->net_dev, IPW_REG_INTA_MASK, &inta_mask); in ipw2100_interrupt()
3332 read_register(priv->net_dev, IPW_REG_INTA, &inta); in ipw2100_interrupt()
3349 * work tasklet, so if another part of the code re-enables the in ipw2100_interrupt()
3353 tasklet_schedule(&priv->irq_tasklet); in ipw2100_interrupt()
3354 spin_unlock(&priv->low_lock); in ipw2100_interrupt()
3358 spin_unlock(&priv->low_lock); in ipw2100_interrupt()
3370 spin_lock_irqsave(&priv->low_lock, flags); in ipw2100_tx()
3372 if (!(priv->status & STATUS_ASSOCIATED)) { in ipw2100_tx()
3374 priv->net_dev->stats.tx_carrier_errors++; in ipw2100_tx()
3379 if (list_empty(&priv->tx_free_list)) in ipw2100_tx()
3382 element = priv->tx_free_list.next; in ipw2100_tx()
3385 packet->info.d_struct.txb = txb; in ipw2100_tx()
3387 IPW_DEBUG_TX("Sending fragment (%d bytes):\n", txb->fragments[0]->len); in ipw2100_tx()
3388 printk_buf(IPW_DL_TX, txb->fragments[0]->data, txb->fragments[0]->len); in ipw2100_tx()
3390 packet->jiffy_start = jiffies; in ipw2100_tx()
3393 DEC_STAT(&priv->tx_free_stat); in ipw2100_tx()
3395 list_add_tail(element, &priv->tx_pend_list); in ipw2100_tx()
3396 INC_STAT(&priv->tx_pend_stat); in ipw2100_tx()
3400 spin_unlock_irqrestore(&priv->low_lock, flags); in ipw2100_tx()
3405 spin_unlock_irqrestore(&priv->low_lock, flags); in ipw2100_tx()
3411 int i, j, err = -EINVAL; in ipw2100_msg_allocate()
3415 priv->msg_buffers = in ipw2100_msg_allocate()
3419 if (!priv->msg_buffers) in ipw2100_msg_allocate()
3420 return -ENOMEM; in ipw2100_msg_allocate()
3423 v = dma_alloc_coherent(&priv->pci_dev->dev, in ipw2100_msg_allocate()
3429 "buffers.\n", priv->net_dev->name); in ipw2100_msg_allocate()
3430 err = -ENOMEM; in ipw2100_msg_allocate()
3434 priv->msg_buffers[i].type = COMMAND; in ipw2100_msg_allocate()
3435 priv->msg_buffers[i].info.c_struct.cmd = in ipw2100_msg_allocate()
3437 priv->msg_buffers[i].info.c_struct.cmd_phys = p; in ipw2100_msg_allocate()
3444 dma_free_coherent(&priv->pci_dev->dev, in ipw2100_msg_allocate()
3446 priv->msg_buffers[j].info.c_struct.cmd, in ipw2100_msg_allocate()
3447 priv->msg_buffers[j].info.c_struct.cmd_phys); in ipw2100_msg_allocate()
3450 kfree(priv->msg_buffers); in ipw2100_msg_allocate()
3451 priv->msg_buffers = NULL; in ipw2100_msg_allocate()
3460 INIT_LIST_HEAD(&priv->msg_free_list); in ipw2100_msg_initialize()
3461 INIT_LIST_HEAD(&priv->msg_pend_list); in ipw2100_msg_initialize()
3464 list_add_tail(&priv->msg_buffers[i].list, &priv->msg_free_list); in ipw2100_msg_initialize()
3465 SET_STAT(&priv->msg_free_stat, i); in ipw2100_msg_initialize()
3474 if (!priv->msg_buffers) in ipw2100_msg_free()
3478 dma_free_coherent(&priv->pci_dev->dev, in ipw2100_msg_free()
3480 priv->msg_buffers[i].info.c_struct.cmd, in ipw2100_msg_free()
3481 priv->msg_buffers[i].info.c_struct.cmd_phys); in ipw2100_msg_free()
3484 kfree(priv->msg_buffers); in ipw2100_msg_free()
3485 priv->msg_buffers = NULL; in ipw2100_msg_free()
3505 return out - buf; in pci_show()
3514 return sprintf(buf, "0x%08x\n", (int)p->config); in cfg_show()
3523 return sprintf(buf, "0x%08x\n", (int)p->status); in status_show()
3532 return sprintf(buf, "0x%08x\n", (int)p->capability); in capability_show()
3560 IPW2100_ORD(STAT_TX_HOST_REQUESTS, "requested Host Tx's (MSDU)"),
3562 "successful Host Tx's (MSDU)"),
3564 "successful Directed Tx's (MSDU)"),
3566 "successful Directed Tx's (MSDU) @ 1MB"),
3568 "successful Directed Tx's (MSDU) @ 2MB"),
3570 "successful Directed Tx's (MSDU) @ 5_5MB"),
3572 "successful Directed Tx's (MSDU) @ 11MB"),
3574 "successful Non_Directed Tx's (MSDU) @ 1MB"),
3576 "successful Non_Directed Tx's (MSDU) @ 2MB"),
3578 "successful Non_Directed Tx's (MSDU) @ 5.5MB"),
3580 "successful Non_Directed Tx's (MSDU) @ 11MB"),
3581 IPW2100_ORD(STAT_NULL_DATA, "successful NULL data Tx's"),
3582 IPW2100_ORD(STAT_TX_RTS, "successful Tx RTS"),
3583 IPW2100_ORD(STAT_TX_CTS, "successful Tx CTS"),
3584 IPW2100_ORD(STAT_TX_ACK, "successful Tx ACK"),
3585 IPW2100_ORD(STAT_TX_ASSN, "successful Association Tx's"),
3587 "successful Association response Tx's"),
3589 "successful Reassociation Tx's"),
3591 "successful Reassociation response Tx's"),
3596 IPW2100_ORD(STAT_TX_BEACON, "tx beacon"),
3597 IPW2100_ORD(STAT_TX_ATIM, "Tx ATIM"),
3599 "successful Disassociation TX"),
3600 IPW2100_ORD(STAT_TX_AUTH, "successful Authentication Tx"),
3602 "successful Deauthentication TX"),
3604 "Total successful Tx data bytes"),
3605 IPW2100_ORD(STAT_TX_RETRIES, "Tx retries"),
3606 IPW2100_ORD(STAT_TX_RETRY1, "Tx retries at 1MBPS"),
3607 IPW2100_ORD(STAT_TX_RETRY2, "Tx retries at 2MBPS"),
3608 IPW2100_ORD(STAT_TX_RETRY5_5, "Tx retries at 5.5MBPS"),
3609 IPW2100_ORD(STAT_TX_RETRY11, "Tx retries at 11MBPS"),
3610 IPW2100_ORD(STAT_TX_FAILURES, "Tx Failures"),
3616 IPW2100_ORD(STAT_TX_ERR_ACK, "tx err due to acks"),
3678 "rx frames dropped due to non-sequential fragment"),
3698 "current calculation of % missed tx retries"),
3715 "reassociation: no probe response or TX on hop"),
3717 "reassociation: poor tx/rx quality"),
3719 "reassociation: tx/rx quality (excessive AP load"),
3730 IPW2100_ORD(POWER_MGMT_MODE, "Power mode - 0=CAM, 1=PSP"),
3741 "current radio freq lower digits - channel ID"),
3744 IPW2100_ORD(CURRENT_TX_RATE, "current tx rate"),
3745 IPW2100_ORD(SUPPORTED_RATES, "supported tx rates"),
3747 IPW2100_ORD(BASIC_RATES, "basic tx rates"),
3748 IPW2100_ORD(NIC_HIGHEST_RATE, "NIC highest tx rate"),
3749 IPW2100_ORD(AP_HIGHEST_RATE, "AP highest tx rate"),
3777 struct net_device *dev = priv->net_dev; in registers_show()
3789 return out - buf; in registers_show()
3798 struct net_device *dev = priv->net_dev; in hardware_show()
3830 return out - buf; in hardware_show()
3839 struct net_device *dev = priv->net_dev; in memory_show()
3850 while (len < PAGE_SIZE - 128 && loop < 0x30000) { in memory_show()
3852 if (priv->snapshot[0]) in memory_show()
3860 if (priv->dump_raw) in memory_show()
3896 struct net_device *dev = priv->net_dev; in memory_store()
3899 (void)dev; /* kill unused-var warning for debug-only code */ in memory_store()
3907 dev->name); in memory_store()
3908 priv->dump_raw = 1; in memory_store()
3913 dev->name); in memory_store()
3914 priv->dump_raw = 0; in memory_store()
3917 IPW_DEBUG_INFO("%s: Resetting firmware snapshot.\n", dev->name); in memory_store()
3922 "reset = clear memory snapshot\n", dev->name); in memory_store()
3938 if (priv->status & STATUS_RF_KILL_MASK) in ordinals_show()
3945 while (len < PAGE_SIZE - 128 && loop < ARRAY_SIZE(ord_data)) { in ordinals_show()
3971 out += sprintf(out, "interrupts: %d {tx: %d, rx: %d, other: %d}\n", in stats_show()
3972 priv->interrupts, priv->tx_interrupts, in stats_show()
3973 priv->rx_interrupts, priv->inta_other); in stats_show()
3974 out += sprintf(out, "firmware resets: %d\n", priv->resets); in stats_show()
3975 out += sprintf(out, "firmware hangs: %d\n", priv->hangs); in stats_show()
3978 priv->snapshot[0] ? "YES" : "NO"); in stats_show()
3981 return out - buf; in stats_show()
3990 if (mode == priv->ieee->iw_mode) in ipw2100_switch_mode()
3996 priv->net_dev->name, err); in ipw2100_switch_mode()
4002 priv->net_dev->type = ARPHRD_ETHER; in ipw2100_switch_mode()
4005 priv->net_dev->type = ARPHRD_ETHER; in ipw2100_switch_mode()
4009 priv->last_mode = priv->ieee->iw_mode; in ipw2100_switch_mode()
4010 priv->net_dev->type = ARPHRD_IEEE80211_RADIOTAP; in ipw2100_switch_mode()
4015 priv->ieee->iw_mode = mode; in ipw2100_switch_mode()
4023 printk(KERN_INFO "%s: Resetting on mode change.\n", priv->net_dev->name); in ipw2100_switch_mode()
4024 priv->reset_backoff = 0; in ipw2100_switch_mode()
4036 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x) in internals_show()
4038 if (priv->status & STATUS_ASSOCIATED) in internals_show()
4040 ktime_get_boottime_seconds() - priv->connect_start); in internals_show()
4044 DUMP_VAR(ieee->crypt_info.crypt[priv->ieee->crypt_info.tx_keyidx], "p"); in internals_show()
4051 (unsigned long)priv->last_rtc); in internals_show()
4076 DUMP_VAR(ieee->scans, "d"); in internals_show()
4095 if (priv->status & STATUS_RF_KILL_MASK) in bssinfo_show()
4124 return out - buf; in bssinfo_show()
4159 if (priv->fatal_error) in fatal_error_show()
4160 out += sprintf(out, "0x%08X\n", priv->fatal_error); in fatal_error_show()
4165 if (!priv->fatal_errors[(priv->fatal_index - i) % in fatal_error_show()
4170 priv->fatal_errors[(priv->fatal_index - i) % in fatal_error_show()
4174 return out - buf; in fatal_error_show()
4192 return sprintf(buf, "%d\n", priv->ieee->scan_age); in scan_age_show()
4199 struct net_device *dev = priv->net_dev; in scan_age_store()
4203 (void)dev; /* kill unused-var warning for debug-only code */ in scan_age_store()
4209 IPW_DEBUG_INFO("%s: user supplied invalid value.\n", dev->name); in scan_age_store()
4211 priv->ieee->scan_age = val; in scan_age_store()
4212 IPW_DEBUG_INFO("set scan_age = %u\n", priv->ieee->scan_age); in scan_age_store()
4224 /* 0 - RF kill not enabled in rf_kill_show()
4225 1 - SW based RF kill active (sysfs) in rf_kill_show()
4226 2 - HW based RF kill active in rf_kill_show()
4227 3 - Both HW and SW baed RF kill active */ in rf_kill_show()
4229 int val = ((priv->status & STATUS_RF_KILL_SW) ? 0x1 : 0x0) | in rf_kill_show()
4237 (priv->status & STATUS_RF_KILL_SW ? 1 : 0)) in ipw_radio_kill_sw()
4243 mutex_lock(&priv->action_mutex); in ipw_radio_kill_sw()
4246 priv->status |= STATUS_RF_KILL_SW; in ipw_radio_kill_sw()
4249 priv->status &= ~STATUS_RF_KILL_SW; in ipw_radio_kill_sw()
4251 IPW_DEBUG_RF_KILL("Can not turn radio back on - " in ipw_radio_kill_sw()
4254 priv->stop_rf_kill = 0; in ipw_radio_kill_sw()
4255 mod_delayed_work(system_wq, &priv->rf_kill, in ipw_radio_kill_sw()
4261 mutex_unlock(&priv->action_mutex); in ipw_radio_kill_sw()
4299 struct ipw2100_status_queue *q = &priv->status_queue; in status_queue_allocate()
4303 q->size = entries * sizeof(struct ipw2100_status); in status_queue_allocate()
4304 q->drv = dma_alloc_coherent(&priv->pci_dev->dev, q->size, &q->nic, in status_queue_allocate()
4306 if (!q->drv) { in status_queue_allocate()
4308 return -ENOMEM; in status_queue_allocate()
4320 if (priv->status_queue.drv) { in status_queue_free()
4321 dma_free_coherent(&priv->pci_dev->dev, in status_queue_free()
4322 priv->status_queue.size, in status_queue_free()
4323 priv->status_queue.drv, in status_queue_free()
4324 priv->status_queue.nic); in status_queue_free()
4325 priv->status_queue.drv = NULL; in status_queue_free()
4338 q->entries = entries; in bd_queue_allocate()
4339 q->size = entries * sizeof(struct ipw2100_bd); in bd_queue_allocate()
4340 q->drv = dma_alloc_coherent(&priv->pci_dev->dev, q->size, &q->nic, in bd_queue_allocate()
4342 if (!q->drv) { in bd_queue_allocate()
4345 return -ENOMEM; in bd_queue_allocate()
4360 if (q->drv) { in bd_queue_free()
4361 dma_free_coherent(&priv->pci_dev->dev, q->size, q->drv, in bd_queue_free()
4362 q->nic); in bd_queue_free()
4363 q->drv = NULL; in bd_queue_free()
4375 IPW_DEBUG_INFO("initializing bd queue at virt=%p, phys=%08x\n", q->drv, in bd_queue_initialize()
4376 (u32) q->nic); in bd_queue_initialize()
4378 write_register(priv->net_dev, base, q->nic); in bd_queue_initialize()
4379 write_register(priv->net_dev, size, q->entries); in bd_queue_initialize()
4380 write_register(priv->net_dev, r, q->oldest); in bd_queue_initialize()
4381 write_register(priv->net_dev, w, q->next); in bd_queue_initialize()
4388 priv->stop_rf_kill = 1; in ipw2100_kill_works()
4389 priv->stop_hang_check = 1; in ipw2100_kill_works()
4390 cancel_delayed_work_sync(&priv->reset_work); in ipw2100_kill_works()
4391 cancel_delayed_work_sync(&priv->security_work); in ipw2100_kill_works()
4392 cancel_delayed_work_sync(&priv->wx_event_work); in ipw2100_kill_works()
4393 cancel_delayed_work_sync(&priv->hang_check); in ipw2100_kill_works()
4394 cancel_delayed_work_sync(&priv->rf_kill); in ipw2100_kill_works()
4395 cancel_delayed_work_sync(&priv->scan_event); in ipw2100_kill_works()
4406 err = bd_queue_allocate(priv, &priv->tx_queue, TX_QUEUE_LENGTH); in ipw2100_tx_allocate()
4409 priv->net_dev->name); in ipw2100_tx_allocate()
4413 priv->tx_buffers = kmalloc_array(TX_PENDED_QUEUE_LENGTH, in ipw2100_tx_allocate()
4416 if (!priv->tx_buffers) { in ipw2100_tx_allocate()
4417 bd_queue_free(priv, &priv->tx_queue); in ipw2100_tx_allocate()
4418 return -ENOMEM; in ipw2100_tx_allocate()
4422 v = dma_alloc_coherent(&priv->pci_dev->dev, in ipw2100_tx_allocate()
4427 ": %s: PCI alloc failed for tx " "buffers.\n", in ipw2100_tx_allocate()
4428 priv->net_dev->name); in ipw2100_tx_allocate()
4429 err = -ENOMEM; in ipw2100_tx_allocate()
4433 priv->tx_buffers[i].type = DATA; in ipw2100_tx_allocate()
4434 priv->tx_buffers[i].info.d_struct.data = in ipw2100_tx_allocate()
4436 priv->tx_buffers[i].info.d_struct.data_phys = p; in ipw2100_tx_allocate()
4437 priv->tx_buffers[i].info.d_struct.txb = NULL; in ipw2100_tx_allocate()
4444 dma_free_coherent(&priv->pci_dev->dev, in ipw2100_tx_allocate()
4446 priv->tx_buffers[j].info.d_struct.data, in ipw2100_tx_allocate()
4447 priv->tx_buffers[j].info.d_struct.data_phys); in ipw2100_tx_allocate()
4450 kfree(priv->tx_buffers); in ipw2100_tx_allocate()
4451 priv->tx_buffers = NULL; in ipw2100_tx_allocate()
4465 INIT_LIST_HEAD(&priv->fw_pend_list); in ipw2100_tx_initialize()
4466 INIT_STAT(&priv->fw_pend_stat); in ipw2100_tx_initialize()
4471 INIT_LIST_HEAD(&priv->tx_pend_list); in ipw2100_tx_initialize()
4472 INIT_LIST_HEAD(&priv->tx_free_list); in ipw2100_tx_initialize()
4473 INIT_STAT(&priv->tx_pend_stat); in ipw2100_tx_initialize()
4474 INIT_STAT(&priv->tx_free_stat); in ipw2100_tx_initialize()
4479 if (priv->tx_buffers[i].info.d_struct.txb) { in ipw2100_tx_initialize()
4480 libipw_txb_free(priv->tx_buffers[i].info.d_struct. in ipw2100_tx_initialize()
4482 priv->tx_buffers[i].info.d_struct.txb = NULL; in ipw2100_tx_initialize()
4485 list_add_tail(&priv->tx_buffers[i].list, &priv->tx_free_list); in ipw2100_tx_initialize()
4488 SET_STAT(&priv->tx_free_stat, i); in ipw2100_tx_initialize()
4490 priv->tx_queue.oldest = 0; in ipw2100_tx_initialize()
4491 priv->tx_queue.available = priv->tx_queue.entries; in ipw2100_tx_initialize()
4492 priv->tx_queue.next = 0; in ipw2100_tx_initialize()
4493 INIT_STAT(&priv->txq_stat); in ipw2100_tx_initialize()
4494 SET_STAT(&priv->txq_stat, priv->tx_queue.available); in ipw2100_tx_initialize()
4496 bd_queue_initialize(priv, &priv->tx_queue, in ipw2100_tx_initialize()
4512 bd_queue_free(priv, &priv->tx_queue); in ipw2100_tx_free()
4514 if (!priv->tx_buffers) in ipw2100_tx_free()
4518 if (priv->tx_buffers[i].info.d_struct.txb) { in ipw2100_tx_free()
4519 libipw_txb_free(priv->tx_buffers[i].info.d_struct. in ipw2100_tx_free()
4521 priv->tx_buffers[i].info.d_struct.txb = NULL; in ipw2100_tx_free()
4523 if (priv->tx_buffers[i].info.d_struct.data) in ipw2100_tx_free()
4524 dma_free_coherent(&priv->pci_dev->dev, in ipw2100_tx_free()
4526 priv->tx_buffers[i].info.d_struct.data, in ipw2100_tx_free()
4527 priv->tx_buffers[i].info.d_struct.data_phys); in ipw2100_tx_free()
4530 kfree(priv->tx_buffers); in ipw2100_tx_free()
4531 priv->tx_buffers = NULL; in ipw2100_tx_free()
4538 int i, j, err = -EINVAL; in ipw2100_rx_allocate()
4542 err = bd_queue_allocate(priv, &priv->rx_queue, RX_QUEUE_LENGTH); in ipw2100_rx_allocate()
4551 bd_queue_free(priv, &priv->rx_queue); in ipw2100_rx_allocate()
4558 priv->rx_buffers = kmalloc_array(RX_QUEUE_LENGTH, in ipw2100_rx_allocate()
4561 if (!priv->rx_buffers) { in ipw2100_rx_allocate()
4564 bd_queue_free(priv, &priv->rx_queue); in ipw2100_rx_allocate()
4568 return -ENOMEM; in ipw2100_rx_allocate()
4572 struct ipw2100_rx_packet *packet = &priv->rx_buffers[i]; in ipw2100_rx_allocate()
4576 err = -ENOMEM; in ipw2100_rx_allocate()
4581 priv->rx_queue.drv[i].host_addr = packet->dma_addr; in ipw2100_rx_allocate()
4582 priv->rx_queue.drv[i].buf_length = IPW_RX_NIC_BUFFER_LENGTH; in ipw2100_rx_allocate()
4583 priv->status_queue.drv[i].status_fields = 0; in ipw2100_rx_allocate()
4590 dma_unmap_single(&priv->pci_dev->dev, in ipw2100_rx_allocate()
4591 priv->rx_buffers[j].dma_addr, in ipw2100_rx_allocate()
4594 dev_kfree_skb(priv->rx_buffers[j].skb); in ipw2100_rx_allocate()
4597 kfree(priv->rx_buffers); in ipw2100_rx_allocate()
4598 priv->rx_buffers = NULL; in ipw2100_rx_allocate()
4600 bd_queue_free(priv, &priv->rx_queue); in ipw2100_rx_allocate()
4611 priv->rx_queue.oldest = 0; in ipw2100_rx_initialize()
4612 priv->rx_queue.available = priv->rx_queue.entries - 1; in ipw2100_rx_initialize()
4613 priv->rx_queue.next = priv->rx_queue.entries - 1; in ipw2100_rx_initialize()
4615 INIT_STAT(&priv->rxq_stat); in ipw2100_rx_initialize()
4616 SET_STAT(&priv->rxq_stat, priv->rx_queue.available); in ipw2100_rx_initialize()
4618 bd_queue_initialize(priv, &priv->rx_queue, in ipw2100_rx_initialize()
4625 write_register(priv->net_dev, IPW_MEM_HOST_SHARED_RX_STATUS_BASE, in ipw2100_rx_initialize()
4626 priv->status_queue.nic); in ipw2100_rx_initialize()
4637 bd_queue_free(priv, &priv->rx_queue); in ipw2100_rx_free()
4640 if (!priv->rx_buffers) in ipw2100_rx_free()
4644 if (priv->rx_buffers[i].rxp) { in ipw2100_rx_free()
4645 dma_unmap_single(&priv->pci_dev->dev, in ipw2100_rx_free()
4646 priv->rx_buffers[i].dma_addr, in ipw2100_rx_free()
4649 dev_kfree_skb(priv->rx_buffers[i].skb); in ipw2100_rx_free()
4653 kfree(priv->rx_buffers); in ipw2100_rx_free()
4654 priv->rx_buffers = NULL; in ipw2100_rx_free()
4669 return -EIO; in ipw2100_read_mac_address()
4672 eth_hw_addr_set(priv->net_dev, addr); in ipw2100_read_mac_address()
4673 IPW_DEBUG_INFO("card MAC is %pM\n", priv->net_dev->dev_addr); in ipw2100_read_mac_address()
4697 if (priv->config & CFG_CUSTOM_MAC) { in ipw2100_set_mac_address()
4698 memcpy(cmd.host_command_parameters, priv->mac_addr, ETH_ALEN); in ipw2100_set_mac_address()
4699 eth_hw_addr_set(priv->net_dev, priv->mac_addr); in ipw2100_set_mac_address()
4701 memcpy(cmd.host_command_parameters, priv->net_dev->dev_addr, in ipw2100_set_mac_address()
4730 port_type == IPW_IBSS ? "Ad-Hoc" : "Managed"); in ipw2100_set_port_type()
4737 priv->net_dev->name, err); in ipw2100_set_port_type()
4766 if (priv->ieee->iw_mode == IW_MODE_INFRA) in ipw2100_set_channel()
4771 return -EINVAL; in ipw2100_set_channel()
4786 priv->config |= CFG_STATIC_CHANNEL; in ipw2100_set_channel()
4788 priv->config &= ~CFG_STATIC_CHANNEL; in ipw2100_set_channel()
4790 priv->channel = channel; in ipw2100_set_channel()
4819 if (priv->ieee->iw_mode == IW_MODE_ADHOC) in ipw2100_system_config()
4825 if (!(priv->config & CFG_LONG_PREAMBLE)) in ipw2100_system_config()
4880 /* Set BASIC TX Rate first */ in ipw2100_set_tx_rates()
4883 /* Set TX Rate */ in ipw2100_set_tx_rates()
4887 /* Set MSDU TX Rate */ in ipw2100_set_tx_rates()
4897 priv->tx_rates = rate; in ipw2100_set_tx_rates()
4918 priv->power_mode = IPW_POWER_LEVEL(priv->power_mode); in ipw2100_set_power_mode()
4920 priv->power_mode = IPW_POWER_ENABLED | power_level; in ipw2100_set_power_mode()
4923 if (priv->port_type == IBSS && priv->adhoc_power != DFTL_IBSS_TX_POWER) { in ipw2100_set_power_mode()
4926 cmd.host_command_parameters[0] = (u32) priv->adhoc_power; in ipw2100_set_power_mode()
4955 priv->rts_threshold = threshold; in ipw2100_set_rts_threshold()
4995 priv->frag_threshold = threshold;
5016 priv->short_retry_limit = retry; in ipw2100_set_short_retry()
5036 priv->long_retry_limit = retry; in ipw2100_set_long_retry()
5087 * the currently associated AP -- but in the off chance that a future in ipw2100_disassociate_bssid()
5090 memcpy(cmd.host_command_parameters, priv->bssid, ETH_ALEN); in ipw2100_disassociate_bssid()
5127 err = -EIO; in ipw2100_set_wpa_ie()
5161 security->auth_mode = auth_mode; in ipw2100_set_security_information()
5162 security->unicast_using_group = unicast_using_group; in ipw2100_set_security_information()
5167 security->allowed_ciphers = IPW_NONE_CIPHER; in ipw2100_set_security_information()
5170 security->allowed_ciphers = IPW_WEP40_CIPHER | in ipw2100_set_security_information()
5174 security->allowed_ciphers = IPW_WEP40_CIPHER | in ipw2100_set_security_information()
5178 security->allowed_ciphers = IPW_WEP40_CIPHER | in ipw2100_set_security_information()
5182 security->allowed_ciphers = IPW_WEP40_CIPHER | in ipw2100_set_security_information()
5189 security->auth_mode, security->allowed_ciphers, security_level); in ipw2100_set_security_information()
5191 security->replay_counters_number = 0; in ipw2100_set_security_information()
5218 tmp = (tx_power - IPW_TX_POWER_MIN_DBM) * 16 / in ipw2100_set_tx_power()
5219 (IPW_TX_POWER_MAX_DBM - IPW_TX_POWER_MIN_DBM); in ipw2100_set_tx_power()
5223 if (priv->ieee->iw_mode == IW_MODE_ADHOC) in ipw2100_set_tx_power()
5226 priv->tx_power = tx_power; in ipw2100_set_tx_power()
5245 if (priv->ieee->iw_mode == IW_MODE_ADHOC) { in ipw2100_set_ibss_beacon_interval()
5292 return -ENOMEM; in ipw2100_queues_allocate()
5316 priv->net_dev->name, err); in ipw2100_set_wep_flags()
5337 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
5338 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
5343 * ipw2100_set_key() - Set a the wep key
5376 wep_key->idx = idx; in ipw2100_set_key()
5377 wep_key->len = keylen; in ipw2100_set_key()
5380 memcpy(wep_key->key, key, len); in ipw2100_set_key()
5381 memset(wep_key->key + len, 0, keylen - len); in ipw2100_set_key()
5387 priv->net_dev->name, wep_key->idx); in ipw2100_set_key()
5390 priv->net_dev->name, wep_key->idx, wep_key->len, in ipw2100_set_key()
5391 WEP_STR_64(wep_key->key)); in ipw2100_set_key()
5395 priv->net_dev->name, wep_key->idx, wep_key->len, in ipw2100_set_key()
5396 WEP_STR_128(wep_key->key)); in ipw2100_set_key()
5404 priv->net_dev->name, err); in ipw2100_set_key()
5434 return -EINVAL; in ipw2100_set_key_index()
5441 priv->net_dev->name, err); in ipw2100_set_key_index()
5459 if (!(priv->status & STATUS_RUNNING)) in ipw2100_configure_security()
5468 if (!priv->ieee->sec.enabled) { in ipw2100_configure_security()
5474 if (priv->ieee->sec.flags & SEC_AUTH_MODE) { in ipw2100_configure_security()
5475 if (priv->ieee->sec.auth_mode == WLAN_AUTH_SHARED_KEY) in ipw2100_configure_security()
5477 else if (priv->ieee->sec.auth_mode == WLAN_AUTH_LEAP) in ipw2100_configure_security()
5482 if (priv->ieee->sec.flags & SEC_LEVEL) in ipw2100_configure_security()
5483 sec_level = priv->ieee->sec.level; in ipw2100_configure_security()
5486 if (priv->ieee->sec.flags & SEC_UNICAST_GROUP) in ipw2100_configure_security()
5487 use_group = priv->ieee->sec.unicast_uses_group; in ipw2100_configure_security()
5497 if (priv->ieee->sec.enabled) { in ipw2100_configure_security()
5499 if (!(priv->ieee->sec.flags & (1 << i))) { in ipw2100_configure_security()
5500 memset(priv->ieee->sec.keys[i], 0, WEP_KEY_LEN); in ipw2100_configure_security()
5501 priv->ieee->sec.key_sizes[i] = 0; in ipw2100_configure_security()
5504 priv->ieee->sec.keys[i], in ipw2100_configure_security()
5505 priv->ieee->sec. in ipw2100_configure_security()
5512 ipw2100_set_key_index(priv, priv->ieee->crypt_info.tx_keyidx, 1); in ipw2100_configure_security()
5519 priv->ieee->sec. in ipw2100_configure_security()
5524 priv->status &= ~STATUS_SECURITY_UPDATED; in ipw2100_configure_security()
5539 * process this, then update the security settings--which causes in ipw2100_security_work()
5541 if (!(priv->status & STATUS_ASSOCIATED) && in ipw2100_security_work()
5542 priv->status & STATUS_SECURITY_UPDATED) in ipw2100_security_work()
5547 struct libipw_security *sec) in shim__set_security() argument
5552 mutex_lock(&priv->action_mutex); in shim__set_security()
5553 if (!(priv->status & STATUS_INITIALIZED)) in shim__set_security()
5557 if (sec->flags & (1 << i)) { in shim__set_security()
5558 priv->ieee->sec.key_sizes[i] = sec->key_sizes[i]; in shim__set_security()
5559 if (sec->key_sizes[i] == 0) in shim__set_security()
5560 priv->ieee->sec.flags &= ~(1 << i); in shim__set_security()
5562 memcpy(priv->ieee->sec.keys[i], sec->keys[i], in shim__set_security()
5563 sec->key_sizes[i]); in shim__set_security()
5564 if (sec->level == SEC_LEVEL_1) { in shim__set_security()
5565 priv->ieee->sec.flags |= (1 << i); in shim__set_security()
5566 priv->status |= STATUS_SECURITY_UPDATED; in shim__set_security()
5568 priv->ieee->sec.flags &= ~(1 << i); in shim__set_security()
5572 if ((sec->flags & SEC_ACTIVE_KEY) && in shim__set_security()
5573 priv->ieee->sec.active_key != sec->active_key) { in shim__set_security()
5574 priv->ieee->sec.active_key = sec->active_key; in shim__set_security()
5575 priv->ieee->sec.flags |= SEC_ACTIVE_KEY; in shim__set_security()
5576 priv->status |= STATUS_SECURITY_UPDATED; in shim__set_security()
5579 if ((sec->flags & SEC_AUTH_MODE) && in shim__set_security()
5580 (priv->ieee->sec.auth_mode != sec->auth_mode)) { in shim__set_security()
5581 priv->ieee->sec.auth_mode = sec->auth_mode; in shim__set_security()
5582 priv->ieee->sec.flags |= SEC_AUTH_MODE; in shim__set_security()
5583 priv->status |= STATUS_SECURITY_UPDATED; in shim__set_security()
5586 if (sec->flags & SEC_ENABLED && priv->ieee->sec.enabled != sec->enabled) { in shim__set_security()
5587 priv->ieee->sec.flags |= SEC_ENABLED; in shim__set_security()
5588 priv->ieee->sec.enabled = sec->enabled; in shim__set_security()
5589 priv->status |= STATUS_SECURITY_UPDATED; in shim__set_security()
5592 if (sec->flags & SEC_ENCRYPT) in shim__set_security()
5593 priv->ieee->sec.encrypt = sec->encrypt; in shim__set_security()
5595 if (sec->flags & SEC_LEVEL && priv->ieee->sec.level != sec->level) { in shim__set_security()
5596 priv->ieee->sec.level = sec->level; in shim__set_security()
5597 priv->ieee->sec.flags |= SEC_LEVEL; in shim__set_security()
5598 priv->status |= STATUS_SECURITY_UPDATED; in shim__set_security()
5602 priv->ieee->sec.flags & (1 << 8) ? '1' : '0', in shim__set_security()
5603 priv->ieee->sec.flags & (1 << 7) ? '1' : '0', in shim__set_security()
5604 priv->ieee->sec.flags & (1 << 6) ? '1' : '0', in shim__set_security()
5605 priv->ieee->sec.flags & (1 << 5) ? '1' : '0', in shim__set_security()
5606 priv->ieee->sec.flags & (1 << 4) ? '1' : '0', in shim__set_security()
5607 priv->ieee->sec.flags & (1 << 3) ? '1' : '0', in shim__set_security()
5608 priv->ieee->sec.flags & (1 << 2) ? '1' : '0', in shim__set_security()
5609 priv->ieee->sec.flags & (1 << 1) ? '1' : '0', in shim__set_security()
5610 priv->ieee->sec.flags & (1 << 0) ? '1' : '0'); in shim__set_security()
5616 * if (force_update || !(priv->status & STATUS_ASSOCIATED))*/ in shim__set_security()
5617 if (!(priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING))) in shim__set_security()
5620 mutex_unlock(&priv->action_mutex); in shim__set_security()
5635 if (priv->ieee->iw_mode == IW_MODE_MONITOR) { in ipw2100_adapter_setup()
5636 err = ipw2100_set_channel(priv, priv->channel, batch_mode); in ipw2100_adapter_setup()
5648 return -EIO; in ipw2100_adapter_setup()
5654 err = ipw2100_set_port_type(priv, priv->ieee->iw_mode, batch_mode); in ipw2100_adapter_setup()
5658 if (priv->ieee->iw_mode == IW_MODE_ADHOC) { in ipw2100_adapter_setup()
5659 err = ipw2100_set_channel(priv, priv->channel, batch_mode); in ipw2100_adapter_setup()
5668 err = ipw2100_set_tx_rates(priv, priv->tx_rates, batch_mode); in ipw2100_adapter_setup()
5677 err = ipw2100_set_rts_threshold(priv, priv->rts_threshold); in ipw2100_adapter_setup()
5681 if (priv->config & CFG_STATIC_BSSID) in ipw2100_adapter_setup()
5682 bssid = priv->bssid; in ipw2100_adapter_setup()
5689 if (priv->config & CFG_STATIC_ESSID) in ipw2100_adapter_setup()
5690 err = ipw2100_set_essid(priv, priv->essid, priv->essid_len, in ipw2100_adapter_setup()
5701 if (priv->ieee->iw_mode == IW_MODE_ADHOC) { in ipw2100_adapter_setup()
5704 priv->beacon_interval, in ipw2100_adapter_setup()
5709 err = ipw2100_set_tx_power(priv, priv->tx_power); in ipw2100_adapter_setup()
5716 priv, priv->frag_threshold, batch_mode); in ipw2100_adapter_setup()
5732 /* This method is called by the network layer -- not to be confused with
5741 if (!is_valid_ether_addr(addr->sa_data)) in ipw2100_set_address()
5742 return -EADDRNOTAVAIL; in ipw2100_set_address()
5744 mutex_lock(&priv->action_mutex); in ipw2100_set_address()
5746 priv->config |= CFG_CUSTOM_MAC; in ipw2100_set_address()
5747 memcpy(priv->mac_addr, addr->sa_data, ETH_ALEN); in ipw2100_set_address()
5753 priv->reset_backoff = 0; in ipw2100_set_address()
5754 mutex_unlock(&priv->action_mutex); in ipw2100_set_address()
5755 ipw2100_reset_adapter(&priv->reset_work.work); in ipw2100_set_address()
5759 mutex_unlock(&priv->action_mutex); in ipw2100_set_address()
5767 IPW_DEBUG_INFO("dev->open\n"); in ipw2100_open()
5769 spin_lock_irqsave(&priv->low_lock, flags); in ipw2100_open()
5770 if (priv->status & STATUS_ASSOCIATED) { in ipw2100_open()
5774 spin_unlock_irqrestore(&priv->low_lock, flags); in ipw2100_open()
5788 spin_lock_irqsave(&priv->low_lock, flags); in ipw2100_close()
5790 if (priv->status & STATUS_ASSOCIATED) in ipw2100_close()
5794 /* Flush the TX queue ... */ in ipw2100_close()
5795 while (!list_empty(&priv->tx_pend_list)) { in ipw2100_close()
5796 element = priv->tx_pend_list.next; in ipw2100_close()
5800 DEC_STAT(&priv->tx_pend_stat); in ipw2100_close()
5802 libipw_txb_free(packet->info.d_struct.txb); in ipw2100_close()
5803 packet->info.d_struct.txb = NULL; in ipw2100_close()
5805 list_add_tail(element, &priv->tx_free_list); in ipw2100_close()
5806 INC_STAT(&priv->tx_free_stat); in ipw2100_close()
5808 spin_unlock_irqrestore(&priv->low_lock, flags); in ipw2100_close()
5822 dev->stats.tx_errors++; in ipw2100_tx_timeout()
5825 if (priv->ieee->iw_mode == IW_MODE_MONITOR) in ipw2100_tx_timeout()
5829 IPW_DEBUG_INFO("%s: TX timed out. Scheduling firmware restart.\n", in ipw2100_tx_timeout()
5830 dev->name); in ipw2100_tx_timeout()
5838 priv->ieee->wpa_enabled = value; in ipw2100_wpa_enable()
5845 struct libipw_device *ieee = priv->ieee; in ipw2100_wpa_set_auth_algs()
5846 struct libipw_security sec = { in ipw2100_wpa_set_auth_algs() local
5852 sec.auth_mode = WLAN_AUTH_SHARED_KEY; in ipw2100_wpa_set_auth_algs()
5853 ieee->open_wep = 0; in ipw2100_wpa_set_auth_algs()
5855 sec.auth_mode = WLAN_AUTH_OPEN; in ipw2100_wpa_set_auth_algs()
5856 ieee->open_wep = 1; in ipw2100_wpa_set_auth_algs()
5858 sec.auth_mode = WLAN_AUTH_LEAP; in ipw2100_wpa_set_auth_algs()
5859 ieee->open_wep = 1; in ipw2100_wpa_set_auth_algs()
5861 return -EINVAL; in ipw2100_wpa_set_auth_algs()
5863 if (ieee->set_security) in ipw2100_wpa_set_auth_algs()
5864 ieee->set_security(ieee->dev, &sec); in ipw2100_wpa_set_auth_algs()
5866 ret = -EOPNOTSUPP; in ipw2100_wpa_set_auth_algs()
5894 strscpy(info->driver, DRV_NAME, sizeof(info->driver)); in ipw_ethtool_get_drvinfo()
5895 strscpy(info->version, DRV_VERSION, sizeof(info->version)); in ipw_ethtool_get_drvinfo()
5899 strscpy(info->fw_version, fw_ver, sizeof(info->fw_version)); in ipw_ethtool_get_drvinfo()
5900 strscpy(info->bus_info, pci_name(priv->pci_dev), in ipw_ethtool_get_drvinfo()
5901 sizeof(info->bus_info)); in ipw_ethtool_get_drvinfo()
5907 return (priv->status & STATUS_ASSOCIATED) ? 1 : 0; in ipw2100_ethtool_get_link()
5924 spin_lock_irqsave(&priv->low_lock, flags); in ipw2100_hang_check()
5926 if (priv->fatal_error != 0) { in ipw2100_hang_check()
5929 priv->net_dev->name); in ipw2100_hang_check()
5933 (rtc == priv->last_rtc)) { in ipw2100_hang_check()
5936 priv->net_dev->name); in ipw2100_hang_check()
5943 priv->stop_hang_check = 1; in ipw2100_hang_check()
5944 priv->hangs++; in ipw2100_hang_check()
5950 priv->last_rtc = rtc; in ipw2100_hang_check()
5952 if (!priv->stop_hang_check) in ipw2100_hang_check()
5953 schedule_delayed_work(&priv->hang_check, HZ / 2); in ipw2100_hang_check()
5955 spin_unlock_irqrestore(&priv->low_lock, flags); in ipw2100_hang_check()
5964 spin_lock_irqsave(&priv->low_lock, flags); in ipw2100_rf_kill()
5968 if (!priv->stop_rf_kill) in ipw2100_rf_kill()
5969 schedule_delayed_work(&priv->rf_kill, in ipw2100_rf_kill()
5976 if (!(priv->status & STATUS_RF_KILL_MASK)) { in ipw2100_rf_kill()
5985 spin_unlock_irqrestore(&priv->low_lock, flags); in ipw2100_rf_kill()
6011 priv->ieee = netdev_priv(dev); in ipw2100_alloc_device()
6012 priv->pci_dev = pci_dev; in ipw2100_alloc_device()
6013 priv->net_dev = dev; in ipw2100_alloc_device()
6014 priv->ioaddr = ioaddr; in ipw2100_alloc_device()
6016 priv->ieee->hard_start_xmit = ipw2100_tx; in ipw2100_alloc_device()
6017 priv->ieee->set_security = shim__set_security; in ipw2100_alloc_device()
6019 priv->ieee->perfect_rssi = -20; in ipw2100_alloc_device()
6020 priv->ieee->worst_rssi = -85; in ipw2100_alloc_device()
6022 dev->netdev_ops = &ipw2100_netdev_ops; in ipw2100_alloc_device()
6023 dev->ethtool_ops = &ipw2100_ethtool_ops; in ipw2100_alloc_device()
6024 dev->wireless_handlers = &ipw2100_wx_handler_def; in ipw2100_alloc_device()
6025 dev->watchdog_timeo = 3 * HZ; in ipw2100_alloc_device()
6026 dev->irq = 0; in ipw2100_alloc_device()
6027 dev->min_mtu = 68; in ipw2100_alloc_device()
6028 dev->max_mtu = LIBIPW_DATA_LEN; in ipw2100_alloc_device()
6040 priv->power_mode = IPW_POWER_AUTO; in ipw2100_alloc_device()
6043 priv->config |= CFG_CRC_CHECK; in ipw2100_alloc_device()
6045 priv->ieee->wpa_enabled = 0; in ipw2100_alloc_device()
6046 priv->ieee->drop_unencrypted = 0; in ipw2100_alloc_device()
6047 priv->ieee->privacy_invoked = 0; in ipw2100_alloc_device()
6048 priv->ieee->ieee802_1x = 1; in ipw2100_alloc_device()
6053 priv->ieee->iw_mode = IW_MODE_ADHOC; in ipw2100_alloc_device()
6057 priv->ieee->iw_mode = IW_MODE_MONITOR; in ipw2100_alloc_device()
6062 priv->ieee->iw_mode = IW_MODE_INFRA; in ipw2100_alloc_device()
6067 priv->status |= STATUS_RF_KILL_SW; in ipw2100_alloc_device()
6071 priv->config |= CFG_STATIC_CHANNEL; in ipw2100_alloc_device()
6072 priv->channel = channel; in ipw2100_alloc_device()
6076 priv->config |= CFG_ASSOCIATE; in ipw2100_alloc_device()
6078 priv->beacon_interval = DEFAULT_BEACON_INTERVAL; in ipw2100_alloc_device()
6079 priv->short_retry_limit = DEFAULT_SHORT_RETRY_LIMIT; in ipw2100_alloc_device()
6080 priv->long_retry_limit = DEFAULT_LONG_RETRY_LIMIT; in ipw2100_alloc_device()
6081 priv->rts_threshold = DEFAULT_RTS_THRESHOLD | RTS_DISABLED; in ipw2100_alloc_device()
6082 priv->frag_threshold = DEFAULT_FTS | FRAG_DISABLED; in ipw2100_alloc_device()
6083 priv->tx_power = IPW_TX_POWER_DEFAULT; in ipw2100_alloc_device()
6084 priv->tx_rates = DEFAULT_TX_RATES; in ipw2100_alloc_device()
6086 strcpy(priv->nick, "ipw2100"); in ipw2100_alloc_device()
6088 spin_lock_init(&priv->low_lock); in ipw2100_alloc_device()
6089 mutex_init(&priv->action_mutex); in ipw2100_alloc_device()
6090 mutex_init(&priv->adapter_mutex); in ipw2100_alloc_device()
6092 init_waitqueue_head(&priv->wait_command_queue); in ipw2100_alloc_device()
6096 INIT_LIST_HEAD(&priv->msg_free_list); in ipw2100_alloc_device()
6097 INIT_LIST_HEAD(&priv->msg_pend_list); in ipw2100_alloc_device()
6098 INIT_STAT(&priv->msg_free_stat); in ipw2100_alloc_device()
6099 INIT_STAT(&priv->msg_pend_stat); in ipw2100_alloc_device()
6101 INIT_LIST_HEAD(&priv->tx_free_list); in ipw2100_alloc_device()
6102 INIT_LIST_HEAD(&priv->tx_pend_list); in ipw2100_alloc_device()
6103 INIT_STAT(&priv->tx_free_stat); in ipw2100_alloc_device()
6104 INIT_STAT(&priv->tx_pend_stat); in ipw2100_alloc_device()
6106 INIT_LIST_HEAD(&priv->fw_pend_list); in ipw2100_alloc_device()
6107 INIT_STAT(&priv->fw_pend_stat); in ipw2100_alloc_device()
6109 INIT_DELAYED_WORK(&priv->reset_work, ipw2100_reset_adapter); in ipw2100_alloc_device()
6110 INIT_DELAYED_WORK(&priv->security_work, ipw2100_security_work); in ipw2100_alloc_device()
6111 INIT_DELAYED_WORK(&priv->wx_event_work, ipw2100_wx_event_work); in ipw2100_alloc_device()
6112 INIT_DELAYED_WORK(&priv->hang_check, ipw2100_hang_check); in ipw2100_alloc_device()
6113 INIT_DELAYED_WORK(&priv->rf_kill, ipw2100_rf_kill); in ipw2100_alloc_device()
6114 INIT_DELAYED_WORK(&priv->scan_event, ipw2100_scan_event); in ipw2100_alloc_device()
6116 tasklet_setup(&priv->irq_tasklet, ipw2100_irq_tasklet); in ipw2100_alloc_device()
6119 priv->stop_rf_kill = 1; in ipw2100_alloc_device()
6120 priv->stop_hang_check = 1; in ipw2100_alloc_device()
6138 IPW_DEBUG_INFO("weird - resource type is not memory\n"); in ipw2100_pci_init_one()
6139 err = -ENODEV; in ipw2100_pci_init_one()
6147 err = -EIO; in ipw2100_pci_init_one()
6156 err = -ENOMEM; in ipw2100_pci_init_one()
6173 err = dma_set_mask(&pci_dev->dev, DMA_BIT_MASK(32)); in ipw2100_pci_init_one()
6190 * PCI Tx retries from interfering with C3 CPU state */ in ipw2100_pci_init_one()
6198 err = -ENODEV; in ipw2100_pci_init_one()
6202 SET_NETDEV_DEV(dev, &pci_dev->dev); in ipw2100_pci_init_one()
6205 priv->status |= STATUS_INT_ENABLED; in ipw2100_pci_init_one()
6208 /* Allocate and initialize the Tx/Rx queues and lists */ in ipw2100_pci_init_one()
6212 err = -ENOMEM; in ipw2100_pci_init_one()
6217 err = request_irq(pci_dev->irq, in ipw2100_pci_init_one()
6218 ipw2100_interrupt, IRQF_SHARED, dev->name, priv); in ipw2100_pci_init_one()
6221 "Error calling request_irq: %d.\n", pci_dev->irq); in ipw2100_pci_init_one()
6224 dev->irq = pci_dev->irq; in ipw2100_pci_init_one()
6253 mutex_lock(&priv->action_mutex); in ipw2100_pci_init_one()
6255 IPW_DEBUG_INFO("%s: Bound to %s\n", dev->name, pci_name(pci_dev)); in ipw2100_pci_init_one()
6257 /* perform this after register_netdev so that dev->name is set */ in ipw2100_pci_init_one()
6258 err = sysfs_create_group(&pci_dev->dev.kobj, &ipw2100_attribute_group); in ipw2100_pci_init_one()
6264 if (!(priv->status & STATUS_RF_KILL_MASK)) { in ipw2100_pci_init_one()
6265 /* Enable the adapter - sends HOST_COMPLETE */ in ipw2100_pci_init_one()
6269 priv->net_dev->name); in ipw2100_pci_init_one()
6271 err = -EIO; in ipw2100_pci_init_one()
6282 priv->status |= STATUS_INITIALIZED; in ipw2100_pci_init_one()
6284 mutex_unlock(&priv->action_mutex); in ipw2100_pci_init_one()
6289 mutex_unlock(&priv->action_mutex); in ipw2100_pci_init_one()
6296 wiphy_unregister(priv->ieee->wdev.wiphy); in ipw2100_pci_init_one()
6297 kfree(priv->ieee->bg_band.channels); in ipw2100_pci_init_one()
6304 if (dev->irq) in ipw2100_pci_init_one()
6305 free_irq(dev->irq, priv); in ipw2100_pci_init_one()
6311 sysfs_remove_group(&pci_dev->dev.kobj, in ipw2100_pci_init_one()
6327 struct net_device *dev = priv->net_dev; in ipw2100_pci_remove_one()
6329 mutex_lock(&priv->action_mutex); in ipw2100_pci_remove_one()
6331 priv->status &= ~STATUS_INITIALIZED; in ipw2100_pci_remove_one()
6333 sysfs_remove_group(&pci_dev->dev.kobj, &ipw2100_attribute_group); in ipw2100_pci_remove_one()
6344 mutex_unlock(&priv->action_mutex); in ipw2100_pci_remove_one()
6346 /* Unregister the device first - this results in close() in ipw2100_pci_remove_one()
6359 free_irq(dev->irq, priv); in ipw2100_pci_remove_one()
6361 pci_iounmap(pci_dev, priv->ioaddr); in ipw2100_pci_remove_one()
6364 wiphy_unregister(priv->ieee->wdev.wiphy); in ipw2100_pci_remove_one()
6365 kfree(priv->ieee->bg_band.channels); in ipw2100_pci_remove_one()
6377 struct net_device *dev = priv->net_dev; in ipw2100_suspend()
6379 IPW_DEBUG_INFO("%s: Going into suspend...\n", dev->name); in ipw2100_suspend()
6381 mutex_lock(&priv->action_mutex); in ipw2100_suspend()
6382 if (priv->status & STATUS_INITIALIZED) { in ipw2100_suspend()
6390 priv->suspend_at = ktime_get_boottime_seconds(); in ipw2100_suspend()
6392 mutex_unlock(&priv->action_mutex); in ipw2100_suspend()
6401 struct net_device *dev = priv->net_dev; in ipw2100_resume()
6407 mutex_lock(&priv->action_mutex); in ipw2100_resume()
6409 IPW_DEBUG_INFO("%s: Coming out of suspend...\n", dev->name); in ipw2100_resume()
6413 * re-disable the RETRY_TIMEOUT register (0x41) to keep PCI Tx retries in ipw2100_resume()
6425 priv->suspend_time = ktime_get_boottime_seconds() - priv->suspend_at; in ipw2100_resume()
6428 if (!(priv->status & STATUS_RF_KILL_SW)) in ipw2100_resume()
6431 mutex_unlock(&priv->action_mutex); in ipw2100_resume()
6569 if (!(priv->status & STATUS_ASSOCIATED)) in ipw2100_wx_get_name()
6570 strcpy(wrqu->name, "unassociated"); in ipw2100_wx_get_name()
6572 snprintf(wrqu->name, IFNAMSIZ, "IEEE 802.11b"); in ipw2100_wx_get_name()
6574 IPW_DEBUG_WX("Name: %s\n", wrqu->name); in ipw2100_wx_get_name()
6583 struct iw_freq *fwrq = &wrqu->freq; in ipw2100_wx_set_freq()
6586 if (priv->ieee->iw_mode == IW_MODE_INFRA) in ipw2100_wx_set_freq()
6587 return -EOPNOTSUPP; in ipw2100_wx_set_freq()
6589 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_freq()
6590 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_freq()
6591 err = -EIO; in ipw2100_wx_set_freq()
6596 if (fwrq->e == 1) { in ipw2100_wx_set_freq()
6597 if ((fwrq->m >= (int)2.412e8 && fwrq->m <= (int)2.487e8)) { in ipw2100_wx_set_freq()
6598 int f = fwrq->m / 100000; in ipw2100_wx_set_freq()
6606 fwrq->e = 0; in ipw2100_wx_set_freq()
6607 fwrq->m = c + 1; in ipw2100_wx_set_freq()
6611 if (fwrq->e > 0 || fwrq->m > 1000) { in ipw2100_wx_set_freq()
6612 err = -EOPNOTSUPP; in ipw2100_wx_set_freq()
6615 IPW_DEBUG_WX("SET Freq/Channel -> %d\n", fwrq->m); in ipw2100_wx_set_freq()
6616 err = ipw2100_set_channel(priv, fwrq->m, 0); in ipw2100_wx_set_freq()
6620 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_freq()
6634 wrqu->freq.e = 0; in ipw2100_wx_get_freq()
6638 if (priv->config & CFG_STATIC_CHANNEL || in ipw2100_wx_get_freq()
6639 priv->status & STATUS_ASSOCIATED) in ipw2100_wx_get_freq()
6640 wrqu->freq.m = priv->channel; in ipw2100_wx_get_freq()
6642 wrqu->freq.m = 0; in ipw2100_wx_get_freq()
6644 IPW_DEBUG_WX("GET Freq/Channel -> %d\n", priv->channel); in ipw2100_wx_get_freq()
6656 IPW_DEBUG_WX("SET Mode -> %d\n", wrqu->mode); in ipw2100_wx_set_mode()
6658 if (wrqu->mode == priv->ieee->iw_mode) in ipw2100_wx_set_mode()
6661 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_mode()
6662 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_mode()
6663 err = -EIO; in ipw2100_wx_set_mode()
6667 switch (wrqu->mode) { in ipw2100_wx_set_mode()
6684 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_mode()
6698 wrqu->mode = priv->ieee->iw_mode; in ipw2100_wx_get_mode()
6699 IPW_DEBUG_WX("GET Mode -> %d\n", wrqu->mode); in ipw2100_wx_get_mode()
6736 wrqu->data.length = sizeof(*range); in ipw2100_wx_get_range()
6748 range->throughput = 5 * 1000 * 1000; in ipw2100_wx_get_range()
6750 // range->sensitivity; /* signal level threshold range */ in ipw2100_wx_get_range()
6752 range->max_qual.qual = 100; in ipw2100_wx_get_range()
6754 range->max_qual.level = 0; in ipw2100_wx_get_range()
6755 range->max_qual.noise = 0; in ipw2100_wx_get_range()
6756 range->max_qual.updated = 7; /* Updated all three */ in ipw2100_wx_get_range()
6758 range->avg_qual.qual = 70; /* > 8% missed beacons is 'bad' */ in ipw2100_wx_get_range()
6760 range->avg_qual.level = 20 + IPW2100_RSSI_TO_DBM; in ipw2100_wx_get_range()
6761 range->avg_qual.noise = 0; in ipw2100_wx_get_range()
6762 range->avg_qual.updated = 7; /* Updated all three */ in ipw2100_wx_get_range()
6764 range->num_bitrates = RATE_COUNT; in ipw2100_wx_get_range()
6767 range->bitrate[i] = ipw2100_bg_rates[i].bitrate * 100 * 1000; in ipw2100_wx_get_range()
6770 range->min_rts = MIN_RTS_THRESHOLD; in ipw2100_wx_get_range()
6771 range->max_rts = MAX_RTS_THRESHOLD; in ipw2100_wx_get_range()
6772 range->min_frag = MIN_FRAG_THRESHOLD; in ipw2100_wx_get_range()
6773 range->max_frag = MAX_FRAG_THRESHOLD; in ipw2100_wx_get_range()
6775 range->min_pmp = period_duration[0]; /* Minimal PM period */ in ipw2100_wx_get_range()
6776 range->max_pmp = period_duration[POWER_MODES - 1]; /* Maximal PM period */ in ipw2100_wx_get_range()
6777 range->min_pmt = timeout_duration[POWER_MODES - 1]; /* Minimal PM timeout */ in ipw2100_wx_get_range()
6778 range->max_pmt = timeout_duration[0]; /* Maximal PM timeout */ in ipw2100_wx_get_range()
6781 range->pmp_flags = IW_POWER_PERIOD; in ipw2100_wx_get_range()
6783 range->pmt_flags = IW_POWER_TIMEOUT; in ipw2100_wx_get_range()
6785 range->pm_capa = IW_POWER_TIMEOUT | IW_POWER_PERIOD; in ipw2100_wx_get_range()
6787 range->encoding_size[0] = 5; in ipw2100_wx_get_range()
6788 range->encoding_size[1] = 13; /* Different token sizes */ in ipw2100_wx_get_range()
6789 range->num_encoding_sizes = 2; /* Number of entry in the list */ in ipw2100_wx_get_range()
6790 range->max_encoding_tokens = WEP_KEYS; /* Max number of tokens */ in ipw2100_wx_get_range()
6791 // range->encoding_login_index; /* token index for login token */ in ipw2100_wx_get_range()
6793 if (priv->ieee->iw_mode == IW_MODE_ADHOC) { in ipw2100_wx_get_range()
6794 range->txpower_capa = IW_TXPOW_DBM; in ipw2100_wx_get_range()
6795 range->num_txpower = IW_MAX_TXPOWER; in ipw2100_wx_get_range()
6798 i++, level -= in ipw2100_wx_get_range()
6799 ((IPW_TX_POWER_MAX_DBM - in ipw2100_wx_get_range()
6800 IPW_TX_POWER_MIN_DBM) * 16) / (IW_MAX_TXPOWER - 1)) in ipw2100_wx_get_range()
6801 range->txpower[i] = level / 16; in ipw2100_wx_get_range()
6803 range->txpower_capa = 0; in ipw2100_wx_get_range()
6804 range->num_txpower = 0; in ipw2100_wx_get_range()
6808 range->we_version_compiled = WIRELESS_EXT; in ipw2100_wx_get_range()
6809 range->we_version_source = 18; in ipw2100_wx_get_range()
6811 // range->retry_capa; /* What retry options are supported */ in ipw2100_wx_get_range()
6812 // range->retry_flags; /* How to decode max/min retry limit */ in ipw2100_wx_get_range()
6813 // range->r_time_flags; /* How to decode max/min retry life */ in ipw2100_wx_get_range()
6814 // range->min_retry; /* Minimal number of retries */ in ipw2100_wx_get_range()
6815 // range->max_retry; /* Maximal number of retries */ in ipw2100_wx_get_range()
6816 // range->min_r_time; /* Minimal retry lifetime */ in ipw2100_wx_get_range()
6817 // range->max_r_time; /* Maximal retry lifetime */ in ipw2100_wx_get_range()
6819 range->num_channels = FREQ_COUNT; in ipw2100_wx_get_range()
6824 // if (local->channel_mask & (1 << i)) { in ipw2100_wx_get_range()
6825 range->freq[val].i = i + 1; in ipw2100_wx_get_range()
6826 range->freq[val].m = ipw2100_frequencies[i] * 100000; in ipw2100_wx_get_range()
6827 range->freq[val].e = 1; in ipw2100_wx_get_range()
6833 range->num_frequency = val; in ipw2100_wx_get_range()
6836 range->event_capa[0] = (IW_EVENT_CAPA_K_0 | in ipw2100_wx_get_range()
6838 range->event_capa[1] = IW_EVENT_CAPA_K_1; in ipw2100_wx_get_range()
6840 range->enc_capa = IW_ENC_CAPA_WPA | IW_ENC_CAPA_WPA2 | in ipw2100_wx_get_range()
6856 if (wrqu->ap_addr.sa_family != ARPHRD_ETHER) in ipw2100_wx_set_wap()
6857 return -EINVAL; in ipw2100_wx_set_wap()
6859 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_wap()
6860 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_wap()
6861 err = -EIO; in ipw2100_wx_set_wap()
6865 if (is_broadcast_ether_addr(wrqu->ap_addr.sa_data) || in ipw2100_wx_set_wap()
6866 is_zero_ether_addr(wrqu->ap_addr.sa_data)) { in ipw2100_wx_set_wap()
6868 IPW_DEBUG_WX("exit - disable mandatory BSSID\n"); in ipw2100_wx_set_wap()
6869 priv->config &= ~CFG_STATIC_BSSID; in ipw2100_wx_set_wap()
6874 priv->config |= CFG_STATIC_BSSID; in ipw2100_wx_set_wap()
6875 memcpy(priv->mandatory_bssid_mac, wrqu->ap_addr.sa_data, ETH_ALEN); in ipw2100_wx_set_wap()
6877 err = ipw2100_set_mandatory_bssid(priv, wrqu->ap_addr.sa_data, 0); in ipw2100_wx_set_wap()
6879 IPW_DEBUG_WX("SET BSSID -> %pM\n", wrqu->ap_addr.sa_data); in ipw2100_wx_set_wap()
6882 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_wap()
6898 if (priv->config & CFG_STATIC_BSSID || priv->status & STATUS_ASSOCIATED) { in ipw2100_wx_get_wap()
6899 wrqu->ap_addr.sa_family = ARPHRD_ETHER; in ipw2100_wx_get_wap()
6900 memcpy(wrqu->ap_addr.sa_data, priv->bssid, ETH_ALEN); in ipw2100_wx_get_wap()
6902 eth_zero_addr(wrqu->ap_addr.sa_data); in ipw2100_wx_get_wap()
6904 IPW_DEBUG_WX("Getting WAP BSSID: %pM\n", wrqu->ap_addr.sa_data); in ipw2100_wx_get_wap()
6917 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_essid()
6918 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_essid()
6919 err = -EIO; in ipw2100_wx_set_essid()
6923 if (wrqu->essid.flags && wrqu->essid.length) { in ipw2100_wx_set_essid()
6924 length = wrqu->essid.length; in ipw2100_wx_set_essid()
6930 priv->config &= ~CFG_STATIC_ESSID; in ipw2100_wx_set_essid()
6937 priv->config |= CFG_STATIC_ESSID; in ipw2100_wx_set_essid()
6939 if (priv->essid_len == length && !memcmp(priv->essid, extra, length)) { in ipw2100_wx_set_essid()
6947 priv->essid_len = length; in ipw2100_wx_set_essid()
6948 memcpy(priv->essid, essid, priv->essid_len); in ipw2100_wx_set_essid()
6953 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_essid()
6969 if (priv->config & CFG_STATIC_ESSID || priv->status & STATUS_ASSOCIATED) { in ipw2100_wx_get_essid()
6971 priv->essid_len, priv->essid); in ipw2100_wx_get_essid()
6972 memcpy(extra, priv->essid, priv->essid_len); in ipw2100_wx_get_essid()
6973 wrqu->essid.length = priv->essid_len; in ipw2100_wx_get_essid()
6974 wrqu->essid.flags = 1; /* active */ in ipw2100_wx_get_essid()
6977 wrqu->essid.length = 0; in ipw2100_wx_get_essid()
6978 wrqu->essid.flags = 0; /* active */ in ipw2100_wx_get_essid()
6994 if (wrqu->data.length > IW_ESSID_MAX_SIZE) in ipw2100_wx_set_nick()
6995 return -E2BIG; in ipw2100_wx_set_nick()
6997 wrqu->data.length = min_t(size_t, wrqu->data.length, sizeof(priv->nick)); in ipw2100_wx_set_nick()
6998 memset(priv->nick, 0, sizeof(priv->nick)); in ipw2100_wx_set_nick()
6999 memcpy(priv->nick, extra, wrqu->data.length); in ipw2100_wx_set_nick()
7001 IPW_DEBUG_WX("SET Nickname -> %s\n", priv->nick); in ipw2100_wx_set_nick()
7016 wrqu->data.length = strlen(priv->nick); in ipw2100_wx_get_nick()
7017 memcpy(extra, priv->nick, wrqu->data.length); in ipw2100_wx_get_nick()
7018 wrqu->data.flags = 1; /* active */ in ipw2100_wx_get_nick()
7020 IPW_DEBUG_WX("GET Nickname -> %s\n", extra); in ipw2100_wx_get_nick()
7030 u32 target_rate = wrqu->bitrate.value; in ipw2100_wx_set_rate()
7034 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_rate()
7035 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_rate()
7036 err = -EIO; in ipw2100_wx_set_rate()
7043 (!wrqu->bitrate.fixed && target_rate > 1000000)) in ipw2100_wx_set_rate()
7046 (!wrqu->bitrate.fixed && target_rate > 2000000)) in ipw2100_wx_set_rate()
7049 (!wrqu->bitrate.fixed && target_rate > 5500000)) in ipw2100_wx_set_rate()
7052 (!wrqu->bitrate.fixed && target_rate > 11000000)) in ipw2100_wx_set_rate()
7059 IPW_DEBUG_WX("SET Rate -> %04X\n", rate); in ipw2100_wx_set_rate()
7061 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_rate()
7074 if (!(priv->status & STATUS_ENABLED) || in ipw2100_wx_get_rate()
7075 priv->status & STATUS_RF_KILL_MASK || in ipw2100_wx_get_rate()
7076 !(priv->status & STATUS_ASSOCIATED)) { in ipw2100_wx_get_rate()
7077 wrqu->bitrate.value = 0; in ipw2100_wx_get_rate()
7081 mutex_lock(&priv->action_mutex); in ipw2100_wx_get_rate()
7082 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_get_rate()
7083 err = -EIO; in ipw2100_wx_get_rate()
7095 wrqu->bitrate.value = 1000000; in ipw2100_wx_get_rate()
7098 wrqu->bitrate.value = 2000000; in ipw2100_wx_get_rate()
7101 wrqu->bitrate.value = 5500000; in ipw2100_wx_get_rate()
7104 wrqu->bitrate.value = 11000000; in ipw2100_wx_get_rate()
7107 wrqu->bitrate.value = 0; in ipw2100_wx_get_rate()
7110 IPW_DEBUG_WX("GET Rate -> %d\n", wrqu->bitrate.value); in ipw2100_wx_get_rate()
7113 mutex_unlock(&priv->action_mutex); in ipw2100_wx_get_rate()
7125 if (wrqu->rts.fixed == 0) in ipw2100_wx_set_rts()
7126 return -EINVAL; in ipw2100_wx_set_rts()
7128 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_rts()
7129 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_rts()
7130 err = -EIO; in ipw2100_wx_set_rts()
7134 if (wrqu->rts.disabled) in ipw2100_wx_set_rts()
7135 value = priv->rts_threshold | RTS_DISABLED; in ipw2100_wx_set_rts()
7137 if (wrqu->rts.value < 1 || wrqu->rts.value > 2304) { in ipw2100_wx_set_rts()
7138 err = -EINVAL; in ipw2100_wx_set_rts()
7141 value = wrqu->rts.value; in ipw2100_wx_set_rts()
7146 IPW_DEBUG_WX("SET RTS Threshold -> 0x%08X\n", value); in ipw2100_wx_set_rts()
7148 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_rts()
7162 wrqu->rts.value = priv->rts_threshold & ~RTS_DISABLED; in ipw2100_wx_get_rts()
7163 wrqu->rts.fixed = 1; /* no auto select */ in ipw2100_wx_get_rts()
7166 wrqu->rts.disabled = (priv->rts_threshold & RTS_DISABLED) ? 1 : 0; in ipw2100_wx_get_rts()
7168 IPW_DEBUG_WX("GET RTS Threshold -> 0x%08X\n", wrqu->rts.value); in ipw2100_wx_get_rts()
7180 if (ipw_radio_kill_sw(priv, wrqu->txpower.disabled)) in ipw2100_wx_set_txpow()
7181 return -EINPROGRESS; in ipw2100_wx_set_txpow()
7183 if (priv->ieee->iw_mode != IW_MODE_ADHOC) in ipw2100_wx_set_txpow()
7186 if ((wrqu->txpower.flags & IW_TXPOW_TYPE) != IW_TXPOW_DBM) in ipw2100_wx_set_txpow()
7187 return -EINVAL; in ipw2100_wx_set_txpow()
7189 if (wrqu->txpower.fixed == 0) in ipw2100_wx_set_txpow()
7192 if (wrqu->txpower.value < IPW_TX_POWER_MIN_DBM || in ipw2100_wx_set_txpow()
7193 wrqu->txpower.value > IPW_TX_POWER_MAX_DBM) in ipw2100_wx_set_txpow()
7194 return -EINVAL; in ipw2100_wx_set_txpow()
7196 value = wrqu->txpower.value; in ipw2100_wx_set_txpow()
7199 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_txpow()
7200 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_txpow()
7201 err = -EIO; in ipw2100_wx_set_txpow()
7207 IPW_DEBUG_WX("SET TX Power -> %d\n", value); in ipw2100_wx_set_txpow()
7210 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_txpow()
7224 wrqu->txpower.disabled = (priv->status & STATUS_RF_KILL_MASK) ? 1 : 0; in ipw2100_wx_get_txpow()
7226 if (priv->tx_power == IPW_TX_POWER_DEFAULT) { in ipw2100_wx_get_txpow()
7227 wrqu->txpower.fixed = 0; in ipw2100_wx_get_txpow()
7228 wrqu->txpower.value = IPW_TX_POWER_MAX_DBM; in ipw2100_wx_get_txpow()
7230 wrqu->txpower.fixed = 1; in ipw2100_wx_get_txpow()
7231 wrqu->txpower.value = priv->tx_power; in ipw2100_wx_get_txpow()
7234 wrqu->txpower.flags = IW_TXPOW_DBM; in ipw2100_wx_get_txpow()
7236 IPW_DEBUG_WX("GET TX Power -> %d\n", wrqu->txpower.value); in ipw2100_wx_get_txpow()
7251 if (!wrqu->frag.fixed) in ipw2100_wx_set_frag()
7252 return -EINVAL; in ipw2100_wx_set_frag()
7254 if (wrqu->frag.disabled) { in ipw2100_wx_set_frag()
7255 priv->frag_threshold |= FRAG_DISABLED; in ipw2100_wx_set_frag()
7256 priv->ieee->fts = DEFAULT_FTS; in ipw2100_wx_set_frag()
7258 if (wrqu->frag.value < MIN_FRAG_THRESHOLD || in ipw2100_wx_set_frag()
7259 wrqu->frag.value > MAX_FRAG_THRESHOLD) in ipw2100_wx_set_frag()
7260 return -EINVAL; in ipw2100_wx_set_frag()
7262 priv->ieee->fts = wrqu->frag.value & ~0x1; in ipw2100_wx_set_frag()
7263 priv->frag_threshold = priv->ieee->fts; in ipw2100_wx_set_frag()
7266 IPW_DEBUG_WX("SET Frag Threshold -> %d\n", priv->ieee->fts); in ipw2100_wx_set_frag()
7280 wrqu->frag.value = priv->frag_threshold & ~FRAG_DISABLED; in ipw2100_wx_get_frag()
7281 wrqu->frag.fixed = 0; /* no auto select */ in ipw2100_wx_get_frag()
7282 wrqu->frag.disabled = (priv->frag_threshold & FRAG_DISABLED) ? 1 : 0; in ipw2100_wx_get_frag()
7284 IPW_DEBUG_WX("GET Frag Threshold -> %d\n", wrqu->frag.value); in ipw2100_wx_get_frag()
7296 if (wrqu->retry.flags & IW_RETRY_LIFETIME || wrqu->retry.disabled) in ipw2100_wx_set_retry()
7297 return -EINVAL; in ipw2100_wx_set_retry()
7299 if (!(wrqu->retry.flags & IW_RETRY_LIMIT)) in ipw2100_wx_set_retry()
7302 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_retry()
7303 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_retry()
7304 err = -EIO; in ipw2100_wx_set_retry()
7308 if (wrqu->retry.flags & IW_RETRY_SHORT) { in ipw2100_wx_set_retry()
7309 err = ipw2100_set_short_retry(priv, wrqu->retry.value); in ipw2100_wx_set_retry()
7310 IPW_DEBUG_WX("SET Short Retry Limit -> %d\n", in ipw2100_wx_set_retry()
7311 wrqu->retry.value); in ipw2100_wx_set_retry()
7315 if (wrqu->retry.flags & IW_RETRY_LONG) { in ipw2100_wx_set_retry()
7316 err = ipw2100_set_long_retry(priv, wrqu->retry.value); in ipw2100_wx_set_retry()
7317 IPW_DEBUG_WX("SET Long Retry Limit -> %d\n", in ipw2100_wx_set_retry()
7318 wrqu->retry.value); in ipw2100_wx_set_retry()
7322 err = ipw2100_set_short_retry(priv, wrqu->retry.value); in ipw2100_wx_set_retry()
7324 err = ipw2100_set_long_retry(priv, wrqu->retry.value); in ipw2100_wx_set_retry()
7326 IPW_DEBUG_WX("SET Both Retry Limits -> %d\n", wrqu->retry.value); in ipw2100_wx_set_retry()
7329 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_retry()
7343 wrqu->retry.disabled = 0; /* can't be disabled */ in ipw2100_wx_get_retry()
7345 if ((wrqu->retry.flags & IW_RETRY_TYPE) == IW_RETRY_LIFETIME) in ipw2100_wx_get_retry()
7346 return -EINVAL; in ipw2100_wx_get_retry()
7348 if (wrqu->retry.flags & IW_RETRY_LONG) { in ipw2100_wx_get_retry()
7349 wrqu->retry.flags = IW_RETRY_LIMIT | IW_RETRY_LONG; in ipw2100_wx_get_retry()
7350 wrqu->retry.value = priv->long_retry_limit; in ipw2100_wx_get_retry()
7352 wrqu->retry.flags = in ipw2100_wx_get_retry()
7353 (priv->short_retry_limit != in ipw2100_wx_get_retry()
7354 priv->long_retry_limit) ? in ipw2100_wx_get_retry()
7357 wrqu->retry.value = priv->short_retry_limit; in ipw2100_wx_get_retry()
7360 IPW_DEBUG_WX("GET Retry -> %d\n", wrqu->retry.value); in ipw2100_wx_get_retry()
7372 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_scan()
7373 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_scan()
7374 err = -EIO; in ipw2100_wx_set_scan()
7380 priv->user_requested_scan = 1; in ipw2100_wx_set_scan()
7389 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_scan()
7402 return libipw_wx_get_scan(priv->ieee, info, wrqu, extra); in ipw2100_wx_get_scan()
7406 * Implementation based on code in hostap-driver v0.1.3 hostap_ioctl.c
7417 return libipw_wx_set_encode(priv->ieee, info, wrqu, key); in ipw2100_wx_set_encode()
7429 return libipw_wx_get_encode(priv->ieee, info, wrqu, key); in ipw2100_wx_get_encode()
7439 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_power()
7440 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_power()
7441 err = -EIO; in ipw2100_wx_set_power()
7445 if (wrqu->power.disabled) { in ipw2100_wx_set_power()
7446 priv->power_mode = IPW_POWER_LEVEL(priv->power_mode); in ipw2100_wx_set_power()
7448 IPW_DEBUG_WX("SET Power Management Mode -> off\n"); in ipw2100_wx_set_power()
7452 switch (wrqu->power.flags & IW_POWER_MODE) { in ipw2100_wx_set_power()
7459 wrqu->power.flags); in ipw2100_wx_set_power()
7460 err = -EOPNOTSUPP; in ipw2100_wx_set_power()
7466 priv->power_mode = IPW_POWER_ENABLED | priv->power_mode; in ipw2100_wx_set_power()
7467 err = ipw2100_set_power_mode(priv, IPW_POWER_LEVEL(priv->power_mode)); in ipw2100_wx_set_power()
7469 IPW_DEBUG_WX("SET Power Management Mode -> 0x%02X\n", priv->power_mode); in ipw2100_wx_set_power()
7472 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_power()
7487 if (!(priv->power_mode & IPW_POWER_ENABLED)) in ipw2100_wx_get_power()
7488 wrqu->power.disabled = 1; in ipw2100_wx_get_power()
7490 wrqu->power.disabled = 0; in ipw2100_wx_get_power()
7491 wrqu->power.flags = 0; in ipw2100_wx_get_power()
7494 IPW_DEBUG_WX("GET Power Management Mode -> %02X\n", priv->power_mode); in ipw2100_wx_get_power()
7500 * WE-18 WPA support
7510 struct libipw_device *ieee = priv->ieee; in ipw2100_wx_set_genie()
7513 if (!ieee->wpa_enabled) in ipw2100_wx_set_genie()
7514 return -EOPNOTSUPP; in ipw2100_wx_set_genie()
7516 if (wrqu->data.length > MAX_WPA_IE_LEN || in ipw2100_wx_set_genie()
7517 (wrqu->data.length && extra == NULL)) in ipw2100_wx_set_genie()
7518 return -EINVAL; in ipw2100_wx_set_genie()
7520 if (wrqu->data.length) { in ipw2100_wx_set_genie()
7521 buf = kmemdup(extra, wrqu->data.length, GFP_KERNEL); in ipw2100_wx_set_genie()
7523 return -ENOMEM; in ipw2100_wx_set_genie()
7525 kfree(ieee->wpa_ie); in ipw2100_wx_set_genie()
7526 ieee->wpa_ie = buf; in ipw2100_wx_set_genie()
7527 ieee->wpa_ie_len = wrqu->data.length; in ipw2100_wx_set_genie()
7529 kfree(ieee->wpa_ie); in ipw2100_wx_set_genie()
7530 ieee->wpa_ie = NULL; in ipw2100_wx_set_genie()
7531 ieee->wpa_ie_len = 0; in ipw2100_wx_set_genie()
7534 ipw2100_wpa_assoc_frame(priv, ieee->wpa_ie, ieee->wpa_ie_len); in ipw2100_wx_set_genie()
7545 struct libipw_device *ieee = priv->ieee; in ipw2100_wx_get_genie()
7547 if (ieee->wpa_ie_len == 0 || ieee->wpa_ie == NULL) { in ipw2100_wx_get_genie()
7548 wrqu->data.length = 0; in ipw2100_wx_get_genie()
7552 if (wrqu->data.length < ieee->wpa_ie_len) in ipw2100_wx_get_genie()
7553 return -E2BIG; in ipw2100_wx_get_genie()
7555 wrqu->data.length = ieee->wpa_ie_len; in ipw2100_wx_get_genie()
7556 memcpy(extra, ieee->wpa_ie, ieee->wpa_ie_len); in ipw2100_wx_get_genie()
7567 struct libipw_device *ieee = priv->ieee; in ipw2100_wx_set_auth()
7568 struct iw_param *param = &wrqu->param; in ipw2100_wx_set_auth()
7573 switch (param->flags & IW_AUTH_INDEX) { in ipw2100_wx_set_auth()
7584 crypt = priv->ieee->crypt_info.crypt[priv->ieee->crypt_info.tx_keyidx]; in ipw2100_wx_set_auth()
7585 if (!crypt || !crypt->ops->set_flags || !crypt->ops->get_flags) in ipw2100_wx_set_auth()
7588 flags = crypt->ops->get_flags(crypt->priv); in ipw2100_wx_set_auth()
7590 if (param->value) in ipw2100_wx_set_auth()
7595 crypt->ops->set_flags(flags, crypt->priv); in ipw2100_wx_set_auth()
7607 * used, drop_unencrypted is set to false, else true -- we in ipw2100_wx_set_auth()
7611 struct libipw_security sec = { in ipw2100_wx_set_auth() local
7613 .enabled = param->value, in ipw2100_wx_set_auth()
7615 priv->ieee->drop_unencrypted = param->value; in ipw2100_wx_set_auth()
7619 if (!param->value) { in ipw2100_wx_set_auth()
7620 sec.flags |= SEC_LEVEL; in ipw2100_wx_set_auth()
7621 sec.level = SEC_LEVEL_0; in ipw2100_wx_set_auth()
7623 sec.flags |= SEC_LEVEL; in ipw2100_wx_set_auth()
7624 sec.level = SEC_LEVEL_1; in ipw2100_wx_set_auth()
7626 if (priv->ieee->set_security) in ipw2100_wx_set_auth()
7627 priv->ieee->set_security(priv->ieee->dev, &sec); in ipw2100_wx_set_auth()
7632 ret = ipw2100_wpa_set_auth_algs(priv, param->value); in ipw2100_wx_set_auth()
7636 ret = ipw2100_wpa_enable(priv, param->value); in ipw2100_wx_set_auth()
7640 ieee->ieee802_1x = param->value; in ipw2100_wx_set_auth()
7645 ieee->privacy_invoked = param->value; in ipw2100_wx_set_auth()
7649 return -EOPNOTSUPP; in ipw2100_wx_set_auth()
7660 struct libipw_device *ieee = priv->ieee; in ipw2100_wx_get_auth()
7662 struct iw_param *param = &wrqu->param; in ipw2100_wx_get_auth()
7664 switch (param->flags & IW_AUTH_INDEX) { in ipw2100_wx_get_auth()
7675 crypt = priv->ieee->crypt_info.crypt[priv->ieee->crypt_info.tx_keyidx]; in ipw2100_wx_get_auth()
7676 if (!crypt || !crypt->ops->get_flags) { in ipw2100_wx_get_auth()
7682 param->value = (crypt->ops->get_flags(crypt->priv) & in ipw2100_wx_get_auth()
7688 param->value = ieee->drop_unencrypted; in ipw2100_wx_get_auth()
7692 param->value = priv->ieee->sec.auth_mode; in ipw2100_wx_get_auth()
7696 param->value = ieee->wpa_enabled; in ipw2100_wx_get_auth()
7700 param->value = ieee->ieee802_1x; in ipw2100_wx_get_auth()
7705 param->value = ieee->privacy_invoked; in ipw2100_wx_get_auth()
7709 return -EOPNOTSUPP; in ipw2100_wx_get_auth()
7720 return libipw_wx_set_encodeext(priv->ieee, info, wrqu, extra); in ipw2100_wx_set_encodeext()
7729 return libipw_wx_get_encodeext(priv->ieee, info, wrqu, extra); in ipw2100_wx_get_encodeext()
7740 switch (mlme->cmd) { in ipw2100_wx_set_mlme()
7750 return -EOPNOTSUPP; in ipw2100_wx_set_mlme()
7770 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_promisc()
7771 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_promisc()
7772 err = -EIO; in ipw2100_wx_set_promisc()
7777 if (priv->ieee->iw_mode == IW_MODE_MONITOR) { in ipw2100_wx_set_promisc()
7781 priv->channel = parms[1]; in ipw2100_wx_set_promisc()
7784 if (priv->ieee->iw_mode == IW_MODE_MONITOR) in ipw2100_wx_set_promisc()
7785 err = ipw2100_switch_mode(priv, priv->last_mode); in ipw2100_wx_set_promisc()
7788 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_promisc()
7797 if (priv->status & STATUS_INITIALIZED) in ipw2100_wx_reset()
7811 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_powermode()
7812 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_powermode()
7813 err = -EIO; in ipw2100_wx_set_powermode()
7820 if (IPW_POWER_LEVEL(priv->power_mode) != mode) in ipw2100_wx_set_powermode()
7823 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_powermode()
7837 int level = IPW_POWER_LEVEL(priv->power_mode); in ipw2100_wx_get_powermode()
7840 if (!(priv->power_mode & IPW_POWER_ENABLED)) { in ipw2100_wx_get_powermode()
7854 timeout = timeout_duration[level - 1] / 1000; in ipw2100_wx_get_powermode()
7855 period = period_duration[level - 1] / 1000; in ipw2100_wx_get_powermode()
7863 wrqu->data.length = strlen(extra) + 1; in ipw2100_wx_get_powermode()
7875 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_preamble()
7876 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_preamble()
7877 err = -EIO; in ipw2100_wx_set_preamble()
7882 priv->config |= CFG_LONG_PREAMBLE; in ipw2100_wx_set_preamble()
7884 priv->config &= ~CFG_LONG_PREAMBLE; in ipw2100_wx_set_preamble()
7886 err = -EINVAL; in ipw2100_wx_set_preamble()
7893 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_preamble()
7907 if (priv->config & CFG_LONG_PREAMBLE) in ipw2100_wx_get_preamble()
7908 snprintf(wrqu->name, IFNAMSIZ, "long (1)"); in ipw2100_wx_get_preamble()
7910 snprintf(wrqu->name, IFNAMSIZ, "auto (0)"); in ipw2100_wx_get_preamble()
7923 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_crc_check()
7924 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_crc_check()
7925 err = -EIO; in ipw2100_wx_set_crc_check()
7930 priv->config |= CFG_CRC_CHECK; in ipw2100_wx_set_crc_check()
7932 priv->config &= ~CFG_CRC_CHECK; in ipw2100_wx_set_crc_check()
7934 err = -EINVAL; in ipw2100_wx_set_crc_check()
7940 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_crc_check()
7954 if (priv->config & CFG_CRC_CHECK) in ipw2100_wx_get_crc_check()
7955 snprintf(wrqu->name, IFNAMSIZ, "CRC checked (1)"); in ipw2100_wx_get_crc_check()
7957 snprintf(wrqu->name, IFNAMSIZ, "CRC ignored (0)"); in ipw2100_wx_get_crc_check()
8093 wstats = &priv->wstats; in ipw2100_wx_wireless_stats()
8100 if (!(priv->status & STATUS_ASSOCIATED)) { in ipw2100_wx_wireless_stats()
8101 wstats->miss.beacon = 0; in ipw2100_wx_wireless_stats()
8102 wstats->discard.retries = 0; in ipw2100_wx_wireless_stats()
8103 wstats->qual.qual = 0; in ipw2100_wx_wireless_stats()
8104 wstats->qual.level = 0; in ipw2100_wx_wireless_stats()
8105 wstats->qual.noise = 0; in ipw2100_wx_wireless_stats()
8106 wstats->qual.updated = 7; in ipw2100_wx_wireless_stats()
8107 wstats->qual.updated |= IW_QUAL_NOISE_INVALID | in ipw2100_wx_wireless_stats()
8117 if (!(priv->status & STATUS_ASSOCIATED)) { in ipw2100_wx_wireless_stats()
8118 wstats->qual.qual = 0; in ipw2100_wx_wireless_stats()
8119 wstats->qual.level = 0; in ipw2100_wx_wireless_stats()
8124 wstats->qual.level = rssi + IPW2100_RSSI_TO_DBM; in ipw2100_wx_wireless_stats()
8128 rssi_qual = (rssi - 10) * (FAIR - POOR) / 5 + POOR; in ipw2100_wx_wireless_stats()
8130 rssi_qual = (rssi - 15) * (GOOD - FAIR) / 5 + FAIR; in ipw2100_wx_wireless_stats()
8132 rssi_qual = (rssi - 20) * (VERY_GOOD - GOOD) / in ipw2100_wx_wireless_stats()
8135 rssi_qual = (rssi - 30) * (PERFECT - VERY_GOOD) / in ipw2100_wx_wireless_stats()
8143 tx_qual = (90 - tx_retries) * POOR / 15; in ipw2100_wx_wireless_stats()
8145 tx_qual = (75 - tx_retries) * (FAIR - POOR) / 5 + POOR; in ipw2100_wx_wireless_stats()
8147 tx_qual = (70 - tx_retries) * (GOOD - FAIR) / 5 + FAIR; in ipw2100_wx_wireless_stats()
8149 tx_qual = (65 - tx_retries) * (VERY_GOOD - GOOD) / in ipw2100_wx_wireless_stats()
8152 tx_qual = (50 - tx_retries) * in ipw2100_wx_wireless_stats()
8153 (PERFECT - VERY_GOOD) / 50 + VERY_GOOD; in ipw2100_wx_wireless_stats()
8156 beacon_qual = (60 - missed_beacons) * POOR / 10; in ipw2100_wx_wireless_stats()
8158 beacon_qual = (50 - missed_beacons) * (FAIR - POOR) / in ipw2100_wx_wireless_stats()
8161 beacon_qual = (40 - missed_beacons) * (GOOD - FAIR) / in ipw2100_wx_wireless_stats()
8164 beacon_qual = (32 - missed_beacons) * in ipw2100_wx_wireless_stats()
8165 (VERY_GOOD - GOOD) / 20 + GOOD; in ipw2100_wx_wireless_stats()
8167 beacon_qual = (20 - missed_beacons) * in ipw2100_wx_wireless_stats()
8168 (PERFECT - VERY_GOOD) / 20 + VERY_GOOD; in ipw2100_wx_wireless_stats()
8177 IPW_DEBUG_WX("Quality clamped by Tx Retries\n"); in ipw2100_wx_wireless_stats()
8184 wstats->qual.qual = quality; in ipw2100_wx_wireless_stats()
8185 wstats->qual.level = rssi + IPW2100_RSSI_TO_DBM; in ipw2100_wx_wireless_stats()
8188 wstats->qual.noise = 0; in ipw2100_wx_wireless_stats()
8189 wstats->qual.updated = 7; in ipw2100_wx_wireless_stats()
8190 wstats->qual.updated |= IW_QUAL_NOISE_INVALID; in ipw2100_wx_wireless_stats()
8193 wstats->miss.beacon = missed_beacons; in ipw2100_wx_wireless_stats()
8198 wstats->discard.retries = tx_failures; in ipw2100_wx_wireless_stats()
8225 if (priv->status & STATUS_STOPPING) in ipw2100_wx_event_work()
8228 mutex_lock(&priv->action_mutex); in ipw2100_wx_event_work()
8232 mutex_unlock(&priv->action_mutex); in ipw2100_wx_event_work()
8237 if (!(priv->status & (STATUS_ASSOCIATING | STATUS_ASSOCIATED)) || in ipw2100_wx_event_work()
8238 priv->status & STATUS_RF_KILL_MASK || in ipw2100_wx_event_work()
8240 &priv->bssid, &len)) { in ipw2100_wx_event_work()
8245 memcpy(wrqu.ap_addr.sa_data, priv->bssid, ETH_ALEN); in ipw2100_wx_event_work()
8246 memcpy(priv->ieee->bssid, priv->bssid, ETH_ALEN); in ipw2100_wx_event_work()
8247 priv->status &= ~STATUS_ASSOCIATING; in ipw2100_wx_event_work()
8248 priv->status |= STATUS_ASSOCIATED; in ipw2100_wx_event_work()
8249 netif_carrier_on(priv->net_dev); in ipw2100_wx_event_work()
8250 netif_wake_queue(priv->net_dev); in ipw2100_wx_event_work()
8253 if (!(priv->status & STATUS_ASSOCIATED)) { in ipw2100_wx_event_work()
8255 mutex_lock(&priv->action_mutex); in ipw2100_wx_event_work()
8258 if (priv->config & CFG_STATIC_ESSID) in ipw2100_wx_event_work()
8259 ipw2100_set_essid(priv, priv->essid, priv->essid_len, in ipw2100_wx_event_work()
8263 mutex_unlock(&priv->action_mutex); in ipw2100_wx_event_work()
8266 wireless_send_event(priv->net_dev, SIOCGIWAP, &wrqu, NULL); in ipw2100_wx_event_work()
8278 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
8307 (struct ipw2100_fw_header *)fw->fw_entry->data; in ipw2100_mod_firmware_load()
8309 if (IPW2100_FW_MAJOR(h->version) != IPW2100_FW_MAJOR_VERSION) { in ipw2100_mod_firmware_load()
8313 h->version); in ipw2100_mod_firmware_load()
8317 fw->version = h->version; in ipw2100_mod_firmware_load()
8318 fw->fw.data = fw->fw_entry->data + sizeof(struct ipw2100_fw_header); in ipw2100_mod_firmware_load()
8319 fw->fw.size = h->fw_size; in ipw2100_mod_firmware_load()
8320 fw->uc.data = fw->fw.data + h->fw_size; in ipw2100_mod_firmware_load()
8321 fw->uc.size = h->uc_size; in ipw2100_mod_firmware_load()
8333 priv->net_dev->name); in ipw2100_get_firmware()
8335 switch (priv->ieee->iw_mode) { in ipw2100_get_firmware()
8337 fw_name = IPW2100_FW_NAME("-i"); in ipw2100_get_firmware()
8341 fw_name = IPW2100_FW_NAME("-p"); in ipw2100_get_firmware()
8350 rc = request_firmware(&fw->fw_entry, fw_name, &priv->pci_dev->dev); in ipw2100_get_firmware()
8355 priv->net_dev->name, fw_name); in ipw2100_get_firmware()
8358 IPW_DEBUG_INFO("firmware data %p size %zd\n", fw->fw_entry->data, in ipw2100_get_firmware()
8359 fw->fw_entry->size); in ipw2100_get_firmware()
8366 MODULE_FIRMWARE(IPW2100_FW_NAME("-i"));
8368 MODULE_FIRMWARE(IPW2100_FW_NAME("-p"));
8375 fw->version = 0; in ipw2100_release_firmware()
8376 release_firmware(fw->fw_entry); in ipw2100_release_firmware()
8377 fw->fw_entry = NULL; in ipw2100_release_firmware()
8389 return -EIO; in ipw2100_get_fwversion()
8392 len = max - 1; in ipw2100_get_fwversion()
8415 const unsigned char *firmware_data = fw->fw.data; in ipw2100_fw_download()
8416 unsigned int firmware_data_left = fw->fw.size; in ipw2100_fw_download()
8421 firmware_data_left -= 4; in ipw2100_fw_download()
8425 firmware_data_left -= 2; in ipw2100_fw_download()
8429 "Invalid firmware run-length of %d bytes\n", in ipw2100_fw_download()
8431 return -EINVAL; in ipw2100_fw_download()
8434 write_nic_memory(priv->net_dev, addr, len, firmware_data); in ipw2100_fw_download()
8436 firmware_data_left -= len; in ipw2100_fw_download()
8462 struct net_device *dev = priv->net_dev; in ipw2100_ucode_download()
8463 const unsigned char *microcode_data = fw->uc.data; in ipw2100_ucode_download()
8464 unsigned int microcode_data_left = fw->uc.size; in ipw2100_ucode_download()
8465 void __iomem *reg = priv->ioaddr; in ipw2100_ucode_download()
8496 microcode_data_left -= 2; in ipw2100_ucode_download()
8528 /* check Symbol is enabled - upped this from 5 as it wasn't always in ipw2100_ucode_download()
8541 dev->name); in ipw2100_ucode_download()
8542 return -EIO; in ipw2100_ucode_download()
8559 ": %s: No response from Symbol - hw not alive\n", in ipw2100_ucode_download()
8560 dev->name); in ipw2100_ucode_download()
8562 return -EIO; in ipw2100_ucode_download()