Lines Matching refs:ar
184 static void carl9170_ampdu_gc(struct ar9170 *ar) in carl9170_ampdu_gc() argument
190 list_for_each_entry_rcu(tid_info, &ar->tx_ampdu_list, list) { in carl9170_ampdu_gc()
191 spin_lock_bh(&ar->tx_ampdu_list_lock); in carl9170_ampdu_gc()
195 ar->tx_ampdu_list_len--; in carl9170_ampdu_gc()
198 spin_unlock_bh(&ar->tx_ampdu_list_lock); in carl9170_ampdu_gc()
201 rcu_assign_pointer(ar->tx_ampdu_iter, tid_info); in carl9170_ampdu_gc()
212 carl9170_tx_status(ar, skb, false); in carl9170_ampdu_gc()
219 static void carl9170_flush(struct ar9170 *ar, bool drop_queued) in carl9170_flush() argument
229 for (i = 0; i < ar->hw->queues; i++) { in carl9170_flush()
232 while ((skb = skb_dequeue(&ar->tx_pending[i]))) { in carl9170_flush()
237 atomic_dec(&ar->tx_ampdu_upload); in carl9170_flush()
239 carl9170_tx_status(ar, skb, false); in carl9170_flush()
245 if (atomic_read(&ar->tx_total_queued)) in carl9170_flush()
246 WARN_ON(wait_for_completion_timeout(&ar->tx_flush, HZ) == 0); in carl9170_flush()
249 static void carl9170_flush_ba(struct ar9170 *ar) in carl9170_flush_ba() argument
258 spin_lock_bh(&ar->tx_ampdu_list_lock); in carl9170_flush_ba()
259 list_for_each_entry_rcu(tid_info, &ar->tx_ampdu_list, list) { in carl9170_flush_ba()
269 spin_unlock_bh(&ar->tx_ampdu_list_lock); in carl9170_flush_ba()
273 carl9170_tx_status(ar, skb, false); in carl9170_flush_ba()
276 static void carl9170_zap_queues(struct ar9170 *ar) in carl9170_zap_queues() argument
281 carl9170_ampdu_gc(ar); in carl9170_zap_queues()
283 carl9170_flush_ba(ar); in carl9170_zap_queues()
284 carl9170_flush(ar, true); in carl9170_zap_queues()
286 for (i = 0; i < ar->hw->queues; i++) { in carl9170_zap_queues()
287 spin_lock_bh(&ar->tx_status[i].lock); in carl9170_zap_queues()
288 while (!skb_queue_empty(&ar->tx_status[i])) { in carl9170_zap_queues()
291 skb = skb_peek(&ar->tx_status[i]); in carl9170_zap_queues()
293 spin_unlock_bh(&ar->tx_status[i].lock); in carl9170_zap_queues()
294 carl9170_tx_drop(ar, skb); in carl9170_zap_queues()
295 spin_lock_bh(&ar->tx_status[i].lock); in carl9170_zap_queues()
298 spin_unlock_bh(&ar->tx_status[i].lock); in carl9170_zap_queues()
306 memset(&ar->tx_stats, 0, sizeof(ar->tx_stats)); in carl9170_zap_queues()
307 for (i = 0; i < ar->hw->queues; i++) in carl9170_zap_queues()
308 ar->tx_stats[i].limit = CARL9170_NUM_TX_LIMIT_HARD; in carl9170_zap_queues()
310 for (i = 0; i < DIV_ROUND_UP(ar->fw.mem_blocks, BITS_PER_LONG); i++) in carl9170_zap_queues()
311 ar->mem_bitmap[i] = 0; in carl9170_zap_queues()
314 list_for_each_entry_rcu(cvif, &ar->vif_list, list) { in carl9170_zap_queues()
315 spin_lock_bh(&ar->beacon_lock); in carl9170_zap_queues()
318 spin_unlock_bh(&ar->beacon_lock); in carl9170_zap_queues()
322 atomic_set(&ar->tx_ampdu_upload, 0); in carl9170_zap_queues()
323 atomic_set(&ar->tx_ampdu_scheduler, 0); in carl9170_zap_queues()
324 atomic_set(&ar->tx_total_pending, 0); in carl9170_zap_queues()
325 atomic_set(&ar->tx_total_queued, 0); in carl9170_zap_queues()
326 atomic_set(&ar->mem_free_blocks, ar->fw.mem_blocks); in carl9170_zap_queues()
339 struct ar9170 *ar = hw->priv; in carl9170_op_start() local
342 mutex_lock(&ar->mutex); in carl9170_op_start()
344 carl9170_zap_queues(ar); in carl9170_op_start()
347 CARL9170_FILL_QUEUE(ar->edcf[AR9170_TXQ_VO], 2, 3, 7, 47); in carl9170_op_start()
348 CARL9170_FILL_QUEUE(ar->edcf[AR9170_TXQ_VI], 2, 7, 15, 94); in carl9170_op_start()
349 CARL9170_FILL_QUEUE(ar->edcf[AR9170_TXQ_BE], 3, 15, 1023, 0); in carl9170_op_start()
350 CARL9170_FILL_QUEUE(ar->edcf[AR9170_TXQ_BK], 7, 15, 1023, 0); in carl9170_op_start()
351 CARL9170_FILL_QUEUE(ar->edcf[AR9170_TXQ_SPECIAL], 2, 3, 7, 0); in carl9170_op_start()
353 ar->current_factor = ar->current_density = -1; in carl9170_op_start()
355 ar->usedkeys = 1; in carl9170_op_start()
356 ar->filter_state = 0; in carl9170_op_start()
357 ar->ps.last_action = jiffies; in carl9170_op_start()
358 ar->ps.last_slept = jiffies; in carl9170_op_start()
359 ar->erp_mode = CARL9170_ERP_AUTO; in carl9170_op_start()
364 ar->disable_offload = modparam_nohwcrypt | in carl9170_op_start()
365 ar->fw.disable_offload_fw; in carl9170_op_start()
366 ar->rx_software_decryption = ar->disable_offload; in carl9170_op_start()
368 for (i = 0; i < ar->hw->queues; i++) { in carl9170_op_start()
369 ar->queue_stop_timeout[i] = jiffies; in carl9170_op_start()
370 ar->max_queue_stop_timeout[i] = 0; in carl9170_op_start()
373 atomic_set(&ar->mem_allocs, 0); in carl9170_op_start()
375 err = carl9170_usb_open(ar); in carl9170_op_start()
379 err = carl9170_init_mac(ar); in carl9170_op_start()
383 err = carl9170_set_qos(ar); in carl9170_op_start()
387 if (ar->fw.rx_filter) { in carl9170_op_start()
388 err = carl9170_rx_filter(ar, CARL9170_RX_FILTER_OTHER_RA | in carl9170_op_start()
394 err = carl9170_write_reg(ar, AR9170_MAC_REG_DMA_TRIGGER, in carl9170_op_start()
401 err = carl9170_upload_key(ar, i, NULL, AR9170_ENC_ALG_NONE, in carl9170_op_start()
406 err = carl9170_upload_key(ar, i, NULL, AR9170_ENC_ALG_NONE, in carl9170_op_start()
412 err = carl9170_disable_key(ar, i); in carl9170_op_start()
418 carl9170_set_state_when(ar, CARL9170_IDLE, CARL9170_STARTED); in carl9170_op_start()
420 ieee80211_queue_delayed_work(ar->hw, &ar->stat_work, in carl9170_op_start()
423 ieee80211_wake_queues(ar->hw); in carl9170_op_start()
427 mutex_unlock(&ar->mutex); in carl9170_op_start()
431 static void carl9170_cancel_worker(struct ar9170 *ar) in carl9170_cancel_worker() argument
433 cancel_delayed_work_sync(&ar->stat_work); in carl9170_cancel_worker()
434 cancel_delayed_work_sync(&ar->tx_janitor); in carl9170_cancel_worker()
436 cancel_delayed_work_sync(&ar->led_work); in carl9170_cancel_worker()
438 cancel_work_sync(&ar->ps_work); in carl9170_cancel_worker()
439 cancel_work_sync(&ar->ping_work); in carl9170_cancel_worker()
440 cancel_work_sync(&ar->ampdu_work); in carl9170_cancel_worker()
445 struct ar9170 *ar = hw->priv; in carl9170_op_stop() local
447 carl9170_set_state_when(ar, CARL9170_STARTED, CARL9170_IDLE); in carl9170_op_stop()
449 ieee80211_stop_queues(ar->hw); in carl9170_op_stop()
451 mutex_lock(&ar->mutex); in carl9170_op_stop()
452 if (IS_ACCEPTING_CMD(ar)) { in carl9170_op_stop()
453 RCU_INIT_POINTER(ar->beacon_iter, NULL); in carl9170_op_stop()
455 carl9170_led_set_state(ar, 0); in carl9170_op_stop()
458 carl9170_write_reg(ar, AR9170_MAC_REG_DMA_TRIGGER, 0); in carl9170_op_stop()
459 carl9170_usb_stop(ar); in carl9170_op_stop()
462 carl9170_zap_queues(ar); in carl9170_op_stop()
463 mutex_unlock(&ar->mutex); in carl9170_op_stop()
465 carl9170_cancel_worker(ar); in carl9170_op_stop()
470 struct ar9170 *ar = container_of(work, struct ar9170, in carl9170_restart_work() local
474 ar->usedkeys = 0; in carl9170_restart_work()
475 ar->filter_state = 0; in carl9170_restart_work()
476 carl9170_cancel_worker(ar); in carl9170_restart_work()
478 mutex_lock(&ar->mutex); in carl9170_restart_work()
479 if (!ar->force_usb_reset) { in carl9170_restart_work()
480 err = carl9170_usb_restart(ar); in carl9170_restart_work()
483 dev_err(&ar->udev->dev, "Failed to restart device (%d).\n", err); in carl9170_restart_work()
485 dev_info(&ar->udev->dev, "device restarted successfully.\n"); in carl9170_restart_work()
488 carl9170_zap_queues(ar); in carl9170_restart_work()
489 mutex_unlock(&ar->mutex); in carl9170_restart_work()
491 if (!err && !ar->force_usb_reset) { in carl9170_restart_work()
492 ar->restart_counter++; in carl9170_restart_work()
493 atomic_set(&ar->pending_restarts, 0); in carl9170_restart_work()
495 ieee80211_restart_hw(ar->hw); in carl9170_restart_work()
503 carl9170_usb_reset(ar); in carl9170_restart_work()
507 void carl9170_restart(struct ar9170 *ar, const enum carl9170_restart_reasons r) in carl9170_restart() argument
509 carl9170_set_state_when(ar, CARL9170_STARTED, CARL9170_IDLE); in carl9170_restart()
516 if (atomic_inc_return(&ar->pending_restarts) > 1) { in carl9170_restart()
517 dev_dbg(&ar->udev->dev, "ignoring restart (%d)\n", r); in carl9170_restart()
521 ieee80211_stop_queues(ar->hw); in carl9170_restart()
523 dev_err(&ar->udev->dev, "restart device (%d)\n", r); in carl9170_restart()
527 ar->last_reason = r; in carl9170_restart()
529 if (!ar->registered) in carl9170_restart()
532 if (!IS_ACCEPTING_CMD(ar) || ar->needs_full_reset) in carl9170_restart()
533 ar->force_usb_reset = true; in carl9170_restart()
535 ieee80211_queue_work(ar->hw, &ar->restart_work); in carl9170_restart()
546 struct ar9170 *ar = container_of(work, struct ar9170, ping_work); in carl9170_ping_work() local
549 if (!IS_STARTED(ar)) in carl9170_ping_work()
552 mutex_lock(&ar->mutex); in carl9170_ping_work()
553 err = carl9170_echo_test(ar, 0xdeadbeef); in carl9170_ping_work()
555 carl9170_restart(ar, CARL9170_RR_UNRESPONSIVE_DEVICE); in carl9170_ping_work()
556 mutex_unlock(&ar->mutex); in carl9170_ping_work()
559 static int carl9170_init_interface(struct ar9170 *ar, in carl9170_init_interface() argument
562 struct ath_common *common = &ar->common; in carl9170_init_interface()
566 WARN_ON_ONCE(IS_STARTED(ar)); in carl9170_init_interface()
582 ar->disable_offload |= ((vif->type != NL80211_IFTYPE_STATION) && in carl9170_init_interface()
591 ar->disable_offload |= vif->p2p; in carl9170_init_interface()
593 ar->rx_software_decryption = ar->disable_offload; in carl9170_init_interface()
595 err = carl9170_set_operating_mode(ar); in carl9170_init_interface()
604 struct ar9170 *ar = hw->priv; in carl9170_op_add_interface() local
607 mutex_lock(&ar->mutex); in carl9170_op_add_interface()
617 spin_lock_bh(&ar->beacon_lock); in carl9170_op_add_interface()
620 spin_unlock_bh(&ar->beacon_lock); in carl9170_op_add_interface()
634 main_vif = carl9170_get_main_vif(ar); in carl9170_op_add_interface()
677 vif_id = bitmap_find_free_region(&ar->vif_bitmap, ar->fw.vif_num, 0); in carl9170_op_add_interface()
686 BUG_ON(ar->vif_priv[vif_id].id != vif_id); in carl9170_op_add_interface()
691 ar->vifs++; in carl9170_op_add_interface()
697 list_add_rcu(&vif_priv->list, &ar->vif_list); in carl9170_op_add_interface()
702 list_add_tail_rcu(&vif_priv->list, &ar->vif_list); in carl9170_op_add_interface()
704 rcu_assign_pointer(ar->vif_priv[vif_id].vif, vif); in carl9170_op_add_interface()
707 main_vif = carl9170_get_main_vif(ar); in carl9170_op_add_interface()
710 rcu_assign_pointer(ar->beacon_iter, vif_priv); in carl9170_op_add_interface()
721 err = carl9170_mod_virtual_mac(ar, old_main_priv->id, in carl9170_op_add_interface()
727 err = carl9170_init_interface(ar, vif); in carl9170_op_add_interface()
732 err = carl9170_mod_virtual_mac(ar, vif_id, vif->addr); in carl9170_op_add_interface()
738 if (ar->fw.tx_seq_table) { in carl9170_op_add_interface()
739 err = carl9170_write_reg(ar, ar->fw.tx_seq_table + vif_id * 4, in carl9170_op_add_interface()
748 bitmap_release_region(&ar->vif_bitmap, vif_id, 0); in carl9170_op_add_interface()
749 ar->vifs--; in carl9170_op_add_interface()
750 RCU_INIT_POINTER(ar->vif_priv[vif_id].vif, NULL); in carl9170_op_add_interface()
752 mutex_unlock(&ar->mutex); in carl9170_op_add_interface()
755 if (ar->vifs > 1) in carl9170_op_add_interface()
756 ar->ps.off_override |= PS_OFF_VIF; in carl9170_op_add_interface()
758 mutex_unlock(&ar->mutex); in carl9170_op_add_interface()
769 struct ar9170 *ar = hw->priv; in carl9170_op_remove_interface() local
772 mutex_lock(&ar->mutex); in carl9170_op_remove_interface()
777 ar->vifs--; in carl9170_op_remove_interface()
780 main_vif = carl9170_get_main_vif(ar); in carl9170_op_remove_interface()
788 RCU_INIT_POINTER(ar->vif_priv[id].vif, NULL); in carl9170_op_remove_interface()
793 if (ar->vifs) { in carl9170_op_remove_interface()
794 WARN_ON(carl9170_init_interface(ar, in carl9170_op_remove_interface()
795 carl9170_get_main_vif(ar))); in carl9170_op_remove_interface()
797 carl9170_set_operating_mode(ar); in carl9170_op_remove_interface()
802 WARN_ON(carl9170_mod_virtual_mac(ar, id, NULL)); in carl9170_op_remove_interface()
805 carl9170_update_beacon(ar, false); in carl9170_op_remove_interface()
806 carl9170_flush_cab(ar, id); in carl9170_op_remove_interface()
808 spin_lock_bh(&ar->beacon_lock); in carl9170_op_remove_interface()
811 spin_unlock_bh(&ar->beacon_lock); in carl9170_op_remove_interface()
813 bitmap_release_region(&ar->vif_bitmap, id, 0); in carl9170_op_remove_interface()
815 carl9170_set_beacon_timers(ar); in carl9170_op_remove_interface()
817 if (ar->vifs == 1) in carl9170_op_remove_interface()
818 ar->ps.off_override &= ~PS_OFF_VIF; in carl9170_op_remove_interface()
821 mutex_unlock(&ar->mutex); in carl9170_op_remove_interface()
826 void carl9170_ps_check(struct ar9170 *ar) in carl9170_ps_check() argument
828 ieee80211_queue_work(ar->hw, &ar->ps_work); in carl9170_ps_check()
832 static int carl9170_ps_update(struct ar9170 *ar) in carl9170_ps_update() argument
837 if (!ar->ps.off_override) in carl9170_ps_update()
838 ps = (ar->hw->conf.flags & IEEE80211_CONF_PS); in carl9170_ps_update()
840 if (ps != ar->ps.state) { in carl9170_ps_update()
841 err = carl9170_powersave(ar, ps); in carl9170_ps_update()
845 if (ar->ps.state && !ps) { in carl9170_ps_update()
846 ar->ps.sleep_ms = jiffies_to_msecs(jiffies - in carl9170_ps_update()
847 ar->ps.last_action); in carl9170_ps_update()
851 ar->ps.last_slept = jiffies; in carl9170_ps_update()
853 ar->ps.last_action = jiffies; in carl9170_ps_update()
854 ar->ps.state = ps; in carl9170_ps_update()
862 struct ar9170 *ar = container_of(work, struct ar9170, in carl9170_ps_work() local
864 mutex_lock(&ar->mutex); in carl9170_ps_work()
865 if (IS_STARTED(ar)) in carl9170_ps_work()
866 WARN_ON_ONCE(carl9170_ps_update(ar) != 0); in carl9170_ps_work()
867 mutex_unlock(&ar->mutex); in carl9170_ps_work()
870 static int carl9170_update_survey(struct ar9170 *ar, bool flush, bool noise) in carl9170_update_survey() argument
875 err = carl9170_get_noisefloor(ar); in carl9170_update_survey()
880 if (ar->fw.hw_counters) { in carl9170_update_survey()
881 err = carl9170_collect_tally(ar); in carl9170_update_survey()
887 memset(&ar->tally, 0, sizeof(ar->tally)); in carl9170_update_survey()
894 struct ar9170 *ar = container_of(work, struct ar9170, stat_work.work); in carl9170_stat_work() local
897 mutex_lock(&ar->mutex); in carl9170_stat_work()
898 err = carl9170_update_survey(ar, false, true); in carl9170_stat_work()
899 mutex_unlock(&ar->mutex); in carl9170_stat_work()
904 ieee80211_queue_delayed_work(ar->hw, &ar->stat_work, in carl9170_stat_work()
910 struct ar9170 *ar = hw->priv; in carl9170_op_config() local
913 mutex_lock(&ar->mutex); in carl9170_op_config()
920 err = carl9170_ps_update(ar); in carl9170_op_config()
935 err = carl9170_set_slot_time(ar); in carl9170_op_config()
939 err = carl9170_update_survey(ar, true, false); in carl9170_op_config()
943 err = carl9170_set_channel(ar, hw->conf.chandef.chan, in carl9170_op_config()
948 err = carl9170_update_survey(ar, false, true); in carl9170_op_config()
952 err = carl9170_set_dyn_sifs_ack(ar); in carl9170_op_config()
956 err = carl9170_set_rts_cts_rate(ar); in carl9170_op_config()
962 err = carl9170_set_mac_tpc(ar, ar->hw->conf.chandef.chan); in carl9170_op_config()
968 mutex_unlock(&ar->mutex); in carl9170_op_config()
992 struct ar9170 *ar = hw->priv; in carl9170_op_configure_filter() local
995 *new_flags &= FIF_ALLMULTI | ar->rx_filter_caps; in carl9170_op_configure_filter()
997 if (!IS_ACCEPTING_CMD(ar)) in carl9170_op_configure_filter()
1000 mutex_lock(&ar->mutex); in carl9170_op_configure_filter()
1002 ar->filter_state = *new_flags; in carl9170_op_configure_filter()
1011 if (multicast != ar->cur_mc_hash) in carl9170_op_configure_filter()
1012 WARN_ON(carl9170_update_multicast(ar, multicast)); in carl9170_op_configure_filter()
1015 ar->sniffer_enabled = !!(*new_flags & FIF_OTHER_BSS); in carl9170_op_configure_filter()
1017 WARN_ON(carl9170_set_operating_mode(ar)); in carl9170_op_configure_filter()
1020 if (ar->fw.rx_filter && changed_flags & ar->rx_filter_caps) { in carl9170_op_configure_filter()
1023 if (!ar->fw.ba_filter) in carl9170_op_configure_filter()
1040 WARN_ON(carl9170_rx_filter(ar, rx_filter)); in carl9170_op_configure_filter()
1043 mutex_unlock(&ar->mutex); in carl9170_op_configure_filter()
1052 struct ar9170 *ar = hw->priv; in carl9170_op_bss_info_changed() local
1053 struct ath_common *common = &ar->common; in carl9170_op_bss_info_changed()
1058 mutex_lock(&ar->mutex); in carl9170_op_bss_info_changed()
1060 main_vif = carl9170_get_main_vif(ar); in carl9170_op_bss_info_changed()
1070 list_for_each_entry_rcu(iter, &ar->vif_list, list) { in carl9170_op_bss_info_changed()
1077 ar->beacon_enabled = i; in carl9170_op_bss_info_changed()
1081 err = carl9170_update_beacon(ar, false); in carl9170_op_bss_info_changed()
1105 err = carl9170_set_beacon_timers(ar); in carl9170_op_bss_info_changed()
1127 err = carl9170_set_operating_mode(ar); in carl9170_op_bss_info_changed()
1133 ar->common.curaid = bss_conf->aid; in carl9170_op_bss_info_changed()
1134 err = carl9170_set_beacon_timers(ar); in carl9170_op_bss_info_changed()
1140 err = carl9170_set_slot_time(ar); in carl9170_op_bss_info_changed()
1146 err = carl9170_set_mac_rates(ar); in carl9170_op_bss_info_changed()
1152 WARN_ON_ONCE(err && IS_STARTED(ar)); in carl9170_op_bss_info_changed()
1153 mutex_unlock(&ar->mutex); in carl9170_op_bss_info_changed()
1159 struct ar9170 *ar = hw->priv; in carl9170_op_get_tsf() local
1163 mutex_lock(&ar->mutex); in carl9170_op_get_tsf()
1164 err = carl9170_exec_cmd(ar, CARL9170_CMD_READ_TSF, in carl9170_op_get_tsf()
1166 mutex_unlock(&ar->mutex); in carl9170_op_get_tsf()
1178 struct ar9170 *ar = hw->priv; in carl9170_op_set_key() local
1182 if (ar->disable_offload || !vif) in carl9170_op_set_key()
1192 if (!is_main_vif(ar, vif)) { in carl9170_op_set_key()
1193 mutex_lock(&ar->mutex); in carl9170_op_set_key()
1225 mutex_lock(&ar->mutex); in carl9170_op_set_key()
1227 if (!IS_STARTED(ar)) { in carl9170_op_set_key()
1238 if (!(ar->usedkeys & BIT(i))) in carl9170_op_set_key()
1246 err = carl9170_upload_key(ar, i, sta ? sta->addr : NULL, in carl9170_op_set_key()
1253 err = carl9170_upload_key(ar, i, sta ? sta->addr : in carl9170_op_set_key()
1267 ar->usedkeys |= BIT(i); in carl9170_op_set_key()
1271 if (!IS_STARTED(ar)) { in carl9170_op_set_key()
1278 ar->usedkeys &= ~BIT(key->hw_key_idx); in carl9170_op_set_key()
1280 err = carl9170_upload_key(ar, key->hw_key_idx, NULL, in carl9170_op_set_key()
1287 err = carl9170_upload_key(ar, key->hw_key_idx, in carl9170_op_set_key()
1297 err = carl9170_disable_key(ar, key->hw_key_idx); in carl9170_op_set_key()
1303 mutex_unlock(&ar->mutex); in carl9170_op_set_key()
1307 if (!ar->rx_software_decryption) { in carl9170_op_set_key()
1308 ar->rx_software_decryption = true; in carl9170_op_set_key()
1309 carl9170_set_operating_mode(ar); in carl9170_op_set_key()
1311 mutex_unlock(&ar->mutex); in carl9170_op_set_key()
1348 struct ar9170 *ar = hw->priv; in carl9170_op_sta_remove() local
1367 spin_lock_bh(&ar->tx_ampdu_list_lock); in carl9170_op_sta_remove()
1370 spin_unlock_bh(&ar->tx_ampdu_list_lock); in carl9170_op_sta_remove()
1376 carl9170_ampdu_gc(ar); in carl9170_op_sta_remove()
1386 struct ar9170 *ar = hw->priv; in carl9170_op_conf_tx() local
1389 mutex_lock(&ar->mutex); in carl9170_op_conf_tx()
1390 memcpy(&ar->edcf[ar9170_qmap[queue]], param, sizeof(*param)); in carl9170_op_conf_tx()
1391 ret = carl9170_set_qos(ar); in carl9170_op_conf_tx()
1392 mutex_unlock(&ar->mutex); in carl9170_op_conf_tx()
1398 struct ar9170 *ar = container_of(work, struct ar9170, in carl9170_ampdu_work() local
1401 if (!IS_STARTED(ar)) in carl9170_ampdu_work()
1404 mutex_lock(&ar->mutex); in carl9170_ampdu_work()
1405 carl9170_ampdu_gc(ar); in carl9170_ampdu_work()
1406 mutex_unlock(&ar->mutex); in carl9170_ampdu_work()
1417 struct ar9170 *ar = hw->priv; in carl9170_op_ampdu_action() local
1446 spin_lock_bh(&ar->tx_ampdu_list_lock); in carl9170_op_ampdu_action()
1447 ar->tx_ampdu_list_len++; in carl9170_op_ampdu_action()
1448 list_add_tail_rcu(&tid_info->list, &ar->tx_ampdu_list); in carl9170_op_ampdu_action()
1450 spin_unlock_bh(&ar->tx_ampdu_list_lock); in carl9170_op_ampdu_action()
1461 spin_lock_bh(&ar->tx_ampdu_list_lock); in carl9170_op_ampdu_action()
1464 spin_unlock_bh(&ar->tx_ampdu_list_lock); in carl9170_op_ampdu_action()
1471 ieee80211_queue_work(ar->hw, &ar->ampdu_work); in carl9170_op_ampdu_action()
1505 static int carl9170_register_wps_button(struct ar9170 *ar) in carl9170_register_wps_button() argument
1510 if (!(ar->features & CARL9170_WPS_BUTTON)) in carl9170_register_wps_button()
1517 snprintf(ar->wps.name, sizeof(ar->wps.name), "%s WPS Button", in carl9170_register_wps_button()
1518 wiphy_name(ar->hw->wiphy)); in carl9170_register_wps_button()
1520 snprintf(ar->wps.phys, sizeof(ar->wps.phys), in carl9170_register_wps_button()
1521 "ieee80211/%s/input0", wiphy_name(ar->hw->wiphy)); in carl9170_register_wps_button()
1523 input->name = ar->wps.name; in carl9170_register_wps_button()
1524 input->phys = ar->wps.phys; in carl9170_register_wps_button()
1526 input->dev.parent = &ar->hw->wiphy->dev; in carl9170_register_wps_button()
1536 ar->wps.pbc = input; in carl9170_register_wps_button()
1542 static int carl9170_rng_get(struct ar9170 *ar) in carl9170_rng_get() argument
1558 if (!IS_ACCEPTING_CMD(ar) || !ar->rng.initialized) in carl9170_rng_get()
1561 count = ARRAY_SIZE(ar->rng.cache); in carl9170_rng_get()
1563 err = carl9170_exec_cmd(ar, CARL9170_CMD_RREG, in carl9170_rng_get()
1571 ar->rng.cache[off + i] = buf[i]; in carl9170_rng_get()
1577 ar->rng.cache_idx = 0; in carl9170_rng_get()
1586 struct ar9170 *ar = (struct ar9170 *)rng->priv; in carl9170_rng_read() local
1589 mutex_lock(&ar->mutex); in carl9170_rng_read()
1590 if (ar->rng.cache_idx >= ARRAY_SIZE(ar->rng.cache)) { in carl9170_rng_read()
1591 ret = carl9170_rng_get(ar); in carl9170_rng_read()
1593 mutex_unlock(&ar->mutex); in carl9170_rng_read()
1598 *data = ar->rng.cache[ar->rng.cache_idx++]; in carl9170_rng_read()
1599 mutex_unlock(&ar->mutex); in carl9170_rng_read()
1604 static void carl9170_unregister_hwrng(struct ar9170 *ar) in carl9170_unregister_hwrng() argument
1606 if (ar->rng.initialized) { in carl9170_unregister_hwrng()
1607 hwrng_unregister(&ar->rng.rng); in carl9170_unregister_hwrng()
1608 ar->rng.initialized = false; in carl9170_unregister_hwrng()
1612 static int carl9170_register_hwrng(struct ar9170 *ar) in carl9170_register_hwrng() argument
1616 snprintf(ar->rng.name, ARRAY_SIZE(ar->rng.name), in carl9170_register_hwrng()
1617 "%s_%s", KBUILD_MODNAME, wiphy_name(ar->hw->wiphy)); in carl9170_register_hwrng()
1618 ar->rng.rng.name = ar->rng.name; in carl9170_register_hwrng()
1619 ar->rng.rng.data_read = carl9170_rng_read; in carl9170_register_hwrng()
1620 ar->rng.rng.priv = (unsigned long)ar; in carl9170_register_hwrng()
1622 if (WARN_ON(ar->rng.initialized)) in carl9170_register_hwrng()
1625 err = hwrng_register(&ar->rng.rng); in carl9170_register_hwrng()
1627 dev_err(&ar->udev->dev, "Failed to register the random " in carl9170_register_hwrng()
1632 ar->rng.initialized = true; in carl9170_register_hwrng()
1634 err = carl9170_rng_get(ar); in carl9170_register_hwrng()
1636 carl9170_unregister_hwrng(ar); in carl9170_register_hwrng()
1647 struct ar9170 *ar = hw->priv; in carl9170_op_get_survey() local
1652 chan = ar->channel; in carl9170_op_get_survey()
1657 mutex_lock(&ar->mutex); in carl9170_op_get_survey()
1658 err = carl9170_update_survey(ar, false, true); in carl9170_op_get_survey()
1659 mutex_unlock(&ar->mutex); in carl9170_op_get_survey()
1665 band = ar->hw->wiphy->bands[b]; in carl9170_op_get_survey()
1680 memcpy(survey, &ar->survey[idx], sizeof(*survey)); in carl9170_op_get_survey()
1685 if (ar->channel == chan) in carl9170_op_get_survey()
1688 if (ar->fw.hw_counters) { in carl9170_op_get_survey()
1701 struct ar9170 *ar = hw->priv; in carl9170_op_flush() local
1704 mutex_lock(&ar->mutex); in carl9170_op_flush()
1705 for_each_set_bit(vid, &ar->vif_bitmap, ar->fw.vif_num) in carl9170_op_flush()
1706 carl9170_flush_cab(ar, vid); in carl9170_op_flush()
1708 carl9170_flush(ar, drop); in carl9170_op_flush()
1709 mutex_unlock(&ar->mutex); in carl9170_op_flush()
1715 struct ar9170 *ar = hw->priv; in carl9170_op_get_stats() local
1718 stats->dot11ACKFailureCount = ar->tx_ack_failures; in carl9170_op_get_stats()
1719 stats->dot11FCSErrorCount = ar->tx_fcs_errors; in carl9170_op_get_stats()
1745 struct ar9170 *ar = hw->priv; in carl9170_tx_frames_pending() local
1747 return !!atomic_read(&ar->tx_total_queued); in carl9170_tx_frames_pending()
1776 struct ar9170 *ar; in carl9170_alloc() local
1794 ar = hw->priv; in carl9170_alloc()
1795 ar->hw = hw; in carl9170_alloc()
1796 ar->rx_failover = skb; in carl9170_alloc()
1798 memset(&ar->rx_plcp, 0, sizeof(struct ar9170_rx_head)); in carl9170_alloc()
1799 ar->rx_has_plcp = false; in carl9170_alloc()
1811 mutex_init(&ar->mutex); in carl9170_alloc()
1812 spin_lock_init(&ar->beacon_lock); in carl9170_alloc()
1813 spin_lock_init(&ar->cmd_lock); in carl9170_alloc()
1814 spin_lock_init(&ar->tx_stats_lock); in carl9170_alloc()
1815 spin_lock_init(&ar->tx_ampdu_list_lock); in carl9170_alloc()
1816 spin_lock_init(&ar->mem_lock); in carl9170_alloc()
1817 spin_lock_init(&ar->state_lock); in carl9170_alloc()
1818 atomic_set(&ar->pending_restarts, 0); in carl9170_alloc()
1819 ar->vifs = 0; in carl9170_alloc()
1820 for (i = 0; i < ar->hw->queues; i++) { in carl9170_alloc()
1821 skb_queue_head_init(&ar->tx_status[i]); in carl9170_alloc()
1822 skb_queue_head_init(&ar->tx_pending[i]); in carl9170_alloc()
1824 INIT_LIST_HEAD(&ar->bar_list[i]); in carl9170_alloc()
1825 spin_lock_init(&ar->bar_list_lock[i]); in carl9170_alloc()
1827 INIT_WORK(&ar->ps_work, carl9170_ps_work); in carl9170_alloc()
1828 INIT_WORK(&ar->ping_work, carl9170_ping_work); in carl9170_alloc()
1829 INIT_WORK(&ar->restart_work, carl9170_restart_work); in carl9170_alloc()
1830 INIT_WORK(&ar->ampdu_work, carl9170_ampdu_work); in carl9170_alloc()
1831 INIT_DELAYED_WORK(&ar->stat_work, carl9170_stat_work); in carl9170_alloc()
1832 INIT_DELAYED_WORK(&ar->tx_janitor, carl9170_tx_janitor); in carl9170_alloc()
1833 INIT_LIST_HEAD(&ar->tx_ampdu_list); in carl9170_alloc()
1834 rcu_assign_pointer(ar->tx_ampdu_iter, in carl9170_alloc()
1835 (struct carl9170_sta_tid *) &ar->tx_ampdu_list); in carl9170_alloc()
1837 bitmap_zero(&ar->vif_bitmap, ar->fw.vif_num); in carl9170_alloc()
1838 INIT_LIST_HEAD(&ar->vif_list); in carl9170_alloc()
1839 init_completion(&ar->tx_flush); in carl9170_alloc()
1869 for (i = 0; i < ARRAY_SIZE(ar->noise); i++) in carl9170_alloc()
1870 ar->noise[i] = -95; /* ATH_DEFAULT_NOISE_FLOOR */ in carl9170_alloc()
1874 return ar; in carl9170_alloc()
1881 static int carl9170_read_eeprom(struct ar9170 *ar) in carl9170_read_eeprom() argument
1885 u8 *eeprom = (void *)&ar->eeprom; in carl9170_read_eeprom()
1889 BUILD_BUG_ON(sizeof(ar->eeprom) & 3); in carl9170_read_eeprom()
1894 BUILD_BUG_ON(sizeof(ar->eeprom) % RB); in carl9170_read_eeprom()
1897 for (i = 0; i < sizeof(ar->eeprom) / RB; i++) { in carl9170_read_eeprom()
1902 err = carl9170_exec_cmd(ar, CARL9170_CMD_RREG, in carl9170_read_eeprom()
1914 static int carl9170_parse_eeprom(struct ar9170 *ar) in carl9170_parse_eeprom() argument
1916 struct ath_regulatory *regulatory = &ar->common.regulatory; in carl9170_parse_eeprom()
1921 if (ar->eeprom.length == cpu_to_le16(0xffff)) in carl9170_parse_eeprom()
1924 rx_streams = hweight8(ar->eeprom.rx_mask); in carl9170_parse_eeprom()
1925 tx_streams = hweight8(ar->eeprom.tx_mask); in carl9170_parse_eeprom()
1940 if (ar->eeprom.operating_flags & AR9170_OPFLAG_2GHZ) { in carl9170_parse_eeprom()
1941 ar->hw->wiphy->bands[NL80211_BAND_2GHZ] = in carl9170_parse_eeprom()
1946 if (ar->eeprom.operating_flags & AR9170_OPFLAG_5GHZ) { in carl9170_parse_eeprom()
1947 ar->hw->wiphy->bands[NL80211_BAND_5GHZ] = in carl9170_parse_eeprom()
1956 ar->survey = kcalloc(chans, sizeof(struct survey_info), GFP_KERNEL); in carl9170_parse_eeprom()
1957 if (!ar->survey) in carl9170_parse_eeprom()
1959 ar->num_channels = chans; in carl9170_parse_eeprom()
1961 regulatory->current_rd = le16_to_cpu(ar->eeprom.reg_domain[0]); in carl9170_parse_eeprom()
1964 SET_IEEE80211_PERM_ADDR(ar->hw, ar->eeprom.mac_address); in carl9170_parse_eeprom()
1973 struct ar9170 *ar = hw->priv; in carl9170_reg_notifier() local
1975 ath_reg_notifier_apply(wiphy, request, &ar->common.regulatory); in carl9170_reg_notifier()
1978 int carl9170_register(struct ar9170 *ar) in carl9170_register() argument
1980 struct ath_regulatory *regulatory = &ar->common.regulatory; in carl9170_register()
1983 if (WARN_ON(ar->mem_bitmap)) in carl9170_register()
1986 ar->mem_bitmap = kcalloc(roundup(ar->fw.mem_blocks, BITS_PER_LONG), in carl9170_register()
1990 if (!ar->mem_bitmap) in carl9170_register()
1994 err = carl9170_read_eeprom(ar); in carl9170_register()
1998 err = carl9170_parse_eeprom(ar); in carl9170_register()
2002 err = ath_regd_init(regulatory, ar->hw->wiphy, in carl9170_register()
2012 for (i = 0; i < ar->fw.vif_num; i++) { in carl9170_register()
2013 ar->vif_priv[i].id = i; in carl9170_register()
2014 ar->vif_priv[i].vif = NULL; in carl9170_register()
2017 err = ieee80211_register_hw(ar->hw); in carl9170_register()
2022 ar->registered = true; in carl9170_register()
2025 regulatory_hint(ar->hw->wiphy, regulatory->alpha2); in carl9170_register()
2028 carl9170_debugfs_register(ar); in carl9170_register()
2031 err = carl9170_led_init(ar); in carl9170_register()
2036 err = carl9170_led_register(ar); in carl9170_register()
2042 err = carl9170_register_wps_button(ar); in carl9170_register()
2048 err = carl9170_register_hwrng(ar); in carl9170_register()
2053 dev_info(&ar->udev->dev, "Atheros AR9170 is registered as '%s'\n", in carl9170_register()
2054 wiphy_name(ar->hw->wiphy)); in carl9170_register()
2059 carl9170_unregister(ar); in carl9170_register()
2063 void carl9170_unregister(struct ar9170 *ar) in carl9170_unregister() argument
2065 if (!ar->registered) in carl9170_unregister()
2068 ar->registered = false; in carl9170_unregister()
2071 carl9170_led_unregister(ar); in carl9170_unregister()
2075 carl9170_debugfs_unregister(ar); in carl9170_unregister()
2079 if (ar->wps.pbc) { in carl9170_unregister()
2080 input_unregister_device(ar->wps.pbc); in carl9170_unregister()
2081 ar->wps.pbc = NULL; in carl9170_unregister()
2086 carl9170_unregister_hwrng(ar); in carl9170_unregister()
2089 carl9170_cancel_worker(ar); in carl9170_unregister()
2090 cancel_work_sync(&ar->restart_work); in carl9170_unregister()
2092 ieee80211_unregister_hw(ar->hw); in carl9170_unregister()
2095 void carl9170_free(struct ar9170 *ar) in carl9170_free() argument
2097 WARN_ON(ar->registered); in carl9170_free()
2098 WARN_ON(IS_INITIALIZED(ar)); in carl9170_free()
2100 kfree_skb(ar->rx_failover); in carl9170_free()
2101 ar->rx_failover = NULL; in carl9170_free()
2103 kfree(ar->mem_bitmap); in carl9170_free()
2104 ar->mem_bitmap = NULL; in carl9170_free()
2106 kfree(ar->survey); in carl9170_free()
2107 ar->survey = NULL; in carl9170_free()
2109 mutex_destroy(&ar->mutex); in carl9170_free()
2111 ieee80211_free_hw(ar->hw); in carl9170_free()