Lines Matching refs:ar
199 int ath10k_mac_ext_resource_config(struct ath10k *ar, u32 val) in ath10k_mac_ext_resource_config() argument
204 if (test_bit(WMI_SERVICE_TX_MODE_DYNAMIC, ar->wmi.svc_map)) in ath10k_mac_ext_resource_config()
209 ret = ath10k_wmi_ext_resource_config(ar, platform_type, val); in ath10k_mac_ext_resource_config()
212 ath10k_warn(ar, "failed to configure ext resource: %d\n", ret); in ath10k_mac_ext_resource_config()
228 struct ath10k *ar = arvif->ar; in ath10k_send_key() local
238 lockdep_assert_held(&arvif->ar->conf_mutex); in ath10k_send_key()
242 arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_AES_CCM]; in ath10k_send_key()
246 arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_TKIP]; in ath10k_send_key()
252 arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_WEP]; in ath10k_send_key()
255 arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_AES_CCM]; in ath10k_send_key()
259 arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_AES_GCM]; in ath10k_send_key()
268 ath10k_warn(ar, "cipher %d is not supported\n", key->cipher); in ath10k_send_key()
272 if (test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) in ath10k_send_key()
276 arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_NONE]; in ath10k_send_key()
280 return ath10k_wmi_vdev_install_key(arvif->ar, &arg); in ath10k_send_key()
288 struct ath10k *ar = arvif->ar; in ath10k_install_key() local
292 lockdep_assert_held(&ar->conf_mutex); in ath10k_install_key()
294 reinit_completion(&ar->install_key_done); in ath10k_install_key()
303 time_left = wait_for_completion_timeout(&ar->install_key_done, 3 * HZ); in ath10k_install_key()
313 struct ath10k *ar = arvif->ar; in ath10k_install_peer_wep_keys() local
319 lockdep_assert_held(&ar->conf_mutex); in ath10k_install_peer_wep_keys()
326 spin_lock_bh(&ar->data_lock); in ath10k_install_peer_wep_keys()
327 peer = ath10k_peer_find(ar, arvif->vdev_id, addr); in ath10k_install_peer_wep_keys()
328 spin_unlock_bh(&ar->data_lock); in ath10k_install_peer_wep_keys()
366 spin_lock_bh(&ar->data_lock); in ath10k_install_peer_wep_keys()
368 spin_unlock_bh(&ar->data_lock); in ath10k_install_peer_wep_keys()
385 ret = ath10k_wmi_vdev_set_param(arvif->ar, in ath10k_install_peer_wep_keys()
387 arvif->ar->wmi.vdev_param->def_keyid, in ath10k_install_peer_wep_keys()
390 ath10k_warn(ar, "failed to re-set def wpa key idxon vdev %i: %d\n", in ath10k_install_peer_wep_keys()
401 struct ath10k *ar = arvif->ar; in ath10k_clear_peer_keys() local
408 lockdep_assert_held(&ar->conf_mutex); in ath10k_clear_peer_keys()
410 spin_lock_bh(&ar->data_lock); in ath10k_clear_peer_keys()
411 peer = ath10k_peer_find(ar, arvif->vdev_id, addr); in ath10k_clear_peer_keys()
412 spin_unlock_bh(&ar->data_lock); in ath10k_clear_peer_keys()
428 ath10k_warn(ar, "failed to remove peer wep key %d: %d\n", in ath10k_clear_peer_keys()
431 spin_lock_bh(&ar->data_lock); in ath10k_clear_peer_keys()
433 spin_unlock_bh(&ar->data_lock); in ath10k_clear_peer_keys()
439 bool ath10k_mac_is_peer_wep_key_set(struct ath10k *ar, const u8 *addr, in ath10k_mac_is_peer_wep_key_set() argument
445 lockdep_assert_held(&ar->data_lock); in ath10k_mac_is_peer_wep_key_set()
452 peer = ath10k_peer_find(ar, 0, addr); in ath10k_mac_is_peer_wep_key_set()
467 struct ath10k *ar = arvif->ar; in ath10k_clear_vdev_key() local
475 lockdep_assert_held(&ar->conf_mutex); in ath10k_clear_vdev_key()
481 spin_lock_bh(&ar->data_lock); in ath10k_clear_vdev_key()
483 list_for_each_entry(peer, &ar->peers, list) { in ath10k_clear_vdev_key()
495 spin_unlock_bh(&ar->data_lock); in ath10k_clear_vdev_key()
505 ath10k_warn(ar, "failed to remove key for %pM: %d\n", in ath10k_clear_vdev_key()
515 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_update_wep_key() local
519 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_vif_update_wep_key()
521 list_for_each_entry(peer, &ar->peers, list) { in ath10k_mac_vif_update_wep_key()
531 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vif vdev %i update key %i needs update\n", in ath10k_mac_vif_update_wep_key()
536 ath10k_warn(ar, "failed to update wep keys on vdev %i for peer %pM: %d\n", in ath10k_mac_vif_update_wep_key()
675 static int ath10k_mac_num_chanctxs(struct ath10k *ar) in ath10k_mac_num_chanctxs() argument
679 ieee80211_iter_chan_contexts_atomic(ar->hw, in ath10k_mac_num_chanctxs()
696 static void ath10k_wait_for_peer_delete_done(struct ath10k *ar, u32 vdev_id, in ath10k_wait_for_peer_delete_done() argument
702 if (test_bit(WMI_SERVICE_SYNC_DELETE_CMDS, ar->wmi.svc_map)) { in ath10k_wait_for_peer_delete_done()
703 ret = ath10k_wait_for_peer_deleted(ar, vdev_id, addr); in ath10k_wait_for_peer_delete_done()
705 ath10k_warn(ar, "failed wait for peer deleted"); in ath10k_wait_for_peer_delete_done()
709 time_left = wait_for_completion_timeout(&ar->peer_delete_done, in ath10k_wait_for_peer_delete_done()
712 ath10k_warn(ar, "Timeout in receiving peer delete response\n"); in ath10k_wait_for_peer_delete_done()
716 static int ath10k_peer_create(struct ath10k *ar, in ath10k_peer_create() argument
728 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_create()
730 num_peers = ar->num_peers; in ath10k_peer_create()
733 list_for_each_entry(arvif, &ar->arvifs, list) in ath10k_peer_create()
736 if (num_peers >= ar->max_num_peers) in ath10k_peer_create()
739 ret = ath10k_wmi_peer_create(ar, vdev_id, addr, peer_type); in ath10k_peer_create()
741 ath10k_warn(ar, "failed to create wmi peer %pM on vdev %i: %i\n", in ath10k_peer_create()
746 ret = ath10k_wait_for_peer_created(ar, vdev_id, addr); in ath10k_peer_create()
748 ath10k_warn(ar, "failed to wait for created wmi peer %pM on vdev %i: %i\n", in ath10k_peer_create()
753 spin_lock_bh(&ar->data_lock); in ath10k_peer_create()
755 peer = ath10k_peer_find(ar, vdev_id, addr); in ath10k_peer_create()
757 spin_unlock_bh(&ar->data_lock); in ath10k_peer_create()
758 ath10k_warn(ar, "failed to find peer %pM on vdev %i after creation\n", in ath10k_peer_create()
760 ath10k_wait_for_peer_delete_done(ar, vdev_id, addr); in ath10k_peer_create()
767 spin_unlock_bh(&ar->data_lock); in ath10k_peer_create()
769 ar->num_peers++; in ath10k_peer_create()
776 struct ath10k *ar = arvif->ar; in ath10k_mac_set_kickout() local
780 param = ar->wmi.pdev_param->sta_kickout_th; in ath10k_mac_set_kickout()
781 ret = ath10k_wmi_pdev_set_param(ar, param, in ath10k_mac_set_kickout()
784 ath10k_warn(ar, "failed to set kickout threshold on vdev %i: %d\n", in ath10k_mac_set_kickout()
789 param = ar->wmi.vdev_param->ap_keepalive_min_idle_inactive_time_secs; in ath10k_mac_set_kickout()
790 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param, in ath10k_mac_set_kickout()
793 ath10k_warn(ar, "failed to set keepalive minimum idle time on vdev %i: %d\n", in ath10k_mac_set_kickout()
798 param = ar->wmi.vdev_param->ap_keepalive_max_idle_inactive_time_secs; in ath10k_mac_set_kickout()
799 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param, in ath10k_mac_set_kickout()
802 ath10k_warn(ar, "failed to set keepalive maximum idle time on vdev %i: %d\n", in ath10k_mac_set_kickout()
807 param = ar->wmi.vdev_param->ap_keepalive_max_unresponsive_time_secs; in ath10k_mac_set_kickout()
808 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param, in ath10k_mac_set_kickout()
811 ath10k_warn(ar, "failed to set keepalive maximum unresponsive time on vdev %i: %d\n", in ath10k_mac_set_kickout()
821 struct ath10k *ar = arvif->ar; in ath10k_mac_set_rts() local
824 vdev_param = ar->wmi.vdev_param->rts_threshold; in ath10k_mac_set_rts()
825 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, value); in ath10k_mac_set_rts()
828 static int ath10k_peer_delete(struct ath10k *ar, u32 vdev_id, const u8 *addr) in ath10k_peer_delete() argument
832 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_delete()
834 ret = ath10k_wmi_peer_delete(ar, vdev_id, addr); in ath10k_peer_delete()
838 ret = ath10k_wait_for_peer_deleted(ar, vdev_id, addr); in ath10k_peer_delete()
842 if (test_bit(WMI_SERVICE_SYNC_DELETE_CMDS, ar->wmi.svc_map)) { in ath10k_peer_delete()
846 (&ar->peer_delete_done, 5 * HZ); in ath10k_peer_delete()
849 ath10k_warn(ar, "Timeout in receiving peer delete response\n"); in ath10k_peer_delete()
854 ar->num_peers--; in ath10k_peer_delete()
859 static void ath10k_peer_cleanup(struct ath10k *ar, u32 vdev_id) in ath10k_peer_cleanup() argument
865 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_cleanup()
867 spin_lock_bh(&ar->data_lock); in ath10k_peer_cleanup()
868 list_for_each_entry_safe(peer, tmp, &ar->peers, list) { in ath10k_peer_cleanup()
872 ath10k_warn(ar, "removing stale peer %pM from vdev_id %d\n", in ath10k_peer_cleanup()
877 ar->peer_map[peer_id] = NULL; in ath10k_peer_cleanup()
883 for (i = 0; i < ARRAY_SIZE(ar->peer_map); i++) { in ath10k_peer_cleanup()
884 if (ar->peer_map[i] == peer) { in ath10k_peer_cleanup()
885 ath10k_warn(ar, "removing stale peer_map entry for %pM (ptr %pK idx %d)\n", in ath10k_peer_cleanup()
887 ar->peer_map[i] = NULL; in ath10k_peer_cleanup()
893 ar->num_peers--; in ath10k_peer_cleanup()
895 spin_unlock_bh(&ar->data_lock); in ath10k_peer_cleanup()
898 static void ath10k_peer_cleanup_all(struct ath10k *ar) in ath10k_peer_cleanup_all() argument
903 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_cleanup_all()
905 spin_lock_bh(&ar->data_lock); in ath10k_peer_cleanup_all()
906 list_for_each_entry_safe(peer, tmp, &ar->peers, list) { in ath10k_peer_cleanup_all()
911 for (i = 0; i < ARRAY_SIZE(ar->peer_map); i++) in ath10k_peer_cleanup_all()
912 ar->peer_map[i] = NULL; in ath10k_peer_cleanup_all()
914 spin_unlock_bh(&ar->data_lock); in ath10k_peer_cleanup_all()
916 ar->num_peers = 0; in ath10k_peer_cleanup_all()
917 ar->num_stations = 0; in ath10k_peer_cleanup_all()
920 static int ath10k_mac_tdls_peer_update(struct ath10k *ar, u32 vdev_id, in ath10k_mac_tdls_peer_update() argument
929 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_tdls_peer_update()
942 ret = ath10k_wmi_tdls_peer_update(ar, &arg, &cap, &chan_arg); in ath10k_mac_tdls_peer_update()
944 ath10k_warn(ar, "failed to update tdls peer %pM on vdev %i: %i\n", in ath10k_mac_tdls_peer_update()
958 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_beacon_free() local
960 lockdep_assert_held(&ar->data_lock); in ath10k_mac_vif_beacon_free()
966 dma_unmap_single(ar->dev, ATH10K_SKB_CB(arvif->beacon)->paddr, in ath10k_mac_vif_beacon_free()
981 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_beacon_cleanup() local
983 lockdep_assert_held(&ar->data_lock); in ath10k_mac_vif_beacon_cleanup()
988 dma_free_coherent(ar->dev, IEEE80211_MAX_FRAME_LEN, in ath10k_mac_vif_beacon_cleanup()
994 static inline int ath10k_vdev_setup_sync(struct ath10k *ar) in ath10k_vdev_setup_sync() argument
998 lockdep_assert_held(&ar->conf_mutex); in ath10k_vdev_setup_sync()
1000 if (test_bit(ATH10K_FLAG_CRASH_FLUSH, &ar->dev_flags)) in ath10k_vdev_setup_sync()
1003 time_left = wait_for_completion_timeout(&ar->vdev_setup_done, in ath10k_vdev_setup_sync()
1008 return ar->last_wmi_vdev_start_status; in ath10k_vdev_setup_sync()
1011 static int ath10k_monitor_vdev_start(struct ath10k *ar, int vdev_id) in ath10k_monitor_vdev_start() argument
1018 lockdep_assert_held(&ar->conf_mutex); in ath10k_monitor_vdev_start()
1020 ieee80211_iter_chan_contexts_atomic(ar->hw, in ath10k_monitor_vdev_start()
1045 reinit_completion(&ar->vdev_setup_done); in ath10k_monitor_vdev_start()
1046 reinit_completion(&ar->vdev_delete_done); in ath10k_monitor_vdev_start()
1048 ret = ath10k_wmi_vdev_start(ar, &arg); in ath10k_monitor_vdev_start()
1050 ath10k_warn(ar, "failed to request monitor vdev %i start: %d\n", in ath10k_monitor_vdev_start()
1055 ret = ath10k_vdev_setup_sync(ar); in ath10k_monitor_vdev_start()
1057 ath10k_warn(ar, "failed to synchronize setup for monitor vdev %i start: %d\n", in ath10k_monitor_vdev_start()
1062 ret = ath10k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr); in ath10k_monitor_vdev_start()
1064 ath10k_warn(ar, "failed to put up monitor vdev %i: %d\n", in ath10k_monitor_vdev_start()
1069 ar->monitor_vdev_id = vdev_id; in ath10k_monitor_vdev_start()
1071 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %i started\n", in ath10k_monitor_vdev_start()
1072 ar->monitor_vdev_id); in ath10k_monitor_vdev_start()
1076 ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id); in ath10k_monitor_vdev_start()
1078 ath10k_warn(ar, "failed to stop monitor vdev %i after start failure: %d\n", in ath10k_monitor_vdev_start()
1079 ar->monitor_vdev_id, ret); in ath10k_monitor_vdev_start()
1084 static int ath10k_monitor_vdev_stop(struct ath10k *ar) in ath10k_monitor_vdev_stop() argument
1088 lockdep_assert_held(&ar->conf_mutex); in ath10k_monitor_vdev_stop()
1090 ret = ath10k_wmi_vdev_down(ar, ar->monitor_vdev_id); in ath10k_monitor_vdev_stop()
1092 ath10k_warn(ar, "failed to put down monitor vdev %i: %d\n", in ath10k_monitor_vdev_stop()
1093 ar->monitor_vdev_id, ret); in ath10k_monitor_vdev_stop()
1095 reinit_completion(&ar->vdev_setup_done); in ath10k_monitor_vdev_stop()
1096 reinit_completion(&ar->vdev_delete_done); in ath10k_monitor_vdev_stop()
1098 ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id); in ath10k_monitor_vdev_stop()
1100 ath10k_warn(ar, "failed to to request monitor vdev %i stop: %d\n", in ath10k_monitor_vdev_stop()
1101 ar->monitor_vdev_id, ret); in ath10k_monitor_vdev_stop()
1103 ret = ath10k_vdev_setup_sync(ar); in ath10k_monitor_vdev_stop()
1105 ath10k_warn(ar, "failed to synchronize monitor vdev %i stop: %d\n", in ath10k_monitor_vdev_stop()
1106 ar->monitor_vdev_id, ret); in ath10k_monitor_vdev_stop()
1108 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %i stopped\n", in ath10k_monitor_vdev_stop()
1109 ar->monitor_vdev_id); in ath10k_monitor_vdev_stop()
1113 static int ath10k_monitor_vdev_create(struct ath10k *ar) in ath10k_monitor_vdev_create() argument
1117 lockdep_assert_held(&ar->conf_mutex); in ath10k_monitor_vdev_create()
1119 if (ar->free_vdev_map == 0) { in ath10k_monitor_vdev_create()
1120 ath10k_warn(ar, "failed to find free vdev id for monitor vdev\n"); in ath10k_monitor_vdev_create()
1124 bit = __ffs64(ar->free_vdev_map); in ath10k_monitor_vdev_create()
1126 ar->monitor_vdev_id = bit; in ath10k_monitor_vdev_create()
1128 ret = ath10k_wmi_vdev_create(ar, ar->monitor_vdev_id, in ath10k_monitor_vdev_create()
1130 0, ar->mac_addr); in ath10k_monitor_vdev_create()
1132 ath10k_warn(ar, "failed to request monitor vdev %i creation: %d\n", in ath10k_monitor_vdev_create()
1133 ar->monitor_vdev_id, ret); in ath10k_monitor_vdev_create()
1137 ar->free_vdev_map &= ~(1LL << ar->monitor_vdev_id); in ath10k_monitor_vdev_create()
1138 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %d created\n", in ath10k_monitor_vdev_create()
1139 ar->monitor_vdev_id); in ath10k_monitor_vdev_create()
1144 static int ath10k_monitor_vdev_delete(struct ath10k *ar) in ath10k_monitor_vdev_delete() argument
1148 lockdep_assert_held(&ar->conf_mutex); in ath10k_monitor_vdev_delete()
1150 ret = ath10k_wmi_vdev_delete(ar, ar->monitor_vdev_id); in ath10k_monitor_vdev_delete()
1152 ath10k_warn(ar, "failed to request wmi monitor vdev %i removal: %d\n", in ath10k_monitor_vdev_delete()
1153 ar->monitor_vdev_id, ret); in ath10k_monitor_vdev_delete()
1157 ar->free_vdev_map |= 1LL << ar->monitor_vdev_id; in ath10k_monitor_vdev_delete()
1159 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %d deleted\n", in ath10k_monitor_vdev_delete()
1160 ar->monitor_vdev_id); in ath10k_monitor_vdev_delete()
1164 static int ath10k_monitor_start(struct ath10k *ar) in ath10k_monitor_start() argument
1168 lockdep_assert_held(&ar->conf_mutex); in ath10k_monitor_start()
1170 ret = ath10k_monitor_vdev_create(ar); in ath10k_monitor_start()
1172 ath10k_warn(ar, "failed to create monitor vdev: %d\n", ret); in ath10k_monitor_start()
1176 ret = ath10k_monitor_vdev_start(ar, ar->monitor_vdev_id); in ath10k_monitor_start()
1178 ath10k_warn(ar, "failed to start monitor vdev: %d\n", ret); in ath10k_monitor_start()
1179 ath10k_monitor_vdev_delete(ar); in ath10k_monitor_start()
1183 ar->monitor_started = true; in ath10k_monitor_start()
1184 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor started\n"); in ath10k_monitor_start()
1189 static int ath10k_monitor_stop(struct ath10k *ar) in ath10k_monitor_stop() argument
1193 lockdep_assert_held(&ar->conf_mutex); in ath10k_monitor_stop()
1195 ret = ath10k_monitor_vdev_stop(ar); in ath10k_monitor_stop()
1197 ath10k_warn(ar, "failed to stop monitor vdev: %d\n", ret); in ath10k_monitor_stop()
1201 ret = ath10k_monitor_vdev_delete(ar); in ath10k_monitor_stop()
1203 ath10k_warn(ar, "failed to delete monitor vdev: %d\n", ret); in ath10k_monitor_stop()
1207 ar->monitor_started = false; in ath10k_monitor_stop()
1208 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor stopped\n"); in ath10k_monitor_stop()
1213 static bool ath10k_mac_monitor_vdev_is_needed(struct ath10k *ar) in ath10k_mac_monitor_vdev_is_needed() argument
1220 num_ctx = ath10k_mac_num_chanctxs(ar); in ath10k_mac_monitor_vdev_is_needed()
1227 if (ar->monitor_arvif) in ath10k_mac_monitor_vdev_is_needed()
1230 return ar->monitor || in ath10k_mac_monitor_vdev_is_needed()
1232 ar->running_fw->fw_file.fw_features) && in ath10k_mac_monitor_vdev_is_needed()
1233 (ar->filter_flags & FIF_OTHER_BSS)) || in ath10k_mac_monitor_vdev_is_needed()
1234 test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags); in ath10k_mac_monitor_vdev_is_needed()
1237 static bool ath10k_mac_monitor_vdev_is_allowed(struct ath10k *ar) in ath10k_mac_monitor_vdev_is_allowed() argument
1241 num_ctx = ath10k_mac_num_chanctxs(ar); in ath10k_mac_monitor_vdev_is_allowed()
1247 if (test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags) && num_ctx > 1) in ath10k_mac_monitor_vdev_is_allowed()
1253 static int ath10k_monitor_recalc(struct ath10k *ar) in ath10k_monitor_recalc() argument
1259 lockdep_assert_held(&ar->conf_mutex); in ath10k_monitor_recalc()
1261 needed = ath10k_mac_monitor_vdev_is_needed(ar); in ath10k_monitor_recalc()
1262 allowed = ath10k_mac_monitor_vdev_is_allowed(ar); in ath10k_monitor_recalc()
1264 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_monitor_recalc()
1266 ar->monitor_started, needed, allowed); in ath10k_monitor_recalc()
1269 if (ar->monitor_started) { in ath10k_monitor_recalc()
1270 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor stopping disallowed monitor\n"); in ath10k_monitor_recalc()
1272 ret = ath10k_monitor_stop(ar); in ath10k_monitor_recalc()
1274 ath10k_warn(ar, "failed to stop disallowed monitor: %d\n", in ath10k_monitor_recalc()
1282 if (needed == ar->monitor_started) in ath10k_monitor_recalc()
1286 return ath10k_monitor_start(ar); in ath10k_monitor_recalc()
1288 return ath10k_monitor_stop(ar); in ath10k_monitor_recalc()
1293 struct ath10k *ar = arvif->ar; in ath10k_mac_can_set_cts_prot() local
1295 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_can_set_cts_prot()
1298 ath10k_dbg(ar, ATH10K_DBG_MAC, "defer cts setup, vdev is not ready yet\n"); in ath10k_mac_can_set_cts_prot()
1307 struct ath10k *ar = arvif->ar; in ath10k_mac_set_cts_prot() local
1310 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_set_cts_prot()
1312 vdev_param = ar->wmi.vdev_param->protection_mode; in ath10k_mac_set_cts_prot()
1314 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d cts_protection %d\n", in ath10k_mac_set_cts_prot()
1317 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_mac_set_cts_prot()
1323 struct ath10k *ar = arvif->ar; in ath10k_recalc_rtscts_prot() local
1326 lockdep_assert_held(&ar->conf_mutex); in ath10k_recalc_rtscts_prot()
1328 vdev_param = ar->wmi.vdev_param->enable_rtscts; in ath10k_recalc_rtscts_prot()
1339 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d recalc rts/cts prot %d\n", in ath10k_recalc_rtscts_prot()
1342 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_recalc_rtscts_prot()
1346 static int ath10k_start_cac(struct ath10k *ar) in ath10k_start_cac() argument
1350 lockdep_assert_held(&ar->conf_mutex); in ath10k_start_cac()
1352 set_bit(ATH10K_CAC_RUNNING, &ar->dev_flags); in ath10k_start_cac()
1354 ret = ath10k_monitor_recalc(ar); in ath10k_start_cac()
1356 ath10k_warn(ar, "failed to start monitor (cac): %d\n", ret); in ath10k_start_cac()
1357 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags); in ath10k_start_cac()
1361 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac cac start monitor vdev %d\n", in ath10k_start_cac()
1362 ar->monitor_vdev_id); in ath10k_start_cac()
1367 static int ath10k_stop_cac(struct ath10k *ar) in ath10k_stop_cac() argument
1369 lockdep_assert_held(&ar->conf_mutex); in ath10k_stop_cac()
1372 if (!test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags)) in ath10k_stop_cac()
1375 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags); in ath10k_stop_cac()
1376 ath10k_monitor_stop(ar); in ath10k_stop_cac()
1378 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac cac finished\n"); in ath10k_stop_cac()
1393 static bool ath10k_mac_has_radar_enabled(struct ath10k *ar) in ath10k_mac_has_radar_enabled() argument
1397 ieee80211_iter_chan_contexts_atomic(ar->hw, in ath10k_mac_has_radar_enabled()
1404 static void ath10k_recalc_radar_detection(struct ath10k *ar) in ath10k_recalc_radar_detection() argument
1408 lockdep_assert_held(&ar->conf_mutex); in ath10k_recalc_radar_detection()
1410 ath10k_stop_cac(ar); in ath10k_recalc_radar_detection()
1412 if (!ath10k_mac_has_radar_enabled(ar)) in ath10k_recalc_radar_detection()
1415 if (ar->num_started_vdevs > 0) in ath10k_recalc_radar_detection()
1418 ret = ath10k_start_cac(ar); in ath10k_recalc_radar_detection()
1425 ath10k_warn(ar, "failed to start CAC: %d\n", ret); in ath10k_recalc_radar_detection()
1426 ieee80211_radar_detected(ar->hw); in ath10k_recalc_radar_detection()
1432 struct ath10k *ar = arvif->ar; in ath10k_vdev_stop() local
1435 lockdep_assert_held(&ar->conf_mutex); in ath10k_vdev_stop()
1437 reinit_completion(&ar->vdev_setup_done); in ath10k_vdev_stop()
1438 reinit_completion(&ar->vdev_delete_done); in ath10k_vdev_stop()
1440 ret = ath10k_wmi_vdev_stop(ar, arvif->vdev_id); in ath10k_vdev_stop()
1442 ath10k_warn(ar, "failed to stop WMI vdev %i: %d\n", in ath10k_vdev_stop()
1447 ret = ath10k_vdev_setup_sync(ar); in ath10k_vdev_stop()
1449 ath10k_warn(ar, "failed to synchronize setup for vdev %i: %d\n", in ath10k_vdev_stop()
1454 WARN_ON(ar->num_started_vdevs == 0); in ath10k_vdev_stop()
1456 if (ar->num_started_vdevs != 0) { in ath10k_vdev_stop()
1457 ar->num_started_vdevs--; in ath10k_vdev_stop()
1458 ath10k_recalc_radar_detection(ar); in ath10k_vdev_stop()
1468 struct ath10k *ar = arvif->ar; in ath10k_vdev_start_restart() local
1472 lockdep_assert_held(&ar->conf_mutex); in ath10k_vdev_start_restart()
1474 reinit_completion(&ar->vdev_setup_done); in ath10k_vdev_start_restart()
1475 reinit_completion(&ar->vdev_delete_done); in ath10k_vdev_start_restart()
1504 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_vdev_start_restart()
1510 ret = ath10k_wmi_vdev_restart(ar, &arg); in ath10k_vdev_start_restart()
1512 ret = ath10k_wmi_vdev_start(ar, &arg); in ath10k_vdev_start_restart()
1515 ath10k_warn(ar, "failed to start WMI vdev %i: %d\n", in ath10k_vdev_start_restart()
1520 ret = ath10k_vdev_setup_sync(ar); in ath10k_vdev_start_restart()
1522 ath10k_warn(ar, in ath10k_vdev_start_restart()
1528 ar->num_started_vdevs++; in ath10k_vdev_start_restart()
1529 ath10k_recalc_radar_detection(ar); in ath10k_vdev_start_restart()
1549 struct ath10k *ar = arvif->ar; in ath10k_mac_setup_bcn_p2p_ie() local
1565 ret = ath10k_wmi_p2p_go_bcn_ie(ar, arvif->vdev_id, p2p_ie); in ath10k_mac_setup_bcn_p2p_ie()
1567 ath10k_warn(ar, "failed to submit p2p go bcn ie for vdev %i: %d\n", in ath10k_mac_setup_bcn_p2p_ie()
1607 struct ath10k *ar = arvif->ar; in ath10k_mac_setup_bcn_tmpl() local
1608 struct ieee80211_hw *hw = ar->hw; in ath10k_mac_setup_bcn_tmpl()
1614 if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map)) in ath10k_mac_setup_bcn_tmpl()
1623 ath10k_warn(ar, "failed to get beacon template from mac80211\n"); in ath10k_mac_setup_bcn_tmpl()
1629 ath10k_warn(ar, "failed to setup p2p go bcn ie: %d\n", ret); in ath10k_mac_setup_bcn_tmpl()
1642 ret = ath10k_wmi_bcn_tmpl(ar, arvif->vdev_id, offs.tim_offset, bcn, 0, in ath10k_mac_setup_bcn_tmpl()
1647 ath10k_warn(ar, "failed to submit beacon template command: %d\n", in ath10k_mac_setup_bcn_tmpl()
1657 struct ath10k *ar = arvif->ar; in ath10k_mac_setup_prb_tmpl() local
1658 struct ieee80211_hw *hw = ar->hw; in ath10k_mac_setup_prb_tmpl()
1663 if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map)) in ath10k_mac_setup_prb_tmpl()
1675 ath10k_warn(ar, "failed to get probe resp template from mac80211\n"); in ath10k_mac_setup_prb_tmpl()
1679 ret = ath10k_wmi_prb_tmpl(ar, arvif->vdev_id, prb); in ath10k_mac_setup_prb_tmpl()
1683 ath10k_warn(ar, "failed to submit probe resp template command: %d\n", in ath10k_mac_setup_prb_tmpl()
1693 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_fix_hidden_ssid() local
1712 if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map)) in ath10k_mac_vif_fix_hidden_ssid()
1724 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id); in ath10k_mac_vif_fix_hidden_ssid()
1726 ath10k_warn(ar, "failed to bring down ap vdev %i: %d\n", in ath10k_mac_vif_fix_hidden_ssid()
1737 ath10k_warn(ar, "failed to update beacon template: %d\n", ret); in ath10k_mac_vif_fix_hidden_ssid()
1743 ath10k_warn(ar, "failed to update presp template: %d\n", ret); in ath10k_mac_vif_fix_hidden_ssid()
1749 ath10k_warn(ar, "failed to restart ap vdev %i: %d\n", in ath10k_mac_vif_fix_hidden_ssid()
1754 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid, in ath10k_mac_vif_fix_hidden_ssid()
1757 ath10k_warn(ar, "failed to bring up ap vdev %i: %d\n", in ath10k_mac_vif_fix_hidden_ssid()
1768 struct ath10k *ar = arvif->ar; in ath10k_control_beaconing() local
1771 lockdep_assert_held(&arvif->ar->conf_mutex); in ath10k_control_beaconing()
1774 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id); in ath10k_control_beaconing()
1776 ath10k_warn(ar, "failed to down vdev_id %i: %d\n", in ath10k_control_beaconing()
1781 spin_lock_bh(&arvif->ar->data_lock); in ath10k_control_beaconing()
1783 spin_unlock_bh(&arvif->ar->data_lock); in ath10k_control_beaconing()
1793 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid, in ath10k_control_beaconing()
1796 ath10k_warn(ar, "failed to bring up vdev %d: %i\n", in ath10k_control_beaconing()
1805 ath10k_warn(ar, "failed to fix hidden ssid for vdev %i, expect trouble: %d\n", in ath10k_control_beaconing()
1810 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d up\n", arvif->vdev_id); in ath10k_control_beaconing()
1817 struct ath10k *ar = arvif->ar; in ath10k_control_ibss() local
1821 lockdep_assert_held(&arvif->ar->conf_mutex); in ath10k_control_ibss()
1832 vdev_param = arvif->ar->wmi.vdev_param->atim_window; in ath10k_control_ibss()
1833 ret = ath10k_wmi_vdev_set_param(arvif->ar, arvif->vdev_id, vdev_param, in ath10k_control_ibss()
1836 ath10k_warn(ar, "failed to set IBSS ATIM for vdev %d: %d\n", in ath10k_control_ibss()
1842 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_recalc_ps_wake_threshold() local
1847 lockdep_assert_held(&arvif->ar->conf_mutex); in ath10k_mac_vif_recalc_ps_wake_threshold()
1855 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param, value); in ath10k_mac_vif_recalc_ps_wake_threshold()
1857 ath10k_warn(ar, "failed to submit ps wake threshold %u on vdev %i: %d\n", in ath10k_mac_vif_recalc_ps_wake_threshold()
1867 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_recalc_ps_poll_count() local
1872 lockdep_assert_held(&arvif->ar->conf_mutex); in ath10k_mac_vif_recalc_ps_poll_count()
1880 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath10k_mac_vif_recalc_ps_poll_count()
1883 ath10k_warn(ar, "failed to submit ps poll count %u on vdev %i: %d\n", in ath10k_mac_vif_recalc_ps_poll_count()
1891 static int ath10k_mac_num_vifs_started(struct ath10k *ar) in ath10k_mac_num_vifs_started() argument
1896 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_num_vifs_started()
1898 list_for_each_entry(arvif, &ar->arvifs, list) in ath10k_mac_num_vifs_started()
1907 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_setup_ps() local
1909 struct ieee80211_conf *conf = &ar->hw->conf; in ath10k_mac_vif_setup_ps()
1916 lockdep_assert_held(&arvif->ar->conf_mutex); in ath10k_mac_vif_setup_ps()
1923 if (enable_ps && ath10k_mac_num_vifs_started(ar) > 1 && in ath10k_mac_vif_setup_ps()
1925 ar->running_fw->fw_file.fw_features)) { in ath10k_mac_vif_setup_ps()
1926 ath10k_warn(ar, "refusing to enable ps on vdev %i: not supported by fw\n", in ath10k_mac_vif_setup_ps()
1949 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param, in ath10k_mac_vif_setup_ps()
1952 ath10k_warn(ar, "failed to set inactivity time for vdev %d: %i\n", in ath10k_mac_vif_setup_ps()
1960 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d psmode %s\n", in ath10k_mac_vif_setup_ps()
1963 ret = ath10k_wmi_set_psmode(ar, arvif->vdev_id, psmode); in ath10k_mac_vif_setup_ps()
1965 ath10k_warn(ar, "failed to set PS Mode %d for vdev %d: %d\n", in ath10k_mac_vif_setup_ps()
1975 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_disable_keepalive() local
1979 lockdep_assert_held(&arvif->ar->conf_mutex); in ath10k_mac_vif_disable_keepalive()
1984 if (!test_bit(WMI_SERVICE_STA_KEEP_ALIVE, ar->wmi.svc_map)) in ath10k_mac_vif_disable_keepalive()
1995 ret = ath10k_wmi_sta_keepalive(ar, &arg); in ath10k_mac_vif_disable_keepalive()
1997 ath10k_warn(ar, "failed to submit keepalive on vdev %i: %d\n", in ath10k_mac_vif_disable_keepalive()
2007 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_ap_csa_count_down() local
2011 lockdep_assert_held(&arvif->ar->conf_mutex); in ath10k_mac_vif_ap_csa_count_down()
2013 if (WARN_ON(!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map))) in ath10k_mac_vif_ap_csa_count_down()
2030 ath10k_warn(ar, "failed to update bcn tmpl during csa: %d\n", in ath10k_mac_vif_ap_csa_count_down()
2035 ath10k_warn(ar, "failed to update prb tmpl during csa: %d\n", in ath10k_mac_vif_ap_csa_count_down()
2046 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_ap_csa_work() local
2048 mutex_lock(&ar->conf_mutex); in ath10k_mac_vif_ap_csa_work()
2050 mutex_unlock(&ar->conf_mutex); in ath10k_mac_vif_ap_csa_work()
2069 void ath10k_mac_handle_beacon(struct ath10k *ar, struct sk_buff *skb) in ath10k_mac_handle_beacon() argument
2071 ieee80211_iterate_active_interfaces_atomic(ar->hw, in ath10k_mac_handle_beacon()
2082 struct ath10k *ar = arvif->ar; in ath10k_mac_handle_beacon_miss_iter() local
2083 struct ieee80211_hw *hw = ar->hw; in ath10k_mac_handle_beacon_miss_iter()
2102 void ath10k_mac_handle_beacon_miss(struct ath10k *ar, u32 vdev_id) in ath10k_mac_handle_beacon_miss() argument
2104 ieee80211_iterate_active_interfaces_atomic(ar->hw, in ath10k_mac_handle_beacon_miss()
2126 static u32 ath10k_peer_assoc_h_listen_intval(struct ath10k *ar, in ath10k_peer_assoc_h_listen_intval() argument
2140 return ar->hw->conf.listen_interval; in ath10k_peer_assoc_h_listen_intval()
2143 static void ath10k_peer_assoc_h_basic(struct ath10k *ar, in ath10k_peer_assoc_h_basic() argument
2151 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_assoc_h_basic()
2161 arg->peer_flags |= arvif->ar->wmi.peer_flags->auth; in ath10k_peer_assoc_h_basic()
2162 arg->peer_listen_intval = ath10k_peer_assoc_h_listen_intval(ar, vif); in ath10k_peer_assoc_h_basic()
2167 static void ath10k_peer_assoc_h_crypto(struct ath10k *ar, in ath10k_peer_assoc_h_crypto() argument
2178 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_assoc_h_crypto()
2183 bss = cfg80211_get_bss(ar->hw->wiphy, def.chan, info->bssid, NULL, 0, in ath10k_peer_assoc_h_crypto()
2198 cfg80211_put_bss(ar->hw->wiphy, bss); in ath10k_peer_assoc_h_crypto()
2203 ath10k_dbg(ar, ATH10K_DBG_WMI, "%s: rsn ie found\n", __func__); in ath10k_peer_assoc_h_crypto()
2204 arg->peer_flags |= ar->wmi.peer_flags->need_ptk_4_way; in ath10k_peer_assoc_h_crypto()
2208 ath10k_dbg(ar, ATH10K_DBG_WMI, "%s: wpa ie found\n", __func__); in ath10k_peer_assoc_h_crypto()
2209 arg->peer_flags |= ar->wmi.peer_flags->need_gtk_2_way; in ath10k_peer_assoc_h_crypto()
2214 ar->running_fw->fw_file.fw_features)) { in ath10k_peer_assoc_h_crypto()
2215 arg->peer_flags |= ar->wmi.peer_flags->pmf; in ath10k_peer_assoc_h_crypto()
2219 static void ath10k_peer_assoc_h_rates(struct ath10k *ar, in ath10k_peer_assoc_h_rates() argument
2234 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_assoc_h_rates()
2240 sband = ar->hw->wiphy->bands[band]; in ath10k_peer_assoc_h_rates()
2281 static void ath10k_peer_assoc_h_ht(struct ath10k *ar, in ath10k_peer_assoc_h_ht() argument
2296 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_assoc_h_ht()
2312 arg->peer_flags |= ar->wmi.peer_flags->ht; in ath10k_peer_assoc_h_ht()
2323 arg->peer_flags |= ar->wmi.peer_flags->ldbc; in ath10k_peer_assoc_h_ht()
2326 arg->peer_flags |= ar->wmi.peer_flags->bw40; in ath10k_peer_assoc_h_ht()
2340 arg->peer_flags |= ar->wmi.peer_flags->stbc; in ath10k_peer_assoc_h_ht()
2348 arg->peer_flags |= ar->wmi.peer_flags->stbc; in ath10k_peer_assoc_h_ht()
2381 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n", in ath10k_peer_assoc_h_ht()
2387 static int ath10k_peer_assoc_qos_ap(struct ath10k *ar, in ath10k_peer_assoc_qos_ap() argument
2395 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_assoc_qos_ap()
2398 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac uapsd_queues 0x%x max_sp %d\n", in ath10k_peer_assoc_qos_ap()
2417 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id, in ath10k_peer_assoc_qos_ap()
2422 ath10k_warn(ar, "failed to set ap ps peer param uapsd for vdev %i: %d\n", in ath10k_peer_assoc_qos_ap()
2427 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id, in ath10k_peer_assoc_qos_ap()
2432 ath10k_warn(ar, "failed to set ap ps peer param max sp for vdev %i: %d\n", in ath10k_peer_assoc_qos_ap()
2442 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id, sta->addr, in ath10k_peer_assoc_qos_ap()
2446 ath10k_warn(ar, "failed to set ap ps peer param ageout time for vdev %i: %d\n", in ath10k_peer_assoc_qos_ap()
2506 static void ath10k_peer_assoc_h_vht(struct ath10k *ar, in ath10k_peer_assoc_h_vht() argument
2532 arg->peer_flags |= ar->wmi.peer_flags->vht; in ath10k_peer_assoc_h_vht()
2535 arg->peer_flags |= ar->wmi.peer_flags->vht_2g; in ath10k_peer_assoc_h_vht()
2553 arg->peer_flags |= ar->wmi.peer_flags->bw80; in ath10k_peer_assoc_h_vht()
2556 arg->peer_flags |= ar->wmi.peer_flags->bw160; in ath10k_peer_assoc_h_vht()
2579 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vht peer %pM max_mpdu %d flags 0x%x\n", in ath10k_peer_assoc_h_vht()
2597 static void ath10k_peer_assoc_h_qos(struct ath10k *ar, in ath10k_peer_assoc_h_qos() argument
2607 arg->peer_flags |= arvif->ar->wmi.peer_flags->qos; in ath10k_peer_assoc_h_qos()
2610 arg->peer_flags |= arvif->ar->wmi.peer_flags->apsd; in ath10k_peer_assoc_h_qos()
2616 arg->peer_flags |= arvif->ar->wmi.peer_flags->qos; in ath10k_peer_assoc_h_qos()
2620 arg->peer_flags |= arvif->ar->wmi.peer_flags->qos; in ath10k_peer_assoc_h_qos()
2626 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac peer %pM qos %d\n", in ath10k_peer_assoc_h_qos()
2628 arvif->ar->wmi.peer_flags->qos)); in ath10k_peer_assoc_h_qos()
2637 static enum wmi_phy_mode ath10k_mac_get_phymode_vht(struct ath10k *ar, in ath10k_mac_get_phymode_vht() argument
2664 static void ath10k_peer_assoc_h_phymode(struct ath10k *ar, in ath10k_peer_assoc_h_phymode() argument
2710 phymode = ath10k_mac_get_phymode_vht(ar, sta); in ath10k_peer_assoc_h_phymode()
2726 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac peer %pM phymode %s\n", in ath10k_peer_assoc_h_phymode()
2733 static int ath10k_peer_assoc_prepare(struct ath10k *ar, in ath10k_peer_assoc_prepare() argument
2738 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_assoc_prepare()
2742 ath10k_peer_assoc_h_basic(ar, vif, sta, arg); in ath10k_peer_assoc_prepare()
2743 ath10k_peer_assoc_h_crypto(ar, vif, sta, arg); in ath10k_peer_assoc_prepare()
2744 ath10k_peer_assoc_h_rates(ar, vif, sta, arg); in ath10k_peer_assoc_prepare()
2745 ath10k_peer_assoc_h_ht(ar, vif, sta, arg); in ath10k_peer_assoc_prepare()
2746 ath10k_peer_assoc_h_vht(ar, vif, sta, arg); in ath10k_peer_assoc_prepare()
2747 ath10k_peer_assoc_h_qos(ar, vif, sta, arg); in ath10k_peer_assoc_prepare()
2748 ath10k_peer_assoc_h_phymode(ar, vif, sta, arg); in ath10k_peer_assoc_prepare()
2760 static int ath10k_setup_peer_smps(struct ath10k *ar, struct ath10k_vif *arvif, in ath10k_setup_peer_smps() argument
2775 return ath10k_wmi_peer_set_param(ar, arvif->vdev_id, addr, in ath10k_setup_peer_smps()
2780 static int ath10k_mac_vif_recalc_txbf(struct ath10k *ar, in ath10k_mac_vif_recalc_txbf() argument
2789 if (ath10k_wmi_get_txbf_conf_scheme(ar) != WMI_TXBF_CONF_AFTER_ASSOC) in ath10k_mac_vif_recalc_txbf()
2792 if (!(ar->vht_cap_info & in ath10k_mac_vif_recalc_txbf()
2799 param = ar->wmi.vdev_param->txbf; in ath10k_mac_vif_recalc_txbf()
2809 if (ar->vht_cap_info & in ath10k_mac_vif_recalc_txbf()
2819 if (ar->vht_cap_info & in ath10k_mac_vif_recalc_txbf()
2835 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param, value); in ath10k_mac_vif_recalc_txbf()
2837 ath10k_warn(ar, "failed to submit vdev param txbf 0x%x: %d\n", in ath10k_mac_vif_recalc_txbf()
2850 struct ath10k *ar = hw->priv; in ath10k_bss_assoc() local
2858 lockdep_assert_held(&ar->conf_mutex); in ath10k_bss_assoc()
2860 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i assoc bssid %pM aid %d\n", in ath10k_bss_assoc()
2867 ath10k_warn(ar, "failed to find station entry for bss %pM vdev %i\n", in ath10k_bss_assoc()
2879 ret = ath10k_peer_assoc_prepare(ar, vif, ap_sta, &peer_arg); in ath10k_bss_assoc()
2881 ath10k_warn(ar, "failed to prepare peer assoc for %pM vdev %i: %d\n", in ath10k_bss_assoc()
2889 ret = ath10k_wmi_peer_assoc(ar, &peer_arg); in ath10k_bss_assoc()
2891 ath10k_warn(ar, "failed to run peer assoc for %pM vdev %i: %d\n", in ath10k_bss_assoc()
2896 ret = ath10k_setup_peer_smps(ar, arvif, bss_conf->bssid, &ht_cap); in ath10k_bss_assoc()
2898 ath10k_warn(ar, "failed to setup peer SMPS for vdev %i: %d\n", in ath10k_bss_assoc()
2903 ret = ath10k_mac_vif_recalc_txbf(ar, vif, vht_cap); in ath10k_bss_assoc()
2905 ath10k_warn(ar, "failed to recalc txbf for vdev %i on bss %pM: %d\n", in ath10k_bss_assoc()
2910 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_bss_assoc()
2919 ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid); in ath10k_bss_assoc()
2921 ath10k_warn(ar, "failed to set vdev %d up: %d\n", in ath10k_bss_assoc()
2932 ret = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, arvif->bssid, in ath10k_bss_assoc()
2935 ath10k_warn(ar, "failed to poke peer %pM param for ps workaround on vdev %i: %d\n", in ath10k_bss_assoc()
2944 struct ath10k *ar = hw->priv; in ath10k_bss_disassoc() local
2949 lockdep_assert_held(&ar->conf_mutex); in ath10k_bss_disassoc()
2951 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i disassoc bssid %pM\n", in ath10k_bss_disassoc()
2954 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id); in ath10k_bss_disassoc()
2956 ath10k_warn(ar, "failed to down vdev %i: %d\n", in ath10k_bss_disassoc()
2961 ret = ath10k_mac_vif_recalc_txbf(ar, vif, vht_cap); in ath10k_bss_disassoc()
2963 ath10k_warn(ar, "failed to recalc txbf for vdev %i: %d\n", in ath10k_bss_disassoc()
2973 static int ath10k_station_assoc(struct ath10k *ar, in ath10k_station_assoc() argument
2982 lockdep_assert_held(&ar->conf_mutex); in ath10k_station_assoc()
2984 ret = ath10k_peer_assoc_prepare(ar, vif, sta, &peer_arg); in ath10k_station_assoc()
2986 ath10k_warn(ar, "failed to prepare WMI peer assoc for %pM vdev %i: %i\n", in ath10k_station_assoc()
2991 ret = ath10k_wmi_peer_assoc(ar, &peer_arg); in ath10k_station_assoc()
2993 ath10k_warn(ar, "failed to run peer assoc for STA %pM vdev %i: %d\n", in ath10k_station_assoc()
3002 ret = ath10k_setup_peer_smps(ar, arvif, sta->addr, in ath10k_station_assoc()
3005 ath10k_warn(ar, "failed to setup peer SMPS for vdev %d: %d\n", in ath10k_station_assoc()
3010 ret = ath10k_peer_assoc_qos_ap(ar, arvif, sta); in ath10k_station_assoc()
3012 ath10k_warn(ar, "failed to set qos params for STA %pM for vdev %i: %d\n", in ath10k_station_assoc()
3021 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n", in ath10k_station_assoc()
3031 ath10k_warn(ar, "failed to install peer wep keys for vdev %i: %d\n", in ath10k_station_assoc()
3041 static int ath10k_station_disassoc(struct ath10k *ar, in ath10k_station_disassoc() argument
3048 lockdep_assert_held(&ar->conf_mutex); in ath10k_station_disassoc()
3054 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n", in ath10k_station_disassoc()
3062 ath10k_warn(ar, "failed to clear all peer wep keys for vdev %i: %d\n", in ath10k_station_disassoc()
3074 static int ath10k_update_channel_list(struct ath10k *ar) in ath10k_update_channel_list() argument
3076 struct ieee80211_hw *hw = ar->hw; in ath10k_update_channel_list()
3087 lockdep_assert_held(&ar->conf_mutex); in ath10k_update_channel_list()
3163 ath10k_dbg(ar, ATH10K_DBG_WMI, in ath10k_update_channel_list()
3173 ret = ath10k_wmi_scan_chan_list(ar, &arg); in ath10k_update_channel_list()
3195 static void ath10k_regd_update(struct ath10k *ar) in ath10k_regd_update() argument
3202 lockdep_assert_held(&ar->conf_mutex); in ath10k_regd_update()
3204 ret = ath10k_update_channel_list(ar); in ath10k_regd_update()
3206 ath10k_warn(ar, "failed to update channel list: %d\n", ret); in ath10k_regd_update()
3208 regpair = ar->ath_common.regulatory.regpair; in ath10k_regd_update()
3210 if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) { in ath10k_regd_update()
3211 nl_dfs_reg = ar->dfs_detector->region; in ath10k_regd_update()
3220 ret = ath10k_wmi_pdev_set_regdomain(ar, in ath10k_regd_update()
3228 ath10k_warn(ar, "failed to set pdev regdomain: %d\n", ret); in ath10k_regd_update()
3231 static void ath10k_mac_update_channel_list(struct ath10k *ar, in ath10k_mac_update_channel_list() argument
3236 if (ar->low_5ghz_chan && ar->high_5ghz_chan) { in ath10k_mac_update_channel_list()
3238 if (band->channels[i].center_freq < ar->low_5ghz_chan || in ath10k_mac_update_channel_list()
3239 band->channels[i].center_freq > ar->high_5ghz_chan) in ath10k_mac_update_channel_list()
3250 struct ath10k *ar = hw->priv; in ath10k_reg_notifier() local
3253 ath_reg_notifier_apply(wiphy, request, &ar->ath_common.regulatory); in ath10k_reg_notifier()
3255 if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) { in ath10k_reg_notifier()
3256 ath10k_dbg(ar, ATH10K_DBG_REGULATORY, "dfs region 0x%x\n", in ath10k_reg_notifier()
3258 result = ar->dfs_detector->set_dfs_domain(ar->dfs_detector, in ath10k_reg_notifier()
3261 ath10k_warn(ar, "DFS region 0x%X not supported, will trigger radar for every pulse\n", in ath10k_reg_notifier()
3265 mutex_lock(&ar->conf_mutex); in ath10k_reg_notifier()
3266 if (ar->state == ATH10K_STATE_ON) in ath10k_reg_notifier()
3267 ath10k_regd_update(ar); in ath10k_reg_notifier()
3268 mutex_unlock(&ar->conf_mutex); in ath10k_reg_notifier()
3270 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) in ath10k_reg_notifier()
3271 ath10k_mac_update_channel_list(ar, in ath10k_reg_notifier()
3272 ar->hw->wiphy->bands[NL80211_BAND_5GHZ]); in ath10k_reg_notifier()
3275 static void ath10k_stop_radar_confirmation(struct ath10k *ar) in ath10k_stop_radar_confirmation() argument
3277 spin_lock_bh(&ar->data_lock); in ath10k_stop_radar_confirmation()
3278 ar->radar_conf_state = ATH10K_RADAR_CONFIRMATION_STOPPED; in ath10k_stop_radar_confirmation()
3279 spin_unlock_bh(&ar->data_lock); in ath10k_stop_radar_confirmation()
3281 cancel_work_sync(&ar->radar_confirmation_work); in ath10k_stop_radar_confirmation()
3295 void ath10k_mac_tx_lock(struct ath10k *ar, int reason) in ath10k_mac_tx_lock() argument
3297 lockdep_assert_held(&ar->htt.tx_lock); in ath10k_mac_tx_lock()
3300 ar->tx_paused |= BIT(reason); in ath10k_mac_tx_lock()
3301 ieee80211_stop_queues(ar->hw); in ath10k_mac_tx_lock()
3307 struct ath10k *ar = data; in ath10k_mac_tx_unlock_iter() local
3313 ieee80211_wake_queue(ar->hw, arvif->vdev_id); in ath10k_mac_tx_unlock_iter()
3316 void ath10k_mac_tx_unlock(struct ath10k *ar, int reason) in ath10k_mac_tx_unlock() argument
3318 lockdep_assert_held(&ar->htt.tx_lock); in ath10k_mac_tx_unlock()
3321 ar->tx_paused &= ~BIT(reason); in ath10k_mac_tx_unlock()
3323 if (ar->tx_paused) in ath10k_mac_tx_unlock()
3326 ieee80211_iterate_active_interfaces_atomic(ar->hw, in ath10k_mac_tx_unlock()
3329 ar); in ath10k_mac_tx_unlock()
3331 ieee80211_wake_queue(ar->hw, ar->hw->offchannel_tx_hw_queue); in ath10k_mac_tx_unlock()
3336 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_tx_lock() local
3338 lockdep_assert_held(&ar->htt.tx_lock); in ath10k_mac_vif_tx_lock()
3342 ieee80211_stop_queue(ar->hw, arvif->vdev_id); in ath10k_mac_vif_tx_lock()
3347 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_tx_unlock() local
3349 lockdep_assert_held(&ar->htt.tx_lock); in ath10k_mac_vif_tx_unlock()
3354 if (ar->tx_paused) in ath10k_mac_vif_tx_unlock()
3360 ieee80211_wake_queue(ar->hw, arvif->vdev_id); in ath10k_mac_vif_tx_unlock()
3367 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_handle_tx_pause() local
3369 lockdep_assert_held(&ar->htt.tx_lock); in ath10k_mac_vif_handle_tx_pause()
3379 ath10k_dbg(ar, ATH10K_DBG_BOOT, in ath10k_mac_vif_handle_tx_pause()
3404 void ath10k_mac_handle_tx_pause_vdev(struct ath10k *ar, u32 vdev_id, in ath10k_mac_handle_tx_pause_vdev() argument
3414 spin_lock_bh(&ar->htt.tx_lock); in ath10k_mac_handle_tx_pause_vdev()
3415 ieee80211_iterate_active_interfaces_atomic(ar->hw, in ath10k_mac_handle_tx_pause_vdev()
3419 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_handle_tx_pause_vdev()
3423 ath10k_mac_tx_h_get_txmode(struct ath10k *ar, in ath10k_mac_tx_h_get_txmode() argument
3454 if (ar->htt.target_version_major < 3 && in ath10k_mac_tx_h_get_txmode()
3457 ar->running_fw->fw_file.fw_features)) in ath10k_mac_tx_h_get_txmode()
3471 if (test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags) || in ath10k_mac_tx_h_get_txmode()
3553 static void ath10k_tx_h_add_p2p_noa_ie(struct ath10k *ar, in ath10k_tx_h_add_p2p_noa_ie() argument
3565 spin_lock_bh(&ar->data_lock); in ath10k_tx_h_add_p2p_noa_ie()
3571 spin_unlock_bh(&ar->data_lock); in ath10k_tx_h_add_p2p_noa_ie()
3575 static void ath10k_mac_tx_h_fill_cb(struct ath10k *ar, in ath10k_mac_tx_h_fill_cb() argument
3611 bool ath10k_mac_tx_frm_has_freq(struct ath10k *ar) in ath10k_mac_tx_frm_has_freq() argument
3619 return (ar->htt.target_version_major >= 3 && in ath10k_mac_tx_frm_has_freq()
3620 ar->htt.target_version_minor >= 4 && in ath10k_mac_tx_frm_has_freq()
3621 ar->running_fw->fw_file.htt_op_version == ATH10K_FW_HTT_OP_VERSION_TLV); in ath10k_mac_tx_frm_has_freq()
3624 static int ath10k_mac_tx_wmi_mgmt(struct ath10k *ar, struct sk_buff *skb) in ath10k_mac_tx_wmi_mgmt() argument
3626 struct sk_buff_head *q = &ar->wmi_mgmt_tx_queue; in ath10k_mac_tx_wmi_mgmt()
3629 spin_lock_bh(&ar->data_lock); in ath10k_mac_tx_wmi_mgmt()
3632 ath10k_warn(ar, "wmi mgmt tx queue is full\n"); in ath10k_mac_tx_wmi_mgmt()
3638 ieee80211_queue_work(ar->hw, &ar->wmi_mgmt_tx_work); in ath10k_mac_tx_wmi_mgmt()
3641 spin_unlock_bh(&ar->data_lock); in ath10k_mac_tx_wmi_mgmt()
3647 ath10k_mac_tx_h_get_txpath(struct ath10k *ar, in ath10k_mac_tx_h_get_txpath() argument
3658 ar->running_fw->fw_file.fw_features) || in ath10k_mac_tx_h_get_txpath()
3660 ar->wmi.svc_map)) in ath10k_mac_tx_h_get_txpath()
3662 else if (ar->htt.target_version_major >= 3) in ath10k_mac_tx_h_get_txpath()
3671 static int ath10k_mac_tx_submit(struct ath10k *ar, in ath10k_mac_tx_submit() argument
3676 struct ath10k_htt *htt = &ar->htt; in ath10k_mac_tx_submit()
3687 ret = ath10k_mac_tx_wmi_mgmt(ar, skb); in ath10k_mac_tx_submit()
3696 ath10k_warn(ar, "failed to transmit packet, dropping: %d\n", in ath10k_mac_tx_submit()
3698 ieee80211_free_txskb(ar->hw, skb); in ath10k_mac_tx_submit()
3707 static int ath10k_mac_tx(struct ath10k *ar, in ath10k_mac_tx() argument
3713 struct ieee80211_hw *hw = ar->hw; in ath10k_mac_tx()
3720 ath10k_dbg(ar, ATH10K_DBG_MAC, "IEEE80211_TX_CTL_NO_CCK_RATE\n"); in ath10k_mac_tx()
3726 ath10k_tx_h_add_p2p_noa_ie(ar, vif, skb); in ath10k_mac_tx()
3733 if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags) && in ath10k_mac_tx()
3742 if (!ath10k_mac_tx_frm_has_freq(ar)) { in ath10k_mac_tx()
3743 ath10k_dbg(ar, ATH10K_DBG_MAC, "queued offchannel skb %pK\n", in ath10k_mac_tx()
3746 skb_queue_tail(&ar->offchan_tx_queue, skb); in ath10k_mac_tx()
3747 ieee80211_queue_work(hw, &ar->offchan_tx_work); in ath10k_mac_tx()
3752 ret = ath10k_mac_tx_submit(ar, txmode, txpath, skb); in ath10k_mac_tx()
3754 ath10k_warn(ar, "failed to submit frame: %d\n", ret); in ath10k_mac_tx()
3761 void ath10k_offchan_tx_purge(struct ath10k *ar) in ath10k_offchan_tx_purge() argument
3766 skb = skb_dequeue(&ar->offchan_tx_queue); in ath10k_offchan_tx_purge()
3770 ieee80211_free_txskb(ar->hw, skb); in ath10k_offchan_tx_purge()
3776 struct ath10k *ar = container_of(work, struct ath10k, offchan_tx_work); in ath10k_offchan_tx_work() local
3800 skb = skb_dequeue(&ar->offchan_tx_queue); in ath10k_offchan_tx_work()
3804 mutex_lock(&ar->conf_mutex); in ath10k_offchan_tx_work()
3806 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac offchannel skb %pK\n", in ath10k_offchan_tx_work()
3812 spin_lock_bh(&ar->data_lock); in ath10k_offchan_tx_work()
3813 vdev_id = ar->scan.vdev_id; in ath10k_offchan_tx_work()
3814 peer = ath10k_peer_find(ar, vdev_id, peer_addr); in ath10k_offchan_tx_work()
3815 spin_unlock_bh(&ar->data_lock); in ath10k_offchan_tx_work()
3819 ath10k_dbg(ar, ATH10K_DBG_MAC, "peer %pM on vdev %d already present\n", in ath10k_offchan_tx_work()
3823 ret = ath10k_peer_create(ar, NULL, NULL, vdev_id, in ath10k_offchan_tx_work()
3827 ath10k_warn(ar, "failed to create peer %pM on vdev %d: %d\n", in ath10k_offchan_tx_work()
3832 spin_lock_bh(&ar->data_lock); in ath10k_offchan_tx_work()
3833 reinit_completion(&ar->offchan_tx_completed); in ath10k_offchan_tx_work()
3834 ar->offchan_tx_skb = skb; in ath10k_offchan_tx_work()
3835 spin_unlock_bh(&ar->data_lock); in ath10k_offchan_tx_work()
3841 arvif = ath10k_get_arvif(ar, vdev_id); in ath10k_offchan_tx_work()
3850 txmode = ath10k_mac_tx_h_get_txmode(ar, vif, sta, skb); in ath10k_offchan_tx_work()
3851 txpath = ath10k_mac_tx_h_get_txpath(ar, skb, txmode); in ath10k_offchan_tx_work()
3853 ret = ath10k_mac_tx(ar, vif, txmode, txpath, skb); in ath10k_offchan_tx_work()
3855 ath10k_warn(ar, "failed to transmit offchannel frame: %d\n", in ath10k_offchan_tx_work()
3861 wait_for_completion_timeout(&ar->offchan_tx_completed, 3 * HZ); in ath10k_offchan_tx_work()
3863 ath10k_warn(ar, "timed out waiting for offchannel skb %pK\n", in ath10k_offchan_tx_work()
3867 ret = ath10k_peer_delete(ar, vdev_id, peer_addr); in ath10k_offchan_tx_work()
3869 ath10k_warn(ar, "failed to delete peer %pM on vdev %d: %d\n", in ath10k_offchan_tx_work()
3873 mutex_unlock(&ar->conf_mutex); in ath10k_offchan_tx_work()
3877 void ath10k_mgmt_over_wmi_tx_purge(struct ath10k *ar) in ath10k_mgmt_over_wmi_tx_purge() argument
3882 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue); in ath10k_mgmt_over_wmi_tx_purge()
3886 ieee80211_free_txskb(ar->hw, skb); in ath10k_mgmt_over_wmi_tx_purge()
3892 struct ath10k *ar = container_of(work, struct ath10k, wmi_mgmt_tx_work); in ath10k_mgmt_over_wmi_tx_work() local
3898 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue); in ath10k_mgmt_over_wmi_tx_work()
3903 ar->running_fw->fw_file.fw_features)) { in ath10k_mgmt_over_wmi_tx_work()
3904 paddr = dma_map_single(ar->dev, skb->data, in ath10k_mgmt_over_wmi_tx_work()
3908 ret = ath10k_wmi_mgmt_tx_send(ar, skb, paddr); in ath10k_mgmt_over_wmi_tx_work()
3910 ath10k_warn(ar, "failed to transmit management frame by ref via WMI: %d\n", in ath10k_mgmt_over_wmi_tx_work()
3912 dma_unmap_single(ar->dev, paddr, skb->len, in ath10k_mgmt_over_wmi_tx_work()
3914 ieee80211_free_txskb(ar->hw, skb); in ath10k_mgmt_over_wmi_tx_work()
3917 ret = ath10k_wmi_mgmt_tx(ar, skb); in ath10k_mgmt_over_wmi_tx_work()
3919 ath10k_warn(ar, "failed to transmit management frame via WMI: %d\n", in ath10k_mgmt_over_wmi_tx_work()
3921 ieee80211_free_txskb(ar->hw, skb); in ath10k_mgmt_over_wmi_tx_work()
3938 static void ath10k_mac_txq_unref(struct ath10k *ar, struct ieee80211_txq *txq) in ath10k_mac_txq_unref() argument
3947 spin_lock_bh(&ar->htt.tx_lock); in ath10k_mac_txq_unref()
3948 idr_for_each_entry(&ar->htt.pending_tx, msdu, msdu_id) { in ath10k_mac_txq_unref()
3953 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_txq_unref()
3956 struct ieee80211_txq *ath10k_mac_txq_lookup(struct ath10k *ar, in ath10k_mac_txq_lookup() argument
3962 lockdep_assert_held(&ar->data_lock); in ath10k_mac_txq_lookup()
3964 peer = ar->peer_map[peer_id]; in ath10k_mac_txq_lookup()
3982 struct ath10k *ar = hw->priv; in ath10k_mac_tx_can_push() local
3986 if (ar->htt.tx_q_state.mode == HTT_TX_MODE_SWITCH_PUSH) in ath10k_mac_tx_can_push()
3989 if (ar->htt.num_pending_tx < ar->htt.tx_q_state.num_push_allowed) in ath10k_mac_tx_can_push()
4006 static u16 ath10k_mac_update_airtime(struct ath10k *ar, in ath10k_mac_update_airtime() argument
4017 if (test_bit(WMI_SERVICE_REPORT_AIRTIME, ar->wmi.svc_map)) in ath10k_mac_update_airtime()
4020 spin_lock_bh(&ar->data_lock); in ath10k_mac_update_airtime()
4039 spin_unlock_bh(&ar->data_lock); in ath10k_mac_update_airtime()
4047 struct ath10k *ar = hw->priv; in ath10k_mac_tx_push_txq() local
4048 struct ath10k_htt *htt = &ar->htt; in ath10k_mac_tx_push_txq()
4061 spin_lock_bh(&ar->htt.tx_lock); in ath10k_mac_tx_push_txq()
4063 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_tx_push_txq()
4070 spin_lock_bh(&ar->htt.tx_lock); in ath10k_mac_tx_push_txq()
4072 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_tx_push_txq()
4077 airtime = ath10k_mac_update_airtime(ar, txq, skb); in ath10k_mac_tx_push_txq()
4078 ath10k_mac_tx_h_fill_cb(ar, vif, txq, skb, airtime); in ath10k_mac_tx_push_txq()
4081 txmode = ath10k_mac_tx_h_get_txmode(ar, vif, sta, skb); in ath10k_mac_tx_push_txq()
4082 txpath = ath10k_mac_tx_h_get_txpath(ar, skb, txmode); in ath10k_mac_tx_push_txq()
4089 spin_lock_bh(&ar->htt.tx_lock); in ath10k_mac_tx_push_txq()
4094 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_tx_push_txq()
4097 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_tx_push_txq()
4100 ret = ath10k_mac_tx(ar, vif, txmode, txpath, skb); in ath10k_mac_tx_push_txq()
4102 ath10k_warn(ar, "failed to push frame: %d\n", ret); in ath10k_mac_tx_push_txq()
4104 spin_lock_bh(&ar->htt.tx_lock); in ath10k_mac_tx_push_txq()
4108 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_tx_push_txq()
4113 spin_lock_bh(&ar->htt.tx_lock); in ath10k_mac_tx_push_txq()
4115 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_tx_push_txq()
4142 void ath10k_mac_tx_push_pending(struct ath10k *ar) in ath10k_mac_tx_push_pending() argument
4144 struct ieee80211_hw *hw = ar->hw; in ath10k_mac_tx_push_pending()
4147 if (ar->htt.tx_q_state.mode != HTT_TX_MODE_SWITCH_PUSH) in ath10k_mac_tx_push_pending()
4150 if (ar->htt.num_pending_tx >= (ar->htt.max_num_pending_tx / 2)) in ath10k_mac_tx_push_pending()
4166 void __ath10k_scan_finish(struct ath10k *ar) in __ath10k_scan_finish() argument
4168 lockdep_assert_held(&ar->data_lock); in __ath10k_scan_finish()
4170 switch (ar->scan.state) { in __ath10k_scan_finish()
4175 if (!ar->scan.is_roc) { in __ath10k_scan_finish()
4177 .aborted = (ar->scan.state == in __ath10k_scan_finish()
4181 ieee80211_scan_completed(ar->hw, &info); in __ath10k_scan_finish()
4182 } else if (ar->scan.roc_notify) { in __ath10k_scan_finish()
4183 ieee80211_remain_on_channel_expired(ar->hw); in __ath10k_scan_finish()
4187 ar->scan.state = ATH10K_SCAN_IDLE; in __ath10k_scan_finish()
4188 ar->scan_channel = NULL; in __ath10k_scan_finish()
4189 ar->scan.roc_freq = 0; in __ath10k_scan_finish()
4190 ath10k_offchan_tx_purge(ar); in __ath10k_scan_finish()
4191 cancel_delayed_work(&ar->scan.timeout); in __ath10k_scan_finish()
4192 complete(&ar->scan.completed); in __ath10k_scan_finish()
4197 void ath10k_scan_finish(struct ath10k *ar) in ath10k_scan_finish() argument
4199 spin_lock_bh(&ar->data_lock); in ath10k_scan_finish()
4200 __ath10k_scan_finish(ar); in ath10k_scan_finish()
4201 spin_unlock_bh(&ar->data_lock); in ath10k_scan_finish()
4204 static int ath10k_scan_stop(struct ath10k *ar) in ath10k_scan_stop() argument
4213 lockdep_assert_held(&ar->conf_mutex); in ath10k_scan_stop()
4215 ret = ath10k_wmi_stop_scan(ar, &arg); in ath10k_scan_stop()
4217 ath10k_warn(ar, "failed to stop wmi scan: %d\n", ret); in ath10k_scan_stop()
4221 ret = wait_for_completion_timeout(&ar->scan.completed, 3 * HZ); in ath10k_scan_stop()
4223 ath10k_warn(ar, "failed to receive scan abortion completion: timed out\n"); in ath10k_scan_stop()
4237 spin_lock_bh(&ar->data_lock); in ath10k_scan_stop()
4238 if (ar->scan.state != ATH10K_SCAN_IDLE) in ath10k_scan_stop()
4239 __ath10k_scan_finish(ar); in ath10k_scan_stop()
4240 spin_unlock_bh(&ar->data_lock); in ath10k_scan_stop()
4245 static void ath10k_scan_abort(struct ath10k *ar) in ath10k_scan_abort() argument
4249 lockdep_assert_held(&ar->conf_mutex); in ath10k_scan_abort()
4251 spin_lock_bh(&ar->data_lock); in ath10k_scan_abort()
4253 switch (ar->scan.state) { in ath10k_scan_abort()
4261 ath10k_warn(ar, "refusing scan abortion due to invalid scan state: %s (%d)\n", in ath10k_scan_abort()
4262 ath10k_scan_state_str(ar->scan.state), in ath10k_scan_abort()
4263 ar->scan.state); in ath10k_scan_abort()
4266 ar->scan.state = ATH10K_SCAN_ABORTING; in ath10k_scan_abort()
4267 spin_unlock_bh(&ar->data_lock); in ath10k_scan_abort()
4269 ret = ath10k_scan_stop(ar); in ath10k_scan_abort()
4271 ath10k_warn(ar, "failed to abort scan: %d\n", ret); in ath10k_scan_abort()
4273 spin_lock_bh(&ar->data_lock); in ath10k_scan_abort()
4277 spin_unlock_bh(&ar->data_lock); in ath10k_scan_abort()
4282 struct ath10k *ar = container_of(work, struct ath10k, in ath10k_scan_timeout_work() local
4285 mutex_lock(&ar->conf_mutex); in ath10k_scan_timeout_work()
4286 ath10k_scan_abort(ar); in ath10k_scan_timeout_work()
4287 mutex_unlock(&ar->conf_mutex); in ath10k_scan_timeout_work()
4290 static int ath10k_start_scan(struct ath10k *ar, in ath10k_start_scan() argument
4295 lockdep_assert_held(&ar->conf_mutex); in ath10k_start_scan()
4297 ret = ath10k_wmi_start_scan(ar, arg); in ath10k_start_scan()
4301 ret = wait_for_completion_timeout(&ar->scan.started, 1 * HZ); in ath10k_start_scan()
4303 ret = ath10k_scan_stop(ar); in ath10k_start_scan()
4305 ath10k_warn(ar, "failed to stop scan: %d\n", ret); in ath10k_start_scan()
4314 spin_lock_bh(&ar->data_lock); in ath10k_start_scan()
4315 if (ar->scan.state == ATH10K_SCAN_IDLE) { in ath10k_start_scan()
4316 spin_unlock_bh(&ar->data_lock); in ath10k_start_scan()
4319 spin_unlock_bh(&ar->data_lock); in ath10k_start_scan()
4332 struct ath10k *ar = hw->priv; in ath10k_mac_op_tx() local
4333 struct ath10k_htt *htt = &ar->htt; in ath10k_mac_op_tx()
4347 airtime = ath10k_mac_update_airtime(ar, txq, skb); in ath10k_mac_op_tx()
4348 ath10k_mac_tx_h_fill_cb(ar, vif, txq, skb, airtime); in ath10k_mac_op_tx()
4350 txmode = ath10k_mac_tx_h_get_txmode(ar, vif, sta, skb); in ath10k_mac_op_tx()
4351 txpath = ath10k_mac_tx_h_get_txpath(ar, skb, txmode); in ath10k_mac_op_tx()
4357 spin_lock_bh(&ar->htt.tx_lock); in ath10k_mac_op_tx()
4362 ath10k_warn(ar, "failed to increase tx pending count: %d, dropping\n", in ath10k_mac_op_tx()
4364 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_op_tx()
4365 ieee80211_free_txskb(ar->hw, skb); in ath10k_mac_op_tx()
4371 ath10k_dbg(ar, ATH10K_DBG_MAC, "failed to increase tx mgmt pending count: %d, dropping\n", in ath10k_mac_op_tx()
4374 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_op_tx()
4375 ieee80211_free_txskb(ar->hw, skb); in ath10k_mac_op_tx()
4378 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_op_tx()
4381 ret = ath10k_mac_tx(ar, vif, txmode, txpath, skb); in ath10k_mac_op_tx()
4383 ath10k_warn(ar, "failed to transmit frame: %d\n", ret); in ath10k_mac_op_tx()
4385 spin_lock_bh(&ar->htt.tx_lock); in ath10k_mac_op_tx()
4389 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_op_tx()
4398 struct ath10k *ar = hw->priv; in ath10k_mac_op_wake_tx_queue() local
4403 if (ar->htt.tx_q_state.mode != HTT_TX_MODE_SWITCH_PUSH) in ath10k_mac_op_wake_tx_queue()
4424 void ath10k_drain_tx(struct ath10k *ar) in ath10k_drain_tx() argument
4429 ath10k_offchan_tx_purge(ar); in ath10k_drain_tx()
4430 ath10k_mgmt_over_wmi_tx_purge(ar); in ath10k_drain_tx()
4432 cancel_work_sync(&ar->offchan_tx_work); in ath10k_drain_tx()
4433 cancel_work_sync(&ar->wmi_mgmt_tx_work); in ath10k_drain_tx()
4436 void ath10k_halt(struct ath10k *ar) in ath10k_halt() argument
4440 lockdep_assert_held(&ar->conf_mutex); in ath10k_halt()
4442 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags); in ath10k_halt()
4443 ar->filter_flags = 0; in ath10k_halt()
4444 ar->monitor = false; in ath10k_halt()
4445 ar->monitor_arvif = NULL; in ath10k_halt()
4447 if (ar->monitor_started) in ath10k_halt()
4448 ath10k_monitor_stop(ar); in ath10k_halt()
4450 ar->monitor_started = false; in ath10k_halt()
4451 ar->tx_paused = 0; in ath10k_halt()
4453 ath10k_scan_finish(ar); in ath10k_halt()
4454 ath10k_peer_cleanup_all(ar); in ath10k_halt()
4455 ath10k_stop_radar_confirmation(ar); in ath10k_halt()
4456 ath10k_core_stop(ar); in ath10k_halt()
4457 ath10k_hif_power_down(ar); in ath10k_halt()
4459 spin_lock_bh(&ar->data_lock); in ath10k_halt()
4460 list_for_each_entry(arvif, &ar->arvifs, list) in ath10k_halt()
4462 spin_unlock_bh(&ar->data_lock); in ath10k_halt()
4467 struct ath10k *ar = hw->priv; in ath10k_get_antenna() local
4469 mutex_lock(&ar->conf_mutex); in ath10k_get_antenna()
4471 *tx_ant = ar->cfg_tx_chainmask; in ath10k_get_antenna()
4472 *rx_ant = ar->cfg_rx_chainmask; in ath10k_get_antenna()
4474 mutex_unlock(&ar->conf_mutex); in ath10k_get_antenna()
4479 static void ath10k_check_chain_mask(struct ath10k *ar, u32 cm, const char *dbg) in ath10k_check_chain_mask() argument
4488 …ath10k_warn(ar, "mac %s antenna chainmask may be invalid: 0x%x. Suggested values: 15, 7, 3, 1 or … in ath10k_check_chain_mask()
4492 static int ath10k_mac_get_vht_cap_bf_sts(struct ath10k *ar) in ath10k_mac_get_vht_cap_bf_sts() argument
4494 int nsts = ar->vht_cap_info; in ath10k_mac_get_vht_cap_bf_sts()
4509 static int ath10k_mac_get_vht_cap_bf_sound_dim(struct ath10k *ar) in ath10k_mac_get_vht_cap_bf_sound_dim() argument
4511 int sound_dim = ar->vht_cap_info; in ath10k_mac_get_vht_cap_bf_sound_dim()
4525 static struct ieee80211_sta_vht_cap ath10k_create_vht_cap(struct ath10k *ar) in ath10k_create_vht_cap() argument
4528 struct ath10k_hw_params *hw = &ar->hw_params; in ath10k_create_vht_cap()
4534 vht_cap.cap = ar->vht_cap_info; in ath10k_create_vht_cap()
4536 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE | in ath10k_create_vht_cap()
4538 val = ath10k_mac_get_vht_cap_bf_sts(ar); in ath10k_create_vht_cap()
4545 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE | in ath10k_create_vht_cap()
4547 val = ath10k_mac_get_vht_cap_bf_sound_dim(ar); in ath10k_create_vht_cap()
4557 if ((ar->vht_cap_info & IEEE80211_VHT_CAP_SHORT_GI_160) && in ath10k_create_vht_cap()
4558 (ar->vht_cap_info & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK) == 0) in ath10k_create_vht_cap()
4563 if ((i < ar->num_rf_chains) && (ar->cfg_tx_chainmask & BIT(i))) in ath10k_create_vht_cap()
4569 if (ar->cfg_tx_chainmask <= 1) in ath10k_create_vht_cap()
4589 static struct ieee80211_sta_ht_cap ath10k_get_ht_cap(struct ath10k *ar) in ath10k_get_ht_cap() argument
4594 if (!(ar->ht_cap_info & WMI_HT_CAP_ENABLED)) in ath10k_get_ht_cap()
4605 if (ar->ht_cap_info & WMI_HT_CAP_HT20_SGI) in ath10k_get_ht_cap()
4608 if (ar->ht_cap_info & WMI_HT_CAP_HT40_SGI) in ath10k_get_ht_cap()
4611 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) { in ath10k_get_ht_cap()
4620 if (ar->ht_cap_info & WMI_HT_CAP_TX_STBC && (ar->cfg_tx_chainmask > 1)) in ath10k_get_ht_cap()
4623 if (ar->ht_cap_info & WMI_HT_CAP_RX_STBC) { in ath10k_get_ht_cap()
4626 stbc = ar->ht_cap_info; in ath10k_get_ht_cap()
4635 if (ar->ht_cap_info & WMI_HT_CAP_LDPC || (ar->ht_cap_info & in ath10k_get_ht_cap()
4636 WMI_HT_CAP_RX_LDPC && (ar->ht_cap_info & WMI_HT_CAP_TX_LDPC))) in ath10k_get_ht_cap()
4639 if (ar->ht_cap_info & WMI_HT_CAP_L_SIG_TXOP_PROT) in ath10k_get_ht_cap()
4643 if (ar->vht_cap_info & WMI_VHT_CAP_MAX_MPDU_LEN_MASK) in ath10k_get_ht_cap()
4646 for (i = 0; i < ar->num_rf_chains; i++) { in ath10k_get_ht_cap()
4647 if (ar->cfg_rx_chainmask & BIT(i)) in ath10k_get_ht_cap()
4656 static void ath10k_mac_setup_ht_vht_cap(struct ath10k *ar) in ath10k_mac_setup_ht_vht_cap() argument
4662 ht_cap = ath10k_get_ht_cap(ar); in ath10k_mac_setup_ht_vht_cap()
4663 vht_cap = ath10k_create_vht_cap(ar); in ath10k_mac_setup_ht_vht_cap()
4665 if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) { in ath10k_mac_setup_ht_vht_cap()
4666 band = &ar->mac.sbands[NL80211_BAND_2GHZ]; in ath10k_mac_setup_ht_vht_cap()
4669 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) { in ath10k_mac_setup_ht_vht_cap()
4670 band = &ar->mac.sbands[NL80211_BAND_5GHZ]; in ath10k_mac_setup_ht_vht_cap()
4676 static int __ath10k_set_antenna(struct ath10k *ar, u32 tx_ant, u32 rx_ant) in __ath10k_set_antenna() argument
4680 lockdep_assert_held(&ar->conf_mutex); in __ath10k_set_antenna()
4682 ath10k_check_chain_mask(ar, tx_ant, "tx"); in __ath10k_set_antenna()
4683 ath10k_check_chain_mask(ar, rx_ant, "rx"); in __ath10k_set_antenna()
4685 ar->cfg_tx_chainmask = tx_ant; in __ath10k_set_antenna()
4686 ar->cfg_rx_chainmask = rx_ant; in __ath10k_set_antenna()
4688 if ((ar->state != ATH10K_STATE_ON) && in __ath10k_set_antenna()
4689 (ar->state != ATH10K_STATE_RESTARTED)) in __ath10k_set_antenna()
4692 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->tx_chain_mask, in __ath10k_set_antenna()
4695 ath10k_warn(ar, "failed to set tx-chainmask: %d, req 0x%x\n", in __ath10k_set_antenna()
4700 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->rx_chain_mask, in __ath10k_set_antenna()
4703 ath10k_warn(ar, "failed to set rx-chainmask: %d, req 0x%x\n", in __ath10k_set_antenna()
4709 ath10k_mac_setup_ht_vht_cap(ar); in __ath10k_set_antenna()
4716 struct ath10k *ar = hw->priv; in ath10k_set_antenna() local
4719 mutex_lock(&ar->conf_mutex); in ath10k_set_antenna()
4720 ret = __ath10k_set_antenna(ar, tx_ant, rx_ant); in ath10k_set_antenna()
4721 mutex_unlock(&ar->conf_mutex); in ath10k_set_antenna()
4725 static int __ath10k_fetch_bb_timing_dt(struct ath10k *ar, in __ath10k_fetch_bb_timing_dt() argument
4732 node = ar->dev->of_node; in __ath10k_fetch_bb_timing_dt()
4752 ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot bb_tx_timing 0x%x bb_xpa_timing 0x%x\n", in __ath10k_fetch_bb_timing_dt()
4759 struct ath10k *ar = hw->priv; in ath10k_start() local
4769 ath10k_drain_tx(ar); in ath10k_start()
4771 mutex_lock(&ar->conf_mutex); in ath10k_start()
4773 switch (ar->state) { in ath10k_start()
4775 ar->state = ATH10K_STATE_ON; in ath10k_start()
4778 ar->state = ATH10K_STATE_RESTARTED; in ath10k_start()
4791 ret = ath10k_hif_power_up(ar, ATH10K_FIRMWARE_MODE_NORMAL); in ath10k_start()
4793 ath10k_err(ar, "Could not init hif: %d\n", ret); in ath10k_start()
4797 ret = ath10k_core_start(ar, ATH10K_FIRMWARE_MODE_NORMAL, in ath10k_start()
4798 &ar->normal_mode_fw); in ath10k_start()
4800 ath10k_err(ar, "Could not init core: %d\n", ret); in ath10k_start()
4804 param = ar->wmi.pdev_param->pmf_qos; in ath10k_start()
4805 ret = ath10k_wmi_pdev_set_param(ar, param, 1); in ath10k_start()
4807 ath10k_warn(ar, "failed to enable PMF QOS: %d\n", ret); in ath10k_start()
4811 param = ar->wmi.pdev_param->dynamic_bw; in ath10k_start()
4812 ret = ath10k_wmi_pdev_set_param(ar, param, 1); in ath10k_start()
4814 ath10k_warn(ar, "failed to enable dynamic BW: %d\n", ret); in ath10k_start()
4818 if (test_bit(WMI_SERVICE_SPOOF_MAC_SUPPORT, ar->wmi.svc_map)) { in ath10k_start()
4819 ret = ath10k_wmi_scan_prob_req_oui(ar, ar->mac_addr); in ath10k_start()
4821 ath10k_err(ar, "failed to set prob req oui: %i\n", ret); in ath10k_start()
4826 if (test_bit(WMI_SERVICE_ADAPTIVE_OCS, ar->wmi.svc_map)) { in ath10k_start()
4827 ret = ath10k_wmi_adaptive_qcs(ar, true); in ath10k_start()
4829 ath10k_warn(ar, "failed to enable adaptive qcs: %d\n", in ath10k_start()
4835 if (test_bit(WMI_SERVICE_BURST, ar->wmi.svc_map)) { in ath10k_start()
4836 param = ar->wmi.pdev_param->burst_enable; in ath10k_start()
4837 ret = ath10k_wmi_pdev_set_param(ar, param, 0); in ath10k_start()
4839 ath10k_warn(ar, "failed to disable burst: %d\n", ret); in ath10k_start()
4844 param = ar->wmi.pdev_param->idle_ps_config; in ath10k_start()
4845 ret = ath10k_wmi_pdev_set_param(ar, param, 1); in ath10k_start()
4847 ath10k_warn(ar, "failed to enable idle_ps_config: %d\n", ret); in ath10k_start()
4851 __ath10k_set_antenna(ar, ar->cfg_tx_chainmask, ar->cfg_rx_chainmask); in ath10k_start()
4862 param = ar->wmi.pdev_param->arp_ac_override; in ath10k_start()
4863 ret = ath10k_wmi_pdev_set_param(ar, param, 0); in ath10k_start()
4865 ath10k_warn(ar, "failed to set arp ac override parameter: %d\n", in ath10k_start()
4871 ar->running_fw->fw_file.fw_features)) { in ath10k_start()
4872 ret = ath10k_wmi_pdev_enable_adaptive_cca(ar, 1, in ath10k_start()
4876 ath10k_warn(ar, "failed to enable adaptive cca: %d\n", in ath10k_start()
4882 param = ar->wmi.pdev_param->ani_enable; in ath10k_start()
4883 ret = ath10k_wmi_pdev_set_param(ar, param, 1); in ath10k_start()
4885 ath10k_warn(ar, "failed to enable ani by default: %d\n", in ath10k_start()
4890 ar->ani_enabled = true; in ath10k_start()
4892 if (ath10k_peer_stats_enabled(ar)) { in ath10k_start()
4893 param = ar->wmi.pdev_param->peer_stats_update_period; in ath10k_start()
4894 ret = ath10k_wmi_pdev_set_param(ar, param, in ath10k_start()
4897 ath10k_warn(ar, in ath10k_start()
4904 param = ar->wmi.pdev_param->enable_btcoex; in ath10k_start()
4905 if (test_bit(WMI_SERVICE_COEX_GPIO, ar->wmi.svc_map) && in ath10k_start()
4907 ar->running_fw->fw_file.fw_features)) { in ath10k_start()
4908 ret = ath10k_wmi_pdev_set_param(ar, param, 0); in ath10k_start()
4910 ath10k_warn(ar, in ath10k_start()
4914 clear_bit(ATH10K_FLAG_BTCOEX, &ar->dev_flags); in ath10k_start()
4917 if (test_bit(WMI_SERVICE_BB_TIMING_CONFIG_SUPPORT, ar->wmi.svc_map)) { in ath10k_start()
4918 ret = __ath10k_fetch_bb_timing_dt(ar, &bb_timing); in ath10k_start()
4920 ret = ath10k_wmi_pdev_bb_timing(ar, &bb_timing); in ath10k_start()
4922 ath10k_warn(ar, in ath10k_start()
4930 ar->num_started_vdevs = 0; in ath10k_start()
4931 ath10k_regd_update(ar); in ath10k_start()
4933 ath10k_spectral_start(ar); in ath10k_start()
4934 ath10k_thermal_set_throttling(ar); in ath10k_start()
4936 ar->radar_conf_state = ATH10K_RADAR_CONFIRMATION_IDLE; in ath10k_start()
4938 mutex_unlock(&ar->conf_mutex); in ath10k_start()
4942 ath10k_core_stop(ar); in ath10k_start()
4945 ath10k_hif_power_down(ar); in ath10k_start()
4948 ar->state = ATH10K_STATE_OFF; in ath10k_start()
4951 mutex_unlock(&ar->conf_mutex); in ath10k_start()
4957 struct ath10k *ar = hw->priv; in ath10k_stop() local
4959 ath10k_drain_tx(ar); in ath10k_stop()
4961 mutex_lock(&ar->conf_mutex); in ath10k_stop()
4962 if (ar->state != ATH10K_STATE_OFF) { in ath10k_stop()
4963 ath10k_halt(ar); in ath10k_stop()
4964 ar->state = ATH10K_STATE_OFF; in ath10k_stop()
4966 mutex_unlock(&ar->conf_mutex); in ath10k_stop()
4968 cancel_work_sync(&ar->set_coverage_class_work); in ath10k_stop()
4969 cancel_delayed_work_sync(&ar->scan.timeout); in ath10k_stop()
4970 cancel_work_sync(&ar->restart_work); in ath10k_stop()
4973 static int ath10k_config_ps(struct ath10k *ar) in ath10k_config_ps() argument
4978 lockdep_assert_held(&ar->conf_mutex); in ath10k_config_ps()
4980 list_for_each_entry(arvif, &ar->arvifs, list) { in ath10k_config_ps()
4983 ath10k_warn(ar, "failed to setup powersave: %d\n", ret); in ath10k_config_ps()
4991 static int ath10k_mac_txpower_setup(struct ath10k *ar, int txpower) in ath10k_mac_txpower_setup() argument
4996 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_txpower_setup()
4998 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac txpower %d\n", txpower); in ath10k_mac_txpower_setup()
5000 param = ar->wmi.pdev_param->txpower_limit2g; in ath10k_mac_txpower_setup()
5001 ret = ath10k_wmi_pdev_set_param(ar, param, txpower * 2); in ath10k_mac_txpower_setup()
5003 ath10k_warn(ar, "failed to set 2g txpower %d: %d\n", in ath10k_mac_txpower_setup()
5008 param = ar->wmi.pdev_param->txpower_limit5g; in ath10k_mac_txpower_setup()
5009 ret = ath10k_wmi_pdev_set_param(ar, param, txpower * 2); in ath10k_mac_txpower_setup()
5011 ath10k_warn(ar, "failed to set 5g txpower %d: %d\n", in ath10k_mac_txpower_setup()
5019 static int ath10k_mac_txpower_recalc(struct ath10k *ar) in ath10k_mac_txpower_recalc() argument
5024 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_txpower_recalc()
5026 list_for_each_entry(arvif, &ar->arvifs, list) { in ath10k_mac_txpower_recalc()
5039 ret = ath10k_mac_txpower_setup(ar, txpower); in ath10k_mac_txpower_recalc()
5041 ath10k_warn(ar, "failed to setup tx power %d: %d\n", in ath10k_mac_txpower_recalc()
5051 struct ath10k *ar = hw->priv; in ath10k_config() local
5055 mutex_lock(&ar->conf_mutex); in ath10k_config()
5058 ath10k_config_ps(ar); in ath10k_config()
5061 ar->monitor = conf->flags & IEEE80211_CONF_MONITOR; in ath10k_config()
5062 ret = ath10k_monitor_recalc(ar); in ath10k_config()
5064 ath10k_warn(ar, "failed to recalc monitor: %d\n", ret); in ath10k_config()
5067 mutex_unlock(&ar->conf_mutex); in ath10k_config()
5085 struct ath10k *ar = arvif->ar; in ath10k_mac_set_txbf_conf() local
5089 if (ath10k_wmi_get_txbf_conf_scheme(ar) != WMI_TXBF_CONF_BEFORE_ASSOC) in ath10k_mac_set_txbf_conf()
5092 nsts = ath10k_mac_get_vht_cap_bf_sts(ar); in ath10k_mac_set_txbf_conf()
5093 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE | in ath10k_mac_set_txbf_conf()
5097 sound_dim = ath10k_mac_get_vht_cap_bf_sound_dim(ar); in ath10k_mac_set_txbf_conf()
5098 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE | in ath10k_mac_set_txbf_conf()
5105 if (ar->vht_cap_info & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE) in ath10k_mac_set_txbf_conf()
5108 if (ar->vht_cap_info & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE) in ath10k_mac_set_txbf_conf()
5112 if (ar->vht_cap_info & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE) in ath10k_mac_set_txbf_conf()
5115 if (ar->vht_cap_info & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE) in ath10k_mac_set_txbf_conf()
5119 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, in ath10k_mac_set_txbf_conf()
5120 ar->wmi.vdev_param->txbf, value); in ath10k_mac_set_txbf_conf()
5133 struct ath10k *ar = hw->priv; in ath10k_add_interface() local
5145 mutex_lock(&ar->conf_mutex); in ath10k_add_interface()
5150 arvif->ar = ar; in ath10k_add_interface()
5166 if (ar->num_peers >= ar->max_num_peers) { in ath10k_add_interface()
5167 ath10k_warn(ar, "refusing vdev creation due to insufficient peer entry resources in firmware\n"); in ath10k_add_interface()
5172 if (ar->free_vdev_map == 0) { in ath10k_add_interface()
5173 ath10k_warn(ar, "Free vdev map is empty, no more interfaces allowed.\n"); in ath10k_add_interface()
5177 bit = __ffs64(ar->free_vdev_map); in ath10k_add_interface()
5179 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac create vdev %i map %llx\n", in ath10k_add_interface()
5180 bit, ar->free_vdev_map); in ath10k_add_interface()
5184 ath10k_wmi_get_vdev_subtype(ar, WMI_VDEV_SUBTYPE_NONE); in ath10k_add_interface()
5190 (ar, WMI_VDEV_SUBTYPE_P2P_DEVICE); in ath10k_add_interface()
5197 (ar, WMI_VDEV_SUBTYPE_P2P_CLIENT); in ath10k_add_interface()
5203 if (test_bit(WMI_SERVICE_MESH_11S, ar->wmi.svc_map)) { in ath10k_add_interface()
5205 (ar, WMI_VDEV_SUBTYPE_MESH_11S); in ath10k_add_interface()
5206 } else if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) { in ath10k_add_interface()
5208 ath10k_warn(ar, "must load driver with rawmode=1 to add mesh interfaces\n"); in ath10k_add_interface()
5218 (ar, WMI_VDEV_SUBTYPE_P2P_GO); in ath10k_add_interface()
5256 arvif->beacon_buf = dma_alloc_coherent(ar->dev, in ath10k_add_interface()
5262 ath10k_warn(ar, "failed to allocate beacon buffer: %d\n", in ath10k_add_interface()
5267 if (test_bit(ATH10K_FLAG_HW_CRYPTO_DISABLED, &ar->dev_flags)) in ath10k_add_interface()
5271 !test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) { in ath10k_add_interface()
5272 ath10k_warn(ar, "cryptmode module param needed for sw crypto\n"); in ath10k_add_interface()
5276 …ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev create %d (add interface) type %d subtype %d bcnmode %s\n… in ath10k_add_interface()
5280 ret = ath10k_wmi_vdev_create(ar, arvif->vdev_id, arvif->vdev_type, in ath10k_add_interface()
5283 ath10k_warn(ar, "failed to create WMI vdev %i: %d\n", in ath10k_add_interface()
5289 ar->wmi.svc_map)) { in ath10k_add_interface()
5290 vdev_param = ar->wmi.vdev_param->disable_4addr_src_lrn; in ath10k_add_interface()
5291 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_add_interface()
5294 ath10k_warn(ar, "failed to disable 4addr src lrn vdev %i: %d\n", in ath10k_add_interface()
5299 ar->free_vdev_map &= ~(1LL << arvif->vdev_id); in ath10k_add_interface()
5300 spin_lock_bh(&ar->data_lock); in ath10k_add_interface()
5301 list_add(&arvif->list, &ar->arvifs); in ath10k_add_interface()
5302 spin_unlock_bh(&ar->data_lock); in ath10k_add_interface()
5309 ath10k_warn(ar, "failed to disable keepalive on vdev %i: %d\n", in ath10k_add_interface()
5316 vdev_param = ar->wmi.vdev_param->tx_encap_type; in ath10k_add_interface()
5317 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_add_interface()
5321 ath10k_warn(ar, "failed to set vdev %i TX encapsulation: %d\n", in ath10k_add_interface()
5329 if (ar->cfg_tx_chainmask && (vif->type != NL80211_IFTYPE_MONITOR)) { in ath10k_add_interface()
5330 u16 nss = get_nss_from_chainmask(ar->cfg_tx_chainmask); in ath10k_add_interface()
5332 vdev_param = ar->wmi.vdev_param->nss; in ath10k_add_interface()
5333 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_add_interface()
5336 ath10k_warn(ar, "failed to set vdev %i chainmask 0x%x, nss %i: %d\n", in ath10k_add_interface()
5337 arvif->vdev_id, ar->cfg_tx_chainmask, nss, in ath10k_add_interface()
5345 ret = ath10k_peer_create(ar, vif, NULL, arvif->vdev_id, in ath10k_add_interface()
5348 ath10k_warn(ar, "failed to create vdev %i peer for AP/IBSS: %d\n", in ath10k_add_interface()
5353 spin_lock_bh(&ar->data_lock); in ath10k_add_interface()
5355 peer = ath10k_peer_find(ar, arvif->vdev_id, vif->addr); in ath10k_add_interface()
5357 ath10k_warn(ar, "failed to lookup peer %pM on vdev %i\n", in ath10k_add_interface()
5359 spin_unlock_bh(&ar->data_lock); in ath10k_add_interface()
5367 spin_unlock_bh(&ar->data_lock); in ath10k_add_interface()
5375 ath10k_warn(ar, "failed to set vdev %i kickout parameters: %d\n", in ath10k_add_interface()
5384 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath10k_add_interface()
5387 ath10k_warn(ar, "failed to set vdev %i RX wake policy: %d\n", in ath10k_add_interface()
5394 ath10k_warn(ar, "failed to recalc ps wake threshold on vdev %i: %d\n", in ath10k_add_interface()
5401 ath10k_warn(ar, "failed to recalc ps poll count on vdev %i: %d\n", in ath10k_add_interface()
5409 ath10k_warn(ar, "failed to set txbf for vdev %d: %d\n", in ath10k_add_interface()
5414 ret = ath10k_mac_set_rts(arvif, ar->hw->wiphy->rts_threshold); in ath10k_add_interface()
5416 ath10k_warn(ar, "failed to set rts threshold for vdev %d: %d\n", in ath10k_add_interface()
5422 ret = ath10k_mac_txpower_recalc(ar); in ath10k_add_interface()
5424 ath10k_warn(ar, "failed to recalc tx power: %d\n", ret); in ath10k_add_interface()
5428 if (test_bit(WMI_SERVICE_RTT_RESPONDER_ROLE, ar->wmi.svc_map)) { in ath10k_add_interface()
5429 vdev_param = ar->wmi.vdev_param->rtt_responder_role; in ath10k_add_interface()
5430 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_add_interface()
5435 ath10k_warn(ar, "failed to set vdev %i FTM Responder: %d\n", in ath10k_add_interface()
5440 ar->monitor_arvif = arvif; in ath10k_add_interface()
5441 ret = ath10k_monitor_recalc(ar); in ath10k_add_interface()
5443 ath10k_warn(ar, "failed to recalc monitor: %d\n", ret); in ath10k_add_interface()
5448 spin_lock_bh(&ar->htt.tx_lock); in ath10k_add_interface()
5449 if (!ar->tx_paused) in ath10k_add_interface()
5450 ieee80211_wake_queue(ar->hw, arvif->vdev_id); in ath10k_add_interface()
5451 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_add_interface()
5453 mutex_unlock(&ar->conf_mutex); in ath10k_add_interface()
5459 ath10k_wmi_peer_delete(ar, arvif->vdev_id, vif->addr); in ath10k_add_interface()
5460 ath10k_wait_for_peer_delete_done(ar, arvif->vdev_id, in ath10k_add_interface()
5465 ath10k_wmi_vdev_delete(ar, arvif->vdev_id); in ath10k_add_interface()
5466 ar->free_vdev_map |= 1LL << arvif->vdev_id; in ath10k_add_interface()
5467 spin_lock_bh(&ar->data_lock); in ath10k_add_interface()
5469 spin_unlock_bh(&ar->data_lock); in ath10k_add_interface()
5473 dma_free_coherent(ar->dev, IEEE80211_MAX_FRAME_LEN, in ath10k_add_interface()
5478 mutex_unlock(&ar->conf_mutex); in ath10k_add_interface()
5494 struct ath10k *ar = hw->priv; in ath10k_remove_interface() local
5504 mutex_lock(&ar->conf_mutex); in ath10k_remove_interface()
5508 ath10k_warn(ar, "failed to stop spectral for vdev %i: %d\n", in ath10k_remove_interface()
5511 ar->free_vdev_map |= 1LL << arvif->vdev_id; in ath10k_remove_interface()
5512 spin_lock_bh(&ar->data_lock); in ath10k_remove_interface()
5514 spin_unlock_bh(&ar->data_lock); in ath10k_remove_interface()
5518 ret = ath10k_wmi_peer_delete(arvif->ar, arvif->vdev_id, in ath10k_remove_interface()
5521 ath10k_warn(ar, "failed to submit AP/IBSS self-peer removal on vdev %i: %d\n", in ath10k_remove_interface()
5524 ath10k_wait_for_peer_delete_done(ar, arvif->vdev_id, in ath10k_remove_interface()
5529 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i delete (remove interface)\n", in ath10k_remove_interface()
5532 ret = ath10k_wmi_vdev_delete(ar, arvif->vdev_id); in ath10k_remove_interface()
5534 ath10k_warn(ar, "failed to delete WMI vdev %i: %d\n", in ath10k_remove_interface()
5537 if (test_bit(WMI_SERVICE_SYNC_DELETE_CMDS, ar->wmi.svc_map)) { in ath10k_remove_interface()
5538 time_left = wait_for_completion_timeout(&ar->vdev_delete_done, in ath10k_remove_interface()
5541 ath10k_warn(ar, "Timeout in receiving vdev delete response\n"); in ath10k_remove_interface()
5551 ret = ath10k_wait_for_peer_deleted(ar, arvif->vdev_id, in ath10k_remove_interface()
5554 ath10k_warn(ar, "failed to remove AP self-peer on vdev %i: %d\n", in ath10k_remove_interface()
5557 spin_lock_bh(&ar->data_lock); in ath10k_remove_interface()
5558 ar->num_peers--; in ath10k_remove_interface()
5559 spin_unlock_bh(&ar->data_lock); in ath10k_remove_interface()
5562 spin_lock_bh(&ar->data_lock); in ath10k_remove_interface()
5563 for (i = 0; i < ARRAY_SIZE(ar->peer_map); i++) { in ath10k_remove_interface()
5564 peer = ar->peer_map[i]; in ath10k_remove_interface()
5569 ath10k_warn(ar, "found vif peer %pM entry on vdev %i after it was supposedly removed\n", in ath10k_remove_interface()
5579 spin_unlock_bh(&ar->data_lock); in ath10k_remove_interface()
5581 ath10k_peer_cleanup(ar, arvif->vdev_id); in ath10k_remove_interface()
5582 ath10k_mac_txq_unref(ar, vif->txq); in ath10k_remove_interface()
5585 ar->monitor_arvif = NULL; in ath10k_remove_interface()
5586 ret = ath10k_monitor_recalc(ar); in ath10k_remove_interface()
5588 ath10k_warn(ar, "failed to recalc monitor: %d\n", ret); in ath10k_remove_interface()
5591 ret = ath10k_mac_txpower_recalc(ar); in ath10k_remove_interface()
5593 ath10k_warn(ar, "failed to recalc tx power: %d\n", ret); in ath10k_remove_interface()
5595 spin_lock_bh(&ar->htt.tx_lock); in ath10k_remove_interface()
5597 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_remove_interface()
5599 ath10k_mac_txq_unref(ar, vif->txq); in ath10k_remove_interface()
5602 mutex_unlock(&ar->conf_mutex); in ath10k_remove_interface()
5622 struct ath10k *ar = hw->priv; in ath10k_configure_filter() local
5625 mutex_lock(&ar->conf_mutex); in ath10k_configure_filter()
5629 ar->filter_flags = *total_flags; in ath10k_configure_filter()
5631 ret = ath10k_monitor_recalc(ar); in ath10k_configure_filter()
5633 ath10k_warn(ar, "failed to recalc monitor: %d\n", ret); in ath10k_configure_filter()
5635 mutex_unlock(&ar->conf_mutex); in ath10k_configure_filter()
5643 struct ath10k *ar = hw->priv; in ath10k_bss_info_changed() local
5653 mutex_lock(&ar->conf_mutex); in ath10k_bss_info_changed()
5660 vdev_param = ar->wmi.vdev_param->beacon_interval; in ath10k_bss_info_changed()
5661 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_bss_info_changed()
5663 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_bss_info_changed()
5668 ath10k_warn(ar, "failed to set beacon interval for vdev %d: %i\n", in ath10k_bss_info_changed()
5673 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_bss_info_changed()
5677 pdev_param = ar->wmi.pdev_param->beacon_tx_mode; in ath10k_bss_info_changed()
5678 ret = ath10k_wmi_pdev_set_param(ar, pdev_param, in ath10k_bss_info_changed()
5681 ath10k_warn(ar, "failed to set beacon mode for vdev %d: %i\n", in ath10k_bss_info_changed()
5686 ath10k_warn(ar, "failed to update beacon template: %d\n", in ath10k_bss_info_changed()
5700 ath10k_warn(ar, "failed to setup probe resp template on vdev %i: %d\n", in ath10k_bss_info_changed()
5707 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_bss_info_changed()
5711 vdev_param = ar->wmi.vdev_param->dtim_period; in ath10k_bss_info_changed()
5712 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_bss_info_changed()
5715 ath10k_warn(ar, "failed to set dtim period for vdev %d: %i\n", in ath10k_bss_info_changed()
5732 test_bit(WMI_SERVICE_RTT_RESPONDER_ROLE, ar->wmi.svc_map)) { in ath10k_bss_info_changed()
5735 vdev_param = ar->wmi.vdev_param->rtt_responder_role; in ath10k_bss_info_changed()
5736 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_bss_info_changed()
5739 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_bss_info_changed()
5752 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n", in ath10k_bss_info_changed()
5758 ath10k_warn(ar, "failed to set cts protection for vdev %d: %d\n", in ath10k_bss_info_changed()
5770 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d slot_time %d\n", in ath10k_bss_info_changed()
5773 vdev_param = ar->wmi.vdev_param->slot_time; in ath10k_bss_info_changed()
5774 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_bss_info_changed()
5777 ath10k_warn(ar, "failed to set erp slot for vdev %d: %i\n", in ath10k_bss_info_changed()
5787 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_bss_info_changed()
5791 vdev_param = ar->wmi.vdev_param->preamble; in ath10k_bss_info_changed()
5792 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_bss_info_changed()
5795 ath10k_warn(ar, "failed to set preamble for vdev %d: %i\n", in ath10k_bss_info_changed()
5805 if (ar->monitor_started) in ath10k_bss_info_changed()
5806 ath10k_monitor_stop(ar); in ath10k_bss_info_changed()
5808 ath10k_monitor_recalc(ar); in ath10k_bss_info_changed()
5815 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev_id %i txpower %d\n", in ath10k_bss_info_changed()
5819 ret = ath10k_mac_txpower_recalc(ar); in ath10k_bss_info_changed()
5821 ath10k_warn(ar, "failed to recalc tx power: %d\n", ret); in ath10k_bss_info_changed()
5827 ret = ath10k_config_ps(ar); in ath10k_bss_info_changed()
5829 ath10k_warn(ar, "failed to setup ps on vdev %i: %d\n", in ath10k_bss_info_changed()
5842 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) in ath10k_bss_info_changed()
5854 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_bss_info_changed()
5858 vdev_param = ar->wmi.vdev_param->mcast_data_rate; in ath10k_bss_info_changed()
5859 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, in ath10k_bss_info_changed()
5862 ath10k_warn(ar, in ath10k_bss_info_changed()
5866 vdev_param = ar->wmi.vdev_param->bcast_data_rate; in ath10k_bss_info_changed()
5867 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, in ath10k_bss_info_changed()
5870 ath10k_warn(ar, in ath10k_bss_info_changed()
5877 mutex_unlock(&ar->conf_mutex); in ath10k_bss_info_changed()
5881 sband = ar->hw->wiphy->bands[def.chan->band]; in ath10k_bss_info_changed()
5887 ath10k_warn(ar, "bitrate not supported %d\n", bitrate); in ath10k_bss_info_changed()
5888 mutex_unlock(&ar->conf_mutex); in ath10k_bss_info_changed()
5892 vdev_param = ar->wmi.vdev_param->mgmt_rate; in ath10k_bss_info_changed()
5893 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_bss_info_changed()
5896 ath10k_warn(ar, "failed to set mgmt tx rate %d\n", ret); in ath10k_bss_info_changed()
5899 mutex_unlock(&ar->conf_mutex); in ath10k_bss_info_changed()
5904 struct ath10k *ar = hw->priv; in ath10k_mac_op_set_coverage_class() local
5909 if (!ar->hw_params.hw_ops->set_coverage_class) { in ath10k_mac_op_set_coverage_class()
5913 ar->hw_params.hw_ops->set_coverage_class(ar, value); in ath10k_mac_op_set_coverage_class()
5949 struct ath10k *ar = hw->priv; in ath10k_hw_scan() local
5957 mutex_lock(&ar->conf_mutex); in ath10k_hw_scan()
5964 spin_lock_bh(&ar->data_lock); in ath10k_hw_scan()
5965 switch (ar->scan.state) { in ath10k_hw_scan()
5967 reinit_completion(&ar->scan.started); in ath10k_hw_scan()
5968 reinit_completion(&ar->scan.completed); in ath10k_hw_scan()
5969 ar->scan.state = ATH10K_SCAN_STARTING; in ath10k_hw_scan()
5970 ar->scan.is_roc = false; in ath10k_hw_scan()
5971 ar->scan.vdev_id = arvif->vdev_id; in ath10k_hw_scan()
5980 spin_unlock_bh(&ar->data_lock); in ath10k_hw_scan()
5986 ath10k_wmi_start_scan_init(ar, &arg); in ath10k_hw_scan()
6033 ret = ath10k_start_scan(ar, &arg); in ath10k_hw_scan()
6035 ath10k_warn(ar, "failed to start hw scan: %d\n", ret); in ath10k_hw_scan()
6036 spin_lock_bh(&ar->data_lock); in ath10k_hw_scan()
6037 ar->scan.state = ATH10K_SCAN_IDLE; in ath10k_hw_scan()
6038 spin_unlock_bh(&ar->data_lock); in ath10k_hw_scan()
6041 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout, in ath10k_hw_scan()
6045 mutex_unlock(&ar->conf_mutex); in ath10k_hw_scan()
6052 struct ath10k *ar = hw->priv; in ath10k_cancel_hw_scan() local
6054 mutex_lock(&ar->conf_mutex); in ath10k_cancel_hw_scan()
6055 ath10k_scan_abort(ar); in ath10k_cancel_hw_scan()
6056 mutex_unlock(&ar->conf_mutex); in ath10k_cancel_hw_scan()
6058 cancel_delayed_work_sync(&ar->scan.timeout); in ath10k_cancel_hw_scan()
6061 static void ath10k_set_key_h_def_keyidx(struct ath10k *ar, in ath10k_set_key_h_def_keyidx() argument
6066 u32 vdev_param = arvif->ar->wmi.vdev_param->def_keyid; in ath10k_set_key_h_def_keyidx()
6096 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_set_key_h_def_keyidx()
6099 ath10k_warn(ar, "failed to set vdev %i group key as default key: %d\n", in ath10k_set_key_h_def_keyidx()
6107 struct ath10k *ar = hw->priv; in ath10k_set_key() local
6131 mutex_lock(&ar->conf_mutex); in ath10k_set_key()
6152 spin_lock_bh(&ar->data_lock); in ath10k_set_key()
6153 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr); in ath10k_set_key()
6154 spin_unlock_bh(&ar->data_lock); in ath10k_set_key()
6158 ath10k_warn(ar, "failed to install key for non-existent peer %pM\n", in ath10k_set_key()
6198 ath10k_warn(ar, "failed to install key for vdev %i peer %pM: %d\n", in ath10k_set_key()
6214 ath10k_warn(ar, "failed to install (ucast) key for vdev %i peer %pM: %d\n", in ath10k_set_key()
6220 ath10k_warn(ar, "failed to disable (mcast) key for vdev %i peer %pM: %d\n", in ath10k_set_key()
6227 ath10k_set_key_h_def_keyidx(ar, arvif, cmd, key); in ath10k_set_key()
6229 spin_lock_bh(&ar->data_lock); in ath10k_set_key()
6230 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr); in ath10k_set_key()
6237 ath10k_warn(ar, "Peer %pM disappeared!\n", peer_addr); in ath10k_set_key()
6238 spin_unlock_bh(&ar->data_lock); in ath10k_set_key()
6241 ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr, in ath10k_set_key()
6245 mutex_unlock(&ar->conf_mutex); in ath10k_set_key()
6253 struct ath10k *ar = hw->priv; in ath10k_set_default_unicast_key() local
6257 mutex_lock(&arvif->ar->conf_mutex); in ath10k_set_default_unicast_key()
6259 if (arvif->ar->state != ATH10K_STATE_ON) in ath10k_set_default_unicast_key()
6262 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d set keyidx %d\n", in ath10k_set_default_unicast_key()
6265 ret = ath10k_wmi_vdev_set_param(arvif->ar, in ath10k_set_default_unicast_key()
6267 arvif->ar->wmi.vdev_param->def_keyid, in ath10k_set_default_unicast_key()
6271 ath10k_warn(ar, "failed to update wep key index for vdev %d: %d\n", in ath10k_set_default_unicast_key()
6280 mutex_unlock(&arvif->ar->conf_mutex); in ath10k_set_default_unicast_key()
6285 struct ath10k *ar; in ath10k_sta_rc_update_wk() local
6299 ar = arvif->ar; in ath10k_sta_rc_update_wk()
6308 spin_lock_bh(&ar->data_lock); in ath10k_sta_rc_update_wk()
6317 spin_unlock_bh(&ar->data_lock); in ath10k_sta_rc_update_wk()
6319 mutex_lock(&ar->conf_mutex); in ath10k_sta_rc_update_wk()
6329 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM peer bw %d phymode %d\n", in ath10k_sta_rc_update_wk()
6332 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr, in ath10k_sta_rc_update_wk()
6335 ath10k_warn(ar, "failed to update STA %pM peer phymode %d: %d\n", in ath10k_sta_rc_update_wk()
6340 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr, in ath10k_sta_rc_update_wk()
6343 ath10k_warn(ar, "failed to update STA %pM peer bw %d: %d\n", in ath10k_sta_rc_update_wk()
6348 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM nss %d\n", in ath10k_sta_rc_update_wk()
6351 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr, in ath10k_sta_rc_update_wk()
6354 ath10k_warn(ar, "failed to update STA %pM nss %d: %d\n", in ath10k_sta_rc_update_wk()
6359 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM smps %d\n", in ath10k_sta_rc_update_wk()
6362 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr, in ath10k_sta_rc_update_wk()
6365 ath10k_warn(ar, "failed to update STA %pM smps %d: %d\n", in ath10k_sta_rc_update_wk()
6370 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM supp rates\n", in ath10k_sta_rc_update_wk()
6373 err = ath10k_station_assoc(ar, arvif->vif, sta, true); in ath10k_sta_rc_update_wk()
6375 ath10k_warn(ar, "failed to reassociate station: %pM\n", in ath10k_sta_rc_update_wk()
6380 mutex_unlock(&ar->conf_mutex); in ath10k_sta_rc_update_wk()
6386 struct ath10k *ar = arvif->ar; in ath10k_mac_inc_num_stations() local
6388 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_inc_num_stations()
6393 if (ar->num_stations >= ar->max_num_stations) in ath10k_mac_inc_num_stations()
6396 ar->num_stations++; in ath10k_mac_inc_num_stations()
6404 struct ath10k *ar = arvif->ar; in ath10k_mac_dec_num_stations() local
6406 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_dec_num_stations()
6411 ar->num_stations--; in ath10k_mac_dec_num_stations()
6418 struct ath10k *ar = hw->priv; in ath10k_sta_set_txpwr() local
6434 mutex_lock(&ar->conf_mutex); in ath10k_sta_set_txpwr()
6436 ret = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr, in ath10k_sta_set_txpwr()
6439 ath10k_warn(ar, "failed to set tx power for station ret: %d\n", in ath10k_sta_set_txpwr()
6445 mutex_unlock(&ar->conf_mutex); in ath10k_sta_set_txpwr()
6455 struct ath10k *ar = hw->priv; in ath10k_sta_state() local
6478 mutex_lock(&ar->conf_mutex); in ath10k_sta_state()
6488 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_sta_state()
6491 ar->num_stations + 1, ar->max_num_stations, in ath10k_sta_state()
6492 ar->num_peers + 1, ar->max_num_peers); in ath10k_sta_state()
6497 if (num_tdls_stations >= ar->max_num_tdls_vdevs) { in ath10k_sta_state()
6498 ath10k_warn(ar, "vdev %i exceeded maximum number of tdls vdevs %i\n", in ath10k_sta_state()
6500 ar->max_num_tdls_vdevs); in ath10k_sta_state()
6509 ath10k_warn(ar, "refusing to associate station: too many connected already (%d)\n", in ath10k_sta_state()
6510 ar->max_num_stations); in ath10k_sta_state()
6514 if (ath10k_debug_is_extd_tx_stats_enabled(ar)) { in ath10k_sta_state()
6523 ret = ath10k_peer_create(ar, vif, sta, arvif->vdev_id, in ath10k_sta_state()
6526 ath10k_warn(ar, "failed to add peer %pM for vdev %d when adding a new sta: %i\n", in ath10k_sta_state()
6533 spin_lock_bh(&ar->data_lock); in ath10k_sta_state()
6535 peer = ath10k_peer_find(ar, arvif->vdev_id, sta->addr); in ath10k_sta_state()
6537 ath10k_warn(ar, "failed to lookup peer %pM on vdev %i\n", in ath10k_sta_state()
6539 spin_unlock_bh(&ar->data_lock); in ath10k_sta_state()
6540 ath10k_peer_delete(ar, arvif->vdev_id, sta->addr); in ath10k_sta_state()
6550 spin_unlock_bh(&ar->data_lock); in ath10k_sta_state()
6555 ret = ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id, in ath10k_sta_state()
6558 ath10k_warn(ar, "failed to update fw tdls state on vdev %i: %i\n", in ath10k_sta_state()
6560 ath10k_peer_delete(ar, arvif->vdev_id, in ath10k_sta_state()
6567 ret = ath10k_mac_tdls_peer_update(ar, arvif->vdev_id, sta, in ath10k_sta_state()
6570 ath10k_warn(ar, in ath10k_sta_state()
6573 ath10k_peer_delete(ar, arvif->vdev_id, sta->addr); in ath10k_sta_state()
6579 ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id, in ath10k_sta_state()
6587 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_sta_state()
6592 ret = ath10k_mac_tdls_peer_update(ar, arvif->vdev_id, in ath10k_sta_state()
6596 ath10k_warn(ar, "failed to update tdls peer state for %pM state %d: %i\n", in ath10k_sta_state()
6601 ret = ath10k_peer_delete(ar, arvif->vdev_id, sta->addr); in ath10k_sta_state()
6603 ath10k_warn(ar, "failed to delete peer %pM for vdev %d: %i\n", in ath10k_sta_state()
6608 spin_lock_bh(&ar->data_lock); in ath10k_sta_state()
6609 for (i = 0; i < ARRAY_SIZE(ar->peer_map); i++) { in ath10k_sta_state()
6610 peer = ar->peer_map[i]; in ath10k_sta_state()
6615 …ath10k_warn(ar, "found sta peer %pM (ptr %pK id %d) entry on vdev %i after it was supposedly remov… in ath10k_sta_state()
6623 ar->peer_map[i] = NULL; in ath10k_sta_state()
6625 ar->num_peers--; in ath10k_sta_state()
6628 spin_unlock_bh(&ar->data_lock); in ath10k_sta_state()
6630 if (ath10k_debug_is_extd_tx_stats_enabled(ar)) { in ath10k_sta_state()
6636 ath10k_mac_txq_unref(ar, sta->txq[i]); in ath10k_sta_state()
6645 ret = ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id, in ath10k_sta_state()
6648 ath10k_warn(ar, "failed to update fw tdls state on vdev %i: %i\n", in ath10k_sta_state()
6659 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac sta %pM associated\n", in ath10k_sta_state()
6662 ret = ath10k_station_assoc(ar, vif, sta, false); in ath10k_sta_state()
6664 ath10k_warn(ar, "failed to associate station %pM for vdev %i: %i\n", in ath10k_sta_state()
6672 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac tdls sta %pM authorized\n", in ath10k_sta_state()
6675 ret = ath10k_station_assoc(ar, vif, sta, false); in ath10k_sta_state()
6677 ath10k_warn(ar, "failed to associate tdls station %pM for vdev %i: %i\n", in ath10k_sta_state()
6682 ret = ath10k_mac_tdls_peer_update(ar, arvif->vdev_id, sta, in ath10k_sta_state()
6685 ath10k_warn(ar, "failed to update tdls peer %pM for vdev %i: %i\n", in ath10k_sta_state()
6695 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac sta %pM disassociated\n", in ath10k_sta_state()
6698 ret = ath10k_station_disassoc(ar, vif, sta); in ath10k_sta_state()
6700 ath10k_warn(ar, "failed to disassociate station: %pM vdev %i: %i\n", in ath10k_sta_state()
6704 mutex_unlock(&ar->conf_mutex); in ath10k_sta_state()
6708 static int ath10k_conf_tx_uapsd(struct ath10k *ar, struct ieee80211_vif *vif, in ath10k_conf_tx_uapsd() argument
6717 lockdep_assert_held(&ar->conf_mutex); in ath10k_conf_tx_uapsd()
6754 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath10k_conf_tx_uapsd()
6758 ath10k_warn(ar, "failed to set uapsd params: %d\n", ret); in ath10k_conf_tx_uapsd()
6767 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath10k_conf_tx_uapsd()
6771 ath10k_warn(ar, "failed to set rx wake param: %d\n", ret); in ath10k_conf_tx_uapsd()
6775 ath10k_warn(ar, "failed to recalc ps wake threshold on vdev %i: %d\n", in ath10k_conf_tx_uapsd()
6782 ath10k_warn(ar, "failed to recalc ps poll count on vdev %i: %d\n", in ath10k_conf_tx_uapsd()
6787 if (test_bit(WMI_SERVICE_STA_UAPSD_BASIC_AUTO_TRIG, ar->wmi.svc_map) || in ath10k_conf_tx_uapsd()
6788 test_bit(WMI_SERVICE_STA_UAPSD_VAR_AUTO_TRIG, ar->wmi.svc_map)) { in ath10k_conf_tx_uapsd()
6801 ret = ath10k_wmi_vdev_sta_uapsd(ar, arvif->vdev_id, in ath10k_conf_tx_uapsd()
6804 ath10k_warn(ar, "failed to set uapsd auto trigger %d\n", in ath10k_conf_tx_uapsd()
6818 struct ath10k *ar = hw->priv; in ath10k_conf_tx() local
6823 mutex_lock(&ar->conf_mutex); in ath10k_conf_tx()
6856 if (ar->wmi.ops->gen_vdev_wmm_conf) { in ath10k_conf_tx()
6857 ret = ath10k_wmi_vdev_wmm_conf(ar, arvif->vdev_id, in ath10k_conf_tx()
6860 ath10k_warn(ar, "failed to set vdev wmm params on vdev %i: %d\n", in ath10k_conf_tx()
6868 ret = ath10k_wmi_pdev_set_wmm_params(ar, &arvif->wmm_params); in ath10k_conf_tx()
6870 ath10k_warn(ar, "failed to set wmm params: %d\n", ret); in ath10k_conf_tx()
6875 ret = ath10k_conf_tx_uapsd(ar, vif, ac, params->uapsd); in ath10k_conf_tx()
6877 ath10k_warn(ar, "failed to set sta uapsd: %d\n", ret); in ath10k_conf_tx()
6880 mutex_unlock(&ar->conf_mutex); in ath10k_conf_tx()
6892 struct ath10k *ar = hw->priv; in ath10k_remain_on_channel() local
6898 mutex_lock(&ar->conf_mutex); in ath10k_remain_on_channel()
6905 spin_lock_bh(&ar->data_lock); in ath10k_remain_on_channel()
6906 switch (ar->scan.state) { in ath10k_remain_on_channel()
6908 reinit_completion(&ar->scan.started); in ath10k_remain_on_channel()
6909 reinit_completion(&ar->scan.completed); in ath10k_remain_on_channel()
6910 reinit_completion(&ar->scan.on_channel); in ath10k_remain_on_channel()
6911 ar->scan.state = ATH10K_SCAN_STARTING; in ath10k_remain_on_channel()
6912 ar->scan.is_roc = true; in ath10k_remain_on_channel()
6913 ar->scan.vdev_id = arvif->vdev_id; in ath10k_remain_on_channel()
6914 ar->scan.roc_freq = chan->center_freq; in ath10k_remain_on_channel()
6915 ar->scan.roc_notify = true; in ath10k_remain_on_channel()
6924 spin_unlock_bh(&ar->data_lock); in ath10k_remain_on_channel()
6929 scan_time_msec = ar->hw->wiphy->max_remain_on_channel_duration * 2; in ath10k_remain_on_channel()
6932 ath10k_wmi_start_scan_init(ar, &arg); in ath10k_remain_on_channel()
6944 ret = ath10k_start_scan(ar, &arg); in ath10k_remain_on_channel()
6946 ath10k_warn(ar, "failed to start roc scan: %d\n", ret); in ath10k_remain_on_channel()
6947 spin_lock_bh(&ar->data_lock); in ath10k_remain_on_channel()
6948 ar->scan.state = ATH10K_SCAN_IDLE; in ath10k_remain_on_channel()
6949 spin_unlock_bh(&ar->data_lock); in ath10k_remain_on_channel()
6953 ret = wait_for_completion_timeout(&ar->scan.on_channel, 3 * HZ); in ath10k_remain_on_channel()
6955 ath10k_warn(ar, "failed to switch to channel for roc scan\n"); in ath10k_remain_on_channel()
6957 ret = ath10k_scan_stop(ar); in ath10k_remain_on_channel()
6959 ath10k_warn(ar, "failed to stop scan: %d\n", ret); in ath10k_remain_on_channel()
6965 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout, in ath10k_remain_on_channel()
6970 mutex_unlock(&ar->conf_mutex); in ath10k_remain_on_channel()
6977 struct ath10k *ar = hw->priv; in ath10k_cancel_remain_on_channel() local
6979 mutex_lock(&ar->conf_mutex); in ath10k_cancel_remain_on_channel()
6981 spin_lock_bh(&ar->data_lock); in ath10k_cancel_remain_on_channel()
6982 ar->scan.roc_notify = false; in ath10k_cancel_remain_on_channel()
6983 spin_unlock_bh(&ar->data_lock); in ath10k_cancel_remain_on_channel()
6985 ath10k_scan_abort(ar); in ath10k_cancel_remain_on_channel()
6987 mutex_unlock(&ar->conf_mutex); in ath10k_cancel_remain_on_channel()
6989 cancel_delayed_work_sync(&ar->scan.timeout); in ath10k_cancel_remain_on_channel()
7001 struct ath10k *ar = hw->priv; in ath10k_set_rts_threshold() local
7005 mutex_lock(&ar->conf_mutex); in ath10k_set_rts_threshold()
7006 list_for_each_entry(arvif, &ar->arvifs, list) { in ath10k_set_rts_threshold()
7007 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d rts threshold %d\n", in ath10k_set_rts_threshold()
7012 ath10k_warn(ar, "failed to set rts threshold for vdev %d: %d\n", in ath10k_set_rts_threshold()
7017 mutex_unlock(&ar->conf_mutex); in ath10k_set_rts_threshold()
7037 void ath10k_mac_wait_tx_complete(struct ath10k *ar) in ath10k_mac_wait_tx_complete() argument
7046 if (ar->state == ATH10K_STATE_WEDGED) in ath10k_mac_wait_tx_complete()
7049 time_left = wait_event_timeout(ar->htt.empty_tx_wq, ({ in ath10k_mac_wait_tx_complete()
7052 spin_lock_bh(&ar->htt.tx_lock); in ath10k_mac_wait_tx_complete()
7053 empty = (ar->htt.num_pending_tx == 0); in ath10k_mac_wait_tx_complete()
7054 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_wait_tx_complete()
7056 skip = (ar->state == ATH10K_STATE_WEDGED) || in ath10k_mac_wait_tx_complete()
7058 &ar->dev_flags); in ath10k_mac_wait_tx_complete()
7064 ath10k_warn(ar, "failed to flush transmit queue (skip %i ar-state %i): %ld\n", in ath10k_mac_wait_tx_complete()
7065 skip, ar->state, time_left); in ath10k_mac_wait_tx_complete()
7071 struct ath10k *ar = hw->priv; in ath10k_flush() local
7078 list_for_each_entry(arvif, &ar->arvifs, list) { in ath10k_flush()
7080 ath10k_wmi_peer_flush(ar, arvif->vdev_id, in ath10k_flush()
7087 mutex_lock(&ar->conf_mutex); in ath10k_flush()
7088 ath10k_mac_wait_tx_complete(ar); in ath10k_flush()
7089 mutex_unlock(&ar->conf_mutex); in ath10k_flush()
7104 struct ath10k *ar = hw->priv; in ath10k_reconfig_complete() local
7109 mutex_lock(&ar->conf_mutex); in ath10k_reconfig_complete()
7114 if (ar->state == ATH10K_STATE_RESTARTED) { in ath10k_reconfig_complete()
7115 ath10k_info(ar, "device successfully recovered\n"); in ath10k_reconfig_complete()
7116 ar->state = ATH10K_STATE_ON; in ath10k_reconfig_complete()
7117 ieee80211_wake_queues(ar->hw); in ath10k_reconfig_complete()
7120 mutex_unlock(&ar->conf_mutex); in ath10k_reconfig_complete()
7124 ath10k_mac_update_bss_chan_survey(struct ath10k *ar, in ath10k_mac_update_bss_chan_survey() argument
7130 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_update_bss_chan_survey()
7132 if (!test_bit(WMI_SERVICE_BSS_CHANNEL_INFO_64, ar->wmi.svc_map) || in ath10k_mac_update_bss_chan_survey()
7133 (ar->rx_channel != channel)) in ath10k_mac_update_bss_chan_survey()
7136 if (ar->scan.state != ATH10K_SCAN_IDLE) { in ath10k_mac_update_bss_chan_survey()
7137 ath10k_dbg(ar, ATH10K_DBG_MAC, "ignoring bss chan info request while scanning..\n"); in ath10k_mac_update_bss_chan_survey()
7141 reinit_completion(&ar->bss_survey_done); in ath10k_mac_update_bss_chan_survey()
7143 ret = ath10k_wmi_pdev_bss_chan_info_request(ar, type); in ath10k_mac_update_bss_chan_survey()
7145 ath10k_warn(ar, "failed to send pdev bss chan info request\n"); in ath10k_mac_update_bss_chan_survey()
7149 ret = wait_for_completion_timeout(&ar->bss_survey_done, 3 * HZ); in ath10k_mac_update_bss_chan_survey()
7151 ath10k_warn(ar, "bss channel survey timed out\n"); in ath10k_mac_update_bss_chan_survey()
7159 struct ath10k *ar = hw->priv; in ath10k_get_survey() local
7161 struct survey_info *ar_survey = &ar->survey[idx]; in ath10k_get_survey()
7164 mutex_lock(&ar->conf_mutex); in ath10k_get_survey()
7180 ath10k_mac_update_bss_chan_survey(ar, &sband->channels[idx]); in ath10k_get_survey()
7182 spin_lock_bh(&ar->data_lock); in ath10k_get_survey()
7184 spin_unlock_bh(&ar->data_lock); in ath10k_get_survey()
7188 if (ar->rx_channel == survey->channel) in ath10k_get_survey()
7192 mutex_unlock(&ar->conf_mutex); in ath10k_get_survey()
7197 ath10k_mac_bitrate_mask_has_single_rate(struct ath10k *ar, in ath10k_mac_bitrate_mask_has_single_rate() argument
7221 ath10k_mac_bitrate_mask_get_single_nss(struct ath10k *ar, in ath10k_mac_bitrate_mask_get_single_nss() argument
7226 struct ieee80211_supported_band *sband = &ar->mac.sbands[band]; in ath10k_mac_bitrate_mask_get_single_nss()
7270 ath10k_mac_bitrate_mask_get_single_rate(struct ath10k *ar, in ath10k_mac_bitrate_mask_get_single_rate() argument
7287 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) in ath10k_mac_bitrate_mask_get_single_rate()
7335 struct ath10k *ar = arvif->ar; in ath10k_mac_set_fixed_rate_params() local
7339 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_set_fixed_rate_params()
7341 …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()
7344 vdev_param = ar->wmi.vdev_param->fixed_rate; in ath10k_mac_set_fixed_rate_params()
7345 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, rate); in ath10k_mac_set_fixed_rate_params()
7347 ath10k_warn(ar, "failed to set fixed rate param 0x%02x: %d\n", in ath10k_mac_set_fixed_rate_params()
7352 vdev_param = ar->wmi.vdev_param->nss; in ath10k_mac_set_fixed_rate_params()
7353 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, nss); in ath10k_mac_set_fixed_rate_params()
7355 ath10k_warn(ar, "failed to set nss param %d: %d\n", nss, ret); in ath10k_mac_set_fixed_rate_params()
7359 vdev_param = ar->wmi.vdev_param->sgi; in ath10k_mac_set_fixed_rate_params()
7360 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, sgi); in ath10k_mac_set_fixed_rate_params()
7362 ath10k_warn(ar, "failed to set sgi param %d: %d\n", sgi, ret); in ath10k_mac_set_fixed_rate_params()
7366 vdev_param = ar->wmi.vdev_param->ldpc; in ath10k_mac_set_fixed_rate_params()
7367 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, ldpc); in ath10k_mac_set_fixed_rate_params()
7369 ath10k_warn(ar, "failed to set ldpc param %d: %d\n", ldpc, ret); in ath10k_mac_set_fixed_rate_params()
7377 ath10k_mac_can_set_bitrate_mask(struct ath10k *ar, in ath10k_mac_can_set_bitrate_mask() argument
7400 ath10k_warn(ar, "refusing bitrate mask with missing 0-7 VHT MCS rates\n"); in ath10k_mac_can_set_bitrate_mask()
7408 static bool ath10k_mac_set_vht_bitrate_mask_fixup(struct ath10k *ar, in ath10k_mac_set_vht_bitrate_mask_fixup() argument
7419 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr, in ath10k_mac_set_vht_bitrate_mask_fixup()
7422 ath10k_warn(ar, "failed to eanble STA %pM peer fixed rate: %d\n", in ath10k_mac_set_vht_bitrate_mask_fixup()
7433 struct ath10k *ar = arvif->ar; in ath10k_mac_set_bitrate_mask_iter() local
7438 if (ath10k_mac_set_vht_bitrate_mask_fixup(ar, arvif, sta)) in ath10k_mac_set_bitrate_mask_iter()
7441 spin_lock_bh(&ar->data_lock); in ath10k_mac_set_bitrate_mask_iter()
7443 spin_unlock_bh(&ar->data_lock); in ath10k_mac_set_bitrate_mask_iter()
7445 ieee80211_queue_work(ar->hw, &arsta->update_wk); in ath10k_mac_set_bitrate_mask_iter()
7453 struct ath10k *ar = arvif->ar; in ath10k_mac_clr_bitrate_mask_iter() local
7460 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr, in ath10k_mac_clr_bitrate_mask_iter()
7464 ath10k_warn(ar, "failed to clear STA %pM peer fixed rate: %d\n", in ath10k_mac_clr_bitrate_mask_iter()
7474 struct ath10k *ar = arvif->ar; in ath10k_mac_op_set_bitrate_mask() local
7494 ldpc = !!(ar->ht_cap_info & WMI_HT_CAP_LDPC); in ath10k_mac_op_set_bitrate_mask()
7501 ar->normal_mode_fw.fw_file.fw_features); in ath10k_mac_op_set_bitrate_mask()
7503 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_set_bitrate_mask()
7504 ieee80211_iterate_stations_atomic(ar->hw, in ath10k_mac_op_set_bitrate_mask()
7507 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_set_bitrate_mask()
7510 if (ath10k_mac_bitrate_mask_has_single_rate(ar, band, mask, in ath10k_mac_op_set_bitrate_mask()
7512 ret = ath10k_mac_bitrate_mask_get_single_rate(ar, band, mask, in ath10k_mac_op_set_bitrate_mask()
7516 ath10k_warn(ar, "failed to get single rate for vdev %i: %d\n", in ath10k_mac_op_set_bitrate_mask()
7520 } else if (ath10k_mac_bitrate_mask_get_single_nss(ar, band, mask, in ath10k_mac_op_set_bitrate_mask()
7526 nss = min(ar->num_rf_chains, in ath10k_mac_op_set_bitrate_mask()
7530 if (!ath10k_mac_can_set_bitrate_mask(ar, band, mask, in ath10k_mac_op_set_bitrate_mask()
7541 ath10k_mac_bitrate_mask_get_single_rate(ar, band, mask, in ath10k_mac_op_set_bitrate_mask()
7550 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_set_bitrate_mask()
7556 ieee80211_iterate_stations_atomic(ar->hw, in ath10k_mac_op_set_bitrate_mask()
7560 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_set_bitrate_mask()
7563 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_set_bitrate_mask()
7567 ath10k_warn(ar, "failed to set fixed rate params on vdev %i: %d\n", in ath10k_mac_op_set_bitrate_mask()
7573 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_set_bitrate_mask()
7583 struct ath10k *ar = hw->priv; in ath10k_sta_rc_update() local
7589 spin_lock_bh(&ar->data_lock); in ath10k_sta_rc_update()
7591 peer = ath10k_peer_find(ar, arvif->vdev_id, sta->addr); in ath10k_sta_rc_update()
7593 spin_unlock_bh(&ar->data_lock); in ath10k_sta_rc_update()
7594 ath10k_warn(ar, "mac sta rc update failed to find peer %pM on vdev %i\n", in ath10k_sta_rc_update()
7599 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_sta_rc_update()
7621 ath10k_warn(ar, "Invalid bandwidth %d in rc update for %pM\n", in ath10k_sta_rc_update()
7648 ath10k_warn(ar, "Invalid smps %d in sta rc update for %pM\n", in ath10k_sta_rc_update()
7659 spin_unlock_bh(&ar->data_lock); in ath10k_sta_rc_update()
7667 struct ath10k *ar = hw->priv; in ath10k_offset_tsf() local
7673 vdev_param = ar->wmi.vdev_param->dec_tsf; in ath10k_offset_tsf()
7676 vdev_param = ar->wmi.vdev_param->inc_tsf; in ath10k_offset_tsf()
7680 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, in ath10k_offset_tsf()
7684 ath10k_warn(ar, "failed to set tsf offset %d cmd %d: %d\n", in ath10k_offset_tsf()
7692 struct ath10k *ar = hw->priv; in ath10k_ampdu_action() local
7698 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac ampdu vdev_id %i sta %pM tid %hu action %d\n", in ath10k_ampdu_action()
7723 ath10k_mac_update_rx_channel(struct ath10k *ar, in ath10k_mac_update_rx_channel() argument
7733 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_update_rx_channel()
7734 lockdep_assert_held(&ar->data_lock); in ath10k_mac_update_rx_channel()
7750 if (!ctx && ath10k_mac_num_chanctxs(ar) == 1) { in ath10k_mac_update_rx_channel()
7751 ieee80211_iter_chan_contexts_atomic(ar->hw, in ath10k_mac_update_rx_channel()
7758 ar->rx_channel = def->chan; in ath10k_mac_update_rx_channel()
7759 } else if ((ctx && ath10k_mac_num_chanctxs(ar) == 0) || in ath10k_mac_update_rx_channel()
7760 (ctx && (ar->state == ATH10K_STATE_RESTARTED))) { in ath10k_mac_update_rx_channel()
7766 ar->rx_channel = ctx->def.chan; in ath10k_mac_update_rx_channel()
7768 ar->rx_channel = NULL; in ath10k_mac_update_rx_channel()
7774 ath10k_mac_update_vif_chan(struct ath10k *ar, in ath10k_mac_update_vif_chan() argument
7782 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_update_vif_chan()
7787 if (ar->monitor_started) in ath10k_mac_update_vif_chan()
7788 ath10k_monitor_stop(ar); in ath10k_mac_update_vif_chan()
7793 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_mac_update_vif_chan()
7807 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id); in ath10k_mac_update_vif_chan()
7809 ath10k_warn(ar, "failed to down vdev %d: %d\n", in ath10k_mac_update_vif_chan()
7819 spin_lock_bh(&ar->data_lock); in ath10k_mac_update_vif_chan()
7820 ath10k_mac_update_rx_channel(ar, NULL, vifs, n_vifs); in ath10k_mac_update_vif_chan()
7821 spin_unlock_bh(&ar->data_lock); in ath10k_mac_update_vif_chan()
7834 ath10k_warn(ar, "failed to update bcn tmpl during csa: %d\n", in ath10k_mac_update_vif_chan()
7839 ath10k_warn(ar, "failed to update prb tmpl during csa: %d\n", in ath10k_mac_update_vif_chan()
7844 ath10k_warn(ar, "failed to restart vdev %d: %d\n", in ath10k_mac_update_vif_chan()
7849 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid, in ath10k_mac_update_vif_chan()
7852 ath10k_warn(ar, "failed to bring vdev up %d: %d\n", in ath10k_mac_update_vif_chan()
7858 ath10k_monitor_recalc(ar); in ath10k_mac_update_vif_chan()
7865 struct ath10k *ar = hw->priv; in ath10k_mac_op_add_chanctx() local
7867 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_mac_op_add_chanctx()
7871 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_add_chanctx()
7873 spin_lock_bh(&ar->data_lock); in ath10k_mac_op_add_chanctx()
7874 ath10k_mac_update_rx_channel(ar, ctx, NULL, 0); in ath10k_mac_op_add_chanctx()
7875 spin_unlock_bh(&ar->data_lock); in ath10k_mac_op_add_chanctx()
7877 ath10k_recalc_radar_detection(ar); in ath10k_mac_op_add_chanctx()
7878 ath10k_monitor_recalc(ar); in ath10k_mac_op_add_chanctx()
7880 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_add_chanctx()
7889 struct ath10k *ar = hw->priv; in ath10k_mac_op_remove_chanctx() local
7891 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_mac_op_remove_chanctx()
7895 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_remove_chanctx()
7897 spin_lock_bh(&ar->data_lock); in ath10k_mac_op_remove_chanctx()
7898 ath10k_mac_update_rx_channel(ar, NULL, NULL, 0); in ath10k_mac_op_remove_chanctx()
7899 spin_unlock_bh(&ar->data_lock); in ath10k_mac_op_remove_chanctx()
7901 ath10k_recalc_radar_detection(ar); in ath10k_mac_op_remove_chanctx()
7902 ath10k_monitor_recalc(ar); in ath10k_mac_op_remove_chanctx()
7904 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_remove_chanctx()
7951 struct ath10k *ar = hw->priv; in ath10k_mac_op_change_chanctx() local
7954 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_change_chanctx()
7956 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_mac_op_change_chanctx()
7985 ath10k_mac_update_vif_chan(ar, arg.vifs, arg.n_vifs); in ath10k_mac_op_change_chanctx()
7990 ath10k_recalc_radar_detection(ar); in ath10k_mac_op_change_chanctx()
8000 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_change_chanctx()
8008 struct ath10k *ar = hw->priv; in ath10k_mac_op_assign_vif_chanctx() local
8012 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_assign_vif_chanctx()
8014 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_mac_op_assign_vif_chanctx()
8019 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_assign_vif_chanctx()
8025 ath10k_warn(ar, "failed to start vdev %i addr %pM on freq %d: %d\n", in ath10k_mac_op_assign_vif_chanctx()
8035 ath10k_warn(ar, "failed to update vdev %i ps: %d\n", in ath10k_mac_op_assign_vif_chanctx()
8041 ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, 0, vif->addr); in ath10k_mac_op_assign_vif_chanctx()
8043 ath10k_warn(ar, "failed to up monitor vdev %i: %d\n", in ath10k_mac_op_assign_vif_chanctx()
8054 ath10k_warn(ar, "failed to set cts protection for vdev %d: %d\n", in ath10k_mac_op_assign_vif_chanctx()
8058 if (ath10k_peer_stats_enabled(ar) && in ath10k_mac_op_assign_vif_chanctx()
8059 ar->hw_params.tx_stats_over_pktlog) { in ath10k_mac_op_assign_vif_chanctx()
8060 ar->pktlog_filter |= ATH10K_PKTLOG_PEER_STATS; in ath10k_mac_op_assign_vif_chanctx()
8061 ret = ath10k_wmi_pdev_pktlog_enable(ar, in ath10k_mac_op_assign_vif_chanctx()
8062 ar->pktlog_filter); in ath10k_mac_op_assign_vif_chanctx()
8064 ath10k_warn(ar, "failed to enable pktlog %d\n", ret); in ath10k_mac_op_assign_vif_chanctx()
8069 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_assign_vif_chanctx()
8078 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_assign_vif_chanctx()
8087 struct ath10k *ar = hw->priv; in ath10k_mac_op_unassign_vif_chanctx() local
8091 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_unassign_vif_chanctx()
8093 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_mac_op_unassign_vif_chanctx()
8102 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id); in ath10k_mac_op_unassign_vif_chanctx()
8104 ath10k_warn(ar, "failed to down monitor vdev %i: %d\n", in ath10k_mac_op_unassign_vif_chanctx()
8112 ath10k_warn(ar, "failed to stop vdev %i: %d\n", in ath10k_mac_op_unassign_vif_chanctx()
8117 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_unassign_vif_chanctx()
8126 struct ath10k *ar = hw->priv; in ath10k_mac_op_switch_vif_chanctx() local
8128 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_switch_vif_chanctx()
8130 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_mac_op_switch_vif_chanctx()
8133 ath10k_mac_update_vif_chan(ar, vifs, n_vifs); in ath10k_mac_op_switch_vif_chanctx()
8135 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_switch_vif_chanctx()
8143 struct ath10k *ar; in ath10k_mac_op_sta_pre_rcu_remove() local
8146 ar = hw->priv; in ath10k_mac_op_sta_pre_rcu_remove()
8148 list_for_each_entry(peer, &ar->peers, list) in ath10k_mac_op_sta_pre_rcu_remove()
8159 struct ath10k *ar = arsta->arvif->ar; in ath10k_sta_statistics() local
8161 if (!ath10k_peer_stats_enabled(ar)) in ath10k_sta_statistics()
8308 struct ath10k *ar; in ath10k_mac_create() local
8320 ar = hw->priv; in ath10k_mac_create()
8321 ar->hw = hw; in ath10k_mac_create()
8322 ar->ops = ops; in ath10k_mac_create()
8324 return ar; in ath10k_mac_create()
8327 void ath10k_mac_destroy(struct ath10k *ar) in ath10k_mac_destroy() argument
8329 struct ieee80211_ops *ops = ar->ops; in ath10k_mac_destroy()
8331 ieee80211_free_hw(ar->hw); in ath10k_mac_destroy()
8551 struct ath10k_vif *ath10k_get_arvif(struct ath10k *ar, u32 vdev_id) in ath10k_get_arvif() argument
8560 ieee80211_iterate_active_interfaces_atomic(ar->hw, in ath10k_get_arvif()
8565 ath10k_warn(ar, "No VIF found for vdev %d\n", vdev_id); in ath10k_get_arvif()
8575 static u32 ath10k_mac_wrdd_get_mcc(struct ath10k *ar, union acpi_object *wrdd) in ath10k_mac_wrdd_get_mcc() argument
8586 ath10k_warn(ar, "ignoring malformed/unsupported wrdd structure\n"); in ath10k_mac_wrdd_get_mcc()
8611 static int ath10k_mac_get_wrdd_regulatory(struct ath10k *ar, u16 *rd) in ath10k_mac_get_wrdd_regulatory() argument
8620 root_handle = ACPI_HANDLE(ar->dev); in ath10k_mac_get_wrdd_regulatory()
8626 ath10k_dbg(ar, ATH10K_DBG_BOOT, in ath10k_mac_get_wrdd_regulatory()
8633 ath10k_dbg(ar, ATH10K_DBG_BOOT, in ath10k_mac_get_wrdd_regulatory()
8638 alpha2_code = ath10k_mac_wrdd_get_mcc(ar, wrdd.pointer); in ath10k_mac_get_wrdd_regulatory()
8647 ath10k_dbg(ar, ATH10K_DBG_BOOT, in ath10k_mac_get_wrdd_regulatory()
8658 static int ath10k_mac_init_rd(struct ath10k *ar) in ath10k_mac_init_rd() argument
8663 ret = ath10k_mac_get_wrdd_regulatory(ar, &rd); in ath10k_mac_init_rd()
8665 ath10k_dbg(ar, ATH10K_DBG_BOOT, in ath10k_mac_init_rd()
8667 rd = ar->hw_eeprom_rd; in ath10k_mac_init_rd()
8670 ar->ath_common.regulatory.current_rd = rd; in ath10k_mac_init_rd()
8674 int ath10k_mac_register(struct ath10k *ar) in ath10k_mac_register() argument
8702 if (!is_valid_ether_addr(ar->mac_addr)) { in ath10k_mac_register()
8703 ath10k_warn(ar, "invalid MAC address; choosing random\n"); in ath10k_mac_register()
8704 eth_random_addr(ar->mac_addr); in ath10k_mac_register()
8706 SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr); in ath10k_mac_register()
8708 SET_IEEE80211_DEV(ar->hw, ar->dev); in ath10k_mac_register()
8714 if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) { in ath10k_mac_register()
8723 band = &ar->mac.sbands[NL80211_BAND_2GHZ]; in ath10k_mac_register()
8727 if (ar->hw_params.cck_rate_map_rev2) { in ath10k_mac_register()
8735 ar->hw->wiphy->bands[NL80211_BAND_2GHZ] = band; in ath10k_mac_register()
8738 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) { in ath10k_mac_register()
8747 band = &ar->mac.sbands[NL80211_BAND_5GHZ]; in ath10k_mac_register()
8752 ar->hw->wiphy->bands[NL80211_BAND_5GHZ] = band; in ath10k_mac_register()
8755 wiphy_read_of_freq_limits(ar->hw->wiphy); in ath10k_mac_register()
8756 ath10k_mac_setup_ht_vht_cap(ar); in ath10k_mac_register()
8758 ar->hw->wiphy->interface_modes = in ath10k_mac_register()
8763 ar->hw->wiphy->available_antennas_rx = ar->cfg_rx_chainmask; in ath10k_mac_register()
8764 ar->hw->wiphy->available_antennas_tx = ar->cfg_tx_chainmask; in ath10k_mac_register()
8766 if (!test_bit(ATH10K_FW_FEATURE_NO_P2P, ar->normal_mode_fw.fw_file.fw_features)) in ath10k_mac_register()
8767 ar->hw->wiphy->interface_modes |= in ath10k_mac_register()
8772 ieee80211_hw_set(ar->hw, SIGNAL_DBM); in ath10k_mac_register()
8775 ar->running_fw->fw_file.fw_features)) { in ath10k_mac_register()
8776 ieee80211_hw_set(ar->hw, SUPPORTS_PS); in ath10k_mac_register()
8777 ieee80211_hw_set(ar->hw, SUPPORTS_DYNAMIC_PS); in ath10k_mac_register()
8780 ieee80211_hw_set(ar->hw, MFP_CAPABLE); in ath10k_mac_register()
8781 ieee80211_hw_set(ar->hw, REPORTS_TX_ACK_STATUS); in ath10k_mac_register()
8782 ieee80211_hw_set(ar->hw, HAS_RATE_CONTROL); in ath10k_mac_register()
8783 ieee80211_hw_set(ar->hw, AP_LINK_PS); in ath10k_mac_register()
8784 ieee80211_hw_set(ar->hw, SPECTRUM_MGMT); in ath10k_mac_register()
8785 ieee80211_hw_set(ar->hw, SUPPORT_FAST_XMIT); in ath10k_mac_register()
8786 ieee80211_hw_set(ar->hw, CONNECTION_MONITOR); in ath10k_mac_register()
8787 ieee80211_hw_set(ar->hw, SUPPORTS_PER_STA_GTK); in ath10k_mac_register()
8788 ieee80211_hw_set(ar->hw, WANT_MONITOR_VIF); in ath10k_mac_register()
8789 ieee80211_hw_set(ar->hw, CHANCTX_STA_CSA); in ath10k_mac_register()
8790 ieee80211_hw_set(ar->hw, QUEUE_CONTROL); in ath10k_mac_register()
8791 ieee80211_hw_set(ar->hw, SUPPORTS_TX_FRAG); in ath10k_mac_register()
8792 ieee80211_hw_set(ar->hw, REPORTS_LOW_ACK); in ath10k_mac_register()
8794 if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) in ath10k_mac_register()
8795 ieee80211_hw_set(ar->hw, SW_CRYPTO_CONTROL); in ath10k_mac_register()
8797 ar->hw->wiphy->features |= NL80211_FEATURE_STATIC_SMPS; in ath10k_mac_register()
8798 ar->hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN; in ath10k_mac_register()
8800 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) in ath10k_mac_register()
8801 ar->hw->wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS; in ath10k_mac_register()
8803 if (ar->ht_cap_info & WMI_HT_CAP_ENABLED) { in ath10k_mac_register()
8804 ieee80211_hw_set(ar->hw, AMPDU_AGGREGATION); in ath10k_mac_register()
8805 ieee80211_hw_set(ar->hw, TX_AMPDU_SETUP_IN_HW); in ath10k_mac_register()
8808 ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID; in ath10k_mac_register()
8809 ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN; in ath10k_mac_register()
8811 if (test_bit(WMI_SERVICE_NLO, ar->wmi.svc_map)) { in ath10k_mac_register()
8812 ar->hw->wiphy->max_sched_scan_reqs = 1; in ath10k_mac_register()
8813 ar->hw->wiphy->max_sched_scan_ssids = WMI_PNO_MAX_SUPP_NETWORKS; in ath10k_mac_register()
8814 ar->hw->wiphy->max_match_sets = WMI_PNO_MAX_SUPP_NETWORKS; in ath10k_mac_register()
8815 ar->hw->wiphy->max_sched_scan_ie_len = WMI_PNO_MAX_IE_LENGTH; in ath10k_mac_register()
8816 ar->hw->wiphy->max_sched_scan_plans = WMI_PNO_MAX_SCHED_SCAN_PLANS; in ath10k_mac_register()
8817 ar->hw->wiphy->max_sched_scan_plan_interval = in ath10k_mac_register()
8819 ar->hw->wiphy->max_sched_scan_plan_iterations = in ath10k_mac_register()
8823 ar->hw->vif_data_size = sizeof(struct ath10k_vif); in ath10k_mac_register()
8824 ar->hw->sta_data_size = sizeof(struct ath10k_sta); in ath10k_mac_register()
8825 ar->hw->txq_data_size = sizeof(struct ath10k_txq); in ath10k_mac_register()
8827 ar->hw->max_listen_interval = ATH10K_MAX_HW_LISTEN_INTERVAL; in ath10k_mac_register()
8829 if (test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map)) { in ath10k_mac_register()
8830 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD; in ath10k_mac_register()
8836 ar->hw->wiphy->probe_resp_offload |= in ath10k_mac_register()
8842 if (test_bit(WMI_SERVICE_TDLS, ar->wmi.svc_map) || in ath10k_mac_register()
8843 test_bit(WMI_SERVICE_TDLS_EXPLICIT_MODE_ONLY, ar->wmi.svc_map)) { in ath10k_mac_register()
8844 ar->hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS; in ath10k_mac_register()
8845 if (test_bit(WMI_SERVICE_TDLS_WIDER_BANDWIDTH, ar->wmi.svc_map)) in ath10k_mac_register()
8846 ieee80211_hw_set(ar->hw, TDLS_WIDER_BW); in ath10k_mac_register()
8849 if (test_bit(WMI_SERVICE_TDLS_UAPSD_BUFFER_STA, ar->wmi.svc_map)) in ath10k_mac_register()
8850 ieee80211_hw_set(ar->hw, SUPPORTS_TDLS_BUFFER_STA); in ath10k_mac_register()
8852 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL; in ath10k_mac_register()
8853 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH; in ath10k_mac_register()
8854 ar->hw->wiphy->max_remain_on_channel_duration = 5000; in ath10k_mac_register()
8856 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD; in ath10k_mac_register()
8857 ar->hw->wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE | in ath10k_mac_register()
8860 ar->hw->wiphy->max_ap_assoc_sta = ar->max_num_stations; in ath10k_mac_register()
8862 ret = ath10k_wow_init(ar); in ath10k_mac_register()
8864 ath10k_warn(ar, "failed to init wow: %d\n", ret); in ath10k_mac_register()
8868 wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_VHT_IBSS); in ath10k_mac_register()
8869 wiphy_ext_feature_set(ar->hw->wiphy, in ath10k_mac_register()
8872 if (test_bit(WMI_SERVICE_TX_DATA_ACK_RSSI, ar->wmi.svc_map) || in ath10k_mac_register()
8873 test_bit(WMI_SERVICE_HTT_MGMT_TX_COMP_VALID_FLAGS, ar->wmi.svc_map)) in ath10k_mac_register()
8874 wiphy_ext_feature_set(ar->hw->wiphy, in ath10k_mac_register()
8877 if (ath10k_peer_stats_enabled(ar) || in ath10k_mac_register()
8878 test_bit(WMI_SERVICE_REPORT_AIRTIME, ar->wmi.svc_map)) in ath10k_mac_register()
8879 wiphy_ext_feature_set(ar->hw->wiphy, in ath10k_mac_register()
8882 if (test_bit(WMI_SERVICE_RTT_RESPONDER_ROLE, ar->wmi.svc_map)) in ath10k_mac_register()
8883 wiphy_ext_feature_set(ar->hw->wiphy, in ath10k_mac_register()
8886 if (test_bit(WMI_SERVICE_TX_PWR_PER_PEER, ar->wmi.svc_map)) in ath10k_mac_register()
8887 wiphy_ext_feature_set(ar->hw->wiphy, in ath10k_mac_register()
8893 ar->hw->queues = IEEE80211_MAX_QUEUES; in ath10k_mac_register()
8899 ar->hw->offchannel_tx_hw_queue = IEEE80211_MAX_QUEUES - 1; in ath10k_mac_register()
8901 switch (ar->running_fw->fw_file.wmi_op_version) { in ath10k_mac_register()
8903 ar->hw->wiphy->iface_combinations = ath10k_if_comb; in ath10k_mac_register()
8904 ar->hw->wiphy->n_iface_combinations = in ath10k_mac_register()
8906 ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC); in ath10k_mac_register()
8909 if (test_bit(WMI_SERVICE_ADAPTIVE_OCS, ar->wmi.svc_map)) { in ath10k_mac_register()
8910 ar->hw->wiphy->iface_combinations = in ath10k_mac_register()
8912 ar->hw->wiphy->n_iface_combinations = in ath10k_mac_register()
8915 ar->hw->wiphy->iface_combinations = ath10k_tlv_if_comb; in ath10k_mac_register()
8916 ar->hw->wiphy->n_iface_combinations = in ath10k_mac_register()
8919 ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC); in ath10k_mac_register()
8924 ar->hw->wiphy->iface_combinations = ath10k_10x_if_comb; in ath10k_mac_register()
8925 ar->hw->wiphy->n_iface_combinations = in ath10k_mac_register()
8929 ar->hw->wiphy->iface_combinations = ath10k_10_4_if_comb; in ath10k_mac_register()
8930 ar->hw->wiphy->n_iface_combinations = in ath10k_mac_register()
8933 ar->wmi.svc_map)) { in ath10k_mac_register()
8934 ar->hw->wiphy->iface_combinations = in ath10k_mac_register()
8936 ar->hw->wiphy->n_iface_combinations = in ath10k_mac_register()
8947 if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) in ath10k_mac_register()
8948 ar->hw->netdev_features = NETIF_F_HW_CSUM; in ath10k_mac_register()
8952 ar->ath_common.debug_mask = ATH_DBG_DFS; in ath10k_mac_register()
8953 ar->dfs_detector = dfs_pattern_detector_init(&ar->ath_common, in ath10k_mac_register()
8956 if (!ar->dfs_detector) in ath10k_mac_register()
8957 ath10k_warn(ar, "failed to initialise DFS pattern detector\n"); in ath10k_mac_register()
8960 ret = ath10k_mac_init_rd(ar); in ath10k_mac_register()
8962 ath10k_err(ar, "failed to derive regdom: %d\n", ret); in ath10k_mac_register()
8967 if (!ar->hw_params.hw_ops->set_coverage_class) in ath10k_mac_register()
8968 ar->ops->set_coverage_class = NULL; in ath10k_mac_register()
8970 ret = ath_regd_init(&ar->ath_common.regulatory, ar->hw->wiphy, in ath10k_mac_register()
8973 ath10k_err(ar, "failed to initialise regulatory: %i\n", ret); in ath10k_mac_register()
8977 if (test_bit(WMI_SERVICE_SPOOF_MAC_SUPPORT, ar->wmi.svc_map)) { in ath10k_mac_register()
8978 ar->hw->wiphy->features |= in ath10k_mac_register()
8982 ar->hw->wiphy->cipher_suites = cipher_suites; in ath10k_mac_register()
8988 if (!ar->hw_params.n_cipher_suites || in ath10k_mac_register()
8989 ar->hw_params.n_cipher_suites > ARRAY_SIZE(cipher_suites)) { in ath10k_mac_register()
8990 ath10k_err(ar, "invalid hw_params.n_cipher_suites %d\n", in ath10k_mac_register()
8991 ar->hw_params.n_cipher_suites); in ath10k_mac_register()
8992 ar->hw_params.n_cipher_suites = 8; in ath10k_mac_register()
8994 ar->hw->wiphy->n_cipher_suites = ar->hw_params.n_cipher_suites; in ath10k_mac_register()
8996 wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST); in ath10k_mac_register()
8998 ar->hw->weight_multiplier = ATH10K_AIRTIME_WEIGHT_MULTIPLIER; in ath10k_mac_register()
9000 ret = ieee80211_register_hw(ar->hw); in ath10k_mac_register()
9002 ath10k_err(ar, "failed to register ieee80211: %d\n", ret); in ath10k_mac_register()
9006 if (test_bit(WMI_SERVICE_PER_PACKET_SW_ENCRYPT, ar->wmi.svc_map)) { in ath10k_mac_register()
9007 ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_AP_VLAN); in ath10k_mac_register()
9008 ar->hw->wiphy->software_iftypes |= BIT(NL80211_IFTYPE_AP_VLAN); in ath10k_mac_register()
9011 if (!ath_is_world_regd(&ar->ath_common.regulatory)) { in ath10k_mac_register()
9012 ret = regulatory_hint(ar->hw->wiphy, in ath10k_mac_register()
9013 ar->ath_common.regulatory.alpha2); in ath10k_mac_register()
9021 ieee80211_unregister_hw(ar->hw); in ath10k_mac_register()
9024 if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) in ath10k_mac_register()
9025 ar->dfs_detector->exit(ar->dfs_detector); in ath10k_mac_register()
9028 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); in ath10k_mac_register()
9029 kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels); in ath10k_mac_register()
9031 SET_IEEE80211_DEV(ar->hw, NULL); in ath10k_mac_register()
9035 void ath10k_mac_unregister(struct ath10k *ar) in ath10k_mac_unregister() argument
9037 ieee80211_unregister_hw(ar->hw); in ath10k_mac_unregister()
9039 if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) in ath10k_mac_unregister()
9040 ar->dfs_detector->exit(ar->dfs_detector); in ath10k_mac_unregister()
9042 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); in ath10k_mac_unregister()
9043 kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels); in ath10k_mac_unregister()
9045 SET_IEEE80211_DEV(ar->hw, NULL); in ath10k_mac_unregister()