Lines Matching +full:ieee80211 +full:- +full:freq +full:- +full:limit
1 // SPDX-License-Identifier: BSD-3-Clause-Clear
3 * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
103 /* Operating Classes 131-135 */
245 #define ath12k_a_rates_size (ARRAY_SIZE(ath12k_legacy_rates) - 4)
274 return "11na-ht20"; in ath12k_mac_phymode_str()
276 return "11ng-ht20"; in ath12k_mac_phymode_str()
278 return "11na-ht40"; in ath12k_mac_phymode_str()
280 return "11ng-ht40"; in ath12k_mac_phymode_str()
282 return "11ac-vht20"; in ath12k_mac_phymode_str()
284 return "11ac-vht40"; in ath12k_mac_phymode_str()
286 return "11ac-vht80"; in ath12k_mac_phymode_str()
288 return "11ac-vht160"; in ath12k_mac_phymode_str()
290 return "11ac-vht80+80"; in ath12k_mac_phymode_str()
292 return "11ac-vht20-2g"; in ath12k_mac_phymode_str()
294 return "11ac-vht40-2g"; in ath12k_mac_phymode_str()
296 return "11ac-vht80-2g"; in ath12k_mac_phymode_str()
298 return "11ax-he20"; in ath12k_mac_phymode_str()
300 return "11ax-he40"; in ath12k_mac_phymode_str()
302 return "11ax-he80"; in ath12k_mac_phymode_str()
304 return "11ax-he80+80"; in ath12k_mac_phymode_str()
306 return "11ax-he160"; in ath12k_mac_phymode_str()
308 return "11ax-he20-2g"; in ath12k_mac_phymode_str()
310 return "11ax-he40-2g"; in ath12k_mac_phymode_str()
312 return "11ax-he80-2g"; in ath12k_mac_phymode_str()
314 return "11be-eht20"; in ath12k_mac_phymode_str()
316 return "11be-eht40"; in ath12k_mac_phymode_str()
318 return "11be-eht80"; in ath12k_mac_phymode_str()
320 return "11be-eht80+80"; in ath12k_mac_phymode_str()
322 return "11be-eht160"; in ath12k_mac_phymode_str()
324 return "11be-eht160+160"; in ath12k_mac_phymode_str()
326 return "11be-eht320"; in ath12k_mac_phymode_str()
328 return "11be-eht20-2g"; in ath12k_mac_phymode_str()
330 return "11be-eht40-2g"; in ath12k_mac_phymode_str()
485 return -EINVAL; in ath12k_mac_hw_ratecode_to_legacy_rate()
493 for (i = 0; i < sband->n_bitrates; i++) in ath12k_mac_bitrate_to_idx()
494 if (sband->bitrates[i].bitrate == bitrate) in ath12k_mac_bitrate_to_idx()
505 for (nss = IEEE80211_HT_MCS_MASK_LEN - 1; nss >= 0; nss--) in ath12k_mac_max_ht_nss()
517 for (nss = NL80211_VHT_NSS_MAX - 1; nss >= 0; nss--) in ath12k_mac_max_vht_nss()
529 for (nss = NL80211_HE_NSS_MAX - 1; nss >= 0; nss--) in ath12k_mac_max_he_nss()
538 /* From IEEE Std 802.11-2020 defined values for "Minimum MPDU Start Spacing": in ath12k_parse_mpdudensity()
554 /* Our lower layer calculations limit our precision to in ath12k_parse_mpdudensity()
578 link_conf = rcu_dereference(vif->link_conf[link_id]); in ath12k_mac_vif_link_chan()
582 return -ENOLINK; in ath12k_mac_vif_link_chan()
585 conf = rcu_dereference(link_conf->chanctx_conf); in ath12k_mac_vif_link_chan()
588 return -ENOENT; in ath12k_mac_vif_link_chan()
590 *def = conf->def; in ath12k_mac_vif_link_chan()
601 struct ath12k *ar = arvif->ar; in ath12k_mac_get_tx_arvif()
604 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_get_tx_arvif()
606 tx_bss_conf = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy, in ath12k_mac_get_tx_arvif()
607 link_conf->tx_bss_conf); in ath12k_mac_get_tx_arvif()
609 tx_ahvif = ath12k_vif_to_ahvif(tx_bss_conf->vif); in ath12k_mac_get_tx_arvif()
610 return wiphy_dereference(tx_ahvif->ah->hw->wiphy, in ath12k_mac_get_tx_arvif()
611 tx_ahvif->link[tx_bss_conf->link_id]); in ath12k_mac_get_tx_arvif()
621 struct ath12k *ar = arvif->ar; in ath12k_mac_get_tx_bssid()
623 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_get_tx_bssid()
627 ath12k_warn(ar->ab, in ath12k_mac_get_tx_bssid()
629 arvif->link_id); in ath12k_mac_get_tx_bssid()
632 if (link_conf->vif->type == NL80211_IFTYPE_STATION) { in ath12k_mac_get_tx_bssid()
633 if (link_conf->nontransmitted) in ath12k_mac_get_tx_bssid()
634 return link_conf->transmitter_bssid; in ath12k_mac_get_tx_bssid()
638 return tx_arvif->bssid; in ath12k_mac_get_tx_bssid()
647 struct ieee80211_vif *vif = arvif->ahvif->vif; in ath12k_mac_get_link_bss_conf()
649 struct ath12k *ar = arvif->ar; in ath12k_mac_get_link_bss_conf()
651 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_get_link_bss_conf()
653 if (arvif->link_id >= IEEE80211_MLD_MAX_NUM_LINKS) in ath12k_mac_get_link_bss_conf()
656 link_conf = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy, in ath12k_mac_get_link_bss_conf()
657 vif->link_conf[arvif->link_id]); in ath12k_mac_get_link_bss_conf()
664 struct ath12k_sta *ahsta = arsta->ahsta; in ath12k_mac_get_link_sta()
668 lockdep_assert_wiphy(ahsta->ahvif->ah->hw->wiphy); in ath12k_mac_get_link_sta()
670 if (arsta->link_id >= IEEE80211_MLD_MAX_NUM_LINKS) in ath12k_mac_get_link_sta()
673 link_sta = wiphy_dereference(ahsta->ahvif->ah->hw->wiphy, in ath12k_mac_get_link_sta()
674 sta->link[arsta->link_id]); in ath12k_mac_get_link_sta()
698 for (i = 0; i < sband->n_bitrates; i++) { in ath12k_mac_hw_rate_to_idx()
699 rate = &sband->bitrates[i]; in ath12k_mac_hw_rate_to_idx()
701 if (ath12k_mac_bitrate_is_cck(rate->bitrate) != cck) in ath12k_mac_hw_rate_to_idx()
704 if (rate->hw_value == hw_rate) in ath12k_mac_hw_rate_to_idx()
706 else if (rate->flags & IEEE80211_RATE_SHORT_PREAMBLE && in ath12k_mac_hw_rate_to_idx()
707 rate->hw_value_short == hw_rate) in ath12k_mac_hw_rate_to_idx()
725 unsigned long links_map = ahvif->links_map; in ath12k_get_arvif_iter()
730 arvif = rcu_dereference(ahvif->link[link_id]); in ath12k_get_arvif_iter()
735 if (!arvif->is_created) in ath12k_get_arvif_iter()
738 if (arvif->vdev_id == arvif_iter->vdev_id && in ath12k_get_arvif_iter()
739 arvif->ar == arvif_iter->ar) { in ath12k_get_arvif_iter()
740 arvif_iter->arvif = arvif; in ath12k_get_arvif_iter()
763 ath12k_warn(ar->ab, "No VIF found for vdev %d\n", vdev_id); in ath12k_mac_get_arvif()
777 for (i = 0; i < ab->num_radios; i++) { in ath12k_mac_get_arvif_by_vdev_id()
778 pdev = rcu_dereference(ab->pdevs_active[i]); in ath12k_mac_get_arvif_by_vdev_id()
779 if (pdev && pdev->ar && in ath12k_mac_get_arvif_by_vdev_id()
780 (pdev->ar->allocated_vdev_map & (1LL << vdev_id))) { in ath12k_mac_get_arvif_by_vdev_id()
781 arvif = ath12k_mac_get_arvif(pdev->ar, vdev_id); in ath12k_mac_get_arvif_by_vdev_id()
795 for (i = 0; i < ab->num_radios; i++) { in ath12k_mac_get_ar_by_vdev_id()
796 pdev = rcu_dereference(ab->pdevs_active[i]); in ath12k_mac_get_ar_by_vdev_id()
797 if (pdev && pdev->ar) { in ath12k_mac_get_ar_by_vdev_id()
798 if (pdev->ar->allocated_vdev_map & (1LL << vdev_id)) in ath12k_mac_get_ar_by_vdev_id()
799 return pdev->ar; in ath12k_mac_get_ar_by_vdev_id()
811 if (ab->hw_params->single_pdev_only) { in ath12k_mac_get_ar_by_pdev_id()
812 pdev = rcu_dereference(ab->pdevs_active[0]); in ath12k_mac_get_ar_by_pdev_id()
813 return pdev ? pdev->ar : NULL; in ath12k_mac_get_ar_by_pdev_id()
816 if (WARN_ON(pdev_id > ab->num_radios)) in ath12k_mac_get_ar_by_pdev_id()
819 for (i = 0; i < ab->num_radios; i++) { in ath12k_mac_get_ar_by_pdev_id()
820 if (ab->fw_mode == ATH12K_FIRMWARE_MODE_FTM) in ath12k_mac_get_ar_by_pdev_id()
821 pdev = &ab->pdevs[i]; in ath12k_mac_get_ar_by_pdev_id()
823 pdev = rcu_dereference(ab->pdevs_active[i]); in ath12k_mac_get_ar_by_pdev_id()
825 if (pdev && pdev->pdev_id == pdev_id) in ath12k_mac_get_ar_by_pdev_id()
826 return (pdev->ar ? pdev->ar : NULL); in ath12k_mac_get_ar_by_pdev_id()
834 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_mac_is_ml_arvif()
836 lockdep_assert_wiphy(ahvif->ah->hw->wiphy); in ath12k_mac_is_ml_arvif()
838 if (ahvif->vif->valid_links & BIT(arvif->link_id)) in ath12k_mac_is_ml_arvif()
847 struct ath12k_hw *ah = hw->priv; in ath12k_mac_get_ar_by_chan()
851 ar = ah->radio; in ath12k_mac_get_ar_by_chan()
853 if (ah->num_radio == 1) in ath12k_mac_get_ar_by_chan()
857 if (channel->center_freq >= KHZ_TO_MHZ(ar->freq_range.start_freq) && in ath12k_mac_get_ar_by_chan()
858 channel->center_freq <= KHZ_TO_MHZ(ar->freq_range.end_freq)) in ath12k_mac_get_ar_by_chan()
870 return ath12k_mac_get_ar_by_chan(hw, ctx->def.chan); in ath12k_get_ar_by_ctx()
881 lockdep_assert_wiphy(hw->wiphy); in ath12k_get_ar_by_vif()
886 if (ah->num_radio == 1) in ath12k_get_ar_by_vif()
887 return ah->radio; in ath12k_get_ar_by_vif()
889 if (!(ahvif->links_map & BIT(link_id))) in ath12k_get_ar_by_vif()
892 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); in ath12k_get_ar_by_vif()
893 if (arvif && arvif->is_created) in ath12k_get_ar_by_vif()
894 return arvif->ar; in ath12k_get_ar_by_vif()
906 if (ctx_ar == arg->ar) in ath12k_mac_get_any_chanctx_conf_iter()
907 arg->chanctx_conf = conf; in ath12k_mac_get_any_chanctx_conf_iter()
914 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_get_vif_up()
916 list_for_each_entry(arvif, &ar->arvifs, list) { in ath12k_mac_get_vif_up()
917 if (arvif->is_up) in ath12k_mac_get_vif_up()
945 struct ath12k *ar = arvif->ar; in ath12k_mac_get_target_pdev_id_from_vif()
946 struct ath12k_base *ab = ar->ab; in ath12k_mac_get_target_pdev_id_from_vif()
947 struct ieee80211_vif *vif = arvif->ahvif->vif; in ath12k_mac_get_target_pdev_id_from_vif()
950 u8 pdev_id = ab->fw_pdev[0].pdev_id; in ath12k_mac_get_target_pdev_id_from_vif()
953 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) in ath12k_mac_get_target_pdev_id_from_vif()
956 band = def.chan->band; in ath12k_mac_get_target_pdev_id_from_vif()
958 for (i = 0; i < ab->fw_pdev_count; i++) { in ath12k_mac_get_target_pdev_id_from_vif()
959 if (ath12k_mac_band_match(band, ab->fw_pdev[i].supported_bands)) in ath12k_mac_get_target_pdev_id_from_vif()
960 return ab->fw_pdev[i].pdev_id; in ath12k_mac_get_target_pdev_id_from_vif()
969 struct ath12k_base *ab = ar->ab; in ath12k_mac_get_target_pdev_id()
971 if (!ab->hw_params->single_pdev_only) in ath12k_mac_get_target_pdev_id()
972 return ar->pdev->pdev_id; in ath12k_mac_get_target_pdev_id()
981 return ar->ab->fw_pdev[0].pdev_id; in ath12k_mac_get_target_pdev_id()
989 struct ath12k_base *ab = ar->ab; in ath12k_pdev_caps_update()
991 ar->max_tx_power = ab->target_caps.hw_max_tx_power; in ath12k_pdev_caps_update()
993 /* FIXME: Set min_tx_power to ab->target_caps.hw_min_tx_power. in ath12k_pdev_caps_update()
995 * we can set ar->min_tx_power to 0 currently until in ath12k_pdev_caps_update()
998 ar->min_tx_power = 0; in ath12k_pdev_caps_update()
1000 ar->txpower_limit_2g = ar->max_tx_power; in ath12k_pdev_caps_update()
1001 ar->txpower_limit_5g = ar->max_tx_power; in ath12k_pdev_caps_update()
1002 ar->txpower_scale = WMI_HOST_TP_SCALE_MAX; in ath12k_pdev_caps_update()
1007 struct ath12k_pdev *pdev = ar->pdev; in ath12k_mac_txpower_recalc()
1009 int ret, txpower = -1; in ath12k_mac_txpower_recalc()
1012 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_txpower_recalc()
1014 list_for_each_entry(arvif, &ar->arvifs, list) { in ath12k_mac_txpower_recalc()
1015 if (arvif->txpower <= 0) in ath12k_mac_txpower_recalc()
1018 if (txpower == -1) in ath12k_mac_txpower_recalc()
1019 txpower = arvif->txpower; in ath12k_mac_txpower_recalc()
1021 txpower = min(txpower, arvif->txpower); in ath12k_mac_txpower_recalc()
1024 if (txpower == -1) in ath12k_mac_txpower_recalc()
1028 txpower = min_t(u32, max_t(u32, ar->min_tx_power, txpower), in ath12k_mac_txpower_recalc()
1029 ar->max_tx_power) * 2; in ath12k_mac_txpower_recalc()
1031 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "txpower to set in hw %d\n", in ath12k_mac_txpower_recalc()
1034 if ((pdev->cap.supported_bands & WMI_HOST_WLAN_2GHZ_CAP) && in ath12k_mac_txpower_recalc()
1035 ar->txpower_limit_2g != txpower) { in ath12k_mac_txpower_recalc()
1038 txpower, ar->pdev->pdev_id); in ath12k_mac_txpower_recalc()
1041 ar->txpower_limit_2g = txpower; in ath12k_mac_txpower_recalc()
1044 if ((pdev->cap.supported_bands & WMI_HOST_WLAN_5GHZ_CAP) && in ath12k_mac_txpower_recalc()
1045 ar->txpower_limit_5g != txpower) { in ath12k_mac_txpower_recalc()
1048 txpower, ar->pdev->pdev_id); in ath12k_mac_txpower_recalc()
1051 ar->txpower_limit_5g = txpower; in ath12k_mac_txpower_recalc()
1057 ath12k_warn(ar->ab, "failed to recalc txpower limit %d using pdev param %d: %d\n", in ath12k_mac_txpower_recalc()
1064 struct ath12k *ar = arvif->ar; in ath12k_recalc_rtscts_prot()
1068 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_recalc_rtscts_prot()
1078 if (arvif->num_legacy_stations > 0) in ath12k_recalc_rtscts_prot()
1084 if (arvif->rtscts_prot_mode == rts_cts) in ath12k_recalc_rtscts_prot()
1087 arvif->rtscts_prot_mode = rts_cts; in ath12k_recalc_rtscts_prot()
1089 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %d recalc rts/cts prot %d\n", in ath12k_recalc_rtscts_prot()
1090 arvif->vdev_id, rts_cts); in ath12k_recalc_rtscts_prot()
1092 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_recalc_rtscts_prot()
1095 ath12k_warn(ar->ab, "failed to recalculate rts/cts prot for vdev %d: %d\n", in ath12k_recalc_rtscts_prot()
1096 arvif->vdev_id, ret); in ath12k_recalc_rtscts_prot()
1103 struct ath12k *ar = arvif->ar; in ath12k_mac_set_kickout()
1109 ar->pdev->pdev_id); in ath12k_mac_set_kickout()
1111 ath12k_warn(ar->ab, "failed to set kickout threshold on vdev %i: %d\n", in ath12k_mac_set_kickout()
1112 arvif->vdev_id, ret); in ath12k_mac_set_kickout()
1117 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, in ath12k_mac_set_kickout()
1120 ath12k_warn(ar->ab, "failed to set keepalive minimum idle time on vdev %i: %d\n", in ath12k_mac_set_kickout()
1121 arvif->vdev_id, ret); in ath12k_mac_set_kickout()
1126 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, in ath12k_mac_set_kickout()
1129 ath12k_warn(ar->ab, "failed to set keepalive maximum idle time on vdev %i: %d\n", in ath12k_mac_set_kickout()
1130 arvif->vdev_id, ret); in ath12k_mac_set_kickout()
1135 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, in ath12k_mac_set_kickout()
1138 ath12k_warn(ar->ab, "failed to set keepalive maximum unresponsive time on vdev %i: %d\n", in ath12k_mac_set_kickout()
1139 arvif->vdev_id, ret); in ath12k_mac_set_kickout()
1149 struct ath12k_base *ab = ar->ab; in ath12k_mac_peer_cleanup_all()
1151 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_peer_cleanup_all()
1153 spin_lock_bh(&ab->base_lock); in ath12k_mac_peer_cleanup_all()
1154 list_for_each_entry_safe(peer, tmp, &ab->peers, list) { in ath12k_mac_peer_cleanup_all()
1156 if (peer->sta) in ath12k_mac_peer_cleanup_all()
1159 list_del(&peer->list); in ath12k_mac_peer_cleanup_all()
1162 spin_unlock_bh(&ab->base_lock); in ath12k_mac_peer_cleanup_all()
1164 ar->num_peers = 0; in ath12k_mac_peer_cleanup_all()
1165 ar->num_stations = 0; in ath12k_mac_peer_cleanup_all()
1170 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_vdev_setup_sync()
1172 if (test_bit(ATH12K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags)) in ath12k_mac_vdev_setup_sync()
1173 return -ESHUTDOWN; in ath12k_mac_vdev_setup_sync()
1175 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "vdev setup timeout %d\n", in ath12k_mac_vdev_setup_sync()
1178 if (!wait_for_completion_timeout(&ar->vdev_setup_done, in ath12k_mac_vdev_setup_sync()
1180 return -ETIMEDOUT; in ath12k_mac_vdev_setup_sync()
1182 return ar->last_wmi_vdev_start_status ? -EINVAL : 0; in ath12k_mac_vdev_setup_sync()
1191 params.bssid = ar->mac_addr; in ath12k_monitor_vdev_up()
1194 ath12k_warn(ar->ab, "failed to put up monitor vdev %i: %d\n", in ath12k_monitor_vdev_up()
1199 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %i started\n", in ath12k_monitor_vdev_up()
1212 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_monitor_vdev_start()
1214 channel = chandef->chan; in ath12k_mac_monitor_vdev_start()
1216 arg.freq = channel->center_freq; in ath12k_mac_monitor_vdev_start()
1217 arg.band_center_freq1 = chandef->center_freq1; in ath12k_mac_monitor_vdev_start()
1218 arg.band_center_freq2 = chandef->center_freq2; in ath12k_mac_monitor_vdev_start()
1219 arg.mode = ath12k_phymodes[chandef->chan->band][chandef->width]; in ath12k_mac_monitor_vdev_start()
1220 arg.chan_radar = !!(channel->flags & IEEE80211_CHAN_RADAR); in ath12k_mac_monitor_vdev_start()
1223 arg.max_power = channel->max_power; in ath12k_mac_monitor_vdev_start()
1224 arg.max_reg_power = channel->max_reg_power; in ath12k_mac_monitor_vdev_start()
1225 arg.max_antenna_gain = channel->max_antenna_gain; in ath12k_mac_monitor_vdev_start()
1227 arg.pref_tx_streams = ar->num_tx_chains; in ath12k_mac_monitor_vdev_start()
1228 arg.pref_rx_streams = ar->num_rx_chains; in ath12k_mac_monitor_vdev_start()
1231 arg.passive |= !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR); in ath12k_mac_monitor_vdev_start()
1233 reinit_completion(&ar->vdev_setup_done); in ath12k_mac_monitor_vdev_start()
1234 reinit_completion(&ar->vdev_delete_done); in ath12k_mac_monitor_vdev_start()
1238 ath12k_warn(ar->ab, "failed to request monitor vdev %i start: %d\n", in ath12k_mac_monitor_vdev_start()
1245 ath12k_warn(ar->ab, "failed to synchronize setup for monitor vdev %i start: %d\n", in ath12k_mac_monitor_vdev_start()
1251 params.bssid = ar->mac_addr; in ath12k_mac_monitor_vdev_start()
1254 ath12k_warn(ar->ab, "failed to put up monitor vdev %i: %d\n", in ath12k_mac_monitor_vdev_start()
1259 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %i started\n", in ath12k_mac_monitor_vdev_start()
1266 ath12k_warn(ar->ab, "failed to stop monitor vdev %i after start failure: %d\n", in ath12k_mac_monitor_vdev_start()
1275 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_monitor_vdev_stop()
1277 reinit_completion(&ar->vdev_setup_done); in ath12k_mac_monitor_vdev_stop()
1279 ret = ath12k_wmi_vdev_stop(ar, ar->monitor_vdev_id); in ath12k_mac_monitor_vdev_stop()
1281 ath12k_warn(ar->ab, "failed to request monitor vdev %i stop: %d\n", in ath12k_mac_monitor_vdev_stop()
1282 ar->monitor_vdev_id, ret); in ath12k_mac_monitor_vdev_stop()
1286 ath12k_warn(ar->ab, "failed to synchronize monitor vdev %i stop: %d\n", in ath12k_mac_monitor_vdev_stop()
1287 ar->monitor_vdev_id, ret); in ath12k_mac_monitor_vdev_stop()
1289 ret = ath12k_wmi_vdev_down(ar, ar->monitor_vdev_id); in ath12k_mac_monitor_vdev_stop()
1291 ath12k_warn(ar->ab, "failed to put down monitor vdev %i: %d\n", in ath12k_mac_monitor_vdev_stop()
1292 ar->monitor_vdev_id, ret); in ath12k_mac_monitor_vdev_stop()
1294 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %i stopped\n", in ath12k_mac_monitor_vdev_stop()
1295 ar->monitor_vdev_id); in ath12k_mac_monitor_vdev_stop()
1304 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_monitor_vdev_delete()
1306 if (!ar->monitor_vdev_created) in ath12k_mac_monitor_vdev_delete()
1309 reinit_completion(&ar->vdev_delete_done); in ath12k_mac_monitor_vdev_delete()
1311 ret = ath12k_wmi_vdev_delete(ar, ar->monitor_vdev_id); in ath12k_mac_monitor_vdev_delete()
1313 ath12k_warn(ar->ab, "failed to request wmi monitor vdev %i removal: %d\n", in ath12k_mac_monitor_vdev_delete()
1314 ar->monitor_vdev_id, ret); in ath12k_mac_monitor_vdev_delete()
1318 time_left = wait_for_completion_timeout(&ar->vdev_delete_done, in ath12k_mac_monitor_vdev_delete()
1321 ath12k_warn(ar->ab, "Timeout in receiving vdev delete response\n"); in ath12k_mac_monitor_vdev_delete()
1323 ar->allocated_vdev_map &= ~(1LL << ar->monitor_vdev_id); in ath12k_mac_monitor_vdev_delete()
1324 ar->ab->free_vdev_map |= 1LL << (ar->monitor_vdev_id); in ath12k_mac_monitor_vdev_delete()
1325 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %d deleted\n", in ath12k_mac_monitor_vdev_delete()
1326 ar->monitor_vdev_id); in ath12k_mac_monitor_vdev_delete()
1327 ar->num_created_vdevs--; in ath12k_mac_monitor_vdev_delete()
1328 ar->monitor_vdev_id = -1; in ath12k_mac_monitor_vdev_delete()
1329 ar->monitor_vdev_created = false; in ath12k_mac_monitor_vdev_delete()
1340 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_monitor_start()
1342 if (ar->monitor_started) in ath12k_mac_monitor_start()
1353 ret = ath12k_mac_monitor_vdev_start(ar, ar->monitor_vdev_id, in ath12k_mac_monitor_start()
1354 &arg.chanctx_conf->def); in ath12k_mac_monitor_start()
1356 ath12k_warn(ar->ab, "failed to start monitor vdev: %d\n", ret); in ath12k_mac_monitor_start()
1362 ath12k_warn(ar->ab, "fail to set monitor filter: %d\n", ret); in ath12k_mac_monitor_start()
1366 ar->monitor_started = true; in ath12k_mac_monitor_start()
1367 ar->num_started_vdevs++; in ath12k_mac_monitor_start()
1369 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor started\n"); in ath12k_mac_monitor_start()
1378 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_monitor_stop()
1380 if (!ar->monitor_started) in ath12k_mac_monitor_stop()
1385 ath12k_warn(ar->ab, "failed to stop monitor vdev: %d\n", ret); in ath12k_mac_monitor_stop()
1389 ar->monitor_started = false; in ath12k_mac_monitor_stop()
1390 ar->num_started_vdevs--; in ath12k_mac_monitor_stop()
1392 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor stopped ret %d\n", ret); in ath12k_mac_monitor_stop()
1398 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_mac_vdev_stop()
1399 struct ath12k *ar = arvif->ar; in ath12k_mac_vdev_stop()
1402 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_vdev_stop()
1404 reinit_completion(&ar->vdev_setup_done); in ath12k_mac_vdev_stop()
1406 ret = ath12k_wmi_vdev_stop(ar, arvif->vdev_id); in ath12k_mac_vdev_stop()
1408 ath12k_warn(ar->ab, "failed to stop WMI vdev %i: %d\n", in ath12k_mac_vdev_stop()
1409 arvif->vdev_id, ret); in ath12k_mac_vdev_stop()
1415 ath12k_warn(ar->ab, "failed to synchronize setup for vdev %i: %d\n", in ath12k_mac_vdev_stop()
1416 arvif->vdev_id, ret); in ath12k_mac_vdev_stop()
1420 WARN_ON(ar->num_started_vdevs == 0); in ath12k_mac_vdev_stop()
1422 ar->num_started_vdevs--; in ath12k_mac_vdev_stop()
1423 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "vdev %pM stopped, vdev_id %d\n", in ath12k_mac_vdev_stop()
1424 ahvif->vif->addr, arvif->vdev_id); in ath12k_mac_vdev_stop()
1426 if (test_bit(ATH12K_FLAG_CAC_RUNNING, &ar->dev_flags)) { in ath12k_mac_vdev_stop()
1427 clear_bit(ATH12K_FLAG_CAC_RUNNING, &ar->dev_flags); in ath12k_mac_vdev_stop()
1428 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "CAC Stopped for vdev %d\n", in ath12k_mac_vdev_stop()
1429 arvif->vdev_id); in ath12k_mac_vdev_stop()
1445 struct ath12k *ar = arvif->ar; in ath12k_mac_setup_bcn_p2p_ie()
1450 mgmt = (void *)bcn->data; in ath12k_mac_setup_bcn_p2p_ie()
1452 mgmt->u.beacon.variable, in ath12k_mac_setup_bcn_p2p_ie()
1453 bcn->len - (mgmt->u.beacon.variable - in ath12k_mac_setup_bcn_p2p_ie()
1454 bcn->data)); in ath12k_mac_setup_bcn_p2p_ie()
1456 ath12k_warn(ar->ab, "no P2P ie found in beacon\n"); in ath12k_mac_setup_bcn_p2p_ie()
1457 return -ENOENT; in ath12k_mac_setup_bcn_p2p_ie()
1460 ret = ath12k_wmi_p2p_go_bcn_ie(ar, arvif->vdev_id, p2p_ie); in ath12k_mac_setup_bcn_p2p_ie()
1462 ath12k_warn(ar->ab, "failed to submit P2P GO bcn ie for vdev %i: %d\n", in ath12k_mac_setup_bcn_p2p_ie()
1463 arvif->vdev_id, ret); in ath12k_mac_setup_bcn_p2p_ie()
1477 if (WARN_ON(skb->len < ie_offset)) in ath12k_mac_remove_vendor_ie()
1478 return -EINVAL; in ath12k_mac_remove_vendor_ie()
1481 skb->data + ie_offset, in ath12k_mac_remove_vendor_ie()
1482 skb->len - ie_offset); in ath12k_mac_remove_vendor_ie()
1484 return -ENOENT; in ath12k_mac_remove_vendor_ie()
1487 end = skb->data + skb->len; in ath12k_mac_remove_vendor_ie()
1491 return -EINVAL; in ath12k_mac_remove_vendor_ie()
1493 memmove(ie, next, end - next); in ath12k_mac_remove_vendor_ie()
1494 skb_trim(skb, skb->len - len); in ath12k_mac_remove_vendor_ie()
1504 struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)bcn->data; in ath12k_mac_set_arvif_ies()
1510 start = bcn->data + ieee80211_get_hdrlen_from_skb(bcn) + sizeof(mgmt->u.beacon); in ath12k_mac_set_arvif_ies()
1512 rem_len = tail - start; in ath12k_mac_set_arvif_ies()
1514 arvif->rsnie_present = false; in ath12k_mac_set_arvif_ies()
1515 arvif->wpaie_present = false; in ath12k_mac_set_arvif_ies()
1518 arvif->rsnie_present = true; in ath12k_mac_set_arvif_ies()
1521 arvif->wpaie_present = true; in ath12k_mac_set_arvif_ies()
1524 if (ext_cap_ie && ext_cap_ie->datalen >= 11 && in ath12k_mac_set_arvif_ies()
1525 (ext_cap_ie->data[10] & WLAN_EXT_CAPA11_BCN_PROTECT)) in ath12k_mac_set_arvif_ies()
1526 tx_arvif->beacon_prot = true; in ath12k_mac_set_arvif_ies()
1546 if (elem->datalen < 12 || elem->data[0] < 1) in ath12k_mac_set_arvif_ies()
1549 for_each_element(nontx, elem->data + 1, elem->datalen - 1) { in ath12k_mac_set_arvif_ies()
1550 start = nontx->data; in ath12k_mac_set_arvif_ies()
1552 if (nontx->id != 0 || nontx->datalen < 4) in ath12k_mac_set_arvif_ies()
1555 if (nontx->data[0] != WLAN_EID_NON_TX_BSSID_CAP || in ath12k_mac_set_arvif_ies()
1556 nontx->data[1] != 2) { in ath12k_mac_set_arvif_ies()
1560 if (nontx->data[4] != WLAN_EID_SSID) in ath12k_mac_set_arvif_ies()
1564 start, nontx->datalen); in ath12k_mac_set_arvif_ies()
1565 if (!index || index->datalen < 1 || index->data[0] == 0) in ath12k_mac_set_arvif_ies()
1568 if (index->data[0] == bssid_index) { in ath12k_mac_set_arvif_ies()
1572 if (!tx_arvif->beacon_prot) { in ath12k_mac_set_arvif_ies()
1575 nontx->data, in ath12k_mac_set_arvif_ies()
1576 nontx->datalen); in ath12k_mac_set_arvif_ies()
1577 if (ext_cap_ie && ext_cap_ie->datalen >= 11 && in ath12k_mac_set_arvif_ies()
1578 (ext_cap_ie->data[10] & in ath12k_mac_set_arvif_ies()
1580 tx_arvif->beacon_prot = true; in ath12k_mac_set_arvif_ies()
1584 nontx->data, in ath12k_mac_set_arvif_ies()
1585 nontx->datalen)) { in ath12k_mac_set_arvif_ies()
1586 arvif->rsnie_present = true; in ath12k_mac_set_arvif_ies()
1588 } else if (!arvif->rsnie_present) { in ath12k_mac_set_arvif_ies()
1593 nontx->data, in ath12k_mac_set_arvif_ies()
1594 nontx->datalen); in ath12k_mac_set_arvif_ies()
1595 if (!nie || nie->datalen < 2) in ath12k_mac_set_arvif_ies()
1596 return; /* Invalid non-inheritance element */ in ath12k_mac_set_arvif_ies()
1598 for (i = 1; i < nie->datalen - 1; i++) { in ath12k_mac_set_arvif_ies()
1599 if (nie->data[i] == WLAN_EID_RSN) { in ath12k_mac_set_arvif_ies()
1600 arvif->rsnie_present = false; in ath12k_mac_set_arvif_ies()
1621 beacons = ieee80211_beacon_get_template_ema_list(ath12k_ar_to_hw(tx_arvif->ar), in ath12k_mac_setup_bcn_tmpl_ema()
1622 tx_arvif->ahvif->vif, in ath12k_mac_setup_bcn_tmpl_ema()
1623 tx_arvif->link_id); in ath12k_mac_setup_bcn_tmpl_ema()
1624 if (!beacons || !beacons->cnt) { in ath12k_mac_setup_bcn_tmpl_ema()
1625 ath12k_warn(arvif->ar->ab, in ath12k_mac_setup_bcn_tmpl_ema()
1627 return -EPERM; in ath12k_mac_setup_bcn_tmpl_ema()
1631 ath12k_mac_set_arvif_ies(arvif, tx_arvif, beacons->bcn[0].skb, 0, NULL); in ath12k_mac_setup_bcn_tmpl_ema()
1633 for (i = 0; i < beacons->cnt; i++) { in ath12k_mac_setup_bcn_tmpl_ema()
1635 ath12k_mac_set_arvif_ies(arvif, tx_arvif, beacons->bcn[i].skb, in ath12k_mac_setup_bcn_tmpl_ema()
1639 ema_args.bcn_cnt = beacons->cnt; in ath12k_mac_setup_bcn_tmpl_ema()
1641 ret = ath12k_wmi_bcn_tmpl(tx_arvif, &beacons->bcn[i].offs, in ath12k_mac_setup_bcn_tmpl_ema()
1642 beacons->bcn[i].skb, &ema_args); in ath12k_mac_setup_bcn_tmpl_ema()
1644 ath12k_warn(tx_arvif->ar->ab, in ath12k_mac_setup_bcn_tmpl_ema()
1652 ath12k_warn(arvif->ar->ab, in ath12k_mac_setup_bcn_tmpl_ema()
1662 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_mac_setup_bcn_tmpl()
1666 struct ath12k *ar = arvif->ar; in ath12k_mac_setup_bcn_tmpl()
1667 struct ath12k_base *ab = ar->ab; in ath12k_mac_setup_bcn_tmpl()
1673 if (ahvif->vdev_type != WMI_VDEV_TYPE_AP) in ath12k_mac_setup_bcn_tmpl()
1678 ath12k_warn(ar->ab, "unable to access bss link conf to set bcn tmpl for vif %pM link %u\n", in ath12k_mac_setup_bcn_tmpl()
1679 vif->addr, arvif->link_id); in ath12k_mac_setup_bcn_tmpl()
1680 return -ENOLINK; in ath12k_mac_setup_bcn_tmpl()
1685 if (tx_arvif != arvif && arvif->is_up) in ath12k_mac_setup_bcn_tmpl()
1688 if (link_conf->ema_ap) in ath12k_mac_setup_bcn_tmpl()
1690 link_conf->bssid_index); in ath12k_mac_setup_bcn_tmpl()
1695 bcn = ieee80211_beacon_get_template(ath12k_ar_to_hw(tx_arvif->ar), in ath12k_mac_setup_bcn_tmpl()
1696 tx_arvif->ahvif->vif, in ath12k_mac_setup_bcn_tmpl()
1697 &offs, tx_arvif->link_id); in ath12k_mac_setup_bcn_tmpl()
1700 return -EPERM; in ath12k_mac_setup_bcn_tmpl()
1707 link_conf->bssid_index, in ath12k_mac_setup_bcn_tmpl()
1714 if (ahvif->vif->type == NL80211_IFTYPE_AP && ahvif->vif->p2p) { in ath12k_mac_setup_bcn_tmpl()
1752 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_control_beaconing()
1753 struct ath12k *ar = arvif->ar; in ath12k_control_beaconing()
1756 lockdep_assert_wiphy(ath12k_ar_to_hw(arvif->ar)->wiphy); in ath12k_control_beaconing()
1758 if (!info->enable_beacon) { in ath12k_control_beaconing()
1759 ret = ath12k_wmi_vdev_down(ar, arvif->vdev_id); in ath12k_control_beaconing()
1761 ath12k_warn(ar->ab, "failed to down vdev_id %i: %d\n", in ath12k_control_beaconing()
1762 arvif->vdev_id, ret); in ath12k_control_beaconing()
1764 arvif->is_up = false; in ath12k_control_beaconing()
1771 ath12k_warn(ar->ab, "failed to update bcn tmpl during vdev up: %d\n", in ath12k_control_beaconing()
1776 ahvif->aid = 0; in ath12k_control_beaconing()
1778 ether_addr_copy(arvif->bssid, info->addr); in ath12k_control_beaconing()
1780 params.vdev_id = arvif->vdev_id; in ath12k_control_beaconing()
1781 params.aid = ahvif->aid; in ath12k_control_beaconing()
1782 params.bssid = arvif->bssid; in ath12k_control_beaconing()
1785 params.nontx_profile_idx = info->bssid_index; in ath12k_control_beaconing()
1786 params.nontx_profile_cnt = 1 << info->bssid_indicator; in ath12k_control_beaconing()
1788 ret = ath12k_wmi_vdev_up(arvif->ar, ¶ms); in ath12k_control_beaconing()
1790 ath12k_warn(ar->ab, "failed to bring up vdev %d: %i\n", in ath12k_control_beaconing()
1791 arvif->vdev_id, ret); in ath12k_control_beaconing()
1795 arvif->is_up = true; in ath12k_control_beaconing()
1797 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %d up\n", arvif->vdev_id); in ath12k_control_beaconing()
1804 struct ieee80211_mgmt *mgmt = (void *)skb->data; in ath12k_mac_handle_beacon_iter()
1806 struct ath12k_link_vif *arvif = &ahvif->deflink; in ath12k_mac_handle_beacon_iter()
1808 if (vif->type != NL80211_IFTYPE_STATION || !arvif->is_created) in ath12k_mac_handle_beacon_iter()
1811 if (!ether_addr_equal(mgmt->bssid, vif->bss_conf.bssid)) in ath12k_mac_handle_beacon_iter()
1814 cancel_delayed_work(&arvif->connection_loss_work); in ath12k_mac_handle_beacon_iter()
1829 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); in ath12k_mac_handle_beacon_miss()
1831 if (!(arvif->is_created && arvif->is_up)) in ath12k_mac_handle_beacon_miss()
1841 ieee80211_queue_delayed_work(hw, &arvif->connection_loss_work, in ath12k_mac_handle_beacon_miss()
1849 struct ieee80211_vif *vif = arvif->ahvif->vif; in ath12k_mac_vif_sta_connection_loss_work()
1851 if (!arvif->is_up) in ath12k_mac_vif_sta_connection_loss_work()
1862 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); in ath12k_peer_assoc_h_basic()
1863 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); in ath12k_peer_assoc_h_basic()
1868 lockdep_assert_wiphy(hw->wiphy); in ath12k_peer_assoc_h_basic()
1870 if (vif->type == NL80211_IFTYPE_STATION) in ath12k_peer_assoc_h_basic()
1871 aid = vif->cfg.aid; in ath12k_peer_assoc_h_basic()
1873 aid = sta->aid; in ath12k_peer_assoc_h_basic()
1875 ether_addr_copy(arg->peer_mac, arsta->addr); in ath12k_peer_assoc_h_basic()
1876 arg->vdev_id = arvif->vdev_id; in ath12k_peer_assoc_h_basic()
1877 arg->peer_associd = aid; in ath12k_peer_assoc_h_basic()
1878 arg->auth_flag = true; in ath12k_peer_assoc_h_basic()
1880 arg->peer_listen_intval = hw->conf.listen_interval; in ath12k_peer_assoc_h_basic()
1881 arg->peer_nss = 1; in ath12k_peer_assoc_h_basic()
1885 ath12k_warn(ar->ab, "unable to access bss link conf in peer assoc for vif %pM link %u\n", in ath12k_peer_assoc_h_basic()
1886 vif->addr, arvif->link_id); in ath12k_peer_assoc_h_basic()
1890 arg->peer_caps = bss_conf->assoc_capability; in ath12k_peer_assoc_h_basic()
1898 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); in ath12k_peer_assoc_h_crypto()
1899 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); in ath12k_peer_assoc_h_crypto()
1907 lockdep_assert_wiphy(hw->wiphy); in ath12k_peer_assoc_h_crypto()
1911 ath12k_warn(ar->ab, "unable to access bss link conf for peer assoc crypto for vif %pM link %u\n", in ath12k_peer_assoc_h_crypto()
1912 vif->addr, arvif->link_id); in ath12k_peer_assoc_h_crypto()
1916 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) in ath12k_peer_assoc_h_crypto()
1919 bss = cfg80211_get_bss(hw->wiphy, def.chan, info->bssid, NULL, 0, in ath12k_peer_assoc_h_crypto()
1922 if (arvif->rsnie_present || arvif->wpaie_present) { in ath12k_peer_assoc_h_crypto()
1923 arg->need_ptk_4_way = true; in ath12k_peer_assoc_h_crypto()
1924 if (arvif->wpaie_present) in ath12k_peer_assoc_h_crypto()
1925 arg->need_gtk_2_way = true; in ath12k_peer_assoc_h_crypto()
1932 ies = rcu_dereference(bss->ies); in ath12k_peer_assoc_h_crypto()
1936 ies->data, in ath12k_peer_assoc_h_crypto()
1937 ies->len); in ath12k_peer_assoc_h_crypto()
1939 cfg80211_put_bss(hw->wiphy, bss); in ath12k_peer_assoc_h_crypto()
1944 ath12k_dbg(ar->ab, ATH12K_DBG_WMI, in ath12k_peer_assoc_h_crypto()
1946 arg->need_ptk_4_way = true; in ath12k_peer_assoc_h_crypto()
1950 ath12k_dbg(ar->ab, ATH12K_DBG_WMI, in ath12k_peer_assoc_h_crypto()
1952 arg->need_gtk_2_way = true; in ath12k_peer_assoc_h_crypto()
1955 if (sta->mfp) { in ath12k_peer_assoc_h_crypto()
1957 arg->is_pmf_enabled = true; in ath12k_peer_assoc_h_crypto()
1960 /* TODO: safe_mode_enabled (bypass 4-way handshake) flag req? */ in ath12k_peer_assoc_h_crypto()
1968 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); in ath12k_peer_assoc_h_rates()
1969 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); in ath12k_peer_assoc_h_rates()
1970 struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates; in ath12k_peer_assoc_h_rates()
1981 lockdep_assert_wiphy(hw->wiphy); in ath12k_peer_assoc_h_rates()
1983 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) in ath12k_peer_assoc_h_rates()
1988 ath12k_warn(ar->ab, "unable to access link sta in peer assoc rates for sta %pM link %u\n", in ath12k_peer_assoc_h_rates()
1989 sta->addr, arsta->link_id); in ath12k_peer_assoc_h_rates()
1993 band = def.chan->band; in ath12k_peer_assoc_h_rates()
1994 sband = hw->wiphy->bands[band]; in ath12k_peer_assoc_h_rates()
1995 ratemask = link_sta->supp_rates[band]; in ath12k_peer_assoc_h_rates()
1996 ratemask &= arvif->bitrate_mask.control[band].legacy; in ath12k_peer_assoc_h_rates()
1997 rates = sband->bitrates; in ath12k_peer_assoc_h_rates()
1999 rateset->num_rates = 0; in ath12k_peer_assoc_h_rates()
2005 rate = ath12k_mac_bitrate_to_rate(rates->bitrate); in ath12k_peer_assoc_h_rates()
2006 rateset->rates[rateset->num_rates] = rate; in ath12k_peer_assoc_h_rates()
2007 rateset->num_rates++; in ath12k_peer_assoc_h_rates()
2040 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); in ath12k_peer_assoc_h_ht()
2041 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); in ath12k_peer_assoc_h_ht()
2051 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_peer_assoc_h_ht()
2053 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) in ath12k_peer_assoc_h_ht()
2058 ath12k_warn(ar->ab, "unable to access link sta in peer assoc ht for sta %pM link %u\n", in ath12k_peer_assoc_h_ht()
2059 sta->addr, arsta->link_id); in ath12k_peer_assoc_h_ht()
2063 ht_cap = &link_sta->ht_cap; in ath12k_peer_assoc_h_ht()
2064 if (!ht_cap->ht_supported) in ath12k_peer_assoc_h_ht()
2067 band = def.chan->band; in ath12k_peer_assoc_h_ht()
2068 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs; in ath12k_peer_assoc_h_ht()
2073 arg->ht_flag = true; in ath12k_peer_assoc_h_ht()
2075 arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR + in ath12k_peer_assoc_h_ht()
2076 ht_cap->ampdu_factor)) - 1; in ath12k_peer_assoc_h_ht()
2078 arg->peer_mpdu_density = in ath12k_peer_assoc_h_ht()
2079 ath12k_parse_mpdudensity(ht_cap->ampdu_density); in ath12k_peer_assoc_h_ht()
2081 arg->peer_ht_caps = ht_cap->cap; in ath12k_peer_assoc_h_ht()
2082 arg->peer_rate_caps |= WMI_HOST_RC_HT_FLAG; in ath12k_peer_assoc_h_ht()
2084 if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING) in ath12k_peer_assoc_h_ht()
2085 arg->ldpc_flag = true; in ath12k_peer_assoc_h_ht()
2087 if (link_sta->bandwidth >= IEEE80211_STA_RX_BW_40) { in ath12k_peer_assoc_h_ht()
2088 arg->bw_40 = true; in ath12k_peer_assoc_h_ht()
2089 arg->peer_rate_caps |= WMI_HOST_RC_CW40_FLAG; in ath12k_peer_assoc_h_ht()
2096 if (arvif->bitrate_mask.control[band].gi == NL80211_TXRATE_FORCE_LGI) { in ath12k_peer_assoc_h_ht()
2097 arg->peer_ht_caps &= ~(IEEE80211_HT_CAP_SGI_20 | IEEE80211_HT_CAP_SGI_40); in ath12k_peer_assoc_h_ht()
2100 if (ht_cap->cap & (IEEE80211_HT_CAP_SGI_20 | IEEE80211_HT_CAP_SGI_40)) in ath12k_peer_assoc_h_ht()
2101 arg->peer_rate_caps |= WMI_HOST_RC_SGI_FLAG; in ath12k_peer_assoc_h_ht()
2104 if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) { in ath12k_peer_assoc_h_ht()
2105 arg->peer_rate_caps |= WMI_HOST_RC_TX_STBC_FLAG; in ath12k_peer_assoc_h_ht()
2106 arg->stbc_flag = true; in ath12k_peer_assoc_h_ht()
2109 if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) { in ath12k_peer_assoc_h_ht()
2110 stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC; in ath12k_peer_assoc_h_ht()
2113 arg->peer_rate_caps |= stbc; in ath12k_peer_assoc_h_ht()
2114 arg->stbc_flag = true; in ath12k_peer_assoc_h_ht()
2117 if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2]) in ath12k_peer_assoc_h_ht()
2118 arg->peer_rate_caps |= WMI_HOST_RC_TS_FLAG; in ath12k_peer_assoc_h_ht()
2119 else if (ht_cap->mcs.rx_mask[1]) in ath12k_peer_assoc_h_ht()
2120 arg->peer_rate_caps |= WMI_HOST_RC_DS_FLAG; in ath12k_peer_assoc_h_ht()
2123 if ((ht_cap->mcs.rx_mask[i / 8] & BIT(i % 8)) && in ath12k_peer_assoc_h_ht()
2126 arg->peer_ht_rates.rates[n++] = i; in ath12k_peer_assoc_h_ht()
2129 /* This is a workaround for HT-enabled STAs which break the spec in ath12k_peer_assoc_h_ht()
2138 arg->peer_ht_rates.num_rates = 8; in ath12k_peer_assoc_h_ht()
2139 for (i = 0; i < arg->peer_ht_rates.num_rates; i++) in ath12k_peer_assoc_h_ht()
2140 arg->peer_ht_rates.rates[i] = i; in ath12k_peer_assoc_h_ht()
2142 arg->peer_ht_rates.num_rates = n; in ath12k_peer_assoc_h_ht()
2143 arg->peer_nss = min(link_sta->rx_nss, max_nss); in ath12k_peer_assoc_h_ht()
2146 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n", in ath12k_peer_assoc_h_ht()
2147 arg->peer_mac, in ath12k_peer_assoc_h_ht()
2148 arg->peer_ht_rates.num_rates, in ath12k_peer_assoc_h_ht()
2149 arg->peer_nss); in ath12k_peer_assoc_h_ht()
2155 case IEEE80211_VHT_MCS_SUPPORT_0_7: return BIT(8) - 1; in ath12k_mac_get_max_vht_mcs_map()
2156 case IEEE80211_VHT_MCS_SUPPORT_0_8: return BIT(9) - 1; in ath12k_mac_get_max_vht_mcs_map()
2157 case IEEE80211_VHT_MCS_SUPPORT_0_9: return BIT(10) - 1; in ath12k_mac_get_max_vht_mcs_map()
2176 idx_limit = fls(mcs_map) - 1; in ath12k_peer_assoc_h_vht_limit()
2178 idx_limit = -1; in ath12k_peer_assoc_h_vht_limit()
2200 case -1: in ath12k_peer_assoc_h_vht_limit()
2215 u8 nss_ratio_info = ar->pdev->cap.nss_ratio_info; in ath12k_get_nss_160mhz()
2223 ath12k_warn(ar->ab, "WMI_NSS_RATIO_3BY4_NSS not supported\n"); in ath12k_get_nss_160mhz()
2229 ath12k_warn(ar->ab, "WMI_NSS_RATIO_2_NSS not supported\n"); in ath12k_get_nss_160mhz()
2232 ath12k_warn(ar->ab, "invalid nss ratio received from fw: %d\n", in ath12k_get_nss_160mhz()
2245 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); in ath12k_peer_assoc_h_vht()
2246 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); in ath12k_peer_assoc_h_vht()
2259 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_peer_assoc_h_vht()
2261 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) in ath12k_peer_assoc_h_vht()
2266 ath12k_warn(ar->ab, "unable to access link sta in peer assoc vht for sta %pM link %u\n", in ath12k_peer_assoc_h_vht()
2267 sta->addr, arsta->link_id); in ath12k_peer_assoc_h_vht()
2271 vht_cap = &link_sta->vht_cap; in ath12k_peer_assoc_h_vht()
2272 if (!vht_cap->vht_supported) in ath12k_peer_assoc_h_vht()
2275 band = def.chan->band; in ath12k_peer_assoc_h_vht()
2276 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs; in ath12k_peer_assoc_h_vht()
2281 arg->vht_flag = true; in ath12k_peer_assoc_h_vht()
2284 arg->vht_capable = true; in ath12k_peer_assoc_h_vht()
2286 if (def.chan->band == NL80211_BAND_2GHZ) in ath12k_peer_assoc_h_vht()
2287 arg->vht_ng_flag = true; in ath12k_peer_assoc_h_vht()
2289 arg->peer_vht_caps = vht_cap->cap; in ath12k_peer_assoc_h_vht()
2291 ampdu_factor = (vht_cap->cap & in ath12k_peer_assoc_h_vht()
2295 /* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to in ath12k_peer_assoc_h_vht()
2297 * arg->peer_max_mpdu at this point contains HT max_mpdu so keep in ath12k_peer_assoc_h_vht()
2300 arg->peer_max_mpdu = max(arg->peer_max_mpdu, in ath12k_peer_assoc_h_vht()
2302 ampdu_factor)) - 1); in ath12k_peer_assoc_h_vht()
2304 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80) in ath12k_peer_assoc_h_vht()
2305 arg->bw_80 = true; in ath12k_peer_assoc_h_vht()
2307 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160) in ath12k_peer_assoc_h_vht()
2308 arg->bw_160 = true; in ath12k_peer_assoc_h_vht()
2312 if (vht_nss > link_sta->rx_nss) { in ath12k_peer_assoc_h_vht()
2314 for (nss_idx = link_sta->rx_nss - 1; nss_idx >= 0; nss_idx--) { in ath12k_peer_assoc_h_vht()
2323 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_peer_assoc_h_vht()
2325 link_sta->rx_nss, arsta->addr); in ath12k_peer_assoc_h_vht()
2326 vht_mcs_mask[link_sta->rx_nss - 1] = vht_mcs_mask[vht_nss - 1]; in ath12k_peer_assoc_h_vht()
2333 vht_mcs = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map) >> in ath12k_peer_assoc_h_vht()
2340 arg->peer_nss = min(link_sta->rx_nss, max_nss); in ath12k_peer_assoc_h_vht()
2341 arg->rx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.rx_highest); in ath12k_peer_assoc_h_vht()
2342 arg->rx_mcs_set = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map); in ath12k_peer_assoc_h_vht()
2343 arg->tx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.tx_highest); in ath12k_peer_assoc_h_vht()
2345 tx_mcs_map = __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map); in ath12k_peer_assoc_h_vht()
2346 arg->tx_mcs_set = ath12k_peer_assoc_h_vht_limit(tx_mcs_map, vht_mcs_mask); in ath12k_peer_assoc_h_vht()
2352 arg->tx_mcs_set &= ~IEEE80211_VHT_MCS_SUPPORT_0_11_MASK; in ath12k_peer_assoc_h_vht()
2353 arg->tx_mcs_set |= IEEE80211_DISABLE_VHT_MCS_SUPPORT_0_11; in ath12k_peer_assoc_h_vht()
2355 if ((arg->tx_mcs_set & IEEE80211_VHT_MCS_NOT_SUPPORTED) == in ath12k_peer_assoc_h_vht()
2357 arg->peer_vht_caps &= ~IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE; in ath12k_peer_assoc_h_vht()
2360 arg->tx_max_mcs_nss = 0xFF; in ath12k_peer_assoc_h_vht()
2362 if (arg->peer_phymode == MODE_11AC_VHT160) { in ath12k_peer_assoc_h_vht()
2364 rx_nss = min(arg->peer_nss, tx_nss); in ath12k_peer_assoc_h_vht()
2365 arg->peer_bw_rxnss_override = ATH12K_BW_NSS_MAP_ENABLE; in ath12k_peer_assoc_h_vht()
2368 ath12k_warn(ar->ab, "invalid max_nss\n"); in ath12k_peer_assoc_h_vht()
2372 nss_160 = u32_encode_bits(rx_nss - 1, ATH12K_PEER_RX_NSS_160MHZ); in ath12k_peer_assoc_h_vht()
2373 arg->peer_bw_rxnss_override |= nss_160; in ath12k_peer_assoc_h_vht()
2376 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_peer_assoc_h_vht()
2378 arsta->addr, arg->peer_max_mpdu, arg->peer_flags, in ath12k_peer_assoc_h_vht()
2379 arg->peer_bw_rxnss_override); in ath12k_peer_assoc_h_vht()
2385 case IEEE80211_HE_MCS_SUPPORT_0_7: return BIT(8) - 1; in ath12k_mac_get_max_he_mcs_map()
2386 case IEEE80211_HE_MCS_SUPPORT_0_9: return BIT(10) - 1; in ath12k_mac_get_max_he_mcs_map()
2387 case IEEE80211_HE_MCS_SUPPORT_0_11: return BIT(12) - 1; in ath12k_mac_get_max_he_mcs_map()
2405 idx_limit = fls(mcs_map) - 1; in ath12k_peer_assoc_h_he_limit()
2407 idx_limit = -1; in ath12k_peer_assoc_h_he_limit()
2424 case -1: in ath12k_peer_assoc_h_he_limit()
2453 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); in ath12k_peer_assoc_h_he()
2454 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); in ath12k_peer_assoc_h_he()
2464 u8 link_id = arvif->link_id; in ath12k_peer_assoc_h_he()
2479 ath12k_warn(ar->ab, "unable to access bss link conf in peer assoc he for vif %pM link %u", in ath12k_peer_assoc_h_he()
2480 vif->addr, link_id); in ath12k_peer_assoc_h_he()
2486 ath12k_warn(ar->ab, "unable to access link sta in peer assoc he for sta %pM link %u\n", in ath12k_peer_assoc_h_he()
2487 sta->addr, arsta->link_id); in ath12k_peer_assoc_h_he()
2491 he_cap = &link_sta->he_cap; in ath12k_peer_assoc_h_he()
2492 if (!he_cap->has_he) in ath12k_peer_assoc_h_he()
2495 band = def.chan->band; in ath12k_peer_assoc_h_he()
2496 he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs; in ath12k_peer_assoc_h_he()
2501 arg->he_flag = true; in ath12k_peer_assoc_h_he()
2503 support_160 = !!(he_cap->he_cap_elem.phy_cap_info[0] & in ath12k_peer_assoc_h_he()
2506 /* Supported HE-MCS and NSS Set of peer he_cap is intersection with self he_cp */ in ath12k_peer_assoc_h_he()
2507 mcs_160_map = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160); in ath12k_peer_assoc_h_he()
2508 mcs_80_map = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80); in ath12k_peer_assoc_h_he()
2511 for (i = 7; i >= 0; i--) { in ath12k_peer_assoc_h_he()
2521 for (i = 7; i >= 0; i--) { in ath12k_peer_assoc_h_he()
2535 arg->peer_nss = min(link_sta->rx_nss, max_nss); in ath12k_peer_assoc_h_he()
2537 memcpy(&arg->peer_he_cap_macinfo, he_cap->he_cap_elem.mac_cap_info, in ath12k_peer_assoc_h_he()
2538 sizeof(he_cap->he_cap_elem.mac_cap_info)); in ath12k_peer_assoc_h_he()
2539 memcpy(&arg->peer_he_cap_phyinfo, he_cap->he_cap_elem.phy_cap_info, in ath12k_peer_assoc_h_he()
2540 sizeof(he_cap->he_cap_elem.phy_cap_info)); in ath12k_peer_assoc_h_he()
2541 arg->peer_he_ops = link_conf->he_oper.params; in ath12k_peer_assoc_h_he()
2544 arg->peer_he_ops &= 0xffffff; in ath12k_peer_assoc_h_he()
2547 * Exponent Extension in HE cap is zero, use the arg->peer_max_mpdu in ath12k_peer_assoc_h_he()
2551 * For non-zero value of Max AMPDU Exponent Extension in HE MAC caps, in ath12k_peer_assoc_h_he()
2558 ampdu_factor = u8_get_bits(he_cap->he_cap_elem.mac_cap_info[3], in ath12k_peer_assoc_h_he()
2562 if (link_sta->vht_cap.vht_supported) in ath12k_peer_assoc_h_he()
2563 arg->peer_max_mpdu = (1 << (IEEE80211_HE_VHT_MAX_AMPDU_FACTOR + in ath12k_peer_assoc_h_he()
2564 ampdu_factor)) - 1; in ath12k_peer_assoc_h_he()
2565 else if (link_sta->ht_cap.ht_supported) in ath12k_peer_assoc_h_he()
2566 arg->peer_max_mpdu = (1 << (IEEE80211_HE_HT_MAX_AMPDU_FACTOR + in ath12k_peer_assoc_h_he()
2567 ampdu_factor)) - 1; in ath12k_peer_assoc_h_he()
2570 if (he_cap->he_cap_elem.phy_cap_info[6] & in ath12k_peer_assoc_h_he()
2575 arg->peer_ppet.numss_m1 = he_cap->ppe_thres[0] & in ath12k_peer_assoc_h_he()
2577 arg->peer_ppet.ru_bit_mask = in ath12k_peer_assoc_h_he()
2578 (he_cap->ppe_thres[0] & in ath12k_peer_assoc_h_he()
2582 for (nss = 0; nss <= arg->peer_ppet.numss_m1; nss++) { in ath12k_peer_assoc_h_he()
2587 if ((arg->peer_ppet.ru_bit_mask & BIT(ru)) == 0) in ath12k_peer_assoc_h_he()
2591 val |= ((he_cap->ppe_thres[bit / 8] >> in ath12k_peer_assoc_h_he()
2595 arg->peer_ppet.ppet16_ppet8_ru3_ru0[nss] |= in ath12k_peer_assoc_h_he()
2601 if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_RES) in ath12k_peer_assoc_h_he()
2602 arg->twt_responder = true; in ath12k_peer_assoc_h_he()
2603 if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_REQ) in ath12k_peer_assoc_h_he()
2604 arg->twt_requester = true; in ath12k_peer_assoc_h_he()
2608 if (he_nss > link_sta->rx_nss) { in ath12k_peer_assoc_h_he()
2610 for (nss_idx = link_sta->rx_nss - 1; nss_idx >= 0; nss_idx--) { in ath12k_peer_assoc_h_he()
2619 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_peer_assoc_h_he()
2621 link_sta->rx_nss, arsta->addr); in ath12k_peer_assoc_h_he()
2622 he_mcs_mask[link_sta->rx_nss - 1] = he_mcs_mask[he_nss - 1]; in ath12k_peer_assoc_h_he()
2625 switch (link_sta->bandwidth) { in ath12k_peer_assoc_h_he()
2627 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160); in ath12k_peer_assoc_h_he()
2628 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v; in ath12k_peer_assoc_h_he()
2631 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v; in ath12k_peer_assoc_h_he()
2633 arg->peer_he_mcs_count++; in ath12k_peer_assoc_h_he()
2639 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80); in ath12k_peer_assoc_h_he()
2640 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v; in ath12k_peer_assoc_h_he()
2642 v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80); in ath12k_peer_assoc_h_he()
2644 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v; in ath12k_peer_assoc_h_he()
2646 arg->peer_he_mcs_count++; in ath12k_peer_assoc_h_he()
2667 max_nss = min(max_nss, ar->num_tx_chains); in ath12k_peer_assoc_h_he()
2668 arg->peer_nss = min(link_sta->rx_nss, max_nss); in ath12k_peer_assoc_h_he()
2670 if (arg->peer_phymode == MODE_11AX_HE160) { in ath12k_peer_assoc_h_he()
2671 tx_nss = ath12k_get_nss_160mhz(ar, ar->num_tx_chains); in ath12k_peer_assoc_h_he()
2672 rx_nss = min(arg->peer_nss, tx_nss); in ath12k_peer_assoc_h_he()
2674 arg->peer_nss = min(link_sta->rx_nss, ar->num_rx_chains); in ath12k_peer_assoc_h_he()
2675 arg->peer_bw_rxnss_override = ATH12K_BW_NSS_MAP_ENABLE; in ath12k_peer_assoc_h_he()
2678 ath12k_warn(ar->ab, "invalid max_nss\n"); in ath12k_peer_assoc_h_he()
2682 nss_160 = u32_encode_bits(rx_nss - 1, ATH12K_PEER_RX_NSS_160MHZ); in ath12k_peer_assoc_h_he()
2683 arg->peer_bw_rxnss_override |= nss_160; in ath12k_peer_assoc_h_he()
2686 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_peer_assoc_h_he()
2688 arsta->addr, arg->peer_nss, in ath12k_peer_assoc_h_he()
2689 arg->peer_he_mcs_count, in ath12k_peer_assoc_h_he()
2690 arg->peer_bw_rxnss_override); in ath12k_peer_assoc_h_he()
2698 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); in ath12k_peer_assoc_h_he_6ghz()
2699 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); in ath12k_peer_assoc_h_he_6ghz()
2706 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) in ath12k_peer_assoc_h_he_6ghz()
2709 band = def.chan->band; in ath12k_peer_assoc_h_he_6ghz()
2713 ath12k_warn(ar->ab, "unable to access link sta in peer assoc he 6ghz for sta %pM link %u\n", in ath12k_peer_assoc_h_he_6ghz()
2714 sta->addr, arsta->link_id); in ath12k_peer_assoc_h_he_6ghz()
2718 he_cap = &link_sta->he_cap; in ath12k_peer_assoc_h_he_6ghz()
2720 if (!arg->he_flag || band != NL80211_BAND_6GHZ || !link_sta->he_6ghz_capa.capa) in ath12k_peer_assoc_h_he_6ghz()
2723 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40) in ath12k_peer_assoc_h_he_6ghz()
2724 arg->bw_40 = true; in ath12k_peer_assoc_h_he_6ghz()
2726 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80) in ath12k_peer_assoc_h_he_6ghz()
2727 arg->bw_80 = true; in ath12k_peer_assoc_h_he_6ghz()
2729 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160) in ath12k_peer_assoc_h_he_6ghz()
2730 arg->bw_160 = true; in ath12k_peer_assoc_h_he_6ghz()
2732 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_320) in ath12k_peer_assoc_h_he_6ghz()
2733 arg->bw_320 = true; in ath12k_peer_assoc_h_he_6ghz()
2735 arg->peer_he_caps_6ghz = le16_to_cpu(link_sta->he_6ghz_capa.capa); in ath12k_peer_assoc_h_he_6ghz()
2737 mpdu_density = u32_get_bits(arg->peer_he_caps_6ghz, in ath12k_peer_assoc_h_he_6ghz()
2739 arg->peer_mpdu_density = ath12k_parse_mpdudensity(mpdu_density); in ath12k_peer_assoc_h_he_6ghz()
2741 /* From IEEE Std 802.11ax-2021 - Section 10.12.2: An HE STA shall be capable of in ath12k_peer_assoc_h_he_6ghz()
2742 * receiving A-MPDU where the A-MPDU pre-EOF padding length is up to the value in ath12k_peer_assoc_h_he_6ghz()
2743 * indicated by the Maximum A-MPDU Length Exponent Extension field in the HE in ath12k_peer_assoc_h_he_6ghz()
2744 * Capabilities element and the Maximum A-MPDU Length Exponent field in HE 6 GHz in ath12k_peer_assoc_h_he_6ghz()
2747 * Here, we are extracting the Max A-MPDU Exponent Extension from HE caps and in ath12k_peer_assoc_h_he_6ghz()
2748 * factor is the Maximum A-MPDU Length Exponent from HE 6 GHZ Band capability. in ath12k_peer_assoc_h_he_6ghz()
2750 ampdu_factor = u8_get_bits(he_cap->he_cap_elem.mac_cap_info[3], in ath12k_peer_assoc_h_he_6ghz()
2752 u32_get_bits(arg->peer_he_caps_6ghz, in ath12k_peer_assoc_h_he_6ghz()
2755 arg->peer_max_mpdu = (1u << (IEEE80211_HE_6GHZ_MAX_AMPDU_FACTOR + in ath12k_peer_assoc_h_he_6ghz()
2756 ampdu_factor)) - 1; in ath12k_peer_assoc_h_he_6ghz()
2763 if (ht_cap->ht_supported) in ath12k_get_smps_from_capa()
2764 *smps = u16_get_bits(ht_cap->cap, IEEE80211_HT_CAP_SM_PS); in ath12k_get_smps_from_capa()
2766 *smps = le16_get_bits(he_6ghz_capa->capa, in ath12k_get_smps_from_capa()
2770 return -EINVAL; in ath12k_get_smps_from_capa()
2778 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); in ath12k_peer_assoc_h_smps()
2780 struct ath12k_link_vif *arvif = arsta->arvif; in ath12k_peer_assoc_h_smps()
2783 struct ath12k *ar = arvif->ar; in ath12k_peer_assoc_h_smps()
2788 ath12k_warn(ar->ab, "unable to access link sta in peer assoc he for sta %pM link %u\n", in ath12k_peer_assoc_h_smps()
2789 sta->addr, arsta->link_id); in ath12k_peer_assoc_h_smps()
2793 he_6ghz_capa = &link_sta->he_6ghz_capa; in ath12k_peer_assoc_h_smps()
2794 ht_cap = &link_sta->ht_cap; in ath12k_peer_assoc_h_smps()
2796 if (!ht_cap->ht_supported && !he_6ghz_capa->capa) in ath12k_peer_assoc_h_smps()
2804 arg->static_mimops_flag = true; in ath12k_peer_assoc_h_smps()
2807 arg->dynamic_mimops_flag = true; in ath12k_peer_assoc_h_smps()
2810 arg->spatial_mux_flag = true; in ath12k_peer_assoc_h_smps()
2822 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); in ath12k_peer_assoc_h_qos()
2824 switch (arvif->ahvif->vdev_type) { in ath12k_peer_assoc_h_qos()
2826 if (sta->wme) { in ath12k_peer_assoc_h_qos()
2828 arg->is_wme_set = true; in ath12k_peer_assoc_h_qos()
2829 arg->qos_flag = true; in ath12k_peer_assoc_h_qos()
2832 if (sta->wme && sta->uapsd_queues) { in ath12k_peer_assoc_h_qos()
2834 arg->is_wme_set = true; in ath12k_peer_assoc_h_qos()
2835 arg->apsd_flag = true; in ath12k_peer_assoc_h_qos()
2836 arg->peer_rate_caps |= WMI_HOST_RC_UAPSD_FLAG; in ath12k_peer_assoc_h_qos()
2840 if (sta->wme) { in ath12k_peer_assoc_h_qos()
2841 arg->is_wme_set = true; in ath12k_peer_assoc_h_qos()
2842 arg->qos_flag = true; in ath12k_peer_assoc_h_qos()
2849 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac peer %pM qos %d\n", in ath12k_peer_assoc_h_qos()
2850 arsta->addr, arg->qos_flag); in ath12k_peer_assoc_h_qos()
2857 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); in ath12k_peer_assoc_qos_ap()
2863 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_peer_assoc_qos_ap()
2865 arg.vdev_id = arvif->vdev_id; in ath12k_peer_assoc_qos_ap()
2867 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac uapsd_queues 0x%x max_sp %d\n", in ath12k_peer_assoc_qos_ap()
2868 sta->uapsd_queues, sta->max_sp); in ath12k_peer_assoc_qos_ap()
2871 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO) in ath12k_peer_assoc_qos_ap()
2874 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI) in ath12k_peer_assoc_qos_ap()
2877 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK) in ath12k_peer_assoc_qos_ap()
2880 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE) in ath12k_peer_assoc_qos_ap()
2885 if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP) in ath12k_peer_assoc_qos_ap()
2886 max_sp = sta->max_sp; in ath12k_peer_assoc_qos_ap()
2890 ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, arsta->addr, &arg); in ath12k_peer_assoc_qos_ap()
2896 ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, arsta->addr, &arg); in ath12k_peer_assoc_qos_ap()
2903 ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, arsta->addr, &arg); in ath12k_peer_assoc_qos_ap()
2909 ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, arsta->addr, &arg); in ath12k_peer_assoc_qos_ap()
2916 ath12k_warn(ar->ab, "failed to set ap ps peer param %d for vdev %i: %d\n", in ath12k_peer_assoc_qos_ap()
2917 arg.param, arvif->vdev_id, ret); in ath12k_peer_assoc_qos_ap()
2923 return sta->supp_rates[NL80211_BAND_2GHZ] >> in ath12k_mac_sta_has_ofdm_only()
2930 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160) { in ath12k_mac_get_phymode_vht()
2931 if (link_sta->vht_cap.cap & (IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ | in ath12k_mac_get_phymode_vht()
2941 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80) in ath12k_mac_get_phymode_vht()
2944 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40) in ath12k_mac_get_phymode_vht()
2947 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_20) in ath12k_mac_get_phymode_vht()
2956 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160) { in ath12k_mac_get_phymode_he()
2957 if (link_sta->he_cap.he_cap_elem.phy_cap_info[0] & in ath12k_mac_get_phymode_he()
2964 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80) in ath12k_mac_get_phymode_he()
2967 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40) in ath12k_mac_get_phymode_he()
2970 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_20) in ath12k_mac_get_phymode_he()
2979 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_320) in ath12k_mac_get_phymode_eht()
2980 if (link_sta->eht_cap.eht_cap_elem.phy_cap_info[0] & in ath12k_mac_get_phymode_eht()
2984 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160) { in ath12k_mac_get_phymode_eht()
2985 if (link_sta->he_cap.he_cap_elem.phy_cap_info[0] & in ath12k_mac_get_phymode_eht()
2989 ath12k_warn(ar->ab, "invalid EHT PHY capability info for 160 Mhz: %d\n", in ath12k_mac_get_phymode_eht()
2990 link_sta->he_cap.he_cap_elem.phy_cap_info[0]); in ath12k_mac_get_phymode_eht()
2995 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80) in ath12k_mac_get_phymode_eht()
2998 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40) in ath12k_mac_get_phymode_eht()
3001 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_20) in ath12k_mac_get_phymode_eht()
3020 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_peer_assoc_h_phymode()
3022 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); in ath12k_peer_assoc_h_phymode()
3023 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); in ath12k_peer_assoc_h_phymode()
3025 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) in ath12k_peer_assoc_h_phymode()
3028 band = def.chan->band; in ath12k_peer_assoc_h_phymode()
3029 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs; in ath12k_peer_assoc_h_phymode()
3030 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs; in ath12k_peer_assoc_h_phymode()
3031 he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs; in ath12k_peer_assoc_h_phymode()
3035 ath12k_warn(ar->ab, "unable to access link sta in peer assoc he for sta %pM link %u\n", in ath12k_peer_assoc_h_phymode()
3036 sta->addr, arsta->link_id); in ath12k_peer_assoc_h_phymode()
3042 if (link_sta->eht_cap.has_eht) { in ath12k_peer_assoc_h_phymode()
3043 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40) in ath12k_peer_assoc_h_phymode()
3047 } else if (link_sta->he_cap.has_he && in ath12k_peer_assoc_h_phymode()
3049 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80) in ath12k_peer_assoc_h_phymode()
3051 else if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40) in ath12k_peer_assoc_h_phymode()
3055 } else if (link_sta->vht_cap.vht_supported && in ath12k_peer_assoc_h_phymode()
3057 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40) in ath12k_peer_assoc_h_phymode()
3061 } else if (link_sta->ht_cap.ht_supported && in ath12k_peer_assoc_h_phymode()
3063 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40) in ath12k_peer_assoc_h_phymode()
3076 if (link_sta->eht_cap.has_eht) { in ath12k_peer_assoc_h_phymode()
3078 } else if (link_sta->he_cap.has_he && in ath12k_peer_assoc_h_phymode()
3081 } else if (link_sta->vht_cap.vht_supported && in ath12k_peer_assoc_h_phymode()
3084 } else if (link_sta->ht_cap.ht_supported && in ath12k_peer_assoc_h_phymode()
3086 if (link_sta->bandwidth >= IEEE80211_STA_RX_BW_40) in ath12k_peer_assoc_h_phymode()
3098 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac peer %pM phymode %s\n", in ath12k_peer_assoc_h_phymode()
3099 arsta->addr, ath12k_mac_phymode_str(phymode)); in ath12k_peer_assoc_h_phymode()
3101 arg->peer_phymode = phymode; in ath12k_peer_assoc_h_phymode()
3145 ppet->numss_m1 = u8_get_bits(ppe_thres[0], IEEE80211_EHT_PPE_THRES_NSS_MASK); in ath12k_mac_set_eht_ppe_threshold()
3146 ppet->ru_bit_mask = u16_get_bits(get_unaligned_le16(ppe_thres), in ath12k_mac_set_eht_ppe_threshold()
3149 for (nss = 0; nss <= ppet->numss_m1; nss++) { in ath12k_mac_set_eht_ppe_threshold()
3153 if ((ppet->ru_bit_mask & BIT(ru)) == 0) in ath12k_mac_set_eht_ppe_threshold()
3162 ppet->ppet16_ppet8_ru3_ru0[nss] |= in ath12k_mac_set_eht_ppe_threshold()
3173 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); in ath12k_peer_assoc_h_eht()
3182 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_peer_assoc_h_eht()
3186 ath12k_warn(ar->ab, "unable to access link sta in peer assoc eht for sta %pM link %u\n", in ath12k_peer_assoc_h_eht()
3187 sta->addr, arsta->link_id); in ath12k_peer_assoc_h_eht()
3193 ath12k_warn(ar->ab, "unable to access link_conf in peer assoc eht set\n"); in ath12k_peer_assoc_h_eht()
3197 eht_cap = &link_sta->eht_cap; in ath12k_peer_assoc_h_eht()
3198 he_cap = &link_sta->he_cap; in ath12k_peer_assoc_h_eht()
3199 if (!he_cap->has_he || !eht_cap->has_eht) in ath12k_peer_assoc_h_eht()
3202 arg->eht_flag = true; in ath12k_peer_assoc_h_eht()
3204 if ((eht_cap->eht_cap_elem.phy_cap_info[5] & in ath12k_peer_assoc_h_eht()
3206 eht_cap->eht_ppe_thres[0] != 0) in ath12k_peer_assoc_h_eht()
3207 ath12k_mac_set_eht_ppe_threshold(eht_cap->eht_ppe_thres, in ath12k_peer_assoc_h_eht()
3208 &arg->peer_eht_ppet); in ath12k_peer_assoc_h_eht()
3210 memcpy(arg->peer_eht_cap_mac, eht_cap->eht_cap_elem.mac_cap_info, in ath12k_peer_assoc_h_eht()
3211 sizeof(eht_cap->eht_cap_elem.mac_cap_info)); in ath12k_peer_assoc_h_eht()
3212 memcpy(arg->peer_eht_cap_phy, eht_cap->eht_cap_elem.phy_cap_info, in ath12k_peer_assoc_h_eht()
3213 sizeof(eht_cap->eht_cap_elem.phy_cap_info)); in ath12k_peer_assoc_h_eht()
3215 rx_mcs = arg->peer_eht_rx_mcs_set; in ath12k_peer_assoc_h_eht()
3216 tx_mcs = arg->peer_eht_tx_mcs_set; in ath12k_peer_assoc_h_eht()
3218 switch (link_sta->bandwidth) { in ath12k_peer_assoc_h_eht()
3220 bw = &eht_cap->eht_mcs_nss_supp.bw._320; in ath12k_peer_assoc_h_eht()
3221 ath12k_mac_set_eht_mcs(bw->rx_tx_mcs9_max_nss, in ath12k_peer_assoc_h_eht()
3222 bw->rx_tx_mcs9_max_nss, in ath12k_peer_assoc_h_eht()
3223 bw->rx_tx_mcs11_max_nss, in ath12k_peer_assoc_h_eht()
3224 bw->rx_tx_mcs13_max_nss, in ath12k_peer_assoc_h_eht()
3227 arg->peer_eht_mcs_count++; in ath12k_peer_assoc_h_eht()
3230 bw = &eht_cap->eht_mcs_nss_supp.bw._160; in ath12k_peer_assoc_h_eht()
3231 ath12k_mac_set_eht_mcs(bw->rx_tx_mcs9_max_nss, in ath12k_peer_assoc_h_eht()
3232 bw->rx_tx_mcs9_max_nss, in ath12k_peer_assoc_h_eht()
3233 bw->rx_tx_mcs11_max_nss, in ath12k_peer_assoc_h_eht()
3234 bw->rx_tx_mcs13_max_nss, in ath12k_peer_assoc_h_eht()
3237 arg->peer_eht_mcs_count++; in ath12k_peer_assoc_h_eht()
3240 if ((he_cap->he_cap_elem.phy_cap_info[0] & in ath12k_peer_assoc_h_eht()
3245 bw_20 = &eht_cap->eht_mcs_nss_supp.only_20mhz; in ath12k_peer_assoc_h_eht()
3247 ath12k_mac_set_eht_mcs(bw_20->rx_tx_mcs7_max_nss, in ath12k_peer_assoc_h_eht()
3248 bw_20->rx_tx_mcs9_max_nss, in ath12k_peer_assoc_h_eht()
3249 bw_20->rx_tx_mcs11_max_nss, in ath12k_peer_assoc_h_eht()
3250 bw_20->rx_tx_mcs13_max_nss, in ath12k_peer_assoc_h_eht()
3254 bw = &eht_cap->eht_mcs_nss_supp.bw._80; in ath12k_peer_assoc_h_eht()
3255 ath12k_mac_set_eht_mcs(bw->rx_tx_mcs9_max_nss, in ath12k_peer_assoc_h_eht()
3256 bw->rx_tx_mcs9_max_nss, in ath12k_peer_assoc_h_eht()
3257 bw->rx_tx_mcs11_max_nss, in ath12k_peer_assoc_h_eht()
3258 bw->rx_tx_mcs13_max_nss, in ath12k_peer_assoc_h_eht()
3263 arg->peer_eht_mcs_count++; in ath12k_peer_assoc_h_eht()
3267 arg->punct_bitmap = ~arvif->punct_bitmap; in ath12k_peer_assoc_h_eht()
3268 arg->eht_disable_mcs15 = link_conf->eht_disable_mcs15; in ath12k_peer_assoc_h_eht()
3274 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); in ath12k_peer_assoc_h_mlo()
3275 struct peer_assoc_mlo_params *ml = &arg->ml; in ath12k_peer_assoc_h_mlo()
3276 struct ath12k_sta *ahsta = arsta->ahsta; in ath12k_peer_assoc_h_mlo()
3283 if (!sta->mlo || ahsta->ml_peer_id == ATH12K_MLO_PEER_ID_INVALID) in ath12k_peer_assoc_h_mlo()
3286 ml->enabled = true; in ath12k_peer_assoc_h_mlo()
3287 ml->assoc_link = arsta->is_assoc_link; in ath12k_peer_assoc_h_mlo()
3290 ml->primary_umac = arsta->is_assoc_link; in ath12k_peer_assoc_h_mlo()
3291 ml->peer_id_valid = true; in ath12k_peer_assoc_h_mlo()
3292 ml->logical_link_idx_valid = true; in ath12k_peer_assoc_h_mlo()
3294 ether_addr_copy(ml->mld_addr, sta->addr); in ath12k_peer_assoc_h_mlo()
3295 ml->logical_link_idx = arsta->link_idx; in ath12k_peer_assoc_h_mlo()
3296 ml->ml_peer_id = ahsta->ml_peer_id; in ath12k_peer_assoc_h_mlo()
3297 ml->ieee_link_id = arsta->link_id; in ath12k_peer_assoc_h_mlo()
3298 ml->num_partner_links = 0; in ath12k_peer_assoc_h_mlo()
3299 ml->eml_cap = sta->eml_cap; in ath12k_peer_assoc_h_mlo()
3300 links = ahsta->links_map; in ath12k_peer_assoc_h_mlo()
3310 arsta_p = rcu_dereference(ahsta->link[link_id]); in ath12k_peer_assoc_h_mlo()
3311 arvif = rcu_dereference(ahsta->ahvif->link[link_id]); in ath12k_peer_assoc_h_mlo()
3316 if (!arvif->is_started) in ath12k_peer_assoc_h_mlo()
3319 ml->partner_info[i].vdev_id = arvif->vdev_id; in ath12k_peer_assoc_h_mlo()
3320 ml->partner_info[i].hw_link_id = arvif->ar->pdev->hw_link_id; in ath12k_peer_assoc_h_mlo()
3321 ml->partner_info[i].assoc_link = arsta_p->is_assoc_link; in ath12k_peer_assoc_h_mlo()
3322 ml->partner_info[i].primary_umac = arsta_p->is_assoc_link; in ath12k_peer_assoc_h_mlo()
3323 ml->partner_info[i].logical_link_idx_valid = true; in ath12k_peer_assoc_h_mlo()
3324 ml->partner_info[i].logical_link_idx = arsta_p->link_idx; in ath12k_peer_assoc_h_mlo()
3325 ml->num_partner_links++; in ath12k_peer_assoc_h_mlo()
3339 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_peer_assoc_prepare()
3343 reinit_completion(&ar->peer_assoc_done); in ath12k_peer_assoc_prepare()
3345 arg->peer_new_assoc = !reassoc; in ath12k_peer_assoc_prepare()
3359 arsta->peer_nss = arg->peer_nss; in ath12k_peer_assoc_prepare()
3370 if (!ht_cap->ht_supported && !he_6ghz_capa) in ath12k_setup_peer_smps()
3377 return ath12k_wmi_set_peer_param(ar, addr, arvif->vdev_id, in ath12k_setup_peer_smps()
3384 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_mac_set_he_txbf_conf()
3385 struct ath12k *ar = arvif->ar; in ath12k_mac_set_he_txbf_conf()
3393 ath12k_warn(ar->ab, "unable to access bss link conf in txbf conf\n"); in ath12k_mac_set_he_txbf_conf()
3394 return -EINVAL; in ath12k_mac_set_he_txbf_conf()
3397 if (!link_conf->he_support) in ath12k_mac_set_he_txbf_conf()
3400 if (link_conf->he_su_beamformer) { in ath12k_mac_set_he_txbf_conf()
3402 if (link_conf->he_mu_beamformer && in ath12k_mac_set_he_txbf_conf()
3403 ahvif->vdev_type == WMI_VDEV_TYPE_AP) in ath12k_mac_set_he_txbf_conf()
3407 if (ahvif->vif->type != NL80211_IFTYPE_MESH_POINT) { in ath12k_mac_set_he_txbf_conf()
3411 if (link_conf->he_full_ul_mumimo) in ath12k_mac_set_he_txbf_conf()
3414 if (link_conf->he_su_beamformee) in ath12k_mac_set_he_txbf_conf()
3418 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, value); in ath12k_mac_set_he_txbf_conf()
3420 ath12k_warn(ar->ab, "failed to set vdev %d HE MU mode: %d\n", in ath12k_mac_set_he_txbf_conf()
3421 arvif->vdev_id, ret); in ath12k_mac_set_he_txbf_conf()
3429 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_set_he_txbf_conf()
3432 ath12k_warn(ar->ab, "failed to set vdev %d sounding mode: %d\n", in ath12k_mac_set_he_txbf_conf()
3433 arvif->vdev_id, ret); in ath12k_mac_set_he_txbf_conf()
3445 struct ieee80211_vif *vif = arvif->ahvif->vif; in ath12k_mac_vif_recalc_sta_he_txbf()
3449 u8 link_id = arvif->link_id; in ath12k_mac_vif_recalc_sta_he_txbf()
3454 ath12k_warn(ar->ab, "unable to access bss link conf in recalc txbf conf\n"); in ath12k_mac_vif_recalc_sta_he_txbf()
3455 return -EINVAL; in ath12k_mac_vif_recalc_sta_he_txbf()
3458 if (!link_conf->he_support) in ath12k_mac_vif_recalc_sta_he_txbf()
3461 if (vif->type != NL80211_IFTYPE_STATION) in ath12k_mac_vif_recalc_sta_he_txbf()
3462 return -EINVAL; in ath12k_mac_vif_recalc_sta_he_txbf()
3465 return -EINVAL; in ath12k_mac_vif_recalc_sta_he_txbf()
3467 if (def.chan->band == NL80211_BAND_2GHZ) in ath12k_mac_vif_recalc_sta_he_txbf()
3468 cap_band = &ar->mac.iftype[NL80211_BAND_2GHZ][vif->type].he_cap; in ath12k_mac_vif_recalc_sta_he_txbf()
3470 cap_band = &ar->mac.iftype[NL80211_BAND_5GHZ][vif->type].he_cap; in ath12k_mac_vif_recalc_sta_he_txbf()
3472 memcpy(&he_cap_elem, &cap_band->he_cap_elem, sizeof(he_cap_elem)); in ath12k_mac_vif_recalc_sta_he_txbf()
3476 if (HECAP_PHY_SUBFMR_GET(he_cap->he_cap_elem.phy_cap_info)) in ath12k_mac_vif_recalc_sta_he_txbf()
3478 if (HECAP_PHY_MUBFMR_GET(he_cap->he_cap_elem.phy_cap_info)) in ath12k_mac_vif_recalc_sta_he_txbf()
3482 if (vif->type != NL80211_IFTYPE_MESH_POINT) { in ath12k_mac_vif_recalc_sta_he_txbf()
3487 if (HECAP_PHY_ULMUMIMO_GET(he_cap->he_cap_elem.phy_cap_info)) in ath12k_mac_vif_recalc_sta_he_txbf()
3503 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_mac_set_eht_txbf_conf()
3504 struct ath12k *ar = arvif->ar; in ath12k_mac_set_eht_txbf_conf()
3512 ath12k_warn(ar->ab, "unable to access bss link conf in eht txbf conf\n"); in ath12k_mac_set_eht_txbf_conf()
3513 return -ENOENT; in ath12k_mac_set_eht_txbf_conf()
3516 if (!link_conf->eht_support) in ath12k_mac_set_eht_txbf_conf()
3519 if (link_conf->eht_su_beamformer) { in ath12k_mac_set_eht_txbf_conf()
3521 if (link_conf->eht_mu_beamformer && in ath12k_mac_set_eht_txbf_conf()
3522 ahvif->vdev_type == WMI_VDEV_TYPE_AP) in ath12k_mac_set_eht_txbf_conf()
3531 if (ahvif->vif->type != NL80211_IFTYPE_MESH_POINT) { in ath12k_mac_set_eht_txbf_conf()
3535 if (link_conf->eht_80mhz_full_bw_ul_mumimo) in ath12k_mac_set_eht_txbf_conf()
3538 if (link_conf->eht_su_beamformee) in ath12k_mac_set_eht_txbf_conf()
3543 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, value); in ath12k_mac_set_eht_txbf_conf()
3545 ath12k_warn(ar->ab, "failed to set vdev %d EHT MU mode: %d\n", in ath12k_mac_set_eht_txbf_conf()
3546 arvif->vdev_id, ret); in ath12k_mac_set_eht_txbf_conf()
3558 switch (link_sta->bandwidth) { in ath12k_mac_ieee80211_sta_bw_to_wmi()
3575 ath12k_warn(ar->ab, "Invalid bandwidth %d for link station %pM\n", in ath12k_mac_ieee80211_sta_bw_to_wmi()
3576 link_sta->bandwidth, link_sta->addr); in ath12k_mac_ieee80211_sta_bw_to_wmi()
3588 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_bss_assoc()
3592 u8 link_id = bss_conf->link_id; in ath12k_bss_assoc()
3601 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_bss_assoc()
3608 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_bss_assoc()
3610 arvif->vdev_id, link_id, arvif->bssid, ahvif->aid); in ath12k_bss_assoc()
3615 * non-ML connection, it has the BSSID. in ath12k_bss_assoc()
3617 ap_sta = ieee80211_find_sta(vif, vif->cfg.ap_addr); in ath12k_bss_assoc()
3619 ath12k_warn(ar->ab, "failed to find station entry for bss %pM vdev %i\n", in ath12k_bss_assoc()
3620 vif->cfg.ap_addr, arvif->vdev_id); in ath12k_bss_assoc()
3627 arsta = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy, in ath12k_bss_assoc()
3628 ahsta->link[link_id]); in ath12k_bss_assoc()
3642 /* link_sta->he_cap must be protected by rcu_read_lock */ in ath12k_bss_assoc()
3643 ret = ath12k_mac_vif_recalc_sta_he_txbf(ar, arvif, &link_sta->he_cap, &hemode); in ath12k_bss_assoc()
3645 ath12k_warn(ar->ab, "failed to recalc he txbf for vdev %i on bss %pM: %d\n", in ath12k_bss_assoc()
3646 arvif->vdev_id, bss_conf->bssid, ret); in ath12k_bss_assoc()
3654 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_bss_assoc()
3657 ath12k_warn(ar->ab, "failed to submit vdev param txbf 0x%x: %d\n", in ath12k_bss_assoc()
3662 peer_arg->is_assoc = true; in ath12k_bss_assoc()
3665 ath12k_warn(ar->ab, "failed to run peer assoc for %pM vdev %i: %d\n", in ath12k_bss_assoc()
3666 bss_conf->bssid, arvif->vdev_id, ret); in ath12k_bss_assoc()
3670 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) { in ath12k_bss_assoc()
3671 ath12k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n", in ath12k_bss_assoc()
3672 bss_conf->bssid, arvif->vdev_id); in ath12k_bss_assoc()
3676 ret = ath12k_setup_peer_smps(ar, arvif, bss_conf->bssid, in ath12k_bss_assoc()
3677 &link_sta->ht_cap, &link_sta->he_6ghz_capa); in ath12k_bss_assoc()
3679 ath12k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n", in ath12k_bss_assoc()
3680 arvif->vdev_id, ret); in ath12k_bss_assoc()
3684 WARN_ON(arvif->is_up); in ath12k_bss_assoc()
3686 ahvif->aid = vif->cfg.aid; in ath12k_bss_assoc()
3687 ether_addr_copy(arvif->bssid, bss_conf->bssid); in ath12k_bss_assoc()
3689 params.vdev_id = arvif->vdev_id; in ath12k_bss_assoc()
3690 params.aid = ahvif->aid; in ath12k_bss_assoc()
3691 params.bssid = arvif->bssid; in ath12k_bss_assoc()
3694 params.nontx_profile_idx = bss_conf->bssid_index; in ath12k_bss_assoc()
3695 params.nontx_profile_cnt = 1 << bss_conf->bssid_indicator; in ath12k_bss_assoc()
3699 ath12k_warn(ar->ab, "failed to set vdev %d up: %d\n", in ath12k_bss_assoc()
3700 arvif->vdev_id, ret); in ath12k_bss_assoc()
3704 arvif->is_up = true; in ath12k_bss_assoc()
3705 arvif->rekey_data.enable_offload = false; in ath12k_bss_assoc()
3707 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_bss_assoc()
3709 arvif->vdev_id, bss_conf->bssid, vif->cfg.aid); in ath12k_bss_assoc()
3711 spin_lock_bh(&ar->ab->base_lock); in ath12k_bss_assoc()
3713 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arvif->bssid); in ath12k_bss_assoc()
3714 if (peer && peer->is_authorized) in ath12k_bss_assoc()
3717 spin_unlock_bh(&ar->ab->base_lock); in ath12k_bss_assoc()
3721 ret = ath12k_wmi_set_peer_param(ar, arvif->bssid, in ath12k_bss_assoc()
3722 arvif->vdev_id, in ath12k_bss_assoc()
3726 ath12k_warn(ar->ab, "Unable to authorize BSS peer: %d\n", ret); in ath12k_bss_assoc()
3729 ret = ath12k_wmi_send_obss_spr_cmd(ar, arvif->vdev_id, in ath12k_bss_assoc()
3730 &bss_conf->he_obss_pd); in ath12k_bss_assoc()
3732 ath12k_warn(ar->ab, "failed to set vdev %i OBSS PD parameters: %d\n", in ath12k_bss_assoc()
3733 arvif->vdev_id, ret); in ath12k_bss_assoc()
3735 if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map) && in ath12k_bss_assoc()
3736 ahvif->vdev_type == WMI_VDEV_TYPE_STA && in ath12k_bss_assoc()
3737 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE) in ath12k_bss_assoc()
3738 ath12k_mac_11d_scan_stop_all(ar->ab); in ath12k_bss_assoc()
3746 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_bss_disassoc()
3748 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %i disassoc bssid %pM\n", in ath12k_bss_disassoc()
3749 arvif->vdev_id, arvif->bssid); in ath12k_bss_disassoc()
3751 ret = ath12k_wmi_vdev_down(ar, arvif->vdev_id); in ath12k_bss_disassoc()
3753 ath12k_warn(ar->ab, "failed to down vdev %i: %d\n", in ath12k_bss_disassoc()
3754 arvif->vdev_id, ret); in ath12k_bss_disassoc()
3756 arvif->is_up = false; in ath12k_bss_disassoc()
3758 memset(&arvif->rekey_data, 0, sizeof(arvif->rekey_data)); in ath12k_bss_disassoc()
3760 cancel_delayed_work(&arvif->connection_loss_work); in ath12k_bss_disassoc()
3785 return -EINVAL; in ath12k_mac_get_rate_hw_value()
3792 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); in ath12k_recalculate_mgmt_rate()
3802 lockdep_assert_wiphy(hw->wiphy); in ath12k_recalculate_mgmt_rate()
3806 ath12k_warn(ar->ab, "unable to access bss link conf in mgmt rate calc for vif %pM link %u\n", in ath12k_recalculate_mgmt_rate()
3807 vif->addr, arvif->link_id); in ath12k_recalculate_mgmt_rate()
3811 sband = hw->wiphy->bands[def->chan->band]; in ath12k_recalculate_mgmt_rate()
3812 if (bss_conf->basic_rates) in ath12k_recalculate_mgmt_rate()
3813 basic_rate_idx = __ffs(bss_conf->basic_rates); in ath12k_recalculate_mgmt_rate()
3816 bitrate = sband->bitrates[basic_rate_idx].bitrate; in ath12k_recalculate_mgmt_rate()
3820 ath12k_warn(ar->ab, "bitrate not supported %d\n", bitrate); in ath12k_recalculate_mgmt_rate()
3825 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param, in ath12k_recalculate_mgmt_rate()
3828 ath12k_warn(ar->ab, "failed to set mgmt tx rate %d\n", ret); in ath12k_recalculate_mgmt_rate()
3831 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param, in ath12k_recalculate_mgmt_rate()
3834 ath12k_warn(ar->ab, "failed to set beacon tx rate %d\n", ret); in ath12k_recalculate_mgmt_rate()
3840 struct ath12k_hw *ah = ahvif->ah; in ath12k_mac_init_arvif()
3844 lockdep_assert_wiphy(ah->hw->wiphy); in ath12k_mac_init_arvif()
3857 arvif->ahvif = ahvif; in ath12k_mac_init_arvif()
3858 arvif->link_id = _link_id; in ath12k_mac_init_arvif()
3861 spin_lock_init(&arvif->link_stats_lock); in ath12k_mac_init_arvif()
3863 INIT_LIST_HEAD(&arvif->list); in ath12k_mac_init_arvif()
3864 INIT_DELAYED_WORK(&arvif->connection_loss_work, in ath12k_mac_init_arvif()
3867 arvif->num_stations = 0; in ath12k_mac_init_arvif()
3869 for (i = 0; i < ARRAY_SIZE(arvif->bitrate_mask.control); i++) { in ath12k_mac_init_arvif()
3870 arvif->bitrate_mask.control[i].legacy = 0xffffffff; in ath12k_mac_init_arvif()
3871 arvif->bitrate_mask.control[i].gi = NL80211_TXRATE_DEFAULT_GI; in ath12k_mac_init_arvif()
3872 memset(arvif->bitrate_mask.control[i].ht_mcs, 0xff, in ath12k_mac_init_arvif()
3873 sizeof(arvif->bitrate_mask.control[i].ht_mcs)); in ath12k_mac_init_arvif()
3874 memset(arvif->bitrate_mask.control[i].vht_mcs, 0xff, in ath12k_mac_init_arvif()
3875 sizeof(arvif->bitrate_mask.control[i].vht_mcs)); in ath12k_mac_init_arvif()
3876 memset(arvif->bitrate_mask.control[i].he_mcs, 0xff, in ath12k_mac_init_arvif()
3877 sizeof(arvif->bitrate_mask.control[i].he_mcs)); in ath12k_mac_init_arvif()
3882 rcu_assign_pointer(ahvif->link[arvif->link_id], arvif); in ath12k_mac_init_arvif()
3883 ahvif->links_map |= BIT(_link_id); in ath12k_mac_init_arvif()
3888 _link_id, (link_id < 0) ? " deflink" : "", ahvif->vif->addr, in ath12k_mac_init_arvif()
3889 ahvif->links_map); in ath12k_mac_init_arvif()
3895 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_mac_remove_link_interface()
3896 struct ath12k_hw *ah = hw->priv; in ath12k_mac_remove_link_interface()
3897 struct ath12k *ar = arvif->ar; in ath12k_mac_remove_link_interface()
3900 lockdep_assert_wiphy(ah->hw->wiphy); in ath12k_mac_remove_link_interface()
3902 cancel_delayed_work_sync(&arvif->connection_loss_work); in ath12k_mac_remove_link_interface()
3904 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac remove link interface (vdev %d link id %d)", in ath12k_mac_remove_link_interface()
3905 arvif->vdev_id, arvif->link_id); in ath12k_mac_remove_link_interface()
3907 if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map) && in ath12k_mac_remove_link_interface()
3908 ahvif->vdev_type == WMI_VDEV_TYPE_STA && in ath12k_mac_remove_link_interface()
3909 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE) in ath12k_mac_remove_link_interface()
3912 if (ahvif->vdev_type == WMI_VDEV_TYPE_AP) { in ath12k_mac_remove_link_interface()
3913 ret = ath12k_peer_delete(ar, arvif->vdev_id, arvif->bssid); in ath12k_mac_remove_link_interface()
3915 ath12k_warn(ar->ab, "failed to submit AP self-peer removal on vdev %d link id %d: %d", in ath12k_mac_remove_link_interface()
3916 arvif->vdev_id, arvif->link_id, ret); in ath12k_mac_remove_link_interface()
3928 lockdep_assert_wiphy(ah->hw->wiphy); in ath12k_mac_assign_link_vif()
3930 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]); in ath12k_mac_assign_link_vif()
3937 if (!ahvif->links_map && link_id < ATH12K_FIRST_SCAN_LINK) { in ath12k_mac_assign_link_vif()
3938 arvif = &ahvif->deflink; in ath12k_mac_assign_link_vif()
3940 if (vif->type == NL80211_IFTYPE_STATION) in ath12k_mac_assign_link_vif()
3941 arvif->is_sta_assoc_link = true; in ath12k_mac_assign_link_vif()
3955 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_mac_unassign_link_vif()
3956 struct ath12k_hw *ah = ahvif->ah; in ath12k_mac_unassign_link_vif()
3958 lockdep_assert_wiphy(ah->hw->wiphy); in ath12k_mac_unassign_link_vif()
3960 rcu_assign_pointer(ahvif->link[arvif->link_id], NULL); in ath12k_mac_unassign_link_vif()
3962 ahvif->links_map &= ~BIT(arvif->link_id); in ath12k_mac_unassign_link_vif()
3964 if (arvif != &ahvif->deflink) in ath12k_mac_unassign_link_vif()
3983 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_change_vif_links()
3987 vif->addr, old_links, new_links); in ath12k_mac_op_change_vif_links()
3990 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); in ath12k_mac_op_change_vif_links()
3995 return -EINVAL; in ath12k_mac_op_change_vif_links()
3999 return -EINVAL; in ath12k_mac_op_change_vif_links()
4003 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); in ath12k_mac_op_change_vif_links()
4005 return -EINVAL; in ath12k_mac_op_change_vif_links()
4007 if (!arvif->is_created) in ath12k_mac_op_change_vif_links()
4010 if (WARN_ON(!arvif->ar)) in ath12k_mac_op_change_vif_links()
4011 return -EINVAL; in ath12k_mac_op_change_vif_links()
4023 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); in ath12k_mac_fils_discovery()
4024 struct ath12k *ar = arvif->ar; in ath12k_mac_fils_discovery()
4031 if (info->fils_discovery.max_interval) { in ath12k_mac_fils_discovery()
4032 interval = info->fils_discovery.max_interval; in ath12k_mac_fils_discovery()
4036 ret = ath12k_wmi_fils_discovery_tmpl(ar, arvif->vdev_id, in ath12k_mac_fils_discovery()
4038 } else if (info->unsol_bcast_probe_resp_interval) { in ath12k_mac_fils_discovery()
4040 interval = info->unsol_bcast_probe_resp_interval; in ath12k_mac_fils_discovery()
4044 ret = ath12k_wmi_probe_resp_tmpl(ar, arvif->vdev_id, in ath12k_mac_fils_discovery()
4047 return ath12k_wmi_fils_discovery(ar, arvif->vdev_id, 0, false); in ath12k_mac_fils_discovery()
4051 ath12k_warn(ar->ab, in ath12k_mac_fils_discovery()
4053 arvif->vdev_id, (unsol_bcast_probe_resp_enabled ? in ath12k_mac_fils_discovery()
4056 return -EPERM; in ath12k_mac_fils_discovery()
4061 ret = ath12k_wmi_fils_discovery(ar, arvif->vdev_id, interval, in ath12k_mac_fils_discovery()
4069 struct ath12k *ar = arvif->ar; in ath12k_mac_vif_setup_ps()
4070 struct ieee80211_vif *vif = arvif->ahvif->vif; in ath12k_mac_vif_setup_ps()
4071 struct ieee80211_conf *conf = &ath12k_ar_to_hw(ar)->conf; in ath12k_mac_vif_setup_ps()
4079 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_vif_setup_ps()
4081 if (vif->type != NL80211_IFTYPE_STATION) in ath12k_mac_vif_setup_ps()
4084 enable_ps = arvif->ahvif->ps; in ath12k_mac_vif_setup_ps()
4089 timeout = conf->dynamic_ps_timeout; in ath12k_mac_vif_setup_ps()
4093 ath12k_warn(ar->ab, "unable to access bss link conf in setup ps for vif %pM link %u\n", in ath12k_mac_vif_setup_ps()
4094 vif->addr, arvif->link_id); in ath12k_mac_vif_setup_ps()
4099 timeout = ieee80211_tu_to_usec(info->beacon_int) / 1000; in ath12k_mac_vif_setup_ps()
4102 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param, in ath12k_mac_vif_setup_ps()
4105 ath12k_warn(ar->ab, "failed to set inactivity time for vdev %d: %i\n", in ath12k_mac_vif_setup_ps()
4106 arvif->vdev_id, ret); in ath12k_mac_vif_setup_ps()
4113 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %d psmode %s\n", in ath12k_mac_vif_setup_ps()
4114 arvif->vdev_id, psmode ? "enable" : "disable"); in ath12k_mac_vif_setup_ps()
4116 ret = ath12k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id, psmode); in ath12k_mac_vif_setup_ps()
4118 ath12k_warn(ar->ab, "failed to set sta power save mode %d for vdev %d: %d\n", in ath12k_mac_vif_setup_ps()
4119 psmode, arvif->vdev_id, ret); in ath12k_mac_vif_setup_ps()
4127 unsigned long links = ahvif->links_map; in ath12k_mac_op_vif_cfg_changed()
4136 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_vif_cfg_changed()
4138 if (changed & BSS_CHANGED_SSID && vif->type == NL80211_IFTYPE_AP) { in ath12k_mac_op_vif_cfg_changed()
4139 ahvif->u.ap.ssid_len = vif->cfg.ssid_len; in ath12k_mac_op_vif_cfg_changed()
4140 if (vif->cfg.ssid_len) in ath12k_mac_op_vif_cfg_changed()
4141 memcpy(ahvif->u.ap.ssid, vif->cfg.ssid, vif->cfg.ssid_len); in ath12k_mac_op_vif_cfg_changed()
4145 if (vif->cfg.assoc) { in ath12k_mac_op_vif_cfg_changed()
4150 sta = ieee80211_find_sta(vif, vif->cfg.ap_addr); in ath12k_mac_op_vif_cfg_changed()
4154 vif->cfg.ap_addr); in ath12k_mac_op_vif_cfg_changed()
4159 arvif = wiphy_dereference(hw->wiphy, in ath12k_mac_op_vif_cfg_changed()
4160 ahvif->link[ahsta->assoc_link_id]); in ath12k_mac_op_vif_cfg_changed()
4163 ar = arvif->ar; in ath12k_mac_op_vif_cfg_changed()
4171 links &= ~BIT(ahsta->assoc_link_id); in ath12k_mac_op_vif_cfg_changed()
4175 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); in ath12k_mac_op_vif_cfg_changed()
4176 if (!arvif || !arvif->ar) in ath12k_mac_op_vif_cfg_changed()
4179 ar = arvif->ar; in ath12k_mac_op_vif_cfg_changed()
4181 if (vif->cfg.assoc) { in ath12k_mac_op_vif_cfg_changed()
4194 links = ahvif->links_map; in ath12k_mac_op_vif_cfg_changed()
4195 vif_cfg = &vif->cfg; in ath12k_mac_op_vif_cfg_changed()
4198 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); in ath12k_mac_op_vif_cfg_changed()
4199 if (!arvif || !arvif->ar) in ath12k_mac_op_vif_cfg_changed()
4202 ar = arvif->ar; in ath12k_mac_op_vif_cfg_changed()
4204 if (ar->ab->hw_params->supports_sta_ps) { in ath12k_mac_op_vif_cfg_changed()
4205 ahvif->ps = vif_cfg->ps; in ath12k_mac_op_vif_cfg_changed()
4216 test_bit(WMI_TLV_SERVICE_EXT_TPC_REG_SUPPORT, ar->ab->wmi_ab.svc_map) && in ath12k_mac_supports_tpc()
4217 (ahvif->vdev_type == WMI_VDEV_TYPE_STA || in ath12k_mac_supports_tpc()
4218 ahvif->vdev_type == WMI_VDEV_TYPE_AP) && in ath12k_mac_supports_tpc()
4219 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE && in ath12k_mac_supports_tpc()
4220 chandef->chan && in ath12k_mac_supports_tpc()
4221 chandef->chan->band == NL80211_BAND_6GHZ; in ath12k_mac_supports_tpc()
4229 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_mac_bss_info_changed()
4243 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_bss_info_changed()
4246 arvif->beacon_interval = info->beacon_int; in ath12k_mac_bss_info_changed()
4249 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_bss_info_changed()
4251 arvif->beacon_interval); in ath12k_mac_bss_info_changed()
4253 ath12k_warn(ar->ab, "Failed to set beacon interval for VDEV: %d\n", in ath12k_mac_bss_info_changed()
4254 arvif->vdev_id); in ath12k_mac_bss_info_changed()
4256 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_bss_info_changed()
4258 arvif->beacon_interval, arvif->vdev_id); in ath12k_mac_bss_info_changed()
4265 param_value, ar->pdev->pdev_id); in ath12k_mac_bss_info_changed()
4267 ath12k_warn(ar->ab, "Failed to set beacon mode for VDEV: %d\n", in ath12k_mac_bss_info_changed()
4268 arvif->vdev_id); in ath12k_mac_bss_info_changed()
4270 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_bss_info_changed()
4272 arvif->vdev_id); in ath12k_mac_bss_info_changed()
4276 ath12k_warn(ar->ab, "failed to update bcn template: %d\n", in ath12k_mac_bss_info_changed()
4281 arvif->dtim_period = info->dtim_period; in ath12k_mac_bss_info_changed()
4284 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_bss_info_changed()
4286 arvif->dtim_period); in ath12k_mac_bss_info_changed()
4289 ath12k_warn(ar->ab, "Failed to set dtim period for VDEV %d: %i\n", in ath12k_mac_bss_info_changed()
4290 arvif->vdev_id, ret); in ath12k_mac_bss_info_changed()
4292 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_bss_info_changed()
4294 arvif->dtim_period, arvif->vdev_id); in ath12k_mac_bss_info_changed()
4298 vif->type == NL80211_IFTYPE_AP) { in ath12k_mac_bss_info_changed()
4299 ahvif->u.ap.ssid_len = vif->cfg.ssid_len; in ath12k_mac_bss_info_changed()
4300 if (vif->cfg.ssid_len) in ath12k_mac_bss_info_changed()
4301 memcpy(ahvif->u.ap.ssid, vif->cfg.ssid, vif->cfg.ssid_len); in ath12k_mac_bss_info_changed()
4302 ahvif->u.ap.hidden_ssid = info->hidden_ssid; in ath12k_mac_bss_info_changed()
4305 if (changed & BSS_CHANGED_BSSID && !is_zero_ether_addr(info->bssid)) in ath12k_mac_bss_info_changed()
4306 ether_addr_copy(arvif->bssid, info->bssid); in ath12k_mac_bss_info_changed()
4309 if (info->enable_beacon) { in ath12k_mac_bss_info_changed()
4312 ath12k_warn(ar->ab, in ath12k_mac_bss_info_changed()
4314 arvif->vdev_id); in ath12k_mac_bss_info_changed()
4318 ath12k_warn(ar->ab, in ath12k_mac_bss_info_changed()
4320 arvif->vdev_id); in ath12k_mac_bss_info_changed()
4324 if (arvif->is_up && info->he_support && in ath12k_mac_bss_info_changed()
4325 info->he_oper.params) { in ath12k_mac_bss_info_changed()
4327 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_bss_info_changed()
4331 ath12k_warn(ar->ab, in ath12k_mac_bss_info_changed()
4333 arvif->vdev_id); in ath12k_mac_bss_info_changed()
4336 param_value = info->he_oper.params; in ath12k_mac_bss_info_changed()
4337 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_bss_info_changed()
4339 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_bss_info_changed()
4341 param_value, arvif->vdev_id); in ath12k_mac_bss_info_changed()
4344 ath12k_warn(ar->ab, "Failed to set he oper params %x for VDEV %d: %i\n", in ath12k_mac_bss_info_changed()
4345 param_value, arvif->vdev_id, ret); in ath12k_mac_bss_info_changed()
4352 cts_prot = !!(info->use_cts_prot); in ath12k_mac_bss_info_changed()
4355 if (arvif->is_started) { in ath12k_mac_bss_info_changed()
4356 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_bss_info_changed()
4359 ath12k_warn(ar->ab, "Failed to set CTS prot for VDEV: %d\n", in ath12k_mac_bss_info_changed()
4360 arvif->vdev_id); in ath12k_mac_bss_info_changed()
4362 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "Set CTS prot: %d for VDEV: %d\n", in ath12k_mac_bss_info_changed()
4363 cts_prot, arvif->vdev_id); in ath12k_mac_bss_info_changed()
4365 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "defer protection mode setup, vdev is not ready yet\n"); in ath12k_mac_bss_info_changed()
4372 if (info->use_short_slot) in ath12k_mac_bss_info_changed()
4379 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_bss_info_changed()
4382 ath12k_warn(ar->ab, "Failed to set erp slot for VDEV: %d\n", in ath12k_mac_bss_info_changed()
4383 arvif->vdev_id); in ath12k_mac_bss_info_changed()
4385 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_bss_info_changed()
4387 slottime, arvif->vdev_id); in ath12k_mac_bss_info_changed()
4393 if (info->use_short_preamble) in ath12k_mac_bss_info_changed()
4399 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_bss_info_changed()
4402 ath12k_warn(ar->ab, "Failed to set preamble for VDEV: %d\n", in ath12k_mac_bss_info_changed()
4403 arvif->vdev_id); in ath12k_mac_bss_info_changed()
4405 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_bss_info_changed()
4407 preamble, arvif->vdev_id); in ath12k_mac_bss_info_changed()
4411 if (vif->cfg.assoc) in ath12k_mac_bss_info_changed()
4418 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev_id %i txpower %d\n", in ath12k_mac_bss_info_changed()
4419 arvif->vdev_id, info->txpower); in ath12k_mac_bss_info_changed()
4421 arvif->txpower = info->txpower; in ath12k_mac_bss_info_changed()
4426 !ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)) { in ath12k_mac_bss_info_changed()
4427 band = def.chan->band; in ath12k_mac_bss_info_changed()
4428 mcast_rate = info->mcast_rate[band]; in ath12k_mac_bss_info_changed()
4431 rateidx = mcast_rate - 1; in ath12k_mac_bss_info_changed()
4433 if (info->basic_rates) in ath12k_mac_bss_info_changed()
4434 rateidx = __ffs(info->basic_rates); in ath12k_mac_bss_info_changed()
4439 if (ar->pdev->cap.supported_bands & WMI_HOST_WLAN_5GHZ_CAP) in ath12k_mac_bss_info_changed()
4452 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_bss_info_changed()
4454 arvif->vdev_id, rate); in ath12k_mac_bss_info_changed()
4457 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_bss_info_changed()
4460 ath12k_warn(ar->ab, in ath12k_mac_bss_info_changed()
4462 arvif->vdev_id, ret); in ath12k_mac_bss_info_changed()
4465 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_bss_info_changed()
4468 ath12k_warn(ar->ab, in ath12k_mac_bss_info_changed()
4470 arvif->vdev_id, ret); in ath12k_mac_bss_info_changed()
4474 !ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)) in ath12k_mac_bss_info_changed()
4478 if (info->twt_requester || info->twt_responder) in ath12k_mac_bss_info_changed()
4479 ath12k_wmi_send_twt_enable_cmd(ar, ar->pdev->pdev_id); in ath12k_mac_bss_info_changed()
4481 ath12k_wmi_send_twt_disable_cmd(ar, ar->pdev->pdev_id); in ath12k_mac_bss_info_changed()
4485 ath12k_wmi_send_obss_spr_cmd(ar, arvif->vdev_id, in ath12k_mac_bss_info_changed()
4486 &info->he_obss_pd); in ath12k_mac_bss_info_changed()
4489 if (vif->type == NL80211_IFTYPE_AP) { in ath12k_mac_bss_info_changed()
4491 arvif->vdev_id, in ath12k_mac_bss_info_changed()
4492 info->he_bss_color.color, in ath12k_mac_bss_info_changed()
4494 info->he_bss_color.enabled); in ath12k_mac_bss_info_changed()
4496 ath12k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n", in ath12k_mac_bss_info_changed()
4497 arvif->vdev_id, ret); in ath12k_mac_bss_info_changed()
4498 } else if (vif->type == NL80211_IFTYPE_STATION) { in ath12k_mac_bss_info_changed()
4500 arvif->vdev_id, in ath12k_mac_bss_info_changed()
4503 ath12k_warn(ar->ab, "failed to enable bss color change on vdev %i: %d\n", in ath12k_mac_bss_info_changed()
4504 arvif->vdev_id, ret); in ath12k_mac_bss_info_changed()
4506 arvif->vdev_id, in ath12k_mac_bss_info_changed()
4511 ath12k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n", in ath12k_mac_bss_info_changed()
4512 arvif->vdev_id, ret); in ath12k_mac_bss_info_changed()
4522 if (!ahvif->cache[link_id]) { in ath12k_ahvif_get_link_cache()
4523 ahvif->cache[link_id] = kzalloc(sizeof(*ahvif->cache[0]), GFP_KERNEL); in ath12k_ahvif_get_link_cache()
4524 if (ahvif->cache[link_id]) in ath12k_ahvif_get_link_cache()
4525 INIT_LIST_HEAD(&ahvif->cache[link_id]->key_conf.list); in ath12k_ahvif_get_link_cache()
4528 return ahvif->cache[link_id]; in ath12k_ahvif_get_link_cache()
4535 if (!cache || list_empty(&cache->key_conf.list)) in ath12k_ahvif_put_link_key_cache()
4537 list_for_each_entry_safe(key_conf, tmp, &cache->key_conf.list, list) { in ath12k_ahvif_put_link_key_cache()
4538 list_del(&key_conf->list); in ath12k_ahvif_put_link_key_cache()
4548 ath12k_ahvif_put_link_key_cache(ahvif->cache[link_id]); in ath12k_ahvif_put_link_cache()
4549 kfree(ahvif->cache[link_id]); in ath12k_ahvif_put_link_cache()
4550 ahvif->cache[link_id] = NULL; in ath12k_ahvif_put_link_cache()
4562 u8 link_id = info->link_id; in ath12k_mac_op_link_info_changed()
4564 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_link_info_changed()
4566 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); in ath12k_mac_op_link_info_changed()
4572 if (!arvif || !arvif->is_created) { in ath12k_mac_op_link_info_changed()
4577 cache->bss_conf_changed |= changed; in ath12k_mac_op_link_info_changed()
4582 ar = arvif->ar; in ath12k_mac_op_link_info_changed()
4592 struct ath12k_hw *ah = hw->priv; in ath12k_mac_select_scan_device()
4597 if (ah->num_radio == 1) in ath12k_mac_select_scan_device()
4598 return ah->radio; in ath12k_mac_select_scan_device()
4615 if (ar->mac.sbands[band].channels && in ath12k_mac_select_scan_device()
4616 center_freq >= KHZ_TO_MHZ(ar->freq_range.start_freq) && in ath12k_mac_select_scan_device()
4617 center_freq <= KHZ_TO_MHZ(ar->freq_range.end_freq)) in ath12k_mac_select_scan_device()
4628 lockdep_assert_held(&ar->data_lock); in __ath12k_mac_scan_finish()
4630 switch (ar->scan.state) { in __ath12k_mac_scan_finish()
4635 if (ar->scan.is_roc && ar->scan.roc_notify) in __ath12k_mac_scan_finish()
4639 cancel_delayed_work(&ar->scan.timeout); in __ath12k_mac_scan_finish()
4640 complete_all(&ar->scan.completed); in __ath12k_mac_scan_finish()
4641 wiphy_work_queue(ar->ah->hw->wiphy, &ar->scan.vdev_clean_wk); in __ath12k_mac_scan_finish()
4648 spin_lock_bh(&ar->data_lock); in ath12k_mac_scan_finish()
4650 spin_unlock_bh(&ar->data_lock); in ath12k_mac_scan_finish()
4661 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_scan_stop()
4664 arg.pdev_id = ar->pdev->pdev_id; in ath12k_scan_stop()
4668 ath12k_warn(ar->ab, "failed to stop wmi scan: %d\n", ret); in ath12k_scan_stop()
4672 ret = wait_for_completion_timeout(&ar->scan.completed, 3 * HZ); in ath12k_scan_stop()
4674 ath12k_warn(ar->ab, in ath12k_scan_stop()
4676 ret = -ETIMEDOUT; in ath12k_scan_stop()
4689 spin_lock_bh(&ar->data_lock); in ath12k_scan_stop()
4692 spin_unlock_bh(&ar->data_lock); in ath12k_scan_stop()
4701 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_scan_abort()
4703 spin_lock_bh(&ar->data_lock); in ath12k_scan_abort()
4705 switch (ar->scan.state) { in ath12k_scan_abort()
4713 ath12k_warn(ar->ab, "refusing scan abortion due to invalid scan state: %d\n", in ath12k_scan_abort()
4714 ar->scan.state); in ath12k_scan_abort()
4717 ar->scan.state = ATH12K_SCAN_ABORTING; in ath12k_scan_abort()
4718 spin_unlock_bh(&ar->data_lock); in ath12k_scan_abort()
4722 ath12k_warn(ar->ab, "failed to abort scan: %d\n", ret); in ath12k_scan_abort()
4724 spin_lock_bh(&ar->data_lock); in ath12k_scan_abort()
4728 spin_unlock_bh(&ar->data_lock); in ath12k_scan_abort()
4736 wiphy_lock(ath12k_ar_to_hw(ar)->wiphy); in ath12k_scan_timeout_work()
4738 wiphy_unlock(ath12k_ar_to_hw(ar)->wiphy); in ath12k_scan_timeout_work()
4744 struct ath12k_hw *ah = ar->ah; in ath12k_mac_scan_send_complete()
4748 lockdep_assert_wiphy(ah->hw->wiphy); in ath12k_mac_scan_send_complete()
4752 partner_ar->scan.state == ATH12K_SCAN_RUNNING) in ath12k_mac_scan_send_complete()
4755 ieee80211_scan_completed(ah->hw, info); in ath12k_mac_scan_send_complete()
4762 struct ath12k_hw *ah = ar->ah; in ath12k_scan_vdev_clean_work()
4767 arvif = ar->scan.arvif; in ath12k_scan_vdev_clean_work()
4776 if (!arvif || arvif->is_started) in ath12k_scan_vdev_clean_work()
4779 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac clean scan vdev (link id %u)", in ath12k_scan_vdev_clean_work()
4780 arvif->link_id); in ath12k_scan_vdev_clean_work()
4782 ath12k_mac_remove_link_interface(ah->hw, arvif); in ath12k_scan_vdev_clean_work()
4786 spin_lock_bh(&ar->data_lock); in ath12k_scan_vdev_clean_work()
4787 ar->scan.arvif = NULL; in ath12k_scan_vdev_clean_work()
4788 if (!ar->scan.is_roc) { in ath12k_scan_vdev_clean_work()
4790 .aborted = ((ar->scan.state == in ath12k_scan_vdev_clean_work()
4792 (ar->scan.state == in ath12k_scan_vdev_clean_work()
4799 ar->scan.state = ATH12K_SCAN_IDLE; in ath12k_scan_vdev_clean_work()
4800 ar->scan_channel = NULL; in ath12k_scan_vdev_clean_work()
4801 ar->scan.roc_freq = 0; in ath12k_scan_vdev_clean_work()
4802 spin_unlock_bh(&ar->data_lock); in ath12k_scan_vdev_clean_work()
4810 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_start_scan()
4816 ret = wait_for_completion_timeout(&ar->scan.started, 1 * HZ); in ath12k_start_scan()
4820 ath12k_warn(ar->ab, "failed to stop scan: %d\n", ret); in ath12k_start_scan()
4822 return -ETIMEDOUT; in ath12k_start_scan()
4829 spin_lock_bh(&ar->data_lock); in ath12k_start_scan()
4830 if (ar->scan.state == ATH12K_SCAN_IDLE) { in ath12k_start_scan()
4831 spin_unlock_bh(&ar->data_lock); in ath12k_start_scan()
4832 return -EINVAL; in ath12k_start_scan()
4834 spin_unlock_bh(&ar->data_lock); in ath12k_start_scan()
4842 struct ath12k_base *ab = ar->ab; in ath12k_mac_get_fw_stats()
4847 guard(mutex)(&ah->hw_mutex); in ath12k_mac_get_fw_stats()
4849 if (ah->state != ATH12K_HW_STATE_ON) in ath12k_mac_get_fw_stats()
4850 return -ENETDOWN; in ath12k_mac_get_fw_stats()
4854 reinit_completion(&ar->fw_stats_complete); in ath12k_mac_get_fw_stats()
4855 reinit_completion(&ar->fw_stats_done); in ath12k_mac_get_fw_stats()
4857 ret = ath12k_wmi_send_stats_request_cmd(ar, param->stats_id, in ath12k_mac_get_fw_stats()
4858 param->vdev_id, param->pdev_id); in ath12k_mac_get_fw_stats()
4866 param->pdev_id, param->vdev_id, param->stats_id); in ath12k_mac_get_fw_stats()
4868 time_left = wait_for_completion_timeout(&ar->fw_stats_complete, 1 * HZ); in ath12k_mac_get_fw_stats()
4871 return -ETIMEDOUT; in ath12k_mac_get_fw_stats()
4874 /* Firmware sends WMI_UPDATE_STATS_EVENTID back-to-back in ath12k_mac_get_fw_stats()
4875 * when stats data buffer limit is reached. fw_stats_complete in ath12k_mac_get_fw_stats()
4880 time_left = wait_for_completion_timeout(&ar->fw_stats_done, 3 * HZ); in ath12k_mac_get_fw_stats()
4883 return -ETIMEDOUT; in ath12k_mac_get_fw_stats()
4897 struct ath12k_hw *ah = hw->priv; in ath12k_mac_op_get_txpower()
4909 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_get_txpower()
4911 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]); in ath12k_mac_op_get_txpower()
4912 if (!arvif || !arvif->ar) in ath12k_mac_op_get_txpower()
4913 return -EINVAL; in ath12k_mac_op_get_txpower()
4915 ar = arvif->ar; in ath12k_mac_op_get_txpower()
4916 ab = ar->ab; in ath12k_mac_op_get_txpower()
4917 if (ah->state != ATH12K_HW_STATE_ON) in ath12k_mac_op_get_txpower()
4920 if (test_bit(ATH12K_FLAG_CAC_RUNNING, &ar->dev_flags)) in ath12k_mac_op_get_txpower()
4921 return -EAGAIN; in ath12k_mac_op_get_txpower()
4923 /* Limit the requests to Firmware for fetching the tx power */ in ath12k_mac_op_get_txpower()
4924 if (ar->chan_tx_pwr != ATH12K_PDEV_TX_POWER_INVALID && in ath12k_mac_op_get_txpower()
4927 ar->last_tx_power_update)) in ath12k_mac_op_get_txpower()
4930 params.pdev_id = ar->pdev->pdev_id; in ath12k_mac_op_get_txpower()
4931 params.vdev_id = arvif->vdev_id; in ath12k_mac_op_get_txpower()
4939 spin_lock_bh(&ar->data_lock); in ath12k_mac_op_get_txpower()
4940 pdev = list_first_entry_or_null(&ar->fw_stats.pdevs, in ath12k_mac_op_get_txpower()
4943 spin_unlock_bh(&ar->data_lock); in ath12k_mac_op_get_txpower()
4948 ar->chan_tx_pwr = pdev->chan_tx_power / 2; in ath12k_mac_op_get_txpower()
4949 spin_unlock_bh(&ar->data_lock); in ath12k_mac_op_get_txpower()
4950 ar->last_tx_power_update = jiffies; in ath12k_mac_op_get_txpower()
4953 *dbm = ar->chan_tx_pwr; in ath12k_mac_op_get_txpower()
4954 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "txpower fetched from firmware %d dBm\n", in ath12k_mac_op_get_txpower()
4959 /* We didn't get txpower from FW. Hence, relying on vif->bss_conf.txpower */ in ath12k_mac_op_get_txpower()
4960 *dbm = vif->bss_conf.txpower; in ath12k_mac_op_get_txpower()
4961 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "txpower from firmware NaN, reported %d dBm\n", in ath12k_mac_op_get_txpower()
4970 struct ath12k_hw *ah = ahvif->ah; in ath12k_mac_find_link_id_by_ar()
4971 unsigned long links = ahvif->links_map; in ath12k_mac_find_link_id_by_ar()
4975 lockdep_assert_wiphy(ah->hw->wiphy); in ath12k_mac_find_link_id_by_ar()
4978 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]); in ath12k_mac_find_link_id_by_ar()
4980 if (!arvif || !arvif->is_created) in ath12k_mac_find_link_id_by_ar()
4983 if (ar == arvif->ar) in ath12k_mac_find_link_id_by_ar()
4993 /* Unset all non-scan links (0-14) of scan_links_map so that ffs() will in ath12k_mac_find_link_id_by_ar()
4996 scan_links_map = ~ahvif->links_map & ATH12K_SCAN_LINKS_MASK; in ath12k_mac_find_link_id_by_ar()
5013 struct cfg80211_scan_request *req = &hw_req->req; in ath12k_mac_initiate_hw_scan()
5020 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_initiate_hw_scan()
5022 arvif = &ahvif->deflink; in ath12k_mac_initiate_hw_scan()
5034 return -EBUSY; in ath12k_mac_initiate_hw_scan()
5038 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac link ID %d selected for scan", in ath12k_mac_initiate_hw_scan()
5039 arvif->link_id); in ath12k_mac_initiate_hw_scan()
5047 * delete-create vdev's for the same ar, in case the request is in ath12k_mac_initiate_hw_scan()
5050 if (arvif->is_created) { in ath12k_mac_initiate_hw_scan()
5051 if (WARN_ON(!arvif->ar)) in ath12k_mac_initiate_hw_scan()
5052 return -EINVAL; in ath12k_mac_initiate_hw_scan()
5054 if (ar != arvif->ar && arvif->is_started) in ath12k_mac_initiate_hw_scan()
5055 return -EINVAL; in ath12k_mac_initiate_hw_scan()
5057 if (ar != arvif->ar) { in ath12k_mac_initiate_hw_scan()
5073 ath12k_warn(ar->ab, "unable to create scan vdev %d\n", ret); in ath12k_mac_initiate_hw_scan()
5074 return -EINVAL; in ath12k_mac_initiate_hw_scan()
5078 spin_lock_bh(&ar->data_lock); in ath12k_mac_initiate_hw_scan()
5079 switch (ar->scan.state) { in ath12k_mac_initiate_hw_scan()
5081 reinit_completion(&ar->scan.started); in ath12k_mac_initiate_hw_scan()
5082 reinit_completion(&ar->scan.completed); in ath12k_mac_initiate_hw_scan()
5083 ar->scan.state = ATH12K_SCAN_STARTING; in ath12k_mac_initiate_hw_scan()
5084 ar->scan.is_roc = false; in ath12k_mac_initiate_hw_scan()
5085 ar->scan.arvif = arvif; in ath12k_mac_initiate_hw_scan()
5091 ret = -EBUSY; in ath12k_mac_initiate_hw_scan()
5094 spin_unlock_bh(&ar->data_lock); in ath12k_mac_initiate_hw_scan()
5101 ret = -ENOMEM; in ath12k_mac_initiate_hw_scan()
5106 arg->vdev_id = arvif->vdev_id; in ath12k_mac_initiate_hw_scan()
5107 arg->scan_id = ATH12K_SCAN_ID; in ath12k_mac_initiate_hw_scan()
5109 if (req->ie_len) { in ath12k_mac_initiate_hw_scan()
5110 arg->extraie.ptr = kmemdup(req->ie, req->ie_len, GFP_KERNEL); in ath12k_mac_initiate_hw_scan()
5111 if (!arg->extraie.ptr) { in ath12k_mac_initiate_hw_scan()
5112 ret = -ENOMEM; in ath12k_mac_initiate_hw_scan()
5115 arg->extraie.len = req->ie_len; in ath12k_mac_initiate_hw_scan()
5118 if (req->n_ssids) { in ath12k_mac_initiate_hw_scan()
5119 arg->num_ssids = req->n_ssids; in ath12k_mac_initiate_hw_scan()
5120 for (i = 0; i < arg->num_ssids; i++) in ath12k_mac_initiate_hw_scan()
5121 arg->ssid[i] = req->ssids[i]; in ath12k_mac_initiate_hw_scan()
5123 arg->scan_f_passive = 1; in ath12k_mac_initiate_hw_scan()
5127 arg->num_chan = n_channels; in ath12k_mac_initiate_hw_scan()
5128 arg->chan_list = kcalloc(arg->num_chan, sizeof(*arg->chan_list), in ath12k_mac_initiate_hw_scan()
5130 if (!arg->chan_list) { in ath12k_mac_initiate_hw_scan()
5131 ret = -ENOMEM; in ath12k_mac_initiate_hw_scan()
5135 for (i = 0; i < arg->num_chan; i++) in ath12k_mac_initiate_hw_scan()
5136 arg->chan_list[i] = chan_list[i]->center_freq; in ath12k_mac_initiate_hw_scan()
5141 if (ret == -EBUSY) in ath12k_mac_initiate_hw_scan()
5142 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_initiate_hw_scan()
5143 "scan engine is busy 11d state %d\n", ar->state_11d); in ath12k_mac_initiate_hw_scan()
5145 ath12k_warn(ar->ab, "failed to start hw scan: %d\n", ret); in ath12k_mac_initiate_hw_scan()
5147 spin_lock_bh(&ar->data_lock); in ath12k_mac_initiate_hw_scan()
5148 ar->scan.state = ATH12K_SCAN_IDLE; in ath12k_mac_initiate_hw_scan()
5149 spin_unlock_bh(&ar->data_lock); in ath12k_mac_initiate_hw_scan()
5153 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac scan started"); in ath12k_mac_initiate_hw_scan()
5156 ieee80211_queue_delayed_work(ath12k_ar_to_hw(ar), &ar->scan.timeout, in ath12k_mac_initiate_hw_scan()
5157 msecs_to_jiffies(arg->max_scan_time + in ath12k_mac_initiate_hw_scan()
5162 kfree(arg->chan_list); in ath12k_mac_initiate_hw_scan()
5163 kfree(arg->extraie.ptr); in ath12k_mac_initiate_hw_scan()
5167 if (ar->state_11d == ATH12K_11D_PREPARING && in ath12k_mac_initiate_hw_scan()
5168 ahvif->vdev_type == WMI_VDEV_TYPE_STA && in ath12k_mac_initiate_hw_scan()
5169 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE) in ath12k_mac_initiate_hw_scan()
5170 ath12k_mac_11d_scan_start(ar, arvif->vdev_id); in ath12k_mac_initiate_hw_scan()
5187 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_hw_scan()
5189 chan_list = kcalloc(hw_req->req.n_channels, sizeof(*chan_list), GFP_KERNEL); in ath12k_mac_op_hw_scan()
5191 return -ENOMEM; in ath12k_mac_op_hw_scan()
5201 for (j = 0; j < hw_req->req.n_channels; j++) { in ath12k_mac_op_hw_scan()
5202 chan = hw_req->req.channels[j]; in ath12k_mac_op_hw_scan()
5204 chan->center_freq); in ath12k_mac_op_hw_scan()
5206 ath12k_hw_warn(ah, "unable to select scan device for freq %d\n", in ath12k_mac_op_hw_scan()
5207 chan->center_freq); in ath12k_mac_op_hw_scan()
5208 ret = -EINVAL; in ath12k_mac_op_hw_scan()
5230 links_map = ahvif->links_map; in ath12k_mac_op_hw_scan()
5232 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); in ath12k_mac_op_hw_scan()
5236 ar = arvif->ar; in ath12k_mac_op_hw_scan()
5237 if (ar->scan.arvif == arvif) { in ath12k_mac_op_hw_scan()
5238 wiphy_work_cancel(hw->wiphy, &ar->scan.vdev_clean_wk); in ath12k_mac_op_hw_scan()
5239 spin_lock_bh(&ar->data_lock); in ath12k_mac_op_hw_scan()
5240 ar->scan.arvif = NULL; in ath12k_mac_op_hw_scan()
5241 ar->scan.state = ATH12K_SCAN_IDLE; in ath12k_mac_op_hw_scan()
5242 ar->scan_channel = NULL; in ath12k_mac_op_hw_scan()
5243 ar->scan.roc_freq = 0; in ath12k_mac_op_hw_scan()
5244 spin_unlock_bh(&ar->data_lock); in ath12k_mac_op_hw_scan()
5260 unsigned long link_id, links_map = ahvif->links_map; in ath12k_mac_op_cancel_hw_scan()
5264 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_cancel_hw_scan()
5267 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); in ath12k_mac_op_cancel_hw_scan()
5268 if (!arvif || arvif->is_started) in ath12k_mac_op_cancel_hw_scan()
5271 ar = arvif->ar; in ath12k_mac_op_cancel_hw_scan()
5275 cancel_delayed_work_sync(&ar->scan.timeout); in ath12k_mac_op_cancel_hw_scan()
5285 struct ath12k *ar = arvif->ar; in ath12k_install_key()
5287 .vdev_id = arvif->vdev_id, in ath12k_install_key()
5288 .key_idx = key->keyidx, in ath12k_install_key()
5289 .key_len = key->keylen, in ath12k_install_key()
5290 .key_data = key->key, in ath12k_install_key()
5292 .ieee80211_key_cipher = key->cipher, in ath12k_install_key()
5295 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_install_key()
5297 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_install_key()
5299 if (test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags)) in ath12k_install_key()
5310 switch (key->cipher) { in ath12k_install_key()
5314 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT; in ath12k_install_key()
5324 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT; in ath12k_install_key()
5337 ath12k_warn(ar->ab, "cipher %d is not supported\n", key->cipher); in ath12k_install_key()
5338 return -EOPNOTSUPP; in ath12k_install_key()
5341 if (test_bit(ATH12K_FLAG_RAW_MODE, &ar->ab->dev_flags)) in ath12k_install_key()
5342 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV | in ath12k_install_key()
5346 if (ahvif->vdev_type == WMI_VDEV_TYPE_STA && in ath12k_install_key()
5349 if (arvif->pairwise_key_done) { in ath12k_install_key()
5350 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_install_key()
5360 arvif->group_key = arg; in ath12k_install_key()
5361 arvif->group_key_valid = true; in ath12k_install_key()
5362 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_install_key()
5370 arvif->group_key_valid = false; in ath12k_install_key()
5375 reinit_completion(&ar->install_key_done); in ath12k_install_key()
5377 ret = ath12k_wmi_vdev_install_key(arvif->ar, &arg); in ath12k_install_key()
5381 if (!wait_for_completion_timeout(&ar->install_key_done, 1 * HZ)) in ath12k_install_key()
5382 return -ETIMEDOUT; in ath12k_install_key()
5384 if (ether_addr_equal(arg.macaddr, arvif->bssid)) in ath12k_install_key()
5385 ahvif->key_cipher = arg.ieee80211_key_cipher; in ath12k_install_key()
5387 if (ar->install_key_status) { in ath12k_install_key()
5388 ret = -EINVAL; in ath12k_install_key()
5392 if (ahvif->vdev_type == WMI_VDEV_TYPE_STA && in ath12k_install_key()
5395 arvif->pairwise_key_done = true; in ath12k_install_key()
5396 if (arvif->group_key_valid) { in ath12k_install_key()
5398 arvif->group_key_valid = false; in ath12k_install_key()
5399 arg = arvif->group_key; in ath12k_install_key()
5400 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_install_key()
5406 arvif->pairwise_key_done = false; in ath12k_install_key()
5413 * but triggers re-connection directly, so manually reset in ath12k_install_key()
5416 arvif->group_key_valid = false; in ath12k_install_key()
5417 arvif->pairwise_key_done = false; in ath12k_install_key()
5426 struct ath12k *ar = arvif->ar; in ath12k_clear_peer_keys()
5427 struct ath12k_base *ab = ar->ab; in ath12k_clear_peer_keys()
5434 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_clear_peer_keys()
5436 spin_lock_bh(&ab->base_lock); in ath12k_clear_peer_keys()
5437 peer = ath12k_peer_find(ab, arvif->vdev_id, addr); in ath12k_clear_peer_keys()
5438 spin_unlock_bh(&ab->base_lock); in ath12k_clear_peer_keys()
5441 return -ENOENT; in ath12k_clear_peer_keys()
5443 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) { in ath12k_clear_peer_keys()
5444 if (!peer->keys[i]) in ath12k_clear_peer_keys()
5448 ret = ath12k_install_key(arvif, peer->keys[i], in ath12k_clear_peer_keys()
5457 spin_lock_bh(&ab->base_lock); in ath12k_clear_peer_keys()
5458 peer->keys[i] = NULL; in ath12k_clear_peer_keys()
5459 spin_unlock_bh(&ab->base_lock); in ath12k_clear_peer_keys()
5471 struct ath12k_base *ab = ar->ab; in ath12k_mac_set_key()
5478 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_set_key()
5481 sta = ath12k_ahsta_to_sta(arsta->ahsta); in ath12k_mac_set_key()
5483 if (test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ab->dev_flags)) in ath12k_mac_set_key()
5487 peer_addr = arsta->addr; in ath12k_mac_set_key()
5489 peer_addr = arvif->bssid; in ath12k_mac_set_key()
5491 key->hw_key_idx = key->keyidx; in ath12k_mac_set_key()
5493 /* the peer should not disappear in mid-way (unless FW goes awry) since in ath12k_mac_set_key()
5496 spin_lock_bh(&ab->base_lock); in ath12k_mac_set_key()
5497 peer = ath12k_peer_find(ab, arvif->vdev_id, peer_addr); in ath12k_mac_set_key()
5498 spin_unlock_bh(&ab->base_lock); in ath12k_mac_set_key()
5502 ath12k_warn(ab, "cannot install key for non-existent peer %pM\n", in ath12k_mac_set_key()
5504 return -EOPNOTSUPP; in ath12k_mac_set_key()
5513 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) in ath12k_mac_set_key()
5530 spin_lock_bh(&ab->base_lock); in ath12k_mac_set_key()
5531 peer = ath12k_peer_find(ab, arvif->vdev_id, peer_addr); in ath12k_mac_set_key()
5533 peer->keys[key->keyidx] = key; in ath12k_mac_set_key()
5534 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) { in ath12k_mac_set_key()
5535 peer->ucast_keyidx = key->keyidx; in ath12k_mac_set_key()
5536 peer->sec_type = ath12k_dp_tx_get_encrypt_type(key->cipher); in ath12k_mac_set_key()
5538 peer->mcast_keyidx = key->keyidx; in ath12k_mac_set_key()
5539 peer->sec_type_grp = ath12k_dp_tx_get_encrypt_type(key->cipher); in ath12k_mac_set_key()
5542 peer->keys[key->keyidx] = NULL; in ath12k_mac_set_key()
5543 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) in ath12k_mac_set_key()
5544 peer->ucast_keyidx = 0; in ath12k_mac_set_key()
5546 peer->mcast_keyidx = 0; in ath12k_mac_set_key()
5554 switch (key->cipher) { in ath12k_mac_set_key()
5561 ahsta->pn_type = HAL_PN_TYPE_WPA; in ath12k_mac_set_key()
5563 ahsta->pn_type = HAL_PN_TYPE_NONE; in ath12k_mac_set_key()
5566 ahsta->pn_type = HAL_PN_TYPE_NONE; in ath12k_mac_set_key()
5571 spin_unlock_bh(&ab->base_lock); in ath12k_mac_set_key()
5583 list_for_each_entry_safe(key_conf, tmp, &cache->key_conf.list, list) { in ath12k_mac_update_key_cache()
5584 if (key_conf->key != key) in ath12k_mac_update_key_cache()
5595 list_del(&key_conf->list); in ath12k_mac_update_key_cache()
5603 return -ENOMEM; in ath12k_mac_update_key_cache()
5605 key_conf->cmd = cmd; in ath12k_mac_update_key_cache()
5606 key_conf->sta = sta; in ath12k_mac_update_key_cache()
5607 key_conf->key = key; in ath12k_mac_update_key_cache()
5608 list_add_tail(&key_conf->list, in ath12k_mac_update_key_cache()
5609 &cache->key_conf.list); in ath12k_mac_update_key_cache()
5628 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_set_key()
5631 if (key->keyidx == 4 || key->keyidx == 5) in ath12k_mac_op_set_key()
5634 if (key->keyidx > WMI_MAX_KEY_INDEX) in ath12k_mac_op_set_key()
5635 return -ENOSPC; in ath12k_mac_op_set_key()
5643 if (sta->mlo) { in ath12k_mac_op_set_key()
5644 links = ahsta->links_map; in ath12k_mac_op_set_key()
5646 arvif = wiphy_dereference(hw->wiphy, in ath12k_mac_op_set_key()
5647 ahvif->link[link_id]); in ath12k_mac_op_set_key()
5648 arsta = wiphy_dereference(hw->wiphy, in ath12k_mac_op_set_key()
5649 ahsta->link[link_id]); in ath12k_mac_op_set_key()
5657 ret = ath12k_mac_set_key(arvif->ar, cmd, arvif, in ath12k_mac_op_set_key()
5666 arsta = &ahsta->deflink; in ath12k_mac_op_set_key()
5667 arvif = arsta->arvif; in ath12k_mac_op_set_key()
5669 return -EINVAL; in ath12k_mac_op_set_key()
5671 ret = ath12k_mac_set_key(arvif->ar, cmd, arvif, arsta, key); in ath12k_mac_op_set_key()
5678 if (key->link_id >= 0 && key->link_id < IEEE80211_MLD_MAX_NUM_LINKS) { in ath12k_mac_op_set_key()
5679 link_id = key->link_id; in ath12k_mac_op_set_key()
5680 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); in ath12k_mac_op_set_key()
5683 arvif = &ahvif->deflink; in ath12k_mac_op_set_key()
5686 if (!arvif || !arvif->is_created) { in ath12k_mac_op_set_key()
5689 return -ENOSPC; in ath12k_mac_op_set_key()
5698 ret = ath12k_mac_set_key(arvif->ar, cmd, arvif, NULL, key); in ath12k_mac_op_set_key()
5713 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) in ath12k_mac_bitrate_mask_num_vht_rates()
5714 num_rates += hweight16(mask->control[band].vht_mcs[i]); in ath12k_mac_bitrate_mask_num_vht_rates()
5727 for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) in ath12k_mac_bitrate_mask_num_he_rates()
5728 num_rates += hweight16(mask->control[band].he_mcs[i]); in ath12k_mac_bitrate_mask_num_he_rates()
5739 struct ath12k *ar = arvif->ar; in ath12k_mac_set_peer_vht_fixed_rate()
5744 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_set_peer_vht_fixed_rate()
5748 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) { in ath12k_mac_set_peer_vht_fixed_rate()
5749 if (hweight16(mask->control[band].vht_mcs[i]) == 1) { in ath12k_mac_set_peer_vht_fixed_rate()
5751 vht_rate = ffs(mask->control[band].vht_mcs[i]) - 1; in ath12k_mac_set_peer_vht_fixed_rate()
5756 ath12k_warn(ar->ab, "No single VHT Fixed rate found to set for %pM", in ath12k_mac_set_peer_vht_fixed_rate()
5757 arsta->addr); in ath12k_mac_set_peer_vht_fixed_rate()
5758 return -EINVAL; in ath12k_mac_set_peer_vht_fixed_rate()
5761 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_set_peer_vht_fixed_rate()
5763 arsta->addr); in ath12k_mac_set_peer_vht_fixed_rate()
5765 rate_code = ATH12K_HW_RATE_CODE(vht_rate, nss - 1, in ath12k_mac_set_peer_vht_fixed_rate()
5767 ret = ath12k_wmi_set_peer_param(ar, arsta->addr, in ath12k_mac_set_peer_vht_fixed_rate()
5768 arvif->vdev_id, in ath12k_mac_set_peer_vht_fixed_rate()
5772 ath12k_warn(ar->ab, in ath12k_mac_set_peer_vht_fixed_rate()
5774 arsta->addr, rate_code, ret); in ath12k_mac_set_peer_vht_fixed_rate()
5785 struct ath12k *ar = arvif->ar; in ath12k_mac_set_peer_he_fixed_rate()
5789 struct ath12k_sta *ahsta = arsta->ahsta; in ath12k_mac_set_peer_he_fixed_rate()
5792 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_set_peer_he_fixed_rate()
5797 for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) { in ath12k_mac_set_peer_he_fixed_rate()
5798 if (hweight16(mask->control[band].he_mcs[i]) == 1) { in ath12k_mac_set_peer_he_fixed_rate()
5800 he_rate = ffs(mask->control[band].he_mcs[i]) - 1; in ath12k_mac_set_peer_he_fixed_rate()
5805 ath12k_warn(ar->ab, "No single HE Fixed rate found to set for %pM", in ath12k_mac_set_peer_he_fixed_rate()
5806 arsta->addr); in ath12k_mac_set_peer_he_fixed_rate()
5807 return -EINVAL; in ath12k_mac_set_peer_he_fixed_rate()
5811 if (nss > sta->deflink.rx_nss) in ath12k_mac_set_peer_he_fixed_rate()
5812 return -EINVAL; in ath12k_mac_set_peer_he_fixed_rate()
5814 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_set_peer_he_fixed_rate()
5816 arsta->addr); in ath12k_mac_set_peer_he_fixed_rate()
5818 rate_code = ATH12K_HW_RATE_CODE(he_rate, nss - 1, in ath12k_mac_set_peer_he_fixed_rate()
5821 ret = ath12k_wmi_set_peer_param(ar, arsta->addr, in ath12k_mac_set_peer_he_fixed_rate()
5822 arvif->vdev_id, in ath12k_mac_set_peer_he_fixed_rate()
5826 ath12k_warn(ar->ab, in ath12k_mac_set_peer_he_fixed_rate()
5828 arsta->addr, rate_code, ret); in ath12k_mac_set_peer_he_fixed_rate()
5838 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); in ath12k_mac_station_assoc()
5839 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); in ath12k_mac_station_assoc()
5846 u8 link_id = arvif->link_id; in ath12k_mac_station_assoc()
5848 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_station_assoc()
5850 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) in ath12k_mac_station_assoc()
5851 return -EPERM; in ath12k_mac_station_assoc()
5853 if (WARN_ON(!rcu_access_pointer(sta->link[link_id]))) in ath12k_mac_station_assoc()
5854 return -EINVAL; in ath12k_mac_station_assoc()
5856 band = def.chan->band; in ath12k_mac_station_assoc()
5857 mask = &arvif->bitrate_mask; in ath12k_mac_station_assoc()
5862 return -ENOMEM; in ath12k_mac_station_assoc()
5866 if (peer_arg->peer_nss < 1) { in ath12k_mac_station_assoc()
5867 ath12k_warn(ar->ab, in ath12k_mac_station_assoc()
5868 "invalid peer NSS %d\n", peer_arg->peer_nss); in ath12k_mac_station_assoc()
5869 return -EINVAL; in ath12k_mac_station_assoc()
5872 peer_arg->is_assoc = true; in ath12k_mac_station_assoc()
5875 ath12k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n", in ath12k_mac_station_assoc()
5876 arsta->addr, arvif->vdev_id, ret); in ath12k_mac_station_assoc()
5880 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) { in ath12k_mac_station_assoc()
5881 ath12k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n", in ath12k_mac_station_assoc()
5882 arsta->addr, arvif->vdev_id); in ath12k_mac_station_assoc()
5883 return -ETIMEDOUT; in ath12k_mac_station_assoc()
5896 ath12k_warn(ar->ab, "unable to access link sta in station assoc\n"); in ath12k_mac_station_assoc()
5897 return -EINVAL; in ath12k_mac_station_assoc()
5900 spin_lock_bh(&ar->data_lock); in ath12k_mac_station_assoc()
5901 arsta->bw = ath12k_mac_ieee80211_sta_bw_to_wmi(ar, link_sta); in ath12k_mac_station_assoc()
5902 arsta->bw_prev = link_sta->bandwidth; in ath12k_mac_station_assoc()
5903 spin_unlock_bh(&ar->data_lock); in ath12k_mac_station_assoc()
5905 if (link_sta->vht_cap.vht_supported && num_vht_rates == 1) { in ath12k_mac_station_assoc()
5907 } else if (link_sta->he_cap.has_he && num_he_rates == 1) { in ath12k_mac_station_assoc()
5913 /* Re-assoc is run only to update supported rates for given station. It in ath12k_mac_station_assoc()
5919 ret = ath12k_setup_peer_smps(ar, arvif, arsta->addr, in ath12k_mac_station_assoc()
5920 &link_sta->ht_cap, &link_sta->he_6ghz_capa); in ath12k_mac_station_assoc()
5922 ath12k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n", in ath12k_mac_station_assoc()
5923 arvif->vdev_id, ret); in ath12k_mac_station_assoc()
5927 if (!sta->wme) { in ath12k_mac_station_assoc()
5928 arvif->num_legacy_stations++; in ath12k_mac_station_assoc()
5934 if (sta->wme && sta->uapsd_queues) { in ath12k_mac_station_assoc()
5937 ath12k_warn(ar->ab, "failed to set qos params for STA %pM for vdev %i: %d\n", in ath12k_mac_station_assoc()
5938 arsta->addr, arvif->vdev_id, ret); in ath12k_mac_station_assoc()
5950 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); in ath12k_mac_station_disassoc()
5952 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_station_disassoc()
5954 if (!sta->wme) { in ath12k_mac_station_disassoc()
5955 arvif->num_legacy_stations--; in ath12k_mac_station_disassoc()
5983 sta = ath12k_ahsta_to_sta(arsta->ahsta); in ath12k_sta_rc_update_wk()
5984 arvif = arsta->arvif; in ath12k_sta_rc_update_wk()
5985 vif = ath12k_ahvif_to_vif(arvif->ahvif); in ath12k_sta_rc_update_wk()
5986 ar = arvif->ar; in ath12k_sta_rc_update_wk()
5988 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) in ath12k_sta_rc_update_wk()
5991 band = def.chan->band; in ath12k_sta_rc_update_wk()
5992 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs; in ath12k_sta_rc_update_wk()
5993 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs; in ath12k_sta_rc_update_wk()
5994 he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs; in ath12k_sta_rc_update_wk()
5996 spin_lock_bh(&ar->data_lock); in ath12k_sta_rc_update_wk()
5998 changed = arsta->changed; in ath12k_sta_rc_update_wk()
5999 arsta->changed = 0; in ath12k_sta_rc_update_wk()
6001 bw = arsta->bw; in ath12k_sta_rc_update_wk()
6002 bw_prev = arsta->bw_prev; in ath12k_sta_rc_update_wk()
6003 nss = arsta->nss; in ath12k_sta_rc_update_wk()
6004 smps = arsta->smps; in ath12k_sta_rc_update_wk()
6006 spin_unlock_bh(&ar->data_lock); in ath12k_sta_rc_update_wk()
6021 peer_phymode = peer_arg->peer_phymode; in ath12k_sta_rc_update_wk()
6029 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac bandwidth upgrade for sta %pM new %d old %d\n", in ath12k_sta_rc_update_wk()
6030 arsta->addr, bw, bw_prev); in ath12k_sta_rc_update_wk()
6031 err = ath12k_wmi_set_peer_param(ar, arsta->addr, in ath12k_sta_rc_update_wk()
6032 arvif->vdev_id, WMI_PEER_PHYMODE, in ath12k_sta_rc_update_wk()
6035 ath12k_warn(ar->ab, "failed to update STA %pM to peer phymode %d: %d\n", in ath12k_sta_rc_update_wk()
6036 arsta->addr, peer_phymode, err); in ath12k_sta_rc_update_wk()
6039 err = ath12k_wmi_set_peer_param(ar, arsta->addr, in ath12k_sta_rc_update_wk()
6040 arvif->vdev_id, WMI_PEER_CHWIDTH, in ath12k_sta_rc_update_wk()
6043 ath12k_warn(ar->ab, "failed to update STA %pM to peer bandwidth %d: %d\n", in ath12k_sta_rc_update_wk()
6044 arsta->addr, bw, err); in ath12k_sta_rc_update_wk()
6050 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac bandwidth downgrade for sta %pM new %d old %d\n", in ath12k_sta_rc_update_wk()
6051 arsta->addr, bw, bw_prev); in ath12k_sta_rc_update_wk()
6052 err = ath12k_wmi_set_peer_param(ar, arsta->addr, in ath12k_sta_rc_update_wk()
6053 arvif->vdev_id, WMI_PEER_CHWIDTH, in ath12k_sta_rc_update_wk()
6056 ath12k_warn(ar->ab, "failed to update STA %pM peer to bandwidth %d: %d\n", in ath12k_sta_rc_update_wk()
6057 arsta->addr, bw, err); in ath12k_sta_rc_update_wk()
6060 err = ath12k_wmi_set_peer_param(ar, arsta->addr, in ath12k_sta_rc_update_wk()
6061 arvif->vdev_id, WMI_PEER_PHYMODE, in ath12k_sta_rc_update_wk()
6064 ath12k_warn(ar->ab, "failed to update STA %pM to peer phymode %d: %d\n", in ath12k_sta_rc_update_wk()
6065 arsta->addr, peer_phymode, err); in ath12k_sta_rc_update_wk()
6070 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac update sta %pM nss %d\n", in ath12k_sta_rc_update_wk()
6071 arsta->addr, nss); in ath12k_sta_rc_update_wk()
6073 err = ath12k_wmi_set_peer_param(ar, arsta->addr, arvif->vdev_id, in ath12k_sta_rc_update_wk()
6076 ath12k_warn(ar->ab, "failed to update STA %pM nss %d: %d\n", in ath12k_sta_rc_update_wk()
6077 arsta->addr, nss, err); in ath12k_sta_rc_update_wk()
6081 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac update sta %pM smps %d\n", in ath12k_sta_rc_update_wk()
6082 arsta->addr, smps); in ath12k_sta_rc_update_wk()
6084 err = ath12k_wmi_set_peer_param(ar, arsta->addr, arvif->vdev_id, in ath12k_sta_rc_update_wk()
6087 ath12k_warn(ar->ab, "failed to update STA %pM smps %d: %d\n", in ath12k_sta_rc_update_wk()
6088 arsta->addr, smps, err); in ath12k_sta_rc_update_wk()
6092 mask = &arvif->bitrate_mask; in ath12k_sta_rc_update_wk()
6102 * But, Single rate in VHT mask can be set as per-peer in ath12k_sta_rc_update_wk()
6105 * when per-peer Fixed rate is set. in ath12k_sta_rc_update_wk()
6111 ath12k_warn(ar->ab, "unable to access link sta in peer assoc he for sta %pM link %u\n", in ath12k_sta_rc_update_wk()
6112 sta->addr, arsta->link_id); in ath12k_sta_rc_update_wk()
6116 if (link_sta->vht_cap.vht_supported && num_vht_rates == 1) { in ath12k_sta_rc_update_wk()
6119 } else if (link_sta->he_cap.has_he && num_he_rates == 1) { in ath12k_sta_rc_update_wk()
6122 /* If the peer is non-VHT/HE or no fixed VHT/HE rate in ath12k_sta_rc_update_wk()
6128 err = ath12k_wmi_set_peer_param(ar, arsta->addr, in ath12k_sta_rc_update_wk()
6129 arvif->vdev_id, in ath12k_sta_rc_update_wk()
6133 ath12k_warn(ar->ab, in ath12k_sta_rc_update_wk()
6135 arsta->addr, err); in ath12k_sta_rc_update_wk()
6140 peer_arg->is_assoc = false; in ath12k_sta_rc_update_wk()
6143 ath12k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n", in ath12k_sta_rc_update_wk()
6144 arsta->addr, arvif->vdev_id, err); in ath12k_sta_rc_update_wk()
6146 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) in ath12k_sta_rc_update_wk()
6147 ath12k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n", in ath12k_sta_rc_update_wk()
6148 arsta->addr, arvif->vdev_id); in ath12k_sta_rc_update_wk()
6159 lockdep_assert_wiphy(ah->hw->wiphy); in ath12k_mac_free_unassign_link_sta()
6164 arsta = wiphy_dereference(ah->hw->wiphy, ahsta->link[link_id]); in ath12k_mac_free_unassign_link_sta()
6168 ahsta->links_map &= ~BIT(link_id); in ath12k_mac_free_unassign_link_sta()
6169 rcu_assign_pointer(ahsta->link[link_id], NULL); in ath12k_mac_free_unassign_link_sta()
6172 if (arsta == &ahsta->deflink) { in ath12k_mac_free_unassign_link_sta()
6173 arsta->link_id = ATH12K_INVALID_LINK_ID; in ath12k_mac_free_unassign_link_sta()
6174 arsta->ahsta = NULL; in ath12k_mac_free_unassign_link_sta()
6175 arsta->arvif = NULL; in ath12k_mac_free_unassign_link_sta()
6185 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); in ath12k_mac_inc_num_stations()
6186 struct ath12k *ar = arvif->ar; in ath12k_mac_inc_num_stations()
6188 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_inc_num_stations()
6190 if (arvif->ahvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls) in ath12k_mac_inc_num_stations()
6193 if (ar->num_stations >= ar->max_num_stations) in ath12k_mac_inc_num_stations()
6194 return -ENOBUFS; in ath12k_mac_inc_num_stations()
6196 ar->num_stations++; in ath12k_mac_inc_num_stations()
6197 arvif->num_stations++; in ath12k_mac_inc_num_stations()
6199 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_inc_num_stations()
6201 arsta->addr, arvif->vdev_id, arvif->num_stations); in ath12k_mac_inc_num_stations()
6209 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); in ath12k_mac_dec_num_stations()
6210 struct ath12k *ar = arvif->ar; in ath12k_mac_dec_num_stations()
6212 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_dec_num_stations()
6214 if (arvif->ahvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls) in ath12k_mac_dec_num_stations()
6217 ar->num_stations--; in ath12k_mac_dec_num_stations()
6219 if (arvif->num_stations) { in ath12k_mac_dec_num_stations()
6220 arvif->num_stations--; in ath12k_mac_dec_num_stations()
6221 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_dec_num_stations()
6223 arsta->addr, arvif->vdev_id, arvif->num_stations); in ath12k_mac_dec_num_stations()
6225 ath12k_warn(ar->ab, in ath12k_mac_dec_num_stations()
6227 arsta->addr, arvif->vdev_id); in ath12k_mac_dec_num_stations()
6235 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); in ath12k_mac_station_post_remove()
6236 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); in ath12k_mac_station_post_remove()
6239 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_station_post_remove()
6243 spin_lock_bh(&ar->ab->base_lock); in ath12k_mac_station_post_remove()
6245 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arsta->addr); in ath12k_mac_station_post_remove()
6246 if (peer && peer->sta == sta) { in ath12k_mac_station_post_remove()
6247 ath12k_warn(ar->ab, "Found peer entry %pM n vdev %i after it was supposedly removed\n", in ath12k_mac_station_post_remove()
6248 vif->addr, arvif->vdev_id); in ath12k_mac_station_post_remove()
6249 peer->sta = NULL; in ath12k_mac_station_post_remove()
6250 list_del(&peer->list); in ath12k_mac_station_post_remove()
6252 ar->num_peers--; in ath12k_mac_station_post_remove()
6255 spin_unlock_bh(&ar->ab->base_lock); in ath12k_mac_station_post_remove()
6257 kfree(arsta->rx_stats); in ath12k_mac_station_post_remove()
6258 arsta->rx_stats = NULL; in ath12k_mac_station_post_remove()
6268 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_station_unauthorize()
6270 spin_lock_bh(&ar->ab->base_lock); in ath12k_mac_station_unauthorize()
6272 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arsta->addr); in ath12k_mac_station_unauthorize()
6274 peer->is_authorized = false; in ath12k_mac_station_unauthorize()
6276 spin_unlock_bh(&ar->ab->base_lock); in ath12k_mac_station_unauthorize()
6284 ret = ath12k_clear_peer_keys(arvif, arsta->addr); in ath12k_mac_station_unauthorize()
6286 ath12k_warn(ar->ab, "failed to clear all peer keys for vdev %i: %d\n", in ath12k_mac_station_unauthorize()
6287 arvif->vdev_id, ret); in ath12k_mac_station_unauthorize()
6299 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); in ath12k_mac_station_authorize()
6302 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_station_authorize()
6304 spin_lock_bh(&ar->ab->base_lock); in ath12k_mac_station_authorize()
6306 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arsta->addr); in ath12k_mac_station_authorize()
6308 peer->is_authorized = true; in ath12k_mac_station_authorize()
6310 spin_unlock_bh(&ar->ab->base_lock); in ath12k_mac_station_authorize()
6312 if (vif->type == NL80211_IFTYPE_STATION && arvif->is_up) { in ath12k_mac_station_authorize()
6313 ret = ath12k_wmi_set_peer_param(ar, arsta->addr, in ath12k_mac_station_authorize()
6314 arvif->vdev_id, in ath12k_mac_station_authorize()
6318 ath12k_warn(ar->ab, "Unable to authorize peer %pM vdev %d: %d\n", in ath12k_mac_station_authorize()
6319 arsta->addr, arvif->vdev_id, ret); in ath12k_mac_station_authorize()
6331 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); in ath12k_mac_station_remove()
6332 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_mac_station_remove()
6335 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_station_remove()
6337 wiphy_work_cancel(ar->ah->hw->wiphy, &arsta->update_wk); in ath12k_mac_station_remove()
6339 if (ahvif->vdev_type == WMI_VDEV_TYPE_STA) { in ath12k_mac_station_remove()
6343 ath12k_warn(ar->ab, "failed to stop vdev %i: %d\n", in ath12k_mac_station_remove()
6344 arvif->vdev_id, ret); in ath12k_mac_station_remove()
6347 if (sta->mlo) in ath12k_mac_station_remove()
6350 ath12k_dp_peer_cleanup(ar, arvif->vdev_id, arsta->addr); in ath12k_mac_station_remove()
6352 ret = ath12k_peer_delete(ar, arvif->vdev_id, arsta->addr); in ath12k_mac_station_remove()
6354 ath12k_warn(ar->ab, "Failed to delete peer: %pM for VDEV: %d\n", in ath12k_mac_station_remove()
6355 arsta->addr, arvif->vdev_id); in ath12k_mac_station_remove()
6357 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "Removed peer: %pM for VDEV: %d\n", in ath12k_mac_station_remove()
6358 arsta->addr, arvif->vdev_id); in ath12k_mac_station_remove()
6362 if (sta->valid_links) in ath12k_mac_station_remove()
6363 ath12k_mac_free_unassign_link_sta(ahvif->ah, in ath12k_mac_station_remove()
6364 arsta->ahsta, arsta->link_id); in ath12k_mac_station_remove()
6373 struct ath12k_base *ab = ar->ab; in ath12k_mac_station_add()
6374 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); in ath12k_mac_station_add()
6375 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); in ath12k_mac_station_add()
6379 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_station_add()
6384 ar->max_num_stations); in ath12k_mac_station_add()
6388 if (ath12k_debugfs_is_extd_rx_stats_enabled(ar) && !arsta->rx_stats) { in ath12k_mac_station_add()
6389 arsta->rx_stats = kzalloc(sizeof(*arsta->rx_stats), GFP_KERNEL); in ath12k_mac_station_add()
6390 if (!arsta->rx_stats) { in ath12k_mac_station_add()
6391 ret = -ENOMEM; in ath12k_mac_station_add()
6396 peer_param.vdev_id = arvif->vdev_id; in ath12k_mac_station_add()
6397 peer_param.peer_addr = arsta->addr; in ath12k_mac_station_add()
6399 peer_param.ml_enabled = sta->mlo; in ath12k_mac_station_add()
6404 arsta->addr, arvif->vdev_id); in ath12k_mac_station_add()
6409 arsta->addr, arvif->vdev_id); in ath12k_mac_station_add()
6412 ret = ath12k_wmi_set_peer_param(ar, arsta->addr, in ath12k_mac_station_add()
6413 arvif->vdev_id, in ath12k_mac_station_add()
6417 arsta->addr, ret); in ath12k_mac_station_add()
6422 ret = ath12k_dp_peer_setup(ar, arvif->vdev_id, arsta->addr); in ath12k_mac_station_add()
6425 arsta->addr, arvif->vdev_id, ret); in ath12k_mac_station_add()
6429 if (ab->hw_params->vdev_start_delay && in ath12k_mac_station_add()
6430 !arvif->is_started && in ath12k_mac_station_add()
6431 arvif->ahvif->vdev_type != WMI_VDEV_TYPE_AP) { in ath12k_mac_station_add()
6439 ewma_avg_rssi_init(&arsta->avg_rssi); in ath12k_mac_station_add()
6443 ath12k_peer_delete(ar, arvif->vdev_id, arsta->addr); in ath12k_mac_station_add()
6444 kfree(arsta->rx_stats); in ath12k_mac_station_add()
6445 arsta->rx_stats = NULL; in ath12k_mac_station_add()
6462 lockdep_assert_wiphy(ah->hw->wiphy); in ath12k_mac_assign_link_sta()
6465 return -EINVAL; in ath12k_mac_assign_link_sta()
6467 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]); in ath12k_mac_assign_link_sta()
6469 return -EINVAL; in ath12k_mac_assign_link_sta()
6473 link_sta = wiphy_dereference(ah->hw->wiphy, sta->link[link_id]); in ath12k_mac_assign_link_sta()
6475 return -EINVAL; in ath12k_mac_assign_link_sta()
6477 ether_addr_copy(arsta->addr, link_sta->addr); in ath12k_mac_assign_link_sta()
6480 arsta->link_idx = ahsta->num_peer++; in ath12k_mac_assign_link_sta()
6482 arsta->link_id = link_id; in ath12k_mac_assign_link_sta()
6483 ahsta->links_map |= BIT(arsta->link_id); in ath12k_mac_assign_link_sta()
6484 arsta->arvif = arvif; in ath12k_mac_assign_link_sta()
6485 arsta->ahsta = ahsta; in ath12k_mac_assign_link_sta()
6486 ahsta->ahvif = ahvif; in ath12k_mac_assign_link_sta()
6488 wiphy_work_init(&arsta->update_wk, ath12k_sta_rc_update_wk); in ath12k_mac_assign_link_sta()
6490 rcu_assign_pointer(ahsta->link[link_id], arsta); in ath12k_mac_assign_link_sta()
6499 struct ath12k_hw *ah = ahvif->ah; in ath12k_mac_ml_station_remove()
6506 lockdep_assert_wiphy(ah->hw->wiphy); in ath12k_mac_ml_station_remove()
6511 links = ahsta->links_map; in ath12k_mac_ml_station_remove()
6513 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]); in ath12k_mac_ml_station_remove()
6514 arsta = wiphy_dereference(ah->hw->wiphy, ahsta->link[link_id]); in ath12k_mac_ml_station_remove()
6518 ar = arvif->ar; in ath12k_mac_ml_station_remove()
6534 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); in ath12k_mac_handle_link_sta_state()
6536 struct ath12k *ar = arvif->ar; in ath12k_mac_handle_link_sta_state()
6538 struct ath12k_base *ab = ar->ab; in ath12k_mac_handle_link_sta_state()
6541 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_handle_link_sta_state()
6543 ath12k_dbg(ab, ATH12K_DBG_MAC, "mac handle link %u sta %pM state %d -> %d\n", in ath12k_mac_handle_link_sta_state()
6544 arsta->link_id, arsta->addr, old_state, new_state); in ath12k_mac_handle_link_sta_state()
6546 /* IEEE80211_STA_NONE -> IEEE80211_STA_NOTEXIST: Remove the station in ath12k_mac_handle_link_sta_state()
6554 arsta->addr, arvif->vdev_id); in ath12k_mac_handle_link_sta_state()
6559 /* IEEE80211_STA_NOTEXIST -> IEEE80211_STA_NONE: Add new station to driver */ in ath12k_mac_handle_link_sta_state()
6565 arsta->addr, arvif->vdev_id); in ath12k_mac_handle_link_sta_state()
6567 /* IEEE80211_STA_AUTH -> IEEE80211_STA_ASSOC: Send station assoc command for in ath12k_mac_handle_link_sta_state()
6572 (vif->type == NL80211_IFTYPE_AP || in ath12k_mac_handle_link_sta_state()
6573 vif->type == NL80211_IFTYPE_MESH_POINT || in ath12k_mac_handle_link_sta_state()
6574 vif->type == NL80211_IFTYPE_ADHOC)) { in ath12k_mac_handle_link_sta_state()
6578 arsta->addr); in ath12k_mac_handle_link_sta_state()
6580 /* IEEE80211_STA_ASSOC -> IEEE80211_STA_AUTHORIZED: set peer status as in ath12k_mac_handle_link_sta_state()
6588 arsta->addr); in ath12k_mac_handle_link_sta_state()
6593 arvif->ahvif->vdev_type == WMI_VDEV_TYPE_STA) { in ath12k_mac_handle_link_sta_state()
6595 reg_info = ab->reg_info[ar->pdev_idx]; in ath12k_mac_handle_link_sta_state()
6597 ath12k_hw_to_ah(hw)->regd_updated = false; in ath12k_mac_handle_link_sta_state()
6598 ath12k_reg_handle_chan_list(ab, reg_info, arvif->ahvif->vdev_type, in ath12k_mac_handle_link_sta_state()
6599 link_conf->power_type); in ath12k_mac_handle_link_sta_state()
6602 /* IEEE80211_STA_AUTHORIZED -> IEEE80211_STA_ASSOC: station may be in removal, in ath12k_mac_handle_link_sta_state()
6609 /* IEEE80211_STA_ASSOC -> IEEE80211_STA_AUTH: disassoc peer connected to in ath12k_mac_handle_link_sta_state()
6614 (vif->type == NL80211_IFTYPE_AP || in ath12k_mac_handle_link_sta_state()
6615 vif->type == NL80211_IFTYPE_MESH_POINT || in ath12k_mac_handle_link_sta_state()
6616 vif->type == NL80211_IFTYPE_ADHOC)) { in ath12k_mac_handle_link_sta_state()
6620 arsta->addr); in ath12k_mac_handle_link_sta_state()
6628 u32 freq, u8 mac_id) in ath12k_mac_is_freq_on_mac() argument
6630 return (freq >= freq_range[mac_id].low_2ghz_freq && in ath12k_mac_is_freq_on_mac()
6631 freq <= freq_range[mac_id].high_2ghz_freq) || in ath12k_mac_is_freq_on_mac()
6632 (freq >= freq_range[mac_id].low_5ghz_freq && in ath12k_mac_is_freq_on_mac()
6633 freq <= freq_range[mac_id].high_5ghz_freq); in ath12k_mac_is_freq_on_mac()
6655 ab->wmi_ab.svc_map) && in ath12k_mac_is_hw_dbs_capable()
6656 ab->wmi_ab.hw_mode_info.support_dbs; in ath12k_mac_is_hw_dbs_capable()
6667 freq_range = ab->wmi_ab.hw_mode_info.freq_range_caps[ATH12K_HW_MODE_DBS]; in ath12k_mac_2_freq_same_mac_in_dbs()
6675 ab->wmi_ab.svc_map) && in ath12k_mac_is_hw_sbs_capable()
6676 ab->wmi_ab.hw_mode_info.support_sbs; in ath12k_mac_is_hw_sbs_capable()
6682 struct ath12k_hw_mode_info *info = &ab->wmi_ab.hw_mode_info; in ath12k_mac_2_freq_same_mac_in_sbs()
6690 if (ab->wmi_ab.sbs_lower_band_end_freq) { in ath12k_mac_2_freq_same_mac_in_sbs()
6691 sbs_uppr_share = info->freq_range_caps[ATH12K_HW_MODE_SBS_UPPER_SHARE]; in ath12k_mac_2_freq_same_mac_in_sbs()
6692 sbs_low_share = info->freq_range_caps[ATH12K_HW_MODE_SBS_LOWER_SHARE]; in ath12k_mac_2_freq_same_mac_in_sbs()
6700 sbs_range = info->freq_range_caps[ATH12K_HW_MODE_SBS]; in ath12k_mac_2_freq_same_mac_in_sbs()
6734 return -EINVAL; in ath12k_mac_mlo_sta_set_link_active()
6754 return -EINVAL; in ath12k_mac_mlo_sta_set_link_active()
6772 param.link_num[0].num_of_link = num_mlo_vdev - 1; in ath12k_mac_mlo_sta_set_link_active()
6784 unsigned long links = ahvif->links_map; in ath12k_mac_mlo_sta_update_link_active()
6794 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); in ath12k_mac_mlo_sta_update_link_active()
6796 if (!arvif || !arvif->is_created || arvif->ar->ab != ab) in ath12k_mac_mlo_sta_update_link_active()
6800 conf = wiphy_dereference(hw->wiphy, info->chanctx_conf); in ath12k_mac_mlo_sta_update_link_active()
6801 mlo_freq_list[num_mlo_vdev] = conf->def.chan->center_freq; in ath12k_mac_mlo_sta_update_link_active()
6803 mlo_vdev_id_lst[num_mlo_vdev] = arvif->vdev_id; in ath12k_mac_mlo_sta_update_link_active()
6812 return -EINVAL; in ath12k_mac_mlo_sta_update_link_active()
6880 sta = ieee80211_find_sta(vif, vif->cfg.ap_addr); in ath12k_mac_select_links()
6883 ath12k_warn(ab, "failed to find sta with addr %pM\n", vif->cfg.ap_addr); in ath12k_mac_select_links()
6884 return -EINVAL; in ath12k_mac_select_links()
6888 assoc_arvif = wiphy_dereference(hw->wiphy, ahvif->link[ahsta->assoc_link_id]); in ath12k_mac_select_links()
6890 chanctx = rcu_dereference(info->chanctx_conf); in ath12k_mac_select_links()
6891 assoc_link_freq = chanctx->def.chan->center_freq; in ath12k_mac_select_links()
6893 ath12k_dbg(ab, ATH12K_DBG_MAC, "assoc link %u freq %u\n", in ath12k_mac_select_links()
6894 assoc_arvif->link_id, assoc_link_freq); in ath12k_mac_select_links()
6899 useful_links &= ~BIT(assoc_arvif->link_id); in ath12k_mac_select_links()
6901 info = wiphy_dereference(hw->wiphy, vif->link_conf[link_id]); in ath12k_mac_select_links()
6905 return -ENOLINK; in ath12k_mac_select_links()
6908 chan = info->chanreq.oper.chan; in ath12k_mac_select_links()
6911 return -EINVAL; in ath12k_mac_select_links()
6914 partner_freq = chan->center_freq; in ath12k_mac_select_links()
6917 ath12k_dbg(ab, ATH12K_DBG_MAC, "new SBS link %u freq %u\n", in ath12k_mac_select_links()
6924 ath12k_dbg(ab, ATH12K_DBG_MAC, "new DBS link %u freq %u\n", in ath12k_mac_select_links()
6929 ath12k_dbg(ab, ATH12K_DBG_MAC, "non DBS/SBS link %u freq %u\n", in ath12k_mac_select_links()
6939 link_id = ffs(useful_links) - 1; in ath12k_mac_select_links()
6943 *selected_links = BIT(assoc_arvif->link_id) | BIT(link_id); in ath12k_mac_select_links()
6966 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_sta_state()
6968 if (ieee80211_vif_is_mld(vif) && sta->valid_links) { in ath12k_mac_op_sta_state()
6969 WARN_ON(!sta->mlo && hweight16(sta->valid_links) != 1); in ath12k_mac_op_sta_state()
6970 link_id = ffs(sta->valid_links) - 1; in ath12k_mac_op_sta_state()
6973 /* IEEE80211_STA_NOTEXIST -> IEEE80211_STA_NONE: in ath12k_mac_op_sta_state()
6975 * ahsta->links_map will be zero and sta->valid_links will be 1. in ath12k_mac_op_sta_state()
6982 arsta = &ahsta->deflink; in ath12k_mac_op_sta_state()
6985 if (sta->mlo && !ahsta->links_map && in ath12k_mac_op_sta_state()
6986 (hweight16(sta->valid_links) == 1)) { in ath12k_mac_op_sta_state()
6990 sta->addr); in ath12k_mac_op_sta_state()
6999 link_id, sta->addr); in ath12k_mac_op_sta_state()
7006 if (sta->mlo) { in ath12k_mac_op_sta_state()
7007 /* For station mode, arvif->is_sta_assoc_link has been set when in ath12k_mac_op_sta_state()
7010 if (vif->type == NL80211_IFTYPE_STATION && in ath12k_mac_op_sta_state()
7011 !arsta->arvif->is_sta_assoc_link) { in ath12k_mac_op_sta_state()
7014 ret = -EINVAL; in ath12k_mac_op_sta_state()
7018 arsta->is_assoc_link = true; in ath12k_mac_op_sta_state()
7019 ahsta->assoc_link_id = link_id; in ath12k_mac_op_sta_state()
7032 if (ieee80211_vif_is_mld(vif) && vif->type == NL80211_IFTYPE_STATION && in ath12k_mac_op_sta_state()
7037 ab = ah->radio[0].ab; in ath12k_mac_op_sta_state()
7038 if (ab->ag->num_devices == 1) { in ath12k_mac_op_sta_state()
7053 valid_links = ahsta->links_map; in ath12k_mac_op_sta_state()
7055 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); in ath12k_mac_op_sta_state()
7056 arsta = wiphy_dereference(hw->wiphy, ahsta->link[link_id]); in ath12k_mac_op_sta_state()
7062 if (WARN_ON(!arvif->ar)) in ath12k_mac_op_sta_state()
7069 link_id, arsta->addr, old_state, new_state); in ath12k_mac_op_sta_state()
7074 if (ieee80211_vif_is_mld(vif) && vif->type == NL80211_IFTYPE_STATION && in ath12k_mac_op_sta_state()
7077 ab = ar->ab; in ath12k_mac_op_sta_state()
7092 /* IEEE80211_STA_NONE -> IEEE80211_STA_NOTEXIST: in ath12k_mac_op_sta_state()
7098 new_state == IEEE80211_STA_NOTEXIST && sta->mlo) in ath12k_mac_op_sta_state()
7106 ahsta->state = new_state; in ath12k_mac_op_sta_state()
7124 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_sta_set_txpwr()
7129 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); in ath12k_mac_op_sta_set_txpwr()
7130 arsta = wiphy_dereference(hw->wiphy, ahsta->link[link_id]); in ath12k_mac_op_sta_set_txpwr()
7132 if (sta->deflink.txpwr.type == NL80211_TX_POWER_AUTOMATIC) { in ath12k_mac_op_sta_set_txpwr()
7135 txpwr = sta->deflink.txpwr.power; in ath12k_mac_op_sta_set_txpwr()
7137 ret = -EINVAL; in ath12k_mac_op_sta_set_txpwr()
7143 ret = -EINVAL; in ath12k_mac_op_sta_set_txpwr()
7147 ar = arvif->ar; in ath12k_mac_op_sta_set_txpwr()
7149 ret = ath12k_wmi_set_peer_param(ar, arsta->addr, arvif->vdev_id, in ath12k_mac_op_sta_set_txpwr()
7152 ath12k_warn(ar->ab, "failed to set tx power for station ret: %d\n", in ath12k_mac_op_sta_set_txpwr()
7166 struct ieee80211_sta *sta = link_sta->sta; in ath12k_mac_op_link_sta_rc_update()
7177 arvif = rcu_dereference(ahvif->link[link_sta->link_id]); in ath12k_mac_op_link_sta_rc_update()
7180 link_sta->link_id, sta->addr); in ath12k_mac_op_link_sta_rc_update()
7185 ar = arvif->ar; in ath12k_mac_op_link_sta_rc_update()
7187 arsta = rcu_dereference(ahsta->link[link_sta->link_id]); in ath12k_mac_op_link_sta_rc_update()
7190 ath12k_warn(ar->ab, "mac sta rc update failed to fetch link sta on link id %u for peer %pM\n", in ath12k_mac_op_link_sta_rc_update()
7191 link_sta->link_id, sta->addr); in ath12k_mac_op_link_sta_rc_update()
7194 spin_lock_bh(&ar->ab->base_lock); in ath12k_mac_op_link_sta_rc_update()
7196 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arsta->addr); in ath12k_mac_op_link_sta_rc_update()
7198 spin_unlock_bh(&ar->ab->base_lock); in ath12k_mac_op_link_sta_rc_update()
7200 ath12k_warn(ar->ab, "mac sta rc update failed to find peer %pM on vdev %i\n", in ath12k_mac_op_link_sta_rc_update()
7201 arsta->addr, arvif->vdev_id); in ath12k_mac_op_link_sta_rc_update()
7205 spin_unlock_bh(&ar->ab->base_lock); in ath12k_mac_op_link_sta_rc_update()
7207 if (arsta->link_id >= IEEE80211_MLD_MAX_NUM_LINKS) { in ath12k_mac_op_link_sta_rc_update()
7212 link_sta = rcu_dereference(sta->link[arsta->link_id]); in ath12k_mac_op_link_sta_rc_update()
7215 ath12k_warn(ar->ab, "unable to access link sta in rc update for sta %pM link %u\n", in ath12k_mac_op_link_sta_rc_update()
7216 sta->addr, arsta->link_id); in ath12k_mac_op_link_sta_rc_update()
7220 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_op_link_sta_rc_update()
7222 arsta->addr, changed, link_sta->bandwidth, link_sta->rx_nss, in ath12k_mac_op_link_sta_rc_update()
7223 link_sta->smps_mode); in ath12k_mac_op_link_sta_rc_update()
7225 spin_lock_bh(&ar->data_lock); in ath12k_mac_op_link_sta_rc_update()
7229 arsta->bw_prev = arsta->bw; in ath12k_mac_op_link_sta_rc_update()
7230 arsta->bw = bw; in ath12k_mac_op_link_sta_rc_update()
7234 arsta->nss = link_sta->rx_nss; in ath12k_mac_op_link_sta_rc_update()
7239 switch (link_sta->smps_mode) { in ath12k_mac_op_link_sta_rc_update()
7251 ath12k_warn(ar->ab, "Invalid smps %d in sta rc update for %pM link %u\n", in ath12k_mac_op_link_sta_rc_update()
7252 link_sta->smps_mode, arsta->addr, link_sta->link_id); in ath12k_mac_op_link_sta_rc_update()
7257 arsta->smps = smps; in ath12k_mac_op_link_sta_rc_update()
7260 arsta->changed |= changed; in ath12k_mac_op_link_sta_rc_update()
7262 spin_unlock_bh(&ar->data_lock); in ath12k_mac_op_link_sta_rc_update()
7264 wiphy_work_queue(hw->wiphy, &arsta->update_wk); in ath12k_mac_op_link_sta_rc_update()
7277 lockdep_assert_wiphy(ah->hw->wiphy); in ath12k_mac_alloc_assign_link_sta()
7282 arsta = wiphy_dereference(ah->hw->wiphy, ahsta->link[link_id]); in ath12k_mac_alloc_assign_link_sta()
7306 struct ath12k_hw *ah = hw->priv; in ath12k_mac_op_change_sta_links()
7314 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_change_sta_links()
7316 if (!sta->valid_links) in ath12k_mac_op_change_sta_links()
7317 return -EINVAL; in ath12k_mac_op_change_sta_links()
7326 if (ahsta->ml_peer_id == ATH12K_MLO_PEER_ID_INVALID) { in ath12k_mac_op_change_sta_links()
7327 ath12k_hw_warn(ah, "unable to add link for ml sta %pM", sta->addr); in ath12k_mac_op_change_sta_links()
7328 return -EINVAL; in ath12k_mac_op_change_sta_links()
7332 if (WARN_ON(ahsta->links_map == 0)) in ath12k_mac_op_change_sta_links()
7333 return -EINVAL; in ath12k_mac_op_change_sta_links()
7337 if (ahsta->links_map & BIT(link_id)) in ath12k_mac_op_change_sta_links()
7340 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); in ath12k_mac_op_change_sta_links()
7348 ar = arvif->ar; in ath12k_mac_op_change_sta_links()
7354 ath12k_warn(ar->ab, "Failed to add station: %pM for VDEV: %d\n", in ath12k_mac_op_change_sta_links()
7355 arsta->addr, arvif->vdev_id); in ath12k_mac_op_change_sta_links()
7376 struct ath12k *ar = arvif->ar; in ath12k_conf_tx_uapsd()
7377 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_conf_tx_uapsd()
7381 if (ahvif->vdev_type != WMI_VDEV_TYPE_STA) in ath12k_conf_tx_uapsd()
7404 ahvif->u.sta.uapsd |= value; in ath12k_conf_tx_uapsd()
7406 ahvif->u.sta.uapsd &= ~value; in ath12k_conf_tx_uapsd()
7408 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath12k_conf_tx_uapsd()
7410 ahvif->u.sta.uapsd); in ath12k_conf_tx_uapsd()
7412 ath12k_warn(ar->ab, "could not set uapsd params %d\n", ret); in ath12k_conf_tx_uapsd()
7416 if (ahvif->u.sta.uapsd) in ath12k_conf_tx_uapsd()
7421 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath12k_conf_tx_uapsd()
7425 ath12k_warn(ar->ab, "could not set rx wake param %d\n", ret); in ath12k_conf_tx_uapsd()
7435 struct ath12k *ar = arvif->ar; in ath12k_mac_conf_tx()
7436 struct ath12k_base *ab = ar->ab; in ath12k_mac_conf_tx()
7439 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_conf_tx()
7443 p = &arvif->wmm_params.ac_vo; in ath12k_mac_conf_tx()
7446 p = &arvif->wmm_params.ac_vi; in ath12k_mac_conf_tx()
7449 p = &arvif->wmm_params.ac_be; in ath12k_mac_conf_tx()
7452 p = &arvif->wmm_params.ac_bk; in ath12k_mac_conf_tx()
7457 ret = -EINVAL; in ath12k_mac_conf_tx()
7461 p->cwmin = params->cw_min; in ath12k_mac_conf_tx()
7462 p->cwmax = params->cw_max; in ath12k_mac_conf_tx()
7463 p->aifs = params->aifs; in ath12k_mac_conf_tx()
7464 p->txop = params->txop; in ath12k_mac_conf_tx()
7466 ret = ath12k_wmi_send_wmm_update_cmd(ar, arvif->vdev_id, in ath12k_mac_conf_tx()
7467 &arvif->wmm_params); in ath12k_mac_conf_tx()
7470 ar->pdev_idx, ret); in ath12k_mac_conf_tx()
7474 ret = ath12k_conf_tx_uapsd(arvif, ac, params->uapsd); in ath12k_mac_conf_tx()
7477 ar->pdev_idx, ret); in ath12k_mac_conf_tx()
7493 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_conf_tx()
7496 return -EINVAL; in ath12k_mac_op_conf_tx()
7498 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); in ath12k_mac_op_conf_tx()
7499 if (!arvif || !arvif->is_created) { in ath12k_mac_op_conf_tx()
7502 return -ENOSPC; in ath12k_mac_op_conf_tx()
7504 cache->tx_conf.changed = true; in ath12k_mac_op_conf_tx()
7505 cache->tx_conf.ac = ac; in ath12k_mac_op_conf_tx()
7506 cache->tx_conf.tx_queue_params = *params; in ath12k_mac_op_conf_tx()
7521 u32 ar_vht_cap = ar->pdev->cap.vht_cap; in ath12k_create_ht_cap()
7572 for (i = 0; i < ar->num_rx_chains; i++) { in ath12k_create_ht_cap()
7585 struct ath12k *ar = arvif->ar; in ath12k_mac_set_txbf_conf()
7586 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_mac_set_txbf_conf()
7589 u32 vht_cap = ar->pdev->cap.vht_cap; in ath12k_mac_set_txbf_conf()
7602 if (sound_dim > (ar->num_tx_chains - 1)) in ath12k_mac_set_txbf_conf()
7603 sound_dim = ar->num_tx_chains - 1; in ath12k_mac_set_txbf_conf()
7614 ahvif->vdev_type == WMI_VDEV_TYPE_AP) in ath12k_mac_set_txbf_conf()
7622 ahvif->vdev_type == WMI_VDEV_TYPE_STA) in ath12k_mac_set_txbf_conf()
7626 return ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_set_txbf_conf()
7638 if (ar->num_tx_chains < 2) { in ath12k_set_vht_txbf_cap()
7660 if (sound_dim > (ar->num_tx_chains - 1)) in ath12k_set_vht_txbf_cap()
7661 sound_dim = ar->num_tx_chains - 1; in ath12k_set_vht_txbf_cap()
7681 vht_cap.cap = ar->pdev->cap.vht_cap; in ath12k_create_vht_cap()
7691 if (i < ar->num_tx_chains && rate_cap_tx_chainmask & BIT(i)) in ath12k_create_vht_cap()
7696 if (i < ar->num_rx_chains && rate_cap_rx_chainmask & BIT(i)) in ath12k_create_vht_cap()
7711 if (ar->pdev->cap.nss_ratio_info == WMI_NSS_RATIO_1_NSS) in ath12k_create_vht_cap()
7726 rate_cap_tx_chainmask = ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift; in ath12k_mac_setup_ht_vht_cap()
7727 rate_cap_rx_chainmask = ar->cfg_rx_chainmask >> cap->rx_chain_mask_shift; in ath12k_mac_setup_ht_vht_cap()
7729 if (cap->supported_bands & WMI_HOST_WLAN_2GHZ_CAP) { in ath12k_mac_setup_ht_vht_cap()
7730 band = &ar->mac.sbands[NL80211_BAND_2GHZ]; in ath12k_mac_setup_ht_vht_cap()
7731 ht_cap = cap->band[NL80211_BAND_2GHZ].ht_cap_info; in ath12k_mac_setup_ht_vht_cap()
7734 band->ht_cap = ath12k_create_ht_cap(ar, ht_cap, in ath12k_mac_setup_ht_vht_cap()
7738 if (cap->supported_bands & WMI_HOST_WLAN_5GHZ_CAP && in ath12k_mac_setup_ht_vht_cap()
7739 (ar->ab->hw_params->single_pdev_only || in ath12k_mac_setup_ht_vht_cap()
7740 !ar->supports_6ghz)) { in ath12k_mac_setup_ht_vht_cap()
7741 band = &ar->mac.sbands[NL80211_BAND_5GHZ]; in ath12k_mac_setup_ht_vht_cap()
7742 ht_cap = cap->band[NL80211_BAND_5GHZ].ht_cap_info; in ath12k_mac_setup_ht_vht_cap()
7745 band->ht_cap = ath12k_create_ht_cap(ar, ht_cap, in ath12k_mac_setup_ht_vht_cap()
7747 band->vht_cap = ath12k_create_vht_cap(ar, rate_cap_tx_chainmask, in ath12k_mac_setup_ht_vht_cap()
7767 he_ppet[0] = fw_ppet->numss_m1 & IEEE80211_PPE_THRES_NSS_MASK; in ath12k_gen_ppe_thresh()
7768 he_ppet[0] |= (fw_ppet->ru_bit_mask << in ath12k_gen_ppe_thresh()
7771 for (nss = 0; nss <= fw_ppet->numss_m1; nss++) { in ath12k_gen_ppe_thresh()
7776 if ((fw_ppet->ru_bit_mask & BIT(ru)) == 0) in ath12k_gen_ppe_thresh()
7778 val = (fw_ppet->ppet16_ppet8_ru3_ru0[nss] >> (ru * 6)) & in ath12k_gen_ppe_thresh()
7781 for (i = 5; i >= 0; i--) { in ath12k_gen_ppe_thresh()
7797 he_cap_elem->mac_cap_info[0] &= ~m; in ath12k_mac_filter_he_cap_mesh()
7802 he_cap_elem->mac_cap_info[2] &= ~m; in ath12k_mac_filter_he_cap_mesh()
7807 he_cap_elem->mac_cap_info[3] &= ~m; in ath12k_mac_filter_he_cap_mesh()
7811 he_cap_elem->mac_cap_info[4] &= ~m; in ath12k_mac_filter_he_cap_mesh()
7817 he_cap_elem->mac_cap_info[5] &= ~m; in ath12k_mac_filter_he_cap_mesh()
7821 he_cap_elem->phy_cap_info[2] &= ~m; in ath12k_mac_filter_he_cap_mesh()
7826 he_cap_elem->phy_cap_info[3] &= ~m; in ath12k_mac_filter_he_cap_mesh()
7829 he_cap_elem->phy_cap_info[4] &= ~m; in ath12k_mac_filter_he_cap_mesh()
7832 he_cap_elem->phy_cap_info[5] &= ~m; in ath12k_mac_filter_he_cap_mesh()
7838 he_cap_elem->phy_cap_info[6] &= ~m; in ath12k_mac_filter_he_cap_mesh()
7844 he_cap_elem->phy_cap_info[7] &= ~m; in ath12k_mac_filter_he_cap_mesh()
7850 he_cap_elem->phy_cap_info[8] &= ~m; in ath12k_mac_filter_he_cap_mesh()
7858 he_cap_elem->phy_cap_info[9] &= ~m; in ath12k_mac_filter_he_cap_mesh()
7866 bcap->he_6ghz_capa = IEEE80211_HT_MPDU_DENSITY_NONE; in ath12k_mac_setup_he_6ghz_cap()
7867 if (bcap->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) in ath12k_mac_setup_he_6ghz_cap()
7868 bcap->he_6ghz_capa |= in ath12k_mac_setup_he_6ghz_cap()
7872 bcap->he_6ghz_capa |= in ath12k_mac_setup_he_6ghz_cap()
7875 val = u32_get_bits(pcap->vht_cap, in ath12k_mac_setup_he_6ghz_cap()
7877 bcap->he_6ghz_capa |= in ath12k_mac_setup_he_6ghz_cap()
7879 val = u32_get_bits(pcap->vht_cap, in ath12k_mac_setup_he_6ghz_cap()
7881 bcap->he_6ghz_capa |= in ath12k_mac_setup_he_6ghz_cap()
7883 if (pcap->vht_cap & IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN) in ath12k_mac_setup_he_6ghz_cap()
7884 bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_RX_ANTPAT_CONS; in ath12k_mac_setup_he_6ghz_cap()
7885 if (pcap->vht_cap & IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN) in ath12k_mac_setup_he_6ghz_cap()
7886 bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_TX_ANTPAT_CONS; in ath12k_mac_setup_he_6ghz_cap()
7888 return cpu_to_le16(bcap->he_6ghz_capa); in ath12k_mac_setup_he_6ghz_cap()
7895 struct ieee80211_he_mcs_nss_supp *mcs_nss = &he_cap->he_mcs_nss_supp; in ath12k_mac_set_hemcsmap()
7896 u8 maxtxnss_160 = ath12k_get_nss_160mhz(ar, ar->num_tx_chains); in ath12k_mac_set_hemcsmap()
7897 u8 maxrxnss_160 = ath12k_get_nss_160mhz(ar, ar->num_rx_chains); in ath12k_mac_set_hemcsmap()
7903 if (i < ar->num_tx_chains && in ath12k_mac_set_hemcsmap()
7904 (ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift) & BIT(i)) in ath12k_mac_set_hemcsmap()
7909 if (i < ar->num_rx_chains && in ath12k_mac_set_hemcsmap()
7910 (ar->cfg_rx_chainmask >> cap->tx_chain_mask_shift) & BIT(i)) in ath12k_mac_set_hemcsmap()
7916 (ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift) & BIT(i)) in ath12k_mac_set_hemcsmap()
7922 (ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift) & BIT(i)) in ath12k_mac_set_hemcsmap()
7928 mcs_nss->rx_mcs_80 = cpu_to_le16(rxmcs_map & 0xffff); in ath12k_mac_set_hemcsmap()
7929 mcs_nss->tx_mcs_80 = cpu_to_le16(txmcs_map & 0xffff); in ath12k_mac_set_hemcsmap()
7930 mcs_nss->rx_mcs_160 = cpu_to_le16(rxmcs_map_160 & 0xffff); in ath12k_mac_set_hemcsmap()
7931 mcs_nss->tx_mcs_160 = cpu_to_le16(txmcs_map_160 & 0xffff); in ath12k_mac_set_hemcsmap()
7939 struct ieee80211_he_cap_elem *he_cap_elem = &he_cap->he_cap_elem; in ath12k_mac_copy_he_cap()
7941 he_cap->has_he = true; in ath12k_mac_copy_he_cap()
7942 memcpy(he_cap_elem->mac_cap_info, band_cap->he_cap_info, in ath12k_mac_copy_he_cap()
7943 sizeof(he_cap_elem->mac_cap_info)); in ath12k_mac_copy_he_cap()
7944 memcpy(he_cap_elem->phy_cap_info, band_cap->he_cap_phy_info, in ath12k_mac_copy_he_cap()
7945 sizeof(he_cap_elem->phy_cap_info)); in ath12k_mac_copy_he_cap()
7947 he_cap_elem->mac_cap_info[1] &= in ath12k_mac_copy_he_cap()
7949 he_cap_elem->phy_cap_info[0] &= in ath12k_mac_copy_he_cap()
7954 he_cap_elem->phy_cap_info[0] &= in ath12k_mac_copy_he_cap()
7956 he_cap_elem->phy_cap_info[5] &= in ath12k_mac_copy_he_cap()
7958 he_cap_elem->phy_cap_info[5] |= num_tx_chains - 1; in ath12k_mac_copy_he_cap()
7962 he_cap_elem->mac_cap_info[2] &= in ath12k_mac_copy_he_cap()
7964 he_cap_elem->phy_cap_info[3] &= in ath12k_mac_copy_he_cap()
7966 he_cap_elem->phy_cap_info[9] |= in ath12k_mac_copy_he_cap()
7970 he_cap_elem->mac_cap_info[0] &= ~IEEE80211_HE_MAC_CAP0_TWT_RES; in ath12k_mac_copy_he_cap()
7971 he_cap_elem->mac_cap_info[0] |= IEEE80211_HE_MAC_CAP0_TWT_REQ; in ath12k_mac_copy_he_cap()
7972 he_cap_elem->phy_cap_info[9] |= in ath12k_mac_copy_he_cap()
7980 ath12k_mac_set_hemcsmap(ar, &ar->pdev->cap, he_cap); in ath12k_mac_copy_he_cap()
7981 memset(he_cap->ppe_thres, 0, sizeof(he_cap->ppe_thres)); in ath12k_mac_copy_he_cap()
7982 if (he_cap_elem->phy_cap_info[6] & in ath12k_mac_copy_he_cap()
7984 ath12k_gen_ppe_thresh(&band_cap->he_ppet, he_cap->ppe_thres); in ath12k_mac_copy_he_cap()
7993 if ((he_cap->phy_cap_info[0] & in ath12k_mac_copy_eht_mcs_nss()
7998 memcpy(&mcs_nss->only_20mhz, &band_cap->eht_mcs_20_only, in ath12k_mac_copy_eht_mcs_nss()
8001 if (he_cap->phy_cap_info[0] & in ath12k_mac_copy_eht_mcs_nss()
8004 memcpy(&mcs_nss->bw._80, &band_cap->eht_mcs_80, in ath12k_mac_copy_eht_mcs_nss()
8007 if (he_cap->phy_cap_info[0] & in ath12k_mac_copy_eht_mcs_nss()
8009 memcpy(&mcs_nss->bw._160, &band_cap->eht_mcs_160, in ath12k_mac_copy_eht_mcs_nss()
8012 if (eht_cap->phy_cap_info[0] & IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ) in ath12k_mac_copy_eht_mcs_nss()
8013 memcpy(&mcs_nss->bw._320, &band_cap->eht_mcs_320, in ath12k_mac_copy_eht_mcs_nss()
8023 u8p_replace_bits(&cap->eht_ppe_thres[0], fw_ppet->numss_m1, in ath12k_mac_copy_eht_ppe_thresh()
8026 u16p_replace_bits((u16 *)&cap->eht_ppe_thres[0], fw_ppet->ru_bit_mask, in ath12k_mac_copy_eht_ppe_thresh()
8029 for (nss = 0; nss <= fw_ppet->numss_m1; nss++) { in ath12k_mac_copy_eht_ppe_thresh()
8035 if ((fw_ppet->ru_bit_mask & BIT(ru)) == 0) in ath12k_mac_copy_eht_ppe_thresh()
8038 u32p_replace_bits(&val, fw_ppet->ppet16_ppet8_ru3_ru0[nss] >> in ath12k_mac_copy_eht_ppe_thresh()
8040 GENMASK(ppet_bit_len_per_ru - 1, 0)); in ath12k_mac_copy_eht_ppe_thresh()
8043 cap->eht_ppe_thres[bit / 8] |= in ath12k_mac_copy_eht_ppe_thresh()
8058 eht_cap_elem->mac_cap_info[0] &= ~m; in ath12k_mac_filter_eht_cap_mesh()
8061 eht_cap_elem->phy_cap_info[0] &= ~m; in ath12k_mac_filter_eht_cap_mesh()
8067 eht_cap_elem->phy_cap_info[3] &= ~m; in ath12k_mac_filter_eht_cap_mesh()
8073 eht_cap_elem->phy_cap_info[4] &= ~m; in ath12k_mac_filter_eht_cap_mesh()
8079 eht_cap_elem->phy_cap_info[5] &= ~m; in ath12k_mac_filter_eht_cap_mesh()
8082 eht_cap_elem->phy_cap_info[6] &= ~m; in ath12k_mac_filter_eht_cap_mesh()
8090 eht_cap_elem->phy_cap_info[7] &= ~m; in ath12k_mac_filter_eht_cap_mesh()
8099 struct ieee80211_eht_cap_elem_fixed *eht_cap_elem = &eht_cap->eht_cap_elem; in ath12k_mac_copy_eht_cap()
8103 if (!(test_bit(WMI_TLV_SERVICE_11BE, ar->ab->wmi_ab.svc_map)) || in ath12k_mac_copy_eht_cap()
8104 ath12k_acpi_get_disable_11be(ar->ab)) in ath12k_mac_copy_eht_cap()
8107 eht_cap->has_eht = true; in ath12k_mac_copy_eht_cap()
8108 memcpy(eht_cap_elem->mac_cap_info, band_cap->eht_cap_mac_info, in ath12k_mac_copy_eht_cap()
8109 sizeof(eht_cap_elem->mac_cap_info)); in ath12k_mac_copy_eht_cap()
8110 memcpy(eht_cap_elem->phy_cap_info, band_cap->eht_cap_phy_info, in ath12k_mac_copy_eht_cap()
8111 sizeof(eht_cap_elem->phy_cap_info)); in ath12k_mac_copy_eht_cap()
8115 eht_cap_elem->phy_cap_info[0] &= in ath12k_mac_copy_eht_cap()
8117 eht_cap_elem->phy_cap_info[4] &= in ath12k_mac_copy_eht_cap()
8119 eht_cap_elem->phy_cap_info[5] &= in ath12k_mac_copy_eht_cap()
8123 eht_cap_elem->phy_cap_info[7] &= in ath12k_mac_copy_eht_cap()
8127 eht_cap_elem->phy_cap_info[7] &= in ath12k_mac_copy_eht_cap()
8139 ath12k_mac_copy_eht_mcs_nss(band_cap, &eht_cap->eht_mcs_nss_supp, in ath12k_mac_copy_eht_cap()
8142 if (eht_cap_elem->phy_cap_info[5] & in ath12k_mac_copy_eht_cap()
8144 ath12k_mac_copy_eht_ppe_thresh(&band_cap->eht_ppet, eht_cap); in ath12k_mac_copy_eht_cap()
8152 struct ath12k_band_cap *band_cap = &cap->band[band]; in ath12k_mac_copy_sband_iftype_data()
8170 ath12k_mac_copy_he_cap(ar, band_cap, i, ar->num_tx_chains, he_cap); in ath12k_mac_copy_sband_iftype_data()
8175 ath12k_mac_copy_eht_cap(ar, band_cap, &he_cap->he_cap_elem, i, in ath12k_mac_copy_sband_iftype_data()
8190 if (cap->supported_bands & WMI_HOST_WLAN_2GHZ_CAP) { in ath12k_mac_setup_sband_iftype_data()
8193 ar->mac.iftype[band], in ath12k_mac_setup_sband_iftype_data()
8195 sband = &ar->mac.sbands[band]; in ath12k_mac_setup_sband_iftype_data()
8196 _ieee80211_set_sband_iftype_data(sband, ar->mac.iftype[band], in ath12k_mac_setup_sband_iftype_data()
8200 if (cap->supported_bands & WMI_HOST_WLAN_5GHZ_CAP) { in ath12k_mac_setup_sband_iftype_data()
8203 ar->mac.iftype[band], in ath12k_mac_setup_sband_iftype_data()
8205 sband = &ar->mac.sbands[band]; in ath12k_mac_setup_sband_iftype_data()
8206 _ieee80211_set_sband_iftype_data(sband, ar->mac.iftype[band], in ath12k_mac_setup_sband_iftype_data()
8210 if (cap->supported_bands & WMI_HOST_WLAN_5GHZ_CAP && in ath12k_mac_setup_sband_iftype_data()
8211 ar->supports_6ghz) { in ath12k_mac_setup_sband_iftype_data()
8214 ar->mac.iftype[band], in ath12k_mac_setup_sband_iftype_data()
8216 sband = &ar->mac.sbands[band]; in ath12k_mac_setup_sband_iftype_data()
8217 _ieee80211_set_sband_iftype_data(sband, ar->mac.iftype[band], in ath12k_mac_setup_sband_iftype_data()
8227 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in __ath12k_set_antenna()
8230 return -EINVAL; in __ath12k_set_antenna()
8233 return -EINVAL; in __ath12k_set_antenna()
8239 tx_ant = min_t(u32, tx_ant, ar->pdev->cap.tx_chain_mask); in __ath12k_set_antenna()
8240 rx_ant = min_t(u32, rx_ant, ar->pdev->cap.rx_chain_mask); in __ath12k_set_antenna()
8242 ar->cfg_tx_chainmask = tx_ant; in __ath12k_set_antenna()
8243 ar->cfg_rx_chainmask = rx_ant; in __ath12k_set_antenna()
8245 if (ah->state != ATH12K_HW_STATE_ON && in __ath12k_set_antenna()
8246 ah->state != ATH12K_HW_STATE_RESTARTED) in __ath12k_set_antenna()
8250 tx_ant, ar->pdev->pdev_id); in __ath12k_set_antenna()
8252 ath12k_warn(ar->ab, "failed to set tx-chainmask: %d, req 0x%x\n", in __ath12k_set_antenna()
8257 ar->num_tx_chains = hweight32(tx_ant); in __ath12k_set_antenna()
8260 rx_ant, ar->pdev->pdev_id); in __ath12k_set_antenna()
8262 ath12k_warn(ar->ab, "failed to set rx-chainmask: %d, req 0x%x\n", in __ath12k_set_antenna()
8267 ar->num_rx_chains = hweight32(rx_ant); in __ath12k_set_antenna()
8270 ath12k_mac_setup_ht_vht_cap(ar, &ar->pdev->cap, NULL); in __ath12k_set_antenna()
8271 ath12k_mac_setup_sband_iftype_data(ar, &ar->pdev->cap); in __ath12k_set_antenna()
8280 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mgmt_over_wmi_tx_drop()
8284 num_mgmt = atomic_dec_if_positive(&ar->num_pending_mgmt_tx); in ath12k_mgmt_over_wmi_tx_drop()
8290 wake_up(&ar->txmgmt_empty_waitq); in ath12k_mgmt_over_wmi_tx_drop()
8298 struct ath12k_base *ab = ar->ab; in ath12k_mac_tx_mgmt_pending_free()
8300 spin_lock_bh(&ar->txmgmt_idr_lock); in ath12k_mac_tx_mgmt_pending_free()
8301 idr_remove(&ar->txmgmt_idr, buf_id); in ath12k_mac_tx_mgmt_pending_free()
8302 spin_unlock_bh(&ar->txmgmt_idr_lock); in ath12k_mac_tx_mgmt_pending_free()
8303 dma_unmap_single(ab->dev, ATH12K_SKB_CB(msdu)->paddr, msdu->len, in ath12k_mac_tx_mgmt_pending_free()
8307 memset(&info->status, 0, sizeof(info->status)); in ath12k_mac_tx_mgmt_pending_free()
8319 struct ath12k *ar = skb_cb->ar; in ath12k_mac_vif_txmgmt_idr_remove()
8320 struct ath12k_base *ab = ar->ab; in ath12k_mac_vif_txmgmt_idr_remove()
8322 if (skb_cb->vif == vif) { in ath12k_mac_vif_txmgmt_idr_remove()
8323 spin_lock_bh(&ar->txmgmt_idr_lock); in ath12k_mac_vif_txmgmt_idr_remove()
8324 idr_remove(&ar->txmgmt_idr, buf_id); in ath12k_mac_vif_txmgmt_idr_remove()
8325 spin_unlock_bh(&ar->txmgmt_idr_lock); in ath12k_mac_vif_txmgmt_idr_remove()
8326 dma_unmap_single(ab->dev, skb_cb->paddr, msdu->len, in ath12k_mac_vif_txmgmt_idr_remove()
8336 struct ath12k_base *ab = ar->ab; in ath12k_mac_mgmt_tx_wmi()
8337 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; in ath12k_mac_mgmt_tx_wmi()
8346 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_mgmt_tx_wmi()
8348 skb_cb->ar = ar; in ath12k_mac_mgmt_tx_wmi()
8349 spin_lock_bh(&ar->txmgmt_idr_lock); in ath12k_mac_mgmt_tx_wmi()
8350 buf_id = idr_alloc(&ar->txmgmt_idr, skb, 0, in ath12k_mac_mgmt_tx_wmi()
8352 spin_unlock_bh(&ar->txmgmt_idr_lock); in ath12k_mac_mgmt_tx_wmi()
8354 return -ENOSPC; in ath12k_mac_mgmt_tx_wmi()
8357 if ((skb_cb->flags & ATH12K_SKB_CIPHER_SET) && in ath12k_mac_mgmt_tx_wmi()
8358 !(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP)) { in ath12k_mac_mgmt_tx_wmi()
8359 if ((ieee80211_is_action(hdr->frame_control) || in ath12k_mac_mgmt_tx_wmi()
8360 ieee80211_is_deauth(hdr->frame_control) || in ath12k_mac_mgmt_tx_wmi()
8361 ieee80211_is_disassoc(hdr->frame_control)) && in ath12k_mac_mgmt_tx_wmi()
8362 ieee80211_has_protected(hdr->frame_control)) { in ath12k_mac_mgmt_tx_wmi()
8363 enctype = ath12k_dp_tx_get_encrypt_type(skb_cb->cipher); in ath12k_mac_mgmt_tx_wmi()
8369 paddr = dma_map_single(ab->dev, skb->data, skb->len, DMA_TO_DEVICE); in ath12k_mac_mgmt_tx_wmi()
8370 if (dma_mapping_error(ab->dev, paddr)) { in ath12k_mac_mgmt_tx_wmi()
8372 ret = -EIO; in ath12k_mac_mgmt_tx_wmi()
8376 skb_cb->paddr = paddr; in ath12k_mac_mgmt_tx_wmi()
8380 ath12k_warn(ar->ab, "failed to send mgmt frame: %d\n", ret); in ath12k_mac_mgmt_tx_wmi()
8387 dma_unmap_single(ab->dev, skb_cb->paddr, in ath12k_mac_mgmt_tx_wmi()
8388 skb->len, DMA_TO_DEVICE); in ath12k_mac_mgmt_tx_wmi()
8390 spin_lock_bh(&ar->txmgmt_idr_lock); in ath12k_mac_mgmt_tx_wmi()
8391 idr_remove(&ar->txmgmt_idr, buf_id); in ath12k_mac_mgmt_tx_wmi()
8392 spin_unlock_bh(&ar->txmgmt_idr_lock); in ath12k_mac_mgmt_tx_wmi()
8401 while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL) in ath12k_mgmt_over_wmi_tx_purge()
8408 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; in ath12k_mac_mgmt_action_frame_fill_elem_data()
8413 struct ath12k *ar = arvif->ar; in ath12k_mac_mgmt_action_frame_fill_elem_data()
8415 struct wiphy *wiphy = hw->wiphy; in ath12k_mac_mgmt_action_frame_fill_elem_data()
8424 if (skb->len < IEEE80211_MIN_ACTION_SIZE) in ath12k_mac_mgmt_action_frame_fill_elem_data()
8425 return -EINVAL; in ath12k_mac_mgmt_action_frame_fill_elem_data()
8427 remaining_len = skb->len - IEEE80211_MIN_ACTION_SIZE; in ath12k_mac_mgmt_action_frame_fill_elem_data()
8428 has_protected = ieee80211_has_protected(hdr->frame_control); in ath12k_mac_mgmt_action_frame_fill_elem_data()
8433 if (test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags) && in ath12k_mac_mgmt_action_frame_fill_elem_data()
8438 buf = (u8 *)&mgmt->u.action; in ath12k_mac_mgmt_action_frame_fill_elem_data()
8446 switch (skb_cb->cipher) { in ath12k_mac_mgmt_action_frame_fill_elem_data()
8460 return -EINVAL; in ath12k_mac_mgmt_action_frame_fill_elem_data()
8464 return -EINVAL; in ath12k_mac_mgmt_action_frame_fill_elem_data()
8467 remaining_len -= iv_len; in ath12k_mac_mgmt_action_frame_fill_elem_data()
8479 return -EINVAL; in ath12k_mac_mgmt_action_frame_fill_elem_data()
8486 remaining_len -= 2; in ath12k_mac_mgmt_action_frame_fill_elem_data()
8490 ath12k_warn(ar->ab, in ath12k_mac_mgmt_action_frame_fill_elem_data()
8492 arvif->vdev_id); in ath12k_mac_mgmt_action_frame_fill_elem_data()
8493 return -EINVAL; in ath12k_mac_mgmt_action_frame_fill_elem_data()
8496 conf = wiphy_dereference(wiphy, link_conf->chanctx_conf); in ath12k_mac_mgmt_action_frame_fill_elem_data()
8498 return -ENOENT; in ath12k_mac_mgmt_action_frame_fill_elem_data()
8500 cur_tx_power = link_conf->txpower; in ath12k_mac_mgmt_action_frame_fill_elem_data()
8501 max_tx_power = min(conf->def.chan->max_reg_power, in ath12k_mac_mgmt_action_frame_fill_elem_data()
8502 (int)ar->max_tx_power / 2); in ath12k_mac_mgmt_action_frame_fill_elem_data()
8504 ath12k_mac_op_get_txpower(hw, arvif->ahvif->vif, arvif->link_id, in ath12k_mac_mgmt_action_frame_fill_elem_data()
8511 return -EINVAL; in ath12k_mac_mgmt_action_frame_fill_elem_data()
8513 /* Variable length format as defined in IEEE 802.11-2024, in ath12k_mac_mgmt_action_frame_fill_elem_data()
8514 * Figure 9-1187-Link Measurement Request frame Action field in ath12k_mac_mgmt_action_frame_fill_elem_data()
8522 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_mgmt_action_frame_fill_elem_data()
8529 return -EINVAL; in ath12k_mac_mgmt_action_frame_fill_elem_data()
8531 /* Variable length format as defined in IEEE 802.11-2024, in ath12k_mac_mgmt_action_frame_fill_elem_data()
8532 * Figure 9-1188-Link Measurement Report frame Action field format in ath12k_mac_mgmt_action_frame_fill_elem_data()
8546 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_mgmt_action_frame_fill_elem_data()
8551 return -EINVAL; in ath12k_mac_mgmt_action_frame_fill_elem_data()
8565 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; in ath12k_mac_mgmt_frame_fill_elem_data()
8567 if (!ieee80211_is_action(hdr->frame_control)) in ath12k_mac_mgmt_frame_fill_elem_data()
8576 struct ath12k_hw *ah = ar->ah; in ath12k_mgmt_over_wmi_tx_work()
8585 while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL) { in ath12k_mgmt_over_wmi_tx_work()
8587 if (!skb_cb->vif) { in ath12k_mgmt_over_wmi_tx_work()
8588 ath12k_warn(ar->ab, "no vif found for mgmt frame\n"); in ath12k_mgmt_over_wmi_tx_work()
8593 ahvif = ath12k_vif_to_ahvif(skb_cb->vif); in ath12k_mgmt_over_wmi_tx_work()
8594 if (!(ahvif->links_map & BIT(skb_cb->link_id))) { in ath12k_mgmt_over_wmi_tx_work()
8595 ath12k_warn(ar->ab, in ath12k_mgmt_over_wmi_tx_work()
8597 skb_cb->link_id, ahvif->links_map); in ath12k_mgmt_over_wmi_tx_work()
8602 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[skb_cb->link_id]); in ath12k_mgmt_over_wmi_tx_work()
8603 if (ar->allocated_vdev_map & (1LL << arvif->vdev_id)) { in ath12k_mgmt_over_wmi_tx_work()
8613 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mgmt_over_wmi_tx_work()
8620 ath12k_warn(ar->ab, "failed to tx mgmt frame, vdev_id %d :%d\n", in ath12k_mgmt_over_wmi_tx_work()
8621 arvif->vdev_id, ret); in ath12k_mgmt_over_wmi_tx_work()
8625 ath12k_warn(ar->ab, in ath12k_mgmt_over_wmi_tx_work()
8627 arvif->vdev_id, in ath12k_mgmt_over_wmi_tx_work()
8628 skb_cb->link_id, in ath12k_mgmt_over_wmi_tx_work()
8629 arvif->is_started); in ath12k_mgmt_over_wmi_tx_work()
8638 struct sk_buff_head *q = &ar->wmi_mgmt_tx_queue; in ath12k_mac_mgmt_tx()
8640 if (test_bit(ATH12K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags)) in ath12k_mac_mgmt_tx()
8641 return -ESHUTDOWN; in ath12k_mac_mgmt_tx()
8649 atomic_read(&ar->num_pending_mgmt_tx) > ATH12K_PRB_RSP_DROP_THRESHOLD) { in ath12k_mac_mgmt_tx()
8650 ath12k_warn(ar->ab, in ath12k_mac_mgmt_tx()
8652 return -ENOSPC; in ath12k_mac_mgmt_tx()
8656 ath12k_warn(ar->ab, "mgmt tx queue is full\n"); in ath12k_mac_mgmt_tx()
8657 return -ENOSPC; in ath12k_mac_mgmt_tx()
8661 atomic_inc(&ar->num_pending_mgmt_tx); in ath12k_mac_mgmt_tx()
8662 wiphy_work_queue(ath12k_ar_to_hw(ar)->wiphy, &ar->wmi_mgmt_tx_work); in ath12k_mac_mgmt_tx()
8677 spin_lock_bh(&ar->data_lock); in ath12k_mac_add_p2p_noa_ie()
8679 if (ahvif->u.ap.noa_data && in ath12k_mac_add_p2p_noa_ie()
8680 !pskb_expand_head(skb, 0, ahvif->u.ap.noa_len, in ath12k_mac_add_p2p_noa_ie()
8682 skb_put_data(skb, ahvif->u.ap.noa_data, in ath12k_mac_add_p2p_noa_ie()
8683 ahvif->u.ap.noa_len); in ath12k_mac_add_p2p_noa_ie()
8685 spin_unlock_bh(&ar->data_lock); in ath12k_mac_add_p2p_noa_ie()
8693 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; in ath12k_mlo_mcast_update_tx_link_address()
8699 bss_conf = rcu_dereference(vif->link_conf[link_id]); in ath12k_mlo_mcast_update_tx_link_address()
8701 ether_addr_copy(hdr->addr2, bss_conf->addr); in ath12k_mlo_mcast_update_tx_link_address()
8708 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; in ath12k_mac_get_tx_link()
8719 return ahvif->deflink.link_id; in ath12k_mac_get_tx_link()
8727 if (!sta->mlo) { in ath12k_mac_get_tx_link()
8728 link = ahsta->deflink.link_id; in ath12k_mac_get_tx_link()
8733 bss_conf = rcu_dereference(vif->link_conf[link]); in ath12k_mac_get_tx_link()
8735 ether_addr_copy(hdr->addr2, bss_conf->addr); in ath12k_mac_get_tx_link()
8736 if (!ieee80211_has_tods(hdr->frame_control) && in ath12k_mac_get_tx_link()
8737 !ieee80211_has_fromds(hdr->frame_control)) in ath12k_mac_get_tx_link()
8738 ether_addr_copy(hdr->addr3, bss_conf->addr); in ath12k_mac_get_tx_link()
8748 ieee80211_is_data(hdr->frame_control)) in ath12k_mac_get_tx_link()
8749 return ahsta->assoc_link_id; in ath12k_mac_get_tx_link()
8753 link = ahsta->deflink.link_id; in ath12k_mac_get_tx_link()
8755 if (!ieee80211_is_mgmt(hdr->frame_control)) in ath12k_mac_get_tx_link()
8759 bss_conf = rcu_dereference(vif->link_conf[link]); in ath12k_mac_get_tx_link()
8760 link_sta = rcu_dereference(sta->link[link]); in ath12k_mac_get_tx_link()
8763 ether_addr_copy(hdr->addr1, link_sta->addr); in ath12k_mac_get_tx_link()
8764 ether_addr_copy(hdr->addr2, bss_conf->addr); in ath12k_mac_get_tx_link()
8766 if (vif->type == NL80211_IFTYPE_STATION && bss_conf->bssid) in ath12k_mac_get_tx_link()
8767 ether_addr_copy(hdr->addr3, bss_conf->bssid); in ath12k_mac_get_tx_link()
8768 else if (vif->type == NL80211_IFTYPE_AP) in ath12k_mac_get_tx_link()
8769 ether_addr_copy(hdr->addr3, bss_conf->addr); in ath12k_mac_get_tx_link()
8787 * check. Also this would not need any translation at hdr->addr1 in ath12k_mac_get_tx_link()
8791 ether_addr_copy(hdr->addr2, bss_conf->addr); in ath12k_mac_get_tx_link()
8793 if (vif->type == NL80211_IFTYPE_STATION && bss_conf->bssid) in ath12k_mac_get_tx_link()
8794 ether_addr_copy(hdr->addr3, bss_conf->bssid); in ath12k_mac_get_tx_link()
8795 else if (vif->type == NL80211_IFTYPE_AP) in ath12k_mac_get_tx_link()
8796 ether_addr_copy(hdr->addr3, bss_conf->addr); in ath12k_mac_get_tx_link()
8809 struct ieee80211_vif *vif = info->control.vif; in ath12k_mac_op_tx()
8811 struct ath12k_link_vif *arvif = &ahvif->deflink; in ath12k_mac_op_tx()
8812 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; in ath12k_mac_op_tx()
8813 struct ieee80211_key_conf *key = info->control.hw_key; in ath12k_mac_op_tx()
8814 struct ieee80211_sta *sta = control->sta; in ath12k_mac_op_tx()
8816 u32 info_flags = info->flags; in ath12k_mac_op_tx()
8829 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { in ath12k_mac_op_tx()
8834 link_id = u32_get_bits(info->control.flags, IEEE80211_TX_CTRL_MLO_LINK); in ath12k_mac_op_tx()
8836 skb_cb->vif = vif; in ath12k_mac_op_tx()
8839 skb_cb->cipher = key->cipher; in ath12k_mac_op_tx()
8840 skb_cb->flags |= ATH12K_SKB_CIPHER_SET; in ath12k_mac_op_tx()
8854 arvif = rcu_dereference(ahvif->link[link_id]); in ath12k_mac_op_tx()
8855 if (!arvif || !arvif->ar) { in ath12k_mac_op_tx()
8856 ath12k_warn(ahvif->ah, "failed to find arvif link id %u for frame transmission", in ath12k_mac_op_tx()
8862 ar = arvif->ar; in ath12k_mac_op_tx()
8863 skb_cb->link_id = link_id; in ath12k_mac_op_tx()
8864 is_prb_rsp = ieee80211_is_probe_resp(hdr->frame_control); in ath12k_mac_op_tx()
8867 eth = (struct ethhdr *)skb->data; in ath12k_mac_op_tx()
8868 is_mcast = is_multicast_ether_addr(eth->h_dest); in ath12k_mac_op_tx()
8870 skb_cb->flags |= ATH12K_SKB_HW_80211_ENCAP; in ath12k_mac_op_tx()
8871 } else if (ieee80211_is_mgmt(hdr->frame_control)) { in ath12k_mac_op_tx()
8872 if (sta && sta->mlo) in ath12k_mac_op_tx()
8873 skb_cb->flags |= ATH12K_SKB_MLO_STA; in ath12k_mac_op_tx()
8877 ath12k_warn(ar->ab, "failed to queue management frame %d\n", in ath12k_mac_op_tx()
8885 is_mcast = is_multicast_ether_addr(hdr->addr1); in ath12k_mac_op_tx()
8888 if (vif->type == NL80211_IFTYPE_AP && vif->p2p) in ath12k_mac_op_tx()
8892 if (!test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags) && in ath12k_mac_op_tx()
8893 !(skb_cb->flags & ATH12K_SKB_HW_80211_ENCAP) && in ath12k_mac_op_tx()
8894 !(skb_cb->flags & ATH12K_SKB_CIPHER_SET) && in ath12k_mac_op_tx()
8895 ieee80211_has_protected(hdr->frame_control)) in ath12k_mac_op_tx()
8898 if (!vif->valid_links || !is_mcast || is_dvlan || in ath12k_mac_op_tx()
8899 (skb_cb->flags & ATH12K_SKB_HW_80211_ENCAP) || in ath12k_mac_op_tx()
8900 test_bit(ATH12K_FLAG_RAW_MODE, &ar->ab->dev_flags)) { in ath12k_mac_op_tx()
8903 ath12k_warn(ar->ab, "failed to transmit frame %d\n", ret); in ath12k_mac_op_tx()
8904 ieee80211_free_txskb(ar->ah->hw, skb); in ath12k_mac_op_tx()
8908 mcbc_gsn = atomic_inc_return(&ahvif->mcbc_gsn) & 0xfff; in ath12k_mac_op_tx()
8910 links_map = ahvif->links_map; in ath12k_mac_op_tx()
8913 tmp_arvif = rcu_dereference(ahvif->link[link_id]); in ath12k_mac_op_tx()
8914 if (!tmp_arvif || !tmp_arvif->is_up) in ath12k_mac_op_tx()
8917 tmp_ar = tmp_arvif->ar; in ath12k_mac_op_tx()
8920 ath12k_err(ar->ab, in ath12k_mac_op_tx()
8922 link_id, tmp_arvif->vdev_id); in ath12k_mac_op_tx()
8931 skb_cb->link_id = link_id; in ath12k_mac_op_tx()
8934 if (unlikely(!ahvif->key_cipher)) in ath12k_mac_op_tx()
8937 spin_lock_bh(&tmp_ar->ab->base_lock); in ath12k_mac_op_tx()
8938 peer = ath12k_peer_find_by_addr(tmp_ar->ab, tmp_arvif->bssid); in ath12k_mac_op_tx()
8940 spin_unlock_bh(&tmp_ar->ab->base_lock); in ath12k_mac_op_tx()
8941 ath12k_warn(tmp_ar->ab, in ath12k_mac_op_tx()
8943 tmp_arvif->vdev_id, tmp_arvif->bssid, in ath12k_mac_op_tx()
8944 ahvif->links_map); in ath12k_mac_op_tx()
8949 key = peer->keys[peer->mcast_keyidx]; in ath12k_mac_op_tx()
8951 skb_cb->cipher = key->cipher; in ath12k_mac_op_tx()
8952 skb_cb->flags |= ATH12K_SKB_CIPHER_SET; in ath12k_mac_op_tx()
8954 hdr = (struct ieee80211_hdr *)msdu_copied->data; in ath12k_mac_op_tx()
8955 if (!ieee80211_has_protected(hdr->frame_control)) in ath12k_mac_op_tx()
8956 hdr->frame_control |= in ath12k_mac_op_tx()
8959 spin_unlock_bh(&tmp_ar->ab->base_lock); in ath12k_mac_op_tx()
8965 if (ret == -ENOMEM) { in ath12k_mac_op_tx()
8970 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_op_tx()
8974 ath12k_warn(ar->ab, in ath12k_mac_op_tx()
8982 ieee80211_free_txskb(ar->ah->hw, skb); in ath12k_mac_op_tx()
8988 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_drain_tx()
8990 /* make sure rcu-protected mac80211 tx path itself is drained */ in ath12k_mac_drain_tx()
8993 wiphy_work_cancel(ath12k_ar_to_hw(ar)->wiphy, &ar->wmi_mgmt_tx_work); in ath12k_mac_drain_tx()
9000 struct ath12k_base *ab = ar->ab; in ath12k_mac_config_mon_status_default()
9004 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_config_mon_status_default()
9006 if (!ab->hw_params->rxdma1_enable) in ath12k_mac_config_mon_status_default()
9018 for (i = 0; i < ab->hw_params->num_rxdma_per_pdev; i++) { in ath12k_mac_config_mon_status_default()
9019 ring_id = ar->dp.rxdma_mon_dst_ring[i].ring_id; in ath12k_mac_config_mon_status_default()
9021 ar->dp.mac_id + i, in ath12k_mac_config_mon_status_default()
9037 struct ath12k_hw *ah = ar->ah; in ath12k_mac_start()
9038 struct ath12k_base *ab = ar->ab; in ath12k_mac_start()
9039 struct ath12k_pdev *pdev = ar->pdev; in ath12k_mac_start()
9042 lockdep_assert_held(&ah->hw_mutex); in ath12k_mac_start()
9043 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_start()
9046 1, pdev->pdev_id); in ath12k_mac_start()
9054 pdev->pdev_id); in ath12k_mac_start()
9061 0, pdev->pdev_id); in ath12k_mac_start()
9068 ret = ath12k_wmi_send_dfs_phyerr_offload_enable_cmd(ar, pdev->pdev_id); in ath12k_mac_start()
9083 1, pdev->pdev_id); in ath12k_mac_start()
9090 __ath12k_set_antenna(ar, ar->cfg_tx_chainmask, ar->cfg_rx_chainmask); in ath12k_mac_start()
9101 if (ret == -EINVAL) in ath12k_mac_start()
9106 ar->num_started_vdevs = 0; in ath12k_mac_start()
9107 ar->num_created_vdevs = 0; in ath12k_mac_start()
9108 ar->num_peers = 0; in ath12k_mac_start()
9109 ar->allocated_vdev_map = 0; in ath12k_mac_start()
9110 ar->chan_tx_pwr = ATH12K_PDEV_TX_POWER_INVALID; in ath12k_mac_start()
9116 if (ret && (ret != -EOPNOTSUPP)) { in ath12k_mac_start()
9122 if (ret == -EOPNOTSUPP) in ath12k_mac_start()
9127 ath12k_wmi_pdev_lro_cfg(ar, ar->pdev->pdev_id); in ath12k_mac_start()
9130 if (ab->hw_params->idle_ps) { in ath12k_mac_start()
9132 1, pdev->pdev_id); in ath12k_mac_start()
9139 rcu_assign_pointer(ab->pdevs_active[ar->pdev_idx], in ath12k_mac_start()
9140 &ab->pdevs[ar->pdev_idx]); in ath12k_mac_start()
9153 lockdep_assert_wiphy(ah->hw->wiphy); in ath12k_drain_tx()
9166 return -EPERM; in ath12k_mac_op_start()
9168 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_start()
9172 guard(mutex)(&ah->hw_mutex); in ath12k_mac_op_start()
9174 switch (ah->state) { in ath12k_mac_op_start()
9176 ah->state = ATH12K_HW_STATE_ON; in ath12k_mac_op_start()
9179 ah->state = ATH12K_HW_STATE_RESTARTED; in ath12k_mac_op_start()
9185 ah->state = ATH12K_HW_STATE_OFF; in ath12k_mac_op_start()
9188 return -EINVAL; in ath12k_mac_op_start()
9194 ah->state = ATH12K_HW_STATE_OFF; in ath12k_mac_op_start()
9196 ath12k_err(ar->ab, "fail to start mac operations in pdev idx %d ret %d\n", in ath12k_mac_op_start()
9197 ar->pdev_idx, ret); in ath12k_mac_op_start()
9205 for (; i > 0; i--) { in ath12k_mac_op_start()
9206 ar = ath12k_ah_to_ar(ah, i - 1); in ath12k_mac_op_start()
9215 struct ath12k_base *ab = ar->ab; in ath12k_mac_rfkill_config()
9219 if (ab->hw_params->rfkill_pin == 0) in ath12k_mac_rfkill_config()
9220 return -EOPNOTSUPP; in ath12k_mac_rfkill_config()
9224 ab->hw_params->rfkill_pin, ab->hw_params->rfkill_cfg, in ath12k_mac_rfkill_config()
9225 ab->hw_params->rfkill_on_level); in ath12k_mac_rfkill_config()
9227 param = u32_encode_bits(ab->hw_params->rfkill_on_level, in ath12k_mac_rfkill_config()
9229 u32_encode_bits(ab->hw_params->rfkill_pin, in ath12k_mac_rfkill_config()
9231 u32_encode_bits(ab->hw_params->rfkill_cfg, in ath12k_mac_rfkill_config()
9235 param, ar->pdev->pdev_id); in ath12k_mac_rfkill_config()
9256 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac %d rfkill enable %d", in ath12k_mac_rfkill_enable_radio()
9257 ar->pdev_idx, param); in ath12k_mac_rfkill_enable_radio()
9260 param, ar->pdev->pdev_id); in ath12k_mac_rfkill_enable_radio()
9262 ath12k_warn(ar->ab, "failed to set rfkill enable param %d: %d\n", in ath12k_mac_rfkill_enable_radio()
9272 struct ath12k_hw *ah = ar->ah; in ath12k_mac_stop()
9277 lockdep_assert_held(&ah->hw_mutex); in ath12k_mac_stop()
9278 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_stop()
9281 if (ret && (ret != -EOPNOTSUPP)) in ath12k_mac_stop()
9282 ath12k_err(ar->ab, "failed to clear rx_filter for monitor status ring: (%d)\n", in ath12k_mac_stop()
9285 clear_bit(ATH12K_FLAG_CAC_RUNNING, &ar->dev_flags); in ath12k_mac_stop()
9287 cancel_delayed_work_sync(&ar->scan.timeout); in ath12k_mac_stop()
9288 wiphy_work_cancel(ath12k_ar_to_hw(ar)->wiphy, &ar->scan.vdev_clean_wk); in ath12k_mac_stop()
9289 cancel_work_sync(&ar->regd_channel_update_work); in ath12k_mac_stop()
9290 cancel_work_sync(&ar->regd_update_work); in ath12k_mac_stop()
9291 cancel_work_sync(&ar->ab->rfkill_work); in ath12k_mac_stop()
9292 cancel_work_sync(&ar->ab->update_11d_work); in ath12k_mac_stop()
9293 ar->state_11d = ATH12K_11D_IDLE; in ath12k_mac_stop()
9294 complete(&ar->completed_11d_scan); in ath12k_mac_stop()
9296 spin_lock_bh(&ar->data_lock); in ath12k_mac_stop()
9298 list_for_each_entry_safe(ppdu_stats, tmp, &ar->ppdu_stats_info, list) { in ath12k_mac_stop()
9299 list_del(&ppdu_stats->list); in ath12k_mac_stop()
9303 while ((arg = list_first_entry_or_null(&ar->regd_channel_update_queue, in ath12k_mac_stop()
9306 list_del(&arg->list); in ath12k_mac_stop()
9309 spin_unlock_bh(&ar->data_lock); in ath12k_mac_stop()
9311 rcu_assign_pointer(ar->ab->pdevs_active[ar->pdev_idx], NULL); in ath12k_mac_stop()
9315 atomic_set(&ar->num_pending_mgmt_tx, 0); in ath12k_mac_stop()
9324 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_stop()
9328 mutex_lock(&ah->hw_mutex); in ath12k_mac_op_stop()
9330 ah->state = ATH12K_HW_STATE_OFF; in ath12k_mac_op_stop()
9335 mutex_unlock(&ah->hw_mutex); in ath12k_mac_op_stop()
9341 struct ath12k_base *ab = arvif->ar->ab; in ath12k_mac_get_vdev_stats_id()
9345 if (ab->free_vdev_stats_id_map & (1LL << vdev_stats_id)) { in ath12k_mac_get_vdev_stats_id()
9352 ab->free_vdev_stats_id_map |= (1LL << vdev_stats_id); in ath12k_mac_get_vdev_stats_id()
9357 arvif->vdev_stats_id = vdev_stats_id; in ath12k_mac_get_vdev_stats_id()
9364 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_mac_setup_vdev_params_mbssid()
9366 struct ath12k *ar = arvif->ar; in ath12k_mac_setup_vdev_params_mbssid()
9371 ath12k_warn(ar->ab, "unable to access bss link conf in set mbssid params for vif %pM link %u\n", in ath12k_mac_setup_vdev_params_mbssid()
9372 ahvif->vif->addr, arvif->link_id); in ath12k_mac_setup_vdev_params_mbssid()
9373 return -ENOLINK; in ath12k_mac_setup_vdev_params_mbssid()
9380 if (link_conf->nontransmitted) { in ath12k_mac_setup_vdev_params_mbssid()
9381 if (ath12k_ar_to_hw(ar)->wiphy != in ath12k_mac_setup_vdev_params_mbssid()
9382 ath12k_ar_to_hw(tx_arvif->ar)->wiphy) in ath12k_mac_setup_vdev_params_mbssid()
9383 return -EINVAL; in ath12k_mac_setup_vdev_params_mbssid()
9386 *tx_vdev_id = tx_arvif->vdev_id; in ath12k_mac_setup_vdev_params_mbssid()
9390 return -EINVAL; in ath12k_mac_setup_vdev_params_mbssid()
9393 if (link_conf->ema_ap) in ath12k_mac_setup_vdev_params_mbssid()
9402 struct ath12k *ar = arvif->ar; in ath12k_mac_setup_vdev_create_arg()
9403 struct ath12k_pdev *pdev = ar->pdev; in ath12k_mac_setup_vdev_create_arg()
9404 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_mac_setup_vdev_create_arg()
9407 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_setup_vdev_create_arg()
9409 arg->if_id = arvif->vdev_id; in ath12k_mac_setup_vdev_create_arg()
9410 arg->type = ahvif->vdev_type; in ath12k_mac_setup_vdev_create_arg()
9411 arg->subtype = ahvif->vdev_subtype; in ath12k_mac_setup_vdev_create_arg()
9412 arg->pdev_id = pdev->pdev_id; in ath12k_mac_setup_vdev_create_arg()
9414 arg->mbssid_flags = WMI_VDEV_MBSSID_FLAGS_NON_MBSSID_AP; in ath12k_mac_setup_vdev_create_arg()
9415 arg->mbssid_tx_vdev_id = 0; in ath12k_mac_setup_vdev_create_arg()
9417 ar->ab->wmi_ab.svc_map)) { in ath12k_mac_setup_vdev_create_arg()
9419 &arg->mbssid_flags, in ath12k_mac_setup_vdev_create_arg()
9420 &arg->mbssid_tx_vdev_id); in ath12k_mac_setup_vdev_create_arg()
9425 if (pdev->cap.supported_bands & WMI_HOST_WLAN_2GHZ_CAP) { in ath12k_mac_setup_vdev_create_arg()
9426 arg->chains[NL80211_BAND_2GHZ].tx = ar->num_tx_chains; in ath12k_mac_setup_vdev_create_arg()
9427 arg->chains[NL80211_BAND_2GHZ].rx = ar->num_rx_chains; in ath12k_mac_setup_vdev_create_arg()
9429 if (pdev->cap.supported_bands & WMI_HOST_WLAN_5GHZ_CAP) { in ath12k_mac_setup_vdev_create_arg()
9430 arg->chains[NL80211_BAND_5GHZ].tx = ar->num_tx_chains; in ath12k_mac_setup_vdev_create_arg()
9431 arg->chains[NL80211_BAND_5GHZ].rx = ar->num_rx_chains; in ath12k_mac_setup_vdev_create_arg()
9433 if (pdev->cap.supported_bands & WMI_HOST_WLAN_5GHZ_CAP && in ath12k_mac_setup_vdev_create_arg()
9434 ar->supports_6ghz) { in ath12k_mac_setup_vdev_create_arg()
9435 arg->chains[NL80211_BAND_6GHZ].tx = ar->num_tx_chains; in ath12k_mac_setup_vdev_create_arg()
9436 arg->chains[NL80211_BAND_6GHZ].rx = ar->num_rx_chains; in ath12k_mac_setup_vdev_create_arg()
9439 arg->if_stats_id = ath12k_mac_get_vdev_stats_id(arvif); in ath12k_mac_setup_vdev_create_arg()
9442 if (hweight16(ahvif->vif->valid_links) > ATH12K_WMI_MLO_MAX_LINKS) { in ath12k_mac_setup_vdev_create_arg()
9443 ath12k_warn(ar->ab, "too many MLO links during setting up vdev: %d", in ath12k_mac_setup_vdev_create_arg()
9444 ahvif->vif->valid_links); in ath12k_mac_setup_vdev_create_arg()
9445 return -EINVAL; in ath12k_mac_setup_vdev_create_arg()
9448 ether_addr_copy(arg->mld_addr, ahvif->vif->addr); in ath12k_mac_setup_vdev_create_arg()
9456 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_mac_update_vif_offload()
9458 struct ath12k *ar = arvif->ar; in ath12k_mac_update_vif_offload()
9459 struct ath12k_base *ab = ar->ab; in ath12k_mac_update_vif_offload()
9464 if (vif->type != NL80211_IFTYPE_STATION && in ath12k_mac_update_vif_offload()
9465 vif->type != NL80211_IFTYPE_AP) in ath12k_mac_update_vif_offload()
9466 vif->offload_flags &= ~(IEEE80211_OFFLOAD_ENCAP_ENABLED | in ath12k_mac_update_vif_offload()
9469 if (vif->offload_flags & IEEE80211_OFFLOAD_ENCAP_ENABLED) in ath12k_mac_update_vif_offload()
9470 ahvif->tx_encap_type = ATH12K_HW_TXRX_ETHERNET; in ath12k_mac_update_vif_offload()
9471 else if (test_bit(ATH12K_FLAG_RAW_MODE, &ab->dev_flags)) in ath12k_mac_update_vif_offload()
9472 ahvif->tx_encap_type = ATH12K_HW_TXRX_RAW; in ath12k_mac_update_vif_offload()
9474 ahvif->tx_encap_type = ATH12K_HW_TXRX_NATIVE_WIFI; in ath12k_mac_update_vif_offload()
9476 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_update_vif_offload()
9477 param_id, ahvif->tx_encap_type); in ath12k_mac_update_vif_offload()
9480 arvif->vdev_id, ret); in ath12k_mac_update_vif_offload()
9481 vif->offload_flags &= ~IEEE80211_OFFLOAD_ENCAP_ENABLED; in ath12k_mac_update_vif_offload()
9485 if (vif->offload_flags & IEEE80211_OFFLOAD_DECAP_ENABLED) in ath12k_mac_update_vif_offload()
9487 else if (test_bit(ATH12K_FLAG_RAW_MODE, &ab->dev_flags)) in ath12k_mac_update_vif_offload()
9492 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_update_vif_offload()
9496 arvif->vdev_id, ret); in ath12k_mac_update_vif_offload()
9497 vif->offload_flags &= ~IEEE80211_OFFLOAD_DECAP_ENABLED; in ath12k_mac_update_vif_offload()
9509 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_update_vif_offload()
9511 if (vif->valid_links) { in ath12k_mac_op_update_vif_offload()
9512 links = vif->valid_links; in ath12k_mac_op_update_vif_offload()
9514 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); in ath12k_mac_op_update_vif_offload()
9515 if (!(arvif && arvif->ar)) in ath12k_mac_op_update_vif_offload()
9524 ath12k_mac_update_vif_offload(&ahvif->deflink); in ath12k_mac_op_update_vif_offload()
9534 for (i = 0; i < ab->num_radios; i++) { in ath12k_mac_vif_ap_active_any()
9535 pdev = &ab->pdevs[i]; in ath12k_mac_vif_ap_active_any()
9536 ar = pdev->ar; in ath12k_mac_vif_ap_active_any()
9537 list_for_each_entry(arvif, &ar->arvifs, list) { in ath12k_mac_vif_ap_active_any()
9538 if (arvif->is_up && in ath12k_mac_vif_ap_active_any()
9539 arvif->ahvif->vdev_type == WMI_VDEV_TYPE_AP) in ath12k_mac_vif_ap_active_any()
9551 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_11d_scan_start()
9553 if (ar->regdom_set_by_user) in ath12k_mac_11d_scan_start()
9556 if (ar->vdev_id_11d_scan != ATH12K_11D_INVALID_VDEV_ID) in ath12k_mac_11d_scan_start()
9559 if (!test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map)) in ath12k_mac_11d_scan_start()
9562 if (ath12k_mac_vif_ap_active_any(ar->ab)) in ath12k_mac_11d_scan_start()
9569 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_11d_scan_start()
9574 ath12k_warn(ar->ab, "failed to start 11d scan vdev %d ret: %d\n", in ath12k_mac_11d_scan_start()
9577 ar->vdev_id_11d_scan = vdev_id; in ath12k_mac_11d_scan_start()
9578 if (ar->state_11d == ATH12K_11D_PREPARING) in ath12k_mac_11d_scan_start()
9579 ar->state_11d = ATH12K_11D_RUNNING; in ath12k_mac_11d_scan_start()
9583 if (ar->state_11d == ATH12K_11D_PREPARING) { in ath12k_mac_11d_scan_start()
9584 ar->state_11d = ATH12K_11D_IDLE; in ath12k_mac_11d_scan_start()
9585 complete(&ar->completed_11d_scan); in ath12k_mac_11d_scan_start()
9594 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_11d_scan_stop()
9596 if (!test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map)) in ath12k_mac_11d_scan_stop()
9599 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac stop 11d for vdev %d\n", in ath12k_mac_11d_scan_stop()
9600 ar->vdev_id_11d_scan); in ath12k_mac_11d_scan_stop()
9602 if (ar->state_11d == ATH12K_11D_PREPARING) { in ath12k_mac_11d_scan_stop()
9603 ar->state_11d = ATH12K_11D_IDLE; in ath12k_mac_11d_scan_stop()
9604 complete(&ar->completed_11d_scan); in ath12k_mac_11d_scan_stop()
9607 if (ar->vdev_id_11d_scan != ATH12K_11D_INVALID_VDEV_ID) { in ath12k_mac_11d_scan_stop()
9608 vdev_id = ar->vdev_id_11d_scan; in ath12k_mac_11d_scan_stop()
9612 ath12k_warn(ar->ab, in ath12k_mac_11d_scan_stop()
9616 ar->vdev_id_11d_scan = ATH12K_11D_INVALID_VDEV_ID; in ath12k_mac_11d_scan_stop()
9617 ar->state_11d = ATH12K_11D_IDLE; in ath12k_mac_11d_scan_stop()
9618 complete(&ar->completed_11d_scan); in ath12k_mac_11d_scan_stop()
9631 for (i = 0; i < ab->num_radios; i++) { in ath12k_mac_11d_scan_stop_all()
9632 pdev = &ab->pdevs[i]; in ath12k_mac_11d_scan_stop_all()
9633 ar = pdev->ar; in ath12k_mac_11d_scan_stop_all()
9642 ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE; in ath12k_mac_determine_vdev_type()
9644 switch (vif->type) { in ath12k_mac_determine_vdev_type()
9647 ahvif->vdev_type = WMI_VDEV_TYPE_STA; in ath12k_mac_determine_vdev_type()
9649 if (vif->p2p) in ath12k_mac_determine_vdev_type()
9650 ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_CLIENT; in ath12k_mac_determine_vdev_type()
9654 ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_MESH_11S; in ath12k_mac_determine_vdev_type()
9657 ahvif->vdev_type = WMI_VDEV_TYPE_AP; in ath12k_mac_determine_vdev_type()
9659 if (vif->p2p) in ath12k_mac_determine_vdev_type()
9660 ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_GO; in ath12k_mac_determine_vdev_type()
9664 ahvif->vdev_type = WMI_VDEV_TYPE_MONITOR; in ath12k_mac_determine_vdev_type()
9667 ahvif->vdev_type = WMI_VDEV_TYPE_STA; in ath12k_mac_determine_vdev_type()
9668 ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_DEVICE; in ath12k_mac_determine_vdev_type()
9678 struct ath12k_hw *ah = ar->ah; in ath12k_mac_vdev_create()
9679 struct ath12k_base *ab = ar->ab; in ath12k_mac_vdev_create()
9680 struct ieee80211_hw *hw = ah->hw; in ath12k_mac_vdev_create()
9681 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_mac_vdev_create()
9692 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_vdev_create()
9697 if (vif->type == NL80211_IFTYPE_MONITOR && ar->monitor_vdev_created) in ath12k_mac_vdev_create()
9698 return -EINVAL; in ath12k_mac_vdev_create()
9700 link_id = arvif->link_id; in ath12k_mac_vdev_create()
9703 link_conf = wiphy_dereference(hw->wiphy, vif->link_conf[link_id]); in ath12k_mac_vdev_create()
9705 ath12k_warn(ar->ab, "unable to access bss link conf in vdev create for vif %pM link %u\n", in ath12k_mac_vdev_create()
9706 vif->addr, arvif->link_id); in ath12k_mac_vdev_create()
9707 return -ENOLINK; in ath12k_mac_vdev_create()
9712 memcpy(arvif->bssid, link_conf->addr, ETH_ALEN); in ath12k_mac_vdev_create()
9714 memcpy(arvif->bssid, vif->addr, ETH_ALEN); in ath12k_mac_vdev_create()
9716 arvif->ar = ar; in ath12k_mac_vdev_create()
9717 vdev_id = __ffs64(ab->free_vdev_map); in ath12k_mac_vdev_create()
9718 arvif->vdev_id = vdev_id; in ath12k_mac_vdev_create()
9719 if (vif->type == NL80211_IFTYPE_MONITOR) in ath12k_mac_vdev_create()
9720 ar->monitor_vdev_id = vdev_id; in ath12k_mac_vdev_create()
9722 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev create id %d type %d subtype %d map %llx\n", in ath12k_mac_vdev_create()
9723 arvif->vdev_id, ahvif->vdev_type, ahvif->vdev_subtype, in ath12k_mac_vdev_create()
9724 ab->free_vdev_map); in ath12k_mac_vdev_create()
9726 vif->cab_queue = arvif->vdev_id % (ATH12K_HW_MAX_QUEUES - 1); in ath12k_mac_vdev_create()
9727 for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++) in ath12k_mac_vdev_create()
9728 vif->hw_queue[i] = i % (ATH12K_HW_MAX_QUEUES - 1); in ath12k_mac_vdev_create()
9733 arvif->vdev_id, ret); in ath12k_mac_vdev_create()
9737 ret = ath12k_wmi_vdev_create(ar, arvif->bssid, &vdev_arg); in ath12k_mac_vdev_create()
9740 arvif->vdev_id, ret); in ath12k_mac_vdev_create()
9744 ar->num_created_vdevs++; in ath12k_mac_vdev_create()
9745 arvif->is_created = true; in ath12k_mac_vdev_create()
9747 vif->addr, arvif->vdev_id); in ath12k_mac_vdev_create()
9748 ar->allocated_vdev_map |= 1LL << arvif->vdev_id; in ath12k_mac_vdev_create()
9749 ab->free_vdev_map &= ~(1LL << arvif->vdev_id); in ath12k_mac_vdev_create()
9751 spin_lock_bh(&ar->data_lock); in ath12k_mac_vdev_create()
9752 list_add(&arvif->list, &ar->arvifs); in ath12k_mac_vdev_create()
9753 spin_unlock_bh(&ar->data_lock); in ath12k_mac_vdev_create()
9757 nss = hweight32(ar->cfg_tx_chainmask) ? : 1; in ath12k_mac_vdev_create()
9758 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_vdev_create()
9762 arvif->vdev_id, ar->cfg_tx_chainmask, nss, ret); in ath12k_mac_vdev_create()
9766 switch (ahvif->vdev_type) { in ath12k_mac_vdev_create()
9768 peer_param.vdev_id = arvif->vdev_id; in ath12k_mac_vdev_create()
9769 peer_param.peer_addr = arvif->bssid; in ath12k_mac_vdev_create()
9774 arvif->vdev_id, ret); in ath12k_mac_vdev_create()
9780 ath12k_warn(ar->ab, "failed to set vdev %i kickout parameters: %d\n", in ath12k_mac_vdev_create()
9781 arvif->vdev_id, ret); in ath12k_mac_vdev_create()
9784 ath12k_mac_11d_scan_stop_all(ar->ab); in ath12k_mac_vdev_create()
9789 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath12k_mac_vdev_create()
9792 ath12k_warn(ar->ab, "failed to set vdev %d RX wake policy: %d\n", in ath12k_mac_vdev_create()
9793 arvif->vdev_id, ret); in ath12k_mac_vdev_create()
9799 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath12k_mac_vdev_create()
9802 ath12k_warn(ar->ab, "failed to set vdev %d TX wake threshold: %d\n", in ath12k_mac_vdev_create()
9803 arvif->vdev_id, ret); in ath12k_mac_vdev_create()
9809 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath12k_mac_vdev_create()
9812 ath12k_warn(ar->ab, "failed to set vdev %d pspoll count: %d\n", in ath12k_mac_vdev_create()
9813 arvif->vdev_id, ret); in ath12k_mac_vdev_create()
9817 ret = ath12k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id, false); in ath12k_mac_vdev_create()
9819 ath12k_warn(ar->ab, "failed to disable vdev %d ps mode: %d\n", in ath12k_mac_vdev_create()
9820 arvif->vdev_id, ret); in ath12k_mac_vdev_create()
9824 if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ab->wmi_ab.svc_map) && in ath12k_mac_vdev_create()
9825 ahvif->vdev_type == WMI_VDEV_TYPE_STA && in ath12k_mac_vdev_create()
9826 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE) { in ath12k_mac_vdev_create()
9827 reinit_completion(&ar->completed_11d_scan); in ath12k_mac_vdev_create()
9828 ar->state_11d = ATH12K_11D_PREPARING; in ath12k_mac_vdev_create()
9832 ar->monitor_vdev_created = true; in ath12k_mac_vdev_create()
9839 arvif->txpower = link_conf->txpower; in ath12k_mac_vdev_create()
9841 arvif->txpower = NL80211_TX_POWER_AUTOMATIC; in ath12k_mac_vdev_create()
9848 param_value = hw->wiphy->rts_threshold; in ath12k_mac_vdev_create()
9849 ar->rts_threshold = param_value; in ath12k_mac_vdev_create()
9850 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_vdev_create()
9853 ath12k_warn(ar->ab, "failed to set rts threshold for vdev %d: %d\n", in ath12k_mac_vdev_create()
9854 arvif->vdev_id, ret); in ath12k_mac_vdev_create()
9862 if (ahvif->vdev_type == WMI_VDEV_TYPE_AP) { in ath12k_mac_vdev_create()
9863 reinit_completion(&ar->peer_delete_done); in ath12k_mac_vdev_create()
9865 ret = ath12k_wmi_send_peer_delete_cmd(ar, arvif->bssid, in ath12k_mac_vdev_create()
9866 arvif->vdev_id); in ath12k_mac_vdev_create()
9868 ath12k_warn(ar->ab, "failed to delete peer vdev_id %d addr %pM\n", in ath12k_mac_vdev_create()
9869 arvif->vdev_id, arvif->bssid); in ath12k_mac_vdev_create()
9873 ret = ath12k_wait_for_peer_delete_done(ar, arvif->vdev_id, in ath12k_mac_vdev_create()
9874 arvif->bssid); in ath12k_mac_vdev_create()
9878 ar->num_peers--; in ath12k_mac_vdev_create()
9882 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { in ath12k_mac_vdev_create()
9883 ar->monitor_vdev_id = -1; in ath12k_mac_vdev_create()
9884 ar->monitor_vdev_created = false; in ath12k_mac_vdev_create()
9887 ath12k_wmi_vdev_delete(ar, arvif->vdev_id); in ath12k_mac_vdev_create()
9888 ar->num_created_vdevs--; in ath12k_mac_vdev_create()
9889 arvif->is_created = false; in ath12k_mac_vdev_create()
9890 arvif->ar = NULL; in ath12k_mac_vdev_create()
9891 ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id); in ath12k_mac_vdev_create()
9892 ab->free_vdev_map |= 1LL << arvif->vdev_id; in ath12k_mac_vdev_create()
9893 ab->free_vdev_stats_id_map &= ~(1LL << arvif->vdev_stats_id); in ath12k_mac_vdev_create()
9894 spin_lock_bh(&ar->data_lock); in ath12k_mac_vdev_create()
9895 list_del(&arvif->list); in ath12k_mac_vdev_create()
9896 spin_unlock_bh(&ar->data_lock); in ath12k_mac_vdev_create()
9899 arvif->ar = NULL; in ath12k_mac_vdev_create()
9906 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_mac_vif_flush_key_cache()
9907 struct ath12k_hw *ah = ahvif->ah; in ath12k_mac_vif_flush_key_cache()
9910 struct ath12k_vif_cache *cache = ahvif->cache[arvif->link_id]; in ath12k_mac_vif_flush_key_cache()
9913 lockdep_assert_wiphy(ah->hw->wiphy); in ath12k_mac_vif_flush_key_cache()
9915 list_for_each_entry_safe(key_conf, tmp, &cache->key_conf.list, list) { in ath12k_mac_vif_flush_key_cache()
9917 if (key_conf->sta) { in ath12k_mac_vif_flush_key_cache()
9918 ahsta = ath12k_sta_to_ahsta(key_conf->sta); in ath12k_mac_vif_flush_key_cache()
9919 arsta = wiphy_dereference(ah->hw->wiphy, in ath12k_mac_vif_flush_key_cache()
9920 ahsta->link[arvif->link_id]); in ath12k_mac_vif_flush_key_cache()
9925 ret = ath12k_mac_set_key(arvif->ar, key_conf->cmd, in ath12k_mac_vif_flush_key_cache()
9927 key_conf->key); in ath12k_mac_vif_flush_key_cache()
9929 ath12k_warn(arvif->ar->ab, "unable to apply set key param to vdev %d ret %d\n", in ath12k_mac_vif_flush_key_cache()
9930 arvif->vdev_id, ret); in ath12k_mac_vif_flush_key_cache()
9932 list_del(&key_conf->list); in ath12k_mac_vif_flush_key_cache()
9939 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_mac_vif_cache_flush()
9941 struct ath12k_vif_cache *cache = ahvif->cache[arvif->link_id]; in ath12k_mac_vif_cache_flush()
9942 struct ath12k_base *ab = ar->ab; in ath12k_mac_vif_cache_flush()
9947 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_vif_cache_flush()
9952 if (cache->tx_conf.changed) { in ath12k_mac_vif_cache_flush()
9953 ret = ath12k_mac_conf_tx(arvif, cache->tx_conf.ac, in ath12k_mac_vif_cache_flush()
9954 &cache->tx_conf.tx_queue_params); in ath12k_mac_vif_cache_flush()
9961 if (cache->bss_conf_changed) { in ath12k_mac_vif_cache_flush()
9964 ath12k_warn(ar->ab, "unable to access bss link conf in cache flush for vif %pM link %u\n", in ath12k_mac_vif_cache_flush()
9965 vif->addr, arvif->link_id); in ath12k_mac_vif_cache_flush()
9969 cache->bss_conf_changed); in ath12k_mac_vif_cache_flush()
9972 if (!list_empty(&cache->key_conf.list)) in ath12k_mac_vif_cache_flush()
9975 ath12k_ahvif_put_link_cache(ahvif, arvif->link_id); in ath12k_mac_vif_cache_flush()
9982 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_mac_assign_vif_to_vdev()
9985 struct ath12k_hw *ah = hw->priv; in ath12k_mac_assign_vif_to_vdev()
9988 u8 link_id = arvif->link_id, scan_link_id; in ath12k_mac_assign_vif_to_vdev()
9992 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_assign_vif_to_vdev()
9994 if (ah->num_radio == 1) in ath12k_mac_assign_vif_to_vdev()
9995 ar = ah->radio; in ath12k_mac_assign_vif_to_vdev()
10008 scan_link_map = ahvif->links_map & ATH12K_SCAN_LINKS_MASK; in ath12k_mac_assign_vif_to_vdev()
10010 scan_arvif = wiphy_dereference(hw->wiphy, in ath12k_mac_assign_vif_to_vdev()
10011 ahvif->link[scan_link_id]); in ath12k_mac_assign_vif_to_vdev()
10012 if (scan_arvif && scan_arvif->ar == ar) { in ath12k_mac_assign_vif_to_vdev()
10013 ar->scan.arvif = NULL; in ath12k_mac_assign_vif_to_vdev()
10021 if (arvif->ar) { in ath12k_mac_assign_vif_to_vdev()
10023 if (WARN_ON(!arvif->is_created)) { in ath12k_mac_assign_vif_to_vdev()
10024 arvif->ar = NULL; in ath12k_mac_assign_vif_to_vdev()
10028 if (ah->num_radio == 1) in ath12k_mac_assign_vif_to_vdev()
10029 return arvif->ar; in ath12k_mac_assign_vif_to_vdev()
10035 if (ar != arvif->ar) { in ath12k_mac_assign_vif_to_vdev()
10036 if (WARN_ON(arvif->is_started)) in ath12k_mac_assign_vif_to_vdev()
10044 ab = ar->ab; in ath12k_mac_assign_vif_to_vdev()
10050 if (vif->type == NL80211_IFTYPE_AP && in ath12k_mac_assign_vif_to_vdev()
10051 ar->num_peers > (ar->max_num_peers - 1)) { in ath12k_mac_assign_vif_to_vdev()
10056 if (arvif->is_created) in ath12k_mac_assign_vif_to_vdev()
10059 if (ar->num_created_vdevs > (TARGET_NUM_VDEVS(ab) - 1)) { in ath12k_mac_assign_vif_to_vdev()
10060 ath12k_warn(ab, "failed to create vdev, reached max vdev limit %d\n", in ath12k_mac_assign_vif_to_vdev()
10067 ath12k_warn(ab, "failed to create vdev %pM ret %d", vif->addr, ret); in ath12k_mac_assign_vif_to_vdev()
10078 return arvif->ar; in ath12k_mac_assign_vif_to_vdev()
10092 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_add_interface()
10096 ahvif->ah = ah; in ath12k_mac_op_add_interface()
10097 ahvif->vif = vif; in ath12k_mac_op_add_interface()
10098 arvif = &ahvif->deflink; in ath12k_mac_op_add_interface()
10100 ath12k_mac_init_arvif(ahvif, arvif, -1); in ath12k_mac_op_add_interface()
10103 vif->cab_queue = ATH12K_HW_DEFAULT_QUEUE; in ath12k_mac_op_add_interface()
10104 for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++) in ath12k_mac_op_add_interface()
10105 vif->hw_queue[i] = ATH12K_HW_DEFAULT_QUEUE; in ath12k_mac_op_add_interface()
10107 vif->driver_flags |= IEEE80211_VIF_SUPPORTS_UAPSD; in ath12k_mac_op_add_interface()
10115 ab = ar->ab; in ath12k_mac_op_add_interface()
10116 reg_info = ab->reg_info[ar->pdev_idx]; in ath12k_mac_op_add_interface()
10118 ah->regd_updated = false; in ath12k_mac_op_add_interface()
10119 ath12k_reg_handle_chan_list(ab, reg_info, ahvif->vdev_type, in ath12k_mac_op_add_interface()
10138 spin_lock_bh(&dp->tx_desc_lock[i]); in ath12k_mac_vif_unref()
10140 list_for_each_entry(tx_desc_info, &dp->tx_desc_used_list[i], in ath12k_mac_vif_unref()
10142 skb = tx_desc_info->skb; in ath12k_mac_vif_unref()
10147 if (skb_cb->vif == vif) in ath12k_mac_vif_unref()
10148 skb_cb->vif = NULL; in ath12k_mac_vif_unref()
10151 spin_unlock_bh(&dp->tx_desc_lock[i]); in ath12k_mac_vif_unref()
10157 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_mac_vdev_delete()
10159 struct ath12k_base *ab = ar->ab; in ath12k_mac_vdev_delete()
10163 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_vdev_delete()
10165 reinit_completion(&ar->vdev_delete_done); in ath12k_mac_vdev_delete()
10167 ret = ath12k_wmi_vdev_delete(ar, arvif->vdev_id); in ath12k_mac_vdev_delete()
10170 arvif->vdev_id, ret); in ath12k_mac_vdev_delete()
10174 time_left = wait_for_completion_timeout(&ar->vdev_delete_done, in ath12k_mac_vdev_delete()
10181 ab->free_vdev_map |= 1LL << arvif->vdev_id; in ath12k_mac_vdev_delete()
10182 ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id); in ath12k_mac_vdev_delete()
10183 ar->num_created_vdevs--; in ath12k_mac_vdev_delete()
10185 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { in ath12k_mac_vdev_delete()
10186 ar->monitor_vdev_id = -1; in ath12k_mac_vdev_delete()
10187 ar->monitor_vdev_created = false; in ath12k_mac_vdev_delete()
10191 vif->addr, arvif->vdev_id); in ath12k_mac_vdev_delete()
10194 spin_lock_bh(&ar->data_lock); in ath12k_mac_vdev_delete()
10195 list_del(&arvif->list); in ath12k_mac_vdev_delete()
10196 spin_unlock_bh(&ar->data_lock); in ath12k_mac_vdev_delete()
10198 ath12k_peer_cleanup(ar, arvif->vdev_id); in ath12k_mac_vdev_delete()
10199 ath12k_ahvif_put_link_cache(ahvif, arvif->link_id); in ath12k_mac_vdev_delete()
10201 idr_for_each(&ar->txmgmt_idr, in ath12k_mac_vdev_delete()
10204 ath12k_mac_vif_unref(&ab->dp, vif); in ath12k_mac_vdev_delete()
10205 ath12k_dp_tx_put_bank_profile(&ab->dp, arvif->bank_id); in ath12k_mac_vdev_delete()
10211 arvif->is_created = false; in ath12k_mac_vdev_delete()
10212 arvif->ar = NULL; in ath12k_mac_vdev_delete()
10225 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_remove_interface()
10232 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); in ath12k_mac_op_remove_interface()
10233 if (!arvif || !arvif->is_created) in ath12k_mac_op_remove_interface()
10236 ar = arvif->ar; in ath12k_mac_op_remove_interface()
10242 if (ar->scan.arvif == arvif) { in ath12k_mac_op_remove_interface()
10243 wiphy_work_cancel(hw->wiphy, &ar->scan.vdev_clean_wk); in ath12k_mac_op_remove_interface()
10245 spin_lock_bh(&ar->data_lock); in ath12k_mac_op_remove_interface()
10246 ar->scan.arvif = NULL; in ath12k_mac_op_remove_interface()
10247 if (!ar->scan.is_roc) { in ath12k_mac_op_remove_interface()
10255 ar->scan.state = ATH12K_SCAN_IDLE; in ath12k_mac_op_remove_interface()
10256 ar->scan_channel = NULL; in ath12k_mac_op_remove_interface()
10257 ar->scan.roc_freq = 0; in ath12k_mac_op_remove_interface()
10258 spin_unlock_bh(&ar->data_lock); in ath12k_mac_op_remove_interface()
10284 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_configure_filter()
10289 ar->filter_flags = *total_flags; in ath12k_mac_op_configure_filter()
10300 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_get_antenna()
10303 antennas_rx = max_t(u32, antennas_rx, ar->cfg_rx_chainmask); in ath12k_mac_op_get_antenna()
10304 antennas_tx = max_t(u32, antennas_tx, ar->cfg_tx_chainmask); in ath12k_mac_op_get_antenna()
10321 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_set_antenna()
10338 int ret = -EINVAL; in ath12k_mac_ampdu_action()
10340 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_ampdu_action()
10344 return -EINVAL; in ath12k_mac_ampdu_action()
10346 switch (params->action) { in ath12k_mac_ampdu_action()
10358 /* Tx A-MPDU aggregation offloaded to hw/fw so deny mac80211 in ath12k_mac_ampdu_action()
10361 ret = -EOPNOTSUPP; in ath12k_mac_ampdu_action()
10366 ath12k_warn(ar->ab, "unable to perform ampdu action %d for vif %pM link %u ret %d\n", in ath12k_mac_ampdu_action()
10367 params->action, vif->addr, link_id, ret); in ath12k_mac_ampdu_action()
10376 struct ieee80211_sta *sta = params->sta; in ath12k_mac_op_ampdu_action()
10378 unsigned long links_map = ahsta->links_map; in ath12k_mac_op_ampdu_action()
10379 int ret = -EINVAL; in ath12k_mac_op_ampdu_action()
10382 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_ampdu_action()
10402 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_add_chanctx()
10406 return -EINVAL; in ath12k_mac_op_add_chanctx()
10408 ab = ar->ab; in ath12k_mac_op_add_chanctx()
10411 "mac chanctx add freq %u width %d ptr %p\n", in ath12k_mac_op_add_chanctx()
10412 ctx->def.chan->center_freq, ctx->def.width, ctx); in ath12k_mac_op_add_chanctx()
10414 spin_lock_bh(&ar->data_lock); in ath12k_mac_op_add_chanctx()
10418 ar->rx_channel = ctx->def.chan; in ath12k_mac_op_add_chanctx()
10419 spin_unlock_bh(&ar->data_lock); in ath12k_mac_op_add_chanctx()
10420 ar->chan_tx_pwr = ATH12K_PDEV_TX_POWER_INVALID; in ath12k_mac_op_add_chanctx()
10431 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_remove_chanctx()
10437 ab = ar->ab; in ath12k_mac_op_remove_chanctx()
10440 "mac chanctx remove freq %u width %d ptr %p\n", in ath12k_mac_op_remove_chanctx()
10441 ctx->def.chan->center_freq, ctx->def.width, ctx); in ath12k_mac_op_remove_chanctx()
10443 spin_lock_bh(&ar->data_lock); in ath12k_mac_op_remove_chanctx()
10447 ar->rx_channel = NULL; in ath12k_mac_op_remove_chanctx()
10448 spin_unlock_bh(&ar->data_lock); in ath12k_mac_op_remove_chanctx()
10449 ar->chan_tx_pwr = ATH12K_PDEV_TX_POWER_INVALID; in ath12k_mac_op_remove_chanctx()
10460 int n = ar->mac.sbands[band].n_iftype_data; in ath12k_mac_check_down_grade_phy_mode()
10467 data = ar->mac.iftype[band]; in ath12k_mac_check_down_grade_phy_mode()
10475 if (eht_cap && eht_cap->has_eht) in ath12k_mac_check_down_grade_phy_mode()
10507 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_check_down_grade_phy_mode()
10519 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_mac_mlo_get_vdev_args()
10526 lockdep_assert_wiphy(ahvif->ah->hw->wiphy); in ath12k_mac_mlo_get_vdev_args()
10531 if (hweight16(ahvif->vif->valid_links) > ATH12K_WMI_MLO_MAX_LINKS) in ath12k_mac_mlo_get_vdev_args()
10534 ml_arg->enabled = true; in ath12k_mac_mlo_get_vdev_args()
10540 ml_arg->link_add = true; in ath12k_mac_mlo_get_vdev_args()
10542 ml_arg->assoc_link = arvif->is_sta_assoc_link; in ath12k_mac_mlo_get_vdev_args()
10544 partner_info = ml_arg->partner_info; in ath12k_mac_mlo_get_vdev_args()
10546 links = ahvif->links_map; in ath12k_mac_mlo_get_vdev_args()
10548 arvif_p = wiphy_dereference(ahvif->ah->hw->wiphy, ahvif->link[link_id]); in ath12k_mac_mlo_get_vdev_args()
10556 if (!arvif_p->is_created) in ath12k_mac_mlo_get_vdev_args()
10559 link_conf = wiphy_dereference(ahvif->ah->hw->wiphy, in ath12k_mac_mlo_get_vdev_args()
10560 ahvif->vif->link_conf[arvif_p->link_id]); in ath12k_mac_mlo_get_vdev_args()
10565 partner_info->vdev_id = arvif_p->vdev_id; in ath12k_mac_mlo_get_vdev_args()
10566 partner_info->hw_link_id = arvif_p->ar->pdev->hw_link_id; in ath12k_mac_mlo_get_vdev_args()
10567 ether_addr_copy(partner_info->addr, link_conf->addr); in ath12k_mac_mlo_get_vdev_args()
10568 ml_arg->num_partner_links++; in ath12k_mac_mlo_get_vdev_args()
10578 struct ath12k *ar = arvif->ar; in ath12k_mac_vdev_start_restart()
10579 struct ath12k_base *ab = ar->ab; in ath12k_mac_vdev_start_restart()
10581 const struct cfg80211_chan_def *chandef = &ctx->def; in ath12k_mac_vdev_start_restart()
10583 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_mac_vdev_start_restart()
10588 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_vdev_start_restart()
10592 ath12k_warn(ar->ab, "unable to access bss link conf in vdev start for vif %pM link %u\n", in ath12k_mac_vdev_start_restart()
10593 ahvif->vif->addr, arvif->link_id); in ath12k_mac_vdev_start_restart()
10594 return -ENOLINK; in ath12k_mac_vdev_start_restart()
10597 reinit_completion(&ar->vdev_setup_done); in ath12k_mac_vdev_start_restart()
10599 arg.vdev_id = arvif->vdev_id; in ath12k_mac_vdev_start_restart()
10600 arg.dtim_period = arvif->dtim_period; in ath12k_mac_vdev_start_restart()
10601 arg.bcn_intval = arvif->beacon_interval; in ath12k_mac_vdev_start_restart()
10602 arg.punct_bitmap = ~arvif->punct_bitmap; in ath12k_mac_vdev_start_restart()
10604 arg.freq = chandef->chan->center_freq; in ath12k_mac_vdev_start_restart()
10605 arg.band_center_freq1 = chandef->center_freq1; in ath12k_mac_vdev_start_restart()
10606 arg.band_center_freq2 = chandef->center_freq2; in ath12k_mac_vdev_start_restart()
10607 arg.mode = ath12k_phymodes[chandef->chan->band][chandef->width]; in ath12k_mac_vdev_start_restart()
10610 chandef->chan->band, in ath12k_mac_vdev_start_restart()
10611 ahvif->vif->type); in ath12k_mac_vdev_start_restart()
10613 arg.max_power = chandef->chan->max_power; in ath12k_mac_vdev_start_restart()
10614 arg.max_reg_power = chandef->chan->max_reg_power; in ath12k_mac_vdev_start_restart()
10615 arg.max_antenna_gain = chandef->chan->max_antenna_gain; in ath12k_mac_vdev_start_restart()
10617 arg.pref_tx_streams = ar->num_tx_chains; in ath12k_mac_vdev_start_restart()
10618 arg.pref_rx_streams = ar->num_rx_chains; in ath12k_mac_vdev_start_restart()
10623 ar->ab->wmi_ab.svc_map)) { in ath12k_mac_vdev_start_restart()
10631 if (ahvif->vdev_type == WMI_VDEV_TYPE_AP) { in ath12k_mac_vdev_start_restart()
10632 arg.ssid = ahvif->u.ap.ssid; in ath12k_mac_vdev_start_restart()
10633 arg.ssid_len = ahvif->u.ap.ssid_len; in ath12k_mac_vdev_start_restart()
10634 arg.hidden_ssid = ahvif->u.ap.hidden_ssid; in ath12k_mac_vdev_start_restart()
10637 arg.chan_radar = !!(chandef->chan->flags & IEEE80211_CHAN_RADAR); in ath12k_mac_vdev_start_restart()
10639 arg.freq2_radar = ctx->radar_enabled; in ath12k_mac_vdev_start_restart()
10643 spin_lock_bh(&ab->base_lock); in ath12k_mac_vdev_start_restart()
10644 arg.regdomain = ar->ab->dfs_region; in ath12k_mac_vdev_start_restart()
10645 spin_unlock_bh(&ab->base_lock); in ath12k_mac_vdev_start_restart()
10650 arg.passive |= !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR); in ath12k_mac_vdev_start_restart()
10657 arg.vdev_id, arg.freq, in ath12k_mac_vdev_start_restart()
10662 ath12k_warn(ar->ab, "failed to %s WMI vdev %i\n", in ath12k_mac_vdev_start_restart()
10679 ath12k_wmi_send_vdev_set_tpc_power(ar, arvif->vdev_id, in ath12k_mac_vdev_start_restart()
10680 &arvif->reg_tpc_info); in ath12k_mac_vdev_start_restart()
10683 ar->num_started_vdevs++; in ath12k_mac_vdev_start_restart()
10685 ahvif->vif->addr, arvif->vdev_id); in ath12k_mac_vdev_start_restart()
10687 /* Enable CAC Running Flag in the driver by checking all sub-channel's DFS in ath12k_mac_vdev_start_restart()
10693 if (arvif->ahvif->vdev_type == WMI_VDEV_TYPE_AP && ctx->radar_enabled && in ath12k_mac_vdev_start_restart()
10694 cfg80211_chandef_dfs_usable(hw->wiphy, chandef)) { in ath12k_mac_vdev_start_restart()
10695 set_bit(ATH12K_FLAG_CAC_RUNNING, &ar->dev_flags); in ath12k_mac_vdev_start_restart()
10696 dfs_cac_time = cfg80211_chandef_dfs_cac_time(hw->wiphy, chandef); in ath12k_mac_vdev_start_restart()
10700 dfs_cac_time, arg.freq, arg.band_center_freq1, arg.vdev_id); in ath12k_mac_vdev_start_restart()
10706 arvif->vdev_id, ret); in ath12k_mac_vdev_start_restart()
10742 lockdep_assert_wiphy(ahvif->ah->hw->wiphy); in ath12k_mac_change_chanctx_cnt_iter()
10744 links_map = ahvif->links_map; in ath12k_mac_change_chanctx_cnt_iter()
10746 arvif = wiphy_dereference(ahvif->ah->hw->wiphy, ahvif->link[link_id]); in ath12k_mac_change_chanctx_cnt_iter()
10750 if (!arvif->is_created || arvif->ar != arg->ar) in ath12k_mac_change_chanctx_cnt_iter()
10753 link_conf = wiphy_dereference(ahvif->ah->hw->wiphy, in ath12k_mac_change_chanctx_cnt_iter()
10754 vif->link_conf[link_id]); in ath12k_mac_change_chanctx_cnt_iter()
10758 if (rcu_access_pointer(link_conf->chanctx_conf) != arg->ctx) in ath12k_mac_change_chanctx_cnt_iter()
10761 arg->n_vifs++; in ath12k_mac_change_chanctx_cnt_iter()
10777 lockdep_assert_wiphy(ahvif->ah->hw->wiphy); in ath12k_mac_change_chanctx_fill_iter()
10779 links_map = ahvif->links_map; in ath12k_mac_change_chanctx_fill_iter()
10781 arvif = wiphy_dereference(ahvif->ah->hw->wiphy, ahvif->link[link_id]); in ath12k_mac_change_chanctx_fill_iter()
10785 if (!arvif->is_created || arvif->ar != arg->ar) in ath12k_mac_change_chanctx_fill_iter()
10788 link_conf = wiphy_dereference(ahvif->ah->hw->wiphy, in ath12k_mac_change_chanctx_fill_iter()
10789 vif->link_conf[arvif->link_id]); in ath12k_mac_change_chanctx_fill_iter()
10793 ctx = rcu_access_pointer(link_conf->chanctx_conf); in ath12k_mac_change_chanctx_fill_iter()
10794 if (ctx != arg->ctx) in ath12k_mac_change_chanctx_fill_iter()
10797 if (WARN_ON(arg->next_vif == arg->n_vifs)) in ath12k_mac_change_chanctx_fill_iter()
10800 arg->vifs[arg->next_vif].vif = vif; in ath12k_mac_change_chanctx_fill_iter()
10801 arg->vifs[arg->next_vif].old_ctx = ctx; in ath12k_mac_change_chanctx_fill_iter()
10802 arg->vifs[arg->next_vif].new_ctx = ctx; in ath12k_mac_change_chanctx_fill_iter()
10803 arg->vifs[arg->next_vif].link_conf = link_conf; in ath12k_mac_change_chanctx_fill_iter()
10804 arg->next_vif++; in ath12k_mac_change_chanctx_fill_iter()
10840 if (arvif->ahvif->vdev_type != WMI_VDEV_TYPE_STA) in ath12k_mac_update_peer_puncturing_width()
10848 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_update_peer_puncturing_width()
10850 def.punctured, def.width, arvif->vdev_id); in ath12k_mac_update_peer_puncturing_width()
10852 ret = ath12k_wmi_set_peer_param(ar, arvif->bssid, in ath12k_mac_update_peer_puncturing_width()
10853 arvif->vdev_id, param_id, in ath12k_mac_update_peer_puncturing_width()
10867 struct ath12k_base *ab = ar->ab; in ath12k_mac_update_vif_chan()
10875 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_update_vif_chan()
10881 link_id = link_conf->link_id; in ath12k_mac_update_vif_chan()
10882 arvif = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy, in ath12k_mac_update_vif_chan()
10883 ahvif->link[link_id]); in ath12k_mac_update_vif_chan()
10885 if (vif->type == NL80211_IFTYPE_MONITOR) { in ath12k_mac_update_vif_chan()
10891 "mac chanctx switch vdev_id %i freq %u->%u width %d->%d\n", in ath12k_mac_update_vif_chan()
10892 arvif->vdev_id, in ath12k_mac_update_vif_chan()
10893 vifs[i].old_ctx->def.chan->center_freq, in ath12k_mac_update_vif_chan()
10894 vifs[i].new_ctx->def.chan->center_freq, in ath12k_mac_update_vif_chan()
10895 vifs[i].old_ctx->def.width, in ath12k_mac_update_vif_chan()
10896 vifs[i].new_ctx->def.width); in ath12k_mac_update_vif_chan()
10898 if (WARN_ON(!arvif->is_started)) in ath12k_mac_update_vif_chan()
10901 arvif->punct_bitmap = vifs[i].new_ctx->def.punctured; in ath12k_mac_update_vif_chan()
10904 * If vdev is down then it expect vdev_stop->vdev_start. in ath12k_mac_update_vif_chan()
10906 if (arvif->is_up) { in ath12k_mac_update_vif_chan()
10910 arvif->vdev_id, ret); in ath12k_mac_update_vif_chan()
10917 arvif->vdev_id, ret); in ath12k_mac_update_vif_chan()
10924 arvif->vdev_id, ret); in ath12k_mac_update_vif_chan()
10934 params.vdev_id = arvif->vdev_id; in ath12k_mac_update_vif_chan()
10935 params.aid = ahvif->aid; in ath12k_mac_update_vif_chan()
10936 params.bssid = arvif->bssid; in ath12k_mac_update_vif_chan()
10939 params.nontx_profile_idx = link_conf->bssid_index; in ath12k_mac_update_vif_chan()
10940 params.nontx_profile_cnt = 1 << link_conf->bssid_indicator; in ath12k_mac_update_vif_chan()
10942 ret = ath12k_wmi_vdev_up(arvif->ar, ¶ms); in ath12k_mac_update_vif_chan()
10945 arvif->vdev_id, ret); in ath12k_mac_update_vif_chan()
10949 ret = ath12k_mac_update_peer_puncturing_width(arvif->ar, arvif, in ath12k_mac_update_vif_chan()
10950 vifs[i].new_ctx->def); in ath12k_mac_update_vif_chan()
10952 ath12k_warn(ar->ab, in ath12k_mac_update_vif_chan()
10954 vifs[i].new_ctx->def.punctured, in ath12k_mac_update_vif_chan()
10955 vifs[i].new_ctx->def.width, ret); in ath12k_mac_update_vif_chan()
10961 if (!monitor_vif && ar->monitor_vdev_created) { in ath12k_mac_update_vif_chan()
10974 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_update_active_vif_chan()
11004 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_change_chanctx()
11010 ab = ar->ab; in ath12k_mac_op_change_chanctx()
11013 "mac chanctx change freq %u width %d ptr %p changed %x\n", in ath12k_mac_op_change_chanctx()
11014 ctx->def.chan->center_freq, ctx->def.width, ctx, changed); in ath12k_mac_op_change_chanctx()
11033 struct ath12k_base *ab = ar->ab; in ath12k_start_vdev_delay()
11034 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_start_vdev_delay()
11035 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); in ath12k_start_vdev_delay()
11040 if (WARN_ON(arvif->is_started)) in ath12k_start_vdev_delay()
11041 return -EBUSY; in ath12k_start_vdev_delay()
11045 ath12k_warn(ab, "failed to get link conf for vdev %u\n", arvif->vdev_id); in ath12k_start_vdev_delay()
11046 return -EINVAL; in ath12k_start_vdev_delay()
11049 chanctx = wiphy_dereference(ath12k_ar_to_hw(arvif->ar)->wiphy, in ath12k_start_vdev_delay()
11050 link_conf->chanctx_conf); in ath12k_start_vdev_delay()
11053 ath12k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n", in ath12k_start_vdev_delay()
11054 arvif->vdev_id, vif->addr, in ath12k_start_vdev_delay()
11055 chanctx->def.chan->center_freq, ret); in ath12k_start_vdev_delay()
11059 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { in ath12k_start_vdev_delay()
11060 ret = ath12k_monitor_vdev_up(ar, arvif->vdev_id); in ath12k_start_vdev_delay()
11067 arvif->is_started = true; in ath12k_start_vdev_delay()
11075 if (chan_def->chan->flags & IEEE80211_CHAN_PSD) { in ath12k_mac_get_num_pwr_levels()
11076 switch (chan_def->width) { in ath12k_mac_get_num_pwr_levels()
11091 switch (chan_def->width) { in ath12k_mac_get_num_pwr_levels()
11115 * with center frequency 5955, its diff is 5965 - 5955 = 10. in ath12k_mac_get_6ghz_start_frequency()
11117 * with center frequency 5955, its diff is 5985 - 5955 = 30. in ath12k_mac_get_6ghz_start_frequency()
11119 * with center frequency 5955, its diff is 6025 - 5955 = 70. in ath12k_mac_get_6ghz_start_frequency()
11121 * with center frequency 5955, its diff is 6105 - 5955 = 70. in ath12k_mac_get_6ghz_start_frequency()
11123 switch (chan_def->width) { in ath12k_mac_get_6ghz_start_frequency()
11140 return chan_def->center_freq1 - diff_seq; in ath12k_mac_get_6ghz_start_frequency()
11153 * center frequency is 5955 when bandwidth=20 MHz, its diff is 5955 - 5955 = 0. in ath12k_mac_get_seg_freq()
11155 * center frequency is 5965 when bandwidth=40 MHz, its diff is 5965 - 5955 = 10. in ath12k_mac_get_seg_freq()
11157 * center frequency is 5985 when bandwidth=80 MHz, its diff is 5985 - 5955 = 30. in ath12k_mac_get_seg_freq()
11159 * center frequency is 6025 when bandwidth=160 MHz, its diff is 6025 - 5955 = 70. in ath12k_mac_get_seg_freq()
11161 seg_seq = 10 * (BIT(seq) - 1); in ath12k_mac_get_seg_freq()
11185 *temp_chan = ieee80211_get_channel(ar->ah->hw->wiphy, *center_freq); in ath12k_mac_get_psd_channel()
11186 *tx_power = (*temp_chan)->max_reg_power; in ath12k_mac_get_psd_channel()
11216 *temp_chan = ieee80211_get_channel(ar->ah->hw->wiphy, *center_freq); in ath12k_mac_get_eirp_power()
11217 *tx_power = (*temp_chan)->max_reg_power; in ath12k_mac_get_eirp_power()
11224 struct ath12k_base *ab = ar->ab; in ath12k_mac_fill_reg_tpc_info()
11225 struct ath12k_reg_tpc_power_info *reg_tpc_info = &arvif->reg_tpc_info; in ath12k_mac_fill_reg_tpc_info()
11232 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_mac_fill_reg_tpc_info()
11236 chan = ctx->def.chan; in ath12k_mac_fill_reg_tpc_info()
11237 start_freq = ath12k_mac_get_6ghz_start_frequency(&ctx->def); in ath12k_mac_fill_reg_tpc_info()
11238 pwr_reduction = bss_conf->pwr_reduction; in ath12k_mac_fill_reg_tpc_info()
11240 if (arvif->reg_tpc_info.num_pwr_levels) { in ath12k_mac_fill_reg_tpc_info()
11242 num_pwr_levels = arvif->reg_tpc_info.num_pwr_levels; in ath12k_mac_fill_reg_tpc_info()
11244 num_pwr_levels = ath12k_mac_get_num_pwr_levels(&ctx->def); in ath12k_mac_fill_reg_tpc_info()
11251 if (chan->flags & IEEE80211_CHAN_PSD) { in ath12k_mac_fill_reg_tpc_info()
11253 if (reg_tpc_info->is_psd_power) { in ath12k_mac_fill_reg_tpc_info()
11261 psd_power = temp_chan->psd; in ath12k_mac_fill_reg_tpc_info()
11266 reg_tpc_info->tpe[pwr_lvl_idx]); in ath12k_mac_fill_reg_tpc_info()
11274 &ctx->def, in ath12k_mac_fill_reg_tpc_info()
11276 psd_power = temp_chan->psd; in ath12k_mac_fill_reg_tpc_info()
11286 reg_tpc_info->tpe[pwr_lvl_idx]); in ath12k_mac_fill_reg_tpc_info()
11291 if (reg_tpc_info->is_psd_power) { in ath12k_mac_fill_reg_tpc_info()
11301 reg_tpc_info->tpe[pwr_lvl_idx]; in ath12k_mac_fill_reg_tpc_info()
11309 &ctx->def, in ath12k_mac_fill_reg_tpc_info()
11314 reg_tpc_info->tpe[pwr_lvl_idx]); in ath12k_mac_fill_reg_tpc_info()
11320 if (chan->flags & IEEE80211_CHAN_PSD) { in ath12k_mac_fill_reg_tpc_info()
11328 psd_power = temp_chan->psd; in ath12k_mac_fill_reg_tpc_info()
11337 &ctx->def, in ath12k_mac_fill_reg_tpc_info()
11346 eirp_power = eirp_power - pwr_reduction; in ath12k_mac_fill_reg_tpc_info()
11354 eirp_power, ar->max_allowed_tx_power); in ath12k_mac_fill_reg_tpc_info()
11363 if (ar->max_allowed_tx_power && ab->hw_params->idle_ps) in ath12k_mac_fill_reg_tpc_info()
11366 ar->max_allowed_tx_power); in ath12k_mac_fill_reg_tpc_info()
11371 max_tx_power[pwr_lvl_idx] - pwr_reduction; in ath12k_mac_fill_reg_tpc_info()
11376 if (ar->max_allowed_tx_power && ab->hw_params->idle_ps) in ath12k_mac_fill_reg_tpc_info()
11380 ar->max_allowed_tx_power); in ath12k_mac_fill_reg_tpc_info()
11382 reg_tpc_info->chan_power_info[pwr_lvl_idx].chan_cfreq = center_freq; in ath12k_mac_fill_reg_tpc_info()
11383 reg_tpc_info->chan_power_info[pwr_lvl_idx].tx_power = in ath12k_mac_fill_reg_tpc_info()
11387 reg_tpc_info->num_pwr_levels = num_pwr_levels; in ath12k_mac_fill_reg_tpc_info()
11388 reg_tpc_info->is_psd_power = is_psd_power; in ath12k_mac_fill_reg_tpc_info()
11389 reg_tpc_info->eirp_power = eirp_power; in ath12k_mac_fill_reg_tpc_info()
11390 if (ahvif->vdev_type == WMI_VDEV_TYPE_STA) in ath12k_mac_fill_reg_tpc_info()
11391 reg_6ghz_power_mode = bss_conf->power_type; in ath12k_mac_fill_reg_tpc_info()
11396 reg_tpc_info->ap_power_type = in ath12k_mac_fill_reg_tpc_info()
11404 struct ath12k_reg_tpc_power_info *tpc_info = &arvif->reg_tpc_info; in ath12k_mac_parse_tx_pwr_env()
11407 struct ieee80211_parsed_tpe *tpe = &bss_conf->tpe; in ath12k_mac_parse_tx_pwr_env()
11410 struct ath12k_base *ab = ar->ab; in ath12k_mac_parse_tx_pwr_env()
11414 reg_info = ab->reg_info[ar->pdev_idx]; in ath12k_mac_parse_tx_pwr_env()
11415 client_type = reg_info->client_type; in ath12k_mac_parse_tx_pwr_env()
11417 local_psd = &tpe->psd_local[client_type]; in ath12k_mac_parse_tx_pwr_env()
11418 reg_psd = &tpe->psd_reg_client[client_type]; in ath12k_mac_parse_tx_pwr_env()
11419 local_non_psd = &tpe->max_local[client_type]; in ath12k_mac_parse_tx_pwr_env()
11420 reg_non_psd = &tpe->max_reg_client[client_type]; in ath12k_mac_parse_tx_pwr_env()
11422 psd_valid = local_psd->valid | reg_psd->valid; in ath12k_mac_parse_tx_pwr_env()
11423 non_psd_valid = local_non_psd->valid | reg_non_psd->valid; in ath12k_mac_parse_tx_pwr_env()
11433 tpc_info->is_psd_power = true; in ath12k_mac_parse_tx_pwr_env()
11435 tpc_info->num_pwr_levels = max(local_psd->count, in ath12k_mac_parse_tx_pwr_env()
11436 reg_psd->count); in ath12k_mac_parse_tx_pwr_env()
11437 tpc_info->num_pwr_levels = in ath12k_mac_parse_tx_pwr_env()
11438 min3(tpc_info->num_pwr_levels, in ath12k_mac_parse_tx_pwr_env()
11442 for (i = 0; i < tpc_info->num_pwr_levels; i++) { in ath12k_mac_parse_tx_pwr_env()
11443 tpc_info->tpe[i] = min(local_psd->power[i], in ath12k_mac_parse_tx_pwr_env()
11444 reg_psd->power[i]) / 2; in ath12k_mac_parse_tx_pwr_env()
11447 i, tpc_info->tpe[i]); in ath12k_mac_parse_tx_pwr_env()
11450 tpc_info->is_psd_power = false; in ath12k_mac_parse_tx_pwr_env()
11451 tpc_info->eirp_power = 0; in ath12k_mac_parse_tx_pwr_env()
11453 tpc_info->num_pwr_levels = max(local_non_psd->count, in ath12k_mac_parse_tx_pwr_env()
11454 reg_non_psd->count); in ath12k_mac_parse_tx_pwr_env()
11455 tpc_info->num_pwr_levels = in ath12k_mac_parse_tx_pwr_env()
11456 min3(tpc_info->num_pwr_levels, in ath12k_mac_parse_tx_pwr_env()
11460 for (i = 0; i < tpc_info->num_pwr_levels; i++) { in ath12k_mac_parse_tx_pwr_env()
11461 tpc_info->tpe[i] = min(local_non_psd->power[i], in ath12k_mac_parse_tx_pwr_env()
11462 reg_non_psd->power[i]) / 2; in ath12k_mac_parse_tx_pwr_env()
11465 i, tpc_info->tpe[i]); in ath12k_mac_parse_tx_pwr_env()
11480 u8 link_id = link_conf->link_id; in ath12k_mac_op_assign_vif_chanctx()
11484 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_assign_vif_chanctx()
11492 return -ENOMEM; in ath12k_mac_op_assign_vif_chanctx()
11498 vif->addr, link_id); in ath12k_mac_op_assign_vif_chanctx()
11499 return -EINVAL; in ath12k_mac_op_assign_vif_chanctx()
11502 ab = ar->ab; in ath12k_mac_op_assign_vif_chanctx()
11506 ctx, arvif->vdev_id); in ath12k_mac_op_assign_vif_chanctx()
11509 ctx->def.chan->band == NL80211_BAND_6GHZ && in ath12k_mac_op_assign_vif_chanctx()
11510 ahvif->vdev_type == WMI_VDEV_TYPE_STA) in ath12k_mac_op_assign_vif_chanctx()
11513 arvif->punct_bitmap = ctx->def.punctured; in ath12k_mac_op_assign_vif_chanctx()
11516 if (ab->hw_params->vdev_start_delay && in ath12k_mac_op_assign_vif_chanctx()
11517 ahvif->vdev_type != WMI_VDEV_TYPE_AP && in ath12k_mac_op_assign_vif_chanctx()
11518 ahvif->vdev_type != WMI_VDEV_TYPE_MONITOR && in ath12k_mac_op_assign_vif_chanctx()
11519 !ath12k_peer_exist_by_vdev_id(ab, arvif->vdev_id)) { in ath12k_mac_op_assign_vif_chanctx()
11524 if (WARN_ON(arvif->is_started)) { in ath12k_mac_op_assign_vif_chanctx()
11525 ret = -EBUSY; in ath12k_mac_op_assign_vif_chanctx()
11529 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { in ath12k_mac_op_assign_vif_chanctx()
11536 arvif->is_started = true; in ath12k_mac_op_assign_vif_chanctx()
11542 ath12k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n", in ath12k_mac_op_assign_vif_chanctx()
11543 arvif->vdev_id, vif->addr, in ath12k_mac_op_assign_vif_chanctx()
11544 ctx->def.chan->center_freq, ret); in ath12k_mac_op_assign_vif_chanctx()
11548 arvif->is_started = true; in ath12k_mac_op_assign_vif_chanctx()
11566 u8 link_id = link_conf->link_id; in ath12k_mac_op_unassign_vif_chanctx()
11569 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_unassign_vif_chanctx()
11571 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); in ath12k_mac_op_unassign_vif_chanctx()
11580 if (!arvif || !arvif->is_created) in ath12k_mac_op_unassign_vif_chanctx()
11583 ar = arvif->ar; in ath12k_mac_op_unassign_vif_chanctx()
11584 ab = ar->ab; in ath12k_mac_op_unassign_vif_chanctx()
11588 ctx, arvif->vdev_id); in ath12k_mac_op_unassign_vif_chanctx()
11590 WARN_ON(!arvif->is_started); in ath12k_mac_op_unassign_vif_chanctx()
11592 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { in ath12k_mac_op_unassign_vif_chanctx()
11597 arvif->is_started = false; in ath12k_mac_op_unassign_vif_chanctx()
11600 if (ahvif->vdev_type != WMI_VDEV_TYPE_STA && in ath12k_mac_op_unassign_vif_chanctx()
11601 ahvif->vdev_type != WMI_VDEV_TYPE_MONITOR) { in ath12k_mac_op_unassign_vif_chanctx()
11606 arvif->vdev_id, ret); in ath12k_mac_op_unassign_vif_chanctx()
11608 arvif->is_started = false; in ath12k_mac_op_unassign_vif_chanctx()
11610 if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ab->wmi_ab.svc_map) && in ath12k_mac_op_unassign_vif_chanctx()
11611 ahvif->vdev_type == WMI_VDEV_TYPE_STA && in ath12k_mac_op_unassign_vif_chanctx()
11612 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE && in ath12k_mac_op_unassign_vif_chanctx()
11613 ar->state_11d != ATH12K_11D_PREPARING) { in ath12k_mac_op_unassign_vif_chanctx()
11614 reinit_completion(&ar->completed_11d_scan); in ath12k_mac_op_unassign_vif_chanctx()
11615 ar->state_11d = ATH12K_11D_PREPARING; in ath12k_mac_op_unassign_vif_chanctx()
11618 if (ar->scan.arvif == arvif && ar->scan.state == ATH12K_SCAN_RUNNING) { in ath12k_mac_op_unassign_vif_chanctx()
11620 ar->scan.arvif = NULL; in ath12k_mac_op_unassign_vif_chanctx()
11632 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_switch_vif_chanctx()
11634 ar = ath12k_get_ar_by_ctx(hw, vifs->old_ctx); in ath12k_mac_op_switch_vif_chanctx()
11636 return -EINVAL; in ath12k_mac_op_switch_vif_chanctx()
11639 if (ar != ath12k_get_ar_by_ctx(hw, vifs->new_ctx)) in ath12k_mac_op_switch_vif_chanctx()
11640 return -EINVAL; in ath12k_mac_op_switch_vif_chanctx()
11642 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_op_switch_vif_chanctx()
11656 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_set_vdev_param_to_all_vifs()
11658 list_for_each_entry(arvif, &ar->arvifs, list) { in ath12k_set_vdev_param_to_all_vifs()
11659 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "setting mac vdev %d param %d value %d\n", in ath12k_set_vdev_param_to_all_vifs()
11660 param, arvif->vdev_id, value); in ath12k_set_vdev_param_to_all_vifs()
11662 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_set_vdev_param_to_all_vifs()
11665 ath12k_warn(ar->ab, "failed to set param %d for vdev %d: %d\n", in ath12k_set_vdev_param_to_all_vifs()
11666 param, arvif->vdev_id, ret); in ath12k_set_vdev_param_to_all_vifs()
11681 struct wiphy *wiphy = hw->wiphy; in ath12k_mac_op_set_rts_threshold()
11686 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_set_rts_threshold()
11688 if (radio_idx >= wiphy->n_radio || radio_idx < -1) in ath12k_mac_op_set_rts_threshold()
11689 return -EINVAL; in ath12k_mac_op_set_rts_threshold()
11691 if (radio_idx != -1) { in ath12k_mac_op_set_rts_threshold()
11696 ath12k_warn(ar->ab, in ath12k_mac_op_set_rts_threshold()
11698 ar->pdev->pdev_id); in ath12k_mac_op_set_rts_threshold()
11702 ar->rts_threshold = value; in ath12k_mac_op_set_rts_threshold()
11706 /* Radio_index passed is -1, so set RTS threshold for all radios. */ in ath12k_mac_op_set_rts_threshold()
11710 ath12k_warn(ar->ab, "failed to set RTS config for all vdevs of pdev %d", in ath12k_mac_op_set_rts_threshold()
11711 ar->pdev->pdev_id); in ath12k_mac_op_set_rts_threshold()
11720 ar->rts_threshold = value; in ath12k_mac_op_set_rts_threshold()
11725 for (i = i - 1; i >= 0; i--) { in ath12k_mac_op_set_rts_threshold()
11728 ar->rts_threshold); in ath12k_mac_op_set_rts_threshold()
11730 ath12k_warn(ar->ab, in ath12k_mac_op_set_rts_threshold()
11732 ar->pdev->pdev_id); in ath12k_mac_op_set_rts_threshold()
11752 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_set_frag_threshold()
11754 return -EOPNOTSUPP; in ath12k_mac_op_set_frag_threshold()
11762 time_left = wait_event_timeout(ar->dp.tx_empty_waitq, in ath12k_mac_flush()
11763 (atomic_read(&ar->dp.num_tx_pending) == 0), in ath12k_mac_flush()
11766 ath12k_warn(ar->ab, in ath12k_mac_flush()
11768 atomic_read(&ar->dp.num_tx_pending)); in ath12k_mac_flush()
11769 ret = -ETIMEDOUT; in ath12k_mac_flush()
11772 time_left = wait_event_timeout(ar->txmgmt_empty_waitq, in ath12k_mac_flush()
11773 (atomic_read(&ar->num_pending_mgmt_tx) == 0), in ath12k_mac_flush()
11776 ath12k_warn(ar->ab, in ath12k_mac_flush()
11778 atomic_read(&ar->num_pending_mgmt_tx)); in ath12k_mac_flush()
11779 ret = -ETIMEDOUT; in ath12k_mac_flush()
11787 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_wait_tx_complete()
11804 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_flush()
11817 wiphy_work_flush(hw->wiphy, &ar->wmi_mgmt_tx_work); in ath12k_mac_op_flush()
11820 links = ahvif->links_map; in ath12k_mac_op_flush()
11822 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); in ath12k_mac_op_flush()
11823 if (!(arvif && arvif->ar)) in ath12k_mac_op_flush()
11826 ath12k_mac_flush(arvif->ar); in ath12k_mac_op_flush()
11838 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) in ath12k_mac_bitrate_mask_num_ht_rates()
11839 num_rates += hweight16(mask->control[band].ht_mcs[i]); in ath12k_mac_bitrate_mask_num_ht_rates()
11851 num_rates = hweight32(mask->control[band].legacy); in ath12k_mac_has_single_legacy_rate()
11868 if (he_cap->he_cap_elem.phy_cap_info[0] & in ath12k_mac_get_tx_mcs_map()
11870 return he_cap->he_mcs_nss_supp.tx_mcs_160; in ath12k_mac_get_tx_mcs_map()
11872 return he_cap->he_mcs_nss_supp.tx_mcs_80; in ath12k_mac_get_tx_mcs_map()
11882 struct ieee80211_supported_band *sband = &ar->mac.sbands[band]; in ath12k_mac_bitrate_mask_get_single_nss()
11883 u16 vht_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map); in ath12k_mac_bitrate_mask_get_single_nss()
11895 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) { in ath12k_mac_bitrate_mask_get_single_nss()
11896 if (mask->control[band].ht_mcs[i] == 0) in ath12k_mac_bitrate_mask_get_single_nss()
11898 else if (mask->control[band].ht_mcs[i] == in ath12k_mac_bitrate_mask_get_single_nss()
11899 sband->ht_cap.mcs.rx_mask[i]) in ath12k_mac_bitrate_mask_get_single_nss()
11905 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) { in ath12k_mac_bitrate_mask_get_single_nss()
11906 if (mask->control[band].vht_mcs[i] == 0) in ath12k_mac_bitrate_mask_get_single_nss()
11908 else if (mask->control[band].vht_mcs[i] == in ath12k_mac_bitrate_mask_get_single_nss()
11921 for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) { in ath12k_mac_bitrate_mask_get_single_nss()
11922 if (mask->control[band].he_mcs[i] == 0) in ath12k_mac_bitrate_mask_get_single_nss()
11925 if (mask->control[band].he_mcs[i] == in ath12k_mac_bitrate_mask_get_single_nss()
11938 if (BIT(fls(ht_nss_mask)) - 1 != ht_nss_mask) in ath12k_mac_bitrate_mask_get_single_nss()
11957 if (hweight32(mask->control[band].legacy) != 1) in ath12k_mac_get_single_legacy_rate()
11958 return -EINVAL; in ath12k_mac_get_single_legacy_rate()
11960 rate_idx = ffs(mask->control[band].legacy) - 1; in ath12k_mac_get_single_legacy_rate()
11982 struct ath12k *ar = arvif->ar; in ath12k_mac_set_fixed_rate_gi_ltf()
11985 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_set_fixed_rate_gi_ltf()
11991 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_set_fixed_rate_gi_ltf()
11994 ath12k_warn(ar->ab, "failed to set HE GI:%d, error:%d\n", in ath12k_mac_set_fixed_rate_gi_ltf()
12002 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_set_fixed_rate_gi_ltf()
12005 ath12k_warn(ar->ab, "failed to set HE LTF:%d, error:%d\n", in ath12k_mac_set_fixed_rate_gi_ltf()
12015 struct ath12k *ar = arvif->ar; in ath12k_mac_set_auto_rate_gi_ltf()
12031 ath12k_warn(ar->ab, "Invalid GI\n"); in ath12k_mac_set_auto_rate_gi_ltf()
12032 return -EINVAL; in ath12k_mac_set_auto_rate_gi_ltf()
12048 ath12k_warn(ar->ab, "Invalid LTF\n"); in ath12k_mac_set_auto_rate_gi_ltf()
12049 return -EINVAL; in ath12k_mac_set_auto_rate_gi_ltf()
12055 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_set_auto_rate_gi_ltf()
12059 ath12k_warn(ar->ab, in ath12k_mac_set_auto_rate_gi_ltf()
12085 struct ath12k *ar = arvif->ar; in ath12k_mac_set_rate_params()
12091 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_set_rate_params()
12095 return -EINVAL; in ath12k_mac_set_rate_params()
12097 he_support = link_conf->he_support; in ath12k_mac_set_rate_params()
12099 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_set_rate_params()
12101 arvif->vdev_id, rate, nss, sgi, ldpc); in ath12k_mac_set_rate_params()
12103 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_set_rate_params()
12109 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_set_rate_params()
12112 ath12k_warn(ar->ab, "failed to set fixed rate param 0x%02x: %d\n", in ath12k_mac_set_rate_params()
12120 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_set_rate_params()
12123 ath12k_warn(ar->ab, "failed to set nss param %d: %d\n", in ath12k_mac_set_rate_params()
12128 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_set_rate_params()
12131 ath12k_warn(ar->ab, "failed to set ldpc param %d: %d\n", in ath12k_mac_set_rate_params()
12146 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_set_rate_params()
12149 ath12k_warn(ar->ab, "failed to set sgi param %d: %d\n", in ath12k_mac_set_rate_params()
12167 vht_mcs = mask->control[band].vht_mcs[i]; in ath12k_mac_vht_mcs_range_present()
12171 case BIT(8) - 1: in ath12k_mac_vht_mcs_range_present()
12172 case BIT(9) - 1: in ath12k_mac_vht_mcs_range_present()
12173 case BIT(10) - 1: in ath12k_mac_vht_mcs_range_present()
12192 he_mcs = mask->control[band].he_mcs[i]; in ath12k_mac_he_mcs_range_present()
12196 case BIT(8) - 1: in ath12k_mac_he_mcs_range_present()
12197 case BIT(10) - 1: in ath12k_mac_he_mcs_range_present()
12198 case BIT(12) - 1: in ath12k_mac_he_mcs_range_present()
12214 struct ath12k *ar = arvif->ar; in ath12k_mac_set_bitrate_mask_iter()
12216 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_set_bitrate_mask_iter()
12218 arsta = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy, in ath12k_mac_set_bitrate_mask_iter()
12219 ahsta->link[arvif->link_id]); in ath12k_mac_set_bitrate_mask_iter()
12220 if (!arsta || arsta->arvif != arvif) in ath12k_mac_set_bitrate_mask_iter()
12223 spin_lock_bh(&ar->data_lock); in ath12k_mac_set_bitrate_mask_iter()
12224 arsta->changed |= IEEE80211_RC_SUPP_RATES_CHANGED; in ath12k_mac_set_bitrate_mask_iter()
12225 spin_unlock_bh(&ar->data_lock); in ath12k_mac_set_bitrate_mask_iter()
12227 wiphy_work_queue(ath12k_ar_to_hw(ar)->wiphy, &arsta->update_wk); in ath12k_mac_set_bitrate_mask_iter()
12236 struct ath12k *ar = arvif->ar; in ath12k_mac_disable_peer_fixed_rate()
12239 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_disable_peer_fixed_rate()
12241 arsta = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy, in ath12k_mac_disable_peer_fixed_rate()
12242 ahsta->link[arvif->link_id]); in ath12k_mac_disable_peer_fixed_rate()
12244 if (!arsta || arsta->arvif != arvif) in ath12k_mac_disable_peer_fixed_rate()
12247 ret = ath12k_wmi_set_peer_param(ar, arsta->addr, in ath12k_mac_disable_peer_fixed_rate()
12248 arvif->vdev_id, in ath12k_mac_disable_peer_fixed_rate()
12252 ath12k_warn(ar->ab, in ath12k_mac_disable_peer_fixed_rate()
12254 arsta->addr, ret); in ath12k_mac_disable_peer_fixed_rate()
12269 vht_mcs_mask = mask->control[band].vht_mcs; in ath12k_mac_validate_fixed_rate_settings()
12270 he_mcs_mask = mask->control[band].he_mcs; in ath12k_mac_validate_fixed_rate_settings()
12285 spin_lock_bh(&ar->ab->base_lock); in ath12k_mac_validate_fixed_rate_settings()
12286 list_for_each_entry_safe(peer, tmp, &ar->ab->peers, list) { in ath12k_mac_validate_fixed_rate_settings()
12287 if (peer->sta) { in ath12k_mac_validate_fixed_rate_settings()
12288 link_sta = rcu_dereference(peer->sta->link[link_id]); in ath12k_mac_validate_fixed_rate_settings()
12294 if (vht_fixed_rate && (!link_sta->vht_cap.vht_supported || in ath12k_mac_validate_fixed_rate_settings()
12295 link_sta->rx_nss < vht_nss)) { in ath12k_mac_validate_fixed_rate_settings()
12299 if (he_fixed_rate && (!link_sta->he_cap.has_he || in ath12k_mac_validate_fixed_rate_settings()
12300 link_sta->rx_nss < he_nss)) { in ath12k_mac_validate_fixed_rate_settings()
12307 spin_unlock_bh(&ar->ab->base_lock); in ath12k_mac_validate_fixed_rate_settings()
12336 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_set_bitrate_mask()
12338 arvif = &ahvif->deflink; in ath12k_mac_op_set_bitrate_mask()
12340 ar = arvif->ar; in ath12k_mac_op_set_bitrate_mask()
12341 if (ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)) { in ath12k_mac_op_set_bitrate_mask()
12342 ret = -EPERM; in ath12k_mac_op_set_bitrate_mask()
12346 band = def.chan->band; in ath12k_mac_op_set_bitrate_mask()
12347 ht_mcs_mask = mask->control[band].ht_mcs; in ath12k_mac_op_set_bitrate_mask()
12348 vht_mcs_mask = mask->control[band].vht_mcs; in ath12k_mac_op_set_bitrate_mask()
12349 he_mcs_mask = mask->control[band].he_mcs; in ath12k_mac_op_set_bitrate_mask()
12350 ldpc = !!(ar->ht_cap_info & WMI_HT_CAP_LDPC); in ath12k_mac_op_set_bitrate_mask()
12352 sgi = mask->control[band].gi; in ath12k_mac_op_set_bitrate_mask()
12354 ret = -EINVAL; in ath12k_mac_op_set_bitrate_mask()
12358 he_gi = mask->control[band].he_gi; in ath12k_mac_op_set_bitrate_mask()
12359 he_ltf = mask->control[band].he_ltf; in ath12k_mac_op_set_bitrate_mask()
12373 ath12k_warn(ar->ab, "failed to get single legacy rate for vdev %i: %d\n", in ath12k_mac_op_set_bitrate_mask()
12374 arvif->vdev_id, ret); in ath12k_mac_op_set_bitrate_mask()
12385 arvif->bitrate_mask = *mask; in ath12k_mac_op_set_bitrate_mask()
12394 mask, arvif->link_id)) in ath12k_mac_op_set_bitrate_mask()
12395 ath12k_warn(ar->ab, in ath12k_mac_op_set_bitrate_mask()
12401 nss = min_t(u32, ar->num_tx_chains, mac_nss); in ath12k_mac_op_set_bitrate_mask()
12406 * - Single VHT Rate : peer_assoc command accommodates only MCS in ath12k_mac_op_set_bitrate_mask()
12407 * range values i.e 0-7, 0-8, 0-9 for VHT. Though mac80211 in ath12k_mac_op_set_bitrate_mask()
12415 * - Multiple VHT Rates : When Multiple VHT rates are given,this in ath12k_mac_op_set_bitrate_mask()
12416 * can be set using RATEMASK CMD which uses FW rate-ctl alg. in ath12k_mac_op_set_bitrate_mask()
12431 ath12k_warn(ar->ab, in ath12k_mac_op_set_bitrate_mask()
12433 ret = -EINVAL; in ath12k_mac_op_set_bitrate_mask()
12443 ath12k_warn(ar->ab, in ath12k_mac_op_set_bitrate_mask()
12445 ret = -EINVAL; in ath12k_mac_op_set_bitrate_mask()
12452 arvif->bitrate_mask = *mask; in ath12k_mac_op_set_bitrate_mask()
12461 ath12k_warn(ar->ab, "failed to set rate params on vdev %i: %d\n", in ath12k_mac_op_set_bitrate_mask()
12462 arvif->vdev_id, ret); in ath12k_mac_op_set_bitrate_mask()
12480 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_reconfig_complete()
12485 guard(mutex)(&ah->hw_mutex); in ath12k_mac_op_reconfig_complete()
12487 if (ah->state != ATH12K_HW_STATE_RESTARTED) in ath12k_mac_op_reconfig_complete()
12490 ah->state = ATH12K_HW_STATE_ON; in ath12k_mac_op_reconfig_complete()
12494 ab = ar->ab; in ath12k_mac_op_reconfig_complete()
12496 ath12k_warn(ar->ab, "pdev %d successfully recovered\n", in ath12k_mac_op_reconfig_complete()
12497 ar->pdev->pdev_id); in ath12k_mac_op_reconfig_complete()
12499 if (ar->ab->hw_params->current_cc_support && in ath12k_mac_op_reconfig_complete()
12500 ar->alpha2[0] != 0 && ar->alpha2[1] != 0) { in ath12k_mac_op_reconfig_complete()
12503 memcpy(&arg.alpha2, ar->alpha2, 2); in ath12k_mac_op_reconfig_complete()
12504 reinit_completion(&ar->regd_update_completed); in ath12k_mac_op_reconfig_complete()
12508 if (ab->is_reset) { in ath12k_mac_op_reconfig_complete()
12509 recovery_count = atomic_inc_return(&ab->recovery_count); in ath12k_mac_op_reconfig_complete()
12517 if (recovery_count == ab->num_radios) { in ath12k_mac_op_reconfig_complete()
12518 atomic_dec(&ab->reset_count); in ath12k_mac_op_reconfig_complete()
12519 complete(&ab->reset_complete); in ath12k_mac_op_reconfig_complete()
12520 ab->is_reset = false; in ath12k_mac_op_reconfig_complete()
12521 atomic_set(&ab->fail_cont_count, 0); in ath12k_mac_op_reconfig_complete()
12526 list_for_each_entry(arvif, &ar->arvifs, list) { in ath12k_mac_op_reconfig_complete()
12527 ahvif = arvif->ahvif; in ath12k_mac_op_reconfig_complete()
12530 ahvif->key_cipher, in ath12k_mac_op_reconfig_complete()
12531 arvif->is_up, in ath12k_mac_op_reconfig_complete()
12532 ahvif->vdev_type); in ath12k_mac_op_reconfig_complete()
12539 if (arvif->is_up && in ath12k_mac_op_reconfig_complete()
12540 ahvif->vdev_type == WMI_VDEV_TYPE_STA && in ath12k_mac_op_reconfig_complete()
12541 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE) { in ath12k_mac_op_reconfig_complete()
12542 ieee80211_hw_restart_disconnect(ahvif->vif); in ath12k_mac_op_reconfig_complete()
12558 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_update_bss_chan_survey()
12560 if (!test_bit(WMI_TLV_SERVICE_BSS_CHANNEL_INFO_64, ar->ab->wmi_ab.svc_map) || in ath12k_mac_update_bss_chan_survey()
12561 ar->rx_channel != channel) in ath12k_mac_update_bss_chan_survey()
12564 if (ar->scan.state != ATH12K_SCAN_IDLE) { in ath12k_mac_update_bss_chan_survey()
12565 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_update_bss_chan_survey()
12570 reinit_completion(&ar->bss_survey_done); in ath12k_mac_update_bss_chan_survey()
12574 ath12k_warn(ar->ab, "failed to send pdev bss chan info request\n"); in ath12k_mac_update_bss_chan_survey()
12578 ret = wait_for_completion_timeout(&ar->bss_survey_done, 3 * HZ); in ath12k_mac_update_bss_chan_survey()
12580 ath12k_warn(ar->ab, "bss channel survey timed out\n"); in ath12k_mac_update_bss_chan_survey()
12590 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_get_survey()
12593 return -ENOENT; in ath12k_mac_op_get_survey()
12595 sband = hw->wiphy->bands[NL80211_BAND_2GHZ]; in ath12k_mac_op_get_survey()
12596 if (sband && idx >= sband->n_channels) { in ath12k_mac_op_get_survey()
12597 idx -= sband->n_channels; in ath12k_mac_op_get_survey()
12602 sband = hw->wiphy->bands[NL80211_BAND_5GHZ]; in ath12k_mac_op_get_survey()
12603 if (sband && idx >= sband->n_channels) { in ath12k_mac_op_get_survey()
12604 idx -= sband->n_channels; in ath12k_mac_op_get_survey()
12609 sband = hw->wiphy->bands[NL80211_BAND_6GHZ]; in ath12k_mac_op_get_survey()
12611 if (!sband || idx >= sband->n_channels) in ath12k_mac_op_get_survey()
12612 return -ENOENT; in ath12k_mac_op_get_survey()
12614 ar = ath12k_mac_get_ar_by_chan(hw, &sband->channels[idx]); in ath12k_mac_op_get_survey()
12616 if (sband->channels[idx].flags & IEEE80211_CHAN_DISABLED) { in ath12k_mac_op_get_survey()
12620 return -ENOENT; in ath12k_mac_op_get_survey()
12623 ar_survey = &ar->survey[idx]; in ath12k_mac_op_get_survey()
12625 ath12k_mac_update_bss_chan_survey(ar, &sband->channels[idx]); in ath12k_mac_op_get_survey()
12627 spin_lock_bh(&ar->data_lock); in ath12k_mac_op_get_survey()
12629 spin_unlock_bh(&ar->data_lock); in ath12k_mac_op_get_survey()
12631 survey->channel = &sband->channels[idx]; in ath12k_mac_op_get_survey()
12633 if (ar->rx_channel == survey->channel) in ath12k_mac_op_get_survey()
12634 survey->filled |= SURVEY_INFO_IN_USE; in ath12k_mac_op_get_survey()
12645 for (i = 0; i < ARRAY_SIZE(sinfo->chain_signal); i++) { in ath12k_mac_put_chain_rssi()
12646 sinfo->chains &= ~BIT(i); in ath12k_mac_put_chain_rssi()
12647 rssi = arsta->chain_signal[i]; in ath12k_mac_put_chain_rssi()
12653 sinfo->chain_signal[i] = rssi; in ath12k_mac_put_chain_rssi()
12654 sinfo->chains |= BIT(i); in ath12k_mac_put_chain_rssi()
12655 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL); in ath12k_mac_put_chain_rssi()
12672 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_sta_statistics()
12674 arsta = &ahsta->deflink; in ath12k_mac_op_sta_statistics()
12675 ar = ath12k_get_ar_by_vif(hw, vif, arsta->link_id); in ath12k_mac_op_sta_statistics()
12680 ar->ab->wmi_ab.svc_map); in ath12k_mac_op_sta_statistics()
12682 sinfo->rx_duration = arsta->rx_duration; in ath12k_mac_op_sta_statistics()
12683 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_DURATION); in ath12k_mac_op_sta_statistics()
12685 sinfo->tx_duration = arsta->tx_duration; in ath12k_mac_op_sta_statistics()
12686 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_DURATION); in ath12k_mac_op_sta_statistics()
12688 if (arsta->txrate.legacy || arsta->txrate.nss) { in ath12k_mac_op_sta_statistics()
12689 if (arsta->txrate.legacy) { in ath12k_mac_op_sta_statistics()
12690 sinfo->txrate.legacy = arsta->txrate.legacy; in ath12k_mac_op_sta_statistics()
12692 sinfo->txrate.mcs = arsta->txrate.mcs; in ath12k_mac_op_sta_statistics()
12693 sinfo->txrate.nss = arsta->txrate.nss; in ath12k_mac_op_sta_statistics()
12694 sinfo->txrate.bw = arsta->txrate.bw; in ath12k_mac_op_sta_statistics()
12695 sinfo->txrate.he_gi = arsta->txrate.he_gi; in ath12k_mac_op_sta_statistics()
12696 sinfo->txrate.he_dcm = arsta->txrate.he_dcm; in ath12k_mac_op_sta_statistics()
12697 sinfo->txrate.he_ru_alloc = arsta->txrate.he_ru_alloc; in ath12k_mac_op_sta_statistics()
12698 sinfo->txrate.eht_gi = arsta->txrate.eht_gi; in ath12k_mac_op_sta_statistics()
12699 sinfo->txrate.eht_ru_alloc = arsta->txrate.eht_ru_alloc; in ath12k_mac_op_sta_statistics()
12701 sinfo->txrate.flags = arsta->txrate.flags; in ath12k_mac_op_sta_statistics()
12702 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE); in ath12k_mac_op_sta_statistics()
12706 signal = arsta->rssi_comb; in ath12k_mac_op_sta_statistics()
12708 params.pdev_id = ar->pdev->pdev_id; in ath12k_mac_op_sta_statistics()
12713 ahsta->ahvif->vdev_type == WMI_VDEV_TYPE_STA && in ath12k_mac_op_sta_statistics()
12715 signal = arsta->rssi_beacon; in ath12k_mac_op_sta_statistics()
12718 if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL)) && in ath12k_mac_op_sta_statistics()
12719 ahsta->ahvif->vdev_type == WMI_VDEV_TYPE_STA && in ath12k_mac_op_sta_statistics()
12723 spin_lock_bh(&ar->data_lock); in ath12k_mac_op_sta_statistics()
12725 spin_unlock_bh(&ar->data_lock); in ath12k_mac_op_sta_statistics()
12728 sinfo->signal = db2dbm ? signal : signal + noise_floor; in ath12k_mac_op_sta_statistics()
12729 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL); in ath12k_mac_op_sta_statistics()
12732 sinfo->signal_avg = ewma_avg_rssi_read(&arsta->avg_rssi); in ath12k_mac_op_sta_statistics()
12735 sinfo->signal_avg += noise_floor; in ath12k_mac_op_sta_statistics()
12737 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG); in ath12k_mac_op_sta_statistics()
12739 sinfo->tx_retries = arsta->tx_retry_count; in ath12k_mac_op_sta_statistics()
12740 sinfo->tx_failed = arsta->tx_retry_failed; in ath12k_mac_op_sta_statistics()
12741 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_RETRIES); in ath12k_mac_op_sta_statistics()
12742 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_FAILED); in ath12k_mac_op_sta_statistics()
12750 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(link_sta->sta); in ath12k_mac_op_link_sta_statistics()
12757 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_link_sta_statistics()
12759 arsta = wiphy_dereference(hw->wiphy, ahsta->link[link_sta->link_id]); in ath12k_mac_op_link_sta_statistics()
12764 ar = ath12k_get_ar_by_vif(hw, vif, arsta->link_id); in ath12k_mac_op_link_sta_statistics()
12769 ar->ab->wmi_ab.svc_map); in ath12k_mac_op_link_sta_statistics()
12771 link_sinfo->rx_duration = arsta->rx_duration; in ath12k_mac_op_link_sta_statistics()
12772 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_DURATION); in ath12k_mac_op_link_sta_statistics()
12774 link_sinfo->tx_duration = arsta->tx_duration; in ath12k_mac_op_link_sta_statistics()
12775 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_DURATION); in ath12k_mac_op_link_sta_statistics()
12777 if (arsta->txrate.legacy || arsta->txrate.nss) { in ath12k_mac_op_link_sta_statistics()
12778 if (arsta->txrate.legacy) { in ath12k_mac_op_link_sta_statistics()
12779 link_sinfo->txrate.legacy = arsta->txrate.legacy; in ath12k_mac_op_link_sta_statistics()
12781 link_sinfo->txrate.mcs = arsta->txrate.mcs; in ath12k_mac_op_link_sta_statistics()
12782 link_sinfo->txrate.nss = arsta->txrate.nss; in ath12k_mac_op_link_sta_statistics()
12783 link_sinfo->txrate.bw = arsta->txrate.bw; in ath12k_mac_op_link_sta_statistics()
12784 link_sinfo->txrate.he_gi = arsta->txrate.he_gi; in ath12k_mac_op_link_sta_statistics()
12785 link_sinfo->txrate.he_dcm = arsta->txrate.he_dcm; in ath12k_mac_op_link_sta_statistics()
12786 link_sinfo->txrate.he_ru_alloc = in ath12k_mac_op_link_sta_statistics()
12787 arsta->txrate.he_ru_alloc; in ath12k_mac_op_link_sta_statistics()
12788 link_sinfo->txrate.eht_gi = arsta->txrate.eht_gi; in ath12k_mac_op_link_sta_statistics()
12789 link_sinfo->txrate.eht_ru_alloc = in ath12k_mac_op_link_sta_statistics()
12790 arsta->txrate.eht_ru_alloc; in ath12k_mac_op_link_sta_statistics()
12792 link_sinfo->txrate.flags = arsta->txrate.flags; in ath12k_mac_op_link_sta_statistics()
12793 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE); in ath12k_mac_op_link_sta_statistics()
12797 signal = arsta->rssi_comb; in ath12k_mac_op_link_sta_statistics()
12799 params.pdev_id = ar->pdev->pdev_id; in ath12k_mac_op_link_sta_statistics()
12804 ahsta->ahvif->vdev_type == WMI_VDEV_TYPE_STA && in ath12k_mac_op_link_sta_statistics()
12806 signal = arsta->rssi_beacon; in ath12k_mac_op_link_sta_statistics()
12809 link_sinfo->signal = in ath12k_mac_op_link_sta_statistics()
12811 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL); in ath12k_mac_op_link_sta_statistics()
12814 link_sinfo->signal_avg = ewma_avg_rssi_read(&arsta->avg_rssi); in ath12k_mac_op_link_sta_statistics()
12817 link_sinfo->signal_avg += ATH12K_DEFAULT_NOISE_FLOOR; in ath12k_mac_op_link_sta_statistics()
12819 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG); in ath12k_mac_op_link_sta_statistics()
12821 link_sinfo->tx_retries = arsta->tx_retry_count; in ath12k_mac_op_link_sta_statistics()
12822 link_sinfo->tx_failed = arsta->tx_retry_failed; in ath12k_mac_op_link_sta_statistics()
12823 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_RETRIES); in ath12k_mac_op_link_sta_statistics()
12824 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_FAILED); in ath12k_mac_op_link_sta_statistics()
12835 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_cancel_remain_on_channel()
12837 spin_lock_bh(&ar->data_lock); in ath12k_mac_op_cancel_remain_on_channel()
12838 ar->scan.roc_notify = false; in ath12k_mac_op_cancel_remain_on_channel()
12839 spin_unlock_bh(&ar->data_lock); in ath12k_mac_op_cancel_remain_on_channel()
12843 cancel_delayed_work_sync(&ar->scan.timeout); in ath12k_mac_op_cancel_remain_on_channel()
12844 wiphy_work_cancel(hw->wiphy, &ar->scan.vdev_clean_wk); in ath12k_mac_op_cancel_remain_on_channel()
12864 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_remain_on_channel()
12866 ar = ath12k_mac_select_scan_device(hw, vif, chan->center_freq); in ath12k_mac_op_remain_on_channel()
12868 return -EINVAL; in ath12k_mac_op_remain_on_channel()
12883 * delete-create vdev's for the same ar, in case the request is in ath12k_mac_op_remain_on_channel()
12886 if (arvif->is_created) { in ath12k_mac_op_remain_on_channel()
12887 if (WARN_ON(!arvif->ar)) in ath12k_mac_op_remain_on_channel()
12888 return -EINVAL; in ath12k_mac_op_remain_on_channel()
12890 if (ar != arvif->ar && arvif->is_started) in ath12k_mac_op_remain_on_channel()
12891 return -EBUSY; in ath12k_mac_op_remain_on_channel()
12893 if (ar != arvif->ar) { in ath12k_mac_op_remain_on_channel()
12906 ath12k_warn(ar->ab, "unable to create scan vdev for roc: %d\n", in ath12k_mac_op_remain_on_channel()
12912 spin_lock_bh(&ar->data_lock); in ath12k_mac_op_remain_on_channel()
12914 switch (ar->scan.state) { in ath12k_mac_op_remain_on_channel()
12916 reinit_completion(&ar->scan.started); in ath12k_mac_op_remain_on_channel()
12917 reinit_completion(&ar->scan.completed); in ath12k_mac_op_remain_on_channel()
12918 reinit_completion(&ar->scan.on_channel); in ath12k_mac_op_remain_on_channel()
12919 ar->scan.state = ATH12K_SCAN_STARTING; in ath12k_mac_op_remain_on_channel()
12920 ar->scan.is_roc = true; in ath12k_mac_op_remain_on_channel()
12921 ar->scan.arvif = arvif; in ath12k_mac_op_remain_on_channel()
12922 ar->scan.roc_freq = chan->center_freq; in ath12k_mac_op_remain_on_channel()
12923 ar->scan.roc_notify = true; in ath12k_mac_op_remain_on_channel()
12929 ret = -EBUSY; in ath12k_mac_op_remain_on_channel()
12933 spin_unlock_bh(&ar->data_lock); in ath12k_mac_op_remain_on_channel()
12938 scan_time_msec = hw->wiphy->max_remain_on_channel_duration * 2; in ath12k_mac_op_remain_on_channel()
12943 return -ENOMEM; in ath12k_mac_op_remain_on_channel()
12946 arg->num_chan = 1; in ath12k_mac_op_remain_on_channel()
12948 u32 *chan_list __free(kfree) = kcalloc(arg->num_chan, sizeof(*chan_list), in ath12k_mac_op_remain_on_channel()
12951 return -ENOMEM; in ath12k_mac_op_remain_on_channel()
12953 arg->chan_list = chan_list; in ath12k_mac_op_remain_on_channel()
12954 arg->vdev_id = arvif->vdev_id; in ath12k_mac_op_remain_on_channel()
12955 arg->scan_id = ATH12K_SCAN_ID; in ath12k_mac_op_remain_on_channel()
12956 arg->chan_list[0] = chan->center_freq; in ath12k_mac_op_remain_on_channel()
12957 arg->dwell_time_active = scan_time_msec; in ath12k_mac_op_remain_on_channel()
12958 arg->dwell_time_passive = scan_time_msec; in ath12k_mac_op_remain_on_channel()
12959 arg->max_scan_time = scan_time_msec; in ath12k_mac_op_remain_on_channel()
12960 arg->scan_f_passive = 1; in ath12k_mac_op_remain_on_channel()
12961 arg->burst_duration = duration; in ath12k_mac_op_remain_on_channel()
12965 ath12k_warn(ar->ab, "failed to start roc scan: %d\n", ret); in ath12k_mac_op_remain_on_channel()
12967 spin_lock_bh(&ar->data_lock); in ath12k_mac_op_remain_on_channel()
12968 ar->scan.state = ATH12K_SCAN_IDLE; in ath12k_mac_op_remain_on_channel()
12969 spin_unlock_bh(&ar->data_lock); in ath12k_mac_op_remain_on_channel()
12973 ret = wait_for_completion_timeout(&ar->scan.on_channel, 3 * HZ); in ath12k_mac_op_remain_on_channel()
12975 ath12k_warn(ar->ab, "failed to switch to channel for roc scan\n"); in ath12k_mac_op_remain_on_channel()
12978 ath12k_warn(ar->ab, "failed to stop scan: %d\n", ret); in ath12k_mac_op_remain_on_channel()
12979 return -ETIMEDOUT; in ath12k_mac_op_remain_on_channel()
12982 ieee80211_queue_delayed_work(hw, &ar->scan.timeout, in ath12k_mac_op_remain_on_channel()
12998 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_set_rekey_data()
13000 arvif = &ahvif->deflink; in ath12k_mac_op_set_rekey_data()
13001 rekey_data = &arvif->rekey_data; in ath12k_mac_op_set_rekey_data()
13003 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac set rekey data vdev %d\n", in ath12k_mac_op_set_rekey_data()
13004 arvif->vdev_id); in ath12k_mac_op_set_rekey_data()
13006 memcpy(rekey_data->kck, data->kck, NL80211_KCK_LEN); in ath12k_mac_op_set_rekey_data()
13007 memcpy(rekey_data->kek, data->kek, NL80211_KEK_LEN); in ath12k_mac_op_set_rekey_data()
13009 /* The supplicant works on big-endian, the firmware expects it on in ath12k_mac_op_set_rekey_data()
13012 rekey_data->replay_ctr = get_unaligned_be64(data->replay_ctr); in ath12k_mac_op_set_rekey_data()
13014 arvif->rekey_data.enable_offload = true; in ath12k_mac_op_set_rekey_data()
13016 ath12k_dbg_dump(ar->ab, ATH12K_DBG_MAC, "kck", NULL, in ath12k_mac_op_set_rekey_data()
13017 rekey_data->kck, NL80211_KCK_LEN); in ath12k_mac_op_set_rekey_data()
13018 ath12k_dbg_dump(ar->ab, ATH12K_DBG_MAC, "kek", NULL, in ath12k_mac_op_set_rekey_data()
13019 rekey_data->kck, NL80211_KEK_LEN); in ath12k_mac_op_set_rekey_data()
13020 ath12k_dbg_dump(ar->ab, ATH12K_DBG_MAC, "replay ctr", NULL, in ath12k_mac_op_set_rekey_data()
13021 &rekey_data->replay_ctr, sizeof(rekey_data->replay_ctr)); in ath12k_mac_op_set_rekey_data()
13087 if (ar->freq_range.start_freq || ar->freq_range.end_freq) { in ath12k_mac_update_freq_range()
13088 ar->freq_range.start_freq = min(ar->freq_range.start_freq, in ath12k_mac_update_freq_range()
13090 ar->freq_range.end_freq = max(ar->freq_range.end_freq, in ath12k_mac_update_freq_range()
13093 ar->freq_range.start_freq = MHZ_TO_KHZ(freq_low); in ath12k_mac_update_freq_range()
13094 ar->freq_range.end_freq = MHZ_TO_KHZ(freq_high); in ath12k_mac_update_freq_range()
13097 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_update_freq_range()
13098 "mac pdev %u freq limit updated. New range %u->%u MHz\n", in ath12k_mac_update_freq_range()
13099 ar->pdev->pdev_id, KHZ_TO_MHZ(ar->freq_range.start_freq), in ath12k_mac_update_freq_range()
13100 KHZ_TO_MHZ(ar->freq_range.end_freq)); in ath12k_mac_update_freq_range()
13112 for (i = 0; i < band->n_channels; i++) { in ath12k_mac_update_ch_list()
13113 if (band->channels[i].center_freq < freq_low || in ath12k_mac_update_ch_list()
13114 band->channels[i].center_freq > freq_high) in ath12k_mac_update_ch_list()
13115 band->channels[i].flags |= IEEE80211_CHAN_DISABLED; in ath12k_mac_update_ch_list()
13121 struct ath12k_pdev *pdev = ar->pdev; in ath12k_get_phy_id()
13122 struct ath12k_pdev_cap *pdev_cap = &pdev->cap; in ath12k_get_phy_id()
13125 return pdev_cap->band[NL80211_BAND_2GHZ].phy_id; in ath12k_get_phy_id()
13128 return pdev_cap->band[NL80211_BAND_5GHZ].phy_id; in ath12k_get_phy_id()
13130 ath12k_warn(ar->ab, "unsupported phy cap:%d\n", band); in ath12k_get_phy_id()
13142 return -EINVAL; in ath12k_mac_update_band()
13144 if (orig_band->band != new_band->band) in ath12k_mac_update_band()
13145 return -EINVAL; in ath12k_mac_update_band()
13147 for (i = 0; i < new_band->n_channels; i++) { in ath12k_mac_update_band()
13148 if (new_band->channels[i].flags & IEEE80211_CHAN_DISABLED) in ath12k_mac_update_band()
13153 if (WARN_ON(!(orig_band->channels[i].flags & in ath12k_mac_update_band()
13155 return -EINVAL; in ath12k_mac_update_band()
13156 orig_band->channels[i].flags &= ~IEEE80211_CHAN_DISABLED; in ath12k_mac_update_band()
13167 struct ath12k_base *ab = ar->ab; in ath12k_mac_setup_channels_rates()
13169 struct ath12k_hw *ah = ar->ah; in ath12k_mac_setup_channels_rates()
13178 reg_cap = &ab->hal_reg_cap[ar->pdev_idx]; in ath12k_mac_setup_channels_rates()
13185 return -ENOMEM; in ath12k_mac_setup_channels_rates()
13187 band = &ar->mac.sbands[NL80211_BAND_2GHZ]; in ath12k_mac_setup_channels_rates()
13188 band->band = NL80211_BAND_2GHZ; in ath12k_mac_setup_channels_rates()
13189 band->n_channels = ARRAY_SIZE(ath12k_2ghz_channels); in ath12k_mac_setup_channels_rates()
13190 band->channels = channels; in ath12k_mac_setup_channels_rates()
13191 band->n_bitrates = ath12k_g_rates_size; in ath12k_mac_setup_channels_rates()
13192 band->bitrates = ath12k_g_rates; in ath12k_mac_setup_channels_rates()
13194 if (ab->hw_params->single_pdev_only) { in ath12k_mac_setup_channels_rates()
13196 reg_cap = &ab->hal_reg_cap[phy_id]; in ath12k_mac_setup_channels_rates()
13199 freq_low = max(reg_cap->low_2ghz_chan, in ath12k_mac_setup_channels_rates()
13200 ab->reg_freq_2ghz.start_freq); in ath12k_mac_setup_channels_rates()
13201 freq_high = min(reg_cap->high_2ghz_chan, in ath12k_mac_setup_channels_rates()
13202 ab->reg_freq_2ghz.end_freq); in ath12k_mac_setup_channels_rates()
13205 reg_cap->low_2ghz_chan, in ath12k_mac_setup_channels_rates()
13206 reg_cap->high_2ghz_chan); in ath12k_mac_setup_channels_rates()
13217 band->channels = NULL; in ath12k_mac_setup_channels_rates()
13220 …ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac pdev %u identified as 2 GHz split mac with start freq %d e… in ath12k_mac_setup_channels_rates()
13221 ar->pdev->pdev_id, in ath12k_mac_setup_channels_rates()
13222 KHZ_TO_MHZ(ar->freq_range.start_freq), in ath12k_mac_setup_channels_rates()
13223 KHZ_TO_MHZ(ar->freq_range.end_freq)); in ath12k_mac_setup_channels_rates()
13228 if (reg_cap->high_5ghz_chan >= ATH12K_MIN_6GHZ_FREQ) { in ath12k_mac_setup_channels_rates()
13232 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); in ath12k_mac_setup_channels_rates()
13233 return -ENOMEM; in ath12k_mac_setup_channels_rates()
13236 ar->supports_6ghz = true; in ath12k_mac_setup_channels_rates()
13237 band = &ar->mac.sbands[NL80211_BAND_6GHZ]; in ath12k_mac_setup_channels_rates()
13238 band->band = NL80211_BAND_6GHZ; in ath12k_mac_setup_channels_rates()
13239 band->n_channels = ARRAY_SIZE(ath12k_6ghz_channels); in ath12k_mac_setup_channels_rates()
13240 band->channels = channels; in ath12k_mac_setup_channels_rates()
13241 band->n_bitrates = ath12k_a_rates_size; in ath12k_mac_setup_channels_rates()
13242 band->bitrates = ath12k_a_rates; in ath12k_mac_setup_channels_rates()
13244 freq_low = max(reg_cap->low_5ghz_chan, in ath12k_mac_setup_channels_rates()
13245 ab->reg_freq_6ghz.start_freq); in ath12k_mac_setup_channels_rates()
13246 freq_high = min(reg_cap->high_5ghz_chan, in ath12k_mac_setup_channels_rates()
13247 ab->reg_freq_6ghz.end_freq); in ath12k_mac_setup_channels_rates()
13250 reg_cap->low_5ghz_chan, in ath12k_mac_setup_channels_rates()
13251 reg_cap->high_5ghz_chan); in ath12k_mac_setup_channels_rates()
13254 ah->use_6ghz_regd = true; in ath12k_mac_setup_channels_rates()
13264 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); in ath12k_mac_setup_channels_rates()
13265 ar->mac.sbands[NL80211_BAND_2GHZ].channels = NULL; in ath12k_mac_setup_channels_rates()
13267 band->channels = NULL; in ath12k_mac_setup_channels_rates()
13270 …ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac pdev %u identified as 6 GHz split mac with start freq %d e… in ath12k_mac_setup_channels_rates()
13271 ar->pdev->pdev_id, in ath12k_mac_setup_channels_rates()
13272 KHZ_TO_MHZ(ar->freq_range.start_freq), in ath12k_mac_setup_channels_rates()
13273 KHZ_TO_MHZ(ar->freq_range.end_freq)); in ath12k_mac_setup_channels_rates()
13277 if (reg_cap->low_5ghz_chan < ATH12K_MIN_6GHZ_FREQ) { in ath12k_mac_setup_channels_rates()
13282 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); in ath12k_mac_setup_channels_rates()
13283 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels); in ath12k_mac_setup_channels_rates()
13284 return -ENOMEM; in ath12k_mac_setup_channels_rates()
13287 band = &ar->mac.sbands[NL80211_BAND_5GHZ]; in ath12k_mac_setup_channels_rates()
13288 band->band = NL80211_BAND_5GHZ; in ath12k_mac_setup_channels_rates()
13289 band->n_channels = ARRAY_SIZE(ath12k_5ghz_channels); in ath12k_mac_setup_channels_rates()
13290 band->channels = channels; in ath12k_mac_setup_channels_rates()
13291 band->n_bitrates = ath12k_a_rates_size; in ath12k_mac_setup_channels_rates()
13292 band->bitrates = ath12k_a_rates; in ath12k_mac_setup_channels_rates()
13294 if (ab->hw_params->single_pdev_only) { in ath12k_mac_setup_channels_rates()
13296 reg_cap = &ab->hal_reg_cap[phy_id]; in ath12k_mac_setup_channels_rates()
13299 freq_low = max(reg_cap->low_5ghz_chan, in ath12k_mac_setup_channels_rates()
13300 ab->reg_freq_5ghz.start_freq); in ath12k_mac_setup_channels_rates()
13301 freq_high = min(reg_cap->high_5ghz_chan, in ath12k_mac_setup_channels_rates()
13302 ab->reg_freq_5ghz.end_freq); in ath12k_mac_setup_channels_rates()
13305 reg_cap->low_5ghz_chan, in ath12k_mac_setup_channels_rates()
13306 reg_cap->high_5ghz_chan); in ath12k_mac_setup_channels_rates()
13318 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); in ath12k_mac_setup_channels_rates()
13319 ar->mac.sbands[NL80211_BAND_2GHZ].channels = NULL; in ath12k_mac_setup_channels_rates()
13320 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels); in ath12k_mac_setup_channels_rates()
13321 ar->mac.sbands[NL80211_BAND_2GHZ].channels = NULL; in ath12k_mac_setup_channels_rates()
13323 band->channels = NULL; in ath12k_mac_setup_channels_rates()
13326 …ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac pdev %u identified as 5 GHz split mac with start freq %d e… in ath12k_mac_setup_channels_rates()
13327 ar->pdev->pdev_id, in ath12k_mac_setup_channels_rates()
13328 KHZ_TO_MHZ(ar->freq_range.start_freq), in ath12k_mac_setup_channels_rates()
13329 KHZ_TO_MHZ(ar->freq_range.end_freq)); in ath12k_mac_setup_channels_rates()
13344 interface_modes &= ar->ab->hw_params->interface_modes; in ath12k_mac_get_ifmodes()
13365 interface_modes = ar->ab->hw_params->interface_modes; in ath12k_mac_is_iface_mode_enable()
13379 u16 interface_modes = ar->ab->hw_params->interface_modes; in ath12k_mac_setup_radio_iface_comb()
13406 return -ENOMEM; in ath12k_mac_setup_radio_iface_comb()
13470 return -ENOMEM; in ath12k_mac_setup_global_iface_comb()
13474 for (j = 0; j < iter_comb->n_limits && j < n_limits; j++) { in ath12k_mac_setup_global_iface_comb()
13475 limits[j].types |= iter_comb->limits[j].types; in ath12k_mac_setup_global_iface_comb()
13476 limits[j].max += iter_comb->limits[j].max; in ath12k_mac_setup_global_iface_comb()
13479 comb->max_interfaces += iter_comb->max_interfaces; in ath12k_mac_setup_global_iface_comb()
13480 comb->num_different_channels += iter_comb->num_different_channels; in ath12k_mac_setup_global_iface_comb()
13481 comb->radar_detect_widths |= iter_comb->radar_detect_widths; in ath12k_mac_setup_global_iface_comb()
13484 comb->limits = limits; in ath12k_mac_setup_global_iface_comb()
13485 comb->n_limits = n_limits; in ath12k_mac_setup_global_iface_comb()
13486 comb->beacon_int_infra_match = true; in ath12k_mac_setup_global_iface_comb()
13487 comb->beacon_int_min_gcd = 100; in ath12k_mac_setup_global_iface_comb()
13501 struct wiphy *wiphy = ah->hw->wiphy; in ath12k_mac_cleanup_iface_combinations()
13505 if (wiphy->n_radio > 0) { in ath12k_mac_cleanup_iface_combinations()
13506 radio = wiphy->radio; in ath12k_mac_cleanup_iface_combinations()
13507 for (i = 0; i < wiphy->n_radio; i++) in ath12k_mac_cleanup_iface_combinations()
13510 kfree(wiphy->radio); in ath12k_mac_cleanup_iface_combinations()
13513 ath12k_mac_cleanup_iface_comb(wiphy->iface_combinations); in ath12k_mac_cleanup_iface_combinations()
13519 struct wiphy *wiphy = ah->hw->wiphy; in ath12k_mac_setup_iface_combinations()
13525 if (ah->num_radio == 1) { in ath12k_mac_setup_iface_combinations()
13526 ar = &ah->radio[0]; in ath12k_mac_setup_iface_combinations()
13528 if (ar->ab->hw_params->single_pdev_only) in ath12k_mac_setup_iface_combinations()
13534 return -ENOMEM; in ath12k_mac_setup_iface_combinations()
13543 if (ar->ab->hw_params->single_pdev_only) { in ath12k_mac_setup_iface_combinations()
13546 comb->num_different_channels = 2; in ath12k_mac_setup_iface_combinations()
13547 comb->radar_detect_widths = 0; in ath12k_mac_setup_iface_combinations()
13555 return -ENOMEM; in ath12k_mac_setup_iface_combinations()
13559 radio = kcalloc(ah->num_radio, sizeof(*radio), GFP_KERNEL); in ath12k_mac_setup_iface_combinations()
13561 ret = -ENOMEM; in ath12k_mac_setup_iface_combinations()
13568 ret = -ENOMEM; in ath12k_mac_setup_iface_combinations()
13580 radio[i].freq_range = &ar->freq_range; in ath12k_mac_setup_iface_combinations()
13587 ret = ath12k_mac_setup_global_iface_comb(ah, radio, ah->num_radio, combinations); in ath12k_mac_setup_iface_combinations()
13594 wiphy->radio = radio; in ath12k_mac_setup_iface_combinations()
13595 wiphy->n_radio = ah->num_radio; in ath12k_mac_setup_iface_combinations()
13598 wiphy->iface_combinations = combinations; in ath12k_mac_setup_iface_combinations()
13599 wiphy->n_iface_combinations = n_combinations; in ath12k_mac_setup_iface_combinations()
13604 i = ah->num_radio; in ath12k_mac_setup_iface_combinations()
13607 while (i--) in ath12k_mac_setup_iface_combinations()
13663 idr_for_each(&ar->txmgmt_idr, ath12k_mac_tx_mgmt_pending_free, ar); in ath12k_mac_cleanup_unregister()
13664 idr_destroy(&ar->txmgmt_idr); in ath12k_mac_cleanup_unregister()
13666 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); in ath12k_mac_cleanup_unregister()
13667 kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels); in ath12k_mac_cleanup_unregister()
13668 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels); in ath12k_mac_cleanup_unregister()
13673 struct ieee80211_hw *hw = ah->hw; in ath12k_mac_hw_unregister()
13678 cancel_work_sync(&ar->regd_channel_update_work); in ath12k_mac_hw_unregister()
13679 cancel_work_sync(&ar->regd_update_work); in ath12k_mac_hw_unregister()
13698 struct ath12k_pdev_cap *cap = &ar->pdev->cap; in ath12k_mac_setup_register()
13701 init_waitqueue_head(&ar->txmgmt_empty_waitq); in ath12k_mac_setup_register()
13702 idr_init(&ar->txmgmt_idr); in ath12k_mac_setup_register()
13703 spin_lock_init(&ar->txmgmt_idr_lock); in ath12k_mac_setup_register()
13708 cap->supported_bands, in ath12k_mac_setup_register()
13716 ar->max_num_stations = ath12k_core_get_max_station_per_radio(ar->ab); in ath12k_mac_setup_register()
13717 ar->max_num_peers = ath12k_core_get_max_peers_per_radio(ar->ab); in ath12k_mac_setup_register()
13719 ar->rssi_info.min_nf_dbm = ATH12K_DEFAULT_NOISE_FLOOR; in ath12k_mac_setup_register()
13720 ar->rssi_info.temp_offset = 0; in ath12k_mac_setup_register()
13721 ar->rssi_info.noise_floor = ar->rssi_info.min_nf_dbm + ar->rssi_info.temp_offset; in ath12k_mac_setup_register()
13728 struct ieee80211_hw *hw = ah->hw; in ath12k_mac_hw_register()
13729 struct wiphy *wiphy = hw->wiphy; in ath12k_mac_hw_register()
13731 struct ath12k_base *ab = ar->ab; in ath12k_mac_hw_register()
13751 wiphy->max_ap_assoc_sta = 0; in ath12k_mac_hw_register()
13756 pdev = ar->pdev; in ath12k_mac_hw_register()
13757 if (ar->ab->pdevs_macaddr_valid) { in ath12k_mac_hw_register()
13758 ether_addr_copy(ar->mac_addr, pdev->mac_addr); in ath12k_mac_hw_register()
13760 ether_addr_copy(ar->mac_addr, ar->ab->mac_addr); in ath12k_mac_hw_register()
13761 ar->mac_addr[4] += ar->pdev_idx; in ath12k_mac_hw_register()
13764 ret = ath12k_mac_setup_register(ar, &ht_cap_info, hw->wiphy->bands); in ath12k_mac_hw_register()
13769 if (!ar->supports_6ghz) in ath12k_mac_hw_register()
13772 wiphy->max_ap_assoc_sta += ar->max_num_stations; in ath12k_mac_hw_register()
13778 cap = &pdev->cap; in ath12k_mac_hw_register()
13780 antennas_rx = max_t(u32, antennas_rx, cap->rx_chain_mask); in ath12k_mac_hw_register()
13781 antennas_tx = max_t(u32, antennas_tx, cap->tx_chain_mask); in ath12k_mac_hw_register()
13783 if (ar->supports_6ghz) in ath12k_mac_hw_register()
13786 if (test_bit(ATH12K_FLAG_RAW_MODE, &ar->ab->dev_flags)) in ath12k_mac_hw_register()
13789 if (!ar->ab->hw_params->supports_monitor) in ath12k_mac_hw_register()
13793 mac_addr = ar->mac_addr; in ath12k_mac_hw_register()
13795 mac_addr = ab->mac_addr; in ath12k_mac_hw_register()
13797 mbssid_max_interfaces += TARGET_NUM_VDEVS(ar->ab); in ath12k_mac_hw_register()
13800 wiphy->available_antennas_rx = antennas_rx; in ath12k_mac_hw_register()
13801 wiphy->available_antennas_tx = antennas_tx; in ath12k_mac_hw_register()
13804 SET_IEEE80211_DEV(hw, ab->dev); in ath12k_mac_hw_register()
13812 wiphy->interface_modes = ath12k_mac_get_ifmodes(ah); in ath12k_mac_hw_register()
13814 if (ah->num_radio == 1 && in ath12k_mac_hw_register()
13815 wiphy->bands[NL80211_BAND_2GHZ] && in ath12k_mac_hw_register()
13816 wiphy->bands[NL80211_BAND_5GHZ] && in ath12k_mac_hw_register()
13817 wiphy->bands[NL80211_BAND_6GHZ]) in ath12k_mac_hw_register()
13836 if (test_bit(WMI_TLV_SERVICE_ETH_OFFLOAD, ar->wmi->wmi_ab->svc_map)) { in ath12k_mac_hw_register()
13841 if (cap->nss_ratio_enabled) in ath12k_mac_hw_register()
13852 wiphy->features |= NL80211_FEATURE_STATIC_SMPS; in ath12k_mac_hw_register()
13853 wiphy->flags |= WIPHY_FLAG_IBSS_RSN; in ath12k_mac_hw_register()
13860 (is_6ghz && ab->hw_params->supports_dynamic_smps_6ghz)) in ath12k_mac_hw_register()
13861 wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS; in ath12k_mac_hw_register()
13863 wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID; in ath12k_mac_hw_register()
13864 wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN; in ath12k_mac_hw_register()
13866 hw->max_listen_interval = ATH12K_MAX_HW_LISTEN_INTERVAL; in ath12k_mac_hw_register()
13868 wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL; in ath12k_mac_hw_register()
13869 wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH; in ath12k_mac_hw_register()
13870 wiphy->max_remain_on_channel_duration = 5000; in ath12k_mac_hw_register()
13872 wiphy->flags |= WIPHY_FLAG_AP_UAPSD; in ath12k_mac_hw_register()
13873 wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE | in ath12k_mac_hw_register()
13876 wiphy->features |= NL80211_FEATURE_TX_POWER_INSERTION; in ath12k_mac_hw_register()
13882 wiphy->flags |= WIPHY_FLAG_DISABLE_WEXT; in ath12k_mac_hw_register()
13887 if (ab->ag->mlo_capable) { in ath12k_mac_hw_register()
13888 ath12k_iftypes_ext_capa[2].eml_capabilities = cap->eml_cap; in ath12k_mac_hw_register()
13889 ath12k_iftypes_ext_capa[2].mld_capa_and_ops = cap->mld_cap; in ath12k_mac_hw_register()
13890 wiphy->flags |= WIPHY_FLAG_SUPPORTS_MLO; in ath12k_mac_hw_register()
13895 hw->queues = ATH12K_HW_MAX_QUEUES; in ath12k_mac_hw_register()
13896 wiphy->tx_queue_len = ATH12K_QUEUE_LEN; in ath12k_mac_hw_register()
13897 hw->offchannel_tx_hw_queue = ATH12K_HW_MAX_QUEUES - 1; in ath12k_mac_hw_register()
13898 hw->max_rx_aggregation_subframes = IEEE80211_MAX_AMPDU_BUF_EHT; in ath12k_mac_hw_register()
13900 hw->vif_data_size = sizeof(struct ath12k_vif); in ath12k_mac_hw_register()
13901 hw->sta_data_size = sizeof(struct ath12k_sta); in ath12k_mac_hw_register()
13902 hw->extra_tx_headroom = ab->hw_params->iova_mask; in ath12k_mac_hw_register()
13908 wiphy->cipher_suites = cipher_suites; in ath12k_mac_hw_register()
13909 wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites); in ath12k_mac_hw_register()
13911 wiphy->iftype_ext_capab = ath12k_iftypes_ext_capa; in ath12k_mac_hw_register()
13912 wiphy->num_iftype_ext_capab = ARRAY_SIZE(ath12k_iftypes_ext_capa); in ath12k_mac_hw_register()
13914 wiphy->mbssid_max_interfaces = mbssid_max_interfaces; in ath12k_mac_hw_register()
13915 wiphy->ema_max_profile_periodicity = TARGET_EMA_MAX_PROFILE_PERIOD; in ath12k_mac_hw_register()
13926 if (test_bit(WMI_TLV_SERVICE_BEACON_PROTECTION_SUPPORT, ab->wmi_ab.svc_map)) in ath12k_mac_hw_register()
13927 wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_BEACON_PROTECTION); in ath12k_mac_hw_register()
13932 hw->netdev_features = NETIF_F_HW_CSUM; in ath12k_mac_hw_register()
13937 if (test_bit(WMI_TLV_SERVICE_NLO, ar->wmi->wmi_ab->svc_map)) { in ath12k_mac_hw_register()
13938 wiphy->max_sched_scan_ssids = WMI_PNO_MAX_SUPP_NETWORKS; in ath12k_mac_hw_register()
13939 wiphy->max_match_sets = WMI_PNO_MAX_SUPP_NETWORKS; in ath12k_mac_hw_register()
13940 wiphy->max_sched_scan_ie_len = WMI_PNO_MAX_IE_LENGTH; in ath12k_mac_hw_register()
13941 wiphy->max_sched_scan_plans = WMI_PNO_MAX_SCHED_SCAN_PLANS; in ath12k_mac_hw_register()
13942 wiphy->max_sched_scan_plan_interval = in ath12k_mac_hw_register()
13944 wiphy->max_sched_scan_plan_iterations = in ath12k_mac_hw_register()
13946 wiphy->features |= NL80211_FEATURE_ND_RANDOM_MAC_ADDR; in ath12k_mac_hw_register()
13951 ath12k_warn(ar->ab, "failed to init wow: %d\n", ret); in ath12k_mac_hw_register()
13955 /* Boot-time regulatory updates have already been processed. in ath12k_mac_hw_register()
13959 * important to mark the boot-time updates as complete before in ath12k_mac_hw_register()
13963 complete_all(&ar->regd_update_completed); in ath12k_mac_hw_register()
13967 ath12k_err(ab, "ieee80211 registration failed: %d\n", ret); in ath12k_mac_hw_register()
13977 wiphy->interface_modes &= ~BIT(NL80211_IFTYPE_MONITOR); in ath12k_mac_hw_register()
13983 ath12k_err(ar->ab, "ath12k regd update failed: %d\n", ret); in ath12k_mac_hw_register()
13987 if (ar->ab->hw_params->current_cc_support && ab->new_alpha2[0]) { in ath12k_mac_hw_register()
13990 memcpy(¤t_cc.alpha2, ab->new_alpha2, 2); in ath12k_mac_hw_register()
13991 memcpy(&ar->alpha2, ab->new_alpha2, 2); in ath12k_mac_hw_register()
13993 reinit_completion(&ar->regd_update_completed); in ath12k_mac_hw_register()
13997 ath12k_warn(ar->ab, in ath12k_mac_hw_register()
14018 i = ah->num_radio; in ath12k_mac_hw_register()
14033 struct ath12k_base *ab = ar->ab; in ath12k_mac_setup()
14034 struct ath12k_pdev *pdev = ar->pdev; in ath12k_mac_setup()
14035 u8 pdev_idx = ar->pdev_idx; in ath12k_mac_setup()
14037 ar->lmac_id = ath12k_hw_get_mac_from_pdev_id(ab->hw_params, pdev_idx); in ath12k_mac_setup()
14039 ar->wmi = &ab->wmi_ab.wmi[pdev_idx]; in ath12k_mac_setup()
14045 ar->cfg_tx_chainmask = pdev->cap.tx_chain_mask; in ath12k_mac_setup()
14046 ar->cfg_rx_chainmask = pdev->cap.rx_chain_mask; in ath12k_mac_setup()
14047 ar->num_tx_chains = hweight32(pdev->cap.tx_chain_mask); in ath12k_mac_setup()
14048 ar->num_rx_chains = hweight32(pdev->cap.rx_chain_mask); in ath12k_mac_setup()
14049 ar->scan.arvif = NULL; in ath12k_mac_setup()
14050 ar->vdev_id_11d_scan = ATH12K_11D_INVALID_VDEV_ID; in ath12k_mac_setup()
14052 spin_lock_init(&ar->data_lock); in ath12k_mac_setup()
14053 INIT_LIST_HEAD(&ar->arvifs); in ath12k_mac_setup()
14054 INIT_LIST_HEAD(&ar->ppdu_stats_info); in ath12k_mac_setup()
14056 init_completion(&ar->vdev_setup_done); in ath12k_mac_setup()
14057 init_completion(&ar->vdev_delete_done); in ath12k_mac_setup()
14058 init_completion(&ar->peer_assoc_done); in ath12k_mac_setup()
14059 init_completion(&ar->peer_delete_done); in ath12k_mac_setup()
14060 init_completion(&ar->install_key_done); in ath12k_mac_setup()
14061 init_completion(&ar->bss_survey_done); in ath12k_mac_setup()
14062 init_completion(&ar->scan.started); in ath12k_mac_setup()
14063 init_completion(&ar->scan.completed); in ath12k_mac_setup()
14064 init_completion(&ar->scan.on_channel); in ath12k_mac_setup()
14065 init_completion(&ar->mlo_setup_done); in ath12k_mac_setup()
14066 init_completion(&ar->completed_11d_scan); in ath12k_mac_setup()
14067 init_completion(&ar->regd_update_completed); in ath12k_mac_setup()
14069 INIT_DELAYED_WORK(&ar->scan.timeout, ath12k_scan_timeout_work); in ath12k_mac_setup()
14070 wiphy_work_init(&ar->scan.vdev_clean_wk, ath12k_scan_vdev_clean_work); in ath12k_mac_setup()
14071 INIT_WORK(&ar->regd_channel_update_work, ath12k_regd_update_chan_list_work); in ath12k_mac_setup()
14072 INIT_LIST_HEAD(&ar->regd_channel_update_queue); in ath12k_mac_setup()
14073 INIT_WORK(&ar->regd_update_work, ath12k_regd_update_work); in ath12k_mac_setup()
14075 wiphy_work_init(&ar->wmi_mgmt_tx_work, ath12k_mgmt_over_wmi_tx_work); in ath12k_mac_setup()
14076 skb_queue_head_init(&ar->wmi_mgmt_tx_queue); in ath12k_mac_setup()
14078 ar->monitor_vdev_id = -1; in ath12k_mac_setup()
14079 ar->monitor_vdev_created = false; in ath12k_mac_setup()
14080 ar->monitor_started = false; in ath12k_mac_setup()
14086 struct ath12k_base *partner_ab, *ab = ar->ab; in __ath12k_mac_mlo_setup()
14087 struct ath12k_hw_group *ag = ab->ag; in __ath12k_mac_mlo_setup()
14093 lockdep_assert_held(&ag->mutex); in __ath12k_mac_mlo_setup()
14095 reinit_completion(&ar->mlo_setup_done); in __ath12k_mac_mlo_setup()
14097 for (i = 0; i < ag->num_devices; i++) { in __ath12k_mac_mlo_setup()
14098 partner_ab = ag->ab[i]; in __ath12k_mac_mlo_setup()
14100 for (j = 0; j < partner_ab->num_radios; j++) { in __ath12k_mac_mlo_setup()
14101 pdev = &partner_ab->pdevs[j]; in __ath12k_mac_mlo_setup()
14104 if (ar == pdev->ar) in __ath12k_mac_mlo_setup()
14107 partner_link_id[num_link] = pdev->hw_link_id; in __ath12k_mac_mlo_setup()
14111 i, j, pdev->hw_link_id, num_link); in __ath12k_mac_mlo_setup()
14118 mlo.group_id = cpu_to_le32(ag->id); in __ath12k_mac_mlo_setup()
14121 ar->mlo_setup_status = 0; in __ath12k_mac_mlo_setup()
14123 ath12k_dbg(ab, ATH12K_DBG_MAC, "group id %d num_link %d\n", ag->id, num_link); in __ath12k_mac_mlo_setup()
14128 ar->pdev_idx, ret); in __ath12k_mac_mlo_setup()
14132 time_left = wait_for_completion_timeout(&ar->mlo_setup_done, in __ath12k_mac_mlo_setup()
14135 if (!time_left || ar->mlo_setup_status) in __ath12k_mac_mlo_setup()
14136 return ar->mlo_setup_status ? : -ETIMEDOUT; in __ath12k_mac_mlo_setup()
14138 ath12k_dbg(ab, ATH12K_DBG_MAC, "mlo setup done for pdev %d\n", ar->pdev_idx); in __ath12k_mac_mlo_setup()
14145 struct ath12k_base *ab = ar->ab; in __ath12k_mac_mlo_teardown()
14149 if (test_bit(ATH12K_FLAG_RECOVERY, &ab->dev_flags)) in __ath12k_mac_mlo_teardown()
14160 ar->pdev_idx, ret); in __ath12k_mac_mlo_teardown()
14164 ath12k_dbg(ab, ATH12K_DBG_MAC, "mlo teardown for pdev %d\n", ar->pdev_idx); in __ath12k_mac_mlo_teardown()
14176 for (i = 0; i < ag->num_hw; i++) { in ath12k_mac_mlo_setup()
14177 ah = ag->ah[i]; in ath12k_mac_mlo_setup()
14182 ar = &ah->radio[j]; in ath12k_mac_mlo_setup()
14185 ath12k_err(ar->ab, "failed to setup MLO: %d\n", ret); in ath12k_mac_mlo_setup()
14194 for (i = i - 1; i >= 0; i--) { in ath12k_mac_mlo_setup()
14195 ah = ag->ah[i]; in ath12k_mac_mlo_setup()
14199 for (j = j - 1; j >= 0; j--) { in ath12k_mac_mlo_setup()
14200 ar = &ah->radio[j]; in ath12k_mac_mlo_setup()
14217 for (i = 0; i < ag->num_hw; i++) { in ath12k_mac_mlo_teardown()
14218 ah = ag->ah[i]; in ath12k_mac_mlo_teardown()
14223 ar = &ah->radio[j]; in ath12k_mac_mlo_teardown()
14226 ath12k_err(ar->ab, "failed to teardown MLO: %d\n", ret); in ath12k_mac_mlo_teardown()
14239 for (i = 0; i < ag->num_hw; i++) { in ath12k_mac_register()
14250 for (i = i - 1; i >= 0; i--) { in ath12k_mac_register()
14266 for (i = ag->num_hw - 1; i >= 0; i--) { in ath12k_mac_unregister()
14277 ieee80211_free_hw(ah->hw); in ath12k_mac_hw_destroy()
14298 ah->hw = hw; in ath12k_mac_hw_allocate()
14299 ah->num_radio = num_pdev_map; in ath12k_mac_hw_allocate()
14301 mutex_init(&ah->hw_mutex); in ath12k_mac_hw_allocate()
14302 INIT_LIST_HEAD(&ah->ml_peers); in ath12k_mac_hw_allocate()
14307 pdev = &ab->pdevs[pdev_idx]; in ath12k_mac_hw_allocate()
14310 ar->ah = ah; in ath12k_mac_hw_allocate()
14311 ar->ab = ab; in ath12k_mac_hw_allocate()
14312 ar->hw_link_id = pdev->hw_link_id; in ath12k_mac_hw_allocate()
14313 ar->pdev = pdev; in ath12k_mac_hw_allocate()
14314 ar->pdev_idx = pdev_idx; in ath12k_mac_hw_allocate()
14315 pdev->ar = ar; in ath12k_mac_hw_allocate()
14317 ag->hw_links[ar->hw_link_id].device_id = ab->device_id; in ath12k_mac_hw_allocate()
14318 ag->hw_links[ar->hw_link_id].pdev_idx = pdev_idx; in ath12k_mac_hw_allocate()
14330 struct ath12k_base *ab = ag->ab[0]; in ath12k_mac_destroy()
14334 for (i = 0; i < ag->num_devices; i++) { in ath12k_mac_destroy()
14335 ab = ag->ab[i]; in ath12k_mac_destroy()
14339 for (j = 0; j < ab->num_radios; j++) { in ath12k_mac_destroy()
14340 pdev = &ab->pdevs[j]; in ath12k_mac_destroy()
14341 if (!pdev->ar) in ath12k_mac_destroy()
14343 pdev->ar = NULL; in ath12k_mac_destroy()
14347 for (i = 0; i < ag->num_hw; i++) { in ath12k_mac_destroy()
14362 ab->cc_freq_hz = 320000; in ath12k_mac_set_device_defaults()
14363 total_vdev = ab->num_radios * TARGET_NUM_VDEVS(ab); in ath12k_mac_set_device_defaults()
14364 ab->free_vdev_map = (1LL << total_vdev) - 1; in ath12k_mac_set_device_defaults()
14377 for (i = 0; i < ag->num_devices; i++) { in ath12k_mac_allocate()
14378 ab = ag->ab[i]; in ath12k_mac_allocate()
14384 total_radio += ab->num_radios; in ath12k_mac_allocate()
14388 return -EINVAL; in ath12k_mac_allocate()
14391 return -ENOSPC; in ath12k_mac_allocate()
14394 * hardware group which participate in multi-link operation else in ath12k_mac_allocate()
14397 if (ag->mlo_capable) in ath12k_mac_allocate()
14404 ag->num_hw = 0; in ath12k_mac_allocate()
14409 if (device_id >= ag->num_devices || !ag->ab[device_id]) { in ath12k_mac_allocate()
14410 ret = -ENOSPC; in ath12k_mac_allocate()
14414 ab = ag->ab[device_id]; in ath12k_mac_allocate()
14422 if (mac_id >= ab->num_radios) { in ath12k_mac_allocate()
14428 ab = pdev_map->ab; in ath12k_mac_allocate()
14434 ret = -ENOMEM; in ath12k_mac_allocate()
14438 ah->dev = ab->dev; in ath12k_mac_allocate()
14440 ag->ah[i] = ah; in ath12k_mac_allocate()
14441 ag->num_hw++; in ath12k_mac_allocate()
14447 for (i = i - 1; i >= 0; i--) { in ath12k_mac_allocate()
14464 struct ath12k *ar = arvif->ar; in ath12k_mac_vif_set_keepalive()
14467 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_vif_set_keepalive()
14469 if (arvif->ahvif->vdev_type != WMI_VDEV_TYPE_STA) in ath12k_mac_vif_set_keepalive()
14472 if (!test_bit(WMI_TLV_SERVICE_STA_KEEP_ALIVE, ar->ab->wmi_ab.svc_map)) in ath12k_mac_vif_set_keepalive()
14475 arg.vdev_id = arvif->vdev_id; in ath12k_mac_vif_set_keepalive()
14482 ath12k_warn(ar->ab, "failed to set keepalive on vdev %i: %d\n", in ath12k_mac_vif_set_keepalive()
14483 arvif->vdev_id, ret); in ath12k_mac_vif_set_keepalive()