1 // SPDX-License-Identifier: BSD-3-Clause-Clear
3 * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
4 * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
7 #include <net/mac80211.h>
8 #include <net/cfg80211.h>
9 #include <linux/etherdevice.h>
10 #include <linux/bitfield.h>
11 #include <linux/inetdevice.h>
12 #include <net/if_inet6.h>
24 #include "debugfs_sta.h"
28 #define CHAN2G(_channel, _freq, _flags) { \
29 .band = NL80211_BAND_2GHZ, \
30 .hw_value = (_channel), \
31 .center_freq = (_freq), \
33 .max_antenna_gain = 0, \
37 #define CHAN5G(_channel, _freq, _flags) { \
38 .band = NL80211_BAND_5GHZ, \
39 .hw_value = (_channel), \
40 .center_freq = (_freq), \
42 .max_antenna_gain = 0, \
46 #define CHAN6G(_channel, _freq, _flags) { \
47 .band = NL80211_BAND_6GHZ, \
48 .hw_value = (_channel), \
49 .center_freq = (_freq), \
51 .max_antenna_gain = 0, \
55 static const struct ieee80211_channel ath11k_2ghz_channels[] = {
72 static const struct ieee80211_channel ath11k_5ghz_channels[] = {
100 CHAN5G(177, 5885, 0),
103 static const struct ieee80211_channel ath11k_6ghz_channels[] = {
129 CHAN6G(101, 6455, 0),
130 CHAN6G(105, 6475, 0),
131 CHAN6G(109, 6495, 0),
132 CHAN6G(113, 6515, 0),
133 CHAN6G(117, 6535, 0),
134 CHAN6G(121, 6555, 0),
135 CHAN6G(125, 6575, 0),
136 CHAN6G(129, 6595, 0),
137 CHAN6G(133, 6615, 0),
138 CHAN6G(137, 6635, 0),
139 CHAN6G(141, 6655, 0),
140 CHAN6G(145, 6675, 0),
141 CHAN6G(149, 6695, 0),
142 CHAN6G(153, 6715, 0),
143 CHAN6G(157, 6735, 0),
144 CHAN6G(161, 6755, 0),
145 CHAN6G(165, 6775, 0),
146 CHAN6G(169, 6795, 0),
147 CHAN6G(173, 6815, 0),
148 CHAN6G(177, 6835, 0),
149 CHAN6G(181, 6855, 0),
150 CHAN6G(185, 6875, 0),
151 CHAN6G(189, 6895, 0),
152 CHAN6G(193, 6915, 0),
153 CHAN6G(197, 6935, 0),
154 CHAN6G(201, 6955, 0),
155 CHAN6G(205, 6975, 0),
156 CHAN6G(209, 6995, 0),
157 CHAN6G(213, 7015, 0),
158 CHAN6G(217, 7035, 0),
159 CHAN6G(221, 7055, 0),
160 CHAN6G(225, 7075, 0),
161 CHAN6G(229, 7095, 0),
162 CHAN6G(233, 7115, 0),
164 /* new addition in IEEE Std 802.11ax-2021 */
168 static struct ieee80211_rate ath11k_legacy_rates[] = {
170 .hw_value = ATH11K_HW_RATE_CCK_LP_1M },
172 .hw_value = ATH11K_HW_RATE_CCK_LP_2M,
173 .hw_value_short = ATH11K_HW_RATE_CCK_SP_2M,
174 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
176 .hw_value = ATH11K_HW_RATE_CCK_LP_5_5M,
177 .hw_value_short = ATH11K_HW_RATE_CCK_SP_5_5M,
178 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
180 .hw_value = ATH11K_HW_RATE_CCK_LP_11M,
181 .hw_value_short = ATH11K_HW_RATE_CCK_SP_11M,
182 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
184 { .bitrate = 60, .hw_value = ATH11K_HW_RATE_OFDM_6M },
185 { .bitrate = 90, .hw_value = ATH11K_HW_RATE_OFDM_9M },
186 { .bitrate = 120, .hw_value = ATH11K_HW_RATE_OFDM_12M },
187 { .bitrate = 180, .hw_value = ATH11K_HW_RATE_OFDM_18M },
188 { .bitrate = 240, .hw_value = ATH11K_HW_RATE_OFDM_24M },
189 { .bitrate = 360, .hw_value = ATH11K_HW_RATE_OFDM_36M },
190 { .bitrate = 480, .hw_value = ATH11K_HW_RATE_OFDM_48M },
191 { .bitrate = 540, .hw_value = ATH11K_HW_RATE_OFDM_54M },
195 ath11k_phymodes[NUM_NL80211_BANDS][ATH11K_CHAN_WIDTH_NUM] = {
196 [NL80211_BAND_2GHZ] = {
197 [NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
198 [NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
199 [NL80211_CHAN_WIDTH_20_NOHT] = MODE_11AX_HE20_2G,
200 [NL80211_CHAN_WIDTH_20] = MODE_11AX_HE20_2G,
201 [NL80211_CHAN_WIDTH_40] = MODE_11AX_HE40_2G,
202 [NL80211_CHAN_WIDTH_80] = MODE_11AX_HE80_2G,
203 [NL80211_CHAN_WIDTH_80P80] = MODE_UNKNOWN,
204 [NL80211_CHAN_WIDTH_160] = MODE_UNKNOWN,
206 [NL80211_BAND_5GHZ] = {
207 [NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
208 [NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
209 [NL80211_CHAN_WIDTH_20_NOHT] = MODE_11AX_HE20,
210 [NL80211_CHAN_WIDTH_20] = MODE_11AX_HE20,
211 [NL80211_CHAN_WIDTH_40] = MODE_11AX_HE40,
212 [NL80211_CHAN_WIDTH_80] = MODE_11AX_HE80,
213 [NL80211_CHAN_WIDTH_160] = MODE_11AX_HE160,
214 [NL80211_CHAN_WIDTH_80P80] = MODE_11AX_HE80_80,
216 [NL80211_BAND_6GHZ] = {
217 [NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
218 [NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
219 [NL80211_CHAN_WIDTH_20_NOHT] = MODE_11AX_HE20,
220 [NL80211_CHAN_WIDTH_20] = MODE_11AX_HE20,
221 [NL80211_CHAN_WIDTH_40] = MODE_11AX_HE40,
222 [NL80211_CHAN_WIDTH_80] = MODE_11AX_HE80,
223 [NL80211_CHAN_WIDTH_160] = MODE_11AX_HE160,
224 [NL80211_CHAN_WIDTH_80P80] = MODE_11AX_HE80_80,
229 const struct htt_rx_ring_tlv_filter ath11k_mac_mon_status_filter_default = {
230 .rx_filter = HTT_RX_FILTER_TLV_FLAGS_MPDU_START |
231 HTT_RX_FILTER_TLV_FLAGS_PPDU_END |
232 HTT_RX_FILTER_TLV_FLAGS_PPDU_END_STATUS_DONE,
233 .pkt_filter_flags0 = HTT_RX_FP_MGMT_FILTER_FLAGS0,
234 .pkt_filter_flags1 = HTT_RX_FP_MGMT_FILTER_FLAGS1,
235 .pkt_filter_flags2 = HTT_RX_FP_CTRL_FILTER_FLASG2,
236 .pkt_filter_flags3 = HTT_RX_FP_DATA_FILTER_FLASG3 |
237 HTT_RX_FP_CTRL_FILTER_FLASG3
240 #define ATH11K_MAC_FIRST_OFDM_RATE_IDX 4
241 #define ath11k_g_rates ath11k_legacy_rates
242 #define ath11k_g_rates_size (ARRAY_SIZE(ath11k_legacy_rates))
243 #define ath11k_a_rates (ath11k_legacy_rates + 4)
244 #define ath11k_a_rates_size (ARRAY_SIZE(ath11k_legacy_rates) - 4)
246 #define ATH11K_MAC_SCAN_CMD_EVT_OVERHEAD 200 /* in msecs */
248 /* Overhead due to the processing of channel switch events from FW */
249 #define ATH11K_SCAN_CHANNEL_SWITCH_WMI_EVT_OVERHEAD 10 /* in msecs */
251 static const u32 ath11k_smps_map[] = {
252 [WLAN_HT_CAP_SM_PS_STATIC] = WMI_PEER_SMPS_STATIC,
253 [WLAN_HT_CAP_SM_PS_DYNAMIC] = WMI_PEER_SMPS_DYNAMIC,
254 [WLAN_HT_CAP_SM_PS_INVALID] = WMI_PEER_SMPS_PS_NONE,
255 [WLAN_HT_CAP_SM_PS_DISABLED] = WMI_PEER_SMPS_PS_NONE,
258 enum nl80211_he_ru_alloc ath11k_mac_phy_he_ru_to_nl80211_he_ru_alloc(u16 ru_phy)
260 enum nl80211_he_ru_alloc ret;
264 ret = NL80211_RATE_INFO_HE_RU_ALLOC_26;
267 ret = NL80211_RATE_INFO_HE_RU_ALLOC_52;
270 ret = NL80211_RATE_INFO_HE_RU_ALLOC_106;
273 ret = NL80211_RATE_INFO_HE_RU_ALLOC_242;
276 ret = NL80211_RATE_INFO_HE_RU_ALLOC_484;
279 ret = NL80211_RATE_INFO_HE_RU_ALLOC_996;
282 ret = NL80211_RATE_INFO_HE_RU_ALLOC_26;
289 enum nl80211_he_ru_alloc ath11k_mac_he_ru_tones_to_nl80211_he_ru_alloc(u16 ru_tones)
291 enum nl80211_he_ru_alloc ret;
295 ret = NL80211_RATE_INFO_HE_RU_ALLOC_26;
298 ret = NL80211_RATE_INFO_HE_RU_ALLOC_52;
301 ret = NL80211_RATE_INFO_HE_RU_ALLOC_106;
304 ret = NL80211_RATE_INFO_HE_RU_ALLOC_242;
307 ret = NL80211_RATE_INFO_HE_RU_ALLOC_484;
310 ret = NL80211_RATE_INFO_HE_RU_ALLOC_996;
313 ret = NL80211_RATE_INFO_HE_RU_ALLOC_2x996;
316 ret = NL80211_RATE_INFO_HE_RU_ALLOC_26;
323 enum nl80211_he_gi ath11k_mac_he_gi_to_nl80211_he_gi(u8 sgi)
325 enum nl80211_he_gi ret;
328 case RX_MSDU_START_SGI_0_8_US:
329 ret = NL80211_RATE_INFO_HE_GI_0_8;
331 case RX_MSDU_START_SGI_1_6_US:
332 ret = NL80211_RATE_INFO_HE_GI_1_6;
334 case RX_MSDU_START_SGI_3_2_US:
335 ret = NL80211_RATE_INFO_HE_GI_3_2;
338 ret = NL80211_RATE_INFO_HE_GI_0_8;
345 u8 ath11k_mac_bw_to_mac80211_bw(u8 bw)
351 ret = RATE_INFO_BW_20;
354 ret = RATE_INFO_BW_40;
357 ret = RATE_INFO_BW_80;
360 ret = RATE_INFO_BW_160;
367 enum ath11k_supported_bw ath11k_mac_mac80211_bw_to_ath11k_bw(enum rate_info_bw bw)
370 case RATE_INFO_BW_20:
372 case RATE_INFO_BW_40:
374 case RATE_INFO_BW_80:
376 case RATE_INFO_BW_160:
377 return ATH11K_BW_160;
383 int ath11k_mac_hw_ratecode_to_legacy_rate(u8 hw_rc, u8 preamble, u8 *rateidx,
386 /* As default, it is OFDM rates */
387 int i = ATH11K_MAC_FIRST_OFDM_RATE_IDX;
388 int max_rates_idx = ath11k_g_rates_size;
390 if (preamble == WMI_RATE_PREAMBLE_CCK) {
391 hw_rc &= ~ATH11k_HW_RATECODE_CCK_SHORT_PREAM_MASK;
393 max_rates_idx = ATH11K_MAC_FIRST_OFDM_RATE_IDX;
396 while (i < max_rates_idx) {
397 if (hw_rc == ath11k_legacy_rates[i].hw_value) {
399 *rate = ath11k_legacy_rates[i].bitrate;
408 static int get_num_chains(u32 mask)
421 u8 ath11k_mac_bitrate_to_idx(const struct ieee80211_supported_band *sband,
426 for (i = 0; i < sband->n_bitrates; i++)
427 if (sband->bitrates[i].bitrate == bitrate)
434 ath11k_mac_max_ht_nss(const u8 *ht_mcs_mask)
438 for (nss = IEEE80211_HT_MCS_MASK_LEN - 1; nss >= 0; nss--)
439 if (ht_mcs_mask[nss])
446 ath11k_mac_max_vht_nss(const u16 *vht_mcs_mask)
450 for (nss = NL80211_VHT_NSS_MAX - 1; nss >= 0; nss--)
451 if (vht_mcs_mask[nss])
458 ath11k_mac_max_he_nss(const u16 *he_mcs_mask)
462 for (nss = NL80211_HE_NSS_MAX - 1; nss >= 0; nss--)
463 if (he_mcs_mask[nss])
469 static u8 ath11k_parse_mpdudensity(u8 mpdudensity)
471 /* 802.11n D2.0 defined values for "Minimum MPDU Start Spacing":
472 * 0 for no restriction
481 switch (mpdudensity) {
487 /* Our lower layer calculations limit our precision to
504 static int ath11k_mac_vif_chan(struct ieee80211_vif *vif,
505 struct cfg80211_chan_def *def)
507 struct ieee80211_chanctx_conf *conf;
510 conf = rcu_dereference(vif->bss_conf.chanctx_conf);
522 static bool ath11k_mac_bitrate_is_cck(int bitrate)
535 u8 ath11k_mac_hw_rate_to_idx(const struct ieee80211_supported_band *sband,
536 u8 hw_rate, bool cck)
538 const struct ieee80211_rate *rate;
541 for (i = 0; i < sband->n_bitrates; i++) {
542 rate = &sband->bitrates[i];
544 if (ath11k_mac_bitrate_is_cck(rate->bitrate) != cck)
547 if (rate->hw_value == hw_rate)
549 else if (rate->flags & IEEE80211_RATE_SHORT_PREAMBLE &&
550 rate->hw_value_short == hw_rate)
557 static u8 ath11k_mac_bitrate_to_rate(int bitrate)
559 return DIV_ROUND_UP(bitrate, 5) |
560 (ath11k_mac_bitrate_is_cck(bitrate) ? BIT(7) : 0);
563 static void ath11k_get_arvif_iter(void *data, u8 *mac,
564 struct ieee80211_vif *vif)
566 struct ath11k_vif_iter *arvif_iter = data;
567 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
569 if (arvif->vdev_id == arvif_iter->vdev_id)
570 arvif_iter->arvif = arvif;
573 struct ath11k_vif *ath11k_mac_get_arvif(struct ath11k *ar, u32 vdev_id)
575 struct ath11k_vif_iter arvif_iter;
578 memset(&arvif_iter, 0, sizeof(struct ath11k_vif_iter));
579 arvif_iter.vdev_id = vdev_id;
581 flags = IEEE80211_IFACE_ITER_RESUME_ALL;
582 ieee80211_iterate_active_interfaces_atomic(ar->hw,
584 ath11k_get_arvif_iter,
586 if (!arvif_iter.arvif) {
587 ath11k_warn(ar->ab, "No VIF found for vdev %d\n", vdev_id);
591 return arvif_iter.arvif;
594 struct ath11k_vif *ath11k_mac_get_arvif_by_vdev_id(struct ath11k_base *ab,
598 struct ath11k_pdev *pdev;
599 struct ath11k_vif *arvif;
601 for (i = 0; i < ab->num_radios; i++) {
602 pdev = rcu_dereference(ab->pdevs_active[i]);
603 if (pdev && pdev->ar &&
604 (pdev->ar->allocated_vdev_map & (1LL << vdev_id))) {
605 arvif = ath11k_mac_get_arvif(pdev->ar, vdev_id);
614 struct ath11k *ath11k_mac_get_ar_by_vdev_id(struct ath11k_base *ab, u32 vdev_id)
617 struct ath11k_pdev *pdev;
619 for (i = 0; i < ab->num_radios; i++) {
620 pdev = rcu_dereference(ab->pdevs_active[i]);
621 if (pdev && pdev->ar) {
622 if (pdev->ar->allocated_vdev_map & (1LL << vdev_id))
630 struct ath11k *ath11k_mac_get_ar_by_pdev_id(struct ath11k_base *ab, u32 pdev_id)
633 struct ath11k_pdev *pdev;
635 if (ab->hw_params.single_pdev_only) {
636 pdev = rcu_dereference(ab->pdevs_active[0]);
637 return pdev ? pdev->ar : NULL;
640 if (WARN_ON(pdev_id > ab->num_radios))
643 for (i = 0; i < ab->num_radios; i++) {
644 if (ab->fw_mode == ATH11K_FIRMWARE_MODE_FTM)
645 pdev = &ab->pdevs[i];
647 pdev = rcu_dereference(ab->pdevs_active[i]);
649 if (pdev && pdev->pdev_id == pdev_id)
650 return (pdev->ar ? pdev->ar : NULL);
656 struct ath11k_vif *ath11k_mac_get_vif_up(struct ath11k_base *ab)
659 struct ath11k_pdev *pdev;
660 struct ath11k_vif *arvif;
663 for (i = 0; i < ab->num_radios; i++) {
664 pdev = &ab->pdevs[i];
666 list_for_each_entry(arvif, &ar->arvifs, list) {
675 static bool ath11k_mac_band_match(enum nl80211_band band1, enum WMI_HOST_WLAN_BAND band2)
677 return (((band1 == NL80211_BAND_2GHZ) && (band2 & WMI_HOST_WLAN_2G_CAP)) ||
678 (((band1 == NL80211_BAND_5GHZ) || (band1 == NL80211_BAND_6GHZ)) &&
679 (band2 & WMI_HOST_WLAN_5G_CAP)));
682 u8 ath11k_mac_get_target_pdev_id_from_vif(struct ath11k_vif *arvif)
684 struct ath11k *ar = arvif->ar;
685 struct ath11k_base *ab = ar->ab;
686 struct ieee80211_vif *vif = arvif->vif;
687 struct cfg80211_chan_def def;
688 enum nl80211_band band;
689 u8 pdev_id = ab->target_pdev_ids[0].pdev_id;
692 if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
695 band = def.chan->band;
697 for (i = 0; i < ab->target_pdev_count; i++) {
698 if (ath11k_mac_band_match(band, ab->target_pdev_ids[i].supported_bands))
699 return ab->target_pdev_ids[i].pdev_id;
705 u8 ath11k_mac_get_target_pdev_id(struct ath11k *ar)
707 struct ath11k_vif *arvif;
709 arvif = ath11k_mac_get_vif_up(ar->ab);
712 return ath11k_mac_get_target_pdev_id_from_vif(arvif);
714 return ar->ab->target_pdev_ids[0].pdev_id;
717 static void ath11k_pdev_caps_update(struct ath11k *ar)
719 struct ath11k_base *ab = ar->ab;
721 ar->max_tx_power = ab->target_caps.hw_max_tx_power;
723 /* FIXME Set min_tx_power to ab->target_caps.hw_min_tx_power.
724 * But since the received value in svcrdy is same as hw_max_tx_power,
725 * we can set ar->min_tx_power to 0 currently until
726 * this is fixed in firmware
728 ar->min_tx_power = 0;
730 ar->txpower_limit_2g = ar->max_tx_power;
731 ar->txpower_limit_5g = ar->max_tx_power;
732 ar->txpower_scale = WMI_HOST_TP_SCALE_MAX;
735 static int ath11k_mac_txpower_recalc(struct ath11k *ar)
737 struct ath11k_pdev *pdev = ar->pdev;
738 struct ath11k_vif *arvif;
739 int ret, txpower = -1;
742 lockdep_assert_held(&ar->conf_mutex);
744 list_for_each_entry(arvif, &ar->arvifs, list) {
745 if (arvif->txpower <= 0)
749 txpower = arvif->txpower;
751 txpower = min(txpower, arvif->txpower);
757 /* txpwr is set as 2 units per dBm in FW*/
758 txpower = min_t(u32, max_t(u32, ar->min_tx_power, txpower),
759 ar->max_tx_power) * 2;
761 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "txpower to set in hw %d\n",
764 if ((pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) &&
765 ar->txpower_limit_2g != txpower) {
766 param = WMI_PDEV_PARAM_TXPOWER_LIMIT2G;
767 ret = ath11k_wmi_pdev_set_param(ar, param,
768 txpower, ar->pdev->pdev_id);
771 ar->txpower_limit_2g = txpower;
774 if ((pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) &&
775 ar->txpower_limit_5g != txpower) {
776 param = WMI_PDEV_PARAM_TXPOWER_LIMIT5G;
777 ret = ath11k_wmi_pdev_set_param(ar, param,
778 txpower, ar->pdev->pdev_id);
781 ar->txpower_limit_5g = txpower;
787 ath11k_warn(ar->ab, "failed to recalc txpower limit %d using pdev param %d: %d\n",
788 txpower / 2, param, ret);
792 static int ath11k_recalc_rtscts_prot(struct ath11k_vif *arvif)
794 struct ath11k *ar = arvif->ar;
795 u32 vdev_param, rts_cts = 0;
798 lockdep_assert_held(&ar->conf_mutex);
800 vdev_param = WMI_VDEV_PARAM_ENABLE_RTSCTS;
802 /* Enable RTS/CTS protection for sw retries (when legacy stations
803 * are in BSS) or by default only for second rate series.
804 * TODO: Check if we need to enable CTS 2 Self in any case
806 rts_cts = WMI_USE_RTS_CTS;
808 if (arvif->num_legacy_stations > 0)
809 rts_cts |= WMI_RTSCTS_ACROSS_SW_RETRIES << 4;
811 rts_cts |= WMI_RTSCTS_FOR_SECOND_RATESERIES << 4;
813 /* Need not send duplicate param value to firmware */
814 if (arvif->rtscts_prot_mode == rts_cts)
817 arvif->rtscts_prot_mode = rts_cts;
819 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %d recalc rts/cts prot %d\n",
820 arvif->vdev_id, rts_cts);
822 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
823 vdev_param, rts_cts);
825 ath11k_warn(ar->ab, "failed to recalculate rts/cts prot for vdev %d: %d\n",
826 arvif->vdev_id, ret);
831 static int ath11k_mac_set_kickout(struct ath11k_vif *arvif)
833 struct ath11k *ar = arvif->ar;
837 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_STA_KICKOUT_TH,
838 ATH11K_KICKOUT_THRESHOLD,
841 ath11k_warn(ar->ab, "failed to set kickout threshold on vdev %i: %d\n",
842 arvif->vdev_id, ret);
846 param = WMI_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS;
847 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param,
848 ATH11K_KEEPALIVE_MIN_IDLE);
850 ath11k_warn(ar->ab, "failed to set keepalive minimum idle time on vdev %i: %d\n",
851 arvif->vdev_id, ret);
855 param = WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS;
856 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param,
857 ATH11K_KEEPALIVE_MAX_IDLE);
859 ath11k_warn(ar->ab, "failed to set keepalive maximum idle time on vdev %i: %d\n",
860 arvif->vdev_id, ret);
864 param = WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS;
865 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param,
866 ATH11K_KEEPALIVE_MAX_UNRESPONSIVE);
868 ath11k_warn(ar->ab, "failed to set keepalive maximum unresponsive time on vdev %i: %d\n",
869 arvif->vdev_id, ret);
876 void ath11k_mac_peer_cleanup_all(struct ath11k *ar)
878 struct ath11k_peer *peer, *tmp;
879 struct ath11k_base *ab = ar->ab;
881 lockdep_assert_held(&ar->conf_mutex);
883 mutex_lock(&ab->tbl_mtx_lock);
884 spin_lock_bh(&ab->base_lock);
885 list_for_each_entry_safe(peer, tmp, &ab->peers, list) {
886 ath11k_peer_rx_tid_cleanup(ar, peer);
887 ath11k_peer_rhash_delete(ab, peer);
888 list_del(&peer->list);
891 spin_unlock_bh(&ab->base_lock);
892 mutex_unlock(&ab->tbl_mtx_lock);
895 ar->num_stations = 0;
898 static inline int ath11k_mac_vdev_setup_sync(struct ath11k *ar)
900 lockdep_assert_held(&ar->conf_mutex);
902 if (test_bit(ATH11K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags))
905 if (!wait_for_completion_timeout(&ar->vdev_setup_done,
906 ATH11K_VDEV_SETUP_TIMEOUT_HZ))
909 return ar->last_wmi_vdev_start_status ? -EINVAL : 0;
913 ath11k_mac_get_any_chandef_iter(struct ieee80211_hw *hw,
914 struct ieee80211_chanctx_conf *conf,
917 struct cfg80211_chan_def **def = data;
922 static int ath11k_mac_monitor_vdev_start(struct ath11k *ar, int vdev_id,
923 struct cfg80211_chan_def *chandef)
925 struct ieee80211_channel *channel;
926 struct wmi_vdev_start_req_arg arg = {};
929 lockdep_assert_held(&ar->conf_mutex);
931 channel = chandef->chan;
933 arg.vdev_id = vdev_id;
934 arg.channel.freq = channel->center_freq;
935 arg.channel.band_center_freq1 = chandef->center_freq1;
936 arg.channel.band_center_freq2 = chandef->center_freq2;
938 arg.channel.mode = ath11k_phymodes[chandef->chan->band][chandef->width];
939 arg.channel.chan_radar = !!(channel->flags & IEEE80211_CHAN_RADAR);
941 arg.channel.min_power = 0;
942 arg.channel.max_power = channel->max_power;
943 arg.channel.max_reg_power = channel->max_reg_power;
944 arg.channel.max_antenna_gain = channel->max_antenna_gain;
946 arg.pref_tx_streams = ar->num_tx_chains;
947 arg.pref_rx_streams = ar->num_rx_chains;
949 arg.channel.passive = !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR);
951 reinit_completion(&ar->vdev_setup_done);
952 reinit_completion(&ar->vdev_delete_done);
954 ret = ath11k_wmi_vdev_start(ar, &arg, false);
956 ath11k_warn(ar->ab, "failed to request monitor vdev %i start: %d\n",
961 ret = ath11k_mac_vdev_setup_sync(ar);
963 ath11k_warn(ar->ab, "failed to synchronize setup for monitor vdev %i start: %d\n",
968 ret = ath11k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr, NULL, 0, 0);
970 ath11k_warn(ar->ab, "failed to put up monitor vdev %i: %d\n",
975 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "monitor vdev %i started\n",
981 reinit_completion(&ar->vdev_setup_done);
983 ret = ath11k_wmi_vdev_stop(ar, vdev_id);
985 ath11k_warn(ar->ab, "failed to stop monitor vdev %i after start failure: %d\n",
990 ret = ath11k_mac_vdev_setup_sync(ar);
992 ath11k_warn(ar->ab, "failed to synchronize setup for vdev %i stop: %d\n",
1000 static int ath11k_mac_monitor_vdev_stop(struct ath11k *ar)
1004 lockdep_assert_held(&ar->conf_mutex);
1006 reinit_completion(&ar->vdev_setup_done);
1008 ret = ath11k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
1010 ath11k_warn(ar->ab, "failed to request monitor vdev %i stop: %d\n",
1011 ar->monitor_vdev_id, ret);
1015 ret = ath11k_mac_vdev_setup_sync(ar);
1017 ath11k_warn(ar->ab, "failed to synchronize monitor vdev %i stop: %d\n",
1018 ar->monitor_vdev_id, ret);
1022 ret = ath11k_wmi_vdev_down(ar, ar->monitor_vdev_id);
1024 ath11k_warn(ar->ab, "failed to put down monitor vdev %i: %d\n",
1025 ar->monitor_vdev_id, ret);
1029 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "monitor vdev %i stopped\n",
1030 ar->monitor_vdev_id);
1035 static int ath11k_mac_monitor_vdev_create(struct ath11k *ar)
1037 struct ath11k_pdev *pdev = ar->pdev;
1038 struct vdev_create_params param = {};
1040 u8 tmp_addr[6] = {0};
1043 lockdep_assert_held(&ar->conf_mutex);
1045 if (test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags))
1048 if (ar->ab->free_vdev_map == 0) {
1049 ath11k_warn(ar->ab, "failed to find free vdev id for monitor vdev\n");
1053 bit = __ffs64(ar->ab->free_vdev_map);
1055 ar->monitor_vdev_id = bit;
1057 param.if_id = ar->monitor_vdev_id;
1058 param.type = WMI_VDEV_TYPE_MONITOR;
1059 param.subtype = WMI_VDEV_SUBTYPE_NONE;
1060 param.pdev_id = pdev->pdev_id;
1062 if (pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) {
1063 param.chains[NL80211_BAND_2GHZ].tx = ar->num_tx_chains;
1064 param.chains[NL80211_BAND_2GHZ].rx = ar->num_rx_chains;
1066 if (pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) {
1067 param.chains[NL80211_BAND_5GHZ].tx = ar->num_tx_chains;
1068 param.chains[NL80211_BAND_5GHZ].rx = ar->num_rx_chains;
1071 ret = ath11k_wmi_vdev_create(ar, tmp_addr, ¶m);
1073 ath11k_warn(ar->ab, "failed to request monitor vdev %i creation: %d\n",
1074 ar->monitor_vdev_id, ret);
1075 ar->monitor_vdev_id = -1;
1079 nss = get_num_chains(ar->cfg_tx_chainmask) ? : 1;
1080 ret = ath11k_wmi_vdev_set_param_cmd(ar, ar->monitor_vdev_id,
1081 WMI_VDEV_PARAM_NSS, nss);
1083 ath11k_warn(ar->ab, "failed to set vdev %d chainmask 0x%x, nss %d :%d\n",
1084 ar->monitor_vdev_id, ar->cfg_tx_chainmask, nss, ret);
1088 ret = ath11k_mac_txpower_recalc(ar);
1090 ath11k_warn(ar->ab, "failed to recalc txpower for monitor vdev %d: %d\n",
1091 ar->monitor_vdev_id, ret);
1095 ar->allocated_vdev_map |= 1LL << ar->monitor_vdev_id;
1096 ar->ab->free_vdev_map &= ~(1LL << ar->monitor_vdev_id);
1097 ar->num_created_vdevs++;
1098 set_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags);
1100 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "monitor vdev %d created\n",
1101 ar->monitor_vdev_id);
1106 ath11k_wmi_vdev_delete(ar, ar->monitor_vdev_id);
1107 ar->monitor_vdev_id = -1;
1111 static int ath11k_mac_monitor_vdev_delete(struct ath11k *ar)
1114 unsigned long time_left;
1116 lockdep_assert_held(&ar->conf_mutex);
1118 if (!test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags))
1121 reinit_completion(&ar->vdev_delete_done);
1123 ret = ath11k_wmi_vdev_delete(ar, ar->monitor_vdev_id);
1125 ath11k_warn(ar->ab, "failed to request wmi monitor vdev %i removal: %d\n",
1126 ar->monitor_vdev_id, ret);
1130 time_left = wait_for_completion_timeout(&ar->vdev_delete_done,
1131 ATH11K_VDEV_DELETE_TIMEOUT_HZ);
1132 if (time_left == 0) {
1133 ath11k_warn(ar->ab, "Timeout in receiving vdev delete response\n");
1135 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "monitor vdev %d deleted\n",
1136 ar->monitor_vdev_id);
1138 ar->allocated_vdev_map &= ~(1LL << ar->monitor_vdev_id);
1139 ar->ab->free_vdev_map |= 1LL << (ar->monitor_vdev_id);
1140 ar->num_created_vdevs--;
1141 ar->monitor_vdev_id = -1;
1142 clear_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags);
1148 static int ath11k_mac_monitor_start(struct ath11k *ar)
1150 struct cfg80211_chan_def *chandef = NULL;
1153 lockdep_assert_held(&ar->conf_mutex);
1155 if (test_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags))
1158 ieee80211_iter_chan_contexts_atomic(ar->hw,
1159 ath11k_mac_get_any_chandef_iter,
1164 ret = ath11k_mac_monitor_vdev_start(ar, ar->monitor_vdev_id, chandef);
1166 ath11k_warn(ar->ab, "failed to start monitor vdev: %d\n", ret);
1167 ath11k_mac_monitor_vdev_delete(ar);
1171 set_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags);
1173 ar->num_started_vdevs++;
1174 ret = ath11k_dp_tx_htt_monitor_mode_ring_config(ar, false);
1176 ath11k_warn(ar->ab, "failed to configure htt monitor mode ring during start: %d",
1181 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "monitor started\n");
1186 static int ath11k_mac_monitor_stop(struct ath11k *ar)
1190 lockdep_assert_held(&ar->conf_mutex);
1192 if (!test_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags))
1195 ret = ath11k_mac_monitor_vdev_stop(ar);
1197 ath11k_warn(ar->ab, "failed to stop monitor vdev: %d\n", ret);
1201 clear_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags);
1202 ar->num_started_vdevs--;
1204 ret = ath11k_dp_tx_htt_monitor_mode_ring_config(ar, true);
1206 ath11k_warn(ar->ab, "failed to configure htt monitor mode ring during stop: %d",
1211 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "monitor stopped ret %d\n", ret);
1216 static int ath11k_mac_vif_setup_ps(struct ath11k_vif *arvif)
1218 struct ath11k *ar = arvif->ar;
1219 struct ieee80211_vif *vif = arvif->vif;
1220 struct ieee80211_conf *conf = &ar->hw->conf;
1221 enum wmi_sta_powersave_param param;
1222 enum wmi_sta_ps_mode psmode;
1227 lockdep_assert_held(&arvif->ar->conf_mutex);
1229 if (arvif->vif->type != NL80211_IFTYPE_STATION)
1232 enable_ps = arvif->ps;
1234 if (!arvif->is_started) {
1235 /* mac80211 can update vif powersave state while disconnected.
1236 * Firmware doesn't behave nicely and consumes more power than
1237 * necessary if PS is disabled on a non-started vdev. Hence
1238 * force-enable PS for non-running vdevs.
1240 psmode = WMI_STA_PS_MODE_ENABLED;
1241 } else if (enable_ps) {
1242 psmode = WMI_STA_PS_MODE_ENABLED;
1243 param = WMI_STA_PS_PARAM_INACTIVITY_TIME;
1245 timeout = conf->dynamic_ps_timeout;
1247 /* firmware doesn't like 0 */
1248 timeout = ieee80211_tu_to_usec(vif->bss_conf.beacon_int) / 1000;
1251 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param,
1254 ath11k_warn(ar->ab, "failed to set inactivity time for vdev %d: %i\n",
1255 arvif->vdev_id, ret);
1259 psmode = WMI_STA_PS_MODE_DISABLED;
1262 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %d psmode %s\n",
1263 arvif->vdev_id, psmode ? "enable" : "disable");
1265 ret = ath11k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id, psmode);
1267 ath11k_warn(ar->ab, "failed to set sta power save mode %d for vdev %d: %d\n",
1268 psmode, arvif->vdev_id, ret);
1275 static int ath11k_mac_config_ps(struct ath11k *ar)
1277 struct ath11k_vif *arvif;
1280 lockdep_assert_held(&ar->conf_mutex);
1282 list_for_each_entry(arvif, &ar->arvifs, list) {
1283 ret = ath11k_mac_vif_setup_ps(arvif);
1285 ath11k_warn(ar->ab, "failed to setup powersave: %d\n", ret);
1293 static int ath11k_mac_op_config(struct ieee80211_hw *hw, u32 changed)
1295 struct ath11k *ar = hw->priv;
1296 struct ieee80211_conf *conf = &hw->conf;
1299 mutex_lock(&ar->conf_mutex);
1301 if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
1302 if (conf->flags & IEEE80211_CONF_MONITOR) {
1303 set_bit(ATH11K_FLAG_MONITOR_CONF_ENABLED, &ar->monitor_flags);
1305 if (test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED,
1306 &ar->monitor_flags))
1309 ret = ath11k_mac_monitor_vdev_create(ar);
1311 ath11k_warn(ar->ab, "failed to create monitor vdev: %d",
1316 ret = ath11k_mac_monitor_start(ar);
1318 ath11k_warn(ar->ab, "failed to start monitor: %d",
1323 clear_bit(ATH11K_FLAG_MONITOR_CONF_ENABLED, &ar->monitor_flags);
1325 if (!test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED,
1326 &ar->monitor_flags))
1329 ret = ath11k_mac_monitor_stop(ar);
1331 ath11k_warn(ar->ab, "failed to stop monitor: %d",
1336 ret = ath11k_mac_monitor_vdev_delete(ar);
1338 ath11k_warn(ar->ab, "failed to delete monitor vdev: %d",
1346 mutex_unlock(&ar->conf_mutex);
1350 ath11k_mac_monitor_vdev_delete(ar);
1351 mutex_unlock(&ar->conf_mutex);
1355 static void ath11k_mac_setup_nontx_vif_rsnie(struct ath11k_vif *arvif,
1356 bool tx_arvif_rsnie_present,
1357 const u8 *profile, u8 profile_len)
1359 if (cfg80211_find_ie(WLAN_EID_RSN, profile, profile_len)) {
1360 arvif->rsnie_present = true;
1361 } else if (tx_arvif_rsnie_present) {
1364 const u8 *nie = cfg80211_find_ext_ie(WLAN_EID_EXT_NON_INHERITANCE,
1365 profile, profile_len);
1371 for (i = 0; i < nie_len; i++) {
1372 if (nie[i] == WLAN_EID_RSN) {
1373 arvif->rsnie_present = false;
1380 static bool ath11k_mac_set_nontx_vif_params(struct ath11k_vif *tx_arvif,
1381 struct ath11k_vif *arvif,
1382 struct sk_buff *bcn)
1384 struct ieee80211_mgmt *mgmt;
1385 const u8 *ies, *profile, *next_profile;
1388 ies = bcn->data + ieee80211_get_hdrlen_from_skb(bcn);
1389 mgmt = (struct ieee80211_mgmt *)bcn->data;
1390 ies += sizeof(mgmt->u.beacon);
1391 ies_len = skb_tail_pointer(bcn) - ies;
1393 ies = cfg80211_find_ie(WLAN_EID_MULTIPLE_BSSID, ies, ies_len);
1394 arvif->rsnie_present = tx_arvif->rsnie_present;
1399 ies_len -= (2 + ies[1]);
1400 mbssid_len = ies[1] - 1;
1403 while (mbssid_len) {
1406 profile_len = profile[1];
1407 next_profile = profile + (2 + profile_len);
1408 mbssid_len -= (2 + profile_len);
1411 profile_len -= (2 + profile[1]);
1412 profile += (2 + profile[1]); /* nontx capabilities */
1413 profile_len -= (2 + profile[1]);
1414 profile += (2 + profile[1]); /* SSID */
1415 if (profile[2] == arvif->vif->bss_conf.bssid_index) {
1417 profile = profile + 5;
1418 ath11k_mac_setup_nontx_vif_rsnie(arvif,
1419 tx_arvif->rsnie_present,
1424 profile = next_profile;
1426 ies = cfg80211_find_ie(WLAN_EID_MULTIPLE_BSSID, profile,
1433 static void ath11k_mac_set_vif_params(struct ath11k_vif *arvif,
1434 struct sk_buff *bcn)
1436 struct ieee80211_mgmt *mgmt;
1439 ies = bcn->data + ieee80211_get_hdrlen_from_skb(bcn);
1440 mgmt = (struct ieee80211_mgmt *)bcn->data;
1441 ies += sizeof(mgmt->u.beacon);
1443 if (cfg80211_find_ie(WLAN_EID_RSN, ies, (skb_tail_pointer(bcn) - ies)))
1444 arvif->rsnie_present = true;
1446 arvif->rsnie_present = false;
1448 if (cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
1449 WLAN_OUI_TYPE_MICROSOFT_WPA,
1450 ies, (skb_tail_pointer(bcn) - ies)))
1451 arvif->wpaie_present = true;
1453 arvif->wpaie_present = false;
1456 static int ath11k_mac_setup_bcn_tmpl_ema(struct ath11k_vif *arvif)
1458 struct ath11k_vif *tx_arvif;
1459 struct ieee80211_ema_beacons *beacons;
1461 bool nontx_vif_params_set = false;
1465 tx_arvif = ath11k_vif_to_arvif(arvif->vif->mbssid_tx_vif);
1467 beacons = ieee80211_beacon_get_template_ema_list(tx_arvif->ar->hw,
1469 if (!beacons || !beacons->cnt) {
1470 ath11k_warn(arvif->ar->ab,
1471 "failed to get ema beacon templates from mac80211\n");
1475 if (tx_arvif == arvif)
1476 ath11k_mac_set_vif_params(tx_arvif, beacons->bcn[0].skb);
1478 arvif->wpaie_present = tx_arvif->wpaie_present;
1480 for (i = 0; i < beacons->cnt; i++) {
1481 if (tx_arvif != arvif && !nontx_vif_params_set)
1482 nontx_vif_params_set =
1483 ath11k_mac_set_nontx_vif_params(tx_arvif, arvif,
1484 beacons->bcn[i].skb);
1486 params = beacons->cnt;
1487 params |= (i << WMI_EMA_TMPL_IDX_SHIFT);
1488 params |= ((!i ? 1 : 0) << WMI_EMA_FIRST_TMPL_SHIFT);
1489 params |= ((i + 1 == beacons->cnt ? 1 : 0) << WMI_EMA_LAST_TMPL_SHIFT);
1491 ret = ath11k_wmi_bcn_tmpl(tx_arvif->ar, tx_arvif->vdev_id,
1492 &beacons->bcn[i].offs,
1493 beacons->bcn[i].skb, params);
1495 ath11k_warn(tx_arvif->ar->ab,
1496 "failed to set ema beacon template id %i error %d\n",
1502 ieee80211_beacon_free_ema_list(beacons);
1504 if (tx_arvif != arvif && !nontx_vif_params_set)
1505 return -EINVAL; /* Profile not found in the beacons */
1510 static int ath11k_mac_setup_bcn_tmpl_mbssid(struct ath11k_vif *arvif)
1512 struct ath11k *ar = arvif->ar;
1513 struct ath11k_base *ab = ar->ab;
1514 struct ath11k_vif *tx_arvif = arvif;
1515 struct ieee80211_hw *hw = ar->hw;
1516 struct ieee80211_vif *vif = arvif->vif;
1517 struct ieee80211_mutable_offsets offs = {};
1518 struct sk_buff *bcn;
1521 if (vif->mbssid_tx_vif) {
1522 tx_arvif = ath11k_vif_to_arvif(vif->mbssid_tx_vif);
1523 if (tx_arvif != arvif) {
1527 vif = tx_arvif->vif;
1531 bcn = ieee80211_beacon_get_template(hw, vif, &offs, 0);
1533 ath11k_warn(ab, "failed to get beacon template from mac80211\n");
1537 if (tx_arvif == arvif)
1538 ath11k_mac_set_vif_params(tx_arvif, bcn);
1539 else if (!ath11k_mac_set_nontx_vif_params(tx_arvif, arvif, bcn))
1542 ret = ath11k_wmi_bcn_tmpl(ar, arvif->vdev_id, &offs, bcn, 0);
1546 ath11k_warn(ab, "failed to submit beacon template command: %d\n",
1552 static int ath11k_mac_setup_bcn_tmpl(struct ath11k_vif *arvif)
1554 struct ieee80211_vif *vif = arvif->vif;
1556 if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
1559 /* Target does not expect beacon templates for the already up
1560 * non-transmitting interfaces, and results in a crash if sent.
1562 if (vif->mbssid_tx_vif &&
1563 arvif != ath11k_vif_to_arvif(vif->mbssid_tx_vif) && arvif->is_up)
1566 if (vif->bss_conf.ema_ap && vif->mbssid_tx_vif)
1567 return ath11k_mac_setup_bcn_tmpl_ema(arvif);
1569 return ath11k_mac_setup_bcn_tmpl_mbssid(arvif);
1572 void ath11k_mac_bcn_tx_event(struct ath11k_vif *arvif)
1574 struct ieee80211_vif *vif = arvif->vif;
1576 if (!vif->bss_conf.color_change_active && !arvif->bcca_zero_sent)
1579 if (vif->bss_conf.color_change_active &&
1580 ieee80211_beacon_cntdwn_is_complete(vif, 0)) {
1581 arvif->bcca_zero_sent = true;
1582 ieee80211_color_change_finish(vif);
1586 arvif->bcca_zero_sent = false;
1588 if (vif->bss_conf.color_change_active)
1589 ieee80211_beacon_update_cntdwn(vif, 0);
1590 ath11k_mac_setup_bcn_tmpl(arvif);
1593 static void ath11k_control_beaconing(struct ath11k_vif *arvif,
1594 struct ieee80211_bss_conf *info)
1596 struct ath11k *ar = arvif->ar;
1597 struct ath11k_vif *tx_arvif = NULL;
1600 lockdep_assert_held(&arvif->ar->conf_mutex);
1602 if (!info->enable_beacon) {
1603 ret = ath11k_wmi_vdev_down(ar, arvif->vdev_id);
1605 ath11k_warn(ar->ab, "failed to down vdev_id %i: %d\n",
1606 arvif->vdev_id, ret);
1608 arvif->is_up = false;
1612 /* Install the beacon template to the FW */
1613 ret = ath11k_mac_setup_bcn_tmpl(arvif);
1615 ath11k_warn(ar->ab, "failed to update bcn tmpl during vdev up: %d\n",
1620 arvif->tx_seq_no = 0x1000;
1624 ether_addr_copy(arvif->bssid, info->bssid);
1626 if (arvif->vif->mbssid_tx_vif)
1627 tx_arvif = ath11k_vif_to_arvif(arvif->vif->mbssid_tx_vif);
1629 ret = ath11k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
1631 tx_arvif ? tx_arvif->bssid : NULL,
1633 1 << info->bssid_indicator);
1635 ath11k_warn(ar->ab, "failed to bring up vdev %d: %i\n",
1636 arvif->vdev_id, ret);
1640 arvif->is_up = true;
1642 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %d up\n", arvif->vdev_id);
1645 static void ath11k_mac_handle_beacon_iter(void *data, u8 *mac,
1646 struct ieee80211_vif *vif)
1648 struct sk_buff *skb = data;
1649 struct ieee80211_mgmt *mgmt = (void *)skb->data;
1650 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
1652 if (vif->type != NL80211_IFTYPE_STATION)
1655 if (!ether_addr_equal(mgmt->bssid, vif->bss_conf.bssid))
1658 cancel_delayed_work(&arvif->connection_loss_work);
1661 void ath11k_mac_handle_beacon(struct ath11k *ar, struct sk_buff *skb)
1663 ieee80211_iterate_active_interfaces_atomic(ar->hw,
1664 IEEE80211_IFACE_ITER_NORMAL,
1665 ath11k_mac_handle_beacon_iter,
1669 static void ath11k_mac_handle_beacon_miss_iter(void *data, u8 *mac,
1670 struct ieee80211_vif *vif)
1672 u32 *vdev_id = data;
1673 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
1674 struct ath11k *ar = arvif->ar;
1675 struct ieee80211_hw *hw = ar->hw;
1677 if (arvif->vdev_id != *vdev_id)
1683 ieee80211_beacon_loss(vif);
1685 /* Firmware doesn't report beacon loss events repeatedly. If AP probe
1686 * (done by mac80211) succeeds but beacons do not resume then it
1687 * doesn't make sense to continue operation. Queue connection loss work
1688 * which can be cancelled when beacon is received.
1690 ieee80211_queue_delayed_work(hw, &arvif->connection_loss_work,
1691 ATH11K_CONNECTION_LOSS_HZ);
1694 void ath11k_mac_handle_beacon_miss(struct ath11k *ar, u32 vdev_id)
1696 ieee80211_iterate_active_interfaces_atomic(ar->hw,
1697 IEEE80211_IFACE_ITER_NORMAL,
1698 ath11k_mac_handle_beacon_miss_iter,
1702 static void ath11k_mac_vif_sta_connection_loss_work(struct work_struct *work)
1704 struct ath11k_vif *arvif = container_of(work, struct ath11k_vif,
1705 connection_loss_work.work);
1706 struct ieee80211_vif *vif = arvif->vif;
1711 ieee80211_connection_loss(vif);
1714 static void ath11k_peer_assoc_h_basic(struct ath11k *ar,
1715 struct ieee80211_vif *vif,
1716 struct ieee80211_sta *sta,
1717 struct peer_assoc_params *arg)
1719 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
1722 lockdep_assert_held(&ar->conf_mutex);
1724 if (vif->type == NL80211_IFTYPE_STATION)
1729 ether_addr_copy(arg->peer_mac, sta->addr);
1730 arg->vdev_id = arvif->vdev_id;
1731 arg->peer_associd = aid;
1732 arg->auth_flag = true;
1733 /* TODO: STA WAR in ath10k for listen interval required? */
1734 arg->peer_listen_intval = ar->hw->conf.listen_interval;
1736 arg->peer_caps = vif->bss_conf.assoc_capability;
1739 static void ath11k_peer_assoc_h_crypto(struct ath11k *ar,
1740 struct ieee80211_vif *vif,
1741 struct ieee80211_sta *sta,
1742 struct peer_assoc_params *arg)
1744 struct ieee80211_bss_conf *info = &vif->bss_conf;
1745 struct cfg80211_chan_def def;
1746 struct cfg80211_bss *bss;
1747 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
1748 const u8 *rsnie = NULL;
1749 const u8 *wpaie = NULL;
1751 lockdep_assert_held(&ar->conf_mutex);
1753 if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
1756 bss = cfg80211_get_bss(ar->hw->wiphy, def.chan, info->bssid, NULL, 0,
1757 IEEE80211_BSS_TYPE_ANY, IEEE80211_PRIVACY_ANY);
1759 if (arvif->rsnie_present || arvif->wpaie_present) {
1760 arg->need_ptk_4_way = true;
1761 if (arvif->wpaie_present)
1762 arg->need_gtk_2_way = true;
1764 const struct cfg80211_bss_ies *ies;
1767 rsnie = ieee80211_bss_get_ie(bss, WLAN_EID_RSN);
1769 ies = rcu_dereference(bss->ies);
1771 wpaie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
1772 WLAN_OUI_TYPE_MICROSOFT_WPA,
1776 cfg80211_put_bss(ar->hw->wiphy, bss);
1779 /* FIXME: base on RSN IE/WPA IE is a correct idea? */
1780 if (rsnie || wpaie) {
1781 ath11k_dbg(ar->ab, ATH11K_DBG_WMI,
1782 "%s: rsn ie found\n", __func__);
1783 arg->need_ptk_4_way = true;
1787 ath11k_dbg(ar->ab, ATH11K_DBG_WMI,
1788 "%s: wpa ie found\n", __func__);
1789 arg->need_gtk_2_way = true;
1793 /* TODO: Need to check if FW supports PMF? */
1794 arg->is_pmf_enabled = true;
1797 /* TODO: safe_mode_enabled (bypass 4-way handshake) flag req? */
1800 static void ath11k_peer_assoc_h_rates(struct ath11k *ar,
1801 struct ieee80211_vif *vif,
1802 struct ieee80211_sta *sta,
1803 struct peer_assoc_params *arg)
1805 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
1806 struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates;
1807 struct cfg80211_chan_def def;
1808 const struct ieee80211_supported_band *sband;
1809 const struct ieee80211_rate *rates;
1810 enum nl80211_band band;
1815 lockdep_assert_held(&ar->conf_mutex);
1817 if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
1820 band = def.chan->band;
1821 sband = ar->hw->wiphy->bands[band];
1822 ratemask = sta->deflink.supp_rates[band];
1823 ratemask &= arvif->bitrate_mask.control[band].legacy;
1824 rates = sband->bitrates;
1826 rateset->num_rates = 0;
1828 for (i = 0; i < 32; i++, ratemask >>= 1, rates++) {
1829 if (!(ratemask & 1))
1832 rate = ath11k_mac_bitrate_to_rate(rates->bitrate);
1833 rateset->rates[rateset->num_rates] = rate;
1834 rateset->num_rates++;
1839 ath11k_peer_assoc_h_ht_masked(const u8 *ht_mcs_mask)
1843 for (nss = 0; nss < IEEE80211_HT_MCS_MASK_LEN; nss++)
1844 if (ht_mcs_mask[nss])
1851 ath11k_peer_assoc_h_vht_masked(const u16 *vht_mcs_mask)
1855 for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++)
1856 if (vht_mcs_mask[nss])
1862 static void ath11k_peer_assoc_h_ht(struct ath11k *ar,
1863 struct ieee80211_vif *vif,
1864 struct ieee80211_sta *sta,
1865 struct peer_assoc_params *arg)
1867 const struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
1868 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
1869 struct cfg80211_chan_def def;
1870 enum nl80211_band band;
1871 const u8 *ht_mcs_mask;
1876 lockdep_assert_held(&ar->conf_mutex);
1878 if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
1881 if (!ht_cap->ht_supported)
1884 band = def.chan->band;
1885 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
1887 if (ath11k_peer_assoc_h_ht_masked(ht_mcs_mask))
1890 arg->ht_flag = true;
1892 arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
1893 ht_cap->ampdu_factor)) - 1;
1895 arg->peer_mpdu_density =
1896 ath11k_parse_mpdudensity(ht_cap->ampdu_density);
1898 arg->peer_ht_caps = ht_cap->cap;
1899 arg->peer_rate_caps |= WMI_HOST_RC_HT_FLAG;
1901 if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING)
1902 arg->ldpc_flag = true;
1904 if (sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40) {
1906 arg->peer_rate_caps |= WMI_HOST_RC_CW40_FLAG;
1909 /* As firmware handles this two flags (IEEE80211_HT_CAP_SGI_20
1910 * and IEEE80211_HT_CAP_SGI_40) for enabling SGI, we reset
1911 * both flags if guard interval is Default GI
1913 if (arvif->bitrate_mask.control[band].gi == NL80211_TXRATE_DEFAULT_GI)
1914 arg->peer_ht_caps &= ~(IEEE80211_HT_CAP_SGI_20 |
1915 IEEE80211_HT_CAP_SGI_40);
1917 if (arvif->bitrate_mask.control[band].gi != NL80211_TXRATE_FORCE_LGI) {
1918 if (ht_cap->cap & (IEEE80211_HT_CAP_SGI_20 |
1919 IEEE80211_HT_CAP_SGI_40))
1920 arg->peer_rate_caps |= WMI_HOST_RC_SGI_FLAG;
1923 if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) {
1924 arg->peer_rate_caps |= WMI_HOST_RC_TX_STBC_FLAG;
1925 arg->stbc_flag = true;
1928 if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) {
1929 stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC;
1930 stbc = stbc >> IEEE80211_HT_CAP_RX_STBC_SHIFT;
1931 stbc = stbc << WMI_HOST_RC_RX_STBC_FLAG_S;
1932 arg->peer_rate_caps |= stbc;
1933 arg->stbc_flag = true;
1936 if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2])
1937 arg->peer_rate_caps |= WMI_HOST_RC_TS_FLAG;
1938 else if (ht_cap->mcs.rx_mask[1])
1939 arg->peer_rate_caps |= WMI_HOST_RC_DS_FLAG;
1941 for (i = 0, n = 0, max_nss = 0; i < IEEE80211_HT_MCS_MASK_LEN * 8; i++)
1942 if ((ht_cap->mcs.rx_mask[i / 8] & BIT(i % 8)) &&
1943 (ht_mcs_mask[i / 8] & BIT(i % 8))) {
1944 max_nss = (i / 8) + 1;
1945 arg->peer_ht_rates.rates[n++] = i;
1948 /* This is a workaround for HT-enabled STAs which break the spec
1949 * and have no HT capabilities RX mask (no HT RX MCS map).
1951 * As per spec, in section 20.3.5 Modulation and coding scheme (MCS),
1952 * MCS 0 through 7 are mandatory in 20MHz with 800 ns GI at all STAs.
1954 * Firmware asserts if such situation occurs.
1957 arg->peer_ht_rates.num_rates = 8;
1958 for (i = 0; i < arg->peer_ht_rates.num_rates; i++)
1959 arg->peer_ht_rates.rates[i] = i;
1961 arg->peer_ht_rates.num_rates = n;
1962 arg->peer_nss = min(sta->deflink.rx_nss, max_nss);
1965 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "ht peer %pM mcs cnt %d nss %d\n",
1967 arg->peer_ht_rates.num_rates,
1971 static int ath11k_mac_get_max_vht_mcs_map(u16 mcs_map, int nss)
1973 switch ((mcs_map >> (2 * nss)) & 0x3) {
1974 case IEEE80211_VHT_MCS_SUPPORT_0_7: return BIT(8) - 1;
1975 case IEEE80211_VHT_MCS_SUPPORT_0_8: return BIT(9) - 1;
1976 case IEEE80211_VHT_MCS_SUPPORT_0_9: return BIT(10) - 1;
1982 ath11k_peer_assoc_h_vht_limit(u16 tx_mcs_set,
1983 const u16 vht_mcs_limit[NL80211_VHT_NSS_MAX])
1990 for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) {
1991 mcs_map = ath11k_mac_get_max_vht_mcs_map(tx_mcs_set, nss) &
1995 idx_limit = fls(mcs_map) - 1;
1999 switch (idx_limit) {
2008 mcs = IEEE80211_VHT_MCS_SUPPORT_0_7;
2011 mcs = IEEE80211_VHT_MCS_SUPPORT_0_8;
2014 mcs = IEEE80211_VHT_MCS_SUPPORT_0_9;
2020 mcs = IEEE80211_VHT_MCS_NOT_SUPPORTED;
2024 tx_mcs_set &= ~(0x3 << (nss * 2));
2025 tx_mcs_set |= mcs << (nss * 2);
2031 static u8 ath11k_get_nss_160mhz(struct ath11k *ar,
2034 u8 nss_ratio_info = ar->pdev->cap.nss_ratio_info;
2037 switch (nss_ratio_info) {
2038 case WMI_NSS_RATIO_1BY2_NSS:
2039 max_sup_nss = max_nss >> 1;
2041 case WMI_NSS_RATIO_3BY4_NSS:
2042 ath11k_warn(ar->ab, "WMI_NSS_RATIO_3BY4_NSS not supported\n");
2044 case WMI_NSS_RATIO_1_NSS:
2045 max_sup_nss = max_nss;
2047 case WMI_NSS_RATIO_2_NSS:
2048 ath11k_warn(ar->ab, "WMI_NSS_RATIO_2_NSS not supported\n");
2051 ath11k_warn(ar->ab, "invalid nss ratio received from firmware: %d\n",
2059 static void ath11k_peer_assoc_h_vht(struct ath11k *ar,
2060 struct ieee80211_vif *vif,
2061 struct ieee80211_sta *sta,
2062 struct peer_assoc_params *arg)
2064 const struct ieee80211_sta_vht_cap *vht_cap = &sta->deflink.vht_cap;
2065 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
2066 struct cfg80211_chan_def def;
2067 enum nl80211_band band;
2070 u8 max_nss, vht_mcs;
2071 int i, vht_nss, nss_idx;
2072 bool user_rate_valid = true;
2073 u32 rx_nss, tx_nss, nss_160;
2075 if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
2078 if (!vht_cap->vht_supported)
2081 band = def.chan->band;
2082 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2084 if (ath11k_peer_assoc_h_vht_masked(vht_mcs_mask))
2087 arg->vht_flag = true;
2089 /* TODO: similar flags required? */
2090 arg->vht_capable = true;
2092 if (def.chan->band == NL80211_BAND_2GHZ)
2093 arg->vht_ng_flag = true;
2095 arg->peer_vht_caps = vht_cap->cap;
2097 ampdu_factor = (vht_cap->cap &
2098 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >>
2099 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
2101 /* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to
2102 * zero in VHT IE. Using it would result in degraded throughput.
2103 * arg->peer_max_mpdu at this point contains HT max_mpdu so keep
2104 * it if VHT max_mpdu is smaller.
2106 arg->peer_max_mpdu = max(arg->peer_max_mpdu,
2107 (1U << (IEEE80211_HT_MAX_AMPDU_FACTOR +
2108 ampdu_factor)) - 1);
2110 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
2113 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160)
2116 vht_nss = ath11k_mac_max_vht_nss(vht_mcs_mask);
2118 if (vht_nss > sta->deflink.rx_nss) {
2119 user_rate_valid = false;
2120 for (nss_idx = sta->deflink.rx_nss - 1; nss_idx >= 0; nss_idx--) {
2121 if (vht_mcs_mask[nss_idx]) {
2122 user_rate_valid = true;
2128 if (!user_rate_valid) {
2129 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "setting vht range mcs value to peer supported nss %d for peer %pM\n",
2130 sta->deflink.rx_nss, sta->addr);
2131 vht_mcs_mask[sta->deflink.rx_nss - 1] = vht_mcs_mask[vht_nss - 1];
2134 /* Calculate peer NSS capability from VHT capabilities if STA
2137 for (i = 0, max_nss = 0; i < NL80211_VHT_NSS_MAX; i++) {
2138 vht_mcs = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map) >>
2141 if (vht_mcs != IEEE80211_VHT_MCS_NOT_SUPPORTED &&
2145 arg->peer_nss = min(sta->deflink.rx_nss, max_nss);
2146 arg->rx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.rx_highest);
2147 arg->rx_mcs_set = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map);
2148 arg->tx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.tx_highest);
2149 arg->tx_mcs_set = ath11k_peer_assoc_h_vht_limit(
2150 __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map), vht_mcs_mask);
2152 /* In IPQ8074 platform, VHT mcs rate 10 and 11 is enabled by default.
2153 * VHT mcs rate 10 and 11 is not suppoerted in 11ac standard.
2154 * so explicitly disable the VHT MCS rate 10 and 11 in 11ac mode.
2156 arg->tx_mcs_set &= ~IEEE80211_VHT_MCS_SUPPORT_0_11_MASK;
2157 arg->tx_mcs_set |= IEEE80211_DISABLE_VHT_MCS_SUPPORT_0_11;
2159 if ((arg->tx_mcs_set & IEEE80211_VHT_MCS_NOT_SUPPORTED) ==
2160 IEEE80211_VHT_MCS_NOT_SUPPORTED)
2161 arg->peer_vht_caps &= ~IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE;
2164 arg->tx_max_mcs_nss = 0xFF;
2166 if (arg->peer_phymode == MODE_11AC_VHT160 ||
2167 arg->peer_phymode == MODE_11AC_VHT80_80) {
2168 tx_nss = ath11k_get_nss_160mhz(ar, max_nss);
2169 rx_nss = min(arg->peer_nss, tx_nss);
2170 arg->peer_bw_rxnss_override = ATH11K_BW_NSS_MAP_ENABLE;
2173 ath11k_warn(ar->ab, "invalid max_nss\n");
2177 if (arg->peer_phymode == MODE_11AC_VHT160)
2178 nss_160 = FIELD_PREP(ATH11K_PEER_RX_NSS_160MHZ, rx_nss - 1);
2180 nss_160 = FIELD_PREP(ATH11K_PEER_RX_NSS_80_80MHZ, rx_nss - 1);
2182 arg->peer_bw_rxnss_override |= nss_160;
2185 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
2186 "vht peer %pM max_mpdu %d flags 0x%x nss_override 0x%x\n",
2187 sta->addr, arg->peer_max_mpdu, arg->peer_flags,
2188 arg->peer_bw_rxnss_override);
2191 static int ath11k_mac_get_max_he_mcs_map(u16 mcs_map, int nss)
2193 switch ((mcs_map >> (2 * nss)) & 0x3) {
2194 case IEEE80211_HE_MCS_SUPPORT_0_7: return BIT(8) - 1;
2195 case IEEE80211_HE_MCS_SUPPORT_0_9: return BIT(10) - 1;
2196 case IEEE80211_HE_MCS_SUPPORT_0_11: return BIT(12) - 1;
2201 static u16 ath11k_peer_assoc_h_he_limit(u16 tx_mcs_set,
2202 const u16 he_mcs_limit[NL80211_HE_NSS_MAX])
2209 for (nss = 0; nss < NL80211_HE_NSS_MAX; nss++) {
2210 mcs_map = ath11k_mac_get_max_he_mcs_map(tx_mcs_set, nss) &
2214 idx_limit = fls(mcs_map) - 1;
2218 switch (idx_limit) {
2220 mcs = IEEE80211_HE_MCS_SUPPORT_0_7;
2224 mcs = IEEE80211_HE_MCS_SUPPORT_0_9;
2228 mcs = IEEE80211_HE_MCS_SUPPORT_0_11;
2234 mcs = IEEE80211_HE_MCS_NOT_SUPPORTED;
2238 tx_mcs_set &= ~(0x3 << (nss * 2));
2239 tx_mcs_set |= mcs << (nss * 2);
2246 ath11k_peer_assoc_h_he_masked(const u16 *he_mcs_mask)
2250 for (nss = 0; nss < NL80211_HE_NSS_MAX; nss++)
2251 if (he_mcs_mask[nss])
2257 static void ath11k_peer_assoc_h_he(struct ath11k *ar,
2258 struct ieee80211_vif *vif,
2259 struct ieee80211_sta *sta,
2260 struct peer_assoc_params *arg)
2262 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
2263 struct cfg80211_chan_def def;
2264 const struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap;
2265 enum nl80211_band band;
2266 u16 he_mcs_mask[NL80211_HE_NSS_MAX];
2268 u16 he_tx_mcs = 0, v = 0;
2269 int i, he_nss, nss_idx;
2270 bool user_rate_valid = true;
2271 u32 rx_nss, tx_nss, nss_160;
2272 u8 ampdu_factor, rx_mcs_80, rx_mcs_160;
2273 u16 mcs_160_map, mcs_80_map;
2276 if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
2279 if (!he_cap->has_he)
2282 band = def.chan->band;
2283 memcpy(he_mcs_mask, arvif->bitrate_mask.control[band].he_mcs,
2284 sizeof(he_mcs_mask));
2286 if (ath11k_peer_assoc_h_he_masked(he_mcs_mask))
2289 arg->he_flag = true;
2290 support_160 = !!(he_cap->he_cap_elem.phy_cap_info[0] &
2291 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G);
2293 /* Supported HE-MCS and NSS Set of peer he_cap is intersection with self he_cp */
2294 mcs_160_map = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160);
2295 mcs_80_map = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80);
2297 /* Initialize rx_mcs_160 to 9 which is an invalid value */
2300 for (i = 7; i >= 0; i--) {
2301 u8 mcs_160 = (mcs_160_map >> (2 * i)) & 3;
2303 if (mcs_160 != IEEE80211_VHT_MCS_NOT_SUPPORTED) {
2310 /* Initialize rx_mcs_80 to 9 which is an invalid value */
2312 for (i = 7; i >= 0; i--) {
2313 u8 mcs_80 = (mcs_80_map >> (2 * i)) & 3;
2315 if (mcs_80 != IEEE80211_VHT_MCS_NOT_SUPPORTED) {
2322 max_nss = min(rx_mcs_80, rx_mcs_160);
2324 max_nss = rx_mcs_80;
2326 arg->peer_nss = min(sta->deflink.rx_nss, max_nss);
2328 memcpy_and_pad(&arg->peer_he_cap_macinfo,
2329 sizeof(arg->peer_he_cap_macinfo),
2330 he_cap->he_cap_elem.mac_cap_info,
2331 sizeof(he_cap->he_cap_elem.mac_cap_info),
2333 memcpy_and_pad(&arg->peer_he_cap_phyinfo,
2334 sizeof(arg->peer_he_cap_phyinfo),
2335 he_cap->he_cap_elem.phy_cap_info,
2336 sizeof(he_cap->he_cap_elem.phy_cap_info),
2338 arg->peer_he_ops = vif->bss_conf.he_oper.params;
2340 /* the top most byte is used to indicate BSS color info */
2341 arg->peer_he_ops &= 0xffffff;
2343 /* As per section 26.6.1 11ax Draft5.0, if the Max AMPDU Exponent Extension
2344 * in HE cap is zero, use the arg->peer_max_mpdu as calculated while parsing
2345 * VHT caps(if VHT caps is present) or HT caps (if VHT caps is not present).
2347 * For non-zero value of Max AMPDU Extponent Extension in HE MAC caps,
2348 * if a HE STA sends VHT cap and HE cap IE in assoc request then, use
2349 * MAX_AMPDU_LEN_FACTOR as 20 to calculate max_ampdu length.
2350 * If a HE STA that does not send VHT cap, but HE and HT cap in assoc
2351 * request, then use MAX_AMPDU_LEN_FACTOR as 16 to calculate max_ampdu
2354 ampdu_factor = u8_get_bits(he_cap->he_cap_elem.mac_cap_info[3],
2355 IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK);
2358 if (sta->deflink.vht_cap.vht_supported)
2359 arg->peer_max_mpdu = (1 << (IEEE80211_HE_VHT_MAX_AMPDU_FACTOR +
2361 else if (sta->deflink.ht_cap.ht_supported)
2362 arg->peer_max_mpdu = (1 << (IEEE80211_HE_HT_MAX_AMPDU_FACTOR +
2366 if (he_cap->he_cap_elem.phy_cap_info[6] &
2367 IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT) {
2371 arg->peer_ppet.numss_m1 = he_cap->ppe_thres[0] &
2372 IEEE80211_PPE_THRES_NSS_MASK;
2373 arg->peer_ppet.ru_bit_mask =
2374 (he_cap->ppe_thres[0] &
2375 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK) >>
2376 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_POS;
2378 for (nss = 0; nss <= arg->peer_ppet.numss_m1; nss++) {
2379 for (ru = 0; ru < 4; ru++) {
2383 if ((arg->peer_ppet.ru_bit_mask & BIT(ru)) == 0)
2385 for (i = 0; i < 6; i++) {
2387 val |= ((he_cap->ppe_thres[bit / 8] >>
2388 (bit % 8)) & 0x1) << 5;
2391 arg->peer_ppet.ppet16_ppet8_ru3_ru0[nss] |=
2397 if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_RES)
2398 arg->twt_responder = true;
2399 if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_REQ)
2400 arg->twt_requester = true;
2402 he_nss = ath11k_mac_max_he_nss(he_mcs_mask);
2404 if (he_nss > sta->deflink.rx_nss) {
2405 user_rate_valid = false;
2406 for (nss_idx = sta->deflink.rx_nss - 1; nss_idx >= 0; nss_idx--) {
2407 if (he_mcs_mask[nss_idx]) {
2408 user_rate_valid = true;
2414 if (!user_rate_valid) {
2415 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "setting he range mcs value to peer supported nss %d for peer %pM\n",
2416 sta->deflink.rx_nss, sta->addr);
2417 he_mcs_mask[sta->deflink.rx_nss - 1] = he_mcs_mask[he_nss - 1];
2420 switch (sta->deflink.bandwidth) {
2421 case IEEE80211_STA_RX_BW_160:
2422 if (he_cap->he_cap_elem.phy_cap_info[0] &
2423 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G) {
2424 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80p80);
2425 v = ath11k_peer_assoc_h_he_limit(v, he_mcs_mask);
2426 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80_80] = v;
2428 v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80p80);
2429 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80_80] = v;
2431 arg->peer_he_mcs_count++;
2434 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160);
2435 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v;
2437 v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_160);
2438 v = ath11k_peer_assoc_h_he_limit(v, he_mcs_mask);
2439 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v;
2441 arg->peer_he_mcs_count++;
2447 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80);
2448 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v;
2450 v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80);
2451 v = ath11k_peer_assoc_h_he_limit(v, he_mcs_mask);
2452 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v;
2454 arg->peer_he_mcs_count++;
2460 /* Calculate peer NSS capability from HE capabilities if STA
2463 for (i = 0, max_nss = 0; i < NL80211_HE_NSS_MAX; i++) {
2464 he_mcs = he_tx_mcs >> (2 * i) & 3;
2466 /* In case of fixed rates, MCS Range in he_tx_mcs might have
2467 * unsupported range, with he_mcs_mask set, so check either of them
2470 if (he_mcs != IEEE80211_HE_MCS_NOT_SUPPORTED ||
2474 arg->peer_nss = min(sta->deflink.rx_nss, max_nss);
2476 if (arg->peer_phymode == MODE_11AX_HE160 ||
2477 arg->peer_phymode == MODE_11AX_HE80_80) {
2478 tx_nss = ath11k_get_nss_160mhz(ar, max_nss);
2479 rx_nss = min(arg->peer_nss, tx_nss);
2480 arg->peer_bw_rxnss_override = ATH11K_BW_NSS_MAP_ENABLE;
2483 ath11k_warn(ar->ab, "invalid max_nss\n");
2487 if (arg->peer_phymode == MODE_11AX_HE160)
2488 nss_160 = FIELD_PREP(ATH11K_PEER_RX_NSS_160MHZ, rx_nss - 1);
2490 nss_160 = FIELD_PREP(ATH11K_PEER_RX_NSS_80_80MHZ, rx_nss - 1);
2492 arg->peer_bw_rxnss_override |= nss_160;
2495 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
2496 "he peer %pM nss %d mcs cnt %d nss_override 0x%x\n",
2497 sta->addr, arg->peer_nss,
2498 arg->peer_he_mcs_count,
2499 arg->peer_bw_rxnss_override);
2502 static void ath11k_peer_assoc_h_he_6ghz(struct ath11k *ar,
2503 struct ieee80211_vif *vif,
2504 struct ieee80211_sta *sta,
2505 struct peer_assoc_params *arg)
2507 const struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap;
2508 struct cfg80211_chan_def def;
2509 enum nl80211_band band;
2512 if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
2515 band = def.chan->band;
2517 if (!arg->he_flag || band != NL80211_BAND_6GHZ || !sta->deflink.he_6ghz_capa.capa)
2520 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2523 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
2526 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160)
2529 arg->peer_he_caps_6ghz = le16_to_cpu(sta->deflink.he_6ghz_capa.capa);
2530 arg->peer_mpdu_density =
2531 ath11k_parse_mpdudensity(FIELD_GET(IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START,
2532 arg->peer_he_caps_6ghz));
2534 /* From IEEE Std 802.11ax-2021 - Section 10.12.2: An HE STA shall be capable of
2535 * receiving A-MPDU where the A-MPDU pre-EOF padding length is up to the value
2536 * indicated by the Maximum A-MPDU Length Exponent Extension field in the HE
2537 * Capabilities element and the Maximum A-MPDU Length Exponent field in HE 6 GHz
2538 * Band Capabilities element in the 6 GHz band.
2540 * Here, we are extracting the Max A-MPDU Exponent Extension from HE caps and
2541 * factor is the Maximum A-MPDU Length Exponent from HE 6 GHZ Band capability.
2543 ampdu_factor = FIELD_GET(IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK,
2544 he_cap->he_cap_elem.mac_cap_info[3]) +
2545 FIELD_GET(IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP,
2546 arg->peer_he_caps_6ghz);
2548 arg->peer_max_mpdu = (1u << (IEEE80211_HE_6GHZ_MAX_AMPDU_FACTOR +
2552 static void ath11k_peer_assoc_h_smps(struct ieee80211_sta *sta,
2553 struct peer_assoc_params *arg)
2555 const struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
2558 if (!ht_cap->ht_supported && !sta->deflink.he_6ghz_capa.capa)
2561 if (ht_cap->ht_supported) {
2562 smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
2563 smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
2565 smps = le16_get_bits(sta->deflink.he_6ghz_capa.capa,
2566 IEEE80211_HE_6GHZ_CAP_SM_PS);
2570 case WLAN_HT_CAP_SM_PS_STATIC:
2571 arg->static_mimops_flag = true;
2573 case WLAN_HT_CAP_SM_PS_DYNAMIC:
2574 arg->dynamic_mimops_flag = true;
2576 case WLAN_HT_CAP_SM_PS_DISABLED:
2577 arg->spatial_mux_flag = true;
2584 static void ath11k_peer_assoc_h_qos(struct ath11k *ar,
2585 struct ieee80211_vif *vif,
2586 struct ieee80211_sta *sta,
2587 struct peer_assoc_params *arg)
2589 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
2591 switch (arvif->vdev_type) {
2592 case WMI_VDEV_TYPE_AP:
2594 /* TODO: Check WME vs QoS */
2595 arg->is_wme_set = true;
2596 arg->qos_flag = true;
2599 if (sta->wme && sta->uapsd_queues) {
2600 /* TODO: Check WME vs QoS */
2601 arg->is_wme_set = true;
2602 arg->apsd_flag = true;
2603 arg->peer_rate_caps |= WMI_HOST_RC_UAPSD_FLAG;
2606 case WMI_VDEV_TYPE_STA:
2608 arg->is_wme_set = true;
2609 arg->qos_flag = true;
2616 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "peer %pM qos %d\n",
2617 sta->addr, arg->qos_flag);
2620 static int ath11k_peer_assoc_qos_ap(struct ath11k *ar,
2621 struct ath11k_vif *arvif,
2622 struct ieee80211_sta *sta)
2624 struct ap_ps_params params;
2629 lockdep_assert_held(&ar->conf_mutex);
2631 params.vdev_id = arvif->vdev_id;
2633 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "uapsd_queues 0x%x max_sp %d\n",
2634 sta->uapsd_queues, sta->max_sp);
2637 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO)
2638 uapsd |= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN |
2639 WMI_AP_PS_UAPSD_AC3_TRIGGER_EN;
2640 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI)
2641 uapsd |= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN |
2642 WMI_AP_PS_UAPSD_AC2_TRIGGER_EN;
2643 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK)
2644 uapsd |= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN |
2645 WMI_AP_PS_UAPSD_AC1_TRIGGER_EN;
2646 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE)
2647 uapsd |= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN |
2648 WMI_AP_PS_UAPSD_AC0_TRIGGER_EN;
2651 if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP)
2652 max_sp = sta->max_sp;
2654 params.param = WMI_AP_PS_PEER_PARAM_UAPSD;
2655 params.value = uapsd;
2656 ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, ¶ms);
2660 params.param = WMI_AP_PS_PEER_PARAM_MAX_SP;
2661 params.value = max_sp;
2662 ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, ¶ms);
2666 /* TODO revisit during testing */
2667 params.param = WMI_AP_PS_PEER_PARAM_SIFS_RESP_FRMTYPE;
2668 params.value = DISABLE_SIFS_RESPONSE_TRIGGER;
2669 ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, ¶ms);
2673 params.param = WMI_AP_PS_PEER_PARAM_SIFS_RESP_UAPSD;
2674 params.value = DISABLE_SIFS_RESPONSE_TRIGGER;
2675 ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, ¶ms);
2682 ath11k_warn(ar->ab, "failed to set ap ps peer param %d for vdev %i: %d\n",
2683 params.param, arvif->vdev_id, ret);
2687 static bool ath11k_mac_sta_has_ofdm_only(struct ieee80211_sta *sta)
2689 return sta->deflink.supp_rates[NL80211_BAND_2GHZ] >>
2690 ATH11K_MAC_FIRST_OFDM_RATE_IDX;
2693 static enum wmi_phy_mode ath11k_mac_get_phymode_vht(struct ath11k *ar,
2694 struct ieee80211_sta *sta)
2696 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160) {
2697 switch (sta->deflink.vht_cap.cap &
2698 IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK) {
2699 case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ:
2700 return MODE_11AC_VHT160;
2701 case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ:
2702 return MODE_11AC_VHT80_80;
2704 /* not sure if this is a valid case? */
2705 return MODE_11AC_VHT160;
2709 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
2710 return MODE_11AC_VHT80;
2712 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2713 return MODE_11AC_VHT40;
2715 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_20)
2716 return MODE_11AC_VHT20;
2718 return MODE_UNKNOWN;
2721 static enum wmi_phy_mode ath11k_mac_get_phymode_he(struct ath11k *ar,
2722 struct ieee80211_sta *sta)
2724 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160) {
2725 if (sta->deflink.he_cap.he_cap_elem.phy_cap_info[0] &
2726 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
2727 return MODE_11AX_HE160;
2728 else if (sta->deflink.he_cap.he_cap_elem.phy_cap_info[0] &
2729 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
2730 return MODE_11AX_HE80_80;
2731 /* not sure if this is a valid case? */
2732 return MODE_11AX_HE160;
2735 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
2736 return MODE_11AX_HE80;
2738 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2739 return MODE_11AX_HE40;
2741 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_20)
2742 return MODE_11AX_HE20;
2744 return MODE_UNKNOWN;
2747 static void ath11k_peer_assoc_h_phymode(struct ath11k *ar,
2748 struct ieee80211_vif *vif,
2749 struct ieee80211_sta *sta,
2750 struct peer_assoc_params *arg)
2752 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
2753 struct cfg80211_chan_def def;
2754 enum nl80211_band band;
2755 const u8 *ht_mcs_mask;
2756 const u16 *vht_mcs_mask;
2757 const u16 *he_mcs_mask;
2758 enum wmi_phy_mode phymode = MODE_UNKNOWN;
2760 if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
2763 band = def.chan->band;
2764 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
2765 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2766 he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs;
2769 case NL80211_BAND_2GHZ:
2770 if (sta->deflink.he_cap.has_he &&
2771 !ath11k_peer_assoc_h_he_masked(he_mcs_mask)) {
2772 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
2773 phymode = MODE_11AX_HE80_2G;
2774 else if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2775 phymode = MODE_11AX_HE40_2G;
2777 phymode = MODE_11AX_HE20_2G;
2778 } else if (sta->deflink.vht_cap.vht_supported &&
2779 !ath11k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
2780 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2781 phymode = MODE_11AC_VHT40;
2783 phymode = MODE_11AC_VHT20;
2784 } else if (sta->deflink.ht_cap.ht_supported &&
2785 !ath11k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
2786 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2787 phymode = MODE_11NG_HT40;
2789 phymode = MODE_11NG_HT20;
2790 } else if (ath11k_mac_sta_has_ofdm_only(sta)) {
2796 case NL80211_BAND_5GHZ:
2797 case NL80211_BAND_6GHZ:
2798 /* Check HE first */
2799 if (sta->deflink.he_cap.has_he &&
2800 !ath11k_peer_assoc_h_he_masked(he_mcs_mask)) {
2801 phymode = ath11k_mac_get_phymode_he(ar, sta);
2802 } else if (sta->deflink.vht_cap.vht_supported &&
2803 !ath11k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
2804 phymode = ath11k_mac_get_phymode_vht(ar, sta);
2805 } else if (sta->deflink.ht_cap.ht_supported &&
2806 !ath11k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
2807 if (sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40)
2808 phymode = MODE_11NA_HT40;
2810 phymode = MODE_11NA_HT20;
2819 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "peer %pM phymode %s\n",
2820 sta->addr, ath11k_wmi_phymode_str(phymode));
2822 arg->peer_phymode = phymode;
2823 WARN_ON(phymode == MODE_UNKNOWN);
2826 static void ath11k_peer_assoc_prepare(struct ath11k *ar,
2827 struct ieee80211_vif *vif,
2828 struct ieee80211_sta *sta,
2829 struct peer_assoc_params *arg,
2832 struct ath11k_sta *arsta;
2834 lockdep_assert_held(&ar->conf_mutex);
2836 arsta = ath11k_sta_to_arsta(sta);
2838 memset(arg, 0, sizeof(*arg));
2840 reinit_completion(&ar->peer_assoc_done);
2842 arg->peer_new_assoc = !reassoc;
2843 ath11k_peer_assoc_h_basic(ar, vif, sta, arg);
2844 ath11k_peer_assoc_h_crypto(ar, vif, sta, arg);
2845 ath11k_peer_assoc_h_rates(ar, vif, sta, arg);
2846 ath11k_peer_assoc_h_phymode(ar, vif, sta, arg);
2847 ath11k_peer_assoc_h_ht(ar, vif, sta, arg);
2848 ath11k_peer_assoc_h_vht(ar, vif, sta, arg);
2849 ath11k_peer_assoc_h_he(ar, vif, sta, arg);
2850 ath11k_peer_assoc_h_he_6ghz(ar, vif, sta, arg);
2851 ath11k_peer_assoc_h_qos(ar, vif, sta, arg);
2852 ath11k_peer_assoc_h_smps(sta, arg);
2854 arsta->peer_nss = arg->peer_nss;
2856 /* TODO: amsdu_disable req? */
2859 static int ath11k_setup_peer_smps(struct ath11k *ar, struct ath11k_vif *arvif,
2861 const struct ieee80211_sta_ht_cap *ht_cap,
2866 if (!ht_cap->ht_supported && !he_6ghz_capa)
2869 if (ht_cap->ht_supported) {
2870 smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
2871 smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
2873 smps = FIELD_GET(IEEE80211_HE_6GHZ_CAP_SM_PS, he_6ghz_capa);
2876 if (smps >= ARRAY_SIZE(ath11k_smps_map))
2879 return ath11k_wmi_set_peer_param(ar, addr, arvif->vdev_id,
2880 WMI_PEER_MIMO_PS_STATE,
2881 ath11k_smps_map[smps]);
2884 static bool ath11k_mac_set_he_txbf_conf(struct ath11k_vif *arvif)
2886 struct ath11k *ar = arvif->ar;
2890 if (!arvif->vif->bss_conf.he_support)
2893 param = WMI_VDEV_PARAM_SET_HEMU_MODE;
2895 if (arvif->vif->bss_conf.he_su_beamformer) {
2896 value |= FIELD_PREP(HE_MODE_SU_TX_BFER, HE_SU_BFER_ENABLE);
2897 if (arvif->vif->bss_conf.he_mu_beamformer &&
2898 arvif->vdev_type == WMI_VDEV_TYPE_AP)
2899 value |= FIELD_PREP(HE_MODE_MU_TX_BFER, HE_MU_BFER_ENABLE);
2902 if (arvif->vif->type != NL80211_IFTYPE_MESH_POINT) {
2903 value |= FIELD_PREP(HE_MODE_DL_OFDMA, HE_DL_MUOFDMA_ENABLE) |
2904 FIELD_PREP(HE_MODE_UL_OFDMA, HE_UL_MUOFDMA_ENABLE);
2906 if (arvif->vif->bss_conf.he_full_ul_mumimo)
2907 value |= FIELD_PREP(HE_MODE_UL_MUMIMO, HE_UL_MUMIMO_ENABLE);
2909 if (arvif->vif->bss_conf.he_su_beamformee)
2910 value |= FIELD_PREP(HE_MODE_SU_TX_BFEE, HE_SU_BFEE_ENABLE);
2913 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, value);
2915 ath11k_warn(ar->ab, "failed to set vdev %d HE MU mode: %d\n",
2916 arvif->vdev_id, ret);
2920 param = WMI_VDEV_PARAM_SET_HE_SOUNDING_MODE;
2921 value = FIELD_PREP(HE_VHT_SOUNDING_MODE, HE_VHT_SOUNDING_MODE_ENABLE) |
2922 FIELD_PREP(HE_TRIG_NONTRIG_SOUNDING_MODE,
2923 HE_TRIG_NONTRIG_SOUNDING_MODE_ENABLE);
2924 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
2927 ath11k_warn(ar->ab, "failed to set vdev %d sounding mode: %d\n",
2928 arvif->vdev_id, ret);
2934 static bool ath11k_mac_vif_recalc_sta_he_txbf(struct ath11k *ar,
2935 struct ieee80211_vif *vif,
2936 struct ieee80211_sta_he_cap *he_cap)
2938 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
2939 struct ieee80211_he_cap_elem he_cap_elem = {0};
2940 struct ieee80211_sta_he_cap *cap_band = NULL;
2941 struct cfg80211_chan_def def;
2942 u32 param = WMI_VDEV_PARAM_SET_HEMU_MODE;
2946 if (!vif->bss_conf.he_support)
2949 if (vif->type != NL80211_IFTYPE_STATION)
2952 if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
2955 if (def.chan->band == NL80211_BAND_2GHZ)
2956 cap_band = &ar->mac.iftype[NL80211_BAND_2GHZ][vif->type].he_cap;
2958 cap_band = &ar->mac.iftype[NL80211_BAND_5GHZ][vif->type].he_cap;
2960 memcpy(&he_cap_elem, &cap_band->he_cap_elem, sizeof(he_cap_elem));
2962 if (HECAP_PHY_SUBFME_GET(he_cap_elem.phy_cap_info)) {
2963 if (HECAP_PHY_SUBFMR_GET(he_cap->he_cap_elem.phy_cap_info))
2964 hemode |= FIELD_PREP(HE_MODE_SU_TX_BFEE, HE_SU_BFEE_ENABLE);
2965 if (HECAP_PHY_MUBFMR_GET(he_cap->he_cap_elem.phy_cap_info))
2966 hemode |= FIELD_PREP(HE_MODE_MU_TX_BFEE, HE_MU_BFEE_ENABLE);
2969 if (vif->type != NL80211_IFTYPE_MESH_POINT) {
2970 hemode |= FIELD_PREP(HE_MODE_DL_OFDMA, HE_DL_MUOFDMA_ENABLE) |
2971 FIELD_PREP(HE_MODE_UL_OFDMA, HE_UL_MUOFDMA_ENABLE);
2973 if (HECAP_PHY_ULMUMIMO_GET(he_cap_elem.phy_cap_info))
2974 if (HECAP_PHY_ULMUMIMO_GET(he_cap->he_cap_elem.phy_cap_info))
2975 hemode |= FIELD_PREP(HE_MODE_UL_MUMIMO,
2976 HE_UL_MUMIMO_ENABLE);
2978 if (FIELD_GET(HE_MODE_MU_TX_BFEE, hemode))
2979 hemode |= FIELD_PREP(HE_MODE_SU_TX_BFEE, HE_SU_BFEE_ENABLE);
2981 if (FIELD_GET(HE_MODE_MU_TX_BFER, hemode))
2982 hemode |= FIELD_PREP(HE_MODE_SU_TX_BFER, HE_SU_BFER_ENABLE);
2985 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, hemode);
2987 ath11k_warn(ar->ab, "failed to submit vdev param txbf 0x%x: %d\n",
2995 static void ath11k_bss_assoc(struct ieee80211_hw *hw,
2996 struct ieee80211_vif *vif,
2997 struct ieee80211_bss_conf *bss_conf)
2999 struct ath11k *ar = hw->priv;
3000 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
3001 struct peer_assoc_params peer_arg;
3002 struct ieee80211_sta *ap_sta;
3003 struct ath11k_peer *peer;
3004 bool is_auth = false;
3005 struct ieee80211_sta_he_cap he_cap;
3008 lockdep_assert_held(&ar->conf_mutex);
3010 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %i assoc bssid %pM aid %d\n",
3011 arvif->vdev_id, arvif->bssid, arvif->aid);
3015 ap_sta = ieee80211_find_sta(vif, bss_conf->bssid);
3017 ath11k_warn(ar->ab, "failed to find station entry for bss %pM vdev %i\n",
3018 bss_conf->bssid, arvif->vdev_id);
3023 /* he_cap here is updated at assoc success for sta mode only */
3024 he_cap = ap_sta->deflink.he_cap;
3026 ath11k_peer_assoc_prepare(ar, vif, ap_sta, &peer_arg, false);
3030 if (!ath11k_mac_vif_recalc_sta_he_txbf(ar, vif, &he_cap)) {
3031 ath11k_warn(ar->ab, "failed to recalc he txbf for vdev %i on bss %pM\n",
3032 arvif->vdev_id, bss_conf->bssid);
3036 peer_arg.is_assoc = true;
3038 ret = ath11k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
3040 ath11k_warn(ar->ab, "failed to run peer assoc for %pM vdev %i: %d\n",
3041 bss_conf->bssid, arvif->vdev_id, ret);
3045 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) {
3046 ath11k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
3047 bss_conf->bssid, arvif->vdev_id);
3051 ret = ath11k_setup_peer_smps(ar, arvif, bss_conf->bssid,
3052 &ap_sta->deflink.ht_cap,
3053 le16_to_cpu(ap_sta->deflink.he_6ghz_capa.capa));
3055 ath11k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n",
3056 arvif->vdev_id, ret);
3060 WARN_ON(arvif->is_up);
3062 arvif->aid = vif->cfg.aid;
3063 ether_addr_copy(arvif->bssid, bss_conf->bssid);
3065 ret = ath11k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid,
3068 ath11k_warn(ar->ab, "failed to set vdev %d up: %d\n",
3069 arvif->vdev_id, ret);
3073 arvif->is_up = true;
3074 arvif->rekey_data.enable_offload = false;
3076 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3077 "vdev %d up (associated) bssid %pM aid %d\n",
3078 arvif->vdev_id, bss_conf->bssid, vif->cfg.aid);
3080 spin_lock_bh(&ar->ab->base_lock);
3082 peer = ath11k_peer_find(ar->ab, arvif->vdev_id, arvif->bssid);
3083 if (peer && peer->is_authorized)
3086 spin_unlock_bh(&ar->ab->base_lock);
3089 ret = ath11k_wmi_set_peer_param(ar, arvif->bssid,
3094 ath11k_warn(ar->ab, "Unable to authorize BSS peer: %d\n", ret);
3097 ret = ath11k_wmi_send_obss_spr_cmd(ar, arvif->vdev_id,
3098 &bss_conf->he_obss_pd);
3100 ath11k_warn(ar->ab, "failed to set vdev %i OBSS PD parameters: %d\n",
3101 arvif->vdev_id, ret);
3103 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3104 WMI_VDEV_PARAM_DTIM_POLICY,
3105 WMI_DTIM_POLICY_STICK);
3107 ath11k_warn(ar->ab, "failed to set vdev %d dtim policy: %d\n",
3108 arvif->vdev_id, ret);
3110 ath11k_mac_11d_scan_stop_all(ar->ab);
3113 static void ath11k_bss_disassoc(struct ieee80211_hw *hw,
3114 struct ieee80211_vif *vif)
3116 struct ath11k *ar = hw->priv;
3117 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
3120 lockdep_assert_held(&ar->conf_mutex);
3122 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %i disassoc bssid %pM\n",
3123 arvif->vdev_id, arvif->bssid);
3125 ret = ath11k_wmi_vdev_down(ar, arvif->vdev_id);
3127 ath11k_warn(ar->ab, "failed to down vdev %i: %d\n",
3128 arvif->vdev_id, ret);
3130 arvif->is_up = false;
3132 memset(&arvif->rekey_data, 0, sizeof(arvif->rekey_data));
3134 cancel_delayed_work_sync(&arvif->connection_loss_work);
3137 static u32 ath11k_mac_get_rate_hw_value(int bitrate)
3144 if (ath11k_mac_bitrate_is_cck(bitrate))
3145 preamble = WMI_RATE_PREAMBLE_CCK;
3147 preamble = WMI_RATE_PREAMBLE_OFDM;
3149 for (i = 0; i < ARRAY_SIZE(ath11k_legacy_rates); i++) {
3150 if (ath11k_legacy_rates[i].bitrate != bitrate)
3153 hw_value = ath11k_legacy_rates[i].hw_value;
3154 rate = ATH11K_HW_RATE_CODE(hw_value, 0, preamble);
3162 static void ath11k_recalculate_mgmt_rate(struct ath11k *ar,
3163 struct ieee80211_vif *vif,
3164 struct cfg80211_chan_def *def)
3166 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
3167 const struct ieee80211_supported_band *sband;
3174 lockdep_assert_held(&ar->conf_mutex);
3176 sband = ar->hw->wiphy->bands[def->chan->band];
3177 basic_rate_idx = ffs(vif->bss_conf.basic_rates) - 1;
3178 bitrate = sband->bitrates[basic_rate_idx].bitrate;
3180 hw_rate_code = ath11k_mac_get_rate_hw_value(bitrate);
3181 if (hw_rate_code < 0) {
3182 ath11k_warn(ar->ab, "bitrate not supported %d\n", bitrate);
3186 vdev_param = WMI_VDEV_PARAM_MGMT_RATE;
3187 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param,
3190 ath11k_warn(ar->ab, "failed to set mgmt tx rate %d\n", ret);
3192 /* For WCN6855, firmware will clear this param when vdev starts, hence
3193 * cache it here so that we can reconfigure it once vdev starts.
3195 ar->hw_rate_code = hw_rate_code;
3197 vdev_param = WMI_VDEV_PARAM_BEACON_RATE;
3198 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param,
3201 ath11k_warn(ar->ab, "failed to set beacon tx rate %d\n", ret);
3204 static int ath11k_mac_fils_discovery(struct ath11k_vif *arvif,
3205 struct ieee80211_bss_conf *info)
3207 struct ath11k *ar = arvif->ar;
3208 struct sk_buff *tmpl;
3211 bool unsol_bcast_probe_resp_enabled = false;
3213 if (info->fils_discovery.max_interval) {
3214 interval = info->fils_discovery.max_interval;
3216 tmpl = ieee80211_get_fils_discovery_tmpl(ar->hw, arvif->vif);
3218 ret = ath11k_wmi_fils_discovery_tmpl(ar, arvif->vdev_id,
3220 } else if (info->unsol_bcast_probe_resp_interval) {
3221 unsol_bcast_probe_resp_enabled = 1;
3222 interval = info->unsol_bcast_probe_resp_interval;
3224 tmpl = ieee80211_get_unsol_bcast_probe_resp_tmpl(ar->hw,
3227 ret = ath11k_wmi_probe_resp_tmpl(ar, arvif->vdev_id,
3229 } else { /* Disable */
3230 return ath11k_wmi_fils_discovery(ar, arvif->vdev_id, 0, false);
3235 "mac vdev %i failed to retrieve %s template\n",
3236 arvif->vdev_id, (unsol_bcast_probe_resp_enabled ?
3237 "unsolicited broadcast probe response" :
3244 ret = ath11k_wmi_fils_discovery(ar, arvif->vdev_id, interval,
3245 unsol_bcast_probe_resp_enabled);
3250 static int ath11k_mac_config_obss_pd(struct ath11k *ar,
3251 struct ieee80211_he_obss_pd *he_obss_pd)
3253 u32 bitmap[2], param_id, param_val, pdev_id;
3255 s8 non_srg_th = 0, srg_th = 0;
3257 pdev_id = ar->pdev->pdev_id;
3259 /* Set and enable SRG/non-SRG OBSS PD Threshold */
3260 param_id = WMI_PDEV_PARAM_SET_CMD_OBSS_PD_THRESHOLD;
3261 if (test_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags)) {
3262 ret = ath11k_wmi_pdev_set_param(ar, param_id, 0, pdev_id);
3265 "failed to set obss_pd_threshold for pdev: %u\n",
3270 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3271 "obss pd sr_ctrl %x non_srg_thres %u srg_max %u\n",
3272 he_obss_pd->sr_ctrl, he_obss_pd->non_srg_max_offset,
3273 he_obss_pd->max_offset);
3277 if (he_obss_pd->sr_ctrl &
3278 IEEE80211_HE_SPR_NON_SRG_OBSS_PD_SR_DISALLOWED) {
3279 non_srg_th = ATH11K_OBSS_PD_MAX_THRESHOLD;
3281 if (he_obss_pd->sr_ctrl & IEEE80211_HE_SPR_NON_SRG_OFFSET_PRESENT)
3282 non_srg_th = (ATH11K_OBSS_PD_MAX_THRESHOLD +
3283 he_obss_pd->non_srg_max_offset);
3285 non_srg_th = ATH11K_OBSS_PD_NON_SRG_MAX_THRESHOLD;
3287 param_val |= ATH11K_OBSS_PD_NON_SRG_EN;
3290 if (he_obss_pd->sr_ctrl & IEEE80211_HE_SPR_SRG_INFORMATION_PRESENT) {
3291 srg_th = ATH11K_OBSS_PD_MAX_THRESHOLD + he_obss_pd->max_offset;
3292 param_val |= ATH11K_OBSS_PD_SRG_EN;
3295 if (test_bit(WMI_TLV_SERVICE_SRG_SRP_SPATIAL_REUSE_SUPPORT,
3296 ar->ab->wmi_ab.svc_map)) {
3297 param_val |= ATH11K_OBSS_PD_THRESHOLD_IN_DBM;
3298 param_val |= FIELD_PREP(GENMASK(15, 8), srg_th);
3300 non_srg_th -= ATH11K_DEFAULT_NOISE_FLOOR;
3301 /* SRG not supported and threshold in dB */
3302 param_val &= ~(ATH11K_OBSS_PD_SRG_EN |
3303 ATH11K_OBSS_PD_THRESHOLD_IN_DBM);
3306 param_val |= (non_srg_th & GENMASK(7, 0));
3307 ret = ath11k_wmi_pdev_set_param(ar, param_id, param_val, pdev_id);
3310 "failed to set obss_pd_threshold for pdev: %u\n",
3315 /* Enable OBSS PD for all access category */
3316 param_id = WMI_PDEV_PARAM_SET_CMD_OBSS_PD_PER_AC;
3318 ret = ath11k_wmi_pdev_set_param(ar, param_id, param_val, pdev_id);
3321 "failed to set obss_pd_per_ac for pdev: %u\n",
3326 /* Set SR Prohibit */
3327 param_id = WMI_PDEV_PARAM_ENABLE_SR_PROHIBIT;
3328 param_val = !!(he_obss_pd->sr_ctrl &
3329 IEEE80211_HE_SPR_HESIGA_SR_VAL15_ALLOWED);
3330 ret = ath11k_wmi_pdev_set_param(ar, param_id, param_val, pdev_id);
3332 ath11k_warn(ar->ab, "failed to set sr_prohibit for pdev: %u\n",
3337 if (!test_bit(WMI_TLV_SERVICE_SRG_SRP_SPATIAL_REUSE_SUPPORT,
3338 ar->ab->wmi_ab.svc_map))
3341 /* Set SRG BSS Color Bitmap */
3342 memcpy(bitmap, he_obss_pd->bss_color_bitmap, sizeof(bitmap));
3343 ret = ath11k_wmi_pdev_set_srg_bss_color_bitmap(ar, bitmap);
3346 "failed to set bss_color_bitmap for pdev: %u\n",
3351 /* Set SRG Partial BSSID Bitmap */
3352 memcpy(bitmap, he_obss_pd->partial_bssid_bitmap, sizeof(bitmap));
3353 ret = ath11k_wmi_pdev_set_srg_patial_bssid_bitmap(ar, bitmap);
3356 "failed to set partial_bssid_bitmap for pdev: %u\n",
3361 memset(bitmap, 0xff, sizeof(bitmap));
3363 /* Enable all BSS Colors for SRG */
3364 ret = ath11k_wmi_pdev_srg_obss_color_enable_bitmap(ar, bitmap);
3367 "failed to set srg_color_en_bitmap pdev: %u\n",
3372 /* Enable all partial BSSID mask for SRG */
3373 ret = ath11k_wmi_pdev_srg_obss_bssid_enable_bitmap(ar, bitmap);
3376 "failed to set srg_bssid_en_bitmap pdev: %u\n",
3381 /* Enable all BSS Colors for non-SRG */
3382 ret = ath11k_wmi_pdev_non_srg_obss_color_enable_bitmap(ar, bitmap);
3385 "failed to set non_srg_color_en_bitmap pdev: %u\n",
3390 /* Enable all partial BSSID mask for non-SRG */
3391 ret = ath11k_wmi_pdev_non_srg_obss_bssid_enable_bitmap(ar, bitmap);
3394 "failed to set non_srg_bssid_en_bitmap pdev: %u\n",
3402 static bool ath11k_mac_supports_station_tpc(struct ath11k *ar,
3403 struct ath11k_vif *arvif,
3404 const struct cfg80211_chan_def *chandef)
3406 return ath11k_wmi_supports_6ghz_cc_ext(ar) &&
3407 test_bit(WMI_TLV_SERVICE_EXT_TPC_REG_SUPPORT, ar->ab->wmi_ab.svc_map) &&
3408 arvif->vdev_type == WMI_VDEV_TYPE_STA &&
3409 arvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE &&
3411 chandef->chan->band == NL80211_BAND_6GHZ;
3414 static void ath11k_mac_op_bss_info_changed(struct ieee80211_hw *hw,
3415 struct ieee80211_vif *vif,
3416 struct ieee80211_bss_conf *info,
3419 struct ath11k *ar = hw->priv;
3420 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
3421 struct cfg80211_chan_def def;
3422 u32 param_id, param_value;
3423 enum nl80211_band band;
3434 mutex_lock(&ar->conf_mutex);
3436 if (changed & BSS_CHANGED_BEACON_INT) {
3437 arvif->beacon_interval = info->beacon_int;
3439 param_id = WMI_VDEV_PARAM_BEACON_INTERVAL;
3440 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3442 arvif->beacon_interval);
3444 ath11k_warn(ar->ab, "Failed to set beacon interval for VDEV: %d\n",
3447 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3448 "Beacon interval: %d set for VDEV: %d\n",
3449 arvif->beacon_interval, arvif->vdev_id);
3452 if (changed & BSS_CHANGED_BEACON) {
3453 param_id = WMI_PDEV_PARAM_BEACON_TX_MODE;
3454 param_value = WMI_BEACON_STAGGERED_MODE;
3455 ret = ath11k_wmi_pdev_set_param(ar, param_id,
3456 param_value, ar->pdev->pdev_id);
3458 ath11k_warn(ar->ab, "Failed to set beacon mode for VDEV: %d\n",
3461 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3462 "Set staggered beacon mode for VDEV: %d\n",
3465 if (!arvif->do_not_send_tmpl || !arvif->bcca_zero_sent) {
3466 ret = ath11k_mac_setup_bcn_tmpl(arvif);
3468 ath11k_warn(ar->ab, "failed to update bcn template: %d\n",
3472 if (arvif->bcca_zero_sent)
3473 arvif->do_not_send_tmpl = true;
3475 arvif->do_not_send_tmpl = false;
3477 if (vif->bss_conf.he_support) {
3478 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3479 WMI_VDEV_PARAM_BA_MODE,
3480 WMI_BA_MODE_BUFFER_SIZE_256);
3483 "failed to set BA BUFFER SIZE 256 for vdev: %d\n",
3486 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3487 "Set BA BUFFER SIZE 256 for VDEV: %d\n",
3492 if (changed & (BSS_CHANGED_BEACON_INFO | BSS_CHANGED_BEACON)) {
3493 arvif->dtim_period = info->dtim_period;
3495 param_id = WMI_VDEV_PARAM_DTIM_PERIOD;
3496 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3498 arvif->dtim_period);
3501 ath11k_warn(ar->ab, "Failed to set dtim period for VDEV %d: %i\n",
3502 arvif->vdev_id, ret);
3504 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3505 "DTIM period: %d set for VDEV: %d\n",
3506 arvif->dtim_period, arvif->vdev_id);
3509 if (changed & BSS_CHANGED_SSID &&
3510 vif->type == NL80211_IFTYPE_AP) {
3511 arvif->u.ap.ssid_len = vif->cfg.ssid_len;
3512 if (vif->cfg.ssid_len)
3513 memcpy(arvif->u.ap.ssid, vif->cfg.ssid,
3515 arvif->u.ap.hidden_ssid = info->hidden_ssid;
3518 if (changed & BSS_CHANGED_BSSID && !is_zero_ether_addr(info->bssid))
3519 ether_addr_copy(arvif->bssid, info->bssid);
3521 if (changed & BSS_CHANGED_BEACON_ENABLED) {
3522 if (info->enable_beacon)
3523 ath11k_mac_set_he_txbf_conf(arvif);
3524 ath11k_control_beaconing(arvif, info);
3526 if (arvif->is_up && vif->bss_conf.he_support &&
3527 vif->bss_conf.he_oper.params) {
3528 param_id = WMI_VDEV_PARAM_HEOPS_0_31;
3529 param_value = vif->bss_conf.he_oper.params;
3530 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3531 param_id, param_value);
3532 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3533 "he oper param: %x set for VDEV: %d\n",
3534 param_value, arvif->vdev_id);
3537 ath11k_warn(ar->ab, "Failed to set he oper params %x for VDEV %d: %i\n",
3538 param_value, arvif->vdev_id, ret);
3542 if (changed & BSS_CHANGED_ERP_CTS_PROT) {
3545 cts_prot = !!(info->use_cts_prot);
3546 param_id = WMI_VDEV_PARAM_PROTECTION_MODE;
3548 if (arvif->is_started) {
3549 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3550 param_id, cts_prot);
3552 ath11k_warn(ar->ab, "Failed to set CTS prot for VDEV: %d\n",
3555 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "Set CTS prot: %d for VDEV: %d\n",
3556 cts_prot, arvif->vdev_id);
3558 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "defer protection mode setup, vdev is not ready yet\n");
3562 if (changed & BSS_CHANGED_ERP_SLOT) {
3565 if (info->use_short_slot)
3566 slottime = WMI_VDEV_SLOT_TIME_SHORT; /* 9us */
3569 slottime = WMI_VDEV_SLOT_TIME_LONG; /* 20us */
3571 param_id = WMI_VDEV_PARAM_SLOT_TIME;
3572 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3573 param_id, slottime);
3575 ath11k_warn(ar->ab, "Failed to set erp slot for VDEV: %d\n",
3578 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3579 "Set slottime: %d for VDEV: %d\n",
3580 slottime, arvif->vdev_id);
3583 if (changed & BSS_CHANGED_ERP_PREAMBLE) {
3586 if (info->use_short_preamble)
3587 preamble = WMI_VDEV_PREAMBLE_SHORT;
3589 preamble = WMI_VDEV_PREAMBLE_LONG;
3591 param_id = WMI_VDEV_PARAM_PREAMBLE;
3592 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3593 param_id, preamble);
3595 ath11k_warn(ar->ab, "Failed to set preamble for VDEV: %d\n",
3598 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3599 "Set preamble: %d for VDEV: %d\n",
3600 preamble, arvif->vdev_id);
3603 if (changed & BSS_CHANGED_ASSOC) {
3605 ath11k_bss_assoc(hw, vif, info);
3607 ath11k_bss_disassoc(hw, vif);
3610 if (changed & BSS_CHANGED_TXPOWER) {
3611 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev_id %i txpower %d\n",
3612 arvif->vdev_id, info->txpower);
3613 arvif->txpower = info->txpower;
3614 ath11k_mac_txpower_recalc(ar);
3617 if (changed & BSS_CHANGED_PS &&
3618 ar->ab->hw_params.supports_sta_ps) {
3619 arvif->ps = vif->cfg.ps;
3621 ret = ath11k_mac_config_ps(ar);
3623 ath11k_warn(ar->ab, "failed to setup ps on vdev %i: %d\n",
3624 arvif->vdev_id, ret);
3627 if (changed & BSS_CHANGED_MCAST_RATE &&
3628 !ath11k_mac_vif_chan(arvif->vif, &def)) {
3629 band = def.chan->band;
3630 mcast_rate = vif->bss_conf.mcast_rate[band];
3633 rateidx = mcast_rate - 1;
3635 rateidx = ffs(vif->bss_conf.basic_rates) - 1;
3637 if (ar->pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP)
3638 rateidx += ATH11K_MAC_FIRST_OFDM_RATE_IDX;
3640 bitrate = ath11k_legacy_rates[rateidx].bitrate;
3641 hw_value = ath11k_legacy_rates[rateidx].hw_value;
3643 if (ath11k_mac_bitrate_is_cck(bitrate))
3644 preamble = WMI_RATE_PREAMBLE_CCK;
3646 preamble = WMI_RATE_PREAMBLE_OFDM;
3648 rate = ATH11K_HW_RATE_CODE(hw_value, 0, preamble);
3650 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3651 "vdev %d mcast_rate %x\n",
3652 arvif->vdev_id, rate);
3654 vdev_param = WMI_VDEV_PARAM_MCAST_DATA_RATE;
3655 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3659 "failed to set mcast rate on vdev %i: %d\n",
3660 arvif->vdev_id, ret);
3662 vdev_param = WMI_VDEV_PARAM_BCAST_DATA_RATE;
3663 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3667 "failed to set bcast rate on vdev %i: %d\n",
3668 arvif->vdev_id, ret);
3671 if (changed & BSS_CHANGED_BASIC_RATES &&
3672 !ath11k_mac_vif_chan(arvif->vif, &def))
3673 ath11k_recalculate_mgmt_rate(ar, vif, &def);
3675 if (changed & BSS_CHANGED_TWT) {
3676 struct wmi_twt_enable_params twt_params = {0};
3678 if (info->twt_requester || info->twt_responder) {
3679 ath11k_wmi_fill_default_twt_params(&twt_params);
3680 ath11k_wmi_send_twt_enable_cmd(ar, ar->pdev->pdev_id,
3683 ath11k_wmi_send_twt_disable_cmd(ar, ar->pdev->pdev_id);
3687 if (changed & BSS_CHANGED_HE_OBSS_PD)
3688 ath11k_mac_config_obss_pd(ar, &info->he_obss_pd);
3690 if (changed & BSS_CHANGED_HE_BSS_COLOR) {
3691 if (vif->type == NL80211_IFTYPE_AP) {
3692 ret = ath11k_wmi_send_obss_color_collision_cfg_cmd(
3693 ar, arvif->vdev_id, info->he_bss_color.color,
3694 ATH11K_BSS_COLOR_COLLISION_DETECTION_AP_PERIOD_MS,
3695 info->he_bss_color.enabled);
3697 ath11k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n",
3698 arvif->vdev_id, ret);
3700 param_id = WMI_VDEV_PARAM_BSS_COLOR;
3701 if (info->he_bss_color.enabled)
3702 param_value = info->he_bss_color.color <<
3703 IEEE80211_HE_OPERATION_BSS_COLOR_OFFSET;
3705 param_value = IEEE80211_HE_OPERATION_BSS_COLOR_DISABLED;
3707 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3712 "failed to set bss color param on vdev %i: %d\n",
3713 arvif->vdev_id, ret);
3715 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3716 "bss color param 0x%x set on vdev %i\n",
3717 param_value, arvif->vdev_id);
3718 } else if (vif->type == NL80211_IFTYPE_STATION) {
3719 ret = ath11k_wmi_send_bss_color_change_enable_cmd(ar,
3723 ath11k_warn(ar->ab, "failed to enable bss color change on vdev %i: %d\n",
3724 arvif->vdev_id, ret);
3725 ret = ath11k_wmi_send_obss_color_collision_cfg_cmd(
3726 ar, arvif->vdev_id, 0,
3727 ATH11K_BSS_COLOR_COLLISION_DETECTION_STA_PERIOD_MS, 1);
3729 ath11k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n",
3730 arvif->vdev_id, ret);
3734 if (changed & BSS_CHANGED_FTM_RESPONDER &&
3735 arvif->ftm_responder != info->ftm_responder &&
3736 test_bit(WMI_TLV_SERVICE_RTT, ar->ab->wmi_ab.svc_map) &&
3737 (vif->type == NL80211_IFTYPE_AP ||
3738 vif->type == NL80211_IFTYPE_MESH_POINT)) {
3739 arvif->ftm_responder = info->ftm_responder;
3740 param = WMI_VDEV_PARAM_ENABLE_DISABLE_RTT_RESPONDER_ROLE;
3741 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param,
3742 arvif->ftm_responder);
3744 ath11k_warn(ar->ab, "Failed to set ftm responder %i: %d\n",
3745 arvif->vdev_id, ret);
3748 if (changed & BSS_CHANGED_FILS_DISCOVERY ||
3749 changed & BSS_CHANGED_UNSOL_BCAST_PROBE_RESP)
3750 ath11k_mac_fils_discovery(arvif, info);
3752 if (changed & BSS_CHANGED_ARP_FILTER) {
3753 ipv4_cnt = min(vif->cfg.arp_addr_cnt, ATH11K_IPV4_MAX_COUNT);
3754 memcpy(arvif->arp_ns_offload.ipv4_addr,
3755 vif->cfg.arp_addr_list,
3756 ipv4_cnt * sizeof(u32));
3757 memcpy(arvif->arp_ns_offload.mac_addr, vif->addr, ETH_ALEN);
3758 arvif->arp_ns_offload.ipv4_count = ipv4_cnt;
3760 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "arp_addr_cnt %d vif->addr %pM, offload_addr %pI4\n",
3761 vif->cfg.arp_addr_cnt,
3762 vif->addr, arvif->arp_ns_offload.ipv4_addr);
3765 mutex_unlock(&ar->conf_mutex);
3768 void __ath11k_mac_scan_finish(struct ath11k *ar)
3770 lockdep_assert_held(&ar->data_lock);
3772 switch (ar->scan.state) {
3773 case ATH11K_SCAN_IDLE:
3775 case ATH11K_SCAN_RUNNING:
3776 case ATH11K_SCAN_ABORTING:
3777 if (ar->scan.is_roc && ar->scan.roc_notify)
3778 ieee80211_remain_on_channel_expired(ar->hw);
3780 case ATH11K_SCAN_STARTING:
3781 if (!ar->scan.is_roc) {
3782 struct cfg80211_scan_info info = {
3783 .aborted = ((ar->scan.state ==
3784 ATH11K_SCAN_ABORTING) ||
3786 ATH11K_SCAN_STARTING)),
3789 ieee80211_scan_completed(ar->hw, &info);
3792 ar->scan.state = ATH11K_SCAN_IDLE;
3793 ar->scan_channel = NULL;
3794 ar->scan.roc_freq = 0;
3795 cancel_delayed_work(&ar->scan.timeout);
3796 complete_all(&ar->scan.completed);
3801 void ath11k_mac_scan_finish(struct ath11k *ar)
3803 spin_lock_bh(&ar->data_lock);
3804 __ath11k_mac_scan_finish(ar);
3805 spin_unlock_bh(&ar->data_lock);
3808 static int ath11k_scan_stop(struct ath11k *ar)
3810 struct scan_cancel_param arg = {
3811 .req_type = WLAN_SCAN_CANCEL_SINGLE,
3812 .scan_id = ATH11K_SCAN_ID,
3816 lockdep_assert_held(&ar->conf_mutex);
3818 /* TODO: Fill other STOP Params */
3819 arg.pdev_id = ar->pdev->pdev_id;
3821 ret = ath11k_wmi_send_scan_stop_cmd(ar, &arg);
3823 ath11k_warn(ar->ab, "failed to stop wmi scan: %d\n", ret);
3827 ret = wait_for_completion_timeout(&ar->scan.completed, 3 * HZ);
3830 "failed to receive scan abort comple: timed out\n");
3832 } else if (ret > 0) {
3837 /* Scan state should be updated upon scan completion but in case
3838 * firmware fails to deliver the event (for whatever reason) it is
3839 * desired to clean up scan state anyway. Firmware may have just
3840 * dropped the scan completion event delivery due to transport pipe
3841 * being overflown with data and/or it can recover on its own before
3842 * next scan request is submitted.
3844 spin_lock_bh(&ar->data_lock);
3845 if (ar->scan.state != ATH11K_SCAN_IDLE)
3846 __ath11k_mac_scan_finish(ar);
3847 spin_unlock_bh(&ar->data_lock);
3852 static void ath11k_scan_abort(struct ath11k *ar)
3856 lockdep_assert_held(&ar->conf_mutex);
3858 spin_lock_bh(&ar->data_lock);
3860 switch (ar->scan.state) {
3861 case ATH11K_SCAN_IDLE:
3862 /* This can happen if timeout worker kicked in and called
3863 * abortion while scan completion was being processed.
3866 case ATH11K_SCAN_STARTING:
3867 case ATH11K_SCAN_ABORTING:
3868 ath11k_warn(ar->ab, "refusing scan abortion due to invalid scan state: %d\n",
3871 case ATH11K_SCAN_RUNNING:
3872 ar->scan.state = ATH11K_SCAN_ABORTING;
3873 spin_unlock_bh(&ar->data_lock);
3875 ret = ath11k_scan_stop(ar);
3877 ath11k_warn(ar->ab, "failed to abort scan: %d\n", ret);
3879 spin_lock_bh(&ar->data_lock);
3883 spin_unlock_bh(&ar->data_lock);
3886 static void ath11k_scan_timeout_work(struct work_struct *work)
3888 struct ath11k *ar = container_of(work, struct ath11k,
3891 mutex_lock(&ar->conf_mutex);
3892 ath11k_scan_abort(ar);
3893 mutex_unlock(&ar->conf_mutex);
3896 static int ath11k_start_scan(struct ath11k *ar,
3897 struct scan_req_params *arg)
3900 unsigned long timeout = 1 * HZ;
3902 lockdep_assert_held(&ar->conf_mutex);
3904 if (ath11k_spectral_get_mode(ar) == ATH11K_SPECTRAL_BACKGROUND)
3905 ath11k_spectral_reset_buffer(ar);
3907 ret = ath11k_wmi_send_scan_start_cmd(ar, arg);
3911 if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map)) {
3914 if (ar->supports_6ghz)
3918 ret = wait_for_completion_timeout(&ar->scan.started, timeout);
3920 ret = ath11k_scan_stop(ar);
3922 ath11k_warn(ar->ab, "failed to stop scan: %d\n", ret);
3927 /* If we failed to start the scan, return error code at
3928 * this point. This is probably due to some issue in the
3929 * firmware, but no need to wedge the driver due to that...
3931 spin_lock_bh(&ar->data_lock);
3932 if (ar->scan.state == ATH11K_SCAN_IDLE) {
3933 spin_unlock_bh(&ar->data_lock);
3936 spin_unlock_bh(&ar->data_lock);
3941 static int ath11k_mac_op_hw_scan(struct ieee80211_hw *hw,
3942 struct ieee80211_vif *vif,
3943 struct ieee80211_scan_request *hw_req)
3945 struct ath11k *ar = hw->priv;
3946 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
3947 struct cfg80211_scan_request *req = &hw_req->req;
3948 struct scan_req_params *arg = NULL;
3953 /* Firmwares advertising the support of triggering 11D algorithm
3954 * on the scan results of a regular scan expects driver to send
3955 * WMI_11D_SCAN_START_CMDID before sending WMI_START_SCAN_CMDID.
3956 * With this feature, separate 11D scan can be avoided since
3957 * regdomain can be determined with the scan results of the
3960 if (ar->state_11d == ATH11K_11D_PREPARING &&
3961 test_bit(WMI_TLV_SERVICE_SUPPORT_11D_FOR_HOST_SCAN,
3962 ar->ab->wmi_ab.svc_map))
3963 ath11k_mac_11d_scan_start(ar, arvif->vdev_id);
3965 mutex_lock(&ar->conf_mutex);
3967 spin_lock_bh(&ar->data_lock);
3968 switch (ar->scan.state) {
3969 case ATH11K_SCAN_IDLE:
3970 reinit_completion(&ar->scan.started);
3971 reinit_completion(&ar->scan.completed);
3972 ar->scan.state = ATH11K_SCAN_STARTING;
3973 ar->scan.is_roc = false;
3974 ar->scan.vdev_id = arvif->vdev_id;
3977 case ATH11K_SCAN_STARTING:
3978 case ATH11K_SCAN_RUNNING:
3979 case ATH11K_SCAN_ABORTING:
3983 spin_unlock_bh(&ar->data_lock);
3988 arg = kzalloc(sizeof(*arg), GFP_KERNEL);
3995 ath11k_wmi_start_scan_init(ar, arg);
3996 arg->vdev_id = arvif->vdev_id;
3997 arg->scan_id = ATH11K_SCAN_ID;
4000 arg->extraie.ptr = kmemdup(req->ie, req->ie_len, GFP_KERNEL);
4001 if (!arg->extraie.ptr) {
4005 arg->extraie.len = req->ie_len;
4009 arg->num_ssids = req->n_ssids;
4010 for (i = 0; i < arg->num_ssids; i++) {
4011 arg->ssid[i].length = req->ssids[i].ssid_len;
4012 memcpy(&arg->ssid[i].ssid, req->ssids[i].ssid,
4013 req->ssids[i].ssid_len);
4016 arg->scan_f_passive = 1;
4019 if (req->n_channels) {
4020 arg->num_chan = req->n_channels;
4021 arg->chan_list = kcalloc(arg->num_chan, sizeof(*arg->chan_list),
4024 if (!arg->chan_list) {
4029 for (i = 0; i < arg->num_chan; i++) {
4030 if (test_bit(WMI_TLV_SERVICE_SCAN_CONFIG_PER_CHANNEL,
4031 ar->ab->wmi_ab.svc_map)) {
4033 u32_encode_bits(req->channels[i]->center_freq,
4034 WMI_SCAN_CONFIG_PER_CHANNEL_MASK);
4036 /* If NL80211_SCAN_FLAG_COLOCATED_6GHZ is set in scan
4037 * flags, then scan all PSC channels in 6 GHz band and
4038 * those non-PSC channels where RNR IE is found during
4039 * the legacy 2.4/5 GHz scan.
4040 * If NL80211_SCAN_FLAG_COLOCATED_6GHZ is not set,
4041 * then all channels in 6 GHz will be scanned.
4043 if (req->channels[i]->band == NL80211_BAND_6GHZ &&
4044 req->flags & NL80211_SCAN_FLAG_COLOCATED_6GHZ &&
4045 !cfg80211_channel_is_psc(req->channels[i]))
4046 arg->chan_list[i] |=
4047 WMI_SCAN_CH_FLAG_SCAN_ONLY_IF_RNR_FOUND;
4049 arg->chan_list[i] = req->channels[i]->center_freq;
4054 if (req->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
4055 arg->scan_f_add_spoofed_mac_in_probe = 1;
4056 ether_addr_copy(arg->mac_addr.addr, req->mac_addr);
4057 ether_addr_copy(arg->mac_mask.addr, req->mac_addr_mask);
4060 /* if duration is set, default dwell times will be overwritten */
4061 if (req->duration) {
4062 arg->dwell_time_active = req->duration;
4063 arg->dwell_time_active_2g = req->duration;
4064 arg->dwell_time_active_6g = req->duration;
4065 arg->dwell_time_passive = req->duration;
4066 arg->dwell_time_passive_6g = req->duration;
4067 arg->burst_duration = req->duration;
4069 scan_timeout = min_t(u32, arg->max_rest_time *
4070 (arg->num_chan - 1) + (req->duration +
4071 ATH11K_SCAN_CHANNEL_SWITCH_WMI_EVT_OVERHEAD) *
4072 arg->num_chan, arg->max_scan_time);
4074 scan_timeout = arg->max_scan_time;
4077 /* Add a margin to account for event/command processing */
4078 scan_timeout += ATH11K_MAC_SCAN_CMD_EVT_OVERHEAD;
4080 ret = ath11k_start_scan(ar, arg);
4082 ath11k_warn(ar->ab, "failed to start hw scan: %d\n", ret);
4083 spin_lock_bh(&ar->data_lock);
4084 ar->scan.state = ATH11K_SCAN_IDLE;
4085 spin_unlock_bh(&ar->data_lock);
4088 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
4089 msecs_to_jiffies(scan_timeout));
4093 kfree(arg->chan_list);
4094 kfree(arg->extraie.ptr);
4098 mutex_unlock(&ar->conf_mutex);
4100 if (ar->state_11d == ATH11K_11D_PREPARING)
4101 ath11k_mac_11d_scan_start(ar, arvif->vdev_id);
4106 static void ath11k_mac_op_cancel_hw_scan(struct ieee80211_hw *hw,
4107 struct ieee80211_vif *vif)
4109 struct ath11k *ar = hw->priv;
4111 mutex_lock(&ar->conf_mutex);
4112 ath11k_scan_abort(ar);
4113 mutex_unlock(&ar->conf_mutex);
4115 cancel_delayed_work_sync(&ar->scan.timeout);
4118 static int ath11k_install_key(struct ath11k_vif *arvif,
4119 struct ieee80211_key_conf *key,
4120 enum set_key_cmd cmd,
4121 const u8 *macaddr, u32 flags)
4124 struct ath11k *ar = arvif->ar;
4125 struct wmi_vdev_install_key_arg arg = {
4126 .vdev_id = arvif->vdev_id,
4127 .key_idx = key->keyidx,
4128 .key_len = key->keylen,
4129 .key_data = key->key,
4134 lockdep_assert_held(&arvif->ar->conf_mutex);
4136 reinit_completion(&ar->install_key_done);
4138 if (test_bit(ATH11K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags))
4141 if (cmd == DISABLE_KEY) {
4142 arg.key_cipher = WMI_CIPHER_NONE;
4143 arg.key_data = NULL;
4147 switch (key->cipher) {
4148 case WLAN_CIPHER_SUITE_CCMP:
4149 arg.key_cipher = WMI_CIPHER_AES_CCM;
4150 /* TODO: Re-check if flag is valid */
4151 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT;
4153 case WLAN_CIPHER_SUITE_TKIP:
4154 arg.key_cipher = WMI_CIPHER_TKIP;
4155 arg.key_txmic_len = 8;
4156 arg.key_rxmic_len = 8;
4158 case WLAN_CIPHER_SUITE_CCMP_256:
4159 arg.key_cipher = WMI_CIPHER_AES_CCM;
4161 case WLAN_CIPHER_SUITE_GCMP:
4162 case WLAN_CIPHER_SUITE_GCMP_256:
4163 arg.key_cipher = WMI_CIPHER_AES_GCM;
4166 ath11k_warn(ar->ab, "cipher %d is not supported\n", key->cipher);
4170 if (test_bit(ATH11K_FLAG_RAW_MODE, &ar->ab->dev_flags))
4171 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV |
4172 IEEE80211_KEY_FLAG_RESERVE_TAILROOM;
4175 ret = ath11k_wmi_vdev_install_key(arvif->ar, &arg);
4180 if (!wait_for_completion_timeout(&ar->install_key_done, 1 * HZ))
4183 return ar->install_key_status ? -EINVAL : 0;
4186 static int ath11k_clear_peer_keys(struct ath11k_vif *arvif,
4189 struct ath11k *ar = arvif->ar;
4190 struct ath11k_base *ab = ar->ab;
4191 struct ath11k_peer *peer;
4192 int first_errno = 0;
4197 lockdep_assert_held(&ar->conf_mutex);
4199 spin_lock_bh(&ab->base_lock);
4200 peer = ath11k_peer_find(ab, arvif->vdev_id, addr);
4201 spin_unlock_bh(&ab->base_lock);
4206 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
4210 /* key flags are not required to delete the key */
4211 ret = ath11k_install_key(arvif, peer->keys[i],
4212 DISABLE_KEY, addr, flags);
4213 if (ret < 0 && first_errno == 0)
4217 ath11k_warn(ab, "failed to remove peer key %d: %d\n",
4220 spin_lock_bh(&ab->base_lock);
4221 peer->keys[i] = NULL;
4222 spin_unlock_bh(&ab->base_lock);
4228 static int ath11k_mac_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
4229 struct ieee80211_vif *vif, struct ieee80211_sta *sta,
4230 struct ieee80211_key_conf *key)
4232 struct ath11k *ar = hw->priv;
4233 struct ath11k_base *ab = ar->ab;
4234 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
4235 struct ath11k_peer *peer;
4236 struct ath11k_sta *arsta;
4237 const u8 *peer_addr;
4241 /* BIP needs to be done in software */
4242 if (key->cipher == WLAN_CIPHER_SUITE_AES_CMAC ||
4243 key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_128 ||
4244 key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_256 ||
4245 key->cipher == WLAN_CIPHER_SUITE_BIP_CMAC_256)
4248 if (test_bit(ATH11K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags))
4251 if (key->keyidx > WMI_MAX_KEY_INDEX)
4254 mutex_lock(&ar->conf_mutex);
4257 peer_addr = sta->addr;
4258 else if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
4259 peer_addr = vif->bss_conf.bssid;
4261 peer_addr = vif->addr;
4263 key->hw_key_idx = key->keyidx;
4265 /* the peer should not disappear in mid-way (unless FW goes awry) since
4266 * we already hold conf_mutex. we just make sure its there now.
4268 spin_lock_bh(&ab->base_lock);
4269 peer = ath11k_peer_find(ab, arvif->vdev_id, peer_addr);
4271 /* flush the fragments cache during key (re)install to
4272 * ensure all frags in the new frag list belong to the same key.
4274 if (peer && sta && cmd == SET_KEY)
4275 ath11k_peer_frags_flush(ar, peer);
4276 spin_unlock_bh(&ab->base_lock);
4279 if (cmd == SET_KEY) {
4280 ath11k_warn(ab, "cannot install key for non-existent peer %pM\n",
4285 /* if the peer doesn't exist there is no key to disable
4292 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
4293 flags |= WMI_KEY_PAIRWISE;
4295 flags |= WMI_KEY_GROUP;
4297 ret = ath11k_install_key(arvif, key, cmd, peer_addr, flags);
4299 ath11k_warn(ab, "ath11k_install_key failed (%d)\n", ret);
4303 ret = ath11k_dp_peer_rx_pn_replay_config(arvif, peer_addr, cmd, key);
4305 ath11k_warn(ab, "failed to offload PN replay detection %d\n", ret);
4309 spin_lock_bh(&ab->base_lock);
4310 peer = ath11k_peer_find(ab, arvif->vdev_id, peer_addr);
4311 if (peer && cmd == SET_KEY) {
4312 peer->keys[key->keyidx] = key;
4313 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) {
4314 peer->ucast_keyidx = key->keyidx;
4315 peer->sec_type = ath11k_dp_tx_get_encrypt_type(key->cipher);
4317 peer->mcast_keyidx = key->keyidx;
4318 peer->sec_type_grp = ath11k_dp_tx_get_encrypt_type(key->cipher);
4320 } else if (peer && cmd == DISABLE_KEY) {
4321 peer->keys[key->keyidx] = NULL;
4322 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
4323 peer->ucast_keyidx = 0;
4325 peer->mcast_keyidx = 0;
4327 /* impossible unless FW goes crazy */
4328 ath11k_warn(ab, "peer %pM disappeared!\n", peer_addr);
4331 arsta = ath11k_sta_to_arsta(sta);
4333 switch (key->cipher) {
4334 case WLAN_CIPHER_SUITE_TKIP:
4335 case WLAN_CIPHER_SUITE_CCMP:
4336 case WLAN_CIPHER_SUITE_CCMP_256:
4337 case WLAN_CIPHER_SUITE_GCMP:
4338 case WLAN_CIPHER_SUITE_GCMP_256:
4340 arsta->pn_type = HAL_PN_TYPE_WPA;
4342 arsta->pn_type = HAL_PN_TYPE_NONE;
4345 arsta->pn_type = HAL_PN_TYPE_NONE;
4350 spin_unlock_bh(&ab->base_lock);
4353 mutex_unlock(&ar->conf_mutex);
4358 ath11k_mac_bitrate_mask_num_ht_rates(struct ath11k *ar,
4359 enum nl80211_band band,
4360 const struct cfg80211_bitrate_mask *mask)
4365 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++)
4366 num_rates += hweight8(mask->control[band].ht_mcs[i]);
4372 ath11k_mac_bitrate_mask_num_vht_rates(struct ath11k *ar,
4373 enum nl80211_band band,
4374 const struct cfg80211_bitrate_mask *mask)
4379 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++)
4380 num_rates += hweight16(mask->control[band].vht_mcs[i]);
4386 ath11k_mac_bitrate_mask_num_he_rates(struct ath11k *ar,
4387 enum nl80211_band band,
4388 const struct cfg80211_bitrate_mask *mask)
4393 for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++)
4394 num_rates += hweight16(mask->control[band].he_mcs[i]);
4400 ath11k_mac_set_peer_vht_fixed_rate(struct ath11k_vif *arvif,
4401 struct ieee80211_sta *sta,
4402 const struct cfg80211_bitrate_mask *mask,
4403 enum nl80211_band band)
4405 struct ath11k *ar = arvif->ar;
4410 lockdep_assert_held(&ar->conf_mutex);
4414 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
4415 if (hweight16(mask->control[band].vht_mcs[i]) == 1) {
4417 vht_rate = ffs(mask->control[band].vht_mcs[i]) - 1;
4422 ath11k_warn(ar->ab, "No single VHT Fixed rate found to set for %pM",
4427 /* Avoid updating invalid nss as fixed rate*/
4428 if (nss > sta->deflink.rx_nss)
4431 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
4432 "Setting Fixed VHT Rate for peer %pM. Device will not switch to any other selected rates",
4435 rate_code = ATH11K_HW_RATE_CODE(vht_rate, nss - 1,
4436 WMI_RATE_PREAMBLE_VHT);
4437 ret = ath11k_wmi_set_peer_param(ar, sta->addr,
4439 WMI_PEER_PARAM_FIXED_RATE,
4443 "failed to update STA %pM Fixed Rate %d: %d\n",
4444 sta->addr, rate_code, ret);
4450 ath11k_mac_set_peer_he_fixed_rate(struct ath11k_vif *arvif,
4451 struct ieee80211_sta *sta,
4452 const struct cfg80211_bitrate_mask *mask,
4453 enum nl80211_band band)
4455 struct ath11k *ar = arvif->ar;
4460 lockdep_assert_held(&ar->conf_mutex);
4464 for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) {
4465 if (hweight16(mask->control[band].he_mcs[i]) == 1) {
4467 he_rate = ffs(mask->control[band].he_mcs[i]) - 1;
4472 ath11k_warn(ar->ab, "No single he fixed rate found to set for %pM",
4477 /* Avoid updating invalid nss as fixed rate */
4478 if (nss > sta->deflink.rx_nss)
4481 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
4482 "setting fixed he rate for peer %pM, device will not switch to any other selected rates",
4485 rate_code = ATH11K_HW_RATE_CODE(he_rate, nss - 1,
4486 WMI_RATE_PREAMBLE_HE);
4488 ret = ath11k_wmi_set_peer_param(ar, sta->addr,
4490 WMI_PEER_PARAM_FIXED_RATE,
4494 "failed to update sta %pM fixed rate %d: %d\n",
4495 sta->addr, rate_code, ret);
4501 ath11k_mac_set_peer_ht_fixed_rate(struct ath11k_vif *arvif,
4502 struct ieee80211_sta *sta,
4503 const struct cfg80211_bitrate_mask *mask,
4504 enum nl80211_band band)
4506 struct ath11k *ar = arvif->ar;
4507 u8 ht_rate, nss = 0;
4511 lockdep_assert_held(&ar->conf_mutex);
4513 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) {
4514 if (hweight8(mask->control[band].ht_mcs[i]) == 1) {
4516 ht_rate = ffs(mask->control[band].ht_mcs[i]) - 1;
4521 ath11k_warn(ar->ab, "No single HT Fixed rate found to set for %pM",
4526 /* Avoid updating invalid nss as fixed rate*/
4527 if (nss > sta->deflink.rx_nss)
4530 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
4531 "Setting Fixed HT Rate for peer %pM. Device will not switch to any other selected rates",
4534 rate_code = ATH11K_HW_RATE_CODE(ht_rate, nss - 1,
4535 WMI_RATE_PREAMBLE_HT);
4536 ret = ath11k_wmi_set_peer_param(ar, sta->addr,
4538 WMI_PEER_PARAM_FIXED_RATE,
4542 "failed to update STA %pM HT Fixed Rate %d: %d\n",
4543 sta->addr, rate_code, ret);
4548 static int ath11k_station_assoc(struct ath11k *ar,
4549 struct ieee80211_vif *vif,
4550 struct ieee80211_sta *sta,
4553 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
4554 struct peer_assoc_params peer_arg;
4556 struct cfg80211_chan_def def;
4557 enum nl80211_band band;
4558 struct cfg80211_bitrate_mask *mask;
4559 u8 num_ht_rates, num_vht_rates, num_he_rates;
4561 lockdep_assert_held(&ar->conf_mutex);
4563 if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
4566 band = def.chan->band;
4567 mask = &arvif->bitrate_mask;
4569 ath11k_peer_assoc_prepare(ar, vif, sta, &peer_arg, reassoc);
4571 peer_arg.is_assoc = true;
4572 ret = ath11k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
4574 ath11k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n",
4575 sta->addr, arvif->vdev_id, ret);
4579 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) {
4580 ath11k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
4581 sta->addr, arvif->vdev_id);
4585 num_vht_rates = ath11k_mac_bitrate_mask_num_vht_rates(ar, band, mask);
4586 num_he_rates = ath11k_mac_bitrate_mask_num_he_rates(ar, band, mask);
4587 num_ht_rates = ath11k_mac_bitrate_mask_num_ht_rates(ar, band, mask);
4589 /* If single VHT/HE rate is configured (by set_bitrate_mask()),
4590 * peer_assoc will disable VHT/HE. This is now enabled by a peer specific
4592 * Note that all other rates and NSS will be disabled for this peer.
4594 if (sta->deflink.vht_cap.vht_supported && num_vht_rates == 1) {
4595 ret = ath11k_mac_set_peer_vht_fixed_rate(arvif, sta, mask,
4599 } else if (sta->deflink.he_cap.has_he && num_he_rates == 1) {
4600 ret = ath11k_mac_set_peer_he_fixed_rate(arvif, sta, mask,
4604 } else if (sta->deflink.ht_cap.ht_supported && num_ht_rates == 1) {
4605 ret = ath11k_mac_set_peer_ht_fixed_rate(arvif, sta, mask,
4611 /* Re-assoc is run only to update supported rates for given station. It
4612 * doesn't make much sense to reconfigure the peer completely.
4617 ret = ath11k_setup_peer_smps(ar, arvif, sta->addr,
4618 &sta->deflink.ht_cap,
4619 le16_to_cpu(sta->deflink.he_6ghz_capa.capa));
4621 ath11k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n",
4622 arvif->vdev_id, ret);
4627 arvif->num_legacy_stations++;
4628 ret = ath11k_recalc_rtscts_prot(arvif);
4633 if (sta->wme && sta->uapsd_queues) {
4634 ret = ath11k_peer_assoc_qos_ap(ar, arvif, sta);
4636 ath11k_warn(ar->ab, "failed to set qos params for STA %pM for vdev %i: %d\n",
4637 sta->addr, arvif->vdev_id, ret);
4645 static int ath11k_station_disassoc(struct ath11k *ar,
4646 struct ieee80211_vif *vif,
4647 struct ieee80211_sta *sta)
4649 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
4652 lockdep_assert_held(&ar->conf_mutex);
4655 arvif->num_legacy_stations--;
4656 ret = ath11k_recalc_rtscts_prot(arvif);
4661 ret = ath11k_clear_peer_keys(arvif, sta->addr);
4663 ath11k_warn(ar->ab, "failed to clear all peer keys for vdev %i: %d\n",
4664 arvif->vdev_id, ret);
4670 static u32 ath11k_mac_max_nss(const u8 *ht_mcs_mask, const u16 *vht_mcs_mask,
4671 const u16 *he_mcs_mask)
4673 return max3(ath11k_mac_max_ht_nss(ht_mcs_mask),
4674 ath11k_mac_max_vht_nss(vht_mcs_mask),
4675 ath11k_mac_max_he_nss(he_mcs_mask));
4678 static void ath11k_sta_rc_update_wk(struct work_struct *wk)
4681 struct ath11k_vif *arvif;
4682 struct ath11k_sta *arsta;
4683 struct ieee80211_sta *sta;
4684 struct cfg80211_chan_def def;
4685 enum nl80211_band band;
4686 const u8 *ht_mcs_mask;
4687 const u16 *vht_mcs_mask;
4688 const u16 *he_mcs_mask;
4689 u32 changed, bw, nss, smps, bw_prev;
4690 int err, num_ht_rates, num_vht_rates, num_he_rates;
4691 const struct cfg80211_bitrate_mask *mask;
4692 struct peer_assoc_params peer_arg;
4693 enum wmi_phy_mode peer_phymode;
4695 arsta = container_of(wk, struct ath11k_sta, update_wk);
4696 sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv);
4697 arvif = arsta->arvif;
4700 if (WARN_ON(ath11k_mac_vif_chan(arvif->vif, &def)))
4703 band = def.chan->band;
4704 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
4705 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
4706 he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs;
4708 spin_lock_bh(&ar->data_lock);
4710 changed = arsta->changed;
4714 bw_prev = arsta->bw_prev;
4718 spin_unlock_bh(&ar->data_lock);
4720 mutex_lock(&ar->conf_mutex);
4722 nss = max_t(u32, 1, nss);
4723 nss = min(nss, ath11k_mac_max_nss(ht_mcs_mask, vht_mcs_mask, he_mcs_mask));
4725 if (changed & IEEE80211_RC_BW_CHANGED) {
4726 /* Get the peer phymode */
4727 ath11k_peer_assoc_h_phymode(ar, arvif->vif, sta, &peer_arg);
4728 peer_phymode = peer_arg.peer_phymode;
4730 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "update sta %pM peer bw %d phymode %d\n",
4731 sta->addr, bw, peer_phymode);
4734 /* BW is upgraded. In this case we send WMI_PEER_PHYMODE
4735 * followed by WMI_PEER_CHWIDTH
4737 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "BW upgrade for sta %pM new BW %d, old BW %d\n",
4738 sta->addr, bw, bw_prev);
4740 err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
4741 WMI_PEER_PHYMODE, peer_phymode);
4744 ath11k_warn(ar->ab, "failed to update STA %pM peer phymode %d: %d\n",
4745 sta->addr, peer_phymode, err);
4746 goto err_rc_bw_changed;
4749 err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
4750 WMI_PEER_CHWIDTH, bw);
4753 ath11k_warn(ar->ab, "failed to update STA %pM peer bw %d: %d\n",
4754 sta->addr, bw, err);
4756 /* BW is downgraded. In this case we send WMI_PEER_CHWIDTH
4757 * followed by WMI_PEER_PHYMODE
4759 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "BW downgrade for sta %pM new BW %d,old BW %d\n",
4760 sta->addr, bw, bw_prev);
4762 err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
4763 WMI_PEER_CHWIDTH, bw);
4766 ath11k_warn(ar->ab, "failed to update STA %pM peer bw %d: %d\n",
4767 sta->addr, bw, err);
4768 goto err_rc_bw_changed;
4771 err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
4772 WMI_PEER_PHYMODE, peer_phymode);
4775 ath11k_warn(ar->ab, "failed to update STA %pM peer phymode %d: %d\n",
4776 sta->addr, peer_phymode, err);
4780 if (changed & IEEE80211_RC_NSS_CHANGED) {
4781 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "update sta %pM nss %d\n",
4784 err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
4787 ath11k_warn(ar->ab, "failed to update STA %pM nss %d: %d\n",
4788 sta->addr, nss, err);
4791 if (changed & IEEE80211_RC_SMPS_CHANGED) {
4792 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "update sta %pM smps %d\n",
4795 err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
4796 WMI_PEER_MIMO_PS_STATE, smps);
4798 ath11k_warn(ar->ab, "failed to update STA %pM smps %d: %d\n",
4799 sta->addr, smps, err);
4802 if (changed & IEEE80211_RC_SUPP_RATES_CHANGED) {
4803 mask = &arvif->bitrate_mask;
4804 num_ht_rates = ath11k_mac_bitrate_mask_num_ht_rates(ar, band,
4806 num_vht_rates = ath11k_mac_bitrate_mask_num_vht_rates(ar, band,
4808 num_he_rates = ath11k_mac_bitrate_mask_num_he_rates(ar, band,
4811 /* Peer_assoc_prepare will reject vht rates in
4812 * bitrate_mask if its not available in range format and
4813 * sets vht tx_rateset as unsupported. So multiple VHT MCS
4814 * setting(eg. MCS 4,5,6) per peer is not supported here.
4815 * But, Single rate in VHT mask can be set as per-peer
4816 * fixed rate. But even if any HT rates are configured in
4817 * the bitrate mask, device will not switch to those rates
4818 * when per-peer Fixed rate is set.
4819 * TODO: Check RATEMASK_CMDID to support auto rates selection
4820 * across HT/VHT and for multiple VHT MCS support.
4822 if (sta->deflink.vht_cap.vht_supported && num_vht_rates == 1) {
4823 ath11k_mac_set_peer_vht_fixed_rate(arvif, sta, mask,
4825 } else if (sta->deflink.he_cap.has_he && num_he_rates == 1) {
4826 ath11k_mac_set_peer_he_fixed_rate(arvif, sta, mask,
4828 } else if (sta->deflink.ht_cap.ht_supported && num_ht_rates == 1) {
4829 ath11k_mac_set_peer_ht_fixed_rate(arvif, sta, mask,
4832 /* If the peer is non-VHT/HE or no fixed VHT/HE rate
4833 * is provided in the new bitrate mask we set the
4834 * other rates using peer_assoc command. Also clear
4835 * the peer fixed rate settings as it has higher proprity
4838 err = ath11k_wmi_set_peer_param(ar, sta->addr,
4840 WMI_PEER_PARAM_FIXED_RATE,
4841 WMI_FIXED_RATE_NONE);
4844 "failed to disable peer fixed rate for sta %pM: %d\n",
4847 ath11k_peer_assoc_prepare(ar, arvif->vif, sta,
4850 peer_arg.is_assoc = false;
4851 err = ath11k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
4853 ath11k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n",
4854 sta->addr, arvif->vdev_id, err);
4856 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ))
4857 ath11k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
4858 sta->addr, arvif->vdev_id);
4863 mutex_unlock(&ar->conf_mutex);
4866 static void ath11k_sta_set_4addr_wk(struct work_struct *wk)
4869 struct ath11k_vif *arvif;
4870 struct ath11k_sta *arsta;
4871 struct ieee80211_sta *sta;
4874 arsta = container_of(wk, struct ath11k_sta, set_4addr_wk);
4875 sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv);
4876 arvif = arsta->arvif;
4879 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
4880 "setting USE_4ADDR for peer %pM\n", sta->addr);
4882 ret = ath11k_wmi_set_peer_param(ar, sta->addr,
4884 WMI_PEER_USE_4ADDR, 1);
4887 ath11k_warn(ar->ab, "failed to set peer %pM 4addr capability: %d\n",
4891 static int ath11k_mac_inc_num_stations(struct ath11k_vif *arvif,
4892 struct ieee80211_sta *sta)
4894 struct ath11k *ar = arvif->ar;
4896 lockdep_assert_held(&ar->conf_mutex);
4898 if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
4901 if (ar->num_stations >= ar->max_num_stations)
4909 static void ath11k_mac_dec_num_stations(struct ath11k_vif *arvif,
4910 struct ieee80211_sta *sta)
4912 struct ath11k *ar = arvif->ar;
4914 lockdep_assert_held(&ar->conf_mutex);
4916 if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
4922 static u32 ath11k_mac_ieee80211_sta_bw_to_wmi(struct ath11k *ar,
4923 struct ieee80211_sta *sta)
4925 u32 bw = WMI_PEER_CHWIDTH_20MHZ;
4927 switch (sta->deflink.bandwidth) {
4928 case IEEE80211_STA_RX_BW_20:
4929 bw = WMI_PEER_CHWIDTH_20MHZ;
4931 case IEEE80211_STA_RX_BW_40:
4932 bw = WMI_PEER_CHWIDTH_40MHZ;
4934 case IEEE80211_STA_RX_BW_80:
4935 bw = WMI_PEER_CHWIDTH_80MHZ;
4937 case IEEE80211_STA_RX_BW_160:
4938 bw = WMI_PEER_CHWIDTH_160MHZ;
4941 ath11k_warn(ar->ab, "Invalid bandwidth %d for %pM\n",
4942 sta->deflink.bandwidth, sta->addr);
4943 bw = WMI_PEER_CHWIDTH_20MHZ;
4950 static int ath11k_mac_op_sta_set_txpwr(struct ieee80211_hw *hw,
4951 struct ieee80211_vif *vif,
4952 struct ieee80211_sta *sta)
4954 struct ath11k *ar = hw->priv;
4955 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
4959 if (sta->deflink.txpwr.type == NL80211_TX_POWER_AUTOMATIC) {
4962 txpwr = sta->deflink.txpwr.power;
4967 if (txpwr > ATH11K_TX_POWER_MAX_VAL || txpwr < ATH11K_TX_POWER_MIN_VAL)
4970 mutex_lock(&ar->conf_mutex);
4972 ret = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
4973 WMI_PEER_USE_FIXED_PWR, txpwr);
4975 ath11k_warn(ar->ab, "failed to set tx power for station ret: %d\n",
4981 mutex_unlock(&ar->conf_mutex);
4985 static void ath11k_mac_op_sta_set_4addr(struct ieee80211_hw *hw,
4986 struct ieee80211_vif *vif,
4987 struct ieee80211_sta *sta, bool enabled)
4989 struct ath11k *ar = hw->priv;
4990 struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
4992 if (enabled && !arsta->use_4addr_set) {
4993 ieee80211_queue_work(ar->hw, &arsta->set_4addr_wk);
4994 arsta->use_4addr_set = true;
4998 static void ath11k_mac_op_sta_rc_update(struct ieee80211_hw *hw,
4999 struct ieee80211_vif *vif,
5000 struct ieee80211_sta *sta,
5003 struct ath11k *ar = hw->priv;
5004 struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
5005 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
5006 struct ath11k_peer *peer;
5009 spin_lock_bh(&ar->ab->base_lock);
5011 peer = ath11k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
5013 spin_unlock_bh(&ar->ab->base_lock);
5014 ath11k_warn(ar->ab, "mac sta rc update failed to find peer %pM on vdev %i\n",
5015 sta->addr, arvif->vdev_id);
5019 spin_unlock_bh(&ar->ab->base_lock);
5021 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
5022 "sta rc update for %pM changed %08x bw %d nss %d smps %d\n",
5023 sta->addr, changed, sta->deflink.bandwidth,
5024 sta->deflink.rx_nss,
5025 sta->deflink.smps_mode);
5027 spin_lock_bh(&ar->data_lock);
5029 if (changed & IEEE80211_RC_BW_CHANGED) {
5030 bw = ath11k_mac_ieee80211_sta_bw_to_wmi(ar, sta);
5031 arsta->bw_prev = arsta->bw;
5035 if (changed & IEEE80211_RC_NSS_CHANGED)
5036 arsta->nss = sta->deflink.rx_nss;
5038 if (changed & IEEE80211_RC_SMPS_CHANGED) {
5039 smps = WMI_PEER_SMPS_PS_NONE;
5041 switch (sta->deflink.smps_mode) {
5042 case IEEE80211_SMPS_AUTOMATIC:
5043 case IEEE80211_SMPS_OFF:
5044 smps = WMI_PEER_SMPS_PS_NONE;
5046 case IEEE80211_SMPS_STATIC:
5047 smps = WMI_PEER_SMPS_STATIC;
5049 case IEEE80211_SMPS_DYNAMIC:
5050 smps = WMI_PEER_SMPS_DYNAMIC;
5053 ath11k_warn(ar->ab, "Invalid smps %d in sta rc update for %pM\n",
5054 sta->deflink.smps_mode, sta->addr);
5055 smps = WMI_PEER_SMPS_PS_NONE;
5062 arsta->changed |= changed;
5064 spin_unlock_bh(&ar->data_lock);
5066 ieee80211_queue_work(hw, &arsta->update_wk);
5069 static int ath11k_conf_tx_uapsd(struct ath11k *ar, struct ieee80211_vif *vif,
5070 u16 ac, bool enable)
5072 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
5076 if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
5080 case IEEE80211_AC_VO:
5081 value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN |
5082 WMI_STA_PS_UAPSD_AC3_TRIGGER_EN;
5084 case IEEE80211_AC_VI:
5085 value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN |
5086 WMI_STA_PS_UAPSD_AC2_TRIGGER_EN;
5088 case IEEE80211_AC_BE:
5089 value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN |
5090 WMI_STA_PS_UAPSD_AC1_TRIGGER_EN;
5092 case IEEE80211_AC_BK:
5093 value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN |
5094 WMI_STA_PS_UAPSD_AC0_TRIGGER_EN;
5099 arvif->u.sta.uapsd |= value;
5101 arvif->u.sta.uapsd &= ~value;
5103 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
5104 WMI_STA_PS_PARAM_UAPSD,
5105 arvif->u.sta.uapsd);
5107 ath11k_warn(ar->ab, "could not set uapsd params %d\n", ret);
5111 if (arvif->u.sta.uapsd)
5112 value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD;
5114 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
5116 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
5117 WMI_STA_PS_PARAM_RX_WAKE_POLICY,
5120 ath11k_warn(ar->ab, "could not set rx wake param %d\n", ret);
5126 static int ath11k_mac_op_conf_tx(struct ieee80211_hw *hw,
5127 struct ieee80211_vif *vif,
5128 unsigned int link_id, u16 ac,
5129 const struct ieee80211_tx_queue_params *params)
5131 struct ath11k *ar = hw->priv;
5132 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
5133 struct wmi_wmm_params_arg *p = NULL;
5136 mutex_lock(&ar->conf_mutex);
5139 case IEEE80211_AC_VO:
5140 p = &arvif->wmm_params.ac_vo;
5142 case IEEE80211_AC_VI:
5143 p = &arvif->wmm_params.ac_vi;
5145 case IEEE80211_AC_BE:
5146 p = &arvif->wmm_params.ac_be;
5148 case IEEE80211_AC_BK:
5149 p = &arvif->wmm_params.ac_bk;
5158 p->cwmin = params->cw_min;
5159 p->cwmax = params->cw_max;
5160 p->aifs = params->aifs;
5161 p->txop = params->txop;
5163 ret = ath11k_wmi_send_wmm_update_cmd_tlv(ar, arvif->vdev_id,
5164 &arvif->wmm_params);
5166 ath11k_warn(ar->ab, "failed to set wmm params: %d\n", ret);
5170 ret = ath11k_conf_tx_uapsd(ar, vif, ac, params->uapsd);
5173 ath11k_warn(ar->ab, "failed to set sta uapsd: %d\n", ret);
5176 mutex_unlock(&ar->conf_mutex);
5180 static struct ieee80211_sta_ht_cap
5181 ath11k_create_ht_cap(struct ath11k *ar, u32 ar_ht_cap, u32 rate_cap_rx_chainmask)
5184 struct ieee80211_sta_ht_cap ht_cap = {0};
5185 u32 ar_vht_cap = ar->pdev->cap.vht_cap;
5187 if (!(ar_ht_cap & WMI_HT_CAP_ENABLED))
5190 ht_cap.ht_supported = 1;
5191 ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
5192 ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_NONE;
5193 ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
5194 ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
5195 ht_cap.cap |= WLAN_HT_CAP_SM_PS_STATIC << IEEE80211_HT_CAP_SM_PS_SHIFT;
5197 if (ar_ht_cap & WMI_HT_CAP_HT20_SGI)
5198 ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
5200 if (ar_ht_cap & WMI_HT_CAP_HT40_SGI)
5201 ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
5203 if (ar_ht_cap & WMI_HT_CAP_DYNAMIC_SMPS) {
5206 smps = WLAN_HT_CAP_SM_PS_DYNAMIC;
5207 smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT;
5212 if (ar_ht_cap & WMI_HT_CAP_TX_STBC)
5213 ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC;
5215 if (ar_ht_cap & WMI_HT_CAP_RX_STBC) {
5219 stbc &= WMI_HT_CAP_RX_STBC;
5220 stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT;
5221 stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT;
5222 stbc &= IEEE80211_HT_CAP_RX_STBC;
5227 if (ar_ht_cap & WMI_HT_CAP_RX_LDPC)
5228 ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
5230 if (ar_ht_cap & WMI_HT_CAP_L_SIG_TXOP_PROT)
5231 ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
5233 if (ar_vht_cap & WMI_VHT_CAP_MAX_MPDU_LEN_MASK)
5234 ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU;
5236 for (i = 0; i < ar->num_rx_chains; i++) {
5237 if (rate_cap_rx_chainmask & BIT(i))
5238 ht_cap.mcs.rx_mask[i] = 0xFF;
5241 ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
5246 static int ath11k_mac_set_txbf_conf(struct ath11k_vif *arvif)
5249 struct ath11k *ar = arvif->ar;
5252 u32 vht_cap = ar->pdev->cap.vht_cap;
5253 u32 vdev_param = WMI_VDEV_PARAM_TXBF;
5255 if (vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)) {
5256 nsts = vht_cap & IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
5257 nsts >>= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
5258 if (nsts > (ar->num_rx_chains - 1))
5259 nsts = ar->num_rx_chains - 1;
5260 value |= SM(nsts, WMI_TXBF_STS_CAP_OFFSET);
5263 if (vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)) {
5264 sound_dim = vht_cap &
5265 IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
5266 sound_dim >>= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
5267 if (sound_dim > (ar->num_tx_chains - 1))
5268 sound_dim = ar->num_tx_chains - 1;
5269 value |= SM(sound_dim, WMI_BF_SOUND_DIM_OFFSET);
5275 if (vht_cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE) {
5276 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
5278 if ((vht_cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE) &&
5279 arvif->vdev_type == WMI_VDEV_TYPE_AP)
5280 value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFER;
5283 /* TODO: SUBFEE not validated in HK, disable here until validated? */
5285 if (vht_cap & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE) {
5286 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
5288 if ((vht_cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE) &&
5289 arvif->vdev_type == WMI_VDEV_TYPE_STA)
5290 value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFEE;
5293 return ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
5297 static void ath11k_set_vht_txbf_cap(struct ath11k *ar, u32 *vht_cap)
5299 bool subfer, subfee;
5300 int sound_dim = 0, nsts = 0;
5302 subfer = !!(*vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE));
5303 subfee = !!(*vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE));
5305 if (ar->num_tx_chains < 2) {
5306 *vht_cap &= ~(IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE);
5310 if (ar->num_rx_chains < 2) {
5311 *vht_cap &= ~(IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE);
5315 /* If SU Beaformer is not set, then disable MU Beamformer Capability */
5317 *vht_cap &= ~(IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE);
5319 /* If SU Beaformee is not set, then disable MU Beamformee Capability */
5321 *vht_cap &= ~(IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE);
5323 sound_dim = (*vht_cap & IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK);
5324 sound_dim >>= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
5325 *vht_cap &= ~IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
5327 nsts = (*vht_cap & IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK);
5328 nsts >>= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
5329 *vht_cap &= ~IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
5331 /* Enable Sounding Dimension Field only if SU BF is enabled */
5333 if (sound_dim > (ar->num_tx_chains - 1))
5334 sound_dim = ar->num_tx_chains - 1;
5336 sound_dim <<= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
5337 sound_dim &= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
5338 *vht_cap |= sound_dim;
5341 /* Enable Beamformee STS Field only if SU BF is enabled */
5343 if (nsts > (ar->num_rx_chains - 1))
5344 nsts = ar->num_rx_chains - 1;
5346 nsts <<= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
5347 nsts &= IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
5352 static struct ieee80211_sta_vht_cap
5353 ath11k_create_vht_cap(struct ath11k *ar, u32 rate_cap_tx_chainmask,
5354 u32 rate_cap_rx_chainmask)
5356 struct ieee80211_sta_vht_cap vht_cap = {0};
5357 u16 txmcs_map, rxmcs_map;
5360 vht_cap.vht_supported = 1;
5361 vht_cap.cap = ar->pdev->cap.vht_cap;
5363 if (ar->pdev->cap.nss_ratio_enabled)
5364 vht_cap.vht_mcs.tx_highest |=
5365 cpu_to_le16(IEEE80211_VHT_EXT_NSS_BW_CAPABLE);
5367 ath11k_set_vht_txbf_cap(ar, &vht_cap.cap);
5371 for (i = 0; i < 8; i++) {
5372 if (i < ar->num_tx_chains && rate_cap_tx_chainmask & BIT(i))
5373 txmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
5375 txmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
5377 if (i < ar->num_rx_chains && rate_cap_rx_chainmask & BIT(i))
5378 rxmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
5380 rxmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
5383 if (rate_cap_tx_chainmask <= 1)
5384 vht_cap.cap &= ~IEEE80211_VHT_CAP_TXSTBC;
5386 vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(rxmcs_map);
5387 vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(txmcs_map);
5392 static void ath11k_mac_setup_ht_vht_cap(struct ath11k *ar,
5393 struct ath11k_pdev_cap *cap,
5396 struct ieee80211_supported_band *band;
5397 u32 rate_cap_tx_chainmask;
5398 u32 rate_cap_rx_chainmask;
5401 rate_cap_tx_chainmask = ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift;
5402 rate_cap_rx_chainmask = ar->cfg_rx_chainmask >> cap->rx_chain_mask_shift;
5404 if (cap->supported_bands & WMI_HOST_WLAN_2G_CAP) {
5405 band = &ar->mac.sbands[NL80211_BAND_2GHZ];
5406 ht_cap = cap->band[NL80211_BAND_2GHZ].ht_cap_info;
5408 *ht_cap_info = ht_cap;
5409 band->ht_cap = ath11k_create_ht_cap(ar, ht_cap,
5410 rate_cap_rx_chainmask);
5413 if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP &&
5414 (ar->ab->hw_params.single_pdev_only ||
5415 !ar->supports_6ghz)) {
5416 band = &ar->mac.sbands[NL80211_BAND_5GHZ];
5417 ht_cap = cap->band[NL80211_BAND_5GHZ].ht_cap_info;
5419 *ht_cap_info = ht_cap;
5420 band->ht_cap = ath11k_create_ht_cap(ar, ht_cap,
5421 rate_cap_rx_chainmask);
5422 band->vht_cap = ath11k_create_vht_cap(ar, rate_cap_tx_chainmask,
5423 rate_cap_rx_chainmask);
5427 static int ath11k_check_chain_mask(struct ath11k *ar, u32 ant, bool is_tx_ant)
5429 /* TODO: Check the request chainmask against the supported
5430 * chainmask table which is advertised in extented_service_ready event
5436 static void ath11k_gen_ppe_thresh(struct ath11k_ppe_threshold *fw_ppet,
5442 he_ppet[0] = fw_ppet->numss_m1 & IEEE80211_PPE_THRES_NSS_MASK;
5443 he_ppet[0] |= (fw_ppet->ru_bit_mask <<
5444 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_POS) &
5445 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK;
5446 for (nss = 0; nss <= fw_ppet->numss_m1; nss++) {
5447 for (ru = 0; ru < 4; ru++) {
5451 if ((fw_ppet->ru_bit_mask & BIT(ru)) == 0)
5453 val = (fw_ppet->ppet16_ppet8_ru3_ru0[nss] >> (ru * 6)) &
5455 val = ((val >> 3) & 0x7) | ((val & 0x7) << 3);
5456 for (i = 5; i >= 0; i--) {
5458 ((val >> i) & 0x1) << ((bit % 8));
5466 ath11k_mac_filter_he_cap_mesh(struct ieee80211_he_cap_elem *he_cap_elem)
5470 m = IEEE80211_HE_MAC_CAP0_TWT_RES |
5471 IEEE80211_HE_MAC_CAP0_TWT_REQ;
5472 he_cap_elem->mac_cap_info[0] &= ~m;
5474 m = IEEE80211_HE_MAC_CAP2_TRS |
5475 IEEE80211_HE_MAC_CAP2_BCAST_TWT |
5476 IEEE80211_HE_MAC_CAP2_MU_CASCADING;
5477 he_cap_elem->mac_cap_info[2] &= ~m;
5479 m = IEEE80211_HE_MAC_CAP3_FLEX_TWT_SCHED |
5480 IEEE80211_HE_MAC_CAP2_BCAST_TWT |
5481 IEEE80211_HE_MAC_CAP2_MU_CASCADING;
5482 he_cap_elem->mac_cap_info[3] &= ~m;
5484 m = IEEE80211_HE_MAC_CAP4_BSRP_BQRP_A_MPDU_AGG |
5485 IEEE80211_HE_MAC_CAP4_BQR;
5486 he_cap_elem->mac_cap_info[4] &= ~m;
5488 m = IEEE80211_HE_MAC_CAP5_SUBCHAN_SELECTIVE_TRANSMISSION |
5489 IEEE80211_HE_MAC_CAP5_UL_2x996_TONE_RU |
5490 IEEE80211_HE_MAC_CAP5_PUNCTURED_SOUNDING |
5491 IEEE80211_HE_MAC_CAP5_HT_VHT_TRIG_FRAME_RX;
5492 he_cap_elem->mac_cap_info[5] &= ~m;
5494 m = IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO |
5495 IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO;
5496 he_cap_elem->phy_cap_info[2] &= ~m;
5498 m = IEEE80211_HE_PHY_CAP3_RX_PARTIAL_BW_SU_IN_20MHZ_MU |
5499 IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK |
5500 IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_MASK;
5501 he_cap_elem->phy_cap_info[3] &= ~m;
5503 m = IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER;
5504 he_cap_elem->phy_cap_info[4] &= ~m;
5506 m = IEEE80211_HE_PHY_CAP5_NG16_MU_FEEDBACK;
5507 he_cap_elem->phy_cap_info[5] &= ~m;
5509 m = IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_75_MU |
5510 IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB |
5511 IEEE80211_HE_PHY_CAP6_TRIG_CQI_FB |
5512 IEEE80211_HE_PHY_CAP6_PARTIAL_BANDWIDTH_DL_MUMIMO;
5513 he_cap_elem->phy_cap_info[6] &= ~m;
5515 m = IEEE80211_HE_PHY_CAP7_PSR_BASED_SR |
5516 IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_SUPP |
5517 IEEE80211_HE_PHY_CAP7_STBC_TX_ABOVE_80MHZ |
5518 IEEE80211_HE_PHY_CAP7_STBC_RX_ABOVE_80MHZ;
5519 he_cap_elem->phy_cap_info[7] &= ~m;
5521 m = IEEE80211_HE_PHY_CAP8_HE_ER_SU_PPDU_4XLTF_AND_08_US_GI |
5522 IEEE80211_HE_PHY_CAP8_20MHZ_IN_40MHZ_HE_PPDU_IN_2G |
5523 IEEE80211_HE_PHY_CAP8_20MHZ_IN_160MHZ_HE_PPDU |
5524 IEEE80211_HE_PHY_CAP8_80MHZ_IN_160MHZ_HE_PPDU;
5525 he_cap_elem->phy_cap_info[8] &= ~m;
5527 m = IEEE80211_HE_PHY_CAP9_LONGER_THAN_16_SIGB_OFDM_SYM |
5528 IEEE80211_HE_PHY_CAP9_NON_TRIGGERED_CQI_FEEDBACK |
5529 IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU |
5530 IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU |
5531 IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_COMP_SIGB |
5532 IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_NON_COMP_SIGB;
5533 he_cap_elem->phy_cap_info[9] &= ~m;
5536 static __le16 ath11k_mac_setup_he_6ghz_cap(struct ath11k_pdev_cap *pcap,
5537 struct ath11k_band_cap *bcap)
5541 bcap->he_6ghz_capa = IEEE80211_HT_MPDU_DENSITY_NONE;
5542 if (bcap->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS)
5543 bcap->he_6ghz_capa |=
5544 FIELD_PREP(IEEE80211_HE_6GHZ_CAP_SM_PS,
5545 WLAN_HT_CAP_SM_PS_DYNAMIC);
5547 bcap->he_6ghz_capa |=
5548 FIELD_PREP(IEEE80211_HE_6GHZ_CAP_SM_PS,
5549 WLAN_HT_CAP_SM_PS_DISABLED);
5550 val = FIELD_GET(IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK,
5552 bcap->he_6ghz_capa |=
5553 FIELD_PREP(IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP, val);
5554 val = FIELD_GET(IEEE80211_VHT_CAP_MAX_MPDU_MASK, pcap->vht_cap);
5555 bcap->he_6ghz_capa |=
5556 FIELD_PREP(IEEE80211_HE_6GHZ_CAP_MAX_MPDU_LEN, val);
5557 if (pcap->vht_cap & IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN)
5558 bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_RX_ANTPAT_CONS;
5559 if (pcap->vht_cap & IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN)
5560 bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_TX_ANTPAT_CONS;
5562 return cpu_to_le16(bcap->he_6ghz_capa);
5565 static void ath11k_mac_set_hemcsmap(struct ath11k *ar,
5566 struct ath11k_pdev_cap *cap,
5567 struct ieee80211_sta_he_cap *he_cap,
5570 u16 txmcs_map, rxmcs_map;
5575 for (i = 0; i < 8; i++) {
5576 if (i < ar->num_tx_chains &&
5577 (ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift) & BIT(i))
5578 txmcs_map |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2);
5580 txmcs_map |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2);
5582 if (i < ar->num_rx_chains &&
5583 (ar->cfg_rx_chainmask >> cap->tx_chain_mask_shift) & BIT(i))
5584 rxmcs_map |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2);
5586 rxmcs_map |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2);
5588 he_cap->he_mcs_nss_supp.rx_mcs_80 =
5589 cpu_to_le16(rxmcs_map & 0xffff);
5590 he_cap->he_mcs_nss_supp.tx_mcs_80 =
5591 cpu_to_le16(txmcs_map & 0xffff);
5592 he_cap->he_mcs_nss_supp.rx_mcs_160 =
5593 cpu_to_le16(rxmcs_map & 0xffff);
5594 he_cap->he_mcs_nss_supp.tx_mcs_160 =
5595 cpu_to_le16(txmcs_map & 0xffff);
5596 he_cap->he_mcs_nss_supp.rx_mcs_80p80 =
5597 cpu_to_le16(rxmcs_map & 0xffff);
5598 he_cap->he_mcs_nss_supp.tx_mcs_80p80 =
5599 cpu_to_le16(txmcs_map & 0xffff);
5602 static int ath11k_mac_copy_he_cap(struct ath11k *ar,
5603 struct ath11k_pdev_cap *cap,
5604 struct ieee80211_sband_iftype_data *data,
5609 for (i = 0; i < NUM_NL80211_IFTYPES; i++) {
5610 struct ieee80211_sta_he_cap *he_cap = &data[idx].he_cap;
5611 struct ath11k_band_cap *band_cap = &cap->band[band];
5612 struct ieee80211_he_cap_elem *he_cap_elem =
5613 &he_cap->he_cap_elem;
5616 case NL80211_IFTYPE_STATION:
5617 case NL80211_IFTYPE_AP:
5618 case NL80211_IFTYPE_MESH_POINT:
5625 data[idx].types_mask = BIT(i);
5626 he_cap->has_he = true;
5627 memcpy(he_cap_elem->mac_cap_info, band_cap->he_cap_info,
5628 sizeof(he_cap_elem->mac_cap_info));
5629 memcpy(he_cap_elem->phy_cap_info, band_cap->he_cap_phy_info,
5630 sizeof(he_cap_elem->phy_cap_info));
5632 he_cap_elem->mac_cap_info[1] &=
5633 IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_MASK;
5635 he_cap_elem->phy_cap_info[5] &=
5636 ~IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK;
5637 he_cap_elem->phy_cap_info[5] |= ar->num_tx_chains - 1;
5640 case NL80211_IFTYPE_AP:
5641 he_cap_elem->phy_cap_info[3] &=
5642 ~IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK;
5643 he_cap_elem->phy_cap_info[9] |=
5644 IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU;
5646 case NL80211_IFTYPE_STATION:
5647 he_cap_elem->mac_cap_info[0] &=
5648 ~IEEE80211_HE_MAC_CAP0_TWT_RES;
5649 he_cap_elem->mac_cap_info[0] |=
5650 IEEE80211_HE_MAC_CAP0_TWT_REQ;
5651 he_cap_elem->phy_cap_info[9] |=
5652 IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU;
5654 case NL80211_IFTYPE_MESH_POINT:
5655 ath11k_mac_filter_he_cap_mesh(he_cap_elem);
5659 ath11k_mac_set_hemcsmap(ar, cap, he_cap, band);
5661 memset(he_cap->ppe_thres, 0, sizeof(he_cap->ppe_thres));
5662 if (he_cap_elem->phy_cap_info[6] &
5663 IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT)
5664 ath11k_gen_ppe_thresh(&band_cap->he_ppet,
5667 if (band == NL80211_BAND_6GHZ) {
5668 data[idx].he_6ghz_capa.capa =
5669 ath11k_mac_setup_he_6ghz_cap(cap, band_cap);
5677 static void ath11k_mac_setup_he_cap(struct ath11k *ar,
5678 struct ath11k_pdev_cap *cap)
5680 struct ieee80211_supported_band *band;
5683 if (cap->supported_bands & WMI_HOST_WLAN_2G_CAP) {
5684 count = ath11k_mac_copy_he_cap(ar, cap,
5685 ar->mac.iftype[NL80211_BAND_2GHZ],
5687 band = &ar->mac.sbands[NL80211_BAND_2GHZ];
5688 _ieee80211_set_sband_iftype_data(band,
5689 ar->mac.iftype[NL80211_BAND_2GHZ],
5693 if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP) {
5694 count = ath11k_mac_copy_he_cap(ar, cap,
5695 ar->mac.iftype[NL80211_BAND_5GHZ],
5697 band = &ar->mac.sbands[NL80211_BAND_5GHZ];
5698 _ieee80211_set_sband_iftype_data(band,
5699 ar->mac.iftype[NL80211_BAND_5GHZ],
5703 if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP &&
5704 ar->supports_6ghz) {
5705 count = ath11k_mac_copy_he_cap(ar, cap,
5706 ar->mac.iftype[NL80211_BAND_6GHZ],
5708 band = &ar->mac.sbands[NL80211_BAND_6GHZ];
5709 _ieee80211_set_sband_iftype_data(band,
5710 ar->mac.iftype[NL80211_BAND_6GHZ],
5715 static int __ath11k_set_antenna(struct ath11k *ar, u32 tx_ant, u32 rx_ant)
5719 lockdep_assert_held(&ar->conf_mutex);
5721 if (ath11k_check_chain_mask(ar, tx_ant, true))
5724 if (ath11k_check_chain_mask(ar, rx_ant, false))
5727 ar->cfg_tx_chainmask = tx_ant;
5728 ar->cfg_rx_chainmask = rx_ant;
5730 if (ar->state != ATH11K_STATE_ON &&
5731 ar->state != ATH11K_STATE_RESTARTED)
5734 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_TX_CHAIN_MASK,
5735 tx_ant, ar->pdev->pdev_id);
5737 ath11k_warn(ar->ab, "failed to set tx-chainmask: %d, req 0x%x\n",
5742 ar->num_tx_chains = get_num_chains(tx_ant);
5744 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_RX_CHAIN_MASK,
5745 rx_ant, ar->pdev->pdev_id);
5747 ath11k_warn(ar->ab, "failed to set rx-chainmask: %d, req 0x%x\n",
5752 ar->num_rx_chains = get_num_chains(rx_ant);
5754 /* Reload HT/VHT/HE capability */
5755 ath11k_mac_setup_ht_vht_cap(ar, &ar->pdev->cap, NULL);
5756 ath11k_mac_setup_he_cap(ar, &ar->pdev->cap);
5761 static void ath11k_mgmt_over_wmi_tx_drop(struct ath11k *ar, struct sk_buff *skb)
5765 ieee80211_free_txskb(ar->hw, skb);
5767 num_mgmt = atomic_dec_if_positive(&ar->num_pending_mgmt_tx);
5773 wake_up(&ar->txmgmt_empty_waitq);
5776 static void ath11k_mac_tx_mgmt_free(struct ath11k *ar, int buf_id)
5778 struct sk_buff *msdu;
5779 struct ieee80211_tx_info *info;
5781 spin_lock_bh(&ar->txmgmt_idr_lock);
5782 msdu = idr_remove(&ar->txmgmt_idr, buf_id);
5783 spin_unlock_bh(&ar->txmgmt_idr_lock);
5788 dma_unmap_single(ar->ab->dev, ATH11K_SKB_CB(msdu)->paddr, msdu->len,
5791 info = IEEE80211_SKB_CB(msdu);
5792 memset(&info->status, 0, sizeof(info->status));
5794 ath11k_mgmt_over_wmi_tx_drop(ar, msdu);
5797 int ath11k_mac_tx_mgmt_pending_free(int buf_id, void *skb, void *ctx)
5799 struct ath11k *ar = ctx;
5801 ath11k_mac_tx_mgmt_free(ar, buf_id);
5806 static int ath11k_mac_vif_txmgmt_idr_remove(int buf_id, void *skb, void *ctx)
5808 struct ieee80211_vif *vif = ctx;
5809 struct ath11k_skb_cb *skb_cb = ATH11K_SKB_CB((struct sk_buff *)skb);
5810 struct ath11k *ar = skb_cb->ar;
5812 if (skb_cb->vif == vif)
5813 ath11k_mac_tx_mgmt_free(ar, buf_id);
5818 static int ath11k_mac_mgmt_tx_wmi(struct ath11k *ar, struct ath11k_vif *arvif,
5819 struct sk_buff *skb)
5821 struct ath11k_base *ab = ar->ab;
5822 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
5823 struct ieee80211_tx_info *info;
5828 ATH11K_SKB_CB(skb)->ar = ar;
5830 spin_lock_bh(&ar->txmgmt_idr_lock);
5831 buf_id = idr_alloc(&ar->txmgmt_idr, skb, 0,
5832 ATH11K_TX_MGMT_NUM_PENDING_MAX, GFP_ATOMIC);
5833 spin_unlock_bh(&ar->txmgmt_idr_lock);
5835 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
5836 "tx mgmt frame, buf id %d\n", buf_id);
5841 info = IEEE80211_SKB_CB(skb);
5842 if (!(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP)) {
5843 if ((ieee80211_is_action(hdr->frame_control) ||
5844 ieee80211_is_deauth(hdr->frame_control) ||
5845 ieee80211_is_disassoc(hdr->frame_control)) &&
5846 ieee80211_has_protected(hdr->frame_control)) {
5847 skb_put(skb, IEEE80211_CCMP_MIC_LEN);
5851 paddr = dma_map_single(ab->dev, skb->data, skb->len, DMA_TO_DEVICE);
5852 if (dma_mapping_error(ab->dev, paddr)) {
5853 ath11k_warn(ab, "failed to DMA map mgmt Tx buffer\n");
5858 ATH11K_SKB_CB(skb)->paddr = paddr;
5860 ret = ath11k_wmi_mgmt_send(ar, arvif->vdev_id, buf_id, skb);
5862 ath11k_warn(ar->ab, "failed to send mgmt frame: %d\n", ret);
5869 dma_unmap_single(ab->dev, ATH11K_SKB_CB(skb)->paddr,
5870 skb->len, DMA_TO_DEVICE);
5872 spin_lock_bh(&ar->txmgmt_idr_lock);
5873 idr_remove(&ar->txmgmt_idr, buf_id);
5874 spin_unlock_bh(&ar->txmgmt_idr_lock);
5879 static void ath11k_mgmt_over_wmi_tx_purge(struct ath11k *ar)
5881 struct sk_buff *skb;
5883 while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL)
5884 ath11k_mgmt_over_wmi_tx_drop(ar, skb);
5887 static void ath11k_mgmt_over_wmi_tx_work(struct work_struct *work)
5889 struct ath11k *ar = container_of(work, struct ath11k, wmi_mgmt_tx_work);
5890 struct ath11k_skb_cb *skb_cb;
5891 struct ath11k_vif *arvif;
5892 struct sk_buff *skb;
5895 while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL) {
5896 skb_cb = ATH11K_SKB_CB(skb);
5898 ath11k_warn(ar->ab, "no vif found for mgmt frame\n");
5899 ath11k_mgmt_over_wmi_tx_drop(ar, skb);
5903 arvif = ath11k_vif_to_arvif(skb_cb->vif);
5904 mutex_lock(&ar->conf_mutex);
5905 if (ar->allocated_vdev_map & (1LL << arvif->vdev_id)) {
5906 ret = ath11k_mac_mgmt_tx_wmi(ar, arvif, skb);
5908 ath11k_warn(ar->ab, "failed to tx mgmt frame, vdev_id %d :%d\n",
5909 arvif->vdev_id, ret);
5910 ath11k_mgmt_over_wmi_tx_drop(ar, skb);
5912 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
5913 "tx mgmt frame, vdev_id %d\n",
5918 "dropping mgmt frame for vdev %d, is_started %d\n",
5921 ath11k_mgmt_over_wmi_tx_drop(ar, skb);
5923 mutex_unlock(&ar->conf_mutex);
5927 static int ath11k_mac_mgmt_tx(struct ath11k *ar, struct sk_buff *skb,
5930 struct sk_buff_head *q = &ar->wmi_mgmt_tx_queue;
5932 if (test_bit(ATH11K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags))
5935 /* Drop probe response packets when the pending management tx
5936 * count has reached a certain threshold, so as to prioritize
5937 * other mgmt packets like auth and assoc to be sent on time
5938 * for establishing successful connections.
5941 atomic_read(&ar->num_pending_mgmt_tx) > ATH11K_PRB_RSP_DROP_THRESHOLD) {
5943 "dropping probe response as pending queue is almost full\n");
5947 if (skb_queue_len_lockless(q) >= ATH11K_TX_MGMT_NUM_PENDING_MAX) {
5948 ath11k_warn(ar->ab, "mgmt tx queue is full\n");
5952 skb_queue_tail(q, skb);
5953 atomic_inc(&ar->num_pending_mgmt_tx);
5954 queue_work(ar->ab->workqueue_aux, &ar->wmi_mgmt_tx_work);
5959 static void ath11k_mac_op_tx(struct ieee80211_hw *hw,
5960 struct ieee80211_tx_control *control,
5961 struct sk_buff *skb)
5963 struct ath11k_skb_cb *skb_cb = ATH11K_SKB_CB(skb);
5964 struct ath11k *ar = hw->priv;
5965 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
5966 struct ieee80211_vif *vif = info->control.vif;
5967 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
5968 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
5969 struct ieee80211_key_conf *key = info->control.hw_key;
5970 struct ath11k_sta *arsta = NULL;
5971 u32 info_flags = info->flags;
5975 memset(skb_cb, 0, sizeof(*skb_cb));
5979 skb_cb->cipher = key->cipher;
5980 skb_cb->flags |= ATH11K_SKB_CIPHER_SET;
5983 if (info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP) {
5984 skb_cb->flags |= ATH11K_SKB_HW_80211_ENCAP;
5985 } else if (ieee80211_is_mgmt(hdr->frame_control)) {
5986 is_prb_rsp = ieee80211_is_probe_resp(hdr->frame_control);
5987 ret = ath11k_mac_mgmt_tx(ar, skb, is_prb_rsp);
5989 ath11k_warn(ar->ab, "failed to queue management frame %d\n",
5991 ieee80211_free_txskb(ar->hw, skb);
5997 arsta = ath11k_sta_to_arsta(control->sta);
5999 ret = ath11k_dp_tx(ar, arvif, arsta, skb);
6000 if (unlikely(ret)) {
6001 ath11k_warn(ar->ab, "failed to transmit frame %d\n", ret);
6002 ieee80211_free_txskb(ar->hw, skb);
6006 void ath11k_mac_drain_tx(struct ath11k *ar)
6008 /* make sure rcu-protected mac80211 tx path itself is drained */
6011 cancel_work_sync(&ar->wmi_mgmt_tx_work);
6012 ath11k_mgmt_over_wmi_tx_purge(ar);
6015 static int ath11k_mac_config_mon_status_default(struct ath11k *ar, bool enable)
6017 struct htt_rx_ring_tlv_filter tlv_filter = {0};
6018 struct ath11k_base *ab = ar->ab;
6023 tlv_filter = ath11k_mac_mon_status_filter_default;
6024 if (ath11k_debugfs_rx_filter(ar))
6025 tlv_filter.rx_filter = ath11k_debugfs_rx_filter(ar);
6028 for (i = 0; i < ab->hw_params.num_rxmda_per_pdev; i++) {
6029 ring_id = ar->dp.rx_mon_status_refill_ring[i].refill_buf_ring.ring_id;
6030 ret = ath11k_dp_tx_htt_rx_filter_setup(ar->ab, ring_id,
6032 HAL_RXDMA_MONITOR_STATUS,
6037 if (enable && !ar->ab->hw_params.rxdma1_enable)
6038 mod_timer(&ar->ab->mon_reap_timer, jiffies +
6039 msecs_to_jiffies(ATH11K_MON_TIMER_INTERVAL));
6044 static void ath11k_mac_wait_reconfigure(struct ath11k_base *ab)
6046 int recovery_start_count;
6051 recovery_start_count = atomic_inc_return(&ab->recovery_start_count);
6052 ath11k_dbg(ab, ATH11K_DBG_MAC, "recovery start count %d\n", recovery_start_count);
6054 if (recovery_start_count == ab->num_radios) {
6055 complete(&ab->recovery_start);
6056 ath11k_dbg(ab, ATH11K_DBG_MAC, "recovery started success\n");
6059 ath11k_dbg(ab, ATH11K_DBG_MAC, "waiting reconfigure...\n");
6061 wait_for_completion_timeout(&ab->reconfigure_complete,
6062 ATH11K_RECONFIGURE_TIMEOUT_HZ);
6065 static int ath11k_mac_op_start(struct ieee80211_hw *hw)
6067 struct ath11k *ar = hw->priv;
6068 struct ath11k_base *ab = ar->ab;
6069 struct ath11k_pdev *pdev = ar->pdev;
6072 if (ath11k_ftm_mode) {
6073 ath11k_warn(ab, "mac operations not supported in factory test mode\n");
6077 ath11k_mac_drain_tx(ar);
6078 mutex_lock(&ar->conf_mutex);
6080 switch (ar->state) {
6081 case ATH11K_STATE_OFF:
6082 ar->state = ATH11K_STATE_ON;
6084 case ATH11K_STATE_RESTARTING:
6085 ar->state = ATH11K_STATE_RESTARTED;
6086 ath11k_mac_wait_reconfigure(ab);
6088 case ATH11K_STATE_RESTARTED:
6089 case ATH11K_STATE_WEDGED:
6090 case ATH11K_STATE_ON:
6091 case ATH11K_STATE_FTM:
6097 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_PMF_QOS,
6101 ath11k_err(ar->ab, "failed to enable PMF QOS: (%d\n", ret);
6105 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_DYNAMIC_BW, 1,
6108 ath11k_err(ar->ab, "failed to enable dynamic bw: %d\n", ret);
6112 if (test_bit(WMI_TLV_SERVICE_SPOOF_MAC_SUPPORT, ar->wmi->wmi_ab->svc_map)) {
6113 ret = ath11k_wmi_scan_prob_req_oui(ar, ar->mac_addr);
6115 ath11k_err(ab, "failed to set prob req oui: %i\n", ret);
6120 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_ARP_AC_OVERRIDE,
6123 ath11k_err(ab, "failed to set ac override for ARP: %d\n",
6128 ret = ath11k_wmi_send_dfs_phyerr_offload_enable_cmd(ar, pdev->pdev_id);
6130 ath11k_err(ab, "failed to offload radar detection: %d\n",
6135 ret = ath11k_dp_tx_htt_h2t_ppdu_stats_req(ar,
6136 HTT_PPDU_STATS_TAG_DEFAULT);
6138 ath11k_err(ab, "failed to req ppdu stats: %d\n", ret);
6142 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_MESH_MCAST_ENABLE,
6146 ath11k_err(ar->ab, "failed to enable MESH MCAST ENABLE: (%d\n", ret);
6150 __ath11k_set_antenna(ar, ar->cfg_tx_chainmask, ar->cfg_rx_chainmask);
6152 /* TODO: Do we need to enable ANI? */
6154 ath11k_reg_update_chan_list(ar, false);
6156 ar->num_started_vdevs = 0;
6157 ar->num_created_vdevs = 0;
6159 ar->allocated_vdev_map = 0;
6161 /* Configure monitor status ring with default rx_filter to get rx status
6162 * such as rssi, rx_duration.
6164 ret = ath11k_mac_config_mon_status_default(ar, true);
6166 ath11k_err(ab, "failed to configure monitor status ring with default rx_filter: (%d)\n",
6171 /* Configure the hash seed for hash based reo dest ring selection */
6172 ath11k_wmi_pdev_lro_cfg(ar, ar->pdev->pdev_id);
6174 /* allow device to enter IMPS */
6175 if (ab->hw_params.idle_ps) {
6176 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_IDLE_PS_CONFIG,
6179 ath11k_err(ab, "failed to enable idle ps: %d\n", ret);
6184 mutex_unlock(&ar->conf_mutex);
6186 rcu_assign_pointer(ab->pdevs_active[ar->pdev_idx],
6187 &ab->pdevs[ar->pdev_idx]);
6192 ar->state = ATH11K_STATE_OFF;
6193 mutex_unlock(&ar->conf_mutex);
6198 static void ath11k_mac_op_stop(struct ieee80211_hw *hw)
6200 struct ath11k *ar = hw->priv;
6201 struct htt_ppdu_stats_info *ppdu_stats, *tmp;
6204 ath11k_mac_drain_tx(ar);
6206 mutex_lock(&ar->conf_mutex);
6207 ret = ath11k_mac_config_mon_status_default(ar, false);
6209 ath11k_err(ar->ab, "failed to clear rx_filter for monitor status ring: (%d)\n",
6212 clear_bit(ATH11K_CAC_RUNNING, &ar->dev_flags);
6213 ar->state = ATH11K_STATE_OFF;
6214 mutex_unlock(&ar->conf_mutex);
6216 cancel_delayed_work_sync(&ar->scan.timeout);
6217 cancel_work_sync(&ar->regd_update_work);
6218 cancel_work_sync(&ar->ab->update_11d_work);
6220 if (ar->state_11d == ATH11K_11D_PREPARING) {
6221 ar->state_11d = ATH11K_11D_IDLE;
6222 complete(&ar->completed_11d_scan);
6225 spin_lock_bh(&ar->data_lock);
6226 list_for_each_entry_safe(ppdu_stats, tmp, &ar->ppdu_stats_info, list) {
6227 list_del(&ppdu_stats->list);
6230 spin_unlock_bh(&ar->data_lock);
6232 rcu_assign_pointer(ar->ab->pdevs_active[ar->pdev_idx], NULL);
6236 atomic_set(&ar->num_pending_mgmt_tx, 0);
6239 static int ath11k_mac_setup_vdev_params_mbssid(struct ath11k_vif *arvif,
6240 u32 *flags, u32 *tx_vdev_id)
6242 struct ath11k *ar = arvif->ar;
6243 struct ath11k_vif *tx_arvif;
6244 struct ieee80211_vif *tx_vif;
6247 tx_vif = arvif->vif->mbssid_tx_vif;
6249 *flags = WMI_HOST_VDEV_FLAGS_NON_MBSSID_AP;
6253 tx_arvif = ath11k_vif_to_arvif(tx_vif);
6255 if (arvif->vif->bss_conf.nontransmitted) {
6256 if (ar->hw->wiphy != ieee80211_vif_to_wdev(tx_vif)->wiphy)
6259 *flags = WMI_HOST_VDEV_FLAGS_NON_TRANSMIT_AP;
6260 *tx_vdev_id = ath11k_vif_to_arvif(tx_vif)->vdev_id;
6261 } else if (tx_arvif == arvif) {
6262 *flags = WMI_HOST_VDEV_FLAGS_TRANSMIT_AP;
6267 if (arvif->vif->bss_conf.ema_ap)
6268 *flags |= WMI_HOST_VDEV_FLAGS_EMA_MODE;
6273 static int ath11k_mac_setup_vdev_create_params(struct ath11k_vif *arvif,
6274 struct vdev_create_params *params)
6276 struct ath11k *ar = arvif->ar;
6277 struct ath11k_pdev *pdev = ar->pdev;
6280 params->if_id = arvif->vdev_id;
6281 params->type = arvif->vdev_type;
6282 params->subtype = arvif->vdev_subtype;
6283 params->pdev_id = pdev->pdev_id;
6284 params->mbssid_flags = 0;
6285 params->mbssid_tx_vdev_id = 0;
6287 if (!test_bit(WMI_TLV_SERVICE_MBSS_PARAM_IN_VDEV_START_SUPPORT,
6288 ar->ab->wmi_ab.svc_map)) {
6289 ret = ath11k_mac_setup_vdev_params_mbssid(arvif,
6290 ¶ms->mbssid_flags,
6291 ¶ms->mbssid_tx_vdev_id);
6296 if (pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) {
6297 params->chains[NL80211_BAND_2GHZ].tx = ar->num_tx_chains;
6298 params->chains[NL80211_BAND_2GHZ].rx = ar->num_rx_chains;
6300 if (pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) {
6301 params->chains[NL80211_BAND_5GHZ].tx = ar->num_tx_chains;
6302 params->chains[NL80211_BAND_5GHZ].rx = ar->num_rx_chains;
6304 if (pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP &&
6305 ar->supports_6ghz) {
6306 params->chains[NL80211_BAND_6GHZ].tx = ar->num_tx_chains;
6307 params->chains[NL80211_BAND_6GHZ].rx = ar->num_rx_chains;
6312 static void ath11k_mac_op_update_vif_offload(struct ieee80211_hw *hw,
6313 struct ieee80211_vif *vif)
6315 struct ath11k *ar = hw->priv;
6316 struct ath11k_base *ab = ar->ab;
6317 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
6318 u32 param_id, param_value;
6321 param_id = WMI_VDEV_PARAM_TX_ENCAP_TYPE;
6322 if (ath11k_frame_mode != ATH11K_HW_TXRX_ETHERNET ||
6323 (vif->type != NL80211_IFTYPE_STATION &&
6324 vif->type != NL80211_IFTYPE_AP))
6325 vif->offload_flags &= ~(IEEE80211_OFFLOAD_ENCAP_ENABLED |
6326 IEEE80211_OFFLOAD_DECAP_ENABLED);
6328 if (vif->offload_flags & IEEE80211_OFFLOAD_ENCAP_ENABLED)
6329 param_value = ATH11K_HW_TXRX_ETHERNET;
6330 else if (test_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags))
6331 param_value = ATH11K_HW_TXRX_RAW;
6333 param_value = ATH11K_HW_TXRX_NATIVE_WIFI;
6335 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
6336 param_id, param_value);
6338 ath11k_warn(ab, "failed to set vdev %d tx encap mode: %d\n",
6339 arvif->vdev_id, ret);
6340 vif->offload_flags &= ~IEEE80211_OFFLOAD_ENCAP_ENABLED;
6343 param_id = WMI_VDEV_PARAM_RX_DECAP_TYPE;
6344 if (vif->offload_flags & IEEE80211_OFFLOAD_DECAP_ENABLED)
6345 param_value = ATH11K_HW_TXRX_ETHERNET;
6346 else if (test_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags))
6347 param_value = ATH11K_HW_TXRX_RAW;
6349 param_value = ATH11K_HW_TXRX_NATIVE_WIFI;
6351 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
6352 param_id, param_value);
6354 ath11k_warn(ab, "failed to set vdev %d rx decap mode: %d\n",
6355 arvif->vdev_id, ret);
6356 vif->offload_flags &= ~IEEE80211_OFFLOAD_DECAP_ENABLED;
6360 static bool ath11k_mac_vif_ap_active_any(struct ath11k_base *ab)
6363 struct ath11k_pdev *pdev;
6364 struct ath11k_vif *arvif;
6367 for (i = 0; i < ab->num_radios; i++) {
6368 pdev = &ab->pdevs[i];
6370 list_for_each_entry(arvif, &ar->arvifs, list) {
6371 if (arvif->is_up && arvif->vdev_type == WMI_VDEV_TYPE_AP)
6378 void ath11k_mac_11d_scan_start(struct ath11k *ar, u32 vdev_id)
6380 struct wmi_11d_scan_start_params param;
6383 mutex_lock(&ar->ab->vdev_id_11d_lock);
6385 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev id for 11d scan %d\n",
6386 ar->vdev_id_11d_scan);
6388 if (ar->regdom_set_by_user)
6391 if (ar->vdev_id_11d_scan != ATH11K_11D_INVALID_VDEV_ID)
6394 if (!test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map))
6397 if (ath11k_mac_vif_ap_active_any(ar->ab))
6400 param.vdev_id = vdev_id;
6401 param.start_interval_msec = 0;
6402 param.scan_period_msec = ATH11K_SCAN_11D_INTERVAL;
6404 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "start 11d scan\n");
6406 ret = ath11k_wmi_send_11d_scan_start_cmd(ar, ¶m);
6408 ath11k_warn(ar->ab, "failed to start 11d scan vdev %d ret: %d\n",
6411 ar->vdev_id_11d_scan = vdev_id;
6412 if (ar->state_11d == ATH11K_11D_PREPARING)
6413 ar->state_11d = ATH11K_11D_RUNNING;
6417 if (ar->state_11d == ATH11K_11D_PREPARING) {
6418 ar->state_11d = ATH11K_11D_IDLE;
6419 complete(&ar->completed_11d_scan);
6422 mutex_unlock(&ar->ab->vdev_id_11d_lock);
6425 void ath11k_mac_11d_scan_stop(struct ath11k *ar)
6430 if (!test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map))
6433 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "stop 11d scan\n");
6435 mutex_lock(&ar->ab->vdev_id_11d_lock);
6437 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "stop 11d vdev id %d\n",
6438 ar->vdev_id_11d_scan);
6440 if (ar->state_11d == ATH11K_11D_PREPARING) {
6441 ar->state_11d = ATH11K_11D_IDLE;
6442 complete(&ar->completed_11d_scan);
6445 if (ar->vdev_id_11d_scan != ATH11K_11D_INVALID_VDEV_ID) {
6446 vdev_id = ar->vdev_id_11d_scan;
6448 ret = ath11k_wmi_send_11d_scan_stop_cmd(ar, vdev_id);
6451 "failed to stopt 11d scan vdev %d ret: %d\n",
6454 ar->vdev_id_11d_scan = ATH11K_11D_INVALID_VDEV_ID;
6455 ar->state_11d = ATH11K_11D_IDLE;
6456 complete(&ar->completed_11d_scan);
6459 mutex_unlock(&ar->ab->vdev_id_11d_lock);
6462 void ath11k_mac_11d_scan_stop_all(struct ath11k_base *ab)
6465 struct ath11k_pdev *pdev;
6468 ath11k_dbg(ab, ATH11K_DBG_MAC, "stop soc 11d scan\n");
6470 for (i = 0; i < ab->num_radios; i++) {
6471 pdev = &ab->pdevs[i];
6474 ath11k_mac_11d_scan_stop(ar);
6478 static int ath11k_mac_vdev_delete(struct ath11k *ar, struct ath11k_vif *arvif)
6480 unsigned long time_left;
6481 struct ieee80211_vif *vif = arvif->vif;
6484 lockdep_assert_held(&ar->conf_mutex);
6486 reinit_completion(&ar->vdev_delete_done);
6488 ret = ath11k_wmi_vdev_delete(ar, arvif->vdev_id);
6490 ath11k_warn(ar->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(ar->ab, "Timeout in receiving vdev delete response\n");
6502 ar->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(ar->ab, ATH11K_DBG_MAC, "vdev %pM deleted, vdev_id %d\n",
6507 vif->addr, arvif->vdev_id);
6512 static int ath11k_mac_op_add_interface(struct ieee80211_hw *hw,
6513 struct ieee80211_vif *vif)
6515 struct ath11k *ar = hw->priv;
6516 struct ath11k_base *ab = ar->ab;
6517 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
6518 struct vdev_create_params vdev_param = {0};
6519 struct peer_create_params peer_param;
6520 u32 param_id, param_value;
6526 vif->driver_flags |= IEEE80211_VIF_SUPPORTS_UAPSD;
6528 mutex_lock(&ar->conf_mutex);
6530 if (vif->type == NL80211_IFTYPE_AP &&
6531 ar->num_peers > (ar->max_num_peers - 1)) {
6532 ath11k_warn(ab, "failed to create vdev due to insufficient peer entry resource in firmware\n");
6537 if (ar->num_created_vdevs > (TARGET_NUM_VDEVS(ab) - 1)) {
6538 ath11k_warn(ab, "failed to create vdev %u, reached max vdev limit %d\n",
6539 ar->num_created_vdevs, TARGET_NUM_VDEVS(ab));
6544 memset(arvif, 0, sizeof(*arvif));
6549 INIT_LIST_HEAD(&arvif->list);
6550 INIT_DELAYED_WORK(&arvif->connection_loss_work,
6551 ath11k_mac_vif_sta_connection_loss_work);
6553 for (i = 0; i < ARRAY_SIZE(arvif->bitrate_mask.control); i++) {
6554 arvif->bitrate_mask.control[i].legacy = 0xffffffff;
6555 arvif->bitrate_mask.control[i].gi = NL80211_TXRATE_FORCE_SGI;
6556 memset(arvif->bitrate_mask.control[i].ht_mcs, 0xff,
6557 sizeof(arvif->bitrate_mask.control[i].ht_mcs));
6558 memset(arvif->bitrate_mask.control[i].vht_mcs, 0xff,
6559 sizeof(arvif->bitrate_mask.control[i].vht_mcs));
6560 memset(arvif->bitrate_mask.control[i].he_mcs, 0xff,
6561 sizeof(arvif->bitrate_mask.control[i].he_mcs));
6564 bit = __ffs64(ab->free_vdev_map);
6566 arvif->vdev_id = bit;
6567 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE;
6569 switch (vif->type) {
6570 case NL80211_IFTYPE_UNSPECIFIED:
6571 case NL80211_IFTYPE_STATION:
6572 arvif->vdev_type = WMI_VDEV_TYPE_STA;
6574 case NL80211_IFTYPE_MESH_POINT:
6575 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_MESH_11S;
6577 case NL80211_IFTYPE_AP:
6578 arvif->vdev_type = WMI_VDEV_TYPE_AP;
6580 case NL80211_IFTYPE_MONITOR:
6581 arvif->vdev_type = WMI_VDEV_TYPE_MONITOR;
6582 ar->monitor_vdev_id = bit;
6589 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "add interface id %d type %d subtype %d map %llx\n",
6590 arvif->vdev_id, arvif->vdev_type, arvif->vdev_subtype,
6593 vif->cab_queue = arvif->vdev_id % (ATH11K_HW_MAX_QUEUES - 1);
6594 for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++)
6595 vif->hw_queue[i] = i % (ATH11K_HW_MAX_QUEUES - 1);
6597 ret = ath11k_mac_setup_vdev_create_params(arvif, &vdev_param);
6599 ath11k_warn(ab, "failed to create vdev parameters %d: %d\n",
6600 arvif->vdev_id, ret);
6604 ret = ath11k_wmi_vdev_create(ar, vif->addr, &vdev_param);
6606 ath11k_warn(ab, "failed to create WMI vdev %d: %d\n",
6607 arvif->vdev_id, ret);
6611 ar->num_created_vdevs++;
6612 ath11k_dbg(ab, ATH11K_DBG_MAC, "vdev %pM created, vdev_id %d\n",
6613 vif->addr, arvif->vdev_id);
6614 ar->allocated_vdev_map |= 1LL << arvif->vdev_id;
6615 ab->free_vdev_map &= ~(1LL << arvif->vdev_id);
6617 spin_lock_bh(&ar->data_lock);
6618 list_add(&arvif->list, &ar->arvifs);
6619 spin_unlock_bh(&ar->data_lock);
6621 ath11k_mac_op_update_vif_offload(hw, vif);
6623 nss = get_num_chains(ar->cfg_tx_chainmask) ? : 1;
6624 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
6625 WMI_VDEV_PARAM_NSS, nss);
6627 ath11k_warn(ab, "failed to set vdev %d chainmask 0x%x, nss %d :%d\n",
6628 arvif->vdev_id, ar->cfg_tx_chainmask, nss, ret);
6632 switch (arvif->vdev_type) {
6633 case WMI_VDEV_TYPE_AP:
6634 peer_param.vdev_id = arvif->vdev_id;
6635 peer_param.peer_addr = vif->addr;
6636 peer_param.peer_type = WMI_PEER_TYPE_DEFAULT;
6637 ret = ath11k_peer_create(ar, arvif, NULL, &peer_param);
6639 ath11k_warn(ab, "failed to vdev %d create peer for AP: %d\n",
6640 arvif->vdev_id, ret);
6644 ret = ath11k_mac_set_kickout(arvif);
6646 ath11k_warn(ar->ab, "failed to set vdev %i kickout parameters: %d\n",
6647 arvif->vdev_id, ret);
6651 ath11k_mac_11d_scan_stop_all(ar->ab);
6653 case WMI_VDEV_TYPE_STA:
6654 param_id = WMI_STA_PS_PARAM_RX_WAKE_POLICY;
6655 param_value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
6656 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
6657 param_id, param_value);
6659 ath11k_warn(ar->ab, "failed to set vdev %d RX wake policy: %d\n",
6660 arvif->vdev_id, ret);
6664 param_id = WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD;
6665 param_value = WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS;
6666 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
6667 param_id, param_value);
6669 ath11k_warn(ar->ab, "failed to set vdev %d TX wake threshold: %d\n",
6670 arvif->vdev_id, ret);
6674 param_id = WMI_STA_PS_PARAM_PSPOLL_COUNT;
6675 param_value = WMI_STA_PS_PSPOLL_COUNT_NO_MAX;
6676 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
6677 param_id, param_value);
6679 ath11k_warn(ar->ab, "failed to set vdev %d pspoll count: %d\n",
6680 arvif->vdev_id, ret);
6684 ret = ath11k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id,
6685 WMI_STA_PS_MODE_DISABLED);
6687 ath11k_warn(ar->ab, "failed to disable vdev %d ps mode: %d\n",
6688 arvif->vdev_id, ret);
6692 if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ab->wmi_ab.svc_map)) {
6693 reinit_completion(&ar->completed_11d_scan);
6694 ar->state_11d = ATH11K_11D_PREPARING;
6697 case WMI_VDEV_TYPE_MONITOR:
6698 set_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags);
6704 arvif->txpower = vif->bss_conf.txpower;
6705 ret = ath11k_mac_txpower_recalc(ar);
6709 param_id = WMI_VDEV_PARAM_RTS_THRESHOLD;
6710 param_value = ar->hw->wiphy->rts_threshold;
6711 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
6712 param_id, param_value);
6714 ath11k_warn(ar->ab, "failed to set rts threshold for vdev %d: %d\n",
6715 arvif->vdev_id, ret);
6718 ath11k_dp_vdev_tx_attach(ar, arvif);
6720 if (vif->type != NL80211_IFTYPE_MONITOR &&
6721 test_bit(ATH11K_FLAG_MONITOR_CONF_ENABLED, &ar->monitor_flags)) {
6722 ret = ath11k_mac_monitor_vdev_create(ar);
6724 ath11k_warn(ar->ab, "failed to create monitor vdev during add interface: %d",
6728 if (ath11k_wmi_supports_6ghz_cc_ext(ar)) {
6729 struct cur_regulatory_info *reg_info;
6731 reg_info = &ab->reg_info_store[ar->pdev_idx];
6732 ath11k_dbg(ab, ATH11K_DBG_MAC, "interface added to change reg rules\n");
6733 ath11k_reg_handle_chan_list(ab, reg_info, IEEE80211_REG_LPI_AP);
6736 mutex_unlock(&ar->conf_mutex);
6741 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
6742 fbret = ath11k_peer_delete(ar, arvif->vdev_id, vif->addr);
6744 ath11k_warn(ar->ab, "fallback fail to delete peer addr %pM vdev_id %d ret %d\n",
6745 vif->addr, arvif->vdev_id, fbret);
6751 ath11k_mac_vdev_delete(ar, arvif);
6752 spin_lock_bh(&ar->data_lock);
6753 list_del(&arvif->list);
6754 spin_unlock_bh(&ar->data_lock);
6757 mutex_unlock(&ar->conf_mutex);
6762 static int ath11k_mac_vif_unref(int buf_id, void *skb, void *ctx)
6764 struct ieee80211_vif *vif = ctx;
6765 struct ath11k_skb_cb *skb_cb = ATH11K_SKB_CB(skb);
6767 if (skb_cb->vif == vif)
6773 static void ath11k_mac_op_remove_interface(struct ieee80211_hw *hw,
6774 struct ieee80211_vif *vif)
6776 struct ath11k *ar = hw->priv;
6777 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
6778 struct ath11k_base *ab = ar->ab;
6782 cancel_delayed_work_sync(&arvif->connection_loss_work);
6784 mutex_lock(&ar->conf_mutex);
6786 ath11k_dbg(ab, ATH11K_DBG_MAC, "remove interface (vdev %d)\n",
6789 ret = ath11k_spectral_vif_stop(arvif);
6791 ath11k_warn(ab, "failed to stop spectral for vdev %i: %d\n",
6792 arvif->vdev_id, ret);
6794 if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
6795 ath11k_mac_11d_scan_stop(ar);
6797 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
6798 ret = ath11k_peer_delete(ar, arvif->vdev_id, vif->addr);
6800 ath11k_warn(ab, "failed to submit AP self-peer removal on vdev %d: %d\n",
6801 arvif->vdev_id, ret);
6804 ret = ath11k_mac_vdev_delete(ar, arvif);
6806 ath11k_warn(ab, "failed to delete vdev %d: %d\n",
6807 arvif->vdev_id, ret);
6811 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
6812 clear_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags);
6813 ar->monitor_vdev_id = -1;
6814 } else if (test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags) &&
6815 !test_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags)) {
6816 ret = ath11k_mac_monitor_vdev_delete(ar);
6818 /* continue even if there's an error */
6819 ath11k_warn(ar->ab, "failed to delete vdev monitor during remove interface: %d",
6824 spin_lock_bh(&ar->data_lock);
6825 list_del(&arvif->list);
6826 spin_unlock_bh(&ar->data_lock);
6828 ath11k_peer_cleanup(ar, arvif->vdev_id);
6830 idr_for_each(&ar->txmgmt_idr,
6831 ath11k_mac_vif_txmgmt_idr_remove, vif);
6833 for (i = 0; i < ab->hw_params.max_tx_ring; i++) {
6834 spin_lock_bh(&ab->dp.tx_ring[i].tx_idr_lock);
6835 idr_for_each(&ab->dp.tx_ring[i].txbuf_idr,
6836 ath11k_mac_vif_unref, vif);
6837 spin_unlock_bh(&ab->dp.tx_ring[i].tx_idr_lock);
6840 /* Recalc txpower for remaining vdev */
6841 ath11k_mac_txpower_recalc(ar);
6843 /* TODO: recal traffic pause state based on the available vdevs */
6845 mutex_unlock(&ar->conf_mutex);
6848 /* FIXME: Has to be verified. */
6849 #define SUPPORTED_FILTERS \
6854 FIF_BCN_PRBRESP_PROMISC | \
6858 static void ath11k_mac_op_configure_filter(struct ieee80211_hw *hw,
6859 unsigned int changed_flags,
6860 unsigned int *total_flags,
6863 struct ath11k *ar = hw->priv;
6865 mutex_lock(&ar->conf_mutex);
6867 *total_flags &= SUPPORTED_FILTERS;
6868 ar->filter_flags = *total_flags;
6870 mutex_unlock(&ar->conf_mutex);
6873 static int ath11k_mac_op_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant)
6875 struct ath11k *ar = hw->priv;
6877 mutex_lock(&ar->conf_mutex);
6879 *tx_ant = ar->cfg_tx_chainmask;
6880 *rx_ant = ar->cfg_rx_chainmask;
6882 mutex_unlock(&ar->conf_mutex);
6887 static int ath11k_mac_op_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)
6889 struct ath11k *ar = hw->priv;
6892 mutex_lock(&ar->conf_mutex);
6893 ret = __ath11k_set_antenna(ar, tx_ant, rx_ant);
6894 mutex_unlock(&ar->conf_mutex);
6899 static int ath11k_mac_op_ampdu_action(struct ieee80211_hw *hw,
6900 struct ieee80211_vif *vif,
6901 struct ieee80211_ampdu_params *params)
6903 struct ath11k *ar = hw->priv;
6906 mutex_lock(&ar->conf_mutex);
6908 switch (params->action) {
6909 case IEEE80211_AMPDU_RX_START:
6910 ret = ath11k_dp_rx_ampdu_start(ar, params);
6912 case IEEE80211_AMPDU_RX_STOP:
6913 ret = ath11k_dp_rx_ampdu_stop(ar, params);
6915 case IEEE80211_AMPDU_TX_START:
6916 case IEEE80211_AMPDU_TX_STOP_CONT:
6917 case IEEE80211_AMPDU_TX_STOP_FLUSH:
6918 case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
6919 case IEEE80211_AMPDU_TX_OPERATIONAL:
6920 /* Tx A-MPDU aggregation offloaded to hw/fw so deny mac80211
6921 * Tx aggregation requests.
6927 mutex_unlock(&ar->conf_mutex);
6932 static int ath11k_mac_op_add_chanctx(struct ieee80211_hw *hw,
6933 struct ieee80211_chanctx_conf *ctx)
6935 struct ath11k *ar = hw->priv;
6936 struct ath11k_base *ab = ar->ab;
6938 ath11k_dbg(ab, ATH11K_DBG_MAC,
6939 "chanctx add freq %u width %d ptr %p\n",
6940 ctx->def.chan->center_freq, ctx->def.width, ctx);
6942 mutex_lock(&ar->conf_mutex);
6944 spin_lock_bh(&ar->data_lock);
6945 /* TODO: In case of multiple channel context, populate rx_channel from
6946 * Rx PPDU desc information.
6948 ar->rx_channel = ctx->def.chan;
6949 spin_unlock_bh(&ar->data_lock);
6951 mutex_unlock(&ar->conf_mutex);
6956 static void ath11k_mac_op_remove_chanctx(struct ieee80211_hw *hw,
6957 struct ieee80211_chanctx_conf *ctx)
6959 struct ath11k *ar = hw->priv;
6960 struct ath11k_base *ab = ar->ab;
6962 ath11k_dbg(ab, ATH11K_DBG_MAC,
6963 "chanctx remove freq %u width %d ptr %p\n",
6964 ctx->def.chan->center_freq, ctx->def.width, ctx);
6966 mutex_lock(&ar->conf_mutex);
6968 spin_lock_bh(&ar->data_lock);
6969 /* TODO: In case of there is one more channel context left, populate
6970 * rx_channel with the channel of that remaining channel context.
6972 ar->rx_channel = NULL;
6973 spin_unlock_bh(&ar->data_lock);
6975 mutex_unlock(&ar->conf_mutex);
6979 ath11k_mac_vdev_start_restart(struct ath11k_vif *arvif,
6980 struct ieee80211_chanctx_conf *ctx,
6983 struct ath11k *ar = arvif->ar;
6984 struct ath11k_base *ab = ar->ab;
6985 struct wmi_vdev_start_req_arg arg = {};
6986 const struct cfg80211_chan_def *chandef = &ctx->def;
6988 unsigned int dfs_cac_time;
6990 lockdep_assert_held(&ar->conf_mutex);
6992 reinit_completion(&ar->vdev_setup_done);
6994 arg.vdev_id = arvif->vdev_id;
6995 arg.dtim_period = arvif->dtim_period;
6996 arg.bcn_intval = arvif->beacon_interval;
6998 arg.channel.freq = chandef->chan->center_freq;
6999 arg.channel.band_center_freq1 = chandef->center_freq1;
7000 arg.channel.band_center_freq2 = chandef->center_freq2;
7002 ath11k_phymodes[chandef->chan->band][chandef->width];
7004 arg.channel.min_power = 0;
7005 arg.channel.max_power = chandef->chan->max_power;
7006 arg.channel.max_reg_power = chandef->chan->max_reg_power;
7007 arg.channel.max_antenna_gain = chandef->chan->max_antenna_gain;
7009 arg.pref_tx_streams = ar->num_tx_chains;
7010 arg.pref_rx_streams = ar->num_rx_chains;
7012 arg.mbssid_flags = 0;
7013 arg.mbssid_tx_vdev_id = 0;
7014 if (test_bit(WMI_TLV_SERVICE_MBSS_PARAM_IN_VDEV_START_SUPPORT,
7015 ar->ab->wmi_ab.svc_map)) {
7016 ret = ath11k_mac_setup_vdev_params_mbssid(arvif,
7018 &arg.mbssid_tx_vdev_id);
7023 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
7024 arg.ssid = arvif->u.ap.ssid;
7025 arg.ssid_len = arvif->u.ap.ssid_len;
7026 arg.hidden_ssid = arvif->u.ap.hidden_ssid;
7028 /* For now allow DFS for AP mode */
7029 arg.channel.chan_radar =
7030 !!(chandef->chan->flags & IEEE80211_CHAN_RADAR);
7032 arg.channel.freq2_radar = ctx->radar_enabled;
7034 arg.channel.passive = arg.channel.chan_radar;
7036 spin_lock_bh(&ab->base_lock);
7037 arg.regdomain = ar->ab->dfs_region;
7038 spin_unlock_bh(&ab->base_lock);
7041 arg.channel.passive |= !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR);
7043 ath11k_dbg(ab, ATH11K_DBG_MAC,
7044 "vdev %d start center_freq %d phymode %s\n",
7045 arg.vdev_id, arg.channel.freq,
7046 ath11k_wmi_phymode_str(arg.channel.mode));
7048 ret = ath11k_wmi_vdev_start(ar, &arg, restart);
7050 ath11k_warn(ar->ab, "failed to %s WMI vdev %i\n",
7051 restart ? "restart" : "start", arg.vdev_id);
7055 ret = ath11k_mac_vdev_setup_sync(ar);
7057 ath11k_warn(ab, "failed to synchronize setup for vdev %i %s: %d\n",
7058 arg.vdev_id, restart ? "restart" : "start", ret);
7062 /* TODO: For now we only set TPC power here. However when
7063 * channel changes, say CSA, it should be updated again.
7065 if (ath11k_mac_supports_station_tpc(ar, arvif, chandef)) {
7066 ath11k_mac_fill_reg_tpc_info(ar, arvif->vif, &arvif->chanctx);
7067 ath11k_wmi_send_vdev_set_tpc_power(ar, arvif->vdev_id,
7068 &arvif->reg_tpc_info);
7072 ar->num_started_vdevs++;
7074 ath11k_dbg(ab, ATH11K_DBG_MAC, "vdev %pM started, vdev_id %d\n",
7075 arvif->vif->addr, arvif->vdev_id);
7077 /* Enable CAC Flag in the driver by checking the all sub-channel's DFS
7078 * state as NL80211_DFS_USABLE which indicates CAC needs to be
7079 * done before channel usage. This flags is used to drop rx packets.
7082 /* TODO Set the flag for other interface types as required */
7083 if (arvif->vdev_type == WMI_VDEV_TYPE_AP && ctx->radar_enabled &&
7084 cfg80211_chandef_dfs_usable(ar->hw->wiphy, chandef)) {
7085 set_bit(ATH11K_CAC_RUNNING, &ar->dev_flags);
7086 dfs_cac_time = cfg80211_chandef_dfs_cac_time(ar->hw->wiphy,
7088 ath11k_dbg(ab, ATH11K_DBG_MAC,
7089 "cac started dfs_cac_time %u center_freq %d center_freq1 %d for vdev %d\n",
7090 dfs_cac_time, arg.channel.freq, chandef->center_freq1,
7094 ret = ath11k_mac_set_txbf_conf(arvif);
7096 ath11k_warn(ab, "failed to set txbf conf for vdev %d: %d\n",
7097 arvif->vdev_id, ret);
7102 static int ath11k_mac_vdev_stop(struct ath11k_vif *arvif)
7104 struct ath11k *ar = arvif->ar;
7107 lockdep_assert_held(&ar->conf_mutex);
7109 reinit_completion(&ar->vdev_setup_done);
7111 ret = ath11k_wmi_vdev_stop(ar, arvif->vdev_id);
7113 ath11k_warn(ar->ab, "failed to stop WMI vdev %i: %d\n",
7114 arvif->vdev_id, ret);
7118 ret = ath11k_mac_vdev_setup_sync(ar);
7120 ath11k_warn(ar->ab, "failed to synchronize setup for vdev %i: %d\n",
7121 arvif->vdev_id, ret);
7125 WARN_ON(ar->num_started_vdevs == 0);
7127 ar->num_started_vdevs--;
7128 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %pM stopped, vdev_id %d\n",
7129 arvif->vif->addr, arvif->vdev_id);
7131 if (test_bit(ATH11K_CAC_RUNNING, &ar->dev_flags)) {
7132 clear_bit(ATH11K_CAC_RUNNING, &ar->dev_flags);
7133 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "CAC Stopped for vdev %d\n",
7142 static int ath11k_mac_vdev_start(struct ath11k_vif *arvif,
7143 struct ieee80211_chanctx_conf *ctx)
7145 return ath11k_mac_vdev_start_restart(arvif, ctx, false);
7148 static int ath11k_mac_vdev_restart(struct ath11k_vif *arvif,
7149 struct ieee80211_chanctx_conf *ctx)
7151 return ath11k_mac_vdev_start_restart(arvif, ctx, true);
7154 struct ath11k_mac_change_chanctx_arg {
7155 struct ieee80211_chanctx_conf *ctx;
7156 struct ieee80211_vif_chanctx_switch *vifs;
7162 ath11k_mac_change_chanctx_cnt_iter(void *data, u8 *mac,
7163 struct ieee80211_vif *vif)
7165 struct ath11k_mac_change_chanctx_arg *arg = data;
7167 if (rcu_access_pointer(vif->bss_conf.chanctx_conf) != arg->ctx)
7174 ath11k_mac_change_chanctx_fill_iter(void *data, u8 *mac,
7175 struct ieee80211_vif *vif)
7177 struct ath11k_mac_change_chanctx_arg *arg = data;
7178 struct ieee80211_chanctx_conf *ctx;
7180 ctx = rcu_access_pointer(vif->bss_conf.chanctx_conf);
7181 if (ctx != arg->ctx)
7184 if (WARN_ON(arg->next_vif == arg->n_vifs))
7187 arg->vifs[arg->next_vif].vif = vif;
7188 arg->vifs[arg->next_vif].old_ctx = ctx;
7189 arg->vifs[arg->next_vif].new_ctx = ctx;
7194 ath11k_mac_update_vif_chan(struct ath11k *ar,
7195 struct ieee80211_vif_chanctx_switch *vifs,
7198 struct ath11k_base *ab = ar->ab;
7199 struct ath11k_vif *arvif, *tx_arvif = NULL;
7200 struct ieee80211_vif *mbssid_tx_vif;
7203 bool monitor_vif = false;
7205 lockdep_assert_held(&ar->conf_mutex);
7207 /* Associated channel resources of all relevant vdevs
7208 * should be available for the channel switch now.
7211 /* TODO: Update ar->rx_channel */
7213 for (i = 0; i < n_vifs; i++) {
7214 arvif = ath11k_vif_to_arvif(vifs[i].vif);
7216 if (WARN_ON(!arvif->is_started))
7219 /* change_chanctx can be called even before vdev_up from
7220 * ieee80211_start_ap->ieee80211_vif_use_channel->
7221 * ieee80211_recalc_radar_chanctx.
7223 * Firmware expect vdev_restart only if vdev is up.
7224 * If vdev is down then it expect vdev_stop->vdev_start.
7227 ret = ath11k_mac_vdev_restart(arvif, vifs[i].new_ctx);
7229 ath11k_warn(ab, "failed to restart vdev %d: %d\n",
7230 arvif->vdev_id, ret);
7234 ret = ath11k_mac_vdev_stop(arvif);
7236 ath11k_warn(ab, "failed to stop vdev %d: %d\n",
7237 arvif->vdev_id, ret);
7241 ret = ath11k_mac_vdev_start(arvif, vifs[i].new_ctx);
7243 ath11k_warn(ab, "failed to start vdev %d: %d\n",
7244 arvif->vdev_id, ret);
7249 ret = ath11k_mac_setup_bcn_tmpl(arvif);
7251 ath11k_warn(ab, "failed to update bcn tmpl during csa: %d\n",
7254 mbssid_tx_vif = arvif->vif->mbssid_tx_vif;
7256 tx_arvif = ath11k_vif_to_arvif(mbssid_tx_vif);
7258 ret = ath11k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
7260 tx_arvif ? tx_arvif->bssid : NULL,
7261 arvif->vif->bss_conf.bssid_index,
7262 1 << arvif->vif->bss_conf.bssid_indicator);
7264 ath11k_warn(ab, "failed to bring vdev up %d: %d\n",
7265 arvif->vdev_id, ret);
7270 /* Restart the internal monitor vdev on new channel */
7272 test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags)) {
7273 ret = ath11k_mac_monitor_stop(ar);
7275 ath11k_warn(ar->ab, "failed to stop monitor during vif channel update: %d",
7280 ret = ath11k_mac_monitor_start(ar);
7282 ath11k_warn(ar->ab, "failed to start monitor during vif channel update: %d",
7290 ath11k_mac_update_active_vif_chan(struct ath11k *ar,
7291 struct ieee80211_chanctx_conf *ctx)
7293 struct ath11k_mac_change_chanctx_arg arg = { .ctx = ctx };
7295 lockdep_assert_held(&ar->conf_mutex);
7297 ieee80211_iterate_active_interfaces_atomic(ar->hw,
7298 IEEE80211_IFACE_ITER_NORMAL,
7299 ath11k_mac_change_chanctx_cnt_iter,
7301 if (arg.n_vifs == 0)
7304 arg.vifs = kcalloc(arg.n_vifs, sizeof(arg.vifs[0]), GFP_KERNEL);
7308 ieee80211_iterate_active_interfaces_atomic(ar->hw,
7309 IEEE80211_IFACE_ITER_NORMAL,
7310 ath11k_mac_change_chanctx_fill_iter,
7313 ath11k_mac_update_vif_chan(ar, arg.vifs, arg.n_vifs);
7318 static void ath11k_mac_op_change_chanctx(struct ieee80211_hw *hw,
7319 struct ieee80211_chanctx_conf *ctx,
7322 struct ath11k *ar = hw->priv;
7323 struct ath11k_base *ab = ar->ab;
7325 mutex_lock(&ar->conf_mutex);
7327 ath11k_dbg(ab, ATH11K_DBG_MAC,
7328 "chanctx change freq %u width %d ptr %p changed %x\n",
7329 ctx->def.chan->center_freq, ctx->def.width, ctx, changed);
7331 /* This shouldn't really happen because channel switching should use
7332 * switch_vif_chanctx().
7334 if (WARN_ON(changed & IEEE80211_CHANCTX_CHANGE_CHANNEL))
7337 if (changed & IEEE80211_CHANCTX_CHANGE_WIDTH ||
7338 changed & IEEE80211_CHANCTX_CHANGE_RADAR)
7339 ath11k_mac_update_active_vif_chan(ar, ctx);
7341 /* TODO: Recalc radar detection */
7344 mutex_unlock(&ar->conf_mutex);
7347 static int ath11k_mac_start_vdev_delay(struct ieee80211_hw *hw,
7348 struct ieee80211_vif *vif)
7350 struct ath11k *ar = hw->priv;
7351 struct ath11k_base *ab = ar->ab;
7352 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
7355 if (WARN_ON(arvif->is_started))
7358 ret = ath11k_mac_vdev_start(arvif, &arvif->chanctx);
7360 ath11k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n",
7361 arvif->vdev_id, vif->addr,
7362 arvif->chanctx.def.chan->center_freq, ret);
7366 /* Reconfigure hardware rate code since it is cleared by firmware.
7368 if (ar->hw_rate_code > 0) {
7369 u32 vdev_param = WMI_VDEV_PARAM_MGMT_RATE;
7371 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param,
7374 ath11k_warn(ar->ab, "failed to set mgmt tx rate %d\n", ret);
7379 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
7380 ret = ath11k_wmi_vdev_up(ar, arvif->vdev_id, 0, ar->mac_addr,
7383 ath11k_warn(ab, "failed put monitor up: %d\n", ret);
7388 arvif->is_started = true;
7390 /* TODO: Setup ps and cts/rts protection */
7394 static int ath11k_mac_stop_vdev_early(struct ieee80211_hw *hw,
7395 struct ieee80211_vif *vif)
7397 struct ath11k *ar = hw->priv;
7398 struct ath11k_base *ab = ar->ab;
7399 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
7402 if (WARN_ON(!arvif->is_started))
7405 ret = ath11k_mac_vdev_stop(arvif);
7407 ath11k_warn(ab, "failed to stop vdev %i: %d\n",
7408 arvif->vdev_id, ret);
7412 arvif->is_started = false;
7414 /* TODO: Setup ps and cts/rts protection */
7418 static u8 ath11k_mac_get_tpe_count(u8 txpwr_intrprt, u8 txpwr_cnt)
7420 switch (txpwr_intrprt) {
7421 /* Refer "Table 9-276-Meaning of Maximum Transmit Power Count subfield
7422 * if the Maximum Transmit Power Interpretation subfield is 0 or 2" of
7423 * "IEEE Std 802.11ax 2021".
7425 case IEEE80211_TPE_LOCAL_EIRP:
7426 case IEEE80211_TPE_REG_CLIENT_EIRP:
7427 txpwr_cnt = txpwr_cnt <= 3 ? txpwr_cnt : 3;
7428 txpwr_cnt = txpwr_cnt + 1;
7430 /* Refer "Table 9-277-Meaning of Maximum Transmit Power Count subfield
7431 * if Maximum Transmit Power Interpretation subfield is 1 or 3" of
7432 * "IEEE Std 802.11ax 2021".
7434 case IEEE80211_TPE_LOCAL_EIRP_PSD:
7435 case IEEE80211_TPE_REG_CLIENT_EIRP_PSD:
7436 txpwr_cnt = txpwr_cnt <= 4 ? txpwr_cnt : 4;
7437 txpwr_cnt = txpwr_cnt ? (BIT(txpwr_cnt - 1)) : 1;
7444 static u8 ath11k_mac_get_num_pwr_levels(struct cfg80211_chan_def *chan_def)
7446 if (chan_def->chan->flags & IEEE80211_CHAN_PSD) {
7447 switch (chan_def->width) {
7448 case NL80211_CHAN_WIDTH_20:
7450 case NL80211_CHAN_WIDTH_40:
7452 case NL80211_CHAN_WIDTH_80:
7454 case NL80211_CHAN_WIDTH_80P80:
7455 case NL80211_CHAN_WIDTH_160:
7461 switch (chan_def->width) {
7462 case NL80211_CHAN_WIDTH_20:
7464 case NL80211_CHAN_WIDTH_40:
7466 case NL80211_CHAN_WIDTH_80:
7468 case NL80211_CHAN_WIDTH_80P80:
7469 case NL80211_CHAN_WIDTH_160:
7477 static u16 ath11k_mac_get_6ghz_start_frequency(struct cfg80211_chan_def *chan_def)
7481 /* It is to get the lowest channel number's center frequency of the chan.
7483 * bandwidth=40 MHz, center frequency is 5965, lowest channel is 1
7484 * with center frequency 5955, its diff is 5965 - 5955 = 10.
7485 * bandwidth=80 MHz, center frequency is 5985, lowest channel is 1
7486 * with center frequency 5955, its diff is 5985 - 5955 = 30.
7487 * bandwidth=160 MHz, center frequency is 6025, lowest channel is 1
7488 * with center frequency 5955, its diff is 6025 - 5955 = 70.
7490 switch (chan_def->width) {
7491 case NL80211_CHAN_WIDTH_160:
7494 case NL80211_CHAN_WIDTH_80:
7495 case NL80211_CHAN_WIDTH_80P80:
7498 case NL80211_CHAN_WIDTH_40:
7505 return chan_def->center_freq1 - diff_seq;
7508 static u16 ath11k_mac_get_seg_freq(struct cfg80211_chan_def *chan_def,
7509 u16 start_seq, u8 seq)
7513 /* It is to get the center frequency of the specific bandwidth.
7514 * start_seq means the lowest channel number's center frequency.
7515 * seq 0/1/2/3 means 20 MHz/40 MHz/80 MHz/160 MHz&80P80.
7517 * lowest channel is 1, its center frequency 5955,
7518 * center frequency is 5955 when bandwidth=20 MHz, its diff is 5955 - 5955 = 0.
7519 * lowest channel is 1, its center frequency 5955,
7520 * center frequency is 5965 when bandwidth=40 MHz, its diff is 5965 - 5955 = 10.
7521 * lowest channel is 1, its center frequency 5955,
7522 * center frequency is 5985 when bandwidth=80 MHz, its diff is 5985 - 5955 = 30.
7523 * lowest channel is 1, its center frequency 5955,
7524 * center frequency is 6025 when bandwidth=160 MHz, its diff is 6025 - 5955 = 70.
7526 if (chan_def->width == NL80211_CHAN_WIDTH_80P80 && seq == 3)
7527 return chan_def->center_freq2;
7529 seg_seq = 10 * (BIT(seq) - 1);
7530 return seg_seq + start_seq;
7533 static void ath11k_mac_get_psd_channel(struct ath11k *ar,
7538 struct ieee80211_channel **temp_chan,
7541 /* It is to get the center frequency for each 20 MHz.
7542 * For example, if the chan is 160 MHz and center frequency is 6025,
7543 * then it include 8 channels, they are 1/5/9/13/17/21/25/29,
7544 * channel number 1's center frequency is 5955, it is parameter start_freq.
7545 * parameter i is the step of the 8 channels. i is 0~7 for the 8 channels.
7546 * the channel 1/5/9/13/17/21/25/29 maps i=0/1/2/3/4/5/6/7,
7547 * and maps its center frequency is 5955/5975/5995/6015/6035/6055/6075/6095,
7548 * the gap is 20 for each channel, parameter step_freq means the gap.
7549 * after get the center frequency of each channel, it is easy to find the
7550 * struct ieee80211_channel of it and get the max_reg_power.
7552 *center_freq = *start_freq + i * step_freq;
7553 *temp_chan = ieee80211_get_channel(ar->hw->wiphy, *center_freq);
7554 *tx_power = (*temp_chan)->max_reg_power;
7557 static void ath11k_mac_get_eirp_power(struct ath11k *ar,
7561 struct ieee80211_channel **temp_chan,
7562 struct cfg80211_chan_def *def,
7565 /* It is to get the center frequency for 20 MHz/40 MHz/80 MHz/
7566 * 160 MHz&80P80 bandwidth, and then plus 10 to the center frequency,
7567 * it is the center frequency of a channel number.
7568 * For example, when configured channel number is 1.
7569 * center frequency is 5965 when bandwidth=40 MHz, after plus 10, it is 5975,
7570 * then it is channel number 5.
7571 * center frequency is 5985 when bandwidth=80 MHz, after plus 10, it is 5995,
7572 * then it is channel number 9.
7573 * center frequency is 6025 when bandwidth=160 MHz, after plus 10, it is 6035,
7574 * then it is channel number 17.
7575 * after get the center frequency of each channel, it is easy to find the
7576 * struct ieee80211_channel of it and get the max_reg_power.
7578 *center_freq = ath11k_mac_get_seg_freq(def, *start_freq, i);
7580 /* For the 20 MHz, its center frequency is same with same channel */
7584 *temp_chan = ieee80211_get_channel(ar->hw->wiphy, *center_freq);
7585 *tx_power = (*temp_chan)->max_reg_power;
7588 void ath11k_mac_fill_reg_tpc_info(struct ath11k *ar,
7589 struct ieee80211_vif *vif,
7590 struct ieee80211_chanctx_conf *ctx)
7592 struct ath11k_base *ab = ar->ab;
7593 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
7594 struct ieee80211_bss_conf *bss_conf = &vif->bss_conf;
7595 struct ath11k_reg_tpc_power_info *reg_tpc_info = &arvif->reg_tpc_info;
7596 struct ieee80211_channel *chan, *temp_chan;
7597 u8 pwr_lvl_idx, num_pwr_levels, pwr_reduction;
7598 bool is_psd_power = false, is_tpe_present = false;
7599 s8 max_tx_power[IEEE80211_MAX_NUM_PWR_LEVEL],
7600 psd_power, tx_power;
7602 u16 start_freq, center_freq;
7604 chan = ctx->def.chan;
7605 start_freq = ath11k_mac_get_6ghz_start_frequency(&ctx->def);
7606 pwr_reduction = bss_conf->pwr_reduction;
7608 if (arvif->reg_tpc_info.num_pwr_levels) {
7609 is_tpe_present = true;
7610 num_pwr_levels = arvif->reg_tpc_info.num_pwr_levels;
7612 num_pwr_levels = ath11k_mac_get_num_pwr_levels(&ctx->def);
7615 for (pwr_lvl_idx = 0; pwr_lvl_idx < num_pwr_levels; pwr_lvl_idx++) {
7616 /* STA received TPE IE*/
7617 if (is_tpe_present) {
7618 /* local power is PSD power*/
7619 if (chan->flags & IEEE80211_CHAN_PSD) {
7620 /* Connecting AP is psd power */
7621 if (reg_tpc_info->is_psd_power) {
7622 is_psd_power = true;
7623 ath11k_mac_get_psd_channel(ar, 20,
7629 psd_power = temp_chan->psd;
7630 eirp_power = tx_power;
7631 max_tx_power[pwr_lvl_idx] =
7634 reg_tpc_info->tpe[pwr_lvl_idx]);
7635 /* Connecting AP is not psd power */
7637 ath11k_mac_get_eirp_power(ar,
7644 psd_power = temp_chan->psd;
7645 /* convert psd power to EIRP power based
7650 psd_power + 13 + pwr_lvl_idx * 3);
7651 max_tx_power[pwr_lvl_idx] =
7654 reg_tpc_info->tpe[pwr_lvl_idx]);
7656 /* local power is not PSD power */
7658 /* Connecting AP is psd power */
7659 if (reg_tpc_info->is_psd_power) {
7660 is_psd_power = true;
7661 ath11k_mac_get_psd_channel(ar, 20,
7667 eirp_power = tx_power;
7668 max_tx_power[pwr_lvl_idx] =
7669 reg_tpc_info->tpe[pwr_lvl_idx];
7670 /* Connecting AP is not psd power */
7672 ath11k_mac_get_eirp_power(ar,
7679 max_tx_power[pwr_lvl_idx] =
7682 reg_tpc_info->tpe[pwr_lvl_idx]);
7685 /* STA not received TPE IE */
7687 /* local power is PSD power*/
7688 if (chan->flags & IEEE80211_CHAN_PSD) {
7689 is_psd_power = true;
7690 ath11k_mac_get_psd_channel(ar, 20,
7696 psd_power = temp_chan->psd;
7697 eirp_power = tx_power;
7698 max_tx_power[pwr_lvl_idx] = psd_power;
7700 ath11k_mac_get_eirp_power(ar,
7707 max_tx_power[pwr_lvl_idx] = tx_power;
7712 /* If AP local power constraint is present */
7714 eirp_power = eirp_power - pwr_reduction;
7716 /* If firmware updated max tx power is non zero, then take
7717 * the min of firmware updated ap tx power
7718 * and max power derived from above mentioned parameters.
7720 ath11k_dbg(ab, ATH11K_DBG_MAC,
7721 "eirp power : %d firmware report power : %d\n",
7722 eirp_power, ar->max_allowed_tx_power);
7723 /* Firmware reports lower max_allowed_tx_power during vdev
7724 * start response. In case of 6 GHz, firmware is not aware
7725 * of EIRP power unless driver sets EIRP power through WMI
7726 * TPC command. So radio which does not support idle power
7727 * save can set maximum calculated EIRP power directly to
7728 * firmware through TPC command without min comparison with
7729 * vdev start response's max_allowed_tx_power.
7731 if (ar->max_allowed_tx_power && ab->hw_params.idle_ps)
7732 eirp_power = min_t(s8,
7734 ar->max_allowed_tx_power);
7736 /* If AP local power constraint is present */
7738 max_tx_power[pwr_lvl_idx] =
7739 max_tx_power[pwr_lvl_idx] - pwr_reduction;
7740 /* If firmware updated max tx power is non zero, then take
7741 * the min of firmware updated ap tx power
7742 * and max power derived from above mentioned parameters.
7744 if (ar->max_allowed_tx_power && ab->hw_params.idle_ps)
7745 max_tx_power[pwr_lvl_idx] =
7747 max_tx_power[pwr_lvl_idx],
7748 ar->max_allowed_tx_power);
7750 reg_tpc_info->chan_power_info[pwr_lvl_idx].chan_cfreq = center_freq;
7751 reg_tpc_info->chan_power_info[pwr_lvl_idx].tx_power =
7752 max_tx_power[pwr_lvl_idx];
7755 reg_tpc_info->num_pwr_levels = num_pwr_levels;
7756 reg_tpc_info->is_psd_power = is_psd_power;
7757 reg_tpc_info->eirp_power = eirp_power;
7758 reg_tpc_info->ap_power_type =
7759 ath11k_reg_ap_pwr_convert(vif->bss_conf.power_type);
7762 static void ath11k_mac_parse_tx_pwr_env(struct ath11k *ar,
7763 struct ieee80211_vif *vif,
7764 struct ieee80211_chanctx_conf *ctx)
7766 struct ath11k_base *ab = ar->ab;
7767 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
7768 struct ieee80211_bss_conf *bss_conf = &vif->bss_conf;
7769 struct ieee80211_tx_pwr_env *single_tpe;
7770 enum wmi_reg_6ghz_client_type client_type;
7771 struct cur_regulatory_info *reg_info;
7773 u8 pwr_count, pwr_interpret, pwr_category;
7774 u8 psd_index = 0, non_psd_index = 0, local_tpe_count = 0, reg_tpe_count = 0;
7775 bool use_local_tpe, non_psd_set = false, psd_set = false;
7777 reg_info = &ab->reg_info_store[ar->pdev_idx];
7778 client_type = reg_info->client_type;
7780 for (i = 0; i < bss_conf->tx_pwr_env_num; i++) {
7781 single_tpe = &bss_conf->tx_pwr_env[i];
7782 pwr_category = u8_get_bits(single_tpe->tx_power_info,
7783 IEEE80211_TX_PWR_ENV_INFO_CATEGORY);
7784 pwr_interpret = u8_get_bits(single_tpe->tx_power_info,
7785 IEEE80211_TX_PWR_ENV_INFO_INTERPRET);
7787 if (pwr_category == client_type) {
7788 if (pwr_interpret == IEEE80211_TPE_LOCAL_EIRP ||
7789 pwr_interpret == IEEE80211_TPE_LOCAL_EIRP_PSD)
7791 else if (pwr_interpret == IEEE80211_TPE_REG_CLIENT_EIRP ||
7792 pwr_interpret == IEEE80211_TPE_REG_CLIENT_EIRP_PSD)
7797 if (!reg_tpe_count && !local_tpe_count) {
7799 "no transmit power envelope match client power type %d\n",
7802 } else if (!reg_tpe_count) {
7803 use_local_tpe = true;
7805 use_local_tpe = false;
7808 for (i = 0; i < bss_conf->tx_pwr_env_num; i++) {
7809 single_tpe = &bss_conf->tx_pwr_env[i];
7810 pwr_category = u8_get_bits(single_tpe->tx_power_info,
7811 IEEE80211_TX_PWR_ENV_INFO_CATEGORY);
7812 pwr_interpret = u8_get_bits(single_tpe->tx_power_info,
7813 IEEE80211_TX_PWR_ENV_INFO_INTERPRET);
7815 if (pwr_category != client_type)
7818 /* get local transmit power envelope */
7819 if (use_local_tpe) {
7820 if (pwr_interpret == IEEE80211_TPE_LOCAL_EIRP) {
7823 } else if (pwr_interpret == IEEE80211_TPE_LOCAL_EIRP_PSD) {
7827 /* get regulatory transmit power envelope */
7829 if (pwr_interpret == IEEE80211_TPE_REG_CLIENT_EIRP) {
7832 } else if (pwr_interpret == IEEE80211_TPE_REG_CLIENT_EIRP_PSD) {
7839 if (non_psd_set && !psd_set) {
7840 single_tpe = &bss_conf->tx_pwr_env[non_psd_index];
7841 pwr_count = u8_get_bits(single_tpe->tx_power_info,
7842 IEEE80211_TX_PWR_ENV_INFO_COUNT);
7843 pwr_interpret = u8_get_bits(single_tpe->tx_power_info,
7844 IEEE80211_TX_PWR_ENV_INFO_INTERPRET);
7845 arvif->reg_tpc_info.is_psd_power = false;
7846 arvif->reg_tpc_info.eirp_power = 0;
7848 arvif->reg_tpc_info.num_pwr_levels =
7849 ath11k_mac_get_tpe_count(pwr_interpret, pwr_count);
7851 for (i = 0; i < arvif->reg_tpc_info.num_pwr_levels; i++) {
7852 ath11k_dbg(ab, ATH11K_DBG_MAC,
7853 "non PSD power[%d] : %d\n",
7854 i, single_tpe->tx_power[i]);
7855 arvif->reg_tpc_info.tpe[i] = single_tpe->tx_power[i] / 2;
7860 single_tpe = &bss_conf->tx_pwr_env[psd_index];
7861 pwr_count = u8_get_bits(single_tpe->tx_power_info,
7862 IEEE80211_TX_PWR_ENV_INFO_COUNT);
7863 pwr_interpret = u8_get_bits(single_tpe->tx_power_info,
7864 IEEE80211_TX_PWR_ENV_INFO_INTERPRET);
7865 arvif->reg_tpc_info.is_psd_power = true;
7867 if (pwr_count == 0) {
7868 ath11k_dbg(ab, ATH11K_DBG_MAC,
7869 "TPE PSD power : %d\n", single_tpe->tx_power[0]);
7870 arvif->reg_tpc_info.num_pwr_levels =
7871 ath11k_mac_get_num_pwr_levels(&ctx->def);
7873 for (i = 0; i < arvif->reg_tpc_info.num_pwr_levels; i++)
7874 arvif->reg_tpc_info.tpe[i] = single_tpe->tx_power[0] / 2;
7876 arvif->reg_tpc_info.num_pwr_levels =
7877 ath11k_mac_get_tpe_count(pwr_interpret, pwr_count);
7879 for (i = 0; i < arvif->reg_tpc_info.num_pwr_levels; i++) {
7880 ath11k_dbg(ab, ATH11K_DBG_MAC,
7881 "TPE PSD power[%d] : %d\n",
7882 i, single_tpe->tx_power[i]);
7883 arvif->reg_tpc_info.tpe[i] = single_tpe->tx_power[i] / 2;
7890 ath11k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw,
7891 struct ieee80211_vif *vif,
7892 struct ieee80211_bss_conf *link_conf,
7893 struct ieee80211_chanctx_conf *ctx)
7895 struct ath11k *ar = hw->priv;
7896 struct ath11k_base *ab = ar->ab;
7897 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
7899 struct cur_regulatory_info *reg_info;
7900 enum ieee80211_ap_reg_power power_type;
7902 mutex_lock(&ar->conf_mutex);
7904 ath11k_dbg(ab, ATH11K_DBG_MAC,
7905 "chanctx assign ptr %p vdev_id %i\n",
7906 ctx, arvif->vdev_id);
7908 if (ath11k_wmi_supports_6ghz_cc_ext(ar) &&
7909 ctx->def.chan->band == NL80211_BAND_6GHZ &&
7910 arvif->vdev_type == WMI_VDEV_TYPE_STA) {
7911 reg_info = &ab->reg_info_store[ar->pdev_idx];
7912 power_type = vif->bss_conf.power_type;
7914 ath11k_dbg(ab, ATH11K_DBG_MAC, "chanctx power type %d\n", power_type);
7916 if (power_type == IEEE80211_REG_UNSET_AP) {
7921 ath11k_reg_handle_chan_list(ab, reg_info, power_type);
7922 arvif->chanctx = *ctx;
7923 ath11k_mac_parse_tx_pwr_env(ar, vif, ctx);
7926 /* for QCA6390 bss peer must be created before vdev_start */
7927 if (ab->hw_params.vdev_start_delay &&
7928 arvif->vdev_type != WMI_VDEV_TYPE_AP &&
7929 arvif->vdev_type != WMI_VDEV_TYPE_MONITOR &&
7930 !ath11k_peer_find_by_vdev_id(ab, arvif->vdev_id)) {
7931 memcpy(&arvif->chanctx, ctx, sizeof(*ctx));
7936 if (WARN_ON(arvif->is_started)) {
7941 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
7942 ret = ath11k_mac_monitor_start(ar);
7944 ath11k_warn(ar->ab, "failed to start monitor during vif channel context assignment: %d",
7949 arvif->is_started = true;
7953 if (!arvif->is_started) {
7954 ret = ath11k_mac_vdev_start(arvif, ctx);
7956 ath11k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n",
7957 arvif->vdev_id, vif->addr,
7958 ctx->def.chan->center_freq, ret);
7962 arvif->is_started = true;
7965 if (arvif->vdev_type != WMI_VDEV_TYPE_MONITOR &&
7966 test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags)) {
7967 ret = ath11k_mac_monitor_start(ar);
7969 ath11k_warn(ar->ab, "failed to start monitor during vif channel context assignment: %d",
7975 /* TODO: Setup ps and cts/rts protection */
7980 mutex_unlock(&ar->conf_mutex);
7986 ath11k_mac_op_unassign_vif_chanctx(struct ieee80211_hw *hw,
7987 struct ieee80211_vif *vif,
7988 struct ieee80211_bss_conf *link_conf,
7989 struct ieee80211_chanctx_conf *ctx)
7991 struct ath11k *ar = hw->priv;
7992 struct ath11k_base *ab = ar->ab;
7993 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
7994 struct ath11k_peer *peer;
7997 mutex_lock(&ar->conf_mutex);
7999 ath11k_dbg(ab, ATH11K_DBG_MAC,
8000 "chanctx unassign ptr %p vdev_id %i\n",
8001 ctx, arvif->vdev_id);
8003 if (ab->hw_params.vdev_start_delay &&
8004 arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
8005 spin_lock_bh(&ab->base_lock);
8006 peer = ath11k_peer_find_by_addr(ab, ar->mac_addr);
8007 spin_unlock_bh(&ab->base_lock);
8009 ath11k_peer_delete(ar, arvif->vdev_id, ar->mac_addr);
8012 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
8013 ret = ath11k_mac_monitor_stop(ar);
8015 ath11k_warn(ar->ab, "failed to stop monitor during vif channel context unassignment: %d",
8017 mutex_unlock(&ar->conf_mutex);
8021 arvif->is_started = false;
8022 mutex_unlock(&ar->conf_mutex);
8026 if (arvif->is_started) {
8027 ret = ath11k_mac_vdev_stop(arvif);
8029 ath11k_warn(ab, "failed to stop vdev %i: %d\n",
8030 arvif->vdev_id, ret);
8032 arvif->is_started = false;
8035 if (ab->hw_params.vdev_start_delay &&
8036 arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
8037 ath11k_wmi_vdev_down(ar, arvif->vdev_id);
8039 if (arvif->vdev_type != WMI_VDEV_TYPE_MONITOR &&
8040 ar->num_started_vdevs == 1 &&
8041 test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags)) {
8042 ret = ath11k_mac_monitor_stop(ar);
8044 /* continue even if there's an error */
8045 ath11k_warn(ar->ab, "failed to stop monitor during vif channel context unassignment: %d",
8049 if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
8050 ath11k_mac_11d_scan_start(ar, arvif->vdev_id);
8052 mutex_unlock(&ar->conf_mutex);
8056 ath11k_mac_op_switch_vif_chanctx(struct ieee80211_hw *hw,
8057 struct ieee80211_vif_chanctx_switch *vifs,
8059 enum ieee80211_chanctx_switch_mode mode)
8061 struct ath11k *ar = hw->priv;
8063 mutex_lock(&ar->conf_mutex);
8065 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
8066 "chanctx switch n_vifs %d mode %d\n",
8068 ath11k_mac_update_vif_chan(ar, vifs, n_vifs);
8070 mutex_unlock(&ar->conf_mutex);
8076 ath11k_set_vdev_param_to_all_vifs(struct ath11k *ar, int param, u32 value)
8078 struct ath11k_vif *arvif;
8081 mutex_lock(&ar->conf_mutex);
8082 list_for_each_entry(arvif, &ar->arvifs, list) {
8083 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "setting mac vdev %d param %d value %d\n",
8084 param, arvif->vdev_id, value);
8086 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
8089 ath11k_warn(ar->ab, "failed to set param %d for vdev %d: %d\n",
8090 param, arvif->vdev_id, ret);
8094 mutex_unlock(&ar->conf_mutex);
8098 /* mac80211 stores device specific RTS/Fragmentation threshold value,
8099 * this is set interface specific to firmware from ath11k driver
8101 static int ath11k_mac_op_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
8103 struct ath11k *ar = hw->priv;
8104 int param_id = WMI_VDEV_PARAM_RTS_THRESHOLD;
8106 return ath11k_set_vdev_param_to_all_vifs(ar, param_id, value);
8109 static int ath11k_mac_op_set_frag_threshold(struct ieee80211_hw *hw, u32 value)
8111 /* Even though there's a WMI vdev param for fragmentation threshold no
8112 * known firmware actually implements it. Moreover it is not possible to
8113 * rely frame fragmentation to mac80211 because firmware clears the
8114 * "more fragments" bit in frame control making it impossible for remote
8115 * devices to reassemble frames.
8117 * Hence implement a dummy callback just to say fragmentation isn't
8118 * supported. This effectively prevents mac80211 from doing frame
8119 * fragmentation in software.
8124 static int ath11k_mac_flush_tx_complete(struct ath11k *ar)
8129 time_left = wait_event_timeout(ar->dp.tx_empty_waitq,
8130 (atomic_read(&ar->dp.num_tx_pending) == 0),
8131 ATH11K_FLUSH_TIMEOUT);
8132 if (time_left == 0) {
8133 ath11k_warn(ar->ab, "failed to flush transmit queue, data pkts pending %d\n",
8134 atomic_read(&ar->dp.num_tx_pending));
8138 time_left = wait_event_timeout(ar->txmgmt_empty_waitq,
8139 (atomic_read(&ar->num_pending_mgmt_tx) == 0),
8140 ATH11K_FLUSH_TIMEOUT);
8141 if (time_left == 0) {
8142 ath11k_warn(ar->ab, "failed to flush mgmt transmit queue, mgmt pkts pending %d\n",
8143 atomic_read(&ar->num_pending_mgmt_tx));
8150 int ath11k_mac_wait_tx_complete(struct ath11k *ar)
8152 ath11k_mac_drain_tx(ar);
8153 return ath11k_mac_flush_tx_complete(ar);
8156 static void ath11k_mac_op_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
8157 u32 queues, bool drop)
8159 struct ath11k *ar = hw->priv;
8164 ath11k_mac_flush_tx_complete(ar);
8168 ath11k_mac_has_single_legacy_rate(struct ath11k *ar,
8169 enum nl80211_band band,
8170 const struct cfg80211_bitrate_mask *mask)
8174 num_rates = hweight32(mask->control[band].legacy);
8176 if (ath11k_mac_bitrate_mask_num_ht_rates(ar, band, mask))
8179 if (ath11k_mac_bitrate_mask_num_vht_rates(ar, band, mask))
8182 if (ath11k_mac_bitrate_mask_num_he_rates(ar, band, mask))
8185 return num_rates == 1;
8189 ath11k_mac_get_tx_mcs_map(const struct ieee80211_sta_he_cap *he_cap)
8191 if (he_cap->he_cap_elem.phy_cap_info[0] &
8192 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
8193 return he_cap->he_mcs_nss_supp.tx_mcs_80p80;
8195 if (he_cap->he_cap_elem.phy_cap_info[0] &
8196 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
8197 return he_cap->he_mcs_nss_supp.tx_mcs_160;
8199 return he_cap->he_mcs_nss_supp.tx_mcs_80;
8203 ath11k_mac_bitrate_mask_get_single_nss(struct ath11k *ar,
8204 struct ath11k_vif *arvif,
8205 enum nl80211_band band,
8206 const struct cfg80211_bitrate_mask *mask,
8209 struct ieee80211_supported_band *sband = &ar->mac.sbands[band];
8210 u16 vht_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
8211 const struct ieee80211_sta_he_cap *he_cap;
8214 u8 vht_nss_mask = 0;
8218 /* No need to consider legacy here. Basic rates are always present
8222 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) {
8223 if (mask->control[band].ht_mcs[i] == 0)
8225 else if (mask->control[band].ht_mcs[i] ==
8226 sband->ht_cap.mcs.rx_mask[i])
8227 ht_nss_mask |= BIT(i);
8232 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
8233 if (mask->control[band].vht_mcs[i] == 0)
8235 else if (mask->control[band].vht_mcs[i] ==
8236 ath11k_mac_get_max_vht_mcs_map(vht_mcs_map, i))
8237 vht_nss_mask |= BIT(i);
8242 he_cap = ieee80211_get_he_iftype_cap_vif(sband, arvif->vif);
8246 he_mcs_map = le16_to_cpu(ath11k_mac_get_tx_mcs_map(he_cap));
8248 for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) {
8249 if (mask->control[band].he_mcs[i] == 0)
8252 if (mask->control[band].he_mcs[i] ==
8253 ath11k_mac_get_max_he_mcs_map(he_mcs_map, i))
8254 he_nss_mask |= BIT(i);
8259 if (ht_nss_mask != vht_nss_mask || ht_nss_mask != he_nss_mask)
8262 if (ht_nss_mask == 0)
8265 if (BIT(fls(ht_nss_mask)) - 1 != ht_nss_mask)
8268 *nss = fls(ht_nss_mask);
8274 ath11k_mac_get_single_legacy_rate(struct ath11k *ar,
8275 enum nl80211_band band,
8276 const struct cfg80211_bitrate_mask *mask,
8284 if (hweight32(mask->control[band].legacy) != 1)
8287 rate_idx = ffs(mask->control[band].legacy) - 1;
8289 if (band == NL80211_BAND_5GHZ || band == NL80211_BAND_6GHZ)
8290 rate_idx += ATH11K_MAC_FIRST_OFDM_RATE_IDX;
8292 hw_rate = ath11k_legacy_rates[rate_idx].hw_value;
8293 bitrate = ath11k_legacy_rates[rate_idx].bitrate;
8295 if (ath11k_mac_bitrate_is_cck(bitrate))
8296 preamble = WMI_RATE_PREAMBLE_CCK;
8298 preamble = WMI_RATE_PREAMBLE_OFDM;
8301 *rate = ATH11K_HW_RATE_CODE(hw_rate, 0, preamble);
8307 ath11k_mac_set_fixed_rate_gi_ltf(struct ath11k_vif *arvif, u8 he_gi, u8 he_ltf)
8309 struct ath11k *ar = arvif->ar;
8312 /* 0.8 = 0, 1.6 = 2 and 3.2 = 3. */
8313 if (he_gi && he_gi != 0xFF)
8316 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
8317 WMI_VDEV_PARAM_SGI, he_gi);
8319 ath11k_warn(ar->ab, "failed to set he gi %d: %d\n",
8327 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
8328 WMI_VDEV_PARAM_HE_LTF, he_ltf);
8330 ath11k_warn(ar->ab, "failed to set he ltf %d: %d\n",
8339 ath11k_mac_set_auto_rate_gi_ltf(struct ath11k_vif *arvif, u16 he_gi, u8 he_ltf)
8341 struct ath11k *ar = arvif->ar;
8345 if (he_gi != 0xFF) {
8347 case NL80211_RATE_INFO_HE_GI_0_8:
8348 he_gi = WMI_AUTORATE_800NS_GI;
8350 case NL80211_RATE_INFO_HE_GI_1_6:
8351 he_gi = WMI_AUTORATE_1600NS_GI;
8353 case NL80211_RATE_INFO_HE_GI_3_2:
8354 he_gi = WMI_AUTORATE_3200NS_GI;
8357 ath11k_warn(ar->ab, "invalid he gi: %d\n", he_gi);
8362 if (he_ltf != 0xFF) {
8364 case NL80211_RATE_INFO_HE_1XLTF:
8365 he_ltf = WMI_HE_AUTORATE_LTF_1X;
8367 case NL80211_RATE_INFO_HE_2XLTF:
8368 he_ltf = WMI_HE_AUTORATE_LTF_2X;
8370 case NL80211_RATE_INFO_HE_4XLTF:
8371 he_ltf = WMI_HE_AUTORATE_LTF_4X;
8374 ath11k_warn(ar->ab, "invalid he ltf: %d\n", he_ltf);
8379 he_ar_gi_ltf = he_gi | he_ltf;
8380 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
8381 WMI_VDEV_PARAM_AUTORATE_MISC_CFG,
8385 "failed to set he autorate gi %u ltf %u: %d\n",
8386 he_gi, he_ltf, ret);
8393 static int ath11k_mac_set_rate_params(struct ath11k_vif *arvif,
8394 u32 rate, u8 nss, u8 sgi, u8 ldpc,
8395 u8 he_gi, u8 he_ltf, bool he_fixed_rate)
8397 struct ath11k *ar = arvif->ar;
8401 lockdep_assert_held(&ar->conf_mutex);
8403 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
8404 "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",
8405 arvif->vdev_id, rate, nss, sgi, ldpc, he_gi,
8406 he_ltf, he_fixed_rate);
8408 if (!arvif->vif->bss_conf.he_support) {
8409 vdev_param = WMI_VDEV_PARAM_FIXED_RATE;
8410 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
8413 ath11k_warn(ar->ab, "failed to set fixed rate param 0x%02x: %d\n",
8419 vdev_param = WMI_VDEV_PARAM_NSS;
8420 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
8423 ath11k_warn(ar->ab, "failed to set nss param %d: %d\n",
8428 vdev_param = WMI_VDEV_PARAM_LDPC;
8429 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
8432 ath11k_warn(ar->ab, "failed to set ldpc param %d: %d\n",
8437 if (arvif->vif->bss_conf.he_support) {
8438 if (he_fixed_rate) {
8439 ret = ath11k_mac_set_fixed_rate_gi_ltf(arvif, he_gi,
8442 ath11k_warn(ar->ab, "failed to set fixed rate gi ltf: %d\n",
8447 ret = ath11k_mac_set_auto_rate_gi_ltf(arvif, he_gi,
8450 ath11k_warn(ar->ab, "failed to set auto rate gi ltf: %d\n",
8456 vdev_param = WMI_VDEV_PARAM_SGI;
8457 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
8460 ath11k_warn(ar->ab, "failed to set sgi param %d: %d\n",
8470 ath11k_mac_vht_mcs_range_present(struct ath11k *ar,
8471 enum nl80211_band band,
8472 const struct cfg80211_bitrate_mask *mask)
8477 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
8478 vht_mcs = mask->control[band].vht_mcs[i];
8495 ath11k_mac_he_mcs_range_present(struct ath11k *ar,
8496 enum nl80211_band band,
8497 const struct cfg80211_bitrate_mask *mask)
8502 for (i = 0; i < NL80211_HE_NSS_MAX; i++) {
8503 he_mcs = mask->control[band].he_mcs[i];
8519 static void ath11k_mac_set_bitrate_mask_iter(void *data,
8520 struct ieee80211_sta *sta)
8522 struct ath11k_vif *arvif = data;
8523 struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
8524 struct ath11k *ar = arvif->ar;
8526 spin_lock_bh(&ar->data_lock);
8527 arsta->changed |= IEEE80211_RC_SUPP_RATES_CHANGED;
8528 spin_unlock_bh(&ar->data_lock);
8530 ieee80211_queue_work(ar->hw, &arsta->update_wk);
8533 static void ath11k_mac_disable_peer_fixed_rate(void *data,
8534 struct ieee80211_sta *sta)
8536 struct ath11k_vif *arvif = data;
8537 struct ath11k *ar = arvif->ar;
8540 ret = ath11k_wmi_set_peer_param(ar, sta->addr,
8542 WMI_PEER_PARAM_FIXED_RATE,
8543 WMI_FIXED_RATE_NONE);
8546 "failed to disable peer fixed rate for STA %pM ret %d\n",
8551 ath11k_mac_validate_vht_he_fixed_rate_settings(struct ath11k *ar, enum nl80211_band band,
8552 const struct cfg80211_bitrate_mask *mask)
8554 bool he_fixed_rate = false, vht_fixed_rate = false;
8555 struct ath11k_peer *peer;
8556 const u16 *vht_mcs_mask, *he_mcs_mask;
8557 struct ieee80211_link_sta *deflink;
8561 vht_mcs_mask = mask->control[band].vht_mcs;
8562 he_mcs_mask = mask->control[band].he_mcs;
8564 if (ath11k_mac_bitrate_mask_num_vht_rates(ar, band, mask) == 1)
8565 vht_fixed_rate = true;
8567 if (ath11k_mac_bitrate_mask_num_he_rates(ar, band, mask) == 1)
8568 he_fixed_rate = true;
8570 if (!vht_fixed_rate && !he_fixed_rate)
8573 vht_nss = ath11k_mac_max_vht_nss(vht_mcs_mask);
8574 he_nss = ath11k_mac_max_he_nss(he_mcs_mask);
8577 spin_lock_bh(&ar->ab->base_lock);
8578 list_for_each_entry(peer, &ar->ab->peers, list) {
8580 deflink = &peer->sta->deflink;
8582 if (vht_fixed_rate && (!deflink->vht_cap.vht_supported ||
8583 deflink->rx_nss < vht_nss)) {
8588 if (he_fixed_rate && (!deflink->he_cap.has_he ||
8589 deflink->rx_nss < he_nss)) {
8597 spin_unlock_bh(&ar->ab->base_lock);
8603 ath11k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw,
8604 struct ieee80211_vif *vif,
8605 const struct cfg80211_bitrate_mask *mask)
8607 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
8608 struct cfg80211_chan_def def;
8609 struct ath11k_pdev_cap *cap;
8610 struct ath11k *ar = arvif->ar;
8611 enum nl80211_band band;
8612 const u8 *ht_mcs_mask;
8613 const u16 *vht_mcs_mask;
8614 const u16 *he_mcs_mask;
8624 bool he_fixed_rate = false;
8626 if (ath11k_mac_vif_chan(vif, &def))
8629 band = def.chan->band;
8630 cap = &ar->pdev->cap;
8631 ht_mcs_mask = mask->control[band].ht_mcs;
8632 vht_mcs_mask = mask->control[band].vht_mcs;
8633 he_mcs_mask = mask->control[band].he_mcs;
8634 ldpc = !!(cap->band[band].ht_cap_info & WMI_HT_CAP_TX_LDPC);
8636 sgi = mask->control[band].gi;
8637 if (sgi == NL80211_TXRATE_FORCE_LGI)
8640 he_gi = mask->control[band].he_gi;
8641 he_ltf = mask->control[band].he_ltf;
8643 /* mac80211 doesn't support sending a fixed HT/VHT MCS alone, rather it
8644 * requires passing at least one of used basic rates along with them.
8645 * Fixed rate setting across different preambles(legacy, HT, VHT) is
8646 * not supported by the FW. Hence use of FIXED_RATE vdev param is not
8647 * suitable for setting single HT/VHT rates.
8648 * But, there could be a single basic rate passed from userspace which
8649 * can be done through the FIXED_RATE param.
8651 if (ath11k_mac_has_single_legacy_rate(ar, band, mask)) {
8652 ret = ath11k_mac_get_single_legacy_rate(ar, band, mask, &rate,
8655 ath11k_warn(ar->ab, "failed to get single legacy rate for vdev %i: %d\n",
8656 arvif->vdev_id, ret);
8659 ieee80211_iterate_stations_atomic(ar->hw,
8660 ath11k_mac_disable_peer_fixed_rate,
8662 } else if (ath11k_mac_bitrate_mask_get_single_nss(ar, arvif, band, mask,
8664 rate = WMI_FIXED_RATE_NONE;
8666 mutex_lock(&ar->conf_mutex);
8667 arvif->bitrate_mask = *mask;
8668 ieee80211_iterate_stations_atomic(ar->hw,
8669 ath11k_mac_set_bitrate_mask_iter,
8671 mutex_unlock(&ar->conf_mutex);
8673 rate = WMI_FIXED_RATE_NONE;
8675 if (!ath11k_mac_validate_vht_he_fixed_rate_settings(ar, band, mask))
8677 "could not update fixed rate settings to all peers due to mcs/nss incompatibility\n");
8678 nss = min_t(u32, ar->num_tx_chains,
8679 ath11k_mac_max_nss(ht_mcs_mask, vht_mcs_mask, he_mcs_mask));
8681 /* If multiple rates across different preambles are given
8682 * we can reconfigure this info with all peers using PEER_ASSOC
8683 * command with the below exception cases.
8684 * - Single VHT Rate : peer_assoc command accommodates only MCS
8685 * range values i.e 0-7, 0-8, 0-9 for VHT. Though mac80211
8686 * mandates passing basic rates along with HT/VHT rates, FW
8687 * doesn't allow switching from VHT to Legacy. Hence instead of
8688 * setting legacy and VHT rates using RATEMASK_CMD vdev cmd,
8689 * we could set this VHT rate as peer fixed rate param, which
8690 * will override FIXED rate and FW rate control algorithm.
8691 * If single VHT rate is passed along with HT rates, we select
8692 * the VHT rate as fixed rate for vht peers.
8693 * - Multiple VHT Rates : When Multiple VHT rates are given,this
8694 * can be set using RATEMASK CMD which uses FW rate-ctl alg.
8695 * TODO: Setting multiple VHT MCS and replacing peer_assoc with
8696 * RATEMASK_CMDID can cover all use cases of setting rates
8697 * across multiple preambles and rates within same type.
8698 * But requires more validation of the command at this point.
8701 num_rates = ath11k_mac_bitrate_mask_num_vht_rates(ar, band,
8704 if (!ath11k_mac_vht_mcs_range_present(ar, band, mask) &&
8706 /* TODO: Handle multiple VHT MCS values setting using
8710 "setting %d mcs values in bitrate mask not supported\n",
8715 num_rates = ath11k_mac_bitrate_mask_num_he_rates(ar, band,
8718 he_fixed_rate = true;
8720 if (!ath11k_mac_he_mcs_range_present(ar, band, mask) &&
8723 "Setting more than one HE MCS Value in bitrate mask not supported\n");
8727 mutex_lock(&ar->conf_mutex);
8728 ieee80211_iterate_stations_atomic(ar->hw,
8729 ath11k_mac_disable_peer_fixed_rate,
8732 arvif->bitrate_mask = *mask;
8733 ieee80211_iterate_stations_atomic(ar->hw,
8734 ath11k_mac_set_bitrate_mask_iter,
8737 mutex_unlock(&ar->conf_mutex);
8740 mutex_lock(&ar->conf_mutex);
8742 ret = ath11k_mac_set_rate_params(arvif, rate, nss, sgi, ldpc, he_gi,
8743 he_ltf, he_fixed_rate);
8745 ath11k_warn(ar->ab, "failed to set rate params on vdev %i: %d\n",
8746 arvif->vdev_id, ret);
8749 mutex_unlock(&ar->conf_mutex);
8755 ath11k_mac_op_reconfig_complete(struct ieee80211_hw *hw,
8756 enum ieee80211_reconfig_type reconfig_type)
8758 struct ath11k *ar = hw->priv;
8759 struct ath11k_base *ab = ar->ab;
8761 struct ath11k_vif *arvif;
8763 if (reconfig_type != IEEE80211_RECONFIG_TYPE_RESTART)
8766 mutex_lock(&ar->conf_mutex);
8768 if (ar->state == ATH11K_STATE_RESTARTED) {
8769 ath11k_warn(ar->ab, "pdev %d successfully recovered\n",
8771 ar->state = ATH11K_STATE_ON;
8772 ieee80211_wake_queues(ar->hw);
8774 if (ar->ab->hw_params.current_cc_support &&
8775 ar->alpha2[0] != 0 && ar->alpha2[1] != 0) {
8776 struct wmi_set_current_country_params set_current_param = {};
8778 memcpy(&set_current_param.alpha2, ar->alpha2, 2);
8779 ath11k_wmi_send_set_current_country_cmd(ar, &set_current_param);
8783 recovery_count = atomic_inc_return(&ab->recovery_count);
8784 ath11k_dbg(ab, ATH11K_DBG_BOOT,
8785 "recovery count %d\n", recovery_count);
8786 /* When there are multiple radios in an SOC,
8787 * the recovery has to be done for each radio
8789 if (recovery_count == ab->num_radios) {
8790 atomic_dec(&ab->reset_count);
8791 complete(&ab->reset_complete);
8792 ab->is_reset = false;
8793 atomic_set(&ab->fail_cont_count, 0);
8794 ath11k_dbg(ab, ATH11K_DBG_BOOT, "reset success\n");
8797 if (ar->ab->hw_params.support_fw_mac_sequence) {
8798 list_for_each_entry(arvif, &ar->arvifs, list) {
8799 if (arvif->is_up && arvif->vdev_type == WMI_VDEV_TYPE_STA)
8800 ieee80211_hw_restart_disconnect(arvif->vif);
8805 mutex_unlock(&ar->conf_mutex);
8809 ath11k_mac_update_bss_chan_survey(struct ath11k *ar,
8810 struct ieee80211_channel *channel)
8813 enum wmi_bss_chan_info_req_type type = WMI_BSS_SURVEY_REQ_TYPE_READ;
8815 lockdep_assert_held(&ar->conf_mutex);
8817 if (!test_bit(WMI_TLV_SERVICE_BSS_CHANNEL_INFO_64, ar->ab->wmi_ab.svc_map) ||
8818 ar->rx_channel != channel)
8821 if (ar->scan.state != ATH11K_SCAN_IDLE) {
8822 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
8823 "ignoring bss chan info req while scanning..\n");
8827 reinit_completion(&ar->bss_survey_done);
8829 ret = ath11k_wmi_pdev_bss_chan_info_request(ar, type);
8831 ath11k_warn(ar->ab, "failed to send pdev bss chan info request\n");
8835 ret = wait_for_completion_timeout(&ar->bss_survey_done, 3 * HZ);
8837 ath11k_warn(ar->ab, "bss channel survey timed out\n");
8840 static int ath11k_mac_op_get_survey(struct ieee80211_hw *hw, int idx,
8841 struct survey_info *survey)
8843 struct ath11k *ar = hw->priv;
8844 struct ieee80211_supported_band *sband;
8845 struct survey_info *ar_survey;
8848 if (idx >= ATH11K_NUM_CHANS)
8851 ar_survey = &ar->survey[idx];
8853 mutex_lock(&ar->conf_mutex);
8855 sband = hw->wiphy->bands[NL80211_BAND_2GHZ];
8856 if (sband && idx >= sband->n_channels) {
8857 idx -= sband->n_channels;
8862 sband = hw->wiphy->bands[NL80211_BAND_5GHZ];
8863 if (sband && idx >= sband->n_channels) {
8864 idx -= sband->n_channels;
8869 sband = hw->wiphy->bands[NL80211_BAND_6GHZ];
8870 if (!sband || idx >= sband->n_channels) {
8875 ath11k_mac_update_bss_chan_survey(ar, &sband->channels[idx]);
8877 spin_lock_bh(&ar->data_lock);
8878 memcpy(survey, ar_survey, sizeof(*survey));
8879 spin_unlock_bh(&ar->data_lock);
8881 survey->channel = &sband->channels[idx];
8883 if (ar->rx_channel == survey->channel)
8884 survey->filled |= SURVEY_INFO_IN_USE;
8887 mutex_unlock(&ar->conf_mutex);
8891 static void ath11k_mac_put_chain_rssi(struct station_info *sinfo,
8892 struct ath11k_sta *arsta,
8896 struct ath11k *ar = arsta->arvif->ar;
8900 for (i = 0; i < ARRAY_SIZE(sinfo->chain_signal); i++) {
8901 sinfo->chains &= ~BIT(i);
8902 rssi = arsta->chain_signal[i];
8904 arsta->chain_signal[i] = ATH11K_INVALID_RSSI_FULL;
8906 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
8907 "sta statistics %s rssi[%d] %d\n", pre, i, rssi);
8909 if (rssi != ATH11K_DEFAULT_NOISE_FLOOR &&
8910 rssi != ATH11K_INVALID_RSSI_FULL &&
8911 rssi != ATH11K_INVALID_RSSI_EMPTY &&
8913 sinfo->chain_signal[i] = rssi;
8914 sinfo->chains |= BIT(i);
8915 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL);
8920 static void ath11k_mac_op_sta_statistics(struct ieee80211_hw *hw,
8921 struct ieee80211_vif *vif,
8922 struct ieee80211_sta *sta,
8923 struct station_info *sinfo)
8925 struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
8926 struct ath11k *ar = arsta->arvif->ar;
8928 bool db2dbm = test_bit(WMI_TLV_SERVICE_HW_DB2DBM_CONVERSION_SUPPORT,
8929 ar->ab->wmi_ab.svc_map);
8931 sinfo->rx_duration = arsta->rx_duration;
8932 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_DURATION);
8934 sinfo->tx_duration = arsta->tx_duration;
8935 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_DURATION);
8937 if (arsta->txrate.legacy || arsta->txrate.nss) {
8938 if (arsta->txrate.legacy) {
8939 sinfo->txrate.legacy = arsta->txrate.legacy;
8941 sinfo->txrate.mcs = arsta->txrate.mcs;
8942 sinfo->txrate.nss = arsta->txrate.nss;
8943 sinfo->txrate.bw = arsta->txrate.bw;
8944 sinfo->txrate.he_gi = arsta->txrate.he_gi;
8945 sinfo->txrate.he_dcm = arsta->txrate.he_dcm;
8946 sinfo->txrate.he_ru_alloc = arsta->txrate.he_ru_alloc;
8948 sinfo->txrate.flags = arsta->txrate.flags;
8949 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
8952 ath11k_mac_put_chain_rssi(sinfo, arsta, "ppdu", false);
8954 if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL)) &&
8955 arsta->arvif->vdev_type == WMI_VDEV_TYPE_STA &&
8956 ar->ab->hw_params.supports_rssi_stats &&
8957 !ath11k_debugfs_get_fw_stats(ar, ar->pdev->pdev_id, 0,
8958 WMI_REQUEST_RSSI_PER_CHAIN_STAT)) {
8959 ath11k_mac_put_chain_rssi(sinfo, arsta, "fw stats", true);
8962 signal = arsta->rssi_comb;
8964 arsta->arvif->vdev_type == WMI_VDEV_TYPE_STA &&
8965 ar->ab->hw_params.supports_rssi_stats &&
8966 !(ath11k_debugfs_get_fw_stats(ar, ar->pdev->pdev_id, 0,
8967 WMI_REQUEST_VDEV_STAT)))
8968 signal = arsta->rssi_beacon;
8970 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
8971 "sta statistics db2dbm %u rssi comb %d rssi beacon %d\n",
8972 db2dbm, arsta->rssi_comb, arsta->rssi_beacon);
8975 sinfo->signal = db2dbm ? signal : signal + ATH11K_DEFAULT_NOISE_FLOOR;
8976 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL);
8979 sinfo->signal_avg = ewma_avg_rssi_read(&arsta->avg_rssi) +
8980 ATH11K_DEFAULT_NOISE_FLOOR;
8981 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG);
8984 #if IS_ENABLED(CONFIG_IPV6)
8985 static void ath11k_generate_ns_mc_addr(struct ath11k *ar,
8986 struct ath11k_arp_ns_offload *offload)
8990 for (i = 0; i < offload->ipv6_count; i++) {
8991 offload->self_ipv6_addr[i][0] = 0xff;
8992 offload->self_ipv6_addr[i][1] = 0x02;
8993 offload->self_ipv6_addr[i][11] = 0x01;
8994 offload->self_ipv6_addr[i][12] = 0xff;
8995 offload->self_ipv6_addr[i][13] =
8996 offload->ipv6_addr[i][13];
8997 offload->self_ipv6_addr[i][14] =
8998 offload->ipv6_addr[i][14];
8999 offload->self_ipv6_addr[i][15] =
9000 offload->ipv6_addr[i][15];
9001 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "NS solicited addr %pI6\n",
9002 offload->self_ipv6_addr[i]);
9006 static void ath11k_mac_op_ipv6_changed(struct ieee80211_hw *hw,
9007 struct ieee80211_vif *vif,
9008 struct inet6_dev *idev)
9010 struct ath11k *ar = hw->priv;
9011 struct ath11k_arp_ns_offload *offload;
9012 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
9013 struct inet6_ifaddr *ifa6;
9014 struct ifacaddr6 *ifaca6;
9015 struct list_head *p;
9018 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "op ipv6 changed\n");
9020 offload = &arvif->arp_ns_offload;
9023 read_lock_bh(&idev->lock);
9025 memset(offload->ipv6_addr, 0, sizeof(offload->ipv6_addr));
9026 memset(offload->self_ipv6_addr, 0, sizeof(offload->self_ipv6_addr));
9027 memcpy(offload->mac_addr, vif->addr, ETH_ALEN);
9029 /* get unicast address */
9030 list_for_each(p, &idev->addr_list) {
9031 if (count >= ATH11K_IPV6_MAX_COUNT)
9034 ifa6 = list_entry(p, struct inet6_ifaddr, if_list);
9035 if (ifa6->flags & IFA_F_DADFAILED)
9037 scope = ipv6_addr_src_scope(&ifa6->addr);
9038 if (scope == IPV6_ADDR_SCOPE_LINKLOCAL ||
9039 scope == IPV6_ADDR_SCOPE_GLOBAL) {
9040 memcpy(offload->ipv6_addr[count], &ifa6->addr.s6_addr,
9041 sizeof(ifa6->addr.s6_addr));
9042 offload->ipv6_type[count] = ATH11K_IPV6_UC_TYPE;
9043 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "count %d ipv6 uc %pI6 scope %d\n",
9044 count, offload->ipv6_addr[count],
9048 ath11k_warn(ar->ab, "Unsupported ipv6 scope: %d\n", scope);
9052 /* get anycast address */
9053 for (ifaca6 = idev->ac_list; ifaca6; ifaca6 = ifaca6->aca_next) {
9054 if (count >= ATH11K_IPV6_MAX_COUNT)
9057 scope = ipv6_addr_src_scope(&ifaca6->aca_addr);
9058 if (scope == IPV6_ADDR_SCOPE_LINKLOCAL ||
9059 scope == IPV6_ADDR_SCOPE_GLOBAL) {
9060 memcpy(offload->ipv6_addr[count], &ifaca6->aca_addr,
9061 sizeof(ifaca6->aca_addr));
9062 offload->ipv6_type[count] = ATH11K_IPV6_AC_TYPE;
9063 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "count %d ipv6 ac %pI6 scope %d\n",
9064 count, offload->ipv6_addr[count],
9068 ath11k_warn(ar->ab, "Unsupported ipv scope: %d\n", scope);
9073 offload->ipv6_count = count;
9074 read_unlock_bh(&idev->lock);
9076 /* generate ns multicast address */
9077 ath11k_generate_ns_mc_addr(ar, offload);
9081 static void ath11k_mac_op_set_rekey_data(struct ieee80211_hw *hw,
9082 struct ieee80211_vif *vif,
9083 struct cfg80211_gtk_rekey_data *data)
9085 struct ath11k *ar = hw->priv;
9086 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
9087 struct ath11k_rekey_data *rekey_data = &arvif->rekey_data;
9089 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "set rekey data vdev %d\n",
9092 mutex_lock(&ar->conf_mutex);
9094 memcpy(rekey_data->kck, data->kck, NL80211_KCK_LEN);
9095 memcpy(rekey_data->kek, data->kek, NL80211_KEK_LEN);
9097 /* The supplicant works on big-endian, the firmware expects it on
9100 rekey_data->replay_ctr = get_unaligned_be64(data->replay_ctr);
9102 arvif->rekey_data.enable_offload = true;
9104 ath11k_dbg_dump(ar->ab, ATH11K_DBG_MAC, "kck", NULL,
9105 rekey_data->kck, NL80211_KCK_LEN);
9106 ath11k_dbg_dump(ar->ab, ATH11K_DBG_MAC, "kek", NULL,
9107 rekey_data->kck, NL80211_KEK_LEN);
9108 ath11k_dbg_dump(ar->ab, ATH11K_DBG_MAC, "replay ctr", NULL,
9109 &rekey_data->replay_ctr, sizeof(rekey_data->replay_ctr));
9111 mutex_unlock(&ar->conf_mutex);
9114 static int ath11k_mac_op_set_bios_sar_specs(struct ieee80211_hw *hw,
9115 const struct cfg80211_sar_specs *sar)
9117 struct ath11k *ar = hw->priv;
9118 const struct cfg80211_sar_sub_specs *sspec;
9123 if (!sar || sar->type != NL80211_SAR_TYPE_POWER ||
9124 sar->num_sub_specs == 0)
9127 mutex_lock(&ar->conf_mutex);
9129 if (!test_bit(WMI_TLV_SERVICE_BIOS_SAR_SUPPORT, ar->ab->wmi_ab.svc_map) ||
9130 !ar->ab->hw_params.bios_sar_capa) {
9135 ret = ath11k_wmi_pdev_set_bios_geo_table_param(ar);
9137 ath11k_warn(ar->ab, "failed to set geo table: %d\n", ret);
9141 sar_tbl = kzalloc(BIOS_SAR_TABLE_LEN, GFP_KERNEL);
9147 sspec = sar->sub_specs;
9148 for (i = 0; i < sar->num_sub_specs; i++) {
9149 if (sspec->freq_range_index >= (BIOS_SAR_TABLE_LEN >> 1)) {
9150 ath11k_warn(ar->ab, "Ignore bad frequency index %u, max allowed %u\n",
9151 sspec->freq_range_index, BIOS_SAR_TABLE_LEN >> 1);
9155 /* chain0 and chain1 share same power setting */
9156 sar_tbl[sspec->freq_range_index] = sspec->power;
9157 index = sspec->freq_range_index + (BIOS_SAR_TABLE_LEN >> 1);
9158 sar_tbl[index] = sspec->power;
9159 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "sar tbl[%d] = %d\n",
9160 sspec->freq_range_index, sar_tbl[sspec->freq_range_index]);
9164 ret = ath11k_wmi_pdev_set_bios_sar_table_param(ar, sar_tbl);
9166 ath11k_warn(ar->ab, "failed to set sar power: %d", ret);
9170 mutex_unlock(&ar->conf_mutex);
9175 static int ath11k_mac_op_cancel_remain_on_channel(struct ieee80211_hw *hw,
9176 struct ieee80211_vif *vif)
9178 struct ath11k *ar = hw->priv;
9180 mutex_lock(&ar->conf_mutex);
9182 spin_lock_bh(&ar->data_lock);
9183 ar->scan.roc_notify = false;
9184 spin_unlock_bh(&ar->data_lock);
9186 ath11k_scan_abort(ar);
9188 mutex_unlock(&ar->conf_mutex);
9190 cancel_delayed_work_sync(&ar->scan.timeout);
9195 static int ath11k_mac_op_remain_on_channel(struct ieee80211_hw *hw,
9196 struct ieee80211_vif *vif,
9197 struct ieee80211_channel *chan,
9199 enum ieee80211_roc_type type)
9201 struct ath11k *ar = hw->priv;
9202 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
9203 struct scan_req_params *arg;
9207 mutex_lock(&ar->conf_mutex);
9209 spin_lock_bh(&ar->data_lock);
9210 switch (ar->scan.state) {
9211 case ATH11K_SCAN_IDLE:
9212 reinit_completion(&ar->scan.started);
9213 reinit_completion(&ar->scan.completed);
9214 reinit_completion(&ar->scan.on_channel);
9215 ar->scan.state = ATH11K_SCAN_STARTING;
9216 ar->scan.is_roc = true;
9217 ar->scan.vdev_id = arvif->vdev_id;
9218 ar->scan.roc_freq = chan->center_freq;
9219 ar->scan.roc_notify = true;
9222 case ATH11K_SCAN_STARTING:
9223 case ATH11K_SCAN_RUNNING:
9224 case ATH11K_SCAN_ABORTING:
9228 spin_unlock_bh(&ar->data_lock);
9233 scan_time_msec = ar->hw->wiphy->max_remain_on_channel_duration * 2;
9235 arg = kzalloc(sizeof(*arg), GFP_KERNEL);
9240 ath11k_wmi_start_scan_init(ar, arg);
9242 arg->chan_list = kcalloc(arg->num_chan, sizeof(*arg->chan_list),
9244 if (!arg->chan_list) {
9249 arg->vdev_id = arvif->vdev_id;
9250 arg->scan_id = ATH11K_SCAN_ID;
9251 arg->chan_list[0] = chan->center_freq;
9252 arg->dwell_time_active = scan_time_msec;
9253 arg->dwell_time_passive = scan_time_msec;
9254 arg->max_scan_time = scan_time_msec;
9255 arg->scan_f_passive = 1;
9256 arg->scan_f_filter_prb_req = 1;
9257 arg->burst_duration = duration;
9259 ret = ath11k_start_scan(ar, arg);
9261 ath11k_warn(ar->ab, "failed to start roc scan: %d\n", ret);
9263 spin_lock_bh(&ar->data_lock);
9264 ar->scan.state = ATH11K_SCAN_IDLE;
9265 spin_unlock_bh(&ar->data_lock);
9266 goto free_chan_list;
9269 ret = wait_for_completion_timeout(&ar->scan.on_channel, 3 * HZ);
9271 ath11k_warn(ar->ab, "failed to switch to channel for roc scan\n");
9272 ret = ath11k_scan_stop(ar);
9274 ath11k_warn(ar->ab, "failed to stop scan: %d\n", ret);
9276 goto free_chan_list;
9279 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
9280 msecs_to_jiffies(duration));
9285 kfree(arg->chan_list);
9289 mutex_unlock(&ar->conf_mutex);
9293 static int ath11k_fw_stats_request(struct ath11k *ar,
9294 struct stats_request_params *req_param)
9296 struct ath11k_base *ab = ar->ab;
9297 unsigned long time_left;
9300 lockdep_assert_held(&ar->conf_mutex);
9302 spin_lock_bh(&ar->data_lock);
9303 ar->fw_stats_done = false;
9304 ath11k_fw_stats_pdevs_free(&ar->fw_stats.pdevs);
9305 spin_unlock_bh(&ar->data_lock);
9307 reinit_completion(&ar->fw_stats_complete);
9309 ret = ath11k_wmi_send_stats_request_cmd(ar, req_param);
9311 ath11k_warn(ab, "could not request fw stats (%d)\n",
9316 time_left = wait_for_completion_timeout(&ar->fw_stats_complete,
9325 static int ath11k_mac_op_get_txpower(struct ieee80211_hw *hw,
9326 struct ieee80211_vif *vif,
9329 struct ath11k *ar = hw->priv;
9330 struct ath11k_base *ab = ar->ab;
9331 struct stats_request_params req_param = {0};
9332 struct ath11k_fw_stats_pdev *pdev;
9335 /* Final Tx power is minimum of Target Power, CTL power, Regulatory
9336 * Power, PSD EIRP Power. We just know the Regulatory power from the
9337 * regulatory rules obtained. FW knows all these power and sets the min
9338 * of these. Hence, we request the FW pdev stats in which FW reports
9339 * the minimum of all vdev's channel Tx power.
9341 mutex_lock(&ar->conf_mutex);
9343 if (ar->state != ATH11K_STATE_ON)
9346 /* Firmware doesn't provide Tx power during CAC hence no need to fetch
9349 if (test_bit(ATH11K_CAC_RUNNING, &ar->dev_flags)) {
9350 mutex_unlock(&ar->conf_mutex);
9354 req_param.pdev_id = ar->pdev->pdev_id;
9355 req_param.stats_id = WMI_REQUEST_PDEV_STAT;
9357 ret = ath11k_fw_stats_request(ar, &req_param);
9359 ath11k_warn(ab, "failed to request fw pdev stats: %d\n", ret);
9363 spin_lock_bh(&ar->data_lock);
9364 pdev = list_first_entry_or_null(&ar->fw_stats.pdevs,
9365 struct ath11k_fw_stats_pdev, list);
9367 spin_unlock_bh(&ar->data_lock);
9371 /* tx power is set as 2 units per dBm in FW. */
9372 *dbm = pdev->chan_tx_power / 2;
9374 spin_unlock_bh(&ar->data_lock);
9375 mutex_unlock(&ar->conf_mutex);
9377 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "txpower from firmware %d, reported %d dBm\n",
9378 pdev->chan_tx_power, *dbm);
9382 mutex_unlock(&ar->conf_mutex);
9383 /* We didn't get txpower from FW. Hence, relying on vif->bss_conf.txpower */
9384 *dbm = vif->bss_conf.txpower;
9385 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "txpower from firmware NaN, reported %d dBm\n",
9390 static int ath11k_mac_station_add(struct ath11k *ar,
9391 struct ieee80211_vif *vif,
9392 struct ieee80211_sta *sta)
9394 struct ath11k_base *ab = ar->ab;
9395 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
9396 struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
9397 struct peer_create_params peer_param;
9400 lockdep_assert_held(&ar->conf_mutex);
9402 ret = ath11k_mac_inc_num_stations(arvif, sta);
9404 ath11k_warn(ab, "refusing to associate station: too many connected already (%d)\n",
9405 ar->max_num_stations);
9409 arsta->rx_stats = kzalloc(sizeof(*arsta->rx_stats), GFP_KERNEL);
9410 if (!arsta->rx_stats) {
9412 goto dec_num_station;
9415 peer_param.vdev_id = arvif->vdev_id;
9416 peer_param.peer_addr = sta->addr;
9417 peer_param.peer_type = WMI_PEER_TYPE_DEFAULT;
9419 ret = ath11k_peer_create(ar, arvif, sta, &peer_param);
9421 ath11k_warn(ab, "Failed to add peer: %pM for VDEV: %d\n",
9422 sta->addr, arvif->vdev_id);
9426 ath11k_dbg(ab, ATH11K_DBG_MAC, "Added peer: %pM for VDEV: %d\n",
9427 sta->addr, arvif->vdev_id);
9429 if (ath11k_debugfs_is_extd_tx_stats_enabled(ar)) {
9430 arsta->tx_stats = kzalloc(sizeof(*arsta->tx_stats), GFP_KERNEL);
9431 if (!arsta->tx_stats) {
9437 if (ieee80211_vif_is_mesh(vif)) {
9438 ath11k_dbg(ab, ATH11K_DBG_MAC,
9439 "setting USE_4ADDR for mesh STA %pM\n", sta->addr);
9440 ret = ath11k_wmi_set_peer_param(ar, sta->addr,
9442 WMI_PEER_USE_4ADDR, 1);
9444 ath11k_warn(ab, "failed to set mesh STA %pM 4addr capability: %d\n",
9450 ret = ath11k_dp_peer_setup(ar, arvif->vdev_id, sta->addr);
9452 ath11k_warn(ab, "failed to setup dp for peer %pM on vdev %i (%d)\n",
9453 sta->addr, arvif->vdev_id, ret);
9457 if (ab->hw_params.vdev_start_delay &&
9458 !arvif->is_started &&
9459 arvif->vdev_type != WMI_VDEV_TYPE_AP) {
9460 ret = ath11k_mac_start_vdev_delay(ar->hw, vif);
9462 ath11k_warn(ab, "failed to delay vdev start: %d\n", ret);
9467 ewma_avg_rssi_init(&arsta->avg_rssi);
9471 kfree(arsta->tx_stats);
9472 arsta->tx_stats = NULL;
9474 ath11k_peer_delete(ar, arvif->vdev_id, sta->addr);
9476 kfree(arsta->rx_stats);
9477 arsta->rx_stats = NULL;
9479 ath11k_mac_dec_num_stations(arvif, sta);
9484 static int ath11k_mac_station_remove(struct ath11k *ar,
9485 struct ieee80211_vif *vif,
9486 struct ieee80211_sta *sta)
9488 struct ath11k_base *ab = ar->ab;
9489 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
9490 struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
9493 if (ab->hw_params.vdev_start_delay &&
9494 arvif->is_started &&
9495 arvif->vdev_type != WMI_VDEV_TYPE_AP) {
9496 ret = ath11k_mac_stop_vdev_early(ar->hw, vif);
9498 ath11k_warn(ab, "failed to do early vdev stop: %d\n", ret);
9503 ath11k_dp_peer_cleanup(ar, arvif->vdev_id, sta->addr);
9505 ret = ath11k_peer_delete(ar, arvif->vdev_id, sta->addr);
9507 ath11k_warn(ab, "Failed to delete peer: %pM for VDEV: %d\n",
9508 sta->addr, arvif->vdev_id);
9510 ath11k_dbg(ab, ATH11K_DBG_MAC, "Removed peer: %pM for VDEV: %d\n",
9511 sta->addr, arvif->vdev_id);
9513 ath11k_mac_dec_num_stations(arvif, sta);
9515 kfree(arsta->tx_stats);
9516 arsta->tx_stats = NULL;
9518 kfree(arsta->rx_stats);
9519 arsta->rx_stats = NULL;
9524 static int ath11k_mac_op_sta_state(struct ieee80211_hw *hw,
9525 struct ieee80211_vif *vif,
9526 struct ieee80211_sta *sta,
9527 enum ieee80211_sta_state old_state,
9528 enum ieee80211_sta_state new_state)
9530 struct ath11k *ar = hw->priv;
9531 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
9532 struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
9533 struct ath11k_peer *peer;
9536 /* cancel must be done outside the mutex to avoid deadlock */
9537 if ((old_state == IEEE80211_STA_NONE &&
9538 new_state == IEEE80211_STA_NOTEXIST)) {
9539 cancel_work_sync(&arsta->update_wk);
9540 cancel_work_sync(&arsta->set_4addr_wk);
9543 mutex_lock(&ar->conf_mutex);
9545 if (old_state == IEEE80211_STA_NOTEXIST &&
9546 new_state == IEEE80211_STA_NONE) {
9547 memset(arsta, 0, sizeof(*arsta));
9548 arsta->arvif = arvif;
9549 arsta->peer_ps_state = WMI_PEER_PS_STATE_DISABLED;
9550 INIT_WORK(&arsta->update_wk, ath11k_sta_rc_update_wk);
9551 INIT_WORK(&arsta->set_4addr_wk, ath11k_sta_set_4addr_wk);
9553 ret = ath11k_mac_station_add(ar, vif, sta);
9555 ath11k_warn(ar->ab, "Failed to add station: %pM for VDEV: %d\n",
9556 sta->addr, arvif->vdev_id);
9557 } else if ((old_state == IEEE80211_STA_NONE &&
9558 new_state == IEEE80211_STA_NOTEXIST)) {
9559 ret = ath11k_mac_station_remove(ar, vif, sta);
9561 ath11k_warn(ar->ab, "Failed to remove station: %pM for VDEV: %d\n",
9562 sta->addr, arvif->vdev_id);
9564 mutex_lock(&ar->ab->tbl_mtx_lock);
9565 spin_lock_bh(&ar->ab->base_lock);
9566 peer = ath11k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
9567 if (peer && peer->sta == sta) {
9568 ath11k_warn(ar->ab, "Found peer entry %pM n vdev %i after it was supposedly removed\n",
9569 vif->addr, arvif->vdev_id);
9570 ath11k_peer_rhash_delete(ar->ab, peer);
9572 list_del(&peer->list);
9576 spin_unlock_bh(&ar->ab->base_lock);
9577 mutex_unlock(&ar->ab->tbl_mtx_lock);
9578 } else if (old_state == IEEE80211_STA_AUTH &&
9579 new_state == IEEE80211_STA_ASSOC &&
9580 (vif->type == NL80211_IFTYPE_AP ||
9581 vif->type == NL80211_IFTYPE_MESH_POINT ||
9582 vif->type == NL80211_IFTYPE_ADHOC)) {
9583 ret = ath11k_station_assoc(ar, vif, sta, false);
9585 ath11k_warn(ar->ab, "Failed to associate station: %pM\n",
9588 spin_lock_bh(&ar->data_lock);
9589 /* Set arsta bw and prev bw */
9590 arsta->bw = ath11k_mac_ieee80211_sta_bw_to_wmi(ar, sta);
9591 arsta->bw_prev = arsta->bw;
9592 spin_unlock_bh(&ar->data_lock);
9593 } else if (old_state == IEEE80211_STA_ASSOC &&
9594 new_state == IEEE80211_STA_AUTHORIZED) {
9595 spin_lock_bh(&ar->ab->base_lock);
9597 peer = ath11k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
9599 peer->is_authorized = true;
9601 spin_unlock_bh(&ar->ab->base_lock);
9603 if (vif->type == NL80211_IFTYPE_STATION && arvif->is_up) {
9604 ret = ath11k_wmi_set_peer_param(ar, sta->addr,
9609 ath11k_warn(ar->ab, "Unable to authorize peer %pM vdev %d: %d\n",
9610 sta->addr, arvif->vdev_id, ret);
9612 } else if (old_state == IEEE80211_STA_AUTHORIZED &&
9613 new_state == IEEE80211_STA_ASSOC) {
9614 spin_lock_bh(&ar->ab->base_lock);
9616 peer = ath11k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
9618 peer->is_authorized = false;
9620 spin_unlock_bh(&ar->ab->base_lock);
9621 } else if (old_state == IEEE80211_STA_ASSOC &&
9622 new_state == IEEE80211_STA_AUTH &&
9623 (vif->type == NL80211_IFTYPE_AP ||
9624 vif->type == NL80211_IFTYPE_MESH_POINT ||
9625 vif->type == NL80211_IFTYPE_ADHOC)) {
9626 ret = ath11k_station_disassoc(ar, vif, sta);
9628 ath11k_warn(ar->ab, "Failed to disassociate station: %pM\n",
9632 mutex_unlock(&ar->conf_mutex);
9636 static const struct ieee80211_ops ath11k_ops = {
9637 .tx = ath11k_mac_op_tx,
9638 .wake_tx_queue = ieee80211_handle_wake_tx_queue,
9639 .start = ath11k_mac_op_start,
9640 .stop = ath11k_mac_op_stop,
9641 .reconfig_complete = ath11k_mac_op_reconfig_complete,
9642 .add_interface = ath11k_mac_op_add_interface,
9643 .remove_interface = ath11k_mac_op_remove_interface,
9644 .update_vif_offload = ath11k_mac_op_update_vif_offload,
9645 .config = ath11k_mac_op_config,
9646 .bss_info_changed = ath11k_mac_op_bss_info_changed,
9647 .configure_filter = ath11k_mac_op_configure_filter,
9648 .hw_scan = ath11k_mac_op_hw_scan,
9649 .cancel_hw_scan = ath11k_mac_op_cancel_hw_scan,
9650 .set_key = ath11k_mac_op_set_key,
9651 .set_rekey_data = ath11k_mac_op_set_rekey_data,
9652 .sta_state = ath11k_mac_op_sta_state,
9653 .sta_set_4addr = ath11k_mac_op_sta_set_4addr,
9654 .sta_set_txpwr = ath11k_mac_op_sta_set_txpwr,
9655 .sta_rc_update = ath11k_mac_op_sta_rc_update,
9656 .conf_tx = ath11k_mac_op_conf_tx,
9657 .set_antenna = ath11k_mac_op_set_antenna,
9658 .get_antenna = ath11k_mac_op_get_antenna,
9659 .ampdu_action = ath11k_mac_op_ampdu_action,
9660 .add_chanctx = ath11k_mac_op_add_chanctx,
9661 .remove_chanctx = ath11k_mac_op_remove_chanctx,
9662 .change_chanctx = ath11k_mac_op_change_chanctx,
9663 .assign_vif_chanctx = ath11k_mac_op_assign_vif_chanctx,
9664 .unassign_vif_chanctx = ath11k_mac_op_unassign_vif_chanctx,
9665 .switch_vif_chanctx = ath11k_mac_op_switch_vif_chanctx,
9666 .set_rts_threshold = ath11k_mac_op_set_rts_threshold,
9667 .set_frag_threshold = ath11k_mac_op_set_frag_threshold,
9668 .set_bitrate_mask = ath11k_mac_op_set_bitrate_mask,
9669 .get_survey = ath11k_mac_op_get_survey,
9670 .flush = ath11k_mac_op_flush,
9671 .sta_statistics = ath11k_mac_op_sta_statistics,
9672 CFG80211_TESTMODE_CMD(ath11k_tm_cmd)
9675 .suspend = ath11k_wow_op_suspend,
9676 .resume = ath11k_wow_op_resume,
9677 .set_wakeup = ath11k_wow_op_set_wakeup,
9680 #ifdef CONFIG_ATH11K_DEBUGFS
9681 .vif_add_debugfs = ath11k_debugfs_op_vif_add,
9682 .sta_add_debugfs = ath11k_debugfs_sta_op_add,
9685 #if IS_ENABLED(CONFIG_IPV6)
9686 .ipv6_addr_change = ath11k_mac_op_ipv6_changed,
9688 .get_txpower = ath11k_mac_op_get_txpower,
9690 .set_sar_specs = ath11k_mac_op_set_bios_sar_specs,
9691 .remain_on_channel = ath11k_mac_op_remain_on_channel,
9692 .cancel_remain_on_channel = ath11k_mac_op_cancel_remain_on_channel,
9695 static void ath11k_mac_update_ch_list(struct ath11k *ar,
9696 struct ieee80211_supported_band *band,
9697 u32 freq_low, u32 freq_high)
9701 if (!(freq_low && freq_high))
9704 for (i = 0; i < band->n_channels; i++) {
9705 if (band->channels[i].center_freq < freq_low ||
9706 band->channels[i].center_freq > freq_high)
9707 band->channels[i].flags |= IEEE80211_CHAN_DISABLED;
9711 static u32 ath11k_get_phy_id(struct ath11k *ar, u32 band)
9713 struct ath11k_pdev *pdev = ar->pdev;
9714 struct ath11k_pdev_cap *pdev_cap = &pdev->cap;
9716 if (band == WMI_HOST_WLAN_2G_CAP)
9717 return pdev_cap->band[NL80211_BAND_2GHZ].phy_id;
9719 if (band == WMI_HOST_WLAN_5G_CAP)
9720 return pdev_cap->band[NL80211_BAND_5GHZ].phy_id;
9722 ath11k_warn(ar->ab, "unsupported phy cap:%d\n", band);
9727 static int ath11k_mac_setup_channels_rates(struct ath11k *ar,
9728 u32 supported_bands)
9730 struct ieee80211_supported_band *band;
9731 struct ath11k_hal_reg_capabilities_ext *reg_cap, *temp_reg_cap;
9735 BUILD_BUG_ON((ARRAY_SIZE(ath11k_2ghz_channels) +
9736 ARRAY_SIZE(ath11k_5ghz_channels) +
9737 ARRAY_SIZE(ath11k_6ghz_channels)) !=
9740 reg_cap = &ar->ab->hal_reg_cap[ar->pdev_idx];
9741 temp_reg_cap = reg_cap;
9743 if (supported_bands & WMI_HOST_WLAN_2G_CAP) {
9744 channels = kmemdup(ath11k_2ghz_channels,
9745 sizeof(ath11k_2ghz_channels),
9750 band = &ar->mac.sbands[NL80211_BAND_2GHZ];
9751 band->band = NL80211_BAND_2GHZ;
9752 band->n_channels = ARRAY_SIZE(ath11k_2ghz_channels);
9753 band->channels = channels;
9754 band->n_bitrates = ath11k_g_rates_size;
9755 band->bitrates = ath11k_g_rates;
9756 ar->hw->wiphy->bands[NL80211_BAND_2GHZ] = band;
9758 if (ar->ab->hw_params.single_pdev_only) {
9759 phy_id = ath11k_get_phy_id(ar, WMI_HOST_WLAN_2G_CAP);
9760 temp_reg_cap = &ar->ab->hal_reg_cap[phy_id];
9762 ath11k_mac_update_ch_list(ar, band,
9763 temp_reg_cap->low_2ghz_chan,
9764 temp_reg_cap->high_2ghz_chan);
9767 if (supported_bands & WMI_HOST_WLAN_5G_CAP) {
9768 if (reg_cap->high_5ghz_chan >= ATH11K_MIN_6G_FREQ) {
9769 channels = kmemdup(ath11k_6ghz_channels,
9770 sizeof(ath11k_6ghz_channels), GFP_KERNEL);
9772 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
9776 ar->supports_6ghz = true;
9777 band = &ar->mac.sbands[NL80211_BAND_6GHZ];
9778 band->band = NL80211_BAND_6GHZ;
9779 band->n_channels = ARRAY_SIZE(ath11k_6ghz_channels);
9780 band->channels = channels;
9781 band->n_bitrates = ath11k_a_rates_size;
9782 band->bitrates = ath11k_a_rates;
9783 ar->hw->wiphy->bands[NL80211_BAND_6GHZ] = band;
9785 if (ar->ab->hw_params.single_pdev_only) {
9786 phy_id = ath11k_get_phy_id(ar, WMI_HOST_WLAN_5G_CAP);
9787 temp_reg_cap = &ar->ab->hal_reg_cap[phy_id];
9790 ath11k_mac_update_ch_list(ar, band,
9791 temp_reg_cap->low_5ghz_chan,
9792 temp_reg_cap->high_5ghz_chan);
9795 if (reg_cap->low_5ghz_chan < ATH11K_MIN_6G_FREQ) {
9796 channels = kmemdup(ath11k_5ghz_channels,
9797 sizeof(ath11k_5ghz_channels),
9800 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
9801 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
9805 band = &ar->mac.sbands[NL80211_BAND_5GHZ];
9806 band->band = NL80211_BAND_5GHZ;
9807 band->n_channels = ARRAY_SIZE(ath11k_5ghz_channels);
9808 band->channels = channels;
9809 band->n_bitrates = ath11k_a_rates_size;
9810 band->bitrates = ath11k_a_rates;
9811 ar->hw->wiphy->bands[NL80211_BAND_5GHZ] = band;
9813 if (ar->ab->hw_params.single_pdev_only) {
9814 phy_id = ath11k_get_phy_id(ar, WMI_HOST_WLAN_5G_CAP);
9815 temp_reg_cap = &ar->ab->hal_reg_cap[phy_id];
9818 ath11k_mac_update_ch_list(ar, band,
9819 temp_reg_cap->low_5ghz_chan,
9820 temp_reg_cap->high_5ghz_chan);
9827 static void ath11k_mac_setup_mac_address_list(struct ath11k *ar)
9829 struct mac_address *addresses;
9833 if (!ar->ab->hw_params.support_dual_stations)
9836 n_addresses = ar->ab->hw_params.num_vdevs;
9837 addresses = kcalloc(n_addresses, sizeof(*addresses), GFP_KERNEL);
9841 memcpy(addresses[0].addr, ar->mac_addr, ETH_ALEN);
9842 for (i = 1; i < n_addresses; i++) {
9843 memcpy(addresses[i].addr, ar->mac_addr, ETH_ALEN);
9844 /* set Local Administered Address bit */
9845 addresses[i].addr[0] |= 0x2;
9847 addresses[i].addr[0] += (i - 1) << 4;
9850 ar->hw->wiphy->addresses = addresses;
9851 ar->hw->wiphy->n_addresses = n_addresses;
9854 static int ath11k_mac_setup_iface_combinations(struct ath11k *ar)
9856 struct ath11k_base *ab = ar->ab;
9857 struct ieee80211_iface_combination *combinations;
9858 struct ieee80211_iface_limit *limits;
9861 combinations = kzalloc(sizeof(*combinations), GFP_KERNEL);
9867 limits = kcalloc(n_limits, sizeof(*limits), GFP_KERNEL);
9869 kfree(combinations);
9873 if (ab->hw_params.support_dual_stations) {
9875 limits[0].types |= BIT(NL80211_IFTYPE_STATION);
9878 limits[1].types |= BIT(NL80211_IFTYPE_AP);
9879 if (IS_ENABLED(CONFIG_MAC80211_MESH) &&
9880 ab->hw_params.interface_modes & BIT(NL80211_IFTYPE_MESH_POINT))
9881 limits[1].types |= BIT(NL80211_IFTYPE_MESH_POINT);
9883 combinations[0].limits = limits;
9884 combinations[0].n_limits = 2;
9885 combinations[0].max_interfaces = ab->hw_params.num_vdevs;
9886 combinations[0].num_different_channels = 2;
9887 combinations[0].beacon_int_infra_match = true;
9888 combinations[0].beacon_int_min_gcd = 100;
9891 limits[0].types |= BIT(NL80211_IFTYPE_STATION);
9894 limits[1].types |= BIT(NL80211_IFTYPE_AP);
9896 if (IS_ENABLED(CONFIG_MAC80211_MESH) &&
9897 ab->hw_params.interface_modes & BIT(NL80211_IFTYPE_MESH_POINT))
9898 limits[1].types |= BIT(NL80211_IFTYPE_MESH_POINT);
9900 combinations[0].limits = limits;
9901 combinations[0].n_limits = 2;
9902 combinations[0].max_interfaces = 16;
9903 combinations[0].num_different_channels = 1;
9904 combinations[0].beacon_int_infra_match = true;
9905 combinations[0].beacon_int_min_gcd = 100;
9906 combinations[0].radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
9907 BIT(NL80211_CHAN_WIDTH_20) |
9908 BIT(NL80211_CHAN_WIDTH_40) |
9909 BIT(NL80211_CHAN_WIDTH_80) |
9910 BIT(NL80211_CHAN_WIDTH_80P80) |
9911 BIT(NL80211_CHAN_WIDTH_160);
9914 ar->hw->wiphy->iface_combinations = combinations;
9915 ar->hw->wiphy->n_iface_combinations = 1;
9920 static const u8 ath11k_if_types_ext_capa[] = {
9921 [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
9922 [2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT,
9923 [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
9926 static const u8 ath11k_if_types_ext_capa_sta[] = {
9927 [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
9928 [2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT,
9929 [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
9930 [9] = WLAN_EXT_CAPA10_TWT_REQUESTER_SUPPORT,
9933 static const u8 ath11k_if_types_ext_capa_ap[] = {
9934 [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
9935 [2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT,
9936 [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
9937 [9] = WLAN_EXT_CAPA10_TWT_RESPONDER_SUPPORT,
9938 [10] = WLAN_EXT_CAPA11_EMA_SUPPORT,
9941 static const struct wiphy_iftype_ext_capab ath11k_iftypes_ext_capa[] = {
9943 .extended_capabilities = ath11k_if_types_ext_capa,
9944 .extended_capabilities_mask = ath11k_if_types_ext_capa,
9945 .extended_capabilities_len = sizeof(ath11k_if_types_ext_capa),
9947 .iftype = NL80211_IFTYPE_STATION,
9948 .extended_capabilities = ath11k_if_types_ext_capa_sta,
9949 .extended_capabilities_mask = ath11k_if_types_ext_capa_sta,
9950 .extended_capabilities_len =
9951 sizeof(ath11k_if_types_ext_capa_sta),
9953 .iftype = NL80211_IFTYPE_AP,
9954 .extended_capabilities = ath11k_if_types_ext_capa_ap,
9955 .extended_capabilities_mask = ath11k_if_types_ext_capa_ap,
9956 .extended_capabilities_len =
9957 sizeof(ath11k_if_types_ext_capa_ap),
9961 static void __ath11k_mac_unregister(struct ath11k *ar)
9963 cancel_work_sync(&ar->regd_update_work);
9965 ieee80211_unregister_hw(ar->hw);
9967 idr_for_each(&ar->txmgmt_idr, ath11k_mac_tx_mgmt_pending_free, ar);
9968 idr_destroy(&ar->txmgmt_idr);
9970 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
9971 kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels);
9972 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
9974 kfree(ar->hw->wiphy->iface_combinations[0].limits);
9975 kfree(ar->hw->wiphy->iface_combinations);
9977 kfree(ar->hw->wiphy->addresses);
9979 SET_IEEE80211_DEV(ar->hw, NULL);
9982 void ath11k_mac_unregister(struct ath11k_base *ab)
9985 struct ath11k_pdev *pdev;
9988 for (i = 0; i < ab->num_radios; i++) {
9989 pdev = &ab->pdevs[i];
9994 __ath11k_mac_unregister(ar);
9997 ath11k_peer_rhash_tbl_destroy(ab);
10000 static int __ath11k_mac_register(struct ath11k *ar)
10002 struct ath11k_base *ab = ar->ab;
10003 struct ath11k_pdev_cap *cap = &ar->pdev->cap;
10004 static const u32 cipher_suites[] = {
10005 WLAN_CIPHER_SUITE_TKIP,
10006 WLAN_CIPHER_SUITE_CCMP,
10007 WLAN_CIPHER_SUITE_AES_CMAC,
10008 WLAN_CIPHER_SUITE_BIP_CMAC_256,
10009 WLAN_CIPHER_SUITE_BIP_GMAC_128,
10010 WLAN_CIPHER_SUITE_BIP_GMAC_256,
10011 WLAN_CIPHER_SUITE_GCMP,
10012 WLAN_CIPHER_SUITE_GCMP_256,
10013 WLAN_CIPHER_SUITE_CCMP_256,
10018 ath11k_pdev_caps_update(ar);
10020 SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr);
10021 ath11k_mac_setup_mac_address_list(ar);
10023 SET_IEEE80211_DEV(ar->hw, ab->dev);
10025 ret = ath11k_mac_setup_channels_rates(ar,
10026 cap->supported_bands);
10030 ath11k_mac_setup_ht_vht_cap(ar, cap, &ht_cap);
10031 ath11k_mac_setup_he_cap(ar, cap);
10033 ret = ath11k_mac_setup_iface_combinations(ar);
10035 ath11k_err(ar->ab, "failed to setup interface combinations: %d\n", ret);
10036 goto err_free_channels;
10039 ar->hw->wiphy->available_antennas_rx = cap->rx_chain_mask;
10040 ar->hw->wiphy->available_antennas_tx = cap->tx_chain_mask;
10042 ar->hw->wiphy->interface_modes = ab->hw_params.interface_modes;
10044 if (ab->hw_params.single_pdev_only && ar->supports_6ghz)
10045 ieee80211_hw_set(ar->hw, SINGLE_SCAN_ON_ALL_BANDS);
10047 if (ab->hw_params.supports_multi_bssid) {
10048 ieee80211_hw_set(ar->hw, SUPPORTS_MULTI_BSSID);
10049 ieee80211_hw_set(ar->hw, SUPPORTS_ONLY_HE_MULTI_BSSID);
10052 ieee80211_hw_set(ar->hw, SIGNAL_DBM);
10053 ieee80211_hw_set(ar->hw, SUPPORTS_PS);
10054 ieee80211_hw_set(ar->hw, SUPPORTS_DYNAMIC_PS);
10055 ieee80211_hw_set(ar->hw, MFP_CAPABLE);
10056 ieee80211_hw_set(ar->hw, REPORTS_TX_ACK_STATUS);
10057 ieee80211_hw_set(ar->hw, HAS_RATE_CONTROL);
10058 ieee80211_hw_set(ar->hw, AP_LINK_PS);
10059 ieee80211_hw_set(ar->hw, SPECTRUM_MGMT);
10060 ieee80211_hw_set(ar->hw, CONNECTION_MONITOR);
10061 ieee80211_hw_set(ar->hw, SUPPORTS_PER_STA_GTK);
10062 ieee80211_hw_set(ar->hw, WANT_MONITOR_VIF);
10063 ieee80211_hw_set(ar->hw, CHANCTX_STA_CSA);
10064 ieee80211_hw_set(ar->hw, QUEUE_CONTROL);
10065 ieee80211_hw_set(ar->hw, SUPPORTS_TX_FRAG);
10066 ieee80211_hw_set(ar->hw, REPORTS_LOW_ACK);
10068 if (ath11k_frame_mode == ATH11K_HW_TXRX_ETHERNET) {
10069 ieee80211_hw_set(ar->hw, SUPPORTS_TX_ENCAP_OFFLOAD);
10070 ieee80211_hw_set(ar->hw, SUPPORTS_RX_DECAP_OFFLOAD);
10073 if (cap->nss_ratio_enabled)
10074 ieee80211_hw_set(ar->hw, SUPPORTS_VHT_EXT_NSS_BW);
10076 if ((ht_cap & WMI_HT_CAP_ENABLED) || ar->supports_6ghz) {
10077 ieee80211_hw_set(ar->hw, AMPDU_AGGREGATION);
10078 ieee80211_hw_set(ar->hw, TX_AMPDU_SETUP_IN_HW);
10079 ieee80211_hw_set(ar->hw, SUPPORTS_REORDERING_BUFFER);
10080 ieee80211_hw_set(ar->hw, SUPPORTS_AMSDU_IN_AMPDU);
10081 ieee80211_hw_set(ar->hw, USES_RSS);
10084 ar->hw->wiphy->features |= NL80211_FEATURE_STATIC_SMPS;
10085 ar->hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
10087 /* TODO: Check if HT capability advertised from firmware is different
10088 * for each band for a dual band capable radio. It will be tricky to
10089 * handle it when the ht capability different for each band.
10091 if (ht_cap & WMI_HT_CAP_DYNAMIC_SMPS ||
10092 (ar->supports_6ghz && ab->hw_params.supports_dynamic_smps_6ghz))
10093 ar->hw->wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS;
10095 ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID;
10096 ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN;
10098 ar->hw->max_listen_interval = ATH11K_MAX_HW_LISTEN_INTERVAL;
10100 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
10101 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
10102 ar->hw->wiphy->max_remain_on_channel_duration = 5000;
10104 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
10105 ar->hw->wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE |
10106 NL80211_FEATURE_AP_SCAN;
10108 ar->max_num_stations = TARGET_NUM_STATIONS(ab);
10109 ar->max_num_peers = TARGET_NUM_PEERS_PDEV(ab);
10111 ar->hw->wiphy->max_ap_assoc_sta = ar->max_num_stations;
10113 if (test_bit(WMI_TLV_SERVICE_SPOOF_MAC_SUPPORT, ar->wmi->wmi_ab->svc_map)) {
10114 ar->hw->wiphy->features |=
10115 NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR;
10118 if (test_bit(WMI_TLV_SERVICE_NLO, ar->wmi->wmi_ab->svc_map)) {
10119 ar->hw->wiphy->max_sched_scan_ssids = WMI_PNO_MAX_SUPP_NETWORKS;
10120 ar->hw->wiphy->max_match_sets = WMI_PNO_MAX_SUPP_NETWORKS;
10121 ar->hw->wiphy->max_sched_scan_ie_len = WMI_PNO_MAX_IE_LENGTH;
10122 ar->hw->wiphy->max_sched_scan_plans = WMI_PNO_MAX_SCHED_SCAN_PLANS;
10123 ar->hw->wiphy->max_sched_scan_plan_interval =
10124 WMI_PNO_MAX_SCHED_SCAN_PLAN_INT;
10125 ar->hw->wiphy->max_sched_scan_plan_iterations =
10126 WMI_PNO_MAX_SCHED_SCAN_PLAN_ITRNS;
10127 ar->hw->wiphy->features |= NL80211_FEATURE_ND_RANDOM_MAC_ADDR;
10130 ret = ath11k_wow_init(ar);
10132 ath11k_warn(ar->ab, "failed to init wow: %d\n", ret);
10133 goto err_free_if_combs;
10136 if (test_bit(WMI_TLV_SERVICE_TX_DATA_MGMT_ACK_RSSI,
10137 ar->ab->wmi_ab.svc_map))
10138 wiphy_ext_feature_set(ar->hw->wiphy,
10139 NL80211_EXT_FEATURE_ACK_SIGNAL_SUPPORT);
10141 ar->hw->queues = ATH11K_HW_MAX_QUEUES;
10142 ar->hw->wiphy->tx_queue_len = ATH11K_QUEUE_LEN;
10143 ar->hw->offchannel_tx_hw_queue = ATH11K_HW_MAX_QUEUES - 1;
10144 ar->hw->max_rx_aggregation_subframes = IEEE80211_MAX_AMPDU_BUF_HE;
10146 ar->hw->vif_data_size = sizeof(struct ath11k_vif);
10147 ar->hw->sta_data_size = sizeof(struct ath11k_sta);
10149 wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
10150 wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_STA_TX_PWR);
10151 if (test_bit(WMI_TLV_SERVICE_BSS_COLOR_OFFLOAD,
10152 ar->ab->wmi_ab.svc_map)) {
10153 wiphy_ext_feature_set(ar->hw->wiphy,
10154 NL80211_EXT_FEATURE_BSS_COLOR);
10155 ieee80211_hw_set(ar->hw, DETECTS_COLOR_COLLISION);
10158 ar->hw->wiphy->cipher_suites = cipher_suites;
10159 ar->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
10161 ar->hw->wiphy->iftype_ext_capab = ath11k_iftypes_ext_capa;
10162 ar->hw->wiphy->num_iftype_ext_capab =
10163 ARRAY_SIZE(ath11k_iftypes_ext_capa);
10165 if (ar->supports_6ghz) {
10166 wiphy_ext_feature_set(ar->hw->wiphy,
10167 NL80211_EXT_FEATURE_FILS_DISCOVERY);
10168 wiphy_ext_feature_set(ar->hw->wiphy,
10169 NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP);
10172 wiphy_ext_feature_set(ar->hw->wiphy,
10173 NL80211_EXT_FEATURE_SET_SCAN_DWELL);
10175 if (test_bit(WMI_TLV_SERVICE_RTT, ar->ab->wmi_ab.svc_map))
10176 wiphy_ext_feature_set(ar->hw->wiphy,
10177 NL80211_EXT_FEATURE_ENABLE_FTM_RESPONDER);
10179 ar->hw->wiphy->mbssid_max_interfaces = TARGET_NUM_VDEVS(ab);
10180 ar->hw->wiphy->ema_max_profile_periodicity = TARGET_EMA_MAX_PROFILE_PERIOD;
10182 ath11k_reg_init(ar);
10184 if (!test_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags)) {
10185 ar->hw->netdev_features = NETIF_F_HW_CSUM;
10186 ieee80211_hw_set(ar->hw, SW_CRYPTO_CONTROL);
10187 ieee80211_hw_set(ar->hw, SUPPORT_FAST_XMIT);
10190 if (test_bit(WMI_TLV_SERVICE_BIOS_SAR_SUPPORT, ar->ab->wmi_ab.svc_map) &&
10191 ab->hw_params.bios_sar_capa)
10192 ar->hw->wiphy->sar_capa = ab->hw_params.bios_sar_capa;
10194 ret = ieee80211_register_hw(ar->hw);
10196 ath11k_err(ar->ab, "ieee80211 registration failed: %d\n", ret);
10197 goto err_free_if_combs;
10200 if (!ab->hw_params.supports_monitor)
10201 /* There's a race between calling ieee80211_register_hw()
10202 * and here where the monitor mode is enabled for a little
10203 * while. But that time is so short and in practise it make
10204 * a difference in real life.
10206 ar->hw->wiphy->interface_modes &= ~BIT(NL80211_IFTYPE_MONITOR);
10208 /* Apply the regd received during initialization */
10209 ret = ath11k_regd_update(ar);
10211 ath11k_err(ar->ab, "ath11k regd update failed: %d\n", ret);
10212 goto err_unregister_hw;
10215 if (ab->hw_params.current_cc_support && ab->new_alpha2[0]) {
10216 struct wmi_set_current_country_params set_current_param = {};
10218 memcpy(&set_current_param.alpha2, ab->new_alpha2, 2);
10219 memcpy(&ar->alpha2, ab->new_alpha2, 2);
10220 ret = ath11k_wmi_send_set_current_country_cmd(ar, &set_current_param);
10222 ath11k_warn(ar->ab,
10223 "failed set cc code for mac register: %d\n", ret);
10226 ret = ath11k_debugfs_register(ar);
10228 ath11k_err(ar->ab, "debugfs registration failed: %d\n", ret);
10229 goto err_unregister_hw;
10235 ieee80211_unregister_hw(ar->hw);
10238 kfree(ar->hw->wiphy->iface_combinations[0].limits);
10239 kfree(ar->hw->wiphy->iface_combinations);
10242 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
10243 kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels);
10244 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
10247 SET_IEEE80211_DEV(ar->hw, NULL);
10251 int ath11k_mac_register(struct ath11k_base *ab)
10254 struct ath11k_pdev *pdev;
10257 u8 mac_addr[ETH_ALEN] = {0};
10259 if (test_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags))
10262 /* Initialize channel counters frequency value in hertz */
10263 ab->cc_freq_hz = IPQ8074_CC_FREQ_HERTZ;
10264 ab->free_vdev_map = (1LL << (ab->num_radios * TARGET_NUM_VDEVS(ab))) - 1;
10266 ret = ath11k_peer_rhash_tbl_init(ab);
10270 device_get_mac_address(ab->dev, mac_addr);
10272 for (i = 0; i < ab->num_radios; i++) {
10273 pdev = &ab->pdevs[i];
10275 if (ab->pdevs_macaddr_valid) {
10276 ether_addr_copy(ar->mac_addr, pdev->mac_addr);
10278 if (is_zero_ether_addr(mac_addr))
10279 ether_addr_copy(ar->mac_addr, ab->mac_addr);
10281 ether_addr_copy(ar->mac_addr, mac_addr);
10282 ar->mac_addr[4] += i;
10285 idr_init(&ar->txmgmt_idr);
10286 spin_lock_init(&ar->txmgmt_idr_lock);
10288 ret = __ath11k_mac_register(ar);
10292 init_waitqueue_head(&ar->txmgmt_empty_waitq);
10298 for (i = i - 1; i >= 0; i--) {
10299 pdev = &ab->pdevs[i];
10301 __ath11k_mac_unregister(ar);
10304 ath11k_peer_rhash_tbl_destroy(ab);
10309 int ath11k_mac_allocate(struct ath11k_base *ab)
10311 struct ieee80211_hw *hw;
10313 struct ath11k_pdev *pdev;
10317 if (test_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags))
10320 for (i = 0; i < ab->num_radios; i++) {
10321 pdev = &ab->pdevs[i];
10322 hw = ieee80211_alloc_hw(sizeof(struct ath11k), &ath11k_ops);
10324 ath11k_warn(ab, "failed to allocate mac80211 hw device\n");
10334 ar->lmac_id = ath11k_hw_get_mac_from_pdev_id(&ab->hw_params, i);
10336 ar->wmi = &ab->wmi_ab.wmi[i];
10337 /* FIXME wmi[0] is already initialized during attach,
10338 * Should we do this again?
10340 ath11k_wmi_pdev_attach(ab, i);
10342 ar->cfg_tx_chainmask = pdev->cap.tx_chain_mask;
10343 ar->cfg_rx_chainmask = pdev->cap.rx_chain_mask;
10344 ar->num_tx_chains = get_num_chains(pdev->cap.tx_chain_mask);
10345 ar->num_rx_chains = get_num_chains(pdev->cap.rx_chain_mask);
10348 spin_lock_init(&ar->data_lock);
10349 INIT_LIST_HEAD(&ar->arvifs);
10350 INIT_LIST_HEAD(&ar->ppdu_stats_info);
10351 mutex_init(&ar->conf_mutex);
10352 init_completion(&ar->vdev_setup_done);
10353 init_completion(&ar->vdev_delete_done);
10354 init_completion(&ar->peer_assoc_done);
10355 init_completion(&ar->peer_delete_done);
10356 init_completion(&ar->install_key_done);
10357 init_completion(&ar->bss_survey_done);
10358 init_completion(&ar->scan.started);
10359 init_completion(&ar->scan.completed);
10360 init_completion(&ar->scan.on_channel);
10361 init_completion(&ar->thermal.wmi_sync);
10363 INIT_DELAYED_WORK(&ar->scan.timeout, ath11k_scan_timeout_work);
10364 INIT_WORK(&ar->regd_update_work, ath11k_regd_update_work);
10366 INIT_WORK(&ar->wmi_mgmt_tx_work, ath11k_mgmt_over_wmi_tx_work);
10367 skb_queue_head_init(&ar->wmi_mgmt_tx_queue);
10369 clear_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags);
10371 ar->monitor_vdev_id = -1;
10372 clear_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags);
10373 ar->vdev_id_11d_scan = ATH11K_11D_INVALID_VDEV_ID;
10374 init_completion(&ar->completed_11d_scan);
10376 ath11k_fw_stats_init(ar);
10382 ath11k_mac_destroy(ab);
10387 void ath11k_mac_destroy(struct ath11k_base *ab)
10390 struct ath11k_pdev *pdev;
10393 for (i = 0; i < ab->num_radios; i++) {
10394 pdev = &ab->pdevs[i];
10399 ath11k_fw_stats_free(&ar->fw_stats);
10400 ieee80211_free_hw(ar->hw);
10405 int ath11k_mac_vif_set_keepalive(struct ath11k_vif *arvif,
10406 enum wmi_sta_keepalive_method method,
10409 struct ath11k *ar = arvif->ar;
10410 struct wmi_sta_keepalive_arg arg = {};
10413 lockdep_assert_held(&ar->conf_mutex);
10415 if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
10418 if (!test_bit(WMI_TLV_SERVICE_STA_KEEP_ALIVE, ar->ab->wmi_ab.svc_map))
10421 arg.vdev_id = arvif->vdev_id;
10423 arg.method = method;
10424 arg.interval = interval;
10426 ret = ath11k_wmi_sta_keepalive(ar, &arg);
10428 ath11k_warn(ar->ab, "failed to set keepalive on vdev %i: %d\n",
10429 arvif->vdev_id, ret);