Lines Matching refs:ar
166 struct ath10k *ar = arvif->ar; in ath10k_send_key() local
176 lockdep_assert_held(&arvif->ar->conf_mutex); in ath10k_send_key()
196 ath10k_warn(ar, "cipher %d is not supported\n", key->cipher); in ath10k_send_key()
200 if (test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) in ath10k_send_key()
208 return ath10k_wmi_vdev_install_key(arvif->ar, &arg); in ath10k_send_key()
216 struct ath10k *ar = arvif->ar; in ath10k_install_key() local
220 lockdep_assert_held(&ar->conf_mutex); in ath10k_install_key()
222 reinit_completion(&ar->install_key_done); in ath10k_install_key()
231 time_left = wait_for_completion_timeout(&ar->install_key_done, 3 * HZ); in ath10k_install_key()
241 struct ath10k *ar = arvif->ar; in ath10k_install_peer_wep_keys() local
247 lockdep_assert_held(&ar->conf_mutex); in ath10k_install_peer_wep_keys()
253 spin_lock_bh(&ar->data_lock); in ath10k_install_peer_wep_keys()
254 peer = ath10k_peer_find(ar, arvif->vdev_id, addr); in ath10k_install_peer_wep_keys()
255 spin_unlock_bh(&ar->data_lock); in ath10k_install_peer_wep_keys()
293 spin_lock_bh(&ar->data_lock); in ath10k_install_peer_wep_keys()
295 spin_unlock_bh(&ar->data_lock); in ath10k_install_peer_wep_keys()
312 ret = ath10k_wmi_vdev_set_param(arvif->ar, in ath10k_install_peer_wep_keys()
314 arvif->ar->wmi.vdev_param->def_keyid, in ath10k_install_peer_wep_keys()
317 ath10k_warn(ar, "failed to re-set def wpa key idxon vdev %i: %d\n", in ath10k_install_peer_wep_keys()
328 struct ath10k *ar = arvif->ar; in ath10k_clear_peer_keys() local
335 lockdep_assert_held(&ar->conf_mutex); in ath10k_clear_peer_keys()
337 spin_lock_bh(&ar->data_lock); in ath10k_clear_peer_keys()
338 peer = ath10k_peer_find(ar, arvif->vdev_id, addr); in ath10k_clear_peer_keys()
339 spin_unlock_bh(&ar->data_lock); in ath10k_clear_peer_keys()
355 ath10k_warn(ar, "failed to remove peer wep key %d: %d\n", in ath10k_clear_peer_keys()
358 spin_lock_bh(&ar->data_lock); in ath10k_clear_peer_keys()
360 spin_unlock_bh(&ar->data_lock); in ath10k_clear_peer_keys()
366 bool ath10k_mac_is_peer_wep_key_set(struct ath10k *ar, const u8 *addr, in ath10k_mac_is_peer_wep_key_set() argument
372 lockdep_assert_held(&ar->data_lock); in ath10k_mac_is_peer_wep_key_set()
379 peer = ath10k_peer_find(ar, 0, addr); in ath10k_mac_is_peer_wep_key_set()
394 struct ath10k *ar = arvif->ar; in ath10k_clear_vdev_key() local
402 lockdep_assert_held(&ar->conf_mutex); in ath10k_clear_vdev_key()
407 spin_lock_bh(&ar->data_lock); in ath10k_clear_vdev_key()
409 list_for_each_entry(peer, &ar->peers, list) { in ath10k_clear_vdev_key()
421 spin_unlock_bh(&ar->data_lock); in ath10k_clear_vdev_key()
431 ath10k_warn(ar, "failed to remove key for %pM: %d\n", in ath10k_clear_vdev_key()
441 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_update_wep_key() local
445 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_vif_update_wep_key()
447 list_for_each_entry(peer, &ar->peers, list) { in ath10k_mac_vif_update_wep_key()
457 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vif vdev %i update key %i needs update\n", in ath10k_mac_vif_update_wep_key()
462 ath10k_warn(ar, "failed to update wep keys on vdev %i for peer %pM: %d\n", in ath10k_mac_vif_update_wep_key()
596 static int ath10k_mac_num_chanctxs(struct ath10k *ar) in ath10k_mac_num_chanctxs() argument
600 ieee80211_iter_chan_contexts_atomic(ar->hw, in ath10k_mac_num_chanctxs()
617 static int ath10k_peer_create(struct ath10k *ar, u32 vdev_id, const u8 *addr, in ath10k_peer_create() argument
624 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_create()
626 num_peers = ar->num_peers; in ath10k_peer_create()
629 list_for_each_entry(arvif, &ar->arvifs, list) in ath10k_peer_create()
632 if (num_peers >= ar->max_num_peers) in ath10k_peer_create()
635 ret = ath10k_wmi_peer_create(ar, vdev_id, addr, peer_type); in ath10k_peer_create()
637 ath10k_warn(ar, "failed to create wmi peer %pM on vdev %i: %i\n", in ath10k_peer_create()
642 ret = ath10k_wait_for_peer_created(ar, vdev_id, addr); in ath10k_peer_create()
644 ath10k_warn(ar, "failed to wait for created wmi peer %pM on vdev %i: %i\n", in ath10k_peer_create()
649 ar->num_peers++; in ath10k_peer_create()
656 struct ath10k *ar = arvif->ar; in ath10k_mac_set_kickout() local
660 param = ar->wmi.pdev_param->sta_kickout_th; in ath10k_mac_set_kickout()
661 ret = ath10k_wmi_pdev_set_param(ar, param, in ath10k_mac_set_kickout()
664 ath10k_warn(ar, "failed to set kickout threshold on vdev %i: %d\n", in ath10k_mac_set_kickout()
669 param = ar->wmi.vdev_param->ap_keepalive_min_idle_inactive_time_secs; in ath10k_mac_set_kickout()
670 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param, in ath10k_mac_set_kickout()
673 ath10k_warn(ar, "failed to set keepalive minimum idle time on vdev %i: %d\n", in ath10k_mac_set_kickout()
678 param = ar->wmi.vdev_param->ap_keepalive_max_idle_inactive_time_secs; in ath10k_mac_set_kickout()
679 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param, in ath10k_mac_set_kickout()
682 ath10k_warn(ar, "failed to set keepalive maximum idle time on vdev %i: %d\n", in ath10k_mac_set_kickout()
687 param = ar->wmi.vdev_param->ap_keepalive_max_unresponsive_time_secs; in ath10k_mac_set_kickout()
688 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param, in ath10k_mac_set_kickout()
691 ath10k_warn(ar, "failed to set keepalive maximum unresponsive time on vdev %i: %d\n", in ath10k_mac_set_kickout()
701 struct ath10k *ar = arvif->ar; in ath10k_mac_set_rts() local
704 vdev_param = ar->wmi.vdev_param->rts_threshold; in ath10k_mac_set_rts()
705 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, value); in ath10k_mac_set_rts()
708 static int ath10k_peer_delete(struct ath10k *ar, u32 vdev_id, const u8 *addr) in ath10k_peer_delete() argument
712 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_delete()
714 ret = ath10k_wmi_peer_delete(ar, vdev_id, addr); in ath10k_peer_delete()
718 ret = ath10k_wait_for_peer_deleted(ar, vdev_id, addr); in ath10k_peer_delete()
722 ar->num_peers--; in ath10k_peer_delete()
727 static void ath10k_peer_cleanup(struct ath10k *ar, u32 vdev_id) in ath10k_peer_cleanup() argument
731 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_cleanup()
733 spin_lock_bh(&ar->data_lock); in ath10k_peer_cleanup()
734 list_for_each_entry_safe(peer, tmp, &ar->peers, list) { in ath10k_peer_cleanup()
738 ath10k_warn(ar, "removing stale peer %pM from vdev_id %d\n", in ath10k_peer_cleanup()
743 ar->num_peers--; in ath10k_peer_cleanup()
745 spin_unlock_bh(&ar->data_lock); in ath10k_peer_cleanup()
748 static void ath10k_peer_cleanup_all(struct ath10k *ar) in ath10k_peer_cleanup_all() argument
752 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_cleanup_all()
754 spin_lock_bh(&ar->data_lock); in ath10k_peer_cleanup_all()
755 list_for_each_entry_safe(peer, tmp, &ar->peers, list) { in ath10k_peer_cleanup_all()
759 spin_unlock_bh(&ar->data_lock); in ath10k_peer_cleanup_all()
761 ar->num_peers = 0; in ath10k_peer_cleanup_all()
762 ar->num_stations = 0; in ath10k_peer_cleanup_all()
765 static int ath10k_mac_tdls_peer_update(struct ath10k *ar, u32 vdev_id, in ath10k_mac_tdls_peer_update() argument
774 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_tdls_peer_update()
787 ret = ath10k_wmi_tdls_peer_update(ar, &arg, &cap, &chan_arg); in ath10k_mac_tdls_peer_update()
789 ath10k_warn(ar, "failed to update tdls peer %pM on vdev %i: %i\n", in ath10k_mac_tdls_peer_update()
803 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_beacon_free() local
805 lockdep_assert_held(&ar->data_lock); in ath10k_mac_vif_beacon_free()
811 dma_unmap_single(ar->dev, ATH10K_SKB_CB(arvif->beacon)->paddr, in ath10k_mac_vif_beacon_free()
826 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_beacon_cleanup() local
828 lockdep_assert_held(&ar->data_lock); in ath10k_mac_vif_beacon_cleanup()
833 dma_free_coherent(ar->dev, IEEE80211_MAX_FRAME_LEN, in ath10k_mac_vif_beacon_cleanup()
839 static inline int ath10k_vdev_setup_sync(struct ath10k *ar) in ath10k_vdev_setup_sync() argument
843 lockdep_assert_held(&ar->conf_mutex); in ath10k_vdev_setup_sync()
845 if (test_bit(ATH10K_FLAG_CRASH_FLUSH, &ar->dev_flags)) in ath10k_vdev_setup_sync()
848 time_left = wait_for_completion_timeout(&ar->vdev_setup_done, in ath10k_vdev_setup_sync()
856 static int ath10k_monitor_vdev_start(struct ath10k *ar, int vdev_id) in ath10k_monitor_vdev_start() argument
863 lockdep_assert_held(&ar->conf_mutex); in ath10k_monitor_vdev_start()
865 ieee80211_iter_chan_contexts_atomic(ar->hw, in ath10k_monitor_vdev_start()
888 reinit_completion(&ar->vdev_setup_done); in ath10k_monitor_vdev_start()
890 ret = ath10k_wmi_vdev_start(ar, &arg); in ath10k_monitor_vdev_start()
892 ath10k_warn(ar, "failed to request monitor vdev %i start: %d\n", in ath10k_monitor_vdev_start()
897 ret = ath10k_vdev_setup_sync(ar); in ath10k_monitor_vdev_start()
899 ath10k_warn(ar, "failed to synchronize setup for monitor vdev %i start: %d\n", in ath10k_monitor_vdev_start()
904 ret = ath10k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr); in ath10k_monitor_vdev_start()
906 ath10k_warn(ar, "failed to put up monitor vdev %i: %d\n", in ath10k_monitor_vdev_start()
911 ar->monitor_vdev_id = vdev_id; in ath10k_monitor_vdev_start()
913 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %i started\n", in ath10k_monitor_vdev_start()
914 ar->monitor_vdev_id); in ath10k_monitor_vdev_start()
918 ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id); in ath10k_monitor_vdev_start()
920 ath10k_warn(ar, "failed to stop monitor vdev %i after start failure: %d\n", in ath10k_monitor_vdev_start()
921 ar->monitor_vdev_id, ret); in ath10k_monitor_vdev_start()
926 static int ath10k_monitor_vdev_stop(struct ath10k *ar) in ath10k_monitor_vdev_stop() argument
930 lockdep_assert_held(&ar->conf_mutex); in ath10k_monitor_vdev_stop()
932 ret = ath10k_wmi_vdev_down(ar, ar->monitor_vdev_id); in ath10k_monitor_vdev_stop()
934 ath10k_warn(ar, "failed to put down monitor vdev %i: %d\n", in ath10k_monitor_vdev_stop()
935 ar->monitor_vdev_id, ret); in ath10k_monitor_vdev_stop()
937 reinit_completion(&ar->vdev_setup_done); in ath10k_monitor_vdev_stop()
939 ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id); in ath10k_monitor_vdev_stop()
941 ath10k_warn(ar, "failed to to request monitor vdev %i stop: %d\n", in ath10k_monitor_vdev_stop()
942 ar->monitor_vdev_id, ret); in ath10k_monitor_vdev_stop()
944 ret = ath10k_vdev_setup_sync(ar); in ath10k_monitor_vdev_stop()
946 ath10k_warn(ar, "failed to synchronize monitor vdev %i stop: %d\n", in ath10k_monitor_vdev_stop()
947 ar->monitor_vdev_id, ret); in ath10k_monitor_vdev_stop()
949 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %i stopped\n", in ath10k_monitor_vdev_stop()
950 ar->monitor_vdev_id); in ath10k_monitor_vdev_stop()
954 static int ath10k_monitor_vdev_create(struct ath10k *ar) in ath10k_monitor_vdev_create() argument
958 lockdep_assert_held(&ar->conf_mutex); in ath10k_monitor_vdev_create()
960 if (ar->free_vdev_map == 0) { in ath10k_monitor_vdev_create()
961 ath10k_warn(ar, "failed to find free vdev id for monitor vdev\n"); in ath10k_monitor_vdev_create()
965 bit = __ffs64(ar->free_vdev_map); in ath10k_monitor_vdev_create()
967 ar->monitor_vdev_id = bit; in ath10k_monitor_vdev_create()
969 ret = ath10k_wmi_vdev_create(ar, ar->monitor_vdev_id, in ath10k_monitor_vdev_create()
971 0, ar->mac_addr); in ath10k_monitor_vdev_create()
973 ath10k_warn(ar, "failed to request monitor vdev %i creation: %d\n", in ath10k_monitor_vdev_create()
974 ar->monitor_vdev_id, ret); in ath10k_monitor_vdev_create()
978 ar->free_vdev_map &= ~(1LL << ar->monitor_vdev_id); in ath10k_monitor_vdev_create()
979 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %d created\n", in ath10k_monitor_vdev_create()
980 ar->monitor_vdev_id); in ath10k_monitor_vdev_create()
985 static int ath10k_monitor_vdev_delete(struct ath10k *ar) in ath10k_monitor_vdev_delete() argument
989 lockdep_assert_held(&ar->conf_mutex); in ath10k_monitor_vdev_delete()
991 ret = ath10k_wmi_vdev_delete(ar, ar->monitor_vdev_id); in ath10k_monitor_vdev_delete()
993 ath10k_warn(ar, "failed to request wmi monitor vdev %i removal: %d\n", in ath10k_monitor_vdev_delete()
994 ar->monitor_vdev_id, ret); in ath10k_monitor_vdev_delete()
998 ar->free_vdev_map |= 1LL << ar->monitor_vdev_id; in ath10k_monitor_vdev_delete()
1000 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %d deleted\n", in ath10k_monitor_vdev_delete()
1001 ar->monitor_vdev_id); in ath10k_monitor_vdev_delete()
1005 static int ath10k_monitor_start(struct ath10k *ar) in ath10k_monitor_start() argument
1009 lockdep_assert_held(&ar->conf_mutex); in ath10k_monitor_start()
1011 ret = ath10k_monitor_vdev_create(ar); in ath10k_monitor_start()
1013 ath10k_warn(ar, "failed to create monitor vdev: %d\n", ret); in ath10k_monitor_start()
1017 ret = ath10k_monitor_vdev_start(ar, ar->monitor_vdev_id); in ath10k_monitor_start()
1019 ath10k_warn(ar, "failed to start monitor vdev: %d\n", ret); in ath10k_monitor_start()
1020 ath10k_monitor_vdev_delete(ar); in ath10k_monitor_start()
1024 ar->monitor_started = true; in ath10k_monitor_start()
1025 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor started\n"); in ath10k_monitor_start()
1030 static int ath10k_monitor_stop(struct ath10k *ar) in ath10k_monitor_stop() argument
1034 lockdep_assert_held(&ar->conf_mutex); in ath10k_monitor_stop()
1036 ret = ath10k_monitor_vdev_stop(ar); in ath10k_monitor_stop()
1038 ath10k_warn(ar, "failed to stop monitor vdev: %d\n", ret); in ath10k_monitor_stop()
1042 ret = ath10k_monitor_vdev_delete(ar); in ath10k_monitor_stop()
1044 ath10k_warn(ar, "failed to delete monitor vdev: %d\n", ret); in ath10k_monitor_stop()
1048 ar->monitor_started = false; in ath10k_monitor_stop()
1049 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor stopped\n"); in ath10k_monitor_stop()
1054 static bool ath10k_mac_monitor_vdev_is_needed(struct ath10k *ar) in ath10k_mac_monitor_vdev_is_needed() argument
1061 num_ctx = ath10k_mac_num_chanctxs(ar); in ath10k_mac_monitor_vdev_is_needed()
1068 if (ar->monitor_arvif) in ath10k_mac_monitor_vdev_is_needed()
1071 return ar->monitor || in ath10k_mac_monitor_vdev_is_needed()
1072 ar->filter_flags & FIF_OTHER_BSS || in ath10k_mac_monitor_vdev_is_needed()
1073 test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags); in ath10k_mac_monitor_vdev_is_needed()
1076 static bool ath10k_mac_monitor_vdev_is_allowed(struct ath10k *ar) in ath10k_mac_monitor_vdev_is_allowed() argument
1080 num_ctx = ath10k_mac_num_chanctxs(ar); in ath10k_mac_monitor_vdev_is_allowed()
1086 if (test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags) && num_ctx > 1) in ath10k_mac_monitor_vdev_is_allowed()
1092 static int ath10k_monitor_recalc(struct ath10k *ar) in ath10k_monitor_recalc() argument
1098 lockdep_assert_held(&ar->conf_mutex); in ath10k_monitor_recalc()
1100 needed = ath10k_mac_monitor_vdev_is_needed(ar); in ath10k_monitor_recalc()
1101 allowed = ath10k_mac_monitor_vdev_is_allowed(ar); in ath10k_monitor_recalc()
1103 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_monitor_recalc()
1105 ar->monitor_started, needed, allowed); in ath10k_monitor_recalc()
1108 if (ar->monitor_started) { in ath10k_monitor_recalc()
1109 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor stopping disallowed monitor\n"); in ath10k_monitor_recalc()
1111 ret = ath10k_monitor_stop(ar); in ath10k_monitor_recalc()
1113 ath10k_warn(ar, "failed to stop disallowed monitor: %d\n", in ath10k_monitor_recalc()
1121 if (needed == ar->monitor_started) in ath10k_monitor_recalc()
1125 return ath10k_monitor_start(ar); in ath10k_monitor_recalc()
1127 return ath10k_monitor_stop(ar); in ath10k_monitor_recalc()
1132 struct ath10k *ar = arvif->ar; in ath10k_recalc_rtscts_prot() local
1135 lockdep_assert_held(&ar->conf_mutex); in ath10k_recalc_rtscts_prot()
1137 vdev_param = ar->wmi.vdev_param->enable_rtscts; in ath10k_recalc_rtscts_prot()
1148 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_recalc_rtscts_prot()
1152 static int ath10k_start_cac(struct ath10k *ar) in ath10k_start_cac() argument
1156 lockdep_assert_held(&ar->conf_mutex); in ath10k_start_cac()
1158 set_bit(ATH10K_CAC_RUNNING, &ar->dev_flags); in ath10k_start_cac()
1160 ret = ath10k_monitor_recalc(ar); in ath10k_start_cac()
1162 ath10k_warn(ar, "failed to start monitor (cac): %d\n", ret); in ath10k_start_cac()
1163 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags); in ath10k_start_cac()
1167 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac cac start monitor vdev %d\n", in ath10k_start_cac()
1168 ar->monitor_vdev_id); in ath10k_start_cac()
1173 static int ath10k_stop_cac(struct ath10k *ar) in ath10k_stop_cac() argument
1175 lockdep_assert_held(&ar->conf_mutex); in ath10k_stop_cac()
1178 if (!test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags)) in ath10k_stop_cac()
1181 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags); in ath10k_stop_cac()
1182 ath10k_monitor_stop(ar); in ath10k_stop_cac()
1184 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac cac finished\n"); in ath10k_stop_cac()
1199 static bool ath10k_mac_has_radar_enabled(struct ath10k *ar) in ath10k_mac_has_radar_enabled() argument
1203 ieee80211_iter_chan_contexts_atomic(ar->hw, in ath10k_mac_has_radar_enabled()
1210 static void ath10k_recalc_radar_detection(struct ath10k *ar) in ath10k_recalc_radar_detection() argument
1214 lockdep_assert_held(&ar->conf_mutex); in ath10k_recalc_radar_detection()
1216 ath10k_stop_cac(ar); in ath10k_recalc_radar_detection()
1218 if (!ath10k_mac_has_radar_enabled(ar)) in ath10k_recalc_radar_detection()
1221 if (ar->num_started_vdevs > 0) in ath10k_recalc_radar_detection()
1224 ret = ath10k_start_cac(ar); in ath10k_recalc_radar_detection()
1231 ath10k_warn(ar, "failed to start CAC: %d\n", ret); in ath10k_recalc_radar_detection()
1232 ieee80211_radar_detected(ar->hw); in ath10k_recalc_radar_detection()
1238 struct ath10k *ar = arvif->ar; in ath10k_vdev_stop() local
1241 lockdep_assert_held(&ar->conf_mutex); in ath10k_vdev_stop()
1243 reinit_completion(&ar->vdev_setup_done); in ath10k_vdev_stop()
1245 ret = ath10k_wmi_vdev_stop(ar, arvif->vdev_id); in ath10k_vdev_stop()
1247 ath10k_warn(ar, "failed to stop WMI vdev %i: %d\n", in ath10k_vdev_stop()
1252 ret = ath10k_vdev_setup_sync(ar); in ath10k_vdev_stop()
1254 ath10k_warn(ar, "failed to syncronise setup for vdev %i: %d\n", in ath10k_vdev_stop()
1259 WARN_ON(ar->num_started_vdevs == 0); in ath10k_vdev_stop()
1261 if (ar->num_started_vdevs != 0) { in ath10k_vdev_stop()
1262 ar->num_started_vdevs--; in ath10k_vdev_stop()
1263 ath10k_recalc_radar_detection(ar); in ath10k_vdev_stop()
1273 struct ath10k *ar = arvif->ar; in ath10k_vdev_start_restart() local
1277 lockdep_assert_held(&ar->conf_mutex); in ath10k_vdev_start_restart()
1279 reinit_completion(&ar->vdev_setup_done); in ath10k_vdev_start_restart()
1307 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_vdev_start_restart()
1313 ret = ath10k_wmi_vdev_restart(ar, &arg); in ath10k_vdev_start_restart()
1315 ret = ath10k_wmi_vdev_start(ar, &arg); in ath10k_vdev_start_restart()
1318 ath10k_warn(ar, "failed to start WMI vdev %i: %d\n", in ath10k_vdev_start_restart()
1323 ret = ath10k_vdev_setup_sync(ar); in ath10k_vdev_start_restart()
1325 ath10k_warn(ar, in ath10k_vdev_start_restart()
1331 ar->num_started_vdevs++; in ath10k_vdev_start_restart()
1332 ath10k_recalc_radar_detection(ar); in ath10k_vdev_start_restart()
1352 struct ath10k *ar = arvif->ar; in ath10k_mac_setup_bcn_p2p_ie() local
1371 ret = ath10k_wmi_p2p_go_bcn_ie(ar, arvif->vdev_id, p2p_ie); in ath10k_mac_setup_bcn_p2p_ie()
1373 ath10k_warn(ar, "failed to submit p2p go bcn ie for vdev %i: %d\n", in ath10k_mac_setup_bcn_p2p_ie()
1413 struct ath10k *ar = arvif->ar; in ath10k_mac_setup_bcn_tmpl() local
1414 struct ieee80211_hw *hw = ar->hw; in ath10k_mac_setup_bcn_tmpl()
1420 if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map)) in ath10k_mac_setup_bcn_tmpl()
1429 ath10k_warn(ar, "failed to get beacon template from mac80211\n"); in ath10k_mac_setup_bcn_tmpl()
1435 ath10k_warn(ar, "failed to setup p2p go bcn ie: %d\n", ret); in ath10k_mac_setup_bcn_tmpl()
1448 ret = ath10k_wmi_bcn_tmpl(ar, arvif->vdev_id, offs.tim_offset, bcn, 0, in ath10k_mac_setup_bcn_tmpl()
1453 ath10k_warn(ar, "failed to submit beacon template command: %d\n", in ath10k_mac_setup_bcn_tmpl()
1463 struct ath10k *ar = arvif->ar; in ath10k_mac_setup_prb_tmpl() local
1464 struct ieee80211_hw *hw = ar->hw; in ath10k_mac_setup_prb_tmpl()
1469 if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map)) in ath10k_mac_setup_prb_tmpl()
1477 ath10k_warn(ar, "failed to get probe resp template from mac80211\n"); in ath10k_mac_setup_prb_tmpl()
1481 ret = ath10k_wmi_prb_tmpl(ar, arvif->vdev_id, prb); in ath10k_mac_setup_prb_tmpl()
1485 ath10k_warn(ar, "failed to submit probe resp template command: %d\n", in ath10k_mac_setup_prb_tmpl()
1495 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_fix_hidden_ssid() local
1514 if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map)) in ath10k_mac_vif_fix_hidden_ssid()
1526 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id); in ath10k_mac_vif_fix_hidden_ssid()
1528 ath10k_warn(ar, "failed to bring down ap vdev %i: %d\n", in ath10k_mac_vif_fix_hidden_ssid()
1539 ath10k_warn(ar, "failed to update beacon template: %d\n", ret); in ath10k_mac_vif_fix_hidden_ssid()
1545 ath10k_warn(ar, "failed to update presp template: %d\n", ret); in ath10k_mac_vif_fix_hidden_ssid()
1551 ath10k_warn(ar, "failed to restart ap vdev %i: %d\n", in ath10k_mac_vif_fix_hidden_ssid()
1556 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid, in ath10k_mac_vif_fix_hidden_ssid()
1559 ath10k_warn(ar, "failed to bring up ap vdev %i: %d\n", in ath10k_mac_vif_fix_hidden_ssid()
1570 struct ath10k *ar = arvif->ar; in ath10k_control_beaconing() local
1573 lockdep_assert_held(&arvif->ar->conf_mutex); in ath10k_control_beaconing()
1576 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id); in ath10k_control_beaconing()
1578 ath10k_warn(ar, "failed to down vdev_id %i: %d\n", in ath10k_control_beaconing()
1583 spin_lock_bh(&arvif->ar->data_lock); in ath10k_control_beaconing()
1585 spin_unlock_bh(&arvif->ar->data_lock); in ath10k_control_beaconing()
1595 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid, in ath10k_control_beaconing()
1598 ath10k_warn(ar, "failed to bring up vdev %d: %i\n", in ath10k_control_beaconing()
1607 ath10k_warn(ar, "failed to fix hidden ssid for vdev %i, expect trouble: %d\n", in ath10k_control_beaconing()
1612 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d up\n", arvif->vdev_id); in ath10k_control_beaconing()
1619 struct ath10k *ar = arvif->ar; in ath10k_control_ibss() local
1623 lockdep_assert_held(&arvif->ar->conf_mutex); in ath10k_control_ibss()
1634 vdev_param = arvif->ar->wmi.vdev_param->atim_window; in ath10k_control_ibss()
1635 ret = ath10k_wmi_vdev_set_param(arvif->ar, arvif->vdev_id, vdev_param, in ath10k_control_ibss()
1638 ath10k_warn(ar, "failed to set IBSS ATIM for vdev %d: %d\n", in ath10k_control_ibss()
1644 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_recalc_ps_wake_threshold() local
1649 lockdep_assert_held(&arvif->ar->conf_mutex); in ath10k_mac_vif_recalc_ps_wake_threshold()
1657 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param, value); in ath10k_mac_vif_recalc_ps_wake_threshold()
1659 ath10k_warn(ar, "failed to submit ps wake threshold %u on vdev %i: %d\n", in ath10k_mac_vif_recalc_ps_wake_threshold()
1669 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_recalc_ps_poll_count() local
1674 lockdep_assert_held(&arvif->ar->conf_mutex); in ath10k_mac_vif_recalc_ps_poll_count()
1682 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath10k_mac_vif_recalc_ps_poll_count()
1685 ath10k_warn(ar, "failed to submit ps poll count %u on vdev %i: %d\n", in ath10k_mac_vif_recalc_ps_poll_count()
1693 static int ath10k_mac_num_vifs_started(struct ath10k *ar) in ath10k_mac_num_vifs_started() argument
1698 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_num_vifs_started()
1700 list_for_each_entry(arvif, &ar->arvifs, list) in ath10k_mac_num_vifs_started()
1709 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_setup_ps() local
1711 struct ieee80211_conf *conf = &ar->hw->conf; in ath10k_mac_vif_setup_ps()
1718 lockdep_assert_held(&arvif->ar->conf_mutex); in ath10k_mac_vif_setup_ps()
1725 if (enable_ps && ath10k_mac_num_vifs_started(ar) > 1 && in ath10k_mac_vif_setup_ps()
1727 ar->fw_features)) { in ath10k_mac_vif_setup_ps()
1728 ath10k_warn(ar, "refusing to enable ps on vdev %i: not supported by fw\n", in ath10k_mac_vif_setup_ps()
1751 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param, in ath10k_mac_vif_setup_ps()
1754 ath10k_warn(ar, "failed to set inactivity time for vdev %d: %i\n", in ath10k_mac_vif_setup_ps()
1762 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d psmode %s\n", in ath10k_mac_vif_setup_ps()
1765 ret = ath10k_wmi_set_psmode(ar, arvif->vdev_id, psmode); in ath10k_mac_vif_setup_ps()
1767 ath10k_warn(ar, "failed to set PS Mode %d for vdev %d: %d\n", in ath10k_mac_vif_setup_ps()
1777 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_disable_keepalive() local
1781 lockdep_assert_held(&arvif->ar->conf_mutex); in ath10k_mac_vif_disable_keepalive()
1786 if (!test_bit(WMI_SERVICE_STA_KEEP_ALIVE, ar->wmi.svc_map)) in ath10k_mac_vif_disable_keepalive()
1797 ret = ath10k_wmi_sta_keepalive(ar, &arg); in ath10k_mac_vif_disable_keepalive()
1799 ath10k_warn(ar, "failed to submit keepalive on vdev %i: %d\n", in ath10k_mac_vif_disable_keepalive()
1809 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_ap_csa_count_down() local
1813 lockdep_assert_held(&arvif->ar->conf_mutex); in ath10k_mac_vif_ap_csa_count_down()
1815 if (WARN_ON(!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map))) in ath10k_mac_vif_ap_csa_count_down()
1832 ath10k_warn(ar, "failed to update bcn tmpl during csa: %d\n", in ath10k_mac_vif_ap_csa_count_down()
1837 ath10k_warn(ar, "failed to update prb tmpl during csa: %d\n", in ath10k_mac_vif_ap_csa_count_down()
1848 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_ap_csa_work() local
1850 mutex_lock(&ar->conf_mutex); in ath10k_mac_vif_ap_csa_work()
1852 mutex_unlock(&ar->conf_mutex); in ath10k_mac_vif_ap_csa_work()
1871 void ath10k_mac_handle_beacon(struct ath10k *ar, struct sk_buff *skb) in ath10k_mac_handle_beacon() argument
1873 ieee80211_iterate_active_interfaces_atomic(ar->hw, in ath10k_mac_handle_beacon()
1884 struct ath10k *ar = arvif->ar; in ath10k_mac_handle_beacon_miss_iter() local
1885 struct ieee80211_hw *hw = ar->hw; in ath10k_mac_handle_beacon_miss_iter()
1904 void ath10k_mac_handle_beacon_miss(struct ath10k *ar, u32 vdev_id) in ath10k_mac_handle_beacon_miss() argument
1906 ieee80211_iterate_active_interfaces_atomic(ar->hw, in ath10k_mac_handle_beacon_miss()
1928 static u32 ath10k_peer_assoc_h_listen_intval(struct ath10k *ar, in ath10k_peer_assoc_h_listen_intval() argument
1942 return ar->hw->conf.listen_interval; in ath10k_peer_assoc_h_listen_intval()
1945 static void ath10k_peer_assoc_h_basic(struct ath10k *ar, in ath10k_peer_assoc_h_basic() argument
1953 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_assoc_h_basic()
1964 arg->peer_listen_intval = ath10k_peer_assoc_h_listen_intval(ar, vif); in ath10k_peer_assoc_h_basic()
1969 static void ath10k_peer_assoc_h_crypto(struct ath10k *ar, in ath10k_peer_assoc_h_crypto() argument
1979 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_assoc_h_crypto()
1984 bss = cfg80211_get_bss(ar->hw->wiphy, def.chan, info->bssid, NULL, 0, in ath10k_peer_assoc_h_crypto()
1999 cfg80211_put_bss(ar->hw->wiphy, bss); in ath10k_peer_assoc_h_crypto()
2004 ath10k_dbg(ar, ATH10K_DBG_WMI, "%s: rsn ie found\n", __func__); in ath10k_peer_assoc_h_crypto()
2009 ath10k_dbg(ar, ATH10K_DBG_WMI, "%s: wpa ie found\n", __func__); in ath10k_peer_assoc_h_crypto()
2014 static void ath10k_peer_assoc_h_rates(struct ath10k *ar, in ath10k_peer_assoc_h_rates() argument
2029 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_assoc_h_rates()
2035 sband = ar->hw->wiphy->bands[band]; in ath10k_peer_assoc_h_rates()
2076 static void ath10k_peer_assoc_h_ht(struct ath10k *ar, in ath10k_peer_assoc_h_ht() argument
2091 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_assoc_h_ht()
2176 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n", in ath10k_peer_assoc_h_ht()
2182 static int ath10k_peer_assoc_qos_ap(struct ath10k *ar, in ath10k_peer_assoc_qos_ap() argument
2190 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_assoc_qos_ap()
2193 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac uapsd_queues 0x%x max_sp %d\n", in ath10k_peer_assoc_qos_ap()
2212 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id, in ath10k_peer_assoc_qos_ap()
2217 ath10k_warn(ar, "failed to set ap ps peer param uapsd for vdev %i: %d\n", in ath10k_peer_assoc_qos_ap()
2222 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id, in ath10k_peer_assoc_qos_ap()
2227 ath10k_warn(ar, "failed to set ap ps peer param max sp for vdev %i: %d\n", in ath10k_peer_assoc_qos_ap()
2236 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id, sta->addr, in ath10k_peer_assoc_qos_ap()
2240 ath10k_warn(ar, "failed to set ap ps peer param ageout time for vdev %i: %d\n", in ath10k_peer_assoc_qos_ap()
2300 static void ath10k_peer_assoc_h_vht(struct ath10k *ar, in ath10k_peer_assoc_h_vht() argument
2355 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vht peer %pM max_mpdu %d flags 0x%x\n", in ath10k_peer_assoc_h_vht()
2359 static void ath10k_peer_assoc_h_qos(struct ath10k *ar, in ath10k_peer_assoc_h_qos() argument
2388 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac peer %pM qos %d\n", in ath10k_peer_assoc_h_qos()
2398 static void ath10k_peer_assoc_h_phymode(struct ath10k *ar, in ath10k_peer_assoc_h_phymode() argument
2465 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac peer %pM phymode %s\n", in ath10k_peer_assoc_h_phymode()
2472 static int ath10k_peer_assoc_prepare(struct ath10k *ar, in ath10k_peer_assoc_prepare() argument
2477 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_assoc_prepare()
2481 ath10k_peer_assoc_h_basic(ar, vif, sta, arg); in ath10k_peer_assoc_prepare()
2482 ath10k_peer_assoc_h_crypto(ar, vif, arg); in ath10k_peer_assoc_prepare()
2483 ath10k_peer_assoc_h_rates(ar, vif, sta, arg); in ath10k_peer_assoc_prepare()
2484 ath10k_peer_assoc_h_ht(ar, vif, sta, arg); in ath10k_peer_assoc_prepare()
2485 ath10k_peer_assoc_h_vht(ar, vif, sta, arg); in ath10k_peer_assoc_prepare()
2486 ath10k_peer_assoc_h_qos(ar, vif, sta, arg); in ath10k_peer_assoc_prepare()
2487 ath10k_peer_assoc_h_phymode(ar, vif, sta, arg); in ath10k_peer_assoc_prepare()
2499 static int ath10k_setup_peer_smps(struct ath10k *ar, struct ath10k_vif *arvif, in ath10k_setup_peer_smps() argument
2514 return ath10k_wmi_peer_set_param(ar, arvif->vdev_id, addr, in ath10k_setup_peer_smps()
2519 static int ath10k_mac_vif_recalc_txbf(struct ath10k *ar, in ath10k_mac_vif_recalc_txbf() argument
2528 if (ath10k_wmi_get_txbf_conf_scheme(ar) != WMI_TXBF_CONF_AFTER_ASSOC) in ath10k_mac_vif_recalc_txbf()
2531 if (!(ar->vht_cap_info & in ath10k_mac_vif_recalc_txbf()
2538 param = ar->wmi.vdev_param->txbf; in ath10k_mac_vif_recalc_txbf()
2548 if (ar->vht_cap_info & in ath10k_mac_vif_recalc_txbf()
2558 if (ar->vht_cap_info & in ath10k_mac_vif_recalc_txbf()
2574 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param, value); in ath10k_mac_vif_recalc_txbf()
2576 ath10k_warn(ar, "failed to submit vdev param txbf 0x%x: %d\n", in ath10k_mac_vif_recalc_txbf()
2589 struct ath10k *ar = hw->priv; in ath10k_bss_assoc() local
2597 lockdep_assert_held(&ar->conf_mutex); in ath10k_bss_assoc()
2599 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i assoc bssid %pM aid %d\n", in ath10k_bss_assoc()
2606 ath10k_warn(ar, "failed to find station entry for bss %pM vdev %i\n", in ath10k_bss_assoc()
2617 ret = ath10k_peer_assoc_prepare(ar, vif, ap_sta, &peer_arg); in ath10k_bss_assoc()
2619 ath10k_warn(ar, "failed to prepare peer assoc for %pM vdev %i: %d\n", in ath10k_bss_assoc()
2627 ret = ath10k_wmi_peer_assoc(ar, &peer_arg); in ath10k_bss_assoc()
2629 ath10k_warn(ar, "failed to run peer assoc for %pM vdev %i: %d\n", in ath10k_bss_assoc()
2634 ret = ath10k_setup_peer_smps(ar, arvif, bss_conf->bssid, &ht_cap); in ath10k_bss_assoc()
2636 ath10k_warn(ar, "failed to setup peer SMPS for vdev %i: %d\n", in ath10k_bss_assoc()
2641 ret = ath10k_mac_vif_recalc_txbf(ar, vif, vht_cap); in ath10k_bss_assoc()
2643 ath10k_warn(ar, "failed to recalc txbf for vdev %i on bss %pM: %d\n", in ath10k_bss_assoc()
2648 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_bss_assoc()
2657 ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid); in ath10k_bss_assoc()
2659 ath10k_warn(ar, "failed to set vdev %d up: %d\n", in ath10k_bss_assoc()
2670 ret = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, arvif->bssid, in ath10k_bss_assoc()
2673 ath10k_warn(ar, "failed to poke peer %pM param for ps workaround on vdev %i: %d\n", in ath10k_bss_assoc()
2682 struct ath10k *ar = hw->priv; in ath10k_bss_disassoc() local
2687 lockdep_assert_held(&ar->conf_mutex); in ath10k_bss_disassoc()
2689 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i disassoc bssid %pM\n", in ath10k_bss_disassoc()
2692 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id); in ath10k_bss_disassoc()
2694 ath10k_warn(ar, "faield to down vdev %i: %d\n", in ath10k_bss_disassoc()
2699 ret = ath10k_mac_vif_recalc_txbf(ar, vif, vht_cap); in ath10k_bss_disassoc()
2701 ath10k_warn(ar, "failed to recalc txbf for vdev %i: %d\n", in ath10k_bss_disassoc()
2711 static int ath10k_station_assoc(struct ath10k *ar, in ath10k_station_assoc() argument
2720 lockdep_assert_held(&ar->conf_mutex); in ath10k_station_assoc()
2722 ret = ath10k_peer_assoc_prepare(ar, vif, sta, &peer_arg); in ath10k_station_assoc()
2724 ath10k_warn(ar, "failed to prepare WMI peer assoc for %pM vdev %i: %i\n", in ath10k_station_assoc()
2729 ret = ath10k_wmi_peer_assoc(ar, &peer_arg); in ath10k_station_assoc()
2731 ath10k_warn(ar, "failed to run peer assoc for STA %pM vdev %i: %d\n", in ath10k_station_assoc()
2740 ret = ath10k_setup_peer_smps(ar, arvif, sta->addr, in ath10k_station_assoc()
2743 ath10k_warn(ar, "failed to setup peer SMPS for vdev %d: %d\n", in ath10k_station_assoc()
2748 ret = ath10k_peer_assoc_qos_ap(ar, arvif, sta); in ath10k_station_assoc()
2750 ath10k_warn(ar, "failed to set qos params for STA %pM for vdev %i: %d\n", in ath10k_station_assoc()
2759 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n", in ath10k_station_assoc()
2769 ath10k_warn(ar, "failed to install peer wep keys for vdev %i: %d\n", in ath10k_station_assoc()
2779 static int ath10k_station_disassoc(struct ath10k *ar, in ath10k_station_disassoc() argument
2786 lockdep_assert_held(&ar->conf_mutex); in ath10k_station_disassoc()
2792 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n", in ath10k_station_disassoc()
2800 ath10k_warn(ar, "failed to clear all peer wep keys for vdev %i: %d\n", in ath10k_station_disassoc()
2812 static int ath10k_update_channel_list(struct ath10k *ar) in ath10k_update_channel_list() argument
2814 struct ieee80211_hw *hw = ar->hw; in ath10k_update_channel_list()
2825 lockdep_assert_held(&ar->conf_mutex); in ath10k_update_channel_list()
2893 ath10k_dbg(ar, ATH10K_DBG_WMI, in ath10k_update_channel_list()
2903 ret = ath10k_wmi_scan_chan_list(ar, &arg); in ath10k_update_channel_list()
2925 static void ath10k_regd_update(struct ath10k *ar) in ath10k_regd_update() argument
2932 lockdep_assert_held(&ar->conf_mutex); in ath10k_regd_update()
2934 ret = ath10k_update_channel_list(ar); in ath10k_regd_update()
2936 ath10k_warn(ar, "failed to update channel list: %d\n", ret); in ath10k_regd_update()
2938 regpair = ar->ath_common.regulatory.regpair; in ath10k_regd_update()
2940 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) { in ath10k_regd_update()
2941 nl_dfs_reg = ar->dfs_detector->region; in ath10k_regd_update()
2949 ret = ath10k_wmi_pdev_set_regdomain(ar, in ath10k_regd_update()
2957 ath10k_warn(ar, "failed to set pdev regdomain: %d\n", ret); in ath10k_regd_update()
2964 struct ath10k *ar = hw->priv; in ath10k_reg_notifier() local
2967 ath_reg_notifier_apply(wiphy, request, &ar->ath_common.regulatory); in ath10k_reg_notifier()
2969 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) { in ath10k_reg_notifier()
2970 ath10k_dbg(ar, ATH10K_DBG_REGULATORY, "dfs region 0x%x\n", in ath10k_reg_notifier()
2972 result = ar->dfs_detector->set_dfs_domain(ar->dfs_detector, in ath10k_reg_notifier()
2975 ath10k_warn(ar, "DFS region 0x%X not supported, will trigger radar for every pulse\n", in ath10k_reg_notifier()
2979 mutex_lock(&ar->conf_mutex); in ath10k_reg_notifier()
2980 if (ar->state == ATH10K_STATE_ON) in ath10k_reg_notifier()
2981 ath10k_regd_update(ar); in ath10k_reg_notifier()
2982 mutex_unlock(&ar->conf_mutex); in ath10k_reg_notifier()
2989 void ath10k_mac_tx_lock(struct ath10k *ar, int reason) in ath10k_mac_tx_lock() argument
2991 lockdep_assert_held(&ar->htt.tx_lock); in ath10k_mac_tx_lock()
2994 ar->tx_paused |= BIT(reason); in ath10k_mac_tx_lock()
2995 ieee80211_stop_queues(ar->hw); in ath10k_mac_tx_lock()
3001 struct ath10k *ar = data; in ath10k_mac_tx_unlock_iter() local
3007 ieee80211_wake_queue(ar->hw, arvif->vdev_id); in ath10k_mac_tx_unlock_iter()
3010 void ath10k_mac_tx_unlock(struct ath10k *ar, int reason) in ath10k_mac_tx_unlock() argument
3012 lockdep_assert_held(&ar->htt.tx_lock); in ath10k_mac_tx_unlock()
3015 ar->tx_paused &= ~BIT(reason); in ath10k_mac_tx_unlock()
3017 if (ar->tx_paused) in ath10k_mac_tx_unlock()
3020 ieee80211_iterate_active_interfaces_atomic(ar->hw, in ath10k_mac_tx_unlock()
3023 ar); in ath10k_mac_tx_unlock()
3025 ieee80211_wake_queue(ar->hw, ar->hw->offchannel_tx_hw_queue); in ath10k_mac_tx_unlock()
3030 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_tx_lock() local
3032 lockdep_assert_held(&ar->htt.tx_lock); in ath10k_mac_vif_tx_lock()
3036 ieee80211_stop_queue(ar->hw, arvif->vdev_id); in ath10k_mac_vif_tx_lock()
3041 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_tx_unlock() local
3043 lockdep_assert_held(&ar->htt.tx_lock); in ath10k_mac_vif_tx_unlock()
3048 if (ar->tx_paused) in ath10k_mac_vif_tx_unlock()
3054 ieee80211_wake_queue(ar->hw, arvif->vdev_id); in ath10k_mac_vif_tx_unlock()
3061 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_handle_tx_pause() local
3063 lockdep_assert_held(&ar->htt.tx_lock); in ath10k_mac_vif_handle_tx_pause()
3073 ath10k_warn(ar, "received unknown tx pause action %d on vdev %i, ignoring\n", in ath10k_mac_vif_handle_tx_pause()
3097 void ath10k_mac_handle_tx_pause_vdev(struct ath10k *ar, u32 vdev_id, in ath10k_mac_handle_tx_pause_vdev() argument
3107 spin_lock_bh(&ar->htt.tx_lock); in ath10k_mac_handle_tx_pause_vdev()
3108 ieee80211_iterate_active_interfaces_atomic(ar->hw, in ath10k_mac_handle_tx_pause_vdev()
3112 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_handle_tx_pause_vdev()
3129 static u8 ath10k_tx_h_get_vdev_id(struct ath10k *ar, struct ieee80211_vif *vif) in ath10k_tx_h_get_vdev_id() argument
3134 if (ar->monitor_started) in ath10k_tx_h_get_vdev_id()
3135 return ar->monitor_vdev_id; in ath10k_tx_h_get_vdev_id()
3137 ath10k_warn(ar, "failed to resolve vdev id\n"); in ath10k_tx_h_get_vdev_id()
3142 ath10k_tx_h_get_txmode(struct ath10k *ar, struct ieee80211_vif *vif, in ath10k_tx_h_get_txmode() argument
3170 if (ar->htt.target_version_major < 3 && in ath10k_tx_h_get_txmode()
3172 !test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX, ar->fw_features)) in ath10k_tx_h_get_txmode()
3186 if (test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) in ath10k_tx_h_get_txmode()
3259 static void ath10k_tx_h_add_p2p_noa_ie(struct ath10k *ar, in ath10k_tx_h_add_p2p_noa_ie() argument
3272 spin_lock_bh(&ar->data_lock); in ath10k_tx_h_add_p2p_noa_ie()
3279 spin_unlock_bh(&ar->data_lock); in ath10k_tx_h_add_p2p_noa_ie()
3283 static bool ath10k_mac_need_offchan_tx_work(struct ath10k *ar) in ath10k_mac_need_offchan_tx_work() argument
3291 return !(ar->htt.target_version_major >= 3 && in ath10k_mac_need_offchan_tx_work()
3292 ar->htt.target_version_minor >= 4); in ath10k_mac_need_offchan_tx_work()
3295 static int ath10k_mac_tx_wmi_mgmt(struct ath10k *ar, struct sk_buff *skb) in ath10k_mac_tx_wmi_mgmt() argument
3297 struct sk_buff_head *q = &ar->wmi_mgmt_tx_queue; in ath10k_mac_tx_wmi_mgmt()
3300 spin_lock_bh(&ar->data_lock); in ath10k_mac_tx_wmi_mgmt()
3303 ath10k_warn(ar, "wmi mgmt tx queue is full\n"); in ath10k_mac_tx_wmi_mgmt()
3309 ieee80211_queue_work(ar->hw, &ar->wmi_mgmt_tx_work); in ath10k_mac_tx_wmi_mgmt()
3312 spin_unlock_bh(&ar->data_lock); in ath10k_mac_tx_wmi_mgmt()
3317 static void ath10k_mac_tx(struct ath10k *ar, struct sk_buff *skb) in ath10k_mac_tx() argument
3320 struct ath10k_htt *htt = &ar->htt; in ath10k_mac_tx()
3331 ar->fw_features)) in ath10k_mac_tx()
3332 ret = ath10k_mac_tx_wmi_mgmt(ar, skb); in ath10k_mac_tx()
3333 else if (ar->htt.target_version_major >= 3) in ath10k_mac_tx()
3341 ath10k_warn(ar, "failed to transmit packet, dropping: %d\n", in ath10k_mac_tx()
3343 ieee80211_free_txskb(ar->hw, skb); in ath10k_mac_tx()
3347 void ath10k_offchan_tx_purge(struct ath10k *ar) in ath10k_offchan_tx_purge() argument
3352 skb = skb_dequeue(&ar->offchan_tx_queue); in ath10k_offchan_tx_purge()
3356 ieee80211_free_txskb(ar->hw, skb); in ath10k_offchan_tx_purge()
3362 struct ath10k *ar = container_of(work, struct ath10k, offchan_tx_work); in ath10k_offchan_tx_work() local
3380 skb = skb_dequeue(&ar->offchan_tx_queue); in ath10k_offchan_tx_work()
3384 mutex_lock(&ar->conf_mutex); in ath10k_offchan_tx_work()
3386 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac offchannel skb %p\n", in ath10k_offchan_tx_work()
3393 spin_lock_bh(&ar->data_lock); in ath10k_offchan_tx_work()
3394 peer = ath10k_peer_find(ar, vdev_id, peer_addr); in ath10k_offchan_tx_work()
3395 spin_unlock_bh(&ar->data_lock); in ath10k_offchan_tx_work()
3399 ath10k_dbg(ar, ATH10K_DBG_MAC, "peer %pM on vdev %d already present\n", in ath10k_offchan_tx_work()
3403 ret = ath10k_peer_create(ar, vdev_id, peer_addr, in ath10k_offchan_tx_work()
3406 ath10k_warn(ar, "failed to create peer %pM on vdev %d: %d\n", in ath10k_offchan_tx_work()
3411 spin_lock_bh(&ar->data_lock); in ath10k_offchan_tx_work()
3412 reinit_completion(&ar->offchan_tx_completed); in ath10k_offchan_tx_work()
3413 ar->offchan_tx_skb = skb; in ath10k_offchan_tx_work()
3414 spin_unlock_bh(&ar->data_lock); in ath10k_offchan_tx_work()
3416 ath10k_mac_tx(ar, skb); in ath10k_offchan_tx_work()
3419 wait_for_completion_timeout(&ar->offchan_tx_completed, 3 * HZ); in ath10k_offchan_tx_work()
3421 ath10k_warn(ar, "timed out waiting for offchannel skb %p\n", in ath10k_offchan_tx_work()
3425 ret = ath10k_peer_delete(ar, vdev_id, peer_addr); in ath10k_offchan_tx_work()
3427 ath10k_warn(ar, "failed to delete peer %pM on vdev %d: %d\n", in ath10k_offchan_tx_work()
3431 mutex_unlock(&ar->conf_mutex); in ath10k_offchan_tx_work()
3435 void ath10k_mgmt_over_wmi_tx_purge(struct ath10k *ar) in ath10k_mgmt_over_wmi_tx_purge() argument
3440 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue); in ath10k_mgmt_over_wmi_tx_purge()
3444 ieee80211_free_txskb(ar->hw, skb); in ath10k_mgmt_over_wmi_tx_purge()
3450 struct ath10k *ar = container_of(work, struct ath10k, wmi_mgmt_tx_work); in ath10k_mgmt_over_wmi_tx_work() local
3455 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue); in ath10k_mgmt_over_wmi_tx_work()
3459 ret = ath10k_wmi_mgmt_tx(ar, skb); in ath10k_mgmt_over_wmi_tx_work()
3461 ath10k_warn(ar, "failed to transmit management frame via WMI: %d\n", in ath10k_mgmt_over_wmi_tx_work()
3463 ieee80211_free_txskb(ar->hw, skb); in ath10k_mgmt_over_wmi_tx_work()
3472 void __ath10k_scan_finish(struct ath10k *ar) in __ath10k_scan_finish() argument
3474 lockdep_assert_held(&ar->data_lock); in __ath10k_scan_finish()
3476 switch (ar->scan.state) { in __ath10k_scan_finish()
3481 if (!ar->scan.is_roc) in __ath10k_scan_finish()
3482 ieee80211_scan_completed(ar->hw, in __ath10k_scan_finish()
3483 (ar->scan.state == in __ath10k_scan_finish()
3485 else if (ar->scan.roc_notify) in __ath10k_scan_finish()
3486 ieee80211_remain_on_channel_expired(ar->hw); in __ath10k_scan_finish()
3489 ar->scan.state = ATH10K_SCAN_IDLE; in __ath10k_scan_finish()
3490 ar->scan_channel = NULL; in __ath10k_scan_finish()
3491 ath10k_offchan_tx_purge(ar); in __ath10k_scan_finish()
3492 cancel_delayed_work(&ar->scan.timeout); in __ath10k_scan_finish()
3493 complete_all(&ar->scan.completed); in __ath10k_scan_finish()
3498 void ath10k_scan_finish(struct ath10k *ar) in ath10k_scan_finish() argument
3500 spin_lock_bh(&ar->data_lock); in ath10k_scan_finish()
3501 __ath10k_scan_finish(ar); in ath10k_scan_finish()
3502 spin_unlock_bh(&ar->data_lock); in ath10k_scan_finish()
3505 static int ath10k_scan_stop(struct ath10k *ar) in ath10k_scan_stop() argument
3514 lockdep_assert_held(&ar->conf_mutex); in ath10k_scan_stop()
3516 ret = ath10k_wmi_stop_scan(ar, &arg); in ath10k_scan_stop()
3518 ath10k_warn(ar, "failed to stop wmi scan: %d\n", ret); in ath10k_scan_stop()
3522 ret = wait_for_completion_timeout(&ar->scan.completed, 3*HZ); in ath10k_scan_stop()
3524 ath10k_warn(ar, "failed to receive scan abortion completion: timed out\n"); in ath10k_scan_stop()
3538 spin_lock_bh(&ar->data_lock); in ath10k_scan_stop()
3539 if (ar->scan.state != ATH10K_SCAN_IDLE) in ath10k_scan_stop()
3540 __ath10k_scan_finish(ar); in ath10k_scan_stop()
3541 spin_unlock_bh(&ar->data_lock); in ath10k_scan_stop()
3546 static void ath10k_scan_abort(struct ath10k *ar) in ath10k_scan_abort() argument
3550 lockdep_assert_held(&ar->conf_mutex); in ath10k_scan_abort()
3552 spin_lock_bh(&ar->data_lock); in ath10k_scan_abort()
3554 switch (ar->scan.state) { in ath10k_scan_abort()
3562 ath10k_warn(ar, "refusing scan abortion due to invalid scan state: %s (%d)\n", in ath10k_scan_abort()
3563 ath10k_scan_state_str(ar->scan.state), in ath10k_scan_abort()
3564 ar->scan.state); in ath10k_scan_abort()
3567 ar->scan.state = ATH10K_SCAN_ABORTING; in ath10k_scan_abort()
3568 spin_unlock_bh(&ar->data_lock); in ath10k_scan_abort()
3570 ret = ath10k_scan_stop(ar); in ath10k_scan_abort()
3572 ath10k_warn(ar, "failed to abort scan: %d\n", ret); in ath10k_scan_abort()
3574 spin_lock_bh(&ar->data_lock); in ath10k_scan_abort()
3578 spin_unlock_bh(&ar->data_lock); in ath10k_scan_abort()
3583 struct ath10k *ar = container_of(work, struct ath10k, in ath10k_scan_timeout_work() local
3586 mutex_lock(&ar->conf_mutex); in ath10k_scan_timeout_work()
3587 ath10k_scan_abort(ar); in ath10k_scan_timeout_work()
3588 mutex_unlock(&ar->conf_mutex); in ath10k_scan_timeout_work()
3591 static int ath10k_start_scan(struct ath10k *ar, in ath10k_start_scan() argument
3596 lockdep_assert_held(&ar->conf_mutex); in ath10k_start_scan()
3598 ret = ath10k_wmi_start_scan(ar, arg); in ath10k_start_scan()
3602 ret = wait_for_completion_timeout(&ar->scan.started, 1*HZ); in ath10k_start_scan()
3604 ret = ath10k_scan_stop(ar); in ath10k_start_scan()
3606 ath10k_warn(ar, "failed to stop scan: %d\n", ret); in ath10k_start_scan()
3615 spin_lock_bh(&ar->data_lock); in ath10k_start_scan()
3616 if (ar->scan.state == ATH10K_SCAN_IDLE) { in ath10k_start_scan()
3617 spin_unlock_bh(&ar->data_lock); in ath10k_start_scan()
3620 spin_unlock_bh(&ar->data_lock); in ath10k_start_scan()
3633 struct ath10k *ar = hw->priv; in ath10k_tx() local
3642 ath10k_dbg(ar, ATH10K_DBG_MAC, "IEEE80211_TX_CTL_NO_CCK_RATE\n"); in ath10k_tx()
3648 ATH10K_SKB_CB(skb)->vdev_id = ath10k_tx_h_get_vdev_id(ar, vif); in ath10k_tx()
3649 ATH10K_SKB_CB(skb)->txmode = ath10k_tx_h_get_txmode(ar, vif, sta, skb); in ath10k_tx()
3656 ath10k_tx_h_add_p2p_noa_ie(ar, vif, skb); in ath10k_tx()
3663 if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) { in ath10k_tx()
3671 spin_lock_bh(&ar->data_lock); in ath10k_tx()
3672 ATH10K_SKB_CB(skb)->htt.freq = ar->scan.roc_freq; in ath10k_tx()
3673 ATH10K_SKB_CB(skb)->vdev_id = ar->scan.vdev_id; in ath10k_tx()
3674 spin_unlock_bh(&ar->data_lock); in ath10k_tx()
3676 if (ath10k_mac_need_offchan_tx_work(ar)) { in ath10k_tx()
3680 ath10k_dbg(ar, ATH10K_DBG_MAC, "queued offchannel skb %p\n", in ath10k_tx()
3683 skb_queue_tail(&ar->offchan_tx_queue, skb); in ath10k_tx()
3684 ieee80211_queue_work(hw, &ar->offchan_tx_work); in ath10k_tx()
3689 ath10k_mac_tx(ar, skb); in ath10k_tx()
3693 void ath10k_drain_tx(struct ath10k *ar) in ath10k_drain_tx() argument
3698 ath10k_offchan_tx_purge(ar); in ath10k_drain_tx()
3699 ath10k_mgmt_over_wmi_tx_purge(ar); in ath10k_drain_tx()
3701 cancel_work_sync(&ar->offchan_tx_work); in ath10k_drain_tx()
3702 cancel_work_sync(&ar->wmi_mgmt_tx_work); in ath10k_drain_tx()
3705 void ath10k_halt(struct ath10k *ar) in ath10k_halt() argument
3709 lockdep_assert_held(&ar->conf_mutex); in ath10k_halt()
3711 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags); in ath10k_halt()
3712 ar->filter_flags = 0; in ath10k_halt()
3713 ar->monitor = false; in ath10k_halt()
3714 ar->monitor_arvif = NULL; in ath10k_halt()
3716 if (ar->monitor_started) in ath10k_halt()
3717 ath10k_monitor_stop(ar); in ath10k_halt()
3719 ar->monitor_started = false; in ath10k_halt()
3720 ar->tx_paused = 0; in ath10k_halt()
3722 ath10k_scan_finish(ar); in ath10k_halt()
3723 ath10k_peer_cleanup_all(ar); in ath10k_halt()
3724 ath10k_core_stop(ar); in ath10k_halt()
3725 ath10k_hif_power_down(ar); in ath10k_halt()
3727 spin_lock_bh(&ar->data_lock); in ath10k_halt()
3728 list_for_each_entry(arvif, &ar->arvifs, list) in ath10k_halt()
3730 spin_unlock_bh(&ar->data_lock); in ath10k_halt()
3735 struct ath10k *ar = hw->priv; in ath10k_get_antenna() local
3737 mutex_lock(&ar->conf_mutex); in ath10k_get_antenna()
3739 *tx_ant = ar->cfg_tx_chainmask; in ath10k_get_antenna()
3740 *rx_ant = ar->cfg_rx_chainmask; in ath10k_get_antenna()
3742 mutex_unlock(&ar->conf_mutex); in ath10k_get_antenna()
3747 static void ath10k_check_chain_mask(struct ath10k *ar, u32 cm, const char *dbg) in ath10k_check_chain_mask() argument
3756 …ath10k_warn(ar, "mac %s antenna chainmask may be invalid: 0x%x. Suggested values: 15, 7, 3, 1 or … in ath10k_check_chain_mask()
3760 static int ath10k_mac_get_vht_cap_bf_sts(struct ath10k *ar) in ath10k_mac_get_vht_cap_bf_sts() argument
3762 int nsts = ar->vht_cap_info; in ath10k_mac_get_vht_cap_bf_sts()
3777 static int ath10k_mac_get_vht_cap_bf_sound_dim(struct ath10k *ar) in ath10k_mac_get_vht_cap_bf_sound_dim() argument
3779 int sound_dim = ar->vht_cap_info; in ath10k_mac_get_vht_cap_bf_sound_dim()
3793 static struct ieee80211_sta_vht_cap ath10k_create_vht_cap(struct ath10k *ar) in ath10k_create_vht_cap() argument
3801 vht_cap.cap = ar->vht_cap_info; in ath10k_create_vht_cap()
3803 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE | in ath10k_create_vht_cap()
3805 val = ath10k_mac_get_vht_cap_bf_sts(ar); in ath10k_create_vht_cap()
3812 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE | in ath10k_create_vht_cap()
3814 val = ath10k_mac_get_vht_cap_bf_sound_dim(ar); in ath10k_create_vht_cap()
3823 if ((i < ar->num_rf_chains) && (ar->cfg_tx_chainmask & BIT(i))) in ath10k_create_vht_cap()
3835 static struct ieee80211_sta_ht_cap ath10k_get_ht_cap(struct ath10k *ar) in ath10k_get_ht_cap() argument
3840 if (!(ar->ht_cap_info & WMI_HT_CAP_ENABLED)) in ath10k_get_ht_cap()
3850 if (ar->ht_cap_info & WMI_HT_CAP_HT20_SGI) in ath10k_get_ht_cap()
3853 if (ar->ht_cap_info & WMI_HT_CAP_HT40_SGI) in ath10k_get_ht_cap()
3856 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) { in ath10k_get_ht_cap()
3865 if (ar->ht_cap_info & WMI_HT_CAP_TX_STBC) in ath10k_get_ht_cap()
3868 if (ar->ht_cap_info & WMI_HT_CAP_RX_STBC) { in ath10k_get_ht_cap()
3871 stbc = ar->ht_cap_info; in ath10k_get_ht_cap()
3880 if (ar->ht_cap_info & WMI_HT_CAP_LDPC) in ath10k_get_ht_cap()
3883 if (ar->ht_cap_info & WMI_HT_CAP_L_SIG_TXOP_PROT) in ath10k_get_ht_cap()
3887 if (ar->vht_cap_info & WMI_VHT_CAP_MAX_MPDU_LEN_MASK) in ath10k_get_ht_cap()
3890 for (i = 0; i < ar->num_rf_chains; i++) { in ath10k_get_ht_cap()
3891 if (ar->cfg_rx_chainmask & BIT(i)) in ath10k_get_ht_cap()
3900 static void ath10k_mac_setup_ht_vht_cap(struct ath10k *ar) in ath10k_mac_setup_ht_vht_cap() argument
3906 ht_cap = ath10k_get_ht_cap(ar); in ath10k_mac_setup_ht_vht_cap()
3907 vht_cap = ath10k_create_vht_cap(ar); in ath10k_mac_setup_ht_vht_cap()
3909 if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) { in ath10k_mac_setup_ht_vht_cap()
3910 band = &ar->mac.sbands[IEEE80211_BAND_2GHZ]; in ath10k_mac_setup_ht_vht_cap()
3916 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) { in ath10k_mac_setup_ht_vht_cap()
3917 band = &ar->mac.sbands[IEEE80211_BAND_5GHZ]; in ath10k_mac_setup_ht_vht_cap()
3923 static int __ath10k_set_antenna(struct ath10k *ar, u32 tx_ant, u32 rx_ant) in __ath10k_set_antenna() argument
3927 lockdep_assert_held(&ar->conf_mutex); in __ath10k_set_antenna()
3929 ath10k_check_chain_mask(ar, tx_ant, "tx"); in __ath10k_set_antenna()
3930 ath10k_check_chain_mask(ar, rx_ant, "rx"); in __ath10k_set_antenna()
3932 ar->cfg_tx_chainmask = tx_ant; in __ath10k_set_antenna()
3933 ar->cfg_rx_chainmask = rx_ant; in __ath10k_set_antenna()
3935 if ((ar->state != ATH10K_STATE_ON) && in __ath10k_set_antenna()
3936 (ar->state != ATH10K_STATE_RESTARTED)) in __ath10k_set_antenna()
3939 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->tx_chain_mask, in __ath10k_set_antenna()
3942 ath10k_warn(ar, "failed to set tx-chainmask: %d, req 0x%x\n", in __ath10k_set_antenna()
3947 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->rx_chain_mask, in __ath10k_set_antenna()
3950 ath10k_warn(ar, "failed to set rx-chainmask: %d, req 0x%x\n", in __ath10k_set_antenna()
3956 ath10k_mac_setup_ht_vht_cap(ar); in __ath10k_set_antenna()
3963 struct ath10k *ar = hw->priv; in ath10k_set_antenna() local
3966 mutex_lock(&ar->conf_mutex); in ath10k_set_antenna()
3967 ret = __ath10k_set_antenna(ar, tx_ant, rx_ant); in ath10k_set_antenna()
3968 mutex_unlock(&ar->conf_mutex); in ath10k_set_antenna()
3974 struct ath10k *ar = hw->priv; in ath10k_start() local
3983 ath10k_drain_tx(ar); in ath10k_start()
3985 mutex_lock(&ar->conf_mutex); in ath10k_start()
3987 switch (ar->state) { in ath10k_start()
3989 ar->state = ATH10K_STATE_ON; in ath10k_start()
3992 ath10k_halt(ar); in ath10k_start()
3993 ar->state = ATH10K_STATE_RESTARTED; in ath10k_start()
4006 ret = ath10k_hif_power_up(ar); in ath10k_start()
4008 ath10k_err(ar, "Could not init hif: %d\n", ret); in ath10k_start()
4012 ret = ath10k_core_start(ar, ATH10K_FIRMWARE_MODE_NORMAL); in ath10k_start()
4014 ath10k_err(ar, "Could not init core: %d\n", ret); in ath10k_start()
4018 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->pmf_qos, 1); in ath10k_start()
4020 ath10k_warn(ar, "failed to enable PMF QOS: %d\n", ret); in ath10k_start()
4024 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->dynamic_bw, 1); in ath10k_start()
4026 ath10k_warn(ar, "failed to enable dynamic BW: %d\n", ret); in ath10k_start()
4030 if (test_bit(WMI_SERVICE_ADAPTIVE_OCS, ar->wmi.svc_map)) { in ath10k_start()
4031 ret = ath10k_wmi_adaptive_qcs(ar, true); in ath10k_start()
4033 ath10k_warn(ar, "failed to enable adaptive qcs: %d\n", in ath10k_start()
4039 if (test_bit(WMI_SERVICE_BURST, ar->wmi.svc_map)) { in ath10k_start()
4040 burst_enable = ar->wmi.pdev_param->burst_enable; in ath10k_start()
4041 ret = ath10k_wmi_pdev_set_param(ar, burst_enable, 0); in ath10k_start()
4043 ath10k_warn(ar, "failed to disable burst: %d\n", ret); in ath10k_start()
4048 __ath10k_set_antenna(ar, ar->cfg_tx_chainmask, ar->cfg_rx_chainmask); in ath10k_start()
4059 ret = ath10k_wmi_pdev_set_param(ar, in ath10k_start()
4060 ar->wmi.pdev_param->arp_ac_override, 0); in ath10k_start()
4062 ath10k_warn(ar, "failed to set arp ac override parameter: %d\n", in ath10k_start()
4068 ar->fw_features)) { in ath10k_start()
4069 ret = ath10k_wmi_pdev_enable_adaptive_cca(ar, 1, in ath10k_start()
4073 ath10k_warn(ar, "failed to enable adaptive cca: %d\n", in ath10k_start()
4079 ret = ath10k_wmi_pdev_set_param(ar, in ath10k_start()
4080 ar->wmi.pdev_param->ani_enable, 1); in ath10k_start()
4082 ath10k_warn(ar, "failed to enable ani by default: %d\n", in ath10k_start()
4087 ar->ani_enabled = true; in ath10k_start()
4089 ar->num_started_vdevs = 0; in ath10k_start()
4090 ath10k_regd_update(ar); in ath10k_start()
4092 ath10k_spectral_start(ar); in ath10k_start()
4093 ath10k_thermal_set_throttling(ar); in ath10k_start()
4095 mutex_unlock(&ar->conf_mutex); in ath10k_start()
4099 ath10k_core_stop(ar); in ath10k_start()
4102 ath10k_hif_power_down(ar); in ath10k_start()
4105 ar->state = ATH10K_STATE_OFF; in ath10k_start()
4108 mutex_unlock(&ar->conf_mutex); in ath10k_start()
4114 struct ath10k *ar = hw->priv; in ath10k_stop() local
4116 ath10k_drain_tx(ar); in ath10k_stop()
4118 mutex_lock(&ar->conf_mutex); in ath10k_stop()
4119 if (ar->state != ATH10K_STATE_OFF) { in ath10k_stop()
4120 ath10k_halt(ar); in ath10k_stop()
4121 ar->state = ATH10K_STATE_OFF; in ath10k_stop()
4123 mutex_unlock(&ar->conf_mutex); in ath10k_stop()
4125 cancel_delayed_work_sync(&ar->scan.timeout); in ath10k_stop()
4126 cancel_work_sync(&ar->restart_work); in ath10k_stop()
4129 static int ath10k_config_ps(struct ath10k *ar) in ath10k_config_ps() argument
4134 lockdep_assert_held(&ar->conf_mutex); in ath10k_config_ps()
4136 list_for_each_entry(arvif, &ar->arvifs, list) { in ath10k_config_ps()
4139 ath10k_warn(ar, "failed to setup powersave: %d\n", ret); in ath10k_config_ps()
4147 static int ath10k_mac_txpower_setup(struct ath10k *ar, int txpower) in ath10k_mac_txpower_setup() argument
4152 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_txpower_setup()
4154 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac txpower %d\n", txpower); in ath10k_mac_txpower_setup()
4156 param = ar->wmi.pdev_param->txpower_limit2g; in ath10k_mac_txpower_setup()
4157 ret = ath10k_wmi_pdev_set_param(ar, param, txpower * 2); in ath10k_mac_txpower_setup()
4159 ath10k_warn(ar, "failed to set 2g txpower %d: %d\n", in ath10k_mac_txpower_setup()
4164 param = ar->wmi.pdev_param->txpower_limit5g; in ath10k_mac_txpower_setup()
4165 ret = ath10k_wmi_pdev_set_param(ar, param, txpower * 2); in ath10k_mac_txpower_setup()
4167 ath10k_warn(ar, "failed to set 5g txpower %d: %d\n", in ath10k_mac_txpower_setup()
4175 static int ath10k_mac_txpower_recalc(struct ath10k *ar) in ath10k_mac_txpower_recalc() argument
4180 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_txpower_recalc()
4182 list_for_each_entry(arvif, &ar->arvifs, list) { in ath10k_mac_txpower_recalc()
4194 ret = ath10k_mac_txpower_setup(ar, txpower); in ath10k_mac_txpower_recalc()
4196 ath10k_warn(ar, "failed to setup tx power %d: %d\n", in ath10k_mac_txpower_recalc()
4206 struct ath10k *ar = hw->priv; in ath10k_config() local
4210 mutex_lock(&ar->conf_mutex); in ath10k_config()
4213 ath10k_config_ps(ar); in ath10k_config()
4216 ar->monitor = conf->flags & IEEE80211_CONF_MONITOR; in ath10k_config()
4217 ret = ath10k_monitor_recalc(ar); in ath10k_config()
4219 ath10k_warn(ar, "failed to recalc monitor: %d\n", ret); in ath10k_config()
4222 mutex_unlock(&ar->conf_mutex); in ath10k_config()
4240 struct ath10k *ar = arvif->ar; in ath10k_mac_set_txbf_conf() local
4244 if (ath10k_wmi_get_txbf_conf_scheme(ar) != WMI_TXBF_CONF_BEFORE_ASSOC) in ath10k_mac_set_txbf_conf()
4247 nsts = ath10k_mac_get_vht_cap_bf_sts(ar); in ath10k_mac_set_txbf_conf()
4248 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE | in ath10k_mac_set_txbf_conf()
4252 sound_dim = ath10k_mac_get_vht_cap_bf_sound_dim(ar); in ath10k_mac_set_txbf_conf()
4253 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE | in ath10k_mac_set_txbf_conf()
4260 if (ar->vht_cap_info & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE) in ath10k_mac_set_txbf_conf()
4263 if (ar->vht_cap_info & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE) in ath10k_mac_set_txbf_conf()
4267 if (ar->vht_cap_info & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE) in ath10k_mac_set_txbf_conf()
4270 if (ar->vht_cap_info & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE) in ath10k_mac_set_txbf_conf()
4274 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, in ath10k_mac_set_txbf_conf()
4275 ar->wmi.vdev_param->txbf, value); in ath10k_mac_set_txbf_conf()
4288 struct ath10k *ar = hw->priv; in ath10k_add_interface() local
4299 mutex_lock(&ar->conf_mutex); in ath10k_add_interface()
4303 arvif->ar = ar; in ath10k_add_interface()
4319 if (ar->num_peers >= ar->max_num_peers) { in ath10k_add_interface()
4320 ath10k_warn(ar, "refusing vdev creation due to insufficient peer entry resources in firmware\n"); in ath10k_add_interface()
4325 if (ar->free_vdev_map == 0) { in ath10k_add_interface()
4326 ath10k_warn(ar, "Free vdev map is empty, no more interfaces allowed.\n"); in ath10k_add_interface()
4330 bit = __ffs64(ar->free_vdev_map); in ath10k_add_interface()
4332 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac create vdev %i map %llx\n", in ath10k_add_interface()
4333 bit, ar->free_vdev_map); in ath10k_add_interface()
4353 if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) { in ath10k_add_interface()
4355 ath10k_warn(ar, "must load driver with rawmode=1 to add mesh interfaces\n"); in ath10k_add_interface()
4402 arvif->beacon_buf = dma_zalloc_coherent(ar->dev, in ath10k_add_interface()
4408 ath10k_warn(ar, "failed to allocate beacon buffer: %d\n", in ath10k_add_interface()
4413 if (test_bit(ATH10K_FLAG_HW_CRYPTO_DISABLED, &ar->dev_flags)) in ath10k_add_interface()
4417 !test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) { in ath10k_add_interface()
4418 ath10k_warn(ar, "cryptmode module param needed for sw crypto\n"); in ath10k_add_interface()
4422 …ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev create %d (add interface) type %d subtype %d bcnmode %s\n… in ath10k_add_interface()
4426 ret = ath10k_wmi_vdev_create(ar, arvif->vdev_id, arvif->vdev_type, in ath10k_add_interface()
4429 ath10k_warn(ar, "failed to create WMI vdev %i: %d\n", in ath10k_add_interface()
4434 ar->free_vdev_map &= ~(1LL << arvif->vdev_id); in ath10k_add_interface()
4435 list_add(&arvif->list, &ar->arvifs); in ath10k_add_interface()
4442 ath10k_warn(ar, "failed to disable keepalive on vdev %i: %d\n", in ath10k_add_interface()
4449 vdev_param = ar->wmi.vdev_param->tx_encap_type; in ath10k_add_interface()
4450 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_add_interface()
4454 ath10k_warn(ar, "failed to set vdev %i TX encapsulation: %d\n", in ath10k_add_interface()
4462 if (ar->cfg_tx_chainmask && (vif->type != NL80211_IFTYPE_MONITOR)) { in ath10k_add_interface()
4463 u16 nss = get_nss_from_chainmask(ar->cfg_tx_chainmask); in ath10k_add_interface()
4465 vdev_param = ar->wmi.vdev_param->nss; in ath10k_add_interface()
4466 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_add_interface()
4469 ath10k_warn(ar, "failed to set vdev %i chainmask 0x%x, nss %i: %d\n", in ath10k_add_interface()
4470 arvif->vdev_id, ar->cfg_tx_chainmask, nss, in ath10k_add_interface()
4478 ret = ath10k_peer_create(ar, arvif->vdev_id, vif->addr, in ath10k_add_interface()
4481 ath10k_warn(ar, "failed to create vdev %i peer for AP/IBSS: %d\n", in ath10k_add_interface()
4490 ath10k_warn(ar, "failed to set vdev %i kickout parameters: %d\n", in ath10k_add_interface()
4499 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath10k_add_interface()
4502 ath10k_warn(ar, "failed to set vdev %i RX wake policy: %d\n", in ath10k_add_interface()
4509 ath10k_warn(ar, "failed to recalc ps wake threshold on vdev %i: %d\n", in ath10k_add_interface()
4516 ath10k_warn(ar, "failed to recalc ps poll count on vdev %i: %d\n", in ath10k_add_interface()
4524 ath10k_warn(ar, "failed to set txbf for vdev %d: %d\n", in ath10k_add_interface()
4529 ret = ath10k_mac_set_rts(arvif, ar->hw->wiphy->rts_threshold); in ath10k_add_interface()
4531 ath10k_warn(ar, "failed to set rts threshold for vdev %d: %d\n", in ath10k_add_interface()
4537 ret = ath10k_mac_txpower_recalc(ar); in ath10k_add_interface()
4539 ath10k_warn(ar, "failed to recalc tx power: %d\n", ret); in ath10k_add_interface()
4544 ar->monitor_arvif = arvif; in ath10k_add_interface()
4545 ret = ath10k_monitor_recalc(ar); in ath10k_add_interface()
4547 ath10k_warn(ar, "failed to recalc monitor: %d\n", ret); in ath10k_add_interface()
4552 spin_lock_bh(&ar->htt.tx_lock); in ath10k_add_interface()
4553 if (!ar->tx_paused) in ath10k_add_interface()
4554 ieee80211_wake_queue(ar->hw, arvif->vdev_id); in ath10k_add_interface()
4555 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_add_interface()
4557 mutex_unlock(&ar->conf_mutex); in ath10k_add_interface()
4563 ath10k_wmi_peer_delete(ar, arvif->vdev_id, vif->addr); in ath10k_add_interface()
4566 ath10k_wmi_vdev_delete(ar, arvif->vdev_id); in ath10k_add_interface()
4567 ar->free_vdev_map |= 1LL << arvif->vdev_id; in ath10k_add_interface()
4572 dma_free_coherent(ar->dev, IEEE80211_MAX_FRAME_LEN, in ath10k_add_interface()
4577 mutex_unlock(&ar->conf_mutex); in ath10k_add_interface()
4593 struct ath10k *ar = hw->priv; in ath10k_remove_interface() local
4600 mutex_lock(&ar->conf_mutex); in ath10k_remove_interface()
4602 spin_lock_bh(&ar->data_lock); in ath10k_remove_interface()
4604 spin_unlock_bh(&ar->data_lock); in ath10k_remove_interface()
4608 ath10k_warn(ar, "failed to stop spectral for vdev %i: %d\n", in ath10k_remove_interface()
4611 ar->free_vdev_map |= 1LL << arvif->vdev_id; in ath10k_remove_interface()
4616 ret = ath10k_wmi_peer_delete(arvif->ar, arvif->vdev_id, in ath10k_remove_interface()
4619 ath10k_warn(ar, "failed to submit AP/IBSS self-peer removal on vdev %i: %d\n", in ath10k_remove_interface()
4625 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i delete (remove interface)\n", in ath10k_remove_interface()
4628 ret = ath10k_wmi_vdev_delete(ar, arvif->vdev_id); in ath10k_remove_interface()
4630 ath10k_warn(ar, "failed to delete WMI vdev %i: %d\n", in ath10k_remove_interface()
4638 ret = ath10k_wait_for_peer_deleted(ar, arvif->vdev_id, in ath10k_remove_interface()
4641 ath10k_warn(ar, "failed to remove AP self-peer on vdev %i: %d\n", in ath10k_remove_interface()
4644 spin_lock_bh(&ar->data_lock); in ath10k_remove_interface()
4645 ar->num_peers--; in ath10k_remove_interface()
4646 spin_unlock_bh(&ar->data_lock); in ath10k_remove_interface()
4649 ath10k_peer_cleanup(ar, arvif->vdev_id); in ath10k_remove_interface()
4652 ar->monitor_arvif = NULL; in ath10k_remove_interface()
4653 ret = ath10k_monitor_recalc(ar); in ath10k_remove_interface()
4655 ath10k_warn(ar, "failed to recalc monitor: %d\n", ret); in ath10k_remove_interface()
4658 spin_lock_bh(&ar->htt.tx_lock); in ath10k_remove_interface()
4660 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_remove_interface()
4662 mutex_unlock(&ar->conf_mutex); in ath10k_remove_interface()
4682 struct ath10k *ar = hw->priv; in ath10k_configure_filter() local
4685 mutex_lock(&ar->conf_mutex); in ath10k_configure_filter()
4689 ar->filter_flags = *total_flags; in ath10k_configure_filter()
4691 ret = ath10k_monitor_recalc(ar); in ath10k_configure_filter()
4693 ath10k_warn(ar, "failed to recalc montior: %d\n", ret); in ath10k_configure_filter()
4695 mutex_unlock(&ar->conf_mutex); in ath10k_configure_filter()
4703 struct ath10k *ar = hw->priv; in ath10k_bss_info_changed() local
4708 mutex_lock(&ar->conf_mutex); in ath10k_bss_info_changed()
4715 vdev_param = ar->wmi.vdev_param->beacon_interval; in ath10k_bss_info_changed()
4716 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_bss_info_changed()
4718 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_bss_info_changed()
4723 ath10k_warn(ar, "failed to set beacon interval for vdev %d: %i\n", in ath10k_bss_info_changed()
4728 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_bss_info_changed()
4732 pdev_param = ar->wmi.pdev_param->beacon_tx_mode; in ath10k_bss_info_changed()
4733 ret = ath10k_wmi_pdev_set_param(ar, pdev_param, in ath10k_bss_info_changed()
4736 ath10k_warn(ar, "failed to set beacon mode for vdev %d: %i\n", in ath10k_bss_info_changed()
4741 ath10k_warn(ar, "failed to update beacon template: %d\n", in ath10k_bss_info_changed()
4755 ath10k_warn(ar, "failed to setup probe resp template on vdev %i: %d\n", in ath10k_bss_info_changed()
4762 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_bss_info_changed()
4766 vdev_param = ar->wmi.vdev_param->dtim_period; in ath10k_bss_info_changed()
4767 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_bss_info_changed()
4770 ath10k_warn(ar, "failed to set dtim period for vdev %d: %i\n", in ath10k_bss_info_changed()
4790 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d cts_prot %d\n", in ath10k_bss_info_changed()
4795 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n", in ath10k_bss_info_changed()
4798 vdev_param = ar->wmi.vdev_param->protection_mode; in ath10k_bss_info_changed()
4799 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_bss_info_changed()
4802 ath10k_warn(ar, "failed to set protection mode %d on vdev %i: %d\n", in ath10k_bss_info_changed()
4813 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d slot_time %d\n", in ath10k_bss_info_changed()
4816 vdev_param = ar->wmi.vdev_param->slot_time; in ath10k_bss_info_changed()
4817 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_bss_info_changed()
4820 ath10k_warn(ar, "failed to set erp slot for vdev %d: %i\n", in ath10k_bss_info_changed()
4830 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_bss_info_changed()
4834 vdev_param = ar->wmi.vdev_param->preamble; in ath10k_bss_info_changed()
4835 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_bss_info_changed()
4838 ath10k_warn(ar, "failed to set preamble for vdev %d: %i\n", in ath10k_bss_info_changed()
4848 if (ar->monitor_started) in ath10k_bss_info_changed()
4849 ath10k_monitor_stop(ar); in ath10k_bss_info_changed()
4851 ath10k_monitor_recalc(ar); in ath10k_bss_info_changed()
4858 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev_id %i txpower %d\n", in ath10k_bss_info_changed()
4862 ret = ath10k_mac_txpower_recalc(ar); in ath10k_bss_info_changed()
4864 ath10k_warn(ar, "failed to recalc tx power: %d\n", ret); in ath10k_bss_info_changed()
4870 ret = ath10k_config_ps(ar); in ath10k_bss_info_changed()
4872 ath10k_warn(ar, "failed to setup ps on vdev %i: %d\n", in ath10k_bss_info_changed()
4876 mutex_unlock(&ar->conf_mutex); in ath10k_bss_info_changed()
4883 struct ath10k *ar = hw->priv; in ath10k_hw_scan() local
4890 mutex_lock(&ar->conf_mutex); in ath10k_hw_scan()
4892 spin_lock_bh(&ar->data_lock); in ath10k_hw_scan()
4893 switch (ar->scan.state) { in ath10k_hw_scan()
4895 reinit_completion(&ar->scan.started); in ath10k_hw_scan()
4896 reinit_completion(&ar->scan.completed); in ath10k_hw_scan()
4897 ar->scan.state = ATH10K_SCAN_STARTING; in ath10k_hw_scan()
4898 ar->scan.is_roc = false; in ath10k_hw_scan()
4899 ar->scan.vdev_id = arvif->vdev_id; in ath10k_hw_scan()
4908 spin_unlock_bh(&ar->data_lock); in ath10k_hw_scan()
4914 ath10k_wmi_start_scan_init(ar, &arg); in ath10k_hw_scan()
4939 ret = ath10k_start_scan(ar, &arg); in ath10k_hw_scan()
4941 ath10k_warn(ar, "failed to start hw scan: %d\n", ret); in ath10k_hw_scan()
4942 spin_lock_bh(&ar->data_lock); in ath10k_hw_scan()
4943 ar->scan.state = ATH10K_SCAN_IDLE; in ath10k_hw_scan()
4944 spin_unlock_bh(&ar->data_lock); in ath10k_hw_scan()
4948 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout, in ath10k_hw_scan()
4953 mutex_unlock(&ar->conf_mutex); in ath10k_hw_scan()
4960 struct ath10k *ar = hw->priv; in ath10k_cancel_hw_scan() local
4962 mutex_lock(&ar->conf_mutex); in ath10k_cancel_hw_scan()
4963 ath10k_scan_abort(ar); in ath10k_cancel_hw_scan()
4964 mutex_unlock(&ar->conf_mutex); in ath10k_cancel_hw_scan()
4966 cancel_delayed_work_sync(&ar->scan.timeout); in ath10k_cancel_hw_scan()
4969 static void ath10k_set_key_h_def_keyidx(struct ath10k *ar, in ath10k_set_key_h_def_keyidx() argument
4974 u32 vdev_param = arvif->ar->wmi.vdev_param->def_keyid; in ath10k_set_key_h_def_keyidx()
5004 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_set_key_h_def_keyidx()
5007 ath10k_warn(ar, "failed to set vdev %i group key as default key: %d\n", in ath10k_set_key_h_def_keyidx()
5015 struct ath10k *ar = hw->priv; in ath10k_set_key() local
5036 mutex_lock(&ar->conf_mutex); in ath10k_set_key()
5056 spin_lock_bh(&ar->data_lock); in ath10k_set_key()
5057 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr); in ath10k_set_key()
5058 spin_unlock_bh(&ar->data_lock); in ath10k_set_key()
5062 ath10k_warn(ar, "failed to install key for non-existent peer %pM\n", in ath10k_set_key()
5103 ath10k_warn(ar, "failed to install key for vdev %i peer %pM: %d\n", in ath10k_set_key()
5119 ath10k_warn(ar, "failed to install (ucast) key for vdev %i peer %pM: %d\n", in ath10k_set_key()
5125 ath10k_warn(ar, "failed to disable (mcast) key for vdev %i peer %pM: %d\n", in ath10k_set_key()
5132 ath10k_set_key_h_def_keyidx(ar, arvif, cmd, key); in ath10k_set_key()
5134 spin_lock_bh(&ar->data_lock); in ath10k_set_key()
5135 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr); in ath10k_set_key()
5142 ath10k_warn(ar, "Peer %pM disappeared!\n", peer_addr); in ath10k_set_key()
5143 spin_unlock_bh(&ar->data_lock); in ath10k_set_key()
5146 mutex_unlock(&ar->conf_mutex); in ath10k_set_key()
5154 struct ath10k *ar = hw->priv; in ath10k_set_default_unicast_key() local
5158 mutex_lock(&arvif->ar->conf_mutex); in ath10k_set_default_unicast_key()
5160 if (arvif->ar->state != ATH10K_STATE_ON) in ath10k_set_default_unicast_key()
5163 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d set keyidx %d\n", in ath10k_set_default_unicast_key()
5166 ret = ath10k_wmi_vdev_set_param(arvif->ar, in ath10k_set_default_unicast_key()
5168 arvif->ar->wmi.vdev_param->def_keyid, in ath10k_set_default_unicast_key()
5172 ath10k_warn(ar, "failed to update wep key index for vdev %d: %d\n", in ath10k_set_default_unicast_key()
5181 mutex_unlock(&arvif->ar->conf_mutex); in ath10k_set_default_unicast_key()
5186 struct ath10k *ar; in ath10k_sta_rc_update_wk() local
5200 ar = arvif->ar; in ath10k_sta_rc_update_wk()
5209 spin_lock_bh(&ar->data_lock); in ath10k_sta_rc_update_wk()
5218 spin_unlock_bh(&ar->data_lock); in ath10k_sta_rc_update_wk()
5220 mutex_lock(&ar->conf_mutex); in ath10k_sta_rc_update_wk()
5227 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM peer bw %d\n", in ath10k_sta_rc_update_wk()
5230 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr, in ath10k_sta_rc_update_wk()
5233 ath10k_warn(ar, "failed to update STA %pM peer bw %d: %d\n", in ath10k_sta_rc_update_wk()
5238 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM nss %d\n", in ath10k_sta_rc_update_wk()
5241 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr, in ath10k_sta_rc_update_wk()
5244 ath10k_warn(ar, "failed to update STA %pM nss %d: %d\n", in ath10k_sta_rc_update_wk()
5249 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM smps %d\n", in ath10k_sta_rc_update_wk()
5252 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr, in ath10k_sta_rc_update_wk()
5255 ath10k_warn(ar, "failed to update STA %pM smps %d: %d\n", in ath10k_sta_rc_update_wk()
5261 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM supp rates/nss\n", in ath10k_sta_rc_update_wk()
5264 err = ath10k_station_assoc(ar, arvif->vif, sta, true); in ath10k_sta_rc_update_wk()
5266 ath10k_warn(ar, "failed to reassociate station: %pM\n", in ath10k_sta_rc_update_wk()
5270 mutex_unlock(&ar->conf_mutex); in ath10k_sta_rc_update_wk()
5276 struct ath10k *ar = arvif->ar; in ath10k_mac_inc_num_stations() local
5278 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_inc_num_stations()
5283 if (ar->num_stations >= ar->max_num_stations) in ath10k_mac_inc_num_stations()
5286 ar->num_stations++; in ath10k_mac_inc_num_stations()
5294 struct ath10k *ar = arvif->ar; in ath10k_mac_dec_num_stations() local
5296 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_dec_num_stations()
5301 ar->num_stations--; in ath10k_mac_dec_num_stations()
5342 if (ath10k_mac_tdls_vif_stations_count(arvif->ar->hw, vif) > 0) in ath10k_mac_tdls_vifs_count_iter()
5363 struct ath10k *ar = hw->priv; in ath10k_sta_state() local
5380 mutex_lock(&ar->conf_mutex); in ath10k_sta_state()
5391 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_sta_state()
5394 ar->num_stations + 1, ar->max_num_stations, in ath10k_sta_state()
5395 ar->num_peers + 1, ar->max_num_peers); in ath10k_sta_state()
5399 ath10k_warn(ar, "refusing to associate station: too many connected already (%d)\n", in ath10k_sta_state()
5400 ar->max_num_stations); in ath10k_sta_state()
5407 ret = ath10k_peer_create(ar, arvif->vdev_id, sta->addr, in ath10k_sta_state()
5410 ath10k_warn(ar, "failed to add peer %pM for vdev %d when adding a new sta: %i\n", in ath10k_sta_state()
5422 if (num_tdls_vifs >= ar->max_num_tdls_vdevs && in ath10k_sta_state()
5424 ath10k_warn(ar, "vdev %i exceeded maximum number of tdls vdevs %i\n", in ath10k_sta_state()
5425 arvif->vdev_id, ar->max_num_tdls_vdevs); in ath10k_sta_state()
5426 ath10k_peer_delete(ar, arvif->vdev_id, sta->addr); in ath10k_sta_state()
5436 ret = ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id, in ath10k_sta_state()
5439 ath10k_warn(ar, "failed to update fw tdls state on vdev %i: %i\n", in ath10k_sta_state()
5441 ath10k_peer_delete(ar, arvif->vdev_id, in ath10k_sta_state()
5448 ret = ath10k_mac_tdls_peer_update(ar, arvif->vdev_id, sta, in ath10k_sta_state()
5451 ath10k_warn(ar, in ath10k_sta_state()
5454 ath10k_peer_delete(ar, arvif->vdev_id, sta->addr); in ath10k_sta_state()
5459 ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id, in ath10k_sta_state()
5467 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_sta_state()
5471 ret = ath10k_peer_delete(ar, arvif->vdev_id, sta->addr); in ath10k_sta_state()
5473 ath10k_warn(ar, "failed to delete peer %pM for vdev %d: %i\n", in ath10k_sta_state()
5485 ret = ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id, in ath10k_sta_state()
5488 ath10k_warn(ar, "failed to update fw tdls state on vdev %i: %i\n", in ath10k_sta_state()
5499 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac sta %pM associated\n", in ath10k_sta_state()
5502 ret = ath10k_station_assoc(ar, vif, sta, false); in ath10k_sta_state()
5504 ath10k_warn(ar, "failed to associate station %pM for vdev %i: %i\n", in ath10k_sta_state()
5512 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac tdls sta %pM authorized\n", in ath10k_sta_state()
5515 ret = ath10k_station_assoc(ar, vif, sta, false); in ath10k_sta_state()
5517 ath10k_warn(ar, "failed to associate tdls station %pM for vdev %i: %i\n", in ath10k_sta_state()
5522 ret = ath10k_mac_tdls_peer_update(ar, arvif->vdev_id, sta, in ath10k_sta_state()
5525 ath10k_warn(ar, "failed to update tdls peer %pM for vdev %i: %i\n", in ath10k_sta_state()
5535 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac sta %pM disassociated\n", in ath10k_sta_state()
5538 ret = ath10k_station_disassoc(ar, vif, sta); in ath10k_sta_state()
5540 ath10k_warn(ar, "failed to disassociate station: %pM vdev %i: %i\n", in ath10k_sta_state()
5544 mutex_unlock(&ar->conf_mutex); in ath10k_sta_state()
5548 static int ath10k_conf_tx_uapsd(struct ath10k *ar, struct ieee80211_vif *vif, in ath10k_conf_tx_uapsd() argument
5557 lockdep_assert_held(&ar->conf_mutex); in ath10k_conf_tx_uapsd()
5594 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath10k_conf_tx_uapsd()
5598 ath10k_warn(ar, "failed to set uapsd params: %d\n", ret); in ath10k_conf_tx_uapsd()
5607 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath10k_conf_tx_uapsd()
5611 ath10k_warn(ar, "failed to set rx wake param: %d\n", ret); in ath10k_conf_tx_uapsd()
5615 ath10k_warn(ar, "failed to recalc ps wake threshold on vdev %i: %d\n", in ath10k_conf_tx_uapsd()
5622 ath10k_warn(ar, "failed to recalc ps poll count on vdev %i: %d\n", in ath10k_conf_tx_uapsd()
5627 if (test_bit(WMI_SERVICE_STA_UAPSD_BASIC_AUTO_TRIG, ar->wmi.svc_map) || in ath10k_conf_tx_uapsd()
5628 test_bit(WMI_SERVICE_STA_UAPSD_VAR_AUTO_TRIG, ar->wmi.svc_map)) { in ath10k_conf_tx_uapsd()
5641 ret = ath10k_wmi_vdev_sta_uapsd(ar, arvif->vdev_id, in ath10k_conf_tx_uapsd()
5644 ath10k_warn(ar, "failed to set uapsd auto trigger %d\n", in ath10k_conf_tx_uapsd()
5658 struct ath10k *ar = hw->priv; in ath10k_conf_tx() local
5663 mutex_lock(&ar->conf_mutex); in ath10k_conf_tx()
5696 if (ar->wmi.ops->gen_vdev_wmm_conf) { in ath10k_conf_tx()
5697 ret = ath10k_wmi_vdev_wmm_conf(ar, arvif->vdev_id, in ath10k_conf_tx()
5700 ath10k_warn(ar, "failed to set vdev wmm params on vdev %i: %d\n", in ath10k_conf_tx()
5708 ret = ath10k_wmi_pdev_set_wmm_params(ar, &arvif->wmm_params); in ath10k_conf_tx()
5710 ath10k_warn(ar, "failed to set wmm params: %d\n", ret); in ath10k_conf_tx()
5715 ret = ath10k_conf_tx_uapsd(ar, vif, ac, params->uapsd); in ath10k_conf_tx()
5717 ath10k_warn(ar, "failed to set sta uapsd: %d\n", ret); in ath10k_conf_tx()
5720 mutex_unlock(&ar->conf_mutex); in ath10k_conf_tx()
5732 struct ath10k *ar = hw->priv; in ath10k_remain_on_channel() local
5738 mutex_lock(&ar->conf_mutex); in ath10k_remain_on_channel()
5740 spin_lock_bh(&ar->data_lock); in ath10k_remain_on_channel()
5741 switch (ar->scan.state) { in ath10k_remain_on_channel()
5743 reinit_completion(&ar->scan.started); in ath10k_remain_on_channel()
5744 reinit_completion(&ar->scan.completed); in ath10k_remain_on_channel()
5745 reinit_completion(&ar->scan.on_channel); in ath10k_remain_on_channel()
5746 ar->scan.state = ATH10K_SCAN_STARTING; in ath10k_remain_on_channel()
5747 ar->scan.is_roc = true; in ath10k_remain_on_channel()
5748 ar->scan.vdev_id = arvif->vdev_id; in ath10k_remain_on_channel()
5749 ar->scan.roc_freq = chan->center_freq; in ath10k_remain_on_channel()
5750 ar->scan.roc_notify = true; in ath10k_remain_on_channel()
5759 spin_unlock_bh(&ar->data_lock); in ath10k_remain_on_channel()
5764 scan_time_msec = ar->hw->wiphy->max_remain_on_channel_duration * 2; in ath10k_remain_on_channel()
5767 ath10k_wmi_start_scan_init(ar, &arg); in ath10k_remain_on_channel()
5779 ret = ath10k_start_scan(ar, &arg); in ath10k_remain_on_channel()
5781 ath10k_warn(ar, "failed to start roc scan: %d\n", ret); in ath10k_remain_on_channel()
5782 spin_lock_bh(&ar->data_lock); in ath10k_remain_on_channel()
5783 ar->scan.state = ATH10K_SCAN_IDLE; in ath10k_remain_on_channel()
5784 spin_unlock_bh(&ar->data_lock); in ath10k_remain_on_channel()
5788 ret = wait_for_completion_timeout(&ar->scan.on_channel, 3*HZ); in ath10k_remain_on_channel()
5790 ath10k_warn(ar, "failed to switch to channel for roc scan\n"); in ath10k_remain_on_channel()
5792 ret = ath10k_scan_stop(ar); in ath10k_remain_on_channel()
5794 ath10k_warn(ar, "failed to stop scan: %d\n", ret); in ath10k_remain_on_channel()
5800 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout, in ath10k_remain_on_channel()
5805 mutex_unlock(&ar->conf_mutex); in ath10k_remain_on_channel()
5811 struct ath10k *ar = hw->priv; in ath10k_cancel_remain_on_channel() local
5813 mutex_lock(&ar->conf_mutex); in ath10k_cancel_remain_on_channel()
5815 spin_lock_bh(&ar->data_lock); in ath10k_cancel_remain_on_channel()
5816 ar->scan.roc_notify = false; in ath10k_cancel_remain_on_channel()
5817 spin_unlock_bh(&ar->data_lock); in ath10k_cancel_remain_on_channel()
5819 ath10k_scan_abort(ar); in ath10k_cancel_remain_on_channel()
5821 mutex_unlock(&ar->conf_mutex); in ath10k_cancel_remain_on_channel()
5823 cancel_delayed_work_sync(&ar->scan.timeout); in ath10k_cancel_remain_on_channel()
5835 struct ath10k *ar = hw->priv; in ath10k_set_rts_threshold() local
5839 mutex_lock(&ar->conf_mutex); in ath10k_set_rts_threshold()
5840 list_for_each_entry(arvif, &ar->arvifs, list) { in ath10k_set_rts_threshold()
5841 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d rts threshold %d\n", in ath10k_set_rts_threshold()
5846 ath10k_warn(ar, "failed to set rts threshold for vdev %d: %d\n", in ath10k_set_rts_threshold()
5851 mutex_unlock(&ar->conf_mutex); in ath10k_set_rts_threshold()
5874 struct ath10k *ar = hw->priv; in ath10k_flush() local
5883 mutex_lock(&ar->conf_mutex); in ath10k_flush()
5885 if (ar->state == ATH10K_STATE_WEDGED) in ath10k_flush()
5888 time_left = wait_event_timeout(ar->htt.empty_tx_wq, ({ in ath10k_flush()
5891 spin_lock_bh(&ar->htt.tx_lock); in ath10k_flush()
5892 empty = (ar->htt.num_pending_tx == 0); in ath10k_flush()
5893 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_flush()
5895 skip = (ar->state == ATH10K_STATE_WEDGED) || in ath10k_flush()
5897 &ar->dev_flags); in ath10k_flush()
5903 ath10k_warn(ar, "failed to flush transmit queue (skip %i ar-state %i): %ld\n", in ath10k_flush()
5904 skip, ar->state, time_left); in ath10k_flush()
5907 mutex_unlock(&ar->conf_mutex); in ath10k_flush()
5922 struct ath10k *ar = hw->priv; in ath10k_reconfig_complete() local
5927 mutex_lock(&ar->conf_mutex); in ath10k_reconfig_complete()
5931 if (ar->state == ATH10K_STATE_RESTARTED) { in ath10k_reconfig_complete()
5932 ath10k_info(ar, "device successfully recovered\n"); in ath10k_reconfig_complete()
5933 ar->state = ATH10K_STATE_ON; in ath10k_reconfig_complete()
5934 ieee80211_wake_queues(ar->hw); in ath10k_reconfig_complete()
5937 mutex_unlock(&ar->conf_mutex); in ath10k_reconfig_complete()
5943 struct ath10k *ar = hw->priv; in ath10k_get_survey() local
5945 struct survey_info *ar_survey = &ar->survey[idx]; in ath10k_get_survey()
5948 mutex_lock(&ar->conf_mutex); in ath10k_get_survey()
5964 spin_lock_bh(&ar->data_lock); in ath10k_get_survey()
5966 spin_unlock_bh(&ar->data_lock); in ath10k_get_survey()
5970 if (ar->rx_channel == survey->channel) in ath10k_get_survey()
5974 mutex_unlock(&ar->conf_mutex); in ath10k_get_survey()
5979 ath10k_mac_bitrate_mask_has_single_rate(struct ath10k *ar, in ath10k_mac_bitrate_mask_has_single_rate() argument
5998 ath10k_mac_bitrate_mask_get_single_nss(struct ath10k *ar, in ath10k_mac_bitrate_mask_get_single_nss() argument
6003 struct ieee80211_supported_band *sband = &ar->mac.sbands[band]; in ath10k_mac_bitrate_mask_get_single_nss()
6047 ath10k_mac_bitrate_mask_get_single_rate(struct ath10k *ar, in ath10k_mac_bitrate_mask_get_single_rate() argument
6052 struct ieee80211_supported_band *sband = &ar->mac.sbands[band]; in ath10k_mac_bitrate_mask_get_single_rate()
6106 struct ath10k *ar = arvif->ar; in ath10k_mac_set_fixed_rate_params() local
6110 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_set_fixed_rate_params()
6112 …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()
6115 vdev_param = ar->wmi.vdev_param->fixed_rate; in ath10k_mac_set_fixed_rate_params()
6116 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, rate); in ath10k_mac_set_fixed_rate_params()
6118 ath10k_warn(ar, "failed to set fixed rate param 0x%02x: %d\n", in ath10k_mac_set_fixed_rate_params()
6123 vdev_param = ar->wmi.vdev_param->nss; in ath10k_mac_set_fixed_rate_params()
6124 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, nss); in ath10k_mac_set_fixed_rate_params()
6126 ath10k_warn(ar, "failed to set nss param %d: %d\n", nss, ret); in ath10k_mac_set_fixed_rate_params()
6130 vdev_param = ar->wmi.vdev_param->sgi; in ath10k_mac_set_fixed_rate_params()
6131 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, sgi); in ath10k_mac_set_fixed_rate_params()
6133 ath10k_warn(ar, "failed to set sgi param %d: %d\n", sgi, ret); in ath10k_mac_set_fixed_rate_params()
6137 vdev_param = ar->wmi.vdev_param->ldpc; in ath10k_mac_set_fixed_rate_params()
6138 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, ldpc); in ath10k_mac_set_fixed_rate_params()
6140 ath10k_warn(ar, "failed to set ldpc param %d: %d\n", ldpc, ret); in ath10k_mac_set_fixed_rate_params()
6148 ath10k_mac_can_set_bitrate_mask(struct ath10k *ar, in ath10k_mac_can_set_bitrate_mask() argument
6169 ath10k_warn(ar, "refusing bitrate mask with missing 0-7 VHT MCS rates\n"); in ath10k_mac_can_set_bitrate_mask()
6182 struct ath10k *ar = arvif->ar; in ath10k_mac_set_bitrate_mask_iter() local
6187 spin_lock_bh(&ar->data_lock); in ath10k_mac_set_bitrate_mask_iter()
6189 spin_unlock_bh(&ar->data_lock); in ath10k_mac_set_bitrate_mask_iter()
6191 ieee80211_queue_work(ar->hw, &arsta->update_wk); in ath10k_mac_set_bitrate_mask_iter()
6200 struct ath10k *ar = arvif->ar; in ath10k_mac_op_set_bitrate_mask() local
6217 ldpc = !!(ar->ht_cap_info & WMI_HT_CAP_LDPC); in ath10k_mac_op_set_bitrate_mask()
6223 if (ath10k_mac_bitrate_mask_has_single_rate(ar, band, mask)) { in ath10k_mac_op_set_bitrate_mask()
6224 ret = ath10k_mac_bitrate_mask_get_single_rate(ar, band, mask, in ath10k_mac_op_set_bitrate_mask()
6227 ath10k_warn(ar, "failed to get single rate for vdev %i: %d\n", in ath10k_mac_op_set_bitrate_mask()
6231 } else if (ath10k_mac_bitrate_mask_get_single_nss(ar, band, mask, in ath10k_mac_op_set_bitrate_mask()
6237 nss = min(ar->num_rf_chains, in ath10k_mac_op_set_bitrate_mask()
6241 if (!ath10k_mac_can_set_bitrate_mask(ar, band, mask)) in ath10k_mac_op_set_bitrate_mask()
6244 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_set_bitrate_mask()
6247 ieee80211_iterate_stations_atomic(ar->hw, in ath10k_mac_op_set_bitrate_mask()
6251 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_set_bitrate_mask()
6254 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_set_bitrate_mask()
6258 ath10k_warn(ar, "failed to set fixed rate params on vdev %i: %d\n", in ath10k_mac_op_set_bitrate_mask()
6264 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_set_bitrate_mask()
6274 struct ath10k *ar = hw->priv; in ath10k_sta_rc_update() local
6278 spin_lock_bh(&ar->data_lock); in ath10k_sta_rc_update()
6280 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_sta_rc_update()
6299 ath10k_warn(ar, "Invalid bandwidth %d in rc update for %pM\n", in ath10k_sta_rc_update()
6326 ath10k_warn(ar, "Invalid smps %d in sta rc update for %pM\n", in ath10k_sta_rc_update()
6337 spin_unlock_bh(&ar->data_lock); in ath10k_sta_rc_update()
6358 struct ath10k *ar = hw->priv; in ath10k_ampdu_action() local
6361 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac ampdu vdev_id %i sta %pM tid %hu action %d\n", in ath10k_ampdu_action()
6386 ath10k_mac_update_rx_channel(struct ath10k *ar, in ath10k_mac_update_rx_channel() argument
6396 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_update_rx_channel()
6397 lockdep_assert_held(&ar->data_lock); in ath10k_mac_update_rx_channel()
6413 if (!ctx && ath10k_mac_num_chanctxs(ar) == 1) { in ath10k_mac_update_rx_channel()
6414 ieee80211_iter_chan_contexts_atomic(ar->hw, in ath10k_mac_update_rx_channel()
6421 ar->rx_channel = def->chan; in ath10k_mac_update_rx_channel()
6422 } else if ((ctx && ath10k_mac_num_chanctxs(ar) == 0) || in ath10k_mac_update_rx_channel()
6423 (ctx && (ar->state == ATH10K_STATE_RESTARTED))) { in ath10k_mac_update_rx_channel()
6429 ar->rx_channel = ctx->def.chan; in ath10k_mac_update_rx_channel()
6431 ar->rx_channel = NULL; in ath10k_mac_update_rx_channel()
6437 ath10k_mac_update_vif_chan(struct ath10k *ar, in ath10k_mac_update_vif_chan() argument
6445 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_update_vif_chan()
6450 if (ar->monitor_started) in ath10k_mac_update_vif_chan()
6451 ath10k_monitor_stop(ar); in ath10k_mac_update_vif_chan()
6456 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_mac_update_vif_chan()
6470 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id); in ath10k_mac_update_vif_chan()
6472 ath10k_warn(ar, "failed to down vdev %d: %d\n", in ath10k_mac_update_vif_chan()
6482 spin_lock_bh(&ar->data_lock); in ath10k_mac_update_vif_chan()
6483 ath10k_mac_update_rx_channel(ar, NULL, vifs, n_vifs); in ath10k_mac_update_vif_chan()
6484 spin_unlock_bh(&ar->data_lock); in ath10k_mac_update_vif_chan()
6497 ath10k_warn(ar, "failed to update bcn tmpl during csa: %d\n", in ath10k_mac_update_vif_chan()
6502 ath10k_warn(ar, "failed to update prb tmpl during csa: %d\n", in ath10k_mac_update_vif_chan()
6507 ath10k_warn(ar, "failed to restart vdev %d: %d\n", in ath10k_mac_update_vif_chan()
6512 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid, in ath10k_mac_update_vif_chan()
6515 ath10k_warn(ar, "failed to bring vdev up %d: %d\n", in ath10k_mac_update_vif_chan()
6521 ath10k_monitor_recalc(ar); in ath10k_mac_update_vif_chan()
6528 struct ath10k *ar = hw->priv; in ath10k_mac_op_add_chanctx() local
6530 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_mac_op_add_chanctx()
6534 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_add_chanctx()
6536 spin_lock_bh(&ar->data_lock); in ath10k_mac_op_add_chanctx()
6537 ath10k_mac_update_rx_channel(ar, ctx, NULL, 0); in ath10k_mac_op_add_chanctx()
6538 spin_unlock_bh(&ar->data_lock); in ath10k_mac_op_add_chanctx()
6540 ath10k_recalc_radar_detection(ar); in ath10k_mac_op_add_chanctx()
6541 ath10k_monitor_recalc(ar); in ath10k_mac_op_add_chanctx()
6543 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_add_chanctx()
6552 struct ath10k *ar = hw->priv; in ath10k_mac_op_remove_chanctx() local
6554 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_mac_op_remove_chanctx()
6558 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_remove_chanctx()
6560 spin_lock_bh(&ar->data_lock); in ath10k_mac_op_remove_chanctx()
6561 ath10k_mac_update_rx_channel(ar, NULL, NULL, 0); in ath10k_mac_op_remove_chanctx()
6562 spin_unlock_bh(&ar->data_lock); in ath10k_mac_op_remove_chanctx()
6564 ath10k_recalc_radar_detection(ar); in ath10k_mac_op_remove_chanctx()
6565 ath10k_monitor_recalc(ar); in ath10k_mac_op_remove_chanctx()
6567 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_remove_chanctx()
6614 struct ath10k *ar = hw->priv; in ath10k_mac_op_change_chanctx() local
6617 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_change_chanctx()
6619 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_mac_op_change_chanctx()
6648 ath10k_mac_update_vif_chan(ar, arg.vifs, arg.n_vifs); in ath10k_mac_op_change_chanctx()
6653 ath10k_recalc_radar_detection(ar); in ath10k_mac_op_change_chanctx()
6663 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_change_chanctx()
6671 struct ath10k *ar = hw->priv; in ath10k_mac_op_assign_vif_chanctx() local
6675 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_assign_vif_chanctx()
6677 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_mac_op_assign_vif_chanctx()
6682 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_assign_vif_chanctx()
6688 ath10k_warn(ar, "failed to start vdev %i addr %pM on freq %d: %d\n", in ath10k_mac_op_assign_vif_chanctx()
6698 ath10k_warn(ar, "failed to update vdev %i ps: %d\n", in ath10k_mac_op_assign_vif_chanctx()
6704 ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, 0, vif->addr); in ath10k_mac_op_assign_vif_chanctx()
6706 ath10k_warn(ar, "failed to up monitor vdev %i: %d\n", in ath10k_mac_op_assign_vif_chanctx()
6714 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_assign_vif_chanctx()
6723 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_assign_vif_chanctx()
6732 struct ath10k *ar = hw->priv; in ath10k_mac_op_unassign_vif_chanctx() local
6736 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_unassign_vif_chanctx()
6738 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_mac_op_unassign_vif_chanctx()
6747 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id); in ath10k_mac_op_unassign_vif_chanctx()
6749 ath10k_warn(ar, "failed to down monitor vdev %i: %d\n", in ath10k_mac_op_unassign_vif_chanctx()
6757 ath10k_warn(ar, "failed to stop vdev %i: %d\n", in ath10k_mac_op_unassign_vif_chanctx()
6762 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_unassign_vif_chanctx()
6771 struct ath10k *ar = hw->priv; in ath10k_mac_op_switch_vif_chanctx() local
6773 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_switch_vif_chanctx()
6775 ath10k_dbg(ar, ATH10K_DBG_MAC, in ath10k_mac_op_switch_vif_chanctx()
6778 ath10k_mac_update_vif_chan(ar, vifs, n_vifs); in ath10k_mac_op_switch_vif_chanctx()
6780 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_switch_vif_chanctx()
6900 struct ath10k *ar; in ath10k_mac_create() local
6906 ar = hw->priv; in ath10k_mac_create()
6907 ar->hw = hw; in ath10k_mac_create()
6909 return ar; in ath10k_mac_create()
6912 void ath10k_mac_destroy(struct ath10k *ar) in ath10k_mac_destroy() argument
6914 ieee80211_free_hw(ar->hw); in ath10k_mac_destroy()
7109 struct ath10k_vif *ath10k_get_arvif(struct ath10k *ar, u32 vdev_id) in ath10k_get_arvif() argument
7118 ieee80211_iterate_active_interfaces_atomic(ar->hw, in ath10k_get_arvif()
7123 ath10k_warn(ar, "No VIF found for vdev %d\n", vdev_id); in ath10k_get_arvif()
7130 int ath10k_mac_register(struct ath10k *ar) in ath10k_mac_register() argument
7143 SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr); in ath10k_mac_register()
7145 SET_IEEE80211_DEV(ar->hw, ar->dev); in ath10k_mac_register()
7151 if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) { in ath10k_mac_register()
7160 band = &ar->mac.sbands[IEEE80211_BAND_2GHZ]; in ath10k_mac_register()
7166 ar->hw->wiphy->bands[IEEE80211_BAND_2GHZ] = band; in ath10k_mac_register()
7169 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) { in ath10k_mac_register()
7178 band = &ar->mac.sbands[IEEE80211_BAND_5GHZ]; in ath10k_mac_register()
7183 ar->hw->wiphy->bands[IEEE80211_BAND_5GHZ] = band; in ath10k_mac_register()
7186 ath10k_mac_setup_ht_vht_cap(ar); in ath10k_mac_register()
7188 ar->hw->wiphy->interface_modes = in ath10k_mac_register()
7193 ar->hw->wiphy->available_antennas_rx = ar->cfg_rx_chainmask; in ath10k_mac_register()
7194 ar->hw->wiphy->available_antennas_tx = ar->cfg_tx_chainmask; in ath10k_mac_register()
7196 if (!test_bit(ATH10K_FW_FEATURE_NO_P2P, ar->fw_features)) in ath10k_mac_register()
7197 ar->hw->wiphy->interface_modes |= in ath10k_mac_register()
7202 ieee80211_hw_set(ar->hw, SIGNAL_DBM); in ath10k_mac_register()
7203 ieee80211_hw_set(ar->hw, SUPPORTS_PS); in ath10k_mac_register()
7204 ieee80211_hw_set(ar->hw, SUPPORTS_DYNAMIC_PS); in ath10k_mac_register()
7205 ieee80211_hw_set(ar->hw, MFP_CAPABLE); in ath10k_mac_register()
7206 ieee80211_hw_set(ar->hw, REPORTS_TX_ACK_STATUS); in ath10k_mac_register()
7207 ieee80211_hw_set(ar->hw, HAS_RATE_CONTROL); in ath10k_mac_register()
7208 ieee80211_hw_set(ar->hw, AP_LINK_PS); in ath10k_mac_register()
7209 ieee80211_hw_set(ar->hw, SPECTRUM_MGMT); in ath10k_mac_register()
7210 ieee80211_hw_set(ar->hw, SUPPORT_FAST_XMIT); in ath10k_mac_register()
7211 ieee80211_hw_set(ar->hw, CONNECTION_MONITOR); in ath10k_mac_register()
7212 ieee80211_hw_set(ar->hw, SUPPORTS_PER_STA_GTK); in ath10k_mac_register()
7213 ieee80211_hw_set(ar->hw, WANT_MONITOR_VIF); in ath10k_mac_register()
7214 ieee80211_hw_set(ar->hw, CHANCTX_STA_CSA); in ath10k_mac_register()
7215 ieee80211_hw_set(ar->hw, QUEUE_CONTROL); in ath10k_mac_register()
7217 if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) in ath10k_mac_register()
7218 ieee80211_hw_set(ar->hw, SW_CRYPTO_CONTROL); in ath10k_mac_register()
7220 ar->hw->wiphy->features |= NL80211_FEATURE_STATIC_SMPS; in ath10k_mac_register()
7221 ar->hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN; in ath10k_mac_register()
7223 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) in ath10k_mac_register()
7224 ar->hw->wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS; in ath10k_mac_register()
7226 if (ar->ht_cap_info & WMI_HT_CAP_ENABLED) { in ath10k_mac_register()
7227 ieee80211_hw_set(ar->hw, AMPDU_AGGREGATION); in ath10k_mac_register()
7228 ieee80211_hw_set(ar->hw, TX_AMPDU_SETUP_IN_HW); in ath10k_mac_register()
7231 ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID; in ath10k_mac_register()
7232 ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN; in ath10k_mac_register()
7234 ar->hw->vif_data_size = sizeof(struct ath10k_vif); in ath10k_mac_register()
7235 ar->hw->sta_data_size = sizeof(struct ath10k_sta); in ath10k_mac_register()
7237 ar->hw->max_listen_interval = ATH10K_MAX_HW_LISTEN_INTERVAL; in ath10k_mac_register()
7239 if (test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map)) { in ath10k_mac_register()
7240 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD; in ath10k_mac_register()
7246 ar->hw->wiphy->probe_resp_offload |= in ath10k_mac_register()
7252 if (test_bit(WMI_SERVICE_TDLS, ar->wmi.svc_map)) in ath10k_mac_register()
7253 ar->hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS; in ath10k_mac_register()
7255 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL; in ath10k_mac_register()
7256 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH; in ath10k_mac_register()
7257 ar->hw->wiphy->max_remain_on_channel_duration = 5000; in ath10k_mac_register()
7259 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD; in ath10k_mac_register()
7260 ar->hw->wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE; in ath10k_mac_register()
7262 ar->hw->wiphy->max_ap_assoc_sta = ar->max_num_stations; in ath10k_mac_register()
7264 ret = ath10k_wow_init(ar); in ath10k_mac_register()
7266 ath10k_warn(ar, "failed to init wow: %d\n", ret); in ath10k_mac_register()
7270 wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_VHT_IBSS); in ath10k_mac_register()
7276 ar->hw->queues = IEEE80211_MAX_QUEUES; in ath10k_mac_register()
7282 ar->hw->offchannel_tx_hw_queue = IEEE80211_MAX_QUEUES - 1; in ath10k_mac_register()
7284 switch (ar->wmi.op_version) { in ath10k_mac_register()
7286 ar->hw->wiphy->iface_combinations = ath10k_if_comb; in ath10k_mac_register()
7287 ar->hw->wiphy->n_iface_combinations = in ath10k_mac_register()
7289 ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC); in ath10k_mac_register()
7292 if (test_bit(WMI_SERVICE_ADAPTIVE_OCS, ar->wmi.svc_map)) { in ath10k_mac_register()
7293 ar->hw->wiphy->iface_combinations = in ath10k_mac_register()
7295 ar->hw->wiphy->n_iface_combinations = in ath10k_mac_register()
7298 ar->hw->wiphy->iface_combinations = ath10k_tlv_if_comb; in ath10k_mac_register()
7299 ar->hw->wiphy->n_iface_combinations = in ath10k_mac_register()
7302 ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC); in ath10k_mac_register()
7307 ar->hw->wiphy->iface_combinations = ath10k_10x_if_comb; in ath10k_mac_register()
7308 ar->hw->wiphy->n_iface_combinations = in ath10k_mac_register()
7312 ar->hw->wiphy->iface_combinations = ath10k_10_4_if_comb; in ath10k_mac_register()
7313 ar->hw->wiphy->n_iface_combinations = in ath10k_mac_register()
7323 if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) in ath10k_mac_register()
7324 ar->hw->netdev_features = NETIF_F_HW_CSUM; in ath10k_mac_register()
7328 ar->ath_common.debug_mask = ATH_DBG_DFS; in ath10k_mac_register()
7329 ar->dfs_detector = dfs_pattern_detector_init(&ar->ath_common, in ath10k_mac_register()
7332 if (!ar->dfs_detector) in ath10k_mac_register()
7333 ath10k_warn(ar, "failed to initialise DFS pattern detector\n"); in ath10k_mac_register()
7336 ret = ath_regd_init(&ar->ath_common.regulatory, ar->hw->wiphy, in ath10k_mac_register()
7339 ath10k_err(ar, "failed to initialise regulatory: %i\n", ret); in ath10k_mac_register()
7343 ar->hw->wiphy->cipher_suites = cipher_suites; in ath10k_mac_register()
7344 ar->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites); in ath10k_mac_register()
7346 ret = ieee80211_register_hw(ar->hw); in ath10k_mac_register()
7348 ath10k_err(ar, "failed to register ieee80211: %d\n", ret); in ath10k_mac_register()
7352 if (!ath_is_world_regd(&ar->ath_common.regulatory)) { in ath10k_mac_register()
7353 ret = regulatory_hint(ar->hw->wiphy, in ath10k_mac_register()
7354 ar->ath_common.regulatory.alpha2); in ath10k_mac_register()
7362 ieee80211_unregister_hw(ar->hw); in ath10k_mac_register()
7365 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) in ath10k_mac_register()
7366 ar->dfs_detector->exit(ar->dfs_detector); in ath10k_mac_register()
7369 kfree(ar->mac.sbands[IEEE80211_BAND_2GHZ].channels); in ath10k_mac_register()
7370 kfree(ar->mac.sbands[IEEE80211_BAND_5GHZ].channels); in ath10k_mac_register()
7372 SET_IEEE80211_DEV(ar->hw, NULL); in ath10k_mac_register()
7376 void ath10k_mac_unregister(struct ath10k *ar) in ath10k_mac_unregister() argument
7378 ieee80211_unregister_hw(ar->hw); in ath10k_mac_unregister()
7380 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) in ath10k_mac_unregister()
7381 ar->dfs_detector->exit(ar->dfs_detector); in ath10k_mac_unregister()
7383 kfree(ar->mac.sbands[IEEE80211_BAND_2GHZ].channels); in ath10k_mac_unregister()
7384 kfree(ar->mac.sbands[IEEE80211_BAND_5GHZ].channels); in ath10k_mac_unregister()
7386 SET_IEEE80211_DEV(ar->hw, NULL); in ath10k_mac_unregister()