1 // SPDX-License-Identifier: ISC
2 /* Copyright (C) 2020 MediaTek Inc. */
4 #include <linux/firmware.h>
5 #include "mt76_connac2_mac.h"
6 #include "mt76_connac_mcu.h"
8 int mt76_connac_mcu_start_firmware(struct mt76_dev *dev, u32 addr, u32 option)
14 .option = cpu_to_le32(option),
15 .addr = cpu_to_le32(addr),
18 return mt76_mcu_send_msg(dev, MCU_CMD(FW_START_REQ), &req,
21 EXPORT_SYMBOL_GPL(mt76_connac_mcu_start_firmware);
23 int mt76_connac_mcu_patch_sem_ctrl(struct mt76_dev *dev, bool get)
25 u32 op = get ? PATCH_SEM_GET : PATCH_SEM_RELEASE;
29 .op = cpu_to_le32(op),
32 return mt76_mcu_send_msg(dev, MCU_CMD(PATCH_SEM_CONTROL),
33 &req, sizeof(req), true);
35 EXPORT_SYMBOL_GPL(mt76_connac_mcu_patch_sem_ctrl);
37 int mt76_connac_mcu_start_patch(struct mt76_dev *dev)
46 return mt76_mcu_send_msg(dev, MCU_CMD(PATCH_FINISH_REQ),
47 &req, sizeof(req), true);
49 EXPORT_SYMBOL_GPL(mt76_connac_mcu_start_patch);
51 #define MCU_PATCH_ADDRESS 0x200000
53 int mt76_connac_mcu_init_download(struct mt76_dev *dev, u32 addr, u32 len,
61 .addr = cpu_to_le32(addr),
62 .len = cpu_to_le32(len),
63 .mode = cpu_to_le32(mode),
67 if ((!is_connac_v1(dev) && addr == MCU_PATCH_ADDRESS) ||
68 (is_mt7921(dev) && addr == 0x900000) ||
69 (is_mt7925(dev) && (addr == 0x900000 || addr == 0xe0002800)) ||
70 (is_mt7996(dev) && addr == 0x900000) ||
71 (is_mt7992(dev) && addr == 0x900000))
72 cmd = MCU_CMD(PATCH_START_REQ);
74 cmd = MCU_CMD(TARGET_ADDRESS_LEN_REQ);
76 return mt76_mcu_send_msg(dev, cmd, &req, sizeof(req), true);
78 EXPORT_SYMBOL_GPL(mt76_connac_mcu_init_download);
80 int mt76_connac_mcu_set_channel_domain(struct mt76_phy *phy)
82 int len, i, n_max_channels, n_2ch = 0, n_5ch = 0, n_6ch = 0;
83 struct mt76_connac_mcu_channel_domain {
84 u8 alpha2[4]; /* regulatory_request.alpha2 */
85 u8 bw_2g; /* BW_20_40M 0
100 .bw_5g = 3, /* BW_20_40_80_160M */
103 struct mt76_connac_mcu_chan {
108 struct mt76_dev *dev = phy->dev;
109 struct ieee80211_channel *chan;
112 n_max_channels = phy->sband_2g.sband.n_channels +
113 phy->sband_5g.sband.n_channels +
114 phy->sband_6g.sband.n_channels;
115 len = sizeof(hdr) + n_max_channels * sizeof(channel);
117 skb = mt76_mcu_msg_alloc(dev, NULL, len);
121 skb_reserve(skb, sizeof(hdr));
123 for (i = 0; i < phy->sband_2g.sband.n_channels; i++) {
124 chan = &phy->sband_2g.sband.channels[i];
125 if (chan->flags & IEEE80211_CHAN_DISABLED)
128 channel.hw_value = cpu_to_le16(chan->hw_value);
129 channel.flags = cpu_to_le32(chan->flags);
132 skb_put_data(skb, &channel, sizeof(channel));
135 for (i = 0; i < phy->sband_5g.sband.n_channels; i++) {
136 chan = &phy->sband_5g.sband.channels[i];
137 if (chan->flags & IEEE80211_CHAN_DISABLED)
140 channel.hw_value = cpu_to_le16(chan->hw_value);
141 channel.flags = cpu_to_le32(chan->flags);
144 skb_put_data(skb, &channel, sizeof(channel));
147 for (i = 0; i < phy->sband_6g.sband.n_channels; i++) {
148 chan = &phy->sband_6g.sband.channels[i];
149 if (chan->flags & IEEE80211_CHAN_DISABLED)
152 channel.hw_value = cpu_to_le16(chan->hw_value);
153 channel.flags = cpu_to_le32(chan->flags);
156 skb_put_data(skb, &channel, sizeof(channel));
160 BUILD_BUG_ON(sizeof(dev->alpha2) > sizeof(hdr.alpha2));
161 memcpy(hdr.alpha2, dev->alpha2, sizeof(dev->alpha2));
166 memcpy(__skb_push(skb, sizeof(hdr)), &hdr, sizeof(hdr));
168 return mt76_mcu_skb_send_msg(dev, skb, MCU_CE_CMD(SET_CHAN_DOMAIN),
171 EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_channel_domain);
173 int mt76_connac_mcu_set_mac_enable(struct mt76_dev *dev, int band, bool enable,
180 } __packed req_mac = {
185 return mt76_mcu_send_msg(dev, MCU_EXT_CMD(MAC_INIT_CTRL), &req_mac,
186 sizeof(req_mac), true);
188 EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_mac_enable);
190 int mt76_connac_mcu_set_vif_ps(struct mt76_dev *dev, struct ieee80211_vif *vif)
192 struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
195 u8 ps_state; /* 0: device awake
196 * 1: static power save
197 * 2: dynamic power saving
200 .bss_idx = mvif->idx,
201 .ps_state = vif->cfg.ps ? 2 : 0,
204 if (vif->type != NL80211_IFTYPE_STATION)
207 return mt76_mcu_send_msg(dev, MCU_CE_CMD(SET_PS_PROFILE),
208 &req, sizeof(req), false);
210 EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_vif_ps);
212 int mt76_connac_mcu_set_rts_thresh(struct mt76_dev *dev, u32 val, u8 band)
223 .len_thresh = cpu_to_le32(val),
224 .pkt_thresh = cpu_to_le32(0x2),
227 return mt76_mcu_send_msg(dev, MCU_EXT_CMD(PROTECT_CTRL), &req,
230 EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_rts_thresh);
232 void mt76_connac_mcu_beacon_loss_iter(void *priv, u8 *mac,
233 struct ieee80211_vif *vif)
235 struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
236 struct mt76_connac_beacon_loss_event *event = priv;
238 if (mvif->idx != event->bss_idx)
241 if (!(vif->driver_flags & IEEE80211_VIF_BEACON_FILTER))
244 ieee80211_beacon_loss(vif);
246 EXPORT_SYMBOL_GPL(mt76_connac_mcu_beacon_loss_iter);
249 mt76_connac_mcu_add_nested_tlv(struct sk_buff *skb, int tag, int len,
250 void *sta_ntlv, void *sta_wtbl)
252 struct sta_ntlv_hdr *ntlv_hdr = sta_ntlv;
253 struct tlv *sta_hdr = sta_wtbl;
254 struct tlv *ptlv, tlv = {
255 .tag = cpu_to_le16(tag),
256 .len = cpu_to_le16(len),
260 ptlv = skb_put(skb, len);
261 memcpy(ptlv, &tlv, sizeof(tlv));
263 ntlv = le16_to_cpu(ntlv_hdr->tlv_num);
264 ntlv_hdr->tlv_num = cpu_to_le16(ntlv + 1);
267 len += le16_to_cpu(sta_hdr->len);
268 sta_hdr->len = cpu_to_le16(len);
273 EXPORT_SYMBOL_GPL(mt76_connac_mcu_add_nested_tlv);
276 __mt76_connac_mcu_alloc_sta_req(struct mt76_dev *dev, struct mt76_vif *mvif,
277 struct mt76_wcid *wcid, int len)
279 struct sta_req_hdr hdr = {
280 .bss_idx = mvif->idx,
281 .muar_idx = wcid ? mvif->omac_idx : 0,
286 if (is_mt799x(dev) && !wcid->sta)
289 mt76_connac_mcu_get_wlan_idx(dev, wcid, &hdr.wlan_idx_lo,
291 skb = mt76_mcu_msg_alloc(dev, NULL, len);
293 return ERR_PTR(-ENOMEM);
295 skb_put_data(skb, &hdr, sizeof(hdr));
299 EXPORT_SYMBOL_GPL(__mt76_connac_mcu_alloc_sta_req);
301 struct wtbl_req_hdr *
302 mt76_connac_mcu_alloc_wtbl_req(struct mt76_dev *dev, struct mt76_wcid *wcid,
303 int cmd, void *sta_wtbl, struct sk_buff **skb)
305 struct tlv *sta_hdr = sta_wtbl;
306 struct wtbl_req_hdr hdr = {
309 struct sk_buff *nskb = *skb;
311 mt76_connac_mcu_get_wlan_idx(dev, wcid, &hdr.wlan_idx_lo,
314 nskb = mt76_mcu_msg_alloc(dev, NULL,
315 MT76_CONNAC_WTBL_UPDATE_MAX_SIZE);
317 return ERR_PTR(-ENOMEM);
323 le16_add_cpu(&sta_hdr->len, sizeof(hdr));
325 return skb_put_data(nskb, &hdr, sizeof(hdr));
327 EXPORT_SYMBOL_GPL(mt76_connac_mcu_alloc_wtbl_req);
329 void mt76_connac_mcu_bss_omac_tlv(struct sk_buff *skb,
330 struct ieee80211_vif *vif)
332 struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
333 u8 omac_idx = mvif->omac_idx;
334 struct bss_info_omac *omac;
339 case NL80211_IFTYPE_MONITOR:
340 case NL80211_IFTYPE_MESH_POINT:
341 case NL80211_IFTYPE_AP:
343 type = CONNECTION_P2P_GO;
345 type = CONNECTION_INFRA_AP;
347 case NL80211_IFTYPE_STATION:
349 type = CONNECTION_P2P_GC;
351 type = CONNECTION_INFRA_STA;
353 case NL80211_IFTYPE_ADHOC:
354 type = CONNECTION_IBSS_ADHOC;
361 tlv = mt76_connac_mcu_add_tlv(skb, BSS_INFO_OMAC, sizeof(*omac));
363 omac = (struct bss_info_omac *)tlv;
364 omac->conn_type = cpu_to_le32(type);
365 omac->omac_idx = mvif->omac_idx;
366 omac->band_idx = mvif->band_idx;
367 omac->hw_bss_idx = omac_idx > EXT_BSSID_START ? HW_BSSID_0 : omac_idx;
369 EXPORT_SYMBOL_GPL(mt76_connac_mcu_bss_omac_tlv);
371 void mt76_connac_mcu_sta_basic_tlv(struct mt76_dev *dev, struct sk_buff *skb,
372 struct ieee80211_vif *vif,
373 struct ieee80211_sta *sta,
374 bool enable, bool newly)
376 struct sta_rec_basic *basic;
380 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_BASIC, sizeof(*basic));
382 basic = (struct sta_rec_basic *)tlv;
383 basic->extra_info = cpu_to_le16(EXTRA_INFO_VER);
387 basic->extra_info |= cpu_to_le16(EXTRA_INFO_NEW);
388 basic->conn_state = CONN_STATE_PORT_SECURE;
390 basic->conn_state = CONN_STATE_DISCONNECT;
394 basic->conn_type = cpu_to_le32(CONNECTION_INFRA_BC);
395 eth_broadcast_addr(basic->peer_addr);
400 case NL80211_IFTYPE_MESH_POINT:
401 case NL80211_IFTYPE_AP:
402 if (vif->p2p && !is_mt7921(dev))
403 conn_type = CONNECTION_P2P_GC;
405 conn_type = CONNECTION_INFRA_STA;
406 basic->conn_type = cpu_to_le32(conn_type);
407 basic->aid = cpu_to_le16(sta->aid);
409 case NL80211_IFTYPE_STATION:
410 if (vif->p2p && !is_mt7921(dev))
411 conn_type = CONNECTION_P2P_GO;
413 conn_type = CONNECTION_INFRA_AP;
414 basic->conn_type = cpu_to_le32(conn_type);
415 basic->aid = cpu_to_le16(vif->cfg.aid);
417 case NL80211_IFTYPE_ADHOC:
418 basic->conn_type = cpu_to_le32(CONNECTION_IBSS_ADHOC);
419 basic->aid = cpu_to_le16(sta->aid);
426 memcpy(basic->peer_addr, sta->addr, ETH_ALEN);
427 basic->qos = sta->wme;
429 EXPORT_SYMBOL_GPL(mt76_connac_mcu_sta_basic_tlv);
431 void mt76_connac_mcu_sta_uapsd(struct sk_buff *skb, struct ieee80211_vif *vif,
432 struct ieee80211_sta *sta)
434 struct sta_rec_uapsd *uapsd;
437 if (vif->type != NL80211_IFTYPE_AP || !sta->wme)
440 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_APPS, sizeof(*uapsd));
441 uapsd = (struct sta_rec_uapsd *)tlv;
443 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO) {
444 uapsd->dac_map |= BIT(3);
445 uapsd->tac_map |= BIT(3);
447 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI) {
448 uapsd->dac_map |= BIT(2);
449 uapsd->tac_map |= BIT(2);
451 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE) {
452 uapsd->dac_map |= BIT(1);
453 uapsd->tac_map |= BIT(1);
455 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK) {
456 uapsd->dac_map |= BIT(0);
457 uapsd->tac_map |= BIT(0);
459 uapsd->max_sp = sta->max_sp;
461 EXPORT_SYMBOL_GPL(mt76_connac_mcu_sta_uapsd);
463 void mt76_connac_mcu_wtbl_hdr_trans_tlv(struct sk_buff *skb,
464 struct ieee80211_vif *vif,
465 struct mt76_wcid *wcid,
466 void *sta_wtbl, void *wtbl_tlv)
468 struct wtbl_hdr_trans *htr;
471 tlv = mt76_connac_mcu_add_nested_tlv(skb, WTBL_HDR_TRANS,
474 htr = (struct wtbl_hdr_trans *)tlv;
475 htr->no_rx_trans = true;
477 if (vif->type == NL80211_IFTYPE_STATION)
485 htr->no_rx_trans = !test_bit(MT_WCID_FLAG_HDR_TRANS, &wcid->flags);
486 if (test_bit(MT_WCID_FLAG_4ADDR, &wcid->flags)) {
491 EXPORT_SYMBOL_GPL(mt76_connac_mcu_wtbl_hdr_trans_tlv);
493 int mt76_connac_mcu_sta_update_hdr_trans(struct mt76_dev *dev,
494 struct ieee80211_vif *vif,
495 struct mt76_wcid *wcid, int cmd)
497 struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
498 struct wtbl_req_hdr *wtbl_hdr;
499 struct tlv *sta_wtbl;
502 skb = mt76_connac_mcu_alloc_sta_req(dev, mvif, wcid);
506 sta_wtbl = mt76_connac_mcu_add_tlv(skb, STA_REC_WTBL,
509 wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(dev, wcid, WTBL_SET,
511 if (IS_ERR(wtbl_hdr))
512 return PTR_ERR(wtbl_hdr);
514 mt76_connac_mcu_wtbl_hdr_trans_tlv(skb, vif, wcid, sta_wtbl, wtbl_hdr);
516 return mt76_mcu_skb_send_msg(dev, skb, cmd, true);
518 EXPORT_SYMBOL_GPL(mt76_connac_mcu_sta_update_hdr_trans);
520 int mt76_connac_mcu_wtbl_update_hdr_trans(struct mt76_dev *dev,
521 struct ieee80211_vif *vif,
522 struct ieee80211_sta *sta)
524 struct mt76_wcid *wcid = (struct mt76_wcid *)sta->drv_priv;
525 struct wtbl_req_hdr *wtbl_hdr;
526 struct sk_buff *skb = NULL;
528 wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(dev, wcid, WTBL_SET, NULL,
530 if (IS_ERR(wtbl_hdr))
531 return PTR_ERR(wtbl_hdr);
533 mt76_connac_mcu_wtbl_hdr_trans_tlv(skb, vif, wcid, NULL, wtbl_hdr);
535 return mt76_mcu_skb_send_msg(dev, skb, MCU_EXT_CMD(WTBL_UPDATE), true);
537 EXPORT_SYMBOL_GPL(mt76_connac_mcu_wtbl_update_hdr_trans);
539 void mt76_connac_mcu_wtbl_generic_tlv(struct mt76_dev *dev,
541 struct ieee80211_vif *vif,
542 struct ieee80211_sta *sta,
543 void *sta_wtbl, void *wtbl_tlv)
545 struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
546 struct wtbl_generic *generic;
548 struct wtbl_spe *spe;
551 tlv = mt76_connac_mcu_add_nested_tlv(skb, WTBL_GENERIC,
555 generic = (struct wtbl_generic *)tlv;
558 if (vif->type == NL80211_IFTYPE_STATION)
559 generic->partial_aid = cpu_to_le16(vif->cfg.aid);
561 generic->partial_aid = cpu_to_le16(sta->aid);
562 memcpy(generic->peer_addr, sta->addr, ETH_ALEN);
563 generic->muar_idx = mvif->omac_idx;
564 generic->qos = sta->wme;
566 if (!is_connac_v1(dev) && vif->type == NL80211_IFTYPE_STATION)
567 memcpy(generic->peer_addr, vif->bss_conf.bssid,
570 eth_broadcast_addr(generic->peer_addr);
572 generic->muar_idx = 0xe;
575 tlv = mt76_connac_mcu_add_nested_tlv(skb, WTBL_RX, sizeof(*rx),
578 rx = (struct wtbl_rx *)tlv;
579 rx->rca1 = sta ? vif->type != NL80211_IFTYPE_AP : 1;
583 if (!is_connac_v1(dev))
586 tlv = mt76_connac_mcu_add_nested_tlv(skb, WTBL_SPE, sizeof(*spe),
588 spe = (struct wtbl_spe *)tlv;
591 EXPORT_SYMBOL_GPL(mt76_connac_mcu_wtbl_generic_tlv);
594 mt76_connac_mcu_sta_amsdu_tlv(struct sk_buff *skb, struct ieee80211_sta *sta,
595 struct ieee80211_vif *vif)
597 struct mt76_wcid *wcid = (struct mt76_wcid *)sta->drv_priv;
598 struct sta_rec_amsdu *amsdu;
601 if (vif->type != NL80211_IFTYPE_AP &&
602 vif->type != NL80211_IFTYPE_STATION)
605 if (!sta->deflink.agg.max_amsdu_len)
608 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_HW_AMSDU, sizeof(*amsdu));
609 amsdu = (struct sta_rec_amsdu *)tlv;
610 amsdu->max_amsdu_num = 8;
611 amsdu->amsdu_en = true;
612 amsdu->max_mpdu_size = sta->deflink.agg.max_amsdu_len >=
613 IEEE80211_MAX_MPDU_LEN_VHT_7991;
618 #define HE_PHY(p, c) u8_get_bits(c, IEEE80211_HE_PHY_##p)
619 #define HE_MAC(m, c) u8_get_bits(c, IEEE80211_HE_MAC_##m)
621 mt76_connac_mcu_sta_he_tlv(struct sk_buff *skb, struct ieee80211_sta *sta)
623 struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap;
624 struct ieee80211_he_cap_elem *elem = &he_cap->he_cap_elem;
625 struct sta_rec_he *he;
629 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_HE, sizeof(*he));
631 he = (struct sta_rec_he *)tlv;
633 if (elem->mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_HTC_HE)
634 cap |= STA_REC_HE_CAP_HTC;
636 if (elem->mac_cap_info[2] & IEEE80211_HE_MAC_CAP2_BSR)
637 cap |= STA_REC_HE_CAP_BSR;
639 if (elem->mac_cap_info[3] & IEEE80211_HE_MAC_CAP3_OMI_CONTROL)
640 cap |= STA_REC_HE_CAP_OM;
642 if (elem->mac_cap_info[4] & IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU)
643 cap |= STA_REC_HE_CAP_AMSDU_IN_AMPDU;
645 if (elem->mac_cap_info[4] & IEEE80211_HE_MAC_CAP4_BQR)
646 cap |= STA_REC_HE_CAP_BQR;
648 if (elem->phy_cap_info[0] &
649 (IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_RU_MAPPING_IN_2G |
650 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_RU_MAPPING_IN_5G))
651 cap |= STA_REC_HE_CAP_BW20_RU242_SUPPORT;
653 if (elem->phy_cap_info[1] &
654 IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD)
655 cap |= STA_REC_HE_CAP_LDPC;
657 if (elem->phy_cap_info[1] &
658 IEEE80211_HE_PHY_CAP1_HE_LTF_AND_GI_FOR_HE_PPDUS_0_8US)
659 cap |= STA_REC_HE_CAP_SU_PPDU_1LTF_8US_GI;
661 if (elem->phy_cap_info[2] &
662 IEEE80211_HE_PHY_CAP2_NDP_4x_LTF_AND_3_2US)
663 cap |= STA_REC_HE_CAP_NDP_4LTF_3DOT2MS_GI;
665 if (elem->phy_cap_info[2] &
666 IEEE80211_HE_PHY_CAP2_STBC_TX_UNDER_80MHZ)
667 cap |= STA_REC_HE_CAP_LE_EQ_80M_TX_STBC;
669 if (elem->phy_cap_info[2] &
670 IEEE80211_HE_PHY_CAP2_STBC_RX_UNDER_80MHZ)
671 cap |= STA_REC_HE_CAP_LE_EQ_80M_RX_STBC;
673 if (elem->phy_cap_info[6] &
674 IEEE80211_HE_PHY_CAP6_PARTIAL_BW_EXT_RANGE)
675 cap |= STA_REC_HE_CAP_PARTIAL_BW_EXT_RANGE;
677 if (elem->phy_cap_info[7] &
678 IEEE80211_HE_PHY_CAP7_HE_SU_MU_PPDU_4XLTF_AND_08_US_GI)
679 cap |= STA_REC_HE_CAP_SU_MU_PPDU_4LTF_8US_GI;
681 if (elem->phy_cap_info[7] &
682 IEEE80211_HE_PHY_CAP7_STBC_TX_ABOVE_80MHZ)
683 cap |= STA_REC_HE_CAP_GT_80M_TX_STBC;
685 if (elem->phy_cap_info[7] &
686 IEEE80211_HE_PHY_CAP7_STBC_RX_ABOVE_80MHZ)
687 cap |= STA_REC_HE_CAP_GT_80M_RX_STBC;
689 if (elem->phy_cap_info[8] &
690 IEEE80211_HE_PHY_CAP8_HE_ER_SU_PPDU_4XLTF_AND_08_US_GI)
691 cap |= STA_REC_HE_CAP_ER_SU_PPDU_4LTF_8US_GI;
693 if (elem->phy_cap_info[8] &
694 IEEE80211_HE_PHY_CAP8_HE_ER_SU_1XLTF_AND_08_US_GI)
695 cap |= STA_REC_HE_CAP_ER_SU_PPDU_1LTF_8US_GI;
697 if (elem->phy_cap_info[9] &
698 IEEE80211_HE_PHY_CAP9_NON_TRIGGERED_CQI_FEEDBACK)
699 cap |= STA_REC_HE_CAP_TRIG_CQI_FK;
701 if (elem->phy_cap_info[9] &
702 IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU)
703 cap |= STA_REC_HE_CAP_TX_1024QAM_UNDER_RU242;
705 if (elem->phy_cap_info[9] &
706 IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU)
707 cap |= STA_REC_HE_CAP_RX_1024QAM_UNDER_RU242;
709 he->he_cap = cpu_to_le32(cap);
711 switch (sta->deflink.bandwidth) {
712 case IEEE80211_STA_RX_BW_160:
713 if (elem->phy_cap_info[0] &
714 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
715 he->max_nss_mcs[CMD_HE_MCS_BW8080] =
716 he_cap->he_mcs_nss_supp.rx_mcs_80p80;
718 he->max_nss_mcs[CMD_HE_MCS_BW160] =
719 he_cap->he_mcs_nss_supp.rx_mcs_160;
722 he->max_nss_mcs[CMD_HE_MCS_BW80] =
723 he_cap->he_mcs_nss_supp.rx_mcs_80;
728 HE_MAC(CAP1_TF_MAC_PAD_DUR_MASK, elem->mac_cap_info[1]);
730 HE_MAC(CAP3_MAX_AMPDU_LEN_EXP_MASK, elem->mac_cap_info[3]);
733 HE_PHY(CAP0_CHANNEL_WIDTH_SET_MASK, elem->phy_cap_info[0]);
735 HE_PHY(CAP1_DEVICE_CLASS_A, elem->phy_cap_info[1]);
737 HE_PHY(CAP1_PREAMBLE_PUNC_RX_MASK, elem->phy_cap_info[1]);
740 HE_PHY(CAP3_DCM_MAX_CONST_TX_MASK, elem->phy_cap_info[3]);
742 HE_PHY(CAP3_DCM_MAX_TX_NSS_2, elem->phy_cap_info[3]);
744 HE_PHY(CAP3_DCM_MAX_CONST_RX_MASK, elem->phy_cap_info[3]);
746 HE_PHY(CAP3_DCM_MAX_RX_NSS_2, elem->phy_cap_info[3]);
748 HE_PHY(CAP8_DCM_MAX_RU_MASK, elem->phy_cap_info[8]);
754 mt76_connac_mcu_sta_he_tlv_v2(struct sk_buff *skb, struct ieee80211_sta *sta)
756 struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap;
757 struct ieee80211_he_cap_elem *elem = &he_cap->he_cap_elem;
758 struct sta_rec_he_v2 *he;
761 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_HE_V2, sizeof(*he));
763 he = (struct sta_rec_he_v2 *)tlv;
764 memcpy(he->he_phy_cap, elem->phy_cap_info, sizeof(he->he_phy_cap));
765 memcpy(he->he_mac_cap, elem->mac_cap_info, sizeof(he->he_mac_cap));
767 switch (sta->deflink.bandwidth) {
768 case IEEE80211_STA_RX_BW_160:
769 if (elem->phy_cap_info[0] &
770 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
771 he->max_nss_mcs[CMD_HE_MCS_BW8080] =
772 he_cap->he_mcs_nss_supp.rx_mcs_80p80;
774 he->max_nss_mcs[CMD_HE_MCS_BW160] =
775 he_cap->he_mcs_nss_supp.rx_mcs_160;
778 he->max_nss_mcs[CMD_HE_MCS_BW80] =
779 he_cap->he_mcs_nss_supp.rx_mcs_80;
783 he->pkt_ext = IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_16US;
785 EXPORT_SYMBOL_GPL(mt76_connac_mcu_sta_he_tlv_v2);
788 mt76_connac_get_phy_mode_v2(struct mt76_phy *mphy, struct ieee80211_vif *vif,
789 enum nl80211_band band, struct ieee80211_sta *sta)
791 struct ieee80211_sta_ht_cap *ht_cap;
792 struct ieee80211_sta_vht_cap *vht_cap;
793 const struct ieee80211_sta_he_cap *he_cap;
794 const struct ieee80211_sta_eht_cap *eht_cap;
798 ht_cap = &sta->deflink.ht_cap;
799 vht_cap = &sta->deflink.vht_cap;
800 he_cap = &sta->deflink.he_cap;
801 eht_cap = &sta->deflink.eht_cap;
803 struct ieee80211_supported_band *sband;
805 sband = mphy->hw->wiphy->bands[band];
806 ht_cap = &sband->ht_cap;
807 vht_cap = &sband->vht_cap;
808 he_cap = ieee80211_get_he_iftype_cap(sband, vif->type);
809 eht_cap = ieee80211_get_eht_iftype_cap(sband, vif->type);
812 if (band == NL80211_BAND_2GHZ) {
813 mode |= PHY_TYPE_BIT_HR_DSSS | PHY_TYPE_BIT_ERP;
815 if (ht_cap->ht_supported)
816 mode |= PHY_TYPE_BIT_HT;
818 if (he_cap && he_cap->has_he)
819 mode |= PHY_TYPE_BIT_HE;
821 if (eht_cap && eht_cap->has_eht)
822 mode |= PHY_TYPE_BIT_BE;
823 } else if (band == NL80211_BAND_5GHZ || band == NL80211_BAND_6GHZ) {
824 mode |= PHY_TYPE_BIT_OFDM;
826 if (ht_cap->ht_supported)
827 mode |= PHY_TYPE_BIT_HT;
829 if (vht_cap->vht_supported)
830 mode |= PHY_TYPE_BIT_VHT;
832 if (he_cap && he_cap->has_he)
833 mode |= PHY_TYPE_BIT_HE;
835 if (eht_cap && eht_cap->has_eht)
836 mode |= PHY_TYPE_BIT_BE;
841 EXPORT_SYMBOL_GPL(mt76_connac_get_phy_mode_v2);
843 void mt76_connac_mcu_sta_tlv(struct mt76_phy *mphy, struct sk_buff *skb,
844 struct ieee80211_sta *sta,
845 struct ieee80211_vif *vif,
846 u8 rcpi, u8 sta_state)
848 struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
849 struct cfg80211_chan_def *chandef = mvif->ctx ?
850 &mvif->ctx->def : &mphy->chandef;
851 enum nl80211_band band = chandef->chan->band;
852 struct mt76_dev *dev = mphy->dev;
853 struct sta_rec_ra_info *ra_info;
854 struct sta_rec_state *state;
855 struct sta_rec_phy *phy;
860 if (sta->deflink.ht_cap.ht_supported) {
861 struct sta_rec_ht *ht;
863 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_HT, sizeof(*ht));
864 ht = (struct sta_rec_ht *)tlv;
865 ht->ht_cap = cpu_to_le16(sta->deflink.ht_cap.cap);
869 if (sta->deflink.vht_cap.vht_supported) {
870 struct sta_rec_vht *vht;
873 len = is_mt7921(dev) ? sizeof(*vht) : sizeof(*vht) - 4;
874 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_VHT, len);
875 vht = (struct sta_rec_vht *)tlv;
876 vht->vht_cap = cpu_to_le32(sta->deflink.vht_cap.cap);
877 vht->vht_rx_mcs_map = sta->deflink.vht_cap.vht_mcs.rx_mcs_map;
878 vht->vht_tx_mcs_map = sta->deflink.vht_cap.vht_mcs.tx_mcs_map;
882 mt76_connac_mcu_sta_uapsd(skb, vif, sta);
887 if (sta->deflink.ht_cap.ht_supported || sta->deflink.he_cap.has_he)
888 mt76_connac_mcu_sta_amsdu_tlv(skb, sta, vif);
891 if (sta->deflink.he_cap.has_he) {
892 mt76_connac_mcu_sta_he_tlv(skb, sta);
893 mt76_connac_mcu_sta_he_tlv_v2(skb, sta);
894 if (band == NL80211_BAND_6GHZ &&
895 sta_state == MT76_STA_INFO_STATE_ASSOC) {
896 struct sta_rec_he_6g_capa *he_6g_capa;
898 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_HE_6G,
899 sizeof(*he_6g_capa));
900 he_6g_capa = (struct sta_rec_he_6g_capa *)tlv;
901 he_6g_capa->capa = sta->deflink.he_6ghz_capa.capa;
905 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_PHY, sizeof(*phy));
906 phy = (struct sta_rec_phy *)tlv;
907 phy->phy_type = mt76_connac_get_phy_mode_v2(mphy, vif, band, sta);
908 phy->basic_rate = cpu_to_le16((u16)vif->bss_conf.basic_rates);
910 phy->ampdu = FIELD_PREP(IEEE80211_HT_AMPDU_PARM_FACTOR,
911 sta->deflink.ht_cap.ampdu_factor) |
912 FIELD_PREP(IEEE80211_HT_AMPDU_PARM_DENSITY,
913 sta->deflink.ht_cap.ampdu_density);
915 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_RA, sizeof(*ra_info));
916 ra_info = (struct sta_rec_ra_info *)tlv;
918 supp_rates = sta->deflink.supp_rates[band];
919 if (band == NL80211_BAND_2GHZ)
920 supp_rates = FIELD_PREP(RA_LEGACY_OFDM, supp_rates >> 4) |
921 FIELD_PREP(RA_LEGACY_CCK, supp_rates & 0xf);
923 supp_rates = FIELD_PREP(RA_LEGACY_OFDM, supp_rates);
925 ra_info->legacy = cpu_to_le16(supp_rates);
927 if (sta->deflink.ht_cap.ht_supported)
928 memcpy(ra_info->rx_mcs_bitmask,
929 sta->deflink.ht_cap.mcs.rx_mask,
932 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_STATE, sizeof(*state));
933 state = (struct sta_rec_state *)tlv;
934 state->state = sta_state;
936 if (sta->deflink.vht_cap.vht_supported) {
937 state->vht_opmode = sta->deflink.bandwidth;
938 state->vht_opmode |= (sta->deflink.rx_nss - 1) <<
939 IEEE80211_OPMODE_NOTIF_RX_NSS_SHIFT;
942 EXPORT_SYMBOL_GPL(mt76_connac_mcu_sta_tlv);
944 void mt76_connac_mcu_wtbl_smps_tlv(struct sk_buff *skb,
945 struct ieee80211_sta *sta,
946 void *sta_wtbl, void *wtbl_tlv)
948 struct wtbl_smps *smps;
951 tlv = mt76_connac_mcu_add_nested_tlv(skb, WTBL_SMPS, sizeof(*smps),
953 smps = (struct wtbl_smps *)tlv;
954 smps->smps = (sta->deflink.smps_mode == IEEE80211_SMPS_DYNAMIC);
956 EXPORT_SYMBOL_GPL(mt76_connac_mcu_wtbl_smps_tlv);
958 void mt76_connac_mcu_wtbl_ht_tlv(struct mt76_dev *dev, struct sk_buff *skb,
959 struct ieee80211_sta *sta, void *sta_wtbl,
960 void *wtbl_tlv, bool ht_ldpc, bool vht_ldpc)
962 struct wtbl_ht *ht = NULL;
966 if (sta->deflink.ht_cap.ht_supported || sta->deflink.he_6ghz_capa.capa) {
967 tlv = mt76_connac_mcu_add_nested_tlv(skb, WTBL_HT, sizeof(*ht),
969 ht = (struct wtbl_ht *)tlv;
970 ht->ldpc = ht_ldpc &&
971 !!(sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_LDPC_CODING);
973 if (sta->deflink.ht_cap.ht_supported) {
974 ht->af = sta->deflink.ht_cap.ampdu_factor;
975 ht->mm = sta->deflink.ht_cap.ampdu_density;
977 ht->af = le16_get_bits(sta->deflink.he_6ghz_capa.capa,
978 IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP);
979 ht->mm = le16_get_bits(sta->deflink.he_6ghz_capa.capa,
980 IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START);
986 if (sta->deflink.vht_cap.vht_supported || sta->deflink.he_6ghz_capa.capa) {
987 struct wtbl_vht *vht;
990 tlv = mt76_connac_mcu_add_nested_tlv(skb, WTBL_VHT,
991 sizeof(*vht), wtbl_tlv,
993 vht = (struct wtbl_vht *)tlv;
994 vht->ldpc = vht_ldpc &&
995 !!(sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_RXLDPC);
998 af = FIELD_GET(IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK,
999 sta->deflink.vht_cap.cap);
1001 ht->af = max(ht->af, af);
1004 mt76_connac_mcu_wtbl_smps_tlv(skb, sta, sta_wtbl, wtbl_tlv);
1006 if (is_connac_v1(dev) && sta->deflink.ht_cap.ht_supported) {
1008 u32 msk = MT_WTBL_W5_SHORT_GI_20 | MT_WTBL_W5_SHORT_GI_40 |
1009 MT_WTBL_W5_SHORT_GI_80 | MT_WTBL_W5_SHORT_GI_160;
1010 struct wtbl_raw *raw;
1012 tlv = mt76_connac_mcu_add_nested_tlv(skb, WTBL_RAW_DATA,
1013 sizeof(*raw), wtbl_tlv,
1016 if (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20)
1017 flags |= MT_WTBL_W5_SHORT_GI_20;
1018 if (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40)
1019 flags |= MT_WTBL_W5_SHORT_GI_40;
1021 if (sta->deflink.vht_cap.vht_supported) {
1022 if (sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_80)
1023 flags |= MT_WTBL_W5_SHORT_GI_80;
1024 if (sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_160)
1025 flags |= MT_WTBL_W5_SHORT_GI_160;
1027 raw = (struct wtbl_raw *)tlv;
1028 raw->val = cpu_to_le32(flags);
1029 raw->msk = cpu_to_le32(~msk);
1034 EXPORT_SYMBOL_GPL(mt76_connac_mcu_wtbl_ht_tlv);
1036 int mt76_connac_mcu_sta_cmd(struct mt76_phy *phy,
1037 struct mt76_sta_cmd_info *info)
1039 struct mt76_vif *mvif = (struct mt76_vif *)info->vif->drv_priv;
1040 struct mt76_dev *dev = phy->dev;
1041 struct wtbl_req_hdr *wtbl_hdr;
1042 struct tlv *sta_wtbl;
1043 struct sk_buff *skb;
1045 skb = mt76_connac_mcu_alloc_sta_req(dev, mvif, info->wcid);
1047 return PTR_ERR(skb);
1049 if (info->sta || !info->offload_fw)
1050 mt76_connac_mcu_sta_basic_tlv(dev, skb, info->vif, info->sta,
1051 info->enable, info->newly);
1052 if (info->sta && info->enable)
1053 mt76_connac_mcu_sta_tlv(phy, skb, info->sta,
1054 info->vif, info->rcpi,
1057 sta_wtbl = mt76_connac_mcu_add_tlv(skb, STA_REC_WTBL,
1058 sizeof(struct tlv));
1060 wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(dev, info->wcid,
1063 if (IS_ERR(wtbl_hdr))
1064 return PTR_ERR(wtbl_hdr);
1067 mt76_connac_mcu_wtbl_generic_tlv(dev, skb, info->vif,
1068 info->sta, sta_wtbl,
1070 mt76_connac_mcu_wtbl_hdr_trans_tlv(skb, info->vif, info->wcid,
1071 sta_wtbl, wtbl_hdr);
1073 mt76_connac_mcu_wtbl_ht_tlv(dev, skb, info->sta,
1078 return mt76_mcu_skb_send_msg(dev, skb, info->cmd, true);
1080 EXPORT_SYMBOL_GPL(mt76_connac_mcu_sta_cmd);
1082 void mt76_connac_mcu_wtbl_ba_tlv(struct mt76_dev *dev, struct sk_buff *skb,
1083 struct ieee80211_ampdu_params *params,
1084 bool enable, bool tx, void *sta_wtbl,
1090 tlv = mt76_connac_mcu_add_nested_tlv(skb, WTBL_BA, sizeof(*ba),
1091 wtbl_tlv, sta_wtbl);
1093 ba = (struct wtbl_ba *)tlv;
1094 ba->tid = params->tid;
1097 ba->ba_type = MT_BA_TYPE_ORIGINATOR;
1098 ba->sn = enable ? cpu_to_le16(params->ssn) : 0;
1099 ba->ba_winsize = enable ? cpu_to_le16(params->buf_size) : 0;
1102 memcpy(ba->peer_addr, params->sta->addr, ETH_ALEN);
1103 ba->ba_type = MT_BA_TYPE_RECIPIENT;
1104 ba->rst_ba_tid = params->tid;
1105 ba->rst_ba_sel = RST_BA_MAC_TID_MATCH;
1109 if (!is_connac_v1(dev)) {
1110 ba->ba_winsize = enable ? cpu_to_le16(params->buf_size) : 0;
1115 static const u8 ba_range[] = { 4, 8, 12, 24, 36, 48, 54, 64 };
1118 for (i = 7; i > 0; i--) {
1119 if (params->buf_size >= ba_range[i])
1122 ba->ba_winsize_idx = i;
1125 EXPORT_SYMBOL_GPL(mt76_connac_mcu_wtbl_ba_tlv);
1127 int mt76_connac_mcu_uni_add_dev(struct mt76_phy *phy,
1128 struct ieee80211_vif *vif,
1129 struct mt76_wcid *wcid,
1132 struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
1133 struct mt76_dev *dev = phy->dev;
1145 u8 omac_addr[ETH_ALEN];
1149 .omac_idx = mvif->omac_idx,
1150 .band_idx = mvif->band_idx,
1153 .tag = cpu_to_le16(DEV_INFO_ACTIVE),
1154 .len = cpu_to_le16(sizeof(struct req_tlv)),
1163 struct mt76_connac_bss_basic_tlv basic;
1166 .bss_idx = mvif->idx,
1169 .tag = cpu_to_le16(UNI_BSS_INFO_BASIC),
1170 .len = cpu_to_le16(sizeof(struct mt76_connac_bss_basic_tlv)),
1171 .omac_idx = mvif->omac_idx,
1172 .band_idx = mvif->band_idx,
1173 .wmm_idx = mvif->wmm_idx,
1175 .bmc_tx_wlan_idx = cpu_to_le16(wcid->idx),
1176 .sta_idx = cpu_to_le16(wcid->idx),
1180 int err, idx, cmd, len;
1183 switch (vif->type) {
1184 case NL80211_IFTYPE_MESH_POINT:
1185 case NL80211_IFTYPE_MONITOR:
1186 case NL80211_IFTYPE_AP:
1187 basic_req.basic.conn_type = cpu_to_le32(CONNECTION_INFRA_AP);
1189 case NL80211_IFTYPE_STATION:
1190 basic_req.basic.conn_type = cpu_to_le32(CONNECTION_INFRA_STA);
1192 case NL80211_IFTYPE_ADHOC:
1193 basic_req.basic.conn_type = cpu_to_le32(CONNECTION_IBSS_ADHOC);
1200 idx = mvif->omac_idx > EXT_BSSID_START ? HW_BSSID_0 : mvif->omac_idx;
1201 basic_req.basic.hw_bss_idx = idx;
1203 memcpy(dev_req.tlv.omac_addr, vif->addr, ETH_ALEN);
1205 cmd = enable ? MCU_UNI_CMD(DEV_INFO_UPDATE) : MCU_UNI_CMD(BSS_INFO_UPDATE);
1206 data = enable ? (void *)&dev_req : (void *)&basic_req;
1207 len = enable ? sizeof(dev_req) : sizeof(basic_req);
1209 err = mt76_mcu_send_msg(dev, cmd, data, len, true);
1213 cmd = enable ? MCU_UNI_CMD(BSS_INFO_UPDATE) : MCU_UNI_CMD(DEV_INFO_UPDATE);
1214 data = enable ? (void *)&basic_req : (void *)&dev_req;
1215 len = enable ? sizeof(basic_req) : sizeof(dev_req);
1217 return mt76_mcu_send_msg(dev, cmd, data, len, true);
1219 EXPORT_SYMBOL_GPL(mt76_connac_mcu_uni_add_dev);
1221 void mt76_connac_mcu_sta_ba_tlv(struct sk_buff *skb,
1222 struct ieee80211_ampdu_params *params,
1223 bool enable, bool tx)
1225 struct sta_rec_ba *ba;
1228 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_BA, sizeof(*ba));
1230 ba = (struct sta_rec_ba *)tlv;
1231 ba->ba_type = tx ? MT_BA_TYPE_ORIGINATOR : MT_BA_TYPE_RECIPIENT;
1232 ba->winsize = cpu_to_le16(params->buf_size);
1233 ba->ssn = cpu_to_le16(params->ssn);
1234 ba->ba_en = enable << params->tid;
1235 ba->amsdu = params->amsdu;
1236 ba->tid = params->tid;
1238 EXPORT_SYMBOL_GPL(mt76_connac_mcu_sta_ba_tlv);
1240 int mt76_connac_mcu_sta_wed_update(struct mt76_dev *dev, struct sk_buff *skb)
1242 if (!mt76_is_mmio(dev))
1245 if (!mtk_wed_device_active(&dev->mmio.wed))
1248 return mtk_wed_device_update_msg(&dev->mmio.wed, WED_WO_STA_REC,
1249 skb->data, skb->len);
1251 EXPORT_SYMBOL_GPL(mt76_connac_mcu_sta_wed_update);
1253 int mt76_connac_mcu_sta_ba(struct mt76_dev *dev, struct mt76_vif *mvif,
1254 struct ieee80211_ampdu_params *params,
1255 int cmd, bool enable, bool tx)
1257 struct mt76_wcid *wcid = (struct mt76_wcid *)params->sta->drv_priv;
1258 struct wtbl_req_hdr *wtbl_hdr;
1259 struct tlv *sta_wtbl;
1260 struct sk_buff *skb;
1263 skb = mt76_connac_mcu_alloc_sta_req(dev, mvif, wcid);
1265 return PTR_ERR(skb);
1267 sta_wtbl = mt76_connac_mcu_add_tlv(skb, STA_REC_WTBL,
1268 sizeof(struct tlv));
1270 wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(dev, wcid, WTBL_SET,
1272 if (IS_ERR(wtbl_hdr))
1273 return PTR_ERR(wtbl_hdr);
1275 mt76_connac_mcu_wtbl_ba_tlv(dev, skb, params, enable, tx, sta_wtbl,
1278 ret = mt76_connac_mcu_sta_wed_update(dev, skb);
1282 ret = mt76_mcu_skb_send_msg(dev, skb, cmd, true);
1286 skb = mt76_connac_mcu_alloc_sta_req(dev, mvif, wcid);
1288 return PTR_ERR(skb);
1290 mt76_connac_mcu_sta_ba_tlv(skb, params, enable, tx);
1292 ret = mt76_connac_mcu_sta_wed_update(dev, skb);
1296 return mt76_mcu_skb_send_msg(dev, skb, cmd, true);
1298 EXPORT_SYMBOL_GPL(mt76_connac_mcu_sta_ba);
1300 u8 mt76_connac_get_phy_mode(struct mt76_phy *phy, struct ieee80211_vif *vif,
1301 enum nl80211_band band, struct ieee80211_sta *sta)
1303 struct mt76_dev *dev = phy->dev;
1304 const struct ieee80211_sta_he_cap *he_cap;
1305 struct ieee80211_sta_vht_cap *vht_cap;
1306 struct ieee80211_sta_ht_cap *ht_cap;
1309 if (is_connac_v1(dev))
1313 ht_cap = &sta->deflink.ht_cap;
1314 vht_cap = &sta->deflink.vht_cap;
1315 he_cap = &sta->deflink.he_cap;
1317 struct ieee80211_supported_band *sband;
1319 sband = phy->hw->wiphy->bands[band];
1320 ht_cap = &sband->ht_cap;
1321 vht_cap = &sband->vht_cap;
1322 he_cap = ieee80211_get_he_iftype_cap(sband, vif->type);
1325 if (band == NL80211_BAND_2GHZ) {
1326 mode |= PHY_MODE_B | PHY_MODE_G;
1328 if (ht_cap->ht_supported)
1329 mode |= PHY_MODE_GN;
1331 if (he_cap && he_cap->has_he)
1332 mode |= PHY_MODE_AX_24G;
1333 } else if (band == NL80211_BAND_5GHZ) {
1336 if (ht_cap->ht_supported)
1337 mode |= PHY_MODE_AN;
1339 if (vht_cap->vht_supported)
1340 mode |= PHY_MODE_AC;
1342 if (he_cap && he_cap->has_he)
1343 mode |= PHY_MODE_AX_5G;
1344 } else if (band == NL80211_BAND_6GHZ) {
1345 mode |= PHY_MODE_A | PHY_MODE_AN |
1346 PHY_MODE_AC | PHY_MODE_AX_5G;
1351 EXPORT_SYMBOL_GPL(mt76_connac_get_phy_mode);
1353 u8 mt76_connac_get_phy_mode_ext(struct mt76_phy *phy, struct ieee80211_vif *vif,
1354 enum nl80211_band band)
1356 const struct ieee80211_sta_eht_cap *eht_cap;
1357 struct ieee80211_supported_band *sband;
1360 if (band == NL80211_BAND_6GHZ)
1361 mode |= PHY_MODE_AX_6G;
1363 sband = phy->hw->wiphy->bands[band];
1364 eht_cap = ieee80211_get_eht_iftype_cap(sband, vif->type);
1366 if (!eht_cap || !eht_cap->has_eht || !vif->bss_conf.eht_support)
1370 case NL80211_BAND_6GHZ:
1371 mode |= PHY_MODE_BE_6G;
1373 case NL80211_BAND_5GHZ:
1374 mode |= PHY_MODE_BE_5G;
1376 case NL80211_BAND_2GHZ:
1377 mode |= PHY_MODE_BE_24G;
1385 EXPORT_SYMBOL_GPL(mt76_connac_get_phy_mode_ext);
1387 const struct ieee80211_sta_he_cap *
1388 mt76_connac_get_he_phy_cap(struct mt76_phy *phy, struct ieee80211_vif *vif)
1390 struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
1391 struct cfg80211_chan_def *chandef = mvif->ctx ?
1392 &mvif->ctx->def : &phy->chandef;
1393 enum nl80211_band band = chandef->chan->band;
1394 struct ieee80211_supported_band *sband;
1396 sband = phy->hw->wiphy->bands[band];
1398 return ieee80211_get_he_iftype_cap(sband, vif->type);
1400 EXPORT_SYMBOL_GPL(mt76_connac_get_he_phy_cap);
1402 const struct ieee80211_sta_eht_cap *
1403 mt76_connac_get_eht_phy_cap(struct mt76_phy *phy, struct ieee80211_vif *vif)
1405 enum nl80211_band band = phy->chandef.chan->band;
1406 struct ieee80211_supported_band *sband;
1408 sband = phy->hw->wiphy->bands[band];
1410 return ieee80211_get_eht_iftype_cap(sband, vif->type);
1412 EXPORT_SYMBOL_GPL(mt76_connac_get_eht_phy_cap);
1414 #define DEFAULT_HE_PE_DURATION 4
1415 #define DEFAULT_HE_DURATION_RTS_THRES 1023
1417 mt76_connac_mcu_uni_bss_he_tlv(struct mt76_phy *phy, struct ieee80211_vif *vif,
1420 const struct ieee80211_sta_he_cap *cap;
1421 struct bss_info_uni_he *he;
1423 cap = mt76_connac_get_he_phy_cap(phy, vif);
1425 he = (struct bss_info_uni_he *)tlv;
1426 he->he_pe_duration = vif->bss_conf.htc_trig_based_pkt_ext;
1427 if (!he->he_pe_duration)
1428 he->he_pe_duration = DEFAULT_HE_PE_DURATION;
1430 he->he_rts_thres = cpu_to_le16(vif->bss_conf.frame_time_rts_th);
1431 if (!he->he_rts_thres)
1432 he->he_rts_thres = cpu_to_le16(DEFAULT_HE_DURATION_RTS_THRES);
1434 he->max_nss_mcs[CMD_HE_MCS_BW80] = cap->he_mcs_nss_supp.tx_mcs_80;
1435 he->max_nss_mcs[CMD_HE_MCS_BW160] = cap->he_mcs_nss_supp.tx_mcs_160;
1436 he->max_nss_mcs[CMD_HE_MCS_BW8080] = cap->he_mcs_nss_supp.tx_mcs_80p80;
1439 int mt76_connac_mcu_uni_set_chctx(struct mt76_phy *phy, struct mt76_vif *mvif,
1440 struct ieee80211_chanctx_conf *ctx)
1442 struct cfg80211_chan_def *chandef = ctx ? &ctx->def : &phy->chandef;
1443 int freq1 = chandef->center_freq1, freq2 = chandef->center_freq2;
1444 enum nl80211_band band = chandef->chan->band;
1445 struct mt76_dev *mdev = phy->dev;
1466 } __packed rlm_req = {
1468 .bss_idx = mvif->idx,
1471 .tag = cpu_to_le16(UNI_BSS_INFO_RLM),
1472 .len = cpu_to_le16(sizeof(struct rlm_tlv)),
1473 .control_channel = chandef->chan->hw_value,
1474 .center_chan = ieee80211_frequency_to_channel(freq1),
1475 .center_chan2 = ieee80211_frequency_to_channel(freq2),
1476 .tx_streams = hweight8(phy->antenna_mask),
1477 .ht_op_info = 4, /* set HT 40M allowed */
1478 .rx_streams = phy->chainmask,
1484 switch (chandef->width) {
1485 case NL80211_CHAN_WIDTH_40:
1486 rlm_req.rlm.bw = CMD_CBW_40MHZ;
1488 case NL80211_CHAN_WIDTH_80:
1489 rlm_req.rlm.bw = CMD_CBW_80MHZ;
1491 case NL80211_CHAN_WIDTH_80P80:
1492 rlm_req.rlm.bw = CMD_CBW_8080MHZ;
1494 case NL80211_CHAN_WIDTH_160:
1495 rlm_req.rlm.bw = CMD_CBW_160MHZ;
1497 case NL80211_CHAN_WIDTH_5:
1498 rlm_req.rlm.bw = CMD_CBW_5MHZ;
1500 case NL80211_CHAN_WIDTH_10:
1501 rlm_req.rlm.bw = CMD_CBW_10MHZ;
1503 case NL80211_CHAN_WIDTH_20_NOHT:
1504 case NL80211_CHAN_WIDTH_20:
1506 rlm_req.rlm.bw = CMD_CBW_20MHZ;
1507 rlm_req.rlm.ht_op_info = 0;
1511 if (rlm_req.rlm.control_channel < rlm_req.rlm.center_chan)
1512 rlm_req.rlm.sco = 1; /* SCA */
1513 else if (rlm_req.rlm.control_channel > rlm_req.rlm.center_chan)
1514 rlm_req.rlm.sco = 3; /* SCB */
1516 return mt76_mcu_send_msg(mdev, MCU_UNI_CMD(BSS_INFO_UPDATE), &rlm_req,
1517 sizeof(rlm_req), true);
1519 EXPORT_SYMBOL_GPL(mt76_connac_mcu_uni_set_chctx);
1521 int mt76_connac_mcu_uni_add_bss(struct mt76_phy *phy,
1522 struct ieee80211_vif *vif,
1523 struct mt76_wcid *wcid,
1525 struct ieee80211_chanctx_conf *ctx)
1527 struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
1528 struct cfg80211_chan_def *chandef = ctx ? &ctx->def : &phy->chandef;
1529 enum nl80211_band band = chandef->chan->band;
1530 struct mt76_dev *mdev = phy->dev;
1536 struct mt76_connac_bss_basic_tlv basic;
1537 struct mt76_connac_bss_qos_tlv qos;
1540 .bss_idx = mvif->idx,
1543 .tag = cpu_to_le16(UNI_BSS_INFO_BASIC),
1544 .len = cpu_to_le16(sizeof(struct mt76_connac_bss_basic_tlv)),
1545 .bcn_interval = cpu_to_le16(vif->bss_conf.beacon_int),
1546 .dtim_period = vif->bss_conf.dtim_period,
1547 .omac_idx = mvif->omac_idx,
1548 .band_idx = mvif->band_idx,
1549 .wmm_idx = mvif->wmm_idx,
1550 .active = true, /* keep bss deactivated */
1551 .phymode = mt76_connac_get_phy_mode(phy, vif, band, NULL),
1554 .tag = cpu_to_le16(UNI_BSS_INFO_QBSS),
1555 .len = cpu_to_le16(sizeof(struct mt76_connac_bss_qos_tlv)),
1556 .qos = vif->bss_conf.qos,
1562 idx = mvif->omac_idx > EXT_BSSID_START ? HW_BSSID_0 : mvif->omac_idx;
1563 basic_req.basic.hw_bss_idx = idx;
1564 if (band == NL80211_BAND_6GHZ)
1565 basic_req.basic.phymode_ext = PHY_MODE_AX_6G;
1567 basic_phy = mt76_connac_get_phy_mode_v2(phy, vif, band, NULL);
1568 basic_req.basic.nonht_basic_phy = cpu_to_le16(basic_phy);
1570 switch (vif->type) {
1571 case NL80211_IFTYPE_MESH_POINT:
1572 case NL80211_IFTYPE_AP:
1574 conn_type = CONNECTION_P2P_GO;
1576 conn_type = CONNECTION_INFRA_AP;
1577 basic_req.basic.conn_type = cpu_to_le32(conn_type);
1578 /* Fully active/deactivate BSS network in AP mode only */
1579 basic_req.basic.active = enable;
1581 case NL80211_IFTYPE_STATION:
1583 conn_type = CONNECTION_P2P_GC;
1585 conn_type = CONNECTION_INFRA_STA;
1586 basic_req.basic.conn_type = cpu_to_le32(conn_type);
1588 case NL80211_IFTYPE_ADHOC:
1589 basic_req.basic.conn_type = cpu_to_le32(CONNECTION_IBSS_ADHOC);
1596 memcpy(basic_req.basic.bssid, vif->bss_conf.bssid, ETH_ALEN);
1597 basic_req.basic.bmc_tx_wlan_idx = cpu_to_le16(wcid->idx);
1598 basic_req.basic.sta_idx = cpu_to_le16(wcid->idx);
1599 basic_req.basic.conn_state = !enable;
1601 err = mt76_mcu_send_msg(mdev, MCU_UNI_CMD(BSS_INFO_UPDATE), &basic_req,
1602 sizeof(basic_req), true);
1606 if (vif->bss_conf.he_support) {
1612 struct bss_info_uni_he he;
1613 struct bss_info_uni_bss_color bss_color;
1616 .bss_idx = mvif->idx,
1619 .tag = cpu_to_le16(UNI_BSS_INFO_HE_BASIC),
1620 .len = cpu_to_le16(sizeof(struct bss_info_uni_he)),
1623 .tag = cpu_to_le16(UNI_BSS_INFO_BSS_COLOR),
1624 .len = cpu_to_le16(sizeof(struct bss_info_uni_bss_color)),
1631 he_req.bss_color.enable =
1632 vif->bss_conf.he_bss_color.enabled;
1633 he_req.bss_color.bss_color =
1634 vif->bss_conf.he_bss_color.color;
1637 mt76_connac_mcu_uni_bss_he_tlv(phy, vif,
1638 (struct tlv *)&he_req.he);
1639 err = mt76_mcu_send_msg(mdev, MCU_UNI_CMD(BSS_INFO_UPDATE),
1640 &he_req, sizeof(he_req), true);
1645 return mt76_connac_mcu_uni_set_chctx(phy, mvif, ctx);
1647 EXPORT_SYMBOL_GPL(mt76_connac_mcu_uni_add_bss);
1649 #define MT76_CONNAC_SCAN_CHANNEL_TIME 60
1650 int mt76_connac_mcu_hw_scan(struct mt76_phy *phy, struct ieee80211_vif *vif,
1651 struct ieee80211_scan_request *scan_req)
1653 struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
1654 struct cfg80211_scan_request *sreq = &scan_req->req;
1655 int n_ssids = 0, err, i, duration;
1656 int ext_channels_num = max_t(int, sreq->n_channels - 32, 0);
1657 struct ieee80211_channel **scan_list = sreq->channels;
1658 struct mt76_dev *mdev = phy->dev;
1659 struct mt76_connac_mcu_scan_channel *chan;
1660 struct mt76_connac_hw_scan_req *req;
1661 struct sk_buff *skb;
1663 if (test_bit(MT76_HW_SCANNING, &phy->state))
1666 skb = mt76_mcu_msg_alloc(mdev, NULL, sizeof(*req));
1670 set_bit(MT76_HW_SCANNING, &phy->state);
1671 mvif->scan_seq_num = (mvif->scan_seq_num + 1) & 0x7f;
1673 req = (struct mt76_connac_hw_scan_req *)skb_put(skb, sizeof(*req));
1675 req->seq_num = mvif->scan_seq_num | mvif->band_idx << 7;
1676 req->bss_idx = mvif->idx;
1677 req->scan_type = sreq->n_ssids ? 1 : 0;
1678 req->probe_req_num = sreq->n_ssids ? 2 : 0;
1681 for (i = 0; i < sreq->n_ssids; i++) {
1682 if (!sreq->ssids[i].ssid_len)
1685 req->ssids[i].ssid_len = cpu_to_le32(sreq->ssids[i].ssid_len);
1686 memcpy(req->ssids[i].ssid, sreq->ssids[i].ssid,
1687 sreq->ssids[i].ssid_len);
1690 req->ssid_type = n_ssids ? BIT(2) : BIT(0);
1691 req->ssid_type_ext = n_ssids ? BIT(0) : 0;
1692 req->ssids_num = n_ssids;
1694 duration = is_mt7921(phy->dev) ? 0 : MT76_CONNAC_SCAN_CHANNEL_TIME;
1695 /* increase channel time for passive scan */
1698 req->timeout_value = cpu_to_le16(sreq->n_channels * duration);
1699 req->channel_min_dwell_time = cpu_to_le16(duration);
1700 req->channel_dwell_time = cpu_to_le16(duration);
1702 if (sreq->n_channels == 0 || sreq->n_channels > 64) {
1703 req->channel_type = 0;
1704 req->channels_num = 0;
1705 req->ext_channels_num = 0;
1707 req->channel_type = 4;
1708 req->channels_num = min_t(u8, sreq->n_channels, 32);
1709 req->ext_channels_num = min_t(u8, ext_channels_num, 32);
1712 for (i = 0; i < req->channels_num + req->ext_channels_num; i++) {
1714 chan = &req->ext_channels[i - 32];
1716 chan = &req->channels[i];
1718 switch (scan_list[i]->band) {
1719 case NL80211_BAND_2GHZ:
1722 case NL80211_BAND_6GHZ:
1729 chan->channel_num = scan_list[i]->hw_value;
1732 if (sreq->ie_len > 0) {
1733 memcpy(req->ies, sreq->ie, sreq->ie_len);
1734 req->ies_len = cpu_to_le16(sreq->ie_len);
1737 if (is_mt7921(phy->dev))
1738 req->scan_func |= SCAN_FUNC_SPLIT_SCAN;
1740 memcpy(req->bssid, sreq->bssid, ETH_ALEN);
1741 if (sreq->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
1742 get_random_mask_addr(req->random_mac, sreq->mac_addr,
1743 sreq->mac_addr_mask);
1744 req->scan_func |= SCAN_FUNC_RANDOM_MAC;
1747 err = mt76_mcu_skb_send_msg(mdev, skb, MCU_CE_CMD(START_HW_SCAN),
1750 clear_bit(MT76_HW_SCANNING, &phy->state);
1754 EXPORT_SYMBOL_GPL(mt76_connac_mcu_hw_scan);
1756 int mt76_connac_mcu_cancel_hw_scan(struct mt76_phy *phy,
1757 struct ieee80211_vif *vif)
1759 struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
1765 .seq_num = mvif->scan_seq_num,
1768 if (test_and_clear_bit(MT76_HW_SCANNING, &phy->state)) {
1769 struct cfg80211_scan_info info = {
1773 ieee80211_scan_completed(phy->hw, &info);
1776 return mt76_mcu_send_msg(phy->dev, MCU_CE_CMD(CANCEL_HW_SCAN),
1777 &req, sizeof(req), false);
1779 EXPORT_SYMBOL_GPL(mt76_connac_mcu_cancel_hw_scan);
1781 int mt76_connac_mcu_sched_scan_req(struct mt76_phy *phy,
1782 struct ieee80211_vif *vif,
1783 struct cfg80211_sched_scan_request *sreq)
1785 struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
1786 struct ieee80211_channel **scan_list = sreq->channels;
1787 struct mt76_connac_mcu_scan_channel *chan;
1788 struct mt76_connac_sched_scan_req *req;
1789 struct mt76_dev *mdev = phy->dev;
1790 struct cfg80211_match_set *match;
1791 struct cfg80211_ssid *ssid;
1792 struct sk_buff *skb;
1795 skb = mt76_mcu_msg_alloc(mdev, NULL, sizeof(*req) + sreq->ie_len);
1799 mvif->scan_seq_num = (mvif->scan_seq_num + 1) & 0x7f;
1801 req = (struct mt76_connac_sched_scan_req *)skb_put(skb, sizeof(*req));
1803 req->seq_num = mvif->scan_seq_num | mvif->band_idx << 7;
1805 if (sreq->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
1806 u8 *addr = is_mt7663(phy->dev) ? req->mt7663.random_mac
1807 : req->mt7921.random_mac;
1810 get_random_mask_addr(addr, sreq->mac_addr,
1811 sreq->mac_addr_mask);
1813 if (is_mt7921(phy->dev)) {
1814 req->mt7921.bss_idx = mvif->idx;
1815 req->mt7921.delay = cpu_to_le32(sreq->delay);
1818 req->ssids_num = sreq->n_ssids;
1819 for (i = 0; i < req->ssids_num; i++) {
1820 ssid = &sreq->ssids[i];
1821 memcpy(req->ssids[i].ssid, ssid->ssid, ssid->ssid_len);
1822 req->ssids[i].ssid_len = cpu_to_le32(ssid->ssid_len);
1825 req->match_num = sreq->n_match_sets;
1826 for (i = 0; i < req->match_num; i++) {
1827 match = &sreq->match_sets[i];
1828 memcpy(req->match[i].ssid, match->ssid.ssid,
1829 match->ssid.ssid_len);
1830 req->match[i].rssi_th = cpu_to_le32(match->rssi_thold);
1831 req->match[i].ssid_len = match->ssid.ssid_len;
1834 req->channel_type = sreq->n_channels ? 4 : 0;
1835 req->channels_num = min_t(u8, sreq->n_channels, 64);
1836 for (i = 0; i < req->channels_num; i++) {
1837 chan = &req->channels[i];
1839 switch (scan_list[i]->band) {
1840 case NL80211_BAND_2GHZ:
1843 case NL80211_BAND_6GHZ:
1850 chan->channel_num = scan_list[i]->hw_value;
1853 req->intervals_num = sreq->n_scan_plans;
1854 for (i = 0; i < req->intervals_num; i++)
1855 req->intervals[i] = cpu_to_le16(sreq->scan_plans[i].interval);
1857 if (sreq->ie_len > 0) {
1858 req->ie_len = cpu_to_le16(sreq->ie_len);
1859 memcpy(skb_put(skb, sreq->ie_len), sreq->ie, sreq->ie_len);
1862 return mt76_mcu_skb_send_msg(mdev, skb, MCU_CE_CMD(SCHED_SCAN_REQ),
1865 EXPORT_SYMBOL_GPL(mt76_connac_mcu_sched_scan_req);
1867 int mt76_connac_mcu_sched_scan_enable(struct mt76_phy *phy,
1868 struct ieee80211_vif *vif,
1872 u8 active; /* 0: enabled 1: disabled */
1879 set_bit(MT76_HW_SCHED_SCANNING, &phy->state);
1881 clear_bit(MT76_HW_SCHED_SCANNING, &phy->state);
1883 return mt76_mcu_send_msg(phy->dev, MCU_CE_CMD(SCHED_SCAN_ENABLE),
1884 &req, sizeof(req), false);
1886 EXPORT_SYMBOL_GPL(mt76_connac_mcu_sched_scan_enable);
1888 int mt76_connac_mcu_chip_config(struct mt76_dev *dev)
1890 struct mt76_connac_config req = {
1894 memcpy(req.data, "assert", 7);
1896 return mt76_mcu_send_msg(dev, MCU_CE_CMD(CHIP_CONFIG),
1897 &req, sizeof(req), false);
1899 EXPORT_SYMBOL_GPL(mt76_connac_mcu_chip_config);
1901 int mt76_connac_mcu_set_deep_sleep(struct mt76_dev *dev, bool enable)
1903 struct mt76_connac_config req = {
1907 snprintf(req.data, sizeof(req.data), "KeepFullPwr %d", !enable);
1909 return mt76_mcu_send_msg(dev, MCU_CE_CMD(CHIP_CONFIG),
1910 &req, sizeof(req), false);
1912 EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_deep_sleep);
1914 int mt76_connac_sta_state_dp(struct mt76_dev *dev,
1915 enum ieee80211_sta_state old_state,
1916 enum ieee80211_sta_state new_state)
1918 if ((old_state == IEEE80211_STA_ASSOC &&
1919 new_state == IEEE80211_STA_AUTHORIZED) ||
1920 (old_state == IEEE80211_STA_NONE &&
1921 new_state == IEEE80211_STA_NOTEXIST))
1922 mt76_connac_mcu_set_deep_sleep(dev, true);
1924 if ((old_state == IEEE80211_STA_NOTEXIST &&
1925 new_state == IEEE80211_STA_NONE) ||
1926 (old_state == IEEE80211_STA_AUTHORIZED &&
1927 new_state == IEEE80211_STA_ASSOC))
1928 mt76_connac_mcu_set_deep_sleep(dev, false);
1932 EXPORT_SYMBOL_GPL(mt76_connac_sta_state_dp);
1934 void mt76_connac_mcu_coredump_event(struct mt76_dev *dev, struct sk_buff *skb,
1935 struct mt76_connac_coredump *coredump)
1937 spin_lock_bh(&dev->lock);
1938 __skb_queue_tail(&coredump->msg_list, skb);
1939 spin_unlock_bh(&dev->lock);
1941 coredump->last_activity = jiffies;
1943 queue_delayed_work(dev->wq, &coredump->work,
1944 MT76_CONNAC_COREDUMP_TIMEOUT);
1946 EXPORT_SYMBOL_GPL(mt76_connac_mcu_coredump_event);
1949 mt76_connac_mcu_build_sku(struct mt76_dev *dev, s8 *sku,
1950 struct mt76_power_limits *limits,
1951 enum nl80211_band band)
1953 int max_power = is_mt7921(dev) ? 127 : 63;
1954 int i, offset = sizeof(limits->cck);
1956 memset(sku, max_power, MT_SKU_POWER_LIMIT);
1958 if (band == NL80211_BAND_2GHZ) {
1960 memcpy(sku, limits->cck, sizeof(limits->cck));
1964 memcpy(&sku[offset], limits->ofdm, sizeof(limits->ofdm));
1965 offset += sizeof(limits->ofdm);
1968 for (i = 0; i < 2; i++) {
1969 memcpy(&sku[offset], limits->mcs[i], 8);
1972 sku[offset++] = limits->mcs[0][0];
1975 for (i = 0; i < ARRAY_SIZE(limits->mcs); i++) {
1976 memcpy(&sku[offset], limits->mcs[i],
1977 ARRAY_SIZE(limits->mcs[i]));
1981 if (!is_mt7921(dev))
1985 for (i = 0; i < ARRAY_SIZE(limits->ru); i++) {
1986 memcpy(&sku[offset], limits->ru[i], ARRAY_SIZE(limits->ru[i]));
1987 offset += ARRAY_SIZE(limits->ru[i]);
1991 s8 mt76_connac_get_ch_power(struct mt76_phy *phy,
1992 struct ieee80211_channel *chan,
1995 struct mt76_dev *dev = phy->dev;
1996 struct ieee80211_supported_band *sband;
1999 switch (chan->band) {
2000 case NL80211_BAND_2GHZ:
2001 sband = &phy->sband_2g.sband;
2003 case NL80211_BAND_5GHZ:
2004 sband = &phy->sband_5g.sband;
2006 case NL80211_BAND_6GHZ:
2007 sband = &phy->sband_6g.sband;
2010 return target_power;
2013 for (i = 0; i < sband->n_channels; i++) {
2014 struct ieee80211_channel *ch = &sband->channels[i];
2016 if (ch->hw_value == chan->hw_value) {
2017 if (!(ch->flags & IEEE80211_CHAN_DISABLED)) {
2018 int power = 2 * ch->max_reg_power;
2020 if (is_mt7663(dev) && (power > 63 || power < -64))
2022 target_power = min_t(s8, power, target_power);
2028 return target_power;
2030 EXPORT_SYMBOL_GPL(mt76_connac_get_ch_power);
2033 mt76_connac_mcu_rate_txpower_band(struct mt76_phy *phy,
2034 enum nl80211_band band)
2036 struct mt76_dev *dev = phy->dev;
2037 int sku_len, batch_len = is_mt7921(dev) ? 8 : 16;
2038 static const u8 chan_list_2ghz[] = {
2039 1, 2, 3, 4, 5, 6, 7,
2040 8, 9, 10, 11, 12, 13, 14
2042 static const u8 chan_list_5ghz[] = {
2043 36, 38, 40, 42, 44, 46, 48,
2044 50, 52, 54, 56, 58, 60, 62,
2045 64, 100, 102, 104, 106, 108, 110,
2046 112, 114, 116, 118, 120, 122, 124,
2047 126, 128, 132, 134, 136, 138, 140,
2048 142, 144, 149, 151, 153, 155, 157,
2049 159, 161, 165, 169, 173, 177
2051 static const u8 chan_list_6ghz[] = {
2052 1, 3, 5, 7, 9, 11, 13,
2053 15, 17, 19, 21, 23, 25, 27,
2054 29, 33, 35, 37, 39, 41, 43,
2055 45, 47, 49, 51, 53, 55, 57,
2056 59, 61, 65, 67, 69, 71, 73,
2057 75, 77, 79, 81, 83, 85, 87,
2058 89, 91, 93, 97, 99, 101, 103,
2059 105, 107, 109, 111, 113, 115, 117,
2060 119, 121, 123, 125, 129, 131, 133,
2061 135, 137, 139, 141, 143, 145, 147,
2062 149, 151, 153, 155, 157, 161, 163,
2063 165, 167, 169, 171, 173, 175, 177,
2064 179, 181, 183, 185, 187, 189, 193,
2065 195, 197, 199, 201, 203, 205, 207,
2066 209, 211, 213, 215, 217, 219, 221,
2069 int i, n_chan, batch_size, idx = 0, tx_power, last_ch, err = 0;
2070 struct mt76_connac_sku_tlv sku_tlbv;
2071 struct mt76_power_limits *limits;
2074 limits = devm_kmalloc(dev->dev, sizeof(*limits), GFP_KERNEL);
2078 sku_len = is_mt7921(dev) ? sizeof(sku_tlbv) : sizeof(sku_tlbv) - 92;
2079 tx_power = 2 * phy->hw->conf.power_level;
2083 if (band == NL80211_BAND_2GHZ) {
2084 n_chan = ARRAY_SIZE(chan_list_2ghz);
2085 ch_list = chan_list_2ghz;
2086 } else if (band == NL80211_BAND_6GHZ) {
2087 n_chan = ARRAY_SIZE(chan_list_6ghz);
2088 ch_list = chan_list_6ghz;
2090 n_chan = ARRAY_SIZE(chan_list_5ghz);
2091 ch_list = chan_list_5ghz;
2093 batch_size = DIV_ROUND_UP(n_chan, batch_len);
2095 if (phy->cap.has_6ghz)
2096 last_ch = chan_list_6ghz[ARRAY_SIZE(chan_list_6ghz) - 1];
2097 else if (phy->cap.has_5ghz)
2098 last_ch = chan_list_5ghz[ARRAY_SIZE(chan_list_5ghz) - 1];
2100 last_ch = chan_list_2ghz[ARRAY_SIZE(chan_list_2ghz) - 1];
2102 for (i = 0; i < batch_size; i++) {
2103 struct mt76_connac_tx_power_limit_tlv tx_power_tlv = {};
2104 int j, msg_len, num_ch;
2105 struct sk_buff *skb;
2107 num_ch = i == batch_size - 1 ? n_chan - i * batch_len : batch_len;
2108 msg_len = sizeof(tx_power_tlv) + num_ch * sizeof(sku_tlbv);
2109 skb = mt76_mcu_msg_alloc(dev, NULL, msg_len);
2115 skb_reserve(skb, sizeof(tx_power_tlv));
2117 BUILD_BUG_ON(sizeof(dev->alpha2) > sizeof(tx_power_tlv.alpha2));
2118 memcpy(tx_power_tlv.alpha2, dev->alpha2, sizeof(dev->alpha2));
2119 tx_power_tlv.n_chan = num_ch;
2122 case NL80211_BAND_2GHZ:
2123 tx_power_tlv.band = 1;
2125 case NL80211_BAND_6GHZ:
2126 tx_power_tlv.band = 3;
2129 tx_power_tlv.band = 2;
2133 for (j = 0; j < num_ch; j++, idx++) {
2134 struct ieee80211_channel chan = {
2135 .hw_value = ch_list[idx],
2138 s8 reg_power, sar_power;
2140 reg_power = mt76_connac_get_ch_power(phy, &chan,
2142 sar_power = mt76_get_sar_power(phy, &chan, reg_power);
2144 mt76_get_rate_power_limits(phy, &chan, limits,
2147 tx_power_tlv.last_msg = ch_list[idx] == last_ch;
2148 sku_tlbv.channel = ch_list[idx];
2150 mt76_connac_mcu_build_sku(dev, sku_tlbv.pwr_limit,
2152 skb_put_data(skb, &sku_tlbv, sku_len);
2154 __skb_push(skb, sizeof(tx_power_tlv));
2155 memcpy(skb->data, &tx_power_tlv, sizeof(tx_power_tlv));
2157 err = mt76_mcu_skb_send_msg(dev, skb,
2158 MCU_CE_CMD(SET_RATE_TX_POWER),
2165 devm_kfree(dev->dev, limits);
2169 int mt76_connac_mcu_set_rate_txpower(struct mt76_phy *phy)
2173 if (phy->cap.has_2ghz) {
2174 err = mt76_connac_mcu_rate_txpower_band(phy,
2179 if (phy->cap.has_5ghz) {
2180 err = mt76_connac_mcu_rate_txpower_band(phy,
2185 if (phy->cap.has_6ghz) {
2186 err = mt76_connac_mcu_rate_txpower_band(phy,
2194 EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_rate_txpower);
2196 int mt76_connac_mcu_update_arp_filter(struct mt76_dev *dev,
2197 struct mt76_vif *vif,
2198 struct ieee80211_bss_conf *info)
2200 struct ieee80211_vif *mvif = container_of(info, struct ieee80211_vif,
2202 struct sk_buff *skb;
2203 int i, len = min_t(int, mvif->cfg.arp_addr_cnt,
2204 IEEE80211_BSS_ARP_ADDR_LIST_LEN);
2210 struct mt76_connac_arpns_tlv arp;
2213 .bss_idx = vif->idx,
2216 .tag = cpu_to_le16(UNI_OFFLOAD_OFFLOAD_ARP),
2217 .len = cpu_to_le16(sizeof(struct mt76_connac_arpns_tlv)),
2219 .mode = 2, /* update */
2224 skb = mt76_mcu_msg_alloc(dev, NULL,
2225 sizeof(req_hdr) + len * sizeof(__be32));
2229 skb_put_data(skb, &req_hdr, sizeof(req_hdr));
2230 for (i = 0; i < len; i++)
2231 skb_put_data(skb, &mvif->cfg.arp_addr_list[i], sizeof(__be32));
2233 return mt76_mcu_skb_send_msg(dev, skb, MCU_UNI_CMD(OFFLOAD), true);
2235 EXPORT_SYMBOL_GPL(mt76_connac_mcu_update_arp_filter);
2237 int mt76_connac_mcu_set_p2p_oppps(struct ieee80211_hw *hw,
2238 struct ieee80211_vif *vif)
2240 struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
2241 int ct_window = vif->bss_conf.p2p_noa_attr.oppps_ctwindow;
2242 struct mt76_phy *phy = hw->priv;
2248 .ct_win = cpu_to_le32(ct_window),
2249 .bss_idx = mvif->idx,
2252 return mt76_mcu_send_msg(phy->dev, MCU_CE_CMD(SET_P2P_OPPPS),
2253 &req, sizeof(req), false);
2255 EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_p2p_oppps);
2259 const struct wiphy_wowlan_support mt76_connac_wowlan_support = {
2260 .flags = WIPHY_WOWLAN_MAGIC_PKT | WIPHY_WOWLAN_DISCONNECT |
2261 WIPHY_WOWLAN_SUPPORTS_GTK_REKEY | WIPHY_WOWLAN_NET_DETECT,
2263 .pattern_min_len = 1,
2264 .pattern_max_len = MT76_CONNAC_WOW_PATTEN_MAX_LEN,
2265 .max_nd_match_sets = 10,
2267 EXPORT_SYMBOL_GPL(mt76_connac_wowlan_support);
2270 mt76_connac_mcu_key_iter(struct ieee80211_hw *hw,
2271 struct ieee80211_vif *vif,
2272 struct ieee80211_sta *sta,
2273 struct ieee80211_key_conf *key,
2276 struct mt76_connac_gtk_rekey_tlv *gtk_tlv = data;
2279 if (key->cipher != WLAN_CIPHER_SUITE_AES_CMAC &&
2280 key->cipher != WLAN_CIPHER_SUITE_CCMP &&
2281 key->cipher != WLAN_CIPHER_SUITE_TKIP)
2284 if (key->cipher == WLAN_CIPHER_SUITE_TKIP)
2289 /* we are assuming here to have a single pairwise key */
2290 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) {
2291 if (key->cipher == WLAN_CIPHER_SUITE_TKIP)
2292 gtk_tlv->proto = cpu_to_le32(NL80211_WPA_VERSION_1);
2294 gtk_tlv->proto = cpu_to_le32(NL80211_WPA_VERSION_2);
2296 gtk_tlv->pairwise_cipher = cpu_to_le32(cipher);
2297 gtk_tlv->keyid = key->keyidx;
2299 gtk_tlv->group_cipher = cpu_to_le32(cipher);
2303 int mt76_connac_mcu_update_gtk_rekey(struct ieee80211_hw *hw,
2304 struct ieee80211_vif *vif,
2305 struct cfg80211_gtk_rekey_data *key)
2307 struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
2308 struct mt76_connac_gtk_rekey_tlv *gtk_tlv;
2309 struct mt76_phy *phy = hw->priv;
2310 struct sk_buff *skb;
2315 .bss_idx = mvif->idx,
2318 skb = mt76_mcu_msg_alloc(phy->dev, NULL,
2319 sizeof(hdr) + sizeof(*gtk_tlv));
2323 skb_put_data(skb, &hdr, sizeof(hdr));
2324 gtk_tlv = (struct mt76_connac_gtk_rekey_tlv *)skb_put(skb,
2326 gtk_tlv->tag = cpu_to_le16(UNI_OFFLOAD_OFFLOAD_GTK_REKEY);
2327 gtk_tlv->len = cpu_to_le16(sizeof(*gtk_tlv));
2328 gtk_tlv->rekey_mode = 2;
2329 gtk_tlv->option = 1;
2332 ieee80211_iter_keys_rcu(hw, vif, mt76_connac_mcu_key_iter, gtk_tlv);
2335 memcpy(gtk_tlv->kek, key->kek, NL80211_KEK_LEN);
2336 memcpy(gtk_tlv->kck, key->kck, NL80211_KCK_LEN);
2337 memcpy(gtk_tlv->replay_ctr, key->replay_ctr, NL80211_REPLAY_CTR_LEN);
2339 return mt76_mcu_skb_send_msg(phy->dev, skb,
2340 MCU_UNI_CMD(OFFLOAD), true);
2342 EXPORT_SYMBOL_GPL(mt76_connac_mcu_update_gtk_rekey);
2345 mt76_connac_mcu_set_arp_filter(struct mt76_dev *dev, struct ieee80211_vif *vif,
2348 struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
2354 struct mt76_connac_arpns_tlv arpns;
2357 .bss_idx = mvif->idx,
2360 .tag = cpu_to_le16(UNI_OFFLOAD_OFFLOAD_ARP),
2361 .len = cpu_to_le16(sizeof(struct mt76_connac_arpns_tlv)),
2366 return mt76_mcu_send_msg(dev, MCU_UNI_CMD(OFFLOAD), &req,
2371 mt76_connac_mcu_set_gtk_rekey(struct mt76_dev *dev, struct ieee80211_vif *vif,
2374 struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
2380 struct mt76_connac_gtk_rekey_tlv gtk_tlv;
2383 .bss_idx = mvif->idx,
2386 .tag = cpu_to_le16(UNI_OFFLOAD_OFFLOAD_GTK_REKEY),
2387 .len = cpu_to_le16(sizeof(struct mt76_connac_gtk_rekey_tlv)),
2388 .rekey_mode = !suspend,
2392 return mt76_mcu_send_msg(dev, MCU_UNI_CMD(OFFLOAD), &req,
2395 EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_gtk_rekey);
2398 mt76_connac_mcu_set_suspend_mode(struct mt76_dev *dev,
2399 struct ieee80211_vif *vif,
2400 bool enable, u8 mdtim,
2403 struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
2409 struct mt76_connac_suspend_tlv suspend_tlv;
2412 .bss_idx = mvif->idx,
2415 .tag = cpu_to_le16(UNI_SUSPEND_MODE_SETTING),
2416 .len = cpu_to_le16(sizeof(struct mt76_connac_suspend_tlv)),
2419 .wow_suspend = wow_suspend,
2423 return mt76_mcu_send_msg(dev, MCU_UNI_CMD(SUSPEND), &req,
2426 EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_suspend_mode);
2429 mt76_connac_mcu_set_wow_pattern(struct mt76_dev *dev,
2430 struct ieee80211_vif *vif,
2431 u8 index, bool enable,
2432 struct cfg80211_pkt_pattern *pattern)
2434 struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
2435 struct mt76_connac_wow_pattern_tlv *ptlv;
2436 struct sk_buff *skb;
2441 .bss_idx = mvif->idx,
2444 skb = mt76_mcu_msg_alloc(dev, NULL, sizeof(hdr) + sizeof(*ptlv));
2448 skb_put_data(skb, &hdr, sizeof(hdr));
2449 ptlv = (struct mt76_connac_wow_pattern_tlv *)skb_put(skb, sizeof(*ptlv));
2450 ptlv->tag = cpu_to_le16(UNI_SUSPEND_WOW_PATTERN);
2451 ptlv->len = cpu_to_le16(sizeof(*ptlv));
2452 ptlv->data_len = pattern->pattern_len;
2453 ptlv->enable = enable;
2454 ptlv->index = index;
2456 memcpy(ptlv->pattern, pattern->pattern, pattern->pattern_len);
2457 memcpy(ptlv->mask, pattern->mask, DIV_ROUND_UP(pattern->pattern_len, 8));
2459 return mt76_mcu_skb_send_msg(dev, skb, MCU_UNI_CMD(SUSPEND), true);
2463 mt76_connac_mcu_set_wow_ctrl(struct mt76_phy *phy, struct ieee80211_vif *vif,
2464 bool suspend, struct cfg80211_wowlan *wowlan)
2466 struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
2467 struct mt76_dev *dev = phy->dev;
2473 struct mt76_connac_wow_ctrl_tlv wow_ctrl_tlv;
2474 struct mt76_connac_wow_gpio_param_tlv gpio_tlv;
2477 .bss_idx = mvif->idx,
2480 .tag = cpu_to_le16(UNI_SUSPEND_WOW_CTRL),
2481 .len = cpu_to_le16(sizeof(struct mt76_connac_wow_ctrl_tlv)),
2482 .cmd = suspend ? 1 : 2,
2485 .tag = cpu_to_le16(UNI_SUSPEND_WOW_GPIO_PARAM),
2486 .len = cpu_to_le16(sizeof(struct mt76_connac_wow_gpio_param_tlv)),
2487 .gpio_pin = 0xff, /* follow fw about GPIO pin */
2491 if (wowlan->magic_pkt)
2492 req.wow_ctrl_tlv.trigger |= UNI_WOW_DETECT_TYPE_MAGIC;
2493 if (wowlan->disconnect)
2494 req.wow_ctrl_tlv.trigger |= (UNI_WOW_DETECT_TYPE_DISCONNECT |
2495 UNI_WOW_DETECT_TYPE_BCN_LOST);
2496 if (wowlan->nd_config) {
2497 mt76_connac_mcu_sched_scan_req(phy, vif, wowlan->nd_config);
2498 req.wow_ctrl_tlv.trigger |= UNI_WOW_DETECT_TYPE_SCH_SCAN_HIT;
2499 mt76_connac_mcu_sched_scan_enable(phy, vif, suspend);
2501 if (wowlan->n_patterns)
2502 req.wow_ctrl_tlv.trigger |= UNI_WOW_DETECT_TYPE_BITMAP;
2504 if (mt76_is_mmio(dev))
2505 req.wow_ctrl_tlv.wakeup_hif = WOW_PCIE;
2506 else if (mt76_is_usb(dev))
2507 req.wow_ctrl_tlv.wakeup_hif = WOW_USB;
2508 else if (mt76_is_sdio(dev))
2509 req.wow_ctrl_tlv.wakeup_hif = WOW_GPIO;
2511 return mt76_mcu_send_msg(dev, MCU_UNI_CMD(SUSPEND), &req,
2514 EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_wow_ctrl);
2516 int mt76_connac_mcu_set_hif_suspend(struct mt76_dev *dev, bool suspend)
2520 u8 hif_type; /* 0x0: HIF_SDIO
2526 struct hif_suspend_tlv {
2530 } __packed hif_suspend;
2533 .tag = cpu_to_le16(0), /* 0: UNI_HIF_CTRL_BASIC */
2534 .len = cpu_to_le16(sizeof(struct hif_suspend_tlv)),
2539 if (mt76_is_mmio(dev))
2540 req.hdr.hif_type = 2;
2541 else if (mt76_is_usb(dev))
2542 req.hdr.hif_type = 1;
2543 else if (mt76_is_sdio(dev))
2544 req.hdr.hif_type = 0;
2546 return mt76_mcu_send_msg(dev, MCU_UNI_CMD(HIF_CTRL), &req,
2549 EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_hif_suspend);
2551 void mt76_connac_mcu_set_suspend_iter(void *priv, u8 *mac,
2552 struct ieee80211_vif *vif)
2554 struct mt76_phy *phy = priv;
2555 bool suspend = !test_bit(MT76_STATE_RUNNING, &phy->state);
2556 struct ieee80211_hw *hw = phy->hw;
2557 struct cfg80211_wowlan *wowlan = hw->wiphy->wowlan_config;
2560 mt76_connac_mcu_set_gtk_rekey(phy->dev, vif, suspend);
2561 mt76_connac_mcu_set_arp_filter(phy->dev, vif, suspend);
2563 mt76_connac_mcu_set_suspend_mode(phy->dev, vif, suspend, 1, true);
2565 for (i = 0; i < wowlan->n_patterns; i++)
2566 mt76_connac_mcu_set_wow_pattern(phy->dev, vif, i, suspend,
2567 &wowlan->patterns[i]);
2568 mt76_connac_mcu_set_wow_ctrl(phy, vif, suspend, wowlan);
2570 EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_suspend_iter);
2571 #endif /* CONFIG_PM */
2573 u32 mt76_connac_mcu_reg_rr(struct mt76_dev *dev, u32 offset)
2579 .addr = cpu_to_le32(offset),
2582 return mt76_mcu_send_msg(dev, MCU_CE_QUERY(REG_READ), &req,
2585 EXPORT_SYMBOL_GPL(mt76_connac_mcu_reg_rr);
2587 void mt76_connac_mcu_reg_wr(struct mt76_dev *dev, u32 offset, u32 val)
2593 .addr = cpu_to_le32(offset),
2594 .val = cpu_to_le32(val),
2597 mt76_mcu_send_msg(dev, MCU_CE_CMD(REG_WRITE), &req,
2598 sizeof(req), false);
2600 EXPORT_SYMBOL_GPL(mt76_connac_mcu_reg_wr);
2603 mt76_connac_mcu_sta_key_tlv(struct mt76_connac_sta_key_conf *sta_key_conf,
2604 struct sk_buff *skb,
2605 struct ieee80211_key_conf *key,
2606 enum set_key_cmd cmd)
2608 struct sta_rec_sec *sec;
2609 u32 len = sizeof(*sec);
2612 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_KEY_V2, sizeof(*sec));
2613 sec = (struct sta_rec_sec *)tlv;
2616 if (cmd == SET_KEY) {
2617 struct sec_key *sec_key;
2620 cipher = mt76_connac_mcu_get_cipher(key->cipher);
2621 if (cipher == MCU_CIPHER_NONE)
2624 sec_key = &sec->key[0];
2625 sec_key->cipher_len = sizeof(*sec_key);
2627 if (cipher == MCU_CIPHER_BIP_CMAC_128) {
2628 sec_key->cipher_id = MCU_CIPHER_AES_CCMP;
2629 sec_key->key_id = sta_key_conf->keyidx;
2630 sec_key->key_len = 16;
2631 memcpy(sec_key->key, sta_key_conf->key, 16);
2633 sec_key = &sec->key[1];
2634 sec_key->cipher_id = MCU_CIPHER_BIP_CMAC_128;
2635 sec_key->cipher_len = sizeof(*sec_key);
2636 sec_key->key_len = 16;
2637 memcpy(sec_key->key, key->key, 16);
2640 sec_key->cipher_id = cipher;
2641 sec_key->key_id = key->keyidx;
2642 sec_key->key_len = key->keylen;
2643 memcpy(sec_key->key, key->key, key->keylen);
2645 if (cipher == MCU_CIPHER_TKIP) {
2646 /* Rx/Tx MIC keys are swapped */
2647 memcpy(sec_key->key + 16, key->key + 24, 8);
2648 memcpy(sec_key->key + 24, key->key + 16, 8);
2651 /* store key_conf for BIP batch update */
2652 if (cipher == MCU_CIPHER_AES_CCMP) {
2653 memcpy(sta_key_conf->key, key->key, key->keylen);
2654 sta_key_conf->keyidx = key->keyidx;
2657 len -= sizeof(*sec_key);
2661 len -= sizeof(sec->key);
2664 sec->len = cpu_to_le16(len);
2669 int mt76_connac_mcu_add_key(struct mt76_dev *dev, struct ieee80211_vif *vif,
2670 struct mt76_connac_sta_key_conf *sta_key_conf,
2671 struct ieee80211_key_conf *key, int mcu_cmd,
2672 struct mt76_wcid *wcid, enum set_key_cmd cmd)
2674 struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
2675 struct sk_buff *skb;
2678 skb = mt76_connac_mcu_alloc_sta_req(dev, mvif, wcid);
2680 return PTR_ERR(skb);
2682 ret = mt76_connac_mcu_sta_key_tlv(sta_key_conf, skb, key, cmd);
2686 ret = mt76_connac_mcu_sta_wed_update(dev, skb);
2690 return mt76_mcu_skb_send_msg(dev, skb, mcu_cmd, true);
2692 EXPORT_SYMBOL_GPL(mt76_connac_mcu_add_key);
2694 /* SIFS 20us + 512 byte beacon transmitted by 1Mbps (3906us) */
2695 #define BCN_TX_ESTIMATE_TIME (4096 + 20)
2696 void mt76_connac_mcu_bss_ext_tlv(struct sk_buff *skb, struct mt76_vif *mvif)
2698 struct bss_info_ext_bss *ext;
2699 int ext_bss_idx, tsf_offset;
2702 ext_bss_idx = mvif->omac_idx - EXT_BSSID_START;
2703 if (ext_bss_idx < 0)
2706 tlv = mt76_connac_mcu_add_tlv(skb, BSS_INFO_EXT_BSS, sizeof(*ext));
2708 ext = (struct bss_info_ext_bss *)tlv;
2709 tsf_offset = ext_bss_idx * BCN_TX_ESTIMATE_TIME;
2710 ext->mbss_tsf_offset = cpu_to_le32(tsf_offset);
2712 EXPORT_SYMBOL_GPL(mt76_connac_mcu_bss_ext_tlv);
2714 int mt76_connac_mcu_bss_basic_tlv(struct sk_buff *skb,
2715 struct ieee80211_vif *vif,
2716 struct ieee80211_sta *sta,
2717 struct mt76_phy *phy, u16 wlan_idx,
2720 struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
2721 u32 type = vif->p2p ? NETWORK_P2P : NETWORK_INFRA;
2722 struct bss_info_basic *bss;
2725 tlv = mt76_connac_mcu_add_tlv(skb, BSS_INFO_BASIC, sizeof(*bss));
2726 bss = (struct bss_info_basic *)tlv;
2728 switch (vif->type) {
2729 case NL80211_IFTYPE_MESH_POINT:
2730 case NL80211_IFTYPE_MONITOR:
2732 case NL80211_IFTYPE_AP:
2733 if (ieee80211_hw_check(phy->hw, SUPPORTS_MULTI_BSSID)) {
2734 u8 bssid_id = vif->bss_conf.bssid_indicator;
2735 struct wiphy *wiphy = phy->hw->wiphy;
2737 if (bssid_id > ilog2(wiphy->mbssid_max_interfaces))
2740 bss->non_tx_bssid = vif->bss_conf.bssid_index;
2741 bss->max_bssid = bssid_id;
2744 case NL80211_IFTYPE_STATION:
2748 sta = ieee80211_find_sta(vif,
2749 vif->bss_conf.bssid);
2750 /* TODO: enable BSS_INFO_UAPSD & BSS_INFO_PM */
2752 struct mt76_wcid *wcid;
2754 wcid = (struct mt76_wcid *)sta->drv_priv;
2755 wlan_idx = wcid->idx;
2760 case NL80211_IFTYPE_ADHOC:
2761 type = NETWORK_IBSS;
2768 bss->network_type = cpu_to_le32(type);
2769 bss->bmc_wcid_lo = to_wcid_lo(wlan_idx);
2770 bss->bmc_wcid_hi = to_wcid_hi(wlan_idx);
2771 bss->wmm_idx = mvif->wmm_idx;
2772 bss->active = enable;
2773 bss->cipher = mvif->cipher;
2775 if (vif->type != NL80211_IFTYPE_MONITOR) {
2776 struct cfg80211_chan_def *chandef = &phy->chandef;
2778 memcpy(bss->bssid, vif->bss_conf.bssid, ETH_ALEN);
2779 bss->bcn_interval = cpu_to_le16(vif->bss_conf.beacon_int);
2780 bss->dtim_period = vif->bss_conf.dtim_period;
2781 bss->phy_mode = mt76_connac_get_phy_mode(phy, vif,
2782 chandef->chan->band, NULL);
2784 memcpy(bss->bssid, phy->macaddr, ETH_ALEN);
2789 EXPORT_SYMBOL_GPL(mt76_connac_mcu_bss_basic_tlv);
2791 #define ENTER_PM_STATE 1
2792 #define EXIT_PM_STATE 2
2793 int mt76_connac_mcu_set_pm(struct mt76_dev *dev, int band, int enter)
2801 __le16 bcn_interval;
2814 .pm_state = enter ? ENTER_PM_STATE : EXIT_PM_STATE,
2818 return mt76_mcu_send_msg(dev, MCU_EXT_CMD(PM_STATE_CTRL), &req,
2821 EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_pm);
2823 int mt76_connac_mcu_restart(struct mt76_dev *dev)
2832 return mt76_mcu_send_msg(dev, MCU_CMD(NIC_POWER_CTRL), &req,
2833 sizeof(req), false);
2835 EXPORT_SYMBOL_GPL(mt76_connac_mcu_restart);
2837 int mt76_connac_mcu_rdd_cmd(struct mt76_dev *dev, int cmd, u8 index,
2849 .rdd_rx_sel = rx_sel,
2853 return mt76_mcu_send_msg(dev, MCU_EXT_CMD(SET_RDD_CTRL), &req,
2856 EXPORT_SYMBOL_GPL(mt76_connac_mcu_rdd_cmd);
2859 mt76_connac_mcu_send_ram_firmware(struct mt76_dev *dev,
2860 const struct mt76_connac2_fw_trailer *hdr,
2861 const u8 *data, bool is_wa)
2863 int i, offset = 0, max_len = mt76_is_sdio(dev) ? 2048 : 4096;
2864 u32 override = 0, option = 0;
2866 for (i = 0; i < hdr->n_region; i++) {
2867 const struct mt76_connac2_fw_region *region;
2868 u32 len, addr, mode;
2871 region = (const void *)((const u8 *)hdr -
2872 (hdr->n_region - i) * sizeof(*region));
2873 mode = mt76_connac_mcu_gen_dl_mode(dev, region->feature_set,
2875 len = le32_to_cpu(region->len);
2876 addr = le32_to_cpu(region->addr);
2878 if (region->feature_set & FW_FEATURE_NON_DL)
2881 if (region->feature_set & FW_FEATURE_OVERRIDE_ADDR)
2884 err = mt76_connac_mcu_init_download(dev, addr, len, mode);
2886 dev_err(dev->dev, "Download request failed\n");
2890 err = __mt76_mcu_send_firmware(dev, MCU_CMD(FW_SCATTER),
2891 data + offset, len, max_len);
2893 dev_err(dev->dev, "Failed to send firmware.\n");
2902 option |= FW_START_OVERRIDE;
2904 option |= FW_START_WORKING_PDA_CR4;
2906 return mt76_connac_mcu_start_firmware(dev, override, option);
2909 int mt76_connac2_load_ram(struct mt76_dev *dev, const char *fw_wm,
2912 const struct mt76_connac2_fw_trailer *hdr;
2913 const struct firmware *fw;
2916 ret = request_firmware(&fw, fw_wm, dev->dev);
2920 if (!fw || !fw->data || fw->size < sizeof(*hdr)) {
2921 dev_err(dev->dev, "Invalid firmware\n");
2926 hdr = (const void *)(fw->data + fw->size - sizeof(*hdr));
2927 dev_info(dev->dev, "WM Firmware Version: %.10s, Build Time: %.15s\n",
2928 hdr->fw_ver, hdr->build_date);
2930 ret = mt76_connac_mcu_send_ram_firmware(dev, hdr, fw->data, false);
2932 dev_err(dev->dev, "Failed to start WM firmware\n");
2936 snprintf(dev->hw->wiphy->fw_version,
2937 sizeof(dev->hw->wiphy->fw_version),
2938 "%.10s-%.15s", hdr->fw_ver, hdr->build_date);
2940 release_firmware(fw);
2945 ret = request_firmware(&fw, fw_wa, dev->dev);
2949 if (!fw || !fw->data || fw->size < sizeof(*hdr)) {
2950 dev_err(dev->dev, "Invalid firmware\n");
2955 hdr = (const void *)(fw->data + fw->size - sizeof(*hdr));
2956 dev_info(dev->dev, "WA Firmware Version: %.10s, Build Time: %.15s\n",
2957 hdr->fw_ver, hdr->build_date);
2959 ret = mt76_connac_mcu_send_ram_firmware(dev, hdr, fw->data, true);
2961 dev_err(dev->dev, "Failed to start WA firmware\n");
2965 snprintf(dev->hw->wiphy->fw_version,
2966 sizeof(dev->hw->wiphy->fw_version),
2967 "%.10s-%.15s", hdr->fw_ver, hdr->build_date);
2970 release_firmware(fw);
2974 EXPORT_SYMBOL_GPL(mt76_connac2_load_ram);
2976 static u32 mt76_connac2_get_data_mode(struct mt76_dev *dev, u32 info)
2978 u32 mode = DL_MODE_NEED_RSP;
2980 if ((!is_mt7921(dev) && !is_mt7925(dev)) || info == PATCH_SEC_NOT_SUPPORT)
2983 switch (FIELD_GET(PATCH_SEC_ENC_TYPE_MASK, info)) {
2984 case PATCH_SEC_ENC_TYPE_PLAIN:
2986 case PATCH_SEC_ENC_TYPE_AES:
2987 mode |= DL_MODE_ENCRYPT;
2988 mode |= FIELD_PREP(DL_MODE_KEY_IDX,
2989 (info & PATCH_SEC_ENC_AES_KEY_MASK)) & DL_MODE_KEY_IDX;
2990 mode |= DL_MODE_RESET_SEC_IV;
2992 case PATCH_SEC_ENC_TYPE_SCRAMBLE:
2993 mode |= DL_MODE_ENCRYPT;
2994 mode |= DL_CONFIG_ENCRY_MODE_SEL;
2995 mode |= DL_MODE_RESET_SEC_IV;
2998 dev_err(dev->dev, "Encryption type not support!\n");
3004 int mt76_connac2_load_patch(struct mt76_dev *dev, const char *fw_name)
3006 int i, ret, sem, max_len = mt76_is_sdio(dev) ? 2048 : 4096;
3007 const struct mt76_connac2_patch_hdr *hdr;
3008 const struct firmware *fw = NULL;
3010 sem = mt76_connac_mcu_patch_sem_ctrl(dev, true);
3014 case PATCH_NOT_DL_SEM_SUCCESS:
3017 dev_err(dev->dev, "Failed to get patch semaphore\n");
3021 ret = request_firmware(&fw, fw_name, dev->dev);
3025 if (!fw || !fw->data || fw->size < sizeof(*hdr)) {
3026 dev_err(dev->dev, "Invalid firmware\n");
3031 hdr = (const void *)fw->data;
3032 dev_info(dev->dev, "HW/SW Version: 0x%x, Build Time: %.16s\n",
3033 be32_to_cpu(hdr->hw_sw_ver), hdr->build_date);
3035 for (i = 0; i < be32_to_cpu(hdr->desc.n_region); i++) {
3036 struct mt76_connac2_patch_sec *sec;
3037 u32 len, addr, mode;
3041 sec = (void *)(fw->data + sizeof(*hdr) + i * sizeof(*sec));
3042 if ((be32_to_cpu(sec->type) & PATCH_SEC_TYPE_MASK) !=
3043 PATCH_SEC_TYPE_INFO) {
3048 addr = be32_to_cpu(sec->info.addr);
3049 len = be32_to_cpu(sec->info.len);
3050 dl = fw->data + be32_to_cpu(sec->offs);
3051 sec_info = be32_to_cpu(sec->info.sec_key_idx);
3052 mode = mt76_connac2_get_data_mode(dev, sec_info);
3054 ret = mt76_connac_mcu_init_download(dev, addr, len, mode);
3056 dev_err(dev->dev, "Download request failed\n");
3060 ret = __mt76_mcu_send_firmware(dev, MCU_CMD(FW_SCATTER),
3063 dev_err(dev->dev, "Failed to send patch\n");
3068 ret = mt76_connac_mcu_start_patch(dev);
3070 dev_err(dev->dev, "Failed to start patch\n");
3073 sem = mt76_connac_mcu_patch_sem_ctrl(dev, false);
3075 case PATCH_REL_SEM_SUCCESS:
3079 dev_err(dev->dev, "Failed to release patch semaphore\n");
3083 release_firmware(fw);
3087 EXPORT_SYMBOL_GPL(mt76_connac2_load_patch);
3089 int mt76_connac2_mcu_fill_message(struct mt76_dev *dev, struct sk_buff *skb,
3090 int cmd, int *wait_seq)
3092 int txd_len, mcu_cmd = FIELD_GET(__MCU_CMD_FIELD_ID, cmd);
3093 struct mt76_connac2_mcu_uni_txd *uni_txd;
3094 struct mt76_connac2_mcu_txd *mcu_txd;
3099 /* TODO: make dynamic based on msg type */
3100 dev->mcu.timeout = 20 * HZ;
3102 seq = ++dev->mcu.msg_seq & 0xf;
3104 seq = ++dev->mcu.msg_seq & 0xf;
3106 if (cmd == MCU_CMD(FW_SCATTER))
3109 txd_len = cmd & __MCU_CMD_FIELD_UNI ? sizeof(*uni_txd) : sizeof(*mcu_txd);
3110 txd = (__le32 *)skb_push(skb, txd_len);
3112 val = FIELD_PREP(MT_TXD0_TX_BYTES, skb->len) |
3113 FIELD_PREP(MT_TXD0_PKT_FMT, MT_TX_TYPE_CMD) |
3114 FIELD_PREP(MT_TXD0_Q_IDX, MT_TX_MCU_PORT_RX_Q0);
3115 txd[0] = cpu_to_le32(val);
3117 val = MT_TXD1_LONG_FORMAT |
3118 FIELD_PREP(MT_TXD1_HDR_FORMAT, MT_HDR_FORMAT_CMD);
3119 txd[1] = cpu_to_le32(val);
3121 if (cmd & __MCU_CMD_FIELD_UNI) {
3122 uni_txd = (struct mt76_connac2_mcu_uni_txd *)txd;
3123 uni_txd->len = cpu_to_le16(skb->len - sizeof(uni_txd->txd));
3124 uni_txd->option = MCU_CMD_UNI_EXT_ACK;
3125 uni_txd->cid = cpu_to_le16(mcu_cmd);
3126 uni_txd->s2d_index = MCU_S2D_H2N;
3127 uni_txd->pkt_type = MCU_PKT_ID;
3133 mcu_txd = (struct mt76_connac2_mcu_txd *)txd;
3134 mcu_txd->len = cpu_to_le16(skb->len - sizeof(mcu_txd->txd));
3135 mcu_txd->pq_id = cpu_to_le16(MCU_PQ_ID(MT_TX_PORT_IDX_MCU,
3136 MT_TX_MCU_PORT_RX_Q0));
3137 mcu_txd->pkt_type = MCU_PKT_ID;
3139 mcu_txd->cid = mcu_cmd;
3140 mcu_txd->ext_cid = FIELD_GET(__MCU_CMD_FIELD_EXT_ID, cmd);
3142 if (mcu_txd->ext_cid || (cmd & __MCU_CMD_FIELD_CE)) {
3143 if (cmd & __MCU_CMD_FIELD_QUERY)
3144 mcu_txd->set_query = MCU_Q_QUERY;
3146 mcu_txd->set_query = MCU_Q_SET;
3147 mcu_txd->ext_cid_ack = !!mcu_txd->ext_cid;
3149 mcu_txd->set_query = MCU_Q_NA;
3152 if (cmd & __MCU_CMD_FIELD_WA)
3153 mcu_txd->s2d_index = MCU_S2D_H2C;
3155 mcu_txd->s2d_index = MCU_S2D_H2N;
3163 EXPORT_SYMBOL_GPL(mt76_connac2_mcu_fill_message);
3165 MODULE_AUTHOR("Lorenzo Bianconi <lorenzo@kernel.org>");
3166 MODULE_DESCRIPTION("MediaTek MT76x connac layer helpers");
3167 MODULE_LICENSE("Dual BSD/GPL");