Lines Matching refs:il

67 il4965_check_abort_status(struct il_priv *il, u8 frame_count, u32 status)  in il4965_check_abort_status()  argument
71 if (!test_bit(S_EXIT_PENDING, &il->status)) in il4965_check_abort_status()
72 queue_work(il->workqueue, &il->tx_flush); in il4965_check_abort_status()
85 il4965_rx_queue_reset(struct il_priv *il, struct il_rx_queue *rxq) in il4965_rx_queue_reset() argument
97 pci_unmap_page(il->pci_dev, rxq->pool[i].page_dma, in il4965_rx_queue_reset()
98 PAGE_SIZE << il->hw_params.rx_page_order, in il4965_rx_queue_reset()
100 __il_free_pages(il, rxq->pool[i].page); in il4965_rx_queue_reset()
118 il4965_rx_init(struct il_priv *il, struct il_rx_queue *rxq) in il4965_rx_init() argument
124 if (il->cfg->mod_params->amsdu_size_8K) in il4965_rx_init()
130 il_wr(il, FH49_MEM_RCSR_CHNL0_CONFIG_REG, 0); in il4965_rx_init()
133 il_wr(il, FH49_RSCSR_CHNL0_RBDCB_WPTR_REG, 0); in il4965_rx_init()
136 il_wr(il, FH49_RSCSR_CHNL0_RBDCB_BASE_REG, (u32) (rxq->bd_dma >> 8)); in il4965_rx_init()
139 il_wr(il, FH49_RSCSR_CHNL0_STTS_WPTR_REG, rxq->rb_stts_dma >> 4); in il4965_rx_init()
147 il_wr(il, FH49_MEM_RCSR_CHNL0_CONFIG_REG, in il4965_rx_init()
156 il_write8(il, CSR_INT_COALESCING, IL_HOST_INT_TIMEOUT_DEF); in il4965_rx_init()
162 il4965_set_pwr_vmain(struct il_priv *il) in il4965_set_pwr_vmain() argument
174 il_set_bits_mask_prph(il, APMG_PS_CTRL_REG, in il4965_set_pwr_vmain()
180 il4965_hw_nic_init(struct il_priv *il) in il4965_hw_nic_init() argument
183 struct il_rx_queue *rxq = &il->rxq; in il4965_hw_nic_init()
186 spin_lock_irqsave(&il->lock, flags); in il4965_hw_nic_init()
187 il_apm_init(il); in il4965_hw_nic_init()
189 il_write8(il, CSR_INT_COALESCING, IL_HOST_INT_CALIB_TIMEOUT_DEF); in il4965_hw_nic_init()
190 spin_unlock_irqrestore(&il->lock, flags); in il4965_hw_nic_init()
192 il4965_set_pwr_vmain(il); in il4965_hw_nic_init()
193 il4965_nic_config(il); in il4965_hw_nic_init()
197 ret = il_rx_queue_alloc(il); in il4965_hw_nic_init()
203 il4965_rx_queue_reset(il, rxq); in il4965_hw_nic_init()
205 il4965_rx_replenish(il); in il4965_hw_nic_init()
207 il4965_rx_init(il, rxq); in il4965_hw_nic_init()
209 spin_lock_irqsave(&il->lock, flags); in il4965_hw_nic_init()
212 il_rx_queue_update_write_ptr(il, rxq); in il4965_hw_nic_init()
214 spin_unlock_irqrestore(&il->lock, flags); in il4965_hw_nic_init()
217 if (!il->txq) { in il4965_hw_nic_init()
218 ret = il4965_txq_ctx_alloc(il); in il4965_hw_nic_init()
222 il4965_txq_ctx_reset(il); in il4965_hw_nic_init()
224 set_bit(S_INIT, &il->status); in il4965_hw_nic_init()
233 il4965_dma_addr2rbd_ptr(struct il_priv *il, dma_addr_t dma_addr) in il4965_dma_addr2rbd_ptr() argument
250 il4965_rx_queue_restock(struct il_priv *il) in il4965_rx_queue_restock() argument
252 struct il_rx_queue *rxq = &il->rxq; in il4965_rx_queue_restock()
270 il4965_dma_addr2rbd_ptr(il, rxb->page_dma); in il4965_rx_queue_restock()
279 queue_work(il->workqueue, &il->rx_replenish); in il4965_rx_queue_restock()
287 il_rx_queue_update_write_ptr(il, rxq); in il4965_rx_queue_restock()
300 il4965_rx_allocate(struct il_priv *il, gfp_t priority) in il4965_rx_allocate() argument
302 struct il_rx_queue *rxq = &il->rxq; in il4965_rx_allocate()
321 if (il->hw_params.rx_page_order > 0) in il4965_rx_allocate()
325 page = alloc_pages(gfp_mask, il->hw_params.rx_page_order); in il4965_rx_allocate()
329 il->hw_params.rx_page_order); in il4965_rx_allocate()
346 pci_map_page(il->pci_dev, page, 0, in il4965_rx_allocate()
347 PAGE_SIZE << il->hw_params.rx_page_order, in il4965_rx_allocate()
349 if (unlikely(pci_dma_mapping_error(il->pci_dev, page_dma))) { in il4965_rx_allocate()
350 __free_pages(page, il->hw_params.rx_page_order); in il4965_rx_allocate()
358 pci_unmap_page(il->pci_dev, page_dma, in il4965_rx_allocate()
359 PAGE_SIZE << il->hw_params.rx_page_order, in il4965_rx_allocate()
361 __free_pages(page, il->hw_params.rx_page_order); in il4965_rx_allocate()
375 il->alloc_rxb_page++; in il4965_rx_allocate()
382 il4965_rx_replenish(struct il_priv *il) in il4965_rx_replenish() argument
386 il4965_rx_allocate(il, GFP_KERNEL); in il4965_rx_replenish()
388 spin_lock_irqsave(&il->lock, flags); in il4965_rx_replenish()
389 il4965_rx_queue_restock(il); in il4965_rx_replenish()
390 spin_unlock_irqrestore(&il->lock, flags); in il4965_rx_replenish()
394 il4965_rx_replenish_now(struct il_priv *il) in il4965_rx_replenish_now() argument
396 il4965_rx_allocate(il, GFP_ATOMIC); in il4965_rx_replenish_now()
398 il4965_rx_queue_restock(il); in il4965_rx_replenish_now()
407 il4965_rx_queue_free(struct il_priv *il, struct il_rx_queue *rxq) in il4965_rx_queue_free() argument
412 pci_unmap_page(il->pci_dev, rxq->pool[i].page_dma, in il4965_rx_queue_free()
413 PAGE_SIZE << il->hw_params.rx_page_order, in il4965_rx_queue_free()
415 __il_free_pages(il, rxq->pool[i].page); in il4965_rx_queue_free()
420 dma_free_coherent(&il->pci_dev->dev, 4 * RX_QUEUE_SIZE, rxq->bd, in il4965_rx_queue_free()
422 dma_free_coherent(&il->pci_dev->dev, sizeof(struct il_rb_status), in il4965_rx_queue_free()
429 il4965_rxq_stop(struct il_priv *il) in il4965_rxq_stop() argument
433 _il_wr(il, FH49_MEM_RCSR_CHNL0_CONFIG_REG, 0); in il4965_rxq_stop()
434 ret = _il_poll_bit(il, FH49_MEM_RSSR_RX_STATUS_REG, in il4965_rxq_stop()
467 il4965_calc_rssi(struct il_priv *il, struct il_rx_phy_res *rx_resp) in il4965_calc_rssi() argument
502 il4965_translate_rx_status(struct il_priv *il, u32 decrypt_in) in il4965_translate_rx_status() argument
564 il4965_pass_packet_to_mac80211(struct il_priv *il, struct ieee80211_hdr *hdr, in il4965_pass_packet_to_mac80211() argument
572 if (unlikely(!il->is_open)) { in il4965_pass_packet_to_mac80211()
577 if (unlikely(test_bit(IL_STOP_REASON_PASSIVE, &il->stop_reason))) { in il4965_pass_packet_to_mac80211()
578 il_wake_queues_by_reason(il, IL_STOP_REASON_PASSIVE); in il4965_pass_packet_to_mac80211()
583 if (!il->cfg->mod_params->sw_crypto && in il4965_pass_packet_to_mac80211()
584 il_set_decrypted_flag(il, hdr, ampdu_status, stats)) in il4965_pass_packet_to_mac80211()
597 len, PAGE_SIZE << il->hw_params.rx_page_order); in il4965_pass_packet_to_mac80211()
598 il->alloc_rxb_page--; in il4965_pass_packet_to_mac80211()
602 il_update_stats(il, false, fc, len); in il4965_pass_packet_to_mac80211()
605 ieee80211_rx(il->hw, skb); in il4965_pass_packet_to_mac80211()
611 il4965_hdl_rx(struct il_priv *il, struct il_rx_buf *rxb) in il4965_hdl_rx() argument
644 if (!il->_4965.last_phy_res_valid) { in il4965_hdl_rx()
648 phy_res = &il->_4965.last_phy_res; in il4965_hdl_rx()
654 il4965_translate_rx_status(il, le32_to_cpu(rx_pkt_status)); in il4965_hdl_rx()
689 il->ucode_beacon_time = le32_to_cpu(phy_res->beacon_time_stamp); in il4965_hdl_rx()
692 rx_status.signal = il4965_calc_rssi(il, phy_res); in il4965_hdl_rx()
735 rx_status.ampdu_reference = il->_4965.ampdu_ref; in il4965_hdl_rx()
738 il4965_pass_packet_to_mac80211(il, header, len, ampdu_status, rxb, in il4965_hdl_rx()
745 il4965_hdl_rx_phy(struct il_priv *il, struct il_rx_buf *rxb) in il4965_hdl_rx_phy() argument
748 il->_4965.last_phy_res_valid = true; in il4965_hdl_rx_phy()
749 il->_4965.ampdu_ref++; in il4965_hdl_rx_phy()
750 memcpy(&il->_4965.last_phy_res, pkt->u.raw, in il4965_hdl_rx_phy()
755 il4965_get_channels_for_scan(struct il_priv *il, struct ieee80211_vif *vif, in il4965_get_channels_for_scan() argument
767 sband = il_get_hw_mode(il, band); in il4965_get_channels_for_scan()
771 active_dwell = il_get_active_dwell_time(il, band, n_probes); in il4965_get_channels_for_scan()
772 passive_dwell = il_get_passive_dwell_time(il, band, vif); in il4965_get_channels_for_scan()
777 for (i = 0, added = 0; i < il->scan_request->n_channels; i++) { in il4965_get_channels_for_scan()
778 chan = il->scan_request->channels[i]; in il4965_get_channels_for_scan()
786 ch_info = il_get_channel_info(il, band, channel); in il4965_get_channels_for_scan()
834 il4965_toggle_tx_ant(struct il_priv *il, u8 *ant, u8 valid) in il4965_toggle_tx_ant() argument
849 il4965_request_scan(struct il_priv *il, struct ieee80211_vif *vif) in il4965_request_scan() argument
862 u8 rx_ant = il->hw_params.valid_rx_ant; in il4965_request_scan()
867 u8 scan_tx_antennas = il->hw_params.valid_tx_ant; in il4965_request_scan()
870 lockdep_assert_held(&il->mutex); in il4965_request_scan()
872 if (!il->scan_cmd) { in il4965_request_scan()
873 il->scan_cmd = in il4965_request_scan()
876 if (!il->scan_cmd) { in il4965_request_scan()
881 scan = il->scan_cmd; in il4965_request_scan()
887 if (il_is_any_associated(il)) { in il4965_request_scan()
909 if (il->scan_request->n_ssids) { in il4965_request_scan()
912 for (i = 0; i < il->scan_request->n_ssids; i++) { in il4965_request_scan()
914 if (!il->scan_request->ssids[i].ssid_len) in il4965_request_scan()
918 il->scan_request->ssids[i].ssid_len; in il4965_request_scan()
920 il->scan_request->ssids[i].ssid, in il4965_request_scan()
921 il->scan_request->ssids[i].ssid_len); in il4965_request_scan()
930 scan->tx_cmd.sta_id = il->hw_params.bcast_id; in il4965_request_scan()
933 switch (il->scan_band) { in il4965_request_scan()
937 le32_to_cpu(il->active.flags & RXON_FLG_CHANNEL_MODE_MSK) >> in il4965_request_scan()
974 band = il->scan_band; in il4965_request_scan()
976 if (il->cfg->scan_rx_antennas[band]) in il4965_request_scan()
977 rx_ant = il->cfg->scan_rx_antennas[band]; in il4965_request_scan()
979 il4965_toggle_tx_ant(il, &il->scan_tx_ant[band], scan_tx_antennas); in il4965_request_scan()
980 rate_flags |= BIT(il->scan_tx_ant[band]) << RATE_MCS_ANT_POS; in il4965_request_scan()
984 if (test_bit(S_POWER_PMI, &il->status)) { in il4965_request_scan()
987 rx_ant & ((u8) (il->chain_noise_data.active_chains)); in il4965_request_scan()
992 il->chain_noise_data.active_chains); in il4965_request_scan()
998 rx_chain |= il->hw_params.valid_rx_ant << RXON_RX_CHAIN_VALID_POS; in il4965_request_scan()
1005 il_fill_probe_req(il, (struct ieee80211_mgmt *)scan->data, in il4965_request_scan()
1006 vif->addr, il->scan_request->ie, in il4965_request_scan()
1007 il->scan_request->ie_len, in il4965_request_scan()
1015 il4965_get_channels_for_scan(il, vif, band, is_active, n_probes, in il4965_request_scan()
1028 set_bit(S_SCAN_HW, &il->status); in il4965_request_scan()
1030 ret = il_send_cmd_sync(il, &cmd); in il4965_request_scan()
1032 clear_bit(S_SCAN_HW, &il->status); in il4965_request_scan()
1038 il4965_manage_ibss_station(struct il_priv *il, struct ieee80211_vif *vif, in il4965_manage_ibss_station() argument
1044 return il4965_add_bssid_station(il, vif->bss_conf.bssid, in il4965_manage_ibss_station()
1046 return il_remove_station(il, vif_priv->ibss_bssid_sta_id, in il4965_manage_ibss_station()
1051 il4965_free_tfds_in_queue(struct il_priv *il, int sta_id, int tid, int freed) in il4965_free_tfds_in_queue() argument
1053 lockdep_assert_held(&il->sta_lock); in il4965_free_tfds_in_queue()
1055 if (il->stations[sta_id].tid[tid].tfds_in_queue >= freed) in il4965_free_tfds_in_queue()
1056 il->stations[sta_id].tid[tid].tfds_in_queue -= freed; in il4965_free_tfds_in_queue()
1059 il->stations[sta_id].tid[tid].tfds_in_queue, freed); in il4965_free_tfds_in_queue()
1060 il->stations[sta_id].tid[tid].tfds_in_queue = 0; in il4965_free_tfds_in_queue()
1067 il4965_is_single_rx_stream(struct il_priv *il) in il4965_is_single_rx_stream() argument
1069 return il->current_ht_config.smps == IEEE80211_SMPS_STATIC || in il4965_is_single_rx_stream()
1070 il->current_ht_config.single_chain_sufficient; in il4965_is_single_rx_stream()
1089 il4965_get_active_rx_chain_count(struct il_priv *il) in il4965_get_active_rx_chain_count() argument
1092 if (il4965_is_single_rx_stream(il)) in il4965_get_active_rx_chain_count()
1103 il4965_get_idle_rx_chain_count(struct il_priv *il, int active_cnt) in il4965_get_idle_rx_chain_count() argument
1106 switch (il->current_ht_config.smps) { in il4965_get_idle_rx_chain_count()
1113 WARN(1, "invalid SMPS mode %d", il->current_ht_config.smps); in il4965_get_idle_rx_chain_count()
1137 il4965_set_rxon_chain(struct il_priv *il) in il4965_set_rxon_chain() argument
1139 bool is_single = il4965_is_single_rx_stream(il); in il4965_set_rxon_chain()
1140 bool is_cam = !test_bit(S_POWER_PMI, &il->status); in il4965_set_rxon_chain()
1149 if (il->chain_noise_data.active_chains) in il4965_set_rxon_chain()
1150 active_chains = il->chain_noise_data.active_chains; in il4965_set_rxon_chain()
1152 active_chains = il->hw_params.valid_rx_ant; in il4965_set_rxon_chain()
1157 active_rx_cnt = il4965_get_active_rx_chain_count(il); in il4965_set_rxon_chain()
1158 idle_rx_cnt = il4965_get_idle_rx_chain_count(il, active_rx_cnt); in il4965_set_rxon_chain()
1173 il->staging.rx_chain = cpu_to_le16(rx_chain); in il4965_set_rxon_chain()
1176 il->staging.rx_chain |= RXON_RX_CHAIN_MIMO_FORCE_MSK; in il4965_set_rxon_chain()
1178 il->staging.rx_chain &= ~RXON_RX_CHAIN_MIMO_FORCE_MSK; in il4965_set_rxon_chain()
1180 D_ASSOC("rx_chain=0x%X active=%d idle=%d\n", il->staging.rx_chain, in il4965_set_rxon_chain()
1206 il4965_dump_fh(struct il_priv *il, char **buf, bool display) in il4965_dump_fh() argument
1237 il_rd(il, fh_tbl[i])); in il4965_dump_fh()
1245 il_rd(il, fh_tbl[i])); in il4965_dump_fh()
1251 il4965_hdl_missed_beacon(struct il_priv *il, struct il_rx_buf *rxb) in il4965_hdl_missed_beacon() argument
1258 il->missed_beacon_threshold) { in il4965_hdl_missed_beacon()
1264 if (!test_bit(S_SCANNING, &il->status)) in il4965_hdl_missed_beacon()
1265 il4965_init_sensitivity(il); in il4965_hdl_missed_beacon()
1273 il4965_rx_calc_noise(struct il_priv *il) in il4965_rx_calc_noise() argument
1281 rx_info = &(il->_4965.stats.rx.general); in il4965_rx_calc_noise()
1319 il4965_accumulative_stats(struct il_priv *il, __le32 * stats) in il4965_accumulative_stats() argument
1327 prev_stats = (__le32 *) &il->_4965.stats; in il4965_accumulative_stats()
1328 accum_stats = (u32 *) &il->_4965.accum_stats; in il4965_accumulative_stats()
1330 general = &il->_4965.stats.general.common; in il4965_accumulative_stats()
1331 accum_general = &il->_4965.accum_stats.general.common; in il4965_accumulative_stats()
1332 delta = (u32 *) &il->_4965.delta_stats; in il4965_accumulative_stats()
1333 max_delta = (u32 *) &il->_4965.max_delta; in il4965_accumulative_stats()
1355 il4965_hdl_stats(struct il_priv *il, struct il_rx_buf *rxb) in il4965_hdl_stats() argument
1366 ((il->_4965.stats.general.common.temperature != in il4965_hdl_stats()
1368 ((il->_4965.stats.flag & STATS_REPLY_FLG_HT40_MODE_MSK) != in il4965_hdl_stats()
1371 il4965_accumulative_stats(il, (__le32 *) &pkt->u.stats); in il4965_hdl_stats()
1375 memcpy(&il->_4965.stats, &pkt->u.stats, sizeof(il->_4965.stats)); in il4965_hdl_stats()
1377 set_bit(S_STATS, &il->status); in il4965_hdl_stats()
1383 mod_timer(&il->stats_periodic, in il4965_hdl_stats()
1386 if (unlikely(!test_bit(S_SCANNING, &il->status)) && in il4965_hdl_stats()
1388 il4965_rx_calc_noise(il); in il4965_hdl_stats()
1389 queue_work(il->workqueue, &il->run_time_calib_work); in il4965_hdl_stats()
1393 il4965_temperature_calib(il); in il4965_hdl_stats()
1397 il4965_hdl_c_stats(struct il_priv *il, struct il_rx_buf *rxb) in il4965_hdl_c_stats() argument
1403 memset(&il->_4965.accum_stats, 0, in il4965_hdl_c_stats()
1405 memset(&il->_4965.delta_stats, 0, in il4965_hdl_c_stats()
1407 memset(&il->_4965.max_delta, 0, sizeof(struct il_notif_stats)); in il4965_hdl_c_stats()
1411 il4965_hdl_stats(il, rxb); in il4965_hdl_c_stats()
1483 il4965_tx_cmd_build_basic(struct il_priv *il, struct sk_buff *skb, in il4965_tx_cmd_build_basic() argument
1519 il_tx_cmd_protection(il, info, fc, &tx_flags); in il4965_tx_cmd_build_basic()
1537 il4965_tx_cmd_build_rate(struct il_priv *il, in il4965_tx_cmd_build_rate() argument
1575 rate_idx = rate_lowest_index(&il->bands[info->band], sta); in il4965_tx_cmd_build_rate()
1589 il4965_toggle_tx_ant(il, &il->mgmt_tx_ant, il->hw_params.valid_tx_ant); in il4965_tx_cmd_build_rate()
1590 rate_flags |= BIT(il->mgmt_tx_ant) << RATE_MCS_ANT_POS; in il4965_tx_cmd_build_rate()
1597 il4965_tx_cmd_build_hwcrypto(struct il_priv *il, struct ieee80211_tx_info *info, in il4965_tx_cmd_build_hwcrypto() argument
1642 il4965_tx_skb(struct il_priv *il, in il4965_tx_skb() argument
1669 spin_lock_irqsave(&il->lock, flags); in il4965_tx_skb()
1670 if (il_is_rfkill(il)) { in il4965_tx_skb()
1690 sta_id = il->hw_params.bcast_id; in il4965_tx_skb()
1693 sta_id = il_sta_id_or_broadcast(il, sta); in il4965_tx_skb()
1717 il4965_sta_modify_sleep_tx_count(il, sta_id, 1); in il4965_tx_skb()
1727 spin_lock(&il->sta_lock); in il4965_tx_skb()
1733 spin_unlock(&il->sta_lock); in il4965_tx_skb()
1736 seq_number = il->stations[sta_id].tid[tid].seq_number; in il4965_tx_skb()
1744 il->stations[sta_id].tid[tid].agg.state == IL_AGG_ON) { in il4965_tx_skb()
1745 txq_id = il->stations[sta_id].tid[tid].agg.txq_id; in il4965_tx_skb()
1750 txq = &il->txq[txq_id]; in il4965_tx_skb()
1754 spin_unlock(&il->sta_lock); in il4965_tx_skb()
1759 il->stations[sta_id].tid[tid].tfds_in_queue++; in il4965_tx_skb()
1761 il->stations[sta_id].tid[tid].seq_number = seq_number; in il4965_tx_skb()
1764 spin_unlock(&il->sta_lock); in il4965_tx_skb()
1793 il4965_tx_cmd_build_hwcrypto(il, info, tx_cmd, skb, sta_id); in il4965_tx_skb()
1796 il4965_tx_cmd_build_basic(il, skb, tx_cmd, info, hdr, sta_id); in il4965_tx_skb()
1798 il4965_tx_cmd_build_rate(il, tx_cmd, info, sta, fc); in il4965_tx_skb()
1819 pci_map_single(il->pci_dev, &out_cmd->hdr, firstlen, in il4965_tx_skb()
1821 if (unlikely(pci_dma_mapping_error(il->pci_dev, txcmd_phys))) in il4965_tx_skb()
1829 pci_map_single(il->pci_dev, skb->data + hdr_len, secondlen, in il4965_tx_skb()
1831 if (unlikely(pci_dma_mapping_error(il->pci_dev, phys_addr))) in il4965_tx_skb()
1837 il->ops->txq_attach_buf_to_tfd(il, txq, txcmd_phys, firstlen, 1, 0); in il4965_tx_skb()
1841 il->ops->txq_attach_buf_to_tfd(il, txq, phys_addr, secondlen, in il4965_tx_skb()
1856 pci_dma_sync_single_for_cpu(il->pci_dev, txcmd_phys, firstlen, in il4965_tx_skb()
1861 il_update_stats(il, true, fc, skb->len); in il4965_tx_skb()
1865 il_print_hex_dump(il, IL_DL_TX, (u8 *) tx_cmd, sizeof(*tx_cmd)); in il4965_tx_skb()
1866 il_print_hex_dump(il, IL_DL_TX, (u8 *) tx_cmd->hdr, hdr_len); in il4965_tx_skb()
1870 il->ops->txq_update_byte_cnt_tbl(il, txq, le16_to_cpu(tx_cmd->len)); in il4965_tx_skb()
1872 pci_dma_sync_single_for_device(il->pci_dev, txcmd_phys, firstlen, in il4965_tx_skb()
1877 il_txq_update_write_ptr(il, txq); in il4965_tx_skb()
1878 spin_unlock_irqrestore(&il->lock, flags); in il4965_tx_skb()
1897 if (il_queue_space(q) < q->high_mark && il->mac80211_registered) { in il4965_tx_skb()
1899 spin_lock_irqsave(&il->lock, flags); in il4965_tx_skb()
1901 il_txq_update_write_ptr(il, txq); in il4965_tx_skb()
1902 spin_unlock_irqrestore(&il->lock, flags); in il4965_tx_skb()
1904 il_stop_queue(il, txq); in il4965_tx_skb()
1911 spin_unlock_irqrestore(&il->lock, flags); in il4965_tx_skb()
1916 il4965_alloc_dma_ptr(struct il_priv *il, struct il_dma_ptr *ptr, size_t size) in il4965_alloc_dma_ptr() argument
1918 ptr->addr = dma_alloc_coherent(&il->pci_dev->dev, size, &ptr->dma, in il4965_alloc_dma_ptr()
1927 il4965_free_dma_ptr(struct il_priv *il, struct il_dma_ptr *ptr) in il4965_free_dma_ptr() argument
1932 dma_free_coherent(&il->pci_dev->dev, ptr->size, ptr->addr, ptr->dma); in il4965_free_dma_ptr()
1942 il4965_hw_txq_ctx_free(struct il_priv *il) in il4965_hw_txq_ctx_free() argument
1947 if (il->txq) { in il4965_hw_txq_ctx_free()
1948 for (txq_id = 0; txq_id < il->hw_params.max_txq_num; txq_id++) in il4965_hw_txq_ctx_free()
1949 if (txq_id == il->cmd_queue) in il4965_hw_txq_ctx_free()
1950 il_cmd_queue_free(il); in il4965_hw_txq_ctx_free()
1952 il_tx_queue_free(il, txq_id); in il4965_hw_txq_ctx_free()
1954 il4965_free_dma_ptr(il, &il->kw); in il4965_hw_txq_ctx_free()
1956 il4965_free_dma_ptr(il, &il->scd_bc_tbls); in il4965_hw_txq_ctx_free()
1959 il_free_txq_mem(il); in il4965_hw_txq_ctx_free()
1967 il4965_txq_ctx_alloc(struct il_priv *il) in il4965_txq_ctx_alloc() argument
1973 il4965_hw_txq_ctx_free(il); in il4965_txq_ctx_alloc()
1976 il4965_alloc_dma_ptr(il, &il->scd_bc_tbls, in il4965_txq_ctx_alloc()
1977 il->hw_params.scd_bc_tbls_size); in il4965_txq_ctx_alloc()
1983 ret = il4965_alloc_dma_ptr(il, &il->kw, IL_KW_SIZE); in il4965_txq_ctx_alloc()
1990 ret = il_alloc_txq_mem(il); in il4965_txq_ctx_alloc()
1994 spin_lock_irqsave(&il->lock, flags); in il4965_txq_ctx_alloc()
1997 il4965_txq_set_sched(il, 0); in il4965_txq_ctx_alloc()
2000 il_wr(il, FH49_KW_MEM_ADDR_REG, il->kw.dma >> 4); in il4965_txq_ctx_alloc()
2002 spin_unlock_irqrestore(&il->lock, flags); in il4965_txq_ctx_alloc()
2005 for (txq_id = 0; txq_id < il->hw_params.max_txq_num; txq_id++) { in il4965_txq_ctx_alloc()
2006 ret = il_tx_queue_init(il, txq_id); in il4965_txq_ctx_alloc()
2016 il4965_hw_txq_ctx_free(il); in il4965_txq_ctx_alloc()
2017 il4965_free_dma_ptr(il, &il->kw); in il4965_txq_ctx_alloc()
2019 il4965_free_dma_ptr(il, &il->scd_bc_tbls); in il4965_txq_ctx_alloc()
2025 il4965_txq_ctx_reset(struct il_priv *il) in il4965_txq_ctx_reset() argument
2030 spin_lock_irqsave(&il->lock, flags); in il4965_txq_ctx_reset()
2033 il4965_txq_set_sched(il, 0); in il4965_txq_ctx_reset()
2035 il_wr(il, FH49_KW_MEM_ADDR_REG, il->kw.dma >> 4); in il4965_txq_ctx_reset()
2037 spin_unlock_irqrestore(&il->lock, flags); in il4965_txq_ctx_reset()
2040 for (txq_id = 0; txq_id < il->hw_params.max_txq_num; txq_id++) in il4965_txq_ctx_reset()
2041 il_tx_queue_reset(il, txq_id); in il4965_txq_ctx_reset()
2045 il4965_txq_ctx_unmap(struct il_priv *il) in il4965_txq_ctx_unmap() argument
2049 if (!il->txq) in il4965_txq_ctx_unmap()
2053 for (txq_id = 0; txq_id < il->hw_params.max_txq_num; txq_id++) in il4965_txq_ctx_unmap()
2054 if (txq_id == il->cmd_queue) in il4965_txq_ctx_unmap()
2055 il_cmd_queue_unmap(il); in il4965_txq_ctx_unmap()
2057 il_tx_queue_unmap(il, txq_id); in il4965_txq_ctx_unmap()
2064 il4965_txq_ctx_stop(struct il_priv *il) in il4965_txq_ctx_stop() argument
2068 _il_wr_prph(il, IL49_SCD_TXFACT, 0); in il4965_txq_ctx_stop()
2071 for (ch = 0; ch < il->hw_params.dma_chnl_num; ch++) { in il4965_txq_ctx_stop()
2072 _il_wr(il, FH49_TCSR_CHNL_TX_CONFIG_REG(ch), 0x0); in il4965_txq_ctx_stop()
2074 _il_poll_bit(il, FH49_TSSR_TX_STATUS_REG, in il4965_txq_ctx_stop()
2080 ch, _il_rd(il, FH49_TSSR_TX_STATUS_REG)); in il4965_txq_ctx_stop()
2091 il4965_txq_ctx_activate_free(struct il_priv *il) in il4965_txq_ctx_activate_free() argument
2095 for (txq_id = 0; txq_id < il->hw_params.max_txq_num; txq_id++) in il4965_txq_ctx_activate_free()
2096 if (!test_and_set_bit(txq_id, &il->txq_ctx_active_msk)) in il4965_txq_ctx_activate_free()
2105 il4965_tx_queue_stop_scheduler(struct il_priv *il, u16 txq_id) in il4965_tx_queue_stop_scheduler() argument
2109 il_wr_prph(il, IL49_SCD_QUEUE_STATUS_BITS(txq_id), in il4965_tx_queue_stop_scheduler()
2118 il4965_tx_queue_set_q2ratid(struct il_priv *il, u16 ra_tid, u16 txq_id) in il4965_tx_queue_set_q2ratid() argument
2127 il->scd_base_addr + IL49_SCD_TRANSLATE_TBL_OFFSET_QUEUE(txq_id); in il4965_tx_queue_set_q2ratid()
2129 tbl_dw = il_read_targ_mem(il, tbl_dw_addr); in il4965_tx_queue_set_q2ratid()
2136 il_write_targ_mem(il, tbl_dw_addr, tbl_dw); in il4965_tx_queue_set_q2ratid()
2148 il4965_txq_agg_enable(struct il_priv *il, int txq_id, int tx_fifo, int sta_id, in il4965_txq_agg_enable() argument
2157 il->cfg->num_of_ampdu_queues <= txq_id)) { in il4965_txq_agg_enable()
2161 il->cfg->num_of_ampdu_queues - 1); in il4965_txq_agg_enable()
2168 ret = il4965_sta_tx_modify_enable_tid(il, sta_id, tid); in il4965_txq_agg_enable()
2172 spin_lock_irqsave(&il->lock, flags); in il4965_txq_agg_enable()
2175 il4965_tx_queue_stop_scheduler(il, txq_id); in il4965_txq_agg_enable()
2178 il4965_tx_queue_set_q2ratid(il, ra_tid, txq_id); in il4965_txq_agg_enable()
2181 il_set_bits_prph(il, IL49_SCD_QUEUECHAIN_SEL, (1 << txq_id)); in il4965_txq_agg_enable()
2185 il->txq[txq_id].q.read_ptr = (ssn_idx & 0xff); in il4965_txq_agg_enable()
2186 il->txq[txq_id].q.write_ptr = (ssn_idx & 0xff); in il4965_txq_agg_enable()
2187 il4965_set_wr_ptrs(il, txq_id, ssn_idx); in il4965_txq_agg_enable()
2190 il_write_targ_mem(il, in il4965_txq_agg_enable()
2191 il->scd_base_addr + in il4965_txq_agg_enable()
2196 il_write_targ_mem(il, in il4965_txq_agg_enable()
2197 il->scd_base_addr + in il4965_txq_agg_enable()
2203 il_set_bits_prph(il, IL49_SCD_INTERRUPT_MASK, (1 << txq_id)); in il4965_txq_agg_enable()
2206 il4965_tx_queue_set_status(il, &il->txq[txq_id], tx_fifo, 1); in il4965_txq_agg_enable()
2208 spin_unlock_irqrestore(&il->lock, flags); in il4965_txq_agg_enable()
2214 il4965_tx_agg_start(struct il_priv *il, struct ieee80211_vif *vif, in il4965_tx_agg_start() argument
2239 if (il->stations[sta_id].tid[tid].agg.state != IL_AGG_OFF) { in il4965_tx_agg_start()
2244 txq_id = il4965_txq_ctx_activate_free(il); in il4965_tx_agg_start()
2250 spin_lock_irqsave(&il->sta_lock, flags); in il4965_tx_agg_start()
2251 tid_data = &il->stations[sta_id].tid[tid]; in il4965_tx_agg_start()
2254 il_set_swq_id(&il->txq[txq_id], il4965_get_ac_from_tid(tid), txq_id); in il4965_tx_agg_start()
2255 spin_unlock_irqrestore(&il->sta_lock, flags); in il4965_tx_agg_start()
2257 ret = il4965_txq_agg_enable(il, txq_id, tx_fifo, sta_id, tid, *ssn); in il4965_tx_agg_start()
2261 spin_lock_irqsave(&il->sta_lock, flags); in il4965_tx_agg_start()
2262 tid_data = &il->stations[sta_id].tid[tid]; in il4965_tx_agg_start()
2272 spin_unlock_irqrestore(&il->sta_lock, flags); in il4965_tx_agg_start()
2281 il4965_txq_agg_disable(struct il_priv *il, u16 txq_id, u16 ssn_idx, u8 tx_fifo) in il4965_txq_agg_disable() argument
2285 il->cfg->num_of_ampdu_queues <= txq_id)) { in il4965_txq_agg_disable()
2289 il->cfg->num_of_ampdu_queues - 1); in il4965_txq_agg_disable()
2293 il4965_tx_queue_stop_scheduler(il, txq_id); in il4965_txq_agg_disable()
2295 il_clear_bits_prph(il, IL49_SCD_QUEUECHAIN_SEL, (1 << txq_id)); in il4965_txq_agg_disable()
2297 il->txq[txq_id].q.read_ptr = (ssn_idx & 0xff); in il4965_txq_agg_disable()
2298 il->txq[txq_id].q.write_ptr = (ssn_idx & 0xff); in il4965_txq_agg_disable()
2300 il4965_set_wr_ptrs(il, txq_id, ssn_idx); in il4965_txq_agg_disable()
2302 il_clear_bits_prph(il, IL49_SCD_INTERRUPT_MASK, (1 << txq_id)); in il4965_txq_agg_disable()
2303 il_txq_ctx_deactivate(il, txq_id); in il4965_txq_agg_disable()
2304 il4965_tx_queue_set_status(il, &il->txq[txq_id], tx_fifo, 0); in il4965_txq_agg_disable()
2310 il4965_tx_agg_stop(struct il_priv *il, struct ieee80211_vif *vif, in il4965_tx_agg_stop() argument
2330 spin_lock_irqsave(&il->sta_lock, flags); in il4965_tx_agg_stop()
2332 tid_data = &il->stations[sta_id].tid[tid]; in il4965_tx_agg_stop()
2336 switch (il->stations[sta_id].tid[tid].agg.state) { in il4965_tx_agg_stop()
2352 write_ptr = il->txq[txq_id].q.write_ptr; in il4965_tx_agg_stop()
2353 read_ptr = il->txq[txq_id].q.read_ptr; in il4965_tx_agg_stop()
2358 il->stations[sta_id].tid[tid].agg.state = in il4965_tx_agg_stop()
2360 spin_unlock_irqrestore(&il->sta_lock, flags); in il4965_tx_agg_stop()
2366 il->stations[sta_id].tid[tid].agg.state = IL_AGG_OFF; in il4965_tx_agg_stop()
2369 spin_unlock(&il->sta_lock); in il4965_tx_agg_stop()
2370 spin_lock(&il->lock); in il4965_tx_agg_stop()
2379 il4965_txq_agg_disable(il, txq_id, ssn, tx_fifo_id); in il4965_tx_agg_stop()
2380 spin_unlock_irqrestore(&il->lock, flags); in il4965_tx_agg_stop()
2388 il4965_txq_check_empty(struct il_priv *il, int sta_id, u8 tid, int txq_id) in il4965_txq_check_empty() argument
2390 struct il_queue *q = &il->txq[txq_id].q; in il4965_txq_check_empty()
2391 u8 *addr = il->stations[sta_id].sta.sta.addr; in il4965_txq_check_empty()
2392 struct il_tid_data *tid_data = &il->stations[sta_id].tid[tid]; in il4965_txq_check_empty()
2394 lockdep_assert_held(&il->sta_lock); in il4965_txq_check_empty()
2396 switch (il->stations[sta_id].tid[tid].agg.state) { in il4965_txq_check_empty()
2405 il4965_txq_agg_disable(il, txq_id, ssn, tx_fifo); in il4965_txq_check_empty()
2407 ieee80211_stop_tx_ba_cb_irqsafe(il->vif, addr, tid); in il4965_txq_check_empty()
2415 ieee80211_start_tx_ba_cb_irqsafe(il->vif, addr, tid); in il4965_txq_check_empty()
2424 il4965_non_agg_tx_status(struct il_priv *il, const u8 *addr1) in il4965_non_agg_tx_status() argument
2430 sta = ieee80211_find_sta(il->vif, addr1); in il4965_non_agg_tx_status()
2436 ieee80211_sta_block_awake(il->hw, sta, false); in il4965_non_agg_tx_status()
2442 il4965_tx_status(struct il_priv *il, struct sk_buff *skb, bool is_agg) in il4965_tx_status() argument
2447 il4965_non_agg_tx_status(il, hdr->addr1); in il4965_tx_status()
2449 ieee80211_tx_status_irqsafe(il->hw, skb); in il4965_tx_status()
2453 il4965_tx_queue_reclaim(struct il_priv *il, int txq_id, int idx) in il4965_tx_queue_reclaim() argument
2455 struct il_tx_queue *txq = &il->txq[txq_id]; in il4965_tx_queue_reclaim()
2480 il4965_tx_status(il, skb, txq_id >= IL4965_FIRST_AMPDU_QUEUE); in il4965_tx_queue_reclaim()
2483 il->ops->txq_free_tfd(il, txq); in il4965_tx_queue_reclaim()
2495 il4965_tx_status_reply_compressed_ba(struct il_priv *il, struct il_ht_agg *agg, in il4965_tx_status_reply_compressed_ba() argument
2546 info = IEEE80211_SKB_CB(il->txq[scd_flow].skbs[agg->start_idx]); in il4965_tx_status_reply_compressed_ba()
2552 il4965_hwrate_to_tx_control(il, agg->rate_n_flags, info); in il4965_tx_status_reply_compressed_ba()
2565 il4965_find_station(struct il_priv *il, const u8 *addr) in il4965_find_station() argument
2572 if (il->iw_mode == NL80211_IFTYPE_ADHOC) in il4965_find_station()
2576 return il->hw_params.bcast_id; in il4965_find_station()
2578 spin_lock_irqsave(&il->sta_lock, flags); in il4965_find_station()
2579 for (i = start; i < il->hw_params.max_stations; i++) in il4965_find_station()
2580 if (il->stations[i].used && in il4965_find_station()
2581 ether_addr_equal(il->stations[i].sta.sta.addr, addr)) { in il4965_find_station()
2586 D_ASSOC("can not find STA %pM total %d\n", addr, il->num_stations); in il4965_find_station()
2595 (!(il->stations[ret].used & IL_STA_UCODE_ACTIVE) || in il4965_find_station()
2596 ((il->stations[ret].used & IL_STA_UCODE_ACTIVE) && in il4965_find_station()
2597 (il->stations[ret].used & IL_STA_UCODE_INPROGRESS)))) { in il4965_find_station()
2602 spin_unlock_irqrestore(&il->sta_lock, flags); in il4965_find_station()
2607 il4965_get_ra_sta_id(struct il_priv *il, struct ieee80211_hdr *hdr) in il4965_get_ra_sta_id() argument
2609 if (il->iw_mode == NL80211_IFTYPE_STATION) in il4965_get_ra_sta_id()
2614 return il4965_find_station(il, da); in il4965_get_ra_sta_id()
2645 il4965_tx_status_reply_tx(struct il_priv *il, struct il_ht_agg *agg, in il4965_tx_status_reply_tx() argument
2673 info = IEEE80211_SKB_CB(il->txq[txq_id].skbs[idx]); in il4965_tx_status_reply_tx()
2677 il4965_hwrate_to_tx_control(il, rate_n_flags, info); in il4965_tx_status_reply_tx()
2706 skb = il->txq[txq_id].skbs[idx]; in il4965_tx_status_reply_tx()
2757 il4965_hdl_tx(struct il_priv *il, struct il_rx_buf *rxb) in il4965_hdl_tx() argument
2763 struct il_tx_queue *txq = &il->txq[txq_id]; in il4965_hdl_tx()
2794 sta_id = il4965_get_ra_sta_id(il, hdr); in il4965_hdl_tx()
2808 il->iw_mode == NL80211_IFTYPE_STATION) { in il4965_hdl_tx()
2809 il_stop_queues_by_reason(il, IL_STOP_REASON_PASSIVE); in il4965_hdl_tx()
2813 spin_lock_irqsave(&il->sta_lock, flags); in il4965_hdl_tx()
2819 agg = &il->stations[sta_id].tid[tid].agg; in il4965_hdl_tx()
2821 il4965_tx_status_reply_tx(il, agg, tx_resp, txq_id, idx); in il4965_hdl_tx()
2832 freed = il4965_tx_queue_reclaim(il, txq_id, idx); in il4965_hdl_tx()
2834 il4965_free_tfds_in_queue(il, sta_id, tid, in il4965_hdl_tx()
2837 if (il->mac80211_registered && in il4965_hdl_tx()
2840 il_wake_queue(il, txq); in il4965_hdl_tx()
2845 il4965_hwrate_to_tx_control(il, in il4965_hdl_tx()
2855 freed = il4965_tx_queue_reclaim(il, txq_id, idx); in il4965_hdl_tx()
2857 il4965_free_tfds_in_queue(il, sta_id, tid, freed); in il4965_hdl_tx()
2861 if (il->mac80211_registered && in il4965_hdl_tx()
2863 il_wake_queue(il, txq); in il4965_hdl_tx()
2866 il4965_txq_check_empty(il, sta_id, tid, txq_id); in il4965_hdl_tx()
2868 il4965_check_abort_status(il, tx_resp->frame_count, status); in il4965_hdl_tx()
2870 spin_unlock_irqrestore(&il->sta_lock, flags); in il4965_hdl_tx()
2877 il4965_hwrate_to_tx_control(struct il_priv *il, u32 rate_n_flags, in il4965_hwrate_to_tx_control() argument
2904 il4965_hdl_compressed_ba(struct il_priv *il, struct il_rx_buf *rxb) in il4965_hdl_compressed_ba() argument
2922 if (scd_flow >= il->hw_params.max_txq_num) { in il4965_hdl_compressed_ba()
2927 txq = &il->txq[scd_flow]; in il4965_hdl_compressed_ba()
2930 agg = &il->stations[sta_id].tid[tid].agg; in il4965_hdl_compressed_ba()
2946 spin_lock_irqsave(&il->sta_lock, flags); in il4965_hdl_compressed_ba()
2959 il4965_tx_status_reply_compressed_ba(il, agg, ba_resp); in il4965_hdl_compressed_ba()
2966 int freed = il4965_tx_queue_reclaim(il, scd_flow, idx); in il4965_hdl_compressed_ba()
2967 il4965_free_tfds_in_queue(il, sta_id, tid, freed); in il4965_hdl_compressed_ba()
2970 il->mac80211_registered && in il4965_hdl_compressed_ba()
2972 il_wake_queue(il, txq); in il4965_hdl_compressed_ba()
2974 il4965_txq_check_empty(il, sta_id, tid, scd_flow); in il4965_hdl_compressed_ba()
2977 spin_unlock_irqrestore(&il->sta_lock, flags); in il4965_hdl_compressed_ba()
3021 il4965_sta_alloc_lq(struct il_priv *il, u8 sta_id) in il4965_sta_alloc_lq() argument
3035 if (il->band == NL80211_BAND_5GHZ) in il4965_sta_alloc_lq()
3044 il4965_first_antenna(il->hw_params. in il4965_sta_alloc_lq()
3051 il4965_first_antenna(il->hw_params.valid_tx_ant); in il4965_sta_alloc_lq()
3054 il->hw_params.valid_tx_ant & ~il4965_first_antenna(il->hw_params. in il4965_sta_alloc_lq()
3058 } else if (il4965_num_of_ant(il->hw_params.valid_tx_ant) == 2) { in il4965_sta_alloc_lq()
3060 il->hw_params.valid_tx_ant; in il4965_sta_alloc_lq()
3078 il4965_add_bssid_station(struct il_priv *il, const u8 *addr, u8 *sta_id_r) in il4965_add_bssid_station() argument
3088 ret = il_add_station_common(il, addr, 0, NULL, &sta_id); in il4965_add_bssid_station()
3097 spin_lock_irqsave(&il->sta_lock, flags); in il4965_add_bssid_station()
3098 il->stations[sta_id].used |= IL_STA_LOCAL; in il4965_add_bssid_station()
3099 spin_unlock_irqrestore(&il->sta_lock, flags); in il4965_add_bssid_station()
3102 link_cmd = il4965_sta_alloc_lq(il, sta_id); in il4965_add_bssid_station()
3109 ret = il_send_lq_cmd(il, link_cmd, CMD_SYNC, true); in il4965_add_bssid_station()
3113 spin_lock_irqsave(&il->sta_lock, flags); in il4965_add_bssid_station()
3114 il->stations[sta_id].lq = link_cmd; in il4965_add_bssid_station()
3115 spin_unlock_irqrestore(&il->sta_lock, flags); in il4965_add_bssid_station()
3121 il4965_static_wepkey_cmd(struct il_priv *il, bool send_if_empty) in il4965_static_wepkey_cmd() argument
3141 u8 key_size = il->_4965.wep_keys[i].key_size; in il4965_static_wepkey_cmd()
3151 memcpy(&wep_cmd->key[i].key[3], il->_4965.wep_keys[i].key, key_size); in il4965_static_wepkey_cmd()
3161 return il_send_cmd(il, &cmd); in il4965_static_wepkey_cmd()
3167 il4965_restore_default_wep_keys(struct il_priv *il) in il4965_restore_default_wep_keys() argument
3169 lockdep_assert_held(&il->mutex); in il4965_restore_default_wep_keys()
3171 return il4965_static_wepkey_cmd(il, false); in il4965_restore_default_wep_keys()
3175 il4965_remove_default_wep_key(struct il_priv *il, in il4965_remove_default_wep_key() argument
3181 lockdep_assert_held(&il->mutex); in il4965_remove_default_wep_key()
3185 memset(&il->_4965.wep_keys[idx], 0, sizeof(struct il_wep_key)); in il4965_remove_default_wep_key()
3186 if (il_is_rfkill(il)) { in il4965_remove_default_wep_key()
3191 ret = il4965_static_wepkey_cmd(il, 1); in il4965_remove_default_wep_key()
3198 il4965_set_default_wep_key(struct il_priv *il, in il4965_set_default_wep_key() argument
3205 lockdep_assert_held(&il->mutex); in il4965_set_default_wep_key()
3214 il->stations[IL_AP_ID].keyinfo.cipher = keyconf->cipher; in il4965_set_default_wep_key()
3216 il->_4965.wep_keys[idx].key_size = len; in il4965_set_default_wep_key()
3217 memcpy(&il->_4965.wep_keys[idx].key, &keyconf->key, len); in il4965_set_default_wep_key()
3219 ret = il4965_static_wepkey_cmd(il, false); in il4965_set_default_wep_key()
3226 il4965_set_wep_dynamic_key_info(struct il_priv *il, in il4965_set_wep_dynamic_key_info() argument
3233 lockdep_assert_held(&il->mutex); in il4965_set_wep_dynamic_key_info()
3244 if (sta_id == il->hw_params.bcast_id) in il4965_set_wep_dynamic_key_info()
3247 spin_lock_irqsave(&il->sta_lock, flags); in il4965_set_wep_dynamic_key_info()
3249 il->stations[sta_id].keyinfo.cipher = keyconf->cipher; in il4965_set_wep_dynamic_key_info()
3250 il->stations[sta_id].keyinfo.keylen = keyconf->keylen; in il4965_set_wep_dynamic_key_info()
3251 il->stations[sta_id].keyinfo.keyidx = keyconf->keyidx; in il4965_set_wep_dynamic_key_info()
3253 memcpy(il->stations[sta_id].keyinfo.key, keyconf->key, keyconf->keylen); in il4965_set_wep_dynamic_key_info()
3255 memcpy(&il->stations[sta_id].sta.key.key[3], keyconf->key, in il4965_set_wep_dynamic_key_info()
3258 if ((il->stations[sta_id].sta.key. in il4965_set_wep_dynamic_key_info()
3260 il->stations[sta_id].sta.key.key_offset = in il4965_set_wep_dynamic_key_info()
3261 il_get_free_ucode_key_idx(il); in il4965_set_wep_dynamic_key_info()
3265 WARN(il->stations[sta_id].sta.key.key_offset == WEP_INVALID_OFFSET, in il4965_set_wep_dynamic_key_info()
3268 il->stations[sta_id].sta.key.key_flags = key_flags; in il4965_set_wep_dynamic_key_info()
3269 il->stations[sta_id].sta.sta.modify_mask = STA_MODIFY_KEY_MASK; in il4965_set_wep_dynamic_key_info()
3270 il->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK; in il4965_set_wep_dynamic_key_info()
3272 memcpy(&sta_cmd, &il->stations[sta_id].sta, in il4965_set_wep_dynamic_key_info()
3274 spin_unlock_irqrestore(&il->sta_lock, flags); in il4965_set_wep_dynamic_key_info()
3276 return il_send_add_sta(il, &sta_cmd, CMD_SYNC); in il4965_set_wep_dynamic_key_info()
3280 il4965_set_ccmp_dynamic_key_info(struct il_priv *il, in il4965_set_ccmp_dynamic_key_info() argument
3287 lockdep_assert_held(&il->mutex); in il4965_set_ccmp_dynamic_key_info()
3293 if (sta_id == il->hw_params.bcast_id) in il4965_set_ccmp_dynamic_key_info()
3298 spin_lock_irqsave(&il->sta_lock, flags); in il4965_set_ccmp_dynamic_key_info()
3299 il->stations[sta_id].keyinfo.cipher = keyconf->cipher; in il4965_set_ccmp_dynamic_key_info()
3300 il->stations[sta_id].keyinfo.keylen = keyconf->keylen; in il4965_set_ccmp_dynamic_key_info()
3302 memcpy(il->stations[sta_id].keyinfo.key, keyconf->key, keyconf->keylen); in il4965_set_ccmp_dynamic_key_info()
3304 memcpy(il->stations[sta_id].sta.key.key, keyconf->key, keyconf->keylen); in il4965_set_ccmp_dynamic_key_info()
3306 if ((il->stations[sta_id].sta.key. in il4965_set_ccmp_dynamic_key_info()
3308 il->stations[sta_id].sta.key.key_offset = in il4965_set_ccmp_dynamic_key_info()
3309 il_get_free_ucode_key_idx(il); in il4965_set_ccmp_dynamic_key_info()
3313 WARN(il->stations[sta_id].sta.key.key_offset == WEP_INVALID_OFFSET, in il4965_set_ccmp_dynamic_key_info()
3316 il->stations[sta_id].sta.key.key_flags = key_flags; in il4965_set_ccmp_dynamic_key_info()
3317 il->stations[sta_id].sta.sta.modify_mask = STA_MODIFY_KEY_MASK; in il4965_set_ccmp_dynamic_key_info()
3318 il->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK; in il4965_set_ccmp_dynamic_key_info()
3320 memcpy(&sta_cmd, &il->stations[sta_id].sta, in il4965_set_ccmp_dynamic_key_info()
3322 spin_unlock_irqrestore(&il->sta_lock, flags); in il4965_set_ccmp_dynamic_key_info()
3324 return il_send_add_sta(il, &sta_cmd, CMD_SYNC); in il4965_set_ccmp_dynamic_key_info()
3328 il4965_set_tkip_dynamic_key_info(struct il_priv *il, in il4965_set_tkip_dynamic_key_info() argument
3338 if (sta_id == il->hw_params.bcast_id) in il4965_set_tkip_dynamic_key_info()
3344 spin_lock_irqsave(&il->sta_lock, flags); in il4965_set_tkip_dynamic_key_info()
3346 il->stations[sta_id].keyinfo.cipher = keyconf->cipher; in il4965_set_tkip_dynamic_key_info()
3347 il->stations[sta_id].keyinfo.keylen = 16; in il4965_set_tkip_dynamic_key_info()
3349 if ((il->stations[sta_id].sta.key. in il4965_set_tkip_dynamic_key_info()
3351 il->stations[sta_id].sta.key.key_offset = in il4965_set_tkip_dynamic_key_info()
3352 il_get_free_ucode_key_idx(il); in il4965_set_tkip_dynamic_key_info()
3356 WARN(il->stations[sta_id].sta.key.key_offset == WEP_INVALID_OFFSET, in il4965_set_tkip_dynamic_key_info()
3359 il->stations[sta_id].sta.key.key_flags = key_flags; in il4965_set_tkip_dynamic_key_info()
3362 memcpy(il->stations[sta_id].keyinfo.key, keyconf->key, 16); in il4965_set_tkip_dynamic_key_info()
3364 memcpy(il->stations[sta_id].sta.key.key, keyconf->key, 16); in il4965_set_tkip_dynamic_key_info()
3366 spin_unlock_irqrestore(&il->sta_lock, flags); in il4965_set_tkip_dynamic_key_info()
3372 il4965_update_tkip_key(struct il_priv *il, struct ieee80211_key_conf *keyconf, in il4965_update_tkip_key() argument
3379 if (il_scan_cancel(il)) { in il4965_update_tkip_key()
3385 sta_id = il_sta_id_or_broadcast(il, sta); in il4965_update_tkip_key()
3389 spin_lock_irqsave(&il->sta_lock, flags); in il4965_update_tkip_key()
3391 il->stations[sta_id].sta.key.tkip_rx_tsc_byte2 = (u8) iv32; in il4965_update_tkip_key()
3394 il->stations[sta_id].sta.key.tkip_rx_ttak[i] = in il4965_update_tkip_key()
3397 il->stations[sta_id].sta.sta.modify_mask = STA_MODIFY_KEY_MASK; in il4965_update_tkip_key()
3398 il->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK; in il4965_update_tkip_key()
3400 il_send_add_sta(il, &il->stations[sta_id].sta, CMD_ASYNC); in il4965_update_tkip_key()
3402 spin_unlock_irqrestore(&il->sta_lock, flags); in il4965_update_tkip_key()
3406 il4965_remove_dynamic_key(struct il_priv *il, in il4965_remove_dynamic_key() argument
3414 lockdep_assert_held(&il->mutex); in il4965_remove_dynamic_key()
3416 il->_4965.key_mapping_keys--; in il4965_remove_dynamic_key()
3418 spin_lock_irqsave(&il->sta_lock, flags); in il4965_remove_dynamic_key()
3419 key_flags = le16_to_cpu(il->stations[sta_id].sta.key.key_flags); in il4965_remove_dynamic_key()
3430 spin_unlock_irqrestore(&il->sta_lock, flags); in il4965_remove_dynamic_key()
3434 if (il->stations[sta_id].sta.key.key_flags & STA_KEY_FLG_INVALID) { in il4965_remove_dynamic_key()
3437 spin_unlock_irqrestore(&il->sta_lock, flags); in il4965_remove_dynamic_key()
3442 (il->stations[sta_id].sta.key.key_offset, &il->ucode_key_table)) in il4965_remove_dynamic_key()
3444 il->stations[sta_id].sta.key.key_offset); in il4965_remove_dynamic_key()
3445 memset(&il->stations[sta_id].keyinfo, 0, sizeof(struct il_hw_key)); in il4965_remove_dynamic_key()
3446 memset(&il->stations[sta_id].sta.key, 0, sizeof(struct il4965_keyinfo)); in il4965_remove_dynamic_key()
3447 il->stations[sta_id].sta.key.key_flags = in il4965_remove_dynamic_key()
3449 il->stations[sta_id].sta.key.key_offset = keyconf->hw_key_idx; in il4965_remove_dynamic_key()
3450 il->stations[sta_id].sta.sta.modify_mask = STA_MODIFY_KEY_MASK; in il4965_remove_dynamic_key()
3451 il->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK; in il4965_remove_dynamic_key()
3453 if (il_is_rfkill(il)) { in il4965_remove_dynamic_key()
3456 spin_unlock_irqrestore(&il->sta_lock, flags); in il4965_remove_dynamic_key()
3459 memcpy(&sta_cmd, &il->stations[sta_id].sta, in il4965_remove_dynamic_key()
3461 spin_unlock_irqrestore(&il->sta_lock, flags); in il4965_remove_dynamic_key()
3463 return il_send_add_sta(il, &sta_cmd, CMD_SYNC); in il4965_remove_dynamic_key()
3467 il4965_set_dynamic_key(struct il_priv *il, struct ieee80211_key_conf *keyconf, in il4965_set_dynamic_key() argument
3472 lockdep_assert_held(&il->mutex); in il4965_set_dynamic_key()
3474 il->_4965.key_mapping_keys++; in il4965_set_dynamic_key()
3480 il4965_set_ccmp_dynamic_key_info(il, keyconf, sta_id); in il4965_set_dynamic_key()
3484 il4965_set_tkip_dynamic_key_info(il, keyconf, sta_id); in il4965_set_dynamic_key()
3488 ret = il4965_set_wep_dynamic_key_info(il, keyconf, sta_id); in il4965_set_dynamic_key()
3510 il4965_alloc_bcast_station(struct il_priv *il) in il4965_alloc_bcast_station() argument
3516 spin_lock_irqsave(&il->sta_lock, flags); in il4965_alloc_bcast_station()
3517 sta_id = il_prep_station(il, il_bcast_addr, false, NULL); in il4965_alloc_bcast_station()
3520 spin_unlock_irqrestore(&il->sta_lock, flags); in il4965_alloc_bcast_station()
3525 il->stations[sta_id].used |= IL_STA_DRIVER_ACTIVE; in il4965_alloc_bcast_station()
3526 il->stations[sta_id].used |= IL_STA_BCAST; in il4965_alloc_bcast_station()
3527 spin_unlock_irqrestore(&il->sta_lock, flags); in il4965_alloc_bcast_station()
3529 link_cmd = il4965_sta_alloc_lq(il, sta_id); in il4965_alloc_bcast_station()
3536 spin_lock_irqsave(&il->sta_lock, flags); in il4965_alloc_bcast_station()
3537 il->stations[sta_id].lq = link_cmd; in il4965_alloc_bcast_station()
3538 spin_unlock_irqrestore(&il->sta_lock, flags); in il4965_alloc_bcast_station()
3550 il4965_update_bcast_station(struct il_priv *il) in il4965_update_bcast_station() argument
3554 u8 sta_id = il->hw_params.bcast_id; in il4965_update_bcast_station()
3556 link_cmd = il4965_sta_alloc_lq(il, sta_id); in il4965_update_bcast_station()
3562 spin_lock_irqsave(&il->sta_lock, flags); in il4965_update_bcast_station()
3563 if (il->stations[sta_id].lq) in il4965_update_bcast_station()
3564 kfree(il->stations[sta_id].lq); in il4965_update_bcast_station()
3567 il->stations[sta_id].lq = link_cmd; in il4965_update_bcast_station()
3568 spin_unlock_irqrestore(&il->sta_lock, flags); in il4965_update_bcast_station()
3574 il4965_update_bcast_stations(struct il_priv *il) in il4965_update_bcast_stations() argument
3576 return il4965_update_bcast_station(il); in il4965_update_bcast_stations()
3583 il4965_sta_tx_modify_enable_tid(struct il_priv *il, int sta_id, int tid) in il4965_sta_tx_modify_enable_tid() argument
3588 lockdep_assert_held(&il->mutex); in il4965_sta_tx_modify_enable_tid()
3591 spin_lock_irqsave(&il->sta_lock, flags); in il4965_sta_tx_modify_enable_tid()
3592 il->stations[sta_id].sta.sta.modify_mask = STA_MODIFY_TID_DISABLE_TX; in il4965_sta_tx_modify_enable_tid()
3593 il->stations[sta_id].sta.tid_disable_tx &= cpu_to_le16(~(1 << tid)); in il4965_sta_tx_modify_enable_tid()
3594 il->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK; in il4965_sta_tx_modify_enable_tid()
3595 memcpy(&sta_cmd, &il->stations[sta_id].sta, in il4965_sta_tx_modify_enable_tid()
3597 spin_unlock_irqrestore(&il->sta_lock, flags); in il4965_sta_tx_modify_enable_tid()
3599 return il_send_add_sta(il, &sta_cmd, CMD_SYNC); in il4965_sta_tx_modify_enable_tid()
3603 il4965_sta_rx_agg_start(struct il_priv *il, struct ieee80211_sta *sta, int tid, in il4965_sta_rx_agg_start() argument
3610 lockdep_assert_held(&il->mutex); in il4965_sta_rx_agg_start()
3616 spin_lock_irqsave(&il->sta_lock, flags); in il4965_sta_rx_agg_start()
3617 il->stations[sta_id].sta.station_flags_msk = 0; in il4965_sta_rx_agg_start()
3618 il->stations[sta_id].sta.sta.modify_mask = STA_MODIFY_ADDBA_TID_MSK; in il4965_sta_rx_agg_start()
3619 il->stations[sta_id].sta.add_immediate_ba_tid = (u8) tid; in il4965_sta_rx_agg_start()
3620 il->stations[sta_id].sta.add_immediate_ba_ssn = cpu_to_le16(ssn); in il4965_sta_rx_agg_start()
3621 il->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK; in il4965_sta_rx_agg_start()
3622 memcpy(&sta_cmd, &il->stations[sta_id].sta, in il4965_sta_rx_agg_start()
3624 spin_unlock_irqrestore(&il->sta_lock, flags); in il4965_sta_rx_agg_start()
3626 return il_send_add_sta(il, &sta_cmd, CMD_SYNC); in il4965_sta_rx_agg_start()
3630 il4965_sta_rx_agg_stop(struct il_priv *il, struct ieee80211_sta *sta, int tid) in il4965_sta_rx_agg_stop() argument
3636 lockdep_assert_held(&il->mutex); in il4965_sta_rx_agg_stop()
3644 spin_lock_irqsave(&il->sta_lock, flags); in il4965_sta_rx_agg_stop()
3645 il->stations[sta_id].sta.station_flags_msk = 0; in il4965_sta_rx_agg_stop()
3646 il->stations[sta_id].sta.sta.modify_mask = STA_MODIFY_DELBA_TID_MSK; in il4965_sta_rx_agg_stop()
3647 il->stations[sta_id].sta.remove_immediate_ba_tid = (u8) tid; in il4965_sta_rx_agg_stop()
3648 il->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK; in il4965_sta_rx_agg_stop()
3649 memcpy(&sta_cmd, &il->stations[sta_id].sta, in il4965_sta_rx_agg_stop()
3651 spin_unlock_irqrestore(&il->sta_lock, flags); in il4965_sta_rx_agg_stop()
3653 return il_send_add_sta(il, &sta_cmd, CMD_SYNC); in il4965_sta_rx_agg_stop()
3657 il4965_sta_modify_sleep_tx_count(struct il_priv *il, int sta_id, int cnt) in il4965_sta_modify_sleep_tx_count() argument
3661 spin_lock_irqsave(&il->sta_lock, flags); in il4965_sta_modify_sleep_tx_count()
3662 il->stations[sta_id].sta.station_flags |= STA_FLG_PWR_SAVE_MSK; in il4965_sta_modify_sleep_tx_count()
3663 il->stations[sta_id].sta.station_flags_msk = STA_FLG_PWR_SAVE_MSK; in il4965_sta_modify_sleep_tx_count()
3664 il->stations[sta_id].sta.sta.modify_mask = in il4965_sta_modify_sleep_tx_count()
3666 il->stations[sta_id].sta.sleep_tx_count = cpu_to_le16(cnt); in il4965_sta_modify_sleep_tx_count()
3667 il->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK; in il4965_sta_modify_sleep_tx_count()
3668 il_send_add_sta(il, &il->stations[sta_id].sta, CMD_ASYNC); in il4965_sta_modify_sleep_tx_count()
3669 spin_unlock_irqrestore(&il->sta_lock, flags); in il4965_sta_modify_sleep_tx_count()
3674 il4965_update_chain_flags(struct il_priv *il) in il4965_update_chain_flags() argument
3676 if (il->ops->set_rxon_chain) { in il4965_update_chain_flags()
3677 il->ops->set_rxon_chain(il); in il4965_update_chain_flags()
3678 if (il->active.rx_chain != il->staging.rx_chain) in il4965_update_chain_flags()
3679 il_commit_rxon(il); in il4965_update_chain_flags()
3684 il4965_clear_free_frames(struct il_priv *il) in il4965_clear_free_frames() argument
3688 D_INFO("%d frames on pre-allocated heap on clear.\n", il->frames_count); in il4965_clear_free_frames()
3690 while (!list_empty(&il->free_frames)) { in il4965_clear_free_frames()
3691 element = il->free_frames.next; in il4965_clear_free_frames()
3694 il->frames_count--; in il4965_clear_free_frames()
3697 if (il->frames_count) { in il4965_clear_free_frames()
3699 il->frames_count); in il4965_clear_free_frames()
3700 il->frames_count = 0; in il4965_clear_free_frames()
3705 il4965_get_free_frame(struct il_priv *il) in il4965_get_free_frame() argument
3709 if (list_empty(&il->free_frames)) { in il4965_get_free_frame()
3716 il->frames_count++; in il4965_get_free_frame()
3720 element = il->free_frames.next; in il4965_get_free_frame()
3726 il4965_free_frame(struct il_priv *il, struct il_frame *frame) in il4965_free_frame() argument
3729 list_add(&frame->list, &il->free_frames); in il4965_free_frame()
3733 il4965_fill_beacon_frame(struct il_priv *il, struct ieee80211_hdr *hdr, in il4965_fill_beacon_frame() argument
3736 lockdep_assert_held(&il->mutex); in il4965_fill_beacon_frame()
3738 if (!il->beacon_skb) in il4965_fill_beacon_frame()
3741 if (il->beacon_skb->len > left) in il4965_fill_beacon_frame()
3744 memcpy(hdr, il->beacon_skb->data, il->beacon_skb->len); in il4965_fill_beacon_frame()
3746 return il->beacon_skb->len; in il4965_fill_beacon_frame()
3751 il4965_set_beacon_tim(struct il_priv *il, in il4965_set_beacon_tim() argument
3778 il4965_hw_get_beacon_cmd(struct il_priv *il, struct il_frame *frame) in il4965_hw_get_beacon_cmd() argument
3789 lockdep_assert_held(&il->mutex); in il4965_hw_get_beacon_cmd()
3791 if (!il->beacon_enabled) { in il4965_hw_get_beacon_cmd()
3802 il4965_fill_beacon_frame(il, tx_beacon_cmd->frame, in il4965_hw_get_beacon_cmd()
3811 tx_beacon_cmd->tx.sta_id = il->hw_params.bcast_id; in il4965_hw_get_beacon_cmd()
3818 il4965_set_beacon_tim(il, tx_beacon_cmd, (u8 *) tx_beacon_cmd->frame, in il4965_hw_get_beacon_cmd()
3822 rate = il_get_lowest_plcp(il); in il4965_hw_get_beacon_cmd()
3823 il4965_toggle_tx_ant(il, &il->mgmt_tx_ant, il->hw_params.valid_tx_ant); in il4965_hw_get_beacon_cmd()
3824 rate_flags = BIT(il->mgmt_tx_ant) << RATE_MCS_ANT_POS; in il4965_hw_get_beacon_cmd()
3833 il4965_send_beacon_cmd(struct il_priv *il) in il4965_send_beacon_cmd() argument
3839 frame = il4965_get_free_frame(il); in il4965_send_beacon_cmd()
3846 frame_size = il4965_hw_get_beacon_cmd(il, frame); in il4965_send_beacon_cmd()
3849 il4965_free_frame(il, frame); in il4965_send_beacon_cmd()
3853 rc = il_send_cmd_pdu(il, C_TX_BEACON, frame_size, &frame->u.cmd[0]); in il4965_send_beacon_cmd()
3855 il4965_free_frame(il, frame); in il4965_send_beacon_cmd()
3910 il4965_hw_txq_free_tfd(struct il_priv *il, struct il_tx_queue *txq) in il4965_hw_txq_free_tfd() argument
3914 struct pci_dev *dev = il->pci_dev; in il4965_hw_txq_free_tfd()
3955 il4965_hw_txq_attach_buf_to_tfd(struct il_priv *il, struct il_tx_queue *txq, in il4965_hw_txq_attach_buf_to_tfd() argument
3995 il4965_hw_tx_queue_init(struct il_priv *il, struct il_tx_queue *txq) in il4965_hw_tx_queue_init() argument
4000 il_wr(il, FH49_MEM_CBBC_QUEUE(txq_id), txq->q.dma_addr >> 8); in il4965_hw_tx_queue_init()
4011 il4965_hdl_alive(struct il_priv *il, struct il_rx_buf *rxb) in il4965_hdl_alive() argument
4024 memcpy(&il->card_alive_init, &pkt->u.alive_frame, in il4965_hdl_alive()
4026 pwork = &il->init_alive_start; in il4965_hdl_alive()
4029 memcpy(&il->card_alive, &pkt->u.alive_frame, in il4965_hdl_alive()
4031 pwork = &il->alive_start; in il4965_hdl_alive()
4037 queue_delayed_work(il->workqueue, pwork, msecs_to_jiffies(5)); in il4965_hdl_alive()
4055 struct il_priv *il = from_timer(il, t, stats_periodic); in il4965_bg_stats_periodic() local
4057 if (test_bit(S_EXIT_PENDING, &il->status)) in il4965_bg_stats_periodic()
4061 if (!il_is_ready_rf(il)) in il4965_bg_stats_periodic()
4064 il_send_stats_request(il, CMD_ASYNC, false); in il4965_bg_stats_periodic()
4068 il4965_hdl_beacon(struct il_priv *il, struct il_rx_buf *rxb) in il4965_hdl_beacon() argument
4082 il->ibss_manager = le32_to_cpu(beacon->ibss_mgr_status); in il4965_hdl_beacon()
4086 il4965_perform_ct_kill_task(struct il_priv *il) in il4965_perform_ct_kill_task() argument
4092 if (il->mac80211_registered) in il4965_perform_ct_kill_task()
4093 ieee80211_stop_queues(il->hw); in il4965_perform_ct_kill_task()
4095 _il_wr(il, CSR_UCODE_DRV_GP1_SET, in il4965_perform_ct_kill_task()
4097 _il_rd(il, CSR_UCODE_DRV_GP1); in il4965_perform_ct_kill_task()
4099 spin_lock_irqsave(&il->reg_lock, flags); in il4965_perform_ct_kill_task()
4100 if (likely(_il_grab_nic_access(il))) in il4965_perform_ct_kill_task()
4101 _il_release_nic_access(il); in il4965_perform_ct_kill_task()
4102 spin_unlock_irqrestore(&il->reg_lock, flags); in il4965_perform_ct_kill_task()
4108 il4965_hdl_card_state(struct il_priv *il, struct il_rx_buf *rxb) in il4965_hdl_card_state() argument
4112 unsigned long status = il->status; in il4965_hdl_card_state()
4121 _il_wr(il, CSR_UCODE_DRV_GP1_SET, in il4965_hdl_card_state()
4124 il_wr(il, HBUS_TARG_MBX_C, HBUS_TARG_MBX_C_REG_BIT_CMD_BLOCKED); in il4965_hdl_card_state()
4127 _il_wr(il, CSR_UCODE_DRV_GP1_CLR, in il4965_hdl_card_state()
4129 il_wr(il, HBUS_TARG_MBX_C, in il4965_hdl_card_state()
4135 il4965_perform_ct_kill_task(il); in il4965_hdl_card_state()
4138 set_bit(S_RFKILL, &il->status); in il4965_hdl_card_state()
4140 clear_bit(S_RFKILL, &il->status); in il4965_hdl_card_state()
4143 il_scan_cancel(il); in il4965_hdl_card_state()
4146 test_bit(S_RFKILL, &il->status))) in il4965_hdl_card_state()
4147 wiphy_rfkill_set_hw_state(il->hw->wiphy, in il4965_hdl_card_state()
4148 test_bit(S_RFKILL, &il->status)); in il4965_hdl_card_state()
4150 wake_up(&il->wait_command_queue); in il4965_hdl_card_state()
4163 il4965_setup_handlers(struct il_priv *il) in il4965_setup_handlers() argument
4165 il->handlers[N_ALIVE] = il4965_hdl_alive; in il4965_setup_handlers()
4166 il->handlers[N_ERROR] = il_hdl_error; in il4965_setup_handlers()
4167 il->handlers[N_CHANNEL_SWITCH] = il_hdl_csa; in il4965_setup_handlers()
4168 il->handlers[N_SPECTRUM_MEASUREMENT] = il_hdl_spectrum_measurement; in il4965_setup_handlers()
4169 il->handlers[N_PM_SLEEP] = il_hdl_pm_sleep; in il4965_setup_handlers()
4170 il->handlers[N_PM_DEBUG_STATS] = il_hdl_pm_debug_stats; in il4965_setup_handlers()
4171 il->handlers[N_BEACON] = il4965_hdl_beacon; in il4965_setup_handlers()
4178 il->handlers[C_STATS] = il4965_hdl_c_stats; in il4965_setup_handlers()
4179 il->handlers[N_STATS] = il4965_hdl_stats; in il4965_setup_handlers()
4181 il_setup_rx_scan_handlers(il); in il4965_setup_handlers()
4184 il->handlers[N_CARD_STATE] = il4965_hdl_card_state; in il4965_setup_handlers()
4186 il->handlers[N_MISSED_BEACONS] = il4965_hdl_missed_beacon; in il4965_setup_handlers()
4188 il->handlers[N_RX_PHY] = il4965_hdl_rx_phy; in il4965_setup_handlers()
4189 il->handlers[N_RX_MPDU] = il4965_hdl_rx; in il4965_setup_handlers()
4190 il->handlers[N_RX] = il4965_hdl_rx; in il4965_setup_handlers()
4192 il->handlers[N_COMPRESSED_BA] = il4965_hdl_compressed_ba; in il4965_setup_handlers()
4194 il->handlers[C_TX] = il4965_hdl_tx; in il4965_setup_handlers()
4205 il4965_rx_handle(struct il_priv *il) in il4965_rx_handle() argument
4209 struct il_rx_queue *rxq = &il->rxq; in il4965_rx_handle()
4246 pci_unmap_page(il->pci_dev, rxb->page_dma, in il4965_rx_handle()
4247 PAGE_SIZE << il->hw_params.rx_page_order, in il4965_rx_handle()
4254 reclaim = il_need_reclaim(il, pkt); in il4965_rx_handle()
4259 if (il->handlers[pkt->hdr.cmd]) { in il4965_rx_handle()
4262 il->isr_stats.handlers[pkt->hdr.cmd]++; in il4965_rx_handle()
4263 il->handlers[pkt->hdr.cmd] (il, rxb); in il4965_rx_handle()
4282 il_tx_cmd_complete(il, rxb); in il4965_rx_handle()
4293 pci_map_page(il->pci_dev, rxb->page, 0, in il4965_rx_handle()
4294 PAGE_SIZE << il->hw_params. in il4965_rx_handle()
4297 if (unlikely(pci_dma_mapping_error(il->pci_dev, in il4965_rx_handle()
4299 __il_free_pages(il, rxb->page); in il4965_rx_handle()
4318 il4965_rx_replenish_now(il); in il4965_rx_handle()
4327 il4965_rx_replenish_now(il); in il4965_rx_handle()
4329 il4965_rx_queue_restock(il); in il4965_rx_handle()
4334 il4965_synchronize_irq(struct il_priv *il) in il4965_synchronize_irq() argument
4337 synchronize_irq(il->pci_dev->irq); in il4965_synchronize_irq()
4338 tasklet_kill(&il->irq_tasklet); in il4965_synchronize_irq()
4344 struct il_priv *il = from_tasklet(il, t, irq_tasklet); in il4965_irq_tasklet() local
4353 spin_lock_irqsave(&il->lock, flags); in il4965_irq_tasklet()
4358 inta = _il_rd(il, CSR_INT); in il4965_irq_tasklet()
4359 _il_wr(il, CSR_INT, inta); in il4965_irq_tasklet()
4364 inta_fh = _il_rd(il, CSR_FH_INT_STATUS); in il4965_irq_tasklet()
4365 _il_wr(il, CSR_FH_INT_STATUS, inta_fh); in il4965_irq_tasklet()
4368 if (il_get_debug_level(il) & IL_DL_ISR) { in il4965_irq_tasklet()
4370 inta_mask = _il_rd(il, CSR_INT_MASK); in il4965_irq_tasklet()
4376 spin_unlock_irqrestore(&il->lock, flags); in il4965_irq_tasklet()
4392 il_disable_interrupts(il); in il4965_irq_tasklet()
4394 il->isr_stats.hw++; in il4965_irq_tasklet()
4395 il_irq_handle_error(il); in il4965_irq_tasklet()
4402 if (il_get_debug_level(il) & (IL_DL_ISR)) { in il4965_irq_tasklet()
4407 il->isr_stats.sch++; in il4965_irq_tasklet()
4413 il->isr_stats.alive++; in il4965_irq_tasklet()
4424 if (!(_il_rd(il, CSR_GP_CNTRL) & CSR_GP_CNTRL_REG_FLAG_HW_RF_KILL_SW)) in il4965_irq_tasklet()
4430 il->isr_stats.rfkill++; in il4965_irq_tasklet()
4438 set_bit(S_RFKILL, &il->status); in il4965_irq_tasklet()
4440 clear_bit(S_RFKILL, &il->status); in il4965_irq_tasklet()
4441 il_force_reset(il, true); in il4965_irq_tasklet()
4443 wiphy_rfkill_set_hw_state(il->hw->wiphy, hw_rf_kill); in il4965_irq_tasklet()
4451 il->isr_stats.ctkill++; in il4965_irq_tasklet()
4459 il->isr_stats.sw++; in il4965_irq_tasklet()
4460 il_irq_handle_error(il); in il4965_irq_tasklet()
4471 il_rx_queue_update_write_ptr(il, &il->rxq); in il4965_irq_tasklet()
4472 for (i = 0; i < il->hw_params.max_txq_num; i++) in il4965_irq_tasklet()
4473 il_txq_update_write_ptr(il, &il->txq[i]); in il4965_irq_tasklet()
4474 il->isr_stats.wakeup++; in il4965_irq_tasklet()
4482 il4965_rx_handle(il); in il4965_irq_tasklet()
4483 il->isr_stats.rx++; in il4965_irq_tasklet()
4490 il->isr_stats.tx++; in il4965_irq_tasklet()
4493 il->ucode_write_complete = 1; in il4965_irq_tasklet()
4494 wake_up(&il->wait_command_queue); in il4965_irq_tasklet()
4499 il->isr_stats.unhandled++; in il4965_irq_tasklet()
4502 if (inta & ~(il->inta_mask)) { in il4965_irq_tasklet()
4504 inta & ~il->inta_mask); in il4965_irq_tasklet()
4510 if (test_bit(S_INT_ENABLED, &il->status)) in il4965_irq_tasklet()
4511 il_enable_interrupts(il); in il4965_irq_tasklet()
4514 il_enable_rfkill_int(il); in il4965_irq_tasklet()
4517 if (il_get_debug_level(il) & (IL_DL_ISR)) { in il4965_irq_tasklet()
4518 inta = _il_rd(il, CSR_INT); in il4965_irq_tasklet()
4519 inta_mask = _il_rd(il, CSR_INT_MASK); in il4965_irq_tasklet()
4520 inta_fh = _il_rd(il, CSR_FH_INT_STATUS); in il4965_irq_tasklet()
4550 struct il_priv *il = dev_get_drvdata(d); in il4965_show_debug_level() local
4551 return sprintf(buf, "0x%08X\n", il_get_debug_level(il)); in il4965_show_debug_level()
4558 struct il_priv *il = dev_get_drvdata(d); in il4965_store_debug_level() local
4566 il->debug_level = val; in il4965_store_debug_level()
4580 struct il_priv *il = dev_get_drvdata(d); in il4965_show_temperature() local
4582 if (!il_is_alive(il)) in il4965_show_temperature()
4585 return sprintf(buf, "%d\n", il->temperature); in il4965_show_temperature()
4593 struct il_priv *il = dev_get_drvdata(d); in il4965_show_tx_power() local
4595 if (!il_is_ready_rf(il)) in il4965_show_tx_power()
4598 return sprintf(buf, "%d\n", il->tx_power_user_lmt); in il4965_show_tx_power()
4605 struct il_priv *il = dev_get_drvdata(d); in il4965_store_tx_power() local
4613 ret = il_set_tx_power(il, val, false); in il4965_store_tx_power()
4646 il4965_dealloc_ucode_pci(struct il_priv *il) in il4965_dealloc_ucode_pci() argument
4648 il_free_fw_desc(il->pci_dev, &il->ucode_code); in il4965_dealloc_ucode_pci()
4649 il_free_fw_desc(il->pci_dev, &il->ucode_data); in il4965_dealloc_ucode_pci()
4650 il_free_fw_desc(il->pci_dev, &il->ucode_data_backup); in il4965_dealloc_ucode_pci()
4651 il_free_fw_desc(il->pci_dev, &il->ucode_init); in il4965_dealloc_ucode_pci()
4652 il_free_fw_desc(il->pci_dev, &il->ucode_init_data); in il4965_dealloc_ucode_pci()
4653 il_free_fw_desc(il->pci_dev, &il->ucode_boot); in il4965_dealloc_ucode_pci()
4657 il4965_nic_start(struct il_priv *il) in il4965_nic_start() argument
4660 _il_wr(il, CSR_RESET, 0); in il4965_nic_start()
4665 static int il4965_mac_setup_register(struct il_priv *il, u32 max_probe_length);
4668 il4965_request_firmware(struct il_priv *il, bool first) in il4965_request_firmware() argument
4670 const char *name_pre = il->cfg->fw_name_pre; in il4965_request_firmware()
4674 il->fw_idx = il->cfg->ucode_api_max; in il4965_request_firmware()
4675 sprintf(tag, "%d", il->fw_idx); in il4965_request_firmware()
4677 il->fw_idx--; in il4965_request_firmware()
4678 sprintf(tag, "%d", il->fw_idx); in il4965_request_firmware()
4681 if (il->fw_idx < il->cfg->ucode_api_min) { in il4965_request_firmware()
4686 sprintf(il->firmware_name, "%s%s%s", name_pre, tag, ".ucode"); in il4965_request_firmware()
4688 D_INFO("attempting to load firmware '%s'\n", il->firmware_name); in il4965_request_firmware()
4690 return request_firmware_nowait(THIS_MODULE, 1, il->firmware_name, in il4965_request_firmware()
4691 &il->pci_dev->dev, GFP_KERNEL, il, in il4965_request_firmware()
4701 il4965_load_firmware(struct il_priv *il, const struct firmware *ucode_raw, in il4965_load_firmware() argument
4708 il->ucode_ver = le32_to_cpu(ucode->ver); in il4965_load_firmware()
4709 api_ver = IL_UCODE_API(il->ucode_ver); in il4965_load_firmware()
4763 struct il_priv *il = context; in il4965_ucode_callback() local
4766 const unsigned int api_max = il->cfg->ucode_api_max; in il4965_ucode_callback()
4767 const unsigned int api_min = il->cfg->ucode_api_min; in il4965_ucode_callback()
4777 if (il->fw_idx <= il->cfg->ucode_api_max) in il4965_ucode_callback()
4779 il->firmware_name); in il4965_ucode_callback()
4783 D_INFO("Loaded firmware file '%s' (%zd bytes).\n", il->firmware_name, in il4965_ucode_callback()
4793 err = il4965_load_firmware(il, ucode_raw, &pieces); in il4965_ucode_callback()
4798 api_ver = IL_UCODE_API(il->ucode_ver); in il4965_ucode_callback()
4819 IL_UCODE_MAJOR(il->ucode_ver), IL_UCODE_MINOR(il->ucode_ver), in il4965_ucode_callback()
4820 IL_UCODE_API(il->ucode_ver), IL_UCODE_SERIAL(il->ucode_ver)); in il4965_ucode_callback()
4822 snprintf(il->hw->wiphy->fw_version, sizeof(il->hw->wiphy->fw_version), in il4965_ucode_callback()
4823 "%u.%u.%u.%u", IL_UCODE_MAJOR(il->ucode_ver), in il4965_ucode_callback()
4824 IL_UCODE_MINOR(il->ucode_ver), IL_UCODE_API(il->ucode_ver), in il4965_ucode_callback()
4825 IL_UCODE_SERIAL(il->ucode_ver)); in il4965_ucode_callback()
4833 D_INFO("f/w package hdr ucode version raw = 0x%x\n", il->ucode_ver); in il4965_ucode_callback()
4841 if (pieces.inst_size > il->hw_params.max_inst_size) { in il4965_ucode_callback()
4847 if (pieces.data_size > il->hw_params.max_data_size) { in il4965_ucode_callback()
4853 if (pieces.init_size > il->hw_params.max_inst_size) { in il4965_ucode_callback()
4859 if (pieces.init_data_size > il->hw_params.max_data_size) { in il4965_ucode_callback()
4865 if (pieces.boot_size > il->hw_params.max_bsm_size) { in il4965_ucode_callback()
4876 il->ucode_code.len = pieces.inst_size; in il4965_ucode_callback()
4877 il_alloc_fw_desc(il->pci_dev, &il->ucode_code); in il4965_ucode_callback()
4879 il->ucode_data.len = pieces.data_size; in il4965_ucode_callback()
4880 il_alloc_fw_desc(il->pci_dev, &il->ucode_data); in il4965_ucode_callback()
4882 il->ucode_data_backup.len = pieces.data_size; in il4965_ucode_callback()
4883 il_alloc_fw_desc(il->pci_dev, &il->ucode_data_backup); in il4965_ucode_callback()
4885 if (!il->ucode_code.v_addr || !il->ucode_data.v_addr || in il4965_ucode_callback()
4886 !il->ucode_data_backup.v_addr) in il4965_ucode_callback()
4891 il->ucode_init.len = pieces.init_size; in il4965_ucode_callback()
4892 il_alloc_fw_desc(il->pci_dev, &il->ucode_init); in il4965_ucode_callback()
4894 il->ucode_init_data.len = pieces.init_data_size; in il4965_ucode_callback()
4895 il_alloc_fw_desc(il->pci_dev, &il->ucode_init_data); in il4965_ucode_callback()
4897 if (!il->ucode_init.v_addr || !il->ucode_init_data.v_addr) in il4965_ucode_callback()
4903 il->ucode_boot.len = pieces.boot_size; in il4965_ucode_callback()
4904 il_alloc_fw_desc(il->pci_dev, &il->ucode_boot); in il4965_ucode_callback()
4906 if (!il->ucode_boot.v_addr) in il4965_ucode_callback()
4912 il->sta_key_max_num = STA_KEY_MAX_NUM; in il4965_ucode_callback()
4919 memcpy(il->ucode_code.v_addr, pieces.inst, pieces.inst_size); in il4965_ucode_callback()
4922 il->ucode_code.v_addr, (u32) il->ucode_code.p_addr); in il4965_ucode_callback()
4930 memcpy(il->ucode_data.v_addr, pieces.data, pieces.data_size); in il4965_ucode_callback()
4931 memcpy(il->ucode_data_backup.v_addr, pieces.data, pieces.data_size); in il4965_ucode_callback()
4937 memcpy(il->ucode_init.v_addr, pieces.init, pieces.init_size); in il4965_ucode_callback()
4944 memcpy(il->ucode_init_data.v_addr, pieces.init_data, in il4965_ucode_callback()
4951 memcpy(il->ucode_boot.v_addr, pieces.boot, pieces.boot_size); in il4965_ucode_callback()
4957 il->_4965.phy_calib_chain_noise_reset_cmd = in il4965_ucode_callback()
4959 il->_4965.phy_calib_chain_noise_gain_cmd = in il4965_ucode_callback()
4967 err = il4965_mac_setup_register(il, max_probe_length); in il4965_ucode_callback()
4971 il_dbgfs_register(il, DRV_NAME); in il4965_ucode_callback()
4973 err = sysfs_create_group(&il->pci_dev->dev.kobj, &il_attribute_group); in il4965_ucode_callback()
4981 complete(&il->_4965.firmware_loading_complete); in il4965_ucode_callback()
4986 if (il4965_request_firmware(il, false)) in il4965_ucode_callback()
4993 il4965_dealloc_ucode_pci(il); in il4965_ucode_callback()
4995 complete(&il->_4965.firmware_loading_complete); in il4965_ucode_callback()
4996 device_release_driver(&il->pci_dev->dev); in il4965_ucode_callback()
5074 il4965_dump_nic_error_log(struct il_priv *il) in il4965_dump_nic_error_log() argument
5081 if (il->ucode_type == UCODE_INIT) in il4965_dump_nic_error_log()
5082 base = le32_to_cpu(il->card_alive_init.error_event_table_ptr); in il4965_dump_nic_error_log()
5084 base = le32_to_cpu(il->card_alive.error_event_table_ptr); in il4965_dump_nic_error_log()
5086 if (!il->ops->is_valid_rtc_data_addr(base)) { in il4965_dump_nic_error_log()
5088 base, (il->ucode_type == UCODE_INIT) ? "Init" : "RT"); in il4965_dump_nic_error_log()
5092 count = il_read_targ_mem(il, base); in il4965_dump_nic_error_log()
5096 IL_ERR("Status: 0x%08lX, count: %d\n", il->status, count); in il4965_dump_nic_error_log()
5099 desc = il_read_targ_mem(il, base + 1 * sizeof(u32)); in il4965_dump_nic_error_log()
5100 il->isr_stats.err_code = desc; in il4965_dump_nic_error_log()
5101 pc = il_read_targ_mem(il, base + 2 * sizeof(u32)); in il4965_dump_nic_error_log()
5102 blink1 = il_read_targ_mem(il, base + 3 * sizeof(u32)); in il4965_dump_nic_error_log()
5103 blink2 = il_read_targ_mem(il, base + 4 * sizeof(u32)); in il4965_dump_nic_error_log()
5104 ilink1 = il_read_targ_mem(il, base + 5 * sizeof(u32)); in il4965_dump_nic_error_log()
5105 ilink2 = il_read_targ_mem(il, base + 6 * sizeof(u32)); in il4965_dump_nic_error_log()
5106 data1 = il_read_targ_mem(il, base + 7 * sizeof(u32)); in il4965_dump_nic_error_log()
5107 data2 = il_read_targ_mem(il, base + 8 * sizeof(u32)); in il4965_dump_nic_error_log()
5108 line = il_read_targ_mem(il, base + 9 * sizeof(u32)); in il4965_dump_nic_error_log()
5109 time = il_read_targ_mem(il, base + 11 * sizeof(u32)); in il4965_dump_nic_error_log()
5110 hcmd = il_read_targ_mem(il, base + 22 * sizeof(u32)); in il4965_dump_nic_error_log()
5122 il4965_rf_kill_ct_config(struct il_priv *il) in il4965_rf_kill_ct_config() argument
5128 spin_lock_irqsave(&il->lock, flags); in il4965_rf_kill_ct_config()
5129 _il_wr(il, CSR_UCODE_DRV_GP1_CLR, in il4965_rf_kill_ct_config()
5131 spin_unlock_irqrestore(&il->lock, flags); in il4965_rf_kill_ct_config()
5134 cpu_to_le32(il->hw_params.ct_kill_threshold); in il4965_rf_kill_ct_config()
5136 ret = il_send_cmd_pdu(il, C_CT_KILL_CONFIG, sizeof(cmd), &cmd); in il4965_rf_kill_ct_config()
5142 il->hw_params.ct_kill_threshold); in il4965_rf_kill_ct_config()
5158 il4965_alive_notify(struct il_priv *il) in il4965_alive_notify() argument
5165 spin_lock_irqsave(&il->lock, flags); in il4965_alive_notify()
5168 il->scd_base_addr = il_rd_prph(il, IL49_SCD_SRAM_BASE_ADDR); in il4965_alive_notify()
5169 a = il->scd_base_addr + IL49_SCD_CONTEXT_DATA_OFFSET; in il4965_alive_notify()
5170 for (; a < il->scd_base_addr + IL49_SCD_TX_STTS_BITMAP_OFFSET; a += 4) in il4965_alive_notify()
5171 il_write_targ_mem(il, a, 0); in il4965_alive_notify()
5172 for (; a < il->scd_base_addr + IL49_SCD_TRANSLATE_TBL_OFFSET; a += 4) in il4965_alive_notify()
5173 il_write_targ_mem(il, a, 0); in il4965_alive_notify()
5176 il->scd_base_addr + in il4965_alive_notify()
5177 IL49_SCD_TRANSLATE_TBL_OFFSET_QUEUE(il->hw_params.max_txq_num); in il4965_alive_notify()
5179 il_write_targ_mem(il, a, 0); in il4965_alive_notify()
5182 il_wr_prph(il, IL49_SCD_DRAM_BASE_ADDR, il->scd_bc_tbls.dma >> 10); in il4965_alive_notify()
5186 il_wr(il, FH49_TCSR_CHNL_TX_CONFIG_REG(chan), in il4965_alive_notify()
5191 reg_val = il_rd(il, FH49_TX_CHICKEN_BITS_REG); in il4965_alive_notify()
5192 il_wr(il, FH49_TX_CHICKEN_BITS_REG, in il4965_alive_notify()
5196 il_wr_prph(il, IL49_SCD_QUEUECHAIN_SEL, 0); in il4965_alive_notify()
5199 for (i = 0; i < il->hw_params.max_txq_num; i++) { in il4965_alive_notify()
5202 il_wr_prph(il, IL49_SCD_QUEUE_RDPTR(i), 0); in il4965_alive_notify()
5203 il_wr(il, HBUS_TARG_WRPTR, 0 | (i << 8)); in il4965_alive_notify()
5206 il_write_targ_mem(il, in il4965_alive_notify()
5207 il->scd_base_addr + in il4965_alive_notify()
5214 il_write_targ_mem(il, in il4965_alive_notify()
5215 il->scd_base_addr + in il4965_alive_notify()
5223 il_wr_prph(il, IL49_SCD_INTERRUPT_MASK, in il4965_alive_notify()
5224 (1 << il->hw_params.max_txq_num) - 1); in il4965_alive_notify()
5227 il4965_txq_set_sched(il, IL_MASK(0, 6)); in il4965_alive_notify()
5229 il4965_set_wr_ptrs(il, IL_DEFAULT_CMD_QUEUE_NUM, 0); in il4965_alive_notify()
5232 memset(&il->queue_stopped[0], 0, sizeof(il->queue_stopped)); in il4965_alive_notify()
5234 atomic_set(&il->queue_stop_count[i], 0); in il4965_alive_notify()
5237 il->txq_ctx_active_msk = 0; in il4965_alive_notify()
5244 il_txq_ctx_activate(il, i); in il4965_alive_notify()
5249 il4965_tx_queue_set_status(il, &il->txq[i], ac, 0); in il4965_alive_notify()
5252 spin_unlock_irqrestore(&il->lock, flags); in il4965_alive_notify()
5263 il4965_alive_start(struct il_priv *il) in il4965_alive_start() argument
5269 if (il->card_alive.is_valid != UCODE_VALID_OK) { in il4965_alive_start()
5279 if (il4965_verify_ucode(il)) { in il4965_alive_start()
5286 ret = il4965_alive_notify(il); in il4965_alive_start()
5293 set_bit(S_ALIVE, &il->status); in il4965_alive_start()
5296 il_setup_watchdog(il); in il4965_alive_start()
5298 if (il_is_rfkill(il)) in il4965_alive_start()
5301 ieee80211_wake_queues(il->hw); in il4965_alive_start()
5303 il->active_rate = RATES_MASK; in il4965_alive_start()
5305 il_power_update_mode(il, true); in il4965_alive_start()
5308 if (il_is_associated(il)) { in il4965_alive_start()
5310 (struct il_rxon_cmd *)&il->active; in il4965_alive_start()
5312 il->staging.filter_flags |= RXON_FILTER_ASSOC_MSK; in il4965_alive_start()
5316 il_connection_init_rx_config(il); in il4965_alive_start()
5318 if (il->ops->set_rxon_chain) in il4965_alive_start()
5319 il->ops->set_rxon_chain(il); in il4965_alive_start()
5323 il_send_bt_config(il); in il4965_alive_start()
5325 il4965_reset_run_time_calib(il); in il4965_alive_start()
5327 set_bit(S_READY, &il->status); in il4965_alive_start()
5330 il_commit_rxon(il); in il4965_alive_start()
5333 il4965_rf_kill_ct_config(il); in il4965_alive_start()
5336 wake_up(&il->wait_command_queue); in il4965_alive_start()
5341 queue_work(il->workqueue, &il->restart); in il4965_alive_start()
5344 static void il4965_cancel_deferred_work(struct il_priv *il);
5347 __il4965_down(struct il_priv *il) in __il4965_down() argument
5354 il_scan_cancel_timeout(il, 200); in __il4965_down()
5356 exit_pending = test_and_set_bit(S_EXIT_PENDING, &il->status); in __il4965_down()
5360 del_timer_sync(&il->watchdog); in __il4965_down()
5362 il_clear_ucode_stations(il); in __il4965_down()
5365 spin_lock_irq(&il->sta_lock); in __il4965_down()
5373 memset(il->_4965.wep_keys, 0, sizeof(il->_4965.wep_keys)); in __il4965_down()
5374 il->_4965.key_mapping_keys = 0; in __il4965_down()
5375 spin_unlock_irq(&il->sta_lock); in __il4965_down()
5377 il_dealloc_bcast_stations(il); in __il4965_down()
5378 il_clear_driver_stations(il); in __il4965_down()
5381 wake_up_all(&il->wait_command_queue); in __il4965_down()
5386 clear_bit(S_EXIT_PENDING, &il->status); in __il4965_down()
5389 _il_wr(il, CSR_RESET, CSR_RESET_REG_FLAG_NEVO_RESET); in __il4965_down()
5392 spin_lock_irqsave(&il->lock, flags); in __il4965_down()
5393 il_disable_interrupts(il); in __il4965_down()
5394 spin_unlock_irqrestore(&il->lock, flags); in __il4965_down()
5395 il4965_synchronize_irq(il); in __il4965_down()
5397 if (il->mac80211_registered) in __il4965_down()
5398 ieee80211_stop_queues(il->hw); in __il4965_down()
5402 if (!il_is_init(il)) { in __il4965_down()
5403 il->status = in __il4965_down()
5404 test_bit(S_RFKILL, &il->status) << S_RFKILL | in __il4965_down()
5405 test_bit(S_GEO_CONFIGURED, &il->status) << S_GEO_CONFIGURED | in __il4965_down()
5406 test_bit(S_EXIT_PENDING, &il->status) << S_EXIT_PENDING; in __il4965_down()
5412 il->status &= in __il4965_down()
5413 test_bit(S_RFKILL, &il->status) << S_RFKILL | in __il4965_down()
5414 test_bit(S_GEO_CONFIGURED, &il->status) << S_GEO_CONFIGURED | in __il4965_down()
5415 test_bit(S_FW_ERROR, &il->status) << S_FW_ERROR | in __il4965_down()
5416 test_bit(S_EXIT_PENDING, &il->status) << S_EXIT_PENDING; in __il4965_down()
5423 spin_lock_irq(&il->reg_lock); in __il4965_down()
5426 il4965_txq_ctx_stop(il); in __il4965_down()
5427 il4965_rxq_stop(il); in __il4965_down()
5429 _il_wr_prph(il, APMG_CLK_DIS_REG, APMG_CLK_VAL_DMA_CLK_RQT); in __il4965_down()
5432 _il_clear_bit(il, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ); in __il4965_down()
5434 _il_apm_stop(il); in __il4965_down()
5436 spin_unlock_irq(&il->reg_lock); in __il4965_down()
5438 il4965_txq_ctx_unmap(il); in __il4965_down()
5440 memset(&il->card_alive, 0, sizeof(struct il_alive_resp)); in __il4965_down()
5442 dev_kfree_skb(il->beacon_skb); in __il4965_down()
5443 il->beacon_skb = NULL; in __il4965_down()
5446 il4965_clear_free_frames(il); in __il4965_down()
5450 il4965_down(struct il_priv *il) in il4965_down() argument
5452 mutex_lock(&il->mutex); in il4965_down()
5453 __il4965_down(il); in il4965_down()
5454 mutex_unlock(&il->mutex); in il4965_down()
5456 il4965_cancel_deferred_work(il); in il4965_down()
5461 il4965_set_hw_ready(struct il_priv *il) in il4965_set_hw_ready() argument
5465 il_set_bit(il, CSR_HW_IF_CONFIG_REG, in il4965_set_hw_ready()
5469 ret = _il_poll_bit(il, CSR_HW_IF_CONFIG_REG, in il4965_set_hw_ready()
5474 il->hw_ready = true; in il4965_set_hw_ready()
5476 D_INFO("hardware %s ready\n", (il->hw_ready) ? "" : "not"); in il4965_set_hw_ready()
5480 il4965_prepare_card_hw(struct il_priv *il) in il4965_prepare_card_hw() argument
5484 il->hw_ready = false; in il4965_prepare_card_hw()
5486 il4965_set_hw_ready(il); in il4965_prepare_card_hw()
5487 if (il->hw_ready) in il4965_prepare_card_hw()
5491 il_set_bit(il, CSR_HW_IF_CONFIG_REG, CSR_HW_IF_CONFIG_REG_PREPARE); in il4965_prepare_card_hw()
5494 _il_poll_bit(il, CSR_HW_IF_CONFIG_REG, in il4965_prepare_card_hw()
5500 il4965_set_hw_ready(il); in il4965_prepare_card_hw()
5506 __il4965_up(struct il_priv *il) in __il4965_up() argument
5511 if (test_bit(S_EXIT_PENDING, &il->status)) { in __il4965_up()
5516 if (!il->ucode_data_backup.v_addr || !il->ucode_data.v_addr) { in __il4965_up()
5521 ret = il4965_alloc_bcast_station(il); in __il4965_up()
5523 il_dealloc_bcast_stations(il); in __il4965_up()
5527 il4965_prepare_card_hw(il); in __il4965_up()
5528 if (!il->hw_ready) { in __il4965_up()
5529 il_dealloc_bcast_stations(il); in __il4965_up()
5535 if (_il_rd(il, CSR_GP_CNTRL) & CSR_GP_CNTRL_REG_FLAG_HW_RF_KILL_SW) in __il4965_up()
5536 clear_bit(S_RFKILL, &il->status); in __il4965_up()
5538 set_bit(S_RFKILL, &il->status); in __il4965_up()
5539 wiphy_rfkill_set_hw_state(il->hw->wiphy, true); in __il4965_up()
5541 il_dealloc_bcast_stations(il); in __il4965_up()
5542 il_enable_rfkill_int(il); in __il4965_up()
5547 _il_wr(il, CSR_INT, 0xFFFFFFFF); in __il4965_up()
5550 il->cmd_queue = IL_DEFAULT_CMD_QUEUE_NUM; in __il4965_up()
5552 ret = il4965_hw_nic_init(il); in __il4965_up()
5555 il_dealloc_bcast_stations(il); in __il4965_up()
5560 _il_wr(il, CSR_UCODE_DRV_GP1_CLR, CSR_UCODE_SW_BIT_RFKILL); in __il4965_up()
5561 _il_wr(il, CSR_UCODE_DRV_GP1_CLR, CSR_UCODE_DRV_GP1_BIT_CMD_BLOCKED); in __il4965_up()
5564 _il_wr(il, CSR_INT, 0xFFFFFFFF); in __il4965_up()
5565 il_enable_interrupts(il); in __il4965_up()
5568 _il_wr(il, CSR_UCODE_DRV_GP1_CLR, CSR_UCODE_SW_BIT_RFKILL); in __il4965_up()
5569 _il_wr(il, CSR_UCODE_DRV_GP1_CLR, CSR_UCODE_SW_BIT_RFKILL); in __il4965_up()
5574 memcpy(il->ucode_data_backup.v_addr, il->ucode_data.v_addr, in __il4965_up()
5575 il->ucode_data.len); in __il4965_up()
5582 ret = il->ops->load_ucode(il); in __il4965_up()
5590 il4965_nic_start(il); in __il4965_up()
5597 set_bit(S_EXIT_PENDING, &il->status); in __il4965_up()
5598 __il4965_down(il); in __il4965_up()
5599 clear_bit(S_EXIT_PENDING, &il->status); in __il4965_up()
5616 struct il_priv *il = in il4965_bg_init_alive_start() local
5619 mutex_lock(&il->mutex); in il4965_bg_init_alive_start()
5620 if (test_bit(S_EXIT_PENDING, &il->status)) in il4965_bg_init_alive_start()
5623 il->ops->init_alive_start(il); in il4965_bg_init_alive_start()
5625 mutex_unlock(&il->mutex); in il4965_bg_init_alive_start()
5631 struct il_priv *il = in il4965_bg_alive_start() local
5634 mutex_lock(&il->mutex); in il4965_bg_alive_start()
5635 if (test_bit(S_EXIT_PENDING, &il->status)) in il4965_bg_alive_start()
5638 il4965_alive_start(il); in il4965_bg_alive_start()
5640 mutex_unlock(&il->mutex); in il4965_bg_alive_start()
5646 struct il_priv *il = container_of(work, struct il_priv, in il4965_bg_run_time_calib_work() local
5649 mutex_lock(&il->mutex); in il4965_bg_run_time_calib_work()
5651 if (test_bit(S_EXIT_PENDING, &il->status) || in il4965_bg_run_time_calib_work()
5652 test_bit(S_SCANNING, &il->status)) { in il4965_bg_run_time_calib_work()
5653 mutex_unlock(&il->mutex); in il4965_bg_run_time_calib_work()
5657 if (il->start_calib) { in il4965_bg_run_time_calib_work()
5658 il4965_chain_noise_calibration(il, (void *)&il->_4965.stats); in il4965_bg_run_time_calib_work()
5659 il4965_sensitivity_calibration(il, (void *)&il->_4965.stats); in il4965_bg_run_time_calib_work()
5662 mutex_unlock(&il->mutex); in il4965_bg_run_time_calib_work()
5668 struct il_priv *il = container_of(data, struct il_priv, restart); in il4965_bg_restart() local
5670 if (test_bit(S_EXIT_PENDING, &il->status)) in il4965_bg_restart()
5673 if (test_and_clear_bit(S_FW_ERROR, &il->status)) { in il4965_bg_restart()
5674 mutex_lock(&il->mutex); in il4965_bg_restart()
5675 il->is_open = 0; in il4965_bg_restart()
5677 __il4965_down(il); in il4965_bg_restart()
5679 mutex_unlock(&il->mutex); in il4965_bg_restart()
5680 il4965_cancel_deferred_work(il); in il4965_bg_restart()
5681 ieee80211_restart_hw(il->hw); in il4965_bg_restart()
5683 il4965_down(il); in il4965_bg_restart()
5685 mutex_lock(&il->mutex); in il4965_bg_restart()
5686 if (test_bit(S_EXIT_PENDING, &il->status)) { in il4965_bg_restart()
5687 mutex_unlock(&il->mutex); in il4965_bg_restart()
5691 __il4965_up(il); in il4965_bg_restart()
5692 mutex_unlock(&il->mutex); in il4965_bg_restart()
5699 struct il_priv *il = container_of(data, struct il_priv, rx_replenish); in il4965_bg_rx_replenish() local
5701 if (test_bit(S_EXIT_PENDING, &il->status)) in il4965_bg_rx_replenish()
5704 mutex_lock(&il->mutex); in il4965_bg_rx_replenish()
5705 il4965_rx_replenish(il); in il4965_bg_rx_replenish()
5706 mutex_unlock(&il->mutex); in il4965_bg_rx_replenish()
5722 il4965_mac_setup_register(struct il_priv *il, u32 max_probe_length) in il4965_mac_setup_register() argument
5725 struct ieee80211_hw *hw = il->hw; in il4965_mac_setup_register()
5737 if (il->cfg->sku & IL_SKU_N) in il4965_mac_setup_register()
5766 if (il->bands[NL80211_BAND_2GHZ].n_channels) in il4965_mac_setup_register()
5767 il->hw->wiphy->bands[NL80211_BAND_2GHZ] = in il4965_mac_setup_register()
5768 &il->bands[NL80211_BAND_2GHZ]; in il4965_mac_setup_register()
5769 if (il->bands[NL80211_BAND_5GHZ].n_channels) in il4965_mac_setup_register()
5770 il->hw->wiphy->bands[NL80211_BAND_5GHZ] = in il4965_mac_setup_register()
5771 &il->bands[NL80211_BAND_5GHZ]; in il4965_mac_setup_register()
5773 il_leds_init(il); in il4965_mac_setup_register()
5775 wiphy_ext_feature_set(il->hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST); in il4965_mac_setup_register()
5777 ret = ieee80211_register_hw(il->hw); in il4965_mac_setup_register()
5782 il->mac80211_registered = 1; in il4965_mac_setup_register()
5790 struct il_priv *il = hw->priv; in il4965_mac_start() local
5796 mutex_lock(&il->mutex); in il4965_mac_start()
5797 ret = __il4965_up(il); in il4965_mac_start()
5798 mutex_unlock(&il->mutex); in il4965_mac_start()
5803 if (il_is_rfkill(il)) in il4965_mac_start()
5810 ret = wait_event_timeout(il->wait_command_queue, in il4965_mac_start()
5811 test_bit(S_READY, &il->status), in il4965_mac_start()
5814 if (!test_bit(S_READY, &il->status)) { in il4965_mac_start()
5821 il4965_led_enable(il); in il4965_mac_start()
5824 il->is_open = 1; in il4965_mac_start()
5832 struct il_priv *il = hw->priv; in il4965_mac_stop() local
5836 if (!il->is_open) in il4965_mac_stop()
5839 il->is_open = 0; in il4965_mac_stop()
5841 il4965_down(il); in il4965_mac_stop()
5843 flush_workqueue(il->workqueue); in il4965_mac_stop()
5847 _il_wr(il, CSR_INT, 0xFFFFFFFF); in il4965_mac_stop()
5848 il_enable_rfkill_int(il); in il4965_mac_stop()
5858 struct il_priv *il = hw->priv; in il4965_mac_tx() local
5865 if (il4965_tx_skb(il, control->sta, skb)) in il4965_mac_tx()
5876 struct il_priv *il = hw->priv; in il4965_mac_update_tkip_key() local
5880 il4965_update_tkip_key(il, keyconf, sta, iv32, phase1key); in il4965_mac_update_tkip_key()
5890 struct il_priv *il = hw->priv; in il4965_mac_set_key() local
5897 if (il->cfg->mod_params->sw_crypto) { in il4965_mac_set_key()
5912 sta_id = il_sta_id_or_broadcast(il, sta); in il4965_mac_set_key()
5916 mutex_lock(&il->mutex); in il4965_mac_set_key()
5917 il_scan_cancel_timeout(il, 100); in il4965_mac_set_key()
5928 is_default_wep_key = !il->_4965.key_mapping_keys; in il4965_mac_set_key()
5937 ret = il4965_set_default_wep_key(il, key); in il4965_mac_set_key()
5939 ret = il4965_set_dynamic_key(il, key, sta_id); in il4965_mac_set_key()
5945 ret = il4965_remove_default_wep_key(il, key); in il4965_mac_set_key()
5947 ret = il4965_remove_dynamic_key(il, key, sta_id); in il4965_mac_set_key()
5955 mutex_unlock(&il->mutex); in il4965_mac_set_key()
5965 struct il_priv *il = hw->priv; in il4965_mac_ampdu_action() local
5974 if (!(il->cfg->sku & IL_SKU_N)) in il4965_mac_ampdu_action()
5977 mutex_lock(&il->mutex); in il4965_mac_ampdu_action()
5982 ret = il4965_sta_rx_agg_start(il, sta, tid, *ssn); in il4965_mac_ampdu_action()
5986 ret = il4965_sta_rx_agg_stop(il, sta, tid); in il4965_mac_ampdu_action()
5987 if (test_bit(S_EXIT_PENDING, &il->status)) in il4965_mac_ampdu_action()
5992 ret = il4965_tx_agg_start(il, vif, sta, tid, ssn); in il4965_mac_ampdu_action()
5998 ret = il4965_tx_agg_stop(il, vif, sta, tid); in il4965_mac_ampdu_action()
5999 if (test_bit(S_EXIT_PENDING, &il->status)) in il4965_mac_ampdu_action()
6006 mutex_unlock(&il->mutex); in il4965_mac_ampdu_action()
6015 struct il_priv *il = hw->priv; in il4965_mac_sta_add() local
6022 mutex_lock(&il->mutex); in il4965_mac_sta_add()
6029 il_add_station_common(il, sta->addr, is_ap, sta, &sta_id); in il4965_mac_sta_add()
6033 mutex_unlock(&il->mutex); in il4965_mac_sta_add()
6041 il4965_rs_rate_init(il, sta, sta_id); in il4965_mac_sta_add()
6042 mutex_unlock(&il->mutex); in il4965_mac_sta_add()
6051 struct il_priv *il = hw->priv; in il4965_mac_channel_switch() local
6055 struct il_ht_config *ht_conf = &il->current_ht_config; in il4965_mac_channel_switch()
6060 mutex_lock(&il->mutex); in il4965_mac_channel_switch()
6062 if (il_is_rfkill(il)) in il4965_mac_channel_switch()
6065 if (test_bit(S_EXIT_PENDING, &il->status) || in il4965_mac_channel_switch()
6066 test_bit(S_SCANNING, &il->status) || in il4965_mac_channel_switch()
6067 test_bit(S_CHANNEL_SWITCH_PENDING, &il->status)) in il4965_mac_channel_switch()
6070 if (!il_is_associated(il)) in il4965_mac_channel_switch()
6073 if (!il->ops->set_channel_switch) in il4965_mac_channel_switch()
6077 if (le16_to_cpu(il->active.channel) == ch) in il4965_mac_channel_switch()
6080 ch_info = il_get_channel_info(il, channel->band, ch); in il4965_mac_channel_switch()
6086 spin_lock_irq(&il->lock); in il4965_mac_channel_switch()
6088 il->current_ht_config.smps = conf->smps_mode; in il4965_mac_channel_switch()
6094 il->ht.is_40mhz = false; in il4965_mac_channel_switch()
6095 il->ht.extension_chan_offset = IEEE80211_HT_PARAM_CHA_SEC_NONE; in il4965_mac_channel_switch()
6098 il->ht.extension_chan_offset = IEEE80211_HT_PARAM_CHA_SEC_BELOW; in il4965_mac_channel_switch()
6099 il->ht.is_40mhz = true; in il4965_mac_channel_switch()
6102 il->ht.extension_chan_offset = IEEE80211_HT_PARAM_CHA_SEC_ABOVE; in il4965_mac_channel_switch()
6103 il->ht.is_40mhz = true; in il4965_mac_channel_switch()
6107 if ((le16_to_cpu(il->staging.channel) != ch)) in il4965_mac_channel_switch()
6108 il->staging.flags = 0; in il4965_mac_channel_switch()
6110 il_set_rxon_channel(il, channel); in il4965_mac_channel_switch()
6111 il_set_rxon_ht(il, ht_conf); in il4965_mac_channel_switch()
6112 il_set_flags_for_band(il, channel->band, il->vif); in il4965_mac_channel_switch()
6114 spin_unlock_irq(&il->lock); in il4965_mac_channel_switch()
6116 il_set_rate(il); in il4965_mac_channel_switch()
6121 set_bit(S_CHANNEL_SWITCH_PENDING, &il->status); in il4965_mac_channel_switch()
6122 il->switch_channel = cpu_to_le16(ch); in il4965_mac_channel_switch()
6123 if (il->ops->set_channel_switch(il, ch_switch)) { in il4965_mac_channel_switch()
6124 clear_bit(S_CHANNEL_SWITCH_PENDING, &il->status); in il4965_mac_channel_switch()
6125 il->switch_channel = 0; in il4965_mac_channel_switch()
6126 ieee80211_chswitch_done(il->vif, false); in il4965_mac_channel_switch()
6130 mutex_unlock(&il->mutex); in il4965_mac_channel_switch()
6138 struct il_priv *il = hw->priv; in il4965_configure_filter() local
6158 mutex_lock(&il->mutex); in il4965_configure_filter()
6160 il->staging.filter_flags &= ~filter_nand; in il4965_configure_filter()
6161 il->staging.filter_flags |= filter_or; in il4965_configure_filter()
6168 mutex_unlock(&il->mutex); in il4965_configure_filter()
6190 struct il_priv *il = container_of(work, struct il_priv, in il4965_bg_txpower_work() local
6193 mutex_lock(&il->mutex); in il4965_bg_txpower_work()
6199 if (test_bit(S_EXIT_PENDING, &il->status) || in il4965_bg_txpower_work()
6200 test_bit(S_SCANNING, &il->status)) in il4965_bg_txpower_work()
6206 il->ops->send_tx_power(il); in il4965_bg_txpower_work()
6210 il->last_temperature = il->temperature; in il4965_bg_txpower_work()
6212 mutex_unlock(&il->mutex); in il4965_bg_txpower_work()
6216 il4965_setup_deferred_work(struct il_priv *il) in il4965_setup_deferred_work() argument
6218 il->workqueue = create_singlethread_workqueue(DRV_NAME); in il4965_setup_deferred_work()
6220 init_waitqueue_head(&il->wait_command_queue); in il4965_setup_deferred_work()
6222 INIT_WORK(&il->restart, il4965_bg_restart); in il4965_setup_deferred_work()
6223 INIT_WORK(&il->rx_replenish, il4965_bg_rx_replenish); in il4965_setup_deferred_work()
6224 INIT_WORK(&il->run_time_calib_work, il4965_bg_run_time_calib_work); in il4965_setup_deferred_work()
6225 INIT_DELAYED_WORK(&il->init_alive_start, il4965_bg_init_alive_start); in il4965_setup_deferred_work()
6226 INIT_DELAYED_WORK(&il->alive_start, il4965_bg_alive_start); in il4965_setup_deferred_work()
6228 il_setup_scan_deferred_work(il); in il4965_setup_deferred_work()
6230 INIT_WORK(&il->txpower_work, il4965_bg_txpower_work); in il4965_setup_deferred_work()
6232 timer_setup(&il->stats_periodic, il4965_bg_stats_periodic, 0); in il4965_setup_deferred_work()
6234 timer_setup(&il->watchdog, il_bg_watchdog, 0); in il4965_setup_deferred_work()
6236 tasklet_setup(&il->irq_tasklet, il4965_irq_tasklet); in il4965_setup_deferred_work()
6240 il4965_cancel_deferred_work(struct il_priv *il) in il4965_cancel_deferred_work() argument
6242 cancel_work_sync(&il->txpower_work); in il4965_cancel_deferred_work()
6243 cancel_delayed_work_sync(&il->init_alive_start); in il4965_cancel_deferred_work()
6244 cancel_delayed_work(&il->alive_start); in il4965_cancel_deferred_work()
6245 cancel_work_sync(&il->run_time_calib_work); in il4965_cancel_deferred_work()
6247 il_cancel_scan_deferred_work(il); in il4965_cancel_deferred_work()
6249 del_timer_sync(&il->stats_periodic); in il4965_cancel_deferred_work()
6253 il4965_init_hw_rates(struct il_priv *il, struct ieee80211_rate *rates) in il4965_init_hw_rates() argument
6277 il4965_set_wr_ptrs(struct il_priv *il, int txq_id, u32 idx) in il4965_set_wr_ptrs() argument
6279 il_wr(il, HBUS_TARG_WRPTR, (idx & 0xff) | (txq_id << 8)); in il4965_set_wr_ptrs()
6280 il_wr_prph(il, IL49_SCD_QUEUE_RDPTR(txq_id), idx); in il4965_set_wr_ptrs()
6284 il4965_tx_queue_set_status(struct il_priv *il, struct il_tx_queue *txq, in il4965_tx_queue_set_status() argument
6290 int active = test_bit(txq_id, &il->txq_ctx_active_msk) ? 1 : 0; in il4965_tx_queue_set_status()
6293 il_wr_prph(il, IL49_SCD_QUEUE_STATUS_BITS(txq_id), in il4965_tx_queue_set_status()
6330 il4965_init_drv(struct il_priv *il) in il4965_init_drv() argument
6334 spin_lock_init(&il->sta_lock); in il4965_init_drv()
6335 spin_lock_init(&il->hcmd_lock); in il4965_init_drv()
6337 INIT_LIST_HEAD(&il->free_frames); in il4965_init_drv()
6339 mutex_init(&il->mutex); in il4965_init_drv()
6341 il->ieee_channels = NULL; in il4965_init_drv()
6342 il->ieee_rates = NULL; in il4965_init_drv()
6343 il->band = NL80211_BAND_2GHZ; in il4965_init_drv()
6345 il->iw_mode = NL80211_IFTYPE_STATION; in il4965_init_drv()
6346 il->current_ht_config.smps = IEEE80211_SMPS_STATIC; in il4965_init_drv()
6347 il->missed_beacon_threshold = IL_MISSED_BEACON_THRESHOLD_DEF; in il4965_init_drv()
6350 il->force_reset.reset_duration = IL_DELAY_NEXT_FORCE_FW_RELOAD; in il4965_init_drv()
6353 if (il->ops->set_rxon_chain) in il4965_init_drv()
6354 il->ops->set_rxon_chain(il); in il4965_init_drv()
6356 il_init_scan_params(il); in il4965_init_drv()
6358 ret = il_init_channel_map(il); in il4965_init_drv()
6364 ret = il_init_geos(il); in il4965_init_drv()
6369 il4965_init_hw_rates(il, il->ieee_rates); in il4965_init_drv()
6374 il_free_channel_map(il); in il4965_init_drv()
6380 il4965_uninit_drv(struct il_priv *il) in il4965_uninit_drv() argument
6382 il_free_geos(il); in il4965_uninit_drv()
6383 il_free_channel_map(il); in il4965_uninit_drv()
6384 kfree(il->scan_cmd); in il4965_uninit_drv()
6388 il4965_hw_detect(struct il_priv *il) in il4965_hw_detect() argument
6390 il->hw_rev = _il_rd(il, CSR_HW_REV); in il4965_hw_detect()
6391 il->hw_wa_rev = _il_rd(il, CSR_HW_REV_WA_REG); in il4965_hw_detect()
6392 il->rev_id = il->pci_dev->revision; in il4965_hw_detect()
6393 D_INFO("HW Revision ID = 0x%X\n", il->rev_id); in il4965_hw_detect()
6424 il4965_set_hw_params(struct il_priv *il) in il4965_set_hw_params() argument
6426 il->hw_params.bcast_id = IL4965_BROADCAST_ID; in il4965_set_hw_params()
6427 il->hw_params.max_rxq_size = RX_QUEUE_SIZE; in il4965_set_hw_params()
6428 il->hw_params.max_rxq_log = RX_QUEUE_SIZE_LOG; in il4965_set_hw_params()
6429 if (il->cfg->mod_params->amsdu_size_8K) in il4965_set_hw_params()
6430 il->hw_params.rx_page_order = get_order(IL_RX_BUF_SIZE_8K); in il4965_set_hw_params()
6432 il->hw_params.rx_page_order = get_order(IL_RX_BUF_SIZE_4K); in il4965_set_hw_params()
6434 il->hw_params.max_beacon_itrvl = IL_MAX_UCODE_BEACON_INTERVAL; in il4965_set_hw_params()
6436 if (il->cfg->mod_params->disable_11n) in il4965_set_hw_params()
6437 il->cfg->sku &= ~IL_SKU_N; in il4965_set_hw_params()
6439 if (il->cfg->mod_params->num_of_queues >= IL_MIN_NUM_QUEUES && in il4965_set_hw_params()
6440 il->cfg->mod_params->num_of_queues <= IL49_NUM_QUEUES) in il4965_set_hw_params()
6441 il->cfg->num_of_queues = in il4965_set_hw_params()
6442 il->cfg->mod_params->num_of_queues; in il4965_set_hw_params()
6444 il->hw_params.max_txq_num = il->cfg->num_of_queues; in il4965_set_hw_params()
6445 il->hw_params.dma_chnl_num = FH49_TCSR_CHNL_NUM; in il4965_set_hw_params()
6446 il->hw_params.scd_bc_tbls_size = in il4965_set_hw_params()
6447 il->cfg->num_of_queues * in il4965_set_hw_params()
6450 il->hw_params.tfd_size = sizeof(struct il_tfd); in il4965_set_hw_params()
6451 il->hw_params.max_stations = IL4965_STATION_COUNT; in il4965_set_hw_params()
6452 il->hw_params.max_data_size = IL49_RTC_DATA_SIZE; in il4965_set_hw_params()
6453 il->hw_params.max_inst_size = IL49_RTC_INST_SIZE; in il4965_set_hw_params()
6454 il->hw_params.max_bsm_size = BSM_SRAM_SIZE; in il4965_set_hw_params()
6455 il->hw_params.ht40_channel = BIT(NL80211_BAND_5GHZ); in il4965_set_hw_params()
6457 il->hw_params.rx_wrt_ptr_reg = FH49_RSCSR_CHNL0_WPTR; in il4965_set_hw_params()
6459 il->hw_params.tx_chains_num = il4965_num_of_ant(il->cfg->valid_tx_ant); in il4965_set_hw_params()
6460 il->hw_params.rx_chains_num = il4965_num_of_ant(il->cfg->valid_rx_ant); in il4965_set_hw_params()
6461 il->hw_params.valid_tx_ant = il->cfg->valid_tx_ant; in il4965_set_hw_params()
6462 il->hw_params.valid_rx_ant = il->cfg->valid_rx_ant; in il4965_set_hw_params()
6464 il->hw_params.ct_kill_threshold = in il4965_set_hw_params()
6467 il->hw_params.sens = &il4965_sensitivity; in il4965_set_hw_params()
6468 il->hw_params.beacon_time_tsf_bits = IL4965_EXT_BEACON_TIME_POS; in il4965_set_hw_params()
6475 struct il_priv *il; in il4965_pci_probe() local
6490 il = hw->priv; in il4965_pci_probe()
6491 il->hw = hw; in il4965_pci_probe()
6495 il->cfg = cfg; in il4965_pci_probe()
6496 il->ops = &il4965_ops; in il4965_pci_probe()
6498 il->debugfs_ops = &il4965_debugfs_ops; in il4965_pci_probe()
6500 il->pci_dev = pdev; in il4965_pci_probe()
6501 il->inta_mask = CSR_INI_SET_MASK; in il4965_pci_probe()
6536 pci_set_drvdata(pdev, il); in il4965_pci_probe()
6541 il->hw_base = pci_ioremap_bar(pdev, 0); in il4965_pci_probe()
6542 if (!il->hw_base) { in il4965_pci_probe()
6549 D_INFO("pci_resource_base = %p\n", il->hw_base); in il4965_pci_probe()
6554 spin_lock_init(&il->reg_lock); in il4965_pci_probe()
6555 spin_lock_init(&il->lock); in il4965_pci_probe()
6562 _il_wr(il, CSR_RESET, CSR_RESET_REG_FLAG_NEVO_RESET); in il4965_pci_probe()
6564 il4965_hw_detect(il); in il4965_pci_probe()
6565 IL_INFO("Detected %s, REV=0x%X\n", il->cfg->name, il->hw_rev); in il4965_pci_probe()
6571 il4965_prepare_card_hw(il); in il4965_pci_probe()
6572 if (!il->hw_ready) { in il4965_pci_probe()
6582 err = il_eeprom_init(il); in il4965_pci_probe()
6587 err = il4965_eeprom_check_version(il); in il4965_pci_probe()
6592 il4965_eeprom_get_mac(il, il->addresses[0].addr); in il4965_pci_probe()
6593 D_INFO("MAC address: %pM\n", il->addresses[0].addr); in il4965_pci_probe()
6594 il->hw->wiphy->addresses = il->addresses; in il4965_pci_probe()
6595 il->hw->wiphy->n_addresses = 1; in il4965_pci_probe()
6600 il4965_set_hw_params(il); in il4965_pci_probe()
6606 err = il4965_init_drv(il); in il4965_pci_probe()
6614 spin_lock_irqsave(&il->lock, flags); in il4965_pci_probe()
6615 il_disable_interrupts(il); in il4965_pci_probe()
6616 spin_unlock_irqrestore(&il->lock, flags); in il4965_pci_probe()
6618 pci_enable_msi(il->pci_dev); in il4965_pci_probe()
6620 err = request_irq(il->pci_dev->irq, il_isr, IRQF_SHARED, DRV_NAME, il); in il4965_pci_probe()
6622 IL_ERR("Error allocating IRQ %d\n", il->pci_dev->irq); in il4965_pci_probe()
6626 il4965_setup_deferred_work(il); in il4965_pci_probe()
6627 il4965_setup_handlers(il); in il4965_pci_probe()
6634 pci_read_config_word(il->pci_dev, PCI_COMMAND, &pci_cmd); in il4965_pci_probe()
6637 pci_write_config_word(il->pci_dev, PCI_COMMAND, pci_cmd); in il4965_pci_probe()
6640 il_enable_rfkill_int(il); in il4965_pci_probe()
6643 if (_il_rd(il, CSR_GP_CNTRL) & CSR_GP_CNTRL_REG_FLAG_HW_RF_KILL_SW) in il4965_pci_probe()
6644 clear_bit(S_RFKILL, &il->status); in il4965_pci_probe()
6646 set_bit(S_RFKILL, &il->status); in il4965_pci_probe()
6648 wiphy_rfkill_set_hw_state(il->hw->wiphy, in il4965_pci_probe()
6649 test_bit(S_RFKILL, &il->status)); in il4965_pci_probe()
6651 il_power_initialize(il); in il4965_pci_probe()
6653 init_completion(&il->_4965.firmware_loading_complete); in il4965_pci_probe()
6655 err = il4965_request_firmware(il, true); in il4965_pci_probe()
6662 destroy_workqueue(il->workqueue); in il4965_pci_probe()
6663 il->workqueue = NULL; in il4965_pci_probe()
6664 free_irq(il->pci_dev->irq, il); in il4965_pci_probe()
6666 pci_disable_msi(il->pci_dev); in il4965_pci_probe()
6667 il4965_uninit_drv(il); in il4965_pci_probe()
6669 il_eeprom_free(il); in il4965_pci_probe()
6671 iounmap(il->hw_base); in il4965_pci_probe()
6677 ieee80211_free_hw(il->hw); in il4965_pci_probe()
6685 struct il_priv *il = pci_get_drvdata(pdev); in il4965_pci_remove() local
6688 if (!il) in il4965_pci_remove()
6691 wait_for_completion(&il->_4965.firmware_loading_complete); in il4965_pci_remove()
6695 il_dbgfs_unregister(il); in il4965_pci_remove()
6702 set_bit(S_EXIT_PENDING, &il->status); in il4965_pci_remove()
6704 il_leds_exit(il); in il4965_pci_remove()
6706 if (il->mac80211_registered) { in il4965_pci_remove()
6707 ieee80211_unregister_hw(il->hw); in il4965_pci_remove()
6708 il->mac80211_registered = 0; in il4965_pci_remove()
6710 il4965_down(il); in il4965_pci_remove()
6720 il_apm_stop(il); in il4965_pci_remove()
6725 spin_lock_irqsave(&il->lock, flags); in il4965_pci_remove()
6726 il_disable_interrupts(il); in il4965_pci_remove()
6727 spin_unlock_irqrestore(&il->lock, flags); in il4965_pci_remove()
6729 il4965_synchronize_irq(il); in il4965_pci_remove()
6731 il4965_dealloc_ucode_pci(il); in il4965_pci_remove()
6733 if (il->rxq.bd) in il4965_pci_remove()
6734 il4965_rx_queue_free(il, &il->rxq); in il4965_pci_remove()
6735 il4965_hw_txq_ctx_free(il); in il4965_pci_remove()
6737 il_eeprom_free(il); in il4965_pci_remove()
6740 flush_workqueue(il->workqueue); in il4965_pci_remove()
6745 destroy_workqueue(il->workqueue); in il4965_pci_remove()
6746 il->workqueue = NULL; in il4965_pci_remove()
6748 free_irq(il->pci_dev->irq, il); in il4965_pci_remove()
6749 pci_disable_msi(il->pci_dev); in il4965_pci_remove()
6750 iounmap(il->hw_base); in il4965_pci_remove()
6754 il4965_uninit_drv(il); in il4965_pci_remove()
6756 dev_kfree_skb(il->beacon_skb); in il4965_pci_remove()
6758 ieee80211_free_hw(il->hw); in il4965_pci_remove()
6766 il4965_txq_set_sched(struct il_priv *il, u32 mask) in il4965_txq_set_sched() argument
6768 il_wr_prph(il, IL49_SCD_TXFACT, mask); in il4965_txq_set_sched()