1 // SPDX-License-Identifier: BSD-3-Clause-Clear
3 * Copyright (c) 2018-2021 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 <linux/etherdevice.h>
18 #define CHAN2G(_channel, _freq, _flags) { \
19 .band = NL80211_BAND_2GHZ, \
20 .hw_value = (_channel), \
21 .center_freq = (_freq), \
23 .max_antenna_gain = 0, \
27 #define CHAN5G(_channel, _freq, _flags) { \
28 .band = NL80211_BAND_5GHZ, \
29 .hw_value = (_channel), \
30 .center_freq = (_freq), \
32 .max_antenna_gain = 0, \
36 #define CHAN6G(_channel, _freq, _flags) { \
37 .band = NL80211_BAND_6GHZ, \
38 .hw_value = (_channel), \
39 .center_freq = (_freq), \
41 .max_antenna_gain = 0, \
45 static const struct ieee80211_channel ath12k_2ghz_channels[] = {
62 static const struct ieee80211_channel ath12k_5ghz_channels[] = {
92 static const struct ieee80211_channel ath12k_6ghz_channels[] = {
118 CHAN6G(101, 6455, 0),
119 CHAN6G(105, 6475, 0),
120 CHAN6G(109, 6495, 0),
121 CHAN6G(113, 6515, 0),
122 CHAN6G(117, 6535, 0),
123 CHAN6G(121, 6555, 0),
124 CHAN6G(125, 6575, 0),
125 CHAN6G(129, 6595, 0),
126 CHAN6G(133, 6615, 0),
127 CHAN6G(137, 6635, 0),
128 CHAN6G(141, 6655, 0),
129 CHAN6G(145, 6675, 0),
130 CHAN6G(149, 6695, 0),
131 CHAN6G(153, 6715, 0),
132 CHAN6G(157, 6735, 0),
133 CHAN6G(161, 6755, 0),
134 CHAN6G(165, 6775, 0),
135 CHAN6G(169, 6795, 0),
136 CHAN6G(173, 6815, 0),
137 CHAN6G(177, 6835, 0),
138 CHAN6G(181, 6855, 0),
139 CHAN6G(185, 6875, 0),
140 CHAN6G(189, 6895, 0),
141 CHAN6G(193, 6915, 0),
142 CHAN6G(197, 6935, 0),
143 CHAN6G(201, 6955, 0),
144 CHAN6G(205, 6975, 0),
145 CHAN6G(209, 6995, 0),
146 CHAN6G(213, 7015, 0),
147 CHAN6G(217, 7035, 0),
148 CHAN6G(221, 7055, 0),
149 CHAN6G(225, 7075, 0),
150 CHAN6G(229, 7095, 0),
151 CHAN6G(233, 7115, 0),
154 static struct ieee80211_rate ath12k_legacy_rates[] = {
156 .hw_value = ATH12K_HW_RATE_CCK_LP_1M },
158 .hw_value = ATH12K_HW_RATE_CCK_LP_2M,
159 .hw_value_short = ATH12K_HW_RATE_CCK_SP_2M,
160 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
162 .hw_value = ATH12K_HW_RATE_CCK_LP_5_5M,
163 .hw_value_short = ATH12K_HW_RATE_CCK_SP_5_5M,
164 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
166 .hw_value = ATH12K_HW_RATE_CCK_LP_11M,
167 .hw_value_short = ATH12K_HW_RATE_CCK_SP_11M,
168 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
170 { .bitrate = 60, .hw_value = ATH12K_HW_RATE_OFDM_6M },
171 { .bitrate = 90, .hw_value = ATH12K_HW_RATE_OFDM_9M },
172 { .bitrate = 120, .hw_value = ATH12K_HW_RATE_OFDM_12M },
173 { .bitrate = 180, .hw_value = ATH12K_HW_RATE_OFDM_18M },
174 { .bitrate = 240, .hw_value = ATH12K_HW_RATE_OFDM_24M },
175 { .bitrate = 360, .hw_value = ATH12K_HW_RATE_OFDM_36M },
176 { .bitrate = 480, .hw_value = ATH12K_HW_RATE_OFDM_48M },
177 { .bitrate = 540, .hw_value = ATH12K_HW_RATE_OFDM_54M },
181 ath12k_phymodes[NUM_NL80211_BANDS][ATH12K_CHAN_WIDTH_NUM] = {
182 [NL80211_BAND_2GHZ] = {
183 [NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
184 [NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
185 [NL80211_CHAN_WIDTH_20_NOHT] = MODE_11BE_EHT20_2G,
186 [NL80211_CHAN_WIDTH_20] = MODE_11BE_EHT20_2G,
187 [NL80211_CHAN_WIDTH_40] = MODE_11BE_EHT40_2G,
188 [NL80211_CHAN_WIDTH_80] = MODE_UNKNOWN,
189 [NL80211_CHAN_WIDTH_80P80] = MODE_UNKNOWN,
190 [NL80211_CHAN_WIDTH_160] = MODE_UNKNOWN,
191 [NL80211_CHAN_WIDTH_320] = MODE_UNKNOWN,
193 [NL80211_BAND_5GHZ] = {
194 [NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
195 [NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
196 [NL80211_CHAN_WIDTH_20_NOHT] = MODE_11BE_EHT20,
197 [NL80211_CHAN_WIDTH_20] = MODE_11BE_EHT20,
198 [NL80211_CHAN_WIDTH_40] = MODE_11BE_EHT40,
199 [NL80211_CHAN_WIDTH_80] = MODE_11BE_EHT80,
200 [NL80211_CHAN_WIDTH_160] = MODE_11BE_EHT160,
201 [NL80211_CHAN_WIDTH_80P80] = MODE_11BE_EHT80_80,
202 [NL80211_CHAN_WIDTH_320] = MODE_11BE_EHT320,
204 [NL80211_BAND_6GHZ] = {
205 [NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
206 [NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
207 [NL80211_CHAN_WIDTH_20_NOHT] = MODE_11BE_EHT20,
208 [NL80211_CHAN_WIDTH_20] = MODE_11BE_EHT20,
209 [NL80211_CHAN_WIDTH_40] = MODE_11BE_EHT40,
210 [NL80211_CHAN_WIDTH_80] = MODE_11BE_EHT80,
211 [NL80211_CHAN_WIDTH_160] = MODE_11BE_EHT160,
212 [NL80211_CHAN_WIDTH_80P80] = MODE_11BE_EHT80_80,
213 [NL80211_CHAN_WIDTH_320] = MODE_11BE_EHT320,
218 const struct htt_rx_ring_tlv_filter ath12k_mac_mon_status_filter_default = {
219 .rx_filter = HTT_RX_FILTER_TLV_FLAGS_MPDU_START |
220 HTT_RX_FILTER_TLV_FLAGS_PPDU_END |
221 HTT_RX_FILTER_TLV_FLAGS_PPDU_END_STATUS_DONE,
222 .pkt_filter_flags0 = HTT_RX_FP_MGMT_FILTER_FLAGS0,
223 .pkt_filter_flags1 = HTT_RX_FP_MGMT_FILTER_FLAGS1,
224 .pkt_filter_flags2 = HTT_RX_FP_CTRL_FILTER_FLASG2,
225 .pkt_filter_flags3 = HTT_RX_FP_DATA_FILTER_FLASG3 |
226 HTT_RX_FP_CTRL_FILTER_FLASG3
229 #define ATH12K_MAC_FIRST_OFDM_RATE_IDX 4
230 #define ath12k_g_rates ath12k_legacy_rates
231 #define ath12k_g_rates_size (ARRAY_SIZE(ath12k_legacy_rates))
232 #define ath12k_a_rates (ath12k_legacy_rates + 4)
233 #define ath12k_a_rates_size (ARRAY_SIZE(ath12k_legacy_rates) - 4)
235 #define ATH12K_MAC_SCAN_TIMEOUT_MSECS 200 /* in msecs */
237 static const u32 ath12k_smps_map[] = {
238 [WLAN_HT_CAP_SM_PS_STATIC] = WMI_PEER_SMPS_STATIC,
239 [WLAN_HT_CAP_SM_PS_DYNAMIC] = WMI_PEER_SMPS_DYNAMIC,
240 [WLAN_HT_CAP_SM_PS_INVALID] = WMI_PEER_SMPS_PS_NONE,
241 [WLAN_HT_CAP_SM_PS_DISABLED] = WMI_PEER_SMPS_PS_NONE,
244 static int ath12k_start_vdev_delay(struct ath12k *ar,
245 struct ath12k_vif *arvif);
247 static const char *ath12k_mac_phymode_str(enum wmi_phy_mode mode)
266 case MODE_11AC_VHT20:
268 case MODE_11AC_VHT40:
270 case MODE_11AC_VHT80:
272 case MODE_11AC_VHT160:
273 return "11ac-vht160";
274 case MODE_11AC_VHT80_80:
275 return "11ac-vht80+80";
276 case MODE_11AC_VHT20_2G:
277 return "11ac-vht20-2g";
278 case MODE_11AC_VHT40_2G:
279 return "11ac-vht40-2g";
280 case MODE_11AC_VHT80_2G:
281 return "11ac-vht80-2g";
288 case MODE_11AX_HE80_80:
289 return "11ax-he80+80";
290 case MODE_11AX_HE160:
292 case MODE_11AX_HE20_2G:
293 return "11ax-he20-2g";
294 case MODE_11AX_HE40_2G:
295 return "11ax-he40-2g";
296 case MODE_11AX_HE80_2G:
297 return "11ax-he80-2g";
298 case MODE_11BE_EHT20:
300 case MODE_11BE_EHT40:
302 case MODE_11BE_EHT80:
304 case MODE_11BE_EHT80_80:
305 return "11be-eht80+80";
306 case MODE_11BE_EHT160:
307 return "11be-eht160";
308 case MODE_11BE_EHT160_160:
309 return "11be-eht160+160";
310 case MODE_11BE_EHT320:
311 return "11be-eht320";
312 case MODE_11BE_EHT20_2G:
313 return "11be-eht20-2g";
314 case MODE_11BE_EHT40_2G:
315 return "11be-eht40-2g";
320 /* no default handler to allow compiler to check that the
321 * enum is fully handled
329 ath12k_mac_bw_to_mac80211_bw(enum ath12k_supported_bw bw)
331 u8 ret = RATE_INFO_BW_20;
335 ret = RATE_INFO_BW_20;
338 ret = RATE_INFO_BW_40;
341 ret = RATE_INFO_BW_80;
344 ret = RATE_INFO_BW_160;
347 ret = RATE_INFO_BW_320;
354 enum ath12k_supported_bw ath12k_mac_mac80211_bw_to_ath12k_bw(enum rate_info_bw bw)
357 case RATE_INFO_BW_20:
359 case RATE_INFO_BW_40:
361 case RATE_INFO_BW_80:
363 case RATE_INFO_BW_160:
364 return ATH12K_BW_160;
365 case RATE_INFO_BW_320:
366 return ATH12K_BW_320;
372 int ath12k_mac_hw_ratecode_to_legacy_rate(u8 hw_rc, u8 preamble, u8 *rateidx,
375 /* As default, it is OFDM rates */
376 int i = ATH12K_MAC_FIRST_OFDM_RATE_IDX;
377 int max_rates_idx = ath12k_g_rates_size;
379 if (preamble == WMI_RATE_PREAMBLE_CCK) {
380 hw_rc &= ~ATH12K_HW_RATECODE_CCK_SHORT_PREAM_MASK;
382 max_rates_idx = ATH12K_MAC_FIRST_OFDM_RATE_IDX;
385 while (i < max_rates_idx) {
386 if (hw_rc == ath12k_legacy_rates[i].hw_value) {
388 *rate = ath12k_legacy_rates[i].bitrate;
397 u8 ath12k_mac_bitrate_to_idx(const struct ieee80211_supported_band *sband,
402 for (i = 0; i < sband->n_bitrates; i++)
403 if (sband->bitrates[i].bitrate == bitrate)
410 ath12k_mac_max_ht_nss(const u8 *ht_mcs_mask)
414 for (nss = IEEE80211_HT_MCS_MASK_LEN - 1; nss >= 0; nss--)
415 if (ht_mcs_mask[nss])
422 ath12k_mac_max_vht_nss(const u16 *vht_mcs_mask)
426 for (nss = NL80211_VHT_NSS_MAX - 1; nss >= 0; nss--)
427 if (vht_mcs_mask[nss])
433 static u8 ath12k_parse_mpdudensity(u8 mpdudensity)
435 /* From IEEE Std 802.11-2020 defined values for "Minimum MPDU Start Spacing":
436 * 0 for no restriction
445 switch (mpdudensity) {
451 /* Our lower layer calculations limit our precision to
468 static int ath12k_mac_vif_chan(struct ieee80211_vif *vif,
469 struct cfg80211_chan_def *def)
471 struct ieee80211_chanctx_conf *conf;
474 conf = rcu_dereference(vif->bss_conf.chanctx_conf);
486 static bool ath12k_mac_bitrate_is_cck(int bitrate)
499 u8 ath12k_mac_hw_rate_to_idx(const struct ieee80211_supported_band *sband,
500 u8 hw_rate, bool cck)
502 const struct ieee80211_rate *rate;
505 for (i = 0; i < sband->n_bitrates; i++) {
506 rate = &sband->bitrates[i];
508 if (ath12k_mac_bitrate_is_cck(rate->bitrate) != cck)
511 if (rate->hw_value == hw_rate)
513 else if (rate->flags & IEEE80211_RATE_SHORT_PREAMBLE &&
514 rate->hw_value_short == hw_rate)
521 static u8 ath12k_mac_bitrate_to_rate(int bitrate)
523 return DIV_ROUND_UP(bitrate, 5) |
524 (ath12k_mac_bitrate_is_cck(bitrate) ? BIT(7) : 0);
527 static void ath12k_get_arvif_iter(void *data, u8 *mac,
528 struct ieee80211_vif *vif)
530 struct ath12k_vif_iter *arvif_iter = data;
531 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
533 if (arvif->vdev_id == arvif_iter->vdev_id)
534 arvif_iter->arvif = arvif;
537 struct ath12k_vif *ath12k_mac_get_arvif(struct ath12k *ar, u32 vdev_id)
539 struct ath12k_vif_iter arvif_iter = {};
542 arvif_iter.vdev_id = vdev_id;
544 flags = IEEE80211_IFACE_ITER_RESUME_ALL;
545 ieee80211_iterate_active_interfaces_atomic(ath12k_ar_to_hw(ar),
547 ath12k_get_arvif_iter,
549 if (!arvif_iter.arvif) {
550 ath12k_warn(ar->ab, "No VIF found for vdev %d\n", vdev_id);
554 return arvif_iter.arvif;
557 struct ath12k_vif *ath12k_mac_get_arvif_by_vdev_id(struct ath12k_base *ab,
561 struct ath12k_pdev *pdev;
562 struct ath12k_vif *arvif;
564 for (i = 0; i < ab->num_radios; i++) {
565 pdev = rcu_dereference(ab->pdevs_active[i]);
566 if (pdev && pdev->ar &&
567 (pdev->ar->allocated_vdev_map & (1LL << vdev_id))) {
568 arvif = ath12k_mac_get_arvif(pdev->ar, vdev_id);
577 struct ath12k *ath12k_mac_get_ar_by_vdev_id(struct ath12k_base *ab, u32 vdev_id)
580 struct ath12k_pdev *pdev;
582 for (i = 0; i < ab->num_radios; i++) {
583 pdev = rcu_dereference(ab->pdevs_active[i]);
584 if (pdev && pdev->ar) {
585 if (pdev->ar->allocated_vdev_map & (1LL << vdev_id))
593 struct ath12k *ath12k_mac_get_ar_by_pdev_id(struct ath12k_base *ab, u32 pdev_id)
596 struct ath12k_pdev *pdev;
598 if (ab->hw_params->single_pdev_only) {
599 pdev = rcu_dereference(ab->pdevs_active[0]);
600 return pdev ? pdev->ar : NULL;
603 if (WARN_ON(pdev_id > ab->num_radios))
606 for (i = 0; i < ab->num_radios; i++) {
607 pdev = rcu_dereference(ab->pdevs_active[i]);
609 if (pdev && pdev->pdev_id == pdev_id)
610 return (pdev->ar ? pdev->ar : NULL);
616 static void ath12k_pdev_caps_update(struct ath12k *ar)
618 struct ath12k_base *ab = ar->ab;
620 ar->max_tx_power = ab->target_caps.hw_max_tx_power;
622 /* FIXME: Set min_tx_power to ab->target_caps.hw_min_tx_power.
623 * But since the received value in svcrdy is same as hw_max_tx_power,
624 * we can set ar->min_tx_power to 0 currently until
625 * this is fixed in firmware
627 ar->min_tx_power = 0;
629 ar->txpower_limit_2g = ar->max_tx_power;
630 ar->txpower_limit_5g = ar->max_tx_power;
631 ar->txpower_scale = WMI_HOST_TP_SCALE_MAX;
634 static int ath12k_mac_txpower_recalc(struct ath12k *ar)
636 struct ath12k_pdev *pdev = ar->pdev;
637 struct ath12k_vif *arvif;
638 int ret, txpower = -1;
641 lockdep_assert_held(&ar->conf_mutex);
643 list_for_each_entry(arvif, &ar->arvifs, list) {
644 if (arvif->txpower <= 0)
648 txpower = arvif->txpower;
650 txpower = min(txpower, arvif->txpower);
656 /* txpwr is set as 2 units per dBm in FW*/
657 txpower = min_t(u32, max_t(u32, ar->min_tx_power, txpower),
658 ar->max_tx_power) * 2;
660 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "txpower to set in hw %d\n",
663 if ((pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) &&
664 ar->txpower_limit_2g != txpower) {
665 param = WMI_PDEV_PARAM_TXPOWER_LIMIT2G;
666 ret = ath12k_wmi_pdev_set_param(ar, param,
667 txpower, ar->pdev->pdev_id);
670 ar->txpower_limit_2g = txpower;
673 if ((pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) &&
674 ar->txpower_limit_5g != txpower) {
675 param = WMI_PDEV_PARAM_TXPOWER_LIMIT5G;
676 ret = ath12k_wmi_pdev_set_param(ar, param,
677 txpower, ar->pdev->pdev_id);
680 ar->txpower_limit_5g = txpower;
686 ath12k_warn(ar->ab, "failed to recalc txpower limit %d using pdev param %d: %d\n",
687 txpower / 2, param, ret);
691 static int ath12k_recalc_rtscts_prot(struct ath12k_vif *arvif)
693 struct ath12k *ar = arvif->ar;
694 u32 vdev_param, rts_cts;
697 lockdep_assert_held(&ar->conf_mutex);
699 vdev_param = WMI_VDEV_PARAM_ENABLE_RTSCTS;
701 /* Enable RTS/CTS protection for sw retries (when legacy stations
702 * are in BSS) or by default only for second rate series.
703 * TODO: Check if we need to enable CTS 2 Self in any case
705 rts_cts = WMI_USE_RTS_CTS;
707 if (arvif->num_legacy_stations > 0)
708 rts_cts |= WMI_RTSCTS_ACROSS_SW_RETRIES << 4;
710 rts_cts |= WMI_RTSCTS_FOR_SECOND_RATESERIES << 4;
712 /* Need not send duplicate param value to firmware */
713 if (arvif->rtscts_prot_mode == rts_cts)
716 arvif->rtscts_prot_mode = rts_cts;
718 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %d recalc rts/cts prot %d\n",
719 arvif->vdev_id, rts_cts);
721 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
722 vdev_param, rts_cts);
724 ath12k_warn(ar->ab, "failed to recalculate rts/cts prot for vdev %d: %d\n",
725 arvif->vdev_id, ret);
730 static int ath12k_mac_set_kickout(struct ath12k_vif *arvif)
732 struct ath12k *ar = arvif->ar;
736 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_STA_KICKOUT_TH,
737 ATH12K_KICKOUT_THRESHOLD,
740 ath12k_warn(ar->ab, "failed to set kickout threshold on vdev %i: %d\n",
741 arvif->vdev_id, ret);
745 param = WMI_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS;
746 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param,
747 ATH12K_KEEPALIVE_MIN_IDLE);
749 ath12k_warn(ar->ab, "failed to set keepalive minimum idle time on vdev %i: %d\n",
750 arvif->vdev_id, ret);
754 param = WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS;
755 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param,
756 ATH12K_KEEPALIVE_MAX_IDLE);
758 ath12k_warn(ar->ab, "failed to set keepalive maximum idle time on vdev %i: %d\n",
759 arvif->vdev_id, ret);
763 param = WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS;
764 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param,
765 ATH12K_KEEPALIVE_MAX_UNRESPONSIVE);
767 ath12k_warn(ar->ab, "failed to set keepalive maximum unresponsive time on vdev %i: %d\n",
768 arvif->vdev_id, ret);
775 void ath12k_mac_peer_cleanup_all(struct ath12k *ar)
777 struct ath12k_peer *peer, *tmp;
778 struct ath12k_base *ab = ar->ab;
780 lockdep_assert_held(&ar->conf_mutex);
782 spin_lock_bh(&ab->base_lock);
783 list_for_each_entry_safe(peer, tmp, &ab->peers, list) {
784 ath12k_dp_rx_peer_tid_cleanup(ar, peer);
785 list_del(&peer->list);
788 spin_unlock_bh(&ab->base_lock);
791 ar->num_stations = 0;
794 static int ath12k_mac_vdev_setup_sync(struct ath12k *ar)
796 lockdep_assert_held(&ar->conf_mutex);
798 if (test_bit(ATH12K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags))
801 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "vdev setup timeout %d\n",
802 ATH12K_VDEV_SETUP_TIMEOUT_HZ);
804 if (!wait_for_completion_timeout(&ar->vdev_setup_done,
805 ATH12K_VDEV_SETUP_TIMEOUT_HZ))
808 return ar->last_wmi_vdev_start_status ? -EINVAL : 0;
811 static int ath12k_monitor_vdev_up(struct ath12k *ar, int vdev_id)
815 ret = ath12k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr);
817 ath12k_warn(ar->ab, "failed to put up monitor vdev %i: %d\n",
822 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %i started\n",
827 static int ath12k_mac_monitor_vdev_start(struct ath12k *ar, int vdev_id,
828 struct cfg80211_chan_def *chandef)
830 struct ieee80211_channel *channel;
831 struct wmi_vdev_start_req_arg arg = {};
834 lockdep_assert_held(&ar->conf_mutex);
836 channel = chandef->chan;
837 arg.vdev_id = vdev_id;
838 arg.freq = channel->center_freq;
839 arg.band_center_freq1 = chandef->center_freq1;
840 arg.band_center_freq2 = chandef->center_freq2;
841 arg.mode = ath12k_phymodes[chandef->chan->band][chandef->width];
842 arg.chan_radar = !!(channel->flags & IEEE80211_CHAN_RADAR);
845 arg.max_power = channel->max_power;
846 arg.max_reg_power = channel->max_reg_power;
847 arg.max_antenna_gain = channel->max_antenna_gain;
849 arg.pref_tx_streams = ar->num_tx_chains;
850 arg.pref_rx_streams = ar->num_rx_chains;
851 arg.punct_bitmap = 0xFFFFFFFF;
853 arg.passive |= !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR);
855 reinit_completion(&ar->vdev_setup_done);
856 reinit_completion(&ar->vdev_delete_done);
858 ret = ath12k_wmi_vdev_start(ar, &arg, false);
860 ath12k_warn(ar->ab, "failed to request monitor vdev %i start: %d\n",
865 ret = ath12k_mac_vdev_setup_sync(ar);
867 ath12k_warn(ar->ab, "failed to synchronize setup for monitor vdev %i start: %d\n",
872 ret = ath12k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr);
874 ath12k_warn(ar->ab, "failed to put up monitor vdev %i: %d\n",
879 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %i started\n",
884 ret = ath12k_wmi_vdev_stop(ar, vdev_id);
886 ath12k_warn(ar->ab, "failed to stop monitor vdev %i after start failure: %d\n",
891 static int ath12k_mac_monitor_vdev_stop(struct ath12k *ar)
895 lockdep_assert_held(&ar->conf_mutex);
897 reinit_completion(&ar->vdev_setup_done);
899 ret = ath12k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
901 ath12k_warn(ar->ab, "failed to request monitor vdev %i stop: %d\n",
902 ar->monitor_vdev_id, ret);
904 ret = ath12k_mac_vdev_setup_sync(ar);
906 ath12k_warn(ar->ab, "failed to synchronize monitor vdev %i stop: %d\n",
907 ar->monitor_vdev_id, ret);
909 ret = ath12k_wmi_vdev_down(ar, ar->monitor_vdev_id);
911 ath12k_warn(ar->ab, "failed to put down monitor vdev %i: %d\n",
912 ar->monitor_vdev_id, ret);
914 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %i stopped\n",
915 ar->monitor_vdev_id);
919 static int ath12k_mac_monitor_vdev_create(struct ath12k *ar)
921 struct ath12k_pdev *pdev = ar->pdev;
922 struct ath12k_wmi_vdev_create_arg arg = {};
927 lockdep_assert_held(&ar->conf_mutex);
929 if (ar->monitor_vdev_created)
932 if (ar->ab->free_vdev_map == 0) {
933 ath12k_warn(ar->ab, "failed to find free vdev id for monitor vdev\n");
937 bit = __ffs64(ar->ab->free_vdev_map);
939 ar->monitor_vdev_id = bit;
941 arg.if_id = ar->monitor_vdev_id;
942 arg.type = WMI_VDEV_TYPE_MONITOR;
943 arg.subtype = WMI_VDEV_SUBTYPE_NONE;
944 arg.pdev_id = pdev->pdev_id;
945 arg.if_stats_id = ATH12K_INVAL_VDEV_STATS_ID;
947 if (pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) {
948 arg.chains[NL80211_BAND_2GHZ].tx = ar->num_tx_chains;
949 arg.chains[NL80211_BAND_2GHZ].rx = ar->num_rx_chains;
952 if (pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) {
953 arg.chains[NL80211_BAND_5GHZ].tx = ar->num_tx_chains;
954 arg.chains[NL80211_BAND_5GHZ].rx = ar->num_rx_chains;
957 ret = ath12k_wmi_vdev_create(ar, tmp_addr, &arg);
959 ath12k_warn(ar->ab, "failed to request monitor vdev %i creation: %d\n",
960 ar->monitor_vdev_id, ret);
961 ar->monitor_vdev_id = -1;
965 nss = hweight32(ar->cfg_tx_chainmask) ? : 1;
966 ret = ath12k_wmi_vdev_set_param_cmd(ar, ar->monitor_vdev_id,
967 WMI_VDEV_PARAM_NSS, nss);
969 ath12k_warn(ar->ab, "failed to set vdev %d chainmask 0x%x, nss %d :%d\n",
970 ar->monitor_vdev_id, ar->cfg_tx_chainmask, nss, ret);
974 ret = ath12k_mac_txpower_recalc(ar);
978 ar->allocated_vdev_map |= 1LL << ar->monitor_vdev_id;
979 ar->ab->free_vdev_map &= ~(1LL << ar->monitor_vdev_id);
980 ar->num_created_vdevs++;
981 ar->monitor_vdev_created = true;
982 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %d created\n",
983 ar->monitor_vdev_id);
988 static int ath12k_mac_monitor_vdev_delete(struct ath12k *ar)
991 unsigned long time_left;
993 lockdep_assert_held(&ar->conf_mutex);
995 if (!ar->monitor_vdev_created)
998 reinit_completion(&ar->vdev_delete_done);
1000 ret = ath12k_wmi_vdev_delete(ar, ar->monitor_vdev_id);
1002 ath12k_warn(ar->ab, "failed to request wmi monitor vdev %i removal: %d\n",
1003 ar->monitor_vdev_id, ret);
1007 time_left = wait_for_completion_timeout(&ar->vdev_delete_done,
1008 ATH12K_VDEV_DELETE_TIMEOUT_HZ);
1009 if (time_left == 0) {
1010 ath12k_warn(ar->ab, "Timeout in receiving vdev delete response\n");
1012 ar->allocated_vdev_map &= ~(1LL << ar->monitor_vdev_id);
1013 ar->ab->free_vdev_map |= 1LL << (ar->monitor_vdev_id);
1014 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %d deleted\n",
1015 ar->monitor_vdev_id);
1016 ar->num_created_vdevs--;
1017 ar->monitor_vdev_id = -1;
1018 ar->monitor_vdev_created = false;
1025 ath12k_mac_get_any_chandef_iter(struct ieee80211_hw *hw,
1026 struct ieee80211_chanctx_conf *conf,
1029 struct cfg80211_chan_def **def = data;
1034 static int ath12k_mac_monitor_start(struct ath12k *ar)
1036 struct cfg80211_chan_def *chandef = NULL;
1039 lockdep_assert_held(&ar->conf_mutex);
1041 if (ar->monitor_started)
1044 ieee80211_iter_chan_contexts_atomic(ath12k_ar_to_hw(ar),
1045 ath12k_mac_get_any_chandef_iter,
1050 ret = ath12k_mac_monitor_vdev_start(ar, ar->monitor_vdev_id, chandef);
1052 ath12k_warn(ar->ab, "failed to start monitor vdev: %d\n", ret);
1053 ath12k_mac_monitor_vdev_delete(ar);
1057 ar->monitor_started = true;
1058 ar->num_started_vdevs++;
1059 ret = ath12k_dp_tx_htt_monitor_mode_ring_config(ar, false);
1060 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor started ret %d\n", ret);
1065 static int ath12k_mac_monitor_stop(struct ath12k *ar)
1069 lockdep_assert_held(&ar->conf_mutex);
1071 if (!ar->monitor_started)
1074 ret = ath12k_mac_monitor_vdev_stop(ar);
1076 ath12k_warn(ar->ab, "failed to stop monitor vdev: %d\n", ret);
1080 ar->monitor_started = false;
1081 ar->num_started_vdevs--;
1082 ret = ath12k_dp_tx_htt_monitor_mode_ring_config(ar, true);
1083 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor stopped ret %d\n", ret);
1087 static int ath12k_mac_vdev_stop(struct ath12k_vif *arvif)
1089 struct ath12k *ar = arvif->ar;
1092 lockdep_assert_held(&ar->conf_mutex);
1094 reinit_completion(&ar->vdev_setup_done);
1096 ret = ath12k_wmi_vdev_stop(ar, arvif->vdev_id);
1098 ath12k_warn(ar->ab, "failed to stop WMI vdev %i: %d\n",
1099 arvif->vdev_id, ret);
1103 ret = ath12k_mac_vdev_setup_sync(ar);
1105 ath12k_warn(ar->ab, "failed to synchronize setup for vdev %i: %d\n",
1106 arvif->vdev_id, ret);
1110 WARN_ON(ar->num_started_vdevs == 0);
1112 ar->num_started_vdevs--;
1113 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "vdev %pM stopped, vdev_id %d\n",
1114 arvif->vif->addr, arvif->vdev_id);
1116 if (test_bit(ATH12K_CAC_RUNNING, &ar->dev_flags)) {
1117 clear_bit(ATH12K_CAC_RUNNING, &ar->dev_flags);
1118 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "CAC Stopped for vdev %d\n",
1127 static int ath12k_mac_config(struct ath12k *ar, u32 changed)
1129 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
1130 struct ieee80211_conf *conf = &hw->conf;
1133 mutex_lock(&ar->conf_mutex);
1135 if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
1136 ar->monitor_conf_enabled = conf->flags & IEEE80211_CONF_MONITOR;
1137 if (ar->monitor_conf_enabled) {
1138 if (ar->monitor_vdev_created)
1140 ret = ath12k_mac_monitor_vdev_create(ar);
1143 ret = ath12k_mac_monitor_start(ar);
1147 if (!ar->monitor_vdev_created)
1149 ret = ath12k_mac_monitor_stop(ar);
1152 ath12k_mac_monitor_vdev_delete(ar);
1157 mutex_unlock(&ar->conf_mutex);
1161 ath12k_mac_monitor_vdev_delete(ar);
1162 mutex_unlock(&ar->conf_mutex);
1166 static int ath12k_mac_op_config(struct ieee80211_hw *hw, u32 changed)
1168 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
1172 ar = ath12k_ah_to_ar(ah);
1174 ret = ath12k_mac_config(ar, changed);
1176 ath12k_warn(ar->ab, "failed to update config pdev idx %d: %d\n",
1182 static int ath12k_mac_setup_bcn_p2p_ie(struct ath12k_vif *arvif,
1183 struct sk_buff *bcn)
1185 struct ath12k *ar = arvif->ar;
1186 struct ieee80211_mgmt *mgmt;
1190 mgmt = (void *)bcn->data;
1191 p2p_ie = cfg80211_find_vendor_ie(WLAN_OUI_WFA, WLAN_OUI_TYPE_WFA_P2P,
1192 mgmt->u.beacon.variable,
1193 bcn->len - (mgmt->u.beacon.variable -
1196 ath12k_warn(ar->ab, "no P2P ie found in beacon\n");
1200 ret = ath12k_wmi_p2p_go_bcn_ie(ar, arvif->vdev_id, p2p_ie);
1202 ath12k_warn(ar->ab, "failed to submit P2P GO bcn ie for vdev %i: %d\n",
1203 arvif->vdev_id, ret);
1210 static int ath12k_mac_remove_vendor_ie(struct sk_buff *skb, unsigned int oui,
1211 u8 oui_type, size_t ie_offset)
1213 const u8 *next, *end;
1217 if (WARN_ON(skb->len < ie_offset))
1220 ie = (u8 *)cfg80211_find_vendor_ie(oui, oui_type,
1221 skb->data + ie_offset,
1222 skb->len - ie_offset);
1227 end = skb->data + skb->len;
1230 if (WARN_ON(next > end))
1233 memmove(ie, next, end - next);
1234 skb_trim(skb, skb->len - len);
1239 static int ath12k_mac_setup_bcn_tmpl(struct ath12k_vif *arvif)
1241 struct ath12k *ar = arvif->ar;
1242 struct ath12k_base *ab = ar->ab;
1243 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
1244 struct ieee80211_vif *vif = arvif->vif;
1245 struct ieee80211_mutable_offsets offs = {};
1246 struct sk_buff *bcn;
1247 struct ieee80211_mgmt *mgmt;
1251 if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
1254 bcn = ieee80211_beacon_get_template(hw, vif, &offs, 0);
1256 ath12k_warn(ab, "failed to get beacon template from mac80211\n");
1260 ies = bcn->data + ieee80211_get_hdrlen_from_skb(bcn);
1261 ies += sizeof(mgmt->u.beacon);
1263 if (cfg80211_find_ie(WLAN_EID_RSN, ies, (skb_tail_pointer(bcn) - ies)))
1264 arvif->rsnie_present = true;
1266 if (cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
1267 WLAN_OUI_TYPE_MICROSOFT_WPA,
1268 ies, (skb_tail_pointer(bcn) - ies)))
1269 arvif->wpaie_present = true;
1271 if (arvif->vif->type == NL80211_IFTYPE_AP && arvif->vif->p2p) {
1272 ret = ath12k_mac_setup_bcn_p2p_ie(arvif, bcn);
1274 ath12k_warn(ab, "failed to setup P2P GO bcn ie: %d\n",
1279 /* P2P IE is inserted by firmware automatically (as
1280 * configured above) so remove it from the base beacon
1281 * template to avoid duplicate P2P IEs in beacon frames.
1283 ret = ath12k_mac_remove_vendor_ie(bcn, WLAN_OUI_WFA,
1284 WLAN_OUI_TYPE_WFA_P2P,
1285 offsetof(struct ieee80211_mgmt,
1286 u.beacon.variable));
1288 ath12k_warn(ab, "failed to remove P2P vendor ie: %d\n",
1294 ret = ath12k_wmi_bcn_tmpl(ar, arvif->vdev_id, &offs, bcn);
1297 ath12k_warn(ab, "failed to submit beacon template command: %d\n",
1305 static void ath12k_control_beaconing(struct ath12k_vif *arvif,
1306 struct ieee80211_bss_conf *info)
1308 struct ath12k *ar = arvif->ar;
1311 lockdep_assert_held(&arvif->ar->conf_mutex);
1313 if (!info->enable_beacon) {
1314 ret = ath12k_wmi_vdev_down(ar, arvif->vdev_id);
1316 ath12k_warn(ar->ab, "failed to down vdev_id %i: %d\n",
1317 arvif->vdev_id, ret);
1319 arvif->is_up = false;
1323 /* Install the beacon template to the FW */
1324 ret = ath12k_mac_setup_bcn_tmpl(arvif);
1326 ath12k_warn(ar->ab, "failed to update bcn tmpl during vdev up: %d\n",
1333 ether_addr_copy(arvif->bssid, info->bssid);
1335 ret = ath12k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
1338 ath12k_warn(ar->ab, "failed to bring up vdev %d: %i\n",
1339 arvif->vdev_id, ret);
1343 arvif->is_up = true;
1345 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %d up\n", arvif->vdev_id);
1348 static void ath12k_peer_assoc_h_basic(struct ath12k *ar,
1349 struct ieee80211_vif *vif,
1350 struct ieee80211_sta *sta,
1351 struct ath12k_wmi_peer_assoc_arg *arg)
1353 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
1354 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
1357 lockdep_assert_held(&ar->conf_mutex);
1359 if (vif->type == NL80211_IFTYPE_STATION)
1364 ether_addr_copy(arg->peer_mac, sta->addr);
1365 arg->vdev_id = arvif->vdev_id;
1366 arg->peer_associd = aid;
1367 arg->auth_flag = true;
1368 /* TODO: STA WAR in ath10k for listen interval required? */
1369 arg->peer_listen_intval = hw->conf.listen_interval;
1371 arg->peer_caps = vif->bss_conf.assoc_capability;
1374 static void ath12k_peer_assoc_h_crypto(struct ath12k *ar,
1375 struct ieee80211_vif *vif,
1376 struct ieee80211_sta *sta,
1377 struct ath12k_wmi_peer_assoc_arg *arg)
1379 struct ieee80211_bss_conf *info = &vif->bss_conf;
1380 struct cfg80211_chan_def def;
1381 struct cfg80211_bss *bss;
1382 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
1383 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
1384 const u8 *rsnie = NULL;
1385 const u8 *wpaie = NULL;
1387 lockdep_assert_held(&ar->conf_mutex);
1389 if (WARN_ON(ath12k_mac_vif_chan(vif, &def)))
1392 bss = cfg80211_get_bss(hw->wiphy, def.chan, info->bssid, NULL, 0,
1393 IEEE80211_BSS_TYPE_ANY, IEEE80211_PRIVACY_ANY);
1395 if (arvif->rsnie_present || arvif->wpaie_present) {
1396 arg->need_ptk_4_way = true;
1397 if (arvif->wpaie_present)
1398 arg->need_gtk_2_way = true;
1400 const struct cfg80211_bss_ies *ies;
1403 rsnie = ieee80211_bss_get_ie(bss, WLAN_EID_RSN);
1405 ies = rcu_dereference(bss->ies);
1407 wpaie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
1408 WLAN_OUI_TYPE_MICROSOFT_WPA,
1412 cfg80211_put_bss(hw->wiphy, bss);
1415 /* FIXME: base on RSN IE/WPA IE is a correct idea? */
1416 if (rsnie || wpaie) {
1417 ath12k_dbg(ar->ab, ATH12K_DBG_WMI,
1418 "%s: rsn ie found\n", __func__);
1419 arg->need_ptk_4_way = true;
1423 ath12k_dbg(ar->ab, ATH12K_DBG_WMI,
1424 "%s: wpa ie found\n", __func__);
1425 arg->need_gtk_2_way = true;
1429 /* TODO: Need to check if FW supports PMF? */
1430 arg->is_pmf_enabled = true;
1433 /* TODO: safe_mode_enabled (bypass 4-way handshake) flag req? */
1436 static void ath12k_peer_assoc_h_rates(struct ath12k *ar,
1437 struct ieee80211_vif *vif,
1438 struct ieee80211_sta *sta,
1439 struct ath12k_wmi_peer_assoc_arg *arg)
1441 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
1442 struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates;
1443 struct cfg80211_chan_def def;
1444 const struct ieee80211_supported_band *sband;
1445 const struct ieee80211_rate *rates;
1446 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
1447 enum nl80211_band band;
1452 lockdep_assert_held(&ar->conf_mutex);
1454 if (WARN_ON(ath12k_mac_vif_chan(vif, &def)))
1457 band = def.chan->band;
1458 sband = hw->wiphy->bands[band];
1459 ratemask = sta->deflink.supp_rates[band];
1460 ratemask &= arvif->bitrate_mask.control[band].legacy;
1461 rates = sband->bitrates;
1463 rateset->num_rates = 0;
1465 for (i = 0; i < 32; i++, ratemask >>= 1, rates++) {
1466 if (!(ratemask & 1))
1469 rate = ath12k_mac_bitrate_to_rate(rates->bitrate);
1470 rateset->rates[rateset->num_rates] = rate;
1471 rateset->num_rates++;
1476 ath12k_peer_assoc_h_ht_masked(const u8 *ht_mcs_mask)
1480 for (nss = 0; nss < IEEE80211_HT_MCS_MASK_LEN; nss++)
1481 if (ht_mcs_mask[nss])
1488 ath12k_peer_assoc_h_vht_masked(const u16 *vht_mcs_mask)
1492 for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++)
1493 if (vht_mcs_mask[nss])
1499 static void ath12k_peer_assoc_h_ht(struct ath12k *ar,
1500 struct ieee80211_vif *vif,
1501 struct ieee80211_sta *sta,
1502 struct ath12k_wmi_peer_assoc_arg *arg)
1504 const struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
1505 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
1506 struct cfg80211_chan_def def;
1507 enum nl80211_band band;
1508 const u8 *ht_mcs_mask;
1513 lockdep_assert_held(&ar->conf_mutex);
1515 if (WARN_ON(ath12k_mac_vif_chan(vif, &def)))
1518 if (!ht_cap->ht_supported)
1521 band = def.chan->band;
1522 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
1524 if (ath12k_peer_assoc_h_ht_masked(ht_mcs_mask))
1527 arg->ht_flag = true;
1529 arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
1530 ht_cap->ampdu_factor)) - 1;
1532 arg->peer_mpdu_density =
1533 ath12k_parse_mpdudensity(ht_cap->ampdu_density);
1535 arg->peer_ht_caps = ht_cap->cap;
1536 arg->peer_rate_caps |= WMI_HOST_RC_HT_FLAG;
1538 if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING)
1539 arg->ldpc_flag = true;
1541 if (sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40) {
1543 arg->peer_rate_caps |= WMI_HOST_RC_CW40_FLAG;
1546 if (arvif->bitrate_mask.control[band].gi != NL80211_TXRATE_FORCE_LGI) {
1547 if (ht_cap->cap & (IEEE80211_HT_CAP_SGI_20 |
1548 IEEE80211_HT_CAP_SGI_40))
1549 arg->peer_rate_caps |= WMI_HOST_RC_SGI_FLAG;
1552 if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) {
1553 arg->peer_rate_caps |= WMI_HOST_RC_TX_STBC_FLAG;
1554 arg->stbc_flag = true;
1557 if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) {
1558 stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC;
1559 stbc = stbc >> IEEE80211_HT_CAP_RX_STBC_SHIFT;
1560 stbc = stbc << WMI_HOST_RC_RX_STBC_FLAG_S;
1561 arg->peer_rate_caps |= stbc;
1562 arg->stbc_flag = true;
1565 if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2])
1566 arg->peer_rate_caps |= WMI_HOST_RC_TS_FLAG;
1567 else if (ht_cap->mcs.rx_mask[1])
1568 arg->peer_rate_caps |= WMI_HOST_RC_DS_FLAG;
1570 for (i = 0, n = 0, max_nss = 0; i < IEEE80211_HT_MCS_MASK_LEN * 8; i++)
1571 if ((ht_cap->mcs.rx_mask[i / 8] & BIT(i % 8)) &&
1572 (ht_mcs_mask[i / 8] & BIT(i % 8))) {
1573 max_nss = (i / 8) + 1;
1574 arg->peer_ht_rates.rates[n++] = i;
1577 /* This is a workaround for HT-enabled STAs which break the spec
1578 * and have no HT capabilities RX mask (no HT RX MCS map).
1580 * As per spec, in section 20.3.5 Modulation and coding scheme (MCS),
1581 * MCS 0 through 7 are mandatory in 20MHz with 800 ns GI at all STAs.
1583 * Firmware asserts if such situation occurs.
1586 arg->peer_ht_rates.num_rates = 8;
1587 for (i = 0; i < arg->peer_ht_rates.num_rates; i++)
1588 arg->peer_ht_rates.rates[i] = i;
1590 arg->peer_ht_rates.num_rates = n;
1591 arg->peer_nss = min(sta->deflink.rx_nss, max_nss);
1594 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n",
1596 arg->peer_ht_rates.num_rates,
1600 static int ath12k_mac_get_max_vht_mcs_map(u16 mcs_map, int nss)
1602 switch ((mcs_map >> (2 * nss)) & 0x3) {
1603 case IEEE80211_VHT_MCS_SUPPORT_0_7: return BIT(8) - 1;
1604 case IEEE80211_VHT_MCS_SUPPORT_0_8: return BIT(9) - 1;
1605 case IEEE80211_VHT_MCS_SUPPORT_0_9: return BIT(10) - 1;
1611 ath12k_peer_assoc_h_vht_limit(u16 tx_mcs_set,
1612 const u16 vht_mcs_limit[NL80211_VHT_NSS_MAX])
1619 for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) {
1620 mcs_map = ath12k_mac_get_max_vht_mcs_map(tx_mcs_set, nss) &
1624 idx_limit = fls(mcs_map) - 1;
1628 switch (idx_limit) {
1637 mcs = IEEE80211_VHT_MCS_SUPPORT_0_7;
1640 mcs = IEEE80211_VHT_MCS_SUPPORT_0_8;
1643 mcs = IEEE80211_VHT_MCS_SUPPORT_0_9;
1649 mcs = IEEE80211_VHT_MCS_NOT_SUPPORTED;
1653 tx_mcs_set &= ~(0x3 << (nss * 2));
1654 tx_mcs_set |= mcs << (nss * 2);
1660 static void ath12k_peer_assoc_h_vht(struct ath12k *ar,
1661 struct ieee80211_vif *vif,
1662 struct ieee80211_sta *sta,
1663 struct ath12k_wmi_peer_assoc_arg *arg)
1665 const struct ieee80211_sta_vht_cap *vht_cap = &sta->deflink.vht_cap;
1666 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
1667 struct cfg80211_chan_def def;
1668 enum nl80211_band band;
1669 const u16 *vht_mcs_mask;
1672 u8 max_nss, vht_mcs;
1675 if (WARN_ON(ath12k_mac_vif_chan(vif, &def)))
1678 if (!vht_cap->vht_supported)
1681 band = def.chan->band;
1682 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
1684 if (ath12k_peer_assoc_h_vht_masked(vht_mcs_mask))
1687 arg->vht_flag = true;
1689 /* TODO: similar flags required? */
1690 arg->vht_capable = true;
1692 if (def.chan->band == NL80211_BAND_2GHZ)
1693 arg->vht_ng_flag = true;
1695 arg->peer_vht_caps = vht_cap->cap;
1697 ampdu_factor = (vht_cap->cap &
1698 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >>
1699 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
1701 /* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to
1702 * zero in VHT IE. Using it would result in degraded throughput.
1703 * arg->peer_max_mpdu at this point contains HT max_mpdu so keep
1704 * it if VHT max_mpdu is smaller.
1706 arg->peer_max_mpdu = max(arg->peer_max_mpdu,
1707 (1U << (IEEE80211_HT_MAX_AMPDU_FACTOR +
1708 ampdu_factor)) - 1);
1710 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
1713 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160)
1716 /* Calculate peer NSS capability from VHT capabilities if STA
1719 for (i = 0, max_nss = 0, vht_mcs = 0; i < NL80211_VHT_NSS_MAX; i++) {
1720 vht_mcs = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map) >>
1723 if (vht_mcs != IEEE80211_VHT_MCS_NOT_SUPPORTED &&
1727 arg->peer_nss = min(sta->deflink.rx_nss, max_nss);
1728 arg->rx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.rx_highest);
1729 arg->rx_mcs_set = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map);
1730 arg->tx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.tx_highest);
1732 tx_mcs_map = __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map);
1733 arg->tx_mcs_set = ath12k_peer_assoc_h_vht_limit(tx_mcs_map, vht_mcs_mask);
1735 /* In QCN9274 platform, VHT MCS rate 10 and 11 is enabled by default.
1736 * VHT MCS rate 10 and 11 is not supported in 11ac standard.
1737 * so explicitly disable the VHT MCS rate 10 and 11 in 11ac mode.
1739 arg->tx_mcs_set &= ~IEEE80211_VHT_MCS_SUPPORT_0_11_MASK;
1740 arg->tx_mcs_set |= IEEE80211_DISABLE_VHT_MCS_SUPPORT_0_11;
1742 if ((arg->tx_mcs_set & IEEE80211_VHT_MCS_NOT_SUPPORTED) ==
1743 IEEE80211_VHT_MCS_NOT_SUPPORTED)
1744 arg->peer_vht_caps &= ~IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE;
1747 arg->tx_max_mcs_nss = 0xFF;
1749 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vht peer %pM max_mpdu %d flags 0x%x\n",
1750 sta->addr, arg->peer_max_mpdu, arg->peer_flags);
1752 /* TODO: rxnss_override */
1755 static void ath12k_peer_assoc_h_he(struct ath12k *ar,
1756 struct ieee80211_vif *vif,
1757 struct ieee80211_sta *sta,
1758 struct ath12k_wmi_peer_assoc_arg *arg)
1760 const struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap;
1762 u8 ampdu_factor, rx_mcs_80, rx_mcs_160, max_nss;
1763 u16 mcs_160_map, mcs_80_map;
1767 if (!he_cap->has_he)
1770 arg->he_flag = true;
1772 support_160 = !!(he_cap->he_cap_elem.phy_cap_info[0] &
1773 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G);
1775 /* Supported HE-MCS and NSS Set of peer he_cap is intersection with self he_cp */
1776 mcs_160_map = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160);
1777 mcs_80_map = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80);
1780 for (i = 7; i >= 0; i--) {
1781 u8 mcs_160 = (mcs_160_map >> (2 * i)) & 3;
1783 if (mcs_160 != IEEE80211_HE_MCS_NOT_SUPPORTED) {
1790 for (i = 7; i >= 0; i--) {
1791 u8 mcs_80 = (mcs_80_map >> (2 * i)) & 3;
1793 if (mcs_80 != IEEE80211_HE_MCS_NOT_SUPPORTED) {
1800 max_nss = min(rx_mcs_80, rx_mcs_160);
1802 max_nss = rx_mcs_80;
1804 arg->peer_nss = min(sta->deflink.rx_nss, max_nss);
1806 memcpy(&arg->peer_he_cap_macinfo, he_cap->he_cap_elem.mac_cap_info,
1807 sizeof(he_cap->he_cap_elem.mac_cap_info));
1808 memcpy(&arg->peer_he_cap_phyinfo, he_cap->he_cap_elem.phy_cap_info,
1809 sizeof(he_cap->he_cap_elem.phy_cap_info));
1810 arg->peer_he_ops = vif->bss_conf.he_oper.params;
1812 /* the top most byte is used to indicate BSS color info */
1813 arg->peer_he_ops &= 0xffffff;
1815 /* As per section 26.6.1 IEEE Std 802.11ax‐2022, if the Max AMPDU
1816 * Exponent Extension in HE cap is zero, use the arg->peer_max_mpdu
1817 * as calculated while parsing VHT caps(if VHT caps is present)
1818 * or HT caps (if VHT caps is not present).
1820 * For non-zero value of Max AMPDU Exponent Extension in HE MAC caps,
1821 * if a HE STA sends VHT cap and HE cap IE in assoc request then, use
1822 * MAX_AMPDU_LEN_FACTOR as 20 to calculate max_ampdu length.
1823 * If a HE STA that does not send VHT cap, but HE and HT cap in assoc
1824 * request, then use MAX_AMPDU_LEN_FACTOR as 16 to calculate max_ampdu
1827 ampdu_factor = (he_cap->he_cap_elem.mac_cap_info[3] &
1828 IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK) >>
1829 IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK;
1832 if (sta->deflink.vht_cap.vht_supported)
1833 arg->peer_max_mpdu = (1 << (IEEE80211_HE_VHT_MAX_AMPDU_FACTOR +
1835 else if (sta->deflink.ht_cap.ht_supported)
1836 arg->peer_max_mpdu = (1 << (IEEE80211_HE_HT_MAX_AMPDU_FACTOR +
1840 if (he_cap->he_cap_elem.phy_cap_info[6] &
1841 IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT) {
1845 arg->peer_ppet.numss_m1 = he_cap->ppe_thres[0] &
1846 IEEE80211_PPE_THRES_NSS_MASK;
1847 arg->peer_ppet.ru_bit_mask =
1848 (he_cap->ppe_thres[0] &
1849 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK) >>
1850 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_POS;
1852 for (nss = 0; nss <= arg->peer_ppet.numss_m1; nss++) {
1853 for (ru = 0; ru < 4; ru++) {
1857 if ((arg->peer_ppet.ru_bit_mask & BIT(ru)) == 0)
1859 for (i = 0; i < 6; i++) {
1861 val |= ((he_cap->ppe_thres[bit / 8] >>
1862 (bit % 8)) & 0x1) << 5;
1865 arg->peer_ppet.ppet16_ppet8_ru3_ru0[nss] |=
1871 if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_RES)
1872 arg->twt_responder = true;
1873 if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_REQ)
1874 arg->twt_requester = true;
1876 switch (sta->deflink.bandwidth) {
1877 case IEEE80211_STA_RX_BW_160:
1878 if (he_cap->he_cap_elem.phy_cap_info[0] &
1879 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G) {
1880 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80p80);
1881 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80_80] = v;
1883 v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80p80);
1884 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80_80] = v;
1886 arg->peer_he_mcs_count++;
1888 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160);
1889 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v;
1891 v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_160);
1892 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v;
1894 arg->peer_he_mcs_count++;
1898 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80);
1899 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v;
1901 v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80);
1902 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v;
1904 arg->peer_he_mcs_count++;
1909 static void ath12k_peer_assoc_h_smps(struct ieee80211_sta *sta,
1910 struct ath12k_wmi_peer_assoc_arg *arg)
1912 const struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
1915 if (!ht_cap->ht_supported)
1918 smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
1919 smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
1922 case WLAN_HT_CAP_SM_PS_STATIC:
1923 arg->static_mimops_flag = true;
1925 case WLAN_HT_CAP_SM_PS_DYNAMIC:
1926 arg->dynamic_mimops_flag = true;
1928 case WLAN_HT_CAP_SM_PS_DISABLED:
1929 arg->spatial_mux_flag = true;
1936 static void ath12k_peer_assoc_h_qos(struct ath12k *ar,
1937 struct ieee80211_vif *vif,
1938 struct ieee80211_sta *sta,
1939 struct ath12k_wmi_peer_assoc_arg *arg)
1941 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
1943 switch (arvif->vdev_type) {
1944 case WMI_VDEV_TYPE_AP:
1946 /* TODO: Check WME vs QoS */
1947 arg->is_wme_set = true;
1948 arg->qos_flag = true;
1951 if (sta->wme && sta->uapsd_queues) {
1952 /* TODO: Check WME vs QoS */
1953 arg->is_wme_set = true;
1954 arg->apsd_flag = true;
1955 arg->peer_rate_caps |= WMI_HOST_RC_UAPSD_FLAG;
1958 case WMI_VDEV_TYPE_STA:
1960 arg->is_wme_set = true;
1961 arg->qos_flag = true;
1968 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac peer %pM qos %d\n",
1969 sta->addr, arg->qos_flag);
1972 static int ath12k_peer_assoc_qos_ap(struct ath12k *ar,
1973 struct ath12k_vif *arvif,
1974 struct ieee80211_sta *sta)
1976 struct ath12k_wmi_ap_ps_arg arg;
1981 lockdep_assert_held(&ar->conf_mutex);
1983 arg.vdev_id = arvif->vdev_id;
1985 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac uapsd_queues 0x%x max_sp %d\n",
1986 sta->uapsd_queues, sta->max_sp);
1989 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO)
1990 uapsd |= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN |
1991 WMI_AP_PS_UAPSD_AC3_TRIGGER_EN;
1992 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI)
1993 uapsd |= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN |
1994 WMI_AP_PS_UAPSD_AC2_TRIGGER_EN;
1995 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK)
1996 uapsd |= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN |
1997 WMI_AP_PS_UAPSD_AC1_TRIGGER_EN;
1998 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE)
1999 uapsd |= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN |
2000 WMI_AP_PS_UAPSD_AC0_TRIGGER_EN;
2003 if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP)
2004 max_sp = sta->max_sp;
2006 arg.param = WMI_AP_PS_PEER_PARAM_UAPSD;
2008 ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, &arg);
2012 arg.param = WMI_AP_PS_PEER_PARAM_MAX_SP;
2014 ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, &arg);
2018 /* TODO: revisit during testing */
2019 arg.param = WMI_AP_PS_PEER_PARAM_SIFS_RESP_FRMTYPE;
2020 arg.value = DISABLE_SIFS_RESPONSE_TRIGGER;
2021 ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, &arg);
2025 arg.param = WMI_AP_PS_PEER_PARAM_SIFS_RESP_UAPSD;
2026 arg.value = DISABLE_SIFS_RESPONSE_TRIGGER;
2027 ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, &arg);
2034 ath12k_warn(ar->ab, "failed to set ap ps peer param %d for vdev %i: %d\n",
2035 arg.param, arvif->vdev_id, ret);
2039 static bool ath12k_mac_sta_has_ofdm_only(struct ieee80211_sta *sta)
2041 return sta->deflink.supp_rates[NL80211_BAND_2GHZ] >>
2042 ATH12K_MAC_FIRST_OFDM_RATE_IDX;
2045 static enum wmi_phy_mode ath12k_mac_get_phymode_vht(struct ath12k *ar,
2046 struct ieee80211_sta *sta)
2048 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160) {
2049 switch (sta->deflink.vht_cap.cap &
2050 IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK) {
2051 case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ:
2052 return MODE_11AC_VHT160;
2053 case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ:
2054 return MODE_11AC_VHT80_80;
2056 /* not sure if this is a valid case? */
2057 return MODE_11AC_VHT160;
2061 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
2062 return MODE_11AC_VHT80;
2064 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2065 return MODE_11AC_VHT40;
2067 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_20)
2068 return MODE_11AC_VHT20;
2070 return MODE_UNKNOWN;
2073 static enum wmi_phy_mode ath12k_mac_get_phymode_he(struct ath12k *ar,
2074 struct ieee80211_sta *sta)
2076 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160) {
2077 if (sta->deflink.he_cap.he_cap_elem.phy_cap_info[0] &
2078 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
2079 return MODE_11AX_HE160;
2080 else if (sta->deflink.he_cap.he_cap_elem.phy_cap_info[0] &
2081 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
2082 return MODE_11AX_HE80_80;
2083 /* not sure if this is a valid case? */
2084 return MODE_11AX_HE160;
2087 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
2088 return MODE_11AX_HE80;
2090 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2091 return MODE_11AX_HE40;
2093 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_20)
2094 return MODE_11AX_HE20;
2096 return MODE_UNKNOWN;
2099 static enum wmi_phy_mode ath12k_mac_get_phymode_eht(struct ath12k *ar,
2100 struct ieee80211_sta *sta)
2102 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_320)
2103 if (sta->deflink.eht_cap.eht_cap_elem.phy_cap_info[0] &
2104 IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ)
2105 return MODE_11BE_EHT320;
2107 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160) {
2108 if (sta->deflink.he_cap.he_cap_elem.phy_cap_info[0] &
2109 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
2110 return MODE_11BE_EHT160;
2112 if (sta->deflink.he_cap.he_cap_elem.phy_cap_info[0] &
2113 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
2114 return MODE_11BE_EHT80_80;
2116 ath12k_warn(ar->ab, "invalid EHT PHY capability info for 160 Mhz: %d\n",
2117 sta->deflink.he_cap.he_cap_elem.phy_cap_info[0]);
2119 return MODE_11BE_EHT160;
2122 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
2123 return MODE_11BE_EHT80;
2125 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2126 return MODE_11BE_EHT40;
2128 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_20)
2129 return MODE_11BE_EHT20;
2131 return MODE_UNKNOWN;
2134 static void ath12k_peer_assoc_h_phymode(struct ath12k *ar,
2135 struct ieee80211_vif *vif,
2136 struct ieee80211_sta *sta,
2137 struct ath12k_wmi_peer_assoc_arg *arg)
2139 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
2140 struct cfg80211_chan_def def;
2141 enum nl80211_band band;
2142 const u8 *ht_mcs_mask;
2143 const u16 *vht_mcs_mask;
2144 enum wmi_phy_mode phymode = MODE_UNKNOWN;
2146 if (WARN_ON(ath12k_mac_vif_chan(vif, &def)))
2149 band = def.chan->band;
2150 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
2151 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2154 case NL80211_BAND_2GHZ:
2155 if (sta->deflink.eht_cap.has_eht) {
2156 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2157 phymode = MODE_11BE_EHT40_2G;
2159 phymode = MODE_11BE_EHT20_2G;
2160 } else if (sta->deflink.he_cap.has_he) {
2161 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
2162 phymode = MODE_11AX_HE80_2G;
2163 else if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2164 phymode = MODE_11AX_HE40_2G;
2166 phymode = MODE_11AX_HE20_2G;
2167 } else if (sta->deflink.vht_cap.vht_supported &&
2168 !ath12k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
2169 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2170 phymode = MODE_11AC_VHT40;
2172 phymode = MODE_11AC_VHT20;
2173 } else if (sta->deflink.ht_cap.ht_supported &&
2174 !ath12k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
2175 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2176 phymode = MODE_11NG_HT40;
2178 phymode = MODE_11NG_HT20;
2179 } else if (ath12k_mac_sta_has_ofdm_only(sta)) {
2185 case NL80211_BAND_5GHZ:
2186 case NL80211_BAND_6GHZ:
2187 /* Check EHT first */
2188 if (sta->deflink.eht_cap.has_eht) {
2189 phymode = ath12k_mac_get_phymode_eht(ar, sta);
2190 } else if (sta->deflink.he_cap.has_he) {
2191 phymode = ath12k_mac_get_phymode_he(ar, sta);
2192 } else if (sta->deflink.vht_cap.vht_supported &&
2193 !ath12k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
2194 phymode = ath12k_mac_get_phymode_vht(ar, sta);
2195 } else if (sta->deflink.ht_cap.ht_supported &&
2196 !ath12k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
2197 if (sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40)
2198 phymode = MODE_11NA_HT40;
2200 phymode = MODE_11NA_HT20;
2209 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac peer %pM phymode %s\n",
2210 sta->addr, ath12k_mac_phymode_str(phymode));
2212 arg->peer_phymode = phymode;
2213 WARN_ON(phymode == MODE_UNKNOWN);
2216 static void ath12k_mac_set_eht_mcs(u8 rx_tx_mcs7, u8 rx_tx_mcs9,
2217 u8 rx_tx_mcs11, u8 rx_tx_mcs13,
2218 u32 *rx_mcs, u32 *tx_mcs)
2221 u32p_replace_bits(rx_mcs,
2222 u8_get_bits(rx_tx_mcs7, IEEE80211_EHT_MCS_NSS_RX),
2223 WMI_EHT_MCS_NSS_0_7);
2224 u32p_replace_bits(rx_mcs,
2225 u8_get_bits(rx_tx_mcs9, IEEE80211_EHT_MCS_NSS_RX),
2226 WMI_EHT_MCS_NSS_8_9);
2227 u32p_replace_bits(rx_mcs,
2228 u8_get_bits(rx_tx_mcs11, IEEE80211_EHT_MCS_NSS_RX),
2229 WMI_EHT_MCS_NSS_10_11);
2230 u32p_replace_bits(rx_mcs,
2231 u8_get_bits(rx_tx_mcs13, IEEE80211_EHT_MCS_NSS_RX),
2232 WMI_EHT_MCS_NSS_12_13);
2235 u32p_replace_bits(tx_mcs,
2236 u8_get_bits(rx_tx_mcs7, IEEE80211_EHT_MCS_NSS_TX),
2237 WMI_EHT_MCS_NSS_0_7);
2238 u32p_replace_bits(tx_mcs,
2239 u8_get_bits(rx_tx_mcs9, IEEE80211_EHT_MCS_NSS_TX),
2240 WMI_EHT_MCS_NSS_8_9);
2241 u32p_replace_bits(tx_mcs,
2242 u8_get_bits(rx_tx_mcs11, IEEE80211_EHT_MCS_NSS_TX),
2243 WMI_EHT_MCS_NSS_10_11);
2244 u32p_replace_bits(tx_mcs,
2245 u8_get_bits(rx_tx_mcs13, IEEE80211_EHT_MCS_NSS_TX),
2246 WMI_EHT_MCS_NSS_12_13);
2249 static void ath12k_mac_set_eht_ppe_threshold(const u8 *ppe_thres,
2250 struct ath12k_wmi_ppe_threshold_arg *ppet)
2252 u32 bit_pos = IEEE80211_EHT_PPE_THRES_INFO_HEADER_SIZE, val;
2254 u8 ppet_bit_len_per_ru = IEEE80211_EHT_PPE_THRES_INFO_PPET_SIZE * 2;
2256 ppet->numss_m1 = u8_get_bits(ppe_thres[0], IEEE80211_EHT_PPE_THRES_NSS_MASK);
2257 ppet->ru_bit_mask = u16_get_bits(get_unaligned_le16(ppe_thres),
2258 IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK);
2260 for (nss = 0; nss <= ppet->numss_m1; nss++) {
2262 ru < hweight16(IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK);
2264 if ((ppet->ru_bit_mask & BIT(ru)) == 0)
2268 for (i = 0; i < ppet_bit_len_per_ru; i++) {
2269 val |= (((ppe_thres[bit_pos / 8] >>
2270 (bit_pos % 8)) & 0x1) << i);
2273 ppet->ppet16_ppet8_ru3_ru0[nss] |=
2274 (val << (ru * ppet_bit_len_per_ru));
2279 static void ath12k_peer_assoc_h_eht(struct ath12k *ar,
2280 struct ieee80211_vif *vif,
2281 struct ieee80211_sta *sta,
2282 struct ath12k_wmi_peer_assoc_arg *arg)
2284 const struct ieee80211_sta_eht_cap *eht_cap = &sta->deflink.eht_cap;
2285 const struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap;
2286 const struct ieee80211_eht_mcs_nss_supp_20mhz_only *bw_20;
2287 const struct ieee80211_eht_mcs_nss_supp_bw *bw;
2288 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
2289 u32 *rx_mcs, *tx_mcs;
2291 if (!sta->deflink.he_cap.has_he || !eht_cap->has_eht)
2294 arg->eht_flag = true;
2296 if ((eht_cap->eht_cap_elem.phy_cap_info[5] &
2297 IEEE80211_EHT_PHY_CAP5_PPE_THRESHOLD_PRESENT) &&
2298 eht_cap->eht_ppe_thres[0] != 0)
2299 ath12k_mac_set_eht_ppe_threshold(eht_cap->eht_ppe_thres,
2300 &arg->peer_eht_ppet);
2302 memcpy(arg->peer_eht_cap_mac, eht_cap->eht_cap_elem.mac_cap_info,
2303 sizeof(eht_cap->eht_cap_elem.mac_cap_info));
2304 memcpy(arg->peer_eht_cap_phy, eht_cap->eht_cap_elem.phy_cap_info,
2305 sizeof(eht_cap->eht_cap_elem.phy_cap_info));
2307 rx_mcs = arg->peer_eht_rx_mcs_set;
2308 tx_mcs = arg->peer_eht_tx_mcs_set;
2310 switch (sta->deflink.bandwidth) {
2311 case IEEE80211_STA_RX_BW_320:
2312 bw = &eht_cap->eht_mcs_nss_supp.bw._320;
2313 ath12k_mac_set_eht_mcs(bw->rx_tx_mcs9_max_nss,
2314 bw->rx_tx_mcs9_max_nss,
2315 bw->rx_tx_mcs11_max_nss,
2316 bw->rx_tx_mcs13_max_nss,
2317 &rx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_320],
2318 &tx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_320]);
2319 arg->peer_eht_mcs_count++;
2321 case IEEE80211_STA_RX_BW_160:
2322 bw = &eht_cap->eht_mcs_nss_supp.bw._160;
2323 ath12k_mac_set_eht_mcs(bw->rx_tx_mcs9_max_nss,
2324 bw->rx_tx_mcs9_max_nss,
2325 bw->rx_tx_mcs11_max_nss,
2326 bw->rx_tx_mcs13_max_nss,
2327 &rx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_160],
2328 &tx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_160]);
2329 arg->peer_eht_mcs_count++;
2332 if ((he_cap->he_cap_elem.phy_cap_info[0] &
2333 (IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G |
2334 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G |
2335 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G |
2336 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)) == 0) {
2337 bw_20 = &eht_cap->eht_mcs_nss_supp.only_20mhz;
2339 ath12k_mac_set_eht_mcs(bw_20->rx_tx_mcs7_max_nss,
2340 bw_20->rx_tx_mcs9_max_nss,
2341 bw_20->rx_tx_mcs11_max_nss,
2342 bw_20->rx_tx_mcs13_max_nss,
2343 &rx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_80],
2344 &tx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_80]);
2346 bw = &eht_cap->eht_mcs_nss_supp.bw._80;
2347 ath12k_mac_set_eht_mcs(bw->rx_tx_mcs9_max_nss,
2348 bw->rx_tx_mcs9_max_nss,
2349 bw->rx_tx_mcs11_max_nss,
2350 bw->rx_tx_mcs13_max_nss,
2351 &rx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_80],
2352 &tx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_80]);
2355 arg->peer_eht_mcs_count++;
2359 arg->punct_bitmap = ~arvif->punct_bitmap;
2362 static void ath12k_peer_assoc_prepare(struct ath12k *ar,
2363 struct ieee80211_vif *vif,
2364 struct ieee80211_sta *sta,
2365 struct ath12k_wmi_peer_assoc_arg *arg,
2368 lockdep_assert_held(&ar->conf_mutex);
2370 memset(arg, 0, sizeof(*arg));
2372 reinit_completion(&ar->peer_assoc_done);
2374 arg->peer_new_assoc = !reassoc;
2375 ath12k_peer_assoc_h_basic(ar, vif, sta, arg);
2376 ath12k_peer_assoc_h_crypto(ar, vif, sta, arg);
2377 ath12k_peer_assoc_h_rates(ar, vif, sta, arg);
2378 ath12k_peer_assoc_h_ht(ar, vif, sta, arg);
2379 ath12k_peer_assoc_h_vht(ar, vif, sta, arg);
2380 ath12k_peer_assoc_h_he(ar, vif, sta, arg);
2381 ath12k_peer_assoc_h_eht(ar, vif, sta, arg);
2382 ath12k_peer_assoc_h_qos(ar, vif, sta, arg);
2383 ath12k_peer_assoc_h_phymode(ar, vif, sta, arg);
2384 ath12k_peer_assoc_h_smps(sta, arg);
2386 /* TODO: amsdu_disable req? */
2389 static int ath12k_setup_peer_smps(struct ath12k *ar, struct ath12k_vif *arvif,
2391 const struct ieee80211_sta_ht_cap *ht_cap)
2395 if (!ht_cap->ht_supported)
2398 smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
2399 smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
2401 if (smps >= ARRAY_SIZE(ath12k_smps_map))
2404 return ath12k_wmi_set_peer_param(ar, addr, arvif->vdev_id,
2405 WMI_PEER_MIMO_PS_STATE,
2406 ath12k_smps_map[smps]);
2409 static void ath12k_bss_assoc(struct ath12k *ar,
2410 struct ath12k_vif *arvif,
2411 struct ieee80211_bss_conf *bss_conf)
2413 struct ieee80211_vif *vif = arvif->vif;
2414 struct ath12k_wmi_peer_assoc_arg peer_arg;
2415 struct ieee80211_sta *ap_sta;
2416 struct ath12k_peer *peer;
2417 bool is_auth = false;
2420 lockdep_assert_held(&ar->conf_mutex);
2422 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %i assoc bssid %pM aid %d\n",
2423 arvif->vdev_id, arvif->bssid, arvif->aid);
2427 ap_sta = ieee80211_find_sta(vif, bss_conf->bssid);
2429 ath12k_warn(ar->ab, "failed to find station entry for bss %pM vdev %i\n",
2430 bss_conf->bssid, arvif->vdev_id);
2435 ath12k_peer_assoc_prepare(ar, vif, ap_sta, &peer_arg, false);
2439 ret = ath12k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
2441 ath12k_warn(ar->ab, "failed to run peer assoc for %pM vdev %i: %d\n",
2442 bss_conf->bssid, arvif->vdev_id, ret);
2446 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) {
2447 ath12k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
2448 bss_conf->bssid, arvif->vdev_id);
2452 ret = ath12k_setup_peer_smps(ar, arvif, bss_conf->bssid,
2453 &ap_sta->deflink.ht_cap);
2455 ath12k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n",
2456 arvif->vdev_id, ret);
2460 WARN_ON(arvif->is_up);
2462 arvif->aid = vif->cfg.aid;
2463 ether_addr_copy(arvif->bssid, bss_conf->bssid);
2465 ret = ath12k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid);
2467 ath12k_warn(ar->ab, "failed to set vdev %d up: %d\n",
2468 arvif->vdev_id, ret);
2472 arvif->is_up = true;
2474 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
2475 "mac vdev %d up (associated) bssid %pM aid %d\n",
2476 arvif->vdev_id, bss_conf->bssid, vif->cfg.aid);
2478 spin_lock_bh(&ar->ab->base_lock);
2480 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arvif->bssid);
2481 if (peer && peer->is_authorized)
2484 spin_unlock_bh(&ar->ab->base_lock);
2486 /* Authorize BSS Peer */
2488 ret = ath12k_wmi_set_peer_param(ar, arvif->bssid,
2493 ath12k_warn(ar->ab, "Unable to authorize BSS peer: %d\n", ret);
2496 ret = ath12k_wmi_send_obss_spr_cmd(ar, arvif->vdev_id,
2497 &bss_conf->he_obss_pd);
2499 ath12k_warn(ar->ab, "failed to set vdev %i OBSS PD parameters: %d\n",
2500 arvif->vdev_id, ret);
2503 static void ath12k_bss_disassoc(struct ath12k *ar,
2504 struct ath12k_vif *arvif)
2508 lockdep_assert_held(&ar->conf_mutex);
2510 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %i disassoc bssid %pM\n",
2511 arvif->vdev_id, arvif->bssid);
2513 ret = ath12k_wmi_vdev_down(ar, arvif->vdev_id);
2515 ath12k_warn(ar->ab, "failed to down vdev %i: %d\n",
2516 arvif->vdev_id, ret);
2518 arvif->is_up = false;
2520 /* TODO: cancel connection_loss_work */
2523 static u32 ath12k_mac_get_rate_hw_value(int bitrate)
2530 if (ath12k_mac_bitrate_is_cck(bitrate))
2531 preamble = WMI_RATE_PREAMBLE_CCK;
2533 preamble = WMI_RATE_PREAMBLE_OFDM;
2535 for (i = 0; i < ARRAY_SIZE(ath12k_legacy_rates); i++) {
2536 if (ath12k_legacy_rates[i].bitrate != bitrate)
2539 hw_value = ath12k_legacy_rates[i].hw_value;
2540 rate = ATH12K_HW_RATE_CODE(hw_value, 0, preamble);
2548 static void ath12k_recalculate_mgmt_rate(struct ath12k *ar,
2549 struct ieee80211_vif *vif,
2550 struct cfg80211_chan_def *def)
2552 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
2553 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
2554 const struct ieee80211_supported_band *sband;
2561 lockdep_assert_held(&ar->conf_mutex);
2563 sband = hw->wiphy->bands[def->chan->band];
2564 basic_rate_idx = ffs(vif->bss_conf.basic_rates) - 1;
2565 bitrate = sband->bitrates[basic_rate_idx].bitrate;
2567 hw_rate_code = ath12k_mac_get_rate_hw_value(bitrate);
2568 if (hw_rate_code < 0) {
2569 ath12k_warn(ar->ab, "bitrate not supported %d\n", bitrate);
2573 vdev_param = WMI_VDEV_PARAM_MGMT_RATE;
2574 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param,
2577 ath12k_warn(ar->ab, "failed to set mgmt tx rate %d\n", ret);
2579 vdev_param = WMI_VDEV_PARAM_BEACON_RATE;
2580 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param,
2583 ath12k_warn(ar->ab, "failed to set beacon tx rate %d\n", ret);
2586 static int ath12k_mac_fils_discovery(struct ath12k_vif *arvif,
2587 struct ieee80211_bss_conf *info)
2589 struct ath12k *ar = arvif->ar;
2590 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
2591 struct sk_buff *tmpl;
2594 bool unsol_bcast_probe_resp_enabled = false;
2596 if (info->fils_discovery.max_interval) {
2597 interval = info->fils_discovery.max_interval;
2599 tmpl = ieee80211_get_fils_discovery_tmpl(hw, arvif->vif);
2601 ret = ath12k_wmi_fils_discovery_tmpl(ar, arvif->vdev_id,
2603 } else if (info->unsol_bcast_probe_resp_interval) {
2604 unsol_bcast_probe_resp_enabled = 1;
2605 interval = info->unsol_bcast_probe_resp_interval;
2607 tmpl = ieee80211_get_unsol_bcast_probe_resp_tmpl(hw,
2610 ret = ath12k_wmi_probe_resp_tmpl(ar, arvif->vdev_id,
2612 } else { /* Disable */
2613 return ath12k_wmi_fils_discovery(ar, arvif->vdev_id, 0, false);
2618 "mac vdev %i failed to retrieve %s template\n",
2619 arvif->vdev_id, (unsol_bcast_probe_resp_enabled ?
2620 "unsolicited broadcast probe response" :
2627 ret = ath12k_wmi_fils_discovery(ar, arvif->vdev_id, interval,
2628 unsol_bcast_probe_resp_enabled);
2633 static void ath12k_mac_vif_setup_ps(struct ath12k_vif *arvif)
2635 struct ath12k *ar = arvif->ar;
2636 struct ieee80211_vif *vif = arvif->vif;
2637 struct ieee80211_conf *conf = &ath12k_ar_to_hw(ar)->conf;
2638 enum wmi_sta_powersave_param param;
2639 enum wmi_sta_ps_mode psmode;
2644 lockdep_assert_held(&ar->conf_mutex);
2646 if (vif->type != NL80211_IFTYPE_STATION)
2649 enable_ps = arvif->ps;
2651 psmode = WMI_STA_PS_MODE_ENABLED;
2652 param = WMI_STA_PS_PARAM_INACTIVITY_TIME;
2654 timeout = conf->dynamic_ps_timeout;
2656 /* firmware doesn't like 0 */
2657 timeout = ieee80211_tu_to_usec(vif->bss_conf.beacon_int) / 1000;
2660 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param,
2663 ath12k_warn(ar->ab, "failed to set inactivity time for vdev %d: %i\n",
2664 arvif->vdev_id, ret);
2668 psmode = WMI_STA_PS_MODE_DISABLED;
2671 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %d psmode %s\n",
2672 arvif->vdev_id, psmode ? "enable" : "disable");
2674 ret = ath12k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id, psmode);
2676 ath12k_warn(ar->ab, "failed to set sta power save mode %d for vdev %d: %d\n",
2677 psmode, arvif->vdev_id, ret);
2680 static void ath12k_mac_bss_info_changed(struct ath12k *ar,
2681 struct ath12k_vif *arvif,
2682 struct ieee80211_bss_conf *info,
2685 struct ieee80211_vif *vif = arvif->vif;
2686 struct ieee80211_vif_cfg *vif_cfg = &vif->cfg;
2687 struct cfg80211_chan_def def;
2688 u32 param_id, param_value;
2689 enum nl80211_band band;
2699 lockdep_assert_held(&ar->conf_mutex);
2701 if (changed & BSS_CHANGED_BEACON_INT) {
2702 arvif->beacon_interval = info->beacon_int;
2704 param_id = WMI_VDEV_PARAM_BEACON_INTERVAL;
2705 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
2707 arvif->beacon_interval);
2709 ath12k_warn(ar->ab, "Failed to set beacon interval for VDEV: %d\n",
2712 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
2713 "Beacon interval: %d set for VDEV: %d\n",
2714 arvif->beacon_interval, arvif->vdev_id);
2717 if (changed & BSS_CHANGED_BEACON) {
2718 param_id = WMI_PDEV_PARAM_BEACON_TX_MODE;
2719 param_value = WMI_BEACON_BURST_MODE;
2720 ret = ath12k_wmi_pdev_set_param(ar, param_id,
2721 param_value, ar->pdev->pdev_id);
2723 ath12k_warn(ar->ab, "Failed to set beacon mode for VDEV: %d\n",
2726 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
2727 "Set burst beacon mode for VDEV: %d\n",
2730 ret = ath12k_mac_setup_bcn_tmpl(arvif);
2732 ath12k_warn(ar->ab, "failed to update bcn template: %d\n",
2736 if (changed & (BSS_CHANGED_BEACON_INFO | BSS_CHANGED_BEACON)) {
2737 arvif->dtim_period = info->dtim_period;
2739 param_id = WMI_VDEV_PARAM_DTIM_PERIOD;
2740 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
2742 arvif->dtim_period);
2745 ath12k_warn(ar->ab, "Failed to set dtim period for VDEV %d: %i\n",
2746 arvif->vdev_id, ret);
2748 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
2749 "DTIM period: %d set for VDEV: %d\n",
2750 arvif->dtim_period, arvif->vdev_id);
2753 if (changed & BSS_CHANGED_SSID &&
2754 vif->type == NL80211_IFTYPE_AP) {
2755 arvif->u.ap.ssid_len = vif->cfg.ssid_len;
2756 if (vif->cfg.ssid_len)
2757 memcpy(arvif->u.ap.ssid, vif->cfg.ssid, vif->cfg.ssid_len);
2758 arvif->u.ap.hidden_ssid = info->hidden_ssid;
2761 if (changed & BSS_CHANGED_BSSID && !is_zero_ether_addr(info->bssid))
2762 ether_addr_copy(arvif->bssid, info->bssid);
2764 if (changed & BSS_CHANGED_BEACON_ENABLED) {
2765 ath12k_control_beaconing(arvif, info);
2767 if (arvif->is_up && vif->bss_conf.he_support &&
2768 vif->bss_conf.he_oper.params) {
2769 /* TODO: Extend to support 1024 BA Bitmap size */
2770 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
2771 WMI_VDEV_PARAM_BA_MODE,
2772 WMI_BA_MODE_BUFFER_SIZE_256);
2775 "failed to set BA BUFFER SIZE 256 for vdev: %d\n",
2778 param_id = WMI_VDEV_PARAM_HEOPS_0_31;
2779 param_value = vif->bss_conf.he_oper.params;
2780 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
2781 param_id, param_value);
2782 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
2783 "he oper param: %x set for VDEV: %d\n",
2784 param_value, arvif->vdev_id);
2787 ath12k_warn(ar->ab, "Failed to set he oper params %x for VDEV %d: %i\n",
2788 param_value, arvif->vdev_id, ret);
2792 if (changed & BSS_CHANGED_ERP_CTS_PROT) {
2795 cts_prot = !!(info->use_cts_prot);
2796 param_id = WMI_VDEV_PARAM_PROTECTION_MODE;
2798 if (arvif->is_started) {
2799 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
2800 param_id, cts_prot);
2802 ath12k_warn(ar->ab, "Failed to set CTS prot for VDEV: %d\n",
2805 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "Set CTS prot: %d for VDEV: %d\n",
2806 cts_prot, arvif->vdev_id);
2808 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "defer protection mode setup, vdev is not ready yet\n");
2812 if (changed & BSS_CHANGED_ERP_SLOT) {
2815 if (info->use_short_slot)
2816 slottime = WMI_VDEV_SLOT_TIME_SHORT; /* 9us */
2819 slottime = WMI_VDEV_SLOT_TIME_LONG; /* 20us */
2821 param_id = WMI_VDEV_PARAM_SLOT_TIME;
2822 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
2823 param_id, slottime);
2825 ath12k_warn(ar->ab, "Failed to set erp slot for VDEV: %d\n",
2828 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
2829 "Set slottime: %d for VDEV: %d\n",
2830 slottime, arvif->vdev_id);
2833 if (changed & BSS_CHANGED_ERP_PREAMBLE) {
2836 if (info->use_short_preamble)
2837 preamble = WMI_VDEV_PREAMBLE_SHORT;
2839 preamble = WMI_VDEV_PREAMBLE_LONG;
2841 param_id = WMI_VDEV_PARAM_PREAMBLE;
2842 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
2843 param_id, preamble);
2845 ath12k_warn(ar->ab, "Failed to set preamble for VDEV: %d\n",
2848 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
2849 "Set preamble: %d for VDEV: %d\n",
2850 preamble, arvif->vdev_id);
2853 if (changed & BSS_CHANGED_ASSOC) {
2855 ath12k_bss_assoc(ar, arvif, info);
2857 ath12k_bss_disassoc(ar, arvif);
2860 if (changed & BSS_CHANGED_TXPOWER) {
2861 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev_id %i txpower %d\n",
2862 arvif->vdev_id, info->txpower);
2864 arvif->txpower = info->txpower;
2865 ath12k_mac_txpower_recalc(ar);
2868 if (changed & BSS_CHANGED_MCAST_RATE &&
2869 !ath12k_mac_vif_chan(arvif->vif, &def)) {
2870 band = def.chan->band;
2871 mcast_rate = vif->bss_conf.mcast_rate[band];
2874 rateidx = mcast_rate - 1;
2876 rateidx = ffs(vif->bss_conf.basic_rates) - 1;
2878 if (ar->pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP)
2879 rateidx += ATH12K_MAC_FIRST_OFDM_RATE_IDX;
2881 bitrate = ath12k_legacy_rates[rateidx].bitrate;
2882 hw_value = ath12k_legacy_rates[rateidx].hw_value;
2884 if (ath12k_mac_bitrate_is_cck(bitrate))
2885 preamble = WMI_RATE_PREAMBLE_CCK;
2887 preamble = WMI_RATE_PREAMBLE_OFDM;
2889 rate = ATH12K_HW_RATE_CODE(hw_value, 0, preamble);
2891 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
2892 "mac vdev %d mcast_rate %x\n",
2893 arvif->vdev_id, rate);
2895 vdev_param = WMI_VDEV_PARAM_MCAST_DATA_RATE;
2896 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
2900 "failed to set mcast rate on vdev %i: %d\n",
2901 arvif->vdev_id, ret);
2903 vdev_param = WMI_VDEV_PARAM_BCAST_DATA_RATE;
2904 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
2908 "failed to set bcast rate on vdev %i: %d\n",
2909 arvif->vdev_id, ret);
2912 if (changed & BSS_CHANGED_BASIC_RATES &&
2913 !ath12k_mac_vif_chan(arvif->vif, &def))
2914 ath12k_recalculate_mgmt_rate(ar, vif, &def);
2916 if (changed & BSS_CHANGED_TWT) {
2917 if (info->twt_requester || info->twt_responder)
2918 ath12k_wmi_send_twt_enable_cmd(ar, ar->pdev->pdev_id);
2920 ath12k_wmi_send_twt_disable_cmd(ar, ar->pdev->pdev_id);
2923 if (changed & BSS_CHANGED_HE_OBSS_PD)
2924 ath12k_wmi_send_obss_spr_cmd(ar, arvif->vdev_id,
2927 if (changed & BSS_CHANGED_HE_BSS_COLOR) {
2928 if (vif->type == NL80211_IFTYPE_AP) {
2929 ret = ath12k_wmi_obss_color_cfg_cmd(ar,
2931 info->he_bss_color.color,
2932 ATH12K_BSS_COLOR_AP_PERIODS,
2933 info->he_bss_color.enabled);
2935 ath12k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n",
2936 arvif->vdev_id, ret);
2937 } else if (vif->type == NL80211_IFTYPE_STATION) {
2938 ret = ath12k_wmi_send_bss_color_change_enable_cmd(ar,
2942 ath12k_warn(ar->ab, "failed to enable bss color change on vdev %i: %d\n",
2943 arvif->vdev_id, ret);
2944 ret = ath12k_wmi_obss_color_cfg_cmd(ar,
2947 ATH12K_BSS_COLOR_STA_PERIODS,
2950 ath12k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n",
2951 arvif->vdev_id, ret);
2955 ath12k_mac_fils_discovery(arvif, info);
2957 if (changed & BSS_CHANGED_PS &&
2958 ar->ab->hw_params->supports_sta_ps) {
2959 arvif->ps = vif_cfg->ps;
2960 ath12k_mac_vif_setup_ps(arvif);
2964 static void ath12k_mac_op_bss_info_changed(struct ieee80211_hw *hw,
2965 struct ieee80211_vif *vif,
2966 struct ieee80211_bss_conf *info,
2969 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
2971 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
2973 ar = ath12k_ah_to_ar(ah);
2975 mutex_lock(&ar->conf_mutex);
2977 ath12k_mac_bss_info_changed(ar, arvif, info, changed);
2979 mutex_unlock(&ar->conf_mutex);
2982 void __ath12k_mac_scan_finish(struct ath12k *ar)
2984 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
2986 lockdep_assert_held(&ar->data_lock);
2988 switch (ar->scan.state) {
2989 case ATH12K_SCAN_IDLE:
2991 case ATH12K_SCAN_RUNNING:
2992 case ATH12K_SCAN_ABORTING:
2993 if (ar->scan.is_roc && ar->scan.roc_notify)
2994 ieee80211_remain_on_channel_expired(hw);
2996 case ATH12K_SCAN_STARTING:
2997 if (!ar->scan.is_roc) {
2998 struct cfg80211_scan_info info = {
2999 .aborted = ((ar->scan.state ==
3000 ATH12K_SCAN_ABORTING) ||
3002 ATH12K_SCAN_STARTING)),
3005 ieee80211_scan_completed(hw, &info);
3008 ar->scan.state = ATH12K_SCAN_IDLE;
3009 ar->scan_channel = NULL;
3010 ar->scan.roc_freq = 0;
3011 cancel_delayed_work(&ar->scan.timeout);
3012 complete(&ar->scan.completed);
3017 void ath12k_mac_scan_finish(struct ath12k *ar)
3019 spin_lock_bh(&ar->data_lock);
3020 __ath12k_mac_scan_finish(ar);
3021 spin_unlock_bh(&ar->data_lock);
3024 static int ath12k_scan_stop(struct ath12k *ar)
3026 struct ath12k_wmi_scan_cancel_arg arg = {
3027 .req_type = WLAN_SCAN_CANCEL_SINGLE,
3028 .scan_id = ATH12K_SCAN_ID,
3032 lockdep_assert_held(&ar->conf_mutex);
3034 /* TODO: Fill other STOP Params */
3035 arg.pdev_id = ar->pdev->pdev_id;
3037 ret = ath12k_wmi_send_scan_stop_cmd(ar, &arg);
3039 ath12k_warn(ar->ab, "failed to stop wmi scan: %d\n", ret);
3043 ret = wait_for_completion_timeout(&ar->scan.completed, 3 * HZ);
3046 "failed to receive scan abort comple: timed out\n");
3048 } else if (ret > 0) {
3053 /* Scan state should be updated upon scan completion but in case
3054 * firmware fails to deliver the event (for whatever reason) it is
3055 * desired to clean up scan state anyway. Firmware may have just
3056 * dropped the scan completion event delivery due to transport pipe
3057 * being overflown with data and/or it can recover on its own before
3058 * next scan request is submitted.
3060 spin_lock_bh(&ar->data_lock);
3061 if (ar->scan.state != ATH12K_SCAN_IDLE)
3062 __ath12k_mac_scan_finish(ar);
3063 spin_unlock_bh(&ar->data_lock);
3068 static void ath12k_scan_abort(struct ath12k *ar)
3072 lockdep_assert_held(&ar->conf_mutex);
3074 spin_lock_bh(&ar->data_lock);
3076 switch (ar->scan.state) {
3077 case ATH12K_SCAN_IDLE:
3078 /* This can happen if timeout worker kicked in and called
3079 * abortion while scan completion was being processed.
3082 case ATH12K_SCAN_STARTING:
3083 case ATH12K_SCAN_ABORTING:
3084 ath12k_warn(ar->ab, "refusing scan abortion due to invalid scan state: %d\n",
3087 case ATH12K_SCAN_RUNNING:
3088 ar->scan.state = ATH12K_SCAN_ABORTING;
3089 spin_unlock_bh(&ar->data_lock);
3091 ret = ath12k_scan_stop(ar);
3093 ath12k_warn(ar->ab, "failed to abort scan: %d\n", ret);
3095 spin_lock_bh(&ar->data_lock);
3099 spin_unlock_bh(&ar->data_lock);
3102 static void ath12k_scan_timeout_work(struct work_struct *work)
3104 struct ath12k *ar = container_of(work, struct ath12k,
3107 mutex_lock(&ar->conf_mutex);
3108 ath12k_scan_abort(ar);
3109 mutex_unlock(&ar->conf_mutex);
3112 static int ath12k_start_scan(struct ath12k *ar,
3113 struct ath12k_wmi_scan_req_arg *arg)
3117 lockdep_assert_held(&ar->conf_mutex);
3119 ret = ath12k_wmi_send_scan_start_cmd(ar, arg);
3123 ret = wait_for_completion_timeout(&ar->scan.started, 1 * HZ);
3125 ret = ath12k_scan_stop(ar);
3127 ath12k_warn(ar->ab, "failed to stop scan: %d\n", ret);
3132 /* If we failed to start the scan, return error code at
3133 * this point. This is probably due to some issue in the
3134 * firmware, but no need to wedge the driver due to that...
3136 spin_lock_bh(&ar->data_lock);
3137 if (ar->scan.state == ATH12K_SCAN_IDLE) {
3138 spin_unlock_bh(&ar->data_lock);
3141 spin_unlock_bh(&ar->data_lock);
3146 static int ath12k_mac_op_hw_scan(struct ieee80211_hw *hw,
3147 struct ieee80211_vif *vif,
3148 struct ieee80211_scan_request *hw_req)
3150 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
3152 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
3153 struct cfg80211_scan_request *req = &hw_req->req;
3154 struct ath12k_wmi_scan_req_arg arg = {};
3158 ar = ath12k_ah_to_ar(ah);
3160 mutex_lock(&ar->conf_mutex);
3162 spin_lock_bh(&ar->data_lock);
3163 switch (ar->scan.state) {
3164 case ATH12K_SCAN_IDLE:
3165 reinit_completion(&ar->scan.started);
3166 reinit_completion(&ar->scan.completed);
3167 ar->scan.state = ATH12K_SCAN_STARTING;
3168 ar->scan.is_roc = false;
3169 ar->scan.vdev_id = arvif->vdev_id;
3172 case ATH12K_SCAN_STARTING:
3173 case ATH12K_SCAN_RUNNING:
3174 case ATH12K_SCAN_ABORTING:
3178 spin_unlock_bh(&ar->data_lock);
3183 ath12k_wmi_start_scan_init(ar, &arg);
3184 arg.vdev_id = arvif->vdev_id;
3185 arg.scan_id = ATH12K_SCAN_ID;
3188 arg.extraie.ptr = kmemdup(req->ie, req->ie_len, GFP_KERNEL);
3189 if (!arg.extraie.ptr) {
3193 arg.extraie.len = req->ie_len;
3197 arg.num_ssids = req->n_ssids;
3198 for (i = 0; i < arg.num_ssids; i++)
3199 arg.ssid[i] = req->ssids[i];
3201 arg.scan_f_passive = 1;
3204 if (req->n_channels) {
3205 arg.num_chan = req->n_channels;
3206 arg.chan_list = kcalloc(arg.num_chan, sizeof(*arg.chan_list),
3209 if (!arg.chan_list) {
3214 for (i = 0; i < arg.num_chan; i++)
3215 arg.chan_list[i] = req->channels[i]->center_freq;
3218 ret = ath12k_start_scan(ar, &arg);
3220 ath12k_warn(ar->ab, "failed to start hw scan: %d\n", ret);
3221 spin_lock_bh(&ar->data_lock);
3222 ar->scan.state = ATH12K_SCAN_IDLE;
3223 spin_unlock_bh(&ar->data_lock);
3226 /* Add a margin to account for event/command processing */
3227 ieee80211_queue_delayed_work(ath12k_ar_to_hw(ar), &ar->scan.timeout,
3228 msecs_to_jiffies(arg.max_scan_time +
3229 ATH12K_MAC_SCAN_TIMEOUT_MSECS));
3232 kfree(arg.chan_list);
3235 kfree(arg.extraie.ptr);
3237 mutex_unlock(&ar->conf_mutex);
3242 static void ath12k_mac_op_cancel_hw_scan(struct ieee80211_hw *hw,
3243 struct ieee80211_vif *vif)
3245 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
3248 ar = ath12k_ah_to_ar(ah);
3250 mutex_lock(&ar->conf_mutex);
3251 ath12k_scan_abort(ar);
3252 mutex_unlock(&ar->conf_mutex);
3254 cancel_delayed_work_sync(&ar->scan.timeout);
3257 static int ath12k_install_key(struct ath12k_vif *arvif,
3258 struct ieee80211_key_conf *key,
3259 enum set_key_cmd cmd,
3260 const u8 *macaddr, u32 flags)
3263 struct ath12k *ar = arvif->ar;
3264 struct wmi_vdev_install_key_arg arg = {
3265 .vdev_id = arvif->vdev_id,
3266 .key_idx = key->keyidx,
3267 .key_len = key->keylen,
3268 .key_data = key->key,
3273 lockdep_assert_held(&arvif->ar->conf_mutex);
3275 reinit_completion(&ar->install_key_done);
3277 if (test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags))
3280 if (cmd == DISABLE_KEY) {
3281 /* TODO: Check if FW expects value other than NONE for del */
3282 /* arg.key_cipher = WMI_CIPHER_NONE; */
3284 arg.key_data = NULL;
3288 switch (key->cipher) {
3289 case WLAN_CIPHER_SUITE_CCMP:
3290 arg.key_cipher = WMI_CIPHER_AES_CCM;
3291 /* TODO: Re-check if flag is valid */
3292 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT;
3294 case WLAN_CIPHER_SUITE_TKIP:
3295 arg.key_cipher = WMI_CIPHER_TKIP;
3296 arg.key_txmic_len = 8;
3297 arg.key_rxmic_len = 8;
3299 case WLAN_CIPHER_SUITE_CCMP_256:
3300 arg.key_cipher = WMI_CIPHER_AES_CCM;
3302 case WLAN_CIPHER_SUITE_GCMP:
3303 case WLAN_CIPHER_SUITE_GCMP_256:
3304 arg.key_cipher = WMI_CIPHER_AES_GCM;
3307 ath12k_warn(ar->ab, "cipher %d is not supported\n", key->cipher);
3311 if (test_bit(ATH12K_FLAG_RAW_MODE, &ar->ab->dev_flags))
3312 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV |
3313 IEEE80211_KEY_FLAG_RESERVE_TAILROOM;
3316 ret = ath12k_wmi_vdev_install_key(arvif->ar, &arg);
3321 if (!wait_for_completion_timeout(&ar->install_key_done, 1 * HZ))
3324 if (ether_addr_equal(macaddr, arvif->vif->addr))
3325 arvif->key_cipher = key->cipher;
3327 return ar->install_key_status ? -EINVAL : 0;
3330 static int ath12k_clear_peer_keys(struct ath12k_vif *arvif,
3333 struct ath12k *ar = arvif->ar;
3334 struct ath12k_base *ab = ar->ab;
3335 struct ath12k_peer *peer;
3336 int first_errno = 0;
3341 lockdep_assert_held(&ar->conf_mutex);
3343 spin_lock_bh(&ab->base_lock);
3344 peer = ath12k_peer_find(ab, arvif->vdev_id, addr);
3345 spin_unlock_bh(&ab->base_lock);
3350 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
3354 /* key flags are not required to delete the key */
3355 ret = ath12k_install_key(arvif, peer->keys[i],
3356 DISABLE_KEY, addr, flags);
3357 if (ret < 0 && first_errno == 0)
3361 ath12k_warn(ab, "failed to remove peer key %d: %d\n",
3364 spin_lock_bh(&ab->base_lock);
3365 peer->keys[i] = NULL;
3366 spin_unlock_bh(&ab->base_lock);
3372 static int ath12k_mac_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
3373 struct ieee80211_vif *vif, struct ieee80211_sta *sta,
3374 struct ieee80211_key_conf *key)
3376 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
3378 struct ath12k_base *ab;
3379 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
3380 struct ath12k_peer *peer;
3381 struct ath12k_sta *arsta;
3382 const u8 *peer_addr;
3386 /* BIP needs to be done in software */
3387 if (key->cipher == WLAN_CIPHER_SUITE_AES_CMAC ||
3388 key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_128 ||
3389 key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_256 ||
3390 key->cipher == WLAN_CIPHER_SUITE_BIP_CMAC_256)
3393 ar = ath12k_ah_to_ar(ah);
3396 if (test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags))
3399 if (key->keyidx > WMI_MAX_KEY_INDEX)
3402 mutex_lock(&ar->conf_mutex);
3405 peer_addr = sta->addr;
3406 else if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
3407 peer_addr = vif->bss_conf.bssid;
3409 peer_addr = vif->addr;
3411 key->hw_key_idx = key->keyidx;
3413 /* the peer should not disappear in mid-way (unless FW goes awry) since
3414 * we already hold conf_mutex. we just make sure its there now.
3416 spin_lock_bh(&ab->base_lock);
3417 peer = ath12k_peer_find(ab, arvif->vdev_id, peer_addr);
3418 spin_unlock_bh(&ab->base_lock);
3421 if (cmd == SET_KEY) {
3422 ath12k_warn(ab, "cannot install key for non-existent peer %pM\n",
3427 /* if the peer doesn't exist there is no key to disable
3434 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
3435 flags |= WMI_KEY_PAIRWISE;
3437 flags |= WMI_KEY_GROUP;
3439 ret = ath12k_install_key(arvif, key, cmd, peer_addr, flags);
3441 ath12k_warn(ab, "ath12k_install_key failed (%d)\n", ret);
3445 ret = ath12k_dp_rx_peer_pn_replay_config(arvif, peer_addr, cmd, key);
3447 ath12k_warn(ab, "failed to offload PN replay detection %d\n", ret);
3451 spin_lock_bh(&ab->base_lock);
3452 peer = ath12k_peer_find(ab, arvif->vdev_id, peer_addr);
3453 if (peer && cmd == SET_KEY) {
3454 peer->keys[key->keyidx] = key;
3455 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) {
3456 peer->ucast_keyidx = key->keyidx;
3457 peer->sec_type = ath12k_dp_tx_get_encrypt_type(key->cipher);
3459 peer->mcast_keyidx = key->keyidx;
3460 peer->sec_type_grp = ath12k_dp_tx_get_encrypt_type(key->cipher);
3462 } else if (peer && cmd == DISABLE_KEY) {
3463 peer->keys[key->keyidx] = NULL;
3464 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
3465 peer->ucast_keyidx = 0;
3467 peer->mcast_keyidx = 0;
3469 /* impossible unless FW goes crazy */
3470 ath12k_warn(ab, "peer %pM disappeared!\n", peer_addr);
3473 arsta = ath12k_sta_to_arsta(sta);
3475 switch (key->cipher) {
3476 case WLAN_CIPHER_SUITE_TKIP:
3477 case WLAN_CIPHER_SUITE_CCMP:
3478 case WLAN_CIPHER_SUITE_CCMP_256:
3479 case WLAN_CIPHER_SUITE_GCMP:
3480 case WLAN_CIPHER_SUITE_GCMP_256:
3482 arsta->pn_type = HAL_PN_TYPE_WPA;
3484 arsta->pn_type = HAL_PN_TYPE_NONE;
3487 arsta->pn_type = HAL_PN_TYPE_NONE;
3492 spin_unlock_bh(&ab->base_lock);
3495 mutex_unlock(&ar->conf_mutex);
3500 ath12k_mac_bitrate_mask_num_vht_rates(struct ath12k *ar,
3501 enum nl80211_band band,
3502 const struct cfg80211_bitrate_mask *mask)
3507 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++)
3508 num_rates += hweight16(mask->control[band].vht_mcs[i]);
3514 ath12k_mac_set_peer_vht_fixed_rate(struct ath12k_vif *arvif,
3515 struct ieee80211_sta *sta,
3516 const struct cfg80211_bitrate_mask *mask,
3517 enum nl80211_band band)
3519 struct ath12k *ar = arvif->ar;
3524 lockdep_assert_held(&ar->conf_mutex);
3528 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
3529 if (hweight16(mask->control[band].vht_mcs[i]) == 1) {
3531 vht_rate = ffs(mask->control[band].vht_mcs[i]) - 1;
3536 ath12k_warn(ar->ab, "No single VHT Fixed rate found to set for %pM",
3541 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
3542 "Setting Fixed VHT Rate for peer %pM. Device will not switch to any other selected rates",
3545 rate_code = ATH12K_HW_RATE_CODE(vht_rate, nss - 1,
3546 WMI_RATE_PREAMBLE_VHT);
3547 ret = ath12k_wmi_set_peer_param(ar, sta->addr,
3549 WMI_PEER_PARAM_FIXED_RATE,
3553 "failed to update STA %pM Fixed Rate %d: %d\n",
3554 sta->addr, rate_code, ret);
3559 static int ath12k_station_assoc(struct ath12k *ar,
3560 struct ieee80211_vif *vif,
3561 struct ieee80211_sta *sta,
3564 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
3565 struct ath12k_wmi_peer_assoc_arg peer_arg;
3567 struct cfg80211_chan_def def;
3568 enum nl80211_band band;
3569 struct cfg80211_bitrate_mask *mask;
3572 lockdep_assert_held(&ar->conf_mutex);
3574 if (WARN_ON(ath12k_mac_vif_chan(vif, &def)))
3577 band = def.chan->band;
3578 mask = &arvif->bitrate_mask;
3580 ath12k_peer_assoc_prepare(ar, vif, sta, &peer_arg, reassoc);
3582 ret = ath12k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
3584 ath12k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n",
3585 sta->addr, arvif->vdev_id, ret);
3589 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) {
3590 ath12k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
3591 sta->addr, arvif->vdev_id);
3595 num_vht_rates = ath12k_mac_bitrate_mask_num_vht_rates(ar, band, mask);
3597 /* If single VHT rate is configured (by set_bitrate_mask()),
3598 * peer_assoc will disable VHT. This is now enabled by a peer specific
3600 * Note that all other rates and NSS will be disabled for this peer.
3602 if (sta->deflink.vht_cap.vht_supported && num_vht_rates == 1) {
3603 ret = ath12k_mac_set_peer_vht_fixed_rate(arvif, sta, mask,
3609 /* Re-assoc is run only to update supported rates for given station. It
3610 * doesn't make much sense to reconfigure the peer completely.
3615 ret = ath12k_setup_peer_smps(ar, arvif, sta->addr,
3616 &sta->deflink.ht_cap);
3618 ath12k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n",
3619 arvif->vdev_id, ret);
3624 arvif->num_legacy_stations++;
3625 ret = ath12k_recalc_rtscts_prot(arvif);
3630 if (sta->wme && sta->uapsd_queues) {
3631 ret = ath12k_peer_assoc_qos_ap(ar, arvif, sta);
3633 ath12k_warn(ar->ab, "failed to set qos params for STA %pM for vdev %i: %d\n",
3634 sta->addr, arvif->vdev_id, ret);
3642 static int ath12k_station_disassoc(struct ath12k *ar,
3643 struct ieee80211_vif *vif,
3644 struct ieee80211_sta *sta)
3646 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
3649 lockdep_assert_held(&ar->conf_mutex);
3652 arvif->num_legacy_stations--;
3653 ret = ath12k_recalc_rtscts_prot(arvif);
3658 ret = ath12k_clear_peer_keys(arvif, sta->addr);
3660 ath12k_warn(ar->ab, "failed to clear all peer keys for vdev %i: %d\n",
3661 arvif->vdev_id, ret);
3667 static void ath12k_sta_rc_update_wk(struct work_struct *wk)
3670 struct ath12k_vif *arvif;
3671 struct ath12k_sta *arsta;
3672 struct ieee80211_sta *sta;
3673 struct cfg80211_chan_def def;
3674 enum nl80211_band band;
3675 const u8 *ht_mcs_mask;
3676 const u16 *vht_mcs_mask;
3677 u32 changed, bw, nss, smps, bw_prev;
3678 int err, num_vht_rates;
3679 const struct cfg80211_bitrate_mask *mask;
3680 struct ath12k_wmi_peer_assoc_arg peer_arg;
3681 enum wmi_phy_mode peer_phymode;
3683 arsta = container_of(wk, struct ath12k_sta, update_wk);
3684 sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv);
3685 arvif = arsta->arvif;
3688 if (WARN_ON(ath12k_mac_vif_chan(arvif->vif, &def)))
3691 band = def.chan->band;
3692 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
3693 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
3695 spin_lock_bh(&ar->data_lock);
3697 changed = arsta->changed;
3701 bw_prev = arsta->bw_prev;
3705 spin_unlock_bh(&ar->data_lock);
3707 mutex_lock(&ar->conf_mutex);
3709 nss = max_t(u32, 1, nss);
3710 nss = min(nss, max(ath12k_mac_max_ht_nss(ht_mcs_mask),
3711 ath12k_mac_max_vht_nss(vht_mcs_mask)));
3713 if (changed & IEEE80211_RC_BW_CHANGED) {
3714 ath12k_peer_assoc_h_phymode(ar, arvif->vif, sta, &peer_arg);
3715 peer_phymode = peer_arg.peer_phymode;
3718 /* Phymode shows maximum supported channel width, if we
3719 * upgrade bandwidth then due to sanity check of firmware,
3720 * we have to send WMI_PEER_PHYMODE followed by
3723 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac bandwidth upgrade for sta %pM new %d old %d\n",
3724 sta->addr, bw, bw_prev);
3725 err = ath12k_wmi_set_peer_param(ar, sta->addr,
3726 arvif->vdev_id, WMI_PEER_PHYMODE,
3729 ath12k_warn(ar->ab, "failed to update STA %pM to peer phymode %d: %d\n",
3730 sta->addr, peer_phymode, err);
3731 goto err_rc_bw_changed;
3733 err = ath12k_wmi_set_peer_param(ar, sta->addr,
3734 arvif->vdev_id, WMI_PEER_CHWIDTH,
3737 ath12k_warn(ar->ab, "failed to update STA %pM to peer bandwidth %d: %d\n",
3738 sta->addr, bw, err);
3740 /* When we downgrade bandwidth this will conflict with phymode
3741 * and cause to trigger firmware crash. In this case we send
3742 * WMI_PEER_CHWIDTH followed by WMI_PEER_PHYMODE
3744 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac bandwidth downgrade for sta %pM new %d old %d\n",
3745 sta->addr, bw, bw_prev);
3746 err = ath12k_wmi_set_peer_param(ar, sta->addr,
3747 arvif->vdev_id, WMI_PEER_CHWIDTH,
3750 ath12k_warn(ar->ab, "failed to update STA %pM peer to bandwidth %d: %d\n",
3751 sta->addr, bw, err);
3752 goto err_rc_bw_changed;
3754 err = ath12k_wmi_set_peer_param(ar, sta->addr,
3755 arvif->vdev_id, WMI_PEER_PHYMODE,
3758 ath12k_warn(ar->ab, "failed to update STA %pM to peer phymode %d: %d\n",
3759 sta->addr, peer_phymode, err);
3763 if (changed & IEEE80211_RC_NSS_CHANGED) {
3764 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac update sta %pM nss %d\n",
3767 err = ath12k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
3770 ath12k_warn(ar->ab, "failed to update STA %pM nss %d: %d\n",
3771 sta->addr, nss, err);
3774 if (changed & IEEE80211_RC_SMPS_CHANGED) {
3775 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac update sta %pM smps %d\n",
3778 err = ath12k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
3779 WMI_PEER_MIMO_PS_STATE, smps);
3781 ath12k_warn(ar->ab, "failed to update STA %pM smps %d: %d\n",
3782 sta->addr, smps, err);
3785 if (changed & IEEE80211_RC_SUPP_RATES_CHANGED) {
3786 mask = &arvif->bitrate_mask;
3787 num_vht_rates = ath12k_mac_bitrate_mask_num_vht_rates(ar, band,
3790 /* Peer_assoc_prepare will reject vht rates in
3791 * bitrate_mask if its not available in range format and
3792 * sets vht tx_rateset as unsupported. So multiple VHT MCS
3793 * setting(eg. MCS 4,5,6) per peer is not supported here.
3794 * But, Single rate in VHT mask can be set as per-peer
3795 * fixed rate. But even if any HT rates are configured in
3796 * the bitrate mask, device will not switch to those rates
3797 * when per-peer Fixed rate is set.
3798 * TODO: Check RATEMASK_CMDID to support auto rates selection
3799 * across HT/VHT and for multiple VHT MCS support.
3801 if (sta->deflink.vht_cap.vht_supported && num_vht_rates == 1) {
3802 ath12k_mac_set_peer_vht_fixed_rate(arvif, sta, mask,
3805 /* If the peer is non-VHT or no fixed VHT rate
3806 * is provided in the new bitrate mask we set the
3807 * other rates using peer_assoc command.
3809 ath12k_peer_assoc_prepare(ar, arvif->vif, sta,
3812 err = ath12k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
3814 ath12k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n",
3815 sta->addr, arvif->vdev_id, err);
3817 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ))
3818 ath12k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
3819 sta->addr, arvif->vdev_id);
3823 mutex_unlock(&ar->conf_mutex);
3826 static int ath12k_mac_inc_num_stations(struct ath12k_vif *arvif,
3827 struct ieee80211_sta *sta)
3829 struct ath12k *ar = arvif->ar;
3831 lockdep_assert_held(&ar->conf_mutex);
3833 if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
3836 if (ar->num_stations >= ar->max_num_stations)
3844 static void ath12k_mac_dec_num_stations(struct ath12k_vif *arvif,
3845 struct ieee80211_sta *sta)
3847 struct ath12k *ar = arvif->ar;
3849 lockdep_assert_held(&ar->conf_mutex);
3851 if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
3857 static int ath12k_mac_station_add(struct ath12k *ar,
3858 struct ieee80211_vif *vif,
3859 struct ieee80211_sta *sta)
3861 struct ath12k_base *ab = ar->ab;
3862 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
3863 struct ath12k_sta *arsta = ath12k_sta_to_arsta(sta);
3864 struct ath12k_wmi_peer_create_arg peer_param;
3867 lockdep_assert_held(&ar->conf_mutex);
3869 ret = ath12k_mac_inc_num_stations(arvif, sta);
3871 ath12k_warn(ab, "refusing to associate station: too many connected already (%d)\n",
3872 ar->max_num_stations);
3876 arsta->rx_stats = kzalloc(sizeof(*arsta->rx_stats), GFP_KERNEL);
3877 if (!arsta->rx_stats) {
3879 goto dec_num_station;
3882 peer_param.vdev_id = arvif->vdev_id;
3883 peer_param.peer_addr = sta->addr;
3884 peer_param.peer_type = WMI_PEER_TYPE_DEFAULT;
3886 ret = ath12k_peer_create(ar, arvif, sta, &peer_param);
3888 ath12k_warn(ab, "Failed to add peer: %pM for VDEV: %d\n",
3889 sta->addr, arvif->vdev_id);
3893 ath12k_dbg(ab, ATH12K_DBG_MAC, "Added peer: %pM for VDEV: %d\n",
3894 sta->addr, arvif->vdev_id);
3896 if (ieee80211_vif_is_mesh(vif)) {
3897 ret = ath12k_wmi_set_peer_param(ar, sta->addr,
3899 WMI_PEER_USE_4ADDR, 1);
3901 ath12k_warn(ab, "failed to STA %pM 4addr capability: %d\n",
3907 ret = ath12k_dp_peer_setup(ar, arvif->vdev_id, sta->addr);
3909 ath12k_warn(ab, "failed to setup dp for peer %pM on vdev %i (%d)\n",
3910 sta->addr, arvif->vdev_id, ret);
3914 if (ab->hw_params->vdev_start_delay &&
3915 !arvif->is_started &&
3916 arvif->vdev_type != WMI_VDEV_TYPE_AP) {
3917 ret = ath12k_start_vdev_delay(ar, arvif);
3919 ath12k_warn(ab, "failed to delay vdev start: %d\n", ret);
3927 ath12k_peer_delete(ar, arvif->vdev_id, sta->addr);
3929 ath12k_mac_dec_num_stations(arvif, sta);
3934 static u32 ath12k_mac_ieee80211_sta_bw_to_wmi(struct ath12k *ar,
3935 struct ieee80211_sta *sta)
3937 u32 bw = WMI_PEER_CHWIDTH_20MHZ;
3939 switch (sta->deflink.bandwidth) {
3940 case IEEE80211_STA_RX_BW_20:
3941 bw = WMI_PEER_CHWIDTH_20MHZ;
3943 case IEEE80211_STA_RX_BW_40:
3944 bw = WMI_PEER_CHWIDTH_40MHZ;
3946 case IEEE80211_STA_RX_BW_80:
3947 bw = WMI_PEER_CHWIDTH_80MHZ;
3949 case IEEE80211_STA_RX_BW_160:
3950 bw = WMI_PEER_CHWIDTH_160MHZ;
3952 case IEEE80211_STA_RX_BW_320:
3953 bw = WMI_PEER_CHWIDTH_320MHZ;
3956 ath12k_warn(ar->ab, "Invalid bandwidth %d in rc update for %pM\n",
3957 sta->deflink.bandwidth, sta->addr);
3958 bw = WMI_PEER_CHWIDTH_20MHZ;
3965 static int ath12k_mac_op_sta_state(struct ieee80211_hw *hw,
3966 struct ieee80211_vif *vif,
3967 struct ieee80211_sta *sta,
3968 enum ieee80211_sta_state old_state,
3969 enum ieee80211_sta_state new_state)
3971 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
3973 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
3974 struct ath12k_sta *arsta = ath12k_sta_to_arsta(sta);
3975 struct ath12k_peer *peer;
3978 /* cancel must be done outside the mutex to avoid deadlock */
3979 if ((old_state == IEEE80211_STA_NONE &&
3980 new_state == IEEE80211_STA_NOTEXIST))
3981 cancel_work_sync(&arsta->update_wk);
3983 ar = ath12k_ah_to_ar(ah);
3985 mutex_lock(&ar->conf_mutex);
3987 if (old_state == IEEE80211_STA_NOTEXIST &&
3988 new_state == IEEE80211_STA_NONE) {
3989 memset(arsta, 0, sizeof(*arsta));
3990 arsta->arvif = arvif;
3991 INIT_WORK(&arsta->update_wk, ath12k_sta_rc_update_wk);
3993 ret = ath12k_mac_station_add(ar, vif, sta);
3995 ath12k_warn(ar->ab, "Failed to add station: %pM for VDEV: %d\n",
3996 sta->addr, arvif->vdev_id);
3997 } else if ((old_state == IEEE80211_STA_NONE &&
3998 new_state == IEEE80211_STA_NOTEXIST)) {
3999 if (arvif->vdev_type == WMI_VDEV_TYPE_STA) {
4000 ath12k_bss_disassoc(ar, arvif);
4001 ret = ath12k_mac_vdev_stop(arvif);
4003 ath12k_warn(ar->ab, "failed to stop vdev %i: %d\n",
4004 arvif->vdev_id, ret);
4006 ath12k_dp_peer_cleanup(ar, arvif->vdev_id, sta->addr);
4008 ret = ath12k_peer_delete(ar, arvif->vdev_id, sta->addr);
4010 ath12k_warn(ar->ab, "Failed to delete peer: %pM for VDEV: %d\n",
4011 sta->addr, arvif->vdev_id);
4013 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "Removed peer: %pM for VDEV: %d\n",
4014 sta->addr, arvif->vdev_id);
4016 ath12k_mac_dec_num_stations(arvif, sta);
4017 spin_lock_bh(&ar->ab->base_lock);
4018 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
4019 if (peer && peer->sta == sta) {
4020 ath12k_warn(ar->ab, "Found peer entry %pM n vdev %i after it was supposedly removed\n",
4021 vif->addr, arvif->vdev_id);
4023 list_del(&peer->list);
4027 spin_unlock_bh(&ar->ab->base_lock);
4029 kfree(arsta->rx_stats);
4030 arsta->rx_stats = NULL;
4031 } else if (old_state == IEEE80211_STA_AUTH &&
4032 new_state == IEEE80211_STA_ASSOC &&
4033 (vif->type == NL80211_IFTYPE_AP ||
4034 vif->type == NL80211_IFTYPE_MESH_POINT ||
4035 vif->type == NL80211_IFTYPE_ADHOC)) {
4036 ret = ath12k_station_assoc(ar, vif, sta, false);
4038 ath12k_warn(ar->ab, "Failed to associate station: %pM\n",
4041 spin_lock_bh(&ar->data_lock);
4043 arsta->bw = ath12k_mac_ieee80211_sta_bw_to_wmi(ar, sta);
4044 arsta->bw_prev = sta->deflink.bandwidth;
4046 spin_unlock_bh(&ar->data_lock);
4047 } else if (old_state == IEEE80211_STA_ASSOC &&
4048 new_state == IEEE80211_STA_AUTHORIZED) {
4049 spin_lock_bh(&ar->ab->base_lock);
4051 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
4053 peer->is_authorized = true;
4055 spin_unlock_bh(&ar->ab->base_lock);
4057 if (vif->type == NL80211_IFTYPE_STATION && arvif->is_up) {
4058 ret = ath12k_wmi_set_peer_param(ar, sta->addr,
4063 ath12k_warn(ar->ab, "Unable to authorize peer %pM vdev %d: %d\n",
4064 sta->addr, arvif->vdev_id, ret);
4066 } else if (old_state == IEEE80211_STA_AUTHORIZED &&
4067 new_state == IEEE80211_STA_ASSOC) {
4068 spin_lock_bh(&ar->ab->base_lock);
4070 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
4072 peer->is_authorized = false;
4074 spin_unlock_bh(&ar->ab->base_lock);
4075 } else if (old_state == IEEE80211_STA_ASSOC &&
4076 new_state == IEEE80211_STA_AUTH &&
4077 (vif->type == NL80211_IFTYPE_AP ||
4078 vif->type == NL80211_IFTYPE_MESH_POINT ||
4079 vif->type == NL80211_IFTYPE_ADHOC)) {
4080 ret = ath12k_station_disassoc(ar, vif, sta);
4082 ath12k_warn(ar->ab, "Failed to disassociate station: %pM\n",
4086 mutex_unlock(&ar->conf_mutex);
4091 static int ath12k_mac_op_sta_set_txpwr(struct ieee80211_hw *hw,
4092 struct ieee80211_vif *vif,
4093 struct ieee80211_sta *sta)
4095 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
4097 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
4101 if (sta->deflink.txpwr.type == NL80211_TX_POWER_AUTOMATIC) {
4104 txpwr = sta->deflink.txpwr.power;
4109 if (txpwr > ATH12K_TX_POWER_MAX_VAL || txpwr < ATH12K_TX_POWER_MIN_VAL)
4112 ar = ath12k_ah_to_ar(ah);
4114 mutex_lock(&ar->conf_mutex);
4116 ret = ath12k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
4117 WMI_PEER_USE_FIXED_PWR, txpwr);
4119 ath12k_warn(ar->ab, "failed to set tx power for station ret: %d\n",
4125 mutex_unlock(&ar->conf_mutex);
4129 static void ath12k_mac_op_sta_rc_update(struct ieee80211_hw *hw,
4130 struct ieee80211_vif *vif,
4131 struct ieee80211_sta *sta,
4134 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
4136 struct ath12k_sta *arsta = ath12k_sta_to_arsta(sta);
4137 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
4138 struct ath12k_peer *peer;
4141 ar = ath12k_ah_to_ar(ah);
4143 spin_lock_bh(&ar->ab->base_lock);
4145 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
4147 spin_unlock_bh(&ar->ab->base_lock);
4148 ath12k_warn(ar->ab, "mac sta rc update failed to find peer %pM on vdev %i\n",
4149 sta->addr, arvif->vdev_id);
4153 spin_unlock_bh(&ar->ab->base_lock);
4155 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
4156 "mac sta rc update for %pM changed %08x bw %d nss %d smps %d\n",
4157 sta->addr, changed, sta->deflink.bandwidth, sta->deflink.rx_nss,
4158 sta->deflink.smps_mode);
4160 spin_lock_bh(&ar->data_lock);
4162 if (changed & IEEE80211_RC_BW_CHANGED) {
4163 bw = ath12k_mac_ieee80211_sta_bw_to_wmi(ar, sta);
4164 arsta->bw_prev = arsta->bw;
4168 if (changed & IEEE80211_RC_NSS_CHANGED)
4169 arsta->nss = sta->deflink.rx_nss;
4171 if (changed & IEEE80211_RC_SMPS_CHANGED) {
4172 smps = WMI_PEER_SMPS_PS_NONE;
4174 switch (sta->deflink.smps_mode) {
4175 case IEEE80211_SMPS_AUTOMATIC:
4176 case IEEE80211_SMPS_OFF:
4177 smps = WMI_PEER_SMPS_PS_NONE;
4179 case IEEE80211_SMPS_STATIC:
4180 smps = WMI_PEER_SMPS_STATIC;
4182 case IEEE80211_SMPS_DYNAMIC:
4183 smps = WMI_PEER_SMPS_DYNAMIC;
4186 ath12k_warn(ar->ab, "Invalid smps %d in sta rc update for %pM\n",
4187 sta->deflink.smps_mode, sta->addr);
4188 smps = WMI_PEER_SMPS_PS_NONE;
4195 arsta->changed |= changed;
4197 spin_unlock_bh(&ar->data_lock);
4199 ieee80211_queue_work(hw, &arsta->update_wk);
4202 static int ath12k_conf_tx_uapsd(struct ath12k_vif *arvif,
4203 u16 ac, bool enable)
4205 struct ath12k *ar = arvif->ar;
4209 if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
4213 case IEEE80211_AC_VO:
4214 value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN |
4215 WMI_STA_PS_UAPSD_AC3_TRIGGER_EN;
4217 case IEEE80211_AC_VI:
4218 value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN |
4219 WMI_STA_PS_UAPSD_AC2_TRIGGER_EN;
4221 case IEEE80211_AC_BE:
4222 value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN |
4223 WMI_STA_PS_UAPSD_AC1_TRIGGER_EN;
4225 case IEEE80211_AC_BK:
4226 value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN |
4227 WMI_STA_PS_UAPSD_AC0_TRIGGER_EN;
4232 arvif->u.sta.uapsd |= value;
4234 arvif->u.sta.uapsd &= ~value;
4236 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
4237 WMI_STA_PS_PARAM_UAPSD,
4238 arvif->u.sta.uapsd);
4240 ath12k_warn(ar->ab, "could not set uapsd params %d\n", ret);
4244 if (arvif->u.sta.uapsd)
4245 value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD;
4247 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
4249 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
4250 WMI_STA_PS_PARAM_RX_WAKE_POLICY,
4253 ath12k_warn(ar->ab, "could not set rx wake param %d\n", ret);
4259 static int ath12k_mac_conf_tx(struct ath12k_vif *arvif,
4260 unsigned int link_id, u16 ac,
4261 const struct ieee80211_tx_queue_params *params)
4263 struct wmi_wmm_params_arg *p = NULL;
4264 struct ath12k *ar = arvif->ar;
4265 struct ath12k_base *ab = ar->ab;
4268 lockdep_assert_held(&ar->conf_mutex);
4271 case IEEE80211_AC_VO:
4272 p = &arvif->wmm_params.ac_vo;
4274 case IEEE80211_AC_VI:
4275 p = &arvif->wmm_params.ac_vi;
4277 case IEEE80211_AC_BE:
4278 p = &arvif->wmm_params.ac_be;
4280 case IEEE80211_AC_BK:
4281 p = &arvif->wmm_params.ac_bk;
4290 p->cwmin = params->cw_min;
4291 p->cwmax = params->cw_max;
4292 p->aifs = params->aifs;
4293 p->txop = params->txop;
4295 ret = ath12k_wmi_send_wmm_update_cmd(ar, arvif->vdev_id,
4296 &arvif->wmm_params);
4298 ath12k_warn(ab, "pdev idx %d failed to set wmm params: %d\n",
4303 ret = ath12k_conf_tx_uapsd(arvif, ac, params->uapsd);
4305 ath12k_warn(ab, "pdev idx %d failed to set sta uapsd: %d\n",
4312 static int ath12k_mac_op_conf_tx(struct ieee80211_hw *hw,
4313 struct ieee80211_vif *vif,
4314 unsigned int link_id, u16 ac,
4315 const struct ieee80211_tx_queue_params *params)
4317 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
4319 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
4322 ar = ath12k_ah_to_ar(ah);
4324 mutex_lock(&ar->conf_mutex);
4325 ret = ath12k_mac_conf_tx(arvif, link_id, ac, params);
4326 mutex_unlock(&ar->conf_mutex);
4331 static struct ieee80211_sta_ht_cap
4332 ath12k_create_ht_cap(struct ath12k *ar, u32 ar_ht_cap, u32 rate_cap_rx_chainmask)
4335 struct ieee80211_sta_ht_cap ht_cap = {0};
4336 u32 ar_vht_cap = ar->pdev->cap.vht_cap;
4338 if (!(ar_ht_cap & WMI_HT_CAP_ENABLED))
4341 ht_cap.ht_supported = 1;
4342 ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
4343 ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_NONE;
4344 ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
4345 ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
4346 ht_cap.cap |= WLAN_HT_CAP_SM_PS_STATIC << IEEE80211_HT_CAP_SM_PS_SHIFT;
4348 if (ar_ht_cap & WMI_HT_CAP_HT20_SGI)
4349 ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
4351 if (ar_ht_cap & WMI_HT_CAP_HT40_SGI)
4352 ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
4354 if (ar_ht_cap & WMI_HT_CAP_DYNAMIC_SMPS) {
4357 smps = WLAN_HT_CAP_SM_PS_DYNAMIC;
4358 smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT;
4363 if (ar_ht_cap & WMI_HT_CAP_TX_STBC)
4364 ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC;
4366 if (ar_ht_cap & WMI_HT_CAP_RX_STBC) {
4370 stbc &= WMI_HT_CAP_RX_STBC;
4371 stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT;
4372 stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT;
4373 stbc &= IEEE80211_HT_CAP_RX_STBC;
4378 if (ar_ht_cap & WMI_HT_CAP_RX_LDPC)
4379 ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
4381 if (ar_ht_cap & WMI_HT_CAP_L_SIG_TXOP_PROT)
4382 ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
4384 if (ar_vht_cap & WMI_VHT_CAP_MAX_MPDU_LEN_MASK)
4385 ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU;
4387 for (i = 0; i < ar->num_rx_chains; i++) {
4388 if (rate_cap_rx_chainmask & BIT(i))
4389 ht_cap.mcs.rx_mask[i] = 0xFF;
4392 ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
4397 static int ath12k_mac_set_txbf_conf(struct ath12k_vif *arvif)
4400 struct ath12k *ar = arvif->ar;
4403 u32 vht_cap = ar->pdev->cap.vht_cap;
4404 u32 vdev_param = WMI_VDEV_PARAM_TXBF;
4406 if (vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)) {
4407 nsts = vht_cap & IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
4408 nsts >>= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
4409 value |= SM(nsts, WMI_TXBF_STS_CAP_OFFSET);
4412 if (vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)) {
4413 sound_dim = vht_cap &
4414 IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
4415 sound_dim >>= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
4416 if (sound_dim > (ar->num_tx_chains - 1))
4417 sound_dim = ar->num_tx_chains - 1;
4418 value |= SM(sound_dim, WMI_BF_SOUND_DIM_OFFSET);
4424 if (vht_cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE) {
4425 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
4427 if ((vht_cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE) &&
4428 arvif->vdev_type == WMI_VDEV_TYPE_AP)
4429 value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFER;
4432 if (vht_cap & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE) {
4433 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
4435 if ((vht_cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE) &&
4436 arvif->vdev_type == WMI_VDEV_TYPE_STA)
4437 value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFEE;
4440 return ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4444 static void ath12k_set_vht_txbf_cap(struct ath12k *ar, u32 *vht_cap)
4446 bool subfer, subfee;
4449 subfer = !!(*vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE));
4450 subfee = !!(*vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE));
4452 if (ar->num_tx_chains < 2) {
4453 *vht_cap &= ~(IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE);
4457 /* If SU Beaformer is not set, then disable MU Beamformer Capability */
4459 *vht_cap &= ~(IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE);
4461 /* If SU Beaformee is not set, then disable MU Beamformee Capability */
4463 *vht_cap &= ~(IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE);
4465 sound_dim = u32_get_bits(*vht_cap,
4466 IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK);
4467 *vht_cap = u32_replace_bits(*vht_cap, 0,
4468 IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK);
4470 /* TODO: Need to check invalid STS and Sound_dim values set by FW? */
4472 /* Enable Sounding Dimension Field only if SU BF is enabled */
4474 if (sound_dim > (ar->num_tx_chains - 1))
4475 sound_dim = ar->num_tx_chains - 1;
4477 *vht_cap = u32_replace_bits(*vht_cap, sound_dim,
4478 IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK);
4481 /* Use the STS advertised by FW unless SU Beamformee is not supported*/
4483 *vht_cap &= ~(IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK);
4486 static struct ieee80211_sta_vht_cap
4487 ath12k_create_vht_cap(struct ath12k *ar, u32 rate_cap_tx_chainmask,
4488 u32 rate_cap_rx_chainmask)
4490 struct ieee80211_sta_vht_cap vht_cap = {0};
4491 u16 txmcs_map, rxmcs_map;
4494 vht_cap.vht_supported = 1;
4495 vht_cap.cap = ar->pdev->cap.vht_cap;
4497 ath12k_set_vht_txbf_cap(ar, &vht_cap.cap);
4499 /* TODO: Enable back VHT160 mode once association issues are fixed */
4500 /* Disabling VHT160 and VHT80+80 modes */
4501 vht_cap.cap &= ~IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK;
4502 vht_cap.cap &= ~IEEE80211_VHT_CAP_SHORT_GI_160;
4506 for (i = 0; i < 8; i++) {
4507 if (i < ar->num_tx_chains && rate_cap_tx_chainmask & BIT(i))
4508 txmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
4510 txmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
4512 if (i < ar->num_rx_chains && rate_cap_rx_chainmask & BIT(i))
4513 rxmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
4515 rxmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
4518 if (rate_cap_tx_chainmask <= 1)
4519 vht_cap.cap &= ~IEEE80211_VHT_CAP_TXSTBC;
4521 vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(rxmcs_map);
4522 vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(txmcs_map);
4527 static void ath12k_mac_setup_ht_vht_cap(struct ath12k *ar,
4528 struct ath12k_pdev_cap *cap,
4531 struct ieee80211_supported_band *band;
4532 u32 rate_cap_tx_chainmask;
4533 u32 rate_cap_rx_chainmask;
4536 rate_cap_tx_chainmask = ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift;
4537 rate_cap_rx_chainmask = ar->cfg_rx_chainmask >> cap->rx_chain_mask_shift;
4539 if (cap->supported_bands & WMI_HOST_WLAN_2G_CAP) {
4540 band = &ar->mac.sbands[NL80211_BAND_2GHZ];
4541 ht_cap = cap->band[NL80211_BAND_2GHZ].ht_cap_info;
4543 *ht_cap_info = ht_cap;
4544 band->ht_cap = ath12k_create_ht_cap(ar, ht_cap,
4545 rate_cap_rx_chainmask);
4548 if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP &&
4549 (ar->ab->hw_params->single_pdev_only ||
4550 !ar->supports_6ghz)) {
4551 band = &ar->mac.sbands[NL80211_BAND_5GHZ];
4552 ht_cap = cap->band[NL80211_BAND_5GHZ].ht_cap_info;
4554 *ht_cap_info = ht_cap;
4555 band->ht_cap = ath12k_create_ht_cap(ar, ht_cap,
4556 rate_cap_rx_chainmask);
4557 band->vht_cap = ath12k_create_vht_cap(ar, rate_cap_tx_chainmask,
4558 rate_cap_rx_chainmask);
4562 static int ath12k_check_chain_mask(struct ath12k *ar, u32 ant, bool is_tx_ant)
4564 /* TODO: Check the request chainmask against the supported
4565 * chainmask table which is advertised in extented_service_ready event
4571 static void ath12k_gen_ppe_thresh(struct ath12k_wmi_ppe_threshold_arg *fw_ppet,
4577 he_ppet[0] = fw_ppet->numss_m1 & IEEE80211_PPE_THRES_NSS_MASK;
4578 he_ppet[0] |= (fw_ppet->ru_bit_mask <<
4579 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_POS) &
4580 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK;
4581 for (nss = 0; nss <= fw_ppet->numss_m1; nss++) {
4582 for (ru = 0; ru < 4; ru++) {
4586 if ((fw_ppet->ru_bit_mask & BIT(ru)) == 0)
4588 val = (fw_ppet->ppet16_ppet8_ru3_ru0[nss] >> (ru * 6)) &
4590 val = ((val >> 3) & 0x7) | ((val & 0x7) << 3);
4591 for (i = 5; i >= 0; i--) {
4593 ((val >> i) & 0x1) << ((bit % 8));
4601 ath12k_mac_filter_he_cap_mesh(struct ieee80211_he_cap_elem *he_cap_elem)
4605 m = IEEE80211_HE_MAC_CAP0_TWT_RES |
4606 IEEE80211_HE_MAC_CAP0_TWT_REQ;
4607 he_cap_elem->mac_cap_info[0] &= ~m;
4609 m = IEEE80211_HE_MAC_CAP2_TRS |
4610 IEEE80211_HE_MAC_CAP2_BCAST_TWT |
4611 IEEE80211_HE_MAC_CAP2_MU_CASCADING;
4612 he_cap_elem->mac_cap_info[2] &= ~m;
4614 m = IEEE80211_HE_MAC_CAP3_FLEX_TWT_SCHED |
4615 IEEE80211_HE_MAC_CAP2_BCAST_TWT |
4616 IEEE80211_HE_MAC_CAP2_MU_CASCADING;
4617 he_cap_elem->mac_cap_info[3] &= ~m;
4619 m = IEEE80211_HE_MAC_CAP4_BSRP_BQRP_A_MPDU_AGG |
4620 IEEE80211_HE_MAC_CAP4_BQR;
4621 he_cap_elem->mac_cap_info[4] &= ~m;
4623 m = IEEE80211_HE_MAC_CAP5_SUBCHAN_SELECTIVE_TRANSMISSION |
4624 IEEE80211_HE_MAC_CAP5_UL_2x996_TONE_RU |
4625 IEEE80211_HE_MAC_CAP5_PUNCTURED_SOUNDING |
4626 IEEE80211_HE_MAC_CAP5_HT_VHT_TRIG_FRAME_RX;
4627 he_cap_elem->mac_cap_info[5] &= ~m;
4629 m = IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO |
4630 IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO;
4631 he_cap_elem->phy_cap_info[2] &= ~m;
4633 m = IEEE80211_HE_PHY_CAP3_RX_PARTIAL_BW_SU_IN_20MHZ_MU |
4634 IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK |
4635 IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_MASK;
4636 he_cap_elem->phy_cap_info[3] &= ~m;
4638 m = IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER;
4639 he_cap_elem->phy_cap_info[4] &= ~m;
4641 m = IEEE80211_HE_PHY_CAP5_NG16_MU_FEEDBACK;
4642 he_cap_elem->phy_cap_info[5] &= ~m;
4644 m = IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_75_MU |
4645 IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB |
4646 IEEE80211_HE_PHY_CAP6_TRIG_CQI_FB |
4647 IEEE80211_HE_PHY_CAP6_PARTIAL_BANDWIDTH_DL_MUMIMO;
4648 he_cap_elem->phy_cap_info[6] &= ~m;
4650 m = IEEE80211_HE_PHY_CAP7_PSR_BASED_SR |
4651 IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_SUPP |
4652 IEEE80211_HE_PHY_CAP7_STBC_TX_ABOVE_80MHZ |
4653 IEEE80211_HE_PHY_CAP7_STBC_RX_ABOVE_80MHZ;
4654 he_cap_elem->phy_cap_info[7] &= ~m;
4656 m = IEEE80211_HE_PHY_CAP8_HE_ER_SU_PPDU_4XLTF_AND_08_US_GI |
4657 IEEE80211_HE_PHY_CAP8_20MHZ_IN_40MHZ_HE_PPDU_IN_2G |
4658 IEEE80211_HE_PHY_CAP8_20MHZ_IN_160MHZ_HE_PPDU |
4659 IEEE80211_HE_PHY_CAP8_80MHZ_IN_160MHZ_HE_PPDU;
4660 he_cap_elem->phy_cap_info[8] &= ~m;
4662 m = IEEE80211_HE_PHY_CAP9_LONGER_THAN_16_SIGB_OFDM_SYM |
4663 IEEE80211_HE_PHY_CAP9_NON_TRIGGERED_CQI_FEEDBACK |
4664 IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU |
4665 IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU |
4666 IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_COMP_SIGB |
4667 IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_NON_COMP_SIGB;
4668 he_cap_elem->phy_cap_info[9] &= ~m;
4671 static __le16 ath12k_mac_setup_he_6ghz_cap(struct ath12k_pdev_cap *pcap,
4672 struct ath12k_band_cap *bcap)
4676 bcap->he_6ghz_capa = IEEE80211_HT_MPDU_DENSITY_NONE;
4677 if (bcap->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS)
4678 bcap->he_6ghz_capa |=
4679 u32_encode_bits(WLAN_HT_CAP_SM_PS_DYNAMIC,
4680 IEEE80211_HE_6GHZ_CAP_SM_PS);
4682 bcap->he_6ghz_capa |=
4683 u32_encode_bits(WLAN_HT_CAP_SM_PS_DISABLED,
4684 IEEE80211_HE_6GHZ_CAP_SM_PS);
4685 val = u32_get_bits(pcap->vht_cap,
4686 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK);
4687 bcap->he_6ghz_capa |=
4688 u32_encode_bits(val, IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP);
4689 val = u32_get_bits(pcap->vht_cap,
4690 IEEE80211_VHT_CAP_MAX_MPDU_MASK);
4691 bcap->he_6ghz_capa |=
4692 u32_encode_bits(val, IEEE80211_HE_6GHZ_CAP_MAX_MPDU_LEN);
4693 if (pcap->vht_cap & IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN)
4694 bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_RX_ANTPAT_CONS;
4695 if (pcap->vht_cap & IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN)
4696 bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_TX_ANTPAT_CONS;
4698 return cpu_to_le16(bcap->he_6ghz_capa);
4701 static void ath12k_mac_copy_he_cap(struct ath12k_band_cap *band_cap,
4702 int iftype, u8 num_tx_chains,
4703 struct ieee80211_sta_he_cap *he_cap)
4705 struct ieee80211_he_cap_elem *he_cap_elem = &he_cap->he_cap_elem;
4706 struct ieee80211_he_mcs_nss_supp *mcs_nss = &he_cap->he_mcs_nss_supp;
4708 he_cap->has_he = true;
4709 memcpy(he_cap_elem->mac_cap_info, band_cap->he_cap_info,
4710 sizeof(he_cap_elem->mac_cap_info));
4711 memcpy(he_cap_elem->phy_cap_info, band_cap->he_cap_phy_info,
4712 sizeof(he_cap_elem->phy_cap_info));
4714 he_cap_elem->mac_cap_info[1] &=
4715 IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_MASK;
4717 he_cap_elem->phy_cap_info[5] &=
4718 ~IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK;
4719 he_cap_elem->phy_cap_info[5] &=
4720 ~IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_MASK;
4721 he_cap_elem->phy_cap_info[5] |= num_tx_chains - 1;
4724 case NL80211_IFTYPE_AP:
4725 he_cap_elem->phy_cap_info[3] &=
4726 ~IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK;
4727 he_cap_elem->phy_cap_info[9] |=
4728 IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU;
4730 case NL80211_IFTYPE_STATION:
4731 he_cap_elem->mac_cap_info[0] &= ~IEEE80211_HE_MAC_CAP0_TWT_RES;
4732 he_cap_elem->mac_cap_info[0] |= IEEE80211_HE_MAC_CAP0_TWT_REQ;
4733 he_cap_elem->phy_cap_info[9] |=
4734 IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU;
4736 case NL80211_IFTYPE_MESH_POINT:
4737 ath12k_mac_filter_he_cap_mesh(he_cap_elem);
4741 mcs_nss->rx_mcs_80 = cpu_to_le16(band_cap->he_mcs & 0xffff);
4742 mcs_nss->tx_mcs_80 = cpu_to_le16(band_cap->he_mcs & 0xffff);
4743 mcs_nss->rx_mcs_160 = cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
4744 mcs_nss->tx_mcs_160 = cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
4745 mcs_nss->rx_mcs_80p80 = cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
4746 mcs_nss->tx_mcs_80p80 = cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
4748 memset(he_cap->ppe_thres, 0, sizeof(he_cap->ppe_thres));
4749 if (he_cap_elem->phy_cap_info[6] &
4750 IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT)
4751 ath12k_gen_ppe_thresh(&band_cap->he_ppet, he_cap->ppe_thres);
4755 ath12k_mac_copy_eht_mcs_nss(struct ath12k_band_cap *band_cap,
4756 struct ieee80211_eht_mcs_nss_supp *mcs_nss,
4757 const struct ieee80211_he_cap_elem *he_cap,
4758 const struct ieee80211_eht_cap_elem_fixed *eht_cap)
4760 if ((he_cap->phy_cap_info[0] &
4761 (IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G |
4762 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G |
4763 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G |
4764 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)) == 0)
4765 memcpy(&mcs_nss->only_20mhz, &band_cap->eht_mcs_20_only,
4766 sizeof(struct ieee80211_eht_mcs_nss_supp_20mhz_only));
4768 if (he_cap->phy_cap_info[0] &
4769 (IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G |
4770 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G))
4771 memcpy(&mcs_nss->bw._80, &band_cap->eht_mcs_80,
4772 sizeof(struct ieee80211_eht_mcs_nss_supp_bw));
4774 if (he_cap->phy_cap_info[0] &
4775 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
4776 memcpy(&mcs_nss->bw._160, &band_cap->eht_mcs_160,
4777 sizeof(struct ieee80211_eht_mcs_nss_supp_bw));
4779 if (eht_cap->phy_cap_info[0] & IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ)
4780 memcpy(&mcs_nss->bw._320, &band_cap->eht_mcs_320,
4781 sizeof(struct ieee80211_eht_mcs_nss_supp_bw));
4784 static void ath12k_mac_copy_eht_ppe_thresh(struct ath12k_wmi_ppe_threshold_arg *fw_ppet,
4785 struct ieee80211_sta_eht_cap *cap)
4787 u16 bit = IEEE80211_EHT_PPE_THRES_INFO_HEADER_SIZE;
4788 u8 i, nss, ru, ppet_bit_len_per_ru = IEEE80211_EHT_PPE_THRES_INFO_PPET_SIZE * 2;
4790 u8p_replace_bits(&cap->eht_ppe_thres[0], fw_ppet->numss_m1,
4791 IEEE80211_EHT_PPE_THRES_NSS_MASK);
4793 u16p_replace_bits((u16 *)&cap->eht_ppe_thres[0], fw_ppet->ru_bit_mask,
4794 IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK);
4796 for (nss = 0; nss <= fw_ppet->numss_m1; nss++) {
4798 ru < hweight16(IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK);
4802 if ((fw_ppet->ru_bit_mask & BIT(ru)) == 0)
4805 u32p_replace_bits(&val, fw_ppet->ppet16_ppet8_ru3_ru0[nss] >>
4806 (ru * ppet_bit_len_per_ru),
4807 GENMASK(ppet_bit_len_per_ru - 1, 0));
4809 for (i = 0; i < ppet_bit_len_per_ru; i++) {
4810 cap->eht_ppe_thres[bit / 8] |=
4811 (((val >> i) & 0x1) << ((bit % 8)));
4819 ath12k_mac_filter_eht_cap_mesh(struct ieee80211_eht_cap_elem_fixed
4824 m = IEEE80211_EHT_MAC_CAP0_EPCS_PRIO_ACCESS;
4825 eht_cap_elem->mac_cap_info[0] &= ~m;
4827 m = IEEE80211_EHT_PHY_CAP0_PARTIAL_BW_UL_MU_MIMO;
4828 eht_cap_elem->phy_cap_info[0] &= ~m;
4830 m = IEEE80211_EHT_PHY_CAP3_NG_16_MU_FEEDBACK |
4831 IEEE80211_EHT_PHY_CAP3_CODEBOOK_7_5_MU_FDBK |
4832 IEEE80211_EHT_PHY_CAP3_TRIG_MU_BF_PART_BW_FDBK |
4833 IEEE80211_EHT_PHY_CAP3_TRIG_CQI_FDBK;
4834 eht_cap_elem->phy_cap_info[3] &= ~m;
4836 m = IEEE80211_EHT_PHY_CAP4_PART_BW_DL_MU_MIMO |
4837 IEEE80211_EHT_PHY_CAP4_PSR_SR_SUPP |
4838 IEEE80211_EHT_PHY_CAP4_POWER_BOOST_FACT_SUPP |
4839 IEEE80211_EHT_PHY_CAP4_EHT_MU_PPDU_4_EHT_LTF_08_GI;
4840 eht_cap_elem->phy_cap_info[4] &= ~m;
4842 m = IEEE80211_EHT_PHY_CAP5_NON_TRIG_CQI_FEEDBACK |
4843 IEEE80211_EHT_PHY_CAP5_TX_LESS_242_TONE_RU_SUPP |
4844 IEEE80211_EHT_PHY_CAP5_RX_LESS_242_TONE_RU_SUPP |
4845 IEEE80211_EHT_PHY_CAP5_MAX_NUM_SUPP_EHT_LTF_MASK;
4846 eht_cap_elem->phy_cap_info[5] &= ~m;
4848 m = IEEE80211_EHT_PHY_CAP6_MAX_NUM_SUPP_EHT_LTF_MASK;
4849 eht_cap_elem->phy_cap_info[6] &= ~m;
4851 m = IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_80MHZ |
4852 IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_160MHZ |
4853 IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_320MHZ |
4854 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_80MHZ |
4855 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_160MHZ |
4856 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_320MHZ;
4857 eht_cap_elem->phy_cap_info[7] &= ~m;
4860 static void ath12k_mac_copy_eht_cap(struct ath12k *ar,
4861 struct ath12k_band_cap *band_cap,
4862 struct ieee80211_he_cap_elem *he_cap_elem,
4864 struct ieee80211_sta_eht_cap *eht_cap)
4866 struct ieee80211_eht_cap_elem_fixed *eht_cap_elem = &eht_cap->eht_cap_elem;
4868 memset(eht_cap, 0, sizeof(struct ieee80211_sta_eht_cap));
4870 if (!(test_bit(WMI_TLV_SERVICE_11BE, ar->ab->wmi_ab.svc_map)))
4873 eht_cap->has_eht = true;
4874 memcpy(eht_cap_elem->mac_cap_info, band_cap->eht_cap_mac_info,
4875 sizeof(eht_cap_elem->mac_cap_info));
4876 memcpy(eht_cap_elem->phy_cap_info, band_cap->eht_cap_phy_info,
4877 sizeof(eht_cap_elem->phy_cap_info));
4880 case NL80211_IFTYPE_AP:
4881 eht_cap_elem->phy_cap_info[0] &=
4882 ~IEEE80211_EHT_PHY_CAP0_242_TONE_RU_GT20MHZ;
4883 eht_cap_elem->phy_cap_info[4] &=
4884 ~IEEE80211_EHT_PHY_CAP4_PART_BW_DL_MU_MIMO;
4885 eht_cap_elem->phy_cap_info[5] &=
4886 ~IEEE80211_EHT_PHY_CAP5_TX_LESS_242_TONE_RU_SUPP;
4888 case NL80211_IFTYPE_STATION:
4889 eht_cap_elem->phy_cap_info[7] &=
4890 ~(IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_80MHZ |
4891 IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_160MHZ |
4892 IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_320MHZ);
4893 eht_cap_elem->phy_cap_info[7] &=
4894 ~(IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_80MHZ |
4895 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_160MHZ |
4896 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_320MHZ);
4898 case NL80211_IFTYPE_MESH_POINT:
4899 ath12k_mac_filter_eht_cap_mesh(eht_cap_elem);
4905 ath12k_mac_copy_eht_mcs_nss(band_cap, &eht_cap->eht_mcs_nss_supp,
4906 he_cap_elem, eht_cap_elem);
4908 if (eht_cap_elem->phy_cap_info[5] &
4909 IEEE80211_EHT_PHY_CAP5_PPE_THRESHOLD_PRESENT)
4910 ath12k_mac_copy_eht_ppe_thresh(&band_cap->eht_ppet, eht_cap);
4913 static int ath12k_mac_copy_sband_iftype_data(struct ath12k *ar,
4914 struct ath12k_pdev_cap *cap,
4915 struct ieee80211_sband_iftype_data *data,
4918 struct ath12k_band_cap *band_cap = &cap->band[band];
4921 for (i = 0; i < NUM_NL80211_IFTYPES; i++) {
4922 struct ieee80211_sta_he_cap *he_cap = &data[idx].he_cap;
4925 case NL80211_IFTYPE_STATION:
4926 case NL80211_IFTYPE_AP:
4927 case NL80211_IFTYPE_MESH_POINT:
4934 data[idx].types_mask = BIT(i);
4936 ath12k_mac_copy_he_cap(band_cap, i, ar->num_tx_chains, he_cap);
4937 if (band == NL80211_BAND_6GHZ) {
4938 data[idx].he_6ghz_capa.capa =
4939 ath12k_mac_setup_he_6ghz_cap(cap, band_cap);
4941 ath12k_mac_copy_eht_cap(ar, band_cap, &he_cap->he_cap_elem, i,
4942 &data[idx].eht_cap);
4949 static void ath12k_mac_setup_sband_iftype_data(struct ath12k *ar,
4950 struct ath12k_pdev_cap *cap)
4952 struct ieee80211_supported_band *sband;
4953 enum nl80211_band band;
4956 if (cap->supported_bands & WMI_HOST_WLAN_2G_CAP) {
4957 band = NL80211_BAND_2GHZ;
4958 count = ath12k_mac_copy_sband_iftype_data(ar, cap,
4959 ar->mac.iftype[band],
4961 sband = &ar->mac.sbands[band];
4962 _ieee80211_set_sband_iftype_data(sband, ar->mac.iftype[band],
4966 if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP) {
4967 band = NL80211_BAND_5GHZ;
4968 count = ath12k_mac_copy_sband_iftype_data(ar, cap,
4969 ar->mac.iftype[band],
4971 sband = &ar->mac.sbands[band];
4972 _ieee80211_set_sband_iftype_data(sband, ar->mac.iftype[band],
4976 if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP &&
4977 ar->supports_6ghz) {
4978 band = NL80211_BAND_6GHZ;
4979 count = ath12k_mac_copy_sband_iftype_data(ar, cap,
4980 ar->mac.iftype[band],
4982 sband = &ar->mac.sbands[band];
4983 _ieee80211_set_sband_iftype_data(sband, ar->mac.iftype[band],
4988 static int __ath12k_set_antenna(struct ath12k *ar, u32 tx_ant, u32 rx_ant)
4992 lockdep_assert_held(&ar->conf_mutex);
4994 if (ath12k_check_chain_mask(ar, tx_ant, true))
4997 if (ath12k_check_chain_mask(ar, rx_ant, false))
5000 ar->cfg_tx_chainmask = tx_ant;
5001 ar->cfg_rx_chainmask = rx_ant;
5003 if (ar->state != ATH12K_STATE_ON &&
5004 ar->state != ATH12K_STATE_RESTARTED)
5007 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_TX_CHAIN_MASK,
5008 tx_ant, ar->pdev->pdev_id);
5010 ath12k_warn(ar->ab, "failed to set tx-chainmask: %d, req 0x%x\n",
5015 ar->num_tx_chains = hweight32(tx_ant);
5017 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_RX_CHAIN_MASK,
5018 rx_ant, ar->pdev->pdev_id);
5020 ath12k_warn(ar->ab, "failed to set rx-chainmask: %d, req 0x%x\n",
5025 ar->num_rx_chains = hweight32(rx_ant);
5027 /* Reload HT/VHT/HE capability */
5028 ath12k_mac_setup_ht_vht_cap(ar, &ar->pdev->cap, NULL);
5029 ath12k_mac_setup_sband_iftype_data(ar, &ar->pdev->cap);
5034 static void ath12k_mgmt_over_wmi_tx_drop(struct ath12k *ar, struct sk_buff *skb)
5038 ieee80211_free_txskb(ath12k_ar_to_hw(ar), skb);
5040 num_mgmt = atomic_dec_if_positive(&ar->num_pending_mgmt_tx);
5046 wake_up(&ar->txmgmt_empty_waitq);
5049 int ath12k_mac_tx_mgmt_pending_free(int buf_id, void *skb, void *ctx)
5051 struct sk_buff *msdu = skb;
5052 struct ieee80211_tx_info *info;
5053 struct ath12k *ar = ctx;
5054 struct ath12k_base *ab = ar->ab;
5056 spin_lock_bh(&ar->txmgmt_idr_lock);
5057 idr_remove(&ar->txmgmt_idr, buf_id);
5058 spin_unlock_bh(&ar->txmgmt_idr_lock);
5059 dma_unmap_single(ab->dev, ATH12K_SKB_CB(msdu)->paddr, msdu->len,
5062 info = IEEE80211_SKB_CB(msdu);
5063 memset(&info->status, 0, sizeof(info->status));
5065 ath12k_mgmt_over_wmi_tx_drop(ar, skb);
5070 static int ath12k_mac_vif_txmgmt_idr_remove(int buf_id, void *skb, void *ctx)
5072 struct ieee80211_vif *vif = ctx;
5073 struct ath12k_skb_cb *skb_cb = ATH12K_SKB_CB(skb);
5074 struct sk_buff *msdu = skb;
5075 struct ath12k *ar = skb_cb->ar;
5076 struct ath12k_base *ab = ar->ab;
5078 if (skb_cb->vif == vif) {
5079 spin_lock_bh(&ar->txmgmt_idr_lock);
5080 idr_remove(&ar->txmgmt_idr, buf_id);
5081 spin_unlock_bh(&ar->txmgmt_idr_lock);
5082 dma_unmap_single(ab->dev, skb_cb->paddr, msdu->len,
5089 static int ath12k_mac_mgmt_tx_wmi(struct ath12k *ar, struct ath12k_vif *arvif,
5090 struct sk_buff *skb)
5092 struct ath12k_base *ab = ar->ab;
5093 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
5094 struct ieee80211_tx_info *info;
5099 ATH12K_SKB_CB(skb)->ar = ar;
5100 spin_lock_bh(&ar->txmgmt_idr_lock);
5101 buf_id = idr_alloc(&ar->txmgmt_idr, skb, 0,
5102 ATH12K_TX_MGMT_NUM_PENDING_MAX, GFP_ATOMIC);
5103 spin_unlock_bh(&ar->txmgmt_idr_lock);
5107 info = IEEE80211_SKB_CB(skb);
5108 if (!(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP)) {
5109 if ((ieee80211_is_action(hdr->frame_control) ||
5110 ieee80211_is_deauth(hdr->frame_control) ||
5111 ieee80211_is_disassoc(hdr->frame_control)) &&
5112 ieee80211_has_protected(hdr->frame_control)) {
5113 skb_put(skb, IEEE80211_CCMP_MIC_LEN);
5117 paddr = dma_map_single(ab->dev, skb->data, skb->len, DMA_TO_DEVICE);
5118 if (dma_mapping_error(ab->dev, paddr)) {
5119 ath12k_warn(ab, "failed to DMA map mgmt Tx buffer\n");
5124 ATH12K_SKB_CB(skb)->paddr = paddr;
5126 ret = ath12k_wmi_mgmt_send(ar, arvif->vdev_id, buf_id, skb);
5128 ath12k_warn(ar->ab, "failed to send mgmt frame: %d\n", ret);
5135 dma_unmap_single(ab->dev, ATH12K_SKB_CB(skb)->paddr,
5136 skb->len, DMA_TO_DEVICE);
5138 spin_lock_bh(&ar->txmgmt_idr_lock);
5139 idr_remove(&ar->txmgmt_idr, buf_id);
5140 spin_unlock_bh(&ar->txmgmt_idr_lock);
5145 static void ath12k_mgmt_over_wmi_tx_purge(struct ath12k *ar)
5147 struct sk_buff *skb;
5149 while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL)
5150 ath12k_mgmt_over_wmi_tx_drop(ar, skb);
5153 static void ath12k_mgmt_over_wmi_tx_work(struct work_struct *work)
5155 struct ath12k *ar = container_of(work, struct ath12k, wmi_mgmt_tx_work);
5156 struct ath12k_skb_cb *skb_cb;
5157 struct ath12k_vif *arvif;
5158 struct sk_buff *skb;
5161 while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL) {
5162 skb_cb = ATH12K_SKB_CB(skb);
5164 ath12k_warn(ar->ab, "no vif found for mgmt frame\n");
5165 ath12k_mgmt_over_wmi_tx_drop(ar, skb);
5169 arvif = ath12k_vif_to_arvif(skb_cb->vif);
5171 if (ar->allocated_vdev_map & (1LL << arvif->vdev_id)) {
5172 ret = ath12k_mac_mgmt_tx_wmi(ar, arvif, skb);
5174 ath12k_warn(ar->ab, "failed to tx mgmt frame, vdev_id %d :%d\n",
5175 arvif->vdev_id, ret);
5176 ath12k_mgmt_over_wmi_tx_drop(ar, skb);
5180 "dropping mgmt frame for vdev %d, is_started %d\n",
5183 ath12k_mgmt_over_wmi_tx_drop(ar, skb);
5188 static int ath12k_mac_mgmt_tx(struct ath12k *ar, struct sk_buff *skb,
5191 struct sk_buff_head *q = &ar->wmi_mgmt_tx_queue;
5193 if (test_bit(ATH12K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags))
5196 /* Drop probe response packets when the pending management tx
5197 * count has reached a certain threshold, so as to prioritize
5198 * other mgmt packets like auth and assoc to be sent on time
5199 * for establishing successful connections.
5202 atomic_read(&ar->num_pending_mgmt_tx) > ATH12K_PRB_RSP_DROP_THRESHOLD) {
5204 "dropping probe response as pending queue is almost full\n");
5208 if (skb_queue_len_lockless(q) >= ATH12K_TX_MGMT_NUM_PENDING_MAX) {
5209 ath12k_warn(ar->ab, "mgmt tx queue is full\n");
5213 skb_queue_tail(q, skb);
5214 atomic_inc(&ar->num_pending_mgmt_tx);
5215 ieee80211_queue_work(ath12k_ar_to_hw(ar), &ar->wmi_mgmt_tx_work);
5220 static void ath12k_mac_add_p2p_noa_ie(struct ath12k *ar,
5221 struct ieee80211_vif *vif,
5222 struct sk_buff *skb,
5225 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
5227 if (likely(!is_prb_rsp))
5230 spin_lock_bh(&ar->data_lock);
5232 if (arvif->u.ap.noa_data &&
5233 !pskb_expand_head(skb, 0, arvif->u.ap.noa_len,
5235 skb_put_data(skb, arvif->u.ap.noa_data,
5236 arvif->u.ap.noa_len);
5238 spin_unlock_bh(&ar->data_lock);
5241 static void ath12k_mac_op_tx(struct ieee80211_hw *hw,
5242 struct ieee80211_tx_control *control,
5243 struct sk_buff *skb)
5245 struct ath12k_skb_cb *skb_cb = ATH12K_SKB_CB(skb);
5246 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
5247 struct ieee80211_vif *vif = info->control.vif;
5248 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
5249 struct ath12k *ar = arvif->ar;
5250 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
5251 struct ieee80211_key_conf *key = info->control.hw_key;
5252 u32 info_flags = info->flags;
5256 memset(skb_cb, 0, sizeof(*skb_cb));
5260 skb_cb->cipher = key->cipher;
5261 skb_cb->flags |= ATH12K_SKB_CIPHER_SET;
5264 is_prb_rsp = ieee80211_is_probe_resp(hdr->frame_control);
5266 if (info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP) {
5267 skb_cb->flags |= ATH12K_SKB_HW_80211_ENCAP;
5268 } else if (ieee80211_is_mgmt(hdr->frame_control)) {
5269 ret = ath12k_mac_mgmt_tx(ar, skb, is_prb_rsp);
5271 ath12k_warn(ar->ab, "failed to queue management frame %d\n",
5273 ieee80211_free_txskb(hw, skb);
5278 /* This is case only for P2P_GO */
5279 if (vif->type == NL80211_IFTYPE_AP && vif->p2p)
5280 ath12k_mac_add_p2p_noa_ie(ar, vif, skb, is_prb_rsp);
5282 ret = ath12k_dp_tx(ar, arvif, skb);
5284 ath12k_warn(ar->ab, "failed to transmit frame %d\n", ret);
5285 ieee80211_free_txskb(hw, skb);
5289 void ath12k_mac_drain_tx(struct ath12k *ar)
5291 /* make sure rcu-protected mac80211 tx path itself is drained */
5294 cancel_work_sync(&ar->wmi_mgmt_tx_work);
5295 ath12k_mgmt_over_wmi_tx_purge(ar);
5298 static int ath12k_mac_config_mon_status_default(struct ath12k *ar, bool enable)
5301 /* TODO: Need to support new monitor mode */
5304 static void ath12k_mac_wait_reconfigure(struct ath12k_base *ab)
5306 int recovery_start_count;
5311 recovery_start_count = atomic_inc_return(&ab->recovery_start_count);
5313 ath12k_dbg(ab, ATH12K_DBG_MAC, "recovery start count %d\n", recovery_start_count);
5315 if (recovery_start_count == ab->num_radios) {
5316 complete(&ab->recovery_start);
5317 ath12k_dbg(ab, ATH12K_DBG_MAC, "recovery started success\n");
5320 ath12k_dbg(ab, ATH12K_DBG_MAC, "waiting reconfigure...\n");
5322 wait_for_completion_timeout(&ab->reconfigure_complete,
5323 ATH12K_RECONFIGURE_TIMEOUT_HZ);
5326 static int ath12k_mac_start(struct ath12k *ar)
5328 struct ath12k_base *ab = ar->ab;
5329 struct ath12k_pdev *pdev = ar->pdev;
5332 mutex_lock(&ar->conf_mutex);
5334 switch (ar->state) {
5335 case ATH12K_STATE_OFF:
5336 ar->state = ATH12K_STATE_ON;
5338 case ATH12K_STATE_RESTARTING:
5339 ar->state = ATH12K_STATE_RESTARTED;
5340 ath12k_mac_wait_reconfigure(ab);
5342 case ATH12K_STATE_RESTARTED:
5343 case ATH12K_STATE_WEDGED:
5344 case ATH12K_STATE_ON:
5350 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_PMF_QOS,
5354 ath12k_err(ab, "failed to enable PMF QOS: (%d\n", ret);
5358 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_DYNAMIC_BW, 1,
5361 ath12k_err(ab, "failed to enable dynamic bw: %d\n", ret);
5365 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_ARP_AC_OVERRIDE,
5368 ath12k_err(ab, "failed to set ac override for ARP: %d\n",
5373 ret = ath12k_wmi_send_dfs_phyerr_offload_enable_cmd(ar, pdev->pdev_id);
5375 ath12k_err(ab, "failed to offload radar detection: %d\n",
5380 ret = ath12k_dp_tx_htt_h2t_ppdu_stats_req(ar,
5381 HTT_PPDU_STATS_TAG_DEFAULT);
5383 ath12k_err(ab, "failed to req ppdu stats: %d\n", ret);
5387 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_MESH_MCAST_ENABLE,
5391 ath12k_err(ab, "failed to enable MESH MCAST ENABLE: (%d\n", ret);
5395 __ath12k_set_antenna(ar, ar->cfg_tx_chainmask, ar->cfg_rx_chainmask);
5397 /* TODO: Do we need to enable ANI? */
5399 ath12k_reg_update_chan_list(ar);
5401 ar->num_started_vdevs = 0;
5402 ar->num_created_vdevs = 0;
5404 ar->allocated_vdev_map = 0;
5406 /* Configure monitor status ring with default rx_filter to get rx status
5407 * such as rssi, rx_duration.
5409 ret = ath12k_mac_config_mon_status_default(ar, true);
5410 if (ret && (ret != -EOPNOTSUPP)) {
5411 ath12k_err(ab, "failed to configure monitor status ring with default rx_filter: (%d)\n",
5416 if (ret == -EOPNOTSUPP)
5417 ath12k_dbg(ab, ATH12K_DBG_MAC,
5418 "monitor status config is not yet supported");
5420 /* Configure the hash seed for hash based reo dest ring selection */
5421 ath12k_wmi_pdev_lro_cfg(ar, ar->pdev->pdev_id);
5423 /* allow device to enter IMPS */
5424 if (ab->hw_params->idle_ps) {
5425 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_IDLE_PS_CONFIG,
5428 ath12k_err(ab, "failed to enable idle ps: %d\n", ret);
5433 mutex_unlock(&ar->conf_mutex);
5435 rcu_assign_pointer(ab->pdevs_active[ar->pdev_idx],
5436 &ab->pdevs[ar->pdev_idx]);
5440 ar->state = ATH12K_STATE_OFF;
5441 mutex_unlock(&ar->conf_mutex);
5446 static int ath12k_mac_op_start(struct ieee80211_hw *hw)
5448 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
5449 struct ath12k *ar = ath12k_ah_to_ar(ah);
5450 struct ath12k_base *ab = ar->ab;
5453 ath12k_mac_drain_tx(ar);
5455 ret = ath12k_mac_start(ar);
5457 ath12k_err(ab, "fail to start mac operations in pdev idx %d ret %d\n",
5465 int ath12k_mac_rfkill_config(struct ath12k *ar)
5467 struct ath12k_base *ab = ar->ab;
5471 if (ab->hw_params->rfkill_pin == 0)
5474 ath12k_dbg(ab, ATH12K_DBG_MAC,
5475 "mac rfkill_pin %d rfkill_cfg %d rfkill_on_level %d",
5476 ab->hw_params->rfkill_pin, ab->hw_params->rfkill_cfg,
5477 ab->hw_params->rfkill_on_level);
5479 param = u32_encode_bits(ab->hw_params->rfkill_on_level,
5480 WMI_RFKILL_CFG_RADIO_LEVEL) |
5481 u32_encode_bits(ab->hw_params->rfkill_pin,
5482 WMI_RFKILL_CFG_GPIO_PIN_NUM) |
5483 u32_encode_bits(ab->hw_params->rfkill_cfg,
5484 WMI_RFKILL_CFG_PIN_AS_GPIO);
5486 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_HW_RFKILL_CONFIG,
5487 param, ar->pdev->pdev_id);
5490 "failed to set rfkill config 0x%x: %d\n",
5498 int ath12k_mac_rfkill_enable_radio(struct ath12k *ar, bool enable)
5500 enum wmi_rfkill_enable_radio param;
5504 param = WMI_RFKILL_ENABLE_RADIO_ON;
5506 param = WMI_RFKILL_ENABLE_RADIO_OFF;
5508 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac %d rfkill enable %d",
5509 ar->pdev_idx, param);
5511 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_RFKILL_ENABLE,
5512 param, ar->pdev->pdev_id);
5514 ath12k_warn(ar->ab, "failed to set rfkill enable param %d: %d\n",
5522 static void ath12k_mac_stop(struct ath12k *ar)
5524 struct htt_ppdu_stats_info *ppdu_stats, *tmp;
5527 mutex_lock(&ar->conf_mutex);
5528 ret = ath12k_mac_config_mon_status_default(ar, false);
5529 if (ret && (ret != -EOPNOTSUPP))
5530 ath12k_err(ar->ab, "failed to clear rx_filter for monitor status ring: (%d)\n",
5533 clear_bit(ATH12K_CAC_RUNNING, &ar->dev_flags);
5534 ar->state = ATH12K_STATE_OFF;
5535 mutex_unlock(&ar->conf_mutex);
5537 cancel_delayed_work_sync(&ar->scan.timeout);
5538 cancel_work_sync(&ar->regd_update_work);
5539 cancel_work_sync(&ar->ab->rfkill_work);
5541 spin_lock_bh(&ar->data_lock);
5542 list_for_each_entry_safe(ppdu_stats, tmp, &ar->ppdu_stats_info, list) {
5543 list_del(&ppdu_stats->list);
5546 spin_unlock_bh(&ar->data_lock);
5548 rcu_assign_pointer(ar->ab->pdevs_active[ar->pdev_idx], NULL);
5552 atomic_set(&ar->num_pending_mgmt_tx, 0);
5555 static void ath12k_mac_op_stop(struct ieee80211_hw *hw)
5557 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
5558 struct ath12k *ar = ath12k_ah_to_ar(ah);
5560 ath12k_mac_drain_tx(ar);
5562 ath12k_mac_stop(ar);
5566 ath12k_mac_get_vdev_stats_id(struct ath12k_vif *arvif)
5568 struct ath12k_base *ab = arvif->ar->ab;
5569 u8 vdev_stats_id = 0;
5572 if (ab->free_vdev_stats_id_map & (1LL << vdev_stats_id)) {
5574 if (vdev_stats_id >= ATH12K_MAX_VDEV_STATS_ID) {
5575 vdev_stats_id = ATH12K_INVAL_VDEV_STATS_ID;
5579 ab->free_vdev_stats_id_map |= (1LL << vdev_stats_id);
5582 } while (vdev_stats_id);
5584 arvif->vdev_stats_id = vdev_stats_id;
5585 return vdev_stats_id;
5588 static void ath12k_mac_setup_vdev_create_arg(struct ath12k_vif *arvif,
5589 struct ath12k_wmi_vdev_create_arg *arg)
5591 struct ath12k *ar = arvif->ar;
5592 struct ath12k_pdev *pdev = ar->pdev;
5594 arg->if_id = arvif->vdev_id;
5595 arg->type = arvif->vdev_type;
5596 arg->subtype = arvif->vdev_subtype;
5597 arg->pdev_id = pdev->pdev_id;
5599 if (pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) {
5600 arg->chains[NL80211_BAND_2GHZ].tx = ar->num_tx_chains;
5601 arg->chains[NL80211_BAND_2GHZ].rx = ar->num_rx_chains;
5603 if (pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) {
5604 arg->chains[NL80211_BAND_5GHZ].tx = ar->num_tx_chains;
5605 arg->chains[NL80211_BAND_5GHZ].rx = ar->num_rx_chains;
5607 if (pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP &&
5608 ar->supports_6ghz) {
5609 arg->chains[NL80211_BAND_6GHZ].tx = ar->num_tx_chains;
5610 arg->chains[NL80211_BAND_6GHZ].rx = ar->num_rx_chains;
5613 arg->if_stats_id = ath12k_mac_get_vdev_stats_id(arvif);
5617 ath12k_mac_prepare_he_mode(struct ath12k_pdev *pdev, u32 viftype)
5619 struct ath12k_pdev_cap *pdev_cap = &pdev->cap;
5620 struct ath12k_band_cap *cap_band = NULL;
5621 u32 *hecap_phy_ptr = NULL;
5624 if (pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP)
5625 cap_band = &pdev_cap->band[NL80211_BAND_2GHZ];
5627 cap_band = &pdev_cap->band[NL80211_BAND_5GHZ];
5629 hecap_phy_ptr = &cap_band->he_cap_phy_info[0];
5631 hemode = u32_encode_bits(HE_SU_BFEE_ENABLE, HE_MODE_SU_TX_BFEE) |
5632 u32_encode_bits(HECAP_PHY_SUBFMR_GET(hecap_phy_ptr),
5633 HE_MODE_SU_TX_BFER) |
5634 u32_encode_bits(HECAP_PHY_ULMUMIMO_GET(hecap_phy_ptr),
5637 /* TODO: WDS and other modes */
5638 if (viftype == NL80211_IFTYPE_AP) {
5639 hemode |= u32_encode_bits(HECAP_PHY_MUBFMR_GET(hecap_phy_ptr),
5640 HE_MODE_MU_TX_BFER) |
5641 u32_encode_bits(HE_DL_MUOFDMA_ENABLE, HE_MODE_DL_OFDMA) |
5642 u32_encode_bits(HE_UL_MUOFDMA_ENABLE, HE_MODE_UL_OFDMA);
5644 hemode |= u32_encode_bits(HE_MU_BFEE_ENABLE, HE_MODE_MU_TX_BFEE);
5650 static int ath12k_set_he_mu_sounding_mode(struct ath12k *ar,
5651 struct ath12k_vif *arvif)
5653 u32 param_id, param_value;
5654 struct ath12k_base *ab = ar->ab;
5657 param_id = WMI_VDEV_PARAM_SET_HEMU_MODE;
5658 param_value = ath12k_mac_prepare_he_mode(ar->pdev, arvif->vif->type);
5659 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
5660 param_id, param_value);
5662 ath12k_warn(ab, "failed to set vdev %d HE MU mode: %d param_value %x\n",
5663 arvif->vdev_id, ret, param_value);
5666 param_id = WMI_VDEV_PARAM_SET_HE_SOUNDING_MODE;
5668 u32_encode_bits(HE_VHT_SOUNDING_MODE_ENABLE, HE_VHT_SOUNDING_MODE) |
5669 u32_encode_bits(HE_TRIG_NONTRIG_SOUNDING_MODE_ENABLE,
5670 HE_TRIG_NONTRIG_SOUNDING_MODE);
5671 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
5672 param_id, param_value);
5674 ath12k_warn(ab, "failed to set vdev %d HE MU mode: %d\n",
5675 arvif->vdev_id, ret);
5681 static void ath12k_mac_update_vif_offload(struct ath12k_vif *arvif)
5683 struct ieee80211_vif *vif = arvif->vif;
5684 struct ath12k *ar = arvif->ar;
5685 struct ath12k_base *ab = ar->ab;
5686 u32 param_id, param_value;
5689 param_id = WMI_VDEV_PARAM_TX_ENCAP_TYPE;
5690 if (vif->type != NL80211_IFTYPE_STATION &&
5691 vif->type != NL80211_IFTYPE_AP)
5692 vif->offload_flags &= ~(IEEE80211_OFFLOAD_ENCAP_ENABLED |
5693 IEEE80211_OFFLOAD_DECAP_ENABLED);
5695 if (vif->offload_flags & IEEE80211_OFFLOAD_ENCAP_ENABLED)
5696 arvif->tx_encap_type = ATH12K_HW_TXRX_ETHERNET;
5697 else if (test_bit(ATH12K_FLAG_RAW_MODE, &ab->dev_flags))
5698 arvif->tx_encap_type = ATH12K_HW_TXRX_RAW;
5700 arvif->tx_encap_type = ATH12K_HW_TXRX_NATIVE_WIFI;
5702 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
5703 param_id, arvif->tx_encap_type);
5705 ath12k_warn(ab, "failed to set vdev %d tx encap mode: %d\n",
5706 arvif->vdev_id, ret);
5707 vif->offload_flags &= ~IEEE80211_OFFLOAD_ENCAP_ENABLED;
5710 param_id = WMI_VDEV_PARAM_RX_DECAP_TYPE;
5711 if (vif->offload_flags & IEEE80211_OFFLOAD_DECAP_ENABLED)
5712 param_value = ATH12K_HW_TXRX_ETHERNET;
5713 else if (test_bit(ATH12K_FLAG_RAW_MODE, &ab->dev_flags))
5714 param_value = ATH12K_HW_TXRX_RAW;
5716 param_value = ATH12K_HW_TXRX_NATIVE_WIFI;
5718 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
5719 param_id, param_value);
5721 ath12k_warn(ab, "failed to set vdev %d rx decap mode: %d\n",
5722 arvif->vdev_id, ret);
5723 vif->offload_flags &= ~IEEE80211_OFFLOAD_DECAP_ENABLED;
5727 static void ath12k_mac_op_update_vif_offload(struct ieee80211_hw *hw,
5728 struct ieee80211_vif *vif)
5730 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
5732 ath12k_mac_update_vif_offload(arvif);
5735 static int ath12k_mac_op_add_interface(struct ieee80211_hw *hw,
5736 struct ieee80211_vif *vif)
5738 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
5740 struct ath12k_base *ab;
5741 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
5742 struct ath12k_wmi_vdev_create_arg vdev_arg = {0};
5743 struct ath12k_wmi_peer_create_arg peer_param;
5744 u32 param_id, param_value;
5750 vif->driver_flags |= IEEE80211_VIF_SUPPORTS_UAPSD;
5752 ar = ath12k_ah_to_ar(ah);
5755 mutex_lock(&ar->conf_mutex);
5757 if (vif->type == NL80211_IFTYPE_AP &&
5758 ar->num_peers > (ar->max_num_peers - 1)) {
5759 ath12k_warn(ab, "failed to create vdev due to insufficient peer entry resource in firmware\n");
5764 if (ar->num_created_vdevs > (TARGET_NUM_VDEVS - 1)) {
5765 ath12k_warn(ab, "failed to create vdev, reached max vdev limit %d\n",
5771 memset(arvif, 0, sizeof(*arvif));
5776 INIT_LIST_HEAD(&arvif->list);
5778 /* Should we initialize any worker to handle connection loss indication
5779 * from firmware in sta mode?
5782 for (i = 0; i < ARRAY_SIZE(arvif->bitrate_mask.control); i++) {
5783 arvif->bitrate_mask.control[i].legacy = 0xffffffff;
5784 memset(arvif->bitrate_mask.control[i].ht_mcs, 0xff,
5785 sizeof(arvif->bitrate_mask.control[i].ht_mcs));
5786 memset(arvif->bitrate_mask.control[i].vht_mcs, 0xff,
5787 sizeof(arvif->bitrate_mask.control[i].vht_mcs));
5790 bit = __ffs64(ab->free_vdev_map);
5792 arvif->vdev_id = bit;
5793 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE;
5795 switch (vif->type) {
5796 case NL80211_IFTYPE_UNSPECIFIED:
5797 case NL80211_IFTYPE_STATION:
5798 arvif->vdev_type = WMI_VDEV_TYPE_STA;
5801 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_CLIENT;
5804 case NL80211_IFTYPE_MESH_POINT:
5805 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_MESH_11S;
5807 case NL80211_IFTYPE_AP:
5808 arvif->vdev_type = WMI_VDEV_TYPE_AP;
5811 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_GO;
5814 case NL80211_IFTYPE_MONITOR:
5815 arvif->vdev_type = WMI_VDEV_TYPE_MONITOR;
5816 ar->monitor_vdev_id = bit;
5818 case NL80211_IFTYPE_P2P_DEVICE:
5819 arvif->vdev_type = WMI_VDEV_TYPE_STA;
5820 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_DEVICE;
5827 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac add interface id %d type %d subtype %d map %llx\n",
5828 arvif->vdev_id, arvif->vdev_type, arvif->vdev_subtype,
5831 vif->cab_queue = arvif->vdev_id % (ATH12K_HW_MAX_QUEUES - 1);
5832 for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++)
5833 vif->hw_queue[i] = i % (ATH12K_HW_MAX_QUEUES - 1);
5835 ath12k_mac_setup_vdev_create_arg(arvif, &vdev_arg);
5837 ret = ath12k_wmi_vdev_create(ar, vif->addr, &vdev_arg);
5839 ath12k_warn(ab, "failed to create WMI vdev %d: %d\n",
5840 arvif->vdev_id, ret);
5844 ar->num_created_vdevs++;
5845 ath12k_dbg(ab, ATH12K_DBG_MAC, "vdev %pM created, vdev_id %d\n",
5846 vif->addr, arvif->vdev_id);
5847 ar->allocated_vdev_map |= 1LL << arvif->vdev_id;
5848 ab->free_vdev_map &= ~(1LL << arvif->vdev_id);
5850 spin_lock_bh(&ar->data_lock);
5851 list_add(&arvif->list, &ar->arvifs);
5852 spin_unlock_bh(&ar->data_lock);
5854 ath12k_mac_update_vif_offload(arvif);
5856 nss = hweight32(ar->cfg_tx_chainmask) ? : 1;
5857 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
5858 WMI_VDEV_PARAM_NSS, nss);
5860 ath12k_warn(ab, "failed to set vdev %d chainmask 0x%x, nss %d :%d\n",
5861 arvif->vdev_id, ar->cfg_tx_chainmask, nss, ret);
5865 switch (arvif->vdev_type) {
5866 case WMI_VDEV_TYPE_AP:
5867 peer_param.vdev_id = arvif->vdev_id;
5868 peer_param.peer_addr = vif->addr;
5869 peer_param.peer_type = WMI_PEER_TYPE_DEFAULT;
5870 ret = ath12k_peer_create(ar, arvif, NULL, &peer_param);
5872 ath12k_warn(ab, "failed to vdev %d create peer for AP: %d\n",
5873 arvif->vdev_id, ret);
5877 ret = ath12k_mac_set_kickout(arvif);
5879 ath12k_warn(ar->ab, "failed to set vdev %i kickout parameters: %d\n",
5880 arvif->vdev_id, ret);
5884 case WMI_VDEV_TYPE_STA:
5885 param_id = WMI_STA_PS_PARAM_RX_WAKE_POLICY;
5886 param_value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
5887 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
5888 param_id, param_value);
5890 ath12k_warn(ar->ab, "failed to set vdev %d RX wake policy: %d\n",
5891 arvif->vdev_id, ret);
5895 param_id = WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD;
5896 param_value = WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS;
5897 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
5898 param_id, param_value);
5900 ath12k_warn(ar->ab, "failed to set vdev %d TX wake threshold: %d\n",
5901 arvif->vdev_id, ret);
5905 param_id = WMI_STA_PS_PARAM_PSPOLL_COUNT;
5906 param_value = WMI_STA_PS_PSPOLL_COUNT_NO_MAX;
5907 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
5908 param_id, param_value);
5910 ath12k_warn(ar->ab, "failed to set vdev %d pspoll count: %d\n",
5911 arvif->vdev_id, ret);
5915 ret = ath12k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id, false);
5917 ath12k_warn(ar->ab, "failed to disable vdev %d ps mode: %d\n",
5918 arvif->vdev_id, ret);
5926 arvif->txpower = vif->bss_conf.txpower;
5927 ret = ath12k_mac_txpower_recalc(ar);
5931 param_id = WMI_VDEV_PARAM_RTS_THRESHOLD;
5932 param_value = hw->wiphy->rts_threshold;
5933 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
5934 param_id, param_value);
5936 ath12k_warn(ar->ab, "failed to set rts threshold for vdev %d: %d\n",
5937 arvif->vdev_id, ret);
5940 ath12k_dp_vdev_tx_attach(ar, arvif);
5942 if (vif->type != NL80211_IFTYPE_MONITOR && ar->monitor_conf_enabled)
5943 ath12k_mac_monitor_vdev_create(ar);
5945 mutex_unlock(&ar->conf_mutex);
5950 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
5951 reinit_completion(&ar->peer_delete_done);
5953 ret = ath12k_wmi_send_peer_delete_cmd(ar, vif->addr,
5956 ath12k_warn(ar->ab, "failed to delete peer vdev_id %d addr %pM\n",
5957 arvif->vdev_id, vif->addr);
5961 ret = ath12k_wait_for_peer_delete_done(ar, arvif->vdev_id,
5970 ath12k_wmi_vdev_delete(ar, arvif->vdev_id);
5971 ar->num_created_vdevs--;
5972 ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id);
5973 ab->free_vdev_map |= 1LL << arvif->vdev_id;
5974 ab->free_vdev_stats_id_map &= ~(1LL << arvif->vdev_stats_id);
5975 spin_lock_bh(&ar->data_lock);
5976 list_del(&arvif->list);
5977 spin_unlock_bh(&ar->data_lock);
5980 mutex_unlock(&ar->conf_mutex);
5985 static void ath12k_mac_vif_unref(struct ath12k_dp *dp, struct ieee80211_vif *vif)
5987 struct ath12k_tx_desc_info *tx_desc_info;
5988 struct ath12k_skb_cb *skb_cb;
5989 struct sk_buff *skb;
5992 for (i = 0; i < ATH12K_HW_MAX_QUEUES; i++) {
5993 spin_lock_bh(&dp->tx_desc_lock[i]);
5995 list_for_each_entry(tx_desc_info, &dp->tx_desc_used_list[i],
5997 skb = tx_desc_info->skb;
6001 skb_cb = ATH12K_SKB_CB(skb);
6002 if (skb_cb->vif == vif)
6006 spin_unlock_bh(&dp->tx_desc_lock[i]);
6010 static void ath12k_mac_op_remove_interface(struct ieee80211_hw *hw,
6011 struct ieee80211_vif *vif)
6013 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
6015 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
6016 struct ath12k_base *ab;
6017 unsigned long time_left;
6020 ar = ath12k_ah_to_ar(ah);
6023 mutex_lock(&ar->conf_mutex);
6025 ath12k_dbg(ab, ATH12K_DBG_MAC, "mac remove interface (vdev %d)\n",
6028 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
6029 ret = ath12k_peer_delete(ar, arvif->vdev_id, vif->addr);
6031 ath12k_warn(ab, "failed to submit AP self-peer removal on vdev %d: %d\n",
6032 arvif->vdev_id, ret);
6035 reinit_completion(&ar->vdev_delete_done);
6037 ret = ath12k_wmi_vdev_delete(ar, arvif->vdev_id);
6039 ath12k_warn(ab, "failed to delete WMI vdev %d: %d\n",
6040 arvif->vdev_id, ret);
6044 time_left = wait_for_completion_timeout(&ar->vdev_delete_done,
6045 ATH12K_VDEV_DELETE_TIMEOUT_HZ);
6046 if (time_left == 0) {
6047 ath12k_warn(ab, "Timeout in receiving vdev delete response\n");
6051 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
6052 ar->monitor_vdev_id = -1;
6053 ar->monitor_vdev_created = false;
6054 } else if (ar->monitor_vdev_created && !ar->monitor_started) {
6055 ret = ath12k_mac_monitor_vdev_delete(ar);
6058 ab->free_vdev_map |= 1LL << (arvif->vdev_id);
6059 ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id);
6060 ab->free_vdev_stats_id_map &= ~(1LL << arvif->vdev_stats_id);
6061 ar->num_created_vdevs--;
6063 ath12k_dbg(ab, ATH12K_DBG_MAC, "vdev %pM deleted, vdev_id %d\n",
6064 vif->addr, arvif->vdev_id);
6067 spin_lock_bh(&ar->data_lock);
6068 list_del(&arvif->list);
6069 spin_unlock_bh(&ar->data_lock);
6071 ath12k_peer_cleanup(ar, arvif->vdev_id);
6073 idr_for_each(&ar->txmgmt_idr,
6074 ath12k_mac_vif_txmgmt_idr_remove, vif);
6076 ath12k_mac_vif_unref(&ab->dp, vif);
6077 ath12k_dp_tx_put_bank_profile(&ab->dp, arvif->bank_id);
6079 /* Recalc txpower for remaining vdev */
6080 ath12k_mac_txpower_recalc(ar);
6081 clear_bit(ATH12K_FLAG_MONITOR_ENABLED, &ar->monitor_flags);
6083 /* TODO: recal traffic pause state based on the available vdevs */
6085 mutex_unlock(&ar->conf_mutex);
6088 /* FIXME: Has to be verified. */
6089 #define SUPPORTED_FILTERS \
6094 FIF_BCN_PRBRESP_PROMISC | \
6098 static void ath12k_mac_configure_filter(struct ath12k *ar,
6099 unsigned int total_flags)
6104 lockdep_assert_held(&ar->conf_mutex);
6106 ar->filter_flags = total_flags;
6108 /* For monitor mode */
6109 reset_flag = !(ar->filter_flags & FIF_BCN_PRBRESP_PROMISC);
6111 ret = ath12k_dp_tx_htt_monitor_mode_ring_config(ar, reset_flag);
6114 set_bit(ATH12K_FLAG_MONITOR_ENABLED, &ar->monitor_flags);
6116 clear_bit(ATH12K_FLAG_MONITOR_ENABLED, &ar->monitor_flags);
6119 "fail to set monitor filter: %d\n", ret);
6122 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
6123 "total_flags:0x%x, reset_flag:%d\n",
6124 total_flags, reset_flag);
6127 static void ath12k_mac_op_configure_filter(struct ieee80211_hw *hw,
6128 unsigned int changed_flags,
6129 unsigned int *total_flags,
6132 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
6135 ar = ath12k_ah_to_ar(ah);
6137 mutex_lock(&ar->conf_mutex);
6139 *total_flags &= SUPPORTED_FILTERS;
6140 ath12k_mac_configure_filter(ar, *total_flags);
6142 mutex_unlock(&ar->conf_mutex);
6145 static int ath12k_mac_op_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant)
6147 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
6150 ar = ath12k_ah_to_ar(ah);
6152 mutex_lock(&ar->conf_mutex);
6154 *tx_ant = ar->cfg_tx_chainmask;
6155 *rx_ant = ar->cfg_rx_chainmask;
6157 mutex_unlock(&ar->conf_mutex);
6162 static int ath12k_mac_op_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)
6164 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
6168 ar = ath12k_ah_to_ar(ah);
6170 mutex_lock(&ar->conf_mutex);
6171 ret = __ath12k_set_antenna(ar, tx_ant, rx_ant);
6172 mutex_unlock(&ar->conf_mutex);
6177 static int ath12k_mac_ampdu_action(struct ath12k_vif *arvif,
6178 struct ieee80211_ampdu_params *params)
6180 struct ath12k *ar = arvif->ar;
6183 lockdep_assert_held(&ar->conf_mutex);
6185 switch (params->action) {
6186 case IEEE80211_AMPDU_RX_START:
6187 ret = ath12k_dp_rx_ampdu_start(ar, params);
6189 case IEEE80211_AMPDU_RX_STOP:
6190 ret = ath12k_dp_rx_ampdu_stop(ar, params);
6192 case IEEE80211_AMPDU_TX_START:
6193 case IEEE80211_AMPDU_TX_STOP_CONT:
6194 case IEEE80211_AMPDU_TX_STOP_FLUSH:
6195 case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
6196 case IEEE80211_AMPDU_TX_OPERATIONAL:
6197 /* Tx A-MPDU aggregation offloaded to hw/fw so deny mac80211
6198 * Tx aggregation requests.
6207 static int ath12k_mac_op_ampdu_action(struct ieee80211_hw *hw,
6208 struct ieee80211_vif *vif,
6209 struct ieee80211_ampdu_params *params)
6211 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
6213 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
6216 ar = ath12k_ah_to_ar(ah);
6218 mutex_lock(&ar->conf_mutex);
6219 ret = ath12k_mac_ampdu_action(arvif, params);
6220 mutex_unlock(&ar->conf_mutex);
6223 ath12k_warn(ar->ab, "pdev idx %d unable to perform ampdu action %d ret %d\n",
6224 ar->pdev_idx, params->action, ret);
6229 static int ath12k_mac_op_add_chanctx(struct ieee80211_hw *hw,
6230 struct ieee80211_chanctx_conf *ctx)
6232 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
6234 struct ath12k_base *ab;
6236 ar = ath12k_ah_to_ar(ah);
6239 ath12k_dbg(ab, ATH12K_DBG_MAC,
6240 "mac chanctx add freq %u width %d ptr %pK\n",
6241 ctx->def.chan->center_freq, ctx->def.width, ctx);
6243 mutex_lock(&ar->conf_mutex);
6245 spin_lock_bh(&ar->data_lock);
6246 /* TODO: In case of multiple channel context, populate rx_channel from
6247 * Rx PPDU desc information.
6249 ar->rx_channel = ctx->def.chan;
6250 spin_unlock_bh(&ar->data_lock);
6252 mutex_unlock(&ar->conf_mutex);
6257 static void ath12k_mac_op_remove_chanctx(struct ieee80211_hw *hw,
6258 struct ieee80211_chanctx_conf *ctx)
6260 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
6262 struct ath12k_base *ab;
6264 ar = ath12k_ah_to_ar(ah);
6267 ath12k_dbg(ab, ATH12K_DBG_MAC,
6268 "mac chanctx remove freq %u width %d ptr %pK\n",
6269 ctx->def.chan->center_freq, ctx->def.width, ctx);
6271 mutex_lock(&ar->conf_mutex);
6273 spin_lock_bh(&ar->data_lock);
6274 /* TODO: In case of there is one more channel context left, populate
6275 * rx_channel with the channel of that remaining channel context.
6277 ar->rx_channel = NULL;
6278 spin_unlock_bh(&ar->data_lock);
6280 mutex_unlock(&ar->conf_mutex);
6283 static enum wmi_phy_mode
6284 ath12k_mac_check_down_grade_phy_mode(struct ath12k *ar,
6285 enum wmi_phy_mode mode,
6286 enum nl80211_band band,
6287 enum nl80211_iftype type)
6289 struct ieee80211_sta_eht_cap *eht_cap;
6290 enum wmi_phy_mode down_mode;
6292 if (mode < MODE_11BE_EHT20)
6295 eht_cap = &ar->mac.iftype[band][type].eht_cap;
6296 if (eht_cap->has_eht)
6300 case MODE_11BE_EHT20:
6301 down_mode = MODE_11AX_HE20;
6303 case MODE_11BE_EHT40:
6304 down_mode = MODE_11AX_HE40;
6306 case MODE_11BE_EHT80:
6307 down_mode = MODE_11AX_HE80;
6309 case MODE_11BE_EHT80_80:
6310 down_mode = MODE_11AX_HE80_80;
6312 case MODE_11BE_EHT160:
6313 case MODE_11BE_EHT160_160:
6314 case MODE_11BE_EHT320:
6315 down_mode = MODE_11AX_HE160;
6317 case MODE_11BE_EHT20_2G:
6318 down_mode = MODE_11AX_HE20_2G;
6320 case MODE_11BE_EHT40_2G:
6321 down_mode = MODE_11AX_HE40_2G;
6328 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
6329 "mac vdev start phymode %s downgrade to %s\n",
6330 ath12k_mac_phymode_str(mode),
6331 ath12k_mac_phymode_str(down_mode));
6337 ath12k_mac_vdev_start_restart(struct ath12k_vif *arvif,
6338 struct ieee80211_chanctx_conf *ctx,
6341 struct ath12k *ar = arvif->ar;
6342 struct ath12k_base *ab = ar->ab;
6343 struct wmi_vdev_start_req_arg arg = {};
6344 const struct cfg80211_chan_def *chandef = &ctx->def;
6345 int he_support = arvif->vif->bss_conf.he_support;
6348 lockdep_assert_held(&ar->conf_mutex);
6350 reinit_completion(&ar->vdev_setup_done);
6352 arg.vdev_id = arvif->vdev_id;
6353 arg.dtim_period = arvif->dtim_period;
6354 arg.bcn_intval = arvif->beacon_interval;
6355 arg.punct_bitmap = ~arvif->punct_bitmap;
6357 arg.freq = chandef->chan->center_freq;
6358 arg.band_center_freq1 = chandef->center_freq1;
6359 arg.band_center_freq2 = chandef->center_freq2;
6360 arg.mode = ath12k_phymodes[chandef->chan->band][chandef->width];
6362 arg.mode = ath12k_mac_check_down_grade_phy_mode(ar, arg.mode,
6363 chandef->chan->band,
6366 arg.max_power = chandef->chan->max_power * 2;
6367 arg.max_reg_power = chandef->chan->max_reg_power * 2;
6368 arg.max_antenna_gain = chandef->chan->max_antenna_gain * 2;
6370 arg.pref_tx_streams = ar->num_tx_chains;
6371 arg.pref_rx_streams = ar->num_rx_chains;
6373 /* Fill the MBSSID flags to indicate AP is non MBSSID by default
6374 * Corresponding flags would be updated with MBSSID support.
6376 arg.mbssid_flags = WMI_VDEV_MBSSID_FLAGS_NON_MBSSID_AP;
6378 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
6379 arg.ssid = arvif->u.ap.ssid;
6380 arg.ssid_len = arvif->u.ap.ssid_len;
6381 arg.hidden_ssid = arvif->u.ap.hidden_ssid;
6383 /* For now allow DFS for AP mode */
6384 arg.chan_radar = !!(chandef->chan->flags & IEEE80211_CHAN_RADAR);
6386 arg.freq2_radar = ctx->radar_enabled;
6388 arg.passive = arg.chan_radar;
6390 spin_lock_bh(&ab->base_lock);
6391 arg.regdomain = ar->ab->dfs_region;
6392 spin_unlock_bh(&ab->base_lock);
6394 /* TODO: Notify if secondary 80Mhz also needs radar detection */
6396 ret = ath12k_set_he_mu_sounding_mode(ar, arvif);
6398 ath12k_warn(ar->ab, "failed to set he mode vdev %i\n",
6405 arg.passive |= !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR);
6407 ath12k_dbg(ab, ATH12K_DBG_MAC,
6408 "mac vdev %d start center_freq %d phymode %s punct_bitmap 0x%x\n",
6409 arg.vdev_id, arg.freq,
6410 ath12k_mac_phymode_str(arg.mode), arg.punct_bitmap);
6412 ret = ath12k_wmi_vdev_start(ar, &arg, restart);
6414 ath12k_warn(ar->ab, "failed to %s WMI vdev %i\n",
6415 restart ? "restart" : "start", arg.vdev_id);
6419 ret = ath12k_mac_vdev_setup_sync(ar);
6421 ath12k_warn(ab, "failed to synchronize setup for vdev %i %s: %d\n",
6422 arg.vdev_id, restart ? "restart" : "start", ret);
6426 ar->num_started_vdevs++;
6427 ath12k_dbg(ab, ATH12K_DBG_MAC, "vdev %pM started, vdev_id %d\n",
6428 arvif->vif->addr, arvif->vdev_id);
6430 /* Enable CAC Flag in the driver by checking the channel DFS cac time,
6431 * i.e dfs_cac_ms value which will be valid only for radar channels
6432 * and state as NL80211_DFS_USABLE which indicates CAC needs to be
6433 * done before channel usage. This flags is used to drop rx packets.
6436 /* TODO: Set the flag for other interface types as required */
6437 if (arvif->vdev_type == WMI_VDEV_TYPE_AP &&
6438 chandef->chan->dfs_cac_ms &&
6439 chandef->chan->dfs_state == NL80211_DFS_USABLE) {
6440 set_bit(ATH12K_CAC_RUNNING, &ar->dev_flags);
6441 ath12k_dbg(ab, ATH12K_DBG_MAC,
6442 "CAC Started in chan_freq %d for vdev %d\n",
6443 arg.freq, arg.vdev_id);
6446 ret = ath12k_mac_set_txbf_conf(arvif);
6448 ath12k_warn(ab, "failed to set txbf conf for vdev %d: %d\n",
6449 arvif->vdev_id, ret);
6454 static int ath12k_mac_vdev_start(struct ath12k_vif *arvif,
6455 struct ieee80211_chanctx_conf *ctx)
6457 return ath12k_mac_vdev_start_restart(arvif, ctx, false);
6460 static int ath12k_mac_vdev_restart(struct ath12k_vif *arvif,
6461 struct ieee80211_chanctx_conf *ctx)
6463 return ath12k_mac_vdev_start_restart(arvif, ctx, true);
6466 struct ath12k_mac_change_chanctx_arg {
6467 struct ieee80211_chanctx_conf *ctx;
6468 struct ieee80211_vif_chanctx_switch *vifs;
6474 ath12k_mac_change_chanctx_cnt_iter(void *data, u8 *mac,
6475 struct ieee80211_vif *vif)
6477 struct ath12k_mac_change_chanctx_arg *arg = data;
6479 if (rcu_access_pointer(vif->bss_conf.chanctx_conf) != arg->ctx)
6486 ath12k_mac_change_chanctx_fill_iter(void *data, u8 *mac,
6487 struct ieee80211_vif *vif)
6489 struct ath12k_mac_change_chanctx_arg *arg = data;
6490 struct ieee80211_chanctx_conf *ctx;
6492 ctx = rcu_access_pointer(vif->bss_conf.chanctx_conf);
6493 if (ctx != arg->ctx)
6496 if (WARN_ON(arg->next_vif == arg->n_vifs))
6499 arg->vifs[arg->next_vif].vif = vif;
6500 arg->vifs[arg->next_vif].old_ctx = ctx;
6501 arg->vifs[arg->next_vif].new_ctx = ctx;
6506 ath12k_mac_update_vif_chan(struct ath12k *ar,
6507 struct ieee80211_vif_chanctx_switch *vifs,
6510 struct ath12k_base *ab = ar->ab;
6511 struct ath12k_vif *arvif;
6514 bool monitor_vif = false;
6516 lockdep_assert_held(&ar->conf_mutex);
6518 for (i = 0; i < n_vifs; i++) {
6519 arvif = ath12k_vif_to_arvif(vifs[i].vif);
6521 if (vifs[i].vif->type == NL80211_IFTYPE_MONITOR)
6524 ath12k_dbg(ab, ATH12K_DBG_MAC,
6525 "mac chanctx switch vdev_id %i freq %u->%u width %d->%d\n",
6527 vifs[i].old_ctx->def.chan->center_freq,
6528 vifs[i].new_ctx->def.chan->center_freq,
6529 vifs[i].old_ctx->def.width,
6530 vifs[i].new_ctx->def.width);
6532 if (WARN_ON(!arvif->is_started))
6535 if (WARN_ON(!arvif->is_up))
6538 ret = ath12k_wmi_vdev_down(ar, arvif->vdev_id);
6540 ath12k_warn(ab, "failed to down vdev %d: %d\n",
6541 arvif->vdev_id, ret);
6546 /* All relevant vdevs are downed and associated channel resources
6547 * should be available for the channel switch now.
6550 /* TODO: Update ar->rx_channel */
6552 for (i = 0; i < n_vifs; i++) {
6553 arvif = ath12k_vif_to_arvif(vifs[i].vif);
6555 if (WARN_ON(!arvif->is_started))
6558 arvif->punct_bitmap = vifs[i].new_ctx->def.punctured;
6560 /* Firmware expect vdev_restart only if vdev is up.
6561 * If vdev is down then it expect vdev_stop->vdev_start.
6564 ret = ath12k_mac_vdev_restart(arvif, vifs[i].new_ctx);
6566 ath12k_warn(ab, "failed to restart vdev %d: %d\n",
6567 arvif->vdev_id, ret);
6571 ret = ath12k_mac_vdev_stop(arvif);
6573 ath12k_warn(ab, "failed to stop vdev %d: %d\n",
6574 arvif->vdev_id, ret);
6578 ret = ath12k_mac_vdev_start(arvif, vifs[i].new_ctx);
6580 ath12k_warn(ab, "failed to start vdev %d: %d\n",
6581 arvif->vdev_id, ret);
6585 ret = ath12k_mac_setup_bcn_tmpl(arvif);
6587 ath12k_warn(ab, "failed to update bcn tmpl during csa: %d\n",
6590 ret = ath12k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
6593 ath12k_warn(ab, "failed to bring vdev up %d: %d\n",
6594 arvif->vdev_id, ret);
6599 /* Restart the internal monitor vdev on new channel */
6600 if (!monitor_vif && ar->monitor_vdev_created) {
6601 if (!ath12k_mac_monitor_stop(ar))
6602 ath12k_mac_monitor_start(ar);
6607 ath12k_mac_update_active_vif_chan(struct ath12k *ar,
6608 struct ieee80211_chanctx_conf *ctx)
6610 struct ath12k_mac_change_chanctx_arg arg = { .ctx = ctx };
6611 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
6613 lockdep_assert_held(&ar->conf_mutex);
6615 ieee80211_iterate_active_interfaces_atomic(hw,
6616 IEEE80211_IFACE_ITER_NORMAL,
6617 ath12k_mac_change_chanctx_cnt_iter,
6619 if (arg.n_vifs == 0)
6622 arg.vifs = kcalloc(arg.n_vifs, sizeof(arg.vifs[0]), GFP_KERNEL);
6626 ieee80211_iterate_active_interfaces_atomic(hw,
6627 IEEE80211_IFACE_ITER_NORMAL,
6628 ath12k_mac_change_chanctx_fill_iter,
6631 ath12k_mac_update_vif_chan(ar, arg.vifs, arg.n_vifs);
6636 static void ath12k_mac_op_change_chanctx(struct ieee80211_hw *hw,
6637 struct ieee80211_chanctx_conf *ctx,
6640 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
6642 struct ath12k_base *ab;
6644 ar = ath12k_ah_to_ar(ah);
6647 mutex_lock(&ar->conf_mutex);
6649 ath12k_dbg(ab, ATH12K_DBG_MAC,
6650 "mac chanctx change freq %u width %d ptr %pK changed %x\n",
6651 ctx->def.chan->center_freq, ctx->def.width, ctx, changed);
6653 /* This shouldn't really happen because channel switching should use
6654 * switch_vif_chanctx().
6656 if (WARN_ON(changed & IEEE80211_CHANCTX_CHANGE_CHANNEL))
6659 if (changed & IEEE80211_CHANCTX_CHANGE_WIDTH ||
6660 changed & IEEE80211_CHANCTX_CHANGE_RADAR ||
6661 changed & IEEE80211_CHANCTX_CHANGE_PUNCTURING)
6662 ath12k_mac_update_active_vif_chan(ar, ctx);
6664 /* TODO: Recalc radar detection */
6667 mutex_unlock(&ar->conf_mutex);
6670 static int ath12k_start_vdev_delay(struct ath12k *ar,
6671 struct ath12k_vif *arvif)
6673 struct ath12k_base *ab = ar->ab;
6674 struct ieee80211_vif *vif = arvif->vif;
6677 if (WARN_ON(arvif->is_started))
6680 ret = ath12k_mac_vdev_start(arvif, &arvif->chanctx);
6682 ath12k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n",
6683 arvif->vdev_id, vif->addr,
6684 arvif->chanctx.def.chan->center_freq, ret);
6688 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
6689 ret = ath12k_monitor_vdev_up(ar, arvif->vdev_id);
6691 ath12k_warn(ab, "failed put monitor up: %d\n", ret);
6696 arvif->is_started = true;
6698 /* TODO: Setup ps and cts/rts protection */
6703 ath12k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw,
6704 struct ieee80211_vif *vif,
6705 struct ieee80211_bss_conf *link_conf,
6706 struct ieee80211_chanctx_conf *ctx)
6708 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
6710 struct ath12k_base *ab;
6711 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
6713 struct ath12k_wmi_peer_create_arg param;
6715 ar = ath12k_ah_to_ar(ah);
6718 mutex_lock(&ar->conf_mutex);
6720 ath12k_dbg(ab, ATH12K_DBG_MAC,
6721 "mac chanctx assign ptr %pK vdev_id %i\n",
6722 ctx, arvif->vdev_id);
6724 arvif->punct_bitmap = ctx->def.punctured;
6726 /* for some targets bss peer must be created before vdev_start */
6727 if (ab->hw_params->vdev_start_delay &&
6728 arvif->vdev_type != WMI_VDEV_TYPE_AP &&
6729 arvif->vdev_type != WMI_VDEV_TYPE_MONITOR &&
6730 !ath12k_peer_exist_by_vdev_id(ab, arvif->vdev_id)) {
6731 memcpy(&arvif->chanctx, ctx, sizeof(*ctx));
6736 if (WARN_ON(arvif->is_started)) {
6741 if (ab->hw_params->vdev_start_delay &&
6742 arvif->vdev_type != WMI_VDEV_TYPE_AP &&
6743 arvif->vdev_type != WMI_VDEV_TYPE_MONITOR) {
6744 param.vdev_id = arvif->vdev_id;
6745 param.peer_type = WMI_PEER_TYPE_DEFAULT;
6746 param.peer_addr = ar->mac_addr;
6748 ret = ath12k_peer_create(ar, arvif, NULL, ¶m);
6750 ath12k_warn(ab, "failed to create peer after vdev start delay: %d",
6756 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
6757 ret = ath12k_mac_monitor_start(ar);
6760 arvif->is_started = true;
6764 ret = ath12k_mac_vdev_start(arvif, ctx);
6766 ath12k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n",
6767 arvif->vdev_id, vif->addr,
6768 ctx->def.chan->center_freq, ret);
6772 if (arvif->vdev_type != WMI_VDEV_TYPE_MONITOR && ar->monitor_vdev_created)
6773 ath12k_mac_monitor_start(ar);
6775 arvif->is_started = true;
6777 /* TODO: Setup ps and cts/rts protection */
6780 mutex_unlock(&ar->conf_mutex);
6786 ath12k_mac_op_unassign_vif_chanctx(struct ieee80211_hw *hw,
6787 struct ieee80211_vif *vif,
6788 struct ieee80211_bss_conf *link_conf,
6789 struct ieee80211_chanctx_conf *ctx)
6791 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
6793 struct ath12k_base *ab;
6794 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
6797 ar = ath12k_ah_to_ar(ah);
6800 mutex_lock(&ar->conf_mutex);
6802 ath12k_dbg(ab, ATH12K_DBG_MAC,
6803 "mac chanctx unassign ptr %pK vdev_id %i\n",
6804 ctx, arvif->vdev_id);
6806 WARN_ON(!arvif->is_started);
6808 if (ab->hw_params->vdev_start_delay &&
6809 arvif->vdev_type == WMI_VDEV_TYPE_MONITOR &&
6810 ath12k_peer_find_by_addr(ab, ar->mac_addr))
6811 ath12k_peer_delete(ar, arvif->vdev_id, ar->mac_addr);
6813 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
6814 ret = ath12k_mac_monitor_stop(ar);
6816 mutex_unlock(&ar->conf_mutex);
6820 arvif->is_started = false;
6823 if (arvif->vdev_type != WMI_VDEV_TYPE_STA) {
6824 ath12k_bss_disassoc(ar, arvif);
6825 ret = ath12k_mac_vdev_stop(arvif);
6827 ath12k_warn(ab, "failed to stop vdev %i: %d\n",
6828 arvif->vdev_id, ret);
6830 arvif->is_started = false;
6832 if (ab->hw_params->vdev_start_delay &&
6833 arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
6834 ath12k_wmi_vdev_down(ar, arvif->vdev_id);
6836 if (arvif->vdev_type != WMI_VDEV_TYPE_MONITOR &&
6837 ar->num_started_vdevs == 1 && ar->monitor_vdev_created)
6838 ath12k_mac_monitor_stop(ar);
6840 mutex_unlock(&ar->conf_mutex);
6844 ath12k_mac_op_switch_vif_chanctx(struct ieee80211_hw *hw,
6845 struct ieee80211_vif_chanctx_switch *vifs,
6847 enum ieee80211_chanctx_switch_mode mode)
6849 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
6852 ar = ath12k_ah_to_ar(ah);
6854 mutex_lock(&ar->conf_mutex);
6856 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
6857 "mac chanctx switch n_vifs %d mode %d\n",
6859 ath12k_mac_update_vif_chan(ar, vifs, n_vifs);
6861 mutex_unlock(&ar->conf_mutex);
6867 ath12k_set_vdev_param_to_all_vifs(struct ath12k *ar, int param, u32 value)
6869 struct ath12k_vif *arvif;
6872 mutex_lock(&ar->conf_mutex);
6873 list_for_each_entry(arvif, &ar->arvifs, list) {
6874 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "setting mac vdev %d param %d value %d\n",
6875 param, arvif->vdev_id, value);
6877 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
6880 ath12k_warn(ar->ab, "failed to set param %d for vdev %d: %d\n",
6881 param, arvif->vdev_id, ret);
6885 mutex_unlock(&ar->conf_mutex);
6889 /* mac80211 stores device specific RTS/Fragmentation threshold value,
6890 * this is set interface specific to firmware from ath12k driver
6892 static int ath12k_mac_op_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
6894 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
6896 int param_id = WMI_VDEV_PARAM_RTS_THRESHOLD, ret;
6898 ar = ath12k_ah_to_ar(ah);
6900 ret = ath12k_set_vdev_param_to_all_vifs(ar, param_id, value);
6905 static int ath12k_mac_op_set_frag_threshold(struct ieee80211_hw *hw, u32 value)
6907 /* Even though there's a WMI vdev param for fragmentation threshold no
6908 * known firmware actually implements it. Moreover it is not possible to
6909 * rely frame fragmentation to mac80211 because firmware clears the
6910 * "more fragments" bit in frame control making it impossible for remote
6911 * devices to reassemble frames.
6913 * Hence implement a dummy callback just to say fragmentation isn't
6914 * supported. This effectively prevents mac80211 from doing frame
6915 * fragmentation in software.
6920 static void ath12k_mac_flush(struct ath12k *ar)
6924 time_left = wait_event_timeout(ar->dp.tx_empty_waitq,
6925 (atomic_read(&ar->dp.num_tx_pending) == 0),
6926 ATH12K_FLUSH_TIMEOUT);
6928 ath12k_warn(ar->ab, "failed to flush transmit queue %ld\n", time_left);
6930 time_left = wait_event_timeout(ar->txmgmt_empty_waitq,
6931 (atomic_read(&ar->num_pending_mgmt_tx) == 0),
6932 ATH12K_FLUSH_TIMEOUT);
6934 ath12k_warn(ar->ab, "failed to flush mgmt transmit queue %ld\n",
6938 static void ath12k_mac_op_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
6939 u32 queues, bool drop)
6941 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
6942 struct ath12k *ar = ath12k_ah_to_ar(ah);
6947 ath12k_mac_flush(ar);
6951 ath12k_mac_bitrate_mask_num_ht_rates(struct ath12k *ar,
6952 enum nl80211_band band,
6953 const struct cfg80211_bitrate_mask *mask)
6958 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++)
6959 num_rates += hweight16(mask->control[band].ht_mcs[i]);
6965 ath12k_mac_has_single_legacy_rate(struct ath12k *ar,
6966 enum nl80211_band band,
6967 const struct cfg80211_bitrate_mask *mask)
6971 num_rates = hweight32(mask->control[band].legacy);
6973 if (ath12k_mac_bitrate_mask_num_ht_rates(ar, band, mask))
6976 if (ath12k_mac_bitrate_mask_num_vht_rates(ar, band, mask))
6979 return num_rates == 1;
6983 ath12k_mac_bitrate_mask_get_single_nss(struct ath12k *ar,
6984 enum nl80211_band band,
6985 const struct cfg80211_bitrate_mask *mask,
6988 struct ieee80211_supported_band *sband = &ar->mac.sbands[band];
6989 u16 vht_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
6991 u8 vht_nss_mask = 0;
6994 /* No need to consider legacy here. Basic rates are always present
6998 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) {
6999 if (mask->control[band].ht_mcs[i] == 0)
7001 else if (mask->control[band].ht_mcs[i] ==
7002 sband->ht_cap.mcs.rx_mask[i])
7003 ht_nss_mask |= BIT(i);
7008 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
7009 if (mask->control[band].vht_mcs[i] == 0)
7011 else if (mask->control[band].vht_mcs[i] ==
7012 ath12k_mac_get_max_vht_mcs_map(vht_mcs_map, i))
7013 vht_nss_mask |= BIT(i);
7018 if (ht_nss_mask != vht_nss_mask)
7021 if (ht_nss_mask == 0)
7024 if (BIT(fls(ht_nss_mask)) - 1 != ht_nss_mask)
7027 *nss = fls(ht_nss_mask);
7033 ath12k_mac_get_single_legacy_rate(struct ath12k *ar,
7034 enum nl80211_band band,
7035 const struct cfg80211_bitrate_mask *mask,
7043 if (hweight32(mask->control[band].legacy) != 1)
7046 rate_idx = ffs(mask->control[band].legacy) - 1;
7048 if (band == NL80211_BAND_5GHZ || band == NL80211_BAND_6GHZ)
7049 rate_idx += ATH12K_MAC_FIRST_OFDM_RATE_IDX;
7051 hw_rate = ath12k_legacy_rates[rate_idx].hw_value;
7052 bitrate = ath12k_legacy_rates[rate_idx].bitrate;
7054 if (ath12k_mac_bitrate_is_cck(bitrate))
7055 preamble = WMI_RATE_PREAMBLE_CCK;
7057 preamble = WMI_RATE_PREAMBLE_OFDM;
7060 *rate = ATH12K_HW_RATE_CODE(hw_rate, 0, preamble);
7065 static int ath12k_mac_set_fixed_rate_params(struct ath12k_vif *arvif,
7066 u32 rate, u8 nss, u8 sgi, u8 ldpc)
7068 struct ath12k *ar = arvif->ar;
7072 lockdep_assert_held(&ar->conf_mutex);
7074 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac set fixed rate params vdev %i rate 0x%02x nss %u sgi %u\n",
7075 arvif->vdev_id, rate, nss, sgi);
7077 vdev_param = WMI_VDEV_PARAM_FIXED_RATE;
7078 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
7081 ath12k_warn(ar->ab, "failed to set fixed rate param 0x%02x: %d\n",
7086 vdev_param = WMI_VDEV_PARAM_NSS;
7087 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
7090 ath12k_warn(ar->ab, "failed to set nss param %d: %d\n",
7095 vdev_param = WMI_VDEV_PARAM_SGI;
7096 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
7099 ath12k_warn(ar->ab, "failed to set sgi param %d: %d\n",
7104 vdev_param = WMI_VDEV_PARAM_LDPC;
7105 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
7108 ath12k_warn(ar->ab, "failed to set ldpc param %d: %d\n",
7117 ath12k_mac_vht_mcs_range_present(struct ath12k *ar,
7118 enum nl80211_band band,
7119 const struct cfg80211_bitrate_mask *mask)
7124 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
7125 vht_mcs = mask->control[band].vht_mcs[i];
7141 static void ath12k_mac_set_bitrate_mask_iter(void *data,
7142 struct ieee80211_sta *sta)
7144 struct ath12k_vif *arvif = data;
7145 struct ath12k_sta *arsta = ath12k_sta_to_arsta(sta);
7146 struct ath12k *ar = arvif->ar;
7148 spin_lock_bh(&ar->data_lock);
7149 arsta->changed |= IEEE80211_RC_SUPP_RATES_CHANGED;
7150 spin_unlock_bh(&ar->data_lock);
7152 ieee80211_queue_work(ath12k_ar_to_hw(ar), &arsta->update_wk);
7155 static void ath12k_mac_disable_peer_fixed_rate(void *data,
7156 struct ieee80211_sta *sta)
7158 struct ath12k_vif *arvif = data;
7159 struct ath12k *ar = arvif->ar;
7162 ret = ath12k_wmi_set_peer_param(ar, sta->addr,
7164 WMI_PEER_PARAM_FIXED_RATE,
7165 WMI_FIXED_RATE_NONE);
7168 "failed to disable peer fixed rate for STA %pM ret %d\n",
7173 ath12k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw,
7174 struct ieee80211_vif *vif,
7175 const struct cfg80211_bitrate_mask *mask)
7177 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
7178 struct cfg80211_chan_def def;
7179 struct ath12k *ar = arvif->ar;
7180 enum nl80211_band band;
7181 const u8 *ht_mcs_mask;
7182 const u16 *vht_mcs_mask;
7191 if (ath12k_mac_vif_chan(vif, &def))
7194 band = def.chan->band;
7195 ht_mcs_mask = mask->control[band].ht_mcs;
7196 vht_mcs_mask = mask->control[band].vht_mcs;
7197 ldpc = !!(ar->ht_cap_info & WMI_HT_CAP_LDPC);
7199 sgi = mask->control[band].gi;
7200 if (sgi == NL80211_TXRATE_FORCE_LGI) {
7205 /* mac80211 doesn't support sending a fixed HT/VHT MCS alone, rather it
7206 * requires passing at least one of used basic rates along with them.
7207 * Fixed rate setting across different preambles(legacy, HT, VHT) is
7208 * not supported by the FW. Hence use of FIXED_RATE vdev param is not
7209 * suitable for setting single HT/VHT rates.
7210 * But, there could be a single basic rate passed from userspace which
7211 * can be done through the FIXED_RATE param.
7213 if (ath12k_mac_has_single_legacy_rate(ar, band, mask)) {
7214 ret = ath12k_mac_get_single_legacy_rate(ar, band, mask, &rate,
7217 ath12k_warn(ar->ab, "failed to get single legacy rate for vdev %i: %d\n",
7218 arvif->vdev_id, ret);
7221 ieee80211_iterate_stations_atomic(hw,
7222 ath12k_mac_disable_peer_fixed_rate,
7224 } else if (ath12k_mac_bitrate_mask_get_single_nss(ar, band, mask,
7226 rate = WMI_FIXED_RATE_NONE;
7229 rate = WMI_FIXED_RATE_NONE;
7230 nss = min_t(u32, ar->num_tx_chains,
7231 max(ath12k_mac_max_ht_nss(ht_mcs_mask),
7232 ath12k_mac_max_vht_nss(vht_mcs_mask)));
7234 /* If multiple rates across different preambles are given
7235 * we can reconfigure this info with all peers using PEER_ASSOC
7236 * command with the below exception cases.
7237 * - Single VHT Rate : peer_assoc command accommodates only MCS
7238 * range values i.e 0-7, 0-8, 0-9 for VHT. Though mac80211
7239 * mandates passing basic rates along with HT/VHT rates, FW
7240 * doesn't allow switching from VHT to Legacy. Hence instead of
7241 * setting legacy and VHT rates using RATEMASK_CMD vdev cmd,
7242 * we could set this VHT rate as peer fixed rate param, which
7243 * will override FIXED rate and FW rate control algorithm.
7244 * If single VHT rate is passed along with HT rates, we select
7245 * the VHT rate as fixed rate for vht peers.
7246 * - Multiple VHT Rates : When Multiple VHT rates are given,this
7247 * can be set using RATEMASK CMD which uses FW rate-ctl alg.
7248 * TODO: Setting multiple VHT MCS and replacing peer_assoc with
7249 * RATEMASK_CMDID can cover all use cases of setting rates
7250 * across multiple preambles and rates within same type.
7251 * But requires more validation of the command at this point.
7254 num_rates = ath12k_mac_bitrate_mask_num_vht_rates(ar, band,
7257 if (!ath12k_mac_vht_mcs_range_present(ar, band, mask) &&
7259 /* TODO: Handle multiple VHT MCS values setting using
7263 "Setting more than one MCS Value in bitrate mask not supported\n");
7268 ieee80211_iterate_stations_atomic(hw,
7269 ath12k_mac_disable_peer_fixed_rate,
7272 mutex_lock(&ar->conf_mutex);
7274 arvif->bitrate_mask = *mask;
7275 ieee80211_iterate_stations_atomic(hw,
7276 ath12k_mac_set_bitrate_mask_iter,
7279 mutex_unlock(&ar->conf_mutex);
7282 mutex_lock(&ar->conf_mutex);
7284 ret = ath12k_mac_set_fixed_rate_params(arvif, rate, nss, sgi, ldpc);
7286 ath12k_warn(ar->ab, "failed to set fixed rate params on vdev %i: %d\n",
7287 arvif->vdev_id, ret);
7290 mutex_unlock(&ar->conf_mutex);
7297 ath12k_mac_op_reconfig_complete(struct ieee80211_hw *hw,
7298 enum ieee80211_reconfig_type reconfig_type)
7300 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
7302 struct ath12k_base *ab;
7303 struct ath12k_vif *arvif;
7306 if (reconfig_type != IEEE80211_RECONFIG_TYPE_RESTART)
7309 ar = ath12k_ah_to_ar(ah);
7312 mutex_lock(&ar->conf_mutex);
7314 if (ar->state == ATH12K_STATE_RESTARTED) {
7315 ath12k_warn(ar->ab, "pdev %d successfully recovered\n",
7317 ar->state = ATH12K_STATE_ON;
7318 ieee80211_wake_queues(hw);
7321 recovery_count = atomic_inc_return(&ab->recovery_count);
7322 ath12k_dbg(ab, ATH12K_DBG_BOOT, "recovery count %d\n",
7324 /* When there are multiple radios in an SOC,
7325 * the recovery has to be done for each radio
7327 if (recovery_count == ab->num_radios) {
7328 atomic_dec(&ab->reset_count);
7329 complete(&ab->reset_complete);
7330 ab->is_reset = false;
7331 atomic_set(&ab->fail_cont_count, 0);
7332 ath12k_dbg(ab, ATH12K_DBG_BOOT, "reset success\n");
7336 list_for_each_entry(arvif, &ar->arvifs, list) {
7337 ath12k_dbg(ab, ATH12K_DBG_BOOT,
7338 "reconfig cipher %d up %d vdev type %d\n",
7342 /* After trigger disconnect, then upper layer will
7343 * trigger connect again, then the PN number of
7344 * upper layer will be reset to keep up with AP
7345 * side, hence PN number mismatch will not happen.
7348 arvif->vdev_type == WMI_VDEV_TYPE_STA &&
7349 arvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE) {
7350 ieee80211_hw_restart_disconnect(arvif->vif);
7351 ath12k_dbg(ab, ATH12K_DBG_BOOT,
7352 "restart disconnect\n");
7357 mutex_unlock(&ar->conf_mutex);
7361 ath12k_mac_update_bss_chan_survey(struct ath12k *ar,
7362 struct ieee80211_channel *channel)
7365 enum wmi_bss_chan_info_req_type type = WMI_BSS_SURVEY_REQ_TYPE_READ;
7367 lockdep_assert_held(&ar->conf_mutex);
7369 if (!test_bit(WMI_TLV_SERVICE_BSS_CHANNEL_INFO_64, ar->ab->wmi_ab.svc_map) ||
7370 ar->rx_channel != channel)
7373 if (ar->scan.state != ATH12K_SCAN_IDLE) {
7374 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
7375 "ignoring bss chan info req while scanning..\n");
7379 reinit_completion(&ar->bss_survey_done);
7381 ret = ath12k_wmi_pdev_bss_chan_info_request(ar, type);
7383 ath12k_warn(ar->ab, "failed to send pdev bss chan info request\n");
7387 ret = wait_for_completion_timeout(&ar->bss_survey_done, 3 * HZ);
7389 ath12k_warn(ar->ab, "bss channel survey timed out\n");
7392 static int ath12k_mac_op_get_survey(struct ieee80211_hw *hw, int idx,
7393 struct survey_info *survey)
7395 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
7397 struct ieee80211_supported_band *sband;
7398 struct survey_info *ar_survey;
7401 if (idx >= ATH12K_NUM_CHANS)
7404 ar = ath12k_ah_to_ar(ah);
7406 ar_survey = &ar->survey[idx];
7408 mutex_lock(&ar->conf_mutex);
7410 sband = hw->wiphy->bands[NL80211_BAND_2GHZ];
7411 if (sband && idx >= sband->n_channels) {
7412 idx -= sband->n_channels;
7417 sband = hw->wiphy->bands[NL80211_BAND_5GHZ];
7419 if (!sband || idx >= sband->n_channels) {
7424 ath12k_mac_update_bss_chan_survey(ar, &sband->channels[idx]);
7426 spin_lock_bh(&ar->data_lock);
7427 memcpy(survey, ar_survey, sizeof(*survey));
7428 spin_unlock_bh(&ar->data_lock);
7430 survey->channel = &sband->channels[idx];
7432 if (ar->rx_channel == survey->channel)
7433 survey->filled |= SURVEY_INFO_IN_USE;
7436 mutex_unlock(&ar->conf_mutex);
7441 static void ath12k_mac_op_sta_statistics(struct ieee80211_hw *hw,
7442 struct ieee80211_vif *vif,
7443 struct ieee80211_sta *sta,
7444 struct station_info *sinfo)
7446 struct ath12k_sta *arsta = ath12k_sta_to_arsta(sta);
7448 sinfo->rx_duration = arsta->rx_duration;
7449 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_DURATION);
7451 sinfo->tx_duration = arsta->tx_duration;
7452 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_DURATION);
7454 if (!arsta->txrate.legacy && !arsta->txrate.nss)
7457 if (arsta->txrate.legacy) {
7458 sinfo->txrate.legacy = arsta->txrate.legacy;
7460 sinfo->txrate.mcs = arsta->txrate.mcs;
7461 sinfo->txrate.nss = arsta->txrate.nss;
7462 sinfo->txrate.bw = arsta->txrate.bw;
7463 sinfo->txrate.he_gi = arsta->txrate.he_gi;
7464 sinfo->txrate.he_dcm = arsta->txrate.he_dcm;
7465 sinfo->txrate.he_ru_alloc = arsta->txrate.he_ru_alloc;
7467 sinfo->txrate.flags = arsta->txrate.flags;
7468 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
7470 /* TODO: Use real NF instead of default one. */
7471 sinfo->signal = arsta->rssi_comb + ATH12K_DEFAULT_NOISE_FLOOR;
7472 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL);
7475 static int ath12k_mac_op_cancel_remain_on_channel(struct ieee80211_hw *hw,
7476 struct ieee80211_vif *vif)
7478 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
7481 ar = ath12k_ah_to_ar(ah);
7483 mutex_lock(&ar->conf_mutex);
7485 spin_lock_bh(&ar->data_lock);
7486 ar->scan.roc_notify = false;
7487 spin_unlock_bh(&ar->data_lock);
7489 ath12k_scan_abort(ar);
7491 mutex_unlock(&ar->conf_mutex);
7493 cancel_delayed_work_sync(&ar->scan.timeout);
7498 static int ath12k_mac_op_remain_on_channel(struct ieee80211_hw *hw,
7499 struct ieee80211_vif *vif,
7500 struct ieee80211_channel *chan,
7502 enum ieee80211_roc_type type)
7504 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
7505 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
7506 struct ath12k_wmi_scan_req_arg arg;
7511 ar = ath12k_ah_to_ar(ah);
7513 mutex_lock(&ar->conf_mutex);
7514 spin_lock_bh(&ar->data_lock);
7516 switch (ar->scan.state) {
7517 case ATH12K_SCAN_IDLE:
7518 reinit_completion(&ar->scan.started);
7519 reinit_completion(&ar->scan.completed);
7520 reinit_completion(&ar->scan.on_channel);
7521 ar->scan.state = ATH12K_SCAN_STARTING;
7522 ar->scan.is_roc = true;
7523 ar->scan.vdev_id = arvif->vdev_id;
7524 ar->scan.roc_freq = chan->center_freq;
7525 ar->scan.roc_notify = true;
7528 case ATH12K_SCAN_STARTING:
7529 case ATH12K_SCAN_RUNNING:
7530 case ATH12K_SCAN_ABORTING:
7535 spin_unlock_bh(&ar->data_lock);
7540 scan_time_msec = hw->wiphy->max_remain_on_channel_duration * 2;
7542 memset(&arg, 0, sizeof(arg));
7543 ath12k_wmi_start_scan_init(ar, &arg);
7545 arg.chan_list = kcalloc(arg.num_chan, sizeof(*arg.chan_list),
7547 if (!arg.chan_list) {
7552 arg.vdev_id = arvif->vdev_id;
7553 arg.scan_id = ATH12K_SCAN_ID;
7554 arg.chan_list[0] = chan->center_freq;
7555 arg.dwell_time_active = scan_time_msec;
7556 arg.dwell_time_passive = scan_time_msec;
7557 arg.max_scan_time = scan_time_msec;
7558 arg.scan_f_passive = 1;
7559 arg.burst_duration = duration;
7561 ret = ath12k_start_scan(ar, &arg);
7563 ath12k_warn(ar->ab, "failed to start roc scan: %d\n", ret);
7565 spin_lock_bh(&ar->data_lock);
7566 ar->scan.state = ATH12K_SCAN_IDLE;
7567 spin_unlock_bh(&ar->data_lock);
7568 goto free_chan_list;
7571 ret = wait_for_completion_timeout(&ar->scan.on_channel, 3 * HZ);
7573 ath12k_warn(ar->ab, "failed to switch to channel for roc scan\n");
7574 ret = ath12k_scan_stop(ar);
7576 ath12k_warn(ar->ab, "failed to stop scan: %d\n", ret);
7578 goto free_chan_list;
7581 ieee80211_queue_delayed_work(hw, &ar->scan.timeout,
7582 msecs_to_jiffies(duration));
7587 kfree(arg.chan_list);
7589 mutex_unlock(&ar->conf_mutex);
7594 static const struct ieee80211_ops ath12k_ops = {
7595 .tx = ath12k_mac_op_tx,
7596 .wake_tx_queue = ieee80211_handle_wake_tx_queue,
7597 .start = ath12k_mac_op_start,
7598 .stop = ath12k_mac_op_stop,
7599 .reconfig_complete = ath12k_mac_op_reconfig_complete,
7600 .add_interface = ath12k_mac_op_add_interface,
7601 .remove_interface = ath12k_mac_op_remove_interface,
7602 .update_vif_offload = ath12k_mac_op_update_vif_offload,
7603 .config = ath12k_mac_op_config,
7604 .bss_info_changed = ath12k_mac_op_bss_info_changed,
7605 .configure_filter = ath12k_mac_op_configure_filter,
7606 .hw_scan = ath12k_mac_op_hw_scan,
7607 .cancel_hw_scan = ath12k_mac_op_cancel_hw_scan,
7608 .set_key = ath12k_mac_op_set_key,
7609 .sta_state = ath12k_mac_op_sta_state,
7610 .sta_set_txpwr = ath12k_mac_op_sta_set_txpwr,
7611 .sta_rc_update = ath12k_mac_op_sta_rc_update,
7612 .conf_tx = ath12k_mac_op_conf_tx,
7613 .set_antenna = ath12k_mac_op_set_antenna,
7614 .get_antenna = ath12k_mac_op_get_antenna,
7615 .ampdu_action = ath12k_mac_op_ampdu_action,
7616 .add_chanctx = ath12k_mac_op_add_chanctx,
7617 .remove_chanctx = ath12k_mac_op_remove_chanctx,
7618 .change_chanctx = ath12k_mac_op_change_chanctx,
7619 .assign_vif_chanctx = ath12k_mac_op_assign_vif_chanctx,
7620 .unassign_vif_chanctx = ath12k_mac_op_unassign_vif_chanctx,
7621 .switch_vif_chanctx = ath12k_mac_op_switch_vif_chanctx,
7622 .set_rts_threshold = ath12k_mac_op_set_rts_threshold,
7623 .set_frag_threshold = ath12k_mac_op_set_frag_threshold,
7624 .set_bitrate_mask = ath12k_mac_op_set_bitrate_mask,
7625 .get_survey = ath12k_mac_op_get_survey,
7626 .flush = ath12k_mac_op_flush,
7627 .sta_statistics = ath12k_mac_op_sta_statistics,
7628 .remain_on_channel = ath12k_mac_op_remain_on_channel,
7629 .cancel_remain_on_channel = ath12k_mac_op_cancel_remain_on_channel,
7632 static void ath12k_mac_update_ch_list(struct ath12k *ar,
7633 struct ieee80211_supported_band *band,
7634 u32 freq_low, u32 freq_high)
7638 if (!(freq_low && freq_high))
7641 for (i = 0; i < band->n_channels; i++) {
7642 if (band->channels[i].center_freq < freq_low ||
7643 band->channels[i].center_freq > freq_high)
7644 band->channels[i].flags |= IEEE80211_CHAN_DISABLED;
7648 static u32 ath12k_get_phy_id(struct ath12k *ar, u32 band)
7650 struct ath12k_pdev *pdev = ar->pdev;
7651 struct ath12k_pdev_cap *pdev_cap = &pdev->cap;
7653 if (band == WMI_HOST_WLAN_2G_CAP)
7654 return pdev_cap->band[NL80211_BAND_2GHZ].phy_id;
7656 if (band == WMI_HOST_WLAN_5G_CAP)
7657 return pdev_cap->band[NL80211_BAND_5GHZ].phy_id;
7659 ath12k_warn(ar->ab, "unsupported phy cap:%d\n", band);
7664 static int ath12k_mac_setup_channels_rates(struct ath12k *ar,
7665 u32 supported_bands,
7666 struct ieee80211_supported_band *bands[])
7668 struct ieee80211_supported_band *band;
7669 struct ath12k_wmi_hal_reg_capabilities_ext_arg *reg_cap;
7673 BUILD_BUG_ON((ARRAY_SIZE(ath12k_2ghz_channels) +
7674 ARRAY_SIZE(ath12k_5ghz_channels) +
7675 ARRAY_SIZE(ath12k_6ghz_channels)) !=
7678 reg_cap = &ar->ab->hal_reg_cap[ar->pdev_idx];
7680 if (supported_bands & WMI_HOST_WLAN_2G_CAP) {
7681 channels = kmemdup(ath12k_2ghz_channels,
7682 sizeof(ath12k_2ghz_channels),
7687 band = &ar->mac.sbands[NL80211_BAND_2GHZ];
7688 band->band = NL80211_BAND_2GHZ;
7689 band->n_channels = ARRAY_SIZE(ath12k_2ghz_channels);
7690 band->channels = channels;
7691 band->n_bitrates = ath12k_g_rates_size;
7692 band->bitrates = ath12k_g_rates;
7693 bands[NL80211_BAND_2GHZ] = band;
7695 if (ar->ab->hw_params->single_pdev_only) {
7696 phy_id = ath12k_get_phy_id(ar, WMI_HOST_WLAN_2G_CAP);
7697 reg_cap = &ar->ab->hal_reg_cap[phy_id];
7699 ath12k_mac_update_ch_list(ar, band,
7700 reg_cap->low_2ghz_chan,
7701 reg_cap->high_2ghz_chan);
7704 if (supported_bands & WMI_HOST_WLAN_5G_CAP) {
7705 if (reg_cap->high_5ghz_chan >= ATH12K_MIN_6G_FREQ) {
7706 channels = kmemdup(ath12k_6ghz_channels,
7707 sizeof(ath12k_6ghz_channels), GFP_KERNEL);
7709 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
7713 ar->supports_6ghz = true;
7714 band = &ar->mac.sbands[NL80211_BAND_6GHZ];
7715 band->band = NL80211_BAND_6GHZ;
7716 band->n_channels = ARRAY_SIZE(ath12k_6ghz_channels);
7717 band->channels = channels;
7718 band->n_bitrates = ath12k_a_rates_size;
7719 band->bitrates = ath12k_a_rates;
7720 bands[NL80211_BAND_6GHZ] = band;
7721 ath12k_mac_update_ch_list(ar, band,
7722 reg_cap->low_5ghz_chan,
7723 reg_cap->high_5ghz_chan);
7726 if (reg_cap->low_5ghz_chan < ATH12K_MIN_6G_FREQ) {
7727 channels = kmemdup(ath12k_5ghz_channels,
7728 sizeof(ath12k_5ghz_channels),
7731 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
7732 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
7736 band = &ar->mac.sbands[NL80211_BAND_5GHZ];
7737 band->band = NL80211_BAND_5GHZ;
7738 band->n_channels = ARRAY_SIZE(ath12k_5ghz_channels);
7739 band->channels = channels;
7740 band->n_bitrates = ath12k_a_rates_size;
7741 band->bitrates = ath12k_a_rates;
7742 bands[NL80211_BAND_5GHZ] = band;
7744 if (ar->ab->hw_params->single_pdev_only) {
7745 phy_id = ath12k_get_phy_id(ar, WMI_HOST_WLAN_5G_CAP);
7746 reg_cap = &ar->ab->hal_reg_cap[phy_id];
7749 ath12k_mac_update_ch_list(ar, band,
7750 reg_cap->low_5ghz_chan,
7751 reg_cap->high_5ghz_chan);
7758 static u16 ath12k_mac_get_ifmodes(struct ath12k_hw *ah)
7760 struct ath12k *ar = ath12k_ah_to_ar(ah);
7761 u16 interface_modes = U16_MAX;
7763 interface_modes &= ar->ab->hw_params->interface_modes;
7765 return interface_modes == U16_MAX ? 0 : interface_modes;
7768 static bool ath12k_mac_is_iface_mode_enable(struct ath12k_hw *ah,
7769 enum nl80211_iftype type)
7771 struct ath12k *ar = ath12k_ah_to_ar(ah);
7772 u16 interface_modes, mode;
7773 bool is_enable = true;
7777 interface_modes = ar->ab->hw_params->interface_modes;
7778 if (!(interface_modes & mode))
7784 static int ath12k_mac_setup_iface_combinations(struct ath12k_hw *ah)
7786 struct wiphy *wiphy = ah->hw->wiphy;
7787 struct ieee80211_iface_combination *combinations;
7788 struct ieee80211_iface_limit *limits;
7789 int n_limits, max_interfaces;
7792 ap = ath12k_mac_is_iface_mode_enable(ah, NL80211_IFTYPE_AP);
7793 p2p = ath12k_mac_is_iface_mode_enable(ah, NL80211_IFTYPE_P2P_DEVICE);
7795 mesh = IS_ENABLED(CONFIG_MAC80211_MESH) &&
7796 ath12k_mac_is_iface_mode_enable(ah, NL80211_IFTYPE_MESH_POINT);
7798 combinations = kzalloc(sizeof(*combinations), GFP_KERNEL);
7802 if ((ap || mesh) && !p2p) {
7804 max_interfaces = 16;
7808 max_interfaces = 16;
7816 limits = kcalloc(n_limits, sizeof(*limits), GFP_KERNEL);
7818 kfree(combinations);
7823 limits[0].types |= BIT(NL80211_IFTYPE_STATION);
7825 if (ap || mesh || p2p)
7826 limits[1].max = max_interfaces;
7829 limits[1].types |= BIT(NL80211_IFTYPE_AP);
7832 limits[1].types |= BIT(NL80211_IFTYPE_MESH_POINT);
7835 limits[1].types |= BIT(NL80211_IFTYPE_P2P_CLIENT) |
7836 BIT(NL80211_IFTYPE_P2P_GO);
7838 limits[2].types |= BIT(NL80211_IFTYPE_P2P_DEVICE);
7841 combinations[0].limits = limits;
7842 combinations[0].n_limits = n_limits;
7843 combinations[0].max_interfaces = max_interfaces;
7844 combinations[0].num_different_channels = 1;
7845 combinations[0].beacon_int_infra_match = true;
7846 combinations[0].beacon_int_min_gcd = 100;
7847 combinations[0].radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
7848 BIT(NL80211_CHAN_WIDTH_20) |
7849 BIT(NL80211_CHAN_WIDTH_40) |
7850 BIT(NL80211_CHAN_WIDTH_80);
7852 wiphy->iface_combinations = combinations;
7853 wiphy->n_iface_combinations = 1;
7858 static const u8 ath12k_if_types_ext_capa[] = {
7859 [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
7860 [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
7863 static const u8 ath12k_if_types_ext_capa_sta[] = {
7864 [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
7865 [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
7866 [9] = WLAN_EXT_CAPA10_TWT_REQUESTER_SUPPORT,
7869 static const u8 ath12k_if_types_ext_capa_ap[] = {
7870 [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
7871 [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
7872 [9] = WLAN_EXT_CAPA10_TWT_RESPONDER_SUPPORT,
7875 static const struct wiphy_iftype_ext_capab ath12k_iftypes_ext_capa[] = {
7877 .extended_capabilities = ath12k_if_types_ext_capa,
7878 .extended_capabilities_mask = ath12k_if_types_ext_capa,
7879 .extended_capabilities_len = sizeof(ath12k_if_types_ext_capa),
7881 .iftype = NL80211_IFTYPE_STATION,
7882 .extended_capabilities = ath12k_if_types_ext_capa_sta,
7883 .extended_capabilities_mask = ath12k_if_types_ext_capa_sta,
7884 .extended_capabilities_len =
7885 sizeof(ath12k_if_types_ext_capa_sta),
7887 .iftype = NL80211_IFTYPE_AP,
7888 .extended_capabilities = ath12k_if_types_ext_capa_ap,
7889 .extended_capabilities_mask = ath12k_if_types_ext_capa_ap,
7890 .extended_capabilities_len =
7891 sizeof(ath12k_if_types_ext_capa_ap),
7895 static void ath12k_mac_cleanup_unregister(struct ath12k *ar)
7897 idr_for_each(&ar->txmgmt_idr, ath12k_mac_tx_mgmt_pending_free, ar);
7898 idr_destroy(&ar->txmgmt_idr);
7900 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
7901 kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels);
7902 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
7905 static void ath12k_mac_hw_unregister(struct ath12k_hw *ah)
7907 struct ieee80211_hw *hw = ah->hw;
7908 struct wiphy *wiphy = hw->wiphy;
7909 struct ath12k *ar = ath12k_ah_to_ar(ah);
7911 cancel_work_sync(&ar->regd_update_work);
7913 ieee80211_unregister_hw(hw);
7915 ath12k_mac_cleanup_unregister(ar);
7917 kfree(wiphy->iface_combinations[0].limits);
7918 kfree(wiphy->iface_combinations);
7920 SET_IEEE80211_DEV(hw, NULL);
7923 static int ath12k_mac_setup_register(struct ath12k *ar,
7925 struct ieee80211_supported_band *bands[])
7927 struct ath12k_pdev_cap *cap = &ar->pdev->cap;
7930 init_waitqueue_head(&ar->txmgmt_empty_waitq);
7931 idr_init(&ar->txmgmt_idr);
7932 spin_lock_init(&ar->txmgmt_idr_lock);
7934 ath12k_pdev_caps_update(ar);
7936 ret = ath12k_mac_setup_channels_rates(ar,
7937 cap->supported_bands,
7942 ath12k_mac_setup_ht_vht_cap(ar, cap, ht_cap);
7943 ath12k_mac_setup_sband_iftype_data(ar, cap);
7945 ar->max_num_stations = ath12k_core_get_max_station_per_radio(ar->ab);
7946 ar->max_num_peers = ath12k_core_get_max_peers_per_radio(ar->ab);
7951 static int ath12k_mac_hw_register(struct ath12k_hw *ah)
7953 struct ieee80211_hw *hw = ah->hw;
7954 struct wiphy *wiphy = hw->wiphy;
7955 struct ath12k *ar = ath12k_ah_to_ar(ah);
7956 struct ath12k_base *ab = ar->ab;
7957 struct ath12k_pdev *pdev;
7958 struct ath12k_pdev_cap *cap;
7959 static const u32 cipher_suites[] = {
7960 WLAN_CIPHER_SUITE_TKIP,
7961 WLAN_CIPHER_SUITE_CCMP,
7962 WLAN_CIPHER_SUITE_AES_CMAC,
7963 WLAN_CIPHER_SUITE_BIP_CMAC_256,
7964 WLAN_CIPHER_SUITE_BIP_GMAC_128,
7965 WLAN_CIPHER_SUITE_BIP_GMAC_256,
7966 WLAN_CIPHER_SUITE_GCMP,
7967 WLAN_CIPHER_SUITE_GCMP_256,
7968 WLAN_CIPHER_SUITE_CCMP_256,
7975 if (ab->pdevs_macaddr_valid)
7976 ether_addr_copy(ar->mac_addr, pdev->mac_addr);
7978 ether_addr_copy(ar->mac_addr, ab->mac_addr);
7980 ret = ath12k_mac_setup_register(ar, &ht_cap, hw->wiphy->bands);
7984 wiphy->max_ap_assoc_sta = ar->max_num_stations;
7988 wiphy->available_antennas_rx = cap->rx_chain_mask;
7989 wiphy->available_antennas_tx = cap->tx_chain_mask;
7991 SET_IEEE80211_PERM_ADDR(hw, ar->mac_addr);
7992 SET_IEEE80211_DEV(hw, ab->dev);
7994 ret = ath12k_mac_setup_iface_combinations(ah);
7996 ath12k_err(ab, "failed to setup interface combinations: %d\n", ret);
7997 goto err_cleanup_unregister;
8000 wiphy->interface_modes = ath12k_mac_get_ifmodes(ah);
8002 if (wiphy->bands[NL80211_BAND_2GHZ] &&
8003 wiphy->bands[NL80211_BAND_5GHZ] &&
8004 wiphy->bands[NL80211_BAND_6GHZ])
8005 ieee80211_hw_set(hw, SINGLE_SCAN_ON_ALL_BANDS);
8007 ieee80211_hw_set(hw, SIGNAL_DBM);
8008 ieee80211_hw_set(hw, SUPPORTS_PS);
8009 ieee80211_hw_set(hw, SUPPORTS_DYNAMIC_PS);
8010 ieee80211_hw_set(hw, MFP_CAPABLE);
8011 ieee80211_hw_set(hw, REPORTS_TX_ACK_STATUS);
8012 ieee80211_hw_set(hw, HAS_RATE_CONTROL);
8013 ieee80211_hw_set(hw, AP_LINK_PS);
8014 ieee80211_hw_set(hw, SPECTRUM_MGMT);
8015 ieee80211_hw_set(hw, CONNECTION_MONITOR);
8016 ieee80211_hw_set(hw, SUPPORTS_PER_STA_GTK);
8017 ieee80211_hw_set(hw, CHANCTX_STA_CSA);
8018 ieee80211_hw_set(hw, QUEUE_CONTROL);
8019 ieee80211_hw_set(hw, SUPPORTS_TX_FRAG);
8020 ieee80211_hw_set(hw, REPORTS_LOW_ACK);
8022 if (ht_cap & WMI_HT_CAP_ENABLED) {
8023 ieee80211_hw_set(hw, AMPDU_AGGREGATION);
8024 ieee80211_hw_set(hw, TX_AMPDU_SETUP_IN_HW);
8025 ieee80211_hw_set(hw, SUPPORTS_REORDERING_BUFFER);
8026 ieee80211_hw_set(hw, SUPPORTS_AMSDU_IN_AMPDU);
8027 ieee80211_hw_set(hw, USES_RSS);
8030 wiphy->features |= NL80211_FEATURE_STATIC_SMPS;
8031 wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
8033 /* TODO: Check if HT capability advertised from firmware is different
8034 * for each band for a dual band capable radio. It will be tricky to
8035 * handle it when the ht capability different for each band.
8037 if (ht_cap & WMI_HT_CAP_DYNAMIC_SMPS)
8038 wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS;
8040 wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID;
8041 wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN;
8043 hw->max_listen_interval = ATH12K_MAX_HW_LISTEN_INTERVAL;
8045 wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
8046 wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
8047 wiphy->max_remain_on_channel_duration = 5000;
8049 wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
8050 wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE |
8051 NL80211_FEATURE_AP_SCAN;
8053 hw->queues = ATH12K_HW_MAX_QUEUES;
8054 wiphy->tx_queue_len = ATH12K_QUEUE_LEN;
8055 hw->offchannel_tx_hw_queue = ATH12K_HW_MAX_QUEUES - 1;
8056 hw->max_rx_aggregation_subframes = IEEE80211_MAX_AMPDU_BUF_EHT;
8058 hw->vif_data_size = sizeof(struct ath12k_vif);
8059 hw->sta_data_size = sizeof(struct ath12k_sta);
8061 wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
8062 wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_STA_TX_PWR);
8064 wiphy->cipher_suites = cipher_suites;
8065 wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
8067 wiphy->iftype_ext_capab = ath12k_iftypes_ext_capa;
8068 wiphy->num_iftype_ext_capab = ARRAY_SIZE(ath12k_iftypes_ext_capa);
8070 if (ar->supports_6ghz) {
8071 wiphy_ext_feature_set(wiphy,
8072 NL80211_EXT_FEATURE_FILS_DISCOVERY);
8073 wiphy_ext_feature_set(wiphy,
8074 NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP);
8077 wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_PUNCT);
8079 ath12k_reg_init(hw);
8081 if (!test_bit(ATH12K_FLAG_RAW_MODE, &ab->dev_flags)) {
8082 hw->netdev_features = NETIF_F_HW_CSUM;
8083 ieee80211_hw_set(hw, SW_CRYPTO_CONTROL);
8084 ieee80211_hw_set(hw, SUPPORT_FAST_XMIT);
8087 ret = ieee80211_register_hw(hw);
8089 ath12k_err(ab, "ieee80211 registration failed: %d\n", ret);
8090 goto err_free_if_combs;
8093 if (!ab->hw_params->supports_monitor)
8094 /* There's a race between calling ieee80211_register_hw()
8095 * and here where the monitor mode is enabled for a little
8096 * while. But that time is so short and in practise it make
8097 * a difference in real life.
8099 wiphy->interface_modes &= ~BIT(NL80211_IFTYPE_MONITOR);
8101 /* Apply the regd received during initialization */
8102 ret = ath12k_regd_update(ar, true);
8104 ath12k_err(ar->ab, "ath12k regd update failed: %d\n", ret);
8105 goto err_unregister_hw;
8111 ieee80211_unregister_hw(hw);
8114 kfree(wiphy->iface_combinations[0].limits);
8115 kfree(wiphy->iface_combinations);
8117 err_cleanup_unregister:
8118 ath12k_mac_cleanup_unregister(ar);
8121 SET_IEEE80211_DEV(hw, NULL);
8126 static void ath12k_mac_setup(struct ath12k *ar)
8128 struct ath12k_base *ab = ar->ab;
8129 struct ath12k_pdev *pdev = ar->pdev;
8130 u8 pdev_idx = ar->pdev_idx;
8132 ar->lmac_id = ath12k_hw_get_mac_from_pdev_id(ab->hw_params, pdev_idx);
8134 ar->wmi = &ab->wmi_ab.wmi[pdev_idx];
8135 /* FIXME: wmi[0] is already initialized during attach,
8136 * Should we do this again?
8138 ath12k_wmi_pdev_attach(ab, pdev_idx);
8140 ar->cfg_tx_chainmask = pdev->cap.tx_chain_mask;
8141 ar->cfg_rx_chainmask = pdev->cap.rx_chain_mask;
8142 ar->num_tx_chains = hweight32(pdev->cap.tx_chain_mask);
8143 ar->num_rx_chains = hweight32(pdev->cap.rx_chain_mask);
8145 spin_lock_init(&ar->data_lock);
8146 INIT_LIST_HEAD(&ar->arvifs);
8147 INIT_LIST_HEAD(&ar->ppdu_stats_info);
8148 mutex_init(&ar->conf_mutex);
8149 init_completion(&ar->vdev_setup_done);
8150 init_completion(&ar->vdev_delete_done);
8151 init_completion(&ar->peer_assoc_done);
8152 init_completion(&ar->peer_delete_done);
8153 init_completion(&ar->install_key_done);
8154 init_completion(&ar->bss_survey_done);
8155 init_completion(&ar->scan.started);
8156 init_completion(&ar->scan.completed);
8157 init_completion(&ar->scan.on_channel);
8159 INIT_DELAYED_WORK(&ar->scan.timeout, ath12k_scan_timeout_work);
8160 INIT_WORK(&ar->regd_update_work, ath12k_regd_update_work);
8162 INIT_WORK(&ar->wmi_mgmt_tx_work, ath12k_mgmt_over_wmi_tx_work);
8163 skb_queue_head_init(&ar->wmi_mgmt_tx_queue);
8164 clear_bit(ATH12K_FLAG_MONITOR_ENABLED, &ar->monitor_flags);
8167 int ath12k_mac_register(struct ath12k_base *ab)
8169 struct ath12k_hw *ah;
8173 if (test_bit(ATH12K_FLAG_REGISTERED, &ab->dev_flags))
8176 /* Initialize channel counters frequency value in hertz */
8177 ab->cc_freq_hz = 320000;
8178 ab->free_vdev_map = (1LL << (ab->num_radios * TARGET_NUM_VDEVS)) - 1;
8180 for (i = 0; i < ab->num_hw; i++) {
8183 ret = ath12k_mac_hw_register(ah);
8191 for (i = i - 1; i >= 0; i--) {
8196 ath12k_mac_hw_unregister(ah);
8202 void ath12k_mac_unregister(struct ath12k_base *ab)
8204 struct ath12k_hw *ah;
8207 for (i = ab->num_hw - 1; i >= 0; i--) {
8212 ath12k_mac_hw_unregister(ah);
8216 static void ath12k_mac_hw_destroy(struct ath12k_hw *ah)
8218 ieee80211_free_hw(ah->hw);
8221 static struct ath12k_hw *ath12k_mac_hw_allocate(struct ath12k_base *ab,
8222 struct ath12k_pdev_map *pdev_map,
8225 struct ieee80211_hw *hw;
8227 struct ath12k_pdev *pdev;
8228 struct ath12k_hw *ah;
8232 hw = ieee80211_alloc_hw(struct_size(ah, radio, num_pdev_map),
8237 ah = ath12k_hw_to_ah(hw);
8239 ah->num_radio = num_pdev_map;
8241 for (i = 0; i < num_pdev_map; i++) {
8242 ab = pdev_map[i].ab;
8243 pdev_idx = pdev_map[i].pdev_idx;
8244 pdev = &ab->pdevs[pdev_idx];
8246 ar = ath12k_ah_to_ar(ah);
8251 ar->pdev_idx = pdev_idx;
8254 ath12k_mac_setup(ar);
8260 void ath12k_mac_destroy(struct ath12k_base *ab)
8262 struct ath12k_pdev *pdev;
8265 for (i = 0; i < ab->num_radios; i++) {
8266 pdev = &ab->pdevs[i];
8273 for (i = 0; i < ab->num_hw; i++) {
8277 ath12k_mac_hw_destroy(ab->ah[i]);
8282 int ath12k_mac_allocate(struct ath12k_base *ab)
8284 struct ath12k_hw *ah;
8285 struct ath12k_pdev_map pdev_map[MAX_RADIOS];
8289 if (test_bit(ATH12K_FLAG_REGISTERED, &ab->dev_flags))
8292 ab->num_hw = ab->num_radios;
8295 for (i = 0; i < ab->num_hw; i++) {
8296 for (j = 0; j < radio_per_hw; j++) {
8297 pdev_map[j].ab = ab;
8298 pdev_map[j].pdev_idx = (i * radio_per_hw) + j;
8301 ah = ath12k_mac_hw_allocate(ab, pdev_map, radio_per_hw);
8303 ath12k_warn(ab, "failed to allocate mac80211 hw device for hw_idx %d\n",
8312 ath12k_dp_pdev_pre_alloc(ab);
8317 for (i = i - 1; i >= 0; i--) {
8321 ath12k_mac_hw_destroy(ab->ah[i]);