• Home
  • Raw
  • Download

Lines Matching refs:ar

200 int ath10k_mac_ext_resource_config(struct ath10k *ar, u32 val)  in ath10k_mac_ext_resource_config()  argument
205 if (test_bit(WMI_SERVICE_TX_MODE_DYNAMIC, ar->wmi.svc_map)) in ath10k_mac_ext_resource_config()
210 ret = ath10k_wmi_ext_resource_config(ar, platform_type, val); in ath10k_mac_ext_resource_config()
213 ath10k_warn(ar, "failed to configure ext resource: %d\n", ret); in ath10k_mac_ext_resource_config()
229 struct ath10k *ar = arvif->ar; in ath10k_send_key() local
239 lockdep_assert_held(&arvif->ar->conf_mutex); in ath10k_send_key()
243 arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_AES_CCM]; in ath10k_send_key()
247 arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_TKIP]; in ath10k_send_key()
253 arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_WEP]; in ath10k_send_key()
256 arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_AES_CCM]; in ath10k_send_key()
260 arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_AES_GCM]; in ath10k_send_key()
270 ath10k_warn(ar, "cipher %d is not supported\n", key->cipher); in ath10k_send_key()
274 if (test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) in ath10k_send_key()
278 arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_NONE]; in ath10k_send_key()
282 return ath10k_wmi_vdev_install_key(arvif->ar, &arg); in ath10k_send_key()
290 struct ath10k *ar = arvif->ar; in ath10k_install_key() local
294 lockdep_assert_held(&ar->conf_mutex); in ath10k_install_key()
296 reinit_completion(&ar->install_key_done); in ath10k_install_key()
305 time_left = wait_for_completion_timeout(&ar->install_key_done, 3 * HZ); in ath10k_install_key()
315 struct ath10k *ar = arvif->ar; in ath10k_install_peer_wep_keys() local
321 lockdep_assert_held(&ar->conf_mutex); in ath10k_install_peer_wep_keys()
328 spin_lock_bh(&ar->data_lock); in ath10k_install_peer_wep_keys()
329 peer = ath10k_peer_find(ar, arvif->vdev_id, addr); in ath10k_install_peer_wep_keys()
330 spin_unlock_bh(&ar->data_lock); in ath10k_install_peer_wep_keys()
368 spin_lock_bh(&ar->data_lock); in ath10k_install_peer_wep_keys()
370 spin_unlock_bh(&ar->data_lock); in ath10k_install_peer_wep_keys()
387 ret = ath10k_wmi_vdev_set_param(arvif->ar, in ath10k_install_peer_wep_keys()
389 arvif->ar->wmi.vdev_param->def_keyid, in ath10k_install_peer_wep_keys()
392 ath10k_warn(ar, "failed to re-set def wpa key idxon vdev %i: %d\n", in ath10k_install_peer_wep_keys()
403 struct ath10k *ar = arvif->ar; in ath10k_clear_peer_keys() local
410 lockdep_assert_held(&ar->conf_mutex); in ath10k_clear_peer_keys()
412 spin_lock_bh(&ar->data_lock); in ath10k_clear_peer_keys()
413 peer = ath10k_peer_find(ar, arvif->vdev_id, addr); in ath10k_clear_peer_keys()
414 spin_unlock_bh(&ar->data_lock); in ath10k_clear_peer_keys()
430 ath10k_warn(ar, "failed to remove peer wep key %d: %d\n", in ath10k_clear_peer_keys()
433 spin_lock_bh(&ar->data_lock); in ath10k_clear_peer_keys()
435 spin_unlock_bh(&ar->data_lock); in ath10k_clear_peer_keys()
441 bool ath10k_mac_is_peer_wep_key_set(struct ath10k *ar, const u8 *addr, in ath10k_mac_is_peer_wep_key_set() argument
447 lockdep_assert_held(&ar->data_lock); in ath10k_mac_is_peer_wep_key_set()
454 peer = ath10k_peer_find(ar, 0, addr); in ath10k_mac_is_peer_wep_key_set()
469 struct ath10k *ar = arvif->ar; in ath10k_clear_vdev_key() local
477 lockdep_assert_held(&ar->conf_mutex); in ath10k_clear_vdev_key()
483 spin_lock_bh(&ar->data_lock); in ath10k_clear_vdev_key()
485 list_for_each_entry(peer, &ar->peers, list) { in ath10k_clear_vdev_key()
497 spin_unlock_bh(&ar->data_lock); in ath10k_clear_vdev_key()
507 ath10k_warn(ar, "failed to remove key for %pM: %d\n", in ath10k_clear_vdev_key()
517 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_update_wep_key() local
521 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_vif_update_wep_key()
523 list_for_each_entry(peer, &ar->peers, list) { in ath10k_mac_vif_update_wep_key()
533 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vif vdev %i update key %i needs update\n", in ath10k_mac_vif_update_wep_key()
538 ath10k_warn(ar, "failed to update wep keys on vdev %i for peer %pM: %d\n", in ath10k_mac_vif_update_wep_key()
672 static int ath10k_mac_num_chanctxs(struct ath10k *ar) in ath10k_mac_num_chanctxs() argument
676 ieee80211_iter_chan_contexts_atomic(ar->hw, in ath10k_mac_num_chanctxs()
693 static void ath10k_wait_for_peer_delete_done(struct ath10k *ar, u32 vdev_id, in ath10k_wait_for_peer_delete_done() argument
699 if (test_bit(WMI_SERVICE_SYNC_DELETE_CMDS, ar->wmi.svc_map)) { in ath10k_wait_for_peer_delete_done()
700 ret = ath10k_wait_for_peer_deleted(ar, vdev_id, addr); in ath10k_wait_for_peer_delete_done()
702 ath10k_warn(ar, "failed wait for peer deleted"); in ath10k_wait_for_peer_delete_done()
706 time_left = wait_for_completion_timeout(&ar->peer_delete_done, in ath10k_wait_for_peer_delete_done()
709 ath10k_warn(ar, "Timeout in receiving peer delete response\n"); in ath10k_wait_for_peer_delete_done()
713 static int ath10k_peer_create(struct ath10k *ar, in ath10k_peer_create() argument
725 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_create()
727 num_peers = ar->num_peers; in ath10k_peer_create()
730 list_for_each_entry(arvif, &ar->arvifs, list) in ath10k_peer_create()
733 if (num_peers >= ar->max_num_peers) in ath10k_peer_create()
736 ret = ath10k_wmi_peer_create(ar, vdev_id, addr, peer_type); in ath10k_peer_create()
738 ath10k_warn(ar, "failed to create wmi peer %pM on vdev %i: %i\n", in ath10k_peer_create()
743 ret = ath10k_wait_for_peer_created(ar, vdev_id, addr); in ath10k_peer_create()
745 ath10k_warn(ar, "failed to wait for created wmi peer %pM on vdev %i: %i\n", in ath10k_peer_create()
750 spin_lock_bh(&ar->data_lock); in ath10k_peer_create()
752 peer = ath10k_peer_find(ar, vdev_id, addr); in ath10k_peer_create()
754 spin_unlock_bh(&ar->data_lock); in ath10k_peer_create()
755 ath10k_warn(ar, "failed to find peer %pM on vdev %i after creation\n", in ath10k_peer_create()
757 ath10k_wait_for_peer_delete_done(ar, vdev_id, addr); in ath10k_peer_create()
764 spin_unlock_bh(&ar->data_lock); in ath10k_peer_create()
766 ar->num_peers++; in ath10k_peer_create()
773 struct ath10k *ar = arvif->ar; in ath10k_mac_set_kickout() local
777 param = ar->wmi.pdev_param->sta_kickout_th; in ath10k_mac_set_kickout()
778 ret = ath10k_wmi_pdev_set_param(ar, param, in ath10k_mac_set_kickout()
781 ath10k_warn(ar, "failed to set kickout threshold on vdev %i: %d\n", in ath10k_mac_set_kickout()
786 param = ar->wmi.vdev_param->ap_keepalive_min_idle_inactive_time_secs; in ath10k_mac_set_kickout()
787 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param, in ath10k_mac_set_kickout()
790 ath10k_warn(ar, "failed to set keepalive minimum idle time on vdev %i: %d\n", in ath10k_mac_set_kickout()
795 param = ar->wmi.vdev_param->ap_keepalive_max_idle_inactive_time_secs; in ath10k_mac_set_kickout()
796 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param, in ath10k_mac_set_kickout()
799 ath10k_warn(ar, "failed to set keepalive maximum idle time on vdev %i: %d\n", in ath10k_mac_set_kickout()
804 param = ar->wmi.vdev_param->ap_keepalive_max_unresponsive_time_secs; in ath10k_mac_set_kickout()
805 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param, in ath10k_mac_set_kickout()
808 ath10k_warn(ar, "failed to set keepalive maximum unresponsive time on vdev %i: %d\n", in ath10k_mac_set_kickout()
818 struct ath10k *ar = arvif->ar; in ath10k_mac_set_rts() local
821 vdev_param = ar->wmi.vdev_param->rts_threshold; in ath10k_mac_set_rts()
822 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, value); in ath10k_mac_set_rts()
825 static int ath10k_peer_delete(struct ath10k *ar, u32 vdev_id, const u8 *addr) in ath10k_peer_delete() argument
829 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_delete()
831 ret = ath10k_wmi_peer_delete(ar, vdev_id, addr); in ath10k_peer_delete()
835 ret = ath10k_wait_for_peer_deleted(ar, vdev_id, addr); in ath10k_peer_delete()
839 if (test_bit(WMI_SERVICE_SYNC_DELETE_CMDS, ar->wmi.svc_map)) { in ath10k_peer_delete()
843 (&ar->peer_delete_done, 5 * HZ); in ath10k_peer_delete()
846 ath10k_warn(ar, "Timeout in receiving peer delete response\n"); in ath10k_peer_delete()
851 ar->num_peers--; in ath10k_peer_delete()
856 static void ath10k_peer_map_cleanup(struct ath10k *ar, struct ath10k_peer *peer) in ath10k_peer_map_cleanup() argument
860 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_map_cleanup()
864 ar->peer_map[peer_id] = NULL; in ath10k_peer_map_cleanup()
870 for (i = 0; i < ARRAY_SIZE(ar->peer_map); i++) { in ath10k_peer_map_cleanup()
871 if (ar->peer_map[i] == peer) { in ath10k_peer_map_cleanup()
872 ath10k_warn(ar, "removing stale peer_map entry for %pM (ptr %pK idx %d)\n", in ath10k_peer_map_cleanup()
874 ar->peer_map[i] = NULL; in ath10k_peer_map_cleanup()
880 ar->num_peers--; in ath10k_peer_map_cleanup()
883 static void ath10k_peer_cleanup(struct ath10k *ar, u32 vdev_id) in ath10k_peer_cleanup() argument
887 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_cleanup()
889 spin_lock_bh(&ar->data_lock); in ath10k_peer_cleanup()
890 list_for_each_entry_safe(peer, tmp, &ar->peers, list) { in ath10k_peer_cleanup()
894 ath10k_warn(ar, "removing stale peer %pM from vdev_id %d\n", in ath10k_peer_cleanup()
897 ath10k_peer_map_cleanup(ar, peer); in ath10k_peer_cleanup()
899 spin_unlock_bh(&ar->data_lock); in ath10k_peer_cleanup()
902 static void ath10k_peer_cleanup_all(struct ath10k *ar) in ath10k_peer_cleanup_all() argument
907 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_cleanup_all()
909 spin_lock_bh(&ar->data_lock); in ath10k_peer_cleanup_all()
910 list_for_each_entry_safe(peer, tmp, &ar->peers, list) { in ath10k_peer_cleanup_all()
915 for (i = 0; i < ARRAY_SIZE(ar->peer_map); i++) in ath10k_peer_cleanup_all()
916 ar->peer_map[i] = NULL; in ath10k_peer_cleanup_all()
918 spin_unlock_bh(&ar->data_lock); in ath10k_peer_cleanup_all()
920 ar->num_peers = 0; in ath10k_peer_cleanup_all()
921 ar->num_stations = 0; in ath10k_peer_cleanup_all()
924 static int ath10k_mac_tdls_peer_update(struct ath10k *ar, u32 vdev_id, in ath10k_mac_tdls_peer_update() argument
933 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_tdls_peer_update()
946 ret = ath10k_wmi_tdls_peer_update(ar, &arg, &cap, &chan_arg); in ath10k_mac_tdls_peer_update()
948 ath10k_warn(ar, "failed to update tdls peer %pM on vdev %i: %i\n", in ath10k_mac_tdls_peer_update()
962 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_beacon_free() local
964 lockdep_assert_held(&ar->data_lock); in ath10k_mac_vif_beacon_free()
970 dma_unmap_single(ar->dev, ATH10K_SKB_CB(arvif->beacon)->paddr, in ath10k_mac_vif_beacon_free()
985 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_beacon_cleanup() local
987 lockdep_assert_held(&ar->data_lock); in ath10k_mac_vif_beacon_cleanup()
992 if (ar->bus_param.dev_type == ATH10K_DEV_TYPE_HL) in ath10k_mac_vif_beacon_cleanup()
995 dma_free_coherent(ar->dev, IEEE80211_MAX_FRAME_LEN, in ath10k_mac_vif_beacon_cleanup()
1002 static inline int ath10k_vdev_setup_sync(struct ath10k *ar) in ath10k_vdev_setup_sync() argument
1006 lockdep_assert_held(&ar->conf_mutex); in ath10k_vdev_setup_sync()
1008 if (test_bit(ATH10K_FLAG_CRASH_FLUSH, &ar->dev_flags)) in ath10k_vdev_setup_sync()
1011 time_left = wait_for_completion_timeout(&ar->vdev_setup_done, in ath10k_vdev_setup_sync()
1016 return ar->last_wmi_vdev_start_status; in ath10k_vdev_setup_sync()
1019 static int ath10k_monitor_vdev_start(struct ath10k *ar, int vdev_id) in ath10k_monitor_vdev_start() argument
1026 lockdep_assert_held(&ar->conf_mutex); in ath10k_monitor_vdev_start()
1028 ieee80211_iter_chan_contexts_atomic(ar->hw, in ath10k_monitor_vdev_start()
1053 reinit_completion(&ar->vdev_setup_done); in ath10k_monitor_vdev_start()
1054 reinit_completion(&ar->vdev_delete_done); in ath10k_monitor_vdev_start()
1056 ret = ath10k_wmi_vdev_start(ar, &arg); in ath10k_monitor_vdev_start()
1058 ath10k_warn(ar, "failed to request monitor vdev %i start: %d\n", in ath10k_monitor_vdev_start()
1063 ret = ath10k_vdev_setup_sync(ar); in ath10k_monitor_vdev_start()
1065 ath10k_warn(ar, "failed to synchronize setup for monitor vdev %i start: %d\n", in ath10k_monitor_vdev_start()
1070 ret = ath10k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr); in ath10k_monitor_vdev_start()
1072 ath10k_warn(ar, "failed to put up monitor vdev %i: %d\n", in ath10k_monitor_vdev_start()
1077 ar->monitor_vdev_id = vdev_id; in ath10k_monitor_vdev_start()
1079 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %i started\n", in ath10k_monitor_vdev_start()
1080 ar->monitor_vdev_id); in ath10k_monitor_vdev_start()
1084 ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id); in ath10k_monitor_vdev_start()
1086 ath10k_warn(ar, "failed to stop monitor vdev %i after start failure: %d\n", in ath10k_monitor_vdev_start()
1087 ar->monitor_vdev_id, ret); in ath10k_monitor_vdev_start()
1092 static int ath10k_monitor_vdev_stop(struct ath10k *ar) in ath10k_monitor_vdev_stop() argument
1096 lockdep_assert_held(&ar->conf_mutex); in ath10k_monitor_vdev_stop()
1098 ret = ath10k_wmi_vdev_down(ar, ar->monitor_vdev_id); in ath10k_monitor_vdev_stop()
1100 ath10k_warn(ar, "failed to put down monitor vdev %i: %d\n", in ath10k_monitor_vdev_stop()
1101 ar->monitor_vdev_id, ret); in ath10k_monitor_vdev_stop()
1103 reinit_completion(&ar->vdev_setup_done); in ath10k_monitor_vdev_stop()
1104 reinit_completion(&ar->vdev_delete_done); in ath10k_monitor_vdev_stop()
1106 ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id); in ath10k_monitor_vdev_stop()
1108 ath10k_warn(ar, "failed to request monitor vdev %i stop: %d\n", in ath10k_monitor_vdev_stop()
1109 ar->monitor_vdev_id, ret); in ath10k_monitor_vdev_stop()
1111 ret = ath10k_vdev_setup_sync(ar); in ath10k_monitor_vdev_stop()
1113 ath10k_warn(ar, "failed to synchronize monitor vdev %i stop: %d\n", in ath10k_monitor_vdev_stop()
1114 ar->monitor_vdev_id, ret); in ath10k_monitor_vdev_stop()
1116 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %i stopped\n", in ath10k_monitor_vdev_stop()
1117 ar->monitor_vdev_id); in ath10k_monitor_vdev_stop()
1121 static int ath10k_monitor_vdev_create(struct ath10k *ar) in ath10k_monitor_vdev_create() argument
1125 lockdep_assert_held(&ar->conf_mutex); in ath10k_monitor_vdev_create()
1127 if (ar->free_vdev_map == 0) { in ath10k_monitor_vdev_create()
1128 ath10k_warn(ar, "failed to find free vdev id for monitor vdev\n"); in ath10k_monitor_vdev_create()
1132 bit = __ffs64(ar->free_vdev_map); in ath10k_monitor_vdev_create()
1134 ar->monitor_vdev_id = bit; in ath10k_monitor_vdev_create()
1136 ret = ath10k_wmi_vdev_create(ar, ar->monitor_vdev_id, in ath10k_monitor_vdev_create()
1138 0, ar->mac_addr); in ath10k_monitor_vdev_create()
1140 ath10k_warn(ar, "failed to request monitor vdev %i creation: %d\n", in ath10k_monitor_vdev_create()
1141 ar->monitor_vdev_id, ret); in ath10k_monitor_vdev_create()
1145 ar->free_vdev_map &= ~(1LL << ar->monitor_vdev_id); in ath10k_monitor_vdev_create()
1146 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %d created\n", in ath10k_monitor_vdev_create()
1147 ar->monitor_vdev_id); in ath10k_monitor_vdev_create()
1152 static int ath10k_monitor_vdev_delete(struct ath10k *ar) in ath10k_monitor_vdev_delete() argument
1156 lockdep_assert_held(&ar->conf_mutex); in ath10k_monitor_vdev_delete()
1158 ret = ath10k_wmi_vdev_delete(ar, ar->monitor_vdev_id); in ath10k_monitor_vdev_delete()
1160 ath10k_warn(ar, "failed to request wmi monitor vdev %i removal: %d\n", in ath10k_monitor_vdev_delete()
1161 ar->monitor_vdev_id, ret); in ath10k_monitor_vdev_delete()
1165 ar->free_vdev_map |= 1LL << ar->monitor_vdev_id; in ath10k_monitor_vdev_delete()
1167 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %d deleted\n", in ath10k_monitor_vdev_delete()
1168 ar->monitor_vdev_id); in ath10k_monitor_vdev_delete()
1172 static int ath10k_monitor_start(struct ath10k *ar) in ath10k_monitor_start() argument
1176 lockdep_assert_held(&ar->conf_mutex); in ath10k_monitor_start()
1178 ret = ath10k_monitor_vdev_create(ar); in ath10k_monitor_start()
1180 ath10k_warn(ar, "failed to create monitor vdev: %d\n", ret); in ath10k_monitor_start()
1184 ret = ath10k_monitor_vdev_start(ar, ar->monitor_vdev_id); in ath10k_monitor_start()
1186 ath10k_warn(ar, "failed to start monitor vdev: %d\n", ret); in ath10k_monitor_start()
1187 ath10k_monitor_vdev_delete(ar); in ath10k_monitor_start()
1191 ar->monitor_started = true; in ath10k_monitor_start()
1192 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor started\n"); in ath10k_monitor_start()
1197 static int ath10k_monitor_stop(struct ath10k *ar) in ath10k_monitor_stop() argument
1201 lockdep_assert_held(&ar->conf_mutex); in ath10k_monitor_stop()
1203 ret = ath10k_monitor_vdev_stop(ar); in ath10k_monitor_stop()
1205 ath10k_warn(ar, "failed to stop monitor vdev: %d\n", ret); in ath10k_monitor_stop()
1209 ret = ath10k_monitor_vdev_delete(ar); in ath10k_monitor_stop()
1211 ath10k_warn(ar, "failed to delete monitor vdev: %d\n", ret); in ath10k_monitor_stop()
1215 ar->monitor_started = false; in ath10k_monitor_stop()
1216 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor stopped\n"); in ath10k_monitor_stop()
1221 static bool ath10k_mac_monitor_vdev_is_needed(struct ath10k *ar) in ath10k_mac_monitor_vdev_is_needed() argument
1228 num_ctx = ath10k_mac_num_chanctxs(ar); in ath10k_mac_monitor_vdev_is_needed()
1235 if (ar->monitor_arvif) in ath10k_mac_monitor_vdev_is_needed()
1238 return ar->monitor || in ath10k_mac_monitor_vdev_is_needed()
1240 ar->running_fw->fw_file.fw_features) && in ath10k_mac_monitor_vdev_is_needed()
1241 (ar->filter_flags & FIF_OTHER_BSS)) || in ath10k_mac_monitor_vdev_is_needed()
1242 test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags); in ath10k_mac_monitor_vdev_is_needed()
1245 static bool ath10k_mac_monitor_vdev_is_allowed(struct ath10k *ar) in ath10k_mac_monitor_vdev_is_allowed() argument
1249 num_ctx = ath10k_mac_num_chanctxs(ar); in ath10k_mac_monitor_vdev_is_allowed()
1255 if (test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags) && num_ctx > 1) in ath10k_mac_monitor_vdev_is_allowed()
1261 static int ath10k_monitor_recalc(struct ath10k *ar) in ath10k_monitor_recalc() argument
1267 lockdep_assert_held(&ar->conf_mutex); in ath10k_monitor_recalc()
1269 needed = ath10k_mac_monitor_vdev_is_needed(ar); in ath10k_monitor_recalc()
1270 allowed = ath10k_mac_monitor_vdev_is_allowed(ar); in ath10k_monitor_recalc()
1272 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_monitor_recalc()
1274 ar->monitor_started, needed, allowed); in ath10k_monitor_recalc()
1277 if (ar->monitor_started) { in ath10k_monitor_recalc()
1278 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor stopping disallowed monitor\n"); in ath10k_monitor_recalc()
1280 ret = ath10k_monitor_stop(ar); in ath10k_monitor_recalc()
1282 ath10k_warn(ar, "failed to stop disallowed monitor: %d\n", in ath10k_monitor_recalc()
1290 if (needed == ar->monitor_started) in ath10k_monitor_recalc()
1294 return ath10k_monitor_start(ar); in ath10k_monitor_recalc()
1296 return ath10k_monitor_stop(ar); in ath10k_monitor_recalc()
1301 struct ath10k *ar = arvif->ar; in ath10k_mac_can_set_cts_prot() local
1303 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_can_set_cts_prot()
1306 ath10k_dbg(ar, ATH10K_DBG_MAC, "defer cts setup, vdev is not ready yet\n"); in ath10k_mac_can_set_cts_prot()
1315 struct ath10k *ar = arvif->ar; in ath10k_mac_set_cts_prot() local
1318 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_set_cts_prot()
1320 vdev_param = ar->wmi.vdev_param->protection_mode; in ath10k_mac_set_cts_prot()
1322 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d cts_protection %d\n", in ath10k_mac_set_cts_prot()
1325 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_mac_set_cts_prot()
1331 struct ath10k *ar = arvif->ar; in ath10k_recalc_rtscts_prot() local
1334 lockdep_assert_held(&ar->conf_mutex); in ath10k_recalc_rtscts_prot()
1336 vdev_param = ar->wmi.vdev_param->enable_rtscts; in ath10k_recalc_rtscts_prot()
1347 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d recalc rts/cts prot %d\n", in ath10k_recalc_rtscts_prot()
1350 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_recalc_rtscts_prot()
1354 static int ath10k_start_cac(struct ath10k *ar) in ath10k_start_cac() argument
1358 lockdep_assert_held(&ar->conf_mutex); in ath10k_start_cac()
1360 set_bit(ATH10K_CAC_RUNNING, &ar->dev_flags); in ath10k_start_cac()
1362 ret = ath10k_monitor_recalc(ar); in ath10k_start_cac()
1364 ath10k_warn(ar, "failed to start monitor (cac): %d\n", ret); in ath10k_start_cac()
1365 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags); in ath10k_start_cac()
1369 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac cac start monitor vdev %d\n", in ath10k_start_cac()
1370 ar->monitor_vdev_id); in ath10k_start_cac()
1375 static int ath10k_stop_cac(struct ath10k *ar) in ath10k_stop_cac() argument
1377 lockdep_assert_held(&ar->conf_mutex); in ath10k_stop_cac()
1380 if (!test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags)) in ath10k_stop_cac()
1383 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags); in ath10k_stop_cac()
1384 ath10k_monitor_stop(ar); in ath10k_stop_cac()
1386 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac cac finished\n"); in ath10k_stop_cac()
1401 static bool ath10k_mac_has_radar_enabled(struct ath10k *ar) in ath10k_mac_has_radar_enabled() argument
1405 ieee80211_iter_chan_contexts_atomic(ar->hw, in ath10k_mac_has_radar_enabled()
1412 static void ath10k_recalc_radar_detection(struct ath10k *ar) in ath10k_recalc_radar_detection() argument
1416 lockdep_assert_held(&ar->conf_mutex); in ath10k_recalc_radar_detection()
1418 ath10k_stop_cac(ar); in ath10k_recalc_radar_detection()
1420 if (!ath10k_mac_has_radar_enabled(ar)) in ath10k_recalc_radar_detection()
1423 if (ar->num_started_vdevs > 0) in ath10k_recalc_radar_detection()
1426 ret = ath10k_start_cac(ar); in ath10k_recalc_radar_detection()
1433 ath10k_warn(ar, "failed to start CAC: %d\n", ret); in ath10k_recalc_radar_detection()
1434 ieee80211_radar_detected(ar->hw); in ath10k_recalc_radar_detection()
1440 struct ath10k *ar = arvif->ar; in ath10k_vdev_stop() local
1443 lockdep_assert_held(&ar->conf_mutex); in ath10k_vdev_stop()
1445 reinit_completion(&ar->vdev_setup_done); in ath10k_vdev_stop()
1446 reinit_completion(&ar->vdev_delete_done); in ath10k_vdev_stop()
1448 ret = ath10k_wmi_vdev_stop(ar, arvif->vdev_id); in ath10k_vdev_stop()
1450 ath10k_warn(ar, "failed to stop WMI vdev %i: %d\n", in ath10k_vdev_stop()
1455 ret = ath10k_vdev_setup_sync(ar); in ath10k_vdev_stop()
1457 ath10k_warn(ar, "failed to synchronize setup for vdev %i: %d\n", in ath10k_vdev_stop()
1462 WARN_ON(ar->num_started_vdevs == 0); in ath10k_vdev_stop()
1464 if (ar->num_started_vdevs != 0) { in ath10k_vdev_stop()
1465 ar->num_started_vdevs--; in ath10k_vdev_stop()
1466 ath10k_recalc_radar_detection(ar); in ath10k_vdev_stop()
1476 struct ath10k *ar = arvif->ar; in ath10k_vdev_start_restart() local
1480 lockdep_assert_held(&ar->conf_mutex); in ath10k_vdev_start_restart()
1482 reinit_completion(&ar->vdev_setup_done); in ath10k_vdev_start_restart()
1483 reinit_completion(&ar->vdev_delete_done); in ath10k_vdev_start_restart()
1512 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_vdev_start_restart()
1518 ret = ath10k_wmi_vdev_restart(ar, &arg); in ath10k_vdev_start_restart()
1520 ret = ath10k_wmi_vdev_start(ar, &arg); in ath10k_vdev_start_restart()
1523 ath10k_warn(ar, "failed to start WMI vdev %i: %d\n", in ath10k_vdev_start_restart()
1528 ret = ath10k_vdev_setup_sync(ar); in ath10k_vdev_start_restart()
1530 ath10k_warn(ar, in ath10k_vdev_start_restart()
1536 ar->num_started_vdevs++; in ath10k_vdev_start_restart()
1537 ath10k_recalc_radar_detection(ar); in ath10k_vdev_start_restart()
1557 struct ath10k *ar = arvif->ar; in ath10k_mac_setup_bcn_p2p_ie() local
1573 ret = ath10k_wmi_p2p_go_bcn_ie(ar, arvif->vdev_id, p2p_ie); in ath10k_mac_setup_bcn_p2p_ie()
1575 ath10k_warn(ar, "failed to submit p2p go bcn ie for vdev %i: %d\n", in ath10k_mac_setup_bcn_p2p_ie()
1615 struct ath10k *ar = arvif->ar; in ath10k_mac_setup_bcn_tmpl() local
1616 struct ieee80211_hw *hw = ar->hw; in ath10k_mac_setup_bcn_tmpl()
1622 if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map)) in ath10k_mac_setup_bcn_tmpl()
1631 ath10k_warn(ar, "failed to get beacon template from mac80211\n"); in ath10k_mac_setup_bcn_tmpl()
1637 ath10k_warn(ar, "failed to setup p2p go bcn ie: %d\n", ret); in ath10k_mac_setup_bcn_tmpl()
1650 ret = ath10k_wmi_bcn_tmpl(ar, arvif->vdev_id, offs.tim_offset, bcn, 0, in ath10k_mac_setup_bcn_tmpl()
1655 ath10k_warn(ar, "failed to submit beacon template command: %d\n", in ath10k_mac_setup_bcn_tmpl()
1665 struct ath10k *ar = arvif->ar; in ath10k_mac_setup_prb_tmpl() local
1666 struct ieee80211_hw *hw = ar->hw; in ath10k_mac_setup_prb_tmpl()
1671 if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map)) in ath10k_mac_setup_prb_tmpl()
1683 ath10k_warn(ar, "failed to get probe resp template from mac80211\n"); in ath10k_mac_setup_prb_tmpl()
1687 ret = ath10k_wmi_prb_tmpl(ar, arvif->vdev_id, prb); in ath10k_mac_setup_prb_tmpl()
1691 ath10k_warn(ar, "failed to submit probe resp template command: %d\n", in ath10k_mac_setup_prb_tmpl()
1701 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_fix_hidden_ssid() local
1720 if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map)) in ath10k_mac_vif_fix_hidden_ssid()
1732 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id); in ath10k_mac_vif_fix_hidden_ssid()
1734 ath10k_warn(ar, "failed to bring down ap vdev %i: %d\n", in ath10k_mac_vif_fix_hidden_ssid()
1745 ath10k_warn(ar, "failed to update beacon template: %d\n", ret); in ath10k_mac_vif_fix_hidden_ssid()
1751 ath10k_warn(ar, "failed to update presp template: %d\n", ret); in ath10k_mac_vif_fix_hidden_ssid()
1757 ath10k_warn(ar, "failed to restart ap vdev %i: %d\n", in ath10k_mac_vif_fix_hidden_ssid()
1762 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid, in ath10k_mac_vif_fix_hidden_ssid()
1765 ath10k_warn(ar, "failed to bring up ap vdev %i: %d\n", in ath10k_mac_vif_fix_hidden_ssid()
1776 struct ath10k *ar = arvif->ar; in ath10k_control_beaconing() local
1779 lockdep_assert_held(&arvif->ar->conf_mutex); in ath10k_control_beaconing()
1782 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id); in ath10k_control_beaconing()
1784 ath10k_warn(ar, "failed to down vdev_id %i: %d\n", in ath10k_control_beaconing()
1789 spin_lock_bh(&arvif->ar->data_lock); in ath10k_control_beaconing()
1791 spin_unlock_bh(&arvif->ar->data_lock); in ath10k_control_beaconing()
1801 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid, in ath10k_control_beaconing()
1804 ath10k_warn(ar, "failed to bring up vdev %d: %i\n", in ath10k_control_beaconing()
1813 ath10k_warn(ar, "failed to fix hidden ssid for vdev %i, expect trouble: %d\n", in ath10k_control_beaconing()
1818 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d up\n", arvif->vdev_id); in ath10k_control_beaconing()
1825 struct ath10k *ar = arvif->ar; in ath10k_control_ibss() local
1829 lockdep_assert_held(&arvif->ar->conf_mutex); in ath10k_control_ibss()
1840 vdev_param = arvif->ar->wmi.vdev_param->atim_window; in ath10k_control_ibss()
1841 ret = ath10k_wmi_vdev_set_param(arvif->ar, arvif->vdev_id, vdev_param, in ath10k_control_ibss()
1844 ath10k_warn(ar, "failed to set IBSS ATIM for vdev %d: %d\n", in ath10k_control_ibss()
1850 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_recalc_ps_wake_threshold() local
1855 lockdep_assert_held(&arvif->ar->conf_mutex); in ath10k_mac_vif_recalc_ps_wake_threshold()
1863 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param, value); in ath10k_mac_vif_recalc_ps_wake_threshold()
1865 ath10k_warn(ar, "failed to submit ps wake threshold %u on vdev %i: %d\n", in ath10k_mac_vif_recalc_ps_wake_threshold()
1875 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_recalc_ps_poll_count() local
1880 lockdep_assert_held(&arvif->ar->conf_mutex); in ath10k_mac_vif_recalc_ps_poll_count()
1888 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath10k_mac_vif_recalc_ps_poll_count()
1891 ath10k_warn(ar, "failed to submit ps poll count %u on vdev %i: %d\n", in ath10k_mac_vif_recalc_ps_poll_count()
1899 static int ath10k_mac_num_vifs_started(struct ath10k *ar) in ath10k_mac_num_vifs_started() argument
1904 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_num_vifs_started()
1906 list_for_each_entry(arvif, &ar->arvifs, list) in ath10k_mac_num_vifs_started()
1915 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_setup_ps() local
1917 struct ieee80211_conf *conf = &ar->hw->conf; in ath10k_mac_vif_setup_ps()
1924 lockdep_assert_held(&arvif->ar->conf_mutex); in ath10k_mac_vif_setup_ps()
1931 if (enable_ps && ath10k_mac_num_vifs_started(ar) > 1 && in ath10k_mac_vif_setup_ps()
1933 ar->running_fw->fw_file.fw_features)) { in ath10k_mac_vif_setup_ps()
1934 ath10k_warn(ar, "refusing to enable ps on vdev %i: not supported by fw\n", in ath10k_mac_vif_setup_ps()
1957 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param, in ath10k_mac_vif_setup_ps()
1960 ath10k_warn(ar, "failed to set inactivity time for vdev %d: %i\n", in ath10k_mac_vif_setup_ps()
1968 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d psmode %s\n", in ath10k_mac_vif_setup_ps()
1971 ret = ath10k_wmi_set_psmode(ar, arvif->vdev_id, psmode); in ath10k_mac_vif_setup_ps()
1973 ath10k_warn(ar, "failed to set PS Mode %d for vdev %d: %d\n", in ath10k_mac_vif_setup_ps()
1983 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_disable_keepalive() local
1987 lockdep_assert_held(&arvif->ar->conf_mutex); in ath10k_mac_vif_disable_keepalive()
1992 if (!test_bit(WMI_SERVICE_STA_KEEP_ALIVE, ar->wmi.svc_map)) in ath10k_mac_vif_disable_keepalive()
2003 ret = ath10k_wmi_sta_keepalive(ar, &arg); in ath10k_mac_vif_disable_keepalive()
2005 ath10k_warn(ar, "failed to submit keepalive on vdev %i: %d\n", in ath10k_mac_vif_disable_keepalive()
2015 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_ap_csa_count_down() local
2019 lockdep_assert_held(&arvif->ar->conf_mutex); in ath10k_mac_vif_ap_csa_count_down()
2021 if (WARN_ON(!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map))) in ath10k_mac_vif_ap_csa_count_down()
2038 ath10k_warn(ar, "failed to update bcn tmpl during csa: %d\n", in ath10k_mac_vif_ap_csa_count_down()
2043 ath10k_warn(ar, "failed to update prb tmpl during csa: %d\n", in ath10k_mac_vif_ap_csa_count_down()
2054 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_ap_csa_work() local
2056 mutex_lock(&ar->conf_mutex); in ath10k_mac_vif_ap_csa_work()
2058 mutex_unlock(&ar->conf_mutex); in ath10k_mac_vif_ap_csa_work()
2077 void ath10k_mac_handle_beacon(struct ath10k *ar, struct sk_buff *skb) in ath10k_mac_handle_beacon() argument
2079 ieee80211_iterate_active_interfaces_atomic(ar->hw, in ath10k_mac_handle_beacon()
2090 struct ath10k *ar = arvif->ar; in ath10k_mac_handle_beacon_miss_iter() local
2091 struct ieee80211_hw *hw = ar->hw; in ath10k_mac_handle_beacon_miss_iter()
2110 void ath10k_mac_handle_beacon_miss(struct ath10k *ar, u32 vdev_id) in ath10k_mac_handle_beacon_miss() argument
2112 ieee80211_iterate_active_interfaces_atomic(ar->hw, in ath10k_mac_handle_beacon_miss()
2134 static u32 ath10k_peer_assoc_h_listen_intval(struct ath10k *ar, in ath10k_peer_assoc_h_listen_intval() argument
2148 return ar->hw->conf.listen_interval; in ath10k_peer_assoc_h_listen_intval()
2151 static void ath10k_peer_assoc_h_basic(struct ath10k *ar, in ath10k_peer_assoc_h_basic() argument
2159 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_assoc_h_basic()
2169 arg->peer_flags |= arvif->ar->wmi.peer_flags->auth; in ath10k_peer_assoc_h_basic()
2170 arg->peer_listen_intval = ath10k_peer_assoc_h_listen_intval(ar, vif); in ath10k_peer_assoc_h_basic()
2175 static void ath10k_peer_assoc_h_crypto(struct ath10k *ar, in ath10k_peer_assoc_h_crypto() argument
2186 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_assoc_h_crypto()
2191 bss = cfg80211_get_bss(ar->hw->wiphy, def.chan, info->bssid, NULL, 0, in ath10k_peer_assoc_h_crypto()
2206 cfg80211_put_bss(ar->hw->wiphy, bss); in ath10k_peer_assoc_h_crypto()
2211 ath10k_dbg(ar, ATH10K_DBG_WMI, "%s: rsn ie found\n", __func__); in ath10k_peer_assoc_h_crypto()
2212 arg->peer_flags |= ar->wmi.peer_flags->need_ptk_4_way; in ath10k_peer_assoc_h_crypto()
2216 ath10k_dbg(ar, ATH10K_DBG_WMI, "%s: wpa ie found\n", __func__); in ath10k_peer_assoc_h_crypto()
2217 arg->peer_flags |= ar->wmi.peer_flags->need_gtk_2_way; in ath10k_peer_assoc_h_crypto()
2222 ar->running_fw->fw_file.fw_features)) { in ath10k_peer_assoc_h_crypto()
2223 arg->peer_flags |= ar->wmi.peer_flags->pmf; in ath10k_peer_assoc_h_crypto()
2227 static void ath10k_peer_assoc_h_rates(struct ath10k *ar, in ath10k_peer_assoc_h_rates() argument
2242 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_assoc_h_rates()
2248 sband = ar->hw->wiphy->bands[band]; in ath10k_peer_assoc_h_rates()
2289 static void ath10k_peer_assoc_h_ht(struct ath10k *ar, in ath10k_peer_assoc_h_ht() argument
2304 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_assoc_h_ht()
2320 arg->peer_flags |= ar->wmi.peer_flags->ht; in ath10k_peer_assoc_h_ht()
2331 arg->peer_flags |= ar->wmi.peer_flags->ldbc; in ath10k_peer_assoc_h_ht()
2334 arg->peer_flags |= ar->wmi.peer_flags->bw40; in ath10k_peer_assoc_h_ht()
2348 arg->peer_flags |= ar->wmi.peer_flags->stbc; in ath10k_peer_assoc_h_ht()
2356 arg->peer_flags |= ar->wmi.peer_flags->stbc; in ath10k_peer_assoc_h_ht()
2389 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n", in ath10k_peer_assoc_h_ht()
2395 static int ath10k_peer_assoc_qos_ap(struct ath10k *ar, in ath10k_peer_assoc_qos_ap() argument
2403 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_assoc_qos_ap()
2406 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac uapsd_queues 0x%x max_sp %d\n", in ath10k_peer_assoc_qos_ap()
2425 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id, in ath10k_peer_assoc_qos_ap()
2430 ath10k_warn(ar, "failed to set ap ps peer param uapsd for vdev %i: %d\n", in ath10k_peer_assoc_qos_ap()
2435 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id, in ath10k_peer_assoc_qos_ap()
2440 ath10k_warn(ar, "failed to set ap ps peer param max sp for vdev %i: %d\n", in ath10k_peer_assoc_qos_ap()
2450 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id, sta->addr, in ath10k_peer_assoc_qos_ap()
2454 ath10k_warn(ar, "failed to set ap ps peer param ageout time for vdev %i: %d\n", in ath10k_peer_assoc_qos_ap()
2538 static void ath10k_peer_assoc_h_vht(struct ath10k *ar, in ath10k_peer_assoc_h_vht() argument
2545 struct ath10k_hw_params *hw = &ar->hw_params; in ath10k_peer_assoc_h_vht()
2565 arg->peer_flags |= ar->wmi.peer_flags->vht; in ath10k_peer_assoc_h_vht()
2568 arg->peer_flags |= ar->wmi.peer_flags->vht_2g; in ath10k_peer_assoc_h_vht()
2586 arg->peer_flags |= ar->wmi.peer_flags->bw80; in ath10k_peer_assoc_h_vht()
2589 arg->peer_flags |= ar->wmi.peer_flags->bw160; in ath10k_peer_assoc_h_vht()
2640 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_peer_assoc_h_vht()
2646 static void ath10k_peer_assoc_h_qos(struct ath10k *ar, in ath10k_peer_assoc_h_qos() argument
2656 arg->peer_flags |= arvif->ar->wmi.peer_flags->qos; in ath10k_peer_assoc_h_qos()
2659 arg->peer_flags |= arvif->ar->wmi.peer_flags->apsd; in ath10k_peer_assoc_h_qos()
2665 arg->peer_flags |= arvif->ar->wmi.peer_flags->qos; in ath10k_peer_assoc_h_qos()
2669 arg->peer_flags |= arvif->ar->wmi.peer_flags->qos; in ath10k_peer_assoc_h_qos()
2675 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac peer %pM qos %d\n", in ath10k_peer_assoc_h_qos()
2677 arvif->ar->wmi.peer_flags->qos)); in ath10k_peer_assoc_h_qos()
2686 static enum wmi_phy_mode ath10k_mac_get_phymode_vht(struct ath10k *ar, in ath10k_mac_get_phymode_vht() argument
2713 static void ath10k_peer_assoc_h_phymode(struct ath10k *ar, in ath10k_peer_assoc_h_phymode() argument
2759 phymode = ath10k_mac_get_phymode_vht(ar, sta); in ath10k_peer_assoc_h_phymode()
2775 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac peer %pM phymode %s\n", in ath10k_peer_assoc_h_phymode()
2782 static int ath10k_peer_assoc_prepare(struct ath10k *ar, in ath10k_peer_assoc_prepare() argument
2787 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_assoc_prepare()
2791 ath10k_peer_assoc_h_basic(ar, vif, sta, arg); in ath10k_peer_assoc_prepare()
2792 ath10k_peer_assoc_h_crypto(ar, vif, sta, arg); in ath10k_peer_assoc_prepare()
2793 ath10k_peer_assoc_h_rates(ar, vif, sta, arg); in ath10k_peer_assoc_prepare()
2794 ath10k_peer_assoc_h_ht(ar, vif, sta, arg); in ath10k_peer_assoc_prepare()
2795 ath10k_peer_assoc_h_phymode(ar, vif, sta, arg); in ath10k_peer_assoc_prepare()
2796 ath10k_peer_assoc_h_vht(ar, vif, sta, arg); in ath10k_peer_assoc_prepare()
2797 ath10k_peer_assoc_h_qos(ar, vif, sta, arg); in ath10k_peer_assoc_prepare()
2809 static int ath10k_setup_peer_smps(struct ath10k *ar, struct ath10k_vif *arvif, in ath10k_setup_peer_smps() argument
2824 return ath10k_wmi_peer_set_param(ar, arvif->vdev_id, addr, in ath10k_setup_peer_smps()
2825 ar->wmi.peer_param->smps_state, in ath10k_setup_peer_smps()
2829 static int ath10k_mac_vif_recalc_txbf(struct ath10k *ar, in ath10k_mac_vif_recalc_txbf() argument
2838 if (ath10k_wmi_get_txbf_conf_scheme(ar) != WMI_TXBF_CONF_AFTER_ASSOC) in ath10k_mac_vif_recalc_txbf()
2841 if (!(ar->vht_cap_info & in ath10k_mac_vif_recalc_txbf()
2848 param = ar->wmi.vdev_param->txbf; in ath10k_mac_vif_recalc_txbf()
2858 if (ar->vht_cap_info & in ath10k_mac_vif_recalc_txbf()
2868 if (ar->vht_cap_info & in ath10k_mac_vif_recalc_txbf()
2884 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param, value); in ath10k_mac_vif_recalc_txbf()
2886 ath10k_warn(ar, "failed to submit vdev param txbf 0x%x: %d\n", in ath10k_mac_vif_recalc_txbf()
2899 struct ath10k *ar = hw->priv; in ath10k_bss_assoc() local
2907 lockdep_assert_held(&ar->conf_mutex); in ath10k_bss_assoc()
2909 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i assoc bssid %pM aid %d\n", in ath10k_bss_assoc()
2916 ath10k_warn(ar, "failed to find station entry for bss %pM vdev %i\n", in ath10k_bss_assoc()
2928 ret = ath10k_peer_assoc_prepare(ar, vif, ap_sta, &peer_arg); in ath10k_bss_assoc()
2930 ath10k_warn(ar, "failed to prepare peer assoc for %pM vdev %i: %d\n", in ath10k_bss_assoc()
2938 ret = ath10k_wmi_peer_assoc(ar, &peer_arg); in ath10k_bss_assoc()
2940 ath10k_warn(ar, "failed to run peer assoc for %pM vdev %i: %d\n", in ath10k_bss_assoc()
2945 ret = ath10k_setup_peer_smps(ar, arvif, bss_conf->bssid, &ht_cap); in ath10k_bss_assoc()
2947 ath10k_warn(ar, "failed to setup peer SMPS for vdev %i: %d\n", in ath10k_bss_assoc()
2952 ret = ath10k_mac_vif_recalc_txbf(ar, vif, vht_cap); in ath10k_bss_assoc()
2954 ath10k_warn(ar, "failed to recalc txbf for vdev %i on bss %pM: %d\n", in ath10k_bss_assoc()
2959 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_bss_assoc()
2968 ret = ath10k_wmi_pdev_set_param(ar, in ath10k_bss_assoc()
2969 ar->wmi.pdev_param->peer_stats_info_enable, 1); in ath10k_bss_assoc()
2971 ath10k_warn(ar, "failed to enable peer stats info: %d\n", ret); in ath10k_bss_assoc()
2973 ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid); in ath10k_bss_assoc()
2975 ath10k_warn(ar, "failed to set vdev %d up: %d\n", in ath10k_bss_assoc()
2986 ret = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, arvif->bssid, in ath10k_bss_assoc()
2987 ar->wmi.peer_param->dummy_var, 1); in ath10k_bss_assoc()
2989 ath10k_warn(ar, "failed to poke peer %pM param for ps workaround on vdev %i: %d\n", in ath10k_bss_assoc()
2998 struct ath10k *ar = hw->priv; in ath10k_bss_disassoc() local
3003 lockdep_assert_held(&ar->conf_mutex); in ath10k_bss_disassoc()
3005 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i disassoc bssid %pM\n", in ath10k_bss_disassoc()
3008 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id); in ath10k_bss_disassoc()
3010 ath10k_warn(ar, "failed to down vdev %i: %d\n", in ath10k_bss_disassoc()
3015 ret = ath10k_mac_vif_recalc_txbf(ar, vif, vht_cap); in ath10k_bss_disassoc()
3017 ath10k_warn(ar, "failed to recalc txbf for vdev %i: %d\n", in ath10k_bss_disassoc()
3027 static int ath10k_new_peer_tid_config(struct ath10k *ar, in ath10k_new_peer_tid_config() argument
3077 ret = ath10k_wmi_set_per_peer_per_tid_cfg(ar, &arg); in ath10k_new_peer_tid_config()
3079 ath10k_warn(ar, "failed to set per tid retry/aggr config for sta %pM: %d\n", in ath10k_new_peer_tid_config()
3090 static int ath10k_station_assoc(struct ath10k *ar, in ath10k_station_assoc() argument
3099 lockdep_assert_held(&ar->conf_mutex); in ath10k_station_assoc()
3101 ret = ath10k_peer_assoc_prepare(ar, vif, sta, &peer_arg); in ath10k_station_assoc()
3103 ath10k_warn(ar, "failed to prepare WMI peer assoc for %pM vdev %i: %i\n", in ath10k_station_assoc()
3108 ret = ath10k_wmi_peer_assoc(ar, &peer_arg); in ath10k_station_assoc()
3110 ath10k_warn(ar, "failed to run peer assoc for STA %pM vdev %i: %d\n", in ath10k_station_assoc()
3119 ret = ath10k_setup_peer_smps(ar, arvif, sta->addr, in ath10k_station_assoc()
3122 ath10k_warn(ar, "failed to setup peer SMPS for vdev %d: %d\n", in ath10k_station_assoc()
3127 ret = ath10k_peer_assoc_qos_ap(ar, arvif, sta); in ath10k_station_assoc()
3129 ath10k_warn(ar, "failed to set qos params for STA %pM for vdev %i: %d\n", in ath10k_station_assoc()
3138 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n", in ath10k_station_assoc()
3148 ath10k_warn(ar, "failed to install peer wep keys for vdev %i: %d\n", in ath10k_station_assoc()
3155 if (!test_bit(WMI_SERVICE_PEER_TID_CONFIGS_SUPPORT, ar->wmi.svc_map)) in ath10k_station_assoc()
3158 return ath10k_new_peer_tid_config(ar, sta, arvif); in ath10k_station_assoc()
3161 static int ath10k_station_disassoc(struct ath10k *ar, in ath10k_station_disassoc() argument
3168 lockdep_assert_held(&ar->conf_mutex); in ath10k_station_disassoc()
3174 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n", in ath10k_station_disassoc()
3182 ath10k_warn(ar, "failed to clear all peer wep keys for vdev %i: %d\n", in ath10k_station_disassoc()
3194 static int ath10k_update_channel_list(struct ath10k *ar) in ath10k_update_channel_list() argument
3196 struct ieee80211_hw *hw = ar->hw; in ath10k_update_channel_list()
3207 lockdep_assert_held(&ar->conf_mutex); in ath10k_update_channel_list()
3283 ath10k_dbg(ar, ATH10K_DBG_WMI, in ath10k_update_channel_list()
3293 ret = ath10k_wmi_scan_chan_list(ar, &arg); in ath10k_update_channel_list()
3315 static void ath10k_regd_update(struct ath10k *ar) in ath10k_regd_update() argument
3322 lockdep_assert_held(&ar->conf_mutex); in ath10k_regd_update()
3324 ret = ath10k_update_channel_list(ar); in ath10k_regd_update()
3326 ath10k_warn(ar, "failed to update channel list: %d\n", ret); in ath10k_regd_update()
3328 regpair = ar->ath_common.regulatory.regpair; in ath10k_regd_update()
3330 if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) { in ath10k_regd_update()
3331 nl_dfs_reg = ar->dfs_detector->region; in ath10k_regd_update()
3340 ret = ath10k_wmi_pdev_set_regdomain(ar, in ath10k_regd_update()
3348 ath10k_warn(ar, "failed to set pdev regdomain: %d\n", ret); in ath10k_regd_update()
3351 static void ath10k_mac_update_channel_list(struct ath10k *ar, in ath10k_mac_update_channel_list() argument
3356 if (ar->low_5ghz_chan && ar->high_5ghz_chan) { in ath10k_mac_update_channel_list()
3358 if (band->channels[i].center_freq < ar->low_5ghz_chan || in ath10k_mac_update_channel_list()
3359 band->channels[i].center_freq > ar->high_5ghz_chan) in ath10k_mac_update_channel_list()
3370 struct ath10k *ar = hw->priv; in ath10k_reg_notifier() local
3373 ath_reg_notifier_apply(wiphy, request, &ar->ath_common.regulatory); in ath10k_reg_notifier()
3375 if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) { in ath10k_reg_notifier()
3376 ath10k_dbg(ar, ATH10K_DBG_REGULATORY, "dfs region 0x%x\n", in ath10k_reg_notifier()
3378 result = ar->dfs_detector->set_dfs_domain(ar->dfs_detector, in ath10k_reg_notifier()
3381 ath10k_warn(ar, "DFS region 0x%X not supported, will trigger radar for every pulse\n", in ath10k_reg_notifier()
3385 mutex_lock(&ar->conf_mutex); in ath10k_reg_notifier()
3386 if (ar->state == ATH10K_STATE_ON) in ath10k_reg_notifier()
3387 ath10k_regd_update(ar); in ath10k_reg_notifier()
3388 mutex_unlock(&ar->conf_mutex); in ath10k_reg_notifier()
3390 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) in ath10k_reg_notifier()
3391 ath10k_mac_update_channel_list(ar, in ath10k_reg_notifier()
3392 ar->hw->wiphy->bands[NL80211_BAND_5GHZ]); in ath10k_reg_notifier()
3395 static void ath10k_stop_radar_confirmation(struct ath10k *ar) in ath10k_stop_radar_confirmation() argument
3397 spin_lock_bh(&ar->data_lock); in ath10k_stop_radar_confirmation()
3398 ar->radar_conf_state = ATH10K_RADAR_CONFIRMATION_STOPPED; in ath10k_stop_radar_confirmation()
3399 spin_unlock_bh(&ar->data_lock); in ath10k_stop_radar_confirmation()
3401 cancel_work_sync(&ar->radar_confirmation_work); in ath10k_stop_radar_confirmation()
3415 void ath10k_mac_tx_lock(struct ath10k *ar, int reason) in ath10k_mac_tx_lock() argument
3417 lockdep_assert_held(&ar->htt.tx_lock); in ath10k_mac_tx_lock()
3420 ar->tx_paused |= BIT(reason); in ath10k_mac_tx_lock()
3421 ieee80211_stop_queues(ar->hw); in ath10k_mac_tx_lock()
3427 struct ath10k *ar = data; in ath10k_mac_tx_unlock_iter() local
3433 ieee80211_wake_queue(ar->hw, arvif->vdev_id); in ath10k_mac_tx_unlock_iter()
3436 void ath10k_mac_tx_unlock(struct ath10k *ar, int reason) in ath10k_mac_tx_unlock() argument
3438 lockdep_assert_held(&ar->htt.tx_lock); in ath10k_mac_tx_unlock()
3441 ar->tx_paused &= ~BIT(reason); in ath10k_mac_tx_unlock()
3443 if (ar->tx_paused) in ath10k_mac_tx_unlock()
3446 ieee80211_iterate_active_interfaces_atomic(ar->hw, in ath10k_mac_tx_unlock()
3449 ar); in ath10k_mac_tx_unlock()
3451 ieee80211_wake_queue(ar->hw, ar->hw->offchannel_tx_hw_queue); in ath10k_mac_tx_unlock()
3456 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_tx_lock() local
3458 lockdep_assert_held(&ar->htt.tx_lock); in ath10k_mac_vif_tx_lock()
3462 ieee80211_stop_queue(ar->hw, arvif->vdev_id); in ath10k_mac_vif_tx_lock()
3467 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_tx_unlock() local
3469 lockdep_assert_held(&ar->htt.tx_lock); in ath10k_mac_vif_tx_unlock()
3474 if (ar->tx_paused) in ath10k_mac_vif_tx_unlock()
3480 ieee80211_wake_queue(ar->hw, arvif->vdev_id); in ath10k_mac_vif_tx_unlock()
3487 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_handle_tx_pause() local
3489 lockdep_assert_held(&ar->htt.tx_lock); in ath10k_mac_vif_handle_tx_pause()
3499 ath10k_dbg(ar, ATH10K_DBG_BOOT, in ath10k_mac_vif_handle_tx_pause()
3524 void ath10k_mac_handle_tx_pause_vdev(struct ath10k *ar, u32 vdev_id, in ath10k_mac_handle_tx_pause_vdev() argument
3534 spin_lock_bh(&ar->htt.tx_lock); in ath10k_mac_handle_tx_pause_vdev()
3535 ieee80211_iterate_active_interfaces_atomic(ar->hw, in ath10k_mac_handle_tx_pause_vdev()
3539 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_handle_tx_pause_vdev()
3543 ath10k_mac_tx_h_get_txmode(struct ath10k *ar, in ath10k_mac_tx_h_get_txmode() argument
3574 if (ar->htt.target_version_major < 3 && in ath10k_mac_tx_h_get_txmode()
3577 ar->running_fw->fw_file.fw_features)) in ath10k_mac_tx_h_get_txmode()
3591 if (test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags) || in ath10k_mac_tx_h_get_txmode()
3673 static void ath10k_tx_h_add_p2p_noa_ie(struct ath10k *ar, in ath10k_tx_h_add_p2p_noa_ie() argument
3685 spin_lock_bh(&ar->data_lock); in ath10k_tx_h_add_p2p_noa_ie()
3691 spin_unlock_bh(&ar->data_lock); in ath10k_tx_h_add_p2p_noa_ie()
3695 static void ath10k_mac_tx_h_fill_cb(struct ath10k *ar, in ath10k_mac_tx_h_fill_cb() argument
3755 spin_lock_bh(&ar->data_lock); in ath10k_mac_tx_h_fill_cb()
3757 spin_unlock_bh(&ar->data_lock); in ath10k_mac_tx_h_fill_cb()
3761 bool ath10k_mac_tx_frm_has_freq(struct ath10k *ar) in ath10k_mac_tx_frm_has_freq() argument
3769 return (ar->htt.target_version_major >= 3 && in ath10k_mac_tx_frm_has_freq()
3770 ar->htt.target_version_minor >= 4 && in ath10k_mac_tx_frm_has_freq()
3771 ar->running_fw->fw_file.htt_op_version == ATH10K_FW_HTT_OP_VERSION_TLV); in ath10k_mac_tx_frm_has_freq()
3774 static int ath10k_mac_tx_wmi_mgmt(struct ath10k *ar, struct sk_buff *skb) in ath10k_mac_tx_wmi_mgmt() argument
3776 struct sk_buff_head *q = &ar->wmi_mgmt_tx_queue; in ath10k_mac_tx_wmi_mgmt()
3779 ath10k_warn(ar, "wmi mgmt tx queue is full\n"); in ath10k_mac_tx_wmi_mgmt()
3784 ieee80211_queue_work(ar->hw, &ar->wmi_mgmt_tx_work); in ath10k_mac_tx_wmi_mgmt()
3790 ath10k_mac_tx_h_get_txpath(struct ath10k *ar, in ath10k_mac_tx_h_get_txpath() argument
3801 ar->running_fw->fw_file.fw_features) || in ath10k_mac_tx_h_get_txpath()
3803 ar->wmi.svc_map)) in ath10k_mac_tx_h_get_txpath()
3805 else if (ar->htt.target_version_major >= 3) in ath10k_mac_tx_h_get_txpath()
3814 static int ath10k_mac_tx_submit(struct ath10k *ar, in ath10k_mac_tx_submit() argument
3819 struct ath10k_htt *htt = &ar->htt; in ath10k_mac_tx_submit()
3830 ret = ath10k_mac_tx_wmi_mgmt(ar, skb); in ath10k_mac_tx_submit()
3839 ath10k_warn(ar, "failed to transmit packet, dropping: %d\n", in ath10k_mac_tx_submit()
3841 ieee80211_free_txskb(ar->hw, skb); in ath10k_mac_tx_submit()
3850 static int ath10k_mac_tx(struct ath10k *ar, in ath10k_mac_tx() argument
3856 struct ieee80211_hw *hw = ar->hw; in ath10k_mac_tx()
3863 ath10k_dbg(ar, ATH10K_DBG_MAC, "IEEE80211_TX_CTL_NO_CCK_RATE\n"); in ath10k_mac_tx()
3869 ath10k_tx_h_add_p2p_noa_ie(ar, vif, skb); in ath10k_mac_tx()
3876 if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags) && in ath10k_mac_tx()
3885 if (!ath10k_mac_tx_frm_has_freq(ar)) { in ath10k_mac_tx()
3886 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac queued offchannel skb %pK len %d\n", in ath10k_mac_tx()
3889 skb_queue_tail(&ar->offchan_tx_queue, skb); in ath10k_mac_tx()
3890 ieee80211_queue_work(hw, &ar->offchan_tx_work); in ath10k_mac_tx()
3895 ret = ath10k_mac_tx_submit(ar, txmode, txpath, skb); in ath10k_mac_tx()
3897 ath10k_warn(ar, "failed to submit frame: %d\n", ret); in ath10k_mac_tx()
3904 void ath10k_offchan_tx_purge(struct ath10k *ar) in ath10k_offchan_tx_purge() argument
3909 skb = skb_dequeue(&ar->offchan_tx_queue); in ath10k_offchan_tx_purge()
3913 ieee80211_free_txskb(ar->hw, skb); in ath10k_offchan_tx_purge()
3919 struct ath10k *ar = container_of(work, struct ath10k, offchan_tx_work); in ath10k_offchan_tx_work() local
3943 skb = skb_dequeue(&ar->offchan_tx_queue); in ath10k_offchan_tx_work()
3947 mutex_lock(&ar->conf_mutex); in ath10k_offchan_tx_work()
3949 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac offchannel skb %pK len %d\n", in ath10k_offchan_tx_work()
3955 spin_lock_bh(&ar->data_lock); in ath10k_offchan_tx_work()
3956 vdev_id = ar->scan.vdev_id; in ath10k_offchan_tx_work()
3957 peer = ath10k_peer_find(ar, vdev_id, peer_addr); in ath10k_offchan_tx_work()
3958 spin_unlock_bh(&ar->data_lock); in ath10k_offchan_tx_work()
3962 ath10k_dbg(ar, ATH10K_DBG_MAC, "peer %pM on vdev %d already present\n", in ath10k_offchan_tx_work()
3966 ret = ath10k_peer_create(ar, NULL, NULL, vdev_id, in ath10k_offchan_tx_work()
3970 ath10k_warn(ar, "failed to create peer %pM on vdev %d: %d\n", in ath10k_offchan_tx_work()
3975 spin_lock_bh(&ar->data_lock); in ath10k_offchan_tx_work()
3976 reinit_completion(&ar->offchan_tx_completed); in ath10k_offchan_tx_work()
3977 ar->offchan_tx_skb = skb; in ath10k_offchan_tx_work()
3978 spin_unlock_bh(&ar->data_lock); in ath10k_offchan_tx_work()
3984 arvif = ath10k_get_arvif(ar, vdev_id); in ath10k_offchan_tx_work()
3993 txmode = ath10k_mac_tx_h_get_txmode(ar, vif, sta, skb); in ath10k_offchan_tx_work()
3994 txpath = ath10k_mac_tx_h_get_txpath(ar, skb, txmode); in ath10k_offchan_tx_work()
3996 ret = ath10k_mac_tx(ar, vif, txmode, txpath, skb, true); in ath10k_offchan_tx_work()
3998 ath10k_warn(ar, "failed to transmit offchannel frame: %d\n", in ath10k_offchan_tx_work()
4004 wait_for_completion_timeout(&ar->offchan_tx_completed, 3 * HZ); in ath10k_offchan_tx_work()
4006 ath10k_warn(ar, "timed out waiting for offchannel skb %pK, len: %d\n", in ath10k_offchan_tx_work()
4010 ret = ath10k_peer_delete(ar, vdev_id, peer_addr); in ath10k_offchan_tx_work()
4012 ath10k_warn(ar, "failed to delete peer %pM on vdev %d: %d\n", in ath10k_offchan_tx_work()
4016 mutex_unlock(&ar->conf_mutex); in ath10k_offchan_tx_work()
4020 void ath10k_mgmt_over_wmi_tx_purge(struct ath10k *ar) in ath10k_mgmt_over_wmi_tx_purge() argument
4025 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue); in ath10k_mgmt_over_wmi_tx_purge()
4029 ieee80211_free_txskb(ar->hw, skb); in ath10k_mgmt_over_wmi_tx_purge()
4035 struct ath10k *ar = container_of(work, struct ath10k, wmi_mgmt_tx_work); in ath10k_mgmt_over_wmi_tx_work() local
4041 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue); in ath10k_mgmt_over_wmi_tx_work()
4046 ar->running_fw->fw_file.fw_features)) { in ath10k_mgmt_over_wmi_tx_work()
4047 paddr = dma_map_single(ar->dev, skb->data, in ath10k_mgmt_over_wmi_tx_work()
4049 if (dma_mapping_error(ar->dev, paddr)) { in ath10k_mgmt_over_wmi_tx_work()
4050 ieee80211_free_txskb(ar->hw, skb); in ath10k_mgmt_over_wmi_tx_work()
4053 ret = ath10k_wmi_mgmt_tx_send(ar, skb, paddr); in ath10k_mgmt_over_wmi_tx_work()
4055 ath10k_warn(ar, "failed to transmit management frame by ref via WMI: %d\n", in ath10k_mgmt_over_wmi_tx_work()
4058 ath10k_wmi_cleanup_mgmt_tx_send(ar, skb); in ath10k_mgmt_over_wmi_tx_work()
4060 dma_unmap_single(ar->dev, paddr, skb->len, in ath10k_mgmt_over_wmi_tx_work()
4062 ieee80211_free_txskb(ar->hw, skb); in ath10k_mgmt_over_wmi_tx_work()
4065 ret = ath10k_wmi_mgmt_tx(ar, skb); in ath10k_mgmt_over_wmi_tx_work()
4067 ath10k_warn(ar, "failed to transmit management frame via WMI: %d\n", in ath10k_mgmt_over_wmi_tx_work()
4069 ieee80211_free_txskb(ar->hw, skb); in ath10k_mgmt_over_wmi_tx_work()
4086 static void ath10k_mac_txq_unref(struct ath10k *ar, struct ieee80211_txq *txq) in ath10k_mac_txq_unref() argument
4095 spin_lock_bh(&ar->htt.tx_lock); in ath10k_mac_txq_unref()
4096 idr_for_each_entry(&ar->htt.pending_tx, msdu, msdu_id) { in ath10k_mac_txq_unref()
4101 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_txq_unref()
4104 struct ieee80211_txq *ath10k_mac_txq_lookup(struct ath10k *ar, in ath10k_mac_txq_lookup() argument
4110 lockdep_assert_held(&ar->data_lock); in ath10k_mac_txq_lookup()
4112 peer = ar->peer_map[peer_id]; in ath10k_mac_txq_lookup()
4130 struct ath10k *ar = hw->priv; in ath10k_mac_tx_can_push() local
4134 if (ar->htt.tx_q_state.mode == HTT_TX_MODE_SWITCH_PUSH) in ath10k_mac_tx_can_push()
4137 if (ar->htt.num_pending_tx < ar->htt.tx_q_state.num_push_allowed) in ath10k_mac_tx_can_push()
4154 static u16 ath10k_mac_update_airtime(struct ath10k *ar, in ath10k_mac_update_airtime() argument
4165 if (test_bit(WMI_SERVICE_REPORT_AIRTIME, ar->wmi.svc_map)) in ath10k_mac_update_airtime()
4168 spin_lock_bh(&ar->data_lock); in ath10k_mac_update_airtime()
4187 spin_unlock_bh(&ar->data_lock); in ath10k_mac_update_airtime()
4195 struct ath10k *ar = hw->priv; in ath10k_mac_tx_push_txq() local
4196 struct ath10k_htt *htt = &ar->htt; in ath10k_mac_tx_push_txq()
4209 spin_lock_bh(&ar->htt.tx_lock); in ath10k_mac_tx_push_txq()
4211 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_tx_push_txq()
4218 spin_lock_bh(&ar->htt.tx_lock); in ath10k_mac_tx_push_txq()
4220 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_tx_push_txq()
4225 airtime = ath10k_mac_update_airtime(ar, txq, skb); in ath10k_mac_tx_push_txq()
4226 ath10k_mac_tx_h_fill_cb(ar, vif, txq, sta, skb, airtime); in ath10k_mac_tx_push_txq()
4229 txmode = ath10k_mac_tx_h_get_txmode(ar, vif, sta, skb); in ath10k_mac_tx_push_txq()
4230 txpath = ath10k_mac_tx_h_get_txpath(ar, skb, txmode); in ath10k_mac_tx_push_txq()
4237 spin_lock_bh(&ar->htt.tx_lock); in ath10k_mac_tx_push_txq()
4242 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_tx_push_txq()
4245 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_tx_push_txq()
4248 ret = ath10k_mac_tx(ar, vif, txmode, txpath, skb, false); in ath10k_mac_tx_push_txq()
4250 ath10k_warn(ar, "failed to push frame: %d\n", ret); in ath10k_mac_tx_push_txq()
4252 spin_lock_bh(&ar->htt.tx_lock); in ath10k_mac_tx_push_txq()
4256 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_tx_push_txq()
4261 spin_lock_bh(&ar->htt.tx_lock); in ath10k_mac_tx_push_txq()
4263 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_tx_push_txq()
4290 void ath10k_mac_tx_push_pending(struct ath10k *ar) in ath10k_mac_tx_push_pending() argument
4292 struct ieee80211_hw *hw = ar->hw; in ath10k_mac_tx_push_pending()
4295 if (ar->htt.tx_q_state.mode != HTT_TX_MODE_SWITCH_PUSH) in ath10k_mac_tx_push_pending()
4298 if (ar->htt.num_pending_tx >= (ar->htt.max_num_pending_tx / 2)) in ath10k_mac_tx_push_pending()
4314 void __ath10k_scan_finish(struct ath10k *ar) in __ath10k_scan_finish() argument
4316 lockdep_assert_held(&ar->data_lock); in __ath10k_scan_finish()
4318 switch (ar->scan.state) { in __ath10k_scan_finish()
4323 if (!ar->scan.is_roc) { in __ath10k_scan_finish()
4325 .aborted = (ar->scan.state == in __ath10k_scan_finish()
4329 ieee80211_scan_completed(ar->hw, &info); in __ath10k_scan_finish()
4330 } else if (ar->scan.roc_notify) { in __ath10k_scan_finish()
4331 ieee80211_remain_on_channel_expired(ar->hw); in __ath10k_scan_finish()
4335 ar->scan.state = ATH10K_SCAN_IDLE; in __ath10k_scan_finish()
4336 ar->scan_channel = NULL; in __ath10k_scan_finish()
4337 ar->scan.roc_freq = 0; in __ath10k_scan_finish()
4338 ath10k_offchan_tx_purge(ar); in __ath10k_scan_finish()
4339 cancel_delayed_work(&ar->scan.timeout); in __ath10k_scan_finish()
4340 complete(&ar->scan.completed); in __ath10k_scan_finish()
4345 void ath10k_scan_finish(struct ath10k *ar) in ath10k_scan_finish() argument
4347 spin_lock_bh(&ar->data_lock); in ath10k_scan_finish()
4348 __ath10k_scan_finish(ar); in ath10k_scan_finish()
4349 spin_unlock_bh(&ar->data_lock); in ath10k_scan_finish()
4352 static int ath10k_scan_stop(struct ath10k *ar) in ath10k_scan_stop() argument
4361 lockdep_assert_held(&ar->conf_mutex); in ath10k_scan_stop()
4363 ret = ath10k_wmi_stop_scan(ar, &arg); in ath10k_scan_stop()
4365 ath10k_warn(ar, "failed to stop wmi scan: %d\n", ret); in ath10k_scan_stop()
4369 ret = wait_for_completion_timeout(&ar->scan.completed, 3 * HZ); in ath10k_scan_stop()
4371 ath10k_warn(ar, "failed to receive scan abortion completion: timed out\n"); in ath10k_scan_stop()
4385 spin_lock_bh(&ar->data_lock); in ath10k_scan_stop()
4386 if (ar->scan.state != ATH10K_SCAN_IDLE) in ath10k_scan_stop()
4387 __ath10k_scan_finish(ar); in ath10k_scan_stop()
4388 spin_unlock_bh(&ar->data_lock); in ath10k_scan_stop()
4393 static void ath10k_scan_abort(struct ath10k *ar) in ath10k_scan_abort() argument
4397 lockdep_assert_held(&ar->conf_mutex); in ath10k_scan_abort()
4399 spin_lock_bh(&ar->data_lock); in ath10k_scan_abort()
4401 switch (ar->scan.state) { in ath10k_scan_abort()
4409 ath10k_warn(ar, "refusing scan abortion due to invalid scan state: %s (%d)\n", in ath10k_scan_abort()
4410 ath10k_scan_state_str(ar->scan.state), in ath10k_scan_abort()
4411 ar->scan.state); in ath10k_scan_abort()
4414 ar->scan.state = ATH10K_SCAN_ABORTING; in ath10k_scan_abort()
4415 spin_unlock_bh(&ar->data_lock); in ath10k_scan_abort()
4417 ret = ath10k_scan_stop(ar); in ath10k_scan_abort()
4419 ath10k_warn(ar, "failed to abort scan: %d\n", ret); in ath10k_scan_abort()
4421 spin_lock_bh(&ar->data_lock); in ath10k_scan_abort()
4425 spin_unlock_bh(&ar->data_lock); in ath10k_scan_abort()
4430 struct ath10k *ar = container_of(work, struct ath10k, in ath10k_scan_timeout_work() local
4433 mutex_lock(&ar->conf_mutex); in ath10k_scan_timeout_work()
4434 ath10k_scan_abort(ar); in ath10k_scan_timeout_work()
4435 mutex_unlock(&ar->conf_mutex); in ath10k_scan_timeout_work()
4438 static int ath10k_start_scan(struct ath10k *ar, in ath10k_start_scan() argument
4443 lockdep_assert_held(&ar->conf_mutex); in ath10k_start_scan()
4445 ret = ath10k_wmi_start_scan(ar, arg); in ath10k_start_scan()
4449 ret = wait_for_completion_timeout(&ar->scan.started, 1 * HZ); in ath10k_start_scan()
4451 ret = ath10k_scan_stop(ar); in ath10k_start_scan()
4453 ath10k_warn(ar, "failed to stop scan: %d\n", ret); in ath10k_start_scan()
4462 spin_lock_bh(&ar->data_lock); in ath10k_start_scan()
4463 if (ar->scan.state == ATH10K_SCAN_IDLE) { in ath10k_start_scan()
4464 spin_unlock_bh(&ar->data_lock); in ath10k_start_scan()
4467 spin_unlock_bh(&ar->data_lock); in ath10k_start_scan()
4480 struct ath10k *ar = hw->priv; in ath10k_mac_op_tx() local
4481 struct ath10k_htt *htt = &ar->htt; in ath10k_mac_op_tx()
4495 airtime = ath10k_mac_update_airtime(ar, txq, skb); in ath10k_mac_op_tx()
4496 ath10k_mac_tx_h_fill_cb(ar, vif, txq, sta, skb, airtime); in ath10k_mac_op_tx()
4498 txmode = ath10k_mac_tx_h_get_txmode(ar, vif, sta, skb); in ath10k_mac_op_tx()
4499 txpath = ath10k_mac_tx_h_get_txpath(ar, skb, txmode); in ath10k_mac_op_tx()
4505 spin_lock_bh(&ar->htt.tx_lock); in ath10k_mac_op_tx()
4510 ath10k_warn(ar, "failed to increase tx pending count: %d, dropping\n", in ath10k_mac_op_tx()
4512 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_op_tx()
4513 ieee80211_free_txskb(ar->hw, skb); in ath10k_mac_op_tx()
4519 ath10k_dbg(ar, ATH10K_DBG_MAC, "failed to increase tx mgmt pending count: %d, dropping\n", in ath10k_mac_op_tx()
4522 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_op_tx()
4523 ieee80211_free_txskb(ar->hw, skb); in ath10k_mac_op_tx()
4526 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_op_tx()
4529 ret = ath10k_mac_tx(ar, vif, txmode, txpath, skb, false); in ath10k_mac_op_tx()
4531 ath10k_warn(ar, "failed to transmit frame: %d\n", ret); in ath10k_mac_op_tx()
4533 spin_lock_bh(&ar->htt.tx_lock); in ath10k_mac_op_tx()
4537 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_op_tx()
4546 struct ath10k *ar = hw->priv; in ath10k_mac_op_wake_tx_queue() local
4551 if (ar->htt.tx_q_state.mode != HTT_TX_MODE_SWITCH_PUSH) in ath10k_mac_op_wake_tx_queue()
4572 void ath10k_drain_tx(struct ath10k *ar) in ath10k_drain_tx() argument
4577 ath10k_offchan_tx_purge(ar); in ath10k_drain_tx()
4578 ath10k_mgmt_over_wmi_tx_purge(ar); in ath10k_drain_tx()
4580 cancel_work_sync(&ar->offchan_tx_work); in ath10k_drain_tx()
4581 cancel_work_sync(&ar->wmi_mgmt_tx_work); in ath10k_drain_tx()
4584 void ath10k_halt(struct ath10k *ar) in ath10k_halt() argument
4588 lockdep_assert_held(&ar->conf_mutex); in ath10k_halt()
4590 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags); in ath10k_halt()
4591 ar->filter_flags = 0; in ath10k_halt()
4592 ar->monitor = false; in ath10k_halt()
4593 ar->monitor_arvif = NULL; in ath10k_halt()
4595 if (ar->monitor_started) in ath10k_halt()
4596 ath10k_monitor_stop(ar); in ath10k_halt()
4598 ar->monitor_started = false; in ath10k_halt()
4599 ar->tx_paused = 0; in ath10k_halt()
4601 ath10k_scan_finish(ar); in ath10k_halt()
4602 ath10k_peer_cleanup_all(ar); in ath10k_halt()
4603 ath10k_stop_radar_confirmation(ar); in ath10k_halt()
4604 ath10k_core_stop(ar); in ath10k_halt()
4605 ath10k_hif_power_down(ar); in ath10k_halt()
4607 spin_lock_bh(&ar->data_lock); in ath10k_halt()
4608 list_for_each_entry(arvif, &ar->arvifs, list) in ath10k_halt()
4610 spin_unlock_bh(&ar->data_lock); in ath10k_halt()
4615 struct ath10k *ar = hw->priv; in ath10k_get_antenna() local
4617 mutex_lock(&ar->conf_mutex); in ath10k_get_antenna()
4619 *tx_ant = ar->cfg_tx_chainmask; in ath10k_get_antenna()
4620 *rx_ant = ar->cfg_rx_chainmask; in ath10k_get_antenna()
4622 mutex_unlock(&ar->conf_mutex); in ath10k_get_antenna()
4627 static bool ath10k_check_chain_mask(struct ath10k *ar, u32 cm, const char *dbg) in ath10k_check_chain_mask() argument
4636 …ath10k_warn(ar, "mac %s antenna chainmask is invalid: 0x%x. Suggested values: 15, 7, 3, 1 or 0.\n… in ath10k_check_chain_mask()
4641 static int ath10k_mac_get_vht_cap_bf_sts(struct ath10k *ar) in ath10k_mac_get_vht_cap_bf_sts() argument
4643 int nsts = ar->vht_cap_info; in ath10k_mac_get_vht_cap_bf_sts()
4658 static int ath10k_mac_get_vht_cap_bf_sound_dim(struct ath10k *ar) in ath10k_mac_get_vht_cap_bf_sound_dim() argument
4660 int sound_dim = ar->vht_cap_info; in ath10k_mac_get_vht_cap_bf_sound_dim()
4674 static struct ieee80211_sta_vht_cap ath10k_create_vht_cap(struct ath10k *ar) in ath10k_create_vht_cap() argument
4677 struct ath10k_hw_params *hw = &ar->hw_params; in ath10k_create_vht_cap()
4683 vht_cap.cap = ar->vht_cap_info; in ath10k_create_vht_cap()
4685 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE | in ath10k_create_vht_cap()
4687 val = ath10k_mac_get_vht_cap_bf_sts(ar); in ath10k_create_vht_cap()
4694 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE | in ath10k_create_vht_cap()
4696 val = ath10k_mac_get_vht_cap_bf_sound_dim(ar); in ath10k_create_vht_cap()
4705 if ((i < ar->num_rf_chains) && (ar->cfg_tx_chainmask & BIT(i))) in ath10k_create_vht_cap()
4711 if (ar->cfg_tx_chainmask <= 1) in ath10k_create_vht_cap()
4731 static struct ieee80211_sta_ht_cap ath10k_get_ht_cap(struct ath10k *ar) in ath10k_get_ht_cap() argument
4736 if (!(ar->ht_cap_info & WMI_HT_CAP_ENABLED)) in ath10k_get_ht_cap()
4747 if (ar->ht_cap_info & WMI_HT_CAP_HT20_SGI) in ath10k_get_ht_cap()
4750 if (ar->ht_cap_info & WMI_HT_CAP_HT40_SGI) in ath10k_get_ht_cap()
4753 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) { in ath10k_get_ht_cap()
4762 if (ar->ht_cap_info & WMI_HT_CAP_TX_STBC && (ar->cfg_tx_chainmask > 1)) in ath10k_get_ht_cap()
4765 if (ar->ht_cap_info & WMI_HT_CAP_RX_STBC) { in ath10k_get_ht_cap()
4768 stbc = ar->ht_cap_info; in ath10k_get_ht_cap()
4777 if (ar->ht_cap_info & WMI_HT_CAP_LDPC || (ar->ht_cap_info & in ath10k_get_ht_cap()
4778 WMI_HT_CAP_RX_LDPC && (ar->ht_cap_info & WMI_HT_CAP_TX_LDPC))) in ath10k_get_ht_cap()
4781 if (ar->ht_cap_info & WMI_HT_CAP_L_SIG_TXOP_PROT) in ath10k_get_ht_cap()
4785 if (ar->vht_cap_info & WMI_VHT_CAP_MAX_MPDU_LEN_MASK) in ath10k_get_ht_cap()
4788 for (i = 0; i < ar->num_rf_chains; i++) { in ath10k_get_ht_cap()
4789 if (ar->cfg_rx_chainmask & BIT(i)) in ath10k_get_ht_cap()
4798 static void ath10k_mac_setup_ht_vht_cap(struct ath10k *ar) in ath10k_mac_setup_ht_vht_cap() argument
4804 ht_cap = ath10k_get_ht_cap(ar); in ath10k_mac_setup_ht_vht_cap()
4805 vht_cap = ath10k_create_vht_cap(ar); in ath10k_mac_setup_ht_vht_cap()
4807 if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) { in ath10k_mac_setup_ht_vht_cap()
4808 band = &ar->mac.sbands[NL80211_BAND_2GHZ]; in ath10k_mac_setup_ht_vht_cap()
4811 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) { in ath10k_mac_setup_ht_vht_cap()
4812 band = &ar->mac.sbands[NL80211_BAND_5GHZ]; in ath10k_mac_setup_ht_vht_cap()
4818 static int __ath10k_set_antenna(struct ath10k *ar, u32 tx_ant, u32 rx_ant) in __ath10k_set_antenna() argument
4823 lockdep_assert_held(&ar->conf_mutex); in __ath10k_set_antenna()
4825 is_valid_tx_chain_mask = ath10k_check_chain_mask(ar, tx_ant, "tx"); in __ath10k_set_antenna()
4826 is_valid_rx_chain_mask = ath10k_check_chain_mask(ar, rx_ant, "rx"); in __ath10k_set_antenna()
4831 ar->cfg_tx_chainmask = tx_ant; in __ath10k_set_antenna()
4832 ar->cfg_rx_chainmask = rx_ant; in __ath10k_set_antenna()
4834 if ((ar->state != ATH10K_STATE_ON) && in __ath10k_set_antenna()
4835 (ar->state != ATH10K_STATE_RESTARTED)) in __ath10k_set_antenna()
4838 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->tx_chain_mask, in __ath10k_set_antenna()
4841 ath10k_warn(ar, "failed to set tx-chainmask: %d, req 0x%x\n", in __ath10k_set_antenna()
4846 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->rx_chain_mask, in __ath10k_set_antenna()
4849 ath10k_warn(ar, "failed to set rx-chainmask: %d, req 0x%x\n", in __ath10k_set_antenna()
4855 ath10k_mac_setup_ht_vht_cap(ar); in __ath10k_set_antenna()
4862 struct ath10k *ar = hw->priv; in ath10k_set_antenna() local
4865 mutex_lock(&ar->conf_mutex); in ath10k_set_antenna()
4866 ret = __ath10k_set_antenna(ar, tx_ant, rx_ant); in ath10k_set_antenna()
4867 mutex_unlock(&ar->conf_mutex); in ath10k_set_antenna()
4871 static int __ath10k_fetch_bb_timing_dt(struct ath10k *ar, in __ath10k_fetch_bb_timing_dt() argument
4878 node = ar->dev->of_node; in __ath10k_fetch_bb_timing_dt()
4898 ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot bb_tx_timing 0x%x bb_xpa_timing 0x%x\n", in __ath10k_fetch_bb_timing_dt()
4903 static int ath10k_mac_rfkill_config(struct ath10k *ar) in ath10k_mac_rfkill_config() argument
4908 if (ar->hw_values->rfkill_pin == 0) { in ath10k_mac_rfkill_config()
4909 ath10k_warn(ar, "ath10k does not support hardware rfkill with this device\n"); in ath10k_mac_rfkill_config()
4913 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_mac_rfkill_config()
4915 ar->hw_values->rfkill_pin, ar->hw_values->rfkill_cfg, in ath10k_mac_rfkill_config()
4916 ar->hw_values->rfkill_on_level); in ath10k_mac_rfkill_config()
4919 ar->hw_values->rfkill_on_level) | in ath10k_mac_rfkill_config()
4921 ar->hw_values->rfkill_pin) | in ath10k_mac_rfkill_config()
4923 ar->hw_values->rfkill_cfg); in ath10k_mac_rfkill_config()
4925 ret = ath10k_wmi_pdev_set_param(ar, in ath10k_mac_rfkill_config()
4926 ar->wmi.pdev_param->rfkill_config, in ath10k_mac_rfkill_config()
4929 ath10k_warn(ar, in ath10k_mac_rfkill_config()
4937 int ath10k_mac_rfkill_enable_radio(struct ath10k *ar, bool enable) in ath10k_mac_rfkill_enable_radio() argument
4947 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac rfkill enable %d", param); in ath10k_mac_rfkill_enable_radio()
4949 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->rfkill_enable, in ath10k_mac_rfkill_enable_radio()
4952 ath10k_warn(ar, "failed to set rfkill enable param %d: %d\n", in ath10k_mac_rfkill_enable_radio()
4962 struct ath10k *ar = hw->priv; in ath10k_start() local
4972 ath10k_drain_tx(ar); in ath10k_start()
4974 mutex_lock(&ar->conf_mutex); in ath10k_start()
4976 switch (ar->state) { in ath10k_start()
4978 ar->state = ATH10K_STATE_ON; in ath10k_start()
4981 ar->state = ATH10K_STATE_RESTARTED; in ath10k_start()
4994 spin_lock_bh(&ar->data_lock); in ath10k_start()
4996 if (ar->hw_rfkill_on) { in ath10k_start()
4997 ar->hw_rfkill_on = false; in ath10k_start()
4998 spin_unlock_bh(&ar->data_lock); in ath10k_start()
5002 spin_unlock_bh(&ar->data_lock); in ath10k_start()
5004 ret = ath10k_hif_power_up(ar, ATH10K_FIRMWARE_MODE_NORMAL); in ath10k_start()
5006 ath10k_err(ar, "Could not init hif: %d\n", ret); in ath10k_start()
5010 ret = ath10k_core_start(ar, ATH10K_FIRMWARE_MODE_NORMAL, in ath10k_start()
5011 &ar->normal_mode_fw); in ath10k_start()
5013 ath10k_err(ar, "Could not init core: %d\n", ret); in ath10k_start()
5017 if (ar->sys_cap_info & WMI_TLV_SYS_CAP_INFO_RFKILL) { in ath10k_start()
5018 ret = ath10k_mac_rfkill_config(ar); in ath10k_start()
5020 ath10k_warn(ar, "failed to configure rfkill: %d", ret); in ath10k_start()
5025 param = ar->wmi.pdev_param->pmf_qos; in ath10k_start()
5026 ret = ath10k_wmi_pdev_set_param(ar, param, 1); in ath10k_start()
5028 ath10k_warn(ar, "failed to enable PMF QOS: %d\n", ret); in ath10k_start()
5032 param = ar->wmi.pdev_param->dynamic_bw; in ath10k_start()
5033 ret = ath10k_wmi_pdev_set_param(ar, param, 1); in ath10k_start()
5035 ath10k_warn(ar, "failed to enable dynamic BW: %d\n", ret); in ath10k_start()
5039 if (test_bit(WMI_SERVICE_SPOOF_MAC_SUPPORT, ar->wmi.svc_map)) { in ath10k_start()
5040 ret = ath10k_wmi_scan_prob_req_oui(ar, ar->mac_addr); in ath10k_start()
5042 ath10k_err(ar, "failed to set prob req oui: %i\n", ret); in ath10k_start()
5047 if (test_bit(WMI_SERVICE_ADAPTIVE_OCS, ar->wmi.svc_map)) { in ath10k_start()
5048 ret = ath10k_wmi_adaptive_qcs(ar, true); in ath10k_start()
5050 ath10k_warn(ar, "failed to enable adaptive qcs: %d\n", in ath10k_start()
5056 if (test_bit(WMI_SERVICE_BURST, ar->wmi.svc_map)) { in ath10k_start()
5057 param = ar->wmi.pdev_param->burst_enable; in ath10k_start()
5058 ret = ath10k_wmi_pdev_set_param(ar, param, 0); in ath10k_start()
5060 ath10k_warn(ar, "failed to disable burst: %d\n", ret); in ath10k_start()
5065 param = ar->wmi.pdev_param->idle_ps_config; in ath10k_start()
5066 ret = ath10k_wmi_pdev_set_param(ar, param, 1); in ath10k_start()
5068 ath10k_warn(ar, "failed to enable idle_ps_config: %d\n", ret); in ath10k_start()
5072 __ath10k_set_antenna(ar, ar->cfg_tx_chainmask, ar->cfg_rx_chainmask); in ath10k_start()
5083 param = ar->wmi.pdev_param->arp_ac_override; in ath10k_start()
5084 ret = ath10k_wmi_pdev_set_param(ar, param, 0); in ath10k_start()
5086 ath10k_warn(ar, "failed to set arp ac override parameter: %d\n", in ath10k_start()
5092 ar->running_fw->fw_file.fw_features)) { in ath10k_start()
5093 ret = ath10k_wmi_pdev_enable_adaptive_cca(ar, 1, in ath10k_start()
5097 ath10k_warn(ar, "failed to enable adaptive cca: %d\n", in ath10k_start()
5103 param = ar->wmi.pdev_param->ani_enable; in ath10k_start()
5104 ret = ath10k_wmi_pdev_set_param(ar, param, 1); in ath10k_start()
5106 ath10k_warn(ar, "failed to enable ani by default: %d\n", in ath10k_start()
5111 ar->ani_enabled = true; in ath10k_start()
5113 if (ath10k_peer_stats_enabled(ar)) { in ath10k_start()
5114 param = ar->wmi.pdev_param->peer_stats_update_period; in ath10k_start()
5115 ret = ath10k_wmi_pdev_set_param(ar, param, in ath10k_start()
5118 ath10k_warn(ar, in ath10k_start()
5125 param = ar->wmi.pdev_param->enable_btcoex; in ath10k_start()
5126 if (test_bit(WMI_SERVICE_COEX_GPIO, ar->wmi.svc_map) && in ath10k_start()
5128 ar->running_fw->fw_file.fw_features) && in ath10k_start()
5129 ar->coex_support) { in ath10k_start()
5130 ret = ath10k_wmi_pdev_set_param(ar, param, 0); in ath10k_start()
5132 ath10k_warn(ar, in ath10k_start()
5136 clear_bit(ATH10K_FLAG_BTCOEX, &ar->dev_flags); in ath10k_start()
5139 if (test_bit(WMI_SERVICE_BB_TIMING_CONFIG_SUPPORT, ar->wmi.svc_map)) { in ath10k_start()
5140 ret = __ath10k_fetch_bb_timing_dt(ar, &bb_timing); in ath10k_start()
5142 ret = ath10k_wmi_pdev_bb_timing(ar, &bb_timing); in ath10k_start()
5144 ath10k_warn(ar, in ath10k_start()
5152 ar->num_started_vdevs = 0; in ath10k_start()
5153 ath10k_regd_update(ar); in ath10k_start()
5155 ath10k_spectral_start(ar); in ath10k_start()
5156 ath10k_thermal_set_throttling(ar); in ath10k_start()
5158 ar->radar_conf_state = ATH10K_RADAR_CONFIRMATION_IDLE; in ath10k_start()
5160 mutex_unlock(&ar->conf_mutex); in ath10k_start()
5164 ath10k_core_stop(ar); in ath10k_start()
5167 ath10k_hif_power_down(ar); in ath10k_start()
5170 ar->state = ATH10K_STATE_OFF; in ath10k_start()
5173 mutex_unlock(&ar->conf_mutex); in ath10k_start()
5179 struct ath10k *ar = hw->priv; in ath10k_stop() local
5182 ath10k_drain_tx(ar); in ath10k_stop()
5184 mutex_lock(&ar->conf_mutex); in ath10k_stop()
5185 if (ar->state != ATH10K_STATE_OFF) { in ath10k_stop()
5186 if (!ar->hw_rfkill_on) { in ath10k_stop()
5192 if (ar->state != ATH10K_STATE_RESTARTING) { in ath10k_stop()
5193 ath10k_halt(ar); in ath10k_stop()
5200 ath10k_wait_for_suspend(ar, opt); in ath10k_stop()
5203 ar->state = ATH10K_STATE_OFF; in ath10k_stop()
5205 mutex_unlock(&ar->conf_mutex); in ath10k_stop()
5207 cancel_work_sync(&ar->set_coverage_class_work); in ath10k_stop()
5208 cancel_delayed_work_sync(&ar->scan.timeout); in ath10k_stop()
5209 cancel_work_sync(&ar->restart_work); in ath10k_stop()
5212 static int ath10k_config_ps(struct ath10k *ar) in ath10k_config_ps() argument
5217 lockdep_assert_held(&ar->conf_mutex); in ath10k_config_ps()
5219 list_for_each_entry(arvif, &ar->arvifs, list) { in ath10k_config_ps()
5222 ath10k_warn(ar, "failed to setup powersave: %d\n", ret); in ath10k_config_ps()
5230 static int ath10k_mac_txpower_setup(struct ath10k *ar, int txpower) in ath10k_mac_txpower_setup() argument
5235 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_txpower_setup()
5237 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac txpower %d\n", txpower); in ath10k_mac_txpower_setup()
5239 param = ar->wmi.pdev_param->txpower_limit2g; in ath10k_mac_txpower_setup()
5240 ret = ath10k_wmi_pdev_set_param(ar, param, txpower * 2); in ath10k_mac_txpower_setup()
5242 ath10k_warn(ar, "failed to set 2g txpower %d: %d\n", in ath10k_mac_txpower_setup()
5247 param = ar->wmi.pdev_param->txpower_limit5g; in ath10k_mac_txpower_setup()
5248 ret = ath10k_wmi_pdev_set_param(ar, param, txpower * 2); in ath10k_mac_txpower_setup()
5250 ath10k_warn(ar, "failed to set 5g txpower %d: %d\n", in ath10k_mac_txpower_setup()
5258 static int ath10k_mac_txpower_recalc(struct ath10k *ar) in ath10k_mac_txpower_recalc() argument
5263 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_txpower_recalc()
5265 list_for_each_entry(arvif, &ar->arvifs, list) { in ath10k_mac_txpower_recalc()
5279 ret = ath10k_mac_txpower_setup(ar, txpower); in ath10k_mac_txpower_recalc()
5281 ath10k_warn(ar, "failed to setup tx power %d: %d\n", in ath10k_mac_txpower_recalc()
5291 struct ath10k *ar = hw->priv; in ath10k_config() local
5295 mutex_lock(&ar->conf_mutex); in ath10k_config()
5298 ath10k_config_ps(ar); in ath10k_config()
5301 ar->monitor = conf->flags & IEEE80211_CONF_MONITOR; in ath10k_config()
5302 ret = ath10k_monitor_recalc(ar); in ath10k_config()
5304 ath10k_warn(ar, "failed to recalc monitor: %d\n", ret); in ath10k_config()
5307 mutex_unlock(&ar->conf_mutex); in ath10k_config()
5325 struct ath10k *ar = arvif->ar; in ath10k_mac_set_txbf_conf() local
5329 if (ath10k_wmi_get_txbf_conf_scheme(ar) != WMI_TXBF_CONF_BEFORE_ASSOC) in ath10k_mac_set_txbf_conf()
5332 nsts = ath10k_mac_get_vht_cap_bf_sts(ar); in ath10k_mac_set_txbf_conf()
5333 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE | in ath10k_mac_set_txbf_conf()
5337 sound_dim = ath10k_mac_get_vht_cap_bf_sound_dim(ar); in ath10k_mac_set_txbf_conf()
5338 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE | in ath10k_mac_set_txbf_conf()
5345 if (ar->vht_cap_info & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE) in ath10k_mac_set_txbf_conf()
5348 if (ar->vht_cap_info & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE) in ath10k_mac_set_txbf_conf()
5352 if (ar->vht_cap_info & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE) in ath10k_mac_set_txbf_conf()
5355 if (ar->vht_cap_info & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE) in ath10k_mac_set_txbf_conf()
5359 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, in ath10k_mac_set_txbf_conf()
5360 ar->wmi.vdev_param->txbf, value); in ath10k_mac_set_txbf_conf()
5373 struct ath10k *ar = hw->priv; in ath10k_add_interface() local
5385 mutex_lock(&ar->conf_mutex); in ath10k_add_interface()
5390 arvif->ar = ar; in ath10k_add_interface()
5406 if (ar->num_peers >= ar->max_num_peers) { in ath10k_add_interface()
5407 ath10k_warn(ar, "refusing vdev creation due to insufficient peer entry resources in firmware\n"); in ath10k_add_interface()
5412 if (ar->free_vdev_map == 0) { in ath10k_add_interface()
5413 ath10k_warn(ar, "Free vdev map is empty, no more interfaces allowed.\n"); in ath10k_add_interface()
5417 bit = __ffs64(ar->free_vdev_map); in ath10k_add_interface()
5419 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac create vdev %i map %llx\n", in ath10k_add_interface()
5420 bit, ar->free_vdev_map); in ath10k_add_interface()
5424 ath10k_wmi_get_vdev_subtype(ar, WMI_VDEV_SUBTYPE_NONE); in ath10k_add_interface()
5430 (ar, WMI_VDEV_SUBTYPE_P2P_DEVICE); in ath10k_add_interface()
5437 (ar, WMI_VDEV_SUBTYPE_P2P_CLIENT); in ath10k_add_interface()
5443 if (test_bit(WMI_SERVICE_MESH_11S, ar->wmi.svc_map)) { in ath10k_add_interface()
5445 (ar, WMI_VDEV_SUBTYPE_MESH_11S); in ath10k_add_interface()
5446 } else if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) { in ath10k_add_interface()
5448 ath10k_warn(ar, "must load driver with rawmode=1 to add mesh interfaces\n"); in ath10k_add_interface()
5458 (ar, WMI_VDEV_SUBTYPE_P2P_GO); in ath10k_add_interface()
5496 if (ar->bus_param.dev_type == ATH10K_DEV_TYPE_HL) { in ath10k_add_interface()
5510 dma_alloc_coherent(ar->dev, in ath10k_add_interface()
5517 ath10k_warn(ar, "failed to allocate beacon buffer: %d\n", in ath10k_add_interface()
5522 if (test_bit(ATH10K_FLAG_HW_CRYPTO_DISABLED, &ar->dev_flags)) in ath10k_add_interface()
5526 !test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) { in ath10k_add_interface()
5528 ath10k_warn(ar, "cryptmode module param needed for sw crypto\n"); in ath10k_add_interface()
5532 …ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev create %d (add interface) type %d subtype %d bcnmode %s\n… in ath10k_add_interface()
5536 ret = ath10k_wmi_vdev_create(ar, arvif->vdev_id, arvif->vdev_type, in ath10k_add_interface()
5539 ath10k_warn(ar, "failed to create WMI vdev %i: %d\n", in ath10k_add_interface()
5545 ar->wmi.svc_map)) { in ath10k_add_interface()
5546 vdev_param = ar->wmi.vdev_param->disable_4addr_src_lrn; in ath10k_add_interface()
5547 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_add_interface()
5550 ath10k_warn(ar, "failed to disable 4addr src lrn vdev %i: %d\n", in ath10k_add_interface()
5555 ar->free_vdev_map &= ~(1LL << arvif->vdev_id); in ath10k_add_interface()
5556 spin_lock_bh(&ar->data_lock); in ath10k_add_interface()
5557 list_add(&arvif->list, &ar->arvifs); in ath10k_add_interface()
5558 spin_unlock_bh(&ar->data_lock); in ath10k_add_interface()
5565 ath10k_warn(ar, "failed to disable keepalive on vdev %i: %d\n", in ath10k_add_interface()
5572 vdev_param = ar->wmi.vdev_param->tx_encap_type; in ath10k_add_interface()
5573 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_add_interface()
5577 ath10k_warn(ar, "failed to set vdev %i TX encapsulation: %d\n", in ath10k_add_interface()
5585 if (ar->cfg_tx_chainmask && (vif->type != NL80211_IFTYPE_MONITOR)) { in ath10k_add_interface()
5586 u16 nss = get_nss_from_chainmask(ar->cfg_tx_chainmask); in ath10k_add_interface()
5588 vdev_param = ar->wmi.vdev_param->nss; in ath10k_add_interface()
5589 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_add_interface()
5592 ath10k_warn(ar, "failed to set vdev %i chainmask 0x%x, nss %i: %d\n", in ath10k_add_interface()
5593 arvif->vdev_id, ar->cfg_tx_chainmask, nss, in ath10k_add_interface()
5601 ret = ath10k_peer_create(ar, vif, NULL, arvif->vdev_id, in ath10k_add_interface()
5604 ath10k_warn(ar, "failed to create vdev %i peer for AP/IBSS: %d\n", in ath10k_add_interface()
5609 spin_lock_bh(&ar->data_lock); in ath10k_add_interface()
5611 peer = ath10k_peer_find(ar, arvif->vdev_id, vif->addr); in ath10k_add_interface()
5613 ath10k_warn(ar, "failed to lookup peer %pM on vdev %i\n", in ath10k_add_interface()
5615 spin_unlock_bh(&ar->data_lock); in ath10k_add_interface()
5623 spin_unlock_bh(&ar->data_lock); in ath10k_add_interface()
5631 ath10k_warn(ar, "failed to set vdev %i kickout parameters: %d\n", in ath10k_add_interface()
5640 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath10k_add_interface()
5643 ath10k_warn(ar, "failed to set vdev %i RX wake policy: %d\n", in ath10k_add_interface()
5650 ath10k_warn(ar, "failed to recalc ps wake threshold on vdev %i: %d\n", in ath10k_add_interface()
5657 ath10k_warn(ar, "failed to recalc ps poll count on vdev %i: %d\n", in ath10k_add_interface()
5665 ath10k_warn(ar, "failed to set txbf for vdev %d: %d\n", in ath10k_add_interface()
5670 ret = ath10k_mac_set_rts(arvif, ar->hw->wiphy->rts_threshold); in ath10k_add_interface()
5672 ath10k_warn(ar, "failed to set rts threshold for vdev %d: %d\n", in ath10k_add_interface()
5678 ret = ath10k_mac_txpower_recalc(ar); in ath10k_add_interface()
5680 ath10k_warn(ar, "failed to recalc tx power: %d\n", ret); in ath10k_add_interface()
5684 if (test_bit(WMI_SERVICE_RTT_RESPONDER_ROLE, ar->wmi.svc_map)) { in ath10k_add_interface()
5685 vdev_param = ar->wmi.vdev_param->rtt_responder_role; in ath10k_add_interface()
5686 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_add_interface()
5691 ath10k_warn(ar, "failed to set vdev %i FTM Responder: %d\n", in ath10k_add_interface()
5696 ar->monitor_arvif = arvif; in ath10k_add_interface()
5697 ret = ath10k_monitor_recalc(ar); in ath10k_add_interface()
5699 ath10k_warn(ar, "failed to recalc monitor: %d\n", ret); in ath10k_add_interface()
5704 spin_lock_bh(&ar->htt.tx_lock); in ath10k_add_interface()
5705 if (!ar->tx_paused) in ath10k_add_interface()
5706 ieee80211_wake_queue(ar->hw, arvif->vdev_id); in ath10k_add_interface()
5707 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_add_interface()
5709 mutex_unlock(&ar->conf_mutex); in ath10k_add_interface()
5715 ath10k_wmi_peer_delete(ar, arvif->vdev_id, vif->addr); in ath10k_add_interface()
5716 ath10k_wait_for_peer_delete_done(ar, arvif->vdev_id, in ath10k_add_interface()
5721 ath10k_wmi_vdev_delete(ar, arvif->vdev_id); in ath10k_add_interface()
5722 ar->free_vdev_map |= 1LL << arvif->vdev_id; in ath10k_add_interface()
5723 spin_lock_bh(&ar->data_lock); in ath10k_add_interface()
5725 spin_unlock_bh(&ar->data_lock); in ath10k_add_interface()
5729 if (ar->bus_param.dev_type == ATH10K_DEV_TYPE_HL) in ath10k_add_interface()
5732 dma_free_coherent(ar->dev, IEEE80211_MAX_FRAME_LEN, in ath10k_add_interface()
5738 mutex_unlock(&ar->conf_mutex); in ath10k_add_interface()
5754 struct ath10k *ar = hw->priv; in ath10k_remove_interface() local
5764 mutex_lock(&ar->conf_mutex); in ath10k_remove_interface()
5768 ath10k_warn(ar, "failed to stop spectral for vdev %i: %d\n", in ath10k_remove_interface()
5771 ar->free_vdev_map |= 1LL << arvif->vdev_id; in ath10k_remove_interface()
5772 spin_lock_bh(&ar->data_lock); in ath10k_remove_interface()
5774 spin_unlock_bh(&ar->data_lock); in ath10k_remove_interface()
5778 ret = ath10k_wmi_peer_delete(arvif->ar, arvif->vdev_id, in ath10k_remove_interface()
5781 ath10k_warn(ar, "failed to submit AP/IBSS self-peer removal on vdev %i: %d\n", in ath10k_remove_interface()
5784 ath10k_wait_for_peer_delete_done(ar, arvif->vdev_id, in ath10k_remove_interface()
5789 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i delete (remove interface)\n", in ath10k_remove_interface()
5792 ret = ath10k_wmi_vdev_delete(ar, arvif->vdev_id); in ath10k_remove_interface()
5794 ath10k_warn(ar, "failed to delete WMI vdev %i: %d\n", in ath10k_remove_interface()
5797 if (test_bit(WMI_SERVICE_SYNC_DELETE_CMDS, ar->wmi.svc_map)) { in ath10k_remove_interface()
5798 time_left = wait_for_completion_timeout(&ar->vdev_delete_done, in ath10k_remove_interface()
5801 ath10k_warn(ar, "Timeout in receiving vdev delete response\n"); in ath10k_remove_interface()
5811 ret = ath10k_wait_for_peer_deleted(ar, arvif->vdev_id, in ath10k_remove_interface()
5814 ath10k_warn(ar, "failed to remove AP self-peer on vdev %i: %d\n", in ath10k_remove_interface()
5817 spin_lock_bh(&ar->data_lock); in ath10k_remove_interface()
5818 ar->num_peers--; in ath10k_remove_interface()
5819 spin_unlock_bh(&ar->data_lock); in ath10k_remove_interface()
5822 spin_lock_bh(&ar->data_lock); in ath10k_remove_interface()
5823 for (i = 0; i < ARRAY_SIZE(ar->peer_map); i++) { in ath10k_remove_interface()
5824 peer = ar->peer_map[i]; in ath10k_remove_interface()
5829 ath10k_warn(ar, "found vif peer %pM entry on vdev %i after it was supposedly removed\n", in ath10k_remove_interface()
5839 spin_unlock_bh(&ar->data_lock); in ath10k_remove_interface()
5841 ath10k_peer_cleanup(ar, arvif->vdev_id); in ath10k_remove_interface()
5842 ath10k_mac_txq_unref(ar, vif->txq); in ath10k_remove_interface()
5845 ar->monitor_arvif = NULL; in ath10k_remove_interface()
5846 ret = ath10k_monitor_recalc(ar); in ath10k_remove_interface()
5848 ath10k_warn(ar, "failed to recalc monitor: %d\n", ret); in ath10k_remove_interface()
5851 ret = ath10k_mac_txpower_recalc(ar); in ath10k_remove_interface()
5853 ath10k_warn(ar, "failed to recalc tx power: %d\n", ret); in ath10k_remove_interface()
5855 spin_lock_bh(&ar->htt.tx_lock); in ath10k_remove_interface()
5857 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_remove_interface()
5859 ath10k_mac_txq_unref(ar, vif->txq); in ath10k_remove_interface()
5862 mutex_unlock(&ar->conf_mutex); in ath10k_remove_interface()
5882 struct ath10k *ar = hw->priv; in ath10k_configure_filter() local
5885 mutex_lock(&ar->conf_mutex); in ath10k_configure_filter()
5889 ar->filter_flags = *total_flags; in ath10k_configure_filter()
5891 ret = ath10k_monitor_recalc(ar); in ath10k_configure_filter()
5893 ath10k_warn(ar, "failed to recalc monitor: %d\n", ret); in ath10k_configure_filter()
5895 mutex_unlock(&ar->conf_mutex); in ath10k_configure_filter()
5898 static void ath10k_recalculate_mgmt_rate(struct ath10k *ar, in ath10k_recalculate_mgmt_rate() argument
5910 lockdep_assert_held(&ar->conf_mutex); in ath10k_recalculate_mgmt_rate()
5912 sband = ar->hw->wiphy->bands[def->chan->band]; in ath10k_recalculate_mgmt_rate()
5918 ath10k_warn(ar, "bitrate not supported %d\n", bitrate); in ath10k_recalculate_mgmt_rate()
5922 vdev_param = ar->wmi.vdev_param->mgmt_rate; in ath10k_recalculate_mgmt_rate()
5923 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_recalculate_mgmt_rate()
5926 ath10k_warn(ar, "failed to set mgmt tx rate %d\n", ret); in ath10k_recalculate_mgmt_rate()
5934 struct ath10k *ar = hw->priv; in ath10k_bss_info_changed() local
5943 mutex_lock(&ar->conf_mutex); in ath10k_bss_info_changed()
5950 vdev_param = ar->wmi.vdev_param->beacon_interval; in ath10k_bss_info_changed()
5951 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_bss_info_changed()
5953 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_bss_info_changed()
5958 ath10k_warn(ar, "failed to set beacon interval for vdev %d: %i\n", in ath10k_bss_info_changed()
5963 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_bss_info_changed()
5967 pdev_param = ar->wmi.pdev_param->beacon_tx_mode; in ath10k_bss_info_changed()
5968 ret = ath10k_wmi_pdev_set_param(ar, pdev_param, in ath10k_bss_info_changed()
5971 ath10k_warn(ar, "failed to set beacon mode for vdev %d: %i\n", in ath10k_bss_info_changed()
5976 ath10k_warn(ar, "failed to update beacon template: %d\n", in ath10k_bss_info_changed()
5990 ath10k_warn(ar, "failed to setup probe resp template on vdev %i: %d\n", in ath10k_bss_info_changed()
5997 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_bss_info_changed()
6001 vdev_param = ar->wmi.vdev_param->dtim_period; in ath10k_bss_info_changed()
6002 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_bss_info_changed()
6005 ath10k_warn(ar, "failed to set dtim period for vdev %d: %i\n", in ath10k_bss_info_changed()
6022 test_bit(WMI_SERVICE_RTT_RESPONDER_ROLE, ar->wmi.svc_map)) { in ath10k_bss_info_changed()
6025 vdev_param = ar->wmi.vdev_param->rtt_responder_role; in ath10k_bss_info_changed()
6026 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_bss_info_changed()
6029 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_bss_info_changed()
6042 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n", in ath10k_bss_info_changed()
6048 ath10k_warn(ar, "failed to set cts protection for vdev %d: %d\n", in ath10k_bss_info_changed()
6060 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d slot_time %d\n", in ath10k_bss_info_changed()
6063 vdev_param = ar->wmi.vdev_param->slot_time; in ath10k_bss_info_changed()
6064 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_bss_info_changed()
6067 ath10k_warn(ar, "failed to set erp slot for vdev %d: %i\n", in ath10k_bss_info_changed()
6077 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_bss_info_changed()
6081 vdev_param = ar->wmi.vdev_param->preamble; in ath10k_bss_info_changed()
6082 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_bss_info_changed()
6085 ath10k_warn(ar, "failed to set preamble for vdev %d: %i\n", in ath10k_bss_info_changed()
6095 if (ar->monitor_started) in ath10k_bss_info_changed()
6096 ath10k_monitor_stop(ar); in ath10k_bss_info_changed()
6098 ath10k_monitor_recalc(ar); in ath10k_bss_info_changed()
6105 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev_id %i txpower %d\n", in ath10k_bss_info_changed()
6109 ret = ath10k_mac_txpower_recalc(ar); in ath10k_bss_info_changed()
6111 ath10k_warn(ar, "failed to recalc tx power: %d\n", ret); in ath10k_bss_info_changed()
6117 ret = ath10k_config_ps(ar); in ath10k_bss_info_changed()
6119 ath10k_warn(ar, "failed to setup ps on vdev %i: %d\n", in ath10k_bss_info_changed()
6132 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) in ath10k_bss_info_changed()
6144 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_bss_info_changed()
6148 vdev_param = ar->wmi.vdev_param->mcast_data_rate; in ath10k_bss_info_changed()
6149 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, in ath10k_bss_info_changed()
6152 ath10k_warn(ar, in ath10k_bss_info_changed()
6156 vdev_param = ar->wmi.vdev_param->bcast_data_rate; in ath10k_bss_info_changed()
6157 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, in ath10k_bss_info_changed()
6160 ath10k_warn(ar, in ath10k_bss_info_changed()
6167 ath10k_recalculate_mgmt_rate(ar, vif, &def); in ath10k_bss_info_changed()
6169 mutex_unlock(&ar->conf_mutex); in ath10k_bss_info_changed()
6174 struct ath10k *ar = hw->priv; in ath10k_mac_op_set_coverage_class() local
6179 if (!ar->hw_params.hw_ops->set_coverage_class) { in ath10k_mac_op_set_coverage_class()
6183 ar->hw_params.hw_ops->set_coverage_class(ar, value); in ath10k_mac_op_set_coverage_class()
6219 struct ath10k *ar = hw->priv; in ath10k_hw_scan() local
6227 mutex_lock(&ar->conf_mutex); in ath10k_hw_scan()
6234 spin_lock_bh(&ar->data_lock); in ath10k_hw_scan()
6235 switch (ar->scan.state) { in ath10k_hw_scan()
6237 reinit_completion(&ar->scan.started); in ath10k_hw_scan()
6238 reinit_completion(&ar->scan.completed); in ath10k_hw_scan()
6239 ar->scan.state = ATH10K_SCAN_STARTING; in ath10k_hw_scan()
6240 ar->scan.is_roc = false; in ath10k_hw_scan()
6241 ar->scan.vdev_id = arvif->vdev_id; in ath10k_hw_scan()
6250 spin_unlock_bh(&ar->data_lock); in ath10k_hw_scan()
6256 ath10k_wmi_start_scan_init(ar, &arg); in ath10k_hw_scan()
6303 ret = ath10k_start_scan(ar, &arg); in ath10k_hw_scan()
6305 ath10k_warn(ar, "failed to start hw scan: %d\n", ret); in ath10k_hw_scan()
6306 spin_lock_bh(&ar->data_lock); in ath10k_hw_scan()
6307 ar->scan.state = ATH10K_SCAN_IDLE; in ath10k_hw_scan()
6308 spin_unlock_bh(&ar->data_lock); in ath10k_hw_scan()
6311 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout, in ath10k_hw_scan()
6315 mutex_unlock(&ar->conf_mutex); in ath10k_hw_scan()
6322 struct ath10k *ar = hw->priv; in ath10k_cancel_hw_scan() local
6324 mutex_lock(&ar->conf_mutex); in ath10k_cancel_hw_scan()
6325 ath10k_scan_abort(ar); in ath10k_cancel_hw_scan()
6326 mutex_unlock(&ar->conf_mutex); in ath10k_cancel_hw_scan()
6328 cancel_delayed_work_sync(&ar->scan.timeout); in ath10k_cancel_hw_scan()
6331 static void ath10k_set_key_h_def_keyidx(struct ath10k *ar, in ath10k_set_key_h_def_keyidx() argument
6336 u32 vdev_param = arvif->ar->wmi.vdev_param->def_keyid; in ath10k_set_key_h_def_keyidx()
6366 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_set_key_h_def_keyidx()
6369 ath10k_warn(ar, "failed to set vdev %i group key as default key: %d\n", in ath10k_set_key_h_def_keyidx()
6377 struct ath10k *ar = hw->priv; in ath10k_set_key() local
6402 mutex_lock(&ar->conf_mutex); in ath10k_set_key()
6407 spin_lock_bh(&ar->data_lock); in ath10k_set_key()
6409 spin_unlock_bh(&ar->data_lock); in ath10k_set_key()
6428 spin_lock_bh(&ar->data_lock); in ath10k_set_key()
6429 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr); in ath10k_set_key()
6430 spin_unlock_bh(&ar->data_lock); in ath10k_set_key()
6434 ath10k_warn(ar, "failed to install key for non-existent peer %pM\n", in ath10k_set_key()
6474 ath10k_warn(ar, "failed to install key for vdev %i peer %pM: %d\n", in ath10k_set_key()
6490 ath10k_warn(ar, "failed to install (ucast) key for vdev %i peer %pM: %d\n", in ath10k_set_key()
6496 ath10k_warn(ar, "failed to disable (mcast) key for vdev %i peer %pM: %d\n", in ath10k_set_key()
6503 ath10k_set_key_h_def_keyidx(ar, arvif, cmd, key); in ath10k_set_key()
6505 spin_lock_bh(&ar->data_lock); in ath10k_set_key()
6506 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr); in ath10k_set_key()
6513 ath10k_warn(ar, "Peer %pM disappeared!\n", peer_addr); in ath10k_set_key()
6514 spin_unlock_bh(&ar->data_lock); in ath10k_set_key()
6517 ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr, in ath10k_set_key()
6518 ar->wmi.peer_param->authorize, 1); in ath10k_set_key()
6520 ath10k_wmi_peer_set_param(ar, arvif->vdev_id, peer_addr, in ath10k_set_key()
6521 ar->wmi.peer_param->authorize, 1); in ath10k_set_key()
6524 mutex_unlock(&ar->conf_mutex); in ath10k_set_key()
6532 struct ath10k *ar = hw->priv; in ath10k_set_default_unicast_key() local
6536 mutex_lock(&arvif->ar->conf_mutex); in ath10k_set_default_unicast_key()
6538 if (arvif->ar->state != ATH10K_STATE_ON) in ath10k_set_default_unicast_key()
6541 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d set keyidx %d\n", in ath10k_set_default_unicast_key()
6544 ret = ath10k_wmi_vdev_set_param(arvif->ar, in ath10k_set_default_unicast_key()
6546 arvif->ar->wmi.vdev_param->def_keyid, in ath10k_set_default_unicast_key()
6550 ath10k_warn(ar, "failed to update wep key index for vdev %d: %d\n", in ath10k_set_default_unicast_key()
6559 mutex_unlock(&arvif->ar->conf_mutex); in ath10k_set_default_unicast_key()
6564 struct ath10k *ar; in ath10k_sta_rc_update_wk() local
6578 ar = arvif->ar; in ath10k_sta_rc_update_wk()
6587 spin_lock_bh(&ar->data_lock); in ath10k_sta_rc_update_wk()
6596 spin_unlock_bh(&ar->data_lock); in ath10k_sta_rc_update_wk()
6598 mutex_lock(&ar->conf_mutex); in ath10k_sta_rc_update_wk()
6608 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM peer bw %d phymode %d\n", in ath10k_sta_rc_update_wk()
6611 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr, in ath10k_sta_rc_update_wk()
6612 ar->wmi.peer_param->phymode, mode); in ath10k_sta_rc_update_wk()
6614 ath10k_warn(ar, "failed to update STA %pM peer phymode %d: %d\n", in ath10k_sta_rc_update_wk()
6619 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr, in ath10k_sta_rc_update_wk()
6620 ar->wmi.peer_param->chan_width, bw); in ath10k_sta_rc_update_wk()
6622 ath10k_warn(ar, "failed to update STA %pM peer bw %d: %d\n", in ath10k_sta_rc_update_wk()
6627 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM nss %d\n", in ath10k_sta_rc_update_wk()
6630 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr, in ath10k_sta_rc_update_wk()
6631 ar->wmi.peer_param->nss, nss); in ath10k_sta_rc_update_wk()
6633 ath10k_warn(ar, "failed to update STA %pM nss %d: %d\n", in ath10k_sta_rc_update_wk()
6638 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM smps %d\n", in ath10k_sta_rc_update_wk()
6641 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr, in ath10k_sta_rc_update_wk()
6642 ar->wmi.peer_param->smps_state, smps); in ath10k_sta_rc_update_wk()
6644 ath10k_warn(ar, "failed to update STA %pM smps %d: %d\n", in ath10k_sta_rc_update_wk()
6649 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM supp rates\n", in ath10k_sta_rc_update_wk()
6652 err = ath10k_station_assoc(ar, arvif->vif, sta, true); in ath10k_sta_rc_update_wk()
6654 ath10k_warn(ar, "failed to reassociate station: %pM\n", in ath10k_sta_rc_update_wk()
6659 mutex_unlock(&ar->conf_mutex); in ath10k_sta_rc_update_wk()
6665 struct ath10k *ar = arvif->ar; in ath10k_mac_inc_num_stations() local
6667 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_inc_num_stations()
6672 if (ar->num_stations >= ar->max_num_stations) in ath10k_mac_inc_num_stations()
6675 ar->num_stations++; in ath10k_mac_inc_num_stations()
6683 struct ath10k *ar = arvif->ar; in ath10k_mac_dec_num_stations() local
6685 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_dec_num_stations()
6690 ar->num_stations--; in ath10k_mac_dec_num_stations()
6697 struct ath10k *ar = hw->priv; in ath10k_sta_set_txpwr() local
6713 mutex_lock(&ar->conf_mutex); in ath10k_sta_set_txpwr()
6715 ret = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr, in ath10k_sta_set_txpwr()
6716 ar->wmi.peer_param->use_fixed_power, txpwr); in ath10k_sta_set_txpwr()
6718 ath10k_warn(ar, "failed to set tx power for station ret: %d\n", in ath10k_sta_set_txpwr()
6724 mutex_unlock(&ar->conf_mutex); in ath10k_sta_set_txpwr()
6730 struct ath10k *ar; member
6735 ath10k_mac_bitrate_mask_has_single_rate(struct ath10k *ar, in ath10k_mac_bitrate_mask_has_single_rate() argument
6759 ath10k_mac_bitrate_mask_get_single_rate(struct ath10k *ar, in ath10k_mac_bitrate_mask_get_single_rate() argument
6776 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) in ath10k_mac_bitrate_mask_get_single_rate()
6821 static int ath10k_mac_validate_rate_mask(struct ath10k *ar, in ath10k_mac_validate_rate_mask() argument
6826 ath10k_warn(ar, "Invalid nss field, configured %u limit %u\n", in ath10k_mac_validate_rate_mask()
6833 ath10k_warn(ar, "Invalid VHT rate for sta %pM\n", in ath10k_mac_validate_rate_mask()
6839 ath10k_warn(ar, "Invalid HT rate for sta %pM\n", in ath10k_mac_validate_rate_mask()
6852 ath10k_mac_tid_bitrate_config(struct ath10k *ar, in ath10k_mac_tid_bitrate_config() argument
6875 if (!ath10k_mac_bitrate_mask_has_single_rate(ar, band, mask, in ath10k_mac_tid_bitrate_config()
6880 ret = ath10k_mac_bitrate_mask_get_single_rate(ar, band, mask, in ath10k_mac_tid_bitrate_config()
6883 ath10k_warn(ar, "failed to get single rate: %d\n", in ath10k_mac_tid_bitrate_config()
6890 if (sta && ath10k_mac_validate_rate_mask(ar, sta, *rate_ctrl_flag, nss)) in ath10k_mac_tid_bitrate_config()
6897 ar->wmi.svc_map))) in ath10k_mac_tid_bitrate_config()
6905 static int ath10k_mac_set_tid_config(struct ath10k *ar, struct ieee80211_sta *sta, in ath10k_mac_set_tid_config() argument
6952 ret = ath10k_wmi_set_per_peer_per_tid_cfg(ar, arg); in ath10k_mac_set_tid_config()
7039 ath10k_mac_parse_tid_config(struct ath10k *ar, in ath10k_mac_parse_tid_config() argument
7088 ret = ath10k_mac_tid_bitrate_config(ar, vif, sta, in ath10k_mac_parse_tid_config()
7094 ath10k_warn(ar, "failed to configure bitrate mask %d\n", in ath10k_mac_parse_tid_config()
7108 ret = ath10k_mac_set_tid_config(ar, sta, vif, changed, arg); in ath10k_mac_parse_tid_config()
7117 static int ath10k_mac_reset_tid_config(struct ath10k *ar, in ath10k_mac_reset_tid_config() argument
7143 ret = ath10k_wmi_set_per_peer_per_tid_cfg(ar, &arg); in ath10k_mac_reset_tid_config()
7175 struct ath10k *ar; in ath10k_sta_tid_cfg_wk() local
7184 ar = arvif->ar; in ath10k_sta_tid_cfg_wk()
7186 mutex_lock(&ar->conf_mutex); in ath10k_sta_tid_cfg_wk()
7189 ret = ath10k_mac_reset_tid_config(ar, sta, arvif, in ath10k_sta_tid_cfg_wk()
7236 ret = ath10k_mac_validate_rate_mask(ar, sta, in ath10k_sta_tid_cfg_wk()
7273 ret = ath10k_wmi_set_per_peer_per_tid_cfg(ar, &arg); in ath10k_sta_tid_cfg_wk()
7275 ath10k_warn(ar, "failed to set per tid config for sta %pM: %d\n", in ath10k_sta_tid_cfg_wk()
7287 mutex_unlock(&ar->conf_mutex); in ath10k_sta_tid_cfg_wk()
7300 ieee80211_queue_work(iter_data->ar->hw, &arsta->tid_config_wk); in ath10k_mac_vif_stations_tid_conf()
7309 struct ath10k *ar = hw->priv; in ath10k_sta_state() local
7335 mutex_lock(&ar->conf_mutex); in ath10k_sta_state()
7345 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_sta_state()
7348 ar->num_stations + 1, ar->max_num_stations, in ath10k_sta_state()
7349 ar->num_peers + 1, ar->max_num_peers); in ath10k_sta_state()
7354 if (num_tdls_stations >= ar->max_num_tdls_vdevs) { in ath10k_sta_state()
7355 ath10k_warn(ar, "vdev %i exceeded maximum number of tdls vdevs %i\n", in ath10k_sta_state()
7357 ar->max_num_tdls_vdevs); in ath10k_sta_state()
7366 ath10k_warn(ar, "refusing to associate station: too many connected already (%d)\n", in ath10k_sta_state()
7367 ar->max_num_stations); in ath10k_sta_state()
7371 if (ath10k_debug_is_extd_tx_stats_enabled(ar)) { in ath10k_sta_state()
7381 ret = ath10k_peer_create(ar, vif, sta, arvif->vdev_id, in ath10k_sta_state()
7384 ath10k_warn(ar, "failed to add peer %pM for vdev %d when adding a new sta: %i\n", in ath10k_sta_state()
7391 spin_lock_bh(&ar->data_lock); in ath10k_sta_state()
7393 peer = ath10k_peer_find(ar, arvif->vdev_id, sta->addr); in ath10k_sta_state()
7395 ath10k_warn(ar, "failed to lookup peer %pM on vdev %i\n", in ath10k_sta_state()
7397 spin_unlock_bh(&ar->data_lock); in ath10k_sta_state()
7398 ath10k_peer_delete(ar, arvif->vdev_id, sta->addr); in ath10k_sta_state()
7408 spin_unlock_bh(&ar->data_lock); in ath10k_sta_state()
7413 ret = ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id, in ath10k_sta_state()
7416 ath10k_warn(ar, "failed to update fw tdls state on vdev %i: %i\n", in ath10k_sta_state()
7418 ath10k_peer_delete(ar, arvif->vdev_id, in ath10k_sta_state()
7425 ret = ath10k_mac_tdls_peer_update(ar, arvif->vdev_id, sta, in ath10k_sta_state()
7428 ath10k_warn(ar, in ath10k_sta_state()
7431 ath10k_peer_delete(ar, arvif->vdev_id, sta->addr); in ath10k_sta_state()
7437 ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id, in ath10k_sta_state()
7445 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_sta_state()
7450 ret = ath10k_mac_tdls_peer_update(ar, arvif->vdev_id, in ath10k_sta_state()
7454 ath10k_warn(ar, "failed to update tdls peer state for %pM state %d: %i\n", in ath10k_sta_state()
7459 ret = ath10k_peer_delete(ar, arvif->vdev_id, sta->addr); in ath10k_sta_state()
7461 ath10k_warn(ar, "failed to delete peer %pM for vdev %d: %i\n", in ath10k_sta_state()
7466 spin_lock_bh(&ar->data_lock); in ath10k_sta_state()
7467 for (i = 0; i < ARRAY_SIZE(ar->peer_map); i++) { in ath10k_sta_state()
7468 peer = ar->peer_map[i]; in ath10k_sta_state()
7473 …ath10k_warn(ar, "found sta peer %pM (ptr %pK id %d) entry on vdev %i after it was supposedly remov… in ath10k_sta_state()
7480 ath10k_peer_map_cleanup(ar, peer); in ath10k_sta_state()
7483 spin_unlock_bh(&ar->data_lock); in ath10k_sta_state()
7485 if (ath10k_debug_is_extd_tx_stats_enabled(ar)) { in ath10k_sta_state()
7491 ath10k_mac_txq_unref(ar, sta->txq[i]); in ath10k_sta_state()
7500 ret = ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id, in ath10k_sta_state()
7503 ath10k_warn(ar, "failed to update fw tdls state on vdev %i: %i\n", in ath10k_sta_state()
7514 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac sta %pM associated\n", in ath10k_sta_state()
7517 ret = ath10k_station_assoc(ar, vif, sta, false); in ath10k_sta_state()
7519 ath10k_warn(ar, "failed to associate station %pM for vdev %i: %i\n", in ath10k_sta_state()
7527 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac tdls sta %pM authorized\n", in ath10k_sta_state()
7530 ret = ath10k_station_assoc(ar, vif, sta, false); in ath10k_sta_state()
7532 ath10k_warn(ar, "failed to associate tdls station %pM for vdev %i: %i\n", in ath10k_sta_state()
7537 ret = ath10k_mac_tdls_peer_update(ar, arvif->vdev_id, sta, in ath10k_sta_state()
7540 ath10k_warn(ar, "failed to update tdls peer %pM for vdev %i: %i\n", in ath10k_sta_state()
7550 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac sta %pM disassociated\n", in ath10k_sta_state()
7553 ret = ath10k_station_disassoc(ar, vif, sta); in ath10k_sta_state()
7555 ath10k_warn(ar, "failed to disassociate station: %pM vdev %i: %i\n", in ath10k_sta_state()
7559 mutex_unlock(&ar->conf_mutex); in ath10k_sta_state()
7563 static int ath10k_conf_tx_uapsd(struct ath10k *ar, struct ieee80211_vif *vif, in ath10k_conf_tx_uapsd() argument
7572 lockdep_assert_held(&ar->conf_mutex); in ath10k_conf_tx_uapsd()
7609 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath10k_conf_tx_uapsd()
7613 ath10k_warn(ar, "failed to set uapsd params: %d\n", ret); in ath10k_conf_tx_uapsd()
7622 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath10k_conf_tx_uapsd()
7626 ath10k_warn(ar, "failed to set rx wake param: %d\n", ret); in ath10k_conf_tx_uapsd()
7630 ath10k_warn(ar, "failed to recalc ps wake threshold on vdev %i: %d\n", in ath10k_conf_tx_uapsd()
7637 ath10k_warn(ar, "failed to recalc ps poll count on vdev %i: %d\n", in ath10k_conf_tx_uapsd()
7642 if (test_bit(WMI_SERVICE_STA_UAPSD_BASIC_AUTO_TRIG, ar->wmi.svc_map) || in ath10k_conf_tx_uapsd()
7643 test_bit(WMI_SERVICE_STA_UAPSD_VAR_AUTO_TRIG, ar->wmi.svc_map)) { in ath10k_conf_tx_uapsd()
7656 ret = ath10k_wmi_vdev_sta_uapsd(ar, arvif->vdev_id, in ath10k_conf_tx_uapsd()
7659 ath10k_warn(ar, "failed to set uapsd auto trigger %d\n", in ath10k_conf_tx_uapsd()
7673 struct ath10k *ar = hw->priv; in ath10k_conf_tx() local
7678 mutex_lock(&ar->conf_mutex); in ath10k_conf_tx()
7711 if (ar->wmi.ops->gen_vdev_wmm_conf) { in ath10k_conf_tx()
7712 ret = ath10k_wmi_vdev_wmm_conf(ar, arvif->vdev_id, in ath10k_conf_tx()
7715 ath10k_warn(ar, "failed to set vdev wmm params on vdev %i: %d\n", in ath10k_conf_tx()
7723 ret = ath10k_wmi_pdev_set_wmm_params(ar, &arvif->wmm_params); in ath10k_conf_tx()
7725 ath10k_warn(ar, "failed to set wmm params: %d\n", ret); in ath10k_conf_tx()
7730 ret = ath10k_conf_tx_uapsd(ar, vif, ac, params->uapsd); in ath10k_conf_tx()
7732 ath10k_warn(ar, "failed to set sta uapsd: %d\n", ret); in ath10k_conf_tx()
7735 mutex_unlock(&ar->conf_mutex); in ath10k_conf_tx()
7745 struct ath10k *ar = hw->priv; in ath10k_remain_on_channel() local
7751 mutex_lock(&ar->conf_mutex); in ath10k_remain_on_channel()
7758 spin_lock_bh(&ar->data_lock); in ath10k_remain_on_channel()
7759 switch (ar->scan.state) { in ath10k_remain_on_channel()
7761 reinit_completion(&ar->scan.started); in ath10k_remain_on_channel()
7762 reinit_completion(&ar->scan.completed); in ath10k_remain_on_channel()
7763 reinit_completion(&ar->scan.on_channel); in ath10k_remain_on_channel()
7764 ar->scan.state = ATH10K_SCAN_STARTING; in ath10k_remain_on_channel()
7765 ar->scan.is_roc = true; in ath10k_remain_on_channel()
7766 ar->scan.vdev_id = arvif->vdev_id; in ath10k_remain_on_channel()
7767 ar->scan.roc_freq = chan->center_freq; in ath10k_remain_on_channel()
7768 ar->scan.roc_notify = true; in ath10k_remain_on_channel()
7777 spin_unlock_bh(&ar->data_lock); in ath10k_remain_on_channel()
7782 scan_time_msec = ar->hw->wiphy->max_remain_on_channel_duration * 2; in ath10k_remain_on_channel()
7785 ath10k_wmi_start_scan_init(ar, &arg); in ath10k_remain_on_channel()
7797 ret = ath10k_start_scan(ar, &arg); in ath10k_remain_on_channel()
7799 ath10k_warn(ar, "failed to start roc scan: %d\n", ret); in ath10k_remain_on_channel()
7800 spin_lock_bh(&ar->data_lock); in ath10k_remain_on_channel()
7801 ar->scan.state = ATH10K_SCAN_IDLE; in ath10k_remain_on_channel()
7802 spin_unlock_bh(&ar->data_lock); in ath10k_remain_on_channel()
7806 ret = wait_for_completion_timeout(&ar->scan.on_channel, 3 * HZ); in ath10k_remain_on_channel()
7808 ath10k_warn(ar, "failed to switch to channel for roc scan\n"); in ath10k_remain_on_channel()
7810 ret = ath10k_scan_stop(ar); in ath10k_remain_on_channel()
7812 ath10k_warn(ar, "failed to stop scan: %d\n", ret); in ath10k_remain_on_channel()
7818 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout, in ath10k_remain_on_channel()
7823 mutex_unlock(&ar->conf_mutex); in ath10k_remain_on_channel()
7830 struct ath10k *ar = hw->priv; in ath10k_cancel_remain_on_channel() local
7832 mutex_lock(&ar->conf_mutex); in ath10k_cancel_remain_on_channel()
7834 spin_lock_bh(&ar->data_lock); in ath10k_cancel_remain_on_channel()
7835 ar->scan.roc_notify = false; in ath10k_cancel_remain_on_channel()
7836 spin_unlock_bh(&ar->data_lock); in ath10k_cancel_remain_on_channel()
7838 ath10k_scan_abort(ar); in ath10k_cancel_remain_on_channel()
7840 mutex_unlock(&ar->conf_mutex); in ath10k_cancel_remain_on_channel()
7842 cancel_delayed_work_sync(&ar->scan.timeout); in ath10k_cancel_remain_on_channel()
7854 struct ath10k *ar = hw->priv; in ath10k_set_rts_threshold() local
7858 mutex_lock(&ar->conf_mutex); in ath10k_set_rts_threshold()
7859 list_for_each_entry(arvif, &ar->arvifs, list) { in ath10k_set_rts_threshold()
7860 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d rts threshold %d\n", in ath10k_set_rts_threshold()
7865 ath10k_warn(ar, "failed to set rts threshold for vdev %d: %d\n", in ath10k_set_rts_threshold()
7870 mutex_unlock(&ar->conf_mutex); in ath10k_set_rts_threshold()
7890 void ath10k_mac_wait_tx_complete(struct ath10k *ar) in ath10k_mac_wait_tx_complete() argument
7899 if (ar->state == ATH10K_STATE_WEDGED) in ath10k_mac_wait_tx_complete()
7902 time_left = wait_event_timeout(ar->htt.empty_tx_wq, ({ in ath10k_mac_wait_tx_complete()
7905 spin_lock_bh(&ar->htt.tx_lock); in ath10k_mac_wait_tx_complete()
7906 empty = (ar->htt.num_pending_tx == 0); in ath10k_mac_wait_tx_complete()
7907 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_wait_tx_complete()
7909 skip = (ar->state == ATH10K_STATE_WEDGED) || in ath10k_mac_wait_tx_complete()
7911 &ar->dev_flags); in ath10k_mac_wait_tx_complete()
7917 ath10k_warn(ar, "failed to flush transmit queue (skip %i ar-state %i): %ld\n", in ath10k_mac_wait_tx_complete()
7918 skip, ar->state, time_left); in ath10k_mac_wait_tx_complete()
7924 struct ath10k *ar = hw->priv; in ath10k_flush() local
7931 list_for_each_entry(arvif, &ar->arvifs, list) { in ath10k_flush()
7933 ath10k_wmi_peer_flush(ar, arvif->vdev_id, in ath10k_flush()
7936 ath10k_htt_flush_tx(&ar->htt); in ath10k_flush()
7941 mutex_lock(&ar->conf_mutex); in ath10k_flush()
7942 ath10k_mac_wait_tx_complete(ar); in ath10k_flush()
7943 mutex_unlock(&ar->conf_mutex); in ath10k_flush()
7958 struct ath10k *ar = hw->priv; in ath10k_reconfig_complete() local
7963 mutex_lock(&ar->conf_mutex); in ath10k_reconfig_complete()
7968 if (ar->state == ATH10K_STATE_RESTARTED) { in ath10k_reconfig_complete()
7969 ath10k_info(ar, "device successfully recovered\n"); in ath10k_reconfig_complete()
7970 ar->state = ATH10K_STATE_ON; in ath10k_reconfig_complete()
7971 ieee80211_wake_queues(ar->hw); in ath10k_reconfig_complete()
7974 mutex_unlock(&ar->conf_mutex); in ath10k_reconfig_complete()
7978 ath10k_mac_update_bss_chan_survey(struct ath10k *ar, in ath10k_mac_update_bss_chan_survey() argument
7984 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_update_bss_chan_survey()
7986 if (!test_bit(WMI_SERVICE_BSS_CHANNEL_INFO_64, ar->wmi.svc_map) || in ath10k_mac_update_bss_chan_survey()
7987 (ar->rx_channel != channel)) in ath10k_mac_update_bss_chan_survey()
7990 if (ar->scan.state != ATH10K_SCAN_IDLE) { in ath10k_mac_update_bss_chan_survey()
7991 ath10k_dbg(ar, ATH10K_DBG_MAC, "ignoring bss chan info request while scanning..\n"); in ath10k_mac_update_bss_chan_survey()
7995 reinit_completion(&ar->bss_survey_done); in ath10k_mac_update_bss_chan_survey()
7997 ret = ath10k_wmi_pdev_bss_chan_info_request(ar, type); in ath10k_mac_update_bss_chan_survey()
7999 ath10k_warn(ar, "failed to send pdev bss chan info request\n"); in ath10k_mac_update_bss_chan_survey()
8003 ret = wait_for_completion_timeout(&ar->bss_survey_done, 3 * HZ); in ath10k_mac_update_bss_chan_survey()
8005 ath10k_warn(ar, "bss channel survey timed out\n"); in ath10k_mac_update_bss_chan_survey()
8013 struct ath10k *ar = hw->priv; in ath10k_get_survey() local
8015 struct survey_info *ar_survey = &ar->survey[idx]; in ath10k_get_survey()
8018 mutex_lock(&ar->conf_mutex); in ath10k_get_survey()
8034 ath10k_mac_update_bss_chan_survey(ar, &sband->channels[idx]); in ath10k_get_survey()
8036 spin_lock_bh(&ar->data_lock); in ath10k_get_survey()
8038 spin_unlock_bh(&ar->data_lock); in ath10k_get_survey()
8042 if (ar->rx_channel == survey->channel) in ath10k_get_survey()
8046 mutex_unlock(&ar->conf_mutex); in ath10k_get_survey()
8051 ath10k_mac_bitrate_mask_get_single_nss(struct ath10k *ar, in ath10k_mac_bitrate_mask_get_single_nss() argument
8056 struct ieee80211_supported_band *sband = &ar->mac.sbands[band]; in ath10k_mac_bitrate_mask_get_single_nss()
8102 struct ath10k *ar = arvif->ar; in ath10k_mac_set_fixed_rate_params() local
8106 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_set_fixed_rate_params()
8108 …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()
8111 vdev_param = ar->wmi.vdev_param->fixed_rate; in ath10k_mac_set_fixed_rate_params()
8112 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, rate); in ath10k_mac_set_fixed_rate_params()
8114 ath10k_warn(ar, "failed to set fixed rate param 0x%02x: %d\n", in ath10k_mac_set_fixed_rate_params()
8119 vdev_param = ar->wmi.vdev_param->nss; in ath10k_mac_set_fixed_rate_params()
8120 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, nss); in ath10k_mac_set_fixed_rate_params()
8122 ath10k_warn(ar, "failed to set nss param %d: %d\n", nss, ret); in ath10k_mac_set_fixed_rate_params()
8126 vdev_param = ar->wmi.vdev_param->sgi; in ath10k_mac_set_fixed_rate_params()
8127 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, sgi); in ath10k_mac_set_fixed_rate_params()
8129 ath10k_warn(ar, "failed to set sgi param %d: %d\n", sgi, ret); in ath10k_mac_set_fixed_rate_params()
8133 vdev_param = ar->wmi.vdev_param->ldpc; in ath10k_mac_set_fixed_rate_params()
8134 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, ldpc); in ath10k_mac_set_fixed_rate_params()
8136 ath10k_warn(ar, "failed to set ldpc param %d: %d\n", ldpc, ret); in ath10k_mac_set_fixed_rate_params()
8144 ath10k_mac_can_set_bitrate_mask(struct ath10k *ar, in ath10k_mac_can_set_bitrate_mask() argument
8167 ath10k_warn(ar, "refusing bitrate mask with missing 0-7 VHT MCS rates\n"); in ath10k_mac_can_set_bitrate_mask()
8175 static bool ath10k_mac_set_vht_bitrate_mask_fixup(struct ath10k *ar, in ath10k_mac_set_vht_bitrate_mask_fixup() argument
8186 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr, in ath10k_mac_set_vht_bitrate_mask_fixup()
8189 ath10k_warn(ar, "failed to enable STA %pM peer fixed rate: %d\n", in ath10k_mac_set_vht_bitrate_mask_fixup()
8200 struct ath10k *ar = arvif->ar; in ath10k_mac_set_bitrate_mask_iter() local
8205 if (ath10k_mac_set_vht_bitrate_mask_fixup(ar, arvif, sta)) in ath10k_mac_set_bitrate_mask_iter()
8208 spin_lock_bh(&ar->data_lock); in ath10k_mac_set_bitrate_mask_iter()
8210 spin_unlock_bh(&ar->data_lock); in ath10k_mac_set_bitrate_mask_iter()
8212 ieee80211_queue_work(ar->hw, &arsta->update_wk); in ath10k_mac_set_bitrate_mask_iter()
8220 struct ath10k *ar = arvif->ar; in ath10k_mac_clr_bitrate_mask_iter() local
8227 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr, in ath10k_mac_clr_bitrate_mask_iter()
8231 ath10k_warn(ar, "failed to clear STA %pM peer fixed rate: %d\n", in ath10k_mac_clr_bitrate_mask_iter()
8241 struct ath10k *ar = arvif->ar; in ath10k_mac_op_set_bitrate_mask() local
8261 ldpc = !!(ar->ht_cap_info & WMI_HT_CAP_LDPC); in ath10k_mac_op_set_bitrate_mask()
8268 ar->normal_mode_fw.fw_file.fw_features); in ath10k_mac_op_set_bitrate_mask()
8270 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_set_bitrate_mask()
8271 ieee80211_iterate_stations_atomic(ar->hw, in ath10k_mac_op_set_bitrate_mask()
8274 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_set_bitrate_mask()
8277 if (ath10k_mac_bitrate_mask_has_single_rate(ar, band, mask, in ath10k_mac_op_set_bitrate_mask()
8279 ret = ath10k_mac_bitrate_mask_get_single_rate(ar, band, mask, in ath10k_mac_op_set_bitrate_mask()
8283 ath10k_warn(ar, "failed to get single rate for vdev %i: %d\n", in ath10k_mac_op_set_bitrate_mask()
8287 } else if (ath10k_mac_bitrate_mask_get_single_nss(ar, band, mask, in ath10k_mac_op_set_bitrate_mask()
8293 nss = min(ar->num_rf_chains, in ath10k_mac_op_set_bitrate_mask()
8297 if (!ath10k_mac_can_set_bitrate_mask(ar, band, mask, in ath10k_mac_op_set_bitrate_mask()
8308 ath10k_mac_bitrate_mask_get_single_rate(ar, band, mask, in ath10k_mac_op_set_bitrate_mask()
8317 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_set_bitrate_mask()
8323 ieee80211_iterate_stations_atomic(ar->hw, in ath10k_mac_op_set_bitrate_mask()
8327 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_set_bitrate_mask()
8330 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_set_bitrate_mask()
8334 ath10k_warn(ar, "failed to set fixed rate params on vdev %i: %d\n", in ath10k_mac_op_set_bitrate_mask()
8340 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_set_bitrate_mask()
8350 struct ath10k *ar = hw->priv; in ath10k_sta_rc_update() local
8356 spin_lock_bh(&ar->data_lock); in ath10k_sta_rc_update()
8358 peer = ath10k_peer_find(ar, arvif->vdev_id, sta->addr); in ath10k_sta_rc_update()
8360 spin_unlock_bh(&ar->data_lock); in ath10k_sta_rc_update()
8361 ath10k_warn(ar, "mac sta rc update failed to find peer %pM on vdev %i\n", in ath10k_sta_rc_update()
8366 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_sta_rc_update()
8388 ath10k_warn(ar, "Invalid bandwidth %d in rc update for %pM\n", in ath10k_sta_rc_update()
8415 ath10k_warn(ar, "Invalid smps %d in sta rc update for %pM\n", in ath10k_sta_rc_update()
8426 spin_unlock_bh(&ar->data_lock); in ath10k_sta_rc_update()
8434 struct ath10k *ar = hw->priv; in ath10k_offset_tsf() local
8440 vdev_param = ar->wmi.vdev_param->dec_tsf; in ath10k_offset_tsf()
8443 vdev_param = ar->wmi.vdev_param->inc_tsf; in ath10k_offset_tsf()
8447 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, in ath10k_offset_tsf()
8451 ath10k_warn(ar, "failed to set tsf offset %d cmd %d: %d\n", in ath10k_offset_tsf()
8459 struct ath10k *ar = hw->priv; in ath10k_ampdu_action() local
8465 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac ampdu vdev_id %i sta %pM tid %hu action %d\n", in ath10k_ampdu_action()
8490 ath10k_mac_update_rx_channel(struct ath10k *ar, in ath10k_mac_update_rx_channel() argument
8500 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_update_rx_channel()
8501 lockdep_assert_held(&ar->data_lock); in ath10k_mac_update_rx_channel()
8517 if (!ctx && ath10k_mac_num_chanctxs(ar) == 1) { in ath10k_mac_update_rx_channel()
8518 ieee80211_iter_chan_contexts_atomic(ar->hw, in ath10k_mac_update_rx_channel()
8525 ar->rx_channel = def->chan; in ath10k_mac_update_rx_channel()
8526 } else if ((ctx && ath10k_mac_num_chanctxs(ar) == 0) || in ath10k_mac_update_rx_channel()
8527 (ctx && (ar->state == ATH10K_STATE_RESTARTED))) { in ath10k_mac_update_rx_channel()
8533 ar->rx_channel = ctx->def.chan; in ath10k_mac_update_rx_channel()
8535 ar->rx_channel = NULL; in ath10k_mac_update_rx_channel()
8541 ath10k_mac_update_vif_chan(struct ath10k *ar, in ath10k_mac_update_vif_chan() argument
8549 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_update_vif_chan()
8554 if (ar->monitor_started) in ath10k_mac_update_vif_chan()
8555 ath10k_monitor_stop(ar); in ath10k_mac_update_vif_chan()
8560 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_mac_update_vif_chan()
8574 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id); in ath10k_mac_update_vif_chan()
8576 ath10k_warn(ar, "failed to down vdev %d: %d\n", in ath10k_mac_update_vif_chan()
8586 spin_lock_bh(&ar->data_lock); in ath10k_mac_update_vif_chan()
8587 ath10k_mac_update_rx_channel(ar, NULL, vifs, n_vifs); in ath10k_mac_update_vif_chan()
8588 spin_unlock_bh(&ar->data_lock); in ath10k_mac_update_vif_chan()
8601 ath10k_warn(ar, "failed to update bcn tmpl during csa: %d\n", in ath10k_mac_update_vif_chan()
8606 ath10k_warn(ar, "failed to update prb tmpl during csa: %d\n", in ath10k_mac_update_vif_chan()
8611 ath10k_warn(ar, "failed to restart vdev %d: %d\n", in ath10k_mac_update_vif_chan()
8616 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid, in ath10k_mac_update_vif_chan()
8619 ath10k_warn(ar, "failed to bring vdev up %d: %d\n", in ath10k_mac_update_vif_chan()
8625 ath10k_monitor_recalc(ar); in ath10k_mac_update_vif_chan()
8632 struct ath10k *ar = hw->priv; in ath10k_mac_op_add_chanctx() local
8634 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_mac_op_add_chanctx()
8638 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_add_chanctx()
8640 spin_lock_bh(&ar->data_lock); in ath10k_mac_op_add_chanctx()
8641 ath10k_mac_update_rx_channel(ar, ctx, NULL, 0); in ath10k_mac_op_add_chanctx()
8642 spin_unlock_bh(&ar->data_lock); in ath10k_mac_op_add_chanctx()
8644 ath10k_recalc_radar_detection(ar); in ath10k_mac_op_add_chanctx()
8645 ath10k_monitor_recalc(ar); in ath10k_mac_op_add_chanctx()
8647 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_add_chanctx()
8656 struct ath10k *ar = hw->priv; in ath10k_mac_op_remove_chanctx() local
8658 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_mac_op_remove_chanctx()
8662 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_remove_chanctx()
8664 spin_lock_bh(&ar->data_lock); in ath10k_mac_op_remove_chanctx()
8665 ath10k_mac_update_rx_channel(ar, NULL, NULL, 0); in ath10k_mac_op_remove_chanctx()
8666 spin_unlock_bh(&ar->data_lock); in ath10k_mac_op_remove_chanctx()
8668 ath10k_recalc_radar_detection(ar); in ath10k_mac_op_remove_chanctx()
8669 ath10k_monitor_recalc(ar); in ath10k_mac_op_remove_chanctx()
8671 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_remove_chanctx()
8718 struct ath10k *ar = hw->priv; in ath10k_mac_op_change_chanctx() local
8721 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_change_chanctx()
8723 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_mac_op_change_chanctx()
8752 ath10k_mac_update_vif_chan(ar, arg.vifs, arg.n_vifs); in ath10k_mac_op_change_chanctx()
8757 ath10k_recalc_radar_detection(ar); in ath10k_mac_op_change_chanctx()
8767 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_change_chanctx()
8775 struct ath10k *ar = hw->priv; in ath10k_mac_op_assign_vif_chanctx() local
8779 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_assign_vif_chanctx()
8781 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_mac_op_assign_vif_chanctx()
8786 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_assign_vif_chanctx()
8792 ath10k_warn(ar, "failed to start vdev %i addr %pM on freq %d: %d\n", in ath10k_mac_op_assign_vif_chanctx()
8802 ath10k_warn(ar, "failed to update vdev %i ps: %d\n", in ath10k_mac_op_assign_vif_chanctx()
8808 ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, 0, vif->addr); in ath10k_mac_op_assign_vif_chanctx()
8810 ath10k_warn(ar, "failed to up monitor vdev %i: %d\n", in ath10k_mac_op_assign_vif_chanctx()
8821 ath10k_warn(ar, "failed to set cts protection for vdev %d: %d\n", in ath10k_mac_op_assign_vif_chanctx()
8825 if (ath10k_peer_stats_enabled(ar) && in ath10k_mac_op_assign_vif_chanctx()
8826 ar->hw_params.tx_stats_over_pktlog) { in ath10k_mac_op_assign_vif_chanctx()
8827 ar->pktlog_filter |= ATH10K_PKTLOG_PEER_STATS; in ath10k_mac_op_assign_vif_chanctx()
8828 ret = ath10k_wmi_pdev_pktlog_enable(ar, in ath10k_mac_op_assign_vif_chanctx()
8829 ar->pktlog_filter); in ath10k_mac_op_assign_vif_chanctx()
8831 ath10k_warn(ar, "failed to enable pktlog %d\n", ret); in ath10k_mac_op_assign_vif_chanctx()
8836 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_assign_vif_chanctx()
8845 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_assign_vif_chanctx()
8854 struct ath10k *ar = hw->priv; in ath10k_mac_op_unassign_vif_chanctx() local
8858 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_unassign_vif_chanctx()
8860 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_mac_op_unassign_vif_chanctx()
8869 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id); in ath10k_mac_op_unassign_vif_chanctx()
8871 ath10k_warn(ar, "failed to down monitor vdev %i: %d\n", in ath10k_mac_op_unassign_vif_chanctx()
8879 ath10k_warn(ar, "failed to stop vdev %i: %d\n", in ath10k_mac_op_unassign_vif_chanctx()
8884 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_unassign_vif_chanctx()
8893 struct ath10k *ar = hw->priv; in ath10k_mac_op_switch_vif_chanctx() local
8895 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_switch_vif_chanctx()
8897 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_mac_op_switch_vif_chanctx()
8900 ath10k_mac_update_vif_chan(ar, vifs, n_vifs); in ath10k_mac_op_switch_vif_chanctx()
8902 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_switch_vif_chanctx()
8910 struct ath10k *ar; in ath10k_mac_op_sta_pre_rcu_remove() local
8913 ar = hw->priv; in ath10k_mac_op_sta_pre_rcu_remove()
8915 list_for_each_entry(peer, &ar->peers, list) in ath10k_mac_op_sta_pre_rcu_remove()
8976 static void ath10k_mac_get_rate_flags_ht(struct ath10k *ar, u32 rate, u8 nss, u8 mcs, in ath10k_mac_get_rate_flags_ht() argument
8985 ath10k_warn(ar, "not supported mcs %d in current rate table", mcs); in ath10k_mac_get_rate_flags_ht()
9009 ath10k_warn(ar, "invalid ht params rate %d 100kbps nss %d mcs %d", in ath10k_mac_get_rate_flags_ht()
9014 static void ath10k_mac_get_rate_flags_vht(struct ath10k *ar, u32 rate, u8 nss, u8 mcs, in ath10k_mac_get_rate_flags_vht() argument
9039 ath10k_warn(ar, "invalid vht params rate %d 100kbps nss %d mcs %d", in ath10k_mac_get_rate_flags_vht()
9044 static void ath10k_mac_get_rate_flags(struct ath10k *ar, u32 rate, in ath10k_mac_get_rate_flags() argument
9050 ath10k_mac_get_rate_flags_ht(ar, rate, nss, mcs, flags, bw); in ath10k_mac_get_rate_flags()
9053 ath10k_mac_get_rate_flags_vht(ar, rate, nss, mcs, flags, bw); in ath10k_mac_get_rate_flags()
9057 static void ath10k_mac_parse_bitrate(struct ath10k *ar, u32 rate_code, in ath10k_mac_parse_bitrate() argument
9066 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac parse rate code 0x%x bitrate %d kbps\n", in ath10k_mac_parse_bitrate()
9074 ath10k_mac_get_rate_flags(ar, bitrate_kbps / 100, mode, nss, mcs, &flags, &bw); in ath10k_mac_parse_bitrate()
9076 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_mac_parse_bitrate()
9087 static void ath10k_mac_sta_get_peer_stats_info(struct ath10k *ar, in ath10k_mac_sta_get_peer_stats_info() argument
9096 if (!(ar->hw_params.supports_peer_stats_info && in ath10k_mac_sta_get_peer_stats_info()
9100 spin_lock_bh(&ar->data_lock); in ath10k_mac_sta_get_peer_stats_info()
9101 peer = ath10k_peer_find(ar, arsta->arvif->vdev_id, sta->addr); in ath10k_mac_sta_get_peer_stats_info()
9102 spin_unlock_bh(&ar->data_lock); in ath10k_mac_sta_get_peer_stats_info()
9106 reinit_completion(&ar->peer_stats_info_complete); in ath10k_mac_sta_get_peer_stats_info()
9108 ret = ath10k_wmi_request_peer_stats_info(ar, in ath10k_mac_sta_get_peer_stats_info()
9114 ath10k_warn(ar, "could not request peer stats info: %d\n", ret); in ath10k_mac_sta_get_peer_stats_info()
9118 time_left = wait_for_completion_timeout(&ar->peer_stats_info_complete, 3 * HZ); in ath10k_mac_sta_get_peer_stats_info()
9120 ath10k_warn(ar, "timed out waiting peer stats info\n"); in ath10k_mac_sta_get_peer_stats_info()
9125 ath10k_mac_parse_bitrate(ar, arsta->rx_rate_code, in ath10k_mac_sta_get_peer_stats_info()
9135 ath10k_mac_parse_bitrate(ar, arsta->tx_rate_code, in ath10k_mac_sta_get_peer_stats_info()
9151 struct ath10k *ar = arsta->arvif->ar; in ath10k_sta_statistics() local
9153 if (!ath10k_peer_stats_enabled(ar)) in ath10k_sta_statistics()
9156 mutex_lock(&ar->conf_mutex); in ath10k_sta_statistics()
9157 ath10k_debug_fw_stats_request(ar); in ath10k_sta_statistics()
9158 mutex_unlock(&ar->conf_mutex); in ath10k_sta_statistics()
9175 if (ar->htt.disable_tx_comp) { in ath10k_sta_statistics()
9183 ath10k_mac_sta_get_peer_stats_info(ar, sta, sinfo); in ath10k_sta_statistics()
9191 struct ath10k *ar = hw->priv; in ath10k_mac_op_set_tid_config() local
9197 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_set_tid_config()
9204 ret = ath10k_mac_parse_tid_config(ar, sta, vif, in ath10k_mac_op_set_tid_config()
9217 data.ar = ar; in ath10k_mac_op_set_tid_config()
9223 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_set_tid_config()
9234 struct ath10k *ar = hw->priv; in ath10k_mac_op_reset_tid_config() local
9237 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_reset_tid_config()
9241 ret = ath10k_mac_reset_tid_config(ar, sta, arvif, tids); in ath10k_mac_op_reset_tid_config()
9247 data.ar = ar; in ath10k_mac_op_reset_tid_config()
9252 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_reset_tid_config()
9385 struct ath10k *ar; in ath10k_mac_create() local
9397 ar = hw->priv; in ath10k_mac_create()
9398 ar->hw = hw; in ath10k_mac_create()
9399 ar->ops = ops; in ath10k_mac_create()
9401 return ar; in ath10k_mac_create()
9404 void ath10k_mac_destroy(struct ath10k *ar) in ath10k_mac_destroy() argument
9406 struct ieee80211_ops *ops = ar->ops; in ath10k_mac_destroy()
9408 ieee80211_free_hw(ar->hw); in ath10k_mac_destroy()
9632 struct ath10k_vif *ath10k_get_arvif(struct ath10k *ar, u32 vdev_id) in ath10k_get_arvif() argument
9641 ieee80211_iterate_active_interfaces_atomic(ar->hw, in ath10k_get_arvif()
9646 ath10k_warn(ar, "No VIF found for vdev %d\n", vdev_id); in ath10k_get_arvif()
9656 static u32 ath10k_mac_wrdd_get_mcc(struct ath10k *ar, union acpi_object *wrdd) in ath10k_mac_wrdd_get_mcc() argument
9667 ath10k_warn(ar, "ignoring malformed/unsupported wrdd structure\n"); in ath10k_mac_wrdd_get_mcc()
9692 static int ath10k_mac_get_wrdd_regulatory(struct ath10k *ar, u16 *rd) in ath10k_mac_get_wrdd_regulatory() argument
9701 root_handle = ACPI_HANDLE(ar->dev); in ath10k_mac_get_wrdd_regulatory()
9707 ath10k_dbg(ar, ATH10K_DBG_BOOT, in ath10k_mac_get_wrdd_regulatory()
9714 ath10k_dbg(ar, ATH10K_DBG_BOOT, in ath10k_mac_get_wrdd_regulatory()
9719 alpha2_code = ath10k_mac_wrdd_get_mcc(ar, wrdd.pointer); in ath10k_mac_get_wrdd_regulatory()
9728 ath10k_dbg(ar, ATH10K_DBG_BOOT, in ath10k_mac_get_wrdd_regulatory()
9739 static int ath10k_mac_init_rd(struct ath10k *ar) in ath10k_mac_init_rd() argument
9744 ret = ath10k_mac_get_wrdd_regulatory(ar, &rd); in ath10k_mac_init_rd()
9746 ath10k_dbg(ar, ATH10K_DBG_BOOT, in ath10k_mac_init_rd()
9748 rd = ar->hw_eeprom_rd; in ath10k_mac_init_rd()
9751 ar->ath_common.regulatory.current_rd = rd; in ath10k_mac_init_rd()
9755 int ath10k_mac_register(struct ath10k *ar) in ath10k_mac_register() argument
9783 if (!is_valid_ether_addr(ar->mac_addr)) { in ath10k_mac_register()
9784 ath10k_warn(ar, "invalid MAC address; choosing random\n"); in ath10k_mac_register()
9785 eth_random_addr(ar->mac_addr); in ath10k_mac_register()
9787 SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr); in ath10k_mac_register()
9789 SET_IEEE80211_DEV(ar->hw, ar->dev); in ath10k_mac_register()
9795 if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) { in ath10k_mac_register()
9804 band = &ar->mac.sbands[NL80211_BAND_2GHZ]; in ath10k_mac_register()
9808 if (ar->hw_params.cck_rate_map_rev2) { in ath10k_mac_register()
9816 ar->hw->wiphy->bands[NL80211_BAND_2GHZ] = band; in ath10k_mac_register()
9819 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) { in ath10k_mac_register()
9828 band = &ar->mac.sbands[NL80211_BAND_5GHZ]; in ath10k_mac_register()
9833 ar->hw->wiphy->bands[NL80211_BAND_5GHZ] = band; in ath10k_mac_register()
9836 wiphy_read_of_freq_limits(ar->hw->wiphy); in ath10k_mac_register()
9837 ath10k_mac_setup_ht_vht_cap(ar); in ath10k_mac_register()
9839 ar->hw->wiphy->interface_modes = in ath10k_mac_register()
9844 ar->hw->wiphy->available_antennas_rx = ar->cfg_rx_chainmask; in ath10k_mac_register()
9845 ar->hw->wiphy->available_antennas_tx = ar->cfg_tx_chainmask; in ath10k_mac_register()
9847 if (!test_bit(ATH10K_FW_FEATURE_NO_P2P, ar->normal_mode_fw.fw_file.fw_features)) in ath10k_mac_register()
9848 ar->hw->wiphy->interface_modes |= in ath10k_mac_register()
9853 ieee80211_hw_set(ar->hw, SIGNAL_DBM); in ath10k_mac_register()
9856 ar->running_fw->fw_file.fw_features)) { in ath10k_mac_register()
9857 ieee80211_hw_set(ar->hw, SUPPORTS_PS); in ath10k_mac_register()
9858 ieee80211_hw_set(ar->hw, SUPPORTS_DYNAMIC_PS); in ath10k_mac_register()
9861 ieee80211_hw_set(ar->hw, MFP_CAPABLE); in ath10k_mac_register()
9862 ieee80211_hw_set(ar->hw, REPORTS_TX_ACK_STATUS); in ath10k_mac_register()
9863 ieee80211_hw_set(ar->hw, HAS_RATE_CONTROL); in ath10k_mac_register()
9864 ieee80211_hw_set(ar->hw, AP_LINK_PS); in ath10k_mac_register()
9865 ieee80211_hw_set(ar->hw, SPECTRUM_MGMT); in ath10k_mac_register()
9866 ieee80211_hw_set(ar->hw, SUPPORT_FAST_XMIT); in ath10k_mac_register()
9867 ieee80211_hw_set(ar->hw, CONNECTION_MONITOR); in ath10k_mac_register()
9868 ieee80211_hw_set(ar->hw, SUPPORTS_PER_STA_GTK); in ath10k_mac_register()
9869 ieee80211_hw_set(ar->hw, WANT_MONITOR_VIF); in ath10k_mac_register()
9870 ieee80211_hw_set(ar->hw, CHANCTX_STA_CSA); in ath10k_mac_register()
9871 ieee80211_hw_set(ar->hw, QUEUE_CONTROL); in ath10k_mac_register()
9872 ieee80211_hw_set(ar->hw, SUPPORTS_TX_FRAG); in ath10k_mac_register()
9873 ieee80211_hw_set(ar->hw, REPORTS_LOW_ACK); in ath10k_mac_register()
9875 if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) in ath10k_mac_register()
9876 ieee80211_hw_set(ar->hw, SW_CRYPTO_CONTROL); in ath10k_mac_register()
9878 ar->hw->wiphy->features |= NL80211_FEATURE_STATIC_SMPS; in ath10k_mac_register()
9879 ar->hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN; in ath10k_mac_register()
9881 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) in ath10k_mac_register()
9882 ar->hw->wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS; in ath10k_mac_register()
9884 if (ar->ht_cap_info & WMI_HT_CAP_ENABLED) { in ath10k_mac_register()
9885 ieee80211_hw_set(ar->hw, AMPDU_AGGREGATION); in ath10k_mac_register()
9886 ieee80211_hw_set(ar->hw, TX_AMPDU_SETUP_IN_HW); in ath10k_mac_register()
9889 ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID; in ath10k_mac_register()
9890 ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN; in ath10k_mac_register()
9892 if (test_bit(WMI_SERVICE_NLO, ar->wmi.svc_map)) { in ath10k_mac_register()
9893 ar->hw->wiphy->max_sched_scan_ssids = WMI_PNO_MAX_SUPP_NETWORKS; in ath10k_mac_register()
9894 ar->hw->wiphy->max_match_sets = WMI_PNO_MAX_SUPP_NETWORKS; in ath10k_mac_register()
9895 ar->hw->wiphy->max_sched_scan_ie_len = WMI_PNO_MAX_IE_LENGTH; in ath10k_mac_register()
9896 ar->hw->wiphy->max_sched_scan_plans = WMI_PNO_MAX_SCHED_SCAN_PLANS; in ath10k_mac_register()
9897 ar->hw->wiphy->max_sched_scan_plan_interval = in ath10k_mac_register()
9899 ar->hw->wiphy->max_sched_scan_plan_iterations = in ath10k_mac_register()
9901 ar->hw->wiphy->features |= NL80211_FEATURE_ND_RANDOM_MAC_ADDR; in ath10k_mac_register()
9904 ar->hw->vif_data_size = sizeof(struct ath10k_vif); in ath10k_mac_register()
9905 ar->hw->sta_data_size = sizeof(struct ath10k_sta); in ath10k_mac_register()
9906 ar->hw->txq_data_size = sizeof(struct ath10k_txq); in ath10k_mac_register()
9908 ar->hw->max_listen_interval = ATH10K_MAX_HW_LISTEN_INTERVAL; in ath10k_mac_register()
9910 if (test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map)) { in ath10k_mac_register()
9911 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD; in ath10k_mac_register()
9917 ar->hw->wiphy->probe_resp_offload |= in ath10k_mac_register()
9923 if (test_bit(WMI_SERVICE_TDLS, ar->wmi.svc_map) || in ath10k_mac_register()
9924 test_bit(WMI_SERVICE_TDLS_EXPLICIT_MODE_ONLY, ar->wmi.svc_map)) { in ath10k_mac_register()
9925 ar->hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS; in ath10k_mac_register()
9926 if (test_bit(WMI_SERVICE_TDLS_WIDER_BANDWIDTH, ar->wmi.svc_map)) in ath10k_mac_register()
9927 ieee80211_hw_set(ar->hw, TDLS_WIDER_BW); in ath10k_mac_register()
9930 if (test_bit(WMI_SERVICE_TDLS_UAPSD_BUFFER_STA, ar->wmi.svc_map)) in ath10k_mac_register()
9931 ieee80211_hw_set(ar->hw, SUPPORTS_TDLS_BUFFER_STA); in ath10k_mac_register()
9933 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL; in ath10k_mac_register()
9934 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH; in ath10k_mac_register()
9935 ar->hw->wiphy->max_remain_on_channel_duration = 5000; in ath10k_mac_register()
9937 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD; in ath10k_mac_register()
9938 ar->hw->wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE | in ath10k_mac_register()
9941 ar->hw->wiphy->max_ap_assoc_sta = ar->max_num_stations; in ath10k_mac_register()
9943 ret = ath10k_wow_init(ar); in ath10k_mac_register()
9945 ath10k_warn(ar, "failed to init wow: %d\n", ret); in ath10k_mac_register()
9949 wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_VHT_IBSS); in ath10k_mac_register()
9950 wiphy_ext_feature_set(ar->hw->wiphy, in ath10k_mac_register()
9952 wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_AQL); in ath10k_mac_register()
9954 if (test_bit(WMI_SERVICE_TX_DATA_ACK_RSSI, ar->wmi.svc_map) || in ath10k_mac_register()
9955 test_bit(WMI_SERVICE_HTT_MGMT_TX_COMP_VALID_FLAGS, ar->wmi.svc_map)) in ath10k_mac_register()
9956 wiphy_ext_feature_set(ar->hw->wiphy, in ath10k_mac_register()
9959 if (ath10k_peer_stats_enabled(ar) || in ath10k_mac_register()
9960 test_bit(WMI_SERVICE_REPORT_AIRTIME, ar->wmi.svc_map)) in ath10k_mac_register()
9961 wiphy_ext_feature_set(ar->hw->wiphy, in ath10k_mac_register()
9964 if (test_bit(WMI_SERVICE_RTT_RESPONDER_ROLE, ar->wmi.svc_map)) in ath10k_mac_register()
9965 wiphy_ext_feature_set(ar->hw->wiphy, in ath10k_mac_register()
9968 if (test_bit(WMI_SERVICE_TX_PWR_PER_PEER, ar->wmi.svc_map)) in ath10k_mac_register()
9969 wiphy_ext_feature_set(ar->hw->wiphy, in ath10k_mac_register()
9972 if (test_bit(WMI_SERVICE_PEER_TID_CONFIGS_SUPPORT, ar->wmi.svc_map)) { in ath10k_mac_register()
9973 ar->hw->wiphy->tid_config_support.vif |= in ath10k_mac_register()
9982 ar->wmi.svc_map)) { in ath10k_mac_register()
9983 ar->hw->wiphy->tid_config_support.vif |= in ath10k_mac_register()
9987 ar->hw->wiphy->tid_config_support.peer = in ath10k_mac_register()
9988 ar->hw->wiphy->tid_config_support.vif; in ath10k_mac_register()
9989 ar->hw->wiphy->max_data_retry_count = ATH10K_MAX_RETRY_COUNT; in ath10k_mac_register()
9991 ar->ops->set_tid_config = NULL; in ath10k_mac_register()
9997 ar->hw->queues = IEEE80211_MAX_QUEUES; in ath10k_mac_register()
10003 ar->hw->offchannel_tx_hw_queue = IEEE80211_MAX_QUEUES - 1; in ath10k_mac_register()
10005 switch (ar->running_fw->fw_file.wmi_op_version) { in ath10k_mac_register()
10007 ar->hw->wiphy->iface_combinations = ath10k_if_comb; in ath10k_mac_register()
10008 ar->hw->wiphy->n_iface_combinations = in ath10k_mac_register()
10010 ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC); in ath10k_mac_register()
10013 if (test_bit(WMI_SERVICE_ADAPTIVE_OCS, ar->wmi.svc_map)) { in ath10k_mac_register()
10014 ar->hw->wiphy->iface_combinations = in ath10k_mac_register()
10016 ar->hw->wiphy->n_iface_combinations = in ath10k_mac_register()
10019 ar->hw->wiphy->iface_combinations = ath10k_tlv_if_comb; in ath10k_mac_register()
10020 ar->hw->wiphy->n_iface_combinations = in ath10k_mac_register()
10023 ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC); in ath10k_mac_register()
10028 ar->hw->wiphy->iface_combinations = ath10k_10x_if_comb; in ath10k_mac_register()
10029 ar->hw->wiphy->n_iface_combinations = in ath10k_mac_register()
10033 ar->hw->wiphy->iface_combinations = ath10k_10_4_if_comb; in ath10k_mac_register()
10034 ar->hw->wiphy->n_iface_combinations = in ath10k_mac_register()
10037 ar->wmi.svc_map)) { in ath10k_mac_register()
10038 ar->hw->wiphy->iface_combinations = in ath10k_mac_register()
10040 ar->hw->wiphy->n_iface_combinations = in ath10k_mac_register()
10051 if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) in ath10k_mac_register()
10052 ar->hw->netdev_features = NETIF_F_HW_CSUM; in ath10k_mac_register()
10056 ar->ath_common.debug_mask = ATH_DBG_DFS; in ath10k_mac_register()
10057 ar->dfs_detector = dfs_pattern_detector_init(&ar->ath_common, in ath10k_mac_register()
10060 if (!ar->dfs_detector) in ath10k_mac_register()
10061 ath10k_warn(ar, "failed to initialise DFS pattern detector\n"); in ath10k_mac_register()
10064 ret = ath10k_mac_init_rd(ar); in ath10k_mac_register()
10066 ath10k_err(ar, "failed to derive regdom: %d\n", ret); in ath10k_mac_register()
10071 if (!ar->hw_params.hw_ops->set_coverage_class) in ath10k_mac_register()
10072 ar->ops->set_coverage_class = NULL; in ath10k_mac_register()
10074 ret = ath_regd_init(&ar->ath_common.regulatory, ar->hw->wiphy, in ath10k_mac_register()
10077 ath10k_err(ar, "failed to initialise regulatory: %i\n", ret); in ath10k_mac_register()
10081 if (test_bit(WMI_SERVICE_SPOOF_MAC_SUPPORT, ar->wmi.svc_map)) { in ath10k_mac_register()
10082 ar->hw->wiphy->features |= in ath10k_mac_register()
10086 ar->hw->wiphy->cipher_suites = cipher_suites; in ath10k_mac_register()
10092 if (!ar->hw_params.n_cipher_suites || in ath10k_mac_register()
10093 ar->hw_params.n_cipher_suites > ARRAY_SIZE(cipher_suites)) { in ath10k_mac_register()
10094 ath10k_err(ar, "invalid hw_params.n_cipher_suites %d\n", in ath10k_mac_register()
10095 ar->hw_params.n_cipher_suites); in ath10k_mac_register()
10096 ar->hw_params.n_cipher_suites = 8; in ath10k_mac_register()
10098 ar->hw->wiphy->n_cipher_suites = ar->hw_params.n_cipher_suites; in ath10k_mac_register()
10100 wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST); in ath10k_mac_register()
10102 ar->hw->weight_multiplier = ATH10K_AIRTIME_WEIGHT_MULTIPLIER; in ath10k_mac_register()
10104 ret = ieee80211_register_hw(ar->hw); in ath10k_mac_register()
10106 ath10k_err(ar, "failed to register ieee80211: %d\n", ret); in ath10k_mac_register()
10110 if (test_bit(WMI_SERVICE_PER_PACKET_SW_ENCRYPT, ar->wmi.svc_map)) { in ath10k_mac_register()
10111 ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_AP_VLAN); in ath10k_mac_register()
10112 ar->hw->wiphy->software_iftypes |= BIT(NL80211_IFTYPE_AP_VLAN); in ath10k_mac_register()
10115 if (!ath_is_world_regd(&ar->ath_common.regulatory)) { in ath10k_mac_register()
10116 ret = regulatory_hint(ar->hw->wiphy, in ath10k_mac_register()
10117 ar->ath_common.regulatory.alpha2); in ath10k_mac_register()
10125 ieee80211_unregister_hw(ar->hw); in ath10k_mac_register()
10128 if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) in ath10k_mac_register()
10129 ar->dfs_detector->exit(ar->dfs_detector); in ath10k_mac_register()
10132 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); in ath10k_mac_register()
10133 kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels); in ath10k_mac_register()
10135 SET_IEEE80211_DEV(ar->hw, NULL); in ath10k_mac_register()
10139 void ath10k_mac_unregister(struct ath10k *ar) in ath10k_mac_unregister() argument
10141 ieee80211_unregister_hw(ar->hw); in ath10k_mac_unregister()
10143 if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) in ath10k_mac_unregister()
10144 ar->dfs_detector->exit(ar->dfs_detector); in ath10k_mac_unregister()
10146 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); in ath10k_mac_unregister()
10147 kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels); in ath10k_mac_unregister()
10149 SET_IEEE80211_DEV(ar->hw, NULL); in ath10k_mac_unregister()