Lines Matching +full:rates +full:- +full:ru

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()
466 /* As default, it is OFDM rates */ in ath12k_mac_hw_ratecode_to_legacy_rate()
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()
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, &params); 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()
1974 const struct ieee80211_rate *rates; in ath12k_peer_assoc_h_rates() local
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()
2001 for (i = 0; i < 32; i++, ratemask >>= 1, rates++) { 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()
2573 int nss, ru; in ath12k_peer_assoc_h_he() local
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()
2583 for (ru = 0; ru < 4; ru++) { 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()
2596 val << (ru * 6); 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()
2658 /* In case of fixed rates, MCS Range in he_tx_mcs might have 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()
3142 u8 nss, ru, i; in ath12k_mac_set_eht_ppe_threshold() local
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()
3150 for (ru = 0; in ath12k_mac_set_eht_ppe_threshold()
3151 ru < hweight16(IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK); in ath12k_mac_set_eht_ppe_threshold()
3152 ru++) { 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()
3163 (val << (ru * ppet_bit_len_per_ru)); 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()
4072 unsigned long links = ahvif->links_map; in ath12k_mac_op_vif_cfg_changed()
4080 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_vif_cfg_changed()
4082 if (changed & BSS_CHANGED_SSID && vif->type == NL80211_IFTYPE_AP) { in ath12k_mac_op_vif_cfg_changed()
4083 ahvif->u.ap.ssid_len = vif->cfg.ssid_len; in ath12k_mac_op_vif_cfg_changed()
4084 if (vif->cfg.ssid_len) in ath12k_mac_op_vif_cfg_changed()
4085 memcpy(ahvif->u.ap.ssid, vif->cfg.ssid, vif->cfg.ssid_len); in ath12k_mac_op_vif_cfg_changed()
4089 if (vif->cfg.assoc) { in ath12k_mac_op_vif_cfg_changed()
4094 sta = ieee80211_find_sta(vif, vif->cfg.ap_addr); in ath12k_mac_op_vif_cfg_changed()
4098 vif->cfg.ap_addr); in ath12k_mac_op_vif_cfg_changed()
4103 arvif = wiphy_dereference(hw->wiphy, in ath12k_mac_op_vif_cfg_changed()
4104 ahvif->link[ahsta->assoc_link_id]); in ath12k_mac_op_vif_cfg_changed()
4107 ar = arvif->ar; in ath12k_mac_op_vif_cfg_changed()
4115 links &= ~BIT(ahsta->assoc_link_id); in ath12k_mac_op_vif_cfg_changed()
4119 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); in ath12k_mac_op_vif_cfg_changed()
4120 if (!arvif || !arvif->ar) in ath12k_mac_op_vif_cfg_changed()
4123 ar = arvif->ar; in ath12k_mac_op_vif_cfg_changed()
4125 if (vif->cfg.assoc) { in ath12k_mac_op_vif_cfg_changed()
4140 struct ath12k *ar = arvif->ar; in ath12k_mac_vif_setup_ps()
4141 struct ieee80211_vif *vif = arvif->ahvif->vif; in ath12k_mac_vif_setup_ps()
4142 struct ieee80211_conf *conf = &ath12k_ar_to_hw(ar)->conf; in ath12k_mac_vif_setup_ps()
4150 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_vif_setup_ps()
4152 if (vif->type != NL80211_IFTYPE_STATION) in ath12k_mac_vif_setup_ps()
4155 enable_ps = arvif->ahvif->ps; in ath12k_mac_vif_setup_ps()
4160 timeout = conf->dynamic_ps_timeout; in ath12k_mac_vif_setup_ps()
4164 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()
4165 vif->addr, arvif->link_id); in ath12k_mac_vif_setup_ps()
4170 timeout = ieee80211_tu_to_usec(info->beacon_int) / 1000; in ath12k_mac_vif_setup_ps()
4173 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param, in ath12k_mac_vif_setup_ps()
4176 ath12k_warn(ar->ab, "failed to set inactivity time for vdev %d: %i\n", in ath12k_mac_vif_setup_ps()
4177 arvif->vdev_id, ret); in ath12k_mac_vif_setup_ps()
4184 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %d psmode %s\n", in ath12k_mac_vif_setup_ps()
4185 arvif->vdev_id, psmode ? "enable" : "disable"); in ath12k_mac_vif_setup_ps()
4187 ret = ath12k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id, psmode); in ath12k_mac_vif_setup_ps()
4189 ath12k_warn(ar->ab, "failed to set sta power save mode %d for vdev %d: %d\n", in ath12k_mac_vif_setup_ps()
4190 psmode, arvif->vdev_id, ret); in ath12k_mac_vif_setup_ps()
4197 test_bit(WMI_TLV_SERVICE_EXT_TPC_REG_SUPPORT, ar->ab->wmi_ab.svc_map) && in ath12k_mac_supports_tpc()
4198 (ahvif->vdev_type == WMI_VDEV_TYPE_STA || in ath12k_mac_supports_tpc()
4199 ahvif->vdev_type == WMI_VDEV_TYPE_AP) && in ath12k_mac_supports_tpc()
4200 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE && in ath12k_mac_supports_tpc()
4201 chandef->chan && in ath12k_mac_supports_tpc()
4202 chandef->chan->band == NL80211_BAND_6GHZ; in ath12k_mac_supports_tpc()
4210 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_mac_bss_info_changed()
4212 struct ieee80211_vif_cfg *vif_cfg = &vif->cfg; in ath12k_mac_bss_info_changed()
4225 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_bss_info_changed()
4228 arvif->beacon_interval = info->beacon_int; in ath12k_mac_bss_info_changed()
4231 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_bss_info_changed()
4233 arvif->beacon_interval); in ath12k_mac_bss_info_changed()
4235 ath12k_warn(ar->ab, "Failed to set beacon interval for VDEV: %d\n", in ath12k_mac_bss_info_changed()
4236 arvif->vdev_id); in ath12k_mac_bss_info_changed()
4238 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_bss_info_changed()
4240 arvif->beacon_interval, arvif->vdev_id); in ath12k_mac_bss_info_changed()
4247 param_value, ar->pdev->pdev_id); in ath12k_mac_bss_info_changed()
4249 ath12k_warn(ar->ab, "Failed to set beacon mode for VDEV: %d\n", in ath12k_mac_bss_info_changed()
4250 arvif->vdev_id); in ath12k_mac_bss_info_changed()
4252 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_bss_info_changed()
4254 arvif->vdev_id); in ath12k_mac_bss_info_changed()
4258 ath12k_warn(ar->ab, "failed to update bcn template: %d\n", in ath12k_mac_bss_info_changed()
4263 arvif->dtim_period = info->dtim_period; in ath12k_mac_bss_info_changed()
4266 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_bss_info_changed()
4268 arvif->dtim_period); in ath12k_mac_bss_info_changed()
4271 ath12k_warn(ar->ab, "Failed to set dtim period for VDEV %d: %i\n", in ath12k_mac_bss_info_changed()
4272 arvif->vdev_id, ret); in ath12k_mac_bss_info_changed()
4274 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_bss_info_changed()
4276 arvif->dtim_period, arvif->vdev_id); in ath12k_mac_bss_info_changed()
4280 vif->type == NL80211_IFTYPE_AP) { in ath12k_mac_bss_info_changed()
4281 ahvif->u.ap.ssid_len = vif->cfg.ssid_len; in ath12k_mac_bss_info_changed()
4282 if (vif->cfg.ssid_len) in ath12k_mac_bss_info_changed()
4283 memcpy(ahvif->u.ap.ssid, vif->cfg.ssid, vif->cfg.ssid_len); in ath12k_mac_bss_info_changed()
4284 ahvif->u.ap.hidden_ssid = info->hidden_ssid; in ath12k_mac_bss_info_changed()
4287 if (changed & BSS_CHANGED_BSSID && !is_zero_ether_addr(info->bssid)) in ath12k_mac_bss_info_changed()
4288 ether_addr_copy(arvif->bssid, info->bssid); in ath12k_mac_bss_info_changed()
4291 if (info->enable_beacon) { in ath12k_mac_bss_info_changed()
4294 ath12k_warn(ar->ab, in ath12k_mac_bss_info_changed()
4296 arvif->vdev_id); in ath12k_mac_bss_info_changed()
4300 ath12k_warn(ar->ab, in ath12k_mac_bss_info_changed()
4302 arvif->vdev_id); in ath12k_mac_bss_info_changed()
4306 if (arvif->is_up && info->he_support && in ath12k_mac_bss_info_changed()
4307 info->he_oper.params) { in ath12k_mac_bss_info_changed()
4309 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_bss_info_changed()
4313 ath12k_warn(ar->ab, in ath12k_mac_bss_info_changed()
4315 arvif->vdev_id); in ath12k_mac_bss_info_changed()
4318 param_value = info->he_oper.params; in ath12k_mac_bss_info_changed()
4319 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_bss_info_changed()
4321 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_bss_info_changed()
4323 param_value, arvif->vdev_id); in ath12k_mac_bss_info_changed()
4326 ath12k_warn(ar->ab, "Failed to set he oper params %x for VDEV %d: %i\n", in ath12k_mac_bss_info_changed()
4327 param_value, arvif->vdev_id, ret); in ath12k_mac_bss_info_changed()
4334 cts_prot = !!(info->use_cts_prot); in ath12k_mac_bss_info_changed()
4337 if (arvif->is_started) { in ath12k_mac_bss_info_changed()
4338 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_bss_info_changed()
4341 ath12k_warn(ar->ab, "Failed to set CTS prot for VDEV: %d\n", in ath12k_mac_bss_info_changed()
4342 arvif->vdev_id); in ath12k_mac_bss_info_changed()
4344 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "Set CTS prot: %d for VDEV: %d\n", in ath12k_mac_bss_info_changed()
4345 cts_prot, arvif->vdev_id); in ath12k_mac_bss_info_changed()
4347 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "defer protection mode setup, vdev is not ready yet\n"); in ath12k_mac_bss_info_changed()
4354 if (info->use_short_slot) in ath12k_mac_bss_info_changed()
4361 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_bss_info_changed()
4364 ath12k_warn(ar->ab, "Failed to set erp slot for VDEV: %d\n", in ath12k_mac_bss_info_changed()
4365 arvif->vdev_id); in ath12k_mac_bss_info_changed()
4367 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_bss_info_changed()
4369 slottime, arvif->vdev_id); in ath12k_mac_bss_info_changed()
4375 if (info->use_short_preamble) in ath12k_mac_bss_info_changed()
4381 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_bss_info_changed()
4384 ath12k_warn(ar->ab, "Failed to set preamble for VDEV: %d\n", in ath12k_mac_bss_info_changed()
4385 arvif->vdev_id); in ath12k_mac_bss_info_changed()
4387 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_bss_info_changed()
4389 preamble, arvif->vdev_id); in ath12k_mac_bss_info_changed()
4393 if (vif->cfg.assoc) in ath12k_mac_bss_info_changed()
4400 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev_id %i txpower %d\n", in ath12k_mac_bss_info_changed()
4401 arvif->vdev_id, info->txpower); in ath12k_mac_bss_info_changed()
4403 arvif->txpower = info->txpower; in ath12k_mac_bss_info_changed()
4408 !ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)) { in ath12k_mac_bss_info_changed()
4409 band = def.chan->band; in ath12k_mac_bss_info_changed()
4410 mcast_rate = info->mcast_rate[band]; in ath12k_mac_bss_info_changed()
4413 rateidx = mcast_rate - 1; in ath12k_mac_bss_info_changed()
4415 if (info->basic_rates) in ath12k_mac_bss_info_changed()
4416 rateidx = __ffs(info->basic_rates); in ath12k_mac_bss_info_changed()
4421 if (ar->pdev->cap.supported_bands & WMI_HOST_WLAN_5GHZ_CAP) in ath12k_mac_bss_info_changed()
4434 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_bss_info_changed()
4436 arvif->vdev_id, rate); in ath12k_mac_bss_info_changed()
4439 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_bss_info_changed()
4442 ath12k_warn(ar->ab, in ath12k_mac_bss_info_changed()
4444 arvif->vdev_id, ret); in ath12k_mac_bss_info_changed()
4447 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_bss_info_changed()
4450 ath12k_warn(ar->ab, in ath12k_mac_bss_info_changed()
4452 arvif->vdev_id, ret); in ath12k_mac_bss_info_changed()
4456 !ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)) in ath12k_mac_bss_info_changed()
4460 if (info->twt_requester || info->twt_responder) in ath12k_mac_bss_info_changed()
4461 ath12k_wmi_send_twt_enable_cmd(ar, ar->pdev->pdev_id); in ath12k_mac_bss_info_changed()
4463 ath12k_wmi_send_twt_disable_cmd(ar, ar->pdev->pdev_id); in ath12k_mac_bss_info_changed()
4467 ath12k_wmi_send_obss_spr_cmd(ar, arvif->vdev_id, in ath12k_mac_bss_info_changed()
4468 &info->he_obss_pd); in ath12k_mac_bss_info_changed()
4471 if (vif->type == NL80211_IFTYPE_AP) { in ath12k_mac_bss_info_changed()
4473 arvif->vdev_id, in ath12k_mac_bss_info_changed()
4474 info->he_bss_color.color, in ath12k_mac_bss_info_changed()
4476 info->he_bss_color.enabled); in ath12k_mac_bss_info_changed()
4478 ath12k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n", in ath12k_mac_bss_info_changed()
4479 arvif->vdev_id, ret); in ath12k_mac_bss_info_changed()
4480 } else if (vif->type == NL80211_IFTYPE_STATION) { in ath12k_mac_bss_info_changed()
4482 arvif->vdev_id, in ath12k_mac_bss_info_changed()
4485 ath12k_warn(ar->ab, "failed to enable bss color change on vdev %i: %d\n", in ath12k_mac_bss_info_changed()
4486 arvif->vdev_id, ret); in ath12k_mac_bss_info_changed()
4488 arvif->vdev_id, in ath12k_mac_bss_info_changed()
4493 ath12k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n", in ath12k_mac_bss_info_changed()
4494 arvif->vdev_id, ret); in ath12k_mac_bss_info_changed()
4501 ar->ab->hw_params->supports_sta_ps) { in ath12k_mac_bss_info_changed()
4502 ahvif->ps = vif_cfg->ps; in ath12k_mac_bss_info_changed()
4510 if (!ahvif->cache[link_id]) { in ath12k_ahvif_get_link_cache()
4511 ahvif->cache[link_id] = kzalloc(sizeof(*ahvif->cache[0]), GFP_KERNEL); in ath12k_ahvif_get_link_cache()
4512 if (ahvif->cache[link_id]) in ath12k_ahvif_get_link_cache()
4513 INIT_LIST_HEAD(&ahvif->cache[link_id]->key_conf.list); in ath12k_ahvif_get_link_cache()
4516 return ahvif->cache[link_id]; in ath12k_ahvif_get_link_cache()
4523 if (!cache || list_empty(&cache->key_conf.list)) in ath12k_ahvif_put_link_key_cache()
4525 list_for_each_entry_safe(key_conf, tmp, &cache->key_conf.list, list) { in ath12k_ahvif_put_link_key_cache()
4526 list_del(&key_conf->list); in ath12k_ahvif_put_link_key_cache()
4536 ath12k_ahvif_put_link_key_cache(ahvif->cache[link_id]); in ath12k_ahvif_put_link_cache()
4537 kfree(ahvif->cache[link_id]); in ath12k_ahvif_put_link_cache()
4538 ahvif->cache[link_id] = NULL; in ath12k_ahvif_put_link_cache()
4550 u8 link_id = info->link_id; in ath12k_mac_op_link_info_changed()
4552 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_link_info_changed()
4554 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); in ath12k_mac_op_link_info_changed()
4560 if (!arvif || !arvif->is_created) { in ath12k_mac_op_link_info_changed()
4565 cache->bss_conf_changed |= changed; in ath12k_mac_op_link_info_changed()
4570 ar = arvif->ar; in ath12k_mac_op_link_info_changed()
4580 struct ath12k_hw *ah = hw->priv; in ath12k_mac_select_scan_device()
4585 if (ah->num_radio == 1) in ath12k_mac_select_scan_device()
4586 return ah->radio; in ath12k_mac_select_scan_device()
4603 if (ar->mac.sbands[band].channels && in ath12k_mac_select_scan_device()
4604 center_freq >= KHZ_TO_MHZ(ar->freq_range.start_freq) && in ath12k_mac_select_scan_device()
4605 center_freq <= KHZ_TO_MHZ(ar->freq_range.end_freq)) in ath12k_mac_select_scan_device()
4616 lockdep_assert_held(&ar->data_lock); in __ath12k_mac_scan_finish()
4618 switch (ar->scan.state) { in __ath12k_mac_scan_finish()
4623 if (ar->scan.is_roc && ar->scan.roc_notify) in __ath12k_mac_scan_finish()
4627 cancel_delayed_work(&ar->scan.timeout); in __ath12k_mac_scan_finish()
4628 complete_all(&ar->scan.completed); in __ath12k_mac_scan_finish()
4629 wiphy_work_queue(ar->ah->hw->wiphy, &ar->scan.vdev_clean_wk); in __ath12k_mac_scan_finish()
4636 spin_lock_bh(&ar->data_lock); in ath12k_mac_scan_finish()
4638 spin_unlock_bh(&ar->data_lock); in ath12k_mac_scan_finish()
4649 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_scan_stop()
4652 arg.pdev_id = ar->pdev->pdev_id; in ath12k_scan_stop()
4656 ath12k_warn(ar->ab, "failed to stop wmi scan: %d\n", ret); in ath12k_scan_stop()
4660 ret = wait_for_completion_timeout(&ar->scan.completed, 3 * HZ); in ath12k_scan_stop()
4662 ath12k_warn(ar->ab, in ath12k_scan_stop()
4664 ret = -ETIMEDOUT; in ath12k_scan_stop()
4677 spin_lock_bh(&ar->data_lock); in ath12k_scan_stop()
4680 spin_unlock_bh(&ar->data_lock); in ath12k_scan_stop()
4689 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_scan_abort()
4691 spin_lock_bh(&ar->data_lock); in ath12k_scan_abort()
4693 switch (ar->scan.state) { in ath12k_scan_abort()
4701 ath12k_warn(ar->ab, "refusing scan abortion due to invalid scan state: %d\n", in ath12k_scan_abort()
4702 ar->scan.state); in ath12k_scan_abort()
4705 ar->scan.state = ATH12K_SCAN_ABORTING; in ath12k_scan_abort()
4706 spin_unlock_bh(&ar->data_lock); in ath12k_scan_abort()
4710 ath12k_warn(ar->ab, "failed to abort scan: %d\n", ret); in ath12k_scan_abort()
4712 spin_lock_bh(&ar->data_lock); in ath12k_scan_abort()
4716 spin_unlock_bh(&ar->data_lock); in ath12k_scan_abort()
4724 wiphy_lock(ath12k_ar_to_hw(ar)->wiphy); in ath12k_scan_timeout_work()
4726 wiphy_unlock(ath12k_ar_to_hw(ar)->wiphy); in ath12k_scan_timeout_work()
4732 struct ath12k_hw *ah = ar->ah; in ath12k_mac_scan_send_complete()
4736 lockdep_assert_wiphy(ah->hw->wiphy); in ath12k_mac_scan_send_complete()
4740 partner_ar->scan.state == ATH12K_SCAN_RUNNING) in ath12k_mac_scan_send_complete()
4743 ieee80211_scan_completed(ah->hw, info); in ath12k_mac_scan_send_complete()
4750 struct ath12k_hw *ah = ar->ah; in ath12k_scan_vdev_clean_work()
4755 arvif = ar->scan.arvif; in ath12k_scan_vdev_clean_work()
4764 if (!arvif || arvif->is_started) in ath12k_scan_vdev_clean_work()
4767 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac clean scan vdev (link id %u)", in ath12k_scan_vdev_clean_work()
4768 arvif->link_id); in ath12k_scan_vdev_clean_work()
4770 ath12k_mac_remove_link_interface(ah->hw, arvif); in ath12k_scan_vdev_clean_work()
4774 spin_lock_bh(&ar->data_lock); in ath12k_scan_vdev_clean_work()
4775 ar->scan.arvif = NULL; in ath12k_scan_vdev_clean_work()
4776 if (!ar->scan.is_roc) { in ath12k_scan_vdev_clean_work()
4778 .aborted = ((ar->scan.state == in ath12k_scan_vdev_clean_work()
4780 (ar->scan.state == in ath12k_scan_vdev_clean_work()
4787 ar->scan.state = ATH12K_SCAN_IDLE; in ath12k_scan_vdev_clean_work()
4788 ar->scan_channel = NULL; in ath12k_scan_vdev_clean_work()
4789 ar->scan.roc_freq = 0; in ath12k_scan_vdev_clean_work()
4790 spin_unlock_bh(&ar->data_lock); in ath12k_scan_vdev_clean_work()
4798 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_start_scan()
4804 ret = wait_for_completion_timeout(&ar->scan.started, 1 * HZ); in ath12k_start_scan()
4808 ath12k_warn(ar->ab, "failed to stop scan: %d\n", ret); in ath12k_start_scan()
4810 return -ETIMEDOUT; in ath12k_start_scan()
4817 spin_lock_bh(&ar->data_lock); in ath12k_start_scan()
4818 if (ar->scan.state == ATH12K_SCAN_IDLE) { in ath12k_start_scan()
4819 spin_unlock_bh(&ar->data_lock); in ath12k_start_scan()
4820 return -EINVAL; in ath12k_start_scan()
4822 spin_unlock_bh(&ar->data_lock); in ath12k_start_scan()
4830 struct ath12k_base *ab = ar->ab; in ath12k_mac_get_fw_stats()
4835 guard(mutex)(&ah->hw_mutex); in ath12k_mac_get_fw_stats()
4837 if (ah->state != ATH12K_HW_STATE_ON) in ath12k_mac_get_fw_stats()
4838 return -ENETDOWN; in ath12k_mac_get_fw_stats()
4842 reinit_completion(&ar->fw_stats_complete); in ath12k_mac_get_fw_stats()
4843 reinit_completion(&ar->fw_stats_done); in ath12k_mac_get_fw_stats()
4845 ret = ath12k_wmi_send_stats_request_cmd(ar, param->stats_id, in ath12k_mac_get_fw_stats()
4846 param->vdev_id, param->pdev_id); in ath12k_mac_get_fw_stats()
4854 param->pdev_id, param->vdev_id, param->stats_id); in ath12k_mac_get_fw_stats()
4856 time_left = wait_for_completion_timeout(&ar->fw_stats_complete, 1 * HZ); in ath12k_mac_get_fw_stats()
4859 return -ETIMEDOUT; in ath12k_mac_get_fw_stats()
4862 /* Firmware sends WMI_UPDATE_STATS_EVENTID back-to-back in ath12k_mac_get_fw_stats()
4868 time_left = wait_for_completion_timeout(&ar->fw_stats_done, 3 * HZ); in ath12k_mac_get_fw_stats()
4871 return -ETIMEDOUT; in ath12k_mac_get_fw_stats()
4885 struct ath12k_hw *ah = hw->priv; in ath12k_mac_op_get_txpower()
4897 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_get_txpower()
4899 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]); in ath12k_mac_op_get_txpower()
4900 if (!arvif || !arvif->ar) in ath12k_mac_op_get_txpower()
4901 return -EINVAL; in ath12k_mac_op_get_txpower()
4903 ar = arvif->ar; in ath12k_mac_op_get_txpower()
4904 ab = ar->ab; in ath12k_mac_op_get_txpower()
4905 if (ah->state != ATH12K_HW_STATE_ON) in ath12k_mac_op_get_txpower()
4908 if (test_bit(ATH12K_FLAG_CAC_RUNNING, &ar->dev_flags)) in ath12k_mac_op_get_txpower()
4909 return -EAGAIN; in ath12k_mac_op_get_txpower()
4912 if (ar->chan_tx_pwr != ATH12K_PDEV_TX_POWER_INVALID && in ath12k_mac_op_get_txpower()
4915 ar->last_tx_power_update)) in ath12k_mac_op_get_txpower()
4918 params.pdev_id = ar->pdev->pdev_id; in ath12k_mac_op_get_txpower()
4919 params.vdev_id = arvif->vdev_id; in ath12k_mac_op_get_txpower()
4927 spin_lock_bh(&ar->data_lock); in ath12k_mac_op_get_txpower()
4928 pdev = list_first_entry_or_null(&ar->fw_stats.pdevs, in ath12k_mac_op_get_txpower()
4931 spin_unlock_bh(&ar->data_lock); in ath12k_mac_op_get_txpower()
4936 ar->chan_tx_pwr = pdev->chan_tx_power / 2; in ath12k_mac_op_get_txpower()
4937 spin_unlock_bh(&ar->data_lock); in ath12k_mac_op_get_txpower()
4938 ar->last_tx_power_update = jiffies; in ath12k_mac_op_get_txpower()
4941 *dbm = ar->chan_tx_pwr; in ath12k_mac_op_get_txpower()
4942 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "txpower fetched from firmware %d dBm\n", in ath12k_mac_op_get_txpower()
4947 /* We didn't get txpower from FW. Hence, relying on vif->bss_conf.txpower */ in ath12k_mac_op_get_txpower()
4948 *dbm = vif->bss_conf.txpower; in ath12k_mac_op_get_txpower()
4949 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "txpower from firmware NaN, reported %d dBm\n", in ath12k_mac_op_get_txpower()
4958 struct ath12k_hw *ah = ahvif->ah; in ath12k_mac_find_link_id_by_ar()
4959 unsigned long links = ahvif->links_map; in ath12k_mac_find_link_id_by_ar()
4963 lockdep_assert_wiphy(ah->hw->wiphy); in ath12k_mac_find_link_id_by_ar()
4966 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]); in ath12k_mac_find_link_id_by_ar()
4968 if (!arvif || !arvif->is_created) in ath12k_mac_find_link_id_by_ar()
4971 if (ar == arvif->ar) in ath12k_mac_find_link_id_by_ar()
4981 /* Unset all non-scan links (0-14) of scan_links_map so that ffs() will in ath12k_mac_find_link_id_by_ar()
4984 scan_links_map = ~ahvif->links_map & ATH12K_SCAN_LINKS_MASK; in ath12k_mac_find_link_id_by_ar()
5001 struct cfg80211_scan_request *req = &hw_req->req; in ath12k_mac_initiate_hw_scan()
5008 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_initiate_hw_scan()
5010 arvif = &ahvif->deflink; in ath12k_mac_initiate_hw_scan()
5022 return -EBUSY; in ath12k_mac_initiate_hw_scan()
5026 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac link ID %d selected for scan", in ath12k_mac_initiate_hw_scan()
5027 arvif->link_id); in ath12k_mac_initiate_hw_scan()
5035 * delete-create vdev's for the same ar, in case the request is in ath12k_mac_initiate_hw_scan()
5038 if (arvif->is_created) { in ath12k_mac_initiate_hw_scan()
5039 if (WARN_ON(!arvif->ar)) in ath12k_mac_initiate_hw_scan()
5040 return -EINVAL; in ath12k_mac_initiate_hw_scan()
5042 if (ar != arvif->ar && arvif->is_started) in ath12k_mac_initiate_hw_scan()
5043 return -EINVAL; in ath12k_mac_initiate_hw_scan()
5045 if (ar != arvif->ar) { in ath12k_mac_initiate_hw_scan()
5061 ath12k_warn(ar->ab, "unable to create scan vdev %d\n", ret); in ath12k_mac_initiate_hw_scan()
5062 return -EINVAL; in ath12k_mac_initiate_hw_scan()
5066 spin_lock_bh(&ar->data_lock); in ath12k_mac_initiate_hw_scan()
5067 switch (ar->scan.state) { in ath12k_mac_initiate_hw_scan()
5069 reinit_completion(&ar->scan.started); in ath12k_mac_initiate_hw_scan()
5070 reinit_completion(&ar->scan.completed); in ath12k_mac_initiate_hw_scan()
5071 ar->scan.state = ATH12K_SCAN_STARTING; in ath12k_mac_initiate_hw_scan()
5072 ar->scan.is_roc = false; in ath12k_mac_initiate_hw_scan()
5073 ar->scan.arvif = arvif; in ath12k_mac_initiate_hw_scan()
5079 ret = -EBUSY; in ath12k_mac_initiate_hw_scan()
5082 spin_unlock_bh(&ar->data_lock); in ath12k_mac_initiate_hw_scan()
5089 ret = -ENOMEM; in ath12k_mac_initiate_hw_scan()
5094 arg->vdev_id = arvif->vdev_id; in ath12k_mac_initiate_hw_scan()
5095 arg->scan_id = ATH12K_SCAN_ID; in ath12k_mac_initiate_hw_scan()
5097 if (req->ie_len) { in ath12k_mac_initiate_hw_scan()
5098 arg->extraie.ptr = kmemdup(req->ie, req->ie_len, GFP_KERNEL); in ath12k_mac_initiate_hw_scan()
5099 if (!arg->extraie.ptr) { in ath12k_mac_initiate_hw_scan()
5100 ret = -ENOMEM; in ath12k_mac_initiate_hw_scan()
5103 arg->extraie.len = req->ie_len; in ath12k_mac_initiate_hw_scan()
5106 if (req->n_ssids) { in ath12k_mac_initiate_hw_scan()
5107 arg->num_ssids = req->n_ssids; in ath12k_mac_initiate_hw_scan()
5108 for (i = 0; i < arg->num_ssids; i++) in ath12k_mac_initiate_hw_scan()
5109 arg->ssid[i] = req->ssids[i]; in ath12k_mac_initiate_hw_scan()
5111 arg->scan_f_passive = 1; in ath12k_mac_initiate_hw_scan()
5115 arg->num_chan = n_channels; in ath12k_mac_initiate_hw_scan()
5116 arg->chan_list = kcalloc(arg->num_chan, sizeof(*arg->chan_list), in ath12k_mac_initiate_hw_scan()
5118 if (!arg->chan_list) { in ath12k_mac_initiate_hw_scan()
5119 ret = -ENOMEM; in ath12k_mac_initiate_hw_scan()
5123 for (i = 0; i < arg->num_chan; i++) in ath12k_mac_initiate_hw_scan()
5124 arg->chan_list[i] = chan_list[i]->center_freq; in ath12k_mac_initiate_hw_scan()
5129 if (ret == -EBUSY) in ath12k_mac_initiate_hw_scan()
5130 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_initiate_hw_scan()
5131 "scan engine is busy 11d state %d\n", ar->state_11d); in ath12k_mac_initiate_hw_scan()
5133 ath12k_warn(ar->ab, "failed to start hw scan: %d\n", ret); in ath12k_mac_initiate_hw_scan()
5135 spin_lock_bh(&ar->data_lock); in ath12k_mac_initiate_hw_scan()
5136 ar->scan.state = ATH12K_SCAN_IDLE; in ath12k_mac_initiate_hw_scan()
5137 spin_unlock_bh(&ar->data_lock); in ath12k_mac_initiate_hw_scan()
5141 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac scan started"); in ath12k_mac_initiate_hw_scan()
5144 ieee80211_queue_delayed_work(ath12k_ar_to_hw(ar), &ar->scan.timeout, in ath12k_mac_initiate_hw_scan()
5145 msecs_to_jiffies(arg->max_scan_time + in ath12k_mac_initiate_hw_scan()
5150 kfree(arg->chan_list); in ath12k_mac_initiate_hw_scan()
5151 kfree(arg->extraie.ptr); in ath12k_mac_initiate_hw_scan()
5155 if (ar->state_11d == ATH12K_11D_PREPARING && in ath12k_mac_initiate_hw_scan()
5156 ahvif->vdev_type == WMI_VDEV_TYPE_STA && in ath12k_mac_initiate_hw_scan()
5157 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE) in ath12k_mac_initiate_hw_scan()
5158 ath12k_mac_11d_scan_start(ar, arvif->vdev_id); in ath12k_mac_initiate_hw_scan()
5175 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_hw_scan()
5177 chan_list = kcalloc(hw_req->req.n_channels, sizeof(*chan_list), GFP_KERNEL); in ath12k_mac_op_hw_scan()
5179 return -ENOMEM; in ath12k_mac_op_hw_scan()
5189 for (j = 0; j < hw_req->req.n_channels; j++) { in ath12k_mac_op_hw_scan()
5190 chan = hw_req->req.channels[j]; in ath12k_mac_op_hw_scan()
5192 chan->center_freq); in ath12k_mac_op_hw_scan()
5195 chan->center_freq); in ath12k_mac_op_hw_scan()
5196 ret = -EINVAL; in ath12k_mac_op_hw_scan()
5218 links_map = ahvif->links_map; in ath12k_mac_op_hw_scan()
5220 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); in ath12k_mac_op_hw_scan()
5224 ar = arvif->ar; in ath12k_mac_op_hw_scan()
5225 if (ar->scan.arvif == arvif) { in ath12k_mac_op_hw_scan()
5226 wiphy_work_cancel(hw->wiphy, &ar->scan.vdev_clean_wk); in ath12k_mac_op_hw_scan()
5227 spin_lock_bh(&ar->data_lock); in ath12k_mac_op_hw_scan()
5228 ar->scan.arvif = NULL; in ath12k_mac_op_hw_scan()
5229 ar->scan.state = ATH12K_SCAN_IDLE; in ath12k_mac_op_hw_scan()
5230 ar->scan_channel = NULL; in ath12k_mac_op_hw_scan()
5231 ar->scan.roc_freq = 0; in ath12k_mac_op_hw_scan()
5232 spin_unlock_bh(&ar->data_lock); in ath12k_mac_op_hw_scan()
5248 unsigned long link_id, links_map = ahvif->links_map; in ath12k_mac_op_cancel_hw_scan()
5252 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_cancel_hw_scan()
5255 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); in ath12k_mac_op_cancel_hw_scan()
5256 if (!arvif || arvif->is_started) in ath12k_mac_op_cancel_hw_scan()
5259 ar = arvif->ar; in ath12k_mac_op_cancel_hw_scan()
5263 cancel_delayed_work_sync(&ar->scan.timeout); in ath12k_mac_op_cancel_hw_scan()
5273 struct ath12k *ar = arvif->ar; in ath12k_install_key()
5275 .vdev_id = arvif->vdev_id, in ath12k_install_key()
5276 .key_idx = key->keyidx, in ath12k_install_key()
5277 .key_len = key->keylen, in ath12k_install_key()
5278 .key_data = key->key, in ath12k_install_key()
5280 .ieee80211_key_cipher = key->cipher, in ath12k_install_key()
5283 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_install_key()
5285 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_install_key()
5287 if (test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags)) in ath12k_install_key()
5298 switch (key->cipher) { in ath12k_install_key()
5302 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT; in ath12k_install_key()
5312 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT; in ath12k_install_key()
5325 ath12k_warn(ar->ab, "cipher %d is not supported\n", key->cipher); in ath12k_install_key()
5326 return -EOPNOTSUPP; in ath12k_install_key()
5329 if (test_bit(ATH12K_FLAG_RAW_MODE, &ar->ab->dev_flags)) in ath12k_install_key()
5330 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV | in ath12k_install_key()
5334 if (ahvif->vdev_type == WMI_VDEV_TYPE_STA && in ath12k_install_key()
5337 if (arvif->pairwise_key_done) { in ath12k_install_key()
5338 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_install_key()
5348 arvif->group_key = arg; in ath12k_install_key()
5349 arvif->group_key_valid = true; in ath12k_install_key()
5350 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_install_key()
5358 arvif->group_key_valid = false; in ath12k_install_key()
5363 reinit_completion(&ar->install_key_done); in ath12k_install_key()
5365 ret = ath12k_wmi_vdev_install_key(arvif->ar, &arg); in ath12k_install_key()
5369 if (!wait_for_completion_timeout(&ar->install_key_done, 1 * HZ)) in ath12k_install_key()
5370 return -ETIMEDOUT; in ath12k_install_key()
5372 if (ether_addr_equal(arg.macaddr, arvif->bssid)) in ath12k_install_key()
5373 ahvif->key_cipher = arg.ieee80211_key_cipher; in ath12k_install_key()
5375 if (ar->install_key_status) { in ath12k_install_key()
5376 ret = -EINVAL; in ath12k_install_key()
5380 if (ahvif->vdev_type == WMI_VDEV_TYPE_STA && in ath12k_install_key()
5383 arvif->pairwise_key_done = true; in ath12k_install_key()
5384 if (arvif->group_key_valid) { in ath12k_install_key()
5386 arvif->group_key_valid = false; in ath12k_install_key()
5387 arg = arvif->group_key; in ath12k_install_key()
5388 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_install_key()
5394 arvif->pairwise_key_done = false; in ath12k_install_key()
5401 * but triggers re-connection directly, so manually reset in ath12k_install_key()
5404 arvif->group_key_valid = false; in ath12k_install_key()
5405 arvif->pairwise_key_done = false; in ath12k_install_key()
5414 struct ath12k *ar = arvif->ar; in ath12k_clear_peer_keys()
5415 struct ath12k_base *ab = ar->ab; in ath12k_clear_peer_keys()
5422 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_clear_peer_keys()
5424 spin_lock_bh(&ab->base_lock); in ath12k_clear_peer_keys()
5425 peer = ath12k_peer_find(ab, arvif->vdev_id, addr); in ath12k_clear_peer_keys()
5426 spin_unlock_bh(&ab->base_lock); in ath12k_clear_peer_keys()
5429 return -ENOENT; in ath12k_clear_peer_keys()
5431 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) { in ath12k_clear_peer_keys()
5432 if (!peer->keys[i]) in ath12k_clear_peer_keys()
5436 ret = ath12k_install_key(arvif, peer->keys[i], in ath12k_clear_peer_keys()
5445 spin_lock_bh(&ab->base_lock); in ath12k_clear_peer_keys()
5446 peer->keys[i] = NULL; in ath12k_clear_peer_keys()
5447 spin_unlock_bh(&ab->base_lock); in ath12k_clear_peer_keys()
5459 struct ath12k_base *ab = ar->ab; in ath12k_mac_set_key()
5466 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_set_key()
5469 sta = ath12k_ahsta_to_sta(arsta->ahsta); in ath12k_mac_set_key()
5471 if (test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ab->dev_flags)) in ath12k_mac_set_key()
5475 peer_addr = arsta->addr; in ath12k_mac_set_key()
5477 peer_addr = arvif->bssid; in ath12k_mac_set_key()
5479 key->hw_key_idx = key->keyidx; in ath12k_mac_set_key()
5481 /* the peer should not disappear in mid-way (unless FW goes awry) since in ath12k_mac_set_key()
5484 spin_lock_bh(&ab->base_lock); in ath12k_mac_set_key()
5485 peer = ath12k_peer_find(ab, arvif->vdev_id, peer_addr); in ath12k_mac_set_key()
5486 spin_unlock_bh(&ab->base_lock); in ath12k_mac_set_key()
5490 ath12k_warn(ab, "cannot install key for non-existent peer %pM\n", in ath12k_mac_set_key()
5492 return -EOPNOTSUPP; in ath12k_mac_set_key()
5501 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) in ath12k_mac_set_key()
5518 spin_lock_bh(&ab->base_lock); in ath12k_mac_set_key()
5519 peer = ath12k_peer_find(ab, arvif->vdev_id, peer_addr); in ath12k_mac_set_key()
5521 peer->keys[key->keyidx] = key; in ath12k_mac_set_key()
5522 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) { in ath12k_mac_set_key()
5523 peer->ucast_keyidx = key->keyidx; in ath12k_mac_set_key()
5524 peer->sec_type = ath12k_dp_tx_get_encrypt_type(key->cipher); in ath12k_mac_set_key()
5526 peer->mcast_keyidx = key->keyidx; in ath12k_mac_set_key()
5527 peer->sec_type_grp = ath12k_dp_tx_get_encrypt_type(key->cipher); in ath12k_mac_set_key()
5530 peer->keys[key->keyidx] = NULL; in ath12k_mac_set_key()
5531 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) in ath12k_mac_set_key()
5532 peer->ucast_keyidx = 0; in ath12k_mac_set_key()
5534 peer->mcast_keyidx = 0; in ath12k_mac_set_key()
5542 switch (key->cipher) { in ath12k_mac_set_key()
5549 ahsta->pn_type = HAL_PN_TYPE_WPA; in ath12k_mac_set_key()
5551 ahsta->pn_type = HAL_PN_TYPE_NONE; in ath12k_mac_set_key()
5554 ahsta->pn_type = HAL_PN_TYPE_NONE; in ath12k_mac_set_key()
5559 spin_unlock_bh(&ab->base_lock); in ath12k_mac_set_key()
5571 list_for_each_entry_safe(key_conf, tmp, &cache->key_conf.list, list) { in ath12k_mac_update_key_cache()
5572 if (key_conf->key != key) in ath12k_mac_update_key_cache()
5583 list_del(&key_conf->list); in ath12k_mac_update_key_cache()
5591 return -ENOMEM; in ath12k_mac_update_key_cache()
5593 key_conf->cmd = cmd; in ath12k_mac_update_key_cache()
5594 key_conf->sta = sta; in ath12k_mac_update_key_cache()
5595 key_conf->key = key; in ath12k_mac_update_key_cache()
5596 list_add_tail(&key_conf->list, in ath12k_mac_update_key_cache()
5597 &cache->key_conf.list); in ath12k_mac_update_key_cache()
5616 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_set_key()
5619 if (key->keyidx == 4 || key->keyidx == 5) in ath12k_mac_op_set_key()
5622 if (key->keyidx > WMI_MAX_KEY_INDEX) in ath12k_mac_op_set_key()
5623 return -ENOSPC; in ath12k_mac_op_set_key()
5631 if (sta->mlo) { in ath12k_mac_op_set_key()
5632 links = ahsta->links_map; in ath12k_mac_op_set_key()
5634 arvif = wiphy_dereference(hw->wiphy, in ath12k_mac_op_set_key()
5635 ahvif->link[link_id]); in ath12k_mac_op_set_key()
5636 arsta = wiphy_dereference(hw->wiphy, in ath12k_mac_op_set_key()
5637 ahsta->link[link_id]); in ath12k_mac_op_set_key()
5645 ret = ath12k_mac_set_key(arvif->ar, cmd, arvif, in ath12k_mac_op_set_key()
5654 arsta = &ahsta->deflink; in ath12k_mac_op_set_key()
5655 arvif = arsta->arvif; in ath12k_mac_op_set_key()
5657 return -EINVAL; in ath12k_mac_op_set_key()
5659 ret = ath12k_mac_set_key(arvif->ar, cmd, arvif, arsta, key); in ath12k_mac_op_set_key()
5666 if (key->link_id >= 0 && key->link_id < IEEE80211_MLD_MAX_NUM_LINKS) { in ath12k_mac_op_set_key()
5667 link_id = key->link_id; in ath12k_mac_op_set_key()
5668 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); in ath12k_mac_op_set_key()
5671 arvif = &ahvif->deflink; in ath12k_mac_op_set_key()
5674 if (!arvif || !arvif->is_created) { in ath12k_mac_op_set_key()
5677 return -ENOSPC; in ath12k_mac_op_set_key()
5686 ret = ath12k_mac_set_key(arvif->ar, cmd, arvif, NULL, key); in ath12k_mac_op_set_key()
5701 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) in ath12k_mac_bitrate_mask_num_vht_rates()
5702 num_rates += hweight16(mask->control[band].vht_mcs[i]); in ath12k_mac_bitrate_mask_num_vht_rates()
5715 for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) in ath12k_mac_bitrate_mask_num_he_rates()
5716 num_rates += hweight16(mask->control[band].he_mcs[i]); in ath12k_mac_bitrate_mask_num_he_rates()
5727 struct ath12k *ar = arvif->ar; in ath12k_mac_set_peer_vht_fixed_rate()
5732 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_set_peer_vht_fixed_rate()
5736 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) { in ath12k_mac_set_peer_vht_fixed_rate()
5737 if (hweight16(mask->control[band].vht_mcs[i]) == 1) { in ath12k_mac_set_peer_vht_fixed_rate()
5739 vht_rate = ffs(mask->control[band].vht_mcs[i]) - 1; in ath12k_mac_set_peer_vht_fixed_rate()
5744 ath12k_warn(ar->ab, "No single VHT Fixed rate found to set for %pM", in ath12k_mac_set_peer_vht_fixed_rate()
5745 arsta->addr); in ath12k_mac_set_peer_vht_fixed_rate()
5746 return -EINVAL; in ath12k_mac_set_peer_vht_fixed_rate()
5749 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_set_peer_vht_fixed_rate()
5750 "Setting Fixed VHT Rate for peer %pM. Device will not switch to any other selected rates", in ath12k_mac_set_peer_vht_fixed_rate()
5751 arsta->addr); in ath12k_mac_set_peer_vht_fixed_rate()
5753 rate_code = ATH12K_HW_RATE_CODE(vht_rate, nss - 1, in ath12k_mac_set_peer_vht_fixed_rate()
5755 ret = ath12k_wmi_set_peer_param(ar, arsta->addr, in ath12k_mac_set_peer_vht_fixed_rate()
5756 arvif->vdev_id, in ath12k_mac_set_peer_vht_fixed_rate()
5760 ath12k_warn(ar->ab, in ath12k_mac_set_peer_vht_fixed_rate()
5762 arsta->addr, rate_code, ret); in ath12k_mac_set_peer_vht_fixed_rate()
5773 struct ath12k *ar = arvif->ar; in ath12k_mac_set_peer_he_fixed_rate()
5777 struct ath12k_sta *ahsta = arsta->ahsta; in ath12k_mac_set_peer_he_fixed_rate()
5780 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_set_peer_he_fixed_rate()
5785 for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) { in ath12k_mac_set_peer_he_fixed_rate()
5786 if (hweight16(mask->control[band].he_mcs[i]) == 1) { in ath12k_mac_set_peer_he_fixed_rate()
5788 he_rate = ffs(mask->control[band].he_mcs[i]) - 1; in ath12k_mac_set_peer_he_fixed_rate()
5793 ath12k_warn(ar->ab, "No single HE Fixed rate found to set for %pM", in ath12k_mac_set_peer_he_fixed_rate()
5794 arsta->addr); in ath12k_mac_set_peer_he_fixed_rate()
5795 return -EINVAL; in ath12k_mac_set_peer_he_fixed_rate()
5799 if (nss > sta->deflink.rx_nss) in ath12k_mac_set_peer_he_fixed_rate()
5800 return -EINVAL; in ath12k_mac_set_peer_he_fixed_rate()
5802 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_set_peer_he_fixed_rate()
5803 "Setting Fixed HE Rate for peer %pM. Device will not switch to any other selected rates", in ath12k_mac_set_peer_he_fixed_rate()
5804 arsta->addr); in ath12k_mac_set_peer_he_fixed_rate()
5806 rate_code = ATH12K_HW_RATE_CODE(he_rate, nss - 1, in ath12k_mac_set_peer_he_fixed_rate()
5809 ret = ath12k_wmi_set_peer_param(ar, arsta->addr, in ath12k_mac_set_peer_he_fixed_rate()
5810 arvif->vdev_id, in ath12k_mac_set_peer_he_fixed_rate()
5814 ath12k_warn(ar->ab, in ath12k_mac_set_peer_he_fixed_rate()
5816 arsta->addr, rate_code, ret); in ath12k_mac_set_peer_he_fixed_rate()
5826 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); in ath12k_mac_station_assoc()
5827 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); in ath12k_mac_station_assoc()
5834 u8 link_id = arvif->link_id; in ath12k_mac_station_assoc()
5836 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_station_assoc()
5838 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) in ath12k_mac_station_assoc()
5839 return -EPERM; in ath12k_mac_station_assoc()
5841 if (WARN_ON(!rcu_access_pointer(sta->link[link_id]))) in ath12k_mac_station_assoc()
5842 return -EINVAL; in ath12k_mac_station_assoc()
5844 band = def.chan->band; in ath12k_mac_station_assoc()
5845 mask = &arvif->bitrate_mask; in ath12k_mac_station_assoc()
5850 return -ENOMEM; in ath12k_mac_station_assoc()
5854 if (peer_arg->peer_nss < 1) { in ath12k_mac_station_assoc()
5855 ath12k_warn(ar->ab, in ath12k_mac_station_assoc()
5856 "invalid peer NSS %d\n", peer_arg->peer_nss); in ath12k_mac_station_assoc()
5857 return -EINVAL; in ath12k_mac_station_assoc()
5860 peer_arg->is_assoc = true; in ath12k_mac_station_assoc()
5863 ath12k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n", in ath12k_mac_station_assoc()
5864 arsta->addr, arvif->vdev_id, ret); in ath12k_mac_station_assoc()
5868 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) { in ath12k_mac_station_assoc()
5869 ath12k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n", in ath12k_mac_station_assoc()
5870 arsta->addr, arvif->vdev_id); in ath12k_mac_station_assoc()
5871 return -ETIMEDOUT; in ath12k_mac_station_assoc()
5880 * Note that all other rates and NSS will be disabled for this peer. in ath12k_mac_station_assoc()
5884 ath12k_warn(ar->ab, "unable to access link sta in station assoc\n"); in ath12k_mac_station_assoc()
5885 return -EINVAL; in ath12k_mac_station_assoc()
5888 spin_lock_bh(&ar->data_lock); in ath12k_mac_station_assoc()
5889 arsta->bw = ath12k_mac_ieee80211_sta_bw_to_wmi(ar, link_sta); in ath12k_mac_station_assoc()
5890 arsta->bw_prev = link_sta->bandwidth; in ath12k_mac_station_assoc()
5891 spin_unlock_bh(&ar->data_lock); in ath12k_mac_station_assoc()
5893 if (link_sta->vht_cap.vht_supported && num_vht_rates == 1) { in ath12k_mac_station_assoc()
5895 } else if (link_sta->he_cap.has_he && num_he_rates == 1) { in ath12k_mac_station_assoc()
5901 /* Re-assoc is run only to update supported rates for given station. It in ath12k_mac_station_assoc()
5907 ret = ath12k_setup_peer_smps(ar, arvif, arsta->addr, in ath12k_mac_station_assoc()
5908 &link_sta->ht_cap, &link_sta->he_6ghz_capa); in ath12k_mac_station_assoc()
5910 ath12k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n", in ath12k_mac_station_assoc()
5911 arvif->vdev_id, ret); in ath12k_mac_station_assoc()
5915 if (!sta->wme) { in ath12k_mac_station_assoc()
5916 arvif->num_legacy_stations++; in ath12k_mac_station_assoc()
5922 if (sta->wme && sta->uapsd_queues) { in ath12k_mac_station_assoc()
5925 ath12k_warn(ar->ab, "failed to set qos params for STA %pM for vdev %i: %d\n", in ath12k_mac_station_assoc()
5926 arsta->addr, arvif->vdev_id, ret); in ath12k_mac_station_assoc()
5938 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); in ath12k_mac_station_disassoc()
5940 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_station_disassoc()
5942 if (!sta->wme) { in ath12k_mac_station_disassoc()
5943 arvif->num_legacy_stations--; in ath12k_mac_station_disassoc()
5971 sta = ath12k_ahsta_to_sta(arsta->ahsta); in ath12k_sta_rc_update_wk()
5972 arvif = arsta->arvif; in ath12k_sta_rc_update_wk()
5973 vif = ath12k_ahvif_to_vif(arvif->ahvif); in ath12k_sta_rc_update_wk()
5974 ar = arvif->ar; in ath12k_sta_rc_update_wk()
5976 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) in ath12k_sta_rc_update_wk()
5979 band = def.chan->band; in ath12k_sta_rc_update_wk()
5980 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs; in ath12k_sta_rc_update_wk()
5981 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs; in ath12k_sta_rc_update_wk()
5982 he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs; in ath12k_sta_rc_update_wk()
5984 spin_lock_bh(&ar->data_lock); in ath12k_sta_rc_update_wk()
5986 changed = arsta->changed; in ath12k_sta_rc_update_wk()
5987 arsta->changed = 0; in ath12k_sta_rc_update_wk()
5989 bw = arsta->bw; in ath12k_sta_rc_update_wk()
5990 bw_prev = arsta->bw_prev; in ath12k_sta_rc_update_wk()
5991 nss = arsta->nss; in ath12k_sta_rc_update_wk()
5992 smps = arsta->smps; in ath12k_sta_rc_update_wk()
5994 spin_unlock_bh(&ar->data_lock); in ath12k_sta_rc_update_wk()
6009 peer_phymode = peer_arg->peer_phymode; in ath12k_sta_rc_update_wk()
6017 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac bandwidth upgrade for sta %pM new %d old %d\n", in ath12k_sta_rc_update_wk()
6018 arsta->addr, bw, bw_prev); in ath12k_sta_rc_update_wk()
6019 err = ath12k_wmi_set_peer_param(ar, arsta->addr, in ath12k_sta_rc_update_wk()
6020 arvif->vdev_id, WMI_PEER_PHYMODE, in ath12k_sta_rc_update_wk()
6023 ath12k_warn(ar->ab, "failed to update STA %pM to peer phymode %d: %d\n", in ath12k_sta_rc_update_wk()
6024 arsta->addr, peer_phymode, err); in ath12k_sta_rc_update_wk()
6027 err = ath12k_wmi_set_peer_param(ar, arsta->addr, in ath12k_sta_rc_update_wk()
6028 arvif->vdev_id, WMI_PEER_CHWIDTH, in ath12k_sta_rc_update_wk()
6031 ath12k_warn(ar->ab, "failed to update STA %pM to peer bandwidth %d: %d\n", in ath12k_sta_rc_update_wk()
6032 arsta->addr, bw, err); in ath12k_sta_rc_update_wk()
6038 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac bandwidth downgrade for sta %pM new %d old %d\n", in ath12k_sta_rc_update_wk()
6039 arsta->addr, bw, bw_prev); in ath12k_sta_rc_update_wk()
6040 err = ath12k_wmi_set_peer_param(ar, arsta->addr, in ath12k_sta_rc_update_wk()
6041 arvif->vdev_id, WMI_PEER_CHWIDTH, in ath12k_sta_rc_update_wk()
6044 ath12k_warn(ar->ab, "failed to update STA %pM peer to bandwidth %d: %d\n", in ath12k_sta_rc_update_wk()
6045 arsta->addr, bw, err); in ath12k_sta_rc_update_wk()
6048 err = ath12k_wmi_set_peer_param(ar, arsta->addr, in ath12k_sta_rc_update_wk()
6049 arvif->vdev_id, WMI_PEER_PHYMODE, in ath12k_sta_rc_update_wk()
6052 ath12k_warn(ar->ab, "failed to update STA %pM to peer phymode %d: %d\n", in ath12k_sta_rc_update_wk()
6053 arsta->addr, peer_phymode, err); in ath12k_sta_rc_update_wk()
6058 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac update sta %pM nss %d\n", in ath12k_sta_rc_update_wk()
6059 arsta->addr, nss); in ath12k_sta_rc_update_wk()
6061 err = ath12k_wmi_set_peer_param(ar, arsta->addr, arvif->vdev_id, in ath12k_sta_rc_update_wk()
6064 ath12k_warn(ar->ab, "failed to update STA %pM nss %d: %d\n", in ath12k_sta_rc_update_wk()
6065 arsta->addr, nss, err); in ath12k_sta_rc_update_wk()
6069 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac update sta %pM smps %d\n", in ath12k_sta_rc_update_wk()
6070 arsta->addr, smps); in ath12k_sta_rc_update_wk()
6072 err = ath12k_wmi_set_peer_param(ar, arsta->addr, arvif->vdev_id, in ath12k_sta_rc_update_wk()
6075 ath12k_warn(ar->ab, "failed to update STA %pM smps %d: %d\n", in ath12k_sta_rc_update_wk()
6076 arsta->addr, smps, err); in ath12k_sta_rc_update_wk()
6080 mask = &arvif->bitrate_mask; in ath12k_sta_rc_update_wk()
6086 /* Peer_assoc_prepare will reject vht rates in in ath12k_sta_rc_update_wk()
6090 * But, Single rate in VHT mask can be set as per-peer in ath12k_sta_rc_update_wk()
6091 * fixed rate. But even if any HT rates are configured in in ath12k_sta_rc_update_wk()
6092 * the bitrate mask, device will not switch to those rates in ath12k_sta_rc_update_wk()
6093 * when per-peer Fixed rate is set. in ath12k_sta_rc_update_wk()
6094 * TODO: Check RATEMASK_CMDID to support auto rates selection in ath12k_sta_rc_update_wk()
6099 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()
6100 sta->addr, arsta->link_id); in ath12k_sta_rc_update_wk()
6104 if (link_sta->vht_cap.vht_supported && num_vht_rates == 1) { in ath12k_sta_rc_update_wk()
6107 } else if (link_sta->he_cap.has_he && num_he_rates == 1) { in ath12k_sta_rc_update_wk()
6110 /* If the peer is non-VHT/HE or no fixed VHT/HE rate in ath12k_sta_rc_update_wk()
6112 * other rates using peer_assoc command. Also clear in ath12k_sta_rc_update_wk()
6116 err = ath12k_wmi_set_peer_param(ar, arsta->addr, in ath12k_sta_rc_update_wk()
6117 arvif->vdev_id, in ath12k_sta_rc_update_wk()
6121 ath12k_warn(ar->ab, in ath12k_sta_rc_update_wk()
6123 arsta->addr, err); in ath12k_sta_rc_update_wk()
6128 peer_arg->is_assoc = false; in ath12k_sta_rc_update_wk()
6131 ath12k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n", in ath12k_sta_rc_update_wk()
6132 arsta->addr, arvif->vdev_id, err); in ath12k_sta_rc_update_wk()
6134 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) in ath12k_sta_rc_update_wk()
6135 ath12k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n", in ath12k_sta_rc_update_wk()
6136 arsta->addr, arvif->vdev_id); in ath12k_sta_rc_update_wk()
6147 lockdep_assert_wiphy(ah->hw->wiphy); in ath12k_mac_free_unassign_link_sta()
6152 arsta = wiphy_dereference(ah->hw->wiphy, ahsta->link[link_id]); in ath12k_mac_free_unassign_link_sta()
6156 ahsta->links_map &= ~BIT(link_id); in ath12k_mac_free_unassign_link_sta()
6157 rcu_assign_pointer(ahsta->link[link_id], NULL); in ath12k_mac_free_unassign_link_sta()
6160 if (arsta == &ahsta->deflink) { in ath12k_mac_free_unassign_link_sta()
6161 arsta->link_id = ATH12K_INVALID_LINK_ID; in ath12k_mac_free_unassign_link_sta()
6162 arsta->ahsta = NULL; in ath12k_mac_free_unassign_link_sta()
6163 arsta->arvif = NULL; in ath12k_mac_free_unassign_link_sta()
6173 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); in ath12k_mac_inc_num_stations()
6174 struct ath12k *ar = arvif->ar; in ath12k_mac_inc_num_stations()
6176 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_inc_num_stations()
6178 if (arvif->ahvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls) in ath12k_mac_inc_num_stations()
6181 if (ar->num_stations >= ar->max_num_stations) in ath12k_mac_inc_num_stations()
6182 return -ENOBUFS; in ath12k_mac_inc_num_stations()
6184 ar->num_stations++; in ath12k_mac_inc_num_stations()
6185 arvif->num_stations++; in ath12k_mac_inc_num_stations()
6187 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_inc_num_stations()
6189 arsta->addr, arvif->vdev_id, arvif->num_stations); in ath12k_mac_inc_num_stations()
6197 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); in ath12k_mac_dec_num_stations()
6198 struct ath12k *ar = arvif->ar; in ath12k_mac_dec_num_stations()
6200 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_dec_num_stations()
6202 if (arvif->ahvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls) in ath12k_mac_dec_num_stations()
6205 ar->num_stations--; in ath12k_mac_dec_num_stations()
6207 if (arvif->num_stations) { in ath12k_mac_dec_num_stations()
6208 arvif->num_stations--; in ath12k_mac_dec_num_stations()
6209 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_dec_num_stations()
6211 arsta->addr, arvif->vdev_id, arvif->num_stations); in ath12k_mac_dec_num_stations()
6213 ath12k_warn(ar->ab, in ath12k_mac_dec_num_stations()
6215 arsta->addr, arvif->vdev_id); in ath12k_mac_dec_num_stations()
6223 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); in ath12k_mac_station_post_remove()
6224 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); in ath12k_mac_station_post_remove()
6227 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_station_post_remove()
6231 spin_lock_bh(&ar->ab->base_lock); in ath12k_mac_station_post_remove()
6233 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arsta->addr); in ath12k_mac_station_post_remove()
6234 if (peer && peer->sta == sta) { in ath12k_mac_station_post_remove()
6235 ath12k_warn(ar->ab, "Found peer entry %pM n vdev %i after it was supposedly removed\n", in ath12k_mac_station_post_remove()
6236 vif->addr, arvif->vdev_id); in ath12k_mac_station_post_remove()
6237 peer->sta = NULL; in ath12k_mac_station_post_remove()
6238 list_del(&peer->list); in ath12k_mac_station_post_remove()
6240 ar->num_peers--; in ath12k_mac_station_post_remove()
6243 spin_unlock_bh(&ar->ab->base_lock); in ath12k_mac_station_post_remove()
6245 kfree(arsta->rx_stats); in ath12k_mac_station_post_remove()
6246 arsta->rx_stats = NULL; in ath12k_mac_station_post_remove()
6256 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_station_unauthorize()
6258 spin_lock_bh(&ar->ab->base_lock); in ath12k_mac_station_unauthorize()
6260 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arsta->addr); in ath12k_mac_station_unauthorize()
6262 peer->is_authorized = false; in ath12k_mac_station_unauthorize()
6264 spin_unlock_bh(&ar->ab->base_lock); in ath12k_mac_station_unauthorize()
6272 ret = ath12k_clear_peer_keys(arvif, arsta->addr); in ath12k_mac_station_unauthorize()
6274 ath12k_warn(ar->ab, "failed to clear all peer keys for vdev %i: %d\n", in ath12k_mac_station_unauthorize()
6275 arvif->vdev_id, ret); in ath12k_mac_station_unauthorize()
6287 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); in ath12k_mac_station_authorize()
6290 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_station_authorize()
6292 spin_lock_bh(&ar->ab->base_lock); in ath12k_mac_station_authorize()
6294 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arsta->addr); in ath12k_mac_station_authorize()
6296 peer->is_authorized = true; in ath12k_mac_station_authorize()
6298 spin_unlock_bh(&ar->ab->base_lock); in ath12k_mac_station_authorize()
6300 if (vif->type == NL80211_IFTYPE_STATION && arvif->is_up) { in ath12k_mac_station_authorize()
6301 ret = ath12k_wmi_set_peer_param(ar, arsta->addr, in ath12k_mac_station_authorize()
6302 arvif->vdev_id, in ath12k_mac_station_authorize()
6306 ath12k_warn(ar->ab, "Unable to authorize peer %pM vdev %d: %d\n", in ath12k_mac_station_authorize()
6307 arsta->addr, arvif->vdev_id, ret); in ath12k_mac_station_authorize()
6319 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); in ath12k_mac_station_remove()
6320 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_mac_station_remove()
6323 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_station_remove()
6325 wiphy_work_cancel(ar->ah->hw->wiphy, &arsta->update_wk); in ath12k_mac_station_remove()
6327 if (ahvif->vdev_type == WMI_VDEV_TYPE_STA) { in ath12k_mac_station_remove()
6331 ath12k_warn(ar->ab, "failed to stop vdev %i: %d\n", in ath12k_mac_station_remove()
6332 arvif->vdev_id, ret); in ath12k_mac_station_remove()
6335 if (sta->mlo) in ath12k_mac_station_remove()
6338 ath12k_dp_peer_cleanup(ar, arvif->vdev_id, arsta->addr); in ath12k_mac_station_remove()
6340 ret = ath12k_peer_delete(ar, arvif->vdev_id, arsta->addr); in ath12k_mac_station_remove()
6342 ath12k_warn(ar->ab, "Failed to delete peer: %pM for VDEV: %d\n", in ath12k_mac_station_remove()
6343 arsta->addr, arvif->vdev_id); in ath12k_mac_station_remove()
6345 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "Removed peer: %pM for VDEV: %d\n", in ath12k_mac_station_remove()
6346 arsta->addr, arvif->vdev_id); in ath12k_mac_station_remove()
6350 if (sta->valid_links) in ath12k_mac_station_remove()
6351 ath12k_mac_free_unassign_link_sta(ahvif->ah, in ath12k_mac_station_remove()
6352 arsta->ahsta, arsta->link_id); in ath12k_mac_station_remove()
6361 struct ath12k_base *ab = ar->ab; in ath12k_mac_station_add()
6362 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); in ath12k_mac_station_add()
6363 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); in ath12k_mac_station_add()
6367 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_station_add()
6372 ar->max_num_stations); in ath12k_mac_station_add()
6376 if (ath12k_debugfs_is_extd_rx_stats_enabled(ar) && !arsta->rx_stats) { in ath12k_mac_station_add()
6377 arsta->rx_stats = kzalloc(sizeof(*arsta->rx_stats), GFP_KERNEL); in ath12k_mac_station_add()
6378 if (!arsta->rx_stats) { in ath12k_mac_station_add()
6379 ret = -ENOMEM; in ath12k_mac_station_add()
6384 peer_param.vdev_id = arvif->vdev_id; in ath12k_mac_station_add()
6385 peer_param.peer_addr = arsta->addr; in ath12k_mac_station_add()
6387 peer_param.ml_enabled = sta->mlo; in ath12k_mac_station_add()
6392 arsta->addr, arvif->vdev_id); in ath12k_mac_station_add()
6397 arsta->addr, arvif->vdev_id); in ath12k_mac_station_add()
6400 ret = ath12k_wmi_set_peer_param(ar, arsta->addr, in ath12k_mac_station_add()
6401 arvif->vdev_id, in ath12k_mac_station_add()
6405 arsta->addr, ret); in ath12k_mac_station_add()
6410 ret = ath12k_dp_peer_setup(ar, arvif->vdev_id, arsta->addr); in ath12k_mac_station_add()
6413 arsta->addr, arvif->vdev_id, ret); in ath12k_mac_station_add()
6417 if (ab->hw_params->vdev_start_delay && in ath12k_mac_station_add()
6418 !arvif->is_started && in ath12k_mac_station_add()
6419 arvif->ahvif->vdev_type != WMI_VDEV_TYPE_AP) { in ath12k_mac_station_add()
6427 ewma_avg_rssi_init(&arsta->avg_rssi); in ath12k_mac_station_add()
6431 ath12k_peer_delete(ar, arvif->vdev_id, arsta->addr); in ath12k_mac_station_add()
6432 kfree(arsta->rx_stats); in ath12k_mac_station_add()
6433 arsta->rx_stats = NULL; in ath12k_mac_station_add()
6450 lockdep_assert_wiphy(ah->hw->wiphy); in ath12k_mac_assign_link_sta()
6453 return -EINVAL; in ath12k_mac_assign_link_sta()
6455 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]); in ath12k_mac_assign_link_sta()
6457 return -EINVAL; in ath12k_mac_assign_link_sta()
6461 link_sta = wiphy_dereference(ah->hw->wiphy, sta->link[link_id]); in ath12k_mac_assign_link_sta()
6463 return -EINVAL; in ath12k_mac_assign_link_sta()
6465 ether_addr_copy(arsta->addr, link_sta->addr); in ath12k_mac_assign_link_sta()
6468 arsta->link_idx = ahsta->num_peer++; in ath12k_mac_assign_link_sta()
6470 arsta->link_id = link_id; in ath12k_mac_assign_link_sta()
6471 ahsta->links_map |= BIT(arsta->link_id); in ath12k_mac_assign_link_sta()
6472 arsta->arvif = arvif; in ath12k_mac_assign_link_sta()
6473 arsta->ahsta = ahsta; in ath12k_mac_assign_link_sta()
6474 ahsta->ahvif = ahvif; in ath12k_mac_assign_link_sta()
6476 wiphy_work_init(&arsta->update_wk, ath12k_sta_rc_update_wk); in ath12k_mac_assign_link_sta()
6478 rcu_assign_pointer(ahsta->link[link_id], arsta); in ath12k_mac_assign_link_sta()
6487 struct ath12k_hw *ah = ahvif->ah; in ath12k_mac_ml_station_remove()
6494 lockdep_assert_wiphy(ah->hw->wiphy); in ath12k_mac_ml_station_remove()
6499 links = ahsta->links_map; in ath12k_mac_ml_station_remove()
6501 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]); in ath12k_mac_ml_station_remove()
6502 arsta = wiphy_dereference(ah->hw->wiphy, ahsta->link[link_id]); in ath12k_mac_ml_station_remove()
6506 ar = arvif->ar; in ath12k_mac_ml_station_remove()
6522 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); in ath12k_mac_handle_link_sta_state()
6524 struct ath12k *ar = arvif->ar; in ath12k_mac_handle_link_sta_state()
6526 struct ath12k_base *ab = ar->ab; in ath12k_mac_handle_link_sta_state()
6529 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_handle_link_sta_state()
6531 ath12k_dbg(ab, ATH12K_DBG_MAC, "mac handle link %u sta %pM state %d -> %d\n", in ath12k_mac_handle_link_sta_state()
6532 arsta->link_id, arsta->addr, old_state, new_state); in ath12k_mac_handle_link_sta_state()
6534 /* IEEE80211_STA_NONE -> IEEE80211_STA_NOTEXIST: Remove the station in ath12k_mac_handle_link_sta_state()
6542 arsta->addr, arvif->vdev_id); in ath12k_mac_handle_link_sta_state()
6547 /* IEEE80211_STA_NOTEXIST -> IEEE80211_STA_NONE: Add new station to driver */ in ath12k_mac_handle_link_sta_state()
6553 arsta->addr, arvif->vdev_id); in ath12k_mac_handle_link_sta_state()
6555 /* IEEE80211_STA_AUTH -> IEEE80211_STA_ASSOC: Send station assoc command for in ath12k_mac_handle_link_sta_state()
6560 (vif->type == NL80211_IFTYPE_AP || in ath12k_mac_handle_link_sta_state()
6561 vif->type == NL80211_IFTYPE_MESH_POINT || in ath12k_mac_handle_link_sta_state()
6562 vif->type == NL80211_IFTYPE_ADHOC)) { in ath12k_mac_handle_link_sta_state()
6566 arsta->addr); in ath12k_mac_handle_link_sta_state()
6568 /* IEEE80211_STA_ASSOC -> IEEE80211_STA_AUTHORIZED: set peer status as in ath12k_mac_handle_link_sta_state()
6576 arsta->addr); in ath12k_mac_handle_link_sta_state()
6581 arvif->ahvif->vdev_type == WMI_VDEV_TYPE_STA) { in ath12k_mac_handle_link_sta_state()
6583 reg_info = ab->reg_info[ar->pdev_idx]; in ath12k_mac_handle_link_sta_state()
6585 ath12k_hw_to_ah(hw)->regd_updated = false; in ath12k_mac_handle_link_sta_state()
6586 ath12k_reg_handle_chan_list(ab, reg_info, arvif->ahvif->vdev_type, in ath12k_mac_handle_link_sta_state()
6587 link_conf->power_type); in ath12k_mac_handle_link_sta_state()
6590 /* IEEE80211_STA_AUTHORIZED -> IEEE80211_STA_ASSOC: station may be in removal, in ath12k_mac_handle_link_sta_state()
6597 /* IEEE80211_STA_ASSOC -> IEEE80211_STA_AUTH: disassoc peer connected to in ath12k_mac_handle_link_sta_state()
6602 (vif->type == NL80211_IFTYPE_AP || in ath12k_mac_handle_link_sta_state()
6603 vif->type == NL80211_IFTYPE_MESH_POINT || in ath12k_mac_handle_link_sta_state()
6604 vif->type == NL80211_IFTYPE_ADHOC)) { in ath12k_mac_handle_link_sta_state()
6608 arsta->addr); in ath12k_mac_handle_link_sta_state()
6643 ab->wmi_ab.svc_map) && in ath12k_mac_is_hw_dbs_capable()
6644 ab->wmi_ab.hw_mode_info.support_dbs; in ath12k_mac_is_hw_dbs_capable()
6655 freq_range = ab->wmi_ab.hw_mode_info.freq_range_caps[ATH12K_HW_MODE_DBS]; in ath12k_mac_2_freq_same_mac_in_dbs()
6663 ab->wmi_ab.svc_map) && in ath12k_mac_is_hw_sbs_capable()
6664 ab->wmi_ab.hw_mode_info.support_sbs; in ath12k_mac_is_hw_sbs_capable()
6670 struct ath12k_hw_mode_info *info = &ab->wmi_ab.hw_mode_info; in ath12k_mac_2_freq_same_mac_in_sbs()
6678 if (ab->wmi_ab.sbs_lower_band_end_freq) { in ath12k_mac_2_freq_same_mac_in_sbs()
6679 sbs_uppr_share = info->freq_range_caps[ATH12K_HW_MODE_SBS_UPPER_SHARE]; in ath12k_mac_2_freq_same_mac_in_sbs()
6680 sbs_low_share = info->freq_range_caps[ATH12K_HW_MODE_SBS_LOWER_SHARE]; in ath12k_mac_2_freq_same_mac_in_sbs()
6688 sbs_range = info->freq_range_caps[ATH12K_HW_MODE_SBS]; in ath12k_mac_2_freq_same_mac_in_sbs()
6722 return -EINVAL; in ath12k_mac_mlo_sta_set_link_active()
6742 return -EINVAL; in ath12k_mac_mlo_sta_set_link_active()
6760 param.link_num[0].num_of_link = num_mlo_vdev - 1; in ath12k_mac_mlo_sta_set_link_active()
6772 unsigned long links = ahvif->links_map; in ath12k_mac_mlo_sta_update_link_active()
6782 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); in ath12k_mac_mlo_sta_update_link_active()
6784 if (!arvif || !arvif->is_created || arvif->ar->ab != ab) in ath12k_mac_mlo_sta_update_link_active()
6788 conf = wiphy_dereference(hw->wiphy, info->chanctx_conf); in ath12k_mac_mlo_sta_update_link_active()
6789 mlo_freq_list[num_mlo_vdev] = conf->def.chan->center_freq; in ath12k_mac_mlo_sta_update_link_active()
6791 mlo_vdev_id_lst[num_mlo_vdev] = arvif->vdev_id; in ath12k_mac_mlo_sta_update_link_active()
6800 return -EINVAL; in ath12k_mac_mlo_sta_update_link_active()
6868 sta = ieee80211_find_sta(vif, vif->cfg.ap_addr); in ath12k_mac_select_links()
6871 ath12k_warn(ab, "failed to find sta with addr %pM\n", vif->cfg.ap_addr); in ath12k_mac_select_links()
6872 return -EINVAL; in ath12k_mac_select_links()
6876 assoc_arvif = wiphy_dereference(hw->wiphy, ahvif->link[ahsta->assoc_link_id]); in ath12k_mac_select_links()
6878 chanctx = rcu_dereference(info->chanctx_conf); in ath12k_mac_select_links()
6879 assoc_link_freq = chanctx->def.chan->center_freq; in ath12k_mac_select_links()
6882 assoc_arvif->link_id, assoc_link_freq); in ath12k_mac_select_links()
6887 useful_links &= ~BIT(assoc_arvif->link_id); in ath12k_mac_select_links()
6889 info = wiphy_dereference(hw->wiphy, vif->link_conf[link_id]); in ath12k_mac_select_links()
6893 return -ENOLINK; in ath12k_mac_select_links()
6896 chan = info->chanreq.oper.chan; in ath12k_mac_select_links()
6899 return -EINVAL; in ath12k_mac_select_links()
6902 partner_freq = chan->center_freq; in ath12k_mac_select_links()
6927 link_id = ffs(useful_links) - 1; in ath12k_mac_select_links()
6931 *selected_links = BIT(assoc_arvif->link_id) | BIT(link_id); in ath12k_mac_select_links()
6954 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_sta_state()
6956 if (ieee80211_vif_is_mld(vif) && sta->valid_links) { in ath12k_mac_op_sta_state()
6957 WARN_ON(!sta->mlo && hweight16(sta->valid_links) != 1); in ath12k_mac_op_sta_state()
6958 link_id = ffs(sta->valid_links) - 1; in ath12k_mac_op_sta_state()
6961 /* IEEE80211_STA_NOTEXIST -> IEEE80211_STA_NONE: in ath12k_mac_op_sta_state()
6963 * ahsta->links_map will be zero and sta->valid_links will be 1. in ath12k_mac_op_sta_state()
6970 arsta = &ahsta->deflink; in ath12k_mac_op_sta_state()
6973 if (sta->mlo && !ahsta->links_map && in ath12k_mac_op_sta_state()
6974 (hweight16(sta->valid_links) == 1)) { in ath12k_mac_op_sta_state()
6978 sta->addr); in ath12k_mac_op_sta_state()
6987 link_id, sta->addr); in ath12k_mac_op_sta_state()
6994 if (sta->mlo) { in ath12k_mac_op_sta_state()
6995 /* For station mode, arvif->is_sta_assoc_link has been set when in ath12k_mac_op_sta_state()
6998 if (vif->type == NL80211_IFTYPE_STATION && in ath12k_mac_op_sta_state()
6999 !arsta->arvif->is_sta_assoc_link) { in ath12k_mac_op_sta_state()
7002 ret = -EINVAL; in ath12k_mac_op_sta_state()
7006 arsta->is_assoc_link = true; in ath12k_mac_op_sta_state()
7007 ahsta->assoc_link_id = link_id; in ath12k_mac_op_sta_state()
7020 if (ieee80211_vif_is_mld(vif) && vif->type == NL80211_IFTYPE_STATION && in ath12k_mac_op_sta_state()
7025 ab = ah->radio[0].ab; in ath12k_mac_op_sta_state()
7026 if (ab->ag->num_devices == 1) { in ath12k_mac_op_sta_state()
7041 valid_links = ahsta->links_map; in ath12k_mac_op_sta_state()
7043 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); in ath12k_mac_op_sta_state()
7044 arsta = wiphy_dereference(hw->wiphy, ahsta->link[link_id]); in ath12k_mac_op_sta_state()
7050 if (WARN_ON(!arvif->ar)) in ath12k_mac_op_sta_state()
7057 link_id, arsta->addr, old_state, new_state); in ath12k_mac_op_sta_state()
7062 if (ieee80211_vif_is_mld(vif) && vif->type == NL80211_IFTYPE_STATION && in ath12k_mac_op_sta_state()
7065 ab = ar->ab; in ath12k_mac_op_sta_state()
7080 /* IEEE80211_STA_NONE -> IEEE80211_STA_NOTEXIST: in ath12k_mac_op_sta_state()
7086 new_state == IEEE80211_STA_NOTEXIST && sta->mlo) in ath12k_mac_op_sta_state()
7094 ahsta->state = new_state; in ath12k_mac_op_sta_state()
7112 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_sta_set_txpwr()
7117 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); in ath12k_mac_op_sta_set_txpwr()
7118 arsta = wiphy_dereference(hw->wiphy, ahsta->link[link_id]); in ath12k_mac_op_sta_set_txpwr()
7120 if (sta->deflink.txpwr.type == NL80211_TX_POWER_AUTOMATIC) { in ath12k_mac_op_sta_set_txpwr()
7123 txpwr = sta->deflink.txpwr.power; in ath12k_mac_op_sta_set_txpwr()
7125 ret = -EINVAL; in ath12k_mac_op_sta_set_txpwr()
7131 ret = -EINVAL; in ath12k_mac_op_sta_set_txpwr()
7135 ar = arvif->ar; in ath12k_mac_op_sta_set_txpwr()
7137 ret = ath12k_wmi_set_peer_param(ar, arsta->addr, arvif->vdev_id, in ath12k_mac_op_sta_set_txpwr()
7140 ath12k_warn(ar->ab, "failed to set tx power for station ret: %d\n", in ath12k_mac_op_sta_set_txpwr()
7154 struct ieee80211_sta *sta = link_sta->sta; in ath12k_mac_op_link_sta_rc_update()
7165 arvif = rcu_dereference(ahvif->link[link_sta->link_id]); in ath12k_mac_op_link_sta_rc_update()
7168 link_sta->link_id, sta->addr); in ath12k_mac_op_link_sta_rc_update()
7173 ar = arvif->ar; in ath12k_mac_op_link_sta_rc_update()
7175 arsta = rcu_dereference(ahsta->link[link_sta->link_id]); in ath12k_mac_op_link_sta_rc_update()
7178 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()
7179 link_sta->link_id, sta->addr); in ath12k_mac_op_link_sta_rc_update()
7182 spin_lock_bh(&ar->ab->base_lock); in ath12k_mac_op_link_sta_rc_update()
7184 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arsta->addr); in ath12k_mac_op_link_sta_rc_update()
7186 spin_unlock_bh(&ar->ab->base_lock); in ath12k_mac_op_link_sta_rc_update()
7188 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()
7189 arsta->addr, arvif->vdev_id); in ath12k_mac_op_link_sta_rc_update()
7193 spin_unlock_bh(&ar->ab->base_lock); in ath12k_mac_op_link_sta_rc_update()
7195 if (arsta->link_id >= IEEE80211_MLD_MAX_NUM_LINKS) { in ath12k_mac_op_link_sta_rc_update()
7200 link_sta = rcu_dereference(sta->link[arsta->link_id]); in ath12k_mac_op_link_sta_rc_update()
7203 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()
7204 sta->addr, arsta->link_id); in ath12k_mac_op_link_sta_rc_update()
7208 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_op_link_sta_rc_update()
7210 arsta->addr, changed, link_sta->bandwidth, link_sta->rx_nss, in ath12k_mac_op_link_sta_rc_update()
7211 link_sta->smps_mode); in ath12k_mac_op_link_sta_rc_update()
7213 spin_lock_bh(&ar->data_lock); in ath12k_mac_op_link_sta_rc_update()
7217 arsta->bw_prev = arsta->bw; in ath12k_mac_op_link_sta_rc_update()
7218 arsta->bw = bw; in ath12k_mac_op_link_sta_rc_update()
7222 arsta->nss = link_sta->rx_nss; in ath12k_mac_op_link_sta_rc_update()
7227 switch (link_sta->smps_mode) { in ath12k_mac_op_link_sta_rc_update()
7239 ath12k_warn(ar->ab, "Invalid smps %d in sta rc update for %pM link %u\n", in ath12k_mac_op_link_sta_rc_update()
7240 link_sta->smps_mode, arsta->addr, link_sta->link_id); in ath12k_mac_op_link_sta_rc_update()
7245 arsta->smps = smps; in ath12k_mac_op_link_sta_rc_update()
7248 arsta->changed |= changed; in ath12k_mac_op_link_sta_rc_update()
7250 spin_unlock_bh(&ar->data_lock); in ath12k_mac_op_link_sta_rc_update()
7252 wiphy_work_queue(hw->wiphy, &arsta->update_wk); in ath12k_mac_op_link_sta_rc_update()
7265 lockdep_assert_wiphy(ah->hw->wiphy); in ath12k_mac_alloc_assign_link_sta()
7270 arsta = wiphy_dereference(ah->hw->wiphy, ahsta->link[link_id]); in ath12k_mac_alloc_assign_link_sta()
7294 struct ath12k_hw *ah = hw->priv; in ath12k_mac_op_change_sta_links()
7302 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_change_sta_links()
7304 if (!sta->valid_links) in ath12k_mac_op_change_sta_links()
7305 return -EINVAL; in ath12k_mac_op_change_sta_links()
7314 if (ahsta->ml_peer_id == ATH12K_MLO_PEER_ID_INVALID) { in ath12k_mac_op_change_sta_links()
7315 ath12k_hw_warn(ah, "unable to add link for ml sta %pM", sta->addr); in ath12k_mac_op_change_sta_links()
7316 return -EINVAL; in ath12k_mac_op_change_sta_links()
7320 if (WARN_ON(ahsta->links_map == 0)) in ath12k_mac_op_change_sta_links()
7321 return -EINVAL; in ath12k_mac_op_change_sta_links()
7325 if (ahsta->links_map & BIT(link_id)) in ath12k_mac_op_change_sta_links()
7328 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); in ath12k_mac_op_change_sta_links()
7336 ar = arvif->ar; in ath12k_mac_op_change_sta_links()
7342 ath12k_warn(ar->ab, "Failed to add station: %pM for VDEV: %d\n", in ath12k_mac_op_change_sta_links()
7343 arsta->addr, arvif->vdev_id); in ath12k_mac_op_change_sta_links()
7364 struct ath12k *ar = arvif->ar; in ath12k_conf_tx_uapsd()
7365 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_conf_tx_uapsd()
7369 if (ahvif->vdev_type != WMI_VDEV_TYPE_STA) in ath12k_conf_tx_uapsd()
7392 ahvif->u.sta.uapsd |= value; in ath12k_conf_tx_uapsd()
7394 ahvif->u.sta.uapsd &= ~value; in ath12k_conf_tx_uapsd()
7396 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath12k_conf_tx_uapsd()
7398 ahvif->u.sta.uapsd); in ath12k_conf_tx_uapsd()
7400 ath12k_warn(ar->ab, "could not set uapsd params %d\n", ret); in ath12k_conf_tx_uapsd()
7404 if (ahvif->u.sta.uapsd) in ath12k_conf_tx_uapsd()
7409 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath12k_conf_tx_uapsd()
7413 ath12k_warn(ar->ab, "could not set rx wake param %d\n", ret); in ath12k_conf_tx_uapsd()
7423 struct ath12k *ar = arvif->ar; in ath12k_mac_conf_tx()
7424 struct ath12k_base *ab = ar->ab; in ath12k_mac_conf_tx()
7427 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_conf_tx()
7431 p = &arvif->wmm_params.ac_vo; in ath12k_mac_conf_tx()
7434 p = &arvif->wmm_params.ac_vi; in ath12k_mac_conf_tx()
7437 p = &arvif->wmm_params.ac_be; in ath12k_mac_conf_tx()
7440 p = &arvif->wmm_params.ac_bk; in ath12k_mac_conf_tx()
7445 ret = -EINVAL; in ath12k_mac_conf_tx()
7449 p->cwmin = params->cw_min; in ath12k_mac_conf_tx()
7450 p->cwmax = params->cw_max; in ath12k_mac_conf_tx()
7451 p->aifs = params->aifs; in ath12k_mac_conf_tx()
7452 p->txop = params->txop; in ath12k_mac_conf_tx()
7454 ret = ath12k_wmi_send_wmm_update_cmd(ar, arvif->vdev_id, in ath12k_mac_conf_tx()
7455 &arvif->wmm_params); in ath12k_mac_conf_tx()
7458 ar->pdev_idx, ret); in ath12k_mac_conf_tx()
7462 ret = ath12k_conf_tx_uapsd(arvif, ac, params->uapsd); in ath12k_mac_conf_tx()
7465 ar->pdev_idx, ret); in ath12k_mac_conf_tx()
7481 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_conf_tx()
7484 return -EINVAL; in ath12k_mac_op_conf_tx()
7486 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); in ath12k_mac_op_conf_tx()
7487 if (!arvif || !arvif->is_created) { in ath12k_mac_op_conf_tx()
7490 return -ENOSPC; in ath12k_mac_op_conf_tx()
7492 cache->tx_conf.changed = true; in ath12k_mac_op_conf_tx()
7493 cache->tx_conf.ac = ac; in ath12k_mac_op_conf_tx()
7494 cache->tx_conf.tx_queue_params = *params; in ath12k_mac_op_conf_tx()
7509 u32 ar_vht_cap = ar->pdev->cap.vht_cap; in ath12k_create_ht_cap()
7560 for (i = 0; i < ar->num_rx_chains; i++) { in ath12k_create_ht_cap()
7573 struct ath12k *ar = arvif->ar; in ath12k_mac_set_txbf_conf()
7574 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_mac_set_txbf_conf()
7577 u32 vht_cap = ar->pdev->cap.vht_cap; in ath12k_mac_set_txbf_conf()
7590 if (sound_dim > (ar->num_tx_chains - 1)) in ath12k_mac_set_txbf_conf()
7591 sound_dim = ar->num_tx_chains - 1; in ath12k_mac_set_txbf_conf()
7602 ahvif->vdev_type == WMI_VDEV_TYPE_AP) in ath12k_mac_set_txbf_conf()
7610 ahvif->vdev_type == WMI_VDEV_TYPE_STA) in ath12k_mac_set_txbf_conf()
7614 return ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_set_txbf_conf()
7626 if (ar->num_tx_chains < 2) { in ath12k_set_vht_txbf_cap()
7648 if (sound_dim > (ar->num_tx_chains - 1)) in ath12k_set_vht_txbf_cap()
7649 sound_dim = ar->num_tx_chains - 1; in ath12k_set_vht_txbf_cap()
7669 vht_cap.cap = ar->pdev->cap.vht_cap; in ath12k_create_vht_cap()
7679 if (i < ar->num_tx_chains && rate_cap_tx_chainmask & BIT(i)) in ath12k_create_vht_cap()
7684 if (i < ar->num_rx_chains && rate_cap_rx_chainmask & BIT(i)) in ath12k_create_vht_cap()
7699 if (ar->pdev->cap.nss_ratio_info == WMI_NSS_RATIO_1_NSS) in ath12k_create_vht_cap()
7714 rate_cap_tx_chainmask = ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift; in ath12k_mac_setup_ht_vht_cap()
7715 rate_cap_rx_chainmask = ar->cfg_rx_chainmask >> cap->rx_chain_mask_shift; in ath12k_mac_setup_ht_vht_cap()
7717 if (cap->supported_bands & WMI_HOST_WLAN_2GHZ_CAP) { in ath12k_mac_setup_ht_vht_cap()
7718 band = &ar->mac.sbands[NL80211_BAND_2GHZ]; in ath12k_mac_setup_ht_vht_cap()
7719 ht_cap = cap->band[NL80211_BAND_2GHZ].ht_cap_info; in ath12k_mac_setup_ht_vht_cap()
7722 band->ht_cap = ath12k_create_ht_cap(ar, ht_cap, in ath12k_mac_setup_ht_vht_cap()
7726 if (cap->supported_bands & WMI_HOST_WLAN_5GHZ_CAP && in ath12k_mac_setup_ht_vht_cap()
7727 (ar->ab->hw_params->single_pdev_only || in ath12k_mac_setup_ht_vht_cap()
7728 !ar->supports_6ghz)) { in ath12k_mac_setup_ht_vht_cap()
7729 band = &ar->mac.sbands[NL80211_BAND_5GHZ]; in ath12k_mac_setup_ht_vht_cap()
7730 ht_cap = cap->band[NL80211_BAND_5GHZ].ht_cap_info; in ath12k_mac_setup_ht_vht_cap()
7733 band->ht_cap = ath12k_create_ht_cap(ar, ht_cap, in ath12k_mac_setup_ht_vht_cap()
7735 band->vht_cap = ath12k_create_vht_cap(ar, rate_cap_tx_chainmask, in ath12k_mac_setup_ht_vht_cap()
7752 int nss, ru; in ath12k_gen_ppe_thresh() local
7755 he_ppet[0] = fw_ppet->numss_m1 & IEEE80211_PPE_THRES_NSS_MASK; in ath12k_gen_ppe_thresh()
7756 he_ppet[0] |= (fw_ppet->ru_bit_mask << in ath12k_gen_ppe_thresh()
7759 for (nss = 0; nss <= fw_ppet->numss_m1; nss++) { in ath12k_gen_ppe_thresh()
7760 for (ru = 0; ru < 4; ru++) { in ath12k_gen_ppe_thresh()
7764 if ((fw_ppet->ru_bit_mask & BIT(ru)) == 0) in ath12k_gen_ppe_thresh()
7766 val = (fw_ppet->ppet16_ppet8_ru3_ru0[nss] >> (ru * 6)) & in ath12k_gen_ppe_thresh()
7769 for (i = 5; i >= 0; i--) { in ath12k_gen_ppe_thresh()
7785 he_cap_elem->mac_cap_info[0] &= ~m; in ath12k_mac_filter_he_cap_mesh()
7790 he_cap_elem->mac_cap_info[2] &= ~m; in ath12k_mac_filter_he_cap_mesh()
7795 he_cap_elem->mac_cap_info[3] &= ~m; in ath12k_mac_filter_he_cap_mesh()
7799 he_cap_elem->mac_cap_info[4] &= ~m; in ath12k_mac_filter_he_cap_mesh()
7805 he_cap_elem->mac_cap_info[5] &= ~m; in ath12k_mac_filter_he_cap_mesh()
7809 he_cap_elem->phy_cap_info[2] &= ~m; in ath12k_mac_filter_he_cap_mesh()
7814 he_cap_elem->phy_cap_info[3] &= ~m; in ath12k_mac_filter_he_cap_mesh()
7817 he_cap_elem->phy_cap_info[4] &= ~m; in ath12k_mac_filter_he_cap_mesh()
7820 he_cap_elem->phy_cap_info[5] &= ~m; in ath12k_mac_filter_he_cap_mesh()
7826 he_cap_elem->phy_cap_info[6] &= ~m; in ath12k_mac_filter_he_cap_mesh()
7832 he_cap_elem->phy_cap_info[7] &= ~m; in ath12k_mac_filter_he_cap_mesh()
7838 he_cap_elem->phy_cap_info[8] &= ~m; in ath12k_mac_filter_he_cap_mesh()
7846 he_cap_elem->phy_cap_info[9] &= ~m; in ath12k_mac_filter_he_cap_mesh()
7854 bcap->he_6ghz_capa = IEEE80211_HT_MPDU_DENSITY_NONE; in ath12k_mac_setup_he_6ghz_cap()
7855 if (bcap->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) in ath12k_mac_setup_he_6ghz_cap()
7856 bcap->he_6ghz_capa |= in ath12k_mac_setup_he_6ghz_cap()
7860 bcap->he_6ghz_capa |= in ath12k_mac_setup_he_6ghz_cap()
7863 val = u32_get_bits(pcap->vht_cap, in ath12k_mac_setup_he_6ghz_cap()
7865 bcap->he_6ghz_capa |= in ath12k_mac_setup_he_6ghz_cap()
7867 val = u32_get_bits(pcap->vht_cap, in ath12k_mac_setup_he_6ghz_cap()
7869 bcap->he_6ghz_capa |= in ath12k_mac_setup_he_6ghz_cap()
7871 if (pcap->vht_cap & IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN) in ath12k_mac_setup_he_6ghz_cap()
7872 bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_RX_ANTPAT_CONS; in ath12k_mac_setup_he_6ghz_cap()
7873 if (pcap->vht_cap & IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN) in ath12k_mac_setup_he_6ghz_cap()
7874 bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_TX_ANTPAT_CONS; in ath12k_mac_setup_he_6ghz_cap()
7876 return cpu_to_le16(bcap->he_6ghz_capa); in ath12k_mac_setup_he_6ghz_cap()
7883 struct ieee80211_he_mcs_nss_supp *mcs_nss = &he_cap->he_mcs_nss_supp; in ath12k_mac_set_hemcsmap()
7884 u8 maxtxnss_160 = ath12k_get_nss_160mhz(ar, ar->num_tx_chains); in ath12k_mac_set_hemcsmap()
7885 u8 maxrxnss_160 = ath12k_get_nss_160mhz(ar, ar->num_rx_chains); in ath12k_mac_set_hemcsmap()
7891 if (i < ar->num_tx_chains && in ath12k_mac_set_hemcsmap()
7892 (ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift) & BIT(i)) in ath12k_mac_set_hemcsmap()
7897 if (i < ar->num_rx_chains && in ath12k_mac_set_hemcsmap()
7898 (ar->cfg_rx_chainmask >> cap->tx_chain_mask_shift) & BIT(i)) in ath12k_mac_set_hemcsmap()
7904 (ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift) & BIT(i)) in ath12k_mac_set_hemcsmap()
7910 (ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift) & BIT(i)) in ath12k_mac_set_hemcsmap()
7916 mcs_nss->rx_mcs_80 = cpu_to_le16(rxmcs_map & 0xffff); in ath12k_mac_set_hemcsmap()
7917 mcs_nss->tx_mcs_80 = cpu_to_le16(txmcs_map & 0xffff); in ath12k_mac_set_hemcsmap()
7918 mcs_nss->rx_mcs_160 = cpu_to_le16(rxmcs_map_160 & 0xffff); in ath12k_mac_set_hemcsmap()
7919 mcs_nss->tx_mcs_160 = cpu_to_le16(txmcs_map_160 & 0xffff); in ath12k_mac_set_hemcsmap()
7927 struct ieee80211_he_cap_elem *he_cap_elem = &he_cap->he_cap_elem; in ath12k_mac_copy_he_cap()
7929 he_cap->has_he = true; in ath12k_mac_copy_he_cap()
7930 memcpy(he_cap_elem->mac_cap_info, band_cap->he_cap_info, in ath12k_mac_copy_he_cap()
7931 sizeof(he_cap_elem->mac_cap_info)); in ath12k_mac_copy_he_cap()
7932 memcpy(he_cap_elem->phy_cap_info, band_cap->he_cap_phy_info, in ath12k_mac_copy_he_cap()
7933 sizeof(he_cap_elem->phy_cap_info)); in ath12k_mac_copy_he_cap()
7935 he_cap_elem->mac_cap_info[1] &= in ath12k_mac_copy_he_cap()
7937 he_cap_elem->phy_cap_info[0] &= in ath12k_mac_copy_he_cap()
7942 he_cap_elem->phy_cap_info[0] &= in ath12k_mac_copy_he_cap()
7944 he_cap_elem->phy_cap_info[5] &= in ath12k_mac_copy_he_cap()
7946 he_cap_elem->phy_cap_info[5] |= num_tx_chains - 1; in ath12k_mac_copy_he_cap()
7950 he_cap_elem->mac_cap_info[2] &= in ath12k_mac_copy_he_cap()
7952 he_cap_elem->phy_cap_info[3] &= in ath12k_mac_copy_he_cap()
7954 he_cap_elem->phy_cap_info[9] |= in ath12k_mac_copy_he_cap()
7958 he_cap_elem->mac_cap_info[0] &= ~IEEE80211_HE_MAC_CAP0_TWT_RES; in ath12k_mac_copy_he_cap()
7959 he_cap_elem->mac_cap_info[0] |= IEEE80211_HE_MAC_CAP0_TWT_REQ; in ath12k_mac_copy_he_cap()
7960 he_cap_elem->phy_cap_info[9] |= in ath12k_mac_copy_he_cap()
7968 ath12k_mac_set_hemcsmap(ar, &ar->pdev->cap, he_cap); in ath12k_mac_copy_he_cap()
7969 memset(he_cap->ppe_thres, 0, sizeof(he_cap->ppe_thres)); in ath12k_mac_copy_he_cap()
7970 if (he_cap_elem->phy_cap_info[6] & in ath12k_mac_copy_he_cap()
7972 ath12k_gen_ppe_thresh(&band_cap->he_ppet, he_cap->ppe_thres); in ath12k_mac_copy_he_cap()
7981 if ((he_cap->phy_cap_info[0] & in ath12k_mac_copy_eht_mcs_nss()
7986 memcpy(&mcs_nss->only_20mhz, &band_cap->eht_mcs_20_only, in ath12k_mac_copy_eht_mcs_nss()
7989 if (he_cap->phy_cap_info[0] & in ath12k_mac_copy_eht_mcs_nss()
7992 memcpy(&mcs_nss->bw._80, &band_cap->eht_mcs_80, in ath12k_mac_copy_eht_mcs_nss()
7995 if (he_cap->phy_cap_info[0] & in ath12k_mac_copy_eht_mcs_nss()
7997 memcpy(&mcs_nss->bw._160, &band_cap->eht_mcs_160, in ath12k_mac_copy_eht_mcs_nss()
8000 if (eht_cap->phy_cap_info[0] & IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ) in ath12k_mac_copy_eht_mcs_nss()
8001 memcpy(&mcs_nss->bw._320, &band_cap->eht_mcs_320, in ath12k_mac_copy_eht_mcs_nss()
8009 u8 i, nss, ru, ppet_bit_len_per_ru = IEEE80211_EHT_PPE_THRES_INFO_PPET_SIZE * 2; in ath12k_mac_copy_eht_ppe_thresh() local
8011 u8p_replace_bits(&cap->eht_ppe_thres[0], fw_ppet->numss_m1, in ath12k_mac_copy_eht_ppe_thresh()
8014 u16p_replace_bits((u16 *)&cap->eht_ppe_thres[0], fw_ppet->ru_bit_mask, in ath12k_mac_copy_eht_ppe_thresh()
8017 for (nss = 0; nss <= fw_ppet->numss_m1; nss++) { in ath12k_mac_copy_eht_ppe_thresh()
8018 for (ru = 0; in ath12k_mac_copy_eht_ppe_thresh()
8019 ru < hweight16(IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK); in ath12k_mac_copy_eht_ppe_thresh()
8020 ru++) { in ath12k_mac_copy_eht_ppe_thresh()
8023 if ((fw_ppet->ru_bit_mask & BIT(ru)) == 0) in ath12k_mac_copy_eht_ppe_thresh()
8026 u32p_replace_bits(&val, fw_ppet->ppet16_ppet8_ru3_ru0[nss] >> in ath12k_mac_copy_eht_ppe_thresh()
8027 (ru * ppet_bit_len_per_ru), in ath12k_mac_copy_eht_ppe_thresh()
8028 GENMASK(ppet_bit_len_per_ru - 1, 0)); in ath12k_mac_copy_eht_ppe_thresh()
8031 cap->eht_ppe_thres[bit / 8] |= in ath12k_mac_copy_eht_ppe_thresh()
8046 eht_cap_elem->mac_cap_info[0] &= ~m; in ath12k_mac_filter_eht_cap_mesh()
8049 eht_cap_elem->phy_cap_info[0] &= ~m; in ath12k_mac_filter_eht_cap_mesh()
8055 eht_cap_elem->phy_cap_info[3] &= ~m; in ath12k_mac_filter_eht_cap_mesh()
8061 eht_cap_elem->phy_cap_info[4] &= ~m; in ath12k_mac_filter_eht_cap_mesh()
8067 eht_cap_elem->phy_cap_info[5] &= ~m; in ath12k_mac_filter_eht_cap_mesh()
8070 eht_cap_elem->phy_cap_info[6] &= ~m; in ath12k_mac_filter_eht_cap_mesh()
8078 eht_cap_elem->phy_cap_info[7] &= ~m; in ath12k_mac_filter_eht_cap_mesh()
8087 struct ieee80211_eht_cap_elem_fixed *eht_cap_elem = &eht_cap->eht_cap_elem; in ath12k_mac_copy_eht_cap()
8091 if (!(test_bit(WMI_TLV_SERVICE_11BE, ar->ab->wmi_ab.svc_map)) || in ath12k_mac_copy_eht_cap()
8092 ath12k_acpi_get_disable_11be(ar->ab)) in ath12k_mac_copy_eht_cap()
8095 eht_cap->has_eht = true; in ath12k_mac_copy_eht_cap()
8096 memcpy(eht_cap_elem->mac_cap_info, band_cap->eht_cap_mac_info, in ath12k_mac_copy_eht_cap()
8097 sizeof(eht_cap_elem->mac_cap_info)); in ath12k_mac_copy_eht_cap()
8098 memcpy(eht_cap_elem->phy_cap_info, band_cap->eht_cap_phy_info, in ath12k_mac_copy_eht_cap()
8099 sizeof(eht_cap_elem->phy_cap_info)); in ath12k_mac_copy_eht_cap()
8103 eht_cap_elem->phy_cap_info[0] &= in ath12k_mac_copy_eht_cap()
8105 eht_cap_elem->phy_cap_info[4] &= in ath12k_mac_copy_eht_cap()
8107 eht_cap_elem->phy_cap_info[5] &= in ath12k_mac_copy_eht_cap()
8111 eht_cap_elem->phy_cap_info[7] &= in ath12k_mac_copy_eht_cap()
8115 eht_cap_elem->phy_cap_info[7] &= in ath12k_mac_copy_eht_cap()
8127 ath12k_mac_copy_eht_mcs_nss(band_cap, &eht_cap->eht_mcs_nss_supp, in ath12k_mac_copy_eht_cap()
8130 if (eht_cap_elem->phy_cap_info[5] & in ath12k_mac_copy_eht_cap()
8132 ath12k_mac_copy_eht_ppe_thresh(&band_cap->eht_ppet, eht_cap); in ath12k_mac_copy_eht_cap()
8140 struct ath12k_band_cap *band_cap = &cap->band[band]; in ath12k_mac_copy_sband_iftype_data()
8158 ath12k_mac_copy_he_cap(ar, band_cap, i, ar->num_tx_chains, he_cap); in ath12k_mac_copy_sband_iftype_data()
8163 ath12k_mac_copy_eht_cap(ar, band_cap, &he_cap->he_cap_elem, i, in ath12k_mac_copy_sband_iftype_data()
8178 if (cap->supported_bands & WMI_HOST_WLAN_2GHZ_CAP) { in ath12k_mac_setup_sband_iftype_data()
8181 ar->mac.iftype[band], in ath12k_mac_setup_sband_iftype_data()
8183 sband = &ar->mac.sbands[band]; in ath12k_mac_setup_sband_iftype_data()
8184 _ieee80211_set_sband_iftype_data(sband, ar->mac.iftype[band], in ath12k_mac_setup_sband_iftype_data()
8188 if (cap->supported_bands & WMI_HOST_WLAN_5GHZ_CAP) { in ath12k_mac_setup_sband_iftype_data()
8191 ar->mac.iftype[band], in ath12k_mac_setup_sband_iftype_data()
8193 sband = &ar->mac.sbands[band]; in ath12k_mac_setup_sband_iftype_data()
8194 _ieee80211_set_sband_iftype_data(sband, ar->mac.iftype[band], in ath12k_mac_setup_sband_iftype_data()
8198 if (cap->supported_bands & WMI_HOST_WLAN_5GHZ_CAP && in ath12k_mac_setup_sband_iftype_data()
8199 ar->supports_6ghz) { in ath12k_mac_setup_sband_iftype_data()
8202 ar->mac.iftype[band], in ath12k_mac_setup_sband_iftype_data()
8204 sband = &ar->mac.sbands[band]; in ath12k_mac_setup_sband_iftype_data()
8205 _ieee80211_set_sband_iftype_data(sband, ar->mac.iftype[band], in ath12k_mac_setup_sband_iftype_data()
8215 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in __ath12k_set_antenna()
8218 return -EINVAL; in __ath12k_set_antenna()
8221 return -EINVAL; in __ath12k_set_antenna()
8227 tx_ant = min_t(u32, tx_ant, ar->pdev->cap.tx_chain_mask); in __ath12k_set_antenna()
8228 rx_ant = min_t(u32, rx_ant, ar->pdev->cap.rx_chain_mask); in __ath12k_set_antenna()
8230 ar->cfg_tx_chainmask = tx_ant; in __ath12k_set_antenna()
8231 ar->cfg_rx_chainmask = rx_ant; in __ath12k_set_antenna()
8233 if (ah->state != ATH12K_HW_STATE_ON && in __ath12k_set_antenna()
8234 ah->state != ATH12K_HW_STATE_RESTARTED) in __ath12k_set_antenna()
8238 tx_ant, ar->pdev->pdev_id); in __ath12k_set_antenna()
8240 ath12k_warn(ar->ab, "failed to set tx-chainmask: %d, req 0x%x\n", in __ath12k_set_antenna()
8245 ar->num_tx_chains = hweight32(tx_ant); in __ath12k_set_antenna()
8248 rx_ant, ar->pdev->pdev_id); in __ath12k_set_antenna()
8250 ath12k_warn(ar->ab, "failed to set rx-chainmask: %d, req 0x%x\n", in __ath12k_set_antenna()
8255 ar->num_rx_chains = hweight32(rx_ant); in __ath12k_set_antenna()
8258 ath12k_mac_setup_ht_vht_cap(ar, &ar->pdev->cap, NULL); in __ath12k_set_antenna()
8259 ath12k_mac_setup_sband_iftype_data(ar, &ar->pdev->cap); in __ath12k_set_antenna()
8268 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mgmt_over_wmi_tx_drop()
8272 num_mgmt = atomic_dec_if_positive(&ar->num_pending_mgmt_tx); in ath12k_mgmt_over_wmi_tx_drop()
8278 wake_up(&ar->txmgmt_empty_waitq); in ath12k_mgmt_over_wmi_tx_drop()
8286 spin_lock_bh(&ar->txmgmt_idr_lock); in ath12k_mac_tx_mgmt_free()
8287 msdu = idr_remove(&ar->txmgmt_idr, buf_id); in ath12k_mac_tx_mgmt_free()
8288 spin_unlock_bh(&ar->txmgmt_idr_lock); in ath12k_mac_tx_mgmt_free()
8293 dma_unmap_single(ar->ab->dev, ATH12K_SKB_CB(msdu)->paddr, msdu->len, in ath12k_mac_tx_mgmt_free()
8297 memset(&info->status, 0, sizeof(info->status)); in ath12k_mac_tx_mgmt_free()
8315 struct ath12k *ar = skb_cb->ar; in ath12k_mac_vif_txmgmt_idr_remove()
8317 if (skb_cb->vif == vif) in ath12k_mac_vif_txmgmt_idr_remove()
8326 struct ath12k_base *ab = ar->ab; in ath12k_mac_mgmt_tx_wmi()
8327 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; in ath12k_mac_mgmt_tx_wmi()
8336 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_mgmt_tx_wmi()
8338 skb_cb->ar = ar; in ath12k_mac_mgmt_tx_wmi()
8339 spin_lock_bh(&ar->txmgmt_idr_lock); in ath12k_mac_mgmt_tx_wmi()
8340 buf_id = idr_alloc(&ar->txmgmt_idr, skb, 0, in ath12k_mac_mgmt_tx_wmi()
8342 spin_unlock_bh(&ar->txmgmt_idr_lock); in ath12k_mac_mgmt_tx_wmi()
8344 return -ENOSPC; in ath12k_mac_mgmt_tx_wmi()
8347 if ((skb_cb->flags & ATH12K_SKB_CIPHER_SET) && in ath12k_mac_mgmt_tx_wmi()
8348 !(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP)) { in ath12k_mac_mgmt_tx_wmi()
8349 if ((ieee80211_is_action(hdr->frame_control) || in ath12k_mac_mgmt_tx_wmi()
8350 ieee80211_is_deauth(hdr->frame_control) || in ath12k_mac_mgmt_tx_wmi()
8351 ieee80211_is_disassoc(hdr->frame_control)) && in ath12k_mac_mgmt_tx_wmi()
8352 ieee80211_has_protected(hdr->frame_control)) { in ath12k_mac_mgmt_tx_wmi()
8353 enctype = ath12k_dp_tx_get_encrypt_type(skb_cb->cipher); in ath12k_mac_mgmt_tx_wmi()
8359 paddr = dma_map_single(ab->dev, skb->data, skb->len, DMA_TO_DEVICE); in ath12k_mac_mgmt_tx_wmi()
8360 if (dma_mapping_error(ab->dev, paddr)) { in ath12k_mac_mgmt_tx_wmi()
8362 ret = -EIO; in ath12k_mac_mgmt_tx_wmi()
8366 skb_cb->paddr = paddr; in ath12k_mac_mgmt_tx_wmi()
8370 ath12k_warn(ar->ab, "failed to send mgmt frame: %d\n", ret); in ath12k_mac_mgmt_tx_wmi()
8377 dma_unmap_single(ab->dev, skb_cb->paddr, in ath12k_mac_mgmt_tx_wmi()
8378 skb->len, DMA_TO_DEVICE); in ath12k_mac_mgmt_tx_wmi()
8380 spin_lock_bh(&ar->txmgmt_idr_lock); in ath12k_mac_mgmt_tx_wmi()
8381 idr_remove(&ar->txmgmt_idr, buf_id); in ath12k_mac_mgmt_tx_wmi()
8382 spin_unlock_bh(&ar->txmgmt_idr_lock); in ath12k_mac_mgmt_tx_wmi()
8391 while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL) in ath12k_mgmt_over_wmi_tx_purge()
8398 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; in ath12k_mac_mgmt_action_frame_fill_elem_data()
8403 struct ath12k *ar = arvif->ar; in ath12k_mac_mgmt_action_frame_fill_elem_data()
8405 struct wiphy *wiphy = hw->wiphy; in ath12k_mac_mgmt_action_frame_fill_elem_data()
8414 if (skb->len < IEEE80211_MIN_ACTION_SIZE) in ath12k_mac_mgmt_action_frame_fill_elem_data()
8415 return -EINVAL; in ath12k_mac_mgmt_action_frame_fill_elem_data()
8417 remaining_len = skb->len - IEEE80211_MIN_ACTION_SIZE; in ath12k_mac_mgmt_action_frame_fill_elem_data()
8418 has_protected = ieee80211_has_protected(hdr->frame_control); in ath12k_mac_mgmt_action_frame_fill_elem_data()
8423 if (test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags) && in ath12k_mac_mgmt_action_frame_fill_elem_data()
8428 buf = (u8 *)&mgmt->u.action; in ath12k_mac_mgmt_action_frame_fill_elem_data()
8436 switch (skb_cb->cipher) { in ath12k_mac_mgmt_action_frame_fill_elem_data()
8450 return -EINVAL; in ath12k_mac_mgmt_action_frame_fill_elem_data()
8454 return -EINVAL; in ath12k_mac_mgmt_action_frame_fill_elem_data()
8457 remaining_len -= iv_len; in ath12k_mac_mgmt_action_frame_fill_elem_data()
8469 return -EINVAL; in ath12k_mac_mgmt_action_frame_fill_elem_data()
8476 remaining_len -= 2; in ath12k_mac_mgmt_action_frame_fill_elem_data()
8480 ath12k_warn(ar->ab, in ath12k_mac_mgmt_action_frame_fill_elem_data()
8482 arvif->vdev_id); in ath12k_mac_mgmt_action_frame_fill_elem_data()
8483 return -EINVAL; in ath12k_mac_mgmt_action_frame_fill_elem_data()
8486 conf = wiphy_dereference(wiphy, link_conf->chanctx_conf); in ath12k_mac_mgmt_action_frame_fill_elem_data()
8488 return -ENOENT; in ath12k_mac_mgmt_action_frame_fill_elem_data()
8490 cur_tx_power = link_conf->txpower; in ath12k_mac_mgmt_action_frame_fill_elem_data()
8491 max_tx_power = min(conf->def.chan->max_reg_power, in ath12k_mac_mgmt_action_frame_fill_elem_data()
8492 (int)ar->max_tx_power / 2); in ath12k_mac_mgmt_action_frame_fill_elem_data()
8494 ath12k_mac_op_get_txpower(hw, arvif->ahvif->vif, arvif->link_id, in ath12k_mac_mgmt_action_frame_fill_elem_data()
8501 return -EINVAL; in ath12k_mac_mgmt_action_frame_fill_elem_data()
8503 /* Variable length format as defined in IEEE 802.11-2024, in ath12k_mac_mgmt_action_frame_fill_elem_data()
8504 * Figure 9-1187-Link Measurement Request frame Action field in ath12k_mac_mgmt_action_frame_fill_elem_data()
8512 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_mgmt_action_frame_fill_elem_data()
8519 return -EINVAL; in ath12k_mac_mgmt_action_frame_fill_elem_data()
8521 /* Variable length format as defined in IEEE 802.11-2024, in ath12k_mac_mgmt_action_frame_fill_elem_data()
8522 * Figure 9-1188-Link Measurement Report frame Action field format in ath12k_mac_mgmt_action_frame_fill_elem_data()
8536 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_mgmt_action_frame_fill_elem_data()
8541 return -EINVAL; in ath12k_mac_mgmt_action_frame_fill_elem_data()
8555 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; in ath12k_mac_mgmt_frame_fill_elem_data()
8557 if (!ieee80211_is_action(hdr->frame_control)) in ath12k_mac_mgmt_frame_fill_elem_data()
8566 struct ath12k_hw *ah = ar->ah; in ath12k_mgmt_over_wmi_tx_work()
8575 while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL) { in ath12k_mgmt_over_wmi_tx_work()
8577 if (!skb_cb->vif) { in ath12k_mgmt_over_wmi_tx_work()
8578 ath12k_warn(ar->ab, "no vif found for mgmt frame\n"); in ath12k_mgmt_over_wmi_tx_work()
8583 ahvif = ath12k_vif_to_ahvif(skb_cb->vif); in ath12k_mgmt_over_wmi_tx_work()
8584 if (!(ahvif->links_map & BIT(skb_cb->link_id))) { in ath12k_mgmt_over_wmi_tx_work()
8585 ath12k_warn(ar->ab, in ath12k_mgmt_over_wmi_tx_work()
8587 skb_cb->link_id, ahvif->links_map); in ath12k_mgmt_over_wmi_tx_work()
8592 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[skb_cb->link_id]); in ath12k_mgmt_over_wmi_tx_work()
8593 if (ar->allocated_vdev_map & (1LL << arvif->vdev_id)) { in ath12k_mgmt_over_wmi_tx_work()
8603 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mgmt_over_wmi_tx_work()
8610 ath12k_warn(ar->ab, "failed to tx mgmt frame, vdev_id %d :%d\n", in ath12k_mgmt_over_wmi_tx_work()
8611 arvif->vdev_id, ret); in ath12k_mgmt_over_wmi_tx_work()
8615 ath12k_warn(ar->ab, in ath12k_mgmt_over_wmi_tx_work()
8617 arvif->vdev_id, in ath12k_mgmt_over_wmi_tx_work()
8618 skb_cb->link_id, in ath12k_mgmt_over_wmi_tx_work()
8619 arvif->is_started); in ath12k_mgmt_over_wmi_tx_work()
8628 struct sk_buff_head *q = &ar->wmi_mgmt_tx_queue; in ath12k_mac_mgmt_tx()
8630 if (test_bit(ATH12K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags)) in ath12k_mac_mgmt_tx()
8631 return -ESHUTDOWN; in ath12k_mac_mgmt_tx()
8639 atomic_read(&ar->num_pending_mgmt_tx) > ATH12K_PRB_RSP_DROP_THRESHOLD) { in ath12k_mac_mgmt_tx()
8640 ath12k_warn(ar->ab, in ath12k_mac_mgmt_tx()
8642 return -ENOSPC; in ath12k_mac_mgmt_tx()
8646 ath12k_warn(ar->ab, "mgmt tx queue is full\n"); in ath12k_mac_mgmt_tx()
8647 return -ENOSPC; in ath12k_mac_mgmt_tx()
8651 atomic_inc(&ar->num_pending_mgmt_tx); in ath12k_mac_mgmt_tx()
8652 wiphy_work_queue(ath12k_ar_to_hw(ar)->wiphy, &ar->wmi_mgmt_tx_work); in ath12k_mac_mgmt_tx()
8667 spin_lock_bh(&ar->data_lock); in ath12k_mac_add_p2p_noa_ie()
8669 if (ahvif->u.ap.noa_data && in ath12k_mac_add_p2p_noa_ie()
8670 !pskb_expand_head(skb, 0, ahvif->u.ap.noa_len, in ath12k_mac_add_p2p_noa_ie()
8672 skb_put_data(skb, ahvif->u.ap.noa_data, in ath12k_mac_add_p2p_noa_ie()
8673 ahvif->u.ap.noa_len); in ath12k_mac_add_p2p_noa_ie()
8675 spin_unlock_bh(&ar->data_lock); in ath12k_mac_add_p2p_noa_ie()
8683 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; in ath12k_mlo_mcast_update_tx_link_address()
8689 bss_conf = rcu_dereference(vif->link_conf[link_id]); in ath12k_mlo_mcast_update_tx_link_address()
8691 ether_addr_copy(hdr->addr2, bss_conf->addr); in ath12k_mlo_mcast_update_tx_link_address()
8698 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; in ath12k_mac_get_tx_link()
8709 return ahvif->deflink.link_id; in ath12k_mac_get_tx_link()
8717 if (!sta->mlo) { in ath12k_mac_get_tx_link()
8718 link = ahsta->deflink.link_id; in ath12k_mac_get_tx_link()
8723 bss_conf = rcu_dereference(vif->link_conf[link]); in ath12k_mac_get_tx_link()
8725 ether_addr_copy(hdr->addr2, bss_conf->addr); in ath12k_mac_get_tx_link()
8726 if (!ieee80211_has_tods(hdr->frame_control) && in ath12k_mac_get_tx_link()
8727 !ieee80211_has_fromds(hdr->frame_control)) in ath12k_mac_get_tx_link()
8728 ether_addr_copy(hdr->addr3, bss_conf->addr); in ath12k_mac_get_tx_link()
8738 ieee80211_is_data(hdr->frame_control)) in ath12k_mac_get_tx_link()
8739 return ahsta->assoc_link_id; in ath12k_mac_get_tx_link()
8743 link = ahsta->deflink.link_id; in ath12k_mac_get_tx_link()
8745 if (!ieee80211_is_mgmt(hdr->frame_control)) in ath12k_mac_get_tx_link()
8749 bss_conf = rcu_dereference(vif->link_conf[link]); in ath12k_mac_get_tx_link()
8750 link_sta = rcu_dereference(sta->link[link]); in ath12k_mac_get_tx_link()
8753 ether_addr_copy(hdr->addr1, link_sta->addr); in ath12k_mac_get_tx_link()
8754 ether_addr_copy(hdr->addr2, bss_conf->addr); in ath12k_mac_get_tx_link()
8756 if (vif->type == NL80211_IFTYPE_STATION && bss_conf->bssid) in ath12k_mac_get_tx_link()
8757 ether_addr_copy(hdr->addr3, bss_conf->bssid); in ath12k_mac_get_tx_link()
8758 else if (vif->type == NL80211_IFTYPE_AP) in ath12k_mac_get_tx_link()
8759 ether_addr_copy(hdr->addr3, bss_conf->addr); in ath12k_mac_get_tx_link()
8777 * check. Also this would not need any translation at hdr->addr1 in ath12k_mac_get_tx_link()
8781 ether_addr_copy(hdr->addr2, bss_conf->addr); in ath12k_mac_get_tx_link()
8783 if (vif->type == NL80211_IFTYPE_STATION && bss_conf->bssid) in ath12k_mac_get_tx_link()
8784 ether_addr_copy(hdr->addr3, bss_conf->bssid); in ath12k_mac_get_tx_link()
8785 else if (vif->type == NL80211_IFTYPE_AP) in ath12k_mac_get_tx_link()
8786 ether_addr_copy(hdr->addr3, bss_conf->addr); in ath12k_mac_get_tx_link()
8799 struct ieee80211_vif *vif = info->control.vif; in ath12k_mac_op_tx()
8801 struct ath12k_link_vif *arvif = &ahvif->deflink; in ath12k_mac_op_tx()
8802 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; in ath12k_mac_op_tx()
8803 struct ieee80211_key_conf *key = info->control.hw_key; in ath12k_mac_op_tx()
8804 struct ieee80211_sta *sta = control->sta; in ath12k_mac_op_tx()
8806 u32 info_flags = info->flags; in ath12k_mac_op_tx()
8819 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { in ath12k_mac_op_tx()
8824 link_id = u32_get_bits(info->control.flags, IEEE80211_TX_CTRL_MLO_LINK); in ath12k_mac_op_tx()
8826 skb_cb->vif = vif; in ath12k_mac_op_tx()
8829 skb_cb->cipher = key->cipher; in ath12k_mac_op_tx()
8830 skb_cb->flags |= ATH12K_SKB_CIPHER_SET; in ath12k_mac_op_tx()
8844 arvif = rcu_dereference(ahvif->link[link_id]); in ath12k_mac_op_tx()
8845 if (!arvif || !arvif->ar) { in ath12k_mac_op_tx()
8846 ath12k_warn(ahvif->ah, "failed to find arvif link id %u for frame transmission", in ath12k_mac_op_tx()
8852 ar = arvif->ar; in ath12k_mac_op_tx()
8853 skb_cb->link_id = link_id; in ath12k_mac_op_tx()
8854 is_prb_rsp = ieee80211_is_probe_resp(hdr->frame_control); in ath12k_mac_op_tx()
8857 eth = (struct ethhdr *)skb->data; in ath12k_mac_op_tx()
8858 is_mcast = is_multicast_ether_addr(eth->h_dest); in ath12k_mac_op_tx()
8860 skb_cb->flags |= ATH12K_SKB_HW_80211_ENCAP; in ath12k_mac_op_tx()
8861 } else if (ieee80211_is_mgmt(hdr->frame_control)) { in ath12k_mac_op_tx()
8862 if (sta && sta->mlo) in ath12k_mac_op_tx()
8863 skb_cb->flags |= ATH12K_SKB_MLO_STA; in ath12k_mac_op_tx()
8867 ath12k_warn(ar->ab, "failed to queue management frame %d\n", in ath12k_mac_op_tx()
8875 is_mcast = is_multicast_ether_addr(hdr->addr1); in ath12k_mac_op_tx()
8878 if (vif->type == NL80211_IFTYPE_AP && vif->p2p) in ath12k_mac_op_tx()
8882 if (!test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags) && in ath12k_mac_op_tx()
8883 !(skb_cb->flags & ATH12K_SKB_HW_80211_ENCAP) && in ath12k_mac_op_tx()
8884 !(skb_cb->flags & ATH12K_SKB_CIPHER_SET) && in ath12k_mac_op_tx()
8885 ieee80211_has_protected(hdr->frame_control)) in ath12k_mac_op_tx()
8888 if (!vif->valid_links || !is_mcast || is_dvlan || in ath12k_mac_op_tx()
8889 (skb_cb->flags & ATH12K_SKB_HW_80211_ENCAP) || in ath12k_mac_op_tx()
8890 test_bit(ATH12K_FLAG_RAW_MODE, &ar->ab->dev_flags)) { in ath12k_mac_op_tx()
8893 ath12k_warn(ar->ab, "failed to transmit frame %d\n", ret); in ath12k_mac_op_tx()
8894 ieee80211_free_txskb(ar->ah->hw, skb); in ath12k_mac_op_tx()
8898 mcbc_gsn = atomic_inc_return(&ahvif->mcbc_gsn) & 0xfff; in ath12k_mac_op_tx()
8900 links_map = ahvif->links_map; in ath12k_mac_op_tx()
8903 tmp_arvif = rcu_dereference(ahvif->link[link_id]); in ath12k_mac_op_tx()
8904 if (!tmp_arvif || !tmp_arvif->is_up) in ath12k_mac_op_tx()
8907 tmp_ar = tmp_arvif->ar; in ath12k_mac_op_tx()
8910 ath12k_err(ar->ab, in ath12k_mac_op_tx()
8912 link_id, tmp_arvif->vdev_id); in ath12k_mac_op_tx()
8921 skb_cb->link_id = link_id; in ath12k_mac_op_tx()
8924 if (unlikely(!ahvif->key_cipher)) in ath12k_mac_op_tx()
8927 spin_lock_bh(&tmp_ar->ab->base_lock); in ath12k_mac_op_tx()
8928 peer = ath12k_peer_find_by_addr(tmp_ar->ab, tmp_arvif->bssid); in ath12k_mac_op_tx()
8930 spin_unlock_bh(&tmp_ar->ab->base_lock); in ath12k_mac_op_tx()
8931 ath12k_warn(tmp_ar->ab, in ath12k_mac_op_tx()
8933 tmp_arvif->vdev_id, tmp_arvif->bssid, in ath12k_mac_op_tx()
8934 ahvif->links_map); in ath12k_mac_op_tx()
8939 key = peer->keys[peer->mcast_keyidx]; in ath12k_mac_op_tx()
8941 skb_cb->cipher = key->cipher; in ath12k_mac_op_tx()
8942 skb_cb->flags |= ATH12K_SKB_CIPHER_SET; in ath12k_mac_op_tx()
8944 hdr = (struct ieee80211_hdr *)msdu_copied->data; in ath12k_mac_op_tx()
8945 if (!ieee80211_has_protected(hdr->frame_control)) in ath12k_mac_op_tx()
8946 hdr->frame_control |= in ath12k_mac_op_tx()
8949 spin_unlock_bh(&tmp_ar->ab->base_lock); in ath12k_mac_op_tx()
8955 if (ret == -ENOMEM) { in ath12k_mac_op_tx()
8960 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_op_tx()
8964 ath12k_warn(ar->ab, in ath12k_mac_op_tx()
8972 ieee80211_free_txskb(ar->ah->hw, skb); in ath12k_mac_op_tx()
8978 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_drain_tx()
8980 /* make sure rcu-protected mac80211 tx path itself is drained */ in ath12k_mac_drain_tx()
8983 wiphy_work_cancel(ath12k_ar_to_hw(ar)->wiphy, &ar->wmi_mgmt_tx_work); in ath12k_mac_drain_tx()
8990 struct ath12k_base *ab = ar->ab; in ath12k_mac_config_mon_status_default()
8994 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_config_mon_status_default()
8996 if (!ab->hw_params->rxdma1_enable) in ath12k_mac_config_mon_status_default()
9008 for (i = 0; i < ab->hw_params->num_rxdma_per_pdev; i++) { in ath12k_mac_config_mon_status_default()
9009 ring_id = ar->dp.rxdma_mon_dst_ring[i].ring_id; in ath12k_mac_config_mon_status_default()
9011 ar->dp.mac_id + i, in ath12k_mac_config_mon_status_default()
9027 struct ath12k_hw *ah = ar->ah; in ath12k_mac_start()
9028 struct ath12k_base *ab = ar->ab; in ath12k_mac_start()
9029 struct ath12k_pdev *pdev = ar->pdev; in ath12k_mac_start()
9032 lockdep_assert_held(&ah->hw_mutex); in ath12k_mac_start()
9033 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_start()
9036 1, pdev->pdev_id); in ath12k_mac_start()
9044 pdev->pdev_id); in ath12k_mac_start()
9051 0, pdev->pdev_id); in ath12k_mac_start()
9058 ret = ath12k_wmi_send_dfs_phyerr_offload_enable_cmd(ar, pdev->pdev_id); in ath12k_mac_start()
9073 1, pdev->pdev_id); in ath12k_mac_start()
9080 __ath12k_set_antenna(ar, ar->cfg_tx_chainmask, ar->cfg_rx_chainmask); in ath12k_mac_start()
9091 if (ret == -EINVAL) in ath12k_mac_start()
9096 ar->num_started_vdevs = 0; in ath12k_mac_start()
9097 ar->num_created_vdevs = 0; in ath12k_mac_start()
9098 ar->num_peers = 0; in ath12k_mac_start()
9099 ar->allocated_vdev_map = 0; in ath12k_mac_start()
9100 ar->chan_tx_pwr = ATH12K_PDEV_TX_POWER_INVALID; in ath12k_mac_start()
9106 if (ret && (ret != -EOPNOTSUPP)) { in ath12k_mac_start()
9112 if (ret == -EOPNOTSUPP) in ath12k_mac_start()
9117 ath12k_wmi_pdev_lro_cfg(ar, ar->pdev->pdev_id); in ath12k_mac_start()
9120 if (ab->hw_params->idle_ps) { in ath12k_mac_start()
9122 1, pdev->pdev_id); in ath12k_mac_start()
9129 rcu_assign_pointer(ab->pdevs_active[ar->pdev_idx], in ath12k_mac_start()
9130 &ab->pdevs[ar->pdev_idx]); in ath12k_mac_start()
9143 lockdep_assert_wiphy(ah->hw->wiphy); in ath12k_drain_tx()
9156 return -EPERM; in ath12k_mac_op_start()
9158 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_start()
9162 guard(mutex)(&ah->hw_mutex); in ath12k_mac_op_start()
9164 switch (ah->state) { in ath12k_mac_op_start()
9166 ah->state = ATH12K_HW_STATE_ON; in ath12k_mac_op_start()
9169 ah->state = ATH12K_HW_STATE_RESTARTED; in ath12k_mac_op_start()
9175 ah->state = ATH12K_HW_STATE_OFF; in ath12k_mac_op_start()
9178 return -EINVAL; in ath12k_mac_op_start()
9184 ah->state = ATH12K_HW_STATE_OFF; in ath12k_mac_op_start()
9186 ath12k_err(ar->ab, "fail to start mac operations in pdev idx %d ret %d\n", in ath12k_mac_op_start()
9187 ar->pdev_idx, ret); in ath12k_mac_op_start()
9195 for (; i > 0; i--) { in ath12k_mac_op_start()
9196 ar = ath12k_ah_to_ar(ah, i - 1); in ath12k_mac_op_start()
9205 struct ath12k_base *ab = ar->ab; in ath12k_mac_rfkill_config()
9209 if (ab->hw_params->rfkill_pin == 0) in ath12k_mac_rfkill_config()
9210 return -EOPNOTSUPP; in ath12k_mac_rfkill_config()
9214 ab->hw_params->rfkill_pin, ab->hw_params->rfkill_cfg, in ath12k_mac_rfkill_config()
9215 ab->hw_params->rfkill_on_level); in ath12k_mac_rfkill_config()
9217 param = u32_encode_bits(ab->hw_params->rfkill_on_level, in ath12k_mac_rfkill_config()
9219 u32_encode_bits(ab->hw_params->rfkill_pin, in ath12k_mac_rfkill_config()
9221 u32_encode_bits(ab->hw_params->rfkill_cfg, in ath12k_mac_rfkill_config()
9225 param, ar->pdev->pdev_id); in ath12k_mac_rfkill_config()
9246 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac %d rfkill enable %d", in ath12k_mac_rfkill_enable_radio()
9247 ar->pdev_idx, param); in ath12k_mac_rfkill_enable_radio()
9250 param, ar->pdev->pdev_id); in ath12k_mac_rfkill_enable_radio()
9252 ath12k_warn(ar->ab, "failed to set rfkill enable param %d: %d\n", in ath12k_mac_rfkill_enable_radio()
9262 struct ath12k_hw *ah = ar->ah; in ath12k_mac_stop()
9267 lockdep_assert_held(&ah->hw_mutex); in ath12k_mac_stop()
9268 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_stop()
9271 if (ret && (ret != -EOPNOTSUPP)) in ath12k_mac_stop()
9272 ath12k_err(ar->ab, "failed to clear rx_filter for monitor status ring: (%d)\n", in ath12k_mac_stop()
9275 clear_bit(ATH12K_FLAG_CAC_RUNNING, &ar->dev_flags); in ath12k_mac_stop()
9277 cancel_delayed_work_sync(&ar->scan.timeout); in ath12k_mac_stop()
9278 wiphy_work_cancel(ath12k_ar_to_hw(ar)->wiphy, &ar->scan.vdev_clean_wk); in ath12k_mac_stop()
9279 cancel_work_sync(&ar->regd_channel_update_work); in ath12k_mac_stop()
9280 cancel_work_sync(&ar->regd_update_work); in ath12k_mac_stop()
9281 cancel_work_sync(&ar->ab->rfkill_work); in ath12k_mac_stop()
9282 cancel_work_sync(&ar->ab->update_11d_work); in ath12k_mac_stop()
9283 ar->state_11d = ATH12K_11D_IDLE; in ath12k_mac_stop()
9284 complete(&ar->completed_11d_scan); in ath12k_mac_stop()
9286 spin_lock_bh(&ar->data_lock); in ath12k_mac_stop()
9288 list_for_each_entry_safe(ppdu_stats, tmp, &ar->ppdu_stats_info, list) { in ath12k_mac_stop()
9289 list_del(&ppdu_stats->list); in ath12k_mac_stop()
9293 while ((arg = list_first_entry_or_null(&ar->regd_channel_update_queue, in ath12k_mac_stop()
9296 list_del(&arg->list); in ath12k_mac_stop()
9299 spin_unlock_bh(&ar->data_lock); in ath12k_mac_stop()
9301 rcu_assign_pointer(ar->ab->pdevs_active[ar->pdev_idx], NULL); in ath12k_mac_stop()
9305 atomic_set(&ar->num_pending_mgmt_tx, 0); in ath12k_mac_stop()
9314 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_stop()
9318 mutex_lock(&ah->hw_mutex); in ath12k_mac_op_stop()
9320 ah->state = ATH12K_HW_STATE_OFF; in ath12k_mac_op_stop()
9325 mutex_unlock(&ah->hw_mutex); in ath12k_mac_op_stop()
9331 struct ath12k_base *ab = arvif->ar->ab; in ath12k_mac_get_vdev_stats_id()
9335 if (ab->free_vdev_stats_id_map & (1LL << vdev_stats_id)) { in ath12k_mac_get_vdev_stats_id()
9342 ab->free_vdev_stats_id_map |= (1LL << vdev_stats_id); in ath12k_mac_get_vdev_stats_id()
9347 arvif->vdev_stats_id = vdev_stats_id; in ath12k_mac_get_vdev_stats_id()
9354 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_mac_setup_vdev_params_mbssid()
9356 struct ath12k *ar = arvif->ar; in ath12k_mac_setup_vdev_params_mbssid()
9361 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()
9362 ahvif->vif->addr, arvif->link_id); in ath12k_mac_setup_vdev_params_mbssid()
9363 return -ENOLINK; in ath12k_mac_setup_vdev_params_mbssid()
9370 if (link_conf->nontransmitted) { in ath12k_mac_setup_vdev_params_mbssid()
9371 if (ath12k_ar_to_hw(ar)->wiphy != in ath12k_mac_setup_vdev_params_mbssid()
9372 ath12k_ar_to_hw(tx_arvif->ar)->wiphy) in ath12k_mac_setup_vdev_params_mbssid()
9373 return -EINVAL; in ath12k_mac_setup_vdev_params_mbssid()
9376 *tx_vdev_id = tx_arvif->vdev_id; in ath12k_mac_setup_vdev_params_mbssid()
9380 return -EINVAL; in ath12k_mac_setup_vdev_params_mbssid()
9383 if (link_conf->ema_ap) in ath12k_mac_setup_vdev_params_mbssid()
9392 struct ath12k *ar = arvif->ar; in ath12k_mac_setup_vdev_create_arg()
9393 struct ath12k_pdev *pdev = ar->pdev; in ath12k_mac_setup_vdev_create_arg()
9394 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_mac_setup_vdev_create_arg()
9397 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_setup_vdev_create_arg()
9399 arg->if_id = arvif->vdev_id; in ath12k_mac_setup_vdev_create_arg()
9400 arg->type = ahvif->vdev_type; in ath12k_mac_setup_vdev_create_arg()
9401 arg->subtype = ahvif->vdev_subtype; in ath12k_mac_setup_vdev_create_arg()
9402 arg->pdev_id = pdev->pdev_id; in ath12k_mac_setup_vdev_create_arg()
9404 arg->mbssid_flags = WMI_VDEV_MBSSID_FLAGS_NON_MBSSID_AP; in ath12k_mac_setup_vdev_create_arg()
9405 arg->mbssid_tx_vdev_id = 0; in ath12k_mac_setup_vdev_create_arg()
9407 ar->ab->wmi_ab.svc_map)) { in ath12k_mac_setup_vdev_create_arg()
9409 &arg->mbssid_flags, in ath12k_mac_setup_vdev_create_arg()
9410 &arg->mbssid_tx_vdev_id); in ath12k_mac_setup_vdev_create_arg()
9415 if (pdev->cap.supported_bands & WMI_HOST_WLAN_2GHZ_CAP) { in ath12k_mac_setup_vdev_create_arg()
9416 arg->chains[NL80211_BAND_2GHZ].tx = ar->num_tx_chains; in ath12k_mac_setup_vdev_create_arg()
9417 arg->chains[NL80211_BAND_2GHZ].rx = ar->num_rx_chains; in ath12k_mac_setup_vdev_create_arg()
9419 if (pdev->cap.supported_bands & WMI_HOST_WLAN_5GHZ_CAP) { in ath12k_mac_setup_vdev_create_arg()
9420 arg->chains[NL80211_BAND_5GHZ].tx = ar->num_tx_chains; in ath12k_mac_setup_vdev_create_arg()
9421 arg->chains[NL80211_BAND_5GHZ].rx = ar->num_rx_chains; in ath12k_mac_setup_vdev_create_arg()
9423 if (pdev->cap.supported_bands & WMI_HOST_WLAN_5GHZ_CAP && in ath12k_mac_setup_vdev_create_arg()
9424 ar->supports_6ghz) { in ath12k_mac_setup_vdev_create_arg()
9425 arg->chains[NL80211_BAND_6GHZ].tx = ar->num_tx_chains; in ath12k_mac_setup_vdev_create_arg()
9426 arg->chains[NL80211_BAND_6GHZ].rx = ar->num_rx_chains; in ath12k_mac_setup_vdev_create_arg()
9429 arg->if_stats_id = ath12k_mac_get_vdev_stats_id(arvif); in ath12k_mac_setup_vdev_create_arg()
9432 if (hweight16(ahvif->vif->valid_links) > ATH12K_WMI_MLO_MAX_LINKS) { in ath12k_mac_setup_vdev_create_arg()
9433 ath12k_warn(ar->ab, "too many MLO links during setting up vdev: %d", in ath12k_mac_setup_vdev_create_arg()
9434 ahvif->vif->valid_links); in ath12k_mac_setup_vdev_create_arg()
9435 return -EINVAL; in ath12k_mac_setup_vdev_create_arg()
9438 ether_addr_copy(arg->mld_addr, ahvif->vif->addr); in ath12k_mac_setup_vdev_create_arg()
9446 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_mac_update_vif_offload()
9448 struct ath12k *ar = arvif->ar; in ath12k_mac_update_vif_offload()
9449 struct ath12k_base *ab = ar->ab; in ath12k_mac_update_vif_offload()
9454 if (vif->type != NL80211_IFTYPE_STATION && in ath12k_mac_update_vif_offload()
9455 vif->type != NL80211_IFTYPE_AP) in ath12k_mac_update_vif_offload()
9456 vif->offload_flags &= ~(IEEE80211_OFFLOAD_ENCAP_ENABLED | in ath12k_mac_update_vif_offload()
9459 if (vif->offload_flags & IEEE80211_OFFLOAD_ENCAP_ENABLED) in ath12k_mac_update_vif_offload()
9460 ahvif->tx_encap_type = ATH12K_HW_TXRX_ETHERNET; in ath12k_mac_update_vif_offload()
9461 else if (test_bit(ATH12K_FLAG_RAW_MODE, &ab->dev_flags)) in ath12k_mac_update_vif_offload()
9462 ahvif->tx_encap_type = ATH12K_HW_TXRX_RAW; in ath12k_mac_update_vif_offload()
9464 ahvif->tx_encap_type = ATH12K_HW_TXRX_NATIVE_WIFI; in ath12k_mac_update_vif_offload()
9466 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_update_vif_offload()
9467 param_id, ahvif->tx_encap_type); in ath12k_mac_update_vif_offload()
9470 arvif->vdev_id, ret); in ath12k_mac_update_vif_offload()
9471 vif->offload_flags &= ~IEEE80211_OFFLOAD_ENCAP_ENABLED; in ath12k_mac_update_vif_offload()
9475 if (vif->offload_flags & IEEE80211_OFFLOAD_DECAP_ENABLED) in ath12k_mac_update_vif_offload()
9477 else if (test_bit(ATH12K_FLAG_RAW_MODE, &ab->dev_flags)) in ath12k_mac_update_vif_offload()
9482 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_update_vif_offload()
9486 arvif->vdev_id, ret); in ath12k_mac_update_vif_offload()
9487 vif->offload_flags &= ~IEEE80211_OFFLOAD_DECAP_ENABLED; in ath12k_mac_update_vif_offload()
9499 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_update_vif_offload()
9501 if (vif->valid_links) { in ath12k_mac_op_update_vif_offload()
9502 links = vif->valid_links; in ath12k_mac_op_update_vif_offload()
9504 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); in ath12k_mac_op_update_vif_offload()
9505 if (!(arvif && arvif->ar)) in ath12k_mac_op_update_vif_offload()
9514 ath12k_mac_update_vif_offload(&ahvif->deflink); in ath12k_mac_op_update_vif_offload()
9524 for (i = 0; i < ab->num_radios; i++) { in ath12k_mac_vif_ap_active_any()
9525 pdev = &ab->pdevs[i]; in ath12k_mac_vif_ap_active_any()
9526 ar = pdev->ar; in ath12k_mac_vif_ap_active_any()
9527 list_for_each_entry(arvif, &ar->arvifs, list) { in ath12k_mac_vif_ap_active_any()
9528 if (arvif->is_up && in ath12k_mac_vif_ap_active_any()
9529 arvif->ahvif->vdev_type == WMI_VDEV_TYPE_AP) in ath12k_mac_vif_ap_active_any()
9541 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_11d_scan_start()
9543 if (ar->regdom_set_by_user) in ath12k_mac_11d_scan_start()
9546 if (ar->vdev_id_11d_scan != ATH12K_11D_INVALID_VDEV_ID) in ath12k_mac_11d_scan_start()
9549 if (!test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map)) in ath12k_mac_11d_scan_start()
9552 if (ath12k_mac_vif_ap_active_any(ar->ab)) in ath12k_mac_11d_scan_start()
9559 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_11d_scan_start()
9564 ath12k_warn(ar->ab, "failed to start 11d scan vdev %d ret: %d\n", in ath12k_mac_11d_scan_start()
9567 ar->vdev_id_11d_scan = vdev_id; in ath12k_mac_11d_scan_start()
9568 if (ar->state_11d == ATH12K_11D_PREPARING) in ath12k_mac_11d_scan_start()
9569 ar->state_11d = ATH12K_11D_RUNNING; in ath12k_mac_11d_scan_start()
9573 if (ar->state_11d == ATH12K_11D_PREPARING) { in ath12k_mac_11d_scan_start()
9574 ar->state_11d = ATH12K_11D_IDLE; in ath12k_mac_11d_scan_start()
9575 complete(&ar->completed_11d_scan); in ath12k_mac_11d_scan_start()
9584 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_11d_scan_stop()
9586 if (!test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map)) in ath12k_mac_11d_scan_stop()
9589 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac stop 11d for vdev %d\n", in ath12k_mac_11d_scan_stop()
9590 ar->vdev_id_11d_scan); in ath12k_mac_11d_scan_stop()
9592 if (ar->state_11d == ATH12K_11D_PREPARING) { in ath12k_mac_11d_scan_stop()
9593 ar->state_11d = ATH12K_11D_IDLE; in ath12k_mac_11d_scan_stop()
9594 complete(&ar->completed_11d_scan); in ath12k_mac_11d_scan_stop()
9597 if (ar->vdev_id_11d_scan != ATH12K_11D_INVALID_VDEV_ID) { in ath12k_mac_11d_scan_stop()
9598 vdev_id = ar->vdev_id_11d_scan; in ath12k_mac_11d_scan_stop()
9602 ath12k_warn(ar->ab, in ath12k_mac_11d_scan_stop()
9606 ar->vdev_id_11d_scan = ATH12K_11D_INVALID_VDEV_ID; in ath12k_mac_11d_scan_stop()
9607 ar->state_11d = ATH12K_11D_IDLE; in ath12k_mac_11d_scan_stop()
9608 complete(&ar->completed_11d_scan); in ath12k_mac_11d_scan_stop()
9621 for (i = 0; i < ab->num_radios; i++) { in ath12k_mac_11d_scan_stop_all()
9622 pdev = &ab->pdevs[i]; in ath12k_mac_11d_scan_stop_all()
9623 ar = pdev->ar; in ath12k_mac_11d_scan_stop_all()
9632 ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE; in ath12k_mac_determine_vdev_type()
9634 switch (vif->type) { in ath12k_mac_determine_vdev_type()
9637 ahvif->vdev_type = WMI_VDEV_TYPE_STA; in ath12k_mac_determine_vdev_type()
9639 if (vif->p2p) in ath12k_mac_determine_vdev_type()
9640 ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_CLIENT; in ath12k_mac_determine_vdev_type()
9644 ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_MESH_11S; in ath12k_mac_determine_vdev_type()
9647 ahvif->vdev_type = WMI_VDEV_TYPE_AP; in ath12k_mac_determine_vdev_type()
9649 if (vif->p2p) in ath12k_mac_determine_vdev_type()
9650 ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_GO; in ath12k_mac_determine_vdev_type()
9654 ahvif->vdev_type = WMI_VDEV_TYPE_MONITOR; in ath12k_mac_determine_vdev_type()
9657 ahvif->vdev_type = WMI_VDEV_TYPE_STA; in ath12k_mac_determine_vdev_type()
9658 ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_DEVICE; in ath12k_mac_determine_vdev_type()
9668 struct ath12k_hw *ah = ar->ah; in ath12k_mac_vdev_create()
9669 struct ath12k_base *ab = ar->ab; in ath12k_mac_vdev_create()
9670 struct ieee80211_hw *hw = ah->hw; in ath12k_mac_vdev_create()
9671 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_mac_vdev_create()
9682 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_vdev_create()
9687 if (vif->type == NL80211_IFTYPE_MONITOR && ar->monitor_vdev_created) in ath12k_mac_vdev_create()
9688 return -EINVAL; in ath12k_mac_vdev_create()
9690 link_id = arvif->link_id; in ath12k_mac_vdev_create()
9693 link_conf = wiphy_dereference(hw->wiphy, vif->link_conf[link_id]); in ath12k_mac_vdev_create()
9695 ath12k_warn(ar->ab, "unable to access bss link conf in vdev create for vif %pM link %u\n", in ath12k_mac_vdev_create()
9696 vif->addr, arvif->link_id); in ath12k_mac_vdev_create()
9697 return -ENOLINK; in ath12k_mac_vdev_create()
9702 memcpy(arvif->bssid, link_conf->addr, ETH_ALEN); in ath12k_mac_vdev_create()
9704 memcpy(arvif->bssid, vif->addr, ETH_ALEN); in ath12k_mac_vdev_create()
9706 arvif->ar = ar; in ath12k_mac_vdev_create()
9707 vdev_id = __ffs64(ab->free_vdev_map); in ath12k_mac_vdev_create()
9708 arvif->vdev_id = vdev_id; in ath12k_mac_vdev_create()
9709 if (vif->type == NL80211_IFTYPE_MONITOR) in ath12k_mac_vdev_create()
9710 ar->monitor_vdev_id = vdev_id; in ath12k_mac_vdev_create()
9712 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev create id %d type %d subtype %d map %llx\n", in ath12k_mac_vdev_create()
9713 arvif->vdev_id, ahvif->vdev_type, ahvif->vdev_subtype, in ath12k_mac_vdev_create()
9714 ab->free_vdev_map); in ath12k_mac_vdev_create()
9716 vif->cab_queue = arvif->vdev_id % (ATH12K_HW_MAX_QUEUES - 1); in ath12k_mac_vdev_create()
9717 for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++) in ath12k_mac_vdev_create()
9718 vif->hw_queue[i] = i % (ATH12K_HW_MAX_QUEUES - 1); in ath12k_mac_vdev_create()
9723 arvif->vdev_id, ret); in ath12k_mac_vdev_create()
9727 ret = ath12k_wmi_vdev_create(ar, arvif->bssid, &vdev_arg); in ath12k_mac_vdev_create()
9730 arvif->vdev_id, ret); in ath12k_mac_vdev_create()
9734 ar->num_created_vdevs++; in ath12k_mac_vdev_create()
9735 arvif->is_created = true; in ath12k_mac_vdev_create()
9737 vif->addr, arvif->vdev_id); in ath12k_mac_vdev_create()
9738 ar->allocated_vdev_map |= 1LL << arvif->vdev_id; in ath12k_mac_vdev_create()
9739 ab->free_vdev_map &= ~(1LL << arvif->vdev_id); in ath12k_mac_vdev_create()
9741 spin_lock_bh(&ar->data_lock); in ath12k_mac_vdev_create()
9742 list_add(&arvif->list, &ar->arvifs); in ath12k_mac_vdev_create()
9743 spin_unlock_bh(&ar->data_lock); in ath12k_mac_vdev_create()
9747 nss = hweight32(ar->cfg_tx_chainmask) ? : 1; in ath12k_mac_vdev_create()
9748 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_vdev_create()
9752 arvif->vdev_id, ar->cfg_tx_chainmask, nss, ret); in ath12k_mac_vdev_create()
9756 switch (ahvif->vdev_type) { in ath12k_mac_vdev_create()
9758 peer_param.vdev_id = arvif->vdev_id; in ath12k_mac_vdev_create()
9759 peer_param.peer_addr = arvif->bssid; in ath12k_mac_vdev_create()
9764 arvif->vdev_id, ret); in ath12k_mac_vdev_create()
9770 ath12k_warn(ar->ab, "failed to set vdev %i kickout parameters: %d\n", in ath12k_mac_vdev_create()
9771 arvif->vdev_id, ret); in ath12k_mac_vdev_create()
9774 ath12k_mac_11d_scan_stop_all(ar->ab); in ath12k_mac_vdev_create()
9779 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath12k_mac_vdev_create()
9782 ath12k_warn(ar->ab, "failed to set vdev %d RX wake policy: %d\n", in ath12k_mac_vdev_create()
9783 arvif->vdev_id, ret); 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 TX wake threshold: %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 pspoll count: %d\n", in ath12k_mac_vdev_create()
9803 arvif->vdev_id, ret); in ath12k_mac_vdev_create()
9807 ret = ath12k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id, false); in ath12k_mac_vdev_create()
9809 ath12k_warn(ar->ab, "failed to disable vdev %d ps mode: %d\n", in ath12k_mac_vdev_create()
9810 arvif->vdev_id, ret); in ath12k_mac_vdev_create()
9814 if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ab->wmi_ab.svc_map) && in ath12k_mac_vdev_create()
9815 ahvif->vdev_type == WMI_VDEV_TYPE_STA && in ath12k_mac_vdev_create()
9816 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE) { in ath12k_mac_vdev_create()
9817 reinit_completion(&ar->completed_11d_scan); in ath12k_mac_vdev_create()
9818 ar->state_11d = ATH12K_11D_PREPARING; in ath12k_mac_vdev_create()
9822 ar->monitor_vdev_created = true; in ath12k_mac_vdev_create()
9829 arvif->txpower = link_conf->txpower; in ath12k_mac_vdev_create()
9831 arvif->txpower = NL80211_TX_POWER_AUTOMATIC; in ath12k_mac_vdev_create()
9838 param_value = hw->wiphy->rts_threshold; in ath12k_mac_vdev_create()
9839 ar->rts_threshold = param_value; in ath12k_mac_vdev_create()
9840 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_vdev_create()
9843 ath12k_warn(ar->ab, "failed to set rts threshold for vdev %d: %d\n", in ath12k_mac_vdev_create()
9844 arvif->vdev_id, ret); in ath12k_mac_vdev_create()
9852 if (ahvif->vdev_type == WMI_VDEV_TYPE_AP) { in ath12k_mac_vdev_create()
9853 reinit_completion(&ar->peer_delete_done); in ath12k_mac_vdev_create()
9855 ret = ath12k_wmi_send_peer_delete_cmd(ar, arvif->bssid, in ath12k_mac_vdev_create()
9856 arvif->vdev_id); in ath12k_mac_vdev_create()
9858 ath12k_warn(ar->ab, "failed to delete peer vdev_id %d addr %pM\n", in ath12k_mac_vdev_create()
9859 arvif->vdev_id, arvif->bssid); in ath12k_mac_vdev_create()
9863 ret = ath12k_wait_for_peer_delete_done(ar, arvif->vdev_id, in ath12k_mac_vdev_create()
9864 arvif->bssid); in ath12k_mac_vdev_create()
9868 ar->num_peers--; in ath12k_mac_vdev_create()
9872 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { in ath12k_mac_vdev_create()
9873 ar->monitor_vdev_id = -1; in ath12k_mac_vdev_create()
9874 ar->monitor_vdev_created = false; in ath12k_mac_vdev_create()
9877 ath12k_wmi_vdev_delete(ar, arvif->vdev_id); in ath12k_mac_vdev_create()
9878 ar->num_created_vdevs--; in ath12k_mac_vdev_create()
9879 arvif->is_created = false; in ath12k_mac_vdev_create()
9880 arvif->ar = NULL; in ath12k_mac_vdev_create()
9881 ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id); in ath12k_mac_vdev_create()
9882 ab->free_vdev_map |= 1LL << arvif->vdev_id; in ath12k_mac_vdev_create()
9883 ab->free_vdev_stats_id_map &= ~(1LL << arvif->vdev_stats_id); in ath12k_mac_vdev_create()
9884 spin_lock_bh(&ar->data_lock); in ath12k_mac_vdev_create()
9885 list_del(&arvif->list); in ath12k_mac_vdev_create()
9886 spin_unlock_bh(&ar->data_lock); in ath12k_mac_vdev_create()
9889 arvif->ar = NULL; in ath12k_mac_vdev_create()
9896 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_mac_vif_flush_key_cache()
9897 struct ath12k_hw *ah = ahvif->ah; in ath12k_mac_vif_flush_key_cache()
9900 struct ath12k_vif_cache *cache = ahvif->cache[arvif->link_id]; in ath12k_mac_vif_flush_key_cache()
9903 lockdep_assert_wiphy(ah->hw->wiphy); in ath12k_mac_vif_flush_key_cache()
9905 list_for_each_entry_safe(key_conf, tmp, &cache->key_conf.list, list) { in ath12k_mac_vif_flush_key_cache()
9907 if (key_conf->sta) { in ath12k_mac_vif_flush_key_cache()
9908 ahsta = ath12k_sta_to_ahsta(key_conf->sta); in ath12k_mac_vif_flush_key_cache()
9909 arsta = wiphy_dereference(ah->hw->wiphy, in ath12k_mac_vif_flush_key_cache()
9910 ahsta->link[arvif->link_id]); in ath12k_mac_vif_flush_key_cache()
9915 ret = ath12k_mac_set_key(arvif->ar, key_conf->cmd, in ath12k_mac_vif_flush_key_cache()
9917 key_conf->key); in ath12k_mac_vif_flush_key_cache()
9919 ath12k_warn(arvif->ar->ab, "unable to apply set key param to vdev %d ret %d\n", in ath12k_mac_vif_flush_key_cache()
9920 arvif->vdev_id, ret); in ath12k_mac_vif_flush_key_cache()
9922 list_del(&key_conf->list); in ath12k_mac_vif_flush_key_cache()
9929 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_mac_vif_cache_flush()
9931 struct ath12k_vif_cache *cache = ahvif->cache[arvif->link_id]; in ath12k_mac_vif_cache_flush()
9932 struct ath12k_base *ab = ar->ab; in ath12k_mac_vif_cache_flush()
9937 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_vif_cache_flush()
9942 if (cache->tx_conf.changed) { in ath12k_mac_vif_cache_flush()
9943 ret = ath12k_mac_conf_tx(arvif, cache->tx_conf.ac, in ath12k_mac_vif_cache_flush()
9944 &cache->tx_conf.tx_queue_params); in ath12k_mac_vif_cache_flush()
9951 if (cache->bss_conf_changed) { in ath12k_mac_vif_cache_flush()
9954 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()
9955 vif->addr, arvif->link_id); in ath12k_mac_vif_cache_flush()
9959 cache->bss_conf_changed); in ath12k_mac_vif_cache_flush()
9962 if (!list_empty(&cache->key_conf.list)) in ath12k_mac_vif_cache_flush()
9965 ath12k_ahvif_put_link_cache(ahvif, arvif->link_id); in ath12k_mac_vif_cache_flush()
9972 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_mac_assign_vif_to_vdev()
9975 struct ath12k_hw *ah = hw->priv; in ath12k_mac_assign_vif_to_vdev()
9978 u8 link_id = arvif->link_id, scan_link_id; in ath12k_mac_assign_vif_to_vdev()
9982 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_assign_vif_to_vdev()
9984 if (ah->num_radio == 1) in ath12k_mac_assign_vif_to_vdev()
9985 ar = ah->radio; in ath12k_mac_assign_vif_to_vdev()
9998 scan_link_map = ahvif->links_map & ATH12K_SCAN_LINKS_MASK; in ath12k_mac_assign_vif_to_vdev()
10000 scan_arvif = wiphy_dereference(hw->wiphy, in ath12k_mac_assign_vif_to_vdev()
10001 ahvif->link[scan_link_id]); in ath12k_mac_assign_vif_to_vdev()
10002 if (scan_arvif && scan_arvif->ar == ar) { in ath12k_mac_assign_vif_to_vdev()
10003 ar->scan.arvif = NULL; in ath12k_mac_assign_vif_to_vdev()
10011 if (arvif->ar) { in ath12k_mac_assign_vif_to_vdev()
10013 if (WARN_ON(!arvif->is_created)) { in ath12k_mac_assign_vif_to_vdev()
10014 arvif->ar = NULL; in ath12k_mac_assign_vif_to_vdev()
10018 if (ah->num_radio == 1) in ath12k_mac_assign_vif_to_vdev()
10019 return arvif->ar; in ath12k_mac_assign_vif_to_vdev()
10025 if (ar != arvif->ar) { in ath12k_mac_assign_vif_to_vdev()
10026 if (WARN_ON(arvif->is_started)) in ath12k_mac_assign_vif_to_vdev()
10034 ab = ar->ab; in ath12k_mac_assign_vif_to_vdev()
10040 if (vif->type == NL80211_IFTYPE_AP && in ath12k_mac_assign_vif_to_vdev()
10041 ar->num_peers > (ar->max_num_peers - 1)) { in ath12k_mac_assign_vif_to_vdev()
10046 if (arvif->is_created) in ath12k_mac_assign_vif_to_vdev()
10049 if (ar->num_created_vdevs > (TARGET_NUM_VDEVS(ab) - 1)) { in ath12k_mac_assign_vif_to_vdev()
10057 ath12k_warn(ab, "failed to create vdev %pM ret %d", vif->addr, ret); in ath12k_mac_assign_vif_to_vdev()
10068 return arvif->ar; in ath12k_mac_assign_vif_to_vdev()
10082 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_add_interface()
10086 ahvif->ah = ah; in ath12k_mac_op_add_interface()
10087 ahvif->vif = vif; in ath12k_mac_op_add_interface()
10088 arvif = &ahvif->deflink; in ath12k_mac_op_add_interface()
10090 ath12k_mac_init_arvif(ahvif, arvif, -1); in ath12k_mac_op_add_interface()
10093 vif->cab_queue = ATH12K_HW_DEFAULT_QUEUE; in ath12k_mac_op_add_interface()
10094 for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++) in ath12k_mac_op_add_interface()
10095 vif->hw_queue[i] = ATH12K_HW_DEFAULT_QUEUE; in ath12k_mac_op_add_interface()
10097 vif->driver_flags |= IEEE80211_VIF_SUPPORTS_UAPSD; in ath12k_mac_op_add_interface()
10105 ab = ar->ab; in ath12k_mac_op_add_interface()
10106 reg_info = ab->reg_info[ar->pdev_idx]; in ath12k_mac_op_add_interface()
10108 ah->regd_updated = false; in ath12k_mac_op_add_interface()
10109 ath12k_reg_handle_chan_list(ab, reg_info, ahvif->vdev_type, in ath12k_mac_op_add_interface()
10128 spin_lock_bh(&dp->tx_desc_lock[i]); in ath12k_mac_vif_unref()
10130 list_for_each_entry(tx_desc_info, &dp->tx_desc_used_list[i], in ath12k_mac_vif_unref()
10132 skb = tx_desc_info->skb; in ath12k_mac_vif_unref()
10137 if (skb_cb->vif == vif) in ath12k_mac_vif_unref()
10138 skb_cb->vif = NULL; in ath12k_mac_vif_unref()
10141 spin_unlock_bh(&dp->tx_desc_lock[i]); in ath12k_mac_vif_unref()
10147 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_mac_vdev_delete()
10149 struct ath12k_base *ab = ar->ab; in ath12k_mac_vdev_delete()
10153 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_vdev_delete()
10155 reinit_completion(&ar->vdev_delete_done); in ath12k_mac_vdev_delete()
10157 ret = ath12k_wmi_vdev_delete(ar, arvif->vdev_id); in ath12k_mac_vdev_delete()
10160 arvif->vdev_id, ret); in ath12k_mac_vdev_delete()
10164 time_left = wait_for_completion_timeout(&ar->vdev_delete_done, in ath12k_mac_vdev_delete()
10171 ab->free_vdev_map |= 1LL << arvif->vdev_id; in ath12k_mac_vdev_delete()
10172 ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id); in ath12k_mac_vdev_delete()
10173 ar->num_created_vdevs--; in ath12k_mac_vdev_delete()
10175 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { in ath12k_mac_vdev_delete()
10176 ar->monitor_vdev_id = -1; in ath12k_mac_vdev_delete()
10177 ar->monitor_vdev_created = false; in ath12k_mac_vdev_delete()
10181 vif->addr, arvif->vdev_id); in ath12k_mac_vdev_delete()
10184 spin_lock_bh(&ar->data_lock); in ath12k_mac_vdev_delete()
10185 list_del(&arvif->list); in ath12k_mac_vdev_delete()
10186 spin_unlock_bh(&ar->data_lock); in ath12k_mac_vdev_delete()
10188 ath12k_peer_cleanup(ar, arvif->vdev_id); in ath12k_mac_vdev_delete()
10189 ath12k_ahvif_put_link_cache(ahvif, arvif->link_id); in ath12k_mac_vdev_delete()
10191 idr_for_each(&ar->txmgmt_idr, in ath12k_mac_vdev_delete()
10194 ath12k_mac_vif_unref(&ab->dp, vif); in ath12k_mac_vdev_delete()
10195 ath12k_dp_tx_put_bank_profile(&ab->dp, arvif->bank_id); in ath12k_mac_vdev_delete()
10201 arvif->is_created = false; in ath12k_mac_vdev_delete()
10202 arvif->ar = NULL; in ath12k_mac_vdev_delete()
10215 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_remove_interface()
10222 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); in ath12k_mac_op_remove_interface()
10223 if (!arvif || !arvif->is_created) in ath12k_mac_op_remove_interface()
10226 ar = arvif->ar; in ath12k_mac_op_remove_interface()
10232 if (ar->scan.arvif == arvif) { in ath12k_mac_op_remove_interface()
10233 wiphy_work_cancel(hw->wiphy, &ar->scan.vdev_clean_wk); in ath12k_mac_op_remove_interface()
10235 spin_lock_bh(&ar->data_lock); in ath12k_mac_op_remove_interface()
10236 ar->scan.arvif = NULL; in ath12k_mac_op_remove_interface()
10237 if (!ar->scan.is_roc) { in ath12k_mac_op_remove_interface()
10245 ar->scan.state = ATH12K_SCAN_IDLE; in ath12k_mac_op_remove_interface()
10246 ar->scan_channel = NULL; in ath12k_mac_op_remove_interface()
10247 ar->scan.roc_freq = 0; in ath12k_mac_op_remove_interface()
10248 spin_unlock_bh(&ar->data_lock); in ath12k_mac_op_remove_interface()
10274 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_configure_filter()
10279 ar->filter_flags = *total_flags; in ath12k_mac_op_configure_filter()
10290 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_get_antenna()
10293 antennas_rx = max_t(u32, antennas_rx, ar->cfg_rx_chainmask); in ath12k_mac_op_get_antenna()
10294 antennas_tx = max_t(u32, antennas_tx, ar->cfg_tx_chainmask); in ath12k_mac_op_get_antenna()
10311 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_set_antenna()
10328 int ret = -EINVAL; in ath12k_mac_ampdu_action()
10330 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_ampdu_action()
10334 return -EINVAL; in ath12k_mac_ampdu_action()
10336 switch (params->action) { in ath12k_mac_ampdu_action()
10348 /* Tx A-MPDU aggregation offloaded to hw/fw so deny mac80211 in ath12k_mac_ampdu_action()
10351 ret = -EOPNOTSUPP; in ath12k_mac_ampdu_action()
10356 ath12k_warn(ar->ab, "unable to perform ampdu action %d for vif %pM link %u ret %d\n", in ath12k_mac_ampdu_action()
10357 params->action, vif->addr, link_id, ret); in ath12k_mac_ampdu_action()
10366 struct ieee80211_sta *sta = params->sta; in ath12k_mac_op_ampdu_action()
10368 unsigned long links_map = ahsta->links_map; in ath12k_mac_op_ampdu_action()
10369 int ret = -EINVAL; in ath12k_mac_op_ampdu_action()
10372 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_ampdu_action()
10392 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_add_chanctx()
10396 return -EINVAL; in ath12k_mac_op_add_chanctx()
10398 ab = ar->ab; in ath12k_mac_op_add_chanctx()
10402 ctx->def.chan->center_freq, ctx->def.width, ctx); in ath12k_mac_op_add_chanctx()
10404 spin_lock_bh(&ar->data_lock); in ath12k_mac_op_add_chanctx()
10408 ar->rx_channel = ctx->def.chan; in ath12k_mac_op_add_chanctx()
10409 spin_unlock_bh(&ar->data_lock); in ath12k_mac_op_add_chanctx()
10410 ar->chan_tx_pwr = ATH12K_PDEV_TX_POWER_INVALID; in ath12k_mac_op_add_chanctx()
10421 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_remove_chanctx()
10427 ab = ar->ab; in ath12k_mac_op_remove_chanctx()
10431 ctx->def.chan->center_freq, ctx->def.width, ctx); in ath12k_mac_op_remove_chanctx()
10433 spin_lock_bh(&ar->data_lock); in ath12k_mac_op_remove_chanctx()
10437 ar->rx_channel = NULL; in ath12k_mac_op_remove_chanctx()
10438 spin_unlock_bh(&ar->data_lock); in ath12k_mac_op_remove_chanctx()
10439 ar->chan_tx_pwr = ATH12K_PDEV_TX_POWER_INVALID; in ath12k_mac_op_remove_chanctx()
10450 int n = ar->mac.sbands[band].n_iftype_data; in ath12k_mac_check_down_grade_phy_mode()
10457 data = ar->mac.iftype[band]; in ath12k_mac_check_down_grade_phy_mode()
10465 if (eht_cap && eht_cap->has_eht) in ath12k_mac_check_down_grade_phy_mode()
10497 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_check_down_grade_phy_mode()
10509 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_mac_mlo_get_vdev_args()
10516 lockdep_assert_wiphy(ahvif->ah->hw->wiphy); in ath12k_mac_mlo_get_vdev_args()
10521 if (hweight16(ahvif->vif->valid_links) > ATH12K_WMI_MLO_MAX_LINKS) in ath12k_mac_mlo_get_vdev_args()
10524 ml_arg->enabled = true; in ath12k_mac_mlo_get_vdev_args()
10530 ml_arg->link_add = true; in ath12k_mac_mlo_get_vdev_args()
10532 ml_arg->assoc_link = arvif->is_sta_assoc_link; in ath12k_mac_mlo_get_vdev_args()
10534 partner_info = ml_arg->partner_info; in ath12k_mac_mlo_get_vdev_args()
10536 links = ahvif->links_map; in ath12k_mac_mlo_get_vdev_args()
10538 arvif_p = wiphy_dereference(ahvif->ah->hw->wiphy, ahvif->link[link_id]); in ath12k_mac_mlo_get_vdev_args()
10546 if (!arvif_p->is_created) in ath12k_mac_mlo_get_vdev_args()
10549 link_conf = wiphy_dereference(ahvif->ah->hw->wiphy, in ath12k_mac_mlo_get_vdev_args()
10550 ahvif->vif->link_conf[arvif_p->link_id]); in ath12k_mac_mlo_get_vdev_args()
10555 partner_info->vdev_id = arvif_p->vdev_id; in ath12k_mac_mlo_get_vdev_args()
10556 partner_info->hw_link_id = arvif_p->ar->pdev->hw_link_id; in ath12k_mac_mlo_get_vdev_args()
10557 ether_addr_copy(partner_info->addr, link_conf->addr); in ath12k_mac_mlo_get_vdev_args()
10558 ml_arg->num_partner_links++; in ath12k_mac_mlo_get_vdev_args()
10568 struct ath12k *ar = arvif->ar; in ath12k_mac_vdev_start_restart()
10569 struct ath12k_base *ab = ar->ab; in ath12k_mac_vdev_start_restart()
10571 const struct cfg80211_chan_def *chandef = &ctx->def; in ath12k_mac_vdev_start_restart()
10573 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_mac_vdev_start_restart()
10578 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_vdev_start_restart()
10582 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()
10583 ahvif->vif->addr, arvif->link_id); in ath12k_mac_vdev_start_restart()
10584 return -ENOLINK; in ath12k_mac_vdev_start_restart()
10587 reinit_completion(&ar->vdev_setup_done); in ath12k_mac_vdev_start_restart()
10589 arg.vdev_id = arvif->vdev_id; in ath12k_mac_vdev_start_restart()
10590 arg.dtim_period = arvif->dtim_period; in ath12k_mac_vdev_start_restart()
10591 arg.bcn_intval = arvif->beacon_interval; in ath12k_mac_vdev_start_restart()
10592 arg.punct_bitmap = ~arvif->punct_bitmap; in ath12k_mac_vdev_start_restart()
10594 arg.freq = chandef->chan->center_freq; in ath12k_mac_vdev_start_restart()
10595 arg.band_center_freq1 = chandef->center_freq1; in ath12k_mac_vdev_start_restart()
10596 arg.band_center_freq2 = chandef->center_freq2; in ath12k_mac_vdev_start_restart()
10597 arg.mode = ath12k_phymodes[chandef->chan->band][chandef->width]; in ath12k_mac_vdev_start_restart()
10600 chandef->chan->band, in ath12k_mac_vdev_start_restart()
10601 ahvif->vif->type); in ath12k_mac_vdev_start_restart()
10603 arg.max_power = chandef->chan->max_power; in ath12k_mac_vdev_start_restart()
10604 arg.max_reg_power = chandef->chan->max_reg_power; in ath12k_mac_vdev_start_restart()
10605 arg.max_antenna_gain = chandef->chan->max_antenna_gain; in ath12k_mac_vdev_start_restart()
10607 arg.pref_tx_streams = ar->num_tx_chains; in ath12k_mac_vdev_start_restart()
10608 arg.pref_rx_streams = ar->num_rx_chains; in ath12k_mac_vdev_start_restart()
10613 ar->ab->wmi_ab.svc_map)) { in ath12k_mac_vdev_start_restart()
10621 if (ahvif->vdev_type == WMI_VDEV_TYPE_AP) { in ath12k_mac_vdev_start_restart()
10622 arg.ssid = ahvif->u.ap.ssid; in ath12k_mac_vdev_start_restart()
10623 arg.ssid_len = ahvif->u.ap.ssid_len; in ath12k_mac_vdev_start_restart()
10624 arg.hidden_ssid = ahvif->u.ap.hidden_ssid; in ath12k_mac_vdev_start_restart()
10627 arg.chan_radar = !!(chandef->chan->flags & IEEE80211_CHAN_RADAR); in ath12k_mac_vdev_start_restart()
10629 arg.freq2_radar = ctx->radar_enabled; in ath12k_mac_vdev_start_restart()
10633 spin_lock_bh(&ab->base_lock); in ath12k_mac_vdev_start_restart()
10634 arg.regdomain = ar->ab->dfs_region; in ath12k_mac_vdev_start_restart()
10635 spin_unlock_bh(&ab->base_lock); in ath12k_mac_vdev_start_restart()
10640 arg.passive |= !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR); in ath12k_mac_vdev_start_restart()
10652 ath12k_warn(ar->ab, "failed to %s WMI vdev %i\n", in ath12k_mac_vdev_start_restart()
10669 ath12k_wmi_send_vdev_set_tpc_power(ar, arvif->vdev_id, in ath12k_mac_vdev_start_restart()
10670 &arvif->reg_tpc_info); in ath12k_mac_vdev_start_restart()
10673 ar->num_started_vdevs++; in ath12k_mac_vdev_start_restart()
10675 ahvif->vif->addr, arvif->vdev_id); in ath12k_mac_vdev_start_restart()
10677 /* Enable CAC Running Flag in the driver by checking all sub-channel's DFS in ath12k_mac_vdev_start_restart()
10683 if (arvif->ahvif->vdev_type == WMI_VDEV_TYPE_AP && ctx->radar_enabled && in ath12k_mac_vdev_start_restart()
10684 cfg80211_chandef_dfs_usable(hw->wiphy, chandef)) { in ath12k_mac_vdev_start_restart()
10685 set_bit(ATH12K_FLAG_CAC_RUNNING, &ar->dev_flags); in ath12k_mac_vdev_start_restart()
10686 dfs_cac_time = cfg80211_chandef_dfs_cac_time(hw->wiphy, chandef); in ath12k_mac_vdev_start_restart()
10696 arvif->vdev_id, ret); in ath12k_mac_vdev_start_restart()
10732 lockdep_assert_wiphy(ahvif->ah->hw->wiphy); in ath12k_mac_change_chanctx_cnt_iter()
10734 links_map = ahvif->links_map; in ath12k_mac_change_chanctx_cnt_iter()
10736 arvif = wiphy_dereference(ahvif->ah->hw->wiphy, ahvif->link[link_id]); in ath12k_mac_change_chanctx_cnt_iter()
10740 if (!arvif->is_created || arvif->ar != arg->ar) in ath12k_mac_change_chanctx_cnt_iter()
10743 link_conf = wiphy_dereference(ahvif->ah->hw->wiphy, in ath12k_mac_change_chanctx_cnt_iter()
10744 vif->link_conf[link_id]); in ath12k_mac_change_chanctx_cnt_iter()
10748 if (rcu_access_pointer(link_conf->chanctx_conf) != arg->ctx) in ath12k_mac_change_chanctx_cnt_iter()
10751 arg->n_vifs++; in ath12k_mac_change_chanctx_cnt_iter()
10767 lockdep_assert_wiphy(ahvif->ah->hw->wiphy); in ath12k_mac_change_chanctx_fill_iter()
10769 links_map = ahvif->links_map; in ath12k_mac_change_chanctx_fill_iter()
10771 arvif = wiphy_dereference(ahvif->ah->hw->wiphy, ahvif->link[link_id]); in ath12k_mac_change_chanctx_fill_iter()
10775 if (!arvif->is_created || arvif->ar != arg->ar) in ath12k_mac_change_chanctx_fill_iter()
10778 link_conf = wiphy_dereference(ahvif->ah->hw->wiphy, in ath12k_mac_change_chanctx_fill_iter()
10779 vif->link_conf[arvif->link_id]); in ath12k_mac_change_chanctx_fill_iter()
10783 ctx = rcu_access_pointer(link_conf->chanctx_conf); in ath12k_mac_change_chanctx_fill_iter()
10784 if (ctx != arg->ctx) in ath12k_mac_change_chanctx_fill_iter()
10787 if (WARN_ON(arg->next_vif == arg->n_vifs)) in ath12k_mac_change_chanctx_fill_iter()
10790 arg->vifs[arg->next_vif].vif = vif; in ath12k_mac_change_chanctx_fill_iter()
10791 arg->vifs[arg->next_vif].old_ctx = ctx; in ath12k_mac_change_chanctx_fill_iter()
10792 arg->vifs[arg->next_vif].new_ctx = ctx; in ath12k_mac_change_chanctx_fill_iter()
10793 arg->vifs[arg->next_vif].link_conf = link_conf; in ath12k_mac_change_chanctx_fill_iter()
10794 arg->next_vif++; in ath12k_mac_change_chanctx_fill_iter()
10830 if (arvif->ahvif->vdev_type != WMI_VDEV_TYPE_STA) in ath12k_mac_update_peer_puncturing_width()
10838 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_update_peer_puncturing_width()
10840 def.punctured, def.width, arvif->vdev_id); in ath12k_mac_update_peer_puncturing_width()
10842 ret = ath12k_wmi_set_peer_param(ar, arvif->bssid, in ath12k_mac_update_peer_puncturing_width()
10843 arvif->vdev_id, param_id, in ath12k_mac_update_peer_puncturing_width()
10857 struct ath12k_base *ab = ar->ab; in ath12k_mac_update_vif_chan()
10865 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_update_vif_chan()
10871 link_id = link_conf->link_id; in ath12k_mac_update_vif_chan()
10872 arvif = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy, in ath12k_mac_update_vif_chan()
10873 ahvif->link[link_id]); in ath12k_mac_update_vif_chan()
10875 if (vif->type == NL80211_IFTYPE_MONITOR) { in ath12k_mac_update_vif_chan()
10881 "mac chanctx switch vdev_id %i freq %u->%u width %d->%d\n", in ath12k_mac_update_vif_chan()
10882 arvif->vdev_id, in ath12k_mac_update_vif_chan()
10883 vifs[i].old_ctx->def.chan->center_freq, in ath12k_mac_update_vif_chan()
10884 vifs[i].new_ctx->def.chan->center_freq, in ath12k_mac_update_vif_chan()
10885 vifs[i].old_ctx->def.width, in ath12k_mac_update_vif_chan()
10886 vifs[i].new_ctx->def.width); in ath12k_mac_update_vif_chan()
10888 if (WARN_ON(!arvif->is_started)) in ath12k_mac_update_vif_chan()
10891 arvif->punct_bitmap = vifs[i].new_ctx->def.punctured; in ath12k_mac_update_vif_chan()
10894 * If vdev is down then it expect vdev_stop->vdev_start. in ath12k_mac_update_vif_chan()
10896 if (arvif->is_up) { in ath12k_mac_update_vif_chan()
10900 arvif->vdev_id, ret); in ath12k_mac_update_vif_chan()
10907 arvif->vdev_id, ret); in ath12k_mac_update_vif_chan()
10914 arvif->vdev_id, ret); in ath12k_mac_update_vif_chan()
10924 params.vdev_id = arvif->vdev_id; in ath12k_mac_update_vif_chan()
10925 params.aid = ahvif->aid; in ath12k_mac_update_vif_chan()
10926 params.bssid = arvif->bssid; in ath12k_mac_update_vif_chan()
10929 params.nontx_profile_idx = link_conf->bssid_index; in ath12k_mac_update_vif_chan()
10930 params.nontx_profile_cnt = 1 << link_conf->bssid_indicator; in ath12k_mac_update_vif_chan()
10932 ret = ath12k_wmi_vdev_up(arvif->ar, &params); in ath12k_mac_update_vif_chan()
10935 arvif->vdev_id, ret); in ath12k_mac_update_vif_chan()
10939 ret = ath12k_mac_update_peer_puncturing_width(arvif->ar, arvif, in ath12k_mac_update_vif_chan()
10940 vifs[i].new_ctx->def); in ath12k_mac_update_vif_chan()
10942 ath12k_warn(ar->ab, in ath12k_mac_update_vif_chan()
10944 vifs[i].new_ctx->def.punctured, in ath12k_mac_update_vif_chan()
10945 vifs[i].new_ctx->def.width, ret); in ath12k_mac_update_vif_chan()
10951 if (!monitor_vif && ar->monitor_vdev_created) { in ath12k_mac_update_vif_chan()
10964 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_update_active_vif_chan()
10994 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_change_chanctx()
11000 ab = ar->ab; in ath12k_mac_op_change_chanctx()
11004 ctx->def.chan->center_freq, ctx->def.width, ctx, changed); in ath12k_mac_op_change_chanctx()
11023 struct ath12k_base *ab = ar->ab; in ath12k_start_vdev_delay()
11024 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_start_vdev_delay()
11025 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); in ath12k_start_vdev_delay()
11030 if (WARN_ON(arvif->is_started)) in ath12k_start_vdev_delay()
11031 return -EBUSY; in ath12k_start_vdev_delay()
11035 ath12k_warn(ab, "failed to get link conf for vdev %u\n", arvif->vdev_id); in ath12k_start_vdev_delay()
11036 return -EINVAL; in ath12k_start_vdev_delay()
11039 chanctx = wiphy_dereference(ath12k_ar_to_hw(arvif->ar)->wiphy, in ath12k_start_vdev_delay()
11040 link_conf->chanctx_conf); in ath12k_start_vdev_delay()
11044 arvif->vdev_id, vif->addr, in ath12k_start_vdev_delay()
11045 chanctx->def.chan->center_freq, ret); in ath12k_start_vdev_delay()
11049 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { in ath12k_start_vdev_delay()
11050 ret = ath12k_monitor_vdev_up(ar, arvif->vdev_id); in ath12k_start_vdev_delay()
11057 arvif->is_started = true; in ath12k_start_vdev_delay()
11065 if (chan_def->chan->flags & IEEE80211_CHAN_PSD) { in ath12k_mac_get_num_pwr_levels()
11066 switch (chan_def->width) { in ath12k_mac_get_num_pwr_levels()
11081 switch (chan_def->width) { in ath12k_mac_get_num_pwr_levels()
11105 * with center frequency 5955, its diff is 5965 - 5955 = 10. in ath12k_mac_get_6ghz_start_frequency()
11107 * with center frequency 5955, its diff is 5985 - 5955 = 30. in ath12k_mac_get_6ghz_start_frequency()
11109 * with center frequency 5955, its diff is 6025 - 5955 = 70. in ath12k_mac_get_6ghz_start_frequency()
11111 * with center frequency 5955, its diff is 6105 - 5955 = 70. in ath12k_mac_get_6ghz_start_frequency()
11113 switch (chan_def->width) { in ath12k_mac_get_6ghz_start_frequency()
11130 return chan_def->center_freq1 - diff_seq; in ath12k_mac_get_6ghz_start_frequency()
11143 * center frequency is 5955 when bandwidth=20 MHz, its diff is 5955 - 5955 = 0. in ath12k_mac_get_seg_freq()
11145 * center frequency is 5965 when bandwidth=40 MHz, its diff is 5965 - 5955 = 10. in ath12k_mac_get_seg_freq()
11147 * center frequency is 5985 when bandwidth=80 MHz, its diff is 5985 - 5955 = 30. in ath12k_mac_get_seg_freq()
11149 * center frequency is 6025 when bandwidth=160 MHz, its diff is 6025 - 5955 = 70. in ath12k_mac_get_seg_freq()
11151 seg_seq = 10 * (BIT(seq) - 1); in ath12k_mac_get_seg_freq()
11175 *temp_chan = ieee80211_get_channel(ar->ah->hw->wiphy, *center_freq); in ath12k_mac_get_psd_channel()
11176 *tx_power = (*temp_chan)->max_reg_power; in ath12k_mac_get_psd_channel()
11206 *temp_chan = ieee80211_get_channel(ar->ah->hw->wiphy, *center_freq); in ath12k_mac_get_eirp_power()
11207 *tx_power = (*temp_chan)->max_reg_power; in ath12k_mac_get_eirp_power()
11214 struct ath12k_base *ab = ar->ab; in ath12k_mac_fill_reg_tpc_info()
11215 struct ath12k_reg_tpc_power_info *reg_tpc_info = &arvif->reg_tpc_info; in ath12k_mac_fill_reg_tpc_info()
11222 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_mac_fill_reg_tpc_info()
11226 chan = ctx->def.chan; in ath12k_mac_fill_reg_tpc_info()
11227 start_freq = ath12k_mac_get_6ghz_start_frequency(&ctx->def); in ath12k_mac_fill_reg_tpc_info()
11228 pwr_reduction = bss_conf->pwr_reduction; in ath12k_mac_fill_reg_tpc_info()
11230 if (arvif->reg_tpc_info.num_pwr_levels) { in ath12k_mac_fill_reg_tpc_info()
11232 num_pwr_levels = arvif->reg_tpc_info.num_pwr_levels; in ath12k_mac_fill_reg_tpc_info()
11234 num_pwr_levels = ath12k_mac_get_num_pwr_levels(&ctx->def); in ath12k_mac_fill_reg_tpc_info()
11241 if (chan->flags & IEEE80211_CHAN_PSD) { in ath12k_mac_fill_reg_tpc_info()
11243 if (reg_tpc_info->is_psd_power) { in ath12k_mac_fill_reg_tpc_info()
11251 psd_power = temp_chan->psd; in ath12k_mac_fill_reg_tpc_info()
11256 reg_tpc_info->tpe[pwr_lvl_idx]); in ath12k_mac_fill_reg_tpc_info()
11264 &ctx->def, in ath12k_mac_fill_reg_tpc_info()
11266 psd_power = temp_chan->psd; in ath12k_mac_fill_reg_tpc_info()
11276 reg_tpc_info->tpe[pwr_lvl_idx]); in ath12k_mac_fill_reg_tpc_info()
11281 if (reg_tpc_info->is_psd_power) { in ath12k_mac_fill_reg_tpc_info()
11291 reg_tpc_info->tpe[pwr_lvl_idx]; in ath12k_mac_fill_reg_tpc_info()
11299 &ctx->def, in ath12k_mac_fill_reg_tpc_info()
11304 reg_tpc_info->tpe[pwr_lvl_idx]); in ath12k_mac_fill_reg_tpc_info()
11310 if (chan->flags & IEEE80211_CHAN_PSD) { in ath12k_mac_fill_reg_tpc_info()
11318 psd_power = temp_chan->psd; in ath12k_mac_fill_reg_tpc_info()
11327 &ctx->def, in ath12k_mac_fill_reg_tpc_info()
11336 eirp_power = eirp_power - pwr_reduction; in ath12k_mac_fill_reg_tpc_info()
11344 eirp_power, ar->max_allowed_tx_power); in ath12k_mac_fill_reg_tpc_info()
11353 if (ar->max_allowed_tx_power && ab->hw_params->idle_ps) in ath12k_mac_fill_reg_tpc_info()
11356 ar->max_allowed_tx_power); in ath12k_mac_fill_reg_tpc_info()
11361 max_tx_power[pwr_lvl_idx] - pwr_reduction; in ath12k_mac_fill_reg_tpc_info()
11366 if (ar->max_allowed_tx_power && ab->hw_params->idle_ps) in ath12k_mac_fill_reg_tpc_info()
11370 ar->max_allowed_tx_power); in ath12k_mac_fill_reg_tpc_info()
11372 reg_tpc_info->chan_power_info[pwr_lvl_idx].chan_cfreq = center_freq; in ath12k_mac_fill_reg_tpc_info()
11373 reg_tpc_info->chan_power_info[pwr_lvl_idx].tx_power = in ath12k_mac_fill_reg_tpc_info()
11377 reg_tpc_info->num_pwr_levels = num_pwr_levels; in ath12k_mac_fill_reg_tpc_info()
11378 reg_tpc_info->is_psd_power = is_psd_power; in ath12k_mac_fill_reg_tpc_info()
11379 reg_tpc_info->eirp_power = eirp_power; in ath12k_mac_fill_reg_tpc_info()
11380 if (ahvif->vdev_type == WMI_VDEV_TYPE_STA) in ath12k_mac_fill_reg_tpc_info()
11381 reg_6ghz_power_mode = bss_conf->power_type; in ath12k_mac_fill_reg_tpc_info()
11386 reg_tpc_info->ap_power_type = in ath12k_mac_fill_reg_tpc_info()
11394 struct ath12k_reg_tpc_power_info *tpc_info = &arvif->reg_tpc_info; in ath12k_mac_parse_tx_pwr_env()
11397 struct ieee80211_parsed_tpe *tpe = &bss_conf->tpe; in ath12k_mac_parse_tx_pwr_env()
11400 struct ath12k_base *ab = ar->ab; in ath12k_mac_parse_tx_pwr_env()
11404 reg_info = ab->reg_info[ar->pdev_idx]; in ath12k_mac_parse_tx_pwr_env()
11405 client_type = reg_info->client_type; in ath12k_mac_parse_tx_pwr_env()
11407 local_psd = &tpe->psd_local[client_type]; in ath12k_mac_parse_tx_pwr_env()
11408 reg_psd = &tpe->psd_reg_client[client_type]; in ath12k_mac_parse_tx_pwr_env()
11409 local_non_psd = &tpe->max_local[client_type]; in ath12k_mac_parse_tx_pwr_env()
11410 reg_non_psd = &tpe->max_reg_client[client_type]; in ath12k_mac_parse_tx_pwr_env()
11412 psd_valid = local_psd->valid | reg_psd->valid; in ath12k_mac_parse_tx_pwr_env()
11413 non_psd_valid = local_non_psd->valid | reg_non_psd->valid; in ath12k_mac_parse_tx_pwr_env()
11423 tpc_info->is_psd_power = true; in ath12k_mac_parse_tx_pwr_env()
11425 tpc_info->num_pwr_levels = max(local_psd->count, in ath12k_mac_parse_tx_pwr_env()
11426 reg_psd->count); in ath12k_mac_parse_tx_pwr_env()
11427 tpc_info->num_pwr_levels = in ath12k_mac_parse_tx_pwr_env()
11428 min3(tpc_info->num_pwr_levels, in ath12k_mac_parse_tx_pwr_env()
11432 for (i = 0; i < tpc_info->num_pwr_levels; i++) { in ath12k_mac_parse_tx_pwr_env()
11433 tpc_info->tpe[i] = min(local_psd->power[i], in ath12k_mac_parse_tx_pwr_env()
11434 reg_psd->power[i]) / 2; in ath12k_mac_parse_tx_pwr_env()
11437 i, tpc_info->tpe[i]); in ath12k_mac_parse_tx_pwr_env()
11440 tpc_info->is_psd_power = false; in ath12k_mac_parse_tx_pwr_env()
11441 tpc_info->eirp_power = 0; in ath12k_mac_parse_tx_pwr_env()
11443 tpc_info->num_pwr_levels = max(local_non_psd->count, in ath12k_mac_parse_tx_pwr_env()
11444 reg_non_psd->count); in ath12k_mac_parse_tx_pwr_env()
11445 tpc_info->num_pwr_levels = in ath12k_mac_parse_tx_pwr_env()
11446 min3(tpc_info->num_pwr_levels, in ath12k_mac_parse_tx_pwr_env()
11450 for (i = 0; i < tpc_info->num_pwr_levels; i++) { in ath12k_mac_parse_tx_pwr_env()
11451 tpc_info->tpe[i] = min(local_non_psd->power[i], in ath12k_mac_parse_tx_pwr_env()
11452 reg_non_psd->power[i]) / 2; in ath12k_mac_parse_tx_pwr_env()
11455 i, tpc_info->tpe[i]); in ath12k_mac_parse_tx_pwr_env()
11470 u8 link_id = link_conf->link_id; in ath12k_mac_op_assign_vif_chanctx()
11474 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_assign_vif_chanctx()
11482 return -ENOMEM; in ath12k_mac_op_assign_vif_chanctx()
11488 vif->addr, link_id); in ath12k_mac_op_assign_vif_chanctx()
11489 return -EINVAL; in ath12k_mac_op_assign_vif_chanctx()
11492 ab = ar->ab; in ath12k_mac_op_assign_vif_chanctx()
11496 ctx, arvif->vdev_id); in ath12k_mac_op_assign_vif_chanctx()
11499 ctx->def.chan->band == NL80211_BAND_6GHZ && in ath12k_mac_op_assign_vif_chanctx()
11500 ahvif->vdev_type == WMI_VDEV_TYPE_STA) in ath12k_mac_op_assign_vif_chanctx()
11503 arvif->punct_bitmap = ctx->def.punctured; in ath12k_mac_op_assign_vif_chanctx()
11506 if (ab->hw_params->vdev_start_delay && in ath12k_mac_op_assign_vif_chanctx()
11507 ahvif->vdev_type != WMI_VDEV_TYPE_AP && in ath12k_mac_op_assign_vif_chanctx()
11508 ahvif->vdev_type != WMI_VDEV_TYPE_MONITOR && in ath12k_mac_op_assign_vif_chanctx()
11509 !ath12k_peer_exist_by_vdev_id(ab, arvif->vdev_id)) { in ath12k_mac_op_assign_vif_chanctx()
11514 if (WARN_ON(arvif->is_started)) { in ath12k_mac_op_assign_vif_chanctx()
11515 ret = -EBUSY; in ath12k_mac_op_assign_vif_chanctx()
11519 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { in ath12k_mac_op_assign_vif_chanctx()
11526 arvif->is_started = true; in ath12k_mac_op_assign_vif_chanctx()
11533 arvif->vdev_id, vif->addr, in ath12k_mac_op_assign_vif_chanctx()
11534 ctx->def.chan->center_freq, ret); in ath12k_mac_op_assign_vif_chanctx()
11538 arvif->is_started = true; in ath12k_mac_op_assign_vif_chanctx()
11556 u8 link_id = link_conf->link_id; in ath12k_mac_op_unassign_vif_chanctx()
11559 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_unassign_vif_chanctx()
11561 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); in ath12k_mac_op_unassign_vif_chanctx()
11570 if (!arvif || !arvif->is_created) in ath12k_mac_op_unassign_vif_chanctx()
11573 ar = arvif->ar; in ath12k_mac_op_unassign_vif_chanctx()
11574 ab = ar->ab; in ath12k_mac_op_unassign_vif_chanctx()
11578 ctx, arvif->vdev_id); in ath12k_mac_op_unassign_vif_chanctx()
11580 WARN_ON(!arvif->is_started); in ath12k_mac_op_unassign_vif_chanctx()
11582 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { in ath12k_mac_op_unassign_vif_chanctx()
11587 arvif->is_started = false; in ath12k_mac_op_unassign_vif_chanctx()
11590 if (ahvif->vdev_type != WMI_VDEV_TYPE_STA && in ath12k_mac_op_unassign_vif_chanctx()
11591 ahvif->vdev_type != WMI_VDEV_TYPE_MONITOR) { in ath12k_mac_op_unassign_vif_chanctx()
11596 arvif->vdev_id, ret); in ath12k_mac_op_unassign_vif_chanctx()
11598 arvif->is_started = false; in ath12k_mac_op_unassign_vif_chanctx()
11600 if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ab->wmi_ab.svc_map) && in ath12k_mac_op_unassign_vif_chanctx()
11601 ahvif->vdev_type == WMI_VDEV_TYPE_STA && in ath12k_mac_op_unassign_vif_chanctx()
11602 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE && in ath12k_mac_op_unassign_vif_chanctx()
11603 ar->state_11d != ATH12K_11D_PREPARING) { in ath12k_mac_op_unassign_vif_chanctx()
11604 reinit_completion(&ar->completed_11d_scan); in ath12k_mac_op_unassign_vif_chanctx()
11605 ar->state_11d = ATH12K_11D_PREPARING; in ath12k_mac_op_unassign_vif_chanctx()
11608 if (ar->scan.arvif == arvif && ar->scan.state == ATH12K_SCAN_RUNNING) { in ath12k_mac_op_unassign_vif_chanctx()
11610 ar->scan.arvif = NULL; in ath12k_mac_op_unassign_vif_chanctx()
11622 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_switch_vif_chanctx()
11624 ar = ath12k_get_ar_by_ctx(hw, vifs->old_ctx); in ath12k_mac_op_switch_vif_chanctx()
11626 return -EINVAL; in ath12k_mac_op_switch_vif_chanctx()
11629 if (ar != ath12k_get_ar_by_ctx(hw, vifs->new_ctx)) in ath12k_mac_op_switch_vif_chanctx()
11630 return -EINVAL; in ath12k_mac_op_switch_vif_chanctx()
11632 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_op_switch_vif_chanctx()
11646 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_set_vdev_param_to_all_vifs()
11648 list_for_each_entry(arvif, &ar->arvifs, list) { in ath12k_set_vdev_param_to_all_vifs()
11649 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "setting mac vdev %d param %d value %d\n", in ath12k_set_vdev_param_to_all_vifs()
11650 param, arvif->vdev_id, value); in ath12k_set_vdev_param_to_all_vifs()
11652 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_set_vdev_param_to_all_vifs()
11655 ath12k_warn(ar->ab, "failed to set param %d for vdev %d: %d\n", in ath12k_set_vdev_param_to_all_vifs()
11656 param, arvif->vdev_id, ret); in ath12k_set_vdev_param_to_all_vifs()
11671 struct wiphy *wiphy = hw->wiphy; in ath12k_mac_op_set_rts_threshold()
11676 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_set_rts_threshold()
11678 if (radio_idx >= wiphy->n_radio || radio_idx < -1) in ath12k_mac_op_set_rts_threshold()
11679 return -EINVAL; in ath12k_mac_op_set_rts_threshold()
11681 if (radio_idx != -1) { in ath12k_mac_op_set_rts_threshold()
11686 ath12k_warn(ar->ab, in ath12k_mac_op_set_rts_threshold()
11688 ar->pdev->pdev_id); in ath12k_mac_op_set_rts_threshold()
11692 ar->rts_threshold = value; in ath12k_mac_op_set_rts_threshold()
11696 /* Radio_index passed is -1, so set RTS threshold for all radios. */ in ath12k_mac_op_set_rts_threshold()
11700 ath12k_warn(ar->ab, "failed to set RTS config for all vdevs of pdev %d", in ath12k_mac_op_set_rts_threshold()
11701 ar->pdev->pdev_id); in ath12k_mac_op_set_rts_threshold()
11710 ar->rts_threshold = value; in ath12k_mac_op_set_rts_threshold()
11715 for (i = i - 1; i >= 0; i--) { in ath12k_mac_op_set_rts_threshold()
11718 ar->rts_threshold); in ath12k_mac_op_set_rts_threshold()
11720 ath12k_warn(ar->ab, in ath12k_mac_op_set_rts_threshold()
11722 ar->pdev->pdev_id); in ath12k_mac_op_set_rts_threshold()
11742 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_set_frag_threshold()
11744 return -EOPNOTSUPP; in ath12k_mac_op_set_frag_threshold()
11752 time_left = wait_event_timeout(ar->dp.tx_empty_waitq, in ath12k_mac_flush()
11753 (atomic_read(&ar->dp.num_tx_pending) == 0), in ath12k_mac_flush()
11756 ath12k_warn(ar->ab, in ath12k_mac_flush()
11758 atomic_read(&ar->dp.num_tx_pending)); in ath12k_mac_flush()
11759 ret = -ETIMEDOUT; in ath12k_mac_flush()
11762 time_left = wait_event_timeout(ar->txmgmt_empty_waitq, in ath12k_mac_flush()
11763 (atomic_read(&ar->num_pending_mgmt_tx) == 0), in ath12k_mac_flush()
11766 ath12k_warn(ar->ab, in ath12k_mac_flush()
11768 atomic_read(&ar->num_pending_mgmt_tx)); in ath12k_mac_flush()
11769 ret = -ETIMEDOUT; in ath12k_mac_flush()
11777 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_wait_tx_complete()
11794 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_flush()
11807 wiphy_work_flush(hw->wiphy, &ar->wmi_mgmt_tx_work); in ath12k_mac_op_flush()
11810 links = ahvif->links_map; in ath12k_mac_op_flush()
11812 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); in ath12k_mac_op_flush()
11813 if (!(arvif && arvif->ar)) in ath12k_mac_op_flush()
11816 ath12k_mac_flush(arvif->ar); in ath12k_mac_op_flush()
11828 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) in ath12k_mac_bitrate_mask_num_ht_rates()
11829 num_rates += hweight16(mask->control[band].ht_mcs[i]); in ath12k_mac_bitrate_mask_num_ht_rates()
11841 num_rates = hweight32(mask->control[band].legacy); in ath12k_mac_has_single_legacy_rate()
11858 if (he_cap->he_cap_elem.phy_cap_info[0] & in ath12k_mac_get_tx_mcs_map()
11860 return he_cap->he_mcs_nss_supp.tx_mcs_160; in ath12k_mac_get_tx_mcs_map()
11862 return he_cap->he_mcs_nss_supp.tx_mcs_80; in ath12k_mac_get_tx_mcs_map()
11872 struct ieee80211_supported_band *sband = &ar->mac.sbands[band]; in ath12k_mac_bitrate_mask_get_single_nss()
11873 u16 vht_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map); in ath12k_mac_bitrate_mask_get_single_nss()
11881 /* No need to consider legacy here. Basic rates are always present in ath12k_mac_bitrate_mask_get_single_nss()
11885 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) { in ath12k_mac_bitrate_mask_get_single_nss()
11886 if (mask->control[band].ht_mcs[i] == 0) in ath12k_mac_bitrate_mask_get_single_nss()
11888 else if (mask->control[band].ht_mcs[i] == in ath12k_mac_bitrate_mask_get_single_nss()
11889 sband->ht_cap.mcs.rx_mask[i]) in ath12k_mac_bitrate_mask_get_single_nss()
11895 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) { in ath12k_mac_bitrate_mask_get_single_nss()
11896 if (mask->control[band].vht_mcs[i] == 0) in ath12k_mac_bitrate_mask_get_single_nss()
11898 else if (mask->control[band].vht_mcs[i] == in ath12k_mac_bitrate_mask_get_single_nss()
11911 for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) { in ath12k_mac_bitrate_mask_get_single_nss()
11912 if (mask->control[band].he_mcs[i] == 0) in ath12k_mac_bitrate_mask_get_single_nss()
11915 if (mask->control[band].he_mcs[i] == in ath12k_mac_bitrate_mask_get_single_nss()
11928 if (BIT(fls(ht_nss_mask)) - 1 != ht_nss_mask) in ath12k_mac_bitrate_mask_get_single_nss()
11947 if (hweight32(mask->control[band].legacy) != 1) in ath12k_mac_get_single_legacy_rate()
11948 return -EINVAL; in ath12k_mac_get_single_legacy_rate()
11950 rate_idx = ffs(mask->control[band].legacy) - 1; in ath12k_mac_get_single_legacy_rate()
11972 struct ath12k *ar = arvif->ar; in ath12k_mac_set_fixed_rate_gi_ltf()
11975 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_set_fixed_rate_gi_ltf()
11981 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_set_fixed_rate_gi_ltf()
11984 ath12k_warn(ar->ab, "failed to set HE GI:%d, error:%d\n", in ath12k_mac_set_fixed_rate_gi_ltf()
11992 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_set_fixed_rate_gi_ltf()
11995 ath12k_warn(ar->ab, "failed to set HE LTF:%d, error:%d\n", in ath12k_mac_set_fixed_rate_gi_ltf()
12005 struct ath12k *ar = arvif->ar; in ath12k_mac_set_auto_rate_gi_ltf()
12021 ath12k_warn(ar->ab, "Invalid GI\n"); in ath12k_mac_set_auto_rate_gi_ltf()
12022 return -EINVAL; in ath12k_mac_set_auto_rate_gi_ltf()
12038 ath12k_warn(ar->ab, "Invalid LTF\n"); in ath12k_mac_set_auto_rate_gi_ltf()
12039 return -EINVAL; in ath12k_mac_set_auto_rate_gi_ltf()
12045 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_set_auto_rate_gi_ltf()
12049 ath12k_warn(ar->ab, in ath12k_mac_set_auto_rate_gi_ltf()
12075 struct ath12k *ar = arvif->ar; in ath12k_mac_set_rate_params()
12081 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_set_rate_params()
12085 return -EINVAL; in ath12k_mac_set_rate_params()
12087 he_support = link_conf->he_support; in ath12k_mac_set_rate_params()
12089 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_set_rate_params()
12091 arvif->vdev_id, rate, nss, sgi, ldpc); in ath12k_mac_set_rate_params()
12093 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_set_rate_params()
12099 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_set_rate_params()
12102 ath12k_warn(ar->ab, "failed to set fixed rate param 0x%02x: %d\n", in ath12k_mac_set_rate_params()
12110 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_set_rate_params()
12113 ath12k_warn(ar->ab, "failed to set nss param %d: %d\n", in ath12k_mac_set_rate_params()
12118 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_set_rate_params()
12121 ath12k_warn(ar->ab, "failed to set ldpc param %d: %d\n", in ath12k_mac_set_rate_params()
12136 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_set_rate_params()
12139 ath12k_warn(ar->ab, "failed to set sgi param %d: %d\n", in ath12k_mac_set_rate_params()
12157 vht_mcs = mask->control[band].vht_mcs[i]; in ath12k_mac_vht_mcs_range_present()
12161 case BIT(8) - 1: in ath12k_mac_vht_mcs_range_present()
12162 case BIT(9) - 1: in ath12k_mac_vht_mcs_range_present()
12163 case BIT(10) - 1: in ath12k_mac_vht_mcs_range_present()
12182 he_mcs = mask->control[band].he_mcs[i]; in ath12k_mac_he_mcs_range_present()
12186 case BIT(8) - 1: in ath12k_mac_he_mcs_range_present()
12187 case BIT(10) - 1: in ath12k_mac_he_mcs_range_present()
12188 case BIT(12) - 1: in ath12k_mac_he_mcs_range_present()
12204 struct ath12k *ar = arvif->ar; in ath12k_mac_set_bitrate_mask_iter()
12206 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_set_bitrate_mask_iter()
12208 arsta = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy, in ath12k_mac_set_bitrate_mask_iter()
12209 ahsta->link[arvif->link_id]); in ath12k_mac_set_bitrate_mask_iter()
12210 if (!arsta || arsta->arvif != arvif) in ath12k_mac_set_bitrate_mask_iter()
12213 spin_lock_bh(&ar->data_lock); in ath12k_mac_set_bitrate_mask_iter()
12214 arsta->changed |= IEEE80211_RC_SUPP_RATES_CHANGED; in ath12k_mac_set_bitrate_mask_iter()
12215 spin_unlock_bh(&ar->data_lock); in ath12k_mac_set_bitrate_mask_iter()
12217 wiphy_work_queue(ath12k_ar_to_hw(ar)->wiphy, &arsta->update_wk); in ath12k_mac_set_bitrate_mask_iter()
12226 struct ath12k *ar = arvif->ar; in ath12k_mac_disable_peer_fixed_rate()
12229 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_disable_peer_fixed_rate()
12231 arsta = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy, in ath12k_mac_disable_peer_fixed_rate()
12232 ahsta->link[arvif->link_id]); in ath12k_mac_disable_peer_fixed_rate()
12234 if (!arsta || arsta->arvif != arvif) in ath12k_mac_disable_peer_fixed_rate()
12237 ret = ath12k_wmi_set_peer_param(ar, arsta->addr, in ath12k_mac_disable_peer_fixed_rate()
12238 arvif->vdev_id, in ath12k_mac_disable_peer_fixed_rate()
12242 ath12k_warn(ar->ab, in ath12k_mac_disable_peer_fixed_rate()
12244 arsta->addr, ret); in ath12k_mac_disable_peer_fixed_rate()
12259 vht_mcs_mask = mask->control[band].vht_mcs; in ath12k_mac_validate_fixed_rate_settings()
12260 he_mcs_mask = mask->control[band].he_mcs; in ath12k_mac_validate_fixed_rate_settings()
12275 spin_lock_bh(&ar->ab->base_lock); in ath12k_mac_validate_fixed_rate_settings()
12276 list_for_each_entry_safe(peer, tmp, &ar->ab->peers, list) { in ath12k_mac_validate_fixed_rate_settings()
12277 if (peer->sta) { in ath12k_mac_validate_fixed_rate_settings()
12278 link_sta = rcu_dereference(peer->sta->link[link_id]); in ath12k_mac_validate_fixed_rate_settings()
12284 if (vht_fixed_rate && (!link_sta->vht_cap.vht_supported || in ath12k_mac_validate_fixed_rate_settings()
12285 link_sta->rx_nss < vht_nss)) { in ath12k_mac_validate_fixed_rate_settings()
12289 if (he_fixed_rate && (!link_sta->he_cap.has_he || in ath12k_mac_validate_fixed_rate_settings()
12290 link_sta->rx_nss < he_nss)) { in ath12k_mac_validate_fixed_rate_settings()
12297 spin_unlock_bh(&ar->ab->base_lock); in ath12k_mac_validate_fixed_rate_settings()
12326 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_set_bitrate_mask()
12328 arvif = &ahvif->deflink; in ath12k_mac_op_set_bitrate_mask()
12330 ar = arvif->ar; in ath12k_mac_op_set_bitrate_mask()
12331 if (ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)) { in ath12k_mac_op_set_bitrate_mask()
12332 ret = -EPERM; in ath12k_mac_op_set_bitrate_mask()
12336 band = def.chan->band; in ath12k_mac_op_set_bitrate_mask()
12337 ht_mcs_mask = mask->control[band].ht_mcs; in ath12k_mac_op_set_bitrate_mask()
12338 vht_mcs_mask = mask->control[band].vht_mcs; in ath12k_mac_op_set_bitrate_mask()
12339 he_mcs_mask = mask->control[band].he_mcs; in ath12k_mac_op_set_bitrate_mask()
12340 ldpc = !!(ar->ht_cap_info & WMI_HT_CAP_LDPC); in ath12k_mac_op_set_bitrate_mask()
12342 sgi = mask->control[band].gi; in ath12k_mac_op_set_bitrate_mask()
12344 ret = -EINVAL; in ath12k_mac_op_set_bitrate_mask()
12348 he_gi = mask->control[band].he_gi; in ath12k_mac_op_set_bitrate_mask()
12349 he_ltf = mask->control[band].he_ltf; in ath12k_mac_op_set_bitrate_mask()
12352 * requires passing at least one of used basic rates along with them. in ath12k_mac_op_set_bitrate_mask()
12355 * suitable for setting single HT/VHT rates. in ath12k_mac_op_set_bitrate_mask()
12363 ath12k_warn(ar->ab, "failed to get single legacy rate for vdev %i: %d\n", in ath12k_mac_op_set_bitrate_mask()
12364 arvif->vdev_id, ret); in ath12k_mac_op_set_bitrate_mask()
12375 arvif->bitrate_mask = *mask; in ath12k_mac_op_set_bitrate_mask()
12384 mask, arvif->link_id)) in ath12k_mac_op_set_bitrate_mask()
12385 ath12k_warn(ar->ab, in ath12k_mac_op_set_bitrate_mask()
12391 nss = min_t(u32, ar->num_tx_chains, mac_nss); in ath12k_mac_op_set_bitrate_mask()
12393 /* If multiple rates across different preambles are given in ath12k_mac_op_set_bitrate_mask()
12396 * - Single VHT Rate : peer_assoc command accommodates only MCS in ath12k_mac_op_set_bitrate_mask()
12397 * range values i.e 0-7, 0-8, 0-9 for VHT. Though mac80211 in ath12k_mac_op_set_bitrate_mask()
12398 * mandates passing basic rates along with HT/VHT rates, FW in ath12k_mac_op_set_bitrate_mask()
12400 * setting legacy and VHT rates using RATEMASK_CMD vdev cmd, in ath12k_mac_op_set_bitrate_mask()
12403 * If single VHT rate is passed along with HT rates, we select in ath12k_mac_op_set_bitrate_mask()
12405 * - Multiple VHT Rates : When Multiple VHT rates are given,this in ath12k_mac_op_set_bitrate_mask()
12406 * can be set using RATEMASK CMD which uses FW rate-ctl alg. in ath12k_mac_op_set_bitrate_mask()
12408 * RATEMASK_CMDID can cover all use cases of setting rates in ath12k_mac_op_set_bitrate_mask()
12409 * across multiple preambles and rates within same type. in ath12k_mac_op_set_bitrate_mask()
12421 ath12k_warn(ar->ab, in ath12k_mac_op_set_bitrate_mask()
12423 ret = -EINVAL; in ath12k_mac_op_set_bitrate_mask()
12433 ath12k_warn(ar->ab, in ath12k_mac_op_set_bitrate_mask()
12435 ret = -EINVAL; in ath12k_mac_op_set_bitrate_mask()
12442 arvif->bitrate_mask = *mask; in ath12k_mac_op_set_bitrate_mask()
12451 ath12k_warn(ar->ab, "failed to set rate params on vdev %i: %d\n", in ath12k_mac_op_set_bitrate_mask()
12452 arvif->vdev_id, ret); in ath12k_mac_op_set_bitrate_mask()
12470 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_reconfig_complete()
12475 guard(mutex)(&ah->hw_mutex); in ath12k_mac_op_reconfig_complete()
12477 if (ah->state != ATH12K_HW_STATE_RESTARTED) in ath12k_mac_op_reconfig_complete()
12480 ah->state = ATH12K_HW_STATE_ON; in ath12k_mac_op_reconfig_complete()
12484 ab = ar->ab; in ath12k_mac_op_reconfig_complete()
12486 ath12k_warn(ar->ab, "pdev %d successfully recovered\n", in ath12k_mac_op_reconfig_complete()
12487 ar->pdev->pdev_id); in ath12k_mac_op_reconfig_complete()
12489 if (ar->ab->hw_params->current_cc_support && in ath12k_mac_op_reconfig_complete()
12490 ar->alpha2[0] != 0 && ar->alpha2[1] != 0) { in ath12k_mac_op_reconfig_complete()
12493 memcpy(&arg.alpha2, ar->alpha2, 2); in ath12k_mac_op_reconfig_complete()
12494 reinit_completion(&ar->regd_update_completed); in ath12k_mac_op_reconfig_complete()
12498 if (ab->is_reset) { in ath12k_mac_op_reconfig_complete()
12499 recovery_count = atomic_inc_return(&ab->recovery_count); in ath12k_mac_op_reconfig_complete()
12507 if (recovery_count == ab->num_radios) { in ath12k_mac_op_reconfig_complete()
12508 atomic_dec(&ab->reset_count); in ath12k_mac_op_reconfig_complete()
12509 complete(&ab->reset_complete); in ath12k_mac_op_reconfig_complete()
12510 ab->is_reset = false; in ath12k_mac_op_reconfig_complete()
12511 atomic_set(&ab->fail_cont_count, 0); in ath12k_mac_op_reconfig_complete()
12516 list_for_each_entry(arvif, &ar->arvifs, list) { in ath12k_mac_op_reconfig_complete()
12517 ahvif = arvif->ahvif; in ath12k_mac_op_reconfig_complete()
12520 ahvif->key_cipher, in ath12k_mac_op_reconfig_complete()
12521 arvif->is_up, in ath12k_mac_op_reconfig_complete()
12522 ahvif->vdev_type); in ath12k_mac_op_reconfig_complete()
12529 if (arvif->is_up && in ath12k_mac_op_reconfig_complete()
12530 ahvif->vdev_type == WMI_VDEV_TYPE_STA && in ath12k_mac_op_reconfig_complete()
12531 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE) { in ath12k_mac_op_reconfig_complete()
12532 ieee80211_hw_restart_disconnect(ahvif->vif); in ath12k_mac_op_reconfig_complete()
12548 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_update_bss_chan_survey()
12550 if (!test_bit(WMI_TLV_SERVICE_BSS_CHANNEL_INFO_64, ar->ab->wmi_ab.svc_map) || in ath12k_mac_update_bss_chan_survey()
12551 ar->rx_channel != channel) in ath12k_mac_update_bss_chan_survey()
12554 if (ar->scan.state != ATH12K_SCAN_IDLE) { in ath12k_mac_update_bss_chan_survey()
12555 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_update_bss_chan_survey()
12560 reinit_completion(&ar->bss_survey_done); in ath12k_mac_update_bss_chan_survey()
12564 ath12k_warn(ar->ab, "failed to send pdev bss chan info request\n"); in ath12k_mac_update_bss_chan_survey()
12568 ret = wait_for_completion_timeout(&ar->bss_survey_done, 3 * HZ); in ath12k_mac_update_bss_chan_survey()
12570 ath12k_warn(ar->ab, "bss channel survey timed out\n"); in ath12k_mac_update_bss_chan_survey()
12580 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_get_survey()
12583 return -ENOENT; in ath12k_mac_op_get_survey()
12585 sband = hw->wiphy->bands[NL80211_BAND_2GHZ]; in ath12k_mac_op_get_survey()
12586 if (sband && idx >= sband->n_channels) { in ath12k_mac_op_get_survey()
12587 idx -= sband->n_channels; in ath12k_mac_op_get_survey()
12592 sband = hw->wiphy->bands[NL80211_BAND_5GHZ]; in ath12k_mac_op_get_survey()
12593 if (sband && idx >= sband->n_channels) { in ath12k_mac_op_get_survey()
12594 idx -= sband->n_channels; in ath12k_mac_op_get_survey()
12599 sband = hw->wiphy->bands[NL80211_BAND_6GHZ]; in ath12k_mac_op_get_survey()
12601 if (!sband || idx >= sband->n_channels) in ath12k_mac_op_get_survey()
12602 return -ENOENT; in ath12k_mac_op_get_survey()
12604 ar = ath12k_mac_get_ar_by_chan(hw, &sband->channels[idx]); in ath12k_mac_op_get_survey()
12606 if (sband->channels[idx].flags & IEEE80211_CHAN_DISABLED) { in ath12k_mac_op_get_survey()
12610 return -ENOENT; in ath12k_mac_op_get_survey()
12613 ar_survey = &ar->survey[idx]; in ath12k_mac_op_get_survey()
12615 ath12k_mac_update_bss_chan_survey(ar, &sband->channels[idx]); in ath12k_mac_op_get_survey()
12617 spin_lock_bh(&ar->data_lock); in ath12k_mac_op_get_survey()
12619 spin_unlock_bh(&ar->data_lock); in ath12k_mac_op_get_survey()
12621 survey->channel = &sband->channels[idx]; in ath12k_mac_op_get_survey()
12623 if (ar->rx_channel == survey->channel) in ath12k_mac_op_get_survey()
12624 survey->filled |= SURVEY_INFO_IN_USE; in ath12k_mac_op_get_survey()
12635 for (i = 0; i < ARRAY_SIZE(sinfo->chain_signal); i++) { in ath12k_mac_put_chain_rssi()
12636 sinfo->chains &= ~BIT(i); in ath12k_mac_put_chain_rssi()
12637 rssi = arsta->chain_signal[i]; in ath12k_mac_put_chain_rssi()
12643 sinfo->chain_signal[i] = rssi; in ath12k_mac_put_chain_rssi()
12644 sinfo->chains |= BIT(i); in ath12k_mac_put_chain_rssi()
12645 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL); in ath12k_mac_put_chain_rssi()
12662 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_sta_statistics()
12664 arsta = &ahsta->deflink; in ath12k_mac_op_sta_statistics()
12665 ar = ath12k_get_ar_by_vif(hw, vif, arsta->link_id); in ath12k_mac_op_sta_statistics()
12670 ar->ab->wmi_ab.svc_map); in ath12k_mac_op_sta_statistics()
12672 sinfo->rx_duration = arsta->rx_duration; in ath12k_mac_op_sta_statistics()
12673 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_DURATION); in ath12k_mac_op_sta_statistics()
12675 sinfo->tx_duration = arsta->tx_duration; in ath12k_mac_op_sta_statistics()
12676 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_DURATION); in ath12k_mac_op_sta_statistics()
12678 if (arsta->txrate.legacy || arsta->txrate.nss) { in ath12k_mac_op_sta_statistics()
12679 if (arsta->txrate.legacy) { in ath12k_mac_op_sta_statistics()
12680 sinfo->txrate.legacy = arsta->txrate.legacy; in ath12k_mac_op_sta_statistics()
12682 sinfo->txrate.mcs = arsta->txrate.mcs; in ath12k_mac_op_sta_statistics()
12683 sinfo->txrate.nss = arsta->txrate.nss; in ath12k_mac_op_sta_statistics()
12684 sinfo->txrate.bw = arsta->txrate.bw; in ath12k_mac_op_sta_statistics()
12685 sinfo->txrate.he_gi = arsta->txrate.he_gi; in ath12k_mac_op_sta_statistics()
12686 sinfo->txrate.he_dcm = arsta->txrate.he_dcm; in ath12k_mac_op_sta_statistics()
12687 sinfo->txrate.he_ru_alloc = arsta->txrate.he_ru_alloc; in ath12k_mac_op_sta_statistics()
12688 sinfo->txrate.eht_gi = arsta->txrate.eht_gi; in ath12k_mac_op_sta_statistics()
12689 sinfo->txrate.eht_ru_alloc = arsta->txrate.eht_ru_alloc; in ath12k_mac_op_sta_statistics()
12691 sinfo->txrate.flags = arsta->txrate.flags; in ath12k_mac_op_sta_statistics()
12692 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE); in ath12k_mac_op_sta_statistics()
12696 signal = arsta->rssi_comb; in ath12k_mac_op_sta_statistics()
12698 params.pdev_id = ar->pdev->pdev_id; in ath12k_mac_op_sta_statistics()
12703 ahsta->ahvif->vdev_type == WMI_VDEV_TYPE_STA && in ath12k_mac_op_sta_statistics()
12705 signal = arsta->rssi_beacon; in ath12k_mac_op_sta_statistics()
12708 if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL)) && in ath12k_mac_op_sta_statistics()
12709 ahsta->ahvif->vdev_type == WMI_VDEV_TYPE_STA && in ath12k_mac_op_sta_statistics()
12713 spin_lock_bh(&ar->data_lock); in ath12k_mac_op_sta_statistics()
12715 spin_unlock_bh(&ar->data_lock); in ath12k_mac_op_sta_statistics()
12718 sinfo->signal = db2dbm ? signal : signal + noise_floor; in ath12k_mac_op_sta_statistics()
12719 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL); in ath12k_mac_op_sta_statistics()
12722 sinfo->signal_avg = ewma_avg_rssi_read(&arsta->avg_rssi); in ath12k_mac_op_sta_statistics()
12725 sinfo->signal_avg += noise_floor; in ath12k_mac_op_sta_statistics()
12727 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG); in ath12k_mac_op_sta_statistics()
12729 sinfo->tx_retries = arsta->tx_retry_count; in ath12k_mac_op_sta_statistics()
12730 sinfo->tx_failed = arsta->tx_retry_failed; in ath12k_mac_op_sta_statistics()
12731 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_RETRIES); in ath12k_mac_op_sta_statistics()
12732 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_FAILED); in ath12k_mac_op_sta_statistics()
12740 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(link_sta->sta); in ath12k_mac_op_link_sta_statistics()
12747 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_link_sta_statistics()
12749 arsta = wiphy_dereference(hw->wiphy, ahsta->link[link_sta->link_id]); in ath12k_mac_op_link_sta_statistics()
12754 ar = ath12k_get_ar_by_vif(hw, vif, arsta->link_id); in ath12k_mac_op_link_sta_statistics()
12759 ar->ab->wmi_ab.svc_map); in ath12k_mac_op_link_sta_statistics()
12761 link_sinfo->rx_duration = arsta->rx_duration; in ath12k_mac_op_link_sta_statistics()
12762 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_DURATION); in ath12k_mac_op_link_sta_statistics()
12764 link_sinfo->tx_duration = arsta->tx_duration; in ath12k_mac_op_link_sta_statistics()
12765 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_DURATION); in ath12k_mac_op_link_sta_statistics()
12767 if (arsta->txrate.legacy || arsta->txrate.nss) { in ath12k_mac_op_link_sta_statistics()
12768 if (arsta->txrate.legacy) { in ath12k_mac_op_link_sta_statistics()
12769 link_sinfo->txrate.legacy = arsta->txrate.legacy; in ath12k_mac_op_link_sta_statistics()
12771 link_sinfo->txrate.mcs = arsta->txrate.mcs; in ath12k_mac_op_link_sta_statistics()
12772 link_sinfo->txrate.nss = arsta->txrate.nss; in ath12k_mac_op_link_sta_statistics()
12773 link_sinfo->txrate.bw = arsta->txrate.bw; in ath12k_mac_op_link_sta_statistics()
12774 link_sinfo->txrate.he_gi = arsta->txrate.he_gi; in ath12k_mac_op_link_sta_statistics()
12775 link_sinfo->txrate.he_dcm = arsta->txrate.he_dcm; in ath12k_mac_op_link_sta_statistics()
12776 link_sinfo->txrate.he_ru_alloc = in ath12k_mac_op_link_sta_statistics()
12777 arsta->txrate.he_ru_alloc; in ath12k_mac_op_link_sta_statistics()
12778 link_sinfo->txrate.eht_gi = arsta->txrate.eht_gi; in ath12k_mac_op_link_sta_statistics()
12779 link_sinfo->txrate.eht_ru_alloc = in ath12k_mac_op_link_sta_statistics()
12780 arsta->txrate.eht_ru_alloc; in ath12k_mac_op_link_sta_statistics()
12782 link_sinfo->txrate.flags = arsta->txrate.flags; in ath12k_mac_op_link_sta_statistics()
12783 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE); in ath12k_mac_op_link_sta_statistics()
12787 signal = arsta->rssi_comb; in ath12k_mac_op_link_sta_statistics()
12789 params.pdev_id = ar->pdev->pdev_id; in ath12k_mac_op_link_sta_statistics()
12794 ahsta->ahvif->vdev_type == WMI_VDEV_TYPE_STA && in ath12k_mac_op_link_sta_statistics()
12796 signal = arsta->rssi_beacon; in ath12k_mac_op_link_sta_statistics()
12799 link_sinfo->signal = in ath12k_mac_op_link_sta_statistics()
12801 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL); in ath12k_mac_op_link_sta_statistics()
12804 link_sinfo->signal_avg = ewma_avg_rssi_read(&arsta->avg_rssi); in ath12k_mac_op_link_sta_statistics()
12807 link_sinfo->signal_avg += ATH12K_DEFAULT_NOISE_FLOOR; in ath12k_mac_op_link_sta_statistics()
12809 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG); in ath12k_mac_op_link_sta_statistics()
12811 link_sinfo->tx_retries = arsta->tx_retry_count; in ath12k_mac_op_link_sta_statistics()
12812 link_sinfo->tx_failed = arsta->tx_retry_failed; in ath12k_mac_op_link_sta_statistics()
12813 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_RETRIES); in ath12k_mac_op_link_sta_statistics()
12814 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_FAILED); in ath12k_mac_op_link_sta_statistics()
12825 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_cancel_remain_on_channel()
12827 spin_lock_bh(&ar->data_lock); in ath12k_mac_op_cancel_remain_on_channel()
12828 ar->scan.roc_notify = false; in ath12k_mac_op_cancel_remain_on_channel()
12829 spin_unlock_bh(&ar->data_lock); in ath12k_mac_op_cancel_remain_on_channel()
12833 cancel_delayed_work_sync(&ar->scan.timeout); in ath12k_mac_op_cancel_remain_on_channel()
12834 wiphy_work_cancel(hw->wiphy, &ar->scan.vdev_clean_wk); in ath12k_mac_op_cancel_remain_on_channel()
12854 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_remain_on_channel()
12856 ar = ath12k_mac_select_scan_device(hw, vif, chan->center_freq); in ath12k_mac_op_remain_on_channel()
12858 return -EINVAL; in ath12k_mac_op_remain_on_channel()
12873 * delete-create vdev's for the same ar, in case the request is in ath12k_mac_op_remain_on_channel()
12876 if (arvif->is_created) { in ath12k_mac_op_remain_on_channel()
12877 if (WARN_ON(!arvif->ar)) in ath12k_mac_op_remain_on_channel()
12878 return -EINVAL; in ath12k_mac_op_remain_on_channel()
12880 if (ar != arvif->ar && arvif->is_started) in ath12k_mac_op_remain_on_channel()
12881 return -EBUSY; in ath12k_mac_op_remain_on_channel()
12883 if (ar != arvif->ar) { in ath12k_mac_op_remain_on_channel()
12896 ath12k_warn(ar->ab, "unable to create scan vdev for roc: %d\n", in ath12k_mac_op_remain_on_channel()
12902 spin_lock_bh(&ar->data_lock); in ath12k_mac_op_remain_on_channel()
12904 switch (ar->scan.state) { in ath12k_mac_op_remain_on_channel()
12906 reinit_completion(&ar->scan.started); in ath12k_mac_op_remain_on_channel()
12907 reinit_completion(&ar->scan.completed); in ath12k_mac_op_remain_on_channel()
12908 reinit_completion(&ar->scan.on_channel); in ath12k_mac_op_remain_on_channel()
12909 ar->scan.state = ATH12K_SCAN_STARTING; in ath12k_mac_op_remain_on_channel()
12910 ar->scan.is_roc = true; in ath12k_mac_op_remain_on_channel()
12911 ar->scan.arvif = arvif; in ath12k_mac_op_remain_on_channel()
12912 ar->scan.roc_freq = chan->center_freq; in ath12k_mac_op_remain_on_channel()
12913 ar->scan.roc_notify = true; in ath12k_mac_op_remain_on_channel()
12919 ret = -EBUSY; in ath12k_mac_op_remain_on_channel()
12923 spin_unlock_bh(&ar->data_lock); in ath12k_mac_op_remain_on_channel()
12928 scan_time_msec = hw->wiphy->max_remain_on_channel_duration * 2; in ath12k_mac_op_remain_on_channel()
12933 return -ENOMEM; in ath12k_mac_op_remain_on_channel()
12936 arg->num_chan = 1; in ath12k_mac_op_remain_on_channel()
12938 u32 *chan_list __free(kfree) = kcalloc(arg->num_chan, sizeof(*chan_list), in ath12k_mac_op_remain_on_channel()
12941 return -ENOMEM; in ath12k_mac_op_remain_on_channel()
12943 arg->chan_list = chan_list; in ath12k_mac_op_remain_on_channel()
12944 arg->vdev_id = arvif->vdev_id; in ath12k_mac_op_remain_on_channel()
12945 arg->scan_id = ATH12K_SCAN_ID; in ath12k_mac_op_remain_on_channel()
12946 arg->chan_list[0] = chan->center_freq; in ath12k_mac_op_remain_on_channel()
12947 arg->dwell_time_active = scan_time_msec; in ath12k_mac_op_remain_on_channel()
12948 arg->dwell_time_passive = scan_time_msec; in ath12k_mac_op_remain_on_channel()
12949 arg->max_scan_time = scan_time_msec; in ath12k_mac_op_remain_on_channel()
12950 arg->scan_f_passive = 1; in ath12k_mac_op_remain_on_channel()
12951 arg->burst_duration = duration; in ath12k_mac_op_remain_on_channel()
12955 ath12k_warn(ar->ab, "failed to start roc scan: %d\n", ret); in ath12k_mac_op_remain_on_channel()
12957 spin_lock_bh(&ar->data_lock); in ath12k_mac_op_remain_on_channel()
12958 ar->scan.state = ATH12K_SCAN_IDLE; in ath12k_mac_op_remain_on_channel()
12959 spin_unlock_bh(&ar->data_lock); in ath12k_mac_op_remain_on_channel()
12963 ret = wait_for_completion_timeout(&ar->scan.on_channel, 3 * HZ); in ath12k_mac_op_remain_on_channel()
12965 ath12k_warn(ar->ab, "failed to switch to channel for roc scan\n"); in ath12k_mac_op_remain_on_channel()
12968 ath12k_warn(ar->ab, "failed to stop scan: %d\n", ret); in ath12k_mac_op_remain_on_channel()
12969 return -ETIMEDOUT; in ath12k_mac_op_remain_on_channel()
12972 ieee80211_queue_delayed_work(hw, &ar->scan.timeout, in ath12k_mac_op_remain_on_channel()
12988 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_set_rekey_data()
12990 arvif = &ahvif->deflink; in ath12k_mac_op_set_rekey_data()
12991 rekey_data = &arvif->rekey_data; in ath12k_mac_op_set_rekey_data()
12993 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac set rekey data vdev %d\n", in ath12k_mac_op_set_rekey_data()
12994 arvif->vdev_id); in ath12k_mac_op_set_rekey_data()
12996 memcpy(rekey_data->kck, data->kck, NL80211_KCK_LEN); in ath12k_mac_op_set_rekey_data()
12997 memcpy(rekey_data->kek, data->kek, NL80211_KEK_LEN); in ath12k_mac_op_set_rekey_data()
12999 /* The supplicant works on big-endian, the firmware expects it on in ath12k_mac_op_set_rekey_data()
13002 rekey_data->replay_ctr = get_unaligned_be64(data->replay_ctr); in ath12k_mac_op_set_rekey_data()
13004 arvif->rekey_data.enable_offload = true; in ath12k_mac_op_set_rekey_data()
13006 ath12k_dbg_dump(ar->ab, ATH12K_DBG_MAC, "kck", NULL, in ath12k_mac_op_set_rekey_data()
13007 rekey_data->kck, NL80211_KCK_LEN); in ath12k_mac_op_set_rekey_data()
13008 ath12k_dbg_dump(ar->ab, ATH12K_DBG_MAC, "kek", NULL, in ath12k_mac_op_set_rekey_data()
13009 rekey_data->kck, NL80211_KEK_LEN); in ath12k_mac_op_set_rekey_data()
13010 ath12k_dbg_dump(ar->ab, ATH12K_DBG_MAC, "replay ctr", NULL, in ath12k_mac_op_set_rekey_data()
13011 &rekey_data->replay_ctr, sizeof(rekey_data->replay_ctr)); in ath12k_mac_op_set_rekey_data()
13077 if (ar->freq_range.start_freq || ar->freq_range.end_freq) { in ath12k_mac_update_freq_range()
13078 ar->freq_range.start_freq = min(ar->freq_range.start_freq, in ath12k_mac_update_freq_range()
13080 ar->freq_range.end_freq = max(ar->freq_range.end_freq, in ath12k_mac_update_freq_range()
13083 ar->freq_range.start_freq = MHZ_TO_KHZ(freq_low); in ath12k_mac_update_freq_range()
13084 ar->freq_range.end_freq = MHZ_TO_KHZ(freq_high); in ath12k_mac_update_freq_range()
13087 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_update_freq_range()
13088 "mac pdev %u freq limit updated. New range %u->%u MHz\n", in ath12k_mac_update_freq_range()
13089 ar->pdev->pdev_id, KHZ_TO_MHZ(ar->freq_range.start_freq), in ath12k_mac_update_freq_range()
13090 KHZ_TO_MHZ(ar->freq_range.end_freq)); in ath12k_mac_update_freq_range()
13102 for (i = 0; i < band->n_channels; i++) { in ath12k_mac_update_ch_list()
13103 if (band->channels[i].center_freq < freq_low || in ath12k_mac_update_ch_list()
13104 band->channels[i].center_freq > freq_high) in ath12k_mac_update_ch_list()
13105 band->channels[i].flags |= IEEE80211_CHAN_DISABLED; in ath12k_mac_update_ch_list()
13111 struct ath12k_pdev *pdev = ar->pdev; in ath12k_get_phy_id()
13112 struct ath12k_pdev_cap *pdev_cap = &pdev->cap; in ath12k_get_phy_id()
13115 return pdev_cap->band[NL80211_BAND_2GHZ].phy_id; in ath12k_get_phy_id()
13118 return pdev_cap->band[NL80211_BAND_5GHZ].phy_id; in ath12k_get_phy_id()
13120 ath12k_warn(ar->ab, "unsupported phy cap:%d\n", band); in ath12k_get_phy_id()
13132 return -EINVAL; in ath12k_mac_update_band()
13134 if (orig_band->band != new_band->band) in ath12k_mac_update_band()
13135 return -EINVAL; in ath12k_mac_update_band()
13137 for (i = 0; i < new_band->n_channels; i++) { in ath12k_mac_update_band()
13138 if (new_band->channels[i].flags & IEEE80211_CHAN_DISABLED) in ath12k_mac_update_band()
13143 if (WARN_ON(!(orig_band->channels[i].flags & in ath12k_mac_update_band()
13145 return -EINVAL; in ath12k_mac_update_band()
13146 orig_band->channels[i].flags &= ~IEEE80211_CHAN_DISABLED; in ath12k_mac_update_band()
13157 struct ath12k_base *ab = ar->ab; in ath12k_mac_setup_channels_rates()
13159 struct ath12k_hw *ah = ar->ah; in ath12k_mac_setup_channels_rates()
13168 reg_cap = &ab->hal_reg_cap[ar->pdev_idx]; in ath12k_mac_setup_channels_rates()
13175 return -ENOMEM; in ath12k_mac_setup_channels_rates()
13177 band = &ar->mac.sbands[NL80211_BAND_2GHZ]; in ath12k_mac_setup_channels_rates()
13178 band->band = NL80211_BAND_2GHZ; in ath12k_mac_setup_channels_rates()
13179 band->n_channels = ARRAY_SIZE(ath12k_2ghz_channels); in ath12k_mac_setup_channels_rates()
13180 band->channels = channels; in ath12k_mac_setup_channels_rates()
13181 band->n_bitrates = ath12k_g_rates_size; in ath12k_mac_setup_channels_rates()
13182 band->bitrates = ath12k_g_rates; in ath12k_mac_setup_channels_rates()
13184 if (ab->hw_params->single_pdev_only) { in ath12k_mac_setup_channels_rates()
13186 reg_cap = &ab->hal_reg_cap[phy_id]; in ath12k_mac_setup_channels_rates()
13189 freq_low = max(reg_cap->low_2ghz_chan, in ath12k_mac_setup_channels_rates()
13190 ab->reg_freq_2ghz.start_freq); in ath12k_mac_setup_channels_rates()
13191 freq_high = min(reg_cap->high_2ghz_chan, in ath12k_mac_setup_channels_rates()
13192 ab->reg_freq_2ghz.end_freq); in ath12k_mac_setup_channels_rates()
13195 reg_cap->low_2ghz_chan, in ath12k_mac_setup_channels_rates()
13196 reg_cap->high_2ghz_chan); in ath12k_mac_setup_channels_rates()
13207 band->channels = NULL; in ath12k_mac_setup_channels_rates()
13210 …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()
13211 ar->pdev->pdev_id, in ath12k_mac_setup_channels_rates()
13212 KHZ_TO_MHZ(ar->freq_range.start_freq), in ath12k_mac_setup_channels_rates()
13213 KHZ_TO_MHZ(ar->freq_range.end_freq)); in ath12k_mac_setup_channels_rates()
13218 if (reg_cap->high_5ghz_chan >= ATH12K_MIN_6GHZ_FREQ) { in ath12k_mac_setup_channels_rates()
13222 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); in ath12k_mac_setup_channels_rates()
13223 return -ENOMEM; in ath12k_mac_setup_channels_rates()
13226 ar->supports_6ghz = true; in ath12k_mac_setup_channels_rates()
13227 band = &ar->mac.sbands[NL80211_BAND_6GHZ]; in ath12k_mac_setup_channels_rates()
13228 band->band = NL80211_BAND_6GHZ; in ath12k_mac_setup_channels_rates()
13229 band->n_channels = ARRAY_SIZE(ath12k_6ghz_channels); in ath12k_mac_setup_channels_rates()
13230 band->channels = channels; in ath12k_mac_setup_channels_rates()
13231 band->n_bitrates = ath12k_a_rates_size; in ath12k_mac_setup_channels_rates()
13232 band->bitrates = ath12k_a_rates; in ath12k_mac_setup_channels_rates()
13234 freq_low = max(reg_cap->low_5ghz_chan, in ath12k_mac_setup_channels_rates()
13235 ab->reg_freq_6ghz.start_freq); in ath12k_mac_setup_channels_rates()
13236 freq_high = min(reg_cap->high_5ghz_chan, in ath12k_mac_setup_channels_rates()
13237 ab->reg_freq_6ghz.end_freq); in ath12k_mac_setup_channels_rates()
13240 reg_cap->low_5ghz_chan, in ath12k_mac_setup_channels_rates()
13241 reg_cap->high_5ghz_chan); in ath12k_mac_setup_channels_rates()
13244 ah->use_6ghz_regd = true; in ath12k_mac_setup_channels_rates()
13254 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); in ath12k_mac_setup_channels_rates()
13255 ar->mac.sbands[NL80211_BAND_2GHZ].channels = NULL; in ath12k_mac_setup_channels_rates()
13257 band->channels = NULL; in ath12k_mac_setup_channels_rates()
13260 …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()
13261 ar->pdev->pdev_id, in ath12k_mac_setup_channels_rates()
13262 KHZ_TO_MHZ(ar->freq_range.start_freq), in ath12k_mac_setup_channels_rates()
13263 KHZ_TO_MHZ(ar->freq_range.end_freq)); in ath12k_mac_setup_channels_rates()
13267 if (reg_cap->low_5ghz_chan < ATH12K_MIN_6GHZ_FREQ) { in ath12k_mac_setup_channels_rates()
13272 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); in ath12k_mac_setup_channels_rates()
13273 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels); in ath12k_mac_setup_channels_rates()
13274 return -ENOMEM; in ath12k_mac_setup_channels_rates()
13277 band = &ar->mac.sbands[NL80211_BAND_5GHZ]; in ath12k_mac_setup_channels_rates()
13278 band->band = NL80211_BAND_5GHZ; in ath12k_mac_setup_channels_rates()
13279 band->n_channels = ARRAY_SIZE(ath12k_5ghz_channels); in ath12k_mac_setup_channels_rates()
13280 band->channels = channels; in ath12k_mac_setup_channels_rates()
13281 band->n_bitrates = ath12k_a_rates_size; in ath12k_mac_setup_channels_rates()
13282 band->bitrates = ath12k_a_rates; in ath12k_mac_setup_channels_rates()
13284 if (ab->hw_params->single_pdev_only) { in ath12k_mac_setup_channels_rates()
13286 reg_cap = &ab->hal_reg_cap[phy_id]; in ath12k_mac_setup_channels_rates()
13289 freq_low = max(reg_cap->low_5ghz_chan, in ath12k_mac_setup_channels_rates()
13290 ab->reg_freq_5ghz.start_freq); in ath12k_mac_setup_channels_rates()
13291 freq_high = min(reg_cap->high_5ghz_chan, in ath12k_mac_setup_channels_rates()
13292 ab->reg_freq_5ghz.end_freq); in ath12k_mac_setup_channels_rates()
13295 reg_cap->low_5ghz_chan, in ath12k_mac_setup_channels_rates()
13296 reg_cap->high_5ghz_chan); in ath12k_mac_setup_channels_rates()
13308 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); in ath12k_mac_setup_channels_rates()
13309 ar->mac.sbands[NL80211_BAND_2GHZ].channels = NULL; in ath12k_mac_setup_channels_rates()
13310 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels); in ath12k_mac_setup_channels_rates()
13311 ar->mac.sbands[NL80211_BAND_2GHZ].channels = NULL; in ath12k_mac_setup_channels_rates()
13313 band->channels = NULL; in ath12k_mac_setup_channels_rates()
13316 …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()
13317 ar->pdev->pdev_id, in ath12k_mac_setup_channels_rates()
13318 KHZ_TO_MHZ(ar->freq_range.start_freq), in ath12k_mac_setup_channels_rates()
13319 KHZ_TO_MHZ(ar->freq_range.end_freq)); in ath12k_mac_setup_channels_rates()
13334 interface_modes &= ar->ab->hw_params->interface_modes; in ath12k_mac_get_ifmodes()
13355 interface_modes = ar->ab->hw_params->interface_modes; in ath12k_mac_is_iface_mode_enable()
13369 u16 interface_modes = ar->ab->hw_params->interface_modes; in ath12k_mac_setup_radio_iface_comb()
13396 return -ENOMEM; in ath12k_mac_setup_radio_iface_comb()
13460 return -ENOMEM; in ath12k_mac_setup_global_iface_comb()
13464 for (j = 0; j < iter_comb->n_limits && j < n_limits; j++) { in ath12k_mac_setup_global_iface_comb()
13465 limits[j].types |= iter_comb->limits[j].types; in ath12k_mac_setup_global_iface_comb()
13466 limits[j].max += iter_comb->limits[j].max; in ath12k_mac_setup_global_iface_comb()
13469 comb->max_interfaces += iter_comb->max_interfaces; in ath12k_mac_setup_global_iface_comb()
13470 comb->num_different_channels += iter_comb->num_different_channels; in ath12k_mac_setup_global_iface_comb()
13471 comb->radar_detect_widths |= iter_comb->radar_detect_widths; in ath12k_mac_setup_global_iface_comb()
13474 comb->limits = limits; in ath12k_mac_setup_global_iface_comb()
13475 comb->n_limits = n_limits; in ath12k_mac_setup_global_iface_comb()
13476 comb->beacon_int_infra_match = true; in ath12k_mac_setup_global_iface_comb()
13477 comb->beacon_int_min_gcd = 100; in ath12k_mac_setup_global_iface_comb()
13491 struct wiphy *wiphy = ah->hw->wiphy; in ath12k_mac_cleanup_iface_combinations()
13495 if (wiphy->n_radio > 0) { in ath12k_mac_cleanup_iface_combinations()
13496 radio = wiphy->radio; in ath12k_mac_cleanup_iface_combinations()
13497 for (i = 0; i < wiphy->n_radio; i++) in ath12k_mac_cleanup_iface_combinations()
13500 kfree(wiphy->radio); in ath12k_mac_cleanup_iface_combinations()
13503 ath12k_mac_cleanup_iface_comb(wiphy->iface_combinations); in ath12k_mac_cleanup_iface_combinations()
13509 struct wiphy *wiphy = ah->hw->wiphy; in ath12k_mac_setup_iface_combinations()
13515 if (ah->num_radio == 1) { in ath12k_mac_setup_iface_combinations()
13516 ar = &ah->radio[0]; in ath12k_mac_setup_iface_combinations()
13518 if (ar->ab->hw_params->single_pdev_only) in ath12k_mac_setup_iface_combinations()
13524 return -ENOMEM; in ath12k_mac_setup_iface_combinations()
13533 if (ar->ab->hw_params->single_pdev_only) { in ath12k_mac_setup_iface_combinations()
13536 comb->num_different_channels = 2; in ath12k_mac_setup_iface_combinations()
13537 comb->radar_detect_widths = 0; in ath12k_mac_setup_iface_combinations()
13545 return -ENOMEM; in ath12k_mac_setup_iface_combinations()
13549 radio = kcalloc(ah->num_radio, sizeof(*radio), GFP_KERNEL); in ath12k_mac_setup_iface_combinations()
13551 ret = -ENOMEM; in ath12k_mac_setup_iface_combinations()
13558 ret = -ENOMEM; in ath12k_mac_setup_iface_combinations()
13570 radio[i].freq_range = &ar->freq_range; in ath12k_mac_setup_iface_combinations()
13577 ret = ath12k_mac_setup_global_iface_comb(ah, radio, ah->num_radio, combinations); in ath12k_mac_setup_iface_combinations()
13584 wiphy->radio = radio; in ath12k_mac_setup_iface_combinations()
13585 wiphy->n_radio = ah->num_radio; in ath12k_mac_setup_iface_combinations()
13588 wiphy->iface_combinations = combinations; in ath12k_mac_setup_iface_combinations()
13589 wiphy->n_iface_combinations = n_combinations; in ath12k_mac_setup_iface_combinations()
13594 i = ah->num_radio; in ath12k_mac_setup_iface_combinations()
13597 while (i--) in ath12k_mac_setup_iface_combinations()
13653 idr_for_each(&ar->txmgmt_idr, ath12k_mac_tx_mgmt_pending_free, ar); in ath12k_mac_cleanup_unregister()
13654 idr_destroy(&ar->txmgmt_idr); in ath12k_mac_cleanup_unregister()
13656 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); in ath12k_mac_cleanup_unregister()
13657 kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels); in ath12k_mac_cleanup_unregister()
13658 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels); in ath12k_mac_cleanup_unregister()
13663 struct ieee80211_hw *hw = ah->hw; in ath12k_mac_hw_unregister()
13668 cancel_work_sync(&ar->regd_channel_update_work); in ath12k_mac_hw_unregister()
13669 cancel_work_sync(&ar->regd_update_work); in ath12k_mac_hw_unregister()
13688 struct ath12k_pdev_cap *cap = &ar->pdev->cap; in ath12k_mac_setup_register()
13691 init_waitqueue_head(&ar->txmgmt_empty_waitq); in ath12k_mac_setup_register()
13692 idr_init(&ar->txmgmt_idr); in ath12k_mac_setup_register()
13693 spin_lock_init(&ar->txmgmt_idr_lock); in ath12k_mac_setup_register()
13698 cap->supported_bands, in ath12k_mac_setup_register()
13706 ar->max_num_stations = ath12k_core_get_max_station_per_radio(ar->ab); in ath12k_mac_setup_register()
13707 ar->max_num_peers = ath12k_core_get_max_peers_per_radio(ar->ab); in ath12k_mac_setup_register()
13709 ar->rssi_info.min_nf_dbm = ATH12K_DEFAULT_NOISE_FLOOR; in ath12k_mac_setup_register()
13710 ar->rssi_info.temp_offset = 0; in ath12k_mac_setup_register()
13711 ar->rssi_info.noise_floor = ar->rssi_info.min_nf_dbm + ar->rssi_info.temp_offset; in ath12k_mac_setup_register()
13718 struct ieee80211_hw *hw = ah->hw; in ath12k_mac_hw_register()
13719 struct wiphy *wiphy = hw->wiphy; in ath12k_mac_hw_register()
13721 struct ath12k_base *ab = ar->ab; in ath12k_mac_hw_register()
13741 wiphy->max_ap_assoc_sta = 0; in ath12k_mac_hw_register()
13746 pdev = ar->pdev; in ath12k_mac_hw_register()
13747 if (ar->ab->pdevs_macaddr_valid) { in ath12k_mac_hw_register()
13748 ether_addr_copy(ar->mac_addr, pdev->mac_addr); in ath12k_mac_hw_register()
13750 ether_addr_copy(ar->mac_addr, ar->ab->mac_addr); in ath12k_mac_hw_register()
13751 ar->mac_addr[4] += ar->pdev_idx; in ath12k_mac_hw_register()
13754 ret = ath12k_mac_setup_register(ar, &ht_cap_info, hw->wiphy->bands); in ath12k_mac_hw_register()
13759 if (!ar->supports_6ghz) in ath12k_mac_hw_register()
13762 wiphy->max_ap_assoc_sta += ar->max_num_stations; in ath12k_mac_hw_register()
13768 cap = &pdev->cap; in ath12k_mac_hw_register()
13770 antennas_rx = max_t(u32, antennas_rx, cap->rx_chain_mask); in ath12k_mac_hw_register()
13771 antennas_tx = max_t(u32, antennas_tx, cap->tx_chain_mask); in ath12k_mac_hw_register()
13773 if (ar->supports_6ghz) in ath12k_mac_hw_register()
13776 if (test_bit(ATH12K_FLAG_RAW_MODE, &ar->ab->dev_flags)) in ath12k_mac_hw_register()
13779 if (!ar->ab->hw_params->supports_monitor) in ath12k_mac_hw_register()
13783 mac_addr = ar->mac_addr; in ath12k_mac_hw_register()
13785 mac_addr = ab->mac_addr; in ath12k_mac_hw_register()
13787 mbssid_max_interfaces += TARGET_NUM_VDEVS(ar->ab); in ath12k_mac_hw_register()
13790 wiphy->available_antennas_rx = antennas_rx; in ath12k_mac_hw_register()
13791 wiphy->available_antennas_tx = antennas_tx; in ath12k_mac_hw_register()
13794 SET_IEEE80211_DEV(hw, ab->dev); in ath12k_mac_hw_register()
13802 wiphy->interface_modes = ath12k_mac_get_ifmodes(ah); in ath12k_mac_hw_register()
13804 if (ah->num_radio == 1 && in ath12k_mac_hw_register()
13805 wiphy->bands[NL80211_BAND_2GHZ] && in ath12k_mac_hw_register()
13806 wiphy->bands[NL80211_BAND_5GHZ] && in ath12k_mac_hw_register()
13807 wiphy->bands[NL80211_BAND_6GHZ]) in ath12k_mac_hw_register()
13826 if (test_bit(WMI_TLV_SERVICE_ETH_OFFLOAD, ar->wmi->wmi_ab->svc_map)) { in ath12k_mac_hw_register()
13831 if (cap->nss_ratio_enabled) in ath12k_mac_hw_register()
13842 wiphy->features |= NL80211_FEATURE_STATIC_SMPS; in ath12k_mac_hw_register()
13843 wiphy->flags |= WIPHY_FLAG_IBSS_RSN; in ath12k_mac_hw_register()
13850 (is_6ghz && ab->hw_params->supports_dynamic_smps_6ghz)) in ath12k_mac_hw_register()
13851 wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS; in ath12k_mac_hw_register()
13853 wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID; in ath12k_mac_hw_register()
13854 wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN; in ath12k_mac_hw_register()
13856 hw->max_listen_interval = ATH12K_MAX_HW_LISTEN_INTERVAL; in ath12k_mac_hw_register()
13858 wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL; in ath12k_mac_hw_register()
13859 wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH; in ath12k_mac_hw_register()
13860 wiphy->max_remain_on_channel_duration = 5000; in ath12k_mac_hw_register()
13862 wiphy->flags |= WIPHY_FLAG_AP_UAPSD; in ath12k_mac_hw_register()
13863 wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE | in ath12k_mac_hw_register()
13866 wiphy->features |= NL80211_FEATURE_TX_POWER_INSERTION; in ath12k_mac_hw_register()
13872 wiphy->flags |= WIPHY_FLAG_DISABLE_WEXT; in ath12k_mac_hw_register()
13877 if (ab->ag->mlo_capable) { in ath12k_mac_hw_register()
13878 ath12k_iftypes_ext_capa[2].eml_capabilities = cap->eml_cap; in ath12k_mac_hw_register()
13879 ath12k_iftypes_ext_capa[2].mld_capa_and_ops = cap->mld_cap; in ath12k_mac_hw_register()
13880 wiphy->flags |= WIPHY_FLAG_SUPPORTS_MLO; in ath12k_mac_hw_register()
13885 hw->queues = ATH12K_HW_MAX_QUEUES; in ath12k_mac_hw_register()
13886 wiphy->tx_queue_len = ATH12K_QUEUE_LEN; in ath12k_mac_hw_register()
13887 hw->offchannel_tx_hw_queue = ATH12K_HW_MAX_QUEUES - 1; in ath12k_mac_hw_register()
13888 hw->max_rx_aggregation_subframes = IEEE80211_MAX_AMPDU_BUF_EHT; in ath12k_mac_hw_register()
13890 hw->vif_data_size = sizeof(struct ath12k_vif); in ath12k_mac_hw_register()
13891 hw->sta_data_size = sizeof(struct ath12k_sta); in ath12k_mac_hw_register()
13892 hw->extra_tx_headroom = ab->hw_params->iova_mask; in ath12k_mac_hw_register()
13898 wiphy->cipher_suites = cipher_suites; in ath12k_mac_hw_register()
13899 wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites); in ath12k_mac_hw_register()
13901 wiphy->iftype_ext_capab = ath12k_iftypes_ext_capa; in ath12k_mac_hw_register()
13902 wiphy->num_iftype_ext_capab = ARRAY_SIZE(ath12k_iftypes_ext_capa); in ath12k_mac_hw_register()
13904 wiphy->mbssid_max_interfaces = mbssid_max_interfaces; in ath12k_mac_hw_register()
13905 wiphy->ema_max_profile_periodicity = TARGET_EMA_MAX_PROFILE_PERIOD; in ath12k_mac_hw_register()
13916 if (test_bit(WMI_TLV_SERVICE_BEACON_PROTECTION_SUPPORT, ab->wmi_ab.svc_map)) in ath12k_mac_hw_register()
13917 wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_BEACON_PROTECTION); in ath12k_mac_hw_register()
13922 hw->netdev_features = NETIF_F_HW_CSUM; in ath12k_mac_hw_register()
13927 if (test_bit(WMI_TLV_SERVICE_NLO, ar->wmi->wmi_ab->svc_map)) { in ath12k_mac_hw_register()
13928 wiphy->max_sched_scan_ssids = WMI_PNO_MAX_SUPP_NETWORKS; in ath12k_mac_hw_register()
13929 wiphy->max_match_sets = WMI_PNO_MAX_SUPP_NETWORKS; in ath12k_mac_hw_register()
13930 wiphy->max_sched_scan_ie_len = WMI_PNO_MAX_IE_LENGTH; in ath12k_mac_hw_register()
13931 wiphy->max_sched_scan_plans = WMI_PNO_MAX_SCHED_SCAN_PLANS; in ath12k_mac_hw_register()
13932 wiphy->max_sched_scan_plan_interval = in ath12k_mac_hw_register()
13934 wiphy->max_sched_scan_plan_iterations = in ath12k_mac_hw_register()
13936 wiphy->features |= NL80211_FEATURE_ND_RANDOM_MAC_ADDR; in ath12k_mac_hw_register()
13941 ath12k_warn(ar->ab, "failed to init wow: %d\n", ret); in ath12k_mac_hw_register()
13945 /* Boot-time regulatory updates have already been processed. in ath12k_mac_hw_register()
13949 * important to mark the boot-time updates as complete before in ath12k_mac_hw_register()
13953 complete_all(&ar->regd_update_completed); in ath12k_mac_hw_register()
13967 wiphy->interface_modes &= ~BIT(NL80211_IFTYPE_MONITOR); in ath12k_mac_hw_register()
13973 ath12k_err(ar->ab, "ath12k regd update failed: %d\n", ret); in ath12k_mac_hw_register()
13977 if (ar->ab->hw_params->current_cc_support && ab->new_alpha2[0]) { in ath12k_mac_hw_register()
13980 memcpy(&current_cc.alpha2, ab->new_alpha2, 2); in ath12k_mac_hw_register()
13981 memcpy(&ar->alpha2, ab->new_alpha2, 2); in ath12k_mac_hw_register()
13983 reinit_completion(&ar->regd_update_completed); in ath12k_mac_hw_register()
13987 ath12k_warn(ar->ab, in ath12k_mac_hw_register()
14008 i = ah->num_radio; in ath12k_mac_hw_register()
14023 struct ath12k_base *ab = ar->ab; in ath12k_mac_setup()
14024 struct ath12k_pdev *pdev = ar->pdev; in ath12k_mac_setup()
14025 u8 pdev_idx = ar->pdev_idx; in ath12k_mac_setup()
14027 ar->lmac_id = ath12k_hw_get_mac_from_pdev_id(ab->hw_params, pdev_idx); in ath12k_mac_setup()
14029 ar->wmi = &ab->wmi_ab.wmi[pdev_idx]; in ath12k_mac_setup()
14035 ar->cfg_tx_chainmask = pdev->cap.tx_chain_mask; in ath12k_mac_setup()
14036 ar->cfg_rx_chainmask = pdev->cap.rx_chain_mask; in ath12k_mac_setup()
14037 ar->num_tx_chains = hweight32(pdev->cap.tx_chain_mask); in ath12k_mac_setup()
14038 ar->num_rx_chains = hweight32(pdev->cap.rx_chain_mask); in ath12k_mac_setup()
14039 ar->scan.arvif = NULL; in ath12k_mac_setup()
14040 ar->vdev_id_11d_scan = ATH12K_11D_INVALID_VDEV_ID; in ath12k_mac_setup()
14042 spin_lock_init(&ar->data_lock); in ath12k_mac_setup()
14043 INIT_LIST_HEAD(&ar->arvifs); in ath12k_mac_setup()
14044 INIT_LIST_HEAD(&ar->ppdu_stats_info); in ath12k_mac_setup()
14046 init_completion(&ar->vdev_setup_done); in ath12k_mac_setup()
14047 init_completion(&ar->vdev_delete_done); in ath12k_mac_setup()
14048 init_completion(&ar->peer_assoc_done); in ath12k_mac_setup()
14049 init_completion(&ar->peer_delete_done); in ath12k_mac_setup()
14050 init_completion(&ar->install_key_done); in ath12k_mac_setup()
14051 init_completion(&ar->bss_survey_done); in ath12k_mac_setup()
14052 init_completion(&ar->scan.started); in ath12k_mac_setup()
14053 init_completion(&ar->scan.completed); in ath12k_mac_setup()
14054 init_completion(&ar->scan.on_channel); in ath12k_mac_setup()
14055 init_completion(&ar->mlo_setup_done); in ath12k_mac_setup()
14056 init_completion(&ar->completed_11d_scan); in ath12k_mac_setup()
14057 init_completion(&ar->regd_update_completed); in ath12k_mac_setup()
14059 INIT_DELAYED_WORK(&ar->scan.timeout, ath12k_scan_timeout_work); in ath12k_mac_setup()
14060 wiphy_work_init(&ar->scan.vdev_clean_wk, ath12k_scan_vdev_clean_work); in ath12k_mac_setup()
14061 INIT_WORK(&ar->regd_channel_update_work, ath12k_regd_update_chan_list_work); in ath12k_mac_setup()
14062 INIT_LIST_HEAD(&ar->regd_channel_update_queue); in ath12k_mac_setup()
14063 INIT_WORK(&ar->regd_update_work, ath12k_regd_update_work); in ath12k_mac_setup()
14065 wiphy_work_init(&ar->wmi_mgmt_tx_work, ath12k_mgmt_over_wmi_tx_work); in ath12k_mac_setup()
14066 skb_queue_head_init(&ar->wmi_mgmt_tx_queue); in ath12k_mac_setup()
14068 ar->monitor_vdev_id = -1; in ath12k_mac_setup()
14069 ar->monitor_vdev_created = false; in ath12k_mac_setup()
14070 ar->monitor_started = false; in ath12k_mac_setup()
14076 struct ath12k_base *partner_ab, *ab = ar->ab; in __ath12k_mac_mlo_setup()
14077 struct ath12k_hw_group *ag = ab->ag; in __ath12k_mac_mlo_setup()
14083 lockdep_assert_held(&ag->mutex); in __ath12k_mac_mlo_setup()
14085 reinit_completion(&ar->mlo_setup_done); in __ath12k_mac_mlo_setup()
14087 for (i = 0; i < ag->num_devices; i++) { in __ath12k_mac_mlo_setup()
14088 partner_ab = ag->ab[i]; in __ath12k_mac_mlo_setup()
14090 for (j = 0; j < partner_ab->num_radios; j++) { in __ath12k_mac_mlo_setup()
14091 pdev = &partner_ab->pdevs[j]; in __ath12k_mac_mlo_setup()
14094 if (ar == pdev->ar) in __ath12k_mac_mlo_setup()
14097 partner_link_id[num_link] = pdev->hw_link_id; in __ath12k_mac_mlo_setup()
14101 i, j, pdev->hw_link_id, num_link); in __ath12k_mac_mlo_setup()
14108 mlo.group_id = cpu_to_le32(ag->id); in __ath12k_mac_mlo_setup()
14111 ar->mlo_setup_status = 0; in __ath12k_mac_mlo_setup()
14113 ath12k_dbg(ab, ATH12K_DBG_MAC, "group id %d num_link %d\n", ag->id, num_link); in __ath12k_mac_mlo_setup()
14118 ar->pdev_idx, ret); in __ath12k_mac_mlo_setup()
14122 time_left = wait_for_completion_timeout(&ar->mlo_setup_done, in __ath12k_mac_mlo_setup()
14125 if (!time_left || ar->mlo_setup_status) in __ath12k_mac_mlo_setup()
14126 return ar->mlo_setup_status ? : -ETIMEDOUT; in __ath12k_mac_mlo_setup()
14128 ath12k_dbg(ab, ATH12K_DBG_MAC, "mlo setup done for pdev %d\n", ar->pdev_idx); in __ath12k_mac_mlo_setup()
14135 struct ath12k_base *ab = ar->ab; in __ath12k_mac_mlo_teardown()
14139 if (test_bit(ATH12K_FLAG_RECOVERY, &ab->dev_flags)) in __ath12k_mac_mlo_teardown()
14150 ar->pdev_idx, ret); in __ath12k_mac_mlo_teardown()
14154 ath12k_dbg(ab, ATH12K_DBG_MAC, "mlo teardown for pdev %d\n", ar->pdev_idx); in __ath12k_mac_mlo_teardown()
14166 for (i = 0; i < ag->num_hw; i++) { in ath12k_mac_mlo_setup()
14167 ah = ag->ah[i]; in ath12k_mac_mlo_setup()
14172 ar = &ah->radio[j]; in ath12k_mac_mlo_setup()
14175 ath12k_err(ar->ab, "failed to setup MLO: %d\n", ret); in ath12k_mac_mlo_setup()
14184 for (i = i - 1; i >= 0; i--) { in ath12k_mac_mlo_setup()
14185 ah = ag->ah[i]; in ath12k_mac_mlo_setup()
14189 for (j = j - 1; j >= 0; j--) { in ath12k_mac_mlo_setup()
14190 ar = &ah->radio[j]; in ath12k_mac_mlo_setup()
14207 for (i = 0; i < ag->num_hw; i++) { in ath12k_mac_mlo_teardown()
14208 ah = ag->ah[i]; in ath12k_mac_mlo_teardown()
14213 ar = &ah->radio[j]; in ath12k_mac_mlo_teardown()
14216 ath12k_err(ar->ab, "failed to teardown MLO: %d\n", ret); in ath12k_mac_mlo_teardown()
14229 for (i = 0; i < ag->num_hw; i++) { in ath12k_mac_register()
14240 for (i = i - 1; i >= 0; i--) { in ath12k_mac_register()
14256 for (i = ag->num_hw - 1; i >= 0; i--) { in ath12k_mac_unregister()
14267 ieee80211_free_hw(ah->hw); in ath12k_mac_hw_destroy()
14288 ah->hw = hw; in ath12k_mac_hw_allocate()
14289 ah->num_radio = num_pdev_map; in ath12k_mac_hw_allocate()
14291 mutex_init(&ah->hw_mutex); in ath12k_mac_hw_allocate()
14292 INIT_LIST_HEAD(&ah->ml_peers); in ath12k_mac_hw_allocate()
14297 pdev = &ab->pdevs[pdev_idx]; in ath12k_mac_hw_allocate()
14300 ar->ah = ah; in ath12k_mac_hw_allocate()
14301 ar->ab = ab; in ath12k_mac_hw_allocate()
14302 ar->hw_link_id = pdev->hw_link_id; in ath12k_mac_hw_allocate()
14303 ar->pdev = pdev; in ath12k_mac_hw_allocate()
14304 ar->pdev_idx = pdev_idx; in ath12k_mac_hw_allocate()
14305 pdev->ar = ar; in ath12k_mac_hw_allocate()
14307 ag->hw_links[ar->hw_link_id].device_id = ab->device_id; in ath12k_mac_hw_allocate()
14308 ag->hw_links[ar->hw_link_id].pdev_idx = pdev_idx; in ath12k_mac_hw_allocate()
14320 struct ath12k_base *ab = ag->ab[0]; in ath12k_mac_destroy()
14324 for (i = 0; i < ag->num_devices; i++) { in ath12k_mac_destroy()
14325 ab = ag->ab[i]; in ath12k_mac_destroy()
14329 for (j = 0; j < ab->num_radios; j++) { in ath12k_mac_destroy()
14330 pdev = &ab->pdevs[j]; in ath12k_mac_destroy()
14331 if (!pdev->ar) in ath12k_mac_destroy()
14333 pdev->ar = NULL; in ath12k_mac_destroy()
14337 for (i = 0; i < ag->num_hw; i++) { in ath12k_mac_destroy()
14352 ab->cc_freq_hz = 320000; in ath12k_mac_set_device_defaults()
14353 total_vdev = ab->num_radios * TARGET_NUM_VDEVS(ab); in ath12k_mac_set_device_defaults()
14354 ab->free_vdev_map = (1LL << total_vdev) - 1; in ath12k_mac_set_device_defaults()
14367 for (i = 0; i < ag->num_devices; i++) { in ath12k_mac_allocate()
14368 ab = ag->ab[i]; in ath12k_mac_allocate()
14374 total_radio += ab->num_radios; in ath12k_mac_allocate()
14378 return -EINVAL; in ath12k_mac_allocate()
14381 return -ENOSPC; in ath12k_mac_allocate()
14384 * hardware group which participate in multi-link operation else in ath12k_mac_allocate()
14387 if (ag->mlo_capable) in ath12k_mac_allocate()
14394 ag->num_hw = 0; in ath12k_mac_allocate()
14399 if (device_id >= ag->num_devices || !ag->ab[device_id]) { in ath12k_mac_allocate()
14400 ret = -ENOSPC; in ath12k_mac_allocate()
14404 ab = ag->ab[device_id]; in ath12k_mac_allocate()
14412 if (mac_id >= ab->num_radios) { in ath12k_mac_allocate()
14418 ab = pdev_map->ab; in ath12k_mac_allocate()
14424 ret = -ENOMEM; in ath12k_mac_allocate()
14428 ah->dev = ab->dev; in ath12k_mac_allocate()
14430 ag->ah[i] = ah; in ath12k_mac_allocate()
14431 ag->num_hw++; in ath12k_mac_allocate()
14437 for (i = i - 1; i >= 0; i--) { in ath12k_mac_allocate()
14454 struct ath12k *ar = arvif->ar; in ath12k_mac_vif_set_keepalive()
14457 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_vif_set_keepalive()
14459 if (arvif->ahvif->vdev_type != WMI_VDEV_TYPE_STA) in ath12k_mac_vif_set_keepalive()
14462 if (!test_bit(WMI_TLV_SERVICE_STA_KEEP_ALIVE, ar->ab->wmi_ab.svc_map)) in ath12k_mac_vif_set_keepalive()
14465 arg.vdev_id = arvif->vdev_id; in ath12k_mac_vif_set_keepalive()
14472 ath12k_warn(ar->ab, "failed to set keepalive on vdev %i: %d\n", in ath12k_mac_vif_set_keepalive()
14473 arvif->vdev_id, ret); in ath12k_mac_vif_set_keepalive()