1 // SPDX-License-Identifier: BSD-3-Clause-Clear
3 * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
6 #include <net/mac80211.h>
7 #include <linux/etherdevice.h>
17 #include "debugfs_sta.h"
19 #define CHAN2G(_channel, _freq, _flags) { \
20 .band = NL80211_BAND_2GHZ, \
21 .hw_value = (_channel), \
22 .center_freq = (_freq), \
24 .max_antenna_gain = 0, \
28 #define CHAN5G(_channel, _freq, _flags) { \
29 .band = NL80211_BAND_5GHZ, \
30 .hw_value = (_channel), \
31 .center_freq = (_freq), \
33 .max_antenna_gain = 0, \
37 #define CHAN6G(_channel, _freq, _flags) { \
38 .band = NL80211_BAND_6GHZ, \
39 .hw_value = (_channel), \
40 .center_freq = (_freq), \
42 .max_antenna_gain = 0, \
46 static const struct ieee80211_channel ath11k_2ghz_channels[] = {
63 static const struct ieee80211_channel ath11k_5ghz_channels[] = {
93 static const struct ieee80211_channel ath11k_6ghz_channels[] = {
119 CHAN6G(101, 6455, 0),
120 CHAN6G(105, 6475, 0),
121 CHAN6G(109, 6495, 0),
122 CHAN6G(113, 6515, 0),
123 CHAN6G(117, 6535, 0),
124 CHAN6G(121, 6555, 0),
125 CHAN6G(125, 6575, 0),
126 CHAN6G(129, 6595, 0),
127 CHAN6G(133, 6615, 0),
128 CHAN6G(137, 6635, 0),
129 CHAN6G(141, 6655, 0),
130 CHAN6G(145, 6675, 0),
131 CHAN6G(149, 6695, 0),
132 CHAN6G(153, 6715, 0),
133 CHAN6G(157, 6735, 0),
134 CHAN6G(161, 6755, 0),
135 CHAN6G(165, 6775, 0),
136 CHAN6G(169, 6795, 0),
137 CHAN6G(173, 6815, 0),
138 CHAN6G(177, 6835, 0),
139 CHAN6G(181, 6855, 0),
140 CHAN6G(185, 6875, 0),
141 CHAN6G(189, 6895, 0),
142 CHAN6G(193, 6915, 0),
143 CHAN6G(197, 6935, 0),
144 CHAN6G(201, 6955, 0),
145 CHAN6G(205, 6975, 0),
146 CHAN6G(209, 6995, 0),
147 CHAN6G(213, 7015, 0),
148 CHAN6G(217, 7035, 0),
149 CHAN6G(221, 7055, 0),
150 CHAN6G(225, 7075, 0),
151 CHAN6G(229, 7095, 0),
152 CHAN6G(233, 7115, 0),
155 static struct ieee80211_rate ath11k_legacy_rates[] = {
157 .hw_value = ATH11K_HW_RATE_CCK_LP_1M },
159 .hw_value = ATH11K_HW_RATE_CCK_LP_2M,
160 .hw_value_short = ATH11K_HW_RATE_CCK_SP_2M,
161 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
163 .hw_value = ATH11K_HW_RATE_CCK_LP_5_5M,
164 .hw_value_short = ATH11K_HW_RATE_CCK_SP_5_5M,
165 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
167 .hw_value = ATH11K_HW_RATE_CCK_LP_11M,
168 .hw_value_short = ATH11K_HW_RATE_CCK_SP_11M,
169 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
171 { .bitrate = 60, .hw_value = ATH11K_HW_RATE_OFDM_6M },
172 { .bitrate = 90, .hw_value = ATH11K_HW_RATE_OFDM_9M },
173 { .bitrate = 120, .hw_value = ATH11K_HW_RATE_OFDM_12M },
174 { .bitrate = 180, .hw_value = ATH11K_HW_RATE_OFDM_18M },
175 { .bitrate = 240, .hw_value = ATH11K_HW_RATE_OFDM_24M },
176 { .bitrate = 360, .hw_value = ATH11K_HW_RATE_OFDM_36M },
177 { .bitrate = 480, .hw_value = ATH11K_HW_RATE_OFDM_48M },
178 { .bitrate = 540, .hw_value = ATH11K_HW_RATE_OFDM_54M },
182 ath11k_phymodes[NUM_NL80211_BANDS][ATH11K_CHAN_WIDTH_NUM] = {
183 [NL80211_BAND_2GHZ] = {
184 [NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
185 [NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
186 [NL80211_CHAN_WIDTH_20_NOHT] = MODE_11AX_HE20_2G,
187 [NL80211_CHAN_WIDTH_20] = MODE_11AX_HE20_2G,
188 [NL80211_CHAN_WIDTH_40] = MODE_11AX_HE40_2G,
189 [NL80211_CHAN_WIDTH_80] = MODE_11AX_HE80_2G,
190 [NL80211_CHAN_WIDTH_80P80] = MODE_UNKNOWN,
191 [NL80211_CHAN_WIDTH_160] = MODE_UNKNOWN,
193 [NL80211_BAND_5GHZ] = {
194 [NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
195 [NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
196 [NL80211_CHAN_WIDTH_20_NOHT] = MODE_11AX_HE20,
197 [NL80211_CHAN_WIDTH_20] = MODE_11AX_HE20,
198 [NL80211_CHAN_WIDTH_40] = MODE_11AX_HE40,
199 [NL80211_CHAN_WIDTH_80] = MODE_11AX_HE80,
200 [NL80211_CHAN_WIDTH_160] = MODE_11AX_HE160,
201 [NL80211_CHAN_WIDTH_80P80] = MODE_11AX_HE80_80,
203 [NL80211_BAND_6GHZ] = {
204 [NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
205 [NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
206 [NL80211_CHAN_WIDTH_20_NOHT] = MODE_11AX_HE20,
207 [NL80211_CHAN_WIDTH_20] = MODE_11AX_HE20,
208 [NL80211_CHAN_WIDTH_40] = MODE_11AX_HE40,
209 [NL80211_CHAN_WIDTH_80] = MODE_11AX_HE80,
210 [NL80211_CHAN_WIDTH_160] = MODE_11AX_HE160,
211 [NL80211_CHAN_WIDTH_80P80] = MODE_11AX_HE80_80,
216 const struct htt_rx_ring_tlv_filter ath11k_mac_mon_status_filter_default = {
217 .rx_filter = HTT_RX_FILTER_TLV_FLAGS_MPDU_START |
218 HTT_RX_FILTER_TLV_FLAGS_PPDU_END |
219 HTT_RX_FILTER_TLV_FLAGS_PPDU_END_STATUS_DONE,
220 .pkt_filter_flags0 = HTT_RX_FP_MGMT_FILTER_FLAGS0,
221 .pkt_filter_flags1 = HTT_RX_FP_MGMT_FILTER_FLAGS1,
222 .pkt_filter_flags2 = HTT_RX_FP_CTRL_FILTER_FLASG2,
223 .pkt_filter_flags3 = HTT_RX_FP_DATA_FILTER_FLASG3 |
224 HTT_RX_FP_CTRL_FILTER_FLASG3
227 #define ATH11K_MAC_FIRST_OFDM_RATE_IDX 4
228 #define ath11k_g_rates ath11k_legacy_rates
229 #define ath11k_g_rates_size (ARRAY_SIZE(ath11k_legacy_rates))
230 #define ath11k_a_rates (ath11k_legacy_rates + 4)
231 #define ath11k_a_rates_size (ARRAY_SIZE(ath11k_legacy_rates) - 4)
233 #define ATH11K_MAC_SCAN_TIMEOUT_MSECS 200 /* in msecs */
235 static const u32 ath11k_smps_map[] = {
236 [WLAN_HT_CAP_SM_PS_STATIC] = WMI_PEER_SMPS_STATIC,
237 [WLAN_HT_CAP_SM_PS_DYNAMIC] = WMI_PEER_SMPS_DYNAMIC,
238 [WLAN_HT_CAP_SM_PS_INVALID] = WMI_PEER_SMPS_PS_NONE,
239 [WLAN_HT_CAP_SM_PS_DISABLED] = WMI_PEER_SMPS_PS_NONE,
242 static int ath11k_start_vdev_delay(struct ieee80211_hw *hw,
243 struct ieee80211_vif *vif);
245 u8 ath11k_mac_bw_to_mac80211_bw(u8 bw)
251 ret = RATE_INFO_BW_20;
254 ret = RATE_INFO_BW_40;
257 ret = RATE_INFO_BW_80;
260 ret = RATE_INFO_BW_160;
267 enum ath11k_supported_bw ath11k_mac_mac80211_bw_to_ath11k_bw(enum rate_info_bw bw)
270 case RATE_INFO_BW_20:
272 case RATE_INFO_BW_40:
274 case RATE_INFO_BW_80:
276 case RATE_INFO_BW_160:
277 return ATH11K_BW_160;
283 int ath11k_mac_hw_ratecode_to_legacy_rate(u8 hw_rc, u8 preamble, u8 *rateidx,
286 /* As default, it is OFDM rates */
287 int i = ATH11K_MAC_FIRST_OFDM_RATE_IDX;
288 int max_rates_idx = ath11k_g_rates_size;
290 if (preamble == WMI_RATE_PREAMBLE_CCK) {
291 hw_rc &= ~ATH11k_HW_RATECODE_CCK_SHORT_PREAM_MASK;
293 max_rates_idx = ATH11K_MAC_FIRST_OFDM_RATE_IDX;
296 while (i < max_rates_idx) {
297 if (hw_rc == ath11k_legacy_rates[i].hw_value) {
299 *rate = ath11k_legacy_rates[i].bitrate;
308 static int get_num_chains(u32 mask)
321 u8 ath11k_mac_bitrate_to_idx(const struct ieee80211_supported_band *sband,
326 for (i = 0; i < sband->n_bitrates; i++)
327 if (sband->bitrates[i].bitrate == bitrate)
334 ath11k_mac_max_ht_nss(const u8 ht_mcs_mask[IEEE80211_HT_MCS_MASK_LEN])
338 for (nss = IEEE80211_HT_MCS_MASK_LEN - 1; nss >= 0; nss--)
339 if (ht_mcs_mask[nss])
346 ath11k_mac_max_vht_nss(const u16 vht_mcs_mask[NL80211_VHT_NSS_MAX])
350 for (nss = NL80211_VHT_NSS_MAX - 1; nss >= 0; nss--)
351 if (vht_mcs_mask[nss])
357 static u8 ath11k_parse_mpdudensity(u8 mpdudensity)
359 /* 802.11n D2.0 defined values for "Minimum MPDU Start Spacing":
360 * 0 for no restriction
369 switch (mpdudensity) {
375 /* Our lower layer calculations limit our precision to
392 static int ath11k_mac_vif_chan(struct ieee80211_vif *vif,
393 struct cfg80211_chan_def *def)
395 struct ieee80211_chanctx_conf *conf;
398 conf = rcu_dereference(vif->chanctx_conf);
410 static bool ath11k_mac_bitrate_is_cck(int bitrate)
423 u8 ath11k_mac_hw_rate_to_idx(const struct ieee80211_supported_band *sband,
424 u8 hw_rate, bool cck)
426 const struct ieee80211_rate *rate;
429 for (i = 0; i < sband->n_bitrates; i++) {
430 rate = &sband->bitrates[i];
432 if (ath11k_mac_bitrate_is_cck(rate->bitrate) != cck)
435 if (rate->hw_value == hw_rate)
437 else if (rate->flags & IEEE80211_RATE_SHORT_PREAMBLE &&
438 rate->hw_value_short == hw_rate)
445 static u8 ath11k_mac_bitrate_to_rate(int bitrate)
447 return DIV_ROUND_UP(bitrate, 5) |
448 (ath11k_mac_bitrate_is_cck(bitrate) ? BIT(7) : 0);
451 static void ath11k_get_arvif_iter(void *data, u8 *mac,
452 struct ieee80211_vif *vif)
454 struct ath11k_vif_iter *arvif_iter = data;
455 struct ath11k_vif *arvif = (void *)vif->drv_priv;
457 if (arvif->vdev_id == arvif_iter->vdev_id)
458 arvif_iter->arvif = arvif;
461 struct ath11k_vif *ath11k_mac_get_arvif(struct ath11k *ar, u32 vdev_id)
463 struct ath11k_vif_iter arvif_iter;
466 memset(&arvif_iter, 0, sizeof(struct ath11k_vif_iter));
467 arvif_iter.vdev_id = vdev_id;
469 flags = IEEE80211_IFACE_ITER_RESUME_ALL;
470 ieee80211_iterate_active_interfaces_atomic(ar->hw,
472 ath11k_get_arvif_iter,
474 if (!arvif_iter.arvif) {
475 ath11k_warn(ar->ab, "No VIF found for vdev %d\n", vdev_id);
479 return arvif_iter.arvif;
482 struct ath11k_vif *ath11k_mac_get_arvif_by_vdev_id(struct ath11k_base *ab,
486 struct ath11k_pdev *pdev;
487 struct ath11k_vif *arvif;
489 for (i = 0; i < ab->num_radios; i++) {
490 pdev = rcu_dereference(ab->pdevs_active[i]);
491 if (pdev && pdev->ar) {
492 arvif = ath11k_mac_get_arvif(pdev->ar, vdev_id);
501 struct ath11k *ath11k_mac_get_ar_by_vdev_id(struct ath11k_base *ab, u32 vdev_id)
504 struct ath11k_pdev *pdev;
506 for (i = 0; i < ab->num_radios; i++) {
507 pdev = rcu_dereference(ab->pdevs_active[i]);
508 if (pdev && pdev->ar) {
509 if (pdev->ar->allocated_vdev_map & (1LL << vdev_id))
517 struct ath11k *ath11k_mac_get_ar_by_pdev_id(struct ath11k_base *ab, u32 pdev_id)
520 struct ath11k_pdev *pdev;
522 if (ab->hw_params.single_pdev_only) {
523 pdev = rcu_dereference(ab->pdevs_active[0]);
524 return pdev ? pdev->ar : NULL;
527 if (WARN_ON(pdev_id > ab->num_radios))
530 for (i = 0; i < ab->num_radios; i++) {
531 pdev = rcu_dereference(ab->pdevs_active[i]);
533 if (pdev && pdev->pdev_id == pdev_id)
534 return (pdev->ar ? pdev->ar : NULL);
540 static void ath11k_pdev_caps_update(struct ath11k *ar)
542 struct ath11k_base *ab = ar->ab;
544 ar->max_tx_power = ab->target_caps.hw_max_tx_power;
546 /* FIXME Set min_tx_power to ab->target_caps.hw_min_tx_power.
547 * But since the received value in svcrdy is same as hw_max_tx_power,
548 * we can set ar->min_tx_power to 0 currently until
549 * this is fixed in firmware
551 ar->min_tx_power = 0;
553 ar->txpower_limit_2g = ar->max_tx_power;
554 ar->txpower_limit_5g = ar->max_tx_power;
555 ar->txpower_scale = WMI_HOST_TP_SCALE_MAX;
558 static int ath11k_mac_txpower_recalc(struct ath11k *ar)
560 struct ath11k_pdev *pdev = ar->pdev;
561 struct ath11k_vif *arvif;
562 int ret, txpower = -1;
565 lockdep_assert_held(&ar->conf_mutex);
567 list_for_each_entry(arvif, &ar->arvifs, list) {
568 if (arvif->txpower <= 0)
572 txpower = arvif->txpower;
574 txpower = min(txpower, arvif->txpower);
580 /* txpwr is set as 2 units per dBm in FW*/
581 txpower = min_t(u32, max_t(u32, ar->min_tx_power, txpower),
582 ar->max_tx_power) * 2;
584 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "txpower to set in hw %d\n",
587 if ((pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) &&
588 ar->txpower_limit_2g != txpower) {
589 param = WMI_PDEV_PARAM_TXPOWER_LIMIT2G;
590 ret = ath11k_wmi_pdev_set_param(ar, param,
591 txpower, ar->pdev->pdev_id);
594 ar->txpower_limit_2g = txpower;
597 if ((pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) &&
598 ar->txpower_limit_5g != txpower) {
599 param = WMI_PDEV_PARAM_TXPOWER_LIMIT5G;
600 ret = ath11k_wmi_pdev_set_param(ar, param,
601 txpower, ar->pdev->pdev_id);
604 ar->txpower_limit_5g = txpower;
610 ath11k_warn(ar->ab, "failed to recalc txpower limit %d using pdev param %d: %d\n",
611 txpower / 2, param, ret);
615 static int ath11k_recalc_rtscts_prot(struct ath11k_vif *arvif)
617 struct ath11k *ar = arvif->ar;
618 u32 vdev_param, rts_cts = 0;
621 lockdep_assert_held(&ar->conf_mutex);
623 vdev_param = WMI_VDEV_PARAM_ENABLE_RTSCTS;
625 /* Enable RTS/CTS protection for sw retries (when legacy stations
626 * are in BSS) or by default only for second rate series.
627 * TODO: Check if we need to enable CTS 2 Self in any case
629 rts_cts = WMI_USE_RTS_CTS;
631 if (arvif->num_legacy_stations > 0)
632 rts_cts |= WMI_RTSCTS_ACROSS_SW_RETRIES << 4;
634 rts_cts |= WMI_RTSCTS_FOR_SECOND_RATESERIES << 4;
636 /* Need not send duplicate param value to firmware */
637 if (arvif->rtscts_prot_mode == rts_cts)
640 arvif->rtscts_prot_mode = rts_cts;
642 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac vdev %d recalc rts/cts prot %d\n",
643 arvif->vdev_id, rts_cts);
645 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
646 vdev_param, rts_cts);
648 ath11k_warn(ar->ab, "failed to recalculate rts/cts prot for vdev %d: %d\n",
649 arvif->vdev_id, ret);
654 static int ath11k_mac_set_kickout(struct ath11k_vif *arvif)
656 struct ath11k *ar = arvif->ar;
660 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_STA_KICKOUT_TH,
661 ATH11K_KICKOUT_THRESHOLD,
664 ath11k_warn(ar->ab, "failed to set kickout threshold on vdev %i: %d\n",
665 arvif->vdev_id, ret);
669 param = WMI_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS;
670 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param,
671 ATH11K_KEEPALIVE_MIN_IDLE);
673 ath11k_warn(ar->ab, "failed to set keepalive minimum idle time on vdev %i: %d\n",
674 arvif->vdev_id, ret);
678 param = WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS;
679 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param,
680 ATH11K_KEEPALIVE_MAX_IDLE);
682 ath11k_warn(ar->ab, "failed to set keepalive maximum idle time on vdev %i: %d\n",
683 arvif->vdev_id, ret);
687 param = WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS;
688 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param,
689 ATH11K_KEEPALIVE_MAX_UNRESPONSIVE);
691 ath11k_warn(ar->ab, "failed to set keepalive maximum unresponsive time on vdev %i: %d\n",
692 arvif->vdev_id, ret);
699 void ath11k_mac_peer_cleanup_all(struct ath11k *ar)
701 struct ath11k_peer *peer, *tmp;
702 struct ath11k_base *ab = ar->ab;
704 lockdep_assert_held(&ar->conf_mutex);
706 spin_lock_bh(&ab->base_lock);
707 list_for_each_entry_safe(peer, tmp, &ab->peers, list) {
708 ath11k_peer_rx_tid_cleanup(ar, peer);
709 list_del(&peer->list);
712 spin_unlock_bh(&ab->base_lock);
715 ar->num_stations = 0;
718 static int ath11k_monitor_vdev_up(struct ath11k *ar, int vdev_id)
722 ret = ath11k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr);
724 ath11k_warn(ar->ab, "failed to put up monitor vdev %i: %d\n",
729 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac monitor vdev %i started\n",
734 static int ath11k_mac_op_config(struct ieee80211_hw *hw, u32 changed)
736 /* mac80211 requires this op to be present and that's why
737 * there's an empty function, this can be extended when
744 static int ath11k_mac_setup_bcn_tmpl(struct ath11k_vif *arvif)
746 struct ath11k *ar = arvif->ar;
747 struct ath11k_base *ab = ar->ab;
748 struct ieee80211_hw *hw = ar->hw;
749 struct ieee80211_vif *vif = arvif->vif;
750 struct ieee80211_mutable_offsets offs = {};
752 struct ieee80211_mgmt *mgmt;
756 if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
759 bcn = ieee80211_beacon_get_template(hw, vif, &offs);
761 ath11k_warn(ab, "failed to get beacon template from mac80211\n");
765 ies = bcn->data + ieee80211_get_hdrlen_from_skb(bcn);
766 ies += sizeof(mgmt->u.beacon);
768 if (cfg80211_find_ie(WLAN_EID_RSN, ies, (skb_tail_pointer(bcn) - ies)))
769 arvif->rsnie_present = true;
771 if (cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
772 WLAN_OUI_TYPE_MICROSOFT_WPA,
773 ies, (skb_tail_pointer(bcn) - ies)))
774 arvif->wpaie_present = true;
776 ret = ath11k_wmi_bcn_tmpl(ar, arvif->vdev_id, &offs, bcn);
781 ath11k_warn(ab, "failed to submit beacon template command: %d\n",
787 static void ath11k_control_beaconing(struct ath11k_vif *arvif,
788 struct ieee80211_bss_conf *info)
790 struct ath11k *ar = arvif->ar;
793 lockdep_assert_held(&arvif->ar->conf_mutex);
795 if (!info->enable_beacon) {
796 ret = ath11k_wmi_vdev_down(ar, arvif->vdev_id);
798 ath11k_warn(ar->ab, "failed to down vdev_id %i: %d\n",
799 arvif->vdev_id, ret);
801 arvif->is_up = false;
805 /* Install the beacon template to the FW */
806 ret = ath11k_mac_setup_bcn_tmpl(arvif);
808 ath11k_warn(ar->ab, "failed to update bcn tmpl during vdev up: %d\n",
813 arvif->tx_seq_no = 0x1000;
817 ether_addr_copy(arvif->bssid, info->bssid);
819 ret = ath11k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
822 ath11k_warn(ar->ab, "failed to bring up vdev %d: %i\n",
823 arvif->vdev_id, ret);
829 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac vdev %d up\n", arvif->vdev_id);
832 static void ath11k_peer_assoc_h_basic(struct ath11k *ar,
833 struct ieee80211_vif *vif,
834 struct ieee80211_sta *sta,
835 struct peer_assoc_params *arg)
837 struct ath11k_vif *arvif = (void *)vif->drv_priv;
840 lockdep_assert_held(&ar->conf_mutex);
842 if (vif->type == NL80211_IFTYPE_STATION)
843 aid = vif->bss_conf.aid;
847 ether_addr_copy(arg->peer_mac, sta->addr);
848 arg->vdev_id = arvif->vdev_id;
849 arg->peer_associd = aid;
850 arg->auth_flag = true;
851 /* TODO: STA WAR in ath10k for listen interval required? */
852 arg->peer_listen_intval = ar->hw->conf.listen_interval;
854 arg->peer_caps = vif->bss_conf.assoc_capability;
857 static void ath11k_peer_assoc_h_crypto(struct ath11k *ar,
858 struct ieee80211_vif *vif,
859 struct ieee80211_sta *sta,
860 struct peer_assoc_params *arg)
862 struct ieee80211_bss_conf *info = &vif->bss_conf;
863 struct cfg80211_chan_def def;
864 struct cfg80211_bss *bss;
865 struct ath11k_vif *arvif = (struct ath11k_vif *)vif->drv_priv;
866 const u8 *rsnie = NULL;
867 const u8 *wpaie = NULL;
869 lockdep_assert_held(&ar->conf_mutex);
871 if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
874 bss = cfg80211_get_bss(ar->hw->wiphy, def.chan, info->bssid, NULL, 0,
875 IEEE80211_BSS_TYPE_ANY, IEEE80211_PRIVACY_ANY);
877 if (arvif->rsnie_present || arvif->wpaie_present) {
878 arg->need_ptk_4_way = true;
879 if (arvif->wpaie_present)
880 arg->need_gtk_2_way = true;
882 const struct cfg80211_bss_ies *ies;
885 rsnie = ieee80211_bss_get_ie(bss, WLAN_EID_RSN);
887 ies = rcu_dereference(bss->ies);
889 wpaie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
890 WLAN_OUI_TYPE_MICROSOFT_WPA,
894 cfg80211_put_bss(ar->hw->wiphy, bss);
897 /* FIXME: base on RSN IE/WPA IE is a correct idea? */
898 if (rsnie || wpaie) {
899 ath11k_dbg(ar->ab, ATH11K_DBG_WMI,
900 "%s: rsn ie found\n", __func__);
901 arg->need_ptk_4_way = true;
905 ath11k_dbg(ar->ab, ATH11K_DBG_WMI,
906 "%s: wpa ie found\n", __func__);
907 arg->need_gtk_2_way = true;
911 /* TODO: Need to check if FW supports PMF? */
912 arg->is_pmf_enabled = true;
915 /* TODO: safe_mode_enabled (bypass 4-way handshake) flag req? */
918 static void ath11k_peer_assoc_h_rates(struct ath11k *ar,
919 struct ieee80211_vif *vif,
920 struct ieee80211_sta *sta,
921 struct peer_assoc_params *arg)
923 struct ath11k_vif *arvif = (void *)vif->drv_priv;
924 struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates;
925 struct cfg80211_chan_def def;
926 const struct ieee80211_supported_band *sband;
927 const struct ieee80211_rate *rates;
928 enum nl80211_band band;
933 lockdep_assert_held(&ar->conf_mutex);
935 if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
938 band = def.chan->band;
939 sband = ar->hw->wiphy->bands[band];
940 ratemask = sta->supp_rates[band];
941 ratemask &= arvif->bitrate_mask.control[band].legacy;
942 rates = sband->bitrates;
944 rateset->num_rates = 0;
946 for (i = 0; i < 32; i++, ratemask >>= 1, rates++) {
950 rate = ath11k_mac_bitrate_to_rate(rates->bitrate);
951 rateset->rates[rateset->num_rates] = rate;
952 rateset->num_rates++;
957 ath11k_peer_assoc_h_ht_masked(const u8 ht_mcs_mask[IEEE80211_HT_MCS_MASK_LEN])
961 for (nss = 0; nss < IEEE80211_HT_MCS_MASK_LEN; nss++)
962 if (ht_mcs_mask[nss])
969 ath11k_peer_assoc_h_vht_masked(const u16 vht_mcs_mask[NL80211_VHT_NSS_MAX])
973 for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++)
974 if (vht_mcs_mask[nss])
980 static void ath11k_peer_assoc_h_ht(struct ath11k *ar,
981 struct ieee80211_vif *vif,
982 struct ieee80211_sta *sta,
983 struct peer_assoc_params *arg)
985 const struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
986 struct ath11k_vif *arvif = (void *)vif->drv_priv;
987 struct cfg80211_chan_def def;
988 enum nl80211_band band;
989 const u8 *ht_mcs_mask;
994 lockdep_assert_held(&ar->conf_mutex);
996 if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
999 if (!ht_cap->ht_supported)
1002 band = def.chan->band;
1003 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
1005 if (ath11k_peer_assoc_h_ht_masked(ht_mcs_mask))
1008 arg->ht_flag = true;
1010 arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
1011 ht_cap->ampdu_factor)) - 1;
1013 arg->peer_mpdu_density =
1014 ath11k_parse_mpdudensity(ht_cap->ampdu_density);
1016 arg->peer_ht_caps = ht_cap->cap;
1017 arg->peer_rate_caps |= WMI_HOST_RC_HT_FLAG;
1019 if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING)
1020 arg->ldpc_flag = true;
1022 if (sta->bandwidth >= IEEE80211_STA_RX_BW_40) {
1024 arg->peer_rate_caps |= WMI_HOST_RC_CW40_FLAG;
1027 if (arvif->bitrate_mask.control[band].gi != NL80211_TXRATE_FORCE_LGI) {
1028 if (ht_cap->cap & (IEEE80211_HT_CAP_SGI_20 |
1029 IEEE80211_HT_CAP_SGI_40))
1030 arg->peer_rate_caps |= WMI_HOST_RC_SGI_FLAG;
1033 if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) {
1034 arg->peer_rate_caps |= WMI_HOST_RC_TX_STBC_FLAG;
1035 arg->stbc_flag = true;
1038 if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) {
1039 stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC;
1040 stbc = stbc >> IEEE80211_HT_CAP_RX_STBC_SHIFT;
1041 stbc = stbc << WMI_HOST_RC_RX_STBC_FLAG_S;
1042 arg->peer_rate_caps |= stbc;
1043 arg->stbc_flag = true;
1046 if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2])
1047 arg->peer_rate_caps |= WMI_HOST_RC_TS_FLAG;
1048 else if (ht_cap->mcs.rx_mask[1])
1049 arg->peer_rate_caps |= WMI_HOST_RC_DS_FLAG;
1051 for (i = 0, n = 0, max_nss = 0; i < IEEE80211_HT_MCS_MASK_LEN * 8; i++)
1052 if ((ht_cap->mcs.rx_mask[i / 8] & BIT(i % 8)) &&
1053 (ht_mcs_mask[i / 8] & BIT(i % 8))) {
1054 max_nss = (i / 8) + 1;
1055 arg->peer_ht_rates.rates[n++] = i;
1058 /* This is a workaround for HT-enabled STAs which break the spec
1059 * and have no HT capabilities RX mask (no HT RX MCS map).
1061 * As per spec, in section 20.3.5 Modulation and coding scheme (MCS),
1062 * MCS 0 through 7 are mandatory in 20MHz with 800 ns GI at all STAs.
1064 * Firmware asserts if such situation occurs.
1067 arg->peer_ht_rates.num_rates = 8;
1068 for (i = 0; i < arg->peer_ht_rates.num_rates; i++)
1069 arg->peer_ht_rates.rates[i] = i;
1071 arg->peer_ht_rates.num_rates = n;
1072 arg->peer_nss = min(sta->rx_nss, max_nss);
1075 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n",
1077 arg->peer_ht_rates.num_rates,
1081 static int ath11k_mac_get_max_vht_mcs_map(u16 mcs_map, int nss)
1083 switch ((mcs_map >> (2 * nss)) & 0x3) {
1084 case IEEE80211_VHT_MCS_SUPPORT_0_7: return BIT(8) - 1;
1085 case IEEE80211_VHT_MCS_SUPPORT_0_8: return BIT(9) - 1;
1086 case IEEE80211_VHT_MCS_SUPPORT_0_9: return BIT(10) - 1;
1092 ath11k_peer_assoc_h_vht_limit(u16 tx_mcs_set,
1093 const u16 vht_mcs_limit[NL80211_VHT_NSS_MAX])
1100 for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) {
1101 mcs_map = ath11k_mac_get_max_vht_mcs_map(tx_mcs_set, nss) &
1105 idx_limit = fls(mcs_map) - 1;
1109 switch (idx_limit) {
1118 mcs = IEEE80211_VHT_MCS_SUPPORT_0_7;
1121 mcs = IEEE80211_VHT_MCS_SUPPORT_0_8;
1124 mcs = IEEE80211_VHT_MCS_SUPPORT_0_9;
1130 mcs = IEEE80211_VHT_MCS_NOT_SUPPORTED;
1134 tx_mcs_set &= ~(0x3 << (nss * 2));
1135 tx_mcs_set |= mcs << (nss * 2);
1141 static void ath11k_peer_assoc_h_vht(struct ath11k *ar,
1142 struct ieee80211_vif *vif,
1143 struct ieee80211_sta *sta,
1144 struct peer_assoc_params *arg)
1146 const struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
1147 struct ath11k_vif *arvif = (void *)vif->drv_priv;
1148 struct cfg80211_chan_def def;
1149 enum nl80211_band band;
1150 const u16 *vht_mcs_mask;
1152 u8 max_nss, vht_mcs;
1155 if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
1158 if (!vht_cap->vht_supported)
1161 band = def.chan->band;
1162 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
1164 if (ath11k_peer_assoc_h_vht_masked(vht_mcs_mask))
1167 arg->vht_flag = true;
1169 /* TODO: similar flags required? */
1170 arg->vht_capable = true;
1172 if (def.chan->band == NL80211_BAND_2GHZ)
1173 arg->vht_ng_flag = true;
1175 arg->peer_vht_caps = vht_cap->cap;
1177 ampdu_factor = (vht_cap->cap &
1178 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >>
1179 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
1181 /* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to
1182 * zero in VHT IE. Using it would result in degraded throughput.
1183 * arg->peer_max_mpdu at this point contains HT max_mpdu so keep
1184 * it if VHT max_mpdu is smaller.
1186 arg->peer_max_mpdu = max(arg->peer_max_mpdu,
1187 (1U << (IEEE80211_HT_MAX_AMPDU_FACTOR +
1188 ampdu_factor)) - 1);
1190 if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
1193 if (sta->bandwidth == IEEE80211_STA_RX_BW_160)
1196 /* Calculate peer NSS capability from VHT capabilities if STA
1199 for (i = 0, max_nss = 0, vht_mcs = 0; i < NL80211_VHT_NSS_MAX; i++) {
1200 vht_mcs = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map) >>
1203 if (vht_mcs != IEEE80211_VHT_MCS_NOT_SUPPORTED &&
1207 arg->peer_nss = min(sta->rx_nss, max_nss);
1208 arg->rx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.rx_highest);
1209 arg->rx_mcs_set = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map);
1210 arg->tx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.tx_highest);
1211 arg->tx_mcs_set = ath11k_peer_assoc_h_vht_limit(
1212 __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map), vht_mcs_mask);
1214 /* In IPQ8074 platform, VHT mcs rate 10 and 11 is enabled by default.
1215 * VHT mcs rate 10 and 11 is not suppoerted in 11ac standard.
1216 * so explicitly disable the VHT MCS rate 10 and 11 in 11ac mode.
1218 arg->tx_mcs_set &= ~IEEE80211_VHT_MCS_SUPPORT_0_11_MASK;
1219 arg->tx_mcs_set |= IEEE80211_DISABLE_VHT_MCS_SUPPORT_0_11;
1221 if ((arg->tx_mcs_set & IEEE80211_VHT_MCS_NOT_SUPPORTED) ==
1222 IEEE80211_VHT_MCS_NOT_SUPPORTED)
1223 arg->peer_vht_caps &= ~IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE;
1226 arg->tx_max_mcs_nss = 0xFF;
1228 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac vht peer %pM max_mpdu %d flags 0x%x\n",
1229 sta->addr, arg->peer_max_mpdu, arg->peer_flags);
1231 /* TODO: rxnss_override */
1234 static void ath11k_peer_assoc_h_he(struct ath11k *ar,
1235 struct ieee80211_vif *vif,
1236 struct ieee80211_sta *sta,
1237 struct peer_assoc_params *arg)
1239 const struct ieee80211_sta_he_cap *he_cap = &sta->he_cap;
1243 if (!he_cap->has_he)
1246 arg->he_flag = true;
1248 memcpy(&arg->peer_he_cap_macinfo, he_cap->he_cap_elem.mac_cap_info,
1249 sizeof(arg->peer_he_cap_macinfo));
1250 memcpy(&arg->peer_he_cap_phyinfo, he_cap->he_cap_elem.phy_cap_info,
1251 sizeof(arg->peer_he_cap_phyinfo));
1252 arg->peer_he_ops = vif->bss_conf.he_oper.params;
1254 /* the top most byte is used to indicate BSS color info */
1255 arg->peer_he_ops &= 0xffffff;
1257 /* As per section 26.6.1 11ax Draft5.0, if the Max AMPDU Exponent Extension
1258 * in HE cap is zero, use the arg->peer_max_mpdu as calculated while parsing
1259 * VHT caps(if VHT caps is present) or HT caps (if VHT caps is not present).
1261 * For non-zero value of Max AMPDU Extponent Extension in HE MAC caps,
1262 * if a HE STA sends VHT cap and HE cap IE in assoc request then, use
1263 * MAX_AMPDU_LEN_FACTOR as 20 to calculate max_ampdu length.
1264 * If a HE STA that does not send VHT cap, but HE and HT cap in assoc
1265 * request, then use MAX_AMPDU_LEN_FACTOR as 16 to calculate max_ampdu
1268 ampdu_factor = (he_cap->he_cap_elem.mac_cap_info[3] &
1269 IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK) >>
1270 IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_SHIFT;
1273 if (sta->vht_cap.vht_supported)
1274 arg->peer_max_mpdu = (1 << (IEEE80211_HE_VHT_MAX_AMPDU_FACTOR +
1276 else if (sta->ht_cap.ht_supported)
1277 arg->peer_max_mpdu = (1 << (IEEE80211_HE_HT_MAX_AMPDU_FACTOR +
1281 if (he_cap->he_cap_elem.phy_cap_info[6] &
1282 IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT) {
1286 arg->peer_ppet.numss_m1 = he_cap->ppe_thres[0] &
1287 IEEE80211_PPE_THRES_NSS_MASK;
1288 arg->peer_ppet.ru_bit_mask =
1289 (he_cap->ppe_thres[0] &
1290 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK) >>
1291 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_POS;
1293 for (nss = 0; nss <= arg->peer_ppet.numss_m1; nss++) {
1294 for (ru = 0; ru < 4; ru++) {
1298 if ((arg->peer_ppet.ru_bit_mask & BIT(ru)) == 0)
1300 for (i = 0; i < 6; i++) {
1302 val |= ((he_cap->ppe_thres[bit / 8] >>
1303 (bit % 8)) & 0x1) << 5;
1306 arg->peer_ppet.ppet16_ppet8_ru3_ru0[nss] |=
1312 if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_RES)
1313 arg->twt_responder = true;
1314 if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_REQ)
1315 arg->twt_requester = true;
1317 switch (sta->bandwidth) {
1318 case IEEE80211_STA_RX_BW_160:
1319 if (he_cap->he_cap_elem.phy_cap_info[0] &
1320 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G) {
1321 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80p80);
1322 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80_80] = v;
1324 v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80p80);
1325 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80_80] = v;
1327 arg->peer_he_mcs_count++;
1329 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160);
1330 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v;
1332 v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_160);
1333 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v;
1335 arg->peer_he_mcs_count++;
1339 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80);
1340 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v;
1342 v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80);
1343 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v;
1345 arg->peer_he_mcs_count++;
1350 static void ath11k_peer_assoc_h_smps(struct ieee80211_sta *sta,
1351 struct peer_assoc_params *arg)
1353 const struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
1356 if (!ht_cap->ht_supported)
1359 smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
1360 smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
1363 case WLAN_HT_CAP_SM_PS_STATIC:
1364 arg->static_mimops_flag = true;
1366 case WLAN_HT_CAP_SM_PS_DYNAMIC:
1367 arg->dynamic_mimops_flag = true;
1369 case WLAN_HT_CAP_SM_PS_DISABLED:
1370 arg->spatial_mux_flag = true;
1377 static void ath11k_peer_assoc_h_qos(struct ath11k *ar,
1378 struct ieee80211_vif *vif,
1379 struct ieee80211_sta *sta,
1380 struct peer_assoc_params *arg)
1382 struct ath11k_vif *arvif = (void *)vif->drv_priv;
1384 switch (arvif->vdev_type) {
1385 case WMI_VDEV_TYPE_AP:
1387 /* TODO: Check WME vs QoS */
1388 arg->is_wme_set = true;
1389 arg->qos_flag = true;
1392 if (sta->wme && sta->uapsd_queues) {
1393 /* TODO: Check WME vs QoS */
1394 arg->is_wme_set = true;
1395 arg->apsd_flag = true;
1396 arg->peer_rate_caps |= WMI_HOST_RC_UAPSD_FLAG;
1399 case WMI_VDEV_TYPE_STA:
1401 arg->is_wme_set = true;
1402 arg->qos_flag = true;
1409 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac peer %pM qos %d\n",
1410 sta->addr, arg->qos_flag);
1413 static int ath11k_peer_assoc_qos_ap(struct ath11k *ar,
1414 struct ath11k_vif *arvif,
1415 struct ieee80211_sta *sta)
1417 struct ap_ps_params params;
1422 lockdep_assert_held(&ar->conf_mutex);
1424 params.vdev_id = arvif->vdev_id;
1426 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac uapsd_queues 0x%x max_sp %d\n",
1427 sta->uapsd_queues, sta->max_sp);
1430 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO)
1431 uapsd |= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN |
1432 WMI_AP_PS_UAPSD_AC3_TRIGGER_EN;
1433 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI)
1434 uapsd |= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN |
1435 WMI_AP_PS_UAPSD_AC2_TRIGGER_EN;
1436 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK)
1437 uapsd |= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN |
1438 WMI_AP_PS_UAPSD_AC1_TRIGGER_EN;
1439 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE)
1440 uapsd |= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN |
1441 WMI_AP_PS_UAPSD_AC0_TRIGGER_EN;
1444 if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP)
1445 max_sp = sta->max_sp;
1447 params.param = WMI_AP_PS_PEER_PARAM_UAPSD;
1448 params.value = uapsd;
1449 ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, ¶ms);
1453 params.param = WMI_AP_PS_PEER_PARAM_MAX_SP;
1454 params.value = max_sp;
1455 ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, ¶ms);
1459 /* TODO revisit during testing */
1460 params.param = WMI_AP_PS_PEER_PARAM_SIFS_RESP_FRMTYPE;
1461 params.value = DISABLE_SIFS_RESPONSE_TRIGGER;
1462 ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, ¶ms);
1466 params.param = WMI_AP_PS_PEER_PARAM_SIFS_RESP_UAPSD;
1467 params.value = DISABLE_SIFS_RESPONSE_TRIGGER;
1468 ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, ¶ms);
1475 ath11k_warn(ar->ab, "failed to set ap ps peer param %d for vdev %i: %d\n",
1476 params.param, arvif->vdev_id, ret);
1480 static bool ath11k_mac_sta_has_ofdm_only(struct ieee80211_sta *sta)
1482 return sta->supp_rates[NL80211_BAND_2GHZ] >>
1483 ATH11K_MAC_FIRST_OFDM_RATE_IDX;
1486 static enum wmi_phy_mode ath11k_mac_get_phymode_vht(struct ath11k *ar,
1487 struct ieee80211_sta *sta)
1489 if (sta->bandwidth == IEEE80211_STA_RX_BW_160) {
1490 switch (sta->vht_cap.cap &
1491 IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK) {
1492 case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ:
1493 return MODE_11AC_VHT160;
1494 case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ:
1495 return MODE_11AC_VHT80_80;
1497 /* not sure if this is a valid case? */
1498 return MODE_11AC_VHT160;
1502 if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
1503 return MODE_11AC_VHT80;
1505 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1506 return MODE_11AC_VHT40;
1508 if (sta->bandwidth == IEEE80211_STA_RX_BW_20)
1509 return MODE_11AC_VHT20;
1511 return MODE_UNKNOWN;
1514 static enum wmi_phy_mode ath11k_mac_get_phymode_he(struct ath11k *ar,
1515 struct ieee80211_sta *sta)
1517 if (sta->bandwidth == IEEE80211_STA_RX_BW_160) {
1518 if (sta->he_cap.he_cap_elem.phy_cap_info[0] &
1519 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
1520 return MODE_11AX_HE160;
1521 else if (sta->he_cap.he_cap_elem.phy_cap_info[0] &
1522 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
1523 return MODE_11AX_HE80_80;
1524 /* not sure if this is a valid case? */
1525 return MODE_11AX_HE160;
1528 if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
1529 return MODE_11AX_HE80;
1531 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1532 return MODE_11AX_HE40;
1534 if (sta->bandwidth == IEEE80211_STA_RX_BW_20)
1535 return MODE_11AX_HE20;
1537 return MODE_UNKNOWN;
1540 static void ath11k_peer_assoc_h_phymode(struct ath11k *ar,
1541 struct ieee80211_vif *vif,
1542 struct ieee80211_sta *sta,
1543 struct peer_assoc_params *arg)
1545 struct ath11k_vif *arvif = (void *)vif->drv_priv;
1546 struct cfg80211_chan_def def;
1547 enum nl80211_band band;
1548 const u8 *ht_mcs_mask;
1549 const u16 *vht_mcs_mask;
1550 enum wmi_phy_mode phymode = MODE_UNKNOWN;
1552 if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
1555 band = def.chan->band;
1556 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
1557 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
1560 case NL80211_BAND_2GHZ:
1561 if (sta->he_cap.has_he) {
1562 if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
1563 phymode = MODE_11AX_HE80_2G;
1564 else if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1565 phymode = MODE_11AX_HE40_2G;
1567 phymode = MODE_11AX_HE20_2G;
1568 } else if (sta->vht_cap.vht_supported &&
1569 !ath11k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
1570 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1571 phymode = MODE_11AC_VHT40;
1573 phymode = MODE_11AC_VHT20;
1574 } else if (sta->ht_cap.ht_supported &&
1575 !ath11k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
1576 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1577 phymode = MODE_11NG_HT40;
1579 phymode = MODE_11NG_HT20;
1580 } else if (ath11k_mac_sta_has_ofdm_only(sta)) {
1586 case NL80211_BAND_5GHZ:
1587 case NL80211_BAND_6GHZ:
1588 /* Check HE first */
1589 if (sta->he_cap.has_he) {
1590 phymode = ath11k_mac_get_phymode_he(ar, sta);
1591 } else if (sta->vht_cap.vht_supported &&
1592 !ath11k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
1593 phymode = ath11k_mac_get_phymode_vht(ar, sta);
1594 } else if (sta->ht_cap.ht_supported &&
1595 !ath11k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
1596 if (sta->bandwidth >= IEEE80211_STA_RX_BW_40)
1597 phymode = MODE_11NA_HT40;
1599 phymode = MODE_11NA_HT20;
1608 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac peer %pM phymode %s\n",
1609 sta->addr, ath11k_wmi_phymode_str(phymode));
1611 arg->peer_phymode = phymode;
1612 WARN_ON(phymode == MODE_UNKNOWN);
1615 static void ath11k_peer_assoc_prepare(struct ath11k *ar,
1616 struct ieee80211_vif *vif,
1617 struct ieee80211_sta *sta,
1618 struct peer_assoc_params *arg,
1621 lockdep_assert_held(&ar->conf_mutex);
1623 memset(arg, 0, sizeof(*arg));
1625 reinit_completion(&ar->peer_assoc_done);
1627 arg->peer_new_assoc = !reassoc;
1628 ath11k_peer_assoc_h_basic(ar, vif, sta, arg);
1629 ath11k_peer_assoc_h_crypto(ar, vif, sta, arg);
1630 ath11k_peer_assoc_h_rates(ar, vif, sta, arg);
1631 ath11k_peer_assoc_h_ht(ar, vif, sta, arg);
1632 ath11k_peer_assoc_h_vht(ar, vif, sta, arg);
1633 ath11k_peer_assoc_h_he(ar, vif, sta, arg);
1634 ath11k_peer_assoc_h_qos(ar, vif, sta, arg);
1635 ath11k_peer_assoc_h_phymode(ar, vif, sta, arg);
1636 ath11k_peer_assoc_h_smps(sta, arg);
1638 /* TODO: amsdu_disable req? */
1641 static int ath11k_setup_peer_smps(struct ath11k *ar, struct ath11k_vif *arvif,
1643 const struct ieee80211_sta_ht_cap *ht_cap)
1647 if (!ht_cap->ht_supported)
1650 smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
1651 smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
1653 if (smps >= ARRAY_SIZE(ath11k_smps_map))
1656 return ath11k_wmi_set_peer_param(ar, addr, arvif->vdev_id,
1657 WMI_PEER_MIMO_PS_STATE,
1658 ath11k_smps_map[smps]);
1661 static void ath11k_bss_assoc(struct ieee80211_hw *hw,
1662 struct ieee80211_vif *vif,
1663 struct ieee80211_bss_conf *bss_conf)
1665 struct ath11k *ar = hw->priv;
1666 struct ath11k_vif *arvif = (void *)vif->drv_priv;
1667 struct peer_assoc_params peer_arg;
1668 struct ieee80211_sta *ap_sta;
1671 lockdep_assert_held(&ar->conf_mutex);
1673 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac vdev %i assoc bssid %pM aid %d\n",
1674 arvif->vdev_id, arvif->bssid, arvif->aid);
1678 ap_sta = ieee80211_find_sta(vif, bss_conf->bssid);
1680 ath11k_warn(ar->ab, "failed to find station entry for bss %pM vdev %i\n",
1681 bss_conf->bssid, arvif->vdev_id);
1686 ath11k_peer_assoc_prepare(ar, vif, ap_sta, &peer_arg, false);
1690 ret = ath11k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
1692 ath11k_warn(ar->ab, "failed to run peer assoc for %pM vdev %i: %d\n",
1693 bss_conf->bssid, arvif->vdev_id, ret);
1697 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) {
1698 ath11k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
1699 bss_conf->bssid, arvif->vdev_id);
1703 ret = ath11k_setup_peer_smps(ar, arvif, bss_conf->bssid,
1706 ath11k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n",
1707 arvif->vdev_id, ret);
1711 WARN_ON(arvif->is_up);
1713 arvif->aid = bss_conf->aid;
1714 ether_addr_copy(arvif->bssid, bss_conf->bssid);
1716 ret = ath11k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid);
1718 ath11k_warn(ar->ab, "failed to set vdev %d up: %d\n",
1719 arvif->vdev_id, ret);
1723 arvif->is_up = true;
1725 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
1726 "mac vdev %d up (associated) bssid %pM aid %d\n",
1727 arvif->vdev_id, bss_conf->bssid, bss_conf->aid);
1729 /* Authorize BSS Peer */
1730 ret = ath11k_wmi_set_peer_param(ar, arvif->bssid,
1735 ath11k_warn(ar->ab, "Unable to authorize BSS peer: %d\n", ret);
1737 ret = ath11k_wmi_send_obss_spr_cmd(ar, arvif->vdev_id,
1738 &bss_conf->he_obss_pd);
1740 ath11k_warn(ar->ab, "failed to set vdev %i OBSS PD parameters: %d\n",
1741 arvif->vdev_id, ret);
1744 static void ath11k_bss_disassoc(struct ieee80211_hw *hw,
1745 struct ieee80211_vif *vif)
1747 struct ath11k *ar = hw->priv;
1748 struct ath11k_vif *arvif = (void *)vif->drv_priv;
1751 lockdep_assert_held(&ar->conf_mutex);
1753 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac vdev %i disassoc bssid %pM\n",
1754 arvif->vdev_id, arvif->bssid);
1756 ret = ath11k_wmi_vdev_down(ar, arvif->vdev_id);
1758 ath11k_warn(ar->ab, "failed to down vdev %i: %d\n",
1759 arvif->vdev_id, ret);
1761 arvif->is_up = false;
1763 /* TODO: cancel connection_loss_work */
1766 static u32 ath11k_mac_get_rate_hw_value(int bitrate)
1773 if (ath11k_mac_bitrate_is_cck(bitrate))
1774 preamble = WMI_RATE_PREAMBLE_CCK;
1776 preamble = WMI_RATE_PREAMBLE_OFDM;
1778 for (i = 0; i < ARRAY_SIZE(ath11k_legacy_rates); i++) {
1779 if (ath11k_legacy_rates[i].bitrate != bitrate)
1782 hw_value = ath11k_legacy_rates[i].hw_value;
1783 rate = ATH11K_HW_RATE_CODE(hw_value, 0, preamble);
1791 static void ath11k_recalculate_mgmt_rate(struct ath11k *ar,
1792 struct ieee80211_vif *vif,
1793 struct cfg80211_chan_def *def)
1795 struct ath11k_vif *arvif = (void *)vif->drv_priv;
1796 const struct ieee80211_supported_band *sband;
1803 lockdep_assert_held(&ar->conf_mutex);
1805 sband = ar->hw->wiphy->bands[def->chan->band];
1806 basic_rate_idx = ffs(vif->bss_conf.basic_rates) - 1;
1807 bitrate = sband->bitrates[basic_rate_idx].bitrate;
1809 hw_rate_code = ath11k_mac_get_rate_hw_value(bitrate);
1810 if (hw_rate_code < 0) {
1811 ath11k_warn(ar->ab, "bitrate not supported %d\n", bitrate);
1815 vdev_param = WMI_VDEV_PARAM_MGMT_RATE;
1816 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param,
1819 ath11k_warn(ar->ab, "failed to set mgmt tx rate %d\n", ret);
1821 vdev_param = WMI_VDEV_PARAM_BEACON_RATE;
1822 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param,
1825 ath11k_warn(ar->ab, "failed to set beacon tx rate %d\n", ret);
1828 static int ath11k_mac_fils_discovery(struct ath11k_vif *arvif,
1829 struct ieee80211_bss_conf *info)
1831 struct ath11k *ar = arvif->ar;
1832 struct sk_buff *tmpl;
1835 bool unsol_bcast_probe_resp_enabled = false;
1837 if (info->fils_discovery.max_interval) {
1838 interval = info->fils_discovery.max_interval;
1840 tmpl = ieee80211_get_fils_discovery_tmpl(ar->hw, arvif->vif);
1842 ret = ath11k_wmi_fils_discovery_tmpl(ar, arvif->vdev_id,
1844 } else if (info->unsol_bcast_probe_resp_interval) {
1845 unsol_bcast_probe_resp_enabled = 1;
1846 interval = info->unsol_bcast_probe_resp_interval;
1848 tmpl = ieee80211_get_unsol_bcast_probe_resp_tmpl(ar->hw,
1851 ret = ath11k_wmi_probe_resp_tmpl(ar, arvif->vdev_id,
1853 } else { /* Disable */
1854 return ath11k_wmi_fils_discovery(ar, arvif->vdev_id, 0, false);
1859 "mac vdev %i failed to retrieve %s template\n",
1860 arvif->vdev_id, (unsol_bcast_probe_resp_enabled ?
1861 "unsolicited broadcast probe response" :
1868 ret = ath11k_wmi_fils_discovery(ar, arvif->vdev_id, interval,
1869 unsol_bcast_probe_resp_enabled);
1874 static void ath11k_mac_op_bss_info_changed(struct ieee80211_hw *hw,
1875 struct ieee80211_vif *vif,
1876 struct ieee80211_bss_conf *info,
1879 struct ath11k *ar = hw->priv;
1880 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
1881 struct cfg80211_chan_def def;
1882 u32 param_id, param_value;
1883 enum nl80211_band band;
1893 mutex_lock(&ar->conf_mutex);
1895 if (changed & BSS_CHANGED_BEACON_INT) {
1896 arvif->beacon_interval = info->beacon_int;
1898 param_id = WMI_VDEV_PARAM_BEACON_INTERVAL;
1899 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
1901 arvif->beacon_interval);
1903 ath11k_warn(ar->ab, "Failed to set beacon interval for VDEV: %d\n",
1906 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
1907 "Beacon interval: %d set for VDEV: %d\n",
1908 arvif->beacon_interval, arvif->vdev_id);
1911 if (changed & BSS_CHANGED_BEACON) {
1912 param_id = WMI_PDEV_PARAM_BEACON_TX_MODE;
1913 param_value = WMI_BEACON_STAGGERED_MODE;
1914 ret = ath11k_wmi_pdev_set_param(ar, param_id,
1915 param_value, ar->pdev->pdev_id);
1917 ath11k_warn(ar->ab, "Failed to set beacon mode for VDEV: %d\n",
1920 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
1921 "Set staggered beacon mode for VDEV: %d\n",
1924 ret = ath11k_mac_setup_bcn_tmpl(arvif);
1926 ath11k_warn(ar->ab, "failed to update bcn template: %d\n",
1930 if (changed & (BSS_CHANGED_BEACON_INFO | BSS_CHANGED_BEACON)) {
1931 arvif->dtim_period = info->dtim_period;
1933 param_id = WMI_VDEV_PARAM_DTIM_PERIOD;
1934 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
1936 arvif->dtim_period);
1939 ath11k_warn(ar->ab, "Failed to set dtim period for VDEV %d: %i\n",
1940 arvif->vdev_id, ret);
1942 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
1943 "DTIM period: %d set for VDEV: %d\n",
1944 arvif->dtim_period, arvif->vdev_id);
1947 if (changed & BSS_CHANGED_SSID &&
1948 vif->type == NL80211_IFTYPE_AP) {
1949 arvif->u.ap.ssid_len = info->ssid_len;
1951 memcpy(arvif->u.ap.ssid, info->ssid, info->ssid_len);
1952 arvif->u.ap.hidden_ssid = info->hidden_ssid;
1955 if (changed & BSS_CHANGED_BSSID && !is_zero_ether_addr(info->bssid))
1956 ether_addr_copy(arvif->bssid, info->bssid);
1958 if (changed & BSS_CHANGED_BEACON_ENABLED) {
1959 ath11k_control_beaconing(arvif, info);
1961 if (arvif->is_up && vif->bss_conf.he_support &&
1962 vif->bss_conf.he_oper.params) {
1963 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
1964 WMI_VDEV_PARAM_BA_MODE,
1965 WMI_BA_MODE_BUFFER_SIZE_256);
1968 "failed to set BA BUFFER SIZE 256 for vdev: %d\n",
1971 param_id = WMI_VDEV_PARAM_HEOPS_0_31;
1972 param_value = vif->bss_conf.he_oper.params;
1973 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
1974 param_id, param_value);
1975 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
1976 "he oper param: %x set for VDEV: %d\n",
1977 param_value, arvif->vdev_id);
1980 ath11k_warn(ar->ab, "Failed to set he oper params %x for VDEV %d: %i\n",
1981 param_value, arvif->vdev_id, ret);
1985 if (changed & BSS_CHANGED_ERP_CTS_PROT) {
1988 cts_prot = !!(info->use_cts_prot);
1989 param_id = WMI_VDEV_PARAM_PROTECTION_MODE;
1991 if (arvif->is_started) {
1992 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
1993 param_id, cts_prot);
1995 ath11k_warn(ar->ab, "Failed to set CTS prot for VDEV: %d\n",
1998 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "Set CTS prot: %d for VDEV: %d\n",
1999 cts_prot, arvif->vdev_id);
2001 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "defer protection mode setup, vdev is not ready yet\n");
2005 if (changed & BSS_CHANGED_ERP_SLOT) {
2008 if (info->use_short_slot)
2009 slottime = WMI_VDEV_SLOT_TIME_SHORT; /* 9us */
2012 slottime = WMI_VDEV_SLOT_TIME_LONG; /* 20us */
2014 param_id = WMI_VDEV_PARAM_SLOT_TIME;
2015 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
2016 param_id, slottime);
2018 ath11k_warn(ar->ab, "Failed to set erp slot for VDEV: %d\n",
2021 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
2022 "Set slottime: %d for VDEV: %d\n",
2023 slottime, arvif->vdev_id);
2026 if (changed & BSS_CHANGED_ERP_PREAMBLE) {
2029 if (info->use_short_preamble)
2030 preamble = WMI_VDEV_PREAMBLE_SHORT;
2032 preamble = WMI_VDEV_PREAMBLE_LONG;
2034 param_id = WMI_VDEV_PARAM_PREAMBLE;
2035 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
2036 param_id, preamble);
2038 ath11k_warn(ar->ab, "Failed to set preamble for VDEV: %d\n",
2041 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
2042 "Set preamble: %d for VDEV: %d\n",
2043 preamble, arvif->vdev_id);
2046 if (changed & BSS_CHANGED_ASSOC) {
2048 ath11k_bss_assoc(hw, vif, info);
2050 ath11k_bss_disassoc(hw, vif);
2053 if (changed & BSS_CHANGED_TXPOWER) {
2054 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac vdev_id %i txpower %d\n",
2055 arvif->vdev_id, info->txpower);
2057 arvif->txpower = info->txpower;
2058 ath11k_mac_txpower_recalc(ar);
2061 if (changed & BSS_CHANGED_MCAST_RATE &&
2062 !ath11k_mac_vif_chan(arvif->vif, &def)) {
2063 band = def.chan->band;
2064 mcast_rate = vif->bss_conf.mcast_rate[band];
2067 rateidx = mcast_rate - 1;
2069 rateidx = ffs(vif->bss_conf.basic_rates) - 1;
2071 if (ar->pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP)
2072 rateidx += ATH11K_MAC_FIRST_OFDM_RATE_IDX;
2074 bitrate = ath11k_legacy_rates[rateidx].bitrate;
2075 hw_value = ath11k_legacy_rates[rateidx].hw_value;
2077 if (ath11k_mac_bitrate_is_cck(bitrate))
2078 preamble = WMI_RATE_PREAMBLE_CCK;
2080 preamble = WMI_RATE_PREAMBLE_OFDM;
2082 rate = ATH11K_HW_RATE_CODE(hw_value, 0, preamble);
2084 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
2085 "mac vdev %d mcast_rate %x\n",
2086 arvif->vdev_id, rate);
2088 vdev_param = WMI_VDEV_PARAM_MCAST_DATA_RATE;
2089 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
2093 "failed to set mcast rate on vdev %i: %d\n",
2094 arvif->vdev_id, ret);
2096 vdev_param = WMI_VDEV_PARAM_BCAST_DATA_RATE;
2097 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
2101 "failed to set bcast rate on vdev %i: %d\n",
2102 arvif->vdev_id, ret);
2105 if (changed & BSS_CHANGED_BASIC_RATES &&
2106 !ath11k_mac_vif_chan(arvif->vif, &def))
2107 ath11k_recalculate_mgmt_rate(ar, vif, &def);
2109 if (changed & BSS_CHANGED_TWT) {
2110 if (info->twt_requester || info->twt_responder)
2111 ath11k_wmi_send_twt_enable_cmd(ar, ar->pdev->pdev_id);
2113 ath11k_wmi_send_twt_disable_cmd(ar, ar->pdev->pdev_id);
2116 if (changed & BSS_CHANGED_HE_OBSS_PD)
2117 ath11k_wmi_send_obss_spr_cmd(ar, arvif->vdev_id,
2120 if (changed & BSS_CHANGED_HE_BSS_COLOR) {
2121 if (vif->type == NL80211_IFTYPE_AP) {
2122 ret = ath11k_wmi_send_obss_color_collision_cfg_cmd(
2123 ar, arvif->vdev_id, info->he_bss_color.color,
2124 ATH11K_BSS_COLOR_COLLISION_DETECTION_AP_PERIOD_MS,
2125 info->he_bss_color.enabled);
2127 ath11k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n",
2128 arvif->vdev_id, ret);
2129 } else if (vif->type == NL80211_IFTYPE_STATION) {
2130 ret = ath11k_wmi_send_bss_color_change_enable_cmd(ar,
2134 ath11k_warn(ar->ab, "failed to enable bss color change on vdev %i: %d\n",
2135 arvif->vdev_id, ret);
2136 ret = ath11k_wmi_send_obss_color_collision_cfg_cmd(
2137 ar, arvif->vdev_id, 0,
2138 ATH11K_BSS_COLOR_COLLISION_DETECTION_STA_PERIOD_MS, 1);
2140 ath11k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n",
2141 arvif->vdev_id, ret);
2145 if (changed & BSS_CHANGED_FILS_DISCOVERY ||
2146 changed & BSS_CHANGED_UNSOL_BCAST_PROBE_RESP)
2147 ath11k_mac_fils_discovery(arvif, info);
2149 mutex_unlock(&ar->conf_mutex);
2152 void __ath11k_mac_scan_finish(struct ath11k *ar)
2154 lockdep_assert_held(&ar->data_lock);
2156 switch (ar->scan.state) {
2157 case ATH11K_SCAN_IDLE:
2159 case ATH11K_SCAN_RUNNING:
2160 case ATH11K_SCAN_ABORTING:
2161 if (!ar->scan.is_roc) {
2162 struct cfg80211_scan_info info = {
2163 .aborted = (ar->scan.state ==
2164 ATH11K_SCAN_ABORTING),
2167 ieee80211_scan_completed(ar->hw, &info);
2168 } else if (ar->scan.roc_notify) {
2169 ieee80211_remain_on_channel_expired(ar->hw);
2172 case ATH11K_SCAN_STARTING:
2173 ar->scan.state = ATH11K_SCAN_IDLE;
2174 ar->scan_channel = NULL;
2175 ar->scan.roc_freq = 0;
2176 cancel_delayed_work(&ar->scan.timeout);
2177 complete(&ar->scan.completed);
2182 void ath11k_mac_scan_finish(struct ath11k *ar)
2184 spin_lock_bh(&ar->data_lock);
2185 __ath11k_mac_scan_finish(ar);
2186 spin_unlock_bh(&ar->data_lock);
2189 static int ath11k_scan_stop(struct ath11k *ar)
2191 struct scan_cancel_param arg = {
2192 .req_type = WLAN_SCAN_CANCEL_SINGLE,
2193 .scan_id = ATH11K_SCAN_ID,
2197 lockdep_assert_held(&ar->conf_mutex);
2199 /* TODO: Fill other STOP Params */
2200 arg.pdev_id = ar->pdev->pdev_id;
2202 ret = ath11k_wmi_send_scan_stop_cmd(ar, &arg);
2204 ath11k_warn(ar->ab, "failed to stop wmi scan: %d\n", ret);
2208 ret = wait_for_completion_timeout(&ar->scan.completed, 3 * HZ);
2211 "failed to receive scan abort comple: timed out\n");
2213 } else if (ret > 0) {
2218 /* Scan state should be updated upon scan completion but in case
2219 * firmware fails to deliver the event (for whatever reason) it is
2220 * desired to clean up scan state anyway. Firmware may have just
2221 * dropped the scan completion event delivery due to transport pipe
2222 * being overflown with data and/or it can recover on its own before
2223 * next scan request is submitted.
2225 spin_lock_bh(&ar->data_lock);
2226 if (ar->scan.state != ATH11K_SCAN_IDLE)
2227 __ath11k_mac_scan_finish(ar);
2228 spin_unlock_bh(&ar->data_lock);
2233 static void ath11k_scan_abort(struct ath11k *ar)
2237 lockdep_assert_held(&ar->conf_mutex);
2239 spin_lock_bh(&ar->data_lock);
2241 switch (ar->scan.state) {
2242 case ATH11K_SCAN_IDLE:
2243 /* This can happen if timeout worker kicked in and called
2244 * abortion while scan completion was being processed.
2247 case ATH11K_SCAN_STARTING:
2248 case ATH11K_SCAN_ABORTING:
2249 ath11k_warn(ar->ab, "refusing scan abortion due to invalid scan state: %d\n",
2252 case ATH11K_SCAN_RUNNING:
2253 ar->scan.state = ATH11K_SCAN_ABORTING;
2254 spin_unlock_bh(&ar->data_lock);
2256 ret = ath11k_scan_stop(ar);
2258 ath11k_warn(ar->ab, "failed to abort scan: %d\n", ret);
2260 spin_lock_bh(&ar->data_lock);
2264 spin_unlock_bh(&ar->data_lock);
2267 static void ath11k_scan_timeout_work(struct work_struct *work)
2269 struct ath11k *ar = container_of(work, struct ath11k,
2272 mutex_lock(&ar->conf_mutex);
2273 ath11k_scan_abort(ar);
2274 mutex_unlock(&ar->conf_mutex);
2277 static int ath11k_start_scan(struct ath11k *ar,
2278 struct scan_req_params *arg)
2282 lockdep_assert_held(&ar->conf_mutex);
2284 if (ath11k_spectral_get_mode(ar) == ATH11K_SPECTRAL_BACKGROUND)
2285 ath11k_spectral_reset_buffer(ar);
2287 ret = ath11k_wmi_send_scan_start_cmd(ar, arg);
2291 ret = wait_for_completion_timeout(&ar->scan.started, 1 * HZ);
2293 ret = ath11k_scan_stop(ar);
2295 ath11k_warn(ar->ab, "failed to stop scan: %d\n", ret);
2300 /* If we failed to start the scan, return error code at
2301 * this point. This is probably due to some issue in the
2302 * firmware, but no need to wedge the driver due to that...
2304 spin_lock_bh(&ar->data_lock);
2305 if (ar->scan.state == ATH11K_SCAN_IDLE) {
2306 spin_unlock_bh(&ar->data_lock);
2309 spin_unlock_bh(&ar->data_lock);
2314 static int ath11k_mac_op_hw_scan(struct ieee80211_hw *hw,
2315 struct ieee80211_vif *vif,
2316 struct ieee80211_scan_request *hw_req)
2318 struct ath11k *ar = hw->priv;
2319 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
2320 struct cfg80211_scan_request *req = &hw_req->req;
2321 struct scan_req_params arg;
2325 mutex_lock(&ar->conf_mutex);
2327 spin_lock_bh(&ar->data_lock);
2328 switch (ar->scan.state) {
2329 case ATH11K_SCAN_IDLE:
2330 reinit_completion(&ar->scan.started);
2331 reinit_completion(&ar->scan.completed);
2332 ar->scan.state = ATH11K_SCAN_STARTING;
2333 ar->scan.is_roc = false;
2334 ar->scan.vdev_id = arvif->vdev_id;
2337 case ATH11K_SCAN_STARTING:
2338 case ATH11K_SCAN_RUNNING:
2339 case ATH11K_SCAN_ABORTING:
2343 spin_unlock_bh(&ar->data_lock);
2348 memset(&arg, 0, sizeof(arg));
2349 ath11k_wmi_start_scan_init(ar, &arg);
2350 arg.vdev_id = arvif->vdev_id;
2351 arg.scan_id = ATH11K_SCAN_ID;
2354 arg.extraie.len = req->ie_len;
2355 arg.extraie.ptr = kzalloc(req->ie_len, GFP_KERNEL);
2356 memcpy(arg.extraie.ptr, req->ie, req->ie_len);
2360 arg.num_ssids = req->n_ssids;
2361 for (i = 0; i < arg.num_ssids; i++) {
2362 arg.ssid[i].length = req->ssids[i].ssid_len;
2363 memcpy(&arg.ssid[i].ssid, req->ssids[i].ssid,
2364 req->ssids[i].ssid_len);
2367 arg.scan_flags |= WMI_SCAN_FLAG_PASSIVE;
2370 if (req->n_channels) {
2371 arg.num_chan = req->n_channels;
2372 for (i = 0; i < arg.num_chan; i++)
2373 arg.chan_list[i] = req->channels[i]->center_freq;
2376 ret = ath11k_start_scan(ar, &arg);
2378 ath11k_warn(ar->ab, "failed to start hw scan: %d\n", ret);
2379 spin_lock_bh(&ar->data_lock);
2380 ar->scan.state = ATH11K_SCAN_IDLE;
2381 spin_unlock_bh(&ar->data_lock);
2384 /* Add a 200ms margin to account for event/command processing */
2385 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
2386 msecs_to_jiffies(arg.max_scan_time +
2387 ATH11K_MAC_SCAN_TIMEOUT_MSECS));
2391 kfree(arg.extraie.ptr);
2393 mutex_unlock(&ar->conf_mutex);
2397 static void ath11k_mac_op_cancel_hw_scan(struct ieee80211_hw *hw,
2398 struct ieee80211_vif *vif)
2400 struct ath11k *ar = hw->priv;
2402 mutex_lock(&ar->conf_mutex);
2403 ath11k_scan_abort(ar);
2404 mutex_unlock(&ar->conf_mutex);
2406 cancel_delayed_work_sync(&ar->scan.timeout);
2409 static int ath11k_install_key(struct ath11k_vif *arvif,
2410 struct ieee80211_key_conf *key,
2411 enum set_key_cmd cmd,
2412 const u8 *macaddr, u32 flags)
2415 struct ath11k *ar = arvif->ar;
2416 struct wmi_vdev_install_key_arg arg = {
2417 .vdev_id = arvif->vdev_id,
2418 .key_idx = key->keyidx,
2419 .key_len = key->keylen,
2420 .key_data = key->key,
2425 lockdep_assert_held(&arvif->ar->conf_mutex);
2427 reinit_completion(&ar->install_key_done);
2429 if (test_bit(ATH11K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags))
2432 if (cmd == DISABLE_KEY) {
2433 /* TODO: Check if FW expects value other than NONE for del */
2434 /* arg.key_cipher = WMI_CIPHER_NONE; */
2436 arg.key_data = NULL;
2440 switch (key->cipher) {
2441 case WLAN_CIPHER_SUITE_CCMP:
2442 arg.key_cipher = WMI_CIPHER_AES_CCM;
2443 /* TODO: Re-check if flag is valid */
2444 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT;
2446 case WLAN_CIPHER_SUITE_TKIP:
2447 arg.key_cipher = WMI_CIPHER_TKIP;
2448 arg.key_txmic_len = 8;
2449 arg.key_rxmic_len = 8;
2451 case WLAN_CIPHER_SUITE_CCMP_256:
2452 arg.key_cipher = WMI_CIPHER_AES_CCM;
2454 case WLAN_CIPHER_SUITE_GCMP:
2455 case WLAN_CIPHER_SUITE_GCMP_256:
2456 arg.key_cipher = WMI_CIPHER_AES_GCM;
2459 ath11k_warn(ar->ab, "cipher %d is not supported\n", key->cipher);
2463 if (test_bit(ATH11K_FLAG_RAW_MODE, &ar->ab->dev_flags))
2464 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV |
2465 IEEE80211_KEY_FLAG_RESERVE_TAILROOM;
2468 ret = ath11k_wmi_vdev_install_key(arvif->ar, &arg);
2473 if (!wait_for_completion_timeout(&ar->install_key_done, 1 * HZ))
2476 return ar->install_key_status ? -EINVAL : 0;
2479 static int ath11k_clear_peer_keys(struct ath11k_vif *arvif,
2482 struct ath11k *ar = arvif->ar;
2483 struct ath11k_base *ab = ar->ab;
2484 struct ath11k_peer *peer;
2485 int first_errno = 0;
2490 lockdep_assert_held(&ar->conf_mutex);
2492 spin_lock_bh(&ab->base_lock);
2493 peer = ath11k_peer_find(ab, arvif->vdev_id, addr);
2494 spin_unlock_bh(&ab->base_lock);
2499 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
2503 /* key flags are not required to delete the key */
2504 ret = ath11k_install_key(arvif, peer->keys[i],
2505 DISABLE_KEY, addr, flags);
2506 if (ret < 0 && first_errno == 0)
2510 ath11k_warn(ab, "failed to remove peer key %d: %d\n",
2513 spin_lock_bh(&ab->base_lock);
2514 peer->keys[i] = NULL;
2515 spin_unlock_bh(&ab->base_lock);
2521 static int ath11k_mac_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
2522 struct ieee80211_vif *vif, struct ieee80211_sta *sta,
2523 struct ieee80211_key_conf *key)
2525 struct ath11k *ar = hw->priv;
2526 struct ath11k_base *ab = ar->ab;
2527 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
2528 struct ath11k_peer *peer;
2529 struct ath11k_sta *arsta;
2530 const u8 *peer_addr;
2534 /* BIP needs to be done in software */
2535 if (key->cipher == WLAN_CIPHER_SUITE_AES_CMAC ||
2536 key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_128 ||
2537 key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_256 ||
2538 key->cipher == WLAN_CIPHER_SUITE_BIP_CMAC_256)
2541 if (test_bit(ATH11K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags))
2544 if (key->keyidx > WMI_MAX_KEY_INDEX)
2547 mutex_lock(&ar->conf_mutex);
2550 peer_addr = sta->addr;
2551 else if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
2552 peer_addr = vif->bss_conf.bssid;
2554 peer_addr = vif->addr;
2556 key->hw_key_idx = key->keyidx;
2558 /* the peer should not disappear in mid-way (unless FW goes awry) since
2559 * we already hold conf_mutex. we just make sure its there now.
2561 spin_lock_bh(&ab->base_lock);
2562 peer = ath11k_peer_find(ab, arvif->vdev_id, peer_addr);
2563 spin_unlock_bh(&ab->base_lock);
2566 if (cmd == SET_KEY) {
2567 ath11k_warn(ab, "cannot install key for non-existent peer %pM\n",
2572 /* if the peer doesn't exist there is no key to disable
2579 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
2580 flags |= WMI_KEY_PAIRWISE;
2582 flags |= WMI_KEY_GROUP;
2584 ret = ath11k_install_key(arvif, key, cmd, peer_addr, flags);
2586 ath11k_warn(ab, "ath11k_install_key failed (%d)\n", ret);
2590 ret = ath11k_dp_peer_rx_pn_replay_config(arvif, peer_addr, cmd, key);
2592 ath11k_warn(ab, "failed to offload PN replay detection %d\n", ret);
2596 spin_lock_bh(&ab->base_lock);
2597 peer = ath11k_peer_find(ab, arvif->vdev_id, peer_addr);
2598 if (peer && cmd == SET_KEY) {
2599 peer->keys[key->keyidx] = key;
2600 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) {
2601 peer->ucast_keyidx = key->keyidx;
2602 peer->sec_type = ath11k_dp_tx_get_encrypt_type(key->cipher);
2604 peer->mcast_keyidx = key->keyidx;
2605 peer->sec_type_grp = ath11k_dp_tx_get_encrypt_type(key->cipher);
2607 } else if (peer && cmd == DISABLE_KEY) {
2608 peer->keys[key->keyidx] = NULL;
2609 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
2610 peer->ucast_keyidx = 0;
2612 peer->mcast_keyidx = 0;
2614 /* impossible unless FW goes crazy */
2615 ath11k_warn(ab, "peer %pM disappeared!\n", peer_addr);
2618 arsta = (struct ath11k_sta *)sta->drv_priv;
2620 switch (key->cipher) {
2621 case WLAN_CIPHER_SUITE_TKIP:
2622 case WLAN_CIPHER_SUITE_CCMP:
2623 case WLAN_CIPHER_SUITE_CCMP_256:
2624 case WLAN_CIPHER_SUITE_GCMP:
2625 case WLAN_CIPHER_SUITE_GCMP_256:
2627 arsta->pn_type = HAL_PN_TYPE_WPA;
2629 arsta->pn_type = HAL_PN_TYPE_NONE;
2632 arsta->pn_type = HAL_PN_TYPE_NONE;
2637 spin_unlock_bh(&ab->base_lock);
2640 mutex_unlock(&ar->conf_mutex);
2645 ath11k_mac_bitrate_mask_num_vht_rates(struct ath11k *ar,
2646 enum nl80211_band band,
2647 const struct cfg80211_bitrate_mask *mask)
2652 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++)
2653 num_rates += hweight16(mask->control[band].vht_mcs[i]);
2659 ath11k_mac_set_peer_vht_fixed_rate(struct ath11k_vif *arvif,
2660 struct ieee80211_sta *sta,
2661 const struct cfg80211_bitrate_mask *mask,
2662 enum nl80211_band band)
2664 struct ath11k *ar = arvif->ar;
2669 lockdep_assert_held(&ar->conf_mutex);
2673 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
2674 if (hweight16(mask->control[band].vht_mcs[i]) == 1) {
2676 vht_rate = ffs(mask->control[band].vht_mcs[i]) - 1;
2681 ath11k_warn(ar->ab, "No single VHT Fixed rate found to set for %pM",
2686 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
2687 "Setting Fixed VHT Rate for peer %pM. Device will not switch to any other selected rates",
2690 rate_code = ATH11K_HW_RATE_CODE(vht_rate, nss - 1,
2691 WMI_RATE_PREAMBLE_VHT);
2692 ret = ath11k_wmi_set_peer_param(ar, sta->addr,
2694 WMI_PEER_PARAM_FIXED_RATE,
2698 "failed to update STA %pM Fixed Rate %d: %d\n",
2699 sta->addr, rate_code, ret);
2704 static int ath11k_station_assoc(struct ath11k *ar,
2705 struct ieee80211_vif *vif,
2706 struct ieee80211_sta *sta,
2709 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
2710 struct peer_assoc_params peer_arg;
2712 struct cfg80211_chan_def def;
2713 enum nl80211_band band;
2714 struct cfg80211_bitrate_mask *mask;
2717 lockdep_assert_held(&ar->conf_mutex);
2719 if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
2722 band = def.chan->band;
2723 mask = &arvif->bitrate_mask;
2725 ath11k_peer_assoc_prepare(ar, vif, sta, &peer_arg, reassoc);
2727 ret = ath11k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
2729 ath11k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n",
2730 sta->addr, arvif->vdev_id, ret);
2734 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) {
2735 ath11k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
2736 sta->addr, arvif->vdev_id);
2740 num_vht_rates = ath11k_mac_bitrate_mask_num_vht_rates(ar, band, mask);
2742 /* If single VHT rate is configured (by set_bitrate_mask()),
2743 * peer_assoc will disable VHT. This is now enabled by a peer specific
2745 * Note that all other rates and NSS will be disabled for this peer.
2747 if (sta->vht_cap.vht_supported && num_vht_rates == 1) {
2748 ret = ath11k_mac_set_peer_vht_fixed_rate(arvif, sta, mask,
2754 /* Re-assoc is run only to update supported rates for given station. It
2755 * doesn't make much sense to reconfigure the peer completely.
2760 ret = ath11k_setup_peer_smps(ar, arvif, sta->addr,
2763 ath11k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n",
2764 arvif->vdev_id, ret);
2769 arvif->num_legacy_stations++;
2770 ret = ath11k_recalc_rtscts_prot(arvif);
2775 if (sta->wme && sta->uapsd_queues) {
2776 ret = ath11k_peer_assoc_qos_ap(ar, arvif, sta);
2778 ath11k_warn(ar->ab, "failed to set qos params for STA %pM for vdev %i: %d\n",
2779 sta->addr, arvif->vdev_id, ret);
2787 static int ath11k_station_disassoc(struct ath11k *ar,
2788 struct ieee80211_vif *vif,
2789 struct ieee80211_sta *sta)
2791 struct ath11k_vif *arvif = (void *)vif->drv_priv;
2794 lockdep_assert_held(&ar->conf_mutex);
2797 arvif->num_legacy_stations--;
2798 ret = ath11k_recalc_rtscts_prot(arvif);
2803 ret = ath11k_clear_peer_keys(arvif, sta->addr);
2805 ath11k_warn(ar->ab, "failed to clear all peer keys for vdev %i: %d\n",
2806 arvif->vdev_id, ret);
2812 static void ath11k_sta_rc_update_wk(struct work_struct *wk)
2815 struct ath11k_vif *arvif;
2816 struct ath11k_sta *arsta;
2817 struct ieee80211_sta *sta;
2818 struct cfg80211_chan_def def;
2819 enum nl80211_band band;
2820 const u8 *ht_mcs_mask;
2821 const u16 *vht_mcs_mask;
2822 u32 changed, bw, nss, smps;
2823 int err, num_vht_rates;
2824 const struct cfg80211_bitrate_mask *mask;
2825 struct peer_assoc_params peer_arg;
2827 arsta = container_of(wk, struct ath11k_sta, update_wk);
2828 sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv);
2829 arvif = arsta->arvif;
2832 if (WARN_ON(ath11k_mac_vif_chan(arvif->vif, &def)))
2835 band = def.chan->band;
2836 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
2837 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2839 spin_lock_bh(&ar->data_lock);
2841 changed = arsta->changed;
2848 spin_unlock_bh(&ar->data_lock);
2850 mutex_lock(&ar->conf_mutex);
2852 nss = max_t(u32, 1, nss);
2853 nss = min(nss, max(ath11k_mac_max_ht_nss(ht_mcs_mask),
2854 ath11k_mac_max_vht_nss(vht_mcs_mask)));
2856 if (changed & IEEE80211_RC_BW_CHANGED) {
2857 err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
2858 WMI_PEER_CHWIDTH, bw);
2860 ath11k_warn(ar->ab, "failed to update STA %pM peer bw %d: %d\n",
2861 sta->addr, bw, err);
2864 if (changed & IEEE80211_RC_NSS_CHANGED) {
2865 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac update sta %pM nss %d\n",
2868 err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
2871 ath11k_warn(ar->ab, "failed to update STA %pM nss %d: %d\n",
2872 sta->addr, nss, err);
2875 if (changed & IEEE80211_RC_SMPS_CHANGED) {
2876 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac update sta %pM smps %d\n",
2879 err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
2880 WMI_PEER_MIMO_PS_STATE, smps);
2882 ath11k_warn(ar->ab, "failed to update STA %pM smps %d: %d\n",
2883 sta->addr, smps, err);
2886 if (changed & IEEE80211_RC_SUPP_RATES_CHANGED) {
2887 mask = &arvif->bitrate_mask;
2888 num_vht_rates = ath11k_mac_bitrate_mask_num_vht_rates(ar, band,
2891 /* Peer_assoc_prepare will reject vht rates in
2892 * bitrate_mask if its not available in range format and
2893 * sets vht tx_rateset as unsupported. So multiple VHT MCS
2894 * setting(eg. MCS 4,5,6) per peer is not supported here.
2895 * But, Single rate in VHT mask can be set as per-peer
2896 * fixed rate. But even if any HT rates are configured in
2897 * the bitrate mask, device will not switch to those rates
2898 * when per-peer Fixed rate is set.
2899 * TODO: Check RATEMASK_CMDID to support auto rates selection
2900 * across HT/VHT and for multiple VHT MCS support.
2902 if (sta->vht_cap.vht_supported && num_vht_rates == 1) {
2903 ath11k_mac_set_peer_vht_fixed_rate(arvif, sta, mask,
2906 /* If the peer is non-VHT or no fixed VHT rate
2907 * is provided in the new bitrate mask we set the
2908 * other rates using peer_assoc command.
2910 ath11k_peer_assoc_prepare(ar, arvif->vif, sta,
2913 err = ath11k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
2915 ath11k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n",
2916 sta->addr, arvif->vdev_id, err);
2918 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ))
2919 ath11k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
2920 sta->addr, arvif->vdev_id);
2924 mutex_unlock(&ar->conf_mutex);
2927 static int ath11k_mac_inc_num_stations(struct ath11k_vif *arvif,
2928 struct ieee80211_sta *sta)
2930 struct ath11k *ar = arvif->ar;
2932 lockdep_assert_held(&ar->conf_mutex);
2934 if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
2937 if (ar->num_stations >= ar->max_num_stations)
2945 static void ath11k_mac_dec_num_stations(struct ath11k_vif *arvif,
2946 struct ieee80211_sta *sta)
2948 struct ath11k *ar = arvif->ar;
2950 lockdep_assert_held(&ar->conf_mutex);
2952 if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
2958 static int ath11k_mac_station_add(struct ath11k *ar,
2959 struct ieee80211_vif *vif,
2960 struct ieee80211_sta *sta)
2962 struct ath11k_base *ab = ar->ab;
2963 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
2964 struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
2965 struct peer_create_params peer_param;
2968 lockdep_assert_held(&ar->conf_mutex);
2970 ret = ath11k_mac_inc_num_stations(arvif, sta);
2972 ath11k_warn(ab, "refusing to associate station: too many connected already (%d)\n",
2973 ar->max_num_stations);
2977 arsta->rx_stats = kzalloc(sizeof(*arsta->rx_stats), GFP_KERNEL);
2978 if (!arsta->rx_stats) {
2980 goto dec_num_station;
2983 peer_param.vdev_id = arvif->vdev_id;
2984 peer_param.peer_addr = sta->addr;
2985 peer_param.peer_type = WMI_PEER_TYPE_DEFAULT;
2987 ret = ath11k_peer_create(ar, arvif, sta, &peer_param);
2989 ath11k_warn(ab, "Failed to add peer: %pM for VDEV: %d\n",
2990 sta->addr, arvif->vdev_id);
2994 ath11k_dbg(ab, ATH11K_DBG_MAC, "Added peer: %pM for VDEV: %d\n",
2995 sta->addr, arvif->vdev_id);
2997 if (ath11k_debugfs_is_extd_tx_stats_enabled(ar)) {
2998 arsta->tx_stats = kzalloc(sizeof(*arsta->tx_stats), GFP_KERNEL);
2999 if (!arsta->tx_stats) {
3005 if (ieee80211_vif_is_mesh(vif)) {
3006 ret = ath11k_wmi_set_peer_param(ar, sta->addr,
3008 WMI_PEER_USE_4ADDR, 1);
3010 ath11k_warn(ab, "failed to STA %pM 4addr capability: %d\n",
3016 ret = ath11k_dp_peer_setup(ar, arvif->vdev_id, sta->addr);
3018 ath11k_warn(ab, "failed to setup dp for peer %pM on vdev %i (%d)\n",
3019 sta->addr, arvif->vdev_id, ret);
3023 if (ab->hw_params.vdev_start_delay &&
3024 arvif->vdev_type != WMI_VDEV_TYPE_AP) {
3025 ret = ath11k_start_vdev_delay(ar->hw, vif);
3027 ath11k_warn(ab, "failed to delay vdev start: %d\n", ret);
3035 kfree(arsta->tx_stats);
3036 arsta->tx_stats = NULL;
3038 ath11k_peer_delete(ar, arvif->vdev_id, sta->addr);
3040 kfree(arsta->rx_stats);
3041 arsta->rx_stats = NULL;
3043 ath11k_mac_dec_num_stations(arvif, sta);
3048 static int ath11k_mac_op_sta_state(struct ieee80211_hw *hw,
3049 struct ieee80211_vif *vif,
3050 struct ieee80211_sta *sta,
3051 enum ieee80211_sta_state old_state,
3052 enum ieee80211_sta_state new_state)
3054 struct ath11k *ar = hw->priv;
3055 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
3056 struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
3057 struct ath11k_peer *peer;
3060 /* cancel must be done outside the mutex to avoid deadlock */
3061 if ((old_state == IEEE80211_STA_NONE &&
3062 new_state == IEEE80211_STA_NOTEXIST))
3063 cancel_work_sync(&arsta->update_wk);
3065 mutex_lock(&ar->conf_mutex);
3067 if (old_state == IEEE80211_STA_NOTEXIST &&
3068 new_state == IEEE80211_STA_NONE) {
3069 memset(arsta, 0, sizeof(*arsta));
3070 arsta->arvif = arvif;
3071 INIT_WORK(&arsta->update_wk, ath11k_sta_rc_update_wk);
3073 ret = ath11k_mac_station_add(ar, vif, sta);
3075 ath11k_warn(ar->ab, "Failed to add station: %pM for VDEV: %d\n",
3076 sta->addr, arvif->vdev_id);
3077 } else if ((old_state == IEEE80211_STA_NONE &&
3078 new_state == IEEE80211_STA_NOTEXIST)) {
3079 ath11k_dp_peer_cleanup(ar, arvif->vdev_id, sta->addr);
3081 ret = ath11k_peer_delete(ar, arvif->vdev_id, sta->addr);
3083 ath11k_warn(ar->ab, "Failed to delete peer: %pM for VDEV: %d\n",
3084 sta->addr, arvif->vdev_id);
3086 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "Removed peer: %pM for VDEV: %d\n",
3087 sta->addr, arvif->vdev_id);
3089 ath11k_mac_dec_num_stations(arvif, sta);
3090 spin_lock_bh(&ar->ab->base_lock);
3091 peer = ath11k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
3092 if (peer && peer->sta == sta) {
3093 ath11k_warn(ar->ab, "Found peer entry %pM n vdev %i after it was supposedly removed\n",
3094 vif->addr, arvif->vdev_id);
3096 list_del(&peer->list);
3100 spin_unlock_bh(&ar->ab->base_lock);
3102 kfree(arsta->tx_stats);
3103 arsta->tx_stats = NULL;
3105 kfree(arsta->rx_stats);
3106 arsta->rx_stats = NULL;
3107 } else if (old_state == IEEE80211_STA_AUTH &&
3108 new_state == IEEE80211_STA_ASSOC &&
3109 (vif->type == NL80211_IFTYPE_AP ||
3110 vif->type == NL80211_IFTYPE_MESH_POINT ||
3111 vif->type == NL80211_IFTYPE_ADHOC)) {
3112 ret = ath11k_station_assoc(ar, vif, sta, false);
3114 ath11k_warn(ar->ab, "Failed to associate station: %pM\n",
3116 } else if (old_state == IEEE80211_STA_ASSOC &&
3117 new_state == IEEE80211_STA_AUTH &&
3118 (vif->type == NL80211_IFTYPE_AP ||
3119 vif->type == NL80211_IFTYPE_MESH_POINT ||
3120 vif->type == NL80211_IFTYPE_ADHOC)) {
3121 ret = ath11k_station_disassoc(ar, vif, sta);
3123 ath11k_warn(ar->ab, "Failed to disassociate station: %pM\n",
3127 mutex_unlock(&ar->conf_mutex);
3131 static int ath11k_mac_op_sta_set_txpwr(struct ieee80211_hw *hw,
3132 struct ieee80211_vif *vif,
3133 struct ieee80211_sta *sta)
3135 struct ath11k *ar = hw->priv;
3136 struct ath11k_vif *arvif = (void *)vif->drv_priv;
3140 if (sta->txpwr.type == NL80211_TX_POWER_AUTOMATIC) {
3143 txpwr = sta->txpwr.power;
3148 if (txpwr > ATH11K_TX_POWER_MAX_VAL || txpwr < ATH11K_TX_POWER_MIN_VAL)
3151 mutex_lock(&ar->conf_mutex);
3153 ret = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
3154 WMI_PEER_USE_FIXED_PWR, txpwr);
3156 ath11k_warn(ar->ab, "failed to set tx power for station ret: %d\n",
3162 mutex_unlock(&ar->conf_mutex);
3166 static void ath11k_mac_op_sta_rc_update(struct ieee80211_hw *hw,
3167 struct ieee80211_vif *vif,
3168 struct ieee80211_sta *sta,
3171 struct ath11k *ar = hw->priv;
3172 struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
3173 struct ath11k_vif *arvif = (void *)vif->drv_priv;
3174 struct ath11k_peer *peer;
3177 spin_lock_bh(&ar->ab->base_lock);
3179 peer = ath11k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
3181 spin_unlock_bh(&ar->ab->base_lock);
3182 ath11k_warn(ar->ab, "mac sta rc update failed to find peer %pM on vdev %i\n",
3183 sta->addr, arvif->vdev_id);
3187 spin_unlock_bh(&ar->ab->base_lock);
3189 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3190 "mac sta rc update for %pM changed %08x bw %d nss %d smps %d\n",
3191 sta->addr, changed, sta->bandwidth, sta->rx_nss,
3194 spin_lock_bh(&ar->data_lock);
3196 if (changed & IEEE80211_RC_BW_CHANGED) {
3197 bw = WMI_PEER_CHWIDTH_20MHZ;
3199 switch (sta->bandwidth) {
3200 case IEEE80211_STA_RX_BW_20:
3201 bw = WMI_PEER_CHWIDTH_20MHZ;
3203 case IEEE80211_STA_RX_BW_40:
3204 bw = WMI_PEER_CHWIDTH_40MHZ;
3206 case IEEE80211_STA_RX_BW_80:
3207 bw = WMI_PEER_CHWIDTH_80MHZ;
3209 case IEEE80211_STA_RX_BW_160:
3210 bw = WMI_PEER_CHWIDTH_160MHZ;
3213 ath11k_warn(ar->ab, "Invalid bandwidth %d in rc update for %pM\n",
3214 sta->bandwidth, sta->addr);
3215 bw = WMI_PEER_CHWIDTH_20MHZ;
3222 if (changed & IEEE80211_RC_NSS_CHANGED)
3223 arsta->nss = sta->rx_nss;
3225 if (changed & IEEE80211_RC_SMPS_CHANGED) {
3226 smps = WMI_PEER_SMPS_PS_NONE;
3228 switch (sta->smps_mode) {
3229 case IEEE80211_SMPS_AUTOMATIC:
3230 case IEEE80211_SMPS_OFF:
3231 smps = WMI_PEER_SMPS_PS_NONE;
3233 case IEEE80211_SMPS_STATIC:
3234 smps = WMI_PEER_SMPS_STATIC;
3236 case IEEE80211_SMPS_DYNAMIC:
3237 smps = WMI_PEER_SMPS_DYNAMIC;
3240 ath11k_warn(ar->ab, "Invalid smps %d in sta rc update for %pM\n",
3241 sta->smps_mode, sta->addr);
3242 smps = WMI_PEER_SMPS_PS_NONE;
3249 arsta->changed |= changed;
3251 spin_unlock_bh(&ar->data_lock);
3253 ieee80211_queue_work(hw, &arsta->update_wk);
3256 static int ath11k_conf_tx_uapsd(struct ath11k *ar, struct ieee80211_vif *vif,
3257 u16 ac, bool enable)
3259 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
3263 if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
3267 case IEEE80211_AC_VO:
3268 value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN |
3269 WMI_STA_PS_UAPSD_AC3_TRIGGER_EN;
3271 case IEEE80211_AC_VI:
3272 value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN |
3273 WMI_STA_PS_UAPSD_AC2_TRIGGER_EN;
3275 case IEEE80211_AC_BE:
3276 value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN |
3277 WMI_STA_PS_UAPSD_AC1_TRIGGER_EN;
3279 case IEEE80211_AC_BK:
3280 value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN |
3281 WMI_STA_PS_UAPSD_AC0_TRIGGER_EN;
3286 arvif->u.sta.uapsd |= value;
3288 arvif->u.sta.uapsd &= ~value;
3290 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
3291 WMI_STA_PS_PARAM_UAPSD,
3292 arvif->u.sta.uapsd);
3294 ath11k_warn(ar->ab, "could not set uapsd params %d\n", ret);
3298 if (arvif->u.sta.uapsd)
3299 value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD;
3301 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
3303 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
3304 WMI_STA_PS_PARAM_RX_WAKE_POLICY,
3307 ath11k_warn(ar->ab, "could not set rx wake param %d\n", ret);
3313 static int ath11k_mac_op_conf_tx(struct ieee80211_hw *hw,
3314 struct ieee80211_vif *vif, u16 ac,
3315 const struct ieee80211_tx_queue_params *params)
3317 struct ath11k *ar = hw->priv;
3318 struct ath11k_vif *arvif = (void *)vif->drv_priv;
3319 struct wmi_wmm_params_arg *p = NULL;
3322 mutex_lock(&ar->conf_mutex);
3325 case IEEE80211_AC_VO:
3326 p = &arvif->wmm_params.ac_vo;
3328 case IEEE80211_AC_VI:
3329 p = &arvif->wmm_params.ac_vi;
3331 case IEEE80211_AC_BE:
3332 p = &arvif->wmm_params.ac_be;
3334 case IEEE80211_AC_BK:
3335 p = &arvif->wmm_params.ac_bk;
3344 p->cwmin = params->cw_min;
3345 p->cwmax = params->cw_max;
3346 p->aifs = params->aifs;
3347 p->txop = params->txop;
3349 ret = ath11k_wmi_send_wmm_update_cmd_tlv(ar, arvif->vdev_id,
3350 &arvif->wmm_params);
3352 ath11k_warn(ar->ab, "failed to set wmm params: %d\n", ret);
3356 ret = ath11k_conf_tx_uapsd(ar, vif, ac, params->uapsd);
3359 ath11k_warn(ar->ab, "failed to set sta uapsd: %d\n", ret);
3362 mutex_unlock(&ar->conf_mutex);
3366 static struct ieee80211_sta_ht_cap
3367 ath11k_create_ht_cap(struct ath11k *ar, u32 ar_ht_cap, u32 rate_cap_rx_chainmask)
3370 struct ieee80211_sta_ht_cap ht_cap = {0};
3371 u32 ar_vht_cap = ar->pdev->cap.vht_cap;
3373 if (!(ar_ht_cap & WMI_HT_CAP_ENABLED))
3376 ht_cap.ht_supported = 1;
3377 ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
3378 ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_NONE;
3379 ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
3380 ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
3381 ht_cap.cap |= WLAN_HT_CAP_SM_PS_STATIC << IEEE80211_HT_CAP_SM_PS_SHIFT;
3383 if (ar_ht_cap & WMI_HT_CAP_HT20_SGI)
3384 ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
3386 if (ar_ht_cap & WMI_HT_CAP_HT40_SGI)
3387 ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
3389 if (ar_ht_cap & WMI_HT_CAP_DYNAMIC_SMPS) {
3392 smps = WLAN_HT_CAP_SM_PS_DYNAMIC;
3393 smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT;
3398 if (ar_ht_cap & WMI_HT_CAP_TX_STBC)
3399 ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC;
3401 if (ar_ht_cap & WMI_HT_CAP_RX_STBC) {
3405 stbc &= WMI_HT_CAP_RX_STBC;
3406 stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT;
3407 stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT;
3408 stbc &= IEEE80211_HT_CAP_RX_STBC;
3413 if (ar_ht_cap & WMI_HT_CAP_RX_LDPC)
3414 ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
3416 if (ar_ht_cap & WMI_HT_CAP_L_SIG_TXOP_PROT)
3417 ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
3419 if (ar_vht_cap & WMI_VHT_CAP_MAX_MPDU_LEN_MASK)
3420 ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU;
3422 for (i = 0; i < ar->num_rx_chains; i++) {
3423 if (rate_cap_rx_chainmask & BIT(i))
3424 ht_cap.mcs.rx_mask[i] = 0xFF;
3427 ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
3432 static int ath11k_mac_set_txbf_conf(struct ath11k_vif *arvif)
3435 struct ath11k *ar = arvif->ar;
3438 u32 vht_cap = ar->pdev->cap.vht_cap;
3439 u32 vdev_param = WMI_VDEV_PARAM_TXBF;
3441 if (vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)) {
3442 nsts = vht_cap & IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
3443 nsts >>= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
3444 value |= SM(nsts, WMI_TXBF_STS_CAP_OFFSET);
3447 if (vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)) {
3448 sound_dim = vht_cap &
3449 IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
3450 sound_dim >>= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
3451 if (sound_dim > (ar->num_tx_chains - 1))
3452 sound_dim = ar->num_tx_chains - 1;
3453 value |= SM(sound_dim, WMI_BF_SOUND_DIM_OFFSET);
3459 if (vht_cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE) {
3460 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
3462 if ((vht_cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE) &&
3463 arvif->vdev_type == WMI_VDEV_TYPE_AP)
3464 value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFER;
3467 /* TODO: SUBFEE not validated in HK, disable here until validated? */
3469 if (vht_cap & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE) {
3470 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
3472 if ((vht_cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE) &&
3473 arvif->vdev_type == WMI_VDEV_TYPE_STA)
3474 value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFEE;
3477 return ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3481 static void ath11k_set_vht_txbf_cap(struct ath11k *ar, u32 *vht_cap)
3483 bool subfer, subfee;
3486 subfer = !!(*vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE));
3487 subfee = !!(*vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE));
3489 if (ar->num_tx_chains < 2) {
3490 *vht_cap &= ~(IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE);
3494 /* If SU Beaformer is not set, then disable MU Beamformer Capability */
3496 *vht_cap &= ~(IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE);
3498 /* If SU Beaformee is not set, then disable MU Beamformee Capability */
3500 *vht_cap &= ~(IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE);
3502 sound_dim = (*vht_cap & IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK);
3503 sound_dim >>= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
3504 *vht_cap &= ~IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
3506 /* TODO: Need to check invalid STS and Sound_dim values set by FW? */
3508 /* Enable Sounding Dimension Field only if SU BF is enabled */
3510 if (sound_dim > (ar->num_tx_chains - 1))
3511 sound_dim = ar->num_tx_chains - 1;
3513 sound_dim <<= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
3514 sound_dim &= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
3515 *vht_cap |= sound_dim;
3518 /* Use the STS advertised by FW unless SU Beamformee is not supported*/
3520 *vht_cap &= ~(IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK);
3523 static struct ieee80211_sta_vht_cap
3524 ath11k_create_vht_cap(struct ath11k *ar, u32 rate_cap_tx_chainmask,
3525 u32 rate_cap_rx_chainmask)
3527 struct ieee80211_sta_vht_cap vht_cap = {0};
3528 u16 txmcs_map, rxmcs_map;
3531 vht_cap.vht_supported = 1;
3532 vht_cap.cap = ar->pdev->cap.vht_cap;
3534 ath11k_set_vht_txbf_cap(ar, &vht_cap.cap);
3536 /* TODO: Enable back VHT160 mode once association issues are fixed */
3537 /* Disabling VHT160 and VHT80+80 modes */
3538 vht_cap.cap &= ~IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK;
3539 vht_cap.cap &= ~IEEE80211_VHT_CAP_SHORT_GI_160;
3543 for (i = 0; i < 8; i++) {
3544 if (i < ar->num_tx_chains && rate_cap_tx_chainmask & BIT(i))
3545 txmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
3547 txmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
3549 if (i < ar->num_rx_chains && rate_cap_rx_chainmask & BIT(i))
3550 rxmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
3552 rxmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
3555 if (rate_cap_tx_chainmask <= 1)
3556 vht_cap.cap &= ~IEEE80211_VHT_CAP_TXSTBC;
3558 vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(rxmcs_map);
3559 vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(txmcs_map);
3564 static void ath11k_mac_setup_ht_vht_cap(struct ath11k *ar,
3565 struct ath11k_pdev_cap *cap,
3568 struct ieee80211_supported_band *band;
3569 u32 rate_cap_tx_chainmask;
3570 u32 rate_cap_rx_chainmask;
3573 rate_cap_tx_chainmask = ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift;
3574 rate_cap_rx_chainmask = ar->cfg_rx_chainmask >> cap->rx_chain_mask_shift;
3576 if (cap->supported_bands & WMI_HOST_WLAN_2G_CAP) {
3577 band = &ar->mac.sbands[NL80211_BAND_2GHZ];
3578 ht_cap = cap->band[NL80211_BAND_2GHZ].ht_cap_info;
3580 *ht_cap_info = ht_cap;
3581 band->ht_cap = ath11k_create_ht_cap(ar, ht_cap,
3582 rate_cap_rx_chainmask);
3585 if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP && !ar->supports_6ghz) {
3586 band = &ar->mac.sbands[NL80211_BAND_5GHZ];
3587 ht_cap = cap->band[NL80211_BAND_5GHZ].ht_cap_info;
3589 *ht_cap_info = ht_cap;
3590 band->ht_cap = ath11k_create_ht_cap(ar, ht_cap,
3591 rate_cap_rx_chainmask);
3592 band->vht_cap = ath11k_create_vht_cap(ar, rate_cap_tx_chainmask,
3593 rate_cap_rx_chainmask);
3597 static int ath11k_check_chain_mask(struct ath11k *ar, u32 ant, bool is_tx_ant)
3599 /* TODO: Check the request chainmask against the supported
3600 * chainmask table which is advertised in extented_service_ready event
3606 static void ath11k_gen_ppe_thresh(struct ath11k_ppe_threshold *fw_ppet,
3612 he_ppet[0] = fw_ppet->numss_m1 & IEEE80211_PPE_THRES_NSS_MASK;
3613 he_ppet[0] |= (fw_ppet->ru_bit_mask <<
3614 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_POS) &
3615 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK;
3616 for (nss = 0; nss <= fw_ppet->numss_m1; nss++) {
3617 for (ru = 0; ru < 4; ru++) {
3621 if ((fw_ppet->ru_bit_mask & BIT(ru)) == 0)
3623 val = (fw_ppet->ppet16_ppet8_ru3_ru0[nss] >> (ru * 6)) &
3625 val = ((val >> 3) & 0x7) | ((val & 0x7) << 3);
3626 for (i = 5; i >= 0; i--) {
3628 ((val >> i) & 0x1) << ((bit % 8));
3636 ath11k_mac_filter_he_cap_mesh(struct ieee80211_he_cap_elem *he_cap_elem)
3640 m = IEEE80211_HE_MAC_CAP0_TWT_RES |
3641 IEEE80211_HE_MAC_CAP0_TWT_REQ;
3642 he_cap_elem->mac_cap_info[0] &= ~m;
3644 m = IEEE80211_HE_MAC_CAP2_TRS |
3645 IEEE80211_HE_MAC_CAP2_BCAST_TWT |
3646 IEEE80211_HE_MAC_CAP2_MU_CASCADING;
3647 he_cap_elem->mac_cap_info[2] &= ~m;
3649 m = IEEE80211_HE_MAC_CAP3_FLEX_TWT_SCHED |
3650 IEEE80211_HE_MAC_CAP2_BCAST_TWT |
3651 IEEE80211_HE_MAC_CAP2_MU_CASCADING;
3652 he_cap_elem->mac_cap_info[3] &= ~m;
3654 m = IEEE80211_HE_MAC_CAP4_BSRP_BQRP_A_MPDU_AGG |
3655 IEEE80211_HE_MAC_CAP4_BQR;
3656 he_cap_elem->mac_cap_info[4] &= ~m;
3658 m = IEEE80211_HE_MAC_CAP5_SUBCHAN_SELECVITE_TRANSMISSION |
3659 IEEE80211_HE_MAC_CAP5_UL_2x996_TONE_RU |
3660 IEEE80211_HE_MAC_CAP5_PUNCTURED_SOUNDING |
3661 IEEE80211_HE_MAC_CAP5_HT_VHT_TRIG_FRAME_RX;
3662 he_cap_elem->mac_cap_info[5] &= ~m;
3664 m = IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO |
3665 IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO;
3666 he_cap_elem->phy_cap_info[2] &= ~m;
3668 m = IEEE80211_HE_PHY_CAP3_RX_HE_MU_PPDU_FROM_NON_AP_STA |
3669 IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK |
3670 IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_MASK;
3671 he_cap_elem->phy_cap_info[3] &= ~m;
3673 m = IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER;
3674 he_cap_elem->phy_cap_info[4] &= ~m;
3676 m = IEEE80211_HE_PHY_CAP5_NG16_MU_FEEDBACK;
3677 he_cap_elem->phy_cap_info[5] &= ~m;
3679 m = IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_75_MU |
3680 IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMER_FB |
3681 IEEE80211_HE_PHY_CAP6_TRIG_CQI_FB |
3682 IEEE80211_HE_PHY_CAP6_PARTIAL_BANDWIDTH_DL_MUMIMO;
3683 he_cap_elem->phy_cap_info[6] &= ~m;
3685 m = IEEE80211_HE_PHY_CAP7_SRP_BASED_SR |
3686 IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_AR |
3687 IEEE80211_HE_PHY_CAP7_STBC_TX_ABOVE_80MHZ |
3688 IEEE80211_HE_PHY_CAP7_STBC_RX_ABOVE_80MHZ;
3689 he_cap_elem->phy_cap_info[7] &= ~m;
3691 m = IEEE80211_HE_PHY_CAP8_HE_ER_SU_PPDU_4XLTF_AND_08_US_GI |
3692 IEEE80211_HE_PHY_CAP8_20MHZ_IN_40MHZ_HE_PPDU_IN_2G |
3693 IEEE80211_HE_PHY_CAP8_20MHZ_IN_160MHZ_HE_PPDU |
3694 IEEE80211_HE_PHY_CAP8_80MHZ_IN_160MHZ_HE_PPDU;
3695 he_cap_elem->phy_cap_info[8] &= ~m;
3697 m = IEEE80211_HE_PHY_CAP9_LONGER_THAN_16_SIGB_OFDM_SYM |
3698 IEEE80211_HE_PHY_CAP9_NON_TRIGGERED_CQI_FEEDBACK |
3699 IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU |
3700 IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU |
3701 IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_COMP_SIGB |
3702 IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_NON_COMP_SIGB;
3703 he_cap_elem->phy_cap_info[9] &= ~m;
3706 static __le16 ath11k_mac_setup_he_6ghz_cap(struct ath11k_pdev_cap *pcap,
3707 struct ath11k_band_cap *bcap)
3711 bcap->he_6ghz_capa = IEEE80211_HT_MPDU_DENSITY_NONE;
3712 if (bcap->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS)
3713 bcap->he_6ghz_capa |=
3714 FIELD_PREP(IEEE80211_HE_6GHZ_CAP_SM_PS,
3715 WLAN_HT_CAP_SM_PS_DYNAMIC);
3717 bcap->he_6ghz_capa |=
3718 FIELD_PREP(IEEE80211_HE_6GHZ_CAP_SM_PS,
3719 WLAN_HT_CAP_SM_PS_DISABLED);
3720 val = FIELD_GET(IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK,
3722 bcap->he_6ghz_capa |=
3723 FIELD_PREP(IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP, val);
3724 val = FIELD_GET(IEEE80211_VHT_CAP_MAX_MPDU_MASK, pcap->vht_cap);
3725 bcap->he_6ghz_capa |=
3726 FIELD_PREP(IEEE80211_HE_6GHZ_CAP_MAX_MPDU_LEN, val);
3727 if (pcap->vht_cap & IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN)
3728 bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_RX_ANTPAT_CONS;
3729 if (pcap->vht_cap & IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN)
3730 bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_TX_ANTPAT_CONS;
3732 return cpu_to_le16(bcap->he_6ghz_capa);
3735 static int ath11k_mac_copy_he_cap(struct ath11k *ar,
3736 struct ath11k_pdev_cap *cap,
3737 struct ieee80211_sband_iftype_data *data,
3742 for (i = 0; i < NUM_NL80211_IFTYPES; i++) {
3743 struct ieee80211_sta_he_cap *he_cap = &data[idx].he_cap;
3744 struct ath11k_band_cap *band_cap = &cap->band[band];
3745 struct ieee80211_he_cap_elem *he_cap_elem =
3746 &he_cap->he_cap_elem;
3749 case NL80211_IFTYPE_STATION:
3750 case NL80211_IFTYPE_AP:
3751 case NL80211_IFTYPE_MESH_POINT:
3758 data[idx].types_mask = BIT(i);
3759 he_cap->has_he = true;
3760 memcpy(he_cap_elem->mac_cap_info, band_cap->he_cap_info,
3761 sizeof(he_cap_elem->mac_cap_info));
3762 memcpy(he_cap_elem->phy_cap_info, band_cap->he_cap_phy_info,
3763 sizeof(he_cap_elem->phy_cap_info));
3765 he_cap_elem->mac_cap_info[1] &=
3766 IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_MASK;
3768 he_cap_elem->phy_cap_info[5] &=
3769 ~IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK;
3770 he_cap_elem->phy_cap_info[5] &=
3771 ~IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_MASK;
3772 he_cap_elem->phy_cap_info[5] |= ar->num_tx_chains - 1;
3775 case NL80211_IFTYPE_AP:
3776 he_cap_elem->phy_cap_info[3] &=
3777 ~IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK;
3778 he_cap_elem->phy_cap_info[9] |=
3779 IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU;
3781 case NL80211_IFTYPE_STATION:
3782 he_cap_elem->mac_cap_info[0] &=
3783 ~IEEE80211_HE_MAC_CAP0_TWT_RES;
3784 he_cap_elem->mac_cap_info[0] |=
3785 IEEE80211_HE_MAC_CAP0_TWT_REQ;
3786 he_cap_elem->phy_cap_info[9] |=
3787 IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU;
3789 case NL80211_IFTYPE_MESH_POINT:
3790 ath11k_mac_filter_he_cap_mesh(he_cap_elem);
3794 he_cap->he_mcs_nss_supp.rx_mcs_80 =
3795 cpu_to_le16(band_cap->he_mcs & 0xffff);
3796 he_cap->he_mcs_nss_supp.tx_mcs_80 =
3797 cpu_to_le16(band_cap->he_mcs & 0xffff);
3798 he_cap->he_mcs_nss_supp.rx_mcs_160 =
3799 cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
3800 he_cap->he_mcs_nss_supp.tx_mcs_160 =
3801 cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
3802 he_cap->he_mcs_nss_supp.rx_mcs_80p80 =
3803 cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
3804 he_cap->he_mcs_nss_supp.tx_mcs_80p80 =
3805 cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
3807 memset(he_cap->ppe_thres, 0, sizeof(he_cap->ppe_thres));
3808 if (he_cap_elem->phy_cap_info[6] &
3809 IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT)
3810 ath11k_gen_ppe_thresh(&band_cap->he_ppet,
3813 if (band == NL80211_BAND_6GHZ) {
3814 data[idx].he_6ghz_capa.capa =
3815 ath11k_mac_setup_he_6ghz_cap(cap, band_cap);
3823 static void ath11k_mac_setup_he_cap(struct ath11k *ar,
3824 struct ath11k_pdev_cap *cap)
3826 struct ieee80211_supported_band *band;
3829 if (cap->supported_bands & WMI_HOST_WLAN_2G_CAP) {
3830 count = ath11k_mac_copy_he_cap(ar, cap,
3831 ar->mac.iftype[NL80211_BAND_2GHZ],
3833 band = &ar->mac.sbands[NL80211_BAND_2GHZ];
3834 band->iftype_data = ar->mac.iftype[NL80211_BAND_2GHZ];
3835 band->n_iftype_data = count;
3838 if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP) {
3839 count = ath11k_mac_copy_he_cap(ar, cap,
3840 ar->mac.iftype[NL80211_BAND_5GHZ],
3842 band = &ar->mac.sbands[NL80211_BAND_5GHZ];
3843 band->iftype_data = ar->mac.iftype[NL80211_BAND_5GHZ];
3844 band->n_iftype_data = count;
3847 if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP &&
3848 ar->supports_6ghz) {
3849 count = ath11k_mac_copy_he_cap(ar, cap,
3850 ar->mac.iftype[NL80211_BAND_6GHZ],
3852 band = &ar->mac.sbands[NL80211_BAND_6GHZ];
3853 band->iftype_data = ar->mac.iftype[NL80211_BAND_6GHZ];
3854 band->n_iftype_data = count;
3858 static int __ath11k_set_antenna(struct ath11k *ar, u32 tx_ant, u32 rx_ant)
3862 lockdep_assert_held(&ar->conf_mutex);
3864 if (ath11k_check_chain_mask(ar, tx_ant, true))
3867 if (ath11k_check_chain_mask(ar, rx_ant, false))
3870 ar->cfg_tx_chainmask = tx_ant;
3871 ar->cfg_rx_chainmask = rx_ant;
3873 if (ar->state != ATH11K_STATE_ON &&
3874 ar->state != ATH11K_STATE_RESTARTED)
3877 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_TX_CHAIN_MASK,
3878 tx_ant, ar->pdev->pdev_id);
3880 ath11k_warn(ar->ab, "failed to set tx-chainmask: %d, req 0x%x\n",
3885 ar->num_tx_chains = get_num_chains(tx_ant);
3887 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_RX_CHAIN_MASK,
3888 rx_ant, ar->pdev->pdev_id);
3890 ath11k_warn(ar->ab, "failed to set rx-chainmask: %d, req 0x%x\n",
3895 ar->num_rx_chains = get_num_chains(rx_ant);
3897 /* Reload HT/VHT/HE capability */
3898 ath11k_mac_setup_ht_vht_cap(ar, &ar->pdev->cap, NULL);
3899 ath11k_mac_setup_he_cap(ar, &ar->pdev->cap);
3904 int ath11k_mac_tx_mgmt_pending_free(int buf_id, void *skb, void *ctx)
3906 struct sk_buff *msdu = skb;
3907 struct ieee80211_tx_info *info;
3908 struct ath11k *ar = ctx;
3909 struct ath11k_base *ab = ar->ab;
3911 spin_lock_bh(&ar->txmgmt_idr_lock);
3912 idr_remove(&ar->txmgmt_idr, buf_id);
3913 spin_unlock_bh(&ar->txmgmt_idr_lock);
3914 dma_unmap_single(ab->dev, ATH11K_SKB_CB(msdu)->paddr, msdu->len,
3917 info = IEEE80211_SKB_CB(msdu);
3918 memset(&info->status, 0, sizeof(info->status));
3920 ieee80211_free_txskb(ar->hw, msdu);
3925 static int ath11k_mac_vif_txmgmt_idr_remove(int buf_id, void *skb, void *ctx)
3927 struct ieee80211_vif *vif = ctx;
3928 struct ath11k_skb_cb *skb_cb = ATH11K_SKB_CB((struct sk_buff *)skb);
3929 struct sk_buff *msdu = skb;
3930 struct ath11k *ar = skb_cb->ar;
3931 struct ath11k_base *ab = ar->ab;
3933 if (skb_cb->vif == vif) {
3934 spin_lock_bh(&ar->txmgmt_idr_lock);
3935 idr_remove(&ar->txmgmt_idr, buf_id);
3936 spin_unlock_bh(&ar->txmgmt_idr_lock);
3937 dma_unmap_single(ab->dev, skb_cb->paddr, msdu->len,
3944 static int ath11k_mac_mgmt_tx_wmi(struct ath11k *ar, struct ath11k_vif *arvif,
3945 struct sk_buff *skb)
3947 struct ath11k_base *ab = ar->ab;
3948 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
3949 struct ieee80211_tx_info *info;
3954 spin_lock_bh(&ar->txmgmt_idr_lock);
3955 buf_id = idr_alloc(&ar->txmgmt_idr, skb, 0,
3956 ATH11K_TX_MGMT_NUM_PENDING_MAX, GFP_ATOMIC);
3957 spin_unlock_bh(&ar->txmgmt_idr_lock);
3961 info = IEEE80211_SKB_CB(skb);
3962 if (!(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP)) {
3963 if ((ieee80211_is_action(hdr->frame_control) ||
3964 ieee80211_is_deauth(hdr->frame_control) ||
3965 ieee80211_is_disassoc(hdr->frame_control)) &&
3966 ieee80211_has_protected(hdr->frame_control)) {
3967 skb_put(skb, IEEE80211_CCMP_MIC_LEN);
3971 paddr = dma_map_single(ab->dev, skb->data, skb->len, DMA_TO_DEVICE);
3972 if (dma_mapping_error(ab->dev, paddr)) {
3973 ath11k_warn(ab, "failed to DMA map mgmt Tx buffer\n");
3978 ATH11K_SKB_CB(skb)->paddr = paddr;
3980 ret = ath11k_wmi_mgmt_send(ar, arvif->vdev_id, buf_id, skb);
3982 ath11k_warn(ar->ab, "failed to send mgmt frame: %d\n", ret);
3989 dma_unmap_single(ab->dev, ATH11K_SKB_CB(skb)->paddr,
3990 skb->len, DMA_TO_DEVICE);
3992 spin_lock_bh(&ar->txmgmt_idr_lock);
3993 idr_remove(&ar->txmgmt_idr, buf_id);
3994 spin_unlock_bh(&ar->txmgmt_idr_lock);
3999 static void ath11k_mgmt_over_wmi_tx_purge(struct ath11k *ar)
4001 struct sk_buff *skb;
4003 while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL)
4004 ieee80211_free_txskb(ar->hw, skb);
4007 static void ath11k_mgmt_over_wmi_tx_work(struct work_struct *work)
4009 struct ath11k *ar = container_of(work, struct ath11k, wmi_mgmt_tx_work);
4010 struct ath11k_skb_cb *skb_cb;
4011 struct ath11k_vif *arvif;
4012 struct sk_buff *skb;
4015 while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL) {
4016 skb_cb = ATH11K_SKB_CB(skb);
4018 ath11k_warn(ar->ab, "no vif found for mgmt frame\n");
4019 ieee80211_free_txskb(ar->hw, skb);
4023 arvif = ath11k_vif_to_arvif(skb_cb->vif);
4024 if (ar->allocated_vdev_map & (1LL << arvif->vdev_id) &&
4025 arvif->is_started) {
4026 ret = ath11k_mac_mgmt_tx_wmi(ar, arvif, skb);
4028 ath11k_warn(ar->ab, "failed to tx mgmt frame, vdev_id %d :%d\n",
4029 arvif->vdev_id, ret);
4030 ieee80211_free_txskb(ar->hw, skb);
4032 atomic_inc(&ar->num_pending_mgmt_tx);
4036 "dropping mgmt frame for vdev %d, is_started %d\n",
4039 ieee80211_free_txskb(ar->hw, skb);
4044 static int ath11k_mac_mgmt_tx(struct ath11k *ar, struct sk_buff *skb,
4047 struct sk_buff_head *q = &ar->wmi_mgmt_tx_queue;
4049 if (test_bit(ATH11K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags))
4052 /* Drop probe response packets when the pending management tx
4053 * count has reached a certain threshold, so as to prioritize
4054 * other mgmt packets like auth and assoc to be sent on time
4055 * for establishing successful connections.
4058 atomic_read(&ar->num_pending_mgmt_tx) > ATH11K_PRB_RSP_DROP_THRESHOLD) {
4060 "dropping probe response as pending queue is almost full\n");
4064 if (skb_queue_len(q) == ATH11K_TX_MGMT_NUM_PENDING_MAX) {
4065 ath11k_warn(ar->ab, "mgmt tx queue is full\n");
4069 skb_queue_tail(q, skb);
4070 ieee80211_queue_work(ar->hw, &ar->wmi_mgmt_tx_work);
4075 static void ath11k_mac_op_tx(struct ieee80211_hw *hw,
4076 struct ieee80211_tx_control *control,
4077 struct sk_buff *skb)
4079 struct ath11k_skb_cb *skb_cb = ATH11K_SKB_CB(skb);
4080 struct ath11k *ar = hw->priv;
4081 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
4082 struct ieee80211_vif *vif = info->control.vif;
4083 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
4084 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
4085 struct ieee80211_key_conf *key = info->control.hw_key;
4086 u32 info_flags = info->flags;
4090 memset(skb_cb, 0, sizeof(*skb_cb));
4094 skb_cb->cipher = key->cipher;
4095 skb_cb->flags |= ATH11K_SKB_CIPHER_SET;
4098 if (info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP) {
4099 skb_cb->flags |= ATH11K_SKB_HW_80211_ENCAP;
4100 } else if (ieee80211_is_mgmt(hdr->frame_control)) {
4101 is_prb_rsp = ieee80211_is_probe_resp(hdr->frame_control);
4102 ret = ath11k_mac_mgmt_tx(ar, skb, is_prb_rsp);
4104 ath11k_warn(ar->ab, "failed to queue management frame %d\n",
4106 ieee80211_free_txskb(ar->hw, skb);
4111 ret = ath11k_dp_tx(ar, arvif, skb);
4113 ath11k_warn(ar->ab, "failed to transmit frame %d\n", ret);
4114 ieee80211_free_txskb(ar->hw, skb);
4118 void ath11k_mac_drain_tx(struct ath11k *ar)
4120 /* make sure rcu-protected mac80211 tx path itself is drained */
4123 cancel_work_sync(&ar->wmi_mgmt_tx_work);
4124 ath11k_mgmt_over_wmi_tx_purge(ar);
4127 static int ath11k_mac_config_mon_status_default(struct ath11k *ar, bool enable)
4129 struct htt_rx_ring_tlv_filter tlv_filter = {0};
4130 struct ath11k_base *ab = ar->ab;
4135 tlv_filter = ath11k_mac_mon_status_filter_default;
4136 if (ath11k_debugfs_rx_filter(ar))
4137 tlv_filter.rx_filter = ath11k_debugfs_rx_filter(ar);
4140 for (i = 0; i < ab->hw_params.num_rxmda_per_pdev; i++) {
4141 ring_id = ar->dp.rx_mon_status_refill_ring[i].refill_buf_ring.ring_id;
4142 ret = ath11k_dp_tx_htt_rx_filter_setup(ar->ab, ring_id,
4144 HAL_RXDMA_MONITOR_STATUS,
4149 if (enable && !ar->ab->hw_params.rxdma1_enable)
4150 mod_timer(&ar->ab->mon_reap_timer, jiffies +
4151 msecs_to_jiffies(ATH11K_MON_TIMER_INTERVAL));
4156 static int ath11k_mac_op_start(struct ieee80211_hw *hw)
4158 struct ath11k *ar = hw->priv;
4159 struct ath11k_base *ab = ar->ab;
4160 struct ath11k_pdev *pdev = ar->pdev;
4163 ath11k_mac_drain_tx(ar);
4164 mutex_lock(&ar->conf_mutex);
4166 switch (ar->state) {
4167 case ATH11K_STATE_OFF:
4168 ar->state = ATH11K_STATE_ON;
4170 case ATH11K_STATE_RESTARTING:
4171 ar->state = ATH11K_STATE_RESTARTED;
4173 case ATH11K_STATE_RESTARTED:
4174 case ATH11K_STATE_WEDGED:
4175 case ATH11K_STATE_ON:
4181 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_PMF_QOS,
4185 ath11k_err(ar->ab, "failed to enable PMF QOS: (%d\n", ret);
4189 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_DYNAMIC_BW, 1,
4192 ath11k_err(ar->ab, "failed to enable dynamic bw: %d\n", ret);
4196 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_ARP_AC_OVERRIDE,
4199 ath11k_err(ab, "failed to set ac override for ARP: %d\n",
4204 ret = ath11k_wmi_send_dfs_phyerr_offload_enable_cmd(ar, pdev->pdev_id);
4206 ath11k_err(ab, "failed to offload radar detection: %d\n",
4211 ret = ath11k_dp_tx_htt_h2t_ppdu_stats_req(ar,
4212 HTT_PPDU_STATS_TAG_DEFAULT);
4214 ath11k_err(ab, "failed to req ppdu stats: %d\n", ret);
4218 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_MESH_MCAST_ENABLE,
4222 ath11k_err(ar->ab, "failed to enable MESH MCAST ENABLE: (%d\n", ret);
4226 __ath11k_set_antenna(ar, ar->cfg_tx_chainmask, ar->cfg_rx_chainmask);
4228 /* TODO: Do we need to enable ANI? */
4230 ath11k_reg_update_chan_list(ar);
4232 ar->num_started_vdevs = 0;
4233 ar->num_created_vdevs = 0;
4235 ar->allocated_vdev_map = 0;
4237 /* Configure monitor status ring with default rx_filter to get rx status
4238 * such as rssi, rx_duration.
4240 ret = ath11k_mac_config_mon_status_default(ar, true);
4242 ath11k_err(ab, "failed to configure monitor status ring with default rx_filter: (%d)\n",
4247 /* Configure the hash seed for hash based reo dest ring selection */
4248 ath11k_wmi_pdev_lro_cfg(ar, ar->pdev->pdev_id);
4250 mutex_unlock(&ar->conf_mutex);
4252 rcu_assign_pointer(ab->pdevs_active[ar->pdev_idx],
4253 &ab->pdevs[ar->pdev_idx]);
4255 /* allow device to enter IMPS */
4256 if (ab->hw_params.idle_ps) {
4257 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_IDLE_PS_CONFIG,
4260 ath11k_err(ab, "failed to enable idle ps: %d\n", ret);
4267 ar->state = ATH11K_STATE_OFF;
4268 mutex_unlock(&ar->conf_mutex);
4273 static void ath11k_mac_op_stop(struct ieee80211_hw *hw)
4275 struct ath11k *ar = hw->priv;
4276 struct htt_ppdu_stats_info *ppdu_stats, *tmp;
4279 ath11k_mac_drain_tx(ar);
4281 mutex_lock(&ar->conf_mutex);
4282 ret = ath11k_mac_config_mon_status_default(ar, false);
4284 ath11k_err(ar->ab, "failed to clear rx_filter for monitor status ring: (%d)\n",
4287 clear_bit(ATH11K_CAC_RUNNING, &ar->dev_flags);
4288 ar->state = ATH11K_STATE_OFF;
4289 mutex_unlock(&ar->conf_mutex);
4291 cancel_delayed_work_sync(&ar->scan.timeout);
4292 cancel_work_sync(&ar->regd_update_work);
4294 spin_lock_bh(&ar->data_lock);
4295 list_for_each_entry_safe(ppdu_stats, tmp, &ar->ppdu_stats_info, list) {
4296 list_del(&ppdu_stats->list);
4299 spin_unlock_bh(&ar->data_lock);
4301 rcu_assign_pointer(ar->ab->pdevs_active[ar->pdev_idx], NULL);
4305 atomic_set(&ar->num_pending_mgmt_tx, 0);
4309 ath11k_mac_setup_vdev_create_params(struct ath11k_vif *arvif,
4310 struct vdev_create_params *params)
4312 struct ath11k *ar = arvif->ar;
4313 struct ath11k_pdev *pdev = ar->pdev;
4315 params->if_id = arvif->vdev_id;
4316 params->type = arvif->vdev_type;
4317 params->subtype = arvif->vdev_subtype;
4318 params->pdev_id = pdev->pdev_id;
4320 if (pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) {
4321 params->chains[NL80211_BAND_2GHZ].tx = ar->num_tx_chains;
4322 params->chains[NL80211_BAND_2GHZ].rx = ar->num_rx_chains;
4324 if (pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) {
4325 params->chains[NL80211_BAND_5GHZ].tx = ar->num_tx_chains;
4326 params->chains[NL80211_BAND_5GHZ].rx = ar->num_rx_chains;
4328 if (pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP &&
4329 ar->supports_6ghz) {
4330 params->chains[NL80211_BAND_6GHZ].tx = ar->num_tx_chains;
4331 params->chains[NL80211_BAND_6GHZ].rx = ar->num_rx_chains;
4336 ath11k_mac_prepare_he_mode(struct ath11k_pdev *pdev, u32 viftype)
4338 struct ath11k_pdev_cap *pdev_cap = &pdev->cap;
4339 struct ath11k_band_cap *cap_band = NULL;
4340 u32 *hecap_phy_ptr = NULL;
4343 if (pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP)
4344 cap_band = &pdev_cap->band[NL80211_BAND_2GHZ];
4346 cap_band = &pdev_cap->band[NL80211_BAND_5GHZ];
4348 hecap_phy_ptr = &cap_band->he_cap_phy_info[0];
4350 hemode = FIELD_PREP(HE_MODE_SU_TX_BFEE, HE_SU_BFEE_ENABLE) |
4351 FIELD_PREP(HE_MODE_SU_TX_BFER, HECAP_PHY_SUBFMR_GET(hecap_phy_ptr)) |
4352 FIELD_PREP(HE_MODE_UL_MUMIMO, HECAP_PHY_ULMUMIMO_GET(hecap_phy_ptr));
4354 /* TODO WDS and other modes */
4355 if (viftype == NL80211_IFTYPE_AP) {
4356 hemode |= FIELD_PREP(HE_MODE_MU_TX_BFER,
4357 HECAP_PHY_MUBFMR_GET(hecap_phy_ptr)) |
4358 FIELD_PREP(HE_MODE_DL_OFDMA, HE_DL_MUOFDMA_ENABLE) |
4359 FIELD_PREP(HE_MODE_UL_OFDMA, HE_UL_MUOFDMA_ENABLE);
4361 hemode |= FIELD_PREP(HE_MODE_MU_TX_BFEE, HE_MU_BFEE_ENABLE);
4367 static int ath11k_set_he_mu_sounding_mode(struct ath11k *ar,
4368 struct ath11k_vif *arvif)
4370 u32 param_id, param_value;
4371 struct ath11k_base *ab = ar->ab;
4374 param_id = WMI_VDEV_PARAM_SET_HEMU_MODE;
4375 param_value = ath11k_mac_prepare_he_mode(ar->pdev, arvif->vif->type);
4376 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4377 param_id, param_value);
4379 ath11k_warn(ab, "failed to set vdev %d HE MU mode: %d param_value %x\n",
4380 arvif->vdev_id, ret, param_value);
4383 param_id = WMI_VDEV_PARAM_SET_HE_SOUNDING_MODE;
4385 FIELD_PREP(HE_VHT_SOUNDING_MODE, HE_VHT_SOUNDING_MODE_ENABLE) |
4386 FIELD_PREP(HE_TRIG_NONTRIG_SOUNDING_MODE,
4387 HE_TRIG_NONTRIG_SOUNDING_MODE_ENABLE);
4388 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4389 param_id, param_value);
4391 ath11k_warn(ab, "failed to set vdev %d HE MU mode: %d\n",
4392 arvif->vdev_id, ret);
4398 static void ath11k_mac_op_update_vif_offload(struct ieee80211_hw *hw,
4399 struct ieee80211_vif *vif)
4401 struct ath11k *ar = hw->priv;
4402 struct ath11k_base *ab = ar->ab;
4403 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
4404 u32 param_id, param_value;
4407 param_id = WMI_VDEV_PARAM_TX_ENCAP_TYPE;
4408 if (ath11k_frame_mode != ATH11K_HW_TXRX_ETHERNET ||
4409 (vif->type != NL80211_IFTYPE_STATION &&
4410 vif->type != NL80211_IFTYPE_AP))
4411 vif->offload_flags &= ~IEEE80211_OFFLOAD_ENCAP_ENABLED;
4413 if (vif->offload_flags & IEEE80211_OFFLOAD_ENCAP_ENABLED)
4414 param_value = ATH11K_HW_TXRX_ETHERNET;
4415 else if (test_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags))
4416 param_value = ATH11K_HW_TXRX_RAW;
4418 param_value = ATH11K_HW_TXRX_NATIVE_WIFI;
4420 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4421 param_id, param_value);
4423 ath11k_warn(ab, "failed to set vdev %d tx encap mode: %d\n",
4424 arvif->vdev_id, ret);
4425 vif->offload_flags &= ~IEEE80211_OFFLOAD_ENCAP_ENABLED;
4429 static int ath11k_mac_op_add_interface(struct ieee80211_hw *hw,
4430 struct ieee80211_vif *vif)
4432 struct ath11k *ar = hw->priv;
4433 struct ath11k_base *ab = ar->ab;
4434 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
4435 struct vdev_create_params vdev_param = {0};
4436 struct peer_create_params peer_param;
4437 u32 param_id, param_value;
4443 vif->driver_flags |= IEEE80211_VIF_SUPPORTS_UAPSD;
4445 mutex_lock(&ar->conf_mutex);
4447 if (vif->type == NL80211_IFTYPE_AP &&
4448 ar->num_peers > (ar->max_num_peers - 1)) {
4449 ath11k_warn(ab, "failed to create vdev due to insufficient peer entry resource in firmware\n");
4454 if (ar->num_created_vdevs > (TARGET_NUM_VDEVS - 1)) {
4455 ath11k_warn(ab, "failed to create vdev, reached max vdev limit %d\n",
4461 memset(arvif, 0, sizeof(*arvif));
4466 INIT_LIST_HEAD(&arvif->list);
4468 /* Should we initialize any worker to handle connection loss indication
4469 * from firmware in sta mode?
4472 for (i = 0; i < ARRAY_SIZE(arvif->bitrate_mask.control); i++) {
4473 arvif->bitrate_mask.control[i].legacy = 0xffffffff;
4474 memset(arvif->bitrate_mask.control[i].ht_mcs, 0xff,
4475 sizeof(arvif->bitrate_mask.control[i].ht_mcs));
4476 memset(arvif->bitrate_mask.control[i].vht_mcs, 0xff,
4477 sizeof(arvif->bitrate_mask.control[i].vht_mcs));
4480 bit = __ffs64(ab->free_vdev_map);
4482 arvif->vdev_id = bit;
4483 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE;
4485 switch (vif->type) {
4486 case NL80211_IFTYPE_UNSPECIFIED:
4487 case NL80211_IFTYPE_STATION:
4488 arvif->vdev_type = WMI_VDEV_TYPE_STA;
4490 case NL80211_IFTYPE_MESH_POINT:
4491 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_MESH_11S;
4493 case NL80211_IFTYPE_AP:
4494 arvif->vdev_type = WMI_VDEV_TYPE_AP;
4496 case NL80211_IFTYPE_MONITOR:
4497 arvif->vdev_type = WMI_VDEV_TYPE_MONITOR;
4504 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac add interface id %d type %d subtype %d map %llx\n",
4505 arvif->vdev_id, arvif->vdev_type, arvif->vdev_subtype,
4508 vif->cab_queue = arvif->vdev_id % (ATH11K_HW_MAX_QUEUES - 1);
4509 for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++)
4510 vif->hw_queue[i] = i % (ATH11K_HW_MAX_QUEUES - 1);
4512 ath11k_mac_setup_vdev_create_params(arvif, &vdev_param);
4514 ret = ath11k_wmi_vdev_create(ar, vif->addr, &vdev_param);
4516 ath11k_warn(ab, "failed to create WMI vdev %d: %d\n",
4517 arvif->vdev_id, ret);
4521 ar->num_created_vdevs++;
4522 ath11k_dbg(ab, ATH11K_DBG_MAC, "vdev %pM created, vdev_id %d\n",
4523 vif->addr, arvif->vdev_id);
4524 ar->allocated_vdev_map |= 1LL << arvif->vdev_id;
4525 ab->free_vdev_map &= ~(1LL << arvif->vdev_id);
4527 spin_lock_bh(&ar->data_lock);
4528 list_add(&arvif->list, &ar->arvifs);
4529 spin_unlock_bh(&ar->data_lock);
4531 ath11k_mac_op_update_vif_offload(hw, vif);
4533 nss = get_num_chains(ar->cfg_tx_chainmask) ? : 1;
4534 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4535 WMI_VDEV_PARAM_NSS, nss);
4537 ath11k_warn(ab, "failed to set vdev %d chainmask 0x%x, nss %d :%d\n",
4538 arvif->vdev_id, ar->cfg_tx_chainmask, nss, ret);
4542 switch (arvif->vdev_type) {
4543 case WMI_VDEV_TYPE_AP:
4544 peer_param.vdev_id = arvif->vdev_id;
4545 peer_param.peer_addr = vif->addr;
4546 peer_param.peer_type = WMI_PEER_TYPE_DEFAULT;
4547 ret = ath11k_peer_create(ar, arvif, NULL, &peer_param);
4549 ath11k_warn(ab, "failed to vdev %d create peer for AP: %d\n",
4550 arvif->vdev_id, ret);
4554 ret = ath11k_mac_set_kickout(arvif);
4556 ath11k_warn(ar->ab, "failed to set vdev %i kickout parameters: %d\n",
4557 arvif->vdev_id, ret);
4561 case WMI_VDEV_TYPE_STA:
4562 param_id = WMI_STA_PS_PARAM_RX_WAKE_POLICY;
4563 param_value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
4564 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
4565 param_id, param_value);
4567 ath11k_warn(ar->ab, "failed to set vdev %d RX wake policy: %d\n",
4568 arvif->vdev_id, ret);
4572 param_id = WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD;
4573 param_value = WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS;
4574 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
4575 param_id, param_value);
4577 ath11k_warn(ar->ab, "failed to set vdev %d TX wake threshold: %d\n",
4578 arvif->vdev_id, ret);
4582 param_id = WMI_STA_PS_PARAM_PSPOLL_COUNT;
4583 param_value = WMI_STA_PS_PSPOLL_COUNT_NO_MAX;
4584 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
4585 param_id, param_value);
4587 ath11k_warn(ar->ab, "failed to set vdev %d pspoll count: %d\n",
4588 arvif->vdev_id, ret);
4592 ret = ath11k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id, false);
4594 ath11k_warn(ar->ab, "failed to disable vdev %d ps mode: %d\n",
4595 arvif->vdev_id, ret);
4603 arvif->txpower = vif->bss_conf.txpower;
4604 ret = ath11k_mac_txpower_recalc(ar);
4608 param_id = WMI_VDEV_PARAM_RTS_THRESHOLD;
4609 param_value = ar->hw->wiphy->rts_threshold;
4610 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4611 param_id, param_value);
4613 ath11k_warn(ar->ab, "failed to set rts threshold for vdev %d: %d\n",
4614 arvif->vdev_id, ret);
4617 ath11k_dp_vdev_tx_attach(ar, arvif);
4619 mutex_unlock(&ar->conf_mutex);
4624 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
4625 reinit_completion(&ar->peer_delete_done);
4627 ret = ath11k_wmi_send_peer_delete_cmd(ar, vif->addr,
4630 ath11k_warn(ar->ab, "failed to delete peer vdev_id %d addr %pM\n",
4631 arvif->vdev_id, vif->addr);
4635 ret = ath11k_wait_for_peer_delete_done(ar, arvif->vdev_id,
4644 ath11k_wmi_vdev_delete(ar, arvif->vdev_id);
4645 ar->num_created_vdevs--;
4646 ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id);
4647 ab->free_vdev_map |= 1LL << arvif->vdev_id;
4648 spin_lock_bh(&ar->data_lock);
4649 list_del(&arvif->list);
4650 spin_unlock_bh(&ar->data_lock);
4653 mutex_unlock(&ar->conf_mutex);
4658 static int ath11k_mac_vif_unref(int buf_id, void *skb, void *ctx)
4660 struct ieee80211_vif *vif = (struct ieee80211_vif *)ctx;
4661 struct ath11k_skb_cb *skb_cb = ATH11K_SKB_CB((struct sk_buff *)skb);
4663 if (skb_cb->vif == vif)
4669 static void ath11k_mac_op_remove_interface(struct ieee80211_hw *hw,
4670 struct ieee80211_vif *vif)
4672 struct ath11k *ar = hw->priv;
4673 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
4674 struct ath11k_base *ab = ar->ab;
4675 unsigned long time_left;
4679 mutex_lock(&ar->conf_mutex);
4681 ath11k_dbg(ab, ATH11K_DBG_MAC, "mac remove interface (vdev %d)\n",
4684 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
4685 ret = ath11k_peer_delete(ar, arvif->vdev_id, vif->addr);
4687 ath11k_warn(ab, "failed to submit AP self-peer removal on vdev %d: %d\n",
4688 arvif->vdev_id, ret);
4691 reinit_completion(&ar->vdev_delete_done);
4693 ret = ath11k_wmi_vdev_delete(ar, arvif->vdev_id);
4695 ath11k_warn(ab, "failed to delete WMI vdev %d: %d\n",
4696 arvif->vdev_id, ret);
4700 time_left = wait_for_completion_timeout(&ar->vdev_delete_done,
4701 ATH11K_VDEV_DELETE_TIMEOUT_HZ);
4702 if (time_left == 0) {
4703 ath11k_warn(ab, "Timeout in receiving vdev delete response\n");
4707 ab->free_vdev_map |= 1LL << (arvif->vdev_id);
4708 ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id);
4709 ar->num_created_vdevs--;
4711 ath11k_dbg(ab, ATH11K_DBG_MAC, "vdev %pM deleted, vdev_id %d\n",
4712 vif->addr, arvif->vdev_id);
4715 spin_lock_bh(&ar->data_lock);
4716 list_del(&arvif->list);
4717 spin_unlock_bh(&ar->data_lock);
4719 ath11k_peer_cleanup(ar, arvif->vdev_id);
4721 idr_for_each(&ar->txmgmt_idr,
4722 ath11k_mac_vif_txmgmt_idr_remove, vif);
4724 for (i = 0; i < DP_TCL_NUM_RING_MAX; i++) {
4725 spin_lock_bh(&ab->dp.tx_ring[i].tx_idr_lock);
4726 idr_for_each(&ab->dp.tx_ring[i].txbuf_idr,
4727 ath11k_mac_vif_unref, vif);
4728 spin_unlock_bh(&ab->dp.tx_ring[i].tx_idr_lock);
4731 /* Recalc txpower for remaining vdev */
4732 ath11k_mac_txpower_recalc(ar);
4733 clear_bit(ATH11K_FLAG_MONITOR_ENABLED, &ar->monitor_flags);
4735 /* TODO: recal traffic pause state based on the available vdevs */
4737 mutex_unlock(&ar->conf_mutex);
4740 /* FIXME: Has to be verified. */
4741 #define SUPPORTED_FILTERS \
4746 FIF_BCN_PRBRESP_PROMISC | \
4750 static void ath11k_mac_op_configure_filter(struct ieee80211_hw *hw,
4751 unsigned int changed_flags,
4752 unsigned int *total_flags,
4755 struct ath11k *ar = hw->priv;
4756 bool reset_flag = false;
4759 mutex_lock(&ar->conf_mutex);
4761 changed_flags &= SUPPORTED_FILTERS;
4762 *total_flags &= SUPPORTED_FILTERS;
4763 ar->filter_flags = *total_flags;
4765 /* For monitor mode */
4766 reset_flag = !(ar->filter_flags & FIF_BCN_PRBRESP_PROMISC);
4768 ret = ath11k_dp_tx_htt_monitor_mode_ring_config(ar, reset_flag);
4771 set_bit(ATH11K_FLAG_MONITOR_ENABLED, &ar->monitor_flags);
4773 clear_bit(ATH11K_FLAG_MONITOR_ENABLED, &ar->monitor_flags);
4776 "fail to set monitor filter: %d\n", ret);
4778 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
4779 "changed_flags:0x%x, total_flags:0x%x, reset_flag:%d\n",
4780 changed_flags, *total_flags, reset_flag);
4782 mutex_unlock(&ar->conf_mutex);
4785 static int ath11k_mac_op_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant)
4787 struct ath11k *ar = hw->priv;
4789 mutex_lock(&ar->conf_mutex);
4791 *tx_ant = ar->cfg_tx_chainmask;
4792 *rx_ant = ar->cfg_rx_chainmask;
4794 mutex_unlock(&ar->conf_mutex);
4799 static int ath11k_mac_op_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)
4801 struct ath11k *ar = hw->priv;
4804 mutex_lock(&ar->conf_mutex);
4805 ret = __ath11k_set_antenna(ar, tx_ant, rx_ant);
4806 mutex_unlock(&ar->conf_mutex);
4811 static int ath11k_mac_op_ampdu_action(struct ieee80211_hw *hw,
4812 struct ieee80211_vif *vif,
4813 struct ieee80211_ampdu_params *params)
4815 struct ath11k *ar = hw->priv;
4818 mutex_lock(&ar->conf_mutex);
4820 switch (params->action) {
4821 case IEEE80211_AMPDU_RX_START:
4822 ret = ath11k_dp_rx_ampdu_start(ar, params);
4824 case IEEE80211_AMPDU_RX_STOP:
4825 ret = ath11k_dp_rx_ampdu_stop(ar, params);
4827 case IEEE80211_AMPDU_TX_START:
4828 case IEEE80211_AMPDU_TX_STOP_CONT:
4829 case IEEE80211_AMPDU_TX_STOP_FLUSH:
4830 case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
4831 case IEEE80211_AMPDU_TX_OPERATIONAL:
4832 /* Tx A-MPDU aggregation offloaded to hw/fw so deny mac80211
4833 * Tx aggregation requests.
4839 mutex_unlock(&ar->conf_mutex);
4844 static int ath11k_mac_op_add_chanctx(struct ieee80211_hw *hw,
4845 struct ieee80211_chanctx_conf *ctx)
4847 struct ath11k *ar = hw->priv;
4848 struct ath11k_base *ab = ar->ab;
4850 ath11k_dbg(ab, ATH11K_DBG_MAC,
4851 "mac chanctx add freq %hu width %d ptr %pK\n",
4852 ctx->def.chan->center_freq, ctx->def.width, ctx);
4854 mutex_lock(&ar->conf_mutex);
4856 spin_lock_bh(&ar->data_lock);
4857 /* TODO: In case of multiple channel context, populate rx_channel from
4858 * Rx PPDU desc information.
4860 ar->rx_channel = ctx->def.chan;
4861 spin_unlock_bh(&ar->data_lock);
4863 mutex_unlock(&ar->conf_mutex);
4868 static void ath11k_mac_op_remove_chanctx(struct ieee80211_hw *hw,
4869 struct ieee80211_chanctx_conf *ctx)
4871 struct ath11k *ar = hw->priv;
4872 struct ath11k_base *ab = ar->ab;
4874 ath11k_dbg(ab, ATH11K_DBG_MAC,
4875 "mac chanctx remove freq %hu width %d ptr %pK\n",
4876 ctx->def.chan->center_freq, ctx->def.width, ctx);
4878 mutex_lock(&ar->conf_mutex);
4880 spin_lock_bh(&ar->data_lock);
4881 /* TODO: In case of there is one more channel context left, populate
4882 * rx_channel with the channel of that remaining channel context.
4884 ar->rx_channel = NULL;
4885 spin_unlock_bh(&ar->data_lock);
4887 mutex_unlock(&ar->conf_mutex);
4890 static inline int ath11k_mac_vdev_setup_sync(struct ath11k *ar)
4892 lockdep_assert_held(&ar->conf_mutex);
4894 if (test_bit(ATH11K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags))
4897 if (!wait_for_completion_timeout(&ar->vdev_setup_done,
4898 ATH11K_VDEV_SETUP_TIMEOUT_HZ))
4901 return ar->last_wmi_vdev_start_status ? -EINVAL : 0;
4905 ath11k_mac_vdev_start_restart(struct ath11k_vif *arvif,
4906 const struct cfg80211_chan_def *chandef,
4909 struct ath11k *ar = arvif->ar;
4910 struct ath11k_base *ab = ar->ab;
4911 struct wmi_vdev_start_req_arg arg = {};
4912 int he_support = arvif->vif->bss_conf.he_support;
4915 lockdep_assert_held(&ar->conf_mutex);
4917 reinit_completion(&ar->vdev_setup_done);
4919 arg.vdev_id = arvif->vdev_id;
4920 arg.dtim_period = arvif->dtim_period;
4921 arg.bcn_intval = arvif->beacon_interval;
4923 arg.channel.freq = chandef->chan->center_freq;
4924 arg.channel.band_center_freq1 = chandef->center_freq1;
4925 arg.channel.band_center_freq2 = chandef->center_freq2;
4927 ath11k_phymodes[chandef->chan->band][chandef->width];
4929 arg.channel.min_power = 0;
4930 arg.channel.max_power = chandef->chan->max_power * 2;
4931 arg.channel.max_reg_power = chandef->chan->max_reg_power * 2;
4932 arg.channel.max_antenna_gain = chandef->chan->max_antenna_gain * 2;
4934 arg.pref_tx_streams = ar->num_tx_chains;
4935 arg.pref_rx_streams = ar->num_rx_chains;
4937 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
4938 arg.ssid = arvif->u.ap.ssid;
4939 arg.ssid_len = arvif->u.ap.ssid_len;
4940 arg.hidden_ssid = arvif->u.ap.hidden_ssid;
4942 /* For now allow DFS for AP mode */
4943 arg.channel.chan_radar =
4944 !!(chandef->chan->flags & IEEE80211_CHAN_RADAR);
4946 arg.channel.passive = arg.channel.chan_radar;
4948 spin_lock_bh(&ab->base_lock);
4949 arg.regdomain = ar->ab->dfs_region;
4950 spin_unlock_bh(&ab->base_lock);
4952 /* TODO: Notify if secondary 80Mhz also needs radar detection */
4954 ret = ath11k_set_he_mu_sounding_mode(ar, arvif);
4956 ath11k_warn(ar->ab, "failed to set he mode vdev %i\n",
4963 arg.channel.passive |= !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR);
4965 ath11k_dbg(ab, ATH11K_DBG_MAC,
4966 "mac vdev %d start center_freq %d phymode %s\n",
4967 arg.vdev_id, arg.channel.freq,
4968 ath11k_wmi_phymode_str(arg.channel.mode));
4970 ret = ath11k_wmi_vdev_start(ar, &arg, restart);
4972 ath11k_warn(ar->ab, "failed to %s WMI vdev %i\n",
4973 restart ? "restart" : "start", arg.vdev_id);
4977 ret = ath11k_mac_vdev_setup_sync(ar);
4979 ath11k_warn(ab, "failed to synchronize setup for vdev %i %s: %d\n",
4980 arg.vdev_id, restart ? "restart" : "start", ret);
4984 ar->num_started_vdevs++;
4985 ath11k_dbg(ab, ATH11K_DBG_MAC, "vdev %pM started, vdev_id %d\n",
4986 arvif->vif->addr, arvif->vdev_id);
4988 /* Enable CAC Flag in the driver by checking the channel DFS cac time,
4989 * i.e dfs_cac_ms value which will be valid only for radar channels
4990 * and state as NL80211_DFS_USABLE which indicates CAC needs to be
4991 * done before channel usage. This flags is used to drop rx packets.
4994 /* TODO Set the flag for other interface types as required */
4995 if (arvif->vdev_type == WMI_VDEV_TYPE_AP &&
4996 chandef->chan->dfs_cac_ms &&
4997 chandef->chan->dfs_state == NL80211_DFS_USABLE) {
4998 set_bit(ATH11K_CAC_RUNNING, &ar->dev_flags);
4999 ath11k_dbg(ab, ATH11K_DBG_MAC,
5000 "CAC Started in chan_freq %d for vdev %d\n",
5001 arg.channel.freq, arg.vdev_id);
5004 ret = ath11k_mac_set_txbf_conf(arvif);
5006 ath11k_warn(ab, "failed to set txbf conf for vdev %d: %d\n",
5007 arvif->vdev_id, ret);
5012 static int ath11k_mac_vdev_stop(struct ath11k_vif *arvif)
5014 struct ath11k *ar = arvif->ar;
5017 lockdep_assert_held(&ar->conf_mutex);
5019 reinit_completion(&ar->vdev_setup_done);
5021 ret = ath11k_wmi_vdev_stop(ar, arvif->vdev_id);
5023 ath11k_warn(ar->ab, "failed to stop WMI vdev %i: %d\n",
5024 arvif->vdev_id, ret);
5028 ret = ath11k_mac_vdev_setup_sync(ar);
5030 ath11k_warn(ar->ab, "failed to synchronize setup for vdev %i: %d\n",
5031 arvif->vdev_id, ret);
5035 WARN_ON(ar->num_started_vdevs == 0);
5037 ar->num_started_vdevs--;
5038 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %pM stopped, vdev_id %d\n",
5039 arvif->vif->addr, arvif->vdev_id);
5041 if (test_bit(ATH11K_CAC_RUNNING, &ar->dev_flags)) {
5042 clear_bit(ATH11K_CAC_RUNNING, &ar->dev_flags);
5043 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "CAC Stopped for vdev %d\n",
5052 static int ath11k_mac_vdev_start(struct ath11k_vif *arvif,
5053 const struct cfg80211_chan_def *chandef)
5055 return ath11k_mac_vdev_start_restart(arvif, chandef, false);
5058 static int ath11k_mac_vdev_restart(struct ath11k_vif *arvif,
5059 const struct cfg80211_chan_def *chandef)
5061 return ath11k_mac_vdev_start_restart(arvif, chandef, true);
5064 struct ath11k_mac_change_chanctx_arg {
5065 struct ieee80211_chanctx_conf *ctx;
5066 struct ieee80211_vif_chanctx_switch *vifs;
5072 ath11k_mac_change_chanctx_cnt_iter(void *data, u8 *mac,
5073 struct ieee80211_vif *vif)
5075 struct ath11k_mac_change_chanctx_arg *arg = data;
5077 if (rcu_access_pointer(vif->chanctx_conf) != arg->ctx)
5084 ath11k_mac_change_chanctx_fill_iter(void *data, u8 *mac,
5085 struct ieee80211_vif *vif)
5087 struct ath11k_mac_change_chanctx_arg *arg = data;
5088 struct ieee80211_chanctx_conf *ctx;
5090 ctx = rcu_access_pointer(vif->chanctx_conf);
5091 if (ctx != arg->ctx)
5094 if (WARN_ON(arg->next_vif == arg->n_vifs))
5097 arg->vifs[arg->next_vif].vif = vif;
5098 arg->vifs[arg->next_vif].old_ctx = ctx;
5099 arg->vifs[arg->next_vif].new_ctx = ctx;
5104 ath11k_mac_update_vif_chan(struct ath11k *ar,
5105 struct ieee80211_vif_chanctx_switch *vifs,
5108 struct ath11k_base *ab = ar->ab;
5109 struct ath11k_vif *arvif;
5113 lockdep_assert_held(&ar->conf_mutex);
5115 for (i = 0; i < n_vifs; i++) {
5116 arvif = (void *)vifs[i].vif->drv_priv;
5118 ath11k_dbg(ab, ATH11K_DBG_MAC,
5119 "mac chanctx switch vdev_id %i freq %hu->%hu width %d->%d\n",
5121 vifs[i].old_ctx->def.chan->center_freq,
5122 vifs[i].new_ctx->def.chan->center_freq,
5123 vifs[i].old_ctx->def.width,
5124 vifs[i].new_ctx->def.width);
5126 if (WARN_ON(!arvif->is_started))
5129 if (WARN_ON(!arvif->is_up))
5132 ret = ath11k_wmi_vdev_down(ar, arvif->vdev_id);
5134 ath11k_warn(ab, "failed to down vdev %d: %d\n",
5135 arvif->vdev_id, ret);
5140 /* All relevant vdevs are downed and associated channel resources
5141 * should be available for the channel switch now.
5144 /* TODO: Update ar->rx_channel */
5146 for (i = 0; i < n_vifs; i++) {
5147 arvif = (void *)vifs[i].vif->drv_priv;
5149 if (WARN_ON(!arvif->is_started))
5152 if (WARN_ON(!arvif->is_up))
5155 ret = ath11k_mac_setup_bcn_tmpl(arvif);
5157 ath11k_warn(ab, "failed to update bcn tmpl during csa: %d\n",
5160 ret = ath11k_mac_vdev_restart(arvif, &vifs[i].new_ctx->def);
5162 ath11k_warn(ab, "failed to restart vdev %d: %d\n",
5163 arvif->vdev_id, ret);
5167 ret = ath11k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
5170 ath11k_warn(ab, "failed to bring vdev up %d: %d\n",
5171 arvif->vdev_id, ret);
5178 ath11k_mac_update_active_vif_chan(struct ath11k *ar,
5179 struct ieee80211_chanctx_conf *ctx)
5181 struct ath11k_mac_change_chanctx_arg arg = { .ctx = ctx };
5183 lockdep_assert_held(&ar->conf_mutex);
5185 ieee80211_iterate_active_interfaces_atomic(ar->hw,
5186 IEEE80211_IFACE_ITER_NORMAL,
5187 ath11k_mac_change_chanctx_cnt_iter,
5189 if (arg.n_vifs == 0)
5192 arg.vifs = kcalloc(arg.n_vifs, sizeof(arg.vifs[0]), GFP_KERNEL);
5196 ieee80211_iterate_active_interfaces_atomic(ar->hw,
5197 IEEE80211_IFACE_ITER_NORMAL,
5198 ath11k_mac_change_chanctx_fill_iter,
5201 ath11k_mac_update_vif_chan(ar, arg.vifs, arg.n_vifs);
5206 static void ath11k_mac_op_change_chanctx(struct ieee80211_hw *hw,
5207 struct ieee80211_chanctx_conf *ctx,
5210 struct ath11k *ar = hw->priv;
5211 struct ath11k_base *ab = ar->ab;
5213 mutex_lock(&ar->conf_mutex);
5215 ath11k_dbg(ab, ATH11K_DBG_MAC,
5216 "mac chanctx change freq %hu width %d ptr %pK changed %x\n",
5217 ctx->def.chan->center_freq, ctx->def.width, ctx, changed);
5219 /* This shouldn't really happen because channel switching should use
5220 * switch_vif_chanctx().
5222 if (WARN_ON(changed & IEEE80211_CHANCTX_CHANGE_CHANNEL))
5225 if (changed & IEEE80211_CHANCTX_CHANGE_WIDTH)
5226 ath11k_mac_update_active_vif_chan(ar, ctx);
5228 /* TODO: Recalc radar detection */
5231 mutex_unlock(&ar->conf_mutex);
5234 static int ath11k_start_vdev_delay(struct ieee80211_hw *hw,
5235 struct ieee80211_vif *vif)
5237 struct ath11k *ar = hw->priv;
5238 struct ath11k_base *ab = ar->ab;
5239 struct ath11k_vif *arvif = (void *)vif->drv_priv;
5242 if (WARN_ON(arvif->is_started))
5245 ret = ath11k_mac_vdev_start(arvif, &arvif->chanctx.def);
5247 ath11k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n",
5248 arvif->vdev_id, vif->addr,
5249 arvif->chanctx.def.chan->center_freq, ret);
5253 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
5254 ret = ath11k_monitor_vdev_up(ar, arvif->vdev_id);
5256 ath11k_warn(ab, "failed put monitor up: %d\n", ret);
5261 arvif->is_started = true;
5263 /* TODO: Setup ps and cts/rts protection */
5268 ath11k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw,
5269 struct ieee80211_vif *vif,
5270 struct ieee80211_chanctx_conf *ctx)
5272 struct ath11k *ar = hw->priv;
5273 struct ath11k_base *ab = ar->ab;
5274 struct ath11k_vif *arvif = (void *)vif->drv_priv;
5276 struct peer_create_params param;
5278 mutex_lock(&ar->conf_mutex);
5280 ath11k_dbg(ab, ATH11K_DBG_MAC,
5281 "mac chanctx assign ptr %pK vdev_id %i\n",
5282 ctx, arvif->vdev_id);
5284 /* for QCA6390 bss peer must be created before vdev_start */
5285 if (ab->hw_params.vdev_start_delay &&
5286 arvif->vdev_type != WMI_VDEV_TYPE_AP &&
5287 arvif->vdev_type != WMI_VDEV_TYPE_MONITOR) {
5288 memcpy(&arvif->chanctx, ctx, sizeof(*ctx));
5293 if (WARN_ON(arvif->is_started)) {
5298 if (ab->hw_params.vdev_start_delay) {
5299 param.vdev_id = arvif->vdev_id;
5300 param.peer_type = WMI_PEER_TYPE_DEFAULT;
5301 param.peer_addr = ar->mac_addr;
5303 ret = ath11k_peer_create(ar, arvif, NULL, ¶m);
5305 ath11k_warn(ab, "failed to create peer after vdev start delay: %d",
5311 ret = ath11k_mac_vdev_start(arvif, &ctx->def);
5313 ath11k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n",
5314 arvif->vdev_id, vif->addr,
5315 ctx->def.chan->center_freq, ret);
5318 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
5319 ret = ath11k_monitor_vdev_up(ar, arvif->vdev_id);
5324 arvif->is_started = true;
5326 /* TODO: Setup ps and cts/rts protection */
5331 mutex_unlock(&ar->conf_mutex);
5337 ath11k_mac_op_unassign_vif_chanctx(struct ieee80211_hw *hw,
5338 struct ieee80211_vif *vif,
5339 struct ieee80211_chanctx_conf *ctx)
5341 struct ath11k *ar = hw->priv;
5342 struct ath11k_base *ab = ar->ab;
5343 struct ath11k_vif *arvif = (void *)vif->drv_priv;
5346 mutex_lock(&ar->conf_mutex);
5348 ath11k_dbg(ab, ATH11K_DBG_MAC,
5349 "mac chanctx unassign ptr %pK vdev_id %i\n",
5350 ctx, arvif->vdev_id);
5352 WARN_ON(!arvif->is_started);
5354 if (ab->hw_params.vdev_start_delay &&
5355 arvif->vdev_type == WMI_VDEV_TYPE_MONITOR &&
5356 ath11k_peer_find_by_addr(ab, ar->mac_addr))
5357 ath11k_peer_delete(ar, arvif->vdev_id, ar->mac_addr);
5359 ret = ath11k_mac_vdev_stop(arvif);
5361 ath11k_warn(ab, "failed to stop vdev %i: %d\n",
5362 arvif->vdev_id, ret);
5364 arvif->is_started = false;
5366 if (ab->hw_params.vdev_start_delay &&
5367 arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
5368 ath11k_wmi_vdev_down(ar, arvif->vdev_id);
5370 mutex_unlock(&ar->conf_mutex);
5374 ath11k_mac_op_switch_vif_chanctx(struct ieee80211_hw *hw,
5375 struct ieee80211_vif_chanctx_switch *vifs,
5377 enum ieee80211_chanctx_switch_mode mode)
5379 struct ath11k *ar = hw->priv;
5381 mutex_lock(&ar->conf_mutex);
5383 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
5384 "mac chanctx switch n_vifs %d mode %d\n",
5386 ath11k_mac_update_vif_chan(ar, vifs, n_vifs);
5388 mutex_unlock(&ar->conf_mutex);
5394 ath11k_set_vdev_param_to_all_vifs(struct ath11k *ar, int param, u32 value)
5396 struct ath11k_vif *arvif;
5399 mutex_lock(&ar->conf_mutex);
5400 list_for_each_entry(arvif, &ar->arvifs, list) {
5401 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "setting mac vdev %d param %d value %d\n",
5402 param, arvif->vdev_id, value);
5404 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
5407 ath11k_warn(ar->ab, "failed to set param %d for vdev %d: %d\n",
5408 param, arvif->vdev_id, ret);
5412 mutex_unlock(&ar->conf_mutex);
5416 /* mac80211 stores device specific RTS/Fragmentation threshold value,
5417 * this is set interface specific to firmware from ath11k driver
5419 static int ath11k_mac_op_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
5421 struct ath11k *ar = hw->priv;
5422 int param_id = WMI_VDEV_PARAM_RTS_THRESHOLD;
5424 return ath11k_set_vdev_param_to_all_vifs(ar, param_id, value);
5427 static int ath11k_mac_op_set_frag_threshold(struct ieee80211_hw *hw, u32 value)
5429 /* Even though there's a WMI vdev param for fragmentation threshold no
5430 * known firmware actually implements it. Moreover it is not possible to
5431 * rely frame fragmentation to mac80211 because firmware clears the
5432 * "more fragments" bit in frame control making it impossible for remote
5433 * devices to reassemble frames.
5435 * Hence implement a dummy callback just to say fragmentation isn't
5436 * supported. This effectively prevents mac80211 from doing frame
5437 * fragmentation in software.
5442 static void ath11k_mac_op_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
5443 u32 queues, bool drop)
5445 struct ath11k *ar = hw->priv;
5451 time_left = wait_event_timeout(ar->dp.tx_empty_waitq,
5452 (atomic_read(&ar->dp.num_tx_pending) == 0),
5453 ATH11K_FLUSH_TIMEOUT);
5455 ath11k_warn(ar->ab, "failed to flush transmit queue %ld\n", time_left);
5459 ath11k_mac_bitrate_mask_num_ht_rates(struct ath11k *ar,
5460 enum nl80211_band band,
5461 const struct cfg80211_bitrate_mask *mask)
5466 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++)
5467 num_rates += hweight16(mask->control[band].ht_mcs[i]);
5473 ath11k_mac_has_single_legacy_rate(struct ath11k *ar,
5474 enum nl80211_band band,
5475 const struct cfg80211_bitrate_mask *mask)
5479 num_rates = hweight32(mask->control[band].legacy);
5481 if (ath11k_mac_bitrate_mask_num_ht_rates(ar, band, mask))
5484 if (ath11k_mac_bitrate_mask_num_vht_rates(ar, band, mask))
5487 return num_rates == 1;
5491 ath11k_mac_bitrate_mask_get_single_nss(struct ath11k *ar,
5492 enum nl80211_band band,
5493 const struct cfg80211_bitrate_mask *mask,
5496 struct ieee80211_supported_band *sband = &ar->mac.sbands[band];
5497 u16 vht_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
5499 u8 vht_nss_mask = 0;
5502 /* No need to consider legacy here. Basic rates are always present
5506 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) {
5507 if (mask->control[band].ht_mcs[i] == 0)
5509 else if (mask->control[band].ht_mcs[i] ==
5510 sband->ht_cap.mcs.rx_mask[i])
5511 ht_nss_mask |= BIT(i);
5516 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
5517 if (mask->control[band].vht_mcs[i] == 0)
5519 else if (mask->control[band].vht_mcs[i] ==
5520 ath11k_mac_get_max_vht_mcs_map(vht_mcs_map, i))
5521 vht_nss_mask |= BIT(i);
5526 if (ht_nss_mask != vht_nss_mask)
5529 if (ht_nss_mask == 0)
5532 if (BIT(fls(ht_nss_mask)) - 1 != ht_nss_mask)
5535 *nss = fls(ht_nss_mask);
5541 ath11k_mac_get_single_legacy_rate(struct ath11k *ar,
5542 enum nl80211_band band,
5543 const struct cfg80211_bitrate_mask *mask,
5551 if (hweight32(mask->control[band].legacy) != 1)
5554 rate_idx = ffs(mask->control[band].legacy) - 1;
5556 if (band == NL80211_BAND_5GHZ || band == NL80211_BAND_6GHZ)
5557 rate_idx += ATH11K_MAC_FIRST_OFDM_RATE_IDX;
5559 hw_rate = ath11k_legacy_rates[rate_idx].hw_value;
5560 bitrate = ath11k_legacy_rates[rate_idx].bitrate;
5562 if (ath11k_mac_bitrate_is_cck(bitrate))
5563 preamble = WMI_RATE_PREAMBLE_CCK;
5565 preamble = WMI_RATE_PREAMBLE_OFDM;
5568 *rate = ATH11K_HW_RATE_CODE(hw_rate, 0, preamble);
5573 static int ath11k_mac_set_fixed_rate_params(struct ath11k_vif *arvif,
5574 u32 rate, u8 nss, u8 sgi, u8 ldpc)
5576 struct ath11k *ar = arvif->ar;
5580 lockdep_assert_held(&ar->conf_mutex);
5582 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac set fixed rate params vdev %i rate 0x%02hhx nss %hhu sgi %hhu\n",
5583 arvif->vdev_id, rate, nss, sgi);
5585 vdev_param = WMI_VDEV_PARAM_FIXED_RATE;
5586 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
5589 ath11k_warn(ar->ab, "failed to set fixed rate param 0x%02x: %d\n",
5594 vdev_param = WMI_VDEV_PARAM_NSS;
5595 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
5598 ath11k_warn(ar->ab, "failed to set nss param %d: %d\n",
5603 vdev_param = WMI_VDEV_PARAM_SGI;
5604 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
5607 ath11k_warn(ar->ab, "failed to set sgi param %d: %d\n",
5612 vdev_param = WMI_VDEV_PARAM_LDPC;
5613 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
5616 ath11k_warn(ar->ab, "failed to set ldpc param %d: %d\n",
5625 ath11k_mac_vht_mcs_range_present(struct ath11k *ar,
5626 enum nl80211_band band,
5627 const struct cfg80211_bitrate_mask *mask)
5632 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
5633 vht_mcs = mask->control[band].vht_mcs[i];
5649 static void ath11k_mac_set_bitrate_mask_iter(void *data,
5650 struct ieee80211_sta *sta)
5652 struct ath11k_vif *arvif = data;
5653 struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
5654 struct ath11k *ar = arvif->ar;
5656 spin_lock_bh(&ar->data_lock);
5657 arsta->changed |= IEEE80211_RC_SUPP_RATES_CHANGED;
5658 spin_unlock_bh(&ar->data_lock);
5660 ieee80211_queue_work(ar->hw, &arsta->update_wk);
5663 static void ath11k_mac_disable_peer_fixed_rate(void *data,
5664 struct ieee80211_sta *sta)
5666 struct ath11k_vif *arvif = data;
5667 struct ath11k *ar = arvif->ar;
5670 ret = ath11k_wmi_set_peer_param(ar, sta->addr,
5672 WMI_PEER_PARAM_FIXED_RATE,
5673 WMI_FIXED_RATE_NONE);
5676 "failed to disable peer fixed rate for STA %pM ret %d\n",
5681 ath11k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw,
5682 struct ieee80211_vif *vif,
5683 const struct cfg80211_bitrate_mask *mask)
5685 struct ath11k_vif *arvif = (void *)vif->drv_priv;
5686 struct cfg80211_chan_def def;
5687 struct ath11k *ar = arvif->ar;
5688 enum nl80211_band band;
5689 const u8 *ht_mcs_mask;
5690 const u16 *vht_mcs_mask;
5699 if (ath11k_mac_vif_chan(vif, &def))
5702 band = def.chan->band;
5703 ht_mcs_mask = mask->control[band].ht_mcs;
5704 vht_mcs_mask = mask->control[band].vht_mcs;
5705 ldpc = !!(ar->ht_cap_info & WMI_HT_CAP_LDPC);
5707 sgi = mask->control[band].gi;
5708 if (sgi == NL80211_TXRATE_FORCE_LGI)
5711 /* mac80211 doesn't support sending a fixed HT/VHT MCS alone, rather it
5712 * requires passing atleast one of used basic rates along with them.
5713 * Fixed rate setting across different preambles(legacy, HT, VHT) is
5714 * not supported by the FW. Hence use of FIXED_RATE vdev param is not
5715 * suitable for setting single HT/VHT rates.
5716 * But, there could be a single basic rate passed from userspace which
5717 * can be done through the FIXED_RATE param.
5719 if (ath11k_mac_has_single_legacy_rate(ar, band, mask)) {
5720 ret = ath11k_mac_get_single_legacy_rate(ar, band, mask, &rate,
5723 ath11k_warn(ar->ab, "failed to get single legacy rate for vdev %i: %d\n",
5724 arvif->vdev_id, ret);
5727 ieee80211_iterate_stations_atomic(ar->hw,
5728 ath11k_mac_disable_peer_fixed_rate,
5730 } else if (ath11k_mac_bitrate_mask_get_single_nss(ar, band, mask,
5732 rate = WMI_FIXED_RATE_NONE;
5735 rate = WMI_FIXED_RATE_NONE;
5736 nss = min_t(u32, ar->num_tx_chains,
5737 max(ath11k_mac_max_ht_nss(ht_mcs_mask),
5738 ath11k_mac_max_vht_nss(vht_mcs_mask)));
5740 /* If multiple rates across different preambles are given
5741 * we can reconfigure this info with all peers using PEER_ASSOC
5742 * command with the below exception cases.
5743 * - Single VHT Rate : peer_assoc command accommodates only MCS
5744 * range values i.e 0-7, 0-8, 0-9 for VHT. Though mac80211
5745 * mandates passing basic rates along with HT/VHT rates, FW
5746 * doesn't allow switching from VHT to Legacy. Hence instead of
5747 * setting legacy and VHT rates using RATEMASK_CMD vdev cmd,
5748 * we could set this VHT rate as peer fixed rate param, which
5749 * will override FIXED rate and FW rate control algorithm.
5750 * If single VHT rate is passed along with HT rates, we select
5751 * the VHT rate as fixed rate for vht peers.
5752 * - Multiple VHT Rates : When Multiple VHT rates are given,this
5753 * can be set using RATEMASK CMD which uses FW rate-ctl alg.
5754 * TODO: Setting multiple VHT MCS and replacing peer_assoc with
5755 * RATEMASK_CMDID can cover all use cases of setting rates
5756 * across multiple preambles and rates within same type.
5757 * But requires more validation of the command at this point.
5760 num_rates = ath11k_mac_bitrate_mask_num_vht_rates(ar, band,
5763 if (!ath11k_mac_vht_mcs_range_present(ar, band, mask) &&
5765 /* TODO: Handle multiple VHT MCS values setting using
5769 "Setting more than one MCS Value in bitrate mask not supported\n");
5773 ieee80211_iterate_stations_atomic(ar->hw,
5774 ath11k_mac_disable_peer_fixed_rate,
5777 mutex_lock(&ar->conf_mutex);
5779 arvif->bitrate_mask = *mask;
5780 ieee80211_iterate_stations_atomic(ar->hw,
5781 ath11k_mac_set_bitrate_mask_iter,
5784 mutex_unlock(&ar->conf_mutex);
5787 mutex_lock(&ar->conf_mutex);
5789 ret = ath11k_mac_set_fixed_rate_params(arvif, rate, nss, sgi, ldpc);
5791 ath11k_warn(ar->ab, "failed to set fixed rate params on vdev %i: %d\n",
5792 arvif->vdev_id, ret);
5795 mutex_unlock(&ar->conf_mutex);
5801 ath11k_mac_op_reconfig_complete(struct ieee80211_hw *hw,
5802 enum ieee80211_reconfig_type reconfig_type)
5804 struct ath11k *ar = hw->priv;
5806 if (reconfig_type != IEEE80211_RECONFIG_TYPE_RESTART)
5809 mutex_lock(&ar->conf_mutex);
5811 if (ar->state == ATH11K_STATE_RESTARTED) {
5812 ath11k_warn(ar->ab, "pdev %d successfully recovered\n",
5814 ar->state = ATH11K_STATE_ON;
5815 ieee80211_wake_queues(ar->hw);
5818 mutex_unlock(&ar->conf_mutex);
5822 ath11k_mac_update_bss_chan_survey(struct ath11k *ar,
5823 struct ieee80211_channel *channel)
5826 enum wmi_bss_chan_info_req_type type = WMI_BSS_SURVEY_REQ_TYPE_READ;
5828 lockdep_assert_held(&ar->conf_mutex);
5830 if (!test_bit(WMI_TLV_SERVICE_BSS_CHANNEL_INFO_64, ar->ab->wmi_ab.svc_map) ||
5831 ar->rx_channel != channel)
5834 if (ar->scan.state != ATH11K_SCAN_IDLE) {
5835 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
5836 "ignoring bss chan info req while scanning..\n");
5840 reinit_completion(&ar->bss_survey_done);
5842 ret = ath11k_wmi_pdev_bss_chan_info_request(ar, type);
5844 ath11k_warn(ar->ab, "failed to send pdev bss chan info request\n");
5848 ret = wait_for_completion_timeout(&ar->bss_survey_done, 3 * HZ);
5850 ath11k_warn(ar->ab, "bss channel survey timed out\n");
5853 static int ath11k_mac_op_get_survey(struct ieee80211_hw *hw, int idx,
5854 struct survey_info *survey)
5856 struct ath11k *ar = hw->priv;
5857 struct ieee80211_supported_band *sband;
5858 struct survey_info *ar_survey;
5861 if (idx >= ATH11K_NUM_CHANS)
5864 ar_survey = &ar->survey[idx];
5866 mutex_lock(&ar->conf_mutex);
5868 sband = hw->wiphy->bands[NL80211_BAND_2GHZ];
5869 if (sband && idx >= sband->n_channels) {
5870 idx -= sband->n_channels;
5875 sband = hw->wiphy->bands[NL80211_BAND_5GHZ];
5877 if (!sband || idx >= sband->n_channels) {
5882 ath11k_mac_update_bss_chan_survey(ar, &sband->channels[idx]);
5884 spin_lock_bh(&ar->data_lock);
5885 memcpy(survey, ar_survey, sizeof(*survey));
5886 spin_unlock_bh(&ar->data_lock);
5888 survey->channel = &sband->channels[idx];
5890 if (ar->rx_channel == survey->channel)
5891 survey->filled |= SURVEY_INFO_IN_USE;
5894 mutex_unlock(&ar->conf_mutex);
5898 static void ath11k_mac_op_sta_statistics(struct ieee80211_hw *hw,
5899 struct ieee80211_vif *vif,
5900 struct ieee80211_sta *sta,
5901 struct station_info *sinfo)
5903 struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
5905 sinfo->rx_duration = arsta->rx_duration;
5906 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_DURATION);
5908 sinfo->tx_duration = arsta->tx_duration;
5909 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_DURATION);
5911 if (!arsta->txrate.legacy && !arsta->txrate.nss)
5914 if (arsta->txrate.legacy) {
5915 sinfo->txrate.legacy = arsta->txrate.legacy;
5917 sinfo->txrate.mcs = arsta->txrate.mcs;
5918 sinfo->txrate.nss = arsta->txrate.nss;
5919 sinfo->txrate.bw = arsta->txrate.bw;
5920 sinfo->txrate.he_gi = arsta->txrate.he_gi;
5921 sinfo->txrate.he_dcm = arsta->txrate.he_dcm;
5922 sinfo->txrate.he_ru_alloc = arsta->txrate.he_ru_alloc;
5924 sinfo->txrate.flags = arsta->txrate.flags;
5925 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
5927 /* TODO: Use real NF instead of default one. */
5928 sinfo->signal = arsta->rssi_comb + ATH11K_DEFAULT_NOISE_FLOOR;
5931 static const struct ieee80211_ops ath11k_ops = {
5932 .tx = ath11k_mac_op_tx,
5933 .start = ath11k_mac_op_start,
5934 .stop = ath11k_mac_op_stop,
5935 .reconfig_complete = ath11k_mac_op_reconfig_complete,
5936 .add_interface = ath11k_mac_op_add_interface,
5937 .remove_interface = ath11k_mac_op_remove_interface,
5938 .update_vif_offload = ath11k_mac_op_update_vif_offload,
5939 .config = ath11k_mac_op_config,
5940 .bss_info_changed = ath11k_mac_op_bss_info_changed,
5941 .configure_filter = ath11k_mac_op_configure_filter,
5942 .hw_scan = ath11k_mac_op_hw_scan,
5943 .cancel_hw_scan = ath11k_mac_op_cancel_hw_scan,
5944 .set_key = ath11k_mac_op_set_key,
5945 .sta_state = ath11k_mac_op_sta_state,
5946 .sta_set_txpwr = ath11k_mac_op_sta_set_txpwr,
5947 .sta_rc_update = ath11k_mac_op_sta_rc_update,
5948 .conf_tx = ath11k_mac_op_conf_tx,
5949 .set_antenna = ath11k_mac_op_set_antenna,
5950 .get_antenna = ath11k_mac_op_get_antenna,
5951 .ampdu_action = ath11k_mac_op_ampdu_action,
5952 .add_chanctx = ath11k_mac_op_add_chanctx,
5953 .remove_chanctx = ath11k_mac_op_remove_chanctx,
5954 .change_chanctx = ath11k_mac_op_change_chanctx,
5955 .assign_vif_chanctx = ath11k_mac_op_assign_vif_chanctx,
5956 .unassign_vif_chanctx = ath11k_mac_op_unassign_vif_chanctx,
5957 .switch_vif_chanctx = ath11k_mac_op_switch_vif_chanctx,
5958 .set_rts_threshold = ath11k_mac_op_set_rts_threshold,
5959 .set_frag_threshold = ath11k_mac_op_set_frag_threshold,
5960 .set_bitrate_mask = ath11k_mac_op_set_bitrate_mask,
5961 .get_survey = ath11k_mac_op_get_survey,
5962 .flush = ath11k_mac_op_flush,
5963 .sta_statistics = ath11k_mac_op_sta_statistics,
5964 CFG80211_TESTMODE_CMD(ath11k_tm_cmd)
5965 #ifdef CONFIG_ATH11K_DEBUGFS
5966 .sta_add_debugfs = ath11k_debugfs_sta_op_add,
5970 static void ath11k_mac_update_ch_list(struct ath11k *ar,
5971 struct ieee80211_supported_band *band,
5972 u32 freq_low, u32 freq_high)
5976 if (!(freq_low && freq_high))
5979 for (i = 0; i < band->n_channels; i++) {
5980 if (band->channels[i].center_freq < freq_low ||
5981 band->channels[i].center_freq > freq_high)
5982 band->channels[i].flags |= IEEE80211_CHAN_DISABLED;
5986 static u32 ath11k_get_phy_id(struct ath11k *ar, u32 band)
5988 struct ath11k_pdev *pdev = ar->pdev;
5989 struct ath11k_pdev_cap *pdev_cap = &pdev->cap;
5991 if (band == WMI_HOST_WLAN_2G_CAP)
5992 return pdev_cap->band[NL80211_BAND_2GHZ].phy_id;
5994 if (band == WMI_HOST_WLAN_5G_CAP)
5995 return pdev_cap->band[NL80211_BAND_5GHZ].phy_id;
5997 ath11k_warn(ar->ab, "unsupported phy cap:%d\n", band);
6002 static int ath11k_mac_setup_channels_rates(struct ath11k *ar,
6003 u32 supported_bands)
6005 struct ieee80211_supported_band *band;
6006 struct ath11k_hal_reg_capabilities_ext *reg_cap;
6010 BUILD_BUG_ON((ARRAY_SIZE(ath11k_2ghz_channels) +
6011 ARRAY_SIZE(ath11k_5ghz_channels) +
6012 ARRAY_SIZE(ath11k_6ghz_channels)) !=
6015 reg_cap = &ar->ab->hal_reg_cap[ar->pdev_idx];
6017 if (supported_bands & WMI_HOST_WLAN_2G_CAP) {
6018 channels = kmemdup(ath11k_2ghz_channels,
6019 sizeof(ath11k_2ghz_channels),
6024 band = &ar->mac.sbands[NL80211_BAND_2GHZ];
6025 band->band = NL80211_BAND_2GHZ;
6026 band->n_channels = ARRAY_SIZE(ath11k_2ghz_channels);
6027 band->channels = channels;
6028 band->n_bitrates = ath11k_g_rates_size;
6029 band->bitrates = ath11k_g_rates;
6030 ar->hw->wiphy->bands[NL80211_BAND_2GHZ] = band;
6032 if (ar->ab->hw_params.single_pdev_only) {
6033 phy_id = ath11k_get_phy_id(ar, WMI_HOST_WLAN_2G_CAP);
6034 reg_cap = &ar->ab->hal_reg_cap[phy_id];
6036 ath11k_mac_update_ch_list(ar, band,
6037 reg_cap->low_2ghz_chan,
6038 reg_cap->high_2ghz_chan);
6041 if (supported_bands & WMI_HOST_WLAN_5G_CAP) {
6042 if (reg_cap->high_5ghz_chan >= ATH11K_MAX_6G_FREQ) {
6043 channels = kmemdup(ath11k_6ghz_channels,
6044 sizeof(ath11k_6ghz_channels), GFP_KERNEL);
6046 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
6050 ar->supports_6ghz = true;
6051 band = &ar->mac.sbands[NL80211_BAND_6GHZ];
6052 band->band = NL80211_BAND_6GHZ;
6053 band->n_channels = ARRAY_SIZE(ath11k_6ghz_channels);
6054 band->channels = channels;
6055 band->n_bitrates = ath11k_a_rates_size;
6056 band->bitrates = ath11k_a_rates;
6057 ar->hw->wiphy->bands[NL80211_BAND_6GHZ] = band;
6058 ath11k_mac_update_ch_list(ar, band,
6059 reg_cap->low_5ghz_chan,
6060 reg_cap->high_5ghz_chan);
6063 if (reg_cap->low_5ghz_chan < ATH11K_MIN_6G_FREQ) {
6064 channels = kmemdup(ath11k_5ghz_channels,
6065 sizeof(ath11k_5ghz_channels),
6068 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
6069 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
6073 band = &ar->mac.sbands[NL80211_BAND_5GHZ];
6074 band->band = NL80211_BAND_5GHZ;
6075 band->n_channels = ARRAY_SIZE(ath11k_5ghz_channels);
6076 band->channels = channels;
6077 band->n_bitrates = ath11k_a_rates_size;
6078 band->bitrates = ath11k_a_rates;
6079 ar->hw->wiphy->bands[NL80211_BAND_5GHZ] = band;
6081 if (ar->ab->hw_params.single_pdev_only) {
6082 phy_id = ath11k_get_phy_id(ar, WMI_HOST_WLAN_5G_CAP);
6083 reg_cap = &ar->ab->hal_reg_cap[phy_id];
6086 ath11k_mac_update_ch_list(ar, band,
6087 reg_cap->low_5ghz_chan,
6088 reg_cap->high_5ghz_chan);
6095 static int ath11k_mac_setup_iface_combinations(struct ath11k *ar)
6097 struct ath11k_base *ab = ar->ab;
6098 struct ieee80211_iface_combination *combinations;
6099 struct ieee80211_iface_limit *limits;
6102 combinations = kzalloc(sizeof(*combinations), GFP_KERNEL);
6108 limits = kcalloc(n_limits, sizeof(*limits), GFP_KERNEL);
6110 kfree(combinations);
6115 limits[0].types |= BIT(NL80211_IFTYPE_STATION);
6118 limits[1].types |= BIT(NL80211_IFTYPE_AP);
6120 if (IS_ENABLED(CONFIG_MAC80211_MESH) &&
6121 ab->hw_params.interface_modes & BIT(NL80211_IFTYPE_MESH_POINT))
6122 limits[1].types |= BIT(NL80211_IFTYPE_MESH_POINT);
6124 combinations[0].limits = limits;
6125 combinations[0].n_limits = n_limits;
6126 combinations[0].max_interfaces = 16;
6127 combinations[0].num_different_channels = 1;
6128 combinations[0].beacon_int_infra_match = true;
6129 combinations[0].beacon_int_min_gcd = 100;
6130 combinations[0].radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
6131 BIT(NL80211_CHAN_WIDTH_20) |
6132 BIT(NL80211_CHAN_WIDTH_40) |
6133 BIT(NL80211_CHAN_WIDTH_80);
6135 ar->hw->wiphy->iface_combinations = combinations;
6136 ar->hw->wiphy->n_iface_combinations = 1;
6141 static const u8 ath11k_if_types_ext_capa[] = {
6142 [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
6143 [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
6146 static const u8 ath11k_if_types_ext_capa_sta[] = {
6147 [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
6148 [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
6149 [9] = WLAN_EXT_CAPA10_TWT_REQUESTER_SUPPORT,
6152 static const u8 ath11k_if_types_ext_capa_ap[] = {
6153 [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
6154 [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
6155 [9] = WLAN_EXT_CAPA10_TWT_RESPONDER_SUPPORT,
6158 static const struct wiphy_iftype_ext_capab ath11k_iftypes_ext_capa[] = {
6160 .extended_capabilities = ath11k_if_types_ext_capa,
6161 .extended_capabilities_mask = ath11k_if_types_ext_capa,
6162 .extended_capabilities_len = sizeof(ath11k_if_types_ext_capa),
6164 .iftype = NL80211_IFTYPE_STATION,
6165 .extended_capabilities = ath11k_if_types_ext_capa_sta,
6166 .extended_capabilities_mask = ath11k_if_types_ext_capa_sta,
6167 .extended_capabilities_len =
6168 sizeof(ath11k_if_types_ext_capa_sta),
6170 .iftype = NL80211_IFTYPE_AP,
6171 .extended_capabilities = ath11k_if_types_ext_capa_ap,
6172 .extended_capabilities_mask = ath11k_if_types_ext_capa_ap,
6173 .extended_capabilities_len =
6174 sizeof(ath11k_if_types_ext_capa_ap),
6178 static void __ath11k_mac_unregister(struct ath11k *ar)
6180 cancel_work_sync(&ar->regd_update_work);
6182 ieee80211_unregister_hw(ar->hw);
6184 idr_for_each(&ar->txmgmt_idr, ath11k_mac_tx_mgmt_pending_free, ar);
6185 idr_destroy(&ar->txmgmt_idr);
6187 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
6188 kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels);
6189 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
6191 kfree(ar->hw->wiphy->iface_combinations[0].limits);
6192 kfree(ar->hw->wiphy->iface_combinations);
6194 SET_IEEE80211_DEV(ar->hw, NULL);
6197 void ath11k_mac_unregister(struct ath11k_base *ab)
6200 struct ath11k_pdev *pdev;
6203 for (i = 0; i < ab->num_radios; i++) {
6204 pdev = &ab->pdevs[i];
6209 __ath11k_mac_unregister(ar);
6213 static int __ath11k_mac_register(struct ath11k *ar)
6215 struct ath11k_base *ab = ar->ab;
6216 struct ath11k_pdev_cap *cap = &ar->pdev->cap;
6217 static const u32 cipher_suites[] = {
6218 WLAN_CIPHER_SUITE_TKIP,
6219 WLAN_CIPHER_SUITE_CCMP,
6220 WLAN_CIPHER_SUITE_AES_CMAC,
6221 WLAN_CIPHER_SUITE_BIP_CMAC_256,
6222 WLAN_CIPHER_SUITE_BIP_GMAC_128,
6223 WLAN_CIPHER_SUITE_BIP_GMAC_256,
6224 WLAN_CIPHER_SUITE_GCMP,
6225 WLAN_CIPHER_SUITE_GCMP_256,
6226 WLAN_CIPHER_SUITE_CCMP_256,
6231 ath11k_pdev_caps_update(ar);
6233 SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr);
6235 SET_IEEE80211_DEV(ar->hw, ab->dev);
6237 ret = ath11k_mac_setup_channels_rates(ar,
6238 cap->supported_bands);
6242 ath11k_mac_setup_ht_vht_cap(ar, cap, &ht_cap);
6243 ath11k_mac_setup_he_cap(ar, cap);
6245 ret = ath11k_mac_setup_iface_combinations(ar);
6247 ath11k_err(ar->ab, "failed to setup interface combinations: %d\n", ret);
6248 goto err_free_channels;
6251 ar->hw->wiphy->available_antennas_rx = cap->rx_chain_mask;
6252 ar->hw->wiphy->available_antennas_tx = cap->tx_chain_mask;
6254 ar->hw->wiphy->interface_modes = ab->hw_params.interface_modes;
6256 ieee80211_hw_set(ar->hw, SIGNAL_DBM);
6257 ieee80211_hw_set(ar->hw, SUPPORTS_PS);
6258 ieee80211_hw_set(ar->hw, SUPPORTS_DYNAMIC_PS);
6259 ieee80211_hw_set(ar->hw, MFP_CAPABLE);
6260 ieee80211_hw_set(ar->hw, REPORTS_TX_ACK_STATUS);
6261 ieee80211_hw_set(ar->hw, HAS_RATE_CONTROL);
6262 ieee80211_hw_set(ar->hw, AP_LINK_PS);
6263 ieee80211_hw_set(ar->hw, SPECTRUM_MGMT);
6264 ieee80211_hw_set(ar->hw, CONNECTION_MONITOR);
6265 ieee80211_hw_set(ar->hw, SUPPORTS_PER_STA_GTK);
6266 ieee80211_hw_set(ar->hw, WANT_MONITOR_VIF);
6267 ieee80211_hw_set(ar->hw, CHANCTX_STA_CSA);
6268 ieee80211_hw_set(ar->hw, QUEUE_CONTROL);
6269 ieee80211_hw_set(ar->hw, SUPPORTS_TX_FRAG);
6270 ieee80211_hw_set(ar->hw, REPORTS_LOW_ACK);
6271 ieee80211_hw_set(ar->hw, SUPPORTS_TX_ENCAP_OFFLOAD);
6272 if (ht_cap & WMI_HT_CAP_ENABLED) {
6273 ieee80211_hw_set(ar->hw, AMPDU_AGGREGATION);
6274 ieee80211_hw_set(ar->hw, TX_AMPDU_SETUP_IN_HW);
6275 ieee80211_hw_set(ar->hw, SUPPORTS_REORDERING_BUFFER);
6276 ieee80211_hw_set(ar->hw, SUPPORTS_AMSDU_IN_AMPDU);
6277 ieee80211_hw_set(ar->hw, USES_RSS);
6280 ar->hw->wiphy->features |= NL80211_FEATURE_STATIC_SMPS;
6281 ar->hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
6283 /* TODO: Check if HT capability advertised from firmware is different
6284 * for each band for a dual band capable radio. It will be tricky to
6285 * handle it when the ht capability different for each band.
6287 if (ht_cap & WMI_HT_CAP_DYNAMIC_SMPS)
6288 ar->hw->wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS;
6290 ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID;
6291 ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN;
6293 ar->hw->max_listen_interval = ATH11K_MAX_HW_LISTEN_INTERVAL;
6295 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
6296 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
6297 ar->hw->wiphy->max_remain_on_channel_duration = 5000;
6299 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
6300 ar->hw->wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE |
6301 NL80211_FEATURE_AP_SCAN;
6303 ar->max_num_stations = TARGET_NUM_STATIONS;
6304 ar->max_num_peers = TARGET_NUM_PEERS_PDEV;
6306 ar->hw->wiphy->max_ap_assoc_sta = ar->max_num_stations;
6308 ar->hw->queues = ATH11K_HW_MAX_QUEUES;
6309 ar->hw->wiphy->tx_queue_len = ATH11K_QUEUE_LEN;
6310 ar->hw->offchannel_tx_hw_queue = ATH11K_HW_MAX_QUEUES - 1;
6311 ar->hw->max_rx_aggregation_subframes = IEEE80211_MAX_AMPDU_BUF;
6313 ar->hw->vif_data_size = sizeof(struct ath11k_vif);
6314 ar->hw->sta_data_size = sizeof(struct ath11k_sta);
6316 wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
6317 wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_STA_TX_PWR);
6319 ar->hw->wiphy->cipher_suites = cipher_suites;
6320 ar->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
6322 ar->hw->wiphy->iftype_ext_capab = ath11k_iftypes_ext_capa;
6323 ar->hw->wiphy->num_iftype_ext_capab =
6324 ARRAY_SIZE(ath11k_iftypes_ext_capa);
6326 if (ar->supports_6ghz) {
6327 wiphy_ext_feature_set(ar->hw->wiphy,
6328 NL80211_EXT_FEATURE_FILS_DISCOVERY);
6329 wiphy_ext_feature_set(ar->hw->wiphy,
6330 NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP);
6333 ath11k_reg_init(ar);
6335 if (!test_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags)) {
6336 ar->hw->netdev_features = NETIF_F_HW_CSUM;
6337 ieee80211_hw_set(ar->hw, SW_CRYPTO_CONTROL);
6338 ieee80211_hw_set(ar->hw, SUPPORT_FAST_XMIT);
6341 ret = ieee80211_register_hw(ar->hw);
6343 ath11k_err(ar->ab, "ieee80211 registration failed: %d\n", ret);
6344 goto err_free_if_combs;
6347 if (!ab->hw_params.supports_monitor)
6348 /* There's a race between calling ieee80211_register_hw()
6349 * and here where the monitor mode is enabled for a little
6350 * while. But that time is so short and in practise it make
6351 * a difference in real life.
6353 ar->hw->wiphy->interface_modes &= ~BIT(NL80211_IFTYPE_MONITOR);
6355 /* Apply the regd received during initialization */
6356 ret = ath11k_regd_update(ar, true);
6358 ath11k_err(ar->ab, "ath11k regd update failed: %d\n", ret);
6359 goto err_free_if_combs;
6362 ret = ath11k_debugfs_register(ar);
6364 ath11k_err(ar->ab, "debugfs registration failed: %d\n", ret);
6365 goto err_free_if_combs;
6371 kfree(ar->hw->wiphy->iface_combinations[0].limits);
6372 kfree(ar->hw->wiphy->iface_combinations);
6375 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
6376 kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels);
6377 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
6380 SET_IEEE80211_DEV(ar->hw, NULL);
6384 int ath11k_mac_register(struct ath11k_base *ab)
6387 struct ath11k_pdev *pdev;
6391 if (test_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags))
6394 for (i = 0; i < ab->num_radios; i++) {
6395 pdev = &ab->pdevs[i];
6397 if (ab->pdevs_macaddr_valid) {
6398 ether_addr_copy(ar->mac_addr, pdev->mac_addr);
6400 ether_addr_copy(ar->mac_addr, ab->mac_addr);
6401 ar->mac_addr[4] += i;
6404 ret = __ath11k_mac_register(ar);
6408 idr_init(&ar->txmgmt_idr);
6409 spin_lock_init(&ar->txmgmt_idr_lock);
6412 /* Initialize channel counters frequency value in hertz */
6413 ab->cc_freq_hz = IPQ8074_CC_FREQ_HERTZ;
6414 ab->free_vdev_map = (1LL << (ab->num_radios * TARGET_NUM_VDEVS)) - 1;
6419 for (i = i - 1; i >= 0; i--) {
6420 pdev = &ab->pdevs[i];
6422 __ath11k_mac_unregister(ar);
6428 int ath11k_mac_allocate(struct ath11k_base *ab)
6430 struct ieee80211_hw *hw;
6432 struct ath11k_pdev *pdev;
6436 if (test_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags))
6439 for (i = 0; i < ab->num_radios; i++) {
6440 pdev = &ab->pdevs[i];
6441 hw = ieee80211_alloc_hw(sizeof(struct ath11k), &ath11k_ops);
6443 ath11k_warn(ab, "failed to allocate mac80211 hw device\n");
6453 ar->lmac_id = ath11k_hw_get_mac_from_pdev_id(&ab->hw_params, i);
6455 ar->wmi = &ab->wmi_ab.wmi[i];
6456 /* FIXME wmi[0] is already initialized during attach,
6457 * Should we do this again?
6459 ath11k_wmi_pdev_attach(ab, i);
6461 ar->cfg_tx_chainmask = pdev->cap.tx_chain_mask;
6462 ar->cfg_rx_chainmask = pdev->cap.rx_chain_mask;
6463 ar->num_tx_chains = get_num_chains(pdev->cap.tx_chain_mask);
6464 ar->num_rx_chains = get_num_chains(pdev->cap.rx_chain_mask);
6467 spin_lock_init(&ar->data_lock);
6468 INIT_LIST_HEAD(&ar->arvifs);
6469 INIT_LIST_HEAD(&ar->ppdu_stats_info);
6470 mutex_init(&ar->conf_mutex);
6471 init_completion(&ar->vdev_setup_done);
6472 init_completion(&ar->vdev_delete_done);
6473 init_completion(&ar->peer_assoc_done);
6474 init_completion(&ar->peer_delete_done);
6475 init_completion(&ar->install_key_done);
6476 init_completion(&ar->bss_survey_done);
6477 init_completion(&ar->scan.started);
6478 init_completion(&ar->scan.completed);
6479 init_completion(&ar->thermal.wmi_sync);
6481 INIT_DELAYED_WORK(&ar->scan.timeout, ath11k_scan_timeout_work);
6482 INIT_WORK(&ar->regd_update_work, ath11k_regd_update_work);
6484 INIT_WORK(&ar->wmi_mgmt_tx_work, ath11k_mgmt_over_wmi_tx_work);
6485 skb_queue_head_init(&ar->wmi_mgmt_tx_queue);
6486 clear_bit(ATH11K_FLAG_MONITOR_ENABLED, &ar->monitor_flags);
6492 ath11k_mac_destroy(ab);
6497 void ath11k_mac_destroy(struct ath11k_base *ab)
6500 struct ath11k_pdev *pdev;
6503 for (i = 0; i < ab->num_radios; i++) {
6504 pdev = &ab->pdevs[i];
6509 ieee80211_free_hw(ar->hw);