1 // SPDX-License-Identifier: BSD-3-Clause-Clear
3 * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
4 * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
7 #include <net/mac80211.h>
8 #include <linux/etherdevice.h>
9 #include <linux/bitfield.h>
10 #include <linux/inetdevice.h>
11 #include <net/if_inet6.h>
23 #include "debugfs_sta.h"
27 #define CHAN2G(_channel, _freq, _flags) { \
28 .band = NL80211_BAND_2GHZ, \
29 .hw_value = (_channel), \
30 .center_freq = (_freq), \
32 .max_antenna_gain = 0, \
36 #define CHAN5G(_channel, _freq, _flags) { \
37 .band = NL80211_BAND_5GHZ, \
38 .hw_value = (_channel), \
39 .center_freq = (_freq), \
41 .max_antenna_gain = 0, \
45 #define CHAN6G(_channel, _freq, _flags) { \
46 .band = NL80211_BAND_6GHZ, \
47 .hw_value = (_channel), \
48 .center_freq = (_freq), \
50 .max_antenna_gain = 0, \
54 static const struct ieee80211_channel ath11k_2ghz_channels[] = {
71 static const struct ieee80211_channel ath11k_5ghz_channels[] = {
101 static const struct ieee80211_channel ath11k_6ghz_channels[] = {
127 CHAN6G(101, 6455, 0),
128 CHAN6G(105, 6475, 0),
129 CHAN6G(109, 6495, 0),
130 CHAN6G(113, 6515, 0),
131 CHAN6G(117, 6535, 0),
132 CHAN6G(121, 6555, 0),
133 CHAN6G(125, 6575, 0),
134 CHAN6G(129, 6595, 0),
135 CHAN6G(133, 6615, 0),
136 CHAN6G(137, 6635, 0),
137 CHAN6G(141, 6655, 0),
138 CHAN6G(145, 6675, 0),
139 CHAN6G(149, 6695, 0),
140 CHAN6G(153, 6715, 0),
141 CHAN6G(157, 6735, 0),
142 CHAN6G(161, 6755, 0),
143 CHAN6G(165, 6775, 0),
144 CHAN6G(169, 6795, 0),
145 CHAN6G(173, 6815, 0),
146 CHAN6G(177, 6835, 0),
147 CHAN6G(181, 6855, 0),
148 CHAN6G(185, 6875, 0),
149 CHAN6G(189, 6895, 0),
150 CHAN6G(193, 6915, 0),
151 CHAN6G(197, 6935, 0),
152 CHAN6G(201, 6955, 0),
153 CHAN6G(205, 6975, 0),
154 CHAN6G(209, 6995, 0),
155 CHAN6G(213, 7015, 0),
156 CHAN6G(217, 7035, 0),
157 CHAN6G(221, 7055, 0),
158 CHAN6G(225, 7075, 0),
159 CHAN6G(229, 7095, 0),
160 CHAN6G(233, 7115, 0),
162 /* new addition in IEEE Std 802.11ax-2021 */
166 static struct ieee80211_rate ath11k_legacy_rates[] = {
168 .hw_value = ATH11K_HW_RATE_CCK_LP_1M },
170 .hw_value = ATH11K_HW_RATE_CCK_LP_2M,
171 .hw_value_short = ATH11K_HW_RATE_CCK_SP_2M,
172 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
174 .hw_value = ATH11K_HW_RATE_CCK_LP_5_5M,
175 .hw_value_short = ATH11K_HW_RATE_CCK_SP_5_5M,
176 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
178 .hw_value = ATH11K_HW_RATE_CCK_LP_11M,
179 .hw_value_short = ATH11K_HW_RATE_CCK_SP_11M,
180 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
182 { .bitrate = 60, .hw_value = ATH11K_HW_RATE_OFDM_6M },
183 { .bitrate = 90, .hw_value = ATH11K_HW_RATE_OFDM_9M },
184 { .bitrate = 120, .hw_value = ATH11K_HW_RATE_OFDM_12M },
185 { .bitrate = 180, .hw_value = ATH11K_HW_RATE_OFDM_18M },
186 { .bitrate = 240, .hw_value = ATH11K_HW_RATE_OFDM_24M },
187 { .bitrate = 360, .hw_value = ATH11K_HW_RATE_OFDM_36M },
188 { .bitrate = 480, .hw_value = ATH11K_HW_RATE_OFDM_48M },
189 { .bitrate = 540, .hw_value = ATH11K_HW_RATE_OFDM_54M },
193 ath11k_phymodes[NUM_NL80211_BANDS][ATH11K_CHAN_WIDTH_NUM] = {
194 [NL80211_BAND_2GHZ] = {
195 [NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
196 [NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
197 [NL80211_CHAN_WIDTH_20_NOHT] = MODE_11AX_HE20_2G,
198 [NL80211_CHAN_WIDTH_20] = MODE_11AX_HE20_2G,
199 [NL80211_CHAN_WIDTH_40] = MODE_11AX_HE40_2G,
200 [NL80211_CHAN_WIDTH_80] = MODE_11AX_HE80_2G,
201 [NL80211_CHAN_WIDTH_80P80] = MODE_UNKNOWN,
202 [NL80211_CHAN_WIDTH_160] = MODE_UNKNOWN,
204 [NL80211_BAND_5GHZ] = {
205 [NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
206 [NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
207 [NL80211_CHAN_WIDTH_20_NOHT] = MODE_11AX_HE20,
208 [NL80211_CHAN_WIDTH_20] = MODE_11AX_HE20,
209 [NL80211_CHAN_WIDTH_40] = MODE_11AX_HE40,
210 [NL80211_CHAN_WIDTH_80] = MODE_11AX_HE80,
211 [NL80211_CHAN_WIDTH_160] = MODE_11AX_HE160,
212 [NL80211_CHAN_WIDTH_80P80] = MODE_11AX_HE80_80,
214 [NL80211_BAND_6GHZ] = {
215 [NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
216 [NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
217 [NL80211_CHAN_WIDTH_20_NOHT] = MODE_11AX_HE20,
218 [NL80211_CHAN_WIDTH_20] = MODE_11AX_HE20,
219 [NL80211_CHAN_WIDTH_40] = MODE_11AX_HE40,
220 [NL80211_CHAN_WIDTH_80] = MODE_11AX_HE80,
221 [NL80211_CHAN_WIDTH_160] = MODE_11AX_HE160,
222 [NL80211_CHAN_WIDTH_80P80] = MODE_11AX_HE80_80,
227 const struct htt_rx_ring_tlv_filter ath11k_mac_mon_status_filter_default = {
228 .rx_filter = HTT_RX_FILTER_TLV_FLAGS_MPDU_START |
229 HTT_RX_FILTER_TLV_FLAGS_PPDU_END |
230 HTT_RX_FILTER_TLV_FLAGS_PPDU_END_STATUS_DONE,
231 .pkt_filter_flags0 = HTT_RX_FP_MGMT_FILTER_FLAGS0,
232 .pkt_filter_flags1 = HTT_RX_FP_MGMT_FILTER_FLAGS1,
233 .pkt_filter_flags2 = HTT_RX_FP_CTRL_FILTER_FLASG2,
234 .pkt_filter_flags3 = HTT_RX_FP_DATA_FILTER_FLASG3 |
235 HTT_RX_FP_CTRL_FILTER_FLASG3
238 #define ATH11K_MAC_FIRST_OFDM_RATE_IDX 4
239 #define ath11k_g_rates ath11k_legacy_rates
240 #define ath11k_g_rates_size (ARRAY_SIZE(ath11k_legacy_rates))
241 #define ath11k_a_rates (ath11k_legacy_rates + 4)
242 #define ath11k_a_rates_size (ARRAY_SIZE(ath11k_legacy_rates) - 4)
244 #define ATH11K_MAC_SCAN_TIMEOUT_MSECS 200 /* in msecs */
246 static const u32 ath11k_smps_map[] = {
247 [WLAN_HT_CAP_SM_PS_STATIC] = WMI_PEER_SMPS_STATIC,
248 [WLAN_HT_CAP_SM_PS_DYNAMIC] = WMI_PEER_SMPS_DYNAMIC,
249 [WLAN_HT_CAP_SM_PS_INVALID] = WMI_PEER_SMPS_PS_NONE,
250 [WLAN_HT_CAP_SM_PS_DISABLED] = WMI_PEER_SMPS_PS_NONE,
253 static int ath11k_start_vdev_delay(struct ieee80211_hw *hw,
254 struct ieee80211_vif *vif);
256 enum nl80211_he_ru_alloc ath11k_mac_phy_he_ru_to_nl80211_he_ru_alloc(u16 ru_phy)
258 enum nl80211_he_ru_alloc ret;
262 ret = NL80211_RATE_INFO_HE_RU_ALLOC_26;
265 ret = NL80211_RATE_INFO_HE_RU_ALLOC_52;
268 ret = NL80211_RATE_INFO_HE_RU_ALLOC_106;
271 ret = NL80211_RATE_INFO_HE_RU_ALLOC_242;
274 ret = NL80211_RATE_INFO_HE_RU_ALLOC_484;
277 ret = NL80211_RATE_INFO_HE_RU_ALLOC_996;
280 ret = NL80211_RATE_INFO_HE_RU_ALLOC_26;
287 enum nl80211_he_ru_alloc ath11k_mac_he_ru_tones_to_nl80211_he_ru_alloc(u16 ru_tones)
289 enum nl80211_he_ru_alloc ret;
293 ret = NL80211_RATE_INFO_HE_RU_ALLOC_26;
296 ret = NL80211_RATE_INFO_HE_RU_ALLOC_52;
299 ret = NL80211_RATE_INFO_HE_RU_ALLOC_106;
302 ret = NL80211_RATE_INFO_HE_RU_ALLOC_242;
305 ret = NL80211_RATE_INFO_HE_RU_ALLOC_484;
308 ret = NL80211_RATE_INFO_HE_RU_ALLOC_996;
311 ret = NL80211_RATE_INFO_HE_RU_ALLOC_2x996;
314 ret = NL80211_RATE_INFO_HE_RU_ALLOC_26;
321 enum nl80211_he_gi ath11k_mac_he_gi_to_nl80211_he_gi(u8 sgi)
323 enum nl80211_he_gi ret;
326 case RX_MSDU_START_SGI_0_8_US:
327 ret = NL80211_RATE_INFO_HE_GI_0_8;
329 case RX_MSDU_START_SGI_1_6_US:
330 ret = NL80211_RATE_INFO_HE_GI_1_6;
332 case RX_MSDU_START_SGI_3_2_US:
333 ret = NL80211_RATE_INFO_HE_GI_3_2;
336 ret = NL80211_RATE_INFO_HE_GI_0_8;
343 u8 ath11k_mac_bw_to_mac80211_bw(u8 bw)
349 ret = RATE_INFO_BW_20;
352 ret = RATE_INFO_BW_40;
355 ret = RATE_INFO_BW_80;
358 ret = RATE_INFO_BW_160;
365 enum ath11k_supported_bw ath11k_mac_mac80211_bw_to_ath11k_bw(enum rate_info_bw bw)
368 case RATE_INFO_BW_20:
370 case RATE_INFO_BW_40:
372 case RATE_INFO_BW_80:
374 case RATE_INFO_BW_160:
375 return ATH11K_BW_160;
381 int ath11k_mac_hw_ratecode_to_legacy_rate(u8 hw_rc, u8 preamble, u8 *rateidx,
384 /* As default, it is OFDM rates */
385 int i = ATH11K_MAC_FIRST_OFDM_RATE_IDX;
386 int max_rates_idx = ath11k_g_rates_size;
388 if (preamble == WMI_RATE_PREAMBLE_CCK) {
389 hw_rc &= ~ATH11k_HW_RATECODE_CCK_SHORT_PREAM_MASK;
391 max_rates_idx = ATH11K_MAC_FIRST_OFDM_RATE_IDX;
394 while (i < max_rates_idx) {
395 if (hw_rc == ath11k_legacy_rates[i].hw_value) {
397 *rate = ath11k_legacy_rates[i].bitrate;
406 static int get_num_chains(u32 mask)
419 u8 ath11k_mac_bitrate_to_idx(const struct ieee80211_supported_band *sband,
424 for (i = 0; i < sband->n_bitrates; i++)
425 if (sband->bitrates[i].bitrate == bitrate)
432 ath11k_mac_max_ht_nss(const u8 ht_mcs_mask[IEEE80211_HT_MCS_MASK_LEN])
436 for (nss = IEEE80211_HT_MCS_MASK_LEN - 1; nss >= 0; nss--)
437 if (ht_mcs_mask[nss])
444 ath11k_mac_max_vht_nss(const u16 vht_mcs_mask[NL80211_VHT_NSS_MAX])
448 for (nss = NL80211_VHT_NSS_MAX - 1; nss >= 0; nss--)
449 if (vht_mcs_mask[nss])
456 ath11k_mac_max_he_nss(const u16 he_mcs_mask[NL80211_HE_NSS_MAX])
460 for (nss = NL80211_HE_NSS_MAX - 1; nss >= 0; nss--)
461 if (he_mcs_mask[nss])
467 static u8 ath11k_parse_mpdudensity(u8 mpdudensity)
469 /* 802.11n D2.0 defined values for "Minimum MPDU Start Spacing":
470 * 0 for no restriction
479 switch (mpdudensity) {
485 /* Our lower layer calculations limit our precision to
502 static int ath11k_mac_vif_chan(struct ieee80211_vif *vif,
503 struct cfg80211_chan_def *def)
505 struct ieee80211_chanctx_conf *conf;
508 conf = rcu_dereference(vif->bss_conf.chanctx_conf);
520 static bool ath11k_mac_bitrate_is_cck(int bitrate)
533 u8 ath11k_mac_hw_rate_to_idx(const struct ieee80211_supported_band *sband,
534 u8 hw_rate, bool cck)
536 const struct ieee80211_rate *rate;
539 for (i = 0; i < sband->n_bitrates; i++) {
540 rate = &sband->bitrates[i];
542 if (ath11k_mac_bitrate_is_cck(rate->bitrate) != cck)
545 if (rate->hw_value == hw_rate)
547 else if (rate->flags & IEEE80211_RATE_SHORT_PREAMBLE &&
548 rate->hw_value_short == hw_rate)
555 static u8 ath11k_mac_bitrate_to_rate(int bitrate)
557 return DIV_ROUND_UP(bitrate, 5) |
558 (ath11k_mac_bitrate_is_cck(bitrate) ? BIT(7) : 0);
561 static void ath11k_get_arvif_iter(void *data, u8 *mac,
562 struct ieee80211_vif *vif)
564 struct ath11k_vif_iter *arvif_iter = data;
565 struct ath11k_vif *arvif = (void *)vif->drv_priv;
567 if (arvif->vdev_id == arvif_iter->vdev_id)
568 arvif_iter->arvif = arvif;
571 struct ath11k_vif *ath11k_mac_get_arvif(struct ath11k *ar, u32 vdev_id)
573 struct ath11k_vif_iter arvif_iter;
576 memset(&arvif_iter, 0, sizeof(struct ath11k_vif_iter));
577 arvif_iter.vdev_id = vdev_id;
579 flags = IEEE80211_IFACE_ITER_RESUME_ALL;
580 ieee80211_iterate_active_interfaces_atomic(ar->hw,
582 ath11k_get_arvif_iter,
584 if (!arvif_iter.arvif) {
585 ath11k_warn(ar->ab, "No VIF found for vdev %d\n", vdev_id);
589 return arvif_iter.arvif;
592 struct ath11k_vif *ath11k_mac_get_arvif_by_vdev_id(struct ath11k_base *ab,
596 struct ath11k_pdev *pdev;
597 struct ath11k_vif *arvif;
599 for (i = 0; i < ab->num_radios; i++) {
600 pdev = rcu_dereference(ab->pdevs_active[i]);
601 if (pdev && pdev->ar &&
602 (pdev->ar->allocated_vdev_map & (1LL << vdev_id))) {
603 arvif = ath11k_mac_get_arvif(pdev->ar, vdev_id);
612 struct ath11k *ath11k_mac_get_ar_by_vdev_id(struct ath11k_base *ab, u32 vdev_id)
615 struct ath11k_pdev *pdev;
617 for (i = 0; i < ab->num_radios; i++) {
618 pdev = rcu_dereference(ab->pdevs_active[i]);
619 if (pdev && pdev->ar) {
620 if (pdev->ar->allocated_vdev_map & (1LL << vdev_id))
628 struct ath11k *ath11k_mac_get_ar_by_pdev_id(struct ath11k_base *ab, u32 pdev_id)
631 struct ath11k_pdev *pdev;
633 if (ab->hw_params.single_pdev_only) {
634 pdev = rcu_dereference(ab->pdevs_active[0]);
635 return pdev ? pdev->ar : NULL;
638 if (WARN_ON(pdev_id > ab->num_radios))
641 for (i = 0; i < ab->num_radios; i++) {
642 pdev = rcu_dereference(ab->pdevs_active[i]);
644 if (pdev && pdev->pdev_id == pdev_id)
645 return (pdev->ar ? pdev->ar : NULL);
651 struct ath11k_vif *ath11k_mac_get_vif_up(struct ath11k_base *ab)
654 struct ath11k_pdev *pdev;
655 struct ath11k_vif *arvif;
658 for (i = 0; i < ab->num_radios; i++) {
659 pdev = &ab->pdevs[i];
661 list_for_each_entry(arvif, &ar->arvifs, list) {
670 static bool ath11k_mac_band_match(enum nl80211_band band1, enum WMI_HOST_WLAN_BAND band2)
672 return (((band1 == NL80211_BAND_2GHZ) && (band2 & WMI_HOST_WLAN_2G_CAP)) ||
673 (((band1 == NL80211_BAND_5GHZ) || (band1 == NL80211_BAND_6GHZ)) &&
674 (band2 & WMI_HOST_WLAN_5G_CAP)));
677 u8 ath11k_mac_get_target_pdev_id_from_vif(struct ath11k_vif *arvif)
679 struct ath11k *ar = arvif->ar;
680 struct ath11k_base *ab = ar->ab;
681 struct ieee80211_vif *vif = arvif->vif;
682 struct cfg80211_chan_def def;
683 enum nl80211_band band;
684 u8 pdev_id = ab->target_pdev_ids[0].pdev_id;
687 if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
690 band = def.chan->band;
692 for (i = 0; i < ab->target_pdev_count; i++) {
693 if (ath11k_mac_band_match(band, ab->target_pdev_ids[i].supported_bands))
694 return ab->target_pdev_ids[i].pdev_id;
700 u8 ath11k_mac_get_target_pdev_id(struct ath11k *ar)
702 struct ath11k_vif *arvif;
704 arvif = ath11k_mac_get_vif_up(ar->ab);
707 return ath11k_mac_get_target_pdev_id_from_vif(arvif);
709 return ar->ab->target_pdev_ids[0].pdev_id;
712 static void ath11k_pdev_caps_update(struct ath11k *ar)
714 struct ath11k_base *ab = ar->ab;
716 ar->max_tx_power = ab->target_caps.hw_max_tx_power;
718 /* FIXME Set min_tx_power to ab->target_caps.hw_min_tx_power.
719 * But since the received value in svcrdy is same as hw_max_tx_power,
720 * we can set ar->min_tx_power to 0 currently until
721 * this is fixed in firmware
723 ar->min_tx_power = 0;
725 ar->txpower_limit_2g = ar->max_tx_power;
726 ar->txpower_limit_5g = ar->max_tx_power;
727 ar->txpower_scale = WMI_HOST_TP_SCALE_MAX;
730 static int ath11k_mac_txpower_recalc(struct ath11k *ar)
732 struct ath11k_pdev *pdev = ar->pdev;
733 struct ath11k_vif *arvif;
734 int ret, txpower = -1;
737 lockdep_assert_held(&ar->conf_mutex);
739 list_for_each_entry(arvif, &ar->arvifs, list) {
740 if (arvif->txpower <= 0)
744 txpower = arvif->txpower;
746 txpower = min(txpower, arvif->txpower);
752 /* txpwr is set as 2 units per dBm in FW*/
753 txpower = min_t(u32, max_t(u32, ar->min_tx_power, txpower),
754 ar->max_tx_power) * 2;
756 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "txpower to set in hw %d\n",
759 if ((pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) &&
760 ar->txpower_limit_2g != txpower) {
761 param = WMI_PDEV_PARAM_TXPOWER_LIMIT2G;
762 ret = ath11k_wmi_pdev_set_param(ar, param,
763 txpower, ar->pdev->pdev_id);
766 ar->txpower_limit_2g = txpower;
769 if ((pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) &&
770 ar->txpower_limit_5g != txpower) {
771 param = WMI_PDEV_PARAM_TXPOWER_LIMIT5G;
772 ret = ath11k_wmi_pdev_set_param(ar, param,
773 txpower, ar->pdev->pdev_id);
776 ar->txpower_limit_5g = txpower;
782 ath11k_warn(ar->ab, "failed to recalc txpower limit %d using pdev param %d: %d\n",
783 txpower / 2, param, ret);
787 static int ath11k_recalc_rtscts_prot(struct ath11k_vif *arvif)
789 struct ath11k *ar = arvif->ar;
790 u32 vdev_param, rts_cts = 0;
793 lockdep_assert_held(&ar->conf_mutex);
795 vdev_param = WMI_VDEV_PARAM_ENABLE_RTSCTS;
797 /* Enable RTS/CTS protection for sw retries (when legacy stations
798 * are in BSS) or by default only for second rate series.
799 * TODO: Check if we need to enable CTS 2 Self in any case
801 rts_cts = WMI_USE_RTS_CTS;
803 if (arvif->num_legacy_stations > 0)
804 rts_cts |= WMI_RTSCTS_ACROSS_SW_RETRIES << 4;
806 rts_cts |= WMI_RTSCTS_FOR_SECOND_RATESERIES << 4;
808 /* Need not send duplicate param value to firmware */
809 if (arvif->rtscts_prot_mode == rts_cts)
812 arvif->rtscts_prot_mode = rts_cts;
814 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac vdev %d recalc rts/cts prot %d\n",
815 arvif->vdev_id, rts_cts);
817 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
818 vdev_param, rts_cts);
820 ath11k_warn(ar->ab, "failed to recalculate rts/cts prot for vdev %d: %d\n",
821 arvif->vdev_id, ret);
826 static int ath11k_mac_set_kickout(struct ath11k_vif *arvif)
828 struct ath11k *ar = arvif->ar;
832 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_STA_KICKOUT_TH,
833 ATH11K_KICKOUT_THRESHOLD,
836 ath11k_warn(ar->ab, "failed to set kickout threshold on vdev %i: %d\n",
837 arvif->vdev_id, ret);
841 param = WMI_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS;
842 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param,
843 ATH11K_KEEPALIVE_MIN_IDLE);
845 ath11k_warn(ar->ab, "failed to set keepalive minimum idle time on vdev %i: %d\n",
846 arvif->vdev_id, ret);
850 param = WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS;
851 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param,
852 ATH11K_KEEPALIVE_MAX_IDLE);
854 ath11k_warn(ar->ab, "failed to set keepalive maximum idle time on vdev %i: %d\n",
855 arvif->vdev_id, ret);
859 param = WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS;
860 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param,
861 ATH11K_KEEPALIVE_MAX_UNRESPONSIVE);
863 ath11k_warn(ar->ab, "failed to set keepalive maximum unresponsive time on vdev %i: %d\n",
864 arvif->vdev_id, ret);
871 void ath11k_mac_peer_cleanup_all(struct ath11k *ar)
873 struct ath11k_peer *peer, *tmp;
874 struct ath11k_base *ab = ar->ab;
876 lockdep_assert_held(&ar->conf_mutex);
878 mutex_lock(&ab->tbl_mtx_lock);
879 spin_lock_bh(&ab->base_lock);
880 list_for_each_entry_safe(peer, tmp, &ab->peers, list) {
881 ath11k_peer_rx_tid_cleanup(ar, peer);
882 ath11k_peer_rhash_delete(ab, peer);
883 list_del(&peer->list);
886 spin_unlock_bh(&ab->base_lock);
887 mutex_unlock(&ab->tbl_mtx_lock);
890 ar->num_stations = 0;
893 static inline int ath11k_mac_vdev_setup_sync(struct ath11k *ar)
895 lockdep_assert_held(&ar->conf_mutex);
897 if (test_bit(ATH11K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags))
900 if (!wait_for_completion_timeout(&ar->vdev_setup_done,
901 ATH11K_VDEV_SETUP_TIMEOUT_HZ))
904 return ar->last_wmi_vdev_start_status ? -EINVAL : 0;
908 ath11k_mac_get_any_chandef_iter(struct ieee80211_hw *hw,
909 struct ieee80211_chanctx_conf *conf,
912 struct cfg80211_chan_def **def = data;
917 static int ath11k_mac_monitor_vdev_start(struct ath11k *ar, int vdev_id,
918 struct cfg80211_chan_def *chandef)
920 struct ieee80211_channel *channel;
921 struct wmi_vdev_start_req_arg arg = {};
924 lockdep_assert_held(&ar->conf_mutex);
926 channel = chandef->chan;
928 arg.vdev_id = vdev_id;
929 arg.channel.freq = channel->center_freq;
930 arg.channel.band_center_freq1 = chandef->center_freq1;
931 arg.channel.band_center_freq2 = chandef->center_freq2;
933 arg.channel.mode = ath11k_phymodes[chandef->chan->band][chandef->width];
934 arg.channel.chan_radar = !!(channel->flags & IEEE80211_CHAN_RADAR);
936 arg.channel.min_power = 0;
937 arg.channel.max_power = channel->max_power;
938 arg.channel.max_reg_power = channel->max_reg_power;
939 arg.channel.max_antenna_gain = channel->max_antenna_gain;
941 arg.pref_tx_streams = ar->num_tx_chains;
942 arg.pref_rx_streams = ar->num_rx_chains;
944 arg.channel.passive = !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR);
946 reinit_completion(&ar->vdev_setup_done);
947 reinit_completion(&ar->vdev_delete_done);
949 ret = ath11k_wmi_vdev_start(ar, &arg, false);
951 ath11k_warn(ar->ab, "failed to request monitor vdev %i start: %d\n",
956 ret = ath11k_mac_vdev_setup_sync(ar);
958 ath11k_warn(ar->ab, "failed to synchronize setup for monitor vdev %i start: %d\n",
963 ret = ath11k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr);
965 ath11k_warn(ar->ab, "failed to put up monitor vdev %i: %d\n",
970 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac monitor vdev %i started\n",
976 reinit_completion(&ar->vdev_setup_done);
978 ret = ath11k_wmi_vdev_stop(ar, vdev_id);
980 ath11k_warn(ar->ab, "failed to stop monitor vdev %i after start failure: %d\n",
985 ret = ath11k_mac_vdev_setup_sync(ar);
987 ath11k_warn(ar->ab, "failed to synchronize setup for vdev %i stop: %d\n",
995 static int ath11k_mac_monitor_vdev_stop(struct ath11k *ar)
999 lockdep_assert_held(&ar->conf_mutex);
1001 reinit_completion(&ar->vdev_setup_done);
1003 ret = ath11k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
1005 ath11k_warn(ar->ab, "failed to request monitor vdev %i stop: %d\n",
1006 ar->monitor_vdev_id, ret);
1010 ret = ath11k_mac_vdev_setup_sync(ar);
1012 ath11k_warn(ar->ab, "failed to synchronize monitor vdev %i stop: %d\n",
1013 ar->monitor_vdev_id, ret);
1017 ret = ath11k_wmi_vdev_down(ar, ar->monitor_vdev_id);
1019 ath11k_warn(ar->ab, "failed to put down monitor vdev %i: %d\n",
1020 ar->monitor_vdev_id, ret);
1024 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac monitor vdev %i stopped\n",
1025 ar->monitor_vdev_id);
1030 static int ath11k_mac_monitor_vdev_create(struct ath11k *ar)
1032 struct ath11k_pdev *pdev = ar->pdev;
1033 struct vdev_create_params param = {};
1035 u8 tmp_addr[6] = {0};
1038 lockdep_assert_held(&ar->conf_mutex);
1040 if (test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags))
1043 if (ar->ab->free_vdev_map == 0) {
1044 ath11k_warn(ar->ab, "failed to find free vdev id for monitor vdev\n");
1048 bit = __ffs64(ar->ab->free_vdev_map);
1050 ar->monitor_vdev_id = bit;
1052 param.if_id = ar->monitor_vdev_id;
1053 param.type = WMI_VDEV_TYPE_MONITOR;
1054 param.subtype = WMI_VDEV_SUBTYPE_NONE;
1055 param.pdev_id = pdev->pdev_id;
1057 if (pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) {
1058 param.chains[NL80211_BAND_2GHZ].tx = ar->num_tx_chains;
1059 param.chains[NL80211_BAND_2GHZ].rx = ar->num_rx_chains;
1061 if (pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) {
1062 param.chains[NL80211_BAND_5GHZ].tx = ar->num_tx_chains;
1063 param.chains[NL80211_BAND_5GHZ].rx = ar->num_rx_chains;
1066 ret = ath11k_wmi_vdev_create(ar, tmp_addr, ¶m);
1068 ath11k_warn(ar->ab, "failed to request monitor vdev %i creation: %d\n",
1069 ar->monitor_vdev_id, ret);
1070 ar->monitor_vdev_id = -1;
1074 nss = get_num_chains(ar->cfg_tx_chainmask) ? : 1;
1075 ret = ath11k_wmi_vdev_set_param_cmd(ar, ar->monitor_vdev_id,
1076 WMI_VDEV_PARAM_NSS, nss);
1078 ath11k_warn(ar->ab, "failed to set vdev %d chainmask 0x%x, nss %d :%d\n",
1079 ar->monitor_vdev_id, ar->cfg_tx_chainmask, nss, ret);
1083 ret = ath11k_mac_txpower_recalc(ar);
1085 ath11k_warn(ar->ab, "failed to recalc txpower for monitor vdev %d: %d\n",
1086 ar->monitor_vdev_id, ret);
1090 ar->allocated_vdev_map |= 1LL << ar->monitor_vdev_id;
1091 ar->ab->free_vdev_map &= ~(1LL << ar->monitor_vdev_id);
1092 ar->num_created_vdevs++;
1093 set_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags);
1095 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac monitor vdev %d created\n",
1096 ar->monitor_vdev_id);
1101 ath11k_wmi_vdev_delete(ar, ar->monitor_vdev_id);
1102 ar->monitor_vdev_id = -1;
1106 static int ath11k_mac_monitor_vdev_delete(struct ath11k *ar)
1109 unsigned long time_left;
1111 lockdep_assert_held(&ar->conf_mutex);
1113 if (!test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags))
1116 reinit_completion(&ar->vdev_delete_done);
1118 ret = ath11k_wmi_vdev_delete(ar, ar->monitor_vdev_id);
1120 ath11k_warn(ar->ab, "failed to request wmi monitor vdev %i removal: %d\n",
1121 ar->monitor_vdev_id, ret);
1125 time_left = wait_for_completion_timeout(&ar->vdev_delete_done,
1126 ATH11K_VDEV_DELETE_TIMEOUT_HZ);
1127 if (time_left == 0) {
1128 ath11k_warn(ar->ab, "Timeout in receiving vdev delete response\n");
1130 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac monitor vdev %d deleted\n",
1131 ar->monitor_vdev_id);
1133 ar->allocated_vdev_map &= ~(1LL << ar->monitor_vdev_id);
1134 ar->ab->free_vdev_map |= 1LL << (ar->monitor_vdev_id);
1135 ar->num_created_vdevs--;
1136 ar->monitor_vdev_id = -1;
1137 clear_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags);
1143 static int ath11k_mac_monitor_start(struct ath11k *ar)
1145 struct cfg80211_chan_def *chandef = NULL;
1148 lockdep_assert_held(&ar->conf_mutex);
1150 if (test_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags))
1153 ieee80211_iter_chan_contexts_atomic(ar->hw,
1154 ath11k_mac_get_any_chandef_iter,
1159 ret = ath11k_mac_monitor_vdev_start(ar, ar->monitor_vdev_id, chandef);
1161 ath11k_warn(ar->ab, "failed to start monitor vdev: %d\n", ret);
1162 ath11k_mac_monitor_vdev_delete(ar);
1166 set_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags);
1168 ar->num_started_vdevs++;
1169 ret = ath11k_dp_tx_htt_monitor_mode_ring_config(ar, false);
1171 ath11k_warn(ar->ab, "failed to configure htt monitor mode ring during start: %d",
1176 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac monitor started\n");
1181 static int ath11k_mac_monitor_stop(struct ath11k *ar)
1185 lockdep_assert_held(&ar->conf_mutex);
1187 if (!test_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags))
1190 ret = ath11k_mac_monitor_vdev_stop(ar);
1192 ath11k_warn(ar->ab, "failed to stop monitor vdev: %d\n", ret);
1196 clear_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags);
1197 ar->num_started_vdevs--;
1199 ret = ath11k_dp_tx_htt_monitor_mode_ring_config(ar, true);
1201 ath11k_warn(ar->ab, "failed to configure htt monitor mode ring during stop: %d",
1206 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac monitor stopped ret %d\n", ret);
1211 static int ath11k_mac_vif_setup_ps(struct ath11k_vif *arvif)
1213 struct ath11k *ar = arvif->ar;
1214 struct ieee80211_vif *vif = arvif->vif;
1215 struct ieee80211_conf *conf = &ar->hw->conf;
1216 enum wmi_sta_powersave_param param;
1217 enum wmi_sta_ps_mode psmode;
1222 lockdep_assert_held(&arvif->ar->conf_mutex);
1224 if (arvif->vif->type != NL80211_IFTYPE_STATION)
1227 enable_ps = arvif->ps;
1229 if (!arvif->is_started) {
1230 /* mac80211 can update vif powersave state while disconnected.
1231 * Firmware doesn't behave nicely and consumes more power than
1232 * necessary if PS is disabled on a non-started vdev. Hence
1233 * force-enable PS for non-running vdevs.
1235 psmode = WMI_STA_PS_MODE_ENABLED;
1236 } else if (enable_ps) {
1237 psmode = WMI_STA_PS_MODE_ENABLED;
1238 param = WMI_STA_PS_PARAM_INACTIVITY_TIME;
1240 timeout = conf->dynamic_ps_timeout;
1242 /* firmware doesn't like 0 */
1243 timeout = ieee80211_tu_to_usec(vif->bss_conf.beacon_int) / 1000;
1246 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param,
1249 ath11k_warn(ar->ab, "failed to set inactivity time for vdev %d: %i\n",
1250 arvif->vdev_id, ret);
1254 psmode = WMI_STA_PS_MODE_DISABLED;
1257 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac vdev %d psmode %s\n",
1258 arvif->vdev_id, psmode ? "enable" : "disable");
1260 ret = ath11k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id, psmode);
1262 ath11k_warn(ar->ab, "failed to set sta power save mode %d for vdev %d: %d\n",
1263 psmode, arvif->vdev_id, ret);
1270 static int ath11k_mac_config_ps(struct ath11k *ar)
1272 struct ath11k_vif *arvif;
1275 lockdep_assert_held(&ar->conf_mutex);
1277 list_for_each_entry(arvif, &ar->arvifs, list) {
1278 ret = ath11k_mac_vif_setup_ps(arvif);
1280 ath11k_warn(ar->ab, "failed to setup powersave: %d\n", ret);
1288 static int ath11k_mac_op_config(struct ieee80211_hw *hw, u32 changed)
1290 struct ath11k *ar = hw->priv;
1291 struct ieee80211_conf *conf = &hw->conf;
1294 mutex_lock(&ar->conf_mutex);
1296 if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
1297 if (conf->flags & IEEE80211_CONF_MONITOR) {
1298 set_bit(ATH11K_FLAG_MONITOR_CONF_ENABLED, &ar->monitor_flags);
1300 if (test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED,
1301 &ar->monitor_flags))
1304 ret = ath11k_mac_monitor_vdev_create(ar);
1306 ath11k_warn(ar->ab, "failed to create monitor vdev: %d",
1311 ret = ath11k_mac_monitor_start(ar);
1313 ath11k_warn(ar->ab, "failed to start monitor: %d",
1318 clear_bit(ATH11K_FLAG_MONITOR_CONF_ENABLED, &ar->monitor_flags);
1320 if (!test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED,
1321 &ar->monitor_flags))
1324 ret = ath11k_mac_monitor_stop(ar);
1326 ath11k_warn(ar->ab, "failed to stop monitor: %d",
1331 ret = ath11k_mac_monitor_vdev_delete(ar);
1333 ath11k_warn(ar->ab, "failed to delete monitor vdev: %d",
1341 mutex_unlock(&ar->conf_mutex);
1345 ath11k_mac_monitor_vdev_delete(ar);
1346 mutex_unlock(&ar->conf_mutex);
1350 static int ath11k_mac_setup_bcn_tmpl(struct ath11k_vif *arvif)
1352 struct ath11k *ar = arvif->ar;
1353 struct ath11k_base *ab = ar->ab;
1354 struct ieee80211_hw *hw = ar->hw;
1355 struct ieee80211_vif *vif = arvif->vif;
1356 struct ieee80211_mutable_offsets offs = {};
1357 struct sk_buff *bcn;
1358 struct ieee80211_mgmt *mgmt;
1362 if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
1365 bcn = ieee80211_beacon_get_template(hw, vif, &offs, 0);
1367 ath11k_warn(ab, "failed to get beacon template from mac80211\n");
1371 ies = bcn->data + ieee80211_get_hdrlen_from_skb(bcn);
1372 ies += sizeof(mgmt->u.beacon);
1374 if (cfg80211_find_ie(WLAN_EID_RSN, ies, (skb_tail_pointer(bcn) - ies)))
1375 arvif->rsnie_present = true;
1377 arvif->rsnie_present = false;
1379 if (cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
1380 WLAN_OUI_TYPE_MICROSOFT_WPA,
1381 ies, (skb_tail_pointer(bcn) - ies)))
1382 arvif->wpaie_present = true;
1384 arvif->wpaie_present = false;
1386 ret = ath11k_wmi_bcn_tmpl(ar, arvif->vdev_id, &offs, bcn);
1391 ath11k_warn(ab, "failed to submit beacon template command: %d\n",
1397 void ath11k_mac_bcn_tx_event(struct ath11k_vif *arvif)
1399 struct ieee80211_vif *vif = arvif->vif;
1401 if (!vif->bss_conf.color_change_active && !arvif->bcca_zero_sent)
1404 if (vif->bss_conf.color_change_active && ieee80211_beacon_cntdwn_is_complete(vif)) {
1405 arvif->bcca_zero_sent = true;
1406 ieee80211_color_change_finish(vif);
1410 arvif->bcca_zero_sent = false;
1412 if (vif->bss_conf.color_change_active)
1413 ieee80211_beacon_update_cntdwn(vif);
1414 ath11k_mac_setup_bcn_tmpl(arvif);
1417 static void ath11k_control_beaconing(struct ath11k_vif *arvif,
1418 struct ieee80211_bss_conf *info)
1420 struct ath11k *ar = arvif->ar;
1423 lockdep_assert_held(&arvif->ar->conf_mutex);
1425 if (!info->enable_beacon) {
1426 ret = ath11k_wmi_vdev_down(ar, arvif->vdev_id);
1428 ath11k_warn(ar->ab, "failed to down vdev_id %i: %d\n",
1429 arvif->vdev_id, ret);
1431 arvif->is_up = false;
1435 /* Install the beacon template to the FW */
1436 ret = ath11k_mac_setup_bcn_tmpl(arvif);
1438 ath11k_warn(ar->ab, "failed to update bcn tmpl during vdev up: %d\n",
1443 arvif->tx_seq_no = 0x1000;
1447 ether_addr_copy(arvif->bssid, info->bssid);
1449 ret = ath11k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
1452 ath11k_warn(ar->ab, "failed to bring up vdev %d: %i\n",
1453 arvif->vdev_id, ret);
1457 arvif->is_up = true;
1459 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac vdev %d up\n", arvif->vdev_id);
1462 static void ath11k_mac_handle_beacon_iter(void *data, u8 *mac,
1463 struct ieee80211_vif *vif)
1465 struct sk_buff *skb = data;
1466 struct ieee80211_mgmt *mgmt = (void *)skb->data;
1467 struct ath11k_vif *arvif = (void *)vif->drv_priv;
1469 if (vif->type != NL80211_IFTYPE_STATION)
1472 if (!ether_addr_equal(mgmt->bssid, vif->bss_conf.bssid))
1475 cancel_delayed_work(&arvif->connection_loss_work);
1478 void ath11k_mac_handle_beacon(struct ath11k *ar, struct sk_buff *skb)
1480 ieee80211_iterate_active_interfaces_atomic(ar->hw,
1481 IEEE80211_IFACE_ITER_NORMAL,
1482 ath11k_mac_handle_beacon_iter,
1486 static void ath11k_mac_handle_beacon_miss_iter(void *data, u8 *mac,
1487 struct ieee80211_vif *vif)
1489 u32 *vdev_id = data;
1490 struct ath11k_vif *arvif = (void *)vif->drv_priv;
1491 struct ath11k *ar = arvif->ar;
1492 struct ieee80211_hw *hw = ar->hw;
1494 if (arvif->vdev_id != *vdev_id)
1500 ieee80211_beacon_loss(vif);
1502 /* Firmware doesn't report beacon loss events repeatedly. If AP probe
1503 * (done by mac80211) succeeds but beacons do not resume then it
1504 * doesn't make sense to continue operation. Queue connection loss work
1505 * which can be cancelled when beacon is received.
1507 ieee80211_queue_delayed_work(hw, &arvif->connection_loss_work,
1508 ATH11K_CONNECTION_LOSS_HZ);
1511 void ath11k_mac_handle_beacon_miss(struct ath11k *ar, u32 vdev_id)
1513 ieee80211_iterate_active_interfaces_atomic(ar->hw,
1514 IEEE80211_IFACE_ITER_NORMAL,
1515 ath11k_mac_handle_beacon_miss_iter,
1519 static void ath11k_mac_vif_sta_connection_loss_work(struct work_struct *work)
1521 struct ath11k_vif *arvif = container_of(work, struct ath11k_vif,
1522 connection_loss_work.work);
1523 struct ieee80211_vif *vif = arvif->vif;
1528 ieee80211_connection_loss(vif);
1531 static void ath11k_peer_assoc_h_basic(struct ath11k *ar,
1532 struct ieee80211_vif *vif,
1533 struct ieee80211_sta *sta,
1534 struct peer_assoc_params *arg)
1536 struct ath11k_vif *arvif = (void *)vif->drv_priv;
1539 lockdep_assert_held(&ar->conf_mutex);
1541 if (vif->type == NL80211_IFTYPE_STATION)
1546 ether_addr_copy(arg->peer_mac, sta->addr);
1547 arg->vdev_id = arvif->vdev_id;
1548 arg->peer_associd = aid;
1549 arg->auth_flag = true;
1550 /* TODO: STA WAR in ath10k for listen interval required? */
1551 arg->peer_listen_intval = ar->hw->conf.listen_interval;
1553 arg->peer_caps = vif->bss_conf.assoc_capability;
1556 static void ath11k_peer_assoc_h_crypto(struct ath11k *ar,
1557 struct ieee80211_vif *vif,
1558 struct ieee80211_sta *sta,
1559 struct peer_assoc_params *arg)
1561 struct ieee80211_bss_conf *info = &vif->bss_conf;
1562 struct cfg80211_chan_def def;
1563 struct cfg80211_bss *bss;
1564 struct ath11k_vif *arvif = (struct ath11k_vif *)vif->drv_priv;
1565 const u8 *rsnie = NULL;
1566 const u8 *wpaie = NULL;
1568 lockdep_assert_held(&ar->conf_mutex);
1570 if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
1573 bss = cfg80211_get_bss(ar->hw->wiphy, def.chan, info->bssid, NULL, 0,
1574 IEEE80211_BSS_TYPE_ANY, IEEE80211_PRIVACY_ANY);
1576 if (arvif->rsnie_present || arvif->wpaie_present) {
1577 arg->need_ptk_4_way = true;
1578 if (arvif->wpaie_present)
1579 arg->need_gtk_2_way = true;
1581 const struct cfg80211_bss_ies *ies;
1584 rsnie = ieee80211_bss_get_ie(bss, WLAN_EID_RSN);
1586 ies = rcu_dereference(bss->ies);
1588 wpaie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
1589 WLAN_OUI_TYPE_MICROSOFT_WPA,
1593 cfg80211_put_bss(ar->hw->wiphy, bss);
1596 /* FIXME: base on RSN IE/WPA IE is a correct idea? */
1597 if (rsnie || wpaie) {
1598 ath11k_dbg(ar->ab, ATH11K_DBG_WMI,
1599 "%s: rsn ie found\n", __func__);
1600 arg->need_ptk_4_way = true;
1604 ath11k_dbg(ar->ab, ATH11K_DBG_WMI,
1605 "%s: wpa ie found\n", __func__);
1606 arg->need_gtk_2_way = true;
1610 /* TODO: Need to check if FW supports PMF? */
1611 arg->is_pmf_enabled = true;
1614 /* TODO: safe_mode_enabled (bypass 4-way handshake) flag req? */
1617 static void ath11k_peer_assoc_h_rates(struct ath11k *ar,
1618 struct ieee80211_vif *vif,
1619 struct ieee80211_sta *sta,
1620 struct peer_assoc_params *arg)
1622 struct ath11k_vif *arvif = (void *)vif->drv_priv;
1623 struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates;
1624 struct cfg80211_chan_def def;
1625 const struct ieee80211_supported_band *sband;
1626 const struct ieee80211_rate *rates;
1627 enum nl80211_band band;
1632 lockdep_assert_held(&ar->conf_mutex);
1634 if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
1637 band = def.chan->band;
1638 sband = ar->hw->wiphy->bands[band];
1639 ratemask = sta->deflink.supp_rates[band];
1640 ratemask &= arvif->bitrate_mask.control[band].legacy;
1641 rates = sband->bitrates;
1643 rateset->num_rates = 0;
1645 for (i = 0; i < 32; i++, ratemask >>= 1, rates++) {
1646 if (!(ratemask & 1))
1649 rate = ath11k_mac_bitrate_to_rate(rates->bitrate);
1650 rateset->rates[rateset->num_rates] = rate;
1651 rateset->num_rates++;
1656 ath11k_peer_assoc_h_ht_masked(const u8 ht_mcs_mask[IEEE80211_HT_MCS_MASK_LEN])
1660 for (nss = 0; nss < IEEE80211_HT_MCS_MASK_LEN; nss++)
1661 if (ht_mcs_mask[nss])
1668 ath11k_peer_assoc_h_vht_masked(const u16 vht_mcs_mask[])
1672 for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++)
1673 if (vht_mcs_mask[nss])
1679 static void ath11k_peer_assoc_h_ht(struct ath11k *ar,
1680 struct ieee80211_vif *vif,
1681 struct ieee80211_sta *sta,
1682 struct peer_assoc_params *arg)
1684 const struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
1685 struct ath11k_vif *arvif = (void *)vif->drv_priv;
1686 struct cfg80211_chan_def def;
1687 enum nl80211_band band;
1688 const u8 *ht_mcs_mask;
1693 lockdep_assert_held(&ar->conf_mutex);
1695 if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
1698 if (!ht_cap->ht_supported)
1701 band = def.chan->band;
1702 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
1704 if (ath11k_peer_assoc_h_ht_masked(ht_mcs_mask))
1707 arg->ht_flag = true;
1709 arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
1710 ht_cap->ampdu_factor)) - 1;
1712 arg->peer_mpdu_density =
1713 ath11k_parse_mpdudensity(ht_cap->ampdu_density);
1715 arg->peer_ht_caps = ht_cap->cap;
1716 arg->peer_rate_caps |= WMI_HOST_RC_HT_FLAG;
1718 if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING)
1719 arg->ldpc_flag = true;
1721 if (sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40) {
1723 arg->peer_rate_caps |= WMI_HOST_RC_CW40_FLAG;
1726 /* As firmware handles this two flags (IEEE80211_HT_CAP_SGI_20
1727 * and IEEE80211_HT_CAP_SGI_40) for enabling SGI, we reset
1728 * both flags if guard interval is Default GI
1730 if (arvif->bitrate_mask.control[band].gi == NL80211_TXRATE_DEFAULT_GI)
1731 arg->peer_ht_caps &= ~(IEEE80211_HT_CAP_SGI_20 |
1732 IEEE80211_HT_CAP_SGI_40);
1734 if (arvif->bitrate_mask.control[band].gi != NL80211_TXRATE_FORCE_LGI) {
1735 if (ht_cap->cap & (IEEE80211_HT_CAP_SGI_20 |
1736 IEEE80211_HT_CAP_SGI_40))
1737 arg->peer_rate_caps |= WMI_HOST_RC_SGI_FLAG;
1740 if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) {
1741 arg->peer_rate_caps |= WMI_HOST_RC_TX_STBC_FLAG;
1742 arg->stbc_flag = true;
1745 if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) {
1746 stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC;
1747 stbc = stbc >> IEEE80211_HT_CAP_RX_STBC_SHIFT;
1748 stbc = stbc << WMI_HOST_RC_RX_STBC_FLAG_S;
1749 arg->peer_rate_caps |= stbc;
1750 arg->stbc_flag = true;
1753 if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2])
1754 arg->peer_rate_caps |= WMI_HOST_RC_TS_FLAG;
1755 else if (ht_cap->mcs.rx_mask[1])
1756 arg->peer_rate_caps |= WMI_HOST_RC_DS_FLAG;
1758 for (i = 0, n = 0, max_nss = 0; i < IEEE80211_HT_MCS_MASK_LEN * 8; i++)
1759 if ((ht_cap->mcs.rx_mask[i / 8] & BIT(i % 8)) &&
1760 (ht_mcs_mask[i / 8] & BIT(i % 8))) {
1761 max_nss = (i / 8) + 1;
1762 arg->peer_ht_rates.rates[n++] = i;
1765 /* This is a workaround for HT-enabled STAs which break the spec
1766 * and have no HT capabilities RX mask (no HT RX MCS map).
1768 * As per spec, in section 20.3.5 Modulation and coding scheme (MCS),
1769 * MCS 0 through 7 are mandatory in 20MHz with 800 ns GI at all STAs.
1771 * Firmware asserts if such situation occurs.
1774 arg->peer_ht_rates.num_rates = 8;
1775 for (i = 0; i < arg->peer_ht_rates.num_rates; i++)
1776 arg->peer_ht_rates.rates[i] = i;
1778 arg->peer_ht_rates.num_rates = n;
1779 arg->peer_nss = min(sta->deflink.rx_nss, max_nss);
1782 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n",
1784 arg->peer_ht_rates.num_rates,
1788 static int ath11k_mac_get_max_vht_mcs_map(u16 mcs_map, int nss)
1790 switch ((mcs_map >> (2 * nss)) & 0x3) {
1791 case IEEE80211_VHT_MCS_SUPPORT_0_7: return BIT(8) - 1;
1792 case IEEE80211_VHT_MCS_SUPPORT_0_8: return BIT(9) - 1;
1793 case IEEE80211_VHT_MCS_SUPPORT_0_9: return BIT(10) - 1;
1799 ath11k_peer_assoc_h_vht_limit(u16 tx_mcs_set,
1800 const u16 vht_mcs_limit[NL80211_VHT_NSS_MAX])
1807 for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) {
1808 mcs_map = ath11k_mac_get_max_vht_mcs_map(tx_mcs_set, nss) &
1812 idx_limit = fls(mcs_map) - 1;
1816 switch (idx_limit) {
1825 mcs = IEEE80211_VHT_MCS_SUPPORT_0_7;
1828 mcs = IEEE80211_VHT_MCS_SUPPORT_0_8;
1831 mcs = IEEE80211_VHT_MCS_SUPPORT_0_9;
1837 mcs = IEEE80211_VHT_MCS_NOT_SUPPORTED;
1841 tx_mcs_set &= ~(0x3 << (nss * 2));
1842 tx_mcs_set |= mcs << (nss * 2);
1848 static u8 ath11k_get_nss_160mhz(struct ath11k *ar,
1851 u8 nss_ratio_info = ar->pdev->cap.nss_ratio_info;
1854 switch (nss_ratio_info) {
1855 case WMI_NSS_RATIO_1BY2_NSS:
1856 max_sup_nss = max_nss >> 1;
1858 case WMI_NSS_RATIO_3BY4_NSS:
1859 ath11k_warn(ar->ab, "WMI_NSS_RATIO_3BY4_NSS not supported\n");
1861 case WMI_NSS_RATIO_1_NSS:
1862 max_sup_nss = max_nss;
1864 case WMI_NSS_RATIO_2_NSS:
1865 ath11k_warn(ar->ab, "WMI_NSS_RATIO_2_NSS not supported\n");
1868 ath11k_warn(ar->ab, "invalid nss ratio received from firmware: %d\n",
1876 static void ath11k_peer_assoc_h_vht(struct ath11k *ar,
1877 struct ieee80211_vif *vif,
1878 struct ieee80211_sta *sta,
1879 struct peer_assoc_params *arg)
1881 const struct ieee80211_sta_vht_cap *vht_cap = &sta->deflink.vht_cap;
1882 struct ath11k_vif *arvif = (void *)vif->drv_priv;
1883 struct cfg80211_chan_def def;
1884 enum nl80211_band band;
1887 u8 max_nss, vht_mcs;
1888 int i, vht_nss, nss_idx;
1889 bool user_rate_valid = true;
1890 u32 rx_nss, tx_nss, nss_160;
1892 if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
1895 if (!vht_cap->vht_supported)
1898 band = def.chan->band;
1899 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
1901 if (ath11k_peer_assoc_h_vht_masked(vht_mcs_mask))
1904 arg->vht_flag = true;
1906 /* TODO: similar flags required? */
1907 arg->vht_capable = true;
1909 if (def.chan->band == NL80211_BAND_2GHZ)
1910 arg->vht_ng_flag = true;
1912 arg->peer_vht_caps = vht_cap->cap;
1914 ampdu_factor = (vht_cap->cap &
1915 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >>
1916 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
1918 /* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to
1919 * zero in VHT IE. Using it would result in degraded throughput.
1920 * arg->peer_max_mpdu at this point contains HT max_mpdu so keep
1921 * it if VHT max_mpdu is smaller.
1923 arg->peer_max_mpdu = max(arg->peer_max_mpdu,
1924 (1U << (IEEE80211_HT_MAX_AMPDU_FACTOR +
1925 ampdu_factor)) - 1);
1927 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
1930 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160)
1933 vht_nss = ath11k_mac_max_vht_nss(vht_mcs_mask);
1935 if (vht_nss > sta->deflink.rx_nss) {
1936 user_rate_valid = false;
1937 for (nss_idx = sta->deflink.rx_nss - 1; nss_idx >= 0; nss_idx--) {
1938 if (vht_mcs_mask[nss_idx]) {
1939 user_rate_valid = true;
1945 if (!user_rate_valid) {
1946 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac setting vht range mcs value to peer supported nss %d for peer %pM\n",
1947 sta->deflink.rx_nss, sta->addr);
1948 vht_mcs_mask[sta->deflink.rx_nss - 1] = vht_mcs_mask[vht_nss - 1];
1951 /* Calculate peer NSS capability from VHT capabilities if STA
1954 for (i = 0, max_nss = 0; i < NL80211_VHT_NSS_MAX; i++) {
1955 vht_mcs = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map) >>
1958 if (vht_mcs != IEEE80211_VHT_MCS_NOT_SUPPORTED &&
1962 arg->peer_nss = min(sta->deflink.rx_nss, max_nss);
1963 arg->rx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.rx_highest);
1964 arg->rx_mcs_set = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map);
1965 arg->tx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.tx_highest);
1966 arg->tx_mcs_set = ath11k_peer_assoc_h_vht_limit(
1967 __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map), vht_mcs_mask);
1969 /* In IPQ8074 platform, VHT mcs rate 10 and 11 is enabled by default.
1970 * VHT mcs rate 10 and 11 is not suppoerted in 11ac standard.
1971 * so explicitly disable the VHT MCS rate 10 and 11 in 11ac mode.
1973 arg->tx_mcs_set &= ~IEEE80211_VHT_MCS_SUPPORT_0_11_MASK;
1974 arg->tx_mcs_set |= IEEE80211_DISABLE_VHT_MCS_SUPPORT_0_11;
1976 if ((arg->tx_mcs_set & IEEE80211_VHT_MCS_NOT_SUPPORTED) ==
1977 IEEE80211_VHT_MCS_NOT_SUPPORTED)
1978 arg->peer_vht_caps &= ~IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE;
1981 arg->tx_max_mcs_nss = 0xFF;
1983 if (arg->peer_phymode == MODE_11AC_VHT160 ||
1984 arg->peer_phymode == MODE_11AC_VHT80_80) {
1985 tx_nss = ath11k_get_nss_160mhz(ar, max_nss);
1986 rx_nss = min(arg->peer_nss, tx_nss);
1987 arg->peer_bw_rxnss_override = ATH11K_BW_NSS_MAP_ENABLE;
1990 ath11k_warn(ar->ab, "invalid max_nss\n");
1994 if (arg->peer_phymode == MODE_11AC_VHT160)
1995 nss_160 = FIELD_PREP(ATH11K_PEER_RX_NSS_160MHZ, rx_nss - 1);
1997 nss_160 = FIELD_PREP(ATH11K_PEER_RX_NSS_80_80MHZ, rx_nss - 1);
1999 arg->peer_bw_rxnss_override |= nss_160;
2002 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
2003 "mac vht peer %pM max_mpdu %d flags 0x%x nss_override 0x%x\n",
2004 sta->addr, arg->peer_max_mpdu, arg->peer_flags,
2005 arg->peer_bw_rxnss_override);
2008 static int ath11k_mac_get_max_he_mcs_map(u16 mcs_map, int nss)
2010 switch ((mcs_map >> (2 * nss)) & 0x3) {
2011 case IEEE80211_HE_MCS_SUPPORT_0_7: return BIT(8) - 1;
2012 case IEEE80211_HE_MCS_SUPPORT_0_9: return BIT(10) - 1;
2013 case IEEE80211_HE_MCS_SUPPORT_0_11: return BIT(12) - 1;
2018 static u16 ath11k_peer_assoc_h_he_limit(u16 tx_mcs_set,
2019 const u16 he_mcs_limit[NL80211_HE_NSS_MAX])
2026 for (nss = 0; nss < NL80211_HE_NSS_MAX; nss++) {
2027 mcs_map = ath11k_mac_get_max_he_mcs_map(tx_mcs_set, nss) &
2031 idx_limit = fls(mcs_map) - 1;
2035 switch (idx_limit) {
2037 mcs = IEEE80211_HE_MCS_SUPPORT_0_7;
2041 mcs = IEEE80211_HE_MCS_SUPPORT_0_9;
2045 mcs = IEEE80211_HE_MCS_SUPPORT_0_11;
2051 mcs = IEEE80211_HE_MCS_NOT_SUPPORTED;
2055 tx_mcs_set &= ~(0x3 << (nss * 2));
2056 tx_mcs_set |= mcs << (nss * 2);
2063 ath11k_peer_assoc_h_he_masked(const u16 he_mcs_mask[NL80211_HE_NSS_MAX])
2067 for (nss = 0; nss < NL80211_HE_NSS_MAX; nss++)
2068 if (he_mcs_mask[nss])
2074 static void ath11k_peer_assoc_h_he(struct ath11k *ar,
2075 struct ieee80211_vif *vif,
2076 struct ieee80211_sta *sta,
2077 struct peer_assoc_params *arg)
2079 struct ath11k_vif *arvif = (void *)vif->drv_priv;
2080 struct cfg80211_chan_def def;
2081 const struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap;
2082 enum nl80211_band band;
2085 u16 he_tx_mcs = 0, v = 0;
2086 int i, he_nss, nss_idx;
2087 bool user_rate_valid = true;
2088 u32 rx_nss, tx_nss, nss_160;
2089 u8 ampdu_factor, rx_mcs_80, rx_mcs_160;
2090 u16 mcs_160_map, mcs_80_map;
2093 if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
2096 if (!he_cap->has_he)
2099 band = def.chan->band;
2100 he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs;
2102 if (ath11k_peer_assoc_h_he_masked(he_mcs_mask))
2105 arg->he_flag = true;
2106 support_160 = !!(he_cap->he_cap_elem.phy_cap_info[0] &
2107 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G);
2109 /* Supported HE-MCS and NSS Set of peer he_cap is intersection with self he_cp */
2110 mcs_160_map = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160);
2111 mcs_80_map = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80);
2114 for (i = 7; i >= 0; i--) {
2115 u8 mcs_160 = (mcs_160_map >> (2 * i)) & 3;
2117 if (mcs_160 != IEEE80211_VHT_MCS_NOT_SUPPORTED) {
2124 for (i = 7; i >= 0; i--) {
2125 u8 mcs_80 = (mcs_80_map >> (2 * i)) & 3;
2127 if (mcs_80 != IEEE80211_VHT_MCS_NOT_SUPPORTED) {
2134 max_nss = min(rx_mcs_80, rx_mcs_160);
2136 max_nss = rx_mcs_80;
2138 arg->peer_nss = min(sta->deflink.rx_nss, max_nss);
2140 memcpy_and_pad(&arg->peer_he_cap_macinfo,
2141 sizeof(arg->peer_he_cap_macinfo),
2142 he_cap->he_cap_elem.mac_cap_info,
2143 sizeof(he_cap->he_cap_elem.mac_cap_info),
2145 memcpy_and_pad(&arg->peer_he_cap_phyinfo,
2146 sizeof(arg->peer_he_cap_phyinfo),
2147 he_cap->he_cap_elem.phy_cap_info,
2148 sizeof(he_cap->he_cap_elem.phy_cap_info),
2150 arg->peer_he_ops = vif->bss_conf.he_oper.params;
2152 /* the top most byte is used to indicate BSS color info */
2153 arg->peer_he_ops &= 0xffffff;
2155 /* As per section 26.6.1 11ax Draft5.0, if the Max AMPDU Exponent Extension
2156 * in HE cap is zero, use the arg->peer_max_mpdu as calculated while parsing
2157 * VHT caps(if VHT caps is present) or HT caps (if VHT caps is not present).
2159 * For non-zero value of Max AMPDU Extponent Extension in HE MAC caps,
2160 * if a HE STA sends VHT cap and HE cap IE in assoc request then, use
2161 * MAX_AMPDU_LEN_FACTOR as 20 to calculate max_ampdu length.
2162 * If a HE STA that does not send VHT cap, but HE and HT cap in assoc
2163 * request, then use MAX_AMPDU_LEN_FACTOR as 16 to calculate max_ampdu
2166 ampdu_factor = u8_get_bits(he_cap->he_cap_elem.mac_cap_info[3],
2167 IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK);
2170 if (sta->deflink.vht_cap.vht_supported)
2171 arg->peer_max_mpdu = (1 << (IEEE80211_HE_VHT_MAX_AMPDU_FACTOR +
2173 else if (sta->deflink.ht_cap.ht_supported)
2174 arg->peer_max_mpdu = (1 << (IEEE80211_HE_HT_MAX_AMPDU_FACTOR +
2178 if (he_cap->he_cap_elem.phy_cap_info[6] &
2179 IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT) {
2183 arg->peer_ppet.numss_m1 = he_cap->ppe_thres[0] &
2184 IEEE80211_PPE_THRES_NSS_MASK;
2185 arg->peer_ppet.ru_bit_mask =
2186 (he_cap->ppe_thres[0] &
2187 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK) >>
2188 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_POS;
2190 for (nss = 0; nss <= arg->peer_ppet.numss_m1; nss++) {
2191 for (ru = 0; ru < 4; ru++) {
2195 if ((arg->peer_ppet.ru_bit_mask & BIT(ru)) == 0)
2197 for (i = 0; i < 6; i++) {
2199 val |= ((he_cap->ppe_thres[bit / 8] >>
2200 (bit % 8)) & 0x1) << 5;
2203 arg->peer_ppet.ppet16_ppet8_ru3_ru0[nss] |=
2209 if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_RES)
2210 arg->twt_responder = true;
2211 if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_REQ)
2212 arg->twt_requester = true;
2214 he_nss = ath11k_mac_max_he_nss(he_mcs_mask);
2216 if (he_nss > sta->deflink.rx_nss) {
2217 user_rate_valid = false;
2218 for (nss_idx = sta->deflink.rx_nss - 1; nss_idx >= 0; nss_idx--) {
2219 if (he_mcs_mask[nss_idx]) {
2220 user_rate_valid = true;
2226 if (!user_rate_valid) {
2227 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac setting he range mcs value to peer supported nss %d for peer %pM\n",
2228 sta->deflink.rx_nss, sta->addr);
2229 he_mcs_mask[sta->deflink.rx_nss - 1] = he_mcs_mask[he_nss - 1];
2232 switch (sta->deflink.bandwidth) {
2233 case IEEE80211_STA_RX_BW_160:
2234 if (he_cap->he_cap_elem.phy_cap_info[0] &
2235 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G) {
2236 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80p80);
2237 v = ath11k_peer_assoc_h_he_limit(v, he_mcs_mask);
2238 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80_80] = v;
2240 v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80p80);
2241 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80_80] = v;
2243 arg->peer_he_mcs_count++;
2246 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160);
2247 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v;
2249 v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_160);
2250 v = ath11k_peer_assoc_h_he_limit(v, he_mcs_mask);
2251 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v;
2253 arg->peer_he_mcs_count++;
2259 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80);
2260 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v;
2262 v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80);
2263 v = ath11k_peer_assoc_h_he_limit(v, he_mcs_mask);
2264 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v;
2266 arg->peer_he_mcs_count++;
2272 /* Calculate peer NSS capability from HE capabilities if STA
2275 for (i = 0, max_nss = 0; i < NL80211_HE_NSS_MAX; i++) {
2276 he_mcs = he_tx_mcs >> (2 * i) & 3;
2278 /* In case of fixed rates, MCS Range in he_tx_mcs might have
2279 * unsupported range, with he_mcs_mask set, so check either of them
2282 if (he_mcs != IEEE80211_HE_MCS_NOT_SUPPORTED ||
2286 arg->peer_nss = min(sta->deflink.rx_nss, max_nss);
2288 if (arg->peer_phymode == MODE_11AX_HE160 ||
2289 arg->peer_phymode == MODE_11AX_HE80_80) {
2290 tx_nss = ath11k_get_nss_160mhz(ar, max_nss);
2291 rx_nss = min(arg->peer_nss, tx_nss);
2292 arg->peer_bw_rxnss_override = ATH11K_BW_NSS_MAP_ENABLE;
2295 ath11k_warn(ar->ab, "invalid max_nss\n");
2299 if (arg->peer_phymode == MODE_11AX_HE160)
2300 nss_160 = FIELD_PREP(ATH11K_PEER_RX_NSS_160MHZ, rx_nss - 1);
2302 nss_160 = FIELD_PREP(ATH11K_PEER_RX_NSS_80_80MHZ, rx_nss - 1);
2304 arg->peer_bw_rxnss_override |= nss_160;
2307 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
2308 "mac he peer %pM nss %d mcs cnt %d nss_override 0x%x\n",
2309 sta->addr, arg->peer_nss,
2310 arg->peer_he_mcs_count,
2311 arg->peer_bw_rxnss_override);
2314 static void ath11k_peer_assoc_h_he_6ghz(struct ath11k *ar,
2315 struct ieee80211_vif *vif,
2316 struct ieee80211_sta *sta,
2317 struct peer_assoc_params *arg)
2319 const struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap;
2320 struct cfg80211_chan_def def;
2321 enum nl80211_band band;
2324 if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
2327 band = def.chan->band;
2329 if (!arg->he_flag || band != NL80211_BAND_6GHZ || !sta->deflink.he_6ghz_capa.capa)
2332 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2335 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
2338 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160)
2341 arg->peer_he_caps_6ghz = le16_to_cpu(sta->deflink.he_6ghz_capa.capa);
2342 arg->peer_mpdu_density =
2343 ath11k_parse_mpdudensity(FIELD_GET(IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START,
2344 arg->peer_he_caps_6ghz));
2346 /* From IEEE Std 802.11ax-2021 - Section 10.12.2: An HE STA shall be capable of
2347 * receiving A-MPDU where the A-MPDU pre-EOF padding length is up to the value
2348 * indicated by the Maximum A-MPDU Length Exponent Extension field in the HE
2349 * Capabilities element and the Maximum A-MPDU Length Exponent field in HE 6 GHz
2350 * Band Capabilities element in the 6 GHz band.
2352 * Here, we are extracting the Max A-MPDU Exponent Extension from HE caps and
2353 * factor is the Maximum A-MPDU Length Exponent from HE 6 GHZ Band capability.
2355 ampdu_factor = FIELD_GET(IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK,
2356 he_cap->he_cap_elem.mac_cap_info[3]) +
2357 FIELD_GET(IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP,
2358 arg->peer_he_caps_6ghz);
2360 arg->peer_max_mpdu = (1u << (IEEE80211_HE_6GHZ_MAX_AMPDU_FACTOR +
2364 static void ath11k_peer_assoc_h_smps(struct ieee80211_sta *sta,
2365 struct peer_assoc_params *arg)
2367 const struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
2370 if (!ht_cap->ht_supported && !sta->deflink.he_6ghz_capa.capa)
2373 if (ht_cap->ht_supported) {
2374 smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
2375 smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
2377 smps = le16_get_bits(sta->deflink.he_6ghz_capa.capa,
2378 IEEE80211_HE_6GHZ_CAP_SM_PS);
2382 case WLAN_HT_CAP_SM_PS_STATIC:
2383 arg->static_mimops_flag = true;
2385 case WLAN_HT_CAP_SM_PS_DYNAMIC:
2386 arg->dynamic_mimops_flag = true;
2388 case WLAN_HT_CAP_SM_PS_DISABLED:
2389 arg->spatial_mux_flag = true;
2396 static void ath11k_peer_assoc_h_qos(struct ath11k *ar,
2397 struct ieee80211_vif *vif,
2398 struct ieee80211_sta *sta,
2399 struct peer_assoc_params *arg)
2401 struct ath11k_vif *arvif = (void *)vif->drv_priv;
2403 switch (arvif->vdev_type) {
2404 case WMI_VDEV_TYPE_AP:
2406 /* TODO: Check WME vs QoS */
2407 arg->is_wme_set = true;
2408 arg->qos_flag = true;
2411 if (sta->wme && sta->uapsd_queues) {
2412 /* TODO: Check WME vs QoS */
2413 arg->is_wme_set = true;
2414 arg->apsd_flag = true;
2415 arg->peer_rate_caps |= WMI_HOST_RC_UAPSD_FLAG;
2418 case WMI_VDEV_TYPE_STA:
2420 arg->is_wme_set = true;
2421 arg->qos_flag = true;
2428 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac peer %pM qos %d\n",
2429 sta->addr, arg->qos_flag);
2432 static int ath11k_peer_assoc_qos_ap(struct ath11k *ar,
2433 struct ath11k_vif *arvif,
2434 struct ieee80211_sta *sta)
2436 struct ap_ps_params params;
2441 lockdep_assert_held(&ar->conf_mutex);
2443 params.vdev_id = arvif->vdev_id;
2445 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac uapsd_queues 0x%x max_sp %d\n",
2446 sta->uapsd_queues, sta->max_sp);
2449 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO)
2450 uapsd |= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN |
2451 WMI_AP_PS_UAPSD_AC3_TRIGGER_EN;
2452 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI)
2453 uapsd |= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN |
2454 WMI_AP_PS_UAPSD_AC2_TRIGGER_EN;
2455 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK)
2456 uapsd |= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN |
2457 WMI_AP_PS_UAPSD_AC1_TRIGGER_EN;
2458 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE)
2459 uapsd |= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN |
2460 WMI_AP_PS_UAPSD_AC0_TRIGGER_EN;
2463 if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP)
2464 max_sp = sta->max_sp;
2466 params.param = WMI_AP_PS_PEER_PARAM_UAPSD;
2467 params.value = uapsd;
2468 ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, ¶ms);
2472 params.param = WMI_AP_PS_PEER_PARAM_MAX_SP;
2473 params.value = max_sp;
2474 ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, ¶ms);
2478 /* TODO revisit during testing */
2479 params.param = WMI_AP_PS_PEER_PARAM_SIFS_RESP_FRMTYPE;
2480 params.value = DISABLE_SIFS_RESPONSE_TRIGGER;
2481 ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, ¶ms);
2485 params.param = WMI_AP_PS_PEER_PARAM_SIFS_RESP_UAPSD;
2486 params.value = DISABLE_SIFS_RESPONSE_TRIGGER;
2487 ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, ¶ms);
2494 ath11k_warn(ar->ab, "failed to set ap ps peer param %d for vdev %i: %d\n",
2495 params.param, arvif->vdev_id, ret);
2499 static bool ath11k_mac_sta_has_ofdm_only(struct ieee80211_sta *sta)
2501 return sta->deflink.supp_rates[NL80211_BAND_2GHZ] >>
2502 ATH11K_MAC_FIRST_OFDM_RATE_IDX;
2505 static enum wmi_phy_mode ath11k_mac_get_phymode_vht(struct ath11k *ar,
2506 struct ieee80211_sta *sta)
2508 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160) {
2509 switch (sta->deflink.vht_cap.cap &
2510 IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK) {
2511 case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ:
2512 return MODE_11AC_VHT160;
2513 case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ:
2514 return MODE_11AC_VHT80_80;
2516 /* not sure if this is a valid case? */
2517 return MODE_11AC_VHT160;
2521 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
2522 return MODE_11AC_VHT80;
2524 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2525 return MODE_11AC_VHT40;
2527 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_20)
2528 return MODE_11AC_VHT20;
2530 return MODE_UNKNOWN;
2533 static enum wmi_phy_mode ath11k_mac_get_phymode_he(struct ath11k *ar,
2534 struct ieee80211_sta *sta)
2536 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160) {
2537 if (sta->deflink.he_cap.he_cap_elem.phy_cap_info[0] &
2538 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
2539 return MODE_11AX_HE160;
2540 else if (sta->deflink.he_cap.he_cap_elem.phy_cap_info[0] &
2541 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
2542 return MODE_11AX_HE80_80;
2543 /* not sure if this is a valid case? */
2544 return MODE_11AX_HE160;
2547 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
2548 return MODE_11AX_HE80;
2550 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2551 return MODE_11AX_HE40;
2553 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_20)
2554 return MODE_11AX_HE20;
2556 return MODE_UNKNOWN;
2559 static void ath11k_peer_assoc_h_phymode(struct ath11k *ar,
2560 struct ieee80211_vif *vif,
2561 struct ieee80211_sta *sta,
2562 struct peer_assoc_params *arg)
2564 struct ath11k_vif *arvif = (void *)vif->drv_priv;
2565 struct cfg80211_chan_def def;
2566 enum nl80211_band band;
2567 const u8 *ht_mcs_mask;
2568 const u16 *vht_mcs_mask;
2569 const u16 *he_mcs_mask;
2570 enum wmi_phy_mode phymode = MODE_UNKNOWN;
2572 if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
2575 band = def.chan->band;
2576 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
2577 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2578 he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs;
2581 case NL80211_BAND_2GHZ:
2582 if (sta->deflink.he_cap.has_he &&
2583 !ath11k_peer_assoc_h_he_masked(he_mcs_mask)) {
2584 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
2585 phymode = MODE_11AX_HE80_2G;
2586 else if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2587 phymode = MODE_11AX_HE40_2G;
2589 phymode = MODE_11AX_HE20_2G;
2590 } else if (sta->deflink.vht_cap.vht_supported &&
2591 !ath11k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
2592 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2593 phymode = MODE_11AC_VHT40;
2595 phymode = MODE_11AC_VHT20;
2596 } else if (sta->deflink.ht_cap.ht_supported &&
2597 !ath11k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
2598 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2599 phymode = MODE_11NG_HT40;
2601 phymode = MODE_11NG_HT20;
2602 } else if (ath11k_mac_sta_has_ofdm_only(sta)) {
2608 case NL80211_BAND_5GHZ:
2609 case NL80211_BAND_6GHZ:
2610 /* Check HE first */
2611 if (sta->deflink.he_cap.has_he &&
2612 !ath11k_peer_assoc_h_he_masked(he_mcs_mask)) {
2613 phymode = ath11k_mac_get_phymode_he(ar, sta);
2614 } else if (sta->deflink.vht_cap.vht_supported &&
2615 !ath11k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
2616 phymode = ath11k_mac_get_phymode_vht(ar, sta);
2617 } else if (sta->deflink.ht_cap.ht_supported &&
2618 !ath11k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
2619 if (sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40)
2620 phymode = MODE_11NA_HT40;
2622 phymode = MODE_11NA_HT20;
2631 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac peer %pM phymode %s\n",
2632 sta->addr, ath11k_wmi_phymode_str(phymode));
2634 arg->peer_phymode = phymode;
2635 WARN_ON(phymode == MODE_UNKNOWN);
2638 static void ath11k_peer_assoc_prepare(struct ath11k *ar,
2639 struct ieee80211_vif *vif,
2640 struct ieee80211_sta *sta,
2641 struct peer_assoc_params *arg,
2644 struct ath11k_sta *arsta;
2646 lockdep_assert_held(&ar->conf_mutex);
2648 arsta = (struct ath11k_sta *)sta->drv_priv;
2650 memset(arg, 0, sizeof(*arg));
2652 reinit_completion(&ar->peer_assoc_done);
2654 arg->peer_new_assoc = !reassoc;
2655 ath11k_peer_assoc_h_basic(ar, vif, sta, arg);
2656 ath11k_peer_assoc_h_crypto(ar, vif, sta, arg);
2657 ath11k_peer_assoc_h_rates(ar, vif, sta, arg);
2658 ath11k_peer_assoc_h_phymode(ar, vif, sta, arg);
2659 ath11k_peer_assoc_h_ht(ar, vif, sta, arg);
2660 ath11k_peer_assoc_h_vht(ar, vif, sta, arg);
2661 ath11k_peer_assoc_h_he(ar, vif, sta, arg);
2662 ath11k_peer_assoc_h_he_6ghz(ar, vif, sta, arg);
2663 ath11k_peer_assoc_h_qos(ar, vif, sta, arg);
2664 ath11k_peer_assoc_h_smps(sta, arg);
2666 arsta->peer_nss = arg->peer_nss;
2668 /* TODO: amsdu_disable req? */
2671 static int ath11k_setup_peer_smps(struct ath11k *ar, struct ath11k_vif *arvif,
2673 const struct ieee80211_sta_ht_cap *ht_cap,
2678 if (!ht_cap->ht_supported && !he_6ghz_capa)
2681 if (ht_cap->ht_supported) {
2682 smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
2683 smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
2685 smps = FIELD_GET(IEEE80211_HE_6GHZ_CAP_SM_PS, he_6ghz_capa);
2688 if (smps >= ARRAY_SIZE(ath11k_smps_map))
2691 return ath11k_wmi_set_peer_param(ar, addr, arvif->vdev_id,
2692 WMI_PEER_MIMO_PS_STATE,
2693 ath11k_smps_map[smps]);
2696 static void ath11k_bss_assoc(struct ieee80211_hw *hw,
2697 struct ieee80211_vif *vif,
2698 struct ieee80211_bss_conf *bss_conf)
2700 struct ath11k *ar = hw->priv;
2701 struct ath11k_vif *arvif = (void *)vif->drv_priv;
2702 struct peer_assoc_params peer_arg;
2703 struct ieee80211_sta *ap_sta;
2704 struct ath11k_peer *peer;
2705 bool is_auth = false;
2708 lockdep_assert_held(&ar->conf_mutex);
2710 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac vdev %i assoc bssid %pM aid %d\n",
2711 arvif->vdev_id, arvif->bssid, arvif->aid);
2715 ap_sta = ieee80211_find_sta(vif, bss_conf->bssid);
2717 ath11k_warn(ar->ab, "failed to find station entry for bss %pM vdev %i\n",
2718 bss_conf->bssid, arvif->vdev_id);
2723 ath11k_peer_assoc_prepare(ar, vif, ap_sta, &peer_arg, false);
2727 peer_arg.is_assoc = true;
2728 ret = ath11k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
2730 ath11k_warn(ar->ab, "failed to run peer assoc for %pM vdev %i: %d\n",
2731 bss_conf->bssid, arvif->vdev_id, ret);
2735 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) {
2736 ath11k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
2737 bss_conf->bssid, arvif->vdev_id);
2741 ret = ath11k_setup_peer_smps(ar, arvif, bss_conf->bssid,
2742 &ap_sta->deflink.ht_cap,
2743 le16_to_cpu(ap_sta->deflink.he_6ghz_capa.capa));
2745 ath11k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n",
2746 arvif->vdev_id, ret);
2750 WARN_ON(arvif->is_up);
2752 arvif->aid = vif->cfg.aid;
2753 ether_addr_copy(arvif->bssid, bss_conf->bssid);
2755 ret = ath11k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid);
2757 ath11k_warn(ar->ab, "failed to set vdev %d up: %d\n",
2758 arvif->vdev_id, ret);
2762 arvif->is_up = true;
2763 arvif->rekey_data.enable_offload = false;
2765 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
2766 "mac vdev %d up (associated) bssid %pM aid %d\n",
2767 arvif->vdev_id, bss_conf->bssid, vif->cfg.aid);
2769 spin_lock_bh(&ar->ab->base_lock);
2771 peer = ath11k_peer_find(ar->ab, arvif->vdev_id, arvif->bssid);
2772 if (peer && peer->is_authorized)
2775 spin_unlock_bh(&ar->ab->base_lock);
2778 ret = ath11k_wmi_set_peer_param(ar, arvif->bssid,
2783 ath11k_warn(ar->ab, "Unable to authorize BSS peer: %d\n", ret);
2786 ret = ath11k_wmi_send_obss_spr_cmd(ar, arvif->vdev_id,
2787 &bss_conf->he_obss_pd);
2789 ath11k_warn(ar->ab, "failed to set vdev %i OBSS PD parameters: %d\n",
2790 arvif->vdev_id, ret);
2792 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
2793 WMI_VDEV_PARAM_DTIM_POLICY,
2794 WMI_DTIM_POLICY_STICK);
2796 ath11k_warn(ar->ab, "failed to set vdev %d dtim policy: %d\n",
2797 arvif->vdev_id, ret);
2799 ath11k_mac_11d_scan_stop_all(ar->ab);
2802 static void ath11k_bss_disassoc(struct ieee80211_hw *hw,
2803 struct ieee80211_vif *vif)
2805 struct ath11k *ar = hw->priv;
2806 struct ath11k_vif *arvif = (void *)vif->drv_priv;
2809 lockdep_assert_held(&ar->conf_mutex);
2811 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac vdev %i disassoc bssid %pM\n",
2812 arvif->vdev_id, arvif->bssid);
2814 ret = ath11k_wmi_vdev_down(ar, arvif->vdev_id);
2816 ath11k_warn(ar->ab, "failed to down vdev %i: %d\n",
2817 arvif->vdev_id, ret);
2819 arvif->is_up = false;
2821 memset(&arvif->rekey_data, 0, sizeof(arvif->rekey_data));
2823 cancel_delayed_work_sync(&arvif->connection_loss_work);
2826 static u32 ath11k_mac_get_rate_hw_value(int bitrate)
2833 if (ath11k_mac_bitrate_is_cck(bitrate))
2834 preamble = WMI_RATE_PREAMBLE_CCK;
2836 preamble = WMI_RATE_PREAMBLE_OFDM;
2838 for (i = 0; i < ARRAY_SIZE(ath11k_legacy_rates); i++) {
2839 if (ath11k_legacy_rates[i].bitrate != bitrate)
2842 hw_value = ath11k_legacy_rates[i].hw_value;
2843 rate = ATH11K_HW_RATE_CODE(hw_value, 0, preamble);
2851 static void ath11k_recalculate_mgmt_rate(struct ath11k *ar,
2852 struct ieee80211_vif *vif,
2853 struct cfg80211_chan_def *def)
2855 struct ath11k_vif *arvif = (void *)vif->drv_priv;
2856 const struct ieee80211_supported_band *sband;
2863 lockdep_assert_held(&ar->conf_mutex);
2865 sband = ar->hw->wiphy->bands[def->chan->band];
2866 basic_rate_idx = ffs(vif->bss_conf.basic_rates) - 1;
2867 bitrate = sband->bitrates[basic_rate_idx].bitrate;
2869 hw_rate_code = ath11k_mac_get_rate_hw_value(bitrate);
2870 if (hw_rate_code < 0) {
2871 ath11k_warn(ar->ab, "bitrate not supported %d\n", bitrate);
2875 vdev_param = WMI_VDEV_PARAM_MGMT_RATE;
2876 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param,
2879 ath11k_warn(ar->ab, "failed to set mgmt tx rate %d\n", ret);
2881 /* For WCN6855, firmware will clear this param when vdev starts, hence
2882 * cache it here so that we can reconfigure it once vdev starts.
2884 ar->hw_rate_code = hw_rate_code;
2886 vdev_param = WMI_VDEV_PARAM_BEACON_RATE;
2887 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param,
2890 ath11k_warn(ar->ab, "failed to set beacon tx rate %d\n", ret);
2893 static int ath11k_mac_fils_discovery(struct ath11k_vif *arvif,
2894 struct ieee80211_bss_conf *info)
2896 struct ath11k *ar = arvif->ar;
2897 struct sk_buff *tmpl;
2900 bool unsol_bcast_probe_resp_enabled = false;
2902 if (info->fils_discovery.max_interval) {
2903 interval = info->fils_discovery.max_interval;
2905 tmpl = ieee80211_get_fils_discovery_tmpl(ar->hw, arvif->vif);
2907 ret = ath11k_wmi_fils_discovery_tmpl(ar, arvif->vdev_id,
2909 } else if (info->unsol_bcast_probe_resp_interval) {
2910 unsol_bcast_probe_resp_enabled = 1;
2911 interval = info->unsol_bcast_probe_resp_interval;
2913 tmpl = ieee80211_get_unsol_bcast_probe_resp_tmpl(ar->hw,
2916 ret = ath11k_wmi_probe_resp_tmpl(ar, arvif->vdev_id,
2918 } else { /* Disable */
2919 return ath11k_wmi_fils_discovery(ar, arvif->vdev_id, 0, false);
2924 "mac vdev %i failed to retrieve %s template\n",
2925 arvif->vdev_id, (unsol_bcast_probe_resp_enabled ?
2926 "unsolicited broadcast probe response" :
2933 ret = ath11k_wmi_fils_discovery(ar, arvif->vdev_id, interval,
2934 unsol_bcast_probe_resp_enabled);
2939 static int ath11k_mac_config_obss_pd(struct ath11k *ar,
2940 struct ieee80211_he_obss_pd *he_obss_pd)
2942 u32 bitmap[2], param_id, param_val, pdev_id;
2944 s8 non_srg_th = 0, srg_th = 0;
2946 pdev_id = ar->pdev->pdev_id;
2948 /* Set and enable SRG/non-SRG OBSS PD Threshold */
2949 param_id = WMI_PDEV_PARAM_SET_CMD_OBSS_PD_THRESHOLD;
2950 if (test_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags)) {
2951 ret = ath11k_wmi_pdev_set_param(ar, param_id, 0, pdev_id);
2954 "failed to set obss_pd_threshold for pdev: %u\n",
2959 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
2960 "mac obss pd sr_ctrl %x non_srg_thres %u srg_max %u\n",
2961 he_obss_pd->sr_ctrl, he_obss_pd->non_srg_max_offset,
2962 he_obss_pd->max_offset);
2966 if (he_obss_pd->sr_ctrl &
2967 IEEE80211_HE_SPR_NON_SRG_OBSS_PD_SR_DISALLOWED) {
2968 non_srg_th = ATH11K_OBSS_PD_MAX_THRESHOLD;
2970 if (he_obss_pd->sr_ctrl & IEEE80211_HE_SPR_NON_SRG_OFFSET_PRESENT)
2971 non_srg_th = (ATH11K_OBSS_PD_MAX_THRESHOLD +
2972 he_obss_pd->non_srg_max_offset);
2974 non_srg_th = ATH11K_OBSS_PD_NON_SRG_MAX_THRESHOLD;
2976 param_val |= ATH11K_OBSS_PD_NON_SRG_EN;
2979 if (he_obss_pd->sr_ctrl & IEEE80211_HE_SPR_SRG_INFORMATION_PRESENT) {
2980 srg_th = ATH11K_OBSS_PD_MAX_THRESHOLD + he_obss_pd->max_offset;
2981 param_val |= ATH11K_OBSS_PD_SRG_EN;
2984 if (test_bit(WMI_TLV_SERVICE_SRG_SRP_SPATIAL_REUSE_SUPPORT,
2985 ar->ab->wmi_ab.svc_map)) {
2986 param_val |= ATH11K_OBSS_PD_THRESHOLD_IN_DBM;
2987 param_val |= FIELD_PREP(GENMASK(15, 8), srg_th);
2989 non_srg_th -= ATH11K_DEFAULT_NOISE_FLOOR;
2990 /* SRG not supported and threshold in dB */
2991 param_val &= ~(ATH11K_OBSS_PD_SRG_EN |
2992 ATH11K_OBSS_PD_THRESHOLD_IN_DBM);
2995 param_val |= (non_srg_th & GENMASK(7, 0));
2996 ret = ath11k_wmi_pdev_set_param(ar, param_id, param_val, pdev_id);
2999 "failed to set obss_pd_threshold for pdev: %u\n",
3004 /* Enable OBSS PD for all access category */
3005 param_id = WMI_PDEV_PARAM_SET_CMD_OBSS_PD_PER_AC;
3007 ret = ath11k_wmi_pdev_set_param(ar, param_id, param_val, pdev_id);
3010 "failed to set obss_pd_per_ac for pdev: %u\n",
3015 /* Set SR Prohibit */
3016 param_id = WMI_PDEV_PARAM_ENABLE_SR_PROHIBIT;
3017 param_val = !!(he_obss_pd->sr_ctrl &
3018 IEEE80211_HE_SPR_HESIGA_SR_VAL15_ALLOWED);
3019 ret = ath11k_wmi_pdev_set_param(ar, param_id, param_val, pdev_id);
3021 ath11k_warn(ar->ab, "failed to set sr_prohibit for pdev: %u\n",
3026 if (!test_bit(WMI_TLV_SERVICE_SRG_SRP_SPATIAL_REUSE_SUPPORT,
3027 ar->ab->wmi_ab.svc_map))
3030 /* Set SRG BSS Color Bitmap */
3031 memcpy(bitmap, he_obss_pd->bss_color_bitmap, sizeof(bitmap));
3032 ret = ath11k_wmi_pdev_set_srg_bss_color_bitmap(ar, bitmap);
3035 "failed to set bss_color_bitmap for pdev: %u\n",
3040 /* Set SRG Partial BSSID Bitmap */
3041 memcpy(bitmap, he_obss_pd->partial_bssid_bitmap, sizeof(bitmap));
3042 ret = ath11k_wmi_pdev_set_srg_patial_bssid_bitmap(ar, bitmap);
3045 "failed to set partial_bssid_bitmap for pdev: %u\n",
3050 memset(bitmap, 0xff, sizeof(bitmap));
3052 /* Enable all BSS Colors for SRG */
3053 ret = ath11k_wmi_pdev_srg_obss_color_enable_bitmap(ar, bitmap);
3056 "failed to set srg_color_en_bitmap pdev: %u\n",
3061 /* Enable all patial BSSID mask for SRG */
3062 ret = ath11k_wmi_pdev_srg_obss_bssid_enable_bitmap(ar, bitmap);
3065 "failed to set srg_bssid_en_bitmap pdev: %u\n",
3070 /* Enable all BSS Colors for non-SRG */
3071 ret = ath11k_wmi_pdev_non_srg_obss_color_enable_bitmap(ar, bitmap);
3074 "failed to set non_srg_color_en_bitmap pdev: %u\n",
3079 /* Enable all patial BSSID mask for non-SRG */
3080 ret = ath11k_wmi_pdev_non_srg_obss_bssid_enable_bitmap(ar, bitmap);
3083 "failed to set non_srg_bssid_en_bitmap pdev: %u\n",
3091 static void ath11k_mac_op_bss_info_changed(struct ieee80211_hw *hw,
3092 struct ieee80211_vif *vif,
3093 struct ieee80211_bss_conf *info,
3096 struct ath11k *ar = hw->priv;
3097 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
3098 struct cfg80211_chan_def def;
3099 u32 param_id, param_value;
3100 enum nl80211_band band;
3111 mutex_lock(&ar->conf_mutex);
3113 if (changed & BSS_CHANGED_BEACON_INT) {
3114 arvif->beacon_interval = info->beacon_int;
3116 param_id = WMI_VDEV_PARAM_BEACON_INTERVAL;
3117 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3119 arvif->beacon_interval);
3121 ath11k_warn(ar->ab, "Failed to set beacon interval for VDEV: %d\n",
3124 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3125 "Beacon interval: %d set for VDEV: %d\n",
3126 arvif->beacon_interval, arvif->vdev_id);
3129 if (changed & BSS_CHANGED_BEACON) {
3130 param_id = WMI_PDEV_PARAM_BEACON_TX_MODE;
3131 param_value = WMI_BEACON_STAGGERED_MODE;
3132 ret = ath11k_wmi_pdev_set_param(ar, param_id,
3133 param_value, ar->pdev->pdev_id);
3135 ath11k_warn(ar->ab, "Failed to set beacon mode for VDEV: %d\n",
3138 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3139 "Set staggered beacon mode for VDEV: %d\n",
3142 if (!arvif->do_not_send_tmpl || !arvif->bcca_zero_sent) {
3143 ret = ath11k_mac_setup_bcn_tmpl(arvif);
3145 ath11k_warn(ar->ab, "failed to update bcn template: %d\n",
3149 if (arvif->bcca_zero_sent)
3150 arvif->do_not_send_tmpl = true;
3152 arvif->do_not_send_tmpl = false;
3154 if (vif->bss_conf.he_support) {
3155 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3156 WMI_VDEV_PARAM_BA_MODE,
3157 WMI_BA_MODE_BUFFER_SIZE_256);
3160 "failed to set BA BUFFER SIZE 256 for vdev: %d\n",
3163 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3164 "Set BA BUFFER SIZE 256 for VDEV: %d\n",
3169 if (changed & (BSS_CHANGED_BEACON_INFO | BSS_CHANGED_BEACON)) {
3170 arvif->dtim_period = info->dtim_period;
3172 param_id = WMI_VDEV_PARAM_DTIM_PERIOD;
3173 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3175 arvif->dtim_period);
3178 ath11k_warn(ar->ab, "Failed to set dtim period for VDEV %d: %i\n",
3179 arvif->vdev_id, ret);
3181 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3182 "DTIM period: %d set for VDEV: %d\n",
3183 arvif->dtim_period, arvif->vdev_id);
3186 if (changed & BSS_CHANGED_SSID &&
3187 vif->type == NL80211_IFTYPE_AP) {
3188 arvif->u.ap.ssid_len = vif->cfg.ssid_len;
3189 if (vif->cfg.ssid_len)
3190 memcpy(arvif->u.ap.ssid, vif->cfg.ssid,
3192 arvif->u.ap.hidden_ssid = info->hidden_ssid;
3195 if (changed & BSS_CHANGED_BSSID && !is_zero_ether_addr(info->bssid))
3196 ether_addr_copy(arvif->bssid, info->bssid);
3198 if (changed & BSS_CHANGED_BEACON_ENABLED) {
3199 ath11k_control_beaconing(arvif, info);
3201 if (arvif->is_up && vif->bss_conf.he_support &&
3202 vif->bss_conf.he_oper.params) {
3203 param_id = WMI_VDEV_PARAM_HEOPS_0_31;
3204 param_value = vif->bss_conf.he_oper.params;
3205 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3206 param_id, param_value);
3207 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3208 "he oper param: %x set for VDEV: %d\n",
3209 param_value, arvif->vdev_id);
3212 ath11k_warn(ar->ab, "Failed to set he oper params %x for VDEV %d: %i\n",
3213 param_value, arvif->vdev_id, ret);
3217 if (changed & BSS_CHANGED_ERP_CTS_PROT) {
3220 cts_prot = !!(info->use_cts_prot);
3221 param_id = WMI_VDEV_PARAM_PROTECTION_MODE;
3223 if (arvif->is_started) {
3224 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3225 param_id, cts_prot);
3227 ath11k_warn(ar->ab, "Failed to set CTS prot for VDEV: %d\n",
3230 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "Set CTS prot: %d for VDEV: %d\n",
3231 cts_prot, arvif->vdev_id);
3233 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "defer protection mode setup, vdev is not ready yet\n");
3237 if (changed & BSS_CHANGED_ERP_SLOT) {
3240 if (info->use_short_slot)
3241 slottime = WMI_VDEV_SLOT_TIME_SHORT; /* 9us */
3244 slottime = WMI_VDEV_SLOT_TIME_LONG; /* 20us */
3246 param_id = WMI_VDEV_PARAM_SLOT_TIME;
3247 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3248 param_id, slottime);
3250 ath11k_warn(ar->ab, "Failed to set erp slot for VDEV: %d\n",
3253 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3254 "Set slottime: %d for VDEV: %d\n",
3255 slottime, arvif->vdev_id);
3258 if (changed & BSS_CHANGED_ERP_PREAMBLE) {
3261 if (info->use_short_preamble)
3262 preamble = WMI_VDEV_PREAMBLE_SHORT;
3264 preamble = WMI_VDEV_PREAMBLE_LONG;
3266 param_id = WMI_VDEV_PARAM_PREAMBLE;
3267 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3268 param_id, preamble);
3270 ath11k_warn(ar->ab, "Failed to set preamble for VDEV: %d\n",
3273 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3274 "Set preamble: %d for VDEV: %d\n",
3275 preamble, arvif->vdev_id);
3278 if (changed & BSS_CHANGED_ASSOC) {
3280 ath11k_bss_assoc(hw, vif, info);
3282 ath11k_bss_disassoc(hw, vif);
3285 if (changed & BSS_CHANGED_TXPOWER) {
3286 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac vdev_id %i txpower %d\n",
3287 arvif->vdev_id, info->txpower);
3289 arvif->txpower = info->txpower;
3290 ath11k_mac_txpower_recalc(ar);
3293 if (changed & BSS_CHANGED_PS &&
3294 ar->ab->hw_params.supports_sta_ps) {
3295 arvif->ps = vif->cfg.ps;
3297 ret = ath11k_mac_config_ps(ar);
3299 ath11k_warn(ar->ab, "failed to setup ps on vdev %i: %d\n",
3300 arvif->vdev_id, ret);
3303 if (changed & BSS_CHANGED_MCAST_RATE &&
3304 !ath11k_mac_vif_chan(arvif->vif, &def)) {
3305 band = def.chan->band;
3306 mcast_rate = vif->bss_conf.mcast_rate[band];
3309 rateidx = mcast_rate - 1;
3311 rateidx = ffs(vif->bss_conf.basic_rates) - 1;
3313 if (ar->pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP)
3314 rateidx += ATH11K_MAC_FIRST_OFDM_RATE_IDX;
3316 bitrate = ath11k_legacy_rates[rateidx].bitrate;
3317 hw_value = ath11k_legacy_rates[rateidx].hw_value;
3319 if (ath11k_mac_bitrate_is_cck(bitrate))
3320 preamble = WMI_RATE_PREAMBLE_CCK;
3322 preamble = WMI_RATE_PREAMBLE_OFDM;
3324 rate = ATH11K_HW_RATE_CODE(hw_value, 0, preamble);
3326 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3327 "mac vdev %d mcast_rate %x\n",
3328 arvif->vdev_id, rate);
3330 vdev_param = WMI_VDEV_PARAM_MCAST_DATA_RATE;
3331 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3335 "failed to set mcast rate on vdev %i: %d\n",
3336 arvif->vdev_id, ret);
3338 vdev_param = WMI_VDEV_PARAM_BCAST_DATA_RATE;
3339 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3343 "failed to set bcast rate on vdev %i: %d\n",
3344 arvif->vdev_id, ret);
3347 if (changed & BSS_CHANGED_BASIC_RATES &&
3348 !ath11k_mac_vif_chan(arvif->vif, &def))
3349 ath11k_recalculate_mgmt_rate(ar, vif, &def);
3351 if (changed & BSS_CHANGED_TWT) {
3352 if (info->twt_requester || info->twt_responder)
3353 ath11k_wmi_send_twt_enable_cmd(ar, ar->pdev->pdev_id);
3355 ath11k_wmi_send_twt_disable_cmd(ar, ar->pdev->pdev_id);
3358 if (changed & BSS_CHANGED_HE_OBSS_PD)
3359 ath11k_mac_config_obss_pd(ar, &info->he_obss_pd);
3361 if (changed & BSS_CHANGED_HE_BSS_COLOR) {
3362 if (vif->type == NL80211_IFTYPE_AP) {
3363 ret = ath11k_wmi_send_obss_color_collision_cfg_cmd(
3364 ar, arvif->vdev_id, info->he_bss_color.color,
3365 ATH11K_BSS_COLOR_COLLISION_DETECTION_AP_PERIOD_MS,
3366 info->he_bss_color.enabled);
3368 ath11k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n",
3369 arvif->vdev_id, ret);
3371 param_id = WMI_VDEV_PARAM_BSS_COLOR;
3372 if (info->he_bss_color.enabled)
3373 param_value = info->he_bss_color.color <<
3374 IEEE80211_HE_OPERATION_BSS_COLOR_OFFSET;
3376 param_value = IEEE80211_HE_OPERATION_BSS_COLOR_DISABLED;
3378 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3383 "failed to set bss color param on vdev %i: %d\n",
3384 arvif->vdev_id, ret);
3386 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3387 "bss color param 0x%x set on vdev %i\n",
3388 param_value, arvif->vdev_id);
3389 } else if (vif->type == NL80211_IFTYPE_STATION) {
3390 ret = ath11k_wmi_send_bss_color_change_enable_cmd(ar,
3394 ath11k_warn(ar->ab, "failed to enable bss color change on vdev %i: %d\n",
3395 arvif->vdev_id, ret);
3396 ret = ath11k_wmi_send_obss_color_collision_cfg_cmd(
3397 ar, arvif->vdev_id, 0,
3398 ATH11K_BSS_COLOR_COLLISION_DETECTION_STA_PERIOD_MS, 1);
3400 ath11k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n",
3401 arvif->vdev_id, ret);
3405 if (changed & BSS_CHANGED_FILS_DISCOVERY ||
3406 changed & BSS_CHANGED_UNSOL_BCAST_PROBE_RESP)
3407 ath11k_mac_fils_discovery(arvif, info);
3409 if (changed & BSS_CHANGED_ARP_FILTER) {
3410 ipv4_cnt = min(vif->cfg.arp_addr_cnt, ATH11K_IPV4_MAX_COUNT);
3411 memcpy(arvif->arp_ns_offload.ipv4_addr,
3412 vif->cfg.arp_addr_list,
3413 ipv4_cnt * sizeof(u32));
3414 memcpy(arvif->arp_ns_offload.mac_addr, vif->addr, ETH_ALEN);
3415 arvif->arp_ns_offload.ipv4_count = ipv4_cnt;
3417 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac arp_addr_cnt %d vif->addr %pM, offload_addr %pI4\n",
3418 vif->cfg.arp_addr_cnt,
3419 vif->addr, arvif->arp_ns_offload.ipv4_addr);
3422 mutex_unlock(&ar->conf_mutex);
3425 void __ath11k_mac_scan_finish(struct ath11k *ar)
3427 lockdep_assert_held(&ar->data_lock);
3429 switch (ar->scan.state) {
3430 case ATH11K_SCAN_IDLE:
3432 case ATH11K_SCAN_RUNNING:
3433 case ATH11K_SCAN_ABORTING:
3434 if (ar->scan.is_roc && ar->scan.roc_notify)
3435 ieee80211_remain_on_channel_expired(ar->hw);
3437 case ATH11K_SCAN_STARTING:
3438 if (!ar->scan.is_roc) {
3439 struct cfg80211_scan_info info = {
3440 .aborted = ((ar->scan.state ==
3441 ATH11K_SCAN_ABORTING) ||
3443 ATH11K_SCAN_STARTING)),
3446 ieee80211_scan_completed(ar->hw, &info);
3449 ar->scan.state = ATH11K_SCAN_IDLE;
3450 ar->scan_channel = NULL;
3451 ar->scan.roc_freq = 0;
3452 cancel_delayed_work(&ar->scan.timeout);
3453 complete(&ar->scan.completed);
3458 void ath11k_mac_scan_finish(struct ath11k *ar)
3460 spin_lock_bh(&ar->data_lock);
3461 __ath11k_mac_scan_finish(ar);
3462 spin_unlock_bh(&ar->data_lock);
3465 static int ath11k_scan_stop(struct ath11k *ar)
3467 struct scan_cancel_param arg = {
3468 .req_type = WLAN_SCAN_CANCEL_SINGLE,
3469 .scan_id = ATH11K_SCAN_ID,
3473 lockdep_assert_held(&ar->conf_mutex);
3475 /* TODO: Fill other STOP Params */
3476 arg.pdev_id = ar->pdev->pdev_id;
3478 ret = ath11k_wmi_send_scan_stop_cmd(ar, &arg);
3480 ath11k_warn(ar->ab, "failed to stop wmi scan: %d\n", ret);
3484 ret = wait_for_completion_timeout(&ar->scan.completed, 3 * HZ);
3487 "failed to receive scan abort comple: timed out\n");
3489 } else if (ret > 0) {
3494 /* Scan state should be updated upon scan completion but in case
3495 * firmware fails to deliver the event (for whatever reason) it is
3496 * desired to clean up scan state anyway. Firmware may have just
3497 * dropped the scan completion event delivery due to transport pipe
3498 * being overflown with data and/or it can recover on its own before
3499 * next scan request is submitted.
3501 spin_lock_bh(&ar->data_lock);
3502 if (ar->scan.state != ATH11K_SCAN_IDLE)
3503 __ath11k_mac_scan_finish(ar);
3504 spin_unlock_bh(&ar->data_lock);
3509 static void ath11k_scan_abort(struct ath11k *ar)
3513 lockdep_assert_held(&ar->conf_mutex);
3515 spin_lock_bh(&ar->data_lock);
3517 switch (ar->scan.state) {
3518 case ATH11K_SCAN_IDLE:
3519 /* This can happen if timeout worker kicked in and called
3520 * abortion while scan completion was being processed.
3523 case ATH11K_SCAN_STARTING:
3524 case ATH11K_SCAN_ABORTING:
3525 ath11k_warn(ar->ab, "refusing scan abortion due to invalid scan state: %d\n",
3528 case ATH11K_SCAN_RUNNING:
3529 ar->scan.state = ATH11K_SCAN_ABORTING;
3530 spin_unlock_bh(&ar->data_lock);
3532 ret = ath11k_scan_stop(ar);
3534 ath11k_warn(ar->ab, "failed to abort scan: %d\n", ret);
3536 spin_lock_bh(&ar->data_lock);
3540 spin_unlock_bh(&ar->data_lock);
3543 static void ath11k_scan_timeout_work(struct work_struct *work)
3545 struct ath11k *ar = container_of(work, struct ath11k,
3548 mutex_lock(&ar->conf_mutex);
3549 ath11k_scan_abort(ar);
3550 mutex_unlock(&ar->conf_mutex);
3553 static int ath11k_start_scan(struct ath11k *ar,
3554 struct scan_req_params *arg)
3557 unsigned long timeout = 1 * HZ;
3559 lockdep_assert_held(&ar->conf_mutex);
3561 if (ath11k_spectral_get_mode(ar) == ATH11K_SPECTRAL_BACKGROUND)
3562 ath11k_spectral_reset_buffer(ar);
3564 ret = ath11k_wmi_send_scan_start_cmd(ar, arg);
3568 if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map)) {
3571 if (ar->supports_6ghz)
3575 ret = wait_for_completion_timeout(&ar->scan.started, timeout);
3577 ret = ath11k_scan_stop(ar);
3579 ath11k_warn(ar->ab, "failed to stop scan: %d\n", ret);
3584 /* If we failed to start the scan, return error code at
3585 * this point. This is probably due to some issue in the
3586 * firmware, but no need to wedge the driver due to that...
3588 spin_lock_bh(&ar->data_lock);
3589 if (ar->scan.state == ATH11K_SCAN_IDLE) {
3590 spin_unlock_bh(&ar->data_lock);
3593 spin_unlock_bh(&ar->data_lock);
3598 static int ath11k_mac_op_hw_scan(struct ieee80211_hw *hw,
3599 struct ieee80211_vif *vif,
3600 struct ieee80211_scan_request *hw_req)
3602 struct ath11k *ar = hw->priv;
3603 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
3604 struct cfg80211_scan_request *req = &hw_req->req;
3605 struct scan_req_params arg;
3609 mutex_lock(&ar->conf_mutex);
3611 spin_lock_bh(&ar->data_lock);
3612 switch (ar->scan.state) {
3613 case ATH11K_SCAN_IDLE:
3614 reinit_completion(&ar->scan.started);
3615 reinit_completion(&ar->scan.completed);
3616 ar->scan.state = ATH11K_SCAN_STARTING;
3617 ar->scan.is_roc = false;
3618 ar->scan.vdev_id = arvif->vdev_id;
3621 case ATH11K_SCAN_STARTING:
3622 case ATH11K_SCAN_RUNNING:
3623 case ATH11K_SCAN_ABORTING:
3627 spin_unlock_bh(&ar->data_lock);
3632 memset(&arg, 0, sizeof(arg));
3633 ath11k_wmi_start_scan_init(ar, &arg);
3634 arg.vdev_id = arvif->vdev_id;
3635 arg.scan_id = ATH11K_SCAN_ID;
3638 arg.extraie.ptr = kmemdup(req->ie, req->ie_len, GFP_KERNEL);
3639 if (!arg.extraie.ptr) {
3643 arg.extraie.len = req->ie_len;
3647 arg.num_ssids = req->n_ssids;
3648 for (i = 0; i < arg.num_ssids; i++) {
3649 arg.ssid[i].length = req->ssids[i].ssid_len;
3650 memcpy(&arg.ssid[i].ssid, req->ssids[i].ssid,
3651 req->ssids[i].ssid_len);
3654 arg.scan_flags |= WMI_SCAN_FLAG_PASSIVE;
3657 if (req->n_channels) {
3658 arg.num_chan = req->n_channels;
3659 arg.chan_list = kcalloc(arg.num_chan, sizeof(*arg.chan_list),
3662 if (!arg.chan_list) {
3667 for (i = 0; i < arg.num_chan; i++)
3668 arg.chan_list[i] = req->channels[i]->center_freq;
3671 if (req->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
3672 arg.scan_f_add_spoofed_mac_in_probe = 1;
3673 ether_addr_copy(arg.mac_addr.addr, req->mac_addr);
3674 ether_addr_copy(arg.mac_mask.addr, req->mac_addr_mask);
3677 ret = ath11k_start_scan(ar, &arg);
3679 ath11k_warn(ar->ab, "failed to start hw scan: %d\n", ret);
3680 spin_lock_bh(&ar->data_lock);
3681 ar->scan.state = ATH11K_SCAN_IDLE;
3682 spin_unlock_bh(&ar->data_lock);
3685 /* Add a 200ms margin to account for event/command processing */
3686 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
3687 msecs_to_jiffies(arg.max_scan_time +
3688 ATH11K_MAC_SCAN_TIMEOUT_MSECS));
3691 kfree(arg.chan_list);
3694 kfree(arg.extraie.ptr);
3696 mutex_unlock(&ar->conf_mutex);
3698 if (ar->state_11d == ATH11K_11D_PREPARING)
3699 ath11k_mac_11d_scan_start(ar, arvif->vdev_id);
3704 static void ath11k_mac_op_cancel_hw_scan(struct ieee80211_hw *hw,
3705 struct ieee80211_vif *vif)
3707 struct ath11k *ar = hw->priv;
3709 mutex_lock(&ar->conf_mutex);
3710 ath11k_scan_abort(ar);
3711 mutex_unlock(&ar->conf_mutex);
3713 cancel_delayed_work_sync(&ar->scan.timeout);
3716 static int ath11k_install_key(struct ath11k_vif *arvif,
3717 struct ieee80211_key_conf *key,
3718 enum set_key_cmd cmd,
3719 const u8 *macaddr, u32 flags)
3722 struct ath11k *ar = arvif->ar;
3723 struct wmi_vdev_install_key_arg arg = {
3724 .vdev_id = arvif->vdev_id,
3725 .key_idx = key->keyidx,
3726 .key_len = key->keylen,
3727 .key_data = key->key,
3732 lockdep_assert_held(&arvif->ar->conf_mutex);
3734 reinit_completion(&ar->install_key_done);
3736 if (test_bit(ATH11K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags))
3739 if (cmd == DISABLE_KEY) {
3740 arg.key_cipher = WMI_CIPHER_NONE;
3741 arg.key_data = NULL;
3745 switch (key->cipher) {
3746 case WLAN_CIPHER_SUITE_CCMP:
3747 arg.key_cipher = WMI_CIPHER_AES_CCM;
3748 /* TODO: Re-check if flag is valid */
3749 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT;
3751 case WLAN_CIPHER_SUITE_TKIP:
3752 arg.key_cipher = WMI_CIPHER_TKIP;
3753 arg.key_txmic_len = 8;
3754 arg.key_rxmic_len = 8;
3756 case WLAN_CIPHER_SUITE_CCMP_256:
3757 arg.key_cipher = WMI_CIPHER_AES_CCM;
3759 case WLAN_CIPHER_SUITE_GCMP:
3760 case WLAN_CIPHER_SUITE_GCMP_256:
3761 arg.key_cipher = WMI_CIPHER_AES_GCM;
3764 ath11k_warn(ar->ab, "cipher %d is not supported\n", key->cipher);
3768 if (test_bit(ATH11K_FLAG_RAW_MODE, &ar->ab->dev_flags))
3769 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV |
3770 IEEE80211_KEY_FLAG_RESERVE_TAILROOM;
3773 ret = ath11k_wmi_vdev_install_key(arvif->ar, &arg);
3778 if (!wait_for_completion_timeout(&ar->install_key_done, 1 * HZ))
3781 return ar->install_key_status ? -EINVAL : 0;
3784 static int ath11k_clear_peer_keys(struct ath11k_vif *arvif,
3787 struct ath11k *ar = arvif->ar;
3788 struct ath11k_base *ab = ar->ab;
3789 struct ath11k_peer *peer;
3790 int first_errno = 0;
3795 lockdep_assert_held(&ar->conf_mutex);
3797 spin_lock_bh(&ab->base_lock);
3798 peer = ath11k_peer_find(ab, arvif->vdev_id, addr);
3799 spin_unlock_bh(&ab->base_lock);
3804 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
3808 /* key flags are not required to delete the key */
3809 ret = ath11k_install_key(arvif, peer->keys[i],
3810 DISABLE_KEY, addr, flags);
3811 if (ret < 0 && first_errno == 0)
3815 ath11k_warn(ab, "failed to remove peer key %d: %d\n",
3818 spin_lock_bh(&ab->base_lock);
3819 peer->keys[i] = NULL;
3820 spin_unlock_bh(&ab->base_lock);
3826 static int ath11k_mac_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
3827 struct ieee80211_vif *vif, struct ieee80211_sta *sta,
3828 struct ieee80211_key_conf *key)
3830 struct ath11k *ar = hw->priv;
3831 struct ath11k_base *ab = ar->ab;
3832 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
3833 struct ath11k_peer *peer;
3834 struct ath11k_sta *arsta;
3835 const u8 *peer_addr;
3839 /* BIP needs to be done in software */
3840 if (key->cipher == WLAN_CIPHER_SUITE_AES_CMAC ||
3841 key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_128 ||
3842 key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_256 ||
3843 key->cipher == WLAN_CIPHER_SUITE_BIP_CMAC_256)
3846 if (test_bit(ATH11K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags))
3849 if (key->keyidx > WMI_MAX_KEY_INDEX)
3852 mutex_lock(&ar->conf_mutex);
3855 peer_addr = sta->addr;
3856 else if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
3857 peer_addr = vif->bss_conf.bssid;
3859 peer_addr = vif->addr;
3861 key->hw_key_idx = key->keyidx;
3863 /* the peer should not disappear in mid-way (unless FW goes awry) since
3864 * we already hold conf_mutex. we just make sure its there now.
3866 spin_lock_bh(&ab->base_lock);
3867 peer = ath11k_peer_find(ab, arvif->vdev_id, peer_addr);
3869 /* flush the fragments cache during key (re)install to
3870 * ensure all frags in the new frag list belong to the same key.
3872 if (peer && sta && cmd == SET_KEY)
3873 ath11k_peer_frags_flush(ar, peer);
3874 spin_unlock_bh(&ab->base_lock);
3877 if (cmd == SET_KEY) {
3878 ath11k_warn(ab, "cannot install key for non-existent peer %pM\n",
3883 /* if the peer doesn't exist there is no key to disable
3890 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
3891 flags |= WMI_KEY_PAIRWISE;
3893 flags |= WMI_KEY_GROUP;
3895 ret = ath11k_install_key(arvif, key, cmd, peer_addr, flags);
3897 ath11k_warn(ab, "ath11k_install_key failed (%d)\n", ret);
3901 ret = ath11k_dp_peer_rx_pn_replay_config(arvif, peer_addr, cmd, key);
3903 ath11k_warn(ab, "failed to offload PN replay detection %d\n", ret);
3907 spin_lock_bh(&ab->base_lock);
3908 peer = ath11k_peer_find(ab, arvif->vdev_id, peer_addr);
3909 if (peer && cmd == SET_KEY) {
3910 peer->keys[key->keyidx] = key;
3911 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) {
3912 peer->ucast_keyidx = key->keyidx;
3913 peer->sec_type = ath11k_dp_tx_get_encrypt_type(key->cipher);
3915 peer->mcast_keyidx = key->keyidx;
3916 peer->sec_type_grp = ath11k_dp_tx_get_encrypt_type(key->cipher);
3918 } else if (peer && cmd == DISABLE_KEY) {
3919 peer->keys[key->keyidx] = NULL;
3920 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
3921 peer->ucast_keyidx = 0;
3923 peer->mcast_keyidx = 0;
3925 /* impossible unless FW goes crazy */
3926 ath11k_warn(ab, "peer %pM disappeared!\n", peer_addr);
3929 arsta = (struct ath11k_sta *)sta->drv_priv;
3931 switch (key->cipher) {
3932 case WLAN_CIPHER_SUITE_TKIP:
3933 case WLAN_CIPHER_SUITE_CCMP:
3934 case WLAN_CIPHER_SUITE_CCMP_256:
3935 case WLAN_CIPHER_SUITE_GCMP:
3936 case WLAN_CIPHER_SUITE_GCMP_256:
3938 arsta->pn_type = HAL_PN_TYPE_WPA;
3940 arsta->pn_type = HAL_PN_TYPE_NONE;
3943 arsta->pn_type = HAL_PN_TYPE_NONE;
3948 spin_unlock_bh(&ab->base_lock);
3951 mutex_unlock(&ar->conf_mutex);
3956 ath11k_mac_bitrate_mask_num_vht_rates(struct ath11k *ar,
3957 enum nl80211_band band,
3958 const struct cfg80211_bitrate_mask *mask)
3963 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++)
3964 num_rates += hweight16(mask->control[band].vht_mcs[i]);
3970 ath11k_mac_bitrate_mask_num_he_rates(struct ath11k *ar,
3971 enum nl80211_band band,
3972 const struct cfg80211_bitrate_mask *mask)
3977 for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++)
3978 num_rates += hweight16(mask->control[band].he_mcs[i]);
3984 ath11k_mac_set_peer_vht_fixed_rate(struct ath11k_vif *arvif,
3985 struct ieee80211_sta *sta,
3986 const struct cfg80211_bitrate_mask *mask,
3987 enum nl80211_band band)
3989 struct ath11k *ar = arvif->ar;
3994 lockdep_assert_held(&ar->conf_mutex);
3998 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
3999 if (hweight16(mask->control[band].vht_mcs[i]) == 1) {
4001 vht_rate = ffs(mask->control[band].vht_mcs[i]) - 1;
4006 ath11k_warn(ar->ab, "No single VHT Fixed rate found to set for %pM",
4011 /* Avoid updating invalid nss as fixed rate*/
4012 if (nss > sta->deflink.rx_nss)
4015 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
4016 "Setting Fixed VHT Rate for peer %pM. Device will not switch to any other selected rates",
4019 rate_code = ATH11K_HW_RATE_CODE(vht_rate, nss - 1,
4020 WMI_RATE_PREAMBLE_VHT);
4021 ret = ath11k_wmi_set_peer_param(ar, sta->addr,
4023 WMI_PEER_PARAM_FIXED_RATE,
4027 "failed to update STA %pM Fixed Rate %d: %d\n",
4028 sta->addr, rate_code, ret);
4034 ath11k_mac_set_peer_he_fixed_rate(struct ath11k_vif *arvif,
4035 struct ieee80211_sta *sta,
4036 const struct cfg80211_bitrate_mask *mask,
4037 enum nl80211_band band)
4039 struct ath11k *ar = arvif->ar;
4044 lockdep_assert_held(&ar->conf_mutex);
4048 for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) {
4049 if (hweight16(mask->control[band].he_mcs[i]) == 1) {
4051 he_rate = ffs(mask->control[band].he_mcs[i]) - 1;
4056 ath11k_warn(ar->ab, "No single he fixed rate found to set for %pM",
4061 /* Avoid updating invalid nss as fixed rate */
4062 if (nss > sta->deflink.rx_nss)
4065 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
4066 "mac setting fixed he rate for peer %pM, device will not switch to any other selected rates",
4069 rate_code = ATH11K_HW_RATE_CODE(he_rate, nss - 1,
4070 WMI_RATE_PREAMBLE_HE);
4072 ret = ath11k_wmi_set_peer_param(ar, sta->addr,
4074 WMI_PEER_PARAM_FIXED_RATE,
4078 "failed to update sta %pM fixed rate %d: %d\n",
4079 sta->addr, rate_code, ret);
4084 static int ath11k_station_assoc(struct ath11k *ar,
4085 struct ieee80211_vif *vif,
4086 struct ieee80211_sta *sta,
4089 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
4090 struct peer_assoc_params peer_arg;
4092 struct cfg80211_chan_def def;
4093 enum nl80211_band band;
4094 struct cfg80211_bitrate_mask *mask;
4095 u8 num_vht_rates, num_he_rates;
4097 lockdep_assert_held(&ar->conf_mutex);
4099 if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
4102 band = def.chan->band;
4103 mask = &arvif->bitrate_mask;
4105 ath11k_peer_assoc_prepare(ar, vif, sta, &peer_arg, reassoc);
4107 peer_arg.is_assoc = true;
4108 ret = ath11k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
4110 ath11k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n",
4111 sta->addr, arvif->vdev_id, ret);
4115 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) {
4116 ath11k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
4117 sta->addr, arvif->vdev_id);
4121 num_vht_rates = ath11k_mac_bitrate_mask_num_vht_rates(ar, band, mask);
4122 num_he_rates = ath11k_mac_bitrate_mask_num_he_rates(ar, band, mask);
4124 /* If single VHT/HE rate is configured (by set_bitrate_mask()),
4125 * peer_assoc will disable VHT/HE. This is now enabled by a peer specific
4127 * Note that all other rates and NSS will be disabled for this peer.
4129 if (sta->deflink.vht_cap.vht_supported && num_vht_rates == 1) {
4130 ret = ath11k_mac_set_peer_vht_fixed_rate(arvif, sta, mask,
4134 } else if (sta->deflink.he_cap.has_he && num_he_rates == 1) {
4135 ret = ath11k_mac_set_peer_he_fixed_rate(arvif, sta, mask,
4141 /* Re-assoc is run only to update supported rates for given station. It
4142 * doesn't make much sense to reconfigure the peer completely.
4147 ret = ath11k_setup_peer_smps(ar, arvif, sta->addr,
4148 &sta->deflink.ht_cap,
4149 le16_to_cpu(sta->deflink.he_6ghz_capa.capa));
4151 ath11k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n",
4152 arvif->vdev_id, ret);
4157 arvif->num_legacy_stations++;
4158 ret = ath11k_recalc_rtscts_prot(arvif);
4163 if (sta->wme && sta->uapsd_queues) {
4164 ret = ath11k_peer_assoc_qos_ap(ar, arvif, sta);
4166 ath11k_warn(ar->ab, "failed to set qos params for STA %pM for vdev %i: %d\n",
4167 sta->addr, arvif->vdev_id, ret);
4175 static int ath11k_station_disassoc(struct ath11k *ar,
4176 struct ieee80211_vif *vif,
4177 struct ieee80211_sta *sta)
4179 struct ath11k_vif *arvif = (void *)vif->drv_priv;
4182 lockdep_assert_held(&ar->conf_mutex);
4185 arvif->num_legacy_stations--;
4186 ret = ath11k_recalc_rtscts_prot(arvif);
4191 ret = ath11k_clear_peer_keys(arvif, sta->addr);
4193 ath11k_warn(ar->ab, "failed to clear all peer keys for vdev %i: %d\n",
4194 arvif->vdev_id, ret);
4200 static void ath11k_sta_rc_update_wk(struct work_struct *wk)
4203 struct ath11k_vif *arvif;
4204 struct ath11k_sta *arsta;
4205 struct ieee80211_sta *sta;
4206 struct cfg80211_chan_def def;
4207 enum nl80211_band band;
4208 const u8 *ht_mcs_mask;
4209 const u16 *vht_mcs_mask;
4210 const u16 *he_mcs_mask;
4211 u32 changed, bw, nss, smps;
4212 int err, num_vht_rates, num_he_rates;
4213 const struct cfg80211_bitrate_mask *mask;
4214 struct peer_assoc_params peer_arg;
4216 arsta = container_of(wk, struct ath11k_sta, update_wk);
4217 sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv);
4218 arvif = arsta->arvif;
4221 if (WARN_ON(ath11k_mac_vif_chan(arvif->vif, &def)))
4224 band = def.chan->band;
4225 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
4226 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
4227 he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs;
4229 spin_lock_bh(&ar->data_lock);
4231 changed = arsta->changed;
4238 spin_unlock_bh(&ar->data_lock);
4240 mutex_lock(&ar->conf_mutex);
4242 nss = max_t(u32, 1, nss);
4243 nss = min(nss, max(max(ath11k_mac_max_ht_nss(ht_mcs_mask),
4244 ath11k_mac_max_vht_nss(vht_mcs_mask)),
4245 ath11k_mac_max_he_nss(he_mcs_mask)));
4247 if (changed & IEEE80211_RC_BW_CHANGED) {
4248 /* Send peer assoc command before set peer bandwidth param to
4249 * avoid the mismatch between the peer phymode and the peer
4252 ath11k_peer_assoc_prepare(ar, arvif->vif, sta, &peer_arg, true);
4254 peer_arg.is_assoc = false;
4255 err = ath11k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
4257 ath11k_warn(ar->ab, "failed to send peer assoc for STA %pM vdev %i: %d\n",
4258 sta->addr, arvif->vdev_id, err);
4259 } else if (wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) {
4260 err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
4261 WMI_PEER_CHWIDTH, bw);
4263 ath11k_warn(ar->ab, "failed to update STA %pM peer bw %d: %d\n",
4264 sta->addr, bw, err);
4266 ath11k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
4267 sta->addr, arvif->vdev_id);
4271 if (changed & IEEE80211_RC_NSS_CHANGED) {
4272 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac update sta %pM nss %d\n",
4275 err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
4278 ath11k_warn(ar->ab, "failed to update STA %pM nss %d: %d\n",
4279 sta->addr, nss, err);
4282 if (changed & IEEE80211_RC_SMPS_CHANGED) {
4283 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac update sta %pM smps %d\n",
4286 err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
4287 WMI_PEER_MIMO_PS_STATE, smps);
4289 ath11k_warn(ar->ab, "failed to update STA %pM smps %d: %d\n",
4290 sta->addr, smps, err);
4293 if (changed & IEEE80211_RC_SUPP_RATES_CHANGED) {
4294 mask = &arvif->bitrate_mask;
4295 num_vht_rates = ath11k_mac_bitrate_mask_num_vht_rates(ar, band,
4297 num_he_rates = ath11k_mac_bitrate_mask_num_he_rates(ar, band,
4300 /* Peer_assoc_prepare will reject vht rates in
4301 * bitrate_mask if its not available in range format and
4302 * sets vht tx_rateset as unsupported. So multiple VHT MCS
4303 * setting(eg. MCS 4,5,6) per peer is not supported here.
4304 * But, Single rate in VHT mask can be set as per-peer
4305 * fixed rate. But even if any HT rates are configured in
4306 * the bitrate mask, device will not switch to those rates
4307 * when per-peer Fixed rate is set.
4308 * TODO: Check RATEMASK_CMDID to support auto rates selection
4309 * across HT/VHT and for multiple VHT MCS support.
4311 if (sta->deflink.vht_cap.vht_supported && num_vht_rates == 1) {
4312 ath11k_mac_set_peer_vht_fixed_rate(arvif, sta, mask,
4314 } else if (sta->deflink.he_cap.has_he && num_he_rates == 1) {
4315 ath11k_mac_set_peer_he_fixed_rate(arvif, sta, mask,
4318 /* If the peer is non-VHT/HE or no fixed VHT/HE rate
4319 * is provided in the new bitrate mask we set the
4320 * other rates using peer_assoc command. Also clear
4321 * the peer fixed rate settings as it has higher proprity
4324 err = ath11k_wmi_set_peer_param(ar, sta->addr,
4326 WMI_PEER_PARAM_FIXED_RATE,
4327 WMI_FIXED_RATE_NONE);
4330 "failed to disable peer fixed rate for sta %pM: %d\n",
4333 ath11k_peer_assoc_prepare(ar, arvif->vif, sta,
4336 peer_arg.is_assoc = false;
4337 err = ath11k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
4339 ath11k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n",
4340 sta->addr, arvif->vdev_id, err);
4342 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ))
4343 ath11k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
4344 sta->addr, arvif->vdev_id);
4348 mutex_unlock(&ar->conf_mutex);
4351 static void ath11k_sta_set_4addr_wk(struct work_struct *wk)
4354 struct ath11k_vif *arvif;
4355 struct ath11k_sta *arsta;
4356 struct ieee80211_sta *sta;
4359 arsta = container_of(wk, struct ath11k_sta, set_4addr_wk);
4360 sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv);
4361 arvif = arsta->arvif;
4364 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
4365 "setting USE_4ADDR for peer %pM\n", sta->addr);
4367 ret = ath11k_wmi_set_peer_param(ar, sta->addr,
4369 WMI_PEER_USE_4ADDR, 1);
4372 ath11k_warn(ar->ab, "failed to set peer %pM 4addr capability: %d\n",
4376 static int ath11k_mac_inc_num_stations(struct ath11k_vif *arvif,
4377 struct ieee80211_sta *sta)
4379 struct ath11k *ar = arvif->ar;
4381 lockdep_assert_held(&ar->conf_mutex);
4383 if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
4386 if (ar->num_stations >= ar->max_num_stations)
4394 static void ath11k_mac_dec_num_stations(struct ath11k_vif *arvif,
4395 struct ieee80211_sta *sta)
4397 struct ath11k *ar = arvif->ar;
4399 lockdep_assert_held(&ar->conf_mutex);
4401 if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
4407 static int ath11k_mac_station_add(struct ath11k *ar,
4408 struct ieee80211_vif *vif,
4409 struct ieee80211_sta *sta)
4411 struct ath11k_base *ab = ar->ab;
4412 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
4413 struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
4414 struct peer_create_params peer_param;
4417 lockdep_assert_held(&ar->conf_mutex);
4419 ret = ath11k_mac_inc_num_stations(arvif, sta);
4421 ath11k_warn(ab, "refusing to associate station: too many connected already (%d)\n",
4422 ar->max_num_stations);
4426 arsta->rx_stats = kzalloc(sizeof(*arsta->rx_stats), GFP_KERNEL);
4427 if (!arsta->rx_stats) {
4429 goto dec_num_station;
4432 peer_param.vdev_id = arvif->vdev_id;
4433 peer_param.peer_addr = sta->addr;
4434 peer_param.peer_type = WMI_PEER_TYPE_DEFAULT;
4436 ret = ath11k_peer_create(ar, arvif, sta, &peer_param);
4438 ath11k_warn(ab, "Failed to add peer: %pM for VDEV: %d\n",
4439 sta->addr, arvif->vdev_id);
4443 ath11k_dbg(ab, ATH11K_DBG_MAC, "Added peer: %pM for VDEV: %d\n",
4444 sta->addr, arvif->vdev_id);
4446 if (ath11k_debugfs_is_extd_tx_stats_enabled(ar)) {
4447 arsta->tx_stats = kzalloc(sizeof(*arsta->tx_stats), GFP_KERNEL);
4448 if (!arsta->tx_stats) {
4454 if (ieee80211_vif_is_mesh(vif)) {
4455 ath11k_dbg(ab, ATH11K_DBG_MAC,
4456 "setting USE_4ADDR for mesh STA %pM\n", sta->addr);
4457 ret = ath11k_wmi_set_peer_param(ar, sta->addr,
4459 WMI_PEER_USE_4ADDR, 1);
4461 ath11k_warn(ab, "failed to set mesh STA %pM 4addr capability: %d\n",
4467 ret = ath11k_dp_peer_setup(ar, arvif->vdev_id, sta->addr);
4469 ath11k_warn(ab, "failed to setup dp for peer %pM on vdev %i (%d)\n",
4470 sta->addr, arvif->vdev_id, ret);
4474 if (ab->hw_params.vdev_start_delay &&
4475 !arvif->is_started &&
4476 arvif->vdev_type != WMI_VDEV_TYPE_AP) {
4477 ret = ath11k_start_vdev_delay(ar->hw, vif);
4479 ath11k_warn(ab, "failed to delay vdev start: %d\n", ret);
4484 ewma_avg_rssi_init(&arsta->avg_rssi);
4488 kfree(arsta->tx_stats);
4489 arsta->tx_stats = NULL;
4491 ath11k_peer_delete(ar, arvif->vdev_id, sta->addr);
4493 kfree(arsta->rx_stats);
4494 arsta->rx_stats = NULL;
4496 ath11k_mac_dec_num_stations(arvif, sta);
4501 static int ath11k_mac_op_sta_state(struct ieee80211_hw *hw,
4502 struct ieee80211_vif *vif,
4503 struct ieee80211_sta *sta,
4504 enum ieee80211_sta_state old_state,
4505 enum ieee80211_sta_state new_state)
4507 struct ath11k *ar = hw->priv;
4508 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
4509 struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
4510 struct ath11k_peer *peer;
4513 /* cancel must be done outside the mutex to avoid deadlock */
4514 if ((old_state == IEEE80211_STA_NONE &&
4515 new_state == IEEE80211_STA_NOTEXIST)) {
4516 cancel_work_sync(&arsta->update_wk);
4517 cancel_work_sync(&arsta->set_4addr_wk);
4520 mutex_lock(&ar->conf_mutex);
4522 if (old_state == IEEE80211_STA_NOTEXIST &&
4523 new_state == IEEE80211_STA_NONE) {
4524 memset(arsta, 0, sizeof(*arsta));
4525 arsta->arvif = arvif;
4526 INIT_WORK(&arsta->update_wk, ath11k_sta_rc_update_wk);
4527 INIT_WORK(&arsta->set_4addr_wk, ath11k_sta_set_4addr_wk);
4529 ret = ath11k_mac_station_add(ar, vif, sta);
4531 ath11k_warn(ar->ab, "Failed to add station: %pM for VDEV: %d\n",
4532 sta->addr, arvif->vdev_id);
4533 } else if ((old_state == IEEE80211_STA_NONE &&
4534 new_state == IEEE80211_STA_NOTEXIST)) {
4535 bool skip_peer_delete = ar->ab->hw_params.vdev_start_delay &&
4536 vif->type == NL80211_IFTYPE_STATION;
4538 ath11k_dp_peer_cleanup(ar, arvif->vdev_id, sta->addr);
4540 if (!skip_peer_delete) {
4541 ret = ath11k_peer_delete(ar, arvif->vdev_id, sta->addr);
4544 "Failed to delete peer: %pM for VDEV: %d\n",
4545 sta->addr, arvif->vdev_id);
4549 "Removed peer: %pM for VDEV: %d\n",
4550 sta->addr, arvif->vdev_id);
4553 ath11k_mac_dec_num_stations(arvif, sta);
4554 mutex_lock(&ar->ab->tbl_mtx_lock);
4555 spin_lock_bh(&ar->ab->base_lock);
4556 peer = ath11k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
4557 if (skip_peer_delete && peer) {
4559 } else if (peer && peer->sta == sta) {
4560 ath11k_warn(ar->ab, "Found peer entry %pM n vdev %i after it was supposedly removed\n",
4561 vif->addr, arvif->vdev_id);
4562 ath11k_peer_rhash_delete(ar->ab, peer);
4564 list_del(&peer->list);
4568 spin_unlock_bh(&ar->ab->base_lock);
4569 mutex_unlock(&ar->ab->tbl_mtx_lock);
4571 kfree(arsta->tx_stats);
4572 arsta->tx_stats = NULL;
4574 kfree(arsta->rx_stats);
4575 arsta->rx_stats = NULL;
4576 } else if (old_state == IEEE80211_STA_AUTH &&
4577 new_state == IEEE80211_STA_ASSOC &&
4578 (vif->type == NL80211_IFTYPE_AP ||
4579 vif->type == NL80211_IFTYPE_MESH_POINT ||
4580 vif->type == NL80211_IFTYPE_ADHOC)) {
4581 ret = ath11k_station_assoc(ar, vif, sta, false);
4583 ath11k_warn(ar->ab, "Failed to associate station: %pM\n",
4585 } else if (old_state == IEEE80211_STA_ASSOC &&
4586 new_state == IEEE80211_STA_AUTHORIZED) {
4587 spin_lock_bh(&ar->ab->base_lock);
4589 peer = ath11k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
4591 peer->is_authorized = true;
4593 spin_unlock_bh(&ar->ab->base_lock);
4595 if (vif->type == NL80211_IFTYPE_STATION && arvif->is_up) {
4596 ret = ath11k_wmi_set_peer_param(ar, sta->addr,
4601 ath11k_warn(ar->ab, "Unable to authorize peer %pM vdev %d: %d\n",
4602 sta->addr, arvif->vdev_id, ret);
4604 } else if (old_state == IEEE80211_STA_AUTHORIZED &&
4605 new_state == IEEE80211_STA_ASSOC) {
4606 spin_lock_bh(&ar->ab->base_lock);
4608 peer = ath11k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
4610 peer->is_authorized = false;
4612 spin_unlock_bh(&ar->ab->base_lock);
4613 } else if (old_state == IEEE80211_STA_ASSOC &&
4614 new_state == IEEE80211_STA_AUTH &&
4615 (vif->type == NL80211_IFTYPE_AP ||
4616 vif->type == NL80211_IFTYPE_MESH_POINT ||
4617 vif->type == NL80211_IFTYPE_ADHOC)) {
4618 ret = ath11k_station_disassoc(ar, vif, sta);
4620 ath11k_warn(ar->ab, "Failed to disassociate station: %pM\n",
4624 mutex_unlock(&ar->conf_mutex);
4628 static int ath11k_mac_op_sta_set_txpwr(struct ieee80211_hw *hw,
4629 struct ieee80211_vif *vif,
4630 struct ieee80211_sta *sta)
4632 struct ath11k *ar = hw->priv;
4633 struct ath11k_vif *arvif = (void *)vif->drv_priv;
4637 if (sta->deflink.txpwr.type == NL80211_TX_POWER_AUTOMATIC) {
4640 txpwr = sta->deflink.txpwr.power;
4645 if (txpwr > ATH11K_TX_POWER_MAX_VAL || txpwr < ATH11K_TX_POWER_MIN_VAL)
4648 mutex_lock(&ar->conf_mutex);
4650 ret = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
4651 WMI_PEER_USE_FIXED_PWR, txpwr);
4653 ath11k_warn(ar->ab, "failed to set tx power for station ret: %d\n",
4659 mutex_unlock(&ar->conf_mutex);
4663 static void ath11k_mac_op_sta_set_4addr(struct ieee80211_hw *hw,
4664 struct ieee80211_vif *vif,
4665 struct ieee80211_sta *sta, bool enabled)
4667 struct ath11k *ar = hw->priv;
4668 struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
4670 if (enabled && !arsta->use_4addr_set) {
4671 ieee80211_queue_work(ar->hw, &arsta->set_4addr_wk);
4672 arsta->use_4addr_set = true;
4676 static void ath11k_mac_op_sta_rc_update(struct ieee80211_hw *hw,
4677 struct ieee80211_vif *vif,
4678 struct ieee80211_sta *sta,
4681 struct ath11k *ar = hw->priv;
4682 struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
4683 struct ath11k_vif *arvif = (void *)vif->drv_priv;
4684 struct ath11k_peer *peer;
4687 spin_lock_bh(&ar->ab->base_lock);
4689 peer = ath11k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
4691 spin_unlock_bh(&ar->ab->base_lock);
4692 ath11k_warn(ar->ab, "mac sta rc update failed to find peer %pM on vdev %i\n",
4693 sta->addr, arvif->vdev_id);
4697 spin_unlock_bh(&ar->ab->base_lock);
4699 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
4700 "mac sta rc update for %pM changed %08x bw %d nss %d smps %d\n",
4701 sta->addr, changed, sta->deflink.bandwidth,
4702 sta->deflink.rx_nss,
4705 spin_lock_bh(&ar->data_lock);
4707 if (changed & IEEE80211_RC_BW_CHANGED) {
4708 bw = WMI_PEER_CHWIDTH_20MHZ;
4710 switch (sta->deflink.bandwidth) {
4711 case IEEE80211_STA_RX_BW_20:
4712 bw = WMI_PEER_CHWIDTH_20MHZ;
4714 case IEEE80211_STA_RX_BW_40:
4715 bw = WMI_PEER_CHWIDTH_40MHZ;
4717 case IEEE80211_STA_RX_BW_80:
4718 bw = WMI_PEER_CHWIDTH_80MHZ;
4720 case IEEE80211_STA_RX_BW_160:
4721 bw = WMI_PEER_CHWIDTH_160MHZ;
4724 ath11k_warn(ar->ab, "Invalid bandwidth %d in rc update for %pM\n",
4725 sta->deflink.bandwidth, sta->addr);
4726 bw = WMI_PEER_CHWIDTH_20MHZ;
4733 if (changed & IEEE80211_RC_NSS_CHANGED)
4734 arsta->nss = sta->deflink.rx_nss;
4736 if (changed & IEEE80211_RC_SMPS_CHANGED) {
4737 smps = WMI_PEER_SMPS_PS_NONE;
4739 switch (sta->smps_mode) {
4740 case IEEE80211_SMPS_AUTOMATIC:
4741 case IEEE80211_SMPS_OFF:
4742 smps = WMI_PEER_SMPS_PS_NONE;
4744 case IEEE80211_SMPS_STATIC:
4745 smps = WMI_PEER_SMPS_STATIC;
4747 case IEEE80211_SMPS_DYNAMIC:
4748 smps = WMI_PEER_SMPS_DYNAMIC;
4751 ath11k_warn(ar->ab, "Invalid smps %d in sta rc update for %pM\n",
4752 sta->smps_mode, sta->addr);
4753 smps = WMI_PEER_SMPS_PS_NONE;
4760 arsta->changed |= changed;
4762 spin_unlock_bh(&ar->data_lock);
4764 ieee80211_queue_work(hw, &arsta->update_wk);
4767 static int ath11k_conf_tx_uapsd(struct ath11k *ar, struct ieee80211_vif *vif,
4768 u16 ac, bool enable)
4770 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
4774 if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
4778 case IEEE80211_AC_VO:
4779 value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN |
4780 WMI_STA_PS_UAPSD_AC3_TRIGGER_EN;
4782 case IEEE80211_AC_VI:
4783 value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN |
4784 WMI_STA_PS_UAPSD_AC2_TRIGGER_EN;
4786 case IEEE80211_AC_BE:
4787 value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN |
4788 WMI_STA_PS_UAPSD_AC1_TRIGGER_EN;
4790 case IEEE80211_AC_BK:
4791 value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN |
4792 WMI_STA_PS_UAPSD_AC0_TRIGGER_EN;
4797 arvif->u.sta.uapsd |= value;
4799 arvif->u.sta.uapsd &= ~value;
4801 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
4802 WMI_STA_PS_PARAM_UAPSD,
4803 arvif->u.sta.uapsd);
4805 ath11k_warn(ar->ab, "could not set uapsd params %d\n", ret);
4809 if (arvif->u.sta.uapsd)
4810 value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD;
4812 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
4814 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
4815 WMI_STA_PS_PARAM_RX_WAKE_POLICY,
4818 ath11k_warn(ar->ab, "could not set rx wake param %d\n", ret);
4824 static int ath11k_mac_op_conf_tx(struct ieee80211_hw *hw,
4825 struct ieee80211_vif *vif,
4826 unsigned int link_id, u16 ac,
4827 const struct ieee80211_tx_queue_params *params)
4829 struct ath11k *ar = hw->priv;
4830 struct ath11k_vif *arvif = (void *)vif->drv_priv;
4831 struct wmi_wmm_params_arg *p = NULL;
4834 mutex_lock(&ar->conf_mutex);
4837 case IEEE80211_AC_VO:
4838 p = &arvif->wmm_params.ac_vo;
4840 case IEEE80211_AC_VI:
4841 p = &arvif->wmm_params.ac_vi;
4843 case IEEE80211_AC_BE:
4844 p = &arvif->wmm_params.ac_be;
4846 case IEEE80211_AC_BK:
4847 p = &arvif->wmm_params.ac_bk;
4856 p->cwmin = params->cw_min;
4857 p->cwmax = params->cw_max;
4858 p->aifs = params->aifs;
4859 p->txop = params->txop;
4861 ret = ath11k_wmi_send_wmm_update_cmd_tlv(ar, arvif->vdev_id,
4862 &arvif->wmm_params);
4864 ath11k_warn(ar->ab, "failed to set wmm params: %d\n", ret);
4868 ret = ath11k_conf_tx_uapsd(ar, vif, ac, params->uapsd);
4871 ath11k_warn(ar->ab, "failed to set sta uapsd: %d\n", ret);
4874 mutex_unlock(&ar->conf_mutex);
4878 static struct ieee80211_sta_ht_cap
4879 ath11k_create_ht_cap(struct ath11k *ar, u32 ar_ht_cap, u32 rate_cap_rx_chainmask)
4882 struct ieee80211_sta_ht_cap ht_cap = {0};
4883 u32 ar_vht_cap = ar->pdev->cap.vht_cap;
4885 if (!(ar_ht_cap & WMI_HT_CAP_ENABLED))
4888 ht_cap.ht_supported = 1;
4889 ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
4890 ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_NONE;
4891 ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
4892 ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
4893 ht_cap.cap |= WLAN_HT_CAP_SM_PS_STATIC << IEEE80211_HT_CAP_SM_PS_SHIFT;
4895 if (ar_ht_cap & WMI_HT_CAP_HT20_SGI)
4896 ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
4898 if (ar_ht_cap & WMI_HT_CAP_HT40_SGI)
4899 ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
4901 if (ar_ht_cap & WMI_HT_CAP_DYNAMIC_SMPS) {
4904 smps = WLAN_HT_CAP_SM_PS_DYNAMIC;
4905 smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT;
4910 if (ar_ht_cap & WMI_HT_CAP_TX_STBC)
4911 ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC;
4913 if (ar_ht_cap & WMI_HT_CAP_RX_STBC) {
4917 stbc &= WMI_HT_CAP_RX_STBC;
4918 stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT;
4919 stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT;
4920 stbc &= IEEE80211_HT_CAP_RX_STBC;
4925 if (ar_ht_cap & WMI_HT_CAP_RX_LDPC)
4926 ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
4928 if (ar_ht_cap & WMI_HT_CAP_L_SIG_TXOP_PROT)
4929 ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
4931 if (ar_vht_cap & WMI_VHT_CAP_MAX_MPDU_LEN_MASK)
4932 ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU;
4934 for (i = 0; i < ar->num_rx_chains; i++) {
4935 if (rate_cap_rx_chainmask & BIT(i))
4936 ht_cap.mcs.rx_mask[i] = 0xFF;
4939 ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
4944 static int ath11k_mac_set_txbf_conf(struct ath11k_vif *arvif)
4947 struct ath11k *ar = arvif->ar;
4950 u32 vht_cap = ar->pdev->cap.vht_cap;
4951 u32 vdev_param = WMI_VDEV_PARAM_TXBF;
4953 if (vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)) {
4954 nsts = vht_cap & IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
4955 nsts >>= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
4956 value |= SM(nsts, WMI_TXBF_STS_CAP_OFFSET);
4959 if (vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)) {
4960 sound_dim = vht_cap &
4961 IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
4962 sound_dim >>= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
4963 if (sound_dim > (ar->num_tx_chains - 1))
4964 sound_dim = ar->num_tx_chains - 1;
4965 value |= SM(sound_dim, WMI_BF_SOUND_DIM_OFFSET);
4971 if (vht_cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE) {
4972 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
4974 if ((vht_cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE) &&
4975 arvif->vdev_type == WMI_VDEV_TYPE_AP)
4976 value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFER;
4979 /* TODO: SUBFEE not validated in HK, disable here until validated? */
4981 if (vht_cap & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE) {
4982 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
4984 if ((vht_cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE) &&
4985 arvif->vdev_type == WMI_VDEV_TYPE_STA)
4986 value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFEE;
4989 return ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4993 static void ath11k_set_vht_txbf_cap(struct ath11k *ar, u32 *vht_cap)
4995 bool subfer, subfee;
4998 subfer = !!(*vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE));
4999 subfee = !!(*vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE));
5001 if (ar->num_tx_chains < 2) {
5002 *vht_cap &= ~(IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE);
5006 /* If SU Beaformer is not set, then disable MU Beamformer Capability */
5008 *vht_cap &= ~(IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE);
5010 /* If SU Beaformee is not set, then disable MU Beamformee Capability */
5012 *vht_cap &= ~(IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE);
5014 sound_dim = (*vht_cap & IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK);
5015 sound_dim >>= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
5016 *vht_cap &= ~IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
5018 /* TODO: Need to check invalid STS and Sound_dim values set by FW? */
5020 /* Enable Sounding Dimension Field only if SU BF is enabled */
5022 if (sound_dim > (ar->num_tx_chains - 1))
5023 sound_dim = ar->num_tx_chains - 1;
5025 sound_dim <<= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
5026 sound_dim &= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
5027 *vht_cap |= sound_dim;
5030 /* Use the STS advertised by FW unless SU Beamformee is not supported*/
5032 *vht_cap &= ~(IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK);
5035 static struct ieee80211_sta_vht_cap
5036 ath11k_create_vht_cap(struct ath11k *ar, u32 rate_cap_tx_chainmask,
5037 u32 rate_cap_rx_chainmask)
5039 struct ieee80211_sta_vht_cap vht_cap = {0};
5040 u16 txmcs_map, rxmcs_map;
5043 vht_cap.vht_supported = 1;
5044 vht_cap.cap = ar->pdev->cap.vht_cap;
5046 if (ar->pdev->cap.nss_ratio_enabled)
5047 vht_cap.vht_mcs.tx_highest |=
5048 cpu_to_le16(IEEE80211_VHT_EXT_NSS_BW_CAPABLE);
5050 ath11k_set_vht_txbf_cap(ar, &vht_cap.cap);
5054 for (i = 0; i < 8; i++) {
5055 if (i < ar->num_tx_chains && rate_cap_tx_chainmask & BIT(i))
5056 txmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
5058 txmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
5060 if (i < ar->num_rx_chains && rate_cap_rx_chainmask & BIT(i))
5061 rxmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
5063 rxmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
5066 if (rate_cap_tx_chainmask <= 1)
5067 vht_cap.cap &= ~IEEE80211_VHT_CAP_TXSTBC;
5069 vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(rxmcs_map);
5070 vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(txmcs_map);
5075 static void ath11k_mac_setup_ht_vht_cap(struct ath11k *ar,
5076 struct ath11k_pdev_cap *cap,
5079 struct ieee80211_supported_band *band;
5080 u32 rate_cap_tx_chainmask;
5081 u32 rate_cap_rx_chainmask;
5084 rate_cap_tx_chainmask = ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift;
5085 rate_cap_rx_chainmask = ar->cfg_rx_chainmask >> cap->rx_chain_mask_shift;
5087 if (cap->supported_bands & WMI_HOST_WLAN_2G_CAP) {
5088 band = &ar->mac.sbands[NL80211_BAND_2GHZ];
5089 ht_cap = cap->band[NL80211_BAND_2GHZ].ht_cap_info;
5091 *ht_cap_info = ht_cap;
5092 band->ht_cap = ath11k_create_ht_cap(ar, ht_cap,
5093 rate_cap_rx_chainmask);
5096 if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP &&
5097 (ar->ab->hw_params.single_pdev_only ||
5098 !ar->supports_6ghz)) {
5099 band = &ar->mac.sbands[NL80211_BAND_5GHZ];
5100 ht_cap = cap->band[NL80211_BAND_5GHZ].ht_cap_info;
5102 *ht_cap_info = ht_cap;
5103 band->ht_cap = ath11k_create_ht_cap(ar, ht_cap,
5104 rate_cap_rx_chainmask);
5105 band->vht_cap = ath11k_create_vht_cap(ar, rate_cap_tx_chainmask,
5106 rate_cap_rx_chainmask);
5110 static int ath11k_check_chain_mask(struct ath11k *ar, u32 ant, bool is_tx_ant)
5112 /* TODO: Check the request chainmask against the supported
5113 * chainmask table which is advertised in extented_service_ready event
5119 static void ath11k_gen_ppe_thresh(struct ath11k_ppe_threshold *fw_ppet,
5125 he_ppet[0] = fw_ppet->numss_m1 & IEEE80211_PPE_THRES_NSS_MASK;
5126 he_ppet[0] |= (fw_ppet->ru_bit_mask <<
5127 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_POS) &
5128 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK;
5129 for (nss = 0; nss <= fw_ppet->numss_m1; nss++) {
5130 for (ru = 0; ru < 4; ru++) {
5134 if ((fw_ppet->ru_bit_mask & BIT(ru)) == 0)
5136 val = (fw_ppet->ppet16_ppet8_ru3_ru0[nss] >> (ru * 6)) &
5138 val = ((val >> 3) & 0x7) | ((val & 0x7) << 3);
5139 for (i = 5; i >= 0; i--) {
5141 ((val >> i) & 0x1) << ((bit % 8));
5149 ath11k_mac_filter_he_cap_mesh(struct ieee80211_he_cap_elem *he_cap_elem)
5153 m = IEEE80211_HE_MAC_CAP0_TWT_RES |
5154 IEEE80211_HE_MAC_CAP0_TWT_REQ;
5155 he_cap_elem->mac_cap_info[0] &= ~m;
5157 m = IEEE80211_HE_MAC_CAP2_TRS |
5158 IEEE80211_HE_MAC_CAP2_BCAST_TWT |
5159 IEEE80211_HE_MAC_CAP2_MU_CASCADING;
5160 he_cap_elem->mac_cap_info[2] &= ~m;
5162 m = IEEE80211_HE_MAC_CAP3_FLEX_TWT_SCHED |
5163 IEEE80211_HE_MAC_CAP2_BCAST_TWT |
5164 IEEE80211_HE_MAC_CAP2_MU_CASCADING;
5165 he_cap_elem->mac_cap_info[3] &= ~m;
5167 m = IEEE80211_HE_MAC_CAP4_BSRP_BQRP_A_MPDU_AGG |
5168 IEEE80211_HE_MAC_CAP4_BQR;
5169 he_cap_elem->mac_cap_info[4] &= ~m;
5171 m = IEEE80211_HE_MAC_CAP5_SUBCHAN_SELECTIVE_TRANSMISSION |
5172 IEEE80211_HE_MAC_CAP5_UL_2x996_TONE_RU |
5173 IEEE80211_HE_MAC_CAP5_PUNCTURED_SOUNDING |
5174 IEEE80211_HE_MAC_CAP5_HT_VHT_TRIG_FRAME_RX;
5175 he_cap_elem->mac_cap_info[5] &= ~m;
5177 m = IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO |
5178 IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO;
5179 he_cap_elem->phy_cap_info[2] &= ~m;
5181 m = IEEE80211_HE_PHY_CAP3_RX_PARTIAL_BW_SU_IN_20MHZ_MU |
5182 IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK |
5183 IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_MASK;
5184 he_cap_elem->phy_cap_info[3] &= ~m;
5186 m = IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER;
5187 he_cap_elem->phy_cap_info[4] &= ~m;
5189 m = IEEE80211_HE_PHY_CAP5_NG16_MU_FEEDBACK;
5190 he_cap_elem->phy_cap_info[5] &= ~m;
5192 m = IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_75_MU |
5193 IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB |
5194 IEEE80211_HE_PHY_CAP6_TRIG_CQI_FB |
5195 IEEE80211_HE_PHY_CAP6_PARTIAL_BANDWIDTH_DL_MUMIMO;
5196 he_cap_elem->phy_cap_info[6] &= ~m;
5198 m = IEEE80211_HE_PHY_CAP7_PSR_BASED_SR |
5199 IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_SUPP |
5200 IEEE80211_HE_PHY_CAP7_STBC_TX_ABOVE_80MHZ |
5201 IEEE80211_HE_PHY_CAP7_STBC_RX_ABOVE_80MHZ;
5202 he_cap_elem->phy_cap_info[7] &= ~m;
5204 m = IEEE80211_HE_PHY_CAP8_HE_ER_SU_PPDU_4XLTF_AND_08_US_GI |
5205 IEEE80211_HE_PHY_CAP8_20MHZ_IN_40MHZ_HE_PPDU_IN_2G |
5206 IEEE80211_HE_PHY_CAP8_20MHZ_IN_160MHZ_HE_PPDU |
5207 IEEE80211_HE_PHY_CAP8_80MHZ_IN_160MHZ_HE_PPDU;
5208 he_cap_elem->phy_cap_info[8] &= ~m;
5210 m = IEEE80211_HE_PHY_CAP9_LONGER_THAN_16_SIGB_OFDM_SYM |
5211 IEEE80211_HE_PHY_CAP9_NON_TRIGGERED_CQI_FEEDBACK |
5212 IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU |
5213 IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU |
5214 IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_COMP_SIGB |
5215 IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_NON_COMP_SIGB;
5216 he_cap_elem->phy_cap_info[9] &= ~m;
5219 static __le16 ath11k_mac_setup_he_6ghz_cap(struct ath11k_pdev_cap *pcap,
5220 struct ath11k_band_cap *bcap)
5224 bcap->he_6ghz_capa = IEEE80211_HT_MPDU_DENSITY_NONE;
5225 if (bcap->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS)
5226 bcap->he_6ghz_capa |=
5227 FIELD_PREP(IEEE80211_HE_6GHZ_CAP_SM_PS,
5228 WLAN_HT_CAP_SM_PS_DYNAMIC);
5230 bcap->he_6ghz_capa |=
5231 FIELD_PREP(IEEE80211_HE_6GHZ_CAP_SM_PS,
5232 WLAN_HT_CAP_SM_PS_DISABLED);
5233 val = FIELD_GET(IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK,
5235 bcap->he_6ghz_capa |=
5236 FIELD_PREP(IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP, val);
5237 val = FIELD_GET(IEEE80211_VHT_CAP_MAX_MPDU_MASK, pcap->vht_cap);
5238 bcap->he_6ghz_capa |=
5239 FIELD_PREP(IEEE80211_HE_6GHZ_CAP_MAX_MPDU_LEN, val);
5240 if (pcap->vht_cap & IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN)
5241 bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_RX_ANTPAT_CONS;
5242 if (pcap->vht_cap & IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN)
5243 bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_TX_ANTPAT_CONS;
5245 return cpu_to_le16(bcap->he_6ghz_capa);
5248 static int ath11k_mac_copy_he_cap(struct ath11k *ar,
5249 struct ath11k_pdev_cap *cap,
5250 struct ieee80211_sband_iftype_data *data,
5255 for (i = 0; i < NUM_NL80211_IFTYPES; i++) {
5256 struct ieee80211_sta_he_cap *he_cap = &data[idx].he_cap;
5257 struct ath11k_band_cap *band_cap = &cap->band[band];
5258 struct ieee80211_he_cap_elem *he_cap_elem =
5259 &he_cap->he_cap_elem;
5262 case NL80211_IFTYPE_STATION:
5263 case NL80211_IFTYPE_AP:
5264 case NL80211_IFTYPE_MESH_POINT:
5271 data[idx].types_mask = BIT(i);
5272 he_cap->has_he = true;
5273 memcpy(he_cap_elem->mac_cap_info, band_cap->he_cap_info,
5274 sizeof(he_cap_elem->mac_cap_info));
5275 memcpy(he_cap_elem->phy_cap_info, band_cap->he_cap_phy_info,
5276 sizeof(he_cap_elem->phy_cap_info));
5278 he_cap_elem->mac_cap_info[1] &=
5279 IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_MASK;
5281 he_cap_elem->phy_cap_info[5] &=
5282 ~IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK;
5283 he_cap_elem->phy_cap_info[5] |= ar->num_tx_chains - 1;
5286 case NL80211_IFTYPE_AP:
5287 he_cap_elem->phy_cap_info[3] &=
5288 ~IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK;
5289 he_cap_elem->phy_cap_info[9] |=
5290 IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU;
5292 case NL80211_IFTYPE_STATION:
5293 he_cap_elem->mac_cap_info[0] &=
5294 ~IEEE80211_HE_MAC_CAP0_TWT_RES;
5295 he_cap_elem->mac_cap_info[0] |=
5296 IEEE80211_HE_MAC_CAP0_TWT_REQ;
5297 he_cap_elem->phy_cap_info[9] |=
5298 IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU;
5300 case NL80211_IFTYPE_MESH_POINT:
5301 ath11k_mac_filter_he_cap_mesh(he_cap_elem);
5305 he_cap->he_mcs_nss_supp.rx_mcs_80 =
5306 cpu_to_le16(band_cap->he_mcs & 0xffff);
5307 he_cap->he_mcs_nss_supp.tx_mcs_80 =
5308 cpu_to_le16(band_cap->he_mcs & 0xffff);
5309 he_cap->he_mcs_nss_supp.rx_mcs_160 =
5310 cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
5311 he_cap->he_mcs_nss_supp.tx_mcs_160 =
5312 cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
5313 he_cap->he_mcs_nss_supp.rx_mcs_80p80 =
5314 cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
5315 he_cap->he_mcs_nss_supp.tx_mcs_80p80 =
5316 cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
5318 memset(he_cap->ppe_thres, 0, sizeof(he_cap->ppe_thres));
5319 if (he_cap_elem->phy_cap_info[6] &
5320 IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT)
5321 ath11k_gen_ppe_thresh(&band_cap->he_ppet,
5324 if (band == NL80211_BAND_6GHZ) {
5325 data[idx].he_6ghz_capa.capa =
5326 ath11k_mac_setup_he_6ghz_cap(cap, band_cap);
5334 static void ath11k_mac_setup_he_cap(struct ath11k *ar,
5335 struct ath11k_pdev_cap *cap)
5337 struct ieee80211_supported_band *band;
5340 if (cap->supported_bands & WMI_HOST_WLAN_2G_CAP) {
5341 count = ath11k_mac_copy_he_cap(ar, cap,
5342 ar->mac.iftype[NL80211_BAND_2GHZ],
5344 band = &ar->mac.sbands[NL80211_BAND_2GHZ];
5345 band->iftype_data = ar->mac.iftype[NL80211_BAND_2GHZ];
5346 band->n_iftype_data = count;
5349 if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP) {
5350 count = ath11k_mac_copy_he_cap(ar, cap,
5351 ar->mac.iftype[NL80211_BAND_5GHZ],
5353 band = &ar->mac.sbands[NL80211_BAND_5GHZ];
5354 band->iftype_data = ar->mac.iftype[NL80211_BAND_5GHZ];
5355 band->n_iftype_data = count;
5358 if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP &&
5359 ar->supports_6ghz) {
5360 count = ath11k_mac_copy_he_cap(ar, cap,
5361 ar->mac.iftype[NL80211_BAND_6GHZ],
5363 band = &ar->mac.sbands[NL80211_BAND_6GHZ];
5364 band->iftype_data = ar->mac.iftype[NL80211_BAND_6GHZ];
5365 band->n_iftype_data = count;
5369 static int __ath11k_set_antenna(struct ath11k *ar, u32 tx_ant, u32 rx_ant)
5373 lockdep_assert_held(&ar->conf_mutex);
5375 if (ath11k_check_chain_mask(ar, tx_ant, true))
5378 if (ath11k_check_chain_mask(ar, rx_ant, false))
5381 ar->cfg_tx_chainmask = tx_ant;
5382 ar->cfg_rx_chainmask = rx_ant;
5384 if (ar->state != ATH11K_STATE_ON &&
5385 ar->state != ATH11K_STATE_RESTARTED)
5388 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_TX_CHAIN_MASK,
5389 tx_ant, ar->pdev->pdev_id);
5391 ath11k_warn(ar->ab, "failed to set tx-chainmask: %d, req 0x%x\n",
5396 ar->num_tx_chains = get_num_chains(tx_ant);
5398 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_RX_CHAIN_MASK,
5399 rx_ant, ar->pdev->pdev_id);
5401 ath11k_warn(ar->ab, "failed to set rx-chainmask: %d, req 0x%x\n",
5406 ar->num_rx_chains = get_num_chains(rx_ant);
5408 /* Reload HT/VHT/HE capability */
5409 ath11k_mac_setup_ht_vht_cap(ar, &ar->pdev->cap, NULL);
5410 ath11k_mac_setup_he_cap(ar, &ar->pdev->cap);
5415 static void ath11k_mgmt_over_wmi_tx_drop(struct ath11k *ar, struct sk_buff *skb)
5419 ieee80211_free_txskb(ar->hw, skb);
5421 num_mgmt = atomic_dec_if_positive(&ar->num_pending_mgmt_tx);
5427 wake_up(&ar->txmgmt_empty_waitq);
5430 static void ath11k_mac_tx_mgmt_free(struct ath11k *ar, int buf_id)
5432 struct sk_buff *msdu;
5433 struct ieee80211_tx_info *info;
5435 spin_lock_bh(&ar->txmgmt_idr_lock);
5436 msdu = idr_remove(&ar->txmgmt_idr, buf_id);
5437 spin_unlock_bh(&ar->txmgmt_idr_lock);
5442 dma_unmap_single(ar->ab->dev, ATH11K_SKB_CB(msdu)->paddr, msdu->len,
5445 info = IEEE80211_SKB_CB(msdu);
5446 memset(&info->status, 0, sizeof(info->status));
5448 ath11k_mgmt_over_wmi_tx_drop(ar, msdu);
5451 int ath11k_mac_tx_mgmt_pending_free(int buf_id, void *skb, void *ctx)
5453 struct ath11k *ar = ctx;
5455 ath11k_mac_tx_mgmt_free(ar, buf_id);
5460 static int ath11k_mac_vif_txmgmt_idr_remove(int buf_id, void *skb, void *ctx)
5462 struct ieee80211_vif *vif = ctx;
5463 struct ath11k_skb_cb *skb_cb = ATH11K_SKB_CB((struct sk_buff *)skb);
5464 struct ath11k *ar = skb_cb->ar;
5466 if (skb_cb->vif == vif)
5467 ath11k_mac_tx_mgmt_free(ar, buf_id);
5472 static int ath11k_mac_mgmt_tx_wmi(struct ath11k *ar, struct ath11k_vif *arvif,
5473 struct sk_buff *skb)
5475 struct ath11k_base *ab = ar->ab;
5476 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
5477 struct ieee80211_tx_info *info;
5482 ATH11K_SKB_CB(skb)->ar = ar;
5484 spin_lock_bh(&ar->txmgmt_idr_lock);
5485 buf_id = idr_alloc(&ar->txmgmt_idr, skb, 0,
5486 ATH11K_TX_MGMT_NUM_PENDING_MAX, GFP_ATOMIC);
5487 spin_unlock_bh(&ar->txmgmt_idr_lock);
5489 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
5490 "mac tx mgmt frame, buf id %d\n", buf_id);
5495 info = IEEE80211_SKB_CB(skb);
5496 if (!(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP)) {
5497 if ((ieee80211_is_action(hdr->frame_control) ||
5498 ieee80211_is_deauth(hdr->frame_control) ||
5499 ieee80211_is_disassoc(hdr->frame_control)) &&
5500 ieee80211_has_protected(hdr->frame_control)) {
5501 skb_put(skb, IEEE80211_CCMP_MIC_LEN);
5505 paddr = dma_map_single(ab->dev, skb->data, skb->len, DMA_TO_DEVICE);
5506 if (dma_mapping_error(ab->dev, paddr)) {
5507 ath11k_warn(ab, "failed to DMA map mgmt Tx buffer\n");
5512 ATH11K_SKB_CB(skb)->paddr = paddr;
5514 ret = ath11k_wmi_mgmt_send(ar, arvif->vdev_id, buf_id, skb);
5516 ath11k_warn(ar->ab, "failed to send mgmt frame: %d\n", ret);
5523 dma_unmap_single(ab->dev, ATH11K_SKB_CB(skb)->paddr,
5524 skb->len, DMA_TO_DEVICE);
5526 spin_lock_bh(&ar->txmgmt_idr_lock);
5527 idr_remove(&ar->txmgmt_idr, buf_id);
5528 spin_unlock_bh(&ar->txmgmt_idr_lock);
5533 static void ath11k_mgmt_over_wmi_tx_purge(struct ath11k *ar)
5535 struct sk_buff *skb;
5537 while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL)
5538 ath11k_mgmt_over_wmi_tx_drop(ar, skb);
5541 static void ath11k_mgmt_over_wmi_tx_work(struct work_struct *work)
5543 struct ath11k *ar = container_of(work, struct ath11k, wmi_mgmt_tx_work);
5544 struct ath11k_skb_cb *skb_cb;
5545 struct ath11k_vif *arvif;
5546 struct sk_buff *skb;
5549 while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL) {
5550 skb_cb = ATH11K_SKB_CB(skb);
5552 ath11k_warn(ar->ab, "no vif found for mgmt frame\n");
5553 ath11k_mgmt_over_wmi_tx_drop(ar, skb);
5557 arvif = ath11k_vif_to_arvif(skb_cb->vif);
5558 mutex_lock(&ar->conf_mutex);
5559 if (ar->allocated_vdev_map & (1LL << arvif->vdev_id)) {
5560 ret = ath11k_mac_mgmt_tx_wmi(ar, arvif, skb);
5562 ath11k_warn(ar->ab, "failed to tx mgmt frame, vdev_id %d :%d\n",
5563 arvif->vdev_id, ret);
5564 ath11k_mgmt_over_wmi_tx_drop(ar, skb);
5566 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
5567 "mac tx mgmt frame, vdev_id %d\n",
5572 "dropping mgmt frame for vdev %d, is_started %d\n",
5575 ath11k_mgmt_over_wmi_tx_drop(ar, skb);
5577 mutex_unlock(&ar->conf_mutex);
5581 static int ath11k_mac_mgmt_tx(struct ath11k *ar, struct sk_buff *skb,
5584 struct sk_buff_head *q = &ar->wmi_mgmt_tx_queue;
5586 if (test_bit(ATH11K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags))
5589 /* Drop probe response packets when the pending management tx
5590 * count has reached a certain threshold, so as to prioritize
5591 * other mgmt packets like auth and assoc to be sent on time
5592 * for establishing successful connections.
5595 atomic_read(&ar->num_pending_mgmt_tx) > ATH11K_PRB_RSP_DROP_THRESHOLD) {
5597 "dropping probe response as pending queue is almost full\n");
5601 if (skb_queue_len_lockless(q) >= ATH11K_TX_MGMT_NUM_PENDING_MAX) {
5602 ath11k_warn(ar->ab, "mgmt tx queue is full\n");
5606 skb_queue_tail(q, skb);
5607 atomic_inc(&ar->num_pending_mgmt_tx);
5608 queue_work(ar->ab->workqueue_aux, &ar->wmi_mgmt_tx_work);
5613 int ath11k_mac_rfkill_config(struct ath11k *ar)
5615 struct ath11k_base *ab = ar->ab;
5619 if (ab->hw_params.rfkill_pin == 0)
5622 ath11k_dbg(ab, ATH11K_DBG_MAC,
5623 "mac rfkill_pin %d rfkill_cfg %d rfkill_on_level %d",
5624 ab->hw_params.rfkill_pin, ab->hw_params.rfkill_cfg,
5625 ab->hw_params.rfkill_on_level);
5627 param = FIELD_PREP(WMI_RFKILL_CFG_RADIO_LEVEL,
5628 ab->hw_params.rfkill_on_level) |
5629 FIELD_PREP(WMI_RFKILL_CFG_GPIO_PIN_NUM,
5630 ab->hw_params.rfkill_pin) |
5631 FIELD_PREP(WMI_RFKILL_CFG_PIN_AS_GPIO,
5632 ab->hw_params.rfkill_cfg);
5634 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_HW_RFKILL_CONFIG,
5635 param, ar->pdev->pdev_id);
5638 "failed to set rfkill config 0x%x: %d\n",
5646 int ath11k_mac_rfkill_enable_radio(struct ath11k *ar, bool enable)
5648 enum wmi_rfkill_enable_radio param;
5652 param = WMI_RFKILL_ENABLE_RADIO_ON;
5654 param = WMI_RFKILL_ENABLE_RADIO_OFF;
5656 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac %d rfkill enable %d",
5657 ar->pdev_idx, param);
5659 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_RFKILL_ENABLE,
5660 param, ar->pdev->pdev_id);
5662 ath11k_warn(ar->ab, "failed to set rfkill enable param %d: %d\n",
5670 static void ath11k_mac_op_tx(struct ieee80211_hw *hw,
5671 struct ieee80211_tx_control *control,
5672 struct sk_buff *skb)
5674 struct ath11k_skb_cb *skb_cb = ATH11K_SKB_CB(skb);
5675 struct ath11k *ar = hw->priv;
5676 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
5677 struct ieee80211_vif *vif = info->control.vif;
5678 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
5679 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
5680 struct ieee80211_key_conf *key = info->control.hw_key;
5681 struct ath11k_sta *arsta = NULL;
5682 u32 info_flags = info->flags;
5686 memset(skb_cb, 0, sizeof(*skb_cb));
5690 skb_cb->cipher = key->cipher;
5691 skb_cb->flags |= ATH11K_SKB_CIPHER_SET;
5694 if (info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP) {
5695 skb_cb->flags |= ATH11K_SKB_HW_80211_ENCAP;
5696 } else if (ieee80211_is_mgmt(hdr->frame_control)) {
5697 is_prb_rsp = ieee80211_is_probe_resp(hdr->frame_control);
5698 ret = ath11k_mac_mgmt_tx(ar, skb, is_prb_rsp);
5700 ath11k_warn(ar->ab, "failed to queue management frame %d\n",
5702 ieee80211_free_txskb(ar->hw, skb);
5708 arsta = (struct ath11k_sta *)control->sta->drv_priv;
5710 ret = ath11k_dp_tx(ar, arvif, arsta, skb);
5711 if (unlikely(ret)) {
5712 ath11k_warn(ar->ab, "failed to transmit frame %d\n", ret);
5713 ieee80211_free_txskb(ar->hw, skb);
5717 void ath11k_mac_drain_tx(struct ath11k *ar)
5719 /* make sure rcu-protected mac80211 tx path itself is drained */
5722 cancel_work_sync(&ar->wmi_mgmt_tx_work);
5723 ath11k_mgmt_over_wmi_tx_purge(ar);
5726 static int ath11k_mac_config_mon_status_default(struct ath11k *ar, bool enable)
5728 struct htt_rx_ring_tlv_filter tlv_filter = {0};
5729 struct ath11k_base *ab = ar->ab;
5734 tlv_filter = ath11k_mac_mon_status_filter_default;
5735 if (ath11k_debugfs_rx_filter(ar))
5736 tlv_filter.rx_filter = ath11k_debugfs_rx_filter(ar);
5739 for (i = 0; i < ab->hw_params.num_rxmda_per_pdev; i++) {
5740 ring_id = ar->dp.rx_mon_status_refill_ring[i].refill_buf_ring.ring_id;
5741 ret = ath11k_dp_tx_htt_rx_filter_setup(ar->ab, ring_id,
5743 HAL_RXDMA_MONITOR_STATUS,
5748 if (enable && !ar->ab->hw_params.rxdma1_enable)
5749 mod_timer(&ar->ab->mon_reap_timer, jiffies +
5750 msecs_to_jiffies(ATH11K_MON_TIMER_INTERVAL));
5755 static void ath11k_mac_wait_reconfigure(struct ath11k_base *ab)
5757 int recovery_start_count;
5762 recovery_start_count = atomic_inc_return(&ab->recovery_start_count);
5763 ath11k_dbg(ab, ATH11K_DBG_MAC, "recovery start count %d\n", recovery_start_count);
5765 if (recovery_start_count == ab->num_radios) {
5766 complete(&ab->recovery_start);
5767 ath11k_dbg(ab, ATH11K_DBG_MAC, "recovery started success\n");
5770 ath11k_dbg(ab, ATH11K_DBG_MAC, "waiting reconfigure...\n");
5772 wait_for_completion_timeout(&ab->reconfigure_complete,
5773 ATH11K_RECONFIGURE_TIMEOUT_HZ);
5776 static int ath11k_mac_op_start(struct ieee80211_hw *hw)
5778 struct ath11k *ar = hw->priv;
5779 struct ath11k_base *ab = ar->ab;
5780 struct ath11k_pdev *pdev = ar->pdev;
5783 ath11k_mac_drain_tx(ar);
5784 mutex_lock(&ar->conf_mutex);
5786 switch (ar->state) {
5787 case ATH11K_STATE_OFF:
5788 ar->state = ATH11K_STATE_ON;
5790 case ATH11K_STATE_RESTARTING:
5791 ar->state = ATH11K_STATE_RESTARTED;
5792 ath11k_mac_wait_reconfigure(ab);
5794 case ATH11K_STATE_RESTARTED:
5795 case ATH11K_STATE_WEDGED:
5796 case ATH11K_STATE_ON:
5802 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_PMF_QOS,
5806 ath11k_err(ar->ab, "failed to enable PMF QOS: (%d\n", ret);
5810 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_DYNAMIC_BW, 1,
5813 ath11k_err(ar->ab, "failed to enable dynamic bw: %d\n", ret);
5817 if (test_bit(WMI_TLV_SERVICE_SPOOF_MAC_SUPPORT, ar->wmi->wmi_ab->svc_map)) {
5818 ret = ath11k_wmi_scan_prob_req_oui(ar, ar->mac_addr);
5820 ath11k_err(ab, "failed to set prob req oui: %i\n", ret);
5825 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_ARP_AC_OVERRIDE,
5828 ath11k_err(ab, "failed to set ac override for ARP: %d\n",
5833 ret = ath11k_wmi_send_dfs_phyerr_offload_enable_cmd(ar, pdev->pdev_id);
5835 ath11k_err(ab, "failed to offload radar detection: %d\n",
5840 ret = ath11k_dp_tx_htt_h2t_ppdu_stats_req(ar,
5841 HTT_PPDU_STATS_TAG_DEFAULT);
5843 ath11k_err(ab, "failed to req ppdu stats: %d\n", ret);
5847 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_MESH_MCAST_ENABLE,
5851 ath11k_err(ar->ab, "failed to enable MESH MCAST ENABLE: (%d\n", ret);
5855 __ath11k_set_antenna(ar, ar->cfg_tx_chainmask, ar->cfg_rx_chainmask);
5857 /* TODO: Do we need to enable ANI? */
5859 ath11k_reg_update_chan_list(ar, false);
5861 ar->num_started_vdevs = 0;
5862 ar->num_created_vdevs = 0;
5864 ar->allocated_vdev_map = 0;
5866 /* Configure monitor status ring with default rx_filter to get rx status
5867 * such as rssi, rx_duration.
5869 ret = ath11k_mac_config_mon_status_default(ar, true);
5871 ath11k_err(ab, "failed to configure monitor status ring with default rx_filter: (%d)\n",
5876 /* Configure the hash seed for hash based reo dest ring selection */
5877 ath11k_wmi_pdev_lro_cfg(ar, ar->pdev->pdev_id);
5879 /* allow device to enter IMPS */
5880 if (ab->hw_params.idle_ps) {
5881 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_IDLE_PS_CONFIG,
5884 ath11k_err(ab, "failed to enable idle ps: %d\n", ret);
5889 mutex_unlock(&ar->conf_mutex);
5891 rcu_assign_pointer(ab->pdevs_active[ar->pdev_idx],
5892 &ab->pdevs[ar->pdev_idx]);
5897 ar->state = ATH11K_STATE_OFF;
5898 mutex_unlock(&ar->conf_mutex);
5903 static void ath11k_mac_op_stop(struct ieee80211_hw *hw)
5905 struct ath11k *ar = hw->priv;
5906 struct htt_ppdu_stats_info *ppdu_stats, *tmp;
5909 ath11k_mac_drain_tx(ar);
5911 mutex_lock(&ar->conf_mutex);
5912 ret = ath11k_mac_config_mon_status_default(ar, false);
5914 ath11k_err(ar->ab, "failed to clear rx_filter for monitor status ring: (%d)\n",
5917 clear_bit(ATH11K_CAC_RUNNING, &ar->dev_flags);
5918 ar->state = ATH11K_STATE_OFF;
5919 mutex_unlock(&ar->conf_mutex);
5921 cancel_delayed_work_sync(&ar->scan.timeout);
5922 cancel_work_sync(&ar->regd_update_work);
5923 cancel_work_sync(&ar->ab->update_11d_work);
5924 cancel_work_sync(&ar->ab->rfkill_work);
5926 if (ar->state_11d == ATH11K_11D_PREPARING) {
5927 ar->state_11d = ATH11K_11D_IDLE;
5928 complete(&ar->completed_11d_scan);
5931 spin_lock_bh(&ar->data_lock);
5932 list_for_each_entry_safe(ppdu_stats, tmp, &ar->ppdu_stats_info, list) {
5933 list_del(&ppdu_stats->list);
5936 spin_unlock_bh(&ar->data_lock);
5938 rcu_assign_pointer(ar->ab->pdevs_active[ar->pdev_idx], NULL);
5942 atomic_set(&ar->num_pending_mgmt_tx, 0);
5946 ath11k_mac_setup_vdev_create_params(struct ath11k_vif *arvif,
5947 struct vdev_create_params *params)
5949 struct ath11k *ar = arvif->ar;
5950 struct ath11k_pdev *pdev = ar->pdev;
5952 params->if_id = arvif->vdev_id;
5953 params->type = arvif->vdev_type;
5954 params->subtype = arvif->vdev_subtype;
5955 params->pdev_id = pdev->pdev_id;
5957 if (pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) {
5958 params->chains[NL80211_BAND_2GHZ].tx = ar->num_tx_chains;
5959 params->chains[NL80211_BAND_2GHZ].rx = ar->num_rx_chains;
5961 if (pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) {
5962 params->chains[NL80211_BAND_5GHZ].tx = ar->num_tx_chains;
5963 params->chains[NL80211_BAND_5GHZ].rx = ar->num_rx_chains;
5965 if (pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP &&
5966 ar->supports_6ghz) {
5967 params->chains[NL80211_BAND_6GHZ].tx = ar->num_tx_chains;
5968 params->chains[NL80211_BAND_6GHZ].rx = ar->num_rx_chains;
5973 ath11k_mac_prepare_he_mode(struct ath11k_pdev *pdev, u32 viftype)
5975 struct ath11k_pdev_cap *pdev_cap = &pdev->cap;
5976 struct ath11k_band_cap *cap_band = NULL;
5977 u32 *hecap_phy_ptr = NULL;
5980 if (pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP)
5981 cap_band = &pdev_cap->band[NL80211_BAND_2GHZ];
5983 cap_band = &pdev_cap->band[NL80211_BAND_5GHZ];
5985 hecap_phy_ptr = &cap_band->he_cap_phy_info[0];
5987 hemode = FIELD_PREP(HE_MODE_SU_TX_BFEE, HE_SU_BFEE_ENABLE) |
5988 FIELD_PREP(HE_MODE_SU_TX_BFER, HECAP_PHY_SUBFMR_GET(hecap_phy_ptr)) |
5989 FIELD_PREP(HE_MODE_UL_MUMIMO, HECAP_PHY_ULMUMIMO_GET(hecap_phy_ptr));
5991 /* TODO WDS and other modes */
5992 if (viftype == NL80211_IFTYPE_AP) {
5993 hemode |= FIELD_PREP(HE_MODE_MU_TX_BFER,
5994 HECAP_PHY_MUBFMR_GET(hecap_phy_ptr)) |
5995 FIELD_PREP(HE_MODE_DL_OFDMA, HE_DL_MUOFDMA_ENABLE) |
5996 FIELD_PREP(HE_MODE_UL_OFDMA, HE_UL_MUOFDMA_ENABLE);
5998 hemode |= FIELD_PREP(HE_MODE_MU_TX_BFEE, HE_MU_BFEE_ENABLE);
6004 static int ath11k_set_he_mu_sounding_mode(struct ath11k *ar,
6005 struct ath11k_vif *arvif)
6007 u32 param_id, param_value;
6008 struct ath11k_base *ab = ar->ab;
6011 param_id = WMI_VDEV_PARAM_SET_HEMU_MODE;
6012 param_value = ath11k_mac_prepare_he_mode(ar->pdev, arvif->vif->type);
6013 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
6014 param_id, param_value);
6016 ath11k_warn(ab, "failed to set vdev %d HE MU mode: %d param_value %x\n",
6017 arvif->vdev_id, ret, param_value);
6020 param_id = WMI_VDEV_PARAM_SET_HE_SOUNDING_MODE;
6022 FIELD_PREP(HE_VHT_SOUNDING_MODE, HE_VHT_SOUNDING_MODE_ENABLE) |
6023 FIELD_PREP(HE_TRIG_NONTRIG_SOUNDING_MODE,
6024 HE_TRIG_NONTRIG_SOUNDING_MODE_ENABLE);
6025 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
6026 param_id, param_value);
6028 ath11k_warn(ab, "failed to set vdev %d HE MU mode: %d\n",
6029 arvif->vdev_id, ret);
6035 static void ath11k_mac_op_update_vif_offload(struct ieee80211_hw *hw,
6036 struct ieee80211_vif *vif)
6038 struct ath11k *ar = hw->priv;
6039 struct ath11k_base *ab = ar->ab;
6040 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
6041 u32 param_id, param_value;
6044 param_id = WMI_VDEV_PARAM_TX_ENCAP_TYPE;
6045 if (ath11k_frame_mode != ATH11K_HW_TXRX_ETHERNET ||
6046 (vif->type != NL80211_IFTYPE_STATION &&
6047 vif->type != NL80211_IFTYPE_AP))
6048 vif->offload_flags &= ~(IEEE80211_OFFLOAD_ENCAP_ENABLED |
6049 IEEE80211_OFFLOAD_DECAP_ENABLED);
6051 if (vif->offload_flags & IEEE80211_OFFLOAD_ENCAP_ENABLED)
6052 param_value = ATH11K_HW_TXRX_ETHERNET;
6053 else if (test_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags))
6054 param_value = ATH11K_HW_TXRX_RAW;
6056 param_value = ATH11K_HW_TXRX_NATIVE_WIFI;
6058 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
6059 param_id, param_value);
6061 ath11k_warn(ab, "failed to set vdev %d tx encap mode: %d\n",
6062 arvif->vdev_id, ret);
6063 vif->offload_flags &= ~IEEE80211_OFFLOAD_ENCAP_ENABLED;
6066 param_id = WMI_VDEV_PARAM_RX_DECAP_TYPE;
6067 if (vif->offload_flags & IEEE80211_OFFLOAD_DECAP_ENABLED)
6068 param_value = ATH11K_HW_TXRX_ETHERNET;
6069 else if (test_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags))
6070 param_value = ATH11K_HW_TXRX_RAW;
6072 param_value = ATH11K_HW_TXRX_NATIVE_WIFI;
6074 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
6075 param_id, param_value);
6077 ath11k_warn(ab, "failed to set vdev %d rx decap mode: %d\n",
6078 arvif->vdev_id, ret);
6079 vif->offload_flags &= ~IEEE80211_OFFLOAD_DECAP_ENABLED;
6083 static bool ath11k_mac_vif_ap_active_any(struct ath11k_base *ab)
6086 struct ath11k_pdev *pdev;
6087 struct ath11k_vif *arvif;
6090 for (i = 0; i < ab->num_radios; i++) {
6091 pdev = &ab->pdevs[i];
6093 list_for_each_entry(arvif, &ar->arvifs, list) {
6094 if (arvif->is_up && arvif->vdev_type == WMI_VDEV_TYPE_AP)
6101 void ath11k_mac_11d_scan_start(struct ath11k *ar, u32 vdev_id)
6103 struct wmi_11d_scan_start_params param;
6106 mutex_lock(&ar->ab->vdev_id_11d_lock);
6108 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac vdev id for 11d scan %d\n",
6109 ar->vdev_id_11d_scan);
6111 if (ar->regdom_set_by_user)
6114 if (ar->vdev_id_11d_scan != ATH11K_11D_INVALID_VDEV_ID)
6117 if (!test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map))
6120 if (ath11k_mac_vif_ap_active_any(ar->ab))
6123 param.vdev_id = vdev_id;
6124 param.start_interval_msec = 0;
6125 param.scan_period_msec = ATH11K_SCAN_11D_INTERVAL;
6127 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac start 11d scan\n");
6129 ret = ath11k_wmi_send_11d_scan_start_cmd(ar, ¶m);
6131 ath11k_warn(ar->ab, "failed to start 11d scan vdev %d ret: %d\n",
6134 ar->vdev_id_11d_scan = vdev_id;
6135 if (ar->state_11d == ATH11K_11D_PREPARING)
6136 ar->state_11d = ATH11K_11D_RUNNING;
6140 if (ar->state_11d == ATH11K_11D_PREPARING) {
6141 ar->state_11d = ATH11K_11D_IDLE;
6142 complete(&ar->completed_11d_scan);
6145 mutex_unlock(&ar->ab->vdev_id_11d_lock);
6148 void ath11k_mac_11d_scan_stop(struct ath11k *ar)
6153 if (!test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map))
6156 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac stop 11d scan\n");
6158 mutex_lock(&ar->ab->vdev_id_11d_lock);
6160 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac stop 11d vdev id %d\n",
6161 ar->vdev_id_11d_scan);
6163 if (ar->state_11d == ATH11K_11D_PREPARING) {
6164 ar->state_11d = ATH11K_11D_IDLE;
6165 complete(&ar->completed_11d_scan);
6168 if (ar->vdev_id_11d_scan != ATH11K_11D_INVALID_VDEV_ID) {
6169 vdev_id = ar->vdev_id_11d_scan;
6171 ret = ath11k_wmi_send_11d_scan_stop_cmd(ar, vdev_id);
6174 "failed to stopt 11d scan vdev %d ret: %d\n",
6177 ar->vdev_id_11d_scan = ATH11K_11D_INVALID_VDEV_ID;
6178 ar->state_11d = ATH11K_11D_IDLE;
6179 complete(&ar->completed_11d_scan);
6182 mutex_unlock(&ar->ab->vdev_id_11d_lock);
6185 void ath11k_mac_11d_scan_stop_all(struct ath11k_base *ab)
6188 struct ath11k_pdev *pdev;
6191 ath11k_dbg(ab, ATH11K_DBG_MAC, "mac stop soc 11d scan\n");
6193 for (i = 0; i < ab->num_radios; i++) {
6194 pdev = &ab->pdevs[i];
6197 ath11k_mac_11d_scan_stop(ar);
6201 static int ath11k_mac_op_add_interface(struct ieee80211_hw *hw,
6202 struct ieee80211_vif *vif)
6204 struct ath11k *ar = hw->priv;
6205 struct ath11k_base *ab = ar->ab;
6206 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
6207 struct vdev_create_params vdev_param = {0};
6208 struct peer_create_params peer_param;
6209 u32 param_id, param_value;
6215 vif->driver_flags |= IEEE80211_VIF_SUPPORTS_UAPSD;
6217 mutex_lock(&ar->conf_mutex);
6219 if (vif->type == NL80211_IFTYPE_AP &&
6220 ar->num_peers > (ar->max_num_peers - 1)) {
6221 ath11k_warn(ab, "failed to create vdev due to insufficient peer entry resource in firmware\n");
6226 if (ar->num_created_vdevs > (TARGET_NUM_VDEVS(ab) - 1)) {
6227 ath11k_warn(ab, "failed to create vdev %u, reached max vdev limit %d\n",
6228 ar->num_created_vdevs, TARGET_NUM_VDEVS(ab));
6233 memset(arvif, 0, sizeof(*arvif));
6238 INIT_LIST_HEAD(&arvif->list);
6239 INIT_DELAYED_WORK(&arvif->connection_loss_work,
6240 ath11k_mac_vif_sta_connection_loss_work);
6242 for (i = 0; i < ARRAY_SIZE(arvif->bitrate_mask.control); i++) {
6243 arvif->bitrate_mask.control[i].legacy = 0xffffffff;
6244 arvif->bitrate_mask.control[i].gi = NL80211_TXRATE_FORCE_SGI;
6245 memset(arvif->bitrate_mask.control[i].ht_mcs, 0xff,
6246 sizeof(arvif->bitrate_mask.control[i].ht_mcs));
6247 memset(arvif->bitrate_mask.control[i].vht_mcs, 0xff,
6248 sizeof(arvif->bitrate_mask.control[i].vht_mcs));
6249 memset(arvif->bitrate_mask.control[i].he_mcs, 0xff,
6250 sizeof(arvif->bitrate_mask.control[i].he_mcs));
6253 bit = __ffs64(ab->free_vdev_map);
6255 arvif->vdev_id = bit;
6256 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE;
6258 switch (vif->type) {
6259 case NL80211_IFTYPE_UNSPECIFIED:
6260 case NL80211_IFTYPE_STATION:
6261 arvif->vdev_type = WMI_VDEV_TYPE_STA;
6263 case NL80211_IFTYPE_MESH_POINT:
6264 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_MESH_11S;
6266 case NL80211_IFTYPE_AP:
6267 arvif->vdev_type = WMI_VDEV_TYPE_AP;
6269 case NL80211_IFTYPE_MONITOR:
6270 arvif->vdev_type = WMI_VDEV_TYPE_MONITOR;
6271 ar->monitor_vdev_id = bit;
6278 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac add interface id %d type %d subtype %d map %llx\n",
6279 arvif->vdev_id, arvif->vdev_type, arvif->vdev_subtype,
6282 vif->cab_queue = arvif->vdev_id % (ATH11K_HW_MAX_QUEUES - 1);
6283 for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++)
6284 vif->hw_queue[i] = i % (ATH11K_HW_MAX_QUEUES - 1);
6286 ath11k_mac_setup_vdev_create_params(arvif, &vdev_param);
6288 ret = ath11k_wmi_vdev_create(ar, vif->addr, &vdev_param);
6290 ath11k_warn(ab, "failed to create WMI vdev %d: %d\n",
6291 arvif->vdev_id, ret);
6295 ar->num_created_vdevs++;
6296 ath11k_dbg(ab, ATH11K_DBG_MAC, "vdev %pM created, vdev_id %d\n",
6297 vif->addr, arvif->vdev_id);
6298 ar->allocated_vdev_map |= 1LL << arvif->vdev_id;
6299 ab->free_vdev_map &= ~(1LL << arvif->vdev_id);
6301 spin_lock_bh(&ar->data_lock);
6302 list_add(&arvif->list, &ar->arvifs);
6303 spin_unlock_bh(&ar->data_lock);
6305 ath11k_mac_op_update_vif_offload(hw, vif);
6307 nss = get_num_chains(ar->cfg_tx_chainmask) ? : 1;
6308 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
6309 WMI_VDEV_PARAM_NSS, nss);
6311 ath11k_warn(ab, "failed to set vdev %d chainmask 0x%x, nss %d :%d\n",
6312 arvif->vdev_id, ar->cfg_tx_chainmask, nss, ret);
6316 switch (arvif->vdev_type) {
6317 case WMI_VDEV_TYPE_AP:
6318 peer_param.vdev_id = arvif->vdev_id;
6319 peer_param.peer_addr = vif->addr;
6320 peer_param.peer_type = WMI_PEER_TYPE_DEFAULT;
6321 ret = ath11k_peer_create(ar, arvif, NULL, &peer_param);
6323 ath11k_warn(ab, "failed to vdev %d create peer for AP: %d\n",
6324 arvif->vdev_id, ret);
6328 ret = ath11k_mac_set_kickout(arvif);
6330 ath11k_warn(ar->ab, "failed to set vdev %i kickout parameters: %d\n",
6331 arvif->vdev_id, ret);
6335 ath11k_mac_11d_scan_stop_all(ar->ab);
6337 case WMI_VDEV_TYPE_STA:
6338 param_id = WMI_STA_PS_PARAM_RX_WAKE_POLICY;
6339 param_value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
6340 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
6341 param_id, param_value);
6343 ath11k_warn(ar->ab, "failed to set vdev %d RX wake policy: %d\n",
6344 arvif->vdev_id, ret);
6348 param_id = WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD;
6349 param_value = WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS;
6350 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
6351 param_id, param_value);
6353 ath11k_warn(ar->ab, "failed to set vdev %d TX wake threshold: %d\n",
6354 arvif->vdev_id, ret);
6358 param_id = WMI_STA_PS_PARAM_PSPOLL_COUNT;
6359 param_value = WMI_STA_PS_PSPOLL_COUNT_NO_MAX;
6360 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
6361 param_id, param_value);
6363 ath11k_warn(ar->ab, "failed to set vdev %d pspoll count: %d\n",
6364 arvif->vdev_id, ret);
6368 ret = ath11k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id,
6369 WMI_STA_PS_MODE_DISABLED);
6371 ath11k_warn(ar->ab, "failed to disable vdev %d ps mode: %d\n",
6372 arvif->vdev_id, ret);
6376 if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ab->wmi_ab.svc_map)) {
6377 reinit_completion(&ar->completed_11d_scan);
6378 ar->state_11d = ATH11K_11D_PREPARING;
6381 case WMI_VDEV_TYPE_MONITOR:
6382 set_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags);
6388 arvif->txpower = vif->bss_conf.txpower;
6389 ret = ath11k_mac_txpower_recalc(ar);
6393 param_id = WMI_VDEV_PARAM_RTS_THRESHOLD;
6394 param_value = ar->hw->wiphy->rts_threshold;
6395 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
6396 param_id, param_value);
6398 ath11k_warn(ar->ab, "failed to set rts threshold for vdev %d: %d\n",
6399 arvif->vdev_id, ret);
6402 ath11k_dp_vdev_tx_attach(ar, arvif);
6404 if (vif->type != NL80211_IFTYPE_MONITOR &&
6405 test_bit(ATH11K_FLAG_MONITOR_CONF_ENABLED, &ar->monitor_flags)) {
6406 ret = ath11k_mac_monitor_vdev_create(ar);
6408 ath11k_warn(ar->ab, "failed to create monitor vdev during add interface: %d",
6414 ret = ath11k_debugfs_add_interface(arvif);
6418 mutex_unlock(&ar->conf_mutex);
6423 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
6424 fbret = ath11k_peer_delete(ar, arvif->vdev_id, vif->addr);
6426 ath11k_warn(ar->ab, "fallback fail to delete peer addr %pM vdev_id %d ret %d\n",
6427 vif->addr, arvif->vdev_id, fbret);
6433 ath11k_wmi_vdev_delete(ar, arvif->vdev_id);
6434 ar->num_created_vdevs--;
6435 ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id);
6436 ab->free_vdev_map |= 1LL << arvif->vdev_id;
6437 spin_lock_bh(&ar->data_lock);
6438 list_del(&arvif->list);
6439 spin_unlock_bh(&ar->data_lock);
6442 ath11k_debugfs_remove_interface(arvif);
6443 mutex_unlock(&ar->conf_mutex);
6448 static int ath11k_mac_vif_unref(int buf_id, void *skb, void *ctx)
6450 struct ieee80211_vif *vif = (struct ieee80211_vif *)ctx;
6451 struct ath11k_skb_cb *skb_cb = ATH11K_SKB_CB((struct sk_buff *)skb);
6453 if (skb_cb->vif == vif)
6459 static void ath11k_mac_op_remove_interface(struct ieee80211_hw *hw,
6460 struct ieee80211_vif *vif)
6462 struct ath11k *ar = hw->priv;
6463 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
6464 struct ath11k_base *ab = ar->ab;
6465 unsigned long time_left;
6469 cancel_delayed_work_sync(&arvif->connection_loss_work);
6471 mutex_lock(&ar->conf_mutex);
6473 ath11k_dbg(ab, ATH11K_DBG_MAC, "mac remove interface (vdev %d)\n",
6476 if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
6477 ath11k_mac_11d_scan_stop(ar);
6479 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
6480 ret = ath11k_peer_delete(ar, arvif->vdev_id, vif->addr);
6482 ath11k_warn(ab, "failed to submit AP self-peer removal on vdev %d: %d\n",
6483 arvif->vdev_id, ret);
6486 reinit_completion(&ar->vdev_delete_done);
6488 ret = ath11k_wmi_vdev_delete(ar, arvif->vdev_id);
6490 ath11k_warn(ab, "failed to delete WMI vdev %d: %d\n",
6491 arvif->vdev_id, ret);
6495 time_left = wait_for_completion_timeout(&ar->vdev_delete_done,
6496 ATH11K_VDEV_DELETE_TIMEOUT_HZ);
6497 if (time_left == 0) {
6498 ath11k_warn(ab, "Timeout in receiving vdev delete response\n");
6502 ab->free_vdev_map |= 1LL << (arvif->vdev_id);
6503 ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id);
6504 ar->num_created_vdevs--;
6506 ath11k_dbg(ab, ATH11K_DBG_MAC, "vdev %pM deleted, vdev_id %d\n",
6507 vif->addr, arvif->vdev_id);
6509 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
6510 clear_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags);
6511 ar->monitor_vdev_id = -1;
6512 } else if (test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags) &&
6513 !test_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags)) {
6514 ret = ath11k_mac_monitor_vdev_delete(ar);
6516 /* continue even if there's an error */
6517 ath11k_warn(ar->ab, "failed to delete vdev monitor during remove interface: %d",
6522 spin_lock_bh(&ar->data_lock);
6523 list_del(&arvif->list);
6524 spin_unlock_bh(&ar->data_lock);
6526 ath11k_peer_cleanup(ar, arvif->vdev_id);
6528 idr_for_each(&ar->txmgmt_idr,
6529 ath11k_mac_vif_txmgmt_idr_remove, vif);
6531 for (i = 0; i < ab->hw_params.max_tx_ring; i++) {
6532 spin_lock_bh(&ab->dp.tx_ring[i].tx_idr_lock);
6533 idr_for_each(&ab->dp.tx_ring[i].txbuf_idr,
6534 ath11k_mac_vif_unref, vif);
6535 spin_unlock_bh(&ab->dp.tx_ring[i].tx_idr_lock);
6538 /* Recalc txpower for remaining vdev */
6539 ath11k_mac_txpower_recalc(ar);
6541 ath11k_debugfs_remove_interface(arvif);
6543 /* TODO: recal traffic pause state based on the available vdevs */
6545 mutex_unlock(&ar->conf_mutex);
6548 /* FIXME: Has to be verified. */
6549 #define SUPPORTED_FILTERS \
6554 FIF_BCN_PRBRESP_PROMISC | \
6558 static void ath11k_mac_op_configure_filter(struct ieee80211_hw *hw,
6559 unsigned int changed_flags,
6560 unsigned int *total_flags,
6563 struct ath11k *ar = hw->priv;
6565 mutex_lock(&ar->conf_mutex);
6567 *total_flags &= SUPPORTED_FILTERS;
6568 ar->filter_flags = *total_flags;
6570 mutex_unlock(&ar->conf_mutex);
6573 static int ath11k_mac_op_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant)
6575 struct ath11k *ar = hw->priv;
6577 mutex_lock(&ar->conf_mutex);
6579 *tx_ant = ar->cfg_tx_chainmask;
6580 *rx_ant = ar->cfg_rx_chainmask;
6582 mutex_unlock(&ar->conf_mutex);
6587 static int ath11k_mac_op_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)
6589 struct ath11k *ar = hw->priv;
6592 mutex_lock(&ar->conf_mutex);
6593 ret = __ath11k_set_antenna(ar, tx_ant, rx_ant);
6594 mutex_unlock(&ar->conf_mutex);
6599 static int ath11k_mac_op_ampdu_action(struct ieee80211_hw *hw,
6600 struct ieee80211_vif *vif,
6601 struct ieee80211_ampdu_params *params)
6603 struct ath11k *ar = hw->priv;
6606 mutex_lock(&ar->conf_mutex);
6608 switch (params->action) {
6609 case IEEE80211_AMPDU_RX_START:
6610 ret = ath11k_dp_rx_ampdu_start(ar, params);
6612 case IEEE80211_AMPDU_RX_STOP:
6613 ret = ath11k_dp_rx_ampdu_stop(ar, params);
6615 case IEEE80211_AMPDU_TX_START:
6616 case IEEE80211_AMPDU_TX_STOP_CONT:
6617 case IEEE80211_AMPDU_TX_STOP_FLUSH:
6618 case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
6619 case IEEE80211_AMPDU_TX_OPERATIONAL:
6620 /* Tx A-MPDU aggregation offloaded to hw/fw so deny mac80211
6621 * Tx aggregation requests.
6627 mutex_unlock(&ar->conf_mutex);
6632 static int ath11k_mac_op_add_chanctx(struct ieee80211_hw *hw,
6633 struct ieee80211_chanctx_conf *ctx)
6635 struct ath11k *ar = hw->priv;
6636 struct ath11k_base *ab = ar->ab;
6638 ath11k_dbg(ab, ATH11K_DBG_MAC,
6639 "mac chanctx add freq %u width %d ptr %pK\n",
6640 ctx->def.chan->center_freq, ctx->def.width, ctx);
6642 mutex_lock(&ar->conf_mutex);
6644 spin_lock_bh(&ar->data_lock);
6645 /* TODO: In case of multiple channel context, populate rx_channel from
6646 * Rx PPDU desc information.
6648 ar->rx_channel = ctx->def.chan;
6649 spin_unlock_bh(&ar->data_lock);
6651 mutex_unlock(&ar->conf_mutex);
6656 static void ath11k_mac_op_remove_chanctx(struct ieee80211_hw *hw,
6657 struct ieee80211_chanctx_conf *ctx)
6659 struct ath11k *ar = hw->priv;
6660 struct ath11k_base *ab = ar->ab;
6662 ath11k_dbg(ab, ATH11K_DBG_MAC,
6663 "mac chanctx remove freq %u width %d ptr %pK\n",
6664 ctx->def.chan->center_freq, ctx->def.width, ctx);
6666 mutex_lock(&ar->conf_mutex);
6668 spin_lock_bh(&ar->data_lock);
6669 /* TODO: In case of there is one more channel context left, populate
6670 * rx_channel with the channel of that remaining channel context.
6672 ar->rx_channel = NULL;
6673 spin_unlock_bh(&ar->data_lock);
6675 mutex_unlock(&ar->conf_mutex);
6679 ath11k_mac_vdev_start_restart(struct ath11k_vif *arvif,
6680 struct ieee80211_chanctx_conf *ctx,
6683 struct ath11k *ar = arvif->ar;
6684 struct ath11k_base *ab = ar->ab;
6685 struct wmi_vdev_start_req_arg arg = {};
6686 const struct cfg80211_chan_def *chandef = &ctx->def;
6687 int he_support = arvif->vif->bss_conf.he_support;
6690 lockdep_assert_held(&ar->conf_mutex);
6692 reinit_completion(&ar->vdev_setup_done);
6694 arg.vdev_id = arvif->vdev_id;
6695 arg.dtim_period = arvif->dtim_period;
6696 arg.bcn_intval = arvif->beacon_interval;
6698 arg.channel.freq = chandef->chan->center_freq;
6699 arg.channel.band_center_freq1 = chandef->center_freq1;
6700 arg.channel.band_center_freq2 = chandef->center_freq2;
6702 ath11k_phymodes[chandef->chan->band][chandef->width];
6704 arg.channel.min_power = 0;
6705 arg.channel.max_power = chandef->chan->max_power;
6706 arg.channel.max_reg_power = chandef->chan->max_reg_power;
6707 arg.channel.max_antenna_gain = chandef->chan->max_antenna_gain;
6709 arg.pref_tx_streams = ar->num_tx_chains;
6710 arg.pref_rx_streams = ar->num_rx_chains;
6712 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
6713 arg.ssid = arvif->u.ap.ssid;
6714 arg.ssid_len = arvif->u.ap.ssid_len;
6715 arg.hidden_ssid = arvif->u.ap.hidden_ssid;
6717 /* For now allow DFS for AP mode */
6718 arg.channel.chan_radar =
6719 !!(chandef->chan->flags & IEEE80211_CHAN_RADAR);
6721 arg.channel.freq2_radar = ctx->radar_enabled;
6723 arg.channel.passive = arg.channel.chan_radar;
6725 spin_lock_bh(&ab->base_lock);
6726 arg.regdomain = ar->ab->dfs_region;
6727 spin_unlock_bh(&ab->base_lock);
6730 ret = ath11k_set_he_mu_sounding_mode(ar, arvif);
6732 ath11k_warn(ar->ab, "failed to set he mode vdev %i\n",
6739 arg.channel.passive |= !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR);
6741 ath11k_dbg(ab, ATH11K_DBG_MAC,
6742 "mac vdev %d start center_freq %d phymode %s\n",
6743 arg.vdev_id, arg.channel.freq,
6744 ath11k_wmi_phymode_str(arg.channel.mode));
6746 ret = ath11k_wmi_vdev_start(ar, &arg, restart);
6748 ath11k_warn(ar->ab, "failed to %s WMI vdev %i\n",
6749 restart ? "restart" : "start", arg.vdev_id);
6753 ret = ath11k_mac_vdev_setup_sync(ar);
6755 ath11k_warn(ab, "failed to synchronize setup for vdev %i %s: %d\n",
6756 arg.vdev_id, restart ? "restart" : "start", ret);
6761 ar->num_started_vdevs++;
6763 ath11k_dbg(ab, ATH11K_DBG_MAC, "vdev %pM started, vdev_id %d\n",
6764 arvif->vif->addr, arvif->vdev_id);
6766 /* Enable CAC Flag in the driver by checking the channel DFS cac time,
6767 * i.e dfs_cac_ms value which will be valid only for radar channels
6768 * and state as NL80211_DFS_USABLE which indicates CAC needs to be
6769 * done before channel usage. This flags is used to drop rx packets.
6772 /* TODO Set the flag for other interface types as required */
6773 if (arvif->vdev_type == WMI_VDEV_TYPE_AP &&
6774 chandef->chan->dfs_cac_ms &&
6775 chandef->chan->dfs_state == NL80211_DFS_USABLE) {
6776 set_bit(ATH11K_CAC_RUNNING, &ar->dev_flags);
6777 ath11k_dbg(ab, ATH11K_DBG_MAC,
6778 "CAC Started in chan_freq %d for vdev %d\n",
6779 arg.channel.freq, arg.vdev_id);
6782 ret = ath11k_mac_set_txbf_conf(arvif);
6784 ath11k_warn(ab, "failed to set txbf conf for vdev %d: %d\n",
6785 arvif->vdev_id, ret);
6790 static int ath11k_mac_vdev_stop(struct ath11k_vif *arvif)
6792 struct ath11k *ar = arvif->ar;
6795 lockdep_assert_held(&ar->conf_mutex);
6797 reinit_completion(&ar->vdev_setup_done);
6799 ret = ath11k_wmi_vdev_stop(ar, arvif->vdev_id);
6801 ath11k_warn(ar->ab, "failed to stop WMI vdev %i: %d\n",
6802 arvif->vdev_id, ret);
6806 ret = ath11k_mac_vdev_setup_sync(ar);
6808 ath11k_warn(ar->ab, "failed to synchronize setup for vdev %i: %d\n",
6809 arvif->vdev_id, ret);
6813 WARN_ON(ar->num_started_vdevs == 0);
6815 ar->num_started_vdevs--;
6816 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %pM stopped, vdev_id %d\n",
6817 arvif->vif->addr, arvif->vdev_id);
6819 if (test_bit(ATH11K_CAC_RUNNING, &ar->dev_flags)) {
6820 clear_bit(ATH11K_CAC_RUNNING, &ar->dev_flags);
6821 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "CAC Stopped for vdev %d\n",
6830 static int ath11k_mac_vdev_start(struct ath11k_vif *arvif,
6831 struct ieee80211_chanctx_conf *ctx)
6833 return ath11k_mac_vdev_start_restart(arvif, ctx, false);
6836 static int ath11k_mac_vdev_restart(struct ath11k_vif *arvif,
6837 struct ieee80211_chanctx_conf *ctx)
6839 return ath11k_mac_vdev_start_restart(arvif, ctx, true);
6842 struct ath11k_mac_change_chanctx_arg {
6843 struct ieee80211_chanctx_conf *ctx;
6844 struct ieee80211_vif_chanctx_switch *vifs;
6850 ath11k_mac_change_chanctx_cnt_iter(void *data, u8 *mac,
6851 struct ieee80211_vif *vif)
6853 struct ath11k_mac_change_chanctx_arg *arg = data;
6855 if (rcu_access_pointer(vif->bss_conf.chanctx_conf) != arg->ctx)
6862 ath11k_mac_change_chanctx_fill_iter(void *data, u8 *mac,
6863 struct ieee80211_vif *vif)
6865 struct ath11k_mac_change_chanctx_arg *arg = data;
6866 struct ieee80211_chanctx_conf *ctx;
6868 ctx = rcu_access_pointer(vif->bss_conf.chanctx_conf);
6869 if (ctx != arg->ctx)
6872 if (WARN_ON(arg->next_vif == arg->n_vifs))
6875 arg->vifs[arg->next_vif].vif = vif;
6876 arg->vifs[arg->next_vif].old_ctx = ctx;
6877 arg->vifs[arg->next_vif].new_ctx = ctx;
6882 ath11k_mac_update_vif_chan(struct ath11k *ar,
6883 struct ieee80211_vif_chanctx_switch *vifs,
6886 struct ath11k_base *ab = ar->ab;
6887 struct ath11k_vif *arvif;
6890 bool monitor_vif = false;
6892 lockdep_assert_held(&ar->conf_mutex);
6894 /* Associated channel resources of all relevant vdevs
6895 * should be available for the channel switch now.
6898 /* TODO: Update ar->rx_channel */
6900 for (i = 0; i < n_vifs; i++) {
6901 arvif = (void *)vifs[i].vif->drv_priv;
6903 if (WARN_ON(!arvif->is_started))
6906 /* change_chanctx can be called even before vdev_up from
6907 * ieee80211_start_ap->ieee80211_vif_use_channel->
6908 * ieee80211_recalc_radar_chanctx.
6910 * Firmware expect vdev_restart only if vdev is up.
6911 * If vdev is down then it expect vdev_stop->vdev_start.
6914 ret = ath11k_mac_vdev_restart(arvif, vifs[i].new_ctx);
6916 ath11k_warn(ab, "failed to restart vdev %d: %d\n",
6917 arvif->vdev_id, ret);
6921 ret = ath11k_mac_vdev_stop(arvif);
6923 ath11k_warn(ab, "failed to stop vdev %d: %d\n",
6924 arvif->vdev_id, ret);
6928 ret = ath11k_mac_vdev_start(arvif, vifs[i].new_ctx);
6930 ath11k_warn(ab, "failed to start vdev %d: %d\n",
6931 arvif->vdev_id, ret);
6936 ret = ath11k_mac_setup_bcn_tmpl(arvif);
6938 ath11k_warn(ab, "failed to update bcn tmpl during csa: %d\n",
6941 ret = ath11k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
6944 ath11k_warn(ab, "failed to bring vdev up %d: %d\n",
6945 arvif->vdev_id, ret);
6950 /* Restart the internal monitor vdev on new channel */
6952 test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags)) {
6953 ret = ath11k_mac_monitor_stop(ar);
6955 ath11k_warn(ar->ab, "failed to stop monitor during vif channel update: %d",
6960 ret = ath11k_mac_monitor_start(ar);
6962 ath11k_warn(ar->ab, "failed to start monitor during vif channel update: %d",
6970 ath11k_mac_update_active_vif_chan(struct ath11k *ar,
6971 struct ieee80211_chanctx_conf *ctx)
6973 struct ath11k_mac_change_chanctx_arg arg = { .ctx = ctx };
6975 lockdep_assert_held(&ar->conf_mutex);
6977 ieee80211_iterate_active_interfaces_atomic(ar->hw,
6978 IEEE80211_IFACE_ITER_NORMAL,
6979 ath11k_mac_change_chanctx_cnt_iter,
6981 if (arg.n_vifs == 0)
6984 arg.vifs = kcalloc(arg.n_vifs, sizeof(arg.vifs[0]), GFP_KERNEL);
6988 ieee80211_iterate_active_interfaces_atomic(ar->hw,
6989 IEEE80211_IFACE_ITER_NORMAL,
6990 ath11k_mac_change_chanctx_fill_iter,
6993 ath11k_mac_update_vif_chan(ar, arg.vifs, arg.n_vifs);
6998 static void ath11k_mac_op_change_chanctx(struct ieee80211_hw *hw,
6999 struct ieee80211_chanctx_conf *ctx,
7002 struct ath11k *ar = hw->priv;
7003 struct ath11k_base *ab = ar->ab;
7005 mutex_lock(&ar->conf_mutex);
7007 ath11k_dbg(ab, ATH11K_DBG_MAC,
7008 "mac chanctx change freq %u width %d ptr %pK changed %x\n",
7009 ctx->def.chan->center_freq, ctx->def.width, ctx, changed);
7011 /* This shouldn't really happen because channel switching should use
7012 * switch_vif_chanctx().
7014 if (WARN_ON(changed & IEEE80211_CHANCTX_CHANGE_CHANNEL))
7017 if (changed & IEEE80211_CHANCTX_CHANGE_WIDTH ||
7018 changed & IEEE80211_CHANCTX_CHANGE_RADAR)
7019 ath11k_mac_update_active_vif_chan(ar, ctx);
7021 /* TODO: Recalc radar detection */
7024 mutex_unlock(&ar->conf_mutex);
7027 static int ath11k_start_vdev_delay(struct ieee80211_hw *hw,
7028 struct ieee80211_vif *vif)
7030 struct ath11k *ar = hw->priv;
7031 struct ath11k_base *ab = ar->ab;
7032 struct ath11k_vif *arvif = (void *)vif->drv_priv;
7035 if (WARN_ON(arvif->is_started))
7038 ret = ath11k_mac_vdev_start(arvif, &arvif->chanctx);
7040 ath11k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n",
7041 arvif->vdev_id, vif->addr,
7042 arvif->chanctx.def.chan->center_freq, ret);
7046 /* Reconfigure hardware rate code since it is cleared by firmware.
7048 if (ar->hw_rate_code > 0) {
7049 u32 vdev_param = WMI_VDEV_PARAM_MGMT_RATE;
7051 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param,
7054 ath11k_warn(ar->ab, "failed to set mgmt tx rate %d\n", ret);
7059 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
7060 ret = ath11k_wmi_vdev_up(ar, arvif->vdev_id, 0, ar->mac_addr);
7062 ath11k_warn(ab, "failed put monitor up: %d\n", ret);
7067 arvif->is_started = true;
7069 /* TODO: Setup ps and cts/rts protection */
7074 ath11k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw,
7075 struct ieee80211_vif *vif,
7076 unsigned int link_id,
7077 struct ieee80211_chanctx_conf *ctx)
7079 struct ath11k *ar = hw->priv;
7080 struct ath11k_base *ab = ar->ab;
7081 struct ath11k_vif *arvif = (void *)vif->drv_priv;
7083 struct peer_create_params param;
7085 mutex_lock(&ar->conf_mutex);
7087 ath11k_dbg(ab, ATH11K_DBG_MAC,
7088 "mac chanctx assign ptr %pK vdev_id %i\n",
7089 ctx, arvif->vdev_id);
7091 /* for QCA6390 bss peer must be created before vdev_start */
7092 if (ab->hw_params.vdev_start_delay &&
7093 arvif->vdev_type != WMI_VDEV_TYPE_AP &&
7094 arvif->vdev_type != WMI_VDEV_TYPE_MONITOR &&
7095 !ath11k_peer_find_by_vdev_id(ab, arvif->vdev_id)) {
7096 memcpy(&arvif->chanctx, ctx, sizeof(*ctx));
7101 if (WARN_ON(arvif->is_started)) {
7106 if (ab->hw_params.vdev_start_delay &&
7107 arvif->vdev_type != WMI_VDEV_TYPE_AP &&
7108 arvif->vdev_type != WMI_VDEV_TYPE_MONITOR) {
7109 param.vdev_id = arvif->vdev_id;
7110 param.peer_type = WMI_PEER_TYPE_DEFAULT;
7111 param.peer_addr = ar->mac_addr;
7113 ret = ath11k_peer_create(ar, arvif, NULL, ¶m);
7115 ath11k_warn(ab, "failed to create peer after vdev start delay: %d",
7121 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
7122 ret = ath11k_mac_monitor_start(ar);
7124 ath11k_warn(ar->ab, "failed to start monitor during vif channel context assignment: %d",
7129 arvif->is_started = true;
7133 ret = ath11k_mac_vdev_start(arvif, ctx);
7135 ath11k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n",
7136 arvif->vdev_id, vif->addr,
7137 ctx->def.chan->center_freq, ret);
7141 arvif->is_started = true;
7143 if (arvif->vdev_type != WMI_VDEV_TYPE_MONITOR &&
7144 test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags)) {
7145 ret = ath11k_mac_monitor_start(ar);
7147 ath11k_warn(ar->ab, "failed to start monitor during vif channel context assignment: %d",
7153 /* TODO: Setup ps and cts/rts protection */
7158 mutex_unlock(&ar->conf_mutex);
7164 ath11k_mac_op_unassign_vif_chanctx(struct ieee80211_hw *hw,
7165 struct ieee80211_vif *vif,
7166 unsigned int link_id,
7167 struct ieee80211_chanctx_conf *ctx)
7169 struct ath11k *ar = hw->priv;
7170 struct ath11k_base *ab = ar->ab;
7171 struct ath11k_vif *arvif = (void *)vif->drv_priv;
7172 struct ath11k_peer *peer;
7175 mutex_lock(&ar->conf_mutex);
7177 ath11k_dbg(ab, ATH11K_DBG_MAC,
7178 "mac chanctx unassign ptr %pK vdev_id %i\n",
7179 ctx, arvif->vdev_id);
7181 WARN_ON(!arvif->is_started);
7183 if (ab->hw_params.vdev_start_delay &&
7184 arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
7185 spin_lock_bh(&ab->base_lock);
7186 peer = ath11k_peer_find_by_addr(ab, ar->mac_addr);
7187 spin_unlock_bh(&ab->base_lock);
7189 ath11k_peer_delete(ar, arvif->vdev_id, ar->mac_addr);
7192 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
7193 ret = ath11k_mac_monitor_stop(ar);
7195 ath11k_warn(ar->ab, "failed to stop monitor during vif channel context unassignment: %d",
7197 mutex_unlock(&ar->conf_mutex);
7201 arvif->is_started = false;
7202 mutex_unlock(&ar->conf_mutex);
7206 ret = ath11k_mac_vdev_stop(arvif);
7208 ath11k_warn(ab, "failed to stop vdev %i: %d\n",
7209 arvif->vdev_id, ret);
7211 arvif->is_started = false;
7213 if (ab->hw_params.vdev_start_delay &&
7214 arvif->vdev_type == WMI_VDEV_TYPE_STA) {
7215 ret = ath11k_peer_delete(ar, arvif->vdev_id, arvif->bssid);
7218 "failed to delete peer %pM for vdev %d: %d\n",
7219 arvif->bssid, arvif->vdev_id, ret);
7221 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
7222 "mac removed peer %pM vdev %d after vdev stop\n",
7223 arvif->bssid, arvif->vdev_id);
7226 if (ab->hw_params.vdev_start_delay &&
7227 arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
7228 ath11k_wmi_vdev_down(ar, arvif->vdev_id);
7230 if (arvif->vdev_type != WMI_VDEV_TYPE_MONITOR &&
7231 ar->num_started_vdevs == 1 &&
7232 test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags)) {
7233 ret = ath11k_mac_monitor_stop(ar);
7235 /* continue even if there's an error */
7236 ath11k_warn(ar->ab, "failed to stop monitor during vif channel context unassignment: %d",
7240 if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
7241 ath11k_mac_11d_scan_start(ar, arvif->vdev_id);
7243 mutex_unlock(&ar->conf_mutex);
7247 ath11k_mac_op_switch_vif_chanctx(struct ieee80211_hw *hw,
7248 struct ieee80211_vif_chanctx_switch *vifs,
7250 enum ieee80211_chanctx_switch_mode mode)
7252 struct ath11k *ar = hw->priv;
7254 mutex_lock(&ar->conf_mutex);
7256 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
7257 "mac chanctx switch n_vifs %d mode %d\n",
7259 ath11k_mac_update_vif_chan(ar, vifs, n_vifs);
7261 mutex_unlock(&ar->conf_mutex);
7267 ath11k_set_vdev_param_to_all_vifs(struct ath11k *ar, int param, u32 value)
7269 struct ath11k_vif *arvif;
7272 mutex_lock(&ar->conf_mutex);
7273 list_for_each_entry(arvif, &ar->arvifs, list) {
7274 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "setting mac vdev %d param %d value %d\n",
7275 param, arvif->vdev_id, value);
7277 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
7280 ath11k_warn(ar->ab, "failed to set param %d for vdev %d: %d\n",
7281 param, arvif->vdev_id, ret);
7285 mutex_unlock(&ar->conf_mutex);
7289 /* mac80211 stores device specific RTS/Fragmentation threshold value,
7290 * this is set interface specific to firmware from ath11k driver
7292 static int ath11k_mac_op_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
7294 struct ath11k *ar = hw->priv;
7295 int param_id = WMI_VDEV_PARAM_RTS_THRESHOLD;
7297 return ath11k_set_vdev_param_to_all_vifs(ar, param_id, value);
7300 static int ath11k_mac_op_set_frag_threshold(struct ieee80211_hw *hw, u32 value)
7302 /* Even though there's a WMI vdev param for fragmentation threshold no
7303 * known firmware actually implements it. Moreover it is not possible to
7304 * rely frame fragmentation to mac80211 because firmware clears the
7305 * "more fragments" bit in frame control making it impossible for remote
7306 * devices to reassemble frames.
7308 * Hence implement a dummy callback just to say fragmentation isn't
7309 * supported. This effectively prevents mac80211 from doing frame
7310 * fragmentation in software.
7315 static int ath11k_mac_flush_tx_complete(struct ath11k *ar)
7320 time_left = wait_event_timeout(ar->dp.tx_empty_waitq,
7321 (atomic_read(&ar->dp.num_tx_pending) == 0),
7322 ATH11K_FLUSH_TIMEOUT);
7323 if (time_left == 0) {
7324 ath11k_warn(ar->ab, "failed to flush transmit queue, data pkts pending %d\n",
7325 atomic_read(&ar->dp.num_tx_pending));
7329 time_left = wait_event_timeout(ar->txmgmt_empty_waitq,
7330 (atomic_read(&ar->num_pending_mgmt_tx) == 0),
7331 ATH11K_FLUSH_TIMEOUT);
7332 if (time_left == 0) {
7333 ath11k_warn(ar->ab, "failed to flush mgmt transmit queue, mgmt pkts pending %d\n",
7334 atomic_read(&ar->num_pending_mgmt_tx));
7341 int ath11k_mac_wait_tx_complete(struct ath11k *ar)
7343 ath11k_mac_drain_tx(ar);
7344 return ath11k_mac_flush_tx_complete(ar);
7347 static void ath11k_mac_op_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
7348 u32 queues, bool drop)
7350 struct ath11k *ar = hw->priv;
7355 ath11k_mac_flush_tx_complete(ar);
7359 ath11k_mac_bitrate_mask_num_ht_rates(struct ath11k *ar,
7360 enum nl80211_band band,
7361 const struct cfg80211_bitrate_mask *mask)
7366 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++)
7367 num_rates += hweight16(mask->control[band].ht_mcs[i]);
7373 ath11k_mac_has_single_legacy_rate(struct ath11k *ar,
7374 enum nl80211_band band,
7375 const struct cfg80211_bitrate_mask *mask)
7379 num_rates = hweight32(mask->control[band].legacy);
7381 if (ath11k_mac_bitrate_mask_num_ht_rates(ar, band, mask))
7384 if (ath11k_mac_bitrate_mask_num_vht_rates(ar, band, mask))
7387 if (ath11k_mac_bitrate_mask_num_he_rates(ar, band, mask))
7390 return num_rates == 1;
7394 ath11k_mac_get_tx_mcs_map(const struct ieee80211_sta_he_cap *he_cap)
7396 if (he_cap->he_cap_elem.phy_cap_info[0] &
7397 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
7398 return he_cap->he_mcs_nss_supp.tx_mcs_80p80;
7400 if (he_cap->he_cap_elem.phy_cap_info[0] &
7401 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
7402 return he_cap->he_mcs_nss_supp.tx_mcs_160;
7404 return he_cap->he_mcs_nss_supp.tx_mcs_80;
7408 ath11k_mac_bitrate_mask_get_single_nss(struct ath11k *ar,
7409 enum nl80211_band band,
7410 const struct cfg80211_bitrate_mask *mask,
7413 struct ieee80211_supported_band *sband = &ar->mac.sbands[band];
7414 u16 vht_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
7417 u8 vht_nss_mask = 0;
7421 /* No need to consider legacy here. Basic rates are always present
7425 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) {
7426 if (mask->control[band].ht_mcs[i] == 0)
7428 else if (mask->control[band].ht_mcs[i] ==
7429 sband->ht_cap.mcs.rx_mask[i])
7430 ht_nss_mask |= BIT(i);
7435 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
7436 if (mask->control[band].vht_mcs[i] == 0)
7438 else if (mask->control[band].vht_mcs[i] ==
7439 ath11k_mac_get_max_vht_mcs_map(vht_mcs_map, i))
7440 vht_nss_mask |= BIT(i);
7445 he_mcs_map = le16_to_cpu(ath11k_mac_get_tx_mcs_map(&sband->iftype_data->he_cap));
7447 for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) {
7448 if (mask->control[band].he_mcs[i] == 0)
7451 if (mask->control[band].he_mcs[i] ==
7452 ath11k_mac_get_max_he_mcs_map(he_mcs_map, i))
7453 he_nss_mask |= BIT(i);
7458 if (ht_nss_mask != vht_nss_mask || ht_nss_mask != he_nss_mask)
7461 if (ht_nss_mask == 0)
7464 if (BIT(fls(ht_nss_mask)) - 1 != ht_nss_mask)
7467 *nss = fls(ht_nss_mask);
7473 ath11k_mac_get_single_legacy_rate(struct ath11k *ar,
7474 enum nl80211_band band,
7475 const struct cfg80211_bitrate_mask *mask,
7483 if (hweight32(mask->control[band].legacy) != 1)
7486 rate_idx = ffs(mask->control[band].legacy) - 1;
7488 if (band == NL80211_BAND_5GHZ || band == NL80211_BAND_6GHZ)
7489 rate_idx += ATH11K_MAC_FIRST_OFDM_RATE_IDX;
7491 hw_rate = ath11k_legacy_rates[rate_idx].hw_value;
7492 bitrate = ath11k_legacy_rates[rate_idx].bitrate;
7494 if (ath11k_mac_bitrate_is_cck(bitrate))
7495 preamble = WMI_RATE_PREAMBLE_CCK;
7497 preamble = WMI_RATE_PREAMBLE_OFDM;
7500 *rate = ATH11K_HW_RATE_CODE(hw_rate, 0, preamble);
7506 ath11k_mac_set_fixed_rate_gi_ltf(struct ath11k_vif *arvif, u8 he_gi, u8 he_ltf)
7508 struct ath11k *ar = arvif->ar;
7511 /* 0.8 = 0, 1.6 = 2 and 3.2 = 3. */
7512 if (he_gi && he_gi != 0xFF)
7515 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
7516 WMI_VDEV_PARAM_SGI, he_gi);
7518 ath11k_warn(ar->ab, "failed to set he gi %d: %d\n",
7526 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
7527 WMI_VDEV_PARAM_HE_LTF, he_ltf);
7529 ath11k_warn(ar->ab, "failed to set he ltf %d: %d\n",
7538 ath11k_mac_set_auto_rate_gi_ltf(struct ath11k_vif *arvif, u16 he_gi, u8 he_ltf)
7540 struct ath11k *ar = arvif->ar;
7544 if (he_gi != 0xFF) {
7546 case NL80211_RATE_INFO_HE_GI_0_8:
7547 he_gi = WMI_AUTORATE_800NS_GI;
7549 case NL80211_RATE_INFO_HE_GI_1_6:
7550 he_gi = WMI_AUTORATE_1600NS_GI;
7552 case NL80211_RATE_INFO_HE_GI_3_2:
7553 he_gi = WMI_AUTORATE_3200NS_GI;
7556 ath11k_warn(ar->ab, "invalid he gi: %d\n", he_gi);
7561 if (he_ltf != 0xFF) {
7563 case NL80211_RATE_INFO_HE_1XLTF:
7564 he_ltf = WMI_HE_AUTORATE_LTF_1X;
7566 case NL80211_RATE_INFO_HE_2XLTF:
7567 he_ltf = WMI_HE_AUTORATE_LTF_2X;
7569 case NL80211_RATE_INFO_HE_4XLTF:
7570 he_ltf = WMI_HE_AUTORATE_LTF_4X;
7573 ath11k_warn(ar->ab, "invalid he ltf: %d\n", he_ltf);
7578 he_ar_gi_ltf = he_gi | he_ltf;
7579 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
7580 WMI_VDEV_PARAM_AUTORATE_MISC_CFG,
7584 "failed to set he autorate gi %u ltf %u: %d\n",
7585 he_gi, he_ltf, ret);
7592 static int ath11k_mac_set_rate_params(struct ath11k_vif *arvif,
7593 u32 rate, u8 nss, u8 sgi, u8 ldpc,
7594 u8 he_gi, u8 he_ltf, bool he_fixed_rate)
7596 struct ath11k *ar = arvif->ar;
7600 lockdep_assert_held(&ar->conf_mutex);
7602 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
7603 "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",
7604 arvif->vdev_id, rate, nss, sgi, ldpc, he_gi,
7605 he_ltf, he_fixed_rate);
7607 if (!arvif->vif->bss_conf.he_support) {
7608 vdev_param = WMI_VDEV_PARAM_FIXED_RATE;
7609 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
7612 ath11k_warn(ar->ab, "failed to set fixed rate param 0x%02x: %d\n",
7618 vdev_param = WMI_VDEV_PARAM_NSS;
7619 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
7622 ath11k_warn(ar->ab, "failed to set nss param %d: %d\n",
7627 vdev_param = WMI_VDEV_PARAM_LDPC;
7628 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
7631 ath11k_warn(ar->ab, "failed to set ldpc param %d: %d\n",
7636 if (arvif->vif->bss_conf.he_support) {
7637 if (he_fixed_rate) {
7638 ret = ath11k_mac_set_fixed_rate_gi_ltf(arvif, he_gi,
7641 ath11k_warn(ar->ab, "failed to set fixed rate gi ltf: %d\n",
7646 ret = ath11k_mac_set_auto_rate_gi_ltf(arvif, he_gi,
7649 ath11k_warn(ar->ab, "failed to set auto rate gi ltf: %d\n",
7655 vdev_param = WMI_VDEV_PARAM_SGI;
7656 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
7659 ath11k_warn(ar->ab, "failed to set sgi param %d: %d\n",
7669 ath11k_mac_vht_mcs_range_present(struct ath11k *ar,
7670 enum nl80211_band band,
7671 const struct cfg80211_bitrate_mask *mask)
7676 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
7677 vht_mcs = mask->control[band].vht_mcs[i];
7694 ath11k_mac_he_mcs_range_present(struct ath11k *ar,
7695 enum nl80211_band band,
7696 const struct cfg80211_bitrate_mask *mask)
7701 for (i = 0; i < NL80211_HE_NSS_MAX; i++) {
7702 he_mcs = mask->control[band].he_mcs[i];
7718 static void ath11k_mac_set_bitrate_mask_iter(void *data,
7719 struct ieee80211_sta *sta)
7721 struct ath11k_vif *arvif = data;
7722 struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
7723 struct ath11k *ar = arvif->ar;
7725 spin_lock_bh(&ar->data_lock);
7726 arsta->changed |= IEEE80211_RC_SUPP_RATES_CHANGED;
7727 spin_unlock_bh(&ar->data_lock);
7729 ieee80211_queue_work(ar->hw, &arsta->update_wk);
7732 static void ath11k_mac_disable_peer_fixed_rate(void *data,
7733 struct ieee80211_sta *sta)
7735 struct ath11k_vif *arvif = data;
7736 struct ath11k *ar = arvif->ar;
7739 ret = ath11k_wmi_set_peer_param(ar, sta->addr,
7741 WMI_PEER_PARAM_FIXED_RATE,
7742 WMI_FIXED_RATE_NONE);
7745 "failed to disable peer fixed rate for STA %pM ret %d\n",
7750 ath11k_mac_validate_vht_he_fixed_rate_settings(struct ath11k *ar, enum nl80211_band band,
7751 const struct cfg80211_bitrate_mask *mask)
7753 bool he_fixed_rate = false, vht_fixed_rate = false;
7754 struct ath11k_peer *peer, *tmp;
7755 const u16 *vht_mcs_mask, *he_mcs_mask;
7756 struct ieee80211_link_sta *deflink;
7760 vht_mcs_mask = mask->control[band].vht_mcs;
7761 he_mcs_mask = mask->control[band].he_mcs;
7763 if (ath11k_mac_bitrate_mask_num_vht_rates(ar, band, mask) == 1)
7764 vht_fixed_rate = true;
7766 if (ath11k_mac_bitrate_mask_num_he_rates(ar, band, mask) == 1)
7767 he_fixed_rate = true;
7769 if (!vht_fixed_rate && !he_fixed_rate)
7772 vht_nss = ath11k_mac_max_vht_nss(vht_mcs_mask);
7773 he_nss = ath11k_mac_max_he_nss(he_mcs_mask);
7776 spin_lock_bh(&ar->ab->base_lock);
7777 list_for_each_entry_safe(peer, tmp, &ar->ab->peers, list) {
7779 deflink = &peer->sta->deflink;
7781 if (vht_fixed_rate && (!deflink->vht_cap.vht_supported ||
7782 deflink->rx_nss < vht_nss)) {
7787 if (he_fixed_rate && (!deflink->he_cap.has_he ||
7788 deflink->rx_nss < he_nss)) {
7796 spin_unlock_bh(&ar->ab->base_lock);
7802 ath11k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw,
7803 struct ieee80211_vif *vif,
7804 const struct cfg80211_bitrate_mask *mask)
7806 struct ath11k_vif *arvif = (void *)vif->drv_priv;
7807 struct cfg80211_chan_def def;
7808 struct ath11k_pdev_cap *cap;
7809 struct ath11k *ar = arvif->ar;
7810 enum nl80211_band band;
7811 const u8 *ht_mcs_mask;
7812 const u16 *vht_mcs_mask;
7813 const u16 *he_mcs_mask;
7823 bool he_fixed_rate = false;
7825 if (ath11k_mac_vif_chan(vif, &def))
7828 band = def.chan->band;
7829 cap = &ar->pdev->cap;
7830 ht_mcs_mask = mask->control[band].ht_mcs;
7831 vht_mcs_mask = mask->control[band].vht_mcs;
7832 he_mcs_mask = mask->control[band].he_mcs;
7833 ldpc = !!(cap->band[band].ht_cap_info & WMI_HT_CAP_TX_LDPC);
7835 sgi = mask->control[band].gi;
7836 if (sgi == NL80211_TXRATE_FORCE_LGI)
7839 he_gi = mask->control[band].he_gi;
7840 he_ltf = mask->control[band].he_ltf;
7842 /* mac80211 doesn't support sending a fixed HT/VHT MCS alone, rather it
7843 * requires passing at least one of used basic rates along with them.
7844 * Fixed rate setting across different preambles(legacy, HT, VHT) is
7845 * not supported by the FW. Hence use of FIXED_RATE vdev param is not
7846 * suitable for setting single HT/VHT rates.
7847 * But, there could be a single basic rate passed from userspace which
7848 * can be done through the FIXED_RATE param.
7850 if (ath11k_mac_has_single_legacy_rate(ar, band, mask)) {
7851 ret = ath11k_mac_get_single_legacy_rate(ar, band, mask, &rate,
7854 ath11k_warn(ar->ab, "failed to get single legacy rate for vdev %i: %d\n",
7855 arvif->vdev_id, ret);
7858 ieee80211_iterate_stations_atomic(ar->hw,
7859 ath11k_mac_disable_peer_fixed_rate,
7861 } else if (ath11k_mac_bitrate_mask_get_single_nss(ar, band, mask,
7863 rate = WMI_FIXED_RATE_NONE;
7865 mutex_lock(&ar->conf_mutex);
7866 arvif->bitrate_mask = *mask;
7867 ieee80211_iterate_stations_atomic(ar->hw,
7868 ath11k_mac_set_bitrate_mask_iter,
7870 mutex_unlock(&ar->conf_mutex);
7872 rate = WMI_FIXED_RATE_NONE;
7874 if (!ath11k_mac_validate_vht_he_fixed_rate_settings(ar, band, mask))
7876 "could not update fixed rate settings to all peers due to mcs/nss incompatibility\n");
7877 nss = min_t(u32, ar->num_tx_chains,
7878 max(max(ath11k_mac_max_ht_nss(ht_mcs_mask),
7879 ath11k_mac_max_vht_nss(vht_mcs_mask)),
7880 ath11k_mac_max_he_nss(he_mcs_mask)));
7882 /* If multiple rates across different preambles are given
7883 * we can reconfigure this info with all peers using PEER_ASSOC
7884 * command with the below exception cases.
7885 * - Single VHT Rate : peer_assoc command accommodates only MCS
7886 * range values i.e 0-7, 0-8, 0-9 for VHT. Though mac80211
7887 * mandates passing basic rates along with HT/VHT rates, FW
7888 * doesn't allow switching from VHT to Legacy. Hence instead of
7889 * setting legacy and VHT rates using RATEMASK_CMD vdev cmd,
7890 * we could set this VHT rate as peer fixed rate param, which
7891 * will override FIXED rate and FW rate control algorithm.
7892 * If single VHT rate is passed along with HT rates, we select
7893 * the VHT rate as fixed rate for vht peers.
7894 * - Multiple VHT Rates : When Multiple VHT rates are given,this
7895 * can be set using RATEMASK CMD which uses FW rate-ctl alg.
7896 * TODO: Setting multiple VHT MCS and replacing peer_assoc with
7897 * RATEMASK_CMDID can cover all use cases of setting rates
7898 * across multiple preambles and rates within same type.
7899 * But requires more validation of the command at this point.
7902 num_rates = ath11k_mac_bitrate_mask_num_vht_rates(ar, band,
7905 if (!ath11k_mac_vht_mcs_range_present(ar, band, mask) &&
7907 /* TODO: Handle multiple VHT MCS values setting using
7911 "setting %d mcs values in bitrate mask not supported\n",
7916 num_rates = ath11k_mac_bitrate_mask_num_he_rates(ar, band,
7919 he_fixed_rate = true;
7921 if (!ath11k_mac_he_mcs_range_present(ar, band, mask) &&
7924 "Setting more than one HE MCS Value in bitrate mask not supported\n");
7928 mutex_lock(&ar->conf_mutex);
7929 ieee80211_iterate_stations_atomic(ar->hw,
7930 ath11k_mac_disable_peer_fixed_rate,
7933 arvif->bitrate_mask = *mask;
7934 ieee80211_iterate_stations_atomic(ar->hw,
7935 ath11k_mac_set_bitrate_mask_iter,
7938 mutex_unlock(&ar->conf_mutex);
7941 mutex_lock(&ar->conf_mutex);
7943 ret = ath11k_mac_set_rate_params(arvif, rate, nss, sgi, ldpc, he_gi,
7944 he_ltf, he_fixed_rate);
7946 ath11k_warn(ar->ab, "failed to set rate params on vdev %i: %d\n",
7947 arvif->vdev_id, ret);
7950 mutex_unlock(&ar->conf_mutex);
7956 ath11k_mac_op_reconfig_complete(struct ieee80211_hw *hw,
7957 enum ieee80211_reconfig_type reconfig_type)
7959 struct ath11k *ar = hw->priv;
7960 struct ath11k_base *ab = ar->ab;
7963 if (reconfig_type != IEEE80211_RECONFIG_TYPE_RESTART)
7966 mutex_lock(&ar->conf_mutex);
7968 if (ar->state == ATH11K_STATE_RESTARTED) {
7969 ath11k_warn(ar->ab, "pdev %d successfully recovered\n",
7971 ar->state = ATH11K_STATE_ON;
7972 ieee80211_wake_queues(ar->hw);
7974 if (ar->ab->hw_params.current_cc_support &&
7975 ar->alpha2[0] != 0 && ar->alpha2[1] != 0) {
7976 struct wmi_set_current_country_params set_current_param = {};
7978 memcpy(&set_current_param.alpha2, ar->alpha2, 2);
7979 ath11k_wmi_send_set_current_country_cmd(ar, &set_current_param);
7983 recovery_count = atomic_inc_return(&ab->recovery_count);
7984 ath11k_dbg(ab, ATH11K_DBG_BOOT,
7985 "recovery count %d\n", recovery_count);
7986 /* When there are multiple radios in an SOC,
7987 * the recovery has to be done for each radio
7989 if (recovery_count == ab->num_radios) {
7990 atomic_dec(&ab->reset_count);
7991 complete(&ab->reset_complete);
7992 ab->is_reset = false;
7993 atomic_set(&ab->fail_cont_count, 0);
7994 ath11k_dbg(ab, ATH11K_DBG_BOOT, "reset success\n");
7999 mutex_unlock(&ar->conf_mutex);
8003 ath11k_mac_update_bss_chan_survey(struct ath11k *ar,
8004 struct ieee80211_channel *channel)
8007 enum wmi_bss_chan_info_req_type type = WMI_BSS_SURVEY_REQ_TYPE_READ;
8009 lockdep_assert_held(&ar->conf_mutex);
8011 if (!test_bit(WMI_TLV_SERVICE_BSS_CHANNEL_INFO_64, ar->ab->wmi_ab.svc_map) ||
8012 ar->rx_channel != channel)
8015 if (ar->scan.state != ATH11K_SCAN_IDLE) {
8016 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
8017 "ignoring bss chan info req while scanning..\n");
8021 reinit_completion(&ar->bss_survey_done);
8023 ret = ath11k_wmi_pdev_bss_chan_info_request(ar, type);
8025 ath11k_warn(ar->ab, "failed to send pdev bss chan info request\n");
8029 ret = wait_for_completion_timeout(&ar->bss_survey_done, 3 * HZ);
8031 ath11k_warn(ar->ab, "bss channel survey timed out\n");
8034 static int ath11k_mac_op_get_survey(struct ieee80211_hw *hw, int idx,
8035 struct survey_info *survey)
8037 struct ath11k *ar = hw->priv;
8038 struct ieee80211_supported_band *sband;
8039 struct survey_info *ar_survey;
8042 if (idx >= ATH11K_NUM_CHANS)
8045 ar_survey = &ar->survey[idx];
8047 mutex_lock(&ar->conf_mutex);
8049 sband = hw->wiphy->bands[NL80211_BAND_2GHZ];
8050 if (sband && idx >= sband->n_channels) {
8051 idx -= sband->n_channels;
8056 sband = hw->wiphy->bands[NL80211_BAND_5GHZ];
8057 if (sband && idx >= sband->n_channels) {
8058 idx -= sband->n_channels;
8063 sband = hw->wiphy->bands[NL80211_BAND_6GHZ];
8064 if (!sband || idx >= sband->n_channels) {
8069 ath11k_mac_update_bss_chan_survey(ar, &sband->channels[idx]);
8071 spin_lock_bh(&ar->data_lock);
8072 memcpy(survey, ar_survey, sizeof(*survey));
8073 spin_unlock_bh(&ar->data_lock);
8075 survey->channel = &sband->channels[idx];
8077 if (ar->rx_channel == survey->channel)
8078 survey->filled |= SURVEY_INFO_IN_USE;
8081 mutex_unlock(&ar->conf_mutex);
8085 static void ath11k_mac_put_chain_rssi(struct station_info *sinfo,
8086 struct ath11k_sta *arsta,
8090 struct ath11k *ar = arsta->arvif->ar;
8094 for (i = 0; i < ARRAY_SIZE(sinfo->chain_signal); i++) {
8095 sinfo->chains &= ~BIT(i);
8096 rssi = arsta->chain_signal[i];
8098 arsta->chain_signal[i] = ATH11K_INVALID_RSSI_FULL;
8100 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
8101 "mac sta statistics %s rssi[%d] %d\n", pre, i, rssi);
8103 if (rssi != ATH11K_DEFAULT_NOISE_FLOOR &&
8104 rssi != ATH11K_INVALID_RSSI_FULL &&
8105 rssi != ATH11K_INVALID_RSSI_EMPTY &&
8107 sinfo->chain_signal[i] = rssi;
8108 sinfo->chains |= BIT(i);
8109 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL);
8114 static void ath11k_mac_op_sta_statistics(struct ieee80211_hw *hw,
8115 struct ieee80211_vif *vif,
8116 struct ieee80211_sta *sta,
8117 struct station_info *sinfo)
8119 struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
8120 struct ath11k *ar = arsta->arvif->ar;
8122 bool db2dbm = test_bit(WMI_TLV_SERVICE_HW_DB2DBM_CONVERSION_SUPPORT,
8123 ar->ab->wmi_ab.svc_map);
8125 sinfo->rx_duration = arsta->rx_duration;
8126 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_DURATION);
8128 sinfo->tx_duration = arsta->tx_duration;
8129 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_DURATION);
8131 if (arsta->txrate.legacy || arsta->txrate.nss) {
8132 if (arsta->txrate.legacy) {
8133 sinfo->txrate.legacy = arsta->txrate.legacy;
8135 sinfo->txrate.mcs = arsta->txrate.mcs;
8136 sinfo->txrate.nss = arsta->txrate.nss;
8137 sinfo->txrate.bw = arsta->txrate.bw;
8138 sinfo->txrate.he_gi = arsta->txrate.he_gi;
8139 sinfo->txrate.he_dcm = arsta->txrate.he_dcm;
8140 sinfo->txrate.he_ru_alloc = arsta->txrate.he_ru_alloc;
8142 sinfo->txrate.flags = arsta->txrate.flags;
8143 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
8146 ath11k_mac_put_chain_rssi(sinfo, arsta, "ppdu", false);
8148 if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL)) &&
8149 arsta->arvif->vdev_type == WMI_VDEV_TYPE_STA &&
8150 ar->ab->hw_params.supports_rssi_stats &&
8151 !ath11k_debugfs_get_fw_stats(ar, ar->pdev->pdev_id, 0,
8152 WMI_REQUEST_RSSI_PER_CHAIN_STAT)) {
8153 ath11k_mac_put_chain_rssi(sinfo, arsta, "fw stats", true);
8156 signal = arsta->rssi_comb;
8158 arsta->arvif->vdev_type == WMI_VDEV_TYPE_STA &&
8159 ar->ab->hw_params.supports_rssi_stats &&
8160 !(ath11k_debugfs_get_fw_stats(ar, ar->pdev->pdev_id, 0,
8161 WMI_REQUEST_VDEV_STAT)))
8162 signal = arsta->rssi_beacon;
8164 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
8165 "mac sta statistics db2dbm %u rssi comb %d rssi beacon %d\n",
8166 db2dbm, arsta->rssi_comb, arsta->rssi_beacon);
8169 sinfo->signal = db2dbm ? signal : signal + ATH11K_DEFAULT_NOISE_FLOOR;
8170 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL);
8173 sinfo->signal_avg = ewma_avg_rssi_read(&arsta->avg_rssi) +
8174 ATH11K_DEFAULT_NOISE_FLOOR;
8175 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG);
8178 #if IS_ENABLED(CONFIG_IPV6)
8179 static void ath11k_generate_ns_mc_addr(struct ath11k *ar,
8180 struct ath11k_arp_ns_offload *offload)
8184 for (i = 0; i < offload->ipv6_count; i++) {
8185 offload->self_ipv6_addr[i][0] = 0xff;
8186 offload->self_ipv6_addr[i][1] = 0x02;
8187 offload->self_ipv6_addr[i][11] = 0x01;
8188 offload->self_ipv6_addr[i][12] = 0xff;
8189 offload->self_ipv6_addr[i][13] =
8190 offload->ipv6_addr[i][13];
8191 offload->self_ipv6_addr[i][14] =
8192 offload->ipv6_addr[i][14];
8193 offload->self_ipv6_addr[i][15] =
8194 offload->ipv6_addr[i][15];
8195 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "NS solicited addr %pI6\n",
8196 offload->self_ipv6_addr[i]);
8200 static void ath11k_mac_op_ipv6_changed(struct ieee80211_hw *hw,
8201 struct ieee80211_vif *vif,
8202 struct inet6_dev *idev)
8204 struct ath11k *ar = hw->priv;
8205 struct ath11k_arp_ns_offload *offload;
8206 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
8207 struct inet6_ifaddr *ifa6;
8208 struct ifacaddr6 *ifaca6;
8209 struct list_head *p;
8212 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac op ipv6 changed\n");
8214 offload = &arvif->arp_ns_offload;
8217 read_lock_bh(&idev->lock);
8219 memset(offload->ipv6_addr, 0, sizeof(offload->ipv6_addr));
8220 memset(offload->self_ipv6_addr, 0, sizeof(offload->self_ipv6_addr));
8221 memcpy(offload->mac_addr, vif->addr, ETH_ALEN);
8223 /* get unicast address */
8224 list_for_each(p, &idev->addr_list) {
8225 if (count >= ATH11K_IPV6_MAX_COUNT)
8228 ifa6 = list_entry(p, struct inet6_ifaddr, if_list);
8229 if (ifa6->flags & IFA_F_DADFAILED)
8231 scope = ipv6_addr_src_scope(&ifa6->addr);
8232 if (scope == IPV6_ADDR_SCOPE_LINKLOCAL ||
8233 scope == IPV6_ADDR_SCOPE_GLOBAL) {
8234 memcpy(offload->ipv6_addr[count], &ifa6->addr.s6_addr,
8235 sizeof(ifa6->addr.s6_addr));
8236 offload->ipv6_type[count] = ATH11K_IPV6_UC_TYPE;
8237 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac count %d ipv6 uc %pI6 scope %d\n",
8238 count, offload->ipv6_addr[count],
8242 ath11k_warn(ar->ab, "Unsupported ipv6 scope: %d\n", scope);
8246 /* get anycast address */
8247 for (ifaca6 = idev->ac_list; ifaca6; ifaca6 = ifaca6->aca_next) {
8248 if (count >= ATH11K_IPV6_MAX_COUNT)
8251 scope = ipv6_addr_src_scope(&ifaca6->aca_addr);
8252 if (scope == IPV6_ADDR_SCOPE_LINKLOCAL ||
8253 scope == IPV6_ADDR_SCOPE_GLOBAL) {
8254 memcpy(offload->ipv6_addr[count], &ifaca6->aca_addr,
8255 sizeof(ifaca6->aca_addr));
8256 offload->ipv6_type[count] = ATH11K_IPV6_AC_TYPE;
8257 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac count %d ipv6 ac %pI6 scope %d\n",
8258 count, offload->ipv6_addr[count],
8262 ath11k_warn(ar->ab, "Unsupported ipv scope: %d\n", scope);
8267 offload->ipv6_count = count;
8268 read_unlock_bh(&idev->lock);
8270 /* generate ns multicast address */
8271 ath11k_generate_ns_mc_addr(ar, offload);
8275 static void ath11k_mac_op_set_rekey_data(struct ieee80211_hw *hw,
8276 struct ieee80211_vif *vif,
8277 struct cfg80211_gtk_rekey_data *data)
8279 struct ath11k *ar = hw->priv;
8280 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
8281 struct ath11k_rekey_data *rekey_data = &arvif->rekey_data;
8283 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac set rekey data vdev %d\n",
8286 mutex_lock(&ar->conf_mutex);
8288 memcpy(rekey_data->kck, data->kck, NL80211_KCK_LEN);
8289 memcpy(rekey_data->kek, data->kek, NL80211_KEK_LEN);
8291 /* The supplicant works on big-endian, the firmware expects it on
8294 rekey_data->replay_ctr = get_unaligned_be64(data->replay_ctr);
8296 arvif->rekey_data.enable_offload = true;
8298 ath11k_dbg_dump(ar->ab, ATH11K_DBG_MAC, "kck", NULL,
8299 rekey_data->kck, NL80211_KCK_LEN);
8300 ath11k_dbg_dump(ar->ab, ATH11K_DBG_MAC, "kek", NULL,
8301 rekey_data->kck, NL80211_KEK_LEN);
8302 ath11k_dbg_dump(ar->ab, ATH11K_DBG_MAC, "replay ctr", NULL,
8303 &rekey_data->replay_ctr, sizeof(rekey_data->replay_ctr));
8305 mutex_unlock(&ar->conf_mutex);
8308 static int ath11k_mac_op_set_bios_sar_specs(struct ieee80211_hw *hw,
8309 const struct cfg80211_sar_specs *sar)
8311 struct ath11k *ar = hw->priv;
8312 const struct cfg80211_sar_sub_specs *sspec;
8317 if (!sar || sar->type != NL80211_SAR_TYPE_POWER ||
8318 sar->num_sub_specs == 0)
8321 mutex_lock(&ar->conf_mutex);
8323 if (!test_bit(WMI_TLV_SERVICE_BIOS_SAR_SUPPORT, ar->ab->wmi_ab.svc_map) ||
8324 !ar->ab->hw_params.bios_sar_capa) {
8329 ret = ath11k_wmi_pdev_set_bios_geo_table_param(ar);
8331 ath11k_warn(ar->ab, "failed to set geo table: %d\n", ret);
8335 sar_tbl = kzalloc(BIOS_SAR_TABLE_LEN, GFP_KERNEL);
8341 sspec = sar->sub_specs;
8342 for (i = 0; i < sar->num_sub_specs; i++) {
8343 if (sspec->freq_range_index >= (BIOS_SAR_TABLE_LEN >> 1)) {
8344 ath11k_warn(ar->ab, "Ignore bad frequency index %u, max allowed %u\n",
8345 sspec->freq_range_index, BIOS_SAR_TABLE_LEN >> 1);
8349 /* chain0 and chain1 share same power setting */
8350 sar_tbl[sspec->freq_range_index] = sspec->power;
8351 index = sspec->freq_range_index + (BIOS_SAR_TABLE_LEN >> 1);
8352 sar_tbl[index] = sspec->power;
8353 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "sar tbl[%d] = %d\n",
8354 sspec->freq_range_index, sar_tbl[sspec->freq_range_index]);
8358 ret = ath11k_wmi_pdev_set_bios_sar_table_param(ar, sar_tbl);
8360 ath11k_warn(ar->ab, "failed to set sar power: %d", ret);
8364 mutex_unlock(&ar->conf_mutex);
8369 static int ath11k_mac_op_cancel_remain_on_channel(struct ieee80211_hw *hw,
8370 struct ieee80211_vif *vif)
8372 struct ath11k *ar = hw->priv;
8374 mutex_lock(&ar->conf_mutex);
8376 spin_lock_bh(&ar->data_lock);
8377 ar->scan.roc_notify = false;
8378 spin_unlock_bh(&ar->data_lock);
8380 ath11k_scan_abort(ar);
8382 mutex_unlock(&ar->conf_mutex);
8384 cancel_delayed_work_sync(&ar->scan.timeout);
8389 static int ath11k_mac_op_remain_on_channel(struct ieee80211_hw *hw,
8390 struct ieee80211_vif *vif,
8391 struct ieee80211_channel *chan,
8393 enum ieee80211_roc_type type)
8395 struct ath11k *ar = hw->priv;
8396 struct ath11k_vif *arvif = (void *)vif->drv_priv;
8397 struct scan_req_params arg;
8401 mutex_lock(&ar->conf_mutex);
8403 spin_lock_bh(&ar->data_lock);
8404 switch (ar->scan.state) {
8405 case ATH11K_SCAN_IDLE:
8406 reinit_completion(&ar->scan.started);
8407 reinit_completion(&ar->scan.completed);
8408 reinit_completion(&ar->scan.on_channel);
8409 ar->scan.state = ATH11K_SCAN_STARTING;
8410 ar->scan.is_roc = true;
8411 ar->scan.vdev_id = arvif->vdev_id;
8412 ar->scan.roc_freq = chan->center_freq;
8413 ar->scan.roc_notify = true;
8416 case ATH11K_SCAN_STARTING:
8417 case ATH11K_SCAN_RUNNING:
8418 case ATH11K_SCAN_ABORTING:
8422 spin_unlock_bh(&ar->data_lock);
8427 scan_time_msec = ar->hw->wiphy->max_remain_on_channel_duration * 2;
8429 memset(&arg, 0, sizeof(arg));
8430 ath11k_wmi_start_scan_init(ar, &arg);
8432 arg.chan_list = kcalloc(arg.num_chan, sizeof(*arg.chan_list),
8434 if (!arg.chan_list) {
8439 arg.vdev_id = arvif->vdev_id;
8440 arg.scan_id = ATH11K_SCAN_ID;
8441 arg.chan_list[0] = chan->center_freq;
8442 arg.dwell_time_active = scan_time_msec;
8443 arg.dwell_time_passive = scan_time_msec;
8444 arg.max_scan_time = scan_time_msec;
8445 arg.scan_flags |= WMI_SCAN_FLAG_PASSIVE;
8446 arg.scan_flags |= WMI_SCAN_FILTER_PROBE_REQ;
8447 arg.burst_duration = duration;
8449 ret = ath11k_start_scan(ar, &arg);
8451 ath11k_warn(ar->ab, "failed to start roc scan: %d\n", ret);
8453 spin_lock_bh(&ar->data_lock);
8454 ar->scan.state = ATH11K_SCAN_IDLE;
8455 spin_unlock_bh(&ar->data_lock);
8456 goto free_chan_list;
8459 ret = wait_for_completion_timeout(&ar->scan.on_channel, 3 * HZ);
8461 ath11k_warn(ar->ab, "failed to switch to channel for roc scan\n");
8462 ret = ath11k_scan_stop(ar);
8464 ath11k_warn(ar->ab, "failed to stop scan: %d\n", ret);
8466 goto free_chan_list;
8469 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
8470 msecs_to_jiffies(duration));
8475 kfree(arg.chan_list);
8477 mutex_unlock(&ar->conf_mutex);
8481 static const struct ieee80211_ops ath11k_ops = {
8482 .tx = ath11k_mac_op_tx,
8483 .start = ath11k_mac_op_start,
8484 .stop = ath11k_mac_op_stop,
8485 .reconfig_complete = ath11k_mac_op_reconfig_complete,
8486 .add_interface = ath11k_mac_op_add_interface,
8487 .remove_interface = ath11k_mac_op_remove_interface,
8488 .update_vif_offload = ath11k_mac_op_update_vif_offload,
8489 .config = ath11k_mac_op_config,
8490 .bss_info_changed = ath11k_mac_op_bss_info_changed,
8491 .configure_filter = ath11k_mac_op_configure_filter,
8492 .hw_scan = ath11k_mac_op_hw_scan,
8493 .cancel_hw_scan = ath11k_mac_op_cancel_hw_scan,
8494 .set_key = ath11k_mac_op_set_key,
8495 .set_rekey_data = ath11k_mac_op_set_rekey_data,
8496 .sta_state = ath11k_mac_op_sta_state,
8497 .sta_set_4addr = ath11k_mac_op_sta_set_4addr,
8498 .sta_set_txpwr = ath11k_mac_op_sta_set_txpwr,
8499 .sta_rc_update = ath11k_mac_op_sta_rc_update,
8500 .conf_tx = ath11k_mac_op_conf_tx,
8501 .set_antenna = ath11k_mac_op_set_antenna,
8502 .get_antenna = ath11k_mac_op_get_antenna,
8503 .ampdu_action = ath11k_mac_op_ampdu_action,
8504 .add_chanctx = ath11k_mac_op_add_chanctx,
8505 .remove_chanctx = ath11k_mac_op_remove_chanctx,
8506 .change_chanctx = ath11k_mac_op_change_chanctx,
8507 .assign_vif_chanctx = ath11k_mac_op_assign_vif_chanctx,
8508 .unassign_vif_chanctx = ath11k_mac_op_unassign_vif_chanctx,
8509 .switch_vif_chanctx = ath11k_mac_op_switch_vif_chanctx,
8510 .set_rts_threshold = ath11k_mac_op_set_rts_threshold,
8511 .set_frag_threshold = ath11k_mac_op_set_frag_threshold,
8512 .set_bitrate_mask = ath11k_mac_op_set_bitrate_mask,
8513 .get_survey = ath11k_mac_op_get_survey,
8514 .flush = ath11k_mac_op_flush,
8515 .sta_statistics = ath11k_mac_op_sta_statistics,
8516 CFG80211_TESTMODE_CMD(ath11k_tm_cmd)
8519 .suspend = ath11k_wow_op_suspend,
8520 .resume = ath11k_wow_op_resume,
8521 .set_wakeup = ath11k_wow_op_set_wakeup,
8524 #ifdef CONFIG_ATH11K_DEBUGFS
8525 .sta_add_debugfs = ath11k_debugfs_sta_op_add,
8528 #if IS_ENABLED(CONFIG_IPV6)
8529 .ipv6_addr_change = ath11k_mac_op_ipv6_changed,
8532 .set_sar_specs = ath11k_mac_op_set_bios_sar_specs,
8533 .remain_on_channel = ath11k_mac_op_remain_on_channel,
8534 .cancel_remain_on_channel = ath11k_mac_op_cancel_remain_on_channel,
8537 static void ath11k_mac_update_ch_list(struct ath11k *ar,
8538 struct ieee80211_supported_band *band,
8539 u32 freq_low, u32 freq_high)
8543 if (!(freq_low && freq_high))
8546 for (i = 0; i < band->n_channels; i++) {
8547 if (band->channels[i].center_freq < freq_low ||
8548 band->channels[i].center_freq > freq_high)
8549 band->channels[i].flags |= IEEE80211_CHAN_DISABLED;
8553 static u32 ath11k_get_phy_id(struct ath11k *ar, u32 band)
8555 struct ath11k_pdev *pdev = ar->pdev;
8556 struct ath11k_pdev_cap *pdev_cap = &pdev->cap;
8558 if (band == WMI_HOST_WLAN_2G_CAP)
8559 return pdev_cap->band[NL80211_BAND_2GHZ].phy_id;
8561 if (band == WMI_HOST_WLAN_5G_CAP)
8562 return pdev_cap->band[NL80211_BAND_5GHZ].phy_id;
8564 ath11k_warn(ar->ab, "unsupported phy cap:%d\n", band);
8569 static int ath11k_mac_setup_channels_rates(struct ath11k *ar,
8570 u32 supported_bands)
8572 struct ieee80211_supported_band *band;
8573 struct ath11k_hal_reg_capabilities_ext *reg_cap, *temp_reg_cap;
8577 BUILD_BUG_ON((ARRAY_SIZE(ath11k_2ghz_channels) +
8578 ARRAY_SIZE(ath11k_5ghz_channels) +
8579 ARRAY_SIZE(ath11k_6ghz_channels)) !=
8582 reg_cap = &ar->ab->hal_reg_cap[ar->pdev_idx];
8583 temp_reg_cap = reg_cap;
8585 if (supported_bands & WMI_HOST_WLAN_2G_CAP) {
8586 channels = kmemdup(ath11k_2ghz_channels,
8587 sizeof(ath11k_2ghz_channels),
8592 band = &ar->mac.sbands[NL80211_BAND_2GHZ];
8593 band->band = NL80211_BAND_2GHZ;
8594 band->n_channels = ARRAY_SIZE(ath11k_2ghz_channels);
8595 band->channels = channels;
8596 band->n_bitrates = ath11k_g_rates_size;
8597 band->bitrates = ath11k_g_rates;
8598 ar->hw->wiphy->bands[NL80211_BAND_2GHZ] = band;
8600 if (ar->ab->hw_params.single_pdev_only) {
8601 phy_id = ath11k_get_phy_id(ar, WMI_HOST_WLAN_2G_CAP);
8602 temp_reg_cap = &ar->ab->hal_reg_cap[phy_id];
8604 ath11k_mac_update_ch_list(ar, band,
8605 temp_reg_cap->low_2ghz_chan,
8606 temp_reg_cap->high_2ghz_chan);
8609 if (supported_bands & WMI_HOST_WLAN_5G_CAP) {
8610 if (reg_cap->high_5ghz_chan >= ATH11K_MAX_6G_FREQ) {
8611 channels = kmemdup(ath11k_6ghz_channels,
8612 sizeof(ath11k_6ghz_channels), GFP_KERNEL);
8614 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
8618 ar->supports_6ghz = true;
8619 band = &ar->mac.sbands[NL80211_BAND_6GHZ];
8620 band->band = NL80211_BAND_6GHZ;
8621 band->n_channels = ARRAY_SIZE(ath11k_6ghz_channels);
8622 band->channels = channels;
8623 band->n_bitrates = ath11k_a_rates_size;
8624 band->bitrates = ath11k_a_rates;
8625 ar->hw->wiphy->bands[NL80211_BAND_6GHZ] = band;
8627 if (ar->ab->hw_params.single_pdev_only) {
8628 phy_id = ath11k_get_phy_id(ar, WMI_HOST_WLAN_5G_CAP);
8629 temp_reg_cap = &ar->ab->hal_reg_cap[phy_id];
8632 ath11k_mac_update_ch_list(ar, band,
8633 temp_reg_cap->low_5ghz_chan,
8634 temp_reg_cap->high_5ghz_chan);
8637 if (reg_cap->low_5ghz_chan < ATH11K_MIN_6G_FREQ) {
8638 channels = kmemdup(ath11k_5ghz_channels,
8639 sizeof(ath11k_5ghz_channels),
8642 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
8643 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
8647 band = &ar->mac.sbands[NL80211_BAND_5GHZ];
8648 band->band = NL80211_BAND_5GHZ;
8649 band->n_channels = ARRAY_SIZE(ath11k_5ghz_channels);
8650 band->channels = channels;
8651 band->n_bitrates = ath11k_a_rates_size;
8652 band->bitrates = ath11k_a_rates;
8653 ar->hw->wiphy->bands[NL80211_BAND_5GHZ] = band;
8655 if (ar->ab->hw_params.single_pdev_only) {
8656 phy_id = ath11k_get_phy_id(ar, WMI_HOST_WLAN_5G_CAP);
8657 temp_reg_cap = &ar->ab->hal_reg_cap[phy_id];
8660 ath11k_mac_update_ch_list(ar, band,
8661 temp_reg_cap->low_5ghz_chan,
8662 temp_reg_cap->high_5ghz_chan);
8669 static int ath11k_mac_setup_iface_combinations(struct ath11k *ar)
8671 struct ath11k_base *ab = ar->ab;
8672 struct ieee80211_iface_combination *combinations;
8673 struct ieee80211_iface_limit *limits;
8676 combinations = kzalloc(sizeof(*combinations), GFP_KERNEL);
8682 limits = kcalloc(n_limits, sizeof(*limits), GFP_KERNEL);
8684 kfree(combinations);
8689 limits[0].types |= BIT(NL80211_IFTYPE_STATION);
8692 limits[1].types |= BIT(NL80211_IFTYPE_AP);
8694 if (IS_ENABLED(CONFIG_MAC80211_MESH) &&
8695 ab->hw_params.interface_modes & BIT(NL80211_IFTYPE_MESH_POINT))
8696 limits[1].types |= BIT(NL80211_IFTYPE_MESH_POINT);
8698 combinations[0].limits = limits;
8699 combinations[0].n_limits = n_limits;
8700 combinations[0].max_interfaces = 16;
8701 combinations[0].num_different_channels = 1;
8702 combinations[0].beacon_int_infra_match = true;
8703 combinations[0].beacon_int_min_gcd = 100;
8704 combinations[0].radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
8705 BIT(NL80211_CHAN_WIDTH_20) |
8706 BIT(NL80211_CHAN_WIDTH_40) |
8707 BIT(NL80211_CHAN_WIDTH_80) |
8708 BIT(NL80211_CHAN_WIDTH_80P80) |
8709 BIT(NL80211_CHAN_WIDTH_160);
8711 ar->hw->wiphy->iface_combinations = combinations;
8712 ar->hw->wiphy->n_iface_combinations = 1;
8717 static const u8 ath11k_if_types_ext_capa[] = {
8718 [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
8719 [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
8722 static const u8 ath11k_if_types_ext_capa_sta[] = {
8723 [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
8724 [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
8725 [9] = WLAN_EXT_CAPA10_TWT_REQUESTER_SUPPORT,
8728 static const u8 ath11k_if_types_ext_capa_ap[] = {
8729 [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
8730 [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
8731 [9] = WLAN_EXT_CAPA10_TWT_RESPONDER_SUPPORT,
8734 static const struct wiphy_iftype_ext_capab ath11k_iftypes_ext_capa[] = {
8736 .extended_capabilities = ath11k_if_types_ext_capa,
8737 .extended_capabilities_mask = ath11k_if_types_ext_capa,
8738 .extended_capabilities_len = sizeof(ath11k_if_types_ext_capa),
8740 .iftype = NL80211_IFTYPE_STATION,
8741 .extended_capabilities = ath11k_if_types_ext_capa_sta,
8742 .extended_capabilities_mask = ath11k_if_types_ext_capa_sta,
8743 .extended_capabilities_len =
8744 sizeof(ath11k_if_types_ext_capa_sta),
8746 .iftype = NL80211_IFTYPE_AP,
8747 .extended_capabilities = ath11k_if_types_ext_capa_ap,
8748 .extended_capabilities_mask = ath11k_if_types_ext_capa_ap,
8749 .extended_capabilities_len =
8750 sizeof(ath11k_if_types_ext_capa_ap),
8754 static void __ath11k_mac_unregister(struct ath11k *ar)
8756 cancel_work_sync(&ar->regd_update_work);
8758 ieee80211_unregister_hw(ar->hw);
8760 idr_for_each(&ar->txmgmt_idr, ath11k_mac_tx_mgmt_pending_free, ar);
8761 idr_destroy(&ar->txmgmt_idr);
8763 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
8764 kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels);
8765 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
8767 kfree(ar->hw->wiphy->iface_combinations[0].limits);
8768 kfree(ar->hw->wiphy->iface_combinations);
8770 SET_IEEE80211_DEV(ar->hw, NULL);
8773 void ath11k_mac_unregister(struct ath11k_base *ab)
8776 struct ath11k_pdev *pdev;
8779 for (i = 0; i < ab->num_radios; i++) {
8780 pdev = &ab->pdevs[i];
8785 __ath11k_mac_unregister(ar);
8788 ath11k_peer_rhash_tbl_destroy(ab);
8791 static int __ath11k_mac_register(struct ath11k *ar)
8793 struct ath11k_base *ab = ar->ab;
8794 struct ath11k_pdev_cap *cap = &ar->pdev->cap;
8795 static const u32 cipher_suites[] = {
8796 WLAN_CIPHER_SUITE_TKIP,
8797 WLAN_CIPHER_SUITE_CCMP,
8798 WLAN_CIPHER_SUITE_AES_CMAC,
8799 WLAN_CIPHER_SUITE_BIP_CMAC_256,
8800 WLAN_CIPHER_SUITE_BIP_GMAC_128,
8801 WLAN_CIPHER_SUITE_BIP_GMAC_256,
8802 WLAN_CIPHER_SUITE_GCMP,
8803 WLAN_CIPHER_SUITE_GCMP_256,
8804 WLAN_CIPHER_SUITE_CCMP_256,
8809 ath11k_pdev_caps_update(ar);
8811 SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr);
8813 SET_IEEE80211_DEV(ar->hw, ab->dev);
8815 ret = ath11k_mac_setup_channels_rates(ar,
8816 cap->supported_bands);
8820 ath11k_mac_setup_ht_vht_cap(ar, cap, &ht_cap);
8821 ath11k_mac_setup_he_cap(ar, cap);
8823 ret = ath11k_mac_setup_iface_combinations(ar);
8825 ath11k_err(ar->ab, "failed to setup interface combinations: %d\n", ret);
8826 goto err_free_channels;
8829 ar->hw->wiphy->available_antennas_rx = cap->rx_chain_mask;
8830 ar->hw->wiphy->available_antennas_tx = cap->tx_chain_mask;
8832 ar->hw->wiphy->interface_modes = ab->hw_params.interface_modes;
8834 if (ab->hw_params.single_pdev_only && ar->supports_6ghz)
8835 ieee80211_hw_set(ar->hw, SINGLE_SCAN_ON_ALL_BANDS);
8837 ieee80211_hw_set(ar->hw, SIGNAL_DBM);
8838 ieee80211_hw_set(ar->hw, SUPPORTS_PS);
8839 ieee80211_hw_set(ar->hw, SUPPORTS_DYNAMIC_PS);
8840 ieee80211_hw_set(ar->hw, MFP_CAPABLE);
8841 ieee80211_hw_set(ar->hw, REPORTS_TX_ACK_STATUS);
8842 ieee80211_hw_set(ar->hw, HAS_RATE_CONTROL);
8843 ieee80211_hw_set(ar->hw, AP_LINK_PS);
8844 ieee80211_hw_set(ar->hw, SPECTRUM_MGMT);
8845 ieee80211_hw_set(ar->hw, CONNECTION_MONITOR);
8846 ieee80211_hw_set(ar->hw, SUPPORTS_PER_STA_GTK);
8847 ieee80211_hw_set(ar->hw, WANT_MONITOR_VIF);
8848 ieee80211_hw_set(ar->hw, CHANCTX_STA_CSA);
8849 ieee80211_hw_set(ar->hw, QUEUE_CONTROL);
8850 ieee80211_hw_set(ar->hw, SUPPORTS_TX_FRAG);
8851 ieee80211_hw_set(ar->hw, REPORTS_LOW_ACK);
8853 if (ath11k_frame_mode == ATH11K_HW_TXRX_ETHERNET) {
8854 ieee80211_hw_set(ar->hw, SUPPORTS_TX_ENCAP_OFFLOAD);
8855 ieee80211_hw_set(ar->hw, SUPPORTS_RX_DECAP_OFFLOAD);
8858 if (cap->nss_ratio_enabled)
8859 ieee80211_hw_set(ar->hw, SUPPORTS_VHT_EXT_NSS_BW);
8861 if ((ht_cap & WMI_HT_CAP_ENABLED) || ar->supports_6ghz) {
8862 ieee80211_hw_set(ar->hw, AMPDU_AGGREGATION);
8863 ieee80211_hw_set(ar->hw, TX_AMPDU_SETUP_IN_HW);
8864 ieee80211_hw_set(ar->hw, SUPPORTS_REORDERING_BUFFER);
8865 ieee80211_hw_set(ar->hw, SUPPORTS_AMSDU_IN_AMPDU);
8866 ieee80211_hw_set(ar->hw, USES_RSS);
8869 ar->hw->wiphy->features |= NL80211_FEATURE_STATIC_SMPS;
8870 ar->hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
8872 /* TODO: Check if HT capability advertised from firmware is different
8873 * for each band for a dual band capable radio. It will be tricky to
8874 * handle it when the ht capability different for each band.
8876 if (ht_cap & WMI_HT_CAP_DYNAMIC_SMPS ||
8877 (ar->supports_6ghz && ab->hw_params.supports_dynamic_smps_6ghz))
8878 ar->hw->wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS;
8880 ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID;
8881 ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN;
8883 ar->hw->max_listen_interval = ATH11K_MAX_HW_LISTEN_INTERVAL;
8885 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
8886 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
8887 ar->hw->wiphy->max_remain_on_channel_duration = 5000;
8889 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
8890 ar->hw->wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE |
8891 NL80211_FEATURE_AP_SCAN;
8893 ar->max_num_stations = TARGET_NUM_STATIONS(ab);
8894 ar->max_num_peers = TARGET_NUM_PEERS_PDEV(ab);
8896 ar->hw->wiphy->max_ap_assoc_sta = ar->max_num_stations;
8898 if (test_bit(WMI_TLV_SERVICE_SPOOF_MAC_SUPPORT, ar->wmi->wmi_ab->svc_map)) {
8899 ar->hw->wiphy->features |=
8900 NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR;
8903 if (test_bit(WMI_TLV_SERVICE_NLO, ar->wmi->wmi_ab->svc_map)) {
8904 ar->hw->wiphy->max_sched_scan_ssids = WMI_PNO_MAX_SUPP_NETWORKS;
8905 ar->hw->wiphy->max_match_sets = WMI_PNO_MAX_SUPP_NETWORKS;
8906 ar->hw->wiphy->max_sched_scan_ie_len = WMI_PNO_MAX_IE_LENGTH;
8907 ar->hw->wiphy->max_sched_scan_plans = WMI_PNO_MAX_SCHED_SCAN_PLANS;
8908 ar->hw->wiphy->max_sched_scan_plan_interval =
8909 WMI_PNO_MAX_SCHED_SCAN_PLAN_INT;
8910 ar->hw->wiphy->max_sched_scan_plan_iterations =
8911 WMI_PNO_MAX_SCHED_SCAN_PLAN_ITRNS;
8912 ar->hw->wiphy->features |= NL80211_FEATURE_ND_RANDOM_MAC_ADDR;
8915 ret = ath11k_wow_init(ar);
8917 ath11k_warn(ar->ab, "failed to init wow: %d\n", ret);
8918 goto err_free_if_combs;
8921 ar->hw->queues = ATH11K_HW_MAX_QUEUES;
8922 ar->hw->wiphy->tx_queue_len = ATH11K_QUEUE_LEN;
8923 ar->hw->offchannel_tx_hw_queue = ATH11K_HW_MAX_QUEUES - 1;
8924 ar->hw->max_rx_aggregation_subframes = IEEE80211_MAX_AMPDU_BUF_HE;
8926 ar->hw->vif_data_size = sizeof(struct ath11k_vif);
8927 ar->hw->sta_data_size = sizeof(struct ath11k_sta);
8929 wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
8930 wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_STA_TX_PWR);
8931 if (test_bit(WMI_TLV_SERVICE_BSS_COLOR_OFFLOAD,
8932 ar->ab->wmi_ab.svc_map)) {
8933 wiphy_ext_feature_set(ar->hw->wiphy,
8934 NL80211_EXT_FEATURE_BSS_COLOR);
8935 ieee80211_hw_set(ar->hw, DETECTS_COLOR_COLLISION);
8938 ar->hw->wiphy->cipher_suites = cipher_suites;
8939 ar->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
8941 ar->hw->wiphy->iftype_ext_capab = ath11k_iftypes_ext_capa;
8942 ar->hw->wiphy->num_iftype_ext_capab =
8943 ARRAY_SIZE(ath11k_iftypes_ext_capa);
8945 if (ar->supports_6ghz) {
8946 wiphy_ext_feature_set(ar->hw->wiphy,
8947 NL80211_EXT_FEATURE_FILS_DISCOVERY);
8948 wiphy_ext_feature_set(ar->hw->wiphy,
8949 NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP);
8952 ath11k_reg_init(ar);
8954 if (!test_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags)) {
8955 ar->hw->netdev_features = NETIF_F_HW_CSUM;
8956 ieee80211_hw_set(ar->hw, SW_CRYPTO_CONTROL);
8957 ieee80211_hw_set(ar->hw, SUPPORT_FAST_XMIT);
8960 if (test_bit(WMI_TLV_SERVICE_BIOS_SAR_SUPPORT, ar->ab->wmi_ab.svc_map) &&
8961 ab->hw_params.bios_sar_capa)
8962 ar->hw->wiphy->sar_capa = ab->hw_params.bios_sar_capa;
8964 ret = ieee80211_register_hw(ar->hw);
8966 ath11k_err(ar->ab, "ieee80211 registration failed: %d\n", ret);
8967 goto err_free_if_combs;
8970 if (!ab->hw_params.supports_monitor)
8971 /* There's a race between calling ieee80211_register_hw()
8972 * and here where the monitor mode is enabled for a little
8973 * while. But that time is so short and in practise it make
8974 * a difference in real life.
8976 ar->hw->wiphy->interface_modes &= ~BIT(NL80211_IFTYPE_MONITOR);
8978 /* Apply the regd received during initialization */
8979 ret = ath11k_regd_update(ar);
8981 ath11k_err(ar->ab, "ath11k regd update failed: %d\n", ret);
8982 goto err_unregister_hw;
8985 if (ab->hw_params.current_cc_support && ab->new_alpha2[0]) {
8986 struct wmi_set_current_country_params set_current_param = {};
8988 memcpy(&set_current_param.alpha2, ab->new_alpha2, 2);
8989 memcpy(&ar->alpha2, ab->new_alpha2, 2);
8990 ret = ath11k_wmi_send_set_current_country_cmd(ar, &set_current_param);
8993 "failed set cc code for mac register: %d\n", ret);
8996 ret = ath11k_debugfs_register(ar);
8998 ath11k_err(ar->ab, "debugfs registration failed: %d\n", ret);
8999 goto err_unregister_hw;
9005 ieee80211_unregister_hw(ar->hw);
9008 kfree(ar->hw->wiphy->iface_combinations[0].limits);
9009 kfree(ar->hw->wiphy->iface_combinations);
9012 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
9013 kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels);
9014 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
9017 SET_IEEE80211_DEV(ar->hw, NULL);
9021 int ath11k_mac_register(struct ath11k_base *ab)
9024 struct ath11k_pdev *pdev;
9028 if (test_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags))
9031 /* Initialize channel counters frequency value in hertz */
9032 ab->cc_freq_hz = IPQ8074_CC_FREQ_HERTZ;
9033 ab->free_vdev_map = (1LL << (ab->num_radios * TARGET_NUM_VDEVS(ab))) - 1;
9035 ret = ath11k_peer_rhash_tbl_init(ab);
9039 for (i = 0; i < ab->num_radios; i++) {
9040 pdev = &ab->pdevs[i];
9042 if (ab->pdevs_macaddr_valid) {
9043 ether_addr_copy(ar->mac_addr, pdev->mac_addr);
9045 ether_addr_copy(ar->mac_addr, ab->mac_addr);
9046 ar->mac_addr[4] += i;
9049 idr_init(&ar->txmgmt_idr);
9050 spin_lock_init(&ar->txmgmt_idr_lock);
9052 ret = __ath11k_mac_register(ar);
9056 init_waitqueue_head(&ar->txmgmt_empty_waitq);
9062 for (i = i - 1; i >= 0; i--) {
9063 pdev = &ab->pdevs[i];
9065 __ath11k_mac_unregister(ar);
9068 ath11k_peer_rhash_tbl_destroy(ab);
9073 int ath11k_mac_allocate(struct ath11k_base *ab)
9075 struct ieee80211_hw *hw;
9077 struct ath11k_pdev *pdev;
9081 if (test_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags))
9084 for (i = 0; i < ab->num_radios; i++) {
9085 pdev = &ab->pdevs[i];
9086 hw = ieee80211_alloc_hw(sizeof(struct ath11k), &ath11k_ops);
9088 ath11k_warn(ab, "failed to allocate mac80211 hw device\n");
9098 ar->lmac_id = ath11k_hw_get_mac_from_pdev_id(&ab->hw_params, i);
9100 ar->wmi = &ab->wmi_ab.wmi[i];
9101 /* FIXME wmi[0] is already initialized during attach,
9102 * Should we do this again?
9104 ath11k_wmi_pdev_attach(ab, i);
9106 ar->cfg_tx_chainmask = pdev->cap.tx_chain_mask;
9107 ar->cfg_rx_chainmask = pdev->cap.rx_chain_mask;
9108 ar->num_tx_chains = get_num_chains(pdev->cap.tx_chain_mask);
9109 ar->num_rx_chains = get_num_chains(pdev->cap.rx_chain_mask);
9112 spin_lock_init(&ar->data_lock);
9113 INIT_LIST_HEAD(&ar->arvifs);
9114 INIT_LIST_HEAD(&ar->ppdu_stats_info);
9115 mutex_init(&ar->conf_mutex);
9116 init_completion(&ar->vdev_setup_done);
9117 init_completion(&ar->vdev_delete_done);
9118 init_completion(&ar->peer_assoc_done);
9119 init_completion(&ar->peer_delete_done);
9120 init_completion(&ar->install_key_done);
9121 init_completion(&ar->bss_survey_done);
9122 init_completion(&ar->scan.started);
9123 init_completion(&ar->scan.completed);
9124 init_completion(&ar->scan.on_channel);
9125 init_completion(&ar->thermal.wmi_sync);
9127 INIT_DELAYED_WORK(&ar->scan.timeout, ath11k_scan_timeout_work);
9128 INIT_WORK(&ar->regd_update_work, ath11k_regd_update_work);
9130 INIT_WORK(&ar->wmi_mgmt_tx_work, ath11k_mgmt_over_wmi_tx_work);
9131 skb_queue_head_init(&ar->wmi_mgmt_tx_queue);
9133 clear_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags);
9135 ar->monitor_vdev_id = -1;
9136 clear_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags);
9137 ar->vdev_id_11d_scan = ATH11K_11D_INVALID_VDEV_ID;
9138 init_completion(&ar->completed_11d_scan);
9144 ath11k_mac_destroy(ab);
9149 void ath11k_mac_destroy(struct ath11k_base *ab)
9152 struct ath11k_pdev *pdev;
9155 for (i = 0; i < ab->num_radios; i++) {
9156 pdev = &ab->pdevs[i];
9161 ieee80211_free_hw(ar->hw);
9166 int ath11k_mac_vif_set_keepalive(struct ath11k_vif *arvif,
9167 enum wmi_sta_keepalive_method method,
9170 struct ath11k *ar = arvif->ar;
9171 struct wmi_sta_keepalive_arg arg = {};
9174 lockdep_assert_held(&ar->conf_mutex);
9176 if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
9179 if (!test_bit(WMI_TLV_SERVICE_STA_KEEP_ALIVE, ar->ab->wmi_ab.svc_map))
9182 arg.vdev_id = arvif->vdev_id;
9184 arg.method = method;
9185 arg.interval = interval;
9187 ret = ath11k_wmi_sta_keepalive(ar, &arg);
9189 ath11k_warn(ar->ab, "failed to set keepalive on vdev %i: %d\n",
9190 arvif->vdev_id, ret);