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()
590 ar->disable_offload |= vif->p2p; in carl9170_init_interface()
592 ar->rx_software_decryption = ar->disable_offload; in carl9170_init_interface()
594 err = carl9170_set_operating_mode(ar); in carl9170_init_interface()
603 struct ar9170 *ar = hw->priv; in carl9170_op_add_interface() local
606 mutex_lock(&ar->mutex); in carl9170_op_add_interface()
616 spin_lock_bh(&ar->beacon_lock); in carl9170_op_add_interface()
619 spin_unlock_bh(&ar->beacon_lock); in carl9170_op_add_interface()
633 main_vif = carl9170_get_main_vif(ar); in carl9170_op_add_interface()
664 vif_id = bitmap_find_free_region(&ar->vif_bitmap, ar->fw.vif_num, 0); in carl9170_op_add_interface()
673 BUG_ON(ar->vif_priv[vif_id].id != vif_id); in carl9170_op_add_interface()
678 ar->vifs++; in carl9170_op_add_interface()
684 list_add_rcu(&vif_priv->list, &ar->vif_list); in carl9170_op_add_interface()
689 list_add_tail_rcu(&vif_priv->list, &ar->vif_list); in carl9170_op_add_interface()
691 rcu_assign_pointer(ar->vif_priv[vif_id].vif, vif); in carl9170_op_add_interface()
694 main_vif = carl9170_get_main_vif(ar); in carl9170_op_add_interface()
697 rcu_assign_pointer(ar->beacon_iter, vif_priv); in carl9170_op_add_interface()
708 err = carl9170_mod_virtual_mac(ar, old_main_priv->id, in carl9170_op_add_interface()
714 err = carl9170_init_interface(ar, vif); in carl9170_op_add_interface()
719 err = carl9170_mod_virtual_mac(ar, vif_id, vif->addr); in carl9170_op_add_interface()
725 if (ar->fw.tx_seq_table) { in carl9170_op_add_interface()
726 err = carl9170_write_reg(ar, ar->fw.tx_seq_table + vif_id * 4, in carl9170_op_add_interface()
735 bitmap_release_region(&ar->vif_bitmap, vif_id, 0); in carl9170_op_add_interface()
736 ar->vifs--; in carl9170_op_add_interface()
737 RCU_INIT_POINTER(ar->vif_priv[vif_id].vif, NULL); in carl9170_op_add_interface()
739 mutex_unlock(&ar->mutex); in carl9170_op_add_interface()
742 if (ar->vifs > 1) in carl9170_op_add_interface()
743 ar->ps.off_override |= PS_OFF_VIF; in carl9170_op_add_interface()
745 mutex_unlock(&ar->mutex); in carl9170_op_add_interface()
756 struct ar9170 *ar = hw->priv; in carl9170_op_remove_interface() local
759 mutex_lock(&ar->mutex); in carl9170_op_remove_interface()
764 ar->vifs--; in carl9170_op_remove_interface()
767 main_vif = carl9170_get_main_vif(ar); in carl9170_op_remove_interface()
775 RCU_INIT_POINTER(ar->vif_priv[id].vif, NULL); in carl9170_op_remove_interface()
780 if (ar->vifs) { in carl9170_op_remove_interface()
781 WARN_ON(carl9170_init_interface(ar, in carl9170_op_remove_interface()
782 carl9170_get_main_vif(ar))); in carl9170_op_remove_interface()
784 carl9170_set_operating_mode(ar); in carl9170_op_remove_interface()
789 WARN_ON(carl9170_mod_virtual_mac(ar, id, NULL)); in carl9170_op_remove_interface()
792 carl9170_update_beacon(ar, false); in carl9170_op_remove_interface()
793 carl9170_flush_cab(ar, id); in carl9170_op_remove_interface()
795 spin_lock_bh(&ar->beacon_lock); in carl9170_op_remove_interface()
798 spin_unlock_bh(&ar->beacon_lock); in carl9170_op_remove_interface()
800 bitmap_release_region(&ar->vif_bitmap, id, 0); in carl9170_op_remove_interface()
802 carl9170_set_beacon_timers(ar); in carl9170_op_remove_interface()
804 if (ar->vifs == 1) in carl9170_op_remove_interface()
805 ar->ps.off_override &= ~PS_OFF_VIF; in carl9170_op_remove_interface()
808 mutex_unlock(&ar->mutex); in carl9170_op_remove_interface()
813 void carl9170_ps_check(struct ar9170 *ar) in carl9170_ps_check() argument
815 ieee80211_queue_work(ar->hw, &ar->ps_work); in carl9170_ps_check()
819 static int carl9170_ps_update(struct ar9170 *ar) in carl9170_ps_update() argument
824 if (!ar->ps.off_override) in carl9170_ps_update()
825 ps = (ar->hw->conf.flags & IEEE80211_CONF_PS); in carl9170_ps_update()
827 if (ps != ar->ps.state) { in carl9170_ps_update()
828 err = carl9170_powersave(ar, ps); in carl9170_ps_update()
832 if (ar->ps.state && !ps) { in carl9170_ps_update()
833 ar->ps.sleep_ms = jiffies_to_msecs(jiffies - in carl9170_ps_update()
834 ar->ps.last_action); in carl9170_ps_update()
838 ar->ps.last_slept = jiffies; in carl9170_ps_update()
840 ar->ps.last_action = jiffies; in carl9170_ps_update()
841 ar->ps.state = ps; in carl9170_ps_update()
849 struct ar9170 *ar = container_of(work, struct ar9170, in carl9170_ps_work() local
851 mutex_lock(&ar->mutex); in carl9170_ps_work()
852 if (IS_STARTED(ar)) in carl9170_ps_work()
853 WARN_ON_ONCE(carl9170_ps_update(ar) != 0); in carl9170_ps_work()
854 mutex_unlock(&ar->mutex); in carl9170_ps_work()
857 static int carl9170_update_survey(struct ar9170 *ar, bool flush, bool noise) in carl9170_update_survey() argument
862 err = carl9170_get_noisefloor(ar); in carl9170_update_survey()
867 if (ar->fw.hw_counters) { in carl9170_update_survey()
868 err = carl9170_collect_tally(ar); in carl9170_update_survey()
874 memset(&ar->tally, 0, sizeof(ar->tally)); in carl9170_update_survey()
881 struct ar9170 *ar = container_of(work, struct ar9170, stat_work.work); in carl9170_stat_work() local
884 mutex_lock(&ar->mutex); in carl9170_stat_work()
885 err = carl9170_update_survey(ar, false, true); in carl9170_stat_work()
886 mutex_unlock(&ar->mutex); in carl9170_stat_work()
891 ieee80211_queue_delayed_work(ar->hw, &ar->stat_work, in carl9170_stat_work()
897 struct ar9170 *ar = hw->priv; in carl9170_op_config() local
900 mutex_lock(&ar->mutex); in carl9170_op_config()
907 err = carl9170_ps_update(ar); in carl9170_op_config()
922 err = carl9170_set_slot_time(ar); in carl9170_op_config()
926 err = carl9170_update_survey(ar, true, false); in carl9170_op_config()
930 err = carl9170_set_channel(ar, hw->conf.chandef.chan, in carl9170_op_config()
935 err = carl9170_update_survey(ar, false, true); in carl9170_op_config()
939 err = carl9170_set_dyn_sifs_ack(ar); in carl9170_op_config()
943 err = carl9170_set_rts_cts_rate(ar); in carl9170_op_config()
949 err = carl9170_set_mac_tpc(ar, ar->hw->conf.chandef.chan); in carl9170_op_config()
955 mutex_unlock(&ar->mutex); in carl9170_op_config()
979 struct ar9170 *ar = hw->priv; in carl9170_op_configure_filter() local
982 *new_flags &= FIF_ALLMULTI | ar->rx_filter_caps; in carl9170_op_configure_filter()
984 if (!IS_ACCEPTING_CMD(ar)) in carl9170_op_configure_filter()
987 mutex_lock(&ar->mutex); in carl9170_op_configure_filter()
989 ar->filter_state = *new_flags; in carl9170_op_configure_filter()
998 if (multicast != ar->cur_mc_hash) in carl9170_op_configure_filter()
999 WARN_ON(carl9170_update_multicast(ar, multicast)); in carl9170_op_configure_filter()
1002 ar->sniffer_enabled = !!(*new_flags & FIF_OTHER_BSS); in carl9170_op_configure_filter()
1004 WARN_ON(carl9170_set_operating_mode(ar)); in carl9170_op_configure_filter()
1007 if (ar->fw.rx_filter && changed_flags & ar->rx_filter_caps) { in carl9170_op_configure_filter()
1010 if (!ar->fw.ba_filter) in carl9170_op_configure_filter()
1027 WARN_ON(carl9170_rx_filter(ar, rx_filter)); in carl9170_op_configure_filter()
1030 mutex_unlock(&ar->mutex); in carl9170_op_configure_filter()
1039 struct ar9170 *ar = hw->priv; in carl9170_op_bss_info_changed() local
1040 struct ath_common *common = &ar->common; in carl9170_op_bss_info_changed()
1045 mutex_lock(&ar->mutex); in carl9170_op_bss_info_changed()
1047 main_vif = carl9170_get_main_vif(ar); in carl9170_op_bss_info_changed()
1057 list_for_each_entry_rcu(iter, &ar->vif_list, list) { in carl9170_op_bss_info_changed()
1064 ar->beacon_enabled = i; in carl9170_op_bss_info_changed()
1068 err = carl9170_update_beacon(ar, false); in carl9170_op_bss_info_changed()
1092 err = carl9170_set_beacon_timers(ar); in carl9170_op_bss_info_changed()
1114 err = carl9170_set_operating_mode(ar); in carl9170_op_bss_info_changed()
1120 ar->common.curaid = bss_conf->aid; in carl9170_op_bss_info_changed()
1121 err = carl9170_set_beacon_timers(ar); in carl9170_op_bss_info_changed()
1127 err = carl9170_set_slot_time(ar); in carl9170_op_bss_info_changed()
1133 err = carl9170_set_mac_rates(ar); in carl9170_op_bss_info_changed()
1139 WARN_ON_ONCE(err && IS_STARTED(ar)); in carl9170_op_bss_info_changed()
1140 mutex_unlock(&ar->mutex); in carl9170_op_bss_info_changed()
1146 struct ar9170 *ar = hw->priv; in carl9170_op_get_tsf() local
1150 mutex_lock(&ar->mutex); in carl9170_op_get_tsf()
1151 err = carl9170_exec_cmd(ar, CARL9170_CMD_READ_TSF, in carl9170_op_get_tsf()
1153 mutex_unlock(&ar->mutex); in carl9170_op_get_tsf()
1165 struct ar9170 *ar = hw->priv; in carl9170_op_set_key() local
1169 if (ar->disable_offload || !vif) in carl9170_op_set_key()
1179 if (!is_main_vif(ar, vif)) { in carl9170_op_set_key()
1180 mutex_lock(&ar->mutex); in carl9170_op_set_key()
1212 mutex_lock(&ar->mutex); in carl9170_op_set_key()
1214 if (!IS_STARTED(ar)) { in carl9170_op_set_key()
1225 if (!(ar->usedkeys & BIT(i))) in carl9170_op_set_key()
1233 err = carl9170_upload_key(ar, i, sta ? sta->addr : NULL, in carl9170_op_set_key()
1240 err = carl9170_upload_key(ar, i, sta ? sta->addr : in carl9170_op_set_key()
1254 ar->usedkeys |= BIT(i); in carl9170_op_set_key()
1258 if (!IS_STARTED(ar)) { in carl9170_op_set_key()
1265 ar->usedkeys &= ~BIT(key->hw_key_idx); in carl9170_op_set_key()
1267 err = carl9170_upload_key(ar, key->hw_key_idx, NULL, in carl9170_op_set_key()
1274 err = carl9170_upload_key(ar, key->hw_key_idx, in carl9170_op_set_key()
1284 err = carl9170_disable_key(ar, key->hw_key_idx); in carl9170_op_set_key()
1290 mutex_unlock(&ar->mutex); in carl9170_op_set_key()
1294 if (!ar->rx_software_decryption) { in carl9170_op_set_key()
1295 ar->rx_software_decryption = true; in carl9170_op_set_key()
1296 carl9170_set_operating_mode(ar); in carl9170_op_set_key()
1298 mutex_unlock(&ar->mutex); in carl9170_op_set_key()
1335 struct ar9170 *ar = hw->priv; in carl9170_op_sta_remove() local
1354 spin_lock_bh(&ar->tx_ampdu_list_lock); in carl9170_op_sta_remove()
1357 spin_unlock_bh(&ar->tx_ampdu_list_lock); in carl9170_op_sta_remove()
1363 carl9170_ampdu_gc(ar); in carl9170_op_sta_remove()
1373 struct ar9170 *ar = hw->priv; in carl9170_op_conf_tx() local
1376 mutex_lock(&ar->mutex); in carl9170_op_conf_tx()
1377 memcpy(&ar->edcf[ar9170_qmap(queue)], param, sizeof(*param)); in carl9170_op_conf_tx()
1378 ret = carl9170_set_qos(ar); in carl9170_op_conf_tx()
1379 mutex_unlock(&ar->mutex); in carl9170_op_conf_tx()
1385 struct ar9170 *ar = container_of(work, struct ar9170, in carl9170_ampdu_work() local
1388 if (!IS_STARTED(ar)) in carl9170_ampdu_work()
1391 mutex_lock(&ar->mutex); in carl9170_ampdu_work()
1392 carl9170_ampdu_gc(ar); in carl9170_ampdu_work()
1393 mutex_unlock(&ar->mutex); in carl9170_ampdu_work()
1404 struct ar9170 *ar = hw->priv; in carl9170_op_ampdu_action() local
1433 spin_lock_bh(&ar->tx_ampdu_list_lock); in carl9170_op_ampdu_action()
1434 ar->tx_ampdu_list_len++; in carl9170_op_ampdu_action()
1435 list_add_tail_rcu(&tid_info->list, &ar->tx_ampdu_list); in carl9170_op_ampdu_action()
1437 spin_unlock_bh(&ar->tx_ampdu_list_lock); in carl9170_op_ampdu_action()
1447 spin_lock_bh(&ar->tx_ampdu_list_lock); in carl9170_op_ampdu_action()
1450 spin_unlock_bh(&ar->tx_ampdu_list_lock); in carl9170_op_ampdu_action()
1457 ieee80211_queue_work(ar->hw, &ar->ampdu_work); in carl9170_op_ampdu_action()
1491 static int carl9170_register_wps_button(struct ar9170 *ar) in carl9170_register_wps_button() argument
1496 if (!(ar->features & CARL9170_WPS_BUTTON)) in carl9170_register_wps_button()
1503 snprintf(ar->wps.name, sizeof(ar->wps.name), "%s WPS Button", in carl9170_register_wps_button()
1504 wiphy_name(ar->hw->wiphy)); in carl9170_register_wps_button()
1506 snprintf(ar->wps.phys, sizeof(ar->wps.phys), in carl9170_register_wps_button()
1507 "ieee80211/%s/input0", wiphy_name(ar->hw->wiphy)); in carl9170_register_wps_button()
1509 input->name = ar->wps.name; in carl9170_register_wps_button()
1510 input->phys = ar->wps.phys; in carl9170_register_wps_button()
1512 input->dev.parent = &ar->hw->wiphy->dev; in carl9170_register_wps_button()
1522 ar->wps.pbc = input; in carl9170_register_wps_button()
1528 static int carl9170_rng_get(struct ar9170 *ar) in carl9170_rng_get() argument
1544 if (!IS_ACCEPTING_CMD(ar) || !ar->rng.initialized) in carl9170_rng_get()
1547 count = ARRAY_SIZE(ar->rng.cache); in carl9170_rng_get()
1549 err = carl9170_exec_cmd(ar, CARL9170_CMD_RREG, in carl9170_rng_get()
1557 ar->rng.cache[off + i] = buf[i]; in carl9170_rng_get()
1563 ar->rng.cache_idx = 0; in carl9170_rng_get()
1572 struct ar9170 *ar = (struct ar9170 *)rng->priv; in carl9170_rng_read() local
1575 mutex_lock(&ar->mutex); in carl9170_rng_read()
1576 if (ar->rng.cache_idx >= ARRAY_SIZE(ar->rng.cache)) { in carl9170_rng_read()
1577 ret = carl9170_rng_get(ar); in carl9170_rng_read()
1579 mutex_unlock(&ar->mutex); in carl9170_rng_read()
1584 *data = ar->rng.cache[ar->rng.cache_idx++]; in carl9170_rng_read()
1585 mutex_unlock(&ar->mutex); in carl9170_rng_read()
1590 static void carl9170_unregister_hwrng(struct ar9170 *ar) in carl9170_unregister_hwrng() argument
1592 if (ar->rng.initialized) { in carl9170_unregister_hwrng()
1593 hwrng_unregister(&ar->rng.rng); in carl9170_unregister_hwrng()
1594 ar->rng.initialized = false; in carl9170_unregister_hwrng()
1598 static int carl9170_register_hwrng(struct ar9170 *ar) in carl9170_register_hwrng() argument
1602 snprintf(ar->rng.name, ARRAY_SIZE(ar->rng.name), in carl9170_register_hwrng()
1603 "%s_%s", KBUILD_MODNAME, wiphy_name(ar->hw->wiphy)); in carl9170_register_hwrng()
1604 ar->rng.rng.name = ar->rng.name; in carl9170_register_hwrng()
1605 ar->rng.rng.data_read = carl9170_rng_read; in carl9170_register_hwrng()
1606 ar->rng.rng.priv = (unsigned long)ar; in carl9170_register_hwrng()
1608 if (WARN_ON(ar->rng.initialized)) in carl9170_register_hwrng()
1611 err = hwrng_register(&ar->rng.rng); in carl9170_register_hwrng()
1613 dev_err(&ar->udev->dev, "Failed to register the random " in carl9170_register_hwrng()
1618 ar->rng.initialized = true; in carl9170_register_hwrng()
1620 err = carl9170_rng_get(ar); in carl9170_register_hwrng()
1622 carl9170_unregister_hwrng(ar); in carl9170_register_hwrng()
1633 struct ar9170 *ar = hw->priv; in carl9170_op_get_survey() local
1638 chan = ar->channel; in carl9170_op_get_survey()
1643 mutex_lock(&ar->mutex); in carl9170_op_get_survey()
1644 err = carl9170_update_survey(ar, false, true); in carl9170_op_get_survey()
1645 mutex_unlock(&ar->mutex); in carl9170_op_get_survey()
1651 band = ar->hw->wiphy->bands[b]; in carl9170_op_get_survey()
1666 memcpy(survey, &ar->survey[idx], sizeof(*survey)); in carl9170_op_get_survey()
1671 if (ar->channel == chan) in carl9170_op_get_survey()
1674 if (ar->fw.hw_counters) { in carl9170_op_get_survey()
1687 struct ar9170 *ar = hw->priv; in carl9170_op_flush() local
1690 mutex_lock(&ar->mutex); in carl9170_op_flush()
1691 for_each_set_bit(vid, &ar->vif_bitmap, ar->fw.vif_num) in carl9170_op_flush()
1692 carl9170_flush_cab(ar, vid); in carl9170_op_flush()
1694 carl9170_flush(ar, drop); in carl9170_op_flush()
1695 mutex_unlock(&ar->mutex); in carl9170_op_flush()
1701 struct ar9170 *ar = hw->priv; in carl9170_op_get_stats() local
1704 stats->dot11ACKFailureCount = ar->tx_ack_failures; in carl9170_op_get_stats()
1705 stats->dot11FCSErrorCount = ar->tx_fcs_errors; in carl9170_op_get_stats()
1731 struct ar9170 *ar = hw->priv; in carl9170_tx_frames_pending() local
1733 return !!atomic_read(&ar->tx_total_queued); in carl9170_tx_frames_pending()
1762 struct ar9170 *ar; in carl9170_alloc() local
1780 ar = hw->priv; in carl9170_alloc()
1781 ar->hw = hw; in carl9170_alloc()
1782 ar->rx_failover = skb; in carl9170_alloc()
1784 memset(&ar->rx_plcp, 0, sizeof(struct ar9170_rx_head)); in carl9170_alloc()
1785 ar->rx_has_plcp = false; in carl9170_alloc()
1797 mutex_init(&ar->mutex); in carl9170_alloc()
1798 spin_lock_init(&ar->beacon_lock); in carl9170_alloc()
1799 spin_lock_init(&ar->cmd_lock); in carl9170_alloc()
1800 spin_lock_init(&ar->tx_stats_lock); in carl9170_alloc()
1801 spin_lock_init(&ar->tx_ampdu_list_lock); in carl9170_alloc()
1802 spin_lock_init(&ar->mem_lock); in carl9170_alloc()
1803 spin_lock_init(&ar->state_lock); in carl9170_alloc()
1804 atomic_set(&ar->pending_restarts, 0); in carl9170_alloc()
1805 ar->vifs = 0; in carl9170_alloc()
1806 for (i = 0; i < ar->hw->queues; i++) { in carl9170_alloc()
1807 skb_queue_head_init(&ar->tx_status[i]); in carl9170_alloc()
1808 skb_queue_head_init(&ar->tx_pending[i]); in carl9170_alloc()
1810 INIT_LIST_HEAD(&ar->bar_list[i]); in carl9170_alloc()
1811 spin_lock_init(&ar->bar_list_lock[i]); in carl9170_alloc()
1813 INIT_WORK(&ar->ps_work, carl9170_ps_work); in carl9170_alloc()
1814 INIT_WORK(&ar->ping_work, carl9170_ping_work); in carl9170_alloc()
1815 INIT_WORK(&ar->restart_work, carl9170_restart_work); in carl9170_alloc()
1816 INIT_WORK(&ar->ampdu_work, carl9170_ampdu_work); in carl9170_alloc()
1817 INIT_DELAYED_WORK(&ar->stat_work, carl9170_stat_work); in carl9170_alloc()
1818 INIT_DELAYED_WORK(&ar->tx_janitor, carl9170_tx_janitor); in carl9170_alloc()
1819 INIT_LIST_HEAD(&ar->tx_ampdu_list); in carl9170_alloc()
1820 rcu_assign_pointer(ar->tx_ampdu_iter, in carl9170_alloc()
1821 (struct carl9170_sta_tid *) &ar->tx_ampdu_list); in carl9170_alloc()
1823 bitmap_zero(&ar->vif_bitmap, ar->fw.vif_num); in carl9170_alloc()
1824 INIT_LIST_HEAD(&ar->vif_list); in carl9170_alloc()
1825 init_completion(&ar->tx_flush); in carl9170_alloc()
1855 for (i = 0; i < ARRAY_SIZE(ar->noise); i++) in carl9170_alloc()
1856 ar->noise[i] = -95; /* ATH_DEFAULT_NOISE_FLOOR */ in carl9170_alloc()
1860 return ar; in carl9170_alloc()
1867 static int carl9170_read_eeprom(struct ar9170 *ar) in carl9170_read_eeprom() argument
1871 u8 *eeprom = (void *)&ar->eeprom; in carl9170_read_eeprom()
1875 BUILD_BUG_ON(sizeof(ar->eeprom) & 3); in carl9170_read_eeprom()
1880 BUILD_BUG_ON(sizeof(ar->eeprom) % RB); in carl9170_read_eeprom()
1883 for (i = 0; i < sizeof(ar->eeprom) / RB; i++) { in carl9170_read_eeprom()
1888 err = carl9170_exec_cmd(ar, CARL9170_CMD_RREG, in carl9170_read_eeprom()
1900 static int carl9170_parse_eeprom(struct ar9170 *ar) in carl9170_parse_eeprom() argument
1902 struct ath_regulatory *regulatory = &ar->common.regulatory; in carl9170_parse_eeprom()
1907 if (ar->eeprom.length == cpu_to_le16(0xffff)) in carl9170_parse_eeprom()
1910 rx_streams = hweight8(ar->eeprom.rx_mask); in carl9170_parse_eeprom()
1911 tx_streams = hweight8(ar->eeprom.tx_mask); in carl9170_parse_eeprom()
1926 if (ar->eeprom.operating_flags & AR9170_OPFLAG_2GHZ) { in carl9170_parse_eeprom()
1927 ar->hw->wiphy->bands[NL80211_BAND_2GHZ] = in carl9170_parse_eeprom()
1932 if (ar->eeprom.operating_flags & AR9170_OPFLAG_5GHZ) { in carl9170_parse_eeprom()
1933 ar->hw->wiphy->bands[NL80211_BAND_5GHZ] = in carl9170_parse_eeprom()
1942 ar->survey = kcalloc(chans, sizeof(struct survey_info), GFP_KERNEL); in carl9170_parse_eeprom()
1943 if (!ar->survey) in carl9170_parse_eeprom()
1945 ar->num_channels = chans; in carl9170_parse_eeprom()
1947 regulatory->current_rd = le16_to_cpu(ar->eeprom.reg_domain[0]); in carl9170_parse_eeprom()
1950 SET_IEEE80211_PERM_ADDR(ar->hw, ar->eeprom.mac_address); in carl9170_parse_eeprom()
1959 struct ar9170 *ar = hw->priv; in carl9170_reg_notifier() local
1961 ath_reg_notifier_apply(wiphy, request, &ar->common.regulatory); in carl9170_reg_notifier()
1964 int carl9170_register(struct ar9170 *ar) in carl9170_register() argument
1966 struct ath_regulatory *regulatory = &ar->common.regulatory; in carl9170_register()
1969 if (WARN_ON(ar->mem_bitmap)) in carl9170_register()
1972 ar->mem_bitmap = kcalloc(roundup(ar->fw.mem_blocks, BITS_PER_LONG), in carl9170_register()
1976 if (!ar->mem_bitmap) in carl9170_register()
1980 err = carl9170_read_eeprom(ar); in carl9170_register()
1984 err = carl9170_parse_eeprom(ar); in carl9170_register()
1988 err = ath_regd_init(regulatory, ar->hw->wiphy, in carl9170_register()
1998 for (i = 0; i < ar->fw.vif_num; i++) { in carl9170_register()
1999 ar->vif_priv[i].id = i; in carl9170_register()
2000 ar->vif_priv[i].vif = NULL; in carl9170_register()
2003 err = ieee80211_register_hw(ar->hw); in carl9170_register()
2008 ar->registered = true; in carl9170_register()
2011 regulatory_hint(ar->hw->wiphy, regulatory->alpha2); in carl9170_register()
2014 carl9170_debugfs_register(ar); in carl9170_register()
2017 err = carl9170_led_init(ar); in carl9170_register()
2022 err = carl9170_led_register(ar); in carl9170_register()
2028 err = carl9170_register_wps_button(ar); in carl9170_register()
2034 err = carl9170_register_hwrng(ar); in carl9170_register()
2039 dev_info(&ar->udev->dev, "Atheros AR9170 is registered as '%s'\n", in carl9170_register()
2040 wiphy_name(ar->hw->wiphy)); in carl9170_register()
2045 carl9170_unregister(ar); in carl9170_register()
2049 void carl9170_unregister(struct ar9170 *ar) in carl9170_unregister() argument
2051 if (!ar->registered) in carl9170_unregister()
2054 ar->registered = false; in carl9170_unregister()
2057 carl9170_led_unregister(ar); in carl9170_unregister()
2061 carl9170_debugfs_unregister(ar); in carl9170_unregister()
2065 if (ar->wps.pbc) { in carl9170_unregister()
2066 input_unregister_device(ar->wps.pbc); in carl9170_unregister()
2067 ar->wps.pbc = NULL; in carl9170_unregister()
2072 carl9170_unregister_hwrng(ar); in carl9170_unregister()
2075 carl9170_cancel_worker(ar); in carl9170_unregister()
2076 cancel_work_sync(&ar->restart_work); in carl9170_unregister()
2078 ieee80211_unregister_hw(ar->hw); in carl9170_unregister()
2081 void carl9170_free(struct ar9170 *ar) in carl9170_free() argument
2083 WARN_ON(ar->registered); in carl9170_free()
2084 WARN_ON(IS_INITIALIZED(ar)); in carl9170_free()
2086 kfree_skb(ar->rx_failover); in carl9170_free()
2087 ar->rx_failover = NULL; in carl9170_free()
2089 kfree(ar->mem_bitmap); in carl9170_free()
2090 ar->mem_bitmap = NULL; in carl9170_free()
2092 kfree(ar->survey); in carl9170_free()
2093 ar->survey = NULL; in carl9170_free()
2095 mutex_destroy(&ar->mutex); in carl9170_free()
2097 ieee80211_free_hw(ar->hw); in carl9170_free()