Lines Matching refs:ar

193 int ath10k_mac_ext_resource_config(struct ath10k *ar, u32 val)  in ath10k_mac_ext_resource_config()  argument
198 if (test_bit(WMI_SERVICE_TX_MODE_DYNAMIC, ar->wmi.svc_map)) in ath10k_mac_ext_resource_config()
203 ret = ath10k_wmi_ext_resource_config(ar, platform_type, val); in ath10k_mac_ext_resource_config()
206 ath10k_warn(ar, "failed to configure ext resource: %d\n", ret); in ath10k_mac_ext_resource_config()
222 struct ath10k *ar = arvif->ar; in ath10k_send_key() local
232 lockdep_assert_held(&arvif->ar->conf_mutex); in ath10k_send_key()
262 ath10k_warn(ar, "cipher %d is not supported\n", key->cipher); in ath10k_send_key()
266 if (test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) in ath10k_send_key()
274 return ath10k_wmi_vdev_install_key(arvif->ar, &arg); in ath10k_send_key()
282 struct ath10k *ar = arvif->ar; in ath10k_install_key() local
286 lockdep_assert_held(&ar->conf_mutex); in ath10k_install_key()
288 reinit_completion(&ar->install_key_done); in ath10k_install_key()
297 time_left = wait_for_completion_timeout(&ar->install_key_done, 3 * HZ); in ath10k_install_key()
307 struct ath10k *ar = arvif->ar; in ath10k_install_peer_wep_keys() local
313 lockdep_assert_held(&ar->conf_mutex); in ath10k_install_peer_wep_keys()
320 spin_lock_bh(&ar->data_lock); in ath10k_install_peer_wep_keys()
321 peer = ath10k_peer_find(ar, arvif->vdev_id, addr); in ath10k_install_peer_wep_keys()
322 spin_unlock_bh(&ar->data_lock); in ath10k_install_peer_wep_keys()
360 spin_lock_bh(&ar->data_lock); in ath10k_install_peer_wep_keys()
362 spin_unlock_bh(&ar->data_lock); in ath10k_install_peer_wep_keys()
379 ret = ath10k_wmi_vdev_set_param(arvif->ar, in ath10k_install_peer_wep_keys()
381 arvif->ar->wmi.vdev_param->def_keyid, in ath10k_install_peer_wep_keys()
384 ath10k_warn(ar, "failed to re-set def wpa key idxon vdev %i: %d\n", in ath10k_install_peer_wep_keys()
395 struct ath10k *ar = arvif->ar; in ath10k_clear_peer_keys() local
402 lockdep_assert_held(&ar->conf_mutex); in ath10k_clear_peer_keys()
404 spin_lock_bh(&ar->data_lock); in ath10k_clear_peer_keys()
405 peer = ath10k_peer_find(ar, arvif->vdev_id, addr); in ath10k_clear_peer_keys()
406 spin_unlock_bh(&ar->data_lock); in ath10k_clear_peer_keys()
422 ath10k_warn(ar, "failed to remove peer wep key %d: %d\n", in ath10k_clear_peer_keys()
425 spin_lock_bh(&ar->data_lock); in ath10k_clear_peer_keys()
427 spin_unlock_bh(&ar->data_lock); in ath10k_clear_peer_keys()
433 bool ath10k_mac_is_peer_wep_key_set(struct ath10k *ar, const u8 *addr, in ath10k_mac_is_peer_wep_key_set() argument
439 lockdep_assert_held(&ar->data_lock); in ath10k_mac_is_peer_wep_key_set()
446 peer = ath10k_peer_find(ar, 0, addr); in ath10k_mac_is_peer_wep_key_set()
461 struct ath10k *ar = arvif->ar; in ath10k_clear_vdev_key() local
469 lockdep_assert_held(&ar->conf_mutex); in ath10k_clear_vdev_key()
475 spin_lock_bh(&ar->data_lock); in ath10k_clear_vdev_key()
477 list_for_each_entry(peer, &ar->peers, list) { in ath10k_clear_vdev_key()
489 spin_unlock_bh(&ar->data_lock); in ath10k_clear_vdev_key()
499 ath10k_warn(ar, "failed to remove key for %pM: %d\n", in ath10k_clear_vdev_key()
509 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_update_wep_key() local
513 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_vif_update_wep_key()
515 list_for_each_entry(peer, &ar->peers, list) { in ath10k_mac_vif_update_wep_key()
525 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vif vdev %i update key %i needs update\n", in ath10k_mac_vif_update_wep_key()
530 ath10k_warn(ar, "failed to update wep keys on vdev %i for peer %pM: %d\n", in ath10k_mac_vif_update_wep_key()
669 static int ath10k_mac_num_chanctxs(struct ath10k *ar) in ath10k_mac_num_chanctxs() argument
673 ieee80211_iter_chan_contexts_atomic(ar->hw, in ath10k_mac_num_chanctxs()
690 static int ath10k_peer_create(struct ath10k *ar, in ath10k_peer_create() argument
702 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_create()
704 num_peers = ar->num_peers; in ath10k_peer_create()
707 list_for_each_entry(arvif, &ar->arvifs, list) in ath10k_peer_create()
710 if (num_peers >= ar->max_num_peers) in ath10k_peer_create()
713 ret = ath10k_wmi_peer_create(ar, vdev_id, addr, peer_type); in ath10k_peer_create()
715 ath10k_warn(ar, "failed to create wmi peer %pM on vdev %i: %i\n", in ath10k_peer_create()
720 ret = ath10k_wait_for_peer_created(ar, vdev_id, addr); in ath10k_peer_create()
722 ath10k_warn(ar, "failed to wait for created wmi peer %pM on vdev %i: %i\n", in ath10k_peer_create()
727 spin_lock_bh(&ar->data_lock); in ath10k_peer_create()
729 peer = ath10k_peer_find(ar, vdev_id, addr); in ath10k_peer_create()
731 spin_unlock_bh(&ar->data_lock); in ath10k_peer_create()
732 ath10k_warn(ar, "failed to find peer %pM on vdev %i after creation\n", in ath10k_peer_create()
734 ath10k_wmi_peer_delete(ar, vdev_id, addr); in ath10k_peer_create()
741 spin_unlock_bh(&ar->data_lock); in ath10k_peer_create()
743 ar->num_peers++; in ath10k_peer_create()
750 struct ath10k *ar = arvif->ar; in ath10k_mac_set_kickout() local
754 param = ar->wmi.pdev_param->sta_kickout_th; in ath10k_mac_set_kickout()
755 ret = ath10k_wmi_pdev_set_param(ar, param, in ath10k_mac_set_kickout()
758 ath10k_warn(ar, "failed to set kickout threshold on vdev %i: %d\n", in ath10k_mac_set_kickout()
763 param = ar->wmi.vdev_param->ap_keepalive_min_idle_inactive_time_secs; in ath10k_mac_set_kickout()
764 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param, in ath10k_mac_set_kickout()
767 ath10k_warn(ar, "failed to set keepalive minimum idle time on vdev %i: %d\n", in ath10k_mac_set_kickout()
772 param = ar->wmi.vdev_param->ap_keepalive_max_idle_inactive_time_secs; in ath10k_mac_set_kickout()
773 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param, in ath10k_mac_set_kickout()
776 ath10k_warn(ar, "failed to set keepalive maximum idle time on vdev %i: %d\n", in ath10k_mac_set_kickout()
781 param = ar->wmi.vdev_param->ap_keepalive_max_unresponsive_time_secs; in ath10k_mac_set_kickout()
782 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param, in ath10k_mac_set_kickout()
785 ath10k_warn(ar, "failed to set keepalive maximum unresponsive time on vdev %i: %d\n", in ath10k_mac_set_kickout()
795 struct ath10k *ar = arvif->ar; in ath10k_mac_set_rts() local
798 vdev_param = ar->wmi.vdev_param->rts_threshold; in ath10k_mac_set_rts()
799 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, value); in ath10k_mac_set_rts()
802 static int ath10k_peer_delete(struct ath10k *ar, u32 vdev_id, const u8 *addr) in ath10k_peer_delete() argument
806 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_delete()
808 ret = ath10k_wmi_peer_delete(ar, vdev_id, addr); in ath10k_peer_delete()
812 ret = ath10k_wait_for_peer_deleted(ar, vdev_id, addr); in ath10k_peer_delete()
816 ar->num_peers--; in ath10k_peer_delete()
821 static void ath10k_peer_cleanup(struct ath10k *ar, u32 vdev_id) in ath10k_peer_cleanup() argument
827 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_cleanup()
829 spin_lock_bh(&ar->data_lock); in ath10k_peer_cleanup()
830 list_for_each_entry_safe(peer, tmp, &ar->peers, list) { in ath10k_peer_cleanup()
834 ath10k_warn(ar, "removing stale peer %pM from vdev_id %d\n", in ath10k_peer_cleanup()
839 ar->peer_map[peer_id] = NULL; in ath10k_peer_cleanup()
845 for (i = 0; i < ARRAY_SIZE(ar->peer_map); i++) { in ath10k_peer_cleanup()
846 if (ar->peer_map[i] == peer) { in ath10k_peer_cleanup()
847 ath10k_warn(ar, "removing stale peer_map entry for %pM (ptr %pK idx %d)\n", in ath10k_peer_cleanup()
849 ar->peer_map[i] = NULL; in ath10k_peer_cleanup()
855 ar->num_peers--; in ath10k_peer_cleanup()
857 spin_unlock_bh(&ar->data_lock); in ath10k_peer_cleanup()
860 static void ath10k_peer_cleanup_all(struct ath10k *ar) in ath10k_peer_cleanup_all() argument
865 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_cleanup_all()
867 spin_lock_bh(&ar->data_lock); in ath10k_peer_cleanup_all()
868 list_for_each_entry_safe(peer, tmp, &ar->peers, list) { in ath10k_peer_cleanup_all()
873 for (i = 0; i < ARRAY_SIZE(ar->peer_map); i++) in ath10k_peer_cleanup_all()
874 ar->peer_map[i] = NULL; in ath10k_peer_cleanup_all()
876 spin_unlock_bh(&ar->data_lock); in ath10k_peer_cleanup_all()
878 ar->num_peers = 0; in ath10k_peer_cleanup_all()
879 ar->num_stations = 0; in ath10k_peer_cleanup_all()
882 static int ath10k_mac_tdls_peer_update(struct ath10k *ar, u32 vdev_id, in ath10k_mac_tdls_peer_update() argument
891 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_tdls_peer_update()
904 ret = ath10k_wmi_tdls_peer_update(ar, &arg, &cap, &chan_arg); in ath10k_mac_tdls_peer_update()
906 ath10k_warn(ar, "failed to update tdls peer %pM on vdev %i: %i\n", in ath10k_mac_tdls_peer_update()
920 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_beacon_free() local
922 lockdep_assert_held(&ar->data_lock); in ath10k_mac_vif_beacon_free()
928 dma_unmap_single(ar->dev, ATH10K_SKB_CB(arvif->beacon)->paddr, in ath10k_mac_vif_beacon_free()
943 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_beacon_cleanup() local
945 lockdep_assert_held(&ar->data_lock); in ath10k_mac_vif_beacon_cleanup()
950 dma_free_coherent(ar->dev, IEEE80211_MAX_FRAME_LEN, in ath10k_mac_vif_beacon_cleanup()
956 static inline int ath10k_vdev_setup_sync(struct ath10k *ar) in ath10k_vdev_setup_sync() argument
960 lockdep_assert_held(&ar->conf_mutex); in ath10k_vdev_setup_sync()
962 if (test_bit(ATH10K_FLAG_CRASH_FLUSH, &ar->dev_flags)) in ath10k_vdev_setup_sync()
965 time_left = wait_for_completion_timeout(&ar->vdev_setup_done, in ath10k_vdev_setup_sync()
973 static int ath10k_monitor_vdev_start(struct ath10k *ar, int vdev_id) in ath10k_monitor_vdev_start() argument
980 lockdep_assert_held(&ar->conf_mutex); in ath10k_monitor_vdev_start()
982 ieee80211_iter_chan_contexts_atomic(ar->hw, in ath10k_monitor_vdev_start()
1007 reinit_completion(&ar->vdev_setup_done); in ath10k_monitor_vdev_start()
1009 ret = ath10k_wmi_vdev_start(ar, &arg); in ath10k_monitor_vdev_start()
1011 ath10k_warn(ar, "failed to request monitor vdev %i start: %d\n", in ath10k_monitor_vdev_start()
1016 ret = ath10k_vdev_setup_sync(ar); in ath10k_monitor_vdev_start()
1018 ath10k_warn(ar, "failed to synchronize setup for monitor vdev %i start: %d\n", in ath10k_monitor_vdev_start()
1023 ret = ath10k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr); in ath10k_monitor_vdev_start()
1025 ath10k_warn(ar, "failed to put up monitor vdev %i: %d\n", in ath10k_monitor_vdev_start()
1030 ar->monitor_vdev_id = vdev_id; in ath10k_monitor_vdev_start()
1032 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %i started\n", in ath10k_monitor_vdev_start()
1033 ar->monitor_vdev_id); in ath10k_monitor_vdev_start()
1037 ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id); in ath10k_monitor_vdev_start()
1039 ath10k_warn(ar, "failed to stop monitor vdev %i after start failure: %d\n", in ath10k_monitor_vdev_start()
1040 ar->monitor_vdev_id, ret); in ath10k_monitor_vdev_start()
1045 static int ath10k_monitor_vdev_stop(struct ath10k *ar) in ath10k_monitor_vdev_stop() argument
1049 lockdep_assert_held(&ar->conf_mutex); in ath10k_monitor_vdev_stop()
1051 ret = ath10k_wmi_vdev_down(ar, ar->monitor_vdev_id); in ath10k_monitor_vdev_stop()
1053 ath10k_warn(ar, "failed to put down monitor vdev %i: %d\n", in ath10k_monitor_vdev_stop()
1054 ar->monitor_vdev_id, ret); in ath10k_monitor_vdev_stop()
1056 reinit_completion(&ar->vdev_setup_done); in ath10k_monitor_vdev_stop()
1058 ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id); in ath10k_monitor_vdev_stop()
1060 ath10k_warn(ar, "failed to to request monitor vdev %i stop: %d\n", in ath10k_monitor_vdev_stop()
1061 ar->monitor_vdev_id, ret); in ath10k_monitor_vdev_stop()
1063 ret = ath10k_vdev_setup_sync(ar); in ath10k_monitor_vdev_stop()
1065 ath10k_warn(ar, "failed to synchronize monitor vdev %i stop: %d\n", in ath10k_monitor_vdev_stop()
1066 ar->monitor_vdev_id, ret); in ath10k_monitor_vdev_stop()
1068 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %i stopped\n", in ath10k_monitor_vdev_stop()
1069 ar->monitor_vdev_id); in ath10k_monitor_vdev_stop()
1073 static int ath10k_monitor_vdev_create(struct ath10k *ar) in ath10k_monitor_vdev_create() argument
1077 lockdep_assert_held(&ar->conf_mutex); in ath10k_monitor_vdev_create()
1079 if (ar->free_vdev_map == 0) { in ath10k_monitor_vdev_create()
1080 ath10k_warn(ar, "failed to find free vdev id for monitor vdev\n"); in ath10k_monitor_vdev_create()
1084 bit = __ffs64(ar->free_vdev_map); in ath10k_monitor_vdev_create()
1086 ar->monitor_vdev_id = bit; in ath10k_monitor_vdev_create()
1088 ret = ath10k_wmi_vdev_create(ar, ar->monitor_vdev_id, in ath10k_monitor_vdev_create()
1090 0, ar->mac_addr); in ath10k_monitor_vdev_create()
1092 ath10k_warn(ar, "failed to request monitor vdev %i creation: %d\n", in ath10k_monitor_vdev_create()
1093 ar->monitor_vdev_id, ret); in ath10k_monitor_vdev_create()
1097 ar->free_vdev_map &= ~(1LL << ar->monitor_vdev_id); in ath10k_monitor_vdev_create()
1098 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %d created\n", in ath10k_monitor_vdev_create()
1099 ar->monitor_vdev_id); in ath10k_monitor_vdev_create()
1104 static int ath10k_monitor_vdev_delete(struct ath10k *ar) in ath10k_monitor_vdev_delete() argument
1108 lockdep_assert_held(&ar->conf_mutex); in ath10k_monitor_vdev_delete()
1110 ret = ath10k_wmi_vdev_delete(ar, ar->monitor_vdev_id); in ath10k_monitor_vdev_delete()
1112 ath10k_warn(ar, "failed to request wmi monitor vdev %i removal: %d\n", in ath10k_monitor_vdev_delete()
1113 ar->monitor_vdev_id, ret); in ath10k_monitor_vdev_delete()
1117 ar->free_vdev_map |= 1LL << ar->monitor_vdev_id; in ath10k_monitor_vdev_delete()
1119 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %d deleted\n", in ath10k_monitor_vdev_delete()
1120 ar->monitor_vdev_id); in ath10k_monitor_vdev_delete()
1124 static int ath10k_monitor_start(struct ath10k *ar) in ath10k_monitor_start() argument
1128 lockdep_assert_held(&ar->conf_mutex); in ath10k_monitor_start()
1130 ret = ath10k_monitor_vdev_create(ar); in ath10k_monitor_start()
1132 ath10k_warn(ar, "failed to create monitor vdev: %d\n", ret); in ath10k_monitor_start()
1136 ret = ath10k_monitor_vdev_start(ar, ar->monitor_vdev_id); in ath10k_monitor_start()
1138 ath10k_warn(ar, "failed to start monitor vdev: %d\n", ret); in ath10k_monitor_start()
1139 ath10k_monitor_vdev_delete(ar); in ath10k_monitor_start()
1143 ar->monitor_started = true; in ath10k_monitor_start()
1144 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor started\n"); in ath10k_monitor_start()
1149 static int ath10k_monitor_stop(struct ath10k *ar) in ath10k_monitor_stop() argument
1153 lockdep_assert_held(&ar->conf_mutex); in ath10k_monitor_stop()
1155 ret = ath10k_monitor_vdev_stop(ar); in ath10k_monitor_stop()
1157 ath10k_warn(ar, "failed to stop monitor vdev: %d\n", ret); in ath10k_monitor_stop()
1161 ret = ath10k_monitor_vdev_delete(ar); in ath10k_monitor_stop()
1163 ath10k_warn(ar, "failed to delete monitor vdev: %d\n", ret); in ath10k_monitor_stop()
1167 ar->monitor_started = false; in ath10k_monitor_stop()
1168 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor stopped\n"); in ath10k_monitor_stop()
1173 static bool ath10k_mac_monitor_vdev_is_needed(struct ath10k *ar) in ath10k_mac_monitor_vdev_is_needed() argument
1180 num_ctx = ath10k_mac_num_chanctxs(ar); in ath10k_mac_monitor_vdev_is_needed()
1187 if (ar->monitor_arvif) in ath10k_mac_monitor_vdev_is_needed()
1190 return ar->monitor || in ath10k_mac_monitor_vdev_is_needed()
1192 ar->running_fw->fw_file.fw_features) && in ath10k_mac_monitor_vdev_is_needed()
1193 (ar->filter_flags & FIF_OTHER_BSS)) || in ath10k_mac_monitor_vdev_is_needed()
1194 test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags); in ath10k_mac_monitor_vdev_is_needed()
1197 static bool ath10k_mac_monitor_vdev_is_allowed(struct ath10k *ar) in ath10k_mac_monitor_vdev_is_allowed() argument
1201 num_ctx = ath10k_mac_num_chanctxs(ar); in ath10k_mac_monitor_vdev_is_allowed()
1207 if (test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags) && num_ctx > 1) in ath10k_mac_monitor_vdev_is_allowed()
1213 static int ath10k_monitor_recalc(struct ath10k *ar) in ath10k_monitor_recalc() argument
1219 lockdep_assert_held(&ar->conf_mutex); in ath10k_monitor_recalc()
1221 needed = ath10k_mac_monitor_vdev_is_needed(ar); in ath10k_monitor_recalc()
1222 allowed = ath10k_mac_monitor_vdev_is_allowed(ar); in ath10k_monitor_recalc()
1224 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_monitor_recalc()
1226 ar->monitor_started, needed, allowed); in ath10k_monitor_recalc()
1229 if (ar->monitor_started) { in ath10k_monitor_recalc()
1230 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor stopping disallowed monitor\n"); in ath10k_monitor_recalc()
1232 ret = ath10k_monitor_stop(ar); in ath10k_monitor_recalc()
1234 ath10k_warn(ar, "failed to stop disallowed monitor: %d\n", in ath10k_monitor_recalc()
1242 if (needed == ar->monitor_started) in ath10k_monitor_recalc()
1246 return ath10k_monitor_start(ar); in ath10k_monitor_recalc()
1248 return ath10k_monitor_stop(ar); in ath10k_monitor_recalc()
1253 struct ath10k *ar = arvif->ar; in ath10k_mac_can_set_cts_prot() local
1255 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_can_set_cts_prot()
1258 ath10k_dbg(ar, ATH10K_DBG_MAC, "defer cts setup, vdev is not ready yet\n"); in ath10k_mac_can_set_cts_prot()
1267 struct ath10k *ar = arvif->ar; in ath10k_mac_set_cts_prot() local
1270 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_set_cts_prot()
1272 vdev_param = ar->wmi.vdev_param->protection_mode; in ath10k_mac_set_cts_prot()
1274 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d cts_protection %d\n", in ath10k_mac_set_cts_prot()
1277 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_mac_set_cts_prot()
1283 struct ath10k *ar = arvif->ar; in ath10k_recalc_rtscts_prot() local
1286 lockdep_assert_held(&ar->conf_mutex); in ath10k_recalc_rtscts_prot()
1288 vdev_param = ar->wmi.vdev_param->enable_rtscts; in ath10k_recalc_rtscts_prot()
1299 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d recalc rts/cts prot %d\n", in ath10k_recalc_rtscts_prot()
1302 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_recalc_rtscts_prot()
1306 static int ath10k_start_cac(struct ath10k *ar) in ath10k_start_cac() argument
1310 lockdep_assert_held(&ar->conf_mutex); in ath10k_start_cac()
1312 set_bit(ATH10K_CAC_RUNNING, &ar->dev_flags); in ath10k_start_cac()
1314 ret = ath10k_monitor_recalc(ar); in ath10k_start_cac()
1316 ath10k_warn(ar, "failed to start monitor (cac): %d\n", ret); in ath10k_start_cac()
1317 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags); in ath10k_start_cac()
1321 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac cac start monitor vdev %d\n", in ath10k_start_cac()
1322 ar->monitor_vdev_id); in ath10k_start_cac()
1327 static int ath10k_stop_cac(struct ath10k *ar) in ath10k_stop_cac() argument
1329 lockdep_assert_held(&ar->conf_mutex); in ath10k_stop_cac()
1332 if (!test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags)) in ath10k_stop_cac()
1335 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags); in ath10k_stop_cac()
1336 ath10k_monitor_stop(ar); in ath10k_stop_cac()
1338 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac cac finished\n"); in ath10k_stop_cac()
1353 static bool ath10k_mac_has_radar_enabled(struct ath10k *ar) in ath10k_mac_has_radar_enabled() argument
1357 ieee80211_iter_chan_contexts_atomic(ar->hw, in ath10k_mac_has_radar_enabled()
1364 static void ath10k_recalc_radar_detection(struct ath10k *ar) in ath10k_recalc_radar_detection() argument
1368 lockdep_assert_held(&ar->conf_mutex); in ath10k_recalc_radar_detection()
1370 ath10k_stop_cac(ar); in ath10k_recalc_radar_detection()
1372 if (!ath10k_mac_has_radar_enabled(ar)) in ath10k_recalc_radar_detection()
1375 if (ar->num_started_vdevs > 0) in ath10k_recalc_radar_detection()
1378 ret = ath10k_start_cac(ar); in ath10k_recalc_radar_detection()
1385 ath10k_warn(ar, "failed to start CAC: %d\n", ret); in ath10k_recalc_radar_detection()
1386 ieee80211_radar_detected(ar->hw); in ath10k_recalc_radar_detection()
1392 struct ath10k *ar = arvif->ar; in ath10k_vdev_stop() local
1395 lockdep_assert_held(&ar->conf_mutex); in ath10k_vdev_stop()
1397 reinit_completion(&ar->vdev_setup_done); in ath10k_vdev_stop()
1399 ret = ath10k_wmi_vdev_stop(ar, arvif->vdev_id); in ath10k_vdev_stop()
1401 ath10k_warn(ar, "failed to stop WMI vdev %i: %d\n", in ath10k_vdev_stop()
1406 ret = ath10k_vdev_setup_sync(ar); in ath10k_vdev_stop()
1408 ath10k_warn(ar, "failed to synchronize setup for vdev %i: %d\n", in ath10k_vdev_stop()
1413 WARN_ON(ar->num_started_vdevs == 0); in ath10k_vdev_stop()
1415 if (ar->num_started_vdevs != 0) { in ath10k_vdev_stop()
1416 ar->num_started_vdevs--; in ath10k_vdev_stop()
1417 ath10k_recalc_radar_detection(ar); in ath10k_vdev_stop()
1427 struct ath10k *ar = arvif->ar; in ath10k_vdev_start_restart() local
1431 lockdep_assert_held(&ar->conf_mutex); in ath10k_vdev_start_restart()
1433 reinit_completion(&ar->vdev_setup_done); in ath10k_vdev_start_restart()
1462 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_vdev_start_restart()
1468 ret = ath10k_wmi_vdev_restart(ar, &arg); in ath10k_vdev_start_restart()
1470 ret = ath10k_wmi_vdev_start(ar, &arg); in ath10k_vdev_start_restart()
1473 ath10k_warn(ar, "failed to start WMI vdev %i: %d\n", in ath10k_vdev_start_restart()
1478 ret = ath10k_vdev_setup_sync(ar); in ath10k_vdev_start_restart()
1480 ath10k_warn(ar, in ath10k_vdev_start_restart()
1486 ar->num_started_vdevs++; in ath10k_vdev_start_restart()
1487 ath10k_recalc_radar_detection(ar); in ath10k_vdev_start_restart()
1507 struct ath10k *ar = arvif->ar; in ath10k_mac_setup_bcn_p2p_ie() local
1523 ret = ath10k_wmi_p2p_go_bcn_ie(ar, arvif->vdev_id, p2p_ie); in ath10k_mac_setup_bcn_p2p_ie()
1525 ath10k_warn(ar, "failed to submit p2p go bcn ie for vdev %i: %d\n", in ath10k_mac_setup_bcn_p2p_ie()
1565 struct ath10k *ar = arvif->ar; in ath10k_mac_setup_bcn_tmpl() local
1566 struct ieee80211_hw *hw = ar->hw; in ath10k_mac_setup_bcn_tmpl()
1572 if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map)) in ath10k_mac_setup_bcn_tmpl()
1581 ath10k_warn(ar, "failed to get beacon template from mac80211\n"); in ath10k_mac_setup_bcn_tmpl()
1587 ath10k_warn(ar, "failed to setup p2p go bcn ie: %d\n", ret); in ath10k_mac_setup_bcn_tmpl()
1600 ret = ath10k_wmi_bcn_tmpl(ar, arvif->vdev_id, offs.tim_offset, bcn, 0, in ath10k_mac_setup_bcn_tmpl()
1605 ath10k_warn(ar, "failed to submit beacon template command: %d\n", in ath10k_mac_setup_bcn_tmpl()
1615 struct ath10k *ar = arvif->ar; in ath10k_mac_setup_prb_tmpl() local
1616 struct ieee80211_hw *hw = ar->hw; in ath10k_mac_setup_prb_tmpl()
1621 if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map)) in ath10k_mac_setup_prb_tmpl()
1629 ath10k_warn(ar, "failed to get probe resp template from mac80211\n"); in ath10k_mac_setup_prb_tmpl()
1633 ret = ath10k_wmi_prb_tmpl(ar, arvif->vdev_id, prb); in ath10k_mac_setup_prb_tmpl()
1637 ath10k_warn(ar, "failed to submit probe resp template command: %d\n", in ath10k_mac_setup_prb_tmpl()
1647 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_fix_hidden_ssid() local
1666 if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map)) in ath10k_mac_vif_fix_hidden_ssid()
1678 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id); in ath10k_mac_vif_fix_hidden_ssid()
1680 ath10k_warn(ar, "failed to bring down ap vdev %i: %d\n", in ath10k_mac_vif_fix_hidden_ssid()
1691 ath10k_warn(ar, "failed to update beacon template: %d\n", ret); in ath10k_mac_vif_fix_hidden_ssid()
1697 ath10k_warn(ar, "failed to update presp template: %d\n", ret); in ath10k_mac_vif_fix_hidden_ssid()
1703 ath10k_warn(ar, "failed to restart ap vdev %i: %d\n", in ath10k_mac_vif_fix_hidden_ssid()
1708 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid, in ath10k_mac_vif_fix_hidden_ssid()
1711 ath10k_warn(ar, "failed to bring up ap vdev %i: %d\n", in ath10k_mac_vif_fix_hidden_ssid()
1722 struct ath10k *ar = arvif->ar; in ath10k_control_beaconing() local
1725 lockdep_assert_held(&arvif->ar->conf_mutex); in ath10k_control_beaconing()
1728 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id); in ath10k_control_beaconing()
1730 ath10k_warn(ar, "failed to down vdev_id %i: %d\n", in ath10k_control_beaconing()
1735 spin_lock_bh(&arvif->ar->data_lock); in ath10k_control_beaconing()
1737 spin_unlock_bh(&arvif->ar->data_lock); in ath10k_control_beaconing()
1747 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid, in ath10k_control_beaconing()
1750 ath10k_warn(ar, "failed to bring up vdev %d: %i\n", in ath10k_control_beaconing()
1759 ath10k_warn(ar, "failed to fix hidden ssid for vdev %i, expect trouble: %d\n", in ath10k_control_beaconing()
1764 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d up\n", arvif->vdev_id); in ath10k_control_beaconing()
1771 struct ath10k *ar = arvif->ar; in ath10k_control_ibss() local
1775 lockdep_assert_held(&arvif->ar->conf_mutex); in ath10k_control_ibss()
1786 vdev_param = arvif->ar->wmi.vdev_param->atim_window; in ath10k_control_ibss()
1787 ret = ath10k_wmi_vdev_set_param(arvif->ar, arvif->vdev_id, vdev_param, in ath10k_control_ibss()
1790 ath10k_warn(ar, "failed to set IBSS ATIM for vdev %d: %d\n", in ath10k_control_ibss()
1796 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_recalc_ps_wake_threshold() local
1801 lockdep_assert_held(&arvif->ar->conf_mutex); in ath10k_mac_vif_recalc_ps_wake_threshold()
1809 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param, value); in ath10k_mac_vif_recalc_ps_wake_threshold()
1811 ath10k_warn(ar, "failed to submit ps wake threshold %u on vdev %i: %d\n", in ath10k_mac_vif_recalc_ps_wake_threshold()
1821 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_recalc_ps_poll_count() local
1826 lockdep_assert_held(&arvif->ar->conf_mutex); in ath10k_mac_vif_recalc_ps_poll_count()
1834 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath10k_mac_vif_recalc_ps_poll_count()
1837 ath10k_warn(ar, "failed to submit ps poll count %u on vdev %i: %d\n", in ath10k_mac_vif_recalc_ps_poll_count()
1845 static int ath10k_mac_num_vifs_started(struct ath10k *ar) in ath10k_mac_num_vifs_started() argument
1850 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_num_vifs_started()
1852 list_for_each_entry(arvif, &ar->arvifs, list) in ath10k_mac_num_vifs_started()
1861 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_setup_ps() local
1863 struct ieee80211_conf *conf = &ar->hw->conf; in ath10k_mac_vif_setup_ps()
1870 lockdep_assert_held(&arvif->ar->conf_mutex); in ath10k_mac_vif_setup_ps()
1877 if (enable_ps && ath10k_mac_num_vifs_started(ar) > 1 && in ath10k_mac_vif_setup_ps()
1879 ar->running_fw->fw_file.fw_features)) { in ath10k_mac_vif_setup_ps()
1880 ath10k_warn(ar, "refusing to enable ps on vdev %i: not supported by fw\n", in ath10k_mac_vif_setup_ps()
1903 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param, in ath10k_mac_vif_setup_ps()
1906 ath10k_warn(ar, "failed to set inactivity time for vdev %d: %i\n", in ath10k_mac_vif_setup_ps()
1914 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d psmode %s\n", in ath10k_mac_vif_setup_ps()
1917 ret = ath10k_wmi_set_psmode(ar, arvif->vdev_id, psmode); in ath10k_mac_vif_setup_ps()
1919 ath10k_warn(ar, "failed to set PS Mode %d for vdev %d: %d\n", in ath10k_mac_vif_setup_ps()
1929 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_disable_keepalive() local
1933 lockdep_assert_held(&arvif->ar->conf_mutex); in ath10k_mac_vif_disable_keepalive()
1938 if (!test_bit(WMI_SERVICE_STA_KEEP_ALIVE, ar->wmi.svc_map)) in ath10k_mac_vif_disable_keepalive()
1949 ret = ath10k_wmi_sta_keepalive(ar, &arg); in ath10k_mac_vif_disable_keepalive()
1951 ath10k_warn(ar, "failed to submit keepalive on vdev %i: %d\n", in ath10k_mac_vif_disable_keepalive()
1961 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_ap_csa_count_down() local
1965 lockdep_assert_held(&arvif->ar->conf_mutex); in ath10k_mac_vif_ap_csa_count_down()
1967 if (WARN_ON(!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map))) in ath10k_mac_vif_ap_csa_count_down()
1984 ath10k_warn(ar, "failed to update bcn tmpl during csa: %d\n", in ath10k_mac_vif_ap_csa_count_down()
1989 ath10k_warn(ar, "failed to update prb tmpl during csa: %d\n", in ath10k_mac_vif_ap_csa_count_down()
2000 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_ap_csa_work() local
2002 mutex_lock(&ar->conf_mutex); in ath10k_mac_vif_ap_csa_work()
2004 mutex_unlock(&ar->conf_mutex); in ath10k_mac_vif_ap_csa_work()
2023 void ath10k_mac_handle_beacon(struct ath10k *ar, struct sk_buff *skb) in ath10k_mac_handle_beacon() argument
2025 ieee80211_iterate_active_interfaces_atomic(ar->hw, in ath10k_mac_handle_beacon()
2036 struct ath10k *ar = arvif->ar; in ath10k_mac_handle_beacon_miss_iter() local
2037 struct ieee80211_hw *hw = ar->hw; in ath10k_mac_handle_beacon_miss_iter()
2056 void ath10k_mac_handle_beacon_miss(struct ath10k *ar, u32 vdev_id) in ath10k_mac_handle_beacon_miss() argument
2058 ieee80211_iterate_active_interfaces_atomic(ar->hw, in ath10k_mac_handle_beacon_miss()
2080 static u32 ath10k_peer_assoc_h_listen_intval(struct ath10k *ar, in ath10k_peer_assoc_h_listen_intval() argument
2094 return ar->hw->conf.listen_interval; in ath10k_peer_assoc_h_listen_intval()
2097 static void ath10k_peer_assoc_h_basic(struct ath10k *ar, in ath10k_peer_assoc_h_basic() argument
2105 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_assoc_h_basic()
2115 arg->peer_flags |= arvif->ar->wmi.peer_flags->auth; in ath10k_peer_assoc_h_basic()
2116 arg->peer_listen_intval = ath10k_peer_assoc_h_listen_intval(ar, vif); in ath10k_peer_assoc_h_basic()
2121 static void ath10k_peer_assoc_h_crypto(struct ath10k *ar, in ath10k_peer_assoc_h_crypto() argument
2132 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_assoc_h_crypto()
2137 bss = cfg80211_get_bss(ar->hw->wiphy, def.chan, info->bssid, NULL, 0, in ath10k_peer_assoc_h_crypto()
2152 cfg80211_put_bss(ar->hw->wiphy, bss); in ath10k_peer_assoc_h_crypto()
2157 ath10k_dbg(ar, ATH10K_DBG_WMI, "%s: rsn ie found\n", __func__); in ath10k_peer_assoc_h_crypto()
2158 arg->peer_flags |= ar->wmi.peer_flags->need_ptk_4_way; in ath10k_peer_assoc_h_crypto()
2162 ath10k_dbg(ar, ATH10K_DBG_WMI, "%s: wpa ie found\n", __func__); in ath10k_peer_assoc_h_crypto()
2163 arg->peer_flags |= ar->wmi.peer_flags->need_gtk_2_way; in ath10k_peer_assoc_h_crypto()
2168 ar->running_fw->fw_file.fw_features)) { in ath10k_peer_assoc_h_crypto()
2169 arg->peer_flags |= ar->wmi.peer_flags->pmf; in ath10k_peer_assoc_h_crypto()
2173 static void ath10k_peer_assoc_h_rates(struct ath10k *ar, in ath10k_peer_assoc_h_rates() argument
2188 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_assoc_h_rates()
2194 sband = ar->hw->wiphy->bands[band]; in ath10k_peer_assoc_h_rates()
2235 static void ath10k_peer_assoc_h_ht(struct ath10k *ar, in ath10k_peer_assoc_h_ht() argument
2250 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_assoc_h_ht()
2266 arg->peer_flags |= ar->wmi.peer_flags->ht; in ath10k_peer_assoc_h_ht()
2277 arg->peer_flags |= ar->wmi.peer_flags->ldbc; in ath10k_peer_assoc_h_ht()
2280 arg->peer_flags |= ar->wmi.peer_flags->bw40; in ath10k_peer_assoc_h_ht()
2294 arg->peer_flags |= ar->wmi.peer_flags->stbc; in ath10k_peer_assoc_h_ht()
2302 arg->peer_flags |= ar->wmi.peer_flags->stbc; in ath10k_peer_assoc_h_ht()
2335 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n", in ath10k_peer_assoc_h_ht()
2341 static int ath10k_peer_assoc_qos_ap(struct ath10k *ar, in ath10k_peer_assoc_qos_ap() argument
2349 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_assoc_qos_ap()
2352 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac uapsd_queues 0x%x max_sp %d\n", in ath10k_peer_assoc_qos_ap()
2371 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id, in ath10k_peer_assoc_qos_ap()
2376 ath10k_warn(ar, "failed to set ap ps peer param uapsd for vdev %i: %d\n", in ath10k_peer_assoc_qos_ap()
2381 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id, in ath10k_peer_assoc_qos_ap()
2386 ath10k_warn(ar, "failed to set ap ps peer param max sp for vdev %i: %d\n", in ath10k_peer_assoc_qos_ap()
2396 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id, sta->addr, in ath10k_peer_assoc_qos_ap()
2400 ath10k_warn(ar, "failed to set ap ps peer param ageout time for vdev %i: %d\n", in ath10k_peer_assoc_qos_ap()
2460 static void ath10k_peer_assoc_h_vht(struct ath10k *ar, in ath10k_peer_assoc_h_vht() argument
2486 arg->peer_flags |= ar->wmi.peer_flags->vht; in ath10k_peer_assoc_h_vht()
2489 arg->peer_flags |= ar->wmi.peer_flags->vht_2g; in ath10k_peer_assoc_h_vht()
2507 arg->peer_flags |= ar->wmi.peer_flags->bw80; in ath10k_peer_assoc_h_vht()
2510 arg->peer_flags |= ar->wmi.peer_flags->bw160; in ath10k_peer_assoc_h_vht()
2533 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vht peer %pM max_mpdu %d flags 0x%x\n", in ath10k_peer_assoc_h_vht()
2551 static void ath10k_peer_assoc_h_qos(struct ath10k *ar, in ath10k_peer_assoc_h_qos() argument
2561 arg->peer_flags |= arvif->ar->wmi.peer_flags->qos; in ath10k_peer_assoc_h_qos()
2564 arg->peer_flags |= arvif->ar->wmi.peer_flags->apsd; in ath10k_peer_assoc_h_qos()
2570 arg->peer_flags |= arvif->ar->wmi.peer_flags->qos; in ath10k_peer_assoc_h_qos()
2574 arg->peer_flags |= arvif->ar->wmi.peer_flags->qos; in ath10k_peer_assoc_h_qos()
2580 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac peer %pM qos %d\n", in ath10k_peer_assoc_h_qos()
2582 arvif->ar->wmi.peer_flags->qos)); in ath10k_peer_assoc_h_qos()
2591 static enum wmi_phy_mode ath10k_mac_get_phymode_vht(struct ath10k *ar, in ath10k_mac_get_phymode_vht() argument
2618 static void ath10k_peer_assoc_h_phymode(struct ath10k *ar, in ath10k_peer_assoc_h_phymode() argument
2664 phymode = ath10k_mac_get_phymode_vht(ar, sta); in ath10k_peer_assoc_h_phymode()
2680 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac peer %pM phymode %s\n", in ath10k_peer_assoc_h_phymode()
2687 static int ath10k_peer_assoc_prepare(struct ath10k *ar, in ath10k_peer_assoc_prepare() argument
2692 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_assoc_prepare()
2696 ath10k_peer_assoc_h_basic(ar, vif, sta, arg); in ath10k_peer_assoc_prepare()
2697 ath10k_peer_assoc_h_crypto(ar, vif, sta, arg); in ath10k_peer_assoc_prepare()
2698 ath10k_peer_assoc_h_rates(ar, vif, sta, arg); in ath10k_peer_assoc_prepare()
2699 ath10k_peer_assoc_h_ht(ar, vif, sta, arg); in ath10k_peer_assoc_prepare()
2700 ath10k_peer_assoc_h_vht(ar, vif, sta, arg); in ath10k_peer_assoc_prepare()
2701 ath10k_peer_assoc_h_qos(ar, vif, sta, arg); in ath10k_peer_assoc_prepare()
2702 ath10k_peer_assoc_h_phymode(ar, vif, sta, arg); in ath10k_peer_assoc_prepare()
2714 static int ath10k_setup_peer_smps(struct ath10k *ar, struct ath10k_vif *arvif, in ath10k_setup_peer_smps() argument
2729 return ath10k_wmi_peer_set_param(ar, arvif->vdev_id, addr, in ath10k_setup_peer_smps()
2734 static int ath10k_mac_vif_recalc_txbf(struct ath10k *ar, in ath10k_mac_vif_recalc_txbf() argument
2743 if (ath10k_wmi_get_txbf_conf_scheme(ar) != WMI_TXBF_CONF_AFTER_ASSOC) in ath10k_mac_vif_recalc_txbf()
2746 if (!(ar->vht_cap_info & in ath10k_mac_vif_recalc_txbf()
2753 param = ar->wmi.vdev_param->txbf; in ath10k_mac_vif_recalc_txbf()
2763 if (ar->vht_cap_info & in ath10k_mac_vif_recalc_txbf()
2773 if (ar->vht_cap_info & in ath10k_mac_vif_recalc_txbf()
2789 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param, value); in ath10k_mac_vif_recalc_txbf()
2791 ath10k_warn(ar, "failed to submit vdev param txbf 0x%x: %d\n", in ath10k_mac_vif_recalc_txbf()
2804 struct ath10k *ar = hw->priv; in ath10k_bss_assoc() local
2812 lockdep_assert_held(&ar->conf_mutex); in ath10k_bss_assoc()
2814 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i assoc bssid %pM aid %d\n", in ath10k_bss_assoc()
2821 ath10k_warn(ar, "failed to find station entry for bss %pM vdev %i\n", in ath10k_bss_assoc()
2833 ret = ath10k_peer_assoc_prepare(ar, vif, ap_sta, &peer_arg); in ath10k_bss_assoc()
2835 ath10k_warn(ar, "failed to prepare peer assoc for %pM vdev %i: %d\n", in ath10k_bss_assoc()
2843 ret = ath10k_wmi_peer_assoc(ar, &peer_arg); in ath10k_bss_assoc()
2845 ath10k_warn(ar, "failed to run peer assoc for %pM vdev %i: %d\n", in ath10k_bss_assoc()
2850 ret = ath10k_setup_peer_smps(ar, arvif, bss_conf->bssid, &ht_cap); in ath10k_bss_assoc()
2852 ath10k_warn(ar, "failed to setup peer SMPS for vdev %i: %d\n", in ath10k_bss_assoc()
2857 ret = ath10k_mac_vif_recalc_txbf(ar, vif, vht_cap); in ath10k_bss_assoc()
2859 ath10k_warn(ar, "failed to recalc txbf for vdev %i on bss %pM: %d\n", in ath10k_bss_assoc()
2864 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_bss_assoc()
2873 ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid); in ath10k_bss_assoc()
2875 ath10k_warn(ar, "failed to set vdev %d up: %d\n", in ath10k_bss_assoc()
2886 ret = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, arvif->bssid, in ath10k_bss_assoc()
2889 ath10k_warn(ar, "failed to poke peer %pM param for ps workaround on vdev %i: %d\n", in ath10k_bss_assoc()
2898 struct ath10k *ar = hw->priv; in ath10k_bss_disassoc() local
2903 lockdep_assert_held(&ar->conf_mutex); in ath10k_bss_disassoc()
2905 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i disassoc bssid %pM\n", in ath10k_bss_disassoc()
2908 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id); in ath10k_bss_disassoc()
2910 ath10k_warn(ar, "failed to down vdev %i: %d\n", in ath10k_bss_disassoc()
2915 ret = ath10k_mac_vif_recalc_txbf(ar, vif, vht_cap); in ath10k_bss_disassoc()
2917 ath10k_warn(ar, "failed to recalc txbf for vdev %i: %d\n", in ath10k_bss_disassoc()
2927 static int ath10k_station_assoc(struct ath10k *ar, in ath10k_station_assoc() argument
2936 lockdep_assert_held(&ar->conf_mutex); in ath10k_station_assoc()
2938 ret = ath10k_peer_assoc_prepare(ar, vif, sta, &peer_arg); in ath10k_station_assoc()
2940 ath10k_warn(ar, "failed to prepare WMI peer assoc for %pM vdev %i: %i\n", in ath10k_station_assoc()
2945 ret = ath10k_wmi_peer_assoc(ar, &peer_arg); in ath10k_station_assoc()
2947 ath10k_warn(ar, "failed to run peer assoc for STA %pM vdev %i: %d\n", in ath10k_station_assoc()
2956 ret = ath10k_setup_peer_smps(ar, arvif, sta->addr, in ath10k_station_assoc()
2959 ath10k_warn(ar, "failed to setup peer SMPS for vdev %d: %d\n", in ath10k_station_assoc()
2964 ret = ath10k_peer_assoc_qos_ap(ar, arvif, sta); in ath10k_station_assoc()
2966 ath10k_warn(ar, "failed to set qos params for STA %pM for vdev %i: %d\n", in ath10k_station_assoc()
2975 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n", in ath10k_station_assoc()
2985 ath10k_warn(ar, "failed to install peer wep keys for vdev %i: %d\n", in ath10k_station_assoc()
2995 static int ath10k_station_disassoc(struct ath10k *ar, in ath10k_station_disassoc() argument
3002 lockdep_assert_held(&ar->conf_mutex); in ath10k_station_disassoc()
3008 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n", in ath10k_station_disassoc()
3016 ath10k_warn(ar, "failed to clear all peer wep keys for vdev %i: %d\n", in ath10k_station_disassoc()
3028 static int ath10k_update_channel_list(struct ath10k *ar) in ath10k_update_channel_list() argument
3030 struct ieee80211_hw *hw = ar->hw; in ath10k_update_channel_list()
3041 lockdep_assert_held(&ar->conf_mutex); in ath10k_update_channel_list()
3117 ath10k_dbg(ar, ATH10K_DBG_WMI, in ath10k_update_channel_list()
3127 ret = ath10k_wmi_scan_chan_list(ar, &arg); in ath10k_update_channel_list()
3149 static void ath10k_regd_update(struct ath10k *ar) in ath10k_regd_update() argument
3156 lockdep_assert_held(&ar->conf_mutex); in ath10k_regd_update()
3158 ret = ath10k_update_channel_list(ar); in ath10k_regd_update()
3160 ath10k_warn(ar, "failed to update channel list: %d\n", ret); in ath10k_regd_update()
3162 regpair = ar->ath_common.regulatory.regpair; in ath10k_regd_update()
3164 if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) { in ath10k_regd_update()
3165 nl_dfs_reg = ar->dfs_detector->region; in ath10k_regd_update()
3174 ret = ath10k_wmi_pdev_set_regdomain(ar, in ath10k_regd_update()
3182 ath10k_warn(ar, "failed to set pdev regdomain: %d\n", ret); in ath10k_regd_update()
3185 static void ath10k_mac_update_channel_list(struct ath10k *ar, in ath10k_mac_update_channel_list() argument
3190 if (ar->low_5ghz_chan && ar->high_5ghz_chan) { in ath10k_mac_update_channel_list()
3192 if (band->channels[i].center_freq < ar->low_5ghz_chan || in ath10k_mac_update_channel_list()
3193 band->channels[i].center_freq > ar->high_5ghz_chan) in ath10k_mac_update_channel_list()
3204 struct ath10k *ar = hw->priv; in ath10k_reg_notifier() local
3207 ath_reg_notifier_apply(wiphy, request, &ar->ath_common.regulatory); in ath10k_reg_notifier()
3209 if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) { in ath10k_reg_notifier()
3210 ath10k_dbg(ar, ATH10K_DBG_REGULATORY, "dfs region 0x%x\n", in ath10k_reg_notifier()
3212 result = ar->dfs_detector->set_dfs_domain(ar->dfs_detector, in ath10k_reg_notifier()
3215 ath10k_warn(ar, "DFS region 0x%X not supported, will trigger radar for every pulse\n", in ath10k_reg_notifier()
3219 mutex_lock(&ar->conf_mutex); in ath10k_reg_notifier()
3220 if (ar->state == ATH10K_STATE_ON) in ath10k_reg_notifier()
3221 ath10k_regd_update(ar); in ath10k_reg_notifier()
3222 mutex_unlock(&ar->conf_mutex); in ath10k_reg_notifier()
3224 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) in ath10k_reg_notifier()
3225 ath10k_mac_update_channel_list(ar, in ath10k_reg_notifier()
3226 ar->hw->wiphy->bands[NL80211_BAND_5GHZ]); in ath10k_reg_notifier()
3229 static void ath10k_stop_radar_confirmation(struct ath10k *ar) in ath10k_stop_radar_confirmation() argument
3231 spin_lock_bh(&ar->data_lock); in ath10k_stop_radar_confirmation()
3232 ar->radar_conf_state = ATH10K_RADAR_CONFIRMATION_STOPPED; in ath10k_stop_radar_confirmation()
3233 spin_unlock_bh(&ar->data_lock); in ath10k_stop_radar_confirmation()
3235 cancel_work_sync(&ar->radar_confirmation_work); in ath10k_stop_radar_confirmation()
3249 void ath10k_mac_tx_lock(struct ath10k *ar, int reason) in ath10k_mac_tx_lock() argument
3251 lockdep_assert_held(&ar->htt.tx_lock); in ath10k_mac_tx_lock()
3254 ar->tx_paused |= BIT(reason); in ath10k_mac_tx_lock()
3255 ieee80211_stop_queues(ar->hw); in ath10k_mac_tx_lock()
3261 struct ath10k *ar = data; in ath10k_mac_tx_unlock_iter() local
3267 ieee80211_wake_queue(ar->hw, arvif->vdev_id); in ath10k_mac_tx_unlock_iter()
3270 void ath10k_mac_tx_unlock(struct ath10k *ar, int reason) in ath10k_mac_tx_unlock() argument
3272 lockdep_assert_held(&ar->htt.tx_lock); in ath10k_mac_tx_unlock()
3275 ar->tx_paused &= ~BIT(reason); in ath10k_mac_tx_unlock()
3277 if (ar->tx_paused) in ath10k_mac_tx_unlock()
3280 ieee80211_iterate_active_interfaces_atomic(ar->hw, in ath10k_mac_tx_unlock()
3283 ar); in ath10k_mac_tx_unlock()
3285 ieee80211_wake_queue(ar->hw, ar->hw->offchannel_tx_hw_queue); in ath10k_mac_tx_unlock()
3290 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_tx_lock() local
3292 lockdep_assert_held(&ar->htt.tx_lock); in ath10k_mac_vif_tx_lock()
3296 ieee80211_stop_queue(ar->hw, arvif->vdev_id); in ath10k_mac_vif_tx_lock()
3301 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_tx_unlock() local
3303 lockdep_assert_held(&ar->htt.tx_lock); in ath10k_mac_vif_tx_unlock()
3308 if (ar->tx_paused) in ath10k_mac_vif_tx_unlock()
3314 ieee80211_wake_queue(ar->hw, arvif->vdev_id); in ath10k_mac_vif_tx_unlock()
3321 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_handle_tx_pause() local
3323 lockdep_assert_held(&ar->htt.tx_lock); in ath10k_mac_vif_handle_tx_pause()
3333 ath10k_dbg(ar, ATH10K_DBG_BOOT, in ath10k_mac_vif_handle_tx_pause()
3358 void ath10k_mac_handle_tx_pause_vdev(struct ath10k *ar, u32 vdev_id, in ath10k_mac_handle_tx_pause_vdev() argument
3368 spin_lock_bh(&ar->htt.tx_lock); in ath10k_mac_handle_tx_pause_vdev()
3369 ieee80211_iterate_active_interfaces_atomic(ar->hw, in ath10k_mac_handle_tx_pause_vdev()
3373 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_handle_tx_pause_vdev()
3377 ath10k_mac_tx_h_get_txmode(struct ath10k *ar, in ath10k_mac_tx_h_get_txmode() argument
3407 if (ar->htt.target_version_major < 3 && in ath10k_mac_tx_h_get_txmode()
3410 ar->running_fw->fw_file.fw_features)) in ath10k_mac_tx_h_get_txmode()
3424 if (test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) in ath10k_mac_tx_h_get_txmode()
3505 static void ath10k_tx_h_add_p2p_noa_ie(struct ath10k *ar, in ath10k_tx_h_add_p2p_noa_ie() argument
3517 spin_lock_bh(&ar->data_lock); in ath10k_tx_h_add_p2p_noa_ie()
3523 spin_unlock_bh(&ar->data_lock); in ath10k_tx_h_add_p2p_noa_ie()
3527 static void ath10k_mac_tx_h_fill_cb(struct ath10k *ar, in ath10k_mac_tx_h_fill_cb() argument
3549 bool ath10k_mac_tx_frm_has_freq(struct ath10k *ar) in ath10k_mac_tx_frm_has_freq() argument
3557 return (ar->htt.target_version_major >= 3 && in ath10k_mac_tx_frm_has_freq()
3558 ar->htt.target_version_minor >= 4 && in ath10k_mac_tx_frm_has_freq()
3559 ar->running_fw->fw_file.htt_op_version == ATH10K_FW_HTT_OP_VERSION_TLV); in ath10k_mac_tx_frm_has_freq()
3562 static int ath10k_mac_tx_wmi_mgmt(struct ath10k *ar, struct sk_buff *skb) in ath10k_mac_tx_wmi_mgmt() argument
3564 struct sk_buff_head *q = &ar->wmi_mgmt_tx_queue; in ath10k_mac_tx_wmi_mgmt()
3567 spin_lock_bh(&ar->data_lock); in ath10k_mac_tx_wmi_mgmt()
3570 ath10k_warn(ar, "wmi mgmt tx queue is full\n"); in ath10k_mac_tx_wmi_mgmt()
3576 ieee80211_queue_work(ar->hw, &ar->wmi_mgmt_tx_work); in ath10k_mac_tx_wmi_mgmt()
3579 spin_unlock_bh(&ar->data_lock); in ath10k_mac_tx_wmi_mgmt()
3585 ath10k_mac_tx_h_get_txpath(struct ath10k *ar, in ath10k_mac_tx_h_get_txpath() argument
3596 ar->running_fw->fw_file.fw_features) || in ath10k_mac_tx_h_get_txpath()
3598 ar->wmi.svc_map)) in ath10k_mac_tx_h_get_txpath()
3600 else if (ar->htt.target_version_major >= 3) in ath10k_mac_tx_h_get_txpath()
3609 static int ath10k_mac_tx_submit(struct ath10k *ar, in ath10k_mac_tx_submit() argument
3614 struct ath10k_htt *htt = &ar->htt; in ath10k_mac_tx_submit()
3625 ret = ath10k_mac_tx_wmi_mgmt(ar, skb); in ath10k_mac_tx_submit()
3634 ath10k_warn(ar, "failed to transmit packet, dropping: %d\n", in ath10k_mac_tx_submit()
3636 ieee80211_free_txskb(ar->hw, skb); in ath10k_mac_tx_submit()
3645 static int ath10k_mac_tx(struct ath10k *ar, in ath10k_mac_tx() argument
3651 struct ieee80211_hw *hw = ar->hw; in ath10k_mac_tx()
3657 ath10k_dbg(ar, ATH10K_DBG_MAC, "IEEE80211_TX_CTL_NO_CCK_RATE\n"); in ath10k_mac_tx()
3663 ath10k_tx_h_add_p2p_noa_ie(ar, vif, skb); in ath10k_mac_tx()
3670 if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) { in ath10k_mac_tx()
3678 if (!ath10k_mac_tx_frm_has_freq(ar)) { in ath10k_mac_tx()
3679 ath10k_dbg(ar, ATH10K_DBG_MAC, "queued offchannel skb %pK\n", in ath10k_mac_tx()
3682 skb_queue_tail(&ar->offchan_tx_queue, skb); in ath10k_mac_tx()
3683 ieee80211_queue_work(hw, &ar->offchan_tx_work); in ath10k_mac_tx()
3688 ret = ath10k_mac_tx_submit(ar, txmode, txpath, skb); in ath10k_mac_tx()
3690 ath10k_warn(ar, "failed to submit frame: %d\n", ret); in ath10k_mac_tx()
3697 void ath10k_offchan_tx_purge(struct ath10k *ar) in ath10k_offchan_tx_purge() argument
3702 skb = skb_dequeue(&ar->offchan_tx_queue); in ath10k_offchan_tx_purge()
3706 ieee80211_free_txskb(ar->hw, skb); in ath10k_offchan_tx_purge()
3712 struct ath10k *ar = container_of(work, struct ath10k, offchan_tx_work); in ath10k_offchan_tx_work() local
3736 skb = skb_dequeue(&ar->offchan_tx_queue); in ath10k_offchan_tx_work()
3740 mutex_lock(&ar->conf_mutex); in ath10k_offchan_tx_work()
3742 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac offchannel skb %pK\n", in ath10k_offchan_tx_work()
3748 spin_lock_bh(&ar->data_lock); in ath10k_offchan_tx_work()
3749 vdev_id = ar->scan.vdev_id; in ath10k_offchan_tx_work()
3750 peer = ath10k_peer_find(ar, vdev_id, peer_addr); in ath10k_offchan_tx_work()
3751 spin_unlock_bh(&ar->data_lock); in ath10k_offchan_tx_work()
3755 ath10k_dbg(ar, ATH10K_DBG_MAC, "peer %pM on vdev %d already present\n", in ath10k_offchan_tx_work()
3759 ret = ath10k_peer_create(ar, NULL, NULL, vdev_id, in ath10k_offchan_tx_work()
3763 ath10k_warn(ar, "failed to create peer %pM on vdev %d: %d\n", in ath10k_offchan_tx_work()
3768 spin_lock_bh(&ar->data_lock); in ath10k_offchan_tx_work()
3769 reinit_completion(&ar->offchan_tx_completed); in ath10k_offchan_tx_work()
3770 ar->offchan_tx_skb = skb; in ath10k_offchan_tx_work()
3771 spin_unlock_bh(&ar->data_lock); in ath10k_offchan_tx_work()
3777 arvif = ath10k_get_arvif(ar, vdev_id); in ath10k_offchan_tx_work()
3786 txmode = ath10k_mac_tx_h_get_txmode(ar, vif, sta, skb); in ath10k_offchan_tx_work()
3787 txpath = ath10k_mac_tx_h_get_txpath(ar, skb, txmode); in ath10k_offchan_tx_work()
3789 ret = ath10k_mac_tx(ar, vif, txmode, txpath, skb); in ath10k_offchan_tx_work()
3791 ath10k_warn(ar, "failed to transmit offchannel frame: %d\n", in ath10k_offchan_tx_work()
3797 wait_for_completion_timeout(&ar->offchan_tx_completed, 3 * HZ); in ath10k_offchan_tx_work()
3799 ath10k_warn(ar, "timed out waiting for offchannel skb %pK\n", in ath10k_offchan_tx_work()
3803 ret = ath10k_peer_delete(ar, vdev_id, peer_addr); in ath10k_offchan_tx_work()
3805 ath10k_warn(ar, "failed to delete peer %pM on vdev %d: %d\n", in ath10k_offchan_tx_work()
3809 mutex_unlock(&ar->conf_mutex); in ath10k_offchan_tx_work()
3813 void ath10k_mgmt_over_wmi_tx_purge(struct ath10k *ar) in ath10k_mgmt_over_wmi_tx_purge() argument
3818 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue); in ath10k_mgmt_over_wmi_tx_purge()
3822 ieee80211_free_txskb(ar->hw, skb); in ath10k_mgmt_over_wmi_tx_purge()
3828 struct ath10k *ar = container_of(work, struct ath10k, wmi_mgmt_tx_work); in ath10k_mgmt_over_wmi_tx_work() local
3834 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue); in ath10k_mgmt_over_wmi_tx_work()
3839 ar->running_fw->fw_file.fw_features)) { in ath10k_mgmt_over_wmi_tx_work()
3840 paddr = dma_map_single(ar->dev, skb->data, in ath10k_mgmt_over_wmi_tx_work()
3844 ret = ath10k_wmi_mgmt_tx_send(ar, skb, paddr); in ath10k_mgmt_over_wmi_tx_work()
3846 ath10k_warn(ar, "failed to transmit management frame by ref via WMI: %d\n", in ath10k_mgmt_over_wmi_tx_work()
3848 dma_unmap_single(ar->dev, paddr, skb->len, in ath10k_mgmt_over_wmi_tx_work()
3850 ieee80211_free_txskb(ar->hw, skb); in ath10k_mgmt_over_wmi_tx_work()
3853 ret = ath10k_wmi_mgmt_tx(ar, skb); in ath10k_mgmt_over_wmi_tx_work()
3855 ath10k_warn(ar, "failed to transmit management frame via WMI: %d\n", in ath10k_mgmt_over_wmi_tx_work()
3857 ieee80211_free_txskb(ar->hw, skb); in ath10k_mgmt_over_wmi_tx_work()
3874 static void ath10k_mac_txq_unref(struct ath10k *ar, struct ieee80211_txq *txq) in ath10k_mac_txq_unref() argument
3885 spin_lock_bh(&ar->txqs_lock); in ath10k_mac_txq_unref()
3888 spin_unlock_bh(&ar->txqs_lock); in ath10k_mac_txq_unref()
3890 spin_lock_bh(&ar->htt.tx_lock); in ath10k_mac_txq_unref()
3891 idr_for_each_entry(&ar->htt.pending_tx, msdu, msdu_id) { in ath10k_mac_txq_unref()
3896 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_txq_unref()
3899 struct ieee80211_txq *ath10k_mac_txq_lookup(struct ath10k *ar, in ath10k_mac_txq_lookup() argument
3905 lockdep_assert_held(&ar->data_lock); in ath10k_mac_txq_lookup()
3907 peer = ar->peer_map[peer_id]; in ath10k_mac_txq_lookup()
3925 struct ath10k *ar = hw->priv; in ath10k_mac_tx_can_push() local
3930 if (ar->htt.tx_q_state.mode == HTT_TX_MODE_SWITCH_PUSH) in ath10k_mac_tx_can_push()
3933 if (ar->htt.num_pending_tx < ar->htt.tx_q_state.num_push_allowed) in ath10k_mac_tx_can_push()
3945 struct ath10k *ar = hw->priv; in ath10k_mac_tx_push_txq() local
3946 struct ath10k_htt *htt = &ar->htt; in ath10k_mac_tx_push_txq()
3958 spin_lock_bh(&ar->htt.tx_lock); in ath10k_mac_tx_push_txq()
3960 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_tx_push_txq()
3967 spin_lock_bh(&ar->htt.tx_lock); in ath10k_mac_tx_push_txq()
3969 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_tx_push_txq()
3974 ath10k_mac_tx_h_fill_cb(ar, vif, txq, skb); in ath10k_mac_tx_push_txq()
3977 txmode = ath10k_mac_tx_h_get_txmode(ar, vif, sta, skb); in ath10k_mac_tx_push_txq()
3978 txpath = ath10k_mac_tx_h_get_txpath(ar, skb, txmode); in ath10k_mac_tx_push_txq()
3985 spin_lock_bh(&ar->htt.tx_lock); in ath10k_mac_tx_push_txq()
3990 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_tx_push_txq()
3993 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_tx_push_txq()
3996 ret = ath10k_mac_tx(ar, vif, txmode, txpath, skb); in ath10k_mac_tx_push_txq()
3998 ath10k_warn(ar, "failed to push frame: %d\n", ret); in ath10k_mac_tx_push_txq()
4000 spin_lock_bh(&ar->htt.tx_lock); in ath10k_mac_tx_push_txq()
4004 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_tx_push_txq()
4009 spin_lock_bh(&ar->htt.tx_lock); in ath10k_mac_tx_push_txq()
4011 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_tx_push_txq()
4016 void ath10k_mac_tx_push_pending(struct ath10k *ar) in ath10k_mac_tx_push_pending() argument
4018 struct ieee80211_hw *hw = ar->hw; in ath10k_mac_tx_push_pending()
4025 if (ar->htt.num_pending_tx >= (ar->htt.max_num_pending_tx / 2)) in ath10k_mac_tx_push_pending()
4028 spin_lock_bh(&ar->txqs_lock); in ath10k_mac_tx_push_pending()
4031 last = list_last_entry(&ar->txqs, struct ath10k_txq, list); in ath10k_mac_tx_push_pending()
4032 while (!list_empty(&ar->txqs)) { in ath10k_mac_tx_push_pending()
4033 artxq = list_first_entry(&ar->txqs, struct ath10k_txq, list); in ath10k_mac_tx_push_pending()
4048 list_add_tail(&artxq->list, &ar->txqs); in ath10k_mac_tx_push_pending()
4057 spin_unlock_bh(&ar->txqs_lock); in ath10k_mac_tx_push_pending()
4065 void __ath10k_scan_finish(struct ath10k *ar) in __ath10k_scan_finish() argument
4067 lockdep_assert_held(&ar->data_lock); in __ath10k_scan_finish()
4069 switch (ar->scan.state) { in __ath10k_scan_finish()
4074 if (!ar->scan.is_roc) { in __ath10k_scan_finish()
4076 .aborted = (ar->scan.state == in __ath10k_scan_finish()
4080 ieee80211_scan_completed(ar->hw, &info); in __ath10k_scan_finish()
4081 } else if (ar->scan.roc_notify) { in __ath10k_scan_finish()
4082 ieee80211_remain_on_channel_expired(ar->hw); in __ath10k_scan_finish()
4086 ar->scan.state = ATH10K_SCAN_IDLE; in __ath10k_scan_finish()
4087 ar->scan_channel = NULL; in __ath10k_scan_finish()
4088 ar->scan.roc_freq = 0; in __ath10k_scan_finish()
4089 ath10k_offchan_tx_purge(ar); in __ath10k_scan_finish()
4090 cancel_delayed_work(&ar->scan.timeout); in __ath10k_scan_finish()
4091 complete(&ar->scan.completed); in __ath10k_scan_finish()
4096 void ath10k_scan_finish(struct ath10k *ar) in ath10k_scan_finish() argument
4098 spin_lock_bh(&ar->data_lock); in ath10k_scan_finish()
4099 __ath10k_scan_finish(ar); in ath10k_scan_finish()
4100 spin_unlock_bh(&ar->data_lock); in ath10k_scan_finish()
4103 static int ath10k_scan_stop(struct ath10k *ar) in ath10k_scan_stop() argument
4112 lockdep_assert_held(&ar->conf_mutex); in ath10k_scan_stop()
4114 ret = ath10k_wmi_stop_scan(ar, &arg); in ath10k_scan_stop()
4116 ath10k_warn(ar, "failed to stop wmi scan: %d\n", ret); in ath10k_scan_stop()
4120 ret = wait_for_completion_timeout(&ar->scan.completed, 3 * HZ); in ath10k_scan_stop()
4122 ath10k_warn(ar, "failed to receive scan abortion completion: timed out\n"); in ath10k_scan_stop()
4136 spin_lock_bh(&ar->data_lock); in ath10k_scan_stop()
4137 if (ar->scan.state != ATH10K_SCAN_IDLE) in ath10k_scan_stop()
4138 __ath10k_scan_finish(ar); in ath10k_scan_stop()
4139 spin_unlock_bh(&ar->data_lock); in ath10k_scan_stop()
4144 static void ath10k_scan_abort(struct ath10k *ar) in ath10k_scan_abort() argument
4148 lockdep_assert_held(&ar->conf_mutex); in ath10k_scan_abort()
4150 spin_lock_bh(&ar->data_lock); in ath10k_scan_abort()
4152 switch (ar->scan.state) { in ath10k_scan_abort()
4160 ath10k_warn(ar, "refusing scan abortion due to invalid scan state: %s (%d)\n", in ath10k_scan_abort()
4161 ath10k_scan_state_str(ar->scan.state), in ath10k_scan_abort()
4162 ar->scan.state); in ath10k_scan_abort()
4165 ar->scan.state = ATH10K_SCAN_ABORTING; in ath10k_scan_abort()
4166 spin_unlock_bh(&ar->data_lock); in ath10k_scan_abort()
4168 ret = ath10k_scan_stop(ar); in ath10k_scan_abort()
4170 ath10k_warn(ar, "failed to abort scan: %d\n", ret); in ath10k_scan_abort()
4172 spin_lock_bh(&ar->data_lock); in ath10k_scan_abort()
4176 spin_unlock_bh(&ar->data_lock); in ath10k_scan_abort()
4181 struct ath10k *ar = container_of(work, struct ath10k, in ath10k_scan_timeout_work() local
4184 mutex_lock(&ar->conf_mutex); in ath10k_scan_timeout_work()
4185 ath10k_scan_abort(ar); in ath10k_scan_timeout_work()
4186 mutex_unlock(&ar->conf_mutex); in ath10k_scan_timeout_work()
4189 static int ath10k_start_scan(struct ath10k *ar, in ath10k_start_scan() argument
4194 lockdep_assert_held(&ar->conf_mutex); in ath10k_start_scan()
4196 ret = ath10k_wmi_start_scan(ar, arg); in ath10k_start_scan()
4200 ret = wait_for_completion_timeout(&ar->scan.started, 1 * HZ); in ath10k_start_scan()
4202 ret = ath10k_scan_stop(ar); in ath10k_start_scan()
4204 ath10k_warn(ar, "failed to stop scan: %d\n", ret); in ath10k_start_scan()
4213 spin_lock_bh(&ar->data_lock); in ath10k_start_scan()
4214 if (ar->scan.state == ATH10K_SCAN_IDLE) { in ath10k_start_scan()
4215 spin_unlock_bh(&ar->data_lock); in ath10k_start_scan()
4218 spin_unlock_bh(&ar->data_lock); in ath10k_start_scan()
4231 struct ath10k *ar = hw->priv; in ath10k_mac_op_tx() local
4232 struct ath10k_htt *htt = &ar->htt; in ath10k_mac_op_tx()
4245 ath10k_mac_tx_h_fill_cb(ar, vif, txq, skb); in ath10k_mac_op_tx()
4247 txmode = ath10k_mac_tx_h_get_txmode(ar, vif, sta, skb); in ath10k_mac_op_tx()
4248 txpath = ath10k_mac_tx_h_get_txpath(ar, skb, txmode); in ath10k_mac_op_tx()
4254 spin_lock_bh(&ar->htt.tx_lock); in ath10k_mac_op_tx()
4259 ath10k_warn(ar, "failed to increase tx pending count: %d, dropping\n", in ath10k_mac_op_tx()
4261 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_op_tx()
4262 ieee80211_free_txskb(ar->hw, skb); in ath10k_mac_op_tx()
4268 ath10k_dbg(ar, ATH10K_DBG_MAC, "failed to increase tx mgmt pending count: %d, dropping\n", in ath10k_mac_op_tx()
4271 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_op_tx()
4272 ieee80211_free_txskb(ar->hw, skb); in ath10k_mac_op_tx()
4275 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_op_tx()
4278 ret = ath10k_mac_tx(ar, vif, txmode, txpath, skb); in ath10k_mac_op_tx()
4280 ath10k_warn(ar, "failed to transmit frame: %d\n", ret); in ath10k_mac_op_tx()
4282 spin_lock_bh(&ar->htt.tx_lock); in ath10k_mac_op_tx()
4286 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_op_tx()
4295 struct ath10k *ar = hw->priv; in ath10k_mac_op_wake_tx_queue() local
4302 spin_lock_bh(&ar->txqs_lock); in ath10k_mac_op_wake_tx_queue()
4304 list_add_tail(&artxq->list, &ar->txqs); in ath10k_mac_op_wake_tx_queue()
4306 f_artxq = list_first_entry(&ar->txqs, struct ath10k_txq, list); in ath10k_mac_op_wake_tx_queue()
4316 list_add_tail(&f_artxq->list, &ar->txqs); in ath10k_mac_op_wake_tx_queue()
4317 spin_unlock_bh(&ar->txqs_lock); in ath10k_mac_op_wake_tx_queue()
4324 void ath10k_drain_tx(struct ath10k *ar) in ath10k_drain_tx() argument
4329 ath10k_offchan_tx_purge(ar); in ath10k_drain_tx()
4330 ath10k_mgmt_over_wmi_tx_purge(ar); in ath10k_drain_tx()
4332 cancel_work_sync(&ar->offchan_tx_work); in ath10k_drain_tx()
4333 cancel_work_sync(&ar->wmi_mgmt_tx_work); in ath10k_drain_tx()
4336 void ath10k_halt(struct ath10k *ar) in ath10k_halt() argument
4340 lockdep_assert_held(&ar->conf_mutex); in ath10k_halt()
4342 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags); in ath10k_halt()
4343 ar->filter_flags = 0; in ath10k_halt()
4344 ar->monitor = false; in ath10k_halt()
4345 ar->monitor_arvif = NULL; in ath10k_halt()
4347 if (ar->monitor_started) in ath10k_halt()
4348 ath10k_monitor_stop(ar); in ath10k_halt()
4350 ar->monitor_started = false; in ath10k_halt()
4351 ar->tx_paused = 0; in ath10k_halt()
4353 ath10k_scan_finish(ar); in ath10k_halt()
4354 ath10k_peer_cleanup_all(ar); in ath10k_halt()
4355 ath10k_stop_radar_confirmation(ar); in ath10k_halt()
4356 ath10k_core_stop(ar); in ath10k_halt()
4357 ath10k_hif_power_down(ar); in ath10k_halt()
4359 spin_lock_bh(&ar->data_lock); in ath10k_halt()
4360 list_for_each_entry(arvif, &ar->arvifs, list) in ath10k_halt()
4362 spin_unlock_bh(&ar->data_lock); in ath10k_halt()
4367 struct ath10k *ar = hw->priv; in ath10k_get_antenna() local
4369 mutex_lock(&ar->conf_mutex); in ath10k_get_antenna()
4371 *tx_ant = ar->cfg_tx_chainmask; in ath10k_get_antenna()
4372 *rx_ant = ar->cfg_rx_chainmask; in ath10k_get_antenna()
4374 mutex_unlock(&ar->conf_mutex); in ath10k_get_antenna()
4379 static void ath10k_check_chain_mask(struct ath10k *ar, u32 cm, const char *dbg) in ath10k_check_chain_mask() argument
4388 …ath10k_warn(ar, "mac %s antenna chainmask may be invalid: 0x%x. Suggested values: 15, 7, 3, 1 or … in ath10k_check_chain_mask()
4392 static int ath10k_mac_get_vht_cap_bf_sts(struct ath10k *ar) in ath10k_mac_get_vht_cap_bf_sts() argument
4394 int nsts = ar->vht_cap_info; in ath10k_mac_get_vht_cap_bf_sts()
4409 static int ath10k_mac_get_vht_cap_bf_sound_dim(struct ath10k *ar) in ath10k_mac_get_vht_cap_bf_sound_dim() argument
4411 int sound_dim = ar->vht_cap_info; in ath10k_mac_get_vht_cap_bf_sound_dim()
4425 static struct ieee80211_sta_vht_cap ath10k_create_vht_cap(struct ath10k *ar) in ath10k_create_vht_cap() argument
4428 struct ath10k_hw_params *hw = &ar->hw_params; in ath10k_create_vht_cap()
4434 vht_cap.cap = ar->vht_cap_info; in ath10k_create_vht_cap()
4436 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE | in ath10k_create_vht_cap()
4438 val = ath10k_mac_get_vht_cap_bf_sts(ar); in ath10k_create_vht_cap()
4445 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE | in ath10k_create_vht_cap()
4447 val = ath10k_mac_get_vht_cap_bf_sound_dim(ar); in ath10k_create_vht_cap()
4457 if ((ar->vht_cap_info & IEEE80211_VHT_CAP_SHORT_GI_160) && in ath10k_create_vht_cap()
4458 (ar->vht_cap_info & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK) == 0) in ath10k_create_vht_cap()
4463 if ((i < ar->num_rf_chains) && (ar->cfg_tx_chainmask & BIT(i))) in ath10k_create_vht_cap()
4469 if (ar->cfg_tx_chainmask <= 1) in ath10k_create_vht_cap()
4489 static struct ieee80211_sta_ht_cap ath10k_get_ht_cap(struct ath10k *ar) in ath10k_get_ht_cap() argument
4494 if (!(ar->ht_cap_info & WMI_HT_CAP_ENABLED)) in ath10k_get_ht_cap()
4505 if (ar->ht_cap_info & WMI_HT_CAP_HT20_SGI) in ath10k_get_ht_cap()
4508 if (ar->ht_cap_info & WMI_HT_CAP_HT40_SGI) in ath10k_get_ht_cap()
4511 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) { in ath10k_get_ht_cap()
4520 if (ar->ht_cap_info & WMI_HT_CAP_TX_STBC && (ar->cfg_tx_chainmask > 1)) in ath10k_get_ht_cap()
4523 if (ar->ht_cap_info & WMI_HT_CAP_RX_STBC) { in ath10k_get_ht_cap()
4526 stbc = ar->ht_cap_info; in ath10k_get_ht_cap()
4535 if (ar->ht_cap_info & WMI_HT_CAP_LDPC) in ath10k_get_ht_cap()
4538 if (ar->ht_cap_info & WMI_HT_CAP_L_SIG_TXOP_PROT) in ath10k_get_ht_cap()
4542 if (ar->vht_cap_info & WMI_VHT_CAP_MAX_MPDU_LEN_MASK) in ath10k_get_ht_cap()
4545 for (i = 0; i < ar->num_rf_chains; i++) { in ath10k_get_ht_cap()
4546 if (ar->cfg_rx_chainmask & BIT(i)) in ath10k_get_ht_cap()
4555 static void ath10k_mac_setup_ht_vht_cap(struct ath10k *ar) in ath10k_mac_setup_ht_vht_cap() argument
4561 ht_cap = ath10k_get_ht_cap(ar); in ath10k_mac_setup_ht_vht_cap()
4562 vht_cap = ath10k_create_vht_cap(ar); in ath10k_mac_setup_ht_vht_cap()
4564 if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) { in ath10k_mac_setup_ht_vht_cap()
4565 band = &ar->mac.sbands[NL80211_BAND_2GHZ]; in ath10k_mac_setup_ht_vht_cap()
4568 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) { in ath10k_mac_setup_ht_vht_cap()
4569 band = &ar->mac.sbands[NL80211_BAND_5GHZ]; in ath10k_mac_setup_ht_vht_cap()
4575 static int __ath10k_set_antenna(struct ath10k *ar, u32 tx_ant, u32 rx_ant) in __ath10k_set_antenna() argument
4579 lockdep_assert_held(&ar->conf_mutex); in __ath10k_set_antenna()
4581 ath10k_check_chain_mask(ar, tx_ant, "tx"); in __ath10k_set_antenna()
4582 ath10k_check_chain_mask(ar, rx_ant, "rx"); in __ath10k_set_antenna()
4584 ar->cfg_tx_chainmask = tx_ant; in __ath10k_set_antenna()
4585 ar->cfg_rx_chainmask = rx_ant; in __ath10k_set_antenna()
4587 if ((ar->state != ATH10K_STATE_ON) && in __ath10k_set_antenna()
4588 (ar->state != ATH10K_STATE_RESTARTED)) in __ath10k_set_antenna()
4591 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->tx_chain_mask, in __ath10k_set_antenna()
4594 ath10k_warn(ar, "failed to set tx-chainmask: %d, req 0x%x\n", in __ath10k_set_antenna()
4599 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->rx_chain_mask, in __ath10k_set_antenna()
4602 ath10k_warn(ar, "failed to set rx-chainmask: %d, req 0x%x\n", in __ath10k_set_antenna()
4608 ath10k_mac_setup_ht_vht_cap(ar); in __ath10k_set_antenna()
4615 struct ath10k *ar = hw->priv; in ath10k_set_antenna() local
4618 mutex_lock(&ar->conf_mutex); in ath10k_set_antenna()
4619 ret = __ath10k_set_antenna(ar, tx_ant, rx_ant); in ath10k_set_antenna()
4620 mutex_unlock(&ar->conf_mutex); in ath10k_set_antenna()
4626 struct ath10k *ar = hw->priv; in ath10k_start() local
4635 ath10k_drain_tx(ar); in ath10k_start()
4637 mutex_lock(&ar->conf_mutex); in ath10k_start()
4639 switch (ar->state) { in ath10k_start()
4641 ar->state = ATH10K_STATE_ON; in ath10k_start()
4644 ar->state = ATH10K_STATE_RESTARTED; in ath10k_start()
4657 ret = ath10k_hif_power_up(ar); in ath10k_start()
4659 ath10k_err(ar, "Could not init hif: %d\n", ret); in ath10k_start()
4663 ret = ath10k_core_start(ar, ATH10K_FIRMWARE_MODE_NORMAL, in ath10k_start()
4664 &ar->normal_mode_fw); in ath10k_start()
4666 ath10k_err(ar, "Could not init core: %d\n", ret); in ath10k_start()
4670 param = ar->wmi.pdev_param->pmf_qos; in ath10k_start()
4671 ret = ath10k_wmi_pdev_set_param(ar, param, 1); in ath10k_start()
4673 ath10k_warn(ar, "failed to enable PMF QOS: %d\n", ret); in ath10k_start()
4677 param = ar->wmi.pdev_param->dynamic_bw; in ath10k_start()
4678 ret = ath10k_wmi_pdev_set_param(ar, param, 1); in ath10k_start()
4680 ath10k_warn(ar, "failed to enable dynamic BW: %d\n", ret); in ath10k_start()
4684 if (test_bit(WMI_SERVICE_ADAPTIVE_OCS, ar->wmi.svc_map)) { in ath10k_start()
4685 ret = ath10k_wmi_adaptive_qcs(ar, true); in ath10k_start()
4687 ath10k_warn(ar, "failed to enable adaptive qcs: %d\n", in ath10k_start()
4693 if (test_bit(WMI_SERVICE_BURST, ar->wmi.svc_map)) { in ath10k_start()
4694 param = ar->wmi.pdev_param->burst_enable; in ath10k_start()
4695 ret = ath10k_wmi_pdev_set_param(ar, param, 0); in ath10k_start()
4697 ath10k_warn(ar, "failed to disable burst: %d\n", ret); in ath10k_start()
4702 param = ar->wmi.pdev_param->idle_ps_config; in ath10k_start()
4703 ret = ath10k_wmi_pdev_set_param(ar, param, 1); in ath10k_start()
4705 ath10k_warn(ar, "failed to enable idle_ps_config: %d\n", ret); in ath10k_start()
4709 __ath10k_set_antenna(ar, ar->cfg_tx_chainmask, ar->cfg_rx_chainmask); in ath10k_start()
4720 param = ar->wmi.pdev_param->arp_ac_override; in ath10k_start()
4721 ret = ath10k_wmi_pdev_set_param(ar, param, 0); in ath10k_start()
4723 ath10k_warn(ar, "failed to set arp ac override parameter: %d\n", in ath10k_start()
4729 ar->running_fw->fw_file.fw_features)) { in ath10k_start()
4730 ret = ath10k_wmi_pdev_enable_adaptive_cca(ar, 1, in ath10k_start()
4734 ath10k_warn(ar, "failed to enable adaptive cca: %d\n", in ath10k_start()
4740 param = ar->wmi.pdev_param->ani_enable; in ath10k_start()
4741 ret = ath10k_wmi_pdev_set_param(ar, param, 1); in ath10k_start()
4743 ath10k_warn(ar, "failed to enable ani by default: %d\n", in ath10k_start()
4748 ar->ani_enabled = true; in ath10k_start()
4750 if (ath10k_peer_stats_enabled(ar)) { in ath10k_start()
4751 param = ar->wmi.pdev_param->peer_stats_update_period; in ath10k_start()
4752 ret = ath10k_wmi_pdev_set_param(ar, param, in ath10k_start()
4755 ath10k_warn(ar, in ath10k_start()
4762 param = ar->wmi.pdev_param->enable_btcoex; in ath10k_start()
4763 if (test_bit(WMI_SERVICE_COEX_GPIO, ar->wmi.svc_map) && in ath10k_start()
4765 ar->running_fw->fw_file.fw_features)) { in ath10k_start()
4766 ret = ath10k_wmi_pdev_set_param(ar, param, 0); in ath10k_start()
4768 ath10k_warn(ar, in ath10k_start()
4772 clear_bit(ATH10K_FLAG_BTCOEX, &ar->dev_flags); in ath10k_start()
4775 ar->num_started_vdevs = 0; in ath10k_start()
4776 ath10k_regd_update(ar); in ath10k_start()
4778 ath10k_spectral_start(ar); in ath10k_start()
4779 ath10k_thermal_set_throttling(ar); in ath10k_start()
4781 ar->radar_conf_state = ATH10K_RADAR_CONFIRMATION_IDLE; in ath10k_start()
4783 mutex_unlock(&ar->conf_mutex); in ath10k_start()
4787 ath10k_core_stop(ar); in ath10k_start()
4790 ath10k_hif_power_down(ar); in ath10k_start()
4793 ar->state = ATH10K_STATE_OFF; in ath10k_start()
4796 mutex_unlock(&ar->conf_mutex); in ath10k_start()
4802 struct ath10k *ar = hw->priv; in ath10k_stop() local
4804 ath10k_drain_tx(ar); in ath10k_stop()
4806 mutex_lock(&ar->conf_mutex); in ath10k_stop()
4807 if (ar->state != ATH10K_STATE_OFF) { in ath10k_stop()
4808 ath10k_halt(ar); in ath10k_stop()
4809 ar->state = ATH10K_STATE_OFF; in ath10k_stop()
4811 mutex_unlock(&ar->conf_mutex); in ath10k_stop()
4813 cancel_work_sync(&ar->set_coverage_class_work); in ath10k_stop()
4814 cancel_delayed_work_sync(&ar->scan.timeout); in ath10k_stop()
4815 cancel_work_sync(&ar->restart_work); in ath10k_stop()
4818 static int ath10k_config_ps(struct ath10k *ar) in ath10k_config_ps() argument
4823 lockdep_assert_held(&ar->conf_mutex); in ath10k_config_ps()
4825 list_for_each_entry(arvif, &ar->arvifs, list) { in ath10k_config_ps()
4828 ath10k_warn(ar, "failed to setup powersave: %d\n", ret); in ath10k_config_ps()
4836 static int ath10k_mac_txpower_setup(struct ath10k *ar, int txpower) in ath10k_mac_txpower_setup() argument
4841 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_txpower_setup()
4843 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac txpower %d\n", txpower); in ath10k_mac_txpower_setup()
4845 param = ar->wmi.pdev_param->txpower_limit2g; in ath10k_mac_txpower_setup()
4846 ret = ath10k_wmi_pdev_set_param(ar, param, txpower * 2); in ath10k_mac_txpower_setup()
4848 ath10k_warn(ar, "failed to set 2g txpower %d: %d\n", in ath10k_mac_txpower_setup()
4853 param = ar->wmi.pdev_param->txpower_limit5g; in ath10k_mac_txpower_setup()
4854 ret = ath10k_wmi_pdev_set_param(ar, param, txpower * 2); in ath10k_mac_txpower_setup()
4856 ath10k_warn(ar, "failed to set 5g txpower %d: %d\n", in ath10k_mac_txpower_setup()
4864 static int ath10k_mac_txpower_recalc(struct ath10k *ar) in ath10k_mac_txpower_recalc() argument
4869 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_txpower_recalc()
4871 list_for_each_entry(arvif, &ar->arvifs, list) { in ath10k_mac_txpower_recalc()
4884 ret = ath10k_mac_txpower_setup(ar, txpower); in ath10k_mac_txpower_recalc()
4886 ath10k_warn(ar, "failed to setup tx power %d: %d\n", in ath10k_mac_txpower_recalc()
4896 struct ath10k *ar = hw->priv; in ath10k_config() local
4900 mutex_lock(&ar->conf_mutex); in ath10k_config()
4903 ath10k_config_ps(ar); in ath10k_config()
4906 ar->monitor = conf->flags & IEEE80211_CONF_MONITOR; in ath10k_config()
4907 ret = ath10k_monitor_recalc(ar); in ath10k_config()
4909 ath10k_warn(ar, "failed to recalc monitor: %d\n", ret); in ath10k_config()
4912 mutex_unlock(&ar->conf_mutex); in ath10k_config()
4930 struct ath10k *ar = arvif->ar; in ath10k_mac_set_txbf_conf() local
4934 if (ath10k_wmi_get_txbf_conf_scheme(ar) != WMI_TXBF_CONF_BEFORE_ASSOC) in ath10k_mac_set_txbf_conf()
4937 nsts = ath10k_mac_get_vht_cap_bf_sts(ar); in ath10k_mac_set_txbf_conf()
4938 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE | in ath10k_mac_set_txbf_conf()
4942 sound_dim = ath10k_mac_get_vht_cap_bf_sound_dim(ar); in ath10k_mac_set_txbf_conf()
4943 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE | in ath10k_mac_set_txbf_conf()
4950 if (ar->vht_cap_info & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE) in ath10k_mac_set_txbf_conf()
4953 if (ar->vht_cap_info & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE) in ath10k_mac_set_txbf_conf()
4957 if (ar->vht_cap_info & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE) in ath10k_mac_set_txbf_conf()
4960 if (ar->vht_cap_info & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE) in ath10k_mac_set_txbf_conf()
4964 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, in ath10k_mac_set_txbf_conf()
4965 ar->wmi.vdev_param->txbf, value); in ath10k_mac_set_txbf_conf()
4978 struct ath10k *ar = hw->priv; in ath10k_add_interface() local
4990 mutex_lock(&ar->conf_mutex); in ath10k_add_interface()
4995 arvif->ar = ar; in ath10k_add_interface()
5011 if (ar->num_peers >= ar->max_num_peers) { in ath10k_add_interface()
5012 ath10k_warn(ar, "refusing vdev creation due to insufficient peer entry resources in firmware\n"); in ath10k_add_interface()
5017 if (ar->free_vdev_map == 0) { in ath10k_add_interface()
5018 ath10k_warn(ar, "Free vdev map is empty, no more interfaces allowed.\n"); in ath10k_add_interface()
5022 bit = __ffs64(ar->free_vdev_map); in ath10k_add_interface()
5024 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac create vdev %i map %llx\n", in ath10k_add_interface()
5025 bit, ar->free_vdev_map); in ath10k_add_interface()
5029 ath10k_wmi_get_vdev_subtype(ar, WMI_VDEV_SUBTYPE_NONE); in ath10k_add_interface()
5035 (ar, WMI_VDEV_SUBTYPE_P2P_DEVICE); in ath10k_add_interface()
5042 (ar, WMI_VDEV_SUBTYPE_P2P_CLIENT); in ath10k_add_interface()
5048 if (test_bit(WMI_SERVICE_MESH_11S, ar->wmi.svc_map)) { in ath10k_add_interface()
5050 (ar, WMI_VDEV_SUBTYPE_MESH_11S); in ath10k_add_interface()
5051 } else if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) { in ath10k_add_interface()
5053 ath10k_warn(ar, "must load driver with rawmode=1 to add mesh interfaces\n"); in ath10k_add_interface()
5063 (ar, WMI_VDEV_SUBTYPE_P2P_GO); in ath10k_add_interface()
5101 arvif->beacon_buf = dma_zalloc_coherent(ar->dev, in ath10k_add_interface()
5107 ath10k_warn(ar, "failed to allocate beacon buffer: %d\n", in ath10k_add_interface()
5112 if (test_bit(ATH10K_FLAG_HW_CRYPTO_DISABLED, &ar->dev_flags)) in ath10k_add_interface()
5116 !test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) { in ath10k_add_interface()
5117 ath10k_warn(ar, "cryptmode module param needed for sw crypto\n"); in ath10k_add_interface()
5121 …ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev create %d (add interface) type %d subtype %d bcnmode %s\n… in ath10k_add_interface()
5125 ret = ath10k_wmi_vdev_create(ar, arvif->vdev_id, arvif->vdev_type, in ath10k_add_interface()
5128 ath10k_warn(ar, "failed to create WMI vdev %i: %d\n", in ath10k_add_interface()
5133 ar->free_vdev_map &= ~(1LL << arvif->vdev_id); in ath10k_add_interface()
5134 spin_lock_bh(&ar->data_lock); in ath10k_add_interface()
5135 list_add(&arvif->list, &ar->arvifs); in ath10k_add_interface()
5136 spin_unlock_bh(&ar->data_lock); in ath10k_add_interface()
5143 ath10k_warn(ar, "failed to disable keepalive on vdev %i: %d\n", in ath10k_add_interface()
5150 vdev_param = ar->wmi.vdev_param->tx_encap_type; in ath10k_add_interface()
5151 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_add_interface()
5155 ath10k_warn(ar, "failed to set vdev %i TX encapsulation: %d\n", in ath10k_add_interface()
5163 if (ar->cfg_tx_chainmask && (vif->type != NL80211_IFTYPE_MONITOR)) { in ath10k_add_interface()
5164 u16 nss = get_nss_from_chainmask(ar->cfg_tx_chainmask); in ath10k_add_interface()
5166 vdev_param = ar->wmi.vdev_param->nss; in ath10k_add_interface()
5167 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_add_interface()
5170 ath10k_warn(ar, "failed to set vdev %i chainmask 0x%x, nss %i: %d\n", in ath10k_add_interface()
5171 arvif->vdev_id, ar->cfg_tx_chainmask, nss, in ath10k_add_interface()
5179 ret = ath10k_peer_create(ar, vif, NULL, arvif->vdev_id, in ath10k_add_interface()
5182 ath10k_warn(ar, "failed to create vdev %i peer for AP/IBSS: %d\n", in ath10k_add_interface()
5187 spin_lock_bh(&ar->data_lock); in ath10k_add_interface()
5189 peer = ath10k_peer_find(ar, arvif->vdev_id, vif->addr); in ath10k_add_interface()
5191 ath10k_warn(ar, "failed to lookup peer %pM on vdev %i\n", in ath10k_add_interface()
5193 spin_unlock_bh(&ar->data_lock); in ath10k_add_interface()
5201 spin_unlock_bh(&ar->data_lock); in ath10k_add_interface()
5209 ath10k_warn(ar, "failed to set vdev %i kickout parameters: %d\n", in ath10k_add_interface()
5218 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath10k_add_interface()
5221 ath10k_warn(ar, "failed to set vdev %i RX wake policy: %d\n", in ath10k_add_interface()
5228 ath10k_warn(ar, "failed to recalc ps wake threshold on vdev %i: %d\n", in ath10k_add_interface()
5235 ath10k_warn(ar, "failed to recalc ps poll count on vdev %i: %d\n", in ath10k_add_interface()
5243 ath10k_warn(ar, "failed to set txbf for vdev %d: %d\n", in ath10k_add_interface()
5248 ret = ath10k_mac_set_rts(arvif, ar->hw->wiphy->rts_threshold); in ath10k_add_interface()
5250 ath10k_warn(ar, "failed to set rts threshold for vdev %d: %d\n", in ath10k_add_interface()
5256 ret = ath10k_mac_txpower_recalc(ar); in ath10k_add_interface()
5258 ath10k_warn(ar, "failed to recalc tx power: %d\n", ret); in ath10k_add_interface()
5263 ar->monitor_arvif = arvif; in ath10k_add_interface()
5264 ret = ath10k_monitor_recalc(ar); in ath10k_add_interface()
5266 ath10k_warn(ar, "failed to recalc monitor: %d\n", ret); in ath10k_add_interface()
5271 spin_lock_bh(&ar->htt.tx_lock); in ath10k_add_interface()
5272 if (!ar->tx_paused) in ath10k_add_interface()
5273 ieee80211_wake_queue(ar->hw, arvif->vdev_id); in ath10k_add_interface()
5274 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_add_interface()
5276 mutex_unlock(&ar->conf_mutex); in ath10k_add_interface()
5282 ath10k_wmi_peer_delete(ar, arvif->vdev_id, vif->addr); in ath10k_add_interface()
5285 ath10k_wmi_vdev_delete(ar, arvif->vdev_id); in ath10k_add_interface()
5286 ar->free_vdev_map |= 1LL << arvif->vdev_id; in ath10k_add_interface()
5287 spin_lock_bh(&ar->data_lock); in ath10k_add_interface()
5289 spin_unlock_bh(&ar->data_lock); in ath10k_add_interface()
5293 dma_free_coherent(ar->dev, IEEE80211_MAX_FRAME_LEN, in ath10k_add_interface()
5298 mutex_unlock(&ar->conf_mutex); in ath10k_add_interface()
5314 struct ath10k *ar = hw->priv; in ath10k_remove_interface() local
5323 mutex_lock(&ar->conf_mutex); in ath10k_remove_interface()
5325 spin_lock_bh(&ar->data_lock); in ath10k_remove_interface()
5327 spin_unlock_bh(&ar->data_lock); in ath10k_remove_interface()
5331 ath10k_warn(ar, "failed to stop spectral for vdev %i: %d\n", in ath10k_remove_interface()
5334 ar->free_vdev_map |= 1LL << arvif->vdev_id; in ath10k_remove_interface()
5335 spin_lock_bh(&ar->data_lock); in ath10k_remove_interface()
5337 spin_unlock_bh(&ar->data_lock); in ath10k_remove_interface()
5341 ret = ath10k_wmi_peer_delete(arvif->ar, arvif->vdev_id, in ath10k_remove_interface()
5344 ath10k_warn(ar, "failed to submit AP/IBSS self-peer removal on vdev %i: %d\n", in ath10k_remove_interface()
5350 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i delete (remove interface)\n", in ath10k_remove_interface()
5353 ret = ath10k_wmi_vdev_delete(ar, arvif->vdev_id); in ath10k_remove_interface()
5355 ath10k_warn(ar, "failed to delete WMI vdev %i: %d\n", in ath10k_remove_interface()
5363 ret = ath10k_wait_for_peer_deleted(ar, arvif->vdev_id, in ath10k_remove_interface()
5366 ath10k_warn(ar, "failed to remove AP self-peer on vdev %i: %d\n", in ath10k_remove_interface()
5369 spin_lock_bh(&ar->data_lock); in ath10k_remove_interface()
5370 ar->num_peers--; in ath10k_remove_interface()
5371 spin_unlock_bh(&ar->data_lock); in ath10k_remove_interface()
5374 spin_lock_bh(&ar->data_lock); in ath10k_remove_interface()
5375 for (i = 0; i < ARRAY_SIZE(ar->peer_map); i++) { in ath10k_remove_interface()
5376 peer = ar->peer_map[i]; in ath10k_remove_interface()
5381 ath10k_warn(ar, "found vif peer %pM entry on vdev %i after it was supposedly removed\n", in ath10k_remove_interface()
5386 spin_unlock_bh(&ar->data_lock); in ath10k_remove_interface()
5388 ath10k_peer_cleanup(ar, arvif->vdev_id); in ath10k_remove_interface()
5389 ath10k_mac_txq_unref(ar, vif->txq); in ath10k_remove_interface()
5392 ar->monitor_arvif = NULL; in ath10k_remove_interface()
5393 ret = ath10k_monitor_recalc(ar); in ath10k_remove_interface()
5395 ath10k_warn(ar, "failed to recalc monitor: %d\n", ret); in ath10k_remove_interface()
5398 ret = ath10k_mac_txpower_recalc(ar); in ath10k_remove_interface()
5400 ath10k_warn(ar, "failed to recalc tx power: %d\n", ret); in ath10k_remove_interface()
5402 spin_lock_bh(&ar->htt.tx_lock); in ath10k_remove_interface()
5404 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_remove_interface()
5406 ath10k_mac_txq_unref(ar, vif->txq); in ath10k_remove_interface()
5408 mutex_unlock(&ar->conf_mutex); in ath10k_remove_interface()
5428 struct ath10k *ar = hw->priv; in ath10k_configure_filter() local
5431 mutex_lock(&ar->conf_mutex); in ath10k_configure_filter()
5435 ar->filter_flags = *total_flags; in ath10k_configure_filter()
5437 ret = ath10k_monitor_recalc(ar); in ath10k_configure_filter()
5439 ath10k_warn(ar, "failed to recalc monitor: %d\n", ret); in ath10k_configure_filter()
5441 mutex_unlock(&ar->conf_mutex); in ath10k_configure_filter()
5449 struct ath10k *ar = hw->priv; in ath10k_bss_info_changed() local
5458 mutex_lock(&ar->conf_mutex); in ath10k_bss_info_changed()
5465 vdev_param = ar->wmi.vdev_param->beacon_interval; in ath10k_bss_info_changed()
5466 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_bss_info_changed()
5468 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_bss_info_changed()
5473 ath10k_warn(ar, "failed to set beacon interval for vdev %d: %i\n", in ath10k_bss_info_changed()
5478 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_bss_info_changed()
5482 pdev_param = ar->wmi.pdev_param->beacon_tx_mode; in ath10k_bss_info_changed()
5483 ret = ath10k_wmi_pdev_set_param(ar, pdev_param, in ath10k_bss_info_changed()
5486 ath10k_warn(ar, "failed to set beacon mode for vdev %d: %i\n", in ath10k_bss_info_changed()
5491 ath10k_warn(ar, "failed to update beacon template: %d\n", in ath10k_bss_info_changed()
5505 ath10k_warn(ar, "failed to setup probe resp template on vdev %i: %d\n", in ath10k_bss_info_changed()
5512 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_bss_info_changed()
5516 vdev_param = ar->wmi.vdev_param->dtim_period; in ath10k_bss_info_changed()
5517 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_bss_info_changed()
5520 ath10k_warn(ar, "failed to set dtim period for vdev %d: %i\n", in ath10k_bss_info_changed()
5543 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n", in ath10k_bss_info_changed()
5549 ath10k_warn(ar, "failed to set cts protection for vdev %d: %d\n", in ath10k_bss_info_changed()
5561 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d slot_time %d\n", in ath10k_bss_info_changed()
5564 vdev_param = ar->wmi.vdev_param->slot_time; in ath10k_bss_info_changed()
5565 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_bss_info_changed()
5568 ath10k_warn(ar, "failed to set erp slot for vdev %d: %i\n", in ath10k_bss_info_changed()
5578 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_bss_info_changed()
5582 vdev_param = ar->wmi.vdev_param->preamble; in ath10k_bss_info_changed()
5583 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_bss_info_changed()
5586 ath10k_warn(ar, "failed to set preamble for vdev %d: %i\n", in ath10k_bss_info_changed()
5596 if (ar->monitor_started) in ath10k_bss_info_changed()
5597 ath10k_monitor_stop(ar); in ath10k_bss_info_changed()
5599 ath10k_monitor_recalc(ar); in ath10k_bss_info_changed()
5606 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev_id %i txpower %d\n", in ath10k_bss_info_changed()
5610 ret = ath10k_mac_txpower_recalc(ar); in ath10k_bss_info_changed()
5612 ath10k_warn(ar, "failed to recalc tx power: %d\n", ret); in ath10k_bss_info_changed()
5618 ret = ath10k_config_ps(ar); in ath10k_bss_info_changed()
5620 ath10k_warn(ar, "failed to setup ps on vdev %i: %d\n", in ath10k_bss_info_changed()
5629 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) in ath10k_bss_info_changed()
5641 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_bss_info_changed()
5645 vdev_param = ar->wmi.vdev_param->mcast_data_rate; in ath10k_bss_info_changed()
5646 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, in ath10k_bss_info_changed()
5649 ath10k_warn(ar, in ath10k_bss_info_changed()
5653 vdev_param = ar->wmi.vdev_param->bcast_data_rate; in ath10k_bss_info_changed()
5654 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, in ath10k_bss_info_changed()
5657 ath10k_warn(ar, in ath10k_bss_info_changed()
5662 mutex_unlock(&ar->conf_mutex); in ath10k_bss_info_changed()
5667 struct ath10k *ar = hw->priv; in ath10k_mac_op_set_coverage_class() local
5672 if (!ar->hw_params.hw_ops->set_coverage_class) { in ath10k_mac_op_set_coverage_class()
5676 ar->hw_params.hw_ops->set_coverage_class(ar, value); in ath10k_mac_op_set_coverage_class()
5717 if (ath10k_mac_tdls_vif_stations_count(arvif->ar->hw, vif) > 0) in ath10k_mac_tdls_vifs_count_iter()
5736 struct ath10k *ar = hw->priv; in ath10k_hw_scan() local
5744 mutex_lock(&ar->conf_mutex); in ath10k_hw_scan()
5751 spin_lock_bh(&ar->data_lock); in ath10k_hw_scan()
5752 switch (ar->scan.state) { in ath10k_hw_scan()
5754 reinit_completion(&ar->scan.started); in ath10k_hw_scan()
5755 reinit_completion(&ar->scan.completed); in ath10k_hw_scan()
5756 ar->scan.state = ATH10K_SCAN_STARTING; in ath10k_hw_scan()
5757 ar->scan.is_roc = false; in ath10k_hw_scan()
5758 ar->scan.vdev_id = arvif->vdev_id; in ath10k_hw_scan()
5767 spin_unlock_bh(&ar->data_lock); in ath10k_hw_scan()
5773 ath10k_wmi_start_scan_init(ar, &arg); in ath10k_hw_scan()
5820 ret = ath10k_start_scan(ar, &arg); in ath10k_hw_scan()
5822 ath10k_warn(ar, "failed to start hw scan: %d\n", ret); in ath10k_hw_scan()
5823 spin_lock_bh(&ar->data_lock); in ath10k_hw_scan()
5824 ar->scan.state = ATH10K_SCAN_IDLE; in ath10k_hw_scan()
5825 spin_unlock_bh(&ar->data_lock); in ath10k_hw_scan()
5828 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout, in ath10k_hw_scan()
5832 mutex_unlock(&ar->conf_mutex); in ath10k_hw_scan()
5839 struct ath10k *ar = hw->priv; in ath10k_cancel_hw_scan() local
5841 mutex_lock(&ar->conf_mutex); in ath10k_cancel_hw_scan()
5842 ath10k_scan_abort(ar); in ath10k_cancel_hw_scan()
5843 mutex_unlock(&ar->conf_mutex); in ath10k_cancel_hw_scan()
5845 cancel_delayed_work_sync(&ar->scan.timeout); in ath10k_cancel_hw_scan()
5848 static void ath10k_set_key_h_def_keyidx(struct ath10k *ar, in ath10k_set_key_h_def_keyidx() argument
5853 u32 vdev_param = arvif->ar->wmi.vdev_param->def_keyid; in ath10k_set_key_h_def_keyidx()
5883 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_set_key_h_def_keyidx()
5886 ath10k_warn(ar, "failed to set vdev %i group key as default key: %d\n", in ath10k_set_key_h_def_keyidx()
5894 struct ath10k *ar = hw->priv; in ath10k_set_key() local
5918 mutex_lock(&ar->conf_mutex); in ath10k_set_key()
5939 spin_lock_bh(&ar->data_lock); in ath10k_set_key()
5940 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr); in ath10k_set_key()
5941 spin_unlock_bh(&ar->data_lock); in ath10k_set_key()
5945 ath10k_warn(ar, "failed to install key for non-existent peer %pM\n", in ath10k_set_key()
5985 ath10k_warn(ar, "failed to install key for vdev %i peer %pM: %d\n", in ath10k_set_key()
6001 ath10k_warn(ar, "failed to install (ucast) key for vdev %i peer %pM: %d\n", in ath10k_set_key()
6007 ath10k_warn(ar, "failed to disable (mcast) key for vdev %i peer %pM: %d\n", in ath10k_set_key()
6014 ath10k_set_key_h_def_keyidx(ar, arvif, cmd, key); in ath10k_set_key()
6016 spin_lock_bh(&ar->data_lock); in ath10k_set_key()
6017 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr); in ath10k_set_key()
6024 ath10k_warn(ar, "Peer %pM disappeared!\n", peer_addr); in ath10k_set_key()
6025 spin_unlock_bh(&ar->data_lock); in ath10k_set_key()
6028 ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr, in ath10k_set_key()
6032 mutex_unlock(&ar->conf_mutex); in ath10k_set_key()
6040 struct ath10k *ar = hw->priv; in ath10k_set_default_unicast_key() local
6044 mutex_lock(&arvif->ar->conf_mutex); in ath10k_set_default_unicast_key()
6046 if (arvif->ar->state != ATH10K_STATE_ON) in ath10k_set_default_unicast_key()
6049 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d set keyidx %d\n", in ath10k_set_default_unicast_key()
6052 ret = ath10k_wmi_vdev_set_param(arvif->ar, in ath10k_set_default_unicast_key()
6054 arvif->ar->wmi.vdev_param->def_keyid, in ath10k_set_default_unicast_key()
6058 ath10k_warn(ar, "failed to update wep key index for vdev %d: %d\n", in ath10k_set_default_unicast_key()
6067 mutex_unlock(&arvif->ar->conf_mutex); in ath10k_set_default_unicast_key()
6072 struct ath10k *ar; in ath10k_sta_rc_update_wk() local
6086 ar = arvif->ar; in ath10k_sta_rc_update_wk()
6095 spin_lock_bh(&ar->data_lock); in ath10k_sta_rc_update_wk()
6104 spin_unlock_bh(&ar->data_lock); in ath10k_sta_rc_update_wk()
6106 mutex_lock(&ar->conf_mutex); in ath10k_sta_rc_update_wk()
6116 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM peer bw %d phymode %d\n", in ath10k_sta_rc_update_wk()
6119 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr, in ath10k_sta_rc_update_wk()
6122 ath10k_warn(ar, "failed to update STA %pM peer phymode %d: %d\n", in ath10k_sta_rc_update_wk()
6127 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr, in ath10k_sta_rc_update_wk()
6130 ath10k_warn(ar, "failed to update STA %pM peer bw %d: %d\n", in ath10k_sta_rc_update_wk()
6135 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM nss %d\n", in ath10k_sta_rc_update_wk()
6138 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr, in ath10k_sta_rc_update_wk()
6141 ath10k_warn(ar, "failed to update STA %pM nss %d: %d\n", in ath10k_sta_rc_update_wk()
6146 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM smps %d\n", in ath10k_sta_rc_update_wk()
6149 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr, in ath10k_sta_rc_update_wk()
6152 ath10k_warn(ar, "failed to update STA %pM smps %d: %d\n", in ath10k_sta_rc_update_wk()
6157 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM supp rates\n", in ath10k_sta_rc_update_wk()
6160 err = ath10k_station_assoc(ar, arvif->vif, sta, true); in ath10k_sta_rc_update_wk()
6162 ath10k_warn(ar, "failed to reassociate station: %pM\n", in ath10k_sta_rc_update_wk()
6167 mutex_unlock(&ar->conf_mutex); in ath10k_sta_rc_update_wk()
6173 struct ath10k *ar = arvif->ar; in ath10k_mac_inc_num_stations() local
6175 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_inc_num_stations()
6180 if (ar->num_stations >= ar->max_num_stations) in ath10k_mac_inc_num_stations()
6183 ar->num_stations++; in ath10k_mac_inc_num_stations()
6191 struct ath10k *ar = arvif->ar; in ath10k_mac_dec_num_stations() local
6193 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_dec_num_stations()
6198 ar->num_stations--; in ath10k_mac_dec_num_stations()
6207 struct ath10k *ar = hw->priv; in ath10k_sta_state() local
6229 mutex_lock(&ar->conf_mutex); in ath10k_sta_state()
6240 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_sta_state()
6243 ar->num_stations + 1, ar->max_num_stations, in ath10k_sta_state()
6244 ar->num_peers + 1, ar->max_num_peers); in ath10k_sta_state()
6250 if (num_tdls_stations >= ar->max_num_tdls_vdevs) { in ath10k_sta_state()
6251 ath10k_warn(ar, "vdev %i exceeded maximum number of tdls vdevs %i\n", in ath10k_sta_state()
6253 ar->max_num_tdls_vdevs); in ath10k_sta_state()
6262 ath10k_warn(ar, "refusing to associate station: too many connected already (%d)\n", in ath10k_sta_state()
6263 ar->max_num_stations); in ath10k_sta_state()
6267 ret = ath10k_peer_create(ar, vif, sta, arvif->vdev_id, in ath10k_sta_state()
6270 ath10k_warn(ar, "failed to add peer %pM for vdev %d when adding a new sta: %i\n", in ath10k_sta_state()
6276 spin_lock_bh(&ar->data_lock); in ath10k_sta_state()
6278 peer = ath10k_peer_find(ar, arvif->vdev_id, sta->addr); in ath10k_sta_state()
6280 ath10k_warn(ar, "failed to lookup peer %pM on vdev %i\n", in ath10k_sta_state()
6282 spin_unlock_bh(&ar->data_lock); in ath10k_sta_state()
6283 ath10k_peer_delete(ar, arvif->vdev_id, sta->addr); in ath10k_sta_state()
6292 spin_unlock_bh(&ar->data_lock); in ath10k_sta_state()
6297 ret = ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id, in ath10k_sta_state()
6300 ath10k_warn(ar, "failed to update fw tdls state on vdev %i: %i\n", in ath10k_sta_state()
6302 ath10k_peer_delete(ar, arvif->vdev_id, in ath10k_sta_state()
6308 ret = ath10k_mac_tdls_peer_update(ar, arvif->vdev_id, sta, in ath10k_sta_state()
6311 ath10k_warn(ar, in ath10k_sta_state()
6314 ath10k_peer_delete(ar, arvif->vdev_id, sta->addr); in ath10k_sta_state()
6319 ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id, in ath10k_sta_state()
6327 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_sta_state()
6332 ret = ath10k_mac_tdls_peer_update(ar, arvif->vdev_id, in ath10k_sta_state()
6336 ath10k_warn(ar, "failed to update tdls peer state for %pM state %d: %i\n", in ath10k_sta_state()
6341 ret = ath10k_peer_delete(ar, arvif->vdev_id, sta->addr); in ath10k_sta_state()
6343 ath10k_warn(ar, "failed to delete peer %pM for vdev %d: %i\n", in ath10k_sta_state()
6348 spin_lock_bh(&ar->data_lock); in ath10k_sta_state()
6349 for (i = 0; i < ARRAY_SIZE(ar->peer_map); i++) { in ath10k_sta_state()
6350 peer = ar->peer_map[i]; in ath10k_sta_state()
6355 …ath10k_warn(ar, "found sta peer %pM (ptr %pK id %d) entry on vdev %i after it was supposedly remov… in ath10k_sta_state()
6363 ar->peer_map[i] = NULL; in ath10k_sta_state()
6365 ar->num_peers--; in ath10k_sta_state()
6368 spin_unlock_bh(&ar->data_lock); in ath10k_sta_state()
6371 ath10k_mac_txq_unref(ar, sta->txq[i]); in ath10k_sta_state()
6380 ret = ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id, in ath10k_sta_state()
6383 ath10k_warn(ar, "failed to update fw tdls state on vdev %i: %i\n", in ath10k_sta_state()
6394 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac sta %pM associated\n", in ath10k_sta_state()
6397 ret = ath10k_station_assoc(ar, vif, sta, false); in ath10k_sta_state()
6399 ath10k_warn(ar, "failed to associate station %pM for vdev %i: %i\n", in ath10k_sta_state()
6407 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac tdls sta %pM authorized\n", in ath10k_sta_state()
6410 ret = ath10k_station_assoc(ar, vif, sta, false); in ath10k_sta_state()
6412 ath10k_warn(ar, "failed to associate tdls station %pM for vdev %i: %i\n", in ath10k_sta_state()
6417 ret = ath10k_mac_tdls_peer_update(ar, arvif->vdev_id, sta, in ath10k_sta_state()
6420 ath10k_warn(ar, "failed to update tdls peer %pM for vdev %i: %i\n", in ath10k_sta_state()
6430 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac sta %pM disassociated\n", in ath10k_sta_state()
6433 ret = ath10k_station_disassoc(ar, vif, sta); in ath10k_sta_state()
6435 ath10k_warn(ar, "failed to disassociate station: %pM vdev %i: %i\n", in ath10k_sta_state()
6439 mutex_unlock(&ar->conf_mutex); in ath10k_sta_state()
6443 static int ath10k_conf_tx_uapsd(struct ath10k *ar, struct ieee80211_vif *vif, in ath10k_conf_tx_uapsd() argument
6452 lockdep_assert_held(&ar->conf_mutex); in ath10k_conf_tx_uapsd()
6489 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath10k_conf_tx_uapsd()
6493 ath10k_warn(ar, "failed to set uapsd params: %d\n", ret); in ath10k_conf_tx_uapsd()
6502 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath10k_conf_tx_uapsd()
6506 ath10k_warn(ar, "failed to set rx wake param: %d\n", ret); in ath10k_conf_tx_uapsd()
6510 ath10k_warn(ar, "failed to recalc ps wake threshold on vdev %i: %d\n", in ath10k_conf_tx_uapsd()
6517 ath10k_warn(ar, "failed to recalc ps poll count on vdev %i: %d\n", in ath10k_conf_tx_uapsd()
6522 if (test_bit(WMI_SERVICE_STA_UAPSD_BASIC_AUTO_TRIG, ar->wmi.svc_map) || in ath10k_conf_tx_uapsd()
6523 test_bit(WMI_SERVICE_STA_UAPSD_VAR_AUTO_TRIG, ar->wmi.svc_map)) { in ath10k_conf_tx_uapsd()
6536 ret = ath10k_wmi_vdev_sta_uapsd(ar, arvif->vdev_id, in ath10k_conf_tx_uapsd()
6539 ath10k_warn(ar, "failed to set uapsd auto trigger %d\n", in ath10k_conf_tx_uapsd()
6553 struct ath10k *ar = hw->priv; in ath10k_conf_tx() local
6558 mutex_lock(&ar->conf_mutex); in ath10k_conf_tx()
6591 if (ar->wmi.ops->gen_vdev_wmm_conf) { in ath10k_conf_tx()
6592 ret = ath10k_wmi_vdev_wmm_conf(ar, arvif->vdev_id, in ath10k_conf_tx()
6595 ath10k_warn(ar, "failed to set vdev wmm params on vdev %i: %d\n", in ath10k_conf_tx()
6603 ret = ath10k_wmi_pdev_set_wmm_params(ar, &arvif->wmm_params); in ath10k_conf_tx()
6605 ath10k_warn(ar, "failed to set wmm params: %d\n", ret); in ath10k_conf_tx()
6610 ret = ath10k_conf_tx_uapsd(ar, vif, ac, params->uapsd); in ath10k_conf_tx()
6612 ath10k_warn(ar, "failed to set sta uapsd: %d\n", ret); in ath10k_conf_tx()
6615 mutex_unlock(&ar->conf_mutex); in ath10k_conf_tx()
6627 struct ath10k *ar = hw->priv; in ath10k_remain_on_channel() local
6633 mutex_lock(&ar->conf_mutex); in ath10k_remain_on_channel()
6640 spin_lock_bh(&ar->data_lock); in ath10k_remain_on_channel()
6641 switch (ar->scan.state) { in ath10k_remain_on_channel()
6643 reinit_completion(&ar->scan.started); in ath10k_remain_on_channel()
6644 reinit_completion(&ar->scan.completed); in ath10k_remain_on_channel()
6645 reinit_completion(&ar->scan.on_channel); in ath10k_remain_on_channel()
6646 ar->scan.state = ATH10K_SCAN_STARTING; in ath10k_remain_on_channel()
6647 ar->scan.is_roc = true; in ath10k_remain_on_channel()
6648 ar->scan.vdev_id = arvif->vdev_id; in ath10k_remain_on_channel()
6649 ar->scan.roc_freq = chan->center_freq; in ath10k_remain_on_channel()
6650 ar->scan.roc_notify = true; in ath10k_remain_on_channel()
6659 spin_unlock_bh(&ar->data_lock); in ath10k_remain_on_channel()
6664 scan_time_msec = ar->hw->wiphy->max_remain_on_channel_duration * 2; in ath10k_remain_on_channel()
6667 ath10k_wmi_start_scan_init(ar, &arg); in ath10k_remain_on_channel()
6679 ret = ath10k_start_scan(ar, &arg); in ath10k_remain_on_channel()
6681 ath10k_warn(ar, "failed to start roc scan: %d\n", ret); in ath10k_remain_on_channel()
6682 spin_lock_bh(&ar->data_lock); in ath10k_remain_on_channel()
6683 ar->scan.state = ATH10K_SCAN_IDLE; in ath10k_remain_on_channel()
6684 spin_unlock_bh(&ar->data_lock); in ath10k_remain_on_channel()
6688 ret = wait_for_completion_timeout(&ar->scan.on_channel, 3 * HZ); in ath10k_remain_on_channel()
6690 ath10k_warn(ar, "failed to switch to channel for roc scan\n"); in ath10k_remain_on_channel()
6692 ret = ath10k_scan_stop(ar); in ath10k_remain_on_channel()
6694 ath10k_warn(ar, "failed to stop scan: %d\n", ret); in ath10k_remain_on_channel()
6700 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout, in ath10k_remain_on_channel()
6705 mutex_unlock(&ar->conf_mutex); in ath10k_remain_on_channel()
6711 struct ath10k *ar = hw->priv; in ath10k_cancel_remain_on_channel() local
6713 mutex_lock(&ar->conf_mutex); in ath10k_cancel_remain_on_channel()
6715 spin_lock_bh(&ar->data_lock); in ath10k_cancel_remain_on_channel()
6716 ar->scan.roc_notify = false; in ath10k_cancel_remain_on_channel()
6717 spin_unlock_bh(&ar->data_lock); in ath10k_cancel_remain_on_channel()
6719 ath10k_scan_abort(ar); in ath10k_cancel_remain_on_channel()
6721 mutex_unlock(&ar->conf_mutex); in ath10k_cancel_remain_on_channel()
6723 cancel_delayed_work_sync(&ar->scan.timeout); in ath10k_cancel_remain_on_channel()
6735 struct ath10k *ar = hw->priv; in ath10k_set_rts_threshold() local
6739 mutex_lock(&ar->conf_mutex); in ath10k_set_rts_threshold()
6740 list_for_each_entry(arvif, &ar->arvifs, list) { in ath10k_set_rts_threshold()
6741 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d rts threshold %d\n", in ath10k_set_rts_threshold()
6746 ath10k_warn(ar, "failed to set rts threshold for vdev %d: %d\n", in ath10k_set_rts_threshold()
6751 mutex_unlock(&ar->conf_mutex); in ath10k_set_rts_threshold()
6774 struct ath10k *ar = hw->priv; in ath10k_flush() local
6784 mutex_lock(&ar->conf_mutex); in ath10k_flush()
6786 if (ar->state == ATH10K_STATE_WEDGED) in ath10k_flush()
6789 time_left = wait_event_timeout(ar->htt.empty_tx_wq, ({ in ath10k_flush()
6792 spin_lock_bh(&ar->htt.tx_lock); in ath10k_flush()
6793 empty = (ar->htt.num_pending_tx == 0); in ath10k_flush()
6794 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_flush()
6796 skip = (ar->state == ATH10K_STATE_WEDGED) || in ath10k_flush()
6798 &ar->dev_flags); in ath10k_flush()
6804 ath10k_warn(ar, "failed to flush transmit queue (skip %i ar-state %i): %ld\n", in ath10k_flush()
6805 skip, ar->state, time_left); in ath10k_flush()
6808 mutex_unlock(&ar->conf_mutex); in ath10k_flush()
6823 struct ath10k *ar = hw->priv; in ath10k_reconfig_complete() local
6828 mutex_lock(&ar->conf_mutex); in ath10k_reconfig_complete()
6833 if (ar->state == ATH10K_STATE_RESTARTED) { in ath10k_reconfig_complete()
6834 ath10k_info(ar, "device successfully recovered\n"); in ath10k_reconfig_complete()
6835 ar->state = ATH10K_STATE_ON; in ath10k_reconfig_complete()
6836 ieee80211_wake_queues(ar->hw); in ath10k_reconfig_complete()
6839 mutex_unlock(&ar->conf_mutex); in ath10k_reconfig_complete()
6843 ath10k_mac_update_bss_chan_survey(struct ath10k *ar, in ath10k_mac_update_bss_chan_survey() argument
6849 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_update_bss_chan_survey()
6851 if (!test_bit(WMI_SERVICE_BSS_CHANNEL_INFO_64, ar->wmi.svc_map) || in ath10k_mac_update_bss_chan_survey()
6852 (ar->rx_channel != channel)) in ath10k_mac_update_bss_chan_survey()
6855 if (ar->scan.state != ATH10K_SCAN_IDLE) { in ath10k_mac_update_bss_chan_survey()
6856 ath10k_dbg(ar, ATH10K_DBG_MAC, "ignoring bss chan info request while scanning..\n"); in ath10k_mac_update_bss_chan_survey()
6860 reinit_completion(&ar->bss_survey_done); in ath10k_mac_update_bss_chan_survey()
6862 ret = ath10k_wmi_pdev_bss_chan_info_request(ar, type); in ath10k_mac_update_bss_chan_survey()
6864 ath10k_warn(ar, "failed to send pdev bss chan info request\n"); in ath10k_mac_update_bss_chan_survey()
6868 ret = wait_for_completion_timeout(&ar->bss_survey_done, 3 * HZ); in ath10k_mac_update_bss_chan_survey()
6870 ath10k_warn(ar, "bss channel survey timed out\n"); in ath10k_mac_update_bss_chan_survey()
6878 struct ath10k *ar = hw->priv; in ath10k_get_survey() local
6880 struct survey_info *ar_survey = &ar->survey[idx]; in ath10k_get_survey()
6883 mutex_lock(&ar->conf_mutex); in ath10k_get_survey()
6899 ath10k_mac_update_bss_chan_survey(ar, &sband->channels[idx]); in ath10k_get_survey()
6901 spin_lock_bh(&ar->data_lock); in ath10k_get_survey()
6903 spin_unlock_bh(&ar->data_lock); in ath10k_get_survey()
6907 if (ar->rx_channel == survey->channel) in ath10k_get_survey()
6911 mutex_unlock(&ar->conf_mutex); in ath10k_get_survey()
6916 ath10k_mac_bitrate_mask_has_single_rate(struct ath10k *ar, in ath10k_mac_bitrate_mask_has_single_rate() argument
6935 ath10k_mac_bitrate_mask_get_single_nss(struct ath10k *ar, in ath10k_mac_bitrate_mask_get_single_nss() argument
6940 struct ieee80211_supported_band *sband = &ar->mac.sbands[band]; in ath10k_mac_bitrate_mask_get_single_nss()
6984 ath10k_mac_bitrate_mask_get_single_rate(struct ath10k *ar, in ath10k_mac_bitrate_mask_get_single_rate() argument
6998 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) in ath10k_mac_bitrate_mask_get_single_rate()
7045 struct ath10k *ar = arvif->ar; in ath10k_mac_set_fixed_rate_params() local
7049 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_set_fixed_rate_params()
7051 …ath10k_dbg(ar, ATH10K_DBG_MAC, "mac set fixed rate params vdev %i rate 0x%02hhx nss %hhu sgi %hhu\… in ath10k_mac_set_fixed_rate_params()
7054 vdev_param = ar->wmi.vdev_param->fixed_rate; in ath10k_mac_set_fixed_rate_params()
7055 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, rate); in ath10k_mac_set_fixed_rate_params()
7057 ath10k_warn(ar, "failed to set fixed rate param 0x%02x: %d\n", in ath10k_mac_set_fixed_rate_params()
7062 vdev_param = ar->wmi.vdev_param->nss; in ath10k_mac_set_fixed_rate_params()
7063 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, nss); in ath10k_mac_set_fixed_rate_params()
7065 ath10k_warn(ar, "failed to set nss param %d: %d\n", nss, ret); in ath10k_mac_set_fixed_rate_params()
7069 vdev_param = ar->wmi.vdev_param->sgi; in ath10k_mac_set_fixed_rate_params()
7070 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, sgi); in ath10k_mac_set_fixed_rate_params()
7072 ath10k_warn(ar, "failed to set sgi param %d: %d\n", sgi, ret); in ath10k_mac_set_fixed_rate_params()
7076 vdev_param = ar->wmi.vdev_param->ldpc; in ath10k_mac_set_fixed_rate_params()
7077 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, ldpc); in ath10k_mac_set_fixed_rate_params()
7079 ath10k_warn(ar, "failed to set ldpc param %d: %d\n", ldpc, ret); in ath10k_mac_set_fixed_rate_params()
7087 ath10k_mac_can_set_bitrate_mask(struct ath10k *ar, in ath10k_mac_can_set_bitrate_mask() argument
7108 ath10k_warn(ar, "refusing bitrate mask with missing 0-7 VHT MCS rates\n"); in ath10k_mac_can_set_bitrate_mask()
7121 struct ath10k *ar = arvif->ar; in ath10k_mac_set_bitrate_mask_iter() local
7126 spin_lock_bh(&ar->data_lock); in ath10k_mac_set_bitrate_mask_iter()
7128 spin_unlock_bh(&ar->data_lock); in ath10k_mac_set_bitrate_mask_iter()
7130 ieee80211_queue_work(ar->hw, &arsta->update_wk); in ath10k_mac_set_bitrate_mask_iter()
7139 struct ath10k *ar = arvif->ar; in ath10k_mac_op_set_bitrate_mask() local
7156 ldpc = !!(ar->ht_cap_info & WMI_HT_CAP_LDPC); in ath10k_mac_op_set_bitrate_mask()
7162 if (ath10k_mac_bitrate_mask_has_single_rate(ar, band, mask)) { in ath10k_mac_op_set_bitrate_mask()
7163 ret = ath10k_mac_bitrate_mask_get_single_rate(ar, band, mask, in ath10k_mac_op_set_bitrate_mask()
7166 ath10k_warn(ar, "failed to get single rate for vdev %i: %d\n", in ath10k_mac_op_set_bitrate_mask()
7170 } else if (ath10k_mac_bitrate_mask_get_single_nss(ar, band, mask, in ath10k_mac_op_set_bitrate_mask()
7176 nss = min(ar->num_rf_chains, in ath10k_mac_op_set_bitrate_mask()
7180 if (!ath10k_mac_can_set_bitrate_mask(ar, band, mask)) in ath10k_mac_op_set_bitrate_mask()
7183 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_set_bitrate_mask()
7186 ieee80211_iterate_stations_atomic(ar->hw, in ath10k_mac_op_set_bitrate_mask()
7190 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_set_bitrate_mask()
7193 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_set_bitrate_mask()
7197 ath10k_warn(ar, "failed to set fixed rate params on vdev %i: %d\n", in ath10k_mac_op_set_bitrate_mask()
7203 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_set_bitrate_mask()
7213 struct ath10k *ar = hw->priv; in ath10k_sta_rc_update() local
7219 spin_lock_bh(&ar->data_lock); in ath10k_sta_rc_update()
7221 peer = ath10k_peer_find(ar, arvif->vdev_id, sta->addr); in ath10k_sta_rc_update()
7223 spin_unlock_bh(&ar->data_lock); in ath10k_sta_rc_update()
7224 ath10k_warn(ar, "mac sta rc update failed to find peer %pM on vdev %i\n", in ath10k_sta_rc_update()
7229 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_sta_rc_update()
7251 ath10k_warn(ar, "Invalid bandwidth %d in rc update for %pM\n", in ath10k_sta_rc_update()
7278 ath10k_warn(ar, "Invalid smps %d in sta rc update for %pM\n", in ath10k_sta_rc_update()
7289 spin_unlock_bh(&ar->data_lock); in ath10k_sta_rc_update()
7297 struct ath10k *ar = hw->priv; in ath10k_offset_tsf() local
7303 vdev_param = ar->wmi.vdev_param->dec_tsf; in ath10k_offset_tsf()
7306 vdev_param = ar->wmi.vdev_param->inc_tsf; in ath10k_offset_tsf()
7310 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, in ath10k_offset_tsf()
7314 ath10k_warn(ar, "failed to set tsf offset %d cmd %d: %d\n", in ath10k_offset_tsf()
7322 struct ath10k *ar = hw->priv; in ath10k_ampdu_action() local
7328 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac ampdu vdev_id %i sta %pM tid %hu action %d\n", in ath10k_ampdu_action()
7353 ath10k_mac_update_rx_channel(struct ath10k *ar, in ath10k_mac_update_rx_channel() argument
7363 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_update_rx_channel()
7364 lockdep_assert_held(&ar->data_lock); in ath10k_mac_update_rx_channel()
7380 if (!ctx && ath10k_mac_num_chanctxs(ar) == 1) { in ath10k_mac_update_rx_channel()
7381 ieee80211_iter_chan_contexts_atomic(ar->hw, in ath10k_mac_update_rx_channel()
7388 ar->rx_channel = def->chan; in ath10k_mac_update_rx_channel()
7389 } else if ((ctx && ath10k_mac_num_chanctxs(ar) == 0) || in ath10k_mac_update_rx_channel()
7390 (ctx && (ar->state == ATH10K_STATE_RESTARTED))) { in ath10k_mac_update_rx_channel()
7396 ar->rx_channel = ctx->def.chan; in ath10k_mac_update_rx_channel()
7398 ar->rx_channel = NULL; in ath10k_mac_update_rx_channel()
7404 ath10k_mac_update_vif_chan(struct ath10k *ar, in ath10k_mac_update_vif_chan() argument
7412 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_update_vif_chan()
7417 if (ar->monitor_started) in ath10k_mac_update_vif_chan()
7418 ath10k_monitor_stop(ar); in ath10k_mac_update_vif_chan()
7423 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_mac_update_vif_chan()
7437 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id); in ath10k_mac_update_vif_chan()
7439 ath10k_warn(ar, "failed to down vdev %d: %d\n", in ath10k_mac_update_vif_chan()
7449 spin_lock_bh(&ar->data_lock); in ath10k_mac_update_vif_chan()
7450 ath10k_mac_update_rx_channel(ar, NULL, vifs, n_vifs); in ath10k_mac_update_vif_chan()
7451 spin_unlock_bh(&ar->data_lock); in ath10k_mac_update_vif_chan()
7464 ath10k_warn(ar, "failed to update bcn tmpl during csa: %d\n", in ath10k_mac_update_vif_chan()
7469 ath10k_warn(ar, "failed to update prb tmpl during csa: %d\n", in ath10k_mac_update_vif_chan()
7474 ath10k_warn(ar, "failed to restart vdev %d: %d\n", in ath10k_mac_update_vif_chan()
7479 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid, in ath10k_mac_update_vif_chan()
7482 ath10k_warn(ar, "failed to bring vdev up %d: %d\n", in ath10k_mac_update_vif_chan()
7488 ath10k_monitor_recalc(ar); in ath10k_mac_update_vif_chan()
7495 struct ath10k *ar = hw->priv; in ath10k_mac_op_add_chanctx() local
7497 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_mac_op_add_chanctx()
7501 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_add_chanctx()
7503 spin_lock_bh(&ar->data_lock); in ath10k_mac_op_add_chanctx()
7504 ath10k_mac_update_rx_channel(ar, ctx, NULL, 0); in ath10k_mac_op_add_chanctx()
7505 spin_unlock_bh(&ar->data_lock); in ath10k_mac_op_add_chanctx()
7507 ath10k_recalc_radar_detection(ar); in ath10k_mac_op_add_chanctx()
7508 ath10k_monitor_recalc(ar); in ath10k_mac_op_add_chanctx()
7510 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_add_chanctx()
7519 struct ath10k *ar = hw->priv; in ath10k_mac_op_remove_chanctx() local
7521 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_mac_op_remove_chanctx()
7525 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_remove_chanctx()
7527 spin_lock_bh(&ar->data_lock); in ath10k_mac_op_remove_chanctx()
7528 ath10k_mac_update_rx_channel(ar, NULL, NULL, 0); in ath10k_mac_op_remove_chanctx()
7529 spin_unlock_bh(&ar->data_lock); in ath10k_mac_op_remove_chanctx()
7531 ath10k_recalc_radar_detection(ar); in ath10k_mac_op_remove_chanctx()
7532 ath10k_monitor_recalc(ar); in ath10k_mac_op_remove_chanctx()
7534 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_remove_chanctx()
7581 struct ath10k *ar = hw->priv; in ath10k_mac_op_change_chanctx() local
7584 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_change_chanctx()
7586 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_mac_op_change_chanctx()
7615 ath10k_mac_update_vif_chan(ar, arg.vifs, arg.n_vifs); in ath10k_mac_op_change_chanctx()
7620 ath10k_recalc_radar_detection(ar); in ath10k_mac_op_change_chanctx()
7630 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_change_chanctx()
7638 struct ath10k *ar = hw->priv; in ath10k_mac_op_assign_vif_chanctx() local
7642 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_assign_vif_chanctx()
7644 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_mac_op_assign_vif_chanctx()
7649 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_assign_vif_chanctx()
7655 ath10k_warn(ar, "failed to start vdev %i addr %pM on freq %d: %d\n", in ath10k_mac_op_assign_vif_chanctx()
7665 ath10k_warn(ar, "failed to update vdev %i ps: %d\n", in ath10k_mac_op_assign_vif_chanctx()
7671 ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, 0, vif->addr); in ath10k_mac_op_assign_vif_chanctx()
7673 ath10k_warn(ar, "failed to up monitor vdev %i: %d\n", in ath10k_mac_op_assign_vif_chanctx()
7684 ath10k_warn(ar, "failed to set cts protection for vdev %d: %d\n", in ath10k_mac_op_assign_vif_chanctx()
7688 if (ath10k_peer_stats_enabled(ar)) { in ath10k_mac_op_assign_vif_chanctx()
7689 ar->pktlog_filter |= ATH10K_PKTLOG_PEER_STATS; in ath10k_mac_op_assign_vif_chanctx()
7690 ret = ath10k_wmi_pdev_pktlog_enable(ar, in ath10k_mac_op_assign_vif_chanctx()
7691 ar->pktlog_filter); in ath10k_mac_op_assign_vif_chanctx()
7693 ath10k_warn(ar, "failed to enable pktlog %d\n", ret); in ath10k_mac_op_assign_vif_chanctx()
7698 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_assign_vif_chanctx()
7707 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_assign_vif_chanctx()
7716 struct ath10k *ar = hw->priv; in ath10k_mac_op_unassign_vif_chanctx() local
7720 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_unassign_vif_chanctx()
7722 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_mac_op_unassign_vif_chanctx()
7731 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id); in ath10k_mac_op_unassign_vif_chanctx()
7733 ath10k_warn(ar, "failed to down monitor vdev %i: %d\n", in ath10k_mac_op_unassign_vif_chanctx()
7741 ath10k_warn(ar, "failed to stop vdev %i: %d\n", in ath10k_mac_op_unassign_vif_chanctx()
7746 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_unassign_vif_chanctx()
7755 struct ath10k *ar = hw->priv; in ath10k_mac_op_switch_vif_chanctx() local
7757 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_switch_vif_chanctx()
7759 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_mac_op_switch_vif_chanctx()
7762 ath10k_mac_update_vif_chan(ar, vifs, n_vifs); in ath10k_mac_op_switch_vif_chanctx()
7764 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_switch_vif_chanctx()
7772 struct ath10k *ar; in ath10k_mac_op_sta_pre_rcu_remove() local
7775 ar = hw->priv; in ath10k_mac_op_sta_pre_rcu_remove()
7777 list_for_each_entry(peer, &ar->peers, list) in ath10k_mac_op_sta_pre_rcu_remove()
7788 struct ath10k *ar = arsta->arvif->ar; in ath10k_sta_statistics() local
7790 if (!ath10k_peer_stats_enabled(ar)) in ath10k_sta_statistics()
7936 struct ath10k *ar; in ath10k_mac_create() local
7948 ar = hw->priv; in ath10k_mac_create()
7949 ar->hw = hw; in ath10k_mac_create()
7950 ar->ops = ops; in ath10k_mac_create()
7952 return ar; in ath10k_mac_create()
7955 void ath10k_mac_destroy(struct ath10k *ar) in ath10k_mac_destroy() argument
7957 struct ieee80211_ops *ops = ar->ops; in ath10k_mac_destroy()
7959 ieee80211_free_hw(ar->hw); in ath10k_mac_destroy()
8161 struct ath10k_vif *ath10k_get_arvif(struct ath10k *ar, u32 vdev_id) in ath10k_get_arvif() argument
8170 ieee80211_iterate_active_interfaces_atomic(ar->hw, in ath10k_get_arvif()
8175 ath10k_warn(ar, "No VIF found for vdev %d\n", vdev_id); in ath10k_get_arvif()
8185 static u32 ath10k_mac_wrdd_get_mcc(struct ath10k *ar, union acpi_object *wrdd) in ath10k_mac_wrdd_get_mcc() argument
8196 ath10k_warn(ar, "ignoring malformed/unsupported wrdd structure\n"); in ath10k_mac_wrdd_get_mcc()
8221 static int ath10k_mac_get_wrdd_regulatory(struct ath10k *ar, u16 *rd) in ath10k_mac_get_wrdd_regulatory() argument
8223 struct pci_dev __maybe_unused *pdev = to_pci_dev(ar->dev); in ath10k_mac_get_wrdd_regulatory()
8237 ath10k_dbg(ar, ATH10K_DBG_BOOT, in ath10k_mac_get_wrdd_regulatory()
8244 ath10k_dbg(ar, ATH10K_DBG_BOOT, in ath10k_mac_get_wrdd_regulatory()
8249 alpha2_code = ath10k_mac_wrdd_get_mcc(ar, wrdd.pointer); in ath10k_mac_get_wrdd_regulatory()
8258 ath10k_dbg(ar, ATH10K_DBG_BOOT, in ath10k_mac_get_wrdd_regulatory()
8269 static int ath10k_mac_init_rd(struct ath10k *ar) in ath10k_mac_init_rd() argument
8274 ret = ath10k_mac_get_wrdd_regulatory(ar, &rd); in ath10k_mac_init_rd()
8276 ath10k_dbg(ar, ATH10K_DBG_BOOT, in ath10k_mac_init_rd()
8278 rd = ar->hw_eeprom_rd; in ath10k_mac_init_rd()
8281 ar->ath_common.regulatory.current_rd = rd; in ath10k_mac_init_rd()
8285 int ath10k_mac_register(struct ath10k *ar) in ath10k_mac_register() argument
8313 SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr); in ath10k_mac_register()
8315 SET_IEEE80211_DEV(ar->hw, ar->dev); in ath10k_mac_register()
8321 if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) { in ath10k_mac_register()
8330 band = &ar->mac.sbands[NL80211_BAND_2GHZ]; in ath10k_mac_register()
8334 if (ar->hw_params.cck_rate_map_rev2) { in ath10k_mac_register()
8342 ar->hw->wiphy->bands[NL80211_BAND_2GHZ] = band; in ath10k_mac_register()
8345 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) { in ath10k_mac_register()
8354 band = &ar->mac.sbands[NL80211_BAND_5GHZ]; in ath10k_mac_register()
8359 ar->hw->wiphy->bands[NL80211_BAND_5GHZ] = band; in ath10k_mac_register()
8362 ath10k_mac_setup_ht_vht_cap(ar); in ath10k_mac_register()
8364 ar->hw->wiphy->interface_modes = in ath10k_mac_register()
8369 ar->hw->wiphy->available_antennas_rx = ar->cfg_rx_chainmask; in ath10k_mac_register()
8370 ar->hw->wiphy->available_antennas_tx = ar->cfg_tx_chainmask; in ath10k_mac_register()
8372 if (!test_bit(ATH10K_FW_FEATURE_NO_P2P, ar->normal_mode_fw.fw_file.fw_features)) in ath10k_mac_register()
8373 ar->hw->wiphy->interface_modes |= in ath10k_mac_register()
8378 ieee80211_hw_set(ar->hw, SIGNAL_DBM); in ath10k_mac_register()
8381 ar->running_fw->fw_file.fw_features)) { in ath10k_mac_register()
8382 ieee80211_hw_set(ar->hw, SUPPORTS_PS); in ath10k_mac_register()
8383 ieee80211_hw_set(ar->hw, SUPPORTS_DYNAMIC_PS); in ath10k_mac_register()
8386 ieee80211_hw_set(ar->hw, MFP_CAPABLE); in ath10k_mac_register()
8387 ieee80211_hw_set(ar->hw, REPORTS_TX_ACK_STATUS); in ath10k_mac_register()
8388 ieee80211_hw_set(ar->hw, HAS_RATE_CONTROL); in ath10k_mac_register()
8389 ieee80211_hw_set(ar->hw, AP_LINK_PS); in ath10k_mac_register()
8390 ieee80211_hw_set(ar->hw, SPECTRUM_MGMT); in ath10k_mac_register()
8391 ieee80211_hw_set(ar->hw, SUPPORT_FAST_XMIT); in ath10k_mac_register()
8392 ieee80211_hw_set(ar->hw, CONNECTION_MONITOR); in ath10k_mac_register()
8393 ieee80211_hw_set(ar->hw, SUPPORTS_PER_STA_GTK); in ath10k_mac_register()
8394 ieee80211_hw_set(ar->hw, WANT_MONITOR_VIF); in ath10k_mac_register()
8395 ieee80211_hw_set(ar->hw, CHANCTX_STA_CSA); in ath10k_mac_register()
8396 ieee80211_hw_set(ar->hw, QUEUE_CONTROL); in ath10k_mac_register()
8397 ieee80211_hw_set(ar->hw, SUPPORTS_TX_FRAG); in ath10k_mac_register()
8398 ieee80211_hw_set(ar->hw, REPORTS_LOW_ACK); in ath10k_mac_register()
8400 if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) in ath10k_mac_register()
8401 ieee80211_hw_set(ar->hw, SW_CRYPTO_CONTROL); in ath10k_mac_register()
8403 ar->hw->wiphy->features |= NL80211_FEATURE_STATIC_SMPS; in ath10k_mac_register()
8404 ar->hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN; in ath10k_mac_register()
8406 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) in ath10k_mac_register()
8407 ar->hw->wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS; in ath10k_mac_register()
8409 if (ar->ht_cap_info & WMI_HT_CAP_ENABLED) { in ath10k_mac_register()
8410 ieee80211_hw_set(ar->hw, AMPDU_AGGREGATION); in ath10k_mac_register()
8411 ieee80211_hw_set(ar->hw, TX_AMPDU_SETUP_IN_HW); in ath10k_mac_register()
8414 ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID; in ath10k_mac_register()
8415 ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN; in ath10k_mac_register()
8417 ar->hw->vif_data_size = sizeof(struct ath10k_vif); in ath10k_mac_register()
8418 ar->hw->sta_data_size = sizeof(struct ath10k_sta); in ath10k_mac_register()
8419 ar->hw->txq_data_size = sizeof(struct ath10k_txq); in ath10k_mac_register()
8421 ar->hw->max_listen_interval = ATH10K_MAX_HW_LISTEN_INTERVAL; in ath10k_mac_register()
8423 if (test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map)) { in ath10k_mac_register()
8424 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD; in ath10k_mac_register()
8430 ar->hw->wiphy->probe_resp_offload |= in ath10k_mac_register()
8436 if (test_bit(WMI_SERVICE_TDLS, ar->wmi.svc_map) || in ath10k_mac_register()
8437 test_bit(WMI_SERVICE_TDLS_EXPLICIT_MODE_ONLY, ar->wmi.svc_map)) { in ath10k_mac_register()
8438 ar->hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS; in ath10k_mac_register()
8439 if (test_bit(WMI_SERVICE_TDLS_WIDER_BANDWIDTH, ar->wmi.svc_map)) in ath10k_mac_register()
8440 ieee80211_hw_set(ar->hw, TDLS_WIDER_BW); in ath10k_mac_register()
8443 if (test_bit(WMI_SERVICE_TDLS_UAPSD_BUFFER_STA, ar->wmi.svc_map)) in ath10k_mac_register()
8444 ieee80211_hw_set(ar->hw, SUPPORTS_TDLS_BUFFER_STA); in ath10k_mac_register()
8446 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL; in ath10k_mac_register()
8447 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH; in ath10k_mac_register()
8448 ar->hw->wiphy->max_remain_on_channel_duration = 5000; in ath10k_mac_register()
8450 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD; in ath10k_mac_register()
8451 ar->hw->wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE | in ath10k_mac_register()
8454 ar->hw->wiphy->max_ap_assoc_sta = ar->max_num_stations; in ath10k_mac_register()
8456 ret = ath10k_wow_init(ar); in ath10k_mac_register()
8458 ath10k_warn(ar, "failed to init wow: %d\n", ret); in ath10k_mac_register()
8462 wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_VHT_IBSS); in ath10k_mac_register()
8463 wiphy_ext_feature_set(ar->hw->wiphy, in ath10k_mac_register()
8470 ar->hw->queues = IEEE80211_MAX_QUEUES; in ath10k_mac_register()
8476 ar->hw->offchannel_tx_hw_queue = IEEE80211_MAX_QUEUES - 1; in ath10k_mac_register()
8478 switch (ar->running_fw->fw_file.wmi_op_version) { in ath10k_mac_register()
8480 ar->hw->wiphy->iface_combinations = ath10k_if_comb; in ath10k_mac_register()
8481 ar->hw->wiphy->n_iface_combinations = in ath10k_mac_register()
8483 ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC); in ath10k_mac_register()
8486 if (test_bit(WMI_SERVICE_ADAPTIVE_OCS, ar->wmi.svc_map)) { in ath10k_mac_register()
8487 ar->hw->wiphy->iface_combinations = in ath10k_mac_register()
8489 ar->hw->wiphy->n_iface_combinations = in ath10k_mac_register()
8492 ar->hw->wiphy->iface_combinations = ath10k_tlv_if_comb; in ath10k_mac_register()
8493 ar->hw->wiphy->n_iface_combinations = in ath10k_mac_register()
8496 ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC); in ath10k_mac_register()
8501 ar->hw->wiphy->iface_combinations = ath10k_10x_if_comb; in ath10k_mac_register()
8502 ar->hw->wiphy->n_iface_combinations = in ath10k_mac_register()
8506 ar->hw->wiphy->iface_combinations = ath10k_10_4_if_comb; in ath10k_mac_register()
8507 ar->hw->wiphy->n_iface_combinations = in ath10k_mac_register()
8517 if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) in ath10k_mac_register()
8518 ar->hw->netdev_features = NETIF_F_HW_CSUM; in ath10k_mac_register()
8522 ar->ath_common.debug_mask = ATH_DBG_DFS; in ath10k_mac_register()
8523 ar->dfs_detector = dfs_pattern_detector_init(&ar->ath_common, in ath10k_mac_register()
8526 if (!ar->dfs_detector) in ath10k_mac_register()
8527 ath10k_warn(ar, "failed to initialise DFS pattern detector\n"); in ath10k_mac_register()
8530 ret = ath10k_mac_init_rd(ar); in ath10k_mac_register()
8532 ath10k_err(ar, "failed to derive regdom: %d\n", ret); in ath10k_mac_register()
8537 if (!ar->hw_params.hw_ops->set_coverage_class) in ath10k_mac_register()
8538 ar->ops->set_coverage_class = NULL; in ath10k_mac_register()
8540 ret = ath_regd_init(&ar->ath_common.regulatory, ar->hw->wiphy, in ath10k_mac_register()
8543 ath10k_err(ar, "failed to initialise regulatory: %i\n", ret); in ath10k_mac_register()
8547 if (test_bit(WMI_SERVICE_SPOOF_MAC_SUPPORT, ar->wmi.svc_map)) { in ath10k_mac_register()
8548 ret = ath10k_wmi_scan_prob_req_oui(ar, ar->mac_addr); in ath10k_mac_register()
8550 ath10k_err(ar, "failed to set prob req oui: %i\n", ret); in ath10k_mac_register()
8554 ar->hw->wiphy->features |= in ath10k_mac_register()
8558 ar->hw->wiphy->cipher_suites = cipher_suites; in ath10k_mac_register()
8564 if (!ar->hw_params.n_cipher_suites || in ath10k_mac_register()
8565 ar->hw_params.n_cipher_suites > ARRAY_SIZE(cipher_suites)) { in ath10k_mac_register()
8566 ath10k_err(ar, "invalid hw_params.n_cipher_suites %d\n", in ath10k_mac_register()
8567 ar->hw_params.n_cipher_suites); in ath10k_mac_register()
8568 ar->hw_params.n_cipher_suites = 8; in ath10k_mac_register()
8570 ar->hw->wiphy->n_cipher_suites = ar->hw_params.n_cipher_suites; in ath10k_mac_register()
8572 wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST); in ath10k_mac_register()
8574 ret = ieee80211_register_hw(ar->hw); in ath10k_mac_register()
8576 ath10k_err(ar, "failed to register ieee80211: %d\n", ret); in ath10k_mac_register()
8580 if (!ath_is_world_regd(&ar->ath_common.regulatory)) { in ath10k_mac_register()
8581 ret = regulatory_hint(ar->hw->wiphy, in ath10k_mac_register()
8582 ar->ath_common.regulatory.alpha2); in ath10k_mac_register()
8590 ieee80211_unregister_hw(ar->hw); in ath10k_mac_register()
8593 if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) in ath10k_mac_register()
8594 ar->dfs_detector->exit(ar->dfs_detector); in ath10k_mac_register()
8597 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); in ath10k_mac_register()
8598 kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels); in ath10k_mac_register()
8600 SET_IEEE80211_DEV(ar->hw, NULL); in ath10k_mac_register()
8604 void ath10k_mac_unregister(struct ath10k *ar) in ath10k_mac_unregister() argument
8606 ieee80211_unregister_hw(ar->hw); in ath10k_mac_unregister()
8608 if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) in ath10k_mac_unregister()
8609 ar->dfs_detector->exit(ar->dfs_detector); in ath10k_mac_unregister()
8611 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); in ath10k_mac_unregister()
8612 kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels); in ath10k_mac_unregister()
8614 SET_IEEE80211_DEV(ar->hw, NULL); in ath10k_mac_unregister()