Lines Matching +full:queue +full:- +full:pkt +full:- +full:tx
1 // SPDX-License-Identifier: GPL-2.0-only
4 * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
8 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
19 #include <linux/dma-mapping.h>
39 return -ETIMEDOUT; in _il_poll_bit()
48 spin_lock_irqsave(&p->reg_lock, reg_flags); in il_set_bit()
50 spin_unlock_irqrestore(&p->reg_lock, reg_flags); in il_set_bit()
59 spin_lock_irqsave(&p->reg_lock, reg_flags); in il_clear_bit()
61 spin_unlock_irqrestore(&p->reg_lock, reg_flags); in il_clear_bit()
79 * to/from host DRAM when sleeping/waking for power-saving. in _il_grab_nic_access()
120 return -ETIMEDOUT; in il_poll_bit()
130 spin_lock_irqsave(&il->reg_lock, reg_flags); in il_rd_prph()
134 spin_unlock_irqrestore(&il->reg_lock, reg_flags); in il_rd_prph()
144 spin_lock_irqsave(&il->reg_lock, reg_flags); in il_wr_prph()
149 spin_unlock_irqrestore(&il->reg_lock, reg_flags); in il_wr_prph()
159 spin_lock_irqsave(&il->reg_lock, reg_flags); in il_read_targ_mem()
166 spin_unlock_irqrestore(&il->reg_lock, reg_flags); in il_read_targ_mem()
176 spin_lock_irqsave(&il->reg_lock, reg_flags); in il_write_targ_mem()
182 spin_unlock_irqrestore(&il->reg_lock, reg_flags); in il_write_targ_mem()
242 struct il_rx_pkt *pkt) in il_generic_cmd_callback() argument
244 if (pkt->hdr.flags & IL_CMD_FAILED_MSK) { in il_generic_cmd_callback()
246 il_get_cmd_string(cmd->hdr.cmd), pkt->hdr.flags); in il_generic_cmd_callback()
250 switch (cmd->hdr.cmd) { in il_generic_cmd_callback()
254 il_get_cmd_string(cmd->hdr.cmd), pkt->hdr.flags); in il_generic_cmd_callback()
257 D_HC("back from %s (0x%08X)\n", il_get_cmd_string(cmd->hdr.cmd), in il_generic_cmd_callback()
258 pkt->hdr.flags); in il_generic_cmd_callback()
268 BUG_ON(!(cmd->flags & CMD_ASYNC)); in il_send_cmd_async()
271 BUG_ON(cmd->flags & CMD_WANT_SKB); in il_send_cmd_async()
274 if (!cmd->callback) in il_send_cmd_async()
275 cmd->callback = il_generic_cmd_callback; in il_send_cmd_async()
277 if (test_bit(S_EXIT_PENDING, &il->status)) in il_send_cmd_async()
278 return -EBUSY; in il_send_cmd_async()
283 il_get_cmd_string(cmd->id), ret); in il_send_cmd_async()
295 lockdep_assert_held(&il->mutex); in il_send_cmd_sync()
297 BUG_ON(cmd->flags & CMD_ASYNC); in il_send_cmd_sync()
300 BUG_ON(cmd->callback); in il_send_cmd_sync()
303 il_get_cmd_string(cmd->id)); in il_send_cmd_sync()
305 set_bit(S_HCMD_ACTIVE, &il->status); in il_send_cmd_sync()
307 il_get_cmd_string(cmd->id)); in il_send_cmd_sync()
313 il_get_cmd_string(cmd->id), ret); in il_send_cmd_sync()
317 ret = wait_event_timeout(il->wait_command_queue, in il_send_cmd_sync()
318 !test_bit(S_HCMD_ACTIVE, &il->status), in il_send_cmd_sync()
321 if (test_bit(S_HCMD_ACTIVE, &il->status)) { in il_send_cmd_sync()
323 il_get_cmd_string(cmd->id), in il_send_cmd_sync()
326 clear_bit(S_HCMD_ACTIVE, &il->status); in il_send_cmd_sync()
328 il_get_cmd_string(cmd->id)); in il_send_cmd_sync()
329 ret = -ETIMEDOUT; in il_send_cmd_sync()
334 if (test_bit(S_RFKILL, &il->status)) { in il_send_cmd_sync()
336 il_get_cmd_string(cmd->id)); in il_send_cmd_sync()
337 ret = -ECANCELED; in il_send_cmd_sync()
340 if (test_bit(S_FW_ERROR, &il->status)) { in il_send_cmd_sync()
342 il_get_cmd_string(cmd->id)); in il_send_cmd_sync()
343 ret = -EIO; in il_send_cmd_sync()
346 if ((cmd->flags & CMD_WANT_SKB) && !cmd->reply_page) { in il_send_cmd_sync()
348 il_get_cmd_string(cmd->id)); in il_send_cmd_sync()
349 ret = -EIO; in il_send_cmd_sync()
357 if (cmd->flags & CMD_WANT_SKB) { in il_send_cmd_sync()
360 * TX cmd queue. Otherwise in case the cmd comes in il_send_cmd_sync()
362 * address (cmd->meta.source). in il_send_cmd_sync()
364 il->txq[il->cmd_queue].meta[cmd_idx].flags &= ~CMD_WANT_SKB; in il_send_cmd_sync()
367 if (cmd->reply_page) { in il_send_cmd_sync()
368 il_free_pages(il, cmd->reply_page); in il_send_cmd_sync()
369 cmd->reply_page = 0; in il_send_cmd_sync()
379 if (cmd->flags & CMD_ASYNC) in il_send_cmd()
403 struct il_rx_pkt *pkt)) in il_send_cmd_pdu_async() argument
439 {.throughput = 1 * 1024 - 1, .blink_time = 260},
440 {.throughput = 5 * 1024 - 1, .blink_time = 220},
441 {.throughput = 10 * 1024 - 1, .blink_time = 190},
442 {.throughput = 20 * 1024 - 1, .blink_time = 170},
443 {.throughput = 50 * 1024 - 1, .blink_time = 150},
444 {.throughput = 70 * 1024 - 1, .blink_time = 130},
445 {.throughput = 100 * 1024 - 1, .blink_time = 110},
446 {.throughput = 200 * 1024 - 1, .blink_time = 80},
447 {.throughput = 300 * 1024 - 1, .blink_time = 50},
456 * The calculation is: (100-averageDeviation)/100 * blinkTime
458 * compensation = (100 - averageDeviation) * 64 / 100
466 "use pre-defined blinking time\n"); in il_blink_compensation()
483 if (!test_bit(S_READY, &il->status)) in il_led_cmd()
484 return -EBUSY; in il_led_cmd()
486 if (il->blink_on == on && il->blink_off == off) in il_led_cmd()
495 il->cfg->led_compensation); in il_led_cmd()
498 il->cfg->led_compensation); in il_led_cmd()
501 il->cfg->led_compensation); in il_led_cmd()
503 ret = il->ops->send_led_cmd(il, &led_cmd); in il_led_cmd()
505 il->blink_on = on; in il_led_cmd()
506 il->blink_off = off; in il_led_cmd()
540 mode = il->cfg->led_mode; in il_leds_init()
542 il->led.name = in il_leds_init()
543 kasprintf(GFP_KERNEL, "%s-led", wiphy_name(il->hw->wiphy)); in il_leds_init()
544 if (!il->led.name) in il_leds_init()
547 il->led.brightness_set = il_led_brightness_set; in il_leds_init()
548 il->led.blink_set = il_led_blink_set; in il_leds_init()
549 il->led.max_brightness = 1; in il_leds_init()
556 il->led.default_trigger = in il_leds_init()
557 ieee80211_create_tpt_led_trigger(il->hw, in il_leds_init()
563 il->led.default_trigger = ieee80211_get_radio_led_name(il->hw); in il_leds_init()
567 ret = led_classdev_register(&il->pci_dev->dev, &il->led); in il_leds_init()
569 kfree(il->led.name); in il_leds_init()
573 il->led_registered = true; in il_leds_init()
580 if (!il->led_registered) in il_leds_exit()
583 led_classdev_unregister(&il->led); in il_leds_exit()
584 kfree(il->led.name); in il_leds_exit()
594 * For example, il_priv->eeprom.band_3_channels[4] from the band_3
600 * information into il->channel_info_24/52 and il->channel_map_24/52
611 * valid for Tx with the current hardware. This means that
625 static const u8 il_eeprom_band_2[] = { /* 4915-5080MHz */
629 static const u8 il_eeprom_band_3[] = { /* 5170-5320MHz */
633 static const u8 il_eeprom_band_4[] = { /* 5500-5700MHz */
637 static const u8 il_eeprom_band_5[] = { /* 5725-5825MHz */
668 ret = -ENOENT; in il_eeprom_verify_signature()
677 BUG_ON(offset >= il->cfg->eeprom_size); in il_eeprom_query_addr()
678 return &il->eeprom[offset]; in il_eeprom_query_addr()
685 if (!il->eeprom) in il_eeprom_query16()
687 return (u16) il->eeprom[offset] | ((u16) il->eeprom[offset + 1] << 8); in il_eeprom_query16()
692 * il_eeprom_init - read EEPROM contents
694 * Load the EEPROM contents from adapter into il->eeprom
696 * NOTE: This routine uses the non-debug IO access functions.
708 sz = il->cfg->eeprom_size; in il_eeprom_init()
710 il->eeprom = kzalloc(sz, GFP_KERNEL); in il_eeprom_init()
711 if (!il->eeprom) in il_eeprom_init()
712 return -ENOMEM; in il_eeprom_init()
714 e = (__le16 *) il->eeprom; in il_eeprom_init()
716 il->ops->apm_init(il); in il_eeprom_init()
721 ret = -ENOENT; in il_eeprom_init()
726 ret = il->ops->eeprom_acquire_semaphore(il); in il_eeprom_init()
729 ret = -ENOENT; in il_eeprom_init()
758 il->ops->eeprom_release_semaphore(il); in il_eeprom_init()
772 kfree(il->eeprom); in il_eeprom_free()
773 il->eeprom = NULL; in il_eeprom_free()
783 u32 offset = il->cfg->regulatory_bands[eep_band - 1]; in il_init_band_reference()
840 #define CHECK_AND_PRINT(x) ((eeprom_ch->flags & EEPROM_CHANNEL_##x) \
843 * il_mod_ht40_chan_info - Copy ht40 channel info into driver's il.
858 return -1; in il_mod_ht40_chan_info()
861 " Ad-Hoc %ssupported\n", ch_info->channel, in il_mod_ht40_chan_info()
865 CHECK_AND_PRINT(DFS), eeprom_ch->flags, in il_mod_ht40_chan_info()
866 eeprom_ch->max_power_avg, in il_mod_ht40_chan_info()
867 ((eeprom_ch->flags & EEPROM_CHANNEL_IBSS) && in il_mod_ht40_chan_info()
868 !(eeprom_ch->flags & EEPROM_CHANNEL_RADAR)) ? "" : "not "); in il_mod_ht40_chan_info()
870 ch_info->ht40_eeprom = *eeprom_ch; in il_mod_ht40_chan_info()
871 ch_info->ht40_max_power_avg = eeprom_ch->max_power_avg; in il_mod_ht40_chan_info()
872 ch_info->ht40_flags = eeprom_ch->flags; in il_mod_ht40_chan_info()
873 if (eeprom_ch->flags & EEPROM_CHANNEL_VALID) in il_mod_ht40_chan_info()
874 ch_info->ht40_extension_channel &= in il_mod_ht40_chan_info()
884 * il_init_channel_map - Set up driver's info for all possible channels
895 if (il->channel_count) { in il_init_channel_map()
902 il->channel_count = in il_init_channel_map()
907 D_EEPROM("Parsing data for %d channels.\n", il->channel_count); in il_init_channel_map()
909 il->channel_info = in il_init_channel_map()
910 kcalloc(il->channel_count, sizeof(struct il_channel_info), in il_init_channel_map()
912 if (!il->channel_info) { in il_init_channel_map()
914 il->channel_count = 0; in il_init_channel_map()
915 return -ENOMEM; in il_init_channel_map()
918 ch_info = il->channel_info; in il_init_channel_map()
930 ch_info->channel = eeprom_ch_idx[ch]; in il_init_channel_map()
931 ch_info->band = in il_init_channel_map()
937 ch_info->eeprom = eeprom_ch_info[ch]; in il_init_channel_map()
939 /* Copy the run-time flags so they are there even on in il_init_channel_map()
941 ch_info->flags = eeprom_ch_info[ch].flags; in il_init_channel_map()
944 ch_info->ht40_extension_channel = in il_init_channel_map()
948 D_EEPROM("Ch. %d Flags %x [%sGHz] - " in il_init_channel_map()
949 "No traffic\n", ch_info->channel, in il_init_channel_map()
950 ch_info->flags, in il_init_channel_map()
957 /* Initialize regulatory-based run-time data */ in il_init_channel_map()
958 ch_info->max_power_avg = ch_info->curr_txpow = in il_init_channel_map()
960 ch_info->scan_power = eeprom_ch_info[ch].max_power_avg; in il_init_channel_map()
961 ch_info->min_power = 0; in il_init_channel_map()
964 " Ad-Hoc %ssupported\n", ch_info->channel, in il_init_channel_map()
985 if (il->cfg->regulatory_bands[5] == EEPROM_REGULATORY_BAND_NO_HT40 && in il_init_channel_map()
986 il->cfg->regulatory_bands[6] == EEPROM_REGULATORY_BAND_NO_HT40) in il_init_channel_map()
1020 * il_free_channel_map - undo allocations in il_init_channel_map
1025 kfree(il->channel_info); in il_free_channel_map()
1026 il->channel_count = 0; in il_free_channel_map()
1031 * il_get_channel_info - Find driver's ilate channel info
1043 for (i = 14; i < il->channel_count; i++) { in il_get_channel_info()
1044 if (il->channel_info[i].channel == channel) in il_get_channel_info()
1045 return &il->channel_info[i]; in il_get_channel_info()
1050 return &il->channel_info[channel - 1]; in il_get_channel_info()
1089 if (il->power_data.pci_pm) in il_build_powertable_cmd()
1090 cmd->flags |= IL_POWER_PCI_PM_MSK; in il_build_powertable_cmd()
1093 if (il->power_data.ps_disabled) in il_build_powertable_cmd()
1096 cmd->flags = IL_POWER_DRIVER_ALLOW_SLEEP_MSK; in il_build_powertable_cmd()
1097 cmd->keep_alive_seconds = 0; in il_build_powertable_cmd()
1098 cmd->debug_flags = 0; in il_build_powertable_cmd()
1099 cmd->rx_data_timeout = cpu_to_le32(25 * 1024); in il_build_powertable_cmd()
1100 cmd->tx_data_timeout = cpu_to_le32(25 * 1024); in il_build_powertable_cmd()
1101 cmd->keep_alive_beacons = 0; in il_build_powertable_cmd()
1103 dtim_period = il->vif ? il->vif->bss_conf.dtim_period : 0; in il_build_powertable_cmd()
1106 memcpy(cmd->sleep_interval, interval[0], sizeof(interval[0])); in il_build_powertable_cmd()
1109 memcpy(cmd->sleep_interval, interval[1], sizeof(interval[1])); in il_build_powertable_cmd()
1112 memcpy(cmd->sleep_interval, interval[2], sizeof(interval[2])); in il_build_powertable_cmd()
1124 __le32 tmp = cmd->sleep_interval[IL_POWER_VEC_SIZE - 1]; in il_build_powertable_cmd()
1131 cmd->flags |= IL_POWER_SLEEP_OVER_DTIM_MSK; in il_build_powertable_cmd()
1134 cmd->flags &= ~IL_POWER_SLEEP_OVER_DTIM_MSK; in il_build_powertable_cmd()
1138 if (le32_to_cpu(cmd->sleep_interval[i]) > max_sleep) in il_build_powertable_cmd()
1139 cmd->sleep_interval[i] = cpu_to_le32(max_sleep); in il_build_powertable_cmd()
1146 D_POWER("Flags value = 0x%08X\n", cmd->flags); in il_set_power()
1147 D_POWER("Tx timeout = %u\n", le32_to_cpu(cmd->tx_data_timeout)); in il_set_power()
1148 D_POWER("Rx timeout = %u\n", le32_to_cpu(cmd->rx_data_timeout)); in il_set_power()
1150 le32_to_cpu(cmd->sleep_interval[0]), in il_set_power()
1151 le32_to_cpu(cmd->sleep_interval[1]), in il_set_power()
1152 le32_to_cpu(cmd->sleep_interval[2]), in il_set_power()
1153 le32_to_cpu(cmd->sleep_interval[3]), in il_set_power()
1154 le32_to_cpu(cmd->sleep_interval[4])); in il_set_power()
1166 lockdep_assert_held(&il->mutex); in il_power_set_mode()
1169 update_chains = il->chain_noise_data.state == IL_CHAIN_NOISE_DONE || in il_power_set_mode()
1170 il->chain_noise_data.state == IL_CHAIN_NOISE_ALIVE; in il_power_set_mode()
1172 if (!memcmp(&il->power_data.sleep_cmd, cmd, sizeof(*cmd)) && !force) in il_power_set_mode()
1176 return -EIO; in il_power_set_mode()
1179 memcpy(&il->power_data.sleep_cmd_next, cmd, sizeof(*cmd)); in il_power_set_mode()
1180 if (test_bit(S_SCANNING, &il->status) && !force) { in il_power_set_mode()
1185 if (cmd->flags & IL_POWER_DRIVER_ALLOW_SLEEP_MSK) in il_power_set_mode()
1186 set_bit(S_POWER_PMI, &il->status); in il_power_set_mode()
1190 if (!(cmd->flags & IL_POWER_DRIVER_ALLOW_SLEEP_MSK)) in il_power_set_mode()
1191 clear_bit(S_POWER_PMI, &il->status); in il_power_set_mode()
1193 if (il->ops->update_chain_flags && update_chains) in il_power_set_mode()
1194 il->ops->update_chain_flags(il); in il_power_set_mode()
1195 else if (il->ops->update_chain_flags) in il_power_set_mode()
1198 il->chain_noise_data.state); in il_power_set_mode()
1200 memcpy(&il->power_data.sleep_cmd, cmd, sizeof(*cmd)); in il_power_set_mode()
1224 pcie_capability_read_word(il->pci_dev, PCI_EXP_LNKCTL, &lctl); in il_power_initialize()
1225 il->power_data.pci_pm = !(lctl & PCI_EXP_LNKCTL_ASPM_L0S); in il_power_initialize()
1227 il->power_data.debug_sleep_level_override = -1; in il_power_initialize()
1229 memset(&il->power_data.sleep_cmd, 0, sizeof(il->power_data.sleep_cmd)); in il_power_initialize()
1254 struct il_rx_pkt *pkt; in il_send_scan_abort() local
1263 if (!test_bit(S_READY, &il->status) || in il_send_scan_abort()
1264 !test_bit(S_GEO_CONFIGURED, &il->status) || in il_send_scan_abort()
1265 !test_bit(S_SCAN_HW, &il->status) || in il_send_scan_abort()
1266 test_bit(S_FW_ERROR, &il->status) || in il_send_scan_abort()
1267 test_bit(S_EXIT_PENDING, &il->status)) in il_send_scan_abort()
1268 return -EIO; in il_send_scan_abort()
1274 pkt = (struct il_rx_pkt *)cmd.reply_page; in il_send_scan_abort()
1275 if (pkt->u.status != CAN_ABORT_STATUS) { in il_send_scan_abort()
1282 D_SCAN("SCAN_ABORT ret %d.\n", pkt->u.status); in il_send_scan_abort()
1283 ret = -EIO; in il_send_scan_abort()
1298 if (il->scan_request) { in il_complete_scan()
1300 ieee80211_scan_completed(il->hw, &info); in il_complete_scan()
1303 il->scan_vif = NULL; in il_complete_scan()
1304 il->scan_request = NULL; in il_complete_scan()
1310 lockdep_assert_held(&il->mutex); in il_force_scan_end()
1312 if (!test_bit(S_SCANNING, &il->status)) { in il_force_scan_end()
1318 clear_bit(S_SCANNING, &il->status); in il_force_scan_end()
1319 clear_bit(S_SCAN_HW, &il->status); in il_force_scan_end()
1320 clear_bit(S_SCAN_ABORTING, &il->status); in il_force_scan_end()
1329 lockdep_assert_held(&il->mutex); in il_do_scan_abort()
1331 if (!test_bit(S_SCANNING, &il->status)) { in il_do_scan_abort()
1336 if (test_and_set_bit(S_SCAN_ABORTING, &il->status)) { in il_do_scan_abort()
1350 * il_scan_cancel - Cancel any currently executing HW scan
1356 queue_work(il->workqueue, &il->abort_scan); in il_scan_cancel()
1362 * il_scan_cancel_timeout - Cancel any currently executing HW scan
1371 lockdep_assert_held(&il->mutex); in il_scan_cancel_timeout()
1378 if (!test_bit(S_SCAN_HW, &il->status)) in il_scan_cancel_timeout()
1383 return test_bit(S_SCAN_HW, &il->status); in il_scan_cancel_timeout()
1392 struct il_rx_pkt *pkt = rxb_addr(rxb); in il_hdl_scan() local
1394 (struct il_scanreq_notification *)pkt->u.raw; in il_hdl_scan()
1396 D_SCAN("Scan request status = 0x%x\n", notif->status); in il_hdl_scan()
1404 struct il_rx_pkt *pkt = rxb_addr(rxb); in il_hdl_scan_start() local
1406 (struct il_scanstart_notification *)pkt->u.raw; in il_hdl_scan_start()
1407 il->scan_start_tsf = le32_to_cpu(notif->tsf_low); in il_hdl_scan_start()
1409 "(TSF: 0x%08X:%08X) - %d (beacon timer %u)\n", notif->channel, in il_hdl_scan_start()
1410 notif->band ? "bg" : "a", le32_to_cpu(notif->tsf_high), in il_hdl_scan_start()
1411 le32_to_cpu(notif->tsf_low), notif->status, notif->beacon_timer); in il_hdl_scan_start()
1419 struct il_rx_pkt *pkt = rxb_addr(rxb); in il_hdl_scan_results() local
1421 (struct il_scanresults_notification *)pkt->u.raw; in il_hdl_scan_results()
1423 D_SCAN("Scan ch.res: " "%d [802.11%s] " "(TSF: 0x%08X:%08X) - %d " in il_hdl_scan_results()
1424 "elapsed=%lu usec\n", notif->channel, notif->band ? "bg" : "a", in il_hdl_scan_results()
1425 le32_to_cpu(notif->tsf_high), le32_to_cpu(notif->tsf_low), in il_hdl_scan_results()
1426 le32_to_cpu(notif->stats[0]), in il_hdl_scan_results()
1427 le32_to_cpu(notif->tsf_low) - il->scan_start_tsf); in il_hdl_scan_results()
1436 struct il_rx_pkt *pkt = rxb_addr(rxb); in il_hdl_scan_complete() local
1437 struct il_scancomplete_notification *scan_notif = (void *)pkt->u.raw; in il_hdl_scan_complete()
1439 D_SCAN("Scan complete: %d channels (TSF 0x%08X:%08X) - %d\n", in il_hdl_scan_complete()
1440 scan_notif->scanned_channels, scan_notif->tsf_low, in il_hdl_scan_complete()
1441 scan_notif->tsf_high, scan_notif->status); in il_hdl_scan_complete()
1444 clear_bit(S_SCAN_HW, &il->status); in il_hdl_scan_complete()
1447 (il->scan_band == NL80211_BAND_2GHZ) ? "2.4" : "5.2", in il_hdl_scan_complete()
1448 jiffies_to_msecs(jiffies - il->scan_start)); in il_hdl_scan_complete()
1450 queue_work(il->workqueue, &il->scan_completed); in il_hdl_scan_complete()
1457 il->handlers[C_SCAN] = il_hdl_scan; in il_setup_rx_scan_handlers()
1458 il->handlers[N_SCAN_START] = il_hdl_scan_start; in il_setup_rx_scan_handlers()
1459 il->handlers[N_SCAN_RESULTS] = il_hdl_scan_results; in il_setup_rx_scan_handlers()
1460 il->handlers[N_SCAN_COMPLETE] = il_hdl_scan_complete; in il_setup_rx_scan_handlers()
1495 value = il->vif ? il->vif->bss_conf.beacon_int : 0; in il_get_passive_dwell_time()
1498 value = (value * 98) / 100 - IL_CHANNEL_TUNE_TIME * 2; in il_get_passive_dwell_time()
1509 u8 ant_idx = fls(il->hw_params.valid_tx_ant) - 1; in il_init_scan_params()
1510 if (!il->scan_tx_ant[NL80211_BAND_5GHZ]) in il_init_scan_params()
1511 il->scan_tx_ant[NL80211_BAND_5GHZ] = ant_idx; in il_init_scan_params()
1512 if (!il->scan_tx_ant[NL80211_BAND_2GHZ]) in il_init_scan_params()
1513 il->scan_tx_ant[NL80211_BAND_2GHZ] = ant_idx; in il_init_scan_params()
1522 lockdep_assert_held(&il->mutex); in il_scan_initiate()
1524 cancel_delayed_work(&il->scan_check); in il_scan_initiate()
1528 return -EIO; in il_scan_initiate()
1531 if (test_bit(S_SCAN_HW, &il->status)) { in il_scan_initiate()
1533 return -EBUSY; in il_scan_initiate()
1536 if (test_bit(S_SCAN_ABORTING, &il->status)) { in il_scan_initiate()
1538 return -EBUSY; in il_scan_initiate()
1543 set_bit(S_SCANNING, &il->status); in il_scan_initiate()
1544 il->scan_start = jiffies; in il_scan_initiate()
1546 ret = il->ops->request_scan(il, vif); in il_scan_initiate()
1548 clear_bit(S_SCANNING, &il->status); in il_scan_initiate()
1552 queue_delayed_work(il->workqueue, &il->scan_check, in il_scan_initiate()
1562 struct cfg80211_scan_request *req = &hw_req->req; in il_mac_hw_scan()
1563 struct il_priv *il = hw->priv; in il_mac_hw_scan()
1566 if (req->n_channels == 0) { in il_mac_hw_scan()
1568 return -EINVAL; in il_mac_hw_scan()
1571 mutex_lock(&il->mutex); in il_mac_hw_scan()
1574 if (test_bit(S_SCANNING, &il->status)) { in il_mac_hw_scan()
1576 ret = -EAGAIN; in il_mac_hw_scan()
1581 il->scan_request = req; in il_mac_hw_scan()
1582 il->scan_vif = vif; in il_mac_hw_scan()
1583 il->scan_band = req->channels[0]->band; in il_mac_hw_scan()
1589 mutex_unlock(&il->mutex); in il_mac_hw_scan()
1606 mutex_lock(&il->mutex); in il_bg_scan_check()
1608 mutex_unlock(&il->mutex); in il_bg_scan_check()
1612 * il_fill_probe_req - fill in all required fields and IE for probe request
1623 left -= 24; in il_fill_probe_req()
1627 frame->frame_control = cpu_to_le16(IEEE80211_STYPE_PROBE_REQ); in il_fill_probe_req()
1628 eth_broadcast_addr(frame->da); in il_fill_probe_req()
1629 memcpy(frame->sa, ta, ETH_ALEN); in il_fill_probe_req()
1630 eth_broadcast_addr(frame->bssid); in il_fill_probe_req()
1631 frame->seq_ctrl = 0; in il_fill_probe_req()
1636 pos = &frame->u.probe_req.variable[0]; in il_fill_probe_req()
1639 left -= 2; in il_fill_probe_req()
1668 mutex_lock(&il->mutex); in il_bg_abort_scan()
1670 mutex_unlock(&il->mutex); in il_bg_abort_scan()
1681 cancel_delayed_work(&il->scan_check); in il_bg_scan_completed()
1683 mutex_lock(&il->mutex); in il_bg_scan_completed()
1685 aborted = test_and_clear_bit(S_SCAN_ABORTING, &il->status); in il_bg_scan_completed()
1689 if (!test_and_clear_bit(S_SCANNING, &il->status)) { in il_bg_scan_completed()
1705 il_power_set_mode(il, &il->power_data.sleep_cmd_next, false); in il_bg_scan_completed()
1706 il_set_tx_power(il, il->tx_power_next, false); in il_bg_scan_completed()
1708 il->ops->post_scan(il); in il_bg_scan_completed()
1711 mutex_unlock(&il->mutex); in il_bg_scan_completed()
1717 INIT_WORK(&il->scan_completed, il_bg_scan_completed); in il_setup_scan_deferred_work()
1718 INIT_WORK(&il->abort_scan, il_bg_abort_scan); in il_setup_scan_deferred_work()
1719 INIT_DELAYED_WORK(&il->scan_check, il_bg_scan_check); in il_setup_scan_deferred_work()
1726 cancel_work_sync(&il->abort_scan); in il_cancel_scan_deferred_work()
1727 cancel_work_sync(&il->scan_completed); in il_cancel_scan_deferred_work()
1729 if (cancel_delayed_work_sync(&il->scan_check)) { in il_cancel_scan_deferred_work()
1730 mutex_lock(&il->mutex); in il_cancel_scan_deferred_work()
1732 mutex_unlock(&il->mutex); in il_cancel_scan_deferred_work()
1737 /* il->sta_lock must be held */
1742 if (!(il->stations[sta_id].used & IL_STA_DRIVER_ACTIVE)) in il_sta_ucode_activate()
1744 sta_id, il->stations[sta_id].sta.sta.addr); in il_sta_ucode_activate()
1746 if (il->stations[sta_id].used & IL_STA_UCODE_ACTIVE) { in il_sta_ucode_activate()
1749 il->stations[sta_id].sta.sta.addr); in il_sta_ucode_activate()
1751 il->stations[sta_id].used |= IL_STA_UCODE_ACTIVE; in il_sta_ucode_activate()
1753 il->stations[sta_id].sta.sta.addr); in il_sta_ucode_activate()
1759 struct il_rx_pkt *pkt, bool sync) in il_process_add_sta_resp() argument
1761 u8 sta_id = addsta->sta.sta_id; in il_process_add_sta_resp()
1763 int ret = -EIO; in il_process_add_sta_resp()
1765 if (pkt->hdr.flags & IL_CMD_FAILED_MSK) { in il_process_add_sta_resp()
1766 IL_ERR("Bad return from C_ADD_STA (0x%08X)\n", pkt->hdr.flags); in il_process_add_sta_resp()
1772 spin_lock_irqsave(&il->sta_lock, flags); in il_process_add_sta_resp()
1774 switch (pkt->u.add_sta.status) { in il_process_add_sta_resp()
1788 IL_ERR("Attempting to modify non-existing station %d\n", in il_process_add_sta_resp()
1792 D_ASSOC("Received C_ADD_STA:(0x%08X)\n", pkt->u.add_sta.status); in il_process_add_sta_resp()
1797 il->stations[sta_id].sta.mode == in il_process_add_sta_resp()
1799 il->stations[sta_id].sta.sta.addr); in il_process_add_sta_resp()
1810 il->stations[sta_id].sta.mode == in il_process_add_sta_resp()
1811 STA_CONTROL_MODIFY_MSK ? "Modified" : "Added", addsta->sta.addr); in il_process_add_sta_resp()
1812 spin_unlock_irqrestore(&il->sta_lock, flags); in il_process_add_sta_resp()
1819 struct il_rx_pkt *pkt) in il_add_sta_callback() argument
1821 struct il_addsta_cmd *addsta = (struct il_addsta_cmd *)cmd->cmd.payload; in il_add_sta_callback()
1823 il_process_add_sta_resp(il, addsta, pkt, false); in il_add_sta_callback()
1830 struct il_rx_pkt *pkt = NULL; in il_send_add_sta() local
1838 u8 sta_id __maybe_unused = sta->sta.sta_id; in il_send_add_sta()
1840 D_INFO("Adding sta %u (%pM) %ssynchronously\n", sta_id, sta->sta.addr, in il_send_add_sta()
1850 cmd.len = il->ops->build_addsta_hcmd(sta, data); in il_send_add_sta()
1857 pkt = (struct il_rx_pkt *)cmd.reply_page; in il_send_add_sta()
1858 ret = il_process_add_sta_resp(il, sta, pkt, true); in il_send_add_sta()
1869 struct ieee80211_sta_ht_cap *sta_ht_inf = &sta->deflink.ht_cap; in il_set_ht_add_station()
1872 if (!sta || !sta_ht_inf->ht_supported) in il_set_ht_add_station()
1876 (sta->deflink.smps_mode == IEEE80211_SMPS_STATIC) ? "static" : in il_set_ht_add_station()
1877 (sta->deflink.smps_mode == IEEE80211_SMPS_DYNAMIC) ? "dynamic" : in il_set_ht_add_station()
1880 sta_flags = il->stations[idx].sta.station_flags; in il_set_ht_add_station()
1884 switch (sta->deflink.smps_mode) { in il_set_ht_add_station()
1894 IL_WARN("Invalid MIMO PS mode %d\n", sta->deflink.smps_mode); in il_set_ht_add_station()
1899 cpu_to_le32((u32) sta_ht_inf-> in il_set_ht_add_station()
1903 cpu_to_le32((u32) sta_ht_inf-> in il_set_ht_add_station()
1906 if (il_is_ht40_tx_allowed(il, &sta->deflink.ht_cap)) in il_set_ht_add_station()
1911 il->stations[idx].sta.station_flags = sta_flags; in il_set_ht_add_station()
1917 * il_prep_station - Prepare station information for addition
1933 sta_id = il->hw_params.bcast_id; in il_prep_station()
1935 for (i = IL_STA_ID; i < il->hw_params.max_stations; i++) { in il_prep_station()
1936 if (ether_addr_equal(il->stations[i].sta.sta.addr, in il_prep_station()
1942 if (!il->stations[i].used && in il_prep_station()
1959 if (il->stations[sta_id].used & IL_STA_UCODE_INPROGRESS) { in il_prep_station()
1964 if ((il->stations[sta_id].used & IL_STA_DRIVER_ACTIVE) && in il_prep_station()
1965 (il->stations[sta_id].used & IL_STA_UCODE_ACTIVE) && in il_prep_station()
1966 ether_addr_equal(il->stations[sta_id].sta.sta.addr, addr)) { in il_prep_station()
1972 station = &il->stations[sta_id]; in il_prep_station()
1973 station->used = IL_STA_DRIVER_ACTIVE; in il_prep_station()
1975 il->num_stations++; in il_prep_station()
1978 memset(&station->sta, 0, sizeof(struct il_addsta_cmd)); in il_prep_station()
1979 memcpy(station->sta.sta.addr, addr, ETH_ALEN); in il_prep_station()
1980 station->sta.mode = 0; in il_prep_station()
1981 station->sta.sta.sta_id = sta_id; in il_prep_station()
1982 station->sta.station_flags = 0; in il_prep_station()
1992 rate = (il->band == NL80211_BAND_5GHZ) ? RATE_6M_PLCP : RATE_1M_PLCP; in il_prep_station()
1994 station->sta.rate_n_flags = cpu_to_le16(rate | RATE_MCS_ANT_AB_MSK); in il_prep_station()
2004 * il_add_station_common -
2016 spin_lock_irqsave(&il->sta_lock, flags_spin); in il_add_station_common()
2020 spin_unlock_irqrestore(&il->sta_lock, flags_spin); in il_add_station_common()
2021 return -EINVAL; in il_add_station_common()
2029 if (il->stations[sta_id].used & IL_STA_UCODE_INPROGRESS) { in il_add_station_common()
2031 spin_unlock_irqrestore(&il->sta_lock, flags_spin); in il_add_station_common()
2032 return -EEXIST; in il_add_station_common()
2035 if ((il->stations[sta_id].used & IL_STA_DRIVER_ACTIVE) && in il_add_station_common()
2036 (il->stations[sta_id].used & IL_STA_UCODE_ACTIVE)) { in il_add_station_common()
2039 spin_unlock_irqrestore(&il->sta_lock, flags_spin); in il_add_station_common()
2040 return -EEXIST; in il_add_station_common()
2043 il->stations[sta_id].used |= IL_STA_UCODE_INPROGRESS; in il_add_station_common()
2044 memcpy(&sta_cmd, &il->stations[sta_id].sta, in il_add_station_common()
2046 spin_unlock_irqrestore(&il->sta_lock, flags_spin); in il_add_station_common()
2051 spin_lock_irqsave(&il->sta_lock, flags_spin); in il_add_station_common()
2053 il->stations[sta_id].sta.sta.addr); in il_add_station_common()
2054 il->stations[sta_id].used &= ~IL_STA_DRIVER_ACTIVE; in il_add_station_common()
2055 il->stations[sta_id].used &= ~IL_STA_UCODE_INPROGRESS; in il_add_station_common()
2056 spin_unlock_irqrestore(&il->sta_lock, flags_spin); in il_add_station_common()
2064 * il_sta_ucode_deactivate - deactivate ucode status for a station
2066 * il->sta_lock must be held
2072 if ((il->stations[sta_id]. in il_sta_ucode_deactivate()
2077 il->stations[sta_id].used &= ~IL_STA_UCODE_ACTIVE; in il_sta_ucode_deactivate()
2079 memset(&il->stations[sta_id], 0, sizeof(struct il_station_entry)); in il_sta_ucode_deactivate()
2087 struct il_rx_pkt *pkt; in il_send_remove_station() local
2111 pkt = (struct il_rx_pkt *)cmd.reply_page; in il_send_remove_station()
2112 if (pkt->hdr.flags & IL_CMD_FAILED_MSK) { in il_send_remove_station()
2113 IL_ERR("Bad return from C_REM_STA (0x%08X)\n", pkt->hdr.flags); in il_send_remove_station()
2114 ret = -EIO; in il_send_remove_station()
2118 switch (pkt->u.rem_sta.status) { in il_send_remove_station()
2121 spin_lock_irqsave(&il->sta_lock, flags_spin); in il_send_remove_station()
2123 spin_unlock_irqrestore(&il->sta_lock, in il_send_remove_station()
2129 ret = -EIO; in il_send_remove_station()
2140 * il_remove_station - Remove driver's knowledge of station.
2161 return -EINVAL; in il_remove_station()
2163 spin_lock_irqsave(&il->sta_lock, flags); in il_remove_station()
2165 if (!(il->stations[sta_id].used & IL_STA_DRIVER_ACTIVE)) { in il_remove_station()
2170 if (!(il->stations[sta_id].used & IL_STA_UCODE_ACTIVE)) { in il_remove_station()
2175 if (il->stations[sta_id].used & IL_STA_LOCAL) { in il_remove_station()
2176 kfree(il->stations[sta_id].lq); in il_remove_station()
2177 il->stations[sta_id].lq = NULL; in il_remove_station()
2180 il->stations[sta_id].used &= ~IL_STA_DRIVER_ACTIVE; in il_remove_station()
2182 il->num_stations--; in il_remove_station()
2184 BUG_ON(il->num_stations < 0); in il_remove_station()
2186 spin_unlock_irqrestore(&il->sta_lock, flags); in il_remove_station()
2190 spin_unlock_irqrestore(&il->sta_lock, flags); in il_remove_station()
2191 return -EINVAL; in il_remove_station()
2196 * il_clear_ucode_stations - clear ucode station table bits
2212 spin_lock_irqsave(&il->sta_lock, flags_spin); in il_clear_ucode_stations()
2213 for (i = 0; i < il->hw_params.max_stations; i++) { in il_clear_ucode_stations()
2214 if (il->stations[i].used & IL_STA_UCODE_ACTIVE) { in il_clear_ucode_stations()
2216 il->stations[i].used &= ~IL_STA_UCODE_ACTIVE; in il_clear_ucode_stations()
2220 spin_unlock_irqrestore(&il->sta_lock, flags_spin); in il_clear_ucode_stations()
2228 * il_restore_stations() - Restore driver known stations to device
2252 spin_lock_irqsave(&il->sta_lock, flags_spin); in il_restore_stations()
2253 for (i = 0; i < il->hw_params.max_stations; i++) { in il_restore_stations()
2254 if ((il->stations[i].used & IL_STA_DRIVER_ACTIVE) && in il_restore_stations()
2255 !(il->stations[i].used & IL_STA_UCODE_ACTIVE)) { in il_restore_stations()
2257 il->stations[i].sta.sta.addr); in il_restore_stations()
2258 il->stations[i].sta.mode = 0; in il_restore_stations()
2259 il->stations[i].used |= IL_STA_UCODE_INPROGRESS; in il_restore_stations()
2264 for (i = 0; i < il->hw_params.max_stations; i++) { in il_restore_stations()
2265 if ((il->stations[i].used & IL_STA_UCODE_INPROGRESS)) { in il_restore_stations()
2266 memcpy(&sta_cmd, &il->stations[i].sta, in il_restore_stations()
2269 if (il->stations[i].lq) { in il_restore_stations()
2270 memcpy(&lq, il->stations[i].lq, in il_restore_stations()
2274 spin_unlock_irqrestore(&il->sta_lock, flags_spin); in il_restore_stations()
2277 spin_lock_irqsave(&il->sta_lock, flags_spin); in il_restore_stations()
2279 il->stations[i].sta.sta.addr); in il_restore_stations()
2280 il->stations[i].used &= ~IL_STA_DRIVER_ACTIVE; in il_restore_stations()
2281 il->stations[i].used &= in il_restore_stations()
2283 spin_unlock_irqrestore(&il->sta_lock, in il_restore_stations()
2292 spin_lock_irqsave(&il->sta_lock, flags_spin); in il_restore_stations()
2293 il->stations[i].used &= ~IL_STA_UCODE_INPROGRESS; in il_restore_stations()
2297 spin_unlock_irqrestore(&il->sta_lock, flags_spin); in il_restore_stations()
2311 for (i = 0; i < il->sta_key_max_num; i++) in il_get_free_ucode_key_idx()
2312 if (!test_and_set_bit(i, &il->ucode_key_table)) in il_get_free_ucode_key_idx()
2325 spin_lock_irqsave(&il->sta_lock, flags); in il_dealloc_bcast_stations()
2326 for (i = 0; i < il->hw_params.max_stations; i++) { in il_dealloc_bcast_stations()
2327 if (!(il->stations[i].used & IL_STA_BCAST)) in il_dealloc_bcast_stations()
2330 il->stations[i].used &= ~IL_STA_UCODE_ACTIVE; in il_dealloc_bcast_stations()
2331 il->num_stations--; in il_dealloc_bcast_stations()
2332 BUG_ON(il->num_stations < 0); in il_dealloc_bcast_stations()
2333 kfree(il->stations[i].lq); in il_dealloc_bcast_stations()
2334 il->stations[i].lq = NULL; in il_dealloc_bcast_stations()
2336 spin_unlock_irqrestore(&il->sta_lock, flags); in il_dealloc_bcast_stations()
2345 D_RATE("lq station id 0x%x\n", lq->sta_id); in il_dump_lq_cmd()
2346 D_RATE("lq ant 0x%X 0x%X\n", lq->general_params.single_stream_ant_msk, in il_dump_lq_cmd()
2347 lq->general_params.dual_stream_ant_msk); in il_dump_lq_cmd()
2350 D_RATE("lq idx %d 0x%X\n", i, lq->rs_table[i].rate_n_flags); in il_dump_lq_cmd()
2360 * il_is_lq_table_valid() - Test one aspect of LQ cmd for validity
2375 if (il->ht.enabled) in il_is_lq_table_valid()
2378 D_INFO("Channel %u is not an HT channel\n", il->active.channel); in il_is_lq_table_valid()
2380 if (le32_to_cpu(lq->rs_table[i].rate_n_flags) & RATE_MCS_HT_MSK) { in il_is_lq_table_valid()
2389 * il_send_lq_cmd() - Send link quality command
2412 if (WARN_ON(lq->sta_id == IL_INVALID_STATION)) in il_send_lq_cmd()
2413 return -EINVAL; in il_send_lq_cmd()
2415 spin_lock_irqsave(&il->sta_lock, flags_spin); in il_send_lq_cmd()
2416 if (!(il->stations[lq->sta_id].used & IL_STA_DRIVER_ACTIVE)) { in il_send_lq_cmd()
2417 spin_unlock_irqrestore(&il->sta_lock, flags_spin); in il_send_lq_cmd()
2418 return -EINVAL; in il_send_lq_cmd()
2420 spin_unlock_irqrestore(&il->sta_lock, flags_spin); in il_send_lq_cmd()
2428 ret = -EINVAL; in il_send_lq_cmd()
2436 lq->sta_id); in il_send_lq_cmd()
2437 spin_lock_irqsave(&il->sta_lock, flags_spin); in il_send_lq_cmd()
2438 il->stations[lq->sta_id].used &= ~IL_STA_UCODE_INPROGRESS; in il_send_lq_cmd()
2439 spin_unlock_irqrestore(&il->sta_lock, flags_spin); in il_send_lq_cmd()
2449 struct il_priv *il = hw->priv; in il_mac_sta_remove()
2450 struct il_station_priv_common *sta_common = (void *)sta->drv_priv; in il_mac_sta_remove()
2453 mutex_lock(&il->mutex); in il_mac_sta_remove()
2454 D_MAC80211("enter station %pM\n", sta->addr); in il_mac_sta_remove()
2456 ret = il_remove_station(il, sta_common->sta_id, sta->addr); in il_mac_sta_remove()
2458 IL_ERR("Error removing station %pM\n", sta->addr); in il_mac_sta_remove()
2461 mutex_unlock(&il->mutex); in il_mac_sta_remove()
2467 /************************** RX-FUNCTIONS ****************************/
2477 * Rx Queue Indexes
2481 * to -- the driver can read up to (but not including) this position and get
2485 * The WRITE idx maps to the last position the driver has read from -- the
2488 * The queue is empty (no good data) if WRITE = READ - 1, and is full if
2491 * During initialization, the host sets up the READ queue position to the first
2492 * IDX position, and WRITE to the last (READ - 1 wrapped)
2497 * resets the Rx queue buffers with new memory.
2500 * + A list of pre-allocated SKBs is stored in iwl->rxq->rx_free. When
2501 * iwl->rxq->free_count drops to or below RX_LOW_WATERMARK, work is scheduled
2502 * to replenish the iwl->rxq->rx_free.
2504 * iwl->rxq is replenished and the READ IDX is updated (updating the
2507 * detached from the iwl->rxq. The driver 'processed' idx is updated.
2508 * + The Host/Firmware iwl->rxq is replenished at tasklet time from the rx_free
2509 * list. If there are no allocated buffers in iwl->rxq->rx_free, the READ
2510 * IDX is not incremented and iwl->status(RX_STALLED) is set. If there
2520 * queue, updates firmware pointers, and updates
2524 * -- enable interrupts --
2525 * ISR - il_rx() Detach il_rx_bufs from pool up to the
2527 * Moves the packet buffer from queue to rx_used.
2535 * il_rx_queue_space - Return number of free slots available in queue.
2540 int s = q->read - q->write; in il_rx_queue_space()
2543 /* keep some buffer to not confuse full and empty queue */ in il_rx_queue_space()
2544 s -= 2; in il_rx_queue_space()
2552 * il_rx_queue_update_write_ptr - Update the write pointer for the RX queue
2558 u32 rx_wrt_ptr_reg = il->hw_params.rx_wrt_ptr_reg; in il_rx_queue_update_write_ptr()
2561 spin_lock_irqsave(&q->lock, flags); in il_rx_queue_update_write_ptr()
2563 if (q->need_update == 0) in il_rx_queue_update_write_ptr()
2566 /* If power-saving is in use, make sure device is awake */ in il_rx_queue_update_write_ptr()
2567 if (test_bit(S_POWER_PMI, &il->status)) { in il_rx_queue_update_write_ptr()
2571 D_INFO("Rx queue requesting wakeup," " GP1 = 0x%x\n", in il_rx_queue_update_write_ptr()
2578 q->write_actual = (q->write & ~0x7); in il_rx_queue_update_write_ptr()
2579 il_wr(il, rx_wrt_ptr_reg, q->write_actual); in il_rx_queue_update_write_ptr()
2584 q->write_actual = (q->write & ~0x7); in il_rx_queue_update_write_ptr()
2585 il_wr(il, rx_wrt_ptr_reg, q->write_actual); in il_rx_queue_update_write_ptr()
2588 q->need_update = 0; in il_rx_queue_update_write_ptr()
2591 spin_unlock_irqrestore(&q->lock, flags); in il_rx_queue_update_write_ptr()
2598 struct il_rx_queue *rxq = &il->rxq; in il_rx_queue_alloc()
2599 struct device *dev = &il->pci_dev->dev; in il_rx_queue_alloc()
2602 spin_lock_init(&rxq->lock); in il_rx_queue_alloc()
2603 INIT_LIST_HEAD(&rxq->rx_free); in il_rx_queue_alloc()
2604 INIT_LIST_HEAD(&rxq->rx_used); in il_rx_queue_alloc()
2607 rxq->bd = dma_alloc_coherent(dev, 4 * RX_QUEUE_SIZE, &rxq->bd_dma, in il_rx_queue_alloc()
2609 if (!rxq->bd) in il_rx_queue_alloc()
2612 rxq->rb_stts = dma_alloc_coherent(dev, sizeof(struct il_rb_status), in il_rx_queue_alloc()
2613 &rxq->rb_stts_dma, GFP_KERNEL); in il_rx_queue_alloc()
2614 if (!rxq->rb_stts) in il_rx_queue_alloc()
2617 /* Fill the rx_used queue with _all_ of the Rx buffers */ in il_rx_queue_alloc()
2619 list_add_tail(&rxq->pool[i].list, &rxq->rx_used); in il_rx_queue_alloc()
2622 * not restocked the Rx queue with fresh buffers */ in il_rx_queue_alloc()
2623 rxq->read = rxq->write = 0; in il_rx_queue_alloc()
2624 rxq->write_actual = 0; in il_rx_queue_alloc()
2625 rxq->free_count = 0; in il_rx_queue_alloc()
2626 rxq->need_update = 0; in il_rx_queue_alloc()
2630 dma_free_coherent(&il->pci_dev->dev, 4 * RX_QUEUE_SIZE, rxq->bd, in il_rx_queue_alloc()
2631 rxq->bd_dma); in il_rx_queue_alloc()
2633 return -ENOMEM; in il_rx_queue_alloc()
2640 struct il_rx_pkt *pkt = rxb_addr(rxb); in il_hdl_spectrum_measurement() local
2641 struct il_spectrum_notification *report = &(pkt->u.spectrum_notif); in il_hdl_spectrum_measurement()
2643 if (!report->state) { in il_hdl_spectrum_measurement()
2648 memcpy(&il->measure_report, report, sizeof(*report)); in il_hdl_spectrum_measurement()
2649 il->measurement_status |= MEASUREMENT_READY; in il_hdl_spectrum_measurement()
2654 * returns non-zero if packet should be dropped
2660 u16 fc = le16_to_cpu(hdr->frame_control); in il_set_decrypted_flag()
2666 if (il->active.filter_flags & RXON_FILTER_DIS_DECRYPT_MSK) in il_set_decrypted_flag()
2688 return -1; in il_set_decrypted_flag()
2695 stats->flag |= RX_FLAG_DECRYPTED; in il_set_decrypted_flag()
2707 * il_txq_update_write_ptr - Send new write idx to hardware
2713 int txq_id = txq->q.id; in il_txq_update_write_ptr()
2715 if (txq->need_update == 0) in il_txq_update_write_ptr()
2719 if (test_bit(S_POWER_PMI, &il->status)) { in il_txq_update_write_ptr()
2726 D_INFO("Tx queue %d requesting wakeup," " GP1 = 0x%x\n", in il_txq_update_write_ptr()
2733 il_wr(il, HBUS_TARG_WRPTR, txq->q.write_ptr | (txq_id << 8)); in il_txq_update_write_ptr()
2736 * else not in power-save mode, in il_txq_update_write_ptr()
2738 * trying to tx (during RFKILL, we're not trying to tx). in il_txq_update_write_ptr()
2741 _il_wr(il, HBUS_TARG_WRPTR, txq->q.write_ptr | (txq_id << 8)); in il_txq_update_write_ptr()
2742 txq->need_update = 0; in il_txq_update_write_ptr()
2747 * il_tx_queue_unmap - Unmap any remaining DMA mappings and free skb's
2752 struct il_tx_queue *txq = &il->txq[txq_id]; in il_tx_queue_unmap()
2753 struct il_queue *q = &txq->q; in il_tx_queue_unmap()
2755 if (q->n_bd == 0) in il_tx_queue_unmap()
2758 while (q->write_ptr != q->read_ptr) { in il_tx_queue_unmap()
2759 il->ops->txq_free_tfd(il, txq); in il_tx_queue_unmap()
2760 q->read_ptr = il_queue_inc_wrap(q->read_ptr, q->n_bd); in il_tx_queue_unmap()
2766 * il_tx_queue_free - Deallocate DMA queue.
2767 * @txq: Transmit queue to deallocate.
2769 * Empty queue by removing and destroying all BD's.
2771 * 0-fill, but do not free "txq" descriptor structure.
2776 struct il_tx_queue *txq = &il->txq[txq_id]; in il_tx_queue_free()
2777 struct device *dev = &il->pci_dev->dev; in il_tx_queue_free()
2782 /* De-alloc array of command/tx buffers */ in il_tx_queue_free()
2783 if (txq->cmd) { in il_tx_queue_free()
2785 kfree(txq->cmd[i]); in il_tx_queue_free()
2788 /* De-alloc circular buffer of TFDs */ in il_tx_queue_free()
2789 if (txq->q.n_bd) in il_tx_queue_free()
2790 dma_free_coherent(dev, il->hw_params.tfd_size * txq->q.n_bd, in il_tx_queue_free()
2791 txq->tfds, txq->q.dma_addr); in il_tx_queue_free()
2793 /* De-alloc array of per-TFD driver data */ in il_tx_queue_free()
2794 kfree(txq->skbs); in il_tx_queue_free()
2795 txq->skbs = NULL; in il_tx_queue_free()
2798 kfree(txq->cmd); in il_tx_queue_free()
2799 kfree(txq->meta); in il_tx_queue_free()
2800 txq->cmd = NULL; in il_tx_queue_free()
2801 txq->meta = NULL; in il_tx_queue_free()
2803 /* 0-fill queue descriptor structure */ in il_tx_queue_free()
2809 * il_cmd_queue_unmap - Unmap any remaining DMA mappings from command queue
2814 struct il_tx_queue *txq = &il->txq[il->cmd_queue]; in il_cmd_queue_unmap()
2815 struct il_queue *q = &txq->q; in il_cmd_queue_unmap()
2818 if (q->n_bd == 0) in il_cmd_queue_unmap()
2821 while (q->read_ptr != q->write_ptr) { in il_cmd_queue_unmap()
2822 i = il_get_cmd_idx(q, q->read_ptr, 0); in il_cmd_queue_unmap()
2824 if (txq->meta[i].flags & CMD_MAPPED) { in il_cmd_queue_unmap()
2825 dma_unmap_single(&il->pci_dev->dev, in il_cmd_queue_unmap()
2826 dma_unmap_addr(&txq->meta[i], mapping), in il_cmd_queue_unmap()
2827 dma_unmap_len(&txq->meta[i], len), in il_cmd_queue_unmap()
2829 txq->meta[i].flags = 0; in il_cmd_queue_unmap()
2832 q->read_ptr = il_queue_inc_wrap(q->read_ptr, q->n_bd); in il_cmd_queue_unmap()
2835 i = q->n_win; in il_cmd_queue_unmap()
2836 if (txq->meta[i].flags & CMD_MAPPED) { in il_cmd_queue_unmap()
2837 dma_unmap_single(&il->pci_dev->dev, in il_cmd_queue_unmap()
2838 dma_unmap_addr(&txq->meta[i], mapping), in il_cmd_queue_unmap()
2839 dma_unmap_len(&txq->meta[i], len), in il_cmd_queue_unmap()
2841 txq->meta[i].flags = 0; in il_cmd_queue_unmap()
2847 * il_cmd_queue_free - Deallocate DMA queue.
2849 * Empty queue by removing and destroying all BD's.
2851 * 0-fill, but do not free "txq" descriptor structure.
2856 struct il_tx_queue *txq = &il->txq[il->cmd_queue]; in il_cmd_queue_free()
2857 struct device *dev = &il->pci_dev->dev; in il_cmd_queue_free()
2862 /* De-alloc array of command/tx buffers */ in il_cmd_queue_free()
2863 if (txq->cmd) { in il_cmd_queue_free()
2865 kfree(txq->cmd[i]); in il_cmd_queue_free()
2868 /* De-alloc circular buffer of TFDs */ in il_cmd_queue_free()
2869 if (txq->q.n_bd) in il_cmd_queue_free()
2870 dma_free_coherent(dev, il->hw_params.tfd_size * txq->q.n_bd, in il_cmd_queue_free()
2871 txq->tfds, txq->q.dma_addr); in il_cmd_queue_free()
2874 kfree(txq->cmd); in il_cmd_queue_free()
2875 kfree(txq->meta); in il_cmd_queue_free()
2876 txq->cmd = NULL; in il_cmd_queue_free()
2877 txq->meta = NULL; in il_cmd_queue_free()
2879 /* 0-fill queue descriptor structure */ in il_cmd_queue_free()
2884 /*************** DMA-QUEUE-GENERAL-FUNCTIONS *****
2889 * A Tx or Rx queue resides in host DRAM, and is comprised of a circular buffer
2892 * queue via "read" and "write" pointers. Driver keeps minimum of 2 empty
2894 * queue states.
2897 * DMA/FIFO channels. Each queue is mapped to a single DMA channel.
2899 * For Tx queue, there are low mark and high mark limits. If, after queuing
2900 * the packet for Tx, free space become < low mark, Tx queue stopped. When
2901 * reclaiming packets (on 'tx done IRQ), if free space become > high mark,
2902 * Tx queue resumed.
2910 int s = q->read_ptr - q->write_ptr; in il_queue_space()
2912 if (q->read_ptr > q->write_ptr) in il_queue_space()
2913 s -= q->n_bd; in il_queue_space()
2916 s += q->n_win; in il_queue_space()
2918 s -= 2; in il_queue_space()
2927 * il_queue_init - Initialize queue's high/low-water and read/write idxes
2933 * TFD_QUEUE_SIZE_MAX must be power-of-two size, otherwise in il_queue_init()
2936 BUILD_BUG_ON(TFD_QUEUE_SIZE_MAX & (TFD_QUEUE_SIZE_MAX - 1)); in il_queue_init()
2937 /* FIXME: remove q->n_bd */ in il_queue_init()
2938 q->n_bd = TFD_QUEUE_SIZE_MAX; in il_queue_init()
2940 q->n_win = slots; in il_queue_init()
2941 q->id = id; in il_queue_init()
2943 /* slots_must be power-of-two size, otherwise in il_queue_init()
2947 q->low_mark = q->n_win / 4; in il_queue_init()
2948 if (q->low_mark < 4) in il_queue_init()
2949 q->low_mark = 4; in il_queue_init()
2951 q->high_mark = q->n_win / 8; in il_queue_init()
2952 if (q->high_mark < 2) in il_queue_init()
2953 q->high_mark = 2; in il_queue_init()
2955 q->write_ptr = q->read_ptr = 0; in il_queue_init()
2961 * il_tx_queue_alloc - Alloc driver data and TFD CB for one Tx/cmd queue
2966 struct device *dev = &il->pci_dev->dev; in il_tx_queue_alloc()
2967 size_t tfd_sz = il->hw_params.tfd_size * TFD_QUEUE_SIZE_MAX; in il_tx_queue_alloc()
2969 /* Driver ilate data, only for Tx (not command) queues, in il_tx_queue_alloc()
2971 if (id != il->cmd_queue) { in il_tx_queue_alloc()
2972 txq->skbs = kcalloc(TFD_QUEUE_SIZE_MAX, in il_tx_queue_alloc()
2975 if (!txq->skbs) { in il_tx_queue_alloc()
2980 txq->skbs = NULL; in il_tx_queue_alloc()
2984 txq->tfds = in il_tx_queue_alloc()
2985 dma_alloc_coherent(dev, tfd_sz, &txq->q.dma_addr, GFP_KERNEL); in il_tx_queue_alloc()
2986 if (!txq->tfds) in il_tx_queue_alloc()
2989 txq->q.id = id; in il_tx_queue_alloc()
2994 kfree(txq->skbs); in il_tx_queue_alloc()
2995 txq->skbs = NULL; in il_tx_queue_alloc()
2997 return -ENOMEM; in il_tx_queue_alloc()
3001 * il_tx_queue_init - Allocate and initialize one tx/cmd queue
3008 struct il_tx_queue *txq = &il->txq[txq_id]; in il_tx_queue_init()
3011 * Alloc buffer array for commands (Tx or other types of commands). in il_tx_queue_init()
3012 * For the command queue (#4/#9), allocate command space + one big in il_tx_queue_init()
3015 * For normal Tx queues (all other queues), no super-size command in il_tx_queue_init()
3018 if (txq_id == il->cmd_queue) { in il_tx_queue_init()
3026 txq->meta = in il_tx_queue_init()
3028 txq->cmd = in il_tx_queue_init()
3031 if (!txq->meta || !txq->cmd) in il_tx_queue_init()
3036 /* only happens for cmd queue */ in il_tx_queue_init()
3040 txq->cmd[i] = kmalloc(len, GFP_KERNEL); in il_tx_queue_init()
3041 if (!txq->cmd[i]) in il_tx_queue_init()
3050 txq->need_update = 0; in il_tx_queue_init()
3053 * For the default queues 0-3, set up the swq_id in il_tx_queue_init()
3054 * already -- all others need to get one later in il_tx_queue_init()
3060 /* Initialize queue's high/low-water marks, and head/tail idxes */ in il_tx_queue_init()
3061 il_queue_init(il, &txq->q, slots, txq_id); in il_tx_queue_init()
3063 /* Tell device where to find queue */ in il_tx_queue_init()
3064 il->ops->txq_init(il, txq); in il_tx_queue_init()
3069 kfree(txq->cmd[i]); in il_tx_queue_init()
3071 kfree(txq->meta); in il_tx_queue_init()
3072 txq->meta = NULL; in il_tx_queue_init()
3073 kfree(txq->cmd); in il_tx_queue_init()
3074 txq->cmd = NULL; in il_tx_queue_init()
3076 return -ENOMEM; in il_tx_queue_init()
3084 struct il_tx_queue *txq = &il->txq[txq_id]; in il_tx_queue_reset()
3086 if (txq_id == il->cmd_queue) { in il_tx_queue_reset()
3094 memset(txq->meta, 0, sizeof(struct il_cmd_meta) * actual_slots); in il_tx_queue_reset()
3095 txq->need_update = 0; in il_tx_queue_reset()
3097 /* Initialize queue's high/low-water marks, and head/tail idxes */ in il_tx_queue_reset()
3098 il_queue_init(il, &txq->q, slots, txq_id); in il_tx_queue_reset()
3100 /* Tell device where to find queue */ in il_tx_queue_reset()
3101 il->ops->txq_init(il, txq); in il_tx_queue_reset()
3105 /*************** HOST COMMAND QUEUE FUNCTIONS *****/
3108 * il_enqueue_hcmd - enqueue a uCode command
3114 * command queue.
3119 struct il_tx_queue *txq = &il->txq[il->cmd_queue]; in il_enqueue_hcmd()
3120 struct il_queue *q = &txq->q; in il_enqueue_hcmd()
3128 cmd->len = il->ops->get_hcmd_size(cmd->id, cmd->len); in il_enqueue_hcmd()
3129 fix_size = (u16) (cmd->len + sizeof(out_cmd->hdr)); in il_enqueue_hcmd()
3137 !(cmd->flags & CMD_SIZE_HUGE)); in il_enqueue_hcmd()
3141 IL_WARN("Not sending command - %s KILL\n", in il_enqueue_hcmd()
3143 return -EIO; in il_enqueue_hcmd()
3146 spin_lock_irqsave(&il->hcmd_lock, flags); in il_enqueue_hcmd()
3148 if (il_queue_space(q) < ((cmd->flags & CMD_ASYNC) ? 2 : 1)) { in il_enqueue_hcmd()
3149 spin_unlock_irqrestore(&il->hcmd_lock, flags); in il_enqueue_hcmd()
3151 IL_ERR("Restarting adapter due to command queue full\n"); in il_enqueue_hcmd()
3152 queue_work(il->workqueue, &il->restart); in il_enqueue_hcmd()
3153 return -ENOSPC; in il_enqueue_hcmd()
3156 idx = il_get_cmd_idx(q, q->write_ptr, cmd->flags & CMD_SIZE_HUGE); in il_enqueue_hcmd()
3157 out_cmd = txq->cmd[idx]; in il_enqueue_hcmd()
3158 out_meta = &txq->meta[idx]; in il_enqueue_hcmd()
3160 if (WARN_ON(out_meta->flags & CMD_MAPPED)) { in il_enqueue_hcmd()
3161 spin_unlock_irqrestore(&il->hcmd_lock, flags); in il_enqueue_hcmd()
3162 return -ENOSPC; in il_enqueue_hcmd()
3165 memset(out_meta, 0, sizeof(*out_meta)); /* re-initialize to NULL */ in il_enqueue_hcmd()
3166 out_meta->flags = cmd->flags | CMD_MAPPED; in il_enqueue_hcmd()
3167 if (cmd->flags & CMD_WANT_SKB) in il_enqueue_hcmd()
3168 out_meta->source = cmd; in il_enqueue_hcmd()
3169 if (cmd->flags & CMD_ASYNC) in il_enqueue_hcmd()
3170 out_meta->callback = cmd->callback; in il_enqueue_hcmd()
3172 out_cmd->hdr.cmd = cmd->id; in il_enqueue_hcmd()
3173 memcpy(&out_cmd->cmd.payload, cmd->data, cmd->len); in il_enqueue_hcmd()
3178 out_cmd->hdr.flags = 0; in il_enqueue_hcmd()
3179 out_cmd->hdr.sequence = in il_enqueue_hcmd()
3180 cpu_to_le16(QUEUE_TO_SEQ(il->cmd_queue) | IDX_TO_SEQ(q->write_ptr)); in il_enqueue_hcmd()
3181 if (cmd->flags & CMD_SIZE_HUGE) in il_enqueue_hcmd()
3182 out_cmd->hdr.sequence |= SEQ_HUGE_FRAME; in il_enqueue_hcmd()
3185 switch (out_cmd->hdr.cmd) { in il_enqueue_hcmd()
3190 il_get_cmd_string(out_cmd->hdr.cmd), out_cmd->hdr.cmd, in il_enqueue_hcmd()
3191 le16_to_cpu(out_cmd->hdr.sequence), fix_size, in il_enqueue_hcmd()
3192 q->write_ptr, idx, il->cmd_queue); in il_enqueue_hcmd()
3197 il_get_cmd_string(out_cmd->hdr.cmd), out_cmd->hdr.cmd, in il_enqueue_hcmd()
3198 le16_to_cpu(out_cmd->hdr.sequence), fix_size, q->write_ptr, in il_enqueue_hcmd()
3199 idx, il->cmd_queue); in il_enqueue_hcmd()
3203 phys_addr = dma_map_single(&il->pci_dev->dev, &out_cmd->hdr, fix_size, in il_enqueue_hcmd()
3205 if (unlikely(dma_mapping_error(&il->pci_dev->dev, phys_addr))) { in il_enqueue_hcmd()
3206 idx = -ENOMEM; in il_enqueue_hcmd()
3212 txq->need_update = 1; in il_enqueue_hcmd()
3214 if (il->ops->txq_update_byte_cnt_tbl) in il_enqueue_hcmd()
3215 /* Set up entry in queue's byte count circular buffer */ in il_enqueue_hcmd()
3216 il->ops->txq_update_byte_cnt_tbl(il, txq, 0); in il_enqueue_hcmd()
3218 il->ops->txq_attach_buf_to_tfd(il, txq, phys_addr, fix_size, 1, in il_enqueue_hcmd()
3219 U32_PAD(cmd->len)); in il_enqueue_hcmd()
3221 /* Increment and update queue's write idx */ in il_enqueue_hcmd()
3222 q->write_ptr = il_queue_inc_wrap(q->write_ptr, q->n_bd); in il_enqueue_hcmd()
3226 spin_unlock_irqrestore(&il->hcmd_lock, flags); in il_enqueue_hcmd()
3231 * il_hcmd_queue_reclaim - Reclaim TX command queue entries already Tx'd
3240 struct il_tx_queue *txq = &il->txq[txq_id]; in il_hcmd_queue_reclaim()
3241 struct il_queue *q = &txq->q; in il_hcmd_queue_reclaim()
3244 if (idx >= q->n_bd || il_queue_used(q, idx) == 0) { in il_hcmd_queue_reclaim()
3245 IL_ERR("Read idx for DMA queue txq id (%d), idx %d, " in il_hcmd_queue_reclaim()
3246 "is out of range [0-%d] %d %d.\n", txq_id, idx, q->n_bd, in il_hcmd_queue_reclaim()
3247 q->write_ptr, q->read_ptr); in il_hcmd_queue_reclaim()
3251 for (idx = il_queue_inc_wrap(idx, q->n_bd); q->read_ptr != idx; in il_hcmd_queue_reclaim()
3252 q->read_ptr = il_queue_inc_wrap(q->read_ptr, q->n_bd)) { in il_hcmd_queue_reclaim()
3256 q->write_ptr, q->read_ptr); in il_hcmd_queue_reclaim()
3257 queue_work(il->workqueue, &il->restart); in il_hcmd_queue_reclaim()
3264 * il_tx_cmd_complete - Pull unused buffers off the queue and reclaim them
3274 struct il_rx_pkt *pkt = rxb_addr(rxb); in il_tx_cmd_complete() local
3275 u16 sequence = le16_to_cpu(pkt->hdr.sequence); in il_tx_cmd_complete()
3279 bool huge = !!(pkt->hdr.sequence & SEQ_HUGE_FRAME); in il_tx_cmd_complete()
3282 struct il_tx_queue *txq = &il->txq[il->cmd_queue]; in il_tx_cmd_complete()
3285 /* If a Tx command is being handled and it isn't in the actual in il_tx_cmd_complete()
3286 * command queue then there a command routing bug has been introduced in il_tx_cmd_complete()
3287 * in the queue management code. */ in il_tx_cmd_complete()
3289 (txq_id != il->cmd_queue, in il_tx_cmd_complete()
3290 "wrong command queue %d (should be %d), sequence 0x%X readp=%d writep=%d\n", in il_tx_cmd_complete()
3291 txq_id, il->cmd_queue, sequence, il->txq[il->cmd_queue].q.read_ptr, in il_tx_cmd_complete()
3292 il->txq[il->cmd_queue].q.write_ptr)) { in il_tx_cmd_complete()
3293 il_print_hex_error(il, pkt, 32); in il_tx_cmd_complete()
3297 cmd_idx = il_get_cmd_idx(&txq->q, idx, huge); in il_tx_cmd_complete()
3298 cmd = txq->cmd[cmd_idx]; in il_tx_cmd_complete()
3299 meta = &txq->meta[cmd_idx]; in il_tx_cmd_complete()
3301 txq->time_stamp = jiffies; in il_tx_cmd_complete()
3303 dma_unmap_single(&il->pci_dev->dev, dma_unmap_addr(meta, mapping), in il_tx_cmd_complete()
3306 /* Input error checking is done when commands are added to queue. */ in il_tx_cmd_complete()
3307 if (meta->flags & CMD_WANT_SKB) { in il_tx_cmd_complete()
3308 meta->source->reply_page = (unsigned long)rxb_addr(rxb); in il_tx_cmd_complete()
3309 rxb->page = NULL; in il_tx_cmd_complete()
3310 } else if (meta->callback) in il_tx_cmd_complete()
3311 meta->callback(il, cmd, pkt); in il_tx_cmd_complete()
3313 spin_lock_irqsave(&il->hcmd_lock, flags); in il_tx_cmd_complete()
3317 if (!(meta->flags & CMD_ASYNC)) { in il_tx_cmd_complete()
3318 clear_bit(S_HCMD_ACTIVE, &il->status); in il_tx_cmd_complete()
3320 il_get_cmd_string(cmd->hdr.cmd)); in il_tx_cmd_complete()
3321 wake_up(&il->wait_command_queue); in il_tx_cmd_complete()
3325 meta->flags = 0; in il_tx_cmd_complete()
3327 spin_unlock_irqrestore(&il->hcmd_lock, flags); in il_tx_cmd_complete()
3331 MODULE_DESCRIPTION("iwl-legacy: common functions for 3945 and 4965");
3344 * co-exist problem. The possible behaviors are:
3354 MODULE_PARM_DESC(bt_coex_active, "enable wifi/bluetooth co-exist");
3370 u8 rx_chains_num = il->hw_params.rx_chains_num; in il_init_ht_hw_capab()
3371 u8 tx_chains_num = il->hw_params.tx_chains_num; in il_init_ht_hw_capab()
3373 ht_info->cap = 0; in il_init_ht_hw_capab()
3374 memset(&ht_info->mcs, 0, sizeof(ht_info->mcs)); in il_init_ht_hw_capab()
3376 ht_info->ht_supported = true; in il_init_ht_hw_capab()
3378 ht_info->cap |= IEEE80211_HT_CAP_SGI_20; in il_init_ht_hw_capab()
3380 if (il->hw_params.ht40_channel & BIT(band)) { in il_init_ht_hw_capab()
3381 ht_info->cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40; in il_init_ht_hw_capab()
3382 ht_info->cap |= IEEE80211_HT_CAP_SGI_40; in il_init_ht_hw_capab()
3383 ht_info->mcs.rx_mask[4] = 0x01; in il_init_ht_hw_capab()
3387 if (il->cfg->mod_params->amsdu_size_8K) in il_init_ht_hw_capab()
3388 ht_info->cap |= IEEE80211_HT_CAP_MAX_AMSDU; in il_init_ht_hw_capab()
3390 ht_info->ampdu_factor = CFG_HT_RX_AMPDU_FACTOR_DEF; in il_init_ht_hw_capab()
3391 ht_info->ampdu_density = CFG_HT_MPDU_DENSITY_DEF; in il_init_ht_hw_capab()
3393 ht_info->mcs.rx_mask[0] = 0xFF; in il_init_ht_hw_capab()
3395 ht_info->mcs.rx_mask[1] = 0xFF; in il_init_ht_hw_capab()
3397 ht_info->mcs.rx_mask[2] = 0xFF; in il_init_ht_hw_capab()
3402 ht_info->mcs.rx_highest = cpu_to_le16(max_bit_rate); in il_init_ht_hw_capab()
3404 /* Tx MCS capabilities */ in il_init_ht_hw_capab()
3405 ht_info->mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED; in il_init_ht_hw_capab()
3407 ht_info->mcs.tx_params |= IEEE80211_HT_MCS_TX_RX_DIFF; in il_init_ht_hw_capab()
3408 ht_info->mcs.tx_params |= in il_init_ht_hw_capab()
3409 ((tx_chains_num - in il_init_ht_hw_capab()
3415 * il_init_geos - Initialize mac80211's geo/channel info based from eeprom
3428 if (il->bands[NL80211_BAND_2GHZ].n_bitrates || in il_init_geos()
3429 il->bands[NL80211_BAND_5GHZ].n_bitrates) { in il_init_geos()
3431 set_bit(S_GEO_CONFIGURED, &il->status); in il_init_geos()
3436 kcalloc(il->channel_count, sizeof(struct ieee80211_channel), in il_init_geos()
3439 return -ENOMEM; in il_init_geos()
3446 return -ENOMEM; in il_init_geos()
3450 sband = &il->bands[NL80211_BAND_5GHZ]; in il_init_geos()
3451 sband->channels = &channels[ARRAY_SIZE(il_eeprom_band_1)]; in il_init_geos()
3453 sband->bitrates = &rates[IL_FIRST_OFDM_RATE]; in il_init_geos()
3454 sband->n_bitrates = RATE_COUNT_LEGACY - IL_FIRST_OFDM_RATE; in il_init_geos()
3456 if (il->cfg->sku & IL_SKU_N) in il_init_geos()
3457 il_init_ht_hw_capab(il, &sband->ht_cap, NL80211_BAND_5GHZ); in il_init_geos()
3459 sband = &il->bands[NL80211_BAND_2GHZ]; in il_init_geos()
3460 sband->channels = channels; in il_init_geos()
3462 sband->bitrates = rates; in il_init_geos()
3463 sband->n_bitrates = RATE_COUNT_LEGACY; in il_init_geos()
3465 if (il->cfg->sku & IL_SKU_N) in il_init_geos()
3466 il_init_ht_hw_capab(il, &sband->ht_cap, NL80211_BAND_2GHZ); in il_init_geos()
3468 il->ieee_channels = channels; in il_init_geos()
3469 il->ieee_rates = rates; in il_init_geos()
3471 for (i = 0; i < il->channel_count; i++) { in il_init_geos()
3472 ch = &il->channel_info[i]; in il_init_geos()
3477 sband = &il->bands[ch->band]; in il_init_geos()
3479 geo_ch = &sband->channels[sband->n_channels++]; in il_init_geos()
3481 geo_ch->center_freq = in il_init_geos()
3482 ieee80211_channel_to_frequency(ch->channel, ch->band); in il_init_geos()
3483 geo_ch->max_power = ch->max_power_avg; in il_init_geos()
3484 geo_ch->max_antenna_gain = 0xff; in il_init_geos()
3485 geo_ch->hw_value = ch->channel; in il_init_geos()
3488 if (!(ch->flags & EEPROM_CHANNEL_IBSS)) in il_init_geos()
3489 geo_ch->flags |= IEEE80211_CHAN_NO_IR; in il_init_geos()
3491 if (!(ch->flags & EEPROM_CHANNEL_ACTIVE)) in il_init_geos()
3492 geo_ch->flags |= IEEE80211_CHAN_NO_IR; in il_init_geos()
3494 if (ch->flags & EEPROM_CHANNEL_RADAR) in il_init_geos()
3495 geo_ch->flags |= IEEE80211_CHAN_RADAR; in il_init_geos()
3497 geo_ch->flags |= ch->ht40_extension_channel; in il_init_geos()
3499 if (ch->max_power_avg > max_tx_power) in il_init_geos()
3500 max_tx_power = ch->max_power_avg; in il_init_geos()
3502 geo_ch->flags |= IEEE80211_CHAN_DISABLED; in il_init_geos()
3505 D_INFO("Channel %d Freq=%d[%sGHz] %s flag=0x%X\n", ch->channel, in il_init_geos()
3506 geo_ch->center_freq, in il_init_geos()
3508 geo_ch-> in il_init_geos()
3510 geo_ch->flags); in il_init_geos()
3513 il->tx_power_device_lmt = max_tx_power; in il_init_geos()
3514 il->tx_power_user_lmt = max_tx_power; in il_init_geos()
3515 il->tx_power_next = max_tx_power; in il_init_geos()
3517 if (il->bands[NL80211_BAND_5GHZ].n_channels == 0 && in il_init_geos()
3518 (il->cfg->sku & IL_SKU_A)) { in il_init_geos()
3521 il->pci_dev->device, il->pci_dev->subsystem_device); in il_init_geos()
3522 il->cfg->sku &= ~IL_SKU_A; in il_init_geos()
3526 il->bands[NL80211_BAND_2GHZ].n_channels, in il_init_geos()
3527 il->bands[NL80211_BAND_5GHZ].n_channels); in il_init_geos()
3529 set_bit(S_GEO_CONFIGURED, &il->status); in il_init_geos()
3536 * il_free_geos - undo allocations in il_init_geos
3541 kfree(il->ieee_channels); in il_free_geos()
3542 kfree(il->ieee_rates); in il_free_geos()
3543 clear_bit(S_GEO_CONFIGURED, &il->status); in il_free_geos()
3558 return !(ch_info-> in il_is_channel_extension()
3561 return !(ch_info-> in il_is_channel_extension()
3570 if (!il->ht.enabled || !il->ht.is_40mhz) in il_is_ht40_tx_allowed()
3577 if (ht_cap && !ht_cap->ht_supported) in il_is_ht40_tx_allowed()
3581 if (il->disable_ht40) in il_is_ht40_tx_allowed()
3585 return il_is_channel_extension(il, il->band, in il_is_ht40_tx_allowed()
3586 le16_to_cpu(il->staging.channel), in il_is_ht40_tx_allowed()
3587 il->ht.extension_chan_offset); in il_is_ht40_tx_allowed()
3632 struct ieee80211_vif *vif = il->vif; in il_send_rxon_timing()
3634 conf = &il->hw->conf; in il_send_rxon_timing()
3636 lockdep_assert_held(&il->mutex); in il_send_rxon_timing()
3638 memset(&il->timing, 0, sizeof(struct il_rxon_time_cmd)); in il_send_rxon_timing()
3640 il->timing.timestamp = cpu_to_le64(il->timestamp); in il_send_rxon_timing()
3641 il->timing.listen_interval = cpu_to_le16(conf->listen_interval); in il_send_rxon_timing()
3643 beacon_int = vif ? vif->bss_conf.beacon_int : 0; in il_send_rxon_timing()
3649 il->timing.atim_win = 0; in il_send_rxon_timing()
3653 il->hw_params.max_beacon_itrvl * in il_send_rxon_timing()
3655 il->timing.beacon_interval = cpu_to_le16(beacon_int); in il_send_rxon_timing()
3657 tsf = il->timestamp; /* tsf is modifed by do_div: copy it */ in il_send_rxon_timing()
3660 il->timing.beacon_init_val = cpu_to_le32(interval_tm - rem); in il_send_rxon_timing()
3662 il->timing.dtim_period = vif ? (vif->bss_conf.dtim_period ? : 1) : 1; in il_send_rxon_timing()
3665 le16_to_cpu(il->timing.beacon_interval), in il_send_rxon_timing()
3666 le32_to_cpu(il->timing.beacon_init_val), in il_send_rxon_timing()
3667 le16_to_cpu(il->timing.atim_win)); in il_send_rxon_timing()
3669 return il_send_cmd_pdu(il, C_RXON_TIMING, sizeof(il->timing), in il_send_rxon_timing()
3670 &il->timing); in il_send_rxon_timing()
3677 struct il_rxon_cmd *rxon = &il->staging; in il_set_rxon_hwcrypto()
3680 rxon->filter_flags &= ~RXON_FILTER_DIS_DECRYPT_MSK; in il_set_rxon_hwcrypto()
3682 rxon->filter_flags |= RXON_FILTER_DIS_DECRYPT_MSK; in il_set_rxon_hwcrypto()
3691 struct il_rxon_cmd *rxon = &il->staging; in il_check_rxon_cmd()
3694 if (rxon->flags & RXON_FLG_BAND_24G_MSK) { in il_check_rxon_cmd()
3695 if (rxon->flags & RXON_FLG_TGJ_NARROW_BAND_MSK) { in il_check_rxon_cmd()
3699 if (rxon->flags & RXON_FLG_RADAR_DETECT_MSK) { in il_check_rxon_cmd()
3704 if (!(rxon->flags & RXON_FLG_SHORT_SLOT_MSK)) { in il_check_rxon_cmd()
3708 if (rxon->flags & RXON_FLG_CCK_MSK) { in il_check_rxon_cmd()
3713 if ((rxon->node_addr[0] | rxon->bssid_addr[0]) & 0x1) { in il_check_rxon_cmd()
3719 if ((rxon->ofdm_basic_rates & RATE_6M_MASK) == 0 && in il_check_rxon_cmd()
3720 (rxon->cck_basic_rates & RATE_1M_MASK) == 0) { in il_check_rxon_cmd()
3725 if (le16_to_cpu(rxon->assoc_id) > 2007) { in il_check_rxon_cmd()
3730 if ((rxon->flags & (RXON_FLG_CCK_MSK | RXON_FLG_SHORT_SLOT_MSK)) == in il_check_rxon_cmd()
3736 if ((rxon->flags & (RXON_FLG_CCK_MSK | RXON_FLG_AUTO_DETECT_MSK)) == in il_check_rxon_cmd()
3742 if ((rxon-> in il_check_rxon_cmd()
3745 IL_WARN("TGg but no auto-detect\n"); in il_check_rxon_cmd()
3750 IL_WARN("Tuning to channel %d\n", le16_to_cpu(rxon->channel)); in il_check_rxon_cmd()
3754 return -EINVAL; in il_check_rxon_cmd()
3761 * il_full_rxon_required - check if full RXON (vs RXON_ASSOC) cmd is needed
3771 const struct il_rxon_cmd *staging = &il->staging; in il_full_rxon_required()
3772 const struct il_rxon_cmd *active = &il->active; in il_full_rxon_required()
3776 D_INFO("need full RXON - " #cond "\n"); \ in il_full_rxon_required()
3782 D_INFO("need full RXON - " \ in il_full_rxon_required()
3783 #c1 " != " #c2 " - %d != %d\n", \ in il_full_rxon_required()
3790 CHK(!ether_addr_equal_64bits(staging->bssid_addr, active->bssid_addr)); in il_full_rxon_required()
3791 CHK(!ether_addr_equal_64bits(staging->node_addr, active->node_addr)); in il_full_rxon_required()
3792 CHK(!ether_addr_equal_64bits(staging->wlap_bssid_addr, in il_full_rxon_required()
3793 active->wlap_bssid_addr)); in il_full_rxon_required()
3794 CHK_NEQ(staging->dev_type, active->dev_type); in il_full_rxon_required()
3795 CHK_NEQ(staging->channel, active->channel); in il_full_rxon_required()
3796 CHK_NEQ(staging->air_propagation, active->air_propagation); in il_full_rxon_required()
3797 CHK_NEQ(staging->ofdm_ht_single_stream_basic_rates, in il_full_rxon_required()
3798 active->ofdm_ht_single_stream_basic_rates); in il_full_rxon_required()
3799 CHK_NEQ(staging->ofdm_ht_dual_stream_basic_rates, in il_full_rxon_required()
3800 active->ofdm_ht_dual_stream_basic_rates); in il_full_rxon_required()
3801 CHK_NEQ(staging->assoc_id, active->assoc_id); in il_full_rxon_required()
3804 * be updated with the RXON_ASSOC command -- however only some in il_full_rxon_required()
3808 CHK_NEQ(staging->flags & RXON_FLG_BAND_24G_MSK, in il_full_rxon_required()
3809 active->flags & RXON_FLG_BAND_24G_MSK); in il_full_rxon_required()
3812 CHK_NEQ(staging->filter_flags & RXON_FILTER_ASSOC_MSK, in il_full_rxon_required()
3813 active->filter_flags & RXON_FILTER_ASSOC_MSK); in il_full_rxon_required()
3826 * Assign the lowest rate -- should really get this from in il_get_lowest_plcp()
3829 if (il->staging.flags & RXON_FLG_BAND_24G_MSK) in il_get_lowest_plcp()
3839 struct il_rxon_cmd *rxon = &il->staging; in _il_set_rxon_ht()
3841 if (!il->ht.enabled) { in _il_set_rxon_ht()
3842 rxon->flags &= in _il_set_rxon_ht()
3849 rxon->flags |= in _il_set_rxon_ht()
3850 cpu_to_le32(il->ht.protection << RXON_FLG_HT_OPERATING_MODE_POS); in _il_set_rxon_ht()
3855 rxon->flags &= in _il_set_rxon_ht()
3859 if (il->ht.protection == IEEE80211_HT_OP_MODE_PROTECTION_20MHZ) { in _il_set_rxon_ht()
3860 rxon->flags |= RXON_FLG_CHANNEL_MODE_PURE_40; in _il_set_rxon_ht()
3862 switch (il->ht.extension_chan_offset) { in _il_set_rxon_ht()
3864 rxon->flags &= in _il_set_rxon_ht()
3868 rxon->flags |= RXON_FLG_CTRL_CHANNEL_LOC_HI_MSK; in _il_set_rxon_ht()
3873 switch (il->ht.extension_chan_offset) { in _il_set_rxon_ht()
3875 rxon->flags &= in _il_set_rxon_ht()
3877 rxon->flags |= RXON_FLG_CHANNEL_MODE_MIXED; in _il_set_rxon_ht()
3880 rxon->flags |= RXON_FLG_CTRL_CHANNEL_LOC_HI_MSK; in _il_set_rxon_ht()
3881 rxon->flags |= RXON_FLG_CHANNEL_MODE_MIXED; in _il_set_rxon_ht()
3891 rxon->flags |= RXON_FLG_CHANNEL_MODE_LEGACY; in _il_set_rxon_ht()
3894 if (il->ops->set_rxon_chain) in _il_set_rxon_ht()
3895 il->ops->set_rxon_chain(il); in _il_set_rxon_ht()
3898 "extension channel offset 0x%x\n", le32_to_cpu(rxon->flags), in _il_set_rxon_ht()
3899 il->ht.protection, il->ht.extension_chan_offset); in _il_set_rxon_ht()
3920 max = il->channel_count; in il_get_single_channel_number()
3927 channel = il->channel_info[i].channel; in il_get_single_channel_number()
3928 if (channel == le16_to_cpu(il->staging.channel)) in il_get_single_channel_number()
3941 * il_set_rxon_channel - Set the band and channel values in staging RXON
3945 * in the staging RXON flag structure based on the ch->band
3950 enum nl80211_band band = ch->band; in il_set_rxon_channel()
3951 u16 channel = ch->hw_value; in il_set_rxon_channel()
3953 if (le16_to_cpu(il->staging.channel) == channel && il->band == band) in il_set_rxon_channel()
3956 il->staging.channel = cpu_to_le16(channel); in il_set_rxon_channel()
3958 il->staging.flags &= ~RXON_FLG_BAND_24G_MSK; in il_set_rxon_channel()
3960 il->staging.flags |= RXON_FLG_BAND_24G_MSK; in il_set_rxon_channel()
3962 il->band = band; in il_set_rxon_channel()
3975 il->staging.flags &= in il_set_flags_for_band()
3978 il->staging.flags |= RXON_FLG_SHORT_SLOT_MSK; in il_set_flags_for_band()
3981 if (vif && vif->bss_conf.use_short_slot) in il_set_flags_for_band()
3982 il->staging.flags |= RXON_FLG_SHORT_SLOT_MSK; in il_set_flags_for_band()
3984 il->staging.flags &= ~RXON_FLG_SHORT_SLOT_MSK; in il_set_flags_for_band()
3986 il->staging.flags |= RXON_FLG_BAND_24G_MSK; in il_set_flags_for_band()
3987 il->staging.flags |= RXON_FLG_AUTO_DETECT_MSK; in il_set_flags_for_band()
3988 il->staging.flags &= ~RXON_FLG_CCK_MSK; in il_set_flags_for_band()
4001 memset(&il->staging, 0, sizeof(il->staging)); in il_connection_init_rx_config()
4003 switch (il->iw_mode) { in il_connection_init_rx_config()
4005 il->staging.dev_type = RXON_DEV_TYPE_ESS; in il_connection_init_rx_config()
4008 il->staging.dev_type = RXON_DEV_TYPE_ESS; in il_connection_init_rx_config()
4009 il->staging.filter_flags = RXON_FILTER_ACCEPT_GRP_MSK; in il_connection_init_rx_config()
4012 il->staging.dev_type = RXON_DEV_TYPE_IBSS; in il_connection_init_rx_config()
4013 il->staging.flags = RXON_FLG_SHORT_PREAMBLE_MSK; in il_connection_init_rx_config()
4014 il->staging.filter_flags = in il_connection_init_rx_config()
4018 IL_ERR("Unsupported interface type %d\n", il->vif->type); in il_connection_init_rx_config()
4025 if (!hw_to_local(il->hw)->short_preamble) in il_connection_init_rx_config()
4026 il->staging.flags &= ~RXON_FLG_SHORT_PREAMBLE_MSK; in il_connection_init_rx_config()
4028 il->staging.flags |= RXON_FLG_SHORT_PREAMBLE_MSK; in il_connection_init_rx_config()
4032 il_get_channel_info(il, il->band, le16_to_cpu(il->active.channel)); in il_connection_init_rx_config()
4035 ch_info = &il->channel_info[0]; in il_connection_init_rx_config()
4037 il->staging.channel = cpu_to_le16(ch_info->channel); in il_connection_init_rx_config()
4038 il->band = ch_info->band; in il_connection_init_rx_config()
4040 il_set_flags_for_band(il, il->band, il->vif); in il_connection_init_rx_config()
4042 il->staging.ofdm_basic_rates = in il_connection_init_rx_config()
4044 il->staging.cck_basic_rates = in il_connection_init_rx_config()
4048 il->staging.flags &= in il_connection_init_rx_config()
4050 if (il->vif) in il_connection_init_rx_config()
4051 memcpy(il->staging.node_addr, il->vif->addr, ETH_ALEN); in il_connection_init_rx_config()
4053 il->staging.ofdm_ht_single_stream_basic_rates = 0xff; in il_connection_init_rx_config()
4054 il->staging.ofdm_ht_dual_stream_basic_rates = 0xff; in il_connection_init_rx_config()
4065 hw = il_get_hw_mode(il, il->band); in il_set_rate()
4071 il->active_rate = 0; in il_set_rate()
4073 for (i = 0; i < hw->n_bitrates; i++) { in il_set_rate()
4074 rate = &(hw->bitrates[i]); in il_set_rate()
4075 if (rate->hw_value < RATE_COUNT_LEGACY) in il_set_rate()
4076 il->active_rate |= (1 << rate->hw_value); in il_set_rate()
4079 D_RATE("Set active_rate = %0x\n", il->active_rate); in il_set_rate()
4081 il->staging.cck_basic_rates = in il_set_rate()
4084 il->staging.ofdm_basic_rates = in il_set_rate()
4092 if (test_bit(S_EXIT_PENDING, &il->status)) in il_chswitch_done()
4095 if (test_and_clear_bit(S_CHANNEL_SWITCH_PENDING, &il->status)) in il_chswitch_done()
4096 ieee80211_chswitch_done(il->vif, is_success, 0); in il_chswitch_done()
4103 struct il_rx_pkt *pkt = rxb_addr(rxb); in il_hdl_csa() local
4104 struct il_csa_notification *csa = &(pkt->u.csa_notif); in il_hdl_csa()
4105 struct il_rxon_cmd *rxon = (void *)&il->active; in il_hdl_csa()
4107 if (!test_bit(S_CHANNEL_SWITCH_PENDING, &il->status)) in il_hdl_csa()
4110 if (!le32_to_cpu(csa->status) && csa->channel == il->switch_channel) { in il_hdl_csa()
4111 rxon->channel = csa->channel; in il_hdl_csa()
4112 il->staging.channel = csa->channel; in il_hdl_csa()
4113 D_11H("CSA notif: channel %d\n", le16_to_cpu(csa->channel)); in il_hdl_csa()
4117 le16_to_cpu(csa->channel)); in il_hdl_csa()
4127 struct il_rxon_cmd *rxon = &il->staging; in il_print_rx_config_cmd()
4131 D_RADIO("u16 channel: 0x%x\n", le16_to_cpu(rxon->channel)); in il_print_rx_config_cmd()
4132 D_RADIO("u32 flags: 0x%08X\n", le32_to_cpu(rxon->flags)); in il_print_rx_config_cmd()
4133 D_RADIO("u32 filter_flags: 0x%08x\n", le32_to_cpu(rxon->filter_flags)); in il_print_rx_config_cmd()
4134 D_RADIO("u8 dev_type: 0x%x\n", rxon->dev_type); in il_print_rx_config_cmd()
4135 D_RADIO("u8 ofdm_basic_rates: 0x%02x\n", rxon->ofdm_basic_rates); in il_print_rx_config_cmd()
4136 D_RADIO("u8 cck_basic_rates: 0x%02x\n", rxon->cck_basic_rates); in il_print_rx_config_cmd()
4137 D_RADIO("u8[6] node_addr: %pM\n", rxon->node_addr); in il_print_rx_config_cmd()
4138 D_RADIO("u8[6] bssid_addr: %pM\n", rxon->bssid_addr); in il_print_rx_config_cmd()
4139 D_RADIO("u16 assoc_id: 0x%x\n", le16_to_cpu(rxon->assoc_id)); in il_print_rx_config_cmd()
4144 * il_irq_handle_error - called for HW or SW error interrupt from card
4149 /* Set the FW error flag -- cleared on il_down */ in il_irq_handle_error()
4150 set_bit(S_FW_ERROR, &il->status); in il_irq_handle_error()
4153 clear_bit(S_HCMD_ACTIVE, &il->status); in il_irq_handle_error()
4155 IL_ERR("Loaded firmware version: %s\n", il->hw->wiphy->fw_version); in il_irq_handle_error()
4157 il->ops->dump_nic_error_log(il); in il_irq_handle_error()
4158 if (il->ops->dump_fh) in il_irq_handle_error()
4159 il->ops->dump_fh(il, NULL, false); in il_irq_handle_error()
4165 wake_up(&il->wait_command_queue); in il_irq_handle_error()
4169 clear_bit(S_READY, &il->status); in il_irq_handle_error()
4171 if (!test_bit(S_EXIT_PENDING, &il->status)) { in il_irq_handle_error()
4175 if (il->cfg->mod_params->restart_fw) in il_irq_handle_error()
4176 queue_work(il->workqueue, &il->restart); in il_irq_handle_error()
4203 lockdep_assert_held(&il->reg_lock); in _il_apm_stop()
4217 * D0A* (powered-up Active) --> D0U* (Uninitialized) state. in _il_apm_stop()
4228 spin_lock_irqsave(&il->reg_lock, flags); in il_apm_stop()
4230 spin_unlock_irqrestore(&il->reg_lock, flags); in il_apm_stop()
4268 * wake device's PCI Express link L1a -> L0s in il_apm_init()
4269 * NOTE: This is no-op for 3945 (non-existent bit) in il_apm_init()
4275 * HW bug W/A for instability in PCIe bus L0->L0S->L1 transition. in il_apm_init()
4276 * Check if BIOS (or OS) enabled L1-ASPM on this device. in il_apm_init()
4277 * If so (likely), disable L0S, so device moves directly L0->L1; in il_apm_init()
4282 if (il->cfg->set_l0s) { in il_apm_init()
4283 ret = pcie_capability_read_word(il->pci_dev, PCI_EXP_LNKCTL, &lctl); in il_apm_init()
4285 /* L1-ASPM enabled; disable(!) L0S */ in il_apm_init()
4290 /* L1-ASPM disabled; enable(!) L0S */ in il_apm_init()
4297 /* Configure analog phase-lock-loop before activating to D0A */ in il_apm_init()
4298 if (il->cfg->pll_cfg_val) in il_apm_init()
4300 il->cfg->pll_cfg_val); in il_apm_init()
4304 * D0U* --> D0A* (powered-up active) state. in il_apm_init()
4310 * device-internal resources is supported, e.g. il_wr_prph() in il_apm_init()
4330 if (il->cfg->use_bsm) in il_apm_init()
4337 /* Disable L1-Active */ in il_apm_init()
4353 lockdep_assert_held(&il->mutex); in il_set_tx_power()
4355 if (il->tx_power_user_lmt == tx_power && !force) in il_set_tx_power()
4358 if (!il->ops->send_tx_power) in il_set_tx_power()
4359 return -EOPNOTSUPP; in il_set_tx_power()
4364 return -EINVAL; in il_set_tx_power()
4367 if (tx_power > il->tx_power_device_lmt) { in il_set_tx_power()
4369 tx_power, il->tx_power_device_lmt); in il_set_tx_power()
4370 return -EINVAL; in il_set_tx_power()
4374 return -EIO; in il_set_tx_power()
4378 il->tx_power_next = tx_power; in il_set_tx_power()
4380 /* do not set tx power when scanning or channel changing */ in il_set_tx_power()
4381 defer = test_bit(S_SCANNING, &il->status) || in il_set_tx_power()
4382 memcmp(&il->active, &il->staging, sizeof(il->staging)); in il_set_tx_power()
4384 D_INFO("Deferring tx power set\n"); in il_set_tx_power()
4388 prev_tx_power = il->tx_power_user_lmt; in il_set_tx_power()
4389 il->tx_power_user_lmt = tx_power; in il_set_tx_power()
4391 ret = il->ops->send_tx_power(il); in il_set_tx_power()
4393 /* if fail to set tx_power, restore the orig. tx power */ in il_set_tx_power()
4395 il->tx_power_user_lmt = prev_tx_power; in il_set_tx_power()
4396 il->tx_power_next = prev_tx_power; in il_set_tx_power()
4445 struct il_rx_pkt *pkt = rxb_addr(rxb); in il_hdl_pm_sleep() local
4446 struct il_sleep_notification *sleep = &(pkt->u.sleep_notif); in il_hdl_pm_sleep()
4448 sleep->pm_sleep_mode, sleep->pm_wakeup_src); in il_hdl_pm_sleep()
4456 struct il_rx_pkt *pkt = rxb_addr(rxb); in il_hdl_pm_debug_stats() local
4457 u32 len = le32_to_cpu(pkt->len_n_flags) & IL_RX_FRAME_SIZE_MSK; in il_hdl_pm_debug_stats()
4459 il_get_cmd_string(pkt->hdr.cmd)); in il_hdl_pm_debug_stats()
4460 il_print_hex_dump(il, IL_DL_RADIO, pkt->u.raw, len); in il_hdl_pm_debug_stats()
4467 struct il_rx_pkt *pkt = rxb_addr(rxb); in il_hdl_error() local
4471 le32_to_cpu(pkt->u.err_resp.error_type), in il_hdl_error()
4472 il_get_cmd_string(pkt->u.err_resp.cmd_id), in il_hdl_error()
4473 pkt->u.err_resp.cmd_id, in il_hdl_error()
4474 le16_to_cpu(pkt->u.err_resp.bad_cmd_seq_num), in il_hdl_error()
4475 le32_to_cpu(pkt->u.err_resp.error_info)); in il_hdl_error()
4482 memset(&il->isr_stats, 0, sizeof(il->isr_stats)); in il_clear_isr_stats()
4487 unsigned int link_id, u16 queue, in il_mac_conf_tx() argument
4490 struct il_priv *il = hw->priv; in il_mac_conf_tx()
4497 D_MAC80211("leave - RF not ready\n"); in il_mac_conf_tx()
4498 return -EIO; in il_mac_conf_tx()
4501 if (queue >= AC_NUM) { in il_mac_conf_tx()
4502 D_MAC80211("leave - queue >= AC_NUM %d\n", queue); in il_mac_conf_tx()
4506 q = AC_NUM - 1 - queue; in il_mac_conf_tx()
4508 spin_lock_irqsave(&il->lock, flags); in il_mac_conf_tx()
4510 il->qos_data.def_qos_parm.ac[q].cw_min = in il_mac_conf_tx()
4511 cpu_to_le16(params->cw_min); in il_mac_conf_tx()
4512 il->qos_data.def_qos_parm.ac[q].cw_max = in il_mac_conf_tx()
4513 cpu_to_le16(params->cw_max); in il_mac_conf_tx()
4514 il->qos_data.def_qos_parm.ac[q].aifsn = params->aifs; in il_mac_conf_tx()
4515 il->qos_data.def_qos_parm.ac[q].edca_txop = in il_mac_conf_tx()
4516 cpu_to_le16((params->txop * 32)); in il_mac_conf_tx()
4518 il->qos_data.def_qos_parm.ac[q].reserved1 = 0; in il_mac_conf_tx()
4520 spin_unlock_irqrestore(&il->lock, flags); in il_mac_conf_tx()
4530 struct il_priv *il = hw->priv; in il_mac_tx_last_beacon()
4535 ret = (il->ibss_manager == IL_IBSS_MANAGER); in il_mac_tx_last_beacon()
4547 if (il->ops->set_rxon_chain) in il_set_mode()
4548 il->ops->set_rxon_chain(il); in il_set_mode()
4556 struct il_priv *il = hw->priv; in il_mac_add_interface()
4560 mutex_lock(&il->mutex); in il_mac_add_interface()
4561 D_MAC80211("enter: type %d, addr %pM\n", vif->type, vif->addr); in il_mac_add_interface()
4565 err = -EINVAL; in il_mac_add_interface()
4573 reset = (il->vif == vif); in il_mac_add_interface()
4574 if (il->vif && !reset) { in il_mac_add_interface()
4575 err = -EOPNOTSUPP; in il_mac_add_interface()
4579 il->vif = vif; in il_mac_add_interface()
4580 il->iw_mode = vif->type; in il_mac_add_interface()
4584 IL_WARN("Fail to set mode %d\n", vif->type); in il_mac_add_interface()
4586 il->vif = NULL; in il_mac_add_interface()
4587 il->iw_mode = NL80211_IFTYPE_STATION; in il_mac_add_interface()
4593 mutex_unlock(&il->mutex); in il_mac_add_interface()
4602 lockdep_assert_held(&il->mutex); in il_teardown_interface()
4604 if (il->scan_vif == vif) { in il_teardown_interface()
4615 struct il_priv *il = hw->priv; in il_mac_remove_interface()
4617 mutex_lock(&il->mutex); in il_mac_remove_interface()
4618 D_MAC80211("enter: type %d, addr %pM\n", vif->type, vif->addr); in il_mac_remove_interface()
4620 WARN_ON(il->vif != vif); in il_mac_remove_interface()
4621 il->vif = NULL; in il_mac_remove_interface()
4622 il->iw_mode = NL80211_IFTYPE_UNSPECIFIED; in il_mac_remove_interface()
4624 eth_zero_addr(il->bssid); in il_mac_remove_interface()
4627 mutex_unlock(&il->mutex); in il_mac_remove_interface()
4634 if (!il->txq) in il_alloc_txq_mem()
4635 il->txq = in il_alloc_txq_mem()
4636 kcalloc(il->cfg->num_of_queues, in il_alloc_txq_mem()
4639 if (!il->txq) { in il_alloc_txq_mem()
4641 return -ENOMEM; in il_alloc_txq_mem()
4650 kfree(il->txq); in il_free_txq_mem()
4651 il->txq = NULL; in il_free_txq_mem()
4660 if (test_bit(S_EXIT_PENDING, &il->status)) in il_force_reset()
4661 return -EINVAL; in il_force_reset()
4663 force_reset = &il->force_reset; in il_force_reset()
4664 force_reset->reset_request_count++; in il_force_reset()
4666 if (force_reset->last_force_reset_jiffies && in il_force_reset()
4667 time_after(force_reset->last_force_reset_jiffies + in il_force_reset()
4668 force_reset->reset_duration, jiffies)) { in il_force_reset()
4670 force_reset->reset_reject_count++; in il_force_reset()
4671 return -EAGAIN; in il_force_reset()
4674 force_reset->reset_success_count++; in il_force_reset()
4675 force_reset->last_force_reset_jiffies = jiffies; in il_force_reset()
4686 if (!external && !il->cfg->mod_params->restart_fw) { in il_force_reset()
4694 /* Set the FW error flag -- cleared on il_down */ in il_force_reset()
4695 set_bit(S_FW_ERROR, &il->status); in il_force_reset()
4696 wake_up(&il->wait_command_queue); in il_force_reset()
4701 clear_bit(S_READY, &il->status); in il_force_reset()
4702 queue_work(il->workqueue, &il->restart); in il_force_reset()
4712 struct il_priv *il = hw->priv; in il_mac_change_interface()
4715 mutex_lock(&il->mutex); in il_mac_change_interface()
4717 vif->type, vif->addr, newtype, newp2p); in il_mac_change_interface()
4720 err = -EOPNOTSUPP; in il_mac_change_interface()
4724 if (!il->vif || !il_is_ready_rf(il)) { in il_mac_change_interface()
4729 err = -EBUSY; in il_mac_change_interface()
4734 vif->type = newtype; in il_mac_change_interface()
4735 vif->p2p = false; in il_mac_change_interface()
4736 il->iw_mode = newtype; in il_mac_change_interface()
4742 mutex_unlock(&il->mutex); in il_mac_change_interface()
4751 struct il_priv *il = hw->priv; in il_mac_flush()
4755 mutex_lock(&il->mutex); in il_mac_flush()
4758 if (il->txq == NULL) in il_mac_flush()
4761 for (i = 0; i < il->hw_params.max_txq_num; i++) { in il_mac_flush()
4764 if (i == il->cmd_queue) in il_mac_flush()
4767 q = &il->txq[i].q; in il_mac_flush()
4768 if (q->read_ptr == q->write_ptr) in il_mac_flush()
4772 IL_ERR("Failed to flush queue %d\n", q->id); in il_mac_flush()
4780 mutex_unlock(&il->mutex); in il_mac_flush()
4786 * change during timeout period and queue is not empty we reset firmware.
4791 struct il_tx_queue *txq = &il->txq[cnt]; in il_check_stuck_queue()
4792 struct il_queue *q = &txq->q; in il_check_stuck_queue()
4797 if (q->read_ptr == q->write_ptr) { in il_check_stuck_queue()
4798 txq->time_stamp = now; in il_check_stuck_queue()
4803 txq->time_stamp + in il_check_stuck_queue()
4804 msecs_to_jiffies(il->cfg->wd_timeout); in il_check_stuck_queue()
4807 IL_ERR("Queue %d stuck for %u ms.\n", q->id, in il_check_stuck_queue()
4808 jiffies_to_msecs(now - txq->time_stamp)); in il_check_stuck_queue()
4810 return (ret == -EAGAIN) ? 0 : 1; in il_check_stuck_queue()
4818 * discover the queue hung between timeout and 1.25*timeout
4823 * Watchdog timer callback, we check each tx queue for stuck, if hung
4833 if (test_bit(S_EXIT_PENDING, &il->status)) in il_bg_watchdog()
4836 timeout = il->cfg->wd_timeout; in il_bg_watchdog()
4840 /* monitor and check for stuck cmd queue */ in il_bg_watchdog()
4841 if (il_check_stuck_queue(il, il->cmd_queue)) in il_bg_watchdog()
4845 for (cnt = 0; cnt < il->hw_params.max_txq_num; cnt++) { in il_bg_watchdog()
4846 /* skip as we already checked the command queue */ in il_bg_watchdog()
4847 if (cnt == il->cmd_queue) in il_bg_watchdog()
4853 mod_timer(&il->watchdog, in il_bg_watchdog()
4861 unsigned int timeout = il->cfg->wd_timeout; in il_setup_watchdog()
4864 mod_timer(&il->watchdog, in il_setup_watchdog()
4867 del_timer(&il->watchdog); in il_setup_watchdog()
4873 * time in usec will be changed into a 32-bit value in extended:internal format
4890 il->hw_params. in il_usecs_to_beacons()
4891 beacon_time_tsf_bits) >> il-> in il_usecs_to_beacons()
4895 il->hw_params. in il_usecs_to_beacons()
4898 return (quot << il->hw_params.beacon_time_tsf_bits) + rem; in il_usecs_to_beacons()
4910 il->hw_params. in il_add_beacon_time()
4913 il->hw_params. in il_add_beacon_time()
4917 il->hw_params. in il_add_beacon_time()
4920 il->hw_params. in il_add_beacon_time()
4924 res += base_low - addon_low; in il_add_beacon_time()
4926 res += interval + base_low - addon_low; in il_add_beacon_time()
4927 res += (1 << il->hw_params.beacon_time_tsf_bits); in il_add_beacon_time()
4929 res += (1 << il->hw_params.beacon_time_tsf_bits); in il_add_beacon_time()
4963 * PCI Tx retries from interfering with C3 CPU state. in il_pci_resume()
4973 set_bit(S_RFKILL, &il->status); in il_pci_resume()
4975 clear_bit(S_RFKILL, &il->status); in il_pci_resume()
4977 wiphy_rfkill_set_hw_state(il->hw->wiphy, hw_rfkill); in il_pci_resume()
4990 if (test_bit(S_EXIT_PENDING, &il->status)) in il_update_qos()
4993 il->qos_data.def_qos_parm.qos_flags = 0; in il_update_qos()
4995 if (il->qos_data.qos_active) in il_update_qos()
4996 il->qos_data.def_qos_parm.qos_flags |= in il_update_qos()
4999 if (il->ht.enabled) in il_update_qos()
5000 il->qos_data.def_qos_parm.qos_flags |= QOS_PARAM_FLG_TGN_MSK; in il_update_qos()
5003 il->qos_data.qos_active, il->qos_data.def_qos_parm.qos_flags); in il_update_qos()
5006 &il->qos_data.def_qos_parm, NULL); in il_update_qos()
5010 * il_mac_config - mac80211 config callback
5015 struct il_priv *il = hw->priv; in il_mac_config()
5017 struct ieee80211_conf *conf = &hw->conf; in il_mac_config()
5018 struct ieee80211_channel *channel = conf->chandef.chan; in il_mac_config()
5019 struct il_ht_config *ht_conf = &il->current_ht_config; in il_mac_config()
5026 mutex_lock(&il->mutex); in il_mac_config()
5027 D_MAC80211("enter: channel %d changed 0x%X\n", channel->hw_value, in il_mac_config()
5030 if (unlikely(test_bit(S_SCANNING, &il->status))) { in il_mac_config()
5037 /* mac80211 uses static for non-HT which is what we want */ in il_mac_config()
5038 il->current_ht_config.smps = conf->smps_mode; in il_mac_config()
5047 if (il->ops->set_rxon_chain) in il_mac_config()
5048 il->ops->set_rxon_chain(il); in il_mac_config()
5059 ch = channel->hw_value; in il_mac_config()
5060 ch_info = il_get_channel_info(il, channel->band, ch); in il_mac_config()
5062 D_MAC80211("leave - invalid channel\n"); in il_mac_config()
5063 ret = -EINVAL; in il_mac_config()
5067 if (il->iw_mode == NL80211_IFTYPE_ADHOC && in il_mac_config()
5069 D_MAC80211("leave - not IBSS channel\n"); in il_mac_config()
5070 ret = -EINVAL; in il_mac_config()
5074 spin_lock_irqsave(&il->lock, flags); in il_mac_config()
5077 if (il->ht.enabled != conf_is_ht(conf)) { in il_mac_config()
5078 il->ht.enabled = conf_is_ht(conf); in il_mac_config()
5081 if (il->ht.enabled) { in il_mac_config()
5083 il->ht.extension_chan_offset = in il_mac_config()
5085 il->ht.is_40mhz = true; in il_mac_config()
5087 il->ht.extension_chan_offset = in il_mac_config()
5089 il->ht.is_40mhz = true; in il_mac_config()
5091 il->ht.extension_chan_offset = in il_mac_config()
5093 il->ht.is_40mhz = false; in il_mac_config()
5096 il->ht.is_40mhz = false; in il_mac_config()
5102 il->ht.protection = IEEE80211_HT_OP_MODE_PROTECTION_NONE; in il_mac_config()
5107 if ((le16_to_cpu(il->staging.channel) != ch)) in il_mac_config()
5108 il->staging.flags = 0; in il_mac_config()
5113 il_set_flags_for_band(il, channel->band, il->vif); in il_mac_config()
5115 spin_unlock_irqrestore(&il->lock, flags); in il_mac_config()
5117 if (il->ops->update_bcast_stations) in il_mac_config()
5118 ret = il->ops->update_bcast_stations(il); in il_mac_config()
5128 il->power_data.ps_disabled = !(conf->flags & IEEE80211_CONF_PS); in il_mac_config()
5129 if (!il->power_data.ps_disabled) in il_mac_config()
5137 D_MAC80211("TX Power old=%d new=%d\n", il->tx_power_user_lmt, in il_mac_config()
5138 conf->power_level); in il_mac_config()
5140 il_set_tx_power(il, conf->power_level, false); in il_mac_config()
5144 D_MAC80211("leave - not ready\n"); in il_mac_config()
5151 if (memcmp(&il->active, &il->staging, sizeof(il->staging))) in il_mac_config()
5154 D_INFO("Not re-sending same RXON configuration.\n"); in il_mac_config()
5160 mutex_unlock(&il->mutex); in il_mac_config()
5169 struct il_priv *il = hw->priv; in il_mac_reset_tsf()
5172 mutex_lock(&il->mutex); in il_mac_reset_tsf()
5173 D_MAC80211("enter: type %d, addr %pM\n", vif->type, vif->addr); in il_mac_reset_tsf()
5175 spin_lock_irqsave(&il->lock, flags); in il_mac_reset_tsf()
5177 memset(&il->current_ht_config, 0, sizeof(struct il_ht_config)); in il_mac_reset_tsf()
5180 dev_consume_skb_irq(il->beacon_skb); in il_mac_reset_tsf()
5181 il->beacon_skb = NULL; in il_mac_reset_tsf()
5182 il->timestamp = 0; in il_mac_reset_tsf()
5184 spin_unlock_irqrestore(&il->lock, flags); in il_mac_reset_tsf()
5188 D_MAC80211("leave - not ready\n"); in il_mac_reset_tsf()
5189 mutex_unlock(&il->mutex); in il_mac_reset_tsf()
5194 il->staging.filter_flags &= ~RXON_FILTER_ASSOC_MSK; in il_mac_reset_tsf()
5200 mutex_unlock(&il->mutex); in il_mac_reset_tsf()
5207 struct il_ht_config *ht_conf = &il->current_ht_config; in il_ht_conf()
5209 struct ieee80211_bss_conf *bss_conf = &vif->bss_conf; in il_ht_conf()
5213 if (!il->ht.enabled) in il_ht_conf()
5216 il->ht.protection = in il_ht_conf()
5217 bss_conf->ht_operation_mode & IEEE80211_HT_OP_MODE_PROTECTION; in il_ht_conf()
5218 il->ht.non_gf_sta_present = in il_ht_conf()
5219 !!(bss_conf-> in il_ht_conf()
5222 ht_conf->single_chain_sufficient = false; in il_ht_conf()
5224 switch (vif->type) { in il_ht_conf()
5227 sta = ieee80211_find_sta(vif, bss_conf->bssid); in il_ht_conf()
5229 struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap; in il_ht_conf()
5233 (ht_cap->mcs. in il_ht_conf()
5238 if (ht_cap->mcs.rx_mask[1] == 0 && in il_ht_conf()
5239 ht_cap->mcs.rx_mask[2] == 0) in il_ht_conf()
5240 ht_conf->single_chain_sufficient = true; in il_ht_conf()
5242 ht_conf->single_chain_sufficient = true; in il_ht_conf()
5250 ht_conf->single_chain_sufficient = true; in il_ht_conf()
5255 ht_conf->single_chain_sufficient = true; in il_ht_conf()
5272 il->staging.filter_flags &= ~RXON_FILTER_ASSOC_MSK; in il_set_no_assoc()
5273 il->staging.assoc_id = 0; in il_set_no_assoc()
5280 struct il_priv *il = hw->priv; in il_beacon_update()
5290 lockdep_assert_held(&il->mutex); in il_beacon_update()
5292 if (!il->beacon_enabled) { in il_beacon_update()
5298 spin_lock_irqsave(&il->lock, flags); in il_beacon_update()
5299 dev_consume_skb_irq(il->beacon_skb); in il_beacon_update()
5300 il->beacon_skb = skb; in il_beacon_update()
5302 timestamp = ((struct ieee80211_mgmt *)skb->data)->u.beacon.timestamp; in il_beacon_update()
5303 il->timestamp = le64_to_cpu(timestamp); in il_beacon_update()
5306 spin_unlock_irqrestore(&il->lock, flags); in il_beacon_update()
5309 D_MAC80211("leave - RF not ready\n"); in il_beacon_update()
5313 il->ops->post_associate(il); in il_beacon_update()
5320 struct il_priv *il = hw->priv; in il_mac_bss_info_changed()
5323 mutex_lock(&il->mutex); in il_mac_bss_info_changed()
5327 D_MAC80211("leave - not alive\n"); in il_mac_bss_info_changed()
5328 mutex_unlock(&il->mutex); in il_mac_bss_info_changed()
5335 spin_lock_irqsave(&il->lock, flags); in il_mac_bss_info_changed()
5336 il->qos_data.qos_active = bss_conf->qos; in il_mac_bss_info_changed()
5338 spin_unlock_irqrestore(&il->lock, flags); in il_mac_bss_info_changed()
5343 if (vif->bss_conf.enable_beacon) in il_mac_bss_info_changed()
5344 il->beacon_enabled = true; in il_mac_bss_info_changed()
5346 il->beacon_enabled = false; in il_mac_bss_info_changed()
5350 D_MAC80211("BSSID %pM\n", bss_conf->bssid); in il_mac_bss_info_changed()
5360 if (is_zero_ether_addr(bss_conf->bssid)) in il_mac_bss_info_changed()
5369 D_MAC80211("leave - scan abort failed\n"); in il_mac_bss_info_changed()
5370 mutex_unlock(&il->mutex); in il_mac_bss_info_changed()
5375 memcpy(il->staging.bssid_addr, bss_conf->bssid, ETH_ALEN); in il_mac_bss_info_changed()
5378 memcpy(il->bssid, bss_conf->bssid, ETH_ALEN); in il_mac_bss_info_changed()
5386 if (vif->type == NL80211_IFTYPE_ADHOC && (changes & BSS_CHANGED_BEACON)) in il_mac_bss_info_changed()
5390 D_MAC80211("ERP_PREAMBLE %d\n", bss_conf->use_short_preamble); in il_mac_bss_info_changed()
5391 if (bss_conf->use_short_preamble) in il_mac_bss_info_changed()
5392 il->staging.flags |= RXON_FLG_SHORT_PREAMBLE_MSK; in il_mac_bss_info_changed()
5394 il->staging.flags &= ~RXON_FLG_SHORT_PREAMBLE_MSK; in il_mac_bss_info_changed()
5398 D_MAC80211("ERP_CTS %d\n", bss_conf->use_cts_prot); in il_mac_bss_info_changed()
5399 if (bss_conf->use_cts_prot && il->band != NL80211_BAND_5GHZ) in il_mac_bss_info_changed()
5400 il->staging.flags |= RXON_FLG_TGG_PROTECT_MSK; in il_mac_bss_info_changed()
5402 il->staging.flags &= ~RXON_FLG_TGG_PROTECT_MSK; in il_mac_bss_info_changed()
5403 if (bss_conf->use_cts_prot) in il_mac_bss_info_changed()
5404 il->staging.flags |= RXON_FLG_SELF_CTS_EN; in il_mac_bss_info_changed()
5406 il->staging.flags &= ~RXON_FLG_SELF_CTS_EN; in il_mac_bss_info_changed()
5415 if (A-band) in il_mac_bss_info_changed()
5416 il->staging.ofdm_basic_rates = in il_mac_bss_info_changed()
5417 bss_conf->basic_rates; in il_mac_bss_info_changed()
5419 il->staging.ofdm_basic_rates = in il_mac_bss_info_changed()
5420 bss_conf->basic_rates >> 4; in il_mac_bss_info_changed()
5421 il->staging.cck_basic_rates = in il_mac_bss_info_changed()
5422 bss_conf->basic_rates & 0xF; in il_mac_bss_info_changed()
5429 if (il->ops->set_rxon_chain) in il_mac_bss_info_changed()
5430 il->ops->set_rxon_chain(il); in il_mac_bss_info_changed()
5434 D_MAC80211("ASSOC %d\n", vif->cfg.assoc); in il_mac_bss_info_changed()
5435 if (vif->cfg.assoc) { in il_mac_bss_info_changed()
5436 il->timestamp = bss_conf->sync_tsf; in il_mac_bss_info_changed()
5439 il->ops->post_associate(il); in il_mac_bss_info_changed()
5444 if (changes && il_is_associated(il) && vif->cfg.aid) { in il_mac_bss_info_changed()
5449 memcpy((void *)&il->active, &il->staging, in il_mac_bss_info_changed()
5455 if (vif->bss_conf.enable_beacon) { in il_mac_bss_info_changed()
5456 memcpy(il->staging.bssid_addr, bss_conf->bssid, in il_mac_bss_info_changed()
5458 memcpy(il->bssid, bss_conf->bssid, ETH_ALEN); in il_mac_bss_info_changed()
5459 il->ops->config_ap(il); in il_mac_bss_info_changed()
5465 ret = il->ops->manage_ibss_station(il, vif, in il_mac_bss_info_changed()
5466 vif->cfg.ibss_joined); in il_mac_bss_info_changed()
5469 vif->cfg.ibss_joined ? "add" : "remove", in il_mac_bss_info_changed()
5470 bss_conf->bssid); in il_mac_bss_info_changed()
5474 mutex_unlock(&il->mutex); in il_mac_bss_info_changed()
5488 spin_lock_irqsave(&il->lock, flags); in il_isr()
5491 * back-to-back ISRs and sporadic interrupts from our NIC. in il_isr()
5492 * If we have something to service, the tasklet will re-enable ints. in il_isr()
5493 * If we *don't* have something, we'll re-enable before leaving here. */ in il_isr()
5521 /* il_irq_tasklet() will service interrupts and re-enable them */ in il_isr()
5523 tasklet_schedule(&il->irq_tasklet); in il_isr()
5526 spin_unlock_irqrestore(&il->lock, flags); in il_isr()
5530 /* re-enable interrupts here since we don't have anything to service. */ in il_isr()
5531 /* only Re-enable if disabled by irq */ in il_isr()
5532 if (test_bit(S_INT_ENABLED, &il->status)) in il_isr()
5534 spin_unlock_irqrestore(&il->lock, flags); in il_isr()
5547 if (info->control.rates[0].flags & IEEE80211_TX_RC_USE_RTS_CTS) { in il_tx_cmd_protection()
5564 } else if (info->control.rates[0]. in il_tx_cmd_protection()