Lines Matching +full:power +full:- +full:off +full:- +full:time +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 <j@w1.fi>
34 Tx - Commands and Data
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.
97 msg_free_list : Holds pre-allocated Msg (Command) buffers
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
117 that only one external action is invoked at a time.
134 #include <linux/dma-mapping.h>
146 #include <linux/time.h>
157 #define IPW2100_VERSION "git-1.2.2"
162 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
195 MODULE_PARM_DESC(associate, "auto associate when scanning (default off)");
305 /* Pre-decl until we get the code solid and then we can clean it up */
334 *val = ioread32(priv->ioaddr + reg); in read_register()
342 iowrite32(val, priv->ioaddr + reg); in write_register()
351 *val = ioread16(priv->ioaddr + reg); in read_register_word()
359 *val = ioread8(priv->ioaddr + reg); in read_register_byte()
367 iowrite16(val, priv->ioaddr + reg); in write_register_word()
375 iowrite8(val, priv->ioaddr + reg); in write_register_byte()
442 dif_len = addr - aligned_addr; in write_nic_memory()
452 len -= dif_len; in write_nic_memory()
463 dif_len = len - aligned_len; in write_nic_memory()
480 dif_len = addr - aligned_addr; in read_nic_memory()
490 len -= dif_len; in read_nic_memory()
501 dif_len = len - aligned_len; in read_nic_memory()
519 struct ipw2100_ordinals *ordinals = &priv->ordinals; in ipw2100_get_ordinal()
526 if (ordinals->table1_addr == 0) { in ipw2100_get_ordinal()
529 return -EINVAL; in ipw2100_get_ordinal()
540 return -EINVAL; in ipw2100_get_ordinal()
543 read_nic_dword(priv->net_dev, in ipw2100_get_ordinal()
544 ordinals->table1_addr + (ord << 2), &addr); in ipw2100_get_ordinal()
545 read_nic_dword(priv->net_dev, addr, val); in ipw2100_get_ordinal()
554 ord -= IPW_START_ORD_TAB_2; in ipw2100_get_ordinal()
557 read_nic_dword(priv->net_dev, in ipw2100_get_ordinal()
558 ordinals->table2_addr + (ord << 3), &addr); in ipw2100_get_ordinal()
561 * two 16-bit words - first is length, second is count */ in ipw2100_get_ordinal()
562 read_nic_dword(priv->net_dev, in ipw2100_get_ordinal()
563 ordinals->table2_addr + (ord << 3) + sizeof(u32), in ipw2100_get_ordinal()
576 return -EINVAL; in ipw2100_get_ordinal()
584 read_nic_memory(priv->net_dev, addr, total_length, val); in ipw2100_get_ordinal()
592 return -EINVAL; in ipw2100_get_ordinal()
598 struct ipw2100_ordinals *ordinals = &priv->ordinals; in ipw2100_set_ordinal()
605 return -EINVAL; in ipw2100_set_ordinal()
608 read_nic_dword(priv->net_dev, in ipw2100_set_ordinal()
609 ordinals->table1_addr + (ord << 2), &addr); in ipw2100_set_ordinal()
611 write_nic_dword(priv->net_dev, addr, *val); in ipw2100_set_ordinal()
620 return -EINVAL; in ipw2100_set_ordinal()
622 return -EINVAL; in ipw2100_set_ordinal()
634 out += scnprintf(buf + out, count - out, " "); in snprint_line()
636 out += scnprintf(buf + out, count - out, "%02X ", in snprint_line()
639 out += scnprintf(buf + out, count - out, " "); in snprint_line()
642 out += scnprintf(buf + out, count - out, " "); in snprint_line()
644 out += scnprintf(buf + out, count - out, " "); in snprint_line()
650 out += scnprintf(buf + out, count - out, "%c", c); in snprint_line()
654 out += scnprintf(buf + out, count - out, " "); in snprint_line()
672 len -= min(len, 16U); in printk_buf()
685 if (priv->reset_backoff && in schedule_reset()
686 (now - priv->last_reset > priv->reset_backoff)) in schedule_reset()
687 priv->reset_backoff = 0; in schedule_reset()
689 priv->last_reset = now; in schedule_reset()
691 if (!(priv->status & STATUS_RESET_PENDING)) { in schedule_reset()
693 priv->net_dev->name, priv->reset_backoff); in schedule_reset()
694 netif_carrier_off(priv->net_dev); in schedule_reset()
695 netif_stop_queue(priv->net_dev); in schedule_reset()
696 priv->status |= STATUS_RESET_PENDING; in schedule_reset()
697 if (priv->reset_backoff) in schedule_reset()
698 schedule_delayed_work(&priv->reset_work, in schedule_reset()
699 priv->reset_backoff * HZ); in schedule_reset()
701 schedule_delayed_work(&priv->reset_work, 0); in schedule_reset()
703 if (priv->reset_backoff < MAX_RESET_BACKOFF) in schedule_reset()
704 priv->reset_backoff++; in schedule_reset()
706 wake_up_interruptible(&priv->wait_command_queue); in schedule_reset()
709 priv->net_dev->name); in schedule_reset()
723 command_types[cmd->host_command], cmd->host_command, in ipw2100_hw_send_command()
724 cmd->host_command_length); in ipw2100_hw_send_command()
725 printk_buf(IPW_DL_HC, (u8 *) cmd->host_command_parameters, in ipw2100_hw_send_command()
726 cmd->host_command_length); in ipw2100_hw_send_command()
728 spin_lock_irqsave(&priv->low_lock, flags); in ipw2100_hw_send_command()
730 if (priv->fatal_error) { in ipw2100_hw_send_command()
733 err = -EIO; in ipw2100_hw_send_command()
737 if (!(priv->status & STATUS_RUNNING)) { in ipw2100_hw_send_command()
740 err = -EIO; in ipw2100_hw_send_command()
744 if (priv->status & STATUS_CMD_ACTIVE) { in ipw2100_hw_send_command()
747 err = -EBUSY; in ipw2100_hw_send_command()
751 if (list_empty(&priv->msg_free_list)) { in ipw2100_hw_send_command()
756 priv->status |= STATUS_CMD_ACTIVE; in ipw2100_hw_send_command()
757 priv->messages_sent++; in ipw2100_hw_send_command()
759 element = priv->msg_free_list.next; in ipw2100_hw_send_command()
762 packet->jiffy_start = jiffies; in ipw2100_hw_send_command()
765 packet->info.c_struct.cmd->host_command_reg = cmd->host_command; in ipw2100_hw_send_command()
766 packet->info.c_struct.cmd->host_command_reg1 = cmd->host_command1; in ipw2100_hw_send_command()
767 packet->info.c_struct.cmd->host_command_len_reg = in ipw2100_hw_send_command()
768 cmd->host_command_length; in ipw2100_hw_send_command()
769 packet->info.c_struct.cmd->sequence = cmd->host_command_sequence; in ipw2100_hw_send_command()
771 memcpy(packet->info.c_struct.cmd->host_command_params_reg, in ipw2100_hw_send_command()
772 cmd->host_command_parameters, in ipw2100_hw_send_command()
773 sizeof(packet->info.c_struct.cmd->host_command_params_reg)); in ipw2100_hw_send_command()
776 DEC_STAT(&priv->msg_free_stat); in ipw2100_hw_send_command()
778 list_add_tail(element, &priv->msg_pend_list); in ipw2100_hw_send_command()
779 INC_STAT(&priv->msg_pend_stat); in ipw2100_hw_send_command()
784 spin_unlock_irqrestore(&priv->low_lock, flags); in ipw2100_hw_send_command()
793 wait_event_interruptible_timeout(priv->wait_command_queue, in ipw2100_hw_send_command()
794 !(priv-> in ipw2100_hw_send_command()
801 priv->fatal_error = IPW2100_ERR_MSG_TIMEOUT; in ipw2100_hw_send_command()
802 priv->status &= ~STATUS_CMD_ACTIVE; in ipw2100_hw_send_command()
804 return -EIO; in ipw2100_hw_send_command()
807 if (priv->fatal_error) { in ipw2100_hw_send_command()
809 priv->net_dev->name); in ipw2100_hw_send_command()
810 return -EIO; in ipw2100_hw_send_command()
823 spin_unlock_irqrestore(&priv->low_lock, flags); in ipw2100_hw_send_command()
840 /* Domain 0 check - all values should be DOA_DEBUG */ in ipw2100_verify()
843 read_register(priv->net_dev, address, &data1); in ipw2100_verify()
845 return -EIO; in ipw2100_verify()
848 /* Domain 1 check - use arbitrary read/write compare */ in ipw2100_verify()
851 write_register(priv->net_dev, IPW_REG_DOMAIN_1_OFFSET + 0x32, in ipw2100_verify()
853 write_register(priv->net_dev, IPW_REG_DOMAIN_1_OFFSET + 0x36, in ipw2100_verify()
855 read_register(priv->net_dev, IPW_REG_DOMAIN_1_OFFSET + 0x32, in ipw2100_verify()
857 read_register(priv->net_dev, IPW_REG_DOMAIN_1_OFFSET + 0x36, in ipw2100_verify()
863 return -EIO; in ipw2100_verify()
896 ((priv->status & STATUS_ENABLED) ? in ipw2100_wait_for_card_state()
899 priv->status |= STATUS_ENABLED; in ipw2100_wait_for_card_state()
901 priv->status &= ~STATUS_ENABLED; in ipw2100_wait_for_card_state()
911 return -EIO; in ipw2100_wait_for_card_state()
925 write_register(priv->net_dev, IPW_REG_RESET_REG, in sw_reset_and_clock()
933 read_register(priv->net_dev, IPW_REG_RESET_REG, &r); in sw_reset_and_clock()
939 return -EIO; // TODO: better error value in sw_reset_and_clock()
943 write_register(priv->net_dev, IPW_REG_GP_CNTRL, in sw_reset_and_clock()
951 read_register(priv->net_dev, IPW_REG_GP_CNTRL, &r); in sw_reset_and_clock()
957 return -EIO; /* TODO: better error value */ in sw_reset_and_clock()
960 read_register(priv->net_dev, IPW_REG_GP_CNTRL, &r); in sw_reset_and_clock()
961 write_register(priv->net_dev, IPW_REG_GP_CNTRL, in sw_reset_and_clock()
969 Purpose : Initiaze adapter after power on.
975 5. zero-out shared mem
988 if (priv->fatal_error) { in ipw2100_download_firmware()
991 priv->net_dev->name, priv->fatal_error); in ipw2100_download_firmware()
992 return -EINVAL; in ipw2100_download_firmware()
999 priv->net_dev->name, err); in ipw2100_download_firmware()
1000 priv->fatal_error = IPW2100_ERR_FW_LOAD; in ipw2100_download_firmware()
1008 priv->net_dev->name, err); in ipw2100_download_firmware()
1009 priv->fatal_error = IPW2100_ERR_FW_LOAD; in ipw2100_download_firmware()
1013 priv->firmware_version = ipw2100_firmware.version; in ipw2100_download_firmware()
1019 priv->net_dev->name, err); in ipw2100_download_firmware()
1026 priv->net_dev->name, err); in ipw2100_download_firmware()
1031 write_nic_dword(priv->net_dev, in ipw2100_download_firmware()
1035 write_register(priv->net_dev, IPW_REG_RESET_REG, 0); in ipw2100_download_firmware()
1041 priv->net_dev->name, err); in ipw2100_download_firmware()
1046 write_nic_dword(priv->net_dev, in ipw2100_download_firmware()
1054 priv->net_dev->name, err); in ipw2100_download_firmware()
1062 priv->net_dev->name, err); in ipw2100_download_firmware()
1070 * from the disk. --YZ in ipw2100_download_firmware()
1080 write_nic_dword(priv->net_dev, address, 0); in ipw2100_download_firmware()
1083 write_nic_dword(priv->net_dev, address, 0); in ipw2100_download_firmware()
1086 write_nic_dword(priv->net_dev, address, 0); in ipw2100_download_firmware()
1089 write_nic_dword(priv->net_dev, address, 0); in ipw2100_download_firmware()
1092 write_nic_dword(priv->net_dev, address, 0); in ipw2100_download_firmware()
1103 if (priv->status & STATUS_INT_ENABLED) in ipw2100_enable_interrupts()
1105 priv->status |= STATUS_INT_ENABLED; in ipw2100_enable_interrupts()
1106 write_register(priv->net_dev, IPW_REG_INTA_MASK, IPW_INTERRUPT_MASK); in ipw2100_enable_interrupts()
1111 if (!(priv->status & STATUS_INT_ENABLED)) in ipw2100_disable_interrupts()
1113 priv->status &= ~STATUS_INT_ENABLED; in ipw2100_disable_interrupts()
1114 write_register(priv->net_dev, IPW_REG_INTA_MASK, 0x0); in ipw2100_disable_interrupts()
1119 struct ipw2100_ordinals *ord = &priv->ordinals; in ipw2100_initialize_ordinals()
1123 read_register(priv->net_dev, IPW_MEM_HOST_SHARED_ORDINALS_TABLE_1, in ipw2100_initialize_ordinals()
1124 &ord->table1_addr); in ipw2100_initialize_ordinals()
1126 read_register(priv->net_dev, IPW_MEM_HOST_SHARED_ORDINALS_TABLE_2, in ipw2100_initialize_ordinals()
1127 &ord->table2_addr); in ipw2100_initialize_ordinals()
1129 read_nic_dword(priv->net_dev, ord->table1_addr, &ord->table1_size); in ipw2100_initialize_ordinals()
1130 read_nic_dword(priv->net_dev, ord->table2_addr, &ord->table2_size); in ipw2100_initialize_ordinals()
1132 ord->table2_size &= 0x0000FFFF; in ipw2100_initialize_ordinals()
1134 IPW_DEBUG_INFO("table 1 size: %d\n", ord->table1_size); in ipw2100_initialize_ordinals()
1135 IPW_DEBUG_INFO("table 2 size: %d\n", ord->table2_size); in ipw2100_initialize_ordinals()
1148 write_register(priv->net_dev, IPW_REG_GPIO, reg); in ipw2100_hw_set_gpio()
1160 if (!(priv->hw_features & HW_FEATURE_RFKILL)) { in rf_kill_active()
1161 wiphy_rfkill_set_hw_state(priv->ieee->wdev.wiphy, false); in rf_kill_active()
1162 priv->status &= ~STATUS_RF_KILL_HW; in rf_kill_active()
1168 read_register(priv->net_dev, IPW_REG_GPIO, &reg); in rf_kill_active()
1173 wiphy_rfkill_set_hw_state(priv->ieee->wdev.wiphy, true); in rf_kill_active()
1174 priv->status |= STATUS_RF_KILL_HW; in rf_kill_active()
1176 wiphy_rfkill_set_hw_state(priv->ieee->wdev.wiphy, false); in rf_kill_active()
1177 priv->status &= ~STATUS_RF_KILL_HW; in rf_kill_active()
1196 return -EIO; in ipw2100_get_hw_features()
1204 read_nic_dword(priv->net_dev, addr + 0xFC, &val); in ipw2100_get_hw_features()
1205 priv->eeprom_version = (val >> 24) & 0xFF; in ipw2100_get_hw_features()
1206 IPW_DEBUG_INFO("EEPROM version: %d\n", priv->eeprom_version); in ipw2100_get_hw_features()
1215 read_nic_dword(priv->net_dev, addr + 0x20, &val); in ipw2100_get_hw_features()
1217 priv->hw_features |= HW_FEATURE_RFKILL; in ipw2100_get_hw_features()
1220 (priv->hw_features & HW_FEATURE_RFKILL) ? "" : "not "); in ipw2100_get_hw_features()
1226 * Start firmware execution after power on and initialization
1238 if (priv->status & STATUS_RUNNING) in ipw2100_start_adapter()
1242 * Initialize the hw - drive adapter to DO state by setting in ipw2100_start_adapter()
1248 ": %s: Failed to power on the adapter.\n", in ipw2100_start_adapter()
1249 priv->net_dev->name); in ipw2100_start_adapter()
1250 return -EIO; in ipw2100_start_adapter()
1259 /* TODO -- Look at disabling interrupts here to make sure none in ipw2100_start_adapter()
1262 /* Release ARC - clear reset bit */ in ipw2100_start_adapter()
1263 write_register(priv->net_dev, IPW_REG_RESET_REG, 0); in ipw2100_start_adapter()
1272 read_register(priv->net_dev, IPW_REG_INTA, &inta); in ipw2100_start_adapter()
1277 write_register(priv->net_dev, IPW_REG_INTA, in ipw2100_start_adapter()
1288 write_register(priv->net_dev, IPW_REG_INTA, in ipw2100_start_adapter()
1292 } while (--i); in ipw2100_start_adapter()
1296 read_register(priv->net_dev, IPW_REG_INTA, &inta); in ipw2100_start_adapter()
1297 read_register(priv->net_dev, IPW_REG_INTA_MASK, &inta_mask); in ipw2100_start_adapter()
1301 write_register(priv->net_dev, IPW_REG_INTA, inta); in ipw2100_start_adapter()
1309 priv->net_dev->name); in ipw2100_start_adapter()
1310 return -EIO; in ipw2100_start_adapter()
1314 read_register(priv->net_dev, IPW_REG_GPIO, &gpio); in ipw2100_start_adapter()
1318 write_register(priv->net_dev, IPW_REG_GPIO, gpio); in ipw2100_start_adapter()
1321 priv->status |= STATUS_RUNNING; in ipw2100_start_adapter()
1324 priv->status &= ~(STATUS_ASSOCIATING | STATUS_ASSOCIATED); in ipw2100_start_adapter()
1333 if (!priv->fatal_error) in ipw2100_reset_fatalerror()
1336 priv->fatal_errors[priv->fatal_index++] = priv->fatal_error; in ipw2100_reset_fatalerror()
1337 priv->fatal_index %= IPW2100_ERROR_QUEUE; in ipw2100_reset_fatalerror()
1338 priv->fatal_error = 0; in ipw2100_reset_fatalerror()
1347 IPW_DEBUG_INFO("Power cycling the hardware.\n"); in ipw2100_power_cycle_adapter()
1352 write_register(priv->net_dev, IPW_REG_RESET_REG, in ipw2100_power_cycle_adapter()
1360 read_register(priv->net_dev, IPW_REG_RESET_REG, &reg); in ipw2100_power_cycle_adapter()
1364 } while (--i); in ipw2100_power_cycle_adapter()
1366 priv->status &= ~STATUS_RESET_PENDING; in ipw2100_power_cycle_adapter()
1370 ("exit - waited too long for master assert stop\n"); in ipw2100_power_cycle_adapter()
1371 return -EIO; in ipw2100_power_cycle_adapter()
1374 write_register(priv->net_dev, IPW_REG_RESET_REG, in ipw2100_power_cycle_adapter()
1381 priv->status &= ~(STATUS_RUNNING | STATUS_ASSOCIATING | in ipw2100_power_cycle_adapter()
1410 /* Turn off the radio */ in ipw2100_hw_phy_off()
1416 read_nic_dword(priv->net_dev, IPW2100_CONTROL_REG, &val1); in ipw2100_hw_phy_off()
1417 read_nic_dword(priv->net_dev, IPW2100_COMMAND, &val2); in ipw2100_hw_phy_off()
1426 return -EIO; in ipw2100_hw_phy_off()
1440 if (priv->status & STATUS_ENABLED) in ipw2100_enable_adapter()
1443 mutex_lock(&priv->adapter_mutex); in ipw2100_enable_adapter()
1459 priv->net_dev->name); in ipw2100_enable_adapter()
1463 if (priv->stop_hang_check) { in ipw2100_enable_adapter()
1464 priv->stop_hang_check = 0; in ipw2100_enable_adapter()
1465 schedule_delayed_work(&priv->hang_check, HZ / 2); in ipw2100_enable_adapter()
1469 mutex_unlock(&priv->adapter_mutex); in ipw2100_enable_adapter()
1485 if (!(priv->status & STATUS_RUNNING)) in ipw2100_hw_stop_adapter()
1488 priv->status |= STATUS_STOPPING; in ipw2100_hw_stop_adapter()
1493 if (!priv->fatal_error) { in ipw2100_hw_stop_adapter()
1504 * If in D0-standby mode going directly to D3 may cause a in ipw2100_hw_stop_adapter()
1510 * out of D0-standby if it is already in that state. in ipw2100_hw_stop_adapter()
1516 * Prepare for power down command to fw. This command would in ipw2100_hw_stop_adapter()
1517 * take HW out of D0-standby and prepare it for D3 state. in ipw2100_hw_stop_adapter()
1528 "%s: Power down command failed: Error %d\n", in ipw2100_hw_stop_adapter()
1529 priv->net_dev->name, err); in ipw2100_hw_stop_adapter()
1534 priv->status &= ~STATUS_ENABLED; in ipw2100_hw_stop_adapter()
1543 * Power down adapter. Sequence: in ipw2100_hw_stop_adapter()
1550 write_register(priv->net_dev, IPW_REG_RESET_REG, in ipw2100_hw_stop_adapter()
1555 for (i = 5; i > 0; i--) { in ipw2100_hw_stop_adapter()
1559 read_register(priv->net_dev, IPW_REG_RESET_REG, &reg); in ipw2100_hw_stop_adapter()
1567 ": %s: Could now power down adapter.\n", in ipw2100_hw_stop_adapter()
1568 priv->net_dev->name); in ipw2100_hw_stop_adapter()
1571 write_register(priv->net_dev, IPW_REG_RESET_REG, in ipw2100_hw_stop_adapter()
1574 priv->status &= ~(STATUS_RUNNING | STATUS_STOPPING); in ipw2100_hw_stop_adapter()
1590 if (!(priv->status & STATUS_ENABLED)) in ipw2100_disable_adapter()
1594 priv->status &= ~(STATUS_ASSOCIATED | STATUS_ASSOCIATING); in ipw2100_disable_adapter()
1596 if (!priv->stop_hang_check) { in ipw2100_disable_adapter()
1597 priv->stop_hang_check = 1; in ipw2100_disable_adapter()
1598 cancel_delayed_work(&priv->hang_check); in ipw2100_disable_adapter()
1601 mutex_lock(&priv->adapter_mutex); in ipw2100_disable_adapter()
1606 ": exit - failed to send CARD_DISABLE command\n"); in ipw2100_disable_adapter()
1613 ": exit - card failed to change to DISABLED\n"); in ipw2100_disable_adapter()
1620 mutex_unlock(&priv->adapter_mutex); in ipw2100_disable_adapter()
1639 if (!(priv->config & CFG_ASSOCIATE)) in ipw2100_set_scan_options()
1641 if ((priv->ieee->sec.flags & SEC_ENABLED) && priv->ieee->sec.enabled) in ipw2100_set_scan_options()
1643 if (priv->config & CFG_PASSIVE_SCAN) in ipw2100_set_scan_options()
1646 cmd.host_command_parameters[1] = priv->channel_mask; in ipw2100_set_scan_options()
1670 if (priv->ieee->iw_mode == IW_MODE_MONITOR) in ipw2100_start_scan()
1673 if (priv->status & STATUS_SCANNING) { in ipw2100_start_scan()
1687 priv->status |= STATUS_SCANNING; in ipw2100_start_scan()
1690 priv->status &= ~STATUS_SCANNING; in ipw2100_start_scan()
1699 "---",
1717 if (priv->suspend_time) { in ipw2100_up()
1718 libipw_networks_age(priv->ieee, priv->suspend_time); in ipw2100_up()
1719 priv->suspend_time = 0; in ipw2100_up()
1723 if (priv->status & STATUS_RF_KILL_SW) { in ipw2100_up()
1725 "switch\n", priv->net_dev->name); in ipw2100_up()
1729 /* the ipw2100 hardware really doesn't want power management delays in ipw2100_up()
1734 /* If the interrupt is enabled, turn it off... */ in ipw2100_up()
1735 spin_lock_irqsave(&priv->low_lock, flags); in ipw2100_up()
1740 spin_unlock_irqrestore(&priv->low_lock, flags); in ipw2100_up()
1742 if (priv->status & STATUS_POWERED || in ipw2100_up()
1743 (priv->status & STATUS_RESET_PENDING)) { in ipw2100_up()
1744 /* Power cycle the card ... */ in ipw2100_up()
1749 priv->net_dev->name); in ipw2100_up()
1753 priv->status |= STATUS_POWERED; in ipw2100_up()
1760 priv->net_dev->name); in ipw2100_up()
1771 priv->net_dev->name); in ipw2100_up()
1776 libipw_set_geo(priv->ieee, &ipw_geos[0]); in ipw2100_up()
1777 priv->ieee->freq_band = LIBIPW_24GHZ_BAND; in ipw2100_up()
1784 priv->net_dev->name); in ipw2100_up()
1788 priv->status &= ~STATUS_SCANNING; in ipw2100_up()
1792 priv->net_dev->name); in ipw2100_up()
1794 if (priv->stop_rf_kill) { in ipw2100_up()
1795 priv->stop_rf_kill = 0; in ipw2100_up()
1796 schedule_delayed_work(&priv->rf_kill, in ipw2100_up()
1811 priv->net_dev->name); in ipw2100_up()
1816 /* Enable the adapter - sends HOST_COMPLETE */ in ipw2100_up()
1821 priv->net_dev->name); in ipw2100_up()
1842 int associated = priv->status & STATUS_ASSOCIATED; in ipw2100_down()
1845 if (!priv->stop_rf_kill) { in ipw2100_down()
1846 priv->stop_rf_kill = 1; in ipw2100_down()
1847 cancel_delayed_work(&priv->rf_kill); in ipw2100_down()
1851 if (!priv->stop_hang_check) { in ipw2100_down()
1852 priv->stop_hang_check = 1; in ipw2100_down()
1853 cancel_delayed_work(&priv->hang_check); in ipw2100_down()
1857 if (priv->status & STATUS_RESET_PENDING) in ipw2100_down()
1858 cancel_delayed_work(&priv->reset_work); in ipw2100_down()
1862 spin_lock_irqsave(&priv->low_lock, flags); in ipw2100_down()
1864 spin_unlock_irqrestore(&priv->low_lock, flags); in ipw2100_down()
1868 priv->net_dev->name); in ipw2100_down()
1873 spin_lock_irqsave(&priv->low_lock, flags); in ipw2100_down()
1875 spin_unlock_irqrestore(&priv->low_lock, flags); in ipw2100_down()
1882 wireless_send_event(priv->net_dev, SIOCGIWAP, &wrqu, NULL); in ipw2100_down()
1884 priv->status &= ~(STATUS_ASSOCIATED | STATUS_ASSOCIATING); in ipw2100_down()
1885 netif_carrier_off(priv->net_dev); in ipw2100_down()
1886 netif_stop_queue(priv->net_dev); in ipw2100_down()
1892 const struct libipw_geo *geo = libipw_get_geo(priv->ieee); in ipw2100_wdev_init()
1893 struct wireless_dev *wdev = &priv->ieee->wdev; in ipw2100_wdev_init()
1896 memcpy(wdev->wiphy->perm_addr, priv->mac_addr, ETH_ALEN); in ipw2100_wdev_init()
1898 /* fill-out priv->ieee->bg_band */ in ipw2100_wdev_init()
1899 if (geo->bg_channels) { in ipw2100_wdev_init()
1900 struct ieee80211_supported_band *bg_band = &priv->ieee->bg_band; in ipw2100_wdev_init()
1902 bg_band->band = NL80211_BAND_2GHZ; in ipw2100_wdev_init()
1903 bg_band->n_channels = geo->bg_channels; in ipw2100_wdev_init()
1904 bg_band->channels = kcalloc(geo->bg_channels, in ipw2100_wdev_init()
1907 if (!bg_band->channels) { in ipw2100_wdev_init()
1909 return -ENOMEM; in ipw2100_wdev_init()
1911 /* translate geo->bg to bg_band.channels */ in ipw2100_wdev_init()
1912 for (i = 0; i < geo->bg_channels; i++) { in ipw2100_wdev_init()
1913 bg_band->channels[i].band = NL80211_BAND_2GHZ; in ipw2100_wdev_init()
1914 bg_band->channels[i].center_freq = geo->bg[i].freq; in ipw2100_wdev_init()
1915 bg_band->channels[i].hw_value = geo->bg[i].channel; in ipw2100_wdev_init()
1916 bg_band->channels[i].max_power = geo->bg[i].max_power; in ipw2100_wdev_init()
1917 if (geo->bg[i].flags & LIBIPW_CH_PASSIVE_ONLY) in ipw2100_wdev_init()
1918 bg_band->channels[i].flags |= in ipw2100_wdev_init()
1920 if (geo->bg[i].flags & LIBIPW_CH_NO_IBSS) in ipw2100_wdev_init()
1921 bg_band->channels[i].flags |= in ipw2100_wdev_init()
1923 if (geo->bg[i].flags & LIBIPW_CH_RADAR_DETECT) in ipw2100_wdev_init()
1924 bg_band->channels[i].flags |= in ipw2100_wdev_init()
1931 bg_band->bitrates = ipw2100_bg_rates; in ipw2100_wdev_init()
1932 bg_band->n_bitrates = RATE_COUNT; in ipw2100_wdev_init()
1934 wdev->wiphy->bands[NL80211_BAND_2GHZ] = bg_band; in ipw2100_wdev_init()
1937 wdev->wiphy->cipher_suites = ipw_cipher_suites; in ipw2100_wdev_init()
1938 wdev->wiphy->n_cipher_suites = ARRAY_SIZE(ipw_cipher_suites); in ipw2100_wdev_init()
1940 set_wiphy_dev(wdev->wiphy, &priv->pci_dev->dev); in ipw2100_wdev_init()
1941 if (wiphy_register(wdev->wiphy)) in ipw2100_wdev_init()
1942 return -EIO; in ipw2100_wdev_init()
1955 int associated = priv->status & STATUS_ASSOCIATED; in ipw2100_reset_adapter()
1957 spin_lock_irqsave(&priv->low_lock, flags); in ipw2100_reset_adapter()
1958 IPW_DEBUG_INFO(": %s: Restarting adapter.\n", priv->net_dev->name); in ipw2100_reset_adapter()
1959 priv->resets++; in ipw2100_reset_adapter()
1960 priv->status &= ~(STATUS_ASSOCIATED | STATUS_ASSOCIATING); in ipw2100_reset_adapter()
1961 priv->status |= STATUS_SECURITY_UPDATED; in ipw2100_reset_adapter()
1963 /* Force a power cycle even if interface hasn't been opened in ipw2100_reset_adapter()
1965 cancel_delayed_work(&priv->reset_work); in ipw2100_reset_adapter()
1966 priv->status |= STATUS_RESET_PENDING; in ipw2100_reset_adapter()
1967 spin_unlock_irqrestore(&priv->low_lock, flags); in ipw2100_reset_adapter()
1969 mutex_lock(&priv->action_mutex); in ipw2100_reset_adapter()
1971 priv->stop_hang_check = 1; in ipw2100_reset_adapter()
1972 cancel_delayed_work(&priv->hang_check); in ipw2100_reset_adapter()
1976 wireless_send_event(priv->net_dev, SIOCGIWAP, &wrqu, NULL); in ipw2100_reset_adapter()
1979 mutex_unlock(&priv->action_mutex); in ipw2100_reset_adapter()
2034 memcpy(priv->ieee->bssid, bssid, ETH_ALEN); in isr_indicate_associated()
2056 priv->net_dev->name, essid_len, essid, in isr_indicate_associated()
2060 if (!(priv->config & CFG_STATIC_ESSID)) { in isr_indicate_associated()
2061 priv->essid_len = min((u8) essid_len, (u8) IW_ESSID_MAX_SIZE); in isr_indicate_associated()
2062 memcpy(priv->essid, essid, priv->essid_len); in isr_indicate_associated()
2064 priv->channel = chan; in isr_indicate_associated()
2065 memcpy(priv->bssid, bssid, ETH_ALEN); in isr_indicate_associated()
2067 priv->status |= STATUS_ASSOCIATING; in isr_indicate_associated()
2068 priv->connect_start = ktime_get_boottime_seconds(); in isr_indicate_associated()
2070 schedule_delayed_work(&priv->wx_event_work, HZ / 10); in isr_indicate_associated()
2096 * disable auto association -- so we cheat by setting a bogus SSID */ in ipw2100_set_essid()
2097 if (!ssid_len && !(priv->config & CFG_ASSOCIATE)) { in ipw2100_set_essid()
2110 memset(priv->essid + ssid_len, 0, IW_ESSID_MAX_SIZE - ssid_len); in ipw2100_set_essid()
2111 memcpy(priv->essid, essid, ssid_len); in ipw2100_set_essid()
2112 priv->essid_len = ssid_len; in ipw2100_set_essid()
2117 err = -EIO; in ipw2100_set_essid()
2126 "disassociated: '%*pE' %pM\n", priv->essid_len, priv->essid, in isr_indicate_association_lost()
2127 priv->bssid); in isr_indicate_association_lost()
2129 priv->status &= ~(STATUS_ASSOCIATED | STATUS_ASSOCIATING); in isr_indicate_association_lost()
2131 if (priv->status & STATUS_STOPPING) { in isr_indicate_association_lost()
2136 eth_zero_addr(priv->bssid); in isr_indicate_association_lost()
2137 eth_zero_addr(priv->ieee->bssid); in isr_indicate_association_lost()
2139 netif_carrier_off(priv->net_dev); in isr_indicate_association_lost()
2140 netif_stop_queue(priv->net_dev); in isr_indicate_association_lost()
2142 if (!(priv->status & STATUS_RUNNING)) in isr_indicate_association_lost()
2145 if (priv->status & STATUS_SECURITY_UPDATED) in isr_indicate_association_lost()
2146 schedule_delayed_work(&priv->security_work, 0); in isr_indicate_association_lost()
2148 schedule_delayed_work(&priv->wx_event_work, 0); in isr_indicate_association_lost()
2153 IPW_DEBUG_INFO("%s: RF Kill state changed to radio OFF.\n", in isr_indicate_rf_kill()
2154 priv->net_dev->name); in isr_indicate_rf_kill()
2157 wiphy_rfkill_set_hw_state(priv->ieee->wdev.wiphy, true); in isr_indicate_rf_kill()
2158 priv->status |= STATUS_RF_KILL_HW; in isr_indicate_rf_kill()
2161 priv->stop_rf_kill = 0; in isr_indicate_rf_kill()
2162 mod_delayed_work(system_wq, &priv->rf_kill, round_jiffies_relative(HZ)); in isr_indicate_rf_kill()
2173 wireless_send_event(priv->net_dev, SIOCGIWSCAN, &wrqu, NULL); in ipw2100_scan_event()
2180 priv->ieee->scans++; in isr_scan_complete()
2181 priv->status &= ~STATUS_SCANNING; in isr_scan_complete()
2183 /* Only userspace-requested scan completion events go out immediately */ in isr_scan_complete()
2184 if (!priv->user_requested_scan) { in isr_scan_complete()
2185 schedule_delayed_work(&priv->scan_event, in isr_scan_complete()
2188 priv->user_requested_scan = 0; in isr_scan_complete()
2189 mod_delayed_work(system_wq, &priv->scan_event, 0); in isr_scan_complete()
2211 priv->status |= STATUS_SCANNING; in isr_indicate_scanning()
2227 IPW2100_HANDLER(-1, NULL)
2235 priv->status & STATUS_ASSOCIATED && in isr_status_change()
2236 !(priv->status & STATUS_SCANNING)) { in isr_status_change()
2244 for (i = 0; status_handlers[i].status != -1; i++) { in isr_status_change()
2250 priv->wstats.status = status; in isr_status_change()
2262 if (cmd->host_command_reg < ARRAY_SIZE(command_types)) { in isr_rx_complete_command()
2264 command_types[cmd->host_command_reg], in isr_rx_complete_command()
2265 cmd->host_command_reg); in isr_rx_complete_command()
2268 if (cmd->host_command_reg == HOST_COMPLETE) in isr_rx_complete_command()
2269 priv->status |= STATUS_ENABLED; in isr_rx_complete_command()
2271 if (cmd->host_command_reg == CARD_DISABLE) in isr_rx_complete_command()
2272 priv->status &= ~STATUS_ENABLED; in isr_rx_complete_command()
2274 priv->status &= ~STATUS_CMD_ACTIVE; in isr_rx_complete_command()
2276 wake_up_interruptible(&priv->wait_command_queue); in isr_rx_complete_command()
2292 packet->skb = dev_alloc_skb(sizeof(struct ipw2100_rx)); in ipw2100_alloc_skb()
2293 if (!packet->skb) in ipw2100_alloc_skb()
2294 return -ENOMEM; in ipw2100_alloc_skb()
2296 packet->rxp = (struct ipw2100_rx *)packet->skb->data; in ipw2100_alloc_skb()
2297 packet->dma_addr = dma_map_single(&priv->pci_dev->dev, in ipw2100_alloc_skb()
2298 packet->skb->data, in ipw2100_alloc_skb()
2301 if (dma_mapping_error(&priv->pci_dev->dev, packet->dma_addr)) { in ipw2100_alloc_skb()
2302 dev_kfree_skb(packet->skb); in ipw2100_alloc_skb()
2303 return -ENOMEM; in ipw2100_alloc_skb()
2315 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
2319 if (!priv->snapshot[0]) in ipw2100_snapshot_free()
2322 kfree(priv->snapshot[i]); in ipw2100_snapshot_free()
2323 priv->snapshot[0] = NULL; in ipw2100_snapshot_free()
2330 if (priv->snapshot[0]) in ipw2100_snapshot_alloc()
2333 priv->snapshot[i] = kmalloc(0x1000, GFP_ATOMIC); in ipw2100_snapshot_alloc()
2334 if (!priv->snapshot[i]) { in ipw2100_snapshot_alloc()
2336 "buffer %d\n", priv->net_dev->name, i); in ipw2100_snapshot_alloc()
2338 kfree(priv->snapshot[--i]); in ipw2100_snapshot_alloc()
2339 priv->snapshot[0] = NULL; in ipw2100_snapshot_alloc()
2362 read_nic_dword(priv->net_dev, i, &tmp); in ipw2100_match_buf()
2376 if ((s - in_buf) == len) in ipw2100_match_buf()
2377 ret = (i + j) - len + 1; in ipw2100_match_buf()
2408 struct ipw2100_status *status = &priv->status_queue.drv[i]; in ipw2100_corruption_detected()
2418 write_register(priv->net_dev, IPW_REG_RESET_REG, in ipw2100_corruption_detected()
2423 read_register(priv->net_dev, IPW_REG_RESET_REG, &reg); in ipw2100_corruption_detected()
2427 } while (j--); in ipw2100_corruption_detected()
2435 priv->net_dev->name, match, in ipw2100_corruption_detected()
2439 "Firmware.\n", priv->net_dev->name); in ipw2100_corruption_detected()
2441 printk_buf((u8 *) priv->status_queue.drv, in ipw2100_corruption_detected()
2445 priv->fatal_error = IPW2100_ERR_C3_CORRUPTION; in ipw2100_corruption_detected()
2446 priv->net_dev->stats.rx_errors++; in ipw2100_corruption_detected()
2453 struct net_device *dev = priv->net_dev; in isr_rx()
2454 struct ipw2100_status *status = &priv->status_queue.drv[i]; in isr_rx()
2455 struct ipw2100_rx_packet *packet = &priv->rx_buffers[i]; in isr_rx()
2459 if (unlikely(status->frame_size > skb_tailroom(packet->skb))) { in isr_rx()
2462 dev->name, in isr_rx()
2463 status->frame_size, skb_tailroom(packet->skb)); in isr_rx()
2464 dev->stats.rx_errors++; in isr_rx()
2469 dev->stats.rx_errors++; in isr_rx()
2470 priv->wstats.discard.misc++; in isr_rx()
2475 if (unlikely(priv->ieee->iw_mode != IW_MODE_MONITOR && in isr_rx()
2476 !(priv->status & STATUS_ASSOCIATED))) { in isr_rx()
2478 priv->wstats.discard.misc++; in isr_rx()
2482 dma_unmap_single(&priv->pci_dev->dev, packet->dma_addr, in isr_rx()
2485 skb_put(packet->skb, status->frame_size); in isr_rx()
2490 skb_copy_from_linear_data(packet->skb, packet_data, in isr_rx()
2491 min_t(u32, status->frame_size, in isr_rx()
2495 if (!libipw_rx(priv->ieee, packet->skb, stats)) { in isr_rx()
2498 dev->name); in isr_rx()
2499 printk_buf(IPW_DL_DROP, packet_data, status->frame_size); in isr_rx()
2501 dev->stats.rx_errors++; in isr_rx()
2504 dev_kfree_skb_any(packet->skb); in isr_rx()
2505 packet->skb = NULL; in isr_rx()
2511 "%s: Unable to allocate SKB onto RBD ring - disabling " in isr_rx()
2512 "adapter.\n", dev->name); in isr_rx()
2518 priv->rx_queue.drv[i].host_addr = packet->dma_addr; in isr_rx()
2526 struct net_device *dev = priv->net_dev; in isr_rx_monitor()
2527 struct ipw2100_status *status = &priv->status_queue.drv[i]; in isr_rx_monitor()
2528 struct ipw2100_rx_packet *packet = &priv->rx_buffers[i]; in isr_rx_monitor()
2530 /* Magic struct that slots into the radiotap header -- no reason in isr_rx_monitor()
2540 if (unlikely(status->frame_size > skb_tailroom(packet->skb) - in isr_rx_monitor()
2544 dev->name, in isr_rx_monitor()
2545 status->frame_size, in isr_rx_monitor()
2546 skb_tailroom(packet->skb)); in isr_rx_monitor()
2547 dev->stats.rx_errors++; in isr_rx_monitor()
2552 dev->stats.rx_errors++; in isr_rx_monitor()
2553 priv->wstats.discard.misc++; in isr_rx_monitor()
2558 if (unlikely(priv->config & CFG_CRC_CHECK && in isr_rx_monitor()
2559 status->flags & IPW_STATUS_FLAG_CRC_ERROR)) { in isr_rx_monitor()
2561 dev->stats.rx_errors++; in isr_rx_monitor()
2565 dma_unmap_single(&priv->pci_dev->dev, packet->dma_addr, in isr_rx_monitor()
2567 memmove(packet->skb->data + sizeof(struct ipw_rt_hdr), in isr_rx_monitor()
2568 packet->skb->data, status->frame_size); in isr_rx_monitor()
2570 ipw_rt = (struct ipw_rt_hdr *) packet->skb->data; in isr_rx_monitor()
2572 ipw_rt->rt_hdr.it_version = PKTHDR_RADIOTAP_VERSION; in isr_rx_monitor()
2573 ipw_rt->rt_hdr.it_pad = 0; /* always good to zero */ in isr_rx_monitor()
2574 ipw_rt->rt_hdr.it_len = cpu_to_le16(sizeof(struct ipw_rt_hdr)); /* total hdr+data */ in isr_rx_monitor()
2576 ipw_rt->rt_hdr.it_present = cpu_to_le32(1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL); in isr_rx_monitor()
2578 ipw_rt->rt_dbmsignal = status->rssi + IPW2100_RSSI_TO_DBM; in isr_rx_monitor()
2580 skb_put(packet->skb, status->frame_size + sizeof(struct ipw_rt_hdr)); in isr_rx_monitor()
2582 if (!libipw_rx(priv->ieee, packet->skb, stats)) { in isr_rx_monitor()
2583 dev->stats.rx_errors++; in isr_rx_monitor()
2586 dev_kfree_skb_any(packet->skb); in isr_rx_monitor()
2587 packet->skb = NULL; in isr_rx_monitor()
2593 "%s: Unable to allocate SKB onto RBD ring - disabling " in isr_rx_monitor()
2594 "adapter.\n", dev->name); in isr_rx_monitor()
2600 priv->rx_queue.drv[i].host_addr = packet->dma_addr; in isr_rx_monitor()
2607 struct ipw2100_status *status = &priv->status_queue.drv[i]; in ipw2100_corruption_check()
2608 struct ipw2100_rx *u = priv->rx_buffers[i].rxp; in ipw2100_corruption_check()
2609 u16 frame_type = status->status_fields & STATUS_TYPE_MASK; in ipw2100_corruption_check()
2613 return (status->frame_size != sizeof(u->rx_data.command)); in ipw2100_corruption_check()
2615 return (status->frame_size != sizeof(u->rx_data.status)); in ipw2100_corruption_check()
2617 return (status->frame_size < sizeof(u->rx_data.notification)); in ipw2100_corruption_check()
2623 switch (WLAN_FC_GET_TYPE(le16_to_cpu(u->rx_data.header.frame_ctl))) { in ipw2100_corruption_check()
2628 return (status->frame_size > in ipw2100_corruption_check()
2644 * Read index - firmware places packet in entry identified by the
2647 * be filled--but not yet valid.
2649 * Write index - driver fills this entry with an unused RBD entry.
2658 * The WRITE index is cached in the variable 'priv->rx_queue.next'.
2663 struct ipw2100_bd_queue *rxq = &priv->rx_queue; in __ipw2100_rx_process()
2664 struct ipw2100_status_queue *sq = &priv->status_queue; in __ipw2100_rx_process()
2673 read_register(priv->net_dev, IPW_MEM_HOST_SHARED_RX_READ_INDEX, &r); in __ipw2100_rx_process()
2674 read_register(priv->net_dev, IPW_MEM_HOST_SHARED_RX_WRITE_INDEX, &w); in __ipw2100_rx_process()
2676 if (r >= rxq->entries) { in __ipw2100_rx_process()
2677 IPW_DEBUG_RX("exit - bad read index\n"); in __ipw2100_rx_process()
2681 i = (rxq->next + 1) % rxq->entries; in __ipw2100_rx_process()
2685 r, rxq->next, i); */ in __ipw2100_rx_process()
2687 packet = &priv->rx_buffers[i]; in __ipw2100_rx_process()
2691 dma_sync_single_for_cpu(&priv->pci_dev->dev, packet->dma_addr, in __ipw2100_rx_process()
2700 u = packet->rxp; in __ipw2100_rx_process()
2701 frame_type = sq->drv[i].status_fields & STATUS_TYPE_MASK; in __ipw2100_rx_process()
2702 stats.rssi = sq->drv[i].rssi + IPW2100_RSSI_TO_DBM; in __ipw2100_rx_process()
2703 stats.len = sq->drv[i].frame_size; in __ipw2100_rx_process()
2711 priv->net_dev->name, frame_types[frame_type], in __ipw2100_rx_process()
2717 isr_rx_complete_command(priv, &u->rx_data.command); in __ipw2100_rx_process()
2721 isr_status_change(priv, u->rx_data.status); in __ipw2100_rx_process()
2727 if (priv->ieee->iw_mode == IW_MODE_MONITOR) { in __ipw2100_rx_process()
2734 switch (WLAN_FC_GET_TYPE(le16_to_cpu(u->rx_data.header.frame_ctl))) { in __ipw2100_rx_process()
2736 libipw_rx_mgt(priv->ieee, in __ipw2100_rx_process()
2737 &u->rx_data.header, &stats); in __ipw2100_rx_process()
2753 rxq->drv[i].status.info.field = 0; in __ipw2100_rx_process()
2755 i = (i + 1) % rxq->entries; in __ipw2100_rx_process()
2760 rxq->next = (i ? i : rxq->entries) - 1; in __ipw2100_rx_process()
2762 write_register(priv->net_dev, in __ipw2100_rx_process()
2763 IPW_MEM_HOST_SHARED_RX_WRITE_INDEX, rxq->next); in __ipw2100_rx_process()
2781 * Read index - points to the next TBD that the firmware will
2785 * Write index - driver fills this entry with an constructed TBD
2798 * The OLDEST index is cached in the variable 'priv->tx_queue.oldest'
2808 struct ipw2100_bd_queue *txq = &priv->tx_queue; in __ipw2100_tx_process()
2816 if (list_empty(&priv->fw_pend_list)) in __ipw2100_tx_process()
2819 element = priv->fw_pend_list.next; in __ipw2100_tx_process()
2822 tbd = &txq->drv[packet->index]; in __ipw2100_tx_process()
2825 switch (packet->type) { in __ipw2100_tx_process()
2829 e = txq->oldest; in __ipw2100_tx_process()
2834 descriptors_used = tbd->num_fragments; in __ipw2100_tx_process()
2835 frag_num = tbd->num_fragments - 1; in __ipw2100_tx_process()
2836 e = txq->oldest + frag_num; in __ipw2100_tx_process()
2837 e %= txq->entries; in __ipw2100_tx_process()
2842 priv->net_dev->name); in __ipw2100_tx_process()
2850 read_register(priv->net_dev, IPW_MEM_HOST_SHARED_TX_QUEUE_READ_INDEX, in __ipw2100_tx_process()
2852 read_register(priv->net_dev, IPW_MEM_HOST_SHARED_TX_QUEUE_WRITE_INDEX, in __ipw2100_tx_process()
2854 if (w != txq->next) in __ipw2100_tx_process()
2856 priv->net_dev->name); in __ipw2100_tx_process()
2859 * txq->next is the index of the last packet written txq->oldest is in __ipw2100_tx_process()
2868 * ===>| s---->|=============== in __ipw2100_tx_process()
2871 * r---->| in __ipw2100_tx_process()
2874 * w - updated by driver in __ipw2100_tx_process()
2875 * r - updated by firmware in __ipw2100_tx_process()
2876 * s - start of oldest BD entry (txq->oldest) in __ipw2100_tx_process()
2877 * e - end of oldest BD entry in __ipw2100_tx_process()
2881 IPW_DEBUG_TX("exit - no processed packets ready to release.\n"); in __ipw2100_tx_process()
2886 DEC_STAT(&priv->fw_pend_stat); in __ipw2100_tx_process()
2890 i = txq->oldest; in __ipw2100_tx_process()
2892 &txq->drv[i], in __ipw2100_tx_process()
2893 (u32) (txq->nic + i * sizeof(struct ipw2100_bd)), in __ipw2100_tx_process()
2894 txq->drv[i].host_addr, txq->drv[i].buf_length); in __ipw2100_tx_process()
2896 if (packet->type == DATA) { in __ipw2100_tx_process()
2897 i = (i + 1) % txq->entries; in __ipw2100_tx_process()
2900 &txq->drv[i], in __ipw2100_tx_process()
2901 (u32) (txq->nic + i * in __ipw2100_tx_process()
2903 (u32) txq->drv[i].host_addr, in __ipw2100_tx_process()
2904 txq->drv[i].buf_length); in __ipw2100_tx_process()
2909 switch (packet->type) { in __ipw2100_tx_process()
2911 if (txq->drv[txq->oldest].status.info.fields.txType != 0) in __ipw2100_tx_process()
2915 priv->net_dev->name, txq->oldest, packet->index); in __ipw2100_tx_process()
2919 tbd = &txq->drv[(packet->index + 1 + i) % txq->entries]; in __ipw2100_tx_process()
2922 (packet->index + 1 + i) % txq->entries, in __ipw2100_tx_process()
2923 tbd->host_addr, tbd->buf_length); in __ipw2100_tx_process()
2925 dma_unmap_single(&priv->pci_dev->dev, tbd->host_addr, in __ipw2100_tx_process()
2926 tbd->buf_length, DMA_TO_DEVICE); in __ipw2100_tx_process()
2929 libipw_txb_free(packet->info.d_struct.txb); in __ipw2100_tx_process()
2930 packet->info.d_struct.txb = NULL; in __ipw2100_tx_process()
2932 list_add_tail(element, &priv->tx_free_list); in __ipw2100_tx_process()
2933 INC_STAT(&priv->tx_free_stat); in __ipw2100_tx_process()
2937 if (priv->status & STATUS_ASSOCIATED) in __ipw2100_tx_process()
2938 netif_wake_queue(priv->net_dev); in __ipw2100_tx_process()
2942 netif_trans_update(priv->net_dev); in __ipw2100_tx_process()
2947 if (txq->drv[txq->oldest].status.info.fields.txType != 1) in __ipw2100_tx_process()
2951 priv->net_dev->name, txq->oldest, packet->index); in __ipw2100_tx_process()
2954 if (packet->info.c_struct.cmd->host_command_reg < in __ipw2100_tx_process()
2957 command_types[packet->info.c_struct.cmd-> in __ipw2100_tx_process()
2959 packet->info.c_struct.cmd-> in __ipw2100_tx_process()
2961 packet->info.c_struct.cmd->cmd_status_reg); in __ipw2100_tx_process()
2964 list_add_tail(element, &priv->msg_free_list); in __ipw2100_tx_process()
2965 INC_STAT(&priv->msg_free_stat); in __ipw2100_tx_process()
2970 txq->oldest = (e + 1) % txq->entries; in __ipw2100_tx_process()
2972 txq->available += descriptors_used; in __ipw2100_tx_process()
2973 SET_STAT(&priv->txq_stat, txq->available); in __ipw2100_tx_process()
2976 jiffies - packet->jiffy_start); in __ipw2100_tx_process()
2978 return (!list_empty(&priv->fw_pend_list)); in __ipw2100_tx_process()
2991 priv->net_dev->name, i); in __ipw2100_tx_complete()
2999 struct ipw2100_bd_queue *txq = &priv->tx_queue; in ipw2100_tx_send_commands()
3001 int next = txq->next; in ipw2100_tx_send_commands()
3003 while (!list_empty(&priv->msg_pend_list)) { in ipw2100_tx_send_commands()
3010 if (txq->available <= 3) { in ipw2100_tx_send_commands()
3015 element = priv->msg_pend_list.next; in ipw2100_tx_send_commands()
3017 DEC_STAT(&priv->msg_pend_stat); in ipw2100_tx_send_commands()
3022 &txq->drv[txq->next], in ipw2100_tx_send_commands()
3023 (u32) (txq->nic + txq->next * in ipw2100_tx_send_commands()
3026 packet->index = txq->next; in ipw2100_tx_send_commands()
3028 tbd = &txq->drv[txq->next]; in ipw2100_tx_send_commands()
3031 tbd->host_addr = packet->info.c_struct.cmd_phys; in ipw2100_tx_send_commands()
3032 tbd->buf_length = sizeof(struct ipw2100_cmd_header); in ipw2100_tx_send_commands()
3035 tbd->num_fragments = 1; in ipw2100_tx_send_commands()
3036 tbd->status.info.field = in ipw2100_tx_send_commands()
3041 txq->next++; in ipw2100_tx_send_commands()
3042 txq->next %= txq->entries; in ipw2100_tx_send_commands()
3043 txq->available--; in ipw2100_tx_send_commands()
3044 DEC_STAT(&priv->txq_stat); in ipw2100_tx_send_commands()
3046 list_add_tail(element, &priv->fw_pend_list); in ipw2100_tx_send_commands()
3047 INC_STAT(&priv->fw_pend_stat); in ipw2100_tx_send_commands()
3050 if (txq->next != next) { in ipw2100_tx_send_commands()
3051 /* kick off the DMA by notifying firmware the in ipw2100_tx_send_commands()
3054 write_register(priv->net_dev, in ipw2100_tx_send_commands()
3056 txq->next); in ipw2100_tx_send_commands()
3068 struct ipw2100_bd_queue *txq = &priv->tx_queue; in ipw2100_tx_send_data()
3070 int next = txq->next; in ipw2100_tx_send_data()
3075 while (!list_empty(&priv->tx_pend_list)) { in ipw2100_tx_send_data()
3082 element = priv->tx_pend_list.next; in ipw2100_tx_send_data()
3085 if (unlikely(1 + packet->info.d_struct.txb->nr_frags > in ipw2100_tx_send_data()
3091 priv->net_dev->name); in ipw2100_tx_send_data()
3094 if (txq->available <= 3 + packet->info.d_struct.txb->nr_frags) { in ipw2100_tx_send_data()
3100 DEC_STAT(&priv->tx_pend_stat); in ipw2100_tx_send_data()
3102 tbd = &txq->drv[txq->next]; in ipw2100_tx_send_data()
3104 packet->index = txq->next; in ipw2100_tx_send_data()
3106 ipw_hdr = packet->info.d_struct.data; in ipw2100_tx_send_data()
3107 hdr = (struct libipw_hdr_3addr *)packet->info.d_struct.txb-> in ipw2100_tx_send_data()
3108 fragments[0]->data; in ipw2100_tx_send_data()
3110 if (priv->ieee->iw_mode == IW_MODE_INFRA) { in ipw2100_tx_send_data()
3113 memcpy(ipw_hdr->src_addr, hdr->addr2, ETH_ALEN); in ipw2100_tx_send_data()
3114 memcpy(ipw_hdr->dst_addr, hdr->addr3, ETH_ALEN); in ipw2100_tx_send_data()
3115 } else if (priv->ieee->iw_mode == IW_MODE_ADHOC) { in ipw2100_tx_send_data()
3118 memcpy(ipw_hdr->src_addr, hdr->addr2, ETH_ALEN); in ipw2100_tx_send_data()
3119 memcpy(ipw_hdr->dst_addr, hdr->addr1, ETH_ALEN); in ipw2100_tx_send_data()
3122 ipw_hdr->host_command_reg = SEND; in ipw2100_tx_send_data()
3123 ipw_hdr->host_command_reg1 = 0; in ipw2100_tx_send_data()
3126 ipw_hdr->needs_encryption = 0; in ipw2100_tx_send_data()
3127 ipw_hdr->encrypted = packet->info.d_struct.txb->encrypted; in ipw2100_tx_send_data()
3128 if (packet->info.d_struct.txb->nr_frags > 1) in ipw2100_tx_send_data()
3129 ipw_hdr->fragment_size = in ipw2100_tx_send_data()
3130 packet->info.d_struct.txb->frag_size - in ipw2100_tx_send_data()
3133 ipw_hdr->fragment_size = 0; in ipw2100_tx_send_data()
3135 tbd->host_addr = packet->info.d_struct.data_phys; in ipw2100_tx_send_data()
3136 tbd->buf_length = sizeof(struct ipw2100_data_header); in ipw2100_tx_send_data()
3137 tbd->num_fragments = 1 + packet->info.d_struct.txb->nr_frags; in ipw2100_tx_send_data()
3138 tbd->status.info.field = in ipw2100_tx_send_data()
3141 txq->next++; in ipw2100_tx_send_data()
3142 txq->next %= txq->entries; in ipw2100_tx_send_data()
3145 packet->index, tbd->host_addr, tbd->buf_length); in ipw2100_tx_send_data()
3147 if (packet->info.d_struct.txb->nr_frags > 1) in ipw2100_tx_send_data()
3149 packet->info.d_struct.txb->nr_frags); in ipw2100_tx_send_data()
3152 for (i = 0; i < packet->info.d_struct.txb->nr_frags; i++) { in ipw2100_tx_send_data()
3153 tbd = &txq->drv[txq->next]; in ipw2100_tx_send_data()
3154 if (i == packet->info.d_struct.txb->nr_frags - 1) in ipw2100_tx_send_data()
3155 tbd->status.info.field = in ipw2100_tx_send_data()
3159 tbd->status.info.field = in ipw2100_tx_send_data()
3163 tbd->buf_length = packet->info.d_struct.txb-> in ipw2100_tx_send_data()
3164 fragments[i]->len - LIBIPW_3ADDR_LEN; in ipw2100_tx_send_data()
3166 tbd->host_addr = dma_map_single(&priv->pci_dev->dev, in ipw2100_tx_send_data()
3167 packet->info.d_struct. in ipw2100_tx_send_data()
3168 txb->fragments[i]->data + in ipw2100_tx_send_data()
3170 tbd->buf_length, in ipw2100_tx_send_data()
3172 if (dma_mapping_error(&priv->pci_dev->dev, tbd->host_addr)) { in ipw2100_tx_send_data()
3178 txq->next, tbd->host_addr, in ipw2100_tx_send_data()
3179 tbd->buf_length); in ipw2100_tx_send_data()
3181 dma_sync_single_for_device(&priv->pci_dev->dev, in ipw2100_tx_send_data()
3182 tbd->host_addr, in ipw2100_tx_send_data()
3183 tbd->buf_length, in ipw2100_tx_send_data()
3186 txq->next++; in ipw2100_tx_send_data()
3187 txq->next %= txq->entries; in ipw2100_tx_send_data()
3190 txq->available -= 1 + packet->info.d_struct.txb->nr_frags; in ipw2100_tx_send_data()
3191 SET_STAT(&priv->txq_stat, txq->available); in ipw2100_tx_send_data()
3193 list_add_tail(element, &priv->fw_pend_list); in ipw2100_tx_send_data()
3194 INC_STAT(&priv->fw_pend_stat); in ipw2100_tx_send_data()
3197 if (txq->next != next) { in ipw2100_tx_send_data()
3198 /* kick off the DMA by notifying firmware the in ipw2100_tx_send_data()
3200 write_register(priv->net_dev, in ipw2100_tx_send_data()
3202 txq->next); in ipw2100_tx_send_data()
3209 struct net_device *dev = priv->net_dev; in ipw2100_irq_tasklet()
3213 spin_lock_irqsave(&priv->low_lock, flags); in ipw2100_irq_tasklet()
3218 IPW_DEBUG_ISR("enter - INTA: 0x%08lX\n", in ipw2100_irq_tasklet()
3221 priv->in_isr++; in ipw2100_irq_tasklet()
3222 priv->interrupts++; in ipw2100_irq_tasklet()
3233 priv->inta_other++; in ipw2100_irq_tasklet()
3236 read_nic_dword(dev, IPW_NIC_FATAL_ERROR, &priv->fatal_error); in ipw2100_irq_tasklet()
3238 priv->net_dev->name, priv->fatal_error); in ipw2100_irq_tasklet()
3240 read_nic_dword(dev, IPW_ERROR_ADDR(priv->fatal_error), &tmp); in ipw2100_irq_tasklet()
3242 priv->net_dev->name, tmp); in ipw2100_irq_tasklet()
3251 priv->inta_other++; in ipw2100_irq_tasklet()
3258 priv->rx_interrupts++; in ipw2100_irq_tasklet()
3269 priv->tx_interrupts++; in ipw2100_irq_tasklet()
3280 priv->inta_other++; in ipw2100_irq_tasklet()
3288 priv->inta_other++; in ipw2100_irq_tasklet()
3294 priv->inta_other++; in ipw2100_irq_tasklet()
3309 priv->inta_other++; in ipw2100_irq_tasklet()
3315 priv->inta_other++; in ipw2100_irq_tasklet()
3320 priv->in_isr--; in ipw2100_irq_tasklet()
3323 spin_unlock_irqrestore(&priv->low_lock, flags); in ipw2100_irq_tasklet()
3336 spin_lock(&priv->low_lock); in ipw2100_interrupt()
3342 if (!(priv->status & STATUS_INT_ENABLED)) { in ipw2100_interrupt()
3347 read_register(priv->net_dev, IPW_REG_INTA_MASK, &inta_mask); in ipw2100_interrupt()
3348 read_register(priv->net_dev, IPW_REG_INTA, &inta); in ipw2100_interrupt()
3365 * work tasklet, so if another part of the code re-enables the in ipw2100_interrupt()
3369 tasklet_schedule(&priv->irq_tasklet); in ipw2100_interrupt()
3370 spin_unlock(&priv->low_lock); in ipw2100_interrupt()
3374 spin_unlock(&priv->low_lock); in ipw2100_interrupt()
3386 spin_lock_irqsave(&priv->low_lock, flags); in ipw2100_tx()
3388 if (!(priv->status & STATUS_ASSOCIATED)) { in ipw2100_tx()
3390 priv->net_dev->stats.tx_carrier_errors++; in ipw2100_tx()
3395 if (list_empty(&priv->tx_free_list)) in ipw2100_tx()
3398 element = priv->tx_free_list.next; in ipw2100_tx()
3401 packet->info.d_struct.txb = txb; in ipw2100_tx()
3403 IPW_DEBUG_TX("Sending fragment (%d bytes):\n", txb->fragments[0]->len); in ipw2100_tx()
3404 printk_buf(IPW_DL_TX, txb->fragments[0]->data, txb->fragments[0]->len); in ipw2100_tx()
3406 packet->jiffy_start = jiffies; in ipw2100_tx()
3409 DEC_STAT(&priv->tx_free_stat); in ipw2100_tx()
3411 list_add_tail(element, &priv->tx_pend_list); in ipw2100_tx()
3412 INC_STAT(&priv->tx_pend_stat); in ipw2100_tx()
3416 spin_unlock_irqrestore(&priv->low_lock, flags); in ipw2100_tx()
3421 spin_unlock_irqrestore(&priv->low_lock, flags); in ipw2100_tx()
3427 int i, j, err = -EINVAL; in ipw2100_msg_allocate()
3431 priv->msg_buffers = in ipw2100_msg_allocate()
3435 if (!priv->msg_buffers) in ipw2100_msg_allocate()
3436 return -ENOMEM; in ipw2100_msg_allocate()
3439 v = dma_alloc_coherent(&priv->pci_dev->dev, in ipw2100_msg_allocate()
3445 "buffers.\n", priv->net_dev->name); in ipw2100_msg_allocate()
3446 err = -ENOMEM; in ipw2100_msg_allocate()
3450 priv->msg_buffers[i].type = COMMAND; in ipw2100_msg_allocate()
3451 priv->msg_buffers[i].info.c_struct.cmd = in ipw2100_msg_allocate()
3453 priv->msg_buffers[i].info.c_struct.cmd_phys = p; in ipw2100_msg_allocate()
3460 dma_free_coherent(&priv->pci_dev->dev, in ipw2100_msg_allocate()
3462 priv->msg_buffers[j].info.c_struct.cmd, in ipw2100_msg_allocate()
3463 priv->msg_buffers[j].info.c_struct.cmd_phys); in ipw2100_msg_allocate()
3466 kfree(priv->msg_buffers); in ipw2100_msg_allocate()
3467 priv->msg_buffers = NULL; in ipw2100_msg_allocate()
3476 INIT_LIST_HEAD(&priv->msg_free_list); in ipw2100_msg_initialize()
3477 INIT_LIST_HEAD(&priv->msg_pend_list); in ipw2100_msg_initialize()
3480 list_add_tail(&priv->msg_buffers[i].list, &priv->msg_free_list); in ipw2100_msg_initialize()
3481 SET_STAT(&priv->msg_free_stat, i); in ipw2100_msg_initialize()
3490 if (!priv->msg_buffers) in ipw2100_msg_free()
3494 dma_free_coherent(&priv->pci_dev->dev, in ipw2100_msg_free()
3496 priv->msg_buffers[i].info.c_struct.cmd, in ipw2100_msg_free()
3497 priv->msg_buffers[i].info.c_struct.cmd_phys); in ipw2100_msg_free()
3500 kfree(priv->msg_buffers); in ipw2100_msg_free()
3501 priv->msg_buffers = NULL; in ipw2100_msg_free()
3521 return out - buf; in show_pci()
3530 return sprintf(buf, "0x%08x\n", (int)p->config); in show_cfg()
3539 return sprintf(buf, "0x%08x\n", (int)p->status); in show_status()
3548 return sprintf(buf, "0x%08x\n", (int)p->capability); in show_capability()
3688 IPW2100_ORD(SYS_BOOT_TIME, "Boot time"),
3694 "rx frames dropped due to non-sequential fragment"),
3710 IPW2100_ORD(LAST_ASSN_TIME, "RTC time of last association"),
3729 "RSSI of associated AP at time of association"),
3746 IPW2100_ORD(POWER_MGMT_MODE, "Power mode - 0=CAM, 1=PSP"),
3757 "current radio freq lower digits - channel ID"),
3758 IPW2100_ORD(RTC_TIME, "current RTC time"),
3785 IPW2100_ORD(NIC_MANF_DATE_TIME, "MANF Date/Time STAMP"),
3793 struct net_device *dev = priv->net_dev; in show_registers()
3805 return out - buf; in show_registers()
3814 struct net_device *dev = priv->net_dev; in show_hardware()
3846 return out - buf; in show_hardware()
3855 struct net_device *dev = priv->net_dev; in show_memory()
3866 while (len < PAGE_SIZE - 128 && loop < 0x30000) { in show_memory()
3868 if (priv->snapshot[0]) in show_memory()
3876 if (priv->dump_raw) in show_memory()
3912 struct net_device *dev = priv->net_dev; in store_memory()
3915 (void)dev; /* kill unused-var warning for debug-only code */ in store_memory()
3923 dev->name); in store_memory()
3924 priv->dump_raw = 1; in store_memory()
3929 dev->name); in store_memory()
3930 priv->dump_raw = 0; in store_memory()
3933 IPW_DEBUG_INFO("%s: Resetting firmware snapshot.\n", dev->name); in store_memory()
3937 IPW_DEBUG_INFO("%s: Usage: 0|on = HEX, 1|off = RAW, " in store_memory()
3938 "reset = clear memory snapshot\n", dev->name); in store_memory()
3954 if (priv->status & STATUS_RF_KILL_MASK) in show_ordinals()
3961 while (len < PAGE_SIZE - 128 && loop < ARRAY_SIZE(ord_data)) { in show_ordinals()
3988 priv->interrupts, priv->tx_interrupts, in show_stats()
3989 priv->rx_interrupts, priv->inta_other); in show_stats()
3990 out += sprintf(out, "firmware resets: %d\n", priv->resets); in show_stats()
3991 out += sprintf(out, "firmware hangs: %d\n", priv->hangs); in show_stats()
3994 priv->snapshot[0] ? "YES" : "NO"); in show_stats()
3997 return out - buf; in show_stats()
4006 if (mode == priv->ieee->iw_mode) in ipw2100_switch_mode()
4012 priv->net_dev->name, err); in ipw2100_switch_mode()
4018 priv->net_dev->type = ARPHRD_ETHER; in ipw2100_switch_mode()
4021 priv->net_dev->type = ARPHRD_ETHER; in ipw2100_switch_mode()
4025 priv->last_mode = priv->ieee->iw_mode; in ipw2100_switch_mode()
4026 priv->net_dev->type = ARPHRD_IEEE80211_RADIOTAP; in ipw2100_switch_mode()
4031 priv->ieee->iw_mode = mode; in ipw2100_switch_mode()
4039 printk(KERN_INFO "%s: Resetting on mode change.\n", priv->net_dev->name); in ipw2100_switch_mode()
4040 priv->reset_backoff = 0; in ipw2100_switch_mode()
4052 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x) in show_internals()
4054 if (priv->status & STATUS_ASSOCIATED) in show_internals()
4056 ktime_get_boottime_seconds() - priv->connect_start); in show_internals()
4060 DUMP_VAR(ieee->crypt_info.crypt[priv->ieee->crypt_info.tx_keyidx], "p"); in show_internals()
4067 (unsigned long)priv->last_rtc); in show_internals()
4092 DUMP_VAR(ieee->scans, "d"); in show_internals()
4111 if (priv->status & STATUS_RF_KILL_MASK) in show_bssinfo()
4140 return out - buf; in show_bssinfo()
4175 if (priv->fatal_error) in show_fatal_error()
4176 out += sprintf(out, "0x%08X\n", priv->fatal_error); in show_fatal_error()
4181 if (!priv->fatal_errors[(priv->fatal_index - i) % in show_fatal_error()
4186 priv->fatal_errors[(priv->fatal_index - i) % in show_fatal_error()
4190 return out - buf; in show_fatal_error()
4208 return sprintf(buf, "%d\n", priv->ieee->scan_age); in show_scan_age()
4215 struct net_device *dev = priv->net_dev; in store_scan_age()
4219 (void)dev; /* kill unused-var warning for debug-only code */ in store_scan_age()
4225 IPW_DEBUG_INFO("%s: user supplied invalid value.\n", dev->name); in store_scan_age()
4227 priv->ieee->scan_age = val; in store_scan_age()
4228 IPW_DEBUG_INFO("set scan_age = %u\n", priv->ieee->scan_age); in store_scan_age()
4240 /* 0 - RF kill not enabled in show_rf_kill()
4241 1 - SW based RF kill active (sysfs) in show_rf_kill()
4242 2 - HW based RF kill active in show_rf_kill()
4243 3 - Both HW and SW baed RF kill active */ in show_rf_kill()
4245 int val = ((priv->status & STATUS_RF_KILL_SW) ? 0x1 : 0x0) | in show_rf_kill()
4253 (priv->status & STATUS_RF_KILL_SW ? 1 : 0)) in ipw_radio_kill_sw()
4257 disable_radio ? "OFF" : "ON"); in ipw_radio_kill_sw()
4259 mutex_lock(&priv->action_mutex); in ipw_radio_kill_sw()
4262 priv->status |= STATUS_RF_KILL_SW; in ipw_radio_kill_sw()
4265 priv->status &= ~STATUS_RF_KILL_SW; in ipw_radio_kill_sw()
4267 IPW_DEBUG_RF_KILL("Can not turn radio back on - " in ipw_radio_kill_sw()
4270 priv->stop_rf_kill = 0; in ipw_radio_kill_sw()
4271 mod_delayed_work(system_wq, &priv->rf_kill, in ipw_radio_kill_sw()
4277 mutex_unlock(&priv->action_mutex); in ipw_radio_kill_sw()
4315 struct ipw2100_status_queue *q = &priv->status_queue; in status_queue_allocate()
4319 q->size = entries * sizeof(struct ipw2100_status); in status_queue_allocate()
4320 q->drv = dma_alloc_coherent(&priv->pci_dev->dev, q->size, &q->nic, in status_queue_allocate()
4322 if (!q->drv) { in status_queue_allocate()
4324 return -ENOMEM; in status_queue_allocate()
4336 if (priv->status_queue.drv) { in status_queue_free()
4337 dma_free_coherent(&priv->pci_dev->dev, in status_queue_free()
4338 priv->status_queue.size, in status_queue_free()
4339 priv->status_queue.drv, in status_queue_free()
4340 priv->status_queue.nic); in status_queue_free()
4341 priv->status_queue.drv = NULL; in status_queue_free()
4354 q->entries = entries; in bd_queue_allocate()
4355 q->size = entries * sizeof(struct ipw2100_bd); in bd_queue_allocate()
4356 q->drv = dma_alloc_coherent(&priv->pci_dev->dev, q->size, &q->nic, in bd_queue_allocate()
4358 if (!q->drv) { in bd_queue_allocate()
4361 return -ENOMEM; in bd_queue_allocate()
4376 if (q->drv) { in bd_queue_free()
4377 dma_free_coherent(&priv->pci_dev->dev, q->size, q->drv, in bd_queue_free()
4378 q->nic); in bd_queue_free()
4379 q->drv = NULL; in bd_queue_free()
4391 IPW_DEBUG_INFO("initializing bd queue at virt=%p, phys=%08x\n", q->drv, in bd_queue_initialize()
4392 (u32) q->nic); in bd_queue_initialize()
4394 write_register(priv->net_dev, base, q->nic); in bd_queue_initialize()
4395 write_register(priv->net_dev, size, q->entries); in bd_queue_initialize()
4396 write_register(priv->net_dev, r, q->oldest); in bd_queue_initialize()
4397 write_register(priv->net_dev, w, q->next); in bd_queue_initialize()
4404 priv->stop_rf_kill = 1; in ipw2100_kill_works()
4405 priv->stop_hang_check = 1; in ipw2100_kill_works()
4406 cancel_delayed_work_sync(&priv->reset_work); in ipw2100_kill_works()
4407 cancel_delayed_work_sync(&priv->security_work); in ipw2100_kill_works()
4408 cancel_delayed_work_sync(&priv->wx_event_work); in ipw2100_kill_works()
4409 cancel_delayed_work_sync(&priv->hang_check); in ipw2100_kill_works()
4410 cancel_delayed_work_sync(&priv->rf_kill); in ipw2100_kill_works()
4411 cancel_delayed_work_sync(&priv->scan_event); in ipw2100_kill_works()
4422 err = bd_queue_allocate(priv, &priv->tx_queue, TX_QUEUE_LENGTH); in ipw2100_tx_allocate()
4425 priv->net_dev->name); in ipw2100_tx_allocate()
4429 priv->tx_buffers = kmalloc_array(TX_PENDED_QUEUE_LENGTH, in ipw2100_tx_allocate()
4432 if (!priv->tx_buffers) { in ipw2100_tx_allocate()
4433 bd_queue_free(priv, &priv->tx_queue); in ipw2100_tx_allocate()
4434 return -ENOMEM; in ipw2100_tx_allocate()
4438 v = dma_alloc_coherent(&priv->pci_dev->dev, in ipw2100_tx_allocate()
4444 priv->net_dev->name); in ipw2100_tx_allocate()
4445 err = -ENOMEM; in ipw2100_tx_allocate()
4449 priv->tx_buffers[i].type = DATA; in ipw2100_tx_allocate()
4450 priv->tx_buffers[i].info.d_struct.data = in ipw2100_tx_allocate()
4452 priv->tx_buffers[i].info.d_struct.data_phys = p; in ipw2100_tx_allocate()
4453 priv->tx_buffers[i].info.d_struct.txb = NULL; in ipw2100_tx_allocate()
4460 dma_free_coherent(&priv->pci_dev->dev, in ipw2100_tx_allocate()
4462 priv->tx_buffers[j].info.d_struct.data, in ipw2100_tx_allocate()
4463 priv->tx_buffers[j].info.d_struct.data_phys); in ipw2100_tx_allocate()
4466 kfree(priv->tx_buffers); in ipw2100_tx_allocate()
4467 priv->tx_buffers = NULL; in ipw2100_tx_allocate()
4481 INIT_LIST_HEAD(&priv->fw_pend_list); in ipw2100_tx_initialize()
4482 INIT_STAT(&priv->fw_pend_stat); in ipw2100_tx_initialize()
4487 INIT_LIST_HEAD(&priv->tx_pend_list); in ipw2100_tx_initialize()
4488 INIT_LIST_HEAD(&priv->tx_free_list); in ipw2100_tx_initialize()
4489 INIT_STAT(&priv->tx_pend_stat); in ipw2100_tx_initialize()
4490 INIT_STAT(&priv->tx_free_stat); in ipw2100_tx_initialize()
4495 if (priv->tx_buffers[i].info.d_struct.txb) { in ipw2100_tx_initialize()
4496 libipw_txb_free(priv->tx_buffers[i].info.d_struct. in ipw2100_tx_initialize()
4498 priv->tx_buffers[i].info.d_struct.txb = NULL; in ipw2100_tx_initialize()
4501 list_add_tail(&priv->tx_buffers[i].list, &priv->tx_free_list); in ipw2100_tx_initialize()
4504 SET_STAT(&priv->tx_free_stat, i); in ipw2100_tx_initialize()
4506 priv->tx_queue.oldest = 0; in ipw2100_tx_initialize()
4507 priv->tx_queue.available = priv->tx_queue.entries; in ipw2100_tx_initialize()
4508 priv->tx_queue.next = 0; in ipw2100_tx_initialize()
4509 INIT_STAT(&priv->txq_stat); in ipw2100_tx_initialize()
4510 SET_STAT(&priv->txq_stat, priv->tx_queue.available); in ipw2100_tx_initialize()
4512 bd_queue_initialize(priv, &priv->tx_queue, in ipw2100_tx_initialize()
4528 bd_queue_free(priv, &priv->tx_queue); in ipw2100_tx_free()
4530 if (!priv->tx_buffers) in ipw2100_tx_free()
4534 if (priv->tx_buffers[i].info.d_struct.txb) { in ipw2100_tx_free()
4535 libipw_txb_free(priv->tx_buffers[i].info.d_struct. in ipw2100_tx_free()
4537 priv->tx_buffers[i].info.d_struct.txb = NULL; in ipw2100_tx_free()
4539 if (priv->tx_buffers[i].info.d_struct.data) in ipw2100_tx_free()
4540 dma_free_coherent(&priv->pci_dev->dev, in ipw2100_tx_free()
4542 priv->tx_buffers[i].info.d_struct.data, in ipw2100_tx_free()
4543 priv->tx_buffers[i].info.d_struct.data_phys); in ipw2100_tx_free()
4546 kfree(priv->tx_buffers); in ipw2100_tx_free()
4547 priv->tx_buffers = NULL; in ipw2100_tx_free()
4554 int i, j, err = -EINVAL; in ipw2100_rx_allocate()
4558 err = bd_queue_allocate(priv, &priv->rx_queue, RX_QUEUE_LENGTH); in ipw2100_rx_allocate()
4567 bd_queue_free(priv, &priv->rx_queue); in ipw2100_rx_allocate()
4574 priv->rx_buffers = kmalloc_array(RX_QUEUE_LENGTH, in ipw2100_rx_allocate()
4577 if (!priv->rx_buffers) { in ipw2100_rx_allocate()
4580 bd_queue_free(priv, &priv->rx_queue); in ipw2100_rx_allocate()
4584 return -ENOMEM; in ipw2100_rx_allocate()
4588 struct ipw2100_rx_packet *packet = &priv->rx_buffers[i]; in ipw2100_rx_allocate()
4592 err = -ENOMEM; in ipw2100_rx_allocate()
4597 priv->rx_queue.drv[i].host_addr = packet->dma_addr; in ipw2100_rx_allocate()
4598 priv->rx_queue.drv[i].buf_length = IPW_RX_NIC_BUFFER_LENGTH; in ipw2100_rx_allocate()
4599 priv->status_queue.drv[i].status_fields = 0; in ipw2100_rx_allocate()
4606 dma_unmap_single(&priv->pci_dev->dev, in ipw2100_rx_allocate()
4607 priv->rx_buffers[j].dma_addr, in ipw2100_rx_allocate()
4610 dev_kfree_skb(priv->rx_buffers[j].skb); in ipw2100_rx_allocate()
4613 kfree(priv->rx_buffers); in ipw2100_rx_allocate()
4614 priv->rx_buffers = NULL; in ipw2100_rx_allocate()
4616 bd_queue_free(priv, &priv->rx_queue); in ipw2100_rx_allocate()
4627 priv->rx_queue.oldest = 0; in ipw2100_rx_initialize()
4628 priv->rx_queue.available = priv->rx_queue.entries - 1; in ipw2100_rx_initialize()
4629 priv->rx_queue.next = priv->rx_queue.entries - 1; in ipw2100_rx_initialize()
4631 INIT_STAT(&priv->rxq_stat); in ipw2100_rx_initialize()
4632 SET_STAT(&priv->rxq_stat, priv->rx_queue.available); in ipw2100_rx_initialize()
4634 bd_queue_initialize(priv, &priv->rx_queue, in ipw2100_rx_initialize()
4641 write_register(priv->net_dev, IPW_MEM_HOST_SHARED_RX_STATUS_BASE, in ipw2100_rx_initialize()
4642 priv->status_queue.nic); in ipw2100_rx_initialize()
4653 bd_queue_free(priv, &priv->rx_queue); in ipw2100_rx_free()
4656 if (!priv->rx_buffers) in ipw2100_rx_free()
4660 if (priv->rx_buffers[i].rxp) { in ipw2100_rx_free()
4661 dma_unmap_single(&priv->pci_dev->dev, in ipw2100_rx_free()
4662 priv->rx_buffers[i].dma_addr, in ipw2100_rx_free()
4665 dev_kfree_skb(priv->rx_buffers[i].skb); in ipw2100_rx_free()
4669 kfree(priv->rx_buffers); in ipw2100_rx_free()
4670 priv->rx_buffers = NULL; in ipw2100_rx_free()
4685 return -EIO; in ipw2100_read_mac_address()
4688 memcpy(priv->net_dev->dev_addr, addr, ETH_ALEN); in ipw2100_read_mac_address()
4689 IPW_DEBUG_INFO("card MAC is %pM\n", priv->net_dev->dev_addr); in ipw2100_read_mac_address()
4713 if (priv->config & CFG_CUSTOM_MAC) { in ipw2100_set_mac_address()
4714 memcpy(cmd.host_command_parameters, priv->mac_addr, ETH_ALEN); in ipw2100_set_mac_address()
4715 memcpy(priv->net_dev->dev_addr, priv->mac_addr, ETH_ALEN); in ipw2100_set_mac_address()
4717 memcpy(cmd.host_command_parameters, priv->net_dev->dev_addr, in ipw2100_set_mac_address()
4746 port_type == IPW_IBSS ? "Ad-Hoc" : "Managed"); in ipw2100_set_port_type()
4753 priv->net_dev->name, err); in ipw2100_set_port_type()
4782 if (priv->ieee->iw_mode == IW_MODE_INFRA) in ipw2100_set_channel()
4787 return -EINVAL; in ipw2100_set_channel()
4802 priv->config |= CFG_STATIC_CHANNEL; in ipw2100_set_channel()
4804 priv->config &= ~CFG_STATIC_CHANNEL; in ipw2100_set_channel()
4806 priv->channel = channel; in ipw2100_set_channel()
4835 if (priv->ieee->iw_mode == IW_MODE_ADHOC) in ipw2100_system_config()
4841 if (!(priv->config & CFG_LONG_PREAMBLE)) in ipw2100_system_config()
4913 priv->tx_rates = rate; in ipw2100_set_tx_rates()
4934 priv->power_mode = IPW_POWER_LEVEL(priv->power_mode); in ipw2100_set_power_mode()
4936 priv->power_mode = IPW_POWER_ENABLED | power_level; in ipw2100_set_power_mode()
4939 if (priv->port_type == IBSS && priv->adhoc_power != DFTL_IBSS_TX_POWER) { in ipw2100_set_power_mode()
4942 cmd.host_command_parameters[0] = (u32) priv->adhoc_power; in ipw2100_set_power_mode()
4971 priv->rts_threshold = threshold; in ipw2100_set_rts_threshold()
5011 priv->frag_threshold = threshold;
5032 priv->short_retry_limit = retry; in ipw2100_set_short_retry()
5052 priv->long_retry_limit = retry; in ipw2100_set_long_retry()
5103 * the currently associated AP -- but in the off chance that a future in ipw2100_disassociate_bssid()
5106 memcpy(cmd.host_command_parameters, priv->bssid, ETH_ALEN); in ipw2100_disassociate_bssid()
5143 err = -EIO; in ipw2100_set_wpa_ie()
5177 security->auth_mode = auth_mode; in ipw2100_set_security_information()
5178 security->unicast_using_group = unicast_using_group; in ipw2100_set_security_information()
5183 security->allowed_ciphers = IPW_NONE_CIPHER; in ipw2100_set_security_information()
5186 security->allowed_ciphers = IPW_WEP40_CIPHER | in ipw2100_set_security_information()
5190 security->allowed_ciphers = IPW_WEP40_CIPHER | in ipw2100_set_security_information()
5194 security->allowed_ciphers = IPW_WEP40_CIPHER | in ipw2100_set_security_information()
5198 security->allowed_ciphers = IPW_WEP40_CIPHER | in ipw2100_set_security_information()
5205 security->auth_mode, security->allowed_ciphers, security_level); in ipw2100_set_security_information()
5207 security->replay_counters_number = 0; in ipw2100_set_security_information()
5234 tmp = (tx_power - IPW_TX_POWER_MIN_DBM) * 16 / in ipw2100_set_tx_power()
5235 (IPW_TX_POWER_MAX_DBM - IPW_TX_POWER_MIN_DBM); in ipw2100_set_tx_power()
5239 if (priv->ieee->iw_mode == IW_MODE_ADHOC) in ipw2100_set_tx_power()
5242 priv->tx_power = tx_power; in ipw2100_set_tx_power()
5261 if (priv->ieee->iw_mode == IW_MODE_ADHOC) { in ipw2100_set_ibss_beacon_interval()
5308 return -ENOMEM; in ipw2100_queues_allocate()
5332 priv->net_dev->name, err); in ipw2100_set_wep_flags()
5353 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
5354 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
5392 wep_key->idx = idx; in ipw2100_set_key()
5393 wep_key->len = keylen; in ipw2100_set_key()
5396 memcpy(wep_key->key, key, len); in ipw2100_set_key()
5397 memset(wep_key->key + len, 0, keylen - len); in ipw2100_set_key()
5403 priv->net_dev->name, wep_key->idx); in ipw2100_set_key()
5406 priv->net_dev->name, wep_key->idx, wep_key->len, in ipw2100_set_key()
5407 WEP_STR_64(wep_key->key)); in ipw2100_set_key()
5411 priv->net_dev->name, wep_key->idx, wep_key->len, in ipw2100_set_key()
5412 WEP_STR_128(wep_key->key)); in ipw2100_set_key()
5420 priv->net_dev->name, err); in ipw2100_set_key()
5450 return -EINVAL; in ipw2100_set_key_index()
5457 priv->net_dev->name, err); in ipw2100_set_key_index()
5475 if (!(priv->status & STATUS_RUNNING)) in ipw2100_configure_security()
5484 if (!priv->ieee->sec.enabled) { in ipw2100_configure_security()
5490 if (priv->ieee->sec.flags & SEC_AUTH_MODE) { in ipw2100_configure_security()
5491 if (priv->ieee->sec.auth_mode == WLAN_AUTH_SHARED_KEY) in ipw2100_configure_security()
5493 else if (priv->ieee->sec.auth_mode == WLAN_AUTH_LEAP) in ipw2100_configure_security()
5498 if (priv->ieee->sec.flags & SEC_LEVEL) in ipw2100_configure_security()
5499 sec_level = priv->ieee->sec.level; in ipw2100_configure_security()
5502 if (priv->ieee->sec.flags & SEC_UNICAST_GROUP) in ipw2100_configure_security()
5503 use_group = priv->ieee->sec.unicast_uses_group; in ipw2100_configure_security()
5513 if (priv->ieee->sec.enabled) { in ipw2100_configure_security()
5515 if (!(priv->ieee->sec.flags & (1 << i))) { in ipw2100_configure_security()
5516 memset(priv->ieee->sec.keys[i], 0, WEP_KEY_LEN); in ipw2100_configure_security()
5517 priv->ieee->sec.key_sizes[i] = 0; in ipw2100_configure_security()
5520 priv->ieee->sec.keys[i], in ipw2100_configure_security()
5521 priv->ieee->sec. in ipw2100_configure_security()
5528 ipw2100_set_key_index(priv, priv->ieee->crypt_info.tx_keyidx, 1); in ipw2100_configure_security()
5535 priv->ieee->sec. in ipw2100_configure_security()
5540 priv->status &= ~STATUS_SECURITY_UPDATED; in ipw2100_configure_security()
5555 * process this, then update the security settings--which causes in ipw2100_security_work()
5557 if (!(priv->status & STATUS_ASSOCIATED) && in ipw2100_security_work()
5558 priv->status & STATUS_SECURITY_UPDATED) in ipw2100_security_work()
5563 struct libipw_security *sec) in shim__set_security() argument
5568 mutex_lock(&priv->action_mutex); in shim__set_security()
5569 if (!(priv->status & STATUS_INITIALIZED)) in shim__set_security()
5573 if (sec->flags & (1 << i)) { in shim__set_security()
5574 priv->ieee->sec.key_sizes[i] = sec->key_sizes[i]; in shim__set_security()
5575 if (sec->key_sizes[i] == 0) in shim__set_security()
5576 priv->ieee->sec.flags &= ~(1 << i); in shim__set_security()
5578 memcpy(priv->ieee->sec.keys[i], sec->keys[i], in shim__set_security()
5579 sec->key_sizes[i]); in shim__set_security()
5580 if (sec->level == SEC_LEVEL_1) { in shim__set_security()
5581 priv->ieee->sec.flags |= (1 << i); in shim__set_security()
5582 priv->status |= STATUS_SECURITY_UPDATED; in shim__set_security()
5584 priv->ieee->sec.flags &= ~(1 << i); in shim__set_security()
5588 if ((sec->flags & SEC_ACTIVE_KEY) && in shim__set_security()
5589 priv->ieee->sec.active_key != sec->active_key) { in shim__set_security()
5590 priv->ieee->sec.active_key = sec->active_key; in shim__set_security()
5591 priv->ieee->sec.flags |= SEC_ACTIVE_KEY; in shim__set_security()
5592 priv->status |= STATUS_SECURITY_UPDATED; in shim__set_security()
5595 if ((sec->flags & SEC_AUTH_MODE) && in shim__set_security()
5596 (priv->ieee->sec.auth_mode != sec->auth_mode)) { in shim__set_security()
5597 priv->ieee->sec.auth_mode = sec->auth_mode; in shim__set_security()
5598 priv->ieee->sec.flags |= SEC_AUTH_MODE; in shim__set_security()
5599 priv->status |= STATUS_SECURITY_UPDATED; in shim__set_security()
5602 if (sec->flags & SEC_ENABLED && priv->ieee->sec.enabled != sec->enabled) { in shim__set_security()
5603 priv->ieee->sec.flags |= SEC_ENABLED; in shim__set_security()
5604 priv->ieee->sec.enabled = sec->enabled; in shim__set_security()
5605 priv->status |= STATUS_SECURITY_UPDATED; in shim__set_security()
5608 if (sec->flags & SEC_ENCRYPT) in shim__set_security()
5609 priv->ieee->sec.encrypt = sec->encrypt; in shim__set_security()
5611 if (sec->flags & SEC_LEVEL && priv->ieee->sec.level != sec->level) { in shim__set_security()
5612 priv->ieee->sec.level = sec->level; in shim__set_security()
5613 priv->ieee->sec.flags |= SEC_LEVEL; in shim__set_security()
5614 priv->status |= STATUS_SECURITY_UPDATED; in shim__set_security()
5618 priv->ieee->sec.flags & (1 << 8) ? '1' : '0', in shim__set_security()
5619 priv->ieee->sec.flags & (1 << 7) ? '1' : '0', in shim__set_security()
5620 priv->ieee->sec.flags & (1 << 6) ? '1' : '0', in shim__set_security()
5621 priv->ieee->sec.flags & (1 << 5) ? '1' : '0', in shim__set_security()
5622 priv->ieee->sec.flags & (1 << 4) ? '1' : '0', in shim__set_security()
5623 priv->ieee->sec.flags & (1 << 3) ? '1' : '0', in shim__set_security()
5624 priv->ieee->sec.flags & (1 << 2) ? '1' : '0', in shim__set_security()
5625 priv->ieee->sec.flags & (1 << 1) ? '1' : '0', in shim__set_security()
5626 priv->ieee->sec.flags & (1 << 0) ? '1' : '0'); in shim__set_security()
5632 * if (force_update || !(priv->status & STATUS_ASSOCIATED))*/ in shim__set_security()
5633 if (!(priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING))) in shim__set_security()
5636 mutex_unlock(&priv->action_mutex); in shim__set_security()
5651 if (priv->ieee->iw_mode == IW_MODE_MONITOR) { in ipw2100_adapter_setup()
5652 err = ipw2100_set_channel(priv, priv->channel, batch_mode); in ipw2100_adapter_setup()
5664 return -EIO; in ipw2100_adapter_setup()
5670 err = ipw2100_set_port_type(priv, priv->ieee->iw_mode, batch_mode); in ipw2100_adapter_setup()
5674 if (priv->ieee->iw_mode == IW_MODE_ADHOC) { in ipw2100_adapter_setup()
5675 err = ipw2100_set_channel(priv, priv->channel, batch_mode); in ipw2100_adapter_setup()
5684 err = ipw2100_set_tx_rates(priv, priv->tx_rates, batch_mode); in ipw2100_adapter_setup()
5688 /* Default to power mode OFF */ in ipw2100_adapter_setup()
5693 err = ipw2100_set_rts_threshold(priv, priv->rts_threshold); in ipw2100_adapter_setup()
5697 if (priv->config & CFG_STATIC_BSSID) in ipw2100_adapter_setup()
5698 bssid = priv->bssid; in ipw2100_adapter_setup()
5705 if (priv->config & CFG_STATIC_ESSID) in ipw2100_adapter_setup()
5706 err = ipw2100_set_essid(priv, priv->essid, priv->essid_len, in ipw2100_adapter_setup()
5717 if (priv->ieee->iw_mode == IW_MODE_ADHOC) { in ipw2100_adapter_setup()
5720 priv->beacon_interval, in ipw2100_adapter_setup()
5725 err = ipw2100_set_tx_power(priv, priv->tx_power); in ipw2100_adapter_setup()
5732 priv, priv->frag_threshold, batch_mode); in ipw2100_adapter_setup()
5748 /* This method is called by the network layer -- not to be confused with
5757 if (!is_valid_ether_addr(addr->sa_data)) in ipw2100_set_address()
5758 return -EADDRNOTAVAIL; in ipw2100_set_address()
5760 mutex_lock(&priv->action_mutex); in ipw2100_set_address()
5762 priv->config |= CFG_CUSTOM_MAC; in ipw2100_set_address()
5763 memcpy(priv->mac_addr, addr->sa_data, ETH_ALEN); in ipw2100_set_address()
5769 priv->reset_backoff = 0; in ipw2100_set_address()
5770 mutex_unlock(&priv->action_mutex); in ipw2100_set_address()
5771 ipw2100_reset_adapter(&priv->reset_work.work); in ipw2100_set_address()
5775 mutex_unlock(&priv->action_mutex); in ipw2100_set_address()
5783 IPW_DEBUG_INFO("dev->open\n"); in ipw2100_open()
5785 spin_lock_irqsave(&priv->low_lock, flags); in ipw2100_open()
5786 if (priv->status & STATUS_ASSOCIATED) { in ipw2100_open()
5790 spin_unlock_irqrestore(&priv->low_lock, flags); in ipw2100_open()
5804 spin_lock_irqsave(&priv->low_lock, flags); in ipw2100_close()
5806 if (priv->status & STATUS_ASSOCIATED) in ipw2100_close()
5811 while (!list_empty(&priv->tx_pend_list)) { in ipw2100_close()
5812 element = priv->tx_pend_list.next; in ipw2100_close()
5816 DEC_STAT(&priv->tx_pend_stat); in ipw2100_close()
5818 libipw_txb_free(packet->info.d_struct.txb); in ipw2100_close()
5819 packet->info.d_struct.txb = NULL; in ipw2100_close()
5821 list_add_tail(element, &priv->tx_free_list); in ipw2100_close()
5822 INC_STAT(&priv->tx_free_stat); in ipw2100_close()
5824 spin_unlock_irqrestore(&priv->low_lock, flags); in ipw2100_close()
5838 dev->stats.tx_errors++; in ipw2100_tx_timeout()
5841 if (priv->ieee->iw_mode == IW_MODE_MONITOR) in ipw2100_tx_timeout()
5846 dev->name); in ipw2100_tx_timeout()
5854 priv->ieee->wpa_enabled = value; in ipw2100_wpa_enable()
5861 struct libipw_device *ieee = priv->ieee; in ipw2100_wpa_set_auth_algs()
5862 struct libipw_security sec = { in ipw2100_wpa_set_auth_algs() local
5868 sec.auth_mode = WLAN_AUTH_SHARED_KEY; in ipw2100_wpa_set_auth_algs()
5869 ieee->open_wep = 0; in ipw2100_wpa_set_auth_algs()
5871 sec.auth_mode = WLAN_AUTH_OPEN; in ipw2100_wpa_set_auth_algs()
5872 ieee->open_wep = 1; in ipw2100_wpa_set_auth_algs()
5874 sec.auth_mode = WLAN_AUTH_LEAP; in ipw2100_wpa_set_auth_algs()
5875 ieee->open_wep = 1; in ipw2100_wpa_set_auth_algs()
5877 return -EINVAL; in ipw2100_wpa_set_auth_algs()
5879 if (ieee->set_security) in ipw2100_wpa_set_auth_algs()
5880 ieee->set_security(ieee->dev, &sec); in ipw2100_wpa_set_auth_algs()
5882 ret = -EOPNOTSUPP; in ipw2100_wpa_set_auth_algs()
5910 strlcpy(info->driver, DRV_NAME, sizeof(info->driver)); in ipw_ethtool_get_drvinfo()
5911 strlcpy(info->version, DRV_VERSION, sizeof(info->version)); in ipw_ethtool_get_drvinfo()
5916 snprintf(info->fw_version, sizeof(info->fw_version), "%s:%d:%s", in ipw_ethtool_get_drvinfo()
5917 fw_ver, priv->eeprom_version, ucode_ver); in ipw_ethtool_get_drvinfo()
5919 strlcpy(info->bus_info, pci_name(priv->pci_dev), in ipw_ethtool_get_drvinfo()
5920 sizeof(info->bus_info)); in ipw_ethtool_get_drvinfo()
5926 return (priv->status & STATUS_ASSOCIATED) ? 1 : 0; in ipw2100_ethtool_get_link()
5943 spin_lock_irqsave(&priv->low_lock, flags); in ipw2100_hang_check()
5945 if (priv->fatal_error != 0) { in ipw2100_hang_check()
5948 priv->net_dev->name); in ipw2100_hang_check()
5952 (rtc == priv->last_rtc)) { in ipw2100_hang_check()
5955 priv->net_dev->name); in ipw2100_hang_check()
5962 priv->stop_hang_check = 1; in ipw2100_hang_check()
5963 priv->hangs++; in ipw2100_hang_check()
5969 priv->last_rtc = rtc; in ipw2100_hang_check()
5971 if (!priv->stop_hang_check) in ipw2100_hang_check()
5972 schedule_delayed_work(&priv->hang_check, HZ / 2); in ipw2100_hang_check()
5974 spin_unlock_irqrestore(&priv->low_lock, flags); in ipw2100_hang_check()
5983 spin_lock_irqsave(&priv->low_lock, flags); in ipw2100_rf_kill()
5987 if (!priv->stop_rf_kill) in ipw2100_rf_kill()
5988 schedule_delayed_work(&priv->rf_kill, in ipw2100_rf_kill()
5995 if (!(priv->status & STATUS_RF_KILL_MASK)) { in ipw2100_rf_kill()
6004 spin_unlock_irqrestore(&priv->low_lock, flags); in ipw2100_rf_kill()
6030 priv->ieee = netdev_priv(dev); in ipw2100_alloc_device()
6031 priv->pci_dev = pci_dev; in ipw2100_alloc_device()
6032 priv->net_dev = dev; in ipw2100_alloc_device()
6033 priv->ioaddr = ioaddr; in ipw2100_alloc_device()
6035 priv->ieee->hard_start_xmit = ipw2100_tx; in ipw2100_alloc_device()
6036 priv->ieee->set_security = shim__set_security; in ipw2100_alloc_device()
6038 priv->ieee->perfect_rssi = -20; in ipw2100_alloc_device()
6039 priv->ieee->worst_rssi = -85; in ipw2100_alloc_device()
6041 dev->netdev_ops = &ipw2100_netdev_ops; in ipw2100_alloc_device()
6042 dev->ethtool_ops = &ipw2100_ethtool_ops; in ipw2100_alloc_device()
6043 dev->wireless_handlers = &ipw2100_wx_handler_def; in ipw2100_alloc_device()
6044 priv->wireless_data.libipw = priv->ieee; in ipw2100_alloc_device()
6045 dev->wireless_data = &priv->wireless_data; in ipw2100_alloc_device()
6046 dev->watchdog_timeo = 3 * HZ; in ipw2100_alloc_device()
6047 dev->irq = 0; in ipw2100_alloc_device()
6048 dev->min_mtu = 68; in ipw2100_alloc_device()
6049 dev->max_mtu = LIBIPW_DATA_LEN; in ipw2100_alloc_device()
6060 /* If power management is turned on, default to AUTO mode */ in ipw2100_alloc_device()
6061 priv->power_mode = IPW_POWER_AUTO; in ipw2100_alloc_device()
6064 priv->config |= CFG_CRC_CHECK; in ipw2100_alloc_device()
6066 priv->ieee->wpa_enabled = 0; in ipw2100_alloc_device()
6067 priv->ieee->drop_unencrypted = 0; in ipw2100_alloc_device()
6068 priv->ieee->privacy_invoked = 0; in ipw2100_alloc_device()
6069 priv->ieee->ieee802_1x = 1; in ipw2100_alloc_device()
6074 priv->ieee->iw_mode = IW_MODE_ADHOC; in ipw2100_alloc_device()
6078 priv->ieee->iw_mode = IW_MODE_MONITOR; in ipw2100_alloc_device()
6083 priv->ieee->iw_mode = IW_MODE_INFRA; in ipw2100_alloc_device()
6088 priv->status |= STATUS_RF_KILL_SW; in ipw2100_alloc_device()
6092 priv->config |= CFG_STATIC_CHANNEL; in ipw2100_alloc_device()
6093 priv->channel = channel; in ipw2100_alloc_device()
6097 priv->config |= CFG_ASSOCIATE; in ipw2100_alloc_device()
6099 priv->beacon_interval = DEFAULT_BEACON_INTERVAL; in ipw2100_alloc_device()
6100 priv->short_retry_limit = DEFAULT_SHORT_RETRY_LIMIT; in ipw2100_alloc_device()
6101 priv->long_retry_limit = DEFAULT_LONG_RETRY_LIMIT; in ipw2100_alloc_device()
6102 priv->rts_threshold = DEFAULT_RTS_THRESHOLD | RTS_DISABLED; in ipw2100_alloc_device()
6103 priv->frag_threshold = DEFAULT_FTS | FRAG_DISABLED; in ipw2100_alloc_device()
6104 priv->tx_power = IPW_TX_POWER_DEFAULT; in ipw2100_alloc_device()
6105 priv->tx_rates = DEFAULT_TX_RATES; in ipw2100_alloc_device()
6107 strcpy(priv->nick, "ipw2100"); in ipw2100_alloc_device()
6109 spin_lock_init(&priv->low_lock); in ipw2100_alloc_device()
6110 mutex_init(&priv->action_mutex); in ipw2100_alloc_device()
6111 mutex_init(&priv->adapter_mutex); in ipw2100_alloc_device()
6113 init_waitqueue_head(&priv->wait_command_queue); in ipw2100_alloc_device()
6117 INIT_LIST_HEAD(&priv->msg_free_list); in ipw2100_alloc_device()
6118 INIT_LIST_HEAD(&priv->msg_pend_list); in ipw2100_alloc_device()
6119 INIT_STAT(&priv->msg_free_stat); in ipw2100_alloc_device()
6120 INIT_STAT(&priv->msg_pend_stat); in ipw2100_alloc_device()
6122 INIT_LIST_HEAD(&priv->tx_free_list); in ipw2100_alloc_device()
6123 INIT_LIST_HEAD(&priv->tx_pend_list); in ipw2100_alloc_device()
6124 INIT_STAT(&priv->tx_free_stat); in ipw2100_alloc_device()
6125 INIT_STAT(&priv->tx_pend_stat); in ipw2100_alloc_device()
6127 INIT_LIST_HEAD(&priv->fw_pend_list); in ipw2100_alloc_device()
6128 INIT_STAT(&priv->fw_pend_stat); in ipw2100_alloc_device()
6130 INIT_DELAYED_WORK(&priv->reset_work, ipw2100_reset_adapter); in ipw2100_alloc_device()
6131 INIT_DELAYED_WORK(&priv->security_work, ipw2100_security_work); in ipw2100_alloc_device()
6132 INIT_DELAYED_WORK(&priv->wx_event_work, ipw2100_wx_event_work); in ipw2100_alloc_device()
6133 INIT_DELAYED_WORK(&priv->hang_check, ipw2100_hang_check); in ipw2100_alloc_device()
6134 INIT_DELAYED_WORK(&priv->rf_kill, ipw2100_rf_kill); in ipw2100_alloc_device()
6135 INIT_DELAYED_WORK(&priv->scan_event, ipw2100_scan_event); in ipw2100_alloc_device()
6137 tasklet_setup(&priv->irq_tasklet, ipw2100_irq_tasklet); in ipw2100_alloc_device()
6140 priv->stop_rf_kill = 1; in ipw2100_alloc_device()
6141 priv->stop_hang_check = 1; in ipw2100_alloc_device()
6159 IPW_DEBUG_INFO("weird - resource type is not memory\n"); in ipw2100_pci_init_one()
6160 err = -ENODEV; in ipw2100_pci_init_one()
6168 err = -EIO; in ipw2100_pci_init_one()
6177 err = -ENOMEM; in ipw2100_pci_init_one()
6194 err = dma_set_mask(&pci_dev->dev, DMA_BIT_MASK(32)); in ipw2100_pci_init_one()
6219 err = -ENODEV; in ipw2100_pci_init_one()
6223 SET_NETDEV_DEV(dev, &pci_dev->dev); in ipw2100_pci_init_one()
6225 /* Force interrupts to be shut off on the device */ in ipw2100_pci_init_one()
6226 priv->status |= STATUS_INT_ENABLED; in ipw2100_pci_init_one()
6233 err = -ENOMEM; in ipw2100_pci_init_one()
6238 err = request_irq(pci_dev->irq, in ipw2100_pci_init_one()
6239 ipw2100_interrupt, IRQF_SHARED, dev->name, priv); in ipw2100_pci_init_one()
6242 "Error calling request_irq: %d.\n", pci_dev->irq); in ipw2100_pci_init_one()
6245 dev->irq = pci_dev->irq; in ipw2100_pci_init_one()
6274 mutex_lock(&priv->action_mutex); in ipw2100_pci_init_one()
6276 IPW_DEBUG_INFO("%s: Bound to %s\n", dev->name, pci_name(pci_dev)); in ipw2100_pci_init_one()
6278 /* perform this after register_netdev so that dev->name is set */ in ipw2100_pci_init_one()
6279 err = sysfs_create_group(&pci_dev->dev.kobj, &ipw2100_attribute_group); in ipw2100_pci_init_one()
6285 if (!(priv->status & STATUS_RF_KILL_MASK)) { in ipw2100_pci_init_one()
6286 /* Enable the adapter - sends HOST_COMPLETE */ in ipw2100_pci_init_one()
6290 priv->net_dev->name); in ipw2100_pci_init_one()
6292 err = -EIO; in ipw2100_pci_init_one()
6303 priv->status |= STATUS_INITIALIZED; in ipw2100_pci_init_one()
6305 mutex_unlock(&priv->action_mutex); in ipw2100_pci_init_one()
6310 mutex_unlock(&priv->action_mutex); in ipw2100_pci_init_one()
6317 wiphy_unregister(priv->ieee->wdev.wiphy); in ipw2100_pci_init_one()
6318 kfree(priv->ieee->bg_band.channels); in ipw2100_pci_init_one()
6325 if (dev->irq) in ipw2100_pci_init_one()
6326 free_irq(dev->irq, priv); in ipw2100_pci_init_one()
6332 sysfs_remove_group(&pci_dev->dev.kobj, in ipw2100_pci_init_one()
6348 struct net_device *dev = priv->net_dev; in ipw2100_pci_remove_one()
6350 mutex_lock(&priv->action_mutex); in ipw2100_pci_remove_one()
6352 priv->status &= ~STATUS_INITIALIZED; in ipw2100_pci_remove_one()
6354 sysfs_remove_group(&pci_dev->dev.kobj, &ipw2100_attribute_group); in ipw2100_pci_remove_one()
6365 mutex_unlock(&priv->action_mutex); in ipw2100_pci_remove_one()
6367 /* Unregister the device first - this results in close() in ipw2100_pci_remove_one()
6380 free_irq(dev->irq, priv); in ipw2100_pci_remove_one()
6382 pci_iounmap(pci_dev, priv->ioaddr); in ipw2100_pci_remove_one()
6385 wiphy_unregister(priv->ieee->wdev.wiphy); in ipw2100_pci_remove_one()
6386 kfree(priv->ieee->bg_band.channels); in ipw2100_pci_remove_one()
6398 struct net_device *dev = priv->net_dev; in ipw2100_suspend()
6400 IPW_DEBUG_INFO("%s: Going into suspend...\n", dev->name); in ipw2100_suspend()
6402 mutex_lock(&priv->action_mutex); in ipw2100_suspend()
6403 if (priv->status & STATUS_INITIALIZED) { in ipw2100_suspend()
6404 /* Take down the device; powers it off, etc. */ in ipw2100_suspend()
6411 priv->suspend_at = ktime_get_boottime_seconds(); in ipw2100_suspend()
6413 mutex_unlock(&priv->action_mutex); in ipw2100_suspend()
6422 struct net_device *dev = priv->net_dev; in ipw2100_resume()
6428 mutex_lock(&priv->action_mutex); in ipw2100_resume()
6430 IPW_DEBUG_INFO("%s: Coming out of suspend...\n", dev->name); in ipw2100_resume()
6434 * re-disable the RETRY_TIMEOUT register (0x41) to keep PCI Tx retries in ipw2100_resume()
6446 priv->suspend_time = ktime_get_boottime_seconds() - priv->suspend_at; in ipw2100_resume()
6449 if (!(priv->status & STATUS_RF_KILL_SW)) in ipw2100_resume()
6452 mutex_unlock(&priv->action_mutex); in ipw2100_resume()
6461 /* Take down the device; powers it off, etc. */ in ipw2100_shutdown()
6586 * This can be called at any time. No action lock required in ipw2100_wx_get_name()
6590 if (!(priv->status & STATUS_ASSOCIATED)) in ipw2100_wx_get_name()
6591 strcpy(wrqu->name, "unassociated"); in ipw2100_wx_get_name()
6593 snprintf(wrqu->name, IFNAMSIZ, "IEEE 802.11b"); in ipw2100_wx_get_name()
6595 IPW_DEBUG_WX("Name: %s\n", wrqu->name); in ipw2100_wx_get_name()
6604 struct iw_freq *fwrq = &wrqu->freq; in ipw2100_wx_set_freq()
6607 if (priv->ieee->iw_mode == IW_MODE_INFRA) in ipw2100_wx_set_freq()
6608 return -EOPNOTSUPP; in ipw2100_wx_set_freq()
6610 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_freq()
6611 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_freq()
6612 err = -EIO; in ipw2100_wx_set_freq()
6617 if (fwrq->e == 1) { in ipw2100_wx_set_freq()
6618 if ((fwrq->m >= (int)2.412e8 && fwrq->m <= (int)2.487e8)) { in ipw2100_wx_set_freq()
6619 int f = fwrq->m / 100000; in ipw2100_wx_set_freq()
6627 fwrq->e = 0; in ipw2100_wx_set_freq()
6628 fwrq->m = c + 1; in ipw2100_wx_set_freq()
6632 if (fwrq->e > 0 || fwrq->m > 1000) { in ipw2100_wx_set_freq()
6633 err = -EOPNOTSUPP; in ipw2100_wx_set_freq()
6636 IPW_DEBUG_WX("SET Freq/Channel -> %d\n", fwrq->m); in ipw2100_wx_set_freq()
6637 err = ipw2100_set_channel(priv, fwrq->m, 0); in ipw2100_wx_set_freq()
6641 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_freq()
6650 * This can be called at any time. No action lock required in ipw2100_wx_get_freq()
6655 wrqu->freq.e = 0; in ipw2100_wx_get_freq()
6659 if (priv->config & CFG_STATIC_CHANNEL || in ipw2100_wx_get_freq()
6660 priv->status & STATUS_ASSOCIATED) in ipw2100_wx_get_freq()
6661 wrqu->freq.m = priv->channel; in ipw2100_wx_get_freq()
6663 wrqu->freq.m = 0; in ipw2100_wx_get_freq()
6665 IPW_DEBUG_WX("GET Freq/Channel -> %d\n", priv->channel); in ipw2100_wx_get_freq()
6677 IPW_DEBUG_WX("SET Mode -> %d\n", wrqu->mode); in ipw2100_wx_set_mode()
6679 if (wrqu->mode == priv->ieee->iw_mode) in ipw2100_wx_set_mode()
6682 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_mode()
6683 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_mode()
6684 err = -EIO; in ipw2100_wx_set_mode()
6688 switch (wrqu->mode) { in ipw2100_wx_set_mode()
6705 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_mode()
6714 * This can be called at any time. No action lock required in ipw2100_wx_get_mode()
6719 wrqu->mode = priv->ieee->iw_mode; in ipw2100_wx_get_mode()
6720 IPW_DEBUG_WX("GET Mode -> %d\n", wrqu->mode); in ipw2100_wx_get_mode()
6749 * This can be called at any time. No action lock required in ipw2100_wx_get_range()
6757 wrqu->data.length = sizeof(*range); in ipw2100_wx_get_range()
6769 range->throughput = 5 * 1000 * 1000; in ipw2100_wx_get_range()
6771 // range->sensitivity; /* signal level threshold range */ in ipw2100_wx_get_range()
6773 range->max_qual.qual = 100; in ipw2100_wx_get_range()
6775 range->max_qual.level = 0; in ipw2100_wx_get_range()
6776 range->max_qual.noise = 0; in ipw2100_wx_get_range()
6777 range->max_qual.updated = 7; /* Updated all three */ in ipw2100_wx_get_range()
6779 range->avg_qual.qual = 70; /* > 8% missed beacons is 'bad' */ in ipw2100_wx_get_range()
6781 range->avg_qual.level = 20 + IPW2100_RSSI_TO_DBM; in ipw2100_wx_get_range()
6782 range->avg_qual.noise = 0; in ipw2100_wx_get_range()
6783 range->avg_qual.updated = 7; /* Updated all three */ in ipw2100_wx_get_range()
6785 range->num_bitrates = RATE_COUNT; in ipw2100_wx_get_range()
6788 range->bitrate[i] = ipw2100_bg_rates[i].bitrate * 100 * 1000; in ipw2100_wx_get_range()
6791 range->min_rts = MIN_RTS_THRESHOLD; in ipw2100_wx_get_range()
6792 range->max_rts = MAX_RTS_THRESHOLD; in ipw2100_wx_get_range()
6793 range->min_frag = MIN_FRAG_THRESHOLD; in ipw2100_wx_get_range()
6794 range->max_frag = MAX_FRAG_THRESHOLD; in ipw2100_wx_get_range()
6796 range->min_pmp = period_duration[0]; /* Minimal PM period */ in ipw2100_wx_get_range()
6797 range->max_pmp = period_duration[POWER_MODES - 1]; /* Maximal PM period */ in ipw2100_wx_get_range()
6798 range->min_pmt = timeout_duration[POWER_MODES - 1]; /* Minimal PM timeout */ in ipw2100_wx_get_range()
6799 range->max_pmt = timeout_duration[0]; /* Maximal PM timeout */ in ipw2100_wx_get_range()
6802 range->pmp_flags = IW_POWER_PERIOD; in ipw2100_wx_get_range()
6804 range->pmt_flags = IW_POWER_TIMEOUT; in ipw2100_wx_get_range()
6806 range->pm_capa = IW_POWER_TIMEOUT | IW_POWER_PERIOD; in ipw2100_wx_get_range()
6808 range->encoding_size[0] = 5; in ipw2100_wx_get_range()
6809 range->encoding_size[1] = 13; /* Different token sizes */ in ipw2100_wx_get_range()
6810 range->num_encoding_sizes = 2; /* Number of entry in the list */ in ipw2100_wx_get_range()
6811 range->max_encoding_tokens = WEP_KEYS; /* Max number of tokens */ in ipw2100_wx_get_range()
6812 // range->encoding_login_index; /* token index for login token */ in ipw2100_wx_get_range()
6814 if (priv->ieee->iw_mode == IW_MODE_ADHOC) { in ipw2100_wx_get_range()
6815 range->txpower_capa = IW_TXPOW_DBM; in ipw2100_wx_get_range()
6816 range->num_txpower = IW_MAX_TXPOWER; in ipw2100_wx_get_range()
6819 i++, level -= in ipw2100_wx_get_range()
6820 ((IPW_TX_POWER_MAX_DBM - in ipw2100_wx_get_range()
6821 IPW_TX_POWER_MIN_DBM) * 16) / (IW_MAX_TXPOWER - 1)) in ipw2100_wx_get_range()
6822 range->txpower[i] = level / 16; in ipw2100_wx_get_range()
6824 range->txpower_capa = 0; in ipw2100_wx_get_range()
6825 range->num_txpower = 0; in ipw2100_wx_get_range()
6829 range->we_version_compiled = WIRELESS_EXT; in ipw2100_wx_get_range()
6830 range->we_version_source = 18; in ipw2100_wx_get_range()
6832 // range->retry_capa; /* What retry options are supported */ in ipw2100_wx_get_range()
6833 // range->retry_flags; /* How to decode max/min retry limit */ in ipw2100_wx_get_range()
6834 // range->r_time_flags; /* How to decode max/min retry life */ in ipw2100_wx_get_range()
6835 // range->min_retry; /* Minimal number of retries */ in ipw2100_wx_get_range()
6836 // range->max_retry; /* Maximal number of retries */ in ipw2100_wx_get_range()
6837 // range->min_r_time; /* Minimal retry lifetime */ in ipw2100_wx_get_range()
6838 // range->max_r_time; /* Maximal retry lifetime */ in ipw2100_wx_get_range()
6840 range->num_channels = FREQ_COUNT; in ipw2100_wx_get_range()
6845 // if (local->channel_mask & (1 << i)) { in ipw2100_wx_get_range()
6846 range->freq[val].i = i + 1; in ipw2100_wx_get_range()
6847 range->freq[val].m = ipw2100_frequencies[i] * 100000; in ipw2100_wx_get_range()
6848 range->freq[val].e = 1; in ipw2100_wx_get_range()
6854 range->num_frequency = val; in ipw2100_wx_get_range()
6857 range->event_capa[0] = (IW_EVENT_CAPA_K_0 | in ipw2100_wx_get_range()
6859 range->event_capa[1] = IW_EVENT_CAPA_K_1; in ipw2100_wx_get_range()
6861 range->enc_capa = IW_ENC_CAPA_WPA | IW_ENC_CAPA_WPA2 | in ipw2100_wx_get_range()
6877 if (wrqu->ap_addr.sa_family != ARPHRD_ETHER) in ipw2100_wx_set_wap()
6878 return -EINVAL; in ipw2100_wx_set_wap()
6880 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_wap()
6881 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_wap()
6882 err = -EIO; in ipw2100_wx_set_wap()
6886 if (is_broadcast_ether_addr(wrqu->ap_addr.sa_data) || in ipw2100_wx_set_wap()
6887 is_zero_ether_addr(wrqu->ap_addr.sa_data)) { in ipw2100_wx_set_wap()
6889 IPW_DEBUG_WX("exit - disable mandatory BSSID\n"); in ipw2100_wx_set_wap()
6890 priv->config &= ~CFG_STATIC_BSSID; in ipw2100_wx_set_wap()
6895 priv->config |= CFG_STATIC_BSSID; in ipw2100_wx_set_wap()
6896 memcpy(priv->mandatory_bssid_mac, wrqu->ap_addr.sa_data, ETH_ALEN); in ipw2100_wx_set_wap()
6898 err = ipw2100_set_mandatory_bssid(priv, wrqu->ap_addr.sa_data, 0); in ipw2100_wx_set_wap()
6900 IPW_DEBUG_WX("SET BSSID -> %pM\n", wrqu->ap_addr.sa_data); in ipw2100_wx_set_wap()
6903 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_wap()
6912 * This can be called at any time. No action lock required in ipw2100_wx_get_wap()
6919 if (priv->config & CFG_STATIC_BSSID || priv->status & STATUS_ASSOCIATED) { in ipw2100_wx_get_wap()
6920 wrqu->ap_addr.sa_family = ARPHRD_ETHER; in ipw2100_wx_get_wap()
6921 memcpy(wrqu->ap_addr.sa_data, priv->bssid, ETH_ALEN); in ipw2100_wx_get_wap()
6923 eth_zero_addr(wrqu->ap_addr.sa_data); in ipw2100_wx_get_wap()
6925 IPW_DEBUG_WX("Getting WAP BSSID: %pM\n", wrqu->ap_addr.sa_data); in ipw2100_wx_get_wap()
6938 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_essid()
6939 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_essid()
6940 err = -EIO; in ipw2100_wx_set_essid()
6944 if (wrqu->essid.flags && wrqu->essid.length) { in ipw2100_wx_set_essid()
6945 length = wrqu->essid.length; in ipw2100_wx_set_essid()
6951 priv->config &= ~CFG_STATIC_ESSID; in ipw2100_wx_set_essid()
6958 priv->config |= CFG_STATIC_ESSID; in ipw2100_wx_set_essid()
6960 if (priv->essid_len == length && !memcmp(priv->essid, extra, length)) { in ipw2100_wx_set_essid()
6968 priv->essid_len = length; in ipw2100_wx_set_essid()
6969 memcpy(priv->essid, essid, priv->essid_len); in ipw2100_wx_set_essid()
6974 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_essid()
6983 * This can be called at any time. No action lock required in ipw2100_wx_get_essid()
6990 if (priv->config & CFG_STATIC_ESSID || priv->status & STATUS_ASSOCIATED) { in ipw2100_wx_get_essid()
6992 priv->essid_len, priv->essid); in ipw2100_wx_get_essid()
6993 memcpy(extra, priv->essid, priv->essid_len); in ipw2100_wx_get_essid()
6994 wrqu->essid.length = priv->essid_len; in ipw2100_wx_get_essid()
6995 wrqu->essid.flags = 1; /* active */ in ipw2100_wx_get_essid()
6998 wrqu->essid.length = 0; in ipw2100_wx_get_essid()
6999 wrqu->essid.flags = 0; /* active */ in ipw2100_wx_get_essid()
7010 * This can be called at any time. No action lock required in ipw2100_wx_set_nick()
7015 if (wrqu->data.length > IW_ESSID_MAX_SIZE) in ipw2100_wx_set_nick()
7016 return -E2BIG; in ipw2100_wx_set_nick()
7018 wrqu->data.length = min_t(size_t, wrqu->data.length, sizeof(priv->nick)); in ipw2100_wx_set_nick()
7019 memset(priv->nick, 0, sizeof(priv->nick)); in ipw2100_wx_set_nick()
7020 memcpy(priv->nick, extra, wrqu->data.length); in ipw2100_wx_set_nick()
7022 IPW_DEBUG_WX("SET Nickname -> %s\n", priv->nick); in ipw2100_wx_set_nick()
7032 * This can be called at any time. No action lock required in ipw2100_wx_get_nick()
7037 wrqu->data.length = strlen(priv->nick); in ipw2100_wx_get_nick()
7038 memcpy(extra, priv->nick, wrqu->data.length); in ipw2100_wx_get_nick()
7039 wrqu->data.flags = 1; /* active */ in ipw2100_wx_get_nick()
7041 IPW_DEBUG_WX("GET Nickname -> %s\n", extra); in ipw2100_wx_get_nick()
7051 u32 target_rate = wrqu->bitrate.value; in ipw2100_wx_set_rate()
7055 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_rate()
7056 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_rate()
7057 err = -EIO; in ipw2100_wx_set_rate()
7064 (!wrqu->bitrate.fixed && target_rate > 1000000)) in ipw2100_wx_set_rate()
7067 (!wrqu->bitrate.fixed && target_rate > 2000000)) in ipw2100_wx_set_rate()
7070 (!wrqu->bitrate.fixed && target_rate > 5500000)) in ipw2100_wx_set_rate()
7073 (!wrqu->bitrate.fixed && target_rate > 11000000)) in ipw2100_wx_set_rate()
7080 IPW_DEBUG_WX("SET Rate -> %04X\n", rate); in ipw2100_wx_set_rate()
7082 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_rate()
7095 if (!(priv->status & STATUS_ENABLED) || in ipw2100_wx_get_rate()
7096 priv->status & STATUS_RF_KILL_MASK || in ipw2100_wx_get_rate()
7097 !(priv->status & STATUS_ASSOCIATED)) { in ipw2100_wx_get_rate()
7098 wrqu->bitrate.value = 0; in ipw2100_wx_get_rate()
7102 mutex_lock(&priv->action_mutex); in ipw2100_wx_get_rate()
7103 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_get_rate()
7104 err = -EIO; in ipw2100_wx_get_rate()
7116 wrqu->bitrate.value = 1000000; in ipw2100_wx_get_rate()
7119 wrqu->bitrate.value = 2000000; in ipw2100_wx_get_rate()
7122 wrqu->bitrate.value = 5500000; in ipw2100_wx_get_rate()
7125 wrqu->bitrate.value = 11000000; in ipw2100_wx_get_rate()
7128 wrqu->bitrate.value = 0; in ipw2100_wx_get_rate()
7131 IPW_DEBUG_WX("GET Rate -> %d\n", wrqu->bitrate.value); in ipw2100_wx_get_rate()
7134 mutex_unlock(&priv->action_mutex); in ipw2100_wx_get_rate()
7146 if (wrqu->rts.fixed == 0) in ipw2100_wx_set_rts()
7147 return -EINVAL; in ipw2100_wx_set_rts()
7149 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_rts()
7150 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_rts()
7151 err = -EIO; in ipw2100_wx_set_rts()
7155 if (wrqu->rts.disabled) in ipw2100_wx_set_rts()
7156 value = priv->rts_threshold | RTS_DISABLED; in ipw2100_wx_set_rts()
7158 if (wrqu->rts.value < 1 || wrqu->rts.value > 2304) { in ipw2100_wx_set_rts()
7159 err = -EINVAL; in ipw2100_wx_set_rts()
7162 value = wrqu->rts.value; in ipw2100_wx_set_rts()
7167 IPW_DEBUG_WX("SET RTS Threshold -> 0x%08X\n", value); in ipw2100_wx_set_rts()
7169 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_rts()
7178 * This can be called at any time. No action lock required in ipw2100_wx_get_rts()
7183 wrqu->rts.value = priv->rts_threshold & ~RTS_DISABLED; in ipw2100_wx_get_rts()
7184 wrqu->rts.fixed = 1; /* no auto select */ in ipw2100_wx_get_rts()
7187 wrqu->rts.disabled = (priv->rts_threshold & RTS_DISABLED) ? 1 : 0; in ipw2100_wx_get_rts()
7189 IPW_DEBUG_WX("GET RTS Threshold -> 0x%08X\n", wrqu->rts.value); in ipw2100_wx_get_rts()
7201 if (ipw_radio_kill_sw(priv, wrqu->txpower.disabled)) in ipw2100_wx_set_txpow()
7202 return -EINPROGRESS; in ipw2100_wx_set_txpow()
7204 if (priv->ieee->iw_mode != IW_MODE_ADHOC) in ipw2100_wx_set_txpow()
7207 if ((wrqu->txpower.flags & IW_TXPOW_TYPE) != IW_TXPOW_DBM) in ipw2100_wx_set_txpow()
7208 return -EINVAL; in ipw2100_wx_set_txpow()
7210 if (wrqu->txpower.fixed == 0) in ipw2100_wx_set_txpow()
7213 if (wrqu->txpower.value < IPW_TX_POWER_MIN_DBM || in ipw2100_wx_set_txpow()
7214 wrqu->txpower.value > IPW_TX_POWER_MAX_DBM) in ipw2100_wx_set_txpow()
7215 return -EINVAL; in ipw2100_wx_set_txpow()
7217 value = wrqu->txpower.value; in ipw2100_wx_set_txpow()
7220 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_txpow()
7221 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_txpow()
7222 err = -EIO; in ipw2100_wx_set_txpow()
7228 IPW_DEBUG_WX("SET TX Power -> %d\n", value); in ipw2100_wx_set_txpow()
7231 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_txpow()
7240 * This can be called at any time. No action lock required in ipw2100_wx_get_txpow()
7245 wrqu->txpower.disabled = (priv->status & STATUS_RF_KILL_MASK) ? 1 : 0; in ipw2100_wx_get_txpow()
7247 if (priv->tx_power == IPW_TX_POWER_DEFAULT) { in ipw2100_wx_get_txpow()
7248 wrqu->txpower.fixed = 0; in ipw2100_wx_get_txpow()
7249 wrqu->txpower.value = IPW_TX_POWER_MAX_DBM; in ipw2100_wx_get_txpow()
7251 wrqu->txpower.fixed = 1; in ipw2100_wx_get_txpow()
7252 wrqu->txpower.value = priv->tx_power; in ipw2100_wx_get_txpow()
7255 wrqu->txpower.flags = IW_TXPOW_DBM; in ipw2100_wx_get_txpow()
7257 IPW_DEBUG_WX("GET TX Power -> %d\n", wrqu->txpower.value); in ipw2100_wx_get_txpow()
7267 * This can be called at any time. No action lock required in ipw2100_wx_set_frag()
7272 if (!wrqu->frag.fixed) in ipw2100_wx_set_frag()
7273 return -EINVAL; in ipw2100_wx_set_frag()
7275 if (wrqu->frag.disabled) { in ipw2100_wx_set_frag()
7276 priv->frag_threshold |= FRAG_DISABLED; in ipw2100_wx_set_frag()
7277 priv->ieee->fts = DEFAULT_FTS; in ipw2100_wx_set_frag()
7279 if (wrqu->frag.value < MIN_FRAG_THRESHOLD || in ipw2100_wx_set_frag()
7280 wrqu->frag.value > MAX_FRAG_THRESHOLD) in ipw2100_wx_set_frag()
7281 return -EINVAL; in ipw2100_wx_set_frag()
7283 priv->ieee->fts = wrqu->frag.value & ~0x1; in ipw2100_wx_set_frag()
7284 priv->frag_threshold = priv->ieee->fts; in ipw2100_wx_set_frag()
7287 IPW_DEBUG_WX("SET Frag Threshold -> %d\n", priv->ieee->fts); in ipw2100_wx_set_frag()
7297 * This can be called at any time. No action lock required in ipw2100_wx_get_frag()
7301 wrqu->frag.value = priv->frag_threshold & ~FRAG_DISABLED; in ipw2100_wx_get_frag()
7302 wrqu->frag.fixed = 0; /* no auto select */ in ipw2100_wx_get_frag()
7303 wrqu->frag.disabled = (priv->frag_threshold & FRAG_DISABLED) ? 1 : 0; in ipw2100_wx_get_frag()
7305 IPW_DEBUG_WX("GET Frag Threshold -> %d\n", wrqu->frag.value); in ipw2100_wx_get_frag()
7317 if (wrqu->retry.flags & IW_RETRY_LIFETIME || wrqu->retry.disabled) in ipw2100_wx_set_retry()
7318 return -EINVAL; in ipw2100_wx_set_retry()
7320 if (!(wrqu->retry.flags & IW_RETRY_LIMIT)) in ipw2100_wx_set_retry()
7323 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_retry()
7324 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_retry()
7325 err = -EIO; in ipw2100_wx_set_retry()
7329 if (wrqu->retry.flags & IW_RETRY_SHORT) { in ipw2100_wx_set_retry()
7330 err = ipw2100_set_short_retry(priv, wrqu->retry.value); in ipw2100_wx_set_retry()
7331 IPW_DEBUG_WX("SET Short Retry Limit -> %d\n", in ipw2100_wx_set_retry()
7332 wrqu->retry.value); in ipw2100_wx_set_retry()
7336 if (wrqu->retry.flags & IW_RETRY_LONG) { in ipw2100_wx_set_retry()
7337 err = ipw2100_set_long_retry(priv, wrqu->retry.value); in ipw2100_wx_set_retry()
7338 IPW_DEBUG_WX("SET Long Retry Limit -> %d\n", in ipw2100_wx_set_retry()
7339 wrqu->retry.value); in ipw2100_wx_set_retry()
7343 err = ipw2100_set_short_retry(priv, wrqu->retry.value); in ipw2100_wx_set_retry()
7345 err = ipw2100_set_long_retry(priv, wrqu->retry.value); in ipw2100_wx_set_retry()
7347 IPW_DEBUG_WX("SET Both Retry Limits -> %d\n", wrqu->retry.value); in ipw2100_wx_set_retry()
7350 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_retry()
7359 * This can be called at any time. No action lock required in ipw2100_wx_get_retry()
7364 wrqu->retry.disabled = 0; /* can't be disabled */ in ipw2100_wx_get_retry()
7366 if ((wrqu->retry.flags & IW_RETRY_TYPE) == IW_RETRY_LIFETIME) in ipw2100_wx_get_retry()
7367 return -EINVAL; in ipw2100_wx_get_retry()
7369 if (wrqu->retry.flags & IW_RETRY_LONG) { in ipw2100_wx_get_retry()
7370 wrqu->retry.flags = IW_RETRY_LIMIT | IW_RETRY_LONG; in ipw2100_wx_get_retry()
7371 wrqu->retry.value = priv->long_retry_limit; in ipw2100_wx_get_retry()
7373 wrqu->retry.flags = in ipw2100_wx_get_retry()
7374 (priv->short_retry_limit != in ipw2100_wx_get_retry()
7375 priv->long_retry_limit) ? in ipw2100_wx_get_retry()
7378 wrqu->retry.value = priv->short_retry_limit; in ipw2100_wx_get_retry()
7381 IPW_DEBUG_WX("GET Retry -> %d\n", wrqu->retry.value); in ipw2100_wx_get_retry()
7393 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_scan()
7394 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_scan()
7395 err = -EIO; in ipw2100_wx_set_scan()
7401 priv->user_requested_scan = 1; in ipw2100_wx_set_scan()
7410 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_scan()
7419 * This can be called at any time. No action lock required in ipw2100_wx_get_scan()
7423 return libipw_wx_get_scan(priv->ieee, info, wrqu, extra); in ipw2100_wx_get_scan()
7427 * Implementation based on code in hostap-driver v0.1.3 hostap_ioctl.c
7438 return libipw_wx_set_encode(priv->ieee, info, wrqu, key); in ipw2100_wx_set_encode()
7446 * This can be called at any time. No action lock required in ipw2100_wx_get_encode()
7450 return libipw_wx_get_encode(priv->ieee, info, wrqu, key); in ipw2100_wx_get_encode()
7460 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_power()
7461 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_power()
7462 err = -EIO; in ipw2100_wx_set_power()
7466 if (wrqu->power.disabled) { in ipw2100_wx_set_power()
7467 priv->power_mode = IPW_POWER_LEVEL(priv->power_mode); in ipw2100_wx_set_power()
7469 IPW_DEBUG_WX("SET Power Management Mode -> off\n"); in ipw2100_wx_set_power()
7473 switch (wrqu->power.flags & IW_POWER_MODE) { in ipw2100_wx_set_power()
7480 wrqu->power.flags); in ipw2100_wx_set_power()
7481 err = -EOPNOTSUPP; in ipw2100_wx_set_power()
7485 /* If the user hasn't specified a power management mode yet, default in ipw2100_wx_set_power()
7487 priv->power_mode = IPW_POWER_ENABLED | priv->power_mode; in ipw2100_wx_set_power()
7488 err = ipw2100_set_power_mode(priv, IPW_POWER_LEVEL(priv->power_mode)); in ipw2100_wx_set_power()
7490 IPW_DEBUG_WX("SET Power Management Mode -> 0x%02X\n", priv->power_mode); in ipw2100_wx_set_power()
7493 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_power()
7503 * This can be called at any time. No action lock required in ipw2100_wx_get_power()
7508 if (!(priv->power_mode & IPW_POWER_ENABLED)) in ipw2100_wx_get_power()
7509 wrqu->power.disabled = 1; in ipw2100_wx_get_power()
7511 wrqu->power.disabled = 0; in ipw2100_wx_get_power()
7512 wrqu->power.flags = 0; in ipw2100_wx_get_power()
7515 IPW_DEBUG_WX("GET Power Management Mode -> %02X\n", priv->power_mode); in ipw2100_wx_get_power()
7521 * WE-18 WPA support
7531 struct libipw_device *ieee = priv->ieee; in ipw2100_wx_set_genie()
7534 if (!ieee->wpa_enabled) in ipw2100_wx_set_genie()
7535 return -EOPNOTSUPP; in ipw2100_wx_set_genie()
7537 if (wrqu->data.length > MAX_WPA_IE_LEN || in ipw2100_wx_set_genie()
7538 (wrqu->data.length && extra == NULL)) in ipw2100_wx_set_genie()
7539 return -EINVAL; in ipw2100_wx_set_genie()
7541 if (wrqu->data.length) { in ipw2100_wx_set_genie()
7542 buf = kmemdup(extra, wrqu->data.length, GFP_KERNEL); in ipw2100_wx_set_genie()
7544 return -ENOMEM; in ipw2100_wx_set_genie()
7546 kfree(ieee->wpa_ie); in ipw2100_wx_set_genie()
7547 ieee->wpa_ie = buf; in ipw2100_wx_set_genie()
7548 ieee->wpa_ie_len = wrqu->data.length; in ipw2100_wx_set_genie()
7550 kfree(ieee->wpa_ie); in ipw2100_wx_set_genie()
7551 ieee->wpa_ie = NULL; in ipw2100_wx_set_genie()
7552 ieee->wpa_ie_len = 0; in ipw2100_wx_set_genie()
7555 ipw2100_wpa_assoc_frame(priv, ieee->wpa_ie, ieee->wpa_ie_len); in ipw2100_wx_set_genie()
7566 struct libipw_device *ieee = priv->ieee; in ipw2100_wx_get_genie()
7568 if (ieee->wpa_ie_len == 0 || ieee->wpa_ie == NULL) { in ipw2100_wx_get_genie()
7569 wrqu->data.length = 0; in ipw2100_wx_get_genie()
7573 if (wrqu->data.length < ieee->wpa_ie_len) in ipw2100_wx_get_genie()
7574 return -E2BIG; in ipw2100_wx_get_genie()
7576 wrqu->data.length = ieee->wpa_ie_len; in ipw2100_wx_get_genie()
7577 memcpy(extra, ieee->wpa_ie, ieee->wpa_ie_len); in ipw2100_wx_get_genie()
7588 struct libipw_device *ieee = priv->ieee; in ipw2100_wx_set_auth()
7589 struct iw_param *param = &wrqu->param; in ipw2100_wx_set_auth()
7594 switch (param->flags & IW_AUTH_INDEX) { in ipw2100_wx_set_auth()
7605 crypt = priv->ieee->crypt_info.crypt[priv->ieee->crypt_info.tx_keyidx]; in ipw2100_wx_set_auth()
7606 if (!crypt || !crypt->ops->set_flags || !crypt->ops->get_flags) in ipw2100_wx_set_auth()
7609 flags = crypt->ops->get_flags(crypt->priv); in ipw2100_wx_set_auth()
7611 if (param->value) in ipw2100_wx_set_auth()
7616 crypt->ops->set_flags(flags, crypt->priv); in ipw2100_wx_set_auth()
7628 * used, drop_unencrypted is set to false, else true -- we in ipw2100_wx_set_auth()
7632 struct libipw_security sec = { in ipw2100_wx_set_auth() local
7634 .enabled = param->value, in ipw2100_wx_set_auth()
7636 priv->ieee->drop_unencrypted = param->value; in ipw2100_wx_set_auth()
7640 if (!param->value) { in ipw2100_wx_set_auth()
7641 sec.flags |= SEC_LEVEL; in ipw2100_wx_set_auth()
7642 sec.level = SEC_LEVEL_0; in ipw2100_wx_set_auth()
7644 sec.flags |= SEC_LEVEL; in ipw2100_wx_set_auth()
7645 sec.level = SEC_LEVEL_1; in ipw2100_wx_set_auth()
7647 if (priv->ieee->set_security) in ipw2100_wx_set_auth()
7648 priv->ieee->set_security(priv->ieee->dev, &sec); in ipw2100_wx_set_auth()
7653 ret = ipw2100_wpa_set_auth_algs(priv, param->value); in ipw2100_wx_set_auth()
7657 ret = ipw2100_wpa_enable(priv, param->value); in ipw2100_wx_set_auth()
7661 ieee->ieee802_1x = param->value; in ipw2100_wx_set_auth()
7666 ieee->privacy_invoked = param->value; in ipw2100_wx_set_auth()
7670 return -EOPNOTSUPP; in ipw2100_wx_set_auth()
7681 struct libipw_device *ieee = priv->ieee; in ipw2100_wx_get_auth()
7683 struct iw_param *param = &wrqu->param; in ipw2100_wx_get_auth()
7685 switch (param->flags & IW_AUTH_INDEX) { in ipw2100_wx_get_auth()
7696 crypt = priv->ieee->crypt_info.crypt[priv->ieee->crypt_info.tx_keyidx]; in ipw2100_wx_get_auth()
7697 if (!crypt || !crypt->ops->get_flags) { in ipw2100_wx_get_auth()
7703 param->value = (crypt->ops->get_flags(crypt->priv) & in ipw2100_wx_get_auth()
7709 param->value = ieee->drop_unencrypted; in ipw2100_wx_get_auth()
7713 param->value = priv->ieee->sec.auth_mode; in ipw2100_wx_get_auth()
7717 param->value = ieee->wpa_enabled; in ipw2100_wx_get_auth()
7721 param->value = ieee->ieee802_1x; in ipw2100_wx_get_auth()
7726 param->value = ieee->privacy_invoked; in ipw2100_wx_get_auth()
7730 return -EOPNOTSUPP; in ipw2100_wx_get_auth()
7741 return libipw_wx_set_encodeext(priv->ieee, info, wrqu, extra); in ipw2100_wx_set_encodeext()
7750 return libipw_wx_get_encodeext(priv->ieee, info, wrqu, extra); in ipw2100_wx_get_encodeext()
7761 switch (mlme->cmd) { in ipw2100_wx_set_mlme()
7771 return -EOPNOTSUPP; in ipw2100_wx_set_mlme()
7791 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_promisc()
7792 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_promisc()
7793 err = -EIO; in ipw2100_wx_set_promisc()
7798 if (priv->ieee->iw_mode == IW_MODE_MONITOR) { in ipw2100_wx_set_promisc()
7802 priv->channel = parms[1]; in ipw2100_wx_set_promisc()
7805 if (priv->ieee->iw_mode == IW_MODE_MONITOR) in ipw2100_wx_set_promisc()
7806 err = ipw2100_switch_mode(priv, priv->last_mode); in ipw2100_wx_set_promisc()
7809 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_promisc()
7818 if (priv->status & STATUS_INITIALIZED) in ipw2100_wx_reset()
7832 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_powermode()
7833 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_powermode()
7834 err = -EIO; in ipw2100_wx_set_powermode()
7841 if (IPW_POWER_LEVEL(priv->power_mode) != mode) in ipw2100_wx_set_powermode()
7844 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_powermode()
7854 * This can be called at any time. No action lock required in ipw2100_wx_get_powermode()
7858 int level = IPW_POWER_LEVEL(priv->power_mode); in ipw2100_wx_get_powermode()
7861 if (!(priv->power_mode & IPW_POWER_ENABLED)) { in ipw2100_wx_get_powermode()
7863 "Power save level: %d (Off)", level); in ipw2100_wx_get_powermode()
7868 "Power save level: %d (None)", level); in ipw2100_wx_get_powermode()
7872 "Power save level: %d (Auto)", level); in ipw2100_wx_get_powermode()
7875 timeout = timeout_duration[level - 1] / 1000; in ipw2100_wx_get_powermode()
7876 period = period_duration[level - 1] / 1000; in ipw2100_wx_get_powermode()
7878 "Power save level: %d " in ipw2100_wx_get_powermode()
7884 wrqu->data.length = strlen(extra) + 1; in ipw2100_wx_get_powermode()
7896 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_preamble()
7897 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_preamble()
7898 err = -EIO; in ipw2100_wx_set_preamble()
7903 priv->config |= CFG_LONG_PREAMBLE; in ipw2100_wx_set_preamble()
7905 priv->config &= ~CFG_LONG_PREAMBLE; in ipw2100_wx_set_preamble()
7907 err = -EINVAL; in ipw2100_wx_set_preamble()
7914 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_preamble()
7923 * This can be called at any time. No action lock required in ipw2100_wx_get_preamble()
7928 if (priv->config & CFG_LONG_PREAMBLE) in ipw2100_wx_get_preamble()
7929 snprintf(wrqu->name, IFNAMSIZ, "long (1)"); in ipw2100_wx_get_preamble()
7931 snprintf(wrqu->name, IFNAMSIZ, "auto (0)"); in ipw2100_wx_get_preamble()
7944 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_crc_check()
7945 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_crc_check()
7946 err = -EIO; in ipw2100_wx_set_crc_check()
7951 priv->config |= CFG_CRC_CHECK; in ipw2100_wx_set_crc_check()
7953 priv->config &= ~CFG_CRC_CHECK; in ipw2100_wx_set_crc_check()
7955 err = -EINVAL; in ipw2100_wx_set_crc_check()
7961 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_crc_check()
7970 * This can be called at any time. No action lock required in ipw2100_wx_get_crc_check()
7975 if (priv->config & CFG_CRC_CHECK) in ipw2100_wx_get_crc_check()
7976 snprintf(wrqu->name, IFNAMSIZ, "CRC checked (1)"); in ipw2100_wx_get_crc_check()
7978 snprintf(wrqu->name, IFNAMSIZ, "CRC ignored (0)"); in ipw2100_wx_get_crc_check()
8114 wstats = &priv->wstats; in ipw2100_wx_wireless_stats()
8121 if (!(priv->status & STATUS_ASSOCIATED)) { in ipw2100_wx_wireless_stats()
8122 wstats->miss.beacon = 0; in ipw2100_wx_wireless_stats()
8123 wstats->discard.retries = 0; in ipw2100_wx_wireless_stats()
8124 wstats->qual.qual = 0; in ipw2100_wx_wireless_stats()
8125 wstats->qual.level = 0; in ipw2100_wx_wireless_stats()
8126 wstats->qual.noise = 0; in ipw2100_wx_wireless_stats()
8127 wstats->qual.updated = 7; in ipw2100_wx_wireless_stats()
8128 wstats->qual.updated |= IW_QUAL_NOISE_INVALID | in ipw2100_wx_wireless_stats()
8138 if (!(priv->status & STATUS_ASSOCIATED)) { in ipw2100_wx_wireless_stats()
8139 wstats->qual.qual = 0; in ipw2100_wx_wireless_stats()
8140 wstats->qual.level = 0; in ipw2100_wx_wireless_stats()
8145 wstats->qual.level = rssi + IPW2100_RSSI_TO_DBM; in ipw2100_wx_wireless_stats()
8149 rssi_qual = (rssi - 10) * (FAIR - POOR) / 5 + POOR; in ipw2100_wx_wireless_stats()
8151 rssi_qual = (rssi - 15) * (GOOD - FAIR) / 5 + FAIR; in ipw2100_wx_wireless_stats()
8153 rssi_qual = (rssi - 20) * (VERY_GOOD - GOOD) / in ipw2100_wx_wireless_stats()
8156 rssi_qual = (rssi - 30) * (PERFECT - VERY_GOOD) / in ipw2100_wx_wireless_stats()
8164 tx_qual = (90 - tx_retries) * POOR / 15; in ipw2100_wx_wireless_stats()
8166 tx_qual = (75 - tx_retries) * (FAIR - POOR) / 5 + POOR; in ipw2100_wx_wireless_stats()
8168 tx_qual = (70 - tx_retries) * (GOOD - FAIR) / 5 + FAIR; in ipw2100_wx_wireless_stats()
8170 tx_qual = (65 - tx_retries) * (VERY_GOOD - GOOD) / in ipw2100_wx_wireless_stats()
8173 tx_qual = (50 - tx_retries) * in ipw2100_wx_wireless_stats()
8174 (PERFECT - VERY_GOOD) / 50 + VERY_GOOD; in ipw2100_wx_wireless_stats()
8177 beacon_qual = (60 - missed_beacons) * POOR / 10; in ipw2100_wx_wireless_stats()
8179 beacon_qual = (50 - missed_beacons) * (FAIR - POOR) / in ipw2100_wx_wireless_stats()
8182 beacon_qual = (40 - missed_beacons) * (GOOD - FAIR) / in ipw2100_wx_wireless_stats()
8185 beacon_qual = (32 - missed_beacons) * in ipw2100_wx_wireless_stats()
8186 (VERY_GOOD - GOOD) / 20 + GOOD; in ipw2100_wx_wireless_stats()
8188 beacon_qual = (20 - missed_beacons) * in ipw2100_wx_wireless_stats()
8189 (PERFECT - VERY_GOOD) / 20 + VERY_GOOD; in ipw2100_wx_wireless_stats()
8205 wstats->qual.qual = quality; in ipw2100_wx_wireless_stats()
8206 wstats->qual.level = rssi + IPW2100_RSSI_TO_DBM; in ipw2100_wx_wireless_stats()
8209 wstats->qual.noise = 0; in ipw2100_wx_wireless_stats()
8210 wstats->qual.updated = 7; in ipw2100_wx_wireless_stats()
8211 wstats->qual.updated |= IW_QUAL_NOISE_INVALID; in ipw2100_wx_wireless_stats()
8214 wstats->miss.beacon = missed_beacons; in ipw2100_wx_wireless_stats()
8219 wstats->discard.retries = tx_failures; in ipw2100_wx_wireless_stats()
8246 if (priv->status & STATUS_STOPPING) in ipw2100_wx_event_work()
8249 mutex_lock(&priv->action_mutex); in ipw2100_wx_event_work()
8253 mutex_unlock(&priv->action_mutex); in ipw2100_wx_event_work()
8258 if (!(priv->status & (STATUS_ASSOCIATING | STATUS_ASSOCIATED)) || in ipw2100_wx_event_work()
8259 priv->status & STATUS_RF_KILL_MASK || in ipw2100_wx_event_work()
8261 &priv->bssid, &len)) { in ipw2100_wx_event_work()
8266 memcpy(wrqu.ap_addr.sa_data, priv->bssid, ETH_ALEN); in ipw2100_wx_event_work()
8267 memcpy(priv->ieee->bssid, priv->bssid, ETH_ALEN); in ipw2100_wx_event_work()
8268 priv->status &= ~STATUS_ASSOCIATING; in ipw2100_wx_event_work()
8269 priv->status |= STATUS_ASSOCIATED; in ipw2100_wx_event_work()
8270 netif_carrier_on(priv->net_dev); in ipw2100_wx_event_work()
8271 netif_wake_queue(priv->net_dev); in ipw2100_wx_event_work()
8274 if (!(priv->status & STATUS_ASSOCIATED)) { in ipw2100_wx_event_work()
8276 mutex_lock(&priv->action_mutex); in ipw2100_wx_event_work()
8279 if (priv->config & CFG_STATIC_ESSID) in ipw2100_wx_event_work()
8280 ipw2100_set_essid(priv, priv->essid, priv->essid_len, in ipw2100_wx_event_work()
8284 mutex_unlock(&priv->action_mutex); in ipw2100_wx_event_work()
8287 wireless_send_event(priv->net_dev, SIOCGIWAP, &wrqu, NULL); in ipw2100_wx_event_work()
8299 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
8328 (struct ipw2100_fw_header *)fw->fw_entry->data; in ipw2100_mod_firmware_load()
8330 if (IPW2100_FW_MAJOR(h->version) != IPW2100_FW_MAJOR_VERSION) { in ipw2100_mod_firmware_load()
8334 h->version); in ipw2100_mod_firmware_load()
8338 fw->version = h->version; in ipw2100_mod_firmware_load()
8339 fw->fw.data = fw->fw_entry->data + sizeof(struct ipw2100_fw_header); in ipw2100_mod_firmware_load()
8340 fw->fw.size = h->fw_size; in ipw2100_mod_firmware_load()
8341 fw->uc.data = fw->fw.data + h->fw_size; in ipw2100_mod_firmware_load()
8342 fw->uc.size = h->uc_size; in ipw2100_mod_firmware_load()
8354 priv->net_dev->name); in ipw2100_get_firmware()
8356 switch (priv->ieee->iw_mode) { in ipw2100_get_firmware()
8358 fw_name = IPW2100_FW_NAME("-i"); in ipw2100_get_firmware()
8362 fw_name = IPW2100_FW_NAME("-p"); in ipw2100_get_firmware()
8371 rc = request_firmware(&fw->fw_entry, fw_name, &priv->pci_dev->dev); in ipw2100_get_firmware()
8376 priv->net_dev->name, fw_name); in ipw2100_get_firmware()
8379 IPW_DEBUG_INFO("firmware data %p size %zd\n", fw->fw_entry->data, in ipw2100_get_firmware()
8380 fw->fw_entry->size); in ipw2100_get_firmware()
8387 MODULE_FIRMWARE(IPW2100_FW_NAME("-i"));
8389 MODULE_FIRMWARE(IPW2100_FW_NAME("-p"));
8396 fw->version = 0; in ipw2100_release_firmware()
8397 release_firmware(fw->fw_entry); in ipw2100_release_firmware()
8398 fw->fw_entry = NULL; in ipw2100_release_firmware()
8410 return -EIO; in ipw2100_get_fwversion()
8413 len = max - 1; in ipw2100_get_fwversion()
8427 return -EIO; in ipw2100_get_ucodeversion()
8447 const unsigned char *firmware_data = fw->fw.data; in ipw2100_fw_download()
8448 unsigned int firmware_data_left = fw->fw.size; in ipw2100_fw_download()
8453 firmware_data_left -= 4; in ipw2100_fw_download()
8457 firmware_data_left -= 2; in ipw2100_fw_download()
8461 "Invalid firmware run-length of %d bytes\n", in ipw2100_fw_download()
8463 return -EINVAL; in ipw2100_fw_download()
8466 write_nic_memory(priv->net_dev, addr, len, firmware_data); in ipw2100_fw_download()
8468 firmware_data_left -= len; in ipw2100_fw_download()
8487 u8 time[2]; // hours, minutes member
8494 struct net_device *dev = priv->net_dev; in ipw2100_ucode_download()
8495 const unsigned char *microcode_data = fw->uc.data; in ipw2100_ucode_download()
8496 unsigned int microcode_data_left = fw->uc.size; in ipw2100_ucode_download()
8497 void __iomem *reg = priv->ioaddr; in ipw2100_ucode_download()
8528 microcode_data_left -= 2; in ipw2100_ucode_download()
8560 /* check Symbol is enabled - upped this from 5 as it wasn't always in ipw2100_ucode_download()
8573 dev->name); in ipw2100_ucode_download()
8574 return -EIO; in ipw2100_ucode_download()
8591 ": %s: No response from Symbol - hw not alive\n", in ipw2100_ucode_download()
8592 dev->name); in ipw2100_ucode_download()
8594 return -EIO; in ipw2100_ucode_download()