1 // SPDX-License-Identifier: BSD-3-Clause-Clear
3 * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
4 * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
7 #include <net/mac80211.h>
8 #include <linux/etherdevice.h>
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_11AX_HE20_2G,
186 [NL80211_CHAN_WIDTH_20] = MODE_11AX_HE20_2G,
187 [NL80211_CHAN_WIDTH_40] = MODE_11AX_HE40_2G,
188 [NL80211_CHAN_WIDTH_80] = MODE_11AX_HE80_2G,
189 [NL80211_CHAN_WIDTH_80P80] = MODE_UNKNOWN,
190 [NL80211_CHAN_WIDTH_160] = MODE_UNKNOWN,
192 [NL80211_BAND_5GHZ] = {
193 [NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
194 [NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
195 [NL80211_CHAN_WIDTH_20_NOHT] = MODE_11AX_HE20,
196 [NL80211_CHAN_WIDTH_20] = MODE_11AX_HE20,
197 [NL80211_CHAN_WIDTH_40] = MODE_11AX_HE40,
198 [NL80211_CHAN_WIDTH_80] = MODE_11AX_HE80,
199 [NL80211_CHAN_WIDTH_160] = MODE_11AX_HE160,
200 [NL80211_CHAN_WIDTH_80P80] = MODE_11AX_HE80_80,
202 [NL80211_BAND_6GHZ] = {
203 [NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
204 [NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
205 [NL80211_CHAN_WIDTH_20_NOHT] = MODE_11AX_HE20,
206 [NL80211_CHAN_WIDTH_20] = MODE_11AX_HE20,
207 [NL80211_CHAN_WIDTH_40] = MODE_11AX_HE40,
208 [NL80211_CHAN_WIDTH_80] = MODE_11AX_HE80,
209 [NL80211_CHAN_WIDTH_160] = MODE_11AX_HE160,
210 [NL80211_CHAN_WIDTH_80P80] = MODE_11AX_HE80_80,
215 const struct htt_rx_ring_tlv_filter ath12k_mac_mon_status_filter_default = {
216 .rx_filter = HTT_RX_FILTER_TLV_FLAGS_MPDU_START |
217 HTT_RX_FILTER_TLV_FLAGS_PPDU_END |
218 HTT_RX_FILTER_TLV_FLAGS_PPDU_END_STATUS_DONE,
219 .pkt_filter_flags0 = HTT_RX_FP_MGMT_FILTER_FLAGS0,
220 .pkt_filter_flags1 = HTT_RX_FP_MGMT_FILTER_FLAGS1,
221 .pkt_filter_flags2 = HTT_RX_FP_CTRL_FILTER_FLASG2,
222 .pkt_filter_flags3 = HTT_RX_FP_DATA_FILTER_FLASG3 |
223 HTT_RX_FP_CTRL_FILTER_FLASG3
226 #define ATH12K_MAC_FIRST_OFDM_RATE_IDX 4
227 #define ath12k_g_rates ath12k_legacy_rates
228 #define ath12k_g_rates_size (ARRAY_SIZE(ath12k_legacy_rates))
229 #define ath12k_a_rates (ath12k_legacy_rates + 4)
230 #define ath12k_a_rates_size (ARRAY_SIZE(ath12k_legacy_rates) - 4)
232 #define ATH12K_MAC_SCAN_TIMEOUT_MSECS 200 /* in msecs */
234 static const u32 ath12k_smps_map[] = {
235 [WLAN_HT_CAP_SM_PS_STATIC] = WMI_PEER_SMPS_STATIC,
236 [WLAN_HT_CAP_SM_PS_DYNAMIC] = WMI_PEER_SMPS_DYNAMIC,
237 [WLAN_HT_CAP_SM_PS_INVALID] = WMI_PEER_SMPS_PS_NONE,
238 [WLAN_HT_CAP_SM_PS_DISABLED] = WMI_PEER_SMPS_PS_NONE,
241 static int ath12k_start_vdev_delay(struct ieee80211_hw *hw,
242 struct ieee80211_vif *vif);
244 static const char *ath12k_mac_phymode_str(enum wmi_phy_mode mode)
263 case MODE_11AC_VHT20:
265 case MODE_11AC_VHT40:
267 case MODE_11AC_VHT80:
269 case MODE_11AC_VHT160:
270 return "11ac-vht160";
271 case MODE_11AC_VHT80_80:
272 return "11ac-vht80+80";
273 case MODE_11AC_VHT20_2G:
274 return "11ac-vht20-2g";
275 case MODE_11AC_VHT40_2G:
276 return "11ac-vht40-2g";
277 case MODE_11AC_VHT80_2G:
278 return "11ac-vht80-2g";
285 case MODE_11AX_HE80_80:
286 return "11ax-he80+80";
287 case MODE_11AX_HE160:
289 case MODE_11AX_HE20_2G:
290 return "11ax-he20-2g";
291 case MODE_11AX_HE40_2G:
292 return "11ax-he40-2g";
293 case MODE_11AX_HE80_2G:
294 return "11ax-he80-2g";
299 /* no default handler to allow compiler to check that the
300 * enum is fully handled
308 ath12k_mac_bw_to_mac80211_bw(enum ath12k_supported_bw bw)
310 u8 ret = RATE_INFO_BW_20;
314 ret = RATE_INFO_BW_20;
317 ret = RATE_INFO_BW_40;
320 ret = RATE_INFO_BW_80;
323 ret = RATE_INFO_BW_160;
330 enum ath12k_supported_bw ath12k_mac_mac80211_bw_to_ath12k_bw(enum rate_info_bw bw)
333 case RATE_INFO_BW_20:
335 case RATE_INFO_BW_40:
337 case RATE_INFO_BW_80:
339 case RATE_INFO_BW_160:
340 return ATH12K_BW_160;
346 int ath12k_mac_hw_ratecode_to_legacy_rate(u8 hw_rc, u8 preamble, u8 *rateidx,
349 /* As default, it is OFDM rates */
350 int i = ATH12K_MAC_FIRST_OFDM_RATE_IDX;
351 int max_rates_idx = ath12k_g_rates_size;
353 if (preamble == WMI_RATE_PREAMBLE_CCK) {
354 hw_rc &= ~ATH12K_HW_RATECODE_CCK_SHORT_PREAM_MASK;
356 max_rates_idx = ATH12K_MAC_FIRST_OFDM_RATE_IDX;
359 while (i < max_rates_idx) {
360 if (hw_rc == ath12k_legacy_rates[i].hw_value) {
362 *rate = ath12k_legacy_rates[i].bitrate;
371 u8 ath12k_mac_bitrate_to_idx(const struct ieee80211_supported_band *sband,
376 for (i = 0; i < sband->n_bitrates; i++)
377 if (sband->bitrates[i].bitrate == bitrate)
384 ath12k_mac_max_ht_nss(const u8 ht_mcs_mask[IEEE80211_HT_MCS_MASK_LEN])
388 for (nss = IEEE80211_HT_MCS_MASK_LEN - 1; nss >= 0; nss--)
389 if (ht_mcs_mask[nss])
396 ath12k_mac_max_vht_nss(const u16 vht_mcs_mask[NL80211_VHT_NSS_MAX])
400 for (nss = NL80211_VHT_NSS_MAX - 1; nss >= 0; nss--)
401 if (vht_mcs_mask[nss])
407 static u8 ath12k_parse_mpdudensity(u8 mpdudensity)
409 /* From IEEE Std 802.11-2020 defined values for "Minimum MPDU Start Spacing":
410 * 0 for no restriction
419 switch (mpdudensity) {
425 /* Our lower layer calculations limit our precision to
442 static int ath12k_mac_vif_chan(struct ieee80211_vif *vif,
443 struct cfg80211_chan_def *def)
445 struct ieee80211_chanctx_conf *conf;
448 conf = rcu_dereference(vif->bss_conf.chanctx_conf);
460 static bool ath12k_mac_bitrate_is_cck(int bitrate)
473 u8 ath12k_mac_hw_rate_to_idx(const struct ieee80211_supported_band *sband,
474 u8 hw_rate, bool cck)
476 const struct ieee80211_rate *rate;
479 for (i = 0; i < sband->n_bitrates; i++) {
480 rate = &sband->bitrates[i];
482 if (ath12k_mac_bitrate_is_cck(rate->bitrate) != cck)
485 if (rate->hw_value == hw_rate)
487 else if (rate->flags & IEEE80211_RATE_SHORT_PREAMBLE &&
488 rate->hw_value_short == hw_rate)
495 static u8 ath12k_mac_bitrate_to_rate(int bitrate)
497 return DIV_ROUND_UP(bitrate, 5) |
498 (ath12k_mac_bitrate_is_cck(bitrate) ? BIT(7) : 0);
501 static void ath12k_get_arvif_iter(void *data, u8 *mac,
502 struct ieee80211_vif *vif)
504 struct ath12k_vif_iter *arvif_iter = data;
505 struct ath12k_vif *arvif = (void *)vif->drv_priv;
507 if (arvif->vdev_id == arvif_iter->vdev_id)
508 arvif_iter->arvif = arvif;
511 struct ath12k_vif *ath12k_mac_get_arvif(struct ath12k *ar, u32 vdev_id)
513 struct ath12k_vif_iter arvif_iter = {};
516 arvif_iter.vdev_id = vdev_id;
518 flags = IEEE80211_IFACE_ITER_RESUME_ALL;
519 ieee80211_iterate_active_interfaces_atomic(ar->hw,
521 ath12k_get_arvif_iter,
523 if (!arvif_iter.arvif) {
524 ath12k_warn(ar->ab, "No VIF found for vdev %d\n", vdev_id);
528 return arvif_iter.arvif;
531 struct ath12k_vif *ath12k_mac_get_arvif_by_vdev_id(struct ath12k_base *ab,
535 struct ath12k_pdev *pdev;
536 struct ath12k_vif *arvif;
538 for (i = 0; i < ab->num_radios; i++) {
539 pdev = rcu_dereference(ab->pdevs_active[i]);
540 if (pdev && pdev->ar) {
541 arvif = ath12k_mac_get_arvif(pdev->ar, vdev_id);
550 struct ath12k *ath12k_mac_get_ar_by_vdev_id(struct ath12k_base *ab, u32 vdev_id)
553 struct ath12k_pdev *pdev;
555 for (i = 0; i < ab->num_radios; i++) {
556 pdev = rcu_dereference(ab->pdevs_active[i]);
557 if (pdev && pdev->ar) {
558 if (pdev->ar->allocated_vdev_map & (1LL << vdev_id))
566 struct ath12k *ath12k_mac_get_ar_by_pdev_id(struct ath12k_base *ab, u32 pdev_id)
569 struct ath12k_pdev *pdev;
571 if (ab->hw_params->single_pdev_only) {
572 pdev = rcu_dereference(ab->pdevs_active[0]);
573 return pdev ? pdev->ar : NULL;
576 if (WARN_ON(pdev_id > ab->num_radios))
579 for (i = 0; i < ab->num_radios; i++) {
580 pdev = rcu_dereference(ab->pdevs_active[i]);
582 if (pdev && pdev->pdev_id == pdev_id)
583 return (pdev->ar ? pdev->ar : NULL);
589 static void ath12k_pdev_caps_update(struct ath12k *ar)
591 struct ath12k_base *ab = ar->ab;
593 ar->max_tx_power = ab->target_caps.hw_max_tx_power;
595 /* FIXME: Set min_tx_power to ab->target_caps.hw_min_tx_power.
596 * But since the received value in svcrdy is same as hw_max_tx_power,
597 * we can set ar->min_tx_power to 0 currently until
598 * this is fixed in firmware
600 ar->min_tx_power = 0;
602 ar->txpower_limit_2g = ar->max_tx_power;
603 ar->txpower_limit_5g = ar->max_tx_power;
604 ar->txpower_scale = WMI_HOST_TP_SCALE_MAX;
607 static int ath12k_mac_txpower_recalc(struct ath12k *ar)
609 struct ath12k_pdev *pdev = ar->pdev;
610 struct ath12k_vif *arvif;
611 int ret, txpower = -1;
614 lockdep_assert_held(&ar->conf_mutex);
616 list_for_each_entry(arvif, &ar->arvifs, list) {
617 if (arvif->txpower <= 0)
621 txpower = arvif->txpower;
623 txpower = min(txpower, arvif->txpower);
629 /* txpwr is set as 2 units per dBm in FW*/
630 txpower = min_t(u32, max_t(u32, ar->min_tx_power, txpower),
631 ar->max_tx_power) * 2;
633 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "txpower to set in hw %d\n",
636 if ((pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) &&
637 ar->txpower_limit_2g != txpower) {
638 param = WMI_PDEV_PARAM_TXPOWER_LIMIT2G;
639 ret = ath12k_wmi_pdev_set_param(ar, param,
640 txpower, ar->pdev->pdev_id);
643 ar->txpower_limit_2g = txpower;
646 if ((pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) &&
647 ar->txpower_limit_5g != txpower) {
648 param = WMI_PDEV_PARAM_TXPOWER_LIMIT5G;
649 ret = ath12k_wmi_pdev_set_param(ar, param,
650 txpower, ar->pdev->pdev_id);
653 ar->txpower_limit_5g = txpower;
659 ath12k_warn(ar->ab, "failed to recalc txpower limit %d using pdev param %d: %d\n",
660 txpower / 2, param, ret);
664 static int ath12k_recalc_rtscts_prot(struct ath12k_vif *arvif)
666 struct ath12k *ar = arvif->ar;
667 u32 vdev_param, rts_cts;
670 lockdep_assert_held(&ar->conf_mutex);
672 vdev_param = WMI_VDEV_PARAM_ENABLE_RTSCTS;
674 /* Enable RTS/CTS protection for sw retries (when legacy stations
675 * are in BSS) or by default only for second rate series.
676 * TODO: Check if we need to enable CTS 2 Self in any case
678 rts_cts = WMI_USE_RTS_CTS;
680 if (arvif->num_legacy_stations > 0)
681 rts_cts |= WMI_RTSCTS_ACROSS_SW_RETRIES << 4;
683 rts_cts |= WMI_RTSCTS_FOR_SECOND_RATESERIES << 4;
685 /* Need not send duplicate param value to firmware */
686 if (arvif->rtscts_prot_mode == rts_cts)
689 arvif->rtscts_prot_mode = rts_cts;
691 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %d recalc rts/cts prot %d\n",
692 arvif->vdev_id, rts_cts);
694 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
695 vdev_param, rts_cts);
697 ath12k_warn(ar->ab, "failed to recalculate rts/cts prot for vdev %d: %d\n",
698 arvif->vdev_id, ret);
703 static int ath12k_mac_set_kickout(struct ath12k_vif *arvif)
705 struct ath12k *ar = arvif->ar;
709 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_STA_KICKOUT_TH,
710 ATH12K_KICKOUT_THRESHOLD,
713 ath12k_warn(ar->ab, "failed to set kickout threshold on vdev %i: %d\n",
714 arvif->vdev_id, ret);
718 param = WMI_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS;
719 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param,
720 ATH12K_KEEPALIVE_MIN_IDLE);
722 ath12k_warn(ar->ab, "failed to set keepalive minimum idle time on vdev %i: %d\n",
723 arvif->vdev_id, ret);
727 param = WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS;
728 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param,
729 ATH12K_KEEPALIVE_MAX_IDLE);
731 ath12k_warn(ar->ab, "failed to set keepalive maximum idle time on vdev %i: %d\n",
732 arvif->vdev_id, ret);
736 param = WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS;
737 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param,
738 ATH12K_KEEPALIVE_MAX_UNRESPONSIVE);
740 ath12k_warn(ar->ab, "failed to set keepalive maximum unresponsive time on vdev %i: %d\n",
741 arvif->vdev_id, ret);
748 void ath12k_mac_peer_cleanup_all(struct ath12k *ar)
750 struct ath12k_peer *peer, *tmp;
751 struct ath12k_base *ab = ar->ab;
753 lockdep_assert_held(&ar->conf_mutex);
755 spin_lock_bh(&ab->base_lock);
756 list_for_each_entry_safe(peer, tmp, &ab->peers, list) {
757 ath12k_dp_rx_peer_tid_cleanup(ar, peer);
758 list_del(&peer->list);
761 spin_unlock_bh(&ab->base_lock);
764 ar->num_stations = 0;
767 static int ath12k_mac_vdev_setup_sync(struct ath12k *ar)
769 lockdep_assert_held(&ar->conf_mutex);
771 if (test_bit(ATH12K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags))
774 if (!wait_for_completion_timeout(&ar->vdev_setup_done,
775 ATH12K_VDEV_SETUP_TIMEOUT_HZ))
778 return ar->last_wmi_vdev_start_status ? -EINVAL : 0;
781 static int ath12k_monitor_vdev_up(struct ath12k *ar, int vdev_id)
785 ret = ath12k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr);
787 ath12k_warn(ar->ab, "failed to put up monitor vdev %i: %d\n",
792 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %i started\n",
797 static int ath12k_mac_monitor_vdev_start(struct ath12k *ar, int vdev_id,
798 struct cfg80211_chan_def *chandef)
800 struct ieee80211_channel *channel;
801 struct wmi_vdev_start_req_arg arg = {};
804 lockdep_assert_held(&ar->conf_mutex);
806 channel = chandef->chan;
807 arg.vdev_id = vdev_id;
808 arg.freq = channel->center_freq;
809 arg.band_center_freq1 = chandef->center_freq1;
810 arg.band_center_freq2 = chandef->center_freq2;
811 arg.mode = ath12k_phymodes[chandef->chan->band][chandef->width];
812 arg.chan_radar = !!(channel->flags & IEEE80211_CHAN_RADAR);
815 arg.max_power = channel->max_power;
816 arg.max_reg_power = channel->max_reg_power;
817 arg.max_antenna_gain = channel->max_antenna_gain;
819 arg.pref_tx_streams = ar->num_tx_chains;
820 arg.pref_rx_streams = ar->num_rx_chains;
822 arg.passive |= !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR);
824 reinit_completion(&ar->vdev_setup_done);
825 reinit_completion(&ar->vdev_delete_done);
827 ret = ath12k_wmi_vdev_start(ar, &arg, false);
829 ath12k_warn(ar->ab, "failed to request monitor vdev %i start: %d\n",
834 ret = ath12k_mac_vdev_setup_sync(ar);
836 ath12k_warn(ar->ab, "failed to synchronize setup for monitor vdev %i start: %d\n",
841 ret = ath12k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr);
843 ath12k_warn(ar->ab, "failed to put up monitor vdev %i: %d\n",
848 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %i started\n",
853 ret = ath12k_wmi_vdev_stop(ar, vdev_id);
855 ath12k_warn(ar->ab, "failed to stop monitor vdev %i after start failure: %d\n",
860 static int ath12k_mac_monitor_vdev_stop(struct ath12k *ar)
864 lockdep_assert_held(&ar->conf_mutex);
866 reinit_completion(&ar->vdev_setup_done);
868 ret = ath12k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
870 ath12k_warn(ar->ab, "failed to request monitor vdev %i stop: %d\n",
871 ar->monitor_vdev_id, ret);
873 ret = ath12k_mac_vdev_setup_sync(ar);
875 ath12k_warn(ar->ab, "failed to synchronize monitor vdev %i stop: %d\n",
876 ar->monitor_vdev_id, ret);
878 ret = ath12k_wmi_vdev_down(ar, ar->monitor_vdev_id);
880 ath12k_warn(ar->ab, "failed to put down monitor vdev %i: %d\n",
881 ar->monitor_vdev_id, ret);
883 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %i stopped\n",
884 ar->monitor_vdev_id);
888 static int ath12k_mac_monitor_vdev_create(struct ath12k *ar)
890 struct ath12k_pdev *pdev = ar->pdev;
891 struct ath12k_wmi_vdev_create_arg arg = {};
896 lockdep_assert_held(&ar->conf_mutex);
898 if (ar->monitor_vdev_created)
901 if (ar->ab->free_vdev_map == 0) {
902 ath12k_warn(ar->ab, "failed to find free vdev id for monitor vdev\n");
906 bit = __ffs64(ar->ab->free_vdev_map);
908 ar->monitor_vdev_id = bit;
910 arg.if_id = ar->monitor_vdev_id;
911 arg.type = WMI_VDEV_TYPE_MONITOR;
912 arg.subtype = WMI_VDEV_SUBTYPE_NONE;
913 arg.pdev_id = pdev->pdev_id;
914 arg.if_stats_id = ATH12K_INVAL_VDEV_STATS_ID;
916 if (pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) {
917 arg.chains[NL80211_BAND_2GHZ].tx = ar->num_tx_chains;
918 arg.chains[NL80211_BAND_2GHZ].rx = ar->num_rx_chains;
921 if (pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) {
922 arg.chains[NL80211_BAND_5GHZ].tx = ar->num_tx_chains;
923 arg.chains[NL80211_BAND_5GHZ].rx = ar->num_rx_chains;
926 ret = ath12k_wmi_vdev_create(ar, tmp_addr, &arg);
928 ath12k_warn(ar->ab, "failed to request monitor vdev %i creation: %d\n",
929 ar->monitor_vdev_id, ret);
930 ar->monitor_vdev_id = -1;
934 nss = hweight32(ar->cfg_tx_chainmask) ? : 1;
935 ret = ath12k_wmi_vdev_set_param_cmd(ar, ar->monitor_vdev_id,
936 WMI_VDEV_PARAM_NSS, nss);
938 ath12k_warn(ar->ab, "failed to set vdev %d chainmask 0x%x, nss %d :%d\n",
939 ar->monitor_vdev_id, ar->cfg_tx_chainmask, nss, ret);
943 ret = ath12k_mac_txpower_recalc(ar);
947 ar->allocated_vdev_map |= 1LL << ar->monitor_vdev_id;
948 ar->ab->free_vdev_map &= ~(1LL << ar->monitor_vdev_id);
949 ar->num_created_vdevs++;
950 ar->monitor_vdev_created = true;
951 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %d created\n",
952 ar->monitor_vdev_id);
957 static int ath12k_mac_monitor_vdev_delete(struct ath12k *ar)
960 unsigned long time_left;
962 lockdep_assert_held(&ar->conf_mutex);
964 if (!ar->monitor_vdev_created)
967 reinit_completion(&ar->vdev_delete_done);
969 ret = ath12k_wmi_vdev_delete(ar, ar->monitor_vdev_id);
971 ath12k_warn(ar->ab, "failed to request wmi monitor vdev %i removal: %d\n",
972 ar->monitor_vdev_id, ret);
976 time_left = wait_for_completion_timeout(&ar->vdev_delete_done,
977 ATH12K_VDEV_DELETE_TIMEOUT_HZ);
978 if (time_left == 0) {
979 ath12k_warn(ar->ab, "Timeout in receiving vdev delete response\n");
981 ar->allocated_vdev_map &= ~(1LL << ar->monitor_vdev_id);
982 ar->ab->free_vdev_map |= 1LL << (ar->monitor_vdev_id);
983 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %d deleted\n",
984 ar->monitor_vdev_id);
985 ar->num_created_vdevs--;
986 ar->monitor_vdev_id = -1;
987 ar->monitor_vdev_created = false;
994 ath12k_mac_get_any_chandef_iter(struct ieee80211_hw *hw,
995 struct ieee80211_chanctx_conf *conf,
998 struct cfg80211_chan_def **def = data;
1003 static int ath12k_mac_monitor_start(struct ath12k *ar)
1005 struct cfg80211_chan_def *chandef = NULL;
1008 lockdep_assert_held(&ar->conf_mutex);
1010 if (ar->monitor_started)
1013 ieee80211_iter_chan_contexts_atomic(ar->hw,
1014 ath12k_mac_get_any_chandef_iter,
1019 ret = ath12k_mac_monitor_vdev_start(ar, ar->monitor_vdev_id, chandef);
1021 ath12k_warn(ar->ab, "failed to start monitor vdev: %d\n", ret);
1022 ath12k_mac_monitor_vdev_delete(ar);
1026 ar->monitor_started = true;
1027 ar->num_started_vdevs++;
1028 ret = ath12k_dp_tx_htt_monitor_mode_ring_config(ar, false);
1029 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor started ret %d\n", ret);
1034 static int ath12k_mac_monitor_stop(struct ath12k *ar)
1038 lockdep_assert_held(&ar->conf_mutex);
1040 if (!ar->monitor_started)
1043 ret = ath12k_mac_monitor_vdev_stop(ar);
1045 ath12k_warn(ar->ab, "failed to stop monitor vdev: %d\n", ret);
1049 ar->monitor_started = false;
1050 ar->num_started_vdevs--;
1051 ret = ath12k_dp_tx_htt_monitor_mode_ring_config(ar, true);
1052 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor stopped ret %d\n", ret);
1056 static int ath12k_mac_op_config(struct ieee80211_hw *hw, u32 changed)
1058 struct ath12k *ar = hw->priv;
1059 struct ieee80211_conf *conf = &hw->conf;
1062 mutex_lock(&ar->conf_mutex);
1064 if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
1065 ar->monitor_conf_enabled = conf->flags & IEEE80211_CONF_MONITOR;
1066 if (ar->monitor_conf_enabled) {
1067 if (ar->monitor_vdev_created)
1069 ret = ath12k_mac_monitor_vdev_create(ar);
1072 ret = ath12k_mac_monitor_start(ar);
1076 if (!ar->monitor_vdev_created)
1078 ret = ath12k_mac_monitor_stop(ar);
1081 ath12k_mac_monitor_vdev_delete(ar);
1086 mutex_unlock(&ar->conf_mutex);
1090 ath12k_mac_monitor_vdev_delete(ar);
1091 mutex_unlock(&ar->conf_mutex);
1095 static int ath12k_mac_setup_bcn_tmpl(struct ath12k_vif *arvif)
1097 struct ath12k *ar = arvif->ar;
1098 struct ath12k_base *ab = ar->ab;
1099 struct ieee80211_hw *hw = ar->hw;
1100 struct ieee80211_vif *vif = arvif->vif;
1101 struct ieee80211_mutable_offsets offs = {};
1102 struct sk_buff *bcn;
1103 struct ieee80211_mgmt *mgmt;
1107 if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
1110 bcn = ieee80211_beacon_get_template(hw, vif, &offs, 0);
1112 ath12k_warn(ab, "failed to get beacon template from mac80211\n");
1116 ies = bcn->data + ieee80211_get_hdrlen_from_skb(bcn);
1117 ies += sizeof(mgmt->u.beacon);
1119 if (cfg80211_find_ie(WLAN_EID_RSN, ies, (skb_tail_pointer(bcn) - ies)))
1120 arvif->rsnie_present = true;
1122 if (cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
1123 WLAN_OUI_TYPE_MICROSOFT_WPA,
1124 ies, (skb_tail_pointer(bcn) - ies)))
1125 arvif->wpaie_present = true;
1127 ret = ath12k_wmi_bcn_tmpl(ar, arvif->vdev_id, &offs, bcn);
1132 ath12k_warn(ab, "failed to submit beacon template command: %d\n",
1138 static void ath12k_control_beaconing(struct ath12k_vif *arvif,
1139 struct ieee80211_bss_conf *info)
1141 struct ath12k *ar = arvif->ar;
1144 lockdep_assert_held(&arvif->ar->conf_mutex);
1146 if (!info->enable_beacon) {
1147 ret = ath12k_wmi_vdev_down(ar, arvif->vdev_id);
1149 ath12k_warn(ar->ab, "failed to down vdev_id %i: %d\n",
1150 arvif->vdev_id, ret);
1152 arvif->is_up = false;
1156 /* Install the beacon template to the FW */
1157 ret = ath12k_mac_setup_bcn_tmpl(arvif);
1159 ath12k_warn(ar->ab, "failed to update bcn tmpl during vdev up: %d\n",
1166 ether_addr_copy(arvif->bssid, info->bssid);
1168 ret = ath12k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
1171 ath12k_warn(ar->ab, "failed to bring up vdev %d: %i\n",
1172 arvif->vdev_id, ret);
1176 arvif->is_up = true;
1178 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %d up\n", arvif->vdev_id);
1181 static void ath12k_peer_assoc_h_basic(struct ath12k *ar,
1182 struct ieee80211_vif *vif,
1183 struct ieee80211_sta *sta,
1184 struct ath12k_wmi_peer_assoc_arg *arg)
1186 struct ath12k_vif *arvif = (void *)vif->drv_priv;
1189 lockdep_assert_held(&ar->conf_mutex);
1191 if (vif->type == NL80211_IFTYPE_STATION)
1196 ether_addr_copy(arg->peer_mac, sta->addr);
1197 arg->vdev_id = arvif->vdev_id;
1198 arg->peer_associd = aid;
1199 arg->auth_flag = true;
1200 /* TODO: STA WAR in ath10k for listen interval required? */
1201 arg->peer_listen_intval = ar->hw->conf.listen_interval;
1203 arg->peer_caps = vif->bss_conf.assoc_capability;
1206 static void ath12k_peer_assoc_h_crypto(struct ath12k *ar,
1207 struct ieee80211_vif *vif,
1208 struct ieee80211_sta *sta,
1209 struct ath12k_wmi_peer_assoc_arg *arg)
1211 struct ieee80211_bss_conf *info = &vif->bss_conf;
1212 struct cfg80211_chan_def def;
1213 struct cfg80211_bss *bss;
1214 struct ath12k_vif *arvif = (struct ath12k_vif *)vif->drv_priv;
1215 const u8 *rsnie = NULL;
1216 const u8 *wpaie = NULL;
1218 lockdep_assert_held(&ar->conf_mutex);
1220 if (WARN_ON(ath12k_mac_vif_chan(vif, &def)))
1223 bss = cfg80211_get_bss(ar->hw->wiphy, def.chan, info->bssid, NULL, 0,
1224 IEEE80211_BSS_TYPE_ANY, IEEE80211_PRIVACY_ANY);
1226 if (arvif->rsnie_present || arvif->wpaie_present) {
1227 arg->need_ptk_4_way = true;
1228 if (arvif->wpaie_present)
1229 arg->need_gtk_2_way = true;
1231 const struct cfg80211_bss_ies *ies;
1234 rsnie = ieee80211_bss_get_ie(bss, WLAN_EID_RSN);
1236 ies = rcu_dereference(bss->ies);
1238 wpaie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
1239 WLAN_OUI_TYPE_MICROSOFT_WPA,
1243 cfg80211_put_bss(ar->hw->wiphy, bss);
1246 /* FIXME: base on RSN IE/WPA IE is a correct idea? */
1247 if (rsnie || wpaie) {
1248 ath12k_dbg(ar->ab, ATH12K_DBG_WMI,
1249 "%s: rsn ie found\n", __func__);
1250 arg->need_ptk_4_way = true;
1254 ath12k_dbg(ar->ab, ATH12K_DBG_WMI,
1255 "%s: wpa ie found\n", __func__);
1256 arg->need_gtk_2_way = true;
1260 /* TODO: Need to check if FW supports PMF? */
1261 arg->is_pmf_enabled = true;
1264 /* TODO: safe_mode_enabled (bypass 4-way handshake) flag req? */
1267 static void ath12k_peer_assoc_h_rates(struct ath12k *ar,
1268 struct ieee80211_vif *vif,
1269 struct ieee80211_sta *sta,
1270 struct ath12k_wmi_peer_assoc_arg *arg)
1272 struct ath12k_vif *arvif = (void *)vif->drv_priv;
1273 struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates;
1274 struct cfg80211_chan_def def;
1275 const struct ieee80211_supported_band *sband;
1276 const struct ieee80211_rate *rates;
1277 enum nl80211_band band;
1282 lockdep_assert_held(&ar->conf_mutex);
1284 if (WARN_ON(ath12k_mac_vif_chan(vif, &def)))
1287 band = def.chan->band;
1288 sband = ar->hw->wiphy->bands[band];
1289 ratemask = sta->deflink.supp_rates[band];
1290 ratemask &= arvif->bitrate_mask.control[band].legacy;
1291 rates = sband->bitrates;
1293 rateset->num_rates = 0;
1295 for (i = 0; i < 32; i++, ratemask >>= 1, rates++) {
1296 if (!(ratemask & 1))
1299 rate = ath12k_mac_bitrate_to_rate(rates->bitrate);
1300 rateset->rates[rateset->num_rates] = rate;
1301 rateset->num_rates++;
1306 ath12k_peer_assoc_h_ht_masked(const u8 ht_mcs_mask[IEEE80211_HT_MCS_MASK_LEN])
1310 for (nss = 0; nss < IEEE80211_HT_MCS_MASK_LEN; nss++)
1311 if (ht_mcs_mask[nss])
1318 ath12k_peer_assoc_h_vht_masked(const u16 vht_mcs_mask[NL80211_VHT_NSS_MAX])
1322 for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++)
1323 if (vht_mcs_mask[nss])
1329 static void ath12k_peer_assoc_h_ht(struct ath12k *ar,
1330 struct ieee80211_vif *vif,
1331 struct ieee80211_sta *sta,
1332 struct ath12k_wmi_peer_assoc_arg *arg)
1334 const struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
1335 struct ath12k_vif *arvif = (void *)vif->drv_priv;
1336 struct cfg80211_chan_def def;
1337 enum nl80211_band band;
1338 const u8 *ht_mcs_mask;
1343 lockdep_assert_held(&ar->conf_mutex);
1345 if (WARN_ON(ath12k_mac_vif_chan(vif, &def)))
1348 if (!ht_cap->ht_supported)
1351 band = def.chan->band;
1352 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
1354 if (ath12k_peer_assoc_h_ht_masked(ht_mcs_mask))
1357 arg->ht_flag = true;
1359 arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
1360 ht_cap->ampdu_factor)) - 1;
1362 arg->peer_mpdu_density =
1363 ath12k_parse_mpdudensity(ht_cap->ampdu_density);
1365 arg->peer_ht_caps = ht_cap->cap;
1366 arg->peer_rate_caps |= WMI_HOST_RC_HT_FLAG;
1368 if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING)
1369 arg->ldpc_flag = true;
1371 if (sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40) {
1373 arg->peer_rate_caps |= WMI_HOST_RC_CW40_FLAG;
1376 if (arvif->bitrate_mask.control[band].gi != NL80211_TXRATE_FORCE_LGI) {
1377 if (ht_cap->cap & (IEEE80211_HT_CAP_SGI_20 |
1378 IEEE80211_HT_CAP_SGI_40))
1379 arg->peer_rate_caps |= WMI_HOST_RC_SGI_FLAG;
1382 if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) {
1383 arg->peer_rate_caps |= WMI_HOST_RC_TX_STBC_FLAG;
1384 arg->stbc_flag = true;
1387 if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) {
1388 stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC;
1389 stbc = stbc >> IEEE80211_HT_CAP_RX_STBC_SHIFT;
1390 stbc = stbc << WMI_HOST_RC_RX_STBC_FLAG_S;
1391 arg->peer_rate_caps |= stbc;
1392 arg->stbc_flag = true;
1395 if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2])
1396 arg->peer_rate_caps |= WMI_HOST_RC_TS_FLAG;
1397 else if (ht_cap->mcs.rx_mask[1])
1398 arg->peer_rate_caps |= WMI_HOST_RC_DS_FLAG;
1400 for (i = 0, n = 0, max_nss = 0; i < IEEE80211_HT_MCS_MASK_LEN * 8; i++)
1401 if ((ht_cap->mcs.rx_mask[i / 8] & BIT(i % 8)) &&
1402 (ht_mcs_mask[i / 8] & BIT(i % 8))) {
1403 max_nss = (i / 8) + 1;
1404 arg->peer_ht_rates.rates[n++] = i;
1407 /* This is a workaround for HT-enabled STAs which break the spec
1408 * and have no HT capabilities RX mask (no HT RX MCS map).
1410 * As per spec, in section 20.3.5 Modulation and coding scheme (MCS),
1411 * MCS 0 through 7 are mandatory in 20MHz with 800 ns GI at all STAs.
1413 * Firmware asserts if such situation occurs.
1416 arg->peer_ht_rates.num_rates = 8;
1417 for (i = 0; i < arg->peer_ht_rates.num_rates; i++)
1418 arg->peer_ht_rates.rates[i] = i;
1420 arg->peer_ht_rates.num_rates = n;
1421 arg->peer_nss = min(sta->deflink.rx_nss, max_nss);
1424 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n",
1426 arg->peer_ht_rates.num_rates,
1430 static int ath12k_mac_get_max_vht_mcs_map(u16 mcs_map, int nss)
1432 switch ((mcs_map >> (2 * nss)) & 0x3) {
1433 case IEEE80211_VHT_MCS_SUPPORT_0_7: return BIT(8) - 1;
1434 case IEEE80211_VHT_MCS_SUPPORT_0_8: return BIT(9) - 1;
1435 case IEEE80211_VHT_MCS_SUPPORT_0_9: return BIT(10) - 1;
1441 ath12k_peer_assoc_h_vht_limit(u16 tx_mcs_set,
1442 const u16 vht_mcs_limit[NL80211_VHT_NSS_MAX])
1449 for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) {
1450 mcs_map = ath12k_mac_get_max_vht_mcs_map(tx_mcs_set, nss) &
1454 idx_limit = fls(mcs_map) - 1;
1458 switch (idx_limit) {
1467 mcs = IEEE80211_VHT_MCS_SUPPORT_0_7;
1470 mcs = IEEE80211_VHT_MCS_SUPPORT_0_8;
1473 mcs = IEEE80211_VHT_MCS_SUPPORT_0_9;
1479 mcs = IEEE80211_VHT_MCS_NOT_SUPPORTED;
1483 tx_mcs_set &= ~(0x3 << (nss * 2));
1484 tx_mcs_set |= mcs << (nss * 2);
1490 static void ath12k_peer_assoc_h_vht(struct ath12k *ar,
1491 struct ieee80211_vif *vif,
1492 struct ieee80211_sta *sta,
1493 struct ath12k_wmi_peer_assoc_arg *arg)
1495 const struct ieee80211_sta_vht_cap *vht_cap = &sta->deflink.vht_cap;
1496 struct ath12k_vif *arvif = (void *)vif->drv_priv;
1497 struct cfg80211_chan_def def;
1498 enum nl80211_band band;
1499 const u16 *vht_mcs_mask;
1502 u8 max_nss, vht_mcs;
1505 if (WARN_ON(ath12k_mac_vif_chan(vif, &def)))
1508 if (!vht_cap->vht_supported)
1511 band = def.chan->band;
1512 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
1514 if (ath12k_peer_assoc_h_vht_masked(vht_mcs_mask))
1517 arg->vht_flag = true;
1519 /* TODO: similar flags required? */
1520 arg->vht_capable = true;
1522 if (def.chan->band == NL80211_BAND_2GHZ)
1523 arg->vht_ng_flag = true;
1525 arg->peer_vht_caps = vht_cap->cap;
1527 ampdu_factor = (vht_cap->cap &
1528 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >>
1529 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
1531 /* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to
1532 * zero in VHT IE. Using it would result in degraded throughput.
1533 * arg->peer_max_mpdu at this point contains HT max_mpdu so keep
1534 * it if VHT max_mpdu is smaller.
1536 arg->peer_max_mpdu = max(arg->peer_max_mpdu,
1537 (1U << (IEEE80211_HT_MAX_AMPDU_FACTOR +
1538 ampdu_factor)) - 1);
1540 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
1543 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160)
1546 /* Calculate peer NSS capability from VHT capabilities if STA
1549 for (i = 0, max_nss = 0, vht_mcs = 0; i < NL80211_VHT_NSS_MAX; i++) {
1550 vht_mcs = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map) >>
1553 if (vht_mcs != IEEE80211_VHT_MCS_NOT_SUPPORTED &&
1557 arg->peer_nss = min(sta->deflink.rx_nss, max_nss);
1558 arg->rx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.rx_highest);
1559 arg->rx_mcs_set = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map);
1560 arg->tx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.tx_highest);
1562 tx_mcs_map = __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map);
1563 arg->tx_mcs_set = ath12k_peer_assoc_h_vht_limit(tx_mcs_map, vht_mcs_mask);
1565 /* In QCN9274 platform, VHT MCS rate 10 and 11 is enabled by default.
1566 * VHT MCS rate 10 and 11 is not supported in 11ac standard.
1567 * so explicitly disable the VHT MCS rate 10 and 11 in 11ac mode.
1569 arg->tx_mcs_set &= ~IEEE80211_VHT_MCS_SUPPORT_0_11_MASK;
1570 arg->tx_mcs_set |= IEEE80211_DISABLE_VHT_MCS_SUPPORT_0_11;
1572 if ((arg->tx_mcs_set & IEEE80211_VHT_MCS_NOT_SUPPORTED) ==
1573 IEEE80211_VHT_MCS_NOT_SUPPORTED)
1574 arg->peer_vht_caps &= ~IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE;
1577 arg->tx_max_mcs_nss = 0xFF;
1579 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vht peer %pM max_mpdu %d flags 0x%x\n",
1580 sta->addr, arg->peer_max_mpdu, arg->peer_flags);
1582 /* TODO: rxnss_override */
1585 static void ath12k_peer_assoc_h_he(struct ath12k *ar,
1586 struct ieee80211_vif *vif,
1587 struct ieee80211_sta *sta,
1588 struct ath12k_wmi_peer_assoc_arg *arg)
1590 const struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap;
1592 u8 ampdu_factor, rx_mcs_80, rx_mcs_160, max_nss;
1593 u16 mcs_160_map, mcs_80_map;
1597 if (!he_cap->has_he)
1600 arg->he_flag = true;
1602 support_160 = !!(he_cap->he_cap_elem.phy_cap_info[0] &
1603 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G);
1605 /* Supported HE-MCS and NSS Set of peer he_cap is intersection with self he_cp */
1606 mcs_160_map = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160);
1607 mcs_80_map = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80);
1610 for (i = 7; i >= 0; i--) {
1611 u8 mcs_160 = (mcs_160_map >> (2 * i)) & 3;
1613 if (mcs_160 != IEEE80211_HE_MCS_NOT_SUPPORTED) {
1620 for (i = 7; i >= 0; i--) {
1621 u8 mcs_80 = (mcs_80_map >> (2 * i)) & 3;
1623 if (mcs_80 != IEEE80211_HE_MCS_NOT_SUPPORTED) {
1630 max_nss = min(rx_mcs_80, rx_mcs_160);
1632 max_nss = rx_mcs_80;
1634 arg->peer_nss = min(sta->deflink.rx_nss, max_nss);
1636 memcpy(&arg->peer_he_cap_macinfo, he_cap->he_cap_elem.mac_cap_info,
1637 sizeof(arg->peer_he_cap_macinfo));
1638 memcpy(&arg->peer_he_cap_phyinfo, he_cap->he_cap_elem.phy_cap_info,
1639 sizeof(arg->peer_he_cap_phyinfo));
1640 arg->peer_he_ops = vif->bss_conf.he_oper.params;
1642 /* the top most byte is used to indicate BSS color info */
1643 arg->peer_he_ops &= 0xffffff;
1645 /* As per section 26.6.1 IEEE Std 802.11ax‐2022, if the Max AMPDU
1646 * Exponent Extension in HE cap is zero, use the arg->peer_max_mpdu
1647 * as calculated while parsing VHT caps(if VHT caps is present)
1648 * or HT caps (if VHT caps is not present).
1650 * For non-zero value of Max AMPDU Exponent Extension in HE MAC caps,
1651 * if a HE STA sends VHT cap and HE cap IE in assoc request then, use
1652 * MAX_AMPDU_LEN_FACTOR as 20 to calculate max_ampdu length.
1653 * If a HE STA that does not send VHT cap, but HE and HT cap in assoc
1654 * request, then use MAX_AMPDU_LEN_FACTOR as 16 to calculate max_ampdu
1657 ampdu_factor = (he_cap->he_cap_elem.mac_cap_info[3] &
1658 IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK) >>
1659 IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK;
1662 if (sta->deflink.vht_cap.vht_supported)
1663 arg->peer_max_mpdu = (1 << (IEEE80211_HE_VHT_MAX_AMPDU_FACTOR +
1665 else if (sta->deflink.ht_cap.ht_supported)
1666 arg->peer_max_mpdu = (1 << (IEEE80211_HE_HT_MAX_AMPDU_FACTOR +
1670 if (he_cap->he_cap_elem.phy_cap_info[6] &
1671 IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT) {
1675 arg->peer_ppet.numss_m1 = he_cap->ppe_thres[0] &
1676 IEEE80211_PPE_THRES_NSS_MASK;
1677 arg->peer_ppet.ru_bit_mask =
1678 (he_cap->ppe_thres[0] &
1679 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK) >>
1680 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_POS;
1682 for (nss = 0; nss <= arg->peer_ppet.numss_m1; nss++) {
1683 for (ru = 0; ru < 4; ru++) {
1687 if ((arg->peer_ppet.ru_bit_mask & BIT(ru)) == 0)
1689 for (i = 0; i < 6; i++) {
1691 val |= ((he_cap->ppe_thres[bit / 8] >>
1692 (bit % 8)) & 0x1) << 5;
1695 arg->peer_ppet.ppet16_ppet8_ru3_ru0[nss] |=
1701 if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_RES)
1702 arg->twt_responder = true;
1703 if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_REQ)
1704 arg->twt_requester = true;
1706 switch (sta->deflink.bandwidth) {
1707 case IEEE80211_STA_RX_BW_160:
1708 if (he_cap->he_cap_elem.phy_cap_info[0] &
1709 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G) {
1710 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80p80);
1711 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80_80] = v;
1713 v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80p80);
1714 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80_80] = v;
1716 arg->peer_he_mcs_count++;
1718 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160);
1719 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v;
1721 v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_160);
1722 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v;
1724 arg->peer_he_mcs_count++;
1728 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80);
1729 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v;
1731 v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80);
1732 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v;
1734 arg->peer_he_mcs_count++;
1739 static void ath12k_peer_assoc_h_smps(struct ieee80211_sta *sta,
1740 struct ath12k_wmi_peer_assoc_arg *arg)
1742 const struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
1745 if (!ht_cap->ht_supported)
1748 smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
1749 smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
1752 case WLAN_HT_CAP_SM_PS_STATIC:
1753 arg->static_mimops_flag = true;
1755 case WLAN_HT_CAP_SM_PS_DYNAMIC:
1756 arg->dynamic_mimops_flag = true;
1758 case WLAN_HT_CAP_SM_PS_DISABLED:
1759 arg->spatial_mux_flag = true;
1766 static void ath12k_peer_assoc_h_qos(struct ath12k *ar,
1767 struct ieee80211_vif *vif,
1768 struct ieee80211_sta *sta,
1769 struct ath12k_wmi_peer_assoc_arg *arg)
1771 struct ath12k_vif *arvif = (void *)vif->drv_priv;
1773 switch (arvif->vdev_type) {
1774 case WMI_VDEV_TYPE_AP:
1776 /* TODO: Check WME vs QoS */
1777 arg->is_wme_set = true;
1778 arg->qos_flag = true;
1781 if (sta->wme && sta->uapsd_queues) {
1782 /* TODO: Check WME vs QoS */
1783 arg->is_wme_set = true;
1784 arg->apsd_flag = true;
1785 arg->peer_rate_caps |= WMI_HOST_RC_UAPSD_FLAG;
1788 case WMI_VDEV_TYPE_STA:
1790 arg->is_wme_set = true;
1791 arg->qos_flag = true;
1798 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac peer %pM qos %d\n",
1799 sta->addr, arg->qos_flag);
1802 static int ath12k_peer_assoc_qos_ap(struct ath12k *ar,
1803 struct ath12k_vif *arvif,
1804 struct ieee80211_sta *sta)
1806 struct ath12k_wmi_ap_ps_arg arg;
1811 lockdep_assert_held(&ar->conf_mutex);
1813 arg.vdev_id = arvif->vdev_id;
1815 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac uapsd_queues 0x%x max_sp %d\n",
1816 sta->uapsd_queues, sta->max_sp);
1819 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO)
1820 uapsd |= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN |
1821 WMI_AP_PS_UAPSD_AC3_TRIGGER_EN;
1822 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI)
1823 uapsd |= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN |
1824 WMI_AP_PS_UAPSD_AC2_TRIGGER_EN;
1825 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK)
1826 uapsd |= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN |
1827 WMI_AP_PS_UAPSD_AC1_TRIGGER_EN;
1828 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE)
1829 uapsd |= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN |
1830 WMI_AP_PS_UAPSD_AC0_TRIGGER_EN;
1833 if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP)
1834 max_sp = sta->max_sp;
1836 arg.param = WMI_AP_PS_PEER_PARAM_UAPSD;
1838 ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, &arg);
1842 arg.param = WMI_AP_PS_PEER_PARAM_MAX_SP;
1844 ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, &arg);
1848 /* TODO: revisit during testing */
1849 arg.param = WMI_AP_PS_PEER_PARAM_SIFS_RESP_FRMTYPE;
1850 arg.value = DISABLE_SIFS_RESPONSE_TRIGGER;
1851 ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, &arg);
1855 arg.param = WMI_AP_PS_PEER_PARAM_SIFS_RESP_UAPSD;
1856 arg.value = DISABLE_SIFS_RESPONSE_TRIGGER;
1857 ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, &arg);
1864 ath12k_warn(ar->ab, "failed to set ap ps peer param %d for vdev %i: %d\n",
1865 arg.param, arvif->vdev_id, ret);
1869 static bool ath12k_mac_sta_has_ofdm_only(struct ieee80211_sta *sta)
1871 return sta->deflink.supp_rates[NL80211_BAND_2GHZ] >>
1872 ATH12K_MAC_FIRST_OFDM_RATE_IDX;
1875 static enum wmi_phy_mode ath12k_mac_get_phymode_vht(struct ath12k *ar,
1876 struct ieee80211_sta *sta)
1878 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160) {
1879 switch (sta->deflink.vht_cap.cap &
1880 IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK) {
1881 case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ:
1882 return MODE_11AC_VHT160;
1883 case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ:
1884 return MODE_11AC_VHT80_80;
1886 /* not sure if this is a valid case? */
1887 return MODE_11AC_VHT160;
1891 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
1892 return MODE_11AC_VHT80;
1894 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
1895 return MODE_11AC_VHT40;
1897 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_20)
1898 return MODE_11AC_VHT20;
1900 return MODE_UNKNOWN;
1903 static enum wmi_phy_mode ath12k_mac_get_phymode_he(struct ath12k *ar,
1904 struct ieee80211_sta *sta)
1906 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160) {
1907 if (sta->deflink.he_cap.he_cap_elem.phy_cap_info[0] &
1908 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
1909 return MODE_11AX_HE160;
1910 else if (sta->deflink.he_cap.he_cap_elem.phy_cap_info[0] &
1911 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
1912 return MODE_11AX_HE80_80;
1913 /* not sure if this is a valid case? */
1914 return MODE_11AX_HE160;
1917 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
1918 return MODE_11AX_HE80;
1920 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
1921 return MODE_11AX_HE40;
1923 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_20)
1924 return MODE_11AX_HE20;
1926 return MODE_UNKNOWN;
1929 static void ath12k_peer_assoc_h_phymode(struct ath12k *ar,
1930 struct ieee80211_vif *vif,
1931 struct ieee80211_sta *sta,
1932 struct ath12k_wmi_peer_assoc_arg *arg)
1934 struct ath12k_vif *arvif = (void *)vif->drv_priv;
1935 struct cfg80211_chan_def def;
1936 enum nl80211_band band;
1937 const u8 *ht_mcs_mask;
1938 const u16 *vht_mcs_mask;
1939 enum wmi_phy_mode phymode = MODE_UNKNOWN;
1941 if (WARN_ON(ath12k_mac_vif_chan(vif, &def)))
1944 band = def.chan->band;
1945 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
1946 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
1949 case NL80211_BAND_2GHZ:
1950 if (sta->deflink.he_cap.has_he) {
1951 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
1952 phymode = MODE_11AX_HE80_2G;
1953 else if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
1954 phymode = MODE_11AX_HE40_2G;
1956 phymode = MODE_11AX_HE20_2G;
1957 } else if (sta->deflink.vht_cap.vht_supported &&
1958 !ath12k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
1959 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
1960 phymode = MODE_11AC_VHT40;
1962 phymode = MODE_11AC_VHT20;
1963 } else if (sta->deflink.ht_cap.ht_supported &&
1964 !ath12k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
1965 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
1966 phymode = MODE_11NG_HT40;
1968 phymode = MODE_11NG_HT20;
1969 } else if (ath12k_mac_sta_has_ofdm_only(sta)) {
1975 case NL80211_BAND_5GHZ:
1976 case NL80211_BAND_6GHZ:
1977 /* Check HE first */
1978 if (sta->deflink.he_cap.has_he) {
1979 phymode = ath12k_mac_get_phymode_he(ar, sta);
1980 } else if (sta->deflink.vht_cap.vht_supported &&
1981 !ath12k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
1982 phymode = ath12k_mac_get_phymode_vht(ar, sta);
1983 } else if (sta->deflink.ht_cap.ht_supported &&
1984 !ath12k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
1985 if (sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40)
1986 phymode = MODE_11NA_HT40;
1988 phymode = MODE_11NA_HT20;
1997 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac peer %pM phymode %s\n",
1998 sta->addr, ath12k_mac_phymode_str(phymode));
2000 arg->peer_phymode = phymode;
2001 WARN_ON(phymode == MODE_UNKNOWN);
2004 static void ath12k_peer_assoc_prepare(struct ath12k *ar,
2005 struct ieee80211_vif *vif,
2006 struct ieee80211_sta *sta,
2007 struct ath12k_wmi_peer_assoc_arg *arg,
2010 lockdep_assert_held(&ar->conf_mutex);
2012 memset(arg, 0, sizeof(*arg));
2014 reinit_completion(&ar->peer_assoc_done);
2016 arg->peer_new_assoc = !reassoc;
2017 ath12k_peer_assoc_h_basic(ar, vif, sta, arg);
2018 ath12k_peer_assoc_h_crypto(ar, vif, sta, arg);
2019 ath12k_peer_assoc_h_rates(ar, vif, sta, arg);
2020 ath12k_peer_assoc_h_ht(ar, vif, sta, arg);
2021 ath12k_peer_assoc_h_vht(ar, vif, sta, arg);
2022 ath12k_peer_assoc_h_he(ar, vif, sta, arg);
2023 ath12k_peer_assoc_h_qos(ar, vif, sta, arg);
2024 ath12k_peer_assoc_h_phymode(ar, vif, sta, arg);
2025 ath12k_peer_assoc_h_smps(sta, arg);
2027 /* TODO: amsdu_disable req? */
2030 static int ath12k_setup_peer_smps(struct ath12k *ar, struct ath12k_vif *arvif,
2032 const struct ieee80211_sta_ht_cap *ht_cap)
2036 if (!ht_cap->ht_supported)
2039 smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
2040 smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
2042 if (smps >= ARRAY_SIZE(ath12k_smps_map))
2045 return ath12k_wmi_set_peer_param(ar, addr, arvif->vdev_id,
2046 WMI_PEER_MIMO_PS_STATE,
2047 ath12k_smps_map[smps]);
2050 static void ath12k_bss_assoc(struct ieee80211_hw *hw,
2051 struct ieee80211_vif *vif,
2052 struct ieee80211_bss_conf *bss_conf)
2054 struct ath12k *ar = hw->priv;
2055 struct ath12k_vif *arvif = (void *)vif->drv_priv;
2056 struct ath12k_wmi_peer_assoc_arg peer_arg;
2057 struct ieee80211_sta *ap_sta;
2058 struct ath12k_peer *peer;
2059 bool is_auth = false;
2062 lockdep_assert_held(&ar->conf_mutex);
2064 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %i assoc bssid %pM aid %d\n",
2065 arvif->vdev_id, arvif->bssid, arvif->aid);
2069 ap_sta = ieee80211_find_sta(vif, bss_conf->bssid);
2071 ath12k_warn(ar->ab, "failed to find station entry for bss %pM vdev %i\n",
2072 bss_conf->bssid, arvif->vdev_id);
2077 ath12k_peer_assoc_prepare(ar, vif, ap_sta, &peer_arg, false);
2081 ret = ath12k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
2083 ath12k_warn(ar->ab, "failed to run peer assoc for %pM vdev %i: %d\n",
2084 bss_conf->bssid, arvif->vdev_id, ret);
2088 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) {
2089 ath12k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
2090 bss_conf->bssid, arvif->vdev_id);
2094 ret = ath12k_setup_peer_smps(ar, arvif, bss_conf->bssid,
2095 &ap_sta->deflink.ht_cap);
2097 ath12k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n",
2098 arvif->vdev_id, ret);
2102 WARN_ON(arvif->is_up);
2104 arvif->aid = vif->cfg.aid;
2105 ether_addr_copy(arvif->bssid, bss_conf->bssid);
2107 ret = ath12k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid);
2109 ath12k_warn(ar->ab, "failed to set vdev %d up: %d\n",
2110 arvif->vdev_id, ret);
2114 arvif->is_up = true;
2116 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
2117 "mac vdev %d up (associated) bssid %pM aid %d\n",
2118 arvif->vdev_id, bss_conf->bssid, vif->cfg.aid);
2120 spin_lock_bh(&ar->ab->base_lock);
2122 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arvif->bssid);
2123 if (peer && peer->is_authorized)
2126 spin_unlock_bh(&ar->ab->base_lock);
2128 /* Authorize BSS Peer */
2130 ret = ath12k_wmi_set_peer_param(ar, arvif->bssid,
2135 ath12k_warn(ar->ab, "Unable to authorize BSS peer: %d\n", ret);
2138 ret = ath12k_wmi_send_obss_spr_cmd(ar, arvif->vdev_id,
2139 &bss_conf->he_obss_pd);
2141 ath12k_warn(ar->ab, "failed to set vdev %i OBSS PD parameters: %d\n",
2142 arvif->vdev_id, ret);
2145 static void ath12k_bss_disassoc(struct ieee80211_hw *hw,
2146 struct ieee80211_vif *vif)
2148 struct ath12k *ar = hw->priv;
2149 struct ath12k_vif *arvif = (void *)vif->drv_priv;
2152 lockdep_assert_held(&ar->conf_mutex);
2154 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %i disassoc bssid %pM\n",
2155 arvif->vdev_id, arvif->bssid);
2157 ret = ath12k_wmi_vdev_down(ar, arvif->vdev_id);
2159 ath12k_warn(ar->ab, "failed to down vdev %i: %d\n",
2160 arvif->vdev_id, ret);
2162 arvif->is_up = false;
2164 /* TODO: cancel connection_loss_work */
2167 static u32 ath12k_mac_get_rate_hw_value(int bitrate)
2174 if (ath12k_mac_bitrate_is_cck(bitrate))
2175 preamble = WMI_RATE_PREAMBLE_CCK;
2177 preamble = WMI_RATE_PREAMBLE_OFDM;
2179 for (i = 0; i < ARRAY_SIZE(ath12k_legacy_rates); i++) {
2180 if (ath12k_legacy_rates[i].bitrate != bitrate)
2183 hw_value = ath12k_legacy_rates[i].hw_value;
2184 rate = ATH12K_HW_RATE_CODE(hw_value, 0, preamble);
2192 static void ath12k_recalculate_mgmt_rate(struct ath12k *ar,
2193 struct ieee80211_vif *vif,
2194 struct cfg80211_chan_def *def)
2196 struct ath12k_vif *arvif = (void *)vif->drv_priv;
2197 const struct ieee80211_supported_band *sband;
2204 lockdep_assert_held(&ar->conf_mutex);
2206 sband = ar->hw->wiphy->bands[def->chan->band];
2207 basic_rate_idx = ffs(vif->bss_conf.basic_rates) - 1;
2208 bitrate = sband->bitrates[basic_rate_idx].bitrate;
2210 hw_rate_code = ath12k_mac_get_rate_hw_value(bitrate);
2211 if (hw_rate_code < 0) {
2212 ath12k_warn(ar->ab, "bitrate not supported %d\n", bitrate);
2216 vdev_param = WMI_VDEV_PARAM_MGMT_RATE;
2217 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param,
2220 ath12k_warn(ar->ab, "failed to set mgmt tx rate %d\n", ret);
2222 vdev_param = WMI_VDEV_PARAM_BEACON_RATE;
2223 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param,
2226 ath12k_warn(ar->ab, "failed to set beacon tx rate %d\n", ret);
2229 static int ath12k_mac_fils_discovery(struct ath12k_vif *arvif,
2230 struct ieee80211_bss_conf *info)
2232 struct ath12k *ar = arvif->ar;
2233 struct sk_buff *tmpl;
2236 bool unsol_bcast_probe_resp_enabled = false;
2238 if (info->fils_discovery.max_interval) {
2239 interval = info->fils_discovery.max_interval;
2241 tmpl = ieee80211_get_fils_discovery_tmpl(ar->hw, arvif->vif);
2243 ret = ath12k_wmi_fils_discovery_tmpl(ar, arvif->vdev_id,
2245 } else if (info->unsol_bcast_probe_resp_interval) {
2246 unsol_bcast_probe_resp_enabled = 1;
2247 interval = info->unsol_bcast_probe_resp_interval;
2249 tmpl = ieee80211_get_unsol_bcast_probe_resp_tmpl(ar->hw,
2252 ret = ath12k_wmi_probe_resp_tmpl(ar, arvif->vdev_id,
2254 } else { /* Disable */
2255 return ath12k_wmi_fils_discovery(ar, arvif->vdev_id, 0, false);
2260 "mac vdev %i failed to retrieve %s template\n",
2261 arvif->vdev_id, (unsol_bcast_probe_resp_enabled ?
2262 "unsolicited broadcast probe response" :
2269 ret = ath12k_wmi_fils_discovery(ar, arvif->vdev_id, interval,
2270 unsol_bcast_probe_resp_enabled);
2275 static void ath12k_mac_op_bss_info_changed(struct ieee80211_hw *hw,
2276 struct ieee80211_vif *vif,
2277 struct ieee80211_bss_conf *info,
2280 struct ath12k *ar = hw->priv;
2281 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
2282 struct cfg80211_chan_def def;
2283 u32 param_id, param_value;
2284 enum nl80211_band band;
2294 mutex_lock(&ar->conf_mutex);
2296 if (changed & BSS_CHANGED_BEACON_INT) {
2297 arvif->beacon_interval = info->beacon_int;
2299 param_id = WMI_VDEV_PARAM_BEACON_INTERVAL;
2300 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
2302 arvif->beacon_interval);
2304 ath12k_warn(ar->ab, "Failed to set beacon interval for VDEV: %d\n",
2307 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
2308 "Beacon interval: %d set for VDEV: %d\n",
2309 arvif->beacon_interval, arvif->vdev_id);
2312 if (changed & BSS_CHANGED_BEACON) {
2313 param_id = WMI_PDEV_PARAM_BEACON_TX_MODE;
2314 param_value = WMI_BEACON_STAGGERED_MODE;
2315 ret = ath12k_wmi_pdev_set_param(ar, param_id,
2316 param_value, ar->pdev->pdev_id);
2318 ath12k_warn(ar->ab, "Failed to set beacon mode for VDEV: %d\n",
2321 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
2322 "Set staggered beacon mode for VDEV: %d\n",
2325 ret = ath12k_mac_setup_bcn_tmpl(arvif);
2327 ath12k_warn(ar->ab, "failed to update bcn template: %d\n",
2331 if (changed & (BSS_CHANGED_BEACON_INFO | BSS_CHANGED_BEACON)) {
2332 arvif->dtim_period = info->dtim_period;
2334 param_id = WMI_VDEV_PARAM_DTIM_PERIOD;
2335 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
2337 arvif->dtim_period);
2340 ath12k_warn(ar->ab, "Failed to set dtim period for VDEV %d: %i\n",
2341 arvif->vdev_id, ret);
2343 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
2344 "DTIM period: %d set for VDEV: %d\n",
2345 arvif->dtim_period, arvif->vdev_id);
2348 if (changed & BSS_CHANGED_SSID &&
2349 vif->type == NL80211_IFTYPE_AP) {
2350 arvif->u.ap.ssid_len = vif->cfg.ssid_len;
2351 if (vif->cfg.ssid_len)
2352 memcpy(arvif->u.ap.ssid, vif->cfg.ssid, vif->cfg.ssid_len);
2353 arvif->u.ap.hidden_ssid = info->hidden_ssid;
2356 if (changed & BSS_CHANGED_BSSID && !is_zero_ether_addr(info->bssid))
2357 ether_addr_copy(arvif->bssid, info->bssid);
2359 if (changed & BSS_CHANGED_BEACON_ENABLED) {
2360 ath12k_control_beaconing(arvif, info);
2362 if (arvif->is_up && vif->bss_conf.he_support &&
2363 vif->bss_conf.he_oper.params) {
2364 /* TODO: Extend to support 1024 BA Bitmap size */
2365 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
2366 WMI_VDEV_PARAM_BA_MODE,
2367 WMI_BA_MODE_BUFFER_SIZE_256);
2370 "failed to set BA BUFFER SIZE 256 for vdev: %d\n",
2373 param_id = WMI_VDEV_PARAM_HEOPS_0_31;
2374 param_value = vif->bss_conf.he_oper.params;
2375 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
2376 param_id, param_value);
2377 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
2378 "he oper param: %x set for VDEV: %d\n",
2379 param_value, arvif->vdev_id);
2382 ath12k_warn(ar->ab, "Failed to set he oper params %x for VDEV %d: %i\n",
2383 param_value, arvif->vdev_id, ret);
2387 if (changed & BSS_CHANGED_ERP_CTS_PROT) {
2390 cts_prot = !!(info->use_cts_prot);
2391 param_id = WMI_VDEV_PARAM_PROTECTION_MODE;
2393 if (arvif->is_started) {
2394 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
2395 param_id, cts_prot);
2397 ath12k_warn(ar->ab, "Failed to set CTS prot for VDEV: %d\n",
2400 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "Set CTS prot: %d for VDEV: %d\n",
2401 cts_prot, arvif->vdev_id);
2403 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "defer protection mode setup, vdev is not ready yet\n");
2407 if (changed & BSS_CHANGED_ERP_SLOT) {
2410 if (info->use_short_slot)
2411 slottime = WMI_VDEV_SLOT_TIME_SHORT; /* 9us */
2414 slottime = WMI_VDEV_SLOT_TIME_LONG; /* 20us */
2416 param_id = WMI_VDEV_PARAM_SLOT_TIME;
2417 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
2418 param_id, slottime);
2420 ath12k_warn(ar->ab, "Failed to set erp slot for VDEV: %d\n",
2423 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
2424 "Set slottime: %d for VDEV: %d\n",
2425 slottime, arvif->vdev_id);
2428 if (changed & BSS_CHANGED_ERP_PREAMBLE) {
2431 if (info->use_short_preamble)
2432 preamble = WMI_VDEV_PREAMBLE_SHORT;
2434 preamble = WMI_VDEV_PREAMBLE_LONG;
2436 param_id = WMI_VDEV_PARAM_PREAMBLE;
2437 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
2438 param_id, preamble);
2440 ath12k_warn(ar->ab, "Failed to set preamble for VDEV: %d\n",
2443 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
2444 "Set preamble: %d for VDEV: %d\n",
2445 preamble, arvif->vdev_id);
2448 if (changed & BSS_CHANGED_ASSOC) {
2450 ath12k_bss_assoc(hw, vif, info);
2452 ath12k_bss_disassoc(hw, vif);
2455 if (changed & BSS_CHANGED_TXPOWER) {
2456 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev_id %i txpower %d\n",
2457 arvif->vdev_id, info->txpower);
2459 arvif->txpower = info->txpower;
2460 ath12k_mac_txpower_recalc(ar);
2463 if (changed & BSS_CHANGED_MCAST_RATE &&
2464 !ath12k_mac_vif_chan(arvif->vif, &def)) {
2465 band = def.chan->band;
2466 mcast_rate = vif->bss_conf.mcast_rate[band];
2469 rateidx = mcast_rate - 1;
2471 rateidx = ffs(vif->bss_conf.basic_rates) - 1;
2473 if (ar->pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP)
2474 rateidx += ATH12K_MAC_FIRST_OFDM_RATE_IDX;
2476 bitrate = ath12k_legacy_rates[rateidx].bitrate;
2477 hw_value = ath12k_legacy_rates[rateidx].hw_value;
2479 if (ath12k_mac_bitrate_is_cck(bitrate))
2480 preamble = WMI_RATE_PREAMBLE_CCK;
2482 preamble = WMI_RATE_PREAMBLE_OFDM;
2484 rate = ATH12K_HW_RATE_CODE(hw_value, 0, preamble);
2486 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
2487 "mac vdev %d mcast_rate %x\n",
2488 arvif->vdev_id, rate);
2490 vdev_param = WMI_VDEV_PARAM_MCAST_DATA_RATE;
2491 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
2495 "failed to set mcast rate on vdev %i: %d\n",
2496 arvif->vdev_id, ret);
2498 vdev_param = WMI_VDEV_PARAM_BCAST_DATA_RATE;
2499 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
2503 "failed to set bcast rate on vdev %i: %d\n",
2504 arvif->vdev_id, ret);
2507 if (changed & BSS_CHANGED_BASIC_RATES &&
2508 !ath12k_mac_vif_chan(arvif->vif, &def))
2509 ath12k_recalculate_mgmt_rate(ar, vif, &def);
2511 if (changed & BSS_CHANGED_TWT) {
2512 if (info->twt_requester || info->twt_responder)
2513 ath12k_wmi_send_twt_enable_cmd(ar, ar->pdev->pdev_id);
2515 ath12k_wmi_send_twt_disable_cmd(ar, ar->pdev->pdev_id);
2518 if (changed & BSS_CHANGED_HE_OBSS_PD)
2519 ath12k_wmi_send_obss_spr_cmd(ar, arvif->vdev_id,
2522 if (changed & BSS_CHANGED_HE_BSS_COLOR) {
2523 if (vif->type == NL80211_IFTYPE_AP) {
2524 ret = ath12k_wmi_obss_color_cfg_cmd(ar,
2526 info->he_bss_color.color,
2527 ATH12K_BSS_COLOR_AP_PERIODS,
2528 info->he_bss_color.enabled);
2530 ath12k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n",
2531 arvif->vdev_id, ret);
2532 } else if (vif->type == NL80211_IFTYPE_STATION) {
2533 ret = ath12k_wmi_send_bss_color_change_enable_cmd(ar,
2537 ath12k_warn(ar->ab, "failed to enable bss color change on vdev %i: %d\n",
2538 arvif->vdev_id, ret);
2539 ret = ath12k_wmi_obss_color_cfg_cmd(ar,
2542 ATH12K_BSS_COLOR_STA_PERIODS,
2545 ath12k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n",
2546 arvif->vdev_id, ret);
2550 if (changed & BSS_CHANGED_FILS_DISCOVERY ||
2551 changed & BSS_CHANGED_UNSOL_BCAST_PROBE_RESP)
2552 ath12k_mac_fils_discovery(arvif, info);
2554 mutex_unlock(&ar->conf_mutex);
2557 void __ath12k_mac_scan_finish(struct ath12k *ar)
2559 lockdep_assert_held(&ar->data_lock);
2561 switch (ar->scan.state) {
2562 case ATH12K_SCAN_IDLE:
2564 case ATH12K_SCAN_RUNNING:
2565 case ATH12K_SCAN_ABORTING:
2566 if (!ar->scan.is_roc) {
2567 struct cfg80211_scan_info info = {
2568 .aborted = (ar->scan.state ==
2569 ATH12K_SCAN_ABORTING),
2572 ieee80211_scan_completed(ar->hw, &info);
2573 } else if (ar->scan.roc_notify) {
2574 ieee80211_remain_on_channel_expired(ar->hw);
2577 case ATH12K_SCAN_STARTING:
2578 ar->scan.state = ATH12K_SCAN_IDLE;
2579 ar->scan_channel = NULL;
2580 ar->scan.roc_freq = 0;
2581 cancel_delayed_work(&ar->scan.timeout);
2582 complete(&ar->scan.completed);
2587 void ath12k_mac_scan_finish(struct ath12k *ar)
2589 spin_lock_bh(&ar->data_lock);
2590 __ath12k_mac_scan_finish(ar);
2591 spin_unlock_bh(&ar->data_lock);
2594 static int ath12k_scan_stop(struct ath12k *ar)
2596 struct ath12k_wmi_scan_cancel_arg arg = {
2597 .req_type = WLAN_SCAN_CANCEL_SINGLE,
2598 .scan_id = ATH12K_SCAN_ID,
2602 lockdep_assert_held(&ar->conf_mutex);
2604 /* TODO: Fill other STOP Params */
2605 arg.pdev_id = ar->pdev->pdev_id;
2607 ret = ath12k_wmi_send_scan_stop_cmd(ar, &arg);
2609 ath12k_warn(ar->ab, "failed to stop wmi scan: %d\n", ret);
2613 ret = wait_for_completion_timeout(&ar->scan.completed, 3 * HZ);
2616 "failed to receive scan abort comple: timed out\n");
2618 } else if (ret > 0) {
2623 /* Scan state should be updated upon scan completion but in case
2624 * firmware fails to deliver the event (for whatever reason) it is
2625 * desired to clean up scan state anyway. Firmware may have just
2626 * dropped the scan completion event delivery due to transport pipe
2627 * being overflown with data and/or it can recover on its own before
2628 * next scan request is submitted.
2630 spin_lock_bh(&ar->data_lock);
2631 if (ar->scan.state != ATH12K_SCAN_IDLE)
2632 __ath12k_mac_scan_finish(ar);
2633 spin_unlock_bh(&ar->data_lock);
2638 static void ath12k_scan_abort(struct ath12k *ar)
2642 lockdep_assert_held(&ar->conf_mutex);
2644 spin_lock_bh(&ar->data_lock);
2646 switch (ar->scan.state) {
2647 case ATH12K_SCAN_IDLE:
2648 /* This can happen if timeout worker kicked in and called
2649 * abortion while scan completion was being processed.
2652 case ATH12K_SCAN_STARTING:
2653 case ATH12K_SCAN_ABORTING:
2654 ath12k_warn(ar->ab, "refusing scan abortion due to invalid scan state: %d\n",
2657 case ATH12K_SCAN_RUNNING:
2658 ar->scan.state = ATH12K_SCAN_ABORTING;
2659 spin_unlock_bh(&ar->data_lock);
2661 ret = ath12k_scan_stop(ar);
2663 ath12k_warn(ar->ab, "failed to abort scan: %d\n", ret);
2665 spin_lock_bh(&ar->data_lock);
2669 spin_unlock_bh(&ar->data_lock);
2672 static void ath12k_scan_timeout_work(struct work_struct *work)
2674 struct ath12k *ar = container_of(work, struct ath12k,
2677 mutex_lock(&ar->conf_mutex);
2678 ath12k_scan_abort(ar);
2679 mutex_unlock(&ar->conf_mutex);
2682 static int ath12k_start_scan(struct ath12k *ar,
2683 struct ath12k_wmi_scan_req_arg *arg)
2687 lockdep_assert_held(&ar->conf_mutex);
2689 ret = ath12k_wmi_send_scan_start_cmd(ar, arg);
2693 ret = wait_for_completion_timeout(&ar->scan.started, 1 * HZ);
2695 ret = ath12k_scan_stop(ar);
2697 ath12k_warn(ar->ab, "failed to stop scan: %d\n", ret);
2702 /* If we failed to start the scan, return error code at
2703 * this point. This is probably due to some issue in the
2704 * firmware, but no need to wedge the driver due to that...
2706 spin_lock_bh(&ar->data_lock);
2707 if (ar->scan.state == ATH12K_SCAN_IDLE) {
2708 spin_unlock_bh(&ar->data_lock);
2711 spin_unlock_bh(&ar->data_lock);
2716 static int ath12k_mac_op_hw_scan(struct ieee80211_hw *hw,
2717 struct ieee80211_vif *vif,
2718 struct ieee80211_scan_request *hw_req)
2720 struct ath12k *ar = hw->priv;
2721 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
2722 struct cfg80211_scan_request *req = &hw_req->req;
2723 struct ath12k_wmi_scan_req_arg arg = {};
2727 mutex_lock(&ar->conf_mutex);
2729 spin_lock_bh(&ar->data_lock);
2730 switch (ar->scan.state) {
2731 case ATH12K_SCAN_IDLE:
2732 reinit_completion(&ar->scan.started);
2733 reinit_completion(&ar->scan.completed);
2734 ar->scan.state = ATH12K_SCAN_STARTING;
2735 ar->scan.is_roc = false;
2736 ar->scan.vdev_id = arvif->vdev_id;
2739 case ATH12K_SCAN_STARTING:
2740 case ATH12K_SCAN_RUNNING:
2741 case ATH12K_SCAN_ABORTING:
2745 spin_unlock_bh(&ar->data_lock);
2750 ath12k_wmi_start_scan_init(ar, &arg);
2751 arg.vdev_id = arvif->vdev_id;
2752 arg.scan_id = ATH12K_SCAN_ID;
2755 arg.extraie.len = req->ie_len;
2756 arg.extraie.ptr = kzalloc(req->ie_len, GFP_KERNEL);
2757 memcpy(arg.extraie.ptr, req->ie, req->ie_len);
2761 arg.num_ssids = req->n_ssids;
2762 for (i = 0; i < arg.num_ssids; i++)
2763 arg.ssid[i] = req->ssids[i];
2765 arg.scan_flags |= WMI_SCAN_FLAG_PASSIVE;
2768 if (req->n_channels) {
2769 arg.num_chan = req->n_channels;
2770 for (i = 0; i < arg.num_chan; i++)
2771 arg.chan_list[i] = req->channels[i]->center_freq;
2774 ret = ath12k_start_scan(ar, &arg);
2776 ath12k_warn(ar->ab, "failed to start hw scan: %d\n", ret);
2777 spin_lock_bh(&ar->data_lock);
2778 ar->scan.state = ATH12K_SCAN_IDLE;
2779 spin_unlock_bh(&ar->data_lock);
2782 /* Add a margin to account for event/command processing */
2783 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
2784 msecs_to_jiffies(arg.max_scan_time +
2785 ATH12K_MAC_SCAN_TIMEOUT_MSECS));
2789 kfree(arg.extraie.ptr);
2791 mutex_unlock(&ar->conf_mutex);
2795 static void ath12k_mac_op_cancel_hw_scan(struct ieee80211_hw *hw,
2796 struct ieee80211_vif *vif)
2798 struct ath12k *ar = hw->priv;
2800 mutex_lock(&ar->conf_mutex);
2801 ath12k_scan_abort(ar);
2802 mutex_unlock(&ar->conf_mutex);
2804 cancel_delayed_work_sync(&ar->scan.timeout);
2807 static int ath12k_install_key(struct ath12k_vif *arvif,
2808 struct ieee80211_key_conf *key,
2809 enum set_key_cmd cmd,
2810 const u8 *macaddr, u32 flags)
2813 struct ath12k *ar = arvif->ar;
2814 struct wmi_vdev_install_key_arg arg = {
2815 .vdev_id = arvif->vdev_id,
2816 .key_idx = key->keyidx,
2817 .key_len = key->keylen,
2818 .key_data = key->key,
2823 lockdep_assert_held(&arvif->ar->conf_mutex);
2825 reinit_completion(&ar->install_key_done);
2827 if (test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags))
2830 if (cmd == DISABLE_KEY) {
2831 /* TODO: Check if FW expects value other than NONE for del */
2832 /* arg.key_cipher = WMI_CIPHER_NONE; */
2834 arg.key_data = NULL;
2838 switch (key->cipher) {
2839 case WLAN_CIPHER_SUITE_CCMP:
2840 arg.key_cipher = WMI_CIPHER_AES_CCM;
2841 /* TODO: Re-check if flag is valid */
2842 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT;
2844 case WLAN_CIPHER_SUITE_TKIP:
2845 arg.key_cipher = WMI_CIPHER_TKIP;
2846 arg.key_txmic_len = 8;
2847 arg.key_rxmic_len = 8;
2849 case WLAN_CIPHER_SUITE_CCMP_256:
2850 arg.key_cipher = WMI_CIPHER_AES_CCM;
2852 case WLAN_CIPHER_SUITE_GCMP:
2853 case WLAN_CIPHER_SUITE_GCMP_256:
2854 arg.key_cipher = WMI_CIPHER_AES_GCM;
2857 ath12k_warn(ar->ab, "cipher %d is not supported\n", key->cipher);
2861 if (test_bit(ATH12K_FLAG_RAW_MODE, &ar->ab->dev_flags))
2862 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV |
2863 IEEE80211_KEY_FLAG_RESERVE_TAILROOM;
2866 ret = ath12k_wmi_vdev_install_key(arvif->ar, &arg);
2871 if (!wait_for_completion_timeout(&ar->install_key_done, 1 * HZ))
2874 if (ether_addr_equal(macaddr, arvif->vif->addr))
2875 arvif->key_cipher = key->cipher;
2877 return ar->install_key_status ? -EINVAL : 0;
2880 static int ath12k_clear_peer_keys(struct ath12k_vif *arvif,
2883 struct ath12k *ar = arvif->ar;
2884 struct ath12k_base *ab = ar->ab;
2885 struct ath12k_peer *peer;
2886 int first_errno = 0;
2891 lockdep_assert_held(&ar->conf_mutex);
2893 spin_lock_bh(&ab->base_lock);
2894 peer = ath12k_peer_find(ab, arvif->vdev_id, addr);
2895 spin_unlock_bh(&ab->base_lock);
2900 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
2904 /* key flags are not required to delete the key */
2905 ret = ath12k_install_key(arvif, peer->keys[i],
2906 DISABLE_KEY, addr, flags);
2907 if (ret < 0 && first_errno == 0)
2911 ath12k_warn(ab, "failed to remove peer key %d: %d\n",
2914 spin_lock_bh(&ab->base_lock);
2915 peer->keys[i] = NULL;
2916 spin_unlock_bh(&ab->base_lock);
2922 static int ath12k_mac_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
2923 struct ieee80211_vif *vif, struct ieee80211_sta *sta,
2924 struct ieee80211_key_conf *key)
2926 struct ath12k *ar = hw->priv;
2927 struct ath12k_base *ab = ar->ab;
2928 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
2929 struct ath12k_peer *peer;
2930 struct ath12k_sta *arsta;
2931 const u8 *peer_addr;
2935 /* BIP needs to be done in software */
2936 if (key->cipher == WLAN_CIPHER_SUITE_AES_CMAC ||
2937 key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_128 ||
2938 key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_256 ||
2939 key->cipher == WLAN_CIPHER_SUITE_BIP_CMAC_256)
2942 if (test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags))
2945 if (key->keyidx > WMI_MAX_KEY_INDEX)
2948 mutex_lock(&ar->conf_mutex);
2951 peer_addr = sta->addr;
2952 else if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
2953 peer_addr = vif->bss_conf.bssid;
2955 peer_addr = vif->addr;
2957 key->hw_key_idx = key->keyidx;
2959 /* the peer should not disappear in mid-way (unless FW goes awry) since
2960 * we already hold conf_mutex. we just make sure its there now.
2962 spin_lock_bh(&ab->base_lock);
2963 peer = ath12k_peer_find(ab, arvif->vdev_id, peer_addr);
2964 spin_unlock_bh(&ab->base_lock);
2967 if (cmd == SET_KEY) {
2968 ath12k_warn(ab, "cannot install key for non-existent peer %pM\n",
2973 /* if the peer doesn't exist there is no key to disable
2980 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
2981 flags |= WMI_KEY_PAIRWISE;
2983 flags |= WMI_KEY_GROUP;
2985 ret = ath12k_install_key(arvif, key, cmd, peer_addr, flags);
2987 ath12k_warn(ab, "ath12k_install_key failed (%d)\n", ret);
2991 ret = ath12k_dp_rx_peer_pn_replay_config(arvif, peer_addr, cmd, key);
2993 ath12k_warn(ab, "failed to offload PN replay detection %d\n", ret);
2997 spin_lock_bh(&ab->base_lock);
2998 peer = ath12k_peer_find(ab, arvif->vdev_id, peer_addr);
2999 if (peer && cmd == SET_KEY) {
3000 peer->keys[key->keyidx] = key;
3001 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) {
3002 peer->ucast_keyidx = key->keyidx;
3003 peer->sec_type = ath12k_dp_tx_get_encrypt_type(key->cipher);
3005 peer->mcast_keyidx = key->keyidx;
3006 peer->sec_type_grp = ath12k_dp_tx_get_encrypt_type(key->cipher);
3008 } else if (peer && cmd == DISABLE_KEY) {
3009 peer->keys[key->keyidx] = NULL;
3010 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
3011 peer->ucast_keyidx = 0;
3013 peer->mcast_keyidx = 0;
3015 /* impossible unless FW goes crazy */
3016 ath12k_warn(ab, "peer %pM disappeared!\n", peer_addr);
3019 arsta = (struct ath12k_sta *)sta->drv_priv;
3021 switch (key->cipher) {
3022 case WLAN_CIPHER_SUITE_TKIP:
3023 case WLAN_CIPHER_SUITE_CCMP:
3024 case WLAN_CIPHER_SUITE_CCMP_256:
3025 case WLAN_CIPHER_SUITE_GCMP:
3026 case WLAN_CIPHER_SUITE_GCMP_256:
3028 arsta->pn_type = HAL_PN_TYPE_WPA;
3030 arsta->pn_type = HAL_PN_TYPE_NONE;
3033 arsta->pn_type = HAL_PN_TYPE_NONE;
3038 spin_unlock_bh(&ab->base_lock);
3041 mutex_unlock(&ar->conf_mutex);
3046 ath12k_mac_bitrate_mask_num_vht_rates(struct ath12k *ar,
3047 enum nl80211_band band,
3048 const struct cfg80211_bitrate_mask *mask)
3053 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++)
3054 num_rates += hweight16(mask->control[band].vht_mcs[i]);
3060 ath12k_mac_set_peer_vht_fixed_rate(struct ath12k_vif *arvif,
3061 struct ieee80211_sta *sta,
3062 const struct cfg80211_bitrate_mask *mask,
3063 enum nl80211_band band)
3065 struct ath12k *ar = arvif->ar;
3070 lockdep_assert_held(&ar->conf_mutex);
3074 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
3075 if (hweight16(mask->control[band].vht_mcs[i]) == 1) {
3077 vht_rate = ffs(mask->control[band].vht_mcs[i]) - 1;
3082 ath12k_warn(ar->ab, "No single VHT Fixed rate found to set for %pM",
3087 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
3088 "Setting Fixed VHT Rate for peer %pM. Device will not switch to any other selected rates",
3091 rate_code = ATH12K_HW_RATE_CODE(vht_rate, nss - 1,
3092 WMI_RATE_PREAMBLE_VHT);
3093 ret = ath12k_wmi_set_peer_param(ar, sta->addr,
3095 WMI_PEER_PARAM_FIXED_RATE,
3099 "failed to update STA %pM Fixed Rate %d: %d\n",
3100 sta->addr, rate_code, ret);
3105 static int ath12k_station_assoc(struct ath12k *ar,
3106 struct ieee80211_vif *vif,
3107 struct ieee80211_sta *sta,
3110 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
3111 struct ath12k_wmi_peer_assoc_arg peer_arg;
3113 struct cfg80211_chan_def def;
3114 enum nl80211_band band;
3115 struct cfg80211_bitrate_mask *mask;
3118 lockdep_assert_held(&ar->conf_mutex);
3120 if (WARN_ON(ath12k_mac_vif_chan(vif, &def)))
3123 band = def.chan->band;
3124 mask = &arvif->bitrate_mask;
3126 ath12k_peer_assoc_prepare(ar, vif, sta, &peer_arg, reassoc);
3128 ret = ath12k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
3130 ath12k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n",
3131 sta->addr, arvif->vdev_id, ret);
3135 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) {
3136 ath12k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
3137 sta->addr, arvif->vdev_id);
3141 num_vht_rates = ath12k_mac_bitrate_mask_num_vht_rates(ar, band, mask);
3143 /* If single VHT rate is configured (by set_bitrate_mask()),
3144 * peer_assoc will disable VHT. This is now enabled by a peer specific
3146 * Note that all other rates and NSS will be disabled for this peer.
3148 if (sta->deflink.vht_cap.vht_supported && num_vht_rates == 1) {
3149 ret = ath12k_mac_set_peer_vht_fixed_rate(arvif, sta, mask,
3155 /* Re-assoc is run only to update supported rates for given station. It
3156 * doesn't make much sense to reconfigure the peer completely.
3161 ret = ath12k_setup_peer_smps(ar, arvif, sta->addr,
3162 &sta->deflink.ht_cap);
3164 ath12k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n",
3165 arvif->vdev_id, ret);
3170 arvif->num_legacy_stations++;
3171 ret = ath12k_recalc_rtscts_prot(arvif);
3176 if (sta->wme && sta->uapsd_queues) {
3177 ret = ath12k_peer_assoc_qos_ap(ar, arvif, sta);
3179 ath12k_warn(ar->ab, "failed to set qos params for STA %pM for vdev %i: %d\n",
3180 sta->addr, arvif->vdev_id, ret);
3188 static int ath12k_station_disassoc(struct ath12k *ar,
3189 struct ieee80211_vif *vif,
3190 struct ieee80211_sta *sta)
3192 struct ath12k_vif *arvif = (void *)vif->drv_priv;
3195 lockdep_assert_held(&ar->conf_mutex);
3198 arvif->num_legacy_stations--;
3199 ret = ath12k_recalc_rtscts_prot(arvif);
3204 ret = ath12k_clear_peer_keys(arvif, sta->addr);
3206 ath12k_warn(ar->ab, "failed to clear all peer keys for vdev %i: %d\n",
3207 arvif->vdev_id, ret);
3213 static void ath12k_sta_rc_update_wk(struct work_struct *wk)
3216 struct ath12k_vif *arvif;
3217 struct ath12k_sta *arsta;
3218 struct ieee80211_sta *sta;
3219 struct cfg80211_chan_def def;
3220 enum nl80211_band band;
3221 const u8 *ht_mcs_mask;
3222 const u16 *vht_mcs_mask;
3223 u32 changed, bw, nss, smps, bw_prev;
3224 int err, num_vht_rates;
3225 const struct cfg80211_bitrate_mask *mask;
3226 struct ath12k_wmi_peer_assoc_arg peer_arg;
3227 enum wmi_phy_mode peer_phymode;
3229 arsta = container_of(wk, struct ath12k_sta, update_wk);
3230 sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv);
3231 arvif = arsta->arvif;
3234 if (WARN_ON(ath12k_mac_vif_chan(arvif->vif, &def)))
3237 band = def.chan->band;
3238 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
3239 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
3241 spin_lock_bh(&ar->data_lock);
3243 changed = arsta->changed;
3247 bw_prev = arsta->bw_prev;
3251 spin_unlock_bh(&ar->data_lock);
3253 mutex_lock(&ar->conf_mutex);
3255 nss = max_t(u32, 1, nss);
3256 nss = min(nss, max(ath12k_mac_max_ht_nss(ht_mcs_mask),
3257 ath12k_mac_max_vht_nss(vht_mcs_mask)));
3259 if (changed & IEEE80211_RC_BW_CHANGED) {
3260 ath12k_peer_assoc_h_phymode(ar, arvif->vif, sta, &peer_arg);
3261 peer_phymode = peer_arg.peer_phymode;
3264 /* Phymode shows maximum supported channel width, if we
3265 * upgrade bandwidth then due to sanity check of firmware,
3266 * we have to send WMI_PEER_PHYMODE followed by
3269 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac bandwidth upgrade for sta %pM new %d old %d\n",
3270 sta->addr, bw, bw_prev);
3271 err = ath12k_wmi_set_peer_param(ar, sta->addr,
3272 arvif->vdev_id, WMI_PEER_PHYMODE,
3275 ath12k_warn(ar->ab, "failed to update STA %pM to peer phymode %d: %d\n",
3276 sta->addr, peer_phymode, err);
3277 goto err_rc_bw_changed;
3279 err = ath12k_wmi_set_peer_param(ar, sta->addr,
3280 arvif->vdev_id, WMI_PEER_CHWIDTH,
3283 ath12k_warn(ar->ab, "failed to update STA %pM to peer bandwidth %d: %d\n",
3284 sta->addr, bw, err);
3286 /* When we downgrade bandwidth this will conflict with phymode
3287 * and cause to trigger firmware crash. In this case we send
3288 * WMI_PEER_CHWIDTH followed by WMI_PEER_PHYMODE
3290 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac bandwidth downgrade for sta %pM new %d old %d\n",
3291 sta->addr, bw, bw_prev);
3292 err = ath12k_wmi_set_peer_param(ar, sta->addr,
3293 arvif->vdev_id, WMI_PEER_CHWIDTH,
3296 ath12k_warn(ar->ab, "failed to update STA %pM peer to bandwidth %d: %d\n",
3297 sta->addr, bw, err);
3298 goto err_rc_bw_changed;
3300 err = ath12k_wmi_set_peer_param(ar, sta->addr,
3301 arvif->vdev_id, WMI_PEER_PHYMODE,
3304 ath12k_warn(ar->ab, "failed to update STA %pM to peer phymode %d: %d\n",
3305 sta->addr, peer_phymode, err);
3309 if (changed & IEEE80211_RC_NSS_CHANGED) {
3310 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac update sta %pM nss %d\n",
3313 err = ath12k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
3316 ath12k_warn(ar->ab, "failed to update STA %pM nss %d: %d\n",
3317 sta->addr, nss, err);
3320 if (changed & IEEE80211_RC_SMPS_CHANGED) {
3321 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac update sta %pM smps %d\n",
3324 err = ath12k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
3325 WMI_PEER_MIMO_PS_STATE, smps);
3327 ath12k_warn(ar->ab, "failed to update STA %pM smps %d: %d\n",
3328 sta->addr, smps, err);
3331 if (changed & IEEE80211_RC_SUPP_RATES_CHANGED) {
3332 mask = &arvif->bitrate_mask;
3333 num_vht_rates = ath12k_mac_bitrate_mask_num_vht_rates(ar, band,
3336 /* Peer_assoc_prepare will reject vht rates in
3337 * bitrate_mask if its not available in range format and
3338 * sets vht tx_rateset as unsupported. So multiple VHT MCS
3339 * setting(eg. MCS 4,5,6) per peer is not supported here.
3340 * But, Single rate in VHT mask can be set as per-peer
3341 * fixed rate. But even if any HT rates are configured in
3342 * the bitrate mask, device will not switch to those rates
3343 * when per-peer Fixed rate is set.
3344 * TODO: Check RATEMASK_CMDID to support auto rates selection
3345 * across HT/VHT and for multiple VHT MCS support.
3347 if (sta->deflink.vht_cap.vht_supported && num_vht_rates == 1) {
3348 ath12k_mac_set_peer_vht_fixed_rate(arvif, sta, mask,
3351 /* If the peer is non-VHT or no fixed VHT rate
3352 * is provided in the new bitrate mask we set the
3353 * other rates using peer_assoc command.
3355 ath12k_peer_assoc_prepare(ar, arvif->vif, sta,
3358 err = ath12k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
3360 ath12k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n",
3361 sta->addr, arvif->vdev_id, err);
3363 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ))
3364 ath12k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
3365 sta->addr, arvif->vdev_id);
3369 mutex_unlock(&ar->conf_mutex);
3372 static int ath12k_mac_inc_num_stations(struct ath12k_vif *arvif,
3373 struct ieee80211_sta *sta)
3375 struct ath12k *ar = arvif->ar;
3377 lockdep_assert_held(&ar->conf_mutex);
3379 if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
3382 if (ar->num_stations >= ar->max_num_stations)
3390 static void ath12k_mac_dec_num_stations(struct ath12k_vif *arvif,
3391 struct ieee80211_sta *sta)
3393 struct ath12k *ar = arvif->ar;
3395 lockdep_assert_held(&ar->conf_mutex);
3397 if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
3403 static int ath12k_mac_station_add(struct ath12k *ar,
3404 struct ieee80211_vif *vif,
3405 struct ieee80211_sta *sta)
3407 struct ath12k_base *ab = ar->ab;
3408 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
3409 struct ath12k_sta *arsta = (struct ath12k_sta *)sta->drv_priv;
3410 struct ath12k_wmi_peer_create_arg peer_param;
3413 lockdep_assert_held(&ar->conf_mutex);
3415 ret = ath12k_mac_inc_num_stations(arvif, sta);
3417 ath12k_warn(ab, "refusing to associate station: too many connected already (%d)\n",
3418 ar->max_num_stations);
3422 arsta->rx_stats = kzalloc(sizeof(*arsta->rx_stats), GFP_KERNEL);
3423 if (!arsta->rx_stats) {
3425 goto dec_num_station;
3428 peer_param.vdev_id = arvif->vdev_id;
3429 peer_param.peer_addr = sta->addr;
3430 peer_param.peer_type = WMI_PEER_TYPE_DEFAULT;
3432 ret = ath12k_peer_create(ar, arvif, sta, &peer_param);
3434 ath12k_warn(ab, "Failed to add peer: %pM for VDEV: %d\n",
3435 sta->addr, arvif->vdev_id);
3439 ath12k_dbg(ab, ATH12K_DBG_MAC, "Added peer: %pM for VDEV: %d\n",
3440 sta->addr, arvif->vdev_id);
3442 if (ieee80211_vif_is_mesh(vif)) {
3443 ret = ath12k_wmi_set_peer_param(ar, sta->addr,
3445 WMI_PEER_USE_4ADDR, 1);
3447 ath12k_warn(ab, "failed to STA %pM 4addr capability: %d\n",
3453 ret = ath12k_dp_peer_setup(ar, arvif->vdev_id, sta->addr);
3455 ath12k_warn(ab, "failed to setup dp for peer %pM on vdev %i (%d)\n",
3456 sta->addr, arvif->vdev_id, ret);
3460 if (ab->hw_params->vdev_start_delay &&
3461 !arvif->is_started &&
3462 arvif->vdev_type != WMI_VDEV_TYPE_AP) {
3463 ret = ath12k_start_vdev_delay(ar->hw, vif);
3465 ath12k_warn(ab, "failed to delay vdev start: %d\n", ret);
3473 ath12k_peer_delete(ar, arvif->vdev_id, sta->addr);
3475 ath12k_mac_dec_num_stations(arvif, sta);
3480 static u32 ath12k_mac_ieee80211_sta_bw_to_wmi(struct ath12k *ar,
3481 struct ieee80211_sta *sta)
3483 u32 bw = WMI_PEER_CHWIDTH_20MHZ;
3485 switch (sta->deflink.bandwidth) {
3486 case IEEE80211_STA_RX_BW_20:
3487 bw = WMI_PEER_CHWIDTH_20MHZ;
3489 case IEEE80211_STA_RX_BW_40:
3490 bw = WMI_PEER_CHWIDTH_40MHZ;
3492 case IEEE80211_STA_RX_BW_80:
3493 bw = WMI_PEER_CHWIDTH_80MHZ;
3495 case IEEE80211_STA_RX_BW_160:
3496 bw = WMI_PEER_CHWIDTH_160MHZ;
3499 ath12k_warn(ar->ab, "Invalid bandwidth %d in rc update for %pM\n",
3500 sta->deflink.bandwidth, sta->addr);
3501 bw = WMI_PEER_CHWIDTH_20MHZ;
3508 static int ath12k_mac_op_sta_state(struct ieee80211_hw *hw,
3509 struct ieee80211_vif *vif,
3510 struct ieee80211_sta *sta,
3511 enum ieee80211_sta_state old_state,
3512 enum ieee80211_sta_state new_state)
3514 struct ath12k *ar = hw->priv;
3515 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
3516 struct ath12k_sta *arsta = (struct ath12k_sta *)sta->drv_priv;
3517 struct ath12k_peer *peer;
3520 /* cancel must be done outside the mutex to avoid deadlock */
3521 if ((old_state == IEEE80211_STA_NONE &&
3522 new_state == IEEE80211_STA_NOTEXIST))
3523 cancel_work_sync(&arsta->update_wk);
3525 mutex_lock(&ar->conf_mutex);
3527 if (old_state == IEEE80211_STA_NOTEXIST &&
3528 new_state == IEEE80211_STA_NONE) {
3529 memset(arsta, 0, sizeof(*arsta));
3530 arsta->arvif = arvif;
3531 INIT_WORK(&arsta->update_wk, ath12k_sta_rc_update_wk);
3533 ret = ath12k_mac_station_add(ar, vif, sta);
3535 ath12k_warn(ar->ab, "Failed to add station: %pM for VDEV: %d\n",
3536 sta->addr, arvif->vdev_id);
3537 } else if ((old_state == IEEE80211_STA_NONE &&
3538 new_state == IEEE80211_STA_NOTEXIST)) {
3539 ath12k_dp_peer_cleanup(ar, arvif->vdev_id, sta->addr);
3541 ret = ath12k_peer_delete(ar, arvif->vdev_id, sta->addr);
3543 ath12k_warn(ar->ab, "Failed to delete peer: %pM for VDEV: %d\n",
3544 sta->addr, arvif->vdev_id);
3546 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "Removed peer: %pM for VDEV: %d\n",
3547 sta->addr, arvif->vdev_id);
3549 ath12k_mac_dec_num_stations(arvif, sta);
3550 spin_lock_bh(&ar->ab->base_lock);
3551 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
3552 if (peer && peer->sta == sta) {
3553 ath12k_warn(ar->ab, "Found peer entry %pM n vdev %i after it was supposedly removed\n",
3554 vif->addr, arvif->vdev_id);
3556 list_del(&peer->list);
3560 spin_unlock_bh(&ar->ab->base_lock);
3562 kfree(arsta->rx_stats);
3563 arsta->rx_stats = NULL;
3564 } else if (old_state == IEEE80211_STA_AUTH &&
3565 new_state == IEEE80211_STA_ASSOC &&
3566 (vif->type == NL80211_IFTYPE_AP ||
3567 vif->type == NL80211_IFTYPE_MESH_POINT ||
3568 vif->type == NL80211_IFTYPE_ADHOC)) {
3569 ret = ath12k_station_assoc(ar, vif, sta, false);
3571 ath12k_warn(ar->ab, "Failed to associate station: %pM\n",
3574 spin_lock_bh(&ar->data_lock);
3576 arsta->bw = ath12k_mac_ieee80211_sta_bw_to_wmi(ar, sta);
3577 arsta->bw_prev = sta->deflink.bandwidth;
3579 spin_unlock_bh(&ar->data_lock);
3580 } else if (old_state == IEEE80211_STA_ASSOC &&
3581 new_state == IEEE80211_STA_AUTHORIZED) {
3582 spin_lock_bh(&ar->ab->base_lock);
3584 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
3586 peer->is_authorized = true;
3588 spin_unlock_bh(&ar->ab->base_lock);
3590 if (vif->type == NL80211_IFTYPE_STATION && arvif->is_up) {
3591 ret = ath12k_wmi_set_peer_param(ar, sta->addr,
3596 ath12k_warn(ar->ab, "Unable to authorize peer %pM vdev %d: %d\n",
3597 sta->addr, arvif->vdev_id, ret);
3599 } else if (old_state == IEEE80211_STA_AUTHORIZED &&
3600 new_state == IEEE80211_STA_ASSOC) {
3601 spin_lock_bh(&ar->ab->base_lock);
3603 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
3605 peer->is_authorized = false;
3607 spin_unlock_bh(&ar->ab->base_lock);
3608 } else if (old_state == IEEE80211_STA_ASSOC &&
3609 new_state == IEEE80211_STA_AUTH &&
3610 (vif->type == NL80211_IFTYPE_AP ||
3611 vif->type == NL80211_IFTYPE_MESH_POINT ||
3612 vif->type == NL80211_IFTYPE_ADHOC)) {
3613 ret = ath12k_station_disassoc(ar, vif, sta);
3615 ath12k_warn(ar->ab, "Failed to disassociate station: %pM\n",
3619 mutex_unlock(&ar->conf_mutex);
3623 static int ath12k_mac_op_sta_set_txpwr(struct ieee80211_hw *hw,
3624 struct ieee80211_vif *vif,
3625 struct ieee80211_sta *sta)
3627 struct ath12k *ar = hw->priv;
3628 struct ath12k_vif *arvif = (void *)vif->drv_priv;
3632 if (sta->deflink.txpwr.type == NL80211_TX_POWER_AUTOMATIC) {
3635 txpwr = sta->deflink.txpwr.power;
3640 if (txpwr > ATH12K_TX_POWER_MAX_VAL || txpwr < ATH12K_TX_POWER_MIN_VAL)
3643 mutex_lock(&ar->conf_mutex);
3645 ret = ath12k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
3646 WMI_PEER_USE_FIXED_PWR, txpwr);
3648 ath12k_warn(ar->ab, "failed to set tx power for station ret: %d\n",
3654 mutex_unlock(&ar->conf_mutex);
3658 static void ath12k_mac_op_sta_rc_update(struct ieee80211_hw *hw,
3659 struct ieee80211_vif *vif,
3660 struct ieee80211_sta *sta,
3663 struct ath12k *ar = hw->priv;
3664 struct ath12k_sta *arsta = (struct ath12k_sta *)sta->drv_priv;
3665 struct ath12k_vif *arvif = (void *)vif->drv_priv;
3666 struct ath12k_peer *peer;
3669 spin_lock_bh(&ar->ab->base_lock);
3671 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
3673 spin_unlock_bh(&ar->ab->base_lock);
3674 ath12k_warn(ar->ab, "mac sta rc update failed to find peer %pM on vdev %i\n",
3675 sta->addr, arvif->vdev_id);
3679 spin_unlock_bh(&ar->ab->base_lock);
3681 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
3682 "mac sta rc update for %pM changed %08x bw %d nss %d smps %d\n",
3683 sta->addr, changed, sta->deflink.bandwidth, sta->deflink.rx_nss,
3684 sta->deflink.smps_mode);
3686 spin_lock_bh(&ar->data_lock);
3688 if (changed & IEEE80211_RC_BW_CHANGED) {
3689 bw = ath12k_mac_ieee80211_sta_bw_to_wmi(ar, sta);
3690 arsta->bw_prev = arsta->bw;
3694 if (changed & IEEE80211_RC_NSS_CHANGED)
3695 arsta->nss = sta->deflink.rx_nss;
3697 if (changed & IEEE80211_RC_SMPS_CHANGED) {
3698 smps = WMI_PEER_SMPS_PS_NONE;
3700 switch (sta->deflink.smps_mode) {
3701 case IEEE80211_SMPS_AUTOMATIC:
3702 case IEEE80211_SMPS_OFF:
3703 smps = WMI_PEER_SMPS_PS_NONE;
3705 case IEEE80211_SMPS_STATIC:
3706 smps = WMI_PEER_SMPS_STATIC;
3708 case IEEE80211_SMPS_DYNAMIC:
3709 smps = WMI_PEER_SMPS_DYNAMIC;
3712 ath12k_warn(ar->ab, "Invalid smps %d in sta rc update for %pM\n",
3713 sta->deflink.smps_mode, sta->addr);
3714 smps = WMI_PEER_SMPS_PS_NONE;
3721 arsta->changed |= changed;
3723 spin_unlock_bh(&ar->data_lock);
3725 ieee80211_queue_work(hw, &arsta->update_wk);
3728 static int ath12k_conf_tx_uapsd(struct ath12k *ar, struct ieee80211_vif *vif,
3729 u16 ac, bool enable)
3731 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
3735 if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
3739 case IEEE80211_AC_VO:
3740 value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN |
3741 WMI_STA_PS_UAPSD_AC3_TRIGGER_EN;
3743 case IEEE80211_AC_VI:
3744 value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN |
3745 WMI_STA_PS_UAPSD_AC2_TRIGGER_EN;
3747 case IEEE80211_AC_BE:
3748 value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN |
3749 WMI_STA_PS_UAPSD_AC1_TRIGGER_EN;
3751 case IEEE80211_AC_BK:
3752 value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN |
3753 WMI_STA_PS_UAPSD_AC0_TRIGGER_EN;
3758 arvif->u.sta.uapsd |= value;
3760 arvif->u.sta.uapsd &= ~value;
3762 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
3763 WMI_STA_PS_PARAM_UAPSD,
3764 arvif->u.sta.uapsd);
3766 ath12k_warn(ar->ab, "could not set uapsd params %d\n", ret);
3770 if (arvif->u.sta.uapsd)
3771 value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD;
3773 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
3775 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
3776 WMI_STA_PS_PARAM_RX_WAKE_POLICY,
3779 ath12k_warn(ar->ab, "could not set rx wake param %d\n", ret);
3785 static int ath12k_mac_op_conf_tx(struct ieee80211_hw *hw,
3786 struct ieee80211_vif *vif,
3787 unsigned int link_id, u16 ac,
3788 const struct ieee80211_tx_queue_params *params)
3790 struct ath12k *ar = hw->priv;
3791 struct ath12k_vif *arvif = (void *)vif->drv_priv;
3792 struct wmi_wmm_params_arg *p = NULL;
3795 mutex_lock(&ar->conf_mutex);
3798 case IEEE80211_AC_VO:
3799 p = &arvif->wmm_params.ac_vo;
3801 case IEEE80211_AC_VI:
3802 p = &arvif->wmm_params.ac_vi;
3804 case IEEE80211_AC_BE:
3805 p = &arvif->wmm_params.ac_be;
3807 case IEEE80211_AC_BK:
3808 p = &arvif->wmm_params.ac_bk;
3817 p->cwmin = params->cw_min;
3818 p->cwmax = params->cw_max;
3819 p->aifs = params->aifs;
3820 p->txop = params->txop;
3822 ret = ath12k_wmi_send_wmm_update_cmd(ar, arvif->vdev_id,
3823 &arvif->wmm_params);
3825 ath12k_warn(ar->ab, "failed to set wmm params: %d\n", ret);
3829 ret = ath12k_conf_tx_uapsd(ar, vif, ac, params->uapsd);
3832 ath12k_warn(ar->ab, "failed to set sta uapsd: %d\n", ret);
3835 mutex_unlock(&ar->conf_mutex);
3839 static struct ieee80211_sta_ht_cap
3840 ath12k_create_ht_cap(struct ath12k *ar, u32 ar_ht_cap, u32 rate_cap_rx_chainmask)
3843 struct ieee80211_sta_ht_cap ht_cap = {0};
3844 u32 ar_vht_cap = ar->pdev->cap.vht_cap;
3846 if (!(ar_ht_cap & WMI_HT_CAP_ENABLED))
3849 ht_cap.ht_supported = 1;
3850 ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
3851 ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_NONE;
3852 ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
3853 ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
3854 ht_cap.cap |= WLAN_HT_CAP_SM_PS_STATIC << IEEE80211_HT_CAP_SM_PS_SHIFT;
3856 if (ar_ht_cap & WMI_HT_CAP_HT20_SGI)
3857 ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
3859 if (ar_ht_cap & WMI_HT_CAP_HT40_SGI)
3860 ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
3862 if (ar_ht_cap & WMI_HT_CAP_DYNAMIC_SMPS) {
3865 smps = WLAN_HT_CAP_SM_PS_DYNAMIC;
3866 smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT;
3871 if (ar_ht_cap & WMI_HT_CAP_TX_STBC)
3872 ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC;
3874 if (ar_ht_cap & WMI_HT_CAP_RX_STBC) {
3878 stbc &= WMI_HT_CAP_RX_STBC;
3879 stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT;
3880 stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT;
3881 stbc &= IEEE80211_HT_CAP_RX_STBC;
3886 if (ar_ht_cap & WMI_HT_CAP_RX_LDPC)
3887 ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
3889 if (ar_ht_cap & WMI_HT_CAP_L_SIG_TXOP_PROT)
3890 ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
3892 if (ar_vht_cap & WMI_VHT_CAP_MAX_MPDU_LEN_MASK)
3893 ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU;
3895 for (i = 0; i < ar->num_rx_chains; i++) {
3896 if (rate_cap_rx_chainmask & BIT(i))
3897 ht_cap.mcs.rx_mask[i] = 0xFF;
3900 ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
3905 static int ath12k_mac_set_txbf_conf(struct ath12k_vif *arvif)
3908 struct ath12k *ar = arvif->ar;
3911 u32 vht_cap = ar->pdev->cap.vht_cap;
3912 u32 vdev_param = WMI_VDEV_PARAM_TXBF;
3914 if (vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)) {
3915 nsts = vht_cap & IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
3916 nsts >>= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
3917 value |= SM(nsts, WMI_TXBF_STS_CAP_OFFSET);
3920 if (vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)) {
3921 sound_dim = vht_cap &
3922 IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
3923 sound_dim >>= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
3924 if (sound_dim > (ar->num_tx_chains - 1))
3925 sound_dim = ar->num_tx_chains - 1;
3926 value |= SM(sound_dim, WMI_BF_SOUND_DIM_OFFSET);
3932 if (vht_cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE) {
3933 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
3935 if ((vht_cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE) &&
3936 arvif->vdev_type == WMI_VDEV_TYPE_AP)
3937 value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFER;
3940 if (vht_cap & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE) {
3941 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
3943 if ((vht_cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE) &&
3944 arvif->vdev_type == WMI_VDEV_TYPE_STA)
3945 value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFEE;
3948 return ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3952 static void ath12k_set_vht_txbf_cap(struct ath12k *ar, u32 *vht_cap)
3954 bool subfer, subfee;
3957 subfer = !!(*vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE));
3958 subfee = !!(*vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE));
3960 if (ar->num_tx_chains < 2) {
3961 *vht_cap &= ~(IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE);
3965 /* If SU Beaformer is not set, then disable MU Beamformer Capability */
3967 *vht_cap &= ~(IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE);
3969 /* If SU Beaformee is not set, then disable MU Beamformee Capability */
3971 *vht_cap &= ~(IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE);
3973 sound_dim = u32_get_bits(*vht_cap,
3974 IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK);
3975 *vht_cap = u32_replace_bits(*vht_cap, 0,
3976 IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK);
3978 /* TODO: Need to check invalid STS and Sound_dim values set by FW? */
3980 /* Enable Sounding Dimension Field only if SU BF is enabled */
3982 if (sound_dim > (ar->num_tx_chains - 1))
3983 sound_dim = ar->num_tx_chains - 1;
3985 *vht_cap = u32_replace_bits(*vht_cap, sound_dim,
3986 IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK);
3989 /* Use the STS advertised by FW unless SU Beamformee is not supported*/
3991 *vht_cap &= ~(IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK);
3994 static struct ieee80211_sta_vht_cap
3995 ath12k_create_vht_cap(struct ath12k *ar, u32 rate_cap_tx_chainmask,
3996 u32 rate_cap_rx_chainmask)
3998 struct ieee80211_sta_vht_cap vht_cap = {0};
3999 u16 txmcs_map, rxmcs_map;
4002 vht_cap.vht_supported = 1;
4003 vht_cap.cap = ar->pdev->cap.vht_cap;
4005 ath12k_set_vht_txbf_cap(ar, &vht_cap.cap);
4007 /* TODO: Enable back VHT160 mode once association issues are fixed */
4008 /* Disabling VHT160 and VHT80+80 modes */
4009 vht_cap.cap &= ~IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK;
4010 vht_cap.cap &= ~IEEE80211_VHT_CAP_SHORT_GI_160;
4014 for (i = 0; i < 8; i++) {
4015 if (i < ar->num_tx_chains && rate_cap_tx_chainmask & BIT(i))
4016 txmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
4018 txmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
4020 if (i < ar->num_rx_chains && rate_cap_rx_chainmask & BIT(i))
4021 rxmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
4023 rxmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
4026 if (rate_cap_tx_chainmask <= 1)
4027 vht_cap.cap &= ~IEEE80211_VHT_CAP_TXSTBC;
4029 vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(rxmcs_map);
4030 vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(txmcs_map);
4035 static void ath12k_mac_setup_ht_vht_cap(struct ath12k *ar,
4036 struct ath12k_pdev_cap *cap,
4039 struct ieee80211_supported_band *band;
4040 u32 rate_cap_tx_chainmask;
4041 u32 rate_cap_rx_chainmask;
4044 rate_cap_tx_chainmask = ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift;
4045 rate_cap_rx_chainmask = ar->cfg_rx_chainmask >> cap->rx_chain_mask_shift;
4047 if (cap->supported_bands & WMI_HOST_WLAN_2G_CAP) {
4048 band = &ar->mac.sbands[NL80211_BAND_2GHZ];
4049 ht_cap = cap->band[NL80211_BAND_2GHZ].ht_cap_info;
4051 *ht_cap_info = ht_cap;
4052 band->ht_cap = ath12k_create_ht_cap(ar, ht_cap,
4053 rate_cap_rx_chainmask);
4056 if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP &&
4057 (ar->ab->hw_params->single_pdev_only ||
4058 !ar->supports_6ghz)) {
4059 band = &ar->mac.sbands[NL80211_BAND_5GHZ];
4060 ht_cap = cap->band[NL80211_BAND_5GHZ].ht_cap_info;
4062 *ht_cap_info = ht_cap;
4063 band->ht_cap = ath12k_create_ht_cap(ar, ht_cap,
4064 rate_cap_rx_chainmask);
4065 band->vht_cap = ath12k_create_vht_cap(ar, rate_cap_tx_chainmask,
4066 rate_cap_rx_chainmask);
4070 static int ath12k_check_chain_mask(struct ath12k *ar, u32 ant, bool is_tx_ant)
4072 /* TODO: Check the request chainmask against the supported
4073 * chainmask table which is advertised in extented_service_ready event
4079 static void ath12k_gen_ppe_thresh(struct ath12k_wmi_ppe_threshold_arg *fw_ppet,
4085 he_ppet[0] = fw_ppet->numss_m1 & IEEE80211_PPE_THRES_NSS_MASK;
4086 he_ppet[0] |= (fw_ppet->ru_bit_mask <<
4087 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_POS) &
4088 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK;
4089 for (nss = 0; nss <= fw_ppet->numss_m1; nss++) {
4090 for (ru = 0; ru < 4; ru++) {
4094 if ((fw_ppet->ru_bit_mask & BIT(ru)) == 0)
4096 val = (fw_ppet->ppet16_ppet8_ru3_ru0[nss] >> (ru * 6)) &
4098 val = ((val >> 3) & 0x7) | ((val & 0x7) << 3);
4099 for (i = 5; i >= 0; i--) {
4101 ((val >> i) & 0x1) << ((bit % 8));
4109 ath12k_mac_filter_he_cap_mesh(struct ieee80211_he_cap_elem *he_cap_elem)
4113 m = IEEE80211_HE_MAC_CAP0_TWT_RES |
4114 IEEE80211_HE_MAC_CAP0_TWT_REQ;
4115 he_cap_elem->mac_cap_info[0] &= ~m;
4117 m = IEEE80211_HE_MAC_CAP2_TRS |
4118 IEEE80211_HE_MAC_CAP2_BCAST_TWT |
4119 IEEE80211_HE_MAC_CAP2_MU_CASCADING;
4120 he_cap_elem->mac_cap_info[2] &= ~m;
4122 m = IEEE80211_HE_MAC_CAP3_FLEX_TWT_SCHED |
4123 IEEE80211_HE_MAC_CAP2_BCAST_TWT |
4124 IEEE80211_HE_MAC_CAP2_MU_CASCADING;
4125 he_cap_elem->mac_cap_info[3] &= ~m;
4127 m = IEEE80211_HE_MAC_CAP4_BSRP_BQRP_A_MPDU_AGG |
4128 IEEE80211_HE_MAC_CAP4_BQR;
4129 he_cap_elem->mac_cap_info[4] &= ~m;
4131 m = IEEE80211_HE_MAC_CAP5_SUBCHAN_SELECTIVE_TRANSMISSION |
4132 IEEE80211_HE_MAC_CAP5_UL_2x996_TONE_RU |
4133 IEEE80211_HE_MAC_CAP5_PUNCTURED_SOUNDING |
4134 IEEE80211_HE_MAC_CAP5_HT_VHT_TRIG_FRAME_RX;
4135 he_cap_elem->mac_cap_info[5] &= ~m;
4137 m = IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO |
4138 IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO;
4139 he_cap_elem->phy_cap_info[2] &= ~m;
4141 m = IEEE80211_HE_PHY_CAP3_RX_PARTIAL_BW_SU_IN_20MHZ_MU |
4142 IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK |
4143 IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_MASK;
4144 he_cap_elem->phy_cap_info[3] &= ~m;
4146 m = IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER;
4147 he_cap_elem->phy_cap_info[4] &= ~m;
4149 m = IEEE80211_HE_PHY_CAP5_NG16_MU_FEEDBACK;
4150 he_cap_elem->phy_cap_info[5] &= ~m;
4152 m = IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_75_MU |
4153 IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB |
4154 IEEE80211_HE_PHY_CAP6_TRIG_CQI_FB |
4155 IEEE80211_HE_PHY_CAP6_PARTIAL_BANDWIDTH_DL_MUMIMO;
4156 he_cap_elem->phy_cap_info[6] &= ~m;
4158 m = IEEE80211_HE_PHY_CAP7_PSR_BASED_SR |
4159 IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_SUPP |
4160 IEEE80211_HE_PHY_CAP7_STBC_TX_ABOVE_80MHZ |
4161 IEEE80211_HE_PHY_CAP7_STBC_RX_ABOVE_80MHZ;
4162 he_cap_elem->phy_cap_info[7] &= ~m;
4164 m = IEEE80211_HE_PHY_CAP8_HE_ER_SU_PPDU_4XLTF_AND_08_US_GI |
4165 IEEE80211_HE_PHY_CAP8_20MHZ_IN_40MHZ_HE_PPDU_IN_2G |
4166 IEEE80211_HE_PHY_CAP8_20MHZ_IN_160MHZ_HE_PPDU |
4167 IEEE80211_HE_PHY_CAP8_80MHZ_IN_160MHZ_HE_PPDU;
4168 he_cap_elem->phy_cap_info[8] &= ~m;
4170 m = IEEE80211_HE_PHY_CAP9_LONGER_THAN_16_SIGB_OFDM_SYM |
4171 IEEE80211_HE_PHY_CAP9_NON_TRIGGERED_CQI_FEEDBACK |
4172 IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU |
4173 IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU |
4174 IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_COMP_SIGB |
4175 IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_NON_COMP_SIGB;
4176 he_cap_elem->phy_cap_info[9] &= ~m;
4179 static __le16 ath12k_mac_setup_he_6ghz_cap(struct ath12k_pdev_cap *pcap,
4180 struct ath12k_band_cap *bcap)
4184 bcap->he_6ghz_capa = IEEE80211_HT_MPDU_DENSITY_NONE;
4185 if (bcap->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS)
4186 bcap->he_6ghz_capa |=
4187 u32_encode_bits(WLAN_HT_CAP_SM_PS_DYNAMIC,
4188 IEEE80211_HE_6GHZ_CAP_SM_PS);
4190 bcap->he_6ghz_capa |=
4191 u32_encode_bits(WLAN_HT_CAP_SM_PS_DISABLED,
4192 IEEE80211_HE_6GHZ_CAP_SM_PS);
4193 val = u32_get_bits(pcap->vht_cap,
4194 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK);
4195 bcap->he_6ghz_capa |=
4196 u32_encode_bits(val, IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP);
4197 val = u32_get_bits(pcap->vht_cap,
4198 IEEE80211_VHT_CAP_MAX_MPDU_MASK);
4199 bcap->he_6ghz_capa |=
4200 u32_encode_bits(val, IEEE80211_HE_6GHZ_CAP_MAX_MPDU_LEN);
4201 if (pcap->vht_cap & IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN)
4202 bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_RX_ANTPAT_CONS;
4203 if (pcap->vht_cap & IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN)
4204 bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_TX_ANTPAT_CONS;
4206 return cpu_to_le16(bcap->he_6ghz_capa);
4209 static int ath12k_mac_copy_he_cap(struct ath12k *ar,
4210 struct ath12k_pdev_cap *cap,
4211 struct ieee80211_sband_iftype_data *data,
4216 for (i = 0; i < NUM_NL80211_IFTYPES; i++) {
4217 struct ieee80211_sta_he_cap *he_cap = &data[idx].he_cap;
4218 struct ath12k_band_cap *band_cap = &cap->band[band];
4219 struct ieee80211_he_cap_elem *he_cap_elem =
4220 &he_cap->he_cap_elem;
4223 case NL80211_IFTYPE_STATION:
4224 case NL80211_IFTYPE_AP:
4225 case NL80211_IFTYPE_MESH_POINT:
4232 data[idx].types_mask = BIT(i);
4233 he_cap->has_he = true;
4234 memcpy(he_cap_elem->mac_cap_info, band_cap->he_cap_info,
4235 sizeof(he_cap_elem->mac_cap_info));
4236 memcpy(he_cap_elem->phy_cap_info, band_cap->he_cap_phy_info,
4237 sizeof(he_cap_elem->phy_cap_info));
4239 he_cap_elem->mac_cap_info[1] &=
4240 IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_MASK;
4242 he_cap_elem->phy_cap_info[5] &=
4243 ~IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK;
4244 he_cap_elem->phy_cap_info[5] &=
4245 ~IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_MASK;
4246 he_cap_elem->phy_cap_info[5] |= ar->num_tx_chains - 1;
4249 case NL80211_IFTYPE_AP:
4250 he_cap_elem->phy_cap_info[3] &=
4251 ~IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK;
4252 he_cap_elem->phy_cap_info[9] |=
4253 IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU;
4255 case NL80211_IFTYPE_STATION:
4256 he_cap_elem->mac_cap_info[0] &=
4257 ~IEEE80211_HE_MAC_CAP0_TWT_RES;
4258 he_cap_elem->mac_cap_info[0] |=
4259 IEEE80211_HE_MAC_CAP0_TWT_REQ;
4260 he_cap_elem->phy_cap_info[9] |=
4261 IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU;
4263 case NL80211_IFTYPE_MESH_POINT:
4264 ath12k_mac_filter_he_cap_mesh(he_cap_elem);
4268 he_cap->he_mcs_nss_supp.rx_mcs_80 =
4269 cpu_to_le16(band_cap->he_mcs & 0xffff);
4270 he_cap->he_mcs_nss_supp.tx_mcs_80 =
4271 cpu_to_le16(band_cap->he_mcs & 0xffff);
4272 he_cap->he_mcs_nss_supp.rx_mcs_160 =
4273 cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
4274 he_cap->he_mcs_nss_supp.tx_mcs_160 =
4275 cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
4276 he_cap->he_mcs_nss_supp.rx_mcs_80p80 =
4277 cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
4278 he_cap->he_mcs_nss_supp.tx_mcs_80p80 =
4279 cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
4281 memset(he_cap->ppe_thres, 0, sizeof(he_cap->ppe_thres));
4282 if (he_cap_elem->phy_cap_info[6] &
4283 IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT)
4284 ath12k_gen_ppe_thresh(&band_cap->he_ppet,
4287 if (band == NL80211_BAND_6GHZ) {
4288 data[idx].he_6ghz_capa.capa =
4289 ath12k_mac_setup_he_6ghz_cap(cap, band_cap);
4297 static void ath12k_mac_setup_he_cap(struct ath12k *ar,
4298 struct ath12k_pdev_cap *cap)
4300 struct ieee80211_supported_band *band;
4303 if (cap->supported_bands & WMI_HOST_WLAN_2G_CAP) {
4304 count = ath12k_mac_copy_he_cap(ar, cap,
4305 ar->mac.iftype[NL80211_BAND_2GHZ],
4307 band = &ar->mac.sbands[NL80211_BAND_2GHZ];
4308 band->iftype_data = ar->mac.iftype[NL80211_BAND_2GHZ];
4309 band->n_iftype_data = count;
4312 if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP) {
4313 count = ath12k_mac_copy_he_cap(ar, cap,
4314 ar->mac.iftype[NL80211_BAND_5GHZ],
4316 band = &ar->mac.sbands[NL80211_BAND_5GHZ];
4317 band->iftype_data = ar->mac.iftype[NL80211_BAND_5GHZ];
4318 band->n_iftype_data = count;
4321 if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP &&
4322 ar->supports_6ghz) {
4323 count = ath12k_mac_copy_he_cap(ar, cap,
4324 ar->mac.iftype[NL80211_BAND_6GHZ],
4326 band = &ar->mac.sbands[NL80211_BAND_6GHZ];
4327 band->iftype_data = ar->mac.iftype[NL80211_BAND_6GHZ];
4328 band->n_iftype_data = count;
4332 static int __ath12k_set_antenna(struct ath12k *ar, u32 tx_ant, u32 rx_ant)
4336 lockdep_assert_held(&ar->conf_mutex);
4338 if (ath12k_check_chain_mask(ar, tx_ant, true))
4341 if (ath12k_check_chain_mask(ar, rx_ant, false))
4344 ar->cfg_tx_chainmask = tx_ant;
4345 ar->cfg_rx_chainmask = rx_ant;
4347 if (ar->state != ATH12K_STATE_ON &&
4348 ar->state != ATH12K_STATE_RESTARTED)
4351 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_TX_CHAIN_MASK,
4352 tx_ant, ar->pdev->pdev_id);
4354 ath12k_warn(ar->ab, "failed to set tx-chainmask: %d, req 0x%x\n",
4359 ar->num_tx_chains = hweight32(tx_ant);
4361 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_RX_CHAIN_MASK,
4362 rx_ant, ar->pdev->pdev_id);
4364 ath12k_warn(ar->ab, "failed to set rx-chainmask: %d, req 0x%x\n",
4369 ar->num_rx_chains = hweight32(rx_ant);
4371 /* Reload HT/VHT/HE capability */
4372 ath12k_mac_setup_ht_vht_cap(ar, &ar->pdev->cap, NULL);
4373 ath12k_mac_setup_he_cap(ar, &ar->pdev->cap);
4378 int ath12k_mac_tx_mgmt_pending_free(int buf_id, void *skb, void *ctx)
4380 struct sk_buff *msdu = skb;
4381 struct ieee80211_tx_info *info;
4382 struct ath12k *ar = ctx;
4383 struct ath12k_base *ab = ar->ab;
4385 spin_lock_bh(&ar->txmgmt_idr_lock);
4386 idr_remove(&ar->txmgmt_idr, buf_id);
4387 spin_unlock_bh(&ar->txmgmt_idr_lock);
4388 dma_unmap_single(ab->dev, ATH12K_SKB_CB(msdu)->paddr, msdu->len,
4391 info = IEEE80211_SKB_CB(msdu);
4392 memset(&info->status, 0, sizeof(info->status));
4394 ieee80211_free_txskb(ar->hw, msdu);
4399 static int ath12k_mac_vif_txmgmt_idr_remove(int buf_id, void *skb, void *ctx)
4401 struct ieee80211_vif *vif = ctx;
4402 struct ath12k_skb_cb *skb_cb = ATH12K_SKB_CB(skb);
4403 struct sk_buff *msdu = skb;
4404 struct ath12k *ar = skb_cb->ar;
4405 struct ath12k_base *ab = ar->ab;
4407 if (skb_cb->vif == vif) {
4408 spin_lock_bh(&ar->txmgmt_idr_lock);
4409 idr_remove(&ar->txmgmt_idr, buf_id);
4410 spin_unlock_bh(&ar->txmgmt_idr_lock);
4411 dma_unmap_single(ab->dev, skb_cb->paddr, msdu->len,
4418 static int ath12k_mac_mgmt_tx_wmi(struct ath12k *ar, struct ath12k_vif *arvif,
4419 struct sk_buff *skb)
4421 struct ath12k_base *ab = ar->ab;
4422 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
4423 struct ieee80211_tx_info *info;
4428 spin_lock_bh(&ar->txmgmt_idr_lock);
4429 buf_id = idr_alloc(&ar->txmgmt_idr, skb, 0,
4430 ATH12K_TX_MGMT_NUM_PENDING_MAX, GFP_ATOMIC);
4431 spin_unlock_bh(&ar->txmgmt_idr_lock);
4435 info = IEEE80211_SKB_CB(skb);
4436 if (!(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP)) {
4437 if ((ieee80211_is_action(hdr->frame_control) ||
4438 ieee80211_is_deauth(hdr->frame_control) ||
4439 ieee80211_is_disassoc(hdr->frame_control)) &&
4440 ieee80211_has_protected(hdr->frame_control)) {
4441 skb_put(skb, IEEE80211_CCMP_MIC_LEN);
4445 paddr = dma_map_single(ab->dev, skb->data, skb->len, DMA_TO_DEVICE);
4446 if (dma_mapping_error(ab->dev, paddr)) {
4447 ath12k_warn(ab, "failed to DMA map mgmt Tx buffer\n");
4452 ATH12K_SKB_CB(skb)->paddr = paddr;
4454 ret = ath12k_wmi_mgmt_send(ar, arvif->vdev_id, buf_id, skb);
4456 ath12k_warn(ar->ab, "failed to send mgmt frame: %d\n", ret);
4463 dma_unmap_single(ab->dev, ATH12K_SKB_CB(skb)->paddr,
4464 skb->len, DMA_TO_DEVICE);
4466 spin_lock_bh(&ar->txmgmt_idr_lock);
4467 idr_remove(&ar->txmgmt_idr, buf_id);
4468 spin_unlock_bh(&ar->txmgmt_idr_lock);
4473 static void ath12k_mgmt_over_wmi_tx_purge(struct ath12k *ar)
4475 struct sk_buff *skb;
4477 while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL)
4478 ieee80211_free_txskb(ar->hw, skb);
4481 static void ath12k_mgmt_over_wmi_tx_work(struct work_struct *work)
4483 struct ath12k *ar = container_of(work, struct ath12k, wmi_mgmt_tx_work);
4484 struct ath12k_skb_cb *skb_cb;
4485 struct ath12k_vif *arvif;
4486 struct sk_buff *skb;
4489 while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL) {
4490 skb_cb = ATH12K_SKB_CB(skb);
4492 ath12k_warn(ar->ab, "no vif found for mgmt frame\n");
4493 ieee80211_free_txskb(ar->hw, skb);
4497 arvif = ath12k_vif_to_arvif(skb_cb->vif);
4498 if (ar->allocated_vdev_map & (1LL << arvif->vdev_id) &&
4499 arvif->is_started) {
4500 ret = ath12k_mac_mgmt_tx_wmi(ar, arvif, skb);
4502 ath12k_warn(ar->ab, "failed to tx mgmt frame, vdev_id %d :%d\n",
4503 arvif->vdev_id, ret);
4504 ieee80211_free_txskb(ar->hw, skb);
4506 atomic_inc(&ar->num_pending_mgmt_tx);
4510 "dropping mgmt frame for vdev %d, is_started %d\n",
4513 ieee80211_free_txskb(ar->hw, skb);
4518 static int ath12k_mac_mgmt_tx(struct ath12k *ar, struct sk_buff *skb,
4521 struct sk_buff_head *q = &ar->wmi_mgmt_tx_queue;
4523 if (test_bit(ATH12K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags))
4526 /* Drop probe response packets when the pending management tx
4527 * count has reached a certain threshold, so as to prioritize
4528 * other mgmt packets like auth and assoc to be sent on time
4529 * for establishing successful connections.
4532 atomic_read(&ar->num_pending_mgmt_tx) > ATH12K_PRB_RSP_DROP_THRESHOLD) {
4534 "dropping probe response as pending queue is almost full\n");
4538 if (skb_queue_len(q) == ATH12K_TX_MGMT_NUM_PENDING_MAX) {
4539 ath12k_warn(ar->ab, "mgmt tx queue is full\n");
4543 skb_queue_tail(q, skb);
4544 ieee80211_queue_work(ar->hw, &ar->wmi_mgmt_tx_work);
4549 static void ath12k_mac_op_tx(struct ieee80211_hw *hw,
4550 struct ieee80211_tx_control *control,
4551 struct sk_buff *skb)
4553 struct ath12k_skb_cb *skb_cb = ATH12K_SKB_CB(skb);
4554 struct ath12k *ar = hw->priv;
4555 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
4556 struct ieee80211_vif *vif = info->control.vif;
4557 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
4558 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
4559 struct ieee80211_key_conf *key = info->control.hw_key;
4560 u32 info_flags = info->flags;
4564 memset(skb_cb, 0, sizeof(*skb_cb));
4568 skb_cb->cipher = key->cipher;
4569 skb_cb->flags |= ATH12K_SKB_CIPHER_SET;
4572 if (info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP) {
4573 skb_cb->flags |= ATH12K_SKB_HW_80211_ENCAP;
4574 } else if (ieee80211_is_mgmt(hdr->frame_control)) {
4575 is_prb_rsp = ieee80211_is_probe_resp(hdr->frame_control);
4576 ret = ath12k_mac_mgmt_tx(ar, skb, is_prb_rsp);
4578 ath12k_warn(ar->ab, "failed to queue management frame %d\n",
4580 ieee80211_free_txskb(ar->hw, skb);
4585 ret = ath12k_dp_tx(ar, arvif, skb);
4587 ath12k_warn(ar->ab, "failed to transmit frame %d\n", ret);
4588 ieee80211_free_txskb(ar->hw, skb);
4592 void ath12k_mac_drain_tx(struct ath12k *ar)
4594 /* make sure rcu-protected mac80211 tx path itself is drained */
4597 cancel_work_sync(&ar->wmi_mgmt_tx_work);
4598 ath12k_mgmt_over_wmi_tx_purge(ar);
4601 static int ath12k_mac_config_mon_status_default(struct ath12k *ar, bool enable)
4604 /* TODO: Need to support new monitor mode */
4607 static void ath12k_mac_wait_reconfigure(struct ath12k_base *ab)
4609 int recovery_start_count;
4614 recovery_start_count = atomic_inc_return(&ab->recovery_start_count);
4616 ath12k_dbg(ab, ATH12K_DBG_MAC, "recovery start count %d\n", recovery_start_count);
4618 if (recovery_start_count == ab->num_radios) {
4619 complete(&ab->recovery_start);
4620 ath12k_dbg(ab, ATH12K_DBG_MAC, "recovery started success\n");
4623 ath12k_dbg(ab, ATH12K_DBG_MAC, "waiting reconfigure...\n");
4625 wait_for_completion_timeout(&ab->reconfigure_complete,
4626 ATH12K_RECONFIGURE_TIMEOUT_HZ);
4629 static int ath12k_mac_op_start(struct ieee80211_hw *hw)
4631 struct ath12k *ar = hw->priv;
4632 struct ath12k_base *ab = ar->ab;
4633 struct ath12k_pdev *pdev = ar->pdev;
4636 ath12k_mac_drain_tx(ar);
4637 mutex_lock(&ar->conf_mutex);
4639 switch (ar->state) {
4640 case ATH12K_STATE_OFF:
4641 ar->state = ATH12K_STATE_ON;
4643 case ATH12K_STATE_RESTARTING:
4644 ar->state = ATH12K_STATE_RESTARTED;
4645 ath12k_mac_wait_reconfigure(ab);
4647 case ATH12K_STATE_RESTARTED:
4648 case ATH12K_STATE_WEDGED:
4649 case ATH12K_STATE_ON:
4655 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_PMF_QOS,
4659 ath12k_err(ar->ab, "failed to enable PMF QOS: (%d\n", ret);
4663 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_DYNAMIC_BW, 1,
4666 ath12k_err(ar->ab, "failed to enable dynamic bw: %d\n", ret);
4670 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_ARP_AC_OVERRIDE,
4673 ath12k_err(ab, "failed to set ac override for ARP: %d\n",
4678 ret = ath12k_wmi_send_dfs_phyerr_offload_enable_cmd(ar, pdev->pdev_id);
4680 ath12k_err(ab, "failed to offload radar detection: %d\n",
4685 ret = ath12k_dp_tx_htt_h2t_ppdu_stats_req(ar,
4686 HTT_PPDU_STATS_TAG_DEFAULT);
4688 ath12k_err(ab, "failed to req ppdu stats: %d\n", ret);
4692 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_MESH_MCAST_ENABLE,
4696 ath12k_err(ar->ab, "failed to enable MESH MCAST ENABLE: (%d\n", ret);
4700 __ath12k_set_antenna(ar, ar->cfg_tx_chainmask, ar->cfg_rx_chainmask);
4702 /* TODO: Do we need to enable ANI? */
4704 ath12k_reg_update_chan_list(ar);
4706 ar->num_started_vdevs = 0;
4707 ar->num_created_vdevs = 0;
4709 ar->allocated_vdev_map = 0;
4711 /* Configure monitor status ring with default rx_filter to get rx status
4712 * such as rssi, rx_duration.
4714 ret = ath12k_mac_config_mon_status_default(ar, true);
4715 if (ret && (ret != -ENOTSUPP)) {
4716 ath12k_err(ab, "failed to configure monitor status ring with default rx_filter: (%d)\n",
4721 if (ret == -ENOTSUPP)
4722 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
4723 "monitor status config is not yet supported");
4725 /* Configure the hash seed for hash based reo dest ring selection */
4726 ath12k_wmi_pdev_lro_cfg(ar, ar->pdev->pdev_id);
4728 /* allow device to enter IMPS */
4729 if (ab->hw_params->idle_ps) {
4730 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_IDLE_PS_CONFIG,
4733 ath12k_err(ab, "failed to enable idle ps: %d\n", ret);
4738 mutex_unlock(&ar->conf_mutex);
4740 rcu_assign_pointer(ab->pdevs_active[ar->pdev_idx],
4741 &ab->pdevs[ar->pdev_idx]);
4746 ar->state = ATH12K_STATE_OFF;
4747 mutex_unlock(&ar->conf_mutex);
4752 static void ath12k_mac_op_stop(struct ieee80211_hw *hw)
4754 struct ath12k *ar = hw->priv;
4755 struct htt_ppdu_stats_info *ppdu_stats, *tmp;
4758 ath12k_mac_drain_tx(ar);
4760 mutex_lock(&ar->conf_mutex);
4761 ret = ath12k_mac_config_mon_status_default(ar, false);
4762 if (ret && (ret != -ENOTSUPP))
4763 ath12k_err(ar->ab, "failed to clear rx_filter for monitor status ring: (%d)\n",
4766 clear_bit(ATH12K_CAC_RUNNING, &ar->dev_flags);
4767 ar->state = ATH12K_STATE_OFF;
4768 mutex_unlock(&ar->conf_mutex);
4770 cancel_delayed_work_sync(&ar->scan.timeout);
4771 cancel_work_sync(&ar->regd_update_work);
4773 spin_lock_bh(&ar->data_lock);
4774 list_for_each_entry_safe(ppdu_stats, tmp, &ar->ppdu_stats_info, list) {
4775 list_del(&ppdu_stats->list);
4778 spin_unlock_bh(&ar->data_lock);
4780 rcu_assign_pointer(ar->ab->pdevs_active[ar->pdev_idx], NULL);
4784 atomic_set(&ar->num_pending_mgmt_tx, 0);
4788 ath12k_mac_get_vdev_stats_id(struct ath12k_vif *arvif)
4790 struct ath12k_base *ab = arvif->ar->ab;
4791 u8 vdev_stats_id = 0;
4794 if (ab->free_vdev_stats_id_map & (1LL << vdev_stats_id)) {
4796 if (vdev_stats_id <= ATH12K_INVAL_VDEV_STATS_ID) {
4797 vdev_stats_id = ATH12K_INVAL_VDEV_STATS_ID;
4801 ab->free_vdev_stats_id_map |= (1LL << vdev_stats_id);
4804 } while (vdev_stats_id);
4806 arvif->vdev_stats_id = vdev_stats_id;
4807 return vdev_stats_id;
4810 static void ath12k_mac_setup_vdev_create_arg(struct ath12k_vif *arvif,
4811 struct ath12k_wmi_vdev_create_arg *arg)
4813 struct ath12k *ar = arvif->ar;
4814 struct ath12k_pdev *pdev = ar->pdev;
4816 arg->if_id = arvif->vdev_id;
4817 arg->type = arvif->vdev_type;
4818 arg->subtype = arvif->vdev_subtype;
4819 arg->pdev_id = pdev->pdev_id;
4821 if (pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) {
4822 arg->chains[NL80211_BAND_2GHZ].tx = ar->num_tx_chains;
4823 arg->chains[NL80211_BAND_2GHZ].rx = ar->num_rx_chains;
4825 if (pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) {
4826 arg->chains[NL80211_BAND_5GHZ].tx = ar->num_tx_chains;
4827 arg->chains[NL80211_BAND_5GHZ].rx = ar->num_rx_chains;
4829 if (pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP &&
4830 ar->supports_6ghz) {
4831 arg->chains[NL80211_BAND_6GHZ].tx = ar->num_tx_chains;
4832 arg->chains[NL80211_BAND_6GHZ].rx = ar->num_rx_chains;
4835 arg->if_stats_id = ath12k_mac_get_vdev_stats_id(arvif);
4839 ath12k_mac_prepare_he_mode(struct ath12k_pdev *pdev, u32 viftype)
4841 struct ath12k_pdev_cap *pdev_cap = &pdev->cap;
4842 struct ath12k_band_cap *cap_band = NULL;
4843 u32 *hecap_phy_ptr = NULL;
4846 if (pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP)
4847 cap_band = &pdev_cap->band[NL80211_BAND_2GHZ];
4849 cap_band = &pdev_cap->band[NL80211_BAND_5GHZ];
4851 hecap_phy_ptr = &cap_band->he_cap_phy_info[0];
4853 hemode = u32_encode_bits(HE_SU_BFEE_ENABLE, HE_MODE_SU_TX_BFEE) |
4854 u32_encode_bits(HECAP_PHY_SUBFMR_GET(hecap_phy_ptr),
4855 HE_MODE_SU_TX_BFER) |
4856 u32_encode_bits(HECAP_PHY_ULMUMIMO_GET(hecap_phy_ptr),
4859 /* TODO: WDS and other modes */
4860 if (viftype == NL80211_IFTYPE_AP) {
4861 hemode |= u32_encode_bits(HECAP_PHY_MUBFMR_GET(hecap_phy_ptr),
4862 HE_MODE_MU_TX_BFER) |
4863 u32_encode_bits(HE_DL_MUOFDMA_ENABLE, HE_MODE_DL_OFDMA) |
4864 u32_encode_bits(HE_UL_MUOFDMA_ENABLE, HE_MODE_UL_OFDMA);
4866 hemode |= u32_encode_bits(HE_MU_BFEE_ENABLE, HE_MODE_MU_TX_BFEE);
4872 static int ath12k_set_he_mu_sounding_mode(struct ath12k *ar,
4873 struct ath12k_vif *arvif)
4875 u32 param_id, param_value;
4876 struct ath12k_base *ab = ar->ab;
4879 param_id = WMI_VDEV_PARAM_SET_HEMU_MODE;
4880 param_value = ath12k_mac_prepare_he_mode(ar->pdev, arvif->vif->type);
4881 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4882 param_id, param_value);
4884 ath12k_warn(ab, "failed to set vdev %d HE MU mode: %d param_value %x\n",
4885 arvif->vdev_id, ret, param_value);
4888 param_id = WMI_VDEV_PARAM_SET_HE_SOUNDING_MODE;
4890 u32_encode_bits(HE_VHT_SOUNDING_MODE_ENABLE, HE_VHT_SOUNDING_MODE) |
4891 u32_encode_bits(HE_TRIG_NONTRIG_SOUNDING_MODE_ENABLE,
4892 HE_TRIG_NONTRIG_SOUNDING_MODE);
4893 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4894 param_id, param_value);
4896 ath12k_warn(ab, "failed to set vdev %d HE MU mode: %d\n",
4897 arvif->vdev_id, ret);
4903 static void ath12k_mac_op_update_vif_offload(struct ieee80211_hw *hw,
4904 struct ieee80211_vif *vif)
4906 struct ath12k *ar = hw->priv;
4907 struct ath12k_base *ab = ar->ab;
4908 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
4909 u32 param_id, param_value;
4912 param_id = WMI_VDEV_PARAM_TX_ENCAP_TYPE;
4913 if (vif->type != NL80211_IFTYPE_STATION &&
4914 vif->type != NL80211_IFTYPE_AP)
4915 vif->offload_flags &= ~(IEEE80211_OFFLOAD_ENCAP_ENABLED |
4916 IEEE80211_OFFLOAD_DECAP_ENABLED);
4918 if (vif->offload_flags & IEEE80211_OFFLOAD_ENCAP_ENABLED)
4919 arvif->tx_encap_type = ATH12K_HW_TXRX_ETHERNET;
4920 else if (test_bit(ATH12K_FLAG_RAW_MODE, &ab->dev_flags))
4921 arvif->tx_encap_type = ATH12K_HW_TXRX_RAW;
4923 arvif->tx_encap_type = ATH12K_HW_TXRX_NATIVE_WIFI;
4925 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4926 param_id, arvif->tx_encap_type);
4928 ath12k_warn(ab, "failed to set vdev %d tx encap mode: %d\n",
4929 arvif->vdev_id, ret);
4930 vif->offload_flags &= ~IEEE80211_OFFLOAD_ENCAP_ENABLED;
4933 param_id = WMI_VDEV_PARAM_RX_DECAP_TYPE;
4934 if (vif->offload_flags & IEEE80211_OFFLOAD_DECAP_ENABLED)
4935 param_value = ATH12K_HW_TXRX_ETHERNET;
4936 else if (test_bit(ATH12K_FLAG_RAW_MODE, &ab->dev_flags))
4937 param_value = ATH12K_HW_TXRX_RAW;
4939 param_value = ATH12K_HW_TXRX_NATIVE_WIFI;
4941 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4942 param_id, param_value);
4944 ath12k_warn(ab, "failed to set vdev %d rx decap mode: %d\n",
4945 arvif->vdev_id, ret);
4946 vif->offload_flags &= ~IEEE80211_OFFLOAD_DECAP_ENABLED;
4950 static int ath12k_mac_op_add_interface(struct ieee80211_hw *hw,
4951 struct ieee80211_vif *vif)
4953 struct ath12k *ar = hw->priv;
4954 struct ath12k_base *ab = ar->ab;
4955 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
4956 struct ath12k_wmi_vdev_create_arg vdev_arg = {0};
4957 struct ath12k_wmi_peer_create_arg peer_param;
4958 u32 param_id, param_value;
4964 vif->driver_flags |= IEEE80211_VIF_SUPPORTS_UAPSD;
4966 mutex_lock(&ar->conf_mutex);
4968 if (vif->type == NL80211_IFTYPE_AP &&
4969 ar->num_peers > (ar->max_num_peers - 1)) {
4970 ath12k_warn(ab, "failed to create vdev due to insufficient peer entry resource in firmware\n");
4975 if (ar->num_created_vdevs > (TARGET_NUM_VDEVS - 1)) {
4976 ath12k_warn(ab, "failed to create vdev, reached max vdev limit %d\n",
4982 memset(arvif, 0, sizeof(*arvif));
4987 INIT_LIST_HEAD(&arvif->list);
4989 /* Should we initialize any worker to handle connection loss indication
4990 * from firmware in sta mode?
4993 for (i = 0; i < ARRAY_SIZE(arvif->bitrate_mask.control); i++) {
4994 arvif->bitrate_mask.control[i].legacy = 0xffffffff;
4995 memset(arvif->bitrate_mask.control[i].ht_mcs, 0xff,
4996 sizeof(arvif->bitrate_mask.control[i].ht_mcs));
4997 memset(arvif->bitrate_mask.control[i].vht_mcs, 0xff,
4998 sizeof(arvif->bitrate_mask.control[i].vht_mcs));
5001 bit = __ffs64(ab->free_vdev_map);
5003 arvif->vdev_id = bit;
5004 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE;
5006 switch (vif->type) {
5007 case NL80211_IFTYPE_UNSPECIFIED:
5008 case NL80211_IFTYPE_STATION:
5009 arvif->vdev_type = WMI_VDEV_TYPE_STA;
5011 case NL80211_IFTYPE_MESH_POINT:
5012 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_MESH_11S;
5014 case NL80211_IFTYPE_AP:
5015 arvif->vdev_type = WMI_VDEV_TYPE_AP;
5017 case NL80211_IFTYPE_MONITOR:
5018 arvif->vdev_type = WMI_VDEV_TYPE_MONITOR;
5019 ar->monitor_vdev_id = bit;
5026 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac add interface id %d type %d subtype %d map %llx\n",
5027 arvif->vdev_id, arvif->vdev_type, arvif->vdev_subtype,
5030 vif->cab_queue = arvif->vdev_id % (ATH12K_HW_MAX_QUEUES - 1);
5031 for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++)
5032 vif->hw_queue[i] = i % (ATH12K_HW_MAX_QUEUES - 1);
5034 ath12k_mac_setup_vdev_create_arg(arvif, &vdev_arg);
5036 ret = ath12k_wmi_vdev_create(ar, vif->addr, &vdev_arg);
5038 ath12k_warn(ab, "failed to create WMI vdev %d: %d\n",
5039 arvif->vdev_id, ret);
5043 ar->num_created_vdevs++;
5044 ath12k_dbg(ab, ATH12K_DBG_MAC, "vdev %pM created, vdev_id %d\n",
5045 vif->addr, arvif->vdev_id);
5046 ar->allocated_vdev_map |= 1LL << arvif->vdev_id;
5047 ab->free_vdev_map &= ~(1LL << arvif->vdev_id);
5049 spin_lock_bh(&ar->data_lock);
5050 list_add(&arvif->list, &ar->arvifs);
5051 spin_unlock_bh(&ar->data_lock);
5053 ath12k_mac_op_update_vif_offload(hw, vif);
5055 nss = hweight32(ar->cfg_tx_chainmask) ? : 1;
5056 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
5057 WMI_VDEV_PARAM_NSS, nss);
5059 ath12k_warn(ab, "failed to set vdev %d chainmask 0x%x, nss %d :%d\n",
5060 arvif->vdev_id, ar->cfg_tx_chainmask, nss, ret);
5064 switch (arvif->vdev_type) {
5065 case WMI_VDEV_TYPE_AP:
5066 peer_param.vdev_id = arvif->vdev_id;
5067 peer_param.peer_addr = vif->addr;
5068 peer_param.peer_type = WMI_PEER_TYPE_DEFAULT;
5069 ret = ath12k_peer_create(ar, arvif, NULL, &peer_param);
5071 ath12k_warn(ab, "failed to vdev %d create peer for AP: %d\n",
5072 arvif->vdev_id, ret);
5076 ret = ath12k_mac_set_kickout(arvif);
5078 ath12k_warn(ar->ab, "failed to set vdev %i kickout parameters: %d\n",
5079 arvif->vdev_id, ret);
5083 case WMI_VDEV_TYPE_STA:
5084 param_id = WMI_STA_PS_PARAM_RX_WAKE_POLICY;
5085 param_value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
5086 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
5087 param_id, param_value);
5089 ath12k_warn(ar->ab, "failed to set vdev %d RX wake policy: %d\n",
5090 arvif->vdev_id, ret);
5094 param_id = WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD;
5095 param_value = WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS;
5096 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
5097 param_id, param_value);
5099 ath12k_warn(ar->ab, "failed to set vdev %d TX wake threshold: %d\n",
5100 arvif->vdev_id, ret);
5104 param_id = WMI_STA_PS_PARAM_PSPOLL_COUNT;
5105 param_value = WMI_STA_PS_PSPOLL_COUNT_NO_MAX;
5106 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
5107 param_id, param_value);
5109 ath12k_warn(ar->ab, "failed to set vdev %d pspoll count: %d\n",
5110 arvif->vdev_id, ret);
5114 ret = ath12k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id, false);
5116 ath12k_warn(ar->ab, "failed to disable vdev %d ps mode: %d\n",
5117 arvif->vdev_id, ret);
5125 arvif->txpower = vif->bss_conf.txpower;
5126 ret = ath12k_mac_txpower_recalc(ar);
5130 param_id = WMI_VDEV_PARAM_RTS_THRESHOLD;
5131 param_value = ar->hw->wiphy->rts_threshold;
5132 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
5133 param_id, param_value);
5135 ath12k_warn(ar->ab, "failed to set rts threshold for vdev %d: %d\n",
5136 arvif->vdev_id, ret);
5139 ath12k_dp_vdev_tx_attach(ar, arvif);
5141 if (vif->type != NL80211_IFTYPE_MONITOR && ar->monitor_conf_enabled)
5142 ath12k_mac_monitor_vdev_create(ar);
5144 mutex_unlock(&ar->conf_mutex);
5149 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
5150 reinit_completion(&ar->peer_delete_done);
5152 ret = ath12k_wmi_send_peer_delete_cmd(ar, vif->addr,
5155 ath12k_warn(ar->ab, "failed to delete peer vdev_id %d addr %pM\n",
5156 arvif->vdev_id, vif->addr);
5160 ret = ath12k_wait_for_peer_delete_done(ar, arvif->vdev_id,
5169 ath12k_wmi_vdev_delete(ar, arvif->vdev_id);
5170 ar->num_created_vdevs--;
5171 ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id);
5172 ab->free_vdev_map |= 1LL << arvif->vdev_id;
5173 ab->free_vdev_stats_id_map &= ~(1LL << arvif->vdev_stats_id);
5174 spin_lock_bh(&ar->data_lock);
5175 list_del(&arvif->list);
5176 spin_unlock_bh(&ar->data_lock);
5179 mutex_unlock(&ar->conf_mutex);
5184 static void ath12k_mac_vif_unref(struct ath12k_dp *dp, struct ieee80211_vif *vif)
5186 struct ath12k_tx_desc_info *tx_desc_info, *tmp1;
5187 struct ath12k_skb_cb *skb_cb;
5188 struct sk_buff *skb;
5191 for (i = 0; i < ATH12K_HW_MAX_QUEUES; i++) {
5192 spin_lock_bh(&dp->tx_desc_lock[i]);
5194 list_for_each_entry_safe(tx_desc_info, tmp1, &dp->tx_desc_used_list[i],
5196 skb = tx_desc_info->skb;
5200 skb_cb = ATH12K_SKB_CB(skb);
5201 if (skb_cb->vif == vif)
5205 spin_unlock_bh(&dp->tx_desc_lock[i]);
5209 static void ath12k_mac_op_remove_interface(struct ieee80211_hw *hw,
5210 struct ieee80211_vif *vif)
5212 struct ath12k *ar = hw->priv;
5213 struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
5214 struct ath12k_base *ab = ar->ab;
5215 unsigned long time_left;
5218 mutex_lock(&ar->conf_mutex);
5220 ath12k_dbg(ab, ATH12K_DBG_MAC, "mac remove interface (vdev %d)\n",
5223 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
5224 ret = ath12k_peer_delete(ar, arvif->vdev_id, vif->addr);
5226 ath12k_warn(ab, "failed to submit AP self-peer removal on vdev %d: %d\n",
5227 arvif->vdev_id, ret);
5230 reinit_completion(&ar->vdev_delete_done);
5232 ret = ath12k_wmi_vdev_delete(ar, arvif->vdev_id);
5234 ath12k_warn(ab, "failed to delete WMI vdev %d: %d\n",
5235 arvif->vdev_id, ret);
5239 time_left = wait_for_completion_timeout(&ar->vdev_delete_done,
5240 ATH12K_VDEV_DELETE_TIMEOUT_HZ);
5241 if (time_left == 0) {
5242 ath12k_warn(ab, "Timeout in receiving vdev delete response\n");
5246 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
5247 ar->monitor_vdev_id = -1;
5248 ar->monitor_vdev_created = false;
5249 } else if (ar->monitor_vdev_created && !ar->monitor_started) {
5250 ret = ath12k_mac_monitor_vdev_delete(ar);
5253 ab->free_vdev_map |= 1LL << (arvif->vdev_id);
5254 ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id);
5255 ab->free_vdev_stats_id_map &= ~(1LL << arvif->vdev_stats_id);
5256 ar->num_created_vdevs--;
5258 ath12k_dbg(ab, ATH12K_DBG_MAC, "vdev %pM deleted, vdev_id %d\n",
5259 vif->addr, arvif->vdev_id);
5262 spin_lock_bh(&ar->data_lock);
5263 list_del(&arvif->list);
5264 spin_unlock_bh(&ar->data_lock);
5266 ath12k_peer_cleanup(ar, arvif->vdev_id);
5268 idr_for_each(&ar->txmgmt_idr,
5269 ath12k_mac_vif_txmgmt_idr_remove, vif);
5271 ath12k_mac_vif_unref(&ab->dp, vif);
5272 ath12k_dp_tx_put_bank_profile(&ab->dp, arvif->bank_id);
5274 /* Recalc txpower for remaining vdev */
5275 ath12k_mac_txpower_recalc(ar);
5276 clear_bit(ATH12K_FLAG_MONITOR_ENABLED, &ar->monitor_flags);
5278 /* TODO: recal traffic pause state based on the available vdevs */
5280 mutex_unlock(&ar->conf_mutex);
5283 /* FIXME: Has to be verified. */
5284 #define SUPPORTED_FILTERS \
5289 FIF_BCN_PRBRESP_PROMISC | \
5293 static void ath12k_mac_op_configure_filter(struct ieee80211_hw *hw,
5294 unsigned int changed_flags,
5295 unsigned int *total_flags,
5298 struct ath12k *ar = hw->priv;
5302 mutex_lock(&ar->conf_mutex);
5304 changed_flags &= SUPPORTED_FILTERS;
5305 *total_flags &= SUPPORTED_FILTERS;
5306 ar->filter_flags = *total_flags;
5308 /* For monitor mode */
5309 reset_flag = !(ar->filter_flags & FIF_BCN_PRBRESP_PROMISC);
5311 ret = ath12k_dp_tx_htt_monitor_mode_ring_config(ar, reset_flag);
5314 set_bit(ATH12K_FLAG_MONITOR_ENABLED, &ar->monitor_flags);
5316 clear_bit(ATH12K_FLAG_MONITOR_ENABLED, &ar->monitor_flags);
5319 "fail to set monitor filter: %d\n", ret);
5321 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
5322 "changed_flags:0x%x, total_flags:0x%x, reset_flag:%d\n",
5323 changed_flags, *total_flags, reset_flag);
5325 mutex_unlock(&ar->conf_mutex);
5328 static int ath12k_mac_op_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant)
5330 struct ath12k *ar = hw->priv;
5332 mutex_lock(&ar->conf_mutex);
5334 *tx_ant = ar->cfg_tx_chainmask;
5335 *rx_ant = ar->cfg_rx_chainmask;
5337 mutex_unlock(&ar->conf_mutex);
5342 static int ath12k_mac_op_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)
5344 struct ath12k *ar = hw->priv;
5347 mutex_lock(&ar->conf_mutex);
5348 ret = __ath12k_set_antenna(ar, tx_ant, rx_ant);
5349 mutex_unlock(&ar->conf_mutex);
5354 static int ath12k_mac_op_ampdu_action(struct ieee80211_hw *hw,
5355 struct ieee80211_vif *vif,
5356 struct ieee80211_ampdu_params *params)
5358 struct ath12k *ar = hw->priv;
5361 mutex_lock(&ar->conf_mutex);
5363 switch (params->action) {
5364 case IEEE80211_AMPDU_RX_START:
5365 ret = ath12k_dp_rx_ampdu_start(ar, params);
5367 case IEEE80211_AMPDU_RX_STOP:
5368 ret = ath12k_dp_rx_ampdu_stop(ar, params);
5370 case IEEE80211_AMPDU_TX_START:
5371 case IEEE80211_AMPDU_TX_STOP_CONT:
5372 case IEEE80211_AMPDU_TX_STOP_FLUSH:
5373 case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
5374 case IEEE80211_AMPDU_TX_OPERATIONAL:
5375 /* Tx A-MPDU aggregation offloaded to hw/fw so deny mac80211
5376 * Tx aggregation requests.
5382 mutex_unlock(&ar->conf_mutex);
5387 static int ath12k_mac_op_add_chanctx(struct ieee80211_hw *hw,
5388 struct ieee80211_chanctx_conf *ctx)
5390 struct ath12k *ar = hw->priv;
5391 struct ath12k_base *ab = ar->ab;
5393 ath12k_dbg(ab, ATH12K_DBG_MAC,
5394 "mac chanctx add freq %u width %d ptr %pK\n",
5395 ctx->def.chan->center_freq, ctx->def.width, ctx);
5397 mutex_lock(&ar->conf_mutex);
5399 spin_lock_bh(&ar->data_lock);
5400 /* TODO: In case of multiple channel context, populate rx_channel from
5401 * Rx PPDU desc information.
5403 ar->rx_channel = ctx->def.chan;
5404 spin_unlock_bh(&ar->data_lock);
5406 mutex_unlock(&ar->conf_mutex);
5411 static void ath12k_mac_op_remove_chanctx(struct ieee80211_hw *hw,
5412 struct ieee80211_chanctx_conf *ctx)
5414 struct ath12k *ar = hw->priv;
5415 struct ath12k_base *ab = ar->ab;
5417 ath12k_dbg(ab, ATH12K_DBG_MAC,
5418 "mac chanctx remove freq %u width %d ptr %pK\n",
5419 ctx->def.chan->center_freq, ctx->def.width, ctx);
5421 mutex_lock(&ar->conf_mutex);
5423 spin_lock_bh(&ar->data_lock);
5424 /* TODO: In case of there is one more channel context left, populate
5425 * rx_channel with the channel of that remaining channel context.
5427 ar->rx_channel = NULL;
5428 spin_unlock_bh(&ar->data_lock);
5430 mutex_unlock(&ar->conf_mutex);
5434 ath12k_mac_vdev_start_restart(struct ath12k_vif *arvif,
5435 const struct cfg80211_chan_def *chandef,
5438 struct ath12k *ar = arvif->ar;
5439 struct ath12k_base *ab = ar->ab;
5440 struct wmi_vdev_start_req_arg arg = {};
5441 int he_support = arvif->vif->bss_conf.he_support;
5444 lockdep_assert_held(&ar->conf_mutex);
5446 reinit_completion(&ar->vdev_setup_done);
5448 arg.vdev_id = arvif->vdev_id;
5449 arg.dtim_period = arvif->dtim_period;
5450 arg.bcn_intval = arvif->beacon_interval;
5452 arg.freq = chandef->chan->center_freq;
5453 arg.band_center_freq1 = chandef->center_freq1;
5454 arg.band_center_freq2 = chandef->center_freq2;
5455 arg.mode = ath12k_phymodes[chandef->chan->band][chandef->width];
5458 arg.max_power = chandef->chan->max_power * 2;
5459 arg.max_reg_power = chandef->chan->max_reg_power * 2;
5460 arg.max_antenna_gain = chandef->chan->max_antenna_gain * 2;
5462 arg.pref_tx_streams = ar->num_tx_chains;
5463 arg.pref_rx_streams = ar->num_rx_chains;
5465 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
5466 arg.ssid = arvif->u.ap.ssid;
5467 arg.ssid_len = arvif->u.ap.ssid_len;
5468 arg.hidden_ssid = arvif->u.ap.hidden_ssid;
5470 /* For now allow DFS for AP mode */
5471 arg.chan_radar = !!(chandef->chan->flags & IEEE80211_CHAN_RADAR);
5473 arg.passive = arg.chan_radar;
5475 spin_lock_bh(&ab->base_lock);
5476 arg.regdomain = ar->ab->dfs_region;
5477 spin_unlock_bh(&ab->base_lock);
5479 /* TODO: Notify if secondary 80Mhz also needs radar detection */
5481 ret = ath12k_set_he_mu_sounding_mode(ar, arvif);
5483 ath12k_warn(ar->ab, "failed to set he mode vdev %i\n",
5490 arg.passive |= !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR);
5492 ath12k_dbg(ab, ATH12K_DBG_MAC,
5493 "mac vdev %d start center_freq %d phymode %s\n",
5494 arg.vdev_id, arg.freq,
5495 ath12k_mac_phymode_str(arg.mode));
5497 ret = ath12k_wmi_vdev_start(ar, &arg, restart);
5499 ath12k_warn(ar->ab, "failed to %s WMI vdev %i\n",
5500 restart ? "restart" : "start", arg.vdev_id);
5504 ret = ath12k_mac_vdev_setup_sync(ar);
5506 ath12k_warn(ab, "failed to synchronize setup for vdev %i %s: %d\n",
5507 arg.vdev_id, restart ? "restart" : "start", ret);
5511 ar->num_started_vdevs++;
5512 ath12k_dbg(ab, ATH12K_DBG_MAC, "vdev %pM started, vdev_id %d\n",
5513 arvif->vif->addr, arvif->vdev_id);
5515 /* Enable CAC Flag in the driver by checking the channel DFS cac time,
5516 * i.e dfs_cac_ms value which will be valid only for radar channels
5517 * and state as NL80211_DFS_USABLE which indicates CAC needs to be
5518 * done before channel usage. This flags is used to drop rx packets.
5521 /* TODO: Set the flag for other interface types as required */
5522 if (arvif->vdev_type == WMI_VDEV_TYPE_AP &&
5523 chandef->chan->dfs_cac_ms &&
5524 chandef->chan->dfs_state == NL80211_DFS_USABLE) {
5525 set_bit(ATH12K_CAC_RUNNING, &ar->dev_flags);
5526 ath12k_dbg(ab, ATH12K_DBG_MAC,
5527 "CAC Started in chan_freq %d for vdev %d\n",
5528 arg.freq, arg.vdev_id);
5531 ret = ath12k_mac_set_txbf_conf(arvif);
5533 ath12k_warn(ab, "failed to set txbf conf for vdev %d: %d\n",
5534 arvif->vdev_id, ret);
5539 static int ath12k_mac_vdev_stop(struct ath12k_vif *arvif)
5541 struct ath12k *ar = arvif->ar;
5544 lockdep_assert_held(&ar->conf_mutex);
5546 reinit_completion(&ar->vdev_setup_done);
5548 ret = ath12k_wmi_vdev_stop(ar, arvif->vdev_id);
5550 ath12k_warn(ar->ab, "failed to stop WMI vdev %i: %d\n",
5551 arvif->vdev_id, ret);
5555 ret = ath12k_mac_vdev_setup_sync(ar);
5557 ath12k_warn(ar->ab, "failed to synchronize setup for vdev %i: %d\n",
5558 arvif->vdev_id, ret);
5562 WARN_ON(ar->num_started_vdevs == 0);
5564 ar->num_started_vdevs--;
5565 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "vdev %pM stopped, vdev_id %d\n",
5566 arvif->vif->addr, arvif->vdev_id);
5568 if (test_bit(ATH12K_CAC_RUNNING, &ar->dev_flags)) {
5569 clear_bit(ATH12K_CAC_RUNNING, &ar->dev_flags);
5570 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "CAC Stopped for vdev %d\n",
5579 static int ath12k_mac_vdev_start(struct ath12k_vif *arvif,
5580 const struct cfg80211_chan_def *chandef)
5582 return ath12k_mac_vdev_start_restart(arvif, chandef, false);
5585 static int ath12k_mac_vdev_restart(struct ath12k_vif *arvif,
5586 const struct cfg80211_chan_def *chandef)
5588 return ath12k_mac_vdev_start_restart(arvif, chandef, true);
5591 struct ath12k_mac_change_chanctx_arg {
5592 struct ieee80211_chanctx_conf *ctx;
5593 struct ieee80211_vif_chanctx_switch *vifs;
5599 ath12k_mac_change_chanctx_cnt_iter(void *data, u8 *mac,
5600 struct ieee80211_vif *vif)
5602 struct ath12k_mac_change_chanctx_arg *arg = data;
5604 if (rcu_access_pointer(vif->bss_conf.chanctx_conf) != arg->ctx)
5611 ath12k_mac_change_chanctx_fill_iter(void *data, u8 *mac,
5612 struct ieee80211_vif *vif)
5614 struct ath12k_mac_change_chanctx_arg *arg = data;
5615 struct ieee80211_chanctx_conf *ctx;
5617 ctx = rcu_access_pointer(vif->bss_conf.chanctx_conf);
5618 if (ctx != arg->ctx)
5621 if (WARN_ON(arg->next_vif == arg->n_vifs))
5624 arg->vifs[arg->next_vif].vif = vif;
5625 arg->vifs[arg->next_vif].old_ctx = ctx;
5626 arg->vifs[arg->next_vif].new_ctx = ctx;
5631 ath12k_mac_update_vif_chan(struct ath12k *ar,
5632 struct ieee80211_vif_chanctx_switch *vifs,
5635 struct ath12k_base *ab = ar->ab;
5636 struct ath12k_vif *arvif;
5639 bool monitor_vif = false;
5641 lockdep_assert_held(&ar->conf_mutex);
5643 for (i = 0; i < n_vifs; i++) {
5644 arvif = (void *)vifs[i].vif->drv_priv;
5646 if (vifs[i].vif->type == NL80211_IFTYPE_MONITOR)
5649 ath12k_dbg(ab, ATH12K_DBG_MAC,
5650 "mac chanctx switch vdev_id %i freq %u->%u width %d->%d\n",
5652 vifs[i].old_ctx->def.chan->center_freq,
5653 vifs[i].new_ctx->def.chan->center_freq,
5654 vifs[i].old_ctx->def.width,
5655 vifs[i].new_ctx->def.width);
5657 if (WARN_ON(!arvif->is_started))
5660 if (WARN_ON(!arvif->is_up))
5663 ret = ath12k_wmi_vdev_down(ar, arvif->vdev_id);
5665 ath12k_warn(ab, "failed to down vdev %d: %d\n",
5666 arvif->vdev_id, ret);
5671 /* All relevant vdevs are downed and associated channel resources
5672 * should be available for the channel switch now.
5675 /* TODO: Update ar->rx_channel */
5677 for (i = 0; i < n_vifs; i++) {
5678 arvif = (void *)vifs[i].vif->drv_priv;
5680 if (WARN_ON(!arvif->is_started))
5683 if (WARN_ON(!arvif->is_up))
5686 ret = ath12k_mac_vdev_restart(arvif, &vifs[i].new_ctx->def);
5688 ath12k_warn(ab, "failed to restart vdev %d: %d\n",
5689 arvif->vdev_id, ret);
5693 ret = ath12k_mac_setup_bcn_tmpl(arvif);
5695 ath12k_warn(ab, "failed to update bcn tmpl during csa: %d\n",
5698 ret = ath12k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
5701 ath12k_warn(ab, "failed to bring vdev up %d: %d\n",
5702 arvif->vdev_id, ret);
5707 /* Restart the internal monitor vdev on new channel */
5708 if (!monitor_vif && ar->monitor_vdev_created) {
5709 if (!ath12k_mac_monitor_stop(ar))
5710 ath12k_mac_monitor_start(ar);
5715 ath12k_mac_update_active_vif_chan(struct ath12k *ar,
5716 struct ieee80211_chanctx_conf *ctx)
5718 struct ath12k_mac_change_chanctx_arg arg = { .ctx = ctx };
5720 lockdep_assert_held(&ar->conf_mutex);
5722 ieee80211_iterate_active_interfaces_atomic(ar->hw,
5723 IEEE80211_IFACE_ITER_NORMAL,
5724 ath12k_mac_change_chanctx_cnt_iter,
5726 if (arg.n_vifs == 0)
5729 arg.vifs = kcalloc(arg.n_vifs, sizeof(arg.vifs[0]), GFP_KERNEL);
5733 ieee80211_iterate_active_interfaces_atomic(ar->hw,
5734 IEEE80211_IFACE_ITER_NORMAL,
5735 ath12k_mac_change_chanctx_fill_iter,
5738 ath12k_mac_update_vif_chan(ar, arg.vifs, arg.n_vifs);
5743 static void ath12k_mac_op_change_chanctx(struct ieee80211_hw *hw,
5744 struct ieee80211_chanctx_conf *ctx,
5747 struct ath12k *ar = hw->priv;
5748 struct ath12k_base *ab = ar->ab;
5750 mutex_lock(&ar->conf_mutex);
5752 ath12k_dbg(ab, ATH12K_DBG_MAC,
5753 "mac chanctx change freq %u width %d ptr %pK changed %x\n",
5754 ctx->def.chan->center_freq, ctx->def.width, ctx, changed);
5756 /* This shouldn't really happen because channel switching should use
5757 * switch_vif_chanctx().
5759 if (WARN_ON(changed & IEEE80211_CHANCTX_CHANGE_CHANNEL))
5762 if (changed & IEEE80211_CHANCTX_CHANGE_WIDTH)
5763 ath12k_mac_update_active_vif_chan(ar, ctx);
5765 /* TODO: Recalc radar detection */
5768 mutex_unlock(&ar->conf_mutex);
5771 static int ath12k_start_vdev_delay(struct ieee80211_hw *hw,
5772 struct ieee80211_vif *vif)
5774 struct ath12k *ar = hw->priv;
5775 struct ath12k_base *ab = ar->ab;
5776 struct ath12k_vif *arvif = (void *)vif->drv_priv;
5779 if (WARN_ON(arvif->is_started))
5782 ret = ath12k_mac_vdev_start(arvif, &arvif->chanctx.def);
5784 ath12k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n",
5785 arvif->vdev_id, vif->addr,
5786 arvif->chanctx.def.chan->center_freq, ret);
5790 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
5791 ret = ath12k_monitor_vdev_up(ar, arvif->vdev_id);
5793 ath12k_warn(ab, "failed put monitor up: %d\n", ret);
5798 arvif->is_started = true;
5800 /* TODO: Setup ps and cts/rts protection */
5805 ath12k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw,
5806 struct ieee80211_vif *vif,
5807 struct ieee80211_bss_conf *link_conf,
5808 struct ieee80211_chanctx_conf *ctx)
5810 struct ath12k *ar = hw->priv;
5811 struct ath12k_base *ab = ar->ab;
5812 struct ath12k_vif *arvif = (void *)vif->drv_priv;
5814 struct ath12k_wmi_peer_create_arg param;
5816 mutex_lock(&ar->conf_mutex);
5818 ath12k_dbg(ab, ATH12K_DBG_MAC,
5819 "mac chanctx assign ptr %pK vdev_id %i\n",
5820 ctx, arvif->vdev_id);
5822 /* for some targets bss peer must be created before vdev_start */
5823 if (ab->hw_params->vdev_start_delay &&
5824 arvif->vdev_type != WMI_VDEV_TYPE_AP &&
5825 arvif->vdev_type != WMI_VDEV_TYPE_MONITOR &&
5826 !ath12k_peer_exist_by_vdev_id(ab, arvif->vdev_id)) {
5827 memcpy(&arvif->chanctx, ctx, sizeof(*ctx));
5832 if (WARN_ON(arvif->is_started)) {
5837 if (ab->hw_params->vdev_start_delay &&
5838 (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
5839 arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)) {
5840 param.vdev_id = arvif->vdev_id;
5841 param.peer_type = WMI_PEER_TYPE_DEFAULT;
5842 param.peer_addr = ar->mac_addr;
5844 ret = ath12k_peer_create(ar, arvif, NULL, ¶m);
5846 ath12k_warn(ab, "failed to create peer after vdev start delay: %d",
5852 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
5853 ret = ath12k_mac_monitor_start(ar);
5856 arvif->is_started = true;
5860 ret = ath12k_mac_vdev_start(arvif, &ctx->def);
5862 ath12k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n",
5863 arvif->vdev_id, vif->addr,
5864 ctx->def.chan->center_freq, ret);
5868 if (arvif->vdev_type != WMI_VDEV_TYPE_MONITOR && ar->monitor_vdev_created)
5869 ath12k_mac_monitor_start(ar);
5871 arvif->is_started = true;
5873 /* TODO: Setup ps and cts/rts protection */
5876 mutex_unlock(&ar->conf_mutex);
5882 ath12k_mac_op_unassign_vif_chanctx(struct ieee80211_hw *hw,
5883 struct ieee80211_vif *vif,
5884 struct ieee80211_bss_conf *link_conf,
5885 struct ieee80211_chanctx_conf *ctx)
5887 struct ath12k *ar = hw->priv;
5888 struct ath12k_base *ab = ar->ab;
5889 struct ath12k_vif *arvif = (void *)vif->drv_priv;
5892 mutex_lock(&ar->conf_mutex);
5894 ath12k_dbg(ab, ATH12K_DBG_MAC,
5895 "mac chanctx unassign ptr %pK vdev_id %i\n",
5896 ctx, arvif->vdev_id);
5898 WARN_ON(!arvif->is_started);
5900 if (ab->hw_params->vdev_start_delay &&
5901 arvif->vdev_type == WMI_VDEV_TYPE_MONITOR &&
5902 ath12k_peer_find_by_addr(ab, ar->mac_addr))
5903 ath12k_peer_delete(ar, arvif->vdev_id, ar->mac_addr);
5905 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
5906 ret = ath12k_mac_monitor_stop(ar);
5908 mutex_unlock(&ar->conf_mutex);
5912 arvif->is_started = false;
5913 mutex_unlock(&ar->conf_mutex);
5916 ret = ath12k_mac_vdev_stop(arvif);
5918 ath12k_warn(ab, "failed to stop vdev %i: %d\n",
5919 arvif->vdev_id, ret);
5921 arvif->is_started = false;
5923 if (ab->hw_params->vdev_start_delay &&
5924 arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
5925 ath12k_wmi_vdev_down(ar, arvif->vdev_id);
5927 if (arvif->vdev_type != WMI_VDEV_TYPE_MONITOR &&
5928 ar->num_started_vdevs == 1 && ar->monitor_vdev_created)
5929 ath12k_mac_monitor_stop(ar);
5931 mutex_unlock(&ar->conf_mutex);
5935 ath12k_mac_op_switch_vif_chanctx(struct ieee80211_hw *hw,
5936 struct ieee80211_vif_chanctx_switch *vifs,
5938 enum ieee80211_chanctx_switch_mode mode)
5940 struct ath12k *ar = hw->priv;
5942 mutex_lock(&ar->conf_mutex);
5944 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
5945 "mac chanctx switch n_vifs %d mode %d\n",
5947 ath12k_mac_update_vif_chan(ar, vifs, n_vifs);
5949 mutex_unlock(&ar->conf_mutex);
5955 ath12k_set_vdev_param_to_all_vifs(struct ath12k *ar, int param, u32 value)
5957 struct ath12k_vif *arvif;
5960 mutex_lock(&ar->conf_mutex);
5961 list_for_each_entry(arvif, &ar->arvifs, list) {
5962 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "setting mac vdev %d param %d value %d\n",
5963 param, arvif->vdev_id, value);
5965 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
5968 ath12k_warn(ar->ab, "failed to set param %d for vdev %d: %d\n",
5969 param, arvif->vdev_id, ret);
5973 mutex_unlock(&ar->conf_mutex);
5977 /* mac80211 stores device specific RTS/Fragmentation threshold value,
5978 * this is set interface specific to firmware from ath12k driver
5980 static int ath12k_mac_op_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
5982 struct ath12k *ar = hw->priv;
5983 int param_id = WMI_VDEV_PARAM_RTS_THRESHOLD;
5985 return ath12k_set_vdev_param_to_all_vifs(ar, param_id, value);
5988 static int ath12k_mac_op_set_frag_threshold(struct ieee80211_hw *hw, u32 value)
5990 /* Even though there's a WMI vdev param for fragmentation threshold no
5991 * known firmware actually implements it. Moreover it is not possible to
5992 * rely frame fragmentation to mac80211 because firmware clears the
5993 * "more fragments" bit in frame control making it impossible for remote
5994 * devices to reassemble frames.
5996 * Hence implement a dummy callback just to say fragmentation isn't
5997 * supported. This effectively prevents mac80211 from doing frame
5998 * fragmentation in software.
6003 static void ath12k_mac_op_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
6004 u32 queues, bool drop)
6006 struct ath12k *ar = hw->priv;
6012 time_left = wait_event_timeout(ar->dp.tx_empty_waitq,
6013 (atomic_read(&ar->dp.num_tx_pending) == 0),
6014 ATH12K_FLUSH_TIMEOUT);
6016 ath12k_warn(ar->ab, "failed to flush transmit queue %ld\n", time_left);
6020 ath12k_mac_bitrate_mask_num_ht_rates(struct ath12k *ar,
6021 enum nl80211_band band,
6022 const struct cfg80211_bitrate_mask *mask)
6027 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++)
6028 num_rates += hweight16(mask->control[band].ht_mcs[i]);
6034 ath12k_mac_has_single_legacy_rate(struct ath12k *ar,
6035 enum nl80211_band band,
6036 const struct cfg80211_bitrate_mask *mask)
6040 num_rates = hweight32(mask->control[band].legacy);
6042 if (ath12k_mac_bitrate_mask_num_ht_rates(ar, band, mask))
6045 if (ath12k_mac_bitrate_mask_num_vht_rates(ar, band, mask))
6048 return num_rates == 1;
6052 ath12k_mac_bitrate_mask_get_single_nss(struct ath12k *ar,
6053 enum nl80211_band band,
6054 const struct cfg80211_bitrate_mask *mask,
6057 struct ieee80211_supported_band *sband = &ar->mac.sbands[band];
6058 u16 vht_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
6060 u8 vht_nss_mask = 0;
6063 /* No need to consider legacy here. Basic rates are always present
6067 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) {
6068 if (mask->control[band].ht_mcs[i] == 0)
6070 else if (mask->control[band].ht_mcs[i] ==
6071 sband->ht_cap.mcs.rx_mask[i])
6072 ht_nss_mask |= BIT(i);
6077 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
6078 if (mask->control[band].vht_mcs[i] == 0)
6080 else if (mask->control[band].vht_mcs[i] ==
6081 ath12k_mac_get_max_vht_mcs_map(vht_mcs_map, i))
6082 vht_nss_mask |= BIT(i);
6087 if (ht_nss_mask != vht_nss_mask)
6090 if (ht_nss_mask == 0)
6093 if (BIT(fls(ht_nss_mask)) - 1 != ht_nss_mask)
6096 *nss = fls(ht_nss_mask);
6102 ath12k_mac_get_single_legacy_rate(struct ath12k *ar,
6103 enum nl80211_band band,
6104 const struct cfg80211_bitrate_mask *mask,
6112 if (hweight32(mask->control[band].legacy) != 1)
6115 rate_idx = ffs(mask->control[band].legacy) - 1;
6117 if (band == NL80211_BAND_5GHZ || band == NL80211_BAND_6GHZ)
6118 rate_idx += ATH12K_MAC_FIRST_OFDM_RATE_IDX;
6120 hw_rate = ath12k_legacy_rates[rate_idx].hw_value;
6121 bitrate = ath12k_legacy_rates[rate_idx].bitrate;
6123 if (ath12k_mac_bitrate_is_cck(bitrate))
6124 preamble = WMI_RATE_PREAMBLE_CCK;
6126 preamble = WMI_RATE_PREAMBLE_OFDM;
6129 *rate = ATH12K_HW_RATE_CODE(hw_rate, 0, preamble);
6134 static int ath12k_mac_set_fixed_rate_params(struct ath12k_vif *arvif,
6135 u32 rate, u8 nss, u8 sgi, u8 ldpc)
6137 struct ath12k *ar = arvif->ar;
6141 lockdep_assert_held(&ar->conf_mutex);
6143 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac set fixed rate params vdev %i rate 0x%02x nss %u sgi %u\n",
6144 arvif->vdev_id, rate, nss, sgi);
6146 vdev_param = WMI_VDEV_PARAM_FIXED_RATE;
6147 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
6150 ath12k_warn(ar->ab, "failed to set fixed rate param 0x%02x: %d\n",
6155 vdev_param = WMI_VDEV_PARAM_NSS;
6156 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
6159 ath12k_warn(ar->ab, "failed to set nss param %d: %d\n",
6164 vdev_param = WMI_VDEV_PARAM_SGI;
6165 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
6168 ath12k_warn(ar->ab, "failed to set sgi param %d: %d\n",
6173 vdev_param = WMI_VDEV_PARAM_LDPC;
6174 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
6177 ath12k_warn(ar->ab, "failed to set ldpc param %d: %d\n",
6186 ath12k_mac_vht_mcs_range_present(struct ath12k *ar,
6187 enum nl80211_band band,
6188 const struct cfg80211_bitrate_mask *mask)
6193 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
6194 vht_mcs = mask->control[band].vht_mcs[i];
6210 static void ath12k_mac_set_bitrate_mask_iter(void *data,
6211 struct ieee80211_sta *sta)
6213 struct ath12k_vif *arvif = data;
6214 struct ath12k_sta *arsta = (struct ath12k_sta *)sta->drv_priv;
6215 struct ath12k *ar = arvif->ar;
6217 spin_lock_bh(&ar->data_lock);
6218 arsta->changed |= IEEE80211_RC_SUPP_RATES_CHANGED;
6219 spin_unlock_bh(&ar->data_lock);
6221 ieee80211_queue_work(ar->hw, &arsta->update_wk);
6224 static void ath12k_mac_disable_peer_fixed_rate(void *data,
6225 struct ieee80211_sta *sta)
6227 struct ath12k_vif *arvif = data;
6228 struct ath12k *ar = arvif->ar;
6231 ret = ath12k_wmi_set_peer_param(ar, sta->addr,
6233 WMI_PEER_PARAM_FIXED_RATE,
6234 WMI_FIXED_RATE_NONE);
6237 "failed to disable peer fixed rate for STA %pM ret %d\n",
6242 ath12k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw,
6243 struct ieee80211_vif *vif,
6244 const struct cfg80211_bitrate_mask *mask)
6246 struct ath12k_vif *arvif = (void *)vif->drv_priv;
6247 struct cfg80211_chan_def def;
6248 struct ath12k *ar = arvif->ar;
6249 enum nl80211_band band;
6250 const u8 *ht_mcs_mask;
6251 const u16 *vht_mcs_mask;
6260 if (ath12k_mac_vif_chan(vif, &def))
6263 band = def.chan->band;
6264 ht_mcs_mask = mask->control[band].ht_mcs;
6265 vht_mcs_mask = mask->control[band].vht_mcs;
6266 ldpc = !!(ar->ht_cap_info & WMI_HT_CAP_LDPC);
6268 sgi = mask->control[band].gi;
6269 if (sgi == NL80211_TXRATE_FORCE_LGI)
6272 /* mac80211 doesn't support sending a fixed HT/VHT MCS alone, rather it
6273 * requires passing at least one of used basic rates along with them.
6274 * Fixed rate setting across different preambles(legacy, HT, VHT) is
6275 * not supported by the FW. Hence use of FIXED_RATE vdev param is not
6276 * suitable for setting single HT/VHT rates.
6277 * But, there could be a single basic rate passed from userspace which
6278 * can be done through the FIXED_RATE param.
6280 if (ath12k_mac_has_single_legacy_rate(ar, band, mask)) {
6281 ret = ath12k_mac_get_single_legacy_rate(ar, band, mask, &rate,
6284 ath12k_warn(ar->ab, "failed to get single legacy rate for vdev %i: %d\n",
6285 arvif->vdev_id, ret);
6288 ieee80211_iterate_stations_atomic(ar->hw,
6289 ath12k_mac_disable_peer_fixed_rate,
6291 } else if (ath12k_mac_bitrate_mask_get_single_nss(ar, band, mask,
6293 rate = WMI_FIXED_RATE_NONE;
6296 rate = WMI_FIXED_RATE_NONE;
6297 nss = min_t(u32, ar->num_tx_chains,
6298 max(ath12k_mac_max_ht_nss(ht_mcs_mask),
6299 ath12k_mac_max_vht_nss(vht_mcs_mask)));
6301 /* If multiple rates across different preambles are given
6302 * we can reconfigure this info with all peers using PEER_ASSOC
6303 * command with the below exception cases.
6304 * - Single VHT Rate : peer_assoc command accommodates only MCS
6305 * range values i.e 0-7, 0-8, 0-9 for VHT. Though mac80211
6306 * mandates passing basic rates along with HT/VHT rates, FW
6307 * doesn't allow switching from VHT to Legacy. Hence instead of
6308 * setting legacy and VHT rates using RATEMASK_CMD vdev cmd,
6309 * we could set this VHT rate as peer fixed rate param, which
6310 * will override FIXED rate and FW rate control algorithm.
6311 * If single VHT rate is passed along with HT rates, we select
6312 * the VHT rate as fixed rate for vht peers.
6313 * - Multiple VHT Rates : When Multiple VHT rates are given,this
6314 * can be set using RATEMASK CMD which uses FW rate-ctl alg.
6315 * TODO: Setting multiple VHT MCS and replacing peer_assoc with
6316 * RATEMASK_CMDID can cover all use cases of setting rates
6317 * across multiple preambles and rates within same type.
6318 * But requires more validation of the command at this point.
6321 num_rates = ath12k_mac_bitrate_mask_num_vht_rates(ar, band,
6324 if (!ath12k_mac_vht_mcs_range_present(ar, band, mask) &&
6326 /* TODO: Handle multiple VHT MCS values setting using
6330 "Setting more than one MCS Value in bitrate mask not supported\n");
6334 ieee80211_iterate_stations_atomic(ar->hw,
6335 ath12k_mac_disable_peer_fixed_rate,
6338 mutex_lock(&ar->conf_mutex);
6340 arvif->bitrate_mask = *mask;
6341 ieee80211_iterate_stations_atomic(ar->hw,
6342 ath12k_mac_set_bitrate_mask_iter,
6345 mutex_unlock(&ar->conf_mutex);
6348 mutex_lock(&ar->conf_mutex);
6350 ret = ath12k_mac_set_fixed_rate_params(arvif, rate, nss, sgi, ldpc);
6352 ath12k_warn(ar->ab, "failed to set fixed rate params on vdev %i: %d\n",
6353 arvif->vdev_id, ret);
6356 mutex_unlock(&ar->conf_mutex);
6362 ath12k_mac_op_reconfig_complete(struct ieee80211_hw *hw,
6363 enum ieee80211_reconfig_type reconfig_type)
6365 struct ath12k *ar = hw->priv;
6366 struct ath12k_base *ab = ar->ab;
6369 if (reconfig_type != IEEE80211_RECONFIG_TYPE_RESTART)
6372 mutex_lock(&ar->conf_mutex);
6374 if (ar->state == ATH12K_STATE_RESTARTED) {
6375 ath12k_warn(ar->ab, "pdev %d successfully recovered\n",
6377 ar->state = ATH12K_STATE_ON;
6378 ieee80211_wake_queues(ar->hw);
6381 recovery_count = atomic_inc_return(&ab->recovery_count);
6382 ath12k_dbg(ab, ATH12K_DBG_BOOT, "recovery count %d\n",
6384 /* When there are multiple radios in an SOC,
6385 * the recovery has to be done for each radio
6387 if (recovery_count == ab->num_radios) {
6388 atomic_dec(&ab->reset_count);
6389 complete(&ab->reset_complete);
6390 ab->is_reset = false;
6391 atomic_set(&ab->fail_cont_count, 0);
6392 ath12k_dbg(ab, ATH12K_DBG_BOOT, "reset success\n");
6397 mutex_unlock(&ar->conf_mutex);
6401 ath12k_mac_update_bss_chan_survey(struct ath12k *ar,
6402 struct ieee80211_channel *channel)
6405 enum wmi_bss_chan_info_req_type type = WMI_BSS_SURVEY_REQ_TYPE_READ;
6407 lockdep_assert_held(&ar->conf_mutex);
6409 if (!test_bit(WMI_TLV_SERVICE_BSS_CHANNEL_INFO_64, ar->ab->wmi_ab.svc_map) ||
6410 ar->rx_channel != channel)
6413 if (ar->scan.state != ATH12K_SCAN_IDLE) {
6414 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
6415 "ignoring bss chan info req while scanning..\n");
6419 reinit_completion(&ar->bss_survey_done);
6421 ret = ath12k_wmi_pdev_bss_chan_info_request(ar, type);
6423 ath12k_warn(ar->ab, "failed to send pdev bss chan info request\n");
6427 ret = wait_for_completion_timeout(&ar->bss_survey_done, 3 * HZ);
6429 ath12k_warn(ar->ab, "bss channel survey timed out\n");
6432 static int ath12k_mac_op_get_survey(struct ieee80211_hw *hw, int idx,
6433 struct survey_info *survey)
6435 struct ath12k *ar = hw->priv;
6436 struct ieee80211_supported_band *sband;
6437 struct survey_info *ar_survey;
6440 if (idx >= ATH12K_NUM_CHANS)
6443 ar_survey = &ar->survey[idx];
6445 mutex_lock(&ar->conf_mutex);
6447 sband = hw->wiphy->bands[NL80211_BAND_2GHZ];
6448 if (sband && idx >= sband->n_channels) {
6449 idx -= sband->n_channels;
6454 sband = hw->wiphy->bands[NL80211_BAND_5GHZ];
6456 if (!sband || idx >= sband->n_channels) {
6461 ath12k_mac_update_bss_chan_survey(ar, &sband->channels[idx]);
6463 spin_lock_bh(&ar->data_lock);
6464 memcpy(survey, ar_survey, sizeof(*survey));
6465 spin_unlock_bh(&ar->data_lock);
6467 survey->channel = &sband->channels[idx];
6469 if (ar->rx_channel == survey->channel)
6470 survey->filled |= SURVEY_INFO_IN_USE;
6473 mutex_unlock(&ar->conf_mutex);
6477 static void ath12k_mac_op_sta_statistics(struct ieee80211_hw *hw,
6478 struct ieee80211_vif *vif,
6479 struct ieee80211_sta *sta,
6480 struct station_info *sinfo)
6482 struct ath12k_sta *arsta = (struct ath12k_sta *)sta->drv_priv;
6484 sinfo->rx_duration = arsta->rx_duration;
6485 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_DURATION);
6487 sinfo->tx_duration = arsta->tx_duration;
6488 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_DURATION);
6490 if (!arsta->txrate.legacy && !arsta->txrate.nss)
6493 if (arsta->txrate.legacy) {
6494 sinfo->txrate.legacy = arsta->txrate.legacy;
6496 sinfo->txrate.mcs = arsta->txrate.mcs;
6497 sinfo->txrate.nss = arsta->txrate.nss;
6498 sinfo->txrate.bw = arsta->txrate.bw;
6499 sinfo->txrate.he_gi = arsta->txrate.he_gi;
6500 sinfo->txrate.he_dcm = arsta->txrate.he_dcm;
6501 sinfo->txrate.he_ru_alloc = arsta->txrate.he_ru_alloc;
6503 sinfo->txrate.flags = arsta->txrate.flags;
6504 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
6506 /* TODO: Use real NF instead of default one. */
6507 sinfo->signal = arsta->rssi_comb + ATH12K_DEFAULT_NOISE_FLOOR;
6508 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL);
6511 static const struct ieee80211_ops ath12k_ops = {
6512 .tx = ath12k_mac_op_tx,
6513 .wake_tx_queue = ieee80211_handle_wake_tx_queue,
6514 .start = ath12k_mac_op_start,
6515 .stop = ath12k_mac_op_stop,
6516 .reconfig_complete = ath12k_mac_op_reconfig_complete,
6517 .add_interface = ath12k_mac_op_add_interface,
6518 .remove_interface = ath12k_mac_op_remove_interface,
6519 .update_vif_offload = ath12k_mac_op_update_vif_offload,
6520 .config = ath12k_mac_op_config,
6521 .bss_info_changed = ath12k_mac_op_bss_info_changed,
6522 .configure_filter = ath12k_mac_op_configure_filter,
6523 .hw_scan = ath12k_mac_op_hw_scan,
6524 .cancel_hw_scan = ath12k_mac_op_cancel_hw_scan,
6525 .set_key = ath12k_mac_op_set_key,
6526 .sta_state = ath12k_mac_op_sta_state,
6527 .sta_set_txpwr = ath12k_mac_op_sta_set_txpwr,
6528 .sta_rc_update = ath12k_mac_op_sta_rc_update,
6529 .conf_tx = ath12k_mac_op_conf_tx,
6530 .set_antenna = ath12k_mac_op_set_antenna,
6531 .get_antenna = ath12k_mac_op_get_antenna,
6532 .ampdu_action = ath12k_mac_op_ampdu_action,
6533 .add_chanctx = ath12k_mac_op_add_chanctx,
6534 .remove_chanctx = ath12k_mac_op_remove_chanctx,
6535 .change_chanctx = ath12k_mac_op_change_chanctx,
6536 .assign_vif_chanctx = ath12k_mac_op_assign_vif_chanctx,
6537 .unassign_vif_chanctx = ath12k_mac_op_unassign_vif_chanctx,
6538 .switch_vif_chanctx = ath12k_mac_op_switch_vif_chanctx,
6539 .set_rts_threshold = ath12k_mac_op_set_rts_threshold,
6540 .set_frag_threshold = ath12k_mac_op_set_frag_threshold,
6541 .set_bitrate_mask = ath12k_mac_op_set_bitrate_mask,
6542 .get_survey = ath12k_mac_op_get_survey,
6543 .flush = ath12k_mac_op_flush,
6544 .sta_statistics = ath12k_mac_op_sta_statistics,
6547 static void ath12k_mac_update_ch_list(struct ath12k *ar,
6548 struct ieee80211_supported_band *band,
6549 u32 freq_low, u32 freq_high)
6553 if (!(freq_low && freq_high))
6556 for (i = 0; i < band->n_channels; i++) {
6557 if (band->channels[i].center_freq < freq_low ||
6558 band->channels[i].center_freq > freq_high)
6559 band->channels[i].flags |= IEEE80211_CHAN_DISABLED;
6563 static u32 ath12k_get_phy_id(struct ath12k *ar, u32 band)
6565 struct ath12k_pdev *pdev = ar->pdev;
6566 struct ath12k_pdev_cap *pdev_cap = &pdev->cap;
6568 if (band == WMI_HOST_WLAN_2G_CAP)
6569 return pdev_cap->band[NL80211_BAND_2GHZ].phy_id;
6571 if (band == WMI_HOST_WLAN_5G_CAP)
6572 return pdev_cap->band[NL80211_BAND_5GHZ].phy_id;
6574 ath12k_warn(ar->ab, "unsupported phy cap:%d\n", band);
6579 static int ath12k_mac_setup_channels_rates(struct ath12k *ar,
6580 u32 supported_bands)
6582 struct ieee80211_supported_band *band;
6583 struct ath12k_wmi_hal_reg_capabilities_ext_arg *reg_cap;
6587 BUILD_BUG_ON((ARRAY_SIZE(ath12k_2ghz_channels) +
6588 ARRAY_SIZE(ath12k_5ghz_channels) +
6589 ARRAY_SIZE(ath12k_6ghz_channels)) !=
6592 reg_cap = &ar->ab->hal_reg_cap[ar->pdev_idx];
6594 if (supported_bands & WMI_HOST_WLAN_2G_CAP) {
6595 channels = kmemdup(ath12k_2ghz_channels,
6596 sizeof(ath12k_2ghz_channels),
6601 band = &ar->mac.sbands[NL80211_BAND_2GHZ];
6602 band->band = NL80211_BAND_2GHZ;
6603 band->n_channels = ARRAY_SIZE(ath12k_2ghz_channels);
6604 band->channels = channels;
6605 band->n_bitrates = ath12k_g_rates_size;
6606 band->bitrates = ath12k_g_rates;
6607 ar->hw->wiphy->bands[NL80211_BAND_2GHZ] = band;
6609 if (ar->ab->hw_params->single_pdev_only) {
6610 phy_id = ath12k_get_phy_id(ar, WMI_HOST_WLAN_2G_CAP);
6611 reg_cap = &ar->ab->hal_reg_cap[phy_id];
6613 ath12k_mac_update_ch_list(ar, band,
6614 reg_cap->low_2ghz_chan,
6615 reg_cap->high_2ghz_chan);
6618 if (supported_bands & WMI_HOST_WLAN_5G_CAP) {
6619 if (reg_cap->high_5ghz_chan >= ATH12K_MAX_6G_FREQ) {
6620 channels = kmemdup(ath12k_6ghz_channels,
6621 sizeof(ath12k_6ghz_channels), GFP_KERNEL);
6623 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
6627 ar->supports_6ghz = true;
6628 band = &ar->mac.sbands[NL80211_BAND_6GHZ];
6629 band->band = NL80211_BAND_6GHZ;
6630 band->n_channels = ARRAY_SIZE(ath12k_6ghz_channels);
6631 band->channels = channels;
6632 band->n_bitrates = ath12k_a_rates_size;
6633 band->bitrates = ath12k_a_rates;
6634 ar->hw->wiphy->bands[NL80211_BAND_6GHZ] = band;
6635 ath12k_mac_update_ch_list(ar, band,
6636 reg_cap->low_5ghz_chan,
6637 reg_cap->high_5ghz_chan);
6640 if (reg_cap->low_5ghz_chan < ATH12K_MIN_6G_FREQ) {
6641 channels = kmemdup(ath12k_5ghz_channels,
6642 sizeof(ath12k_5ghz_channels),
6645 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
6646 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
6650 band = &ar->mac.sbands[NL80211_BAND_5GHZ];
6651 band->band = NL80211_BAND_5GHZ;
6652 band->n_channels = ARRAY_SIZE(ath12k_5ghz_channels);
6653 band->channels = channels;
6654 band->n_bitrates = ath12k_a_rates_size;
6655 band->bitrates = ath12k_a_rates;
6656 ar->hw->wiphy->bands[NL80211_BAND_5GHZ] = band;
6658 if (ar->ab->hw_params->single_pdev_only) {
6659 phy_id = ath12k_get_phy_id(ar, WMI_HOST_WLAN_5G_CAP);
6660 reg_cap = &ar->ab->hal_reg_cap[phy_id];
6663 ath12k_mac_update_ch_list(ar, band,
6664 reg_cap->low_5ghz_chan,
6665 reg_cap->high_5ghz_chan);
6672 static int ath12k_mac_setup_iface_combinations(struct ath12k *ar)
6674 struct ath12k_base *ab = ar->ab;
6675 struct ieee80211_iface_combination *combinations;
6676 struct ieee80211_iface_limit *limits;
6677 int n_limits, max_interfaces;
6680 ap = ab->hw_params->interface_modes & BIT(NL80211_IFTYPE_AP);
6682 mesh = IS_ENABLED(CONFIG_MAC80211_MESH) &&
6683 ab->hw_params->interface_modes & BIT(NL80211_IFTYPE_MESH_POINT);
6685 combinations = kzalloc(sizeof(*combinations), GFP_KERNEL);
6691 max_interfaces = 16;
6697 limits = kcalloc(n_limits, sizeof(*limits), GFP_KERNEL);
6699 kfree(combinations);
6704 limits[0].types |= BIT(NL80211_IFTYPE_STATION);
6707 limits[1].max = max_interfaces;
6708 limits[1].types |= BIT(NL80211_IFTYPE_AP);
6712 limits[1].types |= BIT(NL80211_IFTYPE_MESH_POINT);
6714 combinations[0].limits = limits;
6715 combinations[0].n_limits = n_limits;
6716 combinations[0].max_interfaces = max_interfaces;
6717 combinations[0].num_different_channels = 1;
6718 combinations[0].beacon_int_infra_match = true;
6719 combinations[0].beacon_int_min_gcd = 100;
6720 combinations[0].radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
6721 BIT(NL80211_CHAN_WIDTH_20) |
6722 BIT(NL80211_CHAN_WIDTH_40) |
6723 BIT(NL80211_CHAN_WIDTH_80);
6725 ar->hw->wiphy->iface_combinations = combinations;
6726 ar->hw->wiphy->n_iface_combinations = 1;
6731 static const u8 ath12k_if_types_ext_capa[] = {
6732 [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
6733 [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
6736 static const u8 ath12k_if_types_ext_capa_sta[] = {
6737 [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
6738 [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
6739 [9] = WLAN_EXT_CAPA10_TWT_REQUESTER_SUPPORT,
6742 static const u8 ath12k_if_types_ext_capa_ap[] = {
6743 [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
6744 [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
6745 [9] = WLAN_EXT_CAPA10_TWT_RESPONDER_SUPPORT,
6748 static const struct wiphy_iftype_ext_capab ath12k_iftypes_ext_capa[] = {
6750 .extended_capabilities = ath12k_if_types_ext_capa,
6751 .extended_capabilities_mask = ath12k_if_types_ext_capa,
6752 .extended_capabilities_len = sizeof(ath12k_if_types_ext_capa),
6754 .iftype = NL80211_IFTYPE_STATION,
6755 .extended_capabilities = ath12k_if_types_ext_capa_sta,
6756 .extended_capabilities_mask = ath12k_if_types_ext_capa_sta,
6757 .extended_capabilities_len =
6758 sizeof(ath12k_if_types_ext_capa_sta),
6760 .iftype = NL80211_IFTYPE_AP,
6761 .extended_capabilities = ath12k_if_types_ext_capa_ap,
6762 .extended_capabilities_mask = ath12k_if_types_ext_capa_ap,
6763 .extended_capabilities_len =
6764 sizeof(ath12k_if_types_ext_capa_ap),
6768 static void __ath12k_mac_unregister(struct ath12k *ar)
6770 cancel_work_sync(&ar->regd_update_work);
6772 ieee80211_unregister_hw(ar->hw);
6774 idr_for_each(&ar->txmgmt_idr, ath12k_mac_tx_mgmt_pending_free, ar);
6775 idr_destroy(&ar->txmgmt_idr);
6777 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
6778 kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels);
6779 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
6781 kfree(ar->hw->wiphy->iface_combinations[0].limits);
6782 kfree(ar->hw->wiphy->iface_combinations);
6784 SET_IEEE80211_DEV(ar->hw, NULL);
6787 void ath12k_mac_unregister(struct ath12k_base *ab)
6790 struct ath12k_pdev *pdev;
6793 for (i = 0; i < ab->num_radios; i++) {
6794 pdev = &ab->pdevs[i];
6799 __ath12k_mac_unregister(ar);
6803 static int __ath12k_mac_register(struct ath12k *ar)
6805 struct ath12k_base *ab = ar->ab;
6806 struct ath12k_pdev_cap *cap = &ar->pdev->cap;
6807 static const u32 cipher_suites[] = {
6808 WLAN_CIPHER_SUITE_TKIP,
6809 WLAN_CIPHER_SUITE_CCMP,
6810 WLAN_CIPHER_SUITE_AES_CMAC,
6811 WLAN_CIPHER_SUITE_BIP_CMAC_256,
6812 WLAN_CIPHER_SUITE_BIP_GMAC_128,
6813 WLAN_CIPHER_SUITE_BIP_GMAC_256,
6814 WLAN_CIPHER_SUITE_GCMP,
6815 WLAN_CIPHER_SUITE_GCMP_256,
6816 WLAN_CIPHER_SUITE_CCMP_256,
6821 ath12k_pdev_caps_update(ar);
6823 SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr);
6825 SET_IEEE80211_DEV(ar->hw, ab->dev);
6827 ret = ath12k_mac_setup_channels_rates(ar,
6828 cap->supported_bands);
6832 ath12k_mac_setup_ht_vht_cap(ar, cap, &ht_cap);
6833 ath12k_mac_setup_he_cap(ar, cap);
6835 ret = ath12k_mac_setup_iface_combinations(ar);
6837 ath12k_err(ar->ab, "failed to setup interface combinations: %d\n", ret);
6838 goto err_free_channels;
6841 ar->hw->wiphy->available_antennas_rx = cap->rx_chain_mask;
6842 ar->hw->wiphy->available_antennas_tx = cap->tx_chain_mask;
6844 ar->hw->wiphy->interface_modes = ab->hw_params->interface_modes;
6846 ieee80211_hw_set(ar->hw, SIGNAL_DBM);
6847 ieee80211_hw_set(ar->hw, SUPPORTS_PS);
6848 ieee80211_hw_set(ar->hw, SUPPORTS_DYNAMIC_PS);
6849 ieee80211_hw_set(ar->hw, MFP_CAPABLE);
6850 ieee80211_hw_set(ar->hw, REPORTS_TX_ACK_STATUS);
6851 ieee80211_hw_set(ar->hw, HAS_RATE_CONTROL);
6852 ieee80211_hw_set(ar->hw, AP_LINK_PS);
6853 ieee80211_hw_set(ar->hw, SPECTRUM_MGMT);
6854 ieee80211_hw_set(ar->hw, CONNECTION_MONITOR);
6855 ieee80211_hw_set(ar->hw, SUPPORTS_PER_STA_GTK);
6856 ieee80211_hw_set(ar->hw, CHANCTX_STA_CSA);
6857 ieee80211_hw_set(ar->hw, QUEUE_CONTROL);
6858 ieee80211_hw_set(ar->hw, SUPPORTS_TX_FRAG);
6859 ieee80211_hw_set(ar->hw, REPORTS_LOW_ACK);
6861 if (ht_cap & WMI_HT_CAP_ENABLED) {
6862 ieee80211_hw_set(ar->hw, AMPDU_AGGREGATION);
6863 ieee80211_hw_set(ar->hw, TX_AMPDU_SETUP_IN_HW);
6864 ieee80211_hw_set(ar->hw, SUPPORTS_REORDERING_BUFFER);
6865 ieee80211_hw_set(ar->hw, SUPPORTS_AMSDU_IN_AMPDU);
6866 ieee80211_hw_set(ar->hw, USES_RSS);
6869 ar->hw->wiphy->features |= NL80211_FEATURE_STATIC_SMPS;
6870 ar->hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
6872 /* TODO: Check if HT capability advertised from firmware is different
6873 * for each band for a dual band capable radio. It will be tricky to
6874 * handle it when the ht capability different for each band.
6876 if (ht_cap & WMI_HT_CAP_DYNAMIC_SMPS)
6877 ar->hw->wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS;
6879 ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID;
6880 ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN;
6882 ar->hw->max_listen_interval = ATH12K_MAX_HW_LISTEN_INTERVAL;
6884 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
6885 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
6886 ar->hw->wiphy->max_remain_on_channel_duration = 5000;
6888 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
6889 ar->hw->wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE |
6890 NL80211_FEATURE_AP_SCAN;
6892 ar->max_num_stations = TARGET_NUM_STATIONS;
6893 ar->max_num_peers = TARGET_NUM_PEERS_PDEV;
6895 ar->hw->wiphy->max_ap_assoc_sta = ar->max_num_stations;
6897 ar->hw->queues = ATH12K_HW_MAX_QUEUES;
6898 ar->hw->wiphy->tx_queue_len = ATH12K_QUEUE_LEN;
6899 ar->hw->offchannel_tx_hw_queue = ATH12K_HW_MAX_QUEUES - 1;
6900 ar->hw->max_rx_aggregation_subframes = IEEE80211_MAX_AMPDU_BUF_HE;
6902 ar->hw->vif_data_size = sizeof(struct ath12k_vif);
6903 ar->hw->sta_data_size = sizeof(struct ath12k_sta);
6905 wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
6906 wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_STA_TX_PWR);
6908 ar->hw->wiphy->cipher_suites = cipher_suites;
6909 ar->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
6911 ar->hw->wiphy->iftype_ext_capab = ath12k_iftypes_ext_capa;
6912 ar->hw->wiphy->num_iftype_ext_capab =
6913 ARRAY_SIZE(ath12k_iftypes_ext_capa);
6915 if (ar->supports_6ghz) {
6916 wiphy_ext_feature_set(ar->hw->wiphy,
6917 NL80211_EXT_FEATURE_FILS_DISCOVERY);
6918 wiphy_ext_feature_set(ar->hw->wiphy,
6919 NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP);
6922 ath12k_reg_init(ar);
6924 if (!test_bit(ATH12K_FLAG_RAW_MODE, &ab->dev_flags)) {
6925 ar->hw->netdev_features = NETIF_F_HW_CSUM;
6926 ieee80211_hw_set(ar->hw, SW_CRYPTO_CONTROL);
6927 ieee80211_hw_set(ar->hw, SUPPORT_FAST_XMIT);
6930 ret = ieee80211_register_hw(ar->hw);
6932 ath12k_err(ar->ab, "ieee80211 registration failed: %d\n", ret);
6933 goto err_free_if_combs;
6936 if (!ab->hw_params->supports_monitor)
6937 /* There's a race between calling ieee80211_register_hw()
6938 * and here where the monitor mode is enabled for a little
6939 * while. But that time is so short and in practise it make
6940 * a difference in real life.
6942 ar->hw->wiphy->interface_modes &= ~BIT(NL80211_IFTYPE_MONITOR);
6944 /* Apply the regd received during initialization */
6945 ret = ath12k_regd_update(ar, true);
6947 ath12k_err(ar->ab, "ath12k regd update failed: %d\n", ret);
6948 goto err_unregister_hw;
6954 ieee80211_unregister_hw(ar->hw);
6957 kfree(ar->hw->wiphy->iface_combinations[0].limits);
6958 kfree(ar->hw->wiphy->iface_combinations);
6961 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
6962 kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels);
6963 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
6966 SET_IEEE80211_DEV(ar->hw, NULL);
6970 int ath12k_mac_register(struct ath12k_base *ab)
6973 struct ath12k_pdev *pdev;
6977 if (test_bit(ATH12K_FLAG_REGISTERED, &ab->dev_flags))
6980 for (i = 0; i < ab->num_radios; i++) {
6981 pdev = &ab->pdevs[i];
6983 if (ab->pdevs_macaddr_valid) {
6984 ether_addr_copy(ar->mac_addr, pdev->mac_addr);
6986 ether_addr_copy(ar->mac_addr, ab->mac_addr);
6987 ar->mac_addr[4] += i;
6990 ret = __ath12k_mac_register(ar);
6994 idr_init(&ar->txmgmt_idr);
6995 spin_lock_init(&ar->txmgmt_idr_lock);
6998 /* Initialize channel counters frequency value in hertz */
6999 ab->cc_freq_hz = 320000;
7000 ab->free_vdev_map = (1LL << (ab->num_radios * TARGET_NUM_VDEVS)) - 1;
7005 for (i = i - 1; i >= 0; i--) {
7006 pdev = &ab->pdevs[i];
7008 __ath12k_mac_unregister(ar);
7014 int ath12k_mac_allocate(struct ath12k_base *ab)
7016 struct ieee80211_hw *hw;
7018 struct ath12k_pdev *pdev;
7022 if (test_bit(ATH12K_FLAG_REGISTERED, &ab->dev_flags))
7025 for (i = 0; i < ab->num_radios; i++) {
7026 pdev = &ab->pdevs[i];
7027 hw = ieee80211_alloc_hw(sizeof(struct ath12k), &ath12k_ops);
7029 ath12k_warn(ab, "failed to allocate mac80211 hw device\n");
7039 ar->lmac_id = ath12k_hw_get_mac_from_pdev_id(ab->hw_params, i);
7041 ar->wmi = &ab->wmi_ab.wmi[i];
7042 /* FIXME: wmi[0] is already initialized during attach,
7043 * Should we do this again?
7045 ath12k_wmi_pdev_attach(ab, i);
7047 ar->cfg_tx_chainmask = pdev->cap.tx_chain_mask;
7048 ar->cfg_rx_chainmask = pdev->cap.rx_chain_mask;
7049 ar->num_tx_chains = hweight32(pdev->cap.tx_chain_mask);
7050 ar->num_rx_chains = hweight32(pdev->cap.rx_chain_mask);
7053 spin_lock_init(&ar->data_lock);
7054 INIT_LIST_HEAD(&ar->arvifs);
7055 INIT_LIST_HEAD(&ar->ppdu_stats_info);
7056 mutex_init(&ar->conf_mutex);
7057 init_completion(&ar->vdev_setup_done);
7058 init_completion(&ar->vdev_delete_done);
7059 init_completion(&ar->peer_assoc_done);
7060 init_completion(&ar->peer_delete_done);
7061 init_completion(&ar->install_key_done);
7062 init_completion(&ar->bss_survey_done);
7063 init_completion(&ar->scan.started);
7064 init_completion(&ar->scan.completed);
7066 INIT_DELAYED_WORK(&ar->scan.timeout, ath12k_scan_timeout_work);
7067 INIT_WORK(&ar->regd_update_work, ath12k_regd_update_work);
7069 INIT_WORK(&ar->wmi_mgmt_tx_work, ath12k_mgmt_over_wmi_tx_work);
7070 skb_queue_head_init(&ar->wmi_mgmt_tx_queue);
7071 clear_bit(ATH12K_FLAG_MONITOR_ENABLED, &ar->monitor_flags);
7077 ath12k_mac_destroy(ab);
7082 void ath12k_mac_destroy(struct ath12k_base *ab)
7085 struct ath12k_pdev *pdev;
7088 for (i = 0; i < ab->num_radios; i++) {
7089 pdev = &ab->pdevs[i];
7094 ieee80211_free_hw(ar->hw);