1 // SPDX-License-Identifier: ISC
2 /* Copyright (C) 2020 MediaTek Inc. */
4 #include "mt76_connac_mcu.h"
6 int mt76_connac_mcu_start_firmware(struct mt76_dev *dev, u32 addr, u32 option)
12 .option = cpu_to_le32(option),
13 .addr = cpu_to_le32(addr),
16 return mt76_mcu_send_msg(dev, MCU_CMD_FW_START_REQ, &req, sizeof(req),
19 EXPORT_SYMBOL_GPL(mt76_connac_mcu_start_firmware);
21 int mt76_connac_mcu_patch_sem_ctrl(struct mt76_dev *dev, bool get)
23 u32 op = get ? PATCH_SEM_GET : PATCH_SEM_RELEASE;
27 .op = cpu_to_le32(op),
30 return mt76_mcu_send_msg(dev, MCU_CMD_PATCH_SEM_CONTROL, &req,
33 EXPORT_SYMBOL_GPL(mt76_connac_mcu_patch_sem_ctrl);
35 int mt76_connac_mcu_start_patch(struct mt76_dev *dev)
44 return mt76_mcu_send_msg(dev, MCU_CMD_PATCH_FINISH_REQ, &req,
47 EXPORT_SYMBOL_GPL(mt76_connac_mcu_start_patch);
49 #define MCU_PATCH_ADDRESS 0x200000
51 int mt76_connac_mcu_init_download(struct mt76_dev *dev, u32 addr, u32 len,
59 .addr = cpu_to_le32(addr),
60 .len = cpu_to_le32(len),
61 .mode = cpu_to_le32(mode),
66 (req.addr == cpu_to_le32(MCU_PATCH_ADDRESS) || addr == 0x900000))
67 cmd = MCU_CMD_PATCH_START_REQ;
69 cmd = MCU_CMD_TARGET_ADDRESS_LEN_REQ;
71 return mt76_mcu_send_msg(dev, cmd, &req, sizeof(req), true);
73 EXPORT_SYMBOL_GPL(mt76_connac_mcu_init_download);
75 int mt76_connac_mcu_set_channel_domain(struct mt76_phy *phy)
77 struct mt76_dev *dev = phy->dev;
78 struct mt76_connac_mcu_channel_domain {
79 u8 alpha2[4]; /* regulatory_request.alpha2 */
80 u8 bw_2g; /* BW_20_40M 0
95 struct mt76_connac_mcu_chan {
100 int len, i, n_max_channels, n_2ch = 0, n_5ch = 0;
101 struct ieee80211_channel *chan;
104 n_max_channels = phy->sband_2g.sband.n_channels +
105 phy->sband_5g.sband.n_channels;
106 len = sizeof(hdr) + n_max_channels * sizeof(channel);
108 skb = mt76_mcu_msg_alloc(dev, NULL, len);
112 skb_reserve(skb, sizeof(hdr));
114 for (i = 0; i < phy->sband_2g.sband.n_channels; i++) {
115 chan = &phy->sband_2g.sband.channels[i];
116 if (chan->flags & IEEE80211_CHAN_DISABLED)
119 channel.hw_value = cpu_to_le16(chan->hw_value);
120 channel.flags = cpu_to_le32(chan->flags);
123 skb_put_data(skb, &channel, sizeof(channel));
126 for (i = 0; i < phy->sband_5g.sband.n_channels; i++) {
127 chan = &phy->sband_5g.sband.channels[i];
128 if (chan->flags & IEEE80211_CHAN_DISABLED)
131 channel.hw_value = cpu_to_le16(chan->hw_value);
132 channel.flags = cpu_to_le32(chan->flags);
135 skb_put_data(skb, &channel, sizeof(channel));
139 BUILD_BUG_ON(sizeof(dev->alpha2) > sizeof(hdr.alpha2));
140 memcpy(hdr.alpha2, dev->alpha2, sizeof(dev->alpha2));
144 memcpy(__skb_push(skb, sizeof(hdr)), &hdr, sizeof(hdr));
146 return mt76_mcu_skb_send_msg(dev, skb, MCU_CMD_SET_CHAN_DOMAIN, false);
148 EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_channel_domain);
150 int mt76_connac_mcu_set_mac_enable(struct mt76_dev *dev, int band, bool enable,
157 } __packed req_mac = {
162 return mt76_mcu_send_msg(dev, MCU_EXT_CMD_MAC_INIT_CTRL, &req_mac,
163 sizeof(req_mac), true);
165 EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_mac_enable);
167 int mt76_connac_mcu_set_vif_ps(struct mt76_dev *dev, struct ieee80211_vif *vif)
169 struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
172 u8 ps_state; /* 0: device awake
173 * 1: static power save
174 * 2: dynamic power saving
177 .bss_idx = mvif->idx,
178 .ps_state = vif->bss_conf.ps ? 2 : 0,
181 if (vif->type != NL80211_IFTYPE_STATION)
184 return mt76_mcu_send_msg(dev, MCU_CMD_SET_PS_PROFILE, &req,
187 EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_vif_ps);
189 int mt76_connac_mcu_set_rts_thresh(struct mt76_dev *dev, u32 val, u8 band)
200 .len_thresh = cpu_to_le32(val),
201 .pkt_thresh = cpu_to_le32(0x2),
204 return mt76_mcu_send_msg(dev, MCU_EXT_CMD_PROTECT_CTRL, &req,
207 EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_rts_thresh);
209 void mt76_connac_mcu_beacon_loss_iter(void *priv, u8 *mac,
210 struct ieee80211_vif *vif)
212 struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
213 struct mt76_connac_beacon_loss_event *event = priv;
215 if (mvif->idx != event->bss_idx)
218 if (!(vif->driver_flags & IEEE80211_VIF_BEACON_FILTER))
221 ieee80211_beacon_loss(vif);
223 EXPORT_SYMBOL_GPL(mt76_connac_mcu_beacon_loss_iter);
226 mt76_connac_mcu_add_nested_tlv(struct sk_buff *skb, int tag, int len,
227 void *sta_ntlv, void *sta_wtbl)
229 struct sta_ntlv_hdr *ntlv_hdr = sta_ntlv;
230 struct tlv *sta_hdr = sta_wtbl;
231 struct tlv *ptlv, tlv = {
232 .tag = cpu_to_le16(tag),
233 .len = cpu_to_le16(len),
237 ptlv = skb_put(skb, len);
238 memcpy(ptlv, &tlv, sizeof(tlv));
240 ntlv = le16_to_cpu(ntlv_hdr->tlv_num);
241 ntlv_hdr->tlv_num = cpu_to_le16(ntlv + 1);
244 u16 size = le16_to_cpu(sta_hdr->len);
246 sta_hdr->len = cpu_to_le16(size + len);
251 EXPORT_SYMBOL_GPL(mt76_connac_mcu_add_nested_tlv);
254 mt76_connac_mcu_alloc_sta_req(struct mt76_dev *dev, struct mt76_vif *mvif,
255 struct mt76_wcid *wcid)
257 struct sta_req_hdr hdr = {
258 .bss_idx = mvif->idx,
259 .muar_idx = wcid ? mvif->omac_idx : 0,
264 mt76_connac_mcu_get_wlan_idx(dev, wcid, &hdr.wlan_idx_lo,
266 skb = mt76_mcu_msg_alloc(dev, NULL, MT76_CONNAC_STA_UPDATE_MAX_SIZE);
268 return ERR_PTR(-ENOMEM);
270 skb_put_data(skb, &hdr, sizeof(hdr));
274 EXPORT_SYMBOL_GPL(mt76_connac_mcu_alloc_sta_req);
276 struct wtbl_req_hdr *
277 mt76_connac_mcu_alloc_wtbl_req(struct mt76_dev *dev, struct mt76_wcid *wcid,
278 int cmd, void *sta_wtbl, struct sk_buff **skb)
280 struct tlv *sta_hdr = sta_wtbl;
281 struct wtbl_req_hdr hdr = {
284 struct sk_buff *nskb = *skb;
286 mt76_connac_mcu_get_wlan_idx(dev, wcid, &hdr.wlan_idx_lo,
289 nskb = mt76_mcu_msg_alloc(dev, NULL,
290 MT76_CONNAC_WTBL_UPDATE_MAX_SIZE);
292 return ERR_PTR(-ENOMEM);
298 sta_hdr->len = cpu_to_le16(sizeof(hdr));
300 return skb_put_data(nskb, &hdr, sizeof(hdr));
302 EXPORT_SYMBOL_GPL(mt76_connac_mcu_alloc_wtbl_req);
304 void mt76_connac_mcu_sta_basic_tlv(struct sk_buff *skb,
305 struct ieee80211_vif *vif,
306 struct ieee80211_sta *sta,
309 struct sta_rec_basic *basic;
313 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_BASIC, sizeof(*basic));
315 basic = (struct sta_rec_basic *)tlv;
316 basic->extra_info = cpu_to_le16(EXTRA_INFO_VER);
319 basic->extra_info |= cpu_to_le16(EXTRA_INFO_NEW);
320 basic->conn_state = CONN_STATE_PORT_SECURE;
322 basic->conn_state = CONN_STATE_DISCONNECT;
326 basic->conn_type = cpu_to_le32(CONNECTION_INFRA_BC);
327 eth_broadcast_addr(basic->peer_addr);
332 case NL80211_IFTYPE_MESH_POINT:
333 case NL80211_IFTYPE_AP:
335 conn_type = CONNECTION_P2P_GC;
337 conn_type = CONNECTION_INFRA_STA;
338 basic->conn_type = cpu_to_le32(conn_type);
339 basic->aid = cpu_to_le16(sta->aid);
341 case NL80211_IFTYPE_STATION:
343 conn_type = CONNECTION_P2P_GO;
345 conn_type = CONNECTION_INFRA_AP;
346 basic->conn_type = cpu_to_le32(conn_type);
347 basic->aid = cpu_to_le16(vif->bss_conf.aid);
349 case NL80211_IFTYPE_ADHOC:
350 basic->conn_type = cpu_to_le32(CONNECTION_IBSS_ADHOC);
351 basic->aid = cpu_to_le16(sta->aid);
358 memcpy(basic->peer_addr, sta->addr, ETH_ALEN);
359 basic->qos = sta->wme;
361 EXPORT_SYMBOL_GPL(mt76_connac_mcu_sta_basic_tlv);
364 mt76_connac_mcu_sta_uapsd(struct sk_buff *skb, struct ieee80211_vif *vif,
365 struct ieee80211_sta *sta)
367 struct sta_rec_uapsd *uapsd;
370 if (vif->type != NL80211_IFTYPE_AP || !sta->wme)
373 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_APPS, sizeof(*uapsd));
374 uapsd = (struct sta_rec_uapsd *)tlv;
376 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO) {
377 uapsd->dac_map |= BIT(3);
378 uapsd->tac_map |= BIT(3);
380 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI) {
381 uapsd->dac_map |= BIT(2);
382 uapsd->tac_map |= BIT(2);
384 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE) {
385 uapsd->dac_map |= BIT(1);
386 uapsd->tac_map |= BIT(1);
388 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK) {
389 uapsd->dac_map |= BIT(0);
390 uapsd->tac_map |= BIT(0);
392 uapsd->max_sp = sta->max_sp;
395 void mt76_connac_mcu_wtbl_hdr_trans_tlv(struct sk_buff *skb,
396 struct mt76_wcid *wcid,
397 void *sta_wtbl, void *wtbl_tlv)
399 struct wtbl_hdr_trans *htr;
402 tlv = mt76_connac_mcu_add_nested_tlv(skb, WTBL_HDR_TRANS,
405 htr = (struct wtbl_hdr_trans *)tlv;
406 htr->no_rx_trans = !test_bit(MT_WCID_FLAG_HDR_TRANS, &wcid->flags);
408 EXPORT_SYMBOL_GPL(mt76_connac_mcu_wtbl_hdr_trans_tlv);
410 void mt76_connac_mcu_wtbl_generic_tlv(struct mt76_dev *dev,
412 struct ieee80211_vif *vif,
413 struct ieee80211_sta *sta,
414 void *sta_wtbl, void *wtbl_tlv)
416 struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
417 struct wtbl_generic *generic;
419 struct wtbl_spe *spe;
422 tlv = mt76_connac_mcu_add_nested_tlv(skb, WTBL_GENERIC,
426 generic = (struct wtbl_generic *)tlv;
429 if (vif->type == NL80211_IFTYPE_STATION)
430 generic->partial_aid = cpu_to_le16(vif->bss_conf.aid);
432 generic->partial_aid = cpu_to_le16(sta->aid);
433 memcpy(generic->peer_addr, sta->addr, ETH_ALEN);
434 generic->muar_idx = mvif->omac_idx;
435 generic->qos = sta->wme;
437 if (is_mt7921(dev) &&
438 vif->type == NL80211_IFTYPE_STATION)
439 memcpy(generic->peer_addr, vif->bss_conf.bssid,
442 eth_broadcast_addr(generic->peer_addr);
444 generic->muar_idx = 0xe;
447 tlv = mt76_connac_mcu_add_nested_tlv(skb, WTBL_RX, sizeof(*rx),
450 rx = (struct wtbl_rx *)tlv;
451 rx->rca1 = sta ? vif->type != NL80211_IFTYPE_AP : 1;
458 tlv = mt76_connac_mcu_add_nested_tlv(skb, WTBL_SPE, sizeof(*spe),
460 spe = (struct wtbl_spe *)tlv;
463 EXPORT_SYMBOL_GPL(mt76_connac_mcu_wtbl_generic_tlv);
466 mt76_connac_mcu_sta_amsdu_tlv(struct sk_buff *skb, struct ieee80211_sta *sta,
467 struct ieee80211_vif *vif)
469 struct mt76_wcid *wcid = (struct mt76_wcid *)sta->drv_priv;
470 struct sta_rec_amsdu *amsdu;
473 if (vif->type != NL80211_IFTYPE_AP &&
474 vif->type != NL80211_IFTYPE_STATION)
477 if (!sta->max_amsdu_len)
480 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_HW_AMSDU, sizeof(*amsdu));
481 amsdu = (struct sta_rec_amsdu *)tlv;
482 amsdu->max_amsdu_num = 8;
483 amsdu->amsdu_en = true;
484 amsdu->max_mpdu_size = sta->max_amsdu_len >=
485 IEEE80211_MAX_MPDU_LEN_VHT_7991;
490 #define HE_PHY(p, c) u8_get_bits(c, IEEE80211_HE_PHY_##p)
491 #define HE_MAC(m, c) u8_get_bits(c, IEEE80211_HE_MAC_##m)
493 mt76_connac_mcu_sta_he_tlv(struct sk_buff *skb, struct ieee80211_sta *sta)
495 struct ieee80211_sta_he_cap *he_cap = &sta->he_cap;
496 struct ieee80211_he_cap_elem *elem = &he_cap->he_cap_elem;
497 struct sta_rec_he *he;
501 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_HE, sizeof(*he));
503 he = (struct sta_rec_he *)tlv;
505 if (elem->mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_HTC_HE)
506 cap |= STA_REC_HE_CAP_HTC;
508 if (elem->mac_cap_info[2] & IEEE80211_HE_MAC_CAP2_BSR)
509 cap |= STA_REC_HE_CAP_BSR;
511 if (elem->mac_cap_info[3] & IEEE80211_HE_MAC_CAP3_OMI_CONTROL)
512 cap |= STA_REC_HE_CAP_OM;
514 if (elem->mac_cap_info[4] & IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU)
515 cap |= STA_REC_HE_CAP_AMSDU_IN_AMPDU;
517 if (elem->mac_cap_info[4] & IEEE80211_HE_MAC_CAP4_BQR)
518 cap |= STA_REC_HE_CAP_BQR;
520 if (elem->phy_cap_info[0] &
521 (IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_RU_MAPPING_IN_2G |
522 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_RU_MAPPING_IN_5G))
523 cap |= STA_REC_HE_CAP_BW20_RU242_SUPPORT;
525 if (elem->phy_cap_info[1] &
526 IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD)
527 cap |= STA_REC_HE_CAP_LDPC;
529 if (elem->phy_cap_info[1] &
530 IEEE80211_HE_PHY_CAP1_HE_LTF_AND_GI_FOR_HE_PPDUS_0_8US)
531 cap |= STA_REC_HE_CAP_SU_PPDU_1LTF_8US_GI;
533 if (elem->phy_cap_info[2] &
534 IEEE80211_HE_PHY_CAP2_NDP_4x_LTF_AND_3_2US)
535 cap |= STA_REC_HE_CAP_NDP_4LTF_3DOT2MS_GI;
537 if (elem->phy_cap_info[2] &
538 IEEE80211_HE_PHY_CAP2_STBC_TX_UNDER_80MHZ)
539 cap |= STA_REC_HE_CAP_LE_EQ_80M_TX_STBC;
541 if (elem->phy_cap_info[2] &
542 IEEE80211_HE_PHY_CAP2_STBC_RX_UNDER_80MHZ)
543 cap |= STA_REC_HE_CAP_LE_EQ_80M_RX_STBC;
545 if (elem->phy_cap_info[6] &
546 IEEE80211_HE_PHY_CAP6_PARTIAL_BW_EXT_RANGE)
547 cap |= STA_REC_HE_CAP_PARTIAL_BW_EXT_RANGE;
549 if (elem->phy_cap_info[7] &
550 IEEE80211_HE_PHY_CAP7_HE_SU_MU_PPDU_4XLTF_AND_08_US_GI)
551 cap |= STA_REC_HE_CAP_SU_MU_PPDU_4LTF_8US_GI;
553 if (elem->phy_cap_info[7] &
554 IEEE80211_HE_PHY_CAP7_STBC_TX_ABOVE_80MHZ)
555 cap |= STA_REC_HE_CAP_GT_80M_TX_STBC;
557 if (elem->phy_cap_info[7] &
558 IEEE80211_HE_PHY_CAP7_STBC_RX_ABOVE_80MHZ)
559 cap |= STA_REC_HE_CAP_GT_80M_RX_STBC;
561 if (elem->phy_cap_info[8] &
562 IEEE80211_HE_PHY_CAP8_HE_ER_SU_PPDU_4XLTF_AND_08_US_GI)
563 cap |= STA_REC_HE_CAP_ER_SU_PPDU_4LTF_8US_GI;
565 if (elem->phy_cap_info[8] &
566 IEEE80211_HE_PHY_CAP8_HE_ER_SU_1XLTF_AND_08_US_GI)
567 cap |= STA_REC_HE_CAP_ER_SU_PPDU_1LTF_8US_GI;
569 if (elem->phy_cap_info[9] &
570 IEEE80211_HE_PHY_CAP9_NON_TRIGGERED_CQI_FEEDBACK)
571 cap |= STA_REC_HE_CAP_TRIG_CQI_FK;
573 if (elem->phy_cap_info[9] &
574 IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU)
575 cap |= STA_REC_HE_CAP_TX_1024QAM_UNDER_RU242;
577 if (elem->phy_cap_info[9] &
578 IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU)
579 cap |= STA_REC_HE_CAP_RX_1024QAM_UNDER_RU242;
581 he->he_cap = cpu_to_le32(cap);
583 switch (sta->bandwidth) {
584 case IEEE80211_STA_RX_BW_160:
585 if (elem->phy_cap_info[0] &
586 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
587 he->max_nss_mcs[CMD_HE_MCS_BW8080] =
588 he_cap->he_mcs_nss_supp.rx_mcs_80p80;
590 he->max_nss_mcs[CMD_HE_MCS_BW160] =
591 he_cap->he_mcs_nss_supp.rx_mcs_160;
594 he->max_nss_mcs[CMD_HE_MCS_BW80] =
595 he_cap->he_mcs_nss_supp.rx_mcs_80;
600 HE_MAC(CAP1_TF_MAC_PAD_DUR_MASK, elem->mac_cap_info[1]);
602 HE_MAC(CAP3_MAX_AMPDU_LEN_EXP_MASK, elem->mac_cap_info[3]);
605 HE_PHY(CAP0_CHANNEL_WIDTH_SET_MASK, elem->phy_cap_info[0]);
607 HE_PHY(CAP1_DEVICE_CLASS_A, elem->phy_cap_info[1]);
609 HE_PHY(CAP1_PREAMBLE_PUNC_RX_MASK, elem->phy_cap_info[1]);
612 HE_PHY(CAP3_DCM_MAX_CONST_TX_MASK, elem->phy_cap_info[3]);
614 HE_PHY(CAP3_DCM_MAX_TX_NSS_2, elem->phy_cap_info[3]);
616 HE_PHY(CAP3_DCM_MAX_CONST_RX_MASK, elem->phy_cap_info[3]);
618 HE_PHY(CAP3_DCM_MAX_RX_NSS_2, elem->phy_cap_info[3]);
620 HE_PHY(CAP8_DCM_MAX_RU_MASK, elem->phy_cap_info[8]);
626 mt76_connac_get_phy_mode_v2(struct mt76_phy *mphy, struct ieee80211_vif *vif,
627 enum nl80211_band band, struct ieee80211_sta *sta)
629 struct ieee80211_sta_ht_cap *ht_cap;
630 struct ieee80211_sta_vht_cap *vht_cap;
631 const struct ieee80211_sta_he_cap *he_cap;
635 ht_cap = &sta->ht_cap;
636 vht_cap = &sta->vht_cap;
637 he_cap = &sta->he_cap;
639 struct ieee80211_supported_band *sband;
641 sband = mphy->hw->wiphy->bands[band];
642 ht_cap = &sband->ht_cap;
643 vht_cap = &sband->vht_cap;
644 he_cap = ieee80211_get_he_iftype_cap(sband, vif->type);
647 if (band == NL80211_BAND_2GHZ) {
648 mode |= PHY_TYPE_BIT_HR_DSSS | PHY_TYPE_BIT_ERP;
650 if (ht_cap->ht_supported)
651 mode |= PHY_TYPE_BIT_HT;
654 mode |= PHY_TYPE_BIT_HE;
655 } else if (band == NL80211_BAND_5GHZ) {
656 mode |= PHY_TYPE_BIT_OFDM;
658 if (ht_cap->ht_supported)
659 mode |= PHY_TYPE_BIT_HT;
661 if (vht_cap->vht_supported)
662 mode |= PHY_TYPE_BIT_VHT;
665 mode |= PHY_TYPE_BIT_HE;
671 void mt76_connac_mcu_sta_tlv(struct mt76_phy *mphy, struct sk_buff *skb,
672 struct ieee80211_sta *sta,
673 struct ieee80211_vif *vif,
676 struct cfg80211_chan_def *chandef = &mphy->chandef;
677 enum nl80211_band band = chandef->chan->band;
678 struct mt76_dev *dev = mphy->dev;
679 struct sta_rec_ra_info *ra_info;
680 struct sta_rec_state *state;
681 struct sta_rec_phy *phy;
685 if (sta->ht_cap.ht_supported) {
686 struct sta_rec_ht *ht;
688 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_HT, sizeof(*ht));
689 ht = (struct sta_rec_ht *)tlv;
690 ht->ht_cap = cpu_to_le16(sta->ht_cap.cap);
694 if (sta->vht_cap.vht_supported) {
695 struct sta_rec_vht *vht;
698 len = is_mt7921(dev) ? sizeof(*vht) : sizeof(*vht) - 4;
699 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_VHT, len);
700 vht = (struct sta_rec_vht *)tlv;
701 vht->vht_cap = cpu_to_le32(sta->vht_cap.cap);
702 vht->vht_rx_mcs_map = sta->vht_cap.vht_mcs.rx_mcs_map;
703 vht->vht_tx_mcs_map = sta->vht_cap.vht_mcs.tx_mcs_map;
707 mt76_connac_mcu_sta_uapsd(skb, vif, sta);
712 if (sta->ht_cap.ht_supported)
713 mt76_connac_mcu_sta_amsdu_tlv(skb, sta, vif);
716 if (sta->he_cap.has_he)
717 mt76_connac_mcu_sta_he_tlv(skb, sta);
719 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_PHY, sizeof(*phy));
720 phy = (struct sta_rec_phy *)tlv;
721 phy->phy_type = mt76_connac_get_phy_mode_v2(mphy, vif, band, sta);
722 phy->basic_rate = cpu_to_le16((u16)vif->bss_conf.basic_rates);
724 phy->ampdu = FIELD_PREP(IEEE80211_HT_AMPDU_PARM_FACTOR,
725 sta->ht_cap.ampdu_factor) |
726 FIELD_PREP(IEEE80211_HT_AMPDU_PARM_DENSITY,
727 sta->ht_cap.ampdu_density);
729 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_RA, sizeof(*ra_info));
730 ra_info = (struct sta_rec_ra_info *)tlv;
731 ra_info->legacy = cpu_to_le16((u16)sta->supp_rates[band]);
733 if (sta->ht_cap.ht_supported)
734 memcpy(ra_info->rx_mcs_bitmask, sta->ht_cap.mcs.rx_mask,
737 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_STATE, sizeof(*state));
738 state = (struct sta_rec_state *)tlv;
741 if (sta->vht_cap.vht_supported) {
742 state->vht_opmode = sta->bandwidth;
743 state->vht_opmode |= (sta->rx_nss - 1) <<
744 IEEE80211_OPMODE_NOTIF_RX_NSS_SHIFT;
747 EXPORT_SYMBOL_GPL(mt76_connac_mcu_sta_tlv);
750 mt76_connac_mcu_wtbl_smps_tlv(struct sk_buff *skb, struct ieee80211_sta *sta,
751 void *sta_wtbl, void *wtbl_tlv)
753 struct wtbl_smps *smps;
756 tlv = mt76_connac_mcu_add_nested_tlv(skb, WTBL_SMPS, sizeof(*smps),
758 smps = (struct wtbl_smps *)tlv;
760 if (sta->smps_mode == IEEE80211_SMPS_DYNAMIC)
764 void mt76_connac_mcu_wtbl_ht_tlv(struct mt76_dev *dev, struct sk_buff *skb,
765 struct ieee80211_sta *sta, void *sta_wtbl,
768 struct wtbl_ht *ht = NULL;
772 if (sta->ht_cap.ht_supported) {
773 tlv = mt76_connac_mcu_add_nested_tlv(skb, WTBL_HT, sizeof(*ht),
775 ht = (struct wtbl_ht *)tlv;
776 ht->ldpc = !!(sta->ht_cap.cap & IEEE80211_HT_CAP_LDPC_CODING);
777 ht->af = sta->ht_cap.ampdu_factor;
778 ht->mm = sta->ht_cap.ampdu_density;
782 if (sta->vht_cap.vht_supported) {
783 struct wtbl_vht *vht;
786 tlv = mt76_connac_mcu_add_nested_tlv(skb, WTBL_VHT,
787 sizeof(*vht), wtbl_tlv,
789 vht = (struct wtbl_vht *)tlv;
790 vht->ldpc = !!(sta->vht_cap.cap & IEEE80211_VHT_CAP_RXLDPC);
793 af = FIELD_GET(IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK,
796 ht->af = max(ht->af, af);
799 mt76_connac_mcu_wtbl_smps_tlv(skb, sta, sta_wtbl, wtbl_tlv);
801 if (!is_mt7921(dev) && sta->ht_cap.ht_supported) {
803 u32 msk = MT_WTBL_W5_SHORT_GI_20 | MT_WTBL_W5_SHORT_GI_40 |
804 MT_WTBL_W5_SHORT_GI_80 | MT_WTBL_W5_SHORT_GI_160;
805 struct wtbl_raw *raw;
807 tlv = mt76_connac_mcu_add_nested_tlv(skb, WTBL_RAW_DATA,
808 sizeof(*raw), wtbl_tlv,
811 if (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20)
812 flags |= MT_WTBL_W5_SHORT_GI_20;
813 if (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40)
814 flags |= MT_WTBL_W5_SHORT_GI_40;
816 if (sta->vht_cap.vht_supported) {
817 if (sta->vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_80)
818 flags |= MT_WTBL_W5_SHORT_GI_80;
819 if (sta->vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_160)
820 flags |= MT_WTBL_W5_SHORT_GI_160;
822 raw = (struct wtbl_raw *)tlv;
823 raw->val = cpu_to_le32(flags);
824 raw->msk = cpu_to_le32(~msk);
829 EXPORT_SYMBOL_GPL(mt76_connac_mcu_wtbl_ht_tlv);
831 int mt76_connac_mcu_add_sta_cmd(struct mt76_phy *phy,
832 struct mt76_sta_cmd_info *info)
834 struct mt76_vif *mvif = (struct mt76_vif *)info->vif->drv_priv;
835 struct mt76_dev *dev = phy->dev;
836 struct wtbl_req_hdr *wtbl_hdr;
837 struct tlv *sta_wtbl;
840 skb = mt76_connac_mcu_alloc_sta_req(dev, mvif, info->wcid);
844 mt76_connac_mcu_sta_basic_tlv(skb, info->vif, info->sta, info->enable);
845 if (info->enable && info->sta)
846 mt76_connac_mcu_sta_tlv(phy, skb, info->sta, info->vif,
849 sta_wtbl = mt76_connac_mcu_add_tlv(skb, STA_REC_WTBL,
852 wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(dev, info->wcid,
855 if (IS_ERR(wtbl_hdr))
856 return PTR_ERR(wtbl_hdr);
859 mt76_connac_mcu_wtbl_generic_tlv(dev, skb, info->vif,
863 mt76_connac_mcu_wtbl_ht_tlv(dev, skb, info->sta,
867 return mt76_mcu_skb_send_msg(dev, skb, info->cmd, true);
869 EXPORT_SYMBOL_GPL(mt76_connac_mcu_add_sta_cmd);
871 void mt76_connac_mcu_wtbl_ba_tlv(struct mt76_dev *dev, struct sk_buff *skb,
872 struct ieee80211_ampdu_params *params,
873 bool enable, bool tx, void *sta_wtbl,
879 tlv = mt76_connac_mcu_add_nested_tlv(skb, WTBL_BA, sizeof(*ba),
882 ba = (struct wtbl_ba *)tlv;
883 ba->tid = params->tid;
886 ba->ba_type = MT_BA_TYPE_ORIGINATOR;
887 ba->sn = enable ? cpu_to_le16(params->ssn) : 0;
888 ba->ba_winsize = enable ? cpu_to_le16(params->buf_size) : 0;
891 memcpy(ba->peer_addr, params->sta->addr, ETH_ALEN);
892 ba->ba_type = MT_BA_TYPE_RECIPIENT;
893 ba->rst_ba_tid = params->tid;
894 ba->rst_ba_sel = RST_BA_MAC_TID_MATCH;
902 u8 ba_range[] = { 4, 8, 12, 24, 36, 48, 54, 64 };
905 for (i = 7; i > 0; i--) {
906 if (params->buf_size >= ba_range[i])
909 ba->ba_winsize_idx = i;
912 EXPORT_SYMBOL_GPL(mt76_connac_mcu_wtbl_ba_tlv);
914 int mt76_connac_mcu_uni_add_dev(struct mt76_phy *phy,
915 struct ieee80211_vif *vif,
916 struct mt76_wcid *wcid,
919 struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
920 struct mt76_dev *dev = phy->dev;
932 u8 omac_addr[ETH_ALEN];
936 .omac_idx = mvif->omac_idx,
937 .band_idx = mvif->band_idx,
940 .tag = cpu_to_le16(DEV_INFO_ACTIVE),
941 .len = cpu_to_le16(sizeof(struct req_tlv)),
950 struct mt76_connac_bss_basic_tlv basic;
953 .bss_idx = mvif->idx,
956 .tag = cpu_to_le16(UNI_BSS_INFO_BASIC),
957 .len = cpu_to_le16(sizeof(struct mt76_connac_bss_basic_tlv)),
958 .omac_idx = mvif->omac_idx,
959 .band_idx = mvif->band_idx,
960 .wmm_idx = mvif->wmm_idx,
962 .bmc_tx_wlan_idx = cpu_to_le16(wcid->idx),
963 .sta_idx = cpu_to_le16(wcid->idx),
967 int err, idx, cmd, len;
971 case NL80211_IFTYPE_MESH_POINT:
972 case NL80211_IFTYPE_MONITOR:
973 case NL80211_IFTYPE_AP:
974 basic_req.basic.conn_type = cpu_to_le32(CONNECTION_INFRA_AP);
976 case NL80211_IFTYPE_STATION:
977 basic_req.basic.conn_type = cpu_to_le32(CONNECTION_INFRA_STA);
979 case NL80211_IFTYPE_ADHOC:
980 basic_req.basic.conn_type = cpu_to_le32(CONNECTION_IBSS_ADHOC);
987 idx = mvif->omac_idx > EXT_BSSID_START ? HW_BSSID_0 : mvif->omac_idx;
988 basic_req.basic.hw_bss_idx = idx;
990 memcpy(dev_req.tlv.omac_addr, vif->addr, ETH_ALEN);
992 cmd = enable ? MCU_UNI_CMD_DEV_INFO_UPDATE : MCU_UNI_CMD_BSS_INFO_UPDATE;
993 data = enable ? (void *)&dev_req : (void *)&basic_req;
994 len = enable ? sizeof(dev_req) : sizeof(basic_req);
996 err = mt76_mcu_send_msg(dev, cmd, data, len, true);
1000 cmd = enable ? MCU_UNI_CMD_BSS_INFO_UPDATE : MCU_UNI_CMD_DEV_INFO_UPDATE;
1001 data = enable ? (void *)&basic_req : (void *)&dev_req;
1002 len = enable ? sizeof(basic_req) : sizeof(dev_req);
1004 return mt76_mcu_send_msg(dev, cmd, data, len, true);
1006 EXPORT_SYMBOL_GPL(mt76_connac_mcu_uni_add_dev);
1008 void mt76_connac_mcu_sta_ba_tlv(struct sk_buff *skb,
1009 struct ieee80211_ampdu_params *params,
1010 bool enable, bool tx)
1012 struct sta_rec_ba *ba;
1015 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_BA, sizeof(*ba));
1017 ba = (struct sta_rec_ba *)tlv;
1018 ba->ba_type = tx ? MT_BA_TYPE_ORIGINATOR : MT_BA_TYPE_RECIPIENT;
1019 ba->winsize = cpu_to_le16(params->buf_size);
1020 ba->ssn = cpu_to_le16(params->ssn);
1021 ba->ba_en = enable << params->tid;
1022 ba->amsdu = params->amsdu;
1023 ba->tid = params->tid;
1025 EXPORT_SYMBOL_GPL(mt76_connac_mcu_sta_ba_tlv);
1027 int mt76_connac_mcu_sta_ba(struct mt76_dev *dev, struct mt76_vif *mvif,
1028 struct ieee80211_ampdu_params *params,
1029 bool enable, bool tx)
1031 struct mt76_wcid *wcid = (struct mt76_wcid *)params->sta->drv_priv;
1032 struct wtbl_req_hdr *wtbl_hdr;
1033 struct tlv *sta_wtbl;
1034 struct sk_buff *skb;
1037 skb = mt76_connac_mcu_alloc_sta_req(dev, mvif, wcid);
1039 return PTR_ERR(skb);
1041 sta_wtbl = mt76_connac_mcu_add_tlv(skb, STA_REC_WTBL,
1042 sizeof(struct tlv));
1044 wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(dev, wcid, WTBL_SET,
1046 if (IS_ERR(wtbl_hdr))
1047 return PTR_ERR(wtbl_hdr);
1049 mt76_connac_mcu_wtbl_ba_tlv(dev, skb, params, enable, tx, sta_wtbl,
1052 ret = mt76_mcu_skb_send_msg(dev, skb, MCU_UNI_CMD_STA_REC_UPDATE, true);
1056 skb = mt76_connac_mcu_alloc_sta_req(dev, mvif, wcid);
1058 return PTR_ERR(skb);
1060 mt76_connac_mcu_sta_ba_tlv(skb, params, enable, tx);
1062 return mt76_mcu_skb_send_msg(dev, skb, MCU_UNI_CMD_STA_REC_UPDATE,
1065 EXPORT_SYMBOL_GPL(mt76_connac_mcu_sta_ba);
1068 mt76_connac_get_phy_mode(struct mt76_phy *phy, struct ieee80211_vif *vif,
1069 enum nl80211_band band,
1070 struct ieee80211_sta *sta)
1072 struct mt76_dev *dev = phy->dev;
1073 const struct ieee80211_sta_he_cap *he_cap;
1074 struct ieee80211_sta_vht_cap *vht_cap;
1075 struct ieee80211_sta_ht_cap *ht_cap;
1078 if (!is_mt7921(dev))
1082 ht_cap = &sta->ht_cap;
1083 vht_cap = &sta->vht_cap;
1084 he_cap = &sta->he_cap;
1086 struct ieee80211_supported_band *sband;
1088 sband = phy->hw->wiphy->bands[band];
1089 ht_cap = &sband->ht_cap;
1090 vht_cap = &sband->vht_cap;
1091 he_cap = ieee80211_get_he_iftype_cap(sband, vif->type);
1094 if (band == NL80211_BAND_2GHZ) {
1095 mode |= PHY_MODE_B | PHY_MODE_G;
1097 if (ht_cap->ht_supported)
1098 mode |= PHY_MODE_GN;
1101 mode |= PHY_MODE_AX_24G;
1102 } else if (band == NL80211_BAND_5GHZ) {
1105 if (ht_cap->ht_supported)
1106 mode |= PHY_MODE_AN;
1108 if (vht_cap->vht_supported)
1109 mode |= PHY_MODE_AC;
1112 mode |= PHY_MODE_AX_5G;
1118 static const struct ieee80211_sta_he_cap *
1119 mt76_connac_get_he_phy_cap(struct mt76_phy *phy, struct ieee80211_vif *vif)
1121 enum nl80211_band band = phy->chandef.chan->band;
1122 struct ieee80211_supported_band *sband;
1124 sband = phy->hw->wiphy->bands[band];
1126 return ieee80211_get_he_iftype_cap(sband, vif->type);
1129 #define DEFAULT_HE_PE_DURATION 4
1130 #define DEFAULT_HE_DURATION_RTS_THRES 1023
1132 mt76_connac_mcu_uni_bss_he_tlv(struct mt76_phy *phy, struct ieee80211_vif *vif,
1135 const struct ieee80211_sta_he_cap *cap;
1136 struct bss_info_uni_he *he;
1138 cap = mt76_connac_get_he_phy_cap(phy, vif);
1140 he = (struct bss_info_uni_he *)tlv;
1141 he->he_pe_duration = vif->bss_conf.htc_trig_based_pkt_ext;
1142 if (!he->he_pe_duration)
1143 he->he_pe_duration = DEFAULT_HE_PE_DURATION;
1145 he->he_rts_thres = cpu_to_le16(vif->bss_conf.frame_time_rts_th);
1146 if (!he->he_rts_thres)
1147 he->he_rts_thres = cpu_to_le16(DEFAULT_HE_DURATION_RTS_THRES);
1149 he->max_nss_mcs[CMD_HE_MCS_BW80] = cap->he_mcs_nss_supp.tx_mcs_80;
1150 he->max_nss_mcs[CMD_HE_MCS_BW160] = cap->he_mcs_nss_supp.tx_mcs_160;
1151 he->max_nss_mcs[CMD_HE_MCS_BW8080] = cap->he_mcs_nss_supp.tx_mcs_80p80;
1154 int mt76_connac_mcu_uni_add_bss(struct mt76_phy *phy,
1155 struct ieee80211_vif *vif,
1156 struct mt76_wcid *wcid,
1159 struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
1160 struct cfg80211_chan_def *chandef = &phy->chandef;
1161 int freq1 = chandef->center_freq1, freq2 = chandef->center_freq2;
1162 enum nl80211_band band = chandef->chan->band;
1163 struct mt76_dev *mdev = phy->dev;
1169 struct mt76_connac_bss_basic_tlv basic;
1170 struct mt76_connac_bss_qos_tlv qos;
1173 .bss_idx = mvif->idx,
1176 .tag = cpu_to_le16(UNI_BSS_INFO_BASIC),
1177 .len = cpu_to_le16(sizeof(struct mt76_connac_bss_basic_tlv)),
1178 .bcn_interval = cpu_to_le16(vif->bss_conf.beacon_int),
1179 .dtim_period = vif->bss_conf.dtim_period,
1180 .omac_idx = mvif->omac_idx,
1181 .band_idx = mvif->band_idx,
1182 .wmm_idx = mvif->wmm_idx,
1183 .active = true, /* keep bss deactivated */
1184 .phymode = mt76_connac_get_phy_mode(phy, vif, band, NULL),
1187 .tag = cpu_to_le16(UNI_BSS_INFO_QBSS),
1188 .len = cpu_to_le16(sizeof(struct mt76_connac_bss_qos_tlv)),
1189 .qos = vif->bss_conf.qos,
1211 } __packed rlm_req = {
1213 .bss_idx = mvif->idx,
1216 .tag = cpu_to_le16(UNI_BSS_INFO_RLM),
1217 .len = cpu_to_le16(sizeof(struct rlm_tlv)),
1218 .control_channel = chandef->chan->hw_value,
1219 .center_chan = ieee80211_frequency_to_channel(freq1),
1220 .center_chan2 = ieee80211_frequency_to_channel(freq2),
1221 .tx_streams = hweight8(phy->antenna_mask),
1222 .ht_op_info = 4, /* set HT 40M allowed */
1223 .rx_streams = phy->chainmask,
1230 idx = mvif->omac_idx > EXT_BSSID_START ? HW_BSSID_0 : mvif->omac_idx;
1231 basic_req.basic.hw_bss_idx = idx;
1233 switch (vif->type) {
1234 case NL80211_IFTYPE_MESH_POINT:
1235 case NL80211_IFTYPE_AP:
1237 conn_type = CONNECTION_P2P_GO;
1239 conn_type = CONNECTION_INFRA_AP;
1240 basic_req.basic.conn_type = cpu_to_le32(conn_type);
1242 case NL80211_IFTYPE_STATION:
1244 conn_type = CONNECTION_P2P_GC;
1246 conn_type = CONNECTION_INFRA_STA;
1247 basic_req.basic.conn_type = cpu_to_le32(conn_type);
1249 case NL80211_IFTYPE_ADHOC:
1250 basic_req.basic.conn_type = cpu_to_le32(CONNECTION_IBSS_ADHOC);
1257 memcpy(basic_req.basic.bssid, vif->bss_conf.bssid, ETH_ALEN);
1258 basic_req.basic.bmc_tx_wlan_idx = cpu_to_le16(wcid->idx);
1259 basic_req.basic.sta_idx = cpu_to_le16(wcid->idx);
1260 basic_req.basic.conn_state = !enable;
1262 err = mt76_mcu_send_msg(mdev, MCU_UNI_CMD_BSS_INFO_UPDATE, &basic_req,
1263 sizeof(basic_req), true);
1267 if (vif->bss_conf.he_support) {
1273 struct bss_info_uni_he he;
1276 .bss_idx = mvif->idx,
1279 .tag = cpu_to_le16(UNI_BSS_INFO_HE_BASIC),
1280 .len = cpu_to_le16(sizeof(struct bss_info_uni_he)),
1284 mt76_connac_mcu_uni_bss_he_tlv(phy, vif,
1285 (struct tlv *)&he_req.he);
1286 err = mt76_mcu_send_msg(mdev, MCU_UNI_CMD_BSS_INFO_UPDATE,
1287 &he_req, sizeof(he_req), true);
1292 switch (chandef->width) {
1293 case NL80211_CHAN_WIDTH_40:
1294 rlm_req.rlm.bw = CMD_CBW_40MHZ;
1296 case NL80211_CHAN_WIDTH_80:
1297 rlm_req.rlm.bw = CMD_CBW_80MHZ;
1299 case NL80211_CHAN_WIDTH_80P80:
1300 rlm_req.rlm.bw = CMD_CBW_8080MHZ;
1302 case NL80211_CHAN_WIDTH_160:
1303 rlm_req.rlm.bw = CMD_CBW_160MHZ;
1305 case NL80211_CHAN_WIDTH_5:
1306 rlm_req.rlm.bw = CMD_CBW_5MHZ;
1308 case NL80211_CHAN_WIDTH_10:
1309 rlm_req.rlm.bw = CMD_CBW_10MHZ;
1311 case NL80211_CHAN_WIDTH_20_NOHT:
1312 case NL80211_CHAN_WIDTH_20:
1314 rlm_req.rlm.bw = CMD_CBW_20MHZ;
1315 rlm_req.rlm.ht_op_info = 0;
1319 if (rlm_req.rlm.control_channel < rlm_req.rlm.center_chan)
1320 rlm_req.rlm.sco = 1; /* SCA */
1321 else if (rlm_req.rlm.control_channel > rlm_req.rlm.center_chan)
1322 rlm_req.rlm.sco = 3; /* SCB */
1324 return mt76_mcu_send_msg(mdev, MCU_UNI_CMD_BSS_INFO_UPDATE, &rlm_req,
1325 sizeof(rlm_req), true);
1327 EXPORT_SYMBOL_GPL(mt76_connac_mcu_uni_add_bss);
1329 #define MT76_CONNAC_SCAN_CHANNEL_TIME 60
1330 int mt76_connac_mcu_hw_scan(struct mt76_phy *phy, struct ieee80211_vif *vif,
1331 struct ieee80211_scan_request *scan_req)
1333 struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
1334 struct cfg80211_scan_request *sreq = &scan_req->req;
1335 int n_ssids = 0, err, i, duration;
1336 int ext_channels_num = max_t(int, sreq->n_channels - 32, 0);
1337 struct ieee80211_channel **scan_list = sreq->channels;
1338 struct mt76_dev *mdev = phy->dev;
1339 bool ext_phy = phy == mdev->phy2;
1340 struct mt76_connac_mcu_scan_channel *chan;
1341 struct mt76_connac_hw_scan_req *req;
1342 struct sk_buff *skb;
1344 skb = mt76_mcu_msg_alloc(mdev, NULL, sizeof(*req));
1348 set_bit(MT76_HW_SCANNING, &phy->state);
1349 mvif->scan_seq_num = (mvif->scan_seq_num + 1) & 0x7f;
1351 req = (struct mt76_connac_hw_scan_req *)skb_put(skb, sizeof(*req));
1353 req->seq_num = mvif->scan_seq_num | ext_phy << 7;
1354 req->bss_idx = mvif->idx;
1355 req->scan_type = sreq->n_ssids ? 1 : 0;
1356 req->probe_req_num = sreq->n_ssids ? 2 : 0;
1359 for (i = 0; i < sreq->n_ssids; i++) {
1360 if (!sreq->ssids[i].ssid_len)
1363 req->ssids[i].ssid_len = cpu_to_le32(sreq->ssids[i].ssid_len);
1364 memcpy(req->ssids[i].ssid, sreq->ssids[i].ssid,
1365 sreq->ssids[i].ssid_len);
1368 req->ssid_type = n_ssids ? BIT(2) : BIT(0);
1369 req->ssid_type_ext = n_ssids ? BIT(0) : 0;
1370 req->ssids_num = n_ssids;
1372 duration = is_mt7921(phy->dev) ? 0 : MT76_CONNAC_SCAN_CHANNEL_TIME;
1373 /* increase channel time for passive scan */
1376 req->timeout_value = cpu_to_le16(sreq->n_channels * duration);
1377 req->channel_min_dwell_time = cpu_to_le16(duration);
1378 req->channel_dwell_time = cpu_to_le16(duration);
1380 req->channels_num = min_t(u8, sreq->n_channels, 32);
1381 req->ext_channels_num = min_t(u8, ext_channels_num, 32);
1382 for (i = 0; i < req->channels_num + req->ext_channels_num; i++) {
1384 chan = &req->ext_channels[i - 32];
1386 chan = &req->channels[i];
1388 chan->band = scan_list[i]->band == NL80211_BAND_2GHZ ? 1 : 2;
1389 chan->channel_num = scan_list[i]->hw_value;
1391 req->channel_type = sreq->n_channels ? 4 : 0;
1393 if (sreq->ie_len > 0) {
1394 memcpy(req->ies, sreq->ie, sreq->ie_len);
1395 req->ies_len = cpu_to_le16(sreq->ie_len);
1398 if (is_mt7921(phy->dev))
1399 req->scan_func |= SCAN_FUNC_SPLIT_SCAN;
1401 memcpy(req->bssid, sreq->bssid, ETH_ALEN);
1402 if (sreq->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
1403 get_random_mask_addr(req->random_mac, sreq->mac_addr,
1404 sreq->mac_addr_mask);
1405 req->scan_func |= SCAN_FUNC_RANDOM_MAC;
1408 err = mt76_mcu_skb_send_msg(mdev, skb, MCU_CMD_START_HW_SCAN, false);
1410 clear_bit(MT76_HW_SCANNING, &phy->state);
1414 EXPORT_SYMBOL_GPL(mt76_connac_mcu_hw_scan);
1416 int mt76_connac_mcu_cancel_hw_scan(struct mt76_phy *phy,
1417 struct ieee80211_vif *vif)
1419 struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
1425 .seq_num = mvif->scan_seq_num,
1428 if (test_and_clear_bit(MT76_HW_SCANNING, &phy->state)) {
1429 struct cfg80211_scan_info info = {
1433 ieee80211_scan_completed(phy->hw, &info);
1436 return mt76_mcu_send_msg(phy->dev, MCU_CMD_CANCEL_HW_SCAN, &req,
1437 sizeof(req), false);
1439 EXPORT_SYMBOL_GPL(mt76_connac_mcu_cancel_hw_scan);
1441 int mt76_connac_mcu_sched_scan_req(struct mt76_phy *phy,
1442 struct ieee80211_vif *vif,
1443 struct cfg80211_sched_scan_request *sreq)
1445 struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
1446 struct ieee80211_channel **scan_list = sreq->channels;
1447 struct mt76_connac_mcu_scan_channel *chan;
1448 struct mt76_connac_sched_scan_req *req;
1449 struct mt76_dev *mdev = phy->dev;
1450 bool ext_phy = phy == mdev->phy2;
1451 struct cfg80211_match_set *match;
1452 struct cfg80211_ssid *ssid;
1453 struct sk_buff *skb;
1456 skb = mt76_mcu_msg_alloc(mdev, NULL, sizeof(*req) + sreq->ie_len);
1460 mvif->scan_seq_num = (mvif->scan_seq_num + 1) & 0x7f;
1462 req = (struct mt76_connac_sched_scan_req *)skb_put(skb, sizeof(*req));
1464 req->seq_num = mvif->scan_seq_num | ext_phy << 7;
1466 if (is_mt7663(phy->dev) &&
1467 (sreq->flags & NL80211_SCAN_FLAG_RANDOM_ADDR)) {
1468 get_random_mask_addr(req->mt7663.random_mac, sreq->mac_addr,
1469 sreq->mac_addr_mask);
1471 } else if (is_mt7921(phy->dev)) {
1472 req->mt7921.bss_idx = mvif->idx;
1475 req->ssids_num = sreq->n_ssids;
1476 for (i = 0; i < req->ssids_num; i++) {
1477 ssid = &sreq->ssids[i];
1478 memcpy(req->ssids[i].ssid, ssid->ssid, ssid->ssid_len);
1479 req->ssids[i].ssid_len = cpu_to_le32(ssid->ssid_len);
1482 req->match_num = sreq->n_match_sets;
1483 for (i = 0; i < req->match_num; i++) {
1484 match = &sreq->match_sets[i];
1485 memcpy(req->match[i].ssid, match->ssid.ssid,
1486 match->ssid.ssid_len);
1487 req->match[i].rssi_th = cpu_to_le32(match->rssi_thold);
1488 req->match[i].ssid_len = match->ssid.ssid_len;
1491 req->channel_type = sreq->n_channels ? 4 : 0;
1492 req->channels_num = min_t(u8, sreq->n_channels, 64);
1493 for (i = 0; i < req->channels_num; i++) {
1494 chan = &req->channels[i];
1495 chan->band = scan_list[i]->band == NL80211_BAND_2GHZ ? 1 : 2;
1496 chan->channel_num = scan_list[i]->hw_value;
1499 req->intervals_num = sreq->n_scan_plans;
1500 for (i = 0; i < req->intervals_num; i++)
1501 req->intervals[i] = cpu_to_le16(sreq->scan_plans[i].interval);
1503 if (sreq->ie_len > 0) {
1504 req->ie_len = cpu_to_le16(sreq->ie_len);
1505 memcpy(skb_put(skb, sreq->ie_len), sreq->ie, sreq->ie_len);
1508 return mt76_mcu_skb_send_msg(mdev, skb, MCU_CMD_SCHED_SCAN_REQ, false);
1510 EXPORT_SYMBOL_GPL(mt76_connac_mcu_sched_scan_req);
1512 int mt76_connac_mcu_sched_scan_enable(struct mt76_phy *phy,
1513 struct ieee80211_vif *vif,
1517 u8 active; /* 0: enabled 1: disabled */
1524 set_bit(MT76_HW_SCHED_SCANNING, &phy->state);
1526 clear_bit(MT76_HW_SCHED_SCANNING, &phy->state);
1528 return mt76_mcu_send_msg(phy->dev, MCU_CMD_SCHED_SCAN_ENABLE, &req,
1529 sizeof(req), false);
1531 EXPORT_SYMBOL_GPL(mt76_connac_mcu_sched_scan_enable);
1533 int mt76_connac_mcu_chip_config(struct mt76_dev *dev)
1535 struct mt76_connac_config req = {
1539 memcpy(req.data, "assert", 7);
1541 return mt76_mcu_send_msg(dev, MCU_CMD_CHIP_CONFIG, &req, sizeof(req),
1544 EXPORT_SYMBOL_GPL(mt76_connac_mcu_chip_config);
1546 int mt76_connac_mcu_set_deep_sleep(struct mt76_dev *dev, bool enable)
1548 struct mt76_connac_config req = {
1552 snprintf(req.data, sizeof(req.data), "KeepFullPwr %d", !enable);
1554 return mt76_mcu_send_msg(dev, MCU_CMD_CHIP_CONFIG, &req, sizeof(req),
1557 EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_deep_sleep);
1559 void mt76_connac_mcu_coredump_event(struct mt76_dev *dev, struct sk_buff *skb,
1560 struct mt76_connac_coredump *coredump)
1562 spin_lock_bh(&dev->lock);
1563 __skb_queue_tail(&coredump->msg_list, skb);
1564 spin_unlock_bh(&dev->lock);
1566 coredump->last_activity = jiffies;
1568 queue_delayed_work(dev->wq, &coredump->work,
1569 MT76_CONNAC_COREDUMP_TIMEOUT);
1571 EXPORT_SYMBOL_GPL(mt76_connac_mcu_coredump_event);
1574 mt76_connac_mcu_build_sku(struct mt76_dev *dev, s8 *sku,
1575 struct mt76_power_limits *limits,
1576 enum nl80211_band band)
1578 int max_power = is_mt7921(dev) ? 127 : 63;
1579 int i, offset = sizeof(limits->cck);
1581 memset(sku, max_power, MT_SKU_POWER_LIMIT);
1583 if (band == NL80211_BAND_2GHZ) {
1585 memcpy(sku, limits->cck, sizeof(limits->cck));
1589 memcpy(&sku[offset], limits->ofdm, sizeof(limits->ofdm));
1590 offset += sizeof(limits->ofdm);
1593 for (i = 0; i < 2; i++) {
1594 memcpy(&sku[offset], limits->mcs[i], 8);
1597 sku[offset++] = limits->mcs[0][0];
1600 for (i = 0; i < ARRAY_SIZE(limits->mcs); i++) {
1601 memcpy(&sku[offset], limits->mcs[i],
1602 ARRAY_SIZE(limits->mcs[i]));
1606 if (!is_mt7921(dev))
1610 for (i = 0; i < ARRAY_SIZE(limits->ru); i++) {
1611 memcpy(&sku[offset], limits->ru[i], ARRAY_SIZE(limits->ru[i]));
1612 offset += ARRAY_SIZE(limits->ru[i]);
1617 mt76_connac_mcu_rate_txpower_band(struct mt76_phy *phy,
1618 enum nl80211_band band)
1620 struct mt76_dev *dev = phy->dev;
1621 int sku_len, batch_len = is_mt7921(dev) ? 8 : 16;
1622 static const u8 chan_list_2ghz[] = {
1623 1, 2, 3, 4, 5, 6, 7,
1624 8, 9, 10, 11, 12, 13, 14
1626 static const u8 chan_list_5ghz[] = {
1627 36, 38, 40, 42, 44, 46, 48,
1628 50, 52, 54, 56, 58, 60, 62,
1629 64, 100, 102, 104, 106, 108, 110,
1630 112, 114, 116, 118, 120, 122, 124,
1631 126, 128, 132, 134, 136, 138, 140,
1632 142, 144, 149, 151, 153, 155, 157,
1635 struct mt76_connac_sku_tlv sku_tlbv;
1636 int i, n_chan, batch_size, idx = 0;
1637 struct mt76_power_limits limits;
1640 sku_len = is_mt7921(dev) ? sizeof(sku_tlbv) : sizeof(sku_tlbv) - 92;
1642 if (band == NL80211_BAND_2GHZ) {
1643 n_chan = ARRAY_SIZE(chan_list_2ghz);
1644 ch_list = chan_list_2ghz;
1646 n_chan = ARRAY_SIZE(chan_list_5ghz);
1647 ch_list = chan_list_5ghz;
1649 batch_size = DIV_ROUND_UP(n_chan, batch_len);
1651 for (i = 0; i < batch_size; i++) {
1652 bool last_msg = i == batch_size - 1;
1653 int num_ch = last_msg ? n_chan % batch_len : batch_len;
1654 struct mt76_connac_tx_power_limit_tlv tx_power_tlv = {
1655 .band = band == NL80211_BAND_2GHZ ? 1 : 2,
1657 .last_msg = last_msg,
1659 struct sk_buff *skb;
1660 int j, err, msg_len;
1662 msg_len = sizeof(tx_power_tlv) + num_ch * sizeof(sku_tlbv);
1663 skb = mt76_mcu_msg_alloc(dev, NULL, msg_len);
1667 BUILD_BUG_ON(sizeof(dev->alpha2) > sizeof(tx_power_tlv.alpha2));
1668 memcpy(tx_power_tlv.alpha2, dev->alpha2, sizeof(dev->alpha2));
1670 skb_put_data(skb, &tx_power_tlv, sizeof(tx_power_tlv));
1671 for (j = 0; j < num_ch; j++, idx++) {
1672 struct ieee80211_channel chan = {
1673 .hw_value = ch_list[idx],
1677 mt76_get_rate_power_limits(phy, &chan, &limits, 127);
1679 sku_tlbv.channel = ch_list[idx];
1680 mt76_connac_mcu_build_sku(dev, sku_tlbv.pwr_limit,
1682 skb_put_data(skb, &sku_tlbv, sku_len);
1685 err = mt76_mcu_skb_send_msg(dev, skb,
1686 MCU_CMD_SET_RATE_TX_POWER, false);
1694 int mt76_connac_mcu_set_rate_txpower(struct mt76_phy *phy)
1698 err = mt76_connac_mcu_rate_txpower_band(phy, NL80211_BAND_2GHZ);
1702 return mt76_connac_mcu_rate_txpower_band(phy, NL80211_BAND_5GHZ);
1704 EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_rate_txpower);
1706 int mt76_connac_mcu_update_arp_filter(struct mt76_dev *dev,
1707 struct mt76_vif *vif,
1708 struct ieee80211_bss_conf *info)
1710 struct sk_buff *skb;
1711 int i, len = min_t(int, info->arp_addr_cnt,
1712 IEEE80211_BSS_ARP_ADDR_LIST_LEN);
1718 struct mt76_connac_arpns_tlv arp;
1721 .bss_idx = vif->idx,
1724 .tag = cpu_to_le16(UNI_OFFLOAD_OFFLOAD_ARP),
1725 .len = cpu_to_le16(sizeof(struct mt76_connac_arpns_tlv)),
1727 .mode = 2, /* update */
1732 skb = mt76_mcu_msg_alloc(dev, NULL,
1733 sizeof(req_hdr) + len * sizeof(__be32));
1737 skb_put_data(skb, &req_hdr, sizeof(req_hdr));
1738 for (i = 0; i < len; i++) {
1739 u8 *addr = (u8 *)skb_put(skb, sizeof(__be32));
1741 memcpy(addr, &info->arp_addr_list[i], sizeof(__be32));
1744 return mt76_mcu_skb_send_msg(dev, skb, MCU_UNI_CMD_OFFLOAD, true);
1746 EXPORT_SYMBOL_GPL(mt76_connac_mcu_update_arp_filter);
1750 const struct wiphy_wowlan_support mt76_connac_wowlan_support = {
1751 .flags = WIPHY_WOWLAN_MAGIC_PKT | WIPHY_WOWLAN_DISCONNECT |
1752 WIPHY_WOWLAN_SUPPORTS_GTK_REKEY | WIPHY_WOWLAN_NET_DETECT,
1754 .pattern_min_len = 1,
1755 .pattern_max_len = MT76_CONNAC_WOW_PATTEN_MAX_LEN,
1756 .max_nd_match_sets = 10,
1758 EXPORT_SYMBOL_GPL(mt76_connac_wowlan_support);
1761 mt76_connac_mcu_key_iter(struct ieee80211_hw *hw,
1762 struct ieee80211_vif *vif,
1763 struct ieee80211_sta *sta,
1764 struct ieee80211_key_conf *key,
1767 struct mt76_connac_gtk_rekey_tlv *gtk_tlv = data;
1770 if (key->cipher != WLAN_CIPHER_SUITE_AES_CMAC &&
1771 key->cipher != WLAN_CIPHER_SUITE_CCMP &&
1772 key->cipher != WLAN_CIPHER_SUITE_TKIP)
1775 if (key->cipher == WLAN_CIPHER_SUITE_TKIP) {
1776 gtk_tlv->proto = cpu_to_le32(NL80211_WPA_VERSION_1);
1779 gtk_tlv->proto = cpu_to_le32(NL80211_WPA_VERSION_2);
1783 /* we are assuming here to have a single pairwise key */
1784 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) {
1785 gtk_tlv->pairwise_cipher = cpu_to_le32(cipher);
1786 gtk_tlv->group_cipher = cpu_to_le32(cipher);
1787 gtk_tlv->keyid = key->keyidx;
1791 int mt76_connac_mcu_update_gtk_rekey(struct ieee80211_hw *hw,
1792 struct ieee80211_vif *vif,
1793 struct cfg80211_gtk_rekey_data *key)
1795 struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
1796 struct mt76_connac_gtk_rekey_tlv *gtk_tlv;
1797 struct mt76_phy *phy = hw->priv;
1798 struct sk_buff *skb;
1803 .bss_idx = mvif->idx,
1806 skb = mt76_mcu_msg_alloc(phy->dev, NULL,
1807 sizeof(hdr) + sizeof(*gtk_tlv));
1811 skb_put_data(skb, &hdr, sizeof(hdr));
1812 gtk_tlv = (struct mt76_connac_gtk_rekey_tlv *)skb_put(skb,
1814 gtk_tlv->tag = cpu_to_le16(UNI_OFFLOAD_OFFLOAD_GTK_REKEY);
1815 gtk_tlv->len = cpu_to_le16(sizeof(*gtk_tlv));
1816 gtk_tlv->rekey_mode = 2;
1817 gtk_tlv->option = 1;
1820 ieee80211_iter_keys_rcu(hw, vif, mt76_connac_mcu_key_iter, gtk_tlv);
1823 memcpy(gtk_tlv->kek, key->kek, NL80211_KEK_LEN);
1824 memcpy(gtk_tlv->kck, key->kck, NL80211_KCK_LEN);
1825 memcpy(gtk_tlv->replay_ctr, key->replay_ctr, NL80211_REPLAY_CTR_LEN);
1827 return mt76_mcu_skb_send_msg(phy->dev, skb, MCU_UNI_CMD_OFFLOAD, true);
1829 EXPORT_SYMBOL_GPL(mt76_connac_mcu_update_gtk_rekey);
1832 mt76_connac_mcu_set_arp_filter(struct mt76_dev *dev, struct ieee80211_vif *vif,
1835 struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
1841 struct mt76_connac_arpns_tlv arpns;
1844 .bss_idx = mvif->idx,
1847 .tag = cpu_to_le16(UNI_OFFLOAD_OFFLOAD_ARP),
1848 .len = cpu_to_le16(sizeof(struct mt76_connac_arpns_tlv)),
1853 return mt76_mcu_send_msg(dev, MCU_UNI_CMD_OFFLOAD, &req, sizeof(req),
1858 mt76_connac_mcu_set_gtk_rekey(struct mt76_dev *dev, struct ieee80211_vif *vif,
1861 struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
1867 struct mt76_connac_gtk_rekey_tlv gtk_tlv;
1870 .bss_idx = mvif->idx,
1873 .tag = cpu_to_le16(UNI_OFFLOAD_OFFLOAD_GTK_REKEY),
1874 .len = cpu_to_le16(sizeof(struct mt76_connac_gtk_rekey_tlv)),
1875 .rekey_mode = !suspend,
1879 return mt76_mcu_send_msg(dev, MCU_UNI_CMD_OFFLOAD, &req, sizeof(req),
1884 mt76_connac_mcu_set_suspend_mode(struct mt76_dev *dev,
1885 struct ieee80211_vif *vif,
1886 bool enable, u8 mdtim,
1889 struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
1895 struct mt76_connac_suspend_tlv suspend_tlv;
1898 .bss_idx = mvif->idx,
1901 .tag = cpu_to_le16(UNI_SUSPEND_MODE_SETTING),
1902 .len = cpu_to_le16(sizeof(struct mt76_connac_suspend_tlv)),
1905 .wow_suspend = wow_suspend,
1909 return mt76_mcu_send_msg(dev, MCU_UNI_CMD_SUSPEND, &req, sizeof(req),
1914 mt76_connac_mcu_set_wow_pattern(struct mt76_dev *dev,
1915 struct ieee80211_vif *vif,
1916 u8 index, bool enable,
1917 struct cfg80211_pkt_pattern *pattern)
1919 struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
1920 struct mt76_connac_wow_pattern_tlv *ptlv;
1921 struct sk_buff *skb;
1926 .bss_idx = mvif->idx,
1929 skb = mt76_mcu_msg_alloc(dev, NULL, sizeof(hdr) + sizeof(*ptlv));
1933 skb_put_data(skb, &hdr, sizeof(hdr));
1934 ptlv = (struct mt76_connac_wow_pattern_tlv *)skb_put(skb, sizeof(*ptlv));
1935 ptlv->tag = cpu_to_le16(UNI_SUSPEND_WOW_PATTERN);
1936 ptlv->len = cpu_to_le16(sizeof(*ptlv));
1937 ptlv->data_len = pattern->pattern_len;
1938 ptlv->enable = enable;
1939 ptlv->index = index;
1941 memcpy(ptlv->pattern, pattern->pattern, pattern->pattern_len);
1942 memcpy(ptlv->mask, pattern->mask, pattern->pattern_len / 8);
1944 return mt76_mcu_skb_send_msg(dev, skb, MCU_UNI_CMD_SUSPEND, true);
1948 mt76_connac_mcu_set_wow_ctrl(struct mt76_phy *phy, struct ieee80211_vif *vif,
1949 bool suspend, struct cfg80211_wowlan *wowlan)
1951 struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
1952 struct mt76_dev *dev = phy->dev;
1958 struct mt76_connac_wow_ctrl_tlv wow_ctrl_tlv;
1959 struct mt76_connac_wow_gpio_param_tlv gpio_tlv;
1962 .bss_idx = mvif->idx,
1965 .tag = cpu_to_le16(UNI_SUSPEND_WOW_CTRL),
1966 .len = cpu_to_le16(sizeof(struct mt76_connac_wow_ctrl_tlv)),
1967 .cmd = suspend ? 1 : 2,
1970 .tag = cpu_to_le16(UNI_SUSPEND_WOW_GPIO_PARAM),
1971 .len = cpu_to_le16(sizeof(struct mt76_connac_wow_gpio_param_tlv)),
1972 .gpio_pin = 0xff, /* follow fw about GPIO pin */
1976 if (wowlan->magic_pkt)
1977 req.wow_ctrl_tlv.trigger |= BIT(0);
1978 if (wowlan->disconnect)
1979 req.wow_ctrl_tlv.trigger |= BIT(2);
1980 if (wowlan->nd_config) {
1981 mt76_connac_mcu_sched_scan_req(phy, vif, wowlan->nd_config);
1982 req.wow_ctrl_tlv.trigger |= BIT(5);
1983 mt76_connac_mcu_sched_scan_enable(phy, vif, suspend);
1986 if (mt76_is_mmio(dev))
1987 req.wow_ctrl_tlv.wakeup_hif = WOW_PCIE;
1988 else if (mt76_is_usb(dev))
1989 req.wow_ctrl_tlv.wakeup_hif = WOW_USB;
1990 else if (mt76_is_sdio(dev))
1991 req.wow_ctrl_tlv.wakeup_hif = WOW_GPIO;
1993 return mt76_mcu_send_msg(dev, MCU_UNI_CMD_SUSPEND, &req, sizeof(req),
1997 int mt76_connac_mcu_set_hif_suspend(struct mt76_dev *dev, bool suspend)
2001 u8 hif_type; /* 0x0: HIF_SDIO
2007 struct hif_suspend_tlv {
2011 } __packed hif_suspend;
2014 .tag = cpu_to_le16(0), /* 0: UNI_HIF_CTRL_BASIC */
2015 .len = cpu_to_le16(sizeof(struct hif_suspend_tlv)),
2020 if (mt76_is_mmio(dev))
2021 req.hdr.hif_type = 2;
2022 else if (mt76_is_usb(dev))
2023 req.hdr.hif_type = 1;
2024 else if (mt76_is_sdio(dev))
2025 req.hdr.hif_type = 0;
2027 return mt76_mcu_send_msg(dev, MCU_UNI_CMD_HIF_CTRL, &req, sizeof(req),
2030 EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_hif_suspend);
2032 void mt76_connac_mcu_set_suspend_iter(void *priv, u8 *mac,
2033 struct ieee80211_vif *vif)
2035 struct mt76_phy *phy = priv;
2036 bool suspend = test_bit(MT76_STATE_SUSPEND, &phy->state);
2037 struct ieee80211_hw *hw = phy->hw;
2038 struct cfg80211_wowlan *wowlan = hw->wiphy->wowlan_config;
2041 mt76_connac_mcu_set_gtk_rekey(phy->dev, vif, suspend);
2042 mt76_connac_mcu_set_arp_filter(phy->dev, vif, suspend);
2044 mt76_connac_mcu_set_suspend_mode(phy->dev, vif, suspend, 1, true);
2046 for (i = 0; i < wowlan->n_patterns; i++)
2047 mt76_connac_mcu_set_wow_pattern(phy->dev, vif, i, suspend,
2048 &wowlan->patterns[i]);
2049 mt76_connac_mcu_set_wow_ctrl(phy, vif, suspend, wowlan);
2051 EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_suspend_iter);
2053 #endif /* CONFIG_PM */
2055 MODULE_AUTHOR("Lorenzo Bianconi <lorenzo@kernel.org>");
2056 MODULE_LICENSE("Dual BSD/GPL");