1 // SPDX-License-Identifier: ISC
2 /* Copyright (C) 2020 MediaTek Inc. */
4 #include <linux/firmware.h>
11 struct mt7915_patch_hdr {
28 struct mt7915_patch_sec {
44 struct mt7915_fw_trailer {
56 struct mt7915_fw_region {
67 #define MCU_PATCH_ADDRESS 0x200000
69 #define FW_FEATURE_SET_ENCRYPT BIT(0)
70 #define FW_FEATURE_SET_KEY_IDX GENMASK(2, 1)
71 #define FW_FEATURE_OVERRIDE_ADDR BIT(5)
73 #define DL_MODE_ENCRYPT BIT(0)
74 #define DL_MODE_KEY_IDX GENMASK(2, 1)
75 #define DL_MODE_RESET_SEC_IV BIT(3)
76 #define DL_MODE_WORKING_PDA_CR4 BIT(4)
77 #define DL_MODE_NEED_RSP BIT(31)
79 #define FW_START_OVERRIDE BIT(0)
80 #define FW_START_WORKING_PDA_CR4 BIT(2)
82 #define PATCH_SEC_TYPE_MASK GENMASK(15, 0)
83 #define PATCH_SEC_TYPE_INFO 0x2
85 #define to_wcid_lo(id) FIELD_GET(GENMASK(7, 0), (u16)id)
86 #define to_wcid_hi(id) FIELD_GET(GENMASK(9, 8), (u16)id)
88 #define HE_PHY(p, c) u8_get_bits(c, IEEE80211_HE_PHY_##p)
89 #define HE_MAC(m, c) u8_get_bits(c, IEEE80211_HE_MAC_##m)
91 static enum mcu_cipher_type
92 mt7915_mcu_get_cipher(int cipher)
95 case WLAN_CIPHER_SUITE_WEP40:
96 return MCU_CIPHER_WEP40;
97 case WLAN_CIPHER_SUITE_WEP104:
98 return MCU_CIPHER_WEP104;
99 case WLAN_CIPHER_SUITE_TKIP:
100 return MCU_CIPHER_TKIP;
101 case WLAN_CIPHER_SUITE_AES_CMAC:
102 return MCU_CIPHER_BIP_CMAC_128;
103 case WLAN_CIPHER_SUITE_CCMP:
104 return MCU_CIPHER_AES_CCMP;
105 case WLAN_CIPHER_SUITE_CCMP_256:
106 return MCU_CIPHER_CCMP_256;
107 case WLAN_CIPHER_SUITE_GCMP:
108 return MCU_CIPHER_GCMP;
109 case WLAN_CIPHER_SUITE_GCMP_256:
110 return MCU_CIPHER_GCMP_256;
111 case WLAN_CIPHER_SUITE_SMS4:
112 return MCU_CIPHER_WAPI;
114 return MT_CIPHER_NONE;
118 static u8 mt7915_mcu_chan_bw(struct cfg80211_chan_def *chandef)
120 static const u8 width_to_bw[] = {
121 [NL80211_CHAN_WIDTH_40] = CMD_CBW_40MHZ,
122 [NL80211_CHAN_WIDTH_80] = CMD_CBW_80MHZ,
123 [NL80211_CHAN_WIDTH_80P80] = CMD_CBW_8080MHZ,
124 [NL80211_CHAN_WIDTH_160] = CMD_CBW_160MHZ,
125 [NL80211_CHAN_WIDTH_5] = CMD_CBW_5MHZ,
126 [NL80211_CHAN_WIDTH_10] = CMD_CBW_10MHZ,
127 [NL80211_CHAN_WIDTH_20] = CMD_CBW_20MHZ,
128 [NL80211_CHAN_WIDTH_20_NOHT] = CMD_CBW_20MHZ,
131 if (chandef->width >= ARRAY_SIZE(width_to_bw))
134 return width_to_bw[chandef->width];
137 static const struct ieee80211_sta_he_cap *
138 mt7915_get_he_phy_cap(struct mt7915_phy *phy, struct ieee80211_vif *vif)
140 struct ieee80211_supported_band *sband;
141 enum nl80211_band band;
143 band = phy->mt76->chandef.chan->band;
144 sband = phy->mt76->hw->wiphy->bands[band];
146 return ieee80211_get_he_iftype_cap(sband, vif->type);
150 mt7915_get_phy_mode(struct ieee80211_vif *vif, struct ieee80211_sta *sta)
152 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
153 enum nl80211_band band = mvif->phy->mt76->chandef.chan->band;
154 struct ieee80211_sta_ht_cap *ht_cap;
155 struct ieee80211_sta_vht_cap *vht_cap;
156 const struct ieee80211_sta_he_cap *he_cap;
160 ht_cap = &sta->ht_cap;
161 vht_cap = &sta->vht_cap;
162 he_cap = &sta->he_cap;
164 struct ieee80211_supported_band *sband;
166 sband = mvif->phy->mt76->hw->wiphy->bands[band];
168 ht_cap = &sband->ht_cap;
169 vht_cap = &sband->vht_cap;
170 he_cap = ieee80211_get_he_iftype_cap(sband, vif->type);
173 if (band == NL80211_BAND_2GHZ) {
174 mode |= PHY_MODE_B | PHY_MODE_G;
176 if (ht_cap->ht_supported)
180 mode |= PHY_MODE_AX_24G;
181 } else if (band == NL80211_BAND_5GHZ) {
184 if (ht_cap->ht_supported)
187 if (vht_cap->vht_supported)
191 mode |= PHY_MODE_AX_5G;
198 mt7915_mcu_get_sta_nss(u16 mcs_map)
202 for (nss = 8; nss > 0; nss--) {
203 u8 nss_mcs = (mcs_map >> (2 * (nss - 1))) & 3;
205 if (nss_mcs != IEEE80211_VHT_MCS_NOT_SUPPORTED)
213 mt7915_mcu_set_sta_he_mcs(struct ieee80211_sta *sta, __le16 *he_mcs,
216 struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
217 struct cfg80211_chan_def *chandef = &msta->vif->phy->mt76->chandef;
218 int nss, max_nss = sta->rx_nss > 3 ? 4 : sta->rx_nss;
221 switch (chandef->width) {
222 case NL80211_CHAN_WIDTH_80P80:
223 mcs_map = le16_to_cpu(sta->he_cap.he_mcs_nss_supp.rx_mcs_80p80);
225 case NL80211_CHAN_WIDTH_160:
226 mcs_map = le16_to_cpu(sta->he_cap.he_mcs_nss_supp.rx_mcs_160);
229 mcs_map = le16_to_cpu(sta->he_cap.he_mcs_nss_supp.rx_mcs_80);
233 for (nss = 0; nss < max_nss; nss++) {
236 switch ((mcs_map >> (2 * nss)) & 0x3) {
237 case IEEE80211_HE_MCS_SUPPORT_0_11:
238 mcs = GENMASK(11, 0);
240 case IEEE80211_HE_MCS_SUPPORT_0_9:
243 case IEEE80211_HE_MCS_SUPPORT_0_7:
250 mcs = mcs ? fls(mcs & mask[nss]) - 1 : -1;
254 mcs = IEEE80211_HE_MCS_SUPPORT_0_7;
257 mcs = IEEE80211_HE_MCS_SUPPORT_0_9;
260 mcs = IEEE80211_HE_MCS_SUPPORT_0_11;
263 mcs = IEEE80211_HE_MCS_NOT_SUPPORTED;
266 mcs_map &= ~(0x3 << (nss * 2));
267 mcs_map |= mcs << (nss * 2);
269 /* only support 2ss on 160MHz */
270 if (nss > 1 && (sta->bandwidth == IEEE80211_STA_RX_BW_160))
274 *he_mcs = cpu_to_le16(mcs_map);
278 mt7915_mcu_set_sta_vht_mcs(struct ieee80211_sta *sta, __le16 *vht_mcs,
281 u16 mcs_map = le16_to_cpu(sta->vht_cap.vht_mcs.rx_mcs_map);
282 int nss, max_nss = sta->rx_nss > 3 ? 4 : sta->rx_nss;
285 for (nss = 0; nss < max_nss; nss++, mcs_map >>= 2) {
286 switch (mcs_map & 0x3) {
287 case IEEE80211_VHT_MCS_SUPPORT_0_9:
290 case IEEE80211_VHT_MCS_SUPPORT_0_8:
293 case IEEE80211_VHT_MCS_SUPPORT_0_7:
300 vht_mcs[nss] = cpu_to_le16(mcs & mask[nss]);
302 /* only support 2ss on 160MHz */
303 if (nss > 1 && (sta->bandwidth == IEEE80211_STA_RX_BW_160))
309 mt7915_mcu_set_sta_ht_mcs(struct ieee80211_sta *sta, u8 *ht_mcs,
312 int nss, max_nss = sta->rx_nss > 3 ? 4 : sta->rx_nss;
314 for (nss = 0; nss < max_nss; nss++)
315 ht_mcs[nss] = sta->ht_cap.mcs.rx_mask[nss] & mask[nss];
319 mt7915_mcu_parse_response(struct mt76_dev *mdev, int cmd,
320 struct sk_buff *skb, int seq)
322 struct mt7915_mcu_rxd *rxd;
326 dev_err(mdev->dev, "Message %08x (seq %d) timeout\n",
331 rxd = (struct mt7915_mcu_rxd *)skb->data;
335 if (cmd == MCU_CMD(PATCH_SEM_CONTROL)) {
336 skb_pull(skb, sizeof(*rxd) - 4);
338 } else if (cmd == MCU_EXT_CMD(THERMAL_CTRL)) {
339 skb_pull(skb, sizeof(*rxd) + 4);
340 ret = le32_to_cpu(*(__le32 *)skb->data);
342 skb_pull(skb, sizeof(struct mt7915_mcu_rxd));
349 mt7915_mcu_send_message(struct mt76_dev *mdev, struct sk_buff *skb,
350 int cmd, int *wait_seq)
352 struct mt7915_dev *dev = container_of(mdev, struct mt7915_dev, mt76);
353 struct mt7915_mcu_txd *mcu_txd;
354 enum mt76_mcuq_id qid;
359 /* TODO: make dynamic based on msg type */
360 mdev->mcu.timeout = 20 * HZ;
362 seq = ++dev->mt76.mcu.msg_seq & 0xf;
364 seq = ++dev->mt76.mcu.msg_seq & 0xf;
366 if (cmd == MCU_CMD(FW_SCATTER)) {
371 mcu_txd = (struct mt7915_mcu_txd *)skb_push(skb, sizeof(*mcu_txd));
372 if (test_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state))
379 val = FIELD_PREP(MT_TXD0_TX_BYTES, skb->len) |
380 FIELD_PREP(MT_TXD0_PKT_FMT, MT_TX_TYPE_CMD) |
381 FIELD_PREP(MT_TXD0_Q_IDX, MT_TX_MCU_PORT_RX_Q0);
382 txd[0] = cpu_to_le32(val);
384 val = MT_TXD1_LONG_FORMAT |
385 FIELD_PREP(MT_TXD1_HDR_FORMAT, MT_HDR_FORMAT_CMD);
386 txd[1] = cpu_to_le32(val);
388 mcu_txd->len = cpu_to_le16(skb->len - sizeof(mcu_txd->txd));
389 mcu_txd->pq_id = cpu_to_le16(MCU_PQ_ID(MT_TX_PORT_IDX_MCU,
390 MT_TX_MCU_PORT_RX_Q0));
391 mcu_txd->pkt_type = MCU_PKT_ID;
394 mcu_txd->cid = FIELD_GET(__MCU_CMD_FIELD_ID, cmd);
395 mcu_txd->set_query = MCU_Q_NA;
396 mcu_txd->ext_cid = FIELD_GET(__MCU_CMD_FIELD_EXT_ID, cmd);
397 if (mcu_txd->ext_cid) {
398 mcu_txd->ext_cid_ack = 1;
400 /* do not use Q_SET for efuse */
401 if (cmd & __MCU_CMD_FIELD_QUERY)
402 mcu_txd->set_query = MCU_Q_QUERY;
404 mcu_txd->set_query = MCU_Q_SET;
407 if (cmd & __MCU_CMD_FIELD_WA)
408 mcu_txd->s2d_index = MCU_S2D_H2C;
410 mcu_txd->s2d_index = MCU_S2D_H2N;
416 return mt76_tx_queue_skb_raw(dev, mdev->q_mcu[qid], skb, 0);
420 mt7915_mcu_wa_cmd(struct mt7915_dev *dev, int cmd, u32 a1, u32 a2, u32 a3)
432 mt76_mcu_send_msg(&dev->mt76, cmd, &req, sizeof(req), true);
436 mt7915_mcu_csa_finish(void *priv, u8 *mac, struct ieee80211_vif *vif)
439 ieee80211_csa_finish(vif);
443 mt7915_mcu_rx_csa_notify(struct mt7915_dev *dev, struct sk_buff *skb)
445 struct mt76_phy *mphy = &dev->mt76.phy;
446 struct mt7915_mcu_csa_notify *c;
448 c = (struct mt7915_mcu_csa_notify *)skb->data;
450 if (c->band_idx && dev->mt76.phy2)
451 mphy = dev->mt76.phy2;
453 ieee80211_iterate_active_interfaces_atomic(mphy->hw,
454 IEEE80211_IFACE_ITER_RESUME_ALL,
455 mt7915_mcu_csa_finish, mphy->hw);
459 mt7915_mcu_rx_thermal_notify(struct mt7915_dev *dev, struct sk_buff *skb)
461 struct mt76_phy *mphy = &dev->mt76.phy;
462 struct mt7915_mcu_thermal_notify *t;
463 struct mt7915_phy *phy;
465 t = (struct mt7915_mcu_thermal_notify *)skb->data;
466 if (t->ctrl.ctrl_id != THERMAL_PROTECT_ENABLE)
469 if (t->ctrl.band_idx && dev->mt76.phy2)
470 mphy = dev->mt76.phy2;
472 phy = (struct mt7915_phy *)mphy->priv;
473 phy->throttle_state = t->ctrl.duty.duty_cycle;
477 mt7915_mcu_rx_radar_detected(struct mt7915_dev *dev, struct sk_buff *skb)
479 struct mt76_phy *mphy = &dev->mt76.phy;
480 struct mt7915_mcu_rdd_report *r;
482 r = (struct mt7915_mcu_rdd_report *)skb->data;
484 if (r->band_idx && dev->mt76.phy2)
485 mphy = dev->mt76.phy2;
487 ieee80211_radar_detected(mphy->hw);
492 mt7915_mcu_tx_rate_parse(struct mt76_phy *mphy, struct mt7915_mcu_ra_info *ra,
493 struct rate_info *rate, u16 r)
495 struct ieee80211_supported_band *sband;
496 u16 ru_idx = le16_to_cpu(ra->ru_idx);
499 rate->mcs = FIELD_GET(MT_RA_RATE_MCS, r);
500 rate->nss = FIELD_GET(MT_RA_RATE_NSS, r) + 1;
502 switch (FIELD_GET(MT_RA_RATE_TX_MODE, r)) {
503 case MT_PHY_TYPE_CCK:
506 case MT_PHY_TYPE_OFDM:
507 if (mphy->chandef.chan->band == NL80211_BAND_5GHZ)
508 sband = &mphy->sband_5g.sband;
510 sband = &mphy->sband_2g.sband;
512 rate->mcs = mt76_get_rate(mphy->dev, sband, rate->mcs, cck);
513 rate->legacy = sband->bitrates[rate->mcs].bitrate;
516 case MT_PHY_TYPE_HT_GF:
517 rate->mcs += (rate->nss - 1) * 8;
521 rate->flags = RATE_INFO_FLAGS_MCS;
523 rate->flags |= RATE_INFO_FLAGS_SHORT_GI;
525 case MT_PHY_TYPE_VHT:
529 rate->flags = RATE_INFO_FLAGS_VHT_MCS;
531 rate->flags |= RATE_INFO_FLAGS_SHORT_GI;
533 case MT_PHY_TYPE_HE_SU:
534 case MT_PHY_TYPE_HE_EXT_SU:
535 case MT_PHY_TYPE_HE_TB:
536 case MT_PHY_TYPE_HE_MU:
537 if (ra->gi > NL80211_RATE_INFO_HE_GI_3_2 || rate->mcs > 11)
540 rate->he_gi = ra->gi;
541 rate->he_dcm = FIELD_GET(MT_RA_RATE_DCM_EN, r);
542 rate->flags = RATE_INFO_FLAGS_HE_MCS;
551 rate->he_ru_alloc = NL80211_RATE_INFO_HE_RU_ALLOC_996;
554 rate->he_ru_alloc = NL80211_RATE_INFO_HE_RU_ALLOC_484;
557 rate->he_ru_alloc = NL80211_RATE_INFO_HE_RU_ALLOC_242;
560 rate->he_ru_alloc = NL80211_RATE_INFO_HE_RU_ALLOC_106;
563 rate->bw = RATE_INFO_BW_HE_RU;
565 u8 bw = mt7915_mcu_chan_bw(&mphy->chandef) -
566 FIELD_GET(MT_RA_RATE_BW, r);
569 case IEEE80211_STA_RX_BW_160:
570 rate->bw = RATE_INFO_BW_160;
572 case IEEE80211_STA_RX_BW_80:
573 rate->bw = RATE_INFO_BW_80;
575 case IEEE80211_STA_RX_BW_40:
576 rate->bw = RATE_INFO_BW_40;
579 rate->bw = RATE_INFO_BW_20;
588 mt7915_mcu_tx_rate_report(struct mt7915_dev *dev, struct sk_buff *skb)
590 struct mt7915_mcu_ra_info *ra = (struct mt7915_mcu_ra_info *)skb->data;
591 struct rate_info rate = {}, prob_rate = {};
592 u16 probe = le16_to_cpu(ra->prob_up_rate);
593 u16 attempts = le16_to_cpu(ra->attempts);
594 u16 curr = le16_to_cpu(ra->curr_rate);
595 u16 wcidx = le16_to_cpu(ra->wlan_idx);
596 struct ieee80211_tx_status status = {};
597 struct mt76_phy *mphy = &dev->mphy;
598 struct mt7915_sta_stats *stats;
599 struct mt7915_sta *msta;
600 struct mt76_wcid *wcid;
602 if (wcidx >= MT76_N_WCIDS)
605 wcid = rcu_dereference(dev->mt76.wcid[wcidx]);
609 msta = container_of(wcid, struct mt7915_sta, wcid);
610 stats = &msta->stats;
612 if (msta->wcid.ext_phy && dev->mt76.phy2)
613 mphy = dev->mt76.phy2;
616 if (!mt7915_mcu_tx_rate_parse(mphy, ra, &rate, curr))
617 stats->tx_rate = rate;
620 if (!mt7915_mcu_tx_rate_parse(mphy, ra, &prob_rate, probe))
621 stats->prob_rate = prob_rate;
624 u16 success = le16_to_cpu(ra->success);
626 stats->per = 1000 * (attempts - success) / attempts;
629 status.sta = wcid_to_sta(wcid);
633 status.rate = &stats->tx_rate;
634 ieee80211_tx_status_ext(mphy->hw, &status);
638 mt7915_mcu_rx_log_message(struct mt7915_dev *dev, struct sk_buff *skb)
640 struct mt7915_mcu_rxd *rxd = (struct mt7915_mcu_rxd *)skb->data;
641 const char *data = (char *)&rxd[1];
644 switch (rxd->s2d_index) {
656 wiphy_info(mt76_hw(dev)->wiphy, "%s: %.*s", type,
657 (int)(skb->len - sizeof(*rxd)), data);
661 mt7915_mcu_rx_ext_event(struct mt7915_dev *dev, struct sk_buff *skb)
663 struct mt7915_mcu_rxd *rxd = (struct mt7915_mcu_rxd *)skb->data;
665 switch (rxd->ext_eid) {
666 case MCU_EXT_EVENT_THERMAL_PROTECT:
667 mt7915_mcu_rx_thermal_notify(dev, skb);
669 case MCU_EXT_EVENT_RDD_REPORT:
670 mt7915_mcu_rx_radar_detected(dev, skb);
672 case MCU_EXT_EVENT_CSA_NOTIFY:
673 mt7915_mcu_rx_csa_notify(dev, skb);
675 case MCU_EXT_EVENT_RATE_REPORT:
676 mt7915_mcu_tx_rate_report(dev, skb);
678 case MCU_EXT_EVENT_FW_LOG_2_HOST:
679 mt7915_mcu_rx_log_message(dev, skb);
687 mt7915_mcu_rx_unsolicited_event(struct mt7915_dev *dev, struct sk_buff *skb)
689 struct mt7915_mcu_rxd *rxd = (struct mt7915_mcu_rxd *)skb->data;
693 mt7915_mcu_rx_ext_event(dev, skb);
701 void mt7915_mcu_rx_event(struct mt7915_dev *dev, struct sk_buff *skb)
703 struct mt7915_mcu_rxd *rxd = (struct mt7915_mcu_rxd *)skb->data;
705 if (rxd->ext_eid == MCU_EXT_EVENT_THERMAL_PROTECT ||
706 rxd->ext_eid == MCU_EXT_EVENT_FW_LOG_2_HOST ||
707 rxd->ext_eid == MCU_EXT_EVENT_ASSERT_DUMP ||
708 rxd->ext_eid == MCU_EXT_EVENT_PS_SYNC ||
709 rxd->ext_eid == MCU_EXT_EVENT_RATE_REPORT ||
711 mt7915_mcu_rx_unsolicited_event(dev, skb);
713 mt76_mcu_rx_event(&dev->mt76, skb);
716 static struct sk_buff *
717 mt7915_mcu_alloc_sta_req(struct mt7915_dev *dev, struct mt7915_vif *mvif,
718 struct mt7915_sta *msta, int len)
720 struct sta_req_hdr hdr = {
721 .bss_idx = mvif->idx,
722 .wlan_idx_lo = msta ? to_wcid_lo(msta->wcid.idx) : 0,
723 .wlan_idx_hi = msta ? to_wcid_hi(msta->wcid.idx) : 0,
724 .muar_idx = msta ? mvif->omac_idx : 0,
729 skb = mt76_mcu_msg_alloc(&dev->mt76, NULL, len);
731 return ERR_PTR(-ENOMEM);
733 skb_put_data(skb, &hdr, sizeof(hdr));
738 static struct wtbl_req_hdr *
739 mt7915_mcu_alloc_wtbl_req(struct mt7915_dev *dev, struct mt7915_sta *msta,
740 int cmd, void *sta_wtbl, struct sk_buff **skb)
742 struct tlv *sta_hdr = sta_wtbl;
743 struct wtbl_req_hdr hdr = {
744 .wlan_idx_lo = to_wcid_lo(msta->wcid.idx),
745 .wlan_idx_hi = to_wcid_hi(msta->wcid.idx),
748 struct sk_buff *nskb = *skb;
751 nskb = mt76_mcu_msg_alloc(&dev->mt76, NULL,
752 MT7915_WTBL_UPDATE_MAX_SIZE);
754 return ERR_PTR(-ENOMEM);
760 sta_hdr->len = cpu_to_le16(sizeof(hdr));
762 return skb_put_data(nskb, &hdr, sizeof(hdr));
766 mt7915_mcu_add_nested_tlv(struct sk_buff *skb, int tag, int len,
767 void *sta_ntlv, void *sta_wtbl)
769 struct sta_ntlv_hdr *ntlv_hdr = sta_ntlv;
770 struct tlv *sta_hdr = sta_wtbl;
771 struct tlv *ptlv, tlv = {
772 .tag = cpu_to_le16(tag),
773 .len = cpu_to_le16(len),
777 ptlv = skb_put(skb, len);
778 memcpy(ptlv, &tlv, sizeof(tlv));
780 ntlv = le16_to_cpu(ntlv_hdr->tlv_num);
781 ntlv_hdr->tlv_num = cpu_to_le16(ntlv + 1);
784 u16 size = le16_to_cpu(sta_hdr->len);
786 sta_hdr->len = cpu_to_le16(size + len);
793 mt7915_mcu_add_tlv(struct sk_buff *skb, int tag, int len)
795 return mt7915_mcu_add_nested_tlv(skb, tag, len, skb->data, NULL);
799 mt7915_mcu_add_nested_subtlv(struct sk_buff *skb, int sub_tag, int sub_len,
800 __le16 *sub_ntlv, __le16 *len)
802 struct tlv *ptlv, tlv = {
803 .tag = cpu_to_le16(sub_tag),
804 .len = cpu_to_le16(sub_len),
807 ptlv = skb_put(skb, sub_len);
808 memcpy(ptlv, &tlv, sizeof(tlv));
810 le16_add_cpu(sub_ntlv, 1);
811 le16_add_cpu(len, sub_len);
818 mt7915_mcu_bss_basic_tlv(struct sk_buff *skb, struct ieee80211_vif *vif,
819 struct mt7915_phy *phy, bool enable)
821 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
822 struct bss_info_basic *bss;
823 u16 wlan_idx = mvif->sta.wcid.idx;
824 u32 type = NETWORK_INFRA;
827 tlv = mt7915_mcu_add_tlv(skb, BSS_INFO_BASIC, sizeof(*bss));
830 case NL80211_IFTYPE_MESH_POINT:
831 case NL80211_IFTYPE_AP:
832 case NL80211_IFTYPE_MONITOR:
834 case NL80211_IFTYPE_STATION:
835 /* TODO: enable BSS_INFO_UAPSD & BSS_INFO_PM */
837 struct ieee80211_sta *sta;
838 struct mt7915_sta *msta;
841 sta = ieee80211_find_sta(vif, vif->bss_conf.bssid);
847 msta = (struct mt7915_sta *)sta->drv_priv;
848 wlan_idx = msta->wcid.idx;
852 case NL80211_IFTYPE_ADHOC:
860 bss = (struct bss_info_basic *)tlv;
861 bss->network_type = cpu_to_le32(type);
862 bss->bmc_wcid_lo = to_wcid_lo(wlan_idx);
863 bss->bmc_wcid_hi = to_wcid_hi(wlan_idx);
864 bss->wmm_idx = mvif->wmm_idx;
865 bss->active = enable;
867 if (vif->type != NL80211_IFTYPE_MONITOR) {
868 memcpy(bss->bssid, vif->bss_conf.bssid, ETH_ALEN);
869 bss->bcn_interval = cpu_to_le16(vif->bss_conf.beacon_int);
870 bss->dtim_period = vif->bss_conf.dtim_period;
871 bss->phy_mode = mt7915_get_phy_mode(vif, NULL);
873 memcpy(bss->bssid, phy->mt76->macaddr, ETH_ALEN);
880 mt7915_mcu_bss_omac_tlv(struct sk_buff *skb, struct ieee80211_vif *vif)
882 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
883 struct bss_info_omac *omac;
888 tlv = mt7915_mcu_add_tlv(skb, BSS_INFO_OMAC, sizeof(*omac));
891 case NL80211_IFTYPE_MONITOR:
892 case NL80211_IFTYPE_MESH_POINT:
893 case NL80211_IFTYPE_AP:
894 type = CONNECTION_INFRA_AP;
896 case NL80211_IFTYPE_STATION:
897 type = CONNECTION_INFRA_STA;
899 case NL80211_IFTYPE_ADHOC:
900 type = CONNECTION_IBSS_ADHOC;
907 omac = (struct bss_info_omac *)tlv;
908 idx = mvif->omac_idx > EXT_BSSID_START ? HW_BSSID_0 : mvif->omac_idx;
909 omac->conn_type = cpu_to_le32(type);
910 omac->omac_idx = mvif->omac_idx;
911 omac->band_idx = mvif->band_idx;
912 omac->hw_bss_idx = idx;
915 struct mt7915_he_obss_narrow_bw_ru_data {
919 static void mt7915_check_he_obss_narrow_bw_ru_iter(struct wiphy *wiphy,
920 struct cfg80211_bss *bss,
923 struct mt7915_he_obss_narrow_bw_ru_data *data = _data;
924 const struct element *elem;
926 elem = ieee80211_bss_get_elem(bss, WLAN_EID_EXT_CAPABILITY);
928 if (!elem || elem->datalen < 10 ||
930 WLAN_EXT_CAPA10_OBSS_NARROW_BW_RU_TOLERANCE_SUPPORT))
931 data->tolerated = false;
934 static bool mt7915_check_he_obss_narrow_bw_ru(struct ieee80211_hw *hw,
935 struct ieee80211_vif *vif)
937 struct mt7915_he_obss_narrow_bw_ru_data iter_data = {
941 if (!(vif->bss_conf.chandef.chan->flags & IEEE80211_CHAN_RADAR))
944 cfg80211_bss_iter(hw->wiphy, &vif->bss_conf.chandef,
945 mt7915_check_he_obss_narrow_bw_ru_iter,
949 * If there is at least one AP on radar channel that cannot
950 * tolerate 26-tone RU UL OFDMA transmissions using HE TB PPDU.
952 return !iter_data.tolerated;
956 mt7915_mcu_bss_rfch_tlv(struct sk_buff *skb, struct ieee80211_vif *vif,
957 struct mt7915_phy *phy)
959 struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
960 struct bss_info_rf_ch *ch;
962 int freq1 = chandef->center_freq1;
964 tlv = mt7915_mcu_add_tlv(skb, BSS_INFO_RF_CH, sizeof(*ch));
966 ch = (struct bss_info_rf_ch *)tlv;
967 ch->pri_ch = chandef->chan->hw_value;
968 ch->center_ch0 = ieee80211_frequency_to_channel(freq1);
969 ch->bw = mt7915_mcu_chan_bw(chandef);
971 if (chandef->width == NL80211_CHAN_WIDTH_80P80) {
972 int freq2 = chandef->center_freq2;
974 ch->center_ch1 = ieee80211_frequency_to_channel(freq2);
977 if (vif->bss_conf.he_support && vif->type == NL80211_IFTYPE_STATION) {
978 struct mt7915_dev *dev = phy->dev;
979 struct mt76_phy *mphy = &dev->mt76.phy;
980 bool ext_phy = phy != &dev->phy;
982 if (ext_phy && dev->mt76.phy2)
983 mphy = dev->mt76.phy2;
986 mt7915_check_he_obss_narrow_bw_ru(mphy->hw, vif);
987 ch->he_all_disable = false;
989 ch->he_all_disable = true;
994 mt7915_mcu_bss_ra_tlv(struct sk_buff *skb, struct ieee80211_vif *vif,
995 struct mt7915_phy *phy)
997 int max_nss = hweight8(phy->mt76->chainmask);
998 struct bss_info_ra *ra;
1001 tlv = mt7915_mcu_add_tlv(skb, BSS_INFO_RA, sizeof(*ra));
1003 ra = (struct bss_info_ra *)tlv;
1004 ra->op_mode = vif->type == NL80211_IFTYPE_AP;
1005 ra->adhoc_en = vif->type == NL80211_IFTYPE_ADHOC;
1006 ra->short_preamble = true;
1007 ra->tx_streams = max_nss;
1008 ra->rx_streams = max_nss;
1010 ra->train_up_rule = 2;
1011 ra->train_up_high_thres = 110;
1012 ra->train_up_rule_rssi = -70;
1013 ra->low_traffic_thres = 2;
1014 ra->phy_cap = cpu_to_le32(0xfdf);
1015 ra->interval = cpu_to_le32(500);
1016 ra->fast_interval = cpu_to_le32(100);
1020 mt7915_mcu_bss_he_tlv(struct sk_buff *skb, struct ieee80211_vif *vif,
1021 struct mt7915_phy *phy)
1023 #define DEFAULT_HE_PE_DURATION 4
1024 #define DEFAULT_HE_DURATION_RTS_THRES 1023
1025 const struct ieee80211_sta_he_cap *cap;
1026 struct bss_info_he *he;
1029 cap = mt7915_get_he_phy_cap(phy, vif);
1031 tlv = mt7915_mcu_add_tlv(skb, BSS_INFO_HE_BASIC, sizeof(*he));
1033 he = (struct bss_info_he *)tlv;
1034 he->he_pe_duration = vif->bss_conf.htc_trig_based_pkt_ext;
1035 if (!he->he_pe_duration)
1036 he->he_pe_duration = DEFAULT_HE_PE_DURATION;
1038 he->he_rts_thres = cpu_to_le16(vif->bss_conf.frame_time_rts_th);
1039 if (!he->he_rts_thres)
1040 he->he_rts_thres = cpu_to_le16(DEFAULT_HE_DURATION_RTS_THRES);
1042 he->max_nss_mcs[CMD_HE_MCS_BW80] = cap->he_mcs_nss_supp.tx_mcs_80;
1043 he->max_nss_mcs[CMD_HE_MCS_BW160] = cap->he_mcs_nss_supp.tx_mcs_160;
1044 he->max_nss_mcs[CMD_HE_MCS_BW8080] = cap->he_mcs_nss_supp.tx_mcs_80p80;
1048 mt7915_mcu_bss_hw_amsdu_tlv(struct sk_buff *skb)
1050 #define TXD_CMP_MAP1 GENMASK(15, 0)
1051 #define TXD_CMP_MAP2 (GENMASK(31, 0) & ~BIT(23))
1052 struct bss_info_hw_amsdu *amsdu;
1055 tlv = mt7915_mcu_add_tlv(skb, BSS_INFO_HW_AMSDU, sizeof(*amsdu));
1057 amsdu = (struct bss_info_hw_amsdu *)tlv;
1058 amsdu->cmp_bitmap_0 = cpu_to_le32(TXD_CMP_MAP1);
1059 amsdu->cmp_bitmap_1 = cpu_to_le32(TXD_CMP_MAP2);
1060 amsdu->trig_thres = cpu_to_le16(2);
1061 amsdu->enable = true;
1065 mt7915_mcu_bss_ext_tlv(struct sk_buff *skb, struct mt7915_vif *mvif)
1067 /* SIFS 20us + 512 byte beacon tranmitted by 1Mbps (3906us) */
1068 #define BCN_TX_ESTIMATE_TIME (4096 + 20)
1069 struct bss_info_ext_bss *ext;
1070 int ext_bss_idx, tsf_offset;
1073 ext_bss_idx = mvif->omac_idx - EXT_BSSID_START;
1074 if (ext_bss_idx < 0)
1077 tlv = mt7915_mcu_add_tlv(skb, BSS_INFO_EXT_BSS, sizeof(*ext));
1079 ext = (struct bss_info_ext_bss *)tlv;
1080 tsf_offset = ext_bss_idx * BCN_TX_ESTIMATE_TIME;
1081 ext->mbss_tsf_offset = cpu_to_le32(tsf_offset);
1085 mt7915_mcu_bss_bmc_tlv(struct sk_buff *skb, struct mt7915_phy *phy)
1087 struct bss_info_bmc_rate *bmc;
1088 struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
1089 enum nl80211_band band = chandef->chan->band;
1092 tlv = mt7915_mcu_add_tlv(skb, BSS_INFO_BMC_RATE, sizeof(*bmc));
1094 bmc = (struct bss_info_bmc_rate *)tlv;
1095 if (band == NL80211_BAND_2GHZ) {
1096 bmc->short_preamble = true;
1098 bmc->bc_trans = cpu_to_le16(0x2000);
1099 bmc->mc_trans = cpu_to_le16(0x2080);
1104 mt7915_mcu_muar_config(struct mt7915_phy *phy, struct ieee80211_vif *vif,
1105 bool bssid, bool enable)
1107 struct mt7915_dev *dev = phy->dev;
1108 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1109 u32 idx = mvif->omac_idx - REPEATER_BSSID_START;
1110 u32 mask = phy->omac_mask >> 32 & ~BIT(idx);
1111 const u8 *addr = vif->addr;
1124 .mode = !!mask || enable,
1127 .band = phy != &dev->phy,
1128 .index = idx * 2 + bssid,
1132 addr = vif->bss_conf.bssid;
1135 ether_addr_copy(req.addr, addr);
1137 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(MUAR_UPDATE), &req,
1141 int mt7915_mcu_add_bss_info(struct mt7915_phy *phy,
1142 struct ieee80211_vif *vif, int enable)
1144 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1145 struct sk_buff *skb;
1147 if (mvif->omac_idx >= REPEATER_BSSID_START) {
1148 mt7915_mcu_muar_config(phy, vif, false, enable);
1149 mt7915_mcu_muar_config(phy, vif, true, enable);
1152 skb = mt7915_mcu_alloc_sta_req(phy->dev, mvif, NULL,
1153 MT7915_BSS_UPDATE_MAX_SIZE);
1155 return PTR_ERR(skb);
1157 /* bss_omac must be first */
1159 mt7915_mcu_bss_omac_tlv(skb, vif);
1161 mt7915_mcu_bss_basic_tlv(skb, vif, phy, enable);
1163 if (vif->type == NL80211_IFTYPE_MONITOR)
1167 mt7915_mcu_bss_rfch_tlv(skb, vif, phy);
1168 mt7915_mcu_bss_bmc_tlv(skb, phy);
1169 mt7915_mcu_bss_ra_tlv(skb, vif, phy);
1170 mt7915_mcu_bss_hw_amsdu_tlv(skb);
1172 if (vif->bss_conf.he_support)
1173 mt7915_mcu_bss_he_tlv(skb, vif, phy);
1175 if (mvif->omac_idx >= EXT_BSSID_START &&
1176 mvif->omac_idx < REPEATER_BSSID_START)
1177 mt7915_mcu_bss_ext_tlv(skb, mvif);
1180 return mt76_mcu_skb_send_msg(&phy->dev->mt76, skb,
1181 MCU_EXT_CMD(BSS_INFO_UPDATE), true);
1184 /** starec & wtbl **/
1186 mt7915_mcu_sta_key_tlv(struct mt7915_sta *msta, struct sk_buff *skb,
1187 struct ieee80211_key_conf *key, enum set_key_cmd cmd)
1189 struct mt7915_sta_key_conf *bip = &msta->bip;
1190 struct sta_rec_sec *sec;
1192 u32 len = sizeof(*sec);
1194 tlv = mt7915_mcu_add_tlv(skb, STA_REC_KEY_V2, sizeof(*sec));
1196 sec = (struct sta_rec_sec *)tlv;
1199 if (cmd == SET_KEY) {
1200 struct sec_key *sec_key;
1203 cipher = mt7915_mcu_get_cipher(key->cipher);
1204 if (cipher == MT_CIPHER_NONE)
1207 sec_key = &sec->key[0];
1208 sec_key->cipher_len = sizeof(*sec_key);
1210 if (cipher == MCU_CIPHER_BIP_CMAC_128) {
1211 sec_key->cipher_id = MCU_CIPHER_AES_CCMP;
1212 sec_key->key_id = bip->keyidx;
1213 sec_key->key_len = 16;
1214 memcpy(sec_key->key, bip->key, 16);
1216 sec_key = &sec->key[1];
1217 sec_key->cipher_id = MCU_CIPHER_BIP_CMAC_128;
1218 sec_key->cipher_len = sizeof(*sec_key);
1219 sec_key->key_len = 16;
1220 memcpy(sec_key->key, key->key, 16);
1224 sec_key->cipher_id = cipher;
1225 sec_key->key_id = key->keyidx;
1226 sec_key->key_len = key->keylen;
1227 memcpy(sec_key->key, key->key, key->keylen);
1229 if (cipher == MCU_CIPHER_TKIP) {
1230 /* Rx/Tx MIC keys are swapped */
1231 memcpy(sec_key->key + 16, key->key + 24, 8);
1232 memcpy(sec_key->key + 24, key->key + 16, 8);
1235 /* store key_conf for BIP batch update */
1236 if (cipher == MCU_CIPHER_AES_CCMP) {
1237 memcpy(bip->key, key->key, key->keylen);
1238 bip->keyidx = key->keyidx;
1241 len -= sizeof(*sec_key);
1245 len -= sizeof(sec->key);
1248 sec->len = cpu_to_le16(len);
1253 int mt7915_mcu_add_key(struct mt7915_dev *dev, struct ieee80211_vif *vif,
1254 struct mt7915_sta *msta, struct ieee80211_key_conf *key,
1255 enum set_key_cmd cmd)
1257 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1258 struct sk_buff *skb;
1259 int len = sizeof(struct sta_req_hdr) + sizeof(struct sta_rec_sec);
1262 skb = mt7915_mcu_alloc_sta_req(dev, mvif, msta, len);
1264 return PTR_ERR(skb);
1266 ret = mt7915_mcu_sta_key_tlv(msta, skb, key, cmd);
1270 return mt76_mcu_skb_send_msg(&dev->mt76, skb,
1271 MCU_EXT_CMD(STA_REC_UPDATE), true);
1275 mt7915_mcu_sta_ba_tlv(struct sk_buff *skb,
1276 struct ieee80211_ampdu_params *params,
1277 bool enable, bool tx)
1279 struct sta_rec_ba *ba;
1282 tlv = mt7915_mcu_add_tlv(skb, STA_REC_BA, sizeof(*ba));
1284 ba = (struct sta_rec_ba *)tlv;
1285 ba->ba_type = tx ? MT_BA_TYPE_ORIGINATOR : MT_BA_TYPE_RECIPIENT;
1286 ba->winsize = cpu_to_le16(params->buf_size);
1287 ba->ssn = cpu_to_le16(params->ssn);
1288 ba->ba_en = enable << params->tid;
1289 ba->amsdu = params->amsdu;
1290 ba->tid = params->tid;
1294 mt7915_mcu_wtbl_ba_tlv(struct sk_buff *skb,
1295 struct ieee80211_ampdu_params *params,
1296 bool enable, bool tx, void *sta_wtbl,
1302 tlv = mt7915_mcu_add_nested_tlv(skb, WTBL_BA, sizeof(*ba),
1303 wtbl_tlv, sta_wtbl);
1305 ba = (struct wtbl_ba *)tlv;
1306 ba->tid = params->tid;
1309 ba->ba_type = MT_BA_TYPE_ORIGINATOR;
1310 ba->sn = enable ? cpu_to_le16(params->ssn) : 0;
1313 memcpy(ba->peer_addr, params->sta->addr, ETH_ALEN);
1314 ba->ba_type = MT_BA_TYPE_RECIPIENT;
1315 ba->rst_ba_tid = params->tid;
1316 ba->rst_ba_sel = RST_BA_MAC_TID_MATCH;
1321 ba->ba_winsize = cpu_to_le16(params->buf_size);
1325 mt7915_mcu_sta_ba(struct mt7915_dev *dev,
1326 struct ieee80211_ampdu_params *params,
1327 bool enable, bool tx)
1329 struct mt7915_sta *msta = (struct mt7915_sta *)params->sta->drv_priv;
1330 struct mt7915_vif *mvif = msta->vif;
1331 struct wtbl_req_hdr *wtbl_hdr;
1332 struct tlv *sta_wtbl;
1333 struct sk_buff *skb;
1336 if (enable && tx && !params->amsdu)
1337 msta->wcid.amsdu = false;
1339 skb = mt7915_mcu_alloc_sta_req(dev, mvif, msta,
1340 MT7915_STA_UPDATE_MAX_SIZE);
1342 return PTR_ERR(skb);
1344 sta_wtbl = mt7915_mcu_add_tlv(skb, STA_REC_WTBL, sizeof(struct tlv));
1346 wtbl_hdr = mt7915_mcu_alloc_wtbl_req(dev, msta, WTBL_SET, sta_wtbl,
1348 if (IS_ERR(wtbl_hdr))
1349 return PTR_ERR(wtbl_hdr);
1351 mt7915_mcu_wtbl_ba_tlv(skb, params, enable, tx, sta_wtbl, wtbl_hdr);
1353 ret = mt76_mcu_skb_send_msg(&dev->mt76, skb,
1354 MCU_EXT_CMD(STA_REC_UPDATE), true);
1358 skb = mt7915_mcu_alloc_sta_req(dev, mvif, msta,
1359 MT7915_STA_UPDATE_MAX_SIZE);
1361 return PTR_ERR(skb);
1363 mt7915_mcu_sta_ba_tlv(skb, params, enable, tx);
1365 return mt76_mcu_skb_send_msg(&dev->mt76, skb,
1366 MCU_EXT_CMD(STA_REC_UPDATE), true);
1369 int mt7915_mcu_add_tx_ba(struct mt7915_dev *dev,
1370 struct ieee80211_ampdu_params *params,
1373 return mt7915_mcu_sta_ba(dev, params, enable, true);
1376 int mt7915_mcu_add_rx_ba(struct mt7915_dev *dev,
1377 struct ieee80211_ampdu_params *params,
1380 return mt7915_mcu_sta_ba(dev, params, enable, false);
1384 mt7915_mcu_wtbl_generic_tlv(struct sk_buff *skb, struct ieee80211_vif *vif,
1385 struct ieee80211_sta *sta, void *sta_wtbl,
1388 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1389 struct wtbl_generic *generic;
1393 tlv = mt7915_mcu_add_nested_tlv(skb, WTBL_GENERIC, sizeof(*generic),
1394 wtbl_tlv, sta_wtbl);
1396 generic = (struct wtbl_generic *)tlv;
1399 memcpy(generic->peer_addr, sta->addr, ETH_ALEN);
1400 generic->partial_aid = cpu_to_le16(sta->aid);
1401 generic->muar_idx = mvif->omac_idx;
1402 generic->qos = sta->wme;
1404 /* use BSSID in station mode */
1405 if (vif->type == NL80211_IFTYPE_STATION)
1406 memcpy(generic->peer_addr, vif->bss_conf.bssid,
1409 eth_broadcast_addr(generic->peer_addr);
1411 generic->muar_idx = 0xe;
1414 tlv = mt7915_mcu_add_nested_tlv(skb, WTBL_RX, sizeof(*rx),
1415 wtbl_tlv, sta_wtbl);
1417 rx = (struct wtbl_rx *)tlv;
1418 rx->rca1 = sta ? vif->type != NL80211_IFTYPE_AP : 1;
1424 mt7915_mcu_sta_basic_tlv(struct sk_buff *skb, struct ieee80211_vif *vif,
1425 struct ieee80211_sta *sta, bool enable)
1427 #define EXTRA_INFO_VER BIT(0)
1428 #define EXTRA_INFO_NEW BIT(1)
1429 struct sta_rec_basic *basic;
1432 tlv = mt7915_mcu_add_tlv(skb, STA_REC_BASIC, sizeof(*basic));
1434 basic = (struct sta_rec_basic *)tlv;
1435 basic->extra_info = cpu_to_le16(EXTRA_INFO_VER);
1438 basic->extra_info |= cpu_to_le16(EXTRA_INFO_NEW);
1439 basic->conn_state = CONN_STATE_PORT_SECURE;
1441 basic->conn_state = CONN_STATE_DISCONNECT;
1445 basic->conn_type = cpu_to_le32(CONNECTION_INFRA_BC);
1446 eth_broadcast_addr(basic->peer_addr);
1450 switch (vif->type) {
1451 case NL80211_IFTYPE_MESH_POINT:
1452 case NL80211_IFTYPE_AP:
1453 basic->conn_type = cpu_to_le32(CONNECTION_INFRA_STA);
1455 case NL80211_IFTYPE_STATION:
1456 basic->conn_type = cpu_to_le32(CONNECTION_INFRA_AP);
1458 case NL80211_IFTYPE_ADHOC:
1459 basic->conn_type = cpu_to_le32(CONNECTION_IBSS_ADHOC);
1466 memcpy(basic->peer_addr, sta->addr, ETH_ALEN);
1467 basic->aid = cpu_to_le16(sta->aid);
1468 basic->qos = sta->wme;
1472 mt7915_mcu_sta_he_tlv(struct sk_buff *skb, struct ieee80211_sta *sta)
1474 struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
1475 struct ieee80211_sta_he_cap *he_cap = &sta->he_cap;
1476 struct ieee80211_he_cap_elem *elem = &he_cap->he_cap_elem;
1477 enum nl80211_band band = msta->vif->phy->mt76->chandef.chan->band;
1478 const u16 *mcs_mask = msta->vif->bitrate_mask.control[band].he_mcs;
1479 struct sta_rec_he *he;
1483 tlv = mt7915_mcu_add_tlv(skb, STA_REC_HE, sizeof(*he));
1485 he = (struct sta_rec_he *)tlv;
1487 if (elem->mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_HTC_HE)
1488 cap |= STA_REC_HE_CAP_HTC;
1490 if (elem->mac_cap_info[2] & IEEE80211_HE_MAC_CAP2_BSR)
1491 cap |= STA_REC_HE_CAP_BSR;
1493 if (elem->mac_cap_info[3] & IEEE80211_HE_MAC_CAP3_OMI_CONTROL)
1494 cap |= STA_REC_HE_CAP_OM;
1496 if (elem->mac_cap_info[4] & IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU)
1497 cap |= STA_REC_HE_CAP_AMSDU_IN_AMPDU;
1499 if (elem->mac_cap_info[4] & IEEE80211_HE_MAC_CAP4_BQR)
1500 cap |= STA_REC_HE_CAP_BQR;
1502 if (elem->phy_cap_info[0] &
1503 (IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_RU_MAPPING_IN_2G |
1504 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_RU_MAPPING_IN_5G))
1505 cap |= STA_REC_HE_CAP_BW20_RU242_SUPPORT;
1507 if (elem->phy_cap_info[1] &
1508 IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD)
1509 cap |= STA_REC_HE_CAP_LDPC;
1511 if (elem->phy_cap_info[1] &
1512 IEEE80211_HE_PHY_CAP1_HE_LTF_AND_GI_FOR_HE_PPDUS_0_8US)
1513 cap |= STA_REC_HE_CAP_SU_PPDU_1LTF_8US_GI;
1515 if (elem->phy_cap_info[2] &
1516 IEEE80211_HE_PHY_CAP2_NDP_4x_LTF_AND_3_2US)
1517 cap |= STA_REC_HE_CAP_NDP_4LTF_3DOT2MS_GI;
1519 if (elem->phy_cap_info[2] &
1520 IEEE80211_HE_PHY_CAP2_STBC_TX_UNDER_80MHZ)
1521 cap |= STA_REC_HE_CAP_LE_EQ_80M_TX_STBC;
1523 if (elem->phy_cap_info[2] &
1524 IEEE80211_HE_PHY_CAP2_STBC_RX_UNDER_80MHZ)
1525 cap |= STA_REC_HE_CAP_LE_EQ_80M_RX_STBC;
1527 if (elem->phy_cap_info[6] &
1528 IEEE80211_HE_PHY_CAP6_PARTIAL_BW_EXT_RANGE)
1529 cap |= STA_REC_HE_CAP_PARTIAL_BW_EXT_RANGE;
1531 if (elem->phy_cap_info[7] &
1532 IEEE80211_HE_PHY_CAP7_HE_SU_MU_PPDU_4XLTF_AND_08_US_GI)
1533 cap |= STA_REC_HE_CAP_SU_MU_PPDU_4LTF_8US_GI;
1535 if (elem->phy_cap_info[7] &
1536 IEEE80211_HE_PHY_CAP7_STBC_TX_ABOVE_80MHZ)
1537 cap |= STA_REC_HE_CAP_GT_80M_TX_STBC;
1539 if (elem->phy_cap_info[7] &
1540 IEEE80211_HE_PHY_CAP7_STBC_RX_ABOVE_80MHZ)
1541 cap |= STA_REC_HE_CAP_GT_80M_RX_STBC;
1543 if (elem->phy_cap_info[8] &
1544 IEEE80211_HE_PHY_CAP8_HE_ER_SU_PPDU_4XLTF_AND_08_US_GI)
1545 cap |= STA_REC_HE_CAP_ER_SU_PPDU_4LTF_8US_GI;
1547 if (elem->phy_cap_info[8] &
1548 IEEE80211_HE_PHY_CAP8_HE_ER_SU_1XLTF_AND_08_US_GI)
1549 cap |= STA_REC_HE_CAP_ER_SU_PPDU_1LTF_8US_GI;
1551 if (elem->phy_cap_info[9] &
1552 IEEE80211_HE_PHY_CAP9_NON_TRIGGERED_CQI_FEEDBACK)
1553 cap |= STA_REC_HE_CAP_TRIG_CQI_FK;
1555 if (elem->phy_cap_info[9] &
1556 IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU)
1557 cap |= STA_REC_HE_CAP_TX_1024QAM_UNDER_RU242;
1559 if (elem->phy_cap_info[9] &
1560 IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU)
1561 cap |= STA_REC_HE_CAP_RX_1024QAM_UNDER_RU242;
1563 he->he_cap = cpu_to_le32(cap);
1565 switch (sta->bandwidth) {
1566 case IEEE80211_STA_RX_BW_160:
1567 if (elem->phy_cap_info[0] &
1568 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
1569 mt7915_mcu_set_sta_he_mcs(sta,
1570 &he->max_nss_mcs[CMD_HE_MCS_BW8080],
1573 mt7915_mcu_set_sta_he_mcs(sta,
1574 &he->max_nss_mcs[CMD_HE_MCS_BW160],
1578 mt7915_mcu_set_sta_he_mcs(sta,
1579 &he->max_nss_mcs[CMD_HE_MCS_BW80],
1585 HE_MAC(CAP1_TF_MAC_PAD_DUR_MASK, elem->mac_cap_info[1]);
1587 HE_MAC(CAP3_MAX_AMPDU_LEN_EXP_MASK, elem->mac_cap_info[3]);
1590 HE_PHY(CAP0_CHANNEL_WIDTH_SET_MASK, elem->phy_cap_info[0]);
1592 HE_PHY(CAP1_DEVICE_CLASS_A, elem->phy_cap_info[1]);
1594 HE_PHY(CAP1_PREAMBLE_PUNC_RX_MASK, elem->phy_cap_info[1]);
1597 HE_PHY(CAP3_DCM_MAX_CONST_TX_MASK, elem->phy_cap_info[3]);
1598 he->dcm_tx_max_nss =
1599 HE_PHY(CAP3_DCM_MAX_TX_NSS_2, elem->phy_cap_info[3]);
1601 HE_PHY(CAP3_DCM_MAX_CONST_RX_MASK, elem->phy_cap_info[3]);
1602 he->dcm_rx_max_nss =
1603 HE_PHY(CAP3_DCM_MAX_RX_NSS_2, elem->phy_cap_info[3]);
1604 he->dcm_rx_max_nss =
1605 HE_PHY(CAP8_DCM_MAX_RU_MASK, elem->phy_cap_info[8]);
1611 mt7915_mcu_sta_uapsd_tlv(struct sk_buff *skb, struct ieee80211_sta *sta,
1612 struct ieee80211_vif *vif)
1614 struct sta_rec_uapsd *uapsd;
1617 if (vif->type != NL80211_IFTYPE_AP || !sta->wme)
1620 tlv = mt7915_mcu_add_tlv(skb, STA_REC_APPS, sizeof(*uapsd));
1621 uapsd = (struct sta_rec_uapsd *)tlv;
1623 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO) {
1624 uapsd->dac_map |= BIT(3);
1625 uapsd->tac_map |= BIT(3);
1627 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI) {
1628 uapsd->dac_map |= BIT(2);
1629 uapsd->tac_map |= BIT(2);
1631 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE) {
1632 uapsd->dac_map |= BIT(1);
1633 uapsd->tac_map |= BIT(1);
1635 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK) {
1636 uapsd->dac_map |= BIT(0);
1637 uapsd->tac_map |= BIT(0);
1639 uapsd->max_sp = sta->max_sp;
1643 mt7915_mcu_sta_muru_tlv(struct sk_buff *skb, struct ieee80211_sta *sta)
1645 struct ieee80211_sta_he_cap *he_cap = &sta->he_cap;
1646 struct ieee80211_he_cap_elem *elem = &he_cap->he_cap_elem;
1647 struct sta_rec_muru *muru;
1650 tlv = mt7915_mcu_add_tlv(skb, STA_REC_MURU, sizeof(*muru));
1652 muru = (struct sta_rec_muru *)tlv;
1653 muru->cfg.ofdma_dl_en = true;
1654 muru->cfg.mimo_dl_en = true;
1656 muru->ofdma_dl.punc_pream_rx =
1657 HE_PHY(CAP1_PREAMBLE_PUNC_RX_MASK, elem->phy_cap_info[1]);
1658 muru->ofdma_dl.he_20m_in_40m_2g =
1659 HE_PHY(CAP8_20MHZ_IN_40MHZ_HE_PPDU_IN_2G, elem->phy_cap_info[8]);
1660 muru->ofdma_dl.he_20m_in_160m =
1661 HE_PHY(CAP8_20MHZ_IN_160MHZ_HE_PPDU, elem->phy_cap_info[8]);
1662 muru->ofdma_dl.he_80m_in_160m =
1663 HE_PHY(CAP8_80MHZ_IN_160MHZ_HE_PPDU, elem->phy_cap_info[8]);
1664 muru->ofdma_dl.lt16_sigb = 0;
1665 muru->ofdma_dl.rx_su_comp_sigb = 0;
1666 muru->ofdma_dl.rx_su_non_comp_sigb = 0;
1668 muru->ofdma_ul.t_frame_dur =
1669 HE_MAC(CAP1_TF_MAC_PAD_DUR_MASK, elem->mac_cap_info[1]);
1670 muru->ofdma_ul.mu_cascading =
1671 HE_MAC(CAP2_MU_CASCADING, elem->mac_cap_info[2]);
1672 muru->ofdma_ul.uo_ra =
1673 HE_MAC(CAP3_OFDMA_RA, elem->mac_cap_info[3]);
1674 muru->ofdma_ul.he_2x996_tone = 0;
1675 muru->ofdma_ul.rx_t_frame_11ac = 0;
1677 muru->mimo_dl.vht_mu_bfee =
1678 !!(sta->vht_cap.cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE);
1679 muru->mimo_dl.partial_bw_dl_mimo =
1680 HE_PHY(CAP6_PARTIAL_BANDWIDTH_DL_MUMIMO, elem->phy_cap_info[6]);
1682 muru->mimo_ul.full_ul_mimo =
1683 HE_PHY(CAP2_UL_MU_FULL_MU_MIMO, elem->phy_cap_info[2]);
1684 muru->mimo_ul.partial_ul_mimo =
1685 HE_PHY(CAP2_UL_MU_PARTIAL_MU_MIMO, elem->phy_cap_info[2]);
1689 mt7915_mcu_sta_vht_tlv(struct sk_buff *skb, struct ieee80211_sta *sta)
1691 struct sta_rec_vht *vht;
1694 tlv = mt7915_mcu_add_tlv(skb, STA_REC_VHT, sizeof(*vht));
1696 vht = (struct sta_rec_vht *)tlv;
1697 vht->vht_cap = cpu_to_le32(sta->vht_cap.cap);
1698 vht->vht_rx_mcs_map = sta->vht_cap.vht_mcs.rx_mcs_map;
1699 vht->vht_tx_mcs_map = sta->vht_cap.vht_mcs.tx_mcs_map;
1703 mt7915_mcu_sta_amsdu_tlv(struct sk_buff *skb, struct ieee80211_sta *sta)
1705 struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
1706 struct sta_rec_amsdu *amsdu;
1709 if (!sta->max_amsdu_len)
1712 tlv = mt7915_mcu_add_tlv(skb, STA_REC_HW_AMSDU, sizeof(*amsdu));
1713 amsdu = (struct sta_rec_amsdu *)tlv;
1714 amsdu->max_amsdu_num = 8;
1715 amsdu->amsdu_en = true;
1716 amsdu->max_mpdu_size = sta->max_amsdu_len >=
1717 IEEE80211_MAX_MPDU_LEN_VHT_7991;
1718 msta->wcid.amsdu = true;
1722 mt7915_hw_amsdu_supported(struct ieee80211_vif *vif)
1724 switch (vif->type) {
1725 case NL80211_IFTYPE_AP:
1726 case NL80211_IFTYPE_STATION:
1734 mt7915_mcu_sta_tlv(struct mt7915_dev *dev, struct sk_buff *skb,
1735 struct ieee80211_sta *sta, struct ieee80211_vif *vif)
1740 if (sta->ht_cap.ht_supported) {
1741 struct sta_rec_ht *ht;
1743 tlv = mt7915_mcu_add_tlv(skb, STA_REC_HT, sizeof(*ht));
1744 ht = (struct sta_rec_ht *)tlv;
1745 ht->ht_cap = cpu_to_le16(sta->ht_cap.cap);
1747 if (mt7915_hw_amsdu_supported(vif))
1748 mt7915_mcu_sta_amsdu_tlv(skb, sta);
1752 if (sta->he_cap.has_he)
1753 mt7915_mcu_sta_he_tlv(skb, sta);
1756 mt7915_mcu_sta_uapsd_tlv(skb, sta, vif);
1760 mt7915_mcu_wtbl_smps_tlv(struct sk_buff *skb, struct ieee80211_sta *sta,
1761 void *sta_wtbl, void *wtbl_tlv)
1763 struct wtbl_smps *smps;
1766 tlv = mt7915_mcu_add_nested_tlv(skb, WTBL_SMPS, sizeof(*smps),
1767 wtbl_tlv, sta_wtbl);
1768 smps = (struct wtbl_smps *)tlv;
1770 if (sta->smps_mode == IEEE80211_SMPS_DYNAMIC)
1775 mt7915_mcu_wtbl_ht_tlv(struct sk_buff *skb, struct ieee80211_sta *sta,
1776 void *sta_wtbl, void *wtbl_tlv)
1778 struct wtbl_ht *ht = NULL;
1782 if (sta->ht_cap.ht_supported) {
1783 tlv = mt7915_mcu_add_nested_tlv(skb, WTBL_HT, sizeof(*ht),
1784 wtbl_tlv, sta_wtbl);
1785 ht = (struct wtbl_ht *)tlv;
1786 ht->ldpc = !!(sta->ht_cap.cap & IEEE80211_HT_CAP_LDPC_CODING);
1787 ht->af = sta->ht_cap.ampdu_factor;
1788 ht->mm = sta->ht_cap.ampdu_density;
1793 if (sta->vht_cap.vht_supported) {
1794 struct wtbl_vht *vht;
1797 tlv = mt7915_mcu_add_nested_tlv(skb, WTBL_VHT, sizeof(*vht),
1798 wtbl_tlv, sta_wtbl);
1799 vht = (struct wtbl_vht *)tlv;
1800 vht->ldpc = !!(sta->vht_cap.cap & IEEE80211_VHT_CAP_RXLDPC);
1803 af = FIELD_GET(IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK,
1806 ht->af = max_t(u8, ht->af, af);
1809 mt7915_mcu_wtbl_smps_tlv(skb, sta, sta_wtbl, wtbl_tlv);
1813 mt7915_mcu_wtbl_hdr_trans_tlv(struct sk_buff *skb, struct ieee80211_vif *vif,
1814 struct ieee80211_sta *sta,
1815 void *sta_wtbl, void *wtbl_tlv)
1817 struct mt7915_sta *msta;
1818 struct wtbl_hdr_trans *htr = NULL;
1821 tlv = mt7915_mcu_add_nested_tlv(skb, WTBL_HDR_TRANS, sizeof(*htr),
1822 wtbl_tlv, sta_wtbl);
1823 htr = (struct wtbl_hdr_trans *)tlv;
1824 htr->no_rx_trans = true;
1825 if (vif->type == NL80211_IFTYPE_STATION)
1828 htr->from_ds = true;
1833 msta = (struct mt7915_sta *)sta->drv_priv;
1834 htr->no_rx_trans = !test_bit(MT_WCID_FLAG_HDR_TRANS, &msta->wcid.flags);
1835 if (test_bit(MT_WCID_FLAG_4ADDR, &msta->wcid.flags)) {
1837 htr->from_ds = true;
1841 int mt7915_mcu_sta_update_hdr_trans(struct mt7915_dev *dev,
1842 struct ieee80211_vif *vif,
1843 struct ieee80211_sta *sta)
1845 struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
1846 struct wtbl_req_hdr *wtbl_hdr;
1847 struct sk_buff *skb;
1849 skb = mt76_mcu_msg_alloc(&dev->mt76, NULL, MT7915_WTBL_UPDATE_MAX_SIZE);
1853 wtbl_hdr = mt7915_mcu_alloc_wtbl_req(dev, msta, WTBL_SET, NULL, &skb);
1854 if (IS_ERR(wtbl_hdr))
1855 return PTR_ERR(wtbl_hdr);
1857 mt7915_mcu_wtbl_hdr_trans_tlv(skb, vif, sta, NULL, wtbl_hdr);
1859 return mt76_mcu_skb_send_msg(&dev->mt76, skb, MCU_EXT_CMD(WTBL_UPDATE),
1863 int mt7915_mcu_add_smps(struct mt7915_dev *dev, struct ieee80211_vif *vif,
1864 struct ieee80211_sta *sta)
1866 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1867 struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
1868 struct wtbl_req_hdr *wtbl_hdr;
1869 struct tlv *sta_wtbl;
1870 struct sk_buff *skb;
1872 skb = mt7915_mcu_alloc_sta_req(dev, mvif, msta,
1873 MT7915_STA_UPDATE_MAX_SIZE);
1875 return PTR_ERR(skb);
1877 sta_wtbl = mt7915_mcu_add_tlv(skb, STA_REC_WTBL, sizeof(struct tlv));
1879 wtbl_hdr = mt7915_mcu_alloc_wtbl_req(dev, msta, WTBL_SET, sta_wtbl,
1881 if (IS_ERR(wtbl_hdr))
1882 return PTR_ERR(wtbl_hdr);
1884 mt7915_mcu_wtbl_smps_tlv(skb, sta, sta_wtbl, wtbl_hdr);
1886 return mt76_mcu_skb_send_msg(&dev->mt76, skb,
1887 MCU_EXT_CMD(STA_REC_UPDATE), true);
1891 mt7915_mcu_sta_sounding_rate(struct sta_rec_bf *bf)
1893 bf->bf_cap = MT_EBF;
1894 bf->sounding_phy = MT_PHY_TYPE_OFDM;
1895 bf->ndp_rate = 0; /* mcs0 */
1896 bf->ndpa_rate = MT7915_CFEND_RATE_DEFAULT; /* ofdm 24m */
1897 bf->rept_poll_rate = MT7915_CFEND_RATE_DEFAULT; /* ofdm 24m */
1901 mt7915_mcu_sta_bfer_ht(struct ieee80211_sta *sta, struct mt7915_phy *phy,
1902 struct sta_rec_bf *bf)
1904 struct ieee80211_mcs_info *mcs = &sta->ht_cap.mcs;
1907 bf->tx_mode = MT_PHY_TYPE_HT;
1908 bf->bf_cap = MT_IBF;
1910 if (mcs->tx_params & IEEE80211_HT_MCS_TX_RX_DIFF &&
1911 (mcs->tx_params & IEEE80211_HT_MCS_TX_DEFINED))
1912 n = FIELD_GET(IEEE80211_HT_MCS_TX_MAX_STREAMS_MASK,
1914 else if (mcs->rx_mask[3])
1916 else if (mcs->rx_mask[2])
1918 else if (mcs->rx_mask[1])
1921 bf->nr = hweight8(phy->mt76->chainmask) - 1;
1922 bf->nc = min_t(u8, bf->nr, n);
1927 mt7915_mcu_sta_bfer_vht(struct ieee80211_sta *sta, struct mt7915_phy *phy,
1928 struct sta_rec_bf *bf, bool explicit)
1930 struct ieee80211_sta_vht_cap *pc = &sta->vht_cap;
1931 struct ieee80211_sta_vht_cap *vc = &phy->mt76->sband_5g.sband.vht_cap;
1932 u16 mcs_map = le16_to_cpu(pc->vht_mcs.rx_mcs_map);
1933 u8 nss_mcs = mt7915_mcu_get_sta_nss(mcs_map);
1934 u8 tx_ant = hweight8(phy->mt76->chainmask) - 1;
1936 bf->tx_mode = MT_PHY_TYPE_VHT;
1939 u8 bfee_nr, bfer_nr;
1941 mt7915_mcu_sta_sounding_rate(bf);
1942 bfee_nr = FIELD_GET(IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK,
1944 bfer_nr = FIELD_GET(IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK,
1946 bf->nr = min_t(u8, min_t(u8, bfer_nr, bfee_nr), tx_ant);
1947 bf->nc = min_t(u8, nss_mcs, bf->nr);
1948 bf->ibf_ncol = bf->nc;
1950 if (sta->bandwidth == IEEE80211_STA_RX_BW_160)
1953 bf->bf_cap = MT_IBF;
1955 bf->nc = min_t(u8, nss_mcs, bf->nr);
1956 bf->ibf_ncol = nss_mcs;
1958 if (sta->bandwidth == IEEE80211_STA_RX_BW_160)
1964 mt7915_mcu_sta_bfer_he(struct ieee80211_sta *sta, struct ieee80211_vif *vif,
1965 struct mt7915_phy *phy, struct sta_rec_bf *bf)
1967 struct ieee80211_sta_he_cap *pc = &sta->he_cap;
1968 struct ieee80211_he_cap_elem *pe = &pc->he_cap_elem;
1969 const struct ieee80211_sta_he_cap *vc = mt7915_get_he_phy_cap(phy, vif);
1970 const struct ieee80211_he_cap_elem *ve = &vc->he_cap_elem;
1971 u16 mcs_map = le16_to_cpu(pc->he_mcs_nss_supp.rx_mcs_80);
1972 u8 nss_mcs = mt7915_mcu_get_sta_nss(mcs_map);
1973 u8 bfee_nr, bfer_nr;
1975 bf->tx_mode = MT_PHY_TYPE_HE_SU;
1976 mt7915_mcu_sta_sounding_rate(bf);
1977 bf->trigger_su = HE_PHY(CAP6_TRIG_SU_BEAMFORMING_FB,
1978 pe->phy_cap_info[6]);
1979 bf->trigger_mu = HE_PHY(CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB,
1980 pe->phy_cap_info[6]);
1981 bfer_nr = HE_PHY(CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK,
1982 ve->phy_cap_info[5]);
1983 bfee_nr = HE_PHY(CAP4_BEAMFORMEE_MAX_STS_UNDER_80MHZ_MASK,
1984 pe->phy_cap_info[4]);
1985 bf->nr = min_t(u8, bfer_nr, bfee_nr);
1986 bf->nc = min_t(u8, nss_mcs, bf->nr);
1987 bf->ibf_ncol = bf->nc;
1989 if (sta->bandwidth != IEEE80211_STA_RX_BW_160)
1992 /* go over for 160MHz and 80p80 */
1993 if (pe->phy_cap_info[0] &
1994 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G) {
1995 mcs_map = le16_to_cpu(pc->he_mcs_nss_supp.rx_mcs_160);
1996 nss_mcs = mt7915_mcu_get_sta_nss(mcs_map);
1998 bf->nc_bw160 = nss_mcs;
2001 if (pe->phy_cap_info[0] &
2002 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G) {
2003 mcs_map = le16_to_cpu(pc->he_mcs_nss_supp.rx_mcs_80p80);
2004 nss_mcs = mt7915_mcu_get_sta_nss(mcs_map);
2007 bf->nc_bw160 = min_t(u8, bf->nc_bw160, nss_mcs);
2009 bf->nc_bw160 = nss_mcs;
2012 bfer_nr = HE_PHY(CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_MASK,
2013 ve->phy_cap_info[5]);
2014 bfee_nr = HE_PHY(CAP4_BEAMFORMEE_MAX_STS_ABOVE_80MHZ_MASK,
2015 pe->phy_cap_info[4]);
2017 bf->nr_bw160 = min_t(int, bfer_nr, bfee_nr);
2021 mt7915_mcu_sta_bfer_tlv(struct sk_buff *skb, struct ieee80211_sta *sta,
2022 struct ieee80211_vif *vif, struct mt7915_phy *phy,
2023 bool enable, bool explicit)
2025 int tx_ant = hweight8(phy->mt76->chainmask) - 1;
2026 struct sta_rec_bf *bf;
2028 const u8 matrix[4][4] = {
2030 {1, 1, 0, 0}, /* 2x1, 2x2, 2x3, 2x4 */
2031 {2, 4, 4, 0}, /* 3x1, 3x2, 3x3, 3x4 */
2032 {3, 5, 6, 0} /* 4x1, 4x2, 4x3, 4x4 */
2035 #define MT_BFER_FREE cpu_to_le16(GENMASK(15, 0))
2037 tlv = mt7915_mcu_add_tlv(skb, STA_REC_BF, sizeof(*bf));
2038 bf = (struct sta_rec_bf *)tlv;
2041 bf->pfmu = MT_BFER_FREE;
2045 /* he: eBF only, in accordance with spec
2046 * vht: support eBF and iBF
2047 * ht: iBF only, since mac80211 lacks of eBF support
2049 if (sta->he_cap.has_he && explicit)
2050 mt7915_mcu_sta_bfer_he(sta, vif, phy, bf);
2051 else if (sta->vht_cap.vht_supported)
2052 mt7915_mcu_sta_bfer_vht(sta, phy, bf, explicit);
2053 else if (sta->ht_cap.ht_supported)
2054 mt7915_mcu_sta_bfer_ht(sta, phy, bf);
2058 bf->bw = sta->bandwidth;
2059 bf->ibf_dbw = sta->bandwidth;
2060 bf->ibf_nrow = tx_ant;
2062 if (!explicit && sta->bandwidth <= IEEE80211_STA_RX_BW_40 && !bf->nc)
2063 bf->ibf_timeout = 0x48;
2065 bf->ibf_timeout = 0x18;
2067 if (explicit && bf->nr != tx_ant)
2068 bf->mem_20m = matrix[tx_ant][bf->nc];
2070 bf->mem_20m = matrix[bf->nr][bf->nc];
2072 switch (sta->bandwidth) {
2073 case IEEE80211_STA_RX_BW_160:
2074 case IEEE80211_STA_RX_BW_80:
2075 bf->mem_total = bf->mem_20m * 2;
2077 case IEEE80211_STA_RX_BW_40:
2078 bf->mem_total = bf->mem_20m;
2080 case IEEE80211_STA_RX_BW_20:
2087 mt7915_mcu_sta_bfee_tlv(struct sk_buff *skb, struct ieee80211_sta *sta,
2088 struct mt7915_phy *phy)
2090 int tx_ant = hweight8(phy->mt76->chainmask) - 1;
2091 struct sta_rec_bfee *bfee;
2095 tlv = mt7915_mcu_add_tlv(skb, STA_REC_BFEE, sizeof(*bfee));
2096 bfee = (struct sta_rec_bfee *)tlv;
2098 if (sta->he_cap.has_he) {
2099 struct ieee80211_he_cap_elem *pe = &sta->he_cap.he_cap_elem;
2101 nr = HE_PHY(CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK,
2102 pe->phy_cap_info[5]);
2103 } else if (sta->vht_cap.vht_supported) {
2104 struct ieee80211_sta_vht_cap *pc = &sta->vht_cap;
2106 nr = FIELD_GET(IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK,
2110 /* reply with identity matrix to avoid 2x2 BF negative gain */
2111 bfee->fb_identity_matrix = !!(nr == 1 && tx_ant == 2);
2115 mt7915_mcu_add_txbf(struct mt7915_dev *dev, struct ieee80211_vif *vif,
2116 struct ieee80211_sta *sta, bool enable)
2118 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
2119 struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
2120 struct mt7915_phy *phy;
2121 struct sk_buff *skb;
2123 bool ebfee = 0, ebf = 0;
2125 if (vif->type != NL80211_IFTYPE_STATION &&
2126 vif->type != NL80211_IFTYPE_AP)
2129 phy = mvif->band_idx ? mt7915_ext_phy(dev) : &dev->phy;
2131 if (sta->he_cap.has_he) {
2132 struct ieee80211_he_cap_elem *pe;
2133 const struct ieee80211_he_cap_elem *ve;
2134 const struct ieee80211_sta_he_cap *vc;
2136 pe = &sta->he_cap.he_cap_elem;
2137 vc = mt7915_get_he_phy_cap(phy, vif);
2138 ve = &vc->he_cap_elem;
2140 ebfee = !!(HE_PHY(CAP3_SU_BEAMFORMER, pe->phy_cap_info[3]) &&
2141 HE_PHY(CAP4_SU_BEAMFORMEE, ve->phy_cap_info[4]));
2142 ebf = !!(HE_PHY(CAP3_SU_BEAMFORMER, ve->phy_cap_info[3]) &&
2143 HE_PHY(CAP4_SU_BEAMFORMEE, pe->phy_cap_info[4]));
2144 } else if (sta->vht_cap.vht_supported) {
2145 struct ieee80211_sta_vht_cap *pc;
2146 struct ieee80211_sta_vht_cap *vc;
2149 vc = &phy->mt76->sband_5g.sband.vht_cap;
2151 ebfee = !!((pc->cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE) &&
2152 (vc->cap & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE));
2153 ebf = !!((vc->cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE) &&
2154 (pc->cap & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE));
2157 /* must keep each tag independent */
2160 if (ebf || dev->ibf) {
2161 len = sizeof(struct sta_req_hdr) + sizeof(struct sta_rec_bf);
2163 skb = mt7915_mcu_alloc_sta_req(dev, mvif, msta, len);
2165 return PTR_ERR(skb);
2167 mt7915_mcu_sta_bfer_tlv(skb, sta, vif, phy, enable, ebf);
2169 r = mt76_mcu_skb_send_msg(&dev->mt76, skb,
2170 MCU_EXT_CMD(STA_REC_UPDATE), true);
2177 len = sizeof(struct sta_req_hdr) + sizeof(struct sta_rec_bfee);
2179 skb = mt7915_mcu_alloc_sta_req(dev, mvif, msta, len);
2181 return PTR_ERR(skb);
2183 mt7915_mcu_sta_bfee_tlv(skb, sta, phy);
2185 r = mt76_mcu_skb_send_msg(&dev->mt76, skb,
2186 MCU_EXT_CMD(STA_REC_UPDATE), true);
2195 mt7915_mcu_sta_rate_ctrl_tlv(struct sk_buff *skb, struct mt7915_dev *dev,
2196 struct ieee80211_vif *vif, struct ieee80211_sta *sta)
2198 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
2199 struct cfg80211_chan_def *chandef = &mvif->phy->mt76->chandef;
2200 struct cfg80211_bitrate_mask *mask = &mvif->bitrate_mask;
2201 enum nl80211_band band = chandef->chan->band;
2202 struct sta_rec_ra *ra;
2204 u32 supp_rate = sta->supp_rates[band];
2205 u32 cap = sta->wme ? STA_CAP_WMM : 0;
2207 tlv = mt7915_mcu_add_tlv(skb, STA_REC_RA, sizeof(*ra));
2208 ra = (struct sta_rec_ra *)tlv;
2211 ra->auto_rate = true;
2212 ra->phy_mode = mt7915_get_phy_mode(vif, sta);
2213 ra->channel = chandef->chan->hw_value;
2214 ra->bw = sta->bandwidth;
2215 ra->phy.bw = sta->bandwidth;
2218 supp_rate &= mask->control[band].legacy;
2219 ra->rate_len = hweight32(supp_rate);
2221 if (band == NL80211_BAND_2GHZ) {
2222 ra->supp_mode = MODE_CCK;
2223 ra->supp_cck_rate = supp_rate & GENMASK(3, 0);
2225 if (ra->rate_len > 4) {
2226 ra->supp_mode |= MODE_OFDM;
2227 ra->supp_ofdm_rate = supp_rate >> 4;
2230 ra->supp_mode = MODE_OFDM;
2231 ra->supp_ofdm_rate = supp_rate;
2235 if (sta->ht_cap.ht_supported) {
2236 const u8 *mcs_mask = mask->control[band].ht_mcs;
2238 ra->supp_mode |= MODE_HT;
2239 ra->af = sta->ht_cap.ampdu_factor;
2240 ra->ht_gf = !!(sta->ht_cap.cap & IEEE80211_HT_CAP_GRN_FLD);
2243 if (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20)
2244 cap |= STA_CAP_SGI_20;
2245 if (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40)
2246 cap |= STA_CAP_SGI_40;
2247 if (sta->ht_cap.cap & IEEE80211_HT_CAP_TX_STBC)
2248 cap |= STA_CAP_TX_STBC;
2249 if (sta->ht_cap.cap & IEEE80211_HT_CAP_RX_STBC)
2250 cap |= STA_CAP_RX_STBC;
2251 if (sta->ht_cap.cap & IEEE80211_HT_CAP_LDPC_CODING)
2252 cap |= STA_CAP_LDPC;
2254 mt7915_mcu_set_sta_ht_mcs(sta, ra->ht_mcs, mcs_mask);
2255 ra->supp_ht_mcs = *(__le32 *)ra->ht_mcs;
2258 if (sta->vht_cap.vht_supported) {
2259 const u16 *mcs_mask = mask->control[band].vht_mcs;
2262 ra->supp_mode |= MODE_VHT;
2263 af = FIELD_GET(IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK,
2265 ra->af = max_t(u8, ra->af, af);
2268 if (sta->vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_80)
2269 cap |= STA_CAP_VHT_SGI_80;
2270 if (sta->vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_160)
2271 cap |= STA_CAP_VHT_SGI_160;
2272 if (sta->vht_cap.cap & IEEE80211_VHT_CAP_TXSTBC)
2273 cap |= STA_CAP_VHT_TX_STBC;
2274 if (sta->vht_cap.cap & IEEE80211_VHT_CAP_RXSTBC_1)
2275 cap |= STA_CAP_VHT_RX_STBC;
2276 if (sta->vht_cap.cap & IEEE80211_VHT_CAP_RXLDPC)
2277 cap |= STA_CAP_VHT_LDPC;
2279 mt7915_mcu_set_sta_vht_mcs(sta, ra->supp_vht_mcs, mcs_mask);
2282 if (sta->he_cap.has_he) {
2283 ra->supp_mode |= MODE_HE;
2287 ra->sta_cap = cpu_to_le32(cap);
2290 int mt7915_mcu_add_rate_ctrl(struct mt7915_dev *dev, struct ieee80211_vif *vif,
2291 struct ieee80211_sta *sta)
2293 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
2294 struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
2295 struct sk_buff *skb;
2296 int len = sizeof(struct sta_req_hdr) + sizeof(struct sta_rec_ra);
2298 skb = mt7915_mcu_alloc_sta_req(dev, mvif, msta, len);
2300 return PTR_ERR(skb);
2302 mt7915_mcu_sta_rate_ctrl_tlv(skb, dev, vif, sta);
2304 return mt76_mcu_skb_send_msg(&dev->mt76, skb,
2305 MCU_EXT_CMD(STA_REC_UPDATE), true);
2308 int mt7915_mcu_add_he(struct mt7915_dev *dev, struct ieee80211_vif *vif,
2309 struct ieee80211_sta *sta)
2311 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
2312 struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
2313 struct sk_buff *skb;
2316 if (!sta->he_cap.has_he)
2319 len = sizeof(struct sta_req_hdr) + sizeof(struct sta_rec_he);
2321 skb = mt7915_mcu_alloc_sta_req(dev, mvif, msta, len);
2323 return PTR_ERR(skb);
2325 mt7915_mcu_sta_he_tlv(skb, sta);
2327 return mt76_mcu_skb_send_msg(&dev->mt76, skb,
2328 MCU_EXT_CMD(STA_REC_UPDATE), true);
2332 mt7915_mcu_add_group(struct mt7915_dev *dev, struct ieee80211_vif *vif,
2333 struct ieee80211_sta *sta)
2335 #define MT_STA_BSS_GROUP 1
2336 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
2337 struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
2347 .action = cpu_to_le32(MT_STA_BSS_GROUP),
2348 .wlan_idx_lo = to_wcid_lo(msta->wcid.idx),
2349 .wlan_idx_hi = to_wcid_hi(msta->wcid.idx),
2350 .val = cpu_to_le32(mvif->idx % 16),
2353 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_DRR_CTRL), &req,
2358 mt7915_mcu_add_mu(struct mt7915_dev *dev, struct ieee80211_vif *vif,
2359 struct ieee80211_sta *sta)
2361 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
2362 struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
2363 struct sk_buff *skb;
2366 if (!sta->vht_cap.vht_supported && !sta->he_cap.has_he)
2369 ret = mt7915_mcu_add_group(dev, vif, sta);
2373 skb = mt7915_mcu_alloc_sta_req(dev, mvif, msta,
2374 MT7915_STA_UPDATE_MAX_SIZE);
2376 return PTR_ERR(skb);
2378 /* wait until TxBF and MU ready to update stare vht */
2381 mt7915_mcu_sta_muru_tlv(skb, sta);
2383 mt7915_mcu_sta_vht_tlv(skb, sta);
2385 return mt76_mcu_skb_send_msg(&dev->mt76, skb,
2386 MCU_EXT_CMD(STA_REC_UPDATE), true);
2389 int mt7915_mcu_add_sta_adv(struct mt7915_dev *dev, struct ieee80211_vif *vif,
2390 struct ieee80211_sta *sta, bool enable)
2397 /* must keep the order */
2398 ret = mt7915_mcu_add_txbf(dev, vif, sta, enable);
2402 ret = mt7915_mcu_add_mu(dev, vif, sta);
2406 return mt7915_mcu_add_rate_ctrl(dev, vif, sta);
2409 int mt7915_mcu_add_sta(struct mt7915_dev *dev, struct ieee80211_vif *vif,
2410 struct ieee80211_sta *sta, bool enable)
2412 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
2413 struct wtbl_req_hdr *wtbl_hdr;
2414 struct mt7915_sta *msta;
2415 struct tlv *sta_wtbl;
2416 struct sk_buff *skb;
2418 msta = sta ? (struct mt7915_sta *)sta->drv_priv : &mvif->sta;
2420 skb = mt7915_mcu_alloc_sta_req(dev, mvif, msta,
2421 MT7915_STA_UPDATE_MAX_SIZE);
2423 return PTR_ERR(skb);
2425 mt7915_mcu_sta_basic_tlv(skb, vif, sta, enable);
2427 mt7915_mcu_sta_tlv(dev, skb, sta, vif);
2429 sta_wtbl = mt7915_mcu_add_tlv(skb, STA_REC_WTBL, sizeof(struct tlv));
2431 wtbl_hdr = mt7915_mcu_alloc_wtbl_req(dev, msta, WTBL_RESET_AND_SET,
2433 if (IS_ERR(wtbl_hdr))
2434 return PTR_ERR(wtbl_hdr);
2437 mt7915_mcu_wtbl_generic_tlv(skb, vif, sta, sta_wtbl, wtbl_hdr);
2438 mt7915_mcu_wtbl_hdr_trans_tlv(skb, vif, sta, sta_wtbl, wtbl_hdr);
2440 mt7915_mcu_wtbl_ht_tlv(skb, sta, sta_wtbl, wtbl_hdr);
2443 return mt76_mcu_skb_send_msg(&dev->mt76, skb,
2444 MCU_EXT_CMD(STA_REC_UPDATE), true);
2447 int mt7915_mcu_set_fixed_rate(struct mt7915_dev *dev,
2448 struct ieee80211_sta *sta, u32 rate)
2450 struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
2451 struct mt7915_vif *mvif = msta->vif;
2452 struct sta_rec_ra_fixed *ra;
2453 struct sk_buff *skb;
2455 int len = sizeof(struct sta_req_hdr) + sizeof(*ra);
2457 skb = mt7915_mcu_alloc_sta_req(dev, mvif, msta, len);
2459 return PTR_ERR(skb);
2461 tlv = mt7915_mcu_add_tlv(skb, STA_REC_RA_UPDATE, sizeof(*ra));
2462 ra = (struct sta_rec_ra_fixed *)tlv;
2465 ra->field = cpu_to_le32(RATE_PARAM_AUTO);
2468 ra->field = cpu_to_le32(RATE_PARAM_FIXED);
2471 ra->phy.type = FIELD_GET(RATE_CFG_PHY_TYPE, rate);
2472 ra->phy.bw = FIELD_GET(RATE_CFG_BW, rate);
2473 ra->phy.nss = FIELD_GET(RATE_CFG_NSS, rate);
2474 ra->phy.mcs = FIELD_GET(RATE_CFG_MCS, rate);
2475 ra->phy.stbc = FIELD_GET(RATE_CFG_STBC, rate);
2480 ra->phy.ldpc = FIELD_GET(RATE_CFG_LDPC, rate) * 7;
2482 /* HT/VHT - SGI: 1, LGI: 0; HE - SGI: 0, MGI: 1, LGI: 2 */
2483 if (ra->phy.type > MT_PHY_TYPE_VHT)
2484 ra->phy.sgi = ra->phy.mcs * 85;
2486 ra->phy.sgi = ra->phy.mcs * 15;
2489 return mt76_mcu_skb_send_msg(&dev->mt76, skb,
2490 MCU_EXT_CMD(STA_REC_UPDATE), true);
2493 int mt7915_mcu_add_dev_info(struct mt7915_phy *phy,
2494 struct ieee80211_vif *vif, bool enable)
2496 struct mt7915_dev *dev = phy->dev;
2497 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
2511 u8 omac_addr[ETH_ALEN];
2515 .omac_idx = mvif->omac_idx,
2516 .dbdc_idx = mvif->band_idx,
2517 .tlv_num = cpu_to_le16(1),
2521 .tag = cpu_to_le16(DEV_INFO_ACTIVE),
2522 .len = cpu_to_le16(sizeof(struct req_tlv)),
2524 .dbdc_idx = mvif->band_idx,
2528 if (mvif->omac_idx >= REPEATER_BSSID_START)
2529 return mt7915_mcu_muar_config(phy, vif, false, enable);
2531 memcpy(data.tlv.omac_addr, vif->addr, ETH_ALEN);
2532 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(DEV_INFO_UPDATE),
2533 &data, sizeof(data), true);
2537 mt7915_mcu_beacon_csa(struct sk_buff *rskb, struct sk_buff *skb,
2538 struct bss_info_bcn *bcn,
2539 struct ieee80211_mutable_offsets *offs)
2541 if (offs->cntdwn_counter_offs[0]) {
2543 struct bss_info_bcn_csa *csa;
2545 tlv = mt7915_mcu_add_nested_subtlv(rskb, BSS_INFO_BCN_CSA,
2546 sizeof(*csa), &bcn->sub_ntlv,
2548 csa = (struct bss_info_bcn_csa *)tlv;
2549 csa->cnt = skb->data[offs->cntdwn_counter_offs[0]];
2554 mt7915_mcu_beacon_cont(struct mt7915_dev *dev, struct sk_buff *rskb,
2555 struct sk_buff *skb, struct bss_info_bcn *bcn,
2556 struct ieee80211_mutable_offsets *offs)
2558 struct mt76_wcid *wcid = &dev->mt76.global_wcid;
2559 struct bss_info_bcn_cont *cont;
2562 int len = sizeof(*cont) + MT_TXD_SIZE + skb->len;
2564 tlv = mt7915_mcu_add_nested_subtlv(rskb, BSS_INFO_BCN_CONTENT,
2565 len, &bcn->sub_ntlv, &bcn->len);
2567 cont = (struct bss_info_bcn_cont *)tlv;
2568 cont->pkt_len = cpu_to_le16(MT_TXD_SIZE + skb->len);
2569 cont->tim_ofs = cpu_to_le16(offs->tim_offset);
2571 if (offs->cntdwn_counter_offs[0])
2572 cont->csa_ofs = cpu_to_le16(offs->cntdwn_counter_offs[0] - 4);
2574 buf = (u8 *)tlv + sizeof(*cont);
2575 mt7915_mac_write_txwi(dev, (__le32 *)buf, skb, wcid, 0, NULL,
2577 memcpy(buf + MT_TXD_SIZE, skb->data, skb->len);
2580 int mt7915_mcu_add_beacon(struct ieee80211_hw *hw,
2581 struct ieee80211_vif *vif, int en)
2583 #define MAX_BEACON_SIZE 512
2584 struct mt7915_dev *dev = mt7915_hw_dev(hw);
2585 struct mt7915_phy *phy = mt7915_hw_phy(hw);
2586 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
2587 struct ieee80211_mutable_offsets offs;
2588 struct ieee80211_tx_info *info;
2589 struct sk_buff *skb, *rskb;
2591 struct bss_info_bcn *bcn;
2592 int len = MT7915_BEACON_UPDATE_SIZE + MAX_BEACON_SIZE;
2594 rskb = mt7915_mcu_alloc_sta_req(dev, mvif, NULL, len);
2596 return PTR_ERR(rskb);
2598 tlv = mt7915_mcu_add_tlv(rskb, BSS_INFO_OFFLOAD, sizeof(*bcn));
2599 bcn = (struct bss_info_bcn *)tlv;
2605 skb = ieee80211_beacon_get_template(hw, vif, &offs);
2609 if (skb->len > MAX_BEACON_SIZE - MT_TXD_SIZE) {
2610 dev_err(dev->mt76.dev, "Bcn size limit exceed\n");
2615 if (mvif->band_idx) {
2616 info = IEEE80211_SKB_CB(skb);
2617 info->hw_queue |= MT_TX_HW_QUEUE_EXT_PHY;
2620 /* TODO: subtag - bss color count & 11v MBSSID */
2621 mt7915_mcu_beacon_csa(rskb, skb, bcn, &offs);
2622 mt7915_mcu_beacon_cont(dev, rskb, skb, bcn, &offs);
2626 return mt76_mcu_skb_send_msg(&phy->dev->mt76, rskb,
2627 MCU_EXT_CMD(BSS_INFO_UPDATE), true);
2630 static int mt7915_mcu_start_firmware(struct mt7915_dev *dev, u32 addr,
2637 .option = cpu_to_le32(option),
2638 .addr = cpu_to_le32(addr),
2641 return mt76_mcu_send_msg(&dev->mt76, MCU_CMD(FW_START_REQ), &req,
2645 static int mt7915_mcu_restart(struct mt76_dev *dev)
2654 return mt76_mcu_send_msg(dev, MCU_CMD(NIC_POWER_CTRL), &req,
2655 sizeof(req), false);
2658 static int mt7915_mcu_patch_sem_ctrl(struct mt7915_dev *dev, bool get)
2663 .op = cpu_to_le32(get ? PATCH_SEM_GET : PATCH_SEM_RELEASE),
2666 return mt76_mcu_send_msg(&dev->mt76, MCU_CMD(PATCH_SEM_CONTROL), &req,
2670 static int mt7915_mcu_start_patch(struct mt7915_dev *dev)
2679 return mt76_mcu_send_msg(&dev->mt76, MCU_CMD(PATCH_FINISH_REQ), &req,
2683 static int mt7915_driver_own(struct mt7915_dev *dev)
2685 mt76_wr(dev, MT_TOP_LPCR_HOST_BAND0, MT_TOP_LPCR_HOST_DRV_OWN);
2686 if (!mt76_poll_msec(dev, MT_TOP_LPCR_HOST_BAND0,
2687 MT_TOP_LPCR_HOST_FW_OWN, 0, 500)) {
2688 dev_err(dev->mt76.dev, "Timeout for driver own\n");
2695 static int mt7915_mcu_init_download(struct mt7915_dev *dev, u32 addr,
2703 .addr = cpu_to_le32(addr),
2704 .len = cpu_to_le32(len),
2705 .mode = cpu_to_le32(mode),
2709 if (req.addr == cpu_to_le32(MCU_PATCH_ADDRESS))
2710 attr = MCU_CMD(PATCH_START_REQ);
2712 attr = MCU_CMD(TARGET_ADDRESS_LEN_REQ);
2714 return mt76_mcu_send_msg(&dev->mt76, attr, &req, sizeof(req), true);
2717 static int mt7915_load_patch(struct mt7915_dev *dev)
2719 const struct mt7915_patch_hdr *hdr;
2720 const struct firmware *fw = NULL;
2723 sem = mt7915_mcu_patch_sem_ctrl(dev, 1);
2727 case PATCH_NOT_DL_SEM_SUCCESS:
2730 dev_err(dev->mt76.dev, "Failed to get patch semaphore\n");
2734 ret = request_firmware(&fw, MT7915_ROM_PATCH, dev->mt76.dev);
2738 if (!fw || !fw->data || fw->size < sizeof(*hdr)) {
2739 dev_err(dev->mt76.dev, "Invalid firmware\n");
2744 hdr = (const struct mt7915_patch_hdr *)(fw->data);
2746 dev_info(dev->mt76.dev, "HW/SW Version: 0x%x, Build Time: %.16s\n",
2747 be32_to_cpu(hdr->hw_sw_ver), hdr->build_date);
2749 for (i = 0; i < be32_to_cpu(hdr->desc.n_region); i++) {
2750 struct mt7915_patch_sec *sec;
2754 sec = (struct mt7915_patch_sec *)(fw->data + sizeof(*hdr) +
2756 if ((be32_to_cpu(sec->type) & PATCH_SEC_TYPE_MASK) !=
2757 PATCH_SEC_TYPE_INFO) {
2762 addr = be32_to_cpu(sec->info.addr);
2763 len = be32_to_cpu(sec->info.len);
2764 dl = fw->data + be32_to_cpu(sec->offs);
2766 ret = mt7915_mcu_init_download(dev, addr, len,
2769 dev_err(dev->mt76.dev, "Download request failed\n");
2773 ret = mt76_mcu_send_firmware(&dev->mt76, MCU_CMD(FW_SCATTER),
2776 dev_err(dev->mt76.dev, "Failed to send patch\n");
2781 ret = mt7915_mcu_start_patch(dev);
2783 dev_err(dev->mt76.dev, "Failed to start patch\n");
2786 sem = mt7915_mcu_patch_sem_ctrl(dev, 0);
2788 case PATCH_REL_SEM_SUCCESS:
2792 dev_err(dev->mt76.dev, "Failed to release patch semaphore\n");
2795 release_firmware(fw);
2800 static u32 mt7915_mcu_gen_dl_mode(u8 feature_set, bool is_wa)
2804 ret |= (feature_set & FW_FEATURE_SET_ENCRYPT) ?
2805 (DL_MODE_ENCRYPT | DL_MODE_RESET_SEC_IV) : 0;
2806 ret |= FIELD_PREP(DL_MODE_KEY_IDX,
2807 FIELD_GET(FW_FEATURE_SET_KEY_IDX, feature_set));
2808 ret |= DL_MODE_NEED_RSP;
2809 ret |= is_wa ? DL_MODE_WORKING_PDA_CR4 : 0;
2815 mt7915_mcu_send_ram_firmware(struct mt7915_dev *dev,
2816 const struct mt7915_fw_trailer *hdr,
2817 const u8 *data, bool is_wa)
2820 u32 override = 0, option = 0;
2822 for (i = 0; i < hdr->n_region; i++) {
2823 const struct mt7915_fw_region *region;
2825 u32 len, addr, mode;
2827 region = (const struct mt7915_fw_region *)((const u8 *)hdr -
2828 (hdr->n_region - i) * sizeof(*region));
2829 mode = mt7915_mcu_gen_dl_mode(region->feature_set, is_wa);
2830 len = le32_to_cpu(region->len);
2831 addr = le32_to_cpu(region->addr);
2833 if (region->feature_set & FW_FEATURE_OVERRIDE_ADDR)
2836 err = mt7915_mcu_init_download(dev, addr, len, mode);
2838 dev_err(dev->mt76.dev, "Download request failed\n");
2842 err = mt76_mcu_send_firmware(&dev->mt76, MCU_CMD(FW_SCATTER),
2843 data + offset, len);
2845 dev_err(dev->mt76.dev, "Failed to send firmware.\n");
2853 option |= FW_START_OVERRIDE;
2856 option |= FW_START_WORKING_PDA_CR4;
2858 return mt7915_mcu_start_firmware(dev, override, option);
2861 static int mt7915_load_ram(struct mt7915_dev *dev)
2863 const struct mt7915_fw_trailer *hdr;
2864 const struct firmware *fw;
2867 ret = request_firmware(&fw, MT7915_FIRMWARE_WM, dev->mt76.dev);
2871 if (!fw || !fw->data || fw->size < sizeof(*hdr)) {
2872 dev_err(dev->mt76.dev, "Invalid firmware\n");
2877 hdr = (const struct mt7915_fw_trailer *)(fw->data + fw->size -
2880 dev_info(dev->mt76.dev, "WM Firmware Version: %.10s, Build Time: %.15s\n",
2881 hdr->fw_ver, hdr->build_date);
2883 ret = mt7915_mcu_send_ram_firmware(dev, hdr, fw->data, false);
2885 dev_err(dev->mt76.dev, "Failed to start WM firmware\n");
2889 release_firmware(fw);
2891 ret = request_firmware(&fw, MT7915_FIRMWARE_WA, dev->mt76.dev);
2895 if (!fw || !fw->data || fw->size < sizeof(*hdr)) {
2896 dev_err(dev->mt76.dev, "Invalid firmware\n");
2901 hdr = (const struct mt7915_fw_trailer *)(fw->data + fw->size -
2904 dev_info(dev->mt76.dev, "WA Firmware Version: %.10s, Build Time: %.15s\n",
2905 hdr->fw_ver, hdr->build_date);
2907 ret = mt7915_mcu_send_ram_firmware(dev, hdr, fw->data, true);
2909 dev_err(dev->mt76.dev, "Failed to start WA firmware\n");
2913 snprintf(dev->mt76.hw->wiphy->fw_version,
2914 sizeof(dev->mt76.hw->wiphy->fw_version),
2915 "%.10s-%.15s", hdr->fw_ver, hdr->build_date);
2918 release_firmware(fw);
2923 static int mt7915_load_firmware(struct mt7915_dev *dev)
2927 ret = mt7915_load_patch(dev);
2931 ret = mt7915_load_ram(dev);
2935 if (!mt76_poll_msec(dev, MT_TOP_MISC, MT_TOP_MISC_FW_STATE,
2936 FIELD_PREP(MT_TOP_MISC_FW_STATE,
2937 FW_STATE_WACPU_RDY), 1000)) {
2938 dev_err(dev->mt76.dev, "Timeout for initializing firmware\n");
2942 mt76_queue_tx_cleanup(dev, dev->mt76.q_mcu[MT_MCUQ_FWDL], false);
2944 dev_dbg(dev->mt76.dev, "Firmware init done\n");
2949 int mt7915_mcu_fw_log_2_host(struct mt7915_dev *dev, u8 ctrl)
2958 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(FW_LOG_2_HOST), &data,
2959 sizeof(data), true);
2962 int mt7915_mcu_fw_dbg_ctrl(struct mt7915_dev *dev, u32 module, u8 level)
2972 .module_idx = cpu_to_le32(module),
2976 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(FW_DBG_CTRL), &data,
2977 sizeof(data), false);
2980 static int mt7915_mcu_set_mwds(struct mt7915_dev *dev, bool enabled)
2989 return mt76_mcu_send_msg(&dev->mt76, MCU_WA_EXT_CMD(MWDS_SUPPORT), &req,
2990 sizeof(req), false);
2993 int mt7915_mcu_init(struct mt7915_dev *dev)
2995 static const struct mt76_mcu_ops mt7915_mcu_ops = {
2996 .headroom = sizeof(struct mt7915_mcu_txd),
2997 .mcu_skb_send_msg = mt7915_mcu_send_message,
2998 .mcu_parse_response = mt7915_mcu_parse_response,
2999 .mcu_restart = mt7915_mcu_restart,
3003 dev->mt76.mcu_ops = &mt7915_mcu_ops;
3005 ret = mt7915_driver_own(dev);
3009 ret = mt7915_load_firmware(dev);
3013 set_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state);
3014 mt7915_mcu_fw_log_2_host(dev, 0);
3015 mt7915_mcu_set_mwds(dev, 1);
3016 mt7915_mcu_wa_cmd(dev, MCU_WA_PARAM_CMD(SET), MCU_WA_PARAM_RED, 0, 0);
3021 void mt7915_mcu_exit(struct mt7915_dev *dev)
3023 __mt76_mcu_restart(&dev->mt76);
3024 if (!mt76_poll_msec(dev, MT_TOP_MISC, MT_TOP_MISC_FW_STATE,
3025 FIELD_PREP(MT_TOP_MISC_FW_STATE,
3026 FW_STATE_FW_DOWNLOAD), 1000)) {
3027 dev_err(dev->mt76.dev, "Failed to exit mcu\n");
3031 mt76_wr(dev, MT_TOP_LPCR_HOST_BAND0, MT_TOP_LPCR_HOST_FW_OWN);
3032 skb_queue_purge(&dev->mt76.mcu.res_q);
3036 mt7915_mcu_set_rx_hdr_trans_blacklist(struct mt7915_dev *dev, int band)
3049 .etype = cpu_to_le16(ETH_P_PAE),
3052 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(RX_HDR_TRANS),
3053 &req, sizeof(req), false);
3056 int mt7915_mcu_set_mac(struct mt7915_dev *dev, int band,
3057 bool enable, bool hdr_trans)
3068 } __packed req_trans = {
3069 .enable = hdr_trans,
3075 } __packed req_mac = {
3081 ret = mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(RX_HDR_TRANS),
3082 &req_trans, sizeof(req_trans), false);
3087 mt7915_mcu_set_rx_hdr_trans_blacklist(dev, band);
3089 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(MAC_INIT_CTRL),
3090 &req_mac, sizeof(req_mac), true);
3093 int mt7915_mcu_set_scs(struct mt7915_dev *dev, u8 band, bool enable)
3100 .cmd = cpu_to_le32(SCS_ENABLE),
3102 .enable = enable + 1,
3105 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SCS_CTRL), &req,
3106 sizeof(req), false);
3109 int mt7915_mcu_set_rts_thresh(struct mt7915_phy *phy, u32 val)
3111 struct mt7915_dev *dev = phy->dev;
3120 .band = phy != &dev->phy,
3121 .len_thresh = cpu_to_le32(val),
3122 .pkt_thresh = cpu_to_le32(0x2),
3125 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(PROTECT_CTRL), &req,
3129 int mt7915_mcu_update_edca(struct mt7915_dev *dev, void *param)
3131 struct mt7915_mcu_tx *req = (struct mt7915_mcu_tx *)param;
3132 u8 num = req->total;
3133 size_t len = sizeof(*req) -
3134 (IEEE80211_NUM_ACS - num) * sizeof(struct edca);
3136 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(EDCA_UPDATE), req,
3140 int mt7915_mcu_set_tx(struct mt7915_dev *dev, struct ieee80211_vif *vif)
3142 #define TX_CMD_MODE 1
3143 struct mt7915_mcu_tx req = {
3145 .mode = TX_CMD_MODE,
3146 .total = IEEE80211_NUM_ACS,
3148 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
3151 for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
3152 struct ieee80211_tx_queue_params *q = &mvif->queue_params[ac];
3153 struct edca *e = &req.edca[ac];
3155 e->set = WMM_PARAM_SET;
3156 e->queue = ac + mvif->wmm_idx * MT7915_MAX_WMM_SETS;
3158 e->txop = cpu_to_le16(q->txop);
3161 e->cw_min = fls(q->cw_min);
3166 e->cw_max = cpu_to_le16(fls(q->cw_max));
3168 e->cw_max = cpu_to_le16(10);
3171 return mt7915_mcu_update_edca(dev, &req);
3174 int mt7915_mcu_set_pm(struct mt7915_dev *dev, int band, int enter)
3176 #define ENTER_PM_STATE 1
3177 #define EXIT_PM_STATE 2
3184 __le16 bcn_interval;
3197 .pm_state = (enter) ? ENTER_PM_STATE : EXIT_PM_STATE,
3201 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(PM_STATE_CTRL), &req,
3205 int mt7915_mcu_rdd_cmd(struct mt7915_dev *dev,
3206 enum mt7915_rdd_cmd cmd, u8 index,
3218 .rdd_rx_sel = rx_sel,
3222 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_RDD_CTRL), &req,
3226 int mt7915_mcu_set_fcc5_lpn(struct mt7915_dev *dev, int val)
3233 .tag = cpu_to_le32(0x1),
3234 .min_lpn = cpu_to_le16(val),
3237 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_RDD_TH), &req,
3241 int mt7915_mcu_set_pulse_th(struct mt7915_dev *dev,
3242 const struct mt7915_dfs_pulse *pulse)
3247 __le32 max_width; /* us */
3248 __le32 max_pwr; /* dbm */
3249 __le32 min_pwr; /* dbm */
3250 __le32 min_stgr_pri; /* us */
3251 __le32 max_stgr_pri; /* us */
3252 __le32 min_cr_pri; /* us */
3253 __le32 max_cr_pri; /* us */
3255 .tag = cpu_to_le32(0x3),
3257 #define __req_field(field) .field = cpu_to_le32(pulse->field)
3258 __req_field(max_width),
3259 __req_field(max_pwr),
3260 __req_field(min_pwr),
3261 __req_field(min_stgr_pri),
3262 __req_field(max_stgr_pri),
3263 __req_field(min_cr_pri),
3264 __req_field(max_cr_pri),
3268 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_RDD_TH), &req,
3272 int mt7915_mcu_set_radar_th(struct mt7915_dev *dev, int index,
3273 const struct mt7915_dfs_pattern *pattern)
3294 __le32 min_stgpr_diff;
3296 .tag = cpu_to_le32(0x2),
3297 .radar_type = cpu_to_le16(index),
3299 #define __req_field_u8(field) .field = pattern->field
3300 #define __req_field_u32(field) .field = cpu_to_le32(pattern->field)
3301 __req_field_u8(enb),
3302 __req_field_u8(stgr),
3303 __req_field_u8(min_crpn),
3304 __req_field_u8(max_crpn),
3305 __req_field_u8(min_crpr),
3306 __req_field_u8(min_pw),
3307 __req_field_u32(min_pri),
3308 __req_field_u32(max_pri),
3309 __req_field_u8(max_pw),
3310 __req_field_u8(min_crbn),
3311 __req_field_u8(max_crbn),
3312 __req_field_u8(min_stgpn),
3313 __req_field_u8(max_stgpn),
3314 __req_field_u8(min_stgpr),
3315 __req_field_u32(min_stgpr_diff),
3316 #undef __req_field_u8
3317 #undef __req_field_u32
3320 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_RDD_TH), &req,
3324 int mt7915_mcu_set_chan_info(struct mt7915_phy *phy, int cmd)
3326 struct mt7915_dev *dev = phy->dev;
3327 struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
3328 int freq1 = chandef->center_freq1;
3329 bool ext_phy = phy != &dev->phy;
3335 u8 rx_streams; /* mask or num */
3338 u8 center_ch2; /* for 80+80 only */
3342 __le32 outband_freq;
3348 .control_ch = chandef->chan->hw_value,
3349 .center_ch = ieee80211_frequency_to_channel(freq1),
3350 .bw = mt7915_mcu_chan_bw(chandef),
3351 .tx_streams_num = hweight8(phy->mt76->antenna_mask),
3352 .rx_streams = phy->mt76->antenna_mask,
3353 .band_idx = ext_phy,
3354 .channel_band = chandef->chan->band,
3357 #ifdef CONFIG_NL80211_TESTMODE
3358 if (phy->mt76->test.tx_antenna_mask &&
3359 (phy->mt76->test.state == MT76_TM_STATE_TX_FRAMES ||
3360 phy->mt76->test.state == MT76_TM_STATE_RX_FRAMES ||
3361 phy->mt76->test.state == MT76_TM_STATE_TX_CONT)) {
3362 req.tx_streams_num = fls(phy->mt76->test.tx_antenna_mask);
3363 req.rx_streams = phy->mt76->test.tx_antenna_mask;
3366 req.tx_streams_num = 2;
3367 req.rx_streams >>= 2;
3372 if (phy->mt76->hw->conf.flags & IEEE80211_CONF_OFFCHANNEL)
3373 req.switch_reason = CH_SWITCH_SCAN_BYPASS_DPD;
3374 else if ((chandef->chan->flags & IEEE80211_CHAN_RADAR) &&
3375 chandef->chan->dfs_state != NL80211_DFS_AVAILABLE)
3376 req.switch_reason = CH_SWITCH_DFS;
3378 req.switch_reason = CH_SWITCH_NORMAL;
3380 if (cmd == MCU_EXT_CMD(CHANNEL_SWITCH))
3381 req.rx_streams = hweight8(req.rx_streams);
3383 if (chandef->width == NL80211_CHAN_WIDTH_80P80) {
3384 int freq2 = chandef->center_freq2;
3386 req.center_ch2 = ieee80211_frequency_to_channel(freq2);
3389 return mt76_mcu_send_msg(&dev->mt76, cmd, &req, sizeof(req), true);
3392 static int mt7915_mcu_set_eeprom_flash(struct mt7915_dev *dev)
3394 #define TOTAL_PAGE_MASK GENMASK(7, 5)
3395 #define PAGE_IDX_MASK GENMASK(4, 2)
3396 #define PER_PAGE_SIZE 0x400
3397 struct mt7915_mcu_eeprom req = { .buffer_mode = EE_MODE_BUFFER };
3398 u8 total = MT7915_EEPROM_SIZE / PER_PAGE_SIZE;
3399 u8 *eep = (u8 *)dev->mt76.eeprom.data;
3403 for (i = 0; i <= total; i++, eep += eep_len) {
3404 struct sk_buff *skb;
3408 eep_len = MT7915_EEPROM_SIZE % PER_PAGE_SIZE;
3410 eep_len = PER_PAGE_SIZE;
3412 skb = mt76_mcu_msg_alloc(&dev->mt76, NULL,
3413 sizeof(req) + eep_len);
3417 req.format = FIELD_PREP(TOTAL_PAGE_MASK, total) |
3418 FIELD_PREP(PAGE_IDX_MASK, i) | EE_FORMAT_WHOLE;
3419 req.len = cpu_to_le16(eep_len);
3421 skb_put_data(skb, &req, sizeof(req));
3422 skb_put_data(skb, eep, eep_len);
3424 ret = mt76_mcu_skb_send_msg(&dev->mt76, skb,
3425 MCU_EXT_CMD(EFUSE_BUFFER_MODE), true);
3433 int mt7915_mcu_set_eeprom(struct mt7915_dev *dev)
3435 struct mt7915_mcu_eeprom req = {
3436 .buffer_mode = EE_MODE_EFUSE,
3437 .format = EE_FORMAT_WHOLE,
3440 if (dev->flash_mode)
3441 return mt7915_mcu_set_eeprom_flash(dev);
3443 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(EFUSE_BUFFER_MODE),
3444 &req, sizeof(req), true);
3447 int mt7915_mcu_get_eeprom(struct mt7915_dev *dev, u32 offset)
3449 struct mt7915_mcu_eeprom_info req = {
3450 .addr = cpu_to_le32(round_down(offset,
3451 MT7915_EEPROM_BLOCK_SIZE)),
3453 struct mt7915_mcu_eeprom_info *res;
3454 struct sk_buff *skb;
3458 ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_EXT_QUERY(EFUSE_ACCESS), &req,
3459 sizeof(req), true, &skb);
3463 res = (struct mt7915_mcu_eeprom_info *)skb->data;
3464 buf = dev->mt76.eeprom.data + le32_to_cpu(res->addr);
3465 memcpy(buf, res->data, MT7915_EEPROM_BLOCK_SIZE);
3471 static int mt7915_mcu_set_pre_cal(struct mt7915_dev *dev, u8 idx,
3472 u8 *data, u32 len, int cmd)
3485 struct sk_buff *skb;
3487 skb = mt76_mcu_msg_alloc(&dev->mt76, NULL, sizeof(req) + len);
3492 req.len = cpu_to_le32(len);
3493 skb_put_data(skb, &req, sizeof(req));
3494 skb_put_data(skb, data, len);
3496 return mt76_mcu_skb_send_msg(&dev->mt76, skb, cmd, false);
3499 int mt7915_mcu_apply_group_cal(struct mt7915_dev *dev)
3501 u8 idx = 0, *cal = dev->cal, *eep = dev->mt76.eeprom.data;
3502 u32 total = MT_EE_CAL_GROUP_SIZE;
3504 if (!(eep[MT_EE_DO_PRE_CAL] & MT_EE_WIFI_CAL_GROUP))
3508 * Items: Rx DCOC, RSSI DCOC, Tx TSSI DCOC, Tx LPFG
3509 * Tx FDIQ, Tx DCIQ, Rx FDIQ, Rx FIIQ, ADCDCOC
3514 len = min_t(u32, total, MT_EE_CAL_UNIT);
3516 ret = mt7915_mcu_set_pre_cal(dev, idx, cal, len,
3517 MCU_EXT_CMD(GROUP_PRE_CAL_INFO));
3529 static int mt7915_find_freq_idx(const u16 *freqs, int n_freqs, u16 cur)
3533 for (i = 0; i < n_freqs; i++)
3534 if (cur == freqs[i])
3540 static int mt7915_dpd_freq_idx(u16 freq, u8 bw)
3542 static const u16 freq_list[] = {
3543 5180, 5200, 5220, 5240,
3544 5260, 5280, 5300, 5320,
3545 5500, 5520, 5540, 5560,
3546 5580, 5600, 5620, 5640,
3547 5660, 5680, 5700, 5745,
3548 5765, 5785, 5805, 5825
3550 int offset_2g = ARRAY_SIZE(freq_list);
3557 return offset_2g + 1;
3559 return offset_2g + 2;
3562 if (bw == NL80211_CHAN_WIDTH_80P80 || bw == NL80211_CHAN_WIDTH_160)
3565 if (bw != NL80211_CHAN_WIDTH_20) {
3566 idx = mt7915_find_freq_idx(freq_list, ARRAY_SIZE(freq_list),
3571 idx = mt7915_find_freq_idx(freq_list, ARRAY_SIZE(freq_list),
3577 return mt7915_find_freq_idx(freq_list, ARRAY_SIZE(freq_list), freq);
3580 int mt7915_mcu_apply_tx_dpd(struct mt7915_phy *phy)
3582 struct mt7915_dev *dev = phy->dev;
3583 struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
3584 u16 total = 2, center_freq = chandef->center_freq1;
3585 u8 *cal = dev->cal, *eep = dev->mt76.eeprom.data;
3588 if (!(eep[MT_EE_DO_PRE_CAL] & MT_EE_WIFI_CAL_DPD))
3591 idx = mt7915_dpd_freq_idx(center_freq, chandef->width);
3595 /* Items: Tx DPD, Tx Flatness */
3597 cal += MT_EE_CAL_GROUP_SIZE;
3602 cal += (idx * MT_EE_CAL_UNIT);
3603 ret = mt7915_mcu_set_pre_cal(dev, idx, cal, MT_EE_CAL_UNIT,
3604 MCU_EXT_CMD(DPD_PRE_CAL_INFO));
3614 int mt7915_mcu_get_chan_mib_info(struct mt7915_phy *phy, bool chan_switch)
3617 static const enum mt7915_chan_mib_offs offs[] = {
3618 MIB_BUSY_TIME, MIB_TX_TIME, MIB_RX_TIME, MIB_OBSS_AIRTIME
3620 struct mt76_channel_state *state = phy->mt76->chan_state;
3621 struct mt76_channel_state *state_ts = &phy->state_ts;
3622 struct mt7915_dev *dev = phy->dev;
3623 struct mt7915_mcu_mib *res, req[4];
3624 struct sk_buff *skb;
3627 for (i = 0; i < 4; i++) {
3628 req[i].band = cpu_to_le32(phy != &dev->phy);
3629 req[i].offs = cpu_to_le32(offs[i]);
3632 ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_EXT_CMD(GET_MIB_INFO),
3633 req, sizeof(req), true, &skb);
3637 res = (struct mt7915_mcu_mib *)(skb->data + 20);
3642 #define __res_u64(s) le64_to_cpu(res[s].data)
3643 state->cc_busy += __res_u64(0) - state_ts->cc_busy;
3644 state->cc_tx += __res_u64(1) - state_ts->cc_tx;
3645 state->cc_bss_rx += __res_u64(2) - state_ts->cc_bss_rx;
3646 state->cc_rx += __res_u64(2) + __res_u64(3) - state_ts->cc_rx;
3649 state_ts->cc_busy = __res_u64(0);
3650 state_ts->cc_tx = __res_u64(1);
3651 state_ts->cc_bss_rx = __res_u64(2);
3652 state_ts->cc_rx = __res_u64(2) + __res_u64(3);
3660 int mt7915_mcu_get_temperature(struct mt7915_phy *phy)
3662 struct mt7915_dev *dev = phy->dev;
3669 .ctrl_id = THERMAL_SENSOR_TEMP_QUERY,
3670 .dbdc_idx = phy != &dev->phy,
3673 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(THERMAL_CTRL), &req,
3677 int mt7915_mcu_set_thermal_throttling(struct mt7915_phy *phy, u8 state)
3679 struct mt7915_dev *dev = phy->dev;
3681 struct mt7915_mcu_thermal_ctrl ctrl;
3683 __le32 trigger_temp;
3684 __le32 restore_temp;
3685 __le16 sustain_time;
3689 .band_idx = phy != &dev->phy,
3694 #define TRIGGER_TEMPERATURE 122
3695 #define RESTORE_TEMPERATURE 116
3696 #define SUSTAIN_PERIOD 10
3699 req.ctrl.ctrl_id = THERMAL_PROTECT_DISABLE;
3703 /* set duty cycle and level */
3704 for (level = 0; level < 4; level++) {
3707 req.ctrl.ctrl_id = THERMAL_PROTECT_DUTY_CONFIG;
3708 req.ctrl.duty.duty_level = level;
3709 req.ctrl.duty.duty_cycle = state;
3710 state = state * 4 / 5;
3712 ret = mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(THERMAL_PROT),
3713 &req, sizeof(req.ctrl), false);
3718 /* currently use fixed values for throttling, and would be better
3719 * to implement thermal zone for dynamic trip in the long run.
3722 /* set high-temperature trigger threshold */
3723 req.ctrl.ctrl_id = THERMAL_PROTECT_ENABLE;
3724 req.trigger_temp = cpu_to_le32(TRIGGER_TEMPERATURE);
3725 req.restore_temp = cpu_to_le32(RESTORE_TEMPERATURE);
3726 req.sustain_time = cpu_to_le16(SUSTAIN_PERIOD);
3729 req.ctrl.type.protect_type = 1;
3730 req.ctrl.type.trigger_type = 1;
3732 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(THERMAL_PROT),
3733 &req, sizeof(req), false);
3736 int mt7915_mcu_get_tx_rate(struct mt7915_dev *dev, u32 cmd, u16 wlan_idx)
3745 .cmd = cpu_to_le32(cmd),
3746 .wlan_idx = cpu_to_le16(wlan_idx),
3747 .dump_group = cpu_to_le16(1),
3750 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(RATE_CTRL), &req,
3751 sizeof(req), false);
3754 int mt7915_mcu_set_txpower_sku(struct mt7915_phy *phy)
3756 struct mt7915_dev *dev = phy->dev;
3757 struct mt76_phy *mphy = phy->mt76;
3758 struct ieee80211_hw *hw = mphy->hw;
3759 struct mt7915_sku_val {
3763 s8 val[MT7915_SKU_RATE_NUM];
3766 .dbdc_idx = phy != &dev->phy,
3768 struct mt76_power_limits limits_array;
3769 s8 *la = (s8 *)&limits_array;
3770 int i, idx, n_chains = hweight8(mphy->antenna_mask);
3773 tx_power = hw->conf.power_level * 2 -
3774 mt76_tx_power_nss_delta(n_chains);
3776 tx_power = mt76_get_rate_power_limits(mphy, mphy->chandef.chan,
3777 &limits_array, tx_power);
3778 mphy->txpower_cur = tx_power;
3780 for (i = 0, idx = 0; i < ARRAY_SIZE(mt7915_sku_group_len); i++) {
3781 u8 mcs_num, len = mt7915_sku_group_len[i];
3784 if (i >= SKU_HT_BW20 && i <= SKU_VHT_BW160) {
3787 if (i == SKU_HT_BW20 || i == SKU_VHT_BW20)
3788 la = (s8 *)&limits_array + 12;
3793 for (j = 0; j < min_t(u8, mcs_num, len); j++)
3794 req.val[idx + j] = la[j];
3800 return mt76_mcu_send_msg(&dev->mt76,
3801 MCU_EXT_CMD(TX_POWER_FEATURE_CTRL), &req,
3805 int mt7915_mcu_get_txpower_sku(struct mt7915_phy *phy, s8 *txpower, int len)
3807 #define RATE_POWER_INFO 2
3808 struct mt7915_dev *dev = phy->dev;
3816 .category = RATE_POWER_INFO,
3817 .band = phy != &dev->phy,
3819 s8 res[MT7915_SKU_RATE_NUM][2];
3820 struct sk_buff *skb;
3823 ret = mt76_mcu_send_and_get_msg(&dev->mt76,
3824 MCU_EXT_CMD(TX_POWER_FEATURE_CTRL),
3825 &req, sizeof(req), true, &skb);
3829 memcpy(res, skb->data + 4, sizeof(res));
3830 for (i = 0; i < len; i++)
3831 txpower[i] = res[i][req.band];
3838 int mt7915_mcu_set_test_param(struct mt7915_dev *dev, u8 param, bool test_mode,
3851 .test_mode_en = test_mode,
3856 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(ATE_CTRL), &req,
3857 sizeof(req), false);
3860 int mt7915_mcu_set_sku_en(struct mt7915_phy *phy, bool enable)
3862 struct mt7915_dev *dev = phy->dev;
3870 .dbdc_idx = phy != &dev->phy,
3871 .sku_enable = enable,
3874 return mt76_mcu_send_msg(&dev->mt76,
3875 MCU_EXT_CMD(TX_POWER_FEATURE_CTRL), &req,
3879 int mt7915_mcu_set_ser(struct mt7915_dev *dev, u8 action, u8 set, u8 band)
3892 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_SER_TRIGGER),
3893 &req, sizeof(req), false);
3896 int mt7915_mcu_set_txbf(struct mt7915_dev *dev, u8 action)
3906 __le32 snd_period; /* ms */
3924 #define MT_BF_PROCESSING 4
3926 case MT_BF_SOUNDING_ON:
3927 req.snd.snd_mode = MT_BF_PROCESSING;
3929 case MT_BF_TYPE_UPDATE:
3930 req.type.ebf = true;
3931 req.type.ibf = dev->ibf;
3933 case MT_BF_MODULE_UPDATE:
3935 req.mod.bf_bitmap = GENMASK(1, 0);
3941 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(TXBF_ACTION), &req,
3945 int mt7915_mcu_add_obss_spr(struct mt7915_dev *dev, struct ieee80211_vif *vif,
3948 #define MT_SPR_ENABLE 1
3949 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
3956 u8 sta_idx; /* 256 sta */
3960 .action = MT_SPR_ENABLE,
3962 .band_idx = mvif->band_idx,
3963 .val = cpu_to_le32(enable),
3966 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_SPR), &req,
3970 int mt7915_mcu_get_rx_rate(struct mt7915_phy *phy, struct ieee80211_vif *vif,
3971 struct ieee80211_sta *sta, struct rate_info *rate)
3973 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
3974 struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
3975 struct mt7915_dev *dev = phy->dev;
3976 struct mt76_phy *mphy = phy->mt76;
3982 .category = MCU_PHY_STATE_CONTENTION_RX_RATE,
3983 .band = mvif->band_idx,
3984 .wcid = cpu_to_le16(msta->wcid.idx),
3986 struct ieee80211_supported_band *sband;
3987 struct mt7915_mcu_phy_rx_info *res;
3988 struct sk_buff *skb;
3992 ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_EXT_CMD(PHY_STAT_INFO),
3993 &req, sizeof(req), true, &skb);
3997 res = (struct mt7915_mcu_phy_rx_info *)skb->data;
3999 rate->mcs = res->rate;
4000 rate->nss = res->nsts + 1;
4002 switch (res->mode) {
4003 case MT_PHY_TYPE_CCK:
4006 case MT_PHY_TYPE_OFDM:
4007 if (mphy->chandef.chan->band == NL80211_BAND_5GHZ)
4008 sband = &mphy->sband_5g.sband;
4010 sband = &mphy->sband_2g.sband;
4012 rate->mcs = mt76_get_rate(&dev->mt76, sband, rate->mcs, cck);
4013 rate->legacy = sband->bitrates[rate->mcs].bitrate;
4015 case MT_PHY_TYPE_HT:
4016 case MT_PHY_TYPE_HT_GF:
4017 if (rate->mcs > 31) {
4022 rate->flags = RATE_INFO_FLAGS_MCS;
4024 rate->flags |= RATE_INFO_FLAGS_SHORT_GI;
4026 case MT_PHY_TYPE_VHT:
4027 if (rate->mcs > 9) {
4032 rate->flags = RATE_INFO_FLAGS_VHT_MCS;
4034 rate->flags |= RATE_INFO_FLAGS_SHORT_GI;
4036 case MT_PHY_TYPE_HE_SU:
4037 case MT_PHY_TYPE_HE_EXT_SU:
4038 case MT_PHY_TYPE_HE_TB:
4039 case MT_PHY_TYPE_HE_MU:
4040 if (res->gi > NL80211_RATE_INFO_HE_GI_3_2 || rate->mcs > 11) {
4044 rate->he_gi = res->gi;
4045 rate->flags = RATE_INFO_FLAGS_HE_MCS;
4053 case IEEE80211_STA_RX_BW_160:
4054 rate->bw = RATE_INFO_BW_160;
4056 case IEEE80211_STA_RX_BW_80:
4057 rate->bw = RATE_INFO_BW_80;
4059 case IEEE80211_STA_RX_BW_40:
4060 rate->bw = RATE_INFO_BW_40;
4063 rate->bw = RATE_INFO_BW_20;