Lines Matching +full:sr +full:- +full:idle +full:- +full:ns
1 // SPDX-License-Identifier: BSD-3-Clause-Clear
3 * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
4 * Copyright (c) 2021-2025 Qualcomm Innovation Center, Inc. All rights reserved.
164 /* new addition in IEEE Std 802.11ax-2021 */
244 #define ath11k_a_rates_size (ARRAY_SIZE(ath11k_legacy_rates) - 4)
405 return -EINVAL; in ath11k_mac_hw_ratecode_to_legacy_rate()
426 for (i = 0; i < sband->n_bitrates; i++) in ath11k_mac_bitrate_to_idx()
427 if (sband->bitrates[i].bitrate == bitrate) in ath11k_mac_bitrate_to_idx()
438 for (nss = IEEE80211_HT_MCS_MASK_LEN - 1; nss >= 0; nss--) in ath11k_mac_max_ht_nss()
450 for (nss = NL80211_VHT_NSS_MAX - 1; nss >= 0; nss--) in ath11k_mac_max_vht_nss()
462 for (nss = NL80211_HE_NSS_MAX - 1; nss >= 0; nss--) in ath11k_mac_max_he_nss()
510 conf = rcu_dereference(vif->bss_conf.chanctx_conf); in ath11k_mac_vif_chan()
513 return -ENOENT; in ath11k_mac_vif_chan()
516 *def = conf->def; in ath11k_mac_vif_chan()
541 for (i = 0; i < sband->n_bitrates; i++) { in ath11k_mac_hw_rate_to_idx()
542 rate = &sband->bitrates[i]; in ath11k_mac_hw_rate_to_idx()
544 if (ath11k_mac_bitrate_is_cck(rate->bitrate) != cck) in ath11k_mac_hw_rate_to_idx()
547 if (rate->hw_value == hw_rate) in ath11k_mac_hw_rate_to_idx()
549 else if (rate->flags & IEEE80211_RATE_SHORT_PREAMBLE && in ath11k_mac_hw_rate_to_idx()
550 rate->hw_value_short == hw_rate) in ath11k_mac_hw_rate_to_idx()
569 if (arvif->vdev_id == arvif_iter->vdev_id) in ath11k_get_arvif_iter()
570 arvif_iter->arvif = arvif; in ath11k_get_arvif_iter()
582 ieee80211_iterate_active_interfaces_atomic(ar->hw, in ath11k_mac_get_arvif()
587 ath11k_warn(ar->ab, "No VIF found for vdev %d\n", vdev_id); in ath11k_mac_get_arvif()
601 for (i = 0; i < ab->num_radios; i++) { in ath11k_mac_get_arvif_by_vdev_id()
602 pdev = rcu_dereference(ab->pdevs_active[i]); in ath11k_mac_get_arvif_by_vdev_id()
603 if (pdev && pdev->ar && in ath11k_mac_get_arvif_by_vdev_id()
604 (pdev->ar->allocated_vdev_map & (1LL << vdev_id))) { in ath11k_mac_get_arvif_by_vdev_id()
605 arvif = ath11k_mac_get_arvif(pdev->ar, vdev_id); in ath11k_mac_get_arvif_by_vdev_id()
619 for (i = 0; i < ab->num_radios; i++) { in ath11k_mac_get_ar_by_vdev_id()
620 pdev = rcu_dereference(ab->pdevs_active[i]); in ath11k_mac_get_ar_by_vdev_id()
621 if (pdev && pdev->ar) { in ath11k_mac_get_ar_by_vdev_id()
622 if (pdev->ar->allocated_vdev_map & (1LL << vdev_id)) in ath11k_mac_get_ar_by_vdev_id()
623 return pdev->ar; in ath11k_mac_get_ar_by_vdev_id()
635 if (ab->hw_params.single_pdev_only) { in ath11k_mac_get_ar_by_pdev_id()
636 pdev = rcu_dereference(ab->pdevs_active[0]); in ath11k_mac_get_ar_by_pdev_id()
637 return pdev ? pdev->ar : NULL; in ath11k_mac_get_ar_by_pdev_id()
640 if (WARN_ON(pdev_id > ab->num_radios)) in ath11k_mac_get_ar_by_pdev_id()
643 for (i = 0; i < ab->num_radios; i++) { in ath11k_mac_get_ar_by_pdev_id()
644 if (ab->fw_mode == ATH11K_FIRMWARE_MODE_FTM) in ath11k_mac_get_ar_by_pdev_id()
645 pdev = &ab->pdevs[i]; in ath11k_mac_get_ar_by_pdev_id()
647 pdev = rcu_dereference(ab->pdevs_active[i]); in ath11k_mac_get_ar_by_pdev_id()
649 if (pdev && pdev->pdev_id == pdev_id) in ath11k_mac_get_ar_by_pdev_id()
650 return (pdev->ar ? pdev->ar : NULL); in ath11k_mac_get_ar_by_pdev_id()
663 for (i = 0; i < ab->num_radios; i++) { in ath11k_mac_get_vif_up()
664 pdev = &ab->pdevs[i]; in ath11k_mac_get_vif_up()
665 ar = pdev->ar; in ath11k_mac_get_vif_up()
666 list_for_each_entry(arvif, &ar->arvifs, list) { in ath11k_mac_get_vif_up()
667 if (arvif->is_up) in ath11k_mac_get_vif_up()
684 struct ath11k *ar = arvif->ar; in ath11k_mac_get_target_pdev_id_from_vif()
685 struct ath11k_base *ab = ar->ab; in ath11k_mac_get_target_pdev_id_from_vif()
686 struct ieee80211_vif *vif = arvif->vif; in ath11k_mac_get_target_pdev_id_from_vif()
689 u8 pdev_id = ab->target_pdev_ids[0].pdev_id; in ath11k_mac_get_target_pdev_id_from_vif()
695 band = def.chan->band; in ath11k_mac_get_target_pdev_id_from_vif()
697 for (i = 0; i < ab->target_pdev_count; i++) { in ath11k_mac_get_target_pdev_id_from_vif()
698 if (ath11k_mac_band_match(band, ab->target_pdev_ids[i].supported_bands)) in ath11k_mac_get_target_pdev_id_from_vif()
699 return ab->target_pdev_ids[i].pdev_id; in ath11k_mac_get_target_pdev_id_from_vif()
709 arvif = ath11k_mac_get_vif_up(ar->ab); in ath11k_mac_get_target_pdev_id()
714 return ar->ab->target_pdev_ids[0].pdev_id; in ath11k_mac_get_target_pdev_id()
719 struct ath11k_base *ab = ar->ab; in ath11k_pdev_caps_update()
721 ar->max_tx_power = ab->target_caps.hw_max_tx_power; in ath11k_pdev_caps_update()
723 /* FIXME Set min_tx_power to ab->target_caps.hw_min_tx_power. in ath11k_pdev_caps_update()
725 * we can set ar->min_tx_power to 0 currently until in ath11k_pdev_caps_update()
728 ar->min_tx_power = 0; in ath11k_pdev_caps_update()
730 ar->txpower_limit_2g = ar->max_tx_power; in ath11k_pdev_caps_update()
731 ar->txpower_limit_5g = ar->max_tx_power; in ath11k_pdev_caps_update()
732 ar->txpower_scale = WMI_HOST_TP_SCALE_MAX; in ath11k_pdev_caps_update()
737 struct ath11k_pdev *pdev = ar->pdev; in ath11k_mac_txpower_recalc()
739 int ret, txpower = -1; in ath11k_mac_txpower_recalc()
742 lockdep_assert_held(&ar->conf_mutex); in ath11k_mac_txpower_recalc()
744 list_for_each_entry(arvif, &ar->arvifs, list) { in ath11k_mac_txpower_recalc()
745 if (arvif->txpower <= 0) in ath11k_mac_txpower_recalc()
748 if (txpower == -1) in ath11k_mac_txpower_recalc()
749 txpower = arvif->txpower; in ath11k_mac_txpower_recalc()
751 txpower = min(txpower, arvif->txpower); in ath11k_mac_txpower_recalc()
754 if (txpower == -1) in ath11k_mac_txpower_recalc()
758 txpower = min_t(u32, max_t(u32, ar->min_tx_power, txpower), in ath11k_mac_txpower_recalc()
759 ar->max_tx_power) * 2; in ath11k_mac_txpower_recalc()
761 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "txpower to set in hw %d\n", in ath11k_mac_txpower_recalc()
764 if ((pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) && in ath11k_mac_txpower_recalc()
765 ar->txpower_limit_2g != txpower) { in ath11k_mac_txpower_recalc()
768 txpower, ar->pdev->pdev_id); in ath11k_mac_txpower_recalc()
771 ar->txpower_limit_2g = txpower; in ath11k_mac_txpower_recalc()
774 if ((pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) && in ath11k_mac_txpower_recalc()
775 ar->txpower_limit_5g != txpower) { in ath11k_mac_txpower_recalc()
778 txpower, ar->pdev->pdev_id); in ath11k_mac_txpower_recalc()
781 ar->txpower_limit_5g = txpower; in ath11k_mac_txpower_recalc()
787 ath11k_warn(ar->ab, "failed to recalc txpower limit %d using pdev param %d: %d\n", in ath11k_mac_txpower_recalc()
794 struct ath11k *ar = arvif->ar; in ath11k_recalc_rtscts_prot()
798 lockdep_assert_held(&ar->conf_mutex); in ath11k_recalc_rtscts_prot()
808 if (arvif->num_legacy_stations > 0) in ath11k_recalc_rtscts_prot()
814 if (arvif->rtscts_prot_mode == rts_cts) in ath11k_recalc_rtscts_prot()
817 arvif->rtscts_prot_mode = rts_cts; in ath11k_recalc_rtscts_prot()
819 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %d recalc rts/cts prot %d\n", in ath11k_recalc_rtscts_prot()
820 arvif->vdev_id, rts_cts); in ath11k_recalc_rtscts_prot()
822 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_recalc_rtscts_prot()
825 ath11k_warn(ar->ab, "failed to recalculate rts/cts prot for vdev %d: %d\n", in ath11k_recalc_rtscts_prot()
826 arvif->vdev_id, ret); in ath11k_recalc_rtscts_prot()
833 struct ath11k *ar = arvif->ar; in ath11k_mac_set_kickout()
839 ar->pdev->pdev_id); in ath11k_mac_set_kickout()
841 ath11k_warn(ar->ab, "failed to set kickout threshold on vdev %i: %d\n", in ath11k_mac_set_kickout()
842 arvif->vdev_id, ret); in ath11k_mac_set_kickout()
847 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, in ath11k_mac_set_kickout()
850 ath11k_warn(ar->ab, "failed to set keepalive minimum idle time on vdev %i: %d\n", in ath11k_mac_set_kickout()
851 arvif->vdev_id, ret); in ath11k_mac_set_kickout()
856 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, in ath11k_mac_set_kickout()
859 ath11k_warn(ar->ab, "failed to set keepalive maximum idle time on vdev %i: %d\n", in ath11k_mac_set_kickout()
860 arvif->vdev_id, ret); in ath11k_mac_set_kickout()
865 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, in ath11k_mac_set_kickout()
868 ath11k_warn(ar->ab, "failed to set keepalive maximum unresponsive time on vdev %i: %d\n", in ath11k_mac_set_kickout()
869 arvif->vdev_id, ret); in ath11k_mac_set_kickout()
879 struct ath11k_base *ab = ar->ab; in ath11k_mac_peer_cleanup_all()
881 lockdep_assert_held(&ar->conf_mutex); in ath11k_mac_peer_cleanup_all()
883 mutex_lock(&ab->tbl_mtx_lock); in ath11k_mac_peer_cleanup_all()
884 spin_lock_bh(&ab->base_lock); in ath11k_mac_peer_cleanup_all()
885 list_for_each_entry_safe(peer, tmp, &ab->peers, list) { in ath11k_mac_peer_cleanup_all()
888 list_del(&peer->list); in ath11k_mac_peer_cleanup_all()
891 spin_unlock_bh(&ab->base_lock); in ath11k_mac_peer_cleanup_all()
892 mutex_unlock(&ab->tbl_mtx_lock); in ath11k_mac_peer_cleanup_all()
894 ar->num_peers = 0; in ath11k_mac_peer_cleanup_all()
895 ar->num_stations = 0; in ath11k_mac_peer_cleanup_all()
900 lockdep_assert_held(&ar->conf_mutex); in ath11k_mac_vdev_setup_sync()
902 if (test_bit(ATH11K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags)) in ath11k_mac_vdev_setup_sync()
903 return -ESHUTDOWN; in ath11k_mac_vdev_setup_sync()
905 if (!wait_for_completion_timeout(&ar->vdev_setup_done, in ath11k_mac_vdev_setup_sync()
907 return -ETIMEDOUT; in ath11k_mac_vdev_setup_sync()
909 return ar->last_wmi_vdev_start_status ? -EINVAL : 0; in ath11k_mac_vdev_setup_sync()
919 *def = &conf->def; in ath11k_mac_get_any_chandef_iter()
929 lockdep_assert_held(&ar->conf_mutex); in ath11k_mac_monitor_vdev_start()
931 channel = chandef->chan; in ath11k_mac_monitor_vdev_start()
934 arg.channel.freq = channel->center_freq; in ath11k_mac_monitor_vdev_start()
935 arg.channel.band_center_freq1 = chandef->center_freq1; in ath11k_mac_monitor_vdev_start()
936 arg.channel.band_center_freq2 = chandef->center_freq2; in ath11k_mac_monitor_vdev_start()
938 arg.channel.mode = ath11k_phymodes[chandef->chan->band][chandef->width]; in ath11k_mac_monitor_vdev_start()
939 arg.channel.chan_radar = !!(channel->flags & IEEE80211_CHAN_RADAR); in ath11k_mac_monitor_vdev_start()
942 arg.channel.max_power = channel->max_power; in ath11k_mac_monitor_vdev_start()
943 arg.channel.max_reg_power = channel->max_reg_power; in ath11k_mac_monitor_vdev_start()
944 arg.channel.max_antenna_gain = channel->max_antenna_gain; in ath11k_mac_monitor_vdev_start()
946 arg.pref_tx_streams = ar->num_tx_chains; in ath11k_mac_monitor_vdev_start()
947 arg.pref_rx_streams = ar->num_rx_chains; in ath11k_mac_monitor_vdev_start()
949 arg.channel.passive = !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR); in ath11k_mac_monitor_vdev_start()
951 reinit_completion(&ar->vdev_setup_done); in ath11k_mac_monitor_vdev_start()
952 reinit_completion(&ar->vdev_delete_done); in ath11k_mac_monitor_vdev_start()
956 ath11k_warn(ar->ab, "failed to request monitor vdev %i start: %d\n", in ath11k_mac_monitor_vdev_start()
963 ath11k_warn(ar->ab, "failed to synchronize setup for monitor vdev %i start: %d\n", in ath11k_mac_monitor_vdev_start()
968 ret = ath11k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr, NULL, 0, 0); in ath11k_mac_monitor_vdev_start()
970 ath11k_warn(ar->ab, "failed to put up monitor vdev %i: %d\n", in ath11k_mac_monitor_vdev_start()
975 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "monitor vdev %i started\n", in ath11k_mac_monitor_vdev_start()
981 reinit_completion(&ar->vdev_setup_done); in ath11k_mac_monitor_vdev_start()
985 ath11k_warn(ar->ab, "failed to stop monitor vdev %i after start failure: %d\n", in ath11k_mac_monitor_vdev_start()
992 ath11k_warn(ar->ab, "failed to synchronize setup for vdev %i stop: %d\n", in ath11k_mac_monitor_vdev_start()
997 return -EIO; in ath11k_mac_monitor_vdev_start()
1004 lockdep_assert_held(&ar->conf_mutex); in ath11k_mac_monitor_vdev_stop()
1006 reinit_completion(&ar->vdev_setup_done); in ath11k_mac_monitor_vdev_stop()
1008 ret = ath11k_wmi_vdev_stop(ar, ar->monitor_vdev_id); in ath11k_mac_monitor_vdev_stop()
1010 ath11k_warn(ar->ab, "failed to request monitor vdev %i stop: %d\n", in ath11k_mac_monitor_vdev_stop()
1011 ar->monitor_vdev_id, ret); in ath11k_mac_monitor_vdev_stop()
1017 ath11k_warn(ar->ab, "failed to synchronize monitor vdev %i stop: %d\n", in ath11k_mac_monitor_vdev_stop()
1018 ar->monitor_vdev_id, ret); in ath11k_mac_monitor_vdev_stop()
1022 ret = ath11k_wmi_vdev_down(ar, ar->monitor_vdev_id); in ath11k_mac_monitor_vdev_stop()
1024 ath11k_warn(ar->ab, "failed to put down monitor vdev %i: %d\n", in ath11k_mac_monitor_vdev_stop()
1025 ar->monitor_vdev_id, ret); in ath11k_mac_monitor_vdev_stop()
1029 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "monitor vdev %i stopped\n", in ath11k_mac_monitor_vdev_stop()
1030 ar->monitor_vdev_id); in ath11k_mac_monitor_vdev_stop()
1037 struct ath11k_pdev *pdev = ar->pdev; in ath11k_mac_monitor_vdev_create()
1043 lockdep_assert_held(&ar->conf_mutex); in ath11k_mac_monitor_vdev_create()
1045 if (test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags)) in ath11k_mac_monitor_vdev_create()
1048 if (ar->ab->free_vdev_map == 0) { in ath11k_mac_monitor_vdev_create()
1049 ath11k_warn(ar->ab, "failed to find free vdev id for monitor vdev\n"); in ath11k_mac_monitor_vdev_create()
1050 return -ENOMEM; in ath11k_mac_monitor_vdev_create()
1053 bit = __ffs64(ar->ab->free_vdev_map); in ath11k_mac_monitor_vdev_create()
1055 ar->monitor_vdev_id = bit; in ath11k_mac_monitor_vdev_create()
1057 param.if_id = ar->monitor_vdev_id; in ath11k_mac_monitor_vdev_create()
1060 param.pdev_id = pdev->pdev_id; in ath11k_mac_monitor_vdev_create()
1062 if (pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) { in ath11k_mac_monitor_vdev_create()
1063 param.chains[NL80211_BAND_2GHZ].tx = ar->num_tx_chains; in ath11k_mac_monitor_vdev_create()
1064 param.chains[NL80211_BAND_2GHZ].rx = ar->num_rx_chains; in ath11k_mac_monitor_vdev_create()
1066 if (pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) { in ath11k_mac_monitor_vdev_create()
1067 param.chains[NL80211_BAND_5GHZ].tx = ar->num_tx_chains; in ath11k_mac_monitor_vdev_create()
1068 param.chains[NL80211_BAND_5GHZ].rx = ar->num_rx_chains; in ath11k_mac_monitor_vdev_create()
1073 ath11k_warn(ar->ab, "failed to request monitor vdev %i creation: %d\n", in ath11k_mac_monitor_vdev_create()
1074 ar->monitor_vdev_id, ret); in ath11k_mac_monitor_vdev_create()
1075 ar->monitor_vdev_id = -1; in ath11k_mac_monitor_vdev_create()
1079 nss = get_num_chains(ar->cfg_tx_chainmask) ? : 1; in ath11k_mac_monitor_vdev_create()
1080 ret = ath11k_wmi_vdev_set_param_cmd(ar, ar->monitor_vdev_id, in ath11k_mac_monitor_vdev_create()
1083 ath11k_warn(ar->ab, "failed to set vdev %d chainmask 0x%x, nss %d :%d\n", in ath11k_mac_monitor_vdev_create()
1084 ar->monitor_vdev_id, ar->cfg_tx_chainmask, nss, ret); in ath11k_mac_monitor_vdev_create()
1090 ath11k_warn(ar->ab, "failed to recalc txpower for monitor vdev %d: %d\n", in ath11k_mac_monitor_vdev_create()
1091 ar->monitor_vdev_id, ret); in ath11k_mac_monitor_vdev_create()
1095 ar->allocated_vdev_map |= 1LL << ar->monitor_vdev_id; in ath11k_mac_monitor_vdev_create()
1096 ar->ab->free_vdev_map &= ~(1LL << ar->monitor_vdev_id); in ath11k_mac_monitor_vdev_create()
1097 ar->num_created_vdevs++; in ath11k_mac_monitor_vdev_create()
1098 set_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags); in ath11k_mac_monitor_vdev_create()
1100 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "monitor vdev %d created\n", in ath11k_mac_monitor_vdev_create()
1101 ar->monitor_vdev_id); in ath11k_mac_monitor_vdev_create()
1106 ath11k_wmi_vdev_delete(ar, ar->monitor_vdev_id); in ath11k_mac_monitor_vdev_create()
1107 ar->monitor_vdev_id = -1; in ath11k_mac_monitor_vdev_create()
1116 lockdep_assert_held(&ar->conf_mutex); in ath11k_mac_monitor_vdev_delete()
1118 if (!test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags)) in ath11k_mac_monitor_vdev_delete()
1121 reinit_completion(&ar->vdev_delete_done); in ath11k_mac_monitor_vdev_delete()
1123 ret = ath11k_wmi_vdev_delete(ar, ar->monitor_vdev_id); in ath11k_mac_monitor_vdev_delete()
1125 ath11k_warn(ar->ab, "failed to request wmi monitor vdev %i removal: %d\n", in ath11k_mac_monitor_vdev_delete()
1126 ar->monitor_vdev_id, ret); in ath11k_mac_monitor_vdev_delete()
1130 time_left = wait_for_completion_timeout(&ar->vdev_delete_done, in ath11k_mac_monitor_vdev_delete()
1133 ath11k_warn(ar->ab, "Timeout in receiving vdev delete response\n"); in ath11k_mac_monitor_vdev_delete()
1135 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "monitor vdev %d deleted\n", in ath11k_mac_monitor_vdev_delete()
1136 ar->monitor_vdev_id); in ath11k_mac_monitor_vdev_delete()
1138 ar->allocated_vdev_map &= ~(1LL << ar->monitor_vdev_id); in ath11k_mac_monitor_vdev_delete()
1139 ar->ab->free_vdev_map |= 1LL << (ar->monitor_vdev_id); in ath11k_mac_monitor_vdev_delete()
1140 ar->num_created_vdevs--; in ath11k_mac_monitor_vdev_delete()
1141 ar->monitor_vdev_id = -1; in ath11k_mac_monitor_vdev_delete()
1142 clear_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags); in ath11k_mac_monitor_vdev_delete()
1153 lockdep_assert_held(&ar->conf_mutex); in ath11k_mac_monitor_start()
1155 if (test_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags)) in ath11k_mac_monitor_start()
1158 ieee80211_iter_chan_contexts_atomic(ar->hw, in ath11k_mac_monitor_start()
1164 ret = ath11k_mac_monitor_vdev_start(ar, ar->monitor_vdev_id, chandef); in ath11k_mac_monitor_start()
1166 ath11k_warn(ar->ab, "failed to start monitor vdev: %d\n", ret); in ath11k_mac_monitor_start()
1171 set_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags); in ath11k_mac_monitor_start()
1173 ar->num_started_vdevs++; in ath11k_mac_monitor_start()
1176 ath11k_warn(ar->ab, "failed to configure htt monitor mode ring during start: %d", in ath11k_mac_monitor_start()
1181 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "monitor started\n"); in ath11k_mac_monitor_start()
1190 lockdep_assert_held(&ar->conf_mutex); in ath11k_mac_monitor_stop()
1192 if (!test_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags)) in ath11k_mac_monitor_stop()
1197 ath11k_warn(ar->ab, "failed to stop monitor vdev: %d\n", ret); in ath11k_mac_monitor_stop()
1201 clear_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags); in ath11k_mac_monitor_stop()
1202 ar->num_started_vdevs--; in ath11k_mac_monitor_stop()
1206 ath11k_warn(ar->ab, "failed to configure htt monitor mode ring during stop: %d", in ath11k_mac_monitor_stop()
1211 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "monitor stopped ret %d\n", ret); in ath11k_mac_monitor_stop()
1218 struct ath11k *ar = arvif->ar; in ath11k_mac_vif_setup_ps()
1219 struct ieee80211_vif *vif = arvif->vif; in ath11k_mac_vif_setup_ps()
1220 struct ieee80211_conf *conf = &ar->hw->conf; in ath11k_mac_vif_setup_ps()
1227 lockdep_assert_held(&arvif->ar->conf_mutex); in ath11k_mac_vif_setup_ps()
1229 if (arvif->vif->type != NL80211_IFTYPE_STATION) in ath11k_mac_vif_setup_ps()
1232 enable_ps = arvif->ps; in ath11k_mac_vif_setup_ps()
1238 timeout = conf->dynamic_ps_timeout; in ath11k_mac_vif_setup_ps()
1241 timeout = ieee80211_tu_to_usec(vif->bss_conf.beacon_int) / 1000; in ath11k_mac_vif_setup_ps()
1244 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param, in ath11k_mac_vif_setup_ps()
1247 ath11k_warn(ar->ab, "failed to set inactivity time for vdev %d: %i\n", in ath11k_mac_vif_setup_ps()
1248 arvif->vdev_id, ret); in ath11k_mac_vif_setup_ps()
1255 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %d psmode %s\n", in ath11k_mac_vif_setup_ps()
1256 arvif->vdev_id, psmode ? "enable" : "disable"); in ath11k_mac_vif_setup_ps()
1258 ret = ath11k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id, psmode); in ath11k_mac_vif_setup_ps()
1260 ath11k_warn(ar->ab, "failed to set sta power save mode %d for vdev %d: %d\n", in ath11k_mac_vif_setup_ps()
1261 psmode, arvif->vdev_id, ret); in ath11k_mac_vif_setup_ps()
1273 lockdep_assert_held(&ar->conf_mutex); in ath11k_mac_config_ps()
1275 list_for_each_entry(arvif, &ar->arvifs, list) { in ath11k_mac_config_ps()
1278 ath11k_warn(ar->ab, "failed to setup powersave: %d\n", ret); in ath11k_mac_config_ps()
1288 struct ath11k *ar = hw->priv; in ath11k_mac_op_config()
1289 struct ieee80211_conf *conf = &hw->conf; in ath11k_mac_op_config()
1292 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_config()
1295 if (conf->flags & IEEE80211_CONF_MONITOR) { in ath11k_mac_op_config()
1296 set_bit(ATH11K_FLAG_MONITOR_CONF_ENABLED, &ar->monitor_flags); in ath11k_mac_op_config()
1299 &ar->monitor_flags)) in ath11k_mac_op_config()
1304 ath11k_warn(ar->ab, "failed to create monitor vdev: %d", in ath11k_mac_op_config()
1311 ath11k_warn(ar->ab, "failed to start monitor: %d", in ath11k_mac_op_config()
1316 clear_bit(ATH11K_FLAG_MONITOR_CONF_ENABLED, &ar->monitor_flags); in ath11k_mac_op_config()
1319 &ar->monitor_flags)) in ath11k_mac_op_config()
1324 ath11k_warn(ar->ab, "failed to stop monitor: %d", in ath11k_mac_op_config()
1331 ath11k_warn(ar->ab, "failed to delete monitor vdev: %d", in ath11k_mac_op_config()
1339 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_config()
1344 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_config()
1353 arvif->rsnie_present = true; in ath11k_mac_setup_nontx_vif_rsnie()
1366 arvif->rsnie_present = false; in ath11k_mac_setup_nontx_vif_rsnie()
1381 ies = bcn->data + ieee80211_get_hdrlen_from_skb(bcn); in ath11k_mac_set_nontx_vif_params()
1382 mgmt = (struct ieee80211_mgmt *)bcn->data; in ath11k_mac_set_nontx_vif_params()
1383 ies += sizeof(mgmt->u.beacon); in ath11k_mac_set_nontx_vif_params()
1384 ies_len = skb_tail_pointer(bcn) - ies; in ath11k_mac_set_nontx_vif_params()
1387 arvif->rsnie_present = tx_arvif->rsnie_present; in ath11k_mac_set_nontx_vif_params()
1392 ies_len -= (2 + ies[1]); in ath11k_mac_set_nontx_vif_params()
1393 mbssid_len = ies[1] - 1; in ath11k_mac_set_nontx_vif_params()
1401 mbssid_len -= (2 + profile_len); in ath11k_mac_set_nontx_vif_params()
1404 profile_len -= (2 + profile[1]); in ath11k_mac_set_nontx_vif_params()
1406 profile_len -= (2 + profile[1]); in ath11k_mac_set_nontx_vif_params()
1408 if (profile[2] == arvif->vif->bss_conf.bssid_index) { in ath11k_mac_set_nontx_vif_params()
1409 profile_len -= 5; in ath11k_mac_set_nontx_vif_params()
1412 tx_arvif->rsnie_present, in ath11k_mac_set_nontx_vif_params()
1429 struct ath11k *ar = arvif->ar; in ath11k_mac_setup_bcn_p2p_ie()
1434 mgmt = (void *)bcn->data; in ath11k_mac_setup_bcn_p2p_ie()
1436 mgmt->u.beacon.variable, in ath11k_mac_setup_bcn_p2p_ie()
1437 bcn->len - (mgmt->u.beacon.variable - in ath11k_mac_setup_bcn_p2p_ie()
1438 bcn->data)); in ath11k_mac_setup_bcn_p2p_ie()
1440 return -ENOENT; in ath11k_mac_setup_bcn_p2p_ie()
1442 ret = ath11k_wmi_p2p_go_bcn_ie(ar, arvif->vdev_id, p2p_ie); in ath11k_mac_setup_bcn_p2p_ie()
1444 ath11k_warn(ar->ab, "failed to submit P2P GO bcn ie for vdev %i: %d\n", in ath11k_mac_setup_bcn_p2p_ie()
1445 arvif->vdev_id, ret); in ath11k_mac_setup_bcn_p2p_ie()
1459 if (WARN_ON(skb->len < ie_offset)) in ath11k_mac_remove_vendor_ie()
1460 return -EINVAL; in ath11k_mac_remove_vendor_ie()
1463 skb->data + ie_offset, in ath11k_mac_remove_vendor_ie()
1464 skb->len - ie_offset); in ath11k_mac_remove_vendor_ie()
1466 return -ENOENT; in ath11k_mac_remove_vendor_ie()
1469 end = skb->data + skb->len; in ath11k_mac_remove_vendor_ie()
1473 return -EINVAL; in ath11k_mac_remove_vendor_ie()
1475 memmove(ie, next, end - next); in ath11k_mac_remove_vendor_ie()
1476 skb_trim(skb, skb->len - len); in ath11k_mac_remove_vendor_ie()
1484 struct ath11k_base *ab = arvif->ar->ab; in ath11k_mac_set_vif_params()
1489 ies = bcn->data + ieee80211_get_hdrlen_from_skb(bcn); in ath11k_mac_set_vif_params()
1490 mgmt = (struct ieee80211_mgmt *)bcn->data; in ath11k_mac_set_vif_params()
1491 ies += sizeof(mgmt->u.beacon); in ath11k_mac_set_vif_params()
1493 if (cfg80211_find_ie(WLAN_EID_RSN, ies, (skb_tail_pointer(bcn) - ies))) in ath11k_mac_set_vif_params()
1494 arvif->rsnie_present = true; in ath11k_mac_set_vif_params()
1496 arvif->rsnie_present = false; in ath11k_mac_set_vif_params()
1500 ies, (skb_tail_pointer(bcn) - ies))) in ath11k_mac_set_vif_params()
1501 arvif->wpaie_present = true; in ath11k_mac_set_vif_params()
1503 arvif->wpaie_present = false; in ath11k_mac_set_vif_params()
1505 if (arvif->vdev_subtype != WMI_VDEV_SUBTYPE_P2P_GO) in ath11k_mac_set_vif_params()
1534 if (arvif->vif->mbssid_tx_vif) in ath11k_mac_get_tx_arvif()
1535 return ath11k_vif_to_arvif(arvif->vif->mbssid_tx_vif); in ath11k_mac_get_tx_arvif()
1549 beacons = ieee80211_beacon_get_template_ema_list(tx_arvif->ar->hw, in ath11k_mac_setup_bcn_tmpl_ema()
1550 tx_arvif->vif, 0); in ath11k_mac_setup_bcn_tmpl_ema()
1551 if (!beacons || !beacons->cnt) { in ath11k_mac_setup_bcn_tmpl_ema()
1552 ath11k_warn(arvif->ar->ab, in ath11k_mac_setup_bcn_tmpl_ema()
1554 return -EPERM; in ath11k_mac_setup_bcn_tmpl_ema()
1558 if (ath11k_mac_set_vif_params(tx_arvif, beacons->bcn[0].skb)) in ath11k_mac_setup_bcn_tmpl_ema()
1559 return -EINVAL; in ath11k_mac_setup_bcn_tmpl_ema()
1561 arvif->wpaie_present = tx_arvif->wpaie_present; in ath11k_mac_setup_bcn_tmpl_ema()
1564 for (i = 0; i < beacons->cnt; i++) { in ath11k_mac_setup_bcn_tmpl_ema()
1568 beacons->bcn[i].skb); in ath11k_mac_setup_bcn_tmpl_ema()
1570 params = beacons->cnt; in ath11k_mac_setup_bcn_tmpl_ema()
1573 params |= ((i + 1 == beacons->cnt ? 1 : 0) << WMI_EMA_LAST_TMPL_SHIFT); in ath11k_mac_setup_bcn_tmpl_ema()
1575 ret = ath11k_wmi_bcn_tmpl(tx_arvif->ar, tx_arvif->vdev_id, in ath11k_mac_setup_bcn_tmpl_ema()
1576 &beacons->bcn[i].offs, in ath11k_mac_setup_bcn_tmpl_ema()
1577 beacons->bcn[i].skb, params); in ath11k_mac_setup_bcn_tmpl_ema()
1579 ath11k_warn(tx_arvif->ar->ab, in ath11k_mac_setup_bcn_tmpl_ema()
1589 return -EINVAL; /* Profile not found in the beacons */ in ath11k_mac_setup_bcn_tmpl_ema()
1597 struct ath11k *ar = arvif->ar; in ath11k_mac_setup_bcn_tmpl_mbssid()
1598 struct ath11k_base *ab = ar->ab; in ath11k_mac_setup_bcn_tmpl_mbssid()
1599 struct ieee80211_hw *hw = ar->hw; in ath11k_mac_setup_bcn_tmpl_mbssid()
1600 struct ieee80211_vif *vif = arvif->vif; in ath11k_mac_setup_bcn_tmpl_mbssid()
1606 ar = tx_arvif->ar; in ath11k_mac_setup_bcn_tmpl_mbssid()
1607 ab = ar->ab; in ath11k_mac_setup_bcn_tmpl_mbssid()
1608 hw = ar->hw; in ath11k_mac_setup_bcn_tmpl_mbssid()
1609 vif = tx_arvif->vif; in ath11k_mac_setup_bcn_tmpl_mbssid()
1615 return -EPERM; in ath11k_mac_setup_bcn_tmpl_mbssid()
1620 return -EINVAL; in ath11k_mac_setup_bcn_tmpl_mbssid()
1622 return -EINVAL; in ath11k_mac_setup_bcn_tmpl_mbssid()
1625 ret = ath11k_wmi_bcn_tmpl(ar, arvif->vdev_id, &offs, bcn, 0); in ath11k_mac_setup_bcn_tmpl_mbssid()
1637 struct ieee80211_vif *vif = arvif->vif; in ath11k_mac_setup_bcn_tmpl()
1640 if (arvif->vdev_type != WMI_VDEV_TYPE_AP) in ath11k_mac_setup_bcn_tmpl()
1644 * non-transmitting interfaces, and results in a crash if sent. in ath11k_mac_setup_bcn_tmpl()
1648 if (arvif != tx_arvif && arvif->is_up) in ath11k_mac_setup_bcn_tmpl()
1651 if (vif->bss_conf.ema_ap) in ath11k_mac_setup_bcn_tmpl()
1662 struct ieee80211_vif *vif = arvif->vif; in ath11k_mac_bcn_tx_event()
1664 if (!vif->bss_conf.color_change_active && !arvif->bcca_zero_sent) in ath11k_mac_bcn_tx_event()
1667 if (vif->bss_conf.color_change_active && in ath11k_mac_bcn_tx_event()
1669 arvif->bcca_zero_sent = true; in ath11k_mac_bcn_tx_event()
1674 arvif->bcca_zero_sent = false; in ath11k_mac_bcn_tx_event()
1676 if (vif->bss_conf.color_change_active) in ath11k_mac_bcn_tx_event()
1684 struct ath11k *ar = arvif->ar; in ath11k_control_beaconing()
1688 lockdep_assert_held(&arvif->ar->conf_mutex); in ath11k_control_beaconing()
1690 if (!info->enable_beacon) { in ath11k_control_beaconing()
1691 ret = ath11k_wmi_vdev_down(ar, arvif->vdev_id); in ath11k_control_beaconing()
1693 ath11k_warn(ar->ab, "failed to down vdev_id %i: %d\n", in ath11k_control_beaconing()
1694 arvif->vdev_id, ret); in ath11k_control_beaconing()
1696 arvif->is_up = false; in ath11k_control_beaconing()
1703 ath11k_warn(ar->ab, "failed to update bcn tmpl during vdev up: %d\n", in ath11k_control_beaconing()
1708 arvif->aid = 0; in ath11k_control_beaconing()
1710 ether_addr_copy(arvif->bssid, info->bssid); in ath11k_control_beaconing()
1713 ret = ath11k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid, in ath11k_control_beaconing()
1714 arvif->bssid, in ath11k_control_beaconing()
1715 tx_arvif ? tx_arvif->bssid : NULL, in ath11k_control_beaconing()
1716 info->bssid_index, in ath11k_control_beaconing()
1717 1 << info->bssid_indicator); in ath11k_control_beaconing()
1719 ath11k_warn(ar->ab, "failed to bring up vdev %d: %i\n", in ath11k_control_beaconing()
1720 arvif->vdev_id, ret); in ath11k_control_beaconing()
1724 arvif->is_up = true; in ath11k_control_beaconing()
1726 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %d up\n", arvif->vdev_id); in ath11k_control_beaconing()
1733 struct ieee80211_mgmt *mgmt = (void *)skb->data; in ath11k_mac_handle_beacon_iter()
1736 if (vif->type != NL80211_IFTYPE_STATION) in ath11k_mac_handle_beacon_iter()
1739 if (!ether_addr_equal(mgmt->bssid, vif->bss_conf.bssid)) in ath11k_mac_handle_beacon_iter()
1742 cancel_delayed_work(&arvif->connection_loss_work); in ath11k_mac_handle_beacon_iter()
1747 ieee80211_iterate_active_interfaces_atomic(ar->hw, in ath11k_mac_handle_beacon()
1758 struct ath11k *ar = arvif->ar; in ath11k_mac_handle_beacon_miss_iter()
1759 struct ieee80211_hw *hw = ar->hw; in ath11k_mac_handle_beacon_miss_iter()
1761 if (arvif->vdev_id != *vdev_id) in ath11k_mac_handle_beacon_miss_iter()
1764 if (!arvif->is_up) in ath11k_mac_handle_beacon_miss_iter()
1774 ieee80211_queue_delayed_work(hw, &arvif->connection_loss_work, in ath11k_mac_handle_beacon_miss_iter()
1780 ieee80211_iterate_active_interfaces_atomic(ar->hw, in ath11k_mac_handle_beacon_miss()
1790 struct ieee80211_vif *vif = arvif->vif; in ath11k_mac_vif_sta_connection_loss_work()
1792 if (!arvif->is_up) in ath11k_mac_vif_sta_connection_loss_work()
1806 lockdep_assert_held(&ar->conf_mutex); in ath11k_peer_assoc_h_basic()
1808 if (vif->type == NL80211_IFTYPE_STATION) in ath11k_peer_assoc_h_basic()
1809 aid = vif->cfg.aid; in ath11k_peer_assoc_h_basic()
1811 aid = sta->aid; in ath11k_peer_assoc_h_basic()
1813 ether_addr_copy(arg->peer_mac, sta->addr); in ath11k_peer_assoc_h_basic()
1814 arg->vdev_id = arvif->vdev_id; in ath11k_peer_assoc_h_basic()
1815 arg->peer_associd = aid; in ath11k_peer_assoc_h_basic()
1816 arg->auth_flag = true; in ath11k_peer_assoc_h_basic()
1818 arg->peer_listen_intval = ar->hw->conf.listen_interval; in ath11k_peer_assoc_h_basic()
1819 arg->peer_nss = 1; in ath11k_peer_assoc_h_basic()
1820 arg->peer_caps = vif->bss_conf.assoc_capability; in ath11k_peer_assoc_h_basic()
1828 struct ieee80211_bss_conf *info = &vif->bss_conf; in ath11k_peer_assoc_h_crypto()
1835 lockdep_assert_held(&ar->conf_mutex); in ath11k_peer_assoc_h_crypto()
1840 bss = cfg80211_get_bss(ar->hw->wiphy, def.chan, info->bssid, NULL, 0, in ath11k_peer_assoc_h_crypto()
1843 if (arvif->rsnie_present || arvif->wpaie_present) { in ath11k_peer_assoc_h_crypto()
1844 arg->need_ptk_4_way = true; in ath11k_peer_assoc_h_crypto()
1845 if (arvif->wpaie_present) in ath11k_peer_assoc_h_crypto()
1846 arg->need_gtk_2_way = true; in ath11k_peer_assoc_h_crypto()
1853 ies = rcu_dereference(bss->ies); in ath11k_peer_assoc_h_crypto()
1857 ies->data, in ath11k_peer_assoc_h_crypto()
1858 ies->len); in ath11k_peer_assoc_h_crypto()
1860 cfg80211_put_bss(ar->hw->wiphy, bss); in ath11k_peer_assoc_h_crypto()
1865 ath11k_dbg(ar->ab, ATH11K_DBG_WMI, in ath11k_peer_assoc_h_crypto()
1867 arg->need_ptk_4_way = true; in ath11k_peer_assoc_h_crypto()
1871 ath11k_dbg(ar->ab, ATH11K_DBG_WMI, in ath11k_peer_assoc_h_crypto()
1873 arg->need_gtk_2_way = true; in ath11k_peer_assoc_h_crypto()
1876 if (sta->mfp) { in ath11k_peer_assoc_h_crypto()
1878 arg->is_pmf_enabled = true; in ath11k_peer_assoc_h_crypto()
1881 /* TODO: safe_mode_enabled (bypass 4-way handshake) flag req? */ in ath11k_peer_assoc_h_crypto()
1890 struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates; in ath11k_peer_assoc_h_rates()
1899 lockdep_assert_held(&ar->conf_mutex); in ath11k_peer_assoc_h_rates()
1904 band = def.chan->band; in ath11k_peer_assoc_h_rates()
1905 sband = ar->hw->wiphy->bands[band]; in ath11k_peer_assoc_h_rates()
1906 ratemask = sta->deflink.supp_rates[band]; in ath11k_peer_assoc_h_rates()
1907 ratemask &= arvif->bitrate_mask.control[band].legacy; in ath11k_peer_assoc_h_rates()
1908 rates = sband->bitrates; in ath11k_peer_assoc_h_rates()
1910 rateset->num_rates = 0; in ath11k_peer_assoc_h_rates()
1916 rate = ath11k_mac_bitrate_to_rate(rates->bitrate); in ath11k_peer_assoc_h_rates()
1917 rateset->rates[rateset->num_rates] = rate; in ath11k_peer_assoc_h_rates()
1918 rateset->num_rates++; in ath11k_peer_assoc_h_rates()
1951 const struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap; in ath11k_peer_assoc_h_ht()
1960 lockdep_assert_held(&ar->conf_mutex); in ath11k_peer_assoc_h_ht()
1965 if (!ht_cap->ht_supported) in ath11k_peer_assoc_h_ht()
1968 band = def.chan->band; in ath11k_peer_assoc_h_ht()
1969 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs; in ath11k_peer_assoc_h_ht()
1974 arg->ht_flag = true; in ath11k_peer_assoc_h_ht()
1976 arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR + in ath11k_peer_assoc_h_ht()
1977 ht_cap->ampdu_factor)) - 1; in ath11k_peer_assoc_h_ht()
1979 arg->peer_mpdu_density = in ath11k_peer_assoc_h_ht()
1980 ath11k_parse_mpdudensity(ht_cap->ampdu_density); in ath11k_peer_assoc_h_ht()
1982 arg->peer_ht_caps = ht_cap->cap; in ath11k_peer_assoc_h_ht()
1983 arg->peer_rate_caps |= WMI_HOST_RC_HT_FLAG; in ath11k_peer_assoc_h_ht()
1985 if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING) in ath11k_peer_assoc_h_ht()
1986 arg->ldpc_flag = true; in ath11k_peer_assoc_h_ht()
1988 if (sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40) { in ath11k_peer_assoc_h_ht()
1989 arg->bw_40 = true; in ath11k_peer_assoc_h_ht()
1990 arg->peer_rate_caps |= WMI_HOST_RC_CW40_FLAG; in ath11k_peer_assoc_h_ht()
1997 if (arvif->bitrate_mask.control[band].gi == NL80211_TXRATE_DEFAULT_GI) in ath11k_peer_assoc_h_ht()
1998 arg->peer_ht_caps &= ~(IEEE80211_HT_CAP_SGI_20 | in ath11k_peer_assoc_h_ht()
2001 if (arvif->bitrate_mask.control[band].gi != NL80211_TXRATE_FORCE_LGI) { in ath11k_peer_assoc_h_ht()
2002 if (ht_cap->cap & (IEEE80211_HT_CAP_SGI_20 | in ath11k_peer_assoc_h_ht()
2004 arg->peer_rate_caps |= WMI_HOST_RC_SGI_FLAG; in ath11k_peer_assoc_h_ht()
2007 if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) { in ath11k_peer_assoc_h_ht()
2008 arg->peer_rate_caps |= WMI_HOST_RC_TX_STBC_FLAG; in ath11k_peer_assoc_h_ht()
2009 arg->stbc_flag = true; in ath11k_peer_assoc_h_ht()
2012 if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) { in ath11k_peer_assoc_h_ht()
2013 stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC; in ath11k_peer_assoc_h_ht()
2016 arg->peer_rate_caps |= stbc; in ath11k_peer_assoc_h_ht()
2017 arg->stbc_flag = true; in ath11k_peer_assoc_h_ht()
2020 if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2]) in ath11k_peer_assoc_h_ht()
2021 arg->peer_rate_caps |= WMI_HOST_RC_TS_FLAG; in ath11k_peer_assoc_h_ht()
2022 else if (ht_cap->mcs.rx_mask[1]) in ath11k_peer_assoc_h_ht()
2023 arg->peer_rate_caps |= WMI_HOST_RC_DS_FLAG; in ath11k_peer_assoc_h_ht()
2026 if ((ht_cap->mcs.rx_mask[i / 8] & BIT(i % 8)) && in ath11k_peer_assoc_h_ht()
2029 arg->peer_ht_rates.rates[n++] = i; in ath11k_peer_assoc_h_ht()
2032 /* This is a workaround for HT-enabled STAs which break the spec in ath11k_peer_assoc_h_ht()
2036 * MCS 0 through 7 are mandatory in 20MHz with 800 ns GI at all STAs. in ath11k_peer_assoc_h_ht()
2041 arg->peer_ht_rates.num_rates = 8; in ath11k_peer_assoc_h_ht()
2042 for (i = 0; i < arg->peer_ht_rates.num_rates; i++) in ath11k_peer_assoc_h_ht()
2043 arg->peer_ht_rates.rates[i] = i; in ath11k_peer_assoc_h_ht()
2045 arg->peer_ht_rates.num_rates = n; in ath11k_peer_assoc_h_ht()
2046 arg->peer_nss = min(sta->deflink.rx_nss, max_nss); in ath11k_peer_assoc_h_ht()
2049 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "ht peer %pM mcs cnt %d nss %d\n", in ath11k_peer_assoc_h_ht()
2050 arg->peer_mac, in ath11k_peer_assoc_h_ht()
2051 arg->peer_ht_rates.num_rates, in ath11k_peer_assoc_h_ht()
2052 arg->peer_nss); in ath11k_peer_assoc_h_ht()
2058 case IEEE80211_VHT_MCS_SUPPORT_0_7: return BIT(8) - 1; in ath11k_mac_get_max_vht_mcs_map()
2059 case IEEE80211_VHT_MCS_SUPPORT_0_8: return BIT(9) - 1; in ath11k_mac_get_max_vht_mcs_map()
2060 case IEEE80211_VHT_MCS_SUPPORT_0_9: return BIT(10) - 1; in ath11k_mac_get_max_vht_mcs_map()
2079 idx_limit = fls(mcs_map) - 1; in ath11k_peer_assoc_h_vht_limit()
2081 idx_limit = -1; in ath11k_peer_assoc_h_vht_limit()
2103 case -1: in ath11k_peer_assoc_h_vht_limit()
2118 u8 nss_ratio_info = ar->pdev->cap.nss_ratio_info; in ath11k_get_nss_160mhz()
2126 ath11k_warn(ar->ab, "WMI_NSS_RATIO_3BY4_NSS not supported\n"); in ath11k_get_nss_160mhz()
2132 ath11k_warn(ar->ab, "WMI_NSS_RATIO_2_NSS not supported\n"); in ath11k_get_nss_160mhz()
2135 ath11k_warn(ar->ab, "invalid nss ratio received from firmware: %d\n", in ath11k_get_nss_160mhz()
2148 const struct ieee80211_sta_vht_cap *vht_cap = &sta->deflink.vht_cap; in ath11k_peer_assoc_h_vht()
2162 if (!vht_cap->vht_supported) in ath11k_peer_assoc_h_vht()
2165 band = def.chan->band; in ath11k_peer_assoc_h_vht()
2166 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs; in ath11k_peer_assoc_h_vht()
2171 arg->vht_flag = true; in ath11k_peer_assoc_h_vht()
2174 arg->vht_capable = true; in ath11k_peer_assoc_h_vht()
2176 if (def.chan->band == NL80211_BAND_2GHZ) in ath11k_peer_assoc_h_vht()
2177 arg->vht_ng_flag = true; in ath11k_peer_assoc_h_vht()
2179 arg->peer_vht_caps = vht_cap->cap; in ath11k_peer_assoc_h_vht()
2181 ampdu_factor = (vht_cap->cap & in ath11k_peer_assoc_h_vht()
2185 /* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to in ath11k_peer_assoc_h_vht()
2187 * arg->peer_max_mpdu at this point contains HT max_mpdu so keep in ath11k_peer_assoc_h_vht()
2190 arg->peer_max_mpdu = max(arg->peer_max_mpdu, in ath11k_peer_assoc_h_vht()
2192 ampdu_factor)) - 1); in ath11k_peer_assoc_h_vht()
2194 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80) in ath11k_peer_assoc_h_vht()
2195 arg->bw_80 = true; in ath11k_peer_assoc_h_vht()
2197 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160) in ath11k_peer_assoc_h_vht()
2198 arg->bw_160 = true; in ath11k_peer_assoc_h_vht()
2202 if (vht_nss > sta->deflink.rx_nss) { in ath11k_peer_assoc_h_vht()
2204 for (nss_idx = sta->deflink.rx_nss - 1; nss_idx >= 0; nss_idx--) { in ath11k_peer_assoc_h_vht()
2213 …ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "setting vht range mcs value to peer supported nss %d for peer … in ath11k_peer_assoc_h_vht()
2214 sta->deflink.rx_nss, sta->addr); in ath11k_peer_assoc_h_vht()
2215 vht_mcs_mask[sta->deflink.rx_nss - 1] = vht_mcs_mask[vht_nss - 1]; in ath11k_peer_assoc_h_vht()
2222 vht_mcs = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map) >> in ath11k_peer_assoc_h_vht()
2229 arg->peer_nss = min(sta->deflink.rx_nss, max_nss); in ath11k_peer_assoc_h_vht()
2230 arg->rx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.rx_highest); in ath11k_peer_assoc_h_vht()
2231 arg->rx_mcs_set = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map); in ath11k_peer_assoc_h_vht()
2232 arg->tx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.tx_highest); in ath11k_peer_assoc_h_vht()
2233 arg->tx_mcs_set = ath11k_peer_assoc_h_vht_limit( in ath11k_peer_assoc_h_vht()
2234 __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map), vht_mcs_mask); in ath11k_peer_assoc_h_vht()
2240 arg->tx_mcs_set &= ~IEEE80211_VHT_MCS_SUPPORT_0_11_MASK; in ath11k_peer_assoc_h_vht()
2241 arg->tx_mcs_set |= IEEE80211_DISABLE_VHT_MCS_SUPPORT_0_11; in ath11k_peer_assoc_h_vht()
2243 if ((arg->tx_mcs_set & IEEE80211_VHT_MCS_NOT_SUPPORTED) == in ath11k_peer_assoc_h_vht()
2245 arg->peer_vht_caps &= ~IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE; in ath11k_peer_assoc_h_vht()
2248 arg->tx_max_mcs_nss = 0xFF; in ath11k_peer_assoc_h_vht()
2250 if (arg->peer_phymode == MODE_11AC_VHT160 || in ath11k_peer_assoc_h_vht()
2251 arg->peer_phymode == MODE_11AC_VHT80_80) { in ath11k_peer_assoc_h_vht()
2253 rx_nss = min(arg->peer_nss, tx_nss); in ath11k_peer_assoc_h_vht()
2254 arg->peer_bw_rxnss_override = ATH11K_BW_NSS_MAP_ENABLE; in ath11k_peer_assoc_h_vht()
2257 ath11k_warn(ar->ab, "invalid max_nss\n"); in ath11k_peer_assoc_h_vht()
2261 if (arg->peer_phymode == MODE_11AC_VHT160) in ath11k_peer_assoc_h_vht()
2262 nss_160 = FIELD_PREP(ATH11K_PEER_RX_NSS_160MHZ, rx_nss - 1); in ath11k_peer_assoc_h_vht()
2264 nss_160 = FIELD_PREP(ATH11K_PEER_RX_NSS_80_80MHZ, rx_nss - 1); in ath11k_peer_assoc_h_vht()
2266 arg->peer_bw_rxnss_override |= nss_160; in ath11k_peer_assoc_h_vht()
2269 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, in ath11k_peer_assoc_h_vht()
2271 sta->addr, arg->peer_max_mpdu, arg->peer_flags, in ath11k_peer_assoc_h_vht()
2272 arg->peer_bw_rxnss_override); in ath11k_peer_assoc_h_vht()
2278 case IEEE80211_HE_MCS_SUPPORT_0_7: return BIT(8) - 1; in ath11k_mac_get_max_he_mcs_map()
2279 case IEEE80211_HE_MCS_SUPPORT_0_9: return BIT(10) - 1; in ath11k_mac_get_max_he_mcs_map()
2280 case IEEE80211_HE_MCS_SUPPORT_0_11: return BIT(12) - 1; in ath11k_mac_get_max_he_mcs_map()
2298 idx_limit = fls(mcs_map) - 1; in ath11k_peer_assoc_h_he_limit()
2300 idx_limit = -1; in ath11k_peer_assoc_h_he_limit()
2317 case -1: in ath11k_peer_assoc_h_he_limit()
2348 const struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap; in ath11k_peer_assoc_h_he()
2363 if (!he_cap->has_he) in ath11k_peer_assoc_h_he()
2366 band = def.chan->band; in ath11k_peer_assoc_h_he()
2367 memcpy(he_mcs_mask, arvif->bitrate_mask.control[band].he_mcs, in ath11k_peer_assoc_h_he()
2373 arg->he_flag = true; in ath11k_peer_assoc_h_he()
2374 support_160 = !!(he_cap->he_cap_elem.phy_cap_info[0] & in ath11k_peer_assoc_h_he()
2377 /* Supported HE-MCS and NSS Set of peer he_cap is intersection with self he_cp */ in ath11k_peer_assoc_h_he()
2378 mcs_160_map = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160); in ath11k_peer_assoc_h_he()
2379 mcs_80_map = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80); in ath11k_peer_assoc_h_he()
2384 for (i = 7; i >= 0; i--) { in ath11k_peer_assoc_h_he()
2396 for (i = 7; i >= 0; i--) { in ath11k_peer_assoc_h_he()
2410 arg->peer_nss = min(sta->deflink.rx_nss, max_nss); in ath11k_peer_assoc_h_he()
2412 memcpy_and_pad(&arg->peer_he_cap_macinfo, in ath11k_peer_assoc_h_he()
2413 sizeof(arg->peer_he_cap_macinfo), in ath11k_peer_assoc_h_he()
2414 he_cap->he_cap_elem.mac_cap_info, in ath11k_peer_assoc_h_he()
2415 sizeof(he_cap->he_cap_elem.mac_cap_info), in ath11k_peer_assoc_h_he()
2417 memcpy_and_pad(&arg->peer_he_cap_phyinfo, in ath11k_peer_assoc_h_he()
2418 sizeof(arg->peer_he_cap_phyinfo), in ath11k_peer_assoc_h_he()
2419 he_cap->he_cap_elem.phy_cap_info, in ath11k_peer_assoc_h_he()
2420 sizeof(he_cap->he_cap_elem.phy_cap_info), in ath11k_peer_assoc_h_he()
2422 arg->peer_he_ops = vif->bss_conf.he_oper.params; in ath11k_peer_assoc_h_he()
2425 arg->peer_he_ops &= 0xffffff; in ath11k_peer_assoc_h_he()
2428 * in HE cap is zero, use the arg->peer_max_mpdu as calculated while parsing in ath11k_peer_assoc_h_he()
2431 * For non-zero value of Max AMPDU Extponent Extension in HE MAC caps, in ath11k_peer_assoc_h_he()
2438 ampdu_factor = u8_get_bits(he_cap->he_cap_elem.mac_cap_info[3], in ath11k_peer_assoc_h_he()
2442 if (sta->deflink.vht_cap.vht_supported) in ath11k_peer_assoc_h_he()
2443 arg->peer_max_mpdu = (1 << (IEEE80211_HE_VHT_MAX_AMPDU_FACTOR + in ath11k_peer_assoc_h_he()
2444 ampdu_factor)) - 1; in ath11k_peer_assoc_h_he()
2445 else if (sta->deflink.ht_cap.ht_supported) in ath11k_peer_assoc_h_he()
2446 arg->peer_max_mpdu = (1 << (IEEE80211_HE_HT_MAX_AMPDU_FACTOR + in ath11k_peer_assoc_h_he()
2447 ampdu_factor)) - 1; in ath11k_peer_assoc_h_he()
2450 if (he_cap->he_cap_elem.phy_cap_info[6] & in ath11k_peer_assoc_h_he()
2455 arg->peer_ppet.numss_m1 = he_cap->ppe_thres[0] & in ath11k_peer_assoc_h_he()
2457 arg->peer_ppet.ru_bit_mask = in ath11k_peer_assoc_h_he()
2458 (he_cap->ppe_thres[0] & in ath11k_peer_assoc_h_he()
2462 for (nss = 0; nss <= arg->peer_ppet.numss_m1; nss++) { in ath11k_peer_assoc_h_he()
2467 if ((arg->peer_ppet.ru_bit_mask & BIT(ru)) == 0) in ath11k_peer_assoc_h_he()
2471 val |= ((he_cap->ppe_thres[bit / 8] >> in ath11k_peer_assoc_h_he()
2475 arg->peer_ppet.ppet16_ppet8_ru3_ru0[nss] |= in ath11k_peer_assoc_h_he()
2481 if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_RES) in ath11k_peer_assoc_h_he()
2482 arg->twt_responder = true; in ath11k_peer_assoc_h_he()
2483 if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_REQ) in ath11k_peer_assoc_h_he()
2484 arg->twt_requester = true; in ath11k_peer_assoc_h_he()
2488 if (he_nss > sta->deflink.rx_nss) { in ath11k_peer_assoc_h_he()
2490 for (nss_idx = sta->deflink.rx_nss - 1; nss_idx >= 0; nss_idx--) { in ath11k_peer_assoc_h_he()
2499 …ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "setting he range mcs value to peer supported nss %d for peer %… in ath11k_peer_assoc_h_he()
2500 sta->deflink.rx_nss, sta->addr); in ath11k_peer_assoc_h_he()
2501 he_mcs_mask[sta->deflink.rx_nss - 1] = he_mcs_mask[he_nss - 1]; in ath11k_peer_assoc_h_he()
2504 switch (sta->deflink.bandwidth) { in ath11k_peer_assoc_h_he()
2506 if (he_cap->he_cap_elem.phy_cap_info[0] & in ath11k_peer_assoc_h_he()
2508 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80p80); in ath11k_peer_assoc_h_he()
2510 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80_80] = v; in ath11k_peer_assoc_h_he()
2512 v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80p80); in ath11k_peer_assoc_h_he()
2513 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80_80] = v; in ath11k_peer_assoc_h_he()
2515 arg->peer_he_mcs_count++; in ath11k_peer_assoc_h_he()
2518 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160); in ath11k_peer_assoc_h_he()
2519 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v; in ath11k_peer_assoc_h_he()
2521 v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_160); in ath11k_peer_assoc_h_he()
2523 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v; in ath11k_peer_assoc_h_he()
2525 arg->peer_he_mcs_count++; in ath11k_peer_assoc_h_he()
2531 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80); in ath11k_peer_assoc_h_he()
2532 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v; in ath11k_peer_assoc_h_he()
2534 v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80); in ath11k_peer_assoc_h_he()
2536 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v; in ath11k_peer_assoc_h_he()
2538 arg->peer_he_mcs_count++; in ath11k_peer_assoc_h_he()
2558 arg->peer_nss = min(sta->deflink.rx_nss, max_nss); in ath11k_peer_assoc_h_he()
2560 if (arg->peer_phymode == MODE_11AX_HE160 || in ath11k_peer_assoc_h_he()
2561 arg->peer_phymode == MODE_11AX_HE80_80) { in ath11k_peer_assoc_h_he()
2563 rx_nss = min(arg->peer_nss, tx_nss); in ath11k_peer_assoc_h_he()
2564 arg->peer_bw_rxnss_override = ATH11K_BW_NSS_MAP_ENABLE; in ath11k_peer_assoc_h_he()
2567 ath11k_warn(ar->ab, "invalid max_nss\n"); in ath11k_peer_assoc_h_he()
2571 if (arg->peer_phymode == MODE_11AX_HE160) in ath11k_peer_assoc_h_he()
2572 nss_160 = FIELD_PREP(ATH11K_PEER_RX_NSS_160MHZ, rx_nss - 1); in ath11k_peer_assoc_h_he()
2574 nss_160 = FIELD_PREP(ATH11K_PEER_RX_NSS_80_80MHZ, rx_nss - 1); in ath11k_peer_assoc_h_he()
2576 arg->peer_bw_rxnss_override |= nss_160; in ath11k_peer_assoc_h_he()
2579 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, in ath11k_peer_assoc_h_he()
2581 sta->addr, arg->peer_nss, in ath11k_peer_assoc_h_he()
2582 arg->peer_he_mcs_count, in ath11k_peer_assoc_h_he()
2583 arg->peer_bw_rxnss_override); in ath11k_peer_assoc_h_he()
2591 const struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap; in ath11k_peer_assoc_h_he_6ghz()
2599 band = def.chan->band; in ath11k_peer_assoc_h_he_6ghz()
2601 if (!arg->he_flag || band != NL80211_BAND_6GHZ || !sta->deflink.he_6ghz_capa.capa) in ath11k_peer_assoc_h_he_6ghz()
2604 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40) in ath11k_peer_assoc_h_he_6ghz()
2605 arg->bw_40 = true; in ath11k_peer_assoc_h_he_6ghz()
2607 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80) in ath11k_peer_assoc_h_he_6ghz()
2608 arg->bw_80 = true; in ath11k_peer_assoc_h_he_6ghz()
2610 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160) in ath11k_peer_assoc_h_he_6ghz()
2611 arg->bw_160 = true; in ath11k_peer_assoc_h_he_6ghz()
2613 arg->peer_he_caps_6ghz = le16_to_cpu(sta->deflink.he_6ghz_capa.capa); in ath11k_peer_assoc_h_he_6ghz()
2614 arg->peer_mpdu_density = in ath11k_peer_assoc_h_he_6ghz()
2616 arg->peer_he_caps_6ghz)); in ath11k_peer_assoc_h_he_6ghz()
2618 /* From IEEE Std 802.11ax-2021 - Section 10.12.2: An HE STA shall be capable of in ath11k_peer_assoc_h_he_6ghz()
2619 * receiving A-MPDU where the A-MPDU pre-EOF padding length is up to the value in ath11k_peer_assoc_h_he_6ghz()
2620 * indicated by the Maximum A-MPDU Length Exponent Extension field in the HE in ath11k_peer_assoc_h_he_6ghz()
2621 * Capabilities element and the Maximum A-MPDU Length Exponent field in HE 6 GHz in ath11k_peer_assoc_h_he_6ghz()
2624 * Here, we are extracting the Max A-MPDU Exponent Extension from HE caps and in ath11k_peer_assoc_h_he_6ghz()
2625 * factor is the Maximum A-MPDU Length Exponent from HE 6 GHZ Band capability. in ath11k_peer_assoc_h_he_6ghz()
2628 he_cap->he_cap_elem.mac_cap_info[3]) + in ath11k_peer_assoc_h_he_6ghz()
2630 arg->peer_he_caps_6ghz); in ath11k_peer_assoc_h_he_6ghz()
2632 arg->peer_max_mpdu = (1u << (IEEE80211_HE_6GHZ_MAX_AMPDU_FACTOR + in ath11k_peer_assoc_h_he_6ghz()
2633 ampdu_factor)) - 1; in ath11k_peer_assoc_h_he_6ghz()
2639 const struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap; in ath11k_peer_assoc_h_smps()
2642 if (!ht_cap->ht_supported && !sta->deflink.he_6ghz_capa.capa) in ath11k_peer_assoc_h_smps()
2645 if (ht_cap->ht_supported) { in ath11k_peer_assoc_h_smps()
2646 smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS; in ath11k_peer_assoc_h_smps()
2649 smps = le16_get_bits(sta->deflink.he_6ghz_capa.capa, in ath11k_peer_assoc_h_smps()
2655 arg->static_mimops_flag = true; in ath11k_peer_assoc_h_smps()
2658 arg->dynamic_mimops_flag = true; in ath11k_peer_assoc_h_smps()
2661 arg->spatial_mux_flag = true; in ath11k_peer_assoc_h_smps()
2675 switch (arvif->vdev_type) { in ath11k_peer_assoc_h_qos()
2677 if (sta->wme) { in ath11k_peer_assoc_h_qos()
2679 arg->is_wme_set = true; in ath11k_peer_assoc_h_qos()
2680 arg->qos_flag = true; in ath11k_peer_assoc_h_qos()
2683 if (sta->wme && sta->uapsd_queues) { in ath11k_peer_assoc_h_qos()
2685 arg->is_wme_set = true; in ath11k_peer_assoc_h_qos()
2686 arg->apsd_flag = true; in ath11k_peer_assoc_h_qos()
2687 arg->peer_rate_caps |= WMI_HOST_RC_UAPSD_FLAG; in ath11k_peer_assoc_h_qos()
2691 if (sta->wme) { in ath11k_peer_assoc_h_qos()
2692 arg->is_wme_set = true; in ath11k_peer_assoc_h_qos()
2693 arg->qos_flag = true; in ath11k_peer_assoc_h_qos()
2700 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "peer %pM qos %d\n", in ath11k_peer_assoc_h_qos()
2701 sta->addr, arg->qos_flag); in ath11k_peer_assoc_h_qos()
2713 lockdep_assert_held(&ar->conf_mutex); in ath11k_peer_assoc_qos_ap()
2715 params.vdev_id = arvif->vdev_id; in ath11k_peer_assoc_qos_ap()
2717 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "uapsd_queues 0x%x max_sp %d\n", in ath11k_peer_assoc_qos_ap()
2718 sta->uapsd_queues, sta->max_sp); in ath11k_peer_assoc_qos_ap()
2721 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO) in ath11k_peer_assoc_qos_ap()
2724 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI) in ath11k_peer_assoc_qos_ap()
2727 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK) in ath11k_peer_assoc_qos_ap()
2730 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE) in ath11k_peer_assoc_qos_ap()
2735 if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP) in ath11k_peer_assoc_qos_ap()
2736 max_sp = sta->max_sp; in ath11k_peer_assoc_qos_ap()
2740 ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, ¶ms); in ath11k_peer_assoc_qos_ap()
2746 ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, ¶ms); in ath11k_peer_assoc_qos_ap()
2753 ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, ¶ms); in ath11k_peer_assoc_qos_ap()
2759 ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, ¶ms); in ath11k_peer_assoc_qos_ap()
2766 ath11k_warn(ar->ab, "failed to set ap ps peer param %d for vdev %i: %d\n", in ath11k_peer_assoc_qos_ap()
2767 params.param, arvif->vdev_id, ret); in ath11k_peer_assoc_qos_ap()
2773 return sta->deflink.supp_rates[NL80211_BAND_2GHZ] >> in ath11k_mac_sta_has_ofdm_only()
2780 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160) { in ath11k_mac_get_phymode_vht()
2781 switch (sta->deflink.vht_cap.cap & in ath11k_mac_get_phymode_vht()
2793 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80) in ath11k_mac_get_phymode_vht()
2796 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40) in ath11k_mac_get_phymode_vht()
2799 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_20) in ath11k_mac_get_phymode_vht()
2808 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160) { in ath11k_mac_get_phymode_he()
2809 if (sta->deflink.he_cap.he_cap_elem.phy_cap_info[0] & in ath11k_mac_get_phymode_he()
2812 else if (sta->deflink.he_cap.he_cap_elem.phy_cap_info[0] & in ath11k_mac_get_phymode_he()
2819 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80) in ath11k_mac_get_phymode_he()
2822 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40) in ath11k_mac_get_phymode_he()
2825 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_20) in ath11k_mac_get_phymode_he()
2847 band = def.chan->band; in ath11k_peer_assoc_h_phymode()
2848 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs; in ath11k_peer_assoc_h_phymode()
2849 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs; in ath11k_peer_assoc_h_phymode()
2850 he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs; in ath11k_peer_assoc_h_phymode()
2854 if (sta->deflink.he_cap.has_he && in ath11k_peer_assoc_h_phymode()
2856 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80) in ath11k_peer_assoc_h_phymode()
2858 else if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40) in ath11k_peer_assoc_h_phymode()
2862 } else if (sta->deflink.vht_cap.vht_supported && in ath11k_peer_assoc_h_phymode()
2864 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40) in ath11k_peer_assoc_h_phymode()
2868 } else if (sta->deflink.ht_cap.ht_supported && in ath11k_peer_assoc_h_phymode()
2870 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40) in ath11k_peer_assoc_h_phymode()
2883 if (sta->deflink.he_cap.has_he && in ath11k_peer_assoc_h_phymode()
2886 } else if (sta->deflink.vht_cap.vht_supported && in ath11k_peer_assoc_h_phymode()
2889 } else if (sta->deflink.ht_cap.ht_supported && in ath11k_peer_assoc_h_phymode()
2891 if (sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40) in ath11k_peer_assoc_h_phymode()
2903 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "peer %pM phymode %s\n", in ath11k_peer_assoc_h_phymode()
2904 sta->addr, ath11k_wmi_phymode_str(phymode)); in ath11k_peer_assoc_h_phymode()
2906 arg->peer_phymode = phymode; in ath11k_peer_assoc_h_phymode()
2918 lockdep_assert_held(&ar->conf_mutex); in ath11k_peer_assoc_prepare()
2924 reinit_completion(&ar->peer_assoc_done); in ath11k_peer_assoc_prepare()
2926 arg->peer_new_assoc = !reassoc; in ath11k_peer_assoc_prepare()
2938 arsta->peer_nss = arg->peer_nss; in ath11k_peer_assoc_prepare()
2950 if (!ht_cap->ht_supported && !he_6ghz_capa) in ath11k_setup_peer_smps()
2953 if (ht_cap->ht_supported) { in ath11k_setup_peer_smps()
2954 smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS; in ath11k_setup_peer_smps()
2961 return -EINVAL; in ath11k_setup_peer_smps()
2963 return ath11k_wmi_set_peer_param(ar, addr, arvif->vdev_id, in ath11k_setup_peer_smps()
2970 struct ath11k *ar = arvif->ar; in ath11k_mac_set_he_txbf_conf()
2974 if (!arvif->vif->bss_conf.he_support) in ath11k_mac_set_he_txbf_conf()
2979 if (arvif->vif->bss_conf.he_su_beamformer) { in ath11k_mac_set_he_txbf_conf()
2981 if (arvif->vif->bss_conf.he_mu_beamformer && in ath11k_mac_set_he_txbf_conf()
2982 arvif->vdev_type == WMI_VDEV_TYPE_AP) in ath11k_mac_set_he_txbf_conf()
2986 if (arvif->vif->type != NL80211_IFTYPE_MESH_POINT) { in ath11k_mac_set_he_txbf_conf()
2990 if (arvif->vif->bss_conf.he_full_ul_mumimo) in ath11k_mac_set_he_txbf_conf()
2993 if (arvif->vif->bss_conf.he_su_beamformee) in ath11k_mac_set_he_txbf_conf()
2997 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, value); in ath11k_mac_set_he_txbf_conf()
2999 ath11k_warn(ar->ab, "failed to set vdev %d HE MU mode: %d\n", in ath11k_mac_set_he_txbf_conf()
3000 arvif->vdev_id, ret); in ath11k_mac_set_he_txbf_conf()
3008 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_set_he_txbf_conf()
3011 ath11k_warn(ar->ab, "failed to set vdev %d sounding mode: %d\n", in ath11k_mac_set_he_txbf_conf()
3012 arvif->vdev_id, ret); in ath11k_mac_set_he_txbf_conf()
3030 if (!vif->bss_conf.he_support) in ath11k_mac_vif_recalc_sta_he_txbf()
3033 if (vif->type != NL80211_IFTYPE_STATION) in ath11k_mac_vif_recalc_sta_he_txbf()
3039 if (def.chan->band == NL80211_BAND_2GHZ) in ath11k_mac_vif_recalc_sta_he_txbf()
3040 cap_band = &ar->mac.iftype[NL80211_BAND_2GHZ][vif->type].he_cap; in ath11k_mac_vif_recalc_sta_he_txbf()
3042 cap_band = &ar->mac.iftype[NL80211_BAND_5GHZ][vif->type].he_cap; in ath11k_mac_vif_recalc_sta_he_txbf()
3044 memcpy(&he_cap_elem, &cap_band->he_cap_elem, sizeof(he_cap_elem)); in ath11k_mac_vif_recalc_sta_he_txbf()
3047 if (HECAP_PHY_SUBFMR_GET(he_cap->he_cap_elem.phy_cap_info)) in ath11k_mac_vif_recalc_sta_he_txbf()
3049 if (HECAP_PHY_MUBFMR_GET(he_cap->he_cap_elem.phy_cap_info)) in ath11k_mac_vif_recalc_sta_he_txbf()
3053 if (vif->type != NL80211_IFTYPE_MESH_POINT) { in ath11k_mac_vif_recalc_sta_he_txbf()
3058 if (HECAP_PHY_ULMUMIMO_GET(he_cap->he_cap_elem.phy_cap_info)) in ath11k_mac_vif_recalc_sta_he_txbf()
3069 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, hemode); in ath11k_mac_vif_recalc_sta_he_txbf()
3071 ath11k_warn(ar->ab, "failed to submit vdev param txbf 0x%x: %d\n", in ath11k_mac_vif_recalc_sta_he_txbf()
3083 struct ath11k *ar = hw->priv; in ath11k_bss_assoc()
3092 lockdep_assert_held(&ar->conf_mutex); in ath11k_bss_assoc()
3094 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %i assoc bssid %pM aid %d\n", in ath11k_bss_assoc()
3095 arvif->vdev_id, arvif->bssid, arvif->aid); in ath11k_bss_assoc()
3099 ap_sta = ieee80211_find_sta(vif, bss_conf->bssid); in ath11k_bss_assoc()
3101 ath11k_warn(ar->ab, "failed to find station entry for bss %pM vdev %i\n", in ath11k_bss_assoc()
3102 bss_conf->bssid, arvif->vdev_id); in ath11k_bss_assoc()
3108 he_cap = ap_sta->deflink.he_cap; in ath11k_bss_assoc()
3115 ath11k_warn(ar->ab, "failed to recalc he txbf for vdev %i on bss %pM\n", in ath11k_bss_assoc()
3116 arvif->vdev_id, bss_conf->bssid); in ath11k_bss_assoc()
3124 ath11k_warn(ar->ab, "failed to run peer assoc for %pM vdev %i: %d\n", in ath11k_bss_assoc()
3125 bss_conf->bssid, arvif->vdev_id, ret); in ath11k_bss_assoc()
3129 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) { in ath11k_bss_assoc()
3130 ath11k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n", in ath11k_bss_assoc()
3131 bss_conf->bssid, arvif->vdev_id); in ath11k_bss_assoc()
3135 ret = ath11k_setup_peer_smps(ar, arvif, bss_conf->bssid, in ath11k_bss_assoc()
3136 &ap_sta->deflink.ht_cap, in ath11k_bss_assoc()
3137 le16_to_cpu(ap_sta->deflink.he_6ghz_capa.capa)); in ath11k_bss_assoc()
3139 ath11k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n", in ath11k_bss_assoc()
3140 arvif->vdev_id, ret); in ath11k_bss_assoc()
3144 WARN_ON(arvif->is_up); in ath11k_bss_assoc()
3146 arvif->aid = vif->cfg.aid; in ath11k_bss_assoc()
3147 ether_addr_copy(arvif->bssid, bss_conf->bssid); in ath11k_bss_assoc()
3149 ret = ath11k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid, in ath11k_bss_assoc()
3152 ath11k_warn(ar->ab, "failed to set vdev %d up: %d\n", in ath11k_bss_assoc()
3153 arvif->vdev_id, ret); in ath11k_bss_assoc()
3157 arvif->is_up = true; in ath11k_bss_assoc()
3158 arvif->rekey_data.enable_offload = false; in ath11k_bss_assoc()
3160 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, in ath11k_bss_assoc()
3162 arvif->vdev_id, bss_conf->bssid, vif->cfg.aid); in ath11k_bss_assoc()
3164 spin_lock_bh(&ar->ab->base_lock); in ath11k_bss_assoc()
3166 peer = ath11k_peer_find(ar->ab, arvif->vdev_id, arvif->bssid); in ath11k_bss_assoc()
3167 if (peer && peer->is_authorized) in ath11k_bss_assoc()
3170 spin_unlock_bh(&ar->ab->base_lock); in ath11k_bss_assoc()
3173 ret = ath11k_wmi_set_peer_param(ar, arvif->bssid, in ath11k_bss_assoc()
3174 arvif->vdev_id, in ath11k_bss_assoc()
3178 ath11k_warn(ar->ab, "Unable to authorize BSS peer: %d\n", ret); in ath11k_bss_assoc()
3181 ret = ath11k_wmi_send_obss_spr_cmd(ar, arvif->vdev_id, in ath11k_bss_assoc()
3182 &bss_conf->he_obss_pd); in ath11k_bss_assoc()
3184 ath11k_warn(ar->ab, "failed to set vdev %i OBSS PD parameters: %d\n", in ath11k_bss_assoc()
3185 arvif->vdev_id, ret); in ath11k_bss_assoc()
3187 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_bss_assoc()
3191 ath11k_warn(ar->ab, "failed to set vdev %d dtim policy: %d\n", in ath11k_bss_assoc()
3192 arvif->vdev_id, ret); in ath11k_bss_assoc()
3194 ath11k_mac_11d_scan_stop_all(ar->ab); in ath11k_bss_assoc()
3200 struct ath11k *ar = hw->priv; in ath11k_bss_disassoc()
3204 lockdep_assert_held(&ar->conf_mutex); in ath11k_bss_disassoc()
3206 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %i disassoc bssid %pM\n", in ath11k_bss_disassoc()
3207 arvif->vdev_id, arvif->bssid); in ath11k_bss_disassoc()
3209 ret = ath11k_wmi_vdev_down(ar, arvif->vdev_id); in ath11k_bss_disassoc()
3211 ath11k_warn(ar->ab, "failed to down vdev %i: %d\n", in ath11k_bss_disassoc()
3212 arvif->vdev_id, ret); in ath11k_bss_disassoc()
3214 arvif->is_up = false; in ath11k_bss_disassoc()
3216 memset(&arvif->rekey_data, 0, sizeof(arvif->rekey_data)); in ath11k_bss_disassoc()
3218 cancel_delayed_work_sync(&arvif->connection_loss_work); in ath11k_bss_disassoc()
3243 return -EINVAL; in ath11k_mac_get_rate_hw_value()
3258 lockdep_assert_held(&ar->conf_mutex); in ath11k_recalculate_mgmt_rate()
3260 sband = ar->hw->wiphy->bands[def->chan->band]; in ath11k_recalculate_mgmt_rate()
3261 basic_rate_idx = ffs(vif->bss_conf.basic_rates) - 1; in ath11k_recalculate_mgmt_rate()
3262 bitrate = sband->bitrates[basic_rate_idx].bitrate; in ath11k_recalculate_mgmt_rate()
3266 ath11k_warn(ar->ab, "bitrate not supported %d\n", bitrate); in ath11k_recalculate_mgmt_rate()
3271 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param, in ath11k_recalculate_mgmt_rate()
3274 ath11k_warn(ar->ab, "failed to set mgmt tx rate %d\n", ret); in ath11k_recalculate_mgmt_rate()
3279 ar->hw_rate_code = hw_rate_code; in ath11k_recalculate_mgmt_rate()
3282 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param, in ath11k_recalculate_mgmt_rate()
3285 ath11k_warn(ar->ab, "failed to set beacon tx rate %d\n", ret); in ath11k_recalculate_mgmt_rate()
3291 struct ath11k *ar = arvif->ar; in ath11k_mac_fils_discovery()
3297 if (info->fils_discovery.max_interval) { in ath11k_mac_fils_discovery()
3298 interval = info->fils_discovery.max_interval; in ath11k_mac_fils_discovery()
3300 tmpl = ieee80211_get_fils_discovery_tmpl(ar->hw, arvif->vif); in ath11k_mac_fils_discovery()
3302 ret = ath11k_wmi_fils_discovery_tmpl(ar, arvif->vdev_id, in ath11k_mac_fils_discovery()
3304 } else if (info->unsol_bcast_probe_resp_interval) { in ath11k_mac_fils_discovery()
3306 interval = info->unsol_bcast_probe_resp_interval; in ath11k_mac_fils_discovery()
3308 tmpl = ieee80211_get_unsol_bcast_probe_resp_tmpl(ar->hw, in ath11k_mac_fils_discovery()
3309 arvif->vif); in ath11k_mac_fils_discovery()
3311 ret = ath11k_wmi_probe_resp_tmpl(ar, arvif->vdev_id, in ath11k_mac_fils_discovery()
3314 return ath11k_wmi_fils_discovery(ar, arvif->vdev_id, 0, false); in ath11k_mac_fils_discovery()
3318 ath11k_warn(ar->ab, in ath11k_mac_fils_discovery()
3320 arvif->vdev_id, (unsol_bcast_probe_resp_enabled ? in ath11k_mac_fils_discovery()
3323 return -EPERM; in ath11k_mac_fils_discovery()
3328 ret = ath11k_wmi_fils_discovery(ar, arvif->vdev_id, interval, in ath11k_mac_fils_discovery()
3341 pdev_id = ar->pdev->pdev_id; in ath11k_mac_config_obss_pd()
3343 /* Set and enable SRG/non-SRG OBSS PD Threshold */ in ath11k_mac_config_obss_pd()
3345 if (test_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags)) { in ath11k_mac_config_obss_pd()
3348 ath11k_warn(ar->ab, in ath11k_mac_config_obss_pd()
3354 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, in ath11k_mac_config_obss_pd()
3356 he_obss_pd->sr_ctrl, he_obss_pd->non_srg_max_offset, in ath11k_mac_config_obss_pd()
3357 he_obss_pd->max_offset); in ath11k_mac_config_obss_pd()
3361 if (he_obss_pd->sr_ctrl & in ath11k_mac_config_obss_pd()
3365 if (he_obss_pd->sr_ctrl & IEEE80211_HE_SPR_NON_SRG_OFFSET_PRESENT) in ath11k_mac_config_obss_pd()
3367 he_obss_pd->non_srg_max_offset); in ath11k_mac_config_obss_pd()
3374 if (he_obss_pd->sr_ctrl & IEEE80211_HE_SPR_SRG_INFORMATION_PRESENT) { in ath11k_mac_config_obss_pd()
3375 srg_th = ATH11K_OBSS_PD_MAX_THRESHOLD + he_obss_pd->max_offset; in ath11k_mac_config_obss_pd()
3380 ar->ab->wmi_ab.svc_map)) { in ath11k_mac_config_obss_pd()
3384 non_srg_th -= ATH11K_DEFAULT_NOISE_FLOOR; in ath11k_mac_config_obss_pd()
3393 ath11k_warn(ar->ab, in ath11k_mac_config_obss_pd()
3404 ath11k_warn(ar->ab, in ath11k_mac_config_obss_pd()
3410 /* Set SR Prohibit */ in ath11k_mac_config_obss_pd()
3412 param_val = !!(he_obss_pd->sr_ctrl & in ath11k_mac_config_obss_pd()
3416 ath11k_warn(ar->ab, "failed to set sr_prohibit for pdev: %u\n", in ath11k_mac_config_obss_pd()
3422 ar->ab->wmi_ab.svc_map)) in ath11k_mac_config_obss_pd()
3426 memcpy(bitmap, he_obss_pd->bss_color_bitmap, sizeof(bitmap)); in ath11k_mac_config_obss_pd()
3429 ath11k_warn(ar->ab, in ath11k_mac_config_obss_pd()
3436 memcpy(bitmap, he_obss_pd->partial_bssid_bitmap, sizeof(bitmap)); in ath11k_mac_config_obss_pd()
3439 ath11k_warn(ar->ab, in ath11k_mac_config_obss_pd()
3450 ath11k_warn(ar->ab, in ath11k_mac_config_obss_pd()
3459 ath11k_warn(ar->ab, in ath11k_mac_config_obss_pd()
3465 /* Enable all BSS Colors for non-SRG */ in ath11k_mac_config_obss_pd()
3468 ath11k_warn(ar->ab, in ath11k_mac_config_obss_pd()
3474 /* Enable all partial BSSID mask for non-SRG */ in ath11k_mac_config_obss_pd()
3477 ath11k_warn(ar->ab, in ath11k_mac_config_obss_pd()
3491 test_bit(WMI_TLV_SERVICE_EXT_TPC_REG_SUPPORT, ar->ab->wmi_ab.svc_map) && in ath11k_mac_supports_station_tpc()
3492 arvif->vdev_type == WMI_VDEV_TYPE_STA && in ath11k_mac_supports_station_tpc()
3493 arvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE && in ath11k_mac_supports_station_tpc()
3494 chandef->chan && in ath11k_mac_supports_station_tpc()
3495 chandef->chan->band == NL80211_BAND_6GHZ; in ath11k_mac_supports_station_tpc()
3503 struct ath11k *ar = hw->priv; in ath11k_mac_op_bss_info_changed()
3518 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_bss_info_changed()
3521 arvif->beacon_interval = info->beacon_int; in ath11k_mac_op_bss_info_changed()
3524 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_op_bss_info_changed()
3526 arvif->beacon_interval); in ath11k_mac_op_bss_info_changed()
3528 ath11k_warn(ar->ab, "Failed to set beacon interval for VDEV: %d\n", in ath11k_mac_op_bss_info_changed()
3529 arvif->vdev_id); in ath11k_mac_op_bss_info_changed()
3531 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, in ath11k_mac_op_bss_info_changed()
3533 arvif->beacon_interval, arvif->vdev_id); in ath11k_mac_op_bss_info_changed()
3540 param_value, ar->pdev->pdev_id); in ath11k_mac_op_bss_info_changed()
3542 ath11k_warn(ar->ab, "Failed to set beacon mode for VDEV: %d\n", in ath11k_mac_op_bss_info_changed()
3543 arvif->vdev_id); in ath11k_mac_op_bss_info_changed()
3545 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, in ath11k_mac_op_bss_info_changed()
3547 arvif->vdev_id); in ath11k_mac_op_bss_info_changed()
3549 if (!arvif->do_not_send_tmpl || !arvif->bcca_zero_sent) { in ath11k_mac_op_bss_info_changed()
3552 ath11k_warn(ar->ab, "failed to update bcn template: %d\n", in ath11k_mac_op_bss_info_changed()
3556 if (arvif->bcca_zero_sent) in ath11k_mac_op_bss_info_changed()
3557 arvif->do_not_send_tmpl = true; in ath11k_mac_op_bss_info_changed()
3559 arvif->do_not_send_tmpl = false; in ath11k_mac_op_bss_info_changed()
3561 if (vif->bss_conf.he_support) { in ath11k_mac_op_bss_info_changed()
3562 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_op_bss_info_changed()
3566 ath11k_warn(ar->ab, in ath11k_mac_op_bss_info_changed()
3568 arvif->vdev_id); in ath11k_mac_op_bss_info_changed()
3570 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, in ath11k_mac_op_bss_info_changed()
3572 arvif->vdev_id); in ath11k_mac_op_bss_info_changed()
3577 arvif->dtim_period = info->dtim_period; in ath11k_mac_op_bss_info_changed()
3580 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_op_bss_info_changed()
3582 arvif->dtim_period); in ath11k_mac_op_bss_info_changed()
3585 ath11k_warn(ar->ab, "Failed to set dtim period for VDEV %d: %i\n", in ath11k_mac_op_bss_info_changed()
3586 arvif->vdev_id, ret); in ath11k_mac_op_bss_info_changed()
3588 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, in ath11k_mac_op_bss_info_changed()
3590 arvif->dtim_period, arvif->vdev_id); in ath11k_mac_op_bss_info_changed()
3594 vif->type == NL80211_IFTYPE_AP) { in ath11k_mac_op_bss_info_changed()
3595 arvif->u.ap.ssid_len = vif->cfg.ssid_len; in ath11k_mac_op_bss_info_changed()
3596 if (vif->cfg.ssid_len) in ath11k_mac_op_bss_info_changed()
3597 memcpy(arvif->u.ap.ssid, vif->cfg.ssid, in ath11k_mac_op_bss_info_changed()
3598 vif->cfg.ssid_len); in ath11k_mac_op_bss_info_changed()
3599 arvif->u.ap.hidden_ssid = info->hidden_ssid; in ath11k_mac_op_bss_info_changed()
3602 if (changed & BSS_CHANGED_BSSID && !is_zero_ether_addr(info->bssid)) in ath11k_mac_op_bss_info_changed()
3603 ether_addr_copy(arvif->bssid, info->bssid); in ath11k_mac_op_bss_info_changed()
3606 if (info->enable_beacon) in ath11k_mac_op_bss_info_changed()
3610 if (arvif->is_up && vif->bss_conf.he_support && in ath11k_mac_op_bss_info_changed()
3611 vif->bss_conf.he_oper.params) { in ath11k_mac_op_bss_info_changed()
3613 param_value = vif->bss_conf.he_oper.params; in ath11k_mac_op_bss_info_changed()
3614 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_op_bss_info_changed()
3616 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, in ath11k_mac_op_bss_info_changed()
3618 param_value, arvif->vdev_id); in ath11k_mac_op_bss_info_changed()
3621 ath11k_warn(ar->ab, "Failed to set he oper params %x for VDEV %d: %i\n", in ath11k_mac_op_bss_info_changed()
3622 param_value, arvif->vdev_id, ret); in ath11k_mac_op_bss_info_changed()
3629 cts_prot = !!(info->use_cts_prot); in ath11k_mac_op_bss_info_changed()
3632 if (arvif->is_started) { in ath11k_mac_op_bss_info_changed()
3633 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_op_bss_info_changed()
3636 ath11k_warn(ar->ab, "Failed to set CTS prot for VDEV: %d\n", in ath11k_mac_op_bss_info_changed()
3637 arvif->vdev_id); in ath11k_mac_op_bss_info_changed()
3639 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "Set CTS prot: %d for VDEV: %d\n", in ath11k_mac_op_bss_info_changed()
3640 cts_prot, arvif->vdev_id); in ath11k_mac_op_bss_info_changed()
3642 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "defer protection mode setup, vdev is not ready yet\n"); in ath11k_mac_op_bss_info_changed()
3649 if (info->use_short_slot) in ath11k_mac_op_bss_info_changed()
3656 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_op_bss_info_changed()
3659 ath11k_warn(ar->ab, "Failed to set erp slot for VDEV: %d\n", in ath11k_mac_op_bss_info_changed()
3660 arvif->vdev_id); in ath11k_mac_op_bss_info_changed()
3662 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, in ath11k_mac_op_bss_info_changed()
3664 slottime, arvif->vdev_id); in ath11k_mac_op_bss_info_changed()
3670 if (info->use_short_preamble) in ath11k_mac_op_bss_info_changed()
3676 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_op_bss_info_changed()
3679 ath11k_warn(ar->ab, "Failed to set preamble for VDEV: %d\n", in ath11k_mac_op_bss_info_changed()
3680 arvif->vdev_id); in ath11k_mac_op_bss_info_changed()
3682 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, in ath11k_mac_op_bss_info_changed()
3684 preamble, arvif->vdev_id); in ath11k_mac_op_bss_info_changed()
3688 if (vif->cfg.assoc) in ath11k_mac_op_bss_info_changed()
3695 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev_id %i txpower %d\n", in ath11k_mac_op_bss_info_changed()
3696 arvif->vdev_id, info->txpower); in ath11k_mac_op_bss_info_changed()
3697 arvif->txpower = info->txpower; in ath11k_mac_op_bss_info_changed()
3702 ar->ab->hw_params.supports_sta_ps) { in ath11k_mac_op_bss_info_changed()
3703 arvif->ps = vif->cfg.ps; in ath11k_mac_op_bss_info_changed()
3707 ath11k_warn(ar->ab, "failed to setup ps on vdev %i: %d\n", in ath11k_mac_op_bss_info_changed()
3708 arvif->vdev_id, ret); in ath11k_mac_op_bss_info_changed()
3712 !ath11k_mac_vif_chan(arvif->vif, &def)) { in ath11k_mac_op_bss_info_changed()
3713 band = def.chan->band; in ath11k_mac_op_bss_info_changed()
3714 mcast_rate = vif->bss_conf.mcast_rate[band]; in ath11k_mac_op_bss_info_changed()
3717 rateidx = mcast_rate - 1; in ath11k_mac_op_bss_info_changed()
3719 rateidx = ffs(vif->bss_conf.basic_rates) - 1; in ath11k_mac_op_bss_info_changed()
3721 if (ar->pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) in ath11k_mac_op_bss_info_changed()
3734 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, in ath11k_mac_op_bss_info_changed()
3736 arvif->vdev_id, rate); in ath11k_mac_op_bss_info_changed()
3739 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_op_bss_info_changed()
3742 ath11k_warn(ar->ab, in ath11k_mac_op_bss_info_changed()
3744 arvif->vdev_id, ret); in ath11k_mac_op_bss_info_changed()
3747 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_op_bss_info_changed()
3750 ath11k_warn(ar->ab, in ath11k_mac_op_bss_info_changed()
3752 arvif->vdev_id, ret); in ath11k_mac_op_bss_info_changed()
3756 !ath11k_mac_vif_chan(arvif->vif, &def)) in ath11k_mac_op_bss_info_changed()
3762 if (info->twt_requester || info->twt_responder) { in ath11k_mac_op_bss_info_changed()
3764 ath11k_wmi_send_twt_enable_cmd(ar, ar->pdev->pdev_id, in ath11k_mac_op_bss_info_changed()
3767 ath11k_wmi_send_twt_disable_cmd(ar, ar->pdev->pdev_id); in ath11k_mac_op_bss_info_changed()
3772 ath11k_mac_config_obss_pd(ar, &info->he_obss_pd); in ath11k_mac_op_bss_info_changed()
3775 if (vif->type == NL80211_IFTYPE_AP) { in ath11k_mac_op_bss_info_changed()
3777 ar, arvif->vdev_id, info->he_bss_color.color, in ath11k_mac_op_bss_info_changed()
3779 info->he_bss_color.enabled); in ath11k_mac_op_bss_info_changed()
3781 ath11k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n", in ath11k_mac_op_bss_info_changed()
3782 arvif->vdev_id, ret); in ath11k_mac_op_bss_info_changed()
3785 if (info->he_bss_color.enabled) in ath11k_mac_op_bss_info_changed()
3786 param_value = info->he_bss_color.color << in ath11k_mac_op_bss_info_changed()
3791 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_op_bss_info_changed()
3795 ath11k_warn(ar->ab, in ath11k_mac_op_bss_info_changed()
3797 arvif->vdev_id, ret); in ath11k_mac_op_bss_info_changed()
3799 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, in ath11k_mac_op_bss_info_changed()
3801 param_value, arvif->vdev_id); in ath11k_mac_op_bss_info_changed()
3802 } else if (vif->type == NL80211_IFTYPE_STATION) { in ath11k_mac_op_bss_info_changed()
3804 arvif->vdev_id, in ath11k_mac_op_bss_info_changed()
3807 ath11k_warn(ar->ab, "failed to enable bss color change on vdev %i: %d\n", in ath11k_mac_op_bss_info_changed()
3808 arvif->vdev_id, ret); in ath11k_mac_op_bss_info_changed()
3810 ar, arvif->vdev_id, 0, in ath11k_mac_op_bss_info_changed()
3813 ath11k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n", in ath11k_mac_op_bss_info_changed()
3814 arvif->vdev_id, ret); in ath11k_mac_op_bss_info_changed()
3819 arvif->ftm_responder != info->ftm_responder && in ath11k_mac_op_bss_info_changed()
3820 test_bit(WMI_TLV_SERVICE_RTT, ar->ab->wmi_ab.svc_map) && in ath11k_mac_op_bss_info_changed()
3821 (vif->type == NL80211_IFTYPE_AP || in ath11k_mac_op_bss_info_changed()
3822 vif->type == NL80211_IFTYPE_MESH_POINT)) { in ath11k_mac_op_bss_info_changed()
3823 arvif->ftm_responder = info->ftm_responder; in ath11k_mac_op_bss_info_changed()
3825 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, in ath11k_mac_op_bss_info_changed()
3826 arvif->ftm_responder); in ath11k_mac_op_bss_info_changed()
3828 ath11k_warn(ar->ab, "Failed to set ftm responder %i: %d\n", in ath11k_mac_op_bss_info_changed()
3829 arvif->vdev_id, ret); in ath11k_mac_op_bss_info_changed()
3837 ipv4_cnt = min(vif->cfg.arp_addr_cnt, ATH11K_IPV4_MAX_COUNT); in ath11k_mac_op_bss_info_changed()
3838 memcpy(arvif->arp_ns_offload.ipv4_addr, in ath11k_mac_op_bss_info_changed()
3839 vif->cfg.arp_addr_list, in ath11k_mac_op_bss_info_changed()
3841 memcpy(arvif->arp_ns_offload.mac_addr, vif->addr, ETH_ALEN); in ath11k_mac_op_bss_info_changed()
3842 arvif->arp_ns_offload.ipv4_count = ipv4_cnt; in ath11k_mac_op_bss_info_changed()
3844 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "arp_addr_cnt %d vif->addr %pM, offload_addr %pI4\n", in ath11k_mac_op_bss_info_changed()
3845 vif->cfg.arp_addr_cnt, in ath11k_mac_op_bss_info_changed()
3846 vif->addr, arvif->arp_ns_offload.ipv4_addr); in ath11k_mac_op_bss_info_changed()
3849 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_bss_info_changed()
3854 lockdep_assert_held(&ar->data_lock); in __ath11k_mac_scan_finish()
3856 switch (ar->scan.state) { in __ath11k_mac_scan_finish()
3861 if (ar->scan.is_roc && ar->scan.roc_notify) in __ath11k_mac_scan_finish()
3862 ieee80211_remain_on_channel_expired(ar->hw); in __ath11k_mac_scan_finish()
3865 if (!ar->scan.is_roc) { in __ath11k_mac_scan_finish()
3867 .aborted = ((ar->scan.state == in __ath11k_mac_scan_finish()
3869 (ar->scan.state == in __ath11k_mac_scan_finish()
3873 ieee80211_scan_completed(ar->hw, &info); in __ath11k_mac_scan_finish()
3876 ar->scan.state = ATH11K_SCAN_IDLE; in __ath11k_mac_scan_finish()
3877 ar->scan_channel = NULL; in __ath11k_mac_scan_finish()
3878 ar->scan.roc_freq = 0; in __ath11k_mac_scan_finish()
3879 cancel_delayed_work(&ar->scan.timeout); in __ath11k_mac_scan_finish()
3880 complete_all(&ar->scan.completed); in __ath11k_mac_scan_finish()
3887 spin_lock_bh(&ar->data_lock); in ath11k_mac_scan_finish()
3889 spin_unlock_bh(&ar->data_lock); in ath11k_mac_scan_finish()
3900 lockdep_assert_held(&ar->conf_mutex); in ath11k_scan_stop()
3903 arg.pdev_id = ar->pdev->pdev_id; in ath11k_scan_stop()
3907 ath11k_warn(ar->ab, "failed to stop wmi scan: %d\n", ret); in ath11k_scan_stop()
3911 ret = wait_for_completion_timeout(&ar->scan.completed, 3 * HZ); in ath11k_scan_stop()
3913 ath11k_warn(ar->ab, in ath11k_scan_stop()
3915 ret = -ETIMEDOUT; in ath11k_scan_stop()
3928 spin_lock_bh(&ar->data_lock); in ath11k_scan_stop()
3929 if (ar->scan.state != ATH11K_SCAN_IDLE) in ath11k_scan_stop()
3931 spin_unlock_bh(&ar->data_lock); in ath11k_scan_stop()
3940 lockdep_assert_held(&ar->conf_mutex); in ath11k_scan_abort()
3942 spin_lock_bh(&ar->data_lock); in ath11k_scan_abort()
3944 switch (ar->scan.state) { in ath11k_scan_abort()
3952 ath11k_warn(ar->ab, "refusing scan abortion due to invalid scan state: %d\n", in ath11k_scan_abort()
3953 ar->scan.state); in ath11k_scan_abort()
3956 ar->scan.state = ATH11K_SCAN_ABORTING; in ath11k_scan_abort()
3957 spin_unlock_bh(&ar->data_lock); in ath11k_scan_abort()
3961 ath11k_warn(ar->ab, "failed to abort scan: %d\n", ret); in ath11k_scan_abort()
3963 spin_lock_bh(&ar->data_lock); in ath11k_scan_abort()
3967 spin_unlock_bh(&ar->data_lock); in ath11k_scan_abort()
3975 mutex_lock(&ar->conf_mutex); in ath11k_scan_timeout_work()
3977 mutex_unlock(&ar->conf_mutex); in ath11k_scan_timeout_work()
3986 lockdep_assert_held(&ar->conf_mutex); in ath11k_start_scan()
3995 if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map)) { in ath11k_start_scan()
3998 if (ar->supports_6ghz) in ath11k_start_scan()
4002 ret = wait_for_completion_timeout(&ar->scan.started, timeout); in ath11k_start_scan()
4006 ath11k_warn(ar->ab, "failed to stop scan: %d\n", ret); in ath11k_start_scan()
4008 return -ETIMEDOUT; in ath11k_start_scan()
4015 spin_lock_bh(&ar->data_lock); in ath11k_start_scan()
4016 if (ar->scan.state == ATH11K_SCAN_IDLE) { in ath11k_start_scan()
4017 spin_unlock_bh(&ar->data_lock); in ath11k_start_scan()
4018 return -EINVAL; in ath11k_start_scan()
4020 spin_unlock_bh(&ar->data_lock); in ath11k_start_scan()
4029 struct ath11k *ar = hw->priv; in ath11k_mac_op_hw_scan()
4031 struct cfg80211_scan_request *req = &hw_req->req; in ath11k_mac_op_hw_scan()
4044 if (ar->state_11d == ATH11K_11D_PREPARING && in ath11k_mac_op_hw_scan()
4046 ar->ab->wmi_ab.svc_map)) in ath11k_mac_op_hw_scan()
4047 ath11k_mac_11d_scan_start(ar, arvif->vdev_id); in ath11k_mac_op_hw_scan()
4049 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_hw_scan()
4051 spin_lock_bh(&ar->data_lock); in ath11k_mac_op_hw_scan()
4052 switch (ar->scan.state) { in ath11k_mac_op_hw_scan()
4054 reinit_completion(&ar->scan.started); in ath11k_mac_op_hw_scan()
4055 reinit_completion(&ar->scan.completed); in ath11k_mac_op_hw_scan()
4056 ar->scan.state = ATH11K_SCAN_STARTING; in ath11k_mac_op_hw_scan()
4057 ar->scan.is_roc = false; in ath11k_mac_op_hw_scan()
4058 ar->scan.vdev_id = arvif->vdev_id; in ath11k_mac_op_hw_scan()
4064 ret = -EBUSY; in ath11k_mac_op_hw_scan()
4067 spin_unlock_bh(&ar->data_lock); in ath11k_mac_op_hw_scan()
4075 ret = -ENOMEM; in ath11k_mac_op_hw_scan()
4080 arg->vdev_id = arvif->vdev_id; in ath11k_mac_op_hw_scan()
4081 arg->scan_id = ATH11K_SCAN_ID; in ath11k_mac_op_hw_scan()
4083 if (ar->ab->hw_params.single_pdev_only) in ath11k_mac_op_hw_scan()
4084 arg->scan_f_filter_prb_req = 1; in ath11k_mac_op_hw_scan()
4086 if (req->ie_len) { in ath11k_mac_op_hw_scan()
4087 arg->extraie.ptr = kmemdup(req->ie, req->ie_len, GFP_KERNEL); in ath11k_mac_op_hw_scan()
4088 if (!arg->extraie.ptr) { in ath11k_mac_op_hw_scan()
4089 ret = -ENOMEM; in ath11k_mac_op_hw_scan()
4092 arg->extraie.len = req->ie_len; in ath11k_mac_op_hw_scan()
4095 if (req->n_ssids) { in ath11k_mac_op_hw_scan()
4096 arg->num_ssids = req->n_ssids; in ath11k_mac_op_hw_scan()
4097 for (i = 0; i < arg->num_ssids; i++) { in ath11k_mac_op_hw_scan()
4098 arg->ssid[i].length = req->ssids[i].ssid_len; in ath11k_mac_op_hw_scan()
4099 memcpy(&arg->ssid[i].ssid, req->ssids[i].ssid, in ath11k_mac_op_hw_scan()
4100 req->ssids[i].ssid_len); in ath11k_mac_op_hw_scan()
4103 arg->scan_f_passive = 1; in ath11k_mac_op_hw_scan()
4106 if (req->n_channels) { in ath11k_mac_op_hw_scan()
4107 arg->num_chan = req->n_channels; in ath11k_mac_op_hw_scan()
4108 arg->chan_list = kcalloc(arg->num_chan, sizeof(*arg->chan_list), in ath11k_mac_op_hw_scan()
4111 if (!arg->chan_list) { in ath11k_mac_op_hw_scan()
4112 ret = -ENOMEM; in ath11k_mac_op_hw_scan()
4116 for (i = 0; i < arg->num_chan; i++) { in ath11k_mac_op_hw_scan()
4118 ar->ab->wmi_ab.svc_map)) { in ath11k_mac_op_hw_scan()
4119 arg->chan_list[i] = in ath11k_mac_op_hw_scan()
4120 u32_encode_bits(req->channels[i]->center_freq, in ath11k_mac_op_hw_scan()
4125 * those non-PSC channels where RNR IE is found during in ath11k_mac_op_hw_scan()
4130 if (req->channels[i]->band == NL80211_BAND_6GHZ && in ath11k_mac_op_hw_scan()
4131 req->flags & NL80211_SCAN_FLAG_COLOCATED_6GHZ && in ath11k_mac_op_hw_scan()
4132 !cfg80211_channel_is_psc(req->channels[i])) in ath11k_mac_op_hw_scan()
4133 arg->chan_list[i] |= in ath11k_mac_op_hw_scan()
4136 arg->chan_list[i] = req->channels[i]->center_freq; in ath11k_mac_op_hw_scan()
4141 if (req->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) { in ath11k_mac_op_hw_scan()
4142 arg->scan_f_add_spoofed_mac_in_probe = 1; in ath11k_mac_op_hw_scan()
4143 ether_addr_copy(arg->mac_addr.addr, req->mac_addr); in ath11k_mac_op_hw_scan()
4144 ether_addr_copy(arg->mac_mask.addr, req->mac_addr_mask); in ath11k_mac_op_hw_scan()
4148 if (req->duration) { in ath11k_mac_op_hw_scan()
4149 arg->dwell_time_active = req->duration; in ath11k_mac_op_hw_scan()
4150 arg->dwell_time_active_2g = req->duration; in ath11k_mac_op_hw_scan()
4151 arg->dwell_time_active_6g = req->duration; in ath11k_mac_op_hw_scan()
4152 arg->dwell_time_passive = req->duration; in ath11k_mac_op_hw_scan()
4153 arg->dwell_time_passive_6g = req->duration; in ath11k_mac_op_hw_scan()
4154 arg->burst_duration = req->duration; in ath11k_mac_op_hw_scan()
4156 scan_timeout = min_t(u32, arg->max_rest_time * in ath11k_mac_op_hw_scan()
4157 (arg->num_chan - 1) + (req->duration + in ath11k_mac_op_hw_scan()
4159 arg->num_chan, arg->max_scan_time); in ath11k_mac_op_hw_scan()
4161 scan_timeout = arg->max_scan_time; in ath11k_mac_op_hw_scan()
4169 ath11k_warn(ar->ab, "failed to start hw scan: %d\n", ret); in ath11k_mac_op_hw_scan()
4170 spin_lock_bh(&ar->data_lock); in ath11k_mac_op_hw_scan()
4171 ar->scan.state = ATH11K_SCAN_IDLE; in ath11k_mac_op_hw_scan()
4172 spin_unlock_bh(&ar->data_lock); in ath11k_mac_op_hw_scan()
4175 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout, in ath11k_mac_op_hw_scan()
4180 kfree(arg->chan_list); in ath11k_mac_op_hw_scan()
4181 kfree(arg->extraie.ptr); in ath11k_mac_op_hw_scan()
4185 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_hw_scan()
4187 if (ar->state_11d == ATH11K_11D_PREPARING) in ath11k_mac_op_hw_scan()
4188 ath11k_mac_11d_scan_start(ar, arvif->vdev_id); in ath11k_mac_op_hw_scan()
4196 struct ath11k *ar = hw->priv; in ath11k_mac_op_cancel_hw_scan()
4198 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_cancel_hw_scan()
4200 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_cancel_hw_scan()
4202 cancel_delayed_work_sync(&ar->scan.timeout); in ath11k_mac_op_cancel_hw_scan()
4211 struct ath11k *ar = arvif->ar; in ath11k_install_key()
4213 .vdev_id = arvif->vdev_id, in ath11k_install_key()
4214 .key_idx = key->keyidx, in ath11k_install_key()
4215 .key_len = key->keylen, in ath11k_install_key()
4216 .key_data = key->key, in ath11k_install_key()
4221 lockdep_assert_held(&arvif->ar->conf_mutex); in ath11k_install_key()
4223 reinit_completion(&ar->install_key_done); in ath11k_install_key()
4225 if (test_bit(ATH11K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags)) in ath11k_install_key()
4234 switch (key->cipher) { in ath11k_install_key()
4238 /* TODO: Re-check if flag is valid */ in ath11k_install_key()
4239 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT; in ath11k_install_key()
4249 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT; in ath11k_install_key()
4252 ath11k_warn(ar->ab, "cipher %d is not supported\n", key->cipher); in ath11k_install_key()
4253 return -EOPNOTSUPP; in ath11k_install_key()
4256 if (test_bit(ATH11K_FLAG_RAW_MODE, &ar->ab->dev_flags)) in ath11k_install_key()
4257 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV | in ath11k_install_key()
4261 ret = ath11k_wmi_vdev_install_key(arvif->ar, &arg); in ath11k_install_key()
4266 if (!wait_for_completion_timeout(&ar->install_key_done, 1 * HZ)) in ath11k_install_key()
4267 return -ETIMEDOUT; in ath11k_install_key()
4269 return ar->install_key_status ? -EINVAL : 0; in ath11k_install_key()
4275 struct ath11k *ar = arvif->ar; in ath11k_clear_peer_keys()
4276 struct ath11k_base *ab = ar->ab; in ath11k_clear_peer_keys()
4283 lockdep_assert_held(&ar->conf_mutex); in ath11k_clear_peer_keys()
4285 spin_lock_bh(&ab->base_lock); in ath11k_clear_peer_keys()
4286 peer = ath11k_peer_find(ab, arvif->vdev_id, addr); in ath11k_clear_peer_keys()
4287 spin_unlock_bh(&ab->base_lock); in ath11k_clear_peer_keys()
4290 return -ENOENT; in ath11k_clear_peer_keys()
4292 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) { in ath11k_clear_peer_keys()
4293 if (!peer->keys[i]) in ath11k_clear_peer_keys()
4297 ret = ath11k_install_key(arvif, peer->keys[i], in ath11k_clear_peer_keys()
4306 spin_lock_bh(&ab->base_lock); in ath11k_clear_peer_keys()
4307 peer->keys[i] = NULL; in ath11k_clear_peer_keys()
4308 spin_unlock_bh(&ab->base_lock); in ath11k_clear_peer_keys()
4318 struct ath11k *ar = hw->priv; in ath11k_mac_op_set_key()
4319 struct ath11k_base *ab = ar->ab; in ath11k_mac_op_set_key()
4328 if (key->cipher == WLAN_CIPHER_SUITE_AES_CMAC || in ath11k_mac_op_set_key()
4329 key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_128 || in ath11k_mac_op_set_key()
4330 key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_256 || in ath11k_mac_op_set_key()
4331 key->cipher == WLAN_CIPHER_SUITE_BIP_CMAC_256) in ath11k_mac_op_set_key()
4334 if (test_bit(ATH11K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags)) in ath11k_mac_op_set_key()
4337 if (key->keyidx > WMI_MAX_KEY_INDEX) in ath11k_mac_op_set_key()
4338 return -ENOSPC; in ath11k_mac_op_set_key()
4340 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_set_key()
4343 peer_addr = sta->addr; in ath11k_mac_op_set_key()
4344 else if (arvif->vdev_type == WMI_VDEV_TYPE_STA) in ath11k_mac_op_set_key()
4345 peer_addr = vif->bss_conf.bssid; in ath11k_mac_op_set_key()
4347 peer_addr = vif->addr; in ath11k_mac_op_set_key()
4349 key->hw_key_idx = key->keyidx; in ath11k_mac_op_set_key()
4351 /* the peer should not disappear in mid-way (unless FW goes awry) since in ath11k_mac_op_set_key()
4354 spin_lock_bh(&ab->base_lock); in ath11k_mac_op_set_key()
4355 peer = ath11k_peer_find(ab, arvif->vdev_id, peer_addr); in ath11k_mac_op_set_key()
4362 spin_unlock_bh(&ab->base_lock); in ath11k_mac_op_set_key()
4366 ath11k_warn(ab, "cannot install key for non-existent peer %pM\n", in ath11k_mac_op_set_key()
4368 ret = -EOPNOTSUPP; in ath11k_mac_op_set_key()
4378 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) in ath11k_mac_op_set_key()
4395 spin_lock_bh(&ab->base_lock); in ath11k_mac_op_set_key()
4396 peer = ath11k_peer_find(ab, arvif->vdev_id, peer_addr); in ath11k_mac_op_set_key()
4398 peer->keys[key->keyidx] = key; in ath11k_mac_op_set_key()
4399 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) { in ath11k_mac_op_set_key()
4400 peer->ucast_keyidx = key->keyidx; in ath11k_mac_op_set_key()
4401 peer->sec_type = ath11k_dp_tx_get_encrypt_type(key->cipher); in ath11k_mac_op_set_key()
4403 peer->mcast_keyidx = key->keyidx; in ath11k_mac_op_set_key()
4404 peer->sec_type_grp = ath11k_dp_tx_get_encrypt_type(key->cipher); in ath11k_mac_op_set_key()
4407 peer->keys[key->keyidx] = NULL; in ath11k_mac_op_set_key()
4408 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) in ath11k_mac_op_set_key()
4409 peer->ucast_keyidx = 0; in ath11k_mac_op_set_key()
4411 peer->mcast_keyidx = 0; in ath11k_mac_op_set_key()
4419 switch (key->cipher) { in ath11k_mac_op_set_key()
4426 arsta->pn_type = HAL_PN_TYPE_WPA; in ath11k_mac_op_set_key()
4428 arsta->pn_type = HAL_PN_TYPE_NONE; in ath11k_mac_op_set_key()
4431 arsta->pn_type = HAL_PN_TYPE_NONE; in ath11k_mac_op_set_key()
4436 spin_unlock_bh(&ab->base_lock); in ath11k_mac_op_set_key()
4439 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_set_key()
4451 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) in ath11k_mac_bitrate_mask_num_ht_rates()
4452 num_rates += hweight8(mask->control[band].ht_mcs[i]); in ath11k_mac_bitrate_mask_num_ht_rates()
4465 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) in ath11k_mac_bitrate_mask_num_vht_rates()
4466 num_rates += hweight16(mask->control[band].vht_mcs[i]); in ath11k_mac_bitrate_mask_num_vht_rates()
4479 for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) in ath11k_mac_bitrate_mask_num_he_rates()
4480 num_rates += hweight16(mask->control[band].he_mcs[i]); in ath11k_mac_bitrate_mask_num_he_rates()
4491 struct ath11k *ar = arvif->ar; in ath11k_mac_set_peer_vht_fixed_rate()
4496 lockdep_assert_held(&ar->conf_mutex); in ath11k_mac_set_peer_vht_fixed_rate()
4500 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) { in ath11k_mac_set_peer_vht_fixed_rate()
4501 if (hweight16(mask->control[band].vht_mcs[i]) == 1) { in ath11k_mac_set_peer_vht_fixed_rate()
4503 vht_rate = ffs(mask->control[band].vht_mcs[i]) - 1; in ath11k_mac_set_peer_vht_fixed_rate()
4508 ath11k_warn(ar->ab, "No single VHT Fixed rate found to set for %pM", in ath11k_mac_set_peer_vht_fixed_rate()
4509 sta->addr); in ath11k_mac_set_peer_vht_fixed_rate()
4510 return -EINVAL; in ath11k_mac_set_peer_vht_fixed_rate()
4514 if (nss > sta->deflink.rx_nss) in ath11k_mac_set_peer_vht_fixed_rate()
4515 return -EINVAL; in ath11k_mac_set_peer_vht_fixed_rate()
4517 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, in ath11k_mac_set_peer_vht_fixed_rate()
4519 sta->addr); in ath11k_mac_set_peer_vht_fixed_rate()
4521 rate_code = ATH11K_HW_RATE_CODE(vht_rate, nss - 1, in ath11k_mac_set_peer_vht_fixed_rate()
4523 ret = ath11k_wmi_set_peer_param(ar, sta->addr, in ath11k_mac_set_peer_vht_fixed_rate()
4524 arvif->vdev_id, in ath11k_mac_set_peer_vht_fixed_rate()
4528 ath11k_warn(ar->ab, in ath11k_mac_set_peer_vht_fixed_rate()
4530 sta->addr, rate_code, ret); in ath11k_mac_set_peer_vht_fixed_rate()
4541 struct ath11k *ar = arvif->ar; in ath11k_mac_set_peer_he_fixed_rate()
4546 lockdep_assert_held(&ar->conf_mutex); in ath11k_mac_set_peer_he_fixed_rate()
4550 for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) { in ath11k_mac_set_peer_he_fixed_rate()
4551 if (hweight16(mask->control[band].he_mcs[i]) == 1) { in ath11k_mac_set_peer_he_fixed_rate()
4553 he_rate = ffs(mask->control[band].he_mcs[i]) - 1; in ath11k_mac_set_peer_he_fixed_rate()
4558 ath11k_warn(ar->ab, "No single he fixed rate found to set for %pM", in ath11k_mac_set_peer_he_fixed_rate()
4559 sta->addr); in ath11k_mac_set_peer_he_fixed_rate()
4560 return -EINVAL; in ath11k_mac_set_peer_he_fixed_rate()
4564 if (nss > sta->deflink.rx_nss) in ath11k_mac_set_peer_he_fixed_rate()
4565 return -EINVAL; in ath11k_mac_set_peer_he_fixed_rate()
4567 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, in ath11k_mac_set_peer_he_fixed_rate()
4569 sta->addr); in ath11k_mac_set_peer_he_fixed_rate()
4571 rate_code = ATH11K_HW_RATE_CODE(he_rate, nss - 1, in ath11k_mac_set_peer_he_fixed_rate()
4574 ret = ath11k_wmi_set_peer_param(ar, sta->addr, in ath11k_mac_set_peer_he_fixed_rate()
4575 arvif->vdev_id, in ath11k_mac_set_peer_he_fixed_rate()
4579 ath11k_warn(ar->ab, in ath11k_mac_set_peer_he_fixed_rate()
4581 sta->addr, rate_code, ret); in ath11k_mac_set_peer_he_fixed_rate()
4592 struct ath11k *ar = arvif->ar; in ath11k_mac_set_peer_ht_fixed_rate()
4597 lockdep_assert_held(&ar->conf_mutex); in ath11k_mac_set_peer_ht_fixed_rate()
4599 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) { in ath11k_mac_set_peer_ht_fixed_rate()
4600 if (hweight8(mask->control[band].ht_mcs[i]) == 1) { in ath11k_mac_set_peer_ht_fixed_rate()
4602 ht_rate = ffs(mask->control[band].ht_mcs[i]) - 1; in ath11k_mac_set_peer_ht_fixed_rate()
4607 ath11k_warn(ar->ab, "No single HT Fixed rate found to set for %pM", in ath11k_mac_set_peer_ht_fixed_rate()
4608 sta->addr); in ath11k_mac_set_peer_ht_fixed_rate()
4609 return -EINVAL; in ath11k_mac_set_peer_ht_fixed_rate()
4613 if (nss > sta->deflink.rx_nss) in ath11k_mac_set_peer_ht_fixed_rate()
4614 return -EINVAL; in ath11k_mac_set_peer_ht_fixed_rate()
4616 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, in ath11k_mac_set_peer_ht_fixed_rate()
4618 sta->addr); in ath11k_mac_set_peer_ht_fixed_rate()
4620 rate_code = ATH11K_HW_RATE_CODE(ht_rate, nss - 1, in ath11k_mac_set_peer_ht_fixed_rate()
4622 ret = ath11k_wmi_set_peer_param(ar, sta->addr, in ath11k_mac_set_peer_ht_fixed_rate()
4623 arvif->vdev_id, in ath11k_mac_set_peer_ht_fixed_rate()
4627 ath11k_warn(ar->ab, in ath11k_mac_set_peer_ht_fixed_rate()
4629 sta->addr, rate_code, ret); in ath11k_mac_set_peer_ht_fixed_rate()
4647 lockdep_assert_held(&ar->conf_mutex); in ath11k_station_assoc()
4650 return -EPERM; in ath11k_station_assoc()
4652 band = def.chan->band; in ath11k_station_assoc()
4653 mask = &arvif->bitrate_mask; in ath11k_station_assoc()
4660 ath11k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n", in ath11k_station_assoc()
4661 sta->addr, arvif->vdev_id, ret); in ath11k_station_assoc()
4665 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) { in ath11k_station_assoc()
4666 ath11k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n", in ath11k_station_assoc()
4667 sta->addr, arvif->vdev_id); in ath11k_station_assoc()
4668 return -ETIMEDOUT; in ath11k_station_assoc()
4680 if (sta->deflink.vht_cap.vht_supported && num_vht_rates == 1) { in ath11k_station_assoc()
4685 } else if (sta->deflink.he_cap.has_he && num_he_rates == 1) { in ath11k_station_assoc()
4690 } else if (sta->deflink.ht_cap.ht_supported && num_ht_rates == 1) { in ath11k_station_assoc()
4697 /* Re-assoc is run only to update supported rates for given station. It in ath11k_station_assoc()
4703 ret = ath11k_setup_peer_smps(ar, arvif, sta->addr, in ath11k_station_assoc()
4704 &sta->deflink.ht_cap, in ath11k_station_assoc()
4705 le16_to_cpu(sta->deflink.he_6ghz_capa.capa)); in ath11k_station_assoc()
4707 ath11k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n", in ath11k_station_assoc()
4708 arvif->vdev_id, ret); in ath11k_station_assoc()
4712 if (!sta->wme) { in ath11k_station_assoc()
4713 arvif->num_legacy_stations++; in ath11k_station_assoc()
4719 if (sta->wme && sta->uapsd_queues) { in ath11k_station_assoc()
4722 ath11k_warn(ar->ab, "failed to set qos params for STA %pM for vdev %i: %d\n", in ath11k_station_assoc()
4723 sta->addr, arvif->vdev_id, ret); in ath11k_station_assoc()
4738 lockdep_assert_held(&ar->conf_mutex); in ath11k_station_disassoc()
4740 if (!sta->wme) { in ath11k_station_disassoc()
4741 arvif->num_legacy_stations--; in ath11k_station_disassoc()
4747 ret = ath11k_clear_peer_keys(arvif, sta->addr); in ath11k_station_disassoc()
4749 ath11k_warn(ar->ab, "failed to clear all peer keys for vdev %i: %d\n", in ath11k_station_disassoc()
4750 arvif->vdev_id, ret); in ath11k_station_disassoc()
4783 arvif = arsta->arvif; in ath11k_sta_rc_update_wk()
4784 ar = arvif->ar; in ath11k_sta_rc_update_wk()
4786 if (WARN_ON(ath11k_mac_vif_chan(arvif->vif, &def))) in ath11k_sta_rc_update_wk()
4789 band = def.chan->band; in ath11k_sta_rc_update_wk()
4790 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs; in ath11k_sta_rc_update_wk()
4791 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs; in ath11k_sta_rc_update_wk()
4792 he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs; in ath11k_sta_rc_update_wk()
4794 spin_lock_bh(&ar->data_lock); in ath11k_sta_rc_update_wk()
4796 changed = arsta->changed; in ath11k_sta_rc_update_wk()
4797 arsta->changed = 0; in ath11k_sta_rc_update_wk()
4799 bw = arsta->bw; in ath11k_sta_rc_update_wk()
4800 bw_prev = arsta->bw_prev; in ath11k_sta_rc_update_wk()
4801 nss = arsta->nss; in ath11k_sta_rc_update_wk()
4802 smps = arsta->smps; in ath11k_sta_rc_update_wk()
4804 spin_unlock_bh(&ar->data_lock); in ath11k_sta_rc_update_wk()
4806 mutex_lock(&ar->conf_mutex); in ath11k_sta_rc_update_wk()
4813 ath11k_peer_assoc_h_phymode(ar, arvif->vif, sta, &peer_arg); in ath11k_sta_rc_update_wk()
4816 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "update sta %pM peer bw %d phymode %d\n", in ath11k_sta_rc_update_wk()
4817 sta->addr, bw, peer_phymode); in ath11k_sta_rc_update_wk()
4823 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "BW upgrade for sta %pM new BW %d, old BW %d\n", in ath11k_sta_rc_update_wk()
4824 sta->addr, bw, bw_prev); in ath11k_sta_rc_update_wk()
4826 err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id, in ath11k_sta_rc_update_wk()
4830 ath11k_warn(ar->ab, "failed to update STA %pM peer phymode %d: %d\n", in ath11k_sta_rc_update_wk()
4831 sta->addr, peer_phymode, err); in ath11k_sta_rc_update_wk()
4835 err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id, in ath11k_sta_rc_update_wk()
4839 ath11k_warn(ar->ab, "failed to update STA %pM peer bw %d: %d\n", in ath11k_sta_rc_update_wk()
4840 sta->addr, bw, err); in ath11k_sta_rc_update_wk()
4845 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "BW downgrade for sta %pM new BW %d,old BW %d\n", in ath11k_sta_rc_update_wk()
4846 sta->addr, bw, bw_prev); in ath11k_sta_rc_update_wk()
4848 err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id, in ath11k_sta_rc_update_wk()
4852 ath11k_warn(ar->ab, "failed to update STA %pM peer bw %d: %d\n", in ath11k_sta_rc_update_wk()
4853 sta->addr, bw, err); in ath11k_sta_rc_update_wk()
4857 err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id, in ath11k_sta_rc_update_wk()
4861 ath11k_warn(ar->ab, "failed to update STA %pM peer phymode %d: %d\n", in ath11k_sta_rc_update_wk()
4862 sta->addr, peer_phymode, err); in ath11k_sta_rc_update_wk()
4867 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "update sta %pM nss %d\n", in ath11k_sta_rc_update_wk()
4868 sta->addr, nss); in ath11k_sta_rc_update_wk()
4870 err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id, in ath11k_sta_rc_update_wk()
4873 ath11k_warn(ar->ab, "failed to update STA %pM nss %d: %d\n", in ath11k_sta_rc_update_wk()
4874 sta->addr, nss, err); in ath11k_sta_rc_update_wk()
4878 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "update sta %pM smps %d\n", in ath11k_sta_rc_update_wk()
4879 sta->addr, smps); in ath11k_sta_rc_update_wk()
4881 err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id, in ath11k_sta_rc_update_wk()
4884 ath11k_warn(ar->ab, "failed to update STA %pM smps %d: %d\n", in ath11k_sta_rc_update_wk()
4885 sta->addr, smps, err); in ath11k_sta_rc_update_wk()
4889 mask = &arvif->bitrate_mask; in ath11k_sta_rc_update_wk()
4901 * But, Single rate in VHT mask can be set as per-peer in ath11k_sta_rc_update_wk()
4904 * when per-peer Fixed rate is set. in ath11k_sta_rc_update_wk()
4908 if (sta->deflink.vht_cap.vht_supported && num_vht_rates == 1) { in ath11k_sta_rc_update_wk()
4911 } else if (sta->deflink.he_cap.has_he && num_he_rates == 1) { in ath11k_sta_rc_update_wk()
4914 } else if (sta->deflink.ht_cap.ht_supported && num_ht_rates == 1) { in ath11k_sta_rc_update_wk()
4918 /* If the peer is non-VHT/HE or no fixed VHT/HE rate in ath11k_sta_rc_update_wk()
4924 err = ath11k_wmi_set_peer_param(ar, sta->addr, in ath11k_sta_rc_update_wk()
4925 arvif->vdev_id, in ath11k_sta_rc_update_wk()
4929 ath11k_warn(ar->ab, in ath11k_sta_rc_update_wk()
4931 sta->addr, err); in ath11k_sta_rc_update_wk()
4933 ath11k_peer_assoc_prepare(ar, arvif->vif, sta, in ath11k_sta_rc_update_wk()
4939 ath11k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n", in ath11k_sta_rc_update_wk()
4940 sta->addr, arvif->vdev_id, err); in ath11k_sta_rc_update_wk()
4942 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) in ath11k_sta_rc_update_wk()
4943 ath11k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n", in ath11k_sta_rc_update_wk()
4944 sta->addr, arvif->vdev_id); in ath11k_sta_rc_update_wk()
4949 mutex_unlock(&ar->conf_mutex); in ath11k_sta_rc_update_wk()
4962 arvif = arsta->arvif; in ath11k_sta_set_4addr_wk()
4963 ar = arvif->ar; in ath11k_sta_set_4addr_wk()
4965 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, in ath11k_sta_set_4addr_wk()
4966 "setting USE_4ADDR for peer %pM\n", sta->addr); in ath11k_sta_set_4addr_wk()
4968 ret = ath11k_wmi_set_peer_param(ar, sta->addr, in ath11k_sta_set_4addr_wk()
4969 arvif->vdev_id, in ath11k_sta_set_4addr_wk()
4973 ath11k_warn(ar->ab, "failed to set peer %pM 4addr capability: %d\n", in ath11k_sta_set_4addr_wk()
4974 sta->addr, ret); in ath11k_sta_set_4addr_wk()
4980 struct ath11k *ar = arvif->ar; in ath11k_mac_inc_num_stations()
4982 lockdep_assert_held(&ar->conf_mutex); in ath11k_mac_inc_num_stations()
4984 if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls) in ath11k_mac_inc_num_stations()
4987 if (ar->num_stations >= ar->max_num_stations) in ath11k_mac_inc_num_stations()
4988 return -ENOBUFS; in ath11k_mac_inc_num_stations()
4990 ar->num_stations++; in ath11k_mac_inc_num_stations()
4998 struct ath11k *ar = arvif->ar; in ath11k_mac_dec_num_stations()
5000 lockdep_assert_held(&ar->conf_mutex); in ath11k_mac_dec_num_stations()
5002 if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls) in ath11k_mac_dec_num_stations()
5005 ar->num_stations--; in ath11k_mac_dec_num_stations()
5013 switch (sta->deflink.bandwidth) { in ath11k_mac_ieee80211_sta_bw_to_wmi()
5027 ath11k_warn(ar->ab, "Invalid bandwidth %d for %pM\n", in ath11k_mac_ieee80211_sta_bw_to_wmi()
5028 sta->deflink.bandwidth, sta->addr); in ath11k_mac_ieee80211_sta_bw_to_wmi()
5040 struct ath11k *ar = hw->priv; in ath11k_mac_op_sta_set_txpwr()
5045 if (sta->deflink.txpwr.type == NL80211_TX_POWER_AUTOMATIC) { in ath11k_mac_op_sta_set_txpwr()
5048 txpwr = sta->deflink.txpwr.power; in ath11k_mac_op_sta_set_txpwr()
5050 return -EINVAL; in ath11k_mac_op_sta_set_txpwr()
5054 return -EINVAL; in ath11k_mac_op_sta_set_txpwr()
5056 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_sta_set_txpwr()
5058 ret = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id, in ath11k_mac_op_sta_set_txpwr()
5061 ath11k_warn(ar->ab, "failed to set tx power for station ret: %d\n", in ath11k_mac_op_sta_set_txpwr()
5067 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_sta_set_txpwr()
5075 struct ath11k *ar = hw->priv; in ath11k_mac_op_sta_set_4addr()
5078 if (enabled && !arsta->use_4addr_set) { in ath11k_mac_op_sta_set_4addr()
5079 ieee80211_queue_work(ar->hw, &arsta->set_4addr_wk); in ath11k_mac_op_sta_set_4addr()
5080 arsta->use_4addr_set = true; in ath11k_mac_op_sta_set_4addr()
5089 struct ieee80211_sta *sta = link_sta->sta; in ath11k_mac_op_sta_rc_update()
5090 struct ath11k *ar = hw->priv; in ath11k_mac_op_sta_rc_update()
5096 spin_lock_bh(&ar->ab->base_lock); in ath11k_mac_op_sta_rc_update()
5098 peer = ath11k_peer_find(ar->ab, arvif->vdev_id, sta->addr); in ath11k_mac_op_sta_rc_update()
5100 spin_unlock_bh(&ar->ab->base_lock); in ath11k_mac_op_sta_rc_update()
5101 ath11k_warn(ar->ab, "mac sta rc update failed to find peer %pM on vdev %i\n", in ath11k_mac_op_sta_rc_update()
5102 sta->addr, arvif->vdev_id); in ath11k_mac_op_sta_rc_update()
5106 spin_unlock_bh(&ar->ab->base_lock); in ath11k_mac_op_sta_rc_update()
5108 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, in ath11k_mac_op_sta_rc_update()
5110 sta->addr, changed, sta->deflink.bandwidth, in ath11k_mac_op_sta_rc_update()
5111 sta->deflink.rx_nss, in ath11k_mac_op_sta_rc_update()
5112 sta->deflink.smps_mode); in ath11k_mac_op_sta_rc_update()
5114 spin_lock_bh(&ar->data_lock); in ath11k_mac_op_sta_rc_update()
5118 arsta->bw_prev = arsta->bw; in ath11k_mac_op_sta_rc_update()
5119 arsta->bw = bw; in ath11k_mac_op_sta_rc_update()
5123 arsta->nss = sta->deflink.rx_nss; in ath11k_mac_op_sta_rc_update()
5128 switch (sta->deflink.smps_mode) { in ath11k_mac_op_sta_rc_update()
5140 ath11k_warn(ar->ab, "Invalid smps %d in sta rc update for %pM\n", in ath11k_mac_op_sta_rc_update()
5141 sta->deflink.smps_mode, sta->addr); in ath11k_mac_op_sta_rc_update()
5146 arsta->smps = smps; in ath11k_mac_op_sta_rc_update()
5149 arsta->changed |= changed; in ath11k_mac_op_sta_rc_update()
5151 spin_unlock_bh(&ar->data_lock); in ath11k_mac_op_sta_rc_update()
5153 ieee80211_queue_work(hw, &arsta->update_wk); in ath11k_mac_op_sta_rc_update()
5163 if (arvif->vdev_type != WMI_VDEV_TYPE_STA) in ath11k_conf_tx_uapsd()
5186 arvif->u.sta.uapsd |= value; in ath11k_conf_tx_uapsd()
5188 arvif->u.sta.uapsd &= ~value; in ath11k_conf_tx_uapsd()
5190 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath11k_conf_tx_uapsd()
5192 arvif->u.sta.uapsd); in ath11k_conf_tx_uapsd()
5194 ath11k_warn(ar->ab, "could not set uapsd params %d\n", ret); in ath11k_conf_tx_uapsd()
5198 if (arvif->u.sta.uapsd) in ath11k_conf_tx_uapsd()
5203 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath11k_conf_tx_uapsd()
5207 ath11k_warn(ar->ab, "could not set rx wake param %d\n", ret); in ath11k_conf_tx_uapsd()
5219 struct ath11k *ar = hw->priv; in ath11k_mac_op_conf_tx_mu_edca()
5225 p = &arvif->muedca_params.ac_vo; in ath11k_mac_op_conf_tx_mu_edca()
5228 p = &arvif->muedca_params.ac_vi; in ath11k_mac_op_conf_tx_mu_edca()
5231 p = &arvif->muedca_params.ac_be; in ath11k_mac_op_conf_tx_mu_edca()
5234 p = &arvif->muedca_params.ac_bk; in ath11k_mac_op_conf_tx_mu_edca()
5237 ath11k_warn(ar->ab, "error ac: %d", ac); in ath11k_mac_op_conf_tx_mu_edca()
5238 return -EINVAL; in ath11k_mac_op_conf_tx_mu_edca()
5241 p->cwmin = u8_get_bits(params->mu_edca_param_rec.ecw_min_max, GENMASK(3, 0)); in ath11k_mac_op_conf_tx_mu_edca()
5242 p->cwmax = u8_get_bits(params->mu_edca_param_rec.ecw_min_max, GENMASK(7, 4)); in ath11k_mac_op_conf_tx_mu_edca()
5243 p->aifs = u8_get_bits(params->mu_edca_param_rec.aifsn, GENMASK(3, 0)); in ath11k_mac_op_conf_tx_mu_edca()
5244 p->txop = params->mu_edca_param_rec.mu_edca_timer; in ath11k_mac_op_conf_tx_mu_edca()
5246 ret = ath11k_wmi_send_wmm_update_cmd_tlv(ar, arvif->vdev_id, in ath11k_mac_op_conf_tx_mu_edca()
5247 &arvif->muedca_params, in ath11k_mac_op_conf_tx_mu_edca()
5257 struct ath11k *ar = hw->priv; in ath11k_mac_op_conf_tx()
5262 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_conf_tx()
5266 p = &arvif->wmm_params.ac_vo; in ath11k_mac_op_conf_tx()
5269 p = &arvif->wmm_params.ac_vi; in ath11k_mac_op_conf_tx()
5272 p = &arvif->wmm_params.ac_be; in ath11k_mac_op_conf_tx()
5275 p = &arvif->wmm_params.ac_bk; in ath11k_mac_op_conf_tx()
5280 ret = -EINVAL; in ath11k_mac_op_conf_tx()
5284 p->cwmin = params->cw_min; in ath11k_mac_op_conf_tx()
5285 p->cwmax = params->cw_max; in ath11k_mac_op_conf_tx()
5286 p->aifs = params->aifs; in ath11k_mac_op_conf_tx()
5287 p->txop = params->txop; in ath11k_mac_op_conf_tx()
5289 ret = ath11k_wmi_send_wmm_update_cmd_tlv(ar, arvif->vdev_id, in ath11k_mac_op_conf_tx()
5290 &arvif->wmm_params, in ath11k_mac_op_conf_tx()
5293 ath11k_warn(ar->ab, "failed to set wmm params: %d\n", ret); in ath11k_mac_op_conf_tx()
5297 if (params->mu_edca) { in ath11k_mac_op_conf_tx()
5301 ath11k_warn(ar->ab, "failed to set mu_edca params: %d\n", ret); in ath11k_mac_op_conf_tx()
5306 ret = ath11k_conf_tx_uapsd(ar, vif, ac, params->uapsd); in ath11k_mac_op_conf_tx()
5309 ath11k_warn(ar->ab, "failed to set sta uapsd: %d\n", ret); in ath11k_mac_op_conf_tx()
5312 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_conf_tx()
5321 u32 ar_vht_cap = ar->pdev->cap.vht_cap; in ath11k_create_ht_cap()
5372 for (i = 0; i < ar->num_rx_chains; i++) { in ath11k_create_ht_cap()
5385 struct ath11k *ar = arvif->ar; in ath11k_mac_set_txbf_conf()
5388 u32 vht_cap = ar->pdev->cap.vht_cap; in ath11k_mac_set_txbf_conf()
5401 if (sound_dim > (ar->num_tx_chains - 1)) in ath11k_mac_set_txbf_conf()
5402 sound_dim = ar->num_tx_chains - 1; in ath11k_mac_set_txbf_conf()
5413 arvif->vdev_type == WMI_VDEV_TYPE_AP) in ath11k_mac_set_txbf_conf()
5423 arvif->vdev_type == WMI_VDEV_TYPE_STA) in ath11k_mac_set_txbf_conf()
5427 return ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_set_txbf_conf()
5439 if (ar->num_tx_chains < 2) { in ath11k_set_vht_txbf_cap()
5444 if (ar->num_rx_chains < 2) { in ath11k_set_vht_txbf_cap()
5467 if (sound_dim > (ar->num_tx_chains - 1)) in ath11k_set_vht_txbf_cap()
5468 sound_dim = ar->num_tx_chains - 1; in ath11k_set_vht_txbf_cap()
5492 vht_cap.cap = ar->pdev->cap.vht_cap; in ath11k_create_vht_cap()
5494 if (ar->pdev->cap.nss_ratio_enabled) in ath11k_create_vht_cap()
5503 if (i < ar->num_tx_chains && rate_cap_tx_chainmask & BIT(i)) in ath11k_create_vht_cap()
5508 if (i < ar->num_rx_chains && rate_cap_rx_chainmask & BIT(i)) in ath11k_create_vht_cap()
5532 rate_cap_tx_chainmask = ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift; in ath11k_mac_setup_ht_vht_cap()
5533 rate_cap_rx_chainmask = ar->cfg_rx_chainmask >> cap->rx_chain_mask_shift; in ath11k_mac_setup_ht_vht_cap()
5535 if (cap->supported_bands & WMI_HOST_WLAN_2G_CAP) { in ath11k_mac_setup_ht_vht_cap()
5536 band = &ar->mac.sbands[NL80211_BAND_2GHZ]; in ath11k_mac_setup_ht_vht_cap()
5537 ht_cap = cap->band[NL80211_BAND_2GHZ].ht_cap_info; in ath11k_mac_setup_ht_vht_cap()
5540 band->ht_cap = ath11k_create_ht_cap(ar, ht_cap, in ath11k_mac_setup_ht_vht_cap()
5544 if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP && in ath11k_mac_setup_ht_vht_cap()
5545 (ar->ab->hw_params.single_pdev_only || in ath11k_mac_setup_ht_vht_cap()
5546 !ar->supports_6ghz)) { in ath11k_mac_setup_ht_vht_cap()
5547 band = &ar->mac.sbands[NL80211_BAND_5GHZ]; in ath11k_mac_setup_ht_vht_cap()
5548 ht_cap = cap->band[NL80211_BAND_5GHZ].ht_cap_info; in ath11k_mac_setup_ht_vht_cap()
5551 band->ht_cap = ath11k_create_ht_cap(ar, ht_cap, in ath11k_mac_setup_ht_vht_cap()
5553 band->vht_cap = ath11k_create_vht_cap(ar, rate_cap_tx_chainmask, in ath11k_mac_setup_ht_vht_cap()
5573 he_ppet[0] = fw_ppet->numss_m1 & IEEE80211_PPE_THRES_NSS_MASK; in ath11k_gen_ppe_thresh()
5574 he_ppet[0] |= (fw_ppet->ru_bit_mask << in ath11k_gen_ppe_thresh()
5577 for (nss = 0; nss <= fw_ppet->numss_m1; nss++) { in ath11k_gen_ppe_thresh()
5582 if ((fw_ppet->ru_bit_mask & BIT(ru)) == 0) in ath11k_gen_ppe_thresh()
5584 val = (fw_ppet->ppet16_ppet8_ru3_ru0[nss] >> (ru * 6)) & in ath11k_gen_ppe_thresh()
5587 for (i = 5; i >= 0; i--) { in ath11k_gen_ppe_thresh()
5603 he_cap_elem->mac_cap_info[0] &= ~m; in ath11k_mac_filter_he_cap_mesh()
5608 he_cap_elem->mac_cap_info[2] &= ~m; in ath11k_mac_filter_he_cap_mesh()
5613 he_cap_elem->mac_cap_info[3] &= ~m; in ath11k_mac_filter_he_cap_mesh()
5617 he_cap_elem->mac_cap_info[4] &= ~m; in ath11k_mac_filter_he_cap_mesh()
5623 he_cap_elem->mac_cap_info[5] &= ~m; in ath11k_mac_filter_he_cap_mesh()
5627 he_cap_elem->phy_cap_info[2] &= ~m; in ath11k_mac_filter_he_cap_mesh()
5632 he_cap_elem->phy_cap_info[3] &= ~m; in ath11k_mac_filter_he_cap_mesh()
5635 he_cap_elem->phy_cap_info[4] &= ~m; in ath11k_mac_filter_he_cap_mesh()
5638 he_cap_elem->phy_cap_info[5] &= ~m; in ath11k_mac_filter_he_cap_mesh()
5644 he_cap_elem->phy_cap_info[6] &= ~m; in ath11k_mac_filter_he_cap_mesh()
5650 he_cap_elem->phy_cap_info[7] &= ~m; in ath11k_mac_filter_he_cap_mesh()
5656 he_cap_elem->phy_cap_info[8] &= ~m; in ath11k_mac_filter_he_cap_mesh()
5664 he_cap_elem->phy_cap_info[9] &= ~m; in ath11k_mac_filter_he_cap_mesh()
5672 bcap->he_6ghz_capa = IEEE80211_HT_MPDU_DENSITY_NONE; in ath11k_mac_setup_he_6ghz_cap()
5673 if (bcap->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) in ath11k_mac_setup_he_6ghz_cap()
5674 bcap->he_6ghz_capa |= in ath11k_mac_setup_he_6ghz_cap()
5678 bcap->he_6ghz_capa |= in ath11k_mac_setup_he_6ghz_cap()
5682 pcap->vht_cap); in ath11k_mac_setup_he_6ghz_cap()
5683 bcap->he_6ghz_capa |= in ath11k_mac_setup_he_6ghz_cap()
5685 val = FIELD_GET(IEEE80211_VHT_CAP_MAX_MPDU_MASK, pcap->vht_cap); in ath11k_mac_setup_he_6ghz_cap()
5686 bcap->he_6ghz_capa |= in ath11k_mac_setup_he_6ghz_cap()
5688 if (pcap->vht_cap & IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN) in ath11k_mac_setup_he_6ghz_cap()
5689 bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_RX_ANTPAT_CONS; in ath11k_mac_setup_he_6ghz_cap()
5690 if (pcap->vht_cap & IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN) in ath11k_mac_setup_he_6ghz_cap()
5691 bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_TX_ANTPAT_CONS; in ath11k_mac_setup_he_6ghz_cap()
5693 return cpu_to_le16(bcap->he_6ghz_capa); in ath11k_mac_setup_he_6ghz_cap()
5707 if (i < ar->num_tx_chains && in ath11k_mac_set_hemcsmap()
5708 (ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift) & BIT(i)) in ath11k_mac_set_hemcsmap()
5713 if (i < ar->num_rx_chains && in ath11k_mac_set_hemcsmap()
5714 (ar->cfg_rx_chainmask >> cap->tx_chain_mask_shift) & BIT(i)) in ath11k_mac_set_hemcsmap()
5719 he_cap->he_mcs_nss_supp.rx_mcs_80 = in ath11k_mac_set_hemcsmap()
5721 he_cap->he_mcs_nss_supp.tx_mcs_80 = in ath11k_mac_set_hemcsmap()
5723 he_cap->he_mcs_nss_supp.rx_mcs_160 = in ath11k_mac_set_hemcsmap()
5725 he_cap->he_mcs_nss_supp.tx_mcs_160 = in ath11k_mac_set_hemcsmap()
5727 he_cap->he_mcs_nss_supp.rx_mcs_80p80 = in ath11k_mac_set_hemcsmap()
5729 he_cap->he_mcs_nss_supp.tx_mcs_80p80 = in ath11k_mac_set_hemcsmap()
5742 struct ath11k_band_cap *band_cap = &cap->band[band]; in ath11k_mac_copy_he_cap()
5744 &he_cap->he_cap_elem; in ath11k_mac_copy_he_cap()
5757 he_cap->has_he = true; in ath11k_mac_copy_he_cap()
5758 memcpy(he_cap_elem->mac_cap_info, band_cap->he_cap_info, in ath11k_mac_copy_he_cap()
5759 sizeof(he_cap_elem->mac_cap_info)); in ath11k_mac_copy_he_cap()
5760 memcpy(he_cap_elem->phy_cap_info, band_cap->he_cap_phy_info, in ath11k_mac_copy_he_cap()
5761 sizeof(he_cap_elem->phy_cap_info)); in ath11k_mac_copy_he_cap()
5763 he_cap_elem->mac_cap_info[1] &= in ath11k_mac_copy_he_cap()
5766 he_cap_elem->phy_cap_info[5] &= in ath11k_mac_copy_he_cap()
5768 he_cap_elem->phy_cap_info[5] |= ar->num_tx_chains - 1; in ath11k_mac_copy_he_cap()
5772 he_cap_elem->phy_cap_info[3] &= in ath11k_mac_copy_he_cap()
5774 he_cap_elem->phy_cap_info[9] |= in ath11k_mac_copy_he_cap()
5778 he_cap_elem->mac_cap_info[0] &= in ath11k_mac_copy_he_cap()
5780 he_cap_elem->mac_cap_info[0] |= in ath11k_mac_copy_he_cap()
5782 he_cap_elem->phy_cap_info[9] |= in ath11k_mac_copy_he_cap()
5792 memset(he_cap->ppe_thres, 0, sizeof(he_cap->ppe_thres)); in ath11k_mac_copy_he_cap()
5793 if (he_cap_elem->phy_cap_info[6] & in ath11k_mac_copy_he_cap()
5795 ath11k_gen_ppe_thresh(&band_cap->he_ppet, in ath11k_mac_copy_he_cap()
5796 he_cap->ppe_thres); in ath11k_mac_copy_he_cap()
5814 if (cap->supported_bands & WMI_HOST_WLAN_2G_CAP) { in ath11k_mac_setup_he_cap()
5816 ar->mac.iftype[NL80211_BAND_2GHZ], in ath11k_mac_setup_he_cap()
5818 band = &ar->mac.sbands[NL80211_BAND_2GHZ]; in ath11k_mac_setup_he_cap()
5820 ar->mac.iftype[NL80211_BAND_2GHZ], in ath11k_mac_setup_he_cap()
5824 if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP) { in ath11k_mac_setup_he_cap()
5826 ar->mac.iftype[NL80211_BAND_5GHZ], in ath11k_mac_setup_he_cap()
5828 band = &ar->mac.sbands[NL80211_BAND_5GHZ]; in ath11k_mac_setup_he_cap()
5830 ar->mac.iftype[NL80211_BAND_5GHZ], in ath11k_mac_setup_he_cap()
5834 if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP && in ath11k_mac_setup_he_cap()
5835 ar->supports_6ghz) { in ath11k_mac_setup_he_cap()
5837 ar->mac.iftype[NL80211_BAND_6GHZ], in ath11k_mac_setup_he_cap()
5839 band = &ar->mac.sbands[NL80211_BAND_6GHZ]; in ath11k_mac_setup_he_cap()
5841 ar->mac.iftype[NL80211_BAND_6GHZ], in ath11k_mac_setup_he_cap()
5850 lockdep_assert_held(&ar->conf_mutex); in __ath11k_set_antenna()
5853 return -EINVAL; in __ath11k_set_antenna()
5856 return -EINVAL; in __ath11k_set_antenna()
5858 ar->cfg_tx_chainmask = tx_ant; in __ath11k_set_antenna()
5859 ar->cfg_rx_chainmask = rx_ant; in __ath11k_set_antenna()
5861 if (ar->state != ATH11K_STATE_ON && in __ath11k_set_antenna()
5862 ar->state != ATH11K_STATE_RESTARTED) in __ath11k_set_antenna()
5866 tx_ant, ar->pdev->pdev_id); in __ath11k_set_antenna()
5868 ath11k_warn(ar->ab, "failed to set tx-chainmask: %d, req 0x%x\n", in __ath11k_set_antenna()
5873 ar->num_tx_chains = get_num_chains(tx_ant); in __ath11k_set_antenna()
5876 rx_ant, ar->pdev->pdev_id); in __ath11k_set_antenna()
5878 ath11k_warn(ar->ab, "failed to set rx-chainmask: %d, req 0x%x\n", in __ath11k_set_antenna()
5883 ar->num_rx_chains = get_num_chains(rx_ant); in __ath11k_set_antenna()
5886 ath11k_mac_setup_ht_vht_cap(ar, &ar->pdev->cap, NULL); in __ath11k_set_antenna()
5887 ath11k_mac_setup_he_cap(ar, &ar->pdev->cap); in __ath11k_set_antenna()
5896 ieee80211_free_txskb(ar->hw, skb); in ath11k_mgmt_over_wmi_tx_drop()
5898 num_mgmt = atomic_dec_if_positive(&ar->num_pending_mgmt_tx); in ath11k_mgmt_over_wmi_tx_drop()
5904 wake_up(&ar->txmgmt_empty_waitq); in ath11k_mgmt_over_wmi_tx_drop()
5912 spin_lock_bh(&ar->txmgmt_idr_lock); in ath11k_mac_tx_mgmt_free()
5913 msdu = idr_remove(&ar->txmgmt_idr, buf_id); in ath11k_mac_tx_mgmt_free()
5914 spin_unlock_bh(&ar->txmgmt_idr_lock); in ath11k_mac_tx_mgmt_free()
5919 dma_unmap_single(ar->ab->dev, ATH11K_SKB_CB(msdu)->paddr, msdu->len, in ath11k_mac_tx_mgmt_free()
5923 memset(&info->status, 0, sizeof(info->status)); in ath11k_mac_tx_mgmt_free()
5941 struct ath11k *ar = skb_cb->ar; in ath11k_mac_vif_txmgmt_idr_remove()
5943 if (skb_cb->vif == vif) in ath11k_mac_vif_txmgmt_idr_remove()
5952 struct ath11k_base *ab = ar->ab; in ath11k_mac_mgmt_tx_wmi()
5953 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; in ath11k_mac_mgmt_tx_wmi()
5962 ATH11K_SKB_CB(skb)->ar = ar; in ath11k_mac_mgmt_tx_wmi()
5964 spin_lock_bh(&ar->txmgmt_idr_lock); in ath11k_mac_mgmt_tx_wmi()
5965 buf_id = idr_alloc(&ar->txmgmt_idr, skb, 0, in ath11k_mac_mgmt_tx_wmi()
5967 spin_unlock_bh(&ar->txmgmt_idr_lock); in ath11k_mac_mgmt_tx_wmi()
5969 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, in ath11k_mac_mgmt_tx_wmi()
5973 return -ENOSPC; in ath11k_mac_mgmt_tx_wmi()
5976 if (!(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP)) { in ath11k_mac_mgmt_tx_wmi()
5977 if ((ieee80211_is_action(hdr->frame_control) || in ath11k_mac_mgmt_tx_wmi()
5978 ieee80211_is_deauth(hdr->frame_control) || in ath11k_mac_mgmt_tx_wmi()
5979 ieee80211_is_disassoc(hdr->frame_control)) && in ath11k_mac_mgmt_tx_wmi()
5980 ieee80211_has_protected(hdr->frame_control)) { in ath11k_mac_mgmt_tx_wmi()
5981 if (!(skb_cb->flags & ATH11K_SKB_CIPHER_SET)) in ath11k_mac_mgmt_tx_wmi()
5984 enctype = ath11k_dp_tx_get_encrypt_type(skb_cb->cipher); in ath11k_mac_mgmt_tx_wmi()
5990 paddr = dma_map_single(ab->dev, skb->data, skb->len, DMA_TO_DEVICE); in ath11k_mac_mgmt_tx_wmi()
5991 if (dma_mapping_error(ab->dev, paddr)) { in ath11k_mac_mgmt_tx_wmi()
5993 ret = -EIO; in ath11k_mac_mgmt_tx_wmi()
5997 ATH11K_SKB_CB(skb)->paddr = paddr; in ath11k_mac_mgmt_tx_wmi()
5999 ret = ath11k_wmi_mgmt_send(ar, arvif->vdev_id, buf_id, skb); in ath11k_mac_mgmt_tx_wmi()
6001 ath11k_warn(ar->ab, "failed to send mgmt frame: %d\n", ret); in ath11k_mac_mgmt_tx_wmi()
6008 dma_unmap_single(ab->dev, ATH11K_SKB_CB(skb)->paddr, in ath11k_mac_mgmt_tx_wmi()
6009 skb->len, DMA_TO_DEVICE); in ath11k_mac_mgmt_tx_wmi()
6011 spin_lock_bh(&ar->txmgmt_idr_lock); in ath11k_mac_mgmt_tx_wmi()
6012 idr_remove(&ar->txmgmt_idr, buf_id); in ath11k_mac_mgmt_tx_wmi()
6013 spin_unlock_bh(&ar->txmgmt_idr_lock); in ath11k_mac_mgmt_tx_wmi()
6022 while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL) in ath11k_mgmt_over_wmi_tx_purge()
6034 while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL) { in ath11k_mgmt_over_wmi_tx_work()
6036 if (!skb_cb->vif) { in ath11k_mgmt_over_wmi_tx_work()
6037 ath11k_warn(ar->ab, "no vif found for mgmt frame\n"); in ath11k_mgmt_over_wmi_tx_work()
6042 arvif = ath11k_vif_to_arvif(skb_cb->vif); in ath11k_mgmt_over_wmi_tx_work()
6043 mutex_lock(&ar->conf_mutex); in ath11k_mgmt_over_wmi_tx_work()
6044 if (ar->allocated_vdev_map & (1LL << arvif->vdev_id)) { in ath11k_mgmt_over_wmi_tx_work()
6047 ath11k_warn(ar->ab, "failed to tx mgmt frame, vdev_id %d :%d\n", in ath11k_mgmt_over_wmi_tx_work()
6048 arvif->vdev_id, ret); in ath11k_mgmt_over_wmi_tx_work()
6051 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, in ath11k_mgmt_over_wmi_tx_work()
6053 arvif->vdev_id); in ath11k_mgmt_over_wmi_tx_work()
6056 ath11k_warn(ar->ab, in ath11k_mgmt_over_wmi_tx_work()
6058 arvif->vdev_id, in ath11k_mgmt_over_wmi_tx_work()
6059 arvif->is_started); in ath11k_mgmt_over_wmi_tx_work()
6062 mutex_unlock(&ar->conf_mutex); in ath11k_mgmt_over_wmi_tx_work()
6069 struct sk_buff_head *q = &ar->wmi_mgmt_tx_queue; in ath11k_mac_mgmt_tx()
6071 if (test_bit(ATH11K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags)) in ath11k_mac_mgmt_tx()
6072 return -ESHUTDOWN; in ath11k_mac_mgmt_tx()
6080 atomic_read(&ar->num_pending_mgmt_tx) > ATH11K_PRB_RSP_DROP_THRESHOLD) { in ath11k_mac_mgmt_tx()
6081 ath11k_warn(ar->ab, in ath11k_mac_mgmt_tx()
6083 return -ENOSPC; in ath11k_mac_mgmt_tx()
6087 ath11k_warn(ar->ab, "mgmt tx queue is full\n"); in ath11k_mac_mgmt_tx()
6088 return -ENOSPC; in ath11k_mac_mgmt_tx()
6092 atomic_inc(&ar->num_pending_mgmt_tx); in ath11k_mac_mgmt_tx()
6093 queue_work(ar->ab->workqueue_aux, &ar->wmi_mgmt_tx_work); in ath11k_mac_mgmt_tx()
6103 struct ath11k *ar = hw->priv; in ath11k_mac_op_tx()
6105 struct ieee80211_vif *vif = info->control.vif; in ath11k_mac_op_tx()
6107 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; in ath11k_mac_op_tx()
6108 struct ieee80211_key_conf *key = info->control.hw_key; in ath11k_mac_op_tx()
6110 u32 info_flags = info->flags; in ath11k_mac_op_tx()
6115 skb_cb->vif = vif; in ath11k_mac_op_tx()
6118 skb_cb->cipher = key->cipher; in ath11k_mac_op_tx()
6119 skb_cb->flags |= ATH11K_SKB_CIPHER_SET; in ath11k_mac_op_tx()
6123 skb_cb->flags |= ATH11K_SKB_HW_80211_ENCAP; in ath11k_mac_op_tx()
6124 } else if (ieee80211_is_mgmt(hdr->frame_control)) { in ath11k_mac_op_tx()
6125 is_prb_rsp = ieee80211_is_probe_resp(hdr->frame_control); in ath11k_mac_op_tx()
6128 ath11k_warn(ar->ab, "failed to queue management frame %d\n", in ath11k_mac_op_tx()
6130 ieee80211_free_txskb(ar->hw, skb); in ath11k_mac_op_tx()
6135 if (control->sta) in ath11k_mac_op_tx()
6136 arsta = ath11k_sta_to_arsta(control->sta); in ath11k_mac_op_tx()
6140 ath11k_warn(ar->ab, "failed to transmit frame %d\n", ret); in ath11k_mac_op_tx()
6141 ieee80211_free_txskb(ar->hw, skb); in ath11k_mac_op_tx()
6147 /* make sure rcu-protected mac80211 tx path itself is drained */ in ath11k_mac_drain_tx()
6150 cancel_work_sync(&ar->wmi_mgmt_tx_work); in ath11k_mac_drain_tx()
6157 struct ath11k_base *ab = ar->ab; in ath11k_mac_config_mon_status_default()
6167 for (i = 0; i < ab->hw_params.num_rxdma_per_pdev; i++) { in ath11k_mac_config_mon_status_default()
6168 ring_id = ar->dp.rx_mon_status_refill_ring[i].refill_buf_ring.ring_id; in ath11k_mac_config_mon_status_default()
6169 ret = ath11k_dp_tx_htt_rx_filter_setup(ar->ab, ring_id, in ath11k_mac_config_mon_status_default()
6170 ar->dp.mac_id + i, in ath11k_mac_config_mon_status_default()
6176 if (enable && !ar->ab->hw_params.rxdma1_enable) in ath11k_mac_config_mon_status_default()
6177 mod_timer(&ar->ab->mon_reap_timer, jiffies + in ath11k_mac_config_mon_status_default()
6187 if (!ab->is_reset) in ath11k_mac_wait_reconfigure()
6190 recovery_start_count = atomic_inc_return(&ab->recovery_start_count); in ath11k_mac_wait_reconfigure()
6193 if (recovery_start_count == ab->num_radios) { in ath11k_mac_wait_reconfigure()
6194 complete(&ab->recovery_start); in ath11k_mac_wait_reconfigure()
6200 wait_for_completion_timeout(&ab->reconfigure_complete, in ath11k_mac_wait_reconfigure()
6206 struct ath11k *ar = hw->priv; in ath11k_mac_op_start()
6207 struct ath11k_base *ab = ar->ab; in ath11k_mac_op_start()
6208 struct ath11k_pdev *pdev = ar->pdev; in ath11k_mac_op_start()
6213 return -EOPNOTSUPP; in ath11k_mac_op_start()
6217 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_start()
6219 switch (ar->state) { in ath11k_mac_op_start()
6221 ar->state = ATH11K_STATE_ON; in ath11k_mac_op_start()
6224 ar->state = ATH11K_STATE_RESTARTED; in ath11k_mac_op_start()
6232 ret = -EINVAL; in ath11k_mac_op_start()
6237 1, pdev->pdev_id); in ath11k_mac_op_start()
6240 ath11k_err(ar->ab, "failed to enable PMF QOS: (%d\n", ret); in ath11k_mac_op_start()
6245 pdev->pdev_id); in ath11k_mac_op_start()
6247 ath11k_err(ar->ab, "failed to enable dynamic bw: %d\n", ret); in ath11k_mac_op_start()
6251 if (test_bit(WMI_TLV_SERVICE_SPOOF_MAC_SUPPORT, ar->wmi->wmi_ab->svc_map)) { in ath11k_mac_op_start()
6252 ret = ath11k_wmi_scan_prob_req_oui(ar, ar->mac_addr); in ath11k_mac_op_start()
6260 0, pdev->pdev_id); in ath11k_mac_op_start()
6267 ret = ath11k_wmi_send_dfs_phyerr_offload_enable_cmd(ar, pdev->pdev_id); in ath11k_mac_op_start()
6282 1, pdev->pdev_id); in ath11k_mac_op_start()
6285 ath11k_err(ar->ab, "failed to enable MESH MCAST ENABLE: (%d\n", ret); in ath11k_mac_op_start()
6289 __ath11k_set_antenna(ar, ar->cfg_tx_chainmask, ar->cfg_rx_chainmask); in ath11k_mac_op_start()
6295 ar->num_started_vdevs = 0; in ath11k_mac_op_start()
6296 ar->num_created_vdevs = 0; in ath11k_mac_op_start()
6297 ar->num_peers = 0; in ath11k_mac_op_start()
6298 ar->allocated_vdev_map = 0; in ath11k_mac_op_start()
6311 ath11k_wmi_pdev_lro_cfg(ar, ar->pdev->pdev_id); in ath11k_mac_op_start()
6314 if (ab->hw_params.idle_ps) { in ath11k_mac_op_start()
6316 1, pdev->pdev_id); in ath11k_mac_op_start()
6318 ath11k_err(ab, "failed to enable idle ps: %d\n", ret); in ath11k_mac_op_start()
6323 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_start()
6325 rcu_assign_pointer(ab->pdevs_active[ar->pdev_idx], in ath11k_mac_op_start()
6326 &ab->pdevs[ar->pdev_idx]); in ath11k_mac_op_start()
6331 ar->state = ATH11K_STATE_OFF; in ath11k_mac_op_start()
6332 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_start()
6339 struct ath11k *ar = hw->priv; in ath11k_mac_op_stop()
6346 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_stop()
6349 ath11k_err(ar->ab, "failed to clear rx_filter for monitor status ring: (%d)\n", in ath11k_mac_op_stop()
6352 clear_bit(ATH11K_CAC_RUNNING, &ar->dev_flags); in ath11k_mac_op_stop()
6353 ar->state = ATH11K_STATE_OFF; in ath11k_mac_op_stop()
6354 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_stop()
6356 cancel_delayed_work_sync(&ar->scan.timeout); in ath11k_mac_op_stop()
6357 cancel_work_sync(&ar->channel_update_work); in ath11k_mac_op_stop()
6358 cancel_work_sync(&ar->regd_update_work); in ath11k_mac_op_stop()
6359 cancel_work_sync(&ar->ab->update_11d_work); in ath11k_mac_op_stop()
6361 if (ar->state_11d == ATH11K_11D_PREPARING) { in ath11k_mac_op_stop()
6362 ar->state_11d = ATH11K_11D_IDLE; in ath11k_mac_op_stop()
6363 complete(&ar->completed_11d_scan); in ath11k_mac_op_stop()
6366 spin_lock_bh(&ar->data_lock); in ath11k_mac_op_stop()
6368 list_for_each_entry_safe(ppdu_stats, tmp, &ar->ppdu_stats_info, list) { in ath11k_mac_op_stop()
6369 list_del(&ppdu_stats->list); in ath11k_mac_op_stop()
6373 while ((params = list_first_entry_or_null(&ar->channel_update_queue, in ath11k_mac_op_stop()
6376 list_del(¶ms->list); in ath11k_mac_op_stop()
6380 spin_unlock_bh(&ar->data_lock); in ath11k_mac_op_stop()
6382 rcu_assign_pointer(ar->ab->pdevs_active[ar->pdev_idx], NULL); in ath11k_mac_op_stop()
6386 atomic_set(&ar->num_pending_mgmt_tx, 0); in ath11k_mac_op_stop()
6392 struct ath11k *ar = arvif->ar; in ath11k_mac_setup_vdev_params_mbssid()
6402 if (arvif->vif->bss_conf.nontransmitted) { in ath11k_mac_setup_vdev_params_mbssid()
6403 if (ar->hw->wiphy != tx_arvif->ar->hw->wiphy) in ath11k_mac_setup_vdev_params_mbssid()
6404 return -EINVAL; in ath11k_mac_setup_vdev_params_mbssid()
6407 *tx_vdev_id = tx_arvif->vdev_id; in ath11k_mac_setup_vdev_params_mbssid()
6411 return -EINVAL; in ath11k_mac_setup_vdev_params_mbssid()
6414 if (arvif->vif->bss_conf.ema_ap) in ath11k_mac_setup_vdev_params_mbssid()
6423 struct ath11k *ar = arvif->ar; in ath11k_mac_setup_vdev_create_params()
6424 struct ath11k_pdev *pdev = ar->pdev; in ath11k_mac_setup_vdev_create_params()
6427 params->if_id = arvif->vdev_id; in ath11k_mac_setup_vdev_create_params()
6428 params->type = arvif->vdev_type; in ath11k_mac_setup_vdev_create_params()
6429 params->subtype = arvif->vdev_subtype; in ath11k_mac_setup_vdev_create_params()
6430 params->pdev_id = pdev->pdev_id; in ath11k_mac_setup_vdev_create_params()
6431 params->mbssid_flags = 0; in ath11k_mac_setup_vdev_create_params()
6432 params->mbssid_tx_vdev_id = 0; in ath11k_mac_setup_vdev_create_params()
6435 ar->ab->wmi_ab.svc_map)) { in ath11k_mac_setup_vdev_create_params()
6437 ¶ms->mbssid_flags, in ath11k_mac_setup_vdev_create_params()
6438 ¶ms->mbssid_tx_vdev_id); in ath11k_mac_setup_vdev_create_params()
6443 if (pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) { in ath11k_mac_setup_vdev_create_params()
6444 params->chains[NL80211_BAND_2GHZ].tx = ar->num_tx_chains; in ath11k_mac_setup_vdev_create_params()
6445 params->chains[NL80211_BAND_2GHZ].rx = ar->num_rx_chains; in ath11k_mac_setup_vdev_create_params()
6447 if (pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) { in ath11k_mac_setup_vdev_create_params()
6448 params->chains[NL80211_BAND_5GHZ].tx = ar->num_tx_chains; in ath11k_mac_setup_vdev_create_params()
6449 params->chains[NL80211_BAND_5GHZ].rx = ar->num_rx_chains; in ath11k_mac_setup_vdev_create_params()
6451 if (pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP && in ath11k_mac_setup_vdev_create_params()
6452 ar->supports_6ghz) { in ath11k_mac_setup_vdev_create_params()
6453 params->chains[NL80211_BAND_6GHZ].tx = ar->num_tx_chains; in ath11k_mac_setup_vdev_create_params()
6454 params->chains[NL80211_BAND_6GHZ].rx = ar->num_rx_chains; in ath11k_mac_setup_vdev_create_params()
6462 struct ath11k *ar = hw->priv; in ath11k_mac_op_update_vif_offload()
6463 struct ath11k_base *ab = ar->ab; in ath11k_mac_op_update_vif_offload()
6470 (vif->type != NL80211_IFTYPE_STATION && in ath11k_mac_op_update_vif_offload()
6471 vif->type != NL80211_IFTYPE_AP)) in ath11k_mac_op_update_vif_offload()
6472 vif->offload_flags &= ~(IEEE80211_OFFLOAD_ENCAP_ENABLED | in ath11k_mac_op_update_vif_offload()
6475 if (vif->offload_flags & IEEE80211_OFFLOAD_ENCAP_ENABLED) in ath11k_mac_op_update_vif_offload()
6477 else if (test_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags)) in ath11k_mac_op_update_vif_offload()
6482 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_op_update_vif_offload()
6486 arvif->vdev_id, ret); in ath11k_mac_op_update_vif_offload()
6487 vif->offload_flags &= ~IEEE80211_OFFLOAD_ENCAP_ENABLED; in ath11k_mac_op_update_vif_offload()
6491 if (vif->offload_flags & IEEE80211_OFFLOAD_DECAP_ENABLED) in ath11k_mac_op_update_vif_offload()
6493 else if (test_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags)) in ath11k_mac_op_update_vif_offload()
6498 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_op_update_vif_offload()
6502 arvif->vdev_id, ret); in ath11k_mac_op_update_vif_offload()
6503 vif->offload_flags &= ~IEEE80211_OFFLOAD_DECAP_ENABLED; in ath11k_mac_op_update_vif_offload()
6514 for (i = 0; i < ab->num_radios; i++) { in ath11k_mac_vif_ap_active_any()
6515 pdev = &ab->pdevs[i]; in ath11k_mac_vif_ap_active_any()
6516 ar = pdev->ar; in ath11k_mac_vif_ap_active_any()
6517 list_for_each_entry(arvif, &ar->arvifs, list) { in ath11k_mac_vif_ap_active_any()
6518 if (arvif->is_up && arvif->vdev_type == WMI_VDEV_TYPE_AP) in ath11k_mac_vif_ap_active_any()
6530 mutex_lock(&ar->ab->vdev_id_11d_lock); in ath11k_mac_11d_scan_start()
6532 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev id for 11d scan %d\n", in ath11k_mac_11d_scan_start()
6533 ar->vdev_id_11d_scan); in ath11k_mac_11d_scan_start()
6535 if (ar->regdom_set_by_user) in ath11k_mac_11d_scan_start()
6538 if (ar->vdev_id_11d_scan != ATH11K_11D_INVALID_VDEV_ID) in ath11k_mac_11d_scan_start()
6541 if (!test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map)) in ath11k_mac_11d_scan_start()
6544 if (ath11k_mac_vif_ap_active_any(ar->ab)) in ath11k_mac_11d_scan_start()
6551 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "start 11d scan\n"); in ath11k_mac_11d_scan_start()
6555 ath11k_warn(ar->ab, "failed to start 11d scan vdev %d ret: %d\n", in ath11k_mac_11d_scan_start()
6558 ar->vdev_id_11d_scan = vdev_id; in ath11k_mac_11d_scan_start()
6559 if (ar->state_11d == ATH11K_11D_PREPARING) in ath11k_mac_11d_scan_start()
6560 ar->state_11d = ATH11K_11D_RUNNING; in ath11k_mac_11d_scan_start()
6564 if (ar->state_11d == ATH11K_11D_PREPARING) { in ath11k_mac_11d_scan_start()
6565 ar->state_11d = ATH11K_11D_IDLE; in ath11k_mac_11d_scan_start()
6566 complete(&ar->completed_11d_scan); in ath11k_mac_11d_scan_start()
6569 mutex_unlock(&ar->ab->vdev_id_11d_lock); in ath11k_mac_11d_scan_start()
6577 if (!test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map)) in ath11k_mac_11d_scan_stop()
6580 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "stop 11d scan\n"); in ath11k_mac_11d_scan_stop()
6582 mutex_lock(&ar->ab->vdev_id_11d_lock); in ath11k_mac_11d_scan_stop()
6584 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "stop 11d vdev id %d\n", in ath11k_mac_11d_scan_stop()
6585 ar->vdev_id_11d_scan); in ath11k_mac_11d_scan_stop()
6587 if (ar->state_11d == ATH11K_11D_PREPARING) { in ath11k_mac_11d_scan_stop()
6588 ar->state_11d = ATH11K_11D_IDLE; in ath11k_mac_11d_scan_stop()
6589 complete(&ar->completed_11d_scan); in ath11k_mac_11d_scan_stop()
6592 if (ar->vdev_id_11d_scan != ATH11K_11D_INVALID_VDEV_ID) { in ath11k_mac_11d_scan_stop()
6593 vdev_id = ar->vdev_id_11d_scan; in ath11k_mac_11d_scan_stop()
6597 ath11k_warn(ar->ab, in ath11k_mac_11d_scan_stop()
6601 ar->vdev_id_11d_scan = ATH11K_11D_INVALID_VDEV_ID; in ath11k_mac_11d_scan_stop()
6602 ar->state_11d = ATH11K_11D_IDLE; in ath11k_mac_11d_scan_stop()
6603 complete(&ar->completed_11d_scan); in ath11k_mac_11d_scan_stop()
6606 mutex_unlock(&ar->ab->vdev_id_11d_lock); in ath11k_mac_11d_scan_stop()
6617 for (i = 0; i < ab->num_radios; i++) { in ath11k_mac_11d_scan_stop_all()
6618 pdev = &ab->pdevs[i]; in ath11k_mac_11d_scan_stop_all()
6619 ar = pdev->ar; in ath11k_mac_11d_scan_stop_all()
6628 struct ieee80211_vif *vif = arvif->vif; in ath11k_mac_vdev_delete()
6631 lockdep_assert_held(&ar->conf_mutex); in ath11k_mac_vdev_delete()
6633 reinit_completion(&ar->vdev_delete_done); in ath11k_mac_vdev_delete()
6635 ret = ath11k_wmi_vdev_delete(ar, arvif->vdev_id); in ath11k_mac_vdev_delete()
6637 ath11k_warn(ar->ab, "failed to delete WMI vdev %d: %d\n", in ath11k_mac_vdev_delete()
6638 arvif->vdev_id, ret); in ath11k_mac_vdev_delete()
6642 time_left = wait_for_completion_timeout(&ar->vdev_delete_done, in ath11k_mac_vdev_delete()
6645 ath11k_warn(ar->ab, "Timeout in receiving vdev delete response\n"); in ath11k_mac_vdev_delete()
6646 return -ETIMEDOUT; in ath11k_mac_vdev_delete()
6649 ar->ab->free_vdev_map |= 1LL << (arvif->vdev_id); in ath11k_mac_vdev_delete()
6650 ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id); in ath11k_mac_vdev_delete()
6651 ar->num_created_vdevs--; in ath11k_mac_vdev_delete()
6653 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %pM deleted, vdev_id %d\n", in ath11k_mac_vdev_delete()
6654 vif->addr, arvif->vdev_id); in ath11k_mac_vdev_delete()
6664 mutex_lock(&arvif->ar->conf_mutex); in ath11k_mac_bcn_tx_work()
6666 mutex_unlock(&arvif->ar->conf_mutex); in ath11k_mac_bcn_tx_work()
6672 struct ath11k *ar = hw->priv; in ath11k_mac_op_add_interface()
6673 struct ath11k_base *ab = ar->ab; in ath11k_mac_op_add_interface()
6683 vif->driver_flags |= IEEE80211_VIF_SUPPORTS_UAPSD; in ath11k_mac_op_add_interface()
6685 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_add_interface()
6687 if (vif->type == NL80211_IFTYPE_AP && in ath11k_mac_op_add_interface()
6688 ar->num_peers > (ar->max_num_peers - 1)) { in ath11k_mac_op_add_interface()
6690 ret = -ENOBUFS; in ath11k_mac_op_add_interface()
6694 if (ar->num_created_vdevs > (TARGET_NUM_VDEVS(ab) - 1)) { in ath11k_mac_op_add_interface()
6696 ar->num_created_vdevs, TARGET_NUM_VDEVS(ab)); in ath11k_mac_op_add_interface()
6697 ret = -EBUSY; in ath11k_mac_op_add_interface()
6703 arvif->ar = ar; in ath11k_mac_op_add_interface()
6704 arvif->vif = vif; in ath11k_mac_op_add_interface()
6706 INIT_LIST_HEAD(&arvif->list); in ath11k_mac_op_add_interface()
6707 INIT_WORK(&arvif->bcn_tx_work, ath11k_mac_bcn_tx_work); in ath11k_mac_op_add_interface()
6708 INIT_DELAYED_WORK(&arvif->connection_loss_work, in ath11k_mac_op_add_interface()
6711 for (i = 0; i < ARRAY_SIZE(arvif->bitrate_mask.control); i++) { in ath11k_mac_op_add_interface()
6712 arvif->bitrate_mask.control[i].legacy = 0xffffffff; in ath11k_mac_op_add_interface()
6713 arvif->bitrate_mask.control[i].gi = NL80211_TXRATE_FORCE_SGI; in ath11k_mac_op_add_interface()
6714 memset(arvif->bitrate_mask.control[i].ht_mcs, 0xff, in ath11k_mac_op_add_interface()
6715 sizeof(arvif->bitrate_mask.control[i].ht_mcs)); in ath11k_mac_op_add_interface()
6716 memset(arvif->bitrate_mask.control[i].vht_mcs, 0xff, in ath11k_mac_op_add_interface()
6717 sizeof(arvif->bitrate_mask.control[i].vht_mcs)); in ath11k_mac_op_add_interface()
6718 memset(arvif->bitrate_mask.control[i].he_mcs, 0xff, in ath11k_mac_op_add_interface()
6719 sizeof(arvif->bitrate_mask.control[i].he_mcs)); in ath11k_mac_op_add_interface()
6722 bit = __ffs64(ab->free_vdev_map); in ath11k_mac_op_add_interface()
6724 arvif->vdev_id = bit; in ath11k_mac_op_add_interface()
6725 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE; in ath11k_mac_op_add_interface()
6727 switch (vif->type) { in ath11k_mac_op_add_interface()
6730 arvif->vdev_type = WMI_VDEV_TYPE_STA; in ath11k_mac_op_add_interface()
6731 if (vif->p2p) in ath11k_mac_op_add_interface()
6732 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_CLIENT; in ath11k_mac_op_add_interface()
6735 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_MESH_11S; in ath11k_mac_op_add_interface()
6738 arvif->vdev_type = WMI_VDEV_TYPE_AP; in ath11k_mac_op_add_interface()
6739 if (vif->p2p) in ath11k_mac_op_add_interface()
6740 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_GO; in ath11k_mac_op_add_interface()
6743 arvif->vdev_type = WMI_VDEV_TYPE_MONITOR; in ath11k_mac_op_add_interface()
6744 ar->monitor_vdev_id = bit; in ath11k_mac_op_add_interface()
6747 arvif->vdev_type = WMI_VDEV_TYPE_STA; in ath11k_mac_op_add_interface()
6748 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_DEVICE; in ath11k_mac_op_add_interface()
6756 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "add interface id %d type %d subtype %d map %llx\n", in ath11k_mac_op_add_interface()
6757 arvif->vdev_id, arvif->vdev_type, arvif->vdev_subtype, in ath11k_mac_op_add_interface()
6758 ab->free_vdev_map); in ath11k_mac_op_add_interface()
6760 vif->cab_queue = arvif->vdev_id % (ATH11K_HW_MAX_QUEUES - 1); in ath11k_mac_op_add_interface()
6761 for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++) in ath11k_mac_op_add_interface()
6762 vif->hw_queue[i] = i % (ATH11K_HW_MAX_QUEUES - 1); in ath11k_mac_op_add_interface()
6767 arvif->vdev_id, ret); in ath11k_mac_op_add_interface()
6771 ret = ath11k_wmi_vdev_create(ar, vif->addr, &vdev_param); in ath11k_mac_op_add_interface()
6774 arvif->vdev_id, ret); in ath11k_mac_op_add_interface()
6778 ar->num_created_vdevs++; in ath11k_mac_op_add_interface()
6780 vif->addr, arvif->vdev_id); in ath11k_mac_op_add_interface()
6781 ar->allocated_vdev_map |= 1LL << arvif->vdev_id; in ath11k_mac_op_add_interface()
6782 ab->free_vdev_map &= ~(1LL << arvif->vdev_id); in ath11k_mac_op_add_interface()
6784 spin_lock_bh(&ar->data_lock); in ath11k_mac_op_add_interface()
6785 list_add(&arvif->list, &ar->arvifs); in ath11k_mac_op_add_interface()
6786 spin_unlock_bh(&ar->data_lock); in ath11k_mac_op_add_interface()
6790 nss = get_num_chains(ar->cfg_tx_chainmask) ? : 1; in ath11k_mac_op_add_interface()
6791 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_op_add_interface()
6795 arvif->vdev_id, ar->cfg_tx_chainmask, nss, ret); in ath11k_mac_op_add_interface()
6799 switch (arvif->vdev_type) { in ath11k_mac_op_add_interface()
6801 peer_param.vdev_id = arvif->vdev_id; in ath11k_mac_op_add_interface()
6802 peer_param.peer_addr = vif->addr; in ath11k_mac_op_add_interface()
6807 arvif->vdev_id, ret); in ath11k_mac_op_add_interface()
6813 ath11k_warn(ar->ab, "failed to set vdev %i kickout parameters: %d\n", in ath11k_mac_op_add_interface()
6814 arvif->vdev_id, ret); in ath11k_mac_op_add_interface()
6818 ath11k_mac_11d_scan_stop_all(ar->ab); in ath11k_mac_op_add_interface()
6823 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath11k_mac_op_add_interface()
6826 ath11k_warn(ar->ab, "failed to set vdev %d RX wake policy: %d\n", in ath11k_mac_op_add_interface()
6827 arvif->vdev_id, ret); in ath11k_mac_op_add_interface()
6833 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath11k_mac_op_add_interface()
6836 ath11k_warn(ar->ab, "failed to set vdev %d TX wake threshold: %d\n", in ath11k_mac_op_add_interface()
6837 arvif->vdev_id, ret); in ath11k_mac_op_add_interface()
6843 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath11k_mac_op_add_interface()
6846 ath11k_warn(ar->ab, "failed to set vdev %d pspoll count: %d\n", in ath11k_mac_op_add_interface()
6847 arvif->vdev_id, ret); in ath11k_mac_op_add_interface()
6851 ret = ath11k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id, in ath11k_mac_op_add_interface()
6854 ath11k_warn(ar->ab, "failed to disable vdev %d ps mode: %d\n", in ath11k_mac_op_add_interface()
6855 arvif->vdev_id, ret); in ath11k_mac_op_add_interface()
6859 if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ab->wmi_ab.svc_map)) { in ath11k_mac_op_add_interface()
6860 reinit_completion(&ar->completed_11d_scan); in ath11k_mac_op_add_interface()
6861 ar->state_11d = ATH11K_11D_PREPARING; in ath11k_mac_op_add_interface()
6865 set_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags); in ath11k_mac_op_add_interface()
6871 arvif->txpower = vif->bss_conf.txpower; in ath11k_mac_op_add_interface()
6877 param_value = ar->hw->wiphy->rts_threshold; in ath11k_mac_op_add_interface()
6878 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_op_add_interface()
6881 ath11k_warn(ar->ab, "failed to set rts threshold for vdev %d: %d\n", in ath11k_mac_op_add_interface()
6882 arvif->vdev_id, ret); in ath11k_mac_op_add_interface()
6887 if (vif->type != NL80211_IFTYPE_MONITOR && in ath11k_mac_op_add_interface()
6888 test_bit(ATH11K_FLAG_MONITOR_CONF_ENABLED, &ar->monitor_flags)) { in ath11k_mac_op_add_interface()
6891 ath11k_warn(ar->ab, "failed to create monitor vdev during add interface: %d", in ath11k_mac_op_add_interface()
6898 reg_info = &ab->reg_info_store[ar->pdev_idx]; in ath11k_mac_op_add_interface()
6903 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_add_interface()
6908 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) { in ath11k_mac_op_add_interface()
6909 fbret = ath11k_peer_delete(ar, arvif->vdev_id, vif->addr); in ath11k_mac_op_add_interface()
6911 ath11k_warn(ar->ab, "fallback fail to delete peer addr %pM vdev_id %d ret %d\n", in ath11k_mac_op_add_interface()
6912 vif->addr, arvif->vdev_id, fbret); in ath11k_mac_op_add_interface()
6919 spin_lock_bh(&ar->data_lock); in ath11k_mac_op_add_interface()
6920 list_del(&arvif->list); in ath11k_mac_op_add_interface()
6921 spin_unlock_bh(&ar->data_lock); in ath11k_mac_op_add_interface()
6924 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_add_interface()
6934 if (skb_cb->vif == vif) in ath11k_mac_vif_unref()
6935 skb_cb->vif = NULL; in ath11k_mac_vif_unref()
6943 struct ath11k *ar = hw->priv; in ath11k_mac_op_remove_interface()
6945 struct ath11k_base *ab = ar->ab; in ath11k_mac_op_remove_interface()
6949 cancel_delayed_work_sync(&arvif->connection_loss_work); in ath11k_mac_op_remove_interface()
6950 cancel_work_sync(&arvif->bcn_tx_work); in ath11k_mac_op_remove_interface()
6952 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_remove_interface()
6955 arvif->vdev_id); in ath11k_mac_op_remove_interface()
6960 arvif->vdev_id, ret); in ath11k_mac_op_remove_interface()
6962 if (arvif->vdev_type == WMI_VDEV_TYPE_STA) in ath11k_mac_op_remove_interface()
6965 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) { in ath11k_mac_op_remove_interface()
6966 ret = ath11k_peer_delete(ar, arvif->vdev_id, vif->addr); in ath11k_mac_op_remove_interface()
6968 ath11k_warn(ab, "failed to submit AP self-peer removal on vdev %d: %d\n", in ath11k_mac_op_remove_interface()
6969 arvif->vdev_id, ret); in ath11k_mac_op_remove_interface()
6975 arvif->vdev_id, ret); in ath11k_mac_op_remove_interface()
6979 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { in ath11k_mac_op_remove_interface()
6980 clear_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags); in ath11k_mac_op_remove_interface()
6981 ar->monitor_vdev_id = -1; in ath11k_mac_op_remove_interface()
6982 } else if (test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags) && in ath11k_mac_op_remove_interface()
6983 !test_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags)) { in ath11k_mac_op_remove_interface()
6987 ath11k_warn(ar->ab, "failed to delete vdev monitor during remove interface: %d", in ath11k_mac_op_remove_interface()
6992 spin_lock_bh(&ar->data_lock); in ath11k_mac_op_remove_interface()
6993 list_del(&arvif->list); in ath11k_mac_op_remove_interface()
6994 spin_unlock_bh(&ar->data_lock); in ath11k_mac_op_remove_interface()
6996 ath11k_peer_cleanup(ar, arvif->vdev_id); in ath11k_mac_op_remove_interface()
6998 idr_for_each(&ar->txmgmt_idr, in ath11k_mac_op_remove_interface()
7001 for (i = 0; i < ab->hw_params.max_tx_ring; i++) { in ath11k_mac_op_remove_interface()
7002 spin_lock_bh(&ab->dp.tx_ring[i].tx_idr_lock); in ath11k_mac_op_remove_interface()
7003 idr_for_each(&ab->dp.tx_ring[i].txbuf_idr, in ath11k_mac_op_remove_interface()
7005 spin_unlock_bh(&ab->dp.tx_ring[i].tx_idr_lock); in ath11k_mac_op_remove_interface()
7013 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_remove_interface()
7031 struct ath11k *ar = hw->priv; in ath11k_mac_op_configure_filter()
7033 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_configure_filter()
7036 ar->filter_flags = *total_flags; in ath11k_mac_op_configure_filter()
7038 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_configure_filter()
7043 struct ath11k *ar = hw->priv; in ath11k_mac_op_get_antenna()
7045 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_get_antenna()
7047 *tx_ant = ar->cfg_tx_chainmask; in ath11k_mac_op_get_antenna()
7048 *rx_ant = ar->cfg_rx_chainmask; in ath11k_mac_op_get_antenna()
7050 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_get_antenna()
7057 struct ath11k *ar = hw->priv; in ath11k_mac_op_set_antenna()
7060 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_set_antenna()
7062 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_set_antenna()
7071 struct ath11k *ar = hw->priv; in ath11k_mac_op_ampdu_action()
7072 int ret = -EINVAL; in ath11k_mac_op_ampdu_action()
7074 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_ampdu_action()
7076 switch (params->action) { in ath11k_mac_op_ampdu_action()
7088 /* Tx A-MPDU aggregation offloaded to hw/fw so deny mac80211 in ath11k_mac_op_ampdu_action()
7091 ret = -EOPNOTSUPP; in ath11k_mac_op_ampdu_action()
7095 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_ampdu_action()
7103 struct ath11k *ar = hw->priv; in ath11k_mac_op_add_chanctx()
7104 struct ath11k_base *ab = ar->ab; in ath11k_mac_op_add_chanctx()
7108 ctx->def.chan->center_freq, ctx->def.width, ctx); in ath11k_mac_op_add_chanctx()
7110 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_add_chanctx()
7112 spin_lock_bh(&ar->data_lock); in ath11k_mac_op_add_chanctx()
7116 ar->rx_channel = ctx->def.chan; in ath11k_mac_op_add_chanctx()
7117 spin_unlock_bh(&ar->data_lock); in ath11k_mac_op_add_chanctx()
7119 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_add_chanctx()
7127 struct ath11k *ar = hw->priv; in ath11k_mac_op_remove_chanctx()
7128 struct ath11k_base *ab = ar->ab; in ath11k_mac_op_remove_chanctx()
7132 ctx->def.chan->center_freq, ctx->def.width, ctx); in ath11k_mac_op_remove_chanctx()
7134 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_remove_chanctx()
7136 spin_lock_bh(&ar->data_lock); in ath11k_mac_op_remove_chanctx()
7140 ar->rx_channel = NULL; in ath11k_mac_op_remove_chanctx()
7141 spin_unlock_bh(&ar->data_lock); in ath11k_mac_op_remove_chanctx()
7143 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_remove_chanctx()
7151 struct ath11k *ar = arvif->ar; in ath11k_mac_vdev_start_restart()
7152 struct ath11k_base *ab = ar->ab; in ath11k_mac_vdev_start_restart()
7154 const struct cfg80211_chan_def *chandef = &ctx->def; in ath11k_mac_vdev_start_restart()
7158 lockdep_assert_held(&ar->conf_mutex); in ath11k_mac_vdev_start_restart()
7160 reinit_completion(&ar->vdev_setup_done); in ath11k_mac_vdev_start_restart()
7162 arg.vdev_id = arvif->vdev_id; in ath11k_mac_vdev_start_restart()
7163 arg.dtim_period = arvif->dtim_period; in ath11k_mac_vdev_start_restart()
7164 arg.bcn_intval = arvif->beacon_interval; in ath11k_mac_vdev_start_restart()
7166 arg.channel.freq = chandef->chan->center_freq; in ath11k_mac_vdev_start_restart()
7167 arg.channel.band_center_freq1 = chandef->center_freq1; in ath11k_mac_vdev_start_restart()
7168 arg.channel.band_center_freq2 = chandef->center_freq2; in ath11k_mac_vdev_start_restart()
7170 ath11k_phymodes[chandef->chan->band][chandef->width]; in ath11k_mac_vdev_start_restart()
7173 arg.channel.max_power = chandef->chan->max_power; in ath11k_mac_vdev_start_restart()
7174 arg.channel.max_reg_power = chandef->chan->max_reg_power; in ath11k_mac_vdev_start_restart()
7175 arg.channel.max_antenna_gain = chandef->chan->max_antenna_gain; in ath11k_mac_vdev_start_restart()
7177 arg.pref_tx_streams = ar->num_tx_chains; in ath11k_mac_vdev_start_restart()
7178 arg.pref_rx_streams = ar->num_rx_chains; in ath11k_mac_vdev_start_restart()
7183 ar->ab->wmi_ab.svc_map)) { in ath11k_mac_vdev_start_restart()
7191 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) { in ath11k_mac_vdev_start_restart()
7192 arg.ssid = arvif->u.ap.ssid; in ath11k_mac_vdev_start_restart()
7193 arg.ssid_len = arvif->u.ap.ssid_len; in ath11k_mac_vdev_start_restart()
7194 arg.hidden_ssid = arvif->u.ap.hidden_ssid; in ath11k_mac_vdev_start_restart()
7198 !!(chandef->chan->flags & IEEE80211_CHAN_RADAR); in ath11k_mac_vdev_start_restart()
7200 arg.channel.freq2_radar = ctx->radar_enabled; in ath11k_mac_vdev_start_restart()
7204 spin_lock_bh(&ab->base_lock); in ath11k_mac_vdev_start_restart()
7205 arg.regdomain = ar->ab->dfs_region; in ath11k_mac_vdev_start_restart()
7206 spin_unlock_bh(&ab->base_lock); in ath11k_mac_vdev_start_restart()
7209 arg.channel.passive |= !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR); in ath11k_mac_vdev_start_restart()
7218 ath11k_warn(ar->ab, "failed to %s WMI vdev %i\n", in ath11k_mac_vdev_start_restart()
7234 ath11k_mac_fill_reg_tpc_info(ar, arvif->vif, &arvif->chanctx); in ath11k_mac_vdev_start_restart()
7235 ath11k_wmi_send_vdev_set_tpc_power(ar, arvif->vdev_id, in ath11k_mac_vdev_start_restart()
7236 &arvif->reg_tpc_info); in ath11k_mac_vdev_start_restart()
7240 ar->num_started_vdevs++; in ath11k_mac_vdev_start_restart()
7243 arvif->vif->addr, arvif->vdev_id); in ath11k_mac_vdev_start_restart()
7245 /* Enable CAC Flag in the driver by checking the all sub-channel's DFS in ath11k_mac_vdev_start_restart()
7251 if (arvif->vdev_type == WMI_VDEV_TYPE_AP && ctx->radar_enabled && in ath11k_mac_vdev_start_restart()
7252 cfg80211_chandef_dfs_usable(ar->hw->wiphy, chandef)) { in ath11k_mac_vdev_start_restart()
7253 set_bit(ATH11K_CAC_RUNNING, &ar->dev_flags); in ath11k_mac_vdev_start_restart()
7254 dfs_cac_time = cfg80211_chandef_dfs_cac_time(ar->hw->wiphy, in ath11k_mac_vdev_start_restart()
7258 dfs_cac_time, arg.channel.freq, chandef->center_freq1, in ath11k_mac_vdev_start_restart()
7265 arvif->vdev_id, ret); in ath11k_mac_vdev_start_restart()
7272 struct ath11k *ar = arvif->ar; in ath11k_mac_vdev_stop()
7275 lockdep_assert_held(&ar->conf_mutex); in ath11k_mac_vdev_stop()
7277 reinit_completion(&ar->vdev_setup_done); in ath11k_mac_vdev_stop()
7279 ret = ath11k_wmi_vdev_stop(ar, arvif->vdev_id); in ath11k_mac_vdev_stop()
7281 ath11k_warn(ar->ab, "failed to stop WMI vdev %i: %d\n", in ath11k_mac_vdev_stop()
7282 arvif->vdev_id, ret); in ath11k_mac_vdev_stop()
7288 ath11k_warn(ar->ab, "failed to synchronize setup for vdev %i: %d\n", in ath11k_mac_vdev_stop()
7289 arvif->vdev_id, ret); in ath11k_mac_vdev_stop()
7293 WARN_ON(ar->num_started_vdevs == 0); in ath11k_mac_vdev_stop()
7295 ar->num_started_vdevs--; in ath11k_mac_vdev_stop()
7296 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %pM stopped, vdev_id %d\n", in ath11k_mac_vdev_stop()
7297 arvif->vif->addr, arvif->vdev_id); in ath11k_mac_vdev_stop()
7299 if (test_bit(ATH11K_CAC_RUNNING, &ar->dev_flags)) { in ath11k_mac_vdev_stop()
7300 clear_bit(ATH11K_CAC_RUNNING, &ar->dev_flags); in ath11k_mac_vdev_stop()
7301 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "CAC Stopped for vdev %d\n", in ath11k_mac_vdev_stop()
7302 arvif->vdev_id); in ath11k_mac_vdev_stop()
7335 if (rcu_access_pointer(vif->bss_conf.chanctx_conf) != arg->ctx) in ath11k_mac_change_chanctx_cnt_iter()
7338 arg->n_vifs++; in ath11k_mac_change_chanctx_cnt_iter()
7348 ctx = rcu_access_pointer(vif->bss_conf.chanctx_conf); in ath11k_mac_change_chanctx_fill_iter()
7349 if (ctx != arg->ctx) in ath11k_mac_change_chanctx_fill_iter()
7352 if (WARN_ON(arg->next_vif == arg->n_vifs)) in ath11k_mac_change_chanctx_fill_iter()
7355 arg->vifs[arg->next_vif].vif = vif; in ath11k_mac_change_chanctx_fill_iter()
7356 arg->vifs[arg->next_vif].old_ctx = ctx; in ath11k_mac_change_chanctx_fill_iter()
7357 arg->vifs[arg->next_vif].new_ctx = ctx; in ath11k_mac_change_chanctx_fill_iter()
7358 arg->next_vif++; in ath11k_mac_change_chanctx_fill_iter()
7366 struct ath11k_base *ab = ar->ab; in ath11k_mac_update_vif_chan()
7372 lockdep_assert_held(&ar->conf_mutex); in ath11k_mac_update_vif_chan()
7378 /* TODO: Update ar->rx_channel */ in ath11k_mac_update_vif_chan()
7383 if (WARN_ON(!arvif->is_started)) in ath11k_mac_update_vif_chan()
7387 * ieee80211_start_ap->ieee80211_vif_use_channel-> in ath11k_mac_update_vif_chan()
7391 * If vdev is down then it expect vdev_stop->vdev_start. in ath11k_mac_update_vif_chan()
7393 if (arvif->is_up) { in ath11k_mac_update_vif_chan()
7397 arvif->vdev_id, ret); in ath11k_mac_update_vif_chan()
7404 arvif->vdev_id, ret); in ath11k_mac_update_vif_chan()
7411 arvif->vdev_id, ret); in ath11k_mac_update_vif_chan()
7422 ret = ath11k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid, in ath11k_mac_update_vif_chan()
7423 arvif->bssid, in ath11k_mac_update_vif_chan()
7424 tx_arvif ? tx_arvif->bssid : NULL, in ath11k_mac_update_vif_chan()
7425 arvif->vif->bss_conf.bssid_index, in ath11k_mac_update_vif_chan()
7426 1 << arvif->vif->bss_conf.bssid_indicator); in ath11k_mac_update_vif_chan()
7429 arvif->vdev_id, ret); in ath11k_mac_update_vif_chan()
7436 test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags)) { in ath11k_mac_update_vif_chan()
7439 ath11k_warn(ar->ab, "failed to stop monitor during vif channel update: %d", in ath11k_mac_update_vif_chan()
7446 ath11k_warn(ar->ab, "failed to start monitor during vif channel update: %d", in ath11k_mac_update_vif_chan()
7459 lockdep_assert_held(&ar->conf_mutex); in ath11k_mac_update_active_vif_chan()
7461 ieee80211_iterate_active_interfaces_atomic(ar->hw, in ath11k_mac_update_active_vif_chan()
7472 ieee80211_iterate_active_interfaces_atomic(ar->hw, in ath11k_mac_update_active_vif_chan()
7486 struct ath11k *ar = hw->priv; in ath11k_mac_op_change_chanctx()
7487 struct ath11k_base *ab = ar->ab; in ath11k_mac_op_change_chanctx()
7489 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_change_chanctx()
7493 ctx->def.chan->center_freq, ctx->def.width, ctx, changed); in ath11k_mac_op_change_chanctx()
7508 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_change_chanctx()
7514 struct ath11k *ar = hw->priv; in ath11k_mac_start_vdev_delay()
7515 struct ath11k_base *ab = ar->ab; in ath11k_mac_start_vdev_delay()
7519 if (WARN_ON(arvif->is_started)) in ath11k_mac_start_vdev_delay()
7520 return -EBUSY; in ath11k_mac_start_vdev_delay()
7522 ret = ath11k_mac_vdev_start(arvif, &arvif->chanctx); in ath11k_mac_start_vdev_delay()
7525 arvif->vdev_id, vif->addr, in ath11k_mac_start_vdev_delay()
7526 arvif->chanctx.def.chan->center_freq, ret); in ath11k_mac_start_vdev_delay()
7532 if (ar->hw_rate_code > 0) { in ath11k_mac_start_vdev_delay()
7535 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param, in ath11k_mac_start_vdev_delay()
7536 ar->hw_rate_code); in ath11k_mac_start_vdev_delay()
7538 ath11k_warn(ar->ab, "failed to set mgmt tx rate %d\n", ret); in ath11k_mac_start_vdev_delay()
7543 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { in ath11k_mac_start_vdev_delay()
7544 ret = ath11k_wmi_vdev_up(ar, arvif->vdev_id, 0, ar->mac_addr, in ath11k_mac_start_vdev_delay()
7552 arvif->is_started = true; in ath11k_mac_start_vdev_delay()
7561 struct ath11k *ar = hw->priv; in ath11k_mac_stop_vdev_early()
7562 struct ath11k_base *ab = ar->ab; in ath11k_mac_stop_vdev_early()
7566 if (WARN_ON(!arvif->is_started)) in ath11k_mac_stop_vdev_early()
7567 return -EBUSY; in ath11k_mac_stop_vdev_early()
7572 arvif->vdev_id, ret); in ath11k_mac_stop_vdev_early()
7576 arvif->is_started = false; in ath11k_mac_stop_vdev_early()
7584 if (chan_def->chan->flags & IEEE80211_CHAN_PSD) { in ath11k_mac_get_num_pwr_levels()
7585 switch (chan_def->width) { in ath11k_mac_get_num_pwr_levels()
7599 switch (chan_def->width) { in ath11k_mac_get_num_pwr_levels()
7622 * with center frequency 5955, its diff is 5965 - 5955 = 10. in ath11k_mac_get_6ghz_start_frequency()
7624 * with center frequency 5955, its diff is 5985 - 5955 = 30. in ath11k_mac_get_6ghz_start_frequency()
7626 * with center frequency 5955, its diff is 6025 - 5955 = 70. in ath11k_mac_get_6ghz_start_frequency()
7628 switch (chan_def->width) { in ath11k_mac_get_6ghz_start_frequency()
7643 return chan_def->center_freq1 - diff_seq; in ath11k_mac_get_6ghz_start_frequency()
7656 * center frequency is 5955 when bandwidth=20 MHz, its diff is 5955 - 5955 = 0. in ath11k_mac_get_seg_freq()
7658 * center frequency is 5965 when bandwidth=40 MHz, its diff is 5965 - 5955 = 10. in ath11k_mac_get_seg_freq()
7660 * center frequency is 5985 when bandwidth=80 MHz, its diff is 5985 - 5955 = 30. in ath11k_mac_get_seg_freq()
7662 * center frequency is 6025 when bandwidth=160 MHz, its diff is 6025 - 5955 = 70. in ath11k_mac_get_seg_freq()
7664 if (chan_def->width == NL80211_CHAN_WIDTH_80P80 && seq == 3) in ath11k_mac_get_seg_freq()
7665 return chan_def->center_freq2; in ath11k_mac_get_seg_freq()
7667 seg_seq = 10 * (BIT(seq) - 1); in ath11k_mac_get_seg_freq()
7691 *temp_chan = ieee80211_get_channel(ar->hw->wiphy, *center_freq); in ath11k_mac_get_psd_channel()
7692 *tx_power = (*temp_chan)->max_reg_power; in ath11k_mac_get_psd_channel()
7722 *temp_chan = ieee80211_get_channel(ar->hw->wiphy, *center_freq); in ath11k_mac_get_eirp_power()
7723 *tx_power = (*temp_chan)->max_reg_power; in ath11k_mac_get_eirp_power()
7730 struct ath11k_base *ab = ar->ab; in ath11k_mac_fill_reg_tpc_info()
7732 struct ieee80211_bss_conf *bss_conf = &vif->bss_conf; in ath11k_mac_fill_reg_tpc_info()
7733 struct ath11k_reg_tpc_power_info *reg_tpc_info = &arvif->reg_tpc_info; in ath11k_mac_fill_reg_tpc_info()
7742 chan = ctx->def.chan; in ath11k_mac_fill_reg_tpc_info()
7743 start_freq = ath11k_mac_get_6ghz_start_frequency(&ctx->def); in ath11k_mac_fill_reg_tpc_info()
7744 pwr_reduction = bss_conf->pwr_reduction; in ath11k_mac_fill_reg_tpc_info()
7746 if (arvif->reg_tpc_info.num_pwr_levels) { in ath11k_mac_fill_reg_tpc_info()
7748 num_pwr_levels = arvif->reg_tpc_info.num_pwr_levels; in ath11k_mac_fill_reg_tpc_info()
7751 ath11k_mac_get_num_pwr_levels(&bss_conf->chanreq.oper); in ath11k_mac_fill_reg_tpc_info()
7758 if (chan->flags & IEEE80211_CHAN_PSD) { in ath11k_mac_fill_reg_tpc_info()
7760 if (reg_tpc_info->is_psd_power) { in ath11k_mac_fill_reg_tpc_info()
7768 psd_power = temp_chan->psd; in ath11k_mac_fill_reg_tpc_info()
7773 reg_tpc_info->tpe[pwr_lvl_idx]); in ath11k_mac_fill_reg_tpc_info()
7781 &ctx->def, in ath11k_mac_fill_reg_tpc_info()
7783 psd_power = temp_chan->psd; in ath11k_mac_fill_reg_tpc_info()
7793 reg_tpc_info->tpe[pwr_lvl_idx]); in ath11k_mac_fill_reg_tpc_info()
7798 if (reg_tpc_info->is_psd_power) { in ath11k_mac_fill_reg_tpc_info()
7808 reg_tpc_info->tpe[pwr_lvl_idx]; in ath11k_mac_fill_reg_tpc_info()
7816 &ctx->def, in ath11k_mac_fill_reg_tpc_info()
7821 reg_tpc_info->tpe[pwr_lvl_idx]); in ath11k_mac_fill_reg_tpc_info()
7827 if (chan->flags & IEEE80211_CHAN_PSD) { in ath11k_mac_fill_reg_tpc_info()
7835 psd_power = temp_chan->psd; in ath11k_mac_fill_reg_tpc_info()
7844 &ctx->def, in ath11k_mac_fill_reg_tpc_info()
7853 eirp_power = eirp_power - pwr_reduction; in ath11k_mac_fill_reg_tpc_info()
7861 eirp_power, ar->max_allowed_tx_power); in ath11k_mac_fill_reg_tpc_info()
7865 * TPC command. So radio which does not support idle power in ath11k_mac_fill_reg_tpc_info()
7870 if (ar->max_allowed_tx_power && ab->hw_params.idle_ps) in ath11k_mac_fill_reg_tpc_info()
7873 ar->max_allowed_tx_power); in ath11k_mac_fill_reg_tpc_info()
7878 max_tx_power[pwr_lvl_idx] - pwr_reduction; in ath11k_mac_fill_reg_tpc_info()
7883 if (ar->max_allowed_tx_power && ab->hw_params.idle_ps) in ath11k_mac_fill_reg_tpc_info()
7887 ar->max_allowed_tx_power); in ath11k_mac_fill_reg_tpc_info()
7889 reg_tpc_info->chan_power_info[pwr_lvl_idx].chan_cfreq = center_freq; in ath11k_mac_fill_reg_tpc_info()
7890 reg_tpc_info->chan_power_info[pwr_lvl_idx].tx_power = in ath11k_mac_fill_reg_tpc_info()
7894 reg_tpc_info->num_pwr_levels = num_pwr_levels; in ath11k_mac_fill_reg_tpc_info()
7895 reg_tpc_info->is_psd_power = is_psd_power; in ath11k_mac_fill_reg_tpc_info()
7896 reg_tpc_info->eirp_power = eirp_power; in ath11k_mac_fill_reg_tpc_info()
7897 reg_tpc_info->ap_power_type = in ath11k_mac_fill_reg_tpc_info()
7898 ath11k_reg_ap_pwr_convert(vif->bss_conf.power_type); in ath11k_mac_fill_reg_tpc_info()
7905 struct ath11k_base *ab = ar->ab; in ath11k_mac_parse_tx_pwr_env()
7907 struct ieee80211_bss_conf *bss_conf = &vif->bss_conf; in ath11k_mac_parse_tx_pwr_env()
7916 reg_info = &ab->reg_info_store[ar->pdev_idx]; in ath11k_mac_parse_tx_pwr_env()
7917 client_type = reg_info->client_type; in ath11k_mac_parse_tx_pwr_env()
7920 bss_conf->tpe.max_local[client_type].valid + in ath11k_mac_parse_tx_pwr_env()
7921 bss_conf->tpe.psd_local[client_type].valid; in ath11k_mac_parse_tx_pwr_env()
7923 bss_conf->tpe.max_reg_client[client_type].valid + in ath11k_mac_parse_tx_pwr_env()
7924 bss_conf->tpe.psd_reg_client[client_type].valid; in ath11k_mac_parse_tx_pwr_env()
7938 psd = &bss_conf->tpe.psd_local[client_type]; in ath11k_mac_parse_tx_pwr_env()
7939 if (!psd->valid) in ath11k_mac_parse_tx_pwr_env()
7941 non_psd = &bss_conf->tpe.max_local[client_type]; in ath11k_mac_parse_tx_pwr_env()
7942 if (!non_psd->valid) in ath11k_mac_parse_tx_pwr_env()
7945 psd = &bss_conf->tpe.psd_reg_client[client_type]; in ath11k_mac_parse_tx_pwr_env()
7946 if (!psd->valid) in ath11k_mac_parse_tx_pwr_env()
7948 non_psd = &bss_conf->tpe.max_reg_client[client_type]; in ath11k_mac_parse_tx_pwr_env()
7949 if (!non_psd->valid) in ath11k_mac_parse_tx_pwr_env()
7954 arvif->reg_tpc_info.is_psd_power = false; in ath11k_mac_parse_tx_pwr_env()
7955 arvif->reg_tpc_info.eirp_power = 0; in ath11k_mac_parse_tx_pwr_env()
7957 arvif->reg_tpc_info.num_pwr_levels = non_psd->count; in ath11k_mac_parse_tx_pwr_env()
7959 for (i = 0; i < arvif->reg_tpc_info.num_pwr_levels; i++) { in ath11k_mac_parse_tx_pwr_env()
7962 i, non_psd->power[i]); in ath11k_mac_parse_tx_pwr_env()
7963 arvif->reg_tpc_info.tpe[i] = non_psd->power[i] / 2; in ath11k_mac_parse_tx_pwr_env()
7968 arvif->reg_tpc_info.is_psd_power = true; in ath11k_mac_parse_tx_pwr_env()
7969 arvif->reg_tpc_info.num_pwr_levels = psd->count; in ath11k_mac_parse_tx_pwr_env()
7971 for (i = 0; i < arvif->reg_tpc_info.num_pwr_levels; i++) { in ath11k_mac_parse_tx_pwr_env()
7974 i, psd->power[i]); in ath11k_mac_parse_tx_pwr_env()
7975 arvif->reg_tpc_info.tpe[i] = psd->power[i] / 2; in ath11k_mac_parse_tx_pwr_env()
7986 struct ath11k *ar = hw->priv; in ath11k_mac_op_assign_vif_chanctx()
7987 struct ath11k_base *ab = ar->ab; in ath11k_mac_op_assign_vif_chanctx()
7991 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_assign_vif_chanctx()
7995 ctx, arvif->vdev_id); in ath11k_mac_op_assign_vif_chanctx()
7998 ctx->def.chan->band == NL80211_BAND_6GHZ && in ath11k_mac_op_assign_vif_chanctx()
7999 arvif->vdev_type == WMI_VDEV_TYPE_STA) { in ath11k_mac_op_assign_vif_chanctx()
8000 arvif->chanctx = *ctx; in ath11k_mac_op_assign_vif_chanctx()
8005 if (ab->hw_params.vdev_start_delay && in ath11k_mac_op_assign_vif_chanctx()
8006 arvif->vdev_type != WMI_VDEV_TYPE_AP && in ath11k_mac_op_assign_vif_chanctx()
8007 arvif->vdev_type != WMI_VDEV_TYPE_MONITOR && in ath11k_mac_op_assign_vif_chanctx()
8008 !ath11k_peer_find_by_vdev_id(ab, arvif->vdev_id)) { in ath11k_mac_op_assign_vif_chanctx()
8009 memcpy(&arvif->chanctx, ctx, sizeof(*ctx)); in ath11k_mac_op_assign_vif_chanctx()
8014 if (WARN_ON(arvif->is_started)) { in ath11k_mac_op_assign_vif_chanctx()
8015 ret = -EBUSY; in ath11k_mac_op_assign_vif_chanctx()
8019 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { in ath11k_mac_op_assign_vif_chanctx()
8022 ath11k_warn(ar->ab, "failed to start monitor during vif channel context assignment: %d", in ath11k_mac_op_assign_vif_chanctx()
8027 arvif->is_started = true; in ath11k_mac_op_assign_vif_chanctx()
8031 if (!arvif->is_started) { in ath11k_mac_op_assign_vif_chanctx()
8035 arvif->vdev_id, vif->addr, in ath11k_mac_op_assign_vif_chanctx()
8036 ctx->def.chan->center_freq, ret); in ath11k_mac_op_assign_vif_chanctx()
8040 arvif->is_started = true; in ath11k_mac_op_assign_vif_chanctx()
8043 if (arvif->vdev_type != WMI_VDEV_TYPE_MONITOR && in ath11k_mac_op_assign_vif_chanctx()
8044 test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags)) { in ath11k_mac_op_assign_vif_chanctx()
8047 ath11k_warn(ar->ab, "failed to start monitor during vif channel context assignment: %d", in ath11k_mac_op_assign_vif_chanctx()
8058 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_assign_vif_chanctx()
8069 struct ath11k *ar = hw->priv; in ath11k_mac_op_unassign_vif_chanctx()
8070 struct ath11k_base *ab = ar->ab; in ath11k_mac_op_unassign_vif_chanctx()
8075 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_unassign_vif_chanctx()
8079 ctx, arvif->vdev_id); in ath11k_mac_op_unassign_vif_chanctx()
8081 if (ab->hw_params.vdev_start_delay && in ath11k_mac_op_unassign_vif_chanctx()
8082 arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { in ath11k_mac_op_unassign_vif_chanctx()
8083 spin_lock_bh(&ab->base_lock); in ath11k_mac_op_unassign_vif_chanctx()
8084 peer = ath11k_peer_find_by_addr(ab, ar->mac_addr); in ath11k_mac_op_unassign_vif_chanctx()
8085 spin_unlock_bh(&ab->base_lock); in ath11k_mac_op_unassign_vif_chanctx()
8087 ath11k_peer_delete(ar, arvif->vdev_id, ar->mac_addr); in ath11k_mac_op_unassign_vif_chanctx()
8090 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { in ath11k_mac_op_unassign_vif_chanctx()
8093 ath11k_warn(ar->ab, "failed to stop monitor during vif channel context unassignment: %d", in ath11k_mac_op_unassign_vif_chanctx()
8095 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_unassign_vif_chanctx()
8099 arvif->is_started = false; in ath11k_mac_op_unassign_vif_chanctx()
8100 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_unassign_vif_chanctx()
8104 if (arvif->is_started) { in ath11k_mac_op_unassign_vif_chanctx()
8108 arvif->vdev_id, ret); in ath11k_mac_op_unassign_vif_chanctx()
8110 arvif->is_started = false; in ath11k_mac_op_unassign_vif_chanctx()
8113 if (ab->hw_params.vdev_start_delay && in ath11k_mac_op_unassign_vif_chanctx()
8114 arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) in ath11k_mac_op_unassign_vif_chanctx()
8115 ath11k_wmi_vdev_down(ar, arvif->vdev_id); in ath11k_mac_op_unassign_vif_chanctx()
8117 if (arvif->vdev_type != WMI_VDEV_TYPE_MONITOR && in ath11k_mac_op_unassign_vif_chanctx()
8118 ar->num_started_vdevs == 1 && in ath11k_mac_op_unassign_vif_chanctx()
8119 test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags)) { in ath11k_mac_op_unassign_vif_chanctx()
8123 ath11k_warn(ar->ab, "failed to stop monitor during vif channel context unassignment: %d", in ath11k_mac_op_unassign_vif_chanctx()
8127 if (arvif->vdev_type == WMI_VDEV_TYPE_STA) in ath11k_mac_op_unassign_vif_chanctx()
8128 ath11k_mac_11d_scan_start(ar, arvif->vdev_id); in ath11k_mac_op_unassign_vif_chanctx()
8130 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_unassign_vif_chanctx()
8139 struct ath11k *ar = hw->priv; in ath11k_mac_op_switch_vif_chanctx()
8141 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_switch_vif_chanctx()
8143 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, in ath11k_mac_op_switch_vif_chanctx()
8148 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_switch_vif_chanctx()
8159 mutex_lock(&ar->conf_mutex); in ath11k_set_vdev_param_to_all_vifs()
8160 list_for_each_entry(arvif, &ar->arvifs, list) { in ath11k_set_vdev_param_to_all_vifs()
8161 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "setting mac vdev %d param %d value %d\n", in ath11k_set_vdev_param_to_all_vifs()
8162 param, arvif->vdev_id, value); in ath11k_set_vdev_param_to_all_vifs()
8164 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_set_vdev_param_to_all_vifs()
8167 ath11k_warn(ar->ab, "failed to set param %d for vdev %d: %d\n", in ath11k_set_vdev_param_to_all_vifs()
8168 param, arvif->vdev_id, ret); in ath11k_set_vdev_param_to_all_vifs()
8172 mutex_unlock(&ar->conf_mutex); in ath11k_set_vdev_param_to_all_vifs()
8181 struct ath11k *ar = hw->priv; in ath11k_mac_op_set_rts_threshold()
8199 return -EOPNOTSUPP; in ath11k_mac_op_set_frag_threshold()
8207 time_left = wait_event_timeout(ar->dp.tx_empty_waitq, in ath11k_mac_flush_tx_complete()
8208 (atomic_read(&ar->dp.num_tx_pending) == 0), in ath11k_mac_flush_tx_complete()
8211 ath11k_warn(ar->ab, "failed to flush transmit queue, data pkts pending %d\n", in ath11k_mac_flush_tx_complete()
8212 atomic_read(&ar->dp.num_tx_pending)); in ath11k_mac_flush_tx_complete()
8213 ret = -ETIMEDOUT; in ath11k_mac_flush_tx_complete()
8216 time_left = wait_event_timeout(ar->txmgmt_empty_waitq, in ath11k_mac_flush_tx_complete()
8217 (atomic_read(&ar->num_pending_mgmt_tx) == 0), in ath11k_mac_flush_tx_complete()
8220 ath11k_warn(ar->ab, "failed to flush mgmt transmit queue, mgmt pkts pending %d\n", in ath11k_mac_flush_tx_complete()
8221 atomic_read(&ar->num_pending_mgmt_tx)); in ath11k_mac_flush_tx_complete()
8222 ret = -ETIMEDOUT; in ath11k_mac_flush_tx_complete()
8237 struct ath11k *ar = hw->priv; in ath11k_mac_op_flush()
8252 num_rates = hweight32(mask->control[band].legacy); in ath11k_mac_has_single_legacy_rate()
8269 if (he_cap->he_cap_elem.phy_cap_info[0] & in ath11k_mac_get_tx_mcs_map()
8271 return he_cap->he_mcs_nss_supp.tx_mcs_80p80; in ath11k_mac_get_tx_mcs_map()
8273 if (he_cap->he_cap_elem.phy_cap_info[0] & in ath11k_mac_get_tx_mcs_map()
8275 return he_cap->he_mcs_nss_supp.tx_mcs_160; in ath11k_mac_get_tx_mcs_map()
8277 return he_cap->he_mcs_nss_supp.tx_mcs_80; in ath11k_mac_get_tx_mcs_map()
8287 struct ieee80211_supported_band *sband = &ar->mac.sbands[band]; in ath11k_mac_bitrate_mask_get_single_nss()
8288 u16 vht_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map); in ath11k_mac_bitrate_mask_get_single_nss()
8300 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) { in ath11k_mac_bitrate_mask_get_single_nss()
8301 if (mask->control[band].ht_mcs[i] == 0) in ath11k_mac_bitrate_mask_get_single_nss()
8303 else if (mask->control[band].ht_mcs[i] == in ath11k_mac_bitrate_mask_get_single_nss()
8304 sband->ht_cap.mcs.rx_mask[i]) in ath11k_mac_bitrate_mask_get_single_nss()
8310 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) { in ath11k_mac_bitrate_mask_get_single_nss()
8311 if (mask->control[band].vht_mcs[i] == 0) in ath11k_mac_bitrate_mask_get_single_nss()
8313 else if (mask->control[band].vht_mcs[i] == in ath11k_mac_bitrate_mask_get_single_nss()
8320 he_cap = ieee80211_get_he_iftype_cap_vif(sband, arvif->vif); in ath11k_mac_bitrate_mask_get_single_nss()
8326 for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) { in ath11k_mac_bitrate_mask_get_single_nss()
8327 if (mask->control[band].he_mcs[i] == 0) in ath11k_mac_bitrate_mask_get_single_nss()
8330 if (mask->control[band].he_mcs[i] == in ath11k_mac_bitrate_mask_get_single_nss()
8343 if (BIT(fls(ht_nss_mask)) - 1 != ht_nss_mask) in ath11k_mac_bitrate_mask_get_single_nss()
8362 if (hweight32(mask->control[band].legacy) != 1) in ath11k_mac_get_single_legacy_rate()
8363 return -EINVAL; in ath11k_mac_get_single_legacy_rate()
8365 rate_idx = ffs(mask->control[band].legacy) - 1; in ath11k_mac_get_single_legacy_rate()
8387 struct ath11k *ar = arvif->ar; in ath11k_mac_set_fixed_rate_gi_ltf()
8394 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_set_fixed_rate_gi_ltf()
8397 ath11k_warn(ar->ab, "failed to set he gi %d: %d\n", in ath11k_mac_set_fixed_rate_gi_ltf()
8405 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_set_fixed_rate_gi_ltf()
8408 ath11k_warn(ar->ab, "failed to set he ltf %d: %d\n", in ath11k_mac_set_fixed_rate_gi_ltf()
8419 struct ath11k *ar = arvif->ar; in ath11k_mac_set_auto_rate_gi_ltf()
8435 ath11k_warn(ar->ab, "invalid he gi: %d\n", he_gi); in ath11k_mac_set_auto_rate_gi_ltf()
8436 return -EINVAL; in ath11k_mac_set_auto_rate_gi_ltf()
8452 ath11k_warn(ar->ab, "invalid he ltf: %d\n", he_ltf); in ath11k_mac_set_auto_rate_gi_ltf()
8453 return -EINVAL; in ath11k_mac_set_auto_rate_gi_ltf()
8458 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_set_auto_rate_gi_ltf()
8462 ath11k_warn(ar->ab, in ath11k_mac_set_auto_rate_gi_ltf()
8475 struct ath11k *ar = arvif->ar; in ath11k_mac_set_rate_params()
8479 lockdep_assert_held(&ar->conf_mutex); in ath11k_mac_set_rate_params()
8481 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, in ath11k_mac_set_rate_params()
8483 arvif->vdev_id, rate, nss, sgi, ldpc, he_gi, in ath11k_mac_set_rate_params()
8486 if (!arvif->vif->bss_conf.he_support) { in ath11k_mac_set_rate_params()
8488 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_set_rate_params()
8491 ath11k_warn(ar->ab, "failed to set fixed rate param 0x%02x: %d\n", in ath11k_mac_set_rate_params()
8498 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_set_rate_params()
8501 ath11k_warn(ar->ab, "failed to set nss param %d: %d\n", in ath11k_mac_set_rate_params()
8507 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_set_rate_params()
8510 ath11k_warn(ar->ab, "failed to set ldpc param %d: %d\n", in ath11k_mac_set_rate_params()
8515 if (arvif->vif->bss_conf.he_support) { in ath11k_mac_set_rate_params()
8520 ath11k_warn(ar->ab, "failed to set fixed rate gi ltf: %d\n", in ath11k_mac_set_rate_params()
8528 ath11k_warn(ar->ab, "failed to set auto rate gi ltf: %d\n", in ath11k_mac_set_rate_params()
8535 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_set_rate_params()
8538 ath11k_warn(ar->ab, "failed to set sgi param %d: %d\n", in ath11k_mac_set_rate_params()
8556 vht_mcs = mask->control[band].vht_mcs[i]; in ath11k_mac_vht_mcs_range_present()
8560 case BIT(8) - 1: in ath11k_mac_vht_mcs_range_present()
8561 case BIT(9) - 1: in ath11k_mac_vht_mcs_range_present()
8562 case BIT(10) - 1: in ath11k_mac_vht_mcs_range_present()
8581 he_mcs = mask->control[band].he_mcs[i]; in ath11k_mac_he_mcs_range_present()
8585 case BIT(8) - 1: in ath11k_mac_he_mcs_range_present()
8586 case BIT(10) - 1: in ath11k_mac_he_mcs_range_present()
8587 case BIT(12) - 1: in ath11k_mac_he_mcs_range_present()
8602 struct ath11k *ar = arvif->ar; in ath11k_mac_set_bitrate_mask_iter()
8604 spin_lock_bh(&ar->data_lock); in ath11k_mac_set_bitrate_mask_iter()
8605 arsta->changed |= IEEE80211_RC_SUPP_RATES_CHANGED; in ath11k_mac_set_bitrate_mask_iter()
8606 spin_unlock_bh(&ar->data_lock); in ath11k_mac_set_bitrate_mask_iter()
8608 ieee80211_queue_work(ar->hw, &arsta->update_wk); in ath11k_mac_set_bitrate_mask_iter()
8615 struct ath11k *ar = arvif->ar; in ath11k_mac_disable_peer_fixed_rate()
8618 ret = ath11k_wmi_set_peer_param(ar, sta->addr, in ath11k_mac_disable_peer_fixed_rate()
8619 arvif->vdev_id, in ath11k_mac_disable_peer_fixed_rate()
8623 ath11k_warn(ar->ab, in ath11k_mac_disable_peer_fixed_rate()
8625 sta->addr, ret); in ath11k_mac_disable_peer_fixed_rate()
8639 vht_mcs_mask = mask->control[band].vht_mcs; in ath11k_mac_validate_vht_he_fixed_rate_settings()
8640 he_mcs_mask = mask->control[band].he_mcs; in ath11k_mac_validate_vht_he_fixed_rate_settings()
8655 spin_lock_bh(&ar->ab->base_lock); in ath11k_mac_validate_vht_he_fixed_rate_settings()
8656 list_for_each_entry(peer, &ar->ab->peers, list) { in ath11k_mac_validate_vht_he_fixed_rate_settings()
8657 if (peer->sta) { in ath11k_mac_validate_vht_he_fixed_rate_settings()
8658 deflink = &peer->sta->deflink; in ath11k_mac_validate_vht_he_fixed_rate_settings()
8660 if (vht_fixed_rate && (!deflink->vht_cap.vht_supported || in ath11k_mac_validate_vht_he_fixed_rate_settings()
8661 deflink->rx_nss < vht_nss)) { in ath11k_mac_validate_vht_he_fixed_rate_settings()
8666 if (he_fixed_rate && (!deflink->he_cap.has_he || in ath11k_mac_validate_vht_he_fixed_rate_settings()
8667 deflink->rx_nss < he_nss)) { in ath11k_mac_validate_vht_he_fixed_rate_settings()
8675 spin_unlock_bh(&ar->ab->base_lock); in ath11k_mac_validate_vht_he_fixed_rate_settings()
8688 struct ath11k *ar = arvif->ar; in ath11k_mac_op_set_bitrate_mask()
8705 return -EPERM; in ath11k_mac_op_set_bitrate_mask()
8707 band = def.chan->band; in ath11k_mac_op_set_bitrate_mask()
8708 cap = &ar->pdev->cap; in ath11k_mac_op_set_bitrate_mask()
8709 ht_mcs_mask = mask->control[band].ht_mcs; in ath11k_mac_op_set_bitrate_mask()
8710 vht_mcs_mask = mask->control[band].vht_mcs; in ath11k_mac_op_set_bitrate_mask()
8711 he_mcs_mask = mask->control[band].he_mcs; in ath11k_mac_op_set_bitrate_mask()
8712 ldpc = !!(cap->band[band].ht_cap_info & WMI_HT_CAP_TX_LDPC); in ath11k_mac_op_set_bitrate_mask()
8714 sgi = mask->control[band].gi; in ath11k_mac_op_set_bitrate_mask()
8716 return -EINVAL; in ath11k_mac_op_set_bitrate_mask()
8718 he_gi = mask->control[band].he_gi; in ath11k_mac_op_set_bitrate_mask()
8719 he_ltf = mask->control[band].he_ltf; in ath11k_mac_op_set_bitrate_mask()
8733 ath11k_warn(ar->ab, "failed to get single legacy rate for vdev %i: %d\n", in ath11k_mac_op_set_bitrate_mask()
8734 arvif->vdev_id, ret); in ath11k_mac_op_set_bitrate_mask()
8737 ieee80211_iterate_stations_atomic(ar->hw, in ath11k_mac_op_set_bitrate_mask()
8744 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_set_bitrate_mask()
8745 arvif->bitrate_mask = *mask; in ath11k_mac_op_set_bitrate_mask()
8746 ieee80211_iterate_stations_atomic(ar->hw, in ath11k_mac_op_set_bitrate_mask()
8749 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_set_bitrate_mask()
8754 ath11k_warn(ar->ab, in ath11k_mac_op_set_bitrate_mask()
8756 nss = min_t(u32, ar->num_tx_chains, in ath11k_mac_op_set_bitrate_mask()
8762 * - Single VHT Rate : peer_assoc command accommodates only MCS in ath11k_mac_op_set_bitrate_mask()
8763 * range values i.e 0-7, 0-8, 0-9 for VHT. Though mac80211 in ath11k_mac_op_set_bitrate_mask()
8771 * - Multiple VHT Rates : When Multiple VHT rates are given,this in ath11k_mac_op_set_bitrate_mask()
8772 * can be set using RATEMASK CMD which uses FW rate-ctl alg. in ath11k_mac_op_set_bitrate_mask()
8787 ath11k_warn(ar->ab, in ath11k_mac_op_set_bitrate_mask()
8790 return -EINVAL; in ath11k_mac_op_set_bitrate_mask()
8800 ath11k_warn(ar->ab, in ath11k_mac_op_set_bitrate_mask()
8802 return -EINVAL; in ath11k_mac_op_set_bitrate_mask()
8805 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_set_bitrate_mask()
8806 ieee80211_iterate_stations_atomic(ar->hw, in ath11k_mac_op_set_bitrate_mask()
8810 arvif->bitrate_mask = *mask; in ath11k_mac_op_set_bitrate_mask()
8811 ieee80211_iterate_stations_atomic(ar->hw, in ath11k_mac_op_set_bitrate_mask()
8815 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_set_bitrate_mask()
8818 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_set_bitrate_mask()
8823 ath11k_warn(ar->ab, "failed to set rate params on vdev %i: %d\n", in ath11k_mac_op_set_bitrate_mask()
8824 arvif->vdev_id, ret); in ath11k_mac_op_set_bitrate_mask()
8827 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_set_bitrate_mask()
8836 struct ath11k *ar = hw->priv; in ath11k_mac_op_reconfig_complete()
8837 struct ath11k_base *ab = ar->ab; in ath11k_mac_op_reconfig_complete()
8844 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_reconfig_complete()
8846 if (ar->state == ATH11K_STATE_RESTARTED) { in ath11k_mac_op_reconfig_complete()
8847 ath11k_warn(ar->ab, "pdev %d successfully recovered\n", in ath11k_mac_op_reconfig_complete()
8848 ar->pdev->pdev_id); in ath11k_mac_op_reconfig_complete()
8849 ar->state = ATH11K_STATE_ON; in ath11k_mac_op_reconfig_complete()
8850 ieee80211_wake_queues(ar->hw); in ath11k_mac_op_reconfig_complete()
8852 if (ar->ab->hw_params.current_cc_support && in ath11k_mac_op_reconfig_complete()
8853 ar->alpha2[0] != 0 && ar->alpha2[1] != 0) in ath11k_mac_op_reconfig_complete()
8856 if (ab->is_reset) { in ath11k_mac_op_reconfig_complete()
8857 recovery_count = atomic_inc_return(&ab->recovery_count); in ath11k_mac_op_reconfig_complete()
8863 if (recovery_count == ab->num_radios) { in ath11k_mac_op_reconfig_complete()
8864 atomic_dec(&ab->reset_count); in ath11k_mac_op_reconfig_complete()
8865 complete(&ab->reset_complete); in ath11k_mac_op_reconfig_complete()
8866 ab->is_reset = false; in ath11k_mac_op_reconfig_complete()
8867 atomic_set(&ab->fail_cont_count, 0); in ath11k_mac_op_reconfig_complete()
8871 if (ar->ab->hw_params.support_fw_mac_sequence) { in ath11k_mac_op_reconfig_complete()
8872 list_for_each_entry(arvif, &ar->arvifs, list) { in ath11k_mac_op_reconfig_complete()
8873 if (arvif->is_up && arvif->vdev_type == WMI_VDEV_TYPE_STA) in ath11k_mac_op_reconfig_complete()
8874 ieee80211_hw_restart_disconnect(arvif->vif); in ath11k_mac_op_reconfig_complete()
8879 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_reconfig_complete()
8889 lockdep_assert_held(&ar->conf_mutex); in ath11k_mac_update_bss_chan_survey()
8891 if (!test_bit(WMI_TLV_SERVICE_BSS_CHANNEL_INFO_64, ar->ab->wmi_ab.svc_map) || in ath11k_mac_update_bss_chan_survey()
8892 ar->rx_channel != channel) in ath11k_mac_update_bss_chan_survey()
8895 if (ar->scan.state != ATH11K_SCAN_IDLE) { in ath11k_mac_update_bss_chan_survey()
8896 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, in ath11k_mac_update_bss_chan_survey()
8901 reinit_completion(&ar->bss_survey_done); in ath11k_mac_update_bss_chan_survey()
8905 ath11k_warn(ar->ab, "failed to send pdev bss chan info request\n"); in ath11k_mac_update_bss_chan_survey()
8909 ret = wait_for_completion_timeout(&ar->bss_survey_done, 3 * HZ); in ath11k_mac_update_bss_chan_survey()
8911 ath11k_warn(ar->ab, "bss channel survey timed out\n"); in ath11k_mac_update_bss_chan_survey()
8917 struct ath11k *ar = hw->priv; in ath11k_mac_op_get_survey()
8923 return -ENOENT; in ath11k_mac_op_get_survey()
8925 ar_survey = &ar->survey[idx]; in ath11k_mac_op_get_survey()
8927 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_get_survey()
8929 sband = hw->wiphy->bands[NL80211_BAND_2GHZ]; in ath11k_mac_op_get_survey()
8930 if (sband && idx >= sband->n_channels) { in ath11k_mac_op_get_survey()
8931 idx -= sband->n_channels; in ath11k_mac_op_get_survey()
8936 sband = hw->wiphy->bands[NL80211_BAND_5GHZ]; in ath11k_mac_op_get_survey()
8937 if (sband && idx >= sband->n_channels) { in ath11k_mac_op_get_survey()
8938 idx -= sband->n_channels; in ath11k_mac_op_get_survey()
8943 sband = hw->wiphy->bands[NL80211_BAND_6GHZ]; in ath11k_mac_op_get_survey()
8944 if (!sband || idx >= sband->n_channels) { in ath11k_mac_op_get_survey()
8945 ret = -ENOENT; in ath11k_mac_op_get_survey()
8949 ath11k_mac_update_bss_chan_survey(ar, &sband->channels[idx]); in ath11k_mac_op_get_survey()
8951 spin_lock_bh(&ar->data_lock); in ath11k_mac_op_get_survey()
8953 spin_unlock_bh(&ar->data_lock); in ath11k_mac_op_get_survey()
8955 survey->channel = &sband->channels[idx]; in ath11k_mac_op_get_survey()
8957 if (ar->rx_channel == survey->channel) in ath11k_mac_op_get_survey()
8958 survey->filled |= SURVEY_INFO_IN_USE; in ath11k_mac_op_get_survey()
8961 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_get_survey()
8970 struct ath11k *ar = arsta->arvif->ar; in ath11k_mac_put_chain_rssi()
8974 for (i = 0; i < ARRAY_SIZE(sinfo->chain_signal); i++) { in ath11k_mac_put_chain_rssi()
8975 sinfo->chains &= ~BIT(i); in ath11k_mac_put_chain_rssi()
8976 rssi = arsta->chain_signal[i]; in ath11k_mac_put_chain_rssi()
8978 arsta->chain_signal[i] = ATH11K_INVALID_RSSI_FULL; in ath11k_mac_put_chain_rssi()
8980 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, in ath11k_mac_put_chain_rssi()
8987 sinfo->chain_signal[i] = rssi; in ath11k_mac_put_chain_rssi()
8988 sinfo->chains |= BIT(i); in ath11k_mac_put_chain_rssi()
8989 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL); in ath11k_mac_put_chain_rssi()
9000 struct ath11k *ar = arsta->arvif->ar; in ath11k_mac_op_sta_statistics()
9003 ar->ab->wmi_ab.svc_map); in ath11k_mac_op_sta_statistics()
9005 sinfo->rx_duration = arsta->rx_duration; in ath11k_mac_op_sta_statistics()
9006 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_DURATION); in ath11k_mac_op_sta_statistics()
9008 sinfo->tx_duration = arsta->tx_duration; in ath11k_mac_op_sta_statistics()
9009 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_DURATION); in ath11k_mac_op_sta_statistics()
9011 if (arsta->txrate.legacy || arsta->txrate.nss) { in ath11k_mac_op_sta_statistics()
9012 if (arsta->txrate.legacy) { in ath11k_mac_op_sta_statistics()
9013 sinfo->txrate.legacy = arsta->txrate.legacy; in ath11k_mac_op_sta_statistics()
9015 sinfo->txrate.mcs = arsta->txrate.mcs; in ath11k_mac_op_sta_statistics()
9016 sinfo->txrate.nss = arsta->txrate.nss; in ath11k_mac_op_sta_statistics()
9017 sinfo->txrate.bw = arsta->txrate.bw; in ath11k_mac_op_sta_statistics()
9018 sinfo->txrate.he_gi = arsta->txrate.he_gi; in ath11k_mac_op_sta_statistics()
9019 sinfo->txrate.he_dcm = arsta->txrate.he_dcm; in ath11k_mac_op_sta_statistics()
9020 sinfo->txrate.he_ru_alloc = arsta->txrate.he_ru_alloc; in ath11k_mac_op_sta_statistics()
9022 sinfo->txrate.flags = arsta->txrate.flags; in ath11k_mac_op_sta_statistics()
9023 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE); in ath11k_mac_op_sta_statistics()
9028 if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL)) && in ath11k_mac_op_sta_statistics()
9029 arsta->arvif->vdev_type == WMI_VDEV_TYPE_STA && in ath11k_mac_op_sta_statistics()
9030 ar->ab->hw_params.supports_rssi_stats && in ath11k_mac_op_sta_statistics()
9031 !ath11k_debugfs_get_fw_stats(ar, ar->pdev->pdev_id, 0, in ath11k_mac_op_sta_statistics()
9036 signal = arsta->rssi_comb; in ath11k_mac_op_sta_statistics()
9038 arsta->arvif->vdev_type == WMI_VDEV_TYPE_STA && in ath11k_mac_op_sta_statistics()
9039 ar->ab->hw_params.supports_rssi_stats && in ath11k_mac_op_sta_statistics()
9040 !(ath11k_debugfs_get_fw_stats(ar, ar->pdev->pdev_id, 0, in ath11k_mac_op_sta_statistics()
9042 signal = arsta->rssi_beacon; in ath11k_mac_op_sta_statistics()
9044 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, in ath11k_mac_op_sta_statistics()
9046 db2dbm, arsta->rssi_comb, arsta->rssi_beacon); in ath11k_mac_op_sta_statistics()
9049 sinfo->signal = db2dbm ? signal : signal + ATH11K_DEFAULT_NOISE_FLOOR; in ath11k_mac_op_sta_statistics()
9050 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL); in ath11k_mac_op_sta_statistics()
9053 sinfo->signal_avg = ewma_avg_rssi_read(&arsta->avg_rssi); in ath11k_mac_op_sta_statistics()
9056 sinfo->signal_avg += ATH11K_DEFAULT_NOISE_FLOOR; in ath11k_mac_op_sta_statistics()
9058 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG); in ath11k_mac_op_sta_statistics()
9067 for (i = 0; i < offload->ipv6_count; i++) { in ath11k_generate_ns_mc_addr()
9068 offload->self_ipv6_addr[i][0] = 0xff; in ath11k_generate_ns_mc_addr()
9069 offload->self_ipv6_addr[i][1] = 0x02; in ath11k_generate_ns_mc_addr()
9070 offload->self_ipv6_addr[i][11] = 0x01; in ath11k_generate_ns_mc_addr()
9071 offload->self_ipv6_addr[i][12] = 0xff; in ath11k_generate_ns_mc_addr()
9072 offload->self_ipv6_addr[i][13] = in ath11k_generate_ns_mc_addr()
9073 offload->ipv6_addr[i][13]; in ath11k_generate_ns_mc_addr()
9074 offload->self_ipv6_addr[i][14] = in ath11k_generate_ns_mc_addr()
9075 offload->ipv6_addr[i][14]; in ath11k_generate_ns_mc_addr()
9076 offload->self_ipv6_addr[i][15] = in ath11k_generate_ns_mc_addr()
9077 offload->ipv6_addr[i][15]; in ath11k_generate_ns_mc_addr()
9078 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "NS solicited addr %pI6\n", in ath11k_generate_ns_mc_addr()
9079 offload->self_ipv6_addr[i]); in ath11k_generate_ns_mc_addr()
9087 struct ath11k *ar = hw->priv; in ath11k_mac_op_ipv6_changed()
9094 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "op ipv6 changed\n"); in ath11k_mac_op_ipv6_changed()
9096 offload = &arvif->arp_ns_offload; in ath11k_mac_op_ipv6_changed()
9105 read_lock_bh(&idev->lock); in ath11k_mac_op_ipv6_changed()
9107 memset(offload->ipv6_addr, 0, sizeof(offload->ipv6_addr)); in ath11k_mac_op_ipv6_changed()
9108 memset(offload->self_ipv6_addr, 0, sizeof(offload->self_ipv6_addr)); in ath11k_mac_op_ipv6_changed()
9109 memcpy(offload->mac_addr, vif->addr, ETH_ALEN); in ath11k_mac_op_ipv6_changed()
9112 list_for_each_entry(ifa6, &idev->addr_list, if_list) { in ath11k_mac_op_ipv6_changed()
9116 if (ifa6->flags & IFA_F_DADFAILED) in ath11k_mac_op_ipv6_changed()
9118 scope = ipv6_addr_src_scope(&ifa6->addr); in ath11k_mac_op_ipv6_changed()
9121 memcpy(offload->ipv6_addr[count], &ifa6->addr.s6_addr, in ath11k_mac_op_ipv6_changed()
9122 sizeof(ifa6->addr.s6_addr)); in ath11k_mac_op_ipv6_changed()
9123 offload->ipv6_type[count] = ATH11K_IPV6_UC_TYPE; in ath11k_mac_op_ipv6_changed()
9124 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "count %d ipv6 uc %pI6 scope %d\n", in ath11k_mac_op_ipv6_changed()
9125 count, offload->ipv6_addr[count], in ath11k_mac_op_ipv6_changed()
9129 ath11k_warn(ar->ab, "Unsupported ipv6 scope: %d\n", scope); in ath11k_mac_op_ipv6_changed()
9134 for (ifaca6 = rcu_dereference(idev->ac_list); ifaca6; in ath11k_mac_op_ipv6_changed()
9135 ifaca6 = rcu_dereference(ifaca6->aca_next)) { in ath11k_mac_op_ipv6_changed()
9139 scope = ipv6_addr_src_scope(&ifaca6->aca_addr); in ath11k_mac_op_ipv6_changed()
9142 memcpy(offload->ipv6_addr[count], &ifaca6->aca_addr, in ath11k_mac_op_ipv6_changed()
9143 sizeof(ifaca6->aca_addr)); in ath11k_mac_op_ipv6_changed()
9144 offload->ipv6_type[count] = ATH11K_IPV6_AC_TYPE; in ath11k_mac_op_ipv6_changed()
9145 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "count %d ipv6 ac %pI6 scope %d\n", in ath11k_mac_op_ipv6_changed()
9146 count, offload->ipv6_addr[count], in ath11k_mac_op_ipv6_changed()
9150 ath11k_warn(ar->ab, "Unsupported ipv scope: %d\n", scope); in ath11k_mac_op_ipv6_changed()
9155 offload->ipv6_count = count; in ath11k_mac_op_ipv6_changed()
9156 read_unlock_bh(&idev->lock); in ath11k_mac_op_ipv6_changed()
9158 /* generate ns multicast address */ in ath11k_mac_op_ipv6_changed()
9167 struct ath11k *ar = hw->priv; in ath11k_mac_op_set_rekey_data()
9169 struct ath11k_rekey_data *rekey_data = &arvif->rekey_data; in ath11k_mac_op_set_rekey_data()
9171 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "set rekey data vdev %d\n", in ath11k_mac_op_set_rekey_data()
9172 arvif->vdev_id); in ath11k_mac_op_set_rekey_data()
9174 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_set_rekey_data()
9176 memcpy(rekey_data->kck, data->kck, NL80211_KCK_LEN); in ath11k_mac_op_set_rekey_data()
9177 memcpy(rekey_data->kek, data->kek, NL80211_KEK_LEN); in ath11k_mac_op_set_rekey_data()
9179 /* The supplicant works on big-endian, the firmware expects it on in ath11k_mac_op_set_rekey_data()
9182 rekey_data->replay_ctr = get_unaligned_be64(data->replay_ctr); in ath11k_mac_op_set_rekey_data()
9184 arvif->rekey_data.enable_offload = true; in ath11k_mac_op_set_rekey_data()
9186 ath11k_dbg_dump(ar->ab, ATH11K_DBG_MAC, "kck", NULL, in ath11k_mac_op_set_rekey_data()
9187 rekey_data->kck, NL80211_KCK_LEN); in ath11k_mac_op_set_rekey_data()
9188 ath11k_dbg_dump(ar->ab, ATH11K_DBG_MAC, "kek", NULL, in ath11k_mac_op_set_rekey_data()
9189 rekey_data->kck, NL80211_KEK_LEN); in ath11k_mac_op_set_rekey_data()
9190 ath11k_dbg_dump(ar->ab, ATH11K_DBG_MAC, "replay ctr", NULL, in ath11k_mac_op_set_rekey_data()
9191 &rekey_data->replay_ctr, sizeof(rekey_data->replay_ctr)); in ath11k_mac_op_set_rekey_data()
9193 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_set_rekey_data()
9199 struct ath11k *ar = hw->priv; in ath11k_mac_op_set_bios_sar_specs()
9205 if (!sar || sar->type != NL80211_SAR_TYPE_POWER || in ath11k_mac_op_set_bios_sar_specs()
9206 sar->num_sub_specs == 0) in ath11k_mac_op_set_bios_sar_specs()
9207 return -EINVAL; in ath11k_mac_op_set_bios_sar_specs()
9209 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_set_bios_sar_specs()
9211 if (!test_bit(WMI_TLV_SERVICE_BIOS_SAR_SUPPORT, ar->ab->wmi_ab.svc_map) || in ath11k_mac_op_set_bios_sar_specs()
9212 !ar->ab->hw_params.bios_sar_capa) { in ath11k_mac_op_set_bios_sar_specs()
9213 ret = -EOPNOTSUPP; in ath11k_mac_op_set_bios_sar_specs()
9219 ath11k_warn(ar->ab, "failed to set geo table: %d\n", ret); in ath11k_mac_op_set_bios_sar_specs()
9225 ret = -ENOMEM; in ath11k_mac_op_set_bios_sar_specs()
9229 sspec = sar->sub_specs; in ath11k_mac_op_set_bios_sar_specs()
9230 for (i = 0; i < sar->num_sub_specs; i++) { in ath11k_mac_op_set_bios_sar_specs()
9231 if (sspec->freq_range_index >= (BIOS_SAR_TABLE_LEN >> 1)) { in ath11k_mac_op_set_bios_sar_specs()
9232 ath11k_warn(ar->ab, "Ignore bad frequency index %u, max allowed %u\n", in ath11k_mac_op_set_bios_sar_specs()
9233 sspec->freq_range_index, BIOS_SAR_TABLE_LEN >> 1); in ath11k_mac_op_set_bios_sar_specs()
9238 sar_tbl[sspec->freq_range_index] = sspec->power; in ath11k_mac_op_set_bios_sar_specs()
9239 index = sspec->freq_range_index + (BIOS_SAR_TABLE_LEN >> 1); in ath11k_mac_op_set_bios_sar_specs()
9240 sar_tbl[index] = sspec->power; in ath11k_mac_op_set_bios_sar_specs()
9241 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "sar tbl[%d] = %d\n", in ath11k_mac_op_set_bios_sar_specs()
9242 sspec->freq_range_index, sar_tbl[sspec->freq_range_index]); in ath11k_mac_op_set_bios_sar_specs()
9248 ath11k_warn(ar->ab, "failed to set sar power: %d", ret); in ath11k_mac_op_set_bios_sar_specs()
9252 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_set_bios_sar_specs()
9260 struct ath11k *ar = hw->priv; in ath11k_mac_op_cancel_remain_on_channel()
9262 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_cancel_remain_on_channel()
9264 spin_lock_bh(&ar->data_lock); in ath11k_mac_op_cancel_remain_on_channel()
9265 ar->scan.roc_notify = false; in ath11k_mac_op_cancel_remain_on_channel()
9266 spin_unlock_bh(&ar->data_lock); in ath11k_mac_op_cancel_remain_on_channel()
9270 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_cancel_remain_on_channel()
9272 cancel_delayed_work_sync(&ar->scan.timeout); in ath11k_mac_op_cancel_remain_on_channel()
9283 struct ath11k *ar = hw->priv; in ath11k_mac_op_remain_on_channel()
9289 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_remain_on_channel()
9291 spin_lock_bh(&ar->data_lock); in ath11k_mac_op_remain_on_channel()
9292 switch (ar->scan.state) { in ath11k_mac_op_remain_on_channel()
9294 reinit_completion(&ar->scan.started); in ath11k_mac_op_remain_on_channel()
9295 reinit_completion(&ar->scan.completed); in ath11k_mac_op_remain_on_channel()
9296 reinit_completion(&ar->scan.on_channel); in ath11k_mac_op_remain_on_channel()
9297 ar->scan.state = ATH11K_SCAN_STARTING; in ath11k_mac_op_remain_on_channel()
9298 ar->scan.is_roc = true; in ath11k_mac_op_remain_on_channel()
9299 ar->scan.vdev_id = arvif->vdev_id; in ath11k_mac_op_remain_on_channel()
9300 ar->scan.roc_freq = chan->center_freq; in ath11k_mac_op_remain_on_channel()
9301 ar->scan.roc_notify = true; in ath11k_mac_op_remain_on_channel()
9307 ret = -EBUSY; in ath11k_mac_op_remain_on_channel()
9310 spin_unlock_bh(&ar->data_lock); in ath11k_mac_op_remain_on_channel()
9315 scan_time_msec = ar->hw->wiphy->max_remain_on_channel_duration * 2; in ath11k_mac_op_remain_on_channel()
9319 ret = -ENOMEM; in ath11k_mac_op_remain_on_channel()
9323 arg->num_chan = 1; in ath11k_mac_op_remain_on_channel()
9324 arg->chan_list = kcalloc(arg->num_chan, sizeof(*arg->chan_list), in ath11k_mac_op_remain_on_channel()
9326 if (!arg->chan_list) { in ath11k_mac_op_remain_on_channel()
9327 ret = -ENOMEM; in ath11k_mac_op_remain_on_channel()
9331 arg->vdev_id = arvif->vdev_id; in ath11k_mac_op_remain_on_channel()
9332 arg->scan_id = ATH11K_SCAN_ID; in ath11k_mac_op_remain_on_channel()
9333 arg->chan_list[0] = chan->center_freq; in ath11k_mac_op_remain_on_channel()
9334 arg->dwell_time_active = scan_time_msec; in ath11k_mac_op_remain_on_channel()
9335 arg->dwell_time_passive = scan_time_msec; in ath11k_mac_op_remain_on_channel()
9336 arg->max_scan_time = scan_time_msec; in ath11k_mac_op_remain_on_channel()
9337 arg->scan_f_passive = 1; in ath11k_mac_op_remain_on_channel()
9338 arg->burst_duration = duration; in ath11k_mac_op_remain_on_channel()
9340 if (!ar->ab->hw_params.single_pdev_only) in ath11k_mac_op_remain_on_channel()
9341 arg->scan_f_filter_prb_req = 1; in ath11k_mac_op_remain_on_channel()
9345 ath11k_warn(ar->ab, "failed to start roc scan: %d\n", ret); in ath11k_mac_op_remain_on_channel()
9347 spin_lock_bh(&ar->data_lock); in ath11k_mac_op_remain_on_channel()
9348 ar->scan.state = ATH11K_SCAN_IDLE; in ath11k_mac_op_remain_on_channel()
9349 spin_unlock_bh(&ar->data_lock); in ath11k_mac_op_remain_on_channel()
9353 ret = wait_for_completion_timeout(&ar->scan.on_channel, 3 * HZ); in ath11k_mac_op_remain_on_channel()
9355 ath11k_warn(ar->ab, "failed to switch to channel for roc scan\n"); in ath11k_mac_op_remain_on_channel()
9358 ath11k_warn(ar->ab, "failed to stop scan: %d\n", ret); in ath11k_mac_op_remain_on_channel()
9359 ret = -ETIMEDOUT; in ath11k_mac_op_remain_on_channel()
9363 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout, in ath11k_mac_op_remain_on_channel()
9369 kfree(arg->chan_list); in ath11k_mac_op_remain_on_channel()
9373 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_remain_on_channel()
9380 struct ath11k_base *ab = ar->ab; in ath11k_fw_stats_request()
9384 lockdep_assert_held(&ar->conf_mutex); in ath11k_fw_stats_request()
9386 spin_lock_bh(&ar->data_lock); in ath11k_fw_stats_request()
9387 ar->fw_stats_done = false; in ath11k_fw_stats_request()
9388 ath11k_fw_stats_pdevs_free(&ar->fw_stats.pdevs); in ath11k_fw_stats_request()
9389 spin_unlock_bh(&ar->data_lock); in ath11k_fw_stats_request()
9391 reinit_completion(&ar->fw_stats_complete); in ath11k_fw_stats_request()
9400 time_left = wait_for_completion_timeout(&ar->fw_stats_complete, in ath11k_fw_stats_request()
9404 return -ETIMEDOUT; in ath11k_fw_stats_request()
9414 struct ath11k *ar = hw->priv; in ath11k_mac_op_get_txpower()
9415 struct ath11k_base *ab = ar->ab; in ath11k_mac_op_get_txpower()
9426 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_get_txpower()
9428 if (ar->state != ATH11K_STATE_ON) in ath11k_mac_op_get_txpower()
9434 if (test_bit(ATH11K_CAC_RUNNING, &ar->dev_flags)) { in ath11k_mac_op_get_txpower()
9435 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_get_txpower()
9436 return -EAGAIN; in ath11k_mac_op_get_txpower()
9439 req_param.pdev_id = ar->pdev->pdev_id; in ath11k_mac_op_get_txpower()
9448 spin_lock_bh(&ar->data_lock); in ath11k_mac_op_get_txpower()
9449 pdev = list_first_entry_or_null(&ar->fw_stats.pdevs, in ath11k_mac_op_get_txpower()
9452 spin_unlock_bh(&ar->data_lock); in ath11k_mac_op_get_txpower()
9457 *dbm = pdev->chan_tx_power / 2; in ath11k_mac_op_get_txpower()
9459 spin_unlock_bh(&ar->data_lock); in ath11k_mac_op_get_txpower()
9460 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_get_txpower()
9462 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "txpower from firmware %d, reported %d dBm\n", in ath11k_mac_op_get_txpower()
9463 pdev->chan_tx_power, *dbm); in ath11k_mac_op_get_txpower()
9467 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_get_txpower()
9468 /* We didn't get txpower from FW. Hence, relying on vif->bss_conf.txpower */ in ath11k_mac_op_get_txpower()
9469 *dbm = vif->bss_conf.txpower; in ath11k_mac_op_get_txpower()
9470 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "txpower from firmware NaN, reported %d dBm\n", in ath11k_mac_op_get_txpower()
9479 struct ath11k_base *ab = ar->ab; in ath11k_mac_station_add()
9485 lockdep_assert_held(&ar->conf_mutex); in ath11k_mac_station_add()
9490 ar->max_num_stations); in ath11k_mac_station_add()
9494 arsta->rx_stats = kzalloc(sizeof(*arsta->rx_stats), GFP_KERNEL); in ath11k_mac_station_add()
9495 if (!arsta->rx_stats) { in ath11k_mac_station_add()
9496 ret = -ENOMEM; in ath11k_mac_station_add()
9500 peer_param.vdev_id = arvif->vdev_id; in ath11k_mac_station_add()
9501 peer_param.peer_addr = sta->addr; in ath11k_mac_station_add()
9507 sta->addr, arvif->vdev_id); in ath11k_mac_station_add()
9512 sta->addr, arvif->vdev_id); in ath11k_mac_station_add()
9515 arsta->tx_stats = kzalloc(sizeof(*arsta->tx_stats), GFP_KERNEL); in ath11k_mac_station_add()
9516 if (!arsta->tx_stats) { in ath11k_mac_station_add()
9517 ret = -ENOMEM; in ath11k_mac_station_add()
9524 "setting USE_4ADDR for mesh STA %pM\n", sta->addr); in ath11k_mac_station_add()
9525 ret = ath11k_wmi_set_peer_param(ar, sta->addr, in ath11k_mac_station_add()
9526 arvif->vdev_id, in ath11k_mac_station_add()
9530 sta->addr, ret); in ath11k_mac_station_add()
9535 ret = ath11k_dp_peer_setup(ar, arvif->vdev_id, sta->addr); in ath11k_mac_station_add()
9538 sta->addr, arvif->vdev_id, ret); in ath11k_mac_station_add()
9542 if (ab->hw_params.vdev_start_delay && in ath11k_mac_station_add()
9543 !arvif->is_started && in ath11k_mac_station_add()
9544 arvif->vdev_type != WMI_VDEV_TYPE_AP) { in ath11k_mac_station_add()
9545 ret = ath11k_mac_start_vdev_delay(ar->hw, vif); in ath11k_mac_station_add()
9552 ewma_avg_rssi_init(&arsta->avg_rssi); in ath11k_mac_station_add()
9556 kfree(arsta->tx_stats); in ath11k_mac_station_add()
9557 arsta->tx_stats = NULL; in ath11k_mac_station_add()
9559 ath11k_peer_delete(ar, arvif->vdev_id, sta->addr); in ath11k_mac_station_add()
9561 kfree(arsta->rx_stats); in ath11k_mac_station_add()
9562 arsta->rx_stats = NULL; in ath11k_mac_station_add()
9573 struct ath11k_base *ab = ar->ab; in ath11k_mac_station_remove()
9578 if (ab->hw_params.vdev_start_delay && in ath11k_mac_station_remove()
9579 arvif->is_started && in ath11k_mac_station_remove()
9580 arvif->vdev_type != WMI_VDEV_TYPE_AP) { in ath11k_mac_station_remove()
9581 ret = ath11k_mac_stop_vdev_early(ar->hw, vif); in ath11k_mac_station_remove()
9588 ath11k_dp_peer_cleanup(ar, arvif->vdev_id, sta->addr); in ath11k_mac_station_remove()
9590 ret = ath11k_peer_delete(ar, arvif->vdev_id, sta->addr); in ath11k_mac_station_remove()
9593 sta->addr, arvif->vdev_id); in ath11k_mac_station_remove()
9596 sta->addr, arvif->vdev_id); in ath11k_mac_station_remove()
9600 kfree(arsta->tx_stats); in ath11k_mac_station_remove()
9601 arsta->tx_stats = NULL; in ath11k_mac_station_remove()
9603 kfree(arsta->rx_stats); in ath11k_mac_station_remove()
9604 arsta->rx_stats = NULL; in ath11k_mac_station_remove()
9615 struct ath11k *ar = hw->priv; in ath11k_mac_op_sta_state()
9626 cancel_work_sync(&arsta->update_wk); in ath11k_mac_op_sta_state()
9627 cancel_work_sync(&arsta->set_4addr_wk); in ath11k_mac_op_sta_state()
9630 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_sta_state()
9635 arsta->arvif = arvif; in ath11k_mac_op_sta_state()
9636 arsta->peer_ps_state = WMI_PEER_PS_STATE_DISABLED; in ath11k_mac_op_sta_state()
9637 INIT_WORK(&arsta->update_wk, ath11k_sta_rc_update_wk); in ath11k_mac_op_sta_state()
9638 INIT_WORK(&arsta->set_4addr_wk, ath11k_sta_set_4addr_wk); in ath11k_mac_op_sta_state()
9642 ath11k_warn(ar->ab, "Failed to add station: %pM for VDEV: %d\n", in ath11k_mac_op_sta_state()
9643 sta->addr, arvif->vdev_id); in ath11k_mac_op_sta_state()
9648 ath11k_warn(ar->ab, "Failed to remove station: %pM for VDEV: %d\n", in ath11k_mac_op_sta_state()
9649 sta->addr, arvif->vdev_id); in ath11k_mac_op_sta_state()
9651 mutex_lock(&ar->ab->tbl_mtx_lock); in ath11k_mac_op_sta_state()
9652 spin_lock_bh(&ar->ab->base_lock); in ath11k_mac_op_sta_state()
9653 peer = ath11k_peer_find(ar->ab, arvif->vdev_id, sta->addr); in ath11k_mac_op_sta_state()
9654 if (peer && peer->sta == sta) { in ath11k_mac_op_sta_state()
9655 ath11k_warn(ar->ab, "Found peer entry %pM n vdev %i after it was supposedly removed\n", in ath11k_mac_op_sta_state()
9656 vif->addr, arvif->vdev_id); in ath11k_mac_op_sta_state()
9657 ath11k_peer_rhash_delete(ar->ab, peer); in ath11k_mac_op_sta_state()
9658 peer->sta = NULL; in ath11k_mac_op_sta_state()
9659 list_del(&peer->list); in ath11k_mac_op_sta_state()
9661 ar->num_peers--; in ath11k_mac_op_sta_state()
9663 spin_unlock_bh(&ar->ab->base_lock); in ath11k_mac_op_sta_state()
9664 mutex_unlock(&ar->ab->tbl_mtx_lock); in ath11k_mac_op_sta_state()
9667 (vif->type == NL80211_IFTYPE_AP || in ath11k_mac_op_sta_state()
9668 vif->type == NL80211_IFTYPE_MESH_POINT || in ath11k_mac_op_sta_state()
9669 vif->type == NL80211_IFTYPE_ADHOC)) { in ath11k_mac_op_sta_state()
9672 ath11k_warn(ar->ab, "Failed to associate station: %pM\n", in ath11k_mac_op_sta_state()
9673 sta->addr); in ath11k_mac_op_sta_state()
9675 spin_lock_bh(&ar->data_lock); in ath11k_mac_op_sta_state()
9677 arsta->bw = ath11k_mac_ieee80211_sta_bw_to_wmi(ar, sta); in ath11k_mac_op_sta_state()
9678 arsta->bw_prev = arsta->bw; in ath11k_mac_op_sta_state()
9679 spin_unlock_bh(&ar->data_lock); in ath11k_mac_op_sta_state()
9682 spin_lock_bh(&ar->ab->base_lock); in ath11k_mac_op_sta_state()
9684 peer = ath11k_peer_find(ar->ab, arvif->vdev_id, sta->addr); in ath11k_mac_op_sta_state()
9686 peer->is_authorized = true; in ath11k_mac_op_sta_state()
9688 spin_unlock_bh(&ar->ab->base_lock); in ath11k_mac_op_sta_state()
9690 if (vif->type == NL80211_IFTYPE_STATION && arvif->is_up) { in ath11k_mac_op_sta_state()
9691 ret = ath11k_wmi_set_peer_param(ar, sta->addr, in ath11k_mac_op_sta_state()
9692 arvif->vdev_id, in ath11k_mac_op_sta_state()
9696 ath11k_warn(ar->ab, "Unable to authorize peer %pM vdev %d: %d\n", in ath11k_mac_op_sta_state()
9697 sta->addr, arvif->vdev_id, ret); in ath11k_mac_op_sta_state()
9702 arvif->vdev_type == WMI_VDEV_TYPE_STA && in ath11k_mac_op_sta_state()
9703 arvif->chanctx.def.chan && in ath11k_mac_op_sta_state()
9704 arvif->chanctx.def.chan->band == NL80211_BAND_6GHZ) { in ath11k_mac_op_sta_state()
9705 reg_info = &ar->ab->reg_info_store[ar->pdev_idx]; in ath11k_mac_op_sta_state()
9706 power_type = vif->bss_conf.power_type; in ath11k_mac_op_sta_state()
9709 ath11k_warn(ar->ab, "invalid power type %d\n", in ath11k_mac_op_sta_state()
9711 ret = -EINVAL; in ath11k_mac_op_sta_state()
9713 ret = ath11k_reg_handle_chan_list(ar->ab, in ath11k_mac_op_sta_state()
9717 ath11k_warn(ar->ab, in ath11k_mac_op_sta_state()
9724 spin_lock_bh(&ar->ab->base_lock); in ath11k_mac_op_sta_state()
9726 peer = ath11k_peer_find(ar->ab, arvif->vdev_id, sta->addr); in ath11k_mac_op_sta_state()
9728 peer->is_authorized = false; in ath11k_mac_op_sta_state()
9730 spin_unlock_bh(&ar->ab->base_lock); in ath11k_mac_op_sta_state()
9733 (vif->type == NL80211_IFTYPE_AP || in ath11k_mac_op_sta_state()
9734 vif->type == NL80211_IFTYPE_MESH_POINT || in ath11k_mac_op_sta_state()
9735 vif->type == NL80211_IFTYPE_ADHOC)) { in ath11k_mac_op_sta_state()
9738 ath11k_warn(ar->ab, "Failed to disassociate station: %pM\n", in ath11k_mac_op_sta_state()
9739 sta->addr); in ath11k_mac_op_sta_state()
9742 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_sta_state()
9814 for (i = 0; i < band->n_channels; i++) { in ath11k_mac_update_ch_list()
9815 if (band->channels[i].center_freq < freq_low || in ath11k_mac_update_ch_list()
9816 band->channels[i].center_freq > freq_high) in ath11k_mac_update_ch_list()
9817 band->channels[i].flags |= IEEE80211_CHAN_DISABLED; in ath11k_mac_update_ch_list()
9823 struct ath11k_pdev *pdev = ar->pdev; in ath11k_get_phy_id()
9824 struct ath11k_pdev_cap *pdev_cap = &pdev->cap; in ath11k_get_phy_id()
9827 return pdev_cap->band[NL80211_BAND_2GHZ].phy_id; in ath11k_get_phy_id()
9830 return pdev_cap->band[NL80211_BAND_5GHZ].phy_id; in ath11k_get_phy_id()
9832 ath11k_warn(ar->ab, "unsupported phy cap:%d\n", band); in ath11k_get_phy_id()
9850 reg_cap = &ar->ab->hal_reg_cap[ar->pdev_idx]; in ath11k_mac_setup_channels_rates()
9858 return -ENOMEM; in ath11k_mac_setup_channels_rates()
9860 band = &ar->mac.sbands[NL80211_BAND_2GHZ]; in ath11k_mac_setup_channels_rates()
9861 band->band = NL80211_BAND_2GHZ; in ath11k_mac_setup_channels_rates()
9862 band->n_channels = ARRAY_SIZE(ath11k_2ghz_channels); in ath11k_mac_setup_channels_rates()
9863 band->channels = channels; in ath11k_mac_setup_channels_rates()
9864 band->n_bitrates = ath11k_g_rates_size; in ath11k_mac_setup_channels_rates()
9865 band->bitrates = ath11k_g_rates; in ath11k_mac_setup_channels_rates()
9866 ar->hw->wiphy->bands[NL80211_BAND_2GHZ] = band; in ath11k_mac_setup_channels_rates()
9868 if (ar->ab->hw_params.single_pdev_only) { in ath11k_mac_setup_channels_rates()
9870 temp_reg_cap = &ar->ab->hal_reg_cap[phy_id]; in ath11k_mac_setup_channels_rates()
9873 temp_reg_cap->low_2ghz_chan, in ath11k_mac_setup_channels_rates()
9874 temp_reg_cap->high_2ghz_chan); in ath11k_mac_setup_channels_rates()
9878 if (reg_cap->high_5ghz_chan >= ATH11K_MIN_6G_FREQ) { in ath11k_mac_setup_channels_rates()
9882 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); in ath11k_mac_setup_channels_rates()
9883 return -ENOMEM; in ath11k_mac_setup_channels_rates()
9886 ar->supports_6ghz = true; in ath11k_mac_setup_channels_rates()
9887 band = &ar->mac.sbands[NL80211_BAND_6GHZ]; in ath11k_mac_setup_channels_rates()
9888 band->band = NL80211_BAND_6GHZ; in ath11k_mac_setup_channels_rates()
9889 band->n_channels = ARRAY_SIZE(ath11k_6ghz_channels); in ath11k_mac_setup_channels_rates()
9890 band->channels = channels; in ath11k_mac_setup_channels_rates()
9891 band->n_bitrates = ath11k_a_rates_size; in ath11k_mac_setup_channels_rates()
9892 band->bitrates = ath11k_a_rates; in ath11k_mac_setup_channels_rates()
9893 ar->hw->wiphy->bands[NL80211_BAND_6GHZ] = band; in ath11k_mac_setup_channels_rates()
9895 if (ar->ab->hw_params.single_pdev_only) { in ath11k_mac_setup_channels_rates()
9897 temp_reg_cap = &ar->ab->hal_reg_cap[phy_id]; in ath11k_mac_setup_channels_rates()
9901 temp_reg_cap->low_5ghz_chan, in ath11k_mac_setup_channels_rates()
9902 temp_reg_cap->high_5ghz_chan); in ath11k_mac_setup_channels_rates()
9905 if (reg_cap->low_5ghz_chan < ATH11K_MIN_6G_FREQ) { in ath11k_mac_setup_channels_rates()
9910 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); in ath11k_mac_setup_channels_rates()
9911 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels); in ath11k_mac_setup_channels_rates()
9912 return -ENOMEM; in ath11k_mac_setup_channels_rates()
9915 band = &ar->mac.sbands[NL80211_BAND_5GHZ]; in ath11k_mac_setup_channels_rates()
9916 band->band = NL80211_BAND_5GHZ; in ath11k_mac_setup_channels_rates()
9917 band->n_channels = ARRAY_SIZE(ath11k_5ghz_channels); in ath11k_mac_setup_channels_rates()
9918 band->channels = channels; in ath11k_mac_setup_channels_rates()
9919 band->n_bitrates = ath11k_a_rates_size; in ath11k_mac_setup_channels_rates()
9920 band->bitrates = ath11k_a_rates; in ath11k_mac_setup_channels_rates()
9921 ar->hw->wiphy->bands[NL80211_BAND_5GHZ] = band; in ath11k_mac_setup_channels_rates()
9923 if (ar->ab->hw_params.single_pdev_only) { in ath11k_mac_setup_channels_rates()
9925 temp_reg_cap = &ar->ab->hal_reg_cap[phy_id]; in ath11k_mac_setup_channels_rates()
9929 temp_reg_cap->low_5ghz_chan, in ath11k_mac_setup_channels_rates()
9930 temp_reg_cap->high_5ghz_chan); in ath11k_mac_setup_channels_rates()
9943 if (!ar->ab->hw_params.support_dual_stations) in ath11k_mac_setup_mac_address_list()
9946 n_addresses = ar->ab->hw_params.num_vdevs; in ath11k_mac_setup_mac_address_list()
9951 memcpy(addresses[0].addr, ar->mac_addr, ETH_ALEN); in ath11k_mac_setup_mac_address_list()
9953 memcpy(addresses[i].addr, ar->mac_addr, ETH_ALEN); in ath11k_mac_setup_mac_address_list()
9957 addresses[i].addr[0] += (i - 1) << 4; in ath11k_mac_setup_mac_address_list()
9960 ar->hw->wiphy->addresses = addresses; in ath11k_mac_setup_mac_address_list()
9961 ar->hw->wiphy->n_addresses = n_addresses; in ath11k_mac_setup_mac_address_list()
9966 struct ath11k_base *ab = ar->ab; in ath11k_mac_setup_iface_combinations()
9972 p2p = ab->hw_params.interface_modes & BIT(NL80211_IFTYPE_P2P_DEVICE); in ath11k_mac_setup_iface_combinations()
9976 return -ENOMEM; in ath11k_mac_setup_iface_combinations()
9986 return -ENOMEM; in ath11k_mac_setup_iface_combinations()
9992 ab->hw_params.interface_modes & BIT(NL80211_IFTYPE_MESH_POINT)) in ath11k_mac_setup_iface_combinations()
10000 if (ab->hw_params.support_dual_stations) { in ath11k_mac_setup_iface_combinations()
10004 combinations[0].max_interfaces = ab->hw_params.num_vdevs; in ath11k_mac_setup_iface_combinations()
10027 ar->hw->wiphy->iface_combinations = combinations; in ath11k_mac_setup_iface_combinations()
10028 ar->hw->wiphy->n_iface_combinations = 1; in ath11k_mac_setup_iface_combinations()
10076 cancel_work_sync(&ar->channel_update_work); in __ath11k_mac_unregister()
10077 cancel_work_sync(&ar->regd_update_work); in __ath11k_mac_unregister()
10079 ieee80211_unregister_hw(ar->hw); in __ath11k_mac_unregister()
10081 idr_for_each(&ar->txmgmt_idr, ath11k_mac_tx_mgmt_pending_free, ar); in __ath11k_mac_unregister()
10082 idr_destroy(&ar->txmgmt_idr); in __ath11k_mac_unregister()
10084 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); in __ath11k_mac_unregister()
10085 kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels); in __ath11k_mac_unregister()
10086 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels); in __ath11k_mac_unregister()
10088 kfree(ar->hw->wiphy->iface_combinations[0].limits); in __ath11k_mac_unregister()
10089 kfree(ar->hw->wiphy->iface_combinations); in __ath11k_mac_unregister()
10091 kfree(ar->hw->wiphy->addresses); in __ath11k_mac_unregister()
10093 SET_IEEE80211_DEV(ar->hw, NULL); in __ath11k_mac_unregister()
10102 for (i = 0; i < ab->num_radios; i++) { in ath11k_mac_unregister()
10103 pdev = &ab->pdevs[i]; in ath11k_mac_unregister()
10104 ar = pdev->ar; in ath11k_mac_unregister()
10116 struct ath11k_base *ab = ar->ab; in __ath11k_mac_register()
10117 struct ath11k_pdev_cap *cap = &ar->pdev->cap; in __ath11k_mac_register()
10134 SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr); in __ath11k_mac_register()
10137 SET_IEEE80211_DEV(ar->hw, ab->dev); in __ath11k_mac_register()
10140 cap->supported_bands); in __ath11k_mac_register()
10144 wiphy_read_of_freq_limits(ar->hw->wiphy); in __ath11k_mac_register()
10150 ath11k_err(ar->ab, "failed to setup interface combinations: %d\n", ret); in __ath11k_mac_register()
10154 ar->hw->wiphy->available_antennas_rx = cap->rx_chain_mask; in __ath11k_mac_register()
10155 ar->hw->wiphy->available_antennas_tx = cap->tx_chain_mask; in __ath11k_mac_register()
10157 ar->hw->wiphy->interface_modes = ab->hw_params.interface_modes; in __ath11k_mac_register()
10159 if (ab->hw_params.single_pdev_only && ar->supports_6ghz) in __ath11k_mac_register()
10160 ieee80211_hw_set(ar->hw, SINGLE_SCAN_ON_ALL_BANDS); in __ath11k_mac_register()
10162 if (ab->hw_params.supports_multi_bssid) { in __ath11k_mac_register()
10163 ieee80211_hw_set(ar->hw, SUPPORTS_MULTI_BSSID); in __ath11k_mac_register()
10164 ieee80211_hw_set(ar->hw, SUPPORTS_ONLY_HE_MULTI_BSSID); in __ath11k_mac_register()
10167 ieee80211_hw_set(ar->hw, SIGNAL_DBM); in __ath11k_mac_register()
10168 ieee80211_hw_set(ar->hw, SUPPORTS_PS); in __ath11k_mac_register()
10169 ieee80211_hw_set(ar->hw, SUPPORTS_DYNAMIC_PS); in __ath11k_mac_register()
10170 ieee80211_hw_set(ar->hw, MFP_CAPABLE); in __ath11k_mac_register()
10171 ieee80211_hw_set(ar->hw, REPORTS_TX_ACK_STATUS); in __ath11k_mac_register()
10172 ieee80211_hw_set(ar->hw, HAS_RATE_CONTROL); in __ath11k_mac_register()
10173 ieee80211_hw_set(ar->hw, AP_LINK_PS); in __ath11k_mac_register()
10174 ieee80211_hw_set(ar->hw, SPECTRUM_MGMT); in __ath11k_mac_register()
10175 ieee80211_hw_set(ar->hw, CONNECTION_MONITOR); in __ath11k_mac_register()
10176 ieee80211_hw_set(ar->hw, SUPPORTS_PER_STA_GTK); in __ath11k_mac_register()
10177 ieee80211_hw_set(ar->hw, WANT_MONITOR_VIF); in __ath11k_mac_register()
10178 ieee80211_hw_set(ar->hw, CHANCTX_STA_CSA); in __ath11k_mac_register()
10179 ieee80211_hw_set(ar->hw, QUEUE_CONTROL); in __ath11k_mac_register()
10180 ieee80211_hw_set(ar->hw, SUPPORTS_TX_FRAG); in __ath11k_mac_register()
10181 ieee80211_hw_set(ar->hw, REPORTS_LOW_ACK); in __ath11k_mac_register()
10184 ieee80211_hw_set(ar->hw, SUPPORTS_TX_ENCAP_OFFLOAD); in __ath11k_mac_register()
10185 ieee80211_hw_set(ar->hw, SUPPORTS_RX_DECAP_OFFLOAD); in __ath11k_mac_register()
10188 if (cap->nss_ratio_enabled) in __ath11k_mac_register()
10189 ieee80211_hw_set(ar->hw, SUPPORTS_VHT_EXT_NSS_BW); in __ath11k_mac_register()
10191 if ((ht_cap & WMI_HT_CAP_ENABLED) || ar->supports_6ghz) { in __ath11k_mac_register()
10192 ieee80211_hw_set(ar->hw, AMPDU_AGGREGATION); in __ath11k_mac_register()
10193 ieee80211_hw_set(ar->hw, TX_AMPDU_SETUP_IN_HW); in __ath11k_mac_register()
10194 ieee80211_hw_set(ar->hw, SUPPORTS_REORDERING_BUFFER); in __ath11k_mac_register()
10195 ieee80211_hw_set(ar->hw, SUPPORTS_AMSDU_IN_AMPDU); in __ath11k_mac_register()
10196 ieee80211_hw_set(ar->hw, USES_RSS); in __ath11k_mac_register()
10199 ar->hw->wiphy->features |= NL80211_FEATURE_STATIC_SMPS; in __ath11k_mac_register()
10200 ar->hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN; in __ath11k_mac_register()
10207 (ar->supports_6ghz && ab->hw_params.supports_dynamic_smps_6ghz)) in __ath11k_mac_register()
10208 ar->hw->wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS; in __ath11k_mac_register()
10210 ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID; in __ath11k_mac_register()
10211 ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN; in __ath11k_mac_register()
10213 ar->hw->max_listen_interval = ATH11K_MAX_HW_LISTEN_INTERVAL; in __ath11k_mac_register()
10215 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL; in __ath11k_mac_register()
10216 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH; in __ath11k_mac_register()
10217 ar->hw->wiphy->max_remain_on_channel_duration = 5000; in __ath11k_mac_register()
10219 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD; in __ath11k_mac_register()
10220 ar->hw->wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE | in __ath11k_mac_register()
10223 ar->max_num_stations = TARGET_NUM_STATIONS(ab); in __ath11k_mac_register()
10224 ar->max_num_peers = TARGET_NUM_PEERS_PDEV(ab); in __ath11k_mac_register()
10226 ar->hw->wiphy->max_ap_assoc_sta = ar->max_num_stations; in __ath11k_mac_register()
10228 if (test_bit(WMI_TLV_SERVICE_SPOOF_MAC_SUPPORT, ar->wmi->wmi_ab->svc_map)) { in __ath11k_mac_register()
10229 ar->hw->wiphy->features |= in __ath11k_mac_register()
10233 if (test_bit(WMI_TLV_SERVICE_NLO, ar->wmi->wmi_ab->svc_map)) { in __ath11k_mac_register()
10234 ar->hw->wiphy->max_sched_scan_ssids = WMI_PNO_MAX_SUPP_NETWORKS; in __ath11k_mac_register()
10235 ar->hw->wiphy->max_match_sets = WMI_PNO_MAX_SUPP_NETWORKS; in __ath11k_mac_register()
10236 ar->hw->wiphy->max_sched_scan_ie_len = WMI_PNO_MAX_IE_LENGTH; in __ath11k_mac_register()
10237 ar->hw->wiphy->max_sched_scan_plans = WMI_PNO_MAX_SCHED_SCAN_PLANS; in __ath11k_mac_register()
10238 ar->hw->wiphy->max_sched_scan_plan_interval = in __ath11k_mac_register()
10240 ar->hw->wiphy->max_sched_scan_plan_iterations = in __ath11k_mac_register()
10242 ar->hw->wiphy->features |= NL80211_FEATURE_ND_RANDOM_MAC_ADDR; in __ath11k_mac_register()
10247 ath11k_warn(ar->ab, "failed to init wow: %d\n", ret); in __ath11k_mac_register()
10252 ar->ab->wmi_ab.svc_map)) in __ath11k_mac_register()
10253 wiphy_ext_feature_set(ar->hw->wiphy, in __ath11k_mac_register()
10256 ar->hw->queues = ATH11K_HW_MAX_QUEUES; in __ath11k_mac_register()
10257 ar->hw->wiphy->tx_queue_len = ATH11K_QUEUE_LEN; in __ath11k_mac_register()
10258 ar->hw->offchannel_tx_hw_queue = ATH11K_HW_MAX_QUEUES - 1; in __ath11k_mac_register()
10259 ar->hw->max_rx_aggregation_subframes = IEEE80211_MAX_AMPDU_BUF_HE; in __ath11k_mac_register()
10261 ar->hw->vif_data_size = sizeof(struct ath11k_vif); in __ath11k_mac_register()
10262 ar->hw->sta_data_size = sizeof(struct ath11k_sta); in __ath11k_mac_register()
10264 wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST); in __ath11k_mac_register()
10265 wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_STA_TX_PWR); in __ath11k_mac_register()
10267 ar->ab->wmi_ab.svc_map)) { in __ath11k_mac_register()
10268 wiphy_ext_feature_set(ar->hw->wiphy, in __ath11k_mac_register()
10270 ieee80211_hw_set(ar->hw, DETECTS_COLOR_COLLISION); in __ath11k_mac_register()
10273 ar->hw->wiphy->cipher_suites = cipher_suites; in __ath11k_mac_register()
10274 ar->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites); in __ath11k_mac_register()
10276 ar->hw->wiphy->iftype_ext_capab = ath11k_iftypes_ext_capa; in __ath11k_mac_register()
10277 ar->hw->wiphy->num_iftype_ext_capab = in __ath11k_mac_register()
10280 if (ar->supports_6ghz) { in __ath11k_mac_register()
10281 wiphy_ext_feature_set(ar->hw->wiphy, in __ath11k_mac_register()
10283 wiphy_ext_feature_set(ar->hw->wiphy, in __ath11k_mac_register()
10287 wiphy_ext_feature_set(ar->hw->wiphy, in __ath11k_mac_register()
10290 if (test_bit(WMI_TLV_SERVICE_RTT, ar->ab->wmi_ab.svc_map)) in __ath11k_mac_register()
10291 wiphy_ext_feature_set(ar->hw->wiphy, in __ath11k_mac_register()
10294 ar->hw->wiphy->mbssid_max_interfaces = TARGET_NUM_VDEVS(ab); in __ath11k_mac_register()
10295 ar->hw->wiphy->ema_max_profile_periodicity = TARGET_EMA_MAX_PROFILE_PERIOD; in __ath11k_mac_register()
10299 if (!test_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags)) { in __ath11k_mac_register()
10300 ar->hw->netdev_features = NETIF_F_HW_CSUM; in __ath11k_mac_register()
10301 ieee80211_hw_set(ar->hw, SW_CRYPTO_CONTROL); in __ath11k_mac_register()
10302 ieee80211_hw_set(ar->hw, SUPPORT_FAST_XMIT); in __ath11k_mac_register()
10305 if (test_bit(WMI_TLV_SERVICE_BIOS_SAR_SUPPORT, ar->ab->wmi_ab.svc_map) && in __ath11k_mac_register()
10306 ab->hw_params.bios_sar_capa) in __ath11k_mac_register()
10307 ar->hw->wiphy->sar_capa = ab->hw_params.bios_sar_capa; in __ath11k_mac_register()
10309 ret = ieee80211_register_hw(ar->hw); in __ath11k_mac_register()
10311 ath11k_err(ar->ab, "ieee80211 registration failed: %d\n", ret); in __ath11k_mac_register()
10315 if (!ab->hw_params.supports_monitor) in __ath11k_mac_register()
10321 ar->hw->wiphy->interface_modes &= ~BIT(NL80211_IFTYPE_MONITOR); in __ath11k_mac_register()
10326 ath11k_err(ar->ab, "ath11k regd update failed: %d\n", ret); in __ath11k_mac_register()
10330 if (ab->hw_params.current_cc_support && ab->new_alpha2[0]) { in __ath11k_mac_register()
10331 memcpy(&ar->alpha2, ab->new_alpha2, 2); in __ath11k_mac_register()
10334 ath11k_warn(ar->ab, in __ath11k_mac_register()
10340 ath11k_err(ar->ab, "debugfs registration failed: %d\n", ret); in __ath11k_mac_register()
10347 ieee80211_unregister_hw(ar->hw); in __ath11k_mac_register()
10350 kfree(ar->hw->wiphy->iface_combinations[0].limits); in __ath11k_mac_register()
10351 kfree(ar->hw->wiphy->iface_combinations); in __ath11k_mac_register()
10354 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); in __ath11k_mac_register()
10355 kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels); in __ath11k_mac_register()
10356 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels); in __ath11k_mac_register()
10359 SET_IEEE80211_DEV(ar->hw, NULL); in __ath11k_mac_register()
10371 if (test_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags)) in ath11k_mac_register()
10375 ab->cc_freq_hz = IPQ8074_CC_FREQ_HERTZ; in ath11k_mac_register()
10376 ab->free_vdev_map = (1LL << (ab->num_radios * TARGET_NUM_VDEVS(ab))) - 1; in ath11k_mac_register()
10382 device_get_mac_address(ab->dev, mac_addr); in ath11k_mac_register()
10384 for (i = 0; i < ab->num_radios; i++) { in ath11k_mac_register()
10385 pdev = &ab->pdevs[i]; in ath11k_mac_register()
10386 ar = pdev->ar; in ath11k_mac_register()
10387 if (ab->pdevs_macaddr_valid) { in ath11k_mac_register()
10388 ether_addr_copy(ar->mac_addr, pdev->mac_addr); in ath11k_mac_register()
10391 ether_addr_copy(ar->mac_addr, ab->mac_addr); in ath11k_mac_register()
10393 ether_addr_copy(ar->mac_addr, mac_addr); in ath11k_mac_register()
10394 ar->mac_addr[4] += i; in ath11k_mac_register()
10397 idr_init(&ar->txmgmt_idr); in ath11k_mac_register()
10398 spin_lock_init(&ar->txmgmt_idr_lock); in ath11k_mac_register()
10404 init_waitqueue_head(&ar->txmgmt_empty_waitq); in ath11k_mac_register()
10410 for (i = i - 1; i >= 0; i--) { in ath11k_mac_register()
10411 pdev = &ab->pdevs[i]; in ath11k_mac_register()
10412 ar = pdev->ar; in ath11k_mac_register()
10429 if (test_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags)) in ath11k_mac_allocate()
10432 for (i = 0; i < ab->num_radios; i++) { in ath11k_mac_allocate()
10433 pdev = &ab->pdevs[i]; in ath11k_mac_allocate()
10437 ret = -ENOMEM; in ath11k_mac_allocate()
10441 ar = hw->priv; in ath11k_mac_allocate()
10442 ar->hw = hw; in ath11k_mac_allocate()
10443 ar->ab = ab; in ath11k_mac_allocate()
10444 ar->pdev = pdev; in ath11k_mac_allocate()
10445 ar->pdev_idx = i; in ath11k_mac_allocate()
10446 ar->lmac_id = ath11k_hw_get_mac_from_pdev_id(&ab->hw_params, i); in ath11k_mac_allocate()
10448 ar->wmi = &ab->wmi_ab.wmi[i]; in ath11k_mac_allocate()
10454 ar->cfg_tx_chainmask = pdev->cap.tx_chain_mask; in ath11k_mac_allocate()
10455 ar->cfg_rx_chainmask = pdev->cap.rx_chain_mask; in ath11k_mac_allocate()
10456 ar->num_tx_chains = get_num_chains(pdev->cap.tx_chain_mask); in ath11k_mac_allocate()
10457 ar->num_rx_chains = get_num_chains(pdev->cap.rx_chain_mask); in ath11k_mac_allocate()
10459 pdev->ar = ar; in ath11k_mac_allocate()
10460 spin_lock_init(&ar->data_lock); in ath11k_mac_allocate()
10461 INIT_LIST_HEAD(&ar->arvifs); in ath11k_mac_allocate()
10462 INIT_LIST_HEAD(&ar->ppdu_stats_info); in ath11k_mac_allocate()
10463 mutex_init(&ar->conf_mutex); in ath11k_mac_allocate()
10464 init_completion(&ar->vdev_setup_done); in ath11k_mac_allocate()
10465 init_completion(&ar->vdev_delete_done); in ath11k_mac_allocate()
10466 init_completion(&ar->peer_assoc_done); in ath11k_mac_allocate()
10467 init_completion(&ar->peer_delete_done); in ath11k_mac_allocate()
10468 init_completion(&ar->install_key_done); in ath11k_mac_allocate()
10469 init_completion(&ar->bss_survey_done); in ath11k_mac_allocate()
10470 init_completion(&ar->scan.started); in ath11k_mac_allocate()
10471 init_completion(&ar->scan.completed); in ath11k_mac_allocate()
10472 init_completion(&ar->scan.on_channel); in ath11k_mac_allocate()
10473 init_completion(&ar->thermal.wmi_sync); in ath11k_mac_allocate()
10475 INIT_DELAYED_WORK(&ar->scan.timeout, ath11k_scan_timeout_work); in ath11k_mac_allocate()
10476 INIT_WORK(&ar->channel_update_work, ath11k_regd_update_chan_list_work); in ath11k_mac_allocate()
10477 INIT_LIST_HEAD(&ar->channel_update_queue); in ath11k_mac_allocate()
10478 INIT_WORK(&ar->regd_update_work, ath11k_regd_update_work); in ath11k_mac_allocate()
10480 INIT_WORK(&ar->wmi_mgmt_tx_work, ath11k_mgmt_over_wmi_tx_work); in ath11k_mac_allocate()
10481 skb_queue_head_init(&ar->wmi_mgmt_tx_queue); in ath11k_mac_allocate()
10483 clear_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags); in ath11k_mac_allocate()
10485 ar->monitor_vdev_id = -1; in ath11k_mac_allocate()
10486 clear_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags); in ath11k_mac_allocate()
10487 ar->vdev_id_11d_scan = ATH11K_11D_INVALID_VDEV_ID; in ath11k_mac_allocate()
10488 init_completion(&ar->completed_11d_scan); in ath11k_mac_allocate()
10507 for (i = 0; i < ab->num_radios; i++) { in ath11k_mac_destroy()
10508 pdev = &ab->pdevs[i]; in ath11k_mac_destroy()
10509 ar = pdev->ar; in ath11k_mac_destroy()
10513 ath11k_fw_stats_free(&ar->fw_stats); in ath11k_mac_destroy()
10514 ieee80211_free_hw(ar->hw); in ath11k_mac_destroy()
10515 pdev->ar = NULL; in ath11k_mac_destroy()
10523 struct ath11k *ar = arvif->ar; in ath11k_mac_vif_set_keepalive()
10527 lockdep_assert_held(&ar->conf_mutex); in ath11k_mac_vif_set_keepalive()
10529 if (arvif->vdev_type != WMI_VDEV_TYPE_STA) in ath11k_mac_vif_set_keepalive()
10532 if (!test_bit(WMI_TLV_SERVICE_STA_KEEP_ALIVE, ar->ab->wmi_ab.svc_map)) in ath11k_mac_vif_set_keepalive()
10535 arg.vdev_id = arvif->vdev_id; in ath11k_mac_vif_set_keepalive()
10542 ath11k_warn(ar->ab, "failed to set keepalive on vdev %i: %d\n", in ath11k_mac_vif_set_keepalive()
10543 arvif->vdev_id, ret); in ath11k_mac_vif_set_keepalive()