Lines Matching refs:il

27 _il_poll_bit(struct il_priv *il, u32 addr, u32 bits, u32 mask, int timeout)  in _il_poll_bit()  argument
33 if ((_il_rd(il, addr) & mask) == (bits & mask)) in _il_poll_bit()
66 _il_grab_nic_access(struct il_priv *il) in _il_grab_nic_access() argument
72 _il_set_bit(il, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ); in _il_grab_nic_access()
92 _il_poll_bit(il, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_VAL_MAC_ACCESS_EN, in _il_grab_nic_access()
96 val = _il_rd(il, CSR_GP_CNTRL); in _il_grab_nic_access()
99 _il_wr(il, CSR_RESET, CSR_RESET_REG_FLAG_FORCE_NMI); in _il_grab_nic_access()
108 il_poll_bit(struct il_priv *il, u32 addr, u32 mask, int timeout) in il_poll_bit() argument
114 if ((il_rd(il, addr) & mask) == mask) in il_poll_bit()
125 il_rd_prph(struct il_priv *il, u32 reg) in il_rd_prph() argument
130 spin_lock_irqsave(&il->reg_lock, reg_flags); in il_rd_prph()
131 _il_grab_nic_access(il); in il_rd_prph()
132 val = _il_rd_prph(il, reg); in il_rd_prph()
133 _il_release_nic_access(il); in il_rd_prph()
134 spin_unlock_irqrestore(&il->reg_lock, reg_flags); in il_rd_prph()
140 il_wr_prph(struct il_priv *il, u32 addr, u32 val) in il_wr_prph() argument
144 spin_lock_irqsave(&il->reg_lock, reg_flags); in il_wr_prph()
145 if (likely(_il_grab_nic_access(il))) { in il_wr_prph()
146 _il_wr_prph(il, addr, val); in il_wr_prph()
147 _il_release_nic_access(il); in il_wr_prph()
149 spin_unlock_irqrestore(&il->reg_lock, reg_flags); in il_wr_prph()
154 il_read_targ_mem(struct il_priv *il, u32 addr) in il_read_targ_mem() argument
159 spin_lock_irqsave(&il->reg_lock, reg_flags); in il_read_targ_mem()
160 _il_grab_nic_access(il); in il_read_targ_mem()
162 _il_wr(il, HBUS_TARG_MEM_RADDR, addr); in il_read_targ_mem()
163 value = _il_rd(il, HBUS_TARG_MEM_RDAT); in il_read_targ_mem()
165 _il_release_nic_access(il); in il_read_targ_mem()
166 spin_unlock_irqrestore(&il->reg_lock, reg_flags); in il_read_targ_mem()
172 il_write_targ_mem(struct il_priv *il, u32 addr, u32 val) in il_write_targ_mem() argument
176 spin_lock_irqsave(&il->reg_lock, reg_flags); in il_write_targ_mem()
177 if (likely(_il_grab_nic_access(il))) { in il_write_targ_mem()
178 _il_wr(il, HBUS_TARG_MEM_WADDR, addr); in il_write_targ_mem()
179 _il_wr(il, HBUS_TARG_MEM_WDAT, val); in il_write_targ_mem()
180 _il_release_nic_access(il); in il_write_targ_mem()
182 spin_unlock_irqrestore(&il->reg_lock, reg_flags); in il_write_targ_mem()
241 il_generic_cmd_callback(struct il_priv *il, struct il_device_cmd *cmd, in il_generic_cmd_callback() argument
264 il_send_cmd_async(struct il_priv *il, struct il_host_cmd *cmd) in il_send_cmd_async() argument
277 if (test_bit(S_EXIT_PENDING, &il->status)) in il_send_cmd_async()
280 ret = il_enqueue_hcmd(il, cmd); in il_send_cmd_async()
290 il_send_cmd_sync(struct il_priv *il, struct il_host_cmd *cmd) in il_send_cmd_sync() argument
295 lockdep_assert_held(&il->mutex); in il_send_cmd_sync()
305 set_bit(S_HCMD_ACTIVE, &il->status); in il_send_cmd_sync()
309 cmd_idx = il_enqueue_hcmd(il, cmd); 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()
326 clear_bit(S_HCMD_ACTIVE, &il->status); in il_send_cmd_sync()
334 if (test_bit(S_RFKILL, &il->status)) { in il_send_cmd_sync()
340 if (test_bit(S_FW_ERROR, &il->status)) { in il_send_cmd_sync()
364 il->txq[il->cmd_queue].meta[cmd_idx].flags &= ~CMD_WANT_SKB; in il_send_cmd_sync()
368 il_free_pages(il, cmd->reply_page); in il_send_cmd_sync()
377 il_send_cmd(struct il_priv *il, struct il_host_cmd *cmd) in il_send_cmd() argument
380 return il_send_cmd_async(il, cmd); in il_send_cmd()
382 return il_send_cmd_sync(il, cmd); in il_send_cmd()
387 il_send_cmd_pdu(struct il_priv *il, u8 id, u16 len, const void *data) in il_send_cmd_pdu() argument
395 return il_send_cmd_sync(il, &cmd); in il_send_cmd_pdu()
400 il_send_cmd_pdu_async(struct il_priv *il, u8 id, u16 len, const void *data, in il_send_cmd_pdu_async() argument
401 void (*callback) (struct il_priv *il, in il_send_cmd_pdu_async()
414 return il_send_cmd_async(il, &cmd); in il_send_cmd_pdu_async()
462 il_blink_compensation(struct il_priv *il, u8 time, u16 compensation) in il_blink_compensation() argument
475 il_led_cmd(struct il_priv *il, unsigned long on, unsigned long off) in il_led_cmd() argument
483 if (!test_bit(S_READY, &il->status)) 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()
497 il_blink_compensation(il, on, in il_led_cmd()
498 il->cfg->led_compensation); in il_led_cmd()
500 il_blink_compensation(il, off, 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()
515 struct il_priv *il = container_of(led_cdev, struct il_priv, led); in il_led_brightness_set() local
521 il_led_cmd(il, on, 0); in il_led_brightness_set()
528 struct il_priv *il = container_of(led_cdev, struct il_priv, led); in il_led_blink_set() local
530 return il_led_cmd(il, *delay_on, *delay_off); in il_led_blink_set()
534 il_leds_init(struct il_priv *il) in il_leds_init() argument
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 il->led.brightness_set = il_led_brightness_set; in il_leds_init()
545 il->led.blink_set = il_led_blink_set; in il_leds_init()
546 il->led.max_brightness = 1; in il_leds_init()
553 il->led.default_trigger = in il_leds_init()
554 ieee80211_create_tpt_led_trigger(il->hw, in il_leds_init()
560 il->led.default_trigger = ieee80211_get_radio_led_name(il->hw); in il_leds_init()
564 ret = led_classdev_register(&il->pci_dev->dev, &il->led); in il_leds_init()
566 kfree(il->led.name); in il_leds_init()
570 il->led_registered = true; in il_leds_init()
575 il_leds_exit(struct il_priv *il) in il_leds_exit() argument
577 if (!il->led_registered) in il_leds_exit()
580 led_classdev_unregister(&il->led); in il_leds_exit()
581 kfree(il->led.name); in il_leds_exit()
653 il_eeprom_verify_signature(struct il_priv *il) in il_eeprom_verify_signature() argument
655 u32 gp = _il_rd(il, CSR_EEPROM_GP) & CSR_EEPROM_GP_VALID_MSK; in il_eeprom_verify_signature()
672 il_eeprom_query_addr(const struct il_priv *il, size_t offset) in il_eeprom_query_addr() argument
674 BUG_ON(offset >= il->cfg->eeprom_size); in il_eeprom_query_addr()
675 return &il->eeprom[offset]; in il_eeprom_query_addr()
680 il_eeprom_query16(const struct il_priv *il, size_t offset) in il_eeprom_query16() argument
682 if (!il->eeprom) in il_eeprom_query16()
684 return (u16) il->eeprom[offset] | ((u16) il->eeprom[offset + 1] << 8); in il_eeprom_query16()
696 il_eeprom_init(struct il_priv *il) in il_eeprom_init() argument
699 u32 gp = _il_rd(il, CSR_EEPROM_GP); in il_eeprom_init()
705 sz = il->cfg->eeprom_size; in il_eeprom_init()
707 il->eeprom = kzalloc(sz, GFP_KERNEL); in il_eeprom_init()
708 if (!il->eeprom) in il_eeprom_init()
711 e = (__le16 *) il->eeprom; in il_eeprom_init()
713 il->ops->apm_init(il); in il_eeprom_init()
715 ret = il_eeprom_verify_signature(il); in il_eeprom_init()
723 ret = il->ops->eeprom_acquire_semaphore(il); in il_eeprom_init()
734 _il_wr(il, CSR_EEPROM_REG, in il_eeprom_init()
738 _il_poll_bit(il, CSR_EEPROM_REG, in il_eeprom_init()
746 r = _il_rd(il, CSR_EEPROM_REG); in il_eeprom_init()
751 il_eeprom_query16(il, EEPROM_VERSION)); in il_eeprom_init()
755 il->ops->eeprom_release_semaphore(il); in il_eeprom_init()
759 il_eeprom_free(il); in il_eeprom_init()
761 il_apm_stop(il); in il_eeprom_init()
767 il_eeprom_free(struct il_priv *il) in il_eeprom_free() argument
769 kfree(il->eeprom); in il_eeprom_free()
770 il->eeprom = NULL; in il_eeprom_free()
775 il_init_band_reference(const struct il_priv *il, int eep_band, in il_init_band_reference() argument
780 u32 offset = il->cfg->regulatory_bands[eep_band - 1]; in il_init_band_reference()
786 (struct il_eeprom_channel *)il_eeprom_query_addr(il, in il_init_band_reference()
793 (struct il_eeprom_channel *)il_eeprom_query_addr(il, in il_init_band_reference()
800 (struct il_eeprom_channel *)il_eeprom_query_addr(il, in il_init_band_reference()
807 (struct il_eeprom_channel *)il_eeprom_query_addr(il, in il_init_band_reference()
814 (struct il_eeprom_channel *)il_eeprom_query_addr(il, in il_init_band_reference()
821 (struct il_eeprom_channel *)il_eeprom_query_addr(il, in il_init_band_reference()
828 (struct il_eeprom_channel *)il_eeprom_query_addr(il, in il_init_band_reference()
845 il_mod_ht40_chan_info(struct il_priv *il, enum nl80211_band band, u16 channel, in il_mod_ht40_chan_info() argument
852 (struct il_channel_info *)il_get_channel_info(il, band, channel); in il_mod_ht40_chan_info()
884 il_init_channel_map(struct il_priv *il) in il_init_channel_map() argument
892 if (il->channel_count) { in il_init_channel_map()
899 il->channel_count = in il_init_channel_map()
904 D_EEPROM("Parsing data for %d channels.\n", il->channel_count); in il_init_channel_map()
906 il->channel_info = in il_init_channel_map()
907 kcalloc(il->channel_count, sizeof(struct il_channel_info), in il_init_channel_map()
909 if (!il->channel_info) { in il_init_channel_map()
911 il->channel_count = 0; in il_init_channel_map()
915 ch_info = il->channel_info; in il_init_channel_map()
922 il_init_band_reference(il, band, &eeprom_ch_count, in il_init_channel_map()
982 if (il->cfg->regulatory_bands[5] == EEPROM_REGULATORY_BAND_NO_HT40 && in il_init_channel_map()
983 il->cfg->regulatory_bands[6] == EEPROM_REGULATORY_BAND_NO_HT40) in il_init_channel_map()
990 il_init_band_reference(il, band, &eeprom_ch_count, in il_init_channel_map()
1000 il_mod_ht40_chan_info(il, ieeeband, eeprom_ch_idx[ch], in il_init_channel_map()
1005 il_mod_ht40_chan_info(il, ieeeband, in il_init_channel_map()
1020 il_free_channel_map(struct il_priv *il) in il_free_channel_map() argument
1022 kfree(il->channel_info); in il_free_channel_map()
1023 il->channel_count = 0; in il_free_channel_map()
1033 il_get_channel_info(const struct il_priv *il, enum nl80211_band band, in il_get_channel_info() argument
1040 for (i = 14; i < il->channel_count; i++) { in il_get_channel_info()
1041 if (il->channel_info[i].channel == channel) in il_get_channel_info()
1042 return &il->channel_info[i]; in il_get_channel_info()
1047 return &il->channel_info[channel - 1]; in il_get_channel_info()
1073 il_build_powertable_cmd(struct il_priv *il, struct il_powertable_cmd *cmd) in il_build_powertable_cmd() argument
1086 if (il->power_data.pci_pm) in il_build_powertable_cmd()
1090 if (il->power_data.ps_disabled) in il_build_powertable_cmd()
1100 dtim_period = il->vif ? il->vif->bss_conf.dtim_period : 0; in il_build_powertable_cmd()
1140 il_set_power(struct il_priv *il, struct il_powertable_cmd *cmd) in il_set_power() argument
1153 return il_send_cmd_pdu(il, C_POWER_TBL, in il_set_power()
1158 il_power_set_mode(struct il_priv *il, struct il_powertable_cmd *cmd, bool force) in il_power_set_mode() argument
1163 lockdep_assert_held(&il->mutex); in il_power_set_mode()
1166 update_chains = il->chain_noise_data.state == IL_CHAIN_NOISE_DONE || in il_power_set_mode()
1167 il->chain_noise_data.state == IL_CHAIN_NOISE_ALIVE; in il_power_set_mode()
1169 if (!memcmp(&il->power_data.sleep_cmd, cmd, sizeof(*cmd)) && !force) in il_power_set_mode()
1172 if (!il_is_ready_rf(il)) in il_power_set_mode()
1176 memcpy(&il->power_data.sleep_cmd_next, cmd, sizeof(*cmd)); in il_power_set_mode()
1177 if (test_bit(S_SCANNING, &il->status) && !force) { in il_power_set_mode()
1183 set_bit(S_POWER_PMI, &il->status); in il_power_set_mode()
1185 ret = il_set_power(il, cmd); in il_power_set_mode()
1188 clear_bit(S_POWER_PMI, &il->status); in il_power_set_mode()
1190 if (il->ops->update_chain_flags && update_chains) in il_power_set_mode()
1191 il->ops->update_chain_flags(il); in il_power_set_mode()
1192 else if (il->ops->update_chain_flags) in il_power_set_mode()
1195 il->chain_noise_data.state); in il_power_set_mode()
1197 memcpy(&il->power_data.sleep_cmd, cmd, sizeof(*cmd)); in il_power_set_mode()
1205 il_power_update_mode(struct il_priv *il, bool force) in il_power_update_mode() argument
1209 il_build_powertable_cmd(il, &cmd); in il_power_update_mode()
1211 return il_power_set_mode(il, &cmd, force); in il_power_update_mode()
1217 il_power_initialize(struct il_priv *il) in il_power_initialize() argument
1221 pcie_capability_read_word(il->pci_dev, PCI_EXP_LNKCTL, &lctl); in il_power_initialize()
1222 il->power_data.pci_pm = !(lctl & PCI_EXP_LNKCTL_ASPM_L0S); in il_power_initialize()
1224 il->power_data.debug_sleep_level_override = -1; in il_power_initialize()
1226 memset(&il->power_data.sleep_cmd, 0, sizeof(il->power_data.sleep_cmd)); in il_power_initialize()
1248 il_send_scan_abort(struct il_priv *il) in il_send_scan_abort() argument
1260 if (!test_bit(S_READY, &il->status) || in il_send_scan_abort()
1261 !test_bit(S_GEO_CONFIGURED, &il->status) || in il_send_scan_abort()
1262 !test_bit(S_SCAN_HW, &il->status) || in il_send_scan_abort()
1263 test_bit(S_FW_ERROR, &il->status) || in il_send_scan_abort()
1264 test_bit(S_EXIT_PENDING, &il->status)) in il_send_scan_abort()
1267 ret = il_send_cmd_sync(il, &cmd); in il_send_scan_abort()
1283 il_free_pages(il, cmd.reply_page); in il_send_scan_abort()
1288 il_complete_scan(struct il_priv *il, bool aborted) in il_complete_scan() argument
1295 if (il->scan_request) { in il_complete_scan()
1297 ieee80211_scan_completed(il->hw, &info); in il_complete_scan()
1300 il->scan_vif = NULL; in il_complete_scan()
1301 il->scan_request = NULL; in il_complete_scan()
1305 il_force_scan_end(struct il_priv *il) in il_force_scan_end() argument
1307 lockdep_assert_held(&il->mutex); in il_force_scan_end()
1309 if (!test_bit(S_SCANNING, &il->status)) { in il_force_scan_end()
1315 clear_bit(S_SCANNING, &il->status); in il_force_scan_end()
1316 clear_bit(S_SCAN_HW, &il->status); in il_force_scan_end()
1317 clear_bit(S_SCAN_ABORTING, &il->status); in il_force_scan_end()
1318 il_complete_scan(il, true); in il_force_scan_end()
1322 il_do_scan_abort(struct il_priv *il) in il_do_scan_abort() argument
1326 lockdep_assert_held(&il->mutex); in il_do_scan_abort()
1328 if (!test_bit(S_SCANNING, &il->status)) { in il_do_scan_abort()
1333 if (test_and_set_bit(S_SCAN_ABORTING, &il->status)) { in il_do_scan_abort()
1338 ret = il_send_scan_abort(il); in il_do_scan_abort()
1341 il_force_scan_end(il); in il_do_scan_abort()
1350 il_scan_cancel(struct il_priv *il) in il_scan_cancel() argument
1353 queue_work(il->workqueue, &il->abort_scan); in il_scan_cancel()
1364 il_scan_cancel_timeout(struct il_priv *il, unsigned long ms) in il_scan_cancel_timeout() argument
1368 lockdep_assert_held(&il->mutex); in il_scan_cancel_timeout()
1372 il_do_scan_abort(il); in il_scan_cancel_timeout()
1375 if (!test_bit(S_SCAN_HW, &il->status)) in il_scan_cancel_timeout()
1380 return test_bit(S_SCAN_HW, &il->status); in il_scan_cancel_timeout()
1386 il_hdl_scan(struct il_priv *il, struct il_rx_buf *rxb) in il_hdl_scan() argument
1399 il_hdl_scan_start(struct il_priv *il, struct il_rx_buf *rxb) in il_hdl_scan_start() argument
1404 il->scan_start_tsf = le32_to_cpu(notif->tsf_low); in il_hdl_scan_start()
1413 il_hdl_scan_results(struct il_priv *il, struct il_rx_buf *rxb) in il_hdl_scan_results() argument
1424 le32_to_cpu(notif->tsf_low) - il->scan_start_tsf); in il_hdl_scan_results()
1430 il_hdl_scan_complete(struct il_priv *il, struct il_rx_buf *rxb) in il_hdl_scan_complete() argument
1443 clear_bit(S_SCAN_HW, &il->status); in il_hdl_scan_complete()
1446 (il->scan_band == NL80211_BAND_2GHZ) ? "2.4" : "5.2", in il_hdl_scan_complete()
1447 jiffies_to_msecs(jiffies - il->scan_start)); in il_hdl_scan_complete()
1449 queue_work(il->workqueue, &il->scan_completed); in il_hdl_scan_complete()
1453 il_setup_rx_scan_handlers(struct il_priv *il) in il_setup_rx_scan_handlers() argument
1456 il->handlers[C_SCAN] = il_hdl_scan; in il_setup_rx_scan_handlers()
1457 il->handlers[N_SCAN_START] = il_hdl_scan_start; in il_setup_rx_scan_handlers()
1458 il->handlers[N_SCAN_RESULTS] = il_hdl_scan_results; in il_setup_rx_scan_handlers()
1459 il->handlers[N_SCAN_COMPLETE] = il_hdl_scan_complete; in il_setup_rx_scan_handlers()
1464 il_get_active_dwell_time(struct il_priv *il, enum nl80211_band band, in il_get_active_dwell_time() argument
1477 il_get_passive_dwell_time(struct il_priv *il, enum nl80211_band band, in il_get_passive_dwell_time() argument
1488 if (il_is_any_associated(il)) { in il_get_passive_dwell_time()
1494 value = il->vif ? il->vif->bss_conf.beacon_int : 0; in il_get_passive_dwell_time()
1506 il_init_scan_params(struct il_priv *il) in il_init_scan_params() argument
1508 u8 ant_idx = fls(il->hw_params.valid_tx_ant) - 1; in il_init_scan_params()
1509 if (!il->scan_tx_ant[NL80211_BAND_5GHZ]) in il_init_scan_params()
1510 il->scan_tx_ant[NL80211_BAND_5GHZ] = ant_idx; in il_init_scan_params()
1511 if (!il->scan_tx_ant[NL80211_BAND_2GHZ]) in il_init_scan_params()
1512 il->scan_tx_ant[NL80211_BAND_2GHZ] = ant_idx; in il_init_scan_params()
1517 il_scan_initiate(struct il_priv *il, struct ieee80211_vif *vif) in il_scan_initiate() argument
1521 lockdep_assert_held(&il->mutex); in il_scan_initiate()
1523 cancel_delayed_work(&il->scan_check); in il_scan_initiate()
1525 if (!il_is_ready_rf(il)) { in il_scan_initiate()
1530 if (test_bit(S_SCAN_HW, &il->status)) { in il_scan_initiate()
1535 if (test_bit(S_SCAN_ABORTING, &il->status)) { in il_scan_initiate()
1542 set_bit(S_SCANNING, &il->status); in il_scan_initiate()
1543 il->scan_start = jiffies; in il_scan_initiate()
1545 ret = il->ops->request_scan(il, vif); in il_scan_initiate()
1547 clear_bit(S_SCANNING, &il->status); in il_scan_initiate()
1551 queue_delayed_work(il->workqueue, &il->scan_check, in il_scan_initiate()
1562 struct il_priv *il = hw->priv; in il_mac_hw_scan() local
1570 mutex_lock(&il->mutex); in il_mac_hw_scan()
1573 if (test_bit(S_SCANNING, &il->status)) { in il_mac_hw_scan()
1580 il->scan_request = req; in il_mac_hw_scan()
1581 il->scan_vif = vif; in il_mac_hw_scan()
1582 il->scan_band = req->channels[0]->band; in il_mac_hw_scan()
1584 ret = il_scan_initiate(il, vif); in il_mac_hw_scan()
1588 mutex_unlock(&il->mutex); in il_mac_hw_scan()
1597 struct il_priv *il = in il_bg_scan_check() local
1605 mutex_lock(&il->mutex); in il_bg_scan_check()
1606 il_force_scan_end(il); in il_bg_scan_check()
1607 mutex_unlock(&il->mutex); in il_bg_scan_check()
1615 il_fill_probe_req(struct il_priv *il, struct ieee80211_mgmt *frame, in il_fill_probe_req() argument
1662 struct il_priv *il = container_of(work, struct il_priv, abort_scan); in il_bg_abort_scan() local
1668 mutex_lock(&il->mutex); in il_bg_abort_scan()
1669 il_scan_cancel_timeout(il, 200); in il_bg_abort_scan()
1670 mutex_unlock(&il->mutex); in il_bg_abort_scan()
1676 struct il_priv *il = container_of(work, struct il_priv, scan_completed); in il_bg_scan_completed() local
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()
1694 il_complete_scan(il, aborted); in il_bg_scan_completed()
1698 if (!il_is_ready_rf(il)) 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()
1715 il_setup_scan_deferred_work(struct il_priv *il) in il_setup_scan_deferred_work() argument
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()
1724 il_cancel_scan_deferred_work(struct il_priv *il) in il_cancel_scan_deferred_work() argument
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()
1731 il_force_scan_end(il); in il_cancel_scan_deferred_work()
1732 mutex_unlock(&il->mutex); in il_cancel_scan_deferred_work()
1739 il_sta_ucode_activate(struct il_priv *il, u8 sta_id) in il_sta_ucode_activate() argument
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()
1758 il_process_add_sta_resp(struct il_priv *il, struct il_addsta_cmd *addsta, in il_process_add_sta_resp() argument
1772 spin_lock_irqsave(&il->sta_lock, flags); in il_process_add_sta_resp()
1777 il_sta_ucode_activate(il, sta_id); 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()
1812 spin_unlock_irqrestore(&il->sta_lock, flags); in il_process_add_sta_resp()
1818 il_add_sta_callback(struct il_priv *il, struct il_device_cmd *cmd, in il_add_sta_callback() argument
1823 il_process_add_sta_resp(il, addsta, pkt, false); in il_add_sta_callback()
1828 il_send_add_sta(struct il_priv *il, struct il_addsta_cmd *sta, u8 flags) in il_send_add_sta() argument
1850 cmd.len = il->ops->build_addsta_hcmd(sta, data); in il_send_add_sta()
1851 ret = il_send_cmd(il, &cmd); in il_send_add_sta()
1858 ret = il_process_add_sta_resp(il, sta, pkt, true); in il_send_add_sta()
1860 il_free_pages(il, cmd.reply_page); in il_send_add_sta()
1867 il_set_ht_add_station(struct il_priv *il, u8 idx, struct ieee80211_sta *sta) in il_set_ht_add_station() argument
1880 sta_flags = il->stations[idx].sta.station_flags; in il_set_ht_add_station()
1906 if (il_is_ht40_tx_allowed(il, &sta->ht_cap)) in il_set_ht_add_station()
1911 il->stations[idx].sta.station_flags = sta_flags; in il_set_ht_add_station()
1922 il_prep_station(struct il_priv *il, const u8 *addr, bool is_ap, in il_prep_station() argument
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()
1975 il->num_stations++; in il_prep_station()
1989 il_set_ht_add_station(il, sta_id, sta); in il_prep_station()
1992 rate = (il->band == NL80211_BAND_5GHZ) ? RATE_6M_PLCP : RATE_1M_PLCP; in il_prep_station()
2007 il_add_station_common(struct il_priv *il, const u8 *addr, bool is_ap, in il_add_station_common() argument
2016 spin_lock_irqsave(&il->sta_lock, flags_spin); in il_add_station_common()
2017 sta_id = il_prep_station(il, addr, is_ap, sta); in il_add_station_common()
2020 spin_unlock_irqrestore(&il->sta_lock, flags_spin); 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()
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()
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()
2049 ret = il_send_add_sta(il, &sta_cmd, CMD_SYNC); 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()
2069 il_sta_ucode_deactivate(struct il_priv *il, u8 sta_id) in il_sta_ucode_deactivate() argument
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()
2084 il_send_remove_station(struct il_priv *il, const u8 * addr, int sta_id, in il_send_remove_station() argument
2106 ret = il_send_cmd(il, &cmd); in il_send_remove_station()
2121 spin_lock_irqsave(&il->sta_lock, flags_spin); in il_send_remove_station()
2122 il_sta_ucode_deactivate(il, sta_id); in il_send_remove_station()
2123 spin_unlock_irqrestore(&il->sta_lock, in il_send_remove_station()
2134 il_free_pages(il, cmd.reply_page); in il_send_remove_station()
2143 il_remove_station(struct il_priv *il, const u8 sta_id, const u8 * addr) in il_remove_station() argument
2147 if (!il_is_ready(il)) { 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()
2188 return il_send_remove_station(il, addr, sta_id, false); in il_remove_station()
2190 spin_unlock_irqrestore(&il->sta_lock, flags); in il_remove_station()
2204 il_clear_ucode_stations(struct il_priv *il) in il_clear_ucode_stations() argument
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()
2236 il_restore_stations(struct il_priv *il) in il_restore_stations() argument
2246 if (!il_is_ready(il)) { in il_restore_stations()
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()
2275 ret = il_send_add_sta(il, &sta_cmd, CMD_SYNC); 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()
2291 il_send_lq_cmd(il, &lq, CMD_SYNC, true); 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()
2307 il_get_free_ucode_key_idx(struct il_priv *il) in il_get_free_ucode_key_idx() argument
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()
2320 il_dealloc_bcast_stations(struct il_priv *il) in il_dealloc_bcast_stations() argument
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()
2342 il_dump_lq_cmd(struct il_priv *il, struct il_link_quality_cmd *lq) in il_dump_lq_cmd() argument
2354 il_dump_lq_cmd(struct il_priv *il, struct il_link_quality_cmd *lq) in il_dump_lq_cmd() argument
2371 il_is_lq_table_valid(struct il_priv *il, struct il_link_quality_cmd *lq) in il_is_lq_table_valid() argument
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()
2399 il_send_lq_cmd(struct il_priv *il, struct il_link_quality_cmd *lq, in il_send_lq_cmd() argument
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()
2420 spin_unlock_irqrestore(&il->sta_lock, flags_spin); in il_send_lq_cmd()
2422 il_dump_lq_cmd(il, lq); in il_send_lq_cmd()
2425 if (il_is_lq_table_valid(il, lq)) in il_send_lq_cmd()
2426 ret = il_send_cmd(il, &cmd); 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() local
2453 mutex_lock(&il->mutex); in il_mac_sta_remove()
2456 ret = il_remove_station(il, sta_common->sta_id, sta->addr); in il_mac_sta_remove()
2461 mutex_unlock(&il->mutex); in il_mac_sta_remove()
2555 il_rx_queue_update_write_ptr(struct il_priv *il, struct il_rx_queue *q) in il_rx_queue_update_write_ptr() argument
2558 u32 rx_wrt_ptr_reg = il->hw_params.rx_wrt_ptr_reg; in il_rx_queue_update_write_ptr()
2567 if (test_bit(S_POWER_PMI, &il->status)) { in il_rx_queue_update_write_ptr()
2568 reg = _il_rd(il, CSR_UCODE_DRV_GP1); in il_rx_queue_update_write_ptr()
2573 il_set_bit(il, CSR_GP_CNTRL, 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()
2585 il_wr(il, rx_wrt_ptr_reg, q->write_actual); in il_rx_queue_update_write_ptr()
2596 il_rx_queue_alloc(struct il_priv *il) in il_rx_queue_alloc() argument
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()
2630 dma_free_coherent(&il->pci_dev->dev, 4 * RX_QUEUE_SIZE, rxq->bd, in il_rx_queue_alloc()
2638 il_hdl_spectrum_measurement(struct il_priv *il, struct il_rx_buf *rxb) in il_hdl_spectrum_measurement() argument
2648 memcpy(&il->measure_report, report, sizeof(*report)); in il_hdl_spectrum_measurement()
2649 il->measurement_status |= MEASUREMENT_READY; in il_hdl_spectrum_measurement()
2657 il_set_decrypted_flag(struct il_priv *il, struct ieee80211_hdr *hdr, in il_set_decrypted_flag() argument
2666 if (il->active.filter_flags & RXON_FILTER_DIS_DECRYPT_MSK) in il_set_decrypted_flag()
2710 il_txq_update_write_ptr(struct il_priv *il, struct il_tx_queue *txq) in il_txq_update_write_ptr() argument
2719 if (test_bit(S_POWER_PMI, &il->status)) { in il_txq_update_write_ptr()
2723 reg = _il_rd(il, CSR_UCODE_DRV_GP1); in il_txq_update_write_ptr()
2728 il_set_bit(il, CSR_GP_CNTRL, 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()
2741 _il_wr(il, HBUS_TARG_WRPTR, txq->q.write_ptr | (txq_id << 8)); in il_txq_update_write_ptr()
2750 il_tx_queue_unmap(struct il_priv *il, int txq_id) in il_tx_queue_unmap() argument
2752 struct il_tx_queue *txq = &il->txq[txq_id]; in il_tx_queue_unmap()
2759 il->ops->txq_free_tfd(il, txq); in il_tx_queue_unmap()
2774 il_tx_queue_free(struct il_priv *il, int txq_id) in il_tx_queue_free() argument
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()
2780 il_tx_queue_unmap(il, txq_id); in il_tx_queue_free()
2790 dma_free_coherent(dev, il->hw_params.tfd_size * txq->q.n_bd, in il_tx_queue_free()
2812 il_cmd_queue_unmap(struct il_priv *il) in il_cmd_queue_unmap() argument
2814 struct il_tx_queue *txq = &il->txq[il->cmd_queue]; in il_cmd_queue_unmap()
2825 pci_unmap_single(il->pci_dev, in il_cmd_queue_unmap()
2837 pci_unmap_single(il->pci_dev, in il_cmd_queue_unmap()
2855 il_cmd_queue_free(struct il_priv *il) in il_cmd_queue_free() argument
2857 struct il_tx_queue *txq = &il->txq[il->cmd_queue]; in il_cmd_queue_free()
2858 struct device *dev = &il->pci_dev->dev; in il_cmd_queue_free()
2861 il_cmd_queue_unmap(il); in il_cmd_queue_free()
2871 dma_free_coherent(dev, il->hw_params.tfd_size * txq->q.n_bd, in il_cmd_queue_free()
2931 il_queue_init(struct il_priv *il, struct il_queue *q, int slots, u32 id) in il_queue_init() argument
2965 il_tx_queue_alloc(struct il_priv *il, struct il_tx_queue *txq, u32 id) in il_tx_queue_alloc() argument
2967 struct device *dev = &il->pci_dev->dev; in il_tx_queue_alloc()
2968 size_t tfd_sz = il->hw_params.tfd_size * TFD_QUEUE_SIZE_MAX; in il_tx_queue_alloc()
2972 if (id != il->cmd_queue) { in il_tx_queue_alloc()
3005 il_tx_queue_init(struct il_priv *il, u32 txq_id) in il_tx_queue_init() argument
3009 struct il_tx_queue *txq = &il->txq[txq_id]; in il_tx_queue_init()
3019 if (txq_id == il->cmd_queue) { in il_tx_queue_init()
3047 ret = il_tx_queue_alloc(il, txq, txq_id); in il_tx_queue_init()
3062 il_queue_init(il, &txq->q, slots, txq_id); in il_tx_queue_init()
3065 il->ops->txq_init(il, txq); in il_tx_queue_init()
3082 il_tx_queue_reset(struct il_priv *il, u32 txq_id) in il_tx_queue_reset() argument
3085 struct il_tx_queue *txq = &il->txq[txq_id]; in il_tx_queue_reset()
3087 if (txq_id == il->cmd_queue) { in il_tx_queue_reset()
3099 il_queue_init(il, &txq->q, slots, txq_id); in il_tx_queue_reset()
3102 il->ops->txq_init(il, txq); in il_tx_queue_reset()
3118 il_enqueue_hcmd(struct il_priv *il, struct il_host_cmd *cmd) in il_enqueue_hcmd() argument
3120 struct il_tx_queue *txq = &il->txq[il->cmd_queue]; in il_enqueue_hcmd()
3130 cmd->len = il->ops->get_hcmd_size(cmd->id, cmd->len); in il_enqueue_hcmd()
3142 if (il_is_rfkill(il) || il_is_ctkill(il)) { in il_enqueue_hcmd()
3144 il_is_rfkill(il) ? "RF" : "CT"); in il_enqueue_hcmd()
3148 spin_lock_irqsave(&il->hcmd_lock, flags); in il_enqueue_hcmd()
3151 spin_unlock_irqrestore(&il->hcmd_lock, flags); in il_enqueue_hcmd()
3154 queue_work(il->workqueue, &il->restart); in il_enqueue_hcmd()
3163 spin_unlock_irqrestore(&il->hcmd_lock, flags); in il_enqueue_hcmd()
3182 cpu_to_le16(QUEUE_TO_SEQ(il->cmd_queue) | IDX_TO_SEQ(q->write_ptr)); in il_enqueue_hcmd()
3197 q->write_ptr, idx, il->cmd_queue); in il_enqueue_hcmd()
3204 idx, il->cmd_queue); in il_enqueue_hcmd()
3209 pci_map_single(il->pci_dev, &out_cmd->hdr, fix_size, in il_enqueue_hcmd()
3211 if (unlikely(pci_dma_mapping_error(il->pci_dev, phys_addr))) { in il_enqueue_hcmd()
3220 if (il->ops->txq_update_byte_cnt_tbl) in il_enqueue_hcmd()
3222 il->ops->txq_update_byte_cnt_tbl(il, txq, 0); in il_enqueue_hcmd()
3224 il->ops->txq_attach_buf_to_tfd(il, txq, phys_addr, fix_size, 1, in il_enqueue_hcmd()
3229 il_txq_update_write_ptr(il, txq); in il_enqueue_hcmd()
3232 spin_unlock_irqrestore(&il->hcmd_lock, flags); in il_enqueue_hcmd()
3244 il_hcmd_queue_reclaim(struct il_priv *il, int txq_id, int idx, int cmd_idx) in il_hcmd_queue_reclaim() argument
3246 struct il_tx_queue *txq = &il->txq[txq_id]; in il_hcmd_queue_reclaim()
3263 queue_work(il->workqueue, &il->restart); in il_hcmd_queue_reclaim()
3278 il_tx_cmd_complete(struct il_priv *il, struct il_rx_buf *rxb) in il_tx_cmd_complete() argument
3288 struct il_tx_queue *txq = &il->txq[il->cmd_queue]; in il_tx_cmd_complete()
3295 (txq_id != il->cmd_queue, in il_tx_cmd_complete()
3297 txq_id, il->cmd_queue, sequence, il->txq[il->cmd_queue].q.read_ptr, in il_tx_cmd_complete()
3298 il->txq[il->cmd_queue].q.write_ptr)) { in il_tx_cmd_complete()
3299 il_print_hex_error(il, pkt, 32); in il_tx_cmd_complete()
3309 pci_unmap_single(il->pci_dev, dma_unmap_addr(meta, mapping), in il_tx_cmd_complete()
3317 meta->callback(il, cmd, pkt); in il_tx_cmd_complete()
3319 spin_lock_irqsave(&il->hcmd_lock, flags); in il_tx_cmd_complete()
3321 il_hcmd_queue_reclaim(il, txq_id, idx, cmd_idx); in il_tx_cmd_complete()
3324 clear_bit(S_HCMD_ACTIVE, &il->status); in il_tx_cmd_complete()
3327 wake_up(&il->wait_command_queue); in il_tx_cmd_complete()
3333 spin_unlock_irqrestore(&il->hcmd_lock, flags); in il_tx_cmd_complete()
3371 il_init_ht_hw_capab(const struct il_priv *il, in il_init_ht_hw_capab() argument
3376 u8 rx_chains_num = il->hw_params.rx_chains_num; in il_init_ht_hw_capab()
3377 u8 tx_chains_num = il->hw_params.tx_chains_num; in il_init_ht_hw_capab()
3386 if (il->hw_params.ht40_channel & BIT(band)) { in il_init_ht_hw_capab()
3393 if (il->cfg->mod_params->amsdu_size_8K) in il_init_ht_hw_capab()
3424 il_init_geos(struct il_priv *il) in il_init_geos() argument
3434 if (il->bands[NL80211_BAND_2GHZ].n_bitrates || in il_init_geos()
3435 il->bands[NL80211_BAND_5GHZ].n_bitrates) { in il_init_geos()
3437 set_bit(S_GEO_CONFIGURED, &il->status); in il_init_geos()
3442 kcalloc(il->channel_count, sizeof(struct ieee80211_channel), in il_init_geos()
3456 sband = &il->bands[NL80211_BAND_5GHZ]; in il_init_geos()
3462 if (il->cfg->sku & IL_SKU_N) in il_init_geos()
3463 il_init_ht_hw_capab(il, &sband->ht_cap, NL80211_BAND_5GHZ); in il_init_geos()
3465 sband = &il->bands[NL80211_BAND_2GHZ]; in il_init_geos()
3471 if (il->cfg->sku & IL_SKU_N) in il_init_geos()
3472 il_init_ht_hw_capab(il, &sband->ht_cap, NL80211_BAND_2GHZ); in il_init_geos()
3474 il->ieee_channels = channels; in il_init_geos()
3475 il->ieee_rates = rates; in il_init_geos()
3477 for (i = 0; i < il->channel_count; i++) { in il_init_geos()
3478 ch = &il->channel_info[i]; in il_init_geos()
3483 sband = &il->bands[ch->band]; in il_init_geos()
3519 il->tx_power_device_lmt = max_tx_power; in il_init_geos()
3520 il->tx_power_user_lmt = max_tx_power; in il_init_geos()
3521 il->tx_power_next = max_tx_power; in il_init_geos()
3523 if (il->bands[NL80211_BAND_5GHZ].n_channels == 0 && in il_init_geos()
3524 (il->cfg->sku & IL_SKU_A)) { in il_init_geos()
3527 il->pci_dev->device, il->pci_dev->subsystem_device); in il_init_geos()
3528 il->cfg->sku &= ~IL_SKU_A; in il_init_geos()
3532 il->bands[NL80211_BAND_2GHZ].n_channels, in il_init_geos()
3533 il->bands[NL80211_BAND_5GHZ].n_channels); in il_init_geos()
3535 set_bit(S_GEO_CONFIGURED, &il->status); in il_init_geos()
3545 il_free_geos(struct il_priv *il) in il_free_geos() argument
3547 kfree(il->ieee_channels); in il_free_geos()
3548 kfree(il->ieee_rates); in il_free_geos()
3549 clear_bit(S_GEO_CONFIGURED, &il->status); in il_free_geos()
3554 il_is_channel_extension(struct il_priv *il, enum nl80211_band band, in il_is_channel_extension() argument
3559 ch_info = il_get_channel_info(il, band, channel); in il_is_channel_extension()
3574 il_is_ht40_tx_allowed(struct il_priv *il, struct ieee80211_sta_ht_cap *ht_cap) in il_is_ht40_tx_allowed() argument
3576 if (!il->ht.enabled || !il->ht.is_40mhz) in il_is_ht40_tx_allowed()
3587 if (il->disable_ht40) in il_is_ht40_tx_allowed()
3591 return il_is_channel_extension(il, il->band, in il_is_ht40_tx_allowed()
3592 le16_to_cpu(il->staging.channel), in il_is_ht40_tx_allowed()
3593 il->ht.extension_chan_offset); in il_is_ht40_tx_allowed()
3632 il_send_rxon_timing(struct il_priv *il) in il_send_rxon_timing() argument
3638 struct ieee80211_vif *vif = il->vif; in il_send_rxon_timing()
3640 conf = &il->hw->conf; in il_send_rxon_timing()
3642 lockdep_assert_held(&il->mutex); in il_send_rxon_timing()
3644 memset(&il->timing, 0, sizeof(struct il_rxon_time_cmd)); in il_send_rxon_timing()
3646 il->timing.timestamp = cpu_to_le64(il->timestamp); in il_send_rxon_timing()
3647 il->timing.listen_interval = cpu_to_le16(conf->listen_interval); in il_send_rxon_timing()
3655 il->timing.atim_win = 0; in il_send_rxon_timing()
3659 il->hw_params.max_beacon_itrvl * in il_send_rxon_timing()
3661 il->timing.beacon_interval = cpu_to_le16(beacon_int); in il_send_rxon_timing()
3663 tsf = il->timestamp; /* tsf is modifed by do_div: copy it */ in il_send_rxon_timing()
3666 il->timing.beacon_init_val = cpu_to_le32(interval_tm - rem); in il_send_rxon_timing()
3668 il->timing.dtim_period = vif ? (vif->bss_conf.dtim_period ? : 1) : 1; in il_send_rxon_timing()
3671 le16_to_cpu(il->timing.beacon_interval), in il_send_rxon_timing()
3672 le32_to_cpu(il->timing.beacon_init_val), in il_send_rxon_timing()
3673 le16_to_cpu(il->timing.atim_win)); in il_send_rxon_timing()
3675 return il_send_cmd_pdu(il, C_RXON_TIMING, sizeof(il->timing), in il_send_rxon_timing()
3676 &il->timing); in il_send_rxon_timing()
3681 il_set_rxon_hwcrypto(struct il_priv *il, int hw_decrypt) in il_set_rxon_hwcrypto() argument
3683 struct il_rxon_cmd *rxon = &il->staging; in il_set_rxon_hwcrypto()
3695 il_check_rxon_cmd(struct il_priv *il) in il_check_rxon_cmd() argument
3697 struct il_rxon_cmd *rxon = &il->staging; in il_check_rxon_cmd()
3775 il_full_rxon_required(struct il_priv *il) in il_full_rxon_required() argument
3777 const struct il_rxon_cmd *staging = &il->staging; in il_full_rxon_required()
3778 const struct il_rxon_cmd *active = &il->active; in il_full_rxon_required()
3795 CHK(!il_is_associated(il)); in il_full_rxon_required()
3829 il_get_lowest_plcp(struct il_priv *il) in il_get_lowest_plcp() argument
3835 if (il->staging.flags & RXON_FLG_BAND_24G_MSK) in il_get_lowest_plcp()
3843 _il_set_rxon_ht(struct il_priv *il, struct il_ht_config *ht_conf) in _il_set_rxon_ht() argument
3845 struct il_rxon_cmd *rxon = &il->staging; in _il_set_rxon_ht()
3847 if (!il->ht.enabled) { in _il_set_rxon_ht()
3856 cpu_to_le32(il->ht.protection << RXON_FLG_HT_OPERATING_MODE_POS); in _il_set_rxon_ht()
3863 if (il_is_ht40_tx_allowed(il, NULL)) { in _il_set_rxon_ht()
3865 if (il->ht.protection == IEEE80211_HT_OP_MODE_PROTECTION_20MHZ) { in _il_set_rxon_ht()
3868 switch (il->ht.extension_chan_offset) { in _il_set_rxon_ht()
3879 switch (il->ht.extension_chan_offset) { in _il_set_rxon_ht()
3900 if (il->ops->set_rxon_chain) in _il_set_rxon_ht()
3901 il->ops->set_rxon_chain(il); in _il_set_rxon_ht()
3905 il->ht.protection, il->ht.extension_chan_offset); in _il_set_rxon_ht()
3909 il_set_rxon_ht(struct il_priv *il, struct il_ht_config *ht_conf) in il_set_rxon_ht() argument
3911 _il_set_rxon_ht(il, ht_conf); in il_set_rxon_ht()
3917 il_get_single_channel_number(struct il_priv *il, enum nl80211_band band) in il_get_single_channel_number() argument
3926 max = il->channel_count; in il_get_single_channel_number()
3933 channel = il->channel_info[i].channel; in il_get_single_channel_number()
3934 if (channel == le16_to_cpu(il->staging.channel)) in il_get_single_channel_number()
3937 ch_info = il_get_channel_info(il, band, channel); in il_get_single_channel_number()
3954 il_set_rxon_channel(struct il_priv *il, struct ieee80211_channel *ch) in il_set_rxon_channel() argument
3959 if (le16_to_cpu(il->staging.channel) == channel && il->band == band) in il_set_rxon_channel()
3962 il->staging.channel = cpu_to_le16(channel); in il_set_rxon_channel()
3964 il->staging.flags &= ~RXON_FLG_BAND_24G_MSK; in il_set_rxon_channel()
3966 il->staging.flags |= RXON_FLG_BAND_24G_MSK; in il_set_rxon_channel()
3968 il->band = band; in il_set_rxon_channel()
3977 il_set_flags_for_band(struct il_priv *il, enum nl80211_band band, in il_set_flags_for_band() argument
3981 il->staging.flags &= in il_set_flags_for_band()
3984 il->staging.flags |= RXON_FLG_SHORT_SLOT_MSK; in il_set_flags_for_band()
3988 il->staging.flags |= RXON_FLG_SHORT_SLOT_MSK; in il_set_flags_for_band()
3990 il->staging.flags &= ~RXON_FLG_SHORT_SLOT_MSK; in il_set_flags_for_band()
3992 il->staging.flags |= RXON_FLG_BAND_24G_MSK; in il_set_flags_for_band()
3993 il->staging.flags |= RXON_FLG_AUTO_DETECT_MSK; in il_set_flags_for_band()
3994 il->staging.flags &= ~RXON_FLG_CCK_MSK; in il_set_flags_for_band()
4003 il_connection_init_rx_config(struct il_priv *il) in il_connection_init_rx_config() argument
4007 memset(&il->staging, 0, sizeof(il->staging)); in il_connection_init_rx_config()
4009 switch (il->iw_mode) { in il_connection_init_rx_config()
4011 il->staging.dev_type = RXON_DEV_TYPE_ESS; in il_connection_init_rx_config()
4014 il->staging.dev_type = RXON_DEV_TYPE_ESS; in il_connection_init_rx_config()
4015 il->staging.filter_flags = RXON_FILTER_ACCEPT_GRP_MSK; in il_connection_init_rx_config()
4018 il->staging.dev_type = RXON_DEV_TYPE_IBSS; in il_connection_init_rx_config()
4019 il->staging.flags = RXON_FLG_SHORT_PREAMBLE_MSK; in il_connection_init_rx_config()
4020 il->staging.filter_flags = in il_connection_init_rx_config()
4024 IL_ERR("Unsupported interface type %d\n", il->vif->type); in il_connection_init_rx_config()
4031 if (!hw_to_local(il->hw)->short_preamble) in il_connection_init_rx_config()
4032 il->staging.flags &= ~RXON_FLG_SHORT_PREAMBLE_MSK; in il_connection_init_rx_config()
4034 il->staging.flags |= RXON_FLG_SHORT_PREAMBLE_MSK; in il_connection_init_rx_config()
4038 il_get_channel_info(il, il->band, le16_to_cpu(il->active.channel)); in il_connection_init_rx_config()
4041 ch_info = &il->channel_info[0]; in il_connection_init_rx_config()
4043 il->staging.channel = cpu_to_le16(ch_info->channel); in il_connection_init_rx_config()
4044 il->band = ch_info->band; in il_connection_init_rx_config()
4046 il_set_flags_for_band(il, il->band, il->vif); in il_connection_init_rx_config()
4048 il->staging.ofdm_basic_rates = in il_connection_init_rx_config()
4050 il->staging.cck_basic_rates = in il_connection_init_rx_config()
4054 il->staging.flags &= in il_connection_init_rx_config()
4056 if (il->vif) in il_connection_init_rx_config()
4057 memcpy(il->staging.node_addr, il->vif->addr, ETH_ALEN); in il_connection_init_rx_config()
4059 il->staging.ofdm_ht_single_stream_basic_rates = 0xff; in il_connection_init_rx_config()
4060 il->staging.ofdm_ht_dual_stream_basic_rates = 0xff; in il_connection_init_rx_config()
4065 il_set_rate(struct il_priv *il) in il_set_rate() argument
4071 hw = il_get_hw_mode(il, il->band); in il_set_rate()
4077 il->active_rate = 0; in il_set_rate()
4082 il->active_rate |= (1 << rate->hw_value); in il_set_rate()
4085 D_RATE("Set active_rate = %0x\n", il->active_rate); in il_set_rate()
4087 il->staging.cck_basic_rates = in il_set_rate()
4090 il->staging.ofdm_basic_rates = in il_set_rate()
4096 il_chswitch_done(struct il_priv *il, bool is_success) in il_chswitch_done() argument
4098 if (test_bit(S_EXIT_PENDING, &il->status)) in il_chswitch_done()
4101 if (test_and_clear_bit(S_CHANNEL_SWITCH_PENDING, &il->status)) in il_chswitch_done()
4102 ieee80211_chswitch_done(il->vif, is_success); in il_chswitch_done()
4107 il_hdl_csa(struct il_priv *il, struct il_rx_buf *rxb) in il_hdl_csa() argument
4111 struct il_rxon_cmd *rxon = (void *)&il->active; in il_hdl_csa()
4113 if (!test_bit(S_CHANNEL_SWITCH_PENDING, &il->status)) in il_hdl_csa()
4116 if (!le32_to_cpu(csa->status) && csa->channel == il->switch_channel) { in il_hdl_csa()
4118 il->staging.channel = csa->channel; in il_hdl_csa()
4120 il_chswitch_done(il, true); in il_hdl_csa()
4124 il_chswitch_done(il, false); in il_hdl_csa()
4131 il_print_rx_config_cmd(struct il_priv *il) in il_print_rx_config_cmd() argument
4133 struct il_rxon_cmd *rxon = &il->staging; in il_print_rx_config_cmd()
4136 il_print_hex_dump(il, IL_DL_RADIO, (u8 *) rxon, sizeof(*rxon)); in il_print_rx_config_cmd()
4153 il_irq_handle_error(struct il_priv *il) in il_irq_handle_error() argument
4156 set_bit(S_FW_ERROR, &il->status); in il_irq_handle_error()
4159 clear_bit(S_HCMD_ACTIVE, &il->status); in il_irq_handle_error()
4161 IL_ERR("Loaded firmware version: %s\n", il->hw->wiphy->fw_version); in il_irq_handle_error()
4163 il->ops->dump_nic_error_log(il); in il_irq_handle_error()
4164 if (il->ops->dump_fh) in il_irq_handle_error()
4165 il->ops->dump_fh(il, NULL, false); in il_irq_handle_error()
4167 if (il_get_debug_level(il) & IL_DL_FW_ERRORS) in il_irq_handle_error()
4168 il_print_rx_config_cmd(il); in il_irq_handle_error()
4171 wake_up(&il->wait_command_queue); in il_irq_handle_error()
4175 clear_bit(S_READY, &il->status); in il_irq_handle_error()
4177 if (!test_bit(S_EXIT_PENDING, &il->status)) { in il_irq_handle_error()
4181 if (il->cfg->mod_params->restart_fw) in il_irq_handle_error()
4182 queue_work(il->workqueue, &il->restart); in il_irq_handle_error()
4188 _il_apm_stop_master(struct il_priv *il) in _il_apm_stop_master() argument
4193 _il_set_bit(il, CSR_RESET, CSR_RESET_REG_FLAG_STOP_MASTER); in _il_apm_stop_master()
4196 _il_poll_bit(il, CSR_RESET, CSR_RESET_REG_FLAG_MASTER_DISABLED, in _il_apm_stop_master()
4207 _il_apm_stop(struct il_priv *il) in _il_apm_stop() argument
4209 lockdep_assert_held(&il->reg_lock); in _il_apm_stop()
4214 _il_apm_stop_master(il); in _il_apm_stop()
4217 _il_set_bit(il, CSR_RESET, CSR_RESET_REG_FLAG_SW_RESET); in _il_apm_stop()
4225 _il_clear_bit(il, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_INIT_DONE); in _il_apm_stop()
4230 il_apm_stop(struct il_priv *il) in il_apm_stop() argument
4234 spin_lock_irqsave(&il->reg_lock, flags); in il_apm_stop()
4235 _il_apm_stop(il); in il_apm_stop()
4236 spin_unlock_irqrestore(&il->reg_lock, flags); in il_apm_stop()
4246 il_apm_init(struct il_priv *il) in il_apm_init() argument
4259 il_set_bit(il, CSR_GIO_CHICKEN_BITS, in il_apm_init()
4266 il_set_bit(il, CSR_GIO_CHICKEN_BITS, in il_apm_init()
4270 il_set_bit(il, CSR_DBG_HPET_MEM_REG, CSR_DBG_HPET_MEM_REG_VAL); in il_apm_init()
4277 il_set_bit(il, CSR_HW_IF_CONFIG_REG, in il_apm_init()
4288 if (il->cfg->set_l0s) { in il_apm_init()
4289 pcie_capability_read_word(il->pci_dev, PCI_EXP_LNKCTL, &lctl); in il_apm_init()
4292 il_set_bit(il, CSR_GIO_REG, in il_apm_init()
4297 il_clear_bit(il, CSR_GIO_REG, in il_apm_init()
4304 if (il->cfg->pll_cfg_val) in il_apm_init()
4305 il_set_bit(il, CSR_ANA_PLL_CFG, in il_apm_init()
4306 il->cfg->pll_cfg_val); in il_apm_init()
4312 il_set_bit(il, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_INIT_DONE); in il_apm_init()
4320 _il_poll_bit(il, CSR_GP_CNTRL, in il_apm_init()
4336 if (il->cfg->use_bsm) in il_apm_init()
4337 il_wr_prph(il, APMG_CLK_EN_REG, in il_apm_init()
4340 il_wr_prph(il, APMG_CLK_EN_REG, APMG_CLK_VAL_DMA_CLK_RQT); in il_apm_init()
4344 il_set_bits_prph(il, APMG_PCIDEV_STT_REG, in il_apm_init()
4353 il_set_tx_power(struct il_priv *il, s8 tx_power, bool force) in il_set_tx_power() argument
4359 lockdep_assert_held(&il->mutex); in il_set_tx_power()
4361 if (il->tx_power_user_lmt == tx_power && !force) in il_set_tx_power()
4364 if (!il->ops->send_tx_power) in il_set_tx_power()
4373 if (tx_power > il->tx_power_device_lmt) { in il_set_tx_power()
4375 tx_power, il->tx_power_device_lmt); in il_set_tx_power()
4379 if (!il_is_ready_rf(il)) in il_set_tx_power()
4384 il->tx_power_next = tx_power; in il_set_tx_power()
4387 defer = test_bit(S_SCANNING, &il->status) || in il_set_tx_power()
4388 memcmp(&il->active, &il->staging, sizeof(il->staging)); in il_set_tx_power()
4394 prev_tx_power = il->tx_power_user_lmt; in il_set_tx_power()
4395 il->tx_power_user_lmt = tx_power; in il_set_tx_power()
4397 ret = il->ops->send_tx_power(il); in il_set_tx_power()
4401 il->tx_power_user_lmt = prev_tx_power; in il_set_tx_power()
4402 il->tx_power_next = prev_tx_power; in il_set_tx_power()
4409 il_send_bt_config(struct il_priv *il) in il_send_bt_config() argument
4426 if (il_send_cmd_pdu(il, C_BT_CONFIG, sizeof(struct il_bt_cmd), &bt_cmd)) in il_send_bt_config()
4432 il_send_stats_request(struct il_priv *il, u8 flags, bool clear) in il_send_stats_request() argument
4439 return il_send_cmd_pdu_async(il, C_STATS, sizeof(struct il_stats_cmd), in il_send_stats_request()
4442 return il_send_cmd_pdu(il, C_STATS, sizeof(struct il_stats_cmd), in il_send_stats_request()
4448 il_hdl_pm_sleep(struct il_priv *il, struct il_rx_buf *rxb) in il_hdl_pm_sleep() argument
4460 il_hdl_pm_debug_stats(struct il_priv *il, struct il_rx_buf *rxb) in il_hdl_pm_debug_stats() argument
4466 il_print_hex_dump(il, IL_DL_RADIO, pkt->u.raw, len); in il_hdl_pm_debug_stats()
4471 il_hdl_error(struct il_priv *il, struct il_rx_buf *rxb) in il_hdl_error() argument
4486 il_clear_isr_stats(struct il_priv *il) in il_clear_isr_stats() argument
4488 memset(&il->isr_stats, 0, sizeof(il->isr_stats)); in il_clear_isr_stats()
4495 struct il_priv *il = hw->priv; in il_mac_conf_tx() local
4501 if (!il_is_ready_rf(il)) { in il_mac_conf_tx()
4513 spin_lock_irqsave(&il->lock, flags); in il_mac_conf_tx()
4515 il->qos_data.def_qos_parm.ac[q].cw_min = in il_mac_conf_tx()
4517 il->qos_data.def_qos_parm.ac[q].cw_max = in il_mac_conf_tx()
4519 il->qos_data.def_qos_parm.ac[q].aifsn = params->aifs; in il_mac_conf_tx()
4520 il->qos_data.def_qos_parm.ac[q].edca_txop = in il_mac_conf_tx()
4523 il->qos_data.def_qos_parm.ac[q].reserved1 = 0; in il_mac_conf_tx()
4525 spin_unlock_irqrestore(&il->lock, flags); in il_mac_conf_tx()
4535 struct il_priv *il = hw->priv; in il_mac_tx_last_beacon() local
4540 ret = (il->ibss_manager == IL_IBSS_MANAGER); in il_mac_tx_last_beacon()
4548 il_set_mode(struct il_priv *il) in il_set_mode() argument
4550 il_connection_init_rx_config(il); in il_set_mode()
4552 if (il->ops->set_rxon_chain) in il_set_mode()
4553 il->ops->set_rxon_chain(il); in il_set_mode()
4555 return il_commit_rxon(il); in il_set_mode()
4561 struct il_priv *il = hw->priv; in il_mac_add_interface() local
4565 mutex_lock(&il->mutex); in il_mac_add_interface()
4568 if (!il_is_ready_rf(il)) { in il_mac_add_interface()
4578 reset = (il->vif == vif); in il_mac_add_interface()
4579 if (il->vif && !reset) { in il_mac_add_interface()
4584 il->vif = vif; in il_mac_add_interface()
4585 il->iw_mode = vif->type; in il_mac_add_interface()
4587 err = il_set_mode(il); in il_mac_add_interface()
4591 il->vif = NULL; in il_mac_add_interface()
4592 il->iw_mode = NL80211_IFTYPE_STATION; in il_mac_add_interface()
4598 mutex_unlock(&il->mutex); in il_mac_add_interface()
4605 il_teardown_interface(struct il_priv *il, struct ieee80211_vif *vif) in il_teardown_interface() argument
4607 lockdep_assert_held(&il->mutex); in il_teardown_interface()
4609 if (il->scan_vif == vif) { in il_teardown_interface()
4610 il_scan_cancel_timeout(il, 200); in il_teardown_interface()
4611 il_force_scan_end(il); in il_teardown_interface()
4614 il_set_mode(il); in il_teardown_interface()
4620 struct il_priv *il = hw->priv; in il_mac_remove_interface() local
4622 mutex_lock(&il->mutex); in il_mac_remove_interface()
4625 WARN_ON(il->vif != vif); in il_mac_remove_interface()
4626 il->vif = NULL; in il_mac_remove_interface()
4627 il->iw_mode = NL80211_IFTYPE_UNSPECIFIED; in il_mac_remove_interface()
4628 il_teardown_interface(il, vif); in il_mac_remove_interface()
4629 eth_zero_addr(il->bssid); in il_mac_remove_interface()
4632 mutex_unlock(&il->mutex); in il_mac_remove_interface()
4637 il_alloc_txq_mem(struct il_priv *il) in il_alloc_txq_mem() argument
4639 if (!il->txq) in il_alloc_txq_mem()
4640 il->txq = in il_alloc_txq_mem()
4641 kcalloc(il->cfg->num_of_queues, in il_alloc_txq_mem()
4644 if (!il->txq) { in il_alloc_txq_mem()
4653 il_free_txq_mem(struct il_priv *il) in il_free_txq_mem() argument
4655 kfree(il->txq); in il_free_txq_mem()
4656 il->txq = NULL; in il_free_txq_mem()
4661 il_force_reset(struct il_priv *il, bool external) in il_force_reset() argument
4665 if (test_bit(S_EXIT_PENDING, &il->status)) in il_force_reset()
4668 force_reset = &il->force_reset; in il_force_reset()
4691 if (!external && !il->cfg->mod_params->restart_fw) { in il_force_reset()
4700 set_bit(S_FW_ERROR, &il->status); in il_force_reset()
4701 wake_up(&il->wait_command_queue); in il_force_reset()
4706 clear_bit(S_READY, &il->status); in il_force_reset()
4707 queue_work(il->workqueue, &il->restart); in il_force_reset()
4717 struct il_priv *il = hw->priv; in il_mac_change_interface() local
4720 mutex_lock(&il->mutex); in il_mac_change_interface()
4729 if (!il->vif || !il_is_ready_rf(il)) { in il_mac_change_interface()
4741 il->iw_mode = newtype; in il_mac_change_interface()
4742 il_teardown_interface(il, vif); in il_mac_change_interface()
4747 mutex_unlock(&il->mutex); in il_mac_change_interface()
4756 struct il_priv *il = hw->priv; in il_mac_flush() local
4760 mutex_lock(&il->mutex); in il_mac_flush()
4763 if (il->txq == NULL) in il_mac_flush()
4766 for (i = 0; i < il->hw_params.max_txq_num; i++) { in il_mac_flush()
4769 if (i == il->cmd_queue) in il_mac_flush()
4772 q = &il->txq[i].q; in il_mac_flush()
4785 mutex_unlock(&il->mutex); in il_mac_flush()
4794 il_check_stuck_queue(struct il_priv *il, int cnt) in il_check_stuck_queue() argument
4796 struct il_tx_queue *txq = &il->txq[cnt]; in il_check_stuck_queue()
4809 msecs_to_jiffies(il->cfg->wd_timeout); in il_check_stuck_queue()
4814 ret = il_force_reset(il, false); in il_check_stuck_queue()
4834 struct il_priv *il = from_timer(il, t, watchdog); in il_bg_watchdog() local
4838 if (test_bit(S_EXIT_PENDING, &il->status)) in il_bg_watchdog()
4841 timeout = il->cfg->wd_timeout; in il_bg_watchdog()
4846 if (il_check_stuck_queue(il, il->cmd_queue)) in il_bg_watchdog()
4850 for (cnt = 0; cnt < il->hw_params.max_txq_num; cnt++) { in il_bg_watchdog()
4852 if (cnt == il->cmd_queue) in il_bg_watchdog()
4854 if (il_check_stuck_queue(il, cnt)) in il_bg_watchdog()
4858 mod_timer(&il->watchdog, in il_bg_watchdog()
4864 il_setup_watchdog(struct il_priv *il) in il_setup_watchdog() argument
4866 unsigned int timeout = il->cfg->wd_timeout; in il_setup_watchdog()
4869 mod_timer(&il->watchdog, in il_setup_watchdog()
4872 del_timer(&il->watchdog); in il_setup_watchdog()
4883 il_usecs_to_beacons(struct il_priv *il, u32 usec, u32 beacon_interval) in il_usecs_to_beacons() argument
4894 interval) & (il_beacon_time_mask_high(il, in il_usecs_to_beacons()
4895 il->hw_params. in il_usecs_to_beacons()
4896 beacon_time_tsf_bits) >> il-> in il_usecs_to_beacons()
4899 (usec % interval) & il_beacon_time_mask_low(il, in il_usecs_to_beacons()
4900 il->hw_params. in il_usecs_to_beacons()
4903 return (quot << il->hw_params.beacon_time_tsf_bits) + rem; in il_usecs_to_beacons()
4911 il_add_beacon_time(struct il_priv *il, u32 base, u32 addon, in il_add_beacon_time() argument
4914 u32 base_low = base & il_beacon_time_mask_low(il, in il_add_beacon_time()
4915 il->hw_params. in il_add_beacon_time()
4917 u32 addon_low = addon & il_beacon_time_mask_low(il, in il_add_beacon_time()
4918 il->hw_params. in il_add_beacon_time()
4921 u32 res = (base & il_beacon_time_mask_high(il, in il_add_beacon_time()
4922 il->hw_params. in il_add_beacon_time()
4924 (addon & il_beacon_time_mask_high(il, in il_add_beacon_time()
4925 il->hw_params. in il_add_beacon_time()
4932 res += (1 << il->hw_params.beacon_time_tsf_bits); in il_add_beacon_time()
4934 res += (1 << il->hw_params.beacon_time_tsf_bits); in il_add_beacon_time()
4945 struct il_priv *il = dev_get_drvdata(device); in il_pci_suspend() local
4954 il_apm_stop(il); in il_pci_suspend()
4963 struct il_priv *il = pci_get_drvdata(pdev); in il_pci_resume() local
4972 il_enable_interrupts(il); in il_pci_resume()
4974 if (!(_il_rd(il, CSR_GP_CNTRL) & CSR_GP_CNTRL_REG_FLAG_HW_RF_KILL_SW)) in il_pci_resume()
4978 set_bit(S_RFKILL, &il->status); in il_pci_resume()
4980 clear_bit(S_RFKILL, &il->status); in il_pci_resume()
4982 wiphy_rfkill_set_hw_state(il->hw->wiphy, hw_rfkill); in il_pci_resume()
4993 il_update_qos(struct il_priv *il) in il_update_qos() argument
4995 if (test_bit(S_EXIT_PENDING, &il->status)) in il_update_qos()
4998 il->qos_data.def_qos_parm.qos_flags = 0; in il_update_qos()
5000 if (il->qos_data.qos_active) in il_update_qos()
5001 il->qos_data.def_qos_parm.qos_flags |= in il_update_qos()
5004 if (il->ht.enabled) in il_update_qos()
5005 il->qos_data.def_qos_parm.qos_flags |= QOS_PARAM_FLG_TGN_MSK; in il_update_qos()
5008 il->qos_data.qos_active, il->qos_data.def_qos_parm.qos_flags); in il_update_qos()
5010 il_send_cmd_pdu_async(il, C_QOS_PARAM, sizeof(struct il_qosparam_cmd), in il_update_qos()
5011 &il->qos_data.def_qos_parm, NULL); in il_update_qos()
5020 struct il_priv *il = hw->priv; in il_mac_config() local
5024 struct il_ht_config *ht_conf = &il->current_ht_config; in il_mac_config()
5031 mutex_lock(&il->mutex); in il_mac_config()
5035 if (unlikely(test_bit(S_SCANNING, &il->status))) { in il_mac_config()
5043 il->current_ht_config.smps = conf->smps_mode; in il_mac_config()
5052 if (il->ops->set_rxon_chain) in il_mac_config()
5053 il->ops->set_rxon_chain(il); in il_mac_config()
5065 ch_info = il_get_channel_info(il, channel->band, ch); in il_mac_config()
5072 if (il->iw_mode == NL80211_IFTYPE_ADHOC && in il_mac_config()
5079 spin_lock_irqsave(&il->lock, flags); in il_mac_config()
5082 if (il->ht.enabled != conf_is_ht(conf)) { in il_mac_config()
5083 il->ht.enabled = conf_is_ht(conf); in il_mac_config()
5086 if (il->ht.enabled) { in il_mac_config()
5088 il->ht.extension_chan_offset = in il_mac_config()
5090 il->ht.is_40mhz = true; in il_mac_config()
5092 il->ht.extension_chan_offset = in il_mac_config()
5094 il->ht.is_40mhz = true; in il_mac_config()
5096 il->ht.extension_chan_offset = in il_mac_config()
5098 il->ht.is_40mhz = false; in il_mac_config()
5101 il->ht.is_40mhz = false; in il_mac_config()
5107 il->ht.protection = IEEE80211_HT_OP_MODE_PROTECTION_NONE; in il_mac_config()
5112 if ((le16_to_cpu(il->staging.channel) != ch)) in il_mac_config()
5113 il->staging.flags = 0; in il_mac_config()
5115 il_set_rxon_channel(il, channel); in il_mac_config()
5116 il_set_rxon_ht(il, ht_conf); in il_mac_config()
5118 il_set_flags_for_band(il, channel->band, il->vif); in il_mac_config()
5120 spin_unlock_irqrestore(&il->lock, flags); in il_mac_config()
5122 if (il->ops->update_bcast_stations) in il_mac_config()
5123 ret = il->ops->update_bcast_stations(il); in il_mac_config()
5129 il_set_rate(il); in il_mac_config()
5133 il->power_data.ps_disabled = !(conf->flags & IEEE80211_CONF_PS); in il_mac_config()
5134 if (!il->power_data.ps_disabled) in il_mac_config()
5136 ret = il_power_update_mode(il, false); in il_mac_config()
5142 D_MAC80211("TX Power old=%d new=%d\n", il->tx_power_user_lmt, in il_mac_config()
5145 il_set_tx_power(il, conf->power_level, false); in il_mac_config()
5148 if (!il_is_ready(il)) { in il_mac_config()
5156 if (memcmp(&il->active, &il->staging, sizeof(il->staging))) in il_mac_config()
5157 il_commit_rxon(il); in il_mac_config()
5161 il_update_qos(il); in il_mac_config()
5165 mutex_unlock(&il->mutex); in il_mac_config()
5174 struct il_priv *il = hw->priv; in il_mac_reset_tsf() local
5177 mutex_lock(&il->mutex); in il_mac_reset_tsf()
5180 spin_lock_irqsave(&il->lock, flags); in il_mac_reset_tsf()
5182 memset(&il->current_ht_config, 0, sizeof(struct il_ht_config)); in il_mac_reset_tsf()
5185 if (il->beacon_skb) in il_mac_reset_tsf()
5186 dev_kfree_skb(il->beacon_skb); in il_mac_reset_tsf()
5187 il->beacon_skb = NULL; in il_mac_reset_tsf()
5188 il->timestamp = 0; in il_mac_reset_tsf()
5190 spin_unlock_irqrestore(&il->lock, flags); in il_mac_reset_tsf()
5192 il_scan_cancel_timeout(il, 100); in il_mac_reset_tsf()
5193 if (!il_is_ready_rf(il)) { in il_mac_reset_tsf()
5195 mutex_unlock(&il->mutex); in il_mac_reset_tsf()
5200 il->staging.filter_flags &= ~RXON_FILTER_ASSOC_MSK; in il_mac_reset_tsf()
5201 il_commit_rxon(il); in il_mac_reset_tsf()
5203 il_set_rate(il); in il_mac_reset_tsf()
5206 mutex_unlock(&il->mutex); in il_mac_reset_tsf()
5211 il_ht_conf(struct il_priv *il, struct ieee80211_vif *vif) in il_ht_conf() argument
5213 struct il_ht_config *ht_conf = &il->current_ht_config; in il_ht_conf()
5219 if (!il->ht.enabled) in il_ht_conf()
5222 il->ht.protection = in il_ht_conf()
5224 il->ht.non_gf_sta_present = in il_ht_conf()
5271 il_set_no_assoc(struct il_priv *il, struct ieee80211_vif *vif) in il_set_no_assoc() argument
5278 il->staging.filter_flags &= ~RXON_FILTER_ASSOC_MSK; in il_set_no_assoc()
5279 il->staging.assoc_id = 0; in il_set_no_assoc()
5280 il_commit_rxon(il); in il_set_no_assoc()
5286 struct il_priv *il = hw->priv; in il_beacon_update() local
5296 lockdep_assert_held(&il->mutex); in il_beacon_update()
5298 if (!il->beacon_enabled) { in il_beacon_update()
5304 spin_lock_irqsave(&il->lock, flags); in il_beacon_update()
5306 if (il->beacon_skb) in il_beacon_update()
5307 dev_kfree_skb(il->beacon_skb); in il_beacon_update()
5309 il->beacon_skb = skb; in il_beacon_update()
5312 il->timestamp = le64_to_cpu(timestamp); in il_beacon_update()
5315 spin_unlock_irqrestore(&il->lock, flags); in il_beacon_update()
5317 if (!il_is_ready_rf(il)) { in il_beacon_update()
5322 il->ops->post_associate(il); in il_beacon_update()
5329 struct il_priv *il = hw->priv; in il_mac_bss_info_changed() local
5332 mutex_lock(&il->mutex); in il_mac_bss_info_changed()
5335 if (!il_is_alive(il)) { in il_mac_bss_info_changed()
5337 mutex_unlock(&il->mutex); in il_mac_bss_info_changed()
5344 spin_lock_irqsave(&il->lock, flags); in il_mac_bss_info_changed()
5345 il->qos_data.qos_active = bss_conf->qos; in il_mac_bss_info_changed()
5346 il_update_qos(il); in il_mac_bss_info_changed()
5347 spin_unlock_irqrestore(&il->lock, flags); in il_mac_bss_info_changed()
5353 il->beacon_enabled = true; in il_mac_bss_info_changed()
5355 il->beacon_enabled = false; in il_mac_bss_info_changed()
5370 il_wake_queues_by_reason(il, IL_STOP_REASON_PASSIVE); in il_mac_bss_info_changed()
5377 if (il_scan_cancel_timeout(il, 100)) { in il_mac_bss_info_changed()
5379 mutex_unlock(&il->mutex); in il_mac_bss_info_changed()
5384 memcpy(il->staging.bssid_addr, bss_conf->bssid, ETH_ALEN); in il_mac_bss_info_changed()
5387 memcpy(il->bssid, bss_conf->bssid, ETH_ALEN); in il_mac_bss_info_changed()
5401 il->staging.flags |= RXON_FLG_SHORT_PREAMBLE_MSK; in il_mac_bss_info_changed()
5403 il->staging.flags &= ~RXON_FLG_SHORT_PREAMBLE_MSK; in il_mac_bss_info_changed()
5408 if (bss_conf->use_cts_prot && il->band != NL80211_BAND_5GHZ) in il_mac_bss_info_changed()
5409 il->staging.flags |= RXON_FLG_TGG_PROTECT_MSK; in il_mac_bss_info_changed()
5411 il->staging.flags &= ~RXON_FLG_TGG_PROTECT_MSK; in il_mac_bss_info_changed()
5413 il->staging.flags |= RXON_FLG_SELF_CTS_EN; in il_mac_bss_info_changed()
5415 il->staging.flags &= ~RXON_FLG_SELF_CTS_EN; in il_mac_bss_info_changed()
5436 il_ht_conf(il, vif); in il_mac_bss_info_changed()
5438 if (il->ops->set_rxon_chain) in il_mac_bss_info_changed()
5439 il->ops->set_rxon_chain(il); in il_mac_bss_info_changed()
5445 il->timestamp = bss_conf->sync_tsf; in il_mac_bss_info_changed()
5447 if (!il_is_rfkill(il)) in il_mac_bss_info_changed()
5448 il->ops->post_associate(il); in il_mac_bss_info_changed()
5450 il_set_no_assoc(il, vif); in il_mac_bss_info_changed()
5453 if (changes && il_is_associated(il) && bss_conf->aid) { in il_mac_bss_info_changed()
5455 ret = il_send_rxon_assoc(il); in il_mac_bss_info_changed()
5458 memcpy((void *)&il->active, &il->staging, in il_mac_bss_info_changed()
5465 memcpy(il->staging.bssid_addr, bss_conf->bssid, in il_mac_bss_info_changed()
5467 memcpy(il->bssid, bss_conf->bssid, ETH_ALEN); in il_mac_bss_info_changed()
5468 il->ops->config_ap(il); in il_mac_bss_info_changed()
5470 il_set_no_assoc(il, vif); in il_mac_bss_info_changed()
5474 ret = il->ops->manage_ibss_station(il, vif, in il_mac_bss_info_changed()
5483 mutex_unlock(&il->mutex); in il_mac_bss_info_changed()
5490 struct il_priv *il = data; in il_isr() local
5494 if (!il) in il_isr()
5497 spin_lock_irqsave(&il->lock, flags); in il_isr()
5503 inta_mask = _il_rd(il, CSR_INT_MASK); /* just for debug */ in il_isr()
5504 _il_wr(il, CSR_INT_MASK, 0x00000000); in il_isr()
5507 inta = _il_rd(il, CSR_INT); in il_isr()
5508 inta_fh = _il_rd(il, CSR_FH_INT_STATUS); in il_isr()
5532 tasklet_schedule(&il->irq_tasklet); in il_isr()
5535 spin_unlock_irqrestore(&il->lock, flags); in il_isr()
5541 if (test_bit(S_INT_ENABLED, &il->status)) in il_isr()
5542 il_enable_interrupts(il); in il_isr()
5543 spin_unlock_irqrestore(&il->lock, flags); in il_isr()
5553 il_tx_cmd_protection(struct il_priv *il, struct ieee80211_tx_info *info, in il_tx_cmd_protection() argument