1 // SPDX-License-Identifier: BSD-3-Clause-Clear
3 * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
4 * Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
7 #include <net/mac80211.h>
8 #include <linux/etherdevice.h>
18 #include "debugfs_sta.h"
20 #define CHAN2G(_channel, _freq, _flags) { \
21 .band = NL80211_BAND_2GHZ, \
22 .hw_value = (_channel), \
23 .center_freq = (_freq), \
25 .max_antenna_gain = 0, \
29 #define CHAN5G(_channel, _freq, _flags) { \
30 .band = NL80211_BAND_5GHZ, \
31 .hw_value = (_channel), \
32 .center_freq = (_freq), \
34 .max_antenna_gain = 0, \
38 #define CHAN6G(_channel, _freq, _flags) { \
39 .band = NL80211_BAND_6GHZ, \
40 .hw_value = (_channel), \
41 .center_freq = (_freq), \
43 .max_antenna_gain = 0, \
47 static const struct ieee80211_channel ath11k_2ghz_channels[] = {
64 static const struct ieee80211_channel ath11k_5ghz_channels[] = {
94 static const struct ieee80211_channel ath11k_6ghz_channels[] = {
120 CHAN6G(101, 6455, 0),
121 CHAN6G(105, 6475, 0),
122 CHAN6G(109, 6495, 0),
123 CHAN6G(113, 6515, 0),
124 CHAN6G(117, 6535, 0),
125 CHAN6G(121, 6555, 0),
126 CHAN6G(125, 6575, 0),
127 CHAN6G(129, 6595, 0),
128 CHAN6G(133, 6615, 0),
129 CHAN6G(137, 6635, 0),
130 CHAN6G(141, 6655, 0),
131 CHAN6G(145, 6675, 0),
132 CHAN6G(149, 6695, 0),
133 CHAN6G(153, 6715, 0),
134 CHAN6G(157, 6735, 0),
135 CHAN6G(161, 6755, 0),
136 CHAN6G(165, 6775, 0),
137 CHAN6G(169, 6795, 0),
138 CHAN6G(173, 6815, 0),
139 CHAN6G(177, 6835, 0),
140 CHAN6G(181, 6855, 0),
141 CHAN6G(185, 6875, 0),
142 CHAN6G(189, 6895, 0),
143 CHAN6G(193, 6915, 0),
144 CHAN6G(197, 6935, 0),
145 CHAN6G(201, 6955, 0),
146 CHAN6G(205, 6975, 0),
147 CHAN6G(209, 6995, 0),
148 CHAN6G(213, 7015, 0),
149 CHAN6G(217, 7035, 0),
150 CHAN6G(221, 7055, 0),
151 CHAN6G(225, 7075, 0),
152 CHAN6G(229, 7095, 0),
153 CHAN6G(233, 7115, 0),
155 /* new addition in IEEE Std 802.11ax-2021 */
159 static struct ieee80211_rate ath11k_legacy_rates[] = {
161 .hw_value = ATH11K_HW_RATE_CCK_LP_1M },
163 .hw_value = ATH11K_HW_RATE_CCK_LP_2M,
164 .hw_value_short = ATH11K_HW_RATE_CCK_SP_2M,
165 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
167 .hw_value = ATH11K_HW_RATE_CCK_LP_5_5M,
168 .hw_value_short = ATH11K_HW_RATE_CCK_SP_5_5M,
169 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
171 .hw_value = ATH11K_HW_RATE_CCK_LP_11M,
172 .hw_value_short = ATH11K_HW_RATE_CCK_SP_11M,
173 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
175 { .bitrate = 60, .hw_value = ATH11K_HW_RATE_OFDM_6M },
176 { .bitrate = 90, .hw_value = ATH11K_HW_RATE_OFDM_9M },
177 { .bitrate = 120, .hw_value = ATH11K_HW_RATE_OFDM_12M },
178 { .bitrate = 180, .hw_value = ATH11K_HW_RATE_OFDM_18M },
179 { .bitrate = 240, .hw_value = ATH11K_HW_RATE_OFDM_24M },
180 { .bitrate = 360, .hw_value = ATH11K_HW_RATE_OFDM_36M },
181 { .bitrate = 480, .hw_value = ATH11K_HW_RATE_OFDM_48M },
182 { .bitrate = 540, .hw_value = ATH11K_HW_RATE_OFDM_54M },
186 ath11k_phymodes[NUM_NL80211_BANDS][ATH11K_CHAN_WIDTH_NUM] = {
187 [NL80211_BAND_2GHZ] = {
188 [NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
189 [NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
190 [NL80211_CHAN_WIDTH_20_NOHT] = MODE_11AX_HE20_2G,
191 [NL80211_CHAN_WIDTH_20] = MODE_11AX_HE20_2G,
192 [NL80211_CHAN_WIDTH_40] = MODE_11AX_HE40_2G,
193 [NL80211_CHAN_WIDTH_80] = MODE_11AX_HE80_2G,
194 [NL80211_CHAN_WIDTH_80P80] = MODE_UNKNOWN,
195 [NL80211_CHAN_WIDTH_160] = MODE_UNKNOWN,
197 [NL80211_BAND_5GHZ] = {
198 [NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
199 [NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
200 [NL80211_CHAN_WIDTH_20_NOHT] = MODE_11AX_HE20,
201 [NL80211_CHAN_WIDTH_20] = MODE_11AX_HE20,
202 [NL80211_CHAN_WIDTH_40] = MODE_11AX_HE40,
203 [NL80211_CHAN_WIDTH_80] = MODE_11AX_HE80,
204 [NL80211_CHAN_WIDTH_160] = MODE_11AX_HE160,
205 [NL80211_CHAN_WIDTH_80P80] = MODE_11AX_HE80_80,
207 [NL80211_BAND_6GHZ] = {
208 [NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
209 [NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
210 [NL80211_CHAN_WIDTH_20_NOHT] = MODE_11AX_HE20,
211 [NL80211_CHAN_WIDTH_20] = MODE_11AX_HE20,
212 [NL80211_CHAN_WIDTH_40] = MODE_11AX_HE40,
213 [NL80211_CHAN_WIDTH_80] = MODE_11AX_HE80,
214 [NL80211_CHAN_WIDTH_160] = MODE_11AX_HE160,
215 [NL80211_CHAN_WIDTH_80P80] = MODE_11AX_HE80_80,
220 const struct htt_rx_ring_tlv_filter ath11k_mac_mon_status_filter_default = {
221 .rx_filter = HTT_RX_FILTER_TLV_FLAGS_MPDU_START |
222 HTT_RX_FILTER_TLV_FLAGS_PPDU_END |
223 HTT_RX_FILTER_TLV_FLAGS_PPDU_END_STATUS_DONE,
224 .pkt_filter_flags0 = HTT_RX_FP_MGMT_FILTER_FLAGS0,
225 .pkt_filter_flags1 = HTT_RX_FP_MGMT_FILTER_FLAGS1,
226 .pkt_filter_flags2 = HTT_RX_FP_CTRL_FILTER_FLASG2,
227 .pkt_filter_flags3 = HTT_RX_FP_DATA_FILTER_FLASG3 |
228 HTT_RX_FP_CTRL_FILTER_FLASG3
231 #define ATH11K_MAC_FIRST_OFDM_RATE_IDX 4
232 #define ath11k_g_rates ath11k_legacy_rates
233 #define ath11k_g_rates_size (ARRAY_SIZE(ath11k_legacy_rates))
234 #define ath11k_a_rates (ath11k_legacy_rates + 4)
235 #define ath11k_a_rates_size (ARRAY_SIZE(ath11k_legacy_rates) - 4)
237 #define ATH11K_MAC_SCAN_TIMEOUT_MSECS 200 /* in msecs */
239 static const u32 ath11k_smps_map[] = {
240 [WLAN_HT_CAP_SM_PS_STATIC] = WMI_PEER_SMPS_STATIC,
241 [WLAN_HT_CAP_SM_PS_DYNAMIC] = WMI_PEER_SMPS_DYNAMIC,
242 [WLAN_HT_CAP_SM_PS_INVALID] = WMI_PEER_SMPS_PS_NONE,
243 [WLAN_HT_CAP_SM_PS_DISABLED] = WMI_PEER_SMPS_PS_NONE,
246 static int ath11k_start_vdev_delay(struct ieee80211_hw *hw,
247 struct ieee80211_vif *vif);
249 enum nl80211_he_ru_alloc ath11k_mac_phy_he_ru_to_nl80211_he_ru_alloc(u16 ru_phy)
251 enum nl80211_he_ru_alloc ret;
255 ret = NL80211_RATE_INFO_HE_RU_ALLOC_26;
258 ret = NL80211_RATE_INFO_HE_RU_ALLOC_52;
261 ret = NL80211_RATE_INFO_HE_RU_ALLOC_106;
264 ret = NL80211_RATE_INFO_HE_RU_ALLOC_242;
267 ret = NL80211_RATE_INFO_HE_RU_ALLOC_484;
270 ret = NL80211_RATE_INFO_HE_RU_ALLOC_996;
273 ret = NL80211_RATE_INFO_HE_RU_ALLOC_26;
280 enum nl80211_he_ru_alloc ath11k_mac_he_ru_tones_to_nl80211_he_ru_alloc(u16 ru_tones)
282 enum nl80211_he_ru_alloc ret;
286 ret = NL80211_RATE_INFO_HE_RU_ALLOC_26;
289 ret = NL80211_RATE_INFO_HE_RU_ALLOC_52;
292 ret = NL80211_RATE_INFO_HE_RU_ALLOC_106;
295 ret = NL80211_RATE_INFO_HE_RU_ALLOC_242;
298 ret = NL80211_RATE_INFO_HE_RU_ALLOC_484;
301 ret = NL80211_RATE_INFO_HE_RU_ALLOC_996;
304 ret = NL80211_RATE_INFO_HE_RU_ALLOC_2x996;
307 ret = NL80211_RATE_INFO_HE_RU_ALLOC_26;
314 enum nl80211_he_gi ath11k_mac_he_gi_to_nl80211_he_gi(u8 sgi)
316 enum nl80211_he_gi ret;
319 case RX_MSDU_START_SGI_0_8_US:
320 ret = NL80211_RATE_INFO_HE_GI_0_8;
322 case RX_MSDU_START_SGI_1_6_US:
323 ret = NL80211_RATE_INFO_HE_GI_1_6;
325 case RX_MSDU_START_SGI_3_2_US:
326 ret = NL80211_RATE_INFO_HE_GI_3_2;
329 ret = NL80211_RATE_INFO_HE_GI_0_8;
336 u8 ath11k_mac_bw_to_mac80211_bw(u8 bw)
342 ret = RATE_INFO_BW_20;
345 ret = RATE_INFO_BW_40;
348 ret = RATE_INFO_BW_80;
351 ret = RATE_INFO_BW_160;
358 enum ath11k_supported_bw ath11k_mac_mac80211_bw_to_ath11k_bw(enum rate_info_bw bw)
361 case RATE_INFO_BW_20:
363 case RATE_INFO_BW_40:
365 case RATE_INFO_BW_80:
367 case RATE_INFO_BW_160:
368 return ATH11K_BW_160;
374 int ath11k_mac_hw_ratecode_to_legacy_rate(u8 hw_rc, u8 preamble, u8 *rateidx,
377 /* As default, it is OFDM rates */
378 int i = ATH11K_MAC_FIRST_OFDM_RATE_IDX;
379 int max_rates_idx = ath11k_g_rates_size;
381 if (preamble == WMI_RATE_PREAMBLE_CCK) {
382 hw_rc &= ~ATH11k_HW_RATECODE_CCK_SHORT_PREAM_MASK;
384 max_rates_idx = ATH11K_MAC_FIRST_OFDM_RATE_IDX;
387 while (i < max_rates_idx) {
388 if (hw_rc == ath11k_legacy_rates[i].hw_value) {
390 *rate = ath11k_legacy_rates[i].bitrate;
399 static int get_num_chains(u32 mask)
412 u8 ath11k_mac_bitrate_to_idx(const struct ieee80211_supported_band *sband,
417 for (i = 0; i < sband->n_bitrates; i++)
418 if (sband->bitrates[i].bitrate == bitrate)
425 ath11k_mac_max_ht_nss(const u8 ht_mcs_mask[IEEE80211_HT_MCS_MASK_LEN])
429 for (nss = IEEE80211_HT_MCS_MASK_LEN - 1; nss >= 0; nss--)
430 if (ht_mcs_mask[nss])
437 ath11k_mac_max_vht_nss(const u16 vht_mcs_mask[NL80211_VHT_NSS_MAX])
441 for (nss = NL80211_VHT_NSS_MAX - 1; nss >= 0; nss--)
442 if (vht_mcs_mask[nss])
449 ath11k_mac_max_he_nss(const u16 he_mcs_mask[NL80211_HE_NSS_MAX])
453 for (nss = NL80211_HE_NSS_MAX - 1; nss >= 0; nss--)
454 if (he_mcs_mask[nss])
460 static u8 ath11k_parse_mpdudensity(u8 mpdudensity)
462 /* 802.11n D2.0 defined values for "Minimum MPDU Start Spacing":
463 * 0 for no restriction
472 switch (mpdudensity) {
478 /* Our lower layer calculations limit our precision to
495 static int ath11k_mac_vif_chan(struct ieee80211_vif *vif,
496 struct cfg80211_chan_def *def)
498 struct ieee80211_chanctx_conf *conf;
501 conf = rcu_dereference(vif->chanctx_conf);
513 static bool ath11k_mac_bitrate_is_cck(int bitrate)
526 u8 ath11k_mac_hw_rate_to_idx(const struct ieee80211_supported_band *sband,
527 u8 hw_rate, bool cck)
529 const struct ieee80211_rate *rate;
532 for (i = 0; i < sband->n_bitrates; i++) {
533 rate = &sband->bitrates[i];
535 if (ath11k_mac_bitrate_is_cck(rate->bitrate) != cck)
538 if (rate->hw_value == hw_rate)
540 else if (rate->flags & IEEE80211_RATE_SHORT_PREAMBLE &&
541 rate->hw_value_short == hw_rate)
548 static u8 ath11k_mac_bitrate_to_rate(int bitrate)
550 return DIV_ROUND_UP(bitrate, 5) |
551 (ath11k_mac_bitrate_is_cck(bitrate) ? BIT(7) : 0);
554 static void ath11k_get_arvif_iter(void *data, u8 *mac,
555 struct ieee80211_vif *vif)
557 struct ath11k_vif_iter *arvif_iter = data;
558 struct ath11k_vif *arvif = (void *)vif->drv_priv;
560 if (arvif->vdev_id == arvif_iter->vdev_id)
561 arvif_iter->arvif = arvif;
564 struct ath11k_vif *ath11k_mac_get_arvif(struct ath11k *ar, u32 vdev_id)
566 struct ath11k_vif_iter arvif_iter;
569 memset(&arvif_iter, 0, sizeof(struct ath11k_vif_iter));
570 arvif_iter.vdev_id = vdev_id;
572 flags = IEEE80211_IFACE_ITER_RESUME_ALL;
573 ieee80211_iterate_active_interfaces_atomic(ar->hw,
575 ath11k_get_arvif_iter,
577 if (!arvif_iter.arvif) {
578 ath11k_warn(ar->ab, "No VIF found for vdev %d\n", vdev_id);
582 return arvif_iter.arvif;
585 struct ath11k_vif *ath11k_mac_get_arvif_by_vdev_id(struct ath11k_base *ab,
589 struct ath11k_pdev *pdev;
590 struct ath11k_vif *arvif;
592 for (i = 0; i < ab->num_radios; i++) {
593 pdev = rcu_dereference(ab->pdevs_active[i]);
594 if (pdev && pdev->ar &&
595 (pdev->ar->allocated_vdev_map & (1LL << vdev_id))) {
596 arvif = ath11k_mac_get_arvif(pdev->ar, vdev_id);
605 struct ath11k *ath11k_mac_get_ar_by_vdev_id(struct ath11k_base *ab, u32 vdev_id)
608 struct ath11k_pdev *pdev;
610 for (i = 0; i < ab->num_radios; i++) {
611 pdev = rcu_dereference(ab->pdevs_active[i]);
612 if (pdev && pdev->ar) {
613 if (pdev->ar->allocated_vdev_map & (1LL << vdev_id))
621 struct ath11k *ath11k_mac_get_ar_by_pdev_id(struct ath11k_base *ab, u32 pdev_id)
624 struct ath11k_pdev *pdev;
626 if (ab->hw_params.single_pdev_only) {
627 pdev = rcu_dereference(ab->pdevs_active[0]);
628 return pdev ? pdev->ar : NULL;
631 if (WARN_ON(pdev_id > ab->num_radios))
634 for (i = 0; i < ab->num_radios; i++) {
635 pdev = rcu_dereference(ab->pdevs_active[i]);
637 if (pdev && pdev->pdev_id == pdev_id)
638 return (pdev->ar ? pdev->ar : NULL);
644 struct ath11k_vif *ath11k_mac_get_vif_up(struct ath11k_base *ab)
647 struct ath11k_pdev *pdev;
648 struct ath11k_vif *arvif;
651 for (i = 0; i < ab->num_radios; i++) {
652 pdev = &ab->pdevs[i];
654 list_for_each_entry(arvif, &ar->arvifs, list) {
663 static bool ath11k_mac_band_match(enum nl80211_band band1, enum WMI_HOST_WLAN_BAND band2)
665 return (((band1 == NL80211_BAND_2GHZ) && (band2 & WMI_HOST_WLAN_2G_CAP)) ||
666 (((band1 == NL80211_BAND_5GHZ) || (band1 == NL80211_BAND_6GHZ)) &&
667 (band2 & WMI_HOST_WLAN_5G_CAP)));
670 u8 ath11k_mac_get_target_pdev_id_from_vif(struct ath11k_vif *arvif)
672 struct ath11k *ar = arvif->ar;
673 struct ath11k_base *ab = ar->ab;
674 struct ieee80211_vif *vif = arvif->vif;
675 struct cfg80211_chan_def def;
676 enum nl80211_band band;
677 u8 pdev_id = ab->target_pdev_ids[0].pdev_id;
680 if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
683 band = def.chan->band;
685 for (i = 0; i < ab->target_pdev_count; i++) {
686 if (ath11k_mac_band_match(band, ab->target_pdev_ids[i].supported_bands))
687 return ab->target_pdev_ids[i].pdev_id;
693 u8 ath11k_mac_get_target_pdev_id(struct ath11k *ar)
695 struct ath11k_vif *arvif;
697 arvif = ath11k_mac_get_vif_up(ar->ab);
700 return ath11k_mac_get_target_pdev_id_from_vif(arvif);
702 return ar->ab->target_pdev_ids[0].pdev_id;
705 static void ath11k_pdev_caps_update(struct ath11k *ar)
707 struct ath11k_base *ab = ar->ab;
709 ar->max_tx_power = ab->target_caps.hw_max_tx_power;
711 /* FIXME Set min_tx_power to ab->target_caps.hw_min_tx_power.
712 * But since the received value in svcrdy is same as hw_max_tx_power,
713 * we can set ar->min_tx_power to 0 currently until
714 * this is fixed in firmware
716 ar->min_tx_power = 0;
718 ar->txpower_limit_2g = ar->max_tx_power;
719 ar->txpower_limit_5g = ar->max_tx_power;
720 ar->txpower_scale = WMI_HOST_TP_SCALE_MAX;
723 static int ath11k_mac_txpower_recalc(struct ath11k *ar)
725 struct ath11k_pdev *pdev = ar->pdev;
726 struct ath11k_vif *arvif;
727 int ret, txpower = -1;
730 lockdep_assert_held(&ar->conf_mutex);
732 list_for_each_entry(arvif, &ar->arvifs, list) {
733 if (arvif->txpower <= 0)
737 txpower = arvif->txpower;
739 txpower = min(txpower, arvif->txpower);
745 /* txpwr is set as 2 units per dBm in FW*/
746 txpower = min_t(u32, max_t(u32, ar->min_tx_power, txpower),
747 ar->max_tx_power) * 2;
749 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "txpower to set in hw %d\n",
752 if ((pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) &&
753 ar->txpower_limit_2g != txpower) {
754 param = WMI_PDEV_PARAM_TXPOWER_LIMIT2G;
755 ret = ath11k_wmi_pdev_set_param(ar, param,
756 txpower, ar->pdev->pdev_id);
759 ar->txpower_limit_2g = txpower;
762 if ((pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) &&
763 ar->txpower_limit_5g != txpower) {
764 param = WMI_PDEV_PARAM_TXPOWER_LIMIT5G;
765 ret = ath11k_wmi_pdev_set_param(ar, param,
766 txpower, ar->pdev->pdev_id);
769 ar->txpower_limit_5g = txpower;
775 ath11k_warn(ar->ab, "failed to recalc txpower limit %d using pdev param %d: %d\n",
776 txpower / 2, param, ret);
780 static int ath11k_recalc_rtscts_prot(struct ath11k_vif *arvif)
782 struct ath11k *ar = arvif->ar;
783 u32 vdev_param, rts_cts = 0;
786 lockdep_assert_held(&ar->conf_mutex);
788 vdev_param = WMI_VDEV_PARAM_ENABLE_RTSCTS;
790 /* Enable RTS/CTS protection for sw retries (when legacy stations
791 * are in BSS) or by default only for second rate series.
792 * TODO: Check if we need to enable CTS 2 Self in any case
794 rts_cts = WMI_USE_RTS_CTS;
796 if (arvif->num_legacy_stations > 0)
797 rts_cts |= WMI_RTSCTS_ACROSS_SW_RETRIES << 4;
799 rts_cts |= WMI_RTSCTS_FOR_SECOND_RATESERIES << 4;
801 /* Need not send duplicate param value to firmware */
802 if (arvif->rtscts_prot_mode == rts_cts)
805 arvif->rtscts_prot_mode = rts_cts;
807 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac vdev %d recalc rts/cts prot %d\n",
808 arvif->vdev_id, rts_cts);
810 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
811 vdev_param, rts_cts);
813 ath11k_warn(ar->ab, "failed to recalculate rts/cts prot for vdev %d: %d\n",
814 arvif->vdev_id, ret);
819 static int ath11k_mac_set_kickout(struct ath11k_vif *arvif)
821 struct ath11k *ar = arvif->ar;
825 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_STA_KICKOUT_TH,
826 ATH11K_KICKOUT_THRESHOLD,
829 ath11k_warn(ar->ab, "failed to set kickout threshold on vdev %i: %d\n",
830 arvif->vdev_id, ret);
834 param = WMI_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS;
835 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param,
836 ATH11K_KEEPALIVE_MIN_IDLE);
838 ath11k_warn(ar->ab, "failed to set keepalive minimum idle time on vdev %i: %d\n",
839 arvif->vdev_id, ret);
843 param = WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS;
844 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param,
845 ATH11K_KEEPALIVE_MAX_IDLE);
847 ath11k_warn(ar->ab, "failed to set keepalive maximum idle time on vdev %i: %d\n",
848 arvif->vdev_id, ret);
852 param = WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS;
853 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param,
854 ATH11K_KEEPALIVE_MAX_UNRESPONSIVE);
856 ath11k_warn(ar->ab, "failed to set keepalive maximum unresponsive time on vdev %i: %d\n",
857 arvif->vdev_id, ret);
864 void ath11k_mac_peer_cleanup_all(struct ath11k *ar)
866 struct ath11k_peer *peer, *tmp;
867 struct ath11k_base *ab = ar->ab;
869 lockdep_assert_held(&ar->conf_mutex);
871 spin_lock_bh(&ab->base_lock);
872 list_for_each_entry_safe(peer, tmp, &ab->peers, list) {
873 ath11k_peer_rx_tid_cleanup(ar, peer);
874 list_del(&peer->list);
877 spin_unlock_bh(&ab->base_lock);
880 ar->num_stations = 0;
883 static inline int ath11k_mac_vdev_setup_sync(struct ath11k *ar)
885 lockdep_assert_held(&ar->conf_mutex);
887 if (test_bit(ATH11K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags))
890 if (!wait_for_completion_timeout(&ar->vdev_setup_done,
891 ATH11K_VDEV_SETUP_TIMEOUT_HZ))
894 return ar->last_wmi_vdev_start_status ? -EINVAL : 0;
898 ath11k_mac_get_any_chandef_iter(struct ieee80211_hw *hw,
899 struct ieee80211_chanctx_conf *conf,
902 struct cfg80211_chan_def **def = data;
907 static int ath11k_mac_monitor_vdev_start(struct ath11k *ar, int vdev_id,
908 struct cfg80211_chan_def *chandef)
910 struct ieee80211_channel *channel;
911 struct wmi_vdev_start_req_arg arg = {};
914 lockdep_assert_held(&ar->conf_mutex);
916 channel = chandef->chan;
918 arg.vdev_id = vdev_id;
919 arg.channel.freq = channel->center_freq;
920 arg.channel.band_center_freq1 = chandef->center_freq1;
921 arg.channel.band_center_freq2 = chandef->center_freq2;
923 arg.channel.mode = ath11k_phymodes[chandef->chan->band][chandef->width];
924 arg.channel.chan_radar = !!(channel->flags & IEEE80211_CHAN_RADAR);
926 arg.channel.min_power = 0;
927 arg.channel.max_power = channel->max_power;
928 arg.channel.max_reg_power = channel->max_reg_power;
929 arg.channel.max_antenna_gain = channel->max_antenna_gain;
931 arg.pref_tx_streams = ar->num_tx_chains;
932 arg.pref_rx_streams = ar->num_rx_chains;
934 arg.channel.passive = !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR);
936 reinit_completion(&ar->vdev_setup_done);
937 reinit_completion(&ar->vdev_delete_done);
939 ret = ath11k_wmi_vdev_start(ar, &arg, false);
941 ath11k_warn(ar->ab, "failed to request monitor vdev %i start: %d\n",
946 ret = ath11k_mac_vdev_setup_sync(ar);
948 ath11k_warn(ar->ab, "failed to synchronize setup for monitor vdev %i start: %d\n",
953 ret = ath11k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr);
955 ath11k_warn(ar->ab, "failed to put up monitor vdev %i: %d\n",
960 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac monitor vdev %i started\n",
966 reinit_completion(&ar->vdev_setup_done);
968 ret = ath11k_wmi_vdev_stop(ar, vdev_id);
970 ath11k_warn(ar->ab, "failed to stop monitor vdev %i after start failure: %d\n",
975 ret = ath11k_mac_vdev_setup_sync(ar);
977 ath11k_warn(ar->ab, "failed to synchronize setup for vdev %i stop: %d\n",
985 static int ath11k_mac_monitor_vdev_stop(struct ath11k *ar)
989 lockdep_assert_held(&ar->conf_mutex);
991 reinit_completion(&ar->vdev_setup_done);
993 ret = ath11k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
995 ath11k_warn(ar->ab, "failed to request monitor vdev %i stop: %d\n",
996 ar->monitor_vdev_id, ret);
1000 ret = ath11k_mac_vdev_setup_sync(ar);
1002 ath11k_warn(ar->ab, "failed to synchronize monitor vdev %i stop: %d\n",
1003 ar->monitor_vdev_id, ret);
1007 ret = ath11k_wmi_vdev_down(ar, ar->monitor_vdev_id);
1009 ath11k_warn(ar->ab, "failed to put down monitor vdev %i: %d\n",
1010 ar->monitor_vdev_id, ret);
1014 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac monitor vdev %i stopped\n",
1015 ar->monitor_vdev_id);
1020 static int ath11k_mac_monitor_vdev_create(struct ath11k *ar)
1022 struct ath11k_pdev *pdev = ar->pdev;
1023 struct vdev_create_params param = {};
1025 u8 tmp_addr[6] = {0};
1028 lockdep_assert_held(&ar->conf_mutex);
1030 if (test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags))
1033 if (ar->ab->free_vdev_map == 0) {
1034 ath11k_warn(ar->ab, "failed to find free vdev id for monitor vdev\n");
1038 bit = __ffs64(ar->ab->free_vdev_map);
1040 ar->monitor_vdev_id = bit;
1042 param.if_id = ar->monitor_vdev_id;
1043 param.type = WMI_VDEV_TYPE_MONITOR;
1044 param.subtype = WMI_VDEV_SUBTYPE_NONE;
1045 param.pdev_id = pdev->pdev_id;
1047 if (pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) {
1048 param.chains[NL80211_BAND_2GHZ].tx = ar->num_tx_chains;
1049 param.chains[NL80211_BAND_2GHZ].rx = ar->num_rx_chains;
1051 if (pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) {
1052 param.chains[NL80211_BAND_5GHZ].tx = ar->num_tx_chains;
1053 param.chains[NL80211_BAND_5GHZ].rx = ar->num_rx_chains;
1056 ret = ath11k_wmi_vdev_create(ar, tmp_addr, ¶m);
1058 ath11k_warn(ar->ab, "failed to request monitor vdev %i creation: %d\n",
1059 ar->monitor_vdev_id, ret);
1060 ar->monitor_vdev_id = -1;
1064 nss = get_num_chains(ar->cfg_tx_chainmask) ? : 1;
1065 ret = ath11k_wmi_vdev_set_param_cmd(ar, ar->monitor_vdev_id,
1066 WMI_VDEV_PARAM_NSS, nss);
1068 ath11k_warn(ar->ab, "failed to set vdev %d chainmask 0x%x, nss %d :%d\n",
1069 ar->monitor_vdev_id, ar->cfg_tx_chainmask, nss, ret);
1073 ret = ath11k_mac_txpower_recalc(ar);
1075 ath11k_warn(ar->ab, "failed to recalc txpower for monitor vdev %d: %d\n",
1076 ar->monitor_vdev_id, ret);
1080 ar->allocated_vdev_map |= 1LL << ar->monitor_vdev_id;
1081 ar->ab->free_vdev_map &= ~(1LL << ar->monitor_vdev_id);
1082 ar->num_created_vdevs++;
1083 set_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags);
1085 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac monitor vdev %d created\n",
1086 ar->monitor_vdev_id);
1091 ath11k_wmi_vdev_delete(ar, ar->monitor_vdev_id);
1092 ar->monitor_vdev_id = -1;
1096 static int ath11k_mac_monitor_vdev_delete(struct ath11k *ar)
1099 unsigned long time_left;
1101 lockdep_assert_held(&ar->conf_mutex);
1103 if (!test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags))
1106 reinit_completion(&ar->vdev_delete_done);
1108 ret = ath11k_wmi_vdev_delete(ar, ar->monitor_vdev_id);
1110 ath11k_warn(ar->ab, "failed to request wmi monitor vdev %i removal: %d\n",
1111 ar->monitor_vdev_id, ret);
1115 time_left = wait_for_completion_timeout(&ar->vdev_delete_done,
1116 ATH11K_VDEV_DELETE_TIMEOUT_HZ);
1117 if (time_left == 0) {
1118 ath11k_warn(ar->ab, "Timeout in receiving vdev delete response\n");
1120 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac monitor vdev %d deleted\n",
1121 ar->monitor_vdev_id);
1123 ar->allocated_vdev_map &= ~(1LL << ar->monitor_vdev_id);
1124 ar->ab->free_vdev_map |= 1LL << (ar->monitor_vdev_id);
1125 ar->num_created_vdevs--;
1126 ar->monitor_vdev_id = -1;
1127 clear_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags);
1133 static int ath11k_mac_monitor_start(struct ath11k *ar)
1135 struct cfg80211_chan_def *chandef = NULL;
1138 lockdep_assert_held(&ar->conf_mutex);
1140 if (test_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags))
1143 ieee80211_iter_chan_contexts_atomic(ar->hw,
1144 ath11k_mac_get_any_chandef_iter,
1149 ret = ath11k_mac_monitor_vdev_start(ar, ar->monitor_vdev_id, chandef);
1151 ath11k_warn(ar->ab, "failed to start monitor vdev: %d\n", ret);
1152 ath11k_mac_monitor_vdev_delete(ar);
1156 set_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags);
1158 ar->num_started_vdevs++;
1159 ret = ath11k_dp_tx_htt_monitor_mode_ring_config(ar, false);
1161 ath11k_warn(ar->ab, "failed to configure htt monitor mode ring during start: %d",
1166 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac monitor started\n");
1171 static int ath11k_mac_monitor_stop(struct ath11k *ar)
1175 lockdep_assert_held(&ar->conf_mutex);
1177 if (!test_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags))
1180 ret = ath11k_mac_monitor_vdev_stop(ar);
1182 ath11k_warn(ar->ab, "failed to stop monitor vdev: %d\n", ret);
1186 clear_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags);
1187 ar->num_started_vdevs--;
1189 ret = ath11k_dp_tx_htt_monitor_mode_ring_config(ar, true);
1191 ath11k_warn(ar->ab, "failed to configure htt monitor mode ring during stop: %d",
1196 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac monitor stopped ret %d\n", ret);
1201 static int ath11k_mac_vif_setup_ps(struct ath11k_vif *arvif)
1203 struct ath11k *ar = arvif->ar;
1204 struct ieee80211_vif *vif = arvif->vif;
1205 struct ieee80211_conf *conf = &ar->hw->conf;
1206 enum wmi_sta_powersave_param param;
1207 enum wmi_sta_ps_mode psmode;
1212 lockdep_assert_held(&arvif->ar->conf_mutex);
1214 if (arvif->vif->type != NL80211_IFTYPE_STATION)
1217 enable_ps = arvif->ps;
1219 if (!arvif->is_started) {
1220 /* mac80211 can update vif powersave state while disconnected.
1221 * Firmware doesn't behave nicely and consumes more power than
1222 * necessary if PS is disabled on a non-started vdev. Hence
1223 * force-enable PS for non-running vdevs.
1225 psmode = WMI_STA_PS_MODE_ENABLED;
1226 } else if (enable_ps) {
1227 psmode = WMI_STA_PS_MODE_ENABLED;
1228 param = WMI_STA_PS_PARAM_INACTIVITY_TIME;
1230 timeout = conf->dynamic_ps_timeout;
1232 /* firmware doesn't like 0 */
1233 timeout = ieee80211_tu_to_usec(vif->bss_conf.beacon_int) / 1000;
1236 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param,
1239 ath11k_warn(ar->ab, "failed to set inactivity time for vdev %d: %i\n",
1240 arvif->vdev_id, ret);
1244 psmode = WMI_STA_PS_MODE_DISABLED;
1247 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac vdev %d psmode %s\n",
1248 arvif->vdev_id, psmode ? "enable" : "disable");
1250 ret = ath11k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id, psmode);
1252 ath11k_warn(ar->ab, "failed to set sta power save mode %d for vdev %d: %d\n",
1253 psmode, arvif->vdev_id, ret);
1260 static int ath11k_mac_config_ps(struct ath11k *ar)
1262 struct ath11k_vif *arvif;
1265 lockdep_assert_held(&ar->conf_mutex);
1267 list_for_each_entry(arvif, &ar->arvifs, list) {
1268 ret = ath11k_mac_vif_setup_ps(arvif);
1270 ath11k_warn(ar->ab, "failed to setup powersave: %d\n", ret);
1278 static int ath11k_mac_op_config(struct ieee80211_hw *hw, u32 changed)
1280 struct ath11k *ar = hw->priv;
1281 struct ieee80211_conf *conf = &hw->conf;
1284 mutex_lock(&ar->conf_mutex);
1286 if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
1287 if (conf->flags & IEEE80211_CONF_MONITOR) {
1288 set_bit(ATH11K_FLAG_MONITOR_CONF_ENABLED, &ar->monitor_flags);
1290 if (test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED,
1291 &ar->monitor_flags))
1294 ret = ath11k_mac_monitor_vdev_create(ar);
1296 ath11k_warn(ar->ab, "failed to create monitor vdev: %d",
1301 ret = ath11k_mac_monitor_start(ar);
1303 ath11k_warn(ar->ab, "failed to start monitor: %d",
1308 clear_bit(ATH11K_FLAG_MONITOR_CONF_ENABLED, &ar->monitor_flags);
1310 if (!test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED,
1311 &ar->monitor_flags))
1314 ret = ath11k_mac_monitor_stop(ar);
1316 ath11k_warn(ar->ab, "failed to stop monitor: %d",
1321 ret = ath11k_mac_monitor_vdev_delete(ar);
1323 ath11k_warn(ar->ab, "failed to delete monitor vdev: %d",
1331 mutex_unlock(&ar->conf_mutex);
1335 ath11k_mac_monitor_vdev_delete(ar);
1336 mutex_unlock(&ar->conf_mutex);
1340 static int ath11k_mac_setup_bcn_tmpl(struct ath11k_vif *arvif)
1342 struct ath11k *ar = arvif->ar;
1343 struct ath11k_base *ab = ar->ab;
1344 struct ieee80211_hw *hw = ar->hw;
1345 struct ieee80211_vif *vif = arvif->vif;
1346 struct ieee80211_mutable_offsets offs = {};
1347 struct sk_buff *bcn;
1348 struct ieee80211_mgmt *mgmt;
1352 if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
1355 bcn = ieee80211_beacon_get_template(hw, vif, &offs);
1357 ath11k_warn(ab, "failed to get beacon template from mac80211\n");
1361 ies = bcn->data + ieee80211_get_hdrlen_from_skb(bcn);
1362 ies += sizeof(mgmt->u.beacon);
1364 if (cfg80211_find_ie(WLAN_EID_RSN, ies, (skb_tail_pointer(bcn) - ies)))
1365 arvif->rsnie_present = true;
1367 arvif->rsnie_present = false;
1369 if (cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
1370 WLAN_OUI_TYPE_MICROSOFT_WPA,
1371 ies, (skb_tail_pointer(bcn) - ies)))
1372 arvif->wpaie_present = true;
1374 arvif->wpaie_present = false;
1376 ret = ath11k_wmi_bcn_tmpl(ar, arvif->vdev_id, &offs, bcn);
1381 ath11k_warn(ab, "failed to submit beacon template command: %d\n",
1387 void ath11k_mac_bcn_tx_event(struct ath11k_vif *arvif)
1389 struct ieee80211_vif *vif = arvif->vif;
1391 if (!vif->color_change_active && !arvif->bcca_zero_sent)
1394 if (vif->color_change_active && ieee80211_beacon_cntdwn_is_complete(vif)) {
1395 arvif->bcca_zero_sent = true;
1396 ieee80211_color_change_finish(vif);
1400 arvif->bcca_zero_sent = false;
1402 if (vif->color_change_active)
1403 ieee80211_beacon_update_cntdwn(vif);
1404 ath11k_mac_setup_bcn_tmpl(arvif);
1407 static void ath11k_control_beaconing(struct ath11k_vif *arvif,
1408 struct ieee80211_bss_conf *info)
1410 struct ath11k *ar = arvif->ar;
1413 lockdep_assert_held(&arvif->ar->conf_mutex);
1415 if (!info->enable_beacon) {
1416 ret = ath11k_wmi_vdev_down(ar, arvif->vdev_id);
1418 ath11k_warn(ar->ab, "failed to down vdev_id %i: %d\n",
1419 arvif->vdev_id, ret);
1421 arvif->is_up = false;
1425 /* Install the beacon template to the FW */
1426 ret = ath11k_mac_setup_bcn_tmpl(arvif);
1428 ath11k_warn(ar->ab, "failed to update bcn tmpl during vdev up: %d\n",
1433 arvif->tx_seq_no = 0x1000;
1437 ether_addr_copy(arvif->bssid, info->bssid);
1439 ret = ath11k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
1442 ath11k_warn(ar->ab, "failed to bring up vdev %d: %i\n",
1443 arvif->vdev_id, ret);
1447 arvif->is_up = true;
1449 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac vdev %d up\n", arvif->vdev_id);
1452 static void ath11k_mac_handle_beacon_iter(void *data, u8 *mac,
1453 struct ieee80211_vif *vif)
1455 struct sk_buff *skb = data;
1456 struct ieee80211_mgmt *mgmt = (void *)skb->data;
1457 struct ath11k_vif *arvif = (void *)vif->drv_priv;
1459 if (vif->type != NL80211_IFTYPE_STATION)
1462 if (!ether_addr_equal(mgmt->bssid, vif->bss_conf.bssid))
1465 cancel_delayed_work(&arvif->connection_loss_work);
1468 void ath11k_mac_handle_beacon(struct ath11k *ar, struct sk_buff *skb)
1470 ieee80211_iterate_active_interfaces_atomic(ar->hw,
1471 IEEE80211_IFACE_ITER_NORMAL,
1472 ath11k_mac_handle_beacon_iter,
1476 static void ath11k_mac_handle_beacon_miss_iter(void *data, u8 *mac,
1477 struct ieee80211_vif *vif)
1479 u32 *vdev_id = data;
1480 struct ath11k_vif *arvif = (void *)vif->drv_priv;
1481 struct ath11k *ar = arvif->ar;
1482 struct ieee80211_hw *hw = ar->hw;
1484 if (arvif->vdev_id != *vdev_id)
1490 ieee80211_beacon_loss(vif);
1492 /* Firmware doesn't report beacon loss events repeatedly. If AP probe
1493 * (done by mac80211) succeeds but beacons do not resume then it
1494 * doesn't make sense to continue operation. Queue connection loss work
1495 * which can be cancelled when beacon is received.
1497 ieee80211_queue_delayed_work(hw, &arvif->connection_loss_work,
1498 ATH11K_CONNECTION_LOSS_HZ);
1501 void ath11k_mac_handle_beacon_miss(struct ath11k *ar, u32 vdev_id)
1503 ieee80211_iterate_active_interfaces_atomic(ar->hw,
1504 IEEE80211_IFACE_ITER_NORMAL,
1505 ath11k_mac_handle_beacon_miss_iter,
1509 static void ath11k_mac_vif_sta_connection_loss_work(struct work_struct *work)
1511 struct ath11k_vif *arvif = container_of(work, struct ath11k_vif,
1512 connection_loss_work.work);
1513 struct ieee80211_vif *vif = arvif->vif;
1518 ieee80211_connection_loss(vif);
1521 static void ath11k_peer_assoc_h_basic(struct ath11k *ar,
1522 struct ieee80211_vif *vif,
1523 struct ieee80211_sta *sta,
1524 struct peer_assoc_params *arg)
1526 struct ath11k_vif *arvif = (void *)vif->drv_priv;
1529 lockdep_assert_held(&ar->conf_mutex);
1531 if (vif->type == NL80211_IFTYPE_STATION)
1532 aid = vif->bss_conf.aid;
1536 ether_addr_copy(arg->peer_mac, sta->addr);
1537 arg->vdev_id = arvif->vdev_id;
1538 arg->peer_associd = aid;
1539 arg->auth_flag = true;
1540 /* TODO: STA WAR in ath10k for listen interval required? */
1541 arg->peer_listen_intval = ar->hw->conf.listen_interval;
1543 arg->peer_caps = vif->bss_conf.assoc_capability;
1546 static void ath11k_peer_assoc_h_crypto(struct ath11k *ar,
1547 struct ieee80211_vif *vif,
1548 struct ieee80211_sta *sta,
1549 struct peer_assoc_params *arg)
1551 struct ieee80211_bss_conf *info = &vif->bss_conf;
1552 struct cfg80211_chan_def def;
1553 struct cfg80211_bss *bss;
1554 struct ath11k_vif *arvif = (struct ath11k_vif *)vif->drv_priv;
1555 const u8 *rsnie = NULL;
1556 const u8 *wpaie = NULL;
1558 lockdep_assert_held(&ar->conf_mutex);
1560 if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
1563 bss = cfg80211_get_bss(ar->hw->wiphy, def.chan, info->bssid, NULL, 0,
1564 IEEE80211_BSS_TYPE_ANY, IEEE80211_PRIVACY_ANY);
1566 if (arvif->rsnie_present || arvif->wpaie_present) {
1567 arg->need_ptk_4_way = true;
1568 if (arvif->wpaie_present)
1569 arg->need_gtk_2_way = true;
1571 const struct cfg80211_bss_ies *ies;
1574 rsnie = ieee80211_bss_get_ie(bss, WLAN_EID_RSN);
1576 ies = rcu_dereference(bss->ies);
1578 wpaie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
1579 WLAN_OUI_TYPE_MICROSOFT_WPA,
1583 cfg80211_put_bss(ar->hw->wiphy, bss);
1586 /* FIXME: base on RSN IE/WPA IE is a correct idea? */
1587 if (rsnie || wpaie) {
1588 ath11k_dbg(ar->ab, ATH11K_DBG_WMI,
1589 "%s: rsn ie found\n", __func__);
1590 arg->need_ptk_4_way = true;
1594 ath11k_dbg(ar->ab, ATH11K_DBG_WMI,
1595 "%s: wpa ie found\n", __func__);
1596 arg->need_gtk_2_way = true;
1600 /* TODO: Need to check if FW supports PMF? */
1601 arg->is_pmf_enabled = true;
1604 /* TODO: safe_mode_enabled (bypass 4-way handshake) flag req? */
1607 static void ath11k_peer_assoc_h_rates(struct ath11k *ar,
1608 struct ieee80211_vif *vif,
1609 struct ieee80211_sta *sta,
1610 struct peer_assoc_params *arg)
1612 struct ath11k_vif *arvif = (void *)vif->drv_priv;
1613 struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates;
1614 struct cfg80211_chan_def def;
1615 const struct ieee80211_supported_band *sband;
1616 const struct ieee80211_rate *rates;
1617 enum nl80211_band band;
1622 lockdep_assert_held(&ar->conf_mutex);
1624 if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
1627 band = def.chan->band;
1628 sband = ar->hw->wiphy->bands[band];
1629 ratemask = sta->supp_rates[band];
1630 ratemask &= arvif->bitrate_mask.control[band].legacy;
1631 rates = sband->bitrates;
1633 rateset->num_rates = 0;
1635 for (i = 0; i < 32; i++, ratemask >>= 1, rates++) {
1636 if (!(ratemask & 1))
1639 rate = ath11k_mac_bitrate_to_rate(rates->bitrate);
1640 rateset->rates[rateset->num_rates] = rate;
1641 rateset->num_rates++;
1646 ath11k_peer_assoc_h_ht_masked(const u8 ht_mcs_mask[IEEE80211_HT_MCS_MASK_LEN])
1650 for (nss = 0; nss < IEEE80211_HT_MCS_MASK_LEN; nss++)
1651 if (ht_mcs_mask[nss])
1658 ath11k_peer_assoc_h_vht_masked(const u16 vht_mcs_mask[])
1662 for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++)
1663 if (vht_mcs_mask[nss])
1669 static void ath11k_peer_assoc_h_ht(struct ath11k *ar,
1670 struct ieee80211_vif *vif,
1671 struct ieee80211_sta *sta,
1672 struct peer_assoc_params *arg)
1674 const struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
1675 struct ath11k_vif *arvif = (void *)vif->drv_priv;
1676 struct cfg80211_chan_def def;
1677 enum nl80211_band band;
1678 const u8 *ht_mcs_mask;
1683 lockdep_assert_held(&ar->conf_mutex);
1685 if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
1688 if (!ht_cap->ht_supported)
1691 band = def.chan->band;
1692 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
1694 if (ath11k_peer_assoc_h_ht_masked(ht_mcs_mask))
1697 arg->ht_flag = true;
1699 arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
1700 ht_cap->ampdu_factor)) - 1;
1702 arg->peer_mpdu_density =
1703 ath11k_parse_mpdudensity(ht_cap->ampdu_density);
1705 arg->peer_ht_caps = ht_cap->cap;
1706 arg->peer_rate_caps |= WMI_HOST_RC_HT_FLAG;
1708 if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING)
1709 arg->ldpc_flag = true;
1711 if (sta->bandwidth >= IEEE80211_STA_RX_BW_40) {
1713 arg->peer_rate_caps |= WMI_HOST_RC_CW40_FLAG;
1716 /* As firmware handles this two flags (IEEE80211_HT_CAP_SGI_20
1717 * and IEEE80211_HT_CAP_SGI_40) for enabling SGI, we reset
1718 * both flags if guard interval is Default GI
1720 if (arvif->bitrate_mask.control[band].gi == NL80211_TXRATE_DEFAULT_GI)
1721 arg->peer_ht_caps &= ~(IEEE80211_HT_CAP_SGI_20 |
1722 IEEE80211_HT_CAP_SGI_40);
1724 if (arvif->bitrate_mask.control[band].gi != NL80211_TXRATE_FORCE_LGI) {
1725 if (ht_cap->cap & (IEEE80211_HT_CAP_SGI_20 |
1726 IEEE80211_HT_CAP_SGI_40))
1727 arg->peer_rate_caps |= WMI_HOST_RC_SGI_FLAG;
1730 if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) {
1731 arg->peer_rate_caps |= WMI_HOST_RC_TX_STBC_FLAG;
1732 arg->stbc_flag = true;
1735 if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) {
1736 stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC;
1737 stbc = stbc >> IEEE80211_HT_CAP_RX_STBC_SHIFT;
1738 stbc = stbc << WMI_HOST_RC_RX_STBC_FLAG_S;
1739 arg->peer_rate_caps |= stbc;
1740 arg->stbc_flag = true;
1743 if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2])
1744 arg->peer_rate_caps |= WMI_HOST_RC_TS_FLAG;
1745 else if (ht_cap->mcs.rx_mask[1])
1746 arg->peer_rate_caps |= WMI_HOST_RC_DS_FLAG;
1748 for (i = 0, n = 0, max_nss = 0; i < IEEE80211_HT_MCS_MASK_LEN * 8; i++)
1749 if ((ht_cap->mcs.rx_mask[i / 8] & BIT(i % 8)) &&
1750 (ht_mcs_mask[i / 8] & BIT(i % 8))) {
1751 max_nss = (i / 8) + 1;
1752 arg->peer_ht_rates.rates[n++] = i;
1755 /* This is a workaround for HT-enabled STAs which break the spec
1756 * and have no HT capabilities RX mask (no HT RX MCS map).
1758 * As per spec, in section 20.3.5 Modulation and coding scheme (MCS),
1759 * MCS 0 through 7 are mandatory in 20MHz with 800 ns GI at all STAs.
1761 * Firmware asserts if such situation occurs.
1764 arg->peer_ht_rates.num_rates = 8;
1765 for (i = 0; i < arg->peer_ht_rates.num_rates; i++)
1766 arg->peer_ht_rates.rates[i] = i;
1768 arg->peer_ht_rates.num_rates = n;
1769 arg->peer_nss = min(sta->rx_nss, max_nss);
1772 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n",
1774 arg->peer_ht_rates.num_rates,
1778 static int ath11k_mac_get_max_vht_mcs_map(u16 mcs_map, int nss)
1780 switch ((mcs_map >> (2 * nss)) & 0x3) {
1781 case IEEE80211_VHT_MCS_SUPPORT_0_7: return BIT(8) - 1;
1782 case IEEE80211_VHT_MCS_SUPPORT_0_8: return BIT(9) - 1;
1783 case IEEE80211_VHT_MCS_SUPPORT_0_9: return BIT(10) - 1;
1789 ath11k_peer_assoc_h_vht_limit(u16 tx_mcs_set,
1790 const u16 vht_mcs_limit[NL80211_VHT_NSS_MAX])
1797 for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) {
1798 mcs_map = ath11k_mac_get_max_vht_mcs_map(tx_mcs_set, nss) &
1802 idx_limit = fls(mcs_map) - 1;
1806 switch (idx_limit) {
1815 mcs = IEEE80211_VHT_MCS_SUPPORT_0_7;
1818 mcs = IEEE80211_VHT_MCS_SUPPORT_0_8;
1821 mcs = IEEE80211_VHT_MCS_SUPPORT_0_9;
1827 mcs = IEEE80211_VHT_MCS_NOT_SUPPORTED;
1831 tx_mcs_set &= ~(0x3 << (nss * 2));
1832 tx_mcs_set |= mcs << (nss * 2);
1838 static u8 ath11k_get_nss_160mhz(struct ath11k *ar,
1841 u8 nss_ratio_info = ar->pdev->cap.nss_ratio_info;
1844 switch (nss_ratio_info) {
1845 case WMI_NSS_RATIO_1BY2_NSS:
1846 max_sup_nss = max_nss >> 1;
1848 case WMI_NSS_RATIO_3BY4_NSS:
1849 ath11k_warn(ar->ab, "WMI_NSS_RATIO_3BY4_NSS not supported\n");
1851 case WMI_NSS_RATIO_1_NSS:
1852 max_sup_nss = max_nss;
1854 case WMI_NSS_RATIO_2_NSS:
1855 ath11k_warn(ar->ab, "WMI_NSS_RATIO_2_NSS not supported\n");
1858 ath11k_warn(ar->ab, "invalid nss ratio received from firmware: %d\n",
1866 static void ath11k_peer_assoc_h_vht(struct ath11k *ar,
1867 struct ieee80211_vif *vif,
1868 struct ieee80211_sta *sta,
1869 struct peer_assoc_params *arg)
1871 const struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
1872 struct ath11k_vif *arvif = (void *)vif->drv_priv;
1873 struct cfg80211_chan_def def;
1874 enum nl80211_band band;
1877 u8 max_nss, vht_mcs;
1878 int i, vht_nss, nss_idx;
1879 bool user_rate_valid = true;
1880 u32 rx_nss, tx_nss, nss_160;
1882 if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
1885 if (!vht_cap->vht_supported)
1888 band = def.chan->band;
1889 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
1891 if (ath11k_peer_assoc_h_vht_masked(vht_mcs_mask))
1894 arg->vht_flag = true;
1896 /* TODO: similar flags required? */
1897 arg->vht_capable = true;
1899 if (def.chan->band == NL80211_BAND_2GHZ)
1900 arg->vht_ng_flag = true;
1902 arg->peer_vht_caps = vht_cap->cap;
1904 ampdu_factor = (vht_cap->cap &
1905 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >>
1906 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
1908 /* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to
1909 * zero in VHT IE. Using it would result in degraded throughput.
1910 * arg->peer_max_mpdu at this point contains HT max_mpdu so keep
1911 * it if VHT max_mpdu is smaller.
1913 arg->peer_max_mpdu = max(arg->peer_max_mpdu,
1914 (1U << (IEEE80211_HT_MAX_AMPDU_FACTOR +
1915 ampdu_factor)) - 1);
1917 if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
1920 if (sta->bandwidth == IEEE80211_STA_RX_BW_160)
1923 vht_nss = ath11k_mac_max_vht_nss(vht_mcs_mask);
1925 if (vht_nss > sta->rx_nss) {
1926 user_rate_valid = false;
1927 for (nss_idx = sta->rx_nss - 1; nss_idx >= 0; nss_idx--) {
1928 if (vht_mcs_mask[nss_idx]) {
1929 user_rate_valid = true;
1935 if (!user_rate_valid) {
1936 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac setting vht range mcs value to peer supported nss %d for peer %pM\n",
1937 sta->rx_nss, sta->addr);
1938 vht_mcs_mask[sta->rx_nss - 1] = vht_mcs_mask[vht_nss - 1];
1941 /* Calculate peer NSS capability from VHT capabilities if STA
1944 for (i = 0, max_nss = 0, vht_mcs = 0; i < NL80211_VHT_NSS_MAX; i++) {
1945 vht_mcs = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map) >>
1948 if (vht_mcs != IEEE80211_VHT_MCS_NOT_SUPPORTED &&
1952 arg->peer_nss = min(sta->rx_nss, max_nss);
1953 arg->rx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.rx_highest);
1954 arg->rx_mcs_set = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map);
1955 arg->tx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.tx_highest);
1956 arg->tx_mcs_set = ath11k_peer_assoc_h_vht_limit(
1957 __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map), vht_mcs_mask);
1959 /* In IPQ8074 platform, VHT mcs rate 10 and 11 is enabled by default.
1960 * VHT mcs rate 10 and 11 is not suppoerted in 11ac standard.
1961 * so explicitly disable the VHT MCS rate 10 and 11 in 11ac mode.
1963 arg->tx_mcs_set &= ~IEEE80211_VHT_MCS_SUPPORT_0_11_MASK;
1964 arg->tx_mcs_set |= IEEE80211_DISABLE_VHT_MCS_SUPPORT_0_11;
1966 if ((arg->tx_mcs_set & IEEE80211_VHT_MCS_NOT_SUPPORTED) ==
1967 IEEE80211_VHT_MCS_NOT_SUPPORTED)
1968 arg->peer_vht_caps &= ~IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE;
1971 arg->tx_max_mcs_nss = 0xFF;
1973 if (arg->peer_phymode == MODE_11AC_VHT160 ||
1974 arg->peer_phymode == MODE_11AC_VHT80_80) {
1975 tx_nss = ath11k_get_nss_160mhz(ar, max_nss);
1976 rx_nss = min(arg->peer_nss, tx_nss);
1977 arg->peer_bw_rxnss_override = ATH11K_BW_NSS_MAP_ENABLE;
1980 ath11k_warn(ar->ab, "invalid max_nss\n");
1984 if (arg->peer_phymode == MODE_11AC_VHT160)
1985 nss_160 = FIELD_PREP(ATH11K_PEER_RX_NSS_160MHZ, rx_nss - 1);
1987 nss_160 = FIELD_PREP(ATH11K_PEER_RX_NSS_80_80MHZ, rx_nss - 1);
1989 arg->peer_bw_rxnss_override |= nss_160;
1992 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
1993 "mac vht peer %pM max_mpdu %d flags 0x%x nss_override 0x%x\n",
1994 sta->addr, arg->peer_max_mpdu, arg->peer_flags,
1995 arg->peer_bw_rxnss_override);
1998 static int ath11k_mac_get_max_he_mcs_map(u16 mcs_map, int nss)
2000 switch ((mcs_map >> (2 * nss)) & 0x3) {
2001 case IEEE80211_HE_MCS_SUPPORT_0_7: return BIT(8) - 1;
2002 case IEEE80211_HE_MCS_SUPPORT_0_9: return BIT(10) - 1;
2003 case IEEE80211_HE_MCS_SUPPORT_0_11: return BIT(12) - 1;
2008 static u16 ath11k_peer_assoc_h_he_limit(u16 tx_mcs_set,
2009 const u16 he_mcs_limit[NL80211_HE_NSS_MAX])
2016 for (nss = 0; nss < NL80211_HE_NSS_MAX; nss++) {
2017 mcs_map = ath11k_mac_get_max_he_mcs_map(tx_mcs_set, nss) &
2021 idx_limit = fls(mcs_map) - 1;
2025 switch (idx_limit) {
2027 mcs = IEEE80211_HE_MCS_SUPPORT_0_7;
2031 mcs = IEEE80211_HE_MCS_SUPPORT_0_9;
2035 mcs = IEEE80211_HE_MCS_SUPPORT_0_11;
2041 mcs = IEEE80211_HE_MCS_NOT_SUPPORTED;
2045 tx_mcs_set &= ~(0x3 << (nss * 2));
2046 tx_mcs_set |= mcs << (nss * 2);
2053 ath11k_peer_assoc_h_he_masked(const u16 he_mcs_mask[NL80211_HE_NSS_MAX])
2057 for (nss = 0; nss < NL80211_HE_NSS_MAX; nss++)
2058 if (he_mcs_mask[nss])
2064 static void ath11k_peer_assoc_h_he(struct ath11k *ar,
2065 struct ieee80211_vif *vif,
2066 struct ieee80211_sta *sta,
2067 struct peer_assoc_params *arg)
2069 struct ath11k_vif *arvif = (void *)vif->drv_priv;
2070 struct cfg80211_chan_def def;
2071 const struct ieee80211_sta_he_cap *he_cap = &sta->he_cap;
2072 enum nl80211_band band;
2075 u16 he_tx_mcs = 0, v = 0;
2076 int i, he_nss, nss_idx;
2077 bool user_rate_valid = true;
2078 u32 rx_nss, tx_nss, nss_160;
2079 u8 ampdu_factor, rx_mcs_80, rx_mcs_160;
2080 u16 mcs_160_map, mcs_80_map;
2083 if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
2086 if (!he_cap->has_he)
2089 band = def.chan->band;
2090 he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs;
2092 if (ath11k_peer_assoc_h_he_masked(he_mcs_mask))
2095 arg->he_flag = true;
2096 support_160 = !!(he_cap->he_cap_elem.phy_cap_info[0] &
2097 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G);
2099 /* Supported HE-MCS and NSS Set of peer he_cap is intersection with self he_cp */
2100 mcs_160_map = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160);
2101 mcs_80_map = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80);
2104 for (i = 7; i >= 0; i--) {
2105 u8 mcs_160 = (mcs_160_map >> (2 * i)) & 3;
2107 if (mcs_160 != IEEE80211_VHT_MCS_NOT_SUPPORTED) {
2114 for (i = 7; i >= 0; i--) {
2115 u8 mcs_80 = (mcs_80_map >> (2 * i)) & 3;
2117 if (mcs_80 != IEEE80211_VHT_MCS_NOT_SUPPORTED) {
2124 max_nss = min(rx_mcs_80, rx_mcs_160);
2126 max_nss = rx_mcs_80;
2128 arg->peer_nss = min(sta->rx_nss, max_nss);
2130 memcpy_and_pad(&arg->peer_he_cap_macinfo,
2131 sizeof(arg->peer_he_cap_macinfo),
2132 he_cap->he_cap_elem.mac_cap_info,
2133 sizeof(he_cap->he_cap_elem.mac_cap_info),
2135 memcpy_and_pad(&arg->peer_he_cap_phyinfo,
2136 sizeof(arg->peer_he_cap_phyinfo),
2137 he_cap->he_cap_elem.phy_cap_info,
2138 sizeof(he_cap->he_cap_elem.phy_cap_info),
2140 arg->peer_he_ops = vif->bss_conf.he_oper.params;
2142 /* the top most byte is used to indicate BSS color info */
2143 arg->peer_he_ops &= 0xffffff;
2145 /* As per section 26.6.1 11ax Draft5.0, if the Max AMPDU Exponent Extension
2146 * in HE cap is zero, use the arg->peer_max_mpdu as calculated while parsing
2147 * VHT caps(if VHT caps is present) or HT caps (if VHT caps is not present).
2149 * For non-zero value of Max AMPDU Extponent Extension in HE MAC caps,
2150 * if a HE STA sends VHT cap and HE cap IE in assoc request then, use
2151 * MAX_AMPDU_LEN_FACTOR as 20 to calculate max_ampdu length.
2152 * If a HE STA that does not send VHT cap, but HE and HT cap in assoc
2153 * request, then use MAX_AMPDU_LEN_FACTOR as 16 to calculate max_ampdu
2156 ampdu_factor = u8_get_bits(he_cap->he_cap_elem.mac_cap_info[3],
2157 IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK);
2160 if (sta->vht_cap.vht_supported)
2161 arg->peer_max_mpdu = (1 << (IEEE80211_HE_VHT_MAX_AMPDU_FACTOR +
2163 else if (sta->ht_cap.ht_supported)
2164 arg->peer_max_mpdu = (1 << (IEEE80211_HE_HT_MAX_AMPDU_FACTOR +
2168 if (he_cap->he_cap_elem.phy_cap_info[6] &
2169 IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT) {
2173 arg->peer_ppet.numss_m1 = he_cap->ppe_thres[0] &
2174 IEEE80211_PPE_THRES_NSS_MASK;
2175 arg->peer_ppet.ru_bit_mask =
2176 (he_cap->ppe_thres[0] &
2177 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK) >>
2178 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_POS;
2180 for (nss = 0; nss <= arg->peer_ppet.numss_m1; nss++) {
2181 for (ru = 0; ru < 4; ru++) {
2185 if ((arg->peer_ppet.ru_bit_mask & BIT(ru)) == 0)
2187 for (i = 0; i < 6; i++) {
2189 val |= ((he_cap->ppe_thres[bit / 8] >>
2190 (bit % 8)) & 0x1) << 5;
2193 arg->peer_ppet.ppet16_ppet8_ru3_ru0[nss] |=
2199 if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_RES)
2200 arg->twt_responder = true;
2201 if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_REQ)
2202 arg->twt_requester = true;
2204 he_nss = ath11k_mac_max_he_nss(he_mcs_mask);
2206 if (he_nss > sta->rx_nss) {
2207 user_rate_valid = false;
2208 for (nss_idx = sta->rx_nss - 1; nss_idx >= 0; nss_idx--) {
2209 if (he_mcs_mask[nss_idx]) {
2210 user_rate_valid = true;
2216 if (!user_rate_valid) {
2217 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac setting he range mcs value to peer supported nss %d for peer %pM\n",
2218 sta->rx_nss, sta->addr);
2219 he_mcs_mask[sta->rx_nss - 1] = he_mcs_mask[he_nss - 1];
2222 switch (sta->bandwidth) {
2223 case IEEE80211_STA_RX_BW_160:
2224 if (he_cap->he_cap_elem.phy_cap_info[0] &
2225 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G) {
2226 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80p80);
2227 v = ath11k_peer_assoc_h_he_limit(v, he_mcs_mask);
2228 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80_80] = v;
2230 v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80p80);
2231 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80_80] = v;
2233 arg->peer_he_mcs_count++;
2236 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160);
2237 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v;
2239 v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_160);
2240 v = ath11k_peer_assoc_h_he_limit(v, he_mcs_mask);
2241 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v;
2243 arg->peer_he_mcs_count++;
2249 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80);
2250 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v;
2252 v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80);
2253 v = ath11k_peer_assoc_h_he_limit(v, he_mcs_mask);
2254 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v;
2256 arg->peer_he_mcs_count++;
2262 /* Calculate peer NSS capability from HE capabilities if STA
2265 for (i = 0, max_nss = 0, he_mcs = 0; i < NL80211_HE_NSS_MAX; i++) {
2266 he_mcs = he_tx_mcs >> (2 * i) & 3;
2268 /* In case of fixed rates, MCS Range in he_tx_mcs might have
2269 * unsupported range, with he_mcs_mask set, so check either of them
2272 if (he_mcs != IEEE80211_HE_MCS_NOT_SUPPORTED ||
2276 arg->peer_nss = min(sta->rx_nss, max_nss);
2278 if (arg->peer_phymode == MODE_11AX_HE160 ||
2279 arg->peer_phymode == MODE_11AX_HE80_80) {
2280 tx_nss = ath11k_get_nss_160mhz(ar, max_nss);
2281 rx_nss = min(arg->peer_nss, tx_nss);
2282 arg->peer_bw_rxnss_override = ATH11K_BW_NSS_MAP_ENABLE;
2285 ath11k_warn(ar->ab, "invalid max_nss\n");
2289 if (arg->peer_phymode == MODE_11AX_HE160)
2290 nss_160 = FIELD_PREP(ATH11K_PEER_RX_NSS_160MHZ, rx_nss - 1);
2292 nss_160 = FIELD_PREP(ATH11K_PEER_RX_NSS_80_80MHZ, rx_nss - 1);
2294 arg->peer_bw_rxnss_override |= nss_160;
2297 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
2298 "mac he peer %pM nss %d mcs cnt %d nss_override 0x%x\n",
2299 sta->addr, arg->peer_nss,
2300 arg->peer_he_mcs_count,
2301 arg->peer_bw_rxnss_override);
2304 static void ath11k_peer_assoc_h_he_6ghz(struct ath11k *ar,
2305 struct ieee80211_vif *vif,
2306 struct ieee80211_sta *sta,
2307 struct peer_assoc_params *arg)
2309 const struct ieee80211_sta_he_cap *he_cap = &sta->he_cap;
2310 struct cfg80211_chan_def def;
2311 enum nl80211_band band;
2314 if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
2317 band = def.chan->band;
2319 if (!arg->he_flag || band != NL80211_BAND_6GHZ || !sta->he_6ghz_capa.capa)
2322 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
2325 if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
2328 if (sta->bandwidth == IEEE80211_STA_RX_BW_160)
2331 arg->peer_he_caps_6ghz = le16_to_cpu(sta->he_6ghz_capa.capa);
2332 arg->peer_mpdu_density =
2333 ath11k_parse_mpdudensity(FIELD_GET(IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START,
2334 arg->peer_he_caps_6ghz));
2336 /* From IEEE Std 802.11ax-2021 - Section 10.12.2: An HE STA shall be capable of
2337 * receiving A-MPDU where the A-MPDU pre-EOF padding length is up to the value
2338 * indicated by the Maximum A-MPDU Length Exponent Extension field in the HE
2339 * Capabilities element and the Maximum A-MPDU Length Exponent field in HE 6 GHz
2340 * Band Capabilities element in the 6 GHz band.
2342 * Here, we are extracting the Max A-MPDU Exponent Extension from HE caps and
2343 * factor is the Maximum A-MPDU Length Exponent from HE 6 GHZ Band capability.
2345 ampdu_factor = FIELD_GET(IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK,
2346 he_cap->he_cap_elem.mac_cap_info[3]) +
2347 FIELD_GET(IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP,
2348 arg->peer_he_caps_6ghz);
2350 arg->peer_max_mpdu = (1u << (IEEE80211_HE_6GHZ_MAX_AMPDU_FACTOR +
2354 static void ath11k_peer_assoc_h_smps(struct ieee80211_sta *sta,
2355 struct peer_assoc_params *arg)
2357 const struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
2360 if (!ht_cap->ht_supported && !sta->he_6ghz_capa.capa)
2363 if (ht_cap->ht_supported) {
2364 smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
2365 smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
2367 smps = le16_get_bits(sta->he_6ghz_capa.capa,
2368 IEEE80211_HE_6GHZ_CAP_SM_PS);
2372 case WLAN_HT_CAP_SM_PS_STATIC:
2373 arg->static_mimops_flag = true;
2375 case WLAN_HT_CAP_SM_PS_DYNAMIC:
2376 arg->dynamic_mimops_flag = true;
2378 case WLAN_HT_CAP_SM_PS_DISABLED:
2379 arg->spatial_mux_flag = true;
2386 static void ath11k_peer_assoc_h_qos(struct ath11k *ar,
2387 struct ieee80211_vif *vif,
2388 struct ieee80211_sta *sta,
2389 struct peer_assoc_params *arg)
2391 struct ath11k_vif *arvif = (void *)vif->drv_priv;
2393 switch (arvif->vdev_type) {
2394 case WMI_VDEV_TYPE_AP:
2396 /* TODO: Check WME vs QoS */
2397 arg->is_wme_set = true;
2398 arg->qos_flag = true;
2401 if (sta->wme && sta->uapsd_queues) {
2402 /* TODO: Check WME vs QoS */
2403 arg->is_wme_set = true;
2404 arg->apsd_flag = true;
2405 arg->peer_rate_caps |= WMI_HOST_RC_UAPSD_FLAG;
2408 case WMI_VDEV_TYPE_STA:
2410 arg->is_wme_set = true;
2411 arg->qos_flag = true;
2418 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac peer %pM qos %d\n",
2419 sta->addr, arg->qos_flag);
2422 static int ath11k_peer_assoc_qos_ap(struct ath11k *ar,
2423 struct ath11k_vif *arvif,
2424 struct ieee80211_sta *sta)
2426 struct ap_ps_params params;
2431 lockdep_assert_held(&ar->conf_mutex);
2433 params.vdev_id = arvif->vdev_id;
2435 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac uapsd_queues 0x%x max_sp %d\n",
2436 sta->uapsd_queues, sta->max_sp);
2439 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO)
2440 uapsd |= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN |
2441 WMI_AP_PS_UAPSD_AC3_TRIGGER_EN;
2442 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI)
2443 uapsd |= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN |
2444 WMI_AP_PS_UAPSD_AC2_TRIGGER_EN;
2445 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK)
2446 uapsd |= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN |
2447 WMI_AP_PS_UAPSD_AC1_TRIGGER_EN;
2448 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE)
2449 uapsd |= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN |
2450 WMI_AP_PS_UAPSD_AC0_TRIGGER_EN;
2453 if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP)
2454 max_sp = sta->max_sp;
2456 params.param = WMI_AP_PS_PEER_PARAM_UAPSD;
2457 params.value = uapsd;
2458 ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, ¶ms);
2462 params.param = WMI_AP_PS_PEER_PARAM_MAX_SP;
2463 params.value = max_sp;
2464 ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, ¶ms);
2468 /* TODO revisit during testing */
2469 params.param = WMI_AP_PS_PEER_PARAM_SIFS_RESP_FRMTYPE;
2470 params.value = DISABLE_SIFS_RESPONSE_TRIGGER;
2471 ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, ¶ms);
2475 params.param = WMI_AP_PS_PEER_PARAM_SIFS_RESP_UAPSD;
2476 params.value = DISABLE_SIFS_RESPONSE_TRIGGER;
2477 ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, ¶ms);
2484 ath11k_warn(ar->ab, "failed to set ap ps peer param %d for vdev %i: %d\n",
2485 params.param, arvif->vdev_id, ret);
2489 static bool ath11k_mac_sta_has_ofdm_only(struct ieee80211_sta *sta)
2491 return sta->supp_rates[NL80211_BAND_2GHZ] >>
2492 ATH11K_MAC_FIRST_OFDM_RATE_IDX;
2495 static enum wmi_phy_mode ath11k_mac_get_phymode_vht(struct ath11k *ar,
2496 struct ieee80211_sta *sta)
2498 if (sta->bandwidth == IEEE80211_STA_RX_BW_160) {
2499 switch (sta->vht_cap.cap &
2500 IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK) {
2501 case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ:
2502 return MODE_11AC_VHT160;
2503 case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ:
2504 return MODE_11AC_VHT80_80;
2506 /* not sure if this is a valid case? */
2507 return MODE_11AC_VHT160;
2511 if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
2512 return MODE_11AC_VHT80;
2514 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
2515 return MODE_11AC_VHT40;
2517 if (sta->bandwidth == IEEE80211_STA_RX_BW_20)
2518 return MODE_11AC_VHT20;
2520 return MODE_UNKNOWN;
2523 static enum wmi_phy_mode ath11k_mac_get_phymode_he(struct ath11k *ar,
2524 struct ieee80211_sta *sta)
2526 if (sta->bandwidth == IEEE80211_STA_RX_BW_160) {
2527 if (sta->he_cap.he_cap_elem.phy_cap_info[0] &
2528 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
2529 return MODE_11AX_HE160;
2530 else if (sta->he_cap.he_cap_elem.phy_cap_info[0] &
2531 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
2532 return MODE_11AX_HE80_80;
2533 /* not sure if this is a valid case? */
2534 return MODE_11AX_HE160;
2537 if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
2538 return MODE_11AX_HE80;
2540 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
2541 return MODE_11AX_HE40;
2543 if (sta->bandwidth == IEEE80211_STA_RX_BW_20)
2544 return MODE_11AX_HE20;
2546 return MODE_UNKNOWN;
2549 static void ath11k_peer_assoc_h_phymode(struct ath11k *ar,
2550 struct ieee80211_vif *vif,
2551 struct ieee80211_sta *sta,
2552 struct peer_assoc_params *arg)
2554 struct ath11k_vif *arvif = (void *)vif->drv_priv;
2555 struct cfg80211_chan_def def;
2556 enum nl80211_band band;
2557 const u8 *ht_mcs_mask;
2558 const u16 *vht_mcs_mask;
2559 const u16 *he_mcs_mask;
2560 enum wmi_phy_mode phymode = MODE_UNKNOWN;
2562 if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
2565 band = def.chan->band;
2566 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
2567 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2568 he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs;
2571 case NL80211_BAND_2GHZ:
2572 if (sta->he_cap.has_he &&
2573 !ath11k_peer_assoc_h_he_masked(he_mcs_mask)) {
2574 if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
2575 phymode = MODE_11AX_HE80_2G;
2576 else if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
2577 phymode = MODE_11AX_HE40_2G;
2579 phymode = MODE_11AX_HE20_2G;
2580 } else if (sta->vht_cap.vht_supported &&
2581 !ath11k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
2582 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
2583 phymode = MODE_11AC_VHT40;
2585 phymode = MODE_11AC_VHT20;
2586 } else if (sta->ht_cap.ht_supported &&
2587 !ath11k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
2588 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
2589 phymode = MODE_11NG_HT40;
2591 phymode = MODE_11NG_HT20;
2592 } else if (ath11k_mac_sta_has_ofdm_only(sta)) {
2598 case NL80211_BAND_5GHZ:
2599 case NL80211_BAND_6GHZ:
2600 /* Check HE first */
2601 if (sta->he_cap.has_he &&
2602 !ath11k_peer_assoc_h_he_masked(he_mcs_mask)) {
2603 phymode = ath11k_mac_get_phymode_he(ar, sta);
2604 } else if (sta->vht_cap.vht_supported &&
2605 !ath11k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
2606 phymode = ath11k_mac_get_phymode_vht(ar, sta);
2607 } else if (sta->ht_cap.ht_supported &&
2608 !ath11k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
2609 if (sta->bandwidth >= IEEE80211_STA_RX_BW_40)
2610 phymode = MODE_11NA_HT40;
2612 phymode = MODE_11NA_HT20;
2621 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac peer %pM phymode %s\n",
2622 sta->addr, ath11k_wmi_phymode_str(phymode));
2624 arg->peer_phymode = phymode;
2625 WARN_ON(phymode == MODE_UNKNOWN);
2628 static void ath11k_peer_assoc_prepare(struct ath11k *ar,
2629 struct ieee80211_vif *vif,
2630 struct ieee80211_sta *sta,
2631 struct peer_assoc_params *arg,
2634 struct ath11k_sta *arsta;
2636 lockdep_assert_held(&ar->conf_mutex);
2638 arsta = (struct ath11k_sta *)sta->drv_priv;
2640 memset(arg, 0, sizeof(*arg));
2642 reinit_completion(&ar->peer_assoc_done);
2644 arg->peer_new_assoc = !reassoc;
2645 ath11k_peer_assoc_h_basic(ar, vif, sta, arg);
2646 ath11k_peer_assoc_h_crypto(ar, vif, sta, arg);
2647 ath11k_peer_assoc_h_rates(ar, vif, sta, arg);
2648 ath11k_peer_assoc_h_phymode(ar, vif, sta, arg);
2649 ath11k_peer_assoc_h_ht(ar, vif, sta, arg);
2650 ath11k_peer_assoc_h_vht(ar, vif, sta, arg);
2651 ath11k_peer_assoc_h_he(ar, vif, sta, arg);
2652 ath11k_peer_assoc_h_he_6ghz(ar, vif, sta, arg);
2653 ath11k_peer_assoc_h_qos(ar, vif, sta, arg);
2654 ath11k_peer_assoc_h_smps(sta, arg);
2656 arsta->peer_nss = arg->peer_nss;
2658 /* TODO: amsdu_disable req? */
2661 static int ath11k_setup_peer_smps(struct ath11k *ar, struct ath11k_vif *arvif,
2663 const struct ieee80211_sta_ht_cap *ht_cap,
2668 if (!ht_cap->ht_supported && !he_6ghz_capa)
2671 if (ht_cap->ht_supported) {
2672 smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
2673 smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
2675 smps = FIELD_GET(IEEE80211_HE_6GHZ_CAP_SM_PS, he_6ghz_capa);
2678 if (smps >= ARRAY_SIZE(ath11k_smps_map))
2681 return ath11k_wmi_set_peer_param(ar, addr, arvif->vdev_id,
2682 WMI_PEER_MIMO_PS_STATE,
2683 ath11k_smps_map[smps]);
2686 static void ath11k_bss_assoc(struct ieee80211_hw *hw,
2687 struct ieee80211_vif *vif,
2688 struct ieee80211_bss_conf *bss_conf)
2690 struct ath11k *ar = hw->priv;
2691 struct ath11k_vif *arvif = (void *)vif->drv_priv;
2692 struct peer_assoc_params peer_arg;
2693 struct ieee80211_sta *ap_sta;
2694 struct ath11k_peer *peer;
2695 bool is_auth = false;
2698 lockdep_assert_held(&ar->conf_mutex);
2700 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac vdev %i assoc bssid %pM aid %d\n",
2701 arvif->vdev_id, arvif->bssid, arvif->aid);
2705 ap_sta = ieee80211_find_sta(vif, bss_conf->bssid);
2707 ath11k_warn(ar->ab, "failed to find station entry for bss %pM vdev %i\n",
2708 bss_conf->bssid, arvif->vdev_id);
2713 ath11k_peer_assoc_prepare(ar, vif, ap_sta, &peer_arg, false);
2717 peer_arg.is_assoc = true;
2718 ret = ath11k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
2720 ath11k_warn(ar->ab, "failed to run peer assoc for %pM vdev %i: %d\n",
2721 bss_conf->bssid, arvif->vdev_id, ret);
2725 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) {
2726 ath11k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
2727 bss_conf->bssid, arvif->vdev_id);
2731 ret = ath11k_setup_peer_smps(ar, arvif, bss_conf->bssid,
2733 le16_to_cpu(ap_sta->he_6ghz_capa.capa));
2735 ath11k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n",
2736 arvif->vdev_id, ret);
2740 WARN_ON(arvif->is_up);
2742 arvif->aid = bss_conf->aid;
2743 ether_addr_copy(arvif->bssid, bss_conf->bssid);
2745 ret = ath11k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid);
2747 ath11k_warn(ar->ab, "failed to set vdev %d up: %d\n",
2748 arvif->vdev_id, ret);
2752 arvif->is_up = true;
2754 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
2755 "mac vdev %d up (associated) bssid %pM aid %d\n",
2756 arvif->vdev_id, bss_conf->bssid, bss_conf->aid);
2758 spin_lock_bh(&ar->ab->base_lock);
2760 peer = ath11k_peer_find(ar->ab, arvif->vdev_id, arvif->bssid);
2761 if (peer && peer->is_authorized)
2764 spin_unlock_bh(&ar->ab->base_lock);
2767 ret = ath11k_wmi_set_peer_param(ar, arvif->bssid,
2772 ath11k_warn(ar->ab, "Unable to authorize BSS peer: %d\n", ret);
2775 ret = ath11k_wmi_send_obss_spr_cmd(ar, arvif->vdev_id,
2776 &bss_conf->he_obss_pd);
2778 ath11k_warn(ar->ab, "failed to set vdev %i OBSS PD parameters: %d\n",
2779 arvif->vdev_id, ret);
2781 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
2782 WMI_VDEV_PARAM_DTIM_POLICY,
2783 WMI_DTIM_POLICY_STICK);
2785 ath11k_warn(ar->ab, "failed to set vdev %d dtim policy: %d\n",
2786 arvif->vdev_id, ret);
2788 ath11k_mac_11d_scan_stop_all(ar->ab);
2791 static void ath11k_bss_disassoc(struct ieee80211_hw *hw,
2792 struct ieee80211_vif *vif)
2794 struct ath11k *ar = hw->priv;
2795 struct ath11k_vif *arvif = (void *)vif->drv_priv;
2798 lockdep_assert_held(&ar->conf_mutex);
2800 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac vdev %i disassoc bssid %pM\n",
2801 arvif->vdev_id, arvif->bssid);
2803 ret = ath11k_wmi_vdev_down(ar, arvif->vdev_id);
2805 ath11k_warn(ar->ab, "failed to down vdev %i: %d\n",
2806 arvif->vdev_id, ret);
2808 arvif->is_up = false;
2810 cancel_delayed_work_sync(&arvif->connection_loss_work);
2813 static u32 ath11k_mac_get_rate_hw_value(int bitrate)
2820 if (ath11k_mac_bitrate_is_cck(bitrate))
2821 preamble = WMI_RATE_PREAMBLE_CCK;
2823 preamble = WMI_RATE_PREAMBLE_OFDM;
2825 for (i = 0; i < ARRAY_SIZE(ath11k_legacy_rates); i++) {
2826 if (ath11k_legacy_rates[i].bitrate != bitrate)
2829 hw_value = ath11k_legacy_rates[i].hw_value;
2830 rate = ATH11K_HW_RATE_CODE(hw_value, 0, preamble);
2838 static void ath11k_recalculate_mgmt_rate(struct ath11k *ar,
2839 struct ieee80211_vif *vif,
2840 struct cfg80211_chan_def *def)
2842 struct ath11k_vif *arvif = (void *)vif->drv_priv;
2843 const struct ieee80211_supported_band *sband;
2850 lockdep_assert_held(&ar->conf_mutex);
2852 sband = ar->hw->wiphy->bands[def->chan->band];
2853 basic_rate_idx = ffs(vif->bss_conf.basic_rates) - 1;
2854 bitrate = sband->bitrates[basic_rate_idx].bitrate;
2856 hw_rate_code = ath11k_mac_get_rate_hw_value(bitrate);
2857 if (hw_rate_code < 0) {
2858 ath11k_warn(ar->ab, "bitrate not supported %d\n", bitrate);
2862 vdev_param = WMI_VDEV_PARAM_MGMT_RATE;
2863 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param,
2866 ath11k_warn(ar->ab, "failed to set mgmt tx rate %d\n", ret);
2868 /* For WCN6855, firmware will clear this param when vdev starts, hence
2869 * cache it here so that we can reconfigure it once vdev starts.
2871 ar->hw_rate_code = hw_rate_code;
2873 vdev_param = WMI_VDEV_PARAM_BEACON_RATE;
2874 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param,
2877 ath11k_warn(ar->ab, "failed to set beacon tx rate %d\n", ret);
2880 static int ath11k_mac_fils_discovery(struct ath11k_vif *arvif,
2881 struct ieee80211_bss_conf *info)
2883 struct ath11k *ar = arvif->ar;
2884 struct sk_buff *tmpl;
2887 bool unsol_bcast_probe_resp_enabled = false;
2889 if (info->fils_discovery.max_interval) {
2890 interval = info->fils_discovery.max_interval;
2892 tmpl = ieee80211_get_fils_discovery_tmpl(ar->hw, arvif->vif);
2894 ret = ath11k_wmi_fils_discovery_tmpl(ar, arvif->vdev_id,
2896 } else if (info->unsol_bcast_probe_resp_interval) {
2897 unsol_bcast_probe_resp_enabled = 1;
2898 interval = info->unsol_bcast_probe_resp_interval;
2900 tmpl = ieee80211_get_unsol_bcast_probe_resp_tmpl(ar->hw,
2903 ret = ath11k_wmi_probe_resp_tmpl(ar, arvif->vdev_id,
2905 } else { /* Disable */
2906 return ath11k_wmi_fils_discovery(ar, arvif->vdev_id, 0, false);
2911 "mac vdev %i failed to retrieve %s template\n",
2912 arvif->vdev_id, (unsol_bcast_probe_resp_enabled ?
2913 "unsolicited broadcast probe response" :
2920 ret = ath11k_wmi_fils_discovery(ar, arvif->vdev_id, interval,
2921 unsol_bcast_probe_resp_enabled);
2926 static int ath11k_mac_config_obss_pd(struct ath11k *ar,
2927 struct ieee80211_he_obss_pd *he_obss_pd)
2929 u32 bitmap[2], param_id, param_val, pdev_id;
2931 s8 non_srg_th = 0, srg_th = 0;
2933 pdev_id = ar->pdev->pdev_id;
2935 /* Set and enable SRG/non-SRG OBSS PD Threshold */
2936 param_id = WMI_PDEV_PARAM_SET_CMD_OBSS_PD_THRESHOLD;
2937 if (test_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags)) {
2938 ret = ath11k_wmi_pdev_set_param(ar, param_id, 0, pdev_id);
2941 "failed to set obss_pd_threshold for pdev: %u\n",
2946 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
2947 "mac obss pd sr_ctrl %x non_srg_thres %u srg_max %u\n",
2948 he_obss_pd->sr_ctrl, he_obss_pd->non_srg_max_offset,
2949 he_obss_pd->max_offset);
2953 if (he_obss_pd->sr_ctrl &
2954 IEEE80211_HE_SPR_NON_SRG_OBSS_PD_SR_DISALLOWED) {
2955 non_srg_th = ATH11K_OBSS_PD_MAX_THRESHOLD;
2957 if (he_obss_pd->sr_ctrl & IEEE80211_HE_SPR_NON_SRG_OFFSET_PRESENT)
2958 non_srg_th = (ATH11K_OBSS_PD_MAX_THRESHOLD +
2959 he_obss_pd->non_srg_max_offset);
2961 non_srg_th = ATH11K_OBSS_PD_NON_SRG_MAX_THRESHOLD;
2963 param_val |= ATH11K_OBSS_PD_NON_SRG_EN;
2966 if (he_obss_pd->sr_ctrl & IEEE80211_HE_SPR_SRG_INFORMATION_PRESENT) {
2967 srg_th = ATH11K_OBSS_PD_MAX_THRESHOLD + he_obss_pd->max_offset;
2968 param_val |= ATH11K_OBSS_PD_SRG_EN;
2971 if (test_bit(WMI_TLV_SERVICE_SRG_SRP_SPATIAL_REUSE_SUPPORT,
2972 ar->ab->wmi_ab.svc_map)) {
2973 param_val |= ATH11K_OBSS_PD_THRESHOLD_IN_DBM;
2974 param_val |= FIELD_PREP(GENMASK(15, 8), srg_th);
2976 non_srg_th -= ATH11K_DEFAULT_NOISE_FLOOR;
2977 /* SRG not supported and threshold in dB */
2978 param_val &= ~(ATH11K_OBSS_PD_SRG_EN |
2979 ATH11K_OBSS_PD_THRESHOLD_IN_DBM);
2982 param_val |= (non_srg_th & GENMASK(7, 0));
2983 ret = ath11k_wmi_pdev_set_param(ar, param_id, param_val, pdev_id);
2986 "failed to set obss_pd_threshold for pdev: %u\n",
2991 /* Enable OBSS PD for all access category */
2992 param_id = WMI_PDEV_PARAM_SET_CMD_OBSS_PD_PER_AC;
2994 ret = ath11k_wmi_pdev_set_param(ar, param_id, param_val, pdev_id);
2997 "failed to set obss_pd_per_ac for pdev: %u\n",
3002 /* Set SR Prohibit */
3003 param_id = WMI_PDEV_PARAM_ENABLE_SR_PROHIBIT;
3004 param_val = !!(he_obss_pd->sr_ctrl &
3005 IEEE80211_HE_SPR_HESIGA_SR_VAL15_ALLOWED);
3006 ret = ath11k_wmi_pdev_set_param(ar, param_id, param_val, pdev_id);
3008 ath11k_warn(ar->ab, "failed to set sr_prohibit for pdev: %u\n",
3013 if (!test_bit(WMI_TLV_SERVICE_SRG_SRP_SPATIAL_REUSE_SUPPORT,
3014 ar->ab->wmi_ab.svc_map))
3017 /* Set SRG BSS Color Bitmap */
3018 memcpy(bitmap, he_obss_pd->bss_color_bitmap, sizeof(bitmap));
3019 ret = ath11k_wmi_pdev_set_srg_bss_color_bitmap(ar, bitmap);
3022 "failed to set bss_color_bitmap for pdev: %u\n",
3027 /* Set SRG Partial BSSID Bitmap */
3028 memcpy(bitmap, he_obss_pd->partial_bssid_bitmap, sizeof(bitmap));
3029 ret = ath11k_wmi_pdev_set_srg_patial_bssid_bitmap(ar, bitmap);
3032 "failed to set partial_bssid_bitmap for pdev: %u\n",
3037 memset(bitmap, 0xff, sizeof(bitmap));
3039 /* Enable all BSS Colors for SRG */
3040 ret = ath11k_wmi_pdev_srg_obss_color_enable_bitmap(ar, bitmap);
3043 "failed to set srg_color_en_bitmap pdev: %u\n",
3048 /* Enable all patial BSSID mask for SRG */
3049 ret = ath11k_wmi_pdev_srg_obss_bssid_enable_bitmap(ar, bitmap);
3052 "failed to set srg_bssid_en_bitmap pdev: %u\n",
3057 /* Enable all BSS Colors for non-SRG */
3058 ret = ath11k_wmi_pdev_non_srg_obss_color_enable_bitmap(ar, bitmap);
3061 "failed to set non_srg_color_en_bitmap pdev: %u\n",
3066 /* Enable all patial BSSID mask for non-SRG */
3067 ret = ath11k_wmi_pdev_non_srg_obss_bssid_enable_bitmap(ar, bitmap);
3070 "failed to set non_srg_bssid_en_bitmap pdev: %u\n",
3078 static void ath11k_mac_op_bss_info_changed(struct ieee80211_hw *hw,
3079 struct ieee80211_vif *vif,
3080 struct ieee80211_bss_conf *info,
3083 struct ath11k *ar = hw->priv;
3084 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
3085 struct cfg80211_chan_def def;
3086 u32 param_id, param_value;
3087 enum nl80211_band band;
3097 mutex_lock(&ar->conf_mutex);
3099 if (changed & BSS_CHANGED_BEACON_INT) {
3100 arvif->beacon_interval = info->beacon_int;
3102 param_id = WMI_VDEV_PARAM_BEACON_INTERVAL;
3103 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3105 arvif->beacon_interval);
3107 ath11k_warn(ar->ab, "Failed to set beacon interval for VDEV: %d\n",
3110 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3111 "Beacon interval: %d set for VDEV: %d\n",
3112 arvif->beacon_interval, arvif->vdev_id);
3115 if (changed & BSS_CHANGED_BEACON) {
3116 param_id = WMI_PDEV_PARAM_BEACON_TX_MODE;
3117 param_value = WMI_BEACON_STAGGERED_MODE;
3118 ret = ath11k_wmi_pdev_set_param(ar, param_id,
3119 param_value, ar->pdev->pdev_id);
3121 ath11k_warn(ar->ab, "Failed to set beacon mode for VDEV: %d\n",
3124 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3125 "Set staggered beacon mode for VDEV: %d\n",
3128 if (!arvif->do_not_send_tmpl || !arvif->bcca_zero_sent) {
3129 ret = ath11k_mac_setup_bcn_tmpl(arvif);
3131 ath11k_warn(ar->ab, "failed to update bcn template: %d\n",
3135 if (arvif->bcca_zero_sent)
3136 arvif->do_not_send_tmpl = true;
3138 arvif->do_not_send_tmpl = false;
3141 if (changed & (BSS_CHANGED_BEACON_INFO | BSS_CHANGED_BEACON)) {
3142 arvif->dtim_period = info->dtim_period;
3144 param_id = WMI_VDEV_PARAM_DTIM_PERIOD;
3145 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3147 arvif->dtim_period);
3150 ath11k_warn(ar->ab, "Failed to set dtim period for VDEV %d: %i\n",
3151 arvif->vdev_id, ret);
3153 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3154 "DTIM period: %d set for VDEV: %d\n",
3155 arvif->dtim_period, arvif->vdev_id);
3158 if (changed & BSS_CHANGED_SSID &&
3159 vif->type == NL80211_IFTYPE_AP) {
3160 arvif->u.ap.ssid_len = info->ssid_len;
3162 memcpy(arvif->u.ap.ssid, info->ssid, info->ssid_len);
3163 arvif->u.ap.hidden_ssid = info->hidden_ssid;
3166 if (changed & BSS_CHANGED_BSSID && !is_zero_ether_addr(info->bssid))
3167 ether_addr_copy(arvif->bssid, info->bssid);
3169 if (changed & BSS_CHANGED_BEACON_ENABLED) {
3170 ath11k_control_beaconing(arvif, info);
3172 if (arvif->is_up && vif->bss_conf.he_support &&
3173 vif->bss_conf.he_oper.params) {
3174 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3175 WMI_VDEV_PARAM_BA_MODE,
3176 WMI_BA_MODE_BUFFER_SIZE_256);
3179 "failed to set BA BUFFER SIZE 256 for vdev: %d\n",
3182 param_id = WMI_VDEV_PARAM_HEOPS_0_31;
3183 param_value = vif->bss_conf.he_oper.params;
3184 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3185 param_id, param_value);
3186 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3187 "he oper param: %x set for VDEV: %d\n",
3188 param_value, arvif->vdev_id);
3191 ath11k_warn(ar->ab, "Failed to set he oper params %x for VDEV %d: %i\n",
3192 param_value, arvif->vdev_id, ret);
3196 if (changed & BSS_CHANGED_ERP_CTS_PROT) {
3199 cts_prot = !!(info->use_cts_prot);
3200 param_id = WMI_VDEV_PARAM_PROTECTION_MODE;
3202 if (arvif->is_started) {
3203 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3204 param_id, cts_prot);
3206 ath11k_warn(ar->ab, "Failed to set CTS prot for VDEV: %d\n",
3209 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "Set CTS prot: %d for VDEV: %d\n",
3210 cts_prot, arvif->vdev_id);
3212 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "defer protection mode setup, vdev is not ready yet\n");
3216 if (changed & BSS_CHANGED_ERP_SLOT) {
3219 if (info->use_short_slot)
3220 slottime = WMI_VDEV_SLOT_TIME_SHORT; /* 9us */
3223 slottime = WMI_VDEV_SLOT_TIME_LONG; /* 20us */
3225 param_id = WMI_VDEV_PARAM_SLOT_TIME;
3226 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3227 param_id, slottime);
3229 ath11k_warn(ar->ab, "Failed to set erp slot for VDEV: %d\n",
3232 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3233 "Set slottime: %d for VDEV: %d\n",
3234 slottime, arvif->vdev_id);
3237 if (changed & BSS_CHANGED_ERP_PREAMBLE) {
3240 if (info->use_short_preamble)
3241 preamble = WMI_VDEV_PREAMBLE_SHORT;
3243 preamble = WMI_VDEV_PREAMBLE_LONG;
3245 param_id = WMI_VDEV_PARAM_PREAMBLE;
3246 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3247 param_id, preamble);
3249 ath11k_warn(ar->ab, "Failed to set preamble for VDEV: %d\n",
3252 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3253 "Set preamble: %d for VDEV: %d\n",
3254 preamble, arvif->vdev_id);
3257 if (changed & BSS_CHANGED_ASSOC) {
3259 ath11k_bss_assoc(hw, vif, info);
3261 ath11k_bss_disassoc(hw, vif);
3264 if (changed & BSS_CHANGED_TXPOWER) {
3265 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac vdev_id %i txpower %d\n",
3266 arvif->vdev_id, info->txpower);
3268 arvif->txpower = info->txpower;
3269 ath11k_mac_txpower_recalc(ar);
3272 if (changed & BSS_CHANGED_PS &&
3273 ar->ab->hw_params.supports_sta_ps) {
3274 arvif->ps = vif->bss_conf.ps;
3276 ret = ath11k_mac_config_ps(ar);
3278 ath11k_warn(ar->ab, "failed to setup ps on vdev %i: %d\n",
3279 arvif->vdev_id, ret);
3282 if (changed & BSS_CHANGED_MCAST_RATE &&
3283 !ath11k_mac_vif_chan(arvif->vif, &def)) {
3284 band = def.chan->band;
3285 mcast_rate = vif->bss_conf.mcast_rate[band];
3288 rateidx = mcast_rate - 1;
3290 rateidx = ffs(vif->bss_conf.basic_rates) - 1;
3292 if (ar->pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP)
3293 rateidx += ATH11K_MAC_FIRST_OFDM_RATE_IDX;
3295 bitrate = ath11k_legacy_rates[rateidx].bitrate;
3296 hw_value = ath11k_legacy_rates[rateidx].hw_value;
3298 if (ath11k_mac_bitrate_is_cck(bitrate))
3299 preamble = WMI_RATE_PREAMBLE_CCK;
3301 preamble = WMI_RATE_PREAMBLE_OFDM;
3303 rate = ATH11K_HW_RATE_CODE(hw_value, 0, preamble);
3305 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3306 "mac vdev %d mcast_rate %x\n",
3307 arvif->vdev_id, rate);
3309 vdev_param = WMI_VDEV_PARAM_MCAST_DATA_RATE;
3310 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3314 "failed to set mcast rate on vdev %i: %d\n",
3315 arvif->vdev_id, ret);
3317 vdev_param = WMI_VDEV_PARAM_BCAST_DATA_RATE;
3318 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3322 "failed to set bcast rate on vdev %i: %d\n",
3323 arvif->vdev_id, ret);
3326 if (changed & BSS_CHANGED_BASIC_RATES &&
3327 !ath11k_mac_vif_chan(arvif->vif, &def))
3328 ath11k_recalculate_mgmt_rate(ar, vif, &def);
3330 if (changed & BSS_CHANGED_TWT) {
3331 if (info->twt_requester || info->twt_responder)
3332 ath11k_wmi_send_twt_enable_cmd(ar, ar->pdev->pdev_id);
3334 ath11k_wmi_send_twt_disable_cmd(ar, ar->pdev->pdev_id);
3337 if (changed & BSS_CHANGED_HE_OBSS_PD)
3338 ath11k_mac_config_obss_pd(ar, &info->he_obss_pd);
3340 if (changed & BSS_CHANGED_HE_BSS_COLOR) {
3341 if (vif->type == NL80211_IFTYPE_AP) {
3342 ret = ath11k_wmi_send_obss_color_collision_cfg_cmd(
3343 ar, arvif->vdev_id, info->he_bss_color.color,
3344 ATH11K_BSS_COLOR_COLLISION_DETECTION_AP_PERIOD_MS,
3345 info->he_bss_color.enabled);
3347 ath11k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n",
3348 arvif->vdev_id, ret);
3350 param_id = WMI_VDEV_PARAM_BSS_COLOR;
3351 if (info->he_bss_color.enabled)
3352 param_value = info->he_bss_color.color <<
3353 IEEE80211_HE_OPERATION_BSS_COLOR_OFFSET;
3355 param_value = IEEE80211_HE_OPERATION_BSS_COLOR_DISABLED;
3357 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3362 "failed to set bss color param on vdev %i: %d\n",
3363 arvif->vdev_id, ret);
3365 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3366 "bss color param 0x%x set on vdev %i\n",
3367 param_value, arvif->vdev_id);
3368 } else if (vif->type == NL80211_IFTYPE_STATION) {
3369 ret = ath11k_wmi_send_bss_color_change_enable_cmd(ar,
3373 ath11k_warn(ar->ab, "failed to enable bss color change on vdev %i: %d\n",
3374 arvif->vdev_id, ret);
3375 ret = ath11k_wmi_send_obss_color_collision_cfg_cmd(
3376 ar, arvif->vdev_id, 0,
3377 ATH11K_BSS_COLOR_COLLISION_DETECTION_STA_PERIOD_MS, 1);
3379 ath11k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n",
3380 arvif->vdev_id, ret);
3384 if (changed & BSS_CHANGED_FILS_DISCOVERY ||
3385 changed & BSS_CHANGED_UNSOL_BCAST_PROBE_RESP)
3386 ath11k_mac_fils_discovery(arvif, info);
3388 mutex_unlock(&ar->conf_mutex);
3391 void __ath11k_mac_scan_finish(struct ath11k *ar)
3393 lockdep_assert_held(&ar->data_lock);
3395 switch (ar->scan.state) {
3396 case ATH11K_SCAN_IDLE:
3398 case ATH11K_SCAN_RUNNING:
3399 case ATH11K_SCAN_ABORTING:
3400 if (ar->scan.is_roc && ar->scan.roc_notify)
3401 ieee80211_remain_on_channel_expired(ar->hw);
3403 case ATH11K_SCAN_STARTING:
3404 if (!ar->scan.is_roc) {
3405 struct cfg80211_scan_info info = {
3406 .aborted = ((ar->scan.state ==
3407 ATH11K_SCAN_ABORTING) ||
3409 ATH11K_SCAN_STARTING)),
3412 ieee80211_scan_completed(ar->hw, &info);
3415 ar->scan.state = ATH11K_SCAN_IDLE;
3416 ar->scan_channel = NULL;
3417 ar->scan.roc_freq = 0;
3418 cancel_delayed_work(&ar->scan.timeout);
3419 complete(&ar->scan.completed);
3424 void ath11k_mac_scan_finish(struct ath11k *ar)
3426 spin_lock_bh(&ar->data_lock);
3427 __ath11k_mac_scan_finish(ar);
3428 spin_unlock_bh(&ar->data_lock);
3431 static int ath11k_scan_stop(struct ath11k *ar)
3433 struct scan_cancel_param arg = {
3434 .req_type = WLAN_SCAN_CANCEL_SINGLE,
3435 .scan_id = ATH11K_SCAN_ID,
3439 lockdep_assert_held(&ar->conf_mutex);
3441 /* TODO: Fill other STOP Params */
3442 arg.pdev_id = ar->pdev->pdev_id;
3444 ret = ath11k_wmi_send_scan_stop_cmd(ar, &arg);
3446 ath11k_warn(ar->ab, "failed to stop wmi scan: %d\n", ret);
3450 ret = wait_for_completion_timeout(&ar->scan.completed, 3 * HZ);
3453 "failed to receive scan abort comple: timed out\n");
3455 } else if (ret > 0) {
3460 /* Scan state should be updated upon scan completion but in case
3461 * firmware fails to deliver the event (for whatever reason) it is
3462 * desired to clean up scan state anyway. Firmware may have just
3463 * dropped the scan completion event delivery due to transport pipe
3464 * being overflown with data and/or it can recover on its own before
3465 * next scan request is submitted.
3467 spin_lock_bh(&ar->data_lock);
3468 if (ar->scan.state != ATH11K_SCAN_IDLE)
3469 __ath11k_mac_scan_finish(ar);
3470 spin_unlock_bh(&ar->data_lock);
3475 static void ath11k_scan_abort(struct ath11k *ar)
3479 lockdep_assert_held(&ar->conf_mutex);
3481 spin_lock_bh(&ar->data_lock);
3483 switch (ar->scan.state) {
3484 case ATH11K_SCAN_IDLE:
3485 /* This can happen if timeout worker kicked in and called
3486 * abortion while scan completion was being processed.
3489 case ATH11K_SCAN_STARTING:
3490 case ATH11K_SCAN_ABORTING:
3491 ath11k_warn(ar->ab, "refusing scan abortion due to invalid scan state: %d\n",
3494 case ATH11K_SCAN_RUNNING:
3495 ar->scan.state = ATH11K_SCAN_ABORTING;
3496 spin_unlock_bh(&ar->data_lock);
3498 ret = ath11k_scan_stop(ar);
3500 ath11k_warn(ar->ab, "failed to abort scan: %d\n", ret);
3502 spin_lock_bh(&ar->data_lock);
3506 spin_unlock_bh(&ar->data_lock);
3509 static void ath11k_scan_timeout_work(struct work_struct *work)
3511 struct ath11k *ar = container_of(work, struct ath11k,
3514 mutex_lock(&ar->conf_mutex);
3515 ath11k_scan_abort(ar);
3516 mutex_unlock(&ar->conf_mutex);
3519 static int ath11k_start_scan(struct ath11k *ar,
3520 struct scan_req_params *arg)
3523 unsigned long timeout = 1 * HZ;
3525 lockdep_assert_held(&ar->conf_mutex);
3527 if (ath11k_spectral_get_mode(ar) == ATH11K_SPECTRAL_BACKGROUND)
3528 ath11k_spectral_reset_buffer(ar);
3530 ret = ath11k_wmi_send_scan_start_cmd(ar, arg);
3534 if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map)) {
3537 if (ar->supports_6ghz)
3541 ret = wait_for_completion_timeout(&ar->scan.started, timeout);
3543 ret = ath11k_scan_stop(ar);
3545 ath11k_warn(ar->ab, "failed to stop scan: %d\n", ret);
3550 /* If we failed to start the scan, return error code at
3551 * this point. This is probably due to some issue in the
3552 * firmware, but no need to wedge the driver due to that...
3554 spin_lock_bh(&ar->data_lock);
3555 if (ar->scan.state == ATH11K_SCAN_IDLE) {
3556 spin_unlock_bh(&ar->data_lock);
3559 spin_unlock_bh(&ar->data_lock);
3564 static int ath11k_mac_op_hw_scan(struct ieee80211_hw *hw,
3565 struct ieee80211_vif *vif,
3566 struct ieee80211_scan_request *hw_req)
3568 struct ath11k *ar = hw->priv;
3569 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
3570 struct cfg80211_scan_request *req = &hw_req->req;
3571 struct scan_req_params arg;
3575 mutex_lock(&ar->conf_mutex);
3577 spin_lock_bh(&ar->data_lock);
3578 switch (ar->scan.state) {
3579 case ATH11K_SCAN_IDLE:
3580 reinit_completion(&ar->scan.started);
3581 reinit_completion(&ar->scan.completed);
3582 ar->scan.state = ATH11K_SCAN_STARTING;
3583 ar->scan.is_roc = false;
3584 ar->scan.vdev_id = arvif->vdev_id;
3587 case ATH11K_SCAN_STARTING:
3588 case ATH11K_SCAN_RUNNING:
3589 case ATH11K_SCAN_ABORTING:
3593 spin_unlock_bh(&ar->data_lock);
3598 /* Currently the pending_11d=true only happened 1 time while
3599 * wlan interface up in ath11k_mac_11d_scan_start(), it is called by
3600 * ath11k_mac_op_add_interface(), after wlan interface up,
3601 * pending_11d=false always.
3602 * If remove below wait, it always happened scan fail and lead connect
3603 * fail while wlan interface up, because it has a 11d scan which is running
3604 * in firmware, and lead this scan failed.
3606 if (ar->pending_11d) {
3608 unsigned long timeout = 5 * HZ;
3610 if (ar->supports_6ghz)
3613 time_left = wait_for_completion_timeout(&ar->finish_11d_ch_list, timeout);
3614 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3615 "mac wait 11d channel list time left %ld\n", time_left);
3618 memset(&arg, 0, sizeof(arg));
3619 ath11k_wmi_start_scan_init(ar, &arg);
3620 arg.vdev_id = arvif->vdev_id;
3621 arg.scan_id = ATH11K_SCAN_ID;
3624 arg.extraie.ptr = kmemdup(req->ie, req->ie_len, GFP_KERNEL);
3625 if (!arg.extraie.ptr) {
3629 arg.extraie.len = req->ie_len;
3633 arg.num_ssids = req->n_ssids;
3634 for (i = 0; i < arg.num_ssids; i++) {
3635 arg.ssid[i].length = req->ssids[i].ssid_len;
3636 memcpy(&arg.ssid[i].ssid, req->ssids[i].ssid,
3637 req->ssids[i].ssid_len);
3640 arg.scan_flags |= WMI_SCAN_FLAG_PASSIVE;
3643 if (req->n_channels) {
3644 arg.num_chan = req->n_channels;
3645 arg.chan_list = kcalloc(arg.num_chan, sizeof(*arg.chan_list),
3648 if (!arg.chan_list) {
3653 for (i = 0; i < arg.num_chan; i++)
3654 arg.chan_list[i] = req->channels[i]->center_freq;
3657 if (req->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
3658 arg.scan_f_add_spoofed_mac_in_probe = 1;
3659 ether_addr_copy(arg.mac_addr.addr, req->mac_addr);
3660 ether_addr_copy(arg.mac_mask.addr, req->mac_addr_mask);
3663 ret = ath11k_start_scan(ar, &arg);
3665 ath11k_warn(ar->ab, "failed to start hw scan: %d\n", ret);
3666 spin_lock_bh(&ar->data_lock);
3667 ar->scan.state = ATH11K_SCAN_IDLE;
3668 spin_unlock_bh(&ar->data_lock);
3671 /* Add a 200ms margin to account for event/command processing */
3672 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
3673 msecs_to_jiffies(arg.max_scan_time +
3674 ATH11K_MAC_SCAN_TIMEOUT_MSECS));
3677 kfree(arg.chan_list);
3680 kfree(arg.extraie.ptr);
3682 mutex_unlock(&ar->conf_mutex);
3686 static void ath11k_mac_op_cancel_hw_scan(struct ieee80211_hw *hw,
3687 struct ieee80211_vif *vif)
3689 struct ath11k *ar = hw->priv;
3691 mutex_lock(&ar->conf_mutex);
3692 ath11k_scan_abort(ar);
3693 mutex_unlock(&ar->conf_mutex);
3695 cancel_delayed_work_sync(&ar->scan.timeout);
3698 static int ath11k_install_key(struct ath11k_vif *arvif,
3699 struct ieee80211_key_conf *key,
3700 enum set_key_cmd cmd,
3701 const u8 *macaddr, u32 flags)
3704 struct ath11k *ar = arvif->ar;
3705 struct wmi_vdev_install_key_arg arg = {
3706 .vdev_id = arvif->vdev_id,
3707 .key_idx = key->keyidx,
3708 .key_len = key->keylen,
3709 .key_data = key->key,
3714 lockdep_assert_held(&arvif->ar->conf_mutex);
3716 reinit_completion(&ar->install_key_done);
3718 if (test_bit(ATH11K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags))
3721 if (cmd == DISABLE_KEY) {
3722 arg.key_cipher = WMI_CIPHER_NONE;
3723 arg.key_data = NULL;
3727 switch (key->cipher) {
3728 case WLAN_CIPHER_SUITE_CCMP:
3729 arg.key_cipher = WMI_CIPHER_AES_CCM;
3730 /* TODO: Re-check if flag is valid */
3731 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT;
3733 case WLAN_CIPHER_SUITE_TKIP:
3734 arg.key_cipher = WMI_CIPHER_TKIP;
3735 arg.key_txmic_len = 8;
3736 arg.key_rxmic_len = 8;
3738 case WLAN_CIPHER_SUITE_CCMP_256:
3739 arg.key_cipher = WMI_CIPHER_AES_CCM;
3741 case WLAN_CIPHER_SUITE_GCMP:
3742 case WLAN_CIPHER_SUITE_GCMP_256:
3743 arg.key_cipher = WMI_CIPHER_AES_GCM;
3746 ath11k_warn(ar->ab, "cipher %d is not supported\n", key->cipher);
3750 if (test_bit(ATH11K_FLAG_RAW_MODE, &ar->ab->dev_flags))
3751 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV |
3752 IEEE80211_KEY_FLAG_RESERVE_TAILROOM;
3755 ret = ath11k_wmi_vdev_install_key(arvif->ar, &arg);
3760 if (!wait_for_completion_timeout(&ar->install_key_done, 1 * HZ))
3763 return ar->install_key_status ? -EINVAL : 0;
3766 static int ath11k_clear_peer_keys(struct ath11k_vif *arvif,
3769 struct ath11k *ar = arvif->ar;
3770 struct ath11k_base *ab = ar->ab;
3771 struct ath11k_peer *peer;
3772 int first_errno = 0;
3777 lockdep_assert_held(&ar->conf_mutex);
3779 spin_lock_bh(&ab->base_lock);
3780 peer = ath11k_peer_find(ab, arvif->vdev_id, addr);
3781 spin_unlock_bh(&ab->base_lock);
3786 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
3790 /* key flags are not required to delete the key */
3791 ret = ath11k_install_key(arvif, peer->keys[i],
3792 DISABLE_KEY, addr, flags);
3793 if (ret < 0 && first_errno == 0)
3797 ath11k_warn(ab, "failed to remove peer key %d: %d\n",
3800 spin_lock_bh(&ab->base_lock);
3801 peer->keys[i] = NULL;
3802 spin_unlock_bh(&ab->base_lock);
3808 static int ath11k_mac_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
3809 struct ieee80211_vif *vif, struct ieee80211_sta *sta,
3810 struct ieee80211_key_conf *key)
3812 struct ath11k *ar = hw->priv;
3813 struct ath11k_base *ab = ar->ab;
3814 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
3815 struct ath11k_peer *peer;
3816 struct ath11k_sta *arsta;
3817 const u8 *peer_addr;
3821 /* BIP needs to be done in software */
3822 if (key->cipher == WLAN_CIPHER_SUITE_AES_CMAC ||
3823 key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_128 ||
3824 key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_256 ||
3825 key->cipher == WLAN_CIPHER_SUITE_BIP_CMAC_256)
3828 if (test_bit(ATH11K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags))
3831 if (key->keyidx > WMI_MAX_KEY_INDEX)
3834 mutex_lock(&ar->conf_mutex);
3837 peer_addr = sta->addr;
3838 else if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
3839 peer_addr = vif->bss_conf.bssid;
3841 peer_addr = vif->addr;
3843 key->hw_key_idx = key->keyidx;
3845 /* the peer should not disappear in mid-way (unless FW goes awry) since
3846 * we already hold conf_mutex. we just make sure its there now.
3848 spin_lock_bh(&ab->base_lock);
3849 peer = ath11k_peer_find(ab, arvif->vdev_id, peer_addr);
3851 /* flush the fragments cache during key (re)install to
3852 * ensure all frags in the new frag list belong to the same key.
3854 if (peer && sta && cmd == SET_KEY)
3855 ath11k_peer_frags_flush(ar, peer);
3856 spin_unlock_bh(&ab->base_lock);
3859 if (cmd == SET_KEY) {
3860 ath11k_warn(ab, "cannot install key for non-existent peer %pM\n",
3865 /* if the peer doesn't exist there is no key to disable
3872 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
3873 flags |= WMI_KEY_PAIRWISE;
3875 flags |= WMI_KEY_GROUP;
3877 ret = ath11k_install_key(arvif, key, cmd, peer_addr, flags);
3879 ath11k_warn(ab, "ath11k_install_key failed (%d)\n", ret);
3883 ret = ath11k_dp_peer_rx_pn_replay_config(arvif, peer_addr, cmd, key);
3885 ath11k_warn(ab, "failed to offload PN replay detection %d\n", ret);
3889 spin_lock_bh(&ab->base_lock);
3890 peer = ath11k_peer_find(ab, arvif->vdev_id, peer_addr);
3891 if (peer && cmd == SET_KEY) {
3892 peer->keys[key->keyidx] = key;
3893 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) {
3894 peer->ucast_keyidx = key->keyidx;
3895 peer->sec_type = ath11k_dp_tx_get_encrypt_type(key->cipher);
3897 peer->mcast_keyidx = key->keyidx;
3898 peer->sec_type_grp = ath11k_dp_tx_get_encrypt_type(key->cipher);
3900 } else if (peer && cmd == DISABLE_KEY) {
3901 peer->keys[key->keyidx] = NULL;
3902 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
3903 peer->ucast_keyidx = 0;
3905 peer->mcast_keyidx = 0;
3907 /* impossible unless FW goes crazy */
3908 ath11k_warn(ab, "peer %pM disappeared!\n", peer_addr);
3911 arsta = (struct ath11k_sta *)sta->drv_priv;
3913 switch (key->cipher) {
3914 case WLAN_CIPHER_SUITE_TKIP:
3915 case WLAN_CIPHER_SUITE_CCMP:
3916 case WLAN_CIPHER_SUITE_CCMP_256:
3917 case WLAN_CIPHER_SUITE_GCMP:
3918 case WLAN_CIPHER_SUITE_GCMP_256:
3920 arsta->pn_type = HAL_PN_TYPE_WPA;
3922 arsta->pn_type = HAL_PN_TYPE_NONE;
3925 arsta->pn_type = HAL_PN_TYPE_NONE;
3930 spin_unlock_bh(&ab->base_lock);
3933 mutex_unlock(&ar->conf_mutex);
3938 ath11k_mac_bitrate_mask_num_vht_rates(struct ath11k *ar,
3939 enum nl80211_band band,
3940 const struct cfg80211_bitrate_mask *mask)
3945 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++)
3946 num_rates += hweight16(mask->control[band].vht_mcs[i]);
3952 ath11k_mac_bitrate_mask_num_he_rates(struct ath11k *ar,
3953 enum nl80211_band band,
3954 const struct cfg80211_bitrate_mask *mask)
3959 for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++)
3960 num_rates += hweight16(mask->control[band].he_mcs[i]);
3966 ath11k_mac_set_peer_vht_fixed_rate(struct ath11k_vif *arvif,
3967 struct ieee80211_sta *sta,
3968 const struct cfg80211_bitrate_mask *mask,
3969 enum nl80211_band band)
3971 struct ath11k *ar = arvif->ar;
3976 lockdep_assert_held(&ar->conf_mutex);
3980 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
3981 if (hweight16(mask->control[band].vht_mcs[i]) == 1) {
3983 vht_rate = ffs(mask->control[band].vht_mcs[i]) - 1;
3988 ath11k_warn(ar->ab, "No single VHT Fixed rate found to set for %pM",
3993 /* Avoid updating invalid nss as fixed rate*/
3994 if (nss > sta->rx_nss)
3997 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3998 "Setting Fixed VHT Rate for peer %pM. Device will not switch to any other selected rates",
4001 rate_code = ATH11K_HW_RATE_CODE(vht_rate, nss - 1,
4002 WMI_RATE_PREAMBLE_VHT);
4003 ret = ath11k_wmi_set_peer_param(ar, sta->addr,
4005 WMI_PEER_PARAM_FIXED_RATE,
4009 "failed to update STA %pM Fixed Rate %d: %d\n",
4010 sta->addr, rate_code, ret);
4016 ath11k_mac_set_peer_he_fixed_rate(struct ath11k_vif *arvif,
4017 struct ieee80211_sta *sta,
4018 const struct cfg80211_bitrate_mask *mask,
4019 enum nl80211_band band)
4021 struct ath11k *ar = arvif->ar;
4026 lockdep_assert_held(&ar->conf_mutex);
4030 for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) {
4031 if (hweight16(mask->control[band].he_mcs[i]) == 1) {
4033 he_rate = ffs(mask->control[band].he_mcs[i]) - 1;
4038 ath11k_warn(ar->ab, "No single he fixed rate found to set for %pM",
4043 /* Avoid updating invalid nss as fixed rate */
4044 if (nss > sta->rx_nss)
4047 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
4048 "mac setting fixed he rate for peer %pM, device will not switch to any other selected rates",
4051 rate_code = ATH11K_HW_RATE_CODE(he_rate, nss - 1,
4052 WMI_RATE_PREAMBLE_HE);
4054 ret = ath11k_wmi_set_peer_param(ar, sta->addr,
4056 WMI_PEER_PARAM_FIXED_RATE,
4060 "failed to update sta %pM fixed rate %d: %d\n",
4061 sta->addr, rate_code, ret);
4066 static int ath11k_station_assoc(struct ath11k *ar,
4067 struct ieee80211_vif *vif,
4068 struct ieee80211_sta *sta,
4071 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
4072 struct peer_assoc_params peer_arg;
4074 struct cfg80211_chan_def def;
4075 enum nl80211_band band;
4076 struct cfg80211_bitrate_mask *mask;
4077 u8 num_vht_rates, num_he_rates;
4079 lockdep_assert_held(&ar->conf_mutex);
4081 if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
4084 band = def.chan->band;
4085 mask = &arvif->bitrate_mask;
4087 ath11k_peer_assoc_prepare(ar, vif, sta, &peer_arg, reassoc);
4089 peer_arg.is_assoc = true;
4090 ret = ath11k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
4092 ath11k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n",
4093 sta->addr, arvif->vdev_id, ret);
4097 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) {
4098 ath11k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
4099 sta->addr, arvif->vdev_id);
4103 num_vht_rates = ath11k_mac_bitrate_mask_num_vht_rates(ar, band, mask);
4104 num_he_rates = ath11k_mac_bitrate_mask_num_he_rates(ar, band, mask);
4106 /* If single VHT/HE rate is configured (by set_bitrate_mask()),
4107 * peer_assoc will disable VHT/HE. This is now enabled by a peer specific
4109 * Note that all other rates and NSS will be disabled for this peer.
4111 if (sta->vht_cap.vht_supported && num_vht_rates == 1) {
4112 ret = ath11k_mac_set_peer_vht_fixed_rate(arvif, sta, mask,
4116 } else if (sta->he_cap.has_he && num_he_rates == 1) {
4117 ret = ath11k_mac_set_peer_he_fixed_rate(arvif, sta, mask,
4123 /* Re-assoc is run only to update supported rates for given station. It
4124 * doesn't make much sense to reconfigure the peer completely.
4129 ret = ath11k_setup_peer_smps(ar, arvif, sta->addr,
4130 &sta->ht_cap, le16_to_cpu(sta->he_6ghz_capa.capa));
4132 ath11k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n",
4133 arvif->vdev_id, ret);
4138 arvif->num_legacy_stations++;
4139 ret = ath11k_recalc_rtscts_prot(arvif);
4144 if (sta->wme && sta->uapsd_queues) {
4145 ret = ath11k_peer_assoc_qos_ap(ar, arvif, sta);
4147 ath11k_warn(ar->ab, "failed to set qos params for STA %pM for vdev %i: %d\n",
4148 sta->addr, arvif->vdev_id, ret);
4156 static int ath11k_station_disassoc(struct ath11k *ar,
4157 struct ieee80211_vif *vif,
4158 struct ieee80211_sta *sta)
4160 struct ath11k_vif *arvif = (void *)vif->drv_priv;
4163 lockdep_assert_held(&ar->conf_mutex);
4166 arvif->num_legacy_stations--;
4167 ret = ath11k_recalc_rtscts_prot(arvif);
4172 ret = ath11k_clear_peer_keys(arvif, sta->addr);
4174 ath11k_warn(ar->ab, "failed to clear all peer keys for vdev %i: %d\n",
4175 arvif->vdev_id, ret);
4181 static void ath11k_sta_rc_update_wk(struct work_struct *wk)
4184 struct ath11k_vif *arvif;
4185 struct ath11k_sta *arsta;
4186 struct ieee80211_sta *sta;
4187 struct cfg80211_chan_def def;
4188 enum nl80211_band band;
4189 const u8 *ht_mcs_mask;
4190 const u16 *vht_mcs_mask;
4191 const u16 *he_mcs_mask;
4192 u32 changed, bw, nss, smps;
4193 int err, num_vht_rates, num_he_rates;
4194 const struct cfg80211_bitrate_mask *mask;
4195 struct peer_assoc_params peer_arg;
4197 arsta = container_of(wk, struct ath11k_sta, update_wk);
4198 sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv);
4199 arvif = arsta->arvif;
4202 if (WARN_ON(ath11k_mac_vif_chan(arvif->vif, &def)))
4205 band = def.chan->band;
4206 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
4207 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
4208 he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs;
4210 spin_lock_bh(&ar->data_lock);
4212 changed = arsta->changed;
4219 spin_unlock_bh(&ar->data_lock);
4221 mutex_lock(&ar->conf_mutex);
4223 nss = max_t(u32, 1, nss);
4224 nss = min(nss, max(max(ath11k_mac_max_ht_nss(ht_mcs_mask),
4225 ath11k_mac_max_vht_nss(vht_mcs_mask)),
4226 ath11k_mac_max_he_nss(he_mcs_mask)));
4228 if (changed & IEEE80211_RC_BW_CHANGED) {
4229 /* Send peer assoc command before set peer bandwidth param to
4230 * avoid the mismatch between the peer phymode and the peer
4233 ath11k_peer_assoc_prepare(ar, arvif->vif, sta, &peer_arg, true);
4235 peer_arg.is_assoc = false;
4236 err = ath11k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
4238 ath11k_warn(ar->ab, "failed to send peer assoc for STA %pM vdev %i: %d\n",
4239 sta->addr, arvif->vdev_id, err);
4240 } else if (wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) {
4241 err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
4242 WMI_PEER_CHWIDTH, bw);
4244 ath11k_warn(ar->ab, "failed to update STA %pM peer bw %d: %d\n",
4245 sta->addr, bw, err);
4247 ath11k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
4248 sta->addr, arvif->vdev_id);
4252 if (changed & IEEE80211_RC_NSS_CHANGED) {
4253 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac update sta %pM nss %d\n",
4256 err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
4259 ath11k_warn(ar->ab, "failed to update STA %pM nss %d: %d\n",
4260 sta->addr, nss, err);
4263 if (changed & IEEE80211_RC_SMPS_CHANGED) {
4264 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac update sta %pM smps %d\n",
4267 err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
4268 WMI_PEER_MIMO_PS_STATE, smps);
4270 ath11k_warn(ar->ab, "failed to update STA %pM smps %d: %d\n",
4271 sta->addr, smps, err);
4274 if (changed & IEEE80211_RC_SUPP_RATES_CHANGED) {
4275 mask = &arvif->bitrate_mask;
4276 num_vht_rates = ath11k_mac_bitrate_mask_num_vht_rates(ar, band,
4278 num_he_rates = ath11k_mac_bitrate_mask_num_he_rates(ar, band,
4281 /* Peer_assoc_prepare will reject vht rates in
4282 * bitrate_mask if its not available in range format and
4283 * sets vht tx_rateset as unsupported. So multiple VHT MCS
4284 * setting(eg. MCS 4,5,6) per peer is not supported here.
4285 * But, Single rate in VHT mask can be set as per-peer
4286 * fixed rate. But even if any HT rates are configured in
4287 * the bitrate mask, device will not switch to those rates
4288 * when per-peer Fixed rate is set.
4289 * TODO: Check RATEMASK_CMDID to support auto rates selection
4290 * across HT/VHT and for multiple VHT MCS support.
4292 if (sta->vht_cap.vht_supported && num_vht_rates == 1) {
4293 ath11k_mac_set_peer_vht_fixed_rate(arvif, sta, mask,
4295 } else if (sta->he_cap.has_he && num_he_rates == 1) {
4296 ath11k_mac_set_peer_he_fixed_rate(arvif, sta, mask,
4299 /* If the peer is non-VHT/HE or no fixed VHT/HE rate
4300 * is provided in the new bitrate mask we set the
4301 * other rates using peer_assoc command. Also clear
4302 * the peer fixed rate settings as it has higher proprity
4305 err = ath11k_wmi_set_peer_param(ar, sta->addr,
4307 WMI_PEER_PARAM_FIXED_RATE,
4308 WMI_FIXED_RATE_NONE);
4311 "failed to disable peer fixed rate for sta %pM: %d\n",
4314 ath11k_peer_assoc_prepare(ar, arvif->vif, sta,
4317 peer_arg.is_assoc = false;
4318 err = ath11k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
4320 ath11k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n",
4321 sta->addr, arvif->vdev_id, err);
4323 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ))
4324 ath11k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
4325 sta->addr, arvif->vdev_id);
4329 mutex_unlock(&ar->conf_mutex);
4332 static void ath11k_sta_set_4addr_wk(struct work_struct *wk)
4335 struct ath11k_vif *arvif;
4336 struct ath11k_sta *arsta;
4337 struct ieee80211_sta *sta;
4340 arsta = container_of(wk, struct ath11k_sta, set_4addr_wk);
4341 sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv);
4342 arvif = arsta->arvif;
4345 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
4346 "setting USE_4ADDR for peer %pM\n", sta->addr);
4348 ret = ath11k_wmi_set_peer_param(ar, sta->addr,
4350 WMI_PEER_USE_4ADDR, 1);
4353 ath11k_warn(ar->ab, "failed to set peer %pM 4addr capability: %d\n",
4357 static int ath11k_mac_inc_num_stations(struct ath11k_vif *arvif,
4358 struct ieee80211_sta *sta)
4360 struct ath11k *ar = arvif->ar;
4362 lockdep_assert_held(&ar->conf_mutex);
4364 if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
4367 if (ar->num_stations >= ar->max_num_stations)
4375 static void ath11k_mac_dec_num_stations(struct ath11k_vif *arvif,
4376 struct ieee80211_sta *sta)
4378 struct ath11k *ar = arvif->ar;
4380 lockdep_assert_held(&ar->conf_mutex);
4382 if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
4388 static int ath11k_mac_station_add(struct ath11k *ar,
4389 struct ieee80211_vif *vif,
4390 struct ieee80211_sta *sta)
4392 struct ath11k_base *ab = ar->ab;
4393 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
4394 struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
4395 struct peer_create_params peer_param;
4398 lockdep_assert_held(&ar->conf_mutex);
4400 ret = ath11k_mac_inc_num_stations(arvif, sta);
4402 ath11k_warn(ab, "refusing to associate station: too many connected already (%d)\n",
4403 ar->max_num_stations);
4407 arsta->rx_stats = kzalloc(sizeof(*arsta->rx_stats), GFP_KERNEL);
4408 if (!arsta->rx_stats) {
4410 goto dec_num_station;
4413 peer_param.vdev_id = arvif->vdev_id;
4414 peer_param.peer_addr = sta->addr;
4415 peer_param.peer_type = WMI_PEER_TYPE_DEFAULT;
4417 ret = ath11k_peer_create(ar, arvif, sta, &peer_param);
4419 ath11k_warn(ab, "Failed to add peer: %pM for VDEV: %d\n",
4420 sta->addr, arvif->vdev_id);
4424 ath11k_dbg(ab, ATH11K_DBG_MAC, "Added peer: %pM for VDEV: %d\n",
4425 sta->addr, arvif->vdev_id);
4427 if (ath11k_debugfs_is_extd_tx_stats_enabled(ar)) {
4428 arsta->tx_stats = kzalloc(sizeof(*arsta->tx_stats), GFP_KERNEL);
4429 if (!arsta->tx_stats) {
4435 if (ieee80211_vif_is_mesh(vif)) {
4436 ath11k_dbg(ab, ATH11K_DBG_MAC,
4437 "setting USE_4ADDR for mesh STA %pM\n", sta->addr);
4438 ret = ath11k_wmi_set_peer_param(ar, sta->addr,
4440 WMI_PEER_USE_4ADDR, 1);
4442 ath11k_warn(ab, "failed to set mesh STA %pM 4addr capability: %d\n",
4448 ret = ath11k_dp_peer_setup(ar, arvif->vdev_id, sta->addr);
4450 ath11k_warn(ab, "failed to setup dp for peer %pM on vdev %i (%d)\n",
4451 sta->addr, arvif->vdev_id, ret);
4455 if (ab->hw_params.vdev_start_delay &&
4456 !arvif->is_started &&
4457 arvif->vdev_type != WMI_VDEV_TYPE_AP) {
4458 ret = ath11k_start_vdev_delay(ar->hw, vif);
4460 ath11k_warn(ab, "failed to delay vdev start: %d\n", ret);
4468 kfree(arsta->tx_stats);
4469 arsta->tx_stats = NULL;
4471 ath11k_peer_delete(ar, arvif->vdev_id, sta->addr);
4473 kfree(arsta->rx_stats);
4474 arsta->rx_stats = NULL;
4476 ath11k_mac_dec_num_stations(arvif, sta);
4481 static int ath11k_mac_op_sta_state(struct ieee80211_hw *hw,
4482 struct ieee80211_vif *vif,
4483 struct ieee80211_sta *sta,
4484 enum ieee80211_sta_state old_state,
4485 enum ieee80211_sta_state new_state)
4487 struct ath11k *ar = hw->priv;
4488 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
4489 struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
4490 struct ath11k_peer *peer;
4493 /* cancel must be done outside the mutex to avoid deadlock */
4494 if ((old_state == IEEE80211_STA_NONE &&
4495 new_state == IEEE80211_STA_NOTEXIST)) {
4496 cancel_work_sync(&arsta->update_wk);
4497 cancel_work_sync(&arsta->set_4addr_wk);
4500 mutex_lock(&ar->conf_mutex);
4502 if (old_state == IEEE80211_STA_NOTEXIST &&
4503 new_state == IEEE80211_STA_NONE) {
4504 memset(arsta, 0, sizeof(*arsta));
4505 arsta->arvif = arvif;
4506 INIT_WORK(&arsta->update_wk, ath11k_sta_rc_update_wk);
4507 INIT_WORK(&arsta->set_4addr_wk, ath11k_sta_set_4addr_wk);
4509 ret = ath11k_mac_station_add(ar, vif, sta);
4511 ath11k_warn(ar->ab, "Failed to add station: %pM for VDEV: %d\n",
4512 sta->addr, arvif->vdev_id);
4513 } else if ((old_state == IEEE80211_STA_NONE &&
4514 new_state == IEEE80211_STA_NOTEXIST)) {
4515 bool skip_peer_delete = ar->ab->hw_params.vdev_start_delay &&
4516 vif->type == NL80211_IFTYPE_STATION;
4518 ath11k_dp_peer_cleanup(ar, arvif->vdev_id, sta->addr);
4520 if (!skip_peer_delete) {
4521 ret = ath11k_peer_delete(ar, arvif->vdev_id, sta->addr);
4524 "Failed to delete peer: %pM for VDEV: %d\n",
4525 sta->addr, arvif->vdev_id);
4529 "Removed peer: %pM for VDEV: %d\n",
4530 sta->addr, arvif->vdev_id);
4533 ath11k_mac_dec_num_stations(arvif, sta);
4534 spin_lock_bh(&ar->ab->base_lock);
4535 peer = ath11k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
4536 if (skip_peer_delete && peer) {
4538 } else if (peer && peer->sta == sta) {
4539 ath11k_warn(ar->ab, "Found peer entry %pM n vdev %i after it was supposedly removed\n",
4540 vif->addr, arvif->vdev_id);
4542 list_del(&peer->list);
4546 spin_unlock_bh(&ar->ab->base_lock);
4548 kfree(arsta->tx_stats);
4549 arsta->tx_stats = NULL;
4551 kfree(arsta->rx_stats);
4552 arsta->rx_stats = NULL;
4553 } else if (old_state == IEEE80211_STA_AUTH &&
4554 new_state == IEEE80211_STA_ASSOC &&
4555 (vif->type == NL80211_IFTYPE_AP ||
4556 vif->type == NL80211_IFTYPE_MESH_POINT ||
4557 vif->type == NL80211_IFTYPE_ADHOC)) {
4558 ret = ath11k_station_assoc(ar, vif, sta, false);
4560 ath11k_warn(ar->ab, "Failed to associate station: %pM\n",
4562 } else if (old_state == IEEE80211_STA_ASSOC &&
4563 new_state == IEEE80211_STA_AUTHORIZED) {
4564 spin_lock_bh(&ar->ab->base_lock);
4566 peer = ath11k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
4568 peer->is_authorized = true;
4570 spin_unlock_bh(&ar->ab->base_lock);
4572 if (vif->type == NL80211_IFTYPE_STATION && arvif->is_up) {
4573 ret = ath11k_wmi_set_peer_param(ar, sta->addr,
4578 ath11k_warn(ar->ab, "Unable to authorize peer %pM vdev %d: %d\n",
4579 sta->addr, arvif->vdev_id, ret);
4581 } else if (old_state == IEEE80211_STA_AUTHORIZED &&
4582 new_state == IEEE80211_STA_ASSOC) {
4583 spin_lock_bh(&ar->ab->base_lock);
4585 peer = ath11k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
4587 peer->is_authorized = false;
4589 spin_unlock_bh(&ar->ab->base_lock);
4590 } else if (old_state == IEEE80211_STA_ASSOC &&
4591 new_state == IEEE80211_STA_AUTH &&
4592 (vif->type == NL80211_IFTYPE_AP ||
4593 vif->type == NL80211_IFTYPE_MESH_POINT ||
4594 vif->type == NL80211_IFTYPE_ADHOC)) {
4595 ret = ath11k_station_disassoc(ar, vif, sta);
4597 ath11k_warn(ar->ab, "Failed to disassociate station: %pM\n",
4601 mutex_unlock(&ar->conf_mutex);
4605 static int ath11k_mac_op_sta_set_txpwr(struct ieee80211_hw *hw,
4606 struct ieee80211_vif *vif,
4607 struct ieee80211_sta *sta)
4609 struct ath11k *ar = hw->priv;
4610 struct ath11k_vif *arvif = (void *)vif->drv_priv;
4614 if (sta->txpwr.type == NL80211_TX_POWER_AUTOMATIC) {
4617 txpwr = sta->txpwr.power;
4622 if (txpwr > ATH11K_TX_POWER_MAX_VAL || txpwr < ATH11K_TX_POWER_MIN_VAL)
4625 mutex_lock(&ar->conf_mutex);
4627 ret = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
4628 WMI_PEER_USE_FIXED_PWR, txpwr);
4630 ath11k_warn(ar->ab, "failed to set tx power for station ret: %d\n",
4636 mutex_unlock(&ar->conf_mutex);
4640 static void ath11k_mac_op_sta_set_4addr(struct ieee80211_hw *hw,
4641 struct ieee80211_vif *vif,
4642 struct ieee80211_sta *sta, bool enabled)
4644 struct ath11k *ar = hw->priv;
4645 struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
4647 if (enabled && !arsta->use_4addr_set) {
4648 ieee80211_queue_work(ar->hw, &arsta->set_4addr_wk);
4649 arsta->use_4addr_set = true;
4653 static void ath11k_mac_op_sta_rc_update(struct ieee80211_hw *hw,
4654 struct ieee80211_vif *vif,
4655 struct ieee80211_sta *sta,
4658 struct ath11k *ar = hw->priv;
4659 struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
4660 struct ath11k_vif *arvif = (void *)vif->drv_priv;
4661 struct ath11k_peer *peer;
4664 spin_lock_bh(&ar->ab->base_lock);
4666 peer = ath11k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
4668 spin_unlock_bh(&ar->ab->base_lock);
4669 ath11k_warn(ar->ab, "mac sta rc update failed to find peer %pM on vdev %i\n",
4670 sta->addr, arvif->vdev_id);
4674 spin_unlock_bh(&ar->ab->base_lock);
4676 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
4677 "mac sta rc update for %pM changed %08x bw %d nss %d smps %d\n",
4678 sta->addr, changed, sta->bandwidth, sta->rx_nss,
4681 spin_lock_bh(&ar->data_lock);
4683 if (changed & IEEE80211_RC_BW_CHANGED) {
4684 bw = WMI_PEER_CHWIDTH_20MHZ;
4686 switch (sta->bandwidth) {
4687 case IEEE80211_STA_RX_BW_20:
4688 bw = WMI_PEER_CHWIDTH_20MHZ;
4690 case IEEE80211_STA_RX_BW_40:
4691 bw = WMI_PEER_CHWIDTH_40MHZ;
4693 case IEEE80211_STA_RX_BW_80:
4694 bw = WMI_PEER_CHWIDTH_80MHZ;
4696 case IEEE80211_STA_RX_BW_160:
4697 bw = WMI_PEER_CHWIDTH_160MHZ;
4700 ath11k_warn(ar->ab, "Invalid bandwidth %d in rc update for %pM\n",
4701 sta->bandwidth, sta->addr);
4702 bw = WMI_PEER_CHWIDTH_20MHZ;
4709 if (changed & IEEE80211_RC_NSS_CHANGED)
4710 arsta->nss = sta->rx_nss;
4712 if (changed & IEEE80211_RC_SMPS_CHANGED) {
4713 smps = WMI_PEER_SMPS_PS_NONE;
4715 switch (sta->smps_mode) {
4716 case IEEE80211_SMPS_AUTOMATIC:
4717 case IEEE80211_SMPS_OFF:
4718 smps = WMI_PEER_SMPS_PS_NONE;
4720 case IEEE80211_SMPS_STATIC:
4721 smps = WMI_PEER_SMPS_STATIC;
4723 case IEEE80211_SMPS_DYNAMIC:
4724 smps = WMI_PEER_SMPS_DYNAMIC;
4727 ath11k_warn(ar->ab, "Invalid smps %d in sta rc update for %pM\n",
4728 sta->smps_mode, sta->addr);
4729 smps = WMI_PEER_SMPS_PS_NONE;
4736 arsta->changed |= changed;
4738 spin_unlock_bh(&ar->data_lock);
4740 ieee80211_queue_work(hw, &arsta->update_wk);
4743 static int ath11k_conf_tx_uapsd(struct ath11k *ar, struct ieee80211_vif *vif,
4744 u16 ac, bool enable)
4746 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
4750 if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
4754 case IEEE80211_AC_VO:
4755 value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN |
4756 WMI_STA_PS_UAPSD_AC3_TRIGGER_EN;
4758 case IEEE80211_AC_VI:
4759 value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN |
4760 WMI_STA_PS_UAPSD_AC2_TRIGGER_EN;
4762 case IEEE80211_AC_BE:
4763 value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN |
4764 WMI_STA_PS_UAPSD_AC1_TRIGGER_EN;
4766 case IEEE80211_AC_BK:
4767 value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN |
4768 WMI_STA_PS_UAPSD_AC0_TRIGGER_EN;
4773 arvif->u.sta.uapsd |= value;
4775 arvif->u.sta.uapsd &= ~value;
4777 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
4778 WMI_STA_PS_PARAM_UAPSD,
4779 arvif->u.sta.uapsd);
4781 ath11k_warn(ar->ab, "could not set uapsd params %d\n", ret);
4785 if (arvif->u.sta.uapsd)
4786 value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD;
4788 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
4790 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
4791 WMI_STA_PS_PARAM_RX_WAKE_POLICY,
4794 ath11k_warn(ar->ab, "could not set rx wake param %d\n", ret);
4800 static int ath11k_mac_op_conf_tx(struct ieee80211_hw *hw,
4801 struct ieee80211_vif *vif, u16 ac,
4802 const struct ieee80211_tx_queue_params *params)
4804 struct ath11k *ar = hw->priv;
4805 struct ath11k_vif *arvif = (void *)vif->drv_priv;
4806 struct wmi_wmm_params_arg *p = NULL;
4809 mutex_lock(&ar->conf_mutex);
4812 case IEEE80211_AC_VO:
4813 p = &arvif->wmm_params.ac_vo;
4815 case IEEE80211_AC_VI:
4816 p = &arvif->wmm_params.ac_vi;
4818 case IEEE80211_AC_BE:
4819 p = &arvif->wmm_params.ac_be;
4821 case IEEE80211_AC_BK:
4822 p = &arvif->wmm_params.ac_bk;
4831 p->cwmin = params->cw_min;
4832 p->cwmax = params->cw_max;
4833 p->aifs = params->aifs;
4834 p->txop = params->txop;
4836 ret = ath11k_wmi_send_wmm_update_cmd_tlv(ar, arvif->vdev_id,
4837 &arvif->wmm_params);
4839 ath11k_warn(ar->ab, "failed to set wmm params: %d\n", ret);
4843 ret = ath11k_conf_tx_uapsd(ar, vif, ac, params->uapsd);
4846 ath11k_warn(ar->ab, "failed to set sta uapsd: %d\n", ret);
4849 mutex_unlock(&ar->conf_mutex);
4853 static struct ieee80211_sta_ht_cap
4854 ath11k_create_ht_cap(struct ath11k *ar, u32 ar_ht_cap, u32 rate_cap_rx_chainmask)
4857 struct ieee80211_sta_ht_cap ht_cap = {0};
4858 u32 ar_vht_cap = ar->pdev->cap.vht_cap;
4860 if (!(ar_ht_cap & WMI_HT_CAP_ENABLED))
4863 ht_cap.ht_supported = 1;
4864 ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
4865 ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_NONE;
4866 ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
4867 ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
4868 ht_cap.cap |= WLAN_HT_CAP_SM_PS_STATIC << IEEE80211_HT_CAP_SM_PS_SHIFT;
4870 if (ar_ht_cap & WMI_HT_CAP_HT20_SGI)
4871 ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
4873 if (ar_ht_cap & WMI_HT_CAP_HT40_SGI)
4874 ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
4876 if (ar_ht_cap & WMI_HT_CAP_DYNAMIC_SMPS) {
4879 smps = WLAN_HT_CAP_SM_PS_DYNAMIC;
4880 smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT;
4885 if (ar_ht_cap & WMI_HT_CAP_TX_STBC)
4886 ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC;
4888 if (ar_ht_cap & WMI_HT_CAP_RX_STBC) {
4892 stbc &= WMI_HT_CAP_RX_STBC;
4893 stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT;
4894 stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT;
4895 stbc &= IEEE80211_HT_CAP_RX_STBC;
4900 if (ar_ht_cap & WMI_HT_CAP_RX_LDPC)
4901 ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
4903 if (ar_ht_cap & WMI_HT_CAP_L_SIG_TXOP_PROT)
4904 ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
4906 if (ar_vht_cap & WMI_VHT_CAP_MAX_MPDU_LEN_MASK)
4907 ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU;
4909 for (i = 0; i < ar->num_rx_chains; i++) {
4910 if (rate_cap_rx_chainmask & BIT(i))
4911 ht_cap.mcs.rx_mask[i] = 0xFF;
4914 ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
4919 static int ath11k_mac_set_txbf_conf(struct ath11k_vif *arvif)
4922 struct ath11k *ar = arvif->ar;
4925 u32 vht_cap = ar->pdev->cap.vht_cap;
4926 u32 vdev_param = WMI_VDEV_PARAM_TXBF;
4928 if (vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)) {
4929 nsts = vht_cap & IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
4930 nsts >>= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
4931 value |= SM(nsts, WMI_TXBF_STS_CAP_OFFSET);
4934 if (vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)) {
4935 sound_dim = vht_cap &
4936 IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
4937 sound_dim >>= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
4938 if (sound_dim > (ar->num_tx_chains - 1))
4939 sound_dim = ar->num_tx_chains - 1;
4940 value |= SM(sound_dim, WMI_BF_SOUND_DIM_OFFSET);
4946 if (vht_cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE) {
4947 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
4949 if ((vht_cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE) &&
4950 arvif->vdev_type == WMI_VDEV_TYPE_AP)
4951 value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFER;
4954 /* TODO: SUBFEE not validated in HK, disable here until validated? */
4956 if (vht_cap & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE) {
4957 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
4959 if ((vht_cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE) &&
4960 arvif->vdev_type == WMI_VDEV_TYPE_STA)
4961 value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFEE;
4964 return ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4968 static void ath11k_set_vht_txbf_cap(struct ath11k *ar, u32 *vht_cap)
4970 bool subfer, subfee;
4973 subfer = !!(*vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE));
4974 subfee = !!(*vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE));
4976 if (ar->num_tx_chains < 2) {
4977 *vht_cap &= ~(IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE);
4981 /* If SU Beaformer is not set, then disable MU Beamformer Capability */
4983 *vht_cap &= ~(IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE);
4985 /* If SU Beaformee is not set, then disable MU Beamformee Capability */
4987 *vht_cap &= ~(IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE);
4989 sound_dim = (*vht_cap & IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK);
4990 sound_dim >>= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
4991 *vht_cap &= ~IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
4993 /* TODO: Need to check invalid STS and Sound_dim values set by FW? */
4995 /* Enable Sounding Dimension Field only if SU BF is enabled */
4997 if (sound_dim > (ar->num_tx_chains - 1))
4998 sound_dim = ar->num_tx_chains - 1;
5000 sound_dim <<= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
5001 sound_dim &= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
5002 *vht_cap |= sound_dim;
5005 /* Use the STS advertised by FW unless SU Beamformee is not supported*/
5007 *vht_cap &= ~(IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK);
5010 static struct ieee80211_sta_vht_cap
5011 ath11k_create_vht_cap(struct ath11k *ar, u32 rate_cap_tx_chainmask,
5012 u32 rate_cap_rx_chainmask)
5014 struct ieee80211_sta_vht_cap vht_cap = {0};
5015 u16 txmcs_map, rxmcs_map;
5018 vht_cap.vht_supported = 1;
5019 vht_cap.cap = ar->pdev->cap.vht_cap;
5021 if (ar->pdev->cap.nss_ratio_enabled)
5022 vht_cap.vht_mcs.tx_highest |=
5023 cpu_to_le16(IEEE80211_VHT_EXT_NSS_BW_CAPABLE);
5025 ath11k_set_vht_txbf_cap(ar, &vht_cap.cap);
5029 for (i = 0; i < 8; i++) {
5030 if (i < ar->num_tx_chains && rate_cap_tx_chainmask & BIT(i))
5031 txmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
5033 txmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
5035 if (i < ar->num_rx_chains && rate_cap_rx_chainmask & BIT(i))
5036 rxmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
5038 rxmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
5041 if (rate_cap_tx_chainmask <= 1)
5042 vht_cap.cap &= ~IEEE80211_VHT_CAP_TXSTBC;
5044 vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(rxmcs_map);
5045 vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(txmcs_map);
5050 static void ath11k_mac_setup_ht_vht_cap(struct ath11k *ar,
5051 struct ath11k_pdev_cap *cap,
5054 struct ieee80211_supported_band *band;
5055 u32 rate_cap_tx_chainmask;
5056 u32 rate_cap_rx_chainmask;
5059 rate_cap_tx_chainmask = ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift;
5060 rate_cap_rx_chainmask = ar->cfg_rx_chainmask >> cap->rx_chain_mask_shift;
5062 if (cap->supported_bands & WMI_HOST_WLAN_2G_CAP) {
5063 band = &ar->mac.sbands[NL80211_BAND_2GHZ];
5064 ht_cap = cap->band[NL80211_BAND_2GHZ].ht_cap_info;
5066 *ht_cap_info = ht_cap;
5067 band->ht_cap = ath11k_create_ht_cap(ar, ht_cap,
5068 rate_cap_rx_chainmask);
5071 if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP &&
5072 (ar->ab->hw_params.single_pdev_only ||
5073 !ar->supports_6ghz)) {
5074 band = &ar->mac.sbands[NL80211_BAND_5GHZ];
5075 ht_cap = cap->band[NL80211_BAND_5GHZ].ht_cap_info;
5077 *ht_cap_info = ht_cap;
5078 band->ht_cap = ath11k_create_ht_cap(ar, ht_cap,
5079 rate_cap_rx_chainmask);
5080 band->vht_cap = ath11k_create_vht_cap(ar, rate_cap_tx_chainmask,
5081 rate_cap_rx_chainmask);
5085 static int ath11k_check_chain_mask(struct ath11k *ar, u32 ant, bool is_tx_ant)
5087 /* TODO: Check the request chainmask against the supported
5088 * chainmask table which is advertised in extented_service_ready event
5094 static void ath11k_gen_ppe_thresh(struct ath11k_ppe_threshold *fw_ppet,
5100 he_ppet[0] = fw_ppet->numss_m1 & IEEE80211_PPE_THRES_NSS_MASK;
5101 he_ppet[0] |= (fw_ppet->ru_bit_mask <<
5102 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_POS) &
5103 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK;
5104 for (nss = 0; nss <= fw_ppet->numss_m1; nss++) {
5105 for (ru = 0; ru < 4; ru++) {
5109 if ((fw_ppet->ru_bit_mask & BIT(ru)) == 0)
5111 val = (fw_ppet->ppet16_ppet8_ru3_ru0[nss] >> (ru * 6)) &
5113 val = ((val >> 3) & 0x7) | ((val & 0x7) << 3);
5114 for (i = 5; i >= 0; i--) {
5116 ((val >> i) & 0x1) << ((bit % 8));
5124 ath11k_mac_filter_he_cap_mesh(struct ieee80211_he_cap_elem *he_cap_elem)
5128 m = IEEE80211_HE_MAC_CAP0_TWT_RES |
5129 IEEE80211_HE_MAC_CAP0_TWT_REQ;
5130 he_cap_elem->mac_cap_info[0] &= ~m;
5132 m = IEEE80211_HE_MAC_CAP2_TRS |
5133 IEEE80211_HE_MAC_CAP2_BCAST_TWT |
5134 IEEE80211_HE_MAC_CAP2_MU_CASCADING;
5135 he_cap_elem->mac_cap_info[2] &= ~m;
5137 m = IEEE80211_HE_MAC_CAP3_FLEX_TWT_SCHED |
5138 IEEE80211_HE_MAC_CAP2_BCAST_TWT |
5139 IEEE80211_HE_MAC_CAP2_MU_CASCADING;
5140 he_cap_elem->mac_cap_info[3] &= ~m;
5142 m = IEEE80211_HE_MAC_CAP4_BSRP_BQRP_A_MPDU_AGG |
5143 IEEE80211_HE_MAC_CAP4_BQR;
5144 he_cap_elem->mac_cap_info[4] &= ~m;
5146 m = IEEE80211_HE_MAC_CAP5_SUBCHAN_SELECTIVE_TRANSMISSION |
5147 IEEE80211_HE_MAC_CAP5_UL_2x996_TONE_RU |
5148 IEEE80211_HE_MAC_CAP5_PUNCTURED_SOUNDING |
5149 IEEE80211_HE_MAC_CAP5_HT_VHT_TRIG_FRAME_RX;
5150 he_cap_elem->mac_cap_info[5] &= ~m;
5152 m = IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO |
5153 IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO;
5154 he_cap_elem->phy_cap_info[2] &= ~m;
5156 m = IEEE80211_HE_PHY_CAP3_RX_PARTIAL_BW_SU_IN_20MHZ_MU |
5157 IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK |
5158 IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_MASK;
5159 he_cap_elem->phy_cap_info[3] &= ~m;
5161 m = IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER;
5162 he_cap_elem->phy_cap_info[4] &= ~m;
5164 m = IEEE80211_HE_PHY_CAP5_NG16_MU_FEEDBACK;
5165 he_cap_elem->phy_cap_info[5] &= ~m;
5167 m = IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_75_MU |
5168 IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB |
5169 IEEE80211_HE_PHY_CAP6_TRIG_CQI_FB |
5170 IEEE80211_HE_PHY_CAP6_PARTIAL_BANDWIDTH_DL_MUMIMO;
5171 he_cap_elem->phy_cap_info[6] &= ~m;
5173 m = IEEE80211_HE_PHY_CAP7_PSR_BASED_SR |
5174 IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_SUPP |
5175 IEEE80211_HE_PHY_CAP7_STBC_TX_ABOVE_80MHZ |
5176 IEEE80211_HE_PHY_CAP7_STBC_RX_ABOVE_80MHZ;
5177 he_cap_elem->phy_cap_info[7] &= ~m;
5179 m = IEEE80211_HE_PHY_CAP8_HE_ER_SU_PPDU_4XLTF_AND_08_US_GI |
5180 IEEE80211_HE_PHY_CAP8_20MHZ_IN_40MHZ_HE_PPDU_IN_2G |
5181 IEEE80211_HE_PHY_CAP8_20MHZ_IN_160MHZ_HE_PPDU |
5182 IEEE80211_HE_PHY_CAP8_80MHZ_IN_160MHZ_HE_PPDU;
5183 he_cap_elem->phy_cap_info[8] &= ~m;
5185 m = IEEE80211_HE_PHY_CAP9_LONGER_THAN_16_SIGB_OFDM_SYM |
5186 IEEE80211_HE_PHY_CAP9_NON_TRIGGERED_CQI_FEEDBACK |
5187 IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU |
5188 IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU |
5189 IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_COMP_SIGB |
5190 IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_NON_COMP_SIGB;
5191 he_cap_elem->phy_cap_info[9] &= ~m;
5194 static __le16 ath11k_mac_setup_he_6ghz_cap(struct ath11k_pdev_cap *pcap,
5195 struct ath11k_band_cap *bcap)
5199 bcap->he_6ghz_capa = IEEE80211_HT_MPDU_DENSITY_NONE;
5200 if (bcap->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS)
5201 bcap->he_6ghz_capa |=
5202 FIELD_PREP(IEEE80211_HE_6GHZ_CAP_SM_PS,
5203 WLAN_HT_CAP_SM_PS_DYNAMIC);
5205 bcap->he_6ghz_capa |=
5206 FIELD_PREP(IEEE80211_HE_6GHZ_CAP_SM_PS,
5207 WLAN_HT_CAP_SM_PS_DISABLED);
5208 val = FIELD_GET(IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK,
5210 bcap->he_6ghz_capa |=
5211 FIELD_PREP(IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP, val);
5212 val = FIELD_GET(IEEE80211_VHT_CAP_MAX_MPDU_MASK, pcap->vht_cap);
5213 bcap->he_6ghz_capa |=
5214 FIELD_PREP(IEEE80211_HE_6GHZ_CAP_MAX_MPDU_LEN, val);
5215 if (pcap->vht_cap & IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN)
5216 bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_RX_ANTPAT_CONS;
5217 if (pcap->vht_cap & IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN)
5218 bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_TX_ANTPAT_CONS;
5220 return cpu_to_le16(bcap->he_6ghz_capa);
5223 static int ath11k_mac_copy_he_cap(struct ath11k *ar,
5224 struct ath11k_pdev_cap *cap,
5225 struct ieee80211_sband_iftype_data *data,
5230 for (i = 0; i < NUM_NL80211_IFTYPES; i++) {
5231 struct ieee80211_sta_he_cap *he_cap = &data[idx].he_cap;
5232 struct ath11k_band_cap *band_cap = &cap->band[band];
5233 struct ieee80211_he_cap_elem *he_cap_elem =
5234 &he_cap->he_cap_elem;
5237 case NL80211_IFTYPE_STATION:
5238 case NL80211_IFTYPE_AP:
5239 case NL80211_IFTYPE_MESH_POINT:
5246 data[idx].types_mask = BIT(i);
5247 he_cap->has_he = true;
5248 memcpy(he_cap_elem->mac_cap_info, band_cap->he_cap_info,
5249 sizeof(he_cap_elem->mac_cap_info));
5250 memcpy(he_cap_elem->phy_cap_info, band_cap->he_cap_phy_info,
5251 sizeof(he_cap_elem->phy_cap_info));
5253 he_cap_elem->mac_cap_info[1] &=
5254 IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_MASK;
5256 he_cap_elem->phy_cap_info[5] &=
5257 ~IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK;
5258 he_cap_elem->phy_cap_info[5] |= ar->num_tx_chains - 1;
5261 case NL80211_IFTYPE_AP:
5262 he_cap_elem->phy_cap_info[3] &=
5263 ~IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK;
5264 he_cap_elem->phy_cap_info[9] |=
5265 IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU;
5267 case NL80211_IFTYPE_STATION:
5268 he_cap_elem->mac_cap_info[0] &=
5269 ~IEEE80211_HE_MAC_CAP0_TWT_RES;
5270 he_cap_elem->mac_cap_info[0] |=
5271 IEEE80211_HE_MAC_CAP0_TWT_REQ;
5272 he_cap_elem->phy_cap_info[9] |=
5273 IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU;
5275 case NL80211_IFTYPE_MESH_POINT:
5276 ath11k_mac_filter_he_cap_mesh(he_cap_elem);
5280 he_cap->he_mcs_nss_supp.rx_mcs_80 =
5281 cpu_to_le16(band_cap->he_mcs & 0xffff);
5282 he_cap->he_mcs_nss_supp.tx_mcs_80 =
5283 cpu_to_le16(band_cap->he_mcs & 0xffff);
5284 he_cap->he_mcs_nss_supp.rx_mcs_160 =
5285 cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
5286 he_cap->he_mcs_nss_supp.tx_mcs_160 =
5287 cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
5288 he_cap->he_mcs_nss_supp.rx_mcs_80p80 =
5289 cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
5290 he_cap->he_mcs_nss_supp.tx_mcs_80p80 =
5291 cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
5293 memset(he_cap->ppe_thres, 0, sizeof(he_cap->ppe_thres));
5294 if (he_cap_elem->phy_cap_info[6] &
5295 IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT)
5296 ath11k_gen_ppe_thresh(&band_cap->he_ppet,
5299 if (band == NL80211_BAND_6GHZ) {
5300 data[idx].he_6ghz_capa.capa =
5301 ath11k_mac_setup_he_6ghz_cap(cap, band_cap);
5309 static void ath11k_mac_setup_he_cap(struct ath11k *ar,
5310 struct ath11k_pdev_cap *cap)
5312 struct ieee80211_supported_band *band;
5315 if (cap->supported_bands & WMI_HOST_WLAN_2G_CAP) {
5316 count = ath11k_mac_copy_he_cap(ar, cap,
5317 ar->mac.iftype[NL80211_BAND_2GHZ],
5319 band = &ar->mac.sbands[NL80211_BAND_2GHZ];
5320 band->iftype_data = ar->mac.iftype[NL80211_BAND_2GHZ];
5321 band->n_iftype_data = count;
5324 if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP) {
5325 count = ath11k_mac_copy_he_cap(ar, cap,
5326 ar->mac.iftype[NL80211_BAND_5GHZ],
5328 band = &ar->mac.sbands[NL80211_BAND_5GHZ];
5329 band->iftype_data = ar->mac.iftype[NL80211_BAND_5GHZ];
5330 band->n_iftype_data = count;
5333 if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP &&
5334 ar->supports_6ghz) {
5335 count = ath11k_mac_copy_he_cap(ar, cap,
5336 ar->mac.iftype[NL80211_BAND_6GHZ],
5338 band = &ar->mac.sbands[NL80211_BAND_6GHZ];
5339 band->iftype_data = ar->mac.iftype[NL80211_BAND_6GHZ];
5340 band->n_iftype_data = count;
5344 static int __ath11k_set_antenna(struct ath11k *ar, u32 tx_ant, u32 rx_ant)
5348 lockdep_assert_held(&ar->conf_mutex);
5350 if (ath11k_check_chain_mask(ar, tx_ant, true))
5353 if (ath11k_check_chain_mask(ar, rx_ant, false))
5356 ar->cfg_tx_chainmask = tx_ant;
5357 ar->cfg_rx_chainmask = rx_ant;
5359 if (ar->state != ATH11K_STATE_ON &&
5360 ar->state != ATH11K_STATE_RESTARTED)
5363 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_TX_CHAIN_MASK,
5364 tx_ant, ar->pdev->pdev_id);
5366 ath11k_warn(ar->ab, "failed to set tx-chainmask: %d, req 0x%x\n",
5371 ar->num_tx_chains = get_num_chains(tx_ant);
5373 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_RX_CHAIN_MASK,
5374 rx_ant, ar->pdev->pdev_id);
5376 ath11k_warn(ar->ab, "failed to set rx-chainmask: %d, req 0x%x\n",
5381 ar->num_rx_chains = get_num_chains(rx_ant);
5383 /* Reload HT/VHT/HE capability */
5384 ath11k_mac_setup_ht_vht_cap(ar, &ar->pdev->cap, NULL);
5385 ath11k_mac_setup_he_cap(ar, &ar->pdev->cap);
5390 static void ath11k_mgmt_over_wmi_tx_drop(struct ath11k *ar, struct sk_buff *skb)
5394 ieee80211_free_txskb(ar->hw, skb);
5396 num_mgmt = atomic_dec_if_positive(&ar->num_pending_mgmt_tx);
5402 wake_up(&ar->txmgmt_empty_waitq);
5405 static void ath11k_mac_tx_mgmt_free(struct ath11k *ar, int buf_id)
5407 struct sk_buff *msdu;
5408 struct ieee80211_tx_info *info;
5410 spin_lock_bh(&ar->txmgmt_idr_lock);
5411 msdu = idr_remove(&ar->txmgmt_idr, buf_id);
5412 spin_unlock_bh(&ar->txmgmt_idr_lock);
5417 dma_unmap_single(ar->ab->dev, ATH11K_SKB_CB(msdu)->paddr, msdu->len,
5420 info = IEEE80211_SKB_CB(msdu);
5421 memset(&info->status, 0, sizeof(info->status));
5423 ath11k_mgmt_over_wmi_tx_drop(ar, msdu);
5426 int ath11k_mac_tx_mgmt_pending_free(int buf_id, void *skb, void *ctx)
5428 struct ath11k *ar = ctx;
5430 ath11k_mac_tx_mgmt_free(ar, buf_id);
5435 static int ath11k_mac_vif_txmgmt_idr_remove(int buf_id, void *skb, void *ctx)
5437 struct ieee80211_vif *vif = ctx;
5438 struct ath11k_skb_cb *skb_cb = ATH11K_SKB_CB((struct sk_buff *)skb);
5439 struct ath11k *ar = skb_cb->ar;
5441 if (skb_cb->vif == vif)
5442 ath11k_mac_tx_mgmt_free(ar, buf_id);
5447 static int ath11k_mac_mgmt_tx_wmi(struct ath11k *ar, struct ath11k_vif *arvif,
5448 struct sk_buff *skb)
5450 struct ath11k_base *ab = ar->ab;
5451 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
5452 struct ieee80211_tx_info *info;
5457 ATH11K_SKB_CB(skb)->ar = ar;
5459 spin_lock_bh(&ar->txmgmt_idr_lock);
5460 buf_id = idr_alloc(&ar->txmgmt_idr, skb, 0,
5461 ATH11K_TX_MGMT_NUM_PENDING_MAX, GFP_ATOMIC);
5462 spin_unlock_bh(&ar->txmgmt_idr_lock);
5464 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
5465 "mac tx mgmt frame, buf id %d\n", buf_id);
5470 info = IEEE80211_SKB_CB(skb);
5471 if (!(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP)) {
5472 if ((ieee80211_is_action(hdr->frame_control) ||
5473 ieee80211_is_deauth(hdr->frame_control) ||
5474 ieee80211_is_disassoc(hdr->frame_control)) &&
5475 ieee80211_has_protected(hdr->frame_control)) {
5476 skb_put(skb, IEEE80211_CCMP_MIC_LEN);
5480 paddr = dma_map_single(ab->dev, skb->data, skb->len, DMA_TO_DEVICE);
5481 if (dma_mapping_error(ab->dev, paddr)) {
5482 ath11k_warn(ab, "failed to DMA map mgmt Tx buffer\n");
5487 ATH11K_SKB_CB(skb)->paddr = paddr;
5489 ret = ath11k_wmi_mgmt_send(ar, arvif->vdev_id, buf_id, skb);
5491 ath11k_warn(ar->ab, "failed to send mgmt frame: %d\n", ret);
5498 dma_unmap_single(ab->dev, ATH11K_SKB_CB(skb)->paddr,
5499 skb->len, DMA_TO_DEVICE);
5501 spin_lock_bh(&ar->txmgmt_idr_lock);
5502 idr_remove(&ar->txmgmt_idr, buf_id);
5503 spin_unlock_bh(&ar->txmgmt_idr_lock);
5508 static void ath11k_mgmt_over_wmi_tx_purge(struct ath11k *ar)
5510 struct sk_buff *skb;
5512 while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL)
5513 ath11k_mgmt_over_wmi_tx_drop(ar, skb);
5516 static void ath11k_mgmt_over_wmi_tx_work(struct work_struct *work)
5518 struct ath11k *ar = container_of(work, struct ath11k, wmi_mgmt_tx_work);
5519 struct ath11k_skb_cb *skb_cb;
5520 struct ath11k_vif *arvif;
5521 struct sk_buff *skb;
5524 while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL) {
5525 skb_cb = ATH11K_SKB_CB(skb);
5527 ath11k_warn(ar->ab, "no vif found for mgmt frame\n");
5528 ath11k_mgmt_over_wmi_tx_drop(ar, skb);
5532 arvif = ath11k_vif_to_arvif(skb_cb->vif);
5533 if (ar->allocated_vdev_map & (1LL << arvif->vdev_id) &&
5534 arvif->is_started) {
5535 ret = ath11k_mac_mgmt_tx_wmi(ar, arvif, skb);
5537 ath11k_warn(ar->ab, "failed to tx mgmt frame, vdev_id %d :%d\n",
5538 arvif->vdev_id, ret);
5539 ath11k_mgmt_over_wmi_tx_drop(ar, skb);
5541 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
5542 "mac tx mgmt frame, vdev_id %d\n",
5547 "dropping mgmt frame for vdev %d, is_started %d\n",
5550 ath11k_mgmt_over_wmi_tx_drop(ar, skb);
5555 static int ath11k_mac_mgmt_tx(struct ath11k *ar, struct sk_buff *skb,
5558 struct sk_buff_head *q = &ar->wmi_mgmt_tx_queue;
5560 if (test_bit(ATH11K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags))
5563 /* Drop probe response packets when the pending management tx
5564 * count has reached a certain threshold, so as to prioritize
5565 * other mgmt packets like auth and assoc to be sent on time
5566 * for establishing successful connections.
5569 atomic_read(&ar->num_pending_mgmt_tx) > ATH11K_PRB_RSP_DROP_THRESHOLD) {
5571 "dropping probe response as pending queue is almost full\n");
5575 if (skb_queue_len_lockless(q) >= ATH11K_TX_MGMT_NUM_PENDING_MAX) {
5576 ath11k_warn(ar->ab, "mgmt tx queue is full\n");
5580 skb_queue_tail(q, skb);
5581 atomic_inc(&ar->num_pending_mgmt_tx);
5582 queue_work(ar->ab->workqueue, &ar->wmi_mgmt_tx_work);
5587 int ath11k_mac_rfkill_config(struct ath11k *ar)
5589 struct ath11k_base *ab = ar->ab;
5593 if (ab->hw_params.rfkill_pin == 0)
5596 ath11k_dbg(ab, ATH11K_DBG_MAC,
5597 "mac rfkill_pin %d rfkill_cfg %d rfkill_on_level %d",
5598 ab->hw_params.rfkill_pin, ab->hw_params.rfkill_cfg,
5599 ab->hw_params.rfkill_on_level);
5601 param = FIELD_PREP(WMI_RFKILL_CFG_RADIO_LEVEL,
5602 ab->hw_params.rfkill_on_level) |
5603 FIELD_PREP(WMI_RFKILL_CFG_GPIO_PIN_NUM,
5604 ab->hw_params.rfkill_pin) |
5605 FIELD_PREP(WMI_RFKILL_CFG_PIN_AS_GPIO,
5606 ab->hw_params.rfkill_cfg);
5608 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_HW_RFKILL_CONFIG,
5609 param, ar->pdev->pdev_id);
5612 "failed to set rfkill config 0x%x: %d\n",
5620 int ath11k_mac_rfkill_enable_radio(struct ath11k *ar, bool enable)
5622 enum wmi_rfkill_enable_radio param;
5626 param = WMI_RFKILL_ENABLE_RADIO_ON;
5628 param = WMI_RFKILL_ENABLE_RADIO_OFF;
5630 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac %d rfkill enable %d",
5631 ar->pdev_idx, param);
5633 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_RFKILL_ENABLE,
5634 param, ar->pdev->pdev_id);
5636 ath11k_warn(ar->ab, "failed to set rfkill enable param %d: %d\n",
5644 static void ath11k_mac_op_tx(struct ieee80211_hw *hw,
5645 struct ieee80211_tx_control *control,
5646 struct sk_buff *skb)
5648 struct ath11k_skb_cb *skb_cb = ATH11K_SKB_CB(skb);
5649 struct ath11k *ar = hw->priv;
5650 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
5651 struct ieee80211_vif *vif = info->control.vif;
5652 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
5653 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
5654 struct ieee80211_key_conf *key = info->control.hw_key;
5655 struct ath11k_sta *arsta = NULL;
5656 u32 info_flags = info->flags;
5660 memset(skb_cb, 0, sizeof(*skb_cb));
5664 skb_cb->cipher = key->cipher;
5665 skb_cb->flags |= ATH11K_SKB_CIPHER_SET;
5668 if (info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP) {
5669 skb_cb->flags |= ATH11K_SKB_HW_80211_ENCAP;
5670 } else if (ieee80211_is_mgmt(hdr->frame_control)) {
5671 is_prb_rsp = ieee80211_is_probe_resp(hdr->frame_control);
5672 ret = ath11k_mac_mgmt_tx(ar, skb, is_prb_rsp);
5674 ath11k_warn(ar->ab, "failed to queue management frame %d\n",
5676 ieee80211_free_txskb(ar->hw, skb);
5682 arsta = (struct ath11k_sta *)control->sta->drv_priv;
5684 ret = ath11k_dp_tx(ar, arvif, arsta, skb);
5685 if (unlikely(ret)) {
5686 ath11k_warn(ar->ab, "failed to transmit frame %d\n", ret);
5687 ieee80211_free_txskb(ar->hw, skb);
5691 void ath11k_mac_drain_tx(struct ath11k *ar)
5693 /* make sure rcu-protected mac80211 tx path itself is drained */
5696 cancel_work_sync(&ar->wmi_mgmt_tx_work);
5697 ath11k_mgmt_over_wmi_tx_purge(ar);
5700 static int ath11k_mac_config_mon_status_default(struct ath11k *ar, bool enable)
5702 struct htt_rx_ring_tlv_filter tlv_filter = {0};
5703 struct ath11k_base *ab = ar->ab;
5708 tlv_filter = ath11k_mac_mon_status_filter_default;
5709 if (ath11k_debugfs_rx_filter(ar))
5710 tlv_filter.rx_filter = ath11k_debugfs_rx_filter(ar);
5713 for (i = 0; i < ab->hw_params.num_rxmda_per_pdev; i++) {
5714 ring_id = ar->dp.rx_mon_status_refill_ring[i].refill_buf_ring.ring_id;
5715 ret = ath11k_dp_tx_htt_rx_filter_setup(ar->ab, ring_id,
5717 HAL_RXDMA_MONITOR_STATUS,
5722 if (enable && !ar->ab->hw_params.rxdma1_enable)
5723 mod_timer(&ar->ab->mon_reap_timer, jiffies +
5724 msecs_to_jiffies(ATH11K_MON_TIMER_INTERVAL));
5729 static int ath11k_mac_op_start(struct ieee80211_hw *hw)
5731 struct ath11k *ar = hw->priv;
5732 struct ath11k_base *ab = ar->ab;
5733 struct ath11k_pdev *pdev = ar->pdev;
5736 ath11k_mac_drain_tx(ar);
5737 mutex_lock(&ar->conf_mutex);
5739 switch (ar->state) {
5740 case ATH11K_STATE_OFF:
5741 ar->state = ATH11K_STATE_ON;
5743 case ATH11K_STATE_RESTARTING:
5744 ar->state = ATH11K_STATE_RESTARTED;
5746 case ATH11K_STATE_RESTARTED:
5747 case ATH11K_STATE_WEDGED:
5748 case ATH11K_STATE_ON:
5754 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_PMF_QOS,
5758 ath11k_err(ar->ab, "failed to enable PMF QOS: (%d\n", ret);
5762 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_DYNAMIC_BW, 1,
5765 ath11k_err(ar->ab, "failed to enable dynamic bw: %d\n", ret);
5769 if (test_bit(WMI_TLV_SERVICE_SPOOF_MAC_SUPPORT, ar->wmi->wmi_ab->svc_map)) {
5770 ret = ath11k_wmi_scan_prob_req_oui(ar, ar->mac_addr);
5772 ath11k_err(ab, "failed to set prob req oui: %i\n", ret);
5777 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_ARP_AC_OVERRIDE,
5780 ath11k_err(ab, "failed to set ac override for ARP: %d\n",
5785 ret = ath11k_wmi_send_dfs_phyerr_offload_enable_cmd(ar, pdev->pdev_id);
5787 ath11k_err(ab, "failed to offload radar detection: %d\n",
5792 ret = ath11k_dp_tx_htt_h2t_ppdu_stats_req(ar,
5793 HTT_PPDU_STATS_TAG_DEFAULT);
5795 ath11k_err(ab, "failed to req ppdu stats: %d\n", ret);
5799 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_MESH_MCAST_ENABLE,
5803 ath11k_err(ar->ab, "failed to enable MESH MCAST ENABLE: (%d\n", ret);
5807 __ath11k_set_antenna(ar, ar->cfg_tx_chainmask, ar->cfg_rx_chainmask);
5809 /* TODO: Do we need to enable ANI? */
5811 ath11k_reg_update_chan_list(ar);
5813 ar->num_started_vdevs = 0;
5814 ar->num_created_vdevs = 0;
5816 ar->allocated_vdev_map = 0;
5818 /* Configure monitor status ring with default rx_filter to get rx status
5819 * such as rssi, rx_duration.
5821 ret = ath11k_mac_config_mon_status_default(ar, true);
5823 ath11k_err(ab, "failed to configure monitor status ring with default rx_filter: (%d)\n",
5828 /* Configure the hash seed for hash based reo dest ring selection */
5829 ath11k_wmi_pdev_lro_cfg(ar, ar->pdev->pdev_id);
5831 /* allow device to enter IMPS */
5832 if (ab->hw_params.idle_ps) {
5833 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_IDLE_PS_CONFIG,
5836 ath11k_err(ab, "failed to enable idle ps: %d\n", ret);
5841 mutex_unlock(&ar->conf_mutex);
5843 rcu_assign_pointer(ab->pdevs_active[ar->pdev_idx],
5844 &ab->pdevs[ar->pdev_idx]);
5849 ar->state = ATH11K_STATE_OFF;
5850 mutex_unlock(&ar->conf_mutex);
5855 static void ath11k_mac_op_stop(struct ieee80211_hw *hw)
5857 struct ath11k *ar = hw->priv;
5858 struct htt_ppdu_stats_info *ppdu_stats, *tmp;
5861 ath11k_mac_drain_tx(ar);
5863 mutex_lock(&ar->conf_mutex);
5864 ret = ath11k_mac_config_mon_status_default(ar, false);
5866 ath11k_err(ar->ab, "failed to clear rx_filter for monitor status ring: (%d)\n",
5869 clear_bit(ATH11K_CAC_RUNNING, &ar->dev_flags);
5870 ar->state = ATH11K_STATE_OFF;
5871 mutex_unlock(&ar->conf_mutex);
5873 cancel_delayed_work_sync(&ar->scan.timeout);
5874 cancel_work_sync(&ar->regd_update_work);
5875 cancel_work_sync(&ar->ab->update_11d_work);
5876 cancel_work_sync(&ar->ab->rfkill_work);
5878 spin_lock_bh(&ar->data_lock);
5879 list_for_each_entry_safe(ppdu_stats, tmp, &ar->ppdu_stats_info, list) {
5880 list_del(&ppdu_stats->list);
5883 spin_unlock_bh(&ar->data_lock);
5885 rcu_assign_pointer(ar->ab->pdevs_active[ar->pdev_idx], NULL);
5889 atomic_set(&ar->num_pending_mgmt_tx, 0);
5893 ath11k_mac_setup_vdev_create_params(struct ath11k_vif *arvif,
5894 struct vdev_create_params *params)
5896 struct ath11k *ar = arvif->ar;
5897 struct ath11k_pdev *pdev = ar->pdev;
5899 params->if_id = arvif->vdev_id;
5900 params->type = arvif->vdev_type;
5901 params->subtype = arvif->vdev_subtype;
5902 params->pdev_id = pdev->pdev_id;
5904 if (pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) {
5905 params->chains[NL80211_BAND_2GHZ].tx = ar->num_tx_chains;
5906 params->chains[NL80211_BAND_2GHZ].rx = ar->num_rx_chains;
5908 if (pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) {
5909 params->chains[NL80211_BAND_5GHZ].tx = ar->num_tx_chains;
5910 params->chains[NL80211_BAND_5GHZ].rx = ar->num_rx_chains;
5912 if (pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP &&
5913 ar->supports_6ghz) {
5914 params->chains[NL80211_BAND_6GHZ].tx = ar->num_tx_chains;
5915 params->chains[NL80211_BAND_6GHZ].rx = ar->num_rx_chains;
5920 ath11k_mac_prepare_he_mode(struct ath11k_pdev *pdev, u32 viftype)
5922 struct ath11k_pdev_cap *pdev_cap = &pdev->cap;
5923 struct ath11k_band_cap *cap_band = NULL;
5924 u32 *hecap_phy_ptr = NULL;
5927 if (pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP)
5928 cap_band = &pdev_cap->band[NL80211_BAND_2GHZ];
5930 cap_band = &pdev_cap->band[NL80211_BAND_5GHZ];
5932 hecap_phy_ptr = &cap_band->he_cap_phy_info[0];
5934 hemode = FIELD_PREP(HE_MODE_SU_TX_BFEE, HE_SU_BFEE_ENABLE) |
5935 FIELD_PREP(HE_MODE_SU_TX_BFER, HECAP_PHY_SUBFMR_GET(hecap_phy_ptr)) |
5936 FIELD_PREP(HE_MODE_UL_MUMIMO, HECAP_PHY_ULMUMIMO_GET(hecap_phy_ptr));
5938 /* TODO WDS and other modes */
5939 if (viftype == NL80211_IFTYPE_AP) {
5940 hemode |= FIELD_PREP(HE_MODE_MU_TX_BFER,
5941 HECAP_PHY_MUBFMR_GET(hecap_phy_ptr)) |
5942 FIELD_PREP(HE_MODE_DL_OFDMA, HE_DL_MUOFDMA_ENABLE) |
5943 FIELD_PREP(HE_MODE_UL_OFDMA, HE_UL_MUOFDMA_ENABLE);
5945 hemode |= FIELD_PREP(HE_MODE_MU_TX_BFEE, HE_MU_BFEE_ENABLE);
5951 static int ath11k_set_he_mu_sounding_mode(struct ath11k *ar,
5952 struct ath11k_vif *arvif)
5954 u32 param_id, param_value;
5955 struct ath11k_base *ab = ar->ab;
5958 param_id = WMI_VDEV_PARAM_SET_HEMU_MODE;
5959 param_value = ath11k_mac_prepare_he_mode(ar->pdev, arvif->vif->type);
5960 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
5961 param_id, param_value);
5963 ath11k_warn(ab, "failed to set vdev %d HE MU mode: %d param_value %x\n",
5964 arvif->vdev_id, ret, param_value);
5967 param_id = WMI_VDEV_PARAM_SET_HE_SOUNDING_MODE;
5969 FIELD_PREP(HE_VHT_SOUNDING_MODE, HE_VHT_SOUNDING_MODE_ENABLE) |
5970 FIELD_PREP(HE_TRIG_NONTRIG_SOUNDING_MODE,
5971 HE_TRIG_NONTRIG_SOUNDING_MODE_ENABLE);
5972 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
5973 param_id, param_value);
5975 ath11k_warn(ab, "failed to set vdev %d HE MU mode: %d\n",
5976 arvif->vdev_id, ret);
5982 static void ath11k_mac_op_update_vif_offload(struct ieee80211_hw *hw,
5983 struct ieee80211_vif *vif)
5985 struct ath11k *ar = hw->priv;
5986 struct ath11k_base *ab = ar->ab;
5987 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
5988 u32 param_id, param_value;
5991 param_id = WMI_VDEV_PARAM_TX_ENCAP_TYPE;
5992 if (ath11k_frame_mode != ATH11K_HW_TXRX_ETHERNET ||
5993 (vif->type != NL80211_IFTYPE_STATION &&
5994 vif->type != NL80211_IFTYPE_AP))
5995 vif->offload_flags &= ~(IEEE80211_OFFLOAD_ENCAP_ENABLED |
5996 IEEE80211_OFFLOAD_DECAP_ENABLED);
5998 if (vif->offload_flags & IEEE80211_OFFLOAD_ENCAP_ENABLED)
5999 param_value = ATH11K_HW_TXRX_ETHERNET;
6000 else if (test_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags))
6001 param_value = ATH11K_HW_TXRX_RAW;
6003 param_value = ATH11K_HW_TXRX_NATIVE_WIFI;
6005 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
6006 param_id, param_value);
6008 ath11k_warn(ab, "failed to set vdev %d tx encap mode: %d\n",
6009 arvif->vdev_id, ret);
6010 vif->offload_flags &= ~IEEE80211_OFFLOAD_ENCAP_ENABLED;
6013 param_id = WMI_VDEV_PARAM_RX_DECAP_TYPE;
6014 if (vif->offload_flags & IEEE80211_OFFLOAD_DECAP_ENABLED)
6015 param_value = ATH11K_HW_TXRX_ETHERNET;
6016 else if (test_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags))
6017 param_value = ATH11K_HW_TXRX_RAW;
6019 param_value = ATH11K_HW_TXRX_NATIVE_WIFI;
6021 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
6022 param_id, param_value);
6024 ath11k_warn(ab, "failed to set vdev %d rx decap mode: %d\n",
6025 arvif->vdev_id, ret);
6026 vif->offload_flags &= ~IEEE80211_OFFLOAD_DECAP_ENABLED;
6030 static bool ath11k_mac_vif_ap_active_any(struct ath11k_base *ab)
6033 struct ath11k_pdev *pdev;
6034 struct ath11k_vif *arvif;
6037 for (i = 0; i < ab->num_radios; i++) {
6038 pdev = &ab->pdevs[i];
6040 list_for_each_entry(arvif, &ar->arvifs, list) {
6041 if (arvif->is_up && arvif->vdev_type == WMI_VDEV_TYPE_AP)
6048 void ath11k_mac_11d_scan_start(struct ath11k *ar, u32 vdev_id, bool wait)
6050 struct wmi_11d_scan_start_params param;
6053 mutex_lock(&ar->ab->vdev_id_11d_lock);
6055 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac vdev id for 11d scan %d\n",
6056 ar->vdev_id_11d_scan);
6058 if (ar->regdom_set_by_user)
6061 if (ar->vdev_id_11d_scan != ATH11K_11D_INVALID_VDEV_ID)
6064 if (!test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map))
6067 if (ath11k_mac_vif_ap_active_any(ar->ab))
6070 param.vdev_id = vdev_id;
6071 param.start_interval_msec = 0;
6072 param.scan_period_msec = ATH11K_SCAN_11D_INTERVAL;
6074 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac start 11d scan\n");
6077 reinit_completion(&ar->finish_11d_scan);
6079 ret = ath11k_wmi_send_11d_scan_start_cmd(ar, ¶m);
6081 ath11k_warn(ar->ab, "failed to start 11d scan vdev %d ret: %d\n",
6084 ar->vdev_id_11d_scan = vdev_id;
6086 ar->pending_11d = true;
6087 ret = wait_for_completion_timeout(&ar->finish_11d_scan,
6089 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
6090 "mac 11d scan left time %d\n", ret);
6093 ar->pending_11d = false;
6098 mutex_unlock(&ar->ab->vdev_id_11d_lock);
6101 void ath11k_mac_11d_scan_stop(struct ath11k *ar)
6106 if (!test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map))
6109 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac stop 11d scan\n");
6111 mutex_lock(&ar->ab->vdev_id_11d_lock);
6113 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac stop 11d vdev id %d\n",
6114 ar->vdev_id_11d_scan);
6116 if (ar->vdev_id_11d_scan != ATH11K_11D_INVALID_VDEV_ID) {
6117 vdev_id = ar->vdev_id_11d_scan;
6119 ret = ath11k_wmi_send_11d_scan_stop_cmd(ar, vdev_id);
6122 "failed to stopt 11d scan vdev %d ret: %d\n",
6125 ar->vdev_id_11d_scan = ATH11K_11D_INVALID_VDEV_ID;
6127 mutex_unlock(&ar->ab->vdev_id_11d_lock);
6130 void ath11k_mac_11d_scan_stop_all(struct ath11k_base *ab)
6133 struct ath11k_pdev *pdev;
6136 ath11k_dbg(ab, ATH11K_DBG_MAC, "mac stop soc 11d scan\n");
6138 for (i = 0; i < ab->num_radios; i++) {
6139 pdev = &ab->pdevs[i];
6142 ath11k_mac_11d_scan_stop(ar);
6146 static int ath11k_mac_op_add_interface(struct ieee80211_hw *hw,
6147 struct ieee80211_vif *vif)
6149 struct ath11k *ar = hw->priv;
6150 struct ath11k_base *ab = ar->ab;
6151 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
6152 struct vdev_create_params vdev_param = {0};
6153 struct peer_create_params peer_param;
6154 u32 param_id, param_value;
6160 vif->driver_flags |= IEEE80211_VIF_SUPPORTS_UAPSD;
6162 mutex_lock(&ar->conf_mutex);
6164 if (vif->type == NL80211_IFTYPE_AP &&
6165 ar->num_peers > (ar->max_num_peers - 1)) {
6166 ath11k_warn(ab, "failed to create vdev due to insufficient peer entry resource in firmware\n");
6171 if (ar->num_created_vdevs > (TARGET_NUM_VDEVS(ab) - 1)) {
6172 ath11k_warn(ab, "failed to create vdev %u, reached max vdev limit %d\n",
6173 ar->num_created_vdevs, TARGET_NUM_VDEVS(ab));
6178 memset(arvif, 0, sizeof(*arvif));
6183 INIT_LIST_HEAD(&arvif->list);
6184 INIT_DELAYED_WORK(&arvif->connection_loss_work,
6185 ath11k_mac_vif_sta_connection_loss_work);
6187 for (i = 0; i < ARRAY_SIZE(arvif->bitrate_mask.control); i++) {
6188 arvif->bitrate_mask.control[i].legacy = 0xffffffff;
6189 arvif->bitrate_mask.control[i].gi = NL80211_TXRATE_FORCE_SGI;
6190 memset(arvif->bitrate_mask.control[i].ht_mcs, 0xff,
6191 sizeof(arvif->bitrate_mask.control[i].ht_mcs));
6192 memset(arvif->bitrate_mask.control[i].vht_mcs, 0xff,
6193 sizeof(arvif->bitrate_mask.control[i].vht_mcs));
6194 memset(arvif->bitrate_mask.control[i].he_mcs, 0xff,
6195 sizeof(arvif->bitrate_mask.control[i].he_mcs));
6198 bit = __ffs64(ab->free_vdev_map);
6200 arvif->vdev_id = bit;
6201 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE;
6203 switch (vif->type) {
6204 case NL80211_IFTYPE_UNSPECIFIED:
6205 case NL80211_IFTYPE_STATION:
6206 arvif->vdev_type = WMI_VDEV_TYPE_STA;
6208 case NL80211_IFTYPE_MESH_POINT:
6209 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_MESH_11S;
6211 case NL80211_IFTYPE_AP:
6212 arvif->vdev_type = WMI_VDEV_TYPE_AP;
6214 case NL80211_IFTYPE_MONITOR:
6215 arvif->vdev_type = WMI_VDEV_TYPE_MONITOR;
6216 ar->monitor_vdev_id = bit;
6223 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac add interface id %d type %d subtype %d map %llx\n",
6224 arvif->vdev_id, arvif->vdev_type, arvif->vdev_subtype,
6227 vif->cab_queue = arvif->vdev_id % (ATH11K_HW_MAX_QUEUES - 1);
6228 for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++)
6229 vif->hw_queue[i] = i % (ATH11K_HW_MAX_QUEUES - 1);
6231 ath11k_mac_setup_vdev_create_params(arvif, &vdev_param);
6233 ret = ath11k_wmi_vdev_create(ar, vif->addr, &vdev_param);
6235 ath11k_warn(ab, "failed to create WMI vdev %d: %d\n",
6236 arvif->vdev_id, ret);
6240 ar->num_created_vdevs++;
6241 ath11k_dbg(ab, ATH11K_DBG_MAC, "vdev %pM created, vdev_id %d\n",
6242 vif->addr, arvif->vdev_id);
6243 ar->allocated_vdev_map |= 1LL << arvif->vdev_id;
6244 ab->free_vdev_map &= ~(1LL << arvif->vdev_id);
6246 spin_lock_bh(&ar->data_lock);
6247 list_add(&arvif->list, &ar->arvifs);
6248 spin_unlock_bh(&ar->data_lock);
6250 ath11k_mac_op_update_vif_offload(hw, vif);
6252 nss = get_num_chains(ar->cfg_tx_chainmask) ? : 1;
6253 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
6254 WMI_VDEV_PARAM_NSS, nss);
6256 ath11k_warn(ab, "failed to set vdev %d chainmask 0x%x, nss %d :%d\n",
6257 arvif->vdev_id, ar->cfg_tx_chainmask, nss, ret);
6261 switch (arvif->vdev_type) {
6262 case WMI_VDEV_TYPE_AP:
6263 peer_param.vdev_id = arvif->vdev_id;
6264 peer_param.peer_addr = vif->addr;
6265 peer_param.peer_type = WMI_PEER_TYPE_DEFAULT;
6266 ret = ath11k_peer_create(ar, arvif, NULL, &peer_param);
6268 ath11k_warn(ab, "failed to vdev %d create peer for AP: %d\n",
6269 arvif->vdev_id, ret);
6273 ret = ath11k_mac_set_kickout(arvif);
6275 ath11k_warn(ar->ab, "failed to set vdev %i kickout parameters: %d\n",
6276 arvif->vdev_id, ret);
6280 ath11k_mac_11d_scan_stop_all(ar->ab);
6282 case WMI_VDEV_TYPE_STA:
6283 param_id = WMI_STA_PS_PARAM_RX_WAKE_POLICY;
6284 param_value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
6285 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
6286 param_id, param_value);
6288 ath11k_warn(ar->ab, "failed to set vdev %d RX wake policy: %d\n",
6289 arvif->vdev_id, ret);
6293 param_id = WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD;
6294 param_value = WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS;
6295 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
6296 param_id, param_value);
6298 ath11k_warn(ar->ab, "failed to set vdev %d TX wake threshold: %d\n",
6299 arvif->vdev_id, ret);
6303 param_id = WMI_STA_PS_PARAM_PSPOLL_COUNT;
6304 param_value = WMI_STA_PS_PSPOLL_COUNT_NO_MAX;
6305 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
6306 param_id, param_value);
6308 ath11k_warn(ar->ab, "failed to set vdev %d pspoll count: %d\n",
6309 arvif->vdev_id, ret);
6313 ret = ath11k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id,
6314 WMI_STA_PS_MODE_DISABLED);
6316 ath11k_warn(ar->ab, "failed to disable vdev %d ps mode: %d\n",
6317 arvif->vdev_id, ret);
6321 ath11k_mac_11d_scan_start(ar, arvif->vdev_id, true);
6324 case WMI_VDEV_TYPE_MONITOR:
6325 set_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags);
6331 arvif->txpower = vif->bss_conf.txpower;
6332 ret = ath11k_mac_txpower_recalc(ar);
6336 param_id = WMI_VDEV_PARAM_RTS_THRESHOLD;
6337 param_value = ar->hw->wiphy->rts_threshold;
6338 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
6339 param_id, param_value);
6341 ath11k_warn(ar->ab, "failed to set rts threshold for vdev %d: %d\n",
6342 arvif->vdev_id, ret);
6345 ath11k_dp_vdev_tx_attach(ar, arvif);
6347 if (vif->type != NL80211_IFTYPE_MONITOR &&
6348 test_bit(ATH11K_FLAG_MONITOR_CONF_ENABLED, &ar->monitor_flags)) {
6349 ret = ath11k_mac_monitor_vdev_create(ar);
6351 ath11k_warn(ar->ab, "failed to create monitor vdev during add interface: %d",
6357 ret = ath11k_debugfs_add_interface(arvif);
6361 mutex_unlock(&ar->conf_mutex);
6366 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
6367 reinit_completion(&ar->peer_delete_done);
6369 fbret = ath11k_wmi_send_peer_delete_cmd(ar, vif->addr,
6372 ath11k_warn(ar->ab, "failed to delete peer vdev_id %d addr %pM\n",
6373 arvif->vdev_id, vif->addr);
6377 fbret = ath11k_wait_for_peer_delete_done(ar, arvif->vdev_id,
6386 ath11k_wmi_vdev_delete(ar, arvif->vdev_id);
6387 ar->num_created_vdevs--;
6388 ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id);
6389 ab->free_vdev_map |= 1LL << arvif->vdev_id;
6390 spin_lock_bh(&ar->data_lock);
6391 list_del(&arvif->list);
6392 spin_unlock_bh(&ar->data_lock);
6395 ath11k_debugfs_remove_interface(arvif);
6396 mutex_unlock(&ar->conf_mutex);
6401 static int ath11k_mac_vif_unref(int buf_id, void *skb, void *ctx)
6403 struct ieee80211_vif *vif = (struct ieee80211_vif *)ctx;
6404 struct ath11k_skb_cb *skb_cb = ATH11K_SKB_CB((struct sk_buff *)skb);
6406 if (skb_cb->vif == vif)
6412 static void ath11k_mac_op_remove_interface(struct ieee80211_hw *hw,
6413 struct ieee80211_vif *vif)
6415 struct ath11k *ar = hw->priv;
6416 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
6417 struct ath11k_base *ab = ar->ab;
6418 unsigned long time_left;
6422 cancel_delayed_work_sync(&arvif->connection_loss_work);
6424 mutex_lock(&ar->conf_mutex);
6426 ath11k_dbg(ab, ATH11K_DBG_MAC, "mac remove interface (vdev %d)\n",
6429 if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
6430 ath11k_mac_11d_scan_stop(ar);
6432 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
6433 ret = ath11k_peer_delete(ar, arvif->vdev_id, vif->addr);
6435 ath11k_warn(ab, "failed to submit AP self-peer removal on vdev %d: %d\n",
6436 arvif->vdev_id, ret);
6439 reinit_completion(&ar->vdev_delete_done);
6441 ret = ath11k_wmi_vdev_delete(ar, arvif->vdev_id);
6443 ath11k_warn(ab, "failed to delete WMI vdev %d: %d\n",
6444 arvif->vdev_id, ret);
6448 time_left = wait_for_completion_timeout(&ar->vdev_delete_done,
6449 ATH11K_VDEV_DELETE_TIMEOUT_HZ);
6450 if (time_left == 0) {
6451 ath11k_warn(ab, "Timeout in receiving vdev delete response\n");
6455 ab->free_vdev_map |= 1LL << (arvif->vdev_id);
6456 ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id);
6457 ar->num_created_vdevs--;
6459 ath11k_dbg(ab, ATH11K_DBG_MAC, "vdev %pM deleted, vdev_id %d\n",
6460 vif->addr, arvif->vdev_id);
6462 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
6463 clear_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags);
6464 ar->monitor_vdev_id = -1;
6465 } else if (test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags) &&
6466 !test_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags)) {
6467 ret = ath11k_mac_monitor_vdev_delete(ar);
6469 /* continue even if there's an error */
6470 ath11k_warn(ar->ab, "failed to delete vdev monitor during remove interface: %d",
6475 spin_lock_bh(&ar->data_lock);
6476 list_del(&arvif->list);
6477 spin_unlock_bh(&ar->data_lock);
6479 ath11k_peer_cleanup(ar, arvif->vdev_id);
6481 idr_for_each(&ar->txmgmt_idr,
6482 ath11k_mac_vif_txmgmt_idr_remove, vif);
6484 for (i = 0; i < ab->hw_params.max_tx_ring; i++) {
6485 spin_lock_bh(&ab->dp.tx_ring[i].tx_idr_lock);
6486 idr_for_each(&ab->dp.tx_ring[i].txbuf_idr,
6487 ath11k_mac_vif_unref, vif);
6488 spin_unlock_bh(&ab->dp.tx_ring[i].tx_idr_lock);
6491 /* Recalc txpower for remaining vdev */
6492 ath11k_mac_txpower_recalc(ar);
6494 ath11k_debugfs_remove_interface(arvif);
6496 /* TODO: recal traffic pause state based on the available vdevs */
6498 mutex_unlock(&ar->conf_mutex);
6501 /* FIXME: Has to be verified. */
6502 #define SUPPORTED_FILTERS \
6507 FIF_BCN_PRBRESP_PROMISC | \
6511 static void ath11k_mac_op_configure_filter(struct ieee80211_hw *hw,
6512 unsigned int changed_flags,
6513 unsigned int *total_flags,
6516 struct ath11k *ar = hw->priv;
6518 mutex_lock(&ar->conf_mutex);
6520 *total_flags &= SUPPORTED_FILTERS;
6521 ar->filter_flags = *total_flags;
6523 mutex_unlock(&ar->conf_mutex);
6526 static int ath11k_mac_op_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant)
6528 struct ath11k *ar = hw->priv;
6530 mutex_lock(&ar->conf_mutex);
6532 *tx_ant = ar->cfg_tx_chainmask;
6533 *rx_ant = ar->cfg_rx_chainmask;
6535 mutex_unlock(&ar->conf_mutex);
6540 static int ath11k_mac_op_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)
6542 struct ath11k *ar = hw->priv;
6545 mutex_lock(&ar->conf_mutex);
6546 ret = __ath11k_set_antenna(ar, tx_ant, rx_ant);
6547 mutex_unlock(&ar->conf_mutex);
6552 static int ath11k_mac_op_ampdu_action(struct ieee80211_hw *hw,
6553 struct ieee80211_vif *vif,
6554 struct ieee80211_ampdu_params *params)
6556 struct ath11k *ar = hw->priv;
6559 mutex_lock(&ar->conf_mutex);
6561 switch (params->action) {
6562 case IEEE80211_AMPDU_RX_START:
6563 ret = ath11k_dp_rx_ampdu_start(ar, params);
6565 case IEEE80211_AMPDU_RX_STOP:
6566 ret = ath11k_dp_rx_ampdu_stop(ar, params);
6568 case IEEE80211_AMPDU_TX_START:
6569 case IEEE80211_AMPDU_TX_STOP_CONT:
6570 case IEEE80211_AMPDU_TX_STOP_FLUSH:
6571 case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
6572 case IEEE80211_AMPDU_TX_OPERATIONAL:
6573 /* Tx A-MPDU aggregation offloaded to hw/fw so deny mac80211
6574 * Tx aggregation requests.
6580 mutex_unlock(&ar->conf_mutex);
6585 static int ath11k_mac_op_add_chanctx(struct ieee80211_hw *hw,
6586 struct ieee80211_chanctx_conf *ctx)
6588 struct ath11k *ar = hw->priv;
6589 struct ath11k_base *ab = ar->ab;
6591 ath11k_dbg(ab, ATH11K_DBG_MAC,
6592 "mac chanctx add freq %u width %d ptr %pK\n",
6593 ctx->def.chan->center_freq, ctx->def.width, ctx);
6595 mutex_lock(&ar->conf_mutex);
6597 spin_lock_bh(&ar->data_lock);
6598 /* TODO: In case of multiple channel context, populate rx_channel from
6599 * Rx PPDU desc information.
6601 ar->rx_channel = ctx->def.chan;
6602 spin_unlock_bh(&ar->data_lock);
6604 mutex_unlock(&ar->conf_mutex);
6609 static void ath11k_mac_op_remove_chanctx(struct ieee80211_hw *hw,
6610 struct ieee80211_chanctx_conf *ctx)
6612 struct ath11k *ar = hw->priv;
6613 struct ath11k_base *ab = ar->ab;
6615 ath11k_dbg(ab, ATH11K_DBG_MAC,
6616 "mac chanctx remove freq %u width %d ptr %pK\n",
6617 ctx->def.chan->center_freq, ctx->def.width, ctx);
6619 mutex_lock(&ar->conf_mutex);
6621 spin_lock_bh(&ar->data_lock);
6622 /* TODO: In case of there is one more channel context left, populate
6623 * rx_channel with the channel of that remaining channel context.
6625 ar->rx_channel = NULL;
6626 spin_unlock_bh(&ar->data_lock);
6628 mutex_unlock(&ar->conf_mutex);
6632 ath11k_mac_vdev_start_restart(struct ath11k_vif *arvif,
6633 struct ieee80211_chanctx_conf *ctx,
6636 struct ath11k *ar = arvif->ar;
6637 struct ath11k_base *ab = ar->ab;
6638 struct wmi_vdev_start_req_arg arg = {};
6639 const struct cfg80211_chan_def *chandef = &ctx->def;
6640 int he_support = arvif->vif->bss_conf.he_support;
6643 lockdep_assert_held(&ar->conf_mutex);
6645 reinit_completion(&ar->vdev_setup_done);
6647 arg.vdev_id = arvif->vdev_id;
6648 arg.dtim_period = arvif->dtim_period;
6649 arg.bcn_intval = arvif->beacon_interval;
6651 arg.channel.freq = chandef->chan->center_freq;
6652 arg.channel.band_center_freq1 = chandef->center_freq1;
6653 arg.channel.band_center_freq2 = chandef->center_freq2;
6655 ath11k_phymodes[chandef->chan->band][chandef->width];
6657 arg.channel.min_power = 0;
6658 arg.channel.max_power = chandef->chan->max_power;
6659 arg.channel.max_reg_power = chandef->chan->max_reg_power;
6660 arg.channel.max_antenna_gain = chandef->chan->max_antenna_gain;
6662 arg.pref_tx_streams = ar->num_tx_chains;
6663 arg.pref_rx_streams = ar->num_rx_chains;
6665 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
6666 arg.ssid = arvif->u.ap.ssid;
6667 arg.ssid_len = arvif->u.ap.ssid_len;
6668 arg.hidden_ssid = arvif->u.ap.hidden_ssid;
6670 /* For now allow DFS for AP mode */
6671 arg.channel.chan_radar =
6672 !!(chandef->chan->flags & IEEE80211_CHAN_RADAR);
6674 arg.channel.freq2_radar = ctx->radar_enabled;
6676 arg.channel.passive = arg.channel.chan_radar;
6678 spin_lock_bh(&ab->base_lock);
6679 arg.regdomain = ar->ab->dfs_region;
6680 spin_unlock_bh(&ab->base_lock);
6683 ret = ath11k_set_he_mu_sounding_mode(ar, arvif);
6685 ath11k_warn(ar->ab, "failed to set he mode vdev %i\n",
6692 arg.channel.passive |= !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR);
6694 ath11k_dbg(ab, ATH11K_DBG_MAC,
6695 "mac vdev %d start center_freq %d phymode %s\n",
6696 arg.vdev_id, arg.channel.freq,
6697 ath11k_wmi_phymode_str(arg.channel.mode));
6699 ret = ath11k_wmi_vdev_start(ar, &arg, restart);
6701 ath11k_warn(ar->ab, "failed to %s WMI vdev %i\n",
6702 restart ? "restart" : "start", arg.vdev_id);
6706 ret = ath11k_mac_vdev_setup_sync(ar);
6708 ath11k_warn(ab, "failed to synchronize setup for vdev %i %s: %d\n",
6709 arg.vdev_id, restart ? "restart" : "start", ret);
6714 ar->num_started_vdevs++;
6716 ath11k_dbg(ab, ATH11K_DBG_MAC, "vdev %pM started, vdev_id %d\n",
6717 arvif->vif->addr, arvif->vdev_id);
6719 /* Enable CAC Flag in the driver by checking the channel DFS cac time,
6720 * i.e dfs_cac_ms value which will be valid only for radar channels
6721 * and state as NL80211_DFS_USABLE which indicates CAC needs to be
6722 * done before channel usage. This flags is used to drop rx packets.
6725 /* TODO Set the flag for other interface types as required */
6726 if (arvif->vdev_type == WMI_VDEV_TYPE_AP &&
6727 chandef->chan->dfs_cac_ms &&
6728 chandef->chan->dfs_state == NL80211_DFS_USABLE) {
6729 set_bit(ATH11K_CAC_RUNNING, &ar->dev_flags);
6730 ath11k_dbg(ab, ATH11K_DBG_MAC,
6731 "CAC Started in chan_freq %d for vdev %d\n",
6732 arg.channel.freq, arg.vdev_id);
6735 ret = ath11k_mac_set_txbf_conf(arvif);
6737 ath11k_warn(ab, "failed to set txbf conf for vdev %d: %d\n",
6738 arvif->vdev_id, ret);
6743 static int ath11k_mac_vdev_stop(struct ath11k_vif *arvif)
6745 struct ath11k *ar = arvif->ar;
6748 lockdep_assert_held(&ar->conf_mutex);
6750 reinit_completion(&ar->vdev_setup_done);
6752 ret = ath11k_wmi_vdev_stop(ar, arvif->vdev_id);
6754 ath11k_warn(ar->ab, "failed to stop WMI vdev %i: %d\n",
6755 arvif->vdev_id, ret);
6759 ret = ath11k_mac_vdev_setup_sync(ar);
6761 ath11k_warn(ar->ab, "failed to synchronize setup for vdev %i: %d\n",
6762 arvif->vdev_id, ret);
6766 WARN_ON(ar->num_started_vdevs == 0);
6768 ar->num_started_vdevs--;
6769 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %pM stopped, vdev_id %d\n",
6770 arvif->vif->addr, arvif->vdev_id);
6772 if (test_bit(ATH11K_CAC_RUNNING, &ar->dev_flags)) {
6773 clear_bit(ATH11K_CAC_RUNNING, &ar->dev_flags);
6774 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "CAC Stopped for vdev %d\n",
6783 static int ath11k_mac_vdev_start(struct ath11k_vif *arvif,
6784 struct ieee80211_chanctx_conf *ctx)
6786 return ath11k_mac_vdev_start_restart(arvif, ctx, false);
6789 static int ath11k_mac_vdev_restart(struct ath11k_vif *arvif,
6790 struct ieee80211_chanctx_conf *ctx)
6792 return ath11k_mac_vdev_start_restart(arvif, ctx, true);
6795 struct ath11k_mac_change_chanctx_arg {
6796 struct ieee80211_chanctx_conf *ctx;
6797 struct ieee80211_vif_chanctx_switch *vifs;
6803 ath11k_mac_change_chanctx_cnt_iter(void *data, u8 *mac,
6804 struct ieee80211_vif *vif)
6806 struct ath11k_mac_change_chanctx_arg *arg = data;
6808 if (rcu_access_pointer(vif->chanctx_conf) != arg->ctx)
6815 ath11k_mac_change_chanctx_fill_iter(void *data, u8 *mac,
6816 struct ieee80211_vif *vif)
6818 struct ath11k_mac_change_chanctx_arg *arg = data;
6819 struct ieee80211_chanctx_conf *ctx;
6821 ctx = rcu_access_pointer(vif->chanctx_conf);
6822 if (ctx != arg->ctx)
6825 if (WARN_ON(arg->next_vif == arg->n_vifs))
6828 arg->vifs[arg->next_vif].vif = vif;
6829 arg->vifs[arg->next_vif].old_ctx = ctx;
6830 arg->vifs[arg->next_vif].new_ctx = ctx;
6835 ath11k_mac_update_vif_chan(struct ath11k *ar,
6836 struct ieee80211_vif_chanctx_switch *vifs,
6839 struct ath11k_base *ab = ar->ab;
6840 struct ath11k_vif *arvif;
6843 bool monitor_vif = false;
6845 lockdep_assert_held(&ar->conf_mutex);
6847 /* Associated channel resources of all relevant vdevs
6848 * should be available for the channel switch now.
6851 /* TODO: Update ar->rx_channel */
6853 for (i = 0; i < n_vifs; i++) {
6854 arvif = (void *)vifs[i].vif->drv_priv;
6856 if (WARN_ON(!arvif->is_started))
6859 /* change_chanctx can be called even before vdev_up from
6860 * ieee80211_start_ap->ieee80211_vif_use_channel->
6861 * ieee80211_recalc_radar_chanctx.
6863 * Firmware expect vdev_restart only if vdev is up.
6864 * If vdev is down then it expect vdev_stop->vdev_start.
6867 ret = ath11k_mac_vdev_restart(arvif, vifs[i].new_ctx);
6869 ath11k_warn(ab, "failed to restart vdev %d: %d\n",
6870 arvif->vdev_id, ret);
6874 ret = ath11k_mac_vdev_stop(arvif);
6876 ath11k_warn(ab, "failed to stop vdev %d: %d\n",
6877 arvif->vdev_id, ret);
6881 ret = ath11k_mac_vdev_start(arvif, vifs[i].new_ctx);
6883 ath11k_warn(ab, "failed to start vdev %d: %d\n",
6884 arvif->vdev_id, ret);
6889 ret = ath11k_mac_setup_bcn_tmpl(arvif);
6891 ath11k_warn(ab, "failed to update bcn tmpl during csa: %d\n",
6894 ret = ath11k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
6897 ath11k_warn(ab, "failed to bring vdev up %d: %d\n",
6898 arvif->vdev_id, ret);
6903 /* Restart the internal monitor vdev on new channel */
6905 test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags)) {
6906 ret = ath11k_mac_monitor_stop(ar);
6908 ath11k_warn(ar->ab, "failed to stop monitor during vif channel update: %d",
6913 ret = ath11k_mac_monitor_start(ar);
6915 ath11k_warn(ar->ab, "failed to start monitor during vif channel update: %d",
6923 ath11k_mac_update_active_vif_chan(struct ath11k *ar,
6924 struct ieee80211_chanctx_conf *ctx)
6926 struct ath11k_mac_change_chanctx_arg arg = { .ctx = ctx };
6928 lockdep_assert_held(&ar->conf_mutex);
6930 ieee80211_iterate_active_interfaces_atomic(ar->hw,
6931 IEEE80211_IFACE_ITER_NORMAL,
6932 ath11k_mac_change_chanctx_cnt_iter,
6934 if (arg.n_vifs == 0)
6937 arg.vifs = kcalloc(arg.n_vifs, sizeof(arg.vifs[0]), GFP_KERNEL);
6941 ieee80211_iterate_active_interfaces_atomic(ar->hw,
6942 IEEE80211_IFACE_ITER_NORMAL,
6943 ath11k_mac_change_chanctx_fill_iter,
6946 ath11k_mac_update_vif_chan(ar, arg.vifs, arg.n_vifs);
6951 static void ath11k_mac_op_change_chanctx(struct ieee80211_hw *hw,
6952 struct ieee80211_chanctx_conf *ctx,
6955 struct ath11k *ar = hw->priv;
6956 struct ath11k_base *ab = ar->ab;
6958 mutex_lock(&ar->conf_mutex);
6960 ath11k_dbg(ab, ATH11K_DBG_MAC,
6961 "mac chanctx change freq %u width %d ptr %pK changed %x\n",
6962 ctx->def.chan->center_freq, ctx->def.width, ctx, changed);
6964 /* This shouldn't really happen because channel switching should use
6965 * switch_vif_chanctx().
6967 if (WARN_ON(changed & IEEE80211_CHANCTX_CHANGE_CHANNEL))
6970 if (changed & IEEE80211_CHANCTX_CHANGE_WIDTH ||
6971 changed & IEEE80211_CHANCTX_CHANGE_RADAR)
6972 ath11k_mac_update_active_vif_chan(ar, ctx);
6974 /* TODO: Recalc radar detection */
6977 mutex_unlock(&ar->conf_mutex);
6980 static int ath11k_start_vdev_delay(struct ieee80211_hw *hw,
6981 struct ieee80211_vif *vif)
6983 struct ath11k *ar = hw->priv;
6984 struct ath11k_base *ab = ar->ab;
6985 struct ath11k_vif *arvif = (void *)vif->drv_priv;
6988 if (WARN_ON(arvif->is_started))
6991 ret = ath11k_mac_vdev_start(arvif, &arvif->chanctx);
6993 ath11k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n",
6994 arvif->vdev_id, vif->addr,
6995 arvif->chanctx.def.chan->center_freq, ret);
6999 /* Reconfigure hardware rate code since it is cleared by firmware.
7001 if (ar->hw_rate_code > 0) {
7002 u32 vdev_param = WMI_VDEV_PARAM_MGMT_RATE;
7004 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param,
7007 ath11k_warn(ar->ab, "failed to set mgmt tx rate %d\n", ret);
7012 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
7013 ret = ath11k_wmi_vdev_up(ar, arvif->vdev_id, 0, ar->mac_addr);
7015 ath11k_warn(ab, "failed put monitor up: %d\n", ret);
7020 arvif->is_started = true;
7022 /* TODO: Setup ps and cts/rts protection */
7027 ath11k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw,
7028 struct ieee80211_vif *vif,
7029 struct ieee80211_chanctx_conf *ctx)
7031 struct ath11k *ar = hw->priv;
7032 struct ath11k_base *ab = ar->ab;
7033 struct ath11k_vif *arvif = (void *)vif->drv_priv;
7035 struct peer_create_params param;
7037 mutex_lock(&ar->conf_mutex);
7039 ath11k_dbg(ab, ATH11K_DBG_MAC,
7040 "mac chanctx assign ptr %pK vdev_id %i\n",
7041 ctx, arvif->vdev_id);
7043 /* for QCA6390 bss peer must be created before vdev_start */
7044 if (ab->hw_params.vdev_start_delay &&
7045 arvif->vdev_type != WMI_VDEV_TYPE_AP &&
7046 arvif->vdev_type != WMI_VDEV_TYPE_MONITOR &&
7047 !ath11k_peer_find_by_vdev_id(ab, arvif->vdev_id)) {
7048 memcpy(&arvif->chanctx, ctx, sizeof(*ctx));
7053 if (WARN_ON(arvif->is_started)) {
7058 if (ab->hw_params.vdev_start_delay &&
7059 arvif->vdev_type != WMI_VDEV_TYPE_AP &&
7060 arvif->vdev_type != WMI_VDEV_TYPE_MONITOR) {
7061 param.vdev_id = arvif->vdev_id;
7062 param.peer_type = WMI_PEER_TYPE_DEFAULT;
7063 param.peer_addr = ar->mac_addr;
7065 ret = ath11k_peer_create(ar, arvif, NULL, ¶m);
7067 ath11k_warn(ab, "failed to create peer after vdev start delay: %d",
7073 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
7074 ret = ath11k_mac_monitor_start(ar);
7076 ath11k_warn(ar->ab, "failed to start monitor during vif channel context assignment: %d",
7081 arvif->is_started = true;
7085 ret = ath11k_mac_vdev_start(arvif, ctx);
7087 ath11k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n",
7088 arvif->vdev_id, vif->addr,
7089 ctx->def.chan->center_freq, ret);
7093 arvif->is_started = true;
7095 if (arvif->vdev_type != WMI_VDEV_TYPE_MONITOR &&
7096 test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags)) {
7097 ret = ath11k_mac_monitor_start(ar);
7099 ath11k_warn(ar->ab, "failed to start monitor during vif channel context assignment: %d",
7105 /* TODO: Setup ps and cts/rts protection */
7110 mutex_unlock(&ar->conf_mutex);
7116 ath11k_mac_op_unassign_vif_chanctx(struct ieee80211_hw *hw,
7117 struct ieee80211_vif *vif,
7118 struct ieee80211_chanctx_conf *ctx)
7120 struct ath11k *ar = hw->priv;
7121 struct ath11k_base *ab = ar->ab;
7122 struct ath11k_vif *arvif = (void *)vif->drv_priv;
7125 mutex_lock(&ar->conf_mutex);
7127 ath11k_dbg(ab, ATH11K_DBG_MAC,
7128 "mac chanctx unassign ptr %pK vdev_id %i\n",
7129 ctx, arvif->vdev_id);
7131 WARN_ON(!arvif->is_started);
7133 if (ab->hw_params.vdev_start_delay &&
7134 arvif->vdev_type == WMI_VDEV_TYPE_MONITOR &&
7135 ath11k_peer_find_by_addr(ab, ar->mac_addr))
7136 ath11k_peer_delete(ar, arvif->vdev_id, ar->mac_addr);
7138 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
7139 ret = ath11k_mac_monitor_stop(ar);
7141 ath11k_warn(ar->ab, "failed to stop monitor during vif channel context unassignment: %d",
7143 mutex_unlock(&ar->conf_mutex);
7147 arvif->is_started = false;
7148 mutex_unlock(&ar->conf_mutex);
7152 ret = ath11k_mac_vdev_stop(arvif);
7154 ath11k_warn(ab, "failed to stop vdev %i: %d\n",
7155 arvif->vdev_id, ret);
7157 arvif->is_started = false;
7159 if (ab->hw_params.vdev_start_delay &&
7160 arvif->vdev_type == WMI_VDEV_TYPE_STA) {
7161 ret = ath11k_peer_delete(ar, arvif->vdev_id, arvif->bssid);
7164 "failed to delete peer %pM for vdev %d: %d\n",
7165 arvif->bssid, arvif->vdev_id, ret);
7167 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
7168 "mac removed peer %pM vdev %d after vdev stop\n",
7169 arvif->bssid, arvif->vdev_id);
7172 if (ab->hw_params.vdev_start_delay &&
7173 arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
7174 ath11k_wmi_vdev_down(ar, arvif->vdev_id);
7176 if (arvif->vdev_type != WMI_VDEV_TYPE_MONITOR &&
7177 ar->num_started_vdevs == 1 &&
7178 test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags)) {
7179 ret = ath11k_mac_monitor_stop(ar);
7181 /* continue even if there's an error */
7182 ath11k_warn(ar->ab, "failed to stop monitor during vif channel context unassignment: %d",
7186 if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
7187 ath11k_mac_11d_scan_start(ar, arvif->vdev_id, false);
7189 mutex_unlock(&ar->conf_mutex);
7193 ath11k_mac_op_switch_vif_chanctx(struct ieee80211_hw *hw,
7194 struct ieee80211_vif_chanctx_switch *vifs,
7196 enum ieee80211_chanctx_switch_mode mode)
7198 struct ath11k *ar = hw->priv;
7200 mutex_lock(&ar->conf_mutex);
7202 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
7203 "mac chanctx switch n_vifs %d mode %d\n",
7205 ath11k_mac_update_vif_chan(ar, vifs, n_vifs);
7207 mutex_unlock(&ar->conf_mutex);
7213 ath11k_set_vdev_param_to_all_vifs(struct ath11k *ar, int param, u32 value)
7215 struct ath11k_vif *arvif;
7218 mutex_lock(&ar->conf_mutex);
7219 list_for_each_entry(arvif, &ar->arvifs, list) {
7220 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "setting mac vdev %d param %d value %d\n",
7221 param, arvif->vdev_id, value);
7223 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
7226 ath11k_warn(ar->ab, "failed to set param %d for vdev %d: %d\n",
7227 param, arvif->vdev_id, ret);
7231 mutex_unlock(&ar->conf_mutex);
7235 /* mac80211 stores device specific RTS/Fragmentation threshold value,
7236 * this is set interface specific to firmware from ath11k driver
7238 static int ath11k_mac_op_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
7240 struct ath11k *ar = hw->priv;
7241 int param_id = WMI_VDEV_PARAM_RTS_THRESHOLD;
7243 return ath11k_set_vdev_param_to_all_vifs(ar, param_id, value);
7246 static int ath11k_mac_op_set_frag_threshold(struct ieee80211_hw *hw, u32 value)
7248 /* Even though there's a WMI vdev param for fragmentation threshold no
7249 * known firmware actually implements it. Moreover it is not possible to
7250 * rely frame fragmentation to mac80211 because firmware clears the
7251 * "more fragments" bit in frame control making it impossible for remote
7252 * devices to reassemble frames.
7254 * Hence implement a dummy callback just to say fragmentation isn't
7255 * supported. This effectively prevents mac80211 from doing frame
7256 * fragmentation in software.
7261 static void ath11k_mac_op_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
7262 u32 queues, bool drop)
7264 struct ath11k *ar = hw->priv;
7270 time_left = wait_event_timeout(ar->dp.tx_empty_waitq,
7271 (atomic_read(&ar->dp.num_tx_pending) == 0),
7272 ATH11K_FLUSH_TIMEOUT);
7274 ath11k_warn(ar->ab, "failed to flush transmit queue %ld\n", time_left);
7276 time_left = wait_event_timeout(ar->txmgmt_empty_waitq,
7277 (atomic_read(&ar->num_pending_mgmt_tx) == 0),
7278 ATH11K_FLUSH_TIMEOUT);
7280 ath11k_warn(ar->ab, "failed to flush mgmt transmit queue %ld\n",
7283 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
7284 "mac mgmt tx flush mgmt pending %d\n",
7285 atomic_read(&ar->num_pending_mgmt_tx));
7289 ath11k_mac_bitrate_mask_num_ht_rates(struct ath11k *ar,
7290 enum nl80211_band band,
7291 const struct cfg80211_bitrate_mask *mask)
7296 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++)
7297 num_rates += hweight16(mask->control[band].ht_mcs[i]);
7303 ath11k_mac_has_single_legacy_rate(struct ath11k *ar,
7304 enum nl80211_band band,
7305 const struct cfg80211_bitrate_mask *mask)
7309 num_rates = hweight32(mask->control[band].legacy);
7311 if (ath11k_mac_bitrate_mask_num_ht_rates(ar, band, mask))
7314 if (ath11k_mac_bitrate_mask_num_vht_rates(ar, band, mask))
7317 if (ath11k_mac_bitrate_mask_num_he_rates(ar, band, mask))
7320 return num_rates == 1;
7324 ath11k_mac_get_tx_mcs_map(const struct ieee80211_sta_he_cap *he_cap)
7326 if (he_cap->he_cap_elem.phy_cap_info[0] &
7327 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
7328 return he_cap->he_mcs_nss_supp.tx_mcs_80p80;
7330 if (he_cap->he_cap_elem.phy_cap_info[0] &
7331 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
7332 return he_cap->he_mcs_nss_supp.tx_mcs_160;
7334 return he_cap->he_mcs_nss_supp.tx_mcs_80;
7338 ath11k_mac_bitrate_mask_get_single_nss(struct ath11k *ar,
7339 enum nl80211_band band,
7340 const struct cfg80211_bitrate_mask *mask,
7343 struct ieee80211_supported_band *sband = &ar->mac.sbands[band];
7344 u16 vht_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
7347 u8 vht_nss_mask = 0;
7351 /* No need to consider legacy here. Basic rates are always present
7355 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) {
7356 if (mask->control[band].ht_mcs[i] == 0)
7358 else if (mask->control[band].ht_mcs[i] ==
7359 sband->ht_cap.mcs.rx_mask[i])
7360 ht_nss_mask |= BIT(i);
7365 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
7366 if (mask->control[band].vht_mcs[i] == 0)
7368 else if (mask->control[band].vht_mcs[i] ==
7369 ath11k_mac_get_max_vht_mcs_map(vht_mcs_map, i))
7370 vht_nss_mask |= BIT(i);
7375 he_mcs_map = le16_to_cpu(ath11k_mac_get_tx_mcs_map(&sband->iftype_data->he_cap));
7377 for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) {
7378 if (mask->control[band].he_mcs[i] == 0)
7381 if (mask->control[band].he_mcs[i] ==
7382 ath11k_mac_get_max_he_mcs_map(he_mcs_map, i))
7383 he_nss_mask |= BIT(i);
7388 if (ht_nss_mask != vht_nss_mask || ht_nss_mask != he_nss_mask)
7391 if (ht_nss_mask == 0)
7394 if (BIT(fls(ht_nss_mask)) - 1 != ht_nss_mask)
7397 *nss = fls(ht_nss_mask);
7403 ath11k_mac_get_single_legacy_rate(struct ath11k *ar,
7404 enum nl80211_band band,
7405 const struct cfg80211_bitrate_mask *mask,
7413 if (hweight32(mask->control[band].legacy) != 1)
7416 rate_idx = ffs(mask->control[band].legacy) - 1;
7418 if (band == NL80211_BAND_5GHZ || band == NL80211_BAND_6GHZ)
7419 rate_idx += ATH11K_MAC_FIRST_OFDM_RATE_IDX;
7421 hw_rate = ath11k_legacy_rates[rate_idx].hw_value;
7422 bitrate = ath11k_legacy_rates[rate_idx].bitrate;
7424 if (ath11k_mac_bitrate_is_cck(bitrate))
7425 preamble = WMI_RATE_PREAMBLE_CCK;
7427 preamble = WMI_RATE_PREAMBLE_OFDM;
7430 *rate = ATH11K_HW_RATE_CODE(hw_rate, 0, preamble);
7436 ath11k_mac_set_fixed_rate_gi_ltf(struct ath11k_vif *arvif, u8 he_gi, u8 he_ltf)
7438 struct ath11k *ar = arvif->ar;
7441 /* 0.8 = 0, 1.6 = 2 and 3.2 = 3. */
7442 if (he_gi && he_gi != 0xFF)
7445 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
7446 WMI_VDEV_PARAM_SGI, he_gi);
7448 ath11k_warn(ar->ab, "failed to set he gi %d: %d\n",
7456 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
7457 WMI_VDEV_PARAM_HE_LTF, he_ltf);
7459 ath11k_warn(ar->ab, "failed to set he ltf %d: %d\n",
7468 ath11k_mac_set_auto_rate_gi_ltf(struct ath11k_vif *arvif, u16 he_gi, u8 he_ltf)
7470 struct ath11k *ar = arvif->ar;
7474 if (he_gi != 0xFF) {
7476 case NL80211_RATE_INFO_HE_GI_0_8:
7477 he_gi = WMI_AUTORATE_800NS_GI;
7479 case NL80211_RATE_INFO_HE_GI_1_6:
7480 he_gi = WMI_AUTORATE_1600NS_GI;
7482 case NL80211_RATE_INFO_HE_GI_3_2:
7483 he_gi = WMI_AUTORATE_3200NS_GI;
7486 ath11k_warn(ar->ab, "invalid he gi: %d\n", he_gi);
7491 if (he_ltf != 0xFF) {
7493 case NL80211_RATE_INFO_HE_1XLTF:
7494 he_ltf = WMI_HE_AUTORATE_LTF_1X;
7496 case NL80211_RATE_INFO_HE_2XLTF:
7497 he_ltf = WMI_HE_AUTORATE_LTF_2X;
7499 case NL80211_RATE_INFO_HE_4XLTF:
7500 he_ltf = WMI_HE_AUTORATE_LTF_4X;
7503 ath11k_warn(ar->ab, "invalid he ltf: %d\n", he_ltf);
7508 he_ar_gi_ltf = he_gi | he_ltf;
7509 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
7510 WMI_VDEV_PARAM_AUTORATE_MISC_CFG,
7514 "failed to set he autorate gi %u ltf %u: %d\n",
7515 he_gi, he_ltf, ret);
7522 static int ath11k_mac_set_rate_params(struct ath11k_vif *arvif,
7523 u32 rate, u8 nss, u8 sgi, u8 ldpc,
7524 u8 he_gi, u8 he_ltf, bool he_fixed_rate)
7526 struct ath11k *ar = arvif->ar;
7530 lockdep_assert_held(&ar->conf_mutex);
7532 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
7533 "mac set rate params vdev %i rate 0x%02x nss 0x%02x sgi 0x%02x ldpc 0x%02x he_gi 0x%02x he_ltf 0x%02x he_fixed_rate %d\n",
7534 arvif->vdev_id, rate, nss, sgi, ldpc, he_gi,
7535 he_ltf, he_fixed_rate);
7537 if (!arvif->vif->bss_conf.he_support) {
7538 vdev_param = WMI_VDEV_PARAM_FIXED_RATE;
7539 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
7542 ath11k_warn(ar->ab, "failed to set fixed rate param 0x%02x: %d\n",
7548 vdev_param = WMI_VDEV_PARAM_NSS;
7549 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
7552 ath11k_warn(ar->ab, "failed to set nss param %d: %d\n",
7557 vdev_param = WMI_VDEV_PARAM_LDPC;
7558 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
7561 ath11k_warn(ar->ab, "failed to set ldpc param %d: %d\n",
7566 if (arvif->vif->bss_conf.he_support) {
7567 if (he_fixed_rate) {
7568 ret = ath11k_mac_set_fixed_rate_gi_ltf(arvif, he_gi,
7571 ath11k_warn(ar->ab, "failed to set fixed rate gi ltf: %d\n",
7576 ret = ath11k_mac_set_auto_rate_gi_ltf(arvif, he_gi,
7579 ath11k_warn(ar->ab, "failed to set auto rate gi ltf: %d\n",
7585 vdev_param = WMI_VDEV_PARAM_SGI;
7586 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
7589 ath11k_warn(ar->ab, "failed to set sgi param %d: %d\n",
7599 ath11k_mac_vht_mcs_range_present(struct ath11k *ar,
7600 enum nl80211_band band,
7601 const struct cfg80211_bitrate_mask *mask)
7606 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
7607 vht_mcs = mask->control[band].vht_mcs[i];
7624 ath11k_mac_he_mcs_range_present(struct ath11k *ar,
7625 enum nl80211_band band,
7626 const struct cfg80211_bitrate_mask *mask)
7631 for (i = 0; i < NL80211_HE_NSS_MAX; i++) {
7632 he_mcs = mask->control[band].he_mcs[i];
7648 static void ath11k_mac_set_bitrate_mask_iter(void *data,
7649 struct ieee80211_sta *sta)
7651 struct ath11k_vif *arvif = data;
7652 struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
7653 struct ath11k *ar = arvif->ar;
7655 spin_lock_bh(&ar->data_lock);
7656 arsta->changed |= IEEE80211_RC_SUPP_RATES_CHANGED;
7657 spin_unlock_bh(&ar->data_lock);
7659 ieee80211_queue_work(ar->hw, &arsta->update_wk);
7662 static void ath11k_mac_disable_peer_fixed_rate(void *data,
7663 struct ieee80211_sta *sta)
7665 struct ath11k_vif *arvif = data;
7666 struct ath11k *ar = arvif->ar;
7669 ret = ath11k_wmi_set_peer_param(ar, sta->addr,
7671 WMI_PEER_PARAM_FIXED_RATE,
7672 WMI_FIXED_RATE_NONE);
7675 "failed to disable peer fixed rate for STA %pM ret %d\n",
7680 ath11k_mac_validate_vht_he_fixed_rate_settings(struct ath11k *ar, enum nl80211_band band,
7681 const struct cfg80211_bitrate_mask *mask)
7683 bool he_fixed_rate = false, vht_fixed_rate = false;
7684 struct ath11k_peer *peer, *tmp;
7685 const u16 *vht_mcs_mask, *he_mcs_mask;
7689 vht_mcs_mask = mask->control[band].vht_mcs;
7690 he_mcs_mask = mask->control[band].he_mcs;
7692 if (ath11k_mac_bitrate_mask_num_vht_rates(ar, band, mask) == 1)
7693 vht_fixed_rate = true;
7695 if (ath11k_mac_bitrate_mask_num_he_rates(ar, band, mask) == 1)
7696 he_fixed_rate = true;
7698 if (!vht_fixed_rate && !he_fixed_rate)
7701 vht_nss = ath11k_mac_max_vht_nss(vht_mcs_mask);
7702 he_nss = ath11k_mac_max_he_nss(he_mcs_mask);
7705 spin_lock_bh(&ar->ab->base_lock);
7706 list_for_each_entry_safe(peer, tmp, &ar->ab->peers, list) {
7708 if (vht_fixed_rate && (!peer->sta->vht_cap.vht_supported ||
7709 peer->sta->rx_nss < vht_nss)) {
7713 if (he_fixed_rate && (!peer->sta->he_cap.has_he ||
7714 peer->sta->rx_nss < he_nss)) {
7722 spin_unlock_bh(&ar->ab->base_lock);
7728 ath11k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw,
7729 struct ieee80211_vif *vif,
7730 const struct cfg80211_bitrate_mask *mask)
7732 struct ath11k_vif *arvif = (void *)vif->drv_priv;
7733 struct cfg80211_chan_def def;
7734 struct ath11k *ar = arvif->ar;
7735 enum nl80211_band band;
7736 const u8 *ht_mcs_mask;
7737 const u16 *vht_mcs_mask;
7738 const u16 *he_mcs_mask;
7748 bool he_fixed_rate = false;
7750 if (ath11k_mac_vif_chan(vif, &def))
7753 band = def.chan->band;
7754 ht_mcs_mask = mask->control[band].ht_mcs;
7755 vht_mcs_mask = mask->control[band].vht_mcs;
7756 he_mcs_mask = mask->control[band].he_mcs;
7757 ldpc = !!(ar->ht_cap_info & WMI_HT_CAP_LDPC);
7759 sgi = mask->control[band].gi;
7760 if (sgi == NL80211_TXRATE_FORCE_LGI)
7763 he_gi = mask->control[band].he_gi;
7764 he_ltf = mask->control[band].he_ltf;
7766 /* mac80211 doesn't support sending a fixed HT/VHT MCS alone, rather it
7767 * requires passing atleast one of used basic rates along with them.
7768 * Fixed rate setting across different preambles(legacy, HT, VHT) is
7769 * not supported by the FW. Hence use of FIXED_RATE vdev param is not
7770 * suitable for setting single HT/VHT rates.
7771 * But, there could be a single basic rate passed from userspace which
7772 * can be done through the FIXED_RATE param.
7774 if (ath11k_mac_has_single_legacy_rate(ar, band, mask)) {
7775 ret = ath11k_mac_get_single_legacy_rate(ar, band, mask, &rate,
7778 ath11k_warn(ar->ab, "failed to get single legacy rate for vdev %i: %d\n",
7779 arvif->vdev_id, ret);
7782 ieee80211_iterate_stations_atomic(ar->hw,
7783 ath11k_mac_disable_peer_fixed_rate,
7785 } else if (ath11k_mac_bitrate_mask_get_single_nss(ar, band, mask,
7787 rate = WMI_FIXED_RATE_NONE;
7789 mutex_lock(&ar->conf_mutex);
7790 arvif->bitrate_mask = *mask;
7791 ieee80211_iterate_stations_atomic(ar->hw,
7792 ath11k_mac_set_bitrate_mask_iter,
7794 mutex_unlock(&ar->conf_mutex);
7796 rate = WMI_FIXED_RATE_NONE;
7798 if (!ath11k_mac_validate_vht_he_fixed_rate_settings(ar, band, mask))
7800 "could not update fixed rate settings to all peers due to mcs/nss incompatibility\n");
7801 nss = min_t(u32, ar->num_tx_chains,
7802 max(max(ath11k_mac_max_ht_nss(ht_mcs_mask),
7803 ath11k_mac_max_vht_nss(vht_mcs_mask)),
7804 ath11k_mac_max_he_nss(he_mcs_mask)));
7806 /* If multiple rates across different preambles are given
7807 * we can reconfigure this info with all peers using PEER_ASSOC
7808 * command with the below exception cases.
7809 * - Single VHT Rate : peer_assoc command accommodates only MCS
7810 * range values i.e 0-7, 0-8, 0-9 for VHT. Though mac80211
7811 * mandates passing basic rates along with HT/VHT rates, FW
7812 * doesn't allow switching from VHT to Legacy. Hence instead of
7813 * setting legacy and VHT rates using RATEMASK_CMD vdev cmd,
7814 * we could set this VHT rate as peer fixed rate param, which
7815 * will override FIXED rate and FW rate control algorithm.
7816 * If single VHT rate is passed along with HT rates, we select
7817 * the VHT rate as fixed rate for vht peers.
7818 * - Multiple VHT Rates : When Multiple VHT rates are given,this
7819 * can be set using RATEMASK CMD which uses FW rate-ctl alg.
7820 * TODO: Setting multiple VHT MCS and replacing peer_assoc with
7821 * RATEMASK_CMDID can cover all use cases of setting rates
7822 * across multiple preambles and rates within same type.
7823 * But requires more validation of the command at this point.
7826 num_rates = ath11k_mac_bitrate_mask_num_vht_rates(ar, band,
7829 if (!ath11k_mac_vht_mcs_range_present(ar, band, mask) &&
7831 /* TODO: Handle multiple VHT MCS values setting using
7835 "setting %d mcs values in bitrate mask not supported\n",
7840 num_rates = ath11k_mac_bitrate_mask_num_he_rates(ar, band,
7843 he_fixed_rate = true;
7845 if (!ath11k_mac_he_mcs_range_present(ar, band, mask) &&
7848 "Setting more than one HE MCS Value in bitrate mask not supported\n");
7852 mutex_lock(&ar->conf_mutex);
7853 ieee80211_iterate_stations_atomic(ar->hw,
7854 ath11k_mac_disable_peer_fixed_rate,
7857 arvif->bitrate_mask = *mask;
7858 ieee80211_iterate_stations_atomic(ar->hw,
7859 ath11k_mac_set_bitrate_mask_iter,
7862 mutex_unlock(&ar->conf_mutex);
7865 mutex_lock(&ar->conf_mutex);
7867 ret = ath11k_mac_set_rate_params(arvif, rate, nss, sgi, ldpc, he_gi,
7868 he_ltf, he_fixed_rate);
7870 ath11k_warn(ar->ab, "failed to set rate params on vdev %i: %d\n",
7871 arvif->vdev_id, ret);
7874 mutex_unlock(&ar->conf_mutex);
7880 ath11k_mac_op_reconfig_complete(struct ieee80211_hw *hw,
7881 enum ieee80211_reconfig_type reconfig_type)
7883 struct ath11k *ar = hw->priv;
7885 if (reconfig_type != IEEE80211_RECONFIG_TYPE_RESTART)
7888 mutex_lock(&ar->conf_mutex);
7890 if (ar->state == ATH11K_STATE_RESTARTED) {
7891 ath11k_warn(ar->ab, "pdev %d successfully recovered\n",
7893 ar->state = ATH11K_STATE_ON;
7894 ieee80211_wake_queues(ar->hw);
7897 mutex_unlock(&ar->conf_mutex);
7901 ath11k_mac_update_bss_chan_survey(struct ath11k *ar,
7902 struct ieee80211_channel *channel)
7905 enum wmi_bss_chan_info_req_type type = WMI_BSS_SURVEY_REQ_TYPE_READ;
7907 lockdep_assert_held(&ar->conf_mutex);
7909 if (!test_bit(WMI_TLV_SERVICE_BSS_CHANNEL_INFO_64, ar->ab->wmi_ab.svc_map) ||
7910 ar->rx_channel != channel)
7913 if (ar->scan.state != ATH11K_SCAN_IDLE) {
7914 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
7915 "ignoring bss chan info req while scanning..\n");
7919 reinit_completion(&ar->bss_survey_done);
7921 ret = ath11k_wmi_pdev_bss_chan_info_request(ar, type);
7923 ath11k_warn(ar->ab, "failed to send pdev bss chan info request\n");
7927 ret = wait_for_completion_timeout(&ar->bss_survey_done, 3 * HZ);
7929 ath11k_warn(ar->ab, "bss channel survey timed out\n");
7932 static int ath11k_mac_op_get_survey(struct ieee80211_hw *hw, int idx,
7933 struct survey_info *survey)
7935 struct ath11k *ar = hw->priv;
7936 struct ieee80211_supported_band *sband;
7937 struct survey_info *ar_survey;
7940 if (idx >= ATH11K_NUM_CHANS)
7943 ar_survey = &ar->survey[idx];
7945 mutex_lock(&ar->conf_mutex);
7947 sband = hw->wiphy->bands[NL80211_BAND_2GHZ];
7948 if (sband && idx >= sband->n_channels) {
7949 idx -= sband->n_channels;
7954 sband = hw->wiphy->bands[NL80211_BAND_5GHZ];
7955 if (sband && idx >= sband->n_channels) {
7956 idx -= sband->n_channels;
7961 sband = hw->wiphy->bands[NL80211_BAND_6GHZ];
7962 if (!sband || idx >= sband->n_channels) {
7967 ath11k_mac_update_bss_chan_survey(ar, &sband->channels[idx]);
7969 spin_lock_bh(&ar->data_lock);
7970 memcpy(survey, ar_survey, sizeof(*survey));
7971 spin_unlock_bh(&ar->data_lock);
7973 survey->channel = &sband->channels[idx];
7975 if (ar->rx_channel == survey->channel)
7976 survey->filled |= SURVEY_INFO_IN_USE;
7979 mutex_unlock(&ar->conf_mutex);
7983 static void ath11k_mac_put_chain_rssi(struct station_info *sinfo,
7984 struct ath11k_sta *arsta,
7988 struct ath11k *ar = arsta->arvif->ar;
7992 for (i = 0; i < ARRAY_SIZE(sinfo->chain_signal); i++) {
7993 sinfo->chains &= ~BIT(i);
7994 rssi = arsta->chain_signal[i];
7996 arsta->chain_signal[i] = ATH11K_INVALID_RSSI_FULL;
7998 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
7999 "mac sta statistics %s rssi[%d] %d\n", pre, i, rssi);
8001 if (rssi != ATH11K_DEFAULT_NOISE_FLOOR &&
8002 rssi != ATH11K_INVALID_RSSI_FULL &&
8003 rssi != ATH11K_INVALID_RSSI_EMPTY &&
8005 sinfo->chain_signal[i] = rssi;
8006 sinfo->chains |= BIT(i);
8007 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL);
8012 static void ath11k_mac_op_sta_statistics(struct ieee80211_hw *hw,
8013 struct ieee80211_vif *vif,
8014 struct ieee80211_sta *sta,
8015 struct station_info *sinfo)
8017 struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
8018 struct ath11k *ar = arsta->arvif->ar;
8020 bool db2dbm = test_bit(WMI_TLV_SERVICE_HW_DB2DBM_CONVERSION_SUPPORT,
8021 ar->ab->wmi_ab.svc_map);
8023 sinfo->rx_duration = arsta->rx_duration;
8024 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_DURATION);
8026 sinfo->tx_duration = arsta->tx_duration;
8027 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_DURATION);
8029 if (arsta->txrate.legacy || arsta->txrate.nss) {
8030 if (arsta->txrate.legacy) {
8031 sinfo->txrate.legacy = arsta->txrate.legacy;
8033 sinfo->txrate.mcs = arsta->txrate.mcs;
8034 sinfo->txrate.nss = arsta->txrate.nss;
8035 sinfo->txrate.bw = arsta->txrate.bw;
8036 sinfo->txrate.he_gi = arsta->txrate.he_gi;
8037 sinfo->txrate.he_dcm = arsta->txrate.he_dcm;
8038 sinfo->txrate.he_ru_alloc = arsta->txrate.he_ru_alloc;
8040 sinfo->txrate.flags = arsta->txrate.flags;
8041 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
8044 ath11k_mac_put_chain_rssi(sinfo, arsta, "ppdu", false);
8046 if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL)) &&
8047 arsta->arvif->vdev_type == WMI_VDEV_TYPE_STA &&
8048 ar->ab->hw_params.supports_rssi_stats &&
8049 !ath11k_debugfs_get_fw_stats(ar, ar->pdev->pdev_id, 0,
8050 WMI_REQUEST_RSSI_PER_CHAIN_STAT)) {
8051 ath11k_mac_put_chain_rssi(sinfo, arsta, "fw stats", true);
8054 signal = arsta->rssi_comb;
8056 arsta->arvif->vdev_type == WMI_VDEV_TYPE_STA &&
8057 ar->ab->hw_params.supports_rssi_stats &&
8058 !(ath11k_debugfs_get_fw_stats(ar, ar->pdev->pdev_id, 0,
8059 WMI_REQUEST_VDEV_STAT)))
8060 signal = arsta->rssi_beacon;
8062 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
8063 "mac sta statistics db2dbm %u rssi comb %d rssi beacon %d\n",
8064 db2dbm, arsta->rssi_comb, arsta->rssi_beacon);
8067 sinfo->signal = db2dbm ? signal : signal + ATH11K_DEFAULT_NOISE_FLOOR;
8068 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL);
8072 static const struct ieee80211_ops ath11k_ops = {
8073 .tx = ath11k_mac_op_tx,
8074 .start = ath11k_mac_op_start,
8075 .stop = ath11k_mac_op_stop,
8076 .reconfig_complete = ath11k_mac_op_reconfig_complete,
8077 .add_interface = ath11k_mac_op_add_interface,
8078 .remove_interface = ath11k_mac_op_remove_interface,
8079 .update_vif_offload = ath11k_mac_op_update_vif_offload,
8080 .config = ath11k_mac_op_config,
8081 .bss_info_changed = ath11k_mac_op_bss_info_changed,
8082 .configure_filter = ath11k_mac_op_configure_filter,
8083 .hw_scan = ath11k_mac_op_hw_scan,
8084 .cancel_hw_scan = ath11k_mac_op_cancel_hw_scan,
8085 .set_key = ath11k_mac_op_set_key,
8086 .sta_state = ath11k_mac_op_sta_state,
8087 .sta_set_4addr = ath11k_mac_op_sta_set_4addr,
8088 .sta_set_txpwr = ath11k_mac_op_sta_set_txpwr,
8089 .sta_rc_update = ath11k_mac_op_sta_rc_update,
8090 .conf_tx = ath11k_mac_op_conf_tx,
8091 .set_antenna = ath11k_mac_op_set_antenna,
8092 .get_antenna = ath11k_mac_op_get_antenna,
8093 .ampdu_action = ath11k_mac_op_ampdu_action,
8094 .add_chanctx = ath11k_mac_op_add_chanctx,
8095 .remove_chanctx = ath11k_mac_op_remove_chanctx,
8096 .change_chanctx = ath11k_mac_op_change_chanctx,
8097 .assign_vif_chanctx = ath11k_mac_op_assign_vif_chanctx,
8098 .unassign_vif_chanctx = ath11k_mac_op_unassign_vif_chanctx,
8099 .switch_vif_chanctx = ath11k_mac_op_switch_vif_chanctx,
8100 .set_rts_threshold = ath11k_mac_op_set_rts_threshold,
8101 .set_frag_threshold = ath11k_mac_op_set_frag_threshold,
8102 .set_bitrate_mask = ath11k_mac_op_set_bitrate_mask,
8103 .get_survey = ath11k_mac_op_get_survey,
8104 .flush = ath11k_mac_op_flush,
8105 .sta_statistics = ath11k_mac_op_sta_statistics,
8106 CFG80211_TESTMODE_CMD(ath11k_tm_cmd)
8107 #ifdef CONFIG_ATH11K_DEBUGFS
8108 .sta_add_debugfs = ath11k_debugfs_sta_op_add,
8112 static void ath11k_mac_update_ch_list(struct ath11k *ar,
8113 struct ieee80211_supported_band *band,
8114 u32 freq_low, u32 freq_high)
8118 if (!(freq_low && freq_high))
8121 for (i = 0; i < band->n_channels; i++) {
8122 if (band->channels[i].center_freq < freq_low ||
8123 band->channels[i].center_freq > freq_high)
8124 band->channels[i].flags |= IEEE80211_CHAN_DISABLED;
8128 static u32 ath11k_get_phy_id(struct ath11k *ar, u32 band)
8130 struct ath11k_pdev *pdev = ar->pdev;
8131 struct ath11k_pdev_cap *pdev_cap = &pdev->cap;
8133 if (band == WMI_HOST_WLAN_2G_CAP)
8134 return pdev_cap->band[NL80211_BAND_2GHZ].phy_id;
8136 if (band == WMI_HOST_WLAN_5G_CAP)
8137 return pdev_cap->band[NL80211_BAND_5GHZ].phy_id;
8139 ath11k_warn(ar->ab, "unsupported phy cap:%d\n", band);
8144 static int ath11k_mac_setup_channels_rates(struct ath11k *ar,
8145 u32 supported_bands)
8147 struct ieee80211_supported_band *band;
8148 struct ath11k_hal_reg_capabilities_ext *reg_cap, *temp_reg_cap;
8152 BUILD_BUG_ON((ARRAY_SIZE(ath11k_2ghz_channels) +
8153 ARRAY_SIZE(ath11k_5ghz_channels) +
8154 ARRAY_SIZE(ath11k_6ghz_channels)) !=
8157 reg_cap = &ar->ab->hal_reg_cap[ar->pdev_idx];
8158 temp_reg_cap = reg_cap;
8160 if (supported_bands & WMI_HOST_WLAN_2G_CAP) {
8161 channels = kmemdup(ath11k_2ghz_channels,
8162 sizeof(ath11k_2ghz_channels),
8167 band = &ar->mac.sbands[NL80211_BAND_2GHZ];
8168 band->band = NL80211_BAND_2GHZ;
8169 band->n_channels = ARRAY_SIZE(ath11k_2ghz_channels);
8170 band->channels = channels;
8171 band->n_bitrates = ath11k_g_rates_size;
8172 band->bitrates = ath11k_g_rates;
8173 ar->hw->wiphy->bands[NL80211_BAND_2GHZ] = band;
8175 if (ar->ab->hw_params.single_pdev_only) {
8176 phy_id = ath11k_get_phy_id(ar, WMI_HOST_WLAN_2G_CAP);
8177 temp_reg_cap = &ar->ab->hal_reg_cap[phy_id];
8179 ath11k_mac_update_ch_list(ar, band,
8180 temp_reg_cap->low_2ghz_chan,
8181 temp_reg_cap->high_2ghz_chan);
8184 if (supported_bands & WMI_HOST_WLAN_5G_CAP) {
8185 if (reg_cap->high_5ghz_chan >= ATH11K_MAX_6G_FREQ) {
8186 channels = kmemdup(ath11k_6ghz_channels,
8187 sizeof(ath11k_6ghz_channels), GFP_KERNEL);
8189 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
8193 ar->supports_6ghz = true;
8194 band = &ar->mac.sbands[NL80211_BAND_6GHZ];
8195 band->band = NL80211_BAND_6GHZ;
8196 band->n_channels = ARRAY_SIZE(ath11k_6ghz_channels);
8197 band->channels = channels;
8198 band->n_bitrates = ath11k_a_rates_size;
8199 band->bitrates = ath11k_a_rates;
8200 ar->hw->wiphy->bands[NL80211_BAND_6GHZ] = band;
8202 if (ar->ab->hw_params.single_pdev_only) {
8203 phy_id = ath11k_get_phy_id(ar, WMI_HOST_WLAN_5G_CAP);
8204 temp_reg_cap = &ar->ab->hal_reg_cap[phy_id];
8207 ath11k_mac_update_ch_list(ar, band,
8208 temp_reg_cap->low_5ghz_chan,
8209 temp_reg_cap->high_5ghz_chan);
8212 if (reg_cap->low_5ghz_chan < ATH11K_MIN_6G_FREQ) {
8213 channels = kmemdup(ath11k_5ghz_channels,
8214 sizeof(ath11k_5ghz_channels),
8217 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
8218 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
8222 band = &ar->mac.sbands[NL80211_BAND_5GHZ];
8223 band->band = NL80211_BAND_5GHZ;
8224 band->n_channels = ARRAY_SIZE(ath11k_5ghz_channels);
8225 band->channels = channels;
8226 band->n_bitrates = ath11k_a_rates_size;
8227 band->bitrates = ath11k_a_rates;
8228 ar->hw->wiphy->bands[NL80211_BAND_5GHZ] = band;
8230 if (ar->ab->hw_params.single_pdev_only) {
8231 phy_id = ath11k_get_phy_id(ar, WMI_HOST_WLAN_5G_CAP);
8232 temp_reg_cap = &ar->ab->hal_reg_cap[phy_id];
8235 ath11k_mac_update_ch_list(ar, band,
8236 temp_reg_cap->low_5ghz_chan,
8237 temp_reg_cap->high_5ghz_chan);
8244 static int ath11k_mac_setup_iface_combinations(struct ath11k *ar)
8246 struct ath11k_base *ab = ar->ab;
8247 struct ieee80211_iface_combination *combinations;
8248 struct ieee80211_iface_limit *limits;
8251 combinations = kzalloc(sizeof(*combinations), GFP_KERNEL);
8257 limits = kcalloc(n_limits, sizeof(*limits), GFP_KERNEL);
8259 kfree(combinations);
8264 limits[0].types |= BIT(NL80211_IFTYPE_STATION);
8267 limits[1].types |= BIT(NL80211_IFTYPE_AP);
8269 if (IS_ENABLED(CONFIG_MAC80211_MESH) &&
8270 ab->hw_params.interface_modes & BIT(NL80211_IFTYPE_MESH_POINT))
8271 limits[1].types |= BIT(NL80211_IFTYPE_MESH_POINT);
8273 combinations[0].limits = limits;
8274 combinations[0].n_limits = n_limits;
8275 combinations[0].max_interfaces = 16;
8276 combinations[0].num_different_channels = 1;
8277 combinations[0].beacon_int_infra_match = true;
8278 combinations[0].beacon_int_min_gcd = 100;
8279 combinations[0].radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
8280 BIT(NL80211_CHAN_WIDTH_20) |
8281 BIT(NL80211_CHAN_WIDTH_40) |
8282 BIT(NL80211_CHAN_WIDTH_80) |
8283 BIT(NL80211_CHAN_WIDTH_80P80) |
8284 BIT(NL80211_CHAN_WIDTH_160);
8286 ar->hw->wiphy->iface_combinations = combinations;
8287 ar->hw->wiphy->n_iface_combinations = 1;
8292 static const u8 ath11k_if_types_ext_capa[] = {
8293 [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
8294 [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
8297 static const u8 ath11k_if_types_ext_capa_sta[] = {
8298 [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
8299 [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
8300 [9] = WLAN_EXT_CAPA10_TWT_REQUESTER_SUPPORT,
8303 static const u8 ath11k_if_types_ext_capa_ap[] = {
8304 [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
8305 [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
8306 [9] = WLAN_EXT_CAPA10_TWT_RESPONDER_SUPPORT,
8309 static const struct wiphy_iftype_ext_capab ath11k_iftypes_ext_capa[] = {
8311 .extended_capabilities = ath11k_if_types_ext_capa,
8312 .extended_capabilities_mask = ath11k_if_types_ext_capa,
8313 .extended_capabilities_len = sizeof(ath11k_if_types_ext_capa),
8315 .iftype = NL80211_IFTYPE_STATION,
8316 .extended_capabilities = ath11k_if_types_ext_capa_sta,
8317 .extended_capabilities_mask = ath11k_if_types_ext_capa_sta,
8318 .extended_capabilities_len =
8319 sizeof(ath11k_if_types_ext_capa_sta),
8321 .iftype = NL80211_IFTYPE_AP,
8322 .extended_capabilities = ath11k_if_types_ext_capa_ap,
8323 .extended_capabilities_mask = ath11k_if_types_ext_capa_ap,
8324 .extended_capabilities_len =
8325 sizeof(ath11k_if_types_ext_capa_ap),
8329 static void __ath11k_mac_unregister(struct ath11k *ar)
8331 cancel_work_sync(&ar->regd_update_work);
8333 ieee80211_unregister_hw(ar->hw);
8335 idr_for_each(&ar->txmgmt_idr, ath11k_mac_tx_mgmt_pending_free, ar);
8336 idr_destroy(&ar->txmgmt_idr);
8338 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
8339 kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels);
8340 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
8342 kfree(ar->hw->wiphy->iface_combinations[0].limits);
8343 kfree(ar->hw->wiphy->iface_combinations);
8345 SET_IEEE80211_DEV(ar->hw, NULL);
8348 void ath11k_mac_unregister(struct ath11k_base *ab)
8351 struct ath11k_pdev *pdev;
8354 for (i = 0; i < ab->num_radios; i++) {
8355 pdev = &ab->pdevs[i];
8360 __ath11k_mac_unregister(ar);
8364 static int __ath11k_mac_register(struct ath11k *ar)
8366 struct ath11k_base *ab = ar->ab;
8367 struct ath11k_pdev_cap *cap = &ar->pdev->cap;
8368 static const u32 cipher_suites[] = {
8369 WLAN_CIPHER_SUITE_TKIP,
8370 WLAN_CIPHER_SUITE_CCMP,
8371 WLAN_CIPHER_SUITE_AES_CMAC,
8372 WLAN_CIPHER_SUITE_BIP_CMAC_256,
8373 WLAN_CIPHER_SUITE_BIP_GMAC_128,
8374 WLAN_CIPHER_SUITE_BIP_GMAC_256,
8375 WLAN_CIPHER_SUITE_GCMP,
8376 WLAN_CIPHER_SUITE_GCMP_256,
8377 WLAN_CIPHER_SUITE_CCMP_256,
8382 ath11k_pdev_caps_update(ar);
8384 SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr);
8386 SET_IEEE80211_DEV(ar->hw, ab->dev);
8388 ret = ath11k_mac_setup_channels_rates(ar,
8389 cap->supported_bands);
8393 ath11k_mac_setup_ht_vht_cap(ar, cap, &ht_cap);
8394 ath11k_mac_setup_he_cap(ar, cap);
8396 ret = ath11k_mac_setup_iface_combinations(ar);
8398 ath11k_err(ar->ab, "failed to setup interface combinations: %d\n", ret);
8399 goto err_free_channels;
8402 ar->hw->wiphy->available_antennas_rx = cap->rx_chain_mask;
8403 ar->hw->wiphy->available_antennas_tx = cap->tx_chain_mask;
8405 ar->hw->wiphy->interface_modes = ab->hw_params.interface_modes;
8407 if (ab->hw_params.single_pdev_only && ar->supports_6ghz)
8408 ieee80211_hw_set(ar->hw, SINGLE_SCAN_ON_ALL_BANDS);
8410 ieee80211_hw_set(ar->hw, SIGNAL_DBM);
8411 ieee80211_hw_set(ar->hw, SUPPORTS_PS);
8412 ieee80211_hw_set(ar->hw, SUPPORTS_DYNAMIC_PS);
8413 ieee80211_hw_set(ar->hw, MFP_CAPABLE);
8414 ieee80211_hw_set(ar->hw, REPORTS_TX_ACK_STATUS);
8415 ieee80211_hw_set(ar->hw, HAS_RATE_CONTROL);
8416 ieee80211_hw_set(ar->hw, AP_LINK_PS);
8417 ieee80211_hw_set(ar->hw, SPECTRUM_MGMT);
8418 ieee80211_hw_set(ar->hw, CONNECTION_MONITOR);
8419 ieee80211_hw_set(ar->hw, SUPPORTS_PER_STA_GTK);
8420 ieee80211_hw_set(ar->hw, WANT_MONITOR_VIF);
8421 ieee80211_hw_set(ar->hw, CHANCTX_STA_CSA);
8422 ieee80211_hw_set(ar->hw, QUEUE_CONTROL);
8423 ieee80211_hw_set(ar->hw, SUPPORTS_TX_FRAG);
8424 ieee80211_hw_set(ar->hw, REPORTS_LOW_ACK);
8426 if (ath11k_frame_mode == ATH11K_HW_TXRX_ETHERNET) {
8427 ieee80211_hw_set(ar->hw, SUPPORTS_TX_ENCAP_OFFLOAD);
8428 ieee80211_hw_set(ar->hw, SUPPORTS_RX_DECAP_OFFLOAD);
8431 if (cap->nss_ratio_enabled)
8432 ieee80211_hw_set(ar->hw, SUPPORTS_VHT_EXT_NSS_BW);
8434 if ((ht_cap & WMI_HT_CAP_ENABLED) || ar->supports_6ghz) {
8435 ieee80211_hw_set(ar->hw, AMPDU_AGGREGATION);
8436 ieee80211_hw_set(ar->hw, TX_AMPDU_SETUP_IN_HW);
8437 ieee80211_hw_set(ar->hw, SUPPORTS_REORDERING_BUFFER);
8438 ieee80211_hw_set(ar->hw, SUPPORTS_AMSDU_IN_AMPDU);
8439 ieee80211_hw_set(ar->hw, USES_RSS);
8442 ar->hw->wiphy->features |= NL80211_FEATURE_STATIC_SMPS;
8443 ar->hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
8445 /* TODO: Check if HT capability advertised from firmware is different
8446 * for each band for a dual band capable radio. It will be tricky to
8447 * handle it when the ht capability different for each band.
8449 if (ht_cap & WMI_HT_CAP_DYNAMIC_SMPS ||
8450 (ar->supports_6ghz && ab->hw_params.supports_dynamic_smps_6ghz))
8451 ar->hw->wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS;
8453 ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID;
8454 ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN;
8456 ar->hw->max_listen_interval = ATH11K_MAX_HW_LISTEN_INTERVAL;
8458 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
8459 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
8460 ar->hw->wiphy->max_remain_on_channel_duration = 5000;
8462 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
8463 ar->hw->wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE |
8464 NL80211_FEATURE_AP_SCAN;
8466 ar->max_num_stations = TARGET_NUM_STATIONS(ab);
8467 ar->max_num_peers = TARGET_NUM_PEERS_PDEV(ab);
8469 ar->hw->wiphy->max_ap_assoc_sta = ar->max_num_stations;
8471 if (test_bit(WMI_TLV_SERVICE_SPOOF_MAC_SUPPORT, ar->wmi->wmi_ab->svc_map)) {
8472 ar->hw->wiphy->features |=
8473 NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR;
8476 ar->hw->queues = ATH11K_HW_MAX_QUEUES;
8477 ar->hw->wiphy->tx_queue_len = ATH11K_QUEUE_LEN;
8478 ar->hw->offchannel_tx_hw_queue = ATH11K_HW_MAX_QUEUES - 1;
8479 ar->hw->max_rx_aggregation_subframes = IEEE80211_MAX_AMPDU_BUF_HE;
8481 ar->hw->vif_data_size = sizeof(struct ath11k_vif);
8482 ar->hw->sta_data_size = sizeof(struct ath11k_sta);
8484 wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
8485 wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_STA_TX_PWR);
8486 if (test_bit(WMI_TLV_SERVICE_BSS_COLOR_OFFLOAD, ar->ab->wmi_ab.svc_map))
8487 wiphy_ext_feature_set(ar->hw->wiphy,
8488 NL80211_EXT_FEATURE_BSS_COLOR);
8490 ar->hw->wiphy->cipher_suites = cipher_suites;
8491 ar->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
8493 ar->hw->wiphy->iftype_ext_capab = ath11k_iftypes_ext_capa;
8494 ar->hw->wiphy->num_iftype_ext_capab =
8495 ARRAY_SIZE(ath11k_iftypes_ext_capa);
8497 if (ar->supports_6ghz) {
8498 wiphy_ext_feature_set(ar->hw->wiphy,
8499 NL80211_EXT_FEATURE_FILS_DISCOVERY);
8500 wiphy_ext_feature_set(ar->hw->wiphy,
8501 NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP);
8504 ath11k_reg_init(ar);
8506 if (!test_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags)) {
8507 ar->hw->netdev_features = NETIF_F_HW_CSUM;
8508 ieee80211_hw_set(ar->hw, SW_CRYPTO_CONTROL);
8509 ieee80211_hw_set(ar->hw, SUPPORT_FAST_XMIT);
8512 ret = ieee80211_register_hw(ar->hw);
8514 ath11k_err(ar->ab, "ieee80211 registration failed: %d\n", ret);
8515 goto err_free_if_combs;
8518 if (!ab->hw_params.supports_monitor)
8519 /* There's a race between calling ieee80211_register_hw()
8520 * and here where the monitor mode is enabled for a little
8521 * while. But that time is so short and in practise it make
8522 * a difference in real life.
8524 ar->hw->wiphy->interface_modes &= ~BIT(NL80211_IFTYPE_MONITOR);
8526 /* Apply the regd received during initialization */
8527 ret = ath11k_regd_update(ar);
8529 ath11k_err(ar->ab, "ath11k regd update failed: %d\n", ret);
8530 goto err_unregister_hw;
8533 ret = ath11k_debugfs_register(ar);
8535 ath11k_err(ar->ab, "debugfs registration failed: %d\n", ret);
8536 goto err_unregister_hw;
8542 ieee80211_unregister_hw(ar->hw);
8545 kfree(ar->hw->wiphy->iface_combinations[0].limits);
8546 kfree(ar->hw->wiphy->iface_combinations);
8549 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
8550 kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels);
8551 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
8554 SET_IEEE80211_DEV(ar->hw, NULL);
8558 int ath11k_mac_register(struct ath11k_base *ab)
8561 struct ath11k_pdev *pdev;
8565 if (test_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags))
8568 /* Initialize channel counters frequency value in hertz */
8569 ab->cc_freq_hz = IPQ8074_CC_FREQ_HERTZ;
8570 ab->free_vdev_map = (1LL << (ab->num_radios * TARGET_NUM_VDEVS(ab))) - 1;
8572 for (i = 0; i < ab->num_radios; i++) {
8573 pdev = &ab->pdevs[i];
8575 if (ab->pdevs_macaddr_valid) {
8576 ether_addr_copy(ar->mac_addr, pdev->mac_addr);
8578 ether_addr_copy(ar->mac_addr, ab->mac_addr);
8579 ar->mac_addr[4] += i;
8582 idr_init(&ar->txmgmt_idr);
8583 spin_lock_init(&ar->txmgmt_idr_lock);
8585 ret = __ath11k_mac_register(ar);
8589 init_waitqueue_head(&ar->txmgmt_empty_waitq);
8595 for (i = i - 1; i >= 0; i--) {
8596 pdev = &ab->pdevs[i];
8598 __ath11k_mac_unregister(ar);
8604 int ath11k_mac_allocate(struct ath11k_base *ab)
8606 struct ieee80211_hw *hw;
8608 struct ath11k_pdev *pdev;
8612 if (test_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags))
8615 for (i = 0; i < ab->num_radios; i++) {
8616 pdev = &ab->pdevs[i];
8617 hw = ieee80211_alloc_hw(sizeof(struct ath11k), &ath11k_ops);
8619 ath11k_warn(ab, "failed to allocate mac80211 hw device\n");
8629 ar->lmac_id = ath11k_hw_get_mac_from_pdev_id(&ab->hw_params, i);
8631 ar->wmi = &ab->wmi_ab.wmi[i];
8632 /* FIXME wmi[0] is already initialized during attach,
8633 * Should we do this again?
8635 ath11k_wmi_pdev_attach(ab, i);
8637 ar->cfg_tx_chainmask = pdev->cap.tx_chain_mask;
8638 ar->cfg_rx_chainmask = pdev->cap.rx_chain_mask;
8639 ar->num_tx_chains = get_num_chains(pdev->cap.tx_chain_mask);
8640 ar->num_rx_chains = get_num_chains(pdev->cap.rx_chain_mask);
8643 spin_lock_init(&ar->data_lock);
8644 INIT_LIST_HEAD(&ar->arvifs);
8645 INIT_LIST_HEAD(&ar->ppdu_stats_info);
8646 mutex_init(&ar->conf_mutex);
8647 init_completion(&ar->vdev_setup_done);
8648 init_completion(&ar->vdev_delete_done);
8649 init_completion(&ar->peer_assoc_done);
8650 init_completion(&ar->peer_delete_done);
8651 init_completion(&ar->install_key_done);
8652 init_completion(&ar->bss_survey_done);
8653 init_completion(&ar->scan.started);
8654 init_completion(&ar->scan.completed);
8655 init_completion(&ar->thermal.wmi_sync);
8657 INIT_DELAYED_WORK(&ar->scan.timeout, ath11k_scan_timeout_work);
8658 INIT_WORK(&ar->regd_update_work, ath11k_regd_update_work);
8660 INIT_WORK(&ar->wmi_mgmt_tx_work, ath11k_mgmt_over_wmi_tx_work);
8661 skb_queue_head_init(&ar->wmi_mgmt_tx_queue);
8663 clear_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags);
8665 ar->monitor_vdev_id = -1;
8666 clear_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags);
8667 ar->vdev_id_11d_scan = ATH11K_11D_INVALID_VDEV_ID;
8668 init_completion(&ar->finish_11d_scan);
8669 init_completion(&ar->finish_11d_ch_list);
8675 ath11k_mac_destroy(ab);
8680 void ath11k_mac_destroy(struct ath11k_base *ab)
8683 struct ath11k_pdev *pdev;
8686 for (i = 0; i < ab->num_radios; i++) {
8687 pdev = &ab->pdevs[i];
8692 ieee80211_free_hw(ar->hw);