Lines Matching +full:download +full:- +full:git +full:- +full:cache

3   Copyright(c) 2003 - 2006 Intel Corporation. All rights reserved.
16 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
23 Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
26 Extensions 0.26 package and copyright (c) 1997-2003 Jean Tourrilhes
30 Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen
32 Copyright (c) 2002-2003, Jouni Malinen <j@w1.fi>
48 Tx - Commands and Data
98 There are two locks utilized. The first is the low level lock (priv->low_lock)
101 - Access to the Tx/Rx queue lists via priv->low_lock. The lists are as follows:
103 tx_free_list : Holds pre-allocated Tx buffers.
111 msg_free_list : Holds pre-allocated Msg (Command) buffers
124 The methods that work on the TBD ring are protected via priv->low_lock.
126 - The internal data state of the device itself
127 - Access to the firmware read/write indexes for the BD queues
130 All external entry functions are locked with the priv->action_lock to ensure
148 #include <linux/dma-mapping.h>
170 #define IPW2100_VERSION "git-1.2.2"
175 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
328 /* Pre-decl until we get the code solid and then we can clean it up */
355 *val = readl((void __iomem *)(dev->base_addr + reg)); in read_register()
361 writel(val, (void __iomem *)(dev->base_addr + reg)); in write_register()
368 *val = readw((void __iomem *)(dev->base_addr + reg)); in read_register_word()
374 *val = readb((void __iomem *)(dev->base_addr + reg)); in read_register_byte()
380 writew(val, (void __iomem *)(dev->base_addr + reg)); in write_register_word()
386 writeb(val, (void __iomem *)(dev->base_addr + reg)); in write_register_byte()
453 dif_len = addr - aligned_addr; in write_nic_memory()
463 len -= dif_len; in write_nic_memory()
474 dif_len = len - aligned_len; in write_nic_memory()
491 dif_len = addr - aligned_addr; in read_nic_memory()
501 len -= dif_len; in read_nic_memory()
512 dif_len = len - aligned_len; in read_nic_memory()
520 return (dev->base_addr && in ipw2100_hw_is_adapter_in_system()
522 ((void __iomem *)(dev->base_addr + in ipw2100_hw_is_adapter_in_system()
530 struct ipw2100_ordinals *ordinals = &priv->ordinals; in ipw2100_get_ordinal()
537 if (ordinals->table1_addr == 0) { in ipw2100_get_ordinal()
540 return -EINVAL; in ipw2100_get_ordinal()
551 return -EINVAL; in ipw2100_get_ordinal()
554 read_nic_dword(priv->net_dev, in ipw2100_get_ordinal()
555 ordinals->table1_addr + (ord << 2), &addr); in ipw2100_get_ordinal()
556 read_nic_dword(priv->net_dev, addr, val); in ipw2100_get_ordinal()
565 ord -= IPW_START_ORD_TAB_2; in ipw2100_get_ordinal()
568 read_nic_dword(priv->net_dev, in ipw2100_get_ordinal()
569 ordinals->table2_addr + (ord << 3), &addr); in ipw2100_get_ordinal()
572 * two 16-bit words - first is length, second is count */ in ipw2100_get_ordinal()
573 read_nic_dword(priv->net_dev, in ipw2100_get_ordinal()
574 ordinals->table2_addr + (ord << 3) + sizeof(u32), in ipw2100_get_ordinal()
587 return -EINVAL; in ipw2100_get_ordinal()
595 read_nic_memory(priv->net_dev, addr, total_length, val); in ipw2100_get_ordinal()
603 return -EINVAL; in ipw2100_get_ordinal()
609 struct ipw2100_ordinals *ordinals = &priv->ordinals; in ipw2100_set_ordinal()
616 return -EINVAL; in ipw2100_set_ordinal()
619 read_nic_dword(priv->net_dev, in ipw2100_set_ordinal()
620 ordinals->table1_addr + (ord << 2), &addr); in ipw2100_set_ordinal()
622 write_nic_dword(priv->net_dev, addr, *val); in ipw2100_set_ordinal()
631 return -EINVAL; in ipw2100_set_ordinal()
633 return -EINVAL; in ipw2100_set_ordinal()
645 out += snprintf(buf + out, count - out, " "); in snprint_line()
647 out += snprintf(buf + out, count - out, "%02X ", in snprint_line()
650 out += snprintf(buf + out, count - out, " "); in snprint_line()
653 out += snprintf(buf + out, count - out, " "); in snprint_line()
655 out += snprintf(buf + out, count - out, " "); in snprint_line()
661 out += snprintf(buf + out, count - out, "%c", c); in snprint_line()
665 out += snprintf(buf + out, count - out, " "); in snprint_line()
683 len -= min(len, 16U); in printk_buf()
696 if (priv->reset_backoff && in schedule_reset()
697 (now - priv->last_reset > priv->reset_backoff)) in schedule_reset()
698 priv->reset_backoff = 0; in schedule_reset()
700 priv->last_reset = get_seconds(); in schedule_reset()
702 if (!(priv->status & STATUS_RESET_PENDING)) { in schedule_reset()
704 priv->net_dev->name, priv->reset_backoff); in schedule_reset()
705 netif_carrier_off(priv->net_dev); in schedule_reset()
706 netif_stop_queue(priv->net_dev); in schedule_reset()
707 priv->status |= STATUS_RESET_PENDING; in schedule_reset()
708 if (priv->reset_backoff) in schedule_reset()
709 schedule_delayed_work(&priv->reset_work, in schedule_reset()
710 priv->reset_backoff * HZ); in schedule_reset()
712 schedule_delayed_work(&priv->reset_work, 0); in schedule_reset()
714 if (priv->reset_backoff < MAX_RESET_BACKOFF) in schedule_reset()
715 priv->reset_backoff++; in schedule_reset()
717 wake_up_interruptible(&priv->wait_command_queue); in schedule_reset()
720 priv->net_dev->name); in schedule_reset()
734 command_types[cmd->host_command], cmd->host_command, in ipw2100_hw_send_command()
735 cmd->host_command_length); in ipw2100_hw_send_command()
736 printk_buf(IPW_DL_HC, (u8 *) cmd->host_command_parameters, in ipw2100_hw_send_command()
737 cmd->host_command_length); in ipw2100_hw_send_command()
739 spin_lock_irqsave(&priv->low_lock, flags); in ipw2100_hw_send_command()
741 if (priv->fatal_error) { in ipw2100_hw_send_command()
744 err = -EIO; in ipw2100_hw_send_command()
748 if (!(priv->status & STATUS_RUNNING)) { in ipw2100_hw_send_command()
751 err = -EIO; in ipw2100_hw_send_command()
755 if (priv->status & STATUS_CMD_ACTIVE) { in ipw2100_hw_send_command()
758 err = -EBUSY; in ipw2100_hw_send_command()
762 if (list_empty(&priv->msg_free_list)) { in ipw2100_hw_send_command()
767 priv->status |= STATUS_CMD_ACTIVE; in ipw2100_hw_send_command()
768 priv->messages_sent++; in ipw2100_hw_send_command()
770 element = priv->msg_free_list.next; in ipw2100_hw_send_command()
773 packet->jiffy_start = jiffies; in ipw2100_hw_send_command()
776 packet->info.c_struct.cmd->host_command_reg = cmd->host_command; in ipw2100_hw_send_command()
777 packet->info.c_struct.cmd->host_command_reg1 = cmd->host_command1; in ipw2100_hw_send_command()
778 packet->info.c_struct.cmd->host_command_len_reg = in ipw2100_hw_send_command()
779 cmd->host_command_length; in ipw2100_hw_send_command()
780 packet->info.c_struct.cmd->sequence = cmd->host_command_sequence; in ipw2100_hw_send_command()
782 memcpy(packet->info.c_struct.cmd->host_command_params_reg, in ipw2100_hw_send_command()
783 cmd->host_command_parameters, in ipw2100_hw_send_command()
784 sizeof(packet->info.c_struct.cmd->host_command_params_reg)); in ipw2100_hw_send_command()
787 DEC_STAT(&priv->msg_free_stat); in ipw2100_hw_send_command()
789 list_add_tail(element, &priv->msg_pend_list); in ipw2100_hw_send_command()
790 INC_STAT(&priv->msg_pend_stat); in ipw2100_hw_send_command()
795 spin_unlock_irqrestore(&priv->low_lock, flags); in ipw2100_hw_send_command()
804 wait_event_interruptible_timeout(priv->wait_command_queue, in ipw2100_hw_send_command()
805 !(priv-> in ipw2100_hw_send_command()
812 priv->fatal_error = IPW2100_ERR_MSG_TIMEOUT; in ipw2100_hw_send_command()
813 priv->status &= ~STATUS_CMD_ACTIVE; in ipw2100_hw_send_command()
815 return -EIO; in ipw2100_hw_send_command()
818 if (priv->fatal_error) { in ipw2100_hw_send_command()
820 priv->net_dev->name); in ipw2100_hw_send_command()
821 return -EIO; in ipw2100_hw_send_command()
834 spin_unlock_irqrestore(&priv->low_lock, flags); in ipw2100_hw_send_command()
851 /* Domain 0 check - all values should be DOA_DEBUG */ in ipw2100_verify()
854 read_register(priv->net_dev, address, &data1); in ipw2100_verify()
856 return -EIO; in ipw2100_verify()
859 /* Domain 1 check - use arbitrary read/write compare */ in ipw2100_verify()
862 write_register(priv->net_dev, IPW_REG_DOMAIN_1_OFFSET + 0x32, in ipw2100_verify()
864 write_register(priv->net_dev, IPW_REG_DOMAIN_1_OFFSET + 0x36, in ipw2100_verify()
866 read_register(priv->net_dev, IPW_REG_DOMAIN_1_OFFSET + 0x32, in ipw2100_verify()
868 read_register(priv->net_dev, IPW_REG_DOMAIN_1_OFFSET + 0x36, in ipw2100_verify()
874 return -EIO; in ipw2100_verify()
907 ((priv->status & STATUS_ENABLED) ? in ipw2100_wait_for_card_state()
910 priv->status |= STATUS_ENABLED; in ipw2100_wait_for_card_state()
912 priv->status &= ~STATUS_ENABLED; in ipw2100_wait_for_card_state()
922 return -EIO; in ipw2100_wait_for_card_state()
936 write_register(priv->net_dev, IPW_REG_RESET_REG, in sw_reset_and_clock()
944 read_register(priv->net_dev, IPW_REG_RESET_REG, &r); in sw_reset_and_clock()
950 return -EIO; // TODO: better error value in sw_reset_and_clock()
954 write_register(priv->net_dev, IPW_REG_GP_CNTRL, in sw_reset_and_clock()
962 read_register(priv->net_dev, IPW_REG_GP_CNTRL, &r); in sw_reset_and_clock()
968 return -EIO; /* TODO: better error value */ in sw_reset_and_clock()
971 read_register(priv->net_dev, IPW_REG_GP_CNTRL, &r); in sw_reset_and_clock()
972 write_register(priv->net_dev, IPW_REG_GP_CNTRL, in sw_reset_and_clock()
986 5. zero-out shared mem
987 6. download f/w
999 if (priv->fatal_error) { in ipw2100_download_firmware()
1002 priv->net_dev->name, priv->fatal_error); in ipw2100_download_firmware()
1003 return -EINVAL; in ipw2100_download_firmware()
1010 priv->net_dev->name, err); in ipw2100_download_firmware()
1011 priv->fatal_error = IPW2100_ERR_FW_LOAD; in ipw2100_download_firmware()
1019 priv->net_dev->name, err); in ipw2100_download_firmware()
1020 priv->fatal_error = IPW2100_ERR_FW_LOAD; in ipw2100_download_firmware()
1024 priv->firmware_version = ipw2100_firmware.version; in ipw2100_download_firmware()
1030 priv->net_dev->name, err); in ipw2100_download_firmware()
1037 priv->net_dev->name, err); in ipw2100_download_firmware()
1042 write_nic_dword(priv->net_dev, in ipw2100_download_firmware()
1046 write_register(priv->net_dev, IPW_REG_RESET_REG, 0); in ipw2100_download_firmware()
1052 priv->net_dev->name, err); in ipw2100_download_firmware()
1057 write_nic_dword(priv->net_dev, in ipw2100_download_firmware()
1065 priv->net_dev->name, err); in ipw2100_download_firmware()
1073 priv->net_dev->name, err); in ipw2100_download_firmware()
1081 * from the disk. --YZ in ipw2100_download_firmware()
1091 write_nic_dword(priv->net_dev, address, 0); in ipw2100_download_firmware()
1094 write_nic_dword(priv->net_dev, address, 0); in ipw2100_download_firmware()
1097 write_nic_dword(priv->net_dev, address, 0); in ipw2100_download_firmware()
1100 write_nic_dword(priv->net_dev, address, 0); in ipw2100_download_firmware()
1103 write_nic_dword(priv->net_dev, address, 0); in ipw2100_download_firmware()
1114 if (priv->status & STATUS_INT_ENABLED) in ipw2100_enable_interrupts()
1116 priv->status |= STATUS_INT_ENABLED; in ipw2100_enable_interrupts()
1117 write_register(priv->net_dev, IPW_REG_INTA_MASK, IPW_INTERRUPT_MASK); in ipw2100_enable_interrupts()
1122 if (!(priv->status & STATUS_INT_ENABLED)) in ipw2100_disable_interrupts()
1124 priv->status &= ~STATUS_INT_ENABLED; in ipw2100_disable_interrupts()
1125 write_register(priv->net_dev, IPW_REG_INTA_MASK, 0x0); in ipw2100_disable_interrupts()
1130 struct ipw2100_ordinals *ord = &priv->ordinals; in ipw2100_initialize_ordinals()
1134 read_register(priv->net_dev, IPW_MEM_HOST_SHARED_ORDINALS_TABLE_1, in ipw2100_initialize_ordinals()
1135 &ord->table1_addr); in ipw2100_initialize_ordinals()
1137 read_register(priv->net_dev, IPW_MEM_HOST_SHARED_ORDINALS_TABLE_2, in ipw2100_initialize_ordinals()
1138 &ord->table2_addr); in ipw2100_initialize_ordinals()
1140 read_nic_dword(priv->net_dev, ord->table1_addr, &ord->table1_size); in ipw2100_initialize_ordinals()
1141 read_nic_dword(priv->net_dev, ord->table2_addr, &ord->table2_size); in ipw2100_initialize_ordinals()
1143 ord->table2_size &= 0x0000FFFF; in ipw2100_initialize_ordinals()
1145 IPW_DEBUG_INFO("table 1 size: %d\n", ord->table1_size); in ipw2100_initialize_ordinals()
1146 IPW_DEBUG_INFO("table 2 size: %d\n", ord->table2_size); in ipw2100_initialize_ordinals()
1159 write_register(priv->net_dev, IPW_REG_GPIO, reg); in ipw2100_hw_set_gpio()
1171 if (!(priv->hw_features & HW_FEATURE_RFKILL)) { in rf_kill_active()
1172 wiphy_rfkill_set_hw_state(priv->ieee->wdev.wiphy, false); in rf_kill_active()
1173 priv->status &= ~STATUS_RF_KILL_HW; in rf_kill_active()
1179 read_register(priv->net_dev, IPW_REG_GPIO, &reg); in rf_kill_active()
1184 wiphy_rfkill_set_hw_state(priv->ieee->wdev.wiphy, true); in rf_kill_active()
1185 priv->status |= STATUS_RF_KILL_HW; in rf_kill_active()
1187 wiphy_rfkill_set_hw_state(priv->ieee->wdev.wiphy, false); in rf_kill_active()
1188 priv->status &= ~STATUS_RF_KILL_HW; in rf_kill_active()
1207 return -EIO; in ipw2100_get_hw_features()
1215 read_nic_dword(priv->net_dev, addr + 0xFC, &val); in ipw2100_get_hw_features()
1216 priv->eeprom_version = (val >> 24) & 0xFF; in ipw2100_get_hw_features()
1217 IPW_DEBUG_INFO("EEPROM version: %d\n", priv->eeprom_version); in ipw2100_get_hw_features()
1226 read_nic_dword(priv->net_dev, addr + 0x20, &val); in ipw2100_get_hw_features()
1228 priv->hw_features |= HW_FEATURE_RFKILL; in ipw2100_get_hw_features()
1231 (priv->hw_features & HW_FEATURE_RFKILL) ? "" : "not "); in ipw2100_get_hw_features()
1249 if (priv->status & STATUS_RUNNING) in ipw2100_start_adapter()
1253 * Initialize the hw - drive adapter to DO state by setting in ipw2100_start_adapter()
1254 * init_done bit. Wait for clk_ready bit and Download in ipw2100_start_adapter()
1260 priv->net_dev->name); in ipw2100_start_adapter()
1261 return -EIO; in ipw2100_start_adapter()
1270 /* TODO -- Look at disabling interrupts here to make sure none in ipw2100_start_adapter()
1273 /* Release ARC - clear reset bit */ in ipw2100_start_adapter()
1274 write_register(priv->net_dev, IPW_REG_RESET_REG, 0); in ipw2100_start_adapter()
1283 read_register(priv->net_dev, IPW_REG_INTA, &inta); in ipw2100_start_adapter()
1288 write_register(priv->net_dev, IPW_REG_INTA, in ipw2100_start_adapter()
1299 write_register(priv->net_dev, IPW_REG_INTA, in ipw2100_start_adapter()
1303 } while (--i); in ipw2100_start_adapter()
1307 read_register(priv->net_dev, IPW_REG_INTA, &inta); in ipw2100_start_adapter()
1308 read_register(priv->net_dev, IPW_REG_INTA_MASK, &inta_mask); in ipw2100_start_adapter()
1312 write_register(priv->net_dev, IPW_REG_INTA, inta); in ipw2100_start_adapter()
1320 priv->net_dev->name); in ipw2100_start_adapter()
1321 return -EIO; in ipw2100_start_adapter()
1325 read_register(priv->net_dev, IPW_REG_GPIO, &gpio); in ipw2100_start_adapter()
1329 write_register(priv->net_dev, IPW_REG_GPIO, gpio); in ipw2100_start_adapter()
1332 priv->status |= STATUS_RUNNING; in ipw2100_start_adapter()
1335 priv->status &= ~(STATUS_ASSOCIATING | STATUS_ASSOCIATED); in ipw2100_start_adapter()
1344 if (!priv->fatal_error) in ipw2100_reset_fatalerror()
1347 priv->fatal_errors[priv->fatal_index++] = priv->fatal_error; in ipw2100_reset_fatalerror()
1348 priv->fatal_index %= IPW2100_ERROR_QUEUE; in ipw2100_reset_fatalerror()
1349 priv->fatal_error = 0; in ipw2100_reset_fatalerror()
1363 write_register(priv->net_dev, IPW_REG_RESET_REG, in ipw2100_power_cycle_adapter()
1371 read_register(priv->net_dev, IPW_REG_RESET_REG, &reg); in ipw2100_power_cycle_adapter()
1375 } while (--i); in ipw2100_power_cycle_adapter()
1377 priv->status &= ~STATUS_RESET_PENDING; in ipw2100_power_cycle_adapter()
1381 ("exit - waited too long for master assert stop\n"); in ipw2100_power_cycle_adapter()
1382 return -EIO; in ipw2100_power_cycle_adapter()
1385 write_register(priv->net_dev, IPW_REG_RESET_REG, in ipw2100_power_cycle_adapter()
1392 priv->status &= ~(STATUS_RUNNING | STATUS_ASSOCIATING | in ipw2100_power_cycle_adapter()
1427 read_nic_dword(priv->net_dev, IPW2100_CONTROL_REG, &val1); in ipw2100_hw_phy_off()
1428 read_nic_dword(priv->net_dev, IPW2100_COMMAND, &val2); in ipw2100_hw_phy_off()
1437 return -EIO; in ipw2100_hw_phy_off()
1451 if (priv->status & STATUS_ENABLED) in ipw2100_enable_adapter()
1454 mutex_lock(&priv->adapter_mutex); in ipw2100_enable_adapter()
1470 priv->net_dev->name); in ipw2100_enable_adapter()
1474 if (priv->stop_hang_check) { in ipw2100_enable_adapter()
1475 priv->stop_hang_check = 0; in ipw2100_enable_adapter()
1476 schedule_delayed_work(&priv->hang_check, HZ / 2); in ipw2100_enable_adapter()
1480 mutex_unlock(&priv->adapter_mutex); in ipw2100_enable_adapter()
1496 if (!(priv->status & STATUS_RUNNING)) in ipw2100_hw_stop_adapter()
1499 priv->status |= STATUS_STOPPING; in ipw2100_hw_stop_adapter()
1504 if (!priv->fatal_error) { in ipw2100_hw_stop_adapter()
1515 * If in D0-standby mode going directly to D3 may cause a in ipw2100_hw_stop_adapter()
1521 * out of D0-standby if it is already in that state. in ipw2100_hw_stop_adapter()
1528 * take HW out of D0-standby and prepare it for D3 state. in ipw2100_hw_stop_adapter()
1540 priv->net_dev->name, err); in ipw2100_hw_stop_adapter()
1545 priv->status &= ~STATUS_ENABLED; in ipw2100_hw_stop_adapter()
1561 write_register(priv->net_dev, IPW_REG_RESET_REG, in ipw2100_hw_stop_adapter()
1566 for (i = 5; i > 0; i--) { in ipw2100_hw_stop_adapter()
1570 read_register(priv->net_dev, IPW_REG_RESET_REG, &reg); in ipw2100_hw_stop_adapter()
1579 priv->net_dev->name); in ipw2100_hw_stop_adapter()
1582 write_register(priv->net_dev, IPW_REG_RESET_REG, in ipw2100_hw_stop_adapter()
1585 priv->status &= ~(STATUS_RUNNING | STATUS_STOPPING); in ipw2100_hw_stop_adapter()
1601 if (!(priv->status & STATUS_ENABLED)) in ipw2100_disable_adapter()
1605 priv->status &= ~(STATUS_ASSOCIATED | STATUS_ASSOCIATING); in ipw2100_disable_adapter()
1607 if (!priv->stop_hang_check) { in ipw2100_disable_adapter()
1608 priv->stop_hang_check = 1; in ipw2100_disable_adapter()
1609 cancel_delayed_work(&priv->hang_check); in ipw2100_disable_adapter()
1612 mutex_lock(&priv->adapter_mutex); in ipw2100_disable_adapter()
1617 ": exit - failed to send CARD_DISABLE command\n"); in ipw2100_disable_adapter()
1624 ": exit - card failed to change to DISABLED\n"); in ipw2100_disable_adapter()
1631 mutex_unlock(&priv->adapter_mutex); in ipw2100_disable_adapter()
1650 if (!(priv->config & CFG_ASSOCIATE)) in ipw2100_set_scan_options()
1652 if ((priv->ieee->sec.flags & SEC_ENABLED) && priv->ieee->sec.enabled) in ipw2100_set_scan_options()
1654 if (priv->config & CFG_PASSIVE_SCAN) in ipw2100_set_scan_options()
1657 cmd.host_command_parameters[1] = priv->channel_mask; in ipw2100_set_scan_options()
1681 if (priv->ieee->iw_mode == IW_MODE_MONITOR) in ipw2100_start_scan()
1684 if (priv->status & STATUS_SCANNING) { in ipw2100_start_scan()
1698 priv->status |= STATUS_SCANNING; in ipw2100_start_scan()
1701 priv->status &= ~STATUS_SCANNING; in ipw2100_start_scan()
1710 "---",
1728 if (priv->suspend_time) { in ipw2100_up()
1729 libipw_networks_age(priv->ieee, priv->suspend_time); in ipw2100_up()
1730 priv->suspend_time = 0; in ipw2100_up()
1734 if (priv->status & STATUS_RF_KILL_SW) { in ipw2100_up()
1736 "switch\n", priv->net_dev->name); in ipw2100_up()
1746 spin_lock_irqsave(&priv->low_lock, flags); in ipw2100_up()
1751 spin_unlock_irqrestore(&priv->low_lock, flags); in ipw2100_up()
1753 if (priv->status & STATUS_POWERED || in ipw2100_up()
1754 (priv->status & STATUS_RESET_PENDING)) { in ipw2100_up()
1759 priv->net_dev->name); in ipw2100_up()
1764 priv->status |= STATUS_POWERED; in ipw2100_up()
1770 priv->net_dev->name); in ipw2100_up()
1781 priv->net_dev->name); in ipw2100_up()
1787 if (libipw_set_geo(priv->ieee, &ipw_geos[0])) { in ipw2100_up()
1791 priv->ieee->freq_band = LIBIPW_24GHZ_BAND; in ipw2100_up()
1797 priv->net_dev->name); in ipw2100_up()
1802 priv->status &= ~STATUS_SCANNING; in ipw2100_up()
1806 priv->net_dev->name); in ipw2100_up()
1808 if (priv->stop_rf_kill) { in ipw2100_up()
1809 priv->stop_rf_kill = 0; in ipw2100_up()
1810 schedule_delayed_work(&priv->rf_kill, in ipw2100_up()
1824 priv->net_dev->name); in ipw2100_up()
1830 /* Enable the adapter - sends HOST_COMPLETE */ in ipw2100_up()
1834 priv->net_dev->name); in ipw2100_up()
1856 int associated = priv->status & STATUS_ASSOCIATED; in ipw2100_down()
1859 if (!priv->stop_rf_kill) { in ipw2100_down()
1860 priv->stop_rf_kill = 1; in ipw2100_down()
1861 cancel_delayed_work(&priv->rf_kill); in ipw2100_down()
1865 if (!priv->stop_hang_check) { in ipw2100_down()
1866 priv->stop_hang_check = 1; in ipw2100_down()
1867 cancel_delayed_work(&priv->hang_check); in ipw2100_down()
1871 if (priv->status & STATUS_RESET_PENDING) in ipw2100_down()
1872 cancel_delayed_work(&priv->reset_work); in ipw2100_down()
1876 spin_lock_irqsave(&priv->low_lock, flags); in ipw2100_down()
1878 spin_unlock_irqrestore(&priv->low_lock, flags); in ipw2100_down()
1882 priv->net_dev->name); in ipw2100_down()
1887 spin_lock_irqsave(&priv->low_lock, flags); in ipw2100_down()
1889 spin_unlock_irqrestore(&priv->low_lock, flags); in ipw2100_down()
1895 wireless_send_event(priv->net_dev, SIOCGIWAP, &wrqu, NULL); in ipw2100_down()
1897 priv->status &= ~(STATUS_ASSOCIATED | STATUS_ASSOCIATING); in ipw2100_down()
1898 netif_carrier_off(priv->net_dev); in ipw2100_down()
1899 netif_stop_queue(priv->net_dev); in ipw2100_down()
1913 const struct libipw_geo *geo = libipw_get_geo(priv->ieee); in ipw2100_wdev_init()
1914 struct wireless_dev *wdev = &priv->ieee->wdev; in ipw2100_wdev_init()
1917 memcpy(wdev->wiphy->perm_addr, priv->mac_addr, ETH_ALEN); in ipw2100_wdev_init()
1919 /* fill-out priv->ieee->bg_band */ in ipw2100_wdev_init()
1920 if (geo->bg_channels) { in ipw2100_wdev_init()
1921 struct ieee80211_supported_band *bg_band = &priv->ieee->bg_band; in ipw2100_wdev_init()
1923 bg_band->band = IEEE80211_BAND_2GHZ; in ipw2100_wdev_init()
1924 bg_band->n_channels = geo->bg_channels; in ipw2100_wdev_init()
1925 bg_band->channels = kcalloc(geo->bg_channels, in ipw2100_wdev_init()
1928 if (!bg_band->channels) { in ipw2100_wdev_init()
1930 return -ENOMEM; in ipw2100_wdev_init()
1932 /* translate geo->bg to bg_band.channels */ in ipw2100_wdev_init()
1933 for (i = 0; i < geo->bg_channels; i++) { in ipw2100_wdev_init()
1934 bg_band->channels[i].band = IEEE80211_BAND_2GHZ; in ipw2100_wdev_init()
1935 bg_band->channels[i].center_freq = geo->bg[i].freq; in ipw2100_wdev_init()
1936 bg_band->channels[i].hw_value = geo->bg[i].channel; in ipw2100_wdev_init()
1937 bg_band->channels[i].max_power = geo->bg[i].max_power; in ipw2100_wdev_init()
1938 if (geo->bg[i].flags & LIBIPW_CH_PASSIVE_ONLY) in ipw2100_wdev_init()
1939 bg_band->channels[i].flags |= in ipw2100_wdev_init()
1941 if (geo->bg[i].flags & LIBIPW_CH_NO_IBSS) in ipw2100_wdev_init()
1942 bg_band->channels[i].flags |= in ipw2100_wdev_init()
1944 if (geo->bg[i].flags & LIBIPW_CH_RADAR_DETECT) in ipw2100_wdev_init()
1945 bg_band->channels[i].flags |= in ipw2100_wdev_init()
1952 bg_band->bitrates = ipw2100_bg_rates; in ipw2100_wdev_init()
1953 bg_band->n_bitrates = RATE_COUNT; in ipw2100_wdev_init()
1955 wdev->wiphy->bands[IEEE80211_BAND_2GHZ] = bg_band; in ipw2100_wdev_init()
1958 set_wiphy_dev(wdev->wiphy, &priv->pci_dev->dev); in ipw2100_wdev_init()
1959 if (wiphy_register(wdev->wiphy)) { in ipw2100_wdev_init()
1961 return -EIO; in ipw2100_wdev_init()
1975 int associated = priv->status & STATUS_ASSOCIATED; in ipw2100_reset_adapter()
1977 spin_lock_irqsave(&priv->low_lock, flags); in ipw2100_reset_adapter()
1978 IPW_DEBUG_INFO(": %s: Restarting adapter.\n", priv->net_dev->name); in ipw2100_reset_adapter()
1979 priv->resets++; in ipw2100_reset_adapter()
1980 priv->status &= ~(STATUS_ASSOCIATED | STATUS_ASSOCIATING); in ipw2100_reset_adapter()
1981 priv->status |= STATUS_SECURITY_UPDATED; in ipw2100_reset_adapter()
1985 cancel_delayed_work(&priv->reset_work); in ipw2100_reset_adapter()
1986 priv->status |= STATUS_RESET_PENDING; in ipw2100_reset_adapter()
1987 spin_unlock_irqrestore(&priv->low_lock, flags); in ipw2100_reset_adapter()
1989 mutex_lock(&priv->action_mutex); in ipw2100_reset_adapter()
1991 priv->stop_hang_check = 1; in ipw2100_reset_adapter()
1992 cancel_delayed_work(&priv->hang_check); in ipw2100_reset_adapter()
1996 wireless_send_event(priv->net_dev, SIOCGIWAP, &wrqu, NULL); in ipw2100_reset_adapter()
1999 mutex_unlock(&priv->action_mutex); in ipw2100_reset_adapter()
2054 memcpy(priv->ieee->bssid, bssid, ETH_ALEN); in isr_indicate_associated()
2076 priv->net_dev->name, print_ssid(ssid, essid, essid_len), in isr_indicate_associated()
2080 if (!(priv->config & CFG_STATIC_ESSID)) { in isr_indicate_associated()
2081 priv->essid_len = min((u8) essid_len, (u8) IW_ESSID_MAX_SIZE); in isr_indicate_associated()
2082 memcpy(priv->essid, essid, priv->essid_len); in isr_indicate_associated()
2084 priv->channel = chan; in isr_indicate_associated()
2085 memcpy(priv->bssid, bssid, ETH_ALEN); in isr_indicate_associated()
2087 priv->status |= STATUS_ASSOCIATING; in isr_indicate_associated()
2088 priv->connect_start = get_seconds(); in isr_indicate_associated()
2090 schedule_delayed_work(&priv->wx_event_work, HZ / 10); in isr_indicate_associated()
2117 * disable auto association -- so we cheat by setting a bogus SSID */ in ipw2100_set_essid()
2118 if (!ssid_len && !(priv->config & CFG_ASSOCIATE)) { in ipw2100_set_essid()
2131 memset(priv->essid + ssid_len, 0, IW_ESSID_MAX_SIZE - ssid_len); in ipw2100_set_essid()
2132 memcpy(priv->essid, essid, ssid_len); in ipw2100_set_essid()
2133 priv->essid_len = ssid_len; in ipw2100_set_essid()
2138 err = -EIO; in ipw2100_set_essid()
2150 print_ssid(ssid, priv->essid, priv->essid_len), in isr_indicate_association_lost()
2151 priv->bssid); in isr_indicate_association_lost()
2153 priv->status &= ~(STATUS_ASSOCIATED | STATUS_ASSOCIATING); in isr_indicate_association_lost()
2155 if (priv->status & STATUS_STOPPING) { in isr_indicate_association_lost()
2160 memset(priv->bssid, 0, ETH_ALEN); in isr_indicate_association_lost()
2161 memset(priv->ieee->bssid, 0, ETH_ALEN); in isr_indicate_association_lost()
2163 netif_carrier_off(priv->net_dev); in isr_indicate_association_lost()
2164 netif_stop_queue(priv->net_dev); in isr_indicate_association_lost()
2166 if (!(priv->status & STATUS_RUNNING)) in isr_indicate_association_lost()
2169 if (priv->status & STATUS_SECURITY_UPDATED) in isr_indicate_association_lost()
2170 schedule_delayed_work(&priv->security_work, 0); in isr_indicate_association_lost()
2172 schedule_delayed_work(&priv->wx_event_work, 0); in isr_indicate_association_lost()
2178 priv->net_dev->name); in isr_indicate_rf_kill()
2181 wiphy_rfkill_set_hw_state(priv->ieee->wdev.wiphy, true); in isr_indicate_rf_kill()
2182 priv->status |= STATUS_RF_KILL_HW; in isr_indicate_rf_kill()
2185 priv->stop_rf_kill = 0; in isr_indicate_rf_kill()
2186 cancel_delayed_work(&priv->rf_kill); in isr_indicate_rf_kill()
2187 schedule_delayed_work(&priv->rf_kill, round_jiffies_relative(HZ)); in isr_indicate_rf_kill()
2197 wireless_send_event(priv->net_dev, SIOCGIWSCAN, &wrqu, NULL); in send_scan_event()
2216 priv->ieee->scans++; in isr_scan_complete()
2217 priv->status &= ~STATUS_SCANNING; in isr_scan_complete()
2219 /* Only userspace-requested scan completion events go out immediately */ in isr_scan_complete()
2220 if (!priv->user_requested_scan) { in isr_scan_complete()
2221 if (!delayed_work_pending(&priv->scan_event_later)) in isr_scan_complete()
2222 schedule_delayed_work(&priv->scan_event_later, in isr_scan_complete()
2225 priv->user_requested_scan = 0; in isr_scan_complete()
2226 cancel_delayed_work(&priv->scan_event_later); in isr_scan_complete()
2227 schedule_work(&priv->scan_event_now); in isr_scan_complete()
2249 priv->status |= STATUS_SCANNING; in isr_indicate_scanning()
2265 IPW2100_HANDLER(-1, NULL)
2273 priv->status & STATUS_ASSOCIATED && in isr_status_change()
2274 !(priv->status & STATUS_SCANNING)) { in isr_status_change()
2282 for (i = 0; status_handlers[i].status != -1; i++) { in isr_status_change()
2288 priv->wstats.status = status; in isr_status_change()
2300 if (cmd->host_command_reg < ARRAY_SIZE(command_types)) { in isr_rx_complete_command()
2302 command_types[cmd->host_command_reg], in isr_rx_complete_command()
2303 cmd->host_command_reg); in isr_rx_complete_command()
2306 if (cmd->host_command_reg == HOST_COMPLETE) in isr_rx_complete_command()
2307 priv->status |= STATUS_ENABLED; in isr_rx_complete_command()
2309 if (cmd->host_command_reg == CARD_DISABLE) in isr_rx_complete_command()
2310 priv->status &= ~STATUS_ENABLED; in isr_rx_complete_command()
2312 priv->status &= ~STATUS_CMD_ACTIVE; in isr_rx_complete_command()
2314 wake_up_interruptible(&priv->wait_command_queue); in isr_rx_complete_command()
2330 packet->skb = dev_alloc_skb(sizeof(struct ipw2100_rx)); in ipw2100_alloc_skb()
2331 if (!packet->skb) in ipw2100_alloc_skb()
2332 return -ENOMEM; in ipw2100_alloc_skb()
2334 packet->rxp = (struct ipw2100_rx *)packet->skb->data; in ipw2100_alloc_skb()
2335 packet->dma_addr = pci_map_single(priv->pci_dev, packet->skb->data, in ipw2100_alloc_skb()
2350 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
2354 if (!priv->snapshot[0]) in ipw2100_snapshot_free()
2357 kfree(priv->snapshot[i]); in ipw2100_snapshot_free()
2358 priv->snapshot[0] = NULL; in ipw2100_snapshot_free()
2365 if (priv->snapshot[0]) in ipw2100_snapshot_alloc()
2368 priv->snapshot[i] = kmalloc(0x1000, GFP_ATOMIC); in ipw2100_snapshot_alloc()
2369 if (!priv->snapshot[i]) { in ipw2100_snapshot_alloc()
2371 "buffer %d\n", priv->net_dev->name, i); in ipw2100_snapshot_alloc()
2373 kfree(priv->snapshot[--i]); in ipw2100_snapshot_alloc()
2374 priv->snapshot[0] = NULL; in ipw2100_snapshot_alloc()
2397 read_nic_dword(priv->net_dev, i, &tmp); in ipw2100_match_buf()
2411 if ((s - in_buf) == len) in ipw2100_match_buf()
2412 ret = (i + j) - len + 1; in ipw2100_match_buf()
2443 struct ipw2100_status *status = &priv->status_queue.drv[i]; in ipw2100_corruption_detected()
2453 write_register(priv->net_dev, IPW_REG_RESET_REG, in ipw2100_corruption_detected()
2458 read_register(priv->net_dev, IPW_REG_RESET_REG, &reg); in ipw2100_corruption_detected()
2462 } while (j--); in ipw2100_corruption_detected()
2470 priv->net_dev->name, match, in ipw2100_corruption_detected()
2474 "Firmware.\n", priv->net_dev->name); in ipw2100_corruption_detected()
2476 printk_buf((u8 *) priv->status_queue.drv, in ipw2100_corruption_detected()
2480 priv->fatal_error = IPW2100_ERR_C3_CORRUPTION; in ipw2100_corruption_detected()
2481 priv->net_dev->stats.rx_errors++; in ipw2100_corruption_detected()
2488 struct net_device *dev = priv->net_dev; in isr_rx()
2489 struct ipw2100_status *status = &priv->status_queue.drv[i]; in isr_rx()
2490 struct ipw2100_rx_packet *packet = &priv->rx_buffers[i]; in isr_rx()
2494 if (unlikely(status->frame_size > skb_tailroom(packet->skb))) { in isr_rx()
2497 dev->name, in isr_rx()
2498 status->frame_size, skb_tailroom(packet->skb)); in isr_rx()
2499 dev->stats.rx_errors++; in isr_rx()
2504 dev->stats.rx_errors++; in isr_rx()
2505 priv->wstats.discard.misc++; in isr_rx()
2510 if (unlikely(priv->ieee->iw_mode != IW_MODE_MONITOR && in isr_rx()
2511 !(priv->status & STATUS_ASSOCIATED))) { in isr_rx()
2513 priv->wstats.discard.misc++; in isr_rx()
2517 pci_unmap_single(priv->pci_dev, in isr_rx()
2518 packet->dma_addr, in isr_rx()
2521 skb_put(packet->skb, status->frame_size); in isr_rx()
2526 skb_copy_from_linear_data(packet->skb, packet_data, in isr_rx()
2527 min_t(u32, status->frame_size, in isr_rx()
2531 if (!libipw_rx(priv->ieee, packet->skb, stats)) { in isr_rx()
2534 dev->name); in isr_rx()
2535 printk_buf(IPW_DL_DROP, packet_data, status->frame_size); in isr_rx()
2537 dev->stats.rx_errors++; in isr_rx()
2540 dev_kfree_skb_any(packet->skb); in isr_rx()
2541 packet->skb = NULL; in isr_rx()
2547 "%s: Unable to allocate SKB onto RBD ring - disabling " in isr_rx()
2548 "adapter.\n", dev->name); in isr_rx()
2554 priv->rx_queue.drv[i].host_addr = packet->dma_addr; in isr_rx()
2562 struct net_device *dev = priv->net_dev; in isr_rx_monitor()
2563 struct ipw2100_status *status = &priv->status_queue.drv[i]; in isr_rx_monitor()
2564 struct ipw2100_rx_packet *packet = &priv->rx_buffers[i]; in isr_rx_monitor()
2566 /* Magic struct that slots into the radiotap header -- no reason in isr_rx_monitor()
2576 if (unlikely(status->frame_size > skb_tailroom(packet->skb) - in isr_rx_monitor()
2580 dev->name, in isr_rx_monitor()
2581 status->frame_size, in isr_rx_monitor()
2582 skb_tailroom(packet->skb)); in isr_rx_monitor()
2583 dev->stats.rx_errors++; in isr_rx_monitor()
2588 dev->stats.rx_errors++; in isr_rx_monitor()
2589 priv->wstats.discard.misc++; in isr_rx_monitor()
2594 if (unlikely(priv->config & CFG_CRC_CHECK && in isr_rx_monitor()
2595 status->flags & IPW_STATUS_FLAG_CRC_ERROR)) { in isr_rx_monitor()
2597 dev->stats.rx_errors++; in isr_rx_monitor()
2601 pci_unmap_single(priv->pci_dev, packet->dma_addr, in isr_rx_monitor()
2603 memmove(packet->skb->data + sizeof(struct ipw_rt_hdr), in isr_rx_monitor()
2604 packet->skb->data, status->frame_size); in isr_rx_monitor()
2606 ipw_rt = (struct ipw_rt_hdr *) packet->skb->data; in isr_rx_monitor()
2608 ipw_rt->rt_hdr.it_version = PKTHDR_RADIOTAP_VERSION; in isr_rx_monitor()
2609 ipw_rt->rt_hdr.it_pad = 0; /* always good to zero */ in isr_rx_monitor()
2610 ipw_rt->rt_hdr.it_len = cpu_to_le16(sizeof(struct ipw_rt_hdr)); /* total hdr+data */ in isr_rx_monitor()
2612 ipw_rt->rt_hdr.it_present = cpu_to_le32(1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL); in isr_rx_monitor()
2614 ipw_rt->rt_dbmsignal = status->rssi + IPW2100_RSSI_TO_DBM; in isr_rx_monitor()
2616 skb_put(packet->skb, status->frame_size + sizeof(struct ipw_rt_hdr)); in isr_rx_monitor()
2618 if (!libipw_rx(priv->ieee, packet->skb, stats)) { in isr_rx_monitor()
2619 dev->stats.rx_errors++; in isr_rx_monitor()
2622 dev_kfree_skb_any(packet->skb); in isr_rx_monitor()
2623 packet->skb = NULL; in isr_rx_monitor()
2629 "%s: Unable to allocate SKB onto RBD ring - disabling " in isr_rx_monitor()
2630 "adapter.\n", dev->name); in isr_rx_monitor()
2636 priv->rx_queue.drv[i].host_addr = packet->dma_addr; in isr_rx_monitor()
2643 struct ipw2100_status *status = &priv->status_queue.drv[i]; in ipw2100_corruption_check()
2644 struct ipw2100_rx *u = priv->rx_buffers[i].rxp; in ipw2100_corruption_check()
2645 u16 frame_type = status->status_fields & STATUS_TYPE_MASK; in ipw2100_corruption_check()
2649 return (status->frame_size != sizeof(u->rx_data.command)); in ipw2100_corruption_check()
2651 return (status->frame_size != sizeof(u->rx_data.status)); in ipw2100_corruption_check()
2653 return (status->frame_size < sizeof(u->rx_data.notification)); in ipw2100_corruption_check()
2659 switch (WLAN_FC_GET_TYPE(le16_to_cpu(u->rx_data.header.frame_ctl))) { in ipw2100_corruption_check()
2664 return (status->frame_size > in ipw2100_corruption_check()
2680 * Read index - firmware places packet in entry identified by the
2683 * be filled--but not yet valid.
2685 * Write index - driver fills this entry with an unused RBD entry.
2694 * The WRITE index is cached in the variable 'priv->rx_queue.next'.
2699 struct ipw2100_bd_queue *rxq = &priv->rx_queue; in __ipw2100_rx_process()
2700 struct ipw2100_status_queue *sq = &priv->status_queue; in __ipw2100_rx_process()
2709 read_register(priv->net_dev, IPW_MEM_HOST_SHARED_RX_READ_INDEX, &r); in __ipw2100_rx_process()
2710 read_register(priv->net_dev, IPW_MEM_HOST_SHARED_RX_WRITE_INDEX, &w); in __ipw2100_rx_process()
2712 if (r >= rxq->entries) { in __ipw2100_rx_process()
2713 IPW_DEBUG_RX("exit - bad read index\n"); in __ipw2100_rx_process()
2717 i = (rxq->next + 1) % rxq->entries; in __ipw2100_rx_process()
2721 r, rxq->next, i); */ in __ipw2100_rx_process()
2723 packet = &priv->rx_buffers[i]; in __ipw2100_rx_process()
2727 pci_dma_sync_single_for_cpu(priv->pci_dev, packet->dma_addr, in __ipw2100_rx_process()
2736 u = packet->rxp; in __ipw2100_rx_process()
2737 frame_type = sq->drv[i].status_fields & STATUS_TYPE_MASK; in __ipw2100_rx_process()
2738 stats.rssi = sq->drv[i].rssi + IPW2100_RSSI_TO_DBM; in __ipw2100_rx_process()
2739 stats.len = sq->drv[i].frame_size; in __ipw2100_rx_process()
2747 priv->net_dev->name, frame_types[frame_type], in __ipw2100_rx_process()
2753 isr_rx_complete_command(priv, &u->rx_data.command); in __ipw2100_rx_process()
2757 isr_status_change(priv, u->rx_data.status); in __ipw2100_rx_process()
2763 if (priv->ieee->iw_mode == IW_MODE_MONITOR) { in __ipw2100_rx_process()
2770 switch (WLAN_FC_GET_TYPE(le16_to_cpu(u->rx_data.header.frame_ctl))) { in __ipw2100_rx_process()
2772 libipw_rx_mgt(priv->ieee, in __ipw2100_rx_process()
2773 &u->rx_data.header, &stats); in __ipw2100_rx_process()
2789 rxq->drv[i].status.info.field = 0; in __ipw2100_rx_process()
2791 i = (i + 1) % rxq->entries; in __ipw2100_rx_process()
2796 rxq->next = (i ? i : rxq->entries) - 1; in __ipw2100_rx_process()
2798 write_register(priv->net_dev, in __ipw2100_rx_process()
2799 IPW_MEM_HOST_SHARED_RX_WRITE_INDEX, rxq->next); in __ipw2100_rx_process()
2817 * Read index - points to the next TBD that the firmware will
2821 * Write index - driver fills this entry with an constructed TBD
2834 * The OLDEST index is cached in the variable 'priv->tx_queue.oldest'
2844 struct ipw2100_bd_queue *txq = &priv->tx_queue; in __ipw2100_tx_process()
2852 if (list_empty(&priv->fw_pend_list)) in __ipw2100_tx_process()
2855 element = priv->fw_pend_list.next; in __ipw2100_tx_process()
2858 tbd = &txq->drv[packet->index]; in __ipw2100_tx_process()
2861 switch (packet->type) { in __ipw2100_tx_process()
2865 e = txq->oldest; in __ipw2100_tx_process()
2870 descriptors_used = tbd->num_fragments; in __ipw2100_tx_process()
2871 frag_num = tbd->num_fragments - 1; in __ipw2100_tx_process()
2872 e = txq->oldest + frag_num; in __ipw2100_tx_process()
2873 e %= txq->entries; in __ipw2100_tx_process()
2878 priv->net_dev->name); in __ipw2100_tx_process()
2886 read_register(priv->net_dev, IPW_MEM_HOST_SHARED_TX_QUEUE_READ_INDEX, in __ipw2100_tx_process()
2888 read_register(priv->net_dev, IPW_MEM_HOST_SHARED_TX_QUEUE_WRITE_INDEX, in __ipw2100_tx_process()
2890 if (w != txq->next) in __ipw2100_tx_process()
2892 priv->net_dev->name); in __ipw2100_tx_process()
2895 * txq->next is the index of the last packet written txq->oldest is in __ipw2100_tx_process()
2904 * ===>| s---->|=============== in __ipw2100_tx_process()
2907 * r---->| in __ipw2100_tx_process()
2910 * w - updated by driver in __ipw2100_tx_process()
2911 * r - updated by firmware in __ipw2100_tx_process()
2912 * s - start of oldest BD entry (txq->oldest) in __ipw2100_tx_process()
2913 * e - end of oldest BD entry in __ipw2100_tx_process()
2917 IPW_DEBUG_TX("exit - no processed packets ready to release.\n"); in __ipw2100_tx_process()
2922 DEC_STAT(&priv->fw_pend_stat); in __ipw2100_tx_process()
2926 i = txq->oldest; in __ipw2100_tx_process()
2928 &txq->drv[i], in __ipw2100_tx_process()
2929 (u32) (txq->nic + i * sizeof(struct ipw2100_bd)), in __ipw2100_tx_process()
2930 txq->drv[i].host_addr, txq->drv[i].buf_length); in __ipw2100_tx_process()
2932 if (packet->type == DATA) { in __ipw2100_tx_process()
2933 i = (i + 1) % txq->entries; in __ipw2100_tx_process()
2936 &txq->drv[i], in __ipw2100_tx_process()
2937 (u32) (txq->nic + i * in __ipw2100_tx_process()
2939 (u32) txq->drv[i].host_addr, in __ipw2100_tx_process()
2940 txq->drv[i].buf_length); in __ipw2100_tx_process()
2945 switch (packet->type) { in __ipw2100_tx_process()
2947 if (txq->drv[txq->oldest].status.info.fields.txType != 0) in __ipw2100_tx_process()
2951 priv->net_dev->name, txq->oldest, packet->index); in __ipw2100_tx_process()
2955 tbd = &txq->drv[(packet->index + 1 + i) % txq->entries]; in __ipw2100_tx_process()
2958 (packet->index + 1 + i) % txq->entries, in __ipw2100_tx_process()
2959 tbd->host_addr, tbd->buf_length); in __ipw2100_tx_process()
2961 pci_unmap_single(priv->pci_dev, in __ipw2100_tx_process()
2962 tbd->host_addr, in __ipw2100_tx_process()
2963 tbd->buf_length, PCI_DMA_TODEVICE); in __ipw2100_tx_process()
2966 libipw_txb_free(packet->info.d_struct.txb); in __ipw2100_tx_process()
2967 packet->info.d_struct.txb = NULL; in __ipw2100_tx_process()
2969 list_add_tail(element, &priv->tx_free_list); in __ipw2100_tx_process()
2970 INC_STAT(&priv->tx_free_stat); in __ipw2100_tx_process()
2974 if (priv->status & STATUS_ASSOCIATED) in __ipw2100_tx_process()
2975 netif_wake_queue(priv->net_dev); in __ipw2100_tx_process()
2979 priv->net_dev->trans_start = jiffies; in __ipw2100_tx_process()
2984 if (txq->drv[txq->oldest].status.info.fields.txType != 1) in __ipw2100_tx_process()
2988 priv->net_dev->name, txq->oldest, packet->index); in __ipw2100_tx_process()
2991 if (packet->info.c_struct.cmd->host_command_reg < in __ipw2100_tx_process()
2994 command_types[packet->info.c_struct.cmd-> in __ipw2100_tx_process()
2996 packet->info.c_struct.cmd-> in __ipw2100_tx_process()
2998 packet->info.c_struct.cmd->cmd_status_reg); in __ipw2100_tx_process()
3001 list_add_tail(element, &priv->msg_free_list); in __ipw2100_tx_process()
3002 INC_STAT(&priv->msg_free_stat); in __ipw2100_tx_process()
3007 txq->oldest = (e + 1) % txq->entries; in __ipw2100_tx_process()
3009 txq->available += descriptors_used; in __ipw2100_tx_process()
3010 SET_STAT(&priv->txq_stat, txq->available); in __ipw2100_tx_process()
3013 jiffies - packet->jiffy_start); in __ipw2100_tx_process()
3015 return (!list_empty(&priv->fw_pend_list)); in __ipw2100_tx_process()
3028 priv->net_dev->name, i); in __ipw2100_tx_complete()
3036 struct ipw2100_bd_queue *txq = &priv->tx_queue; in ipw2100_tx_send_commands()
3038 int next = txq->next; in ipw2100_tx_send_commands()
3040 while (!list_empty(&priv->msg_pend_list)) { in ipw2100_tx_send_commands()
3047 if (txq->available <= 3) { in ipw2100_tx_send_commands()
3052 element = priv->msg_pend_list.next; in ipw2100_tx_send_commands()
3054 DEC_STAT(&priv->msg_pend_stat); in ipw2100_tx_send_commands()
3059 &txq->drv[txq->next], in ipw2100_tx_send_commands()
3060 (u32) (txq->nic + txq->next * in ipw2100_tx_send_commands()
3063 packet->index = txq->next; in ipw2100_tx_send_commands()
3065 tbd = &txq->drv[txq->next]; in ipw2100_tx_send_commands()
3068 tbd->host_addr = packet->info.c_struct.cmd_phys; in ipw2100_tx_send_commands()
3069 tbd->buf_length = sizeof(struct ipw2100_cmd_header); in ipw2100_tx_send_commands()
3072 tbd->num_fragments = 1; in ipw2100_tx_send_commands()
3073 tbd->status.info.field = in ipw2100_tx_send_commands()
3078 txq->next++; in ipw2100_tx_send_commands()
3079 txq->next %= txq->entries; in ipw2100_tx_send_commands()
3080 txq->available--; in ipw2100_tx_send_commands()
3081 DEC_STAT(&priv->txq_stat); in ipw2100_tx_send_commands()
3083 list_add_tail(element, &priv->fw_pend_list); in ipw2100_tx_send_commands()
3084 INC_STAT(&priv->fw_pend_stat); in ipw2100_tx_send_commands()
3087 if (txq->next != next) { in ipw2100_tx_send_commands()
3091 write_register(priv->net_dev, in ipw2100_tx_send_commands()
3093 txq->next); in ipw2100_tx_send_commands()
3105 struct ipw2100_bd_queue *txq = &priv->tx_queue; in ipw2100_tx_send_data()
3107 int next = txq->next; in ipw2100_tx_send_data()
3112 while (!list_empty(&priv->tx_pend_list)) { in ipw2100_tx_send_data()
3119 element = priv->tx_pend_list.next; in ipw2100_tx_send_data()
3122 if (unlikely(1 + packet->info.d_struct.txb->nr_frags > in ipw2100_tx_send_data()
3128 priv->net_dev->name); in ipw2100_tx_send_data()
3131 if (txq->available <= 3 + packet->info.d_struct.txb->nr_frags) { in ipw2100_tx_send_data()
3137 DEC_STAT(&priv->tx_pend_stat); in ipw2100_tx_send_data()
3139 tbd = &txq->drv[txq->next]; in ipw2100_tx_send_data()
3141 packet->index = txq->next; in ipw2100_tx_send_data()
3143 ipw_hdr = packet->info.d_struct.data; in ipw2100_tx_send_data()
3144 hdr = (struct libipw_hdr_3addr *)packet->info.d_struct.txb-> in ipw2100_tx_send_data()
3145 fragments[0]->data; in ipw2100_tx_send_data()
3147 if (priv->ieee->iw_mode == IW_MODE_INFRA) { in ipw2100_tx_send_data()
3150 memcpy(ipw_hdr->src_addr, hdr->addr2, ETH_ALEN); in ipw2100_tx_send_data()
3151 memcpy(ipw_hdr->dst_addr, hdr->addr3, ETH_ALEN); in ipw2100_tx_send_data()
3152 } else if (priv->ieee->iw_mode == IW_MODE_ADHOC) { in ipw2100_tx_send_data()
3155 memcpy(ipw_hdr->src_addr, hdr->addr2, ETH_ALEN); in ipw2100_tx_send_data()
3156 memcpy(ipw_hdr->dst_addr, hdr->addr1, ETH_ALEN); in ipw2100_tx_send_data()
3159 ipw_hdr->host_command_reg = SEND; in ipw2100_tx_send_data()
3160 ipw_hdr->host_command_reg1 = 0; in ipw2100_tx_send_data()
3163 ipw_hdr->needs_encryption = 0; in ipw2100_tx_send_data()
3164 ipw_hdr->encrypted = packet->info.d_struct.txb->encrypted; in ipw2100_tx_send_data()
3165 if (packet->info.d_struct.txb->nr_frags > 1) in ipw2100_tx_send_data()
3166 ipw_hdr->fragment_size = in ipw2100_tx_send_data()
3167 packet->info.d_struct.txb->frag_size - in ipw2100_tx_send_data()
3170 ipw_hdr->fragment_size = 0; in ipw2100_tx_send_data()
3172 tbd->host_addr = packet->info.d_struct.data_phys; in ipw2100_tx_send_data()
3173 tbd->buf_length = sizeof(struct ipw2100_data_header); in ipw2100_tx_send_data()
3174 tbd->num_fragments = 1 + packet->info.d_struct.txb->nr_frags; in ipw2100_tx_send_data()
3175 tbd->status.info.field = in ipw2100_tx_send_data()
3178 txq->next++; in ipw2100_tx_send_data()
3179 txq->next %= txq->entries; in ipw2100_tx_send_data()
3182 packet->index, tbd->host_addr, tbd->buf_length); in ipw2100_tx_send_data()
3184 if (packet->info.d_struct.txb->nr_frags > 1) in ipw2100_tx_send_data()
3186 packet->info.d_struct.txb->nr_frags); in ipw2100_tx_send_data()
3189 for (i = 0; i < packet->info.d_struct.txb->nr_frags; i++) { in ipw2100_tx_send_data()
3190 tbd = &txq->drv[txq->next]; in ipw2100_tx_send_data()
3191 if (i == packet->info.d_struct.txb->nr_frags - 1) in ipw2100_tx_send_data()
3192 tbd->status.info.field = in ipw2100_tx_send_data()
3196 tbd->status.info.field = in ipw2100_tx_send_data()
3200 tbd->buf_length = packet->info.d_struct.txb-> in ipw2100_tx_send_data()
3201 fragments[i]->len - LIBIPW_3ADDR_LEN; in ipw2100_tx_send_data()
3203 tbd->host_addr = pci_map_single(priv->pci_dev, in ipw2100_tx_send_data()
3204 packet->info.d_struct. in ipw2100_tx_send_data()
3205 txb->fragments[i]-> in ipw2100_tx_send_data()
3208 tbd->buf_length, in ipw2100_tx_send_data()
3212 txq->next, tbd->host_addr, in ipw2100_tx_send_data()
3213 tbd->buf_length); in ipw2100_tx_send_data()
3215 pci_dma_sync_single_for_device(priv->pci_dev, in ipw2100_tx_send_data()
3216 tbd->host_addr, in ipw2100_tx_send_data()
3217 tbd->buf_length, in ipw2100_tx_send_data()
3220 txq->next++; in ipw2100_tx_send_data()
3221 txq->next %= txq->entries; in ipw2100_tx_send_data()
3224 txq->available -= 1 + packet->info.d_struct.txb->nr_frags; in ipw2100_tx_send_data()
3225 SET_STAT(&priv->txq_stat, txq->available); in ipw2100_tx_send_data()
3227 list_add_tail(element, &priv->fw_pend_list); in ipw2100_tx_send_data()
3228 INC_STAT(&priv->fw_pend_stat); in ipw2100_tx_send_data()
3231 if (txq->next != next) { in ipw2100_tx_send_data()
3234 write_register(priv->net_dev, in ipw2100_tx_send_data()
3236 txq->next); in ipw2100_tx_send_data()
3242 struct net_device *dev = priv->net_dev; in ipw2100_irq_tasklet()
3246 spin_lock_irqsave(&priv->low_lock, flags); in ipw2100_irq_tasklet()
3251 IPW_DEBUG_ISR("enter - INTA: 0x%08lX\n", in ipw2100_irq_tasklet()
3254 priv->in_isr++; in ipw2100_irq_tasklet()
3255 priv->interrupts++; in ipw2100_irq_tasklet()
3266 priv->inta_other++; in ipw2100_irq_tasklet()
3269 read_nic_dword(dev, IPW_NIC_FATAL_ERROR, &priv->fatal_error); in ipw2100_irq_tasklet()
3271 priv->net_dev->name, priv->fatal_error); in ipw2100_irq_tasklet()
3273 read_nic_dword(dev, IPW_ERROR_ADDR(priv->fatal_error), &tmp); in ipw2100_irq_tasklet()
3275 priv->net_dev->name, tmp); in ipw2100_irq_tasklet()
3284 priv->inta_other++; in ipw2100_irq_tasklet()
3291 priv->rx_interrupts++; in ipw2100_irq_tasklet()
3302 priv->tx_interrupts++; in ipw2100_irq_tasklet()
3313 priv->inta_other++; in ipw2100_irq_tasklet()
3321 priv->inta_other++; in ipw2100_irq_tasklet()
3327 priv->inta_other++; in ipw2100_irq_tasklet()
3342 priv->inta_other++; in ipw2100_irq_tasklet()
3348 priv->inta_other++; in ipw2100_irq_tasklet()
3353 priv->in_isr--; in ipw2100_irq_tasklet()
3356 spin_unlock_irqrestore(&priv->low_lock, flags); in ipw2100_irq_tasklet()
3369 spin_lock(&priv->low_lock); in ipw2100_interrupt()
3375 if (!(priv->status & STATUS_INT_ENABLED)) { in ipw2100_interrupt()
3380 read_register(priv->net_dev, IPW_REG_INTA_MASK, &inta_mask); in ipw2100_interrupt()
3381 read_register(priv->net_dev, IPW_REG_INTA, &inta); in ipw2100_interrupt()
3398 * work tasklet, so if another part of the code re-enables the in ipw2100_interrupt()
3402 tasklet_schedule(&priv->irq_tasklet); in ipw2100_interrupt()
3403 spin_unlock(&priv->low_lock); in ipw2100_interrupt()
3407 spin_unlock(&priv->low_lock); in ipw2100_interrupt()
3419 spin_lock_irqsave(&priv->low_lock, flags); in ipw2100_tx()
3421 if (!(priv->status & STATUS_ASSOCIATED)) { in ipw2100_tx()
3423 priv->net_dev->stats.tx_carrier_errors++; in ipw2100_tx()
3428 if (list_empty(&priv->tx_free_list)) in ipw2100_tx()
3431 element = priv->tx_free_list.next; in ipw2100_tx()
3434 packet->info.d_struct.txb = txb; in ipw2100_tx()
3436 IPW_DEBUG_TX("Sending fragment (%d bytes):\n", txb->fragments[0]->len); in ipw2100_tx()
3437 printk_buf(IPW_DL_TX, txb->fragments[0]->data, txb->fragments[0]->len); in ipw2100_tx()
3439 packet->jiffy_start = jiffies; in ipw2100_tx()
3442 DEC_STAT(&priv->tx_free_stat); in ipw2100_tx()
3444 list_add_tail(element, &priv->tx_pend_list); in ipw2100_tx()
3445 INC_STAT(&priv->tx_pend_stat); in ipw2100_tx()
3449 spin_unlock_irqrestore(&priv->low_lock, flags); in ipw2100_tx()
3454 spin_unlock_irqrestore(&priv->low_lock, flags); in ipw2100_tx()
3460 int i, j, err = -EINVAL; in ipw2100_msg_allocate()
3464 priv->msg_buffers = in ipw2100_msg_allocate()
3467 if (!priv->msg_buffers) { in ipw2100_msg_allocate()
3469 "buffers.\n", priv->net_dev->name); in ipw2100_msg_allocate()
3470 return -ENOMEM; in ipw2100_msg_allocate()
3474 v = pci_alloc_consistent(priv->pci_dev, in ipw2100_msg_allocate()
3479 "buffers.\n", priv->net_dev->name); in ipw2100_msg_allocate()
3480 err = -ENOMEM; in ipw2100_msg_allocate()
3486 priv->msg_buffers[i].type = COMMAND; in ipw2100_msg_allocate()
3487 priv->msg_buffers[i].info.c_struct.cmd = in ipw2100_msg_allocate()
3489 priv->msg_buffers[i].info.c_struct.cmd_phys = p; in ipw2100_msg_allocate()
3496 pci_free_consistent(priv->pci_dev, in ipw2100_msg_allocate()
3498 priv->msg_buffers[j].info.c_struct.cmd, in ipw2100_msg_allocate()
3499 priv->msg_buffers[j].info.c_struct. in ipw2100_msg_allocate()
3503 kfree(priv->msg_buffers); in ipw2100_msg_allocate()
3504 priv->msg_buffers = NULL; in ipw2100_msg_allocate()
3513 INIT_LIST_HEAD(&priv->msg_free_list); in ipw2100_msg_initialize()
3514 INIT_LIST_HEAD(&priv->msg_pend_list); in ipw2100_msg_initialize()
3517 list_add_tail(&priv->msg_buffers[i].list, &priv->msg_free_list); in ipw2100_msg_initialize()
3518 SET_STAT(&priv->msg_free_stat, i); in ipw2100_msg_initialize()
3527 if (!priv->msg_buffers) in ipw2100_msg_free()
3531 pci_free_consistent(priv->pci_dev, in ipw2100_msg_free()
3533 priv->msg_buffers[i].info.c_struct.cmd, in ipw2100_msg_free()
3534 priv->msg_buffers[i].info.c_struct. in ipw2100_msg_free()
3538 kfree(priv->msg_buffers); in ipw2100_msg_free()
3539 priv->msg_buffers = NULL; in ipw2100_msg_free()
3559 return out - buf; in show_pci()
3568 return sprintf(buf, "0x%08x\n", (int)p->config); in show_cfg()
3577 return sprintf(buf, "0x%08x\n", (int)p->status); in show_status()
3586 return sprintf(buf, "0x%08x\n", (int)p->capability); in show_capability()
3732 "rx frames dropped due to non-sequential fragment"),
3784 IPW2100_ORD(POWER_MGMT_MODE, "Power mode - 0=CAM, 1=PSP"),
3795 "current radio freq lower digits - channel ID"),
3831 struct net_device *dev = priv->net_dev; in show_registers()
3843 return out - buf; in show_registers()
3852 struct net_device *dev = priv->net_dev; in show_hardware()
3884 return out - buf; in show_hardware()
3893 struct net_device *dev = priv->net_dev; in show_memory()
3904 while (len < PAGE_SIZE - 128 && loop < 0x30000) { in show_memory()
3906 if (priv->snapshot[0]) in show_memory()
3914 if (priv->dump_raw) in show_memory()
3950 struct net_device *dev = priv->net_dev; in store_memory()
3953 (void)dev; /* kill unused-var warning for debug-only code */ in store_memory()
3961 dev->name); in store_memory()
3962 priv->dump_raw = 1; in store_memory()
3967 dev->name); in store_memory()
3968 priv->dump_raw = 0; in store_memory()
3971 IPW_DEBUG_INFO("%s: Resetting firmware snapshot.\n", dev->name); in store_memory()
3976 "reset = clear memory snapshot\n", dev->name); in store_memory()
3992 if (priv->status & STATUS_RF_KILL_MASK) in show_ordinals()
3999 while (len < PAGE_SIZE - 128 && loop < ARRAY_SIZE(ord_data)) { in show_ordinals()
4026 priv->interrupts, priv->tx_interrupts, in show_stats()
4027 priv->rx_interrupts, priv->inta_other); in show_stats()
4028 out += sprintf(out, "firmware resets: %d\n", priv->resets); in show_stats()
4029 out += sprintf(out, "firmware hangs: %d\n", priv->hangs); in show_stats()
4032 priv->snapshot[0] ? "YES" : "NO"); in show_stats()
4035 return out - buf; in show_stats()
4044 if (mode == priv->ieee->iw_mode) in ipw2100_switch_mode()
4050 priv->net_dev->name, err); in ipw2100_switch_mode()
4056 priv->net_dev->type = ARPHRD_ETHER; in ipw2100_switch_mode()
4059 priv->net_dev->type = ARPHRD_ETHER; in ipw2100_switch_mode()
4063 priv->last_mode = priv->ieee->iw_mode; in ipw2100_switch_mode()
4064 priv->net_dev->type = ARPHRD_IEEE80211_RADIOTAP; in ipw2100_switch_mode()
4069 priv->ieee->iw_mode = mode; in ipw2100_switch_mode()
4072 /* Indicate ipw2100_download_firmware download firmware in ipw2100_switch_mode()
4077 printk(KERN_INFO "%s: Reseting on mode change.\n", priv->net_dev->name); in ipw2100_switch_mode()
4078 priv->reset_backoff = 0; in ipw2100_switch_mode()
4090 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x) in show_internals()
4092 if (priv->status & STATUS_ASSOCIATED) in show_internals()
4094 get_seconds() - priv->connect_start); in show_internals()
4098 DUMP_VAR(ieee->crypt_info.crypt[priv->ieee->crypt_info.tx_keyidx], "p"); in show_internals()
4105 (unsigned long)priv->last_rtc); in show_internals()
4130 DUMP_VAR(ieee->scans, "d"); in show_internals()
4149 if (priv->status & STATUS_RF_KILL_MASK) in show_bssinfo()
4178 return out - buf; in show_bssinfo()
4221 if (priv->fatal_error) in show_fatal_error()
4222 out += sprintf(out, "0x%08X\n", priv->fatal_error); in show_fatal_error()
4227 if (!priv->fatal_errors[(priv->fatal_index - i) % in show_fatal_error()
4232 priv->fatal_errors[(priv->fatal_index - i) % in show_fatal_error()
4236 return out - buf; in show_fatal_error()
4255 return sprintf(buf, "%d\n", priv->ieee->scan_age); in show_scan_age()
4262 struct net_device *dev = priv->net_dev; in store_scan_age()
4265 (sizeof(buffer) - 1) > count ? count : sizeof(buffer) - 1; in store_scan_age()
4269 (void)dev; /* kill unused-var warning for debug-only code */ in store_scan_age()
4284 IPW_DEBUG_INFO("%s: user supplied invalid value.\n", dev->name); in store_scan_age()
4286 priv->ieee->scan_age = val; in store_scan_age()
4287 IPW_DEBUG_INFO("set scan_age = %u\n", priv->ieee->scan_age); in store_scan_age()
4299 /* 0 - RF kill not enabled in show_rf_kill()
4300 1 - SW based RF kill active (sysfs) in show_rf_kill()
4301 2 - HW based RF kill active in show_rf_kill()
4302 3 - Both HW and SW baed RF kill active */ in show_rf_kill()
4304 int val = ((priv->status & STATUS_RF_KILL_SW) ? 0x1 : 0x0) | in show_rf_kill()
4312 (priv->status & STATUS_RF_KILL_SW ? 1 : 0)) in ipw_radio_kill_sw()
4318 mutex_lock(&priv->action_mutex); in ipw_radio_kill_sw()
4321 priv->status |= STATUS_RF_KILL_SW; in ipw_radio_kill_sw()
4324 priv->status &= ~STATUS_RF_KILL_SW; in ipw_radio_kill_sw()
4326 IPW_DEBUG_RF_KILL("Can not turn radio back on - " in ipw_radio_kill_sw()
4329 priv->stop_rf_kill = 0; in ipw_radio_kill_sw()
4330 cancel_delayed_work(&priv->rf_kill); in ipw_radio_kill_sw()
4331 schedule_delayed_work(&priv->rf_kill, in ipw_radio_kill_sw()
4337 mutex_unlock(&priv->action_mutex); in ipw_radio_kill_sw()
4375 struct ipw2100_status_queue *q = &priv->status_queue; in status_queue_allocate()
4379 q->size = entries * sizeof(struct ipw2100_status); in status_queue_allocate()
4380 q->drv = in status_queue_allocate()
4381 (struct ipw2100_status *)pci_alloc_consistent(priv->pci_dev, in status_queue_allocate()
4382 q->size, &q->nic); in status_queue_allocate()
4383 if (!q->drv) { in status_queue_allocate()
4385 return -ENOMEM; in status_queue_allocate()
4388 memset(q->drv, 0, q->size); in status_queue_allocate()
4399 if (priv->status_queue.drv) { in status_queue_free()
4400 pci_free_consistent(priv->pci_dev, priv->status_queue.size, in status_queue_free()
4401 priv->status_queue.drv, in status_queue_free()
4402 priv->status_queue.nic); in status_queue_free()
4403 priv->status_queue.drv = NULL; in status_queue_free()
4416 q->entries = entries; in bd_queue_allocate()
4417 q->size = entries * sizeof(struct ipw2100_bd); in bd_queue_allocate()
4418 q->drv = pci_alloc_consistent(priv->pci_dev, q->size, &q->nic); in bd_queue_allocate()
4419 if (!q->drv) { in bd_queue_allocate()
4422 return -ENOMEM; in bd_queue_allocate()
4424 memset(q->drv, 0, q->size); in bd_queue_allocate()
4438 if (q->drv) { in bd_queue_free()
4439 pci_free_consistent(priv->pci_dev, q->size, q->drv, q->nic); in bd_queue_free()
4440 q->drv = NULL; in bd_queue_free()
4452 IPW_DEBUG_INFO("initializing bd queue at virt=%p, phys=%08x\n", q->drv, in bd_queue_initialize()
4453 (u32) q->nic); in bd_queue_initialize()
4455 write_register(priv->net_dev, base, q->nic); in bd_queue_initialize()
4456 write_register(priv->net_dev, size, q->entries); in bd_queue_initialize()
4457 write_register(priv->net_dev, r, q->oldest); in bd_queue_initialize()
4458 write_register(priv->net_dev, w, q->next); in bd_queue_initialize()
4465 priv->stop_rf_kill = 1; in ipw2100_kill_works()
4466 priv->stop_hang_check = 1; in ipw2100_kill_works()
4467 cancel_delayed_work_sync(&priv->reset_work); in ipw2100_kill_works()
4468 cancel_delayed_work_sync(&priv->security_work); in ipw2100_kill_works()
4469 cancel_delayed_work_sync(&priv->wx_event_work); in ipw2100_kill_works()
4470 cancel_delayed_work_sync(&priv->hang_check); in ipw2100_kill_works()
4471 cancel_delayed_work_sync(&priv->rf_kill); in ipw2100_kill_works()
4472 cancel_work_sync(&priv->scan_event_now); in ipw2100_kill_works()
4473 cancel_delayed_work_sync(&priv->scan_event_later); in ipw2100_kill_works()
4478 int i, j, err = -EINVAL; in ipw2100_tx_allocate()
4484 err = bd_queue_allocate(priv, &priv->tx_queue, TX_QUEUE_LENGTH); in ipw2100_tx_allocate()
4487 priv->net_dev->name); in ipw2100_tx_allocate()
4491 priv->tx_buffers = in ipw2100_tx_allocate()
4494 if (!priv->tx_buffers) { in ipw2100_tx_allocate()
4497 priv->net_dev->name); in ipw2100_tx_allocate()
4498 bd_queue_free(priv, &priv->tx_queue); in ipw2100_tx_allocate()
4499 return -ENOMEM; in ipw2100_tx_allocate()
4503 v = pci_alloc_consistent(priv->pci_dev, in ipw2100_tx_allocate()
4509 priv->net_dev->name); in ipw2100_tx_allocate()
4510 err = -ENOMEM; in ipw2100_tx_allocate()
4514 priv->tx_buffers[i].type = DATA; in ipw2100_tx_allocate()
4515 priv->tx_buffers[i].info.d_struct.data = in ipw2100_tx_allocate()
4517 priv->tx_buffers[i].info.d_struct.data_phys = p; in ipw2100_tx_allocate()
4518 priv->tx_buffers[i].info.d_struct.txb = NULL; in ipw2100_tx_allocate()
4525 pci_free_consistent(priv->pci_dev, in ipw2100_tx_allocate()
4527 priv->tx_buffers[j].info.d_struct.data, in ipw2100_tx_allocate()
4528 priv->tx_buffers[j].info.d_struct. in ipw2100_tx_allocate()
4532 kfree(priv->tx_buffers); in ipw2100_tx_allocate()
4533 priv->tx_buffers = NULL; in ipw2100_tx_allocate()
4547 INIT_LIST_HEAD(&priv->fw_pend_list); in ipw2100_tx_initialize()
4548 INIT_STAT(&priv->fw_pend_stat); in ipw2100_tx_initialize()
4553 INIT_LIST_HEAD(&priv->tx_pend_list); in ipw2100_tx_initialize()
4554 INIT_LIST_HEAD(&priv->tx_free_list); in ipw2100_tx_initialize()
4555 INIT_STAT(&priv->tx_pend_stat); in ipw2100_tx_initialize()
4556 INIT_STAT(&priv->tx_free_stat); in ipw2100_tx_initialize()
4561 if (priv->tx_buffers[i].info.d_struct.txb) { in ipw2100_tx_initialize()
4562 libipw_txb_free(priv->tx_buffers[i].info.d_struct. in ipw2100_tx_initialize()
4564 priv->tx_buffers[i].info.d_struct.txb = NULL; in ipw2100_tx_initialize()
4567 list_add_tail(&priv->tx_buffers[i].list, &priv->tx_free_list); in ipw2100_tx_initialize()
4570 SET_STAT(&priv->tx_free_stat, i); in ipw2100_tx_initialize()
4572 priv->tx_queue.oldest = 0; in ipw2100_tx_initialize()
4573 priv->tx_queue.available = priv->tx_queue.entries; in ipw2100_tx_initialize()
4574 priv->tx_queue.next = 0; in ipw2100_tx_initialize()
4575 INIT_STAT(&priv->txq_stat); in ipw2100_tx_initialize()
4576 SET_STAT(&priv->txq_stat, priv->tx_queue.available); in ipw2100_tx_initialize()
4578 bd_queue_initialize(priv, &priv->tx_queue, in ipw2100_tx_initialize()
4594 bd_queue_free(priv, &priv->tx_queue); in ipw2100_tx_free()
4596 if (!priv->tx_buffers) in ipw2100_tx_free()
4600 if (priv->tx_buffers[i].info.d_struct.txb) { in ipw2100_tx_free()
4601 libipw_txb_free(priv->tx_buffers[i].info.d_struct. in ipw2100_tx_free()
4603 priv->tx_buffers[i].info.d_struct.txb = NULL; in ipw2100_tx_free()
4605 if (priv->tx_buffers[i].info.d_struct.data) in ipw2100_tx_free()
4606 pci_free_consistent(priv->pci_dev, in ipw2100_tx_free()
4608 priv->tx_buffers[i].info.d_struct. in ipw2100_tx_free()
4610 priv->tx_buffers[i].info.d_struct. in ipw2100_tx_free()
4614 kfree(priv->tx_buffers); in ipw2100_tx_free()
4615 priv->tx_buffers = NULL; in ipw2100_tx_free()
4622 int i, j, err = -EINVAL; in ipw2100_rx_allocate()
4626 err = bd_queue_allocate(priv, &priv->rx_queue, RX_QUEUE_LENGTH); in ipw2100_rx_allocate()
4635 bd_queue_free(priv, &priv->rx_queue); in ipw2100_rx_allocate()
4642 priv->rx_buffers = kmalloc(RX_QUEUE_LENGTH * in ipw2100_rx_allocate()
4645 if (!priv->rx_buffers) { in ipw2100_rx_allocate()
4648 bd_queue_free(priv, &priv->rx_queue); in ipw2100_rx_allocate()
4652 return -ENOMEM; in ipw2100_rx_allocate()
4656 struct ipw2100_rx_packet *packet = &priv->rx_buffers[i]; in ipw2100_rx_allocate()
4660 err = -ENOMEM; in ipw2100_rx_allocate()
4664 /* The BD holds the cache aligned address */ in ipw2100_rx_allocate()
4665 priv->rx_queue.drv[i].host_addr = packet->dma_addr; in ipw2100_rx_allocate()
4666 priv->rx_queue.drv[i].buf_length = IPW_RX_NIC_BUFFER_LENGTH; in ipw2100_rx_allocate()
4667 priv->status_queue.drv[i].status_fields = 0; in ipw2100_rx_allocate()
4674 pci_unmap_single(priv->pci_dev, priv->rx_buffers[j].dma_addr, in ipw2100_rx_allocate()
4677 dev_kfree_skb(priv->rx_buffers[j].skb); in ipw2100_rx_allocate()
4680 kfree(priv->rx_buffers); in ipw2100_rx_allocate()
4681 priv->rx_buffers = NULL; in ipw2100_rx_allocate()
4683 bd_queue_free(priv, &priv->rx_queue); in ipw2100_rx_allocate()
4694 priv->rx_queue.oldest = 0; in ipw2100_rx_initialize()
4695 priv->rx_queue.available = priv->rx_queue.entries - 1; in ipw2100_rx_initialize()
4696 priv->rx_queue.next = priv->rx_queue.entries - 1; in ipw2100_rx_initialize()
4698 INIT_STAT(&priv->rxq_stat); in ipw2100_rx_initialize()
4699 SET_STAT(&priv->rxq_stat, priv->rx_queue.available); in ipw2100_rx_initialize()
4701 bd_queue_initialize(priv, &priv->rx_queue, in ipw2100_rx_initialize()
4708 write_register(priv->net_dev, IPW_MEM_HOST_SHARED_RX_STATUS_BASE, in ipw2100_rx_initialize()
4709 priv->status_queue.nic); in ipw2100_rx_initialize()
4720 bd_queue_free(priv, &priv->rx_queue); in ipw2100_rx_free()
4723 if (!priv->rx_buffers) in ipw2100_rx_free()
4727 if (priv->rx_buffers[i].rxp) { in ipw2100_rx_free()
4728 pci_unmap_single(priv->pci_dev, in ipw2100_rx_free()
4729 priv->rx_buffers[i].dma_addr, in ipw2100_rx_free()
4732 dev_kfree_skb(priv->rx_buffers[i].skb); in ipw2100_rx_free()
4736 kfree(priv->rx_buffers); in ipw2100_rx_free()
4737 priv->rx_buffers = NULL; in ipw2100_rx_free()
4752 return -EIO; in ipw2100_read_mac_address()
4755 memcpy(priv->net_dev->dev_addr, addr, ETH_ALEN); in ipw2100_read_mac_address()
4756 IPW_DEBUG_INFO("card MAC is %pM\n", priv->net_dev->dev_addr); in ipw2100_read_mac_address()
4780 if (priv->config & CFG_CUSTOM_MAC) { in ipw2100_set_mac_address()
4781 memcpy(cmd.host_command_parameters, priv->mac_addr, ETH_ALEN); in ipw2100_set_mac_address()
4782 memcpy(priv->net_dev->dev_addr, priv->mac_addr, ETH_ALEN); in ipw2100_set_mac_address()
4784 memcpy(cmd.host_command_parameters, priv->net_dev->dev_addr, in ipw2100_set_mac_address()
4813 port_type == IPW_IBSS ? "Ad-Hoc" : "Managed"); in ipw2100_set_port_type()
4820 priv->net_dev->name, err); in ipw2100_set_port_type()
4849 if (priv->ieee->iw_mode == IW_MODE_INFRA) in ipw2100_set_channel()
4854 return -EINVAL; in ipw2100_set_channel()
4869 priv->config |= CFG_STATIC_CHANNEL; in ipw2100_set_channel()
4871 priv->config &= ~CFG_STATIC_CHANNEL; in ipw2100_set_channel()
4873 priv->channel = channel; in ipw2100_set_channel()
4902 if (priv->ieee->iw_mode == IW_MODE_ADHOC) in ipw2100_system_config()
4908 if (!(priv->config & CFG_LONG_PREAMBLE)) in ipw2100_system_config()
4980 priv->tx_rates = rate; in ipw2100_set_tx_rates()
5001 priv->power_mode = IPW_POWER_LEVEL(priv->power_mode); in ipw2100_set_power_mode()
5003 priv->power_mode = IPW_POWER_ENABLED | power_level; in ipw2100_set_power_mode()
5006 if (priv->port_type == IBSS && priv->adhoc_power != DFTL_IBSS_TX_POWER) { in ipw2100_set_power_mode()
5009 cmd.host_command_parameters[0] = (u32) priv->adhoc_power; in ipw2100_set_power_mode()
5038 priv->rts_threshold = threshold; in ipw2100_set_rts_threshold()
5078 priv->frag_threshold = threshold;
5099 priv->short_retry_limit = retry; in ipw2100_set_short_retry()
5119 priv->long_retry_limit = retry; in ipw2100_set_long_retry()
5172 * the currently associated AP -- but in the off chance that a future in ipw2100_disassociate_bssid()
5175 memcpy(cmd.host_command_parameters, priv->bssid, ETH_ALEN); in ipw2100_disassociate_bssid()
5212 err = -EIO; in ipw2100_set_wpa_ie()
5246 security->auth_mode = auth_mode; in ipw2100_set_security_information()
5247 security->unicast_using_group = unicast_using_group; in ipw2100_set_security_information()
5252 security->allowed_ciphers = IPW_NONE_CIPHER; in ipw2100_set_security_information()
5255 security->allowed_ciphers = IPW_WEP40_CIPHER | in ipw2100_set_security_information()
5259 security->allowed_ciphers = IPW_WEP40_CIPHER | in ipw2100_set_security_information()
5263 security->allowed_ciphers = IPW_WEP40_CIPHER | in ipw2100_set_security_information()
5267 security->allowed_ciphers = IPW_WEP40_CIPHER | in ipw2100_set_security_information()
5274 security->auth_mode, security->allowed_ciphers, security_level); in ipw2100_set_security_information()
5276 security->replay_counters_number = 0; in ipw2100_set_security_information()
5303 tmp = (tx_power - IPW_TX_POWER_MIN_DBM) * 16 / in ipw2100_set_tx_power()
5304 (IPW_TX_POWER_MAX_DBM - IPW_TX_POWER_MIN_DBM); in ipw2100_set_tx_power()
5308 if (priv->ieee->iw_mode == IW_MODE_ADHOC) in ipw2100_set_tx_power()
5311 priv->tx_power = tx_power; in ipw2100_set_tx_power()
5330 if (priv->ieee->iw_mode == IW_MODE_ADHOC) { in ipw2100_set_ibss_beacon_interval()
5377 return -ENOMEM; in ipw2100_queues_allocate()
5401 priv->net_dev->name, err); in ipw2100_set_wep_flags()
5422 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
5423 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
5461 wep_key->idx = idx; in ipw2100_set_key()
5462 wep_key->len = keylen; in ipw2100_set_key()
5465 memcpy(wep_key->key, key, len); in ipw2100_set_key()
5466 memset(wep_key->key + len, 0, keylen - len); in ipw2100_set_key()
5472 priv->net_dev->name, wep_key->idx); in ipw2100_set_key()
5475 priv->net_dev->name, wep_key->idx, wep_key->len, in ipw2100_set_key()
5476 WEP_STR_64(wep_key->key)); in ipw2100_set_key()
5480 priv->net_dev->name, wep_key->idx, wep_key->len, in ipw2100_set_key()
5481 WEP_STR_128(wep_key->key)); in ipw2100_set_key()
5489 priv->net_dev->name, err); in ipw2100_set_key()
5519 return -EINVAL; in ipw2100_set_key_index()
5526 priv->net_dev->name, err); in ipw2100_set_key_index()
5544 if (!(priv->status & STATUS_RUNNING)) in ipw2100_configure_security()
5553 if (!priv->ieee->sec.enabled) { in ipw2100_configure_security()
5559 if (priv->ieee->sec.flags & SEC_AUTH_MODE) { in ipw2100_configure_security()
5560 if (priv->ieee->sec.auth_mode == WLAN_AUTH_SHARED_KEY) in ipw2100_configure_security()
5562 else if (priv->ieee->sec.auth_mode == WLAN_AUTH_LEAP) in ipw2100_configure_security()
5567 if (priv->ieee->sec.flags & SEC_LEVEL) in ipw2100_configure_security()
5568 sec_level = priv->ieee->sec.level; in ipw2100_configure_security()
5571 if (priv->ieee->sec.flags & SEC_UNICAST_GROUP) in ipw2100_configure_security()
5572 use_group = priv->ieee->sec.unicast_uses_group; in ipw2100_configure_security()
5582 if (priv->ieee->sec.enabled) { in ipw2100_configure_security()
5584 if (!(priv->ieee->sec.flags & (1 << i))) { in ipw2100_configure_security()
5585 memset(priv->ieee->sec.keys[i], 0, WEP_KEY_LEN); in ipw2100_configure_security()
5586 priv->ieee->sec.key_sizes[i] = 0; in ipw2100_configure_security()
5589 priv->ieee->sec.keys[i], in ipw2100_configure_security()
5590 priv->ieee->sec. in ipw2100_configure_security()
5597 ipw2100_set_key_index(priv, priv->ieee->crypt_info.tx_keyidx, 1); in ipw2100_configure_security()
5604 priv->ieee->sec. in ipw2100_configure_security()
5609 priv->status &= ~STATUS_SECURITY_UPDATED; in ipw2100_configure_security()
5624 * process this, then update the security settings--which causes in ipw2100_security_work()
5626 if (!(priv->status & STATUS_ASSOCIATED) && in ipw2100_security_work()
5627 priv->status & STATUS_SECURITY_UPDATED) in ipw2100_security_work()
5637 mutex_lock(&priv->action_mutex); in shim__set_security()
5638 if (!(priv->status & STATUS_INITIALIZED)) in shim__set_security()
5642 if (sec->flags & (1 << i)) { in shim__set_security()
5643 priv->ieee->sec.key_sizes[i] = sec->key_sizes[i]; in shim__set_security()
5644 if (sec->key_sizes[i] == 0) in shim__set_security()
5645 priv->ieee->sec.flags &= ~(1 << i); in shim__set_security()
5647 memcpy(priv->ieee->sec.keys[i], sec->keys[i], in shim__set_security()
5648 sec->key_sizes[i]); in shim__set_security()
5649 if (sec->level == SEC_LEVEL_1) { in shim__set_security()
5650 priv->ieee->sec.flags |= (1 << i); in shim__set_security()
5651 priv->status |= STATUS_SECURITY_UPDATED; in shim__set_security()
5653 priv->ieee->sec.flags &= ~(1 << i); in shim__set_security()
5657 if ((sec->flags & SEC_ACTIVE_KEY) && in shim__set_security()
5658 priv->ieee->sec.active_key != sec->active_key) { in shim__set_security()
5659 if (sec->active_key <= 3) { in shim__set_security()
5660 priv->ieee->sec.active_key = sec->active_key; in shim__set_security()
5661 priv->ieee->sec.flags |= SEC_ACTIVE_KEY; in shim__set_security()
5663 priv->ieee->sec.flags &= ~SEC_ACTIVE_KEY; in shim__set_security()
5665 priv->status |= STATUS_SECURITY_UPDATED; in shim__set_security()
5668 if ((sec->flags & SEC_AUTH_MODE) && in shim__set_security()
5669 (priv->ieee->sec.auth_mode != sec->auth_mode)) { in shim__set_security()
5670 priv->ieee->sec.auth_mode = sec->auth_mode; in shim__set_security()
5671 priv->ieee->sec.flags |= SEC_AUTH_MODE; in shim__set_security()
5672 priv->status |= STATUS_SECURITY_UPDATED; in shim__set_security()
5675 if (sec->flags & SEC_ENABLED && priv->ieee->sec.enabled != sec->enabled) { in shim__set_security()
5676 priv->ieee->sec.flags |= SEC_ENABLED; in shim__set_security()
5677 priv->ieee->sec.enabled = sec->enabled; in shim__set_security()
5678 priv->status |= STATUS_SECURITY_UPDATED; in shim__set_security()
5682 if (sec->flags & SEC_ENCRYPT) in shim__set_security()
5683 priv->ieee->sec.encrypt = sec->encrypt; in shim__set_security()
5685 if (sec->flags & SEC_LEVEL && priv->ieee->sec.level != sec->level) { in shim__set_security()
5686 priv->ieee->sec.level = sec->level; in shim__set_security()
5687 priv->ieee->sec.flags |= SEC_LEVEL; in shim__set_security()
5688 priv->status |= STATUS_SECURITY_UPDATED; in shim__set_security()
5692 priv->ieee->sec.flags & (1 << 8) ? '1' : '0', in shim__set_security()
5693 priv->ieee->sec.flags & (1 << 7) ? '1' : '0', in shim__set_security()
5694 priv->ieee->sec.flags & (1 << 6) ? '1' : '0', in shim__set_security()
5695 priv->ieee->sec.flags & (1 << 5) ? '1' : '0', in shim__set_security()
5696 priv->ieee->sec.flags & (1 << 4) ? '1' : '0', in shim__set_security()
5697 priv->ieee->sec.flags & (1 << 3) ? '1' : '0', in shim__set_security()
5698 priv->ieee->sec.flags & (1 << 2) ? '1' : '0', in shim__set_security()
5699 priv->ieee->sec.flags & (1 << 1) ? '1' : '0', in shim__set_security()
5700 priv->ieee->sec.flags & (1 << 0) ? '1' : '0'); in shim__set_security()
5706 * if (force_update || !(priv->status & STATUS_ASSOCIATED))*/ in shim__set_security()
5707 if (!(priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING))) in shim__set_security()
5710 mutex_unlock(&priv->action_mutex); in shim__set_security()
5725 if (priv->ieee->iw_mode == IW_MODE_MONITOR) { in ipw2100_adapter_setup()
5726 err = ipw2100_set_channel(priv, priv->channel, batch_mode); in ipw2100_adapter_setup()
5738 return -EIO; in ipw2100_adapter_setup()
5744 err = ipw2100_set_port_type(priv, priv->ieee->iw_mode, batch_mode); in ipw2100_adapter_setup()
5748 if (priv->ieee->iw_mode == IW_MODE_ADHOC) { in ipw2100_adapter_setup()
5749 err = ipw2100_set_channel(priv, priv->channel, batch_mode); in ipw2100_adapter_setup()
5758 err = ipw2100_set_tx_rates(priv, priv->tx_rates, batch_mode); in ipw2100_adapter_setup()
5767 err = ipw2100_set_rts_threshold(priv, priv->rts_threshold); in ipw2100_adapter_setup()
5771 if (priv->config & CFG_STATIC_BSSID) in ipw2100_adapter_setup()
5772 bssid = priv->bssid; in ipw2100_adapter_setup()
5779 if (priv->config & CFG_STATIC_ESSID) in ipw2100_adapter_setup()
5780 err = ipw2100_set_essid(priv, priv->essid, priv->essid_len, in ipw2100_adapter_setup()
5791 if (priv->ieee->iw_mode == IW_MODE_ADHOC) { in ipw2100_adapter_setup()
5794 priv->beacon_interval, in ipw2100_adapter_setup()
5799 err = ipw2100_set_tx_power(priv, priv->tx_power); in ipw2100_adapter_setup()
5806 priv, priv->frag_threshold, batch_mode); in ipw2100_adapter_setup()
5822 /* This method is called by the network layer -- not to be confused with
5831 if (!is_valid_ether_addr(addr->sa_data)) in ipw2100_set_address()
5832 return -EADDRNOTAVAIL; in ipw2100_set_address()
5834 mutex_lock(&priv->action_mutex); in ipw2100_set_address()
5836 priv->config |= CFG_CUSTOM_MAC; in ipw2100_set_address()
5837 memcpy(priv->mac_addr, addr->sa_data, ETH_ALEN); in ipw2100_set_address()
5843 priv->reset_backoff = 0; in ipw2100_set_address()
5844 mutex_unlock(&priv->action_mutex); in ipw2100_set_address()
5845 ipw2100_reset_adapter(&priv->reset_work.work); in ipw2100_set_address()
5849 mutex_unlock(&priv->action_mutex); in ipw2100_set_address()
5857 IPW_DEBUG_INFO("dev->open\n"); in ipw2100_open()
5859 spin_lock_irqsave(&priv->low_lock, flags); in ipw2100_open()
5860 if (priv->status & STATUS_ASSOCIATED) { in ipw2100_open()
5864 spin_unlock_irqrestore(&priv->low_lock, flags); in ipw2100_open()
5878 spin_lock_irqsave(&priv->low_lock, flags); in ipw2100_close()
5880 if (priv->status & STATUS_ASSOCIATED) in ipw2100_close()
5885 while (!list_empty(&priv->tx_pend_list)) { in ipw2100_close()
5886 element = priv->tx_pend_list.next; in ipw2100_close()
5890 DEC_STAT(&priv->tx_pend_stat); in ipw2100_close()
5892 libipw_txb_free(packet->info.d_struct.txb); in ipw2100_close()
5893 packet->info.d_struct.txb = NULL; in ipw2100_close()
5895 list_add_tail(element, &priv->tx_free_list); in ipw2100_close()
5896 INC_STAT(&priv->tx_free_stat); in ipw2100_close()
5898 spin_unlock_irqrestore(&priv->low_lock, flags); in ipw2100_close()
5912 dev->stats.tx_errors++; in ipw2100_tx_timeout()
5915 if (priv->ieee->iw_mode == IW_MODE_MONITOR) in ipw2100_tx_timeout()
5920 dev->name); in ipw2100_tx_timeout()
5928 priv->ieee->wpa_enabled = value; in ipw2100_wpa_enable()
5935 struct libipw_device *ieee = priv->ieee; in ipw2100_wpa_set_auth_algs()
5943 ieee->open_wep = 0; in ipw2100_wpa_set_auth_algs()
5946 ieee->open_wep = 1; in ipw2100_wpa_set_auth_algs()
5949 ieee->open_wep = 1; in ipw2100_wpa_set_auth_algs()
5951 return -EINVAL; in ipw2100_wpa_set_auth_algs()
5953 if (ieee->set_security) in ipw2100_wpa_set_auth_algs()
5954 ieee->set_security(ieee->dev, &sec); in ipw2100_wpa_set_auth_algs()
5956 ret = -EOPNOTSUPP; in ipw2100_wpa_set_auth_algs()
5984 strlcpy(info->driver, DRV_NAME, sizeof(info->driver)); in ipw_ethtool_get_drvinfo()
5985 strlcpy(info->version, DRV_VERSION, sizeof(info->version)); in ipw_ethtool_get_drvinfo()
5990 snprintf(info->fw_version, sizeof(info->fw_version), "%s:%d:%s", in ipw_ethtool_get_drvinfo()
5991 fw_ver, priv->eeprom_version, ucode_ver); in ipw_ethtool_get_drvinfo()
5993 strlcpy(info->bus_info, pci_name(priv->pci_dev), in ipw_ethtool_get_drvinfo()
5994 sizeof(info->bus_info)); in ipw_ethtool_get_drvinfo()
6000 return (priv->status & STATUS_ASSOCIATED) ? 1 : 0; in ipw2100_ethtool_get_link()
6017 spin_lock_irqsave(&priv->low_lock, flags); in ipw2100_hang_check()
6019 if (priv->fatal_error != 0) { in ipw2100_hang_check()
6022 priv->net_dev->name); in ipw2100_hang_check()
6026 (rtc == priv->last_rtc)) { in ipw2100_hang_check()
6029 priv->net_dev->name); in ipw2100_hang_check()
6036 priv->stop_hang_check = 1; in ipw2100_hang_check()
6037 priv->hangs++; in ipw2100_hang_check()
6043 priv->last_rtc = rtc; in ipw2100_hang_check()
6045 if (!priv->stop_hang_check) in ipw2100_hang_check()
6046 schedule_delayed_work(&priv->hang_check, HZ / 2); in ipw2100_hang_check()
6048 spin_unlock_irqrestore(&priv->low_lock, flags); in ipw2100_hang_check()
6057 spin_lock_irqsave(&priv->low_lock, flags); in ipw2100_rf_kill()
6061 if (!priv->stop_rf_kill) in ipw2100_rf_kill()
6062 schedule_delayed_work(&priv->rf_kill, in ipw2100_rf_kill()
6069 if (!(priv->status & STATUS_RF_KILL_MASK)) { in ipw2100_rf_kill()
6078 spin_unlock_irqrestore(&priv->low_lock, flags); in ipw2100_rf_kill()
6108 priv->ieee = netdev_priv(dev); in ipw2100_alloc_device()
6109 priv->pci_dev = pci_dev; in ipw2100_alloc_device()
6110 priv->net_dev = dev; in ipw2100_alloc_device()
6112 priv->ieee->hard_start_xmit = ipw2100_tx; in ipw2100_alloc_device()
6113 priv->ieee->set_security = shim__set_security; in ipw2100_alloc_device()
6115 priv->ieee->perfect_rssi = -20; in ipw2100_alloc_device()
6116 priv->ieee->worst_rssi = -85; in ipw2100_alloc_device()
6118 dev->netdev_ops = &ipw2100_netdev_ops; in ipw2100_alloc_device()
6119 dev->ethtool_ops = &ipw2100_ethtool_ops; in ipw2100_alloc_device()
6120 dev->wireless_handlers = &ipw2100_wx_handler_def; in ipw2100_alloc_device()
6121 priv->wireless_data.libipw = priv->ieee; in ipw2100_alloc_device()
6122 dev->wireless_data = &priv->wireless_data; in ipw2100_alloc_device()
6123 dev->watchdog_timeo = 3 * HZ; in ipw2100_alloc_device()
6124 dev->irq = 0; in ipw2100_alloc_device()
6126 dev->base_addr = (unsigned long)base_addr; in ipw2100_alloc_device()
6127 dev->mem_start = mem_start; in ipw2100_alloc_device()
6128 dev->mem_end = dev->mem_start + mem_len - 1; in ipw2100_alloc_device()
6140 priv->power_mode = IPW_POWER_AUTO; in ipw2100_alloc_device()
6143 priv->config |= CFG_CRC_CHECK; in ipw2100_alloc_device()
6145 priv->ieee->wpa_enabled = 0; in ipw2100_alloc_device()
6146 priv->ieee->drop_unencrypted = 0; in ipw2100_alloc_device()
6147 priv->ieee->privacy_invoked = 0; in ipw2100_alloc_device()
6148 priv->ieee->ieee802_1x = 1; in ipw2100_alloc_device()
6153 priv->ieee->iw_mode = IW_MODE_ADHOC; in ipw2100_alloc_device()
6157 priv->ieee->iw_mode = IW_MODE_MONITOR; in ipw2100_alloc_device()
6162 priv->ieee->iw_mode = IW_MODE_INFRA; in ipw2100_alloc_device()
6167 priv->status |= STATUS_RF_KILL_SW; in ipw2100_alloc_device()
6171 priv->config |= CFG_STATIC_CHANNEL; in ipw2100_alloc_device()
6172 priv->channel = channel; in ipw2100_alloc_device()
6176 priv->config |= CFG_ASSOCIATE; in ipw2100_alloc_device()
6178 priv->beacon_interval = DEFAULT_BEACON_INTERVAL; in ipw2100_alloc_device()
6179 priv->short_retry_limit = DEFAULT_SHORT_RETRY_LIMIT; in ipw2100_alloc_device()
6180 priv->long_retry_limit = DEFAULT_LONG_RETRY_LIMIT; in ipw2100_alloc_device()
6181 priv->rts_threshold = DEFAULT_RTS_THRESHOLD | RTS_DISABLED; in ipw2100_alloc_device()
6182 priv->frag_threshold = DEFAULT_FTS | FRAG_DISABLED; in ipw2100_alloc_device()
6183 priv->tx_power = IPW_TX_POWER_DEFAULT; in ipw2100_alloc_device()
6184 priv->tx_rates = DEFAULT_TX_RATES; in ipw2100_alloc_device()
6186 strcpy(priv->nick, "ipw2100"); in ipw2100_alloc_device()
6188 spin_lock_init(&priv->low_lock); in ipw2100_alloc_device()
6189 mutex_init(&priv->action_mutex); in ipw2100_alloc_device()
6190 mutex_init(&priv->adapter_mutex); in ipw2100_alloc_device()
6192 init_waitqueue_head(&priv->wait_command_queue); in ipw2100_alloc_device()
6196 INIT_LIST_HEAD(&priv->msg_free_list); in ipw2100_alloc_device()
6197 INIT_LIST_HEAD(&priv->msg_pend_list); in ipw2100_alloc_device()
6198 INIT_STAT(&priv->msg_free_stat); in ipw2100_alloc_device()
6199 INIT_STAT(&priv->msg_pend_stat); in ipw2100_alloc_device()
6201 INIT_LIST_HEAD(&priv->tx_free_list); in ipw2100_alloc_device()
6202 INIT_LIST_HEAD(&priv->tx_pend_list); in ipw2100_alloc_device()
6203 INIT_STAT(&priv->tx_free_stat); in ipw2100_alloc_device()
6204 INIT_STAT(&priv->tx_pend_stat); in ipw2100_alloc_device()
6206 INIT_LIST_HEAD(&priv->fw_pend_list); in ipw2100_alloc_device()
6207 INIT_STAT(&priv->fw_pend_stat); in ipw2100_alloc_device()
6209 INIT_DELAYED_WORK(&priv->reset_work, ipw2100_reset_adapter); in ipw2100_alloc_device()
6210 INIT_DELAYED_WORK(&priv->security_work, ipw2100_security_work); in ipw2100_alloc_device()
6211 INIT_DELAYED_WORK(&priv->wx_event_work, ipw2100_wx_event_work); in ipw2100_alloc_device()
6212 INIT_DELAYED_WORK(&priv->hang_check, ipw2100_hang_check); in ipw2100_alloc_device()
6213 INIT_DELAYED_WORK(&priv->rf_kill, ipw2100_rf_kill); in ipw2100_alloc_device()
6214 INIT_WORK(&priv->scan_event_now, ipw2100_scan_event_now); in ipw2100_alloc_device()
6215 INIT_DELAYED_WORK(&priv->scan_event_later, ipw2100_scan_event_later); in ipw2100_alloc_device()
6217 tasklet_init(&priv->irq_tasklet, (void (*)(unsigned long)) in ipw2100_alloc_device()
6221 priv->stop_rf_kill = 1; in ipw2100_alloc_device()
6222 priv->stop_hang_check = 1; in ipw2100_alloc_device()
6245 IPW_DEBUG_INFO("weird - resource type is not memory\n"); in ipw2100_pci_init_one()
6246 err = -ENODEV; in ipw2100_pci_init_one()
6254 err = -EIO; in ipw2100_pci_init_one()
6263 err = -ENOMEM; in ipw2100_pci_init_one()
6307 err = -ENODEV; in ipw2100_pci_init_one()
6311 SET_NETDEV_DEV(dev, &pci_dev->dev); in ipw2100_pci_init_one()
6314 priv->status |= STATUS_INT_ENABLED; in ipw2100_pci_init_one()
6321 err = -ENOMEM; in ipw2100_pci_init_one()
6326 err = request_irq(pci_dev->irq, in ipw2100_pci_init_one()
6327 ipw2100_interrupt, IRQF_SHARED, dev->name, priv); in ipw2100_pci_init_one()
6330 "Error calling request_irq: %d.\n", pci_dev->irq); in ipw2100_pci_init_one()
6333 dev->irq = pci_dev->irq; in ipw2100_pci_init_one()
6346 * device name wasn't registered. So, we instead use the net_dev->init in ipw2100_pci_init_one()
6348 * net_dev->init is called after name allocation but before the in ipw2100_pci_init_one()
6362 mutex_lock(&priv->action_mutex); in ipw2100_pci_init_one()
6364 IPW_DEBUG_INFO("%s: Bound to %s\n", dev->name, pci_name(pci_dev)); in ipw2100_pci_init_one()
6366 /* perform this after register_netdev so that dev->name is set */ in ipw2100_pci_init_one()
6367 err = sysfs_create_group(&pci_dev->dev.kobj, &ipw2100_attribute_group); in ipw2100_pci_init_one()
6373 if (!(priv->status & STATUS_RF_KILL_MASK)) { in ipw2100_pci_init_one()
6374 /* Enable the adapter - sends HOST_COMPLETE */ in ipw2100_pci_init_one()
6378 priv->net_dev->name); in ipw2100_pci_init_one()
6380 err = -EIO; in ipw2100_pci_init_one()
6391 priv->status |= STATUS_INITIALIZED; in ipw2100_pci_init_one()
6393 mutex_unlock(&priv->action_mutex); in ipw2100_pci_init_one()
6398 mutex_unlock(&priv->action_mutex); in ipw2100_pci_init_one()
6399 wiphy_unregister(priv->ieee->wdev.wiphy); in ipw2100_pci_init_one()
6400 kfree(priv->ieee->bg_band.channels); in ipw2100_pci_init_one()
6410 if (dev->irq) in ipw2100_pci_init_one()
6411 free_irq(dev->irq, priv); in ipw2100_pci_init_one()
6417 sysfs_remove_group(&pci_dev->dev.kobj, in ipw2100_pci_init_one()
6439 mutex_lock(&priv->action_mutex); in ipw2100_pci_remove_one()
6441 priv->status &= ~STATUS_INITIALIZED; in ipw2100_pci_remove_one()
6443 dev = priv->net_dev; in ipw2100_pci_remove_one()
6444 sysfs_remove_group(&pci_dev->dev.kobj, in ipw2100_pci_remove_one()
6456 mutex_unlock(&priv->action_mutex); in ipw2100_pci_remove_one()
6458 /* Unregister the device first - this results in close() in ipw2100_pci_remove_one()
6470 if (dev->irq) in ipw2100_pci_remove_one()
6471 free_irq(dev->irq, priv); in ipw2100_pci_remove_one()
6473 if (dev->base_addr) in ipw2100_pci_remove_one()
6474 iounmap((void __iomem *)dev->base_addr); in ipw2100_pci_remove_one()
6477 wiphy_unregister(priv->ieee->wdev.wiphy); in ipw2100_pci_remove_one()
6478 kfree(priv->ieee->bg_band.channels); in ipw2100_pci_remove_one()
6492 struct net_device *dev = priv->net_dev; in ipw2100_suspend()
6494 IPW_DEBUG_INFO("%s: Going into suspend...\n", dev->name); in ipw2100_suspend()
6496 mutex_lock(&priv->action_mutex); in ipw2100_suspend()
6497 if (priv->status & STATUS_INITIALIZED) { in ipw2100_suspend()
6509 priv->suspend_at = get_seconds(); in ipw2100_suspend()
6511 mutex_unlock(&priv->action_mutex); in ipw2100_suspend()
6519 struct net_device *dev = priv->net_dev; in ipw2100_resume()
6526 mutex_lock(&priv->action_mutex); in ipw2100_resume()
6528 IPW_DEBUG_INFO("%s: Coming out of suspend...\n", dev->name); in ipw2100_resume()
6534 dev->name); in ipw2100_resume()
6535 mutex_unlock(&priv->action_mutex); in ipw2100_resume()
6542 * re-disable the RETRY_TIMEOUT register (0x41) to keep PCI Tx retries in ipw2100_resume()
6554 priv->suspend_time = get_seconds() - priv->suspend_at; in ipw2100_resume()
6557 if (!(priv->status & STATUS_RF_KILL_SW)) in ipw2100_resume()
6560 mutex_unlock(&priv->action_mutex); in ipw2100_resume()
6701 if (!(priv->status & STATUS_ASSOCIATED)) in ipw2100_wx_get_name()
6702 strcpy(wrqu->name, "unassociated"); in ipw2100_wx_get_name()
6704 snprintf(wrqu->name, IFNAMSIZ, "IEEE 802.11b"); in ipw2100_wx_get_name()
6706 IPW_DEBUG_WX("Name: %s\n", wrqu->name); in ipw2100_wx_get_name()
6715 struct iw_freq *fwrq = &wrqu->freq; in ipw2100_wx_set_freq()
6718 if (priv->ieee->iw_mode == IW_MODE_INFRA) in ipw2100_wx_set_freq()
6719 return -EOPNOTSUPP; in ipw2100_wx_set_freq()
6721 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_freq()
6722 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_freq()
6723 err = -EIO; in ipw2100_wx_set_freq()
6728 if (fwrq->e == 1) { in ipw2100_wx_set_freq()
6729 if ((fwrq->m >= (int)2.412e8 && fwrq->m <= (int)2.487e8)) { in ipw2100_wx_set_freq()
6730 int f = fwrq->m / 100000; in ipw2100_wx_set_freq()
6738 fwrq->e = 0; in ipw2100_wx_set_freq()
6739 fwrq->m = c + 1; in ipw2100_wx_set_freq()
6743 if (fwrq->e > 0 || fwrq->m > 1000) { in ipw2100_wx_set_freq()
6744 err = -EOPNOTSUPP; in ipw2100_wx_set_freq()
6747 IPW_DEBUG_WX("SET Freq/Channel -> %d\n", fwrq->m); in ipw2100_wx_set_freq()
6748 err = ipw2100_set_channel(priv, fwrq->m, 0); in ipw2100_wx_set_freq()
6752 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_freq()
6766 wrqu->freq.e = 0; in ipw2100_wx_get_freq()
6770 if (priv->config & CFG_STATIC_CHANNEL || in ipw2100_wx_get_freq()
6771 priv->status & STATUS_ASSOCIATED) in ipw2100_wx_get_freq()
6772 wrqu->freq.m = priv->channel; in ipw2100_wx_get_freq()
6774 wrqu->freq.m = 0; in ipw2100_wx_get_freq()
6776 IPW_DEBUG_WX("GET Freq/Channel -> %d\n", priv->channel); in ipw2100_wx_get_freq()
6788 IPW_DEBUG_WX("SET Mode -> %d\n", wrqu->mode); in ipw2100_wx_set_mode()
6790 if (wrqu->mode == priv->ieee->iw_mode) in ipw2100_wx_set_mode()
6793 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_mode()
6794 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_mode()
6795 err = -EIO; in ipw2100_wx_set_mode()
6799 switch (wrqu->mode) { in ipw2100_wx_set_mode()
6816 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_mode()
6830 wrqu->mode = priv->ieee->iw_mode; in ipw2100_wx_get_mode()
6831 IPW_DEBUG_WX("GET Mode -> %d\n", wrqu->mode); in ipw2100_wx_get_mode()
6868 wrqu->data.length = sizeof(*range); in ipw2100_wx_get_range()
6880 range->throughput = 5 * 1000 * 1000; in ipw2100_wx_get_range()
6882 // range->sensitivity; /* signal level threshold range */ in ipw2100_wx_get_range()
6884 range->max_qual.qual = 100; in ipw2100_wx_get_range()
6886 range->max_qual.level = 0; in ipw2100_wx_get_range()
6887 range->max_qual.noise = 0; in ipw2100_wx_get_range()
6888 range->max_qual.updated = 7; /* Updated all three */ in ipw2100_wx_get_range()
6890 range->avg_qual.qual = 70; /* > 8% missed beacons is 'bad' */ in ipw2100_wx_get_range()
6892 range->avg_qual.level = 20 + IPW2100_RSSI_TO_DBM; in ipw2100_wx_get_range()
6893 range->avg_qual.noise = 0; in ipw2100_wx_get_range()
6894 range->avg_qual.updated = 7; /* Updated all three */ in ipw2100_wx_get_range()
6896 range->num_bitrates = RATE_COUNT; in ipw2100_wx_get_range()
6899 range->bitrate[i] = ipw2100_rates_11b[i]; in ipw2100_wx_get_range()
6902 range->min_rts = MIN_RTS_THRESHOLD; in ipw2100_wx_get_range()
6903 range->max_rts = MAX_RTS_THRESHOLD; in ipw2100_wx_get_range()
6904 range->min_frag = MIN_FRAG_THRESHOLD; in ipw2100_wx_get_range()
6905 range->max_frag = MAX_FRAG_THRESHOLD; in ipw2100_wx_get_range()
6907 range->min_pmp = period_duration[0]; /* Minimal PM period */ in ipw2100_wx_get_range()
6908 range->max_pmp = period_duration[POWER_MODES - 1]; /* Maximal PM period */ in ipw2100_wx_get_range()
6909 range->min_pmt = timeout_duration[POWER_MODES - 1]; /* Minimal PM timeout */ in ipw2100_wx_get_range()
6910 range->max_pmt = timeout_duration[0]; /* Maximal PM timeout */ in ipw2100_wx_get_range()
6913 range->pmp_flags = IW_POWER_PERIOD; in ipw2100_wx_get_range()
6915 range->pmt_flags = IW_POWER_TIMEOUT; in ipw2100_wx_get_range()
6917 range->pm_capa = IW_POWER_TIMEOUT | IW_POWER_PERIOD; in ipw2100_wx_get_range()
6919 range->encoding_size[0] = 5; in ipw2100_wx_get_range()
6920 range->encoding_size[1] = 13; /* Different token sizes */ in ipw2100_wx_get_range()
6921 range->num_encoding_sizes = 2; /* Number of entry in the list */ in ipw2100_wx_get_range()
6922 range->max_encoding_tokens = WEP_KEYS; /* Max number of tokens */ in ipw2100_wx_get_range()
6923 // range->encoding_login_index; /* token index for login token */ in ipw2100_wx_get_range()
6925 if (priv->ieee->iw_mode == IW_MODE_ADHOC) { in ipw2100_wx_get_range()
6926 range->txpower_capa = IW_TXPOW_DBM; in ipw2100_wx_get_range()
6927 range->num_txpower = IW_MAX_TXPOWER; in ipw2100_wx_get_range()
6930 i++, level -= in ipw2100_wx_get_range()
6931 ((IPW_TX_POWER_MAX_DBM - in ipw2100_wx_get_range()
6932 IPW_TX_POWER_MIN_DBM) * 16) / (IW_MAX_TXPOWER - 1)) in ipw2100_wx_get_range()
6933 range->txpower[i] = level / 16; in ipw2100_wx_get_range()
6935 range->txpower_capa = 0; in ipw2100_wx_get_range()
6936 range->num_txpower = 0; in ipw2100_wx_get_range()
6940 range->we_version_compiled = WIRELESS_EXT; in ipw2100_wx_get_range()
6941 range->we_version_source = 18; in ipw2100_wx_get_range()
6943 // range->retry_capa; /* What retry options are supported */ in ipw2100_wx_get_range()
6944 // range->retry_flags; /* How to decode max/min retry limit */ in ipw2100_wx_get_range()
6945 // range->r_time_flags; /* How to decode max/min retry life */ in ipw2100_wx_get_range()
6946 // range->min_retry; /* Minimal number of retries */ in ipw2100_wx_get_range()
6947 // range->max_retry; /* Maximal number of retries */ in ipw2100_wx_get_range()
6948 // range->min_r_time; /* Minimal retry lifetime */ in ipw2100_wx_get_range()
6949 // range->max_r_time; /* Maximal retry lifetime */ in ipw2100_wx_get_range()
6951 range->num_channels = FREQ_COUNT; in ipw2100_wx_get_range()
6956 // if (local->channel_mask & (1 << i)) { in ipw2100_wx_get_range()
6957 range->freq[val].i = i + 1; in ipw2100_wx_get_range()
6958 range->freq[val].m = ipw2100_frequencies[i] * 100000; in ipw2100_wx_get_range()
6959 range->freq[val].e = 1; in ipw2100_wx_get_range()
6965 range->num_frequency = val; in ipw2100_wx_get_range()
6968 range->event_capa[0] = (IW_EVENT_CAPA_K_0 | in ipw2100_wx_get_range()
6970 range->event_capa[1] = IW_EVENT_CAPA_K_1; in ipw2100_wx_get_range()
6972 range->enc_capa = IW_ENC_CAPA_WPA | IW_ENC_CAPA_WPA2 | in ipw2100_wx_get_range()
6995 if (wrqu->ap_addr.sa_family != ARPHRD_ETHER) in ipw2100_wx_set_wap()
6996 return -EINVAL; in ipw2100_wx_set_wap()
6998 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_wap()
6999 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_wap()
7000 err = -EIO; in ipw2100_wx_set_wap()
7004 if (!memcmp(any, wrqu->ap_addr.sa_data, ETH_ALEN) || in ipw2100_wx_set_wap()
7005 !memcmp(off, wrqu->ap_addr.sa_data, ETH_ALEN)) { in ipw2100_wx_set_wap()
7007 IPW_DEBUG_WX("exit - disable mandatory BSSID\n"); in ipw2100_wx_set_wap()
7008 priv->config &= ~CFG_STATIC_BSSID; in ipw2100_wx_set_wap()
7013 priv->config |= CFG_STATIC_BSSID; in ipw2100_wx_set_wap()
7014 memcpy(priv->mandatory_bssid_mac, wrqu->ap_addr.sa_data, ETH_ALEN); in ipw2100_wx_set_wap()
7016 err = ipw2100_set_mandatory_bssid(priv, wrqu->ap_addr.sa_data, 0); in ipw2100_wx_set_wap()
7018 IPW_DEBUG_WX("SET BSSID -> %pM\n", wrqu->ap_addr.sa_data); in ipw2100_wx_set_wap()
7021 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_wap()
7037 if (priv->config & CFG_STATIC_BSSID || priv->status & STATUS_ASSOCIATED) { in ipw2100_wx_get_wap()
7038 wrqu->ap_addr.sa_family = ARPHRD_ETHER; in ipw2100_wx_get_wap()
7039 memcpy(wrqu->ap_addr.sa_data, priv->bssid, ETH_ALEN); in ipw2100_wx_get_wap()
7041 memset(wrqu->ap_addr.sa_data, 0, ETH_ALEN); in ipw2100_wx_get_wap()
7043 IPW_DEBUG_WX("Getting WAP BSSID: %pM\n", wrqu->ap_addr.sa_data); in ipw2100_wx_get_wap()
7057 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_essid()
7058 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_essid()
7059 err = -EIO; in ipw2100_wx_set_essid()
7063 if (wrqu->essid.flags && wrqu->essid.length) { in ipw2100_wx_set_essid()
7064 length = wrqu->essid.length; in ipw2100_wx_set_essid()
7070 priv->config &= ~CFG_STATIC_ESSID; in ipw2100_wx_set_essid()
7077 priv->config |= CFG_STATIC_ESSID; in ipw2100_wx_set_essid()
7079 if (priv->essid_len == length && !memcmp(priv->essid, extra, length)) { in ipw2100_wx_set_essid()
7088 priv->essid_len = length; in ipw2100_wx_set_essid()
7089 memcpy(priv->essid, essid, priv->essid_len); in ipw2100_wx_set_essid()
7094 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_essid()
7111 if (priv->config & CFG_STATIC_ESSID || priv->status & STATUS_ASSOCIATED) { in ipw2100_wx_get_essid()
7113 print_ssid(ssid, priv->essid, priv->essid_len)); in ipw2100_wx_get_essid()
7114 memcpy(extra, priv->essid, priv->essid_len); in ipw2100_wx_get_essid()
7115 wrqu->essid.length = priv->essid_len; in ipw2100_wx_get_essid()
7116 wrqu->essid.flags = 1; /* active */ in ipw2100_wx_get_essid()
7119 wrqu->essid.length = 0; in ipw2100_wx_get_essid()
7120 wrqu->essid.flags = 0; /* active */ in ipw2100_wx_get_essid()
7136 if (wrqu->data.length > IW_ESSID_MAX_SIZE) in ipw2100_wx_set_nick()
7137 return -E2BIG; in ipw2100_wx_set_nick()
7139 wrqu->data.length = min((size_t) wrqu->data.length, sizeof(priv->nick)); in ipw2100_wx_set_nick()
7140 memset(priv->nick, 0, sizeof(priv->nick)); in ipw2100_wx_set_nick()
7141 memcpy(priv->nick, extra, wrqu->data.length); in ipw2100_wx_set_nick()
7143 IPW_DEBUG_WX("SET Nickname -> %s\n", priv->nick); in ipw2100_wx_set_nick()
7158 wrqu->data.length = strlen(priv->nick); in ipw2100_wx_get_nick()
7159 memcpy(extra, priv->nick, wrqu->data.length); in ipw2100_wx_get_nick()
7160 wrqu->data.flags = 1; /* active */ in ipw2100_wx_get_nick()
7162 IPW_DEBUG_WX("GET Nickname -> %s\n", extra); in ipw2100_wx_get_nick()
7172 u32 target_rate = wrqu->bitrate.value; in ipw2100_wx_set_rate()
7176 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_rate()
7177 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_rate()
7178 err = -EIO; in ipw2100_wx_set_rate()
7185 (!wrqu->bitrate.fixed && target_rate > 1000000)) in ipw2100_wx_set_rate()
7188 (!wrqu->bitrate.fixed && target_rate > 2000000)) in ipw2100_wx_set_rate()
7191 (!wrqu->bitrate.fixed && target_rate > 5500000)) in ipw2100_wx_set_rate()
7194 (!wrqu->bitrate.fixed && target_rate > 11000000)) in ipw2100_wx_set_rate()
7201 IPW_DEBUG_WX("SET Rate -> %04X\n", rate); in ipw2100_wx_set_rate()
7203 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_rate()
7216 if (!(priv->status & STATUS_ENABLED) || in ipw2100_wx_get_rate()
7217 priv->status & STATUS_RF_KILL_MASK || in ipw2100_wx_get_rate()
7218 !(priv->status & STATUS_ASSOCIATED)) { in ipw2100_wx_get_rate()
7219 wrqu->bitrate.value = 0; in ipw2100_wx_get_rate()
7223 mutex_lock(&priv->action_mutex); in ipw2100_wx_get_rate()
7224 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_get_rate()
7225 err = -EIO; in ipw2100_wx_get_rate()
7237 wrqu->bitrate.value = 1000000; in ipw2100_wx_get_rate()
7240 wrqu->bitrate.value = 2000000; in ipw2100_wx_get_rate()
7243 wrqu->bitrate.value = 5500000; in ipw2100_wx_get_rate()
7246 wrqu->bitrate.value = 11000000; in ipw2100_wx_get_rate()
7249 wrqu->bitrate.value = 0; in ipw2100_wx_get_rate()
7252 IPW_DEBUG_WX("GET Rate -> %d\n", wrqu->bitrate.value); in ipw2100_wx_get_rate()
7255 mutex_unlock(&priv->action_mutex); in ipw2100_wx_get_rate()
7267 if (wrqu->rts.fixed == 0) in ipw2100_wx_set_rts()
7268 return -EINVAL; in ipw2100_wx_set_rts()
7270 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_rts()
7271 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_rts()
7272 err = -EIO; in ipw2100_wx_set_rts()
7276 if (wrqu->rts.disabled) in ipw2100_wx_set_rts()
7277 value = priv->rts_threshold | RTS_DISABLED; in ipw2100_wx_set_rts()
7279 if (wrqu->rts.value < 1 || wrqu->rts.value > 2304) { in ipw2100_wx_set_rts()
7280 err = -EINVAL; in ipw2100_wx_set_rts()
7283 value = wrqu->rts.value; in ipw2100_wx_set_rts()
7288 IPW_DEBUG_WX("SET RTS Threshold -> 0x%08X\n", value); in ipw2100_wx_set_rts()
7290 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_rts()
7304 wrqu->rts.value = priv->rts_threshold & ~RTS_DISABLED; in ipw2100_wx_get_rts()
7305 wrqu->rts.fixed = 1; /* no auto select */ in ipw2100_wx_get_rts()
7308 wrqu->rts.disabled = (priv->rts_threshold & RTS_DISABLED) ? 1 : 0; in ipw2100_wx_get_rts()
7310 IPW_DEBUG_WX("GET RTS Threshold -> 0x%08X\n", wrqu->rts.value); in ipw2100_wx_get_rts()
7322 if (ipw_radio_kill_sw(priv, wrqu->txpower.disabled)) in ipw2100_wx_set_txpow()
7323 return -EINPROGRESS; in ipw2100_wx_set_txpow()
7325 if (priv->ieee->iw_mode != IW_MODE_ADHOC) in ipw2100_wx_set_txpow()
7328 if ((wrqu->txpower.flags & IW_TXPOW_TYPE) != IW_TXPOW_DBM) in ipw2100_wx_set_txpow()
7329 return -EINVAL; in ipw2100_wx_set_txpow()
7331 if (wrqu->txpower.fixed == 0) in ipw2100_wx_set_txpow()
7334 if (wrqu->txpower.value < IPW_TX_POWER_MIN_DBM || in ipw2100_wx_set_txpow()
7335 wrqu->txpower.value > IPW_TX_POWER_MAX_DBM) in ipw2100_wx_set_txpow()
7336 return -EINVAL; in ipw2100_wx_set_txpow()
7338 value = wrqu->txpower.value; in ipw2100_wx_set_txpow()
7341 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_txpow()
7342 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_txpow()
7343 err = -EIO; in ipw2100_wx_set_txpow()
7349 IPW_DEBUG_WX("SET TX Power -> %d\n", value); in ipw2100_wx_set_txpow()
7352 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_txpow()
7366 wrqu->txpower.disabled = (priv->status & STATUS_RF_KILL_MASK) ? 1 : 0; in ipw2100_wx_get_txpow()
7368 if (priv->tx_power == IPW_TX_POWER_DEFAULT) { in ipw2100_wx_get_txpow()
7369 wrqu->txpower.fixed = 0; in ipw2100_wx_get_txpow()
7370 wrqu->txpower.value = IPW_TX_POWER_MAX_DBM; in ipw2100_wx_get_txpow()
7372 wrqu->txpower.fixed = 1; in ipw2100_wx_get_txpow()
7373 wrqu->txpower.value = priv->tx_power; in ipw2100_wx_get_txpow()
7376 wrqu->txpower.flags = IW_TXPOW_DBM; in ipw2100_wx_get_txpow()
7378 IPW_DEBUG_WX("GET TX Power -> %d\n", wrqu->txpower.value); in ipw2100_wx_get_txpow()
7393 if (!wrqu->frag.fixed) in ipw2100_wx_set_frag()
7394 return -EINVAL; in ipw2100_wx_set_frag()
7396 if (wrqu->frag.disabled) { in ipw2100_wx_set_frag()
7397 priv->frag_threshold |= FRAG_DISABLED; in ipw2100_wx_set_frag()
7398 priv->ieee->fts = DEFAULT_FTS; in ipw2100_wx_set_frag()
7400 if (wrqu->frag.value < MIN_FRAG_THRESHOLD || in ipw2100_wx_set_frag()
7401 wrqu->frag.value > MAX_FRAG_THRESHOLD) in ipw2100_wx_set_frag()
7402 return -EINVAL; in ipw2100_wx_set_frag()
7404 priv->ieee->fts = wrqu->frag.value & ~0x1; in ipw2100_wx_set_frag()
7405 priv->frag_threshold = priv->ieee->fts; in ipw2100_wx_set_frag()
7408 IPW_DEBUG_WX("SET Frag Threshold -> %d\n", priv->ieee->fts); in ipw2100_wx_set_frag()
7422 wrqu->frag.value = priv->frag_threshold & ~FRAG_DISABLED; in ipw2100_wx_get_frag()
7423 wrqu->frag.fixed = 0; /* no auto select */ in ipw2100_wx_get_frag()
7424 wrqu->frag.disabled = (priv->frag_threshold & FRAG_DISABLED) ? 1 : 0; in ipw2100_wx_get_frag()
7426 IPW_DEBUG_WX("GET Frag Threshold -> %d\n", wrqu->frag.value); in ipw2100_wx_get_frag()
7438 if (wrqu->retry.flags & IW_RETRY_LIFETIME || wrqu->retry.disabled) in ipw2100_wx_set_retry()
7439 return -EINVAL; in ipw2100_wx_set_retry()
7441 if (!(wrqu->retry.flags & IW_RETRY_LIMIT)) in ipw2100_wx_set_retry()
7444 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_retry()
7445 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_retry()
7446 err = -EIO; in ipw2100_wx_set_retry()
7450 if (wrqu->retry.flags & IW_RETRY_SHORT) { in ipw2100_wx_set_retry()
7451 err = ipw2100_set_short_retry(priv, wrqu->retry.value); in ipw2100_wx_set_retry()
7452 IPW_DEBUG_WX("SET Short Retry Limit -> %d\n", in ipw2100_wx_set_retry()
7453 wrqu->retry.value); in ipw2100_wx_set_retry()
7457 if (wrqu->retry.flags & IW_RETRY_LONG) { in ipw2100_wx_set_retry()
7458 err = ipw2100_set_long_retry(priv, wrqu->retry.value); in ipw2100_wx_set_retry()
7459 IPW_DEBUG_WX("SET Long Retry Limit -> %d\n", in ipw2100_wx_set_retry()
7460 wrqu->retry.value); in ipw2100_wx_set_retry()
7464 err = ipw2100_set_short_retry(priv, wrqu->retry.value); in ipw2100_wx_set_retry()
7466 err = ipw2100_set_long_retry(priv, wrqu->retry.value); in ipw2100_wx_set_retry()
7468 IPW_DEBUG_WX("SET Both Retry Limits -> %d\n", wrqu->retry.value); in ipw2100_wx_set_retry()
7471 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_retry()
7485 wrqu->retry.disabled = 0; /* can't be disabled */ in ipw2100_wx_get_retry()
7487 if ((wrqu->retry.flags & IW_RETRY_TYPE) == IW_RETRY_LIFETIME) in ipw2100_wx_get_retry()
7488 return -EINVAL; in ipw2100_wx_get_retry()
7490 if (wrqu->retry.flags & IW_RETRY_LONG) { in ipw2100_wx_get_retry()
7491 wrqu->retry.flags = IW_RETRY_LIMIT | IW_RETRY_LONG; in ipw2100_wx_get_retry()
7492 wrqu->retry.value = priv->long_retry_limit; in ipw2100_wx_get_retry()
7494 wrqu->retry.flags = in ipw2100_wx_get_retry()
7495 (priv->short_retry_limit != in ipw2100_wx_get_retry()
7496 priv->long_retry_limit) ? in ipw2100_wx_get_retry()
7499 wrqu->retry.value = priv->short_retry_limit; in ipw2100_wx_get_retry()
7502 IPW_DEBUG_WX("GET Retry -> %d\n", wrqu->retry.value); in ipw2100_wx_get_retry()
7514 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_scan()
7515 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_scan()
7516 err = -EIO; in ipw2100_wx_set_scan()
7522 priv->user_requested_scan = 1; in ipw2100_wx_set_scan()
7531 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_scan()
7544 return libipw_wx_get_scan(priv->ieee, info, wrqu, extra); in ipw2100_wx_get_scan()
7548 * Implementation based on code in hostap-driver v0.1.3 hostap_ioctl.c
7559 return libipw_wx_set_encode(priv->ieee, info, wrqu, key); in ipw2100_wx_set_encode()
7571 return libipw_wx_get_encode(priv->ieee, info, wrqu, key); in ipw2100_wx_get_encode()
7581 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_power()
7582 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_power()
7583 err = -EIO; in ipw2100_wx_set_power()
7587 if (wrqu->power.disabled) { in ipw2100_wx_set_power()
7588 priv->power_mode = IPW_POWER_LEVEL(priv->power_mode); in ipw2100_wx_set_power()
7590 IPW_DEBUG_WX("SET Power Management Mode -> off\n"); in ipw2100_wx_set_power()
7594 switch (wrqu->power.flags & IW_POWER_MODE) { in ipw2100_wx_set_power()
7601 wrqu->power.flags); in ipw2100_wx_set_power()
7602 err = -EOPNOTSUPP; in ipw2100_wx_set_power()
7608 priv->power_mode = IPW_POWER_ENABLED | priv->power_mode; in ipw2100_wx_set_power()
7609 err = ipw2100_set_power_mode(priv, IPW_POWER_LEVEL(priv->power_mode)); in ipw2100_wx_set_power()
7611 IPW_DEBUG_WX("SET Power Management Mode -> 0x%02X\n", priv->power_mode); in ipw2100_wx_set_power()
7614 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_power()
7629 if (!(priv->power_mode & IPW_POWER_ENABLED)) in ipw2100_wx_get_power()
7630 wrqu->power.disabled = 1; in ipw2100_wx_get_power()
7632 wrqu->power.disabled = 0; in ipw2100_wx_get_power()
7633 wrqu->power.flags = 0; in ipw2100_wx_get_power()
7636 IPW_DEBUG_WX("GET Power Management Mode -> %02X\n", priv->power_mode); in ipw2100_wx_get_power()
7642 * WE-18 WPA support
7652 struct libipw_device *ieee = priv->ieee; in ipw2100_wx_set_genie()
7655 if (!ieee->wpa_enabled) in ipw2100_wx_set_genie()
7656 return -EOPNOTSUPP; in ipw2100_wx_set_genie()
7658 if (wrqu->data.length > MAX_WPA_IE_LEN || in ipw2100_wx_set_genie()
7659 (wrqu->data.length && extra == NULL)) in ipw2100_wx_set_genie()
7660 return -EINVAL; in ipw2100_wx_set_genie()
7662 if (wrqu->data.length) { in ipw2100_wx_set_genie()
7663 buf = kmemdup(extra, wrqu->data.length, GFP_KERNEL); in ipw2100_wx_set_genie()
7665 return -ENOMEM; in ipw2100_wx_set_genie()
7667 kfree(ieee->wpa_ie); in ipw2100_wx_set_genie()
7668 ieee->wpa_ie = buf; in ipw2100_wx_set_genie()
7669 ieee->wpa_ie_len = wrqu->data.length; in ipw2100_wx_set_genie()
7671 kfree(ieee->wpa_ie); in ipw2100_wx_set_genie()
7672 ieee->wpa_ie = NULL; in ipw2100_wx_set_genie()
7673 ieee->wpa_ie_len = 0; in ipw2100_wx_set_genie()
7676 ipw2100_wpa_assoc_frame(priv, ieee->wpa_ie, ieee->wpa_ie_len); in ipw2100_wx_set_genie()
7687 struct libipw_device *ieee = priv->ieee; in ipw2100_wx_get_genie()
7689 if (ieee->wpa_ie_len == 0 || ieee->wpa_ie == NULL) { in ipw2100_wx_get_genie()
7690 wrqu->data.length = 0; in ipw2100_wx_get_genie()
7694 if (wrqu->data.length < ieee->wpa_ie_len) in ipw2100_wx_get_genie()
7695 return -E2BIG; in ipw2100_wx_get_genie()
7697 wrqu->data.length = ieee->wpa_ie_len; in ipw2100_wx_get_genie()
7698 memcpy(extra, ieee->wpa_ie, ieee->wpa_ie_len); in ipw2100_wx_get_genie()
7709 struct libipw_device *ieee = priv->ieee; in ipw2100_wx_set_auth()
7710 struct iw_param *param = &wrqu->param; in ipw2100_wx_set_auth()
7715 switch (param->flags & IW_AUTH_INDEX) { in ipw2100_wx_set_auth()
7726 crypt = priv->ieee->crypt_info.crypt[priv->ieee->crypt_info.tx_keyidx]; in ipw2100_wx_set_auth()
7727 if (!crypt || !crypt->ops->set_flags || !crypt->ops->get_flags) in ipw2100_wx_set_auth()
7730 flags = crypt->ops->get_flags(crypt->priv); in ipw2100_wx_set_auth()
7732 if (param->value) in ipw2100_wx_set_auth()
7737 crypt->ops->set_flags(flags, crypt->priv); in ipw2100_wx_set_auth()
7749 * used, drop_unencrypted is set to false, else true -- we in ipw2100_wx_set_auth()
7755 .enabled = param->value, in ipw2100_wx_set_auth()
7757 priv->ieee->drop_unencrypted = param->value; in ipw2100_wx_set_auth()
7761 if (!param->value) { in ipw2100_wx_set_auth()
7768 if (priv->ieee->set_security) in ipw2100_wx_set_auth()
7769 priv->ieee->set_security(priv->ieee->dev, &sec); in ipw2100_wx_set_auth()
7774 ret = ipw2100_wpa_set_auth_algs(priv, param->value); in ipw2100_wx_set_auth()
7778 ret = ipw2100_wpa_enable(priv, param->value); in ipw2100_wx_set_auth()
7782 ieee->ieee802_1x = param->value; in ipw2100_wx_set_auth()
7787 ieee->privacy_invoked = param->value; in ipw2100_wx_set_auth()
7791 return -EOPNOTSUPP; in ipw2100_wx_set_auth()
7802 struct libipw_device *ieee = priv->ieee; in ipw2100_wx_get_auth()
7804 struct iw_param *param = &wrqu->param; in ipw2100_wx_get_auth()
7807 switch (param->flags & IW_AUTH_INDEX) { in ipw2100_wx_get_auth()
7815 ret = -EOPNOTSUPP; in ipw2100_wx_get_auth()
7819 crypt = priv->ieee->crypt_info.crypt[priv->ieee->crypt_info.tx_keyidx]; in ipw2100_wx_get_auth()
7820 if (!crypt || !crypt->ops->get_flags) { in ipw2100_wx_get_auth()
7826 param->value = (crypt->ops->get_flags(crypt->priv) & in ipw2100_wx_get_auth()
7832 param->value = ieee->drop_unencrypted; in ipw2100_wx_get_auth()
7836 param->value = priv->ieee->sec.auth_mode; in ipw2100_wx_get_auth()
7840 param->value = ieee->wpa_enabled; in ipw2100_wx_get_auth()
7844 param->value = ieee->ieee802_1x; in ipw2100_wx_get_auth()
7849 param->value = ieee->privacy_invoked; in ipw2100_wx_get_auth()
7853 return -EOPNOTSUPP; in ipw2100_wx_get_auth()
7864 return libipw_wx_set_encodeext(priv->ieee, info, wrqu, extra); in ipw2100_wx_set_encodeext()
7873 return libipw_wx_get_encodeext(priv->ieee, info, wrqu, extra); in ipw2100_wx_get_encodeext()
7885 reason = cpu_to_le16(mlme->reason_code); in ipw2100_wx_set_mlme()
7887 switch (mlme->cmd) { in ipw2100_wx_set_mlme()
7897 return -EOPNOTSUPP; in ipw2100_wx_set_mlme()
7917 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_promisc()
7918 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_promisc()
7919 err = -EIO; in ipw2100_wx_set_promisc()
7924 if (priv->ieee->iw_mode == IW_MODE_MONITOR) { in ipw2100_wx_set_promisc()
7928 priv->channel = parms[1]; in ipw2100_wx_set_promisc()
7931 if (priv->ieee->iw_mode == IW_MODE_MONITOR) in ipw2100_wx_set_promisc()
7932 err = ipw2100_switch_mode(priv, priv->last_mode); in ipw2100_wx_set_promisc()
7935 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_promisc()
7944 if (priv->status & STATUS_INITIALIZED) in ipw2100_wx_reset()
7958 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_powermode()
7959 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_powermode()
7960 err = -EIO; in ipw2100_wx_set_powermode()
7967 if (IPW_POWER_LEVEL(priv->power_mode) != mode) in ipw2100_wx_set_powermode()
7970 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_powermode()
7984 int level = IPW_POWER_LEVEL(priv->power_mode); in ipw2100_wx_get_powermode()
7987 if (!(priv->power_mode & IPW_POWER_ENABLED)) { in ipw2100_wx_get_powermode()
8001 timeout = timeout_duration[level - 1] / 1000; in ipw2100_wx_get_powermode()
8002 period = period_duration[level - 1] / 1000; in ipw2100_wx_get_powermode()
8010 wrqu->data.length = strlen(extra) + 1; in ipw2100_wx_get_powermode()
8022 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_preamble()
8023 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_preamble()
8024 err = -EIO; in ipw2100_wx_set_preamble()
8029 priv->config |= CFG_LONG_PREAMBLE; in ipw2100_wx_set_preamble()
8031 priv->config &= ~CFG_LONG_PREAMBLE; in ipw2100_wx_set_preamble()
8033 err = -EINVAL; in ipw2100_wx_set_preamble()
8040 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_preamble()
8054 if (priv->config & CFG_LONG_PREAMBLE) in ipw2100_wx_get_preamble()
8055 snprintf(wrqu->name, IFNAMSIZ, "long (1)"); in ipw2100_wx_get_preamble()
8057 snprintf(wrqu->name, IFNAMSIZ, "auto (0)"); in ipw2100_wx_get_preamble()
8070 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_crc_check()
8071 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_crc_check()
8072 err = -EIO; in ipw2100_wx_set_crc_check()
8077 priv->config |= CFG_CRC_CHECK; in ipw2100_wx_set_crc_check()
8079 priv->config &= ~CFG_CRC_CHECK; in ipw2100_wx_set_crc_check()
8081 err = -EINVAL; in ipw2100_wx_set_crc_check()
8087 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_crc_check()
8101 if (priv->config & CFG_CRC_CHECK) in ipw2100_wx_get_crc_check()
8102 snprintf(wrqu->name, IFNAMSIZ, "CRC checked (1)"); in ipw2100_wx_get_crc_check()
8104 snprintf(wrqu->name, IFNAMSIZ, "CRC ignored (0)"); in ipw2100_wx_get_crc_check()
8134 NULL, /* SIOCGIWAPLIST -- deprecated */
8141 NULL, /* -- hole -- */
8142 NULL, /* -- hole -- */
8157 NULL, /* -- hole -- */
8158 NULL, /* -- hole -- */
8260 wstats = &priv->wstats; in ipw2100_wx_wireless_stats()
8267 if (!(priv->status & STATUS_ASSOCIATED)) { in ipw2100_wx_wireless_stats()
8268 wstats->miss.beacon = 0; in ipw2100_wx_wireless_stats()
8269 wstats->discard.retries = 0; in ipw2100_wx_wireless_stats()
8270 wstats->qual.qual = 0; in ipw2100_wx_wireless_stats()
8271 wstats->qual.level = 0; in ipw2100_wx_wireless_stats()
8272 wstats->qual.noise = 0; in ipw2100_wx_wireless_stats()
8273 wstats->qual.updated = 7; in ipw2100_wx_wireless_stats()
8274 wstats->qual.updated |= IW_QUAL_NOISE_INVALID | in ipw2100_wx_wireless_stats()
8284 if (!(priv->status & STATUS_ASSOCIATED)) { in ipw2100_wx_wireless_stats()
8285 wstats->qual.qual = 0; in ipw2100_wx_wireless_stats()
8286 wstats->qual.level = 0; in ipw2100_wx_wireless_stats()
8291 wstats->qual.level = rssi + IPW2100_RSSI_TO_DBM; in ipw2100_wx_wireless_stats()
8295 rssi_qual = (rssi - 10) * (FAIR - POOR) / 5 + POOR; in ipw2100_wx_wireless_stats()
8297 rssi_qual = (rssi - 15) * (GOOD - FAIR) / 5 + FAIR; in ipw2100_wx_wireless_stats()
8299 rssi_qual = (rssi - 20) * (VERY_GOOD - GOOD) / in ipw2100_wx_wireless_stats()
8302 rssi_qual = (rssi - 30) * (PERFECT - VERY_GOOD) / in ipw2100_wx_wireless_stats()
8310 tx_qual = (90 - tx_retries) * POOR / 15; in ipw2100_wx_wireless_stats()
8312 tx_qual = (75 - tx_retries) * (FAIR - POOR) / 5 + POOR; in ipw2100_wx_wireless_stats()
8314 tx_qual = (70 - tx_retries) * (GOOD - FAIR) / 5 + FAIR; in ipw2100_wx_wireless_stats()
8316 tx_qual = (65 - tx_retries) * (VERY_GOOD - GOOD) / in ipw2100_wx_wireless_stats()
8319 tx_qual = (50 - tx_retries) * in ipw2100_wx_wireless_stats()
8320 (PERFECT - VERY_GOOD) / 50 + VERY_GOOD; in ipw2100_wx_wireless_stats()
8323 beacon_qual = (60 - missed_beacons) * POOR / 10; in ipw2100_wx_wireless_stats()
8325 beacon_qual = (50 - missed_beacons) * (FAIR - POOR) / in ipw2100_wx_wireless_stats()
8328 beacon_qual = (40 - missed_beacons) * (GOOD - FAIR) / in ipw2100_wx_wireless_stats()
8331 beacon_qual = (32 - missed_beacons) * in ipw2100_wx_wireless_stats()
8332 (VERY_GOOD - GOOD) / 20 + GOOD; in ipw2100_wx_wireless_stats()
8334 beacon_qual = (20 - missed_beacons) * in ipw2100_wx_wireless_stats()
8335 (PERFECT - VERY_GOOD) / 20 + VERY_GOOD; in ipw2100_wx_wireless_stats()
8351 wstats->qual.qual = quality; in ipw2100_wx_wireless_stats()
8352 wstats->qual.level = rssi + IPW2100_RSSI_TO_DBM; in ipw2100_wx_wireless_stats()
8355 wstats->qual.noise = 0; in ipw2100_wx_wireless_stats()
8356 wstats->qual.updated = 7; in ipw2100_wx_wireless_stats()
8357 wstats->qual.updated |= IW_QUAL_NOISE_INVALID; in ipw2100_wx_wireless_stats()
8360 wstats->miss.beacon = missed_beacons; in ipw2100_wx_wireless_stats()
8365 wstats->discard.retries = tx_failures; in ipw2100_wx_wireless_stats()
8392 if (priv->status & STATUS_STOPPING) in ipw2100_wx_event_work()
8395 mutex_lock(&priv->action_mutex); in ipw2100_wx_event_work()
8399 mutex_unlock(&priv->action_mutex); in ipw2100_wx_event_work()
8404 if (!(priv->status & (STATUS_ASSOCIATING | STATUS_ASSOCIATED)) || in ipw2100_wx_event_work()
8405 priv->status & STATUS_RF_KILL_MASK || in ipw2100_wx_event_work()
8407 &priv->bssid, &len)) { in ipw2100_wx_event_work()
8412 memcpy(wrqu.ap_addr.sa_data, priv->bssid, ETH_ALEN); in ipw2100_wx_event_work()
8413 memcpy(priv->ieee->bssid, priv->bssid, ETH_ALEN); in ipw2100_wx_event_work()
8414 priv->status &= ~STATUS_ASSOCIATING; in ipw2100_wx_event_work()
8415 priv->status |= STATUS_ASSOCIATED; in ipw2100_wx_event_work()
8416 netif_carrier_on(priv->net_dev); in ipw2100_wx_event_work()
8417 netif_wake_queue(priv->net_dev); in ipw2100_wx_event_work()
8420 if (!(priv->status & STATUS_ASSOCIATED)) { in ipw2100_wx_event_work()
8422 mutex_lock(&priv->action_mutex); in ipw2100_wx_event_work()
8425 if (priv->config & CFG_STATIC_ESSID) in ipw2100_wx_event_work()
8426 ipw2100_set_essid(priv, priv->essid, priv->essid_len, in ipw2100_wx_event_work()
8430 mutex_unlock(&priv->action_mutex); in ipw2100_wx_event_work()
8433 wireless_send_event(priv->net_dev, SIOCGIWAP, &wrqu, NULL); in ipw2100_wx_event_work()
8445 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
8474 (struct ipw2100_fw_header *)fw->fw_entry->data; in ipw2100_mod_firmware_load()
8476 if (IPW2100_FW_MAJOR(h->version) != IPW2100_FW_MAJOR_VERSION) { in ipw2100_mod_firmware_load()
8480 h->version); in ipw2100_mod_firmware_load()
8484 fw->version = h->version; in ipw2100_mod_firmware_load()
8485 fw->fw.data = fw->fw_entry->data + sizeof(struct ipw2100_fw_header); in ipw2100_mod_firmware_load()
8486 fw->fw.size = h->fw_size; in ipw2100_mod_firmware_load()
8487 fw->uc.data = fw->fw.data + h->fw_size; in ipw2100_mod_firmware_load()
8488 fw->uc.size = h->uc_size; in ipw2100_mod_firmware_load()
8500 priv->net_dev->name); in ipw2100_get_firmware()
8502 switch (priv->ieee->iw_mode) { in ipw2100_get_firmware()
8504 fw_name = IPW2100_FW_NAME("-i"); in ipw2100_get_firmware()
8508 fw_name = IPW2100_FW_NAME("-p"); in ipw2100_get_firmware()
8517 rc = request_firmware(&fw->fw_entry, fw_name, &priv->pci_dev->dev); in ipw2100_get_firmware()
8522 priv->net_dev->name, fw_name); in ipw2100_get_firmware()
8525 IPW_DEBUG_INFO("firmware data %p size %zd\n", fw->fw_entry->data, in ipw2100_get_firmware()
8526 fw->fw_entry->size); in ipw2100_get_firmware()
8533 MODULE_FIRMWARE(IPW2100_FW_NAME("-i"));
8535 MODULE_FIRMWARE(IPW2100_FW_NAME("-p"));
8542 fw->version = 0; in ipw2100_release_firmware()
8543 if (fw->fw_entry) in ipw2100_release_firmware()
8544 release_firmware(fw->fw_entry); in ipw2100_release_firmware()
8545 fw->fw_entry = NULL; in ipw2100_release_firmware()
8557 return -EIO; in ipw2100_get_fwversion()
8560 len = max - 1; in ipw2100_get_fwversion()
8574 return -EIO; in ipw2100_get_ucodeversion()
8594 const unsigned char *firmware_data = fw->fw.data; in ipw2100_fw_download()
8595 unsigned int firmware_data_left = fw->fw.size; in ipw2100_fw_download()
8600 firmware_data_left -= 4; in ipw2100_fw_download()
8604 firmware_data_left -= 2; in ipw2100_fw_download()
8608 "Invalid firmware run-length of %d bytes\n", in ipw2100_fw_download()
8610 return -EINVAL; in ipw2100_fw_download()
8613 write_nic_memory(priv->net_dev, addr, len, firmware_data); in ipw2100_fw_download()
8615 firmware_data_left -= len; in ipw2100_fw_download()
8641 struct net_device *dev = priv->net_dev; in ipw2100_ucode_download()
8642 const unsigned char *microcode_data = fw->uc.data; in ipw2100_ucode_download()
8643 unsigned int microcode_data_left = fw->uc.size; in ipw2100_ucode_download()
8644 void __iomem *reg = (void __iomem *)dev->base_addr; in ipw2100_ucode_download()
8675 microcode_data_left -= 2; in ipw2100_ucode_download()
8707 /* check Symbol is enabled - upped this from 5 as it wasn't always in ipw2100_ucode_download()
8720 dev->name); in ipw2100_ucode_download()
8721 return -EIO; in ipw2100_ucode_download()
8738 ": %s: No response from Symbol - hw not alive\n", in ipw2100_ucode_download()
8739 dev->name); in ipw2100_ucode_download()
8741 return -EIO; in ipw2100_ucode_download()