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_EHT_PUNCTURING)
2958 arvif->punct_bitmap = info->eht_puncturing;
2960 if (changed & BSS_CHANGED_PS &&
2961 ar->ab->hw_params->supports_sta_ps) {
2962 arvif->ps = vif_cfg->ps;
2963 ath12k_mac_vif_setup_ps(arvif);
2967 static void ath12k_mac_op_bss_info_changed(struct ieee80211_hw *hw,
2968 struct ieee80211_vif *vif,
2969 struct ieee80211_bss_conf *info,
2972 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
2974 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
2976 ar = ath12k_ah_to_ar(ah);
2978 mutex_lock(&ar->conf_mutex);
2980 ath12k_mac_bss_info_changed(ar, arvif, info, changed);
2982 mutex_unlock(&ar->conf_mutex);
2985 void __ath12k_mac_scan_finish(struct ath12k *ar)
2987 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
2989 lockdep_assert_held(&ar->data_lock);
2991 switch (ar->scan.state) {
2992 case ATH12K_SCAN_IDLE:
2994 case ATH12K_SCAN_RUNNING:
2995 case ATH12K_SCAN_ABORTING:
2996 if (ar->scan.is_roc && ar->scan.roc_notify)
2997 ieee80211_remain_on_channel_expired(hw);
2999 case ATH12K_SCAN_STARTING:
3000 if (!ar->scan.is_roc) {
3001 struct cfg80211_scan_info info = {
3002 .aborted = ((ar->scan.state ==
3003 ATH12K_SCAN_ABORTING) ||
3005 ATH12K_SCAN_STARTING)),
3008 ieee80211_scan_completed(hw, &info);
3011 ar->scan.state = ATH12K_SCAN_IDLE;
3012 ar->scan_channel = NULL;
3013 ar->scan.roc_freq = 0;
3014 cancel_delayed_work(&ar->scan.timeout);
3015 complete(&ar->scan.completed);
3020 void ath12k_mac_scan_finish(struct ath12k *ar)
3022 spin_lock_bh(&ar->data_lock);
3023 __ath12k_mac_scan_finish(ar);
3024 spin_unlock_bh(&ar->data_lock);
3027 static int ath12k_scan_stop(struct ath12k *ar)
3029 struct ath12k_wmi_scan_cancel_arg arg = {
3030 .req_type = WLAN_SCAN_CANCEL_SINGLE,
3031 .scan_id = ATH12K_SCAN_ID,
3035 lockdep_assert_held(&ar->conf_mutex);
3037 /* TODO: Fill other STOP Params */
3038 arg.pdev_id = ar->pdev->pdev_id;
3040 ret = ath12k_wmi_send_scan_stop_cmd(ar, &arg);
3042 ath12k_warn(ar->ab, "failed to stop wmi scan: %d\n", ret);
3046 ret = wait_for_completion_timeout(&ar->scan.completed, 3 * HZ);
3049 "failed to receive scan abort comple: timed out\n");
3051 } else if (ret > 0) {
3056 /* Scan state should be updated upon scan completion but in case
3057 * firmware fails to deliver the event (for whatever reason) it is
3058 * desired to clean up scan state anyway. Firmware may have just
3059 * dropped the scan completion event delivery due to transport pipe
3060 * being overflown with data and/or it can recover on its own before
3061 * next scan request is submitted.
3063 spin_lock_bh(&ar->data_lock);
3064 if (ar->scan.state != ATH12K_SCAN_IDLE)
3065 __ath12k_mac_scan_finish(ar);
3066 spin_unlock_bh(&ar->data_lock);
3071 static void ath12k_scan_abort(struct ath12k *ar)
3075 lockdep_assert_held(&ar->conf_mutex);
3077 spin_lock_bh(&ar->data_lock);
3079 switch (ar->scan.state) {
3080 case ATH12K_SCAN_IDLE:
3081 /* This can happen if timeout worker kicked in and called
3082 * abortion while scan completion was being processed.
3085 case ATH12K_SCAN_STARTING:
3086 case ATH12K_SCAN_ABORTING:
3087 ath12k_warn(ar->ab, "refusing scan abortion due to invalid scan state: %d\n",
3090 case ATH12K_SCAN_RUNNING:
3091 ar->scan.state = ATH12K_SCAN_ABORTING;
3092 spin_unlock_bh(&ar->data_lock);
3094 ret = ath12k_scan_stop(ar);
3096 ath12k_warn(ar->ab, "failed to abort scan: %d\n", ret);
3098 spin_lock_bh(&ar->data_lock);
3102 spin_unlock_bh(&ar->data_lock);
3105 static void ath12k_scan_timeout_work(struct work_struct *work)
3107 struct ath12k *ar = container_of(work, struct ath12k,
3110 mutex_lock(&ar->conf_mutex);
3111 ath12k_scan_abort(ar);
3112 mutex_unlock(&ar->conf_mutex);
3115 static int ath12k_start_scan(struct ath12k *ar,
3116 struct ath12k_wmi_scan_req_arg *arg)
3120 lockdep_assert_held(&ar->conf_mutex);
3122 ret = ath12k_wmi_send_scan_start_cmd(ar, arg);
3126 ret = wait_for_completion_timeout(&ar->scan.started, 1 * HZ);
3128 ret = ath12k_scan_stop(ar);
3130 ath12k_warn(ar->ab, "failed to stop scan: %d\n", ret);
3135 /* If we failed to start the scan, return error code at
3136 * this point. This is probably due to some issue in the
3137 * firmware, but no need to wedge the driver due to that...
3139 spin_lock_bh(&ar->data_lock);
3140 if (ar->scan.state == ATH12K_SCAN_IDLE) {
3141 spin_unlock_bh(&ar->data_lock);
3144 spin_unlock_bh(&ar->data_lock);
3149 static int ath12k_mac_op_hw_scan(struct ieee80211_hw *hw,
3150 struct ieee80211_vif *vif,
3151 struct ieee80211_scan_request *hw_req)
3153 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
3155 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
3156 struct cfg80211_scan_request *req = &hw_req->req;
3157 struct ath12k_wmi_scan_req_arg arg = {};
3161 ar = ath12k_ah_to_ar(ah);
3163 mutex_lock(&ar->conf_mutex);
3165 spin_lock_bh(&ar->data_lock);
3166 switch (ar->scan.state) {
3167 case ATH12K_SCAN_IDLE:
3168 reinit_completion(&ar->scan.started);
3169 reinit_completion(&ar->scan.completed);
3170 ar->scan.state = ATH12K_SCAN_STARTING;
3171 ar->scan.is_roc = false;
3172 ar->scan.vdev_id = arvif->vdev_id;
3175 case ATH12K_SCAN_STARTING:
3176 case ATH12K_SCAN_RUNNING:
3177 case ATH12K_SCAN_ABORTING:
3181 spin_unlock_bh(&ar->data_lock);
3186 ath12k_wmi_start_scan_init(ar, &arg);
3187 arg.vdev_id = arvif->vdev_id;
3188 arg.scan_id = ATH12K_SCAN_ID;
3191 arg.extraie.ptr = kmemdup(req->ie, req->ie_len, GFP_KERNEL);
3192 if (!arg.extraie.ptr) {
3196 arg.extraie.len = req->ie_len;
3200 arg.num_ssids = req->n_ssids;
3201 for (i = 0; i < arg.num_ssids; i++)
3202 arg.ssid[i] = req->ssids[i];
3204 arg.scan_flags |= WMI_SCAN_FLAG_PASSIVE;
3207 if (req->n_channels) {
3208 arg.num_chan = req->n_channels;
3209 arg.chan_list = kcalloc(arg.num_chan, sizeof(*arg.chan_list),
3212 if (!arg.chan_list) {
3217 for (i = 0; i < arg.num_chan; i++)
3218 arg.chan_list[i] = req->channels[i]->center_freq;
3221 ret = ath12k_start_scan(ar, &arg);
3223 ath12k_warn(ar->ab, "failed to start hw scan: %d\n", ret);
3224 spin_lock_bh(&ar->data_lock);
3225 ar->scan.state = ATH12K_SCAN_IDLE;
3226 spin_unlock_bh(&ar->data_lock);
3229 /* Add a margin to account for event/command processing */
3230 ieee80211_queue_delayed_work(ath12k_ar_to_hw(ar), &ar->scan.timeout,
3231 msecs_to_jiffies(arg.max_scan_time +
3232 ATH12K_MAC_SCAN_TIMEOUT_MSECS));
3235 kfree(arg.chan_list);
3238 kfree(arg.extraie.ptr);
3240 mutex_unlock(&ar->conf_mutex);
3245 static void ath12k_mac_op_cancel_hw_scan(struct ieee80211_hw *hw,
3246 struct ieee80211_vif *vif)
3248 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
3251 ar = ath12k_ah_to_ar(ah);
3253 mutex_lock(&ar->conf_mutex);
3254 ath12k_scan_abort(ar);
3255 mutex_unlock(&ar->conf_mutex);
3257 cancel_delayed_work_sync(&ar->scan.timeout);
3260 static int ath12k_install_key(struct ath12k_vif *arvif,
3261 struct ieee80211_key_conf *key,
3262 enum set_key_cmd cmd,
3263 const u8 *macaddr, u32 flags)
3266 struct ath12k *ar = arvif->ar;
3267 struct wmi_vdev_install_key_arg arg = {
3268 .vdev_id = arvif->vdev_id,
3269 .key_idx = key->keyidx,
3270 .key_len = key->keylen,
3271 .key_data = key->key,
3276 lockdep_assert_held(&arvif->ar->conf_mutex);
3278 reinit_completion(&ar->install_key_done);
3280 if (test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags))
3283 if (cmd == DISABLE_KEY) {
3284 /* TODO: Check if FW expects value other than NONE for del */
3285 /* arg.key_cipher = WMI_CIPHER_NONE; */
3287 arg.key_data = NULL;
3291 switch (key->cipher) {
3292 case WLAN_CIPHER_SUITE_CCMP:
3293 arg.key_cipher = WMI_CIPHER_AES_CCM;
3294 /* TODO: Re-check if flag is valid */
3295 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT;
3297 case WLAN_CIPHER_SUITE_TKIP:
3298 arg.key_cipher = WMI_CIPHER_TKIP;
3299 arg.key_txmic_len = 8;
3300 arg.key_rxmic_len = 8;
3302 case WLAN_CIPHER_SUITE_CCMP_256:
3303 arg.key_cipher = WMI_CIPHER_AES_CCM;
3305 case WLAN_CIPHER_SUITE_GCMP:
3306 case WLAN_CIPHER_SUITE_GCMP_256:
3307 arg.key_cipher = WMI_CIPHER_AES_GCM;
3310 ath12k_warn(ar->ab, "cipher %d is not supported\n", key->cipher);
3314 if (test_bit(ATH12K_FLAG_RAW_MODE, &ar->ab->dev_flags))
3315 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV |
3316 IEEE80211_KEY_FLAG_RESERVE_TAILROOM;
3319 ret = ath12k_wmi_vdev_install_key(arvif->ar, &arg);
3324 if (!wait_for_completion_timeout(&ar->install_key_done, 1 * HZ))
3327 if (ether_addr_equal(macaddr, arvif->vif->addr))
3328 arvif->key_cipher = key->cipher;
3330 return ar->install_key_status ? -EINVAL : 0;
3333 static int ath12k_clear_peer_keys(struct ath12k_vif *arvif,
3336 struct ath12k *ar = arvif->ar;
3337 struct ath12k_base *ab = ar->ab;
3338 struct ath12k_peer *peer;
3339 int first_errno = 0;
3344 lockdep_assert_held(&ar->conf_mutex);
3346 spin_lock_bh(&ab->base_lock);
3347 peer = ath12k_peer_find(ab, arvif->vdev_id, addr);
3348 spin_unlock_bh(&ab->base_lock);
3353 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
3357 /* key flags are not required to delete the key */
3358 ret = ath12k_install_key(arvif, peer->keys[i],
3359 DISABLE_KEY, addr, flags);
3360 if (ret < 0 && first_errno == 0)
3364 ath12k_warn(ab, "failed to remove peer key %d: %d\n",
3367 spin_lock_bh(&ab->base_lock);
3368 peer->keys[i] = NULL;
3369 spin_unlock_bh(&ab->base_lock);
3375 static int ath12k_mac_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
3376 struct ieee80211_vif *vif, struct ieee80211_sta *sta,
3377 struct ieee80211_key_conf *key)
3379 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
3381 struct ath12k_base *ab;
3382 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
3383 struct ath12k_peer *peer;
3384 struct ath12k_sta *arsta;
3385 const u8 *peer_addr;
3389 /* BIP needs to be done in software */
3390 if (key->cipher == WLAN_CIPHER_SUITE_AES_CMAC ||
3391 key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_128 ||
3392 key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_256 ||
3393 key->cipher == WLAN_CIPHER_SUITE_BIP_CMAC_256)
3396 ar = ath12k_ah_to_ar(ah);
3399 if (test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags))
3402 if (key->keyidx > WMI_MAX_KEY_INDEX)
3405 mutex_lock(&ar->conf_mutex);
3408 peer_addr = sta->addr;
3409 else if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
3410 peer_addr = vif->bss_conf.bssid;
3412 peer_addr = vif->addr;
3414 key->hw_key_idx = key->keyidx;
3416 /* the peer should not disappear in mid-way (unless FW goes awry) since
3417 * we already hold conf_mutex. we just make sure its there now.
3419 spin_lock_bh(&ab->base_lock);
3420 peer = ath12k_peer_find(ab, arvif->vdev_id, peer_addr);
3421 spin_unlock_bh(&ab->base_lock);
3424 if (cmd == SET_KEY) {
3425 ath12k_warn(ab, "cannot install key for non-existent peer %pM\n",
3430 /* if the peer doesn't exist there is no key to disable
3437 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
3438 flags |= WMI_KEY_PAIRWISE;
3440 flags |= WMI_KEY_GROUP;
3442 ret = ath12k_install_key(arvif, key, cmd, peer_addr, flags);
3444 ath12k_warn(ab, "ath12k_install_key failed (%d)\n", ret);
3448 ret = ath12k_dp_rx_peer_pn_replay_config(arvif, peer_addr, cmd, key);
3450 ath12k_warn(ab, "failed to offload PN replay detection %d\n", ret);
3454 spin_lock_bh(&ab->base_lock);
3455 peer = ath12k_peer_find(ab, arvif->vdev_id, peer_addr);
3456 if (peer && cmd == SET_KEY) {
3457 peer->keys[key->keyidx] = key;
3458 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) {
3459 peer->ucast_keyidx = key->keyidx;
3460 peer->sec_type = ath12k_dp_tx_get_encrypt_type(key->cipher);
3462 peer->mcast_keyidx = key->keyidx;
3463 peer->sec_type_grp = ath12k_dp_tx_get_encrypt_type(key->cipher);
3465 } else if (peer && cmd == DISABLE_KEY) {
3466 peer->keys[key->keyidx] = NULL;
3467 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
3468 peer->ucast_keyidx = 0;
3470 peer->mcast_keyidx = 0;
3472 /* impossible unless FW goes crazy */
3473 ath12k_warn(ab, "peer %pM disappeared!\n", peer_addr);
3476 arsta = ath12k_sta_to_arsta(sta);
3478 switch (key->cipher) {
3479 case WLAN_CIPHER_SUITE_TKIP:
3480 case WLAN_CIPHER_SUITE_CCMP:
3481 case WLAN_CIPHER_SUITE_CCMP_256:
3482 case WLAN_CIPHER_SUITE_GCMP:
3483 case WLAN_CIPHER_SUITE_GCMP_256:
3485 arsta->pn_type = HAL_PN_TYPE_WPA;
3487 arsta->pn_type = HAL_PN_TYPE_NONE;
3490 arsta->pn_type = HAL_PN_TYPE_NONE;
3495 spin_unlock_bh(&ab->base_lock);
3498 mutex_unlock(&ar->conf_mutex);
3503 ath12k_mac_bitrate_mask_num_vht_rates(struct ath12k *ar,
3504 enum nl80211_band band,
3505 const struct cfg80211_bitrate_mask *mask)
3510 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++)
3511 num_rates += hweight16(mask->control[band].vht_mcs[i]);
3517 ath12k_mac_set_peer_vht_fixed_rate(struct ath12k_vif *arvif,
3518 struct ieee80211_sta *sta,
3519 const struct cfg80211_bitrate_mask *mask,
3520 enum nl80211_band band)
3522 struct ath12k *ar = arvif->ar;
3527 lockdep_assert_held(&ar->conf_mutex);
3531 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
3532 if (hweight16(mask->control[band].vht_mcs[i]) == 1) {
3534 vht_rate = ffs(mask->control[band].vht_mcs[i]) - 1;
3539 ath12k_warn(ar->ab, "No single VHT Fixed rate found to set for %pM",
3544 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
3545 "Setting Fixed VHT Rate for peer %pM. Device will not switch to any other selected rates",
3548 rate_code = ATH12K_HW_RATE_CODE(vht_rate, nss - 1,
3549 WMI_RATE_PREAMBLE_VHT);
3550 ret = ath12k_wmi_set_peer_param(ar, sta->addr,
3552 WMI_PEER_PARAM_FIXED_RATE,
3556 "failed to update STA %pM Fixed Rate %d: %d\n",
3557 sta->addr, rate_code, ret);
3562 static int ath12k_station_assoc(struct ath12k *ar,
3563 struct ieee80211_vif *vif,
3564 struct ieee80211_sta *sta,
3567 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
3568 struct ath12k_wmi_peer_assoc_arg peer_arg;
3570 struct cfg80211_chan_def def;
3571 enum nl80211_band band;
3572 struct cfg80211_bitrate_mask *mask;
3575 lockdep_assert_held(&ar->conf_mutex);
3577 if (WARN_ON(ath12k_mac_vif_chan(vif, &def)))
3580 band = def.chan->band;
3581 mask = &arvif->bitrate_mask;
3583 ath12k_peer_assoc_prepare(ar, vif, sta, &peer_arg, reassoc);
3585 ret = ath12k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
3587 ath12k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n",
3588 sta->addr, arvif->vdev_id, ret);
3592 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) {
3593 ath12k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
3594 sta->addr, arvif->vdev_id);
3598 num_vht_rates = ath12k_mac_bitrate_mask_num_vht_rates(ar, band, mask);
3600 /* If single VHT rate is configured (by set_bitrate_mask()),
3601 * peer_assoc will disable VHT. This is now enabled by a peer specific
3603 * Note that all other rates and NSS will be disabled for this peer.
3605 if (sta->deflink.vht_cap.vht_supported && num_vht_rates == 1) {
3606 ret = ath12k_mac_set_peer_vht_fixed_rate(arvif, sta, mask,
3612 /* Re-assoc is run only to update supported rates for given station. It
3613 * doesn't make much sense to reconfigure the peer completely.
3618 ret = ath12k_setup_peer_smps(ar, arvif, sta->addr,
3619 &sta->deflink.ht_cap);
3621 ath12k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n",
3622 arvif->vdev_id, ret);
3627 arvif->num_legacy_stations++;
3628 ret = ath12k_recalc_rtscts_prot(arvif);
3633 if (sta->wme && sta->uapsd_queues) {
3634 ret = ath12k_peer_assoc_qos_ap(ar, arvif, sta);
3636 ath12k_warn(ar->ab, "failed to set qos params for STA %pM for vdev %i: %d\n",
3637 sta->addr, arvif->vdev_id, ret);
3645 static int ath12k_station_disassoc(struct ath12k *ar,
3646 struct ieee80211_vif *vif,
3647 struct ieee80211_sta *sta)
3649 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
3652 lockdep_assert_held(&ar->conf_mutex);
3655 arvif->num_legacy_stations--;
3656 ret = ath12k_recalc_rtscts_prot(arvif);
3661 ret = ath12k_clear_peer_keys(arvif, sta->addr);
3663 ath12k_warn(ar->ab, "failed to clear all peer keys for vdev %i: %d\n",
3664 arvif->vdev_id, ret);
3670 static void ath12k_sta_rc_update_wk(struct work_struct *wk)
3673 struct ath12k_vif *arvif;
3674 struct ath12k_sta *arsta;
3675 struct ieee80211_sta *sta;
3676 struct cfg80211_chan_def def;
3677 enum nl80211_band band;
3678 const u8 *ht_mcs_mask;
3679 const u16 *vht_mcs_mask;
3680 u32 changed, bw, nss, smps, bw_prev;
3681 int err, num_vht_rates;
3682 const struct cfg80211_bitrate_mask *mask;
3683 struct ath12k_wmi_peer_assoc_arg peer_arg;
3684 enum wmi_phy_mode peer_phymode;
3686 arsta = container_of(wk, struct ath12k_sta, update_wk);
3687 sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv);
3688 arvif = arsta->arvif;
3691 if (WARN_ON(ath12k_mac_vif_chan(arvif->vif, &def)))
3694 band = def.chan->band;
3695 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
3696 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
3698 spin_lock_bh(&ar->data_lock);
3700 changed = arsta->changed;
3704 bw_prev = arsta->bw_prev;
3708 spin_unlock_bh(&ar->data_lock);
3710 mutex_lock(&ar->conf_mutex);
3712 nss = max_t(u32, 1, nss);
3713 nss = min(nss, max(ath12k_mac_max_ht_nss(ht_mcs_mask),
3714 ath12k_mac_max_vht_nss(vht_mcs_mask)));
3716 if (changed & IEEE80211_RC_BW_CHANGED) {
3717 ath12k_peer_assoc_h_phymode(ar, arvif->vif, sta, &peer_arg);
3718 peer_phymode = peer_arg.peer_phymode;
3721 /* Phymode shows maximum supported channel width, if we
3722 * upgrade bandwidth then due to sanity check of firmware,
3723 * we have to send WMI_PEER_PHYMODE followed by
3726 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac bandwidth upgrade for sta %pM new %d old %d\n",
3727 sta->addr, bw, bw_prev);
3728 err = ath12k_wmi_set_peer_param(ar, sta->addr,
3729 arvif->vdev_id, WMI_PEER_PHYMODE,
3732 ath12k_warn(ar->ab, "failed to update STA %pM to peer phymode %d: %d\n",
3733 sta->addr, peer_phymode, err);
3734 goto err_rc_bw_changed;
3736 err = ath12k_wmi_set_peer_param(ar, sta->addr,
3737 arvif->vdev_id, WMI_PEER_CHWIDTH,
3740 ath12k_warn(ar->ab, "failed to update STA %pM to peer bandwidth %d: %d\n",
3741 sta->addr, bw, err);
3743 /* When we downgrade bandwidth this will conflict with phymode
3744 * and cause to trigger firmware crash. In this case we send
3745 * WMI_PEER_CHWIDTH followed by WMI_PEER_PHYMODE
3747 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac bandwidth downgrade for sta %pM new %d old %d\n",
3748 sta->addr, bw, bw_prev);
3749 err = ath12k_wmi_set_peer_param(ar, sta->addr,
3750 arvif->vdev_id, WMI_PEER_CHWIDTH,
3753 ath12k_warn(ar->ab, "failed to update STA %pM peer to bandwidth %d: %d\n",
3754 sta->addr, bw, err);
3755 goto err_rc_bw_changed;
3757 err = ath12k_wmi_set_peer_param(ar, sta->addr,
3758 arvif->vdev_id, WMI_PEER_PHYMODE,
3761 ath12k_warn(ar->ab, "failed to update STA %pM to peer phymode %d: %d\n",
3762 sta->addr, peer_phymode, err);
3766 if (changed & IEEE80211_RC_NSS_CHANGED) {
3767 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac update sta %pM nss %d\n",
3770 err = ath12k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
3773 ath12k_warn(ar->ab, "failed to update STA %pM nss %d: %d\n",
3774 sta->addr, nss, err);
3777 if (changed & IEEE80211_RC_SMPS_CHANGED) {
3778 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac update sta %pM smps %d\n",
3781 err = ath12k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
3782 WMI_PEER_MIMO_PS_STATE, smps);
3784 ath12k_warn(ar->ab, "failed to update STA %pM smps %d: %d\n",
3785 sta->addr, smps, err);
3788 if (changed & IEEE80211_RC_SUPP_RATES_CHANGED) {
3789 mask = &arvif->bitrate_mask;
3790 num_vht_rates = ath12k_mac_bitrate_mask_num_vht_rates(ar, band,
3793 /* Peer_assoc_prepare will reject vht rates in
3794 * bitrate_mask if its not available in range format and
3795 * sets vht tx_rateset as unsupported. So multiple VHT MCS
3796 * setting(eg. MCS 4,5,6) per peer is not supported here.
3797 * But, Single rate in VHT mask can be set as per-peer
3798 * fixed rate. But even if any HT rates are configured in
3799 * the bitrate mask, device will not switch to those rates
3800 * when per-peer Fixed rate is set.
3801 * TODO: Check RATEMASK_CMDID to support auto rates selection
3802 * across HT/VHT and for multiple VHT MCS support.
3804 if (sta->deflink.vht_cap.vht_supported && num_vht_rates == 1) {
3805 ath12k_mac_set_peer_vht_fixed_rate(arvif, sta, mask,
3808 /* If the peer is non-VHT or no fixed VHT rate
3809 * is provided in the new bitrate mask we set the
3810 * other rates using peer_assoc command.
3812 ath12k_peer_assoc_prepare(ar, arvif->vif, sta,
3815 err = ath12k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
3817 ath12k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n",
3818 sta->addr, arvif->vdev_id, err);
3820 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ))
3821 ath12k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
3822 sta->addr, arvif->vdev_id);
3826 mutex_unlock(&ar->conf_mutex);
3829 static int ath12k_mac_inc_num_stations(struct ath12k_vif *arvif,
3830 struct ieee80211_sta *sta)
3832 struct ath12k *ar = arvif->ar;
3834 lockdep_assert_held(&ar->conf_mutex);
3836 if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
3839 if (ar->num_stations >= ar->max_num_stations)
3847 static void ath12k_mac_dec_num_stations(struct ath12k_vif *arvif,
3848 struct ieee80211_sta *sta)
3850 struct ath12k *ar = arvif->ar;
3852 lockdep_assert_held(&ar->conf_mutex);
3854 if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
3860 static int ath12k_mac_station_add(struct ath12k *ar,
3861 struct ieee80211_vif *vif,
3862 struct ieee80211_sta *sta)
3864 struct ath12k_base *ab = ar->ab;
3865 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
3866 struct ath12k_sta *arsta = ath12k_sta_to_arsta(sta);
3867 struct ath12k_wmi_peer_create_arg peer_param;
3870 lockdep_assert_held(&ar->conf_mutex);
3872 ret = ath12k_mac_inc_num_stations(arvif, sta);
3874 ath12k_warn(ab, "refusing to associate station: too many connected already (%d)\n",
3875 ar->max_num_stations);
3879 arsta->rx_stats = kzalloc(sizeof(*arsta->rx_stats), GFP_KERNEL);
3880 if (!arsta->rx_stats) {
3882 goto dec_num_station;
3885 peer_param.vdev_id = arvif->vdev_id;
3886 peer_param.peer_addr = sta->addr;
3887 peer_param.peer_type = WMI_PEER_TYPE_DEFAULT;
3889 ret = ath12k_peer_create(ar, arvif, sta, &peer_param);
3891 ath12k_warn(ab, "Failed to add peer: %pM for VDEV: %d\n",
3892 sta->addr, arvif->vdev_id);
3896 ath12k_dbg(ab, ATH12K_DBG_MAC, "Added peer: %pM for VDEV: %d\n",
3897 sta->addr, arvif->vdev_id);
3899 if (ieee80211_vif_is_mesh(vif)) {
3900 ret = ath12k_wmi_set_peer_param(ar, sta->addr,
3902 WMI_PEER_USE_4ADDR, 1);
3904 ath12k_warn(ab, "failed to STA %pM 4addr capability: %d\n",
3910 ret = ath12k_dp_peer_setup(ar, arvif->vdev_id, sta->addr);
3912 ath12k_warn(ab, "failed to setup dp for peer %pM on vdev %i (%d)\n",
3913 sta->addr, arvif->vdev_id, ret);
3917 if (ab->hw_params->vdev_start_delay &&
3918 !arvif->is_started &&
3919 arvif->vdev_type != WMI_VDEV_TYPE_AP) {
3920 ret = ath12k_start_vdev_delay(ar, arvif);
3922 ath12k_warn(ab, "failed to delay vdev start: %d\n", ret);
3930 ath12k_peer_delete(ar, arvif->vdev_id, sta->addr);
3932 ath12k_mac_dec_num_stations(arvif, sta);
3937 static u32 ath12k_mac_ieee80211_sta_bw_to_wmi(struct ath12k *ar,
3938 struct ieee80211_sta *sta)
3940 u32 bw = WMI_PEER_CHWIDTH_20MHZ;
3942 switch (sta->deflink.bandwidth) {
3943 case IEEE80211_STA_RX_BW_20:
3944 bw = WMI_PEER_CHWIDTH_20MHZ;
3946 case IEEE80211_STA_RX_BW_40:
3947 bw = WMI_PEER_CHWIDTH_40MHZ;
3949 case IEEE80211_STA_RX_BW_80:
3950 bw = WMI_PEER_CHWIDTH_80MHZ;
3952 case IEEE80211_STA_RX_BW_160:
3953 bw = WMI_PEER_CHWIDTH_160MHZ;
3955 case IEEE80211_STA_RX_BW_320:
3956 bw = WMI_PEER_CHWIDTH_320MHZ;
3959 ath12k_warn(ar->ab, "Invalid bandwidth %d in rc update for %pM\n",
3960 sta->deflink.bandwidth, sta->addr);
3961 bw = WMI_PEER_CHWIDTH_20MHZ;
3968 static int ath12k_mac_op_sta_state(struct ieee80211_hw *hw,
3969 struct ieee80211_vif *vif,
3970 struct ieee80211_sta *sta,
3971 enum ieee80211_sta_state old_state,
3972 enum ieee80211_sta_state new_state)
3974 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
3976 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
3977 struct ath12k_sta *arsta = ath12k_sta_to_arsta(sta);
3978 struct ath12k_peer *peer;
3981 /* cancel must be done outside the mutex to avoid deadlock */
3982 if ((old_state == IEEE80211_STA_NONE &&
3983 new_state == IEEE80211_STA_NOTEXIST))
3984 cancel_work_sync(&arsta->update_wk);
3986 ar = ath12k_ah_to_ar(ah);
3988 mutex_lock(&ar->conf_mutex);
3990 if (old_state == IEEE80211_STA_NOTEXIST &&
3991 new_state == IEEE80211_STA_NONE) {
3992 memset(arsta, 0, sizeof(*arsta));
3993 arsta->arvif = arvif;
3994 INIT_WORK(&arsta->update_wk, ath12k_sta_rc_update_wk);
3996 ret = ath12k_mac_station_add(ar, vif, sta);
3998 ath12k_warn(ar->ab, "Failed to add station: %pM for VDEV: %d\n",
3999 sta->addr, arvif->vdev_id);
4000 } else if ((old_state == IEEE80211_STA_NONE &&
4001 new_state == IEEE80211_STA_NOTEXIST)) {
4002 if (arvif->vdev_type == WMI_VDEV_TYPE_STA) {
4003 ath12k_bss_disassoc(ar, arvif);
4004 ret = ath12k_mac_vdev_stop(arvif);
4006 ath12k_warn(ar->ab, "failed to stop vdev %i: %d\n",
4007 arvif->vdev_id, ret);
4009 ath12k_dp_peer_cleanup(ar, arvif->vdev_id, sta->addr);
4011 ret = ath12k_peer_delete(ar, arvif->vdev_id, sta->addr);
4013 ath12k_warn(ar->ab, "Failed to delete peer: %pM for VDEV: %d\n",
4014 sta->addr, arvif->vdev_id);
4016 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "Removed peer: %pM for VDEV: %d\n",
4017 sta->addr, arvif->vdev_id);
4019 ath12k_mac_dec_num_stations(arvif, sta);
4020 spin_lock_bh(&ar->ab->base_lock);
4021 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
4022 if (peer && peer->sta == sta) {
4023 ath12k_warn(ar->ab, "Found peer entry %pM n vdev %i after it was supposedly removed\n",
4024 vif->addr, arvif->vdev_id);
4026 list_del(&peer->list);
4030 spin_unlock_bh(&ar->ab->base_lock);
4032 kfree(arsta->rx_stats);
4033 arsta->rx_stats = NULL;
4034 } else if (old_state == IEEE80211_STA_AUTH &&
4035 new_state == IEEE80211_STA_ASSOC &&
4036 (vif->type == NL80211_IFTYPE_AP ||
4037 vif->type == NL80211_IFTYPE_MESH_POINT ||
4038 vif->type == NL80211_IFTYPE_ADHOC)) {
4039 ret = ath12k_station_assoc(ar, vif, sta, false);
4041 ath12k_warn(ar->ab, "Failed to associate station: %pM\n",
4044 spin_lock_bh(&ar->data_lock);
4046 arsta->bw = ath12k_mac_ieee80211_sta_bw_to_wmi(ar, sta);
4047 arsta->bw_prev = sta->deflink.bandwidth;
4049 spin_unlock_bh(&ar->data_lock);
4050 } else if (old_state == IEEE80211_STA_ASSOC &&
4051 new_state == IEEE80211_STA_AUTHORIZED) {
4052 spin_lock_bh(&ar->ab->base_lock);
4054 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
4056 peer->is_authorized = true;
4058 spin_unlock_bh(&ar->ab->base_lock);
4060 if (vif->type == NL80211_IFTYPE_STATION && arvif->is_up) {
4061 ret = ath12k_wmi_set_peer_param(ar, sta->addr,
4066 ath12k_warn(ar->ab, "Unable to authorize peer %pM vdev %d: %d\n",
4067 sta->addr, arvif->vdev_id, ret);
4069 } else if (old_state == IEEE80211_STA_AUTHORIZED &&
4070 new_state == IEEE80211_STA_ASSOC) {
4071 spin_lock_bh(&ar->ab->base_lock);
4073 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
4075 peer->is_authorized = false;
4077 spin_unlock_bh(&ar->ab->base_lock);
4078 } else if (old_state == IEEE80211_STA_ASSOC &&
4079 new_state == IEEE80211_STA_AUTH &&
4080 (vif->type == NL80211_IFTYPE_AP ||
4081 vif->type == NL80211_IFTYPE_MESH_POINT ||
4082 vif->type == NL80211_IFTYPE_ADHOC)) {
4083 ret = ath12k_station_disassoc(ar, vif, sta);
4085 ath12k_warn(ar->ab, "Failed to disassociate station: %pM\n",
4089 mutex_unlock(&ar->conf_mutex);
4094 static int ath12k_mac_op_sta_set_txpwr(struct ieee80211_hw *hw,
4095 struct ieee80211_vif *vif,
4096 struct ieee80211_sta *sta)
4098 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
4100 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
4104 if (sta->deflink.txpwr.type == NL80211_TX_POWER_AUTOMATIC) {
4107 txpwr = sta->deflink.txpwr.power;
4112 if (txpwr > ATH12K_TX_POWER_MAX_VAL || txpwr < ATH12K_TX_POWER_MIN_VAL)
4115 ar = ath12k_ah_to_ar(ah);
4117 mutex_lock(&ar->conf_mutex);
4119 ret = ath12k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
4120 WMI_PEER_USE_FIXED_PWR, txpwr);
4122 ath12k_warn(ar->ab, "failed to set tx power for station ret: %d\n",
4128 mutex_unlock(&ar->conf_mutex);
4132 static void ath12k_mac_op_sta_rc_update(struct ieee80211_hw *hw,
4133 struct ieee80211_vif *vif,
4134 struct ieee80211_sta *sta,
4137 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
4139 struct ath12k_sta *arsta = ath12k_sta_to_arsta(sta);
4140 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
4141 struct ath12k_peer *peer;
4144 ar = ath12k_ah_to_ar(ah);
4146 spin_lock_bh(&ar->ab->base_lock);
4148 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
4150 spin_unlock_bh(&ar->ab->base_lock);
4151 ath12k_warn(ar->ab, "mac sta rc update failed to find peer %pM on vdev %i\n",
4152 sta->addr, arvif->vdev_id);
4156 spin_unlock_bh(&ar->ab->base_lock);
4158 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
4159 "mac sta rc update for %pM changed %08x bw %d nss %d smps %d\n",
4160 sta->addr, changed, sta->deflink.bandwidth, sta->deflink.rx_nss,
4161 sta->deflink.smps_mode);
4163 spin_lock_bh(&ar->data_lock);
4165 if (changed & IEEE80211_RC_BW_CHANGED) {
4166 bw = ath12k_mac_ieee80211_sta_bw_to_wmi(ar, sta);
4167 arsta->bw_prev = arsta->bw;
4171 if (changed & IEEE80211_RC_NSS_CHANGED)
4172 arsta->nss = sta->deflink.rx_nss;
4174 if (changed & IEEE80211_RC_SMPS_CHANGED) {
4175 smps = WMI_PEER_SMPS_PS_NONE;
4177 switch (sta->deflink.smps_mode) {
4178 case IEEE80211_SMPS_AUTOMATIC:
4179 case IEEE80211_SMPS_OFF:
4180 smps = WMI_PEER_SMPS_PS_NONE;
4182 case IEEE80211_SMPS_STATIC:
4183 smps = WMI_PEER_SMPS_STATIC;
4185 case IEEE80211_SMPS_DYNAMIC:
4186 smps = WMI_PEER_SMPS_DYNAMIC;
4189 ath12k_warn(ar->ab, "Invalid smps %d in sta rc update for %pM\n",
4190 sta->deflink.smps_mode, sta->addr);
4191 smps = WMI_PEER_SMPS_PS_NONE;
4198 arsta->changed |= changed;
4200 spin_unlock_bh(&ar->data_lock);
4202 ieee80211_queue_work(hw, &arsta->update_wk);
4205 static int ath12k_conf_tx_uapsd(struct ath12k_vif *arvif,
4206 u16 ac, bool enable)
4208 struct ath12k *ar = arvif->ar;
4212 if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
4216 case IEEE80211_AC_VO:
4217 value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN |
4218 WMI_STA_PS_UAPSD_AC3_TRIGGER_EN;
4220 case IEEE80211_AC_VI:
4221 value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN |
4222 WMI_STA_PS_UAPSD_AC2_TRIGGER_EN;
4224 case IEEE80211_AC_BE:
4225 value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN |
4226 WMI_STA_PS_UAPSD_AC1_TRIGGER_EN;
4228 case IEEE80211_AC_BK:
4229 value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN |
4230 WMI_STA_PS_UAPSD_AC0_TRIGGER_EN;
4235 arvif->u.sta.uapsd |= value;
4237 arvif->u.sta.uapsd &= ~value;
4239 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
4240 WMI_STA_PS_PARAM_UAPSD,
4241 arvif->u.sta.uapsd);
4243 ath12k_warn(ar->ab, "could not set uapsd params %d\n", ret);
4247 if (arvif->u.sta.uapsd)
4248 value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD;
4250 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
4252 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
4253 WMI_STA_PS_PARAM_RX_WAKE_POLICY,
4256 ath12k_warn(ar->ab, "could not set rx wake param %d\n", ret);
4262 static int ath12k_mac_conf_tx(struct ath12k_vif *arvif,
4263 unsigned int link_id, u16 ac,
4264 const struct ieee80211_tx_queue_params *params)
4266 struct wmi_wmm_params_arg *p = NULL;
4267 struct ath12k *ar = arvif->ar;
4268 struct ath12k_base *ab = ar->ab;
4271 lockdep_assert_held(&ar->conf_mutex);
4274 case IEEE80211_AC_VO:
4275 p = &arvif->wmm_params.ac_vo;
4277 case IEEE80211_AC_VI:
4278 p = &arvif->wmm_params.ac_vi;
4280 case IEEE80211_AC_BE:
4281 p = &arvif->wmm_params.ac_be;
4283 case IEEE80211_AC_BK:
4284 p = &arvif->wmm_params.ac_bk;
4293 p->cwmin = params->cw_min;
4294 p->cwmax = params->cw_max;
4295 p->aifs = params->aifs;
4296 p->txop = params->txop;
4298 ret = ath12k_wmi_send_wmm_update_cmd(ar, arvif->vdev_id,
4299 &arvif->wmm_params);
4301 ath12k_warn(ab, "pdev idx %d failed to set wmm params: %d\n",
4306 ret = ath12k_conf_tx_uapsd(arvif, ac, params->uapsd);
4308 ath12k_warn(ab, "pdev idx %d failed to set sta uapsd: %d\n",
4315 static int ath12k_mac_op_conf_tx(struct ieee80211_hw *hw,
4316 struct ieee80211_vif *vif,
4317 unsigned int link_id, u16 ac,
4318 const struct ieee80211_tx_queue_params *params)
4320 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
4322 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
4325 ar = ath12k_ah_to_ar(ah);
4327 mutex_lock(&ar->conf_mutex);
4328 ret = ath12k_mac_conf_tx(arvif, link_id, ac, params);
4329 mutex_unlock(&ar->conf_mutex);
4334 static struct ieee80211_sta_ht_cap
4335 ath12k_create_ht_cap(struct ath12k *ar, u32 ar_ht_cap, u32 rate_cap_rx_chainmask)
4338 struct ieee80211_sta_ht_cap ht_cap = {0};
4339 u32 ar_vht_cap = ar->pdev->cap.vht_cap;
4341 if (!(ar_ht_cap & WMI_HT_CAP_ENABLED))
4344 ht_cap.ht_supported = 1;
4345 ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
4346 ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_NONE;
4347 ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
4348 ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
4349 ht_cap.cap |= WLAN_HT_CAP_SM_PS_STATIC << IEEE80211_HT_CAP_SM_PS_SHIFT;
4351 if (ar_ht_cap & WMI_HT_CAP_HT20_SGI)
4352 ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
4354 if (ar_ht_cap & WMI_HT_CAP_HT40_SGI)
4355 ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
4357 if (ar_ht_cap & WMI_HT_CAP_DYNAMIC_SMPS) {
4360 smps = WLAN_HT_CAP_SM_PS_DYNAMIC;
4361 smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT;
4366 if (ar_ht_cap & WMI_HT_CAP_TX_STBC)
4367 ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC;
4369 if (ar_ht_cap & WMI_HT_CAP_RX_STBC) {
4373 stbc &= WMI_HT_CAP_RX_STBC;
4374 stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT;
4375 stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT;
4376 stbc &= IEEE80211_HT_CAP_RX_STBC;
4381 if (ar_ht_cap & WMI_HT_CAP_RX_LDPC)
4382 ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
4384 if (ar_ht_cap & WMI_HT_CAP_L_SIG_TXOP_PROT)
4385 ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
4387 if (ar_vht_cap & WMI_VHT_CAP_MAX_MPDU_LEN_MASK)
4388 ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU;
4390 for (i = 0; i < ar->num_rx_chains; i++) {
4391 if (rate_cap_rx_chainmask & BIT(i))
4392 ht_cap.mcs.rx_mask[i] = 0xFF;
4395 ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
4400 static int ath12k_mac_set_txbf_conf(struct ath12k_vif *arvif)
4403 struct ath12k *ar = arvif->ar;
4406 u32 vht_cap = ar->pdev->cap.vht_cap;
4407 u32 vdev_param = WMI_VDEV_PARAM_TXBF;
4409 if (vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)) {
4410 nsts = vht_cap & IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
4411 nsts >>= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
4412 value |= SM(nsts, WMI_TXBF_STS_CAP_OFFSET);
4415 if (vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)) {
4416 sound_dim = vht_cap &
4417 IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
4418 sound_dim >>= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
4419 if (sound_dim > (ar->num_tx_chains - 1))
4420 sound_dim = ar->num_tx_chains - 1;
4421 value |= SM(sound_dim, WMI_BF_SOUND_DIM_OFFSET);
4427 if (vht_cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE) {
4428 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
4430 if ((vht_cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE) &&
4431 arvif->vdev_type == WMI_VDEV_TYPE_AP)
4432 value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFER;
4435 if (vht_cap & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE) {
4436 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
4438 if ((vht_cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE) &&
4439 arvif->vdev_type == WMI_VDEV_TYPE_STA)
4440 value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFEE;
4443 return ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4447 static void ath12k_set_vht_txbf_cap(struct ath12k *ar, u32 *vht_cap)
4449 bool subfer, subfee;
4452 subfer = !!(*vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE));
4453 subfee = !!(*vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE));
4455 if (ar->num_tx_chains < 2) {
4456 *vht_cap &= ~(IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE);
4460 /* If SU Beaformer is not set, then disable MU Beamformer Capability */
4462 *vht_cap &= ~(IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE);
4464 /* If SU Beaformee is not set, then disable MU Beamformee Capability */
4466 *vht_cap &= ~(IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE);
4468 sound_dim = u32_get_bits(*vht_cap,
4469 IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK);
4470 *vht_cap = u32_replace_bits(*vht_cap, 0,
4471 IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK);
4473 /* TODO: Need to check invalid STS and Sound_dim values set by FW? */
4475 /* Enable Sounding Dimension Field only if SU BF is enabled */
4477 if (sound_dim > (ar->num_tx_chains - 1))
4478 sound_dim = ar->num_tx_chains - 1;
4480 *vht_cap = u32_replace_bits(*vht_cap, sound_dim,
4481 IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK);
4484 /* Use the STS advertised by FW unless SU Beamformee is not supported*/
4486 *vht_cap &= ~(IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK);
4489 static struct ieee80211_sta_vht_cap
4490 ath12k_create_vht_cap(struct ath12k *ar, u32 rate_cap_tx_chainmask,
4491 u32 rate_cap_rx_chainmask)
4493 struct ieee80211_sta_vht_cap vht_cap = {0};
4494 u16 txmcs_map, rxmcs_map;
4497 vht_cap.vht_supported = 1;
4498 vht_cap.cap = ar->pdev->cap.vht_cap;
4500 ath12k_set_vht_txbf_cap(ar, &vht_cap.cap);
4502 /* TODO: Enable back VHT160 mode once association issues are fixed */
4503 /* Disabling VHT160 and VHT80+80 modes */
4504 vht_cap.cap &= ~IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK;
4505 vht_cap.cap &= ~IEEE80211_VHT_CAP_SHORT_GI_160;
4509 for (i = 0; i < 8; i++) {
4510 if (i < ar->num_tx_chains && rate_cap_tx_chainmask & BIT(i))
4511 txmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
4513 txmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
4515 if (i < ar->num_rx_chains && rate_cap_rx_chainmask & BIT(i))
4516 rxmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
4518 rxmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
4521 if (rate_cap_tx_chainmask <= 1)
4522 vht_cap.cap &= ~IEEE80211_VHT_CAP_TXSTBC;
4524 vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(rxmcs_map);
4525 vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(txmcs_map);
4530 static void ath12k_mac_setup_ht_vht_cap(struct ath12k *ar,
4531 struct ath12k_pdev_cap *cap,
4534 struct ieee80211_supported_band *band;
4535 u32 rate_cap_tx_chainmask;
4536 u32 rate_cap_rx_chainmask;
4539 rate_cap_tx_chainmask = ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift;
4540 rate_cap_rx_chainmask = ar->cfg_rx_chainmask >> cap->rx_chain_mask_shift;
4542 if (cap->supported_bands & WMI_HOST_WLAN_2G_CAP) {
4543 band = &ar->mac.sbands[NL80211_BAND_2GHZ];
4544 ht_cap = cap->band[NL80211_BAND_2GHZ].ht_cap_info;
4546 *ht_cap_info = ht_cap;
4547 band->ht_cap = ath12k_create_ht_cap(ar, ht_cap,
4548 rate_cap_rx_chainmask);
4551 if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP &&
4552 (ar->ab->hw_params->single_pdev_only ||
4553 !ar->supports_6ghz)) {
4554 band = &ar->mac.sbands[NL80211_BAND_5GHZ];
4555 ht_cap = cap->band[NL80211_BAND_5GHZ].ht_cap_info;
4557 *ht_cap_info = ht_cap;
4558 band->ht_cap = ath12k_create_ht_cap(ar, ht_cap,
4559 rate_cap_rx_chainmask);
4560 band->vht_cap = ath12k_create_vht_cap(ar, rate_cap_tx_chainmask,
4561 rate_cap_rx_chainmask);
4565 static int ath12k_check_chain_mask(struct ath12k *ar, u32 ant, bool is_tx_ant)
4567 /* TODO: Check the request chainmask against the supported
4568 * chainmask table which is advertised in extented_service_ready event
4574 static void ath12k_gen_ppe_thresh(struct ath12k_wmi_ppe_threshold_arg *fw_ppet,
4580 he_ppet[0] = fw_ppet->numss_m1 & IEEE80211_PPE_THRES_NSS_MASK;
4581 he_ppet[0] |= (fw_ppet->ru_bit_mask <<
4582 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_POS) &
4583 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK;
4584 for (nss = 0; nss <= fw_ppet->numss_m1; nss++) {
4585 for (ru = 0; ru < 4; ru++) {
4589 if ((fw_ppet->ru_bit_mask & BIT(ru)) == 0)
4591 val = (fw_ppet->ppet16_ppet8_ru3_ru0[nss] >> (ru * 6)) &
4593 val = ((val >> 3) & 0x7) | ((val & 0x7) << 3);
4594 for (i = 5; i >= 0; i--) {
4596 ((val >> i) & 0x1) << ((bit % 8));
4604 ath12k_mac_filter_he_cap_mesh(struct ieee80211_he_cap_elem *he_cap_elem)
4608 m = IEEE80211_HE_MAC_CAP0_TWT_RES |
4609 IEEE80211_HE_MAC_CAP0_TWT_REQ;
4610 he_cap_elem->mac_cap_info[0] &= ~m;
4612 m = IEEE80211_HE_MAC_CAP2_TRS |
4613 IEEE80211_HE_MAC_CAP2_BCAST_TWT |
4614 IEEE80211_HE_MAC_CAP2_MU_CASCADING;
4615 he_cap_elem->mac_cap_info[2] &= ~m;
4617 m = IEEE80211_HE_MAC_CAP3_FLEX_TWT_SCHED |
4618 IEEE80211_HE_MAC_CAP2_BCAST_TWT |
4619 IEEE80211_HE_MAC_CAP2_MU_CASCADING;
4620 he_cap_elem->mac_cap_info[3] &= ~m;
4622 m = IEEE80211_HE_MAC_CAP4_BSRP_BQRP_A_MPDU_AGG |
4623 IEEE80211_HE_MAC_CAP4_BQR;
4624 he_cap_elem->mac_cap_info[4] &= ~m;
4626 m = IEEE80211_HE_MAC_CAP5_SUBCHAN_SELECTIVE_TRANSMISSION |
4627 IEEE80211_HE_MAC_CAP5_UL_2x996_TONE_RU |
4628 IEEE80211_HE_MAC_CAP5_PUNCTURED_SOUNDING |
4629 IEEE80211_HE_MAC_CAP5_HT_VHT_TRIG_FRAME_RX;
4630 he_cap_elem->mac_cap_info[5] &= ~m;
4632 m = IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO |
4633 IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO;
4634 he_cap_elem->phy_cap_info[2] &= ~m;
4636 m = IEEE80211_HE_PHY_CAP3_RX_PARTIAL_BW_SU_IN_20MHZ_MU |
4637 IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK |
4638 IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_MASK;
4639 he_cap_elem->phy_cap_info[3] &= ~m;
4641 m = IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER;
4642 he_cap_elem->phy_cap_info[4] &= ~m;
4644 m = IEEE80211_HE_PHY_CAP5_NG16_MU_FEEDBACK;
4645 he_cap_elem->phy_cap_info[5] &= ~m;
4647 m = IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_75_MU |
4648 IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB |
4649 IEEE80211_HE_PHY_CAP6_TRIG_CQI_FB |
4650 IEEE80211_HE_PHY_CAP6_PARTIAL_BANDWIDTH_DL_MUMIMO;
4651 he_cap_elem->phy_cap_info[6] &= ~m;
4653 m = IEEE80211_HE_PHY_CAP7_PSR_BASED_SR |
4654 IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_SUPP |
4655 IEEE80211_HE_PHY_CAP7_STBC_TX_ABOVE_80MHZ |
4656 IEEE80211_HE_PHY_CAP7_STBC_RX_ABOVE_80MHZ;
4657 he_cap_elem->phy_cap_info[7] &= ~m;
4659 m = IEEE80211_HE_PHY_CAP8_HE_ER_SU_PPDU_4XLTF_AND_08_US_GI |
4660 IEEE80211_HE_PHY_CAP8_20MHZ_IN_40MHZ_HE_PPDU_IN_2G |
4661 IEEE80211_HE_PHY_CAP8_20MHZ_IN_160MHZ_HE_PPDU |
4662 IEEE80211_HE_PHY_CAP8_80MHZ_IN_160MHZ_HE_PPDU;
4663 he_cap_elem->phy_cap_info[8] &= ~m;
4665 m = IEEE80211_HE_PHY_CAP9_LONGER_THAN_16_SIGB_OFDM_SYM |
4666 IEEE80211_HE_PHY_CAP9_NON_TRIGGERED_CQI_FEEDBACK |
4667 IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU |
4668 IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU |
4669 IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_COMP_SIGB |
4670 IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_NON_COMP_SIGB;
4671 he_cap_elem->phy_cap_info[9] &= ~m;
4674 static __le16 ath12k_mac_setup_he_6ghz_cap(struct ath12k_pdev_cap *pcap,
4675 struct ath12k_band_cap *bcap)
4679 bcap->he_6ghz_capa = IEEE80211_HT_MPDU_DENSITY_NONE;
4680 if (bcap->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS)
4681 bcap->he_6ghz_capa |=
4682 u32_encode_bits(WLAN_HT_CAP_SM_PS_DYNAMIC,
4683 IEEE80211_HE_6GHZ_CAP_SM_PS);
4685 bcap->he_6ghz_capa |=
4686 u32_encode_bits(WLAN_HT_CAP_SM_PS_DISABLED,
4687 IEEE80211_HE_6GHZ_CAP_SM_PS);
4688 val = u32_get_bits(pcap->vht_cap,
4689 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK);
4690 bcap->he_6ghz_capa |=
4691 u32_encode_bits(val, IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP);
4692 val = u32_get_bits(pcap->vht_cap,
4693 IEEE80211_VHT_CAP_MAX_MPDU_MASK);
4694 bcap->he_6ghz_capa |=
4695 u32_encode_bits(val, IEEE80211_HE_6GHZ_CAP_MAX_MPDU_LEN);
4696 if (pcap->vht_cap & IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN)
4697 bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_RX_ANTPAT_CONS;
4698 if (pcap->vht_cap & IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN)
4699 bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_TX_ANTPAT_CONS;
4701 return cpu_to_le16(bcap->he_6ghz_capa);
4704 static void ath12k_mac_copy_he_cap(struct ath12k_band_cap *band_cap,
4705 int iftype, u8 num_tx_chains,
4706 struct ieee80211_sta_he_cap *he_cap)
4708 struct ieee80211_he_cap_elem *he_cap_elem = &he_cap->he_cap_elem;
4709 struct ieee80211_he_mcs_nss_supp *mcs_nss = &he_cap->he_mcs_nss_supp;
4711 he_cap->has_he = true;
4712 memcpy(he_cap_elem->mac_cap_info, band_cap->he_cap_info,
4713 sizeof(he_cap_elem->mac_cap_info));
4714 memcpy(he_cap_elem->phy_cap_info, band_cap->he_cap_phy_info,
4715 sizeof(he_cap_elem->phy_cap_info));
4717 he_cap_elem->mac_cap_info[1] &=
4718 IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_MASK;
4720 he_cap_elem->phy_cap_info[5] &=
4721 ~IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK;
4722 he_cap_elem->phy_cap_info[5] &=
4723 ~IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_MASK;
4724 he_cap_elem->phy_cap_info[5] |= num_tx_chains - 1;
4727 case NL80211_IFTYPE_AP:
4728 he_cap_elem->phy_cap_info[3] &=
4729 ~IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK;
4730 he_cap_elem->phy_cap_info[9] |=
4731 IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU;
4733 case NL80211_IFTYPE_STATION:
4734 he_cap_elem->mac_cap_info[0] &= ~IEEE80211_HE_MAC_CAP0_TWT_RES;
4735 he_cap_elem->mac_cap_info[0] |= IEEE80211_HE_MAC_CAP0_TWT_REQ;
4736 he_cap_elem->phy_cap_info[9] |=
4737 IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU;
4739 case NL80211_IFTYPE_MESH_POINT:
4740 ath12k_mac_filter_he_cap_mesh(he_cap_elem);
4744 mcs_nss->rx_mcs_80 = cpu_to_le16(band_cap->he_mcs & 0xffff);
4745 mcs_nss->tx_mcs_80 = cpu_to_le16(band_cap->he_mcs & 0xffff);
4746 mcs_nss->rx_mcs_160 = cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
4747 mcs_nss->tx_mcs_160 = cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
4748 mcs_nss->rx_mcs_80p80 = cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
4749 mcs_nss->tx_mcs_80p80 = cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
4751 memset(he_cap->ppe_thres, 0, sizeof(he_cap->ppe_thres));
4752 if (he_cap_elem->phy_cap_info[6] &
4753 IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT)
4754 ath12k_gen_ppe_thresh(&band_cap->he_ppet, he_cap->ppe_thres);
4758 ath12k_mac_copy_eht_mcs_nss(struct ath12k_band_cap *band_cap,
4759 struct ieee80211_eht_mcs_nss_supp *mcs_nss,
4760 const struct ieee80211_he_cap_elem *he_cap,
4761 const struct ieee80211_eht_cap_elem_fixed *eht_cap)
4763 if ((he_cap->phy_cap_info[0] &
4764 (IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G |
4765 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G |
4766 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G |
4767 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)) == 0)
4768 memcpy(&mcs_nss->only_20mhz, &band_cap->eht_mcs_20_only,
4769 sizeof(struct ieee80211_eht_mcs_nss_supp_20mhz_only));
4771 if (he_cap->phy_cap_info[0] &
4772 (IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G |
4773 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G))
4774 memcpy(&mcs_nss->bw._80, &band_cap->eht_mcs_80,
4775 sizeof(struct ieee80211_eht_mcs_nss_supp_bw));
4777 if (he_cap->phy_cap_info[0] &
4778 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
4779 memcpy(&mcs_nss->bw._160, &band_cap->eht_mcs_160,
4780 sizeof(struct ieee80211_eht_mcs_nss_supp_bw));
4782 if (eht_cap->phy_cap_info[0] & IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ)
4783 memcpy(&mcs_nss->bw._320, &band_cap->eht_mcs_320,
4784 sizeof(struct ieee80211_eht_mcs_nss_supp_bw));
4787 static void ath12k_mac_copy_eht_ppe_thresh(struct ath12k_wmi_ppe_threshold_arg *fw_ppet,
4788 struct ieee80211_sta_eht_cap *cap)
4790 u16 bit = IEEE80211_EHT_PPE_THRES_INFO_HEADER_SIZE;
4791 u8 i, nss, ru, ppet_bit_len_per_ru = IEEE80211_EHT_PPE_THRES_INFO_PPET_SIZE * 2;
4793 u8p_replace_bits(&cap->eht_ppe_thres[0], fw_ppet->numss_m1,
4794 IEEE80211_EHT_PPE_THRES_NSS_MASK);
4796 u16p_replace_bits((u16 *)&cap->eht_ppe_thres[0], fw_ppet->ru_bit_mask,
4797 IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK);
4799 for (nss = 0; nss <= fw_ppet->numss_m1; nss++) {
4801 ru < hweight16(IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK);
4805 if ((fw_ppet->ru_bit_mask & BIT(ru)) == 0)
4808 u32p_replace_bits(&val, fw_ppet->ppet16_ppet8_ru3_ru0[nss] >>
4809 (ru * ppet_bit_len_per_ru),
4810 GENMASK(ppet_bit_len_per_ru - 1, 0));
4812 for (i = 0; i < ppet_bit_len_per_ru; i++) {
4813 cap->eht_ppe_thres[bit / 8] |=
4814 (((val >> i) & 0x1) << ((bit % 8)));
4822 ath12k_mac_filter_eht_cap_mesh(struct ieee80211_eht_cap_elem_fixed
4827 m = IEEE80211_EHT_MAC_CAP0_EPCS_PRIO_ACCESS;
4828 eht_cap_elem->mac_cap_info[0] &= ~m;
4830 m = IEEE80211_EHT_PHY_CAP0_PARTIAL_BW_UL_MU_MIMO;
4831 eht_cap_elem->phy_cap_info[0] &= ~m;
4833 m = IEEE80211_EHT_PHY_CAP3_NG_16_MU_FEEDBACK |
4834 IEEE80211_EHT_PHY_CAP3_CODEBOOK_7_5_MU_FDBK |
4835 IEEE80211_EHT_PHY_CAP3_TRIG_MU_BF_PART_BW_FDBK |
4836 IEEE80211_EHT_PHY_CAP3_TRIG_CQI_FDBK;
4837 eht_cap_elem->phy_cap_info[3] &= ~m;
4839 m = IEEE80211_EHT_PHY_CAP4_PART_BW_DL_MU_MIMO |
4840 IEEE80211_EHT_PHY_CAP4_PSR_SR_SUPP |
4841 IEEE80211_EHT_PHY_CAP4_POWER_BOOST_FACT_SUPP |
4842 IEEE80211_EHT_PHY_CAP4_EHT_MU_PPDU_4_EHT_LTF_08_GI;
4843 eht_cap_elem->phy_cap_info[4] &= ~m;
4845 m = IEEE80211_EHT_PHY_CAP5_NON_TRIG_CQI_FEEDBACK |
4846 IEEE80211_EHT_PHY_CAP5_TX_LESS_242_TONE_RU_SUPP |
4847 IEEE80211_EHT_PHY_CAP5_RX_LESS_242_TONE_RU_SUPP |
4848 IEEE80211_EHT_PHY_CAP5_MAX_NUM_SUPP_EHT_LTF_MASK;
4849 eht_cap_elem->phy_cap_info[5] &= ~m;
4851 m = IEEE80211_EHT_PHY_CAP6_MAX_NUM_SUPP_EHT_LTF_MASK;
4852 eht_cap_elem->phy_cap_info[6] &= ~m;
4854 m = IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_80MHZ |
4855 IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_160MHZ |
4856 IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_320MHZ |
4857 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_80MHZ |
4858 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_160MHZ |
4859 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_320MHZ;
4860 eht_cap_elem->phy_cap_info[7] &= ~m;
4863 static void ath12k_mac_copy_eht_cap(struct ath12k *ar,
4864 struct ath12k_band_cap *band_cap,
4865 struct ieee80211_he_cap_elem *he_cap_elem,
4867 struct ieee80211_sta_eht_cap *eht_cap)
4869 struct ieee80211_eht_cap_elem_fixed *eht_cap_elem = &eht_cap->eht_cap_elem;
4871 memset(eht_cap, 0, sizeof(struct ieee80211_sta_eht_cap));
4873 if (!(test_bit(WMI_TLV_SERVICE_11BE, ar->ab->wmi_ab.svc_map)))
4876 eht_cap->has_eht = true;
4877 memcpy(eht_cap_elem->mac_cap_info, band_cap->eht_cap_mac_info,
4878 sizeof(eht_cap_elem->mac_cap_info));
4879 memcpy(eht_cap_elem->phy_cap_info, band_cap->eht_cap_phy_info,
4880 sizeof(eht_cap_elem->phy_cap_info));
4883 case NL80211_IFTYPE_AP:
4884 eht_cap_elem->phy_cap_info[0] &=
4885 ~IEEE80211_EHT_PHY_CAP0_242_TONE_RU_GT20MHZ;
4886 eht_cap_elem->phy_cap_info[4] &=
4887 ~IEEE80211_EHT_PHY_CAP4_PART_BW_DL_MU_MIMO;
4888 eht_cap_elem->phy_cap_info[5] &=
4889 ~IEEE80211_EHT_PHY_CAP5_TX_LESS_242_TONE_RU_SUPP;
4891 case NL80211_IFTYPE_STATION:
4892 eht_cap_elem->phy_cap_info[7] &=
4893 ~(IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_80MHZ |
4894 IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_160MHZ |
4895 IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_320MHZ);
4896 eht_cap_elem->phy_cap_info[7] &=
4897 ~(IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_80MHZ |
4898 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_160MHZ |
4899 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_320MHZ);
4901 case NL80211_IFTYPE_MESH_POINT:
4902 ath12k_mac_filter_eht_cap_mesh(eht_cap_elem);
4908 ath12k_mac_copy_eht_mcs_nss(band_cap, &eht_cap->eht_mcs_nss_supp,
4909 he_cap_elem, eht_cap_elem);
4911 if (eht_cap_elem->phy_cap_info[5] &
4912 IEEE80211_EHT_PHY_CAP5_PPE_THRESHOLD_PRESENT)
4913 ath12k_mac_copy_eht_ppe_thresh(&band_cap->eht_ppet, eht_cap);
4916 static int ath12k_mac_copy_sband_iftype_data(struct ath12k *ar,
4917 struct ath12k_pdev_cap *cap,
4918 struct ieee80211_sband_iftype_data *data,
4921 struct ath12k_band_cap *band_cap = &cap->band[band];
4924 for (i = 0; i < NUM_NL80211_IFTYPES; i++) {
4925 struct ieee80211_sta_he_cap *he_cap = &data[idx].he_cap;
4928 case NL80211_IFTYPE_STATION:
4929 case NL80211_IFTYPE_AP:
4930 case NL80211_IFTYPE_MESH_POINT:
4937 data[idx].types_mask = BIT(i);
4939 ath12k_mac_copy_he_cap(band_cap, i, ar->num_tx_chains, he_cap);
4940 if (band == NL80211_BAND_6GHZ) {
4941 data[idx].he_6ghz_capa.capa =
4942 ath12k_mac_setup_he_6ghz_cap(cap, band_cap);
4944 ath12k_mac_copy_eht_cap(ar, band_cap, &he_cap->he_cap_elem, i,
4945 &data[idx].eht_cap);
4952 static void ath12k_mac_setup_sband_iftype_data(struct ath12k *ar,
4953 struct ath12k_pdev_cap *cap)
4955 struct ieee80211_supported_band *sband;
4956 enum nl80211_band band;
4959 if (cap->supported_bands & WMI_HOST_WLAN_2G_CAP) {
4960 band = NL80211_BAND_2GHZ;
4961 count = ath12k_mac_copy_sband_iftype_data(ar, cap,
4962 ar->mac.iftype[band],
4964 sband = &ar->mac.sbands[band];
4965 _ieee80211_set_sband_iftype_data(sband, ar->mac.iftype[band],
4969 if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP) {
4970 band = NL80211_BAND_5GHZ;
4971 count = ath12k_mac_copy_sband_iftype_data(ar, cap,
4972 ar->mac.iftype[band],
4974 sband = &ar->mac.sbands[band];
4975 _ieee80211_set_sband_iftype_data(sband, ar->mac.iftype[band],
4979 if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP &&
4980 ar->supports_6ghz) {
4981 band = NL80211_BAND_6GHZ;
4982 count = ath12k_mac_copy_sband_iftype_data(ar, cap,
4983 ar->mac.iftype[band],
4985 sband = &ar->mac.sbands[band];
4986 _ieee80211_set_sband_iftype_data(sband, ar->mac.iftype[band],
4991 static int __ath12k_set_antenna(struct ath12k *ar, u32 tx_ant, u32 rx_ant)
4995 lockdep_assert_held(&ar->conf_mutex);
4997 if (ath12k_check_chain_mask(ar, tx_ant, true))
5000 if (ath12k_check_chain_mask(ar, rx_ant, false))
5003 ar->cfg_tx_chainmask = tx_ant;
5004 ar->cfg_rx_chainmask = rx_ant;
5006 if (ar->state != ATH12K_STATE_ON &&
5007 ar->state != ATH12K_STATE_RESTARTED)
5010 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_TX_CHAIN_MASK,
5011 tx_ant, ar->pdev->pdev_id);
5013 ath12k_warn(ar->ab, "failed to set tx-chainmask: %d, req 0x%x\n",
5018 ar->num_tx_chains = hweight32(tx_ant);
5020 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_RX_CHAIN_MASK,
5021 rx_ant, ar->pdev->pdev_id);
5023 ath12k_warn(ar->ab, "failed to set rx-chainmask: %d, req 0x%x\n",
5028 ar->num_rx_chains = hweight32(rx_ant);
5030 /* Reload HT/VHT/HE capability */
5031 ath12k_mac_setup_ht_vht_cap(ar, &ar->pdev->cap, NULL);
5032 ath12k_mac_setup_sband_iftype_data(ar, &ar->pdev->cap);
5037 static void ath12k_mgmt_over_wmi_tx_drop(struct ath12k *ar, struct sk_buff *skb)
5041 ieee80211_free_txskb(ath12k_ar_to_hw(ar), skb);
5043 num_mgmt = atomic_dec_if_positive(&ar->num_pending_mgmt_tx);
5049 wake_up(&ar->txmgmt_empty_waitq);
5052 int ath12k_mac_tx_mgmt_pending_free(int buf_id, void *skb, void *ctx)
5054 struct sk_buff *msdu = skb;
5055 struct ieee80211_tx_info *info;
5056 struct ath12k *ar = ctx;
5057 struct ath12k_base *ab = ar->ab;
5059 spin_lock_bh(&ar->txmgmt_idr_lock);
5060 idr_remove(&ar->txmgmt_idr, buf_id);
5061 spin_unlock_bh(&ar->txmgmt_idr_lock);
5062 dma_unmap_single(ab->dev, ATH12K_SKB_CB(msdu)->paddr, msdu->len,
5065 info = IEEE80211_SKB_CB(msdu);
5066 memset(&info->status, 0, sizeof(info->status));
5068 ath12k_mgmt_over_wmi_tx_drop(ar, skb);
5073 static int ath12k_mac_vif_txmgmt_idr_remove(int buf_id, void *skb, void *ctx)
5075 struct ieee80211_vif *vif = ctx;
5076 struct ath12k_skb_cb *skb_cb = ATH12K_SKB_CB(skb);
5077 struct sk_buff *msdu = skb;
5078 struct ath12k *ar = skb_cb->ar;
5079 struct ath12k_base *ab = ar->ab;
5081 if (skb_cb->vif == vif) {
5082 spin_lock_bh(&ar->txmgmt_idr_lock);
5083 idr_remove(&ar->txmgmt_idr, buf_id);
5084 spin_unlock_bh(&ar->txmgmt_idr_lock);
5085 dma_unmap_single(ab->dev, skb_cb->paddr, msdu->len,
5092 static int ath12k_mac_mgmt_tx_wmi(struct ath12k *ar, struct ath12k_vif *arvif,
5093 struct sk_buff *skb)
5095 struct ath12k_base *ab = ar->ab;
5096 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
5097 struct ieee80211_tx_info *info;
5102 ATH12K_SKB_CB(skb)->ar = ar;
5103 spin_lock_bh(&ar->txmgmt_idr_lock);
5104 buf_id = idr_alloc(&ar->txmgmt_idr, skb, 0,
5105 ATH12K_TX_MGMT_NUM_PENDING_MAX, GFP_ATOMIC);
5106 spin_unlock_bh(&ar->txmgmt_idr_lock);
5110 info = IEEE80211_SKB_CB(skb);
5111 if (!(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP)) {
5112 if ((ieee80211_is_action(hdr->frame_control) ||
5113 ieee80211_is_deauth(hdr->frame_control) ||
5114 ieee80211_is_disassoc(hdr->frame_control)) &&
5115 ieee80211_has_protected(hdr->frame_control)) {
5116 skb_put(skb, IEEE80211_CCMP_MIC_LEN);
5120 paddr = dma_map_single(ab->dev, skb->data, skb->len, DMA_TO_DEVICE);
5121 if (dma_mapping_error(ab->dev, paddr)) {
5122 ath12k_warn(ab, "failed to DMA map mgmt Tx buffer\n");
5127 ATH12K_SKB_CB(skb)->paddr = paddr;
5129 ret = ath12k_wmi_mgmt_send(ar, arvif->vdev_id, buf_id, skb);
5131 ath12k_warn(ar->ab, "failed to send mgmt frame: %d\n", ret);
5138 dma_unmap_single(ab->dev, ATH12K_SKB_CB(skb)->paddr,
5139 skb->len, DMA_TO_DEVICE);
5141 spin_lock_bh(&ar->txmgmt_idr_lock);
5142 idr_remove(&ar->txmgmt_idr, buf_id);
5143 spin_unlock_bh(&ar->txmgmt_idr_lock);
5148 static void ath12k_mgmt_over_wmi_tx_purge(struct ath12k *ar)
5150 struct sk_buff *skb;
5152 while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL)
5153 ath12k_mgmt_over_wmi_tx_drop(ar, skb);
5156 static void ath12k_mgmt_over_wmi_tx_work(struct work_struct *work)
5158 struct ath12k *ar = container_of(work, struct ath12k, wmi_mgmt_tx_work);
5159 struct ath12k_skb_cb *skb_cb;
5160 struct ath12k_vif *arvif;
5161 struct sk_buff *skb;
5164 while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL) {
5165 skb_cb = ATH12K_SKB_CB(skb);
5167 ath12k_warn(ar->ab, "no vif found for mgmt frame\n");
5168 ath12k_mgmt_over_wmi_tx_drop(ar, skb);
5172 arvif = ath12k_vif_to_arvif(skb_cb->vif);
5174 if (ar->allocated_vdev_map & (1LL << arvif->vdev_id)) {
5175 ret = ath12k_mac_mgmt_tx_wmi(ar, arvif, skb);
5177 ath12k_warn(ar->ab, "failed to tx mgmt frame, vdev_id %d :%d\n",
5178 arvif->vdev_id, ret);
5179 ath12k_mgmt_over_wmi_tx_drop(ar, skb);
5183 "dropping mgmt frame for vdev %d, is_started %d\n",
5186 ath12k_mgmt_over_wmi_tx_drop(ar, skb);
5191 static int ath12k_mac_mgmt_tx(struct ath12k *ar, struct sk_buff *skb,
5194 struct sk_buff_head *q = &ar->wmi_mgmt_tx_queue;
5196 if (test_bit(ATH12K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags))
5199 /* Drop probe response packets when the pending management tx
5200 * count has reached a certain threshold, so as to prioritize
5201 * other mgmt packets like auth and assoc to be sent on time
5202 * for establishing successful connections.
5205 atomic_read(&ar->num_pending_mgmt_tx) > ATH12K_PRB_RSP_DROP_THRESHOLD) {
5207 "dropping probe response as pending queue is almost full\n");
5211 if (skb_queue_len_lockless(q) >= ATH12K_TX_MGMT_NUM_PENDING_MAX) {
5212 ath12k_warn(ar->ab, "mgmt tx queue is full\n");
5216 skb_queue_tail(q, skb);
5217 atomic_inc(&ar->num_pending_mgmt_tx);
5218 ieee80211_queue_work(ath12k_ar_to_hw(ar), &ar->wmi_mgmt_tx_work);
5223 static void ath12k_mac_add_p2p_noa_ie(struct ath12k *ar,
5224 struct ieee80211_vif *vif,
5225 struct sk_buff *skb,
5228 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
5230 if (likely(!is_prb_rsp))
5233 spin_lock_bh(&ar->data_lock);
5235 if (arvif->u.ap.noa_data &&
5236 !pskb_expand_head(skb, 0, arvif->u.ap.noa_len,
5238 skb_put_data(skb, arvif->u.ap.noa_data,
5239 arvif->u.ap.noa_len);
5241 spin_unlock_bh(&ar->data_lock);
5244 static void ath12k_mac_op_tx(struct ieee80211_hw *hw,
5245 struct ieee80211_tx_control *control,
5246 struct sk_buff *skb)
5248 struct ath12k_skb_cb *skb_cb = ATH12K_SKB_CB(skb);
5249 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
5250 struct ieee80211_vif *vif = info->control.vif;
5251 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
5252 struct ath12k *ar = arvif->ar;
5253 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
5254 struct ieee80211_key_conf *key = info->control.hw_key;
5255 u32 info_flags = info->flags;
5259 memset(skb_cb, 0, sizeof(*skb_cb));
5263 skb_cb->cipher = key->cipher;
5264 skb_cb->flags |= ATH12K_SKB_CIPHER_SET;
5267 is_prb_rsp = ieee80211_is_probe_resp(hdr->frame_control);
5269 if (info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP) {
5270 skb_cb->flags |= ATH12K_SKB_HW_80211_ENCAP;
5271 } else if (ieee80211_is_mgmt(hdr->frame_control)) {
5272 ret = ath12k_mac_mgmt_tx(ar, skb, is_prb_rsp);
5274 ath12k_warn(ar->ab, "failed to queue management frame %d\n",
5276 ieee80211_free_txskb(hw, skb);
5281 /* This is case only for P2P_GO */
5282 if (vif->type == NL80211_IFTYPE_AP && vif->p2p)
5283 ath12k_mac_add_p2p_noa_ie(ar, vif, skb, is_prb_rsp);
5285 ret = ath12k_dp_tx(ar, arvif, skb);
5287 ath12k_warn(ar->ab, "failed to transmit frame %d\n", ret);
5288 ieee80211_free_txskb(hw, skb);
5292 void ath12k_mac_drain_tx(struct ath12k *ar)
5294 /* make sure rcu-protected mac80211 tx path itself is drained */
5297 cancel_work_sync(&ar->wmi_mgmt_tx_work);
5298 ath12k_mgmt_over_wmi_tx_purge(ar);
5301 static int ath12k_mac_config_mon_status_default(struct ath12k *ar, bool enable)
5304 /* TODO: Need to support new monitor mode */
5307 static void ath12k_mac_wait_reconfigure(struct ath12k_base *ab)
5309 int recovery_start_count;
5314 recovery_start_count = atomic_inc_return(&ab->recovery_start_count);
5316 ath12k_dbg(ab, ATH12K_DBG_MAC, "recovery start count %d\n", recovery_start_count);
5318 if (recovery_start_count == ab->num_radios) {
5319 complete(&ab->recovery_start);
5320 ath12k_dbg(ab, ATH12K_DBG_MAC, "recovery started success\n");
5323 ath12k_dbg(ab, ATH12K_DBG_MAC, "waiting reconfigure...\n");
5325 wait_for_completion_timeout(&ab->reconfigure_complete,
5326 ATH12K_RECONFIGURE_TIMEOUT_HZ);
5329 static int ath12k_mac_start(struct ath12k *ar)
5331 struct ath12k_base *ab = ar->ab;
5332 struct ath12k_pdev *pdev = ar->pdev;
5335 mutex_lock(&ar->conf_mutex);
5337 switch (ar->state) {
5338 case ATH12K_STATE_OFF:
5339 ar->state = ATH12K_STATE_ON;
5341 case ATH12K_STATE_RESTARTING:
5342 ar->state = ATH12K_STATE_RESTARTED;
5343 ath12k_mac_wait_reconfigure(ab);
5345 case ATH12K_STATE_RESTARTED:
5346 case ATH12K_STATE_WEDGED:
5347 case ATH12K_STATE_ON:
5353 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_PMF_QOS,
5357 ath12k_err(ab, "failed to enable PMF QOS: (%d\n", ret);
5361 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_DYNAMIC_BW, 1,
5364 ath12k_err(ab, "failed to enable dynamic bw: %d\n", ret);
5368 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_ARP_AC_OVERRIDE,
5371 ath12k_err(ab, "failed to set ac override for ARP: %d\n",
5376 ret = ath12k_wmi_send_dfs_phyerr_offload_enable_cmd(ar, pdev->pdev_id);
5378 ath12k_err(ab, "failed to offload radar detection: %d\n",
5383 ret = ath12k_dp_tx_htt_h2t_ppdu_stats_req(ar,
5384 HTT_PPDU_STATS_TAG_DEFAULT);
5386 ath12k_err(ab, "failed to req ppdu stats: %d\n", ret);
5390 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_MESH_MCAST_ENABLE,
5394 ath12k_err(ab, "failed to enable MESH MCAST ENABLE: (%d\n", ret);
5398 __ath12k_set_antenna(ar, ar->cfg_tx_chainmask, ar->cfg_rx_chainmask);
5400 /* TODO: Do we need to enable ANI? */
5402 ath12k_reg_update_chan_list(ar);
5404 ar->num_started_vdevs = 0;
5405 ar->num_created_vdevs = 0;
5407 ar->allocated_vdev_map = 0;
5409 /* Configure monitor status ring with default rx_filter to get rx status
5410 * such as rssi, rx_duration.
5412 ret = ath12k_mac_config_mon_status_default(ar, true);
5413 if (ret && (ret != -EOPNOTSUPP)) {
5414 ath12k_err(ab, "failed to configure monitor status ring with default rx_filter: (%d)\n",
5419 if (ret == -EOPNOTSUPP)
5420 ath12k_dbg(ab, ATH12K_DBG_MAC,
5421 "monitor status config is not yet supported");
5423 /* Configure the hash seed for hash based reo dest ring selection */
5424 ath12k_wmi_pdev_lro_cfg(ar, ar->pdev->pdev_id);
5426 /* allow device to enter IMPS */
5427 if (ab->hw_params->idle_ps) {
5428 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_IDLE_PS_CONFIG,
5431 ath12k_err(ab, "failed to enable idle ps: %d\n", ret);
5436 mutex_unlock(&ar->conf_mutex);
5438 rcu_assign_pointer(ab->pdevs_active[ar->pdev_idx],
5439 &ab->pdevs[ar->pdev_idx]);
5443 ar->state = ATH12K_STATE_OFF;
5444 mutex_unlock(&ar->conf_mutex);
5449 static int ath12k_mac_op_start(struct ieee80211_hw *hw)
5451 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
5452 struct ath12k *ar = ath12k_ah_to_ar(ah);
5453 struct ath12k_base *ab = ar->ab;
5456 ath12k_mac_drain_tx(ar);
5458 ret = ath12k_mac_start(ar);
5460 ath12k_err(ab, "fail to start mac operations in pdev idx %d ret %d\n",
5468 int ath12k_mac_rfkill_config(struct ath12k *ar)
5470 struct ath12k_base *ab = ar->ab;
5474 if (ab->hw_params->rfkill_pin == 0)
5477 ath12k_dbg(ab, ATH12K_DBG_MAC,
5478 "mac rfkill_pin %d rfkill_cfg %d rfkill_on_level %d",
5479 ab->hw_params->rfkill_pin, ab->hw_params->rfkill_cfg,
5480 ab->hw_params->rfkill_on_level);
5482 param = u32_encode_bits(ab->hw_params->rfkill_on_level,
5483 WMI_RFKILL_CFG_RADIO_LEVEL) |
5484 u32_encode_bits(ab->hw_params->rfkill_pin,
5485 WMI_RFKILL_CFG_GPIO_PIN_NUM) |
5486 u32_encode_bits(ab->hw_params->rfkill_cfg,
5487 WMI_RFKILL_CFG_PIN_AS_GPIO);
5489 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_HW_RFKILL_CONFIG,
5490 param, ar->pdev->pdev_id);
5493 "failed to set rfkill config 0x%x: %d\n",
5501 int ath12k_mac_rfkill_enable_radio(struct ath12k *ar, bool enable)
5503 enum wmi_rfkill_enable_radio param;
5507 param = WMI_RFKILL_ENABLE_RADIO_ON;
5509 param = WMI_RFKILL_ENABLE_RADIO_OFF;
5511 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac %d rfkill enable %d",
5512 ar->pdev_idx, param);
5514 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_RFKILL_ENABLE,
5515 param, ar->pdev->pdev_id);
5517 ath12k_warn(ar->ab, "failed to set rfkill enable param %d: %d\n",
5525 static void ath12k_mac_stop(struct ath12k *ar)
5527 struct htt_ppdu_stats_info *ppdu_stats, *tmp;
5530 mutex_lock(&ar->conf_mutex);
5531 ret = ath12k_mac_config_mon_status_default(ar, false);
5532 if (ret && (ret != -EOPNOTSUPP))
5533 ath12k_err(ar->ab, "failed to clear rx_filter for monitor status ring: (%d)\n",
5536 clear_bit(ATH12K_CAC_RUNNING, &ar->dev_flags);
5537 ar->state = ATH12K_STATE_OFF;
5538 mutex_unlock(&ar->conf_mutex);
5540 cancel_delayed_work_sync(&ar->scan.timeout);
5541 cancel_work_sync(&ar->regd_update_work);
5542 cancel_work_sync(&ar->ab->rfkill_work);
5544 spin_lock_bh(&ar->data_lock);
5545 list_for_each_entry_safe(ppdu_stats, tmp, &ar->ppdu_stats_info, list) {
5546 list_del(&ppdu_stats->list);
5549 spin_unlock_bh(&ar->data_lock);
5551 rcu_assign_pointer(ar->ab->pdevs_active[ar->pdev_idx], NULL);
5555 atomic_set(&ar->num_pending_mgmt_tx, 0);
5558 static void ath12k_mac_op_stop(struct ieee80211_hw *hw)
5560 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
5561 struct ath12k *ar = ath12k_ah_to_ar(ah);
5563 ath12k_mac_drain_tx(ar);
5565 ath12k_mac_stop(ar);
5569 ath12k_mac_get_vdev_stats_id(struct ath12k_vif *arvif)
5571 struct ath12k_base *ab = arvif->ar->ab;
5572 u8 vdev_stats_id = 0;
5575 if (ab->free_vdev_stats_id_map & (1LL << vdev_stats_id)) {
5577 if (vdev_stats_id >= ATH12K_MAX_VDEV_STATS_ID) {
5578 vdev_stats_id = ATH12K_INVAL_VDEV_STATS_ID;
5582 ab->free_vdev_stats_id_map |= (1LL << vdev_stats_id);
5585 } while (vdev_stats_id);
5587 arvif->vdev_stats_id = vdev_stats_id;
5588 return vdev_stats_id;
5591 static void ath12k_mac_setup_vdev_create_arg(struct ath12k_vif *arvif,
5592 struct ath12k_wmi_vdev_create_arg *arg)
5594 struct ath12k *ar = arvif->ar;
5595 struct ath12k_pdev *pdev = ar->pdev;
5597 arg->if_id = arvif->vdev_id;
5598 arg->type = arvif->vdev_type;
5599 arg->subtype = arvif->vdev_subtype;
5600 arg->pdev_id = pdev->pdev_id;
5602 if (pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) {
5603 arg->chains[NL80211_BAND_2GHZ].tx = ar->num_tx_chains;
5604 arg->chains[NL80211_BAND_2GHZ].rx = ar->num_rx_chains;
5606 if (pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) {
5607 arg->chains[NL80211_BAND_5GHZ].tx = ar->num_tx_chains;
5608 arg->chains[NL80211_BAND_5GHZ].rx = ar->num_rx_chains;
5610 if (pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP &&
5611 ar->supports_6ghz) {
5612 arg->chains[NL80211_BAND_6GHZ].tx = ar->num_tx_chains;
5613 arg->chains[NL80211_BAND_6GHZ].rx = ar->num_rx_chains;
5616 arg->if_stats_id = ath12k_mac_get_vdev_stats_id(arvif);
5620 ath12k_mac_prepare_he_mode(struct ath12k_pdev *pdev, u32 viftype)
5622 struct ath12k_pdev_cap *pdev_cap = &pdev->cap;
5623 struct ath12k_band_cap *cap_band = NULL;
5624 u32 *hecap_phy_ptr = NULL;
5627 if (pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP)
5628 cap_band = &pdev_cap->band[NL80211_BAND_2GHZ];
5630 cap_band = &pdev_cap->band[NL80211_BAND_5GHZ];
5632 hecap_phy_ptr = &cap_band->he_cap_phy_info[0];
5634 hemode = u32_encode_bits(HE_SU_BFEE_ENABLE, HE_MODE_SU_TX_BFEE) |
5635 u32_encode_bits(HECAP_PHY_SUBFMR_GET(hecap_phy_ptr),
5636 HE_MODE_SU_TX_BFER) |
5637 u32_encode_bits(HECAP_PHY_ULMUMIMO_GET(hecap_phy_ptr),
5640 /* TODO: WDS and other modes */
5641 if (viftype == NL80211_IFTYPE_AP) {
5642 hemode |= u32_encode_bits(HECAP_PHY_MUBFMR_GET(hecap_phy_ptr),
5643 HE_MODE_MU_TX_BFER) |
5644 u32_encode_bits(HE_DL_MUOFDMA_ENABLE, HE_MODE_DL_OFDMA) |
5645 u32_encode_bits(HE_UL_MUOFDMA_ENABLE, HE_MODE_UL_OFDMA);
5647 hemode |= u32_encode_bits(HE_MU_BFEE_ENABLE, HE_MODE_MU_TX_BFEE);
5653 static int ath12k_set_he_mu_sounding_mode(struct ath12k *ar,
5654 struct ath12k_vif *arvif)
5656 u32 param_id, param_value;
5657 struct ath12k_base *ab = ar->ab;
5660 param_id = WMI_VDEV_PARAM_SET_HEMU_MODE;
5661 param_value = ath12k_mac_prepare_he_mode(ar->pdev, arvif->vif->type);
5662 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
5663 param_id, param_value);
5665 ath12k_warn(ab, "failed to set vdev %d HE MU mode: %d param_value %x\n",
5666 arvif->vdev_id, ret, param_value);
5669 param_id = WMI_VDEV_PARAM_SET_HE_SOUNDING_MODE;
5671 u32_encode_bits(HE_VHT_SOUNDING_MODE_ENABLE, HE_VHT_SOUNDING_MODE) |
5672 u32_encode_bits(HE_TRIG_NONTRIG_SOUNDING_MODE_ENABLE,
5673 HE_TRIG_NONTRIG_SOUNDING_MODE);
5674 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
5675 param_id, param_value);
5677 ath12k_warn(ab, "failed to set vdev %d HE MU mode: %d\n",
5678 arvif->vdev_id, ret);
5684 static void ath12k_mac_update_vif_offload(struct ath12k_vif *arvif)
5686 struct ieee80211_vif *vif = arvif->vif;
5687 struct ath12k *ar = arvif->ar;
5688 struct ath12k_base *ab = ar->ab;
5689 u32 param_id, param_value;
5692 param_id = WMI_VDEV_PARAM_TX_ENCAP_TYPE;
5693 if (vif->type != NL80211_IFTYPE_STATION &&
5694 vif->type != NL80211_IFTYPE_AP)
5695 vif->offload_flags &= ~(IEEE80211_OFFLOAD_ENCAP_ENABLED |
5696 IEEE80211_OFFLOAD_DECAP_ENABLED);
5698 if (vif->offload_flags & IEEE80211_OFFLOAD_ENCAP_ENABLED)
5699 arvif->tx_encap_type = ATH12K_HW_TXRX_ETHERNET;
5700 else if (test_bit(ATH12K_FLAG_RAW_MODE, &ab->dev_flags))
5701 arvif->tx_encap_type = ATH12K_HW_TXRX_RAW;
5703 arvif->tx_encap_type = ATH12K_HW_TXRX_NATIVE_WIFI;
5705 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
5706 param_id, arvif->tx_encap_type);
5708 ath12k_warn(ab, "failed to set vdev %d tx encap mode: %d\n",
5709 arvif->vdev_id, ret);
5710 vif->offload_flags &= ~IEEE80211_OFFLOAD_ENCAP_ENABLED;
5713 param_id = WMI_VDEV_PARAM_RX_DECAP_TYPE;
5714 if (vif->offload_flags & IEEE80211_OFFLOAD_DECAP_ENABLED)
5715 param_value = ATH12K_HW_TXRX_ETHERNET;
5716 else if (test_bit(ATH12K_FLAG_RAW_MODE, &ab->dev_flags))
5717 param_value = ATH12K_HW_TXRX_RAW;
5719 param_value = ATH12K_HW_TXRX_NATIVE_WIFI;
5721 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
5722 param_id, param_value);
5724 ath12k_warn(ab, "failed to set vdev %d rx decap mode: %d\n",
5725 arvif->vdev_id, ret);
5726 vif->offload_flags &= ~IEEE80211_OFFLOAD_DECAP_ENABLED;
5730 static void ath12k_mac_op_update_vif_offload(struct ieee80211_hw *hw,
5731 struct ieee80211_vif *vif)
5733 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
5735 ath12k_mac_update_vif_offload(arvif);
5738 static int ath12k_mac_op_add_interface(struct ieee80211_hw *hw,
5739 struct ieee80211_vif *vif)
5741 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
5743 struct ath12k_base *ab;
5744 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
5745 struct ath12k_wmi_vdev_create_arg vdev_arg = {0};
5746 struct ath12k_wmi_peer_create_arg peer_param;
5747 u32 param_id, param_value;
5753 vif->driver_flags |= IEEE80211_VIF_SUPPORTS_UAPSD;
5755 ar = ath12k_ah_to_ar(ah);
5758 mutex_lock(&ar->conf_mutex);
5760 if (vif->type == NL80211_IFTYPE_AP &&
5761 ar->num_peers > (ar->max_num_peers - 1)) {
5762 ath12k_warn(ab, "failed to create vdev due to insufficient peer entry resource in firmware\n");
5767 if (ar->num_created_vdevs > (TARGET_NUM_VDEVS - 1)) {
5768 ath12k_warn(ab, "failed to create vdev, reached max vdev limit %d\n",
5774 memset(arvif, 0, sizeof(*arvif));
5779 INIT_LIST_HEAD(&arvif->list);
5781 /* Should we initialize any worker to handle connection loss indication
5782 * from firmware in sta mode?
5785 for (i = 0; i < ARRAY_SIZE(arvif->bitrate_mask.control); i++) {
5786 arvif->bitrate_mask.control[i].legacy = 0xffffffff;
5787 memset(arvif->bitrate_mask.control[i].ht_mcs, 0xff,
5788 sizeof(arvif->bitrate_mask.control[i].ht_mcs));
5789 memset(arvif->bitrate_mask.control[i].vht_mcs, 0xff,
5790 sizeof(arvif->bitrate_mask.control[i].vht_mcs));
5793 bit = __ffs64(ab->free_vdev_map);
5795 arvif->vdev_id = bit;
5796 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE;
5798 switch (vif->type) {
5799 case NL80211_IFTYPE_UNSPECIFIED:
5800 case NL80211_IFTYPE_STATION:
5801 arvif->vdev_type = WMI_VDEV_TYPE_STA;
5804 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_CLIENT;
5807 case NL80211_IFTYPE_MESH_POINT:
5808 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_MESH_11S;
5810 case NL80211_IFTYPE_AP:
5811 arvif->vdev_type = WMI_VDEV_TYPE_AP;
5814 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_GO;
5817 case NL80211_IFTYPE_MONITOR:
5818 arvif->vdev_type = WMI_VDEV_TYPE_MONITOR;
5819 ar->monitor_vdev_id = bit;
5821 case NL80211_IFTYPE_P2P_DEVICE:
5822 arvif->vdev_type = WMI_VDEV_TYPE_STA;
5823 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_DEVICE;
5830 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac add interface id %d type %d subtype %d map %llx\n",
5831 arvif->vdev_id, arvif->vdev_type, arvif->vdev_subtype,
5834 vif->cab_queue = arvif->vdev_id % (ATH12K_HW_MAX_QUEUES - 1);
5835 for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++)
5836 vif->hw_queue[i] = i % (ATH12K_HW_MAX_QUEUES - 1);
5838 ath12k_mac_setup_vdev_create_arg(arvif, &vdev_arg);
5840 ret = ath12k_wmi_vdev_create(ar, vif->addr, &vdev_arg);
5842 ath12k_warn(ab, "failed to create WMI vdev %d: %d\n",
5843 arvif->vdev_id, ret);
5847 ar->num_created_vdevs++;
5848 ath12k_dbg(ab, ATH12K_DBG_MAC, "vdev %pM created, vdev_id %d\n",
5849 vif->addr, arvif->vdev_id);
5850 ar->allocated_vdev_map |= 1LL << arvif->vdev_id;
5851 ab->free_vdev_map &= ~(1LL << arvif->vdev_id);
5853 spin_lock_bh(&ar->data_lock);
5854 list_add(&arvif->list, &ar->arvifs);
5855 spin_unlock_bh(&ar->data_lock);
5857 ath12k_mac_update_vif_offload(arvif);
5859 nss = hweight32(ar->cfg_tx_chainmask) ? : 1;
5860 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
5861 WMI_VDEV_PARAM_NSS, nss);
5863 ath12k_warn(ab, "failed to set vdev %d chainmask 0x%x, nss %d :%d\n",
5864 arvif->vdev_id, ar->cfg_tx_chainmask, nss, ret);
5868 switch (arvif->vdev_type) {
5869 case WMI_VDEV_TYPE_AP:
5870 peer_param.vdev_id = arvif->vdev_id;
5871 peer_param.peer_addr = vif->addr;
5872 peer_param.peer_type = WMI_PEER_TYPE_DEFAULT;
5873 ret = ath12k_peer_create(ar, arvif, NULL, &peer_param);
5875 ath12k_warn(ab, "failed to vdev %d create peer for AP: %d\n",
5876 arvif->vdev_id, ret);
5880 ret = ath12k_mac_set_kickout(arvif);
5882 ath12k_warn(ar->ab, "failed to set vdev %i kickout parameters: %d\n",
5883 arvif->vdev_id, ret);
5887 case WMI_VDEV_TYPE_STA:
5888 param_id = WMI_STA_PS_PARAM_RX_WAKE_POLICY;
5889 param_value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
5890 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
5891 param_id, param_value);
5893 ath12k_warn(ar->ab, "failed to set vdev %d RX wake policy: %d\n",
5894 arvif->vdev_id, ret);
5898 param_id = WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD;
5899 param_value = WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS;
5900 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
5901 param_id, param_value);
5903 ath12k_warn(ar->ab, "failed to set vdev %d TX wake threshold: %d\n",
5904 arvif->vdev_id, ret);
5908 param_id = WMI_STA_PS_PARAM_PSPOLL_COUNT;
5909 param_value = WMI_STA_PS_PSPOLL_COUNT_NO_MAX;
5910 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
5911 param_id, param_value);
5913 ath12k_warn(ar->ab, "failed to set vdev %d pspoll count: %d\n",
5914 arvif->vdev_id, ret);
5918 ret = ath12k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id, false);
5920 ath12k_warn(ar->ab, "failed to disable vdev %d ps mode: %d\n",
5921 arvif->vdev_id, ret);
5929 arvif->txpower = vif->bss_conf.txpower;
5930 ret = ath12k_mac_txpower_recalc(ar);
5934 param_id = WMI_VDEV_PARAM_RTS_THRESHOLD;
5935 param_value = hw->wiphy->rts_threshold;
5936 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
5937 param_id, param_value);
5939 ath12k_warn(ar->ab, "failed to set rts threshold for vdev %d: %d\n",
5940 arvif->vdev_id, ret);
5943 ath12k_dp_vdev_tx_attach(ar, arvif);
5945 if (vif->type != NL80211_IFTYPE_MONITOR && ar->monitor_conf_enabled)
5946 ath12k_mac_monitor_vdev_create(ar);
5948 mutex_unlock(&ar->conf_mutex);
5953 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
5954 reinit_completion(&ar->peer_delete_done);
5956 ret = ath12k_wmi_send_peer_delete_cmd(ar, vif->addr,
5959 ath12k_warn(ar->ab, "failed to delete peer vdev_id %d addr %pM\n",
5960 arvif->vdev_id, vif->addr);
5964 ret = ath12k_wait_for_peer_delete_done(ar, arvif->vdev_id,
5973 ath12k_wmi_vdev_delete(ar, arvif->vdev_id);
5974 ar->num_created_vdevs--;
5975 ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id);
5976 ab->free_vdev_map |= 1LL << arvif->vdev_id;
5977 ab->free_vdev_stats_id_map &= ~(1LL << arvif->vdev_stats_id);
5978 spin_lock_bh(&ar->data_lock);
5979 list_del(&arvif->list);
5980 spin_unlock_bh(&ar->data_lock);
5983 mutex_unlock(&ar->conf_mutex);
5988 static void ath12k_mac_vif_unref(struct ath12k_dp *dp, struct ieee80211_vif *vif)
5990 struct ath12k_tx_desc_info *tx_desc_info;
5991 struct ath12k_skb_cb *skb_cb;
5992 struct sk_buff *skb;
5995 for (i = 0; i < ATH12K_HW_MAX_QUEUES; i++) {
5996 spin_lock_bh(&dp->tx_desc_lock[i]);
5998 list_for_each_entry(tx_desc_info, &dp->tx_desc_used_list[i],
6000 skb = tx_desc_info->skb;
6004 skb_cb = ATH12K_SKB_CB(skb);
6005 if (skb_cb->vif == vif)
6009 spin_unlock_bh(&dp->tx_desc_lock[i]);
6013 static void ath12k_mac_op_remove_interface(struct ieee80211_hw *hw,
6014 struct ieee80211_vif *vif)
6016 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
6018 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
6019 struct ath12k_base *ab;
6020 unsigned long time_left;
6023 ar = ath12k_ah_to_ar(ah);
6026 mutex_lock(&ar->conf_mutex);
6028 ath12k_dbg(ab, ATH12K_DBG_MAC, "mac remove interface (vdev %d)\n",
6031 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
6032 ret = ath12k_peer_delete(ar, arvif->vdev_id, vif->addr);
6034 ath12k_warn(ab, "failed to submit AP self-peer removal on vdev %d: %d\n",
6035 arvif->vdev_id, ret);
6038 reinit_completion(&ar->vdev_delete_done);
6040 ret = ath12k_wmi_vdev_delete(ar, arvif->vdev_id);
6042 ath12k_warn(ab, "failed to delete WMI vdev %d: %d\n",
6043 arvif->vdev_id, ret);
6047 time_left = wait_for_completion_timeout(&ar->vdev_delete_done,
6048 ATH12K_VDEV_DELETE_TIMEOUT_HZ);
6049 if (time_left == 0) {
6050 ath12k_warn(ab, "Timeout in receiving vdev delete response\n");
6054 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
6055 ar->monitor_vdev_id = -1;
6056 ar->monitor_vdev_created = false;
6057 } else if (ar->monitor_vdev_created && !ar->monitor_started) {
6058 ret = ath12k_mac_monitor_vdev_delete(ar);
6061 ab->free_vdev_map |= 1LL << (arvif->vdev_id);
6062 ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id);
6063 ab->free_vdev_stats_id_map &= ~(1LL << arvif->vdev_stats_id);
6064 ar->num_created_vdevs--;
6066 ath12k_dbg(ab, ATH12K_DBG_MAC, "vdev %pM deleted, vdev_id %d\n",
6067 vif->addr, arvif->vdev_id);
6070 spin_lock_bh(&ar->data_lock);
6071 list_del(&arvif->list);
6072 spin_unlock_bh(&ar->data_lock);
6074 ath12k_peer_cleanup(ar, arvif->vdev_id);
6076 idr_for_each(&ar->txmgmt_idr,
6077 ath12k_mac_vif_txmgmt_idr_remove, vif);
6079 ath12k_mac_vif_unref(&ab->dp, vif);
6080 ath12k_dp_tx_put_bank_profile(&ab->dp, arvif->bank_id);
6082 /* Recalc txpower for remaining vdev */
6083 ath12k_mac_txpower_recalc(ar);
6084 clear_bit(ATH12K_FLAG_MONITOR_ENABLED, &ar->monitor_flags);
6086 /* TODO: recal traffic pause state based on the available vdevs */
6088 mutex_unlock(&ar->conf_mutex);
6091 /* FIXME: Has to be verified. */
6092 #define SUPPORTED_FILTERS \
6097 FIF_BCN_PRBRESP_PROMISC | \
6101 static void ath12k_mac_configure_filter(struct ath12k *ar,
6102 unsigned int total_flags)
6107 lockdep_assert_held(&ar->conf_mutex);
6109 ar->filter_flags = total_flags;
6111 /* For monitor mode */
6112 reset_flag = !(ar->filter_flags & FIF_BCN_PRBRESP_PROMISC);
6114 ret = ath12k_dp_tx_htt_monitor_mode_ring_config(ar, reset_flag);
6117 set_bit(ATH12K_FLAG_MONITOR_ENABLED, &ar->monitor_flags);
6119 clear_bit(ATH12K_FLAG_MONITOR_ENABLED, &ar->monitor_flags);
6122 "fail to set monitor filter: %d\n", ret);
6125 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
6126 "total_flags:0x%x, reset_flag:%d\n",
6127 total_flags, reset_flag);
6130 static void ath12k_mac_op_configure_filter(struct ieee80211_hw *hw,
6131 unsigned int changed_flags,
6132 unsigned int *total_flags,
6135 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
6138 ar = ath12k_ah_to_ar(ah);
6140 mutex_lock(&ar->conf_mutex);
6142 *total_flags &= SUPPORTED_FILTERS;
6143 ath12k_mac_configure_filter(ar, *total_flags);
6145 mutex_unlock(&ar->conf_mutex);
6148 static int ath12k_mac_op_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant)
6150 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
6153 ar = ath12k_ah_to_ar(ah);
6155 mutex_lock(&ar->conf_mutex);
6157 *tx_ant = ar->cfg_tx_chainmask;
6158 *rx_ant = ar->cfg_rx_chainmask;
6160 mutex_unlock(&ar->conf_mutex);
6165 static int ath12k_mac_op_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)
6167 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
6171 ar = ath12k_ah_to_ar(ah);
6173 mutex_lock(&ar->conf_mutex);
6174 ret = __ath12k_set_antenna(ar, tx_ant, rx_ant);
6175 mutex_unlock(&ar->conf_mutex);
6180 static int ath12k_mac_ampdu_action(struct ath12k_vif *arvif,
6181 struct ieee80211_ampdu_params *params)
6183 struct ath12k *ar = arvif->ar;
6186 lockdep_assert_held(&ar->conf_mutex);
6188 switch (params->action) {
6189 case IEEE80211_AMPDU_RX_START:
6190 ret = ath12k_dp_rx_ampdu_start(ar, params);
6192 case IEEE80211_AMPDU_RX_STOP:
6193 ret = ath12k_dp_rx_ampdu_stop(ar, params);
6195 case IEEE80211_AMPDU_TX_START:
6196 case IEEE80211_AMPDU_TX_STOP_CONT:
6197 case IEEE80211_AMPDU_TX_STOP_FLUSH:
6198 case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
6199 case IEEE80211_AMPDU_TX_OPERATIONAL:
6200 /* Tx A-MPDU aggregation offloaded to hw/fw so deny mac80211
6201 * Tx aggregation requests.
6210 static int ath12k_mac_op_ampdu_action(struct ieee80211_hw *hw,
6211 struct ieee80211_vif *vif,
6212 struct ieee80211_ampdu_params *params)
6214 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
6216 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
6219 ar = ath12k_ah_to_ar(ah);
6221 mutex_lock(&ar->conf_mutex);
6222 ret = ath12k_mac_ampdu_action(arvif, params);
6223 mutex_unlock(&ar->conf_mutex);
6226 ath12k_warn(ar->ab, "pdev idx %d unable to perform ampdu action %d ret %d\n",
6227 ar->pdev_idx, params->action, ret);
6232 static int ath12k_mac_op_add_chanctx(struct ieee80211_hw *hw,
6233 struct ieee80211_chanctx_conf *ctx)
6235 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
6237 struct ath12k_base *ab;
6239 ar = ath12k_ah_to_ar(ah);
6242 ath12k_dbg(ab, ATH12K_DBG_MAC,
6243 "mac chanctx add freq %u width %d ptr %pK\n",
6244 ctx->def.chan->center_freq, ctx->def.width, ctx);
6246 mutex_lock(&ar->conf_mutex);
6248 spin_lock_bh(&ar->data_lock);
6249 /* TODO: In case of multiple channel context, populate rx_channel from
6250 * Rx PPDU desc information.
6252 ar->rx_channel = ctx->def.chan;
6253 spin_unlock_bh(&ar->data_lock);
6255 mutex_unlock(&ar->conf_mutex);
6260 static void ath12k_mac_op_remove_chanctx(struct ieee80211_hw *hw,
6261 struct ieee80211_chanctx_conf *ctx)
6263 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
6265 struct ath12k_base *ab;
6267 ar = ath12k_ah_to_ar(ah);
6270 ath12k_dbg(ab, ATH12K_DBG_MAC,
6271 "mac chanctx remove freq %u width %d ptr %pK\n",
6272 ctx->def.chan->center_freq, ctx->def.width, ctx);
6274 mutex_lock(&ar->conf_mutex);
6276 spin_lock_bh(&ar->data_lock);
6277 /* TODO: In case of there is one more channel context left, populate
6278 * rx_channel with the channel of that remaining channel context.
6280 ar->rx_channel = NULL;
6281 spin_unlock_bh(&ar->data_lock);
6283 mutex_unlock(&ar->conf_mutex);
6286 static enum wmi_phy_mode
6287 ath12k_mac_check_down_grade_phy_mode(struct ath12k *ar,
6288 enum wmi_phy_mode mode,
6289 enum nl80211_band band,
6290 enum nl80211_iftype type)
6292 struct ieee80211_sta_eht_cap *eht_cap;
6293 enum wmi_phy_mode down_mode;
6295 if (mode < MODE_11BE_EHT20)
6298 eht_cap = &ar->mac.iftype[band][type].eht_cap;
6299 if (eht_cap->has_eht)
6303 case MODE_11BE_EHT20:
6304 down_mode = MODE_11AX_HE20;
6306 case MODE_11BE_EHT40:
6307 down_mode = MODE_11AX_HE40;
6309 case MODE_11BE_EHT80:
6310 down_mode = MODE_11AX_HE80;
6312 case MODE_11BE_EHT80_80:
6313 down_mode = MODE_11AX_HE80_80;
6315 case MODE_11BE_EHT160:
6316 case MODE_11BE_EHT160_160:
6317 case MODE_11BE_EHT320:
6318 down_mode = MODE_11AX_HE160;
6320 case MODE_11BE_EHT20_2G:
6321 down_mode = MODE_11AX_HE20_2G;
6323 case MODE_11BE_EHT40_2G:
6324 down_mode = MODE_11AX_HE40_2G;
6331 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
6332 "mac vdev start phymode %s downgrade to %s\n",
6333 ath12k_mac_phymode_str(mode),
6334 ath12k_mac_phymode_str(down_mode));
6340 ath12k_mac_vdev_start_restart(struct ath12k_vif *arvif,
6341 struct ieee80211_chanctx_conf *ctx,
6344 struct ath12k *ar = arvif->ar;
6345 struct ath12k_base *ab = ar->ab;
6346 struct wmi_vdev_start_req_arg arg = {};
6347 const struct cfg80211_chan_def *chandef = &ctx->def;
6348 int he_support = arvif->vif->bss_conf.he_support;
6351 lockdep_assert_held(&ar->conf_mutex);
6353 reinit_completion(&ar->vdev_setup_done);
6355 arg.vdev_id = arvif->vdev_id;
6356 arg.dtim_period = arvif->dtim_period;
6357 arg.bcn_intval = arvif->beacon_interval;
6358 arg.punct_bitmap = ~arvif->punct_bitmap;
6360 arg.freq = chandef->chan->center_freq;
6361 arg.band_center_freq1 = chandef->center_freq1;
6362 arg.band_center_freq2 = chandef->center_freq2;
6363 arg.mode = ath12k_phymodes[chandef->chan->band][chandef->width];
6365 arg.mode = ath12k_mac_check_down_grade_phy_mode(ar, arg.mode,
6366 chandef->chan->band,
6369 arg.max_power = chandef->chan->max_power * 2;
6370 arg.max_reg_power = chandef->chan->max_reg_power * 2;
6371 arg.max_antenna_gain = chandef->chan->max_antenna_gain * 2;
6373 arg.pref_tx_streams = ar->num_tx_chains;
6374 arg.pref_rx_streams = ar->num_rx_chains;
6376 /* Fill the MBSSID flags to indicate AP is non MBSSID by default
6377 * Corresponding flags would be updated with MBSSID support.
6379 arg.mbssid_flags = WMI_VDEV_MBSSID_FLAGS_NON_MBSSID_AP;
6381 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
6382 arg.ssid = arvif->u.ap.ssid;
6383 arg.ssid_len = arvif->u.ap.ssid_len;
6384 arg.hidden_ssid = arvif->u.ap.hidden_ssid;
6386 /* For now allow DFS for AP mode */
6387 arg.chan_radar = !!(chandef->chan->flags & IEEE80211_CHAN_RADAR);
6389 arg.freq2_radar = ctx->radar_enabled;
6391 arg.passive = arg.chan_radar;
6393 spin_lock_bh(&ab->base_lock);
6394 arg.regdomain = ar->ab->dfs_region;
6395 spin_unlock_bh(&ab->base_lock);
6397 /* TODO: Notify if secondary 80Mhz also needs radar detection */
6399 ret = ath12k_set_he_mu_sounding_mode(ar, arvif);
6401 ath12k_warn(ar->ab, "failed to set he mode vdev %i\n",
6408 arg.passive |= !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR);
6410 ath12k_dbg(ab, ATH12K_DBG_MAC,
6411 "mac vdev %d start center_freq %d phymode %s punct_bitmap 0x%x\n",
6412 arg.vdev_id, arg.freq,
6413 ath12k_mac_phymode_str(arg.mode), arg.punct_bitmap);
6415 ret = ath12k_wmi_vdev_start(ar, &arg, restart);
6417 ath12k_warn(ar->ab, "failed to %s WMI vdev %i\n",
6418 restart ? "restart" : "start", arg.vdev_id);
6422 ret = ath12k_mac_vdev_setup_sync(ar);
6424 ath12k_warn(ab, "failed to synchronize setup for vdev %i %s: %d\n",
6425 arg.vdev_id, restart ? "restart" : "start", ret);
6429 ar->num_started_vdevs++;
6430 ath12k_dbg(ab, ATH12K_DBG_MAC, "vdev %pM started, vdev_id %d\n",
6431 arvif->vif->addr, arvif->vdev_id);
6433 /* Enable CAC Flag in the driver by checking the channel DFS cac time,
6434 * i.e dfs_cac_ms value which will be valid only for radar channels
6435 * and state as NL80211_DFS_USABLE which indicates CAC needs to be
6436 * done before channel usage. This flags is used to drop rx packets.
6439 /* TODO: Set the flag for other interface types as required */
6440 if (arvif->vdev_type == WMI_VDEV_TYPE_AP &&
6441 chandef->chan->dfs_cac_ms &&
6442 chandef->chan->dfs_state == NL80211_DFS_USABLE) {
6443 set_bit(ATH12K_CAC_RUNNING, &ar->dev_flags);
6444 ath12k_dbg(ab, ATH12K_DBG_MAC,
6445 "CAC Started in chan_freq %d for vdev %d\n",
6446 arg.freq, arg.vdev_id);
6449 ret = ath12k_mac_set_txbf_conf(arvif);
6451 ath12k_warn(ab, "failed to set txbf conf for vdev %d: %d\n",
6452 arvif->vdev_id, ret);
6457 static int ath12k_mac_vdev_start(struct ath12k_vif *arvif,
6458 struct ieee80211_chanctx_conf *ctx)
6460 return ath12k_mac_vdev_start_restart(arvif, ctx, false);
6463 static int ath12k_mac_vdev_restart(struct ath12k_vif *arvif,
6464 struct ieee80211_chanctx_conf *ctx)
6466 return ath12k_mac_vdev_start_restart(arvif, ctx, true);
6469 struct ath12k_mac_change_chanctx_arg {
6470 struct ieee80211_chanctx_conf *ctx;
6471 struct ieee80211_vif_chanctx_switch *vifs;
6477 ath12k_mac_change_chanctx_cnt_iter(void *data, u8 *mac,
6478 struct ieee80211_vif *vif)
6480 struct ath12k_mac_change_chanctx_arg *arg = data;
6482 if (rcu_access_pointer(vif->bss_conf.chanctx_conf) != arg->ctx)
6489 ath12k_mac_change_chanctx_fill_iter(void *data, u8 *mac,
6490 struct ieee80211_vif *vif)
6492 struct ath12k_mac_change_chanctx_arg *arg = data;
6493 struct ieee80211_chanctx_conf *ctx;
6495 ctx = rcu_access_pointer(vif->bss_conf.chanctx_conf);
6496 if (ctx != arg->ctx)
6499 if (WARN_ON(arg->next_vif == arg->n_vifs))
6502 arg->vifs[arg->next_vif].vif = vif;
6503 arg->vifs[arg->next_vif].old_ctx = ctx;
6504 arg->vifs[arg->next_vif].new_ctx = ctx;
6509 ath12k_mac_update_vif_chan(struct ath12k *ar,
6510 struct ieee80211_vif_chanctx_switch *vifs,
6513 struct ath12k_base *ab = ar->ab;
6514 struct ath12k_vif *arvif;
6517 bool monitor_vif = false;
6519 lockdep_assert_held(&ar->conf_mutex);
6521 for (i = 0; i < n_vifs; i++) {
6522 arvif = ath12k_vif_to_arvif(vifs[i].vif);
6524 if (vifs[i].vif->type == NL80211_IFTYPE_MONITOR)
6527 ath12k_dbg(ab, ATH12K_DBG_MAC,
6528 "mac chanctx switch vdev_id %i freq %u->%u width %d->%d\n",
6530 vifs[i].old_ctx->def.chan->center_freq,
6531 vifs[i].new_ctx->def.chan->center_freq,
6532 vifs[i].old_ctx->def.width,
6533 vifs[i].new_ctx->def.width);
6535 if (WARN_ON(!arvif->is_started))
6538 if (WARN_ON(!arvif->is_up))
6541 ret = ath12k_wmi_vdev_down(ar, arvif->vdev_id);
6543 ath12k_warn(ab, "failed to down vdev %d: %d\n",
6544 arvif->vdev_id, ret);
6549 /* All relevant vdevs are downed and associated channel resources
6550 * should be available for the channel switch now.
6553 /* TODO: Update ar->rx_channel */
6555 for (i = 0; i < n_vifs; i++) {
6556 arvif = ath12k_vif_to_arvif(vifs[i].vif);
6558 if (WARN_ON(!arvif->is_started))
6561 /* Firmware expect vdev_restart only if vdev is up.
6562 * If vdev is down then it expect vdev_stop->vdev_start.
6565 ret = ath12k_mac_vdev_restart(arvif, vifs[i].new_ctx);
6567 ath12k_warn(ab, "failed to restart vdev %d: %d\n",
6568 arvif->vdev_id, ret);
6572 ret = ath12k_mac_vdev_stop(arvif);
6574 ath12k_warn(ab, "failed to stop vdev %d: %d\n",
6575 arvif->vdev_id, ret);
6579 ret = ath12k_mac_vdev_start(arvif, vifs[i].new_ctx);
6581 ath12k_warn(ab, "failed to start vdev %d: %d\n",
6582 arvif->vdev_id, ret);
6586 ret = ath12k_mac_setup_bcn_tmpl(arvif);
6588 ath12k_warn(ab, "failed to update bcn tmpl during csa: %d\n",
6591 ret = ath12k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
6594 ath12k_warn(ab, "failed to bring vdev up %d: %d\n",
6595 arvif->vdev_id, ret);
6600 /* Restart the internal monitor vdev on new channel */
6601 if (!monitor_vif && ar->monitor_vdev_created) {
6602 if (!ath12k_mac_monitor_stop(ar))
6603 ath12k_mac_monitor_start(ar);
6608 ath12k_mac_update_active_vif_chan(struct ath12k *ar,
6609 struct ieee80211_chanctx_conf *ctx)
6611 struct ath12k_mac_change_chanctx_arg arg = { .ctx = ctx };
6612 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
6614 lockdep_assert_held(&ar->conf_mutex);
6616 ieee80211_iterate_active_interfaces_atomic(hw,
6617 IEEE80211_IFACE_ITER_NORMAL,
6618 ath12k_mac_change_chanctx_cnt_iter,
6620 if (arg.n_vifs == 0)
6623 arg.vifs = kcalloc(arg.n_vifs, sizeof(arg.vifs[0]), GFP_KERNEL);
6627 ieee80211_iterate_active_interfaces_atomic(hw,
6628 IEEE80211_IFACE_ITER_NORMAL,
6629 ath12k_mac_change_chanctx_fill_iter,
6632 ath12k_mac_update_vif_chan(ar, arg.vifs, arg.n_vifs);
6637 static void ath12k_mac_op_change_chanctx(struct ieee80211_hw *hw,
6638 struct ieee80211_chanctx_conf *ctx,
6641 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
6643 struct ath12k_base *ab;
6645 ar = ath12k_ah_to_ar(ah);
6648 mutex_lock(&ar->conf_mutex);
6650 ath12k_dbg(ab, ATH12K_DBG_MAC,
6651 "mac chanctx change freq %u width %d ptr %pK changed %x\n",
6652 ctx->def.chan->center_freq, ctx->def.width, ctx, changed);
6654 /* This shouldn't really happen because channel switching should use
6655 * switch_vif_chanctx().
6657 if (WARN_ON(changed & IEEE80211_CHANCTX_CHANGE_CHANNEL))
6660 if (changed & IEEE80211_CHANCTX_CHANGE_WIDTH ||
6661 changed & IEEE80211_CHANCTX_CHANGE_RADAR)
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 = link_conf->eht_puncturing;
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_flags |= WMI_SCAN_FLAG_PASSIVE;
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]);