Lines Matching full:ar
532 struct ath12k_vif *ath12k_mac_get_arvif(struct ath12k *ar, u32 vdev_id) in ath12k_mac_get_arvif() argument
540 ieee80211_iterate_active_interfaces_atomic(ar->hw, in ath12k_mac_get_arvif()
545 ath12k_warn(ar->ab, "No VIF found for vdev %d\n", vdev_id); in ath12k_mac_get_arvif()
561 if (pdev && pdev->ar) { in ath12k_mac_get_arvif_by_vdev_id()
562 arvif = ath12k_mac_get_arvif(pdev->ar, vdev_id); in ath12k_mac_get_arvif_by_vdev_id()
578 if (pdev && pdev->ar) { in ath12k_mac_get_ar_by_vdev_id()
579 if (pdev->ar->allocated_vdev_map & (1LL << vdev_id)) in ath12k_mac_get_ar_by_vdev_id()
580 return pdev->ar; in ath12k_mac_get_ar_by_vdev_id()
594 return pdev ? pdev->ar : NULL; in ath12k_mac_get_ar_by_pdev_id()
604 return (pdev->ar ? pdev->ar : NULL); in ath12k_mac_get_ar_by_pdev_id()
610 static void ath12k_pdev_caps_update(struct ath12k *ar) in ath12k_pdev_caps_update() argument
612 struct ath12k_base *ab = ar->ab; in ath12k_pdev_caps_update()
614 ar->max_tx_power = ab->target_caps.hw_max_tx_power; in ath12k_pdev_caps_update()
618 * we can set ar->min_tx_power to 0 currently until in ath12k_pdev_caps_update()
621 ar->min_tx_power = 0; in ath12k_pdev_caps_update()
623 ar->txpower_limit_2g = ar->max_tx_power; in ath12k_pdev_caps_update()
624 ar->txpower_limit_5g = ar->max_tx_power; in ath12k_pdev_caps_update()
625 ar->txpower_scale = WMI_HOST_TP_SCALE_MAX; in ath12k_pdev_caps_update()
628 static int ath12k_mac_txpower_recalc(struct ath12k *ar) in ath12k_mac_txpower_recalc() argument
630 struct ath12k_pdev *pdev = ar->pdev; in ath12k_mac_txpower_recalc()
635 lockdep_assert_held(&ar->conf_mutex); in ath12k_mac_txpower_recalc()
637 list_for_each_entry(arvif, &ar->arvifs, list) { in ath12k_mac_txpower_recalc()
651 txpower = min_t(u32, max_t(u32, ar->min_tx_power, txpower), in ath12k_mac_txpower_recalc()
652 ar->max_tx_power) * 2; in ath12k_mac_txpower_recalc()
654 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "txpower to set in hw %d\n", in ath12k_mac_txpower_recalc()
658 ar->txpower_limit_2g != txpower) { in ath12k_mac_txpower_recalc()
660 ret = ath12k_wmi_pdev_set_param(ar, param, in ath12k_mac_txpower_recalc()
661 txpower, ar->pdev->pdev_id); in ath12k_mac_txpower_recalc()
664 ar->txpower_limit_2g = txpower; in ath12k_mac_txpower_recalc()
668 ar->txpower_limit_5g != txpower) { in ath12k_mac_txpower_recalc()
670 ret = ath12k_wmi_pdev_set_param(ar, param, in ath12k_mac_txpower_recalc()
671 txpower, ar->pdev->pdev_id); in ath12k_mac_txpower_recalc()
674 ar->txpower_limit_5g = txpower; in ath12k_mac_txpower_recalc()
680 ath12k_warn(ar->ab, "failed to recalc txpower limit %d using pdev param %d: %d\n", in ath12k_mac_txpower_recalc()
687 struct ath12k *ar = arvif->ar; in ath12k_recalc_rtscts_prot() local
691 lockdep_assert_held(&ar->conf_mutex); in ath12k_recalc_rtscts_prot()
712 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %d recalc rts/cts prot %d\n", in ath12k_recalc_rtscts_prot()
715 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_recalc_rtscts_prot()
718 ath12k_warn(ar->ab, "failed to recalculate rts/cts prot for vdev %d: %d\n", in ath12k_recalc_rtscts_prot()
726 struct ath12k *ar = arvif->ar; in ath12k_mac_set_kickout() local
730 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_STA_KICKOUT_TH, in ath12k_mac_set_kickout()
732 ar->pdev->pdev_id); in ath12k_mac_set_kickout()
734 ath12k_warn(ar->ab, "failed to set kickout threshold on vdev %i: %d\n", in ath12k_mac_set_kickout()
740 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, in ath12k_mac_set_kickout()
743 ath12k_warn(ar->ab, "failed to set keepalive minimum idle time on vdev %i: %d\n", in ath12k_mac_set_kickout()
749 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, in ath12k_mac_set_kickout()
752 ath12k_warn(ar->ab, "failed to set keepalive maximum idle time on vdev %i: %d\n", in ath12k_mac_set_kickout()
758 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, in ath12k_mac_set_kickout()
761 ath12k_warn(ar->ab, "failed to set keepalive maximum unresponsive time on vdev %i: %d\n", in ath12k_mac_set_kickout()
769 void ath12k_mac_peer_cleanup_all(struct ath12k *ar) in ath12k_mac_peer_cleanup_all() argument
772 struct ath12k_base *ab = ar->ab; in ath12k_mac_peer_cleanup_all()
774 lockdep_assert_held(&ar->conf_mutex); in ath12k_mac_peer_cleanup_all()
780 ath12k_dp_rx_peer_tid_cleanup(ar, peer); in ath12k_mac_peer_cleanup_all()
787 ar->num_peers = 0; in ath12k_mac_peer_cleanup_all()
788 ar->num_stations = 0; in ath12k_mac_peer_cleanup_all()
791 static int ath12k_mac_vdev_setup_sync(struct ath12k *ar) in ath12k_mac_vdev_setup_sync() argument
793 lockdep_assert_held(&ar->conf_mutex); in ath12k_mac_vdev_setup_sync()
795 if (test_bit(ATH12K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags)) in ath12k_mac_vdev_setup_sync()
798 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "vdev setup timeout %d\n", in ath12k_mac_vdev_setup_sync()
801 if (!wait_for_completion_timeout(&ar->vdev_setup_done, in ath12k_mac_vdev_setup_sync()
805 return ar->last_wmi_vdev_start_status ? -EINVAL : 0; in ath12k_mac_vdev_setup_sync()
808 static int ath12k_monitor_vdev_up(struct ath12k *ar, int vdev_id) in ath12k_monitor_vdev_up() argument
812 ret = ath12k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr); in ath12k_monitor_vdev_up()
814 ath12k_warn(ar->ab, "failed to put up monitor vdev %i: %d\n", in ath12k_monitor_vdev_up()
819 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %i started\n", in ath12k_monitor_vdev_up()
824 static int ath12k_mac_monitor_vdev_start(struct ath12k *ar, int vdev_id, in ath12k_mac_monitor_vdev_start() argument
831 lockdep_assert_held(&ar->conf_mutex); in ath12k_mac_monitor_vdev_start()
846 arg.pref_tx_streams = ar->num_tx_chains; in ath12k_mac_monitor_vdev_start()
847 arg.pref_rx_streams = ar->num_rx_chains; in ath12k_mac_monitor_vdev_start()
852 reinit_completion(&ar->vdev_setup_done); in ath12k_mac_monitor_vdev_start()
853 reinit_completion(&ar->vdev_delete_done); in ath12k_mac_monitor_vdev_start()
855 ret = ath12k_wmi_vdev_start(ar, &arg, false); in ath12k_mac_monitor_vdev_start()
857 ath12k_warn(ar->ab, "failed to request monitor vdev %i start: %d\n", in ath12k_mac_monitor_vdev_start()
862 ret = ath12k_mac_vdev_setup_sync(ar); in ath12k_mac_monitor_vdev_start()
864 ath12k_warn(ar->ab, "failed to synchronize setup for monitor vdev %i start: %d\n", in ath12k_mac_monitor_vdev_start()
869 ret = ath12k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr); in ath12k_mac_monitor_vdev_start()
871 ath12k_warn(ar->ab, "failed to put up monitor vdev %i: %d\n", in ath12k_mac_monitor_vdev_start()
876 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %i started\n", in ath12k_mac_monitor_vdev_start()
881 ret = ath12k_wmi_vdev_stop(ar, vdev_id); in ath12k_mac_monitor_vdev_start()
883 ath12k_warn(ar->ab, "failed to stop monitor vdev %i after start failure: %d\n", in ath12k_mac_monitor_vdev_start()
888 static int ath12k_mac_monitor_vdev_stop(struct ath12k *ar) in ath12k_mac_monitor_vdev_stop() argument
892 lockdep_assert_held(&ar->conf_mutex); in ath12k_mac_monitor_vdev_stop()
894 reinit_completion(&ar->vdev_setup_done); in ath12k_mac_monitor_vdev_stop()
896 ret = ath12k_wmi_vdev_stop(ar, ar->monitor_vdev_id); in ath12k_mac_monitor_vdev_stop()
898 ath12k_warn(ar->ab, "failed to request monitor vdev %i stop: %d\n", in ath12k_mac_monitor_vdev_stop()
899 ar->monitor_vdev_id, ret); in ath12k_mac_monitor_vdev_stop()
901 ret = ath12k_mac_vdev_setup_sync(ar); in ath12k_mac_monitor_vdev_stop()
903 ath12k_warn(ar->ab, "failed to synchronize monitor vdev %i stop: %d\n", in ath12k_mac_monitor_vdev_stop()
904 ar->monitor_vdev_id, ret); in ath12k_mac_monitor_vdev_stop()
906 ret = ath12k_wmi_vdev_down(ar, ar->monitor_vdev_id); in ath12k_mac_monitor_vdev_stop()
908 ath12k_warn(ar->ab, "failed to put down monitor vdev %i: %d\n", in ath12k_mac_monitor_vdev_stop()
909 ar->monitor_vdev_id, ret); in ath12k_mac_monitor_vdev_stop()
911 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %i stopped\n", in ath12k_mac_monitor_vdev_stop()
912 ar->monitor_vdev_id); in ath12k_mac_monitor_vdev_stop()
916 static int ath12k_mac_monitor_vdev_create(struct ath12k *ar) in ath12k_mac_monitor_vdev_create() argument
918 struct ath12k_pdev *pdev = ar->pdev; in ath12k_mac_monitor_vdev_create()
924 lockdep_assert_held(&ar->conf_mutex); in ath12k_mac_monitor_vdev_create()
926 if (ar->monitor_vdev_created) in ath12k_mac_monitor_vdev_create()
929 if (ar->ab->free_vdev_map == 0) { in ath12k_mac_monitor_vdev_create()
930 ath12k_warn(ar->ab, "failed to find free vdev id for monitor vdev\n"); in ath12k_mac_monitor_vdev_create()
934 bit = __ffs64(ar->ab->free_vdev_map); in ath12k_mac_monitor_vdev_create()
936 ar->monitor_vdev_id = bit; in ath12k_mac_monitor_vdev_create()
938 arg.if_id = ar->monitor_vdev_id; in ath12k_mac_monitor_vdev_create()
945 arg.chains[NL80211_BAND_2GHZ].tx = ar->num_tx_chains; in ath12k_mac_monitor_vdev_create()
946 arg.chains[NL80211_BAND_2GHZ].rx = ar->num_rx_chains; in ath12k_mac_monitor_vdev_create()
950 arg.chains[NL80211_BAND_5GHZ].tx = ar->num_tx_chains; in ath12k_mac_monitor_vdev_create()
951 arg.chains[NL80211_BAND_5GHZ].rx = ar->num_rx_chains; in ath12k_mac_monitor_vdev_create()
954 ret = ath12k_wmi_vdev_create(ar, tmp_addr, &arg); in ath12k_mac_monitor_vdev_create()
956 ath12k_warn(ar->ab, "failed to request monitor vdev %i creation: %d\n", in ath12k_mac_monitor_vdev_create()
957 ar->monitor_vdev_id, ret); in ath12k_mac_monitor_vdev_create()
958 ar->monitor_vdev_id = -1; in ath12k_mac_monitor_vdev_create()
962 nss = hweight32(ar->cfg_tx_chainmask) ? : 1; in ath12k_mac_monitor_vdev_create()
963 ret = ath12k_wmi_vdev_set_param_cmd(ar, ar->monitor_vdev_id, in ath12k_mac_monitor_vdev_create()
966 ath12k_warn(ar->ab, "failed to set vdev %d chainmask 0x%x, nss %d :%d\n", in ath12k_mac_monitor_vdev_create()
967 ar->monitor_vdev_id, ar->cfg_tx_chainmask, nss, ret); in ath12k_mac_monitor_vdev_create()
971 ret = ath12k_mac_txpower_recalc(ar); in ath12k_mac_monitor_vdev_create()
975 ar->allocated_vdev_map |= 1LL << ar->monitor_vdev_id; in ath12k_mac_monitor_vdev_create()
976 ar->ab->free_vdev_map &= ~(1LL << ar->monitor_vdev_id); in ath12k_mac_monitor_vdev_create()
977 ar->num_created_vdevs++; in ath12k_mac_monitor_vdev_create()
978 ar->monitor_vdev_created = true; in ath12k_mac_monitor_vdev_create()
979 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %d created\n", in ath12k_mac_monitor_vdev_create()
980 ar->monitor_vdev_id); in ath12k_mac_monitor_vdev_create()
985 static int ath12k_mac_monitor_vdev_delete(struct ath12k *ar) in ath12k_mac_monitor_vdev_delete() argument
990 lockdep_assert_held(&ar->conf_mutex); in ath12k_mac_monitor_vdev_delete()
992 if (!ar->monitor_vdev_created) in ath12k_mac_monitor_vdev_delete()
995 reinit_completion(&ar->vdev_delete_done); in ath12k_mac_monitor_vdev_delete()
997 ret = ath12k_wmi_vdev_delete(ar, ar->monitor_vdev_id); in ath12k_mac_monitor_vdev_delete()
999 ath12k_warn(ar->ab, "failed to request wmi monitor vdev %i removal: %d\n", in ath12k_mac_monitor_vdev_delete()
1000 ar->monitor_vdev_id, ret); in ath12k_mac_monitor_vdev_delete()
1004 time_left = wait_for_completion_timeout(&ar->vdev_delete_done, in ath12k_mac_monitor_vdev_delete()
1007 ath12k_warn(ar->ab, "Timeout in receiving vdev delete response\n"); in ath12k_mac_monitor_vdev_delete()
1009 ar->allocated_vdev_map &= ~(1LL << ar->monitor_vdev_id); in ath12k_mac_monitor_vdev_delete()
1010 ar->ab->free_vdev_map |= 1LL << (ar->monitor_vdev_id); in ath12k_mac_monitor_vdev_delete()
1011 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %d deleted\n", in ath12k_mac_monitor_vdev_delete()
1012 ar->monitor_vdev_id); in ath12k_mac_monitor_vdev_delete()
1013 ar->num_created_vdevs--; in ath12k_mac_monitor_vdev_delete()
1014 ar->monitor_vdev_id = -1; in ath12k_mac_monitor_vdev_delete()
1015 ar->monitor_vdev_created = false; in ath12k_mac_monitor_vdev_delete()
1031 static int ath12k_mac_monitor_start(struct ath12k *ar) in ath12k_mac_monitor_start() argument
1036 lockdep_assert_held(&ar->conf_mutex); in ath12k_mac_monitor_start()
1038 if (ar->monitor_started) in ath12k_mac_monitor_start()
1041 ieee80211_iter_chan_contexts_atomic(ar->hw, in ath12k_mac_monitor_start()
1047 ret = ath12k_mac_monitor_vdev_start(ar, ar->monitor_vdev_id, chandef); in ath12k_mac_monitor_start()
1049 ath12k_warn(ar->ab, "failed to start monitor vdev: %d\n", ret); in ath12k_mac_monitor_start()
1050 ath12k_mac_monitor_vdev_delete(ar); in ath12k_mac_monitor_start()
1054 ar->monitor_started = true; in ath12k_mac_monitor_start()
1055 ar->num_started_vdevs++; in ath12k_mac_monitor_start()
1056 ret = ath12k_dp_tx_htt_monitor_mode_ring_config(ar, false); in ath12k_mac_monitor_start()
1057 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor started ret %d\n", ret); in ath12k_mac_monitor_start()
1062 static int ath12k_mac_monitor_stop(struct ath12k *ar) in ath12k_mac_monitor_stop() argument
1066 lockdep_assert_held(&ar->conf_mutex); in ath12k_mac_monitor_stop()
1068 if (!ar->monitor_started) in ath12k_mac_monitor_stop()
1071 ret = ath12k_mac_monitor_vdev_stop(ar); in ath12k_mac_monitor_stop()
1073 ath12k_warn(ar->ab, "failed to stop monitor vdev: %d\n", ret); in ath12k_mac_monitor_stop()
1077 ar->monitor_started = false; in ath12k_mac_monitor_stop()
1078 ar->num_started_vdevs--; in ath12k_mac_monitor_stop()
1079 ret = ath12k_dp_tx_htt_monitor_mode_ring_config(ar, true); in ath12k_mac_monitor_stop()
1080 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor stopped ret %d\n", ret); in ath12k_mac_monitor_stop()
1086 struct ath12k *ar = hw->priv; in ath12k_mac_op_config() local
1090 mutex_lock(&ar->conf_mutex); in ath12k_mac_op_config()
1093 ar->monitor_conf_enabled = conf->flags & IEEE80211_CONF_MONITOR; in ath12k_mac_op_config()
1094 if (ar->monitor_conf_enabled) { in ath12k_mac_op_config()
1095 if (ar->monitor_vdev_created) in ath12k_mac_op_config()
1097 ret = ath12k_mac_monitor_vdev_create(ar); in ath12k_mac_op_config()
1100 ret = ath12k_mac_monitor_start(ar); in ath12k_mac_op_config()
1104 if (!ar->monitor_vdev_created) in ath12k_mac_op_config()
1106 ret = ath12k_mac_monitor_stop(ar); in ath12k_mac_op_config()
1109 ath12k_mac_monitor_vdev_delete(ar); in ath12k_mac_op_config()
1114 mutex_unlock(&ar->conf_mutex); in ath12k_mac_op_config()
1118 ath12k_mac_monitor_vdev_delete(ar); in ath12k_mac_op_config()
1119 mutex_unlock(&ar->conf_mutex); in ath12k_mac_op_config()
1125 struct ath12k *ar = arvif->ar; in ath12k_mac_setup_bcn_tmpl() local
1126 struct ath12k_base *ab = ar->ab; in ath12k_mac_setup_bcn_tmpl()
1127 struct ieee80211_hw *hw = ar->hw; in ath12k_mac_setup_bcn_tmpl()
1155 ret = ath12k_wmi_bcn_tmpl(ar, arvif->vdev_id, &offs, bcn); in ath12k_mac_setup_bcn_tmpl()
1169 struct ath12k *ar = arvif->ar; in ath12k_control_beaconing() local
1172 lockdep_assert_held(&arvif->ar->conf_mutex); in ath12k_control_beaconing()
1175 ret = ath12k_wmi_vdev_down(ar, arvif->vdev_id); in ath12k_control_beaconing()
1177 ath12k_warn(ar->ab, "failed to down vdev_id %i: %d\n", in ath12k_control_beaconing()
1187 ath12k_warn(ar->ab, "failed to update bcn tmpl during vdev up: %d\n", in ath12k_control_beaconing()
1196 ret = ath12k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid, in ath12k_control_beaconing()
1199 ath12k_warn(ar->ab, "failed to bring up vdev %d: %i\n", in ath12k_control_beaconing()
1206 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %d up\n", arvif->vdev_id); in ath12k_control_beaconing()
1209 static void ath12k_peer_assoc_h_basic(struct ath12k *ar, in ath12k_peer_assoc_h_basic() argument
1217 lockdep_assert_held(&ar->conf_mutex); in ath12k_peer_assoc_h_basic()
1229 arg->peer_listen_intval = ar->hw->conf.listen_interval; in ath12k_peer_assoc_h_basic()
1234 static void ath12k_peer_assoc_h_crypto(struct ath12k *ar, in ath12k_peer_assoc_h_crypto() argument
1246 lockdep_assert_held(&ar->conf_mutex); in ath12k_peer_assoc_h_crypto()
1251 bss = cfg80211_get_bss(ar->hw->wiphy, def.chan, info->bssid, NULL, 0, in ath12k_peer_assoc_h_crypto()
1271 cfg80211_put_bss(ar->hw->wiphy, bss); in ath12k_peer_assoc_h_crypto()
1276 ath12k_dbg(ar->ab, ATH12K_DBG_WMI, in ath12k_peer_assoc_h_crypto()
1282 ath12k_dbg(ar->ab, ATH12K_DBG_WMI, in ath12k_peer_assoc_h_crypto()
1295 static void ath12k_peer_assoc_h_rates(struct ath12k *ar, in ath12k_peer_assoc_h_rates() argument
1310 lockdep_assert_held(&ar->conf_mutex); in ath12k_peer_assoc_h_rates()
1316 sband = ar->hw->wiphy->bands[band]; in ath12k_peer_assoc_h_rates()
1357 static void ath12k_peer_assoc_h_ht(struct ath12k *ar, in ath12k_peer_assoc_h_ht() argument
1371 lockdep_assert_held(&ar->conf_mutex); in ath12k_peer_assoc_h_ht()
1452 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n", in ath12k_peer_assoc_h_ht()
1518 static void ath12k_peer_assoc_h_vht(struct ath12k *ar, in ath12k_peer_assoc_h_vht() argument
1607 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vht peer %pM max_mpdu %d flags 0x%x\n", in ath12k_peer_assoc_h_vht()
1613 static void ath12k_peer_assoc_h_he(struct ath12k *ar, in ath12k_peer_assoc_h_he() argument
1795 static void ath12k_peer_assoc_h_qos(struct ath12k *ar, in ath12k_peer_assoc_h_qos() argument
1827 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac peer %pM qos %d\n", in ath12k_peer_assoc_h_qos()
1831 static int ath12k_peer_assoc_qos_ap(struct ath12k *ar, in ath12k_peer_assoc_qos_ap() argument
1840 lockdep_assert_held(&ar->conf_mutex); in ath12k_peer_assoc_qos_ap()
1844 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac uapsd_queues 0x%x max_sp %d\n", in ath12k_peer_assoc_qos_ap()
1867 ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, &arg); in ath12k_peer_assoc_qos_ap()
1873 ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, &arg); in ath12k_peer_assoc_qos_ap()
1880 ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, &arg); in ath12k_peer_assoc_qos_ap()
1886 ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, &arg); in ath12k_peer_assoc_qos_ap()
1893 ath12k_warn(ar->ab, "failed to set ap ps peer param %d for vdev %i: %d\n", in ath12k_peer_assoc_qos_ap()
1904 static enum wmi_phy_mode ath12k_mac_get_phymode_vht(struct ath12k *ar, in ath12k_mac_get_phymode_vht() argument
1932 static enum wmi_phy_mode ath12k_mac_get_phymode_he(struct ath12k *ar, in ath12k_mac_get_phymode_he() argument
1958 static enum wmi_phy_mode ath12k_mac_get_phymode_eht(struct ath12k *ar, in ath12k_mac_get_phymode_eht() argument
1975 ath12k_warn(ar->ab, "invalid EHT PHY capability info for 160 Mhz: %d\n", in ath12k_mac_get_phymode_eht()
1993 static void ath12k_peer_assoc_h_phymode(struct ath12k *ar, in ath12k_peer_assoc_h_phymode() argument
2048 phymode = ath12k_mac_get_phymode_eht(ar, sta); in ath12k_peer_assoc_h_phymode()
2050 phymode = ath12k_mac_get_phymode_he(ar, sta); in ath12k_peer_assoc_h_phymode()
2053 phymode = ath12k_mac_get_phymode_vht(ar, sta); in ath12k_peer_assoc_h_phymode()
2068 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac peer %pM phymode %s\n", in ath12k_peer_assoc_h_phymode()
2138 static void ath12k_peer_assoc_h_eht(struct ath12k *ar, in ath12k_peer_assoc_h_eht() argument
2221 static void ath12k_peer_assoc_prepare(struct ath12k *ar, in ath12k_peer_assoc_prepare() argument
2227 lockdep_assert_held(&ar->conf_mutex); in ath12k_peer_assoc_prepare()
2231 reinit_completion(&ar->peer_assoc_done); in ath12k_peer_assoc_prepare()
2234 ath12k_peer_assoc_h_basic(ar, vif, sta, arg); in ath12k_peer_assoc_prepare()
2235 ath12k_peer_assoc_h_crypto(ar, vif, sta, arg); in ath12k_peer_assoc_prepare()
2236 ath12k_peer_assoc_h_rates(ar, vif, sta, arg); in ath12k_peer_assoc_prepare()
2237 ath12k_peer_assoc_h_ht(ar, vif, sta, arg); in ath12k_peer_assoc_prepare()
2238 ath12k_peer_assoc_h_vht(ar, vif, sta, arg); in ath12k_peer_assoc_prepare()
2239 ath12k_peer_assoc_h_he(ar, vif, sta, arg); in ath12k_peer_assoc_prepare()
2240 ath12k_peer_assoc_h_eht(ar, vif, sta, arg); in ath12k_peer_assoc_prepare()
2241 ath12k_peer_assoc_h_qos(ar, vif, sta, arg); in ath12k_peer_assoc_prepare()
2242 ath12k_peer_assoc_h_phymode(ar, vif, sta, arg); in ath12k_peer_assoc_prepare()
2248 static int ath12k_setup_peer_smps(struct ath12k *ar, struct ath12k_vif *arvif, in ath12k_setup_peer_smps() argument
2263 return ath12k_wmi_set_peer_param(ar, addr, arvif->vdev_id, in ath12k_setup_peer_smps()
2272 struct ath12k *ar = hw->priv; in ath12k_bss_assoc() local
2280 lockdep_assert_held(&ar->conf_mutex); in ath12k_bss_assoc()
2282 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %i assoc bssid %pM aid %d\n", in ath12k_bss_assoc()
2289 ath12k_warn(ar->ab, "failed to find station entry for bss %pM vdev %i\n", in ath12k_bss_assoc()
2295 ath12k_peer_assoc_prepare(ar, vif, ap_sta, &peer_arg, false); in ath12k_bss_assoc()
2299 ret = ath12k_wmi_send_peer_assoc_cmd(ar, &peer_arg); in ath12k_bss_assoc()
2301 ath12k_warn(ar->ab, "failed to run peer assoc for %pM vdev %i: %d\n", in ath12k_bss_assoc()
2306 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) { in ath12k_bss_assoc()
2307 ath12k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n", in ath12k_bss_assoc()
2312 ret = ath12k_setup_peer_smps(ar, arvif, bss_conf->bssid, in ath12k_bss_assoc()
2315 ath12k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n", in ath12k_bss_assoc()
2325 ret = ath12k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid); in ath12k_bss_assoc()
2327 ath12k_warn(ar->ab, "failed to set vdev %d up: %d\n", in ath12k_bss_assoc()
2334 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_bss_assoc()
2338 spin_lock_bh(&ar->ab->base_lock); in ath12k_bss_assoc()
2340 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arvif->bssid); in ath12k_bss_assoc()
2344 spin_unlock_bh(&ar->ab->base_lock); in ath12k_bss_assoc()
2348 ret = ath12k_wmi_set_peer_param(ar, arvif->bssid, in ath12k_bss_assoc()
2353 ath12k_warn(ar->ab, "Unable to authorize BSS peer: %d\n", ret); in ath12k_bss_assoc()
2356 ret = ath12k_wmi_send_obss_spr_cmd(ar, arvif->vdev_id, in ath12k_bss_assoc()
2359 ath12k_warn(ar->ab, "failed to set vdev %i OBSS PD parameters: %d\n", in ath12k_bss_assoc()
2366 struct ath12k *ar = hw->priv; in ath12k_bss_disassoc() local
2370 lockdep_assert_held(&ar->conf_mutex); in ath12k_bss_disassoc()
2372 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %i disassoc bssid %pM\n", in ath12k_bss_disassoc()
2375 ret = ath12k_wmi_vdev_down(ar, arvif->vdev_id); in ath12k_bss_disassoc()
2377 ath12k_warn(ar->ab, "failed to down vdev %i: %d\n", in ath12k_bss_disassoc()
2410 static void ath12k_recalculate_mgmt_rate(struct ath12k *ar, in ath12k_recalculate_mgmt_rate() argument
2422 lockdep_assert_held(&ar->conf_mutex); in ath12k_recalculate_mgmt_rate()
2424 sband = ar->hw->wiphy->bands[def->chan->band]; in ath12k_recalculate_mgmt_rate()
2430 ath12k_warn(ar->ab, "bitrate not supported %d\n", bitrate); in ath12k_recalculate_mgmt_rate()
2435 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param, in ath12k_recalculate_mgmt_rate()
2438 ath12k_warn(ar->ab, "failed to set mgmt tx rate %d\n", ret); in ath12k_recalculate_mgmt_rate()
2441 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param, in ath12k_recalculate_mgmt_rate()
2444 ath12k_warn(ar->ab, "failed to set beacon tx rate %d\n", ret); in ath12k_recalculate_mgmt_rate()
2450 struct ath12k *ar = arvif->ar; in ath12k_mac_fils_discovery() local
2459 tmpl = ieee80211_get_fils_discovery_tmpl(ar->hw, arvif->vif); in ath12k_mac_fils_discovery()
2461 ret = ath12k_wmi_fils_discovery_tmpl(ar, arvif->vdev_id, in ath12k_mac_fils_discovery()
2467 tmpl = ieee80211_get_unsol_bcast_probe_resp_tmpl(ar->hw, in ath12k_mac_fils_discovery()
2470 ret = ath12k_wmi_probe_resp_tmpl(ar, arvif->vdev_id, in ath12k_mac_fils_discovery()
2473 return ath12k_wmi_fils_discovery(ar, arvif->vdev_id, 0, false); in ath12k_mac_fils_discovery()
2477 ath12k_warn(ar->ab, in ath12k_mac_fils_discovery()
2487 ret = ath12k_wmi_fils_discovery(ar, arvif->vdev_id, interval, in ath12k_mac_fils_discovery()
2498 struct ath12k *ar = hw->priv; in ath12k_mac_op_bss_info_changed() local
2512 mutex_lock(&ar->conf_mutex); in ath12k_mac_op_bss_info_changed()
2518 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_op_bss_info_changed()
2522 ath12k_warn(ar->ab, "Failed to set beacon interval for VDEV: %d\n", in ath12k_mac_op_bss_info_changed()
2525 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_op_bss_info_changed()
2533 ret = ath12k_wmi_pdev_set_param(ar, param_id, in ath12k_mac_op_bss_info_changed()
2534 param_value, ar->pdev->pdev_id); in ath12k_mac_op_bss_info_changed()
2536 ath12k_warn(ar->ab, "Failed to set beacon mode for VDEV: %d\n", in ath12k_mac_op_bss_info_changed()
2539 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_op_bss_info_changed()
2545 ath12k_warn(ar->ab, "failed to update bcn template: %d\n", in ath12k_mac_op_bss_info_changed()
2553 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_op_bss_info_changed()
2558 ath12k_warn(ar->ab, "Failed to set dtim period for VDEV %d: %i\n", in ath12k_mac_op_bss_info_changed()
2561 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_op_bss_info_changed()
2583 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_op_bss_info_changed()
2587 ath12k_warn(ar->ab, in ath12k_mac_op_bss_info_changed()
2593 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_op_bss_info_changed()
2595 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_op_bss_info_changed()
2600 ath12k_warn(ar->ab, "Failed to set he oper params %x for VDEV %d: %i\n", in ath12k_mac_op_bss_info_changed()
2612 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_op_bss_info_changed()
2615 ath12k_warn(ar->ab, "Failed to set CTS prot for VDEV: %d\n", in ath12k_mac_op_bss_info_changed()
2618 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "Set CTS prot: %d for VDEV: %d\n", in ath12k_mac_op_bss_info_changed()
2621 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "defer protection mode setup, vdev is not ready yet\n"); in ath12k_mac_op_bss_info_changed()
2635 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_op_bss_info_changed()
2638 ath12k_warn(ar->ab, "Failed to set erp slot for VDEV: %d\n", in ath12k_mac_op_bss_info_changed()
2641 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_op_bss_info_changed()
2655 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_op_bss_info_changed()
2658 ath12k_warn(ar->ab, "Failed to set preamble for VDEV: %d\n", in ath12k_mac_op_bss_info_changed()
2661 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_op_bss_info_changed()
2674 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev_id %i txpower %d\n", in ath12k_mac_op_bss_info_changed()
2678 ath12k_mac_txpower_recalc(ar); in ath12k_mac_op_bss_info_changed()
2691 if (ar->pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) in ath12k_mac_op_bss_info_changed()
2704 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_op_bss_info_changed()
2709 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_op_bss_info_changed()
2712 ath12k_warn(ar->ab, in ath12k_mac_op_bss_info_changed()
2717 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_op_bss_info_changed()
2720 ath12k_warn(ar->ab, in ath12k_mac_op_bss_info_changed()
2727 ath12k_recalculate_mgmt_rate(ar, vif, &def); in ath12k_mac_op_bss_info_changed()
2731 ath12k_wmi_send_twt_enable_cmd(ar, ar->pdev->pdev_id); in ath12k_mac_op_bss_info_changed()
2733 ath12k_wmi_send_twt_disable_cmd(ar, ar->pdev->pdev_id); in ath12k_mac_op_bss_info_changed()
2737 ath12k_wmi_send_obss_spr_cmd(ar, arvif->vdev_id, in ath12k_mac_op_bss_info_changed()
2742 ret = ath12k_wmi_obss_color_cfg_cmd(ar, in ath12k_mac_op_bss_info_changed()
2748 ath12k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n", in ath12k_mac_op_bss_info_changed()
2751 ret = ath12k_wmi_send_bss_color_change_enable_cmd(ar, in ath12k_mac_op_bss_info_changed()
2755 ath12k_warn(ar->ab, "failed to enable bss color change on vdev %i: %d\n", in ath12k_mac_op_bss_info_changed()
2757 ret = ath12k_wmi_obss_color_cfg_cmd(ar, in ath12k_mac_op_bss_info_changed()
2763 ath12k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n", in ath12k_mac_op_bss_info_changed()
2775 mutex_unlock(&ar->conf_mutex); in ath12k_mac_op_bss_info_changed()
2778 void __ath12k_mac_scan_finish(struct ath12k *ar) in __ath12k_mac_scan_finish() argument
2780 lockdep_assert_held(&ar->data_lock); in __ath12k_mac_scan_finish()
2782 switch (ar->scan.state) { in __ath12k_mac_scan_finish()
2787 if (!ar->scan.is_roc) { in __ath12k_mac_scan_finish()
2789 .aborted = (ar->scan.state == in __ath12k_mac_scan_finish()
2793 ieee80211_scan_completed(ar->hw, &info); in __ath12k_mac_scan_finish()
2794 } else if (ar->scan.roc_notify) { in __ath12k_mac_scan_finish()
2795 ieee80211_remain_on_channel_expired(ar->hw); in __ath12k_mac_scan_finish()
2799 ar->scan.state = ATH12K_SCAN_IDLE; in __ath12k_mac_scan_finish()
2800 ar->scan_channel = NULL; in __ath12k_mac_scan_finish()
2801 ar->scan.roc_freq = 0; in __ath12k_mac_scan_finish()
2802 cancel_delayed_work(&ar->scan.timeout); in __ath12k_mac_scan_finish()
2803 complete(&ar->scan.completed); in __ath12k_mac_scan_finish()
2808 void ath12k_mac_scan_finish(struct ath12k *ar) in ath12k_mac_scan_finish() argument
2810 spin_lock_bh(&ar->data_lock); in ath12k_mac_scan_finish()
2811 __ath12k_mac_scan_finish(ar); in ath12k_mac_scan_finish()
2812 spin_unlock_bh(&ar->data_lock); in ath12k_mac_scan_finish()
2815 static int ath12k_scan_stop(struct ath12k *ar) in ath12k_scan_stop() argument
2823 lockdep_assert_held(&ar->conf_mutex); in ath12k_scan_stop()
2826 arg.pdev_id = ar->pdev->pdev_id; in ath12k_scan_stop()
2828 ret = ath12k_wmi_send_scan_stop_cmd(ar, &arg); in ath12k_scan_stop()
2830 ath12k_warn(ar->ab, "failed to stop wmi scan: %d\n", ret); in ath12k_scan_stop()
2834 ret = wait_for_completion_timeout(&ar->scan.completed, 3 * HZ); in ath12k_scan_stop()
2836 ath12k_warn(ar->ab, in ath12k_scan_stop()
2851 spin_lock_bh(&ar->data_lock); in ath12k_scan_stop()
2852 if (ar->scan.state != ATH12K_SCAN_IDLE) in ath12k_scan_stop()
2853 __ath12k_mac_scan_finish(ar); in ath12k_scan_stop()
2854 spin_unlock_bh(&ar->data_lock); in ath12k_scan_stop()
2859 static void ath12k_scan_abort(struct ath12k *ar) in ath12k_scan_abort() argument
2863 lockdep_assert_held(&ar->conf_mutex); in ath12k_scan_abort()
2865 spin_lock_bh(&ar->data_lock); in ath12k_scan_abort()
2867 switch (ar->scan.state) { in ath12k_scan_abort()
2875 ath12k_warn(ar->ab, "refusing scan abortion due to invalid scan state: %d\n", in ath12k_scan_abort()
2876 ar->scan.state); in ath12k_scan_abort()
2879 ar->scan.state = ATH12K_SCAN_ABORTING; in ath12k_scan_abort()
2880 spin_unlock_bh(&ar->data_lock); in ath12k_scan_abort()
2882 ret = ath12k_scan_stop(ar); in ath12k_scan_abort()
2884 ath12k_warn(ar->ab, "failed to abort scan: %d\n", ret); in ath12k_scan_abort()
2886 spin_lock_bh(&ar->data_lock); in ath12k_scan_abort()
2890 spin_unlock_bh(&ar->data_lock); in ath12k_scan_abort()
2895 struct ath12k *ar = container_of(work, struct ath12k, in ath12k_scan_timeout_work() local
2898 mutex_lock(&ar->conf_mutex); in ath12k_scan_timeout_work()
2899 ath12k_scan_abort(ar); in ath12k_scan_timeout_work()
2900 mutex_unlock(&ar->conf_mutex); in ath12k_scan_timeout_work()
2903 static int ath12k_start_scan(struct ath12k *ar, in ath12k_start_scan() argument
2908 lockdep_assert_held(&ar->conf_mutex); in ath12k_start_scan()
2910 ret = ath12k_wmi_send_scan_start_cmd(ar, arg); in ath12k_start_scan()
2914 ret = wait_for_completion_timeout(&ar->scan.started, 1 * HZ); in ath12k_start_scan()
2916 ret = ath12k_scan_stop(ar); in ath12k_start_scan()
2918 ath12k_warn(ar->ab, "failed to stop scan: %d\n", ret); in ath12k_start_scan()
2927 spin_lock_bh(&ar->data_lock); in ath12k_start_scan()
2928 if (ar->scan.state == ATH12K_SCAN_IDLE) { in ath12k_start_scan()
2929 spin_unlock_bh(&ar->data_lock); in ath12k_start_scan()
2932 spin_unlock_bh(&ar->data_lock); in ath12k_start_scan()
2941 struct ath12k *ar = hw->priv; in ath12k_mac_op_hw_scan() local
2948 mutex_lock(&ar->conf_mutex); in ath12k_mac_op_hw_scan()
2950 spin_lock_bh(&ar->data_lock); in ath12k_mac_op_hw_scan()
2951 switch (ar->scan.state) { in ath12k_mac_op_hw_scan()
2953 reinit_completion(&ar->scan.started); in ath12k_mac_op_hw_scan()
2954 reinit_completion(&ar->scan.completed); in ath12k_mac_op_hw_scan()
2955 ar->scan.state = ATH12K_SCAN_STARTING; in ath12k_mac_op_hw_scan()
2956 ar->scan.is_roc = false; in ath12k_mac_op_hw_scan()
2957 ar->scan.vdev_id = arvif->vdev_id; in ath12k_mac_op_hw_scan()
2966 spin_unlock_bh(&ar->data_lock); in ath12k_mac_op_hw_scan()
2971 ath12k_wmi_start_scan_init(ar, &arg); in ath12k_mac_op_hw_scan()
3006 ret = ath12k_start_scan(ar, &arg); in ath12k_mac_op_hw_scan()
3008 ath12k_warn(ar->ab, "failed to start hw scan: %d\n", ret); in ath12k_mac_op_hw_scan()
3009 spin_lock_bh(&ar->data_lock); in ath12k_mac_op_hw_scan()
3010 ar->scan.state = ATH12K_SCAN_IDLE; in ath12k_mac_op_hw_scan()
3011 spin_unlock_bh(&ar->data_lock); in ath12k_mac_op_hw_scan()
3015 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout, in ath12k_mac_op_hw_scan()
3025 mutex_unlock(&ar->conf_mutex); in ath12k_mac_op_hw_scan()
3032 struct ath12k *ar = hw->priv; in ath12k_mac_op_cancel_hw_scan() local
3034 mutex_lock(&ar->conf_mutex); in ath12k_mac_op_cancel_hw_scan()
3035 ath12k_scan_abort(ar); in ath12k_mac_op_cancel_hw_scan()
3036 mutex_unlock(&ar->conf_mutex); in ath12k_mac_op_cancel_hw_scan()
3038 cancel_delayed_work_sync(&ar->scan.timeout); in ath12k_mac_op_cancel_hw_scan()
3047 struct ath12k *ar = arvif->ar; in ath12k_install_key() local
3057 lockdep_assert_held(&arvif->ar->conf_mutex); in ath12k_install_key()
3059 reinit_completion(&ar->install_key_done); in ath12k_install_key()
3061 if (test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags)) in ath12k_install_key()
3091 ath12k_warn(ar->ab, "cipher %d is not supported\n", key->cipher); in ath12k_install_key()
3095 if (test_bit(ATH12K_FLAG_RAW_MODE, &ar->ab->dev_flags)) in ath12k_install_key()
3100 ret = ath12k_wmi_vdev_install_key(arvif->ar, &arg); in ath12k_install_key()
3105 if (!wait_for_completion_timeout(&ar->install_key_done, 1 * HZ)) in ath12k_install_key()
3111 return ar->install_key_status ? -EINVAL : 0; in ath12k_install_key()
3117 struct ath12k *ar = arvif->ar; in ath12k_clear_peer_keys() local
3118 struct ath12k_base *ab = ar->ab; in ath12k_clear_peer_keys()
3125 lockdep_assert_held(&ar->conf_mutex); in ath12k_clear_peer_keys()
3160 struct ath12k *ar = hw->priv; in ath12k_mac_op_set_key() local
3161 struct ath12k_base *ab = ar->ab; in ath12k_mac_op_set_key()
3176 if (test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags)) in ath12k_mac_op_set_key()
3182 mutex_lock(&ar->conf_mutex); in ath12k_mac_op_set_key()
3275 mutex_unlock(&ar->conf_mutex); in ath12k_mac_op_set_key()
3280 ath12k_mac_bitrate_mask_num_vht_rates(struct ath12k *ar, in ath12k_mac_bitrate_mask_num_vht_rates() argument
3299 struct ath12k *ar = arvif->ar; in ath12k_mac_set_peer_vht_fixed_rate() local
3304 lockdep_assert_held(&ar->conf_mutex); in ath12k_mac_set_peer_vht_fixed_rate()
3316 ath12k_warn(ar->ab, "No single VHT Fixed rate found to set for %pM", in ath12k_mac_set_peer_vht_fixed_rate()
3321 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_set_peer_vht_fixed_rate()
3327 ret = ath12k_wmi_set_peer_param(ar, sta->addr, in ath12k_mac_set_peer_vht_fixed_rate()
3332 ath12k_warn(ar->ab, in ath12k_mac_set_peer_vht_fixed_rate()
3339 static int ath12k_station_assoc(struct ath12k *ar, in ath12k_station_assoc() argument
3352 lockdep_assert_held(&ar->conf_mutex); in ath12k_station_assoc()
3360 ath12k_peer_assoc_prepare(ar, vif, sta, &peer_arg, reassoc); in ath12k_station_assoc()
3363 ath12k_warn(ar->ab, in ath12k_station_assoc()
3367 ret = ath12k_wmi_send_peer_assoc_cmd(ar, &peer_arg); in ath12k_station_assoc()
3369 ath12k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n", in ath12k_station_assoc()
3374 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) { in ath12k_station_assoc()
3375 ath12k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n", in ath12k_station_assoc()
3380 num_vht_rates = ath12k_mac_bitrate_mask_num_vht_rates(ar, band, mask); in ath12k_station_assoc()
3400 ret = ath12k_setup_peer_smps(ar, arvif, sta->addr, in ath12k_station_assoc()
3403 ath12k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n", in ath12k_station_assoc()
3416 ret = ath12k_peer_assoc_qos_ap(ar, arvif, sta); in ath12k_station_assoc()
3418 ath12k_warn(ar->ab, "failed to set qos params for STA %pM for vdev %i: %d\n", in ath12k_station_assoc()
3427 static int ath12k_station_disassoc(struct ath12k *ar, in ath12k_station_disassoc() argument
3434 lockdep_assert_held(&ar->conf_mutex); in ath12k_station_disassoc()
3445 ath12k_warn(ar->ab, "failed to clear all peer keys for vdev %i: %d\n", in ath12k_station_disassoc()
3454 struct ath12k *ar; in ath12k_sta_rc_update_wk() local
3471 ar = arvif->ar; in ath12k_sta_rc_update_wk()
3480 spin_lock_bh(&ar->data_lock); in ath12k_sta_rc_update_wk()
3490 spin_unlock_bh(&ar->data_lock); in ath12k_sta_rc_update_wk()
3492 mutex_lock(&ar->conf_mutex); in ath12k_sta_rc_update_wk()
3499 ath12k_peer_assoc_h_phymode(ar, arvif->vif, sta, &peer_arg); in ath12k_sta_rc_update_wk()
3508 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac bandwidth upgrade for sta %pM new %d old %d\n", in ath12k_sta_rc_update_wk()
3510 err = ath12k_wmi_set_peer_param(ar, sta->addr, in ath12k_sta_rc_update_wk()
3514 ath12k_warn(ar->ab, "failed to update STA %pM to peer phymode %d: %d\n", in ath12k_sta_rc_update_wk()
3518 err = ath12k_wmi_set_peer_param(ar, sta->addr, in ath12k_sta_rc_update_wk()
3522 ath12k_warn(ar->ab, "failed to update STA %pM to peer bandwidth %d: %d\n", in ath12k_sta_rc_update_wk()
3529 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac bandwidth downgrade for sta %pM new %d old %d\n", in ath12k_sta_rc_update_wk()
3531 err = ath12k_wmi_set_peer_param(ar, sta->addr, in ath12k_sta_rc_update_wk()
3535 ath12k_warn(ar->ab, "failed to update STA %pM peer to bandwidth %d: %d\n", in ath12k_sta_rc_update_wk()
3539 err = ath12k_wmi_set_peer_param(ar, sta->addr, in ath12k_sta_rc_update_wk()
3543 ath12k_warn(ar->ab, "failed to update STA %pM to peer phymode %d: %d\n", in ath12k_sta_rc_update_wk()
3549 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac update sta %pM nss %d\n", in ath12k_sta_rc_update_wk()
3552 err = ath12k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id, in ath12k_sta_rc_update_wk()
3555 ath12k_warn(ar->ab, "failed to update STA %pM nss %d: %d\n", in ath12k_sta_rc_update_wk()
3560 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac update sta %pM smps %d\n", in ath12k_sta_rc_update_wk()
3563 err = ath12k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id, in ath12k_sta_rc_update_wk()
3566 ath12k_warn(ar->ab, "failed to update STA %pM smps %d: %d\n", in ath12k_sta_rc_update_wk()
3572 num_vht_rates = ath12k_mac_bitrate_mask_num_vht_rates(ar, band, in ath12k_sta_rc_update_wk()
3594 ath12k_peer_assoc_prepare(ar, arvif->vif, sta, in ath12k_sta_rc_update_wk()
3597 err = ath12k_wmi_send_peer_assoc_cmd(ar, &peer_arg); in ath12k_sta_rc_update_wk()
3599 ath12k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n", in ath12k_sta_rc_update_wk()
3602 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) in ath12k_sta_rc_update_wk()
3603 ath12k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n", in ath12k_sta_rc_update_wk()
3608 mutex_unlock(&ar->conf_mutex); in ath12k_sta_rc_update_wk()
3614 struct ath12k *ar = arvif->ar; in ath12k_mac_inc_num_stations() local
3616 lockdep_assert_held(&ar->conf_mutex); in ath12k_mac_inc_num_stations()
3621 if (ar->num_stations >= ar->max_num_stations) in ath12k_mac_inc_num_stations()
3624 ar->num_stations++; in ath12k_mac_inc_num_stations()
3632 struct ath12k *ar = arvif->ar; in ath12k_mac_dec_num_stations() local
3634 lockdep_assert_held(&ar->conf_mutex); in ath12k_mac_dec_num_stations()
3639 ar->num_stations--; in ath12k_mac_dec_num_stations()
3642 static int ath12k_mac_station_add(struct ath12k *ar, in ath12k_mac_station_add() argument
3646 struct ath12k_base *ab = ar->ab; in ath12k_mac_station_add()
3652 lockdep_assert_held(&ar->conf_mutex); in ath12k_mac_station_add()
3657 ar->max_num_stations); in ath12k_mac_station_add()
3671 ret = ath12k_peer_create(ar, arvif, sta, &peer_param); in ath12k_mac_station_add()
3682 ret = ath12k_wmi_set_peer_param(ar, sta->addr, in ath12k_mac_station_add()
3692 ret = ath12k_dp_peer_setup(ar, arvif->vdev_id, sta->addr); in ath12k_mac_station_add()
3702 ret = ath12k_start_vdev_delay(ar->hw, vif); in ath12k_mac_station_add()
3712 ath12k_peer_delete(ar, arvif->vdev_id, sta->addr); in ath12k_mac_station_add()
3719 static u32 ath12k_mac_ieee80211_sta_bw_to_wmi(struct ath12k *ar, in ath12k_mac_ieee80211_sta_bw_to_wmi() argument
3738 ath12k_warn(ar->ab, "Invalid bandwidth %d in rc update for %pM\n", in ath12k_mac_ieee80211_sta_bw_to_wmi()
3753 struct ath12k *ar = hw->priv; in ath12k_mac_op_sta_state() local
3764 mutex_lock(&ar->conf_mutex); in ath12k_mac_op_sta_state()
3772 ret = ath12k_mac_station_add(ar, vif, sta); in ath12k_mac_op_sta_state()
3774 ath12k_warn(ar->ab, "Failed to add station: %pM for VDEV: %d\n", in ath12k_mac_op_sta_state()
3778 ath12k_dp_peer_cleanup(ar, arvif->vdev_id, sta->addr); in ath12k_mac_op_sta_state()
3780 ret = ath12k_peer_delete(ar, arvif->vdev_id, sta->addr); in ath12k_mac_op_sta_state()
3782 ath12k_warn(ar->ab, "Failed to delete peer: %pM for VDEV: %d\n", in ath12k_mac_op_sta_state()
3785 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "Removed peer: %pM for VDEV: %d\n", in ath12k_mac_op_sta_state()
3789 spin_lock_bh(&ar->ab->base_lock); in ath12k_mac_op_sta_state()
3790 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, sta->addr); in ath12k_mac_op_sta_state()
3792 ath12k_warn(ar->ab, "Found peer entry %pM n vdev %i after it was supposedly removed\n", in ath12k_mac_op_sta_state()
3797 ar->num_peers--; in ath12k_mac_op_sta_state()
3799 spin_unlock_bh(&ar->ab->base_lock); in ath12k_mac_op_sta_state()
3808 ret = ath12k_station_assoc(ar, vif, sta, false); in ath12k_mac_op_sta_state()
3810 ath12k_warn(ar->ab, "Failed to associate station: %pM\n", in ath12k_mac_op_sta_state()
3813 spin_lock_bh(&ar->data_lock); in ath12k_mac_op_sta_state()
3815 arsta->bw = ath12k_mac_ieee80211_sta_bw_to_wmi(ar, sta); in ath12k_mac_op_sta_state()
3818 spin_unlock_bh(&ar->data_lock); in ath12k_mac_op_sta_state()
3821 spin_lock_bh(&ar->ab->base_lock); in ath12k_mac_op_sta_state()
3823 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, sta->addr); in ath12k_mac_op_sta_state()
3827 spin_unlock_bh(&ar->ab->base_lock); in ath12k_mac_op_sta_state()
3830 ret = ath12k_wmi_set_peer_param(ar, sta->addr, in ath12k_mac_op_sta_state()
3835 ath12k_warn(ar->ab, "Unable to authorize peer %pM vdev %d: %d\n", in ath12k_mac_op_sta_state()
3840 spin_lock_bh(&ar->ab->base_lock); in ath12k_mac_op_sta_state()
3842 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, sta->addr); in ath12k_mac_op_sta_state()
3846 spin_unlock_bh(&ar->ab->base_lock); in ath12k_mac_op_sta_state()
3852 ret = ath12k_station_disassoc(ar, vif, sta); in ath12k_mac_op_sta_state()
3854 ath12k_warn(ar->ab, "Failed to disassociate station: %pM\n", in ath12k_mac_op_sta_state()
3858 mutex_unlock(&ar->conf_mutex); in ath12k_mac_op_sta_state()
3866 struct ath12k *ar = hw->priv; in ath12k_mac_op_sta_set_txpwr() local
3882 mutex_lock(&ar->conf_mutex); in ath12k_mac_op_sta_set_txpwr()
3884 ret = ath12k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id, in ath12k_mac_op_sta_set_txpwr()
3887 ath12k_warn(ar->ab, "failed to set tx power for station ret: %d\n", in ath12k_mac_op_sta_set_txpwr()
3893 mutex_unlock(&ar->conf_mutex); in ath12k_mac_op_sta_set_txpwr()
3902 struct ath12k *ar = hw->priv; in ath12k_mac_op_sta_rc_update() local
3908 spin_lock_bh(&ar->ab->base_lock); in ath12k_mac_op_sta_rc_update()
3910 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, sta->addr); in ath12k_mac_op_sta_rc_update()
3912 spin_unlock_bh(&ar->ab->base_lock); in ath12k_mac_op_sta_rc_update()
3913 ath12k_warn(ar->ab, "mac sta rc update failed to find peer %pM on vdev %i\n", in ath12k_mac_op_sta_rc_update()
3918 spin_unlock_bh(&ar->ab->base_lock); in ath12k_mac_op_sta_rc_update()
3920 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_op_sta_rc_update()
3925 spin_lock_bh(&ar->data_lock); in ath12k_mac_op_sta_rc_update()
3928 bw = ath12k_mac_ieee80211_sta_bw_to_wmi(ar, sta); in ath12k_mac_op_sta_rc_update()
3951 ath12k_warn(ar->ab, "Invalid smps %d in sta rc update for %pM\n", in ath12k_mac_op_sta_rc_update()
3962 spin_unlock_bh(&ar->data_lock); in ath12k_mac_op_sta_rc_update()
3967 static int ath12k_conf_tx_uapsd(struct ath12k *ar, struct ieee80211_vif *vif, in ath12k_conf_tx_uapsd() argument
4001 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath12k_conf_tx_uapsd()
4005 ath12k_warn(ar->ab, "could not set uapsd params %d\n", ret); in ath12k_conf_tx_uapsd()
4014 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath12k_conf_tx_uapsd()
4018 ath12k_warn(ar->ab, "could not set rx wake param %d\n", ret); in ath12k_conf_tx_uapsd()
4029 struct ath12k *ar = hw->priv; in ath12k_mac_op_conf_tx() local
4034 mutex_lock(&ar->conf_mutex); in ath12k_mac_op_conf_tx()
4061 ret = ath12k_wmi_send_wmm_update_cmd(ar, arvif->vdev_id, in ath12k_mac_op_conf_tx()
4064 ath12k_warn(ar->ab, "failed to set wmm params: %d\n", ret); in ath12k_mac_op_conf_tx()
4068 ret = ath12k_conf_tx_uapsd(ar, vif, ac, params->uapsd); in ath12k_mac_op_conf_tx()
4071 ath12k_warn(ar->ab, "failed to set sta uapsd: %d\n", ret); in ath12k_mac_op_conf_tx()
4074 mutex_unlock(&ar->conf_mutex); in ath12k_mac_op_conf_tx()
4079 ath12k_create_ht_cap(struct ath12k *ar, u32 ar_ht_cap, u32 rate_cap_rx_chainmask) in ath12k_create_ht_cap() argument
4083 u32 ar_vht_cap = ar->pdev->cap.vht_cap; in ath12k_create_ht_cap()
4134 for (i = 0; i < ar->num_rx_chains; i++) { in ath12k_create_ht_cap()
4147 struct ath12k *ar = arvif->ar; in ath12k_mac_set_txbf_conf() local
4150 u32 vht_cap = ar->pdev->cap.vht_cap; in ath12k_mac_set_txbf_conf()
4163 if (sound_dim > (ar->num_tx_chains - 1)) in ath12k_mac_set_txbf_conf()
4164 sound_dim = ar->num_tx_chains - 1; in ath12k_mac_set_txbf_conf()
4187 return ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_set_txbf_conf()
4191 static void ath12k_set_vht_txbf_cap(struct ath12k *ar, u32 *vht_cap) in ath12k_set_vht_txbf_cap() argument
4199 if (ar->num_tx_chains < 2) { in ath12k_set_vht_txbf_cap()
4221 if (sound_dim > (ar->num_tx_chains - 1)) in ath12k_set_vht_txbf_cap()
4222 sound_dim = ar->num_tx_chains - 1; in ath12k_set_vht_txbf_cap()
4234 ath12k_create_vht_cap(struct ath12k *ar, u32 rate_cap_tx_chainmask, in ath12k_create_vht_cap() argument
4242 vht_cap.cap = ar->pdev->cap.vht_cap; in ath12k_create_vht_cap()
4244 ath12k_set_vht_txbf_cap(ar, &vht_cap.cap); in ath12k_create_vht_cap()
4254 if (i < ar->num_tx_chains && rate_cap_tx_chainmask & BIT(i)) in ath12k_create_vht_cap()
4259 if (i < ar->num_rx_chains && rate_cap_rx_chainmask & BIT(i)) in ath12k_create_vht_cap()
4274 static void ath12k_mac_setup_ht_vht_cap(struct ath12k *ar, in ath12k_mac_setup_ht_vht_cap() argument
4283 rate_cap_tx_chainmask = ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift; in ath12k_mac_setup_ht_vht_cap()
4284 rate_cap_rx_chainmask = ar->cfg_rx_chainmask >> cap->rx_chain_mask_shift; in ath12k_mac_setup_ht_vht_cap()
4287 band = &ar->mac.sbands[NL80211_BAND_2GHZ]; in ath12k_mac_setup_ht_vht_cap()
4291 band->ht_cap = ath12k_create_ht_cap(ar, ht_cap, in ath12k_mac_setup_ht_vht_cap()
4296 (ar->ab->hw_params->single_pdev_only || in ath12k_mac_setup_ht_vht_cap()
4297 !ar->supports_6ghz)) { in ath12k_mac_setup_ht_vht_cap()
4298 band = &ar->mac.sbands[NL80211_BAND_5GHZ]; in ath12k_mac_setup_ht_vht_cap()
4302 band->ht_cap = ath12k_create_ht_cap(ar, ht_cap, in ath12k_mac_setup_ht_vht_cap()
4304 band->vht_cap = ath12k_create_vht_cap(ar, rate_cap_tx_chainmask, in ath12k_mac_setup_ht_vht_cap()
4309 static int ath12k_check_chain_mask(struct ath12k *ar, u32 ant, bool is_tx_ant) in ath12k_check_chain_mask() argument
4610 static int ath12k_mac_copy_sband_iftype_data(struct ath12k *ar, in ath12k_mac_copy_sband_iftype_data() argument
4633 ath12k_mac_copy_he_cap(band_cap, i, ar->num_tx_chains, he_cap); in ath12k_mac_copy_sband_iftype_data()
4646 static void ath12k_mac_setup_sband_iftype_data(struct ath12k *ar, in ath12k_mac_setup_sband_iftype_data() argument
4655 count = ath12k_mac_copy_sband_iftype_data(ar, cap, in ath12k_mac_setup_sband_iftype_data()
4656 ar->mac.iftype[band], in ath12k_mac_setup_sband_iftype_data()
4658 sband = &ar->mac.sbands[band]; in ath12k_mac_setup_sband_iftype_data()
4659 sband->iftype_data = ar->mac.iftype[band]; in ath12k_mac_setup_sband_iftype_data()
4665 count = ath12k_mac_copy_sband_iftype_data(ar, cap, in ath12k_mac_setup_sband_iftype_data()
4666 ar->mac.iftype[band], in ath12k_mac_setup_sband_iftype_data()
4668 sband = &ar->mac.sbands[band]; in ath12k_mac_setup_sband_iftype_data()
4669 sband->iftype_data = ar->mac.iftype[band]; in ath12k_mac_setup_sband_iftype_data()
4674 ar->supports_6ghz) { in ath12k_mac_setup_sband_iftype_data()
4676 count = ath12k_mac_copy_sband_iftype_data(ar, cap, in ath12k_mac_setup_sband_iftype_data()
4677 ar->mac.iftype[band], in ath12k_mac_setup_sband_iftype_data()
4679 sband = &ar->mac.sbands[band]; in ath12k_mac_setup_sband_iftype_data()
4680 sband->iftype_data = ar->mac.iftype[band]; in ath12k_mac_setup_sband_iftype_data()
4685 static int __ath12k_set_antenna(struct ath12k *ar, u32 tx_ant, u32 rx_ant) in __ath12k_set_antenna() argument
4689 lockdep_assert_held(&ar->conf_mutex); in __ath12k_set_antenna()
4691 if (ath12k_check_chain_mask(ar, tx_ant, true)) in __ath12k_set_antenna()
4694 if (ath12k_check_chain_mask(ar, rx_ant, false)) in __ath12k_set_antenna()
4697 ar->cfg_tx_chainmask = tx_ant; in __ath12k_set_antenna()
4698 ar->cfg_rx_chainmask = rx_ant; in __ath12k_set_antenna()
4700 if (ar->state != ATH12K_STATE_ON && in __ath12k_set_antenna()
4701 ar->state != ATH12K_STATE_RESTARTED) in __ath12k_set_antenna()
4704 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_TX_CHAIN_MASK, in __ath12k_set_antenna()
4705 tx_ant, ar->pdev->pdev_id); in __ath12k_set_antenna()
4707 ath12k_warn(ar->ab, "failed to set tx-chainmask: %d, req 0x%x\n", in __ath12k_set_antenna()
4712 ar->num_tx_chains = hweight32(tx_ant); in __ath12k_set_antenna()
4714 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_RX_CHAIN_MASK, in __ath12k_set_antenna()
4715 rx_ant, ar->pdev->pdev_id); in __ath12k_set_antenna()
4717 ath12k_warn(ar->ab, "failed to set rx-chainmask: %d, req 0x%x\n", in __ath12k_set_antenna()
4722 ar->num_rx_chains = hweight32(rx_ant); in __ath12k_set_antenna()
4725 ath12k_mac_setup_ht_vht_cap(ar, &ar->pdev->cap, NULL); in __ath12k_set_antenna()
4726 ath12k_mac_setup_sband_iftype_data(ar, &ar->pdev->cap); in __ath12k_set_antenna()
4731 static void ath12k_mgmt_over_wmi_tx_drop(struct ath12k *ar, struct sk_buff *skb) in ath12k_mgmt_over_wmi_tx_drop() argument
4735 ieee80211_free_txskb(ar->hw, skb); in ath12k_mgmt_over_wmi_tx_drop()
4737 num_mgmt = atomic_dec_if_positive(&ar->num_pending_mgmt_tx); in ath12k_mgmt_over_wmi_tx_drop()
4743 wake_up(&ar->txmgmt_empty_waitq); in ath12k_mgmt_over_wmi_tx_drop()
4750 struct ath12k *ar = ctx; in ath12k_mac_tx_mgmt_pending_free() local
4751 struct ath12k_base *ab = ar->ab; in ath12k_mac_tx_mgmt_pending_free()
4753 spin_lock_bh(&ar->txmgmt_idr_lock); in ath12k_mac_tx_mgmt_pending_free()
4754 idr_remove(&ar->txmgmt_idr, buf_id); in ath12k_mac_tx_mgmt_pending_free()
4755 spin_unlock_bh(&ar->txmgmt_idr_lock); in ath12k_mac_tx_mgmt_pending_free()
4762 ath12k_mgmt_over_wmi_tx_drop(ar, skb); in ath12k_mac_tx_mgmt_pending_free()
4772 struct ath12k *ar = skb_cb->ar; in ath12k_mac_vif_txmgmt_idr_remove() local
4773 struct ath12k_base *ab = ar->ab; in ath12k_mac_vif_txmgmt_idr_remove()
4776 spin_lock_bh(&ar->txmgmt_idr_lock); in ath12k_mac_vif_txmgmt_idr_remove()
4777 idr_remove(&ar->txmgmt_idr, buf_id); in ath12k_mac_vif_txmgmt_idr_remove()
4778 spin_unlock_bh(&ar->txmgmt_idr_lock); in ath12k_mac_vif_txmgmt_idr_remove()
4786 static int ath12k_mac_mgmt_tx_wmi(struct ath12k *ar, struct ath12k_vif *arvif, in ath12k_mac_mgmt_tx_wmi() argument
4789 struct ath12k_base *ab = ar->ab; in ath12k_mac_mgmt_tx_wmi()
4796 ATH12K_SKB_CB(skb)->ar = ar; in ath12k_mac_mgmt_tx_wmi()
4797 spin_lock_bh(&ar->txmgmt_idr_lock); in ath12k_mac_mgmt_tx_wmi()
4798 buf_id = idr_alloc(&ar->txmgmt_idr, skb, 0, in ath12k_mac_mgmt_tx_wmi()
4800 spin_unlock_bh(&ar->txmgmt_idr_lock); in ath12k_mac_mgmt_tx_wmi()
4823 ret = ath12k_wmi_mgmt_send(ar, arvif->vdev_id, buf_id, skb); in ath12k_mac_mgmt_tx_wmi()
4825 ath12k_warn(ar->ab, "failed to send mgmt frame: %d\n", ret); in ath12k_mac_mgmt_tx_wmi()
4835 spin_lock_bh(&ar->txmgmt_idr_lock); in ath12k_mac_mgmt_tx_wmi()
4836 idr_remove(&ar->txmgmt_idr, buf_id); in ath12k_mac_mgmt_tx_wmi()
4837 spin_unlock_bh(&ar->txmgmt_idr_lock); in ath12k_mac_mgmt_tx_wmi()
4842 static void ath12k_mgmt_over_wmi_tx_purge(struct ath12k *ar) in ath12k_mgmt_over_wmi_tx_purge() argument
4846 while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL) in ath12k_mgmt_over_wmi_tx_purge()
4847 ath12k_mgmt_over_wmi_tx_drop(ar, skb); in ath12k_mgmt_over_wmi_tx_purge()
4852 struct ath12k *ar = container_of(work, struct ath12k, wmi_mgmt_tx_work); in ath12k_mgmt_over_wmi_tx_work() local
4858 while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL) { in ath12k_mgmt_over_wmi_tx_work()
4861 ath12k_warn(ar->ab, "no vif found for mgmt frame\n"); in ath12k_mgmt_over_wmi_tx_work()
4862 ath12k_mgmt_over_wmi_tx_drop(ar, skb); in ath12k_mgmt_over_wmi_tx_work()
4867 if (ar->allocated_vdev_map & (1LL << arvif->vdev_id) && in ath12k_mgmt_over_wmi_tx_work()
4869 ret = ath12k_mac_mgmt_tx_wmi(ar, arvif, skb); in ath12k_mgmt_over_wmi_tx_work()
4871 ath12k_warn(ar->ab, "failed to tx mgmt frame, vdev_id %d :%d\n", in ath12k_mgmt_over_wmi_tx_work()
4873 ath12k_mgmt_over_wmi_tx_drop(ar, skb); in ath12k_mgmt_over_wmi_tx_work()
4876 ath12k_warn(ar->ab, in ath12k_mgmt_over_wmi_tx_work()
4880 ath12k_mgmt_over_wmi_tx_drop(ar, skb); in ath12k_mgmt_over_wmi_tx_work()
4885 static int ath12k_mac_mgmt_tx(struct ath12k *ar, struct sk_buff *skb, in ath12k_mac_mgmt_tx() argument
4888 struct sk_buff_head *q = &ar->wmi_mgmt_tx_queue; in ath12k_mac_mgmt_tx()
4890 if (test_bit(ATH12K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags)) in ath12k_mac_mgmt_tx()
4899 atomic_read(&ar->num_pending_mgmt_tx) > ATH12K_PRB_RSP_DROP_THRESHOLD) { in ath12k_mac_mgmt_tx()
4900 ath12k_warn(ar->ab, in ath12k_mac_mgmt_tx()
4906 ath12k_warn(ar->ab, "mgmt tx queue is full\n"); in ath12k_mac_mgmt_tx()
4911 atomic_inc(&ar->num_pending_mgmt_tx); in ath12k_mac_mgmt_tx()
4912 ieee80211_queue_work(ar->hw, &ar->wmi_mgmt_tx_work); in ath12k_mac_mgmt_tx()
4922 struct ath12k *ar = hw->priv; in ath12k_mac_op_tx() local
4944 ret = ath12k_mac_mgmt_tx(ar, skb, is_prb_rsp); in ath12k_mac_op_tx()
4946 ath12k_warn(ar->ab, "failed to queue management frame %d\n", in ath12k_mac_op_tx()
4953 ret = ath12k_dp_tx(ar, arvif, skb); in ath12k_mac_op_tx()
4955 ath12k_warn(ar->ab, "failed to transmit frame %d\n", ret); in ath12k_mac_op_tx()
4960 void ath12k_mac_drain_tx(struct ath12k *ar) in ath12k_mac_drain_tx() argument
4965 cancel_work_sync(&ar->wmi_mgmt_tx_work); in ath12k_mac_drain_tx()
4966 ath12k_mgmt_over_wmi_tx_purge(ar); in ath12k_mac_drain_tx()
4969 static int ath12k_mac_config_mon_status_default(struct ath12k *ar, bool enable) in ath12k_mac_config_mon_status_default() argument
4999 struct ath12k *ar = hw->priv; in ath12k_mac_op_start() local
5000 struct ath12k_base *ab = ar->ab; in ath12k_mac_op_start()
5001 struct ath12k_pdev *pdev = ar->pdev; in ath12k_mac_op_start()
5004 ath12k_mac_drain_tx(ar); in ath12k_mac_op_start()
5005 mutex_lock(&ar->conf_mutex); in ath12k_mac_op_start()
5007 switch (ar->state) { in ath12k_mac_op_start()
5009 ar->state = ATH12K_STATE_ON; in ath12k_mac_op_start()
5012 ar->state = ATH12K_STATE_RESTARTED; in ath12k_mac_op_start()
5023 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_PMF_QOS, in ath12k_mac_op_start()
5027 ath12k_err(ar->ab, "failed to enable PMF QOS: (%d\n", ret); in ath12k_mac_op_start()
5031 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_DYNAMIC_BW, 1, in ath12k_mac_op_start()
5034 ath12k_err(ar->ab, "failed to enable dynamic bw: %d\n", ret); in ath12k_mac_op_start()
5038 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_ARP_AC_OVERRIDE, in ath12k_mac_op_start()
5046 ret = ath12k_wmi_send_dfs_phyerr_offload_enable_cmd(ar, pdev->pdev_id); in ath12k_mac_op_start()
5053 ret = ath12k_dp_tx_htt_h2t_ppdu_stats_req(ar, in ath12k_mac_op_start()
5060 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_MESH_MCAST_ENABLE, in ath12k_mac_op_start()
5064 ath12k_err(ar->ab, "failed to enable MESH MCAST ENABLE: (%d\n", ret); in ath12k_mac_op_start()
5068 __ath12k_set_antenna(ar, ar->cfg_tx_chainmask, ar->cfg_rx_chainmask); in ath12k_mac_op_start()
5072 ath12k_reg_update_chan_list(ar); in ath12k_mac_op_start()
5074 ar->num_started_vdevs = 0; in ath12k_mac_op_start()
5075 ar->num_created_vdevs = 0; in ath12k_mac_op_start()
5076 ar->num_peers = 0; in ath12k_mac_op_start()
5077 ar->allocated_vdev_map = 0; in ath12k_mac_op_start()
5082 ret = ath12k_mac_config_mon_status_default(ar, true); in ath12k_mac_op_start()
5090 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_op_start()
5094 ath12k_wmi_pdev_lro_cfg(ar, ar->pdev->pdev_id); in ath12k_mac_op_start()
5098 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_IDLE_PS_CONFIG, in ath12k_mac_op_start()
5106 mutex_unlock(&ar->conf_mutex); in ath12k_mac_op_start()
5108 rcu_assign_pointer(ab->pdevs_active[ar->pdev_idx], in ath12k_mac_op_start()
5109 &ab->pdevs[ar->pdev_idx]); in ath12k_mac_op_start()
5114 ar->state = ATH12K_STATE_OFF; in ath12k_mac_op_start()
5115 mutex_unlock(&ar->conf_mutex); in ath12k_mac_op_start()
5122 struct ath12k *ar = hw->priv; in ath12k_mac_op_stop() local
5126 ath12k_mac_drain_tx(ar); in ath12k_mac_op_stop()
5128 mutex_lock(&ar->conf_mutex); in ath12k_mac_op_stop()
5129 ret = ath12k_mac_config_mon_status_default(ar, false); in ath12k_mac_op_stop()
5131 ath12k_err(ar->ab, "failed to clear rx_filter for monitor status ring: (%d)\n", in ath12k_mac_op_stop()
5134 clear_bit(ATH12K_CAC_RUNNING, &ar->dev_flags); in ath12k_mac_op_stop()
5135 ar->state = ATH12K_STATE_OFF; in ath12k_mac_op_stop()
5136 mutex_unlock(&ar->conf_mutex); in ath12k_mac_op_stop()
5138 cancel_delayed_work_sync(&ar->scan.timeout); in ath12k_mac_op_stop()
5139 cancel_work_sync(&ar->regd_update_work); in ath12k_mac_op_stop()
5141 spin_lock_bh(&ar->data_lock); in ath12k_mac_op_stop()
5142 list_for_each_entry_safe(ppdu_stats, tmp, &ar->ppdu_stats_info, list) { in ath12k_mac_op_stop()
5146 spin_unlock_bh(&ar->data_lock); in ath12k_mac_op_stop()
5148 rcu_assign_pointer(ar->ab->pdevs_active[ar->pdev_idx], NULL); in ath12k_mac_op_stop()
5152 atomic_set(&ar->num_pending_mgmt_tx, 0); in ath12k_mac_op_stop()
5158 struct ath12k_base *ab = arvif->ar->ab; in ath12k_mac_get_vdev_stats_id()
5181 struct ath12k *ar = arvif->ar; in ath12k_mac_setup_vdev_create_arg() local
5182 struct ath12k_pdev *pdev = ar->pdev; in ath12k_mac_setup_vdev_create_arg()
5190 arg->chains[NL80211_BAND_2GHZ].tx = ar->num_tx_chains; in ath12k_mac_setup_vdev_create_arg()
5191 arg->chains[NL80211_BAND_2GHZ].rx = ar->num_rx_chains; in ath12k_mac_setup_vdev_create_arg()
5194 arg->chains[NL80211_BAND_5GHZ].tx = ar->num_tx_chains; in ath12k_mac_setup_vdev_create_arg()
5195 arg->chains[NL80211_BAND_5GHZ].rx = ar->num_rx_chains; in ath12k_mac_setup_vdev_create_arg()
5198 ar->supports_6ghz) { in ath12k_mac_setup_vdev_create_arg()
5199 arg->chains[NL80211_BAND_6GHZ].tx = ar->num_tx_chains; in ath12k_mac_setup_vdev_create_arg()
5200 arg->chains[NL80211_BAND_6GHZ].rx = ar->num_rx_chains; in ath12k_mac_setup_vdev_create_arg()
5240 static int ath12k_set_he_mu_sounding_mode(struct ath12k *ar, in ath12k_set_he_mu_sounding_mode() argument
5244 struct ath12k_base *ab = ar->ab; in ath12k_set_he_mu_sounding_mode()
5248 param_value = ath12k_mac_prepare_he_mode(ar->pdev, arvif->vif->type); in ath12k_set_he_mu_sounding_mode()
5249 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_set_he_mu_sounding_mode()
5261 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_set_he_mu_sounding_mode()
5274 struct ath12k *ar = hw->priv; in ath12k_mac_op_update_vif_offload() local
5275 struct ath12k_base *ab = ar->ab; in ath12k_mac_op_update_vif_offload()
5293 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_op_update_vif_offload()
5309 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_op_update_vif_offload()
5321 struct ath12k *ar = hw->priv; in ath12k_mac_op_add_interface() local
5322 struct ath12k_base *ab = ar->ab; in ath12k_mac_op_add_interface()
5334 mutex_lock(&ar->conf_mutex); in ath12k_mac_op_add_interface()
5337 ar->num_peers > (ar->max_num_peers - 1)) { in ath12k_mac_op_add_interface()
5343 if (ar->num_created_vdevs > (TARGET_NUM_VDEVS - 1)) { in ath12k_mac_op_add_interface()
5352 arvif->ar = ar; in ath12k_mac_op_add_interface()
5387 ar->monitor_vdev_id = bit; in ath12k_mac_op_add_interface()
5394 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac add interface id %d type %d subtype %d map %llx\n", in ath12k_mac_op_add_interface()
5404 ret = ath12k_wmi_vdev_create(ar, vif->addr, &vdev_arg); in ath12k_mac_op_add_interface()
5411 ar->num_created_vdevs++; in ath12k_mac_op_add_interface()
5414 ar->allocated_vdev_map |= 1LL << arvif->vdev_id; in ath12k_mac_op_add_interface()
5417 spin_lock_bh(&ar->data_lock); in ath12k_mac_op_add_interface()
5418 list_add(&arvif->list, &ar->arvifs); in ath12k_mac_op_add_interface()
5419 spin_unlock_bh(&ar->data_lock); in ath12k_mac_op_add_interface()
5423 nss = hweight32(ar->cfg_tx_chainmask) ? : 1; in ath12k_mac_op_add_interface()
5424 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_op_add_interface()
5428 arvif->vdev_id, ar->cfg_tx_chainmask, nss, ret); in ath12k_mac_op_add_interface()
5437 ret = ath12k_peer_create(ar, arvif, NULL, &peer_param); in ath12k_mac_op_add_interface()
5446 ath12k_warn(ar->ab, "failed to set vdev %i kickout parameters: %d\n", in ath12k_mac_op_add_interface()
5454 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath12k_mac_op_add_interface()
5457 ath12k_warn(ar->ab, "failed to set vdev %d RX wake policy: %d\n", in ath12k_mac_op_add_interface()
5464 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath12k_mac_op_add_interface()
5467 ath12k_warn(ar->ab, "failed to set vdev %d TX wake threshold: %d\n", in ath12k_mac_op_add_interface()
5474 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath12k_mac_op_add_interface()
5477 ath12k_warn(ar->ab, "failed to set vdev %d pspoll count: %d\n", in ath12k_mac_op_add_interface()
5482 ret = ath12k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id, false); in ath12k_mac_op_add_interface()
5484 ath12k_warn(ar->ab, "failed to disable vdev %d ps mode: %d\n", in ath12k_mac_op_add_interface()
5494 ret = ath12k_mac_txpower_recalc(ar); in ath12k_mac_op_add_interface()
5500 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_op_add_interface()
5503 ath12k_warn(ar->ab, "failed to set rts threshold for vdev %d: %d\n", in ath12k_mac_op_add_interface()
5507 ath12k_dp_vdev_tx_attach(ar, arvif); in ath12k_mac_op_add_interface()
5509 if (vif->type != NL80211_IFTYPE_MONITOR && ar->monitor_conf_enabled) in ath12k_mac_op_add_interface()
5510 ath12k_mac_monitor_vdev_create(ar); in ath12k_mac_op_add_interface()
5512 mutex_unlock(&ar->conf_mutex); in ath12k_mac_op_add_interface()
5518 reinit_completion(&ar->peer_delete_done); in ath12k_mac_op_add_interface()
5520 ret = ath12k_wmi_send_peer_delete_cmd(ar, vif->addr, in ath12k_mac_op_add_interface()
5523 ath12k_warn(ar->ab, "failed to delete peer vdev_id %d addr %pM\n", in ath12k_mac_op_add_interface()
5528 ret = ath12k_wait_for_peer_delete_done(ar, arvif->vdev_id, in ath12k_mac_op_add_interface()
5533 ar->num_peers--; in ath12k_mac_op_add_interface()
5537 ath12k_wmi_vdev_delete(ar, arvif->vdev_id); in ath12k_mac_op_add_interface()
5538 ar->num_created_vdevs--; in ath12k_mac_op_add_interface()
5539 ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id); in ath12k_mac_op_add_interface()
5542 spin_lock_bh(&ar->data_lock); in ath12k_mac_op_add_interface()
5544 spin_unlock_bh(&ar->data_lock); in ath12k_mac_op_add_interface()
5547 mutex_unlock(&ar->conf_mutex); in ath12k_mac_op_add_interface()
5580 struct ath12k *ar = hw->priv; in ath12k_mac_op_remove_interface() local
5582 struct ath12k_base *ab = ar->ab; in ath12k_mac_op_remove_interface()
5586 mutex_lock(&ar->conf_mutex); in ath12k_mac_op_remove_interface()
5592 ret = ath12k_peer_delete(ar, arvif->vdev_id, vif->addr); in ath12k_mac_op_remove_interface()
5598 reinit_completion(&ar->vdev_delete_done); in ath12k_mac_op_remove_interface()
5600 ret = ath12k_wmi_vdev_delete(ar, arvif->vdev_id); in ath12k_mac_op_remove_interface()
5607 time_left = wait_for_completion_timeout(&ar->vdev_delete_done, in ath12k_mac_op_remove_interface()
5615 ar->monitor_vdev_id = -1; in ath12k_mac_op_remove_interface()
5616 ar->monitor_vdev_created = false; in ath12k_mac_op_remove_interface()
5617 } else if (ar->monitor_vdev_created && !ar->monitor_started) { in ath12k_mac_op_remove_interface()
5618 ret = ath12k_mac_monitor_vdev_delete(ar); in ath12k_mac_op_remove_interface()
5622 ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id); in ath12k_mac_op_remove_interface()
5624 ar->num_created_vdevs--; in ath12k_mac_op_remove_interface()
5630 spin_lock_bh(&ar->data_lock); in ath12k_mac_op_remove_interface()
5632 spin_unlock_bh(&ar->data_lock); in ath12k_mac_op_remove_interface()
5634 ath12k_peer_cleanup(ar, arvif->vdev_id); in ath12k_mac_op_remove_interface()
5636 idr_for_each(&ar->txmgmt_idr, in ath12k_mac_op_remove_interface()
5643 ath12k_mac_txpower_recalc(ar); in ath12k_mac_op_remove_interface()
5644 clear_bit(ATH12K_FLAG_MONITOR_ENABLED, &ar->monitor_flags); in ath12k_mac_op_remove_interface()
5648 mutex_unlock(&ar->conf_mutex); in ath12k_mac_op_remove_interface()
5666 struct ath12k *ar = hw->priv; in ath12k_mac_op_configure_filter() local
5670 mutex_lock(&ar->conf_mutex); in ath12k_mac_op_configure_filter()
5673 ar->filter_flags = *total_flags; in ath12k_mac_op_configure_filter()
5676 reset_flag = !(ar->filter_flags & FIF_BCN_PRBRESP_PROMISC); in ath12k_mac_op_configure_filter()
5678 ret = ath12k_dp_tx_htt_monitor_mode_ring_config(ar, reset_flag); in ath12k_mac_op_configure_filter()
5681 set_bit(ATH12K_FLAG_MONITOR_ENABLED, &ar->monitor_flags); in ath12k_mac_op_configure_filter()
5683 clear_bit(ATH12K_FLAG_MONITOR_ENABLED, &ar->monitor_flags); in ath12k_mac_op_configure_filter()
5685 ath12k_warn(ar->ab, in ath12k_mac_op_configure_filter()
5688 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_op_configure_filter()
5692 mutex_unlock(&ar->conf_mutex); in ath12k_mac_op_configure_filter()
5697 struct ath12k *ar = hw->priv; in ath12k_mac_op_get_antenna() local
5699 mutex_lock(&ar->conf_mutex); in ath12k_mac_op_get_antenna()
5701 *tx_ant = ar->cfg_tx_chainmask; in ath12k_mac_op_get_antenna()
5702 *rx_ant = ar->cfg_rx_chainmask; in ath12k_mac_op_get_antenna()
5704 mutex_unlock(&ar->conf_mutex); in ath12k_mac_op_get_antenna()
5711 struct ath12k *ar = hw->priv; in ath12k_mac_op_set_antenna() local
5714 mutex_lock(&ar->conf_mutex); in ath12k_mac_op_set_antenna()
5715 ret = __ath12k_set_antenna(ar, tx_ant, rx_ant); in ath12k_mac_op_set_antenna()
5716 mutex_unlock(&ar->conf_mutex); in ath12k_mac_op_set_antenna()
5725 struct ath12k *ar = hw->priv; in ath12k_mac_op_ampdu_action() local
5728 mutex_lock(&ar->conf_mutex); in ath12k_mac_op_ampdu_action()
5732 ret = ath12k_dp_rx_ampdu_start(ar, params); in ath12k_mac_op_ampdu_action()
5735 ret = ath12k_dp_rx_ampdu_stop(ar, params); in ath12k_mac_op_ampdu_action()
5749 mutex_unlock(&ar->conf_mutex); in ath12k_mac_op_ampdu_action()
5757 struct ath12k *ar = hw->priv; in ath12k_mac_op_add_chanctx() local
5758 struct ath12k_base *ab = ar->ab; in ath12k_mac_op_add_chanctx()
5764 mutex_lock(&ar->conf_mutex); in ath12k_mac_op_add_chanctx()
5766 spin_lock_bh(&ar->data_lock); in ath12k_mac_op_add_chanctx()
5770 ar->rx_channel = ctx->def.chan; in ath12k_mac_op_add_chanctx()
5771 spin_unlock_bh(&ar->data_lock); in ath12k_mac_op_add_chanctx()
5773 mutex_unlock(&ar->conf_mutex); in ath12k_mac_op_add_chanctx()
5781 struct ath12k *ar = hw->priv; in ath12k_mac_op_remove_chanctx() local
5782 struct ath12k_base *ab = ar->ab; in ath12k_mac_op_remove_chanctx()
5788 mutex_lock(&ar->conf_mutex); in ath12k_mac_op_remove_chanctx()
5790 spin_lock_bh(&ar->data_lock); in ath12k_mac_op_remove_chanctx()
5794 ar->rx_channel = NULL; in ath12k_mac_op_remove_chanctx()
5795 spin_unlock_bh(&ar->data_lock); in ath12k_mac_op_remove_chanctx()
5797 mutex_unlock(&ar->conf_mutex); in ath12k_mac_op_remove_chanctx()
5805 struct ath12k *ar = arvif->ar; in ath12k_mac_vdev_start_restart() local
5806 struct ath12k_base *ab = ar->ab; in ath12k_mac_vdev_start_restart()
5811 lockdep_assert_held(&ar->conf_mutex); in ath12k_mac_vdev_start_restart()
5813 reinit_completion(&ar->vdev_setup_done); in ath12k_mac_vdev_start_restart()
5830 arg.pref_tx_streams = ar->num_tx_chains; in ath12k_mac_vdev_start_restart()
5831 arg.pref_rx_streams = ar->num_rx_chains; in ath12k_mac_vdev_start_restart()
5844 arg.regdomain = ar->ab->dfs_region; in ath12k_mac_vdev_start_restart()
5849 ret = ath12k_set_he_mu_sounding_mode(ar, arvif); in ath12k_mac_vdev_start_restart()
5851 ath12k_warn(ar->ab, "failed to set he mode vdev %i\n", in ath12k_mac_vdev_start_restart()
5865 ret = ath12k_wmi_vdev_start(ar, &arg, restart); in ath12k_mac_vdev_start_restart()
5867 ath12k_warn(ar->ab, "failed to %s WMI vdev %i\n", in ath12k_mac_vdev_start_restart()
5872 ret = ath12k_mac_vdev_setup_sync(ar); in ath12k_mac_vdev_start_restart()
5879 ar->num_started_vdevs++; in ath12k_mac_vdev_start_restart()
5893 set_bit(ATH12K_CAC_RUNNING, &ar->dev_flags); in ath12k_mac_vdev_start_restart()
5909 struct ath12k *ar = arvif->ar; in ath12k_mac_vdev_stop() local
5912 lockdep_assert_held(&ar->conf_mutex); in ath12k_mac_vdev_stop()
5914 reinit_completion(&ar->vdev_setup_done); in ath12k_mac_vdev_stop()
5916 ret = ath12k_wmi_vdev_stop(ar, arvif->vdev_id); in ath12k_mac_vdev_stop()
5918 ath12k_warn(ar->ab, "failed to stop WMI vdev %i: %d\n", in ath12k_mac_vdev_stop()
5923 ret = ath12k_mac_vdev_setup_sync(ar); in ath12k_mac_vdev_stop()
5925 ath12k_warn(ar->ab, "failed to synchronize setup for vdev %i: %d\n", in ath12k_mac_vdev_stop()
5930 WARN_ON(ar->num_started_vdevs == 0); in ath12k_mac_vdev_stop()
5932 ar->num_started_vdevs--; in ath12k_mac_vdev_stop()
5933 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "vdev %pM stopped, vdev_id %d\n", in ath12k_mac_vdev_stop()
5936 if (test_bit(ATH12K_CAC_RUNNING, &ar->dev_flags)) { in ath12k_mac_vdev_stop()
5937 clear_bit(ATH12K_CAC_RUNNING, &ar->dev_flags); in ath12k_mac_vdev_stop()
5938 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "CAC Stopped for vdev %d\n", in ath12k_mac_vdev_stop()
5999 ath12k_mac_update_vif_chan(struct ath12k *ar, in ath12k_mac_update_vif_chan() argument
6003 struct ath12k_base *ab = ar->ab; in ath12k_mac_update_vif_chan()
6009 lockdep_assert_held(&ar->conf_mutex); in ath12k_mac_update_vif_chan()
6031 ret = ath12k_wmi_vdev_down(ar, arvif->vdev_id); in ath12k_mac_update_vif_chan()
6043 /* TODO: Update ar->rx_channel */ in ath12k_mac_update_vif_chan()
6081 ret = ath12k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid, in ath12k_mac_update_vif_chan()
6091 if (!monitor_vif && ar->monitor_vdev_created) { in ath12k_mac_update_vif_chan()
6092 if (!ath12k_mac_monitor_stop(ar)) in ath12k_mac_update_vif_chan()
6093 ath12k_mac_monitor_start(ar); in ath12k_mac_update_vif_chan()
6098 ath12k_mac_update_active_vif_chan(struct ath12k *ar, in ath12k_mac_update_active_vif_chan() argument
6103 lockdep_assert_held(&ar->conf_mutex); in ath12k_mac_update_active_vif_chan()
6105 ieee80211_iterate_active_interfaces_atomic(ar->hw, in ath12k_mac_update_active_vif_chan()
6116 ieee80211_iterate_active_interfaces_atomic(ar->hw, in ath12k_mac_update_active_vif_chan()
6121 ath12k_mac_update_vif_chan(ar, arg.vifs, arg.n_vifs); in ath12k_mac_update_active_vif_chan()
6130 struct ath12k *ar = hw->priv; in ath12k_mac_op_change_chanctx() local
6131 struct ath12k_base *ab = ar->ab; in ath12k_mac_op_change_chanctx()
6133 mutex_lock(&ar->conf_mutex); in ath12k_mac_op_change_chanctx()
6146 ath12k_mac_update_active_vif_chan(ar, ctx); in ath12k_mac_op_change_chanctx()
6151 mutex_unlock(&ar->conf_mutex); in ath12k_mac_op_change_chanctx()
6157 struct ath12k *ar = hw->priv; in ath12k_start_vdev_delay() local
6158 struct ath12k_base *ab = ar->ab; in ath12k_start_vdev_delay()
6174 ret = ath12k_monitor_vdev_up(ar, arvif->vdev_id); in ath12k_start_vdev_delay()
6193 struct ath12k *ar = hw->priv; in ath12k_mac_op_assign_vif_chanctx() local
6194 struct ath12k_base *ab = ar->ab; in ath12k_mac_op_assign_vif_chanctx()
6199 mutex_lock(&ar->conf_mutex); in ath12k_mac_op_assign_vif_chanctx()
6227 param.peer_addr = ar->mac_addr; in ath12k_mac_op_assign_vif_chanctx()
6229 ret = ath12k_peer_create(ar, arvif, NULL, ¶m); in ath12k_mac_op_assign_vif_chanctx()
6238 ret = ath12k_mac_monitor_start(ar); in ath12k_mac_op_assign_vif_chanctx()
6253 if (arvif->vdev_type != WMI_VDEV_TYPE_MONITOR && ar->monitor_vdev_created) in ath12k_mac_op_assign_vif_chanctx()
6254 ath12k_mac_monitor_start(ar); in ath12k_mac_op_assign_vif_chanctx()
6261 mutex_unlock(&ar->conf_mutex); in ath12k_mac_op_assign_vif_chanctx()
6272 struct ath12k *ar = hw->priv; in ath12k_mac_op_unassign_vif_chanctx() local
6273 struct ath12k_base *ab = ar->ab; in ath12k_mac_op_unassign_vif_chanctx()
6277 mutex_lock(&ar->conf_mutex); in ath12k_mac_op_unassign_vif_chanctx()
6287 ath12k_peer_find_by_addr(ab, ar->mac_addr)) in ath12k_mac_op_unassign_vif_chanctx()
6288 ath12k_peer_delete(ar, arvif->vdev_id, ar->mac_addr); in ath12k_mac_op_unassign_vif_chanctx()
6291 ret = ath12k_mac_monitor_stop(ar); in ath12k_mac_op_unassign_vif_chanctx()
6293 mutex_unlock(&ar->conf_mutex); in ath12k_mac_op_unassign_vif_chanctx()
6309 ath12k_wmi_vdev_down(ar, arvif->vdev_id); in ath12k_mac_op_unassign_vif_chanctx()
6312 ar->num_started_vdevs == 1 && ar->monitor_vdev_created) in ath12k_mac_op_unassign_vif_chanctx()
6313 ath12k_mac_monitor_stop(ar); in ath12k_mac_op_unassign_vif_chanctx()
6315 mutex_unlock(&ar->conf_mutex); in ath12k_mac_op_unassign_vif_chanctx()
6324 struct ath12k *ar = hw->priv; in ath12k_mac_op_switch_vif_chanctx() local
6326 mutex_lock(&ar->conf_mutex); in ath12k_mac_op_switch_vif_chanctx()
6328 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_op_switch_vif_chanctx()
6331 ath12k_mac_update_vif_chan(ar, vifs, n_vifs); in ath12k_mac_op_switch_vif_chanctx()
6333 mutex_unlock(&ar->conf_mutex); in ath12k_mac_op_switch_vif_chanctx()
6339 ath12k_set_vdev_param_to_all_vifs(struct ath12k *ar, int param, u32 value) in ath12k_set_vdev_param_to_all_vifs() argument
6344 mutex_lock(&ar->conf_mutex); in ath12k_set_vdev_param_to_all_vifs()
6345 list_for_each_entry(arvif, &ar->arvifs, list) { in ath12k_set_vdev_param_to_all_vifs()
6346 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "setting mac vdev %d param %d value %d\n", in ath12k_set_vdev_param_to_all_vifs()
6349 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_set_vdev_param_to_all_vifs()
6352 ath12k_warn(ar->ab, "failed to set param %d for vdev %d: %d\n", in ath12k_set_vdev_param_to_all_vifs()
6357 mutex_unlock(&ar->conf_mutex); in ath12k_set_vdev_param_to_all_vifs()
6366 struct ath12k *ar = hw->priv; in ath12k_mac_op_set_rts_threshold() local
6369 return ath12k_set_vdev_param_to_all_vifs(ar, param_id, value); in ath12k_mac_op_set_rts_threshold()
6390 struct ath12k *ar = hw->priv; in ath12k_mac_op_flush() local
6396 time_left = wait_event_timeout(ar->dp.tx_empty_waitq, in ath12k_mac_op_flush()
6397 (atomic_read(&ar->dp.num_tx_pending) == 0), in ath12k_mac_op_flush()
6400 ath12k_warn(ar->ab, "failed to flush transmit queue %ld\n", time_left); in ath12k_mac_op_flush()
6402 time_left = wait_event_timeout(ar->txmgmt_empty_waitq, in ath12k_mac_op_flush()
6403 (atomic_read(&ar->num_pending_mgmt_tx) == 0), in ath12k_mac_op_flush()
6406 ath12k_warn(ar->ab, "failed to flush mgmt transmit queue %ld\n", in ath12k_mac_op_flush()
6411 ath12k_mac_bitrate_mask_num_ht_rates(struct ath12k *ar, in ath12k_mac_bitrate_mask_num_ht_rates() argument
6425 ath12k_mac_has_single_legacy_rate(struct ath12k *ar, in ath12k_mac_has_single_legacy_rate() argument
6433 if (ath12k_mac_bitrate_mask_num_ht_rates(ar, band, mask)) in ath12k_mac_has_single_legacy_rate()
6436 if (ath12k_mac_bitrate_mask_num_vht_rates(ar, band, mask)) in ath12k_mac_has_single_legacy_rate()
6443 ath12k_mac_bitrate_mask_get_single_nss(struct ath12k *ar, in ath12k_mac_bitrate_mask_get_single_nss() argument
6448 struct ieee80211_supported_band *sband = &ar->mac.sbands[band]; in ath12k_mac_bitrate_mask_get_single_nss()
6493 ath12k_mac_get_single_legacy_rate(struct ath12k *ar, in ath12k_mac_get_single_legacy_rate() argument
6528 struct ath12k *ar = arvif->ar; in ath12k_mac_set_fixed_rate_params() local
6532 lockdep_assert_held(&ar->conf_mutex); in ath12k_mac_set_fixed_rate_params()
6534 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac set fixed rate params vdev %i rate 0x%02x nss %u sgi %u\n", in ath12k_mac_set_fixed_rate_params()
6538 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_set_fixed_rate_params()
6541 ath12k_warn(ar->ab, "failed to set fixed rate param 0x%02x: %d\n", in ath12k_mac_set_fixed_rate_params()
6547 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_set_fixed_rate_params()
6550 ath12k_warn(ar->ab, "failed to set nss param %d: %d\n", in ath12k_mac_set_fixed_rate_params()
6556 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_set_fixed_rate_params()
6559 ath12k_warn(ar->ab, "failed to set sgi param %d: %d\n", in ath12k_mac_set_fixed_rate_params()
6565 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_set_fixed_rate_params()
6568 ath12k_warn(ar->ab, "failed to set ldpc param %d: %d\n", in ath12k_mac_set_fixed_rate_params()
6577 ath12k_mac_vht_mcs_range_present(struct ath12k *ar, in ath12k_mac_vht_mcs_range_present() argument
6606 struct ath12k *ar = arvif->ar; in ath12k_mac_set_bitrate_mask_iter() local
6608 spin_lock_bh(&ar->data_lock); in ath12k_mac_set_bitrate_mask_iter()
6610 spin_unlock_bh(&ar->data_lock); in ath12k_mac_set_bitrate_mask_iter()
6612 ieee80211_queue_work(ar->hw, &arsta->update_wk); in ath12k_mac_set_bitrate_mask_iter()
6619 struct ath12k *ar = arvif->ar; in ath12k_mac_disable_peer_fixed_rate() local
6622 ret = ath12k_wmi_set_peer_param(ar, sta->addr, in ath12k_mac_disable_peer_fixed_rate()
6627 ath12k_warn(ar->ab, in ath12k_mac_disable_peer_fixed_rate()
6639 struct ath12k *ar = arvif->ar; in ath12k_mac_op_set_bitrate_mask() local
6657 ldpc = !!(ar->ht_cap_info & WMI_HT_CAP_LDPC); in ath12k_mac_op_set_bitrate_mask()
6671 if (ath12k_mac_has_single_legacy_rate(ar, band, mask)) { in ath12k_mac_op_set_bitrate_mask()
6672 ret = ath12k_mac_get_single_legacy_rate(ar, band, mask, &rate, in ath12k_mac_op_set_bitrate_mask()
6675 ath12k_warn(ar->ab, "failed to get single legacy rate for vdev %i: %d\n", in ath12k_mac_op_set_bitrate_mask()
6682 } else if (ath12k_mac_bitrate_mask_get_single_nss(ar, band, mask, in ath12k_mac_op_set_bitrate_mask()
6688 nss = min_t(u32, ar->num_tx_chains, in ath12k_mac_op_set_bitrate_mask()
6712 num_rates = ath12k_mac_bitrate_mask_num_vht_rates(ar, band, in ath12k_mac_op_set_bitrate_mask()
6715 if (!ath12k_mac_vht_mcs_range_present(ar, band, mask) && in ath12k_mac_op_set_bitrate_mask()
6720 ath12k_warn(ar->ab, in ath12k_mac_op_set_bitrate_mask()
6729 mutex_lock(&ar->conf_mutex); in ath12k_mac_op_set_bitrate_mask()
6736 mutex_unlock(&ar->conf_mutex); in ath12k_mac_op_set_bitrate_mask()
6739 mutex_lock(&ar->conf_mutex); in ath12k_mac_op_set_bitrate_mask()
6743 ath12k_warn(ar->ab, "failed to set fixed rate params on vdev %i: %d\n", in ath12k_mac_op_set_bitrate_mask()
6747 mutex_unlock(&ar->conf_mutex); in ath12k_mac_op_set_bitrate_mask()
6756 struct ath12k *ar = hw->priv; in ath12k_mac_op_reconfig_complete() local
6757 struct ath12k_base *ab = ar->ab; in ath12k_mac_op_reconfig_complete()
6764 mutex_lock(&ar->conf_mutex); in ath12k_mac_op_reconfig_complete()
6766 if (ar->state == ATH12K_STATE_RESTARTED) { in ath12k_mac_op_reconfig_complete()
6767 ath12k_warn(ar->ab, "pdev %d successfully recovered\n", in ath12k_mac_op_reconfig_complete()
6768 ar->pdev->pdev_id); in ath12k_mac_op_reconfig_complete()
6769 ar->state = ATH12K_STATE_ON; in ath12k_mac_op_reconfig_complete()
6788 list_for_each_entry(arvif, &ar->arvifs, list) { in ath12k_mac_op_reconfig_complete()
6809 mutex_unlock(&ar->conf_mutex); in ath12k_mac_op_reconfig_complete()
6813 ath12k_mac_update_bss_chan_survey(struct ath12k *ar, in ath12k_mac_update_bss_chan_survey() argument
6819 lockdep_assert_held(&ar->conf_mutex); in ath12k_mac_update_bss_chan_survey()
6821 if (!test_bit(WMI_TLV_SERVICE_BSS_CHANNEL_INFO_64, ar->ab->wmi_ab.svc_map) || in ath12k_mac_update_bss_chan_survey()
6822 ar->rx_channel != channel) in ath12k_mac_update_bss_chan_survey()
6825 if (ar->scan.state != ATH12K_SCAN_IDLE) { in ath12k_mac_update_bss_chan_survey()
6826 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_update_bss_chan_survey()
6831 reinit_completion(&ar->bss_survey_done); in ath12k_mac_update_bss_chan_survey()
6833 ret = ath12k_wmi_pdev_bss_chan_info_request(ar, type); in ath12k_mac_update_bss_chan_survey()
6835 ath12k_warn(ar->ab, "failed to send pdev bss chan info request\n"); in ath12k_mac_update_bss_chan_survey()
6839 ret = wait_for_completion_timeout(&ar->bss_survey_done, 3 * HZ); in ath12k_mac_update_bss_chan_survey()
6841 ath12k_warn(ar->ab, "bss channel survey timed out\n"); in ath12k_mac_update_bss_chan_survey()
6847 struct ath12k *ar = hw->priv; in ath12k_mac_op_get_survey() local
6855 ar_survey = &ar->survey[idx]; in ath12k_mac_op_get_survey()
6857 mutex_lock(&ar->conf_mutex); in ath12k_mac_op_get_survey()
6873 ath12k_mac_update_bss_chan_survey(ar, &sband->channels[idx]); in ath12k_mac_op_get_survey()
6875 spin_lock_bh(&ar->data_lock); in ath12k_mac_op_get_survey()
6877 spin_unlock_bh(&ar->data_lock); in ath12k_mac_op_get_survey()
6881 if (ar->rx_channel == survey->channel) in ath12k_mac_op_get_survey()
6885 mutex_unlock(&ar->conf_mutex); in ath12k_mac_op_get_survey()
6959 static void ath12k_mac_update_ch_list(struct ath12k *ar, in ath12k_mac_update_ch_list() argument
6975 static u32 ath12k_get_phy_id(struct ath12k *ar, u32 band) in ath12k_get_phy_id() argument
6977 struct ath12k_pdev *pdev = ar->pdev; in ath12k_get_phy_id()
6986 ath12k_warn(ar->ab, "unsupported phy cap:%d\n", band); in ath12k_get_phy_id()
6991 static int ath12k_mac_setup_channels_rates(struct ath12k *ar, in ath12k_mac_setup_channels_rates() argument
7004 reg_cap = &ar->ab->hal_reg_cap[ar->pdev_idx]; in ath12k_mac_setup_channels_rates()
7013 band = &ar->mac.sbands[NL80211_BAND_2GHZ]; in ath12k_mac_setup_channels_rates()
7019 ar->hw->wiphy->bands[NL80211_BAND_2GHZ] = band; in ath12k_mac_setup_channels_rates()
7021 if (ar->ab->hw_params->single_pdev_only) { in ath12k_mac_setup_channels_rates()
7022 phy_id = ath12k_get_phy_id(ar, WMI_HOST_WLAN_2G_CAP); in ath12k_mac_setup_channels_rates()
7023 reg_cap = &ar->ab->hal_reg_cap[phy_id]; in ath12k_mac_setup_channels_rates()
7025 ath12k_mac_update_ch_list(ar, band, in ath12k_mac_setup_channels_rates()
7035 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); in ath12k_mac_setup_channels_rates()
7039 ar->supports_6ghz = true; in ath12k_mac_setup_channels_rates()
7040 band = &ar->mac.sbands[NL80211_BAND_6GHZ]; in ath12k_mac_setup_channels_rates()
7046 ar->hw->wiphy->bands[NL80211_BAND_6GHZ] = band; in ath12k_mac_setup_channels_rates()
7047 ath12k_mac_update_ch_list(ar, band, in ath12k_mac_setup_channels_rates()
7057 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); in ath12k_mac_setup_channels_rates()
7058 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels); in ath12k_mac_setup_channels_rates()
7062 band = &ar->mac.sbands[NL80211_BAND_5GHZ]; in ath12k_mac_setup_channels_rates()
7068 ar->hw->wiphy->bands[NL80211_BAND_5GHZ] = band; in ath12k_mac_setup_channels_rates()
7070 if (ar->ab->hw_params->single_pdev_only) { in ath12k_mac_setup_channels_rates()
7071 phy_id = ath12k_get_phy_id(ar, WMI_HOST_WLAN_5G_CAP); in ath12k_mac_setup_channels_rates()
7072 reg_cap = &ar->ab->hal_reg_cap[phy_id]; in ath12k_mac_setup_channels_rates()
7075 ath12k_mac_update_ch_list(ar, band, in ath12k_mac_setup_channels_rates()
7084 static int ath12k_mac_setup_iface_combinations(struct ath12k *ar) in ath12k_mac_setup_iface_combinations() argument
7086 struct ath12k_base *ab = ar->ab; in ath12k_mac_setup_iface_combinations()
7137 ar->hw->wiphy->iface_combinations = combinations; in ath12k_mac_setup_iface_combinations()
7138 ar->hw->wiphy->n_iface_combinations = 1; in ath12k_mac_setup_iface_combinations()
7180 static void __ath12k_mac_unregister(struct ath12k *ar) in __ath12k_mac_unregister() argument
7182 cancel_work_sync(&ar->regd_update_work); in __ath12k_mac_unregister()
7184 ieee80211_unregister_hw(ar->hw); in __ath12k_mac_unregister()
7186 idr_for_each(&ar->txmgmt_idr, ath12k_mac_tx_mgmt_pending_free, ar); in __ath12k_mac_unregister()
7187 idr_destroy(&ar->txmgmt_idr); in __ath12k_mac_unregister()
7189 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); in __ath12k_mac_unregister()
7190 kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels); in __ath12k_mac_unregister()
7191 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels); in __ath12k_mac_unregister()
7193 kfree(ar->hw->wiphy->iface_combinations[0].limits); in __ath12k_mac_unregister()
7194 kfree(ar->hw->wiphy->iface_combinations); in __ath12k_mac_unregister()
7196 SET_IEEE80211_DEV(ar->hw, NULL); in __ath12k_mac_unregister()
7201 struct ath12k *ar; in ath12k_mac_unregister() local
7207 ar = pdev->ar; in ath12k_mac_unregister()
7208 if (!ar) in ath12k_mac_unregister()
7211 __ath12k_mac_unregister(ar); in ath12k_mac_unregister()
7215 static int __ath12k_mac_register(struct ath12k *ar) in __ath12k_mac_register() argument
7217 struct ath12k_base *ab = ar->ab; in __ath12k_mac_register()
7218 struct ath12k_pdev_cap *cap = &ar->pdev->cap; in __ath12k_mac_register()
7233 ath12k_pdev_caps_update(ar); in __ath12k_mac_register()
7235 SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr); in __ath12k_mac_register()
7237 SET_IEEE80211_DEV(ar->hw, ab->dev); in __ath12k_mac_register()
7239 ret = ath12k_mac_setup_channels_rates(ar, in __ath12k_mac_register()
7244 ath12k_mac_setup_ht_vht_cap(ar, cap, &ht_cap); in __ath12k_mac_register()
7245 ath12k_mac_setup_sband_iftype_data(ar, cap); in __ath12k_mac_register()
7247 ret = ath12k_mac_setup_iface_combinations(ar); in __ath12k_mac_register()
7249 ath12k_err(ar->ab, "failed to setup interface combinations: %d\n", ret); in __ath12k_mac_register()
7253 ar->hw->wiphy->available_antennas_rx = cap->rx_chain_mask; in __ath12k_mac_register()
7254 ar->hw->wiphy->available_antennas_tx = cap->tx_chain_mask; in __ath12k_mac_register()
7256 ar->hw->wiphy->interface_modes = ab->hw_params->interface_modes; in __ath12k_mac_register()
7258 ieee80211_hw_set(ar->hw, SIGNAL_DBM); in __ath12k_mac_register()
7259 ieee80211_hw_set(ar->hw, SUPPORTS_PS); in __ath12k_mac_register()
7260 ieee80211_hw_set(ar->hw, SUPPORTS_DYNAMIC_PS); in __ath12k_mac_register()
7261 ieee80211_hw_set(ar->hw, MFP_CAPABLE); in __ath12k_mac_register()
7262 ieee80211_hw_set(ar->hw, REPORTS_TX_ACK_STATUS); in __ath12k_mac_register()
7263 ieee80211_hw_set(ar->hw, HAS_RATE_CONTROL); in __ath12k_mac_register()
7264 ieee80211_hw_set(ar->hw, AP_LINK_PS); in __ath12k_mac_register()
7265 ieee80211_hw_set(ar->hw, SPECTRUM_MGMT); in __ath12k_mac_register()
7266 ieee80211_hw_set(ar->hw, CONNECTION_MONITOR); in __ath12k_mac_register()
7267 ieee80211_hw_set(ar->hw, SUPPORTS_PER_STA_GTK); in __ath12k_mac_register()
7268 ieee80211_hw_set(ar->hw, CHANCTX_STA_CSA); in __ath12k_mac_register()
7269 ieee80211_hw_set(ar->hw, QUEUE_CONTROL); in __ath12k_mac_register()
7270 ieee80211_hw_set(ar->hw, SUPPORTS_TX_FRAG); in __ath12k_mac_register()
7271 ieee80211_hw_set(ar->hw, REPORTS_LOW_ACK); in __ath12k_mac_register()
7274 ieee80211_hw_set(ar->hw, AMPDU_AGGREGATION); in __ath12k_mac_register()
7275 ieee80211_hw_set(ar->hw, TX_AMPDU_SETUP_IN_HW); in __ath12k_mac_register()
7276 ieee80211_hw_set(ar->hw, SUPPORTS_REORDERING_BUFFER); in __ath12k_mac_register()
7277 ieee80211_hw_set(ar->hw, SUPPORTS_AMSDU_IN_AMPDU); in __ath12k_mac_register()
7278 ieee80211_hw_set(ar->hw, USES_RSS); in __ath12k_mac_register()
7281 ar->hw->wiphy->features |= NL80211_FEATURE_STATIC_SMPS; in __ath12k_mac_register()
7282 ar->hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN; in __ath12k_mac_register()
7289 ar->hw->wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS; in __ath12k_mac_register()
7291 ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID; in __ath12k_mac_register()
7292 ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN; in __ath12k_mac_register()
7294 ar->hw->max_listen_interval = ATH12K_MAX_HW_LISTEN_INTERVAL; in __ath12k_mac_register()
7296 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL; in __ath12k_mac_register()
7297 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH; in __ath12k_mac_register()
7298 ar->hw->wiphy->max_remain_on_channel_duration = 5000; in __ath12k_mac_register()
7300 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD; in __ath12k_mac_register()
7301 ar->hw->wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE | in __ath12k_mac_register()
7304 ar->max_num_stations = TARGET_NUM_STATIONS; in __ath12k_mac_register()
7305 ar->max_num_peers = TARGET_NUM_PEERS_PDEV; in __ath12k_mac_register()
7307 ar->hw->wiphy->max_ap_assoc_sta = ar->max_num_stations; in __ath12k_mac_register()
7309 ar->hw->queues = ATH12K_HW_MAX_QUEUES; in __ath12k_mac_register()
7310 ar->hw->wiphy->tx_queue_len = ATH12K_QUEUE_LEN; in __ath12k_mac_register()
7311 ar->hw->offchannel_tx_hw_queue = ATH12K_HW_MAX_QUEUES - 1; in __ath12k_mac_register()
7312 ar->hw->max_rx_aggregation_subframes = IEEE80211_MAX_AMPDU_BUF_HE; in __ath12k_mac_register()
7314 ar->hw->vif_data_size = sizeof(struct ath12k_vif); in __ath12k_mac_register()
7315 ar->hw->sta_data_size = sizeof(struct ath12k_sta); in __ath12k_mac_register()
7317 wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST); in __ath12k_mac_register()
7318 wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_STA_TX_PWR); in __ath12k_mac_register()
7320 ar->hw->wiphy->cipher_suites = cipher_suites; in __ath12k_mac_register()
7321 ar->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites); in __ath12k_mac_register()
7323 ar->hw->wiphy->iftype_ext_capab = ath12k_iftypes_ext_capa; in __ath12k_mac_register()
7324 ar->hw->wiphy->num_iftype_ext_capab = in __ath12k_mac_register()
7327 if (ar->supports_6ghz) { in __ath12k_mac_register()
7328 wiphy_ext_feature_set(ar->hw->wiphy, in __ath12k_mac_register()
7330 wiphy_ext_feature_set(ar->hw->wiphy, in __ath12k_mac_register()
7334 wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_PUNCT); in __ath12k_mac_register()
7336 ath12k_reg_init(ar); in __ath12k_mac_register()
7339 ar->hw->netdev_features = NETIF_F_HW_CSUM; in __ath12k_mac_register()
7340 ieee80211_hw_set(ar->hw, SW_CRYPTO_CONTROL); in __ath12k_mac_register()
7341 ieee80211_hw_set(ar->hw, SUPPORT_FAST_XMIT); in __ath12k_mac_register()
7344 ret = ieee80211_register_hw(ar->hw); in __ath12k_mac_register()
7346 ath12k_err(ar->ab, "ieee80211 registration failed: %d\n", ret); in __ath12k_mac_register()
7356 ar->hw->wiphy->interface_modes &= ~BIT(NL80211_IFTYPE_MONITOR); in __ath12k_mac_register()
7359 ret = ath12k_regd_update(ar, true); in __ath12k_mac_register()
7361 ath12k_err(ar->ab, "ath12k regd update failed: %d\n", ret); in __ath12k_mac_register()
7368 ieee80211_unregister_hw(ar->hw); in __ath12k_mac_register()
7371 kfree(ar->hw->wiphy->iface_combinations[0].limits); in __ath12k_mac_register()
7372 kfree(ar->hw->wiphy->iface_combinations); in __ath12k_mac_register()
7375 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); in __ath12k_mac_register()
7376 kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels); in __ath12k_mac_register()
7377 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels); in __ath12k_mac_register()
7380 SET_IEEE80211_DEV(ar->hw, NULL); in __ath12k_mac_register()
7386 struct ath12k *ar; in ath12k_mac_register() local
7396 ar = pdev->ar; in ath12k_mac_register()
7398 ether_addr_copy(ar->mac_addr, pdev->mac_addr); in ath12k_mac_register()
7400 ether_addr_copy(ar->mac_addr, ab->mac_addr); in ath12k_mac_register()
7401 ar->mac_addr[4] += i; in ath12k_mac_register()
7404 ret = __ath12k_mac_register(ar); in ath12k_mac_register()
7408 init_waitqueue_head(&ar->txmgmt_empty_waitq); in ath12k_mac_register()
7409 idr_init(&ar->txmgmt_idr); in ath12k_mac_register()
7410 spin_lock_init(&ar->txmgmt_idr_lock); in ath12k_mac_register()
7422 ar = pdev->ar; in ath12k_mac_register()
7423 __ath12k_mac_unregister(ar); in ath12k_mac_register()
7432 struct ath12k *ar; in ath12k_mac_allocate() local
7449 ar = hw->priv; in ath12k_mac_allocate()
7450 ar->hw = hw; in ath12k_mac_allocate()
7451 ar->ab = ab; in ath12k_mac_allocate()
7452 ar->pdev = pdev; in ath12k_mac_allocate()
7453 ar->pdev_idx = i; in ath12k_mac_allocate()
7454 ar->lmac_id = ath12k_hw_get_mac_from_pdev_id(ab->hw_params, i); in ath12k_mac_allocate()
7456 ar->wmi = &ab->wmi_ab.wmi[i]; in ath12k_mac_allocate()
7462 ar->cfg_tx_chainmask = pdev->cap.tx_chain_mask; in ath12k_mac_allocate()
7463 ar->cfg_rx_chainmask = pdev->cap.rx_chain_mask; in ath12k_mac_allocate()
7464 ar->num_tx_chains = hweight32(pdev->cap.tx_chain_mask); in ath12k_mac_allocate()
7465 ar->num_rx_chains = hweight32(pdev->cap.rx_chain_mask); in ath12k_mac_allocate()
7467 pdev->ar = ar; in ath12k_mac_allocate()
7468 spin_lock_init(&ar->data_lock); in ath12k_mac_allocate()
7469 INIT_LIST_HEAD(&ar->arvifs); in ath12k_mac_allocate()
7470 INIT_LIST_HEAD(&ar->ppdu_stats_info); in ath12k_mac_allocate()
7471 mutex_init(&ar->conf_mutex); in ath12k_mac_allocate()
7472 init_completion(&ar->vdev_setup_done); in ath12k_mac_allocate()
7473 init_completion(&ar->vdev_delete_done); in ath12k_mac_allocate()
7474 init_completion(&ar->peer_assoc_done); in ath12k_mac_allocate()
7475 init_completion(&ar->peer_delete_done); in ath12k_mac_allocate()
7476 init_completion(&ar->install_key_done); in ath12k_mac_allocate()
7477 init_completion(&ar->bss_survey_done); in ath12k_mac_allocate()
7478 init_completion(&ar->scan.started); in ath12k_mac_allocate()
7479 init_completion(&ar->scan.completed); in ath12k_mac_allocate()
7481 INIT_DELAYED_WORK(&ar->scan.timeout, ath12k_scan_timeout_work); in ath12k_mac_allocate()
7482 INIT_WORK(&ar->regd_update_work, ath12k_regd_update_work); in ath12k_mac_allocate()
7484 INIT_WORK(&ar->wmi_mgmt_tx_work, ath12k_mgmt_over_wmi_tx_work); in ath12k_mac_allocate()
7485 skb_queue_head_init(&ar->wmi_mgmt_tx_queue); in ath12k_mac_allocate()
7486 clear_bit(ATH12K_FLAG_MONITOR_ENABLED, &ar->monitor_flags); in ath12k_mac_allocate()
7499 struct ath12k *ar; in ath12k_mac_destroy() local
7505 ar = pdev->ar; in ath12k_mac_destroy()
7506 if (!ar) in ath12k_mac_destroy()
7509 ieee80211_free_hw(ar->hw); in ath12k_mac_destroy()
7510 pdev->ar = NULL; in ath12k_mac_destroy()