Lines Matching refs:priv

321 static void ipw2100_tx_send_commands(struct ipw2100_priv *priv);
322 static void ipw2100_tx_send_data(struct ipw2100_priv *priv);
323 static int ipw2100_adapter_setup(struct ipw2100_priv *priv);
325 static void ipw2100_queues_initialize(struct ipw2100_priv *priv);
326 static void ipw2100_queues_free(struct ipw2100_priv *priv);
327 static int ipw2100_queues_allocate(struct ipw2100_priv *priv);
329 static int ipw2100_fw_download(struct ipw2100_priv *priv,
331 static int ipw2100_get_firmware(struct ipw2100_priv *priv,
333 static int ipw2100_get_fwversion(struct ipw2100_priv *priv, char *buf,
335 static int ipw2100_get_ucodeversion(struct ipw2100_priv *priv, char *buf,
337 static void ipw2100_release_firmware(struct ipw2100_priv *priv,
339 static int ipw2100_ucode_download(struct ipw2100_priv *priv,
347 struct ipw2100_priv *priv = libipw_priv(dev); in read_register() local
349 *val = ioread32(priv->ioaddr + reg); in read_register()
355 struct ipw2100_priv *priv = libipw_priv(dev); in write_register() local
357 iowrite32(val, priv->ioaddr + reg); in write_register()
364 struct ipw2100_priv *priv = libipw_priv(dev); in read_register_word() local
366 *val = ioread16(priv->ioaddr + reg); in read_register_word()
372 struct ipw2100_priv *priv = libipw_priv(dev); in read_register_byte() local
374 *val = ioread8(priv->ioaddr + reg); in read_register_byte()
380 struct ipw2100_priv *priv = libipw_priv(dev); in write_register_word() local
382 iowrite16(val, priv->ioaddr + reg); in write_register_word()
388 struct ipw2100_priv *priv = libipw_priv(dev); in write_register_byte() local
390 iowrite8(val, priv->ioaddr + reg); in write_register_byte()
531 static int ipw2100_get_ordinal(struct ipw2100_priv *priv, u32 ord, in ipw2100_get_ordinal() argument
534 struct ipw2100_ordinals *ordinals = &priv->ordinals; in ipw2100_get_ordinal()
558 read_nic_dword(priv->net_dev, in ipw2100_get_ordinal()
560 read_nic_dword(priv->net_dev, addr, val); in ipw2100_get_ordinal()
572 read_nic_dword(priv->net_dev, in ipw2100_get_ordinal()
577 read_nic_dword(priv->net_dev, in ipw2100_get_ordinal()
599 read_nic_memory(priv->net_dev, addr, total_length, val); in ipw2100_get_ordinal()
610 static int ipw2100_set_ordinal(struct ipw2100_priv *priv, u32 ord, u32 * val, in ipw2100_set_ordinal() argument
613 struct ipw2100_ordinals *ordinals = &priv->ordinals; in ipw2100_set_ordinal()
623 read_nic_dword(priv->net_dev, in ipw2100_set_ordinal()
626 write_nic_dword(priv->net_dev, addr, *val); in ipw2100_set_ordinal()
693 static void schedule_reset(struct ipw2100_priv *priv) in schedule_reset() argument
700 if (priv->reset_backoff && in schedule_reset()
701 (now - priv->last_reset > priv->reset_backoff)) in schedule_reset()
702 priv->reset_backoff = 0; in schedule_reset()
704 priv->last_reset = get_seconds(); in schedule_reset()
706 if (!(priv->status & STATUS_RESET_PENDING)) { in schedule_reset()
708 priv->net_dev->name, priv->reset_backoff); in schedule_reset()
709 netif_carrier_off(priv->net_dev); in schedule_reset()
710 netif_stop_queue(priv->net_dev); in schedule_reset()
711 priv->status |= STATUS_RESET_PENDING; in schedule_reset()
712 if (priv->reset_backoff) in schedule_reset()
713 schedule_delayed_work(&priv->reset_work, in schedule_reset()
714 priv->reset_backoff * HZ); in schedule_reset()
716 schedule_delayed_work(&priv->reset_work, 0); in schedule_reset()
718 if (priv->reset_backoff < MAX_RESET_BACKOFF) in schedule_reset()
719 priv->reset_backoff++; in schedule_reset()
721 wake_up_interruptible(&priv->wait_command_queue); in schedule_reset()
724 priv->net_dev->name); in schedule_reset()
729 static int ipw2100_hw_send_command(struct ipw2100_priv *priv, in ipw2100_hw_send_command() argument
743 spin_lock_irqsave(&priv->low_lock, flags); in ipw2100_hw_send_command()
745 if (priv->fatal_error) { in ipw2100_hw_send_command()
752 if (!(priv->status & STATUS_RUNNING)) { in ipw2100_hw_send_command()
759 if (priv->status & STATUS_CMD_ACTIVE) { in ipw2100_hw_send_command()
766 if (list_empty(&priv->msg_free_list)) { in ipw2100_hw_send_command()
771 priv->status |= STATUS_CMD_ACTIVE; in ipw2100_hw_send_command()
772 priv->messages_sent++; in ipw2100_hw_send_command()
774 element = priv->msg_free_list.next; in ipw2100_hw_send_command()
791 DEC_STAT(&priv->msg_free_stat); in ipw2100_hw_send_command()
793 list_add_tail(element, &priv->msg_pend_list); in ipw2100_hw_send_command()
794 INC_STAT(&priv->msg_pend_stat); in ipw2100_hw_send_command()
796 ipw2100_tx_send_commands(priv); in ipw2100_hw_send_command()
797 ipw2100_tx_send_data(priv); in ipw2100_hw_send_command()
799 spin_unlock_irqrestore(&priv->low_lock, flags); in ipw2100_hw_send_command()
808 wait_event_interruptible_timeout(priv->wait_command_queue, in ipw2100_hw_send_command()
809 !(priv-> in ipw2100_hw_send_command()
816 priv->fatal_error = IPW2100_ERR_MSG_TIMEOUT; in ipw2100_hw_send_command()
817 priv->status &= ~STATUS_CMD_ACTIVE; in ipw2100_hw_send_command()
818 schedule_reset(priv); in ipw2100_hw_send_command()
822 if (priv->fatal_error) { in ipw2100_hw_send_command()
824 priv->net_dev->name); in ipw2100_hw_send_command()
838 spin_unlock_irqrestore(&priv->low_lock, flags); in ipw2100_hw_send_command()
847 static int ipw2100_verify(struct ipw2100_priv *priv) in ipw2100_verify() argument
858 read_register(priv->net_dev, address, &data1); in ipw2100_verify()
866 write_register(priv->net_dev, IPW_REG_DOMAIN_1_OFFSET + 0x32, in ipw2100_verify()
868 write_register(priv->net_dev, IPW_REG_DOMAIN_1_OFFSET + 0x36, in ipw2100_verify()
870 read_register(priv->net_dev, IPW_REG_DOMAIN_1_OFFSET + 0x32, in ipw2100_verify()
872 read_register(priv->net_dev, IPW_REG_DOMAIN_1_OFFSET + 0x36, in ipw2100_verify()
891 static int ipw2100_wait_for_card_state(struct ipw2100_priv *priv, int state) in ipw2100_wait_for_card_state() argument
899 err = ipw2100_get_ordinal(priv, IPW_ORD_CARD_DISABLED, in ipw2100_wait_for_card_state()
911 ((priv->status & STATUS_ENABLED) ? in ipw2100_wait_for_card_state()
914 priv->status |= STATUS_ENABLED; in ipw2100_wait_for_card_state()
916 priv->status &= ~STATUS_ENABLED; in ipw2100_wait_for_card_state()
934 static int sw_reset_and_clock(struct ipw2100_priv *priv) in sw_reset_and_clock() argument
940 write_register(priv->net_dev, IPW_REG_RESET_REG, in sw_reset_and_clock()
948 read_register(priv->net_dev, IPW_REG_RESET_REG, &r); in sw_reset_and_clock()
958 write_register(priv->net_dev, IPW_REG_GP_CNTRL, in sw_reset_and_clock()
966 read_register(priv->net_dev, IPW_REG_GP_CNTRL, &r); in sw_reset_and_clock()
975 read_register(priv->net_dev, IPW_REG_GP_CNTRL, &r); in sw_reset_and_clock()
976 write_register(priv->net_dev, IPW_REG_GP_CNTRL, in sw_reset_and_clock()
993 static int ipw2100_download_firmware(struct ipw2100_priv *priv) in ipw2100_download_firmware() argument
1003 if (priv->fatal_error) { in ipw2100_download_firmware()
1006 priv->net_dev->name, priv->fatal_error); in ipw2100_download_firmware()
1011 err = ipw2100_get_firmware(priv, &ipw2100_firmware); in ipw2100_download_firmware()
1014 priv->net_dev->name, err); in ipw2100_download_firmware()
1015 priv->fatal_error = IPW2100_ERR_FW_LOAD; in ipw2100_download_firmware()
1020 err = ipw2100_get_firmware(priv, &ipw2100_firmware); in ipw2100_download_firmware()
1023 priv->net_dev->name, err); in ipw2100_download_firmware()
1024 priv->fatal_error = IPW2100_ERR_FW_LOAD; in ipw2100_download_firmware()
1028 priv->firmware_version = ipw2100_firmware.version; in ipw2100_download_firmware()
1031 err = sw_reset_and_clock(priv); in ipw2100_download_firmware()
1034 priv->net_dev->name, err); in ipw2100_download_firmware()
1038 err = ipw2100_verify(priv); in ipw2100_download_firmware()
1041 priv->net_dev->name, err); in ipw2100_download_firmware()
1046 write_nic_dword(priv->net_dev, in ipw2100_download_firmware()
1050 write_register(priv->net_dev, IPW_REG_RESET_REG, 0); in ipw2100_download_firmware()
1053 err = ipw2100_ucode_download(priv, &ipw2100_firmware); in ipw2100_download_firmware()
1056 priv->net_dev->name, err); in ipw2100_download_firmware()
1061 write_nic_dword(priv->net_dev, in ipw2100_download_firmware()
1065 err = sw_reset_and_clock(priv); in ipw2100_download_firmware()
1069 priv->net_dev->name, err); in ipw2100_download_firmware()
1074 err = ipw2100_fw_download(priv, &ipw2100_firmware); in ipw2100_download_firmware()
1077 priv->net_dev->name, err); in ipw2100_download_firmware()
1089 ipw2100_release_firmware(priv, &ipw2100_firmware); in ipw2100_download_firmware()
1095 write_nic_dword(priv->net_dev, address, 0); in ipw2100_download_firmware()
1098 write_nic_dword(priv->net_dev, address, 0); in ipw2100_download_firmware()
1101 write_nic_dword(priv->net_dev, address, 0); in ipw2100_download_firmware()
1104 write_nic_dword(priv->net_dev, address, 0); in ipw2100_download_firmware()
1107 write_nic_dword(priv->net_dev, address, 0); in ipw2100_download_firmware()
1112 ipw2100_release_firmware(priv, &ipw2100_firmware); in ipw2100_download_firmware()
1116 static inline void ipw2100_enable_interrupts(struct ipw2100_priv *priv) in ipw2100_enable_interrupts() argument
1118 if (priv->status & STATUS_INT_ENABLED) in ipw2100_enable_interrupts()
1120 priv->status |= STATUS_INT_ENABLED; in ipw2100_enable_interrupts()
1121 write_register(priv->net_dev, IPW_REG_INTA_MASK, IPW_INTERRUPT_MASK); in ipw2100_enable_interrupts()
1124 static inline void ipw2100_disable_interrupts(struct ipw2100_priv *priv) in ipw2100_disable_interrupts() argument
1126 if (!(priv->status & STATUS_INT_ENABLED)) in ipw2100_disable_interrupts()
1128 priv->status &= ~STATUS_INT_ENABLED; in ipw2100_disable_interrupts()
1129 write_register(priv->net_dev, IPW_REG_INTA_MASK, 0x0); in ipw2100_disable_interrupts()
1132 static void ipw2100_initialize_ordinals(struct ipw2100_priv *priv) in ipw2100_initialize_ordinals() argument
1134 struct ipw2100_ordinals *ord = &priv->ordinals; in ipw2100_initialize_ordinals()
1138 read_register(priv->net_dev, IPW_MEM_HOST_SHARED_ORDINALS_TABLE_1, in ipw2100_initialize_ordinals()
1141 read_register(priv->net_dev, IPW_MEM_HOST_SHARED_ORDINALS_TABLE_2, in ipw2100_initialize_ordinals()
1144 read_nic_dword(priv->net_dev, ord->table1_addr, &ord->table1_size); in ipw2100_initialize_ordinals()
1145 read_nic_dword(priv->net_dev, ord->table2_addr, &ord->table2_size); in ipw2100_initialize_ordinals()
1154 static inline void ipw2100_hw_set_gpio(struct ipw2100_priv *priv) in ipw2100_hw_set_gpio() argument
1163 write_register(priv->net_dev, IPW_REG_GPIO, reg); in ipw2100_hw_set_gpio()
1166 static int rf_kill_active(struct ipw2100_priv *priv) in rf_kill_active() argument
1175 if (!(priv->hw_features & HW_FEATURE_RFKILL)) { in rf_kill_active()
1176 wiphy_rfkill_set_hw_state(priv->ieee->wdev.wiphy, false); in rf_kill_active()
1177 priv->status &= ~STATUS_RF_KILL_HW; in rf_kill_active()
1183 read_register(priv->net_dev, IPW_REG_GPIO, &reg); in rf_kill_active()
1188 wiphy_rfkill_set_hw_state(priv->ieee->wdev.wiphy, true); in rf_kill_active()
1189 priv->status |= STATUS_RF_KILL_HW; in rf_kill_active()
1191 wiphy_rfkill_set_hw_state(priv->ieee->wdev.wiphy, false); in rf_kill_active()
1192 priv->status &= ~STATUS_RF_KILL_HW; in rf_kill_active()
1198 static int ipw2100_get_hw_features(struct ipw2100_priv *priv) in ipw2100_get_hw_features() argument
1208 (priv, IPW_ORD_EEPROM_SRAM_DB_BLOCK_START_ADDRESS, &addr, &len)) { in ipw2100_get_hw_features()
1219 read_nic_dword(priv->net_dev, addr + 0xFC, &val); in ipw2100_get_hw_features()
1220 priv->eeprom_version = (val >> 24) & 0xFF; in ipw2100_get_hw_features()
1221 IPW_DEBUG_INFO("EEPROM version: %d\n", priv->eeprom_version); in ipw2100_get_hw_features()
1230 read_nic_dword(priv->net_dev, addr + 0x20, &val); in ipw2100_get_hw_features()
1232 priv->hw_features |= HW_FEATURE_RFKILL; in ipw2100_get_hw_features()
1235 (priv->hw_features & HW_FEATURE_RFKILL) ? "" : "not "); in ipw2100_get_hw_features()
1246 static int ipw2100_start_adapter(struct ipw2100_priv *priv) in ipw2100_start_adapter() argument
1253 if (priv->status & STATUS_RUNNING) in ipw2100_start_adapter()
1261 if (ipw2100_download_firmware(priv)) { in ipw2100_start_adapter()
1264 priv->net_dev->name); in ipw2100_start_adapter()
1270 ipw2100_queues_initialize(priv); in ipw2100_start_adapter()
1272 ipw2100_hw_set_gpio(priv); in ipw2100_start_adapter()
1278 write_register(priv->net_dev, IPW_REG_RESET_REG, 0); in ipw2100_start_adapter()
1287 read_register(priv->net_dev, IPW_REG_INTA, &inta); in ipw2100_start_adapter()
1292 write_register(priv->net_dev, IPW_REG_INTA, in ipw2100_start_adapter()
1303 write_register(priv->net_dev, IPW_REG_INTA, in ipw2100_start_adapter()
1311 read_register(priv->net_dev, IPW_REG_INTA, &inta); in ipw2100_start_adapter()
1312 read_register(priv->net_dev, IPW_REG_INTA_MASK, &inta_mask); in ipw2100_start_adapter()
1316 write_register(priv->net_dev, IPW_REG_INTA, inta); in ipw2100_start_adapter()
1324 priv->net_dev->name); in ipw2100_start_adapter()
1329 read_register(priv->net_dev, IPW_REG_GPIO, &gpio); in ipw2100_start_adapter()
1333 write_register(priv->net_dev, IPW_REG_GPIO, gpio); in ipw2100_start_adapter()
1336 priv->status |= STATUS_RUNNING; in ipw2100_start_adapter()
1339 priv->status &= ~(STATUS_ASSOCIATING | STATUS_ASSOCIATED); in ipw2100_start_adapter()
1346 static inline void ipw2100_reset_fatalerror(struct ipw2100_priv *priv) in ipw2100_reset_fatalerror() argument
1348 if (!priv->fatal_error) in ipw2100_reset_fatalerror()
1351 priv->fatal_errors[priv->fatal_index++] = priv->fatal_error; in ipw2100_reset_fatalerror()
1352 priv->fatal_index %= IPW2100_ERROR_QUEUE; in ipw2100_reset_fatalerror()
1353 priv->fatal_error = 0; in ipw2100_reset_fatalerror()
1357 static int ipw2100_power_cycle_adapter(struct ipw2100_priv *priv) in ipw2100_power_cycle_adapter() argument
1364 ipw2100_hw_set_gpio(priv); in ipw2100_power_cycle_adapter()
1367 write_register(priv->net_dev, IPW_REG_RESET_REG, in ipw2100_power_cycle_adapter()
1375 read_register(priv->net_dev, IPW_REG_RESET_REG, &reg); in ipw2100_power_cycle_adapter()
1381 priv->status &= ~STATUS_RESET_PENDING; in ipw2100_power_cycle_adapter()
1389 write_register(priv->net_dev, IPW_REG_RESET_REG, in ipw2100_power_cycle_adapter()
1393 ipw2100_reset_fatalerror(priv); in ipw2100_power_cycle_adapter()
1396 priv->status &= ~(STATUS_RUNNING | STATUS_ASSOCIATING | in ipw2100_power_cycle_adapter()
1410 static int ipw2100_hw_phy_off(struct ipw2100_priv *priv) in ipw2100_hw_phy_off() argument
1426 err = ipw2100_hw_send_command(priv, &cmd); in ipw2100_hw_phy_off()
1431 read_nic_dword(priv->net_dev, IPW2100_CONTROL_REG, &val1); in ipw2100_hw_phy_off()
1432 read_nic_dword(priv->net_dev, IPW2100_COMMAND, &val2); in ipw2100_hw_phy_off()
1444 static int ipw2100_enable_adapter(struct ipw2100_priv *priv) in ipw2100_enable_adapter() argument
1455 if (priv->status & STATUS_ENABLED) in ipw2100_enable_adapter()
1458 mutex_lock(&priv->adapter_mutex); in ipw2100_enable_adapter()
1460 if (rf_kill_active(priv)) { in ipw2100_enable_adapter()
1465 err = ipw2100_hw_send_command(priv, &cmd); in ipw2100_enable_adapter()
1471 err = ipw2100_wait_for_card_state(priv, IPW_HW_STATE_ENABLED); in ipw2100_enable_adapter()
1474 priv->net_dev->name); in ipw2100_enable_adapter()
1478 if (priv->stop_hang_check) { in ipw2100_enable_adapter()
1479 priv->stop_hang_check = 0; in ipw2100_enable_adapter()
1480 schedule_delayed_work(&priv->hang_check, HZ / 2); in ipw2100_enable_adapter()
1484 mutex_unlock(&priv->adapter_mutex); in ipw2100_enable_adapter()
1488 static int ipw2100_hw_stop_adapter(struct ipw2100_priv *priv) in ipw2100_hw_stop_adapter() argument
1500 if (!(priv->status & STATUS_RUNNING)) in ipw2100_hw_stop_adapter()
1503 priv->status |= STATUS_STOPPING; in ipw2100_hw_stop_adapter()
1508 if (!priv->fatal_error) { in ipw2100_hw_stop_adapter()
1511 ipw2100_enable_adapter(priv); in ipw2100_hw_stop_adapter()
1513 err = ipw2100_hw_phy_off(priv); in ipw2100_hw_stop_adapter()
1540 err = ipw2100_hw_send_command(priv, &cmd); in ipw2100_hw_stop_adapter()
1544 priv->net_dev->name, err); in ipw2100_hw_stop_adapter()
1549 priv->status &= ~STATUS_ENABLED; in ipw2100_hw_stop_adapter()
1555 ipw2100_hw_set_gpio(priv); in ipw2100_hw_stop_adapter()
1565 write_register(priv->net_dev, IPW_REG_RESET_REG, in ipw2100_hw_stop_adapter()
1574 read_register(priv->net_dev, IPW_REG_RESET_REG, &reg); in ipw2100_hw_stop_adapter()
1583 priv->net_dev->name); in ipw2100_hw_stop_adapter()
1586 write_register(priv->net_dev, IPW_REG_RESET_REG, in ipw2100_hw_stop_adapter()
1589 priv->status &= ~(STATUS_RUNNING | STATUS_STOPPING); in ipw2100_hw_stop_adapter()
1594 static int ipw2100_disable_adapter(struct ipw2100_priv *priv) in ipw2100_disable_adapter() argument
1605 if (!(priv->status & STATUS_ENABLED)) in ipw2100_disable_adapter()
1609 priv->status &= ~(STATUS_ASSOCIATED | STATUS_ASSOCIATING); in ipw2100_disable_adapter()
1611 if (!priv->stop_hang_check) { in ipw2100_disable_adapter()
1612 priv->stop_hang_check = 1; in ipw2100_disable_adapter()
1613 cancel_delayed_work(&priv->hang_check); in ipw2100_disable_adapter()
1616 mutex_lock(&priv->adapter_mutex); in ipw2100_disable_adapter()
1618 err = ipw2100_hw_send_command(priv, &cmd); in ipw2100_disable_adapter()
1625 err = ipw2100_wait_for_card_state(priv, IPW_HW_STATE_DISABLED); in ipw2100_disable_adapter()
1635 mutex_unlock(&priv->adapter_mutex); in ipw2100_disable_adapter()
1639 static int ipw2100_set_scan_options(struct ipw2100_priv *priv) in ipw2100_set_scan_options() argument
1654 if (!(priv->config & CFG_ASSOCIATE)) in ipw2100_set_scan_options()
1656 if ((priv->ieee->sec.flags & SEC_ENABLED) && priv->ieee->sec.enabled) in ipw2100_set_scan_options()
1658 if (priv->config & CFG_PASSIVE_SCAN) in ipw2100_set_scan_options()
1661 cmd.host_command_parameters[1] = priv->channel_mask; in ipw2100_set_scan_options()
1663 err = ipw2100_hw_send_command(priv, &cmd); in ipw2100_set_scan_options()
1671 static int ipw2100_start_scan(struct ipw2100_priv *priv) in ipw2100_start_scan() argument
1685 if (priv->ieee->iw_mode == IW_MODE_MONITOR) in ipw2100_start_scan()
1688 if (priv->status & STATUS_SCANNING) { in ipw2100_start_scan()
1702 priv->status |= STATUS_SCANNING; in ipw2100_start_scan()
1703 err = ipw2100_hw_send_command(priv, &cmd); in ipw2100_start_scan()
1705 priv->status &= ~STATUS_SCANNING; in ipw2100_start_scan()
1724 static int ipw2100_up(struct ipw2100_priv *priv, int deferred) in ipw2100_up() argument
1732 if (priv->suspend_time) { in ipw2100_up()
1733 libipw_networks_age(priv->ieee, priv->suspend_time); in ipw2100_up()
1734 priv->suspend_time = 0; in ipw2100_up()
1738 if (priv->status & STATUS_RF_KILL_SW) { in ipw2100_up()
1740 "switch\n", priv->net_dev->name); in ipw2100_up()
1750 spin_lock_irqsave(&priv->low_lock, flags); in ipw2100_up()
1751 ipw2100_disable_interrupts(priv); in ipw2100_up()
1754 ipw2100_reset_fatalerror(priv); in ipw2100_up()
1755 spin_unlock_irqrestore(&priv->low_lock, flags); in ipw2100_up()
1757 if (priv->status & STATUS_POWERED || in ipw2100_up()
1758 (priv->status & STATUS_RESET_PENDING)) { in ipw2100_up()
1760 if (ipw2100_power_cycle_adapter(priv)) { in ipw2100_up()
1763 priv->net_dev->name); in ipw2100_up()
1768 priv->status |= STATUS_POWERED; in ipw2100_up()
1771 if (ipw2100_start_adapter(priv)) { in ipw2100_up()
1774 priv->net_dev->name); in ipw2100_up()
1779 ipw2100_initialize_ordinals(priv); in ipw2100_up()
1782 if (ipw2100_get_hw_features(priv)) { in ipw2100_up()
1785 priv->net_dev->name); in ipw2100_up()
1791 libipw_set_geo(priv->ieee, &ipw_geos[0]); in ipw2100_up()
1792 priv->ieee->freq_band = LIBIPW_24GHZ_BAND; in ipw2100_up()
1795 if (ipw2100_set_ordinal(priv, IPW_ORD_PERS_DB_LOCK, &lock, &ord_len)) { in ipw2100_up()
1798 priv->net_dev->name); in ipw2100_up()
1803 priv->status &= ~STATUS_SCANNING; in ipw2100_up()
1805 if (rf_kill_active(priv)) { in ipw2100_up()
1807 priv->net_dev->name); in ipw2100_up()
1809 if (priv->stop_rf_kill) { in ipw2100_up()
1810 priv->stop_rf_kill = 0; in ipw2100_up()
1811 schedule_delayed_work(&priv->rf_kill, in ipw2100_up()
1819 ipw2100_enable_interrupts(priv); in ipw2100_up()
1823 if (ipw2100_adapter_setup(priv)) { in ipw2100_up()
1825 priv->net_dev->name); in ipw2100_up()
1832 if (ipw2100_enable_adapter(priv)) { in ipw2100_up()
1835 priv->net_dev->name); in ipw2100_up()
1836 ipw2100_hw_stop_adapter(priv); in ipw2100_up()
1842 ipw2100_set_scan_options(priv); in ipw2100_up()
1843 ipw2100_start_scan(priv); in ipw2100_up()
1850 static void ipw2100_down(struct ipw2100_priv *priv) in ipw2100_down() argument
1857 int associated = priv->status & STATUS_ASSOCIATED; in ipw2100_down()
1860 if (!priv->stop_rf_kill) { in ipw2100_down()
1861 priv->stop_rf_kill = 1; in ipw2100_down()
1862 cancel_delayed_work(&priv->rf_kill); in ipw2100_down()
1866 if (!priv->stop_hang_check) { in ipw2100_down()
1867 priv->stop_hang_check = 1; in ipw2100_down()
1868 cancel_delayed_work(&priv->hang_check); in ipw2100_down()
1872 if (priv->status & STATUS_RESET_PENDING) in ipw2100_down()
1873 cancel_delayed_work(&priv->reset_work); in ipw2100_down()
1877 spin_lock_irqsave(&priv->low_lock, flags); in ipw2100_down()
1878 ipw2100_enable_interrupts(priv); in ipw2100_down()
1879 spin_unlock_irqrestore(&priv->low_lock, flags); in ipw2100_down()
1881 if (ipw2100_hw_stop_adapter(priv)) in ipw2100_down()
1883 priv->net_dev->name); in ipw2100_down()
1888 spin_lock_irqsave(&priv->low_lock, flags); in ipw2100_down()
1889 ipw2100_disable_interrupts(priv); in ipw2100_down()
1890 spin_unlock_irqrestore(&priv->low_lock, flags); in ipw2100_down()
1896 wireless_send_event(priv->net_dev, SIOCGIWAP, &wrqu, NULL); in ipw2100_down()
1898 priv->status &= ~(STATUS_ASSOCIATED | STATUS_ASSOCIATING); in ipw2100_down()
1899 netif_carrier_off(priv->net_dev); in ipw2100_down()
1900 netif_stop_queue(priv->net_dev); in ipw2100_down()
1905 struct ipw2100_priv *priv = libipw_priv(dev); in ipw2100_wdev_init() local
1906 const struct libipw_geo *geo = libipw_get_geo(priv->ieee); in ipw2100_wdev_init()
1907 struct wireless_dev *wdev = &priv->ieee->wdev; in ipw2100_wdev_init()
1910 memcpy(wdev->wiphy->perm_addr, priv->mac_addr, ETH_ALEN); in ipw2100_wdev_init()
1914 struct ieee80211_supported_band *bg_band = &priv->ieee->bg_band; in ipw2100_wdev_init()
1922 ipw2100_down(priv); in ipw2100_wdev_init()
1954 set_wiphy_dev(wdev->wiphy, &priv->pci_dev->dev); in ipw2100_wdev_init()
1962 struct ipw2100_priv *priv = in ipw2100_reset_adapter() local
1969 int associated = priv->status & STATUS_ASSOCIATED; in ipw2100_reset_adapter()
1971 spin_lock_irqsave(&priv->low_lock, flags); in ipw2100_reset_adapter()
1972 IPW_DEBUG_INFO(": %s: Restarting adapter.\n", priv->net_dev->name); in ipw2100_reset_adapter()
1973 priv->resets++; in ipw2100_reset_adapter()
1974 priv->status &= ~(STATUS_ASSOCIATED | STATUS_ASSOCIATING); in ipw2100_reset_adapter()
1975 priv->status |= STATUS_SECURITY_UPDATED; in ipw2100_reset_adapter()
1979 cancel_delayed_work(&priv->reset_work); in ipw2100_reset_adapter()
1980 priv->status |= STATUS_RESET_PENDING; in ipw2100_reset_adapter()
1981 spin_unlock_irqrestore(&priv->low_lock, flags); in ipw2100_reset_adapter()
1983 mutex_lock(&priv->action_mutex); in ipw2100_reset_adapter()
1985 priv->stop_hang_check = 1; in ipw2100_reset_adapter()
1986 cancel_delayed_work(&priv->hang_check); in ipw2100_reset_adapter()
1990 wireless_send_event(priv->net_dev, SIOCGIWAP, &wrqu, NULL); in ipw2100_reset_adapter()
1992 ipw2100_up(priv, 0); in ipw2100_reset_adapter()
1993 mutex_unlock(&priv->action_mutex); in ipw2100_reset_adapter()
1997 static void isr_indicate_associated(struct ipw2100_priv *priv, u32 status) in isr_indicate_associated() argument
2017 ret = ipw2100_get_ordinal(priv, IPW_ORD_STAT_ASSN_SSID, in isr_indicate_associated()
2026 ret = ipw2100_get_ordinal(priv, IPW_ORD_CURRENT_TX_RATE, &txrate, &len); in isr_indicate_associated()
2034 ret = ipw2100_get_ordinal(priv, IPW_ORD_OUR_FREQ, &chan, &len); in isr_indicate_associated()
2041 ret = ipw2100_get_ordinal(priv, IPW_ORD_STAT_ASSN_AP_BSSID, bssid, in isr_indicate_associated()
2048 memcpy(priv->ieee->bssid, bssid, ETH_ALEN); in isr_indicate_associated()
2070 priv->net_dev->name, essid_len, essid, in isr_indicate_associated()
2074 if (!(priv->config & CFG_STATIC_ESSID)) { in isr_indicate_associated()
2075 priv->essid_len = min((u8) essid_len, (u8) IW_ESSID_MAX_SIZE); in isr_indicate_associated()
2076 memcpy(priv->essid, essid, priv->essid_len); in isr_indicate_associated()
2078 priv->channel = chan; in isr_indicate_associated()
2079 memcpy(priv->bssid, bssid, ETH_ALEN); in isr_indicate_associated()
2081 priv->status |= STATUS_ASSOCIATING; in isr_indicate_associated()
2082 priv->connect_start = get_seconds(); in isr_indicate_associated()
2084 schedule_delayed_work(&priv->wx_event_work, HZ / 10); in isr_indicate_associated()
2087 static int ipw2100_set_essid(struct ipw2100_priv *priv, char *essid, in ipw2100_set_essid() argument
2104 err = ipw2100_disable_adapter(priv); in ipw2100_set_essid()
2111 if (!ssid_len && !(priv->config & CFG_ASSOCIATE)) { in ipw2100_set_essid()
2122 err = ipw2100_hw_send_command(priv, &cmd); in ipw2100_set_essid()
2124 memset(priv->essid + ssid_len, 0, IW_ESSID_MAX_SIZE - ssid_len); in ipw2100_set_essid()
2125 memcpy(priv->essid, essid, ssid_len); in ipw2100_set_essid()
2126 priv->essid_len = ssid_len; in ipw2100_set_essid()
2130 if (ipw2100_enable_adapter(priv)) in ipw2100_set_essid()
2137 static void isr_indicate_association_lost(struct ipw2100_priv *priv, u32 status) in isr_indicate_association_lost() argument
2140 "disassociated: '%*pE' %pM\n", priv->essid_len, priv->essid, in isr_indicate_association_lost()
2141 priv->bssid); in isr_indicate_association_lost()
2143 priv->status &= ~(STATUS_ASSOCIATED | STATUS_ASSOCIATING); in isr_indicate_association_lost()
2145 if (priv->status & STATUS_STOPPING) { in isr_indicate_association_lost()
2150 eth_zero_addr(priv->bssid); in isr_indicate_association_lost()
2151 eth_zero_addr(priv->ieee->bssid); in isr_indicate_association_lost()
2153 netif_carrier_off(priv->net_dev); in isr_indicate_association_lost()
2154 netif_stop_queue(priv->net_dev); in isr_indicate_association_lost()
2156 if (!(priv->status & STATUS_RUNNING)) in isr_indicate_association_lost()
2159 if (priv->status & STATUS_SECURITY_UPDATED) in isr_indicate_association_lost()
2160 schedule_delayed_work(&priv->security_work, 0); in isr_indicate_association_lost()
2162 schedule_delayed_work(&priv->wx_event_work, 0); in isr_indicate_association_lost()
2165 static void isr_indicate_rf_kill(struct ipw2100_priv *priv, u32 status) in isr_indicate_rf_kill() argument
2168 priv->net_dev->name); in isr_indicate_rf_kill()
2171 wiphy_rfkill_set_hw_state(priv->ieee->wdev.wiphy, true); in isr_indicate_rf_kill()
2172 priv->status |= STATUS_RF_KILL_HW; in isr_indicate_rf_kill()
2175 priv->stop_rf_kill = 0; in isr_indicate_rf_kill()
2176 mod_delayed_work(system_wq, &priv->rf_kill, round_jiffies_relative(HZ)); in isr_indicate_rf_kill()
2181 struct ipw2100_priv *priv = container_of(work, struct ipw2100_priv, in ipw2100_scan_event() local
2187 wireless_send_event(priv->net_dev, SIOCGIWSCAN, &wrqu, NULL); in ipw2100_scan_event()
2190 static void isr_scan_complete(struct ipw2100_priv *priv, u32 status) in isr_scan_complete() argument
2194 priv->ieee->scans++; in isr_scan_complete()
2195 priv->status &= ~STATUS_SCANNING; in isr_scan_complete()
2198 if (!priv->user_requested_scan) { in isr_scan_complete()
2199 schedule_delayed_work(&priv->scan_event, in isr_scan_complete()
2202 priv->user_requested_scan = 0; in isr_scan_complete()
2203 mod_delayed_work(system_wq, &priv->scan_event, 0); in isr_scan_complete()
2211 void (*cb) (struct ipw2100_priv * priv, u32 status);
2218 void (*cb) (struct ipw2100_priv * priv, u32 status);
2222 static void isr_indicate_scanning(struct ipw2100_priv *priv, u32 status) in isr_indicate_scanning() argument
2225 priv->status |= STATUS_SCANNING; in isr_indicate_scanning()
2244 static void isr_status_change(struct ipw2100_priv *priv, int status) in isr_status_change() argument
2249 priv->status & STATUS_ASSOCIATED && in isr_status_change()
2250 !(priv->status & STATUS_SCANNING)) { in isr_status_change()
2255 schedule_reset(priv); in isr_status_change()
2263 status_handlers[i].cb(priv, status); in isr_status_change()
2264 priv->wstats.status = status; in isr_status_change()
2272 static void isr_rx_complete_command(struct ipw2100_priv *priv, in isr_rx_complete_command() argument
2283 priv->status |= STATUS_ENABLED; in isr_rx_complete_command()
2286 priv->status &= ~STATUS_ENABLED; in isr_rx_complete_command()
2288 priv->status &= ~STATUS_CMD_ACTIVE; in isr_rx_complete_command()
2290 wake_up_interruptible(&priv->wait_command_queue); in isr_rx_complete_command()
2303 static int ipw2100_alloc_skb(struct ipw2100_priv *priv, in ipw2100_alloc_skb() argument
2311 packet->dma_addr = pci_map_single(priv->pci_dev, packet->skb->data, in ipw2100_alloc_skb()
2326 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
2327 static void ipw2100_snapshot_free(struct ipw2100_priv *priv) in ipw2100_snapshot_free() argument
2330 if (!priv->snapshot[0]) in ipw2100_snapshot_free()
2333 kfree(priv->snapshot[i]); in ipw2100_snapshot_free()
2334 priv->snapshot[0] = NULL; in ipw2100_snapshot_free()
2338 static int ipw2100_snapshot_alloc(struct ipw2100_priv *priv) in ipw2100_snapshot_alloc() argument
2341 if (priv->snapshot[0]) in ipw2100_snapshot_alloc()
2344 priv->snapshot[i] = kmalloc(0x1000, GFP_ATOMIC); in ipw2100_snapshot_alloc()
2345 if (!priv->snapshot[i]) { in ipw2100_snapshot_alloc()
2347 "buffer %d\n", priv->net_dev->name, i); in ipw2100_snapshot_alloc()
2349 kfree(priv->snapshot[--i]); in ipw2100_snapshot_alloc()
2350 priv->snapshot[0] = NULL; in ipw2100_snapshot_alloc()
2358 static u32 ipw2100_match_buf(struct ipw2100_priv *priv, u8 * in_buf, in ipw2100_match_buf() argument
2368 if (!ipw2100_snapshot_alloc(priv)) in ipw2100_match_buf()
2373 read_nic_dword(priv->net_dev, i, &tmp); in ipw2100_match_buf()
2416 static void ipw2100_corruption_detected(struct ipw2100_priv *priv, int i) in ipw2100_corruption_detected() argument
2419 struct ipw2100_status *status = &priv->status_queue.drv[i]; in ipw2100_corruption_detected()
2429 write_register(priv->net_dev, IPW_REG_RESET_REG, in ipw2100_corruption_detected()
2434 read_register(priv->net_dev, IPW_REG_RESET_REG, &reg); in ipw2100_corruption_detected()
2440 match = ipw2100_match_buf(priv, (u8 *) status, in ipw2100_corruption_detected()
2446 priv->net_dev->name, match, in ipw2100_corruption_detected()
2450 "Firmware.\n", priv->net_dev->name); in ipw2100_corruption_detected()
2452 printk_buf((u8 *) priv->status_queue.drv, in ipw2100_corruption_detected()
2456 priv->fatal_error = IPW2100_ERR_C3_CORRUPTION; in ipw2100_corruption_detected()
2457 priv->net_dev->stats.rx_errors++; in ipw2100_corruption_detected()
2458 schedule_reset(priv); in ipw2100_corruption_detected()
2461 static void isr_rx(struct ipw2100_priv *priv, int i, in isr_rx() argument
2464 struct net_device *dev = priv->net_dev; in isr_rx()
2465 struct ipw2100_status *status = &priv->status_queue.drv[i]; in isr_rx()
2466 struct ipw2100_rx_packet *packet = &priv->rx_buffers[i]; in isr_rx()
2481 priv->wstats.discard.misc++; in isr_rx()
2486 if (unlikely(priv->ieee->iw_mode != IW_MODE_MONITOR && in isr_rx()
2487 !(priv->status & STATUS_ASSOCIATED))) { in isr_rx()
2489 priv->wstats.discard.misc++; in isr_rx()
2493 pci_unmap_single(priv->pci_dev, in isr_rx()
2507 if (!libipw_rx(priv->ieee, packet->skb, stats)) { in isr_rx()
2521 if (unlikely(ipw2100_alloc_skb(priv, packet))) { in isr_rx()
2530 priv->rx_queue.drv[i].host_addr = packet->dma_addr; in isr_rx()
2535 static void isr_rx_monitor(struct ipw2100_priv *priv, int i, in isr_rx_monitor() argument
2538 struct net_device *dev = priv->net_dev; in isr_rx_monitor()
2539 struct ipw2100_status *status = &priv->status_queue.drv[i]; in isr_rx_monitor()
2540 struct ipw2100_rx_packet *packet = &priv->rx_buffers[i]; in isr_rx_monitor()
2565 priv->wstats.discard.misc++; in isr_rx_monitor()
2570 if (unlikely(priv->config & CFG_CRC_CHECK && in isr_rx_monitor()
2577 pci_unmap_single(priv->pci_dev, packet->dma_addr, in isr_rx_monitor()
2594 if (!libipw_rx(priv->ieee, packet->skb, stats)) { in isr_rx_monitor()
2603 if (unlikely(ipw2100_alloc_skb(priv, packet))) { in isr_rx_monitor()
2612 priv->rx_queue.drv[i].host_addr = packet->dma_addr; in isr_rx_monitor()
2617 static int ipw2100_corruption_check(struct ipw2100_priv *priv, int i) in ipw2100_corruption_check() argument
2619 struct ipw2100_status *status = &priv->status_queue.drv[i]; in ipw2100_corruption_check()
2620 struct ipw2100_rx *u = priv->rx_buffers[i].rxp; in ipw2100_corruption_check()
2673 static void __ipw2100_rx_process(struct ipw2100_priv *priv) in __ipw2100_rx_process() argument
2675 struct ipw2100_bd_queue *rxq = &priv->rx_queue; in __ipw2100_rx_process()
2676 struct ipw2100_status_queue *sq = &priv->status_queue; in __ipw2100_rx_process()
2685 read_register(priv->net_dev, IPW_MEM_HOST_SHARED_RX_READ_INDEX, &r); in __ipw2100_rx_process()
2686 read_register(priv->net_dev, IPW_MEM_HOST_SHARED_RX_WRITE_INDEX, &w); in __ipw2100_rx_process()
2699 packet = &priv->rx_buffers[i]; in __ipw2100_rx_process()
2703 pci_dma_sync_single_for_cpu(priv->pci_dev, packet->dma_addr, in __ipw2100_rx_process()
2707 if (unlikely(ipw2100_corruption_check(priv, i))) { in __ipw2100_rx_process()
2708 ipw2100_corruption_detected(priv, i); in __ipw2100_rx_process()
2723 priv->net_dev->name, frame_types[frame_type], in __ipw2100_rx_process()
2729 isr_rx_complete_command(priv, &u->rx_data.command); in __ipw2100_rx_process()
2733 isr_status_change(priv, u->rx_data.status); in __ipw2100_rx_process()
2739 if (priv->ieee->iw_mode == IW_MODE_MONITOR) { in __ipw2100_rx_process()
2740 isr_rx_monitor(priv, i, &stats); in __ipw2100_rx_process()
2748 libipw_rx_mgt(priv->ieee, in __ipw2100_rx_process()
2756 isr_rx(priv, i, &stats); in __ipw2100_rx_process()
2774 write_register(priv->net_dev, in __ipw2100_rx_process()
2818 static int __ipw2100_tx_process(struct ipw2100_priv *priv) in __ipw2100_tx_process() argument
2820 struct ipw2100_bd_queue *txq = &priv->tx_queue; in __ipw2100_tx_process()
2828 if (list_empty(&priv->fw_pend_list)) in __ipw2100_tx_process()
2831 element = priv->fw_pend_list.next; in __ipw2100_tx_process()
2854 priv->net_dev->name); in __ipw2100_tx_process()
2862 read_register(priv->net_dev, IPW_MEM_HOST_SHARED_TX_QUEUE_READ_INDEX, in __ipw2100_tx_process()
2864 read_register(priv->net_dev, IPW_MEM_HOST_SHARED_TX_QUEUE_WRITE_INDEX, in __ipw2100_tx_process()
2868 priv->net_dev->name); in __ipw2100_tx_process()
2898 DEC_STAT(&priv->fw_pend_stat); in __ipw2100_tx_process()
2927 priv->net_dev->name, txq->oldest, packet->index); in __ipw2100_tx_process()
2937 pci_unmap_single(priv->pci_dev, in __ipw2100_tx_process()
2945 list_add_tail(element, &priv->tx_free_list); in __ipw2100_tx_process()
2946 INC_STAT(&priv->tx_free_stat); in __ipw2100_tx_process()
2950 if (priv->status & STATUS_ASSOCIATED) in __ipw2100_tx_process()
2951 netif_wake_queue(priv->net_dev); in __ipw2100_tx_process()
2955 priv->net_dev->trans_start = jiffies; in __ipw2100_tx_process()
2964 priv->net_dev->name, txq->oldest, packet->index); in __ipw2100_tx_process()
2977 list_add_tail(element, &priv->msg_free_list); in __ipw2100_tx_process()
2978 INC_STAT(&priv->msg_free_stat); in __ipw2100_tx_process()
2986 SET_STAT(&priv->txq_stat, txq->available); in __ipw2100_tx_process()
2991 return (!list_empty(&priv->fw_pend_list)); in __ipw2100_tx_process()
2994 static inline void __ipw2100_tx_complete(struct ipw2100_priv *priv) in __ipw2100_tx_complete() argument
2998 while (__ipw2100_tx_process(priv) && i < 200) in __ipw2100_tx_complete()
3004 priv->net_dev->name, i); in __ipw2100_tx_complete()
3008 static void ipw2100_tx_send_commands(struct ipw2100_priv *priv) in ipw2100_tx_send_commands() argument
3012 struct ipw2100_bd_queue *txq = &priv->tx_queue; in ipw2100_tx_send_commands()
3016 while (!list_empty(&priv->msg_pend_list)) { in ipw2100_tx_send_commands()
3028 element = priv->msg_pend_list.next; in ipw2100_tx_send_commands()
3030 DEC_STAT(&priv->msg_pend_stat); in ipw2100_tx_send_commands()
3057 DEC_STAT(&priv->txq_stat); in ipw2100_tx_send_commands()
3059 list_add_tail(element, &priv->fw_pend_list); in ipw2100_tx_send_commands()
3060 INC_STAT(&priv->fw_pend_stat); in ipw2100_tx_send_commands()
3067 write_register(priv->net_dev, in ipw2100_tx_send_commands()
3077 static void ipw2100_tx_send_data(struct ipw2100_priv *priv) in ipw2100_tx_send_data() argument
3081 struct ipw2100_bd_queue *txq = &priv->tx_queue; in ipw2100_tx_send_data()
3088 while (!list_empty(&priv->tx_pend_list)) { in ipw2100_tx_send_data()
3095 element = priv->tx_pend_list.next; in ipw2100_tx_send_data()
3104 priv->net_dev->name); in ipw2100_tx_send_data()
3113 DEC_STAT(&priv->tx_pend_stat); in ipw2100_tx_send_data()
3123 if (priv->ieee->iw_mode == IW_MODE_INFRA) { in ipw2100_tx_send_data()
3128 } else if (priv->ieee->iw_mode == IW_MODE_ADHOC) { in ipw2100_tx_send_data()
3179 tbd->host_addr = pci_map_single(priv->pci_dev, in ipw2100_tx_send_data()
3191 pci_dma_sync_single_for_device(priv->pci_dev, in ipw2100_tx_send_data()
3201 SET_STAT(&priv->txq_stat, txq->available); in ipw2100_tx_send_data()
3203 list_add_tail(element, &priv->fw_pend_list); in ipw2100_tx_send_data()
3204 INC_STAT(&priv->fw_pend_stat); in ipw2100_tx_send_data()
3210 write_register(priv->net_dev, in ipw2100_tx_send_data()
3216 static void ipw2100_irq_tasklet(struct ipw2100_priv *priv) in ipw2100_irq_tasklet() argument
3218 struct net_device *dev = priv->net_dev; in ipw2100_irq_tasklet()
3222 spin_lock_irqsave(&priv->low_lock, flags); in ipw2100_irq_tasklet()
3223 ipw2100_disable_interrupts(priv); in ipw2100_irq_tasklet()
3230 priv->in_isr++; in ipw2100_irq_tasklet()
3231 priv->interrupts++; in ipw2100_irq_tasklet()
3242 priv->inta_other++; in ipw2100_irq_tasklet()
3245 read_nic_dword(dev, IPW_NIC_FATAL_ERROR, &priv->fatal_error); in ipw2100_irq_tasklet()
3247 priv->net_dev->name, priv->fatal_error); in ipw2100_irq_tasklet()
3249 read_nic_dword(dev, IPW_ERROR_ADDR(priv->fatal_error), &tmp); in ipw2100_irq_tasklet()
3251 priv->net_dev->name, tmp); in ipw2100_irq_tasklet()
3254 schedule_reset(priv); in ipw2100_irq_tasklet()
3260 priv->inta_other++; in ipw2100_irq_tasklet()
3267 priv->rx_interrupts++; in ipw2100_irq_tasklet()
3271 __ipw2100_rx_process(priv); in ipw2100_irq_tasklet()
3272 __ipw2100_tx_complete(priv); in ipw2100_irq_tasklet()
3278 priv->tx_interrupts++; in ipw2100_irq_tasklet()
3282 __ipw2100_tx_complete(priv); in ipw2100_irq_tasklet()
3283 ipw2100_tx_send_commands(priv); in ipw2100_irq_tasklet()
3284 ipw2100_tx_send_data(priv); in ipw2100_irq_tasklet()
3289 priv->inta_other++; in ipw2100_irq_tasklet()
3292 __ipw2100_tx_complete(priv); in ipw2100_irq_tasklet()
3297 priv->inta_other++; in ipw2100_irq_tasklet()
3303 priv->inta_other++; in ipw2100_irq_tasklet()
3318 priv->inta_other++; in ipw2100_irq_tasklet()
3324 priv->inta_other++; in ipw2100_irq_tasklet()
3329 priv->in_isr--; in ipw2100_irq_tasklet()
3330 ipw2100_enable_interrupts(priv); in ipw2100_irq_tasklet()
3332 spin_unlock_irqrestore(&priv->low_lock, flags); in ipw2100_irq_tasklet()
3339 struct ipw2100_priv *priv = data; in ipw2100_interrupt() local
3345 spin_lock(&priv->low_lock); in ipw2100_interrupt()
3351 if (!(priv->status & STATUS_INT_ENABLED)) { in ipw2100_interrupt()
3356 read_register(priv->net_dev, IPW_REG_INTA_MASK, &inta_mask); in ipw2100_interrupt()
3357 read_register(priv->net_dev, IPW_REG_INTA, &inta); in ipw2100_interrupt()
3376 ipw2100_disable_interrupts(priv); in ipw2100_interrupt()
3378 tasklet_schedule(&priv->irq_tasklet); in ipw2100_interrupt()
3379 spin_unlock(&priv->low_lock); in ipw2100_interrupt()
3383 spin_unlock(&priv->low_lock); in ipw2100_interrupt()
3390 struct ipw2100_priv *priv = libipw_priv(dev); in ipw2100_tx() local
3395 spin_lock_irqsave(&priv->low_lock, flags); in ipw2100_tx()
3397 if (!(priv->status & STATUS_ASSOCIATED)) { in ipw2100_tx()
3399 priv->net_dev->stats.tx_carrier_errors++; in ipw2100_tx()
3404 if (list_empty(&priv->tx_free_list)) in ipw2100_tx()
3407 element = priv->tx_free_list.next; in ipw2100_tx()
3418 DEC_STAT(&priv->tx_free_stat); in ipw2100_tx()
3420 list_add_tail(element, &priv->tx_pend_list); in ipw2100_tx()
3421 INC_STAT(&priv->tx_pend_stat); in ipw2100_tx()
3423 ipw2100_tx_send_data(priv); in ipw2100_tx()
3425 spin_unlock_irqrestore(&priv->low_lock, flags); in ipw2100_tx()
3430 spin_unlock_irqrestore(&priv->low_lock, flags); in ipw2100_tx()
3434 static int ipw2100_msg_allocate(struct ipw2100_priv *priv) in ipw2100_msg_allocate() argument
3440 priv->msg_buffers = in ipw2100_msg_allocate()
3443 if (!priv->msg_buffers) in ipw2100_msg_allocate()
3447 v = pci_zalloc_consistent(priv->pci_dev, in ipw2100_msg_allocate()
3453 "buffers.\n", priv->net_dev->name); in ipw2100_msg_allocate()
3458 priv->msg_buffers[i].type = COMMAND; in ipw2100_msg_allocate()
3459 priv->msg_buffers[i].info.c_struct.cmd = in ipw2100_msg_allocate()
3461 priv->msg_buffers[i].info.c_struct.cmd_phys = p; in ipw2100_msg_allocate()
3468 pci_free_consistent(priv->pci_dev, in ipw2100_msg_allocate()
3470 priv->msg_buffers[j].info.c_struct.cmd, in ipw2100_msg_allocate()
3471 priv->msg_buffers[j].info.c_struct. in ipw2100_msg_allocate()
3475 kfree(priv->msg_buffers); in ipw2100_msg_allocate()
3476 priv->msg_buffers = NULL; in ipw2100_msg_allocate()
3481 static int ipw2100_msg_initialize(struct ipw2100_priv *priv) in ipw2100_msg_initialize() argument
3485 INIT_LIST_HEAD(&priv->msg_free_list); in ipw2100_msg_initialize()
3486 INIT_LIST_HEAD(&priv->msg_pend_list); in ipw2100_msg_initialize()
3489 list_add_tail(&priv->msg_buffers[i].list, &priv->msg_free_list); in ipw2100_msg_initialize()
3490 SET_STAT(&priv->msg_free_stat, i); in ipw2100_msg_initialize()
3495 static void ipw2100_msg_free(struct ipw2100_priv *priv) in ipw2100_msg_free() argument
3499 if (!priv->msg_buffers) in ipw2100_msg_free()
3503 pci_free_consistent(priv->pci_dev, in ipw2100_msg_free()
3505 priv->msg_buffers[i].info.c_struct.cmd, in ipw2100_msg_free()
3506 priv->msg_buffers[i].info.c_struct. in ipw2100_msg_free()
3510 kfree(priv->msg_buffers); in ipw2100_msg_free()
3511 priv->msg_buffers = NULL; in ipw2100_msg_free()
3802 struct ipw2100_priv *priv = dev_get_drvdata(d); in show_registers() local
3803 struct net_device *dev = priv->net_dev; in show_registers()
3823 struct ipw2100_priv *priv = dev_get_drvdata(d); in show_hardware() local
3824 struct net_device *dev = priv->net_dev; in show_hardware()
3864 struct ipw2100_priv *priv = dev_get_drvdata(d); in show_memory() local
3865 struct net_device *dev = priv->net_dev; in show_memory()
3878 if (priv->snapshot[0]) in show_memory()
3886 if (priv->dump_raw) in show_memory()
3921 struct ipw2100_priv *priv = dev_get_drvdata(d); in store_memory() local
3922 struct net_device *dev = priv->net_dev; in store_memory()
3934 priv->dump_raw = 1; in store_memory()
3940 priv->dump_raw = 0; in store_memory()
3944 ipw2100_snapshot_free(priv); in store_memory()
3958 struct ipw2100_priv *priv = dev_get_drvdata(d); in show_ordinals() local
3964 if (priv->status & STATUS_RF_KILL_MASK) in show_ordinals()
3974 if (ipw2100_get_ordinal(priv, ord_data[loop].index, &val, in show_ordinals()
3994 struct ipw2100_priv *priv = dev_get_drvdata(d); in show_stats() local
3998 priv->interrupts, priv->tx_interrupts, in show_stats()
3999 priv->rx_interrupts, priv->inta_other); in show_stats()
4000 out += sprintf(out, "firmware resets: %d\n", priv->resets); in show_stats()
4001 out += sprintf(out, "firmware hangs: %d\n", priv->hangs); in show_stats()
4004 priv->snapshot[0] ? "YES" : "NO"); in show_stats()
4012 static int ipw2100_switch_mode(struct ipw2100_priv *priv, u32 mode) in ipw2100_switch_mode() argument
4016 if (mode == priv->ieee->iw_mode) in ipw2100_switch_mode()
4019 err = ipw2100_disable_adapter(priv); in ipw2100_switch_mode()
4022 priv->net_dev->name, err); in ipw2100_switch_mode()
4028 priv->net_dev->type = ARPHRD_ETHER; in ipw2100_switch_mode()
4031 priv->net_dev->type = ARPHRD_ETHER; in ipw2100_switch_mode()
4035 priv->last_mode = priv->ieee->iw_mode; in ipw2100_switch_mode()
4036 priv->net_dev->type = ARPHRD_IEEE80211_RADIOTAP; in ipw2100_switch_mode()
4041 priv->ieee->iw_mode = mode; in ipw2100_switch_mode()
4049 printk(KERN_INFO "%s: Resetting on mode change.\n", priv->net_dev->name); in ipw2100_switch_mode()
4050 priv->reset_backoff = 0; in ipw2100_switch_mode()
4051 schedule_reset(priv); in ipw2100_switch_mode()
4059 struct ipw2100_priv *priv = dev_get_drvdata(d); in show_internals() local
4062 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x) in show_internals()
4064 if (priv->status & STATUS_ASSOCIATED) in show_internals()
4066 get_seconds() - priv->connect_start); in show_internals()
4070 DUMP_VAR(ieee->crypt_info.crypt[priv->ieee->crypt_info.tx_keyidx], "p"); in show_internals()
4077 (unsigned long)priv->last_rtc); in show_internals()
4113 struct ipw2100_priv *priv = dev_get_drvdata(d); in show_bssinfo() local
4121 if (priv->status & STATUS_RF_KILL_MASK) in show_bssinfo()
4128 ret = ipw2100_get_ordinal(priv, IPW_ORD_STAT_ASSN_SSID, essid, &length); in show_bssinfo()
4134 ret = ipw2100_get_ordinal(priv, IPW_ORD_STAT_ASSN_AP_BSSID, in show_bssinfo()
4141 ret = ipw2100_get_ordinal(priv, IPW_ORD_OUR_FREQ, &chan, &length); in show_bssinfo()
4183 struct ipw2100_priv *priv = dev_get_drvdata(d); in show_fatal_error() local
4187 if (priv->fatal_error) in show_fatal_error()
4188 out += sprintf(out, "0x%08X\n", priv->fatal_error); in show_fatal_error()
4193 if (!priv->fatal_errors[(priv->fatal_index - i) % in show_fatal_error()
4198 priv->fatal_errors[(priv->fatal_index - i) % in show_fatal_error()
4209 struct ipw2100_priv *priv = dev_get_drvdata(d); in store_fatal_error() local
4210 schedule_reset(priv); in store_fatal_error()
4220 struct ipw2100_priv *priv = dev_get_drvdata(d); in show_scan_age() local
4221 return sprintf(buf, "%d\n", priv->ieee->scan_age); in show_scan_age()
4227 struct ipw2100_priv *priv = dev_get_drvdata(d); in store_scan_age() local
4228 struct net_device *dev = priv->net_dev; in store_scan_age()
4240 priv->ieee->scan_age = val; in store_scan_age()
4241 IPW_DEBUG_INFO("set scan_age = %u\n", priv->ieee->scan_age); in store_scan_age()
4257 struct ipw2100_priv *priv = dev_get_drvdata(d); in show_rf_kill() local
4258 int val = ((priv->status & STATUS_RF_KILL_SW) ? 0x1 : 0x0) | in show_rf_kill()
4259 (rf_kill_active(priv) ? 0x2 : 0x0); in show_rf_kill()
4263 static int ipw_radio_kill_sw(struct ipw2100_priv *priv, int disable_radio) in ipw_radio_kill_sw() argument
4266 (priv->status & STATUS_RF_KILL_SW ? 1 : 0)) in ipw_radio_kill_sw()
4272 mutex_lock(&priv->action_mutex); in ipw_radio_kill_sw()
4275 priv->status |= STATUS_RF_KILL_SW; in ipw_radio_kill_sw()
4276 ipw2100_down(priv); in ipw_radio_kill_sw()
4278 priv->status &= ~STATUS_RF_KILL_SW; in ipw_radio_kill_sw()
4279 if (rf_kill_active(priv)) { in ipw_radio_kill_sw()
4283 priv->stop_rf_kill = 0; in ipw_radio_kill_sw()
4284 mod_delayed_work(system_wq, &priv->rf_kill, in ipw_radio_kill_sw()
4287 schedule_reset(priv); in ipw_radio_kill_sw()
4290 mutex_unlock(&priv->action_mutex); in ipw_radio_kill_sw()
4297 struct ipw2100_priv *priv = dev_get_drvdata(d); in store_rf_kill() local
4298 ipw_radio_kill_sw(priv, buf[0] == '1'); in store_rf_kill()
4326 static int status_queue_allocate(struct ipw2100_priv *priv, int entries) in status_queue_allocate() argument
4328 struct ipw2100_status_queue *q = &priv->status_queue; in status_queue_allocate()
4333 q->drv = pci_zalloc_consistent(priv->pci_dev, q->size, &q->nic); in status_queue_allocate()
4344 static void status_queue_free(struct ipw2100_priv *priv) in status_queue_free() argument
4348 if (priv->status_queue.drv) { in status_queue_free()
4349 pci_free_consistent(priv->pci_dev, priv->status_queue.size, in status_queue_free()
4350 priv->status_queue.drv, in status_queue_free()
4351 priv->status_queue.nic); in status_queue_free()
4352 priv->status_queue.drv = NULL; in status_queue_free()
4358 static int bd_queue_allocate(struct ipw2100_priv *priv, in bd_queue_allocate() argument
4367 q->drv = pci_zalloc_consistent(priv->pci_dev, q->size, &q->nic); in bd_queue_allocate()
4379 static void bd_queue_free(struct ipw2100_priv *priv, struct ipw2100_bd_queue *q) in bd_queue_free() argument
4387 pci_free_consistent(priv->pci_dev, q->size, q->drv, q->nic); in bd_queue_free()
4394 static void bd_queue_initialize(struct ipw2100_priv *priv, in bd_queue_initialize() argument
4403 write_register(priv->net_dev, base, q->nic); in bd_queue_initialize()
4404 write_register(priv->net_dev, size, q->entries); in bd_queue_initialize()
4405 write_register(priv->net_dev, r, q->oldest); in bd_queue_initialize()
4406 write_register(priv->net_dev, w, q->next); in bd_queue_initialize()
4411 static void ipw2100_kill_works(struct ipw2100_priv *priv) in ipw2100_kill_works() argument
4413 priv->stop_rf_kill = 1; in ipw2100_kill_works()
4414 priv->stop_hang_check = 1; in ipw2100_kill_works()
4415 cancel_delayed_work_sync(&priv->reset_work); in ipw2100_kill_works()
4416 cancel_delayed_work_sync(&priv->security_work); in ipw2100_kill_works()
4417 cancel_delayed_work_sync(&priv->wx_event_work); in ipw2100_kill_works()
4418 cancel_delayed_work_sync(&priv->hang_check); in ipw2100_kill_works()
4419 cancel_delayed_work_sync(&priv->rf_kill); in ipw2100_kill_works()
4420 cancel_delayed_work_sync(&priv->scan_event); in ipw2100_kill_works()
4423 static int ipw2100_tx_allocate(struct ipw2100_priv *priv) in ipw2100_tx_allocate() argument
4431 err = bd_queue_allocate(priv, &priv->tx_queue, TX_QUEUE_LENGTH); in ipw2100_tx_allocate()
4434 priv->net_dev->name); in ipw2100_tx_allocate()
4438 priv->tx_buffers = kmalloc_array(TX_PENDED_QUEUE_LENGTH, in ipw2100_tx_allocate()
4441 if (!priv->tx_buffers) { in ipw2100_tx_allocate()
4442 bd_queue_free(priv, &priv->tx_queue); in ipw2100_tx_allocate()
4447 v = pci_alloc_consistent(priv->pci_dev, in ipw2100_tx_allocate()
4453 priv->net_dev->name); in ipw2100_tx_allocate()
4458 priv->tx_buffers[i].type = DATA; in ipw2100_tx_allocate()
4459 priv->tx_buffers[i].info.d_struct.data = in ipw2100_tx_allocate()
4461 priv->tx_buffers[i].info.d_struct.data_phys = p; in ipw2100_tx_allocate()
4462 priv->tx_buffers[i].info.d_struct.txb = NULL; in ipw2100_tx_allocate()
4469 pci_free_consistent(priv->pci_dev, in ipw2100_tx_allocate()
4471 priv->tx_buffers[j].info.d_struct.data, in ipw2100_tx_allocate()
4472 priv->tx_buffers[j].info.d_struct. in ipw2100_tx_allocate()
4476 kfree(priv->tx_buffers); in ipw2100_tx_allocate()
4477 priv->tx_buffers = NULL; in ipw2100_tx_allocate()
4482 static void ipw2100_tx_initialize(struct ipw2100_priv *priv) in ipw2100_tx_initialize() argument
4491 INIT_LIST_HEAD(&priv->fw_pend_list); in ipw2100_tx_initialize()
4492 INIT_STAT(&priv->fw_pend_stat); in ipw2100_tx_initialize()
4497 INIT_LIST_HEAD(&priv->tx_pend_list); in ipw2100_tx_initialize()
4498 INIT_LIST_HEAD(&priv->tx_free_list); in ipw2100_tx_initialize()
4499 INIT_STAT(&priv->tx_pend_stat); in ipw2100_tx_initialize()
4500 INIT_STAT(&priv->tx_free_stat); in ipw2100_tx_initialize()
4505 if (priv->tx_buffers[i].info.d_struct.txb) { in ipw2100_tx_initialize()
4506 libipw_txb_free(priv->tx_buffers[i].info.d_struct. in ipw2100_tx_initialize()
4508 priv->tx_buffers[i].info.d_struct.txb = NULL; in ipw2100_tx_initialize()
4511 list_add_tail(&priv->tx_buffers[i].list, &priv->tx_free_list); in ipw2100_tx_initialize()
4514 SET_STAT(&priv->tx_free_stat, i); in ipw2100_tx_initialize()
4516 priv->tx_queue.oldest = 0; in ipw2100_tx_initialize()
4517 priv->tx_queue.available = priv->tx_queue.entries; in ipw2100_tx_initialize()
4518 priv->tx_queue.next = 0; in ipw2100_tx_initialize()
4519 INIT_STAT(&priv->txq_stat); in ipw2100_tx_initialize()
4520 SET_STAT(&priv->txq_stat, priv->tx_queue.available); in ipw2100_tx_initialize()
4522 bd_queue_initialize(priv, &priv->tx_queue, in ipw2100_tx_initialize()
4532 static void ipw2100_tx_free(struct ipw2100_priv *priv) in ipw2100_tx_free() argument
4538 bd_queue_free(priv, &priv->tx_queue); in ipw2100_tx_free()
4540 if (!priv->tx_buffers) in ipw2100_tx_free()
4544 if (priv->tx_buffers[i].info.d_struct.txb) { in ipw2100_tx_free()
4545 libipw_txb_free(priv->tx_buffers[i].info.d_struct. in ipw2100_tx_free()
4547 priv->tx_buffers[i].info.d_struct.txb = NULL; in ipw2100_tx_free()
4549 if (priv->tx_buffers[i].info.d_struct.data) in ipw2100_tx_free()
4550 pci_free_consistent(priv->pci_dev, in ipw2100_tx_free()
4552 priv->tx_buffers[i].info.d_struct. in ipw2100_tx_free()
4554 priv->tx_buffers[i].info.d_struct. in ipw2100_tx_free()
4558 kfree(priv->tx_buffers); in ipw2100_tx_free()
4559 priv->tx_buffers = NULL; in ipw2100_tx_free()
4564 static int ipw2100_rx_allocate(struct ipw2100_priv *priv) in ipw2100_rx_allocate() argument
4570 err = bd_queue_allocate(priv, &priv->rx_queue, RX_QUEUE_LENGTH); in ipw2100_rx_allocate()
4576 err = status_queue_allocate(priv, RX_QUEUE_LENGTH); in ipw2100_rx_allocate()
4579 bd_queue_free(priv, &priv->rx_queue); in ipw2100_rx_allocate()
4586 priv->rx_buffers = kmalloc(RX_QUEUE_LENGTH * in ipw2100_rx_allocate()
4589 if (!priv->rx_buffers) { in ipw2100_rx_allocate()
4592 bd_queue_free(priv, &priv->rx_queue); in ipw2100_rx_allocate()
4594 status_queue_free(priv); in ipw2100_rx_allocate()
4600 struct ipw2100_rx_packet *packet = &priv->rx_buffers[i]; in ipw2100_rx_allocate()
4602 err = ipw2100_alloc_skb(priv, packet); in ipw2100_rx_allocate()
4609 priv->rx_queue.drv[i].host_addr = packet->dma_addr; in ipw2100_rx_allocate()
4610 priv->rx_queue.drv[i].buf_length = IPW_RX_NIC_BUFFER_LENGTH; in ipw2100_rx_allocate()
4611 priv->status_queue.drv[i].status_fields = 0; in ipw2100_rx_allocate()
4618 pci_unmap_single(priv->pci_dev, priv->rx_buffers[j].dma_addr, in ipw2100_rx_allocate()
4621 dev_kfree_skb(priv->rx_buffers[j].skb); in ipw2100_rx_allocate()
4624 kfree(priv->rx_buffers); in ipw2100_rx_allocate()
4625 priv->rx_buffers = NULL; in ipw2100_rx_allocate()
4627 bd_queue_free(priv, &priv->rx_queue); in ipw2100_rx_allocate()
4629 status_queue_free(priv); in ipw2100_rx_allocate()
4634 static void ipw2100_rx_initialize(struct ipw2100_priv *priv) in ipw2100_rx_initialize() argument
4638 priv->rx_queue.oldest = 0; in ipw2100_rx_initialize()
4639 priv->rx_queue.available = priv->rx_queue.entries - 1; in ipw2100_rx_initialize()
4640 priv->rx_queue.next = priv->rx_queue.entries - 1; in ipw2100_rx_initialize()
4642 INIT_STAT(&priv->rxq_stat); in ipw2100_rx_initialize()
4643 SET_STAT(&priv->rxq_stat, priv->rx_queue.available); in ipw2100_rx_initialize()
4645 bd_queue_initialize(priv, &priv->rx_queue, in ipw2100_rx_initialize()
4652 write_register(priv->net_dev, IPW_MEM_HOST_SHARED_RX_STATUS_BASE, in ipw2100_rx_initialize()
4653 priv->status_queue.nic); in ipw2100_rx_initialize()
4658 static void ipw2100_rx_free(struct ipw2100_priv *priv) in ipw2100_rx_free() argument
4664 bd_queue_free(priv, &priv->rx_queue); in ipw2100_rx_free()
4665 status_queue_free(priv); in ipw2100_rx_free()
4667 if (!priv->rx_buffers) in ipw2100_rx_free()
4671 if (priv->rx_buffers[i].rxp) { in ipw2100_rx_free()
4672 pci_unmap_single(priv->pci_dev, in ipw2100_rx_free()
4673 priv->rx_buffers[i].dma_addr, in ipw2100_rx_free()
4676 dev_kfree_skb(priv->rx_buffers[i].skb); in ipw2100_rx_free()
4680 kfree(priv->rx_buffers); in ipw2100_rx_free()
4681 priv->rx_buffers = NULL; in ipw2100_rx_free()
4686 static int ipw2100_read_mac_address(struct ipw2100_priv *priv) in ipw2100_read_mac_address() argument
4693 err = ipw2100_get_ordinal(priv, IPW_ORD_STAT_ADAPTER_MAC, addr, &length); in ipw2100_read_mac_address()
4699 memcpy(priv->net_dev->dev_addr, addr, ETH_ALEN); in ipw2100_read_mac_address()
4700 IPW_DEBUG_INFO("card MAC is %pM\n", priv->net_dev->dev_addr); in ipw2100_read_mac_address()
4711 static int ipw2100_set_mac_address(struct ipw2100_priv *priv, int batch_mode) in ipw2100_set_mac_address() argument
4724 if (priv->config & CFG_CUSTOM_MAC) { in ipw2100_set_mac_address()
4725 memcpy(cmd.host_command_parameters, priv->mac_addr, ETH_ALEN); in ipw2100_set_mac_address()
4726 memcpy(priv->net_dev->dev_addr, priv->mac_addr, ETH_ALEN); in ipw2100_set_mac_address()
4728 memcpy(cmd.host_command_parameters, priv->net_dev->dev_addr, in ipw2100_set_mac_address()
4731 err = ipw2100_hw_send_command(priv, &cmd); in ipw2100_set_mac_address()
4737 static int ipw2100_set_port_type(struct ipw2100_priv *priv, u32 port_type, in ipw2100_set_port_type() argument
4760 err = ipw2100_disable_adapter(priv); in ipw2100_set_port_type()
4764 priv->net_dev->name, err); in ipw2100_set_port_type()
4770 err = ipw2100_hw_send_command(priv, &cmd); in ipw2100_set_port_type()
4773 ipw2100_enable_adapter(priv); in ipw2100_set_port_type()
4778 static int ipw2100_set_channel(struct ipw2100_priv *priv, u32 channel, in ipw2100_set_channel() argument
4793 if (priv->ieee->iw_mode == IW_MODE_INFRA) in ipw2100_set_channel()
4801 err = ipw2100_disable_adapter(priv); in ipw2100_set_channel()
4806 err = ipw2100_hw_send_command(priv, &cmd); in ipw2100_set_channel()
4813 priv->config |= CFG_STATIC_CHANNEL; in ipw2100_set_channel()
4815 priv->config &= ~CFG_STATIC_CHANNEL; in ipw2100_set_channel()
4817 priv->channel = channel; in ipw2100_set_channel()
4820 err = ipw2100_enable_adapter(priv); in ipw2100_set_channel()
4828 static int ipw2100_system_config(struct ipw2100_priv *priv, int batch_mode) in ipw2100_system_config() argument
4841 err = ipw2100_disable_adapter(priv); in ipw2100_system_config()
4846 if (priv->ieee->iw_mode == IW_MODE_ADHOC) in ipw2100_system_config()
4852 if (!(priv->config & CFG_LONG_PREAMBLE)) in ipw2100_system_config()
4855 err = ipw2100_get_ordinal(priv, in ipw2100_system_config()
4867 err = ipw2100_hw_send_command(priv, &cmd); in ipw2100_system_config()
4878 ipw2100_hw_send_command(priv, &cmd); in ipw2100_system_config()
4881 err = ipw2100_enable_adapter(priv); in ipw2100_system_config()
4889 static int ipw2100_set_tx_rates(struct ipw2100_priv *priv, u32 rate, in ipw2100_set_tx_rates() argument
4902 err = ipw2100_disable_adapter(priv); in ipw2100_set_tx_rates()
4908 ipw2100_hw_send_command(priv, &cmd); in ipw2100_set_tx_rates()
4912 ipw2100_hw_send_command(priv, &cmd); in ipw2100_set_tx_rates()
4916 ipw2100_hw_send_command(priv, &cmd); in ipw2100_set_tx_rates()
4919 err = ipw2100_enable_adapter(priv); in ipw2100_set_tx_rates()
4924 priv->tx_rates = rate; in ipw2100_set_tx_rates()
4929 static int ipw2100_set_power_mode(struct ipw2100_priv *priv, int power_level) in ipw2100_set_power_mode() argument
4940 err = ipw2100_hw_send_command(priv, &cmd); in ipw2100_set_power_mode()
4945 priv->power_mode = IPW_POWER_LEVEL(priv->power_mode); in ipw2100_set_power_mode()
4947 priv->power_mode = IPW_POWER_ENABLED | power_level; in ipw2100_set_power_mode()
4950 if (priv->port_type == IBSS && priv->adhoc_power != DFTL_IBSS_TX_POWER) { in ipw2100_set_power_mode()
4953 cmd.host_command_parameters[0] = (u32) priv->adhoc_power; in ipw2100_set_power_mode()
4955 err = ipw2100_hw_send_command(priv, &cmd); in ipw2100_set_power_mode()
4964 static int ipw2100_set_rts_threshold(struct ipw2100_priv *priv, u32 threshold) in ipw2100_set_rts_threshold() argument
4978 err = ipw2100_hw_send_command(priv, &cmd); in ipw2100_set_rts_threshold()
4982 priv->rts_threshold = threshold; in ipw2100_set_rts_threshold()
4988 int ipw2100_set_fragmentation_threshold(struct ipw2100_priv *priv,
5000 err = ipw2100_disable_adapter(priv);
5016 err = ipw2100_hw_send_command(priv, &cmd);
5019 ipw2100_enable_adapter(priv);
5022 priv->frag_threshold = threshold;
5028 static int ipw2100_set_short_retry(struct ipw2100_priv *priv, u32 retry) in ipw2100_set_short_retry() argument
5039 err = ipw2100_hw_send_command(priv, &cmd); in ipw2100_set_short_retry()
5043 priv->short_retry_limit = retry; in ipw2100_set_short_retry()
5048 static int ipw2100_set_long_retry(struct ipw2100_priv *priv, u32 retry) in ipw2100_set_long_retry() argument
5059 err = ipw2100_hw_send_command(priv, &cmd); in ipw2100_set_long_retry()
5063 priv->long_retry_limit = retry; in ipw2100_set_long_retry()
5068 static int ipw2100_set_mandatory_bssid(struct ipw2100_priv *priv, u8 * bssid, in ipw2100_set_mandatory_bssid() argument
5089 err = ipw2100_disable_adapter(priv); in ipw2100_set_mandatory_bssid()
5094 err = ipw2100_hw_send_command(priv, &cmd); in ipw2100_set_mandatory_bssid()
5097 ipw2100_enable_adapter(priv); in ipw2100_set_mandatory_bssid()
5102 static int ipw2100_disassociate_bssid(struct ipw2100_priv *priv) in ipw2100_disassociate_bssid() argument
5119 memcpy(cmd.host_command_parameters, priv->bssid, ETH_ALEN); in ipw2100_disassociate_bssid()
5121 err = ipw2100_hw_send_command(priv, &cmd); in ipw2100_disassociate_bssid()
5130 static int ipw2100_set_wpa_ie(struct ipw2100_priv *priv, in ipw2100_set_wpa_ie() argument
5144 err = ipw2100_disable_adapter(priv); in ipw2100_set_wpa_ie()
5152 err = ipw2100_hw_send_command(priv, &cmd); in ipw2100_set_wpa_ie()
5155 if (ipw2100_enable_adapter(priv)) in ipw2100_set_wpa_ie()
5170 static int ipw2100_set_security_information(struct ipw2100_priv *priv, in ipw2100_set_security_information() argument
5223 err = ipw2100_disable_adapter(priv); in ipw2100_set_security_information()
5228 err = ipw2100_hw_send_command(priv, &cmd); in ipw2100_set_security_information()
5231 ipw2100_enable_adapter(priv); in ipw2100_set_security_information()
5236 static int ipw2100_set_tx_power(struct ipw2100_priv *priv, u32 tx_power) in ipw2100_set_tx_power() argument
5252 if (priv->ieee->iw_mode == IW_MODE_ADHOC) in ipw2100_set_tx_power()
5253 err = ipw2100_hw_send_command(priv, &cmd); in ipw2100_set_tx_power()
5255 priv->tx_power = tx_power; in ipw2100_set_tx_power()
5260 static int ipw2100_set_ibss_beacon_interval(struct ipw2100_priv *priv, in ipw2100_set_ibss_beacon_interval() argument
5274 if (priv->ieee->iw_mode == IW_MODE_ADHOC) { in ipw2100_set_ibss_beacon_interval()
5276 err = ipw2100_disable_adapter(priv); in ipw2100_set_ibss_beacon_interval()
5281 ipw2100_hw_send_command(priv, &cmd); in ipw2100_set_ibss_beacon_interval()
5284 err = ipw2100_enable_adapter(priv); in ipw2100_set_ibss_beacon_interval()
5295 static void ipw2100_queues_initialize(struct ipw2100_priv *priv) in ipw2100_queues_initialize() argument
5297 ipw2100_tx_initialize(priv); in ipw2100_queues_initialize()
5298 ipw2100_rx_initialize(priv); in ipw2100_queues_initialize()
5299 ipw2100_msg_initialize(priv); in ipw2100_queues_initialize()
5302 static void ipw2100_queues_free(struct ipw2100_priv *priv) in ipw2100_queues_free() argument
5304 ipw2100_tx_free(priv); in ipw2100_queues_free()
5305 ipw2100_rx_free(priv); in ipw2100_queues_free()
5306 ipw2100_msg_free(priv); in ipw2100_queues_free()
5309 static int ipw2100_queues_allocate(struct ipw2100_priv *priv) in ipw2100_queues_allocate() argument
5311 if (ipw2100_tx_allocate(priv) || in ipw2100_queues_allocate()
5312 ipw2100_rx_allocate(priv) || ipw2100_msg_allocate(priv)) in ipw2100_queues_allocate()
5318 ipw2100_tx_free(priv); in ipw2100_queues_allocate()
5319 ipw2100_rx_free(priv); in ipw2100_queues_allocate()
5320 ipw2100_msg_free(priv); in ipw2100_queues_allocate()
5326 static int ipw2100_set_wep_flags(struct ipw2100_priv *priv, u32 flags, in ipw2100_set_wep_flags() argument
5341 err = ipw2100_disable_adapter(priv); in ipw2100_set_wep_flags()
5345 priv->net_dev->name, err); in ipw2100_set_wep_flags()
5351 err = ipw2100_hw_send_command(priv, &cmd); in ipw2100_set_wep_flags()
5354 ipw2100_enable_adapter(priv); in ipw2100_set_wep_flags()
5386 static int ipw2100_set_key(struct ipw2100_priv *priv, in ipw2100_set_key() argument
5416 priv->net_dev->name, wep_key->idx); in ipw2100_set_key()
5419 priv->net_dev->name, wep_key->idx, wep_key->len, in ipw2100_set_key()
5424 priv->net_dev->name, wep_key->idx, wep_key->len, in ipw2100_set_key()
5428 err = ipw2100_disable_adapter(priv); in ipw2100_set_key()
5433 priv->net_dev->name, err); in ipw2100_set_key()
5439 err = ipw2100_hw_send_command(priv, &cmd); in ipw2100_set_key()
5442 int err2 = ipw2100_enable_adapter(priv); in ipw2100_set_key()
5449 static int ipw2100_set_key_index(struct ipw2100_priv *priv, in ipw2100_set_key_index() argument
5466 err = ipw2100_disable_adapter(priv); in ipw2100_set_key_index()
5470 priv->net_dev->name, err); in ipw2100_set_key_index()
5476 err = ipw2100_hw_send_command(priv, &cmd); in ipw2100_set_key_index()
5479 ipw2100_enable_adapter(priv); in ipw2100_set_key_index()
5484 static int ipw2100_configure_security(struct ipw2100_priv *priv, int batch_mode) in ipw2100_configure_security() argument
5488 if (!(priv->status & STATUS_RUNNING)) in ipw2100_configure_security()
5492 err = ipw2100_disable_adapter(priv); in ipw2100_configure_security()
5497 if (!priv->ieee->sec.enabled) { in ipw2100_configure_security()
5499 ipw2100_set_security_information(priv, IPW_AUTH_OPEN, in ipw2100_configure_security()
5503 if (priv->ieee->sec.flags & SEC_AUTH_MODE) { in ipw2100_configure_security()
5504 if (priv->ieee->sec.auth_mode == WLAN_AUTH_SHARED_KEY) in ipw2100_configure_security()
5506 else if (priv->ieee->sec.auth_mode == WLAN_AUTH_LEAP) in ipw2100_configure_security()
5511 if (priv->ieee->sec.flags & SEC_LEVEL) in ipw2100_configure_security()
5512 sec_level = priv->ieee->sec.level; in ipw2100_configure_security()
5515 if (priv->ieee->sec.flags & SEC_UNICAST_GROUP) in ipw2100_configure_security()
5516 use_group = priv->ieee->sec.unicast_uses_group; in ipw2100_configure_security()
5519 ipw2100_set_security_information(priv, auth_mode, sec_level, in ipw2100_configure_security()
5526 if (priv->ieee->sec.enabled) { in ipw2100_configure_security()
5528 if (!(priv->ieee->sec.flags & (1 << i))) { in ipw2100_configure_security()
5529 memset(priv->ieee->sec.keys[i], 0, WEP_KEY_LEN); in ipw2100_configure_security()
5530 priv->ieee->sec.key_sizes[i] = 0; in ipw2100_configure_security()
5532 err = ipw2100_set_key(priv, i, in ipw2100_configure_security()
5533 priv->ieee->sec.keys[i], in ipw2100_configure_security()
5534 priv->ieee->sec. in ipw2100_configure_security()
5541 ipw2100_set_key_index(priv, priv->ieee->crypt_info.tx_keyidx, 1); in ipw2100_configure_security()
5547 ipw2100_set_wep_flags(priv, in ipw2100_configure_security()
5548 priv->ieee->sec. in ipw2100_configure_security()
5553 priv->status &= ~STATUS_SECURITY_UPDATED; in ipw2100_configure_security()
5557 ipw2100_enable_adapter(priv); in ipw2100_configure_security()
5564 struct ipw2100_priv *priv = in ipw2100_security_work() local
5570 if (!(priv->status & STATUS_ASSOCIATED) && in ipw2100_security_work()
5571 priv->status & STATUS_SECURITY_UPDATED) in ipw2100_security_work()
5572 ipw2100_configure_security(priv, 0); in ipw2100_security_work()
5578 struct ipw2100_priv *priv = libipw_priv(dev); in shim__set_security() local
5581 mutex_lock(&priv->action_mutex); in shim__set_security()
5582 if (!(priv->status & STATUS_INITIALIZED)) in shim__set_security()
5587 priv->ieee->sec.key_sizes[i] = sec->key_sizes[i]; in shim__set_security()
5589 priv->ieee->sec.flags &= ~(1 << i); in shim__set_security()
5591 memcpy(priv->ieee->sec.keys[i], sec->keys[i], in shim__set_security()
5594 priv->ieee->sec.flags |= (1 << i); in shim__set_security()
5595 priv->status |= STATUS_SECURITY_UPDATED; in shim__set_security()
5597 priv->ieee->sec.flags &= ~(1 << i); in shim__set_security()
5602 priv->ieee->sec.active_key != sec->active_key) { in shim__set_security()
5604 priv->ieee->sec.active_key = sec->active_key; in shim__set_security()
5605 priv->ieee->sec.flags |= SEC_ACTIVE_KEY; in shim__set_security()
5607 priv->ieee->sec.flags &= ~SEC_ACTIVE_KEY; in shim__set_security()
5609 priv->status |= STATUS_SECURITY_UPDATED; in shim__set_security()
5613 (priv->ieee->sec.auth_mode != sec->auth_mode)) { in shim__set_security()
5614 priv->ieee->sec.auth_mode = sec->auth_mode; in shim__set_security()
5615 priv->ieee->sec.flags |= SEC_AUTH_MODE; in shim__set_security()
5616 priv->status |= STATUS_SECURITY_UPDATED; in shim__set_security()
5619 if (sec->flags & SEC_ENABLED && priv->ieee->sec.enabled != sec->enabled) { in shim__set_security()
5620 priv->ieee->sec.flags |= SEC_ENABLED; in shim__set_security()
5621 priv->ieee->sec.enabled = sec->enabled; in shim__set_security()
5622 priv->status |= STATUS_SECURITY_UPDATED; in shim__set_security()
5627 priv->ieee->sec.encrypt = sec->encrypt; in shim__set_security()
5629 if (sec->flags & SEC_LEVEL && priv->ieee->sec.level != sec->level) { in shim__set_security()
5630 priv->ieee->sec.level = sec->level; in shim__set_security()
5631 priv->ieee->sec.flags |= SEC_LEVEL; in shim__set_security()
5632 priv->status |= STATUS_SECURITY_UPDATED; in shim__set_security()
5636 priv->ieee->sec.flags & (1 << 8) ? '1' : '0', in shim__set_security()
5637 priv->ieee->sec.flags & (1 << 7) ? '1' : '0', in shim__set_security()
5638 priv->ieee->sec.flags & (1 << 6) ? '1' : '0', in shim__set_security()
5639 priv->ieee->sec.flags & (1 << 5) ? '1' : '0', in shim__set_security()
5640 priv->ieee->sec.flags & (1 << 4) ? '1' : '0', in shim__set_security()
5641 priv->ieee->sec.flags & (1 << 3) ? '1' : '0', in shim__set_security()
5642 priv->ieee->sec.flags & (1 << 2) ? '1' : '0', in shim__set_security()
5643 priv->ieee->sec.flags & (1 << 1) ? '1' : '0', in shim__set_security()
5644 priv->ieee->sec.flags & (1 << 0) ? '1' : '0'); in shim__set_security()
5651 if (!(priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING))) in shim__set_security()
5652 ipw2100_configure_security(priv, 0); in shim__set_security()
5654 mutex_unlock(&priv->action_mutex); in shim__set_security()
5657 static int ipw2100_adapter_setup(struct ipw2100_priv *priv) in ipw2100_adapter_setup() argument
5665 err = ipw2100_disable_adapter(priv); in ipw2100_adapter_setup()
5669 if (priv->ieee->iw_mode == IW_MODE_MONITOR) { in ipw2100_adapter_setup()
5670 err = ipw2100_set_channel(priv, priv->channel, batch_mode); in ipw2100_adapter_setup()
5680 err = ipw2100_read_mac_address(priv); in ipw2100_adapter_setup()
5684 err = ipw2100_set_mac_address(priv, batch_mode); in ipw2100_adapter_setup()
5688 err = ipw2100_set_port_type(priv, priv->ieee->iw_mode, batch_mode); in ipw2100_adapter_setup()
5692 if (priv->ieee->iw_mode == IW_MODE_ADHOC) { in ipw2100_adapter_setup()
5693 err = ipw2100_set_channel(priv, priv->channel, batch_mode); in ipw2100_adapter_setup()
5698 err = ipw2100_system_config(priv, batch_mode); in ipw2100_adapter_setup()
5702 err = ipw2100_set_tx_rates(priv, priv->tx_rates, batch_mode); in ipw2100_adapter_setup()
5707 err = ipw2100_set_power_mode(priv, IPW_POWER_MODE_CAM); in ipw2100_adapter_setup()
5711 err = ipw2100_set_rts_threshold(priv, priv->rts_threshold); in ipw2100_adapter_setup()
5715 if (priv->config & CFG_STATIC_BSSID) in ipw2100_adapter_setup()
5716 bssid = priv->bssid; in ipw2100_adapter_setup()
5719 err = ipw2100_set_mandatory_bssid(priv, bssid, batch_mode); in ipw2100_adapter_setup()
5723 if (priv->config & CFG_STATIC_ESSID) in ipw2100_adapter_setup()
5724 err = ipw2100_set_essid(priv, priv->essid, priv->essid_len, in ipw2100_adapter_setup()
5727 err = ipw2100_set_essid(priv, NULL, 0, batch_mode); in ipw2100_adapter_setup()
5731 err = ipw2100_configure_security(priv, batch_mode); in ipw2100_adapter_setup()
5735 if (priv->ieee->iw_mode == IW_MODE_ADHOC) { in ipw2100_adapter_setup()
5737 ipw2100_set_ibss_beacon_interval(priv, in ipw2100_adapter_setup()
5738 priv->beacon_interval, in ipw2100_adapter_setup()
5743 err = ipw2100_set_tx_power(priv, priv->tx_power); in ipw2100_adapter_setup()
5771 struct ipw2100_priv *priv = libipw_priv(dev); in ipw2100_set_address() local
5778 mutex_lock(&priv->action_mutex); in ipw2100_set_address()
5780 priv->config |= CFG_CUSTOM_MAC; in ipw2100_set_address()
5781 memcpy(priv->mac_addr, addr->sa_data, ETH_ALEN); in ipw2100_set_address()
5783 err = ipw2100_set_mac_address(priv, 0); in ipw2100_set_address()
5787 priv->reset_backoff = 0; in ipw2100_set_address()
5788 mutex_unlock(&priv->action_mutex); in ipw2100_set_address()
5789 ipw2100_reset_adapter(&priv->reset_work.work); in ipw2100_set_address()
5793 mutex_unlock(&priv->action_mutex); in ipw2100_set_address()
5799 struct ipw2100_priv *priv = libipw_priv(dev); in ipw2100_open() local
5803 spin_lock_irqsave(&priv->low_lock, flags); in ipw2100_open()
5804 if (priv->status & STATUS_ASSOCIATED) { in ipw2100_open()
5808 spin_unlock_irqrestore(&priv->low_lock, flags); in ipw2100_open()
5815 struct ipw2100_priv *priv = libipw_priv(dev); in ipw2100_close() local
5822 spin_lock_irqsave(&priv->low_lock, flags); in ipw2100_close()
5824 if (priv->status & STATUS_ASSOCIATED) in ipw2100_close()
5829 while (!list_empty(&priv->tx_pend_list)) { in ipw2100_close()
5830 element = priv->tx_pend_list.next; in ipw2100_close()
5834 DEC_STAT(&priv->tx_pend_stat); in ipw2100_close()
5839 list_add_tail(element, &priv->tx_free_list); in ipw2100_close()
5840 INC_STAT(&priv->tx_free_stat); in ipw2100_close()
5842 spin_unlock_irqrestore(&priv->low_lock, flags); in ipw2100_close()
5854 struct ipw2100_priv *priv = libipw_priv(dev); in ipw2100_tx_timeout() local
5859 if (priv->ieee->iw_mode == IW_MODE_MONITOR) in ipw2100_tx_timeout()
5865 schedule_reset(priv); in ipw2100_tx_timeout()
5868 static int ipw2100_wpa_enable(struct ipw2100_priv *priv, int value) in ipw2100_wpa_enable() argument
5872 priv->ieee->wpa_enabled = value; in ipw2100_wpa_enable()
5876 static int ipw2100_wpa_set_auth_algs(struct ipw2100_priv *priv, int value) in ipw2100_wpa_set_auth_algs() argument
5879 struct libipw_device *ieee = priv->ieee; in ipw2100_wpa_set_auth_algs()
5905 static void ipw2100_wpa_assoc_frame(struct ipw2100_priv *priv, in ipw2100_wpa_assoc_frame() argument
5918 ipw2100_wpa_enable(priv, 1); in ipw2100_wpa_assoc_frame()
5919 ipw2100_set_wpa_ie(priv, &frame, 0); in ipw2100_wpa_assoc_frame()
5925 struct ipw2100_priv *priv = libipw_priv(dev); in ipw_ethtool_get_drvinfo() local
5931 ipw2100_get_fwversion(priv, fw_ver, sizeof(fw_ver)); in ipw_ethtool_get_drvinfo()
5932 ipw2100_get_ucodeversion(priv, ucode_ver, sizeof(ucode_ver)); in ipw_ethtool_get_drvinfo()
5935 fw_ver, priv->eeprom_version, ucode_ver); in ipw_ethtool_get_drvinfo()
5937 strlcpy(info->bus_info, pci_name(priv->pci_dev), in ipw_ethtool_get_drvinfo()
5943 struct ipw2100_priv *priv = libipw_priv(dev); in ipw2100_ethtool_get_link() local
5944 return (priv->status & STATUS_ASSOCIATED) ? 1 : 0; in ipw2100_ethtool_get_link()
5954 struct ipw2100_priv *priv = in ipw2100_hang_check() local
5961 spin_lock_irqsave(&priv->low_lock, flags); in ipw2100_hang_check()
5963 if (priv->fatal_error != 0) { in ipw2100_hang_check()
5966 priv->net_dev->name); in ipw2100_hang_check()
5969 } else if (ipw2100_get_ordinal(priv, IPW_ORD_RTC_TIME, &rtc, &len) || in ipw2100_hang_check()
5970 (rtc == priv->last_rtc)) { in ipw2100_hang_check()
5973 priv->net_dev->name); in ipw2100_hang_check()
5980 priv->stop_hang_check = 1; in ipw2100_hang_check()
5981 priv->hangs++; in ipw2100_hang_check()
5984 schedule_reset(priv); in ipw2100_hang_check()
5987 priv->last_rtc = rtc; in ipw2100_hang_check()
5989 if (!priv->stop_hang_check) in ipw2100_hang_check()
5990 schedule_delayed_work(&priv->hang_check, HZ / 2); in ipw2100_hang_check()
5992 spin_unlock_irqrestore(&priv->low_lock, flags); in ipw2100_hang_check()
5997 struct ipw2100_priv *priv = in ipw2100_rf_kill() local
6001 spin_lock_irqsave(&priv->low_lock, flags); in ipw2100_rf_kill()
6003 if (rf_kill_active(priv)) { in ipw2100_rf_kill()
6005 if (!priv->stop_rf_kill) in ipw2100_rf_kill()
6006 schedule_delayed_work(&priv->rf_kill, in ipw2100_rf_kill()
6013 if (!(priv->status & STATUS_RF_KILL_MASK)) { in ipw2100_rf_kill()
6016 schedule_reset(priv); in ipw2100_rf_kill()
6022 spin_unlock_irqrestore(&priv->low_lock, flags); in ipw2100_rf_kill()
6025 static void ipw2100_irq_tasklet(struct ipw2100_priv *priv);
6042 struct ipw2100_priv *priv; in ipw2100_alloc_device() local
6048 priv = libipw_priv(dev); in ipw2100_alloc_device()
6049 priv->ieee = netdev_priv(dev); in ipw2100_alloc_device()
6050 priv->pci_dev = pci_dev; in ipw2100_alloc_device()
6051 priv->net_dev = dev; in ipw2100_alloc_device()
6052 priv->ioaddr = ioaddr; in ipw2100_alloc_device()
6054 priv->ieee->hard_start_xmit = ipw2100_tx; in ipw2100_alloc_device()
6055 priv->ieee->set_security = shim__set_security; in ipw2100_alloc_device()
6057 priv->ieee->perfect_rssi = -20; in ipw2100_alloc_device()
6058 priv->ieee->worst_rssi = -85; in ipw2100_alloc_device()
6063 priv->wireless_data.libipw = priv->ieee; in ipw2100_alloc_device()
6064 dev->wireless_data = &priv->wireless_data; in ipw2100_alloc_device()
6078 priv->power_mode = IPW_POWER_AUTO; in ipw2100_alloc_device()
6081 priv->config |= CFG_CRC_CHECK; in ipw2100_alloc_device()
6083 priv->ieee->wpa_enabled = 0; in ipw2100_alloc_device()
6084 priv->ieee->drop_unencrypted = 0; in ipw2100_alloc_device()
6085 priv->ieee->privacy_invoked = 0; in ipw2100_alloc_device()
6086 priv->ieee->ieee802_1x = 1; in ipw2100_alloc_device()
6091 priv->ieee->iw_mode = IW_MODE_ADHOC; in ipw2100_alloc_device()
6095 priv->ieee->iw_mode = IW_MODE_MONITOR; in ipw2100_alloc_device()
6100 priv->ieee->iw_mode = IW_MODE_INFRA; in ipw2100_alloc_device()
6105 priv->status |= STATUS_RF_KILL_SW; in ipw2100_alloc_device()
6109 priv->config |= CFG_STATIC_CHANNEL; in ipw2100_alloc_device()
6110 priv->channel = channel; in ipw2100_alloc_device()
6114 priv->config |= CFG_ASSOCIATE; in ipw2100_alloc_device()
6116 priv->beacon_interval = DEFAULT_BEACON_INTERVAL; in ipw2100_alloc_device()
6117 priv->short_retry_limit = DEFAULT_SHORT_RETRY_LIMIT; in ipw2100_alloc_device()
6118 priv->long_retry_limit = DEFAULT_LONG_RETRY_LIMIT; in ipw2100_alloc_device()
6119 priv->rts_threshold = DEFAULT_RTS_THRESHOLD | RTS_DISABLED; in ipw2100_alloc_device()
6120 priv->frag_threshold = DEFAULT_FTS | FRAG_DISABLED; in ipw2100_alloc_device()
6121 priv->tx_power = IPW_TX_POWER_DEFAULT; in ipw2100_alloc_device()
6122 priv->tx_rates = DEFAULT_TX_RATES; in ipw2100_alloc_device()
6124 strcpy(priv->nick, "ipw2100"); in ipw2100_alloc_device()
6126 spin_lock_init(&priv->low_lock); in ipw2100_alloc_device()
6127 mutex_init(&priv->action_mutex); in ipw2100_alloc_device()
6128 mutex_init(&priv->adapter_mutex); in ipw2100_alloc_device()
6130 init_waitqueue_head(&priv->wait_command_queue); in ipw2100_alloc_device()
6134 INIT_LIST_HEAD(&priv->msg_free_list); in ipw2100_alloc_device()
6135 INIT_LIST_HEAD(&priv->msg_pend_list); in ipw2100_alloc_device()
6136 INIT_STAT(&priv->msg_free_stat); in ipw2100_alloc_device()
6137 INIT_STAT(&priv->msg_pend_stat); in ipw2100_alloc_device()
6139 INIT_LIST_HEAD(&priv->tx_free_list); in ipw2100_alloc_device()
6140 INIT_LIST_HEAD(&priv->tx_pend_list); in ipw2100_alloc_device()
6141 INIT_STAT(&priv->tx_free_stat); in ipw2100_alloc_device()
6142 INIT_STAT(&priv->tx_pend_stat); in ipw2100_alloc_device()
6144 INIT_LIST_HEAD(&priv->fw_pend_list); in ipw2100_alloc_device()
6145 INIT_STAT(&priv->fw_pend_stat); in ipw2100_alloc_device()
6147 INIT_DELAYED_WORK(&priv->reset_work, ipw2100_reset_adapter); in ipw2100_alloc_device()
6148 INIT_DELAYED_WORK(&priv->security_work, ipw2100_security_work); in ipw2100_alloc_device()
6149 INIT_DELAYED_WORK(&priv->wx_event_work, ipw2100_wx_event_work); in ipw2100_alloc_device()
6150 INIT_DELAYED_WORK(&priv->hang_check, ipw2100_hang_check); in ipw2100_alloc_device()
6151 INIT_DELAYED_WORK(&priv->rf_kill, ipw2100_rf_kill); in ipw2100_alloc_device()
6152 INIT_DELAYED_WORK(&priv->scan_event, ipw2100_scan_event); in ipw2100_alloc_device()
6154 tasklet_init(&priv->irq_tasklet, (void (*)(unsigned long)) in ipw2100_alloc_device()
6155 ipw2100_irq_tasklet, (unsigned long)priv); in ipw2100_alloc_device()
6158 priv->stop_rf_kill = 1; in ipw2100_alloc_device()
6159 priv->stop_hang_check = 1; in ipw2100_alloc_device()
6169 struct ipw2100_priv *priv = NULL; in ipw2100_pci_init_one() local
6207 priv = libipw_priv(dev); in ipw2100_pci_init_one()
6210 pci_set_drvdata(pci_dev, priv); in ipw2100_pci_init_one()
6244 priv->status |= STATUS_INT_ENABLED; in ipw2100_pci_init_one()
6245 ipw2100_disable_interrupts(priv); in ipw2100_pci_init_one()
6248 if (ipw2100_queues_allocate(priv)) { in ipw2100_pci_init_one()
6254 ipw2100_queues_initialize(priv); in ipw2100_pci_init_one()
6257 ipw2100_interrupt, IRQF_SHARED, dev->name, priv); in ipw2100_pci_init_one()
6270 err = ipw2100_up(priv, 1); in ipw2100_pci_init_one()
6292 mutex_lock(&priv->action_mutex); in ipw2100_pci_init_one()
6303 if (!(priv->status & STATUS_RF_KILL_MASK)) { in ipw2100_pci_init_one()
6305 if (ipw2100_enable_adapter(priv)) { in ipw2100_pci_init_one()
6308 priv->net_dev->name); in ipw2100_pci_init_one()
6309 ipw2100_hw_stop_adapter(priv); in ipw2100_pci_init_one()
6315 ipw2100_set_scan_options(priv); in ipw2100_pci_init_one()
6316 ipw2100_start_scan(priv); in ipw2100_pci_init_one()
6321 priv->status |= STATUS_INITIALIZED; in ipw2100_pci_init_one()
6323 mutex_unlock(&priv->action_mutex); in ipw2100_pci_init_one()
6328 mutex_unlock(&priv->action_mutex); in ipw2100_pci_init_one()
6335 wiphy_unregister(priv->ieee->wdev.wiphy); in ipw2100_pci_init_one()
6336 kfree(priv->ieee->bg_band.channels); in ipw2100_pci_init_one()
6339 ipw2100_hw_stop_adapter(priv); in ipw2100_pci_init_one()
6341 ipw2100_disable_interrupts(priv); in ipw2100_pci_init_one()
6344 free_irq(dev->irq, priv); in ipw2100_pci_init_one()
6346 ipw2100_kill_works(priv); in ipw2100_pci_init_one()
6349 ipw2100_queues_free(priv); in ipw2100_pci_init_one()
6365 struct ipw2100_priv *priv = pci_get_drvdata(pci_dev); in ipw2100_pci_remove_one() local
6366 struct net_device *dev = priv->net_dev; in ipw2100_pci_remove_one()
6368 mutex_lock(&priv->action_mutex); in ipw2100_pci_remove_one()
6370 priv->status &= ~STATUS_INITIALIZED; in ipw2100_pci_remove_one()
6376 ipw2100_release_firmware(priv, &ipw2100_firmware); in ipw2100_pci_remove_one()
6379 ipw2100_down(priv); in ipw2100_pci_remove_one()
6383 mutex_unlock(&priv->action_mutex); in ipw2100_pci_remove_one()
6391 ipw2100_kill_works(priv); in ipw2100_pci_remove_one()
6393 ipw2100_queues_free(priv); in ipw2100_pci_remove_one()
6396 ipw2100_snapshot_free(priv); in ipw2100_pci_remove_one()
6398 free_irq(dev->irq, priv); in ipw2100_pci_remove_one()
6400 pci_iounmap(pci_dev, priv->ioaddr); in ipw2100_pci_remove_one()
6403 wiphy_unregister(priv->ieee->wdev.wiphy); in ipw2100_pci_remove_one()
6404 kfree(priv->ieee->bg_band.channels); in ipw2100_pci_remove_one()
6416 struct ipw2100_priv *priv = pci_get_drvdata(pci_dev); in ipw2100_suspend() local
6417 struct net_device *dev = priv->net_dev; in ipw2100_suspend()
6421 mutex_lock(&priv->action_mutex); in ipw2100_suspend()
6422 if (priv->status & STATUS_INITIALIZED) { in ipw2100_suspend()
6424 ipw2100_down(priv); in ipw2100_suspend()
6434 priv->suspend_at = get_seconds(); in ipw2100_suspend()
6436 mutex_unlock(&priv->action_mutex); in ipw2100_suspend()
6443 struct ipw2100_priv *priv = pci_get_drvdata(pci_dev); in ipw2100_resume() local
6444 struct net_device *dev = priv->net_dev; in ipw2100_resume()
6451 mutex_lock(&priv->action_mutex); in ipw2100_resume()
6460 mutex_unlock(&priv->action_mutex); in ipw2100_resume()
6479 priv->suspend_time = get_seconds() - priv->suspend_at; in ipw2100_resume()
6482 if (!(priv->status & STATUS_RF_KILL_SW)) in ipw2100_resume()
6483 ipw2100_up(priv, 0); in ipw2100_resume()
6485 mutex_unlock(&priv->action_mutex); in ipw2100_resume()
6493 struct ipw2100_priv *priv = pci_get_drvdata(pci_dev); in ipw2100_shutdown() local
6496 ipw2100_down(priv); in ipw2100_shutdown()
6625 struct ipw2100_priv *priv = libipw_priv(dev); in ipw2100_wx_get_name() local
6626 if (!(priv->status & STATUS_ASSOCIATED)) in ipw2100_wx_get_name()
6639 struct ipw2100_priv *priv = libipw_priv(dev); in ipw2100_wx_set_freq() local
6643 if (priv->ieee->iw_mode == IW_MODE_INFRA) in ipw2100_wx_set_freq()
6646 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_freq()
6647 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_freq()
6673 err = ipw2100_set_channel(priv, fwrq->m, 0); in ipw2100_wx_set_freq()
6677 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_freq()
6689 struct ipw2100_priv *priv = libipw_priv(dev); in ipw2100_wx_get_freq() local
6695 if (priv->config & CFG_STATIC_CHANNEL || in ipw2100_wx_get_freq()
6696 priv->status & STATUS_ASSOCIATED) in ipw2100_wx_get_freq()
6697 wrqu->freq.m = priv->channel; in ipw2100_wx_get_freq()
6701 IPW_DEBUG_WX("GET Freq/Channel -> %d\n", priv->channel); in ipw2100_wx_get_freq()
6710 struct ipw2100_priv *priv = libipw_priv(dev); in ipw2100_wx_set_mode() local
6715 if (wrqu->mode == priv->ieee->iw_mode) in ipw2100_wx_set_mode()
6718 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_mode()
6719 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_mode()
6727 err = ipw2100_switch_mode(priv, IW_MODE_MONITOR); in ipw2100_wx_set_mode()
6731 err = ipw2100_switch_mode(priv, IW_MODE_ADHOC); in ipw2100_wx_set_mode()
6736 err = ipw2100_switch_mode(priv, IW_MODE_INFRA); in ipw2100_wx_set_mode()
6741 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_mode()
6753 struct ipw2100_priv *priv = libipw_priv(dev); in ipw2100_wx_get_mode() local
6755 wrqu->mode = priv->ieee->iw_mode; in ipw2100_wx_get_mode()
6788 struct ipw2100_priv *priv = libipw_priv(dev); in ipw2100_wx_get_range() local
6850 if (priv->ieee->iw_mode == IW_MODE_ADHOC) { in ipw2100_wx_get_range()
6909 struct ipw2100_priv *priv = libipw_priv(dev); in ipw2100_wx_set_wap() local
6916 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_wap()
6917 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_wap()
6926 priv->config &= ~CFG_STATIC_BSSID; in ipw2100_wx_set_wap()
6927 err = ipw2100_set_mandatory_bssid(priv, NULL, 0); in ipw2100_wx_set_wap()
6931 priv->config |= CFG_STATIC_BSSID; in ipw2100_wx_set_wap()
6932 memcpy(priv->mandatory_bssid_mac, wrqu->ap_addr.sa_data, ETH_ALEN); in ipw2100_wx_set_wap()
6934 err = ipw2100_set_mandatory_bssid(priv, wrqu->ap_addr.sa_data, 0); in ipw2100_wx_set_wap()
6939 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_wap()
6951 struct ipw2100_priv *priv = libipw_priv(dev); in ipw2100_wx_get_wap() local
6955 if (priv->config & CFG_STATIC_BSSID || priv->status & STATUS_ASSOCIATED) { in ipw2100_wx_get_wap()
6957 memcpy(wrqu->ap_addr.sa_data, priv->bssid, ETH_ALEN); in ipw2100_wx_get_wap()
6969 struct ipw2100_priv *priv = libipw_priv(dev); in ipw2100_wx_set_essid() local
6974 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_essid()
6975 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_essid()
6987 priv->config &= ~CFG_STATIC_ESSID; in ipw2100_wx_set_essid()
6988 err = ipw2100_set_essid(priv, NULL, 0, 0); in ipw2100_wx_set_essid()
6994 priv->config |= CFG_STATIC_ESSID; in ipw2100_wx_set_essid()
6996 if (priv->essid_len == length && !memcmp(priv->essid, extra, length)) { in ipw2100_wx_set_essid()
7004 priv->essid_len = length; in ipw2100_wx_set_essid()
7005 memcpy(priv->essid, essid, priv->essid_len); in ipw2100_wx_set_essid()
7007 err = ipw2100_set_essid(priv, essid, length, 0); in ipw2100_wx_set_essid()
7010 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_essid()
7022 struct ipw2100_priv *priv = libipw_priv(dev); in ipw2100_wx_get_essid() local
7026 if (priv->config & CFG_STATIC_ESSID || priv->status & STATUS_ASSOCIATED) { in ipw2100_wx_get_essid()
7028 priv->essid_len, priv->essid); in ipw2100_wx_get_essid()
7029 memcpy(extra, priv->essid, priv->essid_len); in ipw2100_wx_get_essid()
7030 wrqu->essid.length = priv->essid_len; in ipw2100_wx_get_essid()
7049 struct ipw2100_priv *priv = libipw_priv(dev); in ipw2100_wx_set_nick() local
7054 wrqu->data.length = min_t(size_t, wrqu->data.length, sizeof(priv->nick)); in ipw2100_wx_set_nick()
7055 memset(priv->nick, 0, sizeof(priv->nick)); in ipw2100_wx_set_nick()
7056 memcpy(priv->nick, extra, wrqu->data.length); in ipw2100_wx_set_nick()
7058 IPW_DEBUG_WX("SET Nickname -> %s\n", priv->nick); in ipw2100_wx_set_nick()
7071 struct ipw2100_priv *priv = libipw_priv(dev); in ipw2100_wx_get_nick() local
7073 wrqu->data.length = strlen(priv->nick); in ipw2100_wx_get_nick()
7074 memcpy(extra, priv->nick, wrqu->data.length); in ipw2100_wx_get_nick()
7086 struct ipw2100_priv *priv = libipw_priv(dev); in ipw2100_wx_set_rate() local
7091 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_rate()
7092 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_rate()
7114 err = ipw2100_set_tx_rates(priv, rate, 0); in ipw2100_wx_set_rate()
7118 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_rate()
7126 struct ipw2100_priv *priv = libipw_priv(dev); in ipw2100_wx_get_rate() local
7131 if (!(priv->status & STATUS_ENABLED) || in ipw2100_wx_get_rate()
7132 priv->status & STATUS_RF_KILL_MASK || in ipw2100_wx_get_rate()
7133 !(priv->status & STATUS_ASSOCIATED)) { in ipw2100_wx_get_rate()
7138 mutex_lock(&priv->action_mutex); in ipw2100_wx_get_rate()
7139 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_get_rate()
7144 err = ipw2100_get_ordinal(priv, IPW_ORD_CURRENT_TX_RATE, &val, &len); in ipw2100_wx_get_rate()
7170 mutex_unlock(&priv->action_mutex); in ipw2100_wx_get_rate()
7178 struct ipw2100_priv *priv = libipw_priv(dev); in ipw2100_wx_set_rts() local
7185 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_rts()
7186 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_rts()
7192 value = priv->rts_threshold | RTS_DISABLED; in ipw2100_wx_set_rts()
7201 err = ipw2100_set_rts_threshold(priv, value); in ipw2100_wx_set_rts()
7205 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_rts()
7217 struct ipw2100_priv *priv = libipw_priv(dev); in ipw2100_wx_get_rts() local
7219 wrqu->rts.value = priv->rts_threshold & ~RTS_DISABLED; in ipw2100_wx_get_rts()
7223 wrqu->rts.disabled = (priv->rts_threshold & RTS_DISABLED) ? 1 : 0; in ipw2100_wx_get_rts()
7234 struct ipw2100_priv *priv = libipw_priv(dev); in ipw2100_wx_set_txpow() local
7237 if (ipw_radio_kill_sw(priv, wrqu->txpower.disabled)) in ipw2100_wx_set_txpow()
7240 if (priv->ieee->iw_mode != IW_MODE_ADHOC) in ipw2100_wx_set_txpow()
7256 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_txpow()
7257 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_txpow()
7262 err = ipw2100_set_tx_power(priv, value); in ipw2100_wx_set_txpow()
7267 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_txpow()
7279 struct ipw2100_priv *priv = libipw_priv(dev); in ipw2100_wx_get_txpow() local
7281 wrqu->txpower.disabled = (priv->status & STATUS_RF_KILL_MASK) ? 1 : 0; in ipw2100_wx_get_txpow()
7283 if (priv->tx_power == IPW_TX_POWER_DEFAULT) { in ipw2100_wx_get_txpow()
7288 wrqu->txpower.value = priv->tx_power; in ipw2100_wx_get_txpow()
7306 struct ipw2100_priv *priv = libipw_priv(dev); in ipw2100_wx_set_frag() local
7312 priv->frag_threshold |= FRAG_DISABLED; in ipw2100_wx_set_frag()
7313 priv->ieee->fts = DEFAULT_FTS; in ipw2100_wx_set_frag()
7319 priv->ieee->fts = wrqu->frag.value & ~0x1; in ipw2100_wx_set_frag()
7320 priv->frag_threshold = priv->ieee->fts; in ipw2100_wx_set_frag()
7323 IPW_DEBUG_WX("SET Frag Threshold -> %d\n", priv->ieee->fts); in ipw2100_wx_set_frag()
7336 struct ipw2100_priv *priv = libipw_priv(dev); in ipw2100_wx_get_frag() local
7337 wrqu->frag.value = priv->frag_threshold & ~FRAG_DISABLED; in ipw2100_wx_get_frag()
7339 wrqu->frag.disabled = (priv->frag_threshold & FRAG_DISABLED) ? 1 : 0; in ipw2100_wx_get_frag()
7350 struct ipw2100_priv *priv = libipw_priv(dev); in ipw2100_wx_set_retry() local
7359 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_retry()
7360 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_retry()
7366 err = ipw2100_set_short_retry(priv, wrqu->retry.value); in ipw2100_wx_set_retry()
7373 err = ipw2100_set_long_retry(priv, wrqu->retry.value); in ipw2100_wx_set_retry()
7379 err = ipw2100_set_short_retry(priv, wrqu->retry.value); in ipw2100_wx_set_retry()
7381 err = ipw2100_set_long_retry(priv, wrqu->retry.value); in ipw2100_wx_set_retry()
7386 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_retry()
7398 struct ipw2100_priv *priv = libipw_priv(dev); in ipw2100_wx_get_retry() local
7407 wrqu->retry.value = priv->long_retry_limit; in ipw2100_wx_get_retry()
7410 (priv->short_retry_limit != in ipw2100_wx_get_retry()
7411 priv->long_retry_limit) ? in ipw2100_wx_get_retry()
7414 wrqu->retry.value = priv->short_retry_limit; in ipw2100_wx_get_retry()
7426 struct ipw2100_priv *priv = libipw_priv(dev); in ipw2100_wx_set_scan() local
7429 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_scan()
7430 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_scan()
7437 priv->user_requested_scan = 1; in ipw2100_wx_set_scan()
7438 if (ipw2100_set_scan_options(priv) || ipw2100_start_scan(priv)) { in ipw2100_wx_set_scan()
7446 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_scan()
7458 struct ipw2100_priv *priv = libipw_priv(dev); in ipw2100_wx_get_scan() local
7459 return libipw_wx_get_scan(priv->ieee, info, wrqu, extra); in ipw2100_wx_get_scan()
7473 struct ipw2100_priv *priv = libipw_priv(dev); in ipw2100_wx_set_encode() local
7474 return libipw_wx_set_encode(priv->ieee, info, wrqu, key); in ipw2100_wx_set_encode()
7485 struct ipw2100_priv *priv = libipw_priv(dev); in ipw2100_wx_get_encode() local
7486 return libipw_wx_get_encode(priv->ieee, info, wrqu, key); in ipw2100_wx_get_encode()
7493 struct ipw2100_priv *priv = libipw_priv(dev); in ipw2100_wx_set_power() local
7496 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_power()
7497 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_power()
7503 priv->power_mode = IPW_POWER_LEVEL(priv->power_mode); in ipw2100_wx_set_power()
7504 err = ipw2100_set_power_mode(priv, IPW_POWER_MODE_CAM); in ipw2100_wx_set_power()
7523 priv->power_mode = IPW_POWER_ENABLED | priv->power_mode; in ipw2100_wx_set_power()
7524 err = ipw2100_set_power_mode(priv, IPW_POWER_LEVEL(priv->power_mode)); in ipw2100_wx_set_power()
7526 IPW_DEBUG_WX("SET Power Management Mode -> 0x%02X\n", priv->power_mode); in ipw2100_wx_set_power()
7529 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_power()
7542 struct ipw2100_priv *priv = libipw_priv(dev); in ipw2100_wx_get_power() local
7544 if (!(priv->power_mode & IPW_POWER_ENABLED)) in ipw2100_wx_get_power()
7551 IPW_DEBUG_WX("GET Power Management Mode -> %02X\n", priv->power_mode); in ipw2100_wx_get_power()
7566 struct ipw2100_priv *priv = libipw_priv(dev); in ipw2100_wx_set_genie() local
7567 struct libipw_device *ieee = priv->ieee; in ipw2100_wx_set_genie()
7591 ipw2100_wpa_assoc_frame(priv, ieee->wpa_ie, ieee->wpa_ie_len); in ipw2100_wx_set_genie()
7601 struct ipw2100_priv *priv = libipw_priv(dev); in ipw2100_wx_get_genie() local
7602 struct libipw_device *ieee = priv->ieee; in ipw2100_wx_get_genie()
7623 struct ipw2100_priv *priv = libipw_priv(dev); in ipw2100_wx_set_auth() local
7624 struct libipw_device *ieee = priv->ieee; in ipw2100_wx_set_auth()
7641 crypt = priv->ieee->crypt_info.crypt[priv->ieee->crypt_info.tx_keyidx]; in ipw2100_wx_set_auth()
7645 flags = crypt->ops->get_flags(crypt->priv); in ipw2100_wx_set_auth()
7652 crypt->ops->set_flags(flags, crypt->priv); in ipw2100_wx_set_auth()
7672 priv->ieee->drop_unencrypted = param->value; in ipw2100_wx_set_auth()
7683 if (priv->ieee->set_security) in ipw2100_wx_set_auth()
7684 priv->ieee->set_security(priv->ieee->dev, &sec); in ipw2100_wx_set_auth()
7689 ret = ipw2100_wpa_set_auth_algs(priv, param->value); in ipw2100_wx_set_auth()
7693 ret = ipw2100_wpa_enable(priv, param->value); in ipw2100_wx_set_auth()
7716 struct ipw2100_priv *priv = libipw_priv(dev); in ipw2100_wx_get_auth() local
7717 struct libipw_device *ieee = priv->ieee; in ipw2100_wx_get_auth()
7734 crypt = priv->ieee->crypt_info.crypt[priv->ieee->crypt_info.tx_keyidx]; in ipw2100_wx_get_auth()
7741 param->value = (crypt->ops->get_flags(crypt->priv) & in ipw2100_wx_get_auth()
7751 param->value = priv->ieee->sec.auth_mode; in ipw2100_wx_get_auth()
7778 struct ipw2100_priv *priv = libipw_priv(dev); in ipw2100_wx_set_encodeext() local
7779 return libipw_wx_set_encodeext(priv->ieee, info, wrqu, extra); in ipw2100_wx_set_encodeext()
7787 struct ipw2100_priv *priv = libipw_priv(dev); in ipw2100_wx_get_encodeext() local
7788 return libipw_wx_get_encodeext(priv->ieee, info, wrqu, extra); in ipw2100_wx_get_encodeext()
7796 struct ipw2100_priv *priv = libipw_priv(dev); in ipw2100_wx_set_mlme() local
7808 ipw2100_disassociate_bssid(priv); in ipw2100_wx_set_mlme()
7827 struct ipw2100_priv *priv = libipw_priv(dev); in ipw2100_wx_set_promisc() local
7832 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_promisc()
7833 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_promisc()
7839 if (priv->ieee->iw_mode == IW_MODE_MONITOR) { in ipw2100_wx_set_promisc()
7840 err = ipw2100_set_channel(priv, parms[1], 0); in ipw2100_wx_set_promisc()
7843 priv->channel = parms[1]; in ipw2100_wx_set_promisc()
7844 err = ipw2100_switch_mode(priv, IW_MODE_MONITOR); in ipw2100_wx_set_promisc()
7846 if (priv->ieee->iw_mode == IW_MODE_MONITOR) in ipw2100_wx_set_promisc()
7847 err = ipw2100_switch_mode(priv, priv->last_mode); in ipw2100_wx_set_promisc()
7850 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_promisc()
7858 struct ipw2100_priv *priv = libipw_priv(dev); in ipw2100_wx_reset() local
7859 if (priv->status & STATUS_INITIALIZED) in ipw2100_wx_reset()
7860 schedule_reset(priv); in ipw2100_wx_reset()
7870 struct ipw2100_priv *priv = libipw_priv(dev); in ipw2100_wx_set_powermode() local
7873 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_powermode()
7874 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_powermode()
7882 if (IPW_POWER_LEVEL(priv->power_mode) != mode) in ipw2100_wx_set_powermode()
7883 err = ipw2100_set_power_mode(priv, mode); in ipw2100_wx_set_powermode()
7885 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_powermode()
7898 struct ipw2100_priv *priv = libipw_priv(dev); in ipw2100_wx_get_powermode() local
7899 int level = IPW_POWER_LEVEL(priv->power_mode); in ipw2100_wx_get_powermode()
7902 if (!(priv->power_mode & IPW_POWER_ENABLED)) { in ipw2100_wx_get_powermode()
7934 struct ipw2100_priv *priv = libipw_priv(dev); in ipw2100_wx_set_preamble() local
7937 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_preamble()
7938 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_preamble()
7944 priv->config |= CFG_LONG_PREAMBLE; in ipw2100_wx_set_preamble()
7946 priv->config &= ~CFG_LONG_PREAMBLE; in ipw2100_wx_set_preamble()
7952 err = ipw2100_system_config(priv, 0); in ipw2100_wx_set_preamble()
7955 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_preamble()
7967 struct ipw2100_priv *priv = libipw_priv(dev); in ipw2100_wx_get_preamble() local
7969 if (priv->config & CFG_LONG_PREAMBLE) in ipw2100_wx_get_preamble()
7982 struct ipw2100_priv *priv = libipw_priv(dev); in ipw2100_wx_set_crc_check() local
7985 mutex_lock(&priv->action_mutex); in ipw2100_wx_set_crc_check()
7986 if (!(priv->status & STATUS_INITIALIZED)) { in ipw2100_wx_set_crc_check()
7992 priv->config |= CFG_CRC_CHECK; in ipw2100_wx_set_crc_check()
7994 priv->config &= ~CFG_CRC_CHECK; in ipw2100_wx_set_crc_check()
8002 mutex_unlock(&priv->action_mutex); in ipw2100_wx_set_crc_check()
8014 struct ipw2100_priv *priv = libipw_priv(dev); in ipw2100_wx_get_crc_check() local
8016 if (priv->config & CFG_CRC_CHECK) in ipw2100_wx_get_crc_check()
8147 struct ipw2100_priv *priv = libipw_priv(dev); in ipw2100_wx_wireless_stats() local
8152 if (!priv) in ipw2100_wx_wireless_stats()
8155 wstats = &priv->wstats; in ipw2100_wx_wireless_stats()
8162 if (!(priv->status & STATUS_ASSOCIATED)) { in ipw2100_wx_wireless_stats()
8174 if (ipw2100_get_ordinal(priv, IPW_ORD_STAT_PERCENT_MISSED_BCNS, in ipw2100_wx_wireless_stats()
8179 if (!(priv->status & STATUS_ASSOCIATED)) { in ipw2100_wx_wireless_stats()
8183 if (ipw2100_get_ordinal(priv, IPW_ORD_RSSI_AVG_CURR, in ipw2100_wx_wireless_stats()
8200 if (ipw2100_get_ordinal(priv, IPW_ORD_STAT_PERCENT_RETRIES, in ipw2100_wx_wireless_stats()
8257 if (ipw2100_get_ordinal(priv, IPW_ORD_STAT_TX_FAILURES, in ipw2100_wx_wireless_stats()
8282 struct ipw2100_priv *priv = in ipw2100_wx_event_work() local
8287 if (priv->status & STATUS_STOPPING) in ipw2100_wx_event_work()
8290 mutex_lock(&priv->action_mutex); in ipw2100_wx_event_work()
8294 mutex_unlock(&priv->action_mutex); in ipw2100_wx_event_work()
8299 if (!(priv->status & (STATUS_ASSOCIATING | STATUS_ASSOCIATED)) || in ipw2100_wx_event_work()
8300 priv->status & STATUS_RF_KILL_MASK || in ipw2100_wx_event_work()
8301 ipw2100_get_ordinal(priv, IPW_ORD_STAT_ASSN_AP_BSSID, in ipw2100_wx_event_work()
8302 &priv->bssid, &len)) { in ipw2100_wx_event_work()
8307 memcpy(wrqu.ap_addr.sa_data, priv->bssid, ETH_ALEN); in ipw2100_wx_event_work()
8308 memcpy(priv->ieee->bssid, priv->bssid, ETH_ALEN); in ipw2100_wx_event_work()
8309 priv->status &= ~STATUS_ASSOCIATING; in ipw2100_wx_event_work()
8310 priv->status |= STATUS_ASSOCIATED; in ipw2100_wx_event_work()
8311 netif_carrier_on(priv->net_dev); in ipw2100_wx_event_work()
8312 netif_wake_queue(priv->net_dev); in ipw2100_wx_event_work()
8315 if (!(priv->status & STATUS_ASSOCIATED)) { in ipw2100_wx_event_work()
8317 mutex_lock(&priv->action_mutex); in ipw2100_wx_event_work()
8320 if (priv->config & CFG_STATIC_ESSID) in ipw2100_wx_event_work()
8321 ipw2100_set_essid(priv, priv->essid, priv->essid_len, in ipw2100_wx_event_work()
8324 ipw2100_set_essid(priv, NULL, 0, 0); in ipw2100_wx_event_work()
8325 mutex_unlock(&priv->action_mutex); in ipw2100_wx_event_work()
8328 wireless_send_event(priv->net_dev, SIOCGIWAP, &wrqu, NULL); in ipw2100_wx_event_work()
8388 static int ipw2100_get_firmware(struct ipw2100_priv *priv, in ipw2100_get_firmware() argument
8395 priv->net_dev->name); in ipw2100_get_firmware()
8397 switch (priv->ieee->iw_mode) { in ipw2100_get_firmware()
8412 rc = request_firmware(&fw->fw_entry, fw_name, &priv->pci_dev->dev); in ipw2100_get_firmware()
8417 priv->net_dev->name, fw_name); in ipw2100_get_firmware()
8434 static void ipw2100_release_firmware(struct ipw2100_priv *priv, in ipw2100_release_firmware() argument
8442 static int ipw2100_get_fwversion(struct ipw2100_priv *priv, char *buf, in ipw2100_get_fwversion() argument
8450 if (ipw2100_get_ordinal(priv, IPW_ORD_STAT_FW_VER_NUM, ver, &len)) in ipw2100_get_fwversion()
8461 static int ipw2100_get_ucodeversion(struct ipw2100_priv *priv, char *buf, in ipw2100_get_ucodeversion() argument
8467 if (ipw2100_get_ordinal(priv, IPW_ORD_UCODE_VERSION, &ver, &len)) in ipw2100_get_ucodeversion()
8475 static int ipw2100_fw_download(struct ipw2100_priv *priv, struct ipw2100_fw *fw) in ipw2100_fw_download() argument
8507 write_nic_memory(priv->net_dev, addr, len, firmware_data); in ipw2100_fw_download()
8532 static int ipw2100_ucode_download(struct ipw2100_priv *priv, in ipw2100_ucode_download() argument
8535 struct net_device *dev = priv->net_dev; in ipw2100_ucode_download()
8538 void __iomem *reg = priv->ioaddr; in ipw2100_ucode_download()