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.
4 * Copyright (c) 2021-2025 Qualcomm Innovation Center, Inc. All rights reserved.
101 /* Operating Classes 131-135 */
242 #define ath12k_a_rates_size (ARRAY_SIZE(ath12k_legacy_rates) - 4)
271 return "11na-ht20"; in ath12k_mac_phymode_str()
273 return "11ng-ht20"; in ath12k_mac_phymode_str()
275 return "11na-ht40"; in ath12k_mac_phymode_str()
277 return "11ng-ht40"; in ath12k_mac_phymode_str()
279 return "11ac-vht20"; in ath12k_mac_phymode_str()
281 return "11ac-vht40"; in ath12k_mac_phymode_str()
283 return "11ac-vht80"; in ath12k_mac_phymode_str()
285 return "11ac-vht160"; in ath12k_mac_phymode_str()
287 return "11ac-vht80+80"; in ath12k_mac_phymode_str()
289 return "11ac-vht20-2g"; in ath12k_mac_phymode_str()
291 return "11ac-vht40-2g"; in ath12k_mac_phymode_str()
293 return "11ac-vht80-2g"; in ath12k_mac_phymode_str()
295 return "11ax-he20"; in ath12k_mac_phymode_str()
297 return "11ax-he40"; in ath12k_mac_phymode_str()
299 return "11ax-he80"; in ath12k_mac_phymode_str()
301 return "11ax-he80+80"; in ath12k_mac_phymode_str()
303 return "11ax-he160"; in ath12k_mac_phymode_str()
305 return "11ax-he20-2g"; in ath12k_mac_phymode_str()
307 return "11ax-he40-2g"; in ath12k_mac_phymode_str()
309 return "11ax-he80-2g"; in ath12k_mac_phymode_str()
311 return "11be-eht20"; in ath12k_mac_phymode_str()
313 return "11be-eht40"; in ath12k_mac_phymode_str()
315 return "11be-eht80"; in ath12k_mac_phymode_str()
317 return "11be-eht80+80"; in ath12k_mac_phymode_str()
319 return "11be-eht160"; in ath12k_mac_phymode_str()
321 return "11be-eht160+160"; in ath12k_mac_phymode_str()
323 return "11be-eht320"; in ath12k_mac_phymode_str()
325 return "11be-eht20-2g"; in ath12k_mac_phymode_str()
327 return "11be-eht40-2g"; in ath12k_mac_phymode_str()
387 /* As default, it is OFDM rates */ in ath12k_mac_hw_ratecode_to_legacy_rate()
406 return -EINVAL; in ath12k_mac_hw_ratecode_to_legacy_rate()
414 for (i = 0; i < sband->n_bitrates; i++) in ath12k_mac_bitrate_to_idx()
415 if (sband->bitrates[i].bitrate == bitrate) in ath12k_mac_bitrate_to_idx()
426 for (nss = IEEE80211_HT_MCS_MASK_LEN - 1; nss >= 0; nss--) in ath12k_mac_max_ht_nss()
438 for (nss = NL80211_VHT_NSS_MAX - 1; nss >= 0; nss--) in ath12k_mac_max_vht_nss()
447 /* From IEEE Std 802.11-2020 defined values for "Minimum MPDU Start Spacing": in ath12k_parse_mpdudensity()
487 link_conf = rcu_dereference(vif->link_conf[link_id]); in ath12k_mac_vif_link_chan()
491 return -ENOLINK; in ath12k_mac_vif_link_chan()
494 conf = rcu_dereference(link_conf->chanctx_conf); in ath12k_mac_vif_link_chan()
497 return -ENOENT; in ath12k_mac_vif_link_chan()
499 *def = conf->def; in ath12k_mac_vif_link_chan()
508 struct ieee80211_vif *vif = arvif->ahvif->vif; in ath12k_mac_get_link_bss_conf()
510 struct ath12k *ar = arvif->ar; in ath12k_mac_get_link_bss_conf()
512 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_get_link_bss_conf()
514 if (arvif->link_id >= IEEE80211_MLD_MAX_NUM_LINKS) in ath12k_mac_get_link_bss_conf()
517 link_conf = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy, in ath12k_mac_get_link_bss_conf()
518 vif->link_conf[arvif->link_id]); in ath12k_mac_get_link_bss_conf()
525 struct ath12k_sta *ahsta = arsta->ahsta; in ath12k_mac_get_link_sta()
529 lockdep_assert_wiphy(ahsta->ahvif->ah->hw->wiphy); in ath12k_mac_get_link_sta()
531 if (arsta->link_id >= IEEE80211_MLD_MAX_NUM_LINKS) in ath12k_mac_get_link_sta()
534 link_sta = wiphy_dereference(ahsta->ahvif->ah->hw->wiphy, in ath12k_mac_get_link_sta()
535 sta->link[arsta->link_id]); in ath12k_mac_get_link_sta()
559 for (i = 0; i < sband->n_bitrates; i++) { in ath12k_mac_hw_rate_to_idx()
560 rate = &sband->bitrates[i]; in ath12k_mac_hw_rate_to_idx()
562 if (ath12k_mac_bitrate_is_cck(rate->bitrate) != cck) in ath12k_mac_hw_rate_to_idx()
565 if (rate->hw_value == hw_rate) in ath12k_mac_hw_rate_to_idx()
567 else if (rate->flags & IEEE80211_RATE_SHORT_PREAMBLE && in ath12k_mac_hw_rate_to_idx()
568 rate->hw_value_short == hw_rate) in ath12k_mac_hw_rate_to_idx()
586 unsigned long links_map = ahvif->links_map; in ath12k_get_arvif_iter()
591 arvif = rcu_dereference(ahvif->link[link_id]); in ath12k_get_arvif_iter()
596 if (arvif->vdev_id == arvif_iter->vdev_id && in ath12k_get_arvif_iter()
597 arvif->ar == arvif_iter->ar) { in ath12k_get_arvif_iter()
598 arvif_iter->arvif = arvif; in ath12k_get_arvif_iter()
621 ath12k_warn(ar->ab, "No VIF found for vdev %d\n", vdev_id); in ath12k_mac_get_arvif()
635 for (i = 0; i < ab->num_radios; i++) { in ath12k_mac_get_arvif_by_vdev_id()
636 pdev = rcu_dereference(ab->pdevs_active[i]); in ath12k_mac_get_arvif_by_vdev_id()
637 if (pdev && pdev->ar && in ath12k_mac_get_arvif_by_vdev_id()
638 (pdev->ar->allocated_vdev_map & (1LL << vdev_id))) { in ath12k_mac_get_arvif_by_vdev_id()
639 arvif = ath12k_mac_get_arvif(pdev->ar, vdev_id); in ath12k_mac_get_arvif_by_vdev_id()
653 for (i = 0; i < ab->num_radios; i++) { in ath12k_mac_get_ar_by_vdev_id()
654 pdev = rcu_dereference(ab->pdevs_active[i]); in ath12k_mac_get_ar_by_vdev_id()
655 if (pdev && pdev->ar) { in ath12k_mac_get_ar_by_vdev_id()
656 if (pdev->ar->allocated_vdev_map & (1LL << vdev_id)) in ath12k_mac_get_ar_by_vdev_id()
657 return pdev->ar; in ath12k_mac_get_ar_by_vdev_id()
669 if (ab->hw_params->single_pdev_only) { in ath12k_mac_get_ar_by_pdev_id()
670 pdev = rcu_dereference(ab->pdevs_active[0]); in ath12k_mac_get_ar_by_pdev_id()
671 return pdev ? pdev->ar : NULL; in ath12k_mac_get_ar_by_pdev_id()
674 if (WARN_ON(pdev_id > ab->num_radios)) in ath12k_mac_get_ar_by_pdev_id()
677 for (i = 0; i < ab->num_radios; i++) { in ath12k_mac_get_ar_by_pdev_id()
678 pdev = rcu_dereference(ab->pdevs_active[i]); in ath12k_mac_get_ar_by_pdev_id()
680 if (pdev && pdev->pdev_id == pdev_id) in ath12k_mac_get_ar_by_pdev_id()
681 return (pdev->ar ? pdev->ar : NULL); in ath12k_mac_get_ar_by_pdev_id()
689 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_mac_is_ml_arvif()
691 lockdep_assert_wiphy(ahvif->ah->hw->wiphy); in ath12k_mac_is_ml_arvif()
693 if (ahvif->vif->valid_links & BIT(arvif->link_id)) in ath12k_mac_is_ml_arvif()
702 struct ath12k_hw *ah = hw->priv; in ath12k_mac_get_ar_by_chan()
706 ar = ah->radio; in ath12k_mac_get_ar_by_chan()
708 if (ah->num_radio == 1) in ath12k_mac_get_ar_by_chan()
712 if (channel->center_freq >= KHZ_TO_MHZ(ar->freq_range.start_freq) && in ath12k_mac_get_ar_by_chan()
713 channel->center_freq <= KHZ_TO_MHZ(ar->freq_range.end_freq)) in ath12k_mac_get_ar_by_chan()
725 return ath12k_mac_get_ar_by_chan(hw, ctx->def.chan); in ath12k_get_ar_by_ctx()
736 lockdep_assert_wiphy(hw->wiphy); in ath12k_get_ar_by_vif()
741 if (ah->num_radio == 1) in ath12k_get_ar_by_vif()
742 return ah->radio; in ath12k_get_ar_by_vif()
744 if (!(ahvif->links_map & BIT(link_id))) in ath12k_get_ar_by_vif()
747 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); in ath12k_get_ar_by_vif()
748 if (arvif && arvif->is_created) in ath12k_get_ar_by_vif()
749 return arvif->ar; in ath12k_get_ar_by_vif()
761 if (ctx_ar == arg->ar) in ath12k_mac_get_any_chanctx_conf_iter()
762 arg->chanctx_conf = conf; in ath12k_mac_get_any_chanctx_conf_iter()
769 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_get_vif_up()
771 list_for_each_entry(arvif, &ar->arvifs, list) { in ath12k_mac_get_vif_up()
772 if (arvif->is_up) in ath12k_mac_get_vif_up()
800 struct ath12k *ar = arvif->ar; in ath12k_mac_get_target_pdev_id_from_vif()
801 struct ath12k_base *ab = ar->ab; in ath12k_mac_get_target_pdev_id_from_vif()
802 struct ieee80211_vif *vif = arvif->ahvif->vif; in ath12k_mac_get_target_pdev_id_from_vif()
805 u8 pdev_id = ab->fw_pdev[0].pdev_id; in ath12k_mac_get_target_pdev_id_from_vif()
808 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) in ath12k_mac_get_target_pdev_id_from_vif()
811 band = def.chan->band; in ath12k_mac_get_target_pdev_id_from_vif()
813 for (i = 0; i < ab->fw_pdev_count; i++) { in ath12k_mac_get_target_pdev_id_from_vif()
814 if (ath12k_mac_band_match(band, ab->fw_pdev[i].supported_bands)) in ath12k_mac_get_target_pdev_id_from_vif()
815 return ab->fw_pdev[i].pdev_id; in ath12k_mac_get_target_pdev_id_from_vif()
824 struct ath12k_base *ab = ar->ab; in ath12k_mac_get_target_pdev_id()
826 if (!ab->hw_params->single_pdev_only) in ath12k_mac_get_target_pdev_id()
827 return ar->pdev->pdev_id; in ath12k_mac_get_target_pdev_id()
836 return ar->ab->fw_pdev[0].pdev_id; in ath12k_mac_get_target_pdev_id()
844 struct ath12k_base *ab = ar->ab; in ath12k_pdev_caps_update()
846 ar->max_tx_power = ab->target_caps.hw_max_tx_power; in ath12k_pdev_caps_update()
848 /* FIXME: Set min_tx_power to ab->target_caps.hw_min_tx_power. in ath12k_pdev_caps_update()
850 * we can set ar->min_tx_power to 0 currently until in ath12k_pdev_caps_update()
853 ar->min_tx_power = 0; in ath12k_pdev_caps_update()
855 ar->txpower_limit_2g = ar->max_tx_power; in ath12k_pdev_caps_update()
856 ar->txpower_limit_5g = ar->max_tx_power; in ath12k_pdev_caps_update()
857 ar->txpower_scale = WMI_HOST_TP_SCALE_MAX; in ath12k_pdev_caps_update()
862 struct ath12k_pdev *pdev = ar->pdev; in ath12k_mac_txpower_recalc()
864 int ret, txpower = -1; in ath12k_mac_txpower_recalc()
867 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_txpower_recalc()
869 list_for_each_entry(arvif, &ar->arvifs, list) { in ath12k_mac_txpower_recalc()
870 if (arvif->txpower <= 0) in ath12k_mac_txpower_recalc()
873 if (txpower == -1) in ath12k_mac_txpower_recalc()
874 txpower = arvif->txpower; in ath12k_mac_txpower_recalc()
876 txpower = min(txpower, arvif->txpower); in ath12k_mac_txpower_recalc()
879 if (txpower == -1) in ath12k_mac_txpower_recalc()
883 txpower = min_t(u32, max_t(u32, ar->min_tx_power, txpower), in ath12k_mac_txpower_recalc()
884 ar->max_tx_power) * 2; in ath12k_mac_txpower_recalc()
886 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "txpower to set in hw %d\n", in ath12k_mac_txpower_recalc()
889 if ((pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) && in ath12k_mac_txpower_recalc()
890 ar->txpower_limit_2g != txpower) { in ath12k_mac_txpower_recalc()
893 txpower, ar->pdev->pdev_id); in ath12k_mac_txpower_recalc()
896 ar->txpower_limit_2g = txpower; in ath12k_mac_txpower_recalc()
899 if ((pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) && in ath12k_mac_txpower_recalc()
900 ar->txpower_limit_5g != txpower) { in ath12k_mac_txpower_recalc()
903 txpower, ar->pdev->pdev_id); in ath12k_mac_txpower_recalc()
906 ar->txpower_limit_5g = txpower; in ath12k_mac_txpower_recalc()
912 ath12k_warn(ar->ab, "failed to recalc txpower limit %d using pdev param %d: %d\n", in ath12k_mac_txpower_recalc()
919 struct ath12k *ar = arvif->ar; in ath12k_recalc_rtscts_prot()
923 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_recalc_rtscts_prot()
933 if (arvif->num_legacy_stations > 0) in ath12k_recalc_rtscts_prot()
939 if (arvif->rtscts_prot_mode == rts_cts) in ath12k_recalc_rtscts_prot()
942 arvif->rtscts_prot_mode = rts_cts; in ath12k_recalc_rtscts_prot()
944 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %d recalc rts/cts prot %d\n", in ath12k_recalc_rtscts_prot()
945 arvif->vdev_id, rts_cts); in ath12k_recalc_rtscts_prot()
947 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_recalc_rtscts_prot()
950 ath12k_warn(ar->ab, "failed to recalculate rts/cts prot for vdev %d: %d\n", in ath12k_recalc_rtscts_prot()
951 arvif->vdev_id, ret); in ath12k_recalc_rtscts_prot()
958 struct ath12k *ar = arvif->ar; in ath12k_mac_set_kickout()
964 ar->pdev->pdev_id); in ath12k_mac_set_kickout()
966 ath12k_warn(ar->ab, "failed to set kickout threshold on vdev %i: %d\n", in ath12k_mac_set_kickout()
967 arvif->vdev_id, ret); in ath12k_mac_set_kickout()
972 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, in ath12k_mac_set_kickout()
975 ath12k_warn(ar->ab, "failed to set keepalive minimum idle time on vdev %i: %d\n", in ath12k_mac_set_kickout()
976 arvif->vdev_id, ret); in ath12k_mac_set_kickout()
981 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, in ath12k_mac_set_kickout()
984 ath12k_warn(ar->ab, "failed to set keepalive maximum idle time on vdev %i: %d\n", in ath12k_mac_set_kickout()
985 arvif->vdev_id, ret); in ath12k_mac_set_kickout()
990 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, in ath12k_mac_set_kickout()
993 ath12k_warn(ar->ab, "failed to set keepalive maximum unresponsive time on vdev %i: %d\n", in ath12k_mac_set_kickout()
994 arvif->vdev_id, ret); in ath12k_mac_set_kickout()
1004 struct ath12k_base *ab = ar->ab; in ath12k_mac_peer_cleanup_all()
1006 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_peer_cleanup_all()
1008 spin_lock_bh(&ab->base_lock); in ath12k_mac_peer_cleanup_all()
1009 list_for_each_entry_safe(peer, tmp, &ab->peers, list) { in ath12k_mac_peer_cleanup_all()
1011 if (peer->sta) in ath12k_mac_peer_cleanup_all()
1014 list_del(&peer->list); in ath12k_mac_peer_cleanup_all()
1017 spin_unlock_bh(&ab->base_lock); in ath12k_mac_peer_cleanup_all()
1019 ar->num_peers = 0; in ath12k_mac_peer_cleanup_all()
1020 ar->num_stations = 0; in ath12k_mac_peer_cleanup_all()
1025 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_vdev_setup_sync()
1027 if (test_bit(ATH12K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags)) in ath12k_mac_vdev_setup_sync()
1028 return -ESHUTDOWN; in ath12k_mac_vdev_setup_sync()
1030 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "vdev setup timeout %d\n", in ath12k_mac_vdev_setup_sync()
1033 if (!wait_for_completion_timeout(&ar->vdev_setup_done, in ath12k_mac_vdev_setup_sync()
1035 return -ETIMEDOUT; in ath12k_mac_vdev_setup_sync()
1037 return ar->last_wmi_vdev_start_status ? -EINVAL : 0; in ath12k_mac_vdev_setup_sync()
1046 params.bssid = ar->mac_addr; in ath12k_monitor_vdev_up()
1049 ath12k_warn(ar->ab, "failed to put up monitor vdev %i: %d\n", in ath12k_monitor_vdev_up()
1054 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %i started\n", in ath12k_monitor_vdev_up()
1067 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_monitor_vdev_start()
1069 channel = chandef->chan; in ath12k_mac_monitor_vdev_start()
1071 arg.freq = channel->center_freq; in ath12k_mac_monitor_vdev_start()
1072 arg.band_center_freq1 = chandef->center_freq1; in ath12k_mac_monitor_vdev_start()
1073 arg.band_center_freq2 = chandef->center_freq2; in ath12k_mac_monitor_vdev_start()
1074 arg.mode = ath12k_phymodes[chandef->chan->band][chandef->width]; in ath12k_mac_monitor_vdev_start()
1075 arg.chan_radar = !!(channel->flags & IEEE80211_CHAN_RADAR); in ath12k_mac_monitor_vdev_start()
1078 arg.max_power = channel->max_power; in ath12k_mac_monitor_vdev_start()
1079 arg.max_reg_power = channel->max_reg_power; in ath12k_mac_monitor_vdev_start()
1080 arg.max_antenna_gain = channel->max_antenna_gain; in ath12k_mac_monitor_vdev_start()
1082 arg.pref_tx_streams = ar->num_tx_chains; in ath12k_mac_monitor_vdev_start()
1083 arg.pref_rx_streams = ar->num_rx_chains; in ath12k_mac_monitor_vdev_start()
1086 arg.passive |= !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR); in ath12k_mac_monitor_vdev_start()
1088 reinit_completion(&ar->vdev_setup_done); in ath12k_mac_monitor_vdev_start()
1089 reinit_completion(&ar->vdev_delete_done); in ath12k_mac_monitor_vdev_start()
1093 ath12k_warn(ar->ab, "failed to request monitor vdev %i start: %d\n", in ath12k_mac_monitor_vdev_start()
1100 ath12k_warn(ar->ab, "failed to synchronize setup for monitor vdev %i start: %d\n", in ath12k_mac_monitor_vdev_start()
1106 params.bssid = ar->mac_addr; in ath12k_mac_monitor_vdev_start()
1109 ath12k_warn(ar->ab, "failed to put up monitor vdev %i: %d\n", in ath12k_mac_monitor_vdev_start()
1114 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %i started\n", in ath12k_mac_monitor_vdev_start()
1121 ath12k_warn(ar->ab, "failed to stop monitor vdev %i after start failure: %d\n", in ath12k_mac_monitor_vdev_start()
1130 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_monitor_vdev_stop()
1132 reinit_completion(&ar->vdev_setup_done); in ath12k_mac_monitor_vdev_stop()
1134 ret = ath12k_wmi_vdev_stop(ar, ar->monitor_vdev_id); in ath12k_mac_monitor_vdev_stop()
1136 ath12k_warn(ar->ab, "failed to request monitor vdev %i stop: %d\n", in ath12k_mac_monitor_vdev_stop()
1137 ar->monitor_vdev_id, ret); in ath12k_mac_monitor_vdev_stop()
1141 ath12k_warn(ar->ab, "failed to synchronize monitor vdev %i stop: %d\n", in ath12k_mac_monitor_vdev_stop()
1142 ar->monitor_vdev_id, ret); in ath12k_mac_monitor_vdev_stop()
1144 ret = ath12k_wmi_vdev_down(ar, ar->monitor_vdev_id); in ath12k_mac_monitor_vdev_stop()
1146 ath12k_warn(ar->ab, "failed to put down monitor vdev %i: %d\n", in ath12k_mac_monitor_vdev_stop()
1147 ar->monitor_vdev_id, ret); in ath12k_mac_monitor_vdev_stop()
1149 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %i stopped\n", in ath12k_mac_monitor_vdev_stop()
1150 ar->monitor_vdev_id); in ath12k_mac_monitor_vdev_stop()
1156 struct ath12k_pdev *pdev = ar->pdev; in ath12k_mac_monitor_vdev_create()
1161 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_monitor_vdev_create()
1163 if (ar->monitor_vdev_created) in ath12k_mac_monitor_vdev_create()
1166 if (ar->ab->free_vdev_map == 0) { in ath12k_mac_monitor_vdev_create()
1167 ath12k_warn(ar->ab, "failed to find free vdev id for monitor vdev\n"); in ath12k_mac_monitor_vdev_create()
1168 return -ENOMEM; in ath12k_mac_monitor_vdev_create()
1171 bit = __ffs64(ar->ab->free_vdev_map); in ath12k_mac_monitor_vdev_create()
1173 ar->monitor_vdev_id = bit; in ath12k_mac_monitor_vdev_create()
1175 arg.if_id = ar->monitor_vdev_id; in ath12k_mac_monitor_vdev_create()
1178 arg.pdev_id = pdev->pdev_id; in ath12k_mac_monitor_vdev_create()
1181 if (pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) { in ath12k_mac_monitor_vdev_create()
1182 arg.chains[NL80211_BAND_2GHZ].tx = ar->num_tx_chains; in ath12k_mac_monitor_vdev_create()
1183 arg.chains[NL80211_BAND_2GHZ].rx = ar->num_rx_chains; in ath12k_mac_monitor_vdev_create()
1186 if (pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) { in ath12k_mac_monitor_vdev_create()
1187 arg.chains[NL80211_BAND_5GHZ].tx = ar->num_tx_chains; in ath12k_mac_monitor_vdev_create()
1188 arg.chains[NL80211_BAND_5GHZ].rx = ar->num_rx_chains; in ath12k_mac_monitor_vdev_create()
1193 ath12k_warn(ar->ab, "failed to request monitor vdev %i creation: %d\n", in ath12k_mac_monitor_vdev_create()
1194 ar->monitor_vdev_id, ret); in ath12k_mac_monitor_vdev_create()
1195 ar->monitor_vdev_id = -1; in ath12k_mac_monitor_vdev_create()
1199 ar->allocated_vdev_map |= 1LL << ar->monitor_vdev_id; in ath12k_mac_monitor_vdev_create()
1200 ar->ab->free_vdev_map &= ~(1LL << ar->monitor_vdev_id); in ath12k_mac_monitor_vdev_create()
1201 ar->num_created_vdevs++; in ath12k_mac_monitor_vdev_create()
1202 ar->monitor_vdev_created = true; in ath12k_mac_monitor_vdev_create()
1203 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %d created\n", in ath12k_mac_monitor_vdev_create()
1204 ar->monitor_vdev_id); in ath12k_mac_monitor_vdev_create()
1214 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_monitor_vdev_delete()
1216 if (!ar->monitor_vdev_created) in ath12k_mac_monitor_vdev_delete()
1219 reinit_completion(&ar->vdev_delete_done); in ath12k_mac_monitor_vdev_delete()
1221 ret = ath12k_wmi_vdev_delete(ar, ar->monitor_vdev_id); in ath12k_mac_monitor_vdev_delete()
1223 ath12k_warn(ar->ab, "failed to request wmi monitor vdev %i removal: %d\n", in ath12k_mac_monitor_vdev_delete()
1224 ar->monitor_vdev_id, ret); in ath12k_mac_monitor_vdev_delete()
1228 time_left = wait_for_completion_timeout(&ar->vdev_delete_done, in ath12k_mac_monitor_vdev_delete()
1231 ath12k_warn(ar->ab, "Timeout in receiving vdev delete response\n"); in ath12k_mac_monitor_vdev_delete()
1233 ar->allocated_vdev_map &= ~(1LL << ar->monitor_vdev_id); in ath12k_mac_monitor_vdev_delete()
1234 ar->ab->free_vdev_map |= 1LL << (ar->monitor_vdev_id); in ath12k_mac_monitor_vdev_delete()
1235 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %d deleted\n", in ath12k_mac_monitor_vdev_delete()
1236 ar->monitor_vdev_id); in ath12k_mac_monitor_vdev_delete()
1237 ar->num_created_vdevs--; in ath12k_mac_monitor_vdev_delete()
1238 ar->monitor_vdev_id = -1; in ath12k_mac_monitor_vdev_delete()
1239 ar->monitor_vdev_created = false; in ath12k_mac_monitor_vdev_delete()
1252 *def = &conf->def; in ath12k_mac_get_any_chandef_iter()
1260 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_monitor_start()
1262 if (ar->monitor_started) in ath12k_mac_monitor_start()
1271 ret = ath12k_mac_monitor_vdev_start(ar, ar->monitor_vdev_id, chandef); in ath12k_mac_monitor_start()
1273 ath12k_warn(ar->ab, "failed to start monitor vdev: %d\n", ret); in ath12k_mac_monitor_start()
1278 ar->monitor_started = true; in ath12k_mac_monitor_start()
1279 ar->num_started_vdevs++; in ath12k_mac_monitor_start()
1281 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor started ret %d\n", ret); in ath12k_mac_monitor_start()
1290 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_monitor_stop()
1292 if (!ar->monitor_started) in ath12k_mac_monitor_stop()
1297 ath12k_warn(ar->ab, "failed to stop monitor vdev: %d\n", ret); in ath12k_mac_monitor_stop()
1301 ar->monitor_started = false; in ath12k_mac_monitor_stop()
1302 ar->num_started_vdevs--; in ath12k_mac_monitor_stop()
1304 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor stopped ret %d\n", ret); in ath12k_mac_monitor_stop()
1310 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_mac_vdev_stop()
1311 struct ath12k *ar = arvif->ar; in ath12k_mac_vdev_stop()
1314 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_vdev_stop()
1316 reinit_completion(&ar->vdev_setup_done); in ath12k_mac_vdev_stop()
1318 ret = ath12k_wmi_vdev_stop(ar, arvif->vdev_id); in ath12k_mac_vdev_stop()
1320 ath12k_warn(ar->ab, "failed to stop WMI vdev %i: %d\n", in ath12k_mac_vdev_stop()
1321 arvif->vdev_id, ret); in ath12k_mac_vdev_stop()
1327 ath12k_warn(ar->ab, "failed to synchronize setup for vdev %i: %d\n", in ath12k_mac_vdev_stop()
1328 arvif->vdev_id, ret); in ath12k_mac_vdev_stop()
1332 WARN_ON(ar->num_started_vdevs == 0); in ath12k_mac_vdev_stop()
1334 ar->num_started_vdevs--; in ath12k_mac_vdev_stop()
1335 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "vdev %pM stopped, vdev_id %d\n", in ath12k_mac_vdev_stop()
1336 ahvif->vif->addr, arvif->vdev_id); in ath12k_mac_vdev_stop()
1338 if (test_bit(ATH12K_FLAG_CAC_RUNNING, &ar->dev_flags)) { in ath12k_mac_vdev_stop()
1339 clear_bit(ATH12K_FLAG_CAC_RUNNING, &ar->dev_flags); in ath12k_mac_vdev_stop()
1340 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "CAC Stopped for vdev %d\n", in ath12k_mac_vdev_stop()
1341 arvif->vdev_id); in ath12k_mac_vdev_stop()
1352 struct ieee80211_conf *conf = &hw->conf; in ath12k_mac_config()
1355 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_config()
1358 ar->monitor_conf_enabled = conf->flags & IEEE80211_CONF_MONITOR; in ath12k_mac_config()
1359 if (ar->monitor_conf_enabled) { in ath12k_mac_config()
1360 if (ar->monitor_vdev_created) in ath12k_mac_config()
1369 if (!ar->monitor_vdev_created) in ath12k_mac_config()
1391 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_config()
1397 ath12k_warn(ar->ab, "failed to update config pdev idx %d: %d\n", in ath12k_mac_op_config()
1398 ar->pdev_idx, ret); in ath12k_mac_op_config()
1406 struct ath12k *ar = arvif->ar; in ath12k_mac_setup_bcn_p2p_ie()
1411 mgmt = (void *)bcn->data; in ath12k_mac_setup_bcn_p2p_ie()
1413 mgmt->u.beacon.variable, in ath12k_mac_setup_bcn_p2p_ie()
1414 bcn->len - (mgmt->u.beacon.variable - in ath12k_mac_setup_bcn_p2p_ie()
1415 bcn->data)); in ath12k_mac_setup_bcn_p2p_ie()
1417 ath12k_warn(ar->ab, "no P2P ie found in beacon\n"); in ath12k_mac_setup_bcn_p2p_ie()
1418 return -ENOENT; in ath12k_mac_setup_bcn_p2p_ie()
1421 ret = ath12k_wmi_p2p_go_bcn_ie(ar, arvif->vdev_id, p2p_ie); in ath12k_mac_setup_bcn_p2p_ie()
1423 ath12k_warn(ar->ab, "failed to submit P2P GO bcn ie for vdev %i: %d\n", in ath12k_mac_setup_bcn_p2p_ie()
1424 arvif->vdev_id, ret); in ath12k_mac_setup_bcn_p2p_ie()
1438 if (WARN_ON(skb->len < ie_offset)) in ath12k_mac_remove_vendor_ie()
1439 return -EINVAL; in ath12k_mac_remove_vendor_ie()
1442 skb->data + ie_offset, in ath12k_mac_remove_vendor_ie()
1443 skb->len - ie_offset); in ath12k_mac_remove_vendor_ie()
1445 return -ENOENT; in ath12k_mac_remove_vendor_ie()
1448 end = skb->data + skb->len; in ath12k_mac_remove_vendor_ie()
1452 return -EINVAL; in ath12k_mac_remove_vendor_ie()
1454 memmove(ie, next, end - next); in ath12k_mac_remove_vendor_ie()
1455 skb_trim(skb, skb->len - len); in ath12k_mac_remove_vendor_ie()
1463 struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)bcn->data; in ath12k_mac_set_arvif_ies()
1469 start = bcn->data + ieee80211_get_hdrlen_from_skb(bcn) + sizeof(mgmt->u.beacon); in ath12k_mac_set_arvif_ies()
1471 rem_len = tail - start; in ath12k_mac_set_arvif_ies()
1473 arvif->rsnie_present = false; in ath12k_mac_set_arvif_ies()
1474 arvif->wpaie_present = false; in ath12k_mac_set_arvif_ies()
1477 arvif->rsnie_present = true; in ath12k_mac_set_arvif_ies()
1480 arvif->wpaie_present = true; in ath12k_mac_set_arvif_ies()
1500 if (elem->datalen < 12 || elem->data[0] < 1) in ath12k_mac_set_arvif_ies()
1503 for_each_element(nontx, elem->data + 1, elem->datalen - 1) { in ath12k_mac_set_arvif_ies()
1504 start = nontx->data; in ath12k_mac_set_arvif_ies()
1506 if (nontx->id != 0 || nontx->datalen < 4) in ath12k_mac_set_arvif_ies()
1509 if (nontx->data[0] != WLAN_EID_NON_TX_BSSID_CAP || in ath12k_mac_set_arvif_ies()
1510 nontx->data[1] != 2) { in ath12k_mac_set_arvif_ies()
1514 if (nontx->data[4] != WLAN_EID_SSID) in ath12k_mac_set_arvif_ies()
1518 start, nontx->datalen); in ath12k_mac_set_arvif_ies()
1519 if (!index || index->datalen < 1 || index->data[0] == 0) in ath12k_mac_set_arvif_ies()
1522 if (index->data[0] == bssid_index) { in ath12k_mac_set_arvif_ies()
1525 nontx->data, in ath12k_mac_set_arvif_ies()
1526 nontx->datalen)) { in ath12k_mac_set_arvif_ies()
1527 arvif->rsnie_present = true; in ath12k_mac_set_arvif_ies()
1529 } else if (!arvif->rsnie_present) { in ath12k_mac_set_arvif_ies()
1534 nontx->data, in ath12k_mac_set_arvif_ies()
1535 nontx->datalen); in ath12k_mac_set_arvif_ies()
1536 if (!nie || nie->datalen < 2) in ath12k_mac_set_arvif_ies()
1537 return; /* Invalid non-inheritance element */ in ath12k_mac_set_arvif_ies()
1539 for (i = 1; i < nie->datalen - 1; i++) { in ath12k_mac_set_arvif_ies()
1540 if (nie->data[i] == WLAN_EID_RSN) { in ath12k_mac_set_arvif_ies()
1541 arvif->rsnie_present = false; in ath12k_mac_set_arvif_ies()
1554 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_mac_setup_bcn_tmpl_ema()
1566 ath12k_warn(arvif->ar->ab, in ath12k_mac_setup_bcn_tmpl_ema()
1568 ahvif->vif->addr, arvif->link_id); in ath12k_mac_setup_bcn_tmpl_ema()
1569 return -ENOLINK; in ath12k_mac_setup_bcn_tmpl_ema()
1572 tx_ahvif = ath12k_vif_to_ahvif(ahvif->vif->mbssid_tx_vif); in ath12k_mac_setup_bcn_tmpl_ema()
1573 tx_arvif = &tx_ahvif->deflink; in ath12k_mac_setup_bcn_tmpl_ema()
1574 beacons = ieee80211_beacon_get_template_ema_list(ath12k_ar_to_hw(tx_arvif->ar), in ath12k_mac_setup_bcn_tmpl_ema()
1575 tx_ahvif->vif, in ath12k_mac_setup_bcn_tmpl_ema()
1576 tx_arvif->link_id); in ath12k_mac_setup_bcn_tmpl_ema()
1577 if (!beacons || !beacons->cnt) { in ath12k_mac_setup_bcn_tmpl_ema()
1578 ath12k_warn(arvif->ar->ab, in ath12k_mac_setup_bcn_tmpl_ema()
1580 return -EPERM; in ath12k_mac_setup_bcn_tmpl_ema()
1584 ath12k_mac_set_arvif_ies(arvif, beacons->bcn[0].skb, 0, NULL); in ath12k_mac_setup_bcn_tmpl_ema()
1586 for (i = 0; i < beacons->cnt; i++) { in ath12k_mac_setup_bcn_tmpl_ema()
1588 ath12k_mac_set_arvif_ies(arvif, beacons->bcn[i].skb, in ath12k_mac_setup_bcn_tmpl_ema()
1589 bss_conf->bssid_index, in ath12k_mac_setup_bcn_tmpl_ema()
1592 ema_args.bcn_cnt = beacons->cnt; in ath12k_mac_setup_bcn_tmpl_ema()
1594 ret = ath12k_wmi_bcn_tmpl(tx_arvif->ar, tx_arvif->vdev_id, in ath12k_mac_setup_bcn_tmpl_ema()
1595 &beacons->bcn[i].offs, in ath12k_mac_setup_bcn_tmpl_ema()
1596 beacons->bcn[i].skb, &ema_args); in ath12k_mac_setup_bcn_tmpl_ema()
1598 ath12k_warn(tx_arvif->ar->ab, in ath12k_mac_setup_bcn_tmpl_ema()
1606 ath12k_warn(arvif->ar->ab, in ath12k_mac_setup_bcn_tmpl_ema()
1608 bss_conf->bssid_index); in ath12k_mac_setup_bcn_tmpl_ema()
1616 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_mac_setup_bcn_tmpl()
1620 struct ath12k *ar = arvif->ar; in ath12k_mac_setup_bcn_tmpl()
1621 struct ath12k_base *ab = ar->ab; in ath12k_mac_setup_bcn_tmpl()
1628 if (ahvif->vdev_type != WMI_VDEV_TYPE_AP) in ath12k_mac_setup_bcn_tmpl()
1633 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()
1634 vif->addr, arvif->link_id); in ath12k_mac_setup_bcn_tmpl()
1635 return -ENOLINK; in ath12k_mac_setup_bcn_tmpl()
1638 if (vif->mbssid_tx_vif) { in ath12k_mac_setup_bcn_tmpl()
1639 tx_ahvif = ath12k_vif_to_ahvif(vif->mbssid_tx_vif); in ath12k_mac_setup_bcn_tmpl()
1640 tx_arvif = &tx_ahvif->deflink; in ath12k_mac_setup_bcn_tmpl()
1641 if (tx_arvif != arvif && arvif->is_up) in ath12k_mac_setup_bcn_tmpl()
1644 if (link_conf->ema_ap) in ath12k_mac_setup_bcn_tmpl()
1648 bcn = ieee80211_beacon_get_template(ath12k_ar_to_hw(tx_arvif->ar), tx_ahvif->vif, in ath12k_mac_setup_bcn_tmpl()
1649 &offs, tx_arvif->link_id); in ath12k_mac_setup_bcn_tmpl()
1652 return -EPERM; in ath12k_mac_setup_bcn_tmpl()
1659 link_conf->bssid_index, in ath12k_mac_setup_bcn_tmpl()
1666 if (ahvif->vif->type == NL80211_IFTYPE_AP && ahvif->vif->p2p) { in ath12k_mac_setup_bcn_tmpl()
1689 ret = ath12k_wmi_bcn_tmpl(ar, arvif->vdev_id, &offs, bcn, NULL); in ath12k_mac_setup_bcn_tmpl()
1704 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_control_beaconing()
1705 struct ath12k *ar = arvif->ar; in ath12k_control_beaconing()
1708 lockdep_assert_wiphy(ath12k_ar_to_hw(arvif->ar)->wiphy); in ath12k_control_beaconing()
1710 if (!info->enable_beacon) { in ath12k_control_beaconing()
1711 ret = ath12k_wmi_vdev_down(ar, arvif->vdev_id); in ath12k_control_beaconing()
1713 ath12k_warn(ar->ab, "failed to down vdev_id %i: %d\n", in ath12k_control_beaconing()
1714 arvif->vdev_id, ret); in ath12k_control_beaconing()
1716 arvif->is_up = false; in ath12k_control_beaconing()
1723 ath12k_warn(ar->ab, "failed to update bcn tmpl during vdev up: %d\n", in ath12k_control_beaconing()
1728 ahvif->aid = 0; in ath12k_control_beaconing()
1730 ether_addr_copy(arvif->bssid, info->addr); in ath12k_control_beaconing()
1732 params.vdev_id = arvif->vdev_id; in ath12k_control_beaconing()
1733 params.aid = ahvif->aid; in ath12k_control_beaconing()
1734 params.bssid = arvif->bssid; in ath12k_control_beaconing()
1735 if (ahvif->vif->mbssid_tx_vif) { in ath12k_control_beaconing()
1737 ath12k_vif_to_ahvif(ahvif->vif->mbssid_tx_vif); in ath12k_control_beaconing()
1738 struct ath12k_link_vif *tx_arvif = &tx_ahvif->deflink; in ath12k_control_beaconing()
1740 params.tx_bssid = tx_arvif->bssid; in ath12k_control_beaconing()
1741 params.nontx_profile_idx = info->bssid_index; in ath12k_control_beaconing()
1742 params.nontx_profile_cnt = 1 << info->bssid_indicator; in ath12k_control_beaconing()
1744 ret = ath12k_wmi_vdev_up(arvif->ar, &params); in ath12k_control_beaconing()
1746 ath12k_warn(ar->ab, "failed to bring up vdev %d: %i\n", in ath12k_control_beaconing()
1747 arvif->vdev_id, ret); in ath12k_control_beaconing()
1751 arvif->is_up = true; in ath12k_control_beaconing()
1753 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %d up\n", arvif->vdev_id); in ath12k_control_beaconing()
1760 struct ieee80211_mgmt *mgmt = (void *)skb->data; in ath12k_mac_handle_beacon_iter()
1762 struct ath12k_link_vif *arvif = &ahvif->deflink; in ath12k_mac_handle_beacon_iter()
1764 if (vif->type != NL80211_IFTYPE_STATION) in ath12k_mac_handle_beacon_iter()
1767 if (!ether_addr_equal(mgmt->bssid, vif->bss_conf.bssid)) in ath12k_mac_handle_beacon_iter()
1770 cancel_delayed_work(&arvif->connection_loss_work); in ath12k_mac_handle_beacon_iter()
1786 struct ath12k_link_vif *arvif = &ahvif->deflink; in ath12k_mac_handle_beacon_miss_iter()
1787 struct ath12k *ar = arvif->ar; in ath12k_mac_handle_beacon_miss_iter()
1790 if (arvif->vdev_id != *vdev_id) in ath12k_mac_handle_beacon_miss_iter()
1793 if (!arvif->is_up) in ath12k_mac_handle_beacon_miss_iter()
1803 ieee80211_queue_delayed_work(hw, &arvif->connection_loss_work, in ath12k_mac_handle_beacon_miss_iter()
1819 struct ieee80211_vif *vif = arvif->ahvif->vif; in ath12k_mac_vif_sta_connection_loss_work()
1821 if (!arvif->is_up) in ath12k_mac_vif_sta_connection_loss_work()
1832 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); in ath12k_peer_assoc_h_basic()
1833 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); in ath12k_peer_assoc_h_basic()
1838 lockdep_assert_wiphy(hw->wiphy); in ath12k_peer_assoc_h_basic()
1840 if (vif->type == NL80211_IFTYPE_STATION) in ath12k_peer_assoc_h_basic()
1841 aid = vif->cfg.aid; in ath12k_peer_assoc_h_basic()
1843 aid = sta->aid; in ath12k_peer_assoc_h_basic()
1845 ether_addr_copy(arg->peer_mac, arsta->addr); in ath12k_peer_assoc_h_basic()
1846 arg->vdev_id = arvif->vdev_id; in ath12k_peer_assoc_h_basic()
1847 arg->peer_associd = aid; in ath12k_peer_assoc_h_basic()
1848 arg->auth_flag = true; in ath12k_peer_assoc_h_basic()
1850 arg->peer_listen_intval = hw->conf.listen_interval; in ath12k_peer_assoc_h_basic()
1851 arg->peer_nss = 1; in ath12k_peer_assoc_h_basic()
1855 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()
1856 vif->addr, arvif->link_id); in ath12k_peer_assoc_h_basic()
1860 arg->peer_caps = bss_conf->assoc_capability; in ath12k_peer_assoc_h_basic()
1868 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); in ath12k_peer_assoc_h_crypto()
1869 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); in ath12k_peer_assoc_h_crypto()
1877 lockdep_assert_wiphy(hw->wiphy); in ath12k_peer_assoc_h_crypto()
1881 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()
1882 vif->addr, arvif->link_id); in ath12k_peer_assoc_h_crypto()
1886 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) in ath12k_peer_assoc_h_crypto()
1889 bss = cfg80211_get_bss(hw->wiphy, def.chan, info->bssid, NULL, 0, in ath12k_peer_assoc_h_crypto()
1892 if (arvif->rsnie_present || arvif->wpaie_present) { in ath12k_peer_assoc_h_crypto()
1893 arg->need_ptk_4_way = true; in ath12k_peer_assoc_h_crypto()
1894 if (arvif->wpaie_present) in ath12k_peer_assoc_h_crypto()
1895 arg->need_gtk_2_way = true; in ath12k_peer_assoc_h_crypto()
1902 ies = rcu_dereference(bss->ies); in ath12k_peer_assoc_h_crypto()
1906 ies->data, in ath12k_peer_assoc_h_crypto()
1907 ies->len); in ath12k_peer_assoc_h_crypto()
1909 cfg80211_put_bss(hw->wiphy, bss); in ath12k_peer_assoc_h_crypto()
1914 ath12k_dbg(ar->ab, ATH12K_DBG_WMI, in ath12k_peer_assoc_h_crypto()
1916 arg->need_ptk_4_way = true; in ath12k_peer_assoc_h_crypto()
1920 ath12k_dbg(ar->ab, ATH12K_DBG_WMI, in ath12k_peer_assoc_h_crypto()
1922 arg->need_gtk_2_way = true; in ath12k_peer_assoc_h_crypto()
1925 if (sta->mfp) { in ath12k_peer_assoc_h_crypto()
1927 arg->is_pmf_enabled = true; in ath12k_peer_assoc_h_crypto()
1930 /* TODO: safe_mode_enabled (bypass 4-way handshake) flag req? */ in ath12k_peer_assoc_h_crypto()
1938 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); in ath12k_peer_assoc_h_rates()
1939 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); in ath12k_peer_assoc_h_rates()
1940 struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates; in ath12k_peer_assoc_h_rates()
1944 const struct ieee80211_rate *rates; in ath12k_peer_assoc_h_rates() local
1951 lockdep_assert_wiphy(hw->wiphy); in ath12k_peer_assoc_h_rates()
1953 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) in ath12k_peer_assoc_h_rates()
1958 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()
1959 sta->addr, arsta->link_id); in ath12k_peer_assoc_h_rates()
1963 band = def.chan->band; in ath12k_peer_assoc_h_rates()
1964 sband = hw->wiphy->bands[band]; in ath12k_peer_assoc_h_rates()
1965 ratemask = link_sta->supp_rates[band]; in ath12k_peer_assoc_h_rates()
1966 ratemask &= arvif->bitrate_mask.control[band].legacy; in ath12k_peer_assoc_h_rates()
1967 rates = sband->bitrates; in ath12k_peer_assoc_h_rates()
1969 rateset->num_rates = 0; in ath12k_peer_assoc_h_rates()
1971 for (i = 0; i < 32; i++, ratemask >>= 1, rates++) { in ath12k_peer_assoc_h_rates()
1975 rate = ath12k_mac_bitrate_to_rate(rates->bitrate); in ath12k_peer_assoc_h_rates()
1976 rateset->rates[rateset->num_rates] = rate; in ath12k_peer_assoc_h_rates()
1977 rateset->num_rates++; in ath12k_peer_assoc_h_rates()
2010 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); in ath12k_peer_assoc_h_ht()
2011 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); in ath12k_peer_assoc_h_ht()
2021 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_peer_assoc_h_ht()
2023 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) in ath12k_peer_assoc_h_ht()
2028 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()
2029 sta->addr, arsta->link_id); in ath12k_peer_assoc_h_ht()
2033 ht_cap = &link_sta->ht_cap; in ath12k_peer_assoc_h_ht()
2034 if (!ht_cap->ht_supported) in ath12k_peer_assoc_h_ht()
2037 band = def.chan->band; in ath12k_peer_assoc_h_ht()
2038 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs; in ath12k_peer_assoc_h_ht()
2043 arg->ht_flag = true; in ath12k_peer_assoc_h_ht()
2045 arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR + in ath12k_peer_assoc_h_ht()
2046 ht_cap->ampdu_factor)) - 1; in ath12k_peer_assoc_h_ht()
2048 arg->peer_mpdu_density = in ath12k_peer_assoc_h_ht()
2049 ath12k_parse_mpdudensity(ht_cap->ampdu_density); in ath12k_peer_assoc_h_ht()
2051 arg->peer_ht_caps = ht_cap->cap; in ath12k_peer_assoc_h_ht()
2052 arg->peer_rate_caps |= WMI_HOST_RC_HT_FLAG; in ath12k_peer_assoc_h_ht()
2054 if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING) in ath12k_peer_assoc_h_ht()
2055 arg->ldpc_flag = true; in ath12k_peer_assoc_h_ht()
2057 if (link_sta->bandwidth >= IEEE80211_STA_RX_BW_40) { in ath12k_peer_assoc_h_ht()
2058 arg->bw_40 = true; in ath12k_peer_assoc_h_ht()
2059 arg->peer_rate_caps |= WMI_HOST_RC_CW40_FLAG; in ath12k_peer_assoc_h_ht()
2062 if (arvif->bitrate_mask.control[band].gi != NL80211_TXRATE_FORCE_LGI) { in ath12k_peer_assoc_h_ht()
2063 if (ht_cap->cap & (IEEE80211_HT_CAP_SGI_20 | in ath12k_peer_assoc_h_ht()
2065 arg->peer_rate_caps |= WMI_HOST_RC_SGI_FLAG; in ath12k_peer_assoc_h_ht()
2068 if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) { in ath12k_peer_assoc_h_ht()
2069 arg->peer_rate_caps |= WMI_HOST_RC_TX_STBC_FLAG; in ath12k_peer_assoc_h_ht()
2070 arg->stbc_flag = true; in ath12k_peer_assoc_h_ht()
2073 if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) { in ath12k_peer_assoc_h_ht()
2074 stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC; in ath12k_peer_assoc_h_ht()
2077 arg->peer_rate_caps |= stbc; in ath12k_peer_assoc_h_ht()
2078 arg->stbc_flag = true; in ath12k_peer_assoc_h_ht()
2081 if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2]) in ath12k_peer_assoc_h_ht()
2082 arg->peer_rate_caps |= WMI_HOST_RC_TS_FLAG; in ath12k_peer_assoc_h_ht()
2083 else if (ht_cap->mcs.rx_mask[1]) in ath12k_peer_assoc_h_ht()
2084 arg->peer_rate_caps |= WMI_HOST_RC_DS_FLAG; in ath12k_peer_assoc_h_ht()
2087 if ((ht_cap->mcs.rx_mask[i / 8] & BIT(i % 8)) && in ath12k_peer_assoc_h_ht()
2090 arg->peer_ht_rates.rates[n++] = i; in ath12k_peer_assoc_h_ht()
2093 /* This is a workaround for HT-enabled STAs which break the spec in ath12k_peer_assoc_h_ht()
2102 arg->peer_ht_rates.num_rates = 8; in ath12k_peer_assoc_h_ht()
2103 for (i = 0; i < arg->peer_ht_rates.num_rates; i++) in ath12k_peer_assoc_h_ht()
2104 arg->peer_ht_rates.rates[i] = i; in ath12k_peer_assoc_h_ht()
2106 arg->peer_ht_rates.num_rates = n; in ath12k_peer_assoc_h_ht()
2107 arg->peer_nss = min(link_sta->rx_nss, max_nss); in ath12k_peer_assoc_h_ht()
2110 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n", in ath12k_peer_assoc_h_ht()
2111 arg->peer_mac, in ath12k_peer_assoc_h_ht()
2112 arg->peer_ht_rates.num_rates, in ath12k_peer_assoc_h_ht()
2113 arg->peer_nss); in ath12k_peer_assoc_h_ht()
2119 case IEEE80211_VHT_MCS_SUPPORT_0_7: return BIT(8) - 1; in ath12k_mac_get_max_vht_mcs_map()
2120 case IEEE80211_VHT_MCS_SUPPORT_0_8: return BIT(9) - 1; in ath12k_mac_get_max_vht_mcs_map()
2121 case IEEE80211_VHT_MCS_SUPPORT_0_9: return BIT(10) - 1; in ath12k_mac_get_max_vht_mcs_map()
2140 idx_limit = fls(mcs_map) - 1; in ath12k_peer_assoc_h_vht_limit()
2142 idx_limit = -1; in ath12k_peer_assoc_h_vht_limit()
2164 case -1: in ath12k_peer_assoc_h_vht_limit()
2181 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); in ath12k_peer_assoc_h_vht()
2182 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); in ath12k_peer_assoc_h_vht()
2193 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_peer_assoc_h_vht()
2195 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) in ath12k_peer_assoc_h_vht()
2200 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()
2201 sta->addr, arsta->link_id); in ath12k_peer_assoc_h_vht()
2205 vht_cap = &link_sta->vht_cap; in ath12k_peer_assoc_h_vht()
2206 if (!vht_cap->vht_supported) in ath12k_peer_assoc_h_vht()
2209 band = def.chan->band; in ath12k_peer_assoc_h_vht()
2210 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs; in ath12k_peer_assoc_h_vht()
2215 arg->vht_flag = true; in ath12k_peer_assoc_h_vht()
2218 arg->vht_capable = true; in ath12k_peer_assoc_h_vht()
2220 if (def.chan->band == NL80211_BAND_2GHZ) in ath12k_peer_assoc_h_vht()
2221 arg->vht_ng_flag = true; in ath12k_peer_assoc_h_vht()
2223 arg->peer_vht_caps = vht_cap->cap; in ath12k_peer_assoc_h_vht()
2225 ampdu_factor = (vht_cap->cap & in ath12k_peer_assoc_h_vht()
2229 /* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to in ath12k_peer_assoc_h_vht()
2231 * arg->peer_max_mpdu at this point contains HT max_mpdu so keep in ath12k_peer_assoc_h_vht()
2234 arg->peer_max_mpdu = max(arg->peer_max_mpdu, in ath12k_peer_assoc_h_vht()
2236 ampdu_factor)) - 1); in ath12k_peer_assoc_h_vht()
2238 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80) in ath12k_peer_assoc_h_vht()
2239 arg->bw_80 = true; in ath12k_peer_assoc_h_vht()
2241 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160) in ath12k_peer_assoc_h_vht()
2242 arg->bw_160 = true; in ath12k_peer_assoc_h_vht()
2248 vht_mcs = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map) >> in ath12k_peer_assoc_h_vht()
2255 arg->peer_nss = min(link_sta->rx_nss, max_nss); in ath12k_peer_assoc_h_vht()
2256 arg->rx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.rx_highest); in ath12k_peer_assoc_h_vht()
2257 arg->rx_mcs_set = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map); in ath12k_peer_assoc_h_vht()
2258 arg->tx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.tx_highest); in ath12k_peer_assoc_h_vht()
2260 tx_mcs_map = __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map); in ath12k_peer_assoc_h_vht()
2261 arg->tx_mcs_set = ath12k_peer_assoc_h_vht_limit(tx_mcs_map, vht_mcs_mask); in ath12k_peer_assoc_h_vht()
2267 arg->tx_mcs_set &= ~IEEE80211_VHT_MCS_SUPPORT_0_11_MASK; in ath12k_peer_assoc_h_vht()
2268 arg->tx_mcs_set |= IEEE80211_DISABLE_VHT_MCS_SUPPORT_0_11; in ath12k_peer_assoc_h_vht()
2270 if ((arg->tx_mcs_set & IEEE80211_VHT_MCS_NOT_SUPPORTED) == in ath12k_peer_assoc_h_vht()
2272 arg->peer_vht_caps &= ~IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE; in ath12k_peer_assoc_h_vht()
2275 arg->tx_max_mcs_nss = 0xFF; in ath12k_peer_assoc_h_vht()
2277 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vht peer %pM max_mpdu %d flags 0x%x\n", in ath12k_peer_assoc_h_vht()
2278 arsta->addr, arg->peer_max_mpdu, arg->peer_flags); in ath12k_peer_assoc_h_vht()
2288 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); in ath12k_peer_assoc_h_he()
2289 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); in ath12k_peer_assoc_h_he()
2303 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()
2304 vif->addr, arvif->link_id); in ath12k_peer_assoc_h_he()
2310 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()
2311 sta->addr, arsta->link_id); in ath12k_peer_assoc_h_he()
2315 he_cap = &link_sta->he_cap; in ath12k_peer_assoc_h_he()
2316 if (!he_cap->has_he) in ath12k_peer_assoc_h_he()
2319 arg->he_flag = true; in ath12k_peer_assoc_h_he()
2321 support_160 = !!(he_cap->he_cap_elem.phy_cap_info[0] & in ath12k_peer_assoc_h_he()
2324 /* Supported HE-MCS and NSS Set of peer he_cap is intersection with self he_cp */ in ath12k_peer_assoc_h_he()
2325 mcs_160_map = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160); in ath12k_peer_assoc_h_he()
2326 mcs_80_map = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80); in ath12k_peer_assoc_h_he()
2329 for (i = 7; i >= 0; i--) { in ath12k_peer_assoc_h_he()
2339 for (i = 7; i >= 0; i--) { in ath12k_peer_assoc_h_he()
2353 arg->peer_nss = min(link_sta->rx_nss, max_nss); in ath12k_peer_assoc_h_he()
2355 memcpy(&arg->peer_he_cap_macinfo, he_cap->he_cap_elem.mac_cap_info, in ath12k_peer_assoc_h_he()
2356 sizeof(he_cap->he_cap_elem.mac_cap_info)); in ath12k_peer_assoc_h_he()
2357 memcpy(&arg->peer_he_cap_phyinfo, he_cap->he_cap_elem.phy_cap_info, in ath12k_peer_assoc_h_he()
2358 sizeof(he_cap->he_cap_elem.phy_cap_info)); in ath12k_peer_assoc_h_he()
2359 arg->peer_he_ops = link_conf->he_oper.params; in ath12k_peer_assoc_h_he()
2362 arg->peer_he_ops &= 0xffffff; in ath12k_peer_assoc_h_he()
2365 * Exponent Extension in HE cap is zero, use the arg->peer_max_mpdu in ath12k_peer_assoc_h_he()
2369 * For non-zero value of Max AMPDU Exponent Extension in HE MAC caps, in ath12k_peer_assoc_h_he()
2376 ampdu_factor = u8_get_bits(he_cap->he_cap_elem.mac_cap_info[3], in ath12k_peer_assoc_h_he()
2380 if (link_sta->vht_cap.vht_supported) in ath12k_peer_assoc_h_he()
2381 arg->peer_max_mpdu = (1 << (IEEE80211_HE_VHT_MAX_AMPDU_FACTOR + in ath12k_peer_assoc_h_he()
2382 ampdu_factor)) - 1; in ath12k_peer_assoc_h_he()
2383 else if (link_sta->ht_cap.ht_supported) in ath12k_peer_assoc_h_he()
2384 arg->peer_max_mpdu = (1 << (IEEE80211_HE_HT_MAX_AMPDU_FACTOR + in ath12k_peer_assoc_h_he()
2385 ampdu_factor)) - 1; in ath12k_peer_assoc_h_he()
2388 if (he_cap->he_cap_elem.phy_cap_info[6] & in ath12k_peer_assoc_h_he()
2391 int nss, ru; in ath12k_peer_assoc_h_he() local
2393 arg->peer_ppet.numss_m1 = he_cap->ppe_thres[0] & in ath12k_peer_assoc_h_he()
2395 arg->peer_ppet.ru_bit_mask = in ath12k_peer_assoc_h_he()
2396 (he_cap->ppe_thres[0] & in ath12k_peer_assoc_h_he()
2400 for (nss = 0; nss <= arg->peer_ppet.numss_m1; nss++) { in ath12k_peer_assoc_h_he()
2401 for (ru = 0; ru < 4; ru++) { in ath12k_peer_assoc_h_he()
2405 if ((arg->peer_ppet.ru_bit_mask & BIT(ru)) == 0) in ath12k_peer_assoc_h_he()
2409 val |= ((he_cap->ppe_thres[bit / 8] >> in ath12k_peer_assoc_h_he()
2413 arg->peer_ppet.ppet16_ppet8_ru3_ru0[nss] |= in ath12k_peer_assoc_h_he()
2414 val << (ru * 6); in ath12k_peer_assoc_h_he()
2419 if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_RES) in ath12k_peer_assoc_h_he()
2420 arg->twt_responder = true; in ath12k_peer_assoc_h_he()
2421 if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_REQ) in ath12k_peer_assoc_h_he()
2422 arg->twt_requester = true; in ath12k_peer_assoc_h_he()
2424 switch (link_sta->bandwidth) { in ath12k_peer_assoc_h_he()
2426 if (he_cap->he_cap_elem.phy_cap_info[0] & in ath12k_peer_assoc_h_he()
2428 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80p80); in ath12k_peer_assoc_h_he()
2429 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80_80] = v; in ath12k_peer_assoc_h_he()
2431 v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80p80); in ath12k_peer_assoc_h_he()
2432 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80_80] = v; in ath12k_peer_assoc_h_he()
2434 arg->peer_he_mcs_count++; in ath12k_peer_assoc_h_he()
2436 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160); in ath12k_peer_assoc_h_he()
2437 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v; in ath12k_peer_assoc_h_he()
2439 v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_160); in ath12k_peer_assoc_h_he()
2440 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v; in ath12k_peer_assoc_h_he()
2442 arg->peer_he_mcs_count++; in ath12k_peer_assoc_h_he()
2446 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80); in ath12k_peer_assoc_h_he()
2447 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v; in ath12k_peer_assoc_h_he()
2449 v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80); in ath12k_peer_assoc_h_he()
2450 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v; in ath12k_peer_assoc_h_he()
2452 arg->peer_he_mcs_count++; in ath12k_peer_assoc_h_he()
2462 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); in ath12k_peer_assoc_h_he_6ghz()
2463 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); in ath12k_peer_assoc_h_he_6ghz()
2470 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) in ath12k_peer_assoc_h_he_6ghz()
2473 band = def.chan->band; in ath12k_peer_assoc_h_he_6ghz()
2477 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()
2478 sta->addr, arsta->link_id); in ath12k_peer_assoc_h_he_6ghz()
2482 he_cap = &link_sta->he_cap; in ath12k_peer_assoc_h_he_6ghz()
2484 if (!arg->he_flag || band != NL80211_BAND_6GHZ || !link_sta->he_6ghz_capa.capa) in ath12k_peer_assoc_h_he_6ghz()
2487 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40) in ath12k_peer_assoc_h_he_6ghz()
2488 arg->bw_40 = true; in ath12k_peer_assoc_h_he_6ghz()
2490 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80) in ath12k_peer_assoc_h_he_6ghz()
2491 arg->bw_80 = true; in ath12k_peer_assoc_h_he_6ghz()
2493 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160) in ath12k_peer_assoc_h_he_6ghz()
2494 arg->bw_160 = true; in ath12k_peer_assoc_h_he_6ghz()
2496 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_320) in ath12k_peer_assoc_h_he_6ghz()
2497 arg->bw_320 = true; in ath12k_peer_assoc_h_he_6ghz()
2499 arg->peer_he_caps_6ghz = le16_to_cpu(link_sta->he_6ghz_capa.capa); in ath12k_peer_assoc_h_he_6ghz()
2501 mpdu_density = u32_get_bits(arg->peer_he_caps_6ghz, in ath12k_peer_assoc_h_he_6ghz()
2503 arg->peer_mpdu_density = ath12k_parse_mpdudensity(mpdu_density); in ath12k_peer_assoc_h_he_6ghz()
2505 /* From IEEE Std 802.11ax-2021 - Section 10.12.2: An HE STA shall be capable of in ath12k_peer_assoc_h_he_6ghz()
2506 * receiving A-MPDU where the A-MPDU pre-EOF padding length is up to the value in ath12k_peer_assoc_h_he_6ghz()
2507 * indicated by the Maximum A-MPDU Length Exponent Extension field in the HE in ath12k_peer_assoc_h_he_6ghz()
2508 * Capabilities element and the Maximum A-MPDU Length Exponent field in HE 6 GHz in ath12k_peer_assoc_h_he_6ghz()
2511 * Here, we are extracting the Max A-MPDU Exponent Extension from HE caps and in ath12k_peer_assoc_h_he_6ghz()
2512 * factor is the Maximum A-MPDU Length Exponent from HE 6 GHZ Band capability. in ath12k_peer_assoc_h_he_6ghz()
2514 ampdu_factor = u8_get_bits(he_cap->he_cap_elem.mac_cap_info[3], in ath12k_peer_assoc_h_he_6ghz()
2516 u32_get_bits(arg->peer_he_caps_6ghz, in ath12k_peer_assoc_h_he_6ghz()
2519 arg->peer_max_mpdu = (1u << (IEEE80211_HE_6GHZ_MAX_AMPDU_FACTOR + in ath12k_peer_assoc_h_he_6ghz()
2520 ampdu_factor)) - 1; in ath12k_peer_assoc_h_he_6ghz()
2527 if (ht_cap->ht_supported) in ath12k_get_smps_from_capa()
2528 *smps = u16_get_bits(ht_cap->cap, IEEE80211_HT_CAP_SM_PS); in ath12k_get_smps_from_capa()
2530 *smps = le16_get_bits(he_6ghz_capa->capa, in ath12k_get_smps_from_capa()
2534 return -EINVAL; in ath12k_get_smps_from_capa()
2542 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); in ath12k_peer_assoc_h_smps()
2544 struct ath12k_link_vif *arvif = arsta->arvif; in ath12k_peer_assoc_h_smps()
2547 struct ath12k *ar = arvif->ar; in ath12k_peer_assoc_h_smps()
2552 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()
2553 sta->addr, arsta->link_id); in ath12k_peer_assoc_h_smps()
2557 he_6ghz_capa = &link_sta->he_6ghz_capa; in ath12k_peer_assoc_h_smps()
2558 ht_cap = &link_sta->ht_cap; in ath12k_peer_assoc_h_smps()
2560 if (!ht_cap->ht_supported && !he_6ghz_capa->capa) in ath12k_peer_assoc_h_smps()
2568 arg->static_mimops_flag = true; in ath12k_peer_assoc_h_smps()
2571 arg->dynamic_mimops_flag = true; in ath12k_peer_assoc_h_smps()
2574 arg->spatial_mux_flag = true; in ath12k_peer_assoc_h_smps()
2586 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); in ath12k_peer_assoc_h_qos()
2588 switch (arvif->ahvif->vdev_type) { in ath12k_peer_assoc_h_qos()
2590 if (sta->wme) { in ath12k_peer_assoc_h_qos()
2592 arg->is_wme_set = true; in ath12k_peer_assoc_h_qos()
2593 arg->qos_flag = true; in ath12k_peer_assoc_h_qos()
2596 if (sta->wme && sta->uapsd_queues) { in ath12k_peer_assoc_h_qos()
2598 arg->is_wme_set = true; in ath12k_peer_assoc_h_qos()
2599 arg->apsd_flag = true; in ath12k_peer_assoc_h_qos()
2600 arg->peer_rate_caps |= WMI_HOST_RC_UAPSD_FLAG; in ath12k_peer_assoc_h_qos()
2604 if (sta->wme) { in ath12k_peer_assoc_h_qos()
2605 arg->is_wme_set = true; in ath12k_peer_assoc_h_qos()
2606 arg->qos_flag = true; in ath12k_peer_assoc_h_qos()
2613 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac peer %pM qos %d\n", in ath12k_peer_assoc_h_qos()
2614 arsta->addr, arg->qos_flag); in ath12k_peer_assoc_h_qos()
2621 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); in ath12k_peer_assoc_qos_ap()
2627 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_peer_assoc_qos_ap()
2629 arg.vdev_id = arvif->vdev_id; in ath12k_peer_assoc_qos_ap()
2631 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac uapsd_queues 0x%x max_sp %d\n", in ath12k_peer_assoc_qos_ap()
2632 sta->uapsd_queues, sta->max_sp); in ath12k_peer_assoc_qos_ap()
2635 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO) in ath12k_peer_assoc_qos_ap()
2638 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI) in ath12k_peer_assoc_qos_ap()
2641 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK) in ath12k_peer_assoc_qos_ap()
2644 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE) in ath12k_peer_assoc_qos_ap()
2649 if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP) in ath12k_peer_assoc_qos_ap()
2650 max_sp = sta->max_sp; in ath12k_peer_assoc_qos_ap()
2654 ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, arsta->addr, &arg); in ath12k_peer_assoc_qos_ap()
2660 ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, arsta->addr, &arg); in ath12k_peer_assoc_qos_ap()
2667 ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, arsta->addr, &arg); in ath12k_peer_assoc_qos_ap()
2673 ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, arsta->addr, &arg); in ath12k_peer_assoc_qos_ap()
2680 ath12k_warn(ar->ab, "failed to set ap ps peer param %d for vdev %i: %d\n", in ath12k_peer_assoc_qos_ap()
2681 arg.param, arvif->vdev_id, ret); in ath12k_peer_assoc_qos_ap()
2687 return sta->supp_rates[NL80211_BAND_2GHZ] >> in ath12k_mac_sta_has_ofdm_only()
2694 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160) { in ath12k_mac_get_phymode_vht()
2695 switch (link_sta->vht_cap.cap & in ath12k_mac_get_phymode_vht()
2707 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80) in ath12k_mac_get_phymode_vht()
2710 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40) in ath12k_mac_get_phymode_vht()
2713 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_20) in ath12k_mac_get_phymode_vht()
2722 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160) { in ath12k_mac_get_phymode_he()
2723 if (link_sta->he_cap.he_cap_elem.phy_cap_info[0] & in ath12k_mac_get_phymode_he()
2726 else if (link_sta->he_cap.he_cap_elem.phy_cap_info[0] & in ath12k_mac_get_phymode_he()
2733 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80) in ath12k_mac_get_phymode_he()
2736 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40) in ath12k_mac_get_phymode_he()
2739 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_20) in ath12k_mac_get_phymode_he()
2748 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_320) in ath12k_mac_get_phymode_eht()
2749 if (link_sta->eht_cap.eht_cap_elem.phy_cap_info[0] & in ath12k_mac_get_phymode_eht()
2753 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160) { in ath12k_mac_get_phymode_eht()
2754 if (link_sta->he_cap.he_cap_elem.phy_cap_info[0] & in ath12k_mac_get_phymode_eht()
2758 if (link_sta->he_cap.he_cap_elem.phy_cap_info[0] & in ath12k_mac_get_phymode_eht()
2762 ath12k_warn(ar->ab, "invalid EHT PHY capability info for 160 Mhz: %d\n", in ath12k_mac_get_phymode_eht()
2763 link_sta->he_cap.he_cap_elem.phy_cap_info[0]); in ath12k_mac_get_phymode_eht()
2768 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80) in ath12k_mac_get_phymode_eht()
2771 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40) in ath12k_mac_get_phymode_eht()
2774 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_20) in ath12k_mac_get_phymode_eht()
2792 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_peer_assoc_h_phymode()
2794 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); in ath12k_peer_assoc_h_phymode()
2795 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); in ath12k_peer_assoc_h_phymode()
2797 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) in ath12k_peer_assoc_h_phymode()
2800 band = def.chan->band; in ath12k_peer_assoc_h_phymode()
2801 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs; in ath12k_peer_assoc_h_phymode()
2802 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs; in ath12k_peer_assoc_h_phymode()
2806 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()
2807 sta->addr, arsta->link_id); in ath12k_peer_assoc_h_phymode()
2813 if (link_sta->eht_cap.has_eht) { in ath12k_peer_assoc_h_phymode()
2814 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40) in ath12k_peer_assoc_h_phymode()
2818 } else if (link_sta->he_cap.has_he) { in ath12k_peer_assoc_h_phymode()
2819 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80) in ath12k_peer_assoc_h_phymode()
2821 else if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40) in ath12k_peer_assoc_h_phymode()
2825 } else if (link_sta->vht_cap.vht_supported && in ath12k_peer_assoc_h_phymode()
2827 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40) in ath12k_peer_assoc_h_phymode()
2831 } else if (link_sta->ht_cap.ht_supported && in ath12k_peer_assoc_h_phymode()
2833 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40) in ath12k_peer_assoc_h_phymode()
2846 if (link_sta->eht_cap.has_eht) { in ath12k_peer_assoc_h_phymode()
2848 } else if (link_sta->he_cap.has_he) { in ath12k_peer_assoc_h_phymode()
2850 } else if (link_sta->vht_cap.vht_supported && in ath12k_peer_assoc_h_phymode()
2853 } else if (link_sta->ht_cap.ht_supported && in ath12k_peer_assoc_h_phymode()
2855 if (link_sta->bandwidth >= IEEE80211_STA_RX_BW_40) in ath12k_peer_assoc_h_phymode()
2867 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac peer %pM phymode %s\n", in ath12k_peer_assoc_h_phymode()
2868 arsta->addr, ath12k_mac_phymode_str(phymode)); in ath12k_peer_assoc_h_phymode()
2870 arg->peer_phymode = phymode; in ath12k_peer_assoc_h_phymode()
2911 u8 nss, ru, i; in ath12k_mac_set_eht_ppe_threshold() local
2914 ppet->numss_m1 = u8_get_bits(ppe_thres[0], IEEE80211_EHT_PPE_THRES_NSS_MASK); in ath12k_mac_set_eht_ppe_threshold()
2915 ppet->ru_bit_mask = u16_get_bits(get_unaligned_le16(ppe_thres), in ath12k_mac_set_eht_ppe_threshold()
2918 for (nss = 0; nss <= ppet->numss_m1; nss++) { in ath12k_mac_set_eht_ppe_threshold()
2919 for (ru = 0; in ath12k_mac_set_eht_ppe_threshold()
2920 ru < hweight16(IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK); in ath12k_mac_set_eht_ppe_threshold()
2921 ru++) { in ath12k_mac_set_eht_ppe_threshold()
2922 if ((ppet->ru_bit_mask & BIT(ru)) == 0) in ath12k_mac_set_eht_ppe_threshold()
2931 ppet->ppet16_ppet8_ru3_ru0[nss] |= in ath12k_mac_set_eht_ppe_threshold()
2932 (val << (ru * ppet_bit_len_per_ru)); in ath12k_mac_set_eht_ppe_threshold()
2942 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); in ath12k_peer_assoc_h_eht()
2950 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_peer_assoc_h_eht()
2954 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()
2955 sta->addr, arsta->link_id); in ath12k_peer_assoc_h_eht()
2959 eht_cap = &link_sta->eht_cap; in ath12k_peer_assoc_h_eht()
2960 he_cap = &link_sta->he_cap; in ath12k_peer_assoc_h_eht()
2961 if (!he_cap->has_he || !eht_cap->has_eht) in ath12k_peer_assoc_h_eht()
2964 arg->eht_flag = true; in ath12k_peer_assoc_h_eht()
2966 if ((eht_cap->eht_cap_elem.phy_cap_info[5] & in ath12k_peer_assoc_h_eht()
2968 eht_cap->eht_ppe_thres[0] != 0) in ath12k_peer_assoc_h_eht()
2969 ath12k_mac_set_eht_ppe_threshold(eht_cap->eht_ppe_thres, in ath12k_peer_assoc_h_eht()
2970 &arg->peer_eht_ppet); in ath12k_peer_assoc_h_eht()
2972 memcpy(arg->peer_eht_cap_mac, eht_cap->eht_cap_elem.mac_cap_info, in ath12k_peer_assoc_h_eht()
2973 sizeof(eht_cap->eht_cap_elem.mac_cap_info)); in ath12k_peer_assoc_h_eht()
2974 memcpy(arg->peer_eht_cap_phy, eht_cap->eht_cap_elem.phy_cap_info, in ath12k_peer_assoc_h_eht()
2975 sizeof(eht_cap->eht_cap_elem.phy_cap_info)); in ath12k_peer_assoc_h_eht()
2977 rx_mcs = arg->peer_eht_rx_mcs_set; in ath12k_peer_assoc_h_eht()
2978 tx_mcs = arg->peer_eht_tx_mcs_set; in ath12k_peer_assoc_h_eht()
2980 switch (link_sta->bandwidth) { in ath12k_peer_assoc_h_eht()
2982 bw = &eht_cap->eht_mcs_nss_supp.bw._320; in ath12k_peer_assoc_h_eht()
2983 ath12k_mac_set_eht_mcs(bw->rx_tx_mcs9_max_nss, in ath12k_peer_assoc_h_eht()
2984 bw->rx_tx_mcs9_max_nss, in ath12k_peer_assoc_h_eht()
2985 bw->rx_tx_mcs11_max_nss, in ath12k_peer_assoc_h_eht()
2986 bw->rx_tx_mcs13_max_nss, in ath12k_peer_assoc_h_eht()
2989 arg->peer_eht_mcs_count++; in ath12k_peer_assoc_h_eht()
2992 bw = &eht_cap->eht_mcs_nss_supp.bw._160; in ath12k_peer_assoc_h_eht()
2993 ath12k_mac_set_eht_mcs(bw->rx_tx_mcs9_max_nss, in ath12k_peer_assoc_h_eht()
2994 bw->rx_tx_mcs9_max_nss, in ath12k_peer_assoc_h_eht()
2995 bw->rx_tx_mcs11_max_nss, in ath12k_peer_assoc_h_eht()
2996 bw->rx_tx_mcs13_max_nss, in ath12k_peer_assoc_h_eht()
2999 arg->peer_eht_mcs_count++; in ath12k_peer_assoc_h_eht()
3002 if ((he_cap->he_cap_elem.phy_cap_info[0] & in ath12k_peer_assoc_h_eht()
3007 bw_20 = &eht_cap->eht_mcs_nss_supp.only_20mhz; in ath12k_peer_assoc_h_eht()
3009 ath12k_mac_set_eht_mcs(bw_20->rx_tx_mcs7_max_nss, in ath12k_peer_assoc_h_eht()
3010 bw_20->rx_tx_mcs9_max_nss, in ath12k_peer_assoc_h_eht()
3011 bw_20->rx_tx_mcs11_max_nss, in ath12k_peer_assoc_h_eht()
3012 bw_20->rx_tx_mcs13_max_nss, in ath12k_peer_assoc_h_eht()
3016 bw = &eht_cap->eht_mcs_nss_supp.bw._80; in ath12k_peer_assoc_h_eht()
3017 ath12k_mac_set_eht_mcs(bw->rx_tx_mcs9_max_nss, in ath12k_peer_assoc_h_eht()
3018 bw->rx_tx_mcs9_max_nss, in ath12k_peer_assoc_h_eht()
3019 bw->rx_tx_mcs11_max_nss, in ath12k_peer_assoc_h_eht()
3020 bw->rx_tx_mcs13_max_nss, in ath12k_peer_assoc_h_eht()
3025 arg->peer_eht_mcs_count++; in ath12k_peer_assoc_h_eht()
3029 arg->punct_bitmap = ~arvif->punct_bitmap; in ath12k_peer_assoc_h_eht()
3035 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); in ath12k_peer_assoc_h_mlo()
3036 struct peer_assoc_mlo_params *ml = &arg->ml; in ath12k_peer_assoc_h_mlo()
3037 struct ath12k_sta *ahsta = arsta->ahsta; in ath12k_peer_assoc_h_mlo()
3044 if (!sta->mlo || ahsta->ml_peer_id == ATH12K_MLO_PEER_ID_INVALID) in ath12k_peer_assoc_h_mlo()
3047 ml->enabled = true; in ath12k_peer_assoc_h_mlo()
3048 ml->assoc_link = arsta->is_assoc_link; in ath12k_peer_assoc_h_mlo()
3051 ml->primary_umac = arsta->is_assoc_link; in ath12k_peer_assoc_h_mlo()
3052 ml->peer_id_valid = true; in ath12k_peer_assoc_h_mlo()
3053 ml->logical_link_idx_valid = true; in ath12k_peer_assoc_h_mlo()
3055 ether_addr_copy(ml->mld_addr, sta->addr); in ath12k_peer_assoc_h_mlo()
3056 ml->logical_link_idx = arsta->link_idx; in ath12k_peer_assoc_h_mlo()
3057 ml->ml_peer_id = ahsta->ml_peer_id; in ath12k_peer_assoc_h_mlo()
3058 ml->ieee_link_id = arsta->link_id; in ath12k_peer_assoc_h_mlo()
3059 ml->num_partner_links = 0; in ath12k_peer_assoc_h_mlo()
3060 links = ahsta->links_map; in ath12k_peer_assoc_h_mlo()
3070 arsta_p = rcu_dereference(ahsta->link[link_id]); in ath12k_peer_assoc_h_mlo()
3071 arvif = rcu_dereference(ahsta->ahvif->link[link_id]); in ath12k_peer_assoc_h_mlo()
3076 if (!arvif->is_started) in ath12k_peer_assoc_h_mlo()
3079 ml->partner_info[i].vdev_id = arvif->vdev_id; in ath12k_peer_assoc_h_mlo()
3080 ml->partner_info[i].hw_link_id = arvif->ar->pdev->hw_link_id; in ath12k_peer_assoc_h_mlo()
3081 ml->partner_info[i].assoc_link = arsta_p->is_assoc_link; in ath12k_peer_assoc_h_mlo()
3082 ml->partner_info[i].primary_umac = arsta_p->is_assoc_link; in ath12k_peer_assoc_h_mlo()
3083 ml->partner_info[i].logical_link_idx_valid = true; in ath12k_peer_assoc_h_mlo()
3084 ml->partner_info[i].logical_link_idx = arsta_p->link_idx; in ath12k_peer_assoc_h_mlo()
3085 ml->num_partner_links++; in ath12k_peer_assoc_h_mlo()
3099 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_peer_assoc_prepare()
3103 reinit_completion(&ar->peer_assoc_done); in ath12k_peer_assoc_prepare()
3105 arg->peer_new_assoc = !reassoc; in ath12k_peer_assoc_prepare()
3129 if (!ht_cap->ht_supported && !he_6ghz_capa) in ath12k_setup_peer_smps()
3136 return ath12k_wmi_set_peer_param(ar, addr, arvif->vdev_id, in ath12k_setup_peer_smps()
3145 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_bss_assoc()
3149 u8 link_id = bss_conf->link_id; in ath12k_bss_assoc()
3157 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_bss_assoc()
3164 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_bss_assoc()
3166 arvif->vdev_id, link_id, arvif->bssid, ahvif->aid); in ath12k_bss_assoc()
3171 * non-ML connection, it has the BSSID. in ath12k_bss_assoc()
3173 ap_sta = ieee80211_find_sta(vif, vif->cfg.ap_addr); in ath12k_bss_assoc()
3175 ath12k_warn(ar->ab, "failed to find station entry for bss %pM vdev %i\n", in ath12k_bss_assoc()
3176 vif->cfg.ap_addr, arvif->vdev_id); in ath12k_bss_assoc()
3183 arsta = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy, in ath12k_bss_assoc()
3184 ahsta->link[link_id]); in ath12k_bss_assoc()
3202 ath12k_warn(ar->ab, "failed to run peer assoc for %pM vdev %i: %d\n", in ath12k_bss_assoc()
3203 bss_conf->bssid, arvif->vdev_id, ret); in ath12k_bss_assoc()
3207 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) { in ath12k_bss_assoc()
3208 ath12k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n", in ath12k_bss_assoc()
3209 bss_conf->bssid, arvif->vdev_id); in ath12k_bss_assoc()
3213 ret = ath12k_setup_peer_smps(ar, arvif, bss_conf->bssid, in ath12k_bss_assoc()
3214 &link_sta->ht_cap, &link_sta->he_6ghz_capa); in ath12k_bss_assoc()
3216 ath12k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n", in ath12k_bss_assoc()
3217 arvif->vdev_id, ret); in ath12k_bss_assoc()
3221 WARN_ON(arvif->is_up); in ath12k_bss_assoc()
3223 ahvif->aid = vif->cfg.aid; in ath12k_bss_assoc()
3224 ether_addr_copy(arvif->bssid, bss_conf->bssid); in ath12k_bss_assoc()
3226 params.vdev_id = arvif->vdev_id; in ath12k_bss_assoc()
3227 params.aid = ahvif->aid; in ath12k_bss_assoc()
3228 params.bssid = arvif->bssid; in ath12k_bss_assoc()
3231 ath12k_warn(ar->ab, "failed to set vdev %d up: %d\n", in ath12k_bss_assoc()
3232 arvif->vdev_id, ret); in ath12k_bss_assoc()
3236 arvif->is_up = true; in ath12k_bss_assoc()
3237 arvif->rekey_data.enable_offload = false; in ath12k_bss_assoc()
3239 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_bss_assoc()
3241 arvif->vdev_id, bss_conf->bssid, vif->cfg.aid); in ath12k_bss_assoc()
3243 spin_lock_bh(&ar->ab->base_lock); in ath12k_bss_assoc()
3245 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arvif->bssid); in ath12k_bss_assoc()
3246 if (peer && peer->is_authorized) in ath12k_bss_assoc()
3249 spin_unlock_bh(&ar->ab->base_lock); in ath12k_bss_assoc()
3253 ret = ath12k_wmi_set_peer_param(ar, arvif->bssid, in ath12k_bss_assoc()
3254 arvif->vdev_id, in ath12k_bss_assoc()
3258 ath12k_warn(ar->ab, "Unable to authorize BSS peer: %d\n", ret); in ath12k_bss_assoc()
3261 ret = ath12k_wmi_send_obss_spr_cmd(ar, arvif->vdev_id, in ath12k_bss_assoc()
3262 &bss_conf->he_obss_pd); in ath12k_bss_assoc()
3264 ath12k_warn(ar->ab, "failed to set vdev %i OBSS PD parameters: %d\n", in ath12k_bss_assoc()
3265 arvif->vdev_id, ret); in ath12k_bss_assoc()
3273 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_bss_disassoc()
3275 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %i disassoc bssid %pM\n", in ath12k_bss_disassoc()
3276 arvif->vdev_id, arvif->bssid); in ath12k_bss_disassoc()
3278 ret = ath12k_wmi_vdev_down(ar, arvif->vdev_id); in ath12k_bss_disassoc()
3280 ath12k_warn(ar->ab, "failed to down vdev %i: %d\n", in ath12k_bss_disassoc()
3281 arvif->vdev_id, ret); in ath12k_bss_disassoc()
3283 arvif->is_up = false; in ath12k_bss_disassoc()
3285 memset(&arvif->rekey_data, 0, sizeof(arvif->rekey_data)); in ath12k_bss_disassoc()
3287 cancel_delayed_work(&arvif->connection_loss_work); in ath12k_bss_disassoc()
3312 return -EINVAL; in ath12k_mac_get_rate_hw_value()
3319 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); in ath12k_recalculate_mgmt_rate()
3329 lockdep_assert_wiphy(hw->wiphy); in ath12k_recalculate_mgmt_rate()
3333 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()
3334 vif->addr, arvif->link_id); in ath12k_recalculate_mgmt_rate()
3338 sband = hw->wiphy->bands[def->chan->band]; in ath12k_recalculate_mgmt_rate()
3339 basic_rate_idx = ffs(bss_conf->basic_rates) - 1; in ath12k_recalculate_mgmt_rate()
3340 bitrate = sband->bitrates[basic_rate_idx].bitrate; in ath12k_recalculate_mgmt_rate()
3344 ath12k_warn(ar->ab, "bitrate not supported %d\n", bitrate); in ath12k_recalculate_mgmt_rate()
3349 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param, in ath12k_recalculate_mgmt_rate()
3352 ath12k_warn(ar->ab, "failed to set mgmt tx rate %d\n", ret); in ath12k_recalculate_mgmt_rate()
3355 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param, in ath12k_recalculate_mgmt_rate()
3358 ath12k_warn(ar->ab, "failed to set beacon tx rate %d\n", ret); in ath12k_recalculate_mgmt_rate()
3373 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); in ath12k_mac_fils_discovery()
3374 struct ath12k *ar = arvif->ar; in ath12k_mac_fils_discovery()
3381 if (info->fils_discovery.max_interval) { in ath12k_mac_fils_discovery()
3382 interval = info->fils_discovery.max_interval; in ath12k_mac_fils_discovery()
3386 ret = ath12k_wmi_fils_discovery_tmpl(ar, arvif->vdev_id, in ath12k_mac_fils_discovery()
3388 } else if (info->unsol_bcast_probe_resp_interval) { in ath12k_mac_fils_discovery()
3390 interval = info->unsol_bcast_probe_resp_interval; in ath12k_mac_fils_discovery()
3394 ret = ath12k_wmi_probe_resp_tmpl(ar, arvif->vdev_id, in ath12k_mac_fils_discovery()
3397 return ath12k_wmi_fils_discovery(ar, arvif->vdev_id, 0, false); in ath12k_mac_fils_discovery()
3401 ath12k_warn(ar->ab, in ath12k_mac_fils_discovery()
3403 arvif->vdev_id, (unsol_bcast_probe_resp_enabled ? in ath12k_mac_fils_discovery()
3406 return -EPERM; in ath12k_mac_fils_discovery()
3411 ret = ath12k_wmi_fils_discovery(ar, arvif->vdev_id, interval, in ath12k_mac_fils_discovery()
3422 unsigned long links = ahvif->links_map; in ath12k_mac_op_vif_cfg_changed()
3428 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_vif_cfg_changed()
3430 if (changed & BSS_CHANGED_SSID && vif->type == NL80211_IFTYPE_AP) { in ath12k_mac_op_vif_cfg_changed()
3431 ahvif->u.ap.ssid_len = vif->cfg.ssid_len; in ath12k_mac_op_vif_cfg_changed()
3432 if (vif->cfg.ssid_len) in ath12k_mac_op_vif_cfg_changed()
3433 memcpy(ahvif->u.ap.ssid, vif->cfg.ssid, vif->cfg.ssid_len); in ath12k_mac_op_vif_cfg_changed()
3438 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); in ath12k_mac_op_vif_cfg_changed()
3439 if (!arvif || !arvif->ar) in ath12k_mac_op_vif_cfg_changed()
3442 ar = arvif->ar; in ath12k_mac_op_vif_cfg_changed()
3444 if (vif->cfg.assoc) { in ath12k_mac_op_vif_cfg_changed()
3459 struct ath12k *ar = arvif->ar; in ath12k_mac_vif_setup_ps()
3460 struct ieee80211_vif *vif = arvif->ahvif->vif; in ath12k_mac_vif_setup_ps()
3461 struct ieee80211_conf *conf = &ath12k_ar_to_hw(ar)->conf; in ath12k_mac_vif_setup_ps()
3469 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_vif_setup_ps()
3471 if (vif->type != NL80211_IFTYPE_STATION) in ath12k_mac_vif_setup_ps()
3474 enable_ps = arvif->ahvif->ps; in ath12k_mac_vif_setup_ps()
3479 timeout = conf->dynamic_ps_timeout; in ath12k_mac_vif_setup_ps()
3483 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()
3484 vif->addr, arvif->link_id); in ath12k_mac_vif_setup_ps()
3489 timeout = ieee80211_tu_to_usec(info->beacon_int) / 1000; in ath12k_mac_vif_setup_ps()
3492 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param, in ath12k_mac_vif_setup_ps()
3495 ath12k_warn(ar->ab, "failed to set inactivity time for vdev %d: %i\n", in ath12k_mac_vif_setup_ps()
3496 arvif->vdev_id, ret); in ath12k_mac_vif_setup_ps()
3503 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %d psmode %s\n", in ath12k_mac_vif_setup_ps()
3504 arvif->vdev_id, psmode ? "enable" : "disable"); in ath12k_mac_vif_setup_ps()
3506 ret = ath12k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id, psmode); in ath12k_mac_vif_setup_ps()
3508 ath12k_warn(ar->ab, "failed to set sta power save mode %d for vdev %d: %d\n", in ath12k_mac_vif_setup_ps()
3509 psmode, arvif->vdev_id, ret); in ath12k_mac_vif_setup_ps()
3517 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_mac_bss_info_changed()
3519 struct ieee80211_vif_cfg *vif_cfg = &vif->cfg; in ath12k_mac_bss_info_changed()
3532 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_bss_info_changed()
3535 arvif->beacon_interval = info->beacon_int; in ath12k_mac_bss_info_changed()
3538 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_bss_info_changed()
3540 arvif->beacon_interval); in ath12k_mac_bss_info_changed()
3542 ath12k_warn(ar->ab, "Failed to set beacon interval for VDEV: %d\n", in ath12k_mac_bss_info_changed()
3543 arvif->vdev_id); in ath12k_mac_bss_info_changed()
3545 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_bss_info_changed()
3547 arvif->beacon_interval, arvif->vdev_id); in ath12k_mac_bss_info_changed()
3554 param_value, ar->pdev->pdev_id); in ath12k_mac_bss_info_changed()
3556 ath12k_warn(ar->ab, "Failed to set beacon mode for VDEV: %d\n", in ath12k_mac_bss_info_changed()
3557 arvif->vdev_id); in ath12k_mac_bss_info_changed()
3559 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_bss_info_changed()
3561 arvif->vdev_id); in ath12k_mac_bss_info_changed()
3565 ath12k_warn(ar->ab, "failed to update bcn template: %d\n", in ath12k_mac_bss_info_changed()
3570 arvif->dtim_period = info->dtim_period; in ath12k_mac_bss_info_changed()
3573 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_bss_info_changed()
3575 arvif->dtim_period); in ath12k_mac_bss_info_changed()
3578 ath12k_warn(ar->ab, "Failed to set dtim period for VDEV %d: %i\n", in ath12k_mac_bss_info_changed()
3579 arvif->vdev_id, ret); in ath12k_mac_bss_info_changed()
3581 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_bss_info_changed()
3583 arvif->dtim_period, arvif->vdev_id); in ath12k_mac_bss_info_changed()
3587 vif->type == NL80211_IFTYPE_AP) { in ath12k_mac_bss_info_changed()
3588 ahvif->u.ap.ssid_len = vif->cfg.ssid_len; in ath12k_mac_bss_info_changed()
3589 if (vif->cfg.ssid_len) in ath12k_mac_bss_info_changed()
3590 memcpy(ahvif->u.ap.ssid, vif->cfg.ssid, vif->cfg.ssid_len); in ath12k_mac_bss_info_changed()
3591 ahvif->u.ap.hidden_ssid = info->hidden_ssid; in ath12k_mac_bss_info_changed()
3594 if (changed & BSS_CHANGED_BSSID && !is_zero_ether_addr(info->bssid)) in ath12k_mac_bss_info_changed()
3595 ether_addr_copy(arvif->bssid, info->bssid); in ath12k_mac_bss_info_changed()
3600 if (arvif->is_up && info->he_support && in ath12k_mac_bss_info_changed()
3601 info->he_oper.params) { in ath12k_mac_bss_info_changed()
3603 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_bss_info_changed()
3607 ath12k_warn(ar->ab, in ath12k_mac_bss_info_changed()
3609 arvif->vdev_id); in ath12k_mac_bss_info_changed()
3612 param_value = info->he_oper.params; in ath12k_mac_bss_info_changed()
3613 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_bss_info_changed()
3615 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_bss_info_changed()
3617 param_value, arvif->vdev_id); in ath12k_mac_bss_info_changed()
3620 ath12k_warn(ar->ab, "Failed to set he oper params %x for VDEV %d: %i\n", in ath12k_mac_bss_info_changed()
3621 param_value, arvif->vdev_id, ret); in ath12k_mac_bss_info_changed()
3628 cts_prot = !!(info->use_cts_prot); in ath12k_mac_bss_info_changed()
3631 if (arvif->is_started) { in ath12k_mac_bss_info_changed()
3632 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_bss_info_changed()
3635 ath12k_warn(ar->ab, "Failed to set CTS prot for VDEV: %d\n", in ath12k_mac_bss_info_changed()
3636 arvif->vdev_id); in ath12k_mac_bss_info_changed()
3638 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "Set CTS prot: %d for VDEV: %d\n", in ath12k_mac_bss_info_changed()
3639 cts_prot, arvif->vdev_id); in ath12k_mac_bss_info_changed()
3641 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "defer protection mode setup, vdev is not ready yet\n"); in ath12k_mac_bss_info_changed()
3648 if (info->use_short_slot) in ath12k_mac_bss_info_changed()
3655 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_bss_info_changed()
3658 ath12k_warn(ar->ab, "Failed to set erp slot for VDEV: %d\n", in ath12k_mac_bss_info_changed()
3659 arvif->vdev_id); in ath12k_mac_bss_info_changed()
3661 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_bss_info_changed()
3663 slottime, arvif->vdev_id); in ath12k_mac_bss_info_changed()
3669 if (info->use_short_preamble) in ath12k_mac_bss_info_changed()
3675 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_bss_info_changed()
3678 ath12k_warn(ar->ab, "Failed to set preamble for VDEV: %d\n", in ath12k_mac_bss_info_changed()
3679 arvif->vdev_id); in ath12k_mac_bss_info_changed()
3681 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_bss_info_changed()
3683 preamble, arvif->vdev_id); in ath12k_mac_bss_info_changed()
3687 if (vif->cfg.assoc) in ath12k_mac_bss_info_changed()
3694 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev_id %i txpower %d\n", in ath12k_mac_bss_info_changed()
3695 arvif->vdev_id, info->txpower); in ath12k_mac_bss_info_changed()
3697 arvif->txpower = info->txpower; in ath12k_mac_bss_info_changed()
3702 !ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)) { in ath12k_mac_bss_info_changed()
3703 band = def.chan->band; in ath12k_mac_bss_info_changed()
3704 mcast_rate = info->mcast_rate[band]; in ath12k_mac_bss_info_changed()
3707 rateidx = mcast_rate - 1; in ath12k_mac_bss_info_changed()
3709 rateidx = ffs(info->basic_rates) - 1; in ath12k_mac_bss_info_changed()
3711 if (ar->pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) in ath12k_mac_bss_info_changed()
3724 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_bss_info_changed()
3726 arvif->vdev_id, rate); in ath12k_mac_bss_info_changed()
3729 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_bss_info_changed()
3732 ath12k_warn(ar->ab, in ath12k_mac_bss_info_changed()
3734 arvif->vdev_id, ret); in ath12k_mac_bss_info_changed()
3737 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_bss_info_changed()
3740 ath12k_warn(ar->ab, in ath12k_mac_bss_info_changed()
3742 arvif->vdev_id, ret); in ath12k_mac_bss_info_changed()
3746 !ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)) in ath12k_mac_bss_info_changed()
3750 if (info->twt_requester || info->twt_responder) in ath12k_mac_bss_info_changed()
3751 ath12k_wmi_send_twt_enable_cmd(ar, ar->pdev->pdev_id); in ath12k_mac_bss_info_changed()
3753 ath12k_wmi_send_twt_disable_cmd(ar, ar->pdev->pdev_id); in ath12k_mac_bss_info_changed()
3757 ath12k_wmi_send_obss_spr_cmd(ar, arvif->vdev_id, in ath12k_mac_bss_info_changed()
3758 &info->he_obss_pd); in ath12k_mac_bss_info_changed()
3761 if (vif->type == NL80211_IFTYPE_AP) { in ath12k_mac_bss_info_changed()
3763 arvif->vdev_id, in ath12k_mac_bss_info_changed()
3764 info->he_bss_color.color, in ath12k_mac_bss_info_changed()
3766 info->he_bss_color.enabled); in ath12k_mac_bss_info_changed()
3768 ath12k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n", in ath12k_mac_bss_info_changed()
3769 arvif->vdev_id, ret); in ath12k_mac_bss_info_changed()
3770 } else if (vif->type == NL80211_IFTYPE_STATION) { in ath12k_mac_bss_info_changed()
3772 arvif->vdev_id, in ath12k_mac_bss_info_changed()
3775 ath12k_warn(ar->ab, "failed to enable bss color change on vdev %i: %d\n", in ath12k_mac_bss_info_changed()
3776 arvif->vdev_id, ret); in ath12k_mac_bss_info_changed()
3778 arvif->vdev_id, in ath12k_mac_bss_info_changed()
3783 ath12k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n", in ath12k_mac_bss_info_changed()
3784 arvif->vdev_id, ret); in ath12k_mac_bss_info_changed()
3791 ar->ab->hw_params->supports_sta_ps) { in ath12k_mac_bss_info_changed()
3792 ahvif->ps = vif_cfg->ps; in ath12k_mac_bss_info_changed()
3800 if (!ahvif->cache[link_id]) { in ath12k_ahvif_get_link_cache()
3801 ahvif->cache[link_id] = kzalloc(sizeof(*ahvif->cache[0]), GFP_KERNEL); in ath12k_ahvif_get_link_cache()
3802 if (ahvif->cache[link_id]) in ath12k_ahvif_get_link_cache()
3803 INIT_LIST_HEAD(&ahvif->cache[link_id]->key_conf.list); in ath12k_ahvif_get_link_cache()
3806 return ahvif->cache[link_id]; in ath12k_ahvif_get_link_cache()
3813 if (!cache || list_empty(&cache->key_conf.list)) in ath12k_ahvif_put_link_key_cache()
3815 list_for_each_entry_safe(key_conf, tmp, &cache->key_conf.list, list) { in ath12k_ahvif_put_link_key_cache()
3816 list_del(&key_conf->list); in ath12k_ahvif_put_link_key_cache()
3826 ath12k_ahvif_put_link_key_cache(ahvif->cache[link_id]); in ath12k_ahvif_put_link_cache()
3827 kfree(ahvif->cache[link_id]); in ath12k_ahvif_put_link_cache()
3828 ahvif->cache[link_id] = NULL; in ath12k_ahvif_put_link_cache()
3840 u8 link_id = info->link_id; in ath12k_mac_op_link_info_changed()
3842 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_link_info_changed()
3844 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); in ath12k_mac_op_link_info_changed()
3850 if (!arvif || !arvif->is_created) { in ath12k_mac_op_link_info_changed()
3855 cache->bss_conf_changed |= changed; in ath12k_mac_op_link_info_changed()
3860 ar = arvif->ar; in ath12k_mac_op_link_info_changed()
3873 lockdep_assert_wiphy(ah->hw->wiphy); in ath12k_mac_assign_link_vif()
3875 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]); in ath12k_mac_assign_link_vif()
3879 if (!vif->valid_links) { in ath12k_mac_assign_link_vif()
3880 /* Use deflink for Non-ML VIFs and mark the link id as 0 in ath12k_mac_assign_link_vif()
3883 arvif = &ahvif->deflink; in ath12k_mac_assign_link_vif()
3888 if (!ahvif->links_map && link_id != ATH12K_DEFAULT_SCAN_LINK) { in ath12k_mac_assign_link_vif()
3889 arvif = &ahvif->deflink; in ath12k_mac_assign_link_vif()
3898 arvif->ahvif = ahvif; in ath12k_mac_assign_link_vif()
3899 arvif->link_id = link_id; in ath12k_mac_assign_link_vif()
3900 ahvif->links_map |= BIT(link_id); in ath12k_mac_assign_link_vif()
3902 INIT_LIST_HEAD(&arvif->list); in ath12k_mac_assign_link_vif()
3903 INIT_DELAYED_WORK(&arvif->connection_loss_work, in ath12k_mac_assign_link_vif()
3906 for (i = 0; i < ARRAY_SIZE(arvif->bitrate_mask.control); i++) { in ath12k_mac_assign_link_vif()
3907 arvif->bitrate_mask.control[i].legacy = 0xffffffff; in ath12k_mac_assign_link_vif()
3908 memset(arvif->bitrate_mask.control[i].ht_mcs, 0xff, in ath12k_mac_assign_link_vif()
3909 sizeof(arvif->bitrate_mask.control[i].ht_mcs)); in ath12k_mac_assign_link_vif()
3910 memset(arvif->bitrate_mask.control[i].vht_mcs, 0xff, in ath12k_mac_assign_link_vif()
3911 sizeof(arvif->bitrate_mask.control[i].vht_mcs)); in ath12k_mac_assign_link_vif()
3915 vif->cab_queue = ATH12K_HW_DEFAULT_QUEUE; in ath12k_mac_assign_link_vif()
3916 for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++) in ath12k_mac_assign_link_vif()
3917 vif->hw_queue[i] = ATH12K_HW_DEFAULT_QUEUE; in ath12k_mac_assign_link_vif()
3919 vif->driver_flags |= IEEE80211_VIF_SUPPORTS_UAPSD; in ath12k_mac_assign_link_vif()
3921 rcu_assign_pointer(ahvif->link[arvif->link_id], arvif); in ath12k_mac_assign_link_vif()
3922 ahvif->links_map |= BIT(link_id); in ath12k_mac_assign_link_vif()
3929 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_mac_unassign_link_vif()
3930 struct ath12k_hw *ah = ahvif->ah; in ath12k_mac_unassign_link_vif()
3932 lockdep_assert_wiphy(ah->hw->wiphy); in ath12k_mac_unassign_link_vif()
3934 rcu_assign_pointer(ahvif->link[arvif->link_id], NULL); in ath12k_mac_unassign_link_vif()
3936 ahvif->links_map &= ~BIT(arvif->link_id); in ath12k_mac_unassign_link_vif()
3938 if (arvif != &ahvif->deflink) in ath12k_mac_unassign_link_vif()
3947 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_mac_remove_link_interface()
3948 struct ath12k_hw *ah = hw->priv; in ath12k_mac_remove_link_interface()
3949 struct ath12k *ar = arvif->ar; in ath12k_mac_remove_link_interface()
3952 lockdep_assert_wiphy(ah->hw->wiphy); in ath12k_mac_remove_link_interface()
3954 cancel_delayed_work_sync(&arvif->connection_loss_work); in ath12k_mac_remove_link_interface()
3956 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac remove link interface (vdev %d link id %d)", in ath12k_mac_remove_link_interface()
3957 arvif->vdev_id, arvif->link_id); in ath12k_mac_remove_link_interface()
3959 if (ahvif->vdev_type == WMI_VDEV_TYPE_AP) { in ath12k_mac_remove_link_interface()
3960 ret = ath12k_peer_delete(ar, arvif->vdev_id, arvif->bssid); in ath12k_mac_remove_link_interface()
3962 ath12k_warn(ar->ab, "failed to submit AP self-peer removal on vdev %d link id %d: %d", in ath12k_mac_remove_link_interface()
3963 arvif->vdev_id, arvif->link_id, ret); in ath12k_mac_remove_link_interface()
3973 struct ath12k_hw *ah = hw->priv; in ath12k_mac_select_scan_device()
3978 if (ah->num_radio == 1) in ath12k_mac_select_scan_device()
3979 return ah->radio; in ath12k_mac_select_scan_device()
3997 if (ar->mac.sbands[band].channels) in ath12k_mac_select_scan_device()
4008 lockdep_assert_held(&ar->data_lock); in __ath12k_mac_scan_finish()
4010 switch (ar->scan.state) { in __ath12k_mac_scan_finish()
4015 if (ar->scan.is_roc && ar->scan.roc_notify) in __ath12k_mac_scan_finish()
4019 cancel_delayed_work(&ar->scan.timeout); in __ath12k_mac_scan_finish()
4020 complete(&ar->scan.completed); in __ath12k_mac_scan_finish()
4021 wiphy_work_queue(ar->ah->hw->wiphy, &ar->scan.vdev_clean_wk); in __ath12k_mac_scan_finish()
4028 spin_lock_bh(&ar->data_lock); in ath12k_mac_scan_finish()
4030 spin_unlock_bh(&ar->data_lock); in ath12k_mac_scan_finish()
4041 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_scan_stop()
4044 arg.pdev_id = ar->pdev->pdev_id; in ath12k_scan_stop()
4048 ath12k_warn(ar->ab, "failed to stop wmi scan: %d\n", ret); in ath12k_scan_stop()
4052 ret = wait_for_completion_timeout(&ar->scan.completed, 3 * HZ); in ath12k_scan_stop()
4054 ath12k_warn(ar->ab, in ath12k_scan_stop()
4056 ret = -ETIMEDOUT; in ath12k_scan_stop()
4069 spin_lock_bh(&ar->data_lock); in ath12k_scan_stop()
4072 spin_unlock_bh(&ar->data_lock); in ath12k_scan_stop()
4081 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_scan_abort()
4083 spin_lock_bh(&ar->data_lock); in ath12k_scan_abort()
4085 switch (ar->scan.state) { in ath12k_scan_abort()
4093 ath12k_warn(ar->ab, "refusing scan abortion due to invalid scan state: %d\n", in ath12k_scan_abort()
4094 ar->scan.state); in ath12k_scan_abort()
4097 ar->scan.state = ATH12K_SCAN_ABORTING; in ath12k_scan_abort()
4098 spin_unlock_bh(&ar->data_lock); in ath12k_scan_abort()
4102 ath12k_warn(ar->ab, "failed to abort scan: %d\n", ret); in ath12k_scan_abort()
4104 spin_lock_bh(&ar->data_lock); in ath12k_scan_abort()
4108 spin_unlock_bh(&ar->data_lock); in ath12k_scan_abort()
4116 wiphy_lock(ath12k_ar_to_hw(ar)->wiphy); in ath12k_scan_timeout_work()
4118 wiphy_unlock(ath12k_ar_to_hw(ar)->wiphy); in ath12k_scan_timeout_work()
4125 struct ath12k_hw *ah = ar->ah; in ath12k_scan_vdev_clean_work()
4130 arvif = ar->scan.arvif; in ath12k_scan_vdev_clean_work()
4139 if (!arvif || arvif->is_started) in ath12k_scan_vdev_clean_work()
4142 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac clean scan vdev (link id %u)", in ath12k_scan_vdev_clean_work()
4143 arvif->link_id); in ath12k_scan_vdev_clean_work()
4145 ath12k_mac_remove_link_interface(ah->hw, arvif); in ath12k_scan_vdev_clean_work()
4149 spin_lock_bh(&ar->data_lock); in ath12k_scan_vdev_clean_work()
4150 ar->scan.arvif = NULL; in ath12k_scan_vdev_clean_work()
4151 if (!ar->scan.is_roc) { in ath12k_scan_vdev_clean_work()
4153 .aborted = ((ar->scan.state == in ath12k_scan_vdev_clean_work()
4155 (ar->scan.state == in ath12k_scan_vdev_clean_work()
4159 ieee80211_scan_completed(ar->ah->hw, &info); in ath12k_scan_vdev_clean_work()
4162 ar->scan.state = ATH12K_SCAN_IDLE; in ath12k_scan_vdev_clean_work()
4163 ar->scan_channel = NULL; in ath12k_scan_vdev_clean_work()
4164 ar->scan.roc_freq = 0; in ath12k_scan_vdev_clean_work()
4165 spin_unlock_bh(&ar->data_lock); in ath12k_scan_vdev_clean_work()
4173 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_start_scan()
4179 ret = wait_for_completion_timeout(&ar->scan.started, 1 * HZ); in ath12k_start_scan()
4183 ath12k_warn(ar->ab, "failed to stop scan: %d\n", ret); in ath12k_start_scan()
4185 return -ETIMEDOUT; in ath12k_start_scan()
4192 spin_lock_bh(&ar->data_lock); in ath12k_start_scan()
4193 if (ar->scan.state == ATH12K_SCAN_IDLE) { in ath12k_start_scan()
4194 spin_unlock_bh(&ar->data_lock); in ath12k_start_scan()
4195 return -EINVAL; in ath12k_start_scan()
4197 spin_unlock_bh(&ar->data_lock); in ath12k_start_scan()
4206 struct ath12k_hw *ah = ahvif->ah; in ath12k_mac_find_link_id_by_ar()
4207 unsigned long links = ahvif->links_map; in ath12k_mac_find_link_id_by_ar()
4210 lockdep_assert_wiphy(ah->hw->wiphy); in ath12k_mac_find_link_id_by_ar()
4213 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]); in ath12k_mac_find_link_id_by_ar()
4215 if (!arvif || !arvif->is_created) in ath12k_mac_find_link_id_by_ar()
4218 if (ar == arvif->ar) in ath12k_mac_find_link_id_by_ar()
4236 struct cfg80211_scan_request *req = &hw_req->req; in ath12k_mac_op_hw_scan()
4243 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_hw_scan()
4245 arvif = &ahvif->deflink; in ath12k_mac_op_hw_scan()
4250 ar = ath12k_mac_select_scan_device(hw, vif, hw_req->req.channels[0]->center_freq); in ath12k_mac_op_hw_scan()
4252 return -EINVAL; in ath12k_mac_op_hw_scan()
4261 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac link ID %d selected for scan", in ath12k_mac_op_hw_scan()
4262 arvif->link_id); in ath12k_mac_op_hw_scan()
4270 * delete-create vdev's for the same ar, in case the request is in ath12k_mac_op_hw_scan()
4273 if (arvif->is_created) { in ath12k_mac_op_hw_scan()
4274 if (WARN_ON(!arvif->ar)) in ath12k_mac_op_hw_scan()
4275 return -EINVAL; in ath12k_mac_op_hw_scan()
4277 if (ar != arvif->ar && arvif->is_started) in ath12k_mac_op_hw_scan()
4278 return -EINVAL; in ath12k_mac_op_hw_scan()
4280 if (ar != arvif->ar) { in ath12k_mac_op_hw_scan()
4296 ath12k_warn(ar->ab, "unable to create scan vdev %d\n", ret); in ath12k_mac_op_hw_scan()
4297 return -EINVAL; in ath12k_mac_op_hw_scan()
4301 spin_lock_bh(&ar->data_lock); in ath12k_mac_op_hw_scan()
4302 switch (ar->scan.state) { in ath12k_mac_op_hw_scan()
4304 reinit_completion(&ar->scan.started); in ath12k_mac_op_hw_scan()
4305 reinit_completion(&ar->scan.completed); in ath12k_mac_op_hw_scan()
4306 ar->scan.state = ATH12K_SCAN_STARTING; in ath12k_mac_op_hw_scan()
4307 ar->scan.is_roc = false; in ath12k_mac_op_hw_scan()
4308 ar->scan.arvif = arvif; in ath12k_mac_op_hw_scan()
4314 ret = -EBUSY; in ath12k_mac_op_hw_scan()
4317 spin_unlock_bh(&ar->data_lock); in ath12k_mac_op_hw_scan()
4324 ret = -ENOMEM; in ath12k_mac_op_hw_scan()
4329 arg->vdev_id = arvif->vdev_id; in ath12k_mac_op_hw_scan()
4330 arg->scan_id = ATH12K_SCAN_ID; in ath12k_mac_op_hw_scan()
4332 if (req->ie_len) { in ath12k_mac_op_hw_scan()
4333 arg->extraie.ptr = kmemdup(req->ie, req->ie_len, GFP_KERNEL); in ath12k_mac_op_hw_scan()
4334 if (!arg->extraie.ptr) { in ath12k_mac_op_hw_scan()
4335 ret = -ENOMEM; in ath12k_mac_op_hw_scan()
4338 arg->extraie.len = req->ie_len; in ath12k_mac_op_hw_scan()
4341 if (req->n_ssids) { in ath12k_mac_op_hw_scan()
4342 arg->num_ssids = req->n_ssids; in ath12k_mac_op_hw_scan()
4343 for (i = 0; i < arg->num_ssids; i++) in ath12k_mac_op_hw_scan()
4344 arg->ssid[i] = req->ssids[i]; in ath12k_mac_op_hw_scan()
4346 arg->scan_f_passive = 1; in ath12k_mac_op_hw_scan()
4349 if (req->n_channels) { in ath12k_mac_op_hw_scan()
4350 arg->num_chan = req->n_channels; in ath12k_mac_op_hw_scan()
4351 arg->chan_list = kcalloc(arg->num_chan, sizeof(*arg->chan_list), in ath12k_mac_op_hw_scan()
4353 if (!arg->chan_list) { in ath12k_mac_op_hw_scan()
4354 ret = -ENOMEM; in ath12k_mac_op_hw_scan()
4358 for (i = 0; i < arg->num_chan; i++) in ath12k_mac_op_hw_scan()
4359 arg->chan_list[i] = req->channels[i]->center_freq; in ath12k_mac_op_hw_scan()
4364 ath12k_warn(ar->ab, "failed to start hw scan: %d\n", ret); in ath12k_mac_op_hw_scan()
4365 spin_lock_bh(&ar->data_lock); in ath12k_mac_op_hw_scan()
4366 ar->scan.state = ATH12K_SCAN_IDLE; in ath12k_mac_op_hw_scan()
4367 spin_unlock_bh(&ar->data_lock); in ath12k_mac_op_hw_scan()
4370 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac scan started"); in ath12k_mac_op_hw_scan()
4377 ahvif->last_scan_link = arvif->link_id; in ath12k_mac_op_hw_scan()
4380 ieee80211_queue_delayed_work(ath12k_ar_to_hw(ar), &ar->scan.timeout, in ath12k_mac_op_hw_scan()
4381 msecs_to_jiffies(arg->max_scan_time + in ath12k_mac_op_hw_scan()
4386 kfree(arg->chan_list); in ath12k_mac_op_hw_scan()
4387 kfree(arg->extraie.ptr); in ath12k_mac_op_hw_scan()
4398 u16 link_id = ahvif->last_scan_link; in ath12k_mac_op_cancel_hw_scan()
4402 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_cancel_hw_scan()
4404 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); in ath12k_mac_op_cancel_hw_scan()
4405 if (!arvif || arvif->is_started) in ath12k_mac_op_cancel_hw_scan()
4408 ar = arvif->ar; in ath12k_mac_op_cancel_hw_scan()
4412 cancel_delayed_work_sync(&ar->scan.timeout); in ath12k_mac_op_cancel_hw_scan()
4421 struct ath12k *ar = arvif->ar; in ath12k_install_key()
4423 .vdev_id = arvif->vdev_id, in ath12k_install_key()
4424 .key_idx = key->keyidx, in ath12k_install_key()
4425 .key_len = key->keylen, in ath12k_install_key()
4426 .key_data = key->key, in ath12k_install_key()
4430 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_install_key()
4433 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_install_key()
4435 reinit_completion(&ar->install_key_done); in ath12k_install_key()
4437 if (test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags)) in ath12k_install_key()
4448 switch (key->cipher) { in ath12k_install_key()
4451 /* TODO: Re-check if flag is valid */ in ath12k_install_key()
4452 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT; in ath12k_install_key()
4467 ath12k_warn(ar->ab, "cipher %d is not supported\n", key->cipher); in ath12k_install_key()
4468 return -EOPNOTSUPP; in ath12k_install_key()
4471 if (test_bit(ATH12K_FLAG_RAW_MODE, &ar->ab->dev_flags)) in ath12k_install_key()
4472 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV | in ath12k_install_key()
4476 ret = ath12k_wmi_vdev_install_key(arvif->ar, &arg); in ath12k_install_key()
4481 if (!wait_for_completion_timeout(&ar->install_key_done, 1 * HZ)) in ath12k_install_key()
4482 return -ETIMEDOUT; in ath12k_install_key()
4484 if (ether_addr_equal(macaddr, vif->addr)) in ath12k_install_key()
4485 ahvif->key_cipher = key->cipher; in ath12k_install_key()
4487 return ar->install_key_status ? -EINVAL : 0; in ath12k_install_key()
4493 struct ath12k *ar = arvif->ar; in ath12k_clear_peer_keys()
4494 struct ath12k_base *ab = ar->ab; in ath12k_clear_peer_keys()
4501 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_clear_peer_keys()
4503 spin_lock_bh(&ab->base_lock); in ath12k_clear_peer_keys()
4504 peer = ath12k_peer_find(ab, arvif->vdev_id, addr); in ath12k_clear_peer_keys()
4505 spin_unlock_bh(&ab->base_lock); in ath12k_clear_peer_keys()
4508 return -ENOENT; in ath12k_clear_peer_keys()
4510 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) { in ath12k_clear_peer_keys()
4511 if (!peer->keys[i]) in ath12k_clear_peer_keys()
4515 ret = ath12k_install_key(arvif, peer->keys[i], in ath12k_clear_peer_keys()
4524 spin_lock_bh(&ab->base_lock); in ath12k_clear_peer_keys()
4525 peer->keys[i] = NULL; in ath12k_clear_peer_keys()
4526 spin_unlock_bh(&ab->base_lock); in ath12k_clear_peer_keys()
4537 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_mac_set_key()
4541 struct ath12k_base *ab = ar->ab; in ath12k_mac_set_key()
4548 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_set_key()
4551 sta = ath12k_ahsta_to_sta(arsta->ahsta); in ath12k_mac_set_key()
4553 if (test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ab->dev_flags)) in ath12k_mac_set_key()
4559 vif->addr, arvif->link_id); in ath12k_mac_set_key()
4560 return -ENOLINK; in ath12k_mac_set_key()
4564 peer_addr = arsta->addr; in ath12k_mac_set_key()
4565 else if (ahvif->vdev_type == WMI_VDEV_TYPE_STA) in ath12k_mac_set_key()
4566 peer_addr = link_conf->bssid; in ath12k_mac_set_key()
4568 peer_addr = link_conf->addr; in ath12k_mac_set_key()
4570 key->hw_key_idx = key->keyidx; in ath12k_mac_set_key()
4572 /* the peer should not disappear in mid-way (unless FW goes awry) since in ath12k_mac_set_key()
4575 spin_lock_bh(&ab->base_lock); in ath12k_mac_set_key()
4576 peer = ath12k_peer_find(ab, arvif->vdev_id, peer_addr); in ath12k_mac_set_key()
4577 spin_unlock_bh(&ab->base_lock); in ath12k_mac_set_key()
4581 ath12k_warn(ab, "cannot install key for non-existent peer %pM\n", in ath12k_mac_set_key()
4583 return -EOPNOTSUPP; in ath12k_mac_set_key()
4592 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) in ath12k_mac_set_key()
4609 spin_lock_bh(&ab->base_lock); in ath12k_mac_set_key()
4610 peer = ath12k_peer_find(ab, arvif->vdev_id, peer_addr); in ath12k_mac_set_key()
4612 peer->keys[key->keyidx] = key; in ath12k_mac_set_key()
4613 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) { in ath12k_mac_set_key()
4614 peer->ucast_keyidx = key->keyidx; in ath12k_mac_set_key()
4615 peer->sec_type = ath12k_dp_tx_get_encrypt_type(key->cipher); in ath12k_mac_set_key()
4617 peer->mcast_keyidx = key->keyidx; in ath12k_mac_set_key()
4618 peer->sec_type_grp = ath12k_dp_tx_get_encrypt_type(key->cipher); in ath12k_mac_set_key()
4621 peer->keys[key->keyidx] = NULL; in ath12k_mac_set_key()
4622 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) in ath12k_mac_set_key()
4623 peer->ucast_keyidx = 0; in ath12k_mac_set_key()
4625 peer->mcast_keyidx = 0; in ath12k_mac_set_key()
4633 switch (key->cipher) { in ath12k_mac_set_key()
4640 ahsta->pn_type = HAL_PN_TYPE_WPA; in ath12k_mac_set_key()
4642 ahsta->pn_type = HAL_PN_TYPE_NONE; in ath12k_mac_set_key()
4645 ahsta->pn_type = HAL_PN_TYPE_NONE; in ath12k_mac_set_key()
4650 spin_unlock_bh(&ab->base_lock); in ath12k_mac_set_key()
4662 list_for_each_entry_safe(key_conf, tmp, &cache->key_conf.list, list) { in ath12k_mac_update_key_cache()
4663 if (key_conf->key != key) in ath12k_mac_update_key_cache()
4674 list_del(&key_conf->list); in ath12k_mac_update_key_cache()
4682 return -ENOMEM; in ath12k_mac_update_key_cache()
4684 key_conf->cmd = cmd; in ath12k_mac_update_key_cache()
4685 key_conf->sta = sta; in ath12k_mac_update_key_cache()
4686 key_conf->key = key; in ath12k_mac_update_key_cache()
4687 list_add_tail(&key_conf->list, in ath12k_mac_update_key_cache()
4688 &cache->key_conf.list); in ath12k_mac_update_key_cache()
4707 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_set_key()
4710 if (key->cipher == WLAN_CIPHER_SUITE_AES_CMAC || in ath12k_mac_op_set_key()
4711 key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_128 || in ath12k_mac_op_set_key()
4712 key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_256 || in ath12k_mac_op_set_key()
4713 key->cipher == WLAN_CIPHER_SUITE_BIP_CMAC_256) { in ath12k_mac_op_set_key()
4717 if (key->keyidx > WMI_MAX_KEY_INDEX) in ath12k_mac_op_set_key()
4718 return -ENOSPC; in ath12k_mac_op_set_key()
4726 if (sta->mlo) { in ath12k_mac_op_set_key()
4727 links = ahsta->links_map; in ath12k_mac_op_set_key()
4729 arvif = wiphy_dereference(hw->wiphy, in ath12k_mac_op_set_key()
4730 ahvif->link[link_id]); in ath12k_mac_op_set_key()
4731 arsta = wiphy_dereference(hw->wiphy, in ath12k_mac_op_set_key()
4732 ahsta->link[link_id]); in ath12k_mac_op_set_key()
4740 ret = ath12k_mac_set_key(arvif->ar, cmd, arvif, in ath12k_mac_op_set_key()
4749 arsta = &ahsta->deflink; in ath12k_mac_op_set_key()
4750 arvif = arsta->arvif; in ath12k_mac_op_set_key()
4752 return -EINVAL; in ath12k_mac_op_set_key()
4754 ret = ath12k_mac_set_key(arvif->ar, cmd, arvif, arsta, key); in ath12k_mac_op_set_key()
4761 if (key->link_id >= 0 && key->link_id < IEEE80211_MLD_MAX_NUM_LINKS) { in ath12k_mac_op_set_key()
4762 link_id = key->link_id; in ath12k_mac_op_set_key()
4763 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); in ath12k_mac_op_set_key()
4766 arvif = &ahvif->deflink; in ath12k_mac_op_set_key()
4769 if (!arvif || !arvif->is_created) { in ath12k_mac_op_set_key()
4772 return -ENOSPC; in ath12k_mac_op_set_key()
4781 ret = ath12k_mac_set_key(arvif->ar, cmd, arvif, NULL, key); in ath12k_mac_op_set_key()
4796 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) in ath12k_mac_bitrate_mask_num_vht_rates()
4797 num_rates += hweight16(mask->control[band].vht_mcs[i]); in ath12k_mac_bitrate_mask_num_vht_rates()
4808 struct ath12k *ar = arvif->ar; in ath12k_mac_set_peer_vht_fixed_rate()
4813 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_set_peer_vht_fixed_rate()
4817 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) { in ath12k_mac_set_peer_vht_fixed_rate()
4818 if (hweight16(mask->control[band].vht_mcs[i]) == 1) { in ath12k_mac_set_peer_vht_fixed_rate()
4820 vht_rate = ffs(mask->control[band].vht_mcs[i]) - 1; in ath12k_mac_set_peer_vht_fixed_rate()
4825 ath12k_warn(ar->ab, "No single VHT Fixed rate found to set for %pM", in ath12k_mac_set_peer_vht_fixed_rate()
4826 arsta->addr); in ath12k_mac_set_peer_vht_fixed_rate()
4827 return -EINVAL; in ath12k_mac_set_peer_vht_fixed_rate()
4830 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_set_peer_vht_fixed_rate()
4831 "Setting Fixed VHT Rate for peer %pM. Device will not switch to any other selected rates", in ath12k_mac_set_peer_vht_fixed_rate()
4832 arsta->addr); in ath12k_mac_set_peer_vht_fixed_rate()
4834 rate_code = ATH12K_HW_RATE_CODE(vht_rate, nss - 1, in ath12k_mac_set_peer_vht_fixed_rate()
4836 ret = ath12k_wmi_set_peer_param(ar, arsta->addr, in ath12k_mac_set_peer_vht_fixed_rate()
4837 arvif->vdev_id, in ath12k_mac_set_peer_vht_fixed_rate()
4841 ath12k_warn(ar->ab, in ath12k_mac_set_peer_vht_fixed_rate()
4843 arsta->addr, rate_code, ret); in ath12k_mac_set_peer_vht_fixed_rate()
4853 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); in ath12k_mac_station_assoc()
4854 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); in ath12k_mac_station_assoc()
4861 u8 link_id = arvif->link_id; in ath12k_mac_station_assoc()
4863 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_station_assoc()
4865 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) in ath12k_mac_station_assoc()
4866 return -EPERM; in ath12k_mac_station_assoc()
4868 if (WARN_ON(!rcu_access_pointer(sta->link[link_id]))) in ath12k_mac_station_assoc()
4869 return -EINVAL; in ath12k_mac_station_assoc()
4871 band = def.chan->band; in ath12k_mac_station_assoc()
4872 mask = &arvif->bitrate_mask; in ath12k_mac_station_assoc()
4877 return -ENOMEM; in ath12k_mac_station_assoc()
4881 if (peer_arg->peer_nss < 1) { in ath12k_mac_station_assoc()
4882 ath12k_warn(ar->ab, in ath12k_mac_station_assoc()
4883 "invalid peer NSS %d\n", peer_arg->peer_nss); in ath12k_mac_station_assoc()
4884 return -EINVAL; in ath12k_mac_station_assoc()
4888 ath12k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n", in ath12k_mac_station_assoc()
4889 arsta->addr, arvif->vdev_id, ret); in ath12k_mac_station_assoc()
4893 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) { in ath12k_mac_station_assoc()
4894 ath12k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n", in ath12k_mac_station_assoc()
4895 arsta->addr, arvif->vdev_id); in ath12k_mac_station_assoc()
4896 return -ETIMEDOUT; in ath12k_mac_station_assoc()
4904 * Note that all other rates and NSS will be disabled for this peer. in ath12k_mac_station_assoc()
4908 ath12k_warn(ar->ab, "unable to access link sta in station assoc\n"); in ath12k_mac_station_assoc()
4909 return -EINVAL; in ath12k_mac_station_assoc()
4912 if (link_sta->vht_cap.vht_supported && num_vht_rates == 1) { in ath12k_mac_station_assoc()
4919 /* Re-assoc is run only to update supported rates for given station. It in ath12k_mac_station_assoc()
4925 ret = ath12k_setup_peer_smps(ar, arvif, arsta->addr, in ath12k_mac_station_assoc()
4926 &link_sta->ht_cap, &link_sta->he_6ghz_capa); in ath12k_mac_station_assoc()
4928 ath12k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n", in ath12k_mac_station_assoc()
4929 arvif->vdev_id, ret); in ath12k_mac_station_assoc()
4933 if (!sta->wme) { in ath12k_mac_station_assoc()
4934 arvif->num_legacy_stations++; in ath12k_mac_station_assoc()
4940 if (sta->wme && sta->uapsd_queues) { in ath12k_mac_station_assoc()
4943 ath12k_warn(ar->ab, "failed to set qos params for STA %pM for vdev %i: %d\n", in ath12k_mac_station_assoc()
4944 arsta->addr, arvif->vdev_id, ret); in ath12k_mac_station_assoc()
4956 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); in ath12k_mac_station_disassoc()
4958 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_station_disassoc()
4960 if (!sta->wme) { in ath12k_mac_station_disassoc()
4961 arvif->num_legacy_stations--; in ath12k_mac_station_disassoc()
4988 sta = ath12k_ahsta_to_sta(arsta->ahsta); in ath12k_sta_rc_update_wk()
4989 arvif = arsta->arvif; in ath12k_sta_rc_update_wk()
4990 vif = ath12k_ahvif_to_vif(arvif->ahvif); in ath12k_sta_rc_update_wk()
4991 ar = arvif->ar; in ath12k_sta_rc_update_wk()
4993 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) in ath12k_sta_rc_update_wk()
4996 band = def.chan->band; in ath12k_sta_rc_update_wk()
4997 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs; in ath12k_sta_rc_update_wk()
4998 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs; in ath12k_sta_rc_update_wk()
5000 spin_lock_bh(&ar->data_lock); in ath12k_sta_rc_update_wk()
5002 changed = arsta->changed; in ath12k_sta_rc_update_wk()
5003 arsta->changed = 0; in ath12k_sta_rc_update_wk()
5005 bw = arsta->bw; in ath12k_sta_rc_update_wk()
5006 bw_prev = arsta->bw_prev; in ath12k_sta_rc_update_wk()
5007 nss = arsta->nss; in ath12k_sta_rc_update_wk()
5008 smps = arsta->smps; in ath12k_sta_rc_update_wk()
5010 spin_unlock_bh(&ar->data_lock); in ath12k_sta_rc_update_wk()
5023 peer_phymode = peer_arg->peer_phymode; in ath12k_sta_rc_update_wk()
5031 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac bandwidth upgrade for sta %pM new %d old %d\n", in ath12k_sta_rc_update_wk()
5032 arsta->addr, bw, bw_prev); in ath12k_sta_rc_update_wk()
5033 err = ath12k_wmi_set_peer_param(ar, arsta->addr, in ath12k_sta_rc_update_wk()
5034 arvif->vdev_id, WMI_PEER_PHYMODE, in ath12k_sta_rc_update_wk()
5037 ath12k_warn(ar->ab, "failed to update STA %pM to peer phymode %d: %d\n", in ath12k_sta_rc_update_wk()
5038 arsta->addr, peer_phymode, err); in ath12k_sta_rc_update_wk()
5041 err = ath12k_wmi_set_peer_param(ar, arsta->addr, in ath12k_sta_rc_update_wk()
5042 arvif->vdev_id, WMI_PEER_CHWIDTH, in ath12k_sta_rc_update_wk()
5045 ath12k_warn(ar->ab, "failed to update STA %pM to peer bandwidth %d: %d\n", in ath12k_sta_rc_update_wk()
5046 arsta->addr, bw, err); in ath12k_sta_rc_update_wk()
5052 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac bandwidth downgrade for sta %pM new %d old %d\n", in ath12k_sta_rc_update_wk()
5053 arsta->addr, bw, bw_prev); in ath12k_sta_rc_update_wk()
5054 err = ath12k_wmi_set_peer_param(ar, arsta->addr, in ath12k_sta_rc_update_wk()
5055 arvif->vdev_id, WMI_PEER_CHWIDTH, in ath12k_sta_rc_update_wk()
5058 ath12k_warn(ar->ab, "failed to update STA %pM peer to bandwidth %d: %d\n", in ath12k_sta_rc_update_wk()
5059 arsta->addr, bw, err); in ath12k_sta_rc_update_wk()
5062 err = ath12k_wmi_set_peer_param(ar, arsta->addr, in ath12k_sta_rc_update_wk()
5063 arvif->vdev_id, WMI_PEER_PHYMODE, in ath12k_sta_rc_update_wk()
5066 ath12k_warn(ar->ab, "failed to update STA %pM to peer phymode %d: %d\n", in ath12k_sta_rc_update_wk()
5067 arsta->addr, peer_phymode, err); in ath12k_sta_rc_update_wk()
5072 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac update sta %pM nss %d\n", in ath12k_sta_rc_update_wk()
5073 arsta->addr, nss); in ath12k_sta_rc_update_wk()
5075 err = ath12k_wmi_set_peer_param(ar, arsta->addr, arvif->vdev_id, in ath12k_sta_rc_update_wk()
5078 ath12k_warn(ar->ab, "failed to update STA %pM nss %d: %d\n", in ath12k_sta_rc_update_wk()
5079 arsta->addr, nss, err); in ath12k_sta_rc_update_wk()
5083 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac update sta %pM smps %d\n", in ath12k_sta_rc_update_wk()
5084 arsta->addr, smps); in ath12k_sta_rc_update_wk()
5086 err = ath12k_wmi_set_peer_param(ar, arsta->addr, arvif->vdev_id, in ath12k_sta_rc_update_wk()
5089 ath12k_warn(ar->ab, "failed to update STA %pM smps %d: %d\n", in ath12k_sta_rc_update_wk()
5090 arsta->addr, smps, err); in ath12k_sta_rc_update_wk()
5094 mask = &arvif->bitrate_mask; in ath12k_sta_rc_update_wk()
5098 /* Peer_assoc_prepare will reject vht rates in in ath12k_sta_rc_update_wk()
5102 * But, Single rate in VHT mask can be set as per-peer in ath12k_sta_rc_update_wk()
5103 * fixed rate. But even if any HT rates are configured in in ath12k_sta_rc_update_wk()
5104 * the bitrate mask, device will not switch to those rates in ath12k_sta_rc_update_wk()
5105 * when per-peer Fixed rate is set. in ath12k_sta_rc_update_wk()
5106 * TODO: Check RATEMASK_CMDID to support auto rates selection in ath12k_sta_rc_update_wk()
5111 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()
5112 sta->addr, arsta->link_id); in ath12k_sta_rc_update_wk()
5116 if (link_sta->vht_cap.vht_supported && num_vht_rates == 1) { in ath12k_sta_rc_update_wk()
5120 /* If the peer is non-VHT or no fixed VHT rate in ath12k_sta_rc_update_wk()
5122 * other rates using peer_assoc command. in ath12k_sta_rc_update_wk()
5129 ath12k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n", in ath12k_sta_rc_update_wk()
5130 arsta->addr, arvif->vdev_id, err); in ath12k_sta_rc_update_wk()
5132 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) in ath12k_sta_rc_update_wk()
5133 ath12k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n", in ath12k_sta_rc_update_wk()
5134 arsta->addr, arvif->vdev_id); in ath12k_sta_rc_update_wk()
5145 lockdep_assert_wiphy(ah->hw->wiphy); in ath12k_mac_free_unassign_link_sta()
5150 arsta = wiphy_dereference(ah->hw->wiphy, ahsta->link[link_id]); in ath12k_mac_free_unassign_link_sta()
5154 ahsta->links_map &= ~BIT(link_id); in ath12k_mac_free_unassign_link_sta()
5155 rcu_assign_pointer(ahsta->link[link_id], NULL); in ath12k_mac_free_unassign_link_sta()
5158 if (arsta == &ahsta->deflink) { in ath12k_mac_free_unassign_link_sta()
5159 arsta->link_id = ATH12K_INVALID_LINK_ID; in ath12k_mac_free_unassign_link_sta()
5160 arsta->ahsta = NULL; in ath12k_mac_free_unassign_link_sta()
5161 arsta->arvif = NULL; in ath12k_mac_free_unassign_link_sta()
5171 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); in ath12k_mac_inc_num_stations()
5172 struct ath12k *ar = arvif->ar; in ath12k_mac_inc_num_stations()
5174 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_inc_num_stations()
5176 if (arvif->ahvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls) in ath12k_mac_inc_num_stations()
5179 if (ar->num_stations >= ar->max_num_stations) in ath12k_mac_inc_num_stations()
5180 return -ENOBUFS; in ath12k_mac_inc_num_stations()
5182 ar->num_stations++; in ath12k_mac_inc_num_stations()
5190 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); in ath12k_mac_dec_num_stations()
5191 struct ath12k *ar = arvif->ar; in ath12k_mac_dec_num_stations()
5193 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_dec_num_stations()
5195 if (arvif->ahvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls) in ath12k_mac_dec_num_stations()
5198 ar->num_stations--; in ath12k_mac_dec_num_stations()
5205 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); in ath12k_mac_station_post_remove()
5206 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); in ath12k_mac_station_post_remove()
5209 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_station_post_remove()
5213 spin_lock_bh(&ar->ab->base_lock); in ath12k_mac_station_post_remove()
5215 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arsta->addr); in ath12k_mac_station_post_remove()
5216 if (peer && peer->sta == sta) { in ath12k_mac_station_post_remove()
5217 ath12k_warn(ar->ab, "Found peer entry %pM n vdev %i after it was supposedly removed\n", in ath12k_mac_station_post_remove()
5218 vif->addr, arvif->vdev_id); in ath12k_mac_station_post_remove()
5219 peer->sta = NULL; in ath12k_mac_station_post_remove()
5220 list_del(&peer->list); in ath12k_mac_station_post_remove()
5222 ar->num_peers--; in ath12k_mac_station_post_remove()
5225 spin_unlock_bh(&ar->ab->base_lock); in ath12k_mac_station_post_remove()
5227 kfree(arsta->rx_stats); in ath12k_mac_station_post_remove()
5228 arsta->rx_stats = NULL; in ath12k_mac_station_post_remove()
5238 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_station_unauthorize()
5240 spin_lock_bh(&ar->ab->base_lock); in ath12k_mac_station_unauthorize()
5242 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arsta->addr); in ath12k_mac_station_unauthorize()
5244 peer->is_authorized = false; in ath12k_mac_station_unauthorize()
5246 spin_unlock_bh(&ar->ab->base_lock); in ath12k_mac_station_unauthorize()
5254 ret = ath12k_clear_peer_keys(arvif, arsta->addr); in ath12k_mac_station_unauthorize()
5256 ath12k_warn(ar->ab, "failed to clear all peer keys for vdev %i: %d\n", in ath12k_mac_station_unauthorize()
5257 arvif->vdev_id, ret); in ath12k_mac_station_unauthorize()
5269 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); in ath12k_mac_station_authorize()
5272 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_station_authorize()
5274 spin_lock_bh(&ar->ab->base_lock); in ath12k_mac_station_authorize()
5276 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arsta->addr); in ath12k_mac_station_authorize()
5278 peer->is_authorized = true; in ath12k_mac_station_authorize()
5280 spin_unlock_bh(&ar->ab->base_lock); in ath12k_mac_station_authorize()
5282 if (vif->type == NL80211_IFTYPE_STATION && arvif->is_up) { in ath12k_mac_station_authorize()
5283 ret = ath12k_wmi_set_peer_param(ar, arsta->addr, in ath12k_mac_station_authorize()
5284 arvif->vdev_id, in ath12k_mac_station_authorize()
5288 ath12k_warn(ar->ab, "Unable to authorize peer %pM vdev %d: %d\n", in ath12k_mac_station_authorize()
5289 arsta->addr, arvif->vdev_id, ret); in ath12k_mac_station_authorize()
5301 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); in ath12k_mac_station_remove()
5302 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_mac_station_remove()
5305 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_station_remove()
5307 wiphy_work_cancel(ar->ah->hw->wiphy, &arsta->update_wk); in ath12k_mac_station_remove()
5309 if (ahvif->vdev_type == WMI_VDEV_TYPE_STA) { in ath12k_mac_station_remove()
5313 ath12k_warn(ar->ab, "failed to stop vdev %i: %d\n", in ath12k_mac_station_remove()
5314 arvif->vdev_id, ret); in ath12k_mac_station_remove()
5317 if (sta->mlo) in ath12k_mac_station_remove()
5320 ath12k_dp_peer_cleanup(ar, arvif->vdev_id, arsta->addr); in ath12k_mac_station_remove()
5322 ret = ath12k_peer_delete(ar, arvif->vdev_id, arsta->addr); in ath12k_mac_station_remove()
5324 ath12k_warn(ar->ab, "Failed to delete peer: %pM for VDEV: %d\n", in ath12k_mac_station_remove()
5325 arsta->addr, arvif->vdev_id); in ath12k_mac_station_remove()
5327 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "Removed peer: %pM for VDEV: %d\n", in ath12k_mac_station_remove()
5328 arsta->addr, arvif->vdev_id); in ath12k_mac_station_remove()
5332 if (sta->valid_links) in ath12k_mac_station_remove()
5333 ath12k_mac_free_unassign_link_sta(ahvif->ah, in ath12k_mac_station_remove()
5334 arsta->ahsta, arsta->link_id); in ath12k_mac_station_remove()
5343 struct ath12k_base *ab = ar->ab; in ath12k_mac_station_add()
5344 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); in ath12k_mac_station_add()
5345 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); in ath12k_mac_station_add()
5349 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_station_add()
5354 ar->max_num_stations); in ath12k_mac_station_add()
5357 arsta->rx_stats = kzalloc(sizeof(*arsta->rx_stats), GFP_KERNEL); in ath12k_mac_station_add()
5358 if (!arsta->rx_stats) { in ath12k_mac_station_add()
5359 ret = -ENOMEM; in ath12k_mac_station_add()
5363 peer_param.vdev_id = arvif->vdev_id; in ath12k_mac_station_add()
5364 peer_param.peer_addr = arsta->addr; in ath12k_mac_station_add()
5366 peer_param.ml_enabled = sta->mlo; in ath12k_mac_station_add()
5371 arsta->addr, arvif->vdev_id); in ath12k_mac_station_add()
5376 arsta->addr, arvif->vdev_id); in ath12k_mac_station_add()
5379 ret = ath12k_wmi_set_peer_param(ar, arsta->addr, in ath12k_mac_station_add()
5380 arvif->vdev_id, in ath12k_mac_station_add()
5384 arsta->addr, ret); in ath12k_mac_station_add()
5389 ret = ath12k_dp_peer_setup(ar, arvif->vdev_id, arsta->addr); in ath12k_mac_station_add()
5392 arsta->addr, arvif->vdev_id, ret); in ath12k_mac_station_add()
5396 if (ab->hw_params->vdev_start_delay && in ath12k_mac_station_add()
5397 !arvif->is_started && in ath12k_mac_station_add()
5398 arvif->ahvif->vdev_type != WMI_VDEV_TYPE_AP) { in ath12k_mac_station_add()
5409 ath12k_peer_delete(ar, arvif->vdev_id, arsta->addr); in ath12k_mac_station_add()
5410 kfree(arsta->rx_stats); in ath12k_mac_station_add()
5411 arsta->rx_stats = NULL; in ath12k_mac_station_add()
5423 switch (sta->deflink.bandwidth) { in ath12k_mac_ieee80211_sta_bw_to_wmi()
5440 ath12k_warn(ar->ab, "Invalid bandwidth %d in rc update for %pM\n", in ath12k_mac_ieee80211_sta_bw_to_wmi()
5441 sta->deflink.bandwidth, sta->addr); in ath12k_mac_ieee80211_sta_bw_to_wmi()
5459 lockdep_assert_wiphy(ah->hw->wiphy); in ath12k_mac_assign_link_sta()
5462 return -EINVAL; in ath12k_mac_assign_link_sta()
5464 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]); in ath12k_mac_assign_link_sta()
5466 return -EINVAL; in ath12k_mac_assign_link_sta()
5470 link_sta = wiphy_dereference(ah->hw->wiphy, sta->link[link_id]); in ath12k_mac_assign_link_sta()
5472 return -EINVAL; in ath12k_mac_assign_link_sta()
5474 ether_addr_copy(arsta->addr, link_sta->addr); in ath12k_mac_assign_link_sta()
5477 arsta->link_idx = ahsta->num_peer++; in ath12k_mac_assign_link_sta()
5479 arsta->link_id = link_id; in ath12k_mac_assign_link_sta()
5480 ahsta->links_map |= BIT(arsta->link_id); in ath12k_mac_assign_link_sta()
5481 arsta->arvif = arvif; in ath12k_mac_assign_link_sta()
5482 arsta->ahsta = ahsta; in ath12k_mac_assign_link_sta()
5483 ahsta->ahvif = ahvif; in ath12k_mac_assign_link_sta()
5485 wiphy_work_init(&arsta->update_wk, ath12k_sta_rc_update_wk); in ath12k_mac_assign_link_sta()
5487 rcu_assign_pointer(ahsta->link[link_id], arsta); in ath12k_mac_assign_link_sta()
5496 struct ath12k_hw *ah = ahvif->ah; in ath12k_mac_ml_station_remove()
5503 lockdep_assert_wiphy(ah->hw->wiphy); in ath12k_mac_ml_station_remove()
5508 links = ahsta->links_map; in ath12k_mac_ml_station_remove()
5510 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]); in ath12k_mac_ml_station_remove()
5511 arsta = wiphy_dereference(ah->hw->wiphy, ahsta->link[link_id]); in ath12k_mac_ml_station_remove()
5515 ar = arvif->ar; in ath12k_mac_ml_station_remove()
5531 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); in ath12k_mac_handle_link_sta_state()
5532 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); in ath12k_mac_handle_link_sta_state()
5533 struct ath12k *ar = arvif->ar; in ath12k_mac_handle_link_sta_state()
5536 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_handle_link_sta_state()
5538 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac handle link %u sta %pM state %d -> %d\n", in ath12k_mac_handle_link_sta_state()
5539 arsta->link_id, arsta->addr, old_state, new_state); in ath12k_mac_handle_link_sta_state()
5541 /* IEEE80211_STA_NONE -> IEEE80211_STA_NOTEXIST: Remove the station in ath12k_mac_handle_link_sta_state()
5548 ath12k_warn(ar->ab, "Failed to remove station: %pM for VDEV: %d\n", in ath12k_mac_handle_link_sta_state()
5549 arsta->addr, arvif->vdev_id); in ath12k_mac_handle_link_sta_state()
5554 /* IEEE80211_STA_NOTEXIST -> IEEE80211_STA_NONE: Add new station to driver */ in ath12k_mac_handle_link_sta_state()
5559 ath12k_warn(ar->ab, "Failed to add station: %pM for VDEV: %d\n", in ath12k_mac_handle_link_sta_state()
5560 arsta->addr, arvif->vdev_id); in ath12k_mac_handle_link_sta_state()
5562 /* IEEE80211_STA_AUTH -> IEEE80211_STA_ASSOC: Send station assoc command for in ath12k_mac_handle_link_sta_state()
5567 (vif->type == NL80211_IFTYPE_AP || in ath12k_mac_handle_link_sta_state()
5568 vif->type == NL80211_IFTYPE_MESH_POINT || in ath12k_mac_handle_link_sta_state()
5569 vif->type == NL80211_IFTYPE_ADHOC)) { in ath12k_mac_handle_link_sta_state()
5572 ath12k_warn(ar->ab, "Failed to associate station: %pM\n", in ath12k_mac_handle_link_sta_state()
5573 arsta->addr); in ath12k_mac_handle_link_sta_state()
5575 spin_lock_bh(&ar->data_lock); in ath12k_mac_handle_link_sta_state()
5577 arsta->bw = ath12k_mac_ieee80211_sta_bw_to_wmi(ar, sta); in ath12k_mac_handle_link_sta_state()
5578 arsta->bw_prev = sta->deflink.bandwidth; in ath12k_mac_handle_link_sta_state()
5580 spin_unlock_bh(&ar->data_lock); in ath12k_mac_handle_link_sta_state()
5582 /* IEEE80211_STA_ASSOC -> IEEE80211_STA_AUTHORIZED: set peer status as in ath12k_mac_handle_link_sta_state()
5589 ath12k_warn(ar->ab, "Failed to authorize station: %pM\n", in ath12k_mac_handle_link_sta_state()
5590 arsta->addr); in ath12k_mac_handle_link_sta_state()
5592 /* IEEE80211_STA_AUTHORIZED -> IEEE80211_STA_ASSOC: station may be in removal, in ath12k_mac_handle_link_sta_state()
5599 /* IEEE80211_STA_ASSOC -> IEEE80211_STA_AUTH: disassoc peer connected to in ath12k_mac_handle_link_sta_state()
5604 (vif->type == NL80211_IFTYPE_AP || in ath12k_mac_handle_link_sta_state()
5605 vif->type == NL80211_IFTYPE_MESH_POINT || in ath12k_mac_handle_link_sta_state()
5606 vif->type == NL80211_IFTYPE_ADHOC)) { in ath12k_mac_handle_link_sta_state()
5609 ath12k_warn(ar->ab, "Failed to disassociate station: %pM\n", in ath12k_mac_handle_link_sta_state()
5610 arsta->addr); in ath12k_mac_handle_link_sta_state()
5632 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_sta_state()
5634 if (ieee80211_vif_is_mld(vif) && sta->valid_links) { in ath12k_mac_op_sta_state()
5635 WARN_ON(!sta->mlo && hweight16(sta->valid_links) != 1); in ath12k_mac_op_sta_state()
5636 link_id = ffs(sta->valid_links) - 1; in ath12k_mac_op_sta_state()
5639 /* IEEE80211_STA_NOTEXIST -> IEEE80211_STA_NONE: in ath12k_mac_op_sta_state()
5641 * ahsta->links_map will be zero and sta->valid_links will be 1. in ath12k_mac_op_sta_state()
5648 arsta = &ahsta->deflink; in ath12k_mac_op_sta_state()
5651 if (sta->mlo && !ahsta->links_map && in ath12k_mac_op_sta_state()
5652 (hweight16(sta->valid_links) == 1)) { in ath12k_mac_op_sta_state()
5656 sta->addr); in ath12k_mac_op_sta_state()
5665 link_id, sta->addr); in ath12k_mac_op_sta_state()
5672 if (sta->mlo) { in ath12k_mac_op_sta_state()
5673 arsta->is_assoc_link = true; in ath12k_mac_op_sta_state()
5674 ahsta->assoc_link_id = link_id; in ath12k_mac_op_sta_state()
5687 if (ieee80211_vif_is_mld(vif) && vif->type == NL80211_IFTYPE_STATION && in ath12k_mac_op_sta_state()
5692 valid_links = ahsta->links_map; in ath12k_mac_op_sta_state()
5694 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); in ath12k_mac_op_sta_state()
5695 arsta = wiphy_dereference(hw->wiphy, ahsta->link[link_id]); in ath12k_mac_op_sta_state()
5701 if (WARN_ON(!arvif->ar)) in ath12k_mac_op_sta_state()
5708 link_id, arsta->addr, old_state, new_state); in ath12k_mac_op_sta_state()
5713 /* IEEE80211_STA_NONE -> IEEE80211_STA_NOTEXIST: in ath12k_mac_op_sta_state()
5719 new_state == IEEE80211_STA_NOTEXIST && sta->mlo) in ath12k_mac_op_sta_state()
5727 ahsta->state = new_state; in ath12k_mac_op_sta_state()
5745 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_sta_set_txpwr()
5750 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); in ath12k_mac_op_sta_set_txpwr()
5751 arsta = wiphy_dereference(hw->wiphy, ahsta->link[link_id]); in ath12k_mac_op_sta_set_txpwr()
5753 if (sta->deflink.txpwr.type == NL80211_TX_POWER_AUTOMATIC) { in ath12k_mac_op_sta_set_txpwr()
5756 txpwr = sta->deflink.txpwr.power; in ath12k_mac_op_sta_set_txpwr()
5758 ret = -EINVAL; in ath12k_mac_op_sta_set_txpwr()
5764 ret = -EINVAL; in ath12k_mac_op_sta_set_txpwr()
5768 ar = arvif->ar; in ath12k_mac_op_sta_set_txpwr()
5770 ret = ath12k_wmi_set_peer_param(ar, arsta->addr, arvif->vdev_id, in ath12k_mac_op_sta_set_txpwr()
5773 ath12k_warn(ar->ab, "failed to set tx power for station ret: %d\n", in ath12k_mac_op_sta_set_txpwr()
5787 struct ieee80211_sta *sta = link_sta->sta; in ath12k_mac_op_link_sta_rc_update()
5798 arvif = rcu_dereference(ahvif->link[link_sta->link_id]); in ath12k_mac_op_link_sta_rc_update()
5801 link_sta->link_id, sta->addr); in ath12k_mac_op_link_sta_rc_update()
5806 ar = arvif->ar; in ath12k_mac_op_link_sta_rc_update()
5808 arsta = rcu_dereference(ahsta->link[link_sta->link_id]); in ath12k_mac_op_link_sta_rc_update()
5811 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()
5812 link_sta->link_id, sta->addr); in ath12k_mac_op_link_sta_rc_update()
5815 spin_lock_bh(&ar->ab->base_lock); in ath12k_mac_op_link_sta_rc_update()
5817 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arsta->addr); in ath12k_mac_op_link_sta_rc_update()
5819 spin_unlock_bh(&ar->ab->base_lock); in ath12k_mac_op_link_sta_rc_update()
5821 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()
5822 arsta->addr, arvif->vdev_id); in ath12k_mac_op_link_sta_rc_update()
5826 spin_unlock_bh(&ar->ab->base_lock); in ath12k_mac_op_link_sta_rc_update()
5828 if (arsta->link_id >= IEEE80211_MLD_MAX_NUM_LINKS) { in ath12k_mac_op_link_sta_rc_update()
5833 link_sta = rcu_dereference(sta->link[arsta->link_id]); in ath12k_mac_op_link_sta_rc_update()
5836 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()
5837 sta->addr, arsta->link_id); in ath12k_mac_op_link_sta_rc_update()
5841 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_op_link_sta_rc_update()
5843 arsta->addr, changed, link_sta->bandwidth, link_sta->rx_nss, in ath12k_mac_op_link_sta_rc_update()
5844 link_sta->smps_mode); in ath12k_mac_op_link_sta_rc_update()
5846 spin_lock_bh(&ar->data_lock); in ath12k_mac_op_link_sta_rc_update()
5850 arsta->bw_prev = arsta->bw; in ath12k_mac_op_link_sta_rc_update()
5851 arsta->bw = bw; in ath12k_mac_op_link_sta_rc_update()
5855 arsta->nss = link_sta->rx_nss; in ath12k_mac_op_link_sta_rc_update()
5860 switch (link_sta->smps_mode) { in ath12k_mac_op_link_sta_rc_update()
5872 ath12k_warn(ar->ab, "Invalid smps %d in sta rc update for %pM link %u\n", in ath12k_mac_op_link_sta_rc_update()
5873 link_sta->smps_mode, arsta->addr, link_sta->link_id); in ath12k_mac_op_link_sta_rc_update()
5878 arsta->smps = smps; in ath12k_mac_op_link_sta_rc_update()
5881 arsta->changed |= changed; in ath12k_mac_op_link_sta_rc_update()
5883 spin_unlock_bh(&ar->data_lock); in ath12k_mac_op_link_sta_rc_update()
5885 wiphy_work_queue(hw->wiphy, &arsta->update_wk); in ath12k_mac_op_link_sta_rc_update()
5898 lockdep_assert_wiphy(ah->hw->wiphy); in ath12k_mac_alloc_assign_link_sta()
5903 arsta = wiphy_dereference(ah->hw->wiphy, ahsta->link[link_id]); in ath12k_mac_alloc_assign_link_sta()
5927 struct ath12k_hw *ah = hw->priv; in ath12k_mac_op_change_sta_links()
5935 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_change_sta_links()
5937 if (!sta->valid_links) in ath12k_mac_op_change_sta_links()
5938 return -EINVAL; in ath12k_mac_op_change_sta_links()
5947 if (ahsta->ml_peer_id == ATH12K_MLO_PEER_ID_INVALID) { in ath12k_mac_op_change_sta_links()
5948 ath12k_hw_warn(ah, "unable to add link for ml sta %pM", sta->addr); in ath12k_mac_op_change_sta_links()
5949 return -EINVAL; in ath12k_mac_op_change_sta_links()
5953 if (WARN_ON(ahsta->links_map == 0)) in ath12k_mac_op_change_sta_links()
5954 return -EINVAL; in ath12k_mac_op_change_sta_links()
5958 if (ahsta->links_map & BIT(link_id)) in ath12k_mac_op_change_sta_links()
5961 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); in ath12k_mac_op_change_sta_links()
5969 ar = arvif->ar; in ath12k_mac_op_change_sta_links()
5975 ath12k_warn(ar->ab, "Failed to add station: %pM for VDEV: %d\n", in ath12k_mac_op_change_sta_links()
5976 arsta->addr, arvif->vdev_id); in ath12k_mac_op_change_sta_links()
5997 struct ath12k *ar = arvif->ar; in ath12k_conf_tx_uapsd()
5998 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_conf_tx_uapsd()
6002 if (ahvif->vdev_type != WMI_VDEV_TYPE_STA) in ath12k_conf_tx_uapsd()
6025 ahvif->u.sta.uapsd |= value; in ath12k_conf_tx_uapsd()
6027 ahvif->u.sta.uapsd &= ~value; in ath12k_conf_tx_uapsd()
6029 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath12k_conf_tx_uapsd()
6031 ahvif->u.sta.uapsd); in ath12k_conf_tx_uapsd()
6033 ath12k_warn(ar->ab, "could not set uapsd params %d\n", ret); in ath12k_conf_tx_uapsd()
6037 if (ahvif->u.sta.uapsd) in ath12k_conf_tx_uapsd()
6042 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath12k_conf_tx_uapsd()
6046 ath12k_warn(ar->ab, "could not set rx wake param %d\n", ret); in ath12k_conf_tx_uapsd()
6056 struct ath12k *ar = arvif->ar; in ath12k_mac_conf_tx()
6057 struct ath12k_base *ab = ar->ab; in ath12k_mac_conf_tx()
6060 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_conf_tx()
6064 p = &arvif->wmm_params.ac_vo; in ath12k_mac_conf_tx()
6067 p = &arvif->wmm_params.ac_vi; in ath12k_mac_conf_tx()
6070 p = &arvif->wmm_params.ac_be; in ath12k_mac_conf_tx()
6073 p = &arvif->wmm_params.ac_bk; in ath12k_mac_conf_tx()
6078 ret = -EINVAL; in ath12k_mac_conf_tx()
6082 p->cwmin = params->cw_min; in ath12k_mac_conf_tx()
6083 p->cwmax = params->cw_max; in ath12k_mac_conf_tx()
6084 p->aifs = params->aifs; in ath12k_mac_conf_tx()
6085 p->txop = params->txop; in ath12k_mac_conf_tx()
6087 ret = ath12k_wmi_send_wmm_update_cmd(ar, arvif->vdev_id, in ath12k_mac_conf_tx()
6088 &arvif->wmm_params); in ath12k_mac_conf_tx()
6091 ar->pdev_idx, ret); in ath12k_mac_conf_tx()
6095 ret = ath12k_conf_tx_uapsd(arvif, ac, params->uapsd); in ath12k_mac_conf_tx()
6098 ar->pdev_idx, ret); in ath12k_mac_conf_tx()
6114 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_conf_tx()
6117 return -EINVAL; in ath12k_mac_op_conf_tx()
6119 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); in ath12k_mac_op_conf_tx()
6120 if (!arvif || !arvif->is_created) { in ath12k_mac_op_conf_tx()
6123 return -ENOSPC; in ath12k_mac_op_conf_tx()
6125 cache->tx_conf.changed = true; in ath12k_mac_op_conf_tx()
6126 cache->tx_conf.ac = ac; in ath12k_mac_op_conf_tx()
6127 cache->tx_conf.tx_queue_params = *params; in ath12k_mac_op_conf_tx()
6142 u32 ar_vht_cap = ar->pdev->cap.vht_cap; in ath12k_create_ht_cap()
6193 for (i = 0; i < ar->num_rx_chains; i++) { in ath12k_create_ht_cap()
6206 struct ath12k *ar = arvif->ar; in ath12k_mac_set_txbf_conf()
6207 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_mac_set_txbf_conf()
6210 u32 vht_cap = ar->pdev->cap.vht_cap; in ath12k_mac_set_txbf_conf()
6223 if (sound_dim > (ar->num_tx_chains - 1)) in ath12k_mac_set_txbf_conf()
6224 sound_dim = ar->num_tx_chains - 1; in ath12k_mac_set_txbf_conf()
6235 ahvif->vdev_type == WMI_VDEV_TYPE_AP) in ath12k_mac_set_txbf_conf()
6243 ahvif->vdev_type == WMI_VDEV_TYPE_STA) in ath12k_mac_set_txbf_conf()
6247 return ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_set_txbf_conf()
6259 if (ar->num_tx_chains < 2) { in ath12k_set_vht_txbf_cap()
6281 if (sound_dim > (ar->num_tx_chains - 1)) in ath12k_set_vht_txbf_cap()
6282 sound_dim = ar->num_tx_chains - 1; in ath12k_set_vht_txbf_cap()
6302 vht_cap.cap = ar->pdev->cap.vht_cap; in ath12k_create_vht_cap()
6314 if (i < ar->num_tx_chains && rate_cap_tx_chainmask & BIT(i)) in ath12k_create_vht_cap()
6319 if (i < ar->num_rx_chains && rate_cap_rx_chainmask & BIT(i)) in ath12k_create_vht_cap()
6343 rate_cap_tx_chainmask = ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift; in ath12k_mac_setup_ht_vht_cap()
6344 rate_cap_rx_chainmask = ar->cfg_rx_chainmask >> cap->rx_chain_mask_shift; in ath12k_mac_setup_ht_vht_cap()
6346 if (cap->supported_bands & WMI_HOST_WLAN_2G_CAP) { in ath12k_mac_setup_ht_vht_cap()
6347 band = &ar->mac.sbands[NL80211_BAND_2GHZ]; in ath12k_mac_setup_ht_vht_cap()
6348 ht_cap = cap->band[NL80211_BAND_2GHZ].ht_cap_info; in ath12k_mac_setup_ht_vht_cap()
6351 band->ht_cap = ath12k_create_ht_cap(ar, ht_cap, in ath12k_mac_setup_ht_vht_cap()
6355 if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP && in ath12k_mac_setup_ht_vht_cap()
6356 (ar->ab->hw_params->single_pdev_only || in ath12k_mac_setup_ht_vht_cap()
6357 !ar->supports_6ghz)) { in ath12k_mac_setup_ht_vht_cap()
6358 band = &ar->mac.sbands[NL80211_BAND_5GHZ]; in ath12k_mac_setup_ht_vht_cap()
6359 ht_cap = cap->band[NL80211_BAND_5GHZ].ht_cap_info; in ath12k_mac_setup_ht_vht_cap()
6362 band->ht_cap = ath12k_create_ht_cap(ar, ht_cap, in ath12k_mac_setup_ht_vht_cap()
6364 band->vht_cap = ath12k_create_vht_cap(ar, rate_cap_tx_chainmask, in ath12k_mac_setup_ht_vht_cap()
6381 int nss, ru; in ath12k_gen_ppe_thresh() local
6384 he_ppet[0] = fw_ppet->numss_m1 & IEEE80211_PPE_THRES_NSS_MASK; in ath12k_gen_ppe_thresh()
6385 he_ppet[0] |= (fw_ppet->ru_bit_mask << in ath12k_gen_ppe_thresh()
6388 for (nss = 0; nss <= fw_ppet->numss_m1; nss++) { in ath12k_gen_ppe_thresh()
6389 for (ru = 0; ru < 4; ru++) { in ath12k_gen_ppe_thresh()
6393 if ((fw_ppet->ru_bit_mask & BIT(ru)) == 0) in ath12k_gen_ppe_thresh()
6395 val = (fw_ppet->ppet16_ppet8_ru3_ru0[nss] >> (ru * 6)) & in ath12k_gen_ppe_thresh()
6398 for (i = 5; i >= 0; i--) { in ath12k_gen_ppe_thresh()
6414 he_cap_elem->mac_cap_info[0] &= ~m; in ath12k_mac_filter_he_cap_mesh()
6419 he_cap_elem->mac_cap_info[2] &= ~m; in ath12k_mac_filter_he_cap_mesh()
6424 he_cap_elem->mac_cap_info[3] &= ~m; in ath12k_mac_filter_he_cap_mesh()
6428 he_cap_elem->mac_cap_info[4] &= ~m; in ath12k_mac_filter_he_cap_mesh()
6434 he_cap_elem->mac_cap_info[5] &= ~m; in ath12k_mac_filter_he_cap_mesh()
6438 he_cap_elem->phy_cap_info[2] &= ~m; in ath12k_mac_filter_he_cap_mesh()
6443 he_cap_elem->phy_cap_info[3] &= ~m; in ath12k_mac_filter_he_cap_mesh()
6446 he_cap_elem->phy_cap_info[4] &= ~m; in ath12k_mac_filter_he_cap_mesh()
6449 he_cap_elem->phy_cap_info[5] &= ~m; in ath12k_mac_filter_he_cap_mesh()
6455 he_cap_elem->phy_cap_info[6] &= ~m; in ath12k_mac_filter_he_cap_mesh()
6461 he_cap_elem->phy_cap_info[7] &= ~m; in ath12k_mac_filter_he_cap_mesh()
6467 he_cap_elem->phy_cap_info[8] &= ~m; in ath12k_mac_filter_he_cap_mesh()
6475 he_cap_elem->phy_cap_info[9] &= ~m; in ath12k_mac_filter_he_cap_mesh()
6483 bcap->he_6ghz_capa = IEEE80211_HT_MPDU_DENSITY_NONE; in ath12k_mac_setup_he_6ghz_cap()
6484 if (bcap->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) in ath12k_mac_setup_he_6ghz_cap()
6485 bcap->he_6ghz_capa |= in ath12k_mac_setup_he_6ghz_cap()
6489 bcap->he_6ghz_capa |= in ath12k_mac_setup_he_6ghz_cap()
6492 val = u32_get_bits(pcap->vht_cap, in ath12k_mac_setup_he_6ghz_cap()
6494 bcap->he_6ghz_capa |= in ath12k_mac_setup_he_6ghz_cap()
6496 val = u32_get_bits(pcap->vht_cap, in ath12k_mac_setup_he_6ghz_cap()
6498 bcap->he_6ghz_capa |= in ath12k_mac_setup_he_6ghz_cap()
6500 if (pcap->vht_cap & IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN) in ath12k_mac_setup_he_6ghz_cap()
6501 bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_RX_ANTPAT_CONS; in ath12k_mac_setup_he_6ghz_cap()
6502 if (pcap->vht_cap & IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN) in ath12k_mac_setup_he_6ghz_cap()
6503 bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_TX_ANTPAT_CONS; in ath12k_mac_setup_he_6ghz_cap()
6505 return cpu_to_le16(bcap->he_6ghz_capa); in ath12k_mac_setup_he_6ghz_cap()
6512 struct ieee80211_he_cap_elem *he_cap_elem = &he_cap->he_cap_elem; in ath12k_mac_copy_he_cap()
6513 struct ieee80211_he_mcs_nss_supp *mcs_nss = &he_cap->he_mcs_nss_supp; in ath12k_mac_copy_he_cap()
6515 he_cap->has_he = true; in ath12k_mac_copy_he_cap()
6516 memcpy(he_cap_elem->mac_cap_info, band_cap->he_cap_info, in ath12k_mac_copy_he_cap()
6517 sizeof(he_cap_elem->mac_cap_info)); in ath12k_mac_copy_he_cap()
6518 memcpy(he_cap_elem->phy_cap_info, band_cap->he_cap_phy_info, in ath12k_mac_copy_he_cap()
6519 sizeof(he_cap_elem->phy_cap_info)); in ath12k_mac_copy_he_cap()
6521 he_cap_elem->mac_cap_info[1] &= in ath12k_mac_copy_he_cap()
6524 he_cap_elem->phy_cap_info[5] &= in ath12k_mac_copy_he_cap()
6526 he_cap_elem->phy_cap_info[5] &= in ath12k_mac_copy_he_cap()
6528 he_cap_elem->phy_cap_info[5] |= num_tx_chains - 1; in ath12k_mac_copy_he_cap()
6532 he_cap_elem->phy_cap_info[3] &= in ath12k_mac_copy_he_cap()
6534 he_cap_elem->phy_cap_info[9] |= in ath12k_mac_copy_he_cap()
6538 he_cap_elem->mac_cap_info[0] &= ~IEEE80211_HE_MAC_CAP0_TWT_RES; in ath12k_mac_copy_he_cap()
6539 he_cap_elem->mac_cap_info[0] |= IEEE80211_HE_MAC_CAP0_TWT_REQ; in ath12k_mac_copy_he_cap()
6540 he_cap_elem->phy_cap_info[9] |= in ath12k_mac_copy_he_cap()
6548 mcs_nss->rx_mcs_80 = cpu_to_le16(band_cap->he_mcs & 0xffff); in ath12k_mac_copy_he_cap()
6549 mcs_nss->tx_mcs_80 = cpu_to_le16(band_cap->he_mcs & 0xffff); in ath12k_mac_copy_he_cap()
6550 mcs_nss->rx_mcs_160 = cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff); in ath12k_mac_copy_he_cap()
6551 mcs_nss->tx_mcs_160 = cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff); in ath12k_mac_copy_he_cap()
6552 mcs_nss->rx_mcs_80p80 = cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff); in ath12k_mac_copy_he_cap()
6553 mcs_nss->tx_mcs_80p80 = cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff); in ath12k_mac_copy_he_cap()
6555 memset(he_cap->ppe_thres, 0, sizeof(he_cap->ppe_thres)); in ath12k_mac_copy_he_cap()
6556 if (he_cap_elem->phy_cap_info[6] & in ath12k_mac_copy_he_cap()
6558 ath12k_gen_ppe_thresh(&band_cap->he_ppet, he_cap->ppe_thres); in ath12k_mac_copy_he_cap()
6567 if ((he_cap->phy_cap_info[0] & in ath12k_mac_copy_eht_mcs_nss()
6572 memcpy(&mcs_nss->only_20mhz, &band_cap->eht_mcs_20_only, in ath12k_mac_copy_eht_mcs_nss()
6575 if (he_cap->phy_cap_info[0] & in ath12k_mac_copy_eht_mcs_nss()
6578 memcpy(&mcs_nss->bw._80, &band_cap->eht_mcs_80, in ath12k_mac_copy_eht_mcs_nss()
6581 if (he_cap->phy_cap_info[0] & in ath12k_mac_copy_eht_mcs_nss()
6583 memcpy(&mcs_nss->bw._160, &band_cap->eht_mcs_160, in ath12k_mac_copy_eht_mcs_nss()
6586 if (eht_cap->phy_cap_info[0] & IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ) in ath12k_mac_copy_eht_mcs_nss()
6587 memcpy(&mcs_nss->bw._320, &band_cap->eht_mcs_320, in ath12k_mac_copy_eht_mcs_nss()
6595 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
6597 u8p_replace_bits(&cap->eht_ppe_thres[0], fw_ppet->numss_m1, in ath12k_mac_copy_eht_ppe_thresh()
6600 u16p_replace_bits((u16 *)&cap->eht_ppe_thres[0], fw_ppet->ru_bit_mask, in ath12k_mac_copy_eht_ppe_thresh()
6603 for (nss = 0; nss <= fw_ppet->numss_m1; nss++) { in ath12k_mac_copy_eht_ppe_thresh()
6604 for (ru = 0; in ath12k_mac_copy_eht_ppe_thresh()
6605 ru < hweight16(IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK); in ath12k_mac_copy_eht_ppe_thresh()
6606 ru++) { in ath12k_mac_copy_eht_ppe_thresh()
6609 if ((fw_ppet->ru_bit_mask & BIT(ru)) == 0) in ath12k_mac_copy_eht_ppe_thresh()
6612 u32p_replace_bits(&val, fw_ppet->ppet16_ppet8_ru3_ru0[nss] >> in ath12k_mac_copy_eht_ppe_thresh()
6613 (ru * ppet_bit_len_per_ru), in ath12k_mac_copy_eht_ppe_thresh()
6614 GENMASK(ppet_bit_len_per_ru - 1, 0)); in ath12k_mac_copy_eht_ppe_thresh()
6617 cap->eht_ppe_thres[bit / 8] |= in ath12k_mac_copy_eht_ppe_thresh()
6632 eht_cap_elem->mac_cap_info[0] &= ~m; in ath12k_mac_filter_eht_cap_mesh()
6635 eht_cap_elem->phy_cap_info[0] &= ~m; in ath12k_mac_filter_eht_cap_mesh()
6641 eht_cap_elem->phy_cap_info[3] &= ~m; in ath12k_mac_filter_eht_cap_mesh()
6647 eht_cap_elem->phy_cap_info[4] &= ~m; in ath12k_mac_filter_eht_cap_mesh()
6653 eht_cap_elem->phy_cap_info[5] &= ~m; in ath12k_mac_filter_eht_cap_mesh()
6656 eht_cap_elem->phy_cap_info[6] &= ~m; in ath12k_mac_filter_eht_cap_mesh()
6664 eht_cap_elem->phy_cap_info[7] &= ~m; in ath12k_mac_filter_eht_cap_mesh()
6673 struct ieee80211_eht_cap_elem_fixed *eht_cap_elem = &eht_cap->eht_cap_elem; in ath12k_mac_copy_eht_cap()
6677 if (!(test_bit(WMI_TLV_SERVICE_11BE, ar->ab->wmi_ab.svc_map))) in ath12k_mac_copy_eht_cap()
6680 eht_cap->has_eht = true; in ath12k_mac_copy_eht_cap()
6681 memcpy(eht_cap_elem->mac_cap_info, band_cap->eht_cap_mac_info, in ath12k_mac_copy_eht_cap()
6682 sizeof(eht_cap_elem->mac_cap_info)); in ath12k_mac_copy_eht_cap()
6683 memcpy(eht_cap_elem->phy_cap_info, band_cap->eht_cap_phy_info, in ath12k_mac_copy_eht_cap()
6684 sizeof(eht_cap_elem->phy_cap_info)); in ath12k_mac_copy_eht_cap()
6688 eht_cap_elem->phy_cap_info[0] &= in ath12k_mac_copy_eht_cap()
6690 eht_cap_elem->phy_cap_info[4] &= in ath12k_mac_copy_eht_cap()
6692 eht_cap_elem->phy_cap_info[5] &= in ath12k_mac_copy_eht_cap()
6696 eht_cap_elem->phy_cap_info[7] &= in ath12k_mac_copy_eht_cap()
6700 eht_cap_elem->phy_cap_info[7] &= in ath12k_mac_copy_eht_cap()
6712 ath12k_mac_copy_eht_mcs_nss(band_cap, &eht_cap->eht_mcs_nss_supp, in ath12k_mac_copy_eht_cap()
6715 if (eht_cap_elem->phy_cap_info[5] & in ath12k_mac_copy_eht_cap()
6717 ath12k_mac_copy_eht_ppe_thresh(&band_cap->eht_ppet, eht_cap); in ath12k_mac_copy_eht_cap()
6725 struct ath12k_band_cap *band_cap = &cap->band[band]; in ath12k_mac_copy_sband_iftype_data()
6743 ath12k_mac_copy_he_cap(band_cap, i, ar->num_tx_chains, he_cap); in ath12k_mac_copy_sband_iftype_data()
6748 ath12k_mac_copy_eht_cap(ar, band_cap, &he_cap->he_cap_elem, i, in ath12k_mac_copy_sband_iftype_data()
6763 if (cap->supported_bands & WMI_HOST_WLAN_2G_CAP) { in ath12k_mac_setup_sband_iftype_data()
6766 ar->mac.iftype[band], in ath12k_mac_setup_sband_iftype_data()
6768 sband = &ar->mac.sbands[band]; in ath12k_mac_setup_sband_iftype_data()
6769 _ieee80211_set_sband_iftype_data(sband, ar->mac.iftype[band], in ath12k_mac_setup_sband_iftype_data()
6773 if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP) { in ath12k_mac_setup_sband_iftype_data()
6776 ar->mac.iftype[band], in ath12k_mac_setup_sband_iftype_data()
6778 sband = &ar->mac.sbands[band]; in ath12k_mac_setup_sband_iftype_data()
6779 _ieee80211_set_sband_iftype_data(sband, ar->mac.iftype[band], in ath12k_mac_setup_sband_iftype_data()
6783 if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP && in ath12k_mac_setup_sband_iftype_data()
6784 ar->supports_6ghz) { in ath12k_mac_setup_sband_iftype_data()
6787 ar->mac.iftype[band], in ath12k_mac_setup_sband_iftype_data()
6789 sband = &ar->mac.sbands[band]; in ath12k_mac_setup_sband_iftype_data()
6790 _ieee80211_set_sband_iftype_data(sband, ar->mac.iftype[band], in ath12k_mac_setup_sband_iftype_data()
6800 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in __ath12k_set_antenna()
6803 return -EINVAL; in __ath12k_set_antenna()
6806 return -EINVAL; in __ath12k_set_antenna()
6812 tx_ant = min_t(u32, tx_ant, ar->pdev->cap.tx_chain_mask); in __ath12k_set_antenna()
6813 rx_ant = min_t(u32, rx_ant, ar->pdev->cap.rx_chain_mask); in __ath12k_set_antenna()
6815 ar->cfg_tx_chainmask = tx_ant; in __ath12k_set_antenna()
6816 ar->cfg_rx_chainmask = rx_ant; in __ath12k_set_antenna()
6818 if (ah->state != ATH12K_HW_STATE_ON && in __ath12k_set_antenna()
6819 ah->state != ATH12K_HW_STATE_RESTARTED) in __ath12k_set_antenna()
6823 tx_ant, ar->pdev->pdev_id); in __ath12k_set_antenna()
6825 ath12k_warn(ar->ab, "failed to set tx-chainmask: %d, req 0x%x\n", in __ath12k_set_antenna()
6830 ar->num_tx_chains = hweight32(tx_ant); in __ath12k_set_antenna()
6833 rx_ant, ar->pdev->pdev_id); in __ath12k_set_antenna()
6835 ath12k_warn(ar->ab, "failed to set rx-chainmask: %d, req 0x%x\n", in __ath12k_set_antenna()
6840 ar->num_rx_chains = hweight32(rx_ant); in __ath12k_set_antenna()
6843 ath12k_mac_setup_ht_vht_cap(ar, &ar->pdev->cap, NULL); in __ath12k_set_antenna()
6844 ath12k_mac_setup_sband_iftype_data(ar, &ar->pdev->cap); in __ath12k_set_antenna()
6853 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mgmt_over_wmi_tx_drop()
6857 num_mgmt = atomic_dec_if_positive(&ar->num_pending_mgmt_tx); in ath12k_mgmt_over_wmi_tx_drop()
6863 wake_up(&ar->txmgmt_empty_waitq); in ath12k_mgmt_over_wmi_tx_drop()
6871 struct ath12k_base *ab = ar->ab; in ath12k_mac_tx_mgmt_pending_free()
6873 spin_lock_bh(&ar->txmgmt_idr_lock); in ath12k_mac_tx_mgmt_pending_free()
6874 idr_remove(&ar->txmgmt_idr, buf_id); in ath12k_mac_tx_mgmt_pending_free()
6875 spin_unlock_bh(&ar->txmgmt_idr_lock); in ath12k_mac_tx_mgmt_pending_free()
6876 dma_unmap_single(ab->dev, ATH12K_SKB_CB(msdu)->paddr, msdu->len, in ath12k_mac_tx_mgmt_pending_free()
6880 memset(&info->status, 0, sizeof(info->status)); in ath12k_mac_tx_mgmt_pending_free()
6892 struct ath12k *ar = skb_cb->ar; in ath12k_mac_vif_txmgmt_idr_remove()
6893 struct ath12k_base *ab = ar->ab; in ath12k_mac_vif_txmgmt_idr_remove()
6895 if (skb_cb->vif == vif) { in ath12k_mac_vif_txmgmt_idr_remove()
6896 spin_lock_bh(&ar->txmgmt_idr_lock); in ath12k_mac_vif_txmgmt_idr_remove()
6897 idr_remove(&ar->txmgmt_idr, buf_id); in ath12k_mac_vif_txmgmt_idr_remove()
6898 spin_unlock_bh(&ar->txmgmt_idr_lock); in ath12k_mac_vif_txmgmt_idr_remove()
6899 dma_unmap_single(ab->dev, skb_cb->paddr, msdu->len, in ath12k_mac_vif_txmgmt_idr_remove()
6909 struct ath12k_base *ab = ar->ab; in ath12k_mac_mgmt_tx_wmi()
6910 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; in ath12k_mac_mgmt_tx_wmi()
6916 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_mgmt_tx_wmi()
6918 ATH12K_SKB_CB(skb)->ar = ar; in ath12k_mac_mgmt_tx_wmi()
6919 spin_lock_bh(&ar->txmgmt_idr_lock); in ath12k_mac_mgmt_tx_wmi()
6920 buf_id = idr_alloc(&ar->txmgmt_idr, skb, 0, in ath12k_mac_mgmt_tx_wmi()
6922 spin_unlock_bh(&ar->txmgmt_idr_lock); in ath12k_mac_mgmt_tx_wmi()
6924 return -ENOSPC; in ath12k_mac_mgmt_tx_wmi()
6927 if (!(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP)) { in ath12k_mac_mgmt_tx_wmi()
6928 if ((ieee80211_is_action(hdr->frame_control) || in ath12k_mac_mgmt_tx_wmi()
6929 ieee80211_is_deauth(hdr->frame_control) || in ath12k_mac_mgmt_tx_wmi()
6930 ieee80211_is_disassoc(hdr->frame_control)) && in ath12k_mac_mgmt_tx_wmi()
6931 ieee80211_has_protected(hdr->frame_control)) { in ath12k_mac_mgmt_tx_wmi()
6936 paddr = dma_map_single(ab->dev, skb->data, skb->len, DMA_TO_DEVICE); in ath12k_mac_mgmt_tx_wmi()
6937 if (dma_mapping_error(ab->dev, paddr)) { in ath12k_mac_mgmt_tx_wmi()
6939 ret = -EIO; in ath12k_mac_mgmt_tx_wmi()
6943 ATH12K_SKB_CB(skb)->paddr = paddr; in ath12k_mac_mgmt_tx_wmi()
6945 ret = ath12k_wmi_mgmt_send(ar, arvif->vdev_id, buf_id, skb); in ath12k_mac_mgmt_tx_wmi()
6947 ath12k_warn(ar->ab, "failed to send mgmt frame: %d\n", ret); in ath12k_mac_mgmt_tx_wmi()
6954 dma_unmap_single(ab->dev, ATH12K_SKB_CB(skb)->paddr, in ath12k_mac_mgmt_tx_wmi()
6955 skb->len, DMA_TO_DEVICE); in ath12k_mac_mgmt_tx_wmi()
6957 spin_lock_bh(&ar->txmgmt_idr_lock); in ath12k_mac_mgmt_tx_wmi()
6958 idr_remove(&ar->txmgmt_idr, buf_id); in ath12k_mac_mgmt_tx_wmi()
6959 spin_unlock_bh(&ar->txmgmt_idr_lock); in ath12k_mac_mgmt_tx_wmi()
6968 while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL) in ath12k_mgmt_over_wmi_tx_purge()
6975 struct ath12k_hw *ah = ar->ah; in ath12k_mgmt_over_wmi_tx_work()
6984 while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL) { in ath12k_mgmt_over_wmi_tx_work()
6986 if (!skb_cb->vif) { in ath12k_mgmt_over_wmi_tx_work()
6987 ath12k_warn(ar->ab, "no vif found for mgmt frame\n"); in ath12k_mgmt_over_wmi_tx_work()
6992 ahvif = ath12k_vif_to_ahvif(skb_cb->vif); in ath12k_mgmt_over_wmi_tx_work()
6993 if (!(ahvif->links_map & BIT(skb_cb->link_id))) { in ath12k_mgmt_over_wmi_tx_work()
6994 ath12k_warn(ar->ab, in ath12k_mgmt_over_wmi_tx_work()
6996 skb_cb->link_id, ahvif->links_map); in ath12k_mgmt_over_wmi_tx_work()
7001 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[skb_cb->link_id]); in ath12k_mgmt_over_wmi_tx_work()
7002 if (ar->allocated_vdev_map & (1LL << arvif->vdev_id)) { in ath12k_mgmt_over_wmi_tx_work()
7005 ath12k_warn(ar->ab, "failed to tx mgmt frame, vdev_id %d :%d\n", in ath12k_mgmt_over_wmi_tx_work()
7006 arvif->vdev_id, ret); in ath12k_mgmt_over_wmi_tx_work()
7010 ath12k_warn(ar->ab, in ath12k_mgmt_over_wmi_tx_work()
7012 arvif->vdev_id, in ath12k_mgmt_over_wmi_tx_work()
7013 skb_cb->link_id, in ath12k_mgmt_over_wmi_tx_work()
7014 arvif->is_started); in ath12k_mgmt_over_wmi_tx_work()
7023 struct sk_buff_head *q = &ar->wmi_mgmt_tx_queue; in ath12k_mac_mgmt_tx()
7025 if (test_bit(ATH12K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags)) in ath12k_mac_mgmt_tx()
7026 return -ESHUTDOWN; in ath12k_mac_mgmt_tx()
7034 atomic_read(&ar->num_pending_mgmt_tx) > ATH12K_PRB_RSP_DROP_THRESHOLD) { in ath12k_mac_mgmt_tx()
7035 ath12k_warn(ar->ab, in ath12k_mac_mgmt_tx()
7037 return -ENOSPC; in ath12k_mac_mgmt_tx()
7041 ath12k_warn(ar->ab, "mgmt tx queue is full\n"); in ath12k_mac_mgmt_tx()
7042 return -ENOSPC; in ath12k_mac_mgmt_tx()
7046 atomic_inc(&ar->num_pending_mgmt_tx); in ath12k_mac_mgmt_tx()
7047 wiphy_work_queue(ath12k_ar_to_hw(ar)->wiphy, &ar->wmi_mgmt_tx_work); in ath12k_mac_mgmt_tx()
7062 spin_lock_bh(&ar->data_lock); in ath12k_mac_add_p2p_noa_ie()
7064 if (ahvif->u.ap.noa_data && in ath12k_mac_add_p2p_noa_ie()
7065 !pskb_expand_head(skb, 0, ahvif->u.ap.noa_len, in ath12k_mac_add_p2p_noa_ie()
7067 skb_put_data(skb, ahvif->u.ap.noa_data, in ath12k_mac_add_p2p_noa_ie()
7068 ahvif->u.ap.noa_len); in ath12k_mac_add_p2p_noa_ie()
7070 spin_unlock_bh(&ar->data_lock); in ath12k_mac_add_p2p_noa_ie()
7077 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; in ath12k_mac_get_tx_link()
7088 return ahvif->deflink.link_id; in ath12k_mac_get_tx_link()
7096 if (!sta->mlo) { in ath12k_mac_get_tx_link()
7097 link = ahsta->deflink.link_id; in ath12k_mac_get_tx_link()
7102 bss_conf = rcu_dereference(vif->link_conf[link]); in ath12k_mac_get_tx_link()
7104 ether_addr_copy(hdr->addr2, bss_conf->addr); in ath12k_mac_get_tx_link()
7105 if (!ieee80211_has_tods(hdr->frame_control) && in ath12k_mac_get_tx_link()
7106 !ieee80211_has_fromds(hdr->frame_control)) in ath12k_mac_get_tx_link()
7107 ether_addr_copy(hdr->addr3, bss_conf->addr); in ath12k_mac_get_tx_link()
7117 ieee80211_is_data(hdr->frame_control)) in ath12k_mac_get_tx_link()
7118 return ahsta->assoc_link_id; in ath12k_mac_get_tx_link()
7122 link = ahsta->deflink.link_id; in ath12k_mac_get_tx_link()
7124 if (!ieee80211_is_mgmt(hdr->frame_control)) in ath12k_mac_get_tx_link()
7128 bss_conf = rcu_dereference(vif->link_conf[link]); in ath12k_mac_get_tx_link()
7129 link_sta = rcu_dereference(sta->link[link]); in ath12k_mac_get_tx_link()
7132 ether_addr_copy(hdr->addr1, link_sta->addr); in ath12k_mac_get_tx_link()
7133 ether_addr_copy(hdr->addr2, bss_conf->addr); in ath12k_mac_get_tx_link()
7135 if (vif->type == NL80211_IFTYPE_STATION && bss_conf->bssid) in ath12k_mac_get_tx_link()
7136 ether_addr_copy(hdr->addr3, bss_conf->bssid); in ath12k_mac_get_tx_link()
7137 else if (vif->type == NL80211_IFTYPE_AP) in ath12k_mac_get_tx_link()
7138 ether_addr_copy(hdr->addr3, bss_conf->addr); in ath12k_mac_get_tx_link()
7156 * check. Also this would not need any translation at hdr->addr1 in ath12k_mac_get_tx_link()
7160 ether_addr_copy(hdr->addr2, bss_conf->addr); in ath12k_mac_get_tx_link()
7162 if (vif->type == NL80211_IFTYPE_STATION && bss_conf->bssid) in ath12k_mac_get_tx_link()
7163 ether_addr_copy(hdr->addr3, bss_conf->bssid); in ath12k_mac_get_tx_link()
7164 else if (vif->type == NL80211_IFTYPE_AP) in ath12k_mac_get_tx_link()
7165 ether_addr_copy(hdr->addr3, bss_conf->addr); in ath12k_mac_get_tx_link()
7178 struct ieee80211_vif *vif = info->control.vif; in ath12k_mac_op_tx()
7180 struct ath12k_link_vif *arvif = &ahvif->deflink; in ath12k_mac_op_tx()
7181 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; in ath12k_mac_op_tx()
7182 struct ieee80211_key_conf *key = info->control.hw_key; in ath12k_mac_op_tx()
7183 struct ieee80211_sta *sta = control->sta; in ath12k_mac_op_tx()
7184 u32 info_flags = info->flags; in ath12k_mac_op_tx()
7190 link_id = u32_get_bits(info->control.flags, IEEE80211_TX_CTRL_MLO_LINK); in ath12k_mac_op_tx()
7192 skb_cb->vif = vif; in ath12k_mac_op_tx()
7195 skb_cb->cipher = key->cipher; in ath12k_mac_op_tx()
7196 skb_cb->flags |= ATH12K_SKB_CIPHER_SET; in ath12k_mac_op_tx()
7210 arvif = rcu_dereference(ahvif->link[link_id]); in ath12k_mac_op_tx()
7211 if (!arvif || !arvif->ar) { in ath12k_mac_op_tx()
7212 ath12k_warn(ahvif->ah, "failed to find arvif link id %u for frame transmission", in ath12k_mac_op_tx()
7218 ar = arvif->ar; in ath12k_mac_op_tx()
7219 skb_cb->link_id = link_id; in ath12k_mac_op_tx()
7220 is_prb_rsp = ieee80211_is_probe_resp(hdr->frame_control); in ath12k_mac_op_tx()
7223 skb_cb->flags |= ATH12K_SKB_HW_80211_ENCAP; in ath12k_mac_op_tx()
7224 } else if (ieee80211_is_mgmt(hdr->frame_control)) { in ath12k_mac_op_tx()
7227 ath12k_warn(ar->ab, "failed to queue management frame %d\n", in ath12k_mac_op_tx()
7235 if (vif->type == NL80211_IFTYPE_AP && vif->p2p) in ath12k_mac_op_tx()
7240 ath12k_warn(ar->ab, "failed to transmit frame %d\n", ret); in ath12k_mac_op_tx()
7247 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_drain_tx()
7249 /* make sure rcu-protected mac80211 tx path itself is drained */ in ath12k_mac_drain_tx()
7252 wiphy_work_cancel(ath12k_ar_to_hw(ar)->wiphy, &ar->wmi_mgmt_tx_work); in ath12k_mac_drain_tx()
7258 return -EOPNOTSUPP; in ath12k_mac_config_mon_status_default()
7264 struct ath12k_hw *ah = ar->ah; in ath12k_mac_start()
7265 struct ath12k_base *ab = ar->ab; in ath12k_mac_start()
7266 struct ath12k_pdev *pdev = ar->pdev; in ath12k_mac_start()
7269 lockdep_assert_held(&ah->hw_mutex); in ath12k_mac_start()
7270 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_start()
7273 1, pdev->pdev_id); in ath12k_mac_start()
7281 pdev->pdev_id); in ath12k_mac_start()
7288 0, pdev->pdev_id); in ath12k_mac_start()
7295 ret = ath12k_wmi_send_dfs_phyerr_offload_enable_cmd(ar, pdev->pdev_id); in ath12k_mac_start()
7310 1, pdev->pdev_id); in ath12k_mac_start()
7317 __ath12k_set_antenna(ar, ar->cfg_tx_chainmask, ar->cfg_rx_chainmask); in ath12k_mac_start()
7323 ar->num_started_vdevs = 0; in ath12k_mac_start()
7324 ar->num_created_vdevs = 0; in ath12k_mac_start()
7325 ar->num_peers = 0; in ath12k_mac_start()
7326 ar->allocated_vdev_map = 0; in ath12k_mac_start()
7332 if (ret && (ret != -EOPNOTSUPP)) { in ath12k_mac_start()
7338 if (ret == -EOPNOTSUPP) in ath12k_mac_start()
7343 ath12k_wmi_pdev_lro_cfg(ar, ar->pdev->pdev_id); in ath12k_mac_start()
7346 if (ab->hw_params->idle_ps) { in ath12k_mac_start()
7348 1, pdev->pdev_id); in ath12k_mac_start()
7355 rcu_assign_pointer(ab->pdevs_active[ar->pdev_idx], in ath12k_mac_start()
7356 &ab->pdevs[ar->pdev_idx]); in ath12k_mac_start()
7369 lockdep_assert_wiphy(ah->hw->wiphy); in ath12k_drain_tx()
7381 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_start()
7385 guard(mutex)(&ah->hw_mutex); in ath12k_mac_op_start()
7387 switch (ah->state) { in ath12k_mac_op_start()
7389 ah->state = ATH12K_HW_STATE_ON; in ath12k_mac_op_start()
7392 ah->state = ATH12K_HW_STATE_RESTARTED; in ath12k_mac_op_start()
7397 ah->state = ATH12K_HW_STATE_OFF; in ath12k_mac_op_start()
7400 return -EINVAL; in ath12k_mac_op_start()
7406 ah->state = ATH12K_HW_STATE_OFF; in ath12k_mac_op_start()
7408 ath12k_err(ar->ab, "fail to start mac operations in pdev idx %d ret %d\n", in ath12k_mac_op_start()
7409 ar->pdev_idx, ret); in ath12k_mac_op_start()
7417 for (; i > 0; i--) { in ath12k_mac_op_start()
7418 ar = ath12k_ah_to_ar(ah, i - 1); in ath12k_mac_op_start()
7427 struct ath12k_base *ab = ar->ab; in ath12k_mac_rfkill_config()
7431 if (ab->hw_params->rfkill_pin == 0) in ath12k_mac_rfkill_config()
7432 return -EOPNOTSUPP; in ath12k_mac_rfkill_config()
7436 ab->hw_params->rfkill_pin, ab->hw_params->rfkill_cfg, in ath12k_mac_rfkill_config()
7437 ab->hw_params->rfkill_on_level); in ath12k_mac_rfkill_config()
7439 param = u32_encode_bits(ab->hw_params->rfkill_on_level, in ath12k_mac_rfkill_config()
7441 u32_encode_bits(ab->hw_params->rfkill_pin, in ath12k_mac_rfkill_config()
7443 u32_encode_bits(ab->hw_params->rfkill_cfg, in ath12k_mac_rfkill_config()
7447 param, ar->pdev->pdev_id); in ath12k_mac_rfkill_config()
7468 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac %d rfkill enable %d", in ath12k_mac_rfkill_enable_radio()
7469 ar->pdev_idx, param); in ath12k_mac_rfkill_enable_radio()
7472 param, ar->pdev->pdev_id); in ath12k_mac_rfkill_enable_radio()
7474 ath12k_warn(ar->ab, "failed to set rfkill enable param %d: %d\n", in ath12k_mac_rfkill_enable_radio()
7484 struct ath12k_hw *ah = ar->ah; in ath12k_mac_stop()
7488 lockdep_assert_held(&ah->hw_mutex); in ath12k_mac_stop()
7489 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_stop()
7492 if (ret && (ret != -EOPNOTSUPP)) in ath12k_mac_stop()
7493 ath12k_err(ar->ab, "failed to clear rx_filter for monitor status ring: (%d)\n", in ath12k_mac_stop()
7496 clear_bit(ATH12K_FLAG_CAC_RUNNING, &ar->dev_flags); in ath12k_mac_stop()
7498 cancel_delayed_work_sync(&ar->scan.timeout); in ath12k_mac_stop()
7499 wiphy_work_cancel(ath12k_ar_to_hw(ar)->wiphy, &ar->scan.vdev_clean_wk); in ath12k_mac_stop()
7500 cancel_work_sync(&ar->regd_update_work); in ath12k_mac_stop()
7501 cancel_work_sync(&ar->ab->rfkill_work); in ath12k_mac_stop()
7503 spin_lock_bh(&ar->data_lock); in ath12k_mac_stop()
7504 list_for_each_entry_safe(ppdu_stats, tmp, &ar->ppdu_stats_info, list) { in ath12k_mac_stop()
7505 list_del(&ppdu_stats->list); in ath12k_mac_stop()
7508 spin_unlock_bh(&ar->data_lock); in ath12k_mac_stop()
7510 rcu_assign_pointer(ar->ab->pdevs_active[ar->pdev_idx], NULL); in ath12k_mac_stop()
7514 atomic_set(&ar->num_pending_mgmt_tx, 0); in ath12k_mac_stop()
7523 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_stop()
7527 mutex_lock(&ah->hw_mutex); in ath12k_mac_op_stop()
7529 ah->state = ATH12K_HW_STATE_OFF; in ath12k_mac_op_stop()
7534 mutex_unlock(&ah->hw_mutex); in ath12k_mac_op_stop()
7540 struct ath12k_base *ab = arvif->ar->ab; in ath12k_mac_get_vdev_stats_id()
7544 if (ab->free_vdev_stats_id_map & (1LL << vdev_stats_id)) { in ath12k_mac_get_vdev_stats_id()
7551 ab->free_vdev_stats_id_map |= (1LL << vdev_stats_id); in ath12k_mac_get_vdev_stats_id()
7556 arvif->vdev_stats_id = vdev_stats_id; in ath12k_mac_get_vdev_stats_id()
7563 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_mac_setup_vdev_params_mbssid()
7564 struct ieee80211_vif *tx_vif = ahvif->vif->mbssid_tx_vif; in ath12k_mac_setup_vdev_params_mbssid()
7566 struct ath12k *ar = arvif->ar; in ath12k_mac_setup_vdev_params_mbssid()
7575 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()
7576 ahvif->vif->addr, arvif->link_id); in ath12k_mac_setup_vdev_params_mbssid()
7577 return -ENOLINK; in ath12k_mac_setup_vdev_params_mbssid()
7581 tx_arvif = &tx_ahvif->deflink; in ath12k_mac_setup_vdev_params_mbssid()
7583 if (link_conf->nontransmitted) { in ath12k_mac_setup_vdev_params_mbssid()
7584 if (ar->ah->hw->wiphy != ieee80211_vif_to_wdev(tx_vif)->wiphy) in ath12k_mac_setup_vdev_params_mbssid()
7585 return -EINVAL; in ath12k_mac_setup_vdev_params_mbssid()
7588 *tx_vdev_id = tx_arvif->vdev_id; in ath12k_mac_setup_vdev_params_mbssid()
7592 return -EINVAL; in ath12k_mac_setup_vdev_params_mbssid()
7595 if (link_conf->ema_ap) in ath12k_mac_setup_vdev_params_mbssid()
7604 struct ath12k *ar = arvif->ar; in ath12k_mac_setup_vdev_create_arg()
7605 struct ath12k_pdev *pdev = ar->pdev; in ath12k_mac_setup_vdev_create_arg()
7606 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_mac_setup_vdev_create_arg()
7609 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_setup_vdev_create_arg()
7611 arg->if_id = arvif->vdev_id; in ath12k_mac_setup_vdev_create_arg()
7612 arg->type = ahvif->vdev_type; in ath12k_mac_setup_vdev_create_arg()
7613 arg->subtype = ahvif->vdev_subtype; in ath12k_mac_setup_vdev_create_arg()
7614 arg->pdev_id = pdev->pdev_id; in ath12k_mac_setup_vdev_create_arg()
7616 arg->mbssid_flags = WMI_VDEV_MBSSID_FLAGS_NON_MBSSID_AP; in ath12k_mac_setup_vdev_create_arg()
7617 arg->mbssid_tx_vdev_id = 0; in ath12k_mac_setup_vdev_create_arg()
7619 ar->ab->wmi_ab.svc_map)) { in ath12k_mac_setup_vdev_create_arg()
7621 &arg->mbssid_flags, in ath12k_mac_setup_vdev_create_arg()
7622 &arg->mbssid_tx_vdev_id); in ath12k_mac_setup_vdev_create_arg()
7627 if (pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) { in ath12k_mac_setup_vdev_create_arg()
7628 arg->chains[NL80211_BAND_2GHZ].tx = ar->num_tx_chains; in ath12k_mac_setup_vdev_create_arg()
7629 arg->chains[NL80211_BAND_2GHZ].rx = ar->num_rx_chains; in ath12k_mac_setup_vdev_create_arg()
7631 if (pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) { in ath12k_mac_setup_vdev_create_arg()
7632 arg->chains[NL80211_BAND_5GHZ].tx = ar->num_tx_chains; in ath12k_mac_setup_vdev_create_arg()
7633 arg->chains[NL80211_BAND_5GHZ].rx = ar->num_rx_chains; in ath12k_mac_setup_vdev_create_arg()
7635 if (pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP && in ath12k_mac_setup_vdev_create_arg()
7636 ar->supports_6ghz) { in ath12k_mac_setup_vdev_create_arg()
7637 arg->chains[NL80211_BAND_6GHZ].tx = ar->num_tx_chains; in ath12k_mac_setup_vdev_create_arg()
7638 arg->chains[NL80211_BAND_6GHZ].rx = ar->num_rx_chains; in ath12k_mac_setup_vdev_create_arg()
7641 arg->if_stats_id = ath12k_mac_get_vdev_stats_id(arvif); in ath12k_mac_setup_vdev_create_arg()
7644 if (hweight16(ahvif->vif->valid_links) > ATH12K_WMI_MLO_MAX_LINKS) { in ath12k_mac_setup_vdev_create_arg()
7645 ath12k_warn(ar->ab, "too many MLO links during setting up vdev: %d", in ath12k_mac_setup_vdev_create_arg()
7646 ahvif->vif->valid_links); in ath12k_mac_setup_vdev_create_arg()
7647 return -EINVAL; in ath12k_mac_setup_vdev_create_arg()
7650 ether_addr_copy(arg->mld_addr, ahvif->vif->addr); in ath12k_mac_setup_vdev_create_arg()
7659 struct ath12k_pdev_cap *pdev_cap = &pdev->cap; in ath12k_mac_prepare_he_mode()
7664 if (pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) in ath12k_mac_prepare_he_mode()
7665 cap_band = &pdev_cap->band[NL80211_BAND_2GHZ]; in ath12k_mac_prepare_he_mode()
7667 cap_band = &pdev_cap->band[NL80211_BAND_5GHZ]; in ath12k_mac_prepare_he_mode()
7669 hecap_phy_ptr = &cap_band->he_cap_phy_info[0]; in ath12k_mac_prepare_he_mode()
7694 struct ath12k_base *ab = ar->ab; in ath12k_set_he_mu_sounding_mode()
7695 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_set_he_mu_sounding_mode()
7699 param_value = ath12k_mac_prepare_he_mode(ar->pdev, ahvif->vif->type); in ath12k_set_he_mu_sounding_mode()
7700 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_set_he_mu_sounding_mode()
7704 arvif->vdev_id, ret, param_value); in ath12k_set_he_mu_sounding_mode()
7712 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_set_he_mu_sounding_mode()
7716 arvif->vdev_id, ret); in ath12k_set_he_mu_sounding_mode()
7724 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_mac_update_vif_offload()
7726 struct ath12k *ar = arvif->ar; in ath12k_mac_update_vif_offload()
7727 struct ath12k_base *ab = ar->ab; in ath12k_mac_update_vif_offload()
7732 if (vif->type != NL80211_IFTYPE_STATION && in ath12k_mac_update_vif_offload()
7733 vif->type != NL80211_IFTYPE_AP) in ath12k_mac_update_vif_offload()
7734 vif->offload_flags &= ~(IEEE80211_OFFLOAD_ENCAP_ENABLED | in ath12k_mac_update_vif_offload()
7737 if (vif->offload_flags & IEEE80211_OFFLOAD_ENCAP_ENABLED) in ath12k_mac_update_vif_offload()
7738 ahvif->tx_encap_type = ATH12K_HW_TXRX_ETHERNET; in ath12k_mac_update_vif_offload()
7739 else if (test_bit(ATH12K_FLAG_RAW_MODE, &ab->dev_flags)) in ath12k_mac_update_vif_offload()
7740 ahvif->tx_encap_type = ATH12K_HW_TXRX_RAW; in ath12k_mac_update_vif_offload()
7742 ahvif->tx_encap_type = ATH12K_HW_TXRX_NATIVE_WIFI; in ath12k_mac_update_vif_offload()
7744 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_update_vif_offload()
7745 param_id, ahvif->tx_encap_type); in ath12k_mac_update_vif_offload()
7748 arvif->vdev_id, ret); in ath12k_mac_update_vif_offload()
7749 vif->offload_flags &= ~IEEE80211_OFFLOAD_ENCAP_ENABLED; in ath12k_mac_update_vif_offload()
7753 if (vif->offload_flags & IEEE80211_OFFLOAD_DECAP_ENABLED) in ath12k_mac_update_vif_offload()
7755 else if (test_bit(ATH12K_FLAG_RAW_MODE, &ab->dev_flags)) in ath12k_mac_update_vif_offload()
7760 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_update_vif_offload()
7764 arvif->vdev_id, ret); in ath12k_mac_update_vif_offload()
7765 vif->offload_flags &= ~IEEE80211_OFFLOAD_DECAP_ENABLED; in ath12k_mac_update_vif_offload()
7777 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_update_vif_offload()
7779 if (vif->valid_links) { in ath12k_mac_op_update_vif_offload()
7780 links = vif->valid_links; in ath12k_mac_op_update_vif_offload()
7782 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); in ath12k_mac_op_update_vif_offload()
7783 if (!(arvif && arvif->ar)) in ath12k_mac_op_update_vif_offload()
7792 ath12k_mac_update_vif_offload(&ahvif->deflink); in ath12k_mac_op_update_vif_offload()
7797 struct ath12k_hw *ah = ar->ah; in ath12k_mac_vdev_create()
7798 struct ath12k_base *ab = ar->ab; in ath12k_mac_vdev_create()
7799 struct ieee80211_hw *hw = ah->hw; in ath12k_mac_vdev_create()
7800 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_mac_vdev_create()
7811 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_vdev_create()
7816 if (arvif->link_id == ATH12K_DEFAULT_SCAN_LINK && vif->valid_links) in ath12k_mac_vdev_create()
7817 link_id = ffs(vif->valid_links) - 1; in ath12k_mac_vdev_create()
7819 link_id = arvif->link_id; in ath12k_mac_vdev_create()
7821 link_conf = wiphy_dereference(hw->wiphy, vif->link_conf[link_id]); in ath12k_mac_vdev_create()
7823 ath12k_warn(ar->ab, "unable to access bss link conf in vdev create for vif %pM link %u\n", in ath12k_mac_vdev_create()
7824 vif->addr, arvif->link_id); in ath12k_mac_vdev_create()
7825 return -ENOLINK; in ath12k_mac_vdev_create()
7828 memcpy(arvif->bssid, link_conf->addr, ETH_ALEN); in ath12k_mac_vdev_create()
7830 arvif->ar = ar; in ath12k_mac_vdev_create()
7831 vdev_id = __ffs64(ab->free_vdev_map); in ath12k_mac_vdev_create()
7832 arvif->vdev_id = vdev_id; in ath12k_mac_vdev_create()
7833 ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE; in ath12k_mac_vdev_create()
7835 switch (vif->type) { in ath12k_mac_vdev_create()
7838 ahvif->vdev_type = WMI_VDEV_TYPE_STA; in ath12k_mac_vdev_create()
7840 if (vif->p2p) in ath12k_mac_vdev_create()
7841 ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_CLIENT; in ath12k_mac_vdev_create()
7845 ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_MESH_11S; in ath12k_mac_vdev_create()
7848 ahvif->vdev_type = WMI_VDEV_TYPE_AP; in ath12k_mac_vdev_create()
7850 if (vif->p2p) in ath12k_mac_vdev_create()
7851 ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_GO; in ath12k_mac_vdev_create()
7855 ahvif->vdev_type = WMI_VDEV_TYPE_MONITOR; in ath12k_mac_vdev_create()
7856 ar->monitor_vdev_id = vdev_id; in ath12k_mac_vdev_create()
7859 ahvif->vdev_type = WMI_VDEV_TYPE_STA; in ath12k_mac_vdev_create()
7860 ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_DEVICE; in ath12k_mac_vdev_create()
7867 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev create id %d type %d subtype %d map %llx\n", in ath12k_mac_vdev_create()
7868 arvif->vdev_id, ahvif->vdev_type, ahvif->vdev_subtype, in ath12k_mac_vdev_create()
7869 ab->free_vdev_map); in ath12k_mac_vdev_create()
7871 vif->cab_queue = arvif->vdev_id % (ATH12K_HW_MAX_QUEUES - 1); in ath12k_mac_vdev_create()
7872 for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++) in ath12k_mac_vdev_create()
7873 vif->hw_queue[i] = i % (ATH12K_HW_MAX_QUEUES - 1); in ath12k_mac_vdev_create()
7878 arvif->vdev_id, ret); in ath12k_mac_vdev_create()
7882 ret = ath12k_wmi_vdev_create(ar, arvif->bssid, &vdev_arg); in ath12k_mac_vdev_create()
7885 arvif->vdev_id, ret); in ath12k_mac_vdev_create()
7889 ar->num_created_vdevs++; in ath12k_mac_vdev_create()
7890 arvif->is_created = true; in ath12k_mac_vdev_create()
7892 vif->addr, arvif->vdev_id); in ath12k_mac_vdev_create()
7893 ar->allocated_vdev_map |= 1LL << arvif->vdev_id; in ath12k_mac_vdev_create()
7894 ab->free_vdev_map &= ~(1LL << arvif->vdev_id); in ath12k_mac_vdev_create()
7896 spin_lock_bh(&ar->data_lock); in ath12k_mac_vdev_create()
7897 list_add(&arvif->list, &ar->arvifs); in ath12k_mac_vdev_create()
7898 spin_unlock_bh(&ar->data_lock); in ath12k_mac_vdev_create()
7902 nss = hweight32(ar->cfg_tx_chainmask) ? : 1; in ath12k_mac_vdev_create()
7903 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_vdev_create()
7907 arvif->vdev_id, ar->cfg_tx_chainmask, nss, ret); in ath12k_mac_vdev_create()
7911 switch (ahvif->vdev_type) { in ath12k_mac_vdev_create()
7913 peer_param.vdev_id = arvif->vdev_id; in ath12k_mac_vdev_create()
7914 peer_param.peer_addr = arvif->bssid; in ath12k_mac_vdev_create()
7919 arvif->vdev_id, ret); in ath12k_mac_vdev_create()
7925 ath12k_warn(ar->ab, "failed to set vdev %i kickout parameters: %d\n", in ath12k_mac_vdev_create()
7926 arvif->vdev_id, ret); in ath12k_mac_vdev_create()
7933 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath12k_mac_vdev_create()
7936 ath12k_warn(ar->ab, "failed to set vdev %d RX wake policy: %d\n", in ath12k_mac_vdev_create()
7937 arvif->vdev_id, ret); in ath12k_mac_vdev_create()
7943 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath12k_mac_vdev_create()
7946 ath12k_warn(ar->ab, "failed to set vdev %d TX wake threshold: %d\n", in ath12k_mac_vdev_create()
7947 arvif->vdev_id, ret); in ath12k_mac_vdev_create()
7953 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath12k_mac_vdev_create()
7956 ath12k_warn(ar->ab, "failed to set vdev %d pspoll count: %d\n", in ath12k_mac_vdev_create()
7957 arvif->vdev_id, ret); in ath12k_mac_vdev_create()
7961 ret = ath12k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id, false); in ath12k_mac_vdev_create()
7963 ath12k_warn(ar->ab, "failed to disable vdev %d ps mode: %d\n", in ath12k_mac_vdev_create()
7964 arvif->vdev_id, ret); in ath12k_mac_vdev_create()
7972 arvif->txpower = link_conf->txpower; in ath12k_mac_vdev_create()
7978 param_value = hw->wiphy->rts_threshold; in ath12k_mac_vdev_create()
7979 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_vdev_create()
7982 ath12k_warn(ar->ab, "failed to set rts threshold for vdev %d: %d\n", in ath12k_mac_vdev_create()
7983 arvif->vdev_id, ret); in ath12k_mac_vdev_create()
7987 if (vif->type != NL80211_IFTYPE_MONITOR && ar->monitor_conf_enabled) in ath12k_mac_vdev_create()
7993 if (ahvif->vdev_type == WMI_VDEV_TYPE_AP) { in ath12k_mac_vdev_create()
7994 reinit_completion(&ar->peer_delete_done); in ath12k_mac_vdev_create()
7996 ret = ath12k_wmi_send_peer_delete_cmd(ar, arvif->bssid, in ath12k_mac_vdev_create()
7997 arvif->vdev_id); in ath12k_mac_vdev_create()
7999 ath12k_warn(ar->ab, "failed to delete peer vdev_id %d addr %pM\n", in ath12k_mac_vdev_create()
8000 arvif->vdev_id, arvif->bssid); in ath12k_mac_vdev_create()
8004 ret = ath12k_wait_for_peer_delete_done(ar, arvif->vdev_id, in ath12k_mac_vdev_create()
8005 arvif->bssid); in ath12k_mac_vdev_create()
8009 ar->num_peers--; in ath12k_mac_vdev_create()
8013 ath12k_wmi_vdev_delete(ar, arvif->vdev_id); in ath12k_mac_vdev_create()
8014 ar->num_created_vdevs--; in ath12k_mac_vdev_create()
8015 arvif->is_created = false; in ath12k_mac_vdev_create()
8016 arvif->ar = NULL; in ath12k_mac_vdev_create()
8017 ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id); in ath12k_mac_vdev_create()
8018 ab->free_vdev_map |= 1LL << arvif->vdev_id; in ath12k_mac_vdev_create()
8019 ab->free_vdev_stats_id_map &= ~(1LL << arvif->vdev_stats_id); in ath12k_mac_vdev_create()
8020 spin_lock_bh(&ar->data_lock); in ath12k_mac_vdev_create()
8021 list_del(&arvif->list); in ath12k_mac_vdev_create()
8022 spin_unlock_bh(&ar->data_lock); in ath12k_mac_vdev_create()
8025 arvif->ar = NULL; in ath12k_mac_vdev_create()
8032 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_mac_vif_flush_key_cache()
8033 struct ath12k_hw *ah = ahvif->ah; in ath12k_mac_vif_flush_key_cache()
8036 struct ath12k_vif_cache *cache = ahvif->cache[arvif->link_id]; in ath12k_mac_vif_flush_key_cache()
8039 lockdep_assert_wiphy(ah->hw->wiphy); in ath12k_mac_vif_flush_key_cache()
8041 list_for_each_entry_safe(key_conf, tmp, &cache->key_conf.list, list) { in ath12k_mac_vif_flush_key_cache()
8043 if (key_conf->sta) { in ath12k_mac_vif_flush_key_cache()
8044 ahsta = ath12k_sta_to_ahsta(key_conf->sta); in ath12k_mac_vif_flush_key_cache()
8045 arsta = wiphy_dereference(ah->hw->wiphy, in ath12k_mac_vif_flush_key_cache()
8046 ahsta->link[arvif->link_id]); in ath12k_mac_vif_flush_key_cache()
8051 ret = ath12k_mac_set_key(arvif->ar, key_conf->cmd, in ath12k_mac_vif_flush_key_cache()
8053 key_conf->key); in ath12k_mac_vif_flush_key_cache()
8055 ath12k_warn(arvif->ar->ab, "unable to apply set key param to vdev %d ret %d\n", in ath12k_mac_vif_flush_key_cache()
8056 arvif->vdev_id, ret); in ath12k_mac_vif_flush_key_cache()
8058 list_del(&key_conf->list); in ath12k_mac_vif_flush_key_cache()
8065 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_mac_vif_cache_flush()
8067 struct ath12k_vif_cache *cache = ahvif->cache[arvif->link_id]; in ath12k_mac_vif_cache_flush()
8068 struct ath12k_base *ab = ar->ab; in ath12k_mac_vif_cache_flush()
8073 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_vif_cache_flush()
8078 if (cache->tx_conf.changed) { in ath12k_mac_vif_cache_flush()
8079 ret = ath12k_mac_conf_tx(arvif, cache->tx_conf.ac, in ath12k_mac_vif_cache_flush()
8080 &cache->tx_conf.tx_queue_params); in ath12k_mac_vif_cache_flush()
8087 if (cache->bss_conf_changed) { in ath12k_mac_vif_cache_flush()
8090 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()
8091 vif->addr, arvif->link_id); in ath12k_mac_vif_cache_flush()
8095 cache->bss_conf_changed); in ath12k_mac_vif_cache_flush()
8098 if (!list_empty(&cache->key_conf.list)) in ath12k_mac_vif_cache_flush()
8101 ath12k_ahvif_put_link_cache(ahvif, arvif->link_id); in ath12k_mac_vif_cache_flush()
8108 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_mac_assign_vif_to_vdev()
8111 struct ath12k_hw *ah = hw->priv; in ath12k_mac_assign_vif_to_vdev()
8114 u8 link_id = arvif->link_id; in ath12k_mac_assign_vif_to_vdev()
8117 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_assign_vif_to_vdev()
8119 if (ah->num_radio == 1) in ath12k_mac_assign_vif_to_vdev()
8120 ar = ah->radio; in ath12k_mac_assign_vif_to_vdev()
8133 scan_arvif = wiphy_dereference(hw->wiphy, in ath12k_mac_assign_vif_to_vdev()
8134 ahvif->link[ATH12K_DEFAULT_SCAN_LINK]); in ath12k_mac_assign_vif_to_vdev()
8135 if (scan_arvif && scan_arvif->ar == ar) { in ath12k_mac_assign_vif_to_vdev()
8136 ar->scan.arvif = NULL; in ath12k_mac_assign_vif_to_vdev()
8142 if (arvif->ar) { in ath12k_mac_assign_vif_to_vdev()
8144 if (WARN_ON(!arvif->is_created)) { in ath12k_mac_assign_vif_to_vdev()
8145 arvif->ar = NULL; in ath12k_mac_assign_vif_to_vdev()
8149 if (ah->num_radio == 1) in ath12k_mac_assign_vif_to_vdev()
8150 return arvif->ar; in ath12k_mac_assign_vif_to_vdev()
8156 if (ar != arvif->ar) { in ath12k_mac_assign_vif_to_vdev()
8157 if (WARN_ON(arvif->is_started)) in ath12k_mac_assign_vif_to_vdev()
8165 ab = ar->ab; in ath12k_mac_assign_vif_to_vdev()
8171 if (vif->type == NL80211_IFTYPE_AP && in ath12k_mac_assign_vif_to_vdev()
8172 ar->num_peers > (ar->max_num_peers - 1)) { in ath12k_mac_assign_vif_to_vdev()
8177 if (arvif->is_created) in ath12k_mac_assign_vif_to_vdev()
8180 if (ar->num_created_vdevs > (TARGET_NUM_VDEVS - 1)) { in ath12k_mac_assign_vif_to_vdev()
8188 ath12k_warn(ab, "failed to create vdev %pM ret %d", vif->addr, ret); in ath12k_mac_assign_vif_to_vdev()
8199 return arvif->ar; in ath12k_mac_assign_vif_to_vdev()
8210 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_add_interface()
8214 ahvif->ah = ah; in ath12k_mac_op_add_interface()
8215 ahvif->vif = vif; in ath12k_mac_op_add_interface()
8216 arvif = &ahvif->deflink; in ath12k_mac_op_add_interface()
8217 arvif->ahvif = ahvif; in ath12k_mac_op_add_interface()
8219 INIT_LIST_HEAD(&arvif->list); in ath12k_mac_op_add_interface()
8220 INIT_DELAYED_WORK(&arvif->connection_loss_work, in ath12k_mac_op_add_interface()
8223 for (i = 0; i < ARRAY_SIZE(arvif->bitrate_mask.control); i++) { in ath12k_mac_op_add_interface()
8224 arvif->bitrate_mask.control[i].legacy = 0xffffffff; in ath12k_mac_op_add_interface()
8225 memset(arvif->bitrate_mask.control[i].ht_mcs, 0xff, in ath12k_mac_op_add_interface()
8226 sizeof(arvif->bitrate_mask.control[i].ht_mcs)); in ath12k_mac_op_add_interface()
8227 memset(arvif->bitrate_mask.control[i].vht_mcs, 0xff, in ath12k_mac_op_add_interface()
8228 sizeof(arvif->bitrate_mask.control[i].vht_mcs)); in ath12k_mac_op_add_interface()
8232 vif->cab_queue = ATH12K_HW_DEFAULT_QUEUE; in ath12k_mac_op_add_interface()
8233 for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++) in ath12k_mac_op_add_interface()
8234 vif->hw_queue[i] = ATH12K_HW_DEFAULT_QUEUE; in ath12k_mac_op_add_interface()
8236 vif->driver_flags |= IEEE80211_VIF_SUPPORTS_UAPSD; in ath12k_mac_op_add_interface()
8251 spin_lock_bh(&dp->tx_desc_lock[i]); in ath12k_mac_vif_unref()
8253 list_for_each_entry(tx_desc_info, &dp->tx_desc_used_list[i], in ath12k_mac_vif_unref()
8255 skb = tx_desc_info->skb; in ath12k_mac_vif_unref()
8260 if (skb_cb->vif == vif) in ath12k_mac_vif_unref()
8261 skb_cb->vif = NULL; in ath12k_mac_vif_unref()
8264 spin_unlock_bh(&dp->tx_desc_lock[i]); in ath12k_mac_vif_unref()
8270 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_mac_vdev_delete()
8272 struct ath12k_base *ab = ar->ab; in ath12k_mac_vdev_delete()
8276 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_vdev_delete()
8278 reinit_completion(&ar->vdev_delete_done); in ath12k_mac_vdev_delete()
8280 ret = ath12k_wmi_vdev_delete(ar, arvif->vdev_id); in ath12k_mac_vdev_delete()
8283 arvif->vdev_id, ret); in ath12k_mac_vdev_delete()
8287 time_left = wait_for_completion_timeout(&ar->vdev_delete_done, in ath12k_mac_vdev_delete()
8294 ab->free_vdev_map |= 1LL << arvif->vdev_id; in ath12k_mac_vdev_delete()
8295 ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id); in ath12k_mac_vdev_delete()
8296 ar->num_created_vdevs--; in ath12k_mac_vdev_delete()
8298 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { in ath12k_mac_vdev_delete()
8299 ar->monitor_vdev_id = -1; in ath12k_mac_vdev_delete()
8300 ar->monitor_vdev_created = false; in ath12k_mac_vdev_delete()
8301 } else if (ar->monitor_vdev_created && !ar->monitor_started) { in ath12k_mac_vdev_delete()
8306 vif->addr, arvif->vdev_id); in ath12k_mac_vdev_delete()
8309 spin_lock_bh(&ar->data_lock); in ath12k_mac_vdev_delete()
8310 list_del(&arvif->list); in ath12k_mac_vdev_delete()
8311 spin_unlock_bh(&ar->data_lock); in ath12k_mac_vdev_delete()
8313 ath12k_peer_cleanup(ar, arvif->vdev_id); in ath12k_mac_vdev_delete()
8314 ath12k_ahvif_put_link_cache(ahvif, arvif->link_id); in ath12k_mac_vdev_delete()
8316 idr_for_each(&ar->txmgmt_idr, in ath12k_mac_vdev_delete()
8319 ath12k_mac_vif_unref(&ab->dp, vif); in ath12k_mac_vdev_delete()
8320 ath12k_dp_tx_put_bank_profile(&ab->dp, arvif->bank_id); in ath12k_mac_vdev_delete()
8326 arvif->is_created = false; in ath12k_mac_vdev_delete()
8327 arvif->ar = NULL; in ath12k_mac_vdev_delete()
8340 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_remove_interface()
8347 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); in ath12k_mac_op_remove_interface()
8348 if (!arvif || !arvif->is_created) in ath12k_mac_op_remove_interface()
8351 ar = arvif->ar; in ath12k_mac_op_remove_interface()
8357 if (ar->scan.arvif == arvif) { in ath12k_mac_op_remove_interface()
8358 wiphy_work_cancel(hw->wiphy, &ar->scan.vdev_clean_wk); in ath12k_mac_op_remove_interface()
8360 spin_lock_bh(&ar->data_lock); in ath12k_mac_op_remove_interface()
8361 ar->scan.arvif = NULL; in ath12k_mac_op_remove_interface()
8362 if (!ar->scan.is_roc) { in ath12k_mac_op_remove_interface()
8367 ieee80211_scan_completed(ar->ah->hw, &info); in ath12k_mac_op_remove_interface()
8370 ar->scan.state = ATH12K_SCAN_IDLE; in ath12k_mac_op_remove_interface()
8371 ar->scan_channel = NULL; in ath12k_mac_op_remove_interface()
8372 ar->scan.roc_freq = 0; in ath12k_mac_op_remove_interface()
8373 spin_unlock_bh(&ar->data_lock); in ath12k_mac_op_remove_interface()
8397 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_configure_filter()
8399 ar->filter_flags = total_flags; in ath12k_mac_configure_filter()
8402 reset_flag = !(ar->filter_flags & FIF_BCN_PRBRESP_PROMISC); in ath12k_mac_configure_filter()
8406 ath12k_warn(ar->ab, in ath12k_mac_configure_filter()
8409 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_configure_filter()
8422 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_configure_filter()
8437 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_get_antenna()
8440 antennas_rx = max_t(u32, antennas_rx, ar->cfg_rx_chainmask); in ath12k_mac_op_get_antenna()
8441 antennas_tx = max_t(u32, antennas_tx, ar->cfg_tx_chainmask); in ath12k_mac_op_get_antenna()
8457 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_set_antenna()
8474 int ret = -EINVAL; in ath12k_mac_ampdu_action()
8476 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_ampdu_action()
8480 return -EINVAL; in ath12k_mac_ampdu_action()
8482 switch (params->action) { in ath12k_mac_ampdu_action()
8494 /* Tx A-MPDU aggregation offloaded to hw/fw so deny mac80211 in ath12k_mac_ampdu_action()
8497 ret = -EOPNOTSUPP; in ath12k_mac_ampdu_action()
8502 ath12k_warn(ar->ab, "unable to perform ampdu action %d for vif %pM link %u ret %d\n", in ath12k_mac_ampdu_action()
8503 params->action, vif->addr, link_id, ret); in ath12k_mac_ampdu_action()
8512 struct ieee80211_sta *sta = params->sta; in ath12k_mac_op_ampdu_action()
8514 unsigned long links_map = ahsta->links_map; in ath12k_mac_op_ampdu_action()
8515 int ret = -EINVAL; in ath12k_mac_op_ampdu_action()
8518 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_ampdu_action()
8538 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_add_chanctx()
8542 return -EINVAL; in ath12k_mac_op_add_chanctx()
8544 ab = ar->ab; in ath12k_mac_op_add_chanctx()
8548 ctx->def.chan->center_freq, ctx->def.width, ctx); in ath12k_mac_op_add_chanctx()
8550 spin_lock_bh(&ar->data_lock); in ath12k_mac_op_add_chanctx()
8554 ar->rx_channel = ctx->def.chan; in ath12k_mac_op_add_chanctx()
8555 spin_unlock_bh(&ar->data_lock); in ath12k_mac_op_add_chanctx()
8566 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_remove_chanctx()
8572 ab = ar->ab; in ath12k_mac_op_remove_chanctx()
8576 ctx->def.chan->center_freq, ctx->def.width, ctx); in ath12k_mac_op_remove_chanctx()
8578 spin_lock_bh(&ar->data_lock); in ath12k_mac_op_remove_chanctx()
8582 ar->rx_channel = NULL; in ath12k_mac_op_remove_chanctx()
8583 spin_unlock_bh(&ar->data_lock); in ath12k_mac_op_remove_chanctx()
8594 int n = ar->mac.sbands[band].n_iftype_data; in ath12k_mac_check_down_grade_phy_mode()
8601 data = ar->mac.iftype[band]; in ath12k_mac_check_down_grade_phy_mode()
8609 if (eht_cap && eht_cap->has_eht) in ath12k_mac_check_down_grade_phy_mode()
8641 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_check_down_grade_phy_mode()
8653 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_mac_mlo_get_vdev_args()
8660 lockdep_assert_wiphy(ahvif->ah->hw->wiphy); in ath12k_mac_mlo_get_vdev_args()
8665 if (hweight16(ahvif->vif->valid_links) > ATH12K_WMI_MLO_MAX_LINKS) in ath12k_mac_mlo_get_vdev_args()
8668 ml_arg->enabled = true; in ath12k_mac_mlo_get_vdev_args()
8674 ml_arg->link_add = true; in ath12k_mac_mlo_get_vdev_args()
8675 partner_info = ml_arg->partner_info; in ath12k_mac_mlo_get_vdev_args()
8677 links = ahvif->links_map; in ath12k_mac_mlo_get_vdev_args()
8679 arvif_p = wiphy_dereference(ahvif->ah->hw->wiphy, ahvif->link[link_id]); in ath12k_mac_mlo_get_vdev_args()
8687 link_conf = wiphy_dereference(ahvif->ah->hw->wiphy, in ath12k_mac_mlo_get_vdev_args()
8688 ahvif->vif->link_conf[arvif_p->link_id]); in ath12k_mac_mlo_get_vdev_args()
8693 partner_info->vdev_id = arvif_p->vdev_id; in ath12k_mac_mlo_get_vdev_args()
8694 partner_info->hw_link_id = arvif_p->ar->pdev->hw_link_id; in ath12k_mac_mlo_get_vdev_args()
8695 ether_addr_copy(partner_info->addr, link_conf->addr); in ath12k_mac_mlo_get_vdev_args()
8696 ml_arg->num_partner_links++; in ath12k_mac_mlo_get_vdev_args()
8706 struct ath12k *ar = arvif->ar; in ath12k_mac_vdev_start_restart()
8707 struct ath12k_base *ab = ar->ab; in ath12k_mac_vdev_start_restart()
8709 const struct cfg80211_chan_def *chandef = &ctx->def; in ath12k_mac_vdev_start_restart()
8711 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_mac_vdev_start_restart()
8716 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_vdev_start_restart()
8720 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()
8721 ahvif->vif->addr, arvif->link_id); in ath12k_mac_vdev_start_restart()
8722 return -ENOLINK; in ath12k_mac_vdev_start_restart()
8725 reinit_completion(&ar->vdev_setup_done); in ath12k_mac_vdev_start_restart()
8727 arg.vdev_id = arvif->vdev_id; in ath12k_mac_vdev_start_restart()
8728 arg.dtim_period = arvif->dtim_period; in ath12k_mac_vdev_start_restart()
8729 arg.bcn_intval = arvif->beacon_interval; in ath12k_mac_vdev_start_restart()
8730 arg.punct_bitmap = ~arvif->punct_bitmap; in ath12k_mac_vdev_start_restart()
8732 arg.freq = chandef->chan->center_freq; in ath12k_mac_vdev_start_restart()
8733 arg.band_center_freq1 = chandef->center_freq1; in ath12k_mac_vdev_start_restart()
8734 arg.band_center_freq2 = chandef->center_freq2; in ath12k_mac_vdev_start_restart()
8735 arg.mode = ath12k_phymodes[chandef->chan->band][chandef->width]; in ath12k_mac_vdev_start_restart()
8738 chandef->chan->band, in ath12k_mac_vdev_start_restart()
8739 ahvif->vif->type); in ath12k_mac_vdev_start_restart()
8741 arg.max_power = chandef->chan->max_power; in ath12k_mac_vdev_start_restart()
8742 arg.max_reg_power = chandef->chan->max_reg_power; in ath12k_mac_vdev_start_restart()
8743 arg.max_antenna_gain = chandef->chan->max_antenna_gain; in ath12k_mac_vdev_start_restart()
8745 arg.pref_tx_streams = ar->num_tx_chains; in ath12k_mac_vdev_start_restart()
8746 arg.pref_rx_streams = ar->num_rx_chains; in ath12k_mac_vdev_start_restart()
8751 ar->ab->wmi_ab.svc_map)) { in ath12k_mac_vdev_start_restart()
8759 if (ahvif->vdev_type == WMI_VDEV_TYPE_AP) { in ath12k_mac_vdev_start_restart()
8760 arg.ssid = ahvif->u.ap.ssid; in ath12k_mac_vdev_start_restart()
8761 arg.ssid_len = ahvif->u.ap.ssid_len; in ath12k_mac_vdev_start_restart()
8762 arg.hidden_ssid = ahvif->u.ap.hidden_ssid; in ath12k_mac_vdev_start_restart()
8765 arg.chan_radar = !!(chandef->chan->flags & IEEE80211_CHAN_RADAR); in ath12k_mac_vdev_start_restart()
8767 arg.freq2_radar = ctx->radar_enabled; in ath12k_mac_vdev_start_restart()
8771 spin_lock_bh(&ab->base_lock); in ath12k_mac_vdev_start_restart()
8772 arg.regdomain = ar->ab->dfs_region; in ath12k_mac_vdev_start_restart()
8773 spin_unlock_bh(&ab->base_lock); in ath12k_mac_vdev_start_restart()
8776 if (link_conf->he_support) { in ath12k_mac_vdev_start_restart()
8779 ath12k_warn(ar->ab, "failed to set he mode vdev %i\n", in ath12k_mac_vdev_start_restart()
8786 arg.passive |= !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR); in ath12k_mac_vdev_start_restart()
8798 ath12k_warn(ar->ab, "failed to %s WMI vdev %i\n", in ath12k_mac_vdev_start_restart()
8810 ar->num_started_vdevs++; in ath12k_mac_vdev_start_restart()
8812 ahvif->vif->addr, arvif->vdev_id); in ath12k_mac_vdev_start_restart()
8814 /* Enable CAC Running Flag in the driver by checking all sub-channel's DFS in ath12k_mac_vdev_start_restart()
8820 if (arvif->ahvif->vdev_type == WMI_VDEV_TYPE_AP && ctx->radar_enabled && in ath12k_mac_vdev_start_restart()
8821 cfg80211_chandef_dfs_usable(hw->wiphy, chandef)) { in ath12k_mac_vdev_start_restart()
8822 set_bit(ATH12K_FLAG_CAC_RUNNING, &ar->dev_flags); in ath12k_mac_vdev_start_restart()
8823 dfs_cac_time = cfg80211_chandef_dfs_cac_time(hw->wiphy, chandef); in ath12k_mac_vdev_start_restart()
8833 arvif->vdev_id, ret); in ath12k_mac_vdev_start_restart()
8869 lockdep_assert_wiphy(ahvif->ah->hw->wiphy); in ath12k_mac_change_chanctx_cnt_iter()
8871 links_map = ahvif->links_map; in ath12k_mac_change_chanctx_cnt_iter()
8873 arvif = wiphy_dereference(ahvif->ah->hw->wiphy, ahvif->link[link_id]); in ath12k_mac_change_chanctx_cnt_iter()
8877 if (arvif->ar != arg->ar) in ath12k_mac_change_chanctx_cnt_iter()
8880 link_conf = wiphy_dereference(ahvif->ah->hw->wiphy, in ath12k_mac_change_chanctx_cnt_iter()
8881 vif->link_conf[link_id]); in ath12k_mac_change_chanctx_cnt_iter()
8885 if (rcu_access_pointer(link_conf->chanctx_conf) != arg->ctx) in ath12k_mac_change_chanctx_cnt_iter()
8888 arg->n_vifs++; in ath12k_mac_change_chanctx_cnt_iter()
8904 lockdep_assert_wiphy(ahvif->ah->hw->wiphy); in ath12k_mac_change_chanctx_fill_iter()
8906 links_map = ahvif->links_map; in ath12k_mac_change_chanctx_fill_iter()
8908 arvif = wiphy_dereference(ahvif->ah->hw->wiphy, ahvif->link[link_id]); in ath12k_mac_change_chanctx_fill_iter()
8912 if (arvif->ar != arg->ar) in ath12k_mac_change_chanctx_fill_iter()
8915 link_conf = wiphy_dereference(ahvif->ah->hw->wiphy, in ath12k_mac_change_chanctx_fill_iter()
8916 vif->link_conf[arvif->link_id]); in ath12k_mac_change_chanctx_fill_iter()
8920 ctx = rcu_access_pointer(link_conf->chanctx_conf); in ath12k_mac_change_chanctx_fill_iter()
8921 if (ctx != arg->ctx) in ath12k_mac_change_chanctx_fill_iter()
8924 if (WARN_ON(arg->next_vif == arg->n_vifs)) in ath12k_mac_change_chanctx_fill_iter()
8927 arg->vifs[arg->next_vif].vif = vif; in ath12k_mac_change_chanctx_fill_iter()
8928 arg->vifs[arg->next_vif].old_ctx = ctx; in ath12k_mac_change_chanctx_fill_iter()
8929 arg->vifs[arg->next_vif].new_ctx = ctx; in ath12k_mac_change_chanctx_fill_iter()
8930 arg->vifs[arg->next_vif].link_conf = link_conf; in ath12k_mac_change_chanctx_fill_iter()
8931 arg->next_vif++; in ath12k_mac_change_chanctx_fill_iter()
8967 if (arvif->ahvif->vdev_type != WMI_VDEV_TYPE_STA) in ath12k_mac_update_peer_puncturing_width()
8975 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_update_peer_puncturing_width()
8977 def.punctured, def.width, arvif->vdev_id); in ath12k_mac_update_peer_puncturing_width()
8979 ret = ath12k_wmi_set_peer_param(ar, arvif->bssid, in ath12k_mac_update_peer_puncturing_width()
8980 arvif->vdev_id, param_id, in ath12k_mac_update_peer_puncturing_width()
8993 struct ath12k_base *ab = ar->ab; in ath12k_mac_update_vif_chan()
9002 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_update_vif_chan()
9008 link_id = link_conf->link_id; in ath12k_mac_update_vif_chan()
9009 arvif = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy, in ath12k_mac_update_vif_chan()
9010 ahvif->link[link_id]); in ath12k_mac_update_vif_chan()
9012 if (vif->type == NL80211_IFTYPE_MONITOR) in ath12k_mac_update_vif_chan()
9016 "mac chanctx switch vdev_id %i freq %u->%u width %d->%d\n", in ath12k_mac_update_vif_chan()
9017 arvif->vdev_id, in ath12k_mac_update_vif_chan()
9018 vifs[i].old_ctx->def.chan->center_freq, in ath12k_mac_update_vif_chan()
9019 vifs[i].new_ctx->def.chan->center_freq, in ath12k_mac_update_vif_chan()
9020 vifs[i].old_ctx->def.width, in ath12k_mac_update_vif_chan()
9021 vifs[i].new_ctx->def.width); in ath12k_mac_update_vif_chan()
9023 if (WARN_ON(!arvif->is_started)) in ath12k_mac_update_vif_chan()
9026 arvif->punct_bitmap = vifs[i].new_ctx->def.punctured; in ath12k_mac_update_vif_chan()
9029 * If vdev is down then it expect vdev_stop->vdev_start. in ath12k_mac_update_vif_chan()
9031 if (arvif->is_up) { in ath12k_mac_update_vif_chan()
9035 arvif->vdev_id, ret); in ath12k_mac_update_vif_chan()
9042 arvif->vdev_id, ret); in ath12k_mac_update_vif_chan()
9049 arvif->vdev_id, ret); in ath12k_mac_update_vif_chan()
9059 params.vdev_id = arvif->vdev_id; in ath12k_mac_update_vif_chan()
9060 params.aid = ahvif->aid; in ath12k_mac_update_vif_chan()
9061 params.bssid = arvif->bssid; in ath12k_mac_update_vif_chan()
9062 if (vif->mbssid_tx_vif) { in ath12k_mac_update_vif_chan()
9064 ath12k_vif_to_ahvif(vif->mbssid_tx_vif); in ath12k_mac_update_vif_chan()
9065 struct ath12k_link_vif *tx_arvif = &tx_ahvif->deflink; in ath12k_mac_update_vif_chan()
9067 params.tx_bssid = tx_arvif->bssid; in ath12k_mac_update_vif_chan()
9068 params.nontx_profile_idx = link_conf->bssid_index; in ath12k_mac_update_vif_chan()
9069 params.nontx_profile_cnt = 1 << link_conf->bssid_indicator; in ath12k_mac_update_vif_chan()
9071 ret = ath12k_wmi_vdev_up(arvif->ar, &params); in ath12k_mac_update_vif_chan()
9074 arvif->vdev_id, ret); in ath12k_mac_update_vif_chan()
9078 ret = ath12k_mac_update_peer_puncturing_width(arvif->ar, arvif, in ath12k_mac_update_vif_chan()
9079 vifs[i].new_ctx->def); in ath12k_mac_update_vif_chan()
9081 ath12k_warn(ar->ab, in ath12k_mac_update_vif_chan()
9083 vifs[i].new_ctx->def.punctured, in ath12k_mac_update_vif_chan()
9084 vifs[i].new_ctx->def.width, ret); in ath12k_mac_update_vif_chan()
9090 if (!monitor_vif && ar->monitor_vdev_created) { in ath12k_mac_update_vif_chan()
9103 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_update_active_vif_chan()
9133 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_change_chanctx()
9139 ab = ar->ab; in ath12k_mac_op_change_chanctx()
9143 ctx->def.chan->center_freq, ctx->def.width, ctx, changed); in ath12k_mac_op_change_chanctx()
9162 struct ath12k_base *ab = ar->ab; in ath12k_start_vdev_delay()
9163 struct ath12k_vif *ahvif = arvif->ahvif; in ath12k_start_vdev_delay()
9164 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); in ath12k_start_vdev_delay()
9167 if (WARN_ON(arvif->is_started)) in ath12k_start_vdev_delay()
9168 return -EBUSY; in ath12k_start_vdev_delay()
9170 ret = ath12k_mac_vdev_start(arvif, &arvif->chanctx); in ath12k_start_vdev_delay()
9173 arvif->vdev_id, vif->addr, in ath12k_start_vdev_delay()
9174 arvif->chanctx.def.chan->center_freq, ret); in ath12k_start_vdev_delay()
9178 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { in ath12k_start_vdev_delay()
9179 ret = ath12k_monitor_vdev_up(ar, arvif->vdev_id); in ath12k_start_vdev_delay()
9186 arvif->is_started = true; in ath12k_start_vdev_delay()
9202 u8 link_id = link_conf->link_id; in ath12k_mac_op_assign_vif_chanctx()
9206 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_assign_vif_chanctx()
9214 return -ENOMEM; in ath12k_mac_op_assign_vif_chanctx()
9219 …ath12k_warn(arvif->ar->ab, "failed to assign chanctx for vif %pM link id %u link vif is already st… in ath12k_mac_op_assign_vif_chanctx()
9220 vif->addr, link_id); in ath12k_mac_op_assign_vif_chanctx()
9221 return -EINVAL; in ath12k_mac_op_assign_vif_chanctx()
9224 ab = ar->ab; in ath12k_mac_op_assign_vif_chanctx()
9228 ctx, arvif->vdev_id); in ath12k_mac_op_assign_vif_chanctx()
9230 arvif->punct_bitmap = ctx->def.punctured; in ath12k_mac_op_assign_vif_chanctx()
9233 if (ab->hw_params->vdev_start_delay && in ath12k_mac_op_assign_vif_chanctx()
9234 ahvif->vdev_type != WMI_VDEV_TYPE_AP && in ath12k_mac_op_assign_vif_chanctx()
9235 ahvif->vdev_type != WMI_VDEV_TYPE_MONITOR && in ath12k_mac_op_assign_vif_chanctx()
9236 !ath12k_peer_exist_by_vdev_id(ab, arvif->vdev_id)) { in ath12k_mac_op_assign_vif_chanctx()
9237 memcpy(&arvif->chanctx, ctx, sizeof(*ctx)); in ath12k_mac_op_assign_vif_chanctx()
9242 if (WARN_ON(arvif->is_started)) { in ath12k_mac_op_assign_vif_chanctx()
9243 ret = -EBUSY; in ath12k_mac_op_assign_vif_chanctx()
9247 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { in ath12k_mac_op_assign_vif_chanctx()
9252 arvif->is_started = true; in ath12k_mac_op_assign_vif_chanctx()
9259 arvif->vdev_id, vif->addr, in ath12k_mac_op_assign_vif_chanctx()
9260 ctx->def.chan->center_freq, ret); in ath12k_mac_op_assign_vif_chanctx()
9264 if (ahvif->vdev_type != WMI_VDEV_TYPE_MONITOR && ar->monitor_vdev_created) in ath12k_mac_op_assign_vif_chanctx()
9267 arvif->is_started = true; in ath12k_mac_op_assign_vif_chanctx()
9285 u8 link_id = link_conf->link_id; in ath12k_mac_op_unassign_vif_chanctx()
9288 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_unassign_vif_chanctx()
9290 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); in ath12k_mac_op_unassign_vif_chanctx()
9299 if (!arvif || !arvif->is_created) in ath12k_mac_op_unassign_vif_chanctx()
9302 ar = arvif->ar; in ath12k_mac_op_unassign_vif_chanctx()
9303 ab = ar->ab; in ath12k_mac_op_unassign_vif_chanctx()
9307 ctx, arvif->vdev_id); in ath12k_mac_op_unassign_vif_chanctx()
9309 WARN_ON(!arvif->is_started); in ath12k_mac_op_unassign_vif_chanctx()
9311 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { in ath12k_mac_op_unassign_vif_chanctx()
9316 arvif->is_started = false; in ath12k_mac_op_unassign_vif_chanctx()
9319 if (ahvif->vdev_type != WMI_VDEV_TYPE_STA && in ath12k_mac_op_unassign_vif_chanctx()
9320 ahvif->vdev_type != WMI_VDEV_TYPE_MONITOR) { in ath12k_mac_op_unassign_vif_chanctx()
9325 arvif->vdev_id, ret); in ath12k_mac_op_unassign_vif_chanctx()
9327 arvif->is_started = false; in ath12k_mac_op_unassign_vif_chanctx()
9329 if (ahvif->vdev_type != WMI_VDEV_TYPE_MONITOR && in ath12k_mac_op_unassign_vif_chanctx()
9330 ar->num_started_vdevs == 1 && ar->monitor_vdev_created) in ath12k_mac_op_unassign_vif_chanctx()
9345 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_switch_vif_chanctx()
9347 ar = ath12k_get_ar_by_ctx(hw, vifs->old_ctx); in ath12k_mac_op_switch_vif_chanctx()
9349 return -EINVAL; in ath12k_mac_op_switch_vif_chanctx()
9352 if (ar != ath12k_get_ar_by_ctx(hw, vifs->new_ctx)) in ath12k_mac_op_switch_vif_chanctx()
9353 return -EINVAL; in ath12k_mac_op_switch_vif_chanctx()
9355 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_op_switch_vif_chanctx()
9369 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_set_vdev_param_to_all_vifs()
9371 list_for_each_entry(arvif, &ar->arvifs, list) { in ath12k_set_vdev_param_to_all_vifs()
9372 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "setting mac vdev %d param %d value %d\n", in ath12k_set_vdev_param_to_all_vifs()
9373 param, arvif->vdev_id, value); in ath12k_set_vdev_param_to_all_vifs()
9375 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_set_vdev_param_to_all_vifs()
9378 ath12k_warn(ar->ab, "failed to set param %d for vdev %d: %d\n", in ath12k_set_vdev_param_to_all_vifs()
9379 param, arvif->vdev_id, ret); in ath12k_set_vdev_param_to_all_vifs()
9396 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_set_rts_threshold()
9406 ath12k_warn(ar->ab, "failed to set RTS config for all vdevs of pdev %d", in ath12k_mac_op_set_rts_threshold()
9407 ar->pdev->pdev_id); in ath12k_mac_op_set_rts_threshold()
9428 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_set_frag_threshold()
9430 return -EOPNOTSUPP; in ath12k_mac_op_set_frag_threshold()
9438 time_left = wait_event_timeout(ar->dp.tx_empty_waitq, in ath12k_mac_flush()
9439 (atomic_read(&ar->dp.num_tx_pending) == 0), in ath12k_mac_flush()
9442 ath12k_warn(ar->ab, in ath12k_mac_flush()
9444 atomic_read(&ar->dp.num_tx_pending)); in ath12k_mac_flush()
9445 ret = -ETIMEDOUT; in ath12k_mac_flush()
9448 time_left = wait_event_timeout(ar->txmgmt_empty_waitq, in ath12k_mac_flush()
9449 (atomic_read(&ar->num_pending_mgmt_tx) == 0), in ath12k_mac_flush()
9452 ath12k_warn(ar->ab, in ath12k_mac_flush()
9454 atomic_read(&ar->num_pending_mgmt_tx)); in ath12k_mac_flush()
9455 ret = -ETIMEDOUT; in ath12k_mac_flush()
9463 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_wait_tx_complete()
9480 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_flush()
9493 wiphy_work_flush(hw->wiphy, &ar->wmi_mgmt_tx_work); in ath12k_mac_op_flush()
9496 links = ahvif->links_map; in ath12k_mac_op_flush()
9498 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); in ath12k_mac_op_flush()
9499 if (!(arvif && arvif->ar)) in ath12k_mac_op_flush()
9502 ath12k_mac_flush(arvif->ar); in ath12k_mac_op_flush()
9514 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) in ath12k_mac_bitrate_mask_num_ht_rates()
9515 num_rates += hweight16(mask->control[band].ht_mcs[i]); in ath12k_mac_bitrate_mask_num_ht_rates()
9527 num_rates = hweight32(mask->control[band].legacy); in ath12k_mac_has_single_legacy_rate()
9544 struct ieee80211_supported_band *sband = &ar->mac.sbands[band]; in ath12k_mac_bitrate_mask_get_single_nss()
9545 u16 vht_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map); in ath12k_mac_bitrate_mask_get_single_nss()
9550 /* No need to consider legacy here. Basic rates are always present in ath12k_mac_bitrate_mask_get_single_nss()
9554 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) { in ath12k_mac_bitrate_mask_get_single_nss()
9555 if (mask->control[band].ht_mcs[i] == 0) in ath12k_mac_bitrate_mask_get_single_nss()
9557 else if (mask->control[band].ht_mcs[i] == in ath12k_mac_bitrate_mask_get_single_nss()
9558 sband->ht_cap.mcs.rx_mask[i]) in ath12k_mac_bitrate_mask_get_single_nss()
9564 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) { in ath12k_mac_bitrate_mask_get_single_nss()
9565 if (mask->control[band].vht_mcs[i] == 0) in ath12k_mac_bitrate_mask_get_single_nss()
9567 else if (mask->control[band].vht_mcs[i] == in ath12k_mac_bitrate_mask_get_single_nss()
9580 if (BIT(fls(ht_nss_mask)) - 1 != ht_nss_mask) in ath12k_mac_bitrate_mask_get_single_nss()
9599 if (hweight32(mask->control[band].legacy) != 1) in ath12k_mac_get_single_legacy_rate()
9600 return -EINVAL; in ath12k_mac_get_single_legacy_rate()
9602 rate_idx = ffs(mask->control[band].legacy) - 1; in ath12k_mac_get_single_legacy_rate()
9624 struct ath12k *ar = arvif->ar; in ath12k_mac_set_fixed_rate_params()
9628 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_set_fixed_rate_params()
9630 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac set fixed rate params vdev %i rate 0x%02x nss %u sgi %u\n", in ath12k_mac_set_fixed_rate_params()
9631 arvif->vdev_id, rate, nss, sgi); in ath12k_mac_set_fixed_rate_params()
9634 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_set_fixed_rate_params()
9637 ath12k_warn(ar->ab, "failed to set fixed rate param 0x%02x: %d\n", in ath12k_mac_set_fixed_rate_params()
9643 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_set_fixed_rate_params()
9646 ath12k_warn(ar->ab, "failed to set nss param %d: %d\n", in ath12k_mac_set_fixed_rate_params()
9652 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_set_fixed_rate_params()
9655 ath12k_warn(ar->ab, "failed to set sgi param %d: %d\n", in ath12k_mac_set_fixed_rate_params()
9661 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath12k_mac_set_fixed_rate_params()
9664 ath12k_warn(ar->ab, "failed to set ldpc param %d: %d\n", in ath12k_mac_set_fixed_rate_params()
9681 vht_mcs = mask->control[band].vht_mcs[i]; in ath12k_mac_vht_mcs_range_present()
9685 case BIT(8) - 1: in ath12k_mac_vht_mcs_range_present()
9686 case BIT(9) - 1: in ath12k_mac_vht_mcs_range_present()
9687 case BIT(10) - 1: in ath12k_mac_vht_mcs_range_present()
9703 struct ath12k *ar = arvif->ar; in ath12k_mac_set_bitrate_mask_iter()
9705 arsta = rcu_dereference(ahsta->link[arvif->link_id]); in ath12k_mac_set_bitrate_mask_iter()
9706 if (!arsta || arsta->arvif != arvif) in ath12k_mac_set_bitrate_mask_iter()
9709 spin_lock_bh(&ar->data_lock); in ath12k_mac_set_bitrate_mask_iter()
9710 arsta->changed |= IEEE80211_RC_SUPP_RATES_CHANGED; in ath12k_mac_set_bitrate_mask_iter()
9711 spin_unlock_bh(&ar->data_lock); in ath12k_mac_set_bitrate_mask_iter()
9713 wiphy_work_queue(ath12k_ar_to_hw(ar)->wiphy, &arsta->update_wk); in ath12k_mac_set_bitrate_mask_iter()
9722 struct ath12k *ar = arvif->ar; in ath12k_mac_disable_peer_fixed_rate()
9725 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_disable_peer_fixed_rate()
9727 arsta = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy, in ath12k_mac_disable_peer_fixed_rate()
9728 ahsta->link[arvif->link_id]); in ath12k_mac_disable_peer_fixed_rate()
9730 if (!arsta || arsta->arvif != arvif) in ath12k_mac_disable_peer_fixed_rate()
9733 ret = ath12k_wmi_set_peer_param(ar, arsta->addr, in ath12k_mac_disable_peer_fixed_rate()
9734 arvif->vdev_id, in ath12k_mac_disable_peer_fixed_rate()
9738 ath12k_warn(ar->ab, in ath12k_mac_disable_peer_fixed_rate()
9740 arsta->addr, ret); in ath12k_mac_disable_peer_fixed_rate()
9763 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_set_bitrate_mask()
9765 arvif = &ahvif->deflink; in ath12k_mac_op_set_bitrate_mask()
9767 ar = arvif->ar; in ath12k_mac_op_set_bitrate_mask()
9768 if (ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)) { in ath12k_mac_op_set_bitrate_mask()
9769 ret = -EPERM; in ath12k_mac_op_set_bitrate_mask()
9773 band = def.chan->band; in ath12k_mac_op_set_bitrate_mask()
9774 ht_mcs_mask = mask->control[band].ht_mcs; in ath12k_mac_op_set_bitrate_mask()
9775 vht_mcs_mask = mask->control[band].vht_mcs; in ath12k_mac_op_set_bitrate_mask()
9776 ldpc = !!(ar->ht_cap_info & WMI_HT_CAP_LDPC); in ath12k_mac_op_set_bitrate_mask()
9778 sgi = mask->control[band].gi; in ath12k_mac_op_set_bitrate_mask()
9780 ret = -EINVAL; in ath12k_mac_op_set_bitrate_mask()
9785 * requires passing at least one of used basic rates along with them. in ath12k_mac_op_set_bitrate_mask()
9788 * suitable for setting single HT/VHT rates. in ath12k_mac_op_set_bitrate_mask()
9796 ath12k_warn(ar->ab, "failed to get single legacy rate for vdev %i: %d\n", in ath12k_mac_op_set_bitrate_mask()
9797 arvif->vdev_id, ret); in ath12k_mac_op_set_bitrate_mask()
9809 nss = min_t(u32, ar->num_tx_chains, in ath12k_mac_op_set_bitrate_mask()
9813 /* If multiple rates across different preambles are given in ath12k_mac_op_set_bitrate_mask()
9816 * - Single VHT Rate : peer_assoc command accommodates only MCS in ath12k_mac_op_set_bitrate_mask()
9817 * range values i.e 0-7, 0-8, 0-9 for VHT. Though mac80211 in ath12k_mac_op_set_bitrate_mask()
9818 * mandates passing basic rates along with HT/VHT rates, FW in ath12k_mac_op_set_bitrate_mask()
9820 * setting legacy and VHT rates using RATEMASK_CMD vdev cmd, in ath12k_mac_op_set_bitrate_mask()
9823 * If single VHT rate is passed along with HT rates, we select in ath12k_mac_op_set_bitrate_mask()
9825 * - Multiple VHT Rates : When Multiple VHT rates are given,this in ath12k_mac_op_set_bitrate_mask()
9826 * can be set using RATEMASK CMD which uses FW rate-ctl alg. in ath12k_mac_op_set_bitrate_mask()
9828 * RATEMASK_CMDID can cover all use cases of setting rates in ath12k_mac_op_set_bitrate_mask()
9829 * across multiple preambles and rates within same type. in ath12k_mac_op_set_bitrate_mask()
9841 ath12k_warn(ar->ab, in ath12k_mac_op_set_bitrate_mask()
9843 return -EINVAL; in ath12k_mac_op_set_bitrate_mask()
9850 arvif->bitrate_mask = *mask; in ath12k_mac_op_set_bitrate_mask()
9858 ath12k_warn(ar->ab, "failed to set fixed rate params on vdev %i: %d\n", in ath12k_mac_op_set_bitrate_mask()
9859 arvif->vdev_id, ret); in ath12k_mac_op_set_bitrate_mask()
9877 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_reconfig_complete()
9882 guard(mutex)(&ah->hw_mutex); in ath12k_mac_op_reconfig_complete()
9884 if (ah->state != ATH12K_HW_STATE_RESTARTED) in ath12k_mac_op_reconfig_complete()
9887 ah->state = ATH12K_HW_STATE_ON; in ath12k_mac_op_reconfig_complete()
9891 ab = ar->ab; in ath12k_mac_op_reconfig_complete()
9893 ath12k_warn(ar->ab, "pdev %d successfully recovered\n", in ath12k_mac_op_reconfig_complete()
9894 ar->pdev->pdev_id); in ath12k_mac_op_reconfig_complete()
9896 if (ab->is_reset) { in ath12k_mac_op_reconfig_complete()
9897 recovery_count = atomic_inc_return(&ab->recovery_count); in ath12k_mac_op_reconfig_complete()
9905 if (recovery_count == ab->num_radios) { in ath12k_mac_op_reconfig_complete()
9906 atomic_dec(&ab->reset_count); in ath12k_mac_op_reconfig_complete()
9907 complete(&ab->reset_complete); in ath12k_mac_op_reconfig_complete()
9908 ab->is_reset = false; in ath12k_mac_op_reconfig_complete()
9909 atomic_set(&ab->fail_cont_count, 0); in ath12k_mac_op_reconfig_complete()
9914 list_for_each_entry(arvif, &ar->arvifs, list) { in ath12k_mac_op_reconfig_complete()
9915 ahvif = arvif->ahvif; in ath12k_mac_op_reconfig_complete()
9918 ahvif->key_cipher, in ath12k_mac_op_reconfig_complete()
9919 arvif->is_up, in ath12k_mac_op_reconfig_complete()
9920 ahvif->vdev_type); in ath12k_mac_op_reconfig_complete()
9927 if (arvif->is_up && in ath12k_mac_op_reconfig_complete()
9928 ahvif->vdev_type == WMI_VDEV_TYPE_STA && in ath12k_mac_op_reconfig_complete()
9929 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE) { in ath12k_mac_op_reconfig_complete()
9930 ieee80211_hw_restart_disconnect(ahvif->vif); in ath12k_mac_op_reconfig_complete()
9946 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_update_bss_chan_survey()
9948 if (!test_bit(WMI_TLV_SERVICE_BSS_CHANNEL_INFO_64, ar->ab->wmi_ab.svc_map) || in ath12k_mac_update_bss_chan_survey()
9949 ar->rx_channel != channel) in ath12k_mac_update_bss_chan_survey()
9952 if (ar->scan.state != ATH12K_SCAN_IDLE) { in ath12k_mac_update_bss_chan_survey()
9953 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, in ath12k_mac_update_bss_chan_survey()
9958 reinit_completion(&ar->bss_survey_done); in ath12k_mac_update_bss_chan_survey()
9962 ath12k_warn(ar->ab, "failed to send pdev bss chan info request\n"); in ath12k_mac_update_bss_chan_survey()
9966 ret = wait_for_completion_timeout(&ar->bss_survey_done, 3 * HZ); in ath12k_mac_update_bss_chan_survey()
9968 ath12k_warn(ar->ab, "bss channel survey timed out\n"); in ath12k_mac_update_bss_chan_survey()
9978 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_get_survey()
9981 return -ENOENT; in ath12k_mac_op_get_survey()
9983 sband = hw->wiphy->bands[NL80211_BAND_2GHZ]; in ath12k_mac_op_get_survey()
9984 if (sband && idx >= sband->n_channels) { in ath12k_mac_op_get_survey()
9985 idx -= sband->n_channels; in ath12k_mac_op_get_survey()
9990 sband = hw->wiphy->bands[NL80211_BAND_5GHZ]; in ath12k_mac_op_get_survey()
9991 if (sband && idx >= sband->n_channels) { in ath12k_mac_op_get_survey()
9992 idx -= sband->n_channels; in ath12k_mac_op_get_survey()
9997 sband = hw->wiphy->bands[NL80211_BAND_6GHZ]; in ath12k_mac_op_get_survey()
9999 if (!sband || idx >= sband->n_channels) in ath12k_mac_op_get_survey()
10000 return -ENOENT; in ath12k_mac_op_get_survey()
10002 ar = ath12k_mac_get_ar_by_chan(hw, &sband->channels[idx]); in ath12k_mac_op_get_survey()
10004 if (sband->channels[idx].flags & IEEE80211_CHAN_DISABLED) { in ath12k_mac_op_get_survey()
10008 return -ENOENT; in ath12k_mac_op_get_survey()
10011 ar_survey = &ar->survey[idx]; in ath12k_mac_op_get_survey()
10013 ath12k_mac_update_bss_chan_survey(ar, &sband->channels[idx]); in ath12k_mac_op_get_survey()
10015 spin_lock_bh(&ar->data_lock); in ath12k_mac_op_get_survey()
10017 spin_unlock_bh(&ar->data_lock); in ath12k_mac_op_get_survey()
10019 survey->channel = &sband->channels[idx]; in ath12k_mac_op_get_survey()
10021 if (ar->rx_channel == survey->channel) in ath12k_mac_op_get_survey()
10022 survey->filled |= SURVEY_INFO_IN_USE; in ath12k_mac_op_get_survey()
10035 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_sta_statistics()
10037 arsta = &ahsta->deflink; in ath12k_mac_op_sta_statistics()
10039 sinfo->rx_duration = arsta->rx_duration; in ath12k_mac_op_sta_statistics()
10040 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_DURATION); in ath12k_mac_op_sta_statistics()
10042 sinfo->tx_duration = arsta->tx_duration; in ath12k_mac_op_sta_statistics()
10043 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_DURATION); in ath12k_mac_op_sta_statistics()
10045 if (!arsta->txrate.legacy && !arsta->txrate.nss) in ath12k_mac_op_sta_statistics()
10048 if (arsta->txrate.legacy) { in ath12k_mac_op_sta_statistics()
10049 sinfo->txrate.legacy = arsta->txrate.legacy; in ath12k_mac_op_sta_statistics()
10051 sinfo->txrate.mcs = arsta->txrate.mcs; in ath12k_mac_op_sta_statistics()
10052 sinfo->txrate.nss = arsta->txrate.nss; in ath12k_mac_op_sta_statistics()
10053 sinfo->txrate.bw = arsta->txrate.bw; in ath12k_mac_op_sta_statistics()
10054 sinfo->txrate.he_gi = arsta->txrate.he_gi; in ath12k_mac_op_sta_statistics()
10055 sinfo->txrate.he_dcm = arsta->txrate.he_dcm; in ath12k_mac_op_sta_statistics()
10056 sinfo->txrate.he_ru_alloc = arsta->txrate.he_ru_alloc; in ath12k_mac_op_sta_statistics()
10058 sinfo->txrate.flags = arsta->txrate.flags; in ath12k_mac_op_sta_statistics()
10059 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE); in ath12k_mac_op_sta_statistics()
10062 sinfo->signal = arsta->rssi_comb + ATH12K_DEFAULT_NOISE_FLOOR; in ath12k_mac_op_sta_statistics()
10063 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL); in ath12k_mac_op_sta_statistics()
10074 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_cancel_remain_on_channel()
10076 spin_lock_bh(&ar->data_lock); in ath12k_mac_op_cancel_remain_on_channel()
10077 ar->scan.roc_notify = false; in ath12k_mac_op_cancel_remain_on_channel()
10078 spin_unlock_bh(&ar->data_lock); in ath12k_mac_op_cancel_remain_on_channel()
10082 cancel_delayed_work_sync(&ar->scan.timeout); in ath12k_mac_op_cancel_remain_on_channel()
10083 wiphy_work_cancel(hw->wiphy, &ar->scan.vdev_clean_wk); in ath12k_mac_op_cancel_remain_on_channel()
10103 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_remain_on_channel()
10105 ar = ath12k_mac_select_scan_device(hw, vif, chan->center_freq); in ath12k_mac_op_remain_on_channel()
10107 return -EINVAL; in ath12k_mac_op_remain_on_channel()
10122 * delete-create vdev's for the same ar, in case the request is in ath12k_mac_op_remain_on_channel()
10125 if (arvif->is_created) { in ath12k_mac_op_remain_on_channel()
10126 if (WARN_ON(!arvif->ar)) in ath12k_mac_op_remain_on_channel()
10127 return -EINVAL; in ath12k_mac_op_remain_on_channel()
10129 if (ar != arvif->ar && arvif->is_started) in ath12k_mac_op_remain_on_channel()
10130 return -EBUSY; in ath12k_mac_op_remain_on_channel()
10132 if (ar != arvif->ar) { in ath12k_mac_op_remain_on_channel()
10145 ath12k_warn(ar->ab, "unable to create scan vdev for roc: %d\n", in ath12k_mac_op_remain_on_channel()
10151 spin_lock_bh(&ar->data_lock); in ath12k_mac_op_remain_on_channel()
10153 switch (ar->scan.state) { in ath12k_mac_op_remain_on_channel()
10155 reinit_completion(&ar->scan.started); in ath12k_mac_op_remain_on_channel()
10156 reinit_completion(&ar->scan.completed); in ath12k_mac_op_remain_on_channel()
10157 reinit_completion(&ar->scan.on_channel); in ath12k_mac_op_remain_on_channel()
10158 ar->scan.state = ATH12K_SCAN_STARTING; in ath12k_mac_op_remain_on_channel()
10159 ar->scan.is_roc = true; in ath12k_mac_op_remain_on_channel()
10160 ar->scan.arvif = arvif; in ath12k_mac_op_remain_on_channel()
10161 ar->scan.roc_freq = chan->center_freq; in ath12k_mac_op_remain_on_channel()
10162 ar->scan.roc_notify = true; in ath12k_mac_op_remain_on_channel()
10168 ret = -EBUSY; in ath12k_mac_op_remain_on_channel()
10172 spin_unlock_bh(&ar->data_lock); in ath12k_mac_op_remain_on_channel()
10177 scan_time_msec = hw->wiphy->max_remain_on_channel_duration * 2; in ath12k_mac_op_remain_on_channel()
10182 return -ENOMEM; in ath12k_mac_op_remain_on_channel()
10185 arg->num_chan = 1; in ath12k_mac_op_remain_on_channel()
10187 u32 *chan_list __free(kfree) = kcalloc(arg->num_chan, sizeof(*chan_list), in ath12k_mac_op_remain_on_channel()
10190 return -ENOMEM; in ath12k_mac_op_remain_on_channel()
10192 arg->chan_list = chan_list; in ath12k_mac_op_remain_on_channel()
10193 arg->vdev_id = arvif->vdev_id; in ath12k_mac_op_remain_on_channel()
10194 arg->scan_id = ATH12K_SCAN_ID; in ath12k_mac_op_remain_on_channel()
10195 arg->chan_list[0] = chan->center_freq; in ath12k_mac_op_remain_on_channel()
10196 arg->dwell_time_active = scan_time_msec; in ath12k_mac_op_remain_on_channel()
10197 arg->dwell_time_passive = scan_time_msec; in ath12k_mac_op_remain_on_channel()
10198 arg->max_scan_time = scan_time_msec; in ath12k_mac_op_remain_on_channel()
10199 arg->scan_f_passive = 1; in ath12k_mac_op_remain_on_channel()
10200 arg->burst_duration = duration; in ath12k_mac_op_remain_on_channel()
10204 ath12k_warn(ar->ab, "failed to start roc scan: %d\n", ret); in ath12k_mac_op_remain_on_channel()
10206 spin_lock_bh(&ar->data_lock); in ath12k_mac_op_remain_on_channel()
10207 ar->scan.state = ATH12K_SCAN_IDLE; in ath12k_mac_op_remain_on_channel()
10208 spin_unlock_bh(&ar->data_lock); in ath12k_mac_op_remain_on_channel()
10212 ret = wait_for_completion_timeout(&ar->scan.on_channel, 3 * HZ); in ath12k_mac_op_remain_on_channel()
10214 ath12k_warn(ar->ab, "failed to switch to channel for roc scan\n"); in ath12k_mac_op_remain_on_channel()
10217 ath12k_warn(ar->ab, "failed to stop scan: %d\n", ret); in ath12k_mac_op_remain_on_channel()
10218 return -ETIMEDOUT; in ath12k_mac_op_remain_on_channel()
10221 ieee80211_queue_delayed_work(hw, &ar->scan.timeout, in ath12k_mac_op_remain_on_channel()
10237 lockdep_assert_wiphy(hw->wiphy); in ath12k_mac_op_set_rekey_data()
10239 arvif = &ahvif->deflink; in ath12k_mac_op_set_rekey_data()
10240 rekey_data = &arvif->rekey_data; in ath12k_mac_op_set_rekey_data()
10242 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac set rekey data vdev %d\n", in ath12k_mac_op_set_rekey_data()
10243 arvif->vdev_id); in ath12k_mac_op_set_rekey_data()
10245 memcpy(rekey_data->kck, data->kck, NL80211_KCK_LEN); in ath12k_mac_op_set_rekey_data()
10246 memcpy(rekey_data->kek, data->kek, NL80211_KEK_LEN); in ath12k_mac_op_set_rekey_data()
10248 /* The supplicant works on big-endian, the firmware expects it on in ath12k_mac_op_set_rekey_data()
10251 rekey_data->replay_ctr = get_unaligned_be64(data->replay_ctr); in ath12k_mac_op_set_rekey_data()
10253 arvif->rekey_data.enable_offload = true; in ath12k_mac_op_set_rekey_data()
10255 ath12k_dbg_dump(ar->ab, ATH12K_DBG_MAC, "kck", NULL, in ath12k_mac_op_set_rekey_data()
10256 rekey_data->kck, NL80211_KCK_LEN); in ath12k_mac_op_set_rekey_data()
10257 ath12k_dbg_dump(ar->ab, ATH12K_DBG_MAC, "kek", NULL, in ath12k_mac_op_set_rekey_data()
10258 rekey_data->kck, NL80211_KEK_LEN); in ath12k_mac_op_set_rekey_data()
10259 ath12k_dbg_dump(ar->ab, ATH12K_DBG_MAC, "replay ctr", NULL, in ath12k_mac_op_set_rekey_data()
10260 &rekey_data->replay_ctr, sizeof(rekey_data->replay_ctr)); in ath12k_mac_op_set_rekey_data()
10320 for (i = 0; i < band->n_channels; i++) { in ath12k_mac_update_ch_list()
10321 if (band->channels[i].center_freq < freq_low || in ath12k_mac_update_ch_list()
10322 band->channels[i].center_freq > freq_high) in ath12k_mac_update_ch_list()
10323 band->channels[i].flags |= IEEE80211_CHAN_DISABLED; in ath12k_mac_update_ch_list()
10326 ar->freq_range.start_freq = MHZ_TO_KHZ(freq_low); in ath12k_mac_update_ch_list()
10327 ar->freq_range.end_freq = MHZ_TO_KHZ(freq_high); in ath12k_mac_update_ch_list()
10332 struct ath12k_pdev *pdev = ar->pdev; in ath12k_get_phy_id()
10333 struct ath12k_pdev_cap *pdev_cap = &pdev->cap; in ath12k_get_phy_id()
10336 return pdev_cap->band[NL80211_BAND_2GHZ].phy_id; in ath12k_get_phy_id()
10339 return pdev_cap->band[NL80211_BAND_5GHZ].phy_id; in ath12k_get_phy_id()
10341 ath12k_warn(ar->ab, "unsupported phy cap:%d\n", band); in ath12k_get_phy_id()
10352 struct ath12k_hw *ah = ar->ah; in ath12k_mac_setup_channels_rates()
10361 reg_cap = &ar->ab->hal_reg_cap[ar->pdev_idx]; in ath12k_mac_setup_channels_rates()
10368 return -ENOMEM; in ath12k_mac_setup_channels_rates()
10370 band = &ar->mac.sbands[NL80211_BAND_2GHZ]; in ath12k_mac_setup_channels_rates()
10371 band->band = NL80211_BAND_2GHZ; in ath12k_mac_setup_channels_rates()
10372 band->n_channels = ARRAY_SIZE(ath12k_2ghz_channels); in ath12k_mac_setup_channels_rates()
10373 band->channels = channels; in ath12k_mac_setup_channels_rates()
10374 band->n_bitrates = ath12k_g_rates_size; in ath12k_mac_setup_channels_rates()
10375 band->bitrates = ath12k_g_rates; in ath12k_mac_setup_channels_rates()
10378 if (ar->ab->hw_params->single_pdev_only) { in ath12k_mac_setup_channels_rates()
10380 reg_cap = &ar->ab->hal_reg_cap[phy_id]; in ath12k_mac_setup_channels_rates()
10383 reg_cap->low_2ghz_chan, in ath12k_mac_setup_channels_rates()
10384 reg_cap->high_2ghz_chan); in ath12k_mac_setup_channels_rates()
10388 if (reg_cap->high_5ghz_chan >= ATH12K_MIN_6G_FREQ) { in ath12k_mac_setup_channels_rates()
10392 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); in ath12k_mac_setup_channels_rates()
10393 return -ENOMEM; in ath12k_mac_setup_channels_rates()
10396 ar->supports_6ghz = true; in ath12k_mac_setup_channels_rates()
10397 band = &ar->mac.sbands[NL80211_BAND_6GHZ]; in ath12k_mac_setup_channels_rates()
10398 band->band = NL80211_BAND_6GHZ; in ath12k_mac_setup_channels_rates()
10399 band->n_channels = ARRAY_SIZE(ath12k_6ghz_channels); in ath12k_mac_setup_channels_rates()
10400 band->channels = channels; in ath12k_mac_setup_channels_rates()
10401 band->n_bitrates = ath12k_a_rates_size; in ath12k_mac_setup_channels_rates()
10402 band->bitrates = ath12k_a_rates; in ath12k_mac_setup_channels_rates()
10405 reg_cap->low_5ghz_chan, in ath12k_mac_setup_channels_rates()
10406 reg_cap->high_5ghz_chan); in ath12k_mac_setup_channels_rates()
10407 ah->use_6ghz_regd = true; in ath12k_mac_setup_channels_rates()
10410 if (reg_cap->low_5ghz_chan < ATH12K_MIN_6G_FREQ) { in ath12k_mac_setup_channels_rates()
10415 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); in ath12k_mac_setup_channels_rates()
10416 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels); in ath12k_mac_setup_channels_rates()
10417 return -ENOMEM; in ath12k_mac_setup_channels_rates()
10420 band = &ar->mac.sbands[NL80211_BAND_5GHZ]; in ath12k_mac_setup_channels_rates()
10421 band->band = NL80211_BAND_5GHZ; in ath12k_mac_setup_channels_rates()
10422 band->n_channels = ARRAY_SIZE(ath12k_5ghz_channels); in ath12k_mac_setup_channels_rates()
10423 band->channels = channels; in ath12k_mac_setup_channels_rates()
10424 band->n_bitrates = ath12k_a_rates_size; in ath12k_mac_setup_channels_rates()
10425 band->bitrates = ath12k_a_rates; in ath12k_mac_setup_channels_rates()
10428 if (ar->ab->hw_params->single_pdev_only) { in ath12k_mac_setup_channels_rates()
10430 reg_cap = &ar->ab->hal_reg_cap[phy_id]; in ath12k_mac_setup_channels_rates()
10434 reg_cap->low_5ghz_chan, in ath12k_mac_setup_channels_rates()
10435 reg_cap->high_5ghz_chan); in ath12k_mac_setup_channels_rates()
10449 interface_modes &= ar->ab->hw_params->interface_modes; in ath12k_mac_get_ifmodes()
10470 interface_modes = ar->ab->hw_params->interface_modes; in ath12k_mac_is_iface_mode_enable()
10484 u16 interface_modes = ar->ab->hw_params->interface_modes; in ath12k_mac_setup_radio_iface_comb()
10511 return -ENOMEM; in ath12k_mac_setup_radio_iface_comb()
10573 return -ENOMEM; in ath12k_mac_setup_global_iface_comb()
10577 for (j = 0; j < iter_comb->n_limits && j < n_limits; j++) { in ath12k_mac_setup_global_iface_comb()
10578 limits[j].types |= iter_comb->limits[j].types; in ath12k_mac_setup_global_iface_comb()
10579 limits[j].max += iter_comb->limits[j].max; in ath12k_mac_setup_global_iface_comb()
10582 comb->max_interfaces += iter_comb->max_interfaces; in ath12k_mac_setup_global_iface_comb()
10583 comb->num_different_channels += iter_comb->num_different_channels; in ath12k_mac_setup_global_iface_comb()
10584 comb->radar_detect_widths |= iter_comb->radar_detect_widths; in ath12k_mac_setup_global_iface_comb()
10587 comb->limits = limits; in ath12k_mac_setup_global_iface_comb()
10588 comb->n_limits = n_limits; in ath12k_mac_setup_global_iface_comb()
10589 comb->beacon_int_infra_match = true; in ath12k_mac_setup_global_iface_comb()
10590 comb->beacon_int_min_gcd = 100; in ath12k_mac_setup_global_iface_comb()
10604 struct wiphy *wiphy = ah->hw->wiphy; in ath12k_mac_cleanup_iface_combinations()
10608 if (wiphy->n_radio > 0) { in ath12k_mac_cleanup_iface_combinations()
10609 radio = wiphy->radio; in ath12k_mac_cleanup_iface_combinations()
10610 for (i = 0; i < wiphy->n_radio; i++) in ath12k_mac_cleanup_iface_combinations()
10613 kfree(wiphy->radio); in ath12k_mac_cleanup_iface_combinations()
10616 ath12k_mac_cleanup_iface_comb(wiphy->iface_combinations); in ath12k_mac_cleanup_iface_combinations()
10622 struct wiphy *wiphy = ah->hw->wiphy; in ath12k_mac_setup_iface_combinations()
10629 return -ENOMEM; in ath12k_mac_setup_iface_combinations()
10631 if (ah->num_radio == 1) { in ath12k_mac_setup_iface_combinations()
10632 ret = ath12k_mac_setup_radio_iface_comb(&ah->radio[0], in ath12k_mac_setup_iface_combinations()
10645 radio = kcalloc(ah->num_radio, sizeof(*radio), GFP_KERNEL); in ath12k_mac_setup_iface_combinations()
10647 ret = -ENOMEM; in ath12k_mac_setup_iface_combinations()
10654 ret = -ENOMEM; in ath12k_mac_setup_iface_combinations()
10666 radio[i].freq_range = &ar->freq_range; in ath12k_mac_setup_iface_combinations()
10673 ret = ath12k_mac_setup_global_iface_comb(ah, radio, ah->num_radio, combinations); in ath12k_mac_setup_iface_combinations()
10680 wiphy->radio = radio; in ath12k_mac_setup_iface_combinations()
10681 wiphy->n_radio = ah->num_radio; in ath12k_mac_setup_iface_combinations()
10684 wiphy->iface_combinations = combinations; in ath12k_mac_setup_iface_combinations()
10685 wiphy->n_iface_combinations = 1; in ath12k_mac_setup_iface_combinations()
10690 i = ah->num_radio; in ath12k_mac_setup_iface_combinations()
10693 while (i--) in ath12k_mac_setup_iface_combinations()
10749 idr_for_each(&ar->txmgmt_idr, ath12k_mac_tx_mgmt_pending_free, ar); in ath12k_mac_cleanup_unregister()
10750 idr_destroy(&ar->txmgmt_idr); in ath12k_mac_cleanup_unregister()
10752 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); in ath12k_mac_cleanup_unregister()
10753 kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels); in ath12k_mac_cleanup_unregister()
10754 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels); in ath12k_mac_cleanup_unregister()
10759 struct ieee80211_hw *hw = ah->hw; in ath12k_mac_hw_unregister()
10764 cancel_work_sync(&ar->regd_update_work); in ath12k_mac_hw_unregister()
10782 struct ath12k_pdev_cap *cap = &ar->pdev->cap; in ath12k_mac_setup_register()
10785 init_waitqueue_head(&ar->txmgmt_empty_waitq); in ath12k_mac_setup_register()
10786 idr_init(&ar->txmgmt_idr); in ath12k_mac_setup_register()
10787 spin_lock_init(&ar->txmgmt_idr_lock); in ath12k_mac_setup_register()
10792 cap->supported_bands, in ath12k_mac_setup_register()
10800 ar->max_num_stations = ath12k_core_get_max_station_per_radio(ar->ab); in ath12k_mac_setup_register()
10801 ar->max_num_peers = ath12k_core_get_max_peers_per_radio(ar->ab); in ath12k_mac_setup_register()
10808 struct ieee80211_hw *hw = ah->hw; in ath12k_mac_hw_register()
10809 struct wiphy *wiphy = hw->wiphy; in ath12k_mac_hw_register()
10811 struct ath12k_base *ab = ar->ab; in ath12k_mac_hw_register()
10831 wiphy->max_ap_assoc_sta = 0; in ath12k_mac_hw_register()
10836 pdev = ar->pdev; in ath12k_mac_hw_register()
10837 if (ar->ab->pdevs_macaddr_valid) { in ath12k_mac_hw_register()
10838 ether_addr_copy(ar->mac_addr, pdev->mac_addr); in ath12k_mac_hw_register()
10840 ether_addr_copy(ar->mac_addr, ar->ab->mac_addr); in ath12k_mac_hw_register()
10841 ar->mac_addr[4] += ar->pdev_idx; in ath12k_mac_hw_register()
10844 ret = ath12k_mac_setup_register(ar, &ht_cap_info, hw->wiphy->bands); in ath12k_mac_hw_register()
10849 if (!ar->supports_6ghz) in ath12k_mac_hw_register()
10852 wiphy->max_ap_assoc_sta += ar->max_num_stations; in ath12k_mac_hw_register()
10858 cap = &pdev->cap; in ath12k_mac_hw_register()
10860 antennas_rx = max_t(u32, antennas_rx, cap->rx_chain_mask); in ath12k_mac_hw_register()
10861 antennas_tx = max_t(u32, antennas_tx, cap->tx_chain_mask); in ath12k_mac_hw_register()
10863 if (ar->supports_6ghz) in ath12k_mac_hw_register()
10866 if (test_bit(ATH12K_FLAG_RAW_MODE, &ar->ab->dev_flags)) in ath12k_mac_hw_register()
10869 if (!ar->ab->hw_params->supports_monitor) in ath12k_mac_hw_register()
10873 mac_addr = ar->mac_addr; in ath12k_mac_hw_register()
10875 mac_addr = ab->mac_addr; in ath12k_mac_hw_register()
10880 wiphy->available_antennas_rx = antennas_rx; in ath12k_mac_hw_register()
10881 wiphy->available_antennas_tx = antennas_tx; in ath12k_mac_hw_register()
10884 SET_IEEE80211_DEV(hw, ab->dev); in ath12k_mac_hw_register()
10892 wiphy->interface_modes = ath12k_mac_get_ifmodes(ah); in ath12k_mac_hw_register()
10894 if (ah->num_radio == 1 && in ath12k_mac_hw_register()
10895 wiphy->bands[NL80211_BAND_2GHZ] && in ath12k_mac_hw_register()
10896 wiphy->bands[NL80211_BAND_5GHZ] && in ath12k_mac_hw_register()
10897 wiphy->bands[NL80211_BAND_6GHZ]) in ath12k_mac_hw_register()
10923 wiphy->features |= NL80211_FEATURE_STATIC_SMPS; in ath12k_mac_hw_register()
10924 wiphy->flags |= WIPHY_FLAG_IBSS_RSN; in ath12k_mac_hw_register()
10931 (is_6ghz && ab->hw_params->supports_dynamic_smps_6ghz)) in ath12k_mac_hw_register()
10932 wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS; in ath12k_mac_hw_register()
10934 wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID; in ath12k_mac_hw_register()
10935 wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN; in ath12k_mac_hw_register()
10937 hw->max_listen_interval = ATH12K_MAX_HW_LISTEN_INTERVAL; in ath12k_mac_hw_register()
10939 wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL; in ath12k_mac_hw_register()
10940 wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH; in ath12k_mac_hw_register()
10941 wiphy->max_remain_on_channel_duration = 5000; in ath12k_mac_hw_register()
10943 wiphy->flags |= WIPHY_FLAG_AP_UAPSD; in ath12k_mac_hw_register()
10944 wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE | in ath12k_mac_hw_register()
10951 wiphy->flags |= WIPHY_FLAG_DISABLE_WEXT; in ath12k_mac_hw_register()
10956 if (ab->ag->mlo_capable) { in ath12k_mac_hw_register()
10957 ath12k_iftypes_ext_capa[2].eml_capabilities = cap->eml_cap; in ath12k_mac_hw_register()
10958 ath12k_iftypes_ext_capa[2].mld_capa_and_ops = cap->mld_cap; in ath12k_mac_hw_register()
10959 wiphy->flags |= WIPHY_FLAG_SUPPORTS_MLO; in ath12k_mac_hw_register()
10962 hw->queues = ATH12K_HW_MAX_QUEUES; in ath12k_mac_hw_register()
10963 wiphy->tx_queue_len = ATH12K_QUEUE_LEN; in ath12k_mac_hw_register()
10964 hw->offchannel_tx_hw_queue = ATH12K_HW_MAX_QUEUES - 1; in ath12k_mac_hw_register()
10965 hw->max_rx_aggregation_subframes = IEEE80211_MAX_AMPDU_BUF_EHT; in ath12k_mac_hw_register()
10967 hw->vif_data_size = sizeof(struct ath12k_vif); in ath12k_mac_hw_register()
10968 hw->sta_data_size = sizeof(struct ath12k_sta); in ath12k_mac_hw_register()
10969 hw->extra_tx_headroom = ab->hw_params->iova_mask; in ath12k_mac_hw_register()
10974 wiphy->cipher_suites = cipher_suites; in ath12k_mac_hw_register()
10975 wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites); in ath12k_mac_hw_register()
10977 wiphy->iftype_ext_capab = ath12k_iftypes_ext_capa; in ath12k_mac_hw_register()
10978 wiphy->num_iftype_ext_capab = ARRAY_SIZE(ath12k_iftypes_ext_capa); in ath12k_mac_hw_register()
10980 wiphy->mbssid_max_interfaces = mbssid_max_interfaces; in ath12k_mac_hw_register()
10981 wiphy->ema_max_profile_periodicity = TARGET_EMA_MAX_PROFILE_PERIOD; in ath12k_mac_hw_register()
10995 hw->netdev_features = NETIF_F_HW_CSUM; in ath12k_mac_hw_register()
11000 if (test_bit(WMI_TLV_SERVICE_NLO, ar->wmi->wmi_ab->svc_map)) { in ath12k_mac_hw_register()
11001 wiphy->max_sched_scan_ssids = WMI_PNO_MAX_SUPP_NETWORKS; in ath12k_mac_hw_register()
11002 wiphy->max_match_sets = WMI_PNO_MAX_SUPP_NETWORKS; in ath12k_mac_hw_register()
11003 wiphy->max_sched_scan_ie_len = WMI_PNO_MAX_IE_LENGTH; in ath12k_mac_hw_register()
11004 wiphy->max_sched_scan_plans = WMI_PNO_MAX_SCHED_SCAN_PLANS; in ath12k_mac_hw_register()
11005 wiphy->max_sched_scan_plan_interval = in ath12k_mac_hw_register()
11007 wiphy->max_sched_scan_plan_iterations = in ath12k_mac_hw_register()
11009 wiphy->features |= NL80211_FEATURE_ND_RANDOM_MAC_ADDR; in ath12k_mac_hw_register()
11014 ath12k_warn(ar->ab, "failed to init wow: %d\n", ret); in ath12k_mac_hw_register()
11030 wiphy->interface_modes &= ~BIT(NL80211_IFTYPE_MONITOR); in ath12k_mac_hw_register()
11036 ath12k_err(ar->ab, "ath12k regd update failed: %d\n", ret); in ath12k_mac_hw_register()
11055 i = ah->num_radio; in ath12k_mac_hw_register()
11070 struct ath12k_base *ab = ar->ab; in ath12k_mac_setup()
11071 struct ath12k_pdev *pdev = ar->pdev; in ath12k_mac_setup()
11072 u8 pdev_idx = ar->pdev_idx; in ath12k_mac_setup()
11074 ar->lmac_id = ath12k_hw_get_mac_from_pdev_id(ab->hw_params, pdev_idx); in ath12k_mac_setup()
11076 ar->wmi = &ab->wmi_ab.wmi[pdev_idx]; in ath12k_mac_setup()
11082 ar->cfg_tx_chainmask = pdev->cap.tx_chain_mask; in ath12k_mac_setup()
11083 ar->cfg_rx_chainmask = pdev->cap.rx_chain_mask; in ath12k_mac_setup()
11084 ar->num_tx_chains = hweight32(pdev->cap.tx_chain_mask); in ath12k_mac_setup()
11085 ar->num_rx_chains = hweight32(pdev->cap.rx_chain_mask); in ath12k_mac_setup()
11086 ar->scan.arvif = NULL; in ath12k_mac_setup()
11088 spin_lock_init(&ar->data_lock); in ath12k_mac_setup()
11089 INIT_LIST_HEAD(&ar->arvifs); in ath12k_mac_setup()
11090 INIT_LIST_HEAD(&ar->ppdu_stats_info); in ath12k_mac_setup()
11092 init_completion(&ar->vdev_setup_done); in ath12k_mac_setup()
11093 init_completion(&ar->vdev_delete_done); in ath12k_mac_setup()
11094 init_completion(&ar->peer_assoc_done); in ath12k_mac_setup()
11095 init_completion(&ar->peer_delete_done); in ath12k_mac_setup()
11096 init_completion(&ar->install_key_done); in ath12k_mac_setup()
11097 init_completion(&ar->bss_survey_done); in ath12k_mac_setup()
11098 init_completion(&ar->scan.started); in ath12k_mac_setup()
11099 init_completion(&ar->scan.completed); in ath12k_mac_setup()
11100 init_completion(&ar->scan.on_channel); in ath12k_mac_setup()
11101 init_completion(&ar->mlo_setup_done); in ath12k_mac_setup()
11103 INIT_DELAYED_WORK(&ar->scan.timeout, ath12k_scan_timeout_work); in ath12k_mac_setup()
11104 wiphy_work_init(&ar->scan.vdev_clean_wk, ath12k_scan_vdev_clean_work); in ath12k_mac_setup()
11105 INIT_WORK(&ar->regd_update_work, ath12k_regd_update_work); in ath12k_mac_setup()
11107 wiphy_work_init(&ar->wmi_mgmt_tx_work, ath12k_mgmt_over_wmi_tx_work); in ath12k_mac_setup()
11108 skb_queue_head_init(&ar->wmi_mgmt_tx_queue); in ath12k_mac_setup()
11114 struct ath12k_base *partner_ab, *ab = ar->ab; in __ath12k_mac_mlo_setup()
11115 struct ath12k_hw_group *ag = ab->ag; in __ath12k_mac_mlo_setup()
11121 lockdep_assert_held(&ag->mutex); in __ath12k_mac_mlo_setup()
11123 reinit_completion(&ar->mlo_setup_done); in __ath12k_mac_mlo_setup()
11125 for (i = 0; i < ag->num_devices; i++) { in __ath12k_mac_mlo_setup()
11126 partner_ab = ag->ab[i]; in __ath12k_mac_mlo_setup()
11128 for (j = 0; j < partner_ab->num_radios; j++) { in __ath12k_mac_mlo_setup()
11129 pdev = &partner_ab->pdevs[j]; in __ath12k_mac_mlo_setup()
11132 if (ar == pdev->ar) in __ath12k_mac_mlo_setup()
11135 partner_link_id[num_link] = pdev->hw_link_id; in __ath12k_mac_mlo_setup()
11139 i, j, pdev->hw_link_id, num_link); in __ath12k_mac_mlo_setup()
11143 mlo.group_id = cpu_to_le32(ag->id); in __ath12k_mac_mlo_setup()
11146 ar->mlo_setup_status = 0; in __ath12k_mac_mlo_setup()
11148 ath12k_dbg(ab, ATH12K_DBG_MAC, "group id %d num_link %d\n", ag->id, num_link); in __ath12k_mac_mlo_setup()
11153 ar->pdev_idx, ret); in __ath12k_mac_mlo_setup()
11157 time_left = wait_for_completion_timeout(&ar->mlo_setup_done, in __ath12k_mac_mlo_setup()
11160 if (!time_left || ar->mlo_setup_status) in __ath12k_mac_mlo_setup()
11161 return ar->mlo_setup_status ? : -ETIMEDOUT; in __ath12k_mac_mlo_setup()
11163 ath12k_dbg(ab, ATH12K_DBG_MAC, "mlo setup done for pdev %d\n", ar->pdev_idx); in __ath12k_mac_mlo_setup()
11170 struct ath12k_base *ab = ar->ab; in __ath12k_mac_mlo_teardown()
11173 if (test_bit(ATH12K_FLAG_RECOVERY, &ab->dev_flags)) in __ath12k_mac_mlo_teardown()
11179 ar->pdev_idx, ret); in __ath12k_mac_mlo_teardown()
11183 ath12k_dbg(ab, ATH12K_DBG_MAC, "mlo teardown for pdev %d\n", ar->pdev_idx); in __ath12k_mac_mlo_teardown()
11195 for (i = 0; i < ag->num_hw; i++) { in ath12k_mac_mlo_setup()
11196 ah = ag->ah[i]; in ath12k_mac_mlo_setup()
11201 ar = &ah->radio[j]; in ath12k_mac_mlo_setup()
11204 ath12k_err(ar->ab, "failed to setup MLO: %d\n", ret); in ath12k_mac_mlo_setup()
11213 for (i = i - 1; i >= 0; i--) { in ath12k_mac_mlo_setup()
11214 ah = ag->ah[i]; in ath12k_mac_mlo_setup()
11218 for (j = j - 1; j >= 0; j--) { in ath12k_mac_mlo_setup()
11219 ar = &ah->radio[j]; in ath12k_mac_mlo_setup()
11236 for (i = 0; i < ag->num_hw; i++) { in ath12k_mac_mlo_teardown()
11237 ah = ag->ah[i]; in ath12k_mac_mlo_teardown()
11242 ar = &ah->radio[j]; in ath12k_mac_mlo_teardown()
11245 ath12k_err(ar->ab, "failed to teardown MLO: %d\n", ret); in ath12k_mac_mlo_teardown()
11254 struct ath12k_base *ab = ag->ab[0]; in ath12k_mac_register()
11259 for (i = 0; i < ag->num_hw; i++) { in ath12k_mac_register()
11267 set_bit(ATH12K_FLAG_REGISTERED, &ab->dev_flags); in ath12k_mac_register()
11272 for (i = i - 1; i >= 0; i--) { in ath12k_mac_register()
11285 struct ath12k_base *ab = ag->ab[0]; in ath12k_mac_unregister()
11289 clear_bit(ATH12K_FLAG_REGISTERED, &ab->dev_flags); in ath12k_mac_unregister()
11291 for (i = ag->num_hw - 1; i >= 0; i--) { in ath12k_mac_unregister()
11302 ieee80211_free_hw(ah->hw); in ath12k_mac_hw_destroy()
11323 ah->hw = hw; in ath12k_mac_hw_allocate()
11324 ah->num_radio = num_pdev_map; in ath12k_mac_hw_allocate()
11326 mutex_init(&ah->hw_mutex); in ath12k_mac_hw_allocate()
11327 INIT_LIST_HEAD(&ah->ml_peers); in ath12k_mac_hw_allocate()
11332 pdev = &ab->pdevs[pdev_idx]; in ath12k_mac_hw_allocate()
11335 ar->ah = ah; in ath12k_mac_hw_allocate()
11336 ar->ab = ab; in ath12k_mac_hw_allocate()
11337 ar->hw_link_id = pdev->hw_link_id; in ath12k_mac_hw_allocate()
11338 ar->pdev = pdev; in ath12k_mac_hw_allocate()
11339 ar->pdev_idx = pdev_idx; in ath12k_mac_hw_allocate()
11340 pdev->ar = ar; in ath12k_mac_hw_allocate()
11342 ag->hw_links[ar->hw_link_id].device_id = ab->device_id; in ath12k_mac_hw_allocate()
11343 ag->hw_links[ar->hw_link_id].pdev_idx = pdev_idx; in ath12k_mac_hw_allocate()
11355 struct ath12k_base *ab = ag->ab[0]; in ath12k_mac_destroy()
11359 for (i = 0; i < ag->num_devices; i++) { in ath12k_mac_destroy()
11360 ab = ag->ab[i]; in ath12k_mac_destroy()
11364 for (j = 0; j < ab->num_radios; j++) { in ath12k_mac_destroy()
11365 pdev = &ab->pdevs[j]; in ath12k_mac_destroy()
11366 if (!pdev->ar) in ath12k_mac_destroy()
11368 pdev->ar = NULL; in ath12k_mac_destroy()
11372 for (i = 0; i < ag->num_hw; i++) { in ath12k_mac_destroy()
11385 ab->cc_freq_hz = 320000; in ath12k_mac_set_device_defaults()
11386 ab->free_vdev_map = (1LL << (ab->num_radios * TARGET_NUM_VDEVS)) - 1; in ath12k_mac_set_device_defaults()
11399 for (i = 0; i < ag->num_devices; i++) { in ath12k_mac_allocate()
11400 ab = ag->ab[i]; in ath12k_mac_allocate()
11405 total_radio += ab->num_radios; in ath12k_mac_allocate()
11409 return -EINVAL; in ath12k_mac_allocate()
11412 return -ENOSPC; in ath12k_mac_allocate()
11415 * hardware group which participate in multi-link operation else in ath12k_mac_allocate()
11418 if (ag->mlo_capable) in ath12k_mac_allocate()
11425 ag->num_hw = 0; in ath12k_mac_allocate()
11430 if (device_id >= ag->num_devices || !ag->ab[device_id]) { in ath12k_mac_allocate()
11431 ret = -ENOSPC; in ath12k_mac_allocate()
11435 ab = ag->ab[device_id]; in ath12k_mac_allocate()
11443 if (mac_id >= ab->num_radios) { in ath12k_mac_allocate()
11449 ab = pdev_map->ab; in ath12k_mac_allocate()
11455 ret = -ENOMEM; in ath12k_mac_allocate()
11459 ah->dev = ab->dev; in ath12k_mac_allocate()
11461 ag->ah[i] = ah; in ath12k_mac_allocate()
11462 ag->num_hw++; in ath12k_mac_allocate()
11468 for (i = i - 1; i >= 0; i--) { in ath12k_mac_allocate()
11485 struct ath12k *ar = arvif->ar; in ath12k_mac_vif_set_keepalive()
11488 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_mac_vif_set_keepalive()
11490 if (arvif->ahvif->vdev_type != WMI_VDEV_TYPE_STA) in ath12k_mac_vif_set_keepalive()
11493 if (!test_bit(WMI_TLV_SERVICE_STA_KEEP_ALIVE, ar->ab->wmi_ab.svc_map)) in ath12k_mac_vif_set_keepalive()
11496 arg.vdev_id = arvif->vdev_id; in ath12k_mac_vif_set_keepalive()
11503 ath12k_warn(ar->ab, "failed to set keepalive on vdev %i: %d\n", in ath12k_mac_vif_set_keepalive()
11504 arvif->vdev_id, ret); in ath12k_mac_vif_set_keepalive()