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 fw_name(_dev, name, ...) ({ \
69 switch (mt76_chip(&(_dev)->mt76)) { \
71 _fw = MT7915_##name; \
74 _fw = MT7986_##name##__VA_ARGS__; \
77 _fw = MT7916_##name; \
83 #define fw_name_var(_dev, name) (mt7915_check_adie(dev, false) ? \
84 fw_name(_dev, name) : \
85 fw_name(_dev, name, _MT7975))
87 #define MCU_PATCH_ADDRESS 0x200000
89 #define HE_PHY(p, c) u8_get_bits(c, IEEE80211_HE_PHY_##p)
90 #define HE_MAC(m, c) u8_get_bits(c, IEEE80211_HE_MAC_##m)
93 mt7915_mcu_get_sta_nss(u16 mcs_map)
97 for (nss = 8; nss > 0; nss--) {
98 u8 nss_mcs = (mcs_map >> (2 * (nss - 1))) & 3;
100 if (nss_mcs != IEEE80211_VHT_MCS_NOT_SUPPORTED)
108 mt7915_mcu_set_sta_he_mcs(struct ieee80211_sta *sta, __le16 *he_mcs,
111 struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
112 struct mt7915_dev *dev = msta->vif->phy->dev;
113 enum nl80211_band band = msta->vif->phy->mt76->chandef.chan->band;
114 const u16 *mask = msta->vif->bitrate_mask.control[band].he_mcs;
115 int nss, max_nss = sta->rx_nss > 3 ? 4 : sta->rx_nss;
117 for (nss = 0; nss < max_nss; nss++) {
120 switch ((mcs_map >> (2 * nss)) & 0x3) {
121 case IEEE80211_HE_MCS_SUPPORT_0_11:
122 mcs = GENMASK(11, 0);
124 case IEEE80211_HE_MCS_SUPPORT_0_9:
127 case IEEE80211_HE_MCS_SUPPORT_0_7:
134 mcs = mcs ? fls(mcs & mask[nss]) - 1 : -1;
138 mcs = IEEE80211_HE_MCS_SUPPORT_0_7;
141 mcs = IEEE80211_HE_MCS_SUPPORT_0_9;
144 mcs = IEEE80211_HE_MCS_SUPPORT_0_11;
147 mcs = IEEE80211_HE_MCS_NOT_SUPPORTED;
150 mcs_map &= ~(0x3 << (nss * 2));
151 mcs_map |= mcs << (nss * 2);
153 /* only support 2ss on 160MHz for mt7915 */
154 if (is_mt7915(&dev->mt76) && nss > 1 &&
155 sta->bandwidth == IEEE80211_STA_RX_BW_160)
159 *he_mcs = cpu_to_le16(mcs_map);
163 mt7915_mcu_set_sta_vht_mcs(struct ieee80211_sta *sta, __le16 *vht_mcs,
166 struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
167 struct mt7915_dev *dev = msta->vif->phy->dev;
168 u16 mcs_map = le16_to_cpu(sta->vht_cap.vht_mcs.rx_mcs_map);
169 int nss, max_nss = sta->rx_nss > 3 ? 4 : sta->rx_nss;
172 for (nss = 0; nss < max_nss; nss++, mcs_map >>= 2) {
173 switch (mcs_map & 0x3) {
174 case IEEE80211_VHT_MCS_SUPPORT_0_9:
177 case IEEE80211_VHT_MCS_SUPPORT_0_8:
180 case IEEE80211_VHT_MCS_SUPPORT_0_7:
187 vht_mcs[nss] = cpu_to_le16(mcs & mask[nss]);
189 /* only support 2ss on 160MHz for mt7915 */
190 if (is_mt7915(&dev->mt76) && nss > 1 &&
191 sta->bandwidth == IEEE80211_STA_RX_BW_160)
197 mt7915_mcu_set_sta_ht_mcs(struct ieee80211_sta *sta, u8 *ht_mcs,
200 int nss, max_nss = sta->rx_nss > 3 ? 4 : sta->rx_nss;
202 for (nss = 0; nss < max_nss; nss++)
203 ht_mcs[nss] = sta->ht_cap.mcs.rx_mask[nss] & mask[nss];
207 mt7915_mcu_parse_response(struct mt76_dev *mdev, int cmd,
208 struct sk_buff *skb, int seq)
210 struct mt7915_mcu_rxd *rxd;
214 dev_err(mdev->dev, "Message %08x (seq %d) timeout\n",
219 rxd = (struct mt7915_mcu_rxd *)skb->data;
223 if (cmd == MCU_CMD(PATCH_SEM_CONTROL)) {
224 skb_pull(skb, sizeof(*rxd) - 4);
226 } else if (cmd == MCU_EXT_CMD(THERMAL_CTRL)) {
227 skb_pull(skb, sizeof(*rxd) + 4);
228 ret = le32_to_cpu(*(__le32 *)skb->data);
230 skb_pull(skb, sizeof(struct mt7915_mcu_rxd));
237 mt7915_mcu_send_message(struct mt76_dev *mdev, struct sk_buff *skb,
238 int cmd, int *wait_seq)
240 struct mt7915_dev *dev = container_of(mdev, struct mt7915_dev, mt76);
241 struct mt7915_mcu_txd *mcu_txd;
242 enum mt76_mcuq_id qid;
247 /* TODO: make dynamic based on msg type */
248 mdev->mcu.timeout = 20 * HZ;
250 seq = ++dev->mt76.mcu.msg_seq & 0xf;
252 seq = ++dev->mt76.mcu.msg_seq & 0xf;
254 if (cmd == MCU_CMD(FW_SCATTER)) {
259 mcu_txd = (struct mt7915_mcu_txd *)skb_push(skb, sizeof(*mcu_txd));
260 if (test_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state))
267 val = FIELD_PREP(MT_TXD0_TX_BYTES, skb->len) |
268 FIELD_PREP(MT_TXD0_PKT_FMT, MT_TX_TYPE_CMD) |
269 FIELD_PREP(MT_TXD0_Q_IDX, MT_TX_MCU_PORT_RX_Q0);
270 txd[0] = cpu_to_le32(val);
272 val = MT_TXD1_LONG_FORMAT |
273 FIELD_PREP(MT_TXD1_HDR_FORMAT, MT_HDR_FORMAT_CMD);
274 txd[1] = cpu_to_le32(val);
276 mcu_txd->len = cpu_to_le16(skb->len - sizeof(mcu_txd->txd));
277 mcu_txd->pq_id = cpu_to_le16(MCU_PQ_ID(MT_TX_PORT_IDX_MCU,
278 MT_TX_MCU_PORT_RX_Q0));
279 mcu_txd->pkt_type = MCU_PKT_ID;
282 mcu_txd->cid = FIELD_GET(__MCU_CMD_FIELD_ID, cmd);
283 mcu_txd->set_query = MCU_Q_NA;
284 mcu_txd->ext_cid = FIELD_GET(__MCU_CMD_FIELD_EXT_ID, cmd);
285 if (mcu_txd->ext_cid) {
286 mcu_txd->ext_cid_ack = 1;
288 /* do not use Q_SET for efuse */
289 if (cmd & __MCU_CMD_FIELD_QUERY)
290 mcu_txd->set_query = MCU_Q_QUERY;
292 mcu_txd->set_query = MCU_Q_SET;
295 if (cmd & __MCU_CMD_FIELD_WA)
296 mcu_txd->s2d_index = MCU_S2D_H2C;
298 mcu_txd->s2d_index = MCU_S2D_H2N;
304 return mt76_tx_queue_skb_raw(dev, mdev->q_mcu[qid], skb, 0);
307 int mt7915_mcu_wa_cmd(struct mt7915_dev *dev, int cmd, u32 a1, u32 a2, u32 a3)
319 return mt76_mcu_send_msg(&dev->mt76, cmd, &req, sizeof(req), false);
323 mt7915_mcu_csa_finish(void *priv, u8 *mac, struct ieee80211_vif *vif)
326 ieee80211_csa_finish(vif);
330 mt7915_mcu_rx_csa_notify(struct mt7915_dev *dev, struct sk_buff *skb)
332 struct mt76_phy *mphy = &dev->mt76.phy;
333 struct mt7915_mcu_csa_notify *c;
335 c = (struct mt7915_mcu_csa_notify *)skb->data;
337 if ((c->band_idx && !dev->phy.band_idx) && dev->mt76.phy2)
338 mphy = dev->mt76.phy2;
340 ieee80211_iterate_active_interfaces_atomic(mphy->hw,
341 IEEE80211_IFACE_ITER_RESUME_ALL,
342 mt7915_mcu_csa_finish, mphy->hw);
346 mt7915_mcu_rx_thermal_notify(struct mt7915_dev *dev, struct sk_buff *skb)
348 struct mt76_phy *mphy = &dev->mt76.phy;
349 struct mt7915_mcu_thermal_notify *t;
350 struct mt7915_phy *phy;
352 t = (struct mt7915_mcu_thermal_notify *)skb->data;
353 if (t->ctrl.ctrl_id != THERMAL_PROTECT_ENABLE)
356 if ((t->ctrl.band_idx && !dev->phy.band_idx) && dev->mt76.phy2)
357 mphy = dev->mt76.phy2;
359 phy = (struct mt7915_phy *)mphy->priv;
360 phy->throttle_state = t->ctrl.duty.duty_cycle;
364 mt7915_mcu_rx_radar_detected(struct mt7915_dev *dev, struct sk_buff *skb)
366 struct mt76_phy *mphy = &dev->mt76.phy;
367 struct mt7915_mcu_rdd_report *r;
369 r = (struct mt7915_mcu_rdd_report *)skb->data;
371 if ((r->band_idx && !dev->phy.band_idx) && dev->mt76.phy2)
372 mphy = dev->mt76.phy2;
374 if (r->band_idx == MT_RX_SEL2)
375 cfg80211_background_radar_event(mphy->hw->wiphy,
379 ieee80211_radar_detected(mphy->hw);
384 mt7915_mcu_rx_log_message(struct mt7915_dev *dev, struct sk_buff *skb)
386 struct mt7915_mcu_rxd *rxd = (struct mt7915_mcu_rxd *)skb->data;
387 const char *data = (char *)&rxd[1];
389 int len = skb->len - sizeof(*rxd);
391 switch (rxd->s2d_index) {
393 if (mt7915_debugfs_rx_log(dev, data, len))
406 wiphy_info(mt76_hw(dev)->wiphy, "%s: %.*s", type, len, data);
410 mt7915_mcu_cca_finish(void *priv, u8 *mac, struct ieee80211_vif *vif)
412 if (!vif->color_change_active)
415 ieee80211_color_change_finish(vif);
419 mt7915_mcu_rx_bcc_notify(struct mt7915_dev *dev, struct sk_buff *skb)
421 struct mt76_phy *mphy = &dev->mt76.phy;
422 struct mt7915_mcu_bcc_notify *b;
424 b = (struct mt7915_mcu_bcc_notify *)skb->data;
426 if ((b->band_idx && !dev->phy.band_idx) && dev->mt76.phy2)
427 mphy = dev->mt76.phy2;
429 ieee80211_iterate_active_interfaces_atomic(mphy->hw,
430 IEEE80211_IFACE_ITER_RESUME_ALL,
431 mt7915_mcu_cca_finish, mphy->hw);
435 mt7915_mcu_rx_ext_event(struct mt7915_dev *dev, struct sk_buff *skb)
437 struct mt7915_mcu_rxd *rxd = (struct mt7915_mcu_rxd *)skb->data;
439 switch (rxd->ext_eid) {
440 case MCU_EXT_EVENT_THERMAL_PROTECT:
441 mt7915_mcu_rx_thermal_notify(dev, skb);
443 case MCU_EXT_EVENT_RDD_REPORT:
444 mt7915_mcu_rx_radar_detected(dev, skb);
446 case MCU_EXT_EVENT_CSA_NOTIFY:
447 mt7915_mcu_rx_csa_notify(dev, skb);
449 case MCU_EXT_EVENT_FW_LOG_2_HOST:
450 mt7915_mcu_rx_log_message(dev, skb);
452 case MCU_EXT_EVENT_BCC_NOTIFY:
453 mt7915_mcu_rx_bcc_notify(dev, skb);
461 mt7915_mcu_rx_unsolicited_event(struct mt7915_dev *dev, struct sk_buff *skb)
463 struct mt7915_mcu_rxd *rxd = (struct mt7915_mcu_rxd *)skb->data;
467 mt7915_mcu_rx_ext_event(dev, skb);
475 void mt7915_mcu_rx_event(struct mt7915_dev *dev, struct sk_buff *skb)
477 struct mt7915_mcu_rxd *rxd = (struct mt7915_mcu_rxd *)skb->data;
479 if (rxd->ext_eid == MCU_EXT_EVENT_THERMAL_PROTECT ||
480 rxd->ext_eid == MCU_EXT_EVENT_FW_LOG_2_HOST ||
481 rxd->ext_eid == MCU_EXT_EVENT_ASSERT_DUMP ||
482 rxd->ext_eid == MCU_EXT_EVENT_PS_SYNC ||
483 rxd->ext_eid == MCU_EXT_EVENT_BCC_NOTIFY ||
485 mt7915_mcu_rx_unsolicited_event(dev, skb);
487 mt76_mcu_rx_event(&dev->mt76, skb);
491 mt7915_mcu_add_nested_subtlv(struct sk_buff *skb, int sub_tag, int sub_len,
492 __le16 *sub_ntlv, __le16 *len)
494 struct tlv *ptlv, tlv = {
495 .tag = cpu_to_le16(sub_tag),
496 .len = cpu_to_le16(sub_len),
499 ptlv = skb_put(skb, sub_len);
500 memcpy(ptlv, &tlv, sizeof(tlv));
502 le16_add_cpu(sub_ntlv, 1);
503 le16_add_cpu(len, sub_len);
509 struct mt7915_he_obss_narrow_bw_ru_data {
513 static void mt7915_check_he_obss_narrow_bw_ru_iter(struct wiphy *wiphy,
514 struct cfg80211_bss *bss,
517 struct mt7915_he_obss_narrow_bw_ru_data *data = _data;
518 const struct element *elem;
521 elem = ieee80211_bss_get_elem(bss, WLAN_EID_EXT_CAPABILITY);
523 if (!elem || elem->datalen <= 10 ||
525 WLAN_EXT_CAPA10_OBSS_NARROW_BW_RU_TOLERANCE_SUPPORT))
526 data->tolerated = false;
531 static bool mt7915_check_he_obss_narrow_bw_ru(struct ieee80211_hw *hw,
532 struct ieee80211_vif *vif)
534 struct mt7915_he_obss_narrow_bw_ru_data iter_data = {
538 if (!(vif->bss_conf.chandef.chan->flags & IEEE80211_CHAN_RADAR))
541 cfg80211_bss_iter(hw->wiphy, &vif->bss_conf.chandef,
542 mt7915_check_he_obss_narrow_bw_ru_iter,
546 * If there is at least one AP on radar channel that cannot
547 * tolerate 26-tone RU UL OFDMA transmissions using HE TB PPDU.
549 return !iter_data.tolerated;
553 mt7915_mcu_bss_rfch_tlv(struct sk_buff *skb, struct ieee80211_vif *vif,
554 struct mt7915_phy *phy)
556 struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
557 struct bss_info_rf_ch *ch;
559 int freq1 = chandef->center_freq1;
561 tlv = mt76_connac_mcu_add_tlv(skb, BSS_INFO_RF_CH, sizeof(*ch));
563 ch = (struct bss_info_rf_ch *)tlv;
564 ch->pri_ch = chandef->chan->hw_value;
565 ch->center_ch0 = ieee80211_frequency_to_channel(freq1);
566 ch->bw = mt76_connac_chan_bw(chandef);
568 if (chandef->width == NL80211_CHAN_WIDTH_80P80) {
569 int freq2 = chandef->center_freq2;
571 ch->center_ch1 = ieee80211_frequency_to_channel(freq2);
574 if (vif->bss_conf.he_support && vif->type == NL80211_IFTYPE_STATION) {
575 struct mt76_phy *mphy = phy->mt76;
578 mt7915_check_he_obss_narrow_bw_ru(mphy->hw, vif);
579 ch->he_all_disable = false;
581 ch->he_all_disable = true;
586 mt7915_mcu_bss_ra_tlv(struct sk_buff *skb, struct ieee80211_vif *vif,
587 struct mt7915_phy *phy)
589 int max_nss = hweight8(phy->mt76->chainmask);
590 struct bss_info_ra *ra;
593 tlv = mt76_connac_mcu_add_tlv(skb, BSS_INFO_RA, sizeof(*ra));
595 ra = (struct bss_info_ra *)tlv;
596 ra->op_mode = vif->type == NL80211_IFTYPE_AP;
597 ra->adhoc_en = vif->type == NL80211_IFTYPE_ADHOC;
598 ra->short_preamble = true;
599 ra->tx_streams = max_nss;
600 ra->rx_streams = max_nss;
602 ra->train_up_rule = 2;
603 ra->train_up_high_thres = 110;
604 ra->train_up_rule_rssi = -70;
605 ra->low_traffic_thres = 2;
606 ra->phy_cap = cpu_to_le32(0xfdf);
607 ra->interval = cpu_to_le32(500);
608 ra->fast_interval = cpu_to_le32(100);
612 mt7915_mcu_bss_he_tlv(struct sk_buff *skb, struct ieee80211_vif *vif,
613 struct mt7915_phy *phy)
615 #define DEFAULT_HE_PE_DURATION 4
616 #define DEFAULT_HE_DURATION_RTS_THRES 1023
617 const struct ieee80211_sta_he_cap *cap;
618 struct bss_info_he *he;
621 cap = mt76_connac_get_he_phy_cap(phy->mt76, vif);
623 tlv = mt76_connac_mcu_add_tlv(skb, BSS_INFO_HE_BASIC, sizeof(*he));
625 he = (struct bss_info_he *)tlv;
626 he->he_pe_duration = vif->bss_conf.htc_trig_based_pkt_ext;
627 if (!he->he_pe_duration)
628 he->he_pe_duration = DEFAULT_HE_PE_DURATION;
630 he->he_rts_thres = cpu_to_le16(vif->bss_conf.frame_time_rts_th);
631 if (!he->he_rts_thres)
632 he->he_rts_thres = cpu_to_le16(DEFAULT_HE_DURATION_RTS_THRES);
634 he->max_nss_mcs[CMD_HE_MCS_BW80] = cap->he_mcs_nss_supp.tx_mcs_80;
635 he->max_nss_mcs[CMD_HE_MCS_BW160] = cap->he_mcs_nss_supp.tx_mcs_160;
636 he->max_nss_mcs[CMD_HE_MCS_BW8080] = cap->he_mcs_nss_supp.tx_mcs_80p80;
640 mt7915_mcu_bss_hw_amsdu_tlv(struct sk_buff *skb)
642 #define TXD_CMP_MAP1 GENMASK(15, 0)
643 #define TXD_CMP_MAP2 (GENMASK(31, 0) & ~BIT(23))
644 struct bss_info_hw_amsdu *amsdu;
647 tlv = mt76_connac_mcu_add_tlv(skb, BSS_INFO_HW_AMSDU, sizeof(*amsdu));
649 amsdu = (struct bss_info_hw_amsdu *)tlv;
650 amsdu->cmp_bitmap_0 = cpu_to_le32(TXD_CMP_MAP1);
651 amsdu->cmp_bitmap_1 = cpu_to_le32(TXD_CMP_MAP2);
652 amsdu->trig_thres = cpu_to_le16(2);
653 amsdu->enable = true;
657 mt7915_mcu_bss_bmc_tlv(struct sk_buff *skb, struct mt7915_phy *phy)
659 struct bss_info_bmc_rate *bmc;
660 struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
661 enum nl80211_band band = chandef->chan->band;
664 tlv = mt76_connac_mcu_add_tlv(skb, BSS_INFO_BMC_RATE, sizeof(*bmc));
666 bmc = (struct bss_info_bmc_rate *)tlv;
667 if (band == NL80211_BAND_2GHZ) {
668 bmc->short_preamble = true;
670 bmc->bc_trans = cpu_to_le16(0x2000);
671 bmc->mc_trans = cpu_to_le16(0x2080);
676 mt7915_mcu_muar_config(struct mt7915_phy *phy, struct ieee80211_vif *vif,
677 bool bssid, bool enable)
679 struct mt7915_dev *dev = phy->dev;
680 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
681 u32 idx = mvif->mt76.omac_idx - REPEATER_BSSID_START;
682 u32 mask = phy->omac_mask >> 32 & ~BIT(idx);
683 const u8 *addr = vif->addr;
696 .mode = !!mask || enable,
699 .band = phy != &dev->phy,
700 .index = idx * 2 + bssid,
704 addr = vif->bss_conf.bssid;
707 ether_addr_copy(req.addr, addr);
709 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(MUAR_UPDATE), &req,
713 int mt7915_mcu_add_bss_info(struct mt7915_phy *phy,
714 struct ieee80211_vif *vif, int enable)
716 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
717 struct mt7915_dev *dev = phy->dev;
720 if (mvif->mt76.omac_idx >= REPEATER_BSSID_START) {
721 mt7915_mcu_muar_config(phy, vif, false, enable);
722 mt7915_mcu_muar_config(phy, vif, true, enable);
725 skb = __mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76, NULL,
726 MT7915_BSS_UPDATE_MAX_SIZE);
730 /* bss_omac must be first */
732 mt76_connac_mcu_bss_omac_tlv(skb, vif);
734 mt76_connac_mcu_bss_basic_tlv(skb, vif, NULL, phy->mt76,
735 mvif->sta.wcid.idx, enable);
737 if (vif->type == NL80211_IFTYPE_MONITOR)
741 mt7915_mcu_bss_rfch_tlv(skb, vif, phy);
742 mt7915_mcu_bss_bmc_tlv(skb, phy);
743 mt7915_mcu_bss_ra_tlv(skb, vif, phy);
744 mt7915_mcu_bss_hw_amsdu_tlv(skb);
746 if (vif->bss_conf.he_support)
747 mt7915_mcu_bss_he_tlv(skb, vif, phy);
749 if (mvif->mt76.omac_idx >= EXT_BSSID_START &&
750 mvif->mt76.omac_idx < REPEATER_BSSID_START)
751 mt76_connac_mcu_bss_ext_tlv(skb, &mvif->mt76);
754 return mt76_mcu_skb_send_msg(&dev->mt76, skb,
755 MCU_EXT_CMD(BSS_INFO_UPDATE), true);
758 /** starec & wtbl **/
759 int mt7915_mcu_add_tx_ba(struct mt7915_dev *dev,
760 struct ieee80211_ampdu_params *params,
763 struct mt7915_sta *msta = (struct mt7915_sta *)params->sta->drv_priv;
764 struct mt7915_vif *mvif = msta->vif;
766 if (enable && !params->amsdu)
767 msta->wcid.amsdu = false;
769 return mt76_connac_mcu_sta_ba(&dev->mt76, &mvif->mt76, params,
770 MCU_EXT_CMD(STA_REC_UPDATE),
774 int mt7915_mcu_add_rx_ba(struct mt7915_dev *dev,
775 struct ieee80211_ampdu_params *params,
778 struct mt7915_sta *msta = (struct mt7915_sta *)params->sta->drv_priv;
779 struct mt7915_vif *mvif = msta->vif;
781 return mt76_connac_mcu_sta_ba(&dev->mt76, &mvif->mt76, params,
782 MCU_EXT_CMD(STA_REC_UPDATE),
787 mt7915_mcu_sta_he_tlv(struct sk_buff *skb, struct ieee80211_sta *sta,
788 struct ieee80211_vif *vif)
790 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
791 struct ieee80211_he_cap_elem *elem = &sta->he_cap.he_cap_elem;
792 struct ieee80211_he_mcs_nss_supp mcs_map;
793 struct sta_rec_he *he;
797 if (!sta->he_cap.has_he)
800 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_HE, sizeof(*he));
802 he = (struct sta_rec_he *)tlv;
804 if (elem->mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_HTC_HE)
805 cap |= STA_REC_HE_CAP_HTC;
807 if (elem->mac_cap_info[2] & IEEE80211_HE_MAC_CAP2_BSR)
808 cap |= STA_REC_HE_CAP_BSR;
810 if (elem->mac_cap_info[3] & IEEE80211_HE_MAC_CAP3_OMI_CONTROL)
811 cap |= STA_REC_HE_CAP_OM;
813 if (elem->mac_cap_info[4] & IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU)
814 cap |= STA_REC_HE_CAP_AMSDU_IN_AMPDU;
816 if (elem->mac_cap_info[4] & IEEE80211_HE_MAC_CAP4_BQR)
817 cap |= STA_REC_HE_CAP_BQR;
819 if (elem->phy_cap_info[0] &
820 (IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_RU_MAPPING_IN_2G |
821 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_RU_MAPPING_IN_5G))
822 cap |= STA_REC_HE_CAP_BW20_RU242_SUPPORT;
824 if (mvif->cap.he_ldpc &&
825 (elem->phy_cap_info[1] &
826 IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD))
827 cap |= STA_REC_HE_CAP_LDPC;
829 if (elem->phy_cap_info[1] &
830 IEEE80211_HE_PHY_CAP1_HE_LTF_AND_GI_FOR_HE_PPDUS_0_8US)
831 cap |= STA_REC_HE_CAP_SU_PPDU_1LTF_8US_GI;
833 if (elem->phy_cap_info[2] &
834 IEEE80211_HE_PHY_CAP2_NDP_4x_LTF_AND_3_2US)
835 cap |= STA_REC_HE_CAP_NDP_4LTF_3DOT2MS_GI;
837 if (elem->phy_cap_info[2] &
838 IEEE80211_HE_PHY_CAP2_STBC_TX_UNDER_80MHZ)
839 cap |= STA_REC_HE_CAP_LE_EQ_80M_TX_STBC;
841 if (elem->phy_cap_info[2] &
842 IEEE80211_HE_PHY_CAP2_STBC_RX_UNDER_80MHZ)
843 cap |= STA_REC_HE_CAP_LE_EQ_80M_RX_STBC;
845 if (elem->phy_cap_info[6] &
846 IEEE80211_HE_PHY_CAP6_TRIG_CQI_FB)
847 cap |= STA_REC_HE_CAP_TRIG_CQI_FK;
849 if (elem->phy_cap_info[6] &
850 IEEE80211_HE_PHY_CAP6_PARTIAL_BW_EXT_RANGE)
851 cap |= STA_REC_HE_CAP_PARTIAL_BW_EXT_RANGE;
853 if (elem->phy_cap_info[7] &
854 IEEE80211_HE_PHY_CAP7_HE_SU_MU_PPDU_4XLTF_AND_08_US_GI)
855 cap |= STA_REC_HE_CAP_SU_MU_PPDU_4LTF_8US_GI;
857 if (elem->phy_cap_info[7] &
858 IEEE80211_HE_PHY_CAP7_STBC_TX_ABOVE_80MHZ)
859 cap |= STA_REC_HE_CAP_GT_80M_TX_STBC;
861 if (elem->phy_cap_info[7] &
862 IEEE80211_HE_PHY_CAP7_STBC_RX_ABOVE_80MHZ)
863 cap |= STA_REC_HE_CAP_GT_80M_RX_STBC;
865 if (elem->phy_cap_info[8] &
866 IEEE80211_HE_PHY_CAP8_HE_ER_SU_PPDU_4XLTF_AND_08_US_GI)
867 cap |= STA_REC_HE_CAP_ER_SU_PPDU_4LTF_8US_GI;
869 if (elem->phy_cap_info[8] &
870 IEEE80211_HE_PHY_CAP8_HE_ER_SU_1XLTF_AND_08_US_GI)
871 cap |= STA_REC_HE_CAP_ER_SU_PPDU_1LTF_8US_GI;
873 if (elem->phy_cap_info[9] &
874 IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU)
875 cap |= STA_REC_HE_CAP_TX_1024QAM_UNDER_RU242;
877 if (elem->phy_cap_info[9] &
878 IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU)
879 cap |= STA_REC_HE_CAP_RX_1024QAM_UNDER_RU242;
881 he->he_cap = cpu_to_le32(cap);
883 mcs_map = sta->he_cap.he_mcs_nss_supp;
884 switch (sta->bandwidth) {
885 case IEEE80211_STA_RX_BW_160:
886 if (elem->phy_cap_info[0] &
887 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
888 mt7915_mcu_set_sta_he_mcs(sta,
889 &he->max_nss_mcs[CMD_HE_MCS_BW8080],
890 le16_to_cpu(mcs_map.rx_mcs_80p80));
892 mt7915_mcu_set_sta_he_mcs(sta,
893 &he->max_nss_mcs[CMD_HE_MCS_BW160],
894 le16_to_cpu(mcs_map.rx_mcs_160));
897 mt7915_mcu_set_sta_he_mcs(sta,
898 &he->max_nss_mcs[CMD_HE_MCS_BW80],
899 le16_to_cpu(mcs_map.rx_mcs_80));
904 HE_MAC(CAP1_TF_MAC_PAD_DUR_MASK, elem->mac_cap_info[1]);
906 HE_MAC(CAP3_MAX_AMPDU_LEN_EXP_MASK, elem->mac_cap_info[3]);
909 HE_PHY(CAP0_CHANNEL_WIDTH_SET_MASK, elem->phy_cap_info[0]);
911 HE_PHY(CAP1_DEVICE_CLASS_A, elem->phy_cap_info[1]);
913 HE_PHY(CAP1_PREAMBLE_PUNC_RX_MASK, elem->phy_cap_info[1]);
916 HE_PHY(CAP3_DCM_MAX_CONST_TX_MASK, elem->phy_cap_info[3]);
918 HE_PHY(CAP3_DCM_MAX_TX_NSS_2, elem->phy_cap_info[3]);
920 HE_PHY(CAP3_DCM_MAX_CONST_RX_MASK, elem->phy_cap_info[3]);
922 HE_PHY(CAP3_DCM_MAX_RX_NSS_2, elem->phy_cap_info[3]);
924 HE_PHY(CAP8_DCM_MAX_RU_MASK, elem->phy_cap_info[8]);
930 mt7915_mcu_sta_muru_tlv(struct sk_buff *skb, struct ieee80211_sta *sta,
931 struct ieee80211_vif *vif)
933 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
934 struct ieee80211_he_cap_elem *elem = &sta->he_cap.he_cap_elem;
935 struct sta_rec_muru *muru;
938 if (vif->type != NL80211_IFTYPE_STATION &&
939 vif->type != NL80211_IFTYPE_AP)
942 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_MURU, sizeof(*muru));
944 muru = (struct sta_rec_muru *)tlv;
946 muru->cfg.mimo_dl_en = mvif->cap.he_mu_ebfer ||
947 mvif->cap.vht_mu_ebfer ||
948 mvif->cap.vht_mu_ebfee;
949 muru->cfg.mimo_ul_en = true;
950 muru->cfg.ofdma_dl_en = true;
952 if (sta->vht_cap.vht_supported)
953 muru->mimo_dl.vht_mu_bfee =
954 !!(sta->vht_cap.cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE);
956 if (!sta->he_cap.has_he)
959 muru->mimo_dl.partial_bw_dl_mimo =
960 HE_PHY(CAP6_PARTIAL_BANDWIDTH_DL_MUMIMO, elem->phy_cap_info[6]);
962 muru->mimo_ul.full_ul_mimo =
963 HE_PHY(CAP2_UL_MU_FULL_MU_MIMO, elem->phy_cap_info[2]);
964 muru->mimo_ul.partial_ul_mimo =
965 HE_PHY(CAP2_UL_MU_PARTIAL_MU_MIMO, elem->phy_cap_info[2]);
967 muru->ofdma_dl.punc_pream_rx =
968 HE_PHY(CAP1_PREAMBLE_PUNC_RX_MASK, elem->phy_cap_info[1]);
969 muru->ofdma_dl.he_20m_in_40m_2g =
970 HE_PHY(CAP8_20MHZ_IN_40MHZ_HE_PPDU_IN_2G, elem->phy_cap_info[8]);
971 muru->ofdma_dl.he_20m_in_160m =
972 HE_PHY(CAP8_20MHZ_IN_160MHZ_HE_PPDU, elem->phy_cap_info[8]);
973 muru->ofdma_dl.he_80m_in_160m =
974 HE_PHY(CAP8_80MHZ_IN_160MHZ_HE_PPDU, elem->phy_cap_info[8]);
976 muru->ofdma_ul.t_frame_dur =
977 HE_MAC(CAP1_TF_MAC_PAD_DUR_MASK, elem->mac_cap_info[1]);
978 muru->ofdma_ul.mu_cascading =
979 HE_MAC(CAP2_MU_CASCADING, elem->mac_cap_info[2]);
980 muru->ofdma_ul.uo_ra =
981 HE_MAC(CAP3_OFDMA_RA, elem->mac_cap_info[3]);
985 mt7915_mcu_sta_ht_tlv(struct sk_buff *skb, struct ieee80211_sta *sta)
987 struct sta_rec_ht *ht;
990 if (!sta->ht_cap.ht_supported)
993 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_HT, sizeof(*ht));
995 ht = (struct sta_rec_ht *)tlv;
996 ht->ht_cap = cpu_to_le16(sta->ht_cap.cap);
1000 mt7915_mcu_sta_vht_tlv(struct sk_buff *skb, struct ieee80211_sta *sta)
1002 struct sta_rec_vht *vht;
1005 if (!sta->vht_cap.vht_supported)
1008 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_VHT, sizeof(*vht));
1010 vht = (struct sta_rec_vht *)tlv;
1011 vht->vht_cap = cpu_to_le32(sta->vht_cap.cap);
1012 vht->vht_rx_mcs_map = sta->vht_cap.vht_mcs.rx_mcs_map;
1013 vht->vht_tx_mcs_map = sta->vht_cap.vht_mcs.tx_mcs_map;
1017 mt7915_mcu_sta_amsdu_tlv(struct mt7915_dev *dev, struct sk_buff *skb,
1018 struct ieee80211_vif *vif, struct ieee80211_sta *sta)
1020 struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
1021 struct sta_rec_amsdu *amsdu;
1024 if (vif->type != NL80211_IFTYPE_STATION &&
1025 vif->type != NL80211_IFTYPE_AP)
1028 if (!sta->max_amsdu_len)
1031 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_HW_AMSDU, sizeof(*amsdu));
1032 amsdu = (struct sta_rec_amsdu *)tlv;
1033 amsdu->max_amsdu_num = 8;
1034 amsdu->amsdu_en = true;
1035 msta->wcid.amsdu = true;
1037 switch (sta->max_amsdu_len) {
1038 case IEEE80211_MAX_MPDU_LEN_VHT_11454:
1039 if (!is_mt7915(&dev->mt76)) {
1040 amsdu->max_mpdu_size =
1041 IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454;
1045 case IEEE80211_MAX_MPDU_LEN_HT_7935:
1046 case IEEE80211_MAX_MPDU_LEN_VHT_7991:
1047 amsdu->max_mpdu_size = IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_7991;
1050 amsdu->max_mpdu_size = IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_3895;
1056 mt7915_mcu_sta_wtbl_tlv(struct mt7915_dev *dev, struct sk_buff *skb,
1057 struct ieee80211_vif *vif, struct ieee80211_sta *sta)
1059 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1060 struct mt7915_sta *msta;
1061 struct wtbl_req_hdr *wtbl_hdr;
1062 struct mt76_wcid *wcid;
1065 msta = sta ? (struct mt7915_sta *)sta->drv_priv : &mvif->sta;
1066 wcid = sta ? &msta->wcid : NULL;
1068 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_WTBL, sizeof(struct tlv));
1069 wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(&dev->mt76, &msta->wcid,
1070 WTBL_RESET_AND_SET, tlv,
1072 if (IS_ERR(wtbl_hdr))
1073 return PTR_ERR(wtbl_hdr);
1075 mt76_connac_mcu_wtbl_generic_tlv(&dev->mt76, skb, vif, sta, tlv,
1077 mt76_connac_mcu_wtbl_hdr_trans_tlv(skb, vif, wcid, tlv, wtbl_hdr);
1079 mt76_connac_mcu_wtbl_ht_tlv(&dev->mt76, skb, sta, tlv,
1080 wtbl_hdr, mvif->cap.ht_ldpc,
1081 mvif->cap.vht_ldpc);
1087 mt7915_is_ebf_supported(struct mt7915_phy *phy, struct ieee80211_vif *vif,
1088 struct ieee80211_sta *sta, bool bfee)
1090 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1091 int tx_ant = hweight8(phy->mt76->chainmask) - 1;
1093 if (vif->type != NL80211_IFTYPE_STATION &&
1094 vif->type != NL80211_IFTYPE_AP)
1097 if (!bfee && tx_ant < 2)
1100 if (sta->he_cap.has_he) {
1101 struct ieee80211_he_cap_elem *pe = &sta->he_cap.he_cap_elem;
1104 return mvif->cap.he_su_ebfee &&
1105 HE_PHY(CAP3_SU_BEAMFORMER, pe->phy_cap_info[3]);
1107 return mvif->cap.he_su_ebfer &&
1108 HE_PHY(CAP4_SU_BEAMFORMEE, pe->phy_cap_info[4]);
1111 if (sta->vht_cap.vht_supported) {
1112 u32 cap = sta->vht_cap.cap;
1115 return mvif->cap.vht_su_ebfee &&
1116 (cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE);
1118 return mvif->cap.vht_su_ebfer &&
1119 (cap & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE);
1126 mt7915_mcu_sta_sounding_rate(struct sta_rec_bf *bf)
1128 bf->sounding_phy = MT_PHY_TYPE_OFDM;
1129 bf->ndp_rate = 0; /* mcs0 */
1130 bf->ndpa_rate = MT7915_CFEND_RATE_DEFAULT; /* ofdm 24m */
1131 bf->rept_poll_rate = MT7915_CFEND_RATE_DEFAULT; /* ofdm 24m */
1135 mt7915_mcu_sta_bfer_ht(struct ieee80211_sta *sta, struct mt7915_phy *phy,
1136 struct sta_rec_bf *bf)
1138 struct ieee80211_mcs_info *mcs = &sta->ht_cap.mcs;
1141 bf->tx_mode = MT_PHY_TYPE_HT;
1143 if ((mcs->tx_params & IEEE80211_HT_MCS_TX_RX_DIFF) &&
1144 (mcs->tx_params & IEEE80211_HT_MCS_TX_DEFINED))
1145 n = FIELD_GET(IEEE80211_HT_MCS_TX_MAX_STREAMS_MASK,
1147 else if (mcs->rx_mask[3])
1149 else if (mcs->rx_mask[2])
1151 else if (mcs->rx_mask[1])
1154 bf->nrow = hweight8(phy->mt76->chainmask) - 1;
1155 bf->ncol = min_t(u8, bf->nrow, n);
1160 mt7915_mcu_sta_bfer_vht(struct ieee80211_sta *sta, struct mt7915_phy *phy,
1161 struct sta_rec_bf *bf, bool explicit)
1163 struct ieee80211_sta_vht_cap *pc = &sta->vht_cap;
1164 struct ieee80211_sta_vht_cap *vc = &phy->mt76->sband_5g.sband.vht_cap;
1165 u16 mcs_map = le16_to_cpu(pc->vht_mcs.rx_mcs_map);
1166 u8 nss_mcs = mt7915_mcu_get_sta_nss(mcs_map);
1167 u8 tx_ant = hweight8(phy->mt76->chainmask) - 1;
1169 bf->tx_mode = MT_PHY_TYPE_VHT;
1174 mt7915_mcu_sta_sounding_rate(bf);
1176 sts = FIELD_GET(IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK,
1178 snd_dim = FIELD_GET(IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK,
1180 bf->nrow = min_t(u8, min_t(u8, snd_dim, sts), tx_ant);
1181 bf->ncol = min_t(u8, nss_mcs, bf->nrow);
1182 bf->ibf_ncol = bf->ncol;
1184 if (sta->bandwidth == IEEE80211_STA_RX_BW_160)
1188 bf->ncol = min_t(u8, nss_mcs, bf->nrow);
1189 bf->ibf_ncol = nss_mcs;
1191 if (sta->bandwidth == IEEE80211_STA_RX_BW_160)
1197 mt7915_mcu_sta_bfer_he(struct ieee80211_sta *sta, struct ieee80211_vif *vif,
1198 struct mt7915_phy *phy, struct sta_rec_bf *bf)
1200 struct ieee80211_sta_he_cap *pc = &sta->he_cap;
1201 struct ieee80211_he_cap_elem *pe = &pc->he_cap_elem;
1202 const struct ieee80211_sta_he_cap *vc =
1203 mt76_connac_get_he_phy_cap(phy->mt76, vif);
1204 const struct ieee80211_he_cap_elem *ve = &vc->he_cap_elem;
1205 u16 mcs_map = le16_to_cpu(pc->he_mcs_nss_supp.rx_mcs_80);
1206 u8 nss_mcs = mt7915_mcu_get_sta_nss(mcs_map);
1209 bf->tx_mode = MT_PHY_TYPE_HE_SU;
1211 mt7915_mcu_sta_sounding_rate(bf);
1213 bf->trigger_su = HE_PHY(CAP6_TRIG_SU_BEAMFORMING_FB,
1214 pe->phy_cap_info[6]);
1215 bf->trigger_mu = HE_PHY(CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB,
1216 pe->phy_cap_info[6]);
1217 snd_dim = HE_PHY(CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK,
1218 ve->phy_cap_info[5]);
1219 sts = HE_PHY(CAP4_BEAMFORMEE_MAX_STS_UNDER_80MHZ_MASK,
1220 pe->phy_cap_info[4]);
1221 bf->nrow = min_t(u8, snd_dim, sts);
1222 bf->ncol = min_t(u8, nss_mcs, bf->nrow);
1223 bf->ibf_ncol = bf->ncol;
1225 if (sta->bandwidth != IEEE80211_STA_RX_BW_160)
1228 /* go over for 160MHz and 80p80 */
1229 if (pe->phy_cap_info[0] &
1230 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G) {
1231 mcs_map = le16_to_cpu(pc->he_mcs_nss_supp.rx_mcs_160);
1232 nss_mcs = mt7915_mcu_get_sta_nss(mcs_map);
1234 bf->ncol_bw160 = nss_mcs;
1237 if (pe->phy_cap_info[0] &
1238 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G) {
1239 mcs_map = le16_to_cpu(pc->he_mcs_nss_supp.rx_mcs_80p80);
1240 nss_mcs = mt7915_mcu_get_sta_nss(mcs_map);
1243 bf->ncol_bw160 = min_t(u8, bf->ncol_bw160, nss_mcs);
1245 bf->ncol_bw160 = nss_mcs;
1248 snd_dim = HE_PHY(CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_MASK,
1249 ve->phy_cap_info[5]);
1250 sts = HE_PHY(CAP4_BEAMFORMEE_MAX_STS_ABOVE_80MHZ_MASK,
1251 pe->phy_cap_info[4]);
1253 bf->nrow_bw160 = min_t(int, snd_dim, sts);
1257 mt7915_mcu_sta_bfer_tlv(struct mt7915_dev *dev, struct sk_buff *skb,
1258 struct ieee80211_vif *vif, struct ieee80211_sta *sta)
1260 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1261 struct mt7915_phy *phy = mvif->phy;
1262 int tx_ant = hweight8(phy->mt76->chainmask) - 1;
1263 struct sta_rec_bf *bf;
1265 const u8 matrix[4][4] = {
1267 {1, 1, 0, 0}, /* 2x1, 2x2, 2x3, 2x4 */
1268 {2, 4, 4, 0}, /* 3x1, 3x2, 3x3, 3x4 */
1269 {3, 5, 6, 0} /* 4x1, 4x2, 4x3, 4x4 */
1273 if (!(sta->ht_cap.ht_supported || sta->he_cap.has_he))
1276 ebf = mt7915_is_ebf_supported(phy, vif, sta, false);
1277 if (!ebf && !dev->ibf)
1280 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_BF, sizeof(*bf));
1281 bf = (struct sta_rec_bf *)tlv;
1283 /* he: eBF only, in accordance with spec
1284 * vht: support eBF and iBF
1285 * ht: iBF only, since mac80211 lacks of eBF support
1287 if (sta->he_cap.has_he && ebf)
1288 mt7915_mcu_sta_bfer_he(sta, vif, phy, bf);
1289 else if (sta->vht_cap.vht_supported)
1290 mt7915_mcu_sta_bfer_vht(sta, phy, bf, ebf);
1291 else if (sta->ht_cap.ht_supported)
1292 mt7915_mcu_sta_bfer_ht(sta, phy, bf);
1296 bf->bf_cap = ebf ? ebf : dev->ibf << 1;
1297 bf->bw = sta->bandwidth;
1298 bf->ibf_dbw = sta->bandwidth;
1299 bf->ibf_nrow = tx_ant;
1301 if (!ebf && sta->bandwidth <= IEEE80211_STA_RX_BW_40 && !bf->ncol)
1302 bf->ibf_timeout = 0x48;
1304 bf->ibf_timeout = 0x18;
1306 if (ebf && bf->nrow != tx_ant)
1307 bf->mem_20m = matrix[tx_ant][bf->ncol];
1309 bf->mem_20m = matrix[bf->nrow][bf->ncol];
1311 switch (sta->bandwidth) {
1312 case IEEE80211_STA_RX_BW_160:
1313 case IEEE80211_STA_RX_BW_80:
1314 bf->mem_total = bf->mem_20m * 2;
1316 case IEEE80211_STA_RX_BW_40:
1317 bf->mem_total = bf->mem_20m;
1319 case IEEE80211_STA_RX_BW_20:
1326 mt7915_mcu_sta_bfee_tlv(struct mt7915_dev *dev, struct sk_buff *skb,
1327 struct ieee80211_vif *vif, struct ieee80211_sta *sta)
1329 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1330 struct mt7915_phy *phy = mvif->phy;
1331 int tx_ant = hweight8(phy->mt76->chainmask) - 1;
1332 struct sta_rec_bfee *bfee;
1336 if (!(sta->vht_cap.vht_supported || sta->he_cap.has_he))
1339 if (!mt7915_is_ebf_supported(phy, vif, sta, true))
1342 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_BFEE, sizeof(*bfee));
1343 bfee = (struct sta_rec_bfee *)tlv;
1345 if (sta->he_cap.has_he) {
1346 struct ieee80211_he_cap_elem *pe = &sta->he_cap.he_cap_elem;
1348 nrow = HE_PHY(CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK,
1349 pe->phy_cap_info[5]);
1350 } else if (sta->vht_cap.vht_supported) {
1351 struct ieee80211_sta_vht_cap *pc = &sta->vht_cap;
1353 nrow = FIELD_GET(IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK,
1357 /* reply with identity matrix to avoid 2x2 BF negative gain */
1358 bfee->fb_identity_matrix = (nrow == 1 && tx_ant == 2);
1361 static enum mcu_mmps_mode
1362 mt7915_mcu_get_mmps_mode(enum ieee80211_smps_mode smps)
1365 case IEEE80211_SMPS_OFF:
1366 return MCU_MMPS_DISABLE;
1367 case IEEE80211_SMPS_STATIC:
1368 return MCU_MMPS_STATIC;
1369 case IEEE80211_SMPS_DYNAMIC:
1370 return MCU_MMPS_DYNAMIC;
1372 return MCU_MMPS_DISABLE;
1376 int mt7915_mcu_set_fixed_rate_ctrl(struct mt7915_dev *dev,
1377 struct ieee80211_vif *vif,
1378 struct ieee80211_sta *sta,
1379 void *data, u32 field)
1381 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1382 struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
1383 struct sta_phy *phy = data;
1384 struct sta_rec_ra_fixed *ra;
1385 struct sk_buff *skb;
1388 skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
1391 return PTR_ERR(skb);
1393 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_RA_UPDATE, sizeof(*ra));
1394 ra = (struct sta_rec_ra_fixed *)tlv;
1397 case RATE_PARAM_AUTO:
1399 case RATE_PARAM_FIXED:
1400 case RATE_PARAM_FIXED_MCS:
1401 case RATE_PARAM_FIXED_GI:
1402 case RATE_PARAM_FIXED_HE_LTF:
1406 case RATE_PARAM_MMPS_UPDATE:
1407 ra->mmps_mode = mt7915_mcu_get_mmps_mode(sta->smps_mode);
1412 ra->field = cpu_to_le32(field);
1414 return mt76_mcu_skb_send_msg(&dev->mt76, skb,
1415 MCU_EXT_CMD(STA_REC_UPDATE), true);
1418 int mt7915_mcu_add_smps(struct mt7915_dev *dev, struct ieee80211_vif *vif,
1419 struct ieee80211_sta *sta)
1421 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1422 struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
1423 struct wtbl_req_hdr *wtbl_hdr;
1424 struct tlv *sta_wtbl;
1425 struct sk_buff *skb;
1428 skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
1431 return PTR_ERR(skb);
1433 sta_wtbl = mt76_connac_mcu_add_tlv(skb, STA_REC_WTBL,
1434 sizeof(struct tlv));
1435 wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(&dev->mt76, &msta->wcid,
1436 WTBL_SET, sta_wtbl, &skb);
1437 if (IS_ERR(wtbl_hdr))
1438 return PTR_ERR(wtbl_hdr);
1440 mt76_connac_mcu_wtbl_smps_tlv(skb, sta, sta_wtbl, wtbl_hdr);
1442 ret = mt76_mcu_skb_send_msg(&dev->mt76, skb,
1443 MCU_EXT_CMD(STA_REC_UPDATE), true);
1447 return mt7915_mcu_set_fixed_rate_ctrl(dev, vif, sta, NULL,
1448 RATE_PARAM_MMPS_UPDATE);
1452 mt7915_mcu_add_rate_ctrl_fixed(struct mt7915_dev *dev,
1453 struct ieee80211_vif *vif,
1454 struct ieee80211_sta *sta)
1456 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1457 struct cfg80211_chan_def *chandef = &mvif->phy->mt76->chandef;
1458 struct cfg80211_bitrate_mask *mask = &mvif->bitrate_mask;
1459 enum nl80211_band band = chandef->chan->band;
1460 struct sta_phy phy = {};
1461 int ret, nrates = 0;
1463 #define __sta_phy_bitrate_mask_check(_mcs, _gi, _he) \
1465 u8 i, gi = mask->control[band]._gi; \
1466 gi = (_he) ? gi : gi == NL80211_TXRATE_FORCE_SGI; \
1467 for (i = 0; i <= sta->bandwidth; i++) { \
1468 phy.sgi |= gi << (i << (_he)); \
1469 phy.he_ltf |= mask->control[band].he_ltf << (i << (_he));\
1471 for (i = 0; i < ARRAY_SIZE(mask->control[band]._mcs); i++) { \
1472 if (!mask->control[band]._mcs[i]) \
1474 nrates += hweight16(mask->control[band]._mcs[i]); \
1475 phy.mcs = ffs(mask->control[band]._mcs[i]) - 1; \
1479 if (sta->he_cap.has_he) {
1480 __sta_phy_bitrate_mask_check(he_mcs, he_gi, 1);
1481 } else if (sta->vht_cap.vht_supported) {
1482 __sta_phy_bitrate_mask_check(vht_mcs, gi, 0);
1483 } else if (sta->ht_cap.ht_supported) {
1484 __sta_phy_bitrate_mask_check(ht_mcs, gi, 0);
1486 nrates = hweight32(mask->control[band].legacy);
1487 phy.mcs = ffs(mask->control[band].legacy) - 1;
1489 #undef __sta_phy_bitrate_mask_check
1491 /* fall back to auto rate control */
1492 if (mask->control[band].gi == NL80211_TXRATE_DEFAULT_GI &&
1493 mask->control[band].he_gi == GENMASK(7, 0) &&
1494 mask->control[band].he_ltf == GENMASK(7, 0) &&
1498 /* fixed single rate */
1500 ret = mt7915_mcu_set_fixed_rate_ctrl(dev, vif, sta, &phy,
1501 RATE_PARAM_FIXED_MCS);
1507 if (mask->control[band].gi != NL80211_TXRATE_DEFAULT_GI ||
1508 mask->control[band].he_gi != GENMASK(7, 0)) {
1509 struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
1512 /* firmware updates only TXCMD but doesn't take WTBL into
1513 * account, so driver should update here to reflect the
1514 * actual txrate hardware sends out.
1516 addr = mt7915_mac_wtbl_lmac_addr(dev, msta->wcid.idx, 7);
1517 if (sta->he_cap.has_he)
1518 mt76_rmw_field(dev, addr, GENMASK(31, 24), phy.sgi);
1520 mt76_rmw_field(dev, addr, GENMASK(15, 12), phy.sgi);
1522 ret = mt7915_mcu_set_fixed_rate_ctrl(dev, vif, sta, &phy,
1523 RATE_PARAM_FIXED_GI);
1529 if (mask->control[band].he_ltf != GENMASK(7, 0)) {
1530 ret = mt7915_mcu_set_fixed_rate_ctrl(dev, vif, sta, &phy,
1531 RATE_PARAM_FIXED_HE_LTF);
1540 mt7915_mcu_sta_rate_ctrl_tlv(struct sk_buff *skb, struct mt7915_dev *dev,
1541 struct ieee80211_vif *vif, struct ieee80211_sta *sta)
1543 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1544 struct mt76_phy *mphy = mvif->phy->mt76;
1545 struct cfg80211_chan_def *chandef = &mphy->chandef;
1546 struct cfg80211_bitrate_mask *mask = &mvif->bitrate_mask;
1547 enum nl80211_band band = chandef->chan->band;
1548 struct sta_rec_ra *ra;
1550 u32 supp_rate = sta->supp_rates[band];
1551 u32 cap = sta->wme ? STA_CAP_WMM : 0;
1553 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_RA, sizeof(*ra));
1554 ra = (struct sta_rec_ra *)tlv;
1557 ra->auto_rate = true;
1558 ra->phy_mode = mt76_connac_get_phy_mode(mphy, vif, band, sta);
1559 ra->channel = chandef->chan->hw_value;
1560 ra->bw = sta->bandwidth;
1561 ra->phy.bw = sta->bandwidth;
1562 ra->mmps_mode = mt7915_mcu_get_mmps_mode(sta->smps_mode);
1565 supp_rate &= mask->control[band].legacy;
1566 ra->rate_len = hweight32(supp_rate);
1568 if (band == NL80211_BAND_2GHZ) {
1569 ra->supp_mode = MODE_CCK;
1570 ra->supp_cck_rate = supp_rate & GENMASK(3, 0);
1572 if (ra->rate_len > 4) {
1573 ra->supp_mode |= MODE_OFDM;
1574 ra->supp_ofdm_rate = supp_rate >> 4;
1577 ra->supp_mode = MODE_OFDM;
1578 ra->supp_ofdm_rate = supp_rate;
1582 if (sta->ht_cap.ht_supported) {
1583 ra->supp_mode |= MODE_HT;
1584 ra->af = sta->ht_cap.ampdu_factor;
1585 ra->ht_gf = !!(sta->ht_cap.cap & IEEE80211_HT_CAP_GRN_FLD);
1588 if (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20)
1589 cap |= STA_CAP_SGI_20;
1590 if (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40)
1591 cap |= STA_CAP_SGI_40;
1592 if (sta->ht_cap.cap & IEEE80211_HT_CAP_TX_STBC)
1593 cap |= STA_CAP_TX_STBC;
1594 if (sta->ht_cap.cap & IEEE80211_HT_CAP_RX_STBC)
1595 cap |= STA_CAP_RX_STBC;
1596 if (mvif->cap.ht_ldpc &&
1597 (sta->ht_cap.cap & IEEE80211_HT_CAP_LDPC_CODING))
1598 cap |= STA_CAP_LDPC;
1600 mt7915_mcu_set_sta_ht_mcs(sta, ra->ht_mcs,
1601 mask->control[band].ht_mcs);
1602 ra->supp_ht_mcs = *(__le32 *)ra->ht_mcs;
1605 if (sta->vht_cap.vht_supported) {
1608 ra->supp_mode |= MODE_VHT;
1609 af = FIELD_GET(IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK,
1611 ra->af = max_t(u8, ra->af, af);
1614 if (sta->vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_80)
1615 cap |= STA_CAP_VHT_SGI_80;
1616 if (sta->vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_160)
1617 cap |= STA_CAP_VHT_SGI_160;
1618 if (sta->vht_cap.cap & IEEE80211_VHT_CAP_TXSTBC)
1619 cap |= STA_CAP_VHT_TX_STBC;
1620 if (sta->vht_cap.cap & IEEE80211_VHT_CAP_RXSTBC_1)
1621 cap |= STA_CAP_VHT_RX_STBC;
1622 if (mvif->cap.vht_ldpc &&
1623 (sta->vht_cap.cap & IEEE80211_VHT_CAP_RXLDPC))
1624 cap |= STA_CAP_VHT_LDPC;
1626 mt7915_mcu_set_sta_vht_mcs(sta, ra->supp_vht_mcs,
1627 mask->control[band].vht_mcs);
1630 if (sta->he_cap.has_he) {
1631 ra->supp_mode |= MODE_HE;
1634 if (sta->he_6ghz_capa.capa)
1635 ra->af = le16_get_bits(sta->he_6ghz_capa.capa,
1636 IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP);
1639 ra->sta_cap = cpu_to_le32(cap);
1642 int mt7915_mcu_add_rate_ctrl(struct mt7915_dev *dev, struct ieee80211_vif *vif,
1643 struct ieee80211_sta *sta, bool changed)
1645 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1646 struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
1647 struct sk_buff *skb;
1650 skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
1653 return PTR_ERR(skb);
1655 /* firmware rc algorithm refers to sta_rec_he for HE control.
1656 * once dev->rc_work changes the settings driver should also
1657 * update sta_rec_he here.
1660 mt7915_mcu_sta_he_tlv(skb, sta, vif);
1662 /* sta_rec_ra accommodates BW, NSS and only MCS range format
1663 * i.e 0-{7,8,9} for VHT.
1665 mt7915_mcu_sta_rate_ctrl_tlv(skb, dev, vif, sta);
1667 ret = mt76_mcu_skb_send_msg(&dev->mt76, skb,
1668 MCU_EXT_CMD(STA_REC_UPDATE), true);
1672 /* sta_rec_ra_fixed accommodates single rate, (HE)GI and HE_LTE,
1673 * and updates as peer fixed rate parameters, which overrides
1674 * sta_rec_ra and firmware rate control algorithm.
1676 return mt7915_mcu_add_rate_ctrl_fixed(dev, vif, sta);
1680 mt7915_mcu_add_group(struct mt7915_dev *dev, struct ieee80211_vif *vif,
1681 struct ieee80211_sta *sta)
1683 #define MT_STA_BSS_GROUP 1
1684 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1685 struct mt7915_sta *msta;
1695 .action = cpu_to_le32(MT_STA_BSS_GROUP),
1696 .val = cpu_to_le32(mvif->mt76.idx % 16),
1699 msta = sta ? (struct mt7915_sta *)sta->drv_priv : &mvif->sta;
1700 req.wlan_idx_lo = to_wcid_lo(msta->wcid.idx);
1701 req.wlan_idx_hi = to_wcid_hi(msta->wcid.idx);
1703 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_DRR_CTRL), &req,
1707 int mt7915_mcu_add_sta(struct mt7915_dev *dev, struct ieee80211_vif *vif,
1708 struct ieee80211_sta *sta, bool enable)
1710 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1711 struct mt7915_sta *msta;
1712 struct sk_buff *skb;
1715 msta = sta ? (struct mt7915_sta *)sta->drv_priv : &mvif->sta;
1717 skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
1720 return PTR_ERR(skb);
1723 mt76_connac_mcu_sta_basic_tlv(skb, vif, sta, enable, true);
1727 /* tag order is in accordance with firmware dependency. */
1730 mt7915_mcu_sta_bfer_tlv(dev, skb, vif, sta);
1732 mt7915_mcu_sta_ht_tlv(skb, sta);
1734 mt7915_mcu_sta_vht_tlv(skb, sta);
1736 mt76_connac_mcu_sta_uapsd(skb, vif, sta);
1739 ret = mt7915_mcu_sta_wtbl_tlv(dev, skb, vif, sta);
1747 mt7915_mcu_sta_amsdu_tlv(dev, skb, vif, sta);
1749 mt7915_mcu_sta_he_tlv(skb, sta, vif);
1751 mt7915_mcu_sta_muru_tlv(skb, sta, vif);
1753 mt7915_mcu_sta_bfee_tlv(dev, skb, vif, sta);
1756 ret = mt7915_mcu_add_group(dev, vif, sta);
1762 return mt76_mcu_skb_send_msg(&dev->mt76, skb,
1763 MCU_EXT_CMD(STA_REC_UPDATE), true);
1766 int mt7915_mcu_add_dev_info(struct mt7915_phy *phy,
1767 struct ieee80211_vif *vif, bool enable)
1769 struct mt7915_dev *dev = phy->dev;
1770 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1784 u8 omac_addr[ETH_ALEN];
1788 .omac_idx = mvif->mt76.omac_idx,
1789 .dbdc_idx = mvif->mt76.band_idx,
1790 .tlv_num = cpu_to_le16(1),
1794 .tag = cpu_to_le16(DEV_INFO_ACTIVE),
1795 .len = cpu_to_le16(sizeof(struct req_tlv)),
1797 .dbdc_idx = mvif->mt76.band_idx,
1801 if (mvif->mt76.omac_idx >= REPEATER_BSSID_START)
1802 return mt7915_mcu_muar_config(phy, vif, false, enable);
1804 memcpy(data.tlv.omac_addr, vif->addr, ETH_ALEN);
1805 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(DEV_INFO_UPDATE),
1806 &data, sizeof(data), true);
1810 mt7915_mcu_beacon_cntdwn(struct ieee80211_vif *vif, struct sk_buff *rskb,
1811 struct sk_buff *skb, struct bss_info_bcn *bcn,
1812 struct ieee80211_mutable_offsets *offs)
1814 struct bss_info_bcn_cntdwn *info;
1818 if (!offs->cntdwn_counter_offs[0])
1821 sub_tag = vif->csa_active ? BSS_INFO_BCN_CSA : BSS_INFO_BCN_BCC;
1822 tlv = mt7915_mcu_add_nested_subtlv(rskb, sub_tag, sizeof(*info),
1823 &bcn->sub_ntlv, &bcn->len);
1824 info = (struct bss_info_bcn_cntdwn *)tlv;
1825 info->cnt = skb->data[offs->cntdwn_counter_offs[0]];
1829 mt7915_mcu_beacon_mbss(struct sk_buff *rskb, struct sk_buff *skb,
1830 struct ieee80211_vif *vif, struct bss_info_bcn *bcn,
1831 struct ieee80211_mutable_offsets *offs)
1833 struct bss_info_bcn_mbss *mbss;
1834 const struct element *elem;
1837 if (!vif->bss_conf.bssid_indicator)
1840 tlv = mt7915_mcu_add_nested_subtlv(rskb, BSS_INFO_BCN_MBSSID,
1841 sizeof(*mbss), &bcn->sub_ntlv,
1844 mbss = (struct bss_info_bcn_mbss *)tlv;
1845 mbss->offset[0] = cpu_to_le16(offs->tim_offset);
1846 mbss->bitmap = cpu_to_le32(1);
1848 for_each_element_id(elem, WLAN_EID_MULTIPLE_BSSID,
1849 &skb->data[offs->mbssid_off],
1850 skb->len - offs->mbssid_off) {
1851 const struct element *sub_elem;
1853 if (elem->datalen < 2)
1856 for_each_element(sub_elem, elem->data + 1, elem->datalen - 1) {
1857 const struct ieee80211_bssid_index *idx;
1860 if (sub_elem->id || sub_elem->datalen < 4)
1861 continue; /* not a valid BSS profile */
1863 /* Find WLAN_EID_MULTI_BSSID_IDX
1864 * in the merged nontransmitted profile
1866 idx_ie = cfg80211_find_ie(WLAN_EID_MULTI_BSSID_IDX,
1869 if (!idx_ie || idx_ie[1] < sizeof(*idx))
1872 idx = (void *)(idx_ie + 2);
1873 if (!idx->bssid_index || idx->bssid_index > 31)
1876 mbss->offset[idx->bssid_index] =
1877 cpu_to_le16(idx_ie - skb->data);
1878 mbss->bitmap |= cpu_to_le32(BIT(idx->bssid_index));
1884 mt7915_mcu_beacon_cont(struct mt7915_dev *dev, struct ieee80211_vif *vif,
1885 struct sk_buff *rskb, struct sk_buff *skb,
1886 struct bss_info_bcn *bcn,
1887 struct ieee80211_mutable_offsets *offs)
1889 struct mt76_wcid *wcid = &dev->mt76.global_wcid;
1890 struct bss_info_bcn_cont *cont;
1893 int len = sizeof(*cont) + MT_TXD_SIZE + skb->len;
1895 tlv = mt7915_mcu_add_nested_subtlv(rskb, BSS_INFO_BCN_CONTENT,
1896 len, &bcn->sub_ntlv, &bcn->len);
1898 cont = (struct bss_info_bcn_cont *)tlv;
1899 cont->pkt_len = cpu_to_le16(MT_TXD_SIZE + skb->len);
1900 cont->tim_ofs = cpu_to_le16(offs->tim_offset);
1902 if (offs->cntdwn_counter_offs[0]) {
1903 u16 offset = offs->cntdwn_counter_offs[0];
1905 if (vif->csa_active)
1906 cont->csa_ofs = cpu_to_le16(offset - 4);
1907 if (vif->color_change_active)
1908 cont->bcc_ofs = cpu_to_le16(offset - 3);
1911 buf = (u8 *)tlv + sizeof(*cont);
1912 mt7915_mac_write_txwi(dev, (__le32 *)buf, skb, wcid, 0, NULL,
1914 memcpy(buf + MT_TXD_SIZE, skb->data, skb->len);
1918 mt7915_mcu_beacon_check_caps(struct mt7915_phy *phy, struct ieee80211_vif *vif,
1919 struct sk_buff *skb)
1921 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1922 struct mt7915_vif_cap *vc = &mvif->cap;
1923 const struct ieee80211_he_cap_elem *he;
1924 const struct ieee80211_vht_cap *vht;
1925 const struct ieee80211_ht_cap *ht;
1926 struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)skb->data;
1930 /* Check missing configuration options to allow AP mode in mac80211
1931 * to remain in sync with hostapd settings, and get a subset of
1932 * beacon and hardware capabilities.
1934 if (WARN_ON_ONCE(skb->len <= (mgmt->u.beacon.variable - skb->data)))
1937 memset(vc, 0, sizeof(*vc));
1939 len = skb->len - (mgmt->u.beacon.variable - skb->data);
1941 ie = cfg80211_find_ie(WLAN_EID_HT_CAPABILITY, mgmt->u.beacon.variable,
1943 if (ie && ie[1] >= sizeof(*ht)) {
1944 ht = (void *)(ie + 2);
1945 vc->ht_ldpc = !!(le16_to_cpu(ht->cap_info) &
1946 IEEE80211_HT_CAP_LDPC_CODING);
1949 ie = cfg80211_find_ie(WLAN_EID_VHT_CAPABILITY, mgmt->u.beacon.variable,
1951 if (ie && ie[1] >= sizeof(*vht)) {
1952 u32 pc = phy->mt76->sband_5g.sband.vht_cap.cap;
1954 vht = (void *)(ie + 2);
1955 bc = le32_to_cpu(vht->vht_cap_info);
1957 vc->vht_ldpc = !!(bc & IEEE80211_VHT_CAP_RXLDPC);
1959 (bc & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE) &&
1960 (pc & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE);
1962 (bc & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE) &&
1963 (pc & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE);
1965 (bc & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE) &&
1966 (pc & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE);
1968 (bc & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE) &&
1969 (pc & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE);
1972 ie = cfg80211_find_ext_ie(WLAN_EID_EXT_HE_CAPABILITY,
1973 mgmt->u.beacon.variable, len);
1974 if (ie && ie[1] >= sizeof(*he) + 1) {
1975 const struct ieee80211_sta_he_cap *pc =
1976 mt76_connac_get_he_phy_cap(phy->mt76, vif);
1977 const struct ieee80211_he_cap_elem *pe = &pc->he_cap_elem;
1979 he = (void *)(ie + 3);
1982 HE_PHY(CAP1_LDPC_CODING_IN_PAYLOAD, pe->phy_cap_info[1]);
1984 HE_PHY(CAP3_SU_BEAMFORMER, he->phy_cap_info[3]) &&
1985 HE_PHY(CAP3_SU_BEAMFORMER, pe->phy_cap_info[3]);
1987 HE_PHY(CAP4_SU_BEAMFORMEE, he->phy_cap_info[4]) &&
1988 HE_PHY(CAP4_SU_BEAMFORMEE, pe->phy_cap_info[4]);
1990 HE_PHY(CAP4_MU_BEAMFORMER, he->phy_cap_info[4]) &&
1991 HE_PHY(CAP4_MU_BEAMFORMER, pe->phy_cap_info[4]);
1995 int mt7915_mcu_add_beacon(struct ieee80211_hw *hw,
1996 struct ieee80211_vif *vif, int en)
1998 #define MAX_BEACON_SIZE 512
1999 struct mt7915_dev *dev = mt7915_hw_dev(hw);
2000 struct mt7915_phy *phy = mt7915_hw_phy(hw);
2001 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
2002 struct ieee80211_mutable_offsets offs;
2003 struct ieee80211_tx_info *info;
2004 struct sk_buff *skb, *rskb;
2006 struct bss_info_bcn *bcn;
2007 int len = MT7915_BEACON_UPDATE_SIZE + MAX_BEACON_SIZE;
2008 bool ext_phy = phy != &dev->phy;
2010 if (vif->bss_conf.nontransmitted)
2013 rskb = __mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
2016 return PTR_ERR(rskb);
2018 tlv = mt76_connac_mcu_add_tlv(rskb, BSS_INFO_OFFLOAD, sizeof(*bcn));
2019 bcn = (struct bss_info_bcn *)tlv;
2025 skb = ieee80211_beacon_get_template(hw, vif, &offs);
2029 if (skb->len > MAX_BEACON_SIZE - MT_TXD_SIZE) {
2030 dev_err(dev->mt76.dev, "Bcn size limit exceed\n");
2036 info = IEEE80211_SKB_CB(skb);
2037 info->hw_queue |= MT_TX_HW_QUEUE_EXT_PHY;
2040 mt7915_mcu_beacon_check_caps(phy, vif, skb);
2042 mt7915_mcu_beacon_cntdwn(vif, rskb, skb, bcn, &offs);
2043 mt7915_mcu_beacon_mbss(rskb, skb, vif, bcn, &offs);
2044 mt7915_mcu_beacon_cont(dev, vif, rskb, skb, bcn, &offs);
2048 return mt76_mcu_skb_send_msg(&phy->dev->mt76, rskb,
2049 MCU_EXT_CMD(BSS_INFO_UPDATE), true);
2052 static int mt7915_driver_own(struct mt7915_dev *dev, u8 band)
2054 mt76_wr(dev, MT_TOP_LPCR_HOST_BAND(band), MT_TOP_LPCR_HOST_DRV_OWN);
2055 if (!mt76_poll_msec(dev, MT_TOP_LPCR_HOST_BAND(band),
2056 MT_TOP_LPCR_HOST_FW_OWN_STAT, 0, 500)) {
2057 dev_err(dev->mt76.dev, "Timeout for driver own\n");
2061 /* clear irq when the driver own success */
2062 mt76_wr(dev, MT_TOP_LPCR_HOST_BAND_IRQ_STAT(band),
2063 MT_TOP_LPCR_HOST_BAND_STAT);
2068 static int mt7915_load_patch(struct mt7915_dev *dev)
2070 const struct mt7915_patch_hdr *hdr;
2071 const struct firmware *fw = NULL;
2074 sem = mt76_connac_mcu_patch_sem_ctrl(&dev->mt76, 1);
2078 case PATCH_NOT_DL_SEM_SUCCESS:
2081 dev_err(dev->mt76.dev, "Failed to get patch semaphore\n");
2085 ret = request_firmware(&fw, fw_name_var(dev, ROM_PATCH),
2090 if (!fw || !fw->data || fw->size < sizeof(*hdr)) {
2091 dev_err(dev->mt76.dev, "Invalid firmware\n");
2096 hdr = (const struct mt7915_patch_hdr *)(fw->data);
2098 dev_info(dev->mt76.dev, "HW/SW Version: 0x%x, Build Time: %.16s\n",
2099 be32_to_cpu(hdr->hw_sw_ver), hdr->build_date);
2101 for (i = 0; i < be32_to_cpu(hdr->desc.n_region); i++) {
2102 struct mt7915_patch_sec *sec;
2106 sec = (struct mt7915_patch_sec *)(fw->data + sizeof(*hdr) +
2108 if ((be32_to_cpu(sec->type) & PATCH_SEC_TYPE_MASK) !=
2109 PATCH_SEC_TYPE_INFO) {
2114 addr = be32_to_cpu(sec->info.addr);
2115 len = be32_to_cpu(sec->info.len);
2116 dl = fw->data + be32_to_cpu(sec->offs);
2118 ret = mt76_connac_mcu_init_download(&dev->mt76, addr, len,
2121 dev_err(dev->mt76.dev, "Download request failed\n");
2125 ret = __mt76_mcu_send_firmware(&dev->mt76, MCU_CMD(FW_SCATTER),
2128 dev_err(dev->mt76.dev, "Failed to send patch\n");
2133 ret = mt76_connac_mcu_start_patch(&dev->mt76);
2135 dev_err(dev->mt76.dev, "Failed to start patch\n");
2138 sem = mt76_connac_mcu_patch_sem_ctrl(&dev->mt76, 0);
2140 case PATCH_REL_SEM_SUCCESS:
2144 dev_err(dev->mt76.dev, "Failed to release patch semaphore\n");
2147 release_firmware(fw);
2153 mt7915_mcu_send_ram_firmware(struct mt7915_dev *dev,
2154 const struct mt7915_fw_trailer *hdr,
2155 const u8 *data, bool is_wa)
2158 u32 override = 0, option = 0;
2160 for (i = 0; i < hdr->n_region; i++) {
2161 const struct mt7915_fw_region *region;
2163 u32 len, addr, mode;
2165 region = (const struct mt7915_fw_region *)((const u8 *)hdr -
2166 (hdr->n_region - i) * sizeof(*region));
2167 mode = mt76_connac_mcu_gen_dl_mode(&dev->mt76,
2168 region->feature_set, is_wa);
2169 len = le32_to_cpu(region->len);
2170 addr = le32_to_cpu(region->addr);
2172 if (region->feature_set & FW_FEATURE_OVERRIDE_ADDR)
2175 err = mt76_connac_mcu_init_download(&dev->mt76, addr, len,
2178 dev_err(dev->mt76.dev, "Download request failed\n");
2182 err = __mt76_mcu_send_firmware(&dev->mt76, MCU_CMD(FW_SCATTER),
2183 data + offset, len, 4096);
2185 dev_err(dev->mt76.dev, "Failed to send firmware.\n");
2193 option |= FW_START_OVERRIDE;
2196 option |= FW_START_WORKING_PDA_CR4;
2198 return mt76_connac_mcu_start_firmware(&dev->mt76, override, option);
2201 static int mt7915_load_ram(struct mt7915_dev *dev)
2203 const struct mt7915_fw_trailer *hdr;
2204 const struct firmware *fw;
2207 ret = request_firmware(&fw, fw_name_var(dev, FIRMWARE_WM),
2212 if (!fw || !fw->data || fw->size < sizeof(*hdr)) {
2213 dev_err(dev->mt76.dev, "Invalid firmware\n");
2218 hdr = (const struct mt7915_fw_trailer *)(fw->data + fw->size -
2221 dev_info(dev->mt76.dev, "WM Firmware Version: %.10s, Build Time: %.15s\n",
2222 hdr->fw_ver, hdr->build_date);
2224 ret = mt7915_mcu_send_ram_firmware(dev, hdr, fw->data, false);
2226 dev_err(dev->mt76.dev, "Failed to start WM firmware\n");
2230 release_firmware(fw);
2232 ret = request_firmware(&fw, fw_name(dev, FIRMWARE_WA),
2237 if (!fw || !fw->data || fw->size < sizeof(*hdr)) {
2238 dev_err(dev->mt76.dev, "Invalid firmware\n");
2243 hdr = (const struct mt7915_fw_trailer *)(fw->data + fw->size -
2246 dev_info(dev->mt76.dev, "WA Firmware Version: %.10s, Build Time: %.15s\n",
2247 hdr->fw_ver, hdr->build_date);
2249 ret = mt7915_mcu_send_ram_firmware(dev, hdr, fw->data, true);
2251 dev_err(dev->mt76.dev, "Failed to start WA firmware\n");
2255 snprintf(dev->mt76.hw->wiphy->fw_version,
2256 sizeof(dev->mt76.hw->wiphy->fw_version),
2257 "%.10s-%.15s", hdr->fw_ver, hdr->build_date);
2260 release_firmware(fw);
2266 mt7915_firmware_state(struct mt7915_dev *dev, bool wa)
2268 u32 state = FIELD_PREP(MT_TOP_MISC_FW_STATE,
2269 wa ? FW_STATE_RDY : FW_STATE_FW_DOWNLOAD);
2271 if (!mt76_poll_msec(dev, MT_TOP_MISC, MT_TOP_MISC_FW_STATE,
2273 dev_err(dev->mt76.dev, "Timeout for initializing firmware\n");
2279 static int mt7915_load_firmware(struct mt7915_dev *dev)
2283 /* make sure fw is download state */
2284 if (mt7915_firmware_state(dev, false)) {
2285 /* restart firmware once */
2286 __mt76_mcu_restart(&dev->mt76);
2287 ret = mt7915_firmware_state(dev, false);
2289 dev_err(dev->mt76.dev,
2290 "Firmware is not ready for download\n");
2295 ret = mt7915_load_patch(dev);
2299 ret = mt7915_load_ram(dev);
2303 ret = mt7915_firmware_state(dev, true);
2307 mt76_queue_tx_cleanup(dev, dev->mt76.q_mcu[MT_MCUQ_FWDL], false);
2309 dev_dbg(dev->mt76.dev, "Firmware init done\n");
2314 int mt7915_mcu_fw_log_2_host(struct mt7915_dev *dev, u8 type, u8 ctrl)
2323 if (type == MCU_FW_LOG_WA)
2324 return mt76_mcu_send_msg(&dev->mt76, MCU_WA_EXT_CMD(FW_LOG_2_HOST),
2325 &data, sizeof(data), true);
2327 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(FW_LOG_2_HOST), &data,
2328 sizeof(data), true);
2331 int mt7915_mcu_fw_dbg_ctrl(struct mt7915_dev *dev, u32 module, u8 level)
2341 .module_idx = cpu_to_le32(module),
2345 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(FW_DBG_CTRL), &data,
2346 sizeof(data), false);
2349 int mt7915_mcu_muru_debug_set(struct mt7915_dev *dev, bool enabled)
2355 .cmd = cpu_to_le32(MURU_SET_TXC_TX_STATS_EN),
2359 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(MURU_CTRL), &data,
2360 sizeof(data), false);
2363 int mt7915_mcu_muru_debug_get(struct mt7915_phy *phy, void *ms)
2365 struct mt7915_dev *dev = phy->dev;
2366 struct sk_buff *skb;
2367 struct mt7915_mcu_muru_stats *mu_stats =
2368 (struct mt7915_mcu_muru_stats *)ms;
2375 .cmd = cpu_to_le32(MURU_GET_TXC_TX_STATS),
2376 .band_idx = phy->band_idx,
2379 ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_EXT_CMD(MURU_CTRL),
2380 &req, sizeof(req), true, &skb);
2384 memcpy(mu_stats, skb->data, sizeof(struct mt7915_mcu_muru_stats));
2390 static int mt7915_mcu_set_mwds(struct mt7915_dev *dev, bool enabled)
2399 return mt76_mcu_send_msg(&dev->mt76, MCU_WA_EXT_CMD(MWDS_SUPPORT), &req,
2400 sizeof(req), false);
2403 int mt7915_mcu_set_muru_ctrl(struct mt7915_dev *dev, u32 cmd, u32 val)
2409 .cmd = cpu_to_le32(cmd),
2412 put_unaligned_le32(val, req.val);
2414 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(MURU_CTRL), &req,
2415 sizeof(req), false);
2419 mt7915_mcu_init_rx_airtime(struct mt7915_dev *dev)
2421 #define RX_AIRTIME_FEATURE_CTRL 1
2422 #define RX_AIRTIME_BITWISE_CTRL 2
2423 #define RX_AIRTIME_CLEAR_EN 1
2440 .field = cpu_to_le16(RX_AIRTIME_BITWISE_CTRL),
2441 .sub_field = cpu_to_le16(RX_AIRTIME_CLEAR_EN),
2442 .airtime_clear = true,
2446 ret = mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(RX_AIRTIME_CTRL), &req,
2451 req.field = cpu_to_le16(RX_AIRTIME_FEATURE_CTRL);
2452 req.sub_field = cpu_to_le16(RX_AIRTIME_CLEAR_EN);
2453 req.airtime_en = true;
2455 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(RX_AIRTIME_CTRL), &req,
2459 int mt7915_mcu_init(struct mt7915_dev *dev)
2461 static const struct mt76_mcu_ops mt7915_mcu_ops = {
2462 .headroom = sizeof(struct mt7915_mcu_txd),
2463 .mcu_skb_send_msg = mt7915_mcu_send_message,
2464 .mcu_parse_response = mt7915_mcu_parse_response,
2465 .mcu_restart = mt76_connac_mcu_restart,
2469 dev->mt76.mcu_ops = &mt7915_mcu_ops;
2471 /* force firmware operation mode into normal state,
2472 * which should be set before firmware download stage.
2474 if (is_mt7915(&dev->mt76))
2475 mt76_wr(dev, MT_SWDEF_MODE, MT_SWDEF_NORMAL_MODE);
2477 mt76_wr(dev, MT_SWDEF_MODE_MT7916, MT_SWDEF_NORMAL_MODE);
2479 ret = mt7915_driver_own(dev, 0);
2482 /* set driver own for band1 when two hif exist */
2484 ret = mt7915_driver_own(dev, 1);
2489 ret = mt7915_load_firmware(dev);
2493 set_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state);
2494 ret = mt7915_mcu_fw_log_2_host(dev, MCU_FW_LOG_WM, 0);
2498 ret = mt7915_mcu_fw_log_2_host(dev, MCU_FW_LOG_WA, 0);
2502 ret = mt7915_mcu_set_mwds(dev, 1);
2506 ret = mt7915_mcu_set_muru_ctrl(dev, MURU_SET_PLATFORM_TYPE,
2507 MURU_PLATFORM_TYPE_PERF_LEVEL_2);
2511 ret = mt7915_mcu_init_rx_airtime(dev);
2515 return mt7915_mcu_wa_cmd(dev, MCU_WA_PARAM_CMD(SET),
2516 MCU_WA_PARAM_RED, 0, 0);
2519 void mt7915_mcu_exit(struct mt7915_dev *dev)
2521 __mt76_mcu_restart(&dev->mt76);
2522 if (mt7915_firmware_state(dev, false)) {
2523 dev_err(dev->mt76.dev, "Failed to exit mcu\n");
2527 mt76_wr(dev, MT_TOP_LPCR_HOST_BAND(0), MT_TOP_LPCR_HOST_FW_OWN);
2529 mt76_wr(dev, MT_TOP_LPCR_HOST_BAND(1),
2530 MT_TOP_LPCR_HOST_FW_OWN);
2531 skb_queue_purge(&dev->mt76.mcu.res_q);
2535 mt7915_mcu_set_rx_hdr_trans_blacklist(struct mt7915_dev *dev, int band)
2548 .etype = cpu_to_le16(ETH_P_PAE),
2551 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(RX_HDR_TRANS),
2552 &req, sizeof(req), false);
2555 int mt7915_mcu_set_mac(struct mt7915_dev *dev, int band,
2556 bool enable, bool hdr_trans)
2567 } __packed req_trans = {
2568 .enable = hdr_trans,
2574 } __packed req_mac = {
2580 ret = mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(RX_HDR_TRANS),
2581 &req_trans, sizeof(req_trans), false);
2586 mt7915_mcu_set_rx_hdr_trans_blacklist(dev, band);
2588 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(MAC_INIT_CTRL),
2589 &req_mac, sizeof(req_mac), true);
2592 int mt7915_mcu_set_scs(struct mt7915_dev *dev, u8 band, bool enable)
2599 .cmd = cpu_to_le32(SCS_ENABLE),
2601 .enable = enable + 1,
2604 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SCS_CTRL), &req,
2605 sizeof(req), false);
2608 int mt7915_mcu_update_edca(struct mt7915_dev *dev, void *param)
2610 struct mt7915_mcu_tx *req = (struct mt7915_mcu_tx *)param;
2611 u8 num = req->total;
2612 size_t len = sizeof(*req) -
2613 (IEEE80211_NUM_ACS - num) * sizeof(struct edca);
2615 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(EDCA_UPDATE), req,
2619 int mt7915_mcu_set_tx(struct mt7915_dev *dev, struct ieee80211_vif *vif)
2621 #define TX_CMD_MODE 1
2622 struct mt7915_mcu_tx req = {
2624 .mode = TX_CMD_MODE,
2625 .total = IEEE80211_NUM_ACS,
2627 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
2630 for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
2631 struct ieee80211_tx_queue_params *q = &mvif->queue_params[ac];
2632 struct edca *e = &req.edca[ac];
2634 e->set = WMM_PARAM_SET;
2635 e->queue = ac + mvif->mt76.wmm_idx * MT7915_MAX_WMM_SETS;
2637 e->txop = cpu_to_le16(q->txop);
2640 e->cw_min = fls(q->cw_min);
2645 e->cw_max = cpu_to_le16(fls(q->cw_max));
2647 e->cw_max = cpu_to_le16(10);
2650 return mt7915_mcu_update_edca(dev, &req);
2653 int mt7915_mcu_set_fcc5_lpn(struct mt7915_dev *dev, int val)
2660 .tag = cpu_to_le32(0x1),
2661 .min_lpn = cpu_to_le16(val),
2664 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_RDD_TH), &req,
2668 int mt7915_mcu_set_pulse_th(struct mt7915_dev *dev,
2669 const struct mt7915_dfs_pulse *pulse)
2674 __le32 max_width; /* us */
2675 __le32 max_pwr; /* dbm */
2676 __le32 min_pwr; /* dbm */
2677 __le32 min_stgr_pri; /* us */
2678 __le32 max_stgr_pri; /* us */
2679 __le32 min_cr_pri; /* us */
2680 __le32 max_cr_pri; /* us */
2682 .tag = cpu_to_le32(0x3),
2684 #define __req_field(field) .field = cpu_to_le32(pulse->field)
2685 __req_field(max_width),
2686 __req_field(max_pwr),
2687 __req_field(min_pwr),
2688 __req_field(min_stgr_pri),
2689 __req_field(max_stgr_pri),
2690 __req_field(min_cr_pri),
2691 __req_field(max_cr_pri),
2695 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_RDD_TH), &req,
2699 int mt7915_mcu_set_radar_th(struct mt7915_dev *dev, int index,
2700 const struct mt7915_dfs_pattern *pattern)
2721 __le32 min_stgpr_diff;
2723 .tag = cpu_to_le32(0x2),
2724 .radar_type = cpu_to_le16(index),
2726 #define __req_field_u8(field) .field = pattern->field
2727 #define __req_field_u32(field) .field = cpu_to_le32(pattern->field)
2728 __req_field_u8(enb),
2729 __req_field_u8(stgr),
2730 __req_field_u8(min_crpn),
2731 __req_field_u8(max_crpn),
2732 __req_field_u8(min_crpr),
2733 __req_field_u8(min_pw),
2734 __req_field_u32(min_pri),
2735 __req_field_u32(max_pri),
2736 __req_field_u8(max_pw),
2737 __req_field_u8(min_crbn),
2738 __req_field_u8(max_crbn),
2739 __req_field_u8(min_stgpn),
2740 __req_field_u8(max_stgpn),
2741 __req_field_u8(min_stgpr),
2742 __req_field_u32(min_stgpr_diff),
2743 #undef __req_field_u8
2744 #undef __req_field_u32
2747 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_RDD_TH), &req,
2752 mt7915_mcu_background_chain_ctrl(struct mt7915_phy *phy,
2753 struct cfg80211_chan_def *chandef,
2756 struct mt7915_dev *dev = phy->dev;
2757 struct mt76_phy *mphy = phy->mt76;
2758 struct ieee80211_channel *chan = mphy->chandef.chan;
2759 int freq = mphy->chandef.center_freq1;
2760 struct mt7915_mcu_background_chain_ctrl req = {
2761 .monitor_scan_type = 2, /* simple rx */
2764 if (!chandef && cmd != CH_SWITCH_BACKGROUND_SCAN_STOP)
2767 if (!cfg80211_chandef_valid(&mphy->chandef))
2771 case CH_SWITCH_BACKGROUND_SCAN_START: {
2772 req.chan = chan->hw_value;
2773 req.central_chan = ieee80211_frequency_to_channel(freq);
2774 req.bw = mt76_connac_chan_bw(&mphy->chandef);
2775 req.monitor_chan = chandef->chan->hw_value;
2776 req.monitor_central_chan =
2777 ieee80211_frequency_to_channel(chandef->center_freq1);
2778 req.monitor_bw = mt76_connac_chan_bw(chandef);
2779 req.band_idx = phy != &dev->phy;
2783 case CH_SWITCH_BACKGROUND_SCAN_RUNNING:
2784 req.monitor_chan = chandef->chan->hw_value;
2785 req.monitor_central_chan =
2786 ieee80211_frequency_to_channel(chandef->center_freq1);
2787 req.band_idx = phy != &dev->phy;
2790 case CH_SWITCH_BACKGROUND_SCAN_STOP:
2791 req.chan = chan->hw_value;
2792 req.central_chan = ieee80211_frequency_to_channel(freq);
2793 req.bw = mt76_connac_chan_bw(&mphy->chandef);
2794 req.tx_stream = hweight8(mphy->antenna_mask);
2795 req.rx_stream = mphy->antenna_mask;
2800 req.band = chandef ? chandef->chan->band == NL80211_BAND_5GHZ : 1;
2802 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(OFFCH_SCAN_CTRL),
2803 &req, sizeof(req), false);
2806 int mt7915_mcu_rdd_background_enable(struct mt7915_phy *phy,
2807 struct cfg80211_chan_def *chandef)
2809 struct mt7915_dev *dev = phy->dev;
2812 if (!chandef) { /* disable offchain */
2813 err = mt76_connac_mcu_rdd_cmd(&dev->mt76, RDD_STOP, MT_RX_SEL2,
2818 return mt7915_mcu_background_chain_ctrl(phy, NULL,
2819 CH_SWITCH_BACKGROUND_SCAN_STOP);
2822 err = mt7915_mcu_background_chain_ctrl(phy, chandef,
2823 CH_SWITCH_BACKGROUND_SCAN_START);
2827 switch (dev->mt76.region) {
2828 case NL80211_DFS_ETSI:
2831 case NL80211_DFS_JP:
2834 case NL80211_DFS_FCC:
2840 return mt76_connac_mcu_rdd_cmd(&dev->mt76, RDD_START, MT_RX_SEL2,
2844 int mt7915_mcu_set_chan_info(struct mt7915_phy *phy, int cmd)
2846 static const u8 ch_band[] = {
2847 [NL80211_BAND_2GHZ] = 0,
2848 [NL80211_BAND_5GHZ] = 1,
2849 [NL80211_BAND_6GHZ] = 2,
2851 struct mt7915_dev *dev = phy->dev;
2852 struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
2853 int freq1 = chandef->center_freq1;
2859 u8 rx_streams; /* mask or num */
2862 u8 center_ch2; /* for 80+80 only */
2866 __le32 outband_freq;
2872 .control_ch = chandef->chan->hw_value,
2873 .center_ch = ieee80211_frequency_to_channel(freq1),
2874 .bw = mt76_connac_chan_bw(chandef),
2875 .tx_streams_num = hweight8(phy->mt76->antenna_mask),
2876 .rx_streams = phy->mt76->antenna_mask,
2877 .band_idx = phy->band_idx,
2878 .channel_band = ch_band[chandef->chan->band],
2881 #ifdef CONFIG_NL80211_TESTMODE
2882 if (phy->mt76->test.tx_antenna_mask &&
2883 (phy->mt76->test.state == MT76_TM_STATE_TX_FRAMES ||
2884 phy->mt76->test.state == MT76_TM_STATE_RX_FRAMES ||
2885 phy->mt76->test.state == MT76_TM_STATE_TX_CONT)) {
2886 req.tx_streams_num = fls(phy->mt76->test.tx_antenna_mask);
2887 req.rx_streams = phy->mt76->test.tx_antenna_mask;
2889 if (phy != &dev->phy)
2890 req.rx_streams >>= dev->chainshift;
2894 if (cmd == MCU_EXT_CMD(SET_RX_PATH) ||
2895 dev->mt76.hw->conf.flags & IEEE80211_CONF_MONITOR)
2896 req.switch_reason = CH_SWITCH_NORMAL;
2897 else if (phy->mt76->hw->conf.flags & IEEE80211_CONF_OFFCHANNEL)
2898 req.switch_reason = CH_SWITCH_SCAN_BYPASS_DPD;
2899 else if (!cfg80211_reg_can_beacon(phy->mt76->hw->wiphy, chandef,
2901 req.switch_reason = CH_SWITCH_DFS;
2903 req.switch_reason = CH_SWITCH_NORMAL;
2905 if (cmd == MCU_EXT_CMD(CHANNEL_SWITCH))
2906 req.rx_streams = hweight8(req.rx_streams);
2908 if (chandef->width == NL80211_CHAN_WIDTH_80P80) {
2909 int freq2 = chandef->center_freq2;
2911 req.center_ch2 = ieee80211_frequency_to_channel(freq2);
2914 return mt76_mcu_send_msg(&dev->mt76, cmd, &req, sizeof(req), true);
2917 static int mt7915_mcu_set_eeprom_flash(struct mt7915_dev *dev)
2919 #define MAX_PAGE_IDX_MASK GENMASK(7, 5)
2920 #define PAGE_IDX_MASK GENMASK(4, 2)
2921 #define PER_PAGE_SIZE 0x400
2922 struct mt7915_mcu_eeprom req = { .buffer_mode = EE_MODE_BUFFER };
2923 u16 eeprom_size = mt7915_eeprom_size(dev);
2924 u8 total = DIV_ROUND_UP(eeprom_size, PER_PAGE_SIZE);
2925 u8 *eep = (u8 *)dev->mt76.eeprom.data;
2929 for (i = 0; i < total; i++, eep += eep_len) {
2930 struct sk_buff *skb;
2933 if (i == total - 1 && !!(eeprom_size % PER_PAGE_SIZE))
2934 eep_len = eeprom_size % PER_PAGE_SIZE;
2936 eep_len = PER_PAGE_SIZE;
2938 skb = mt76_mcu_msg_alloc(&dev->mt76, NULL,
2939 sizeof(req) + eep_len);
2943 req.format = FIELD_PREP(MAX_PAGE_IDX_MASK, total - 1) |
2944 FIELD_PREP(PAGE_IDX_MASK, i) | EE_FORMAT_WHOLE;
2945 req.len = cpu_to_le16(eep_len);
2947 skb_put_data(skb, &req, sizeof(req));
2948 skb_put_data(skb, eep, eep_len);
2950 ret = mt76_mcu_skb_send_msg(&dev->mt76, skb,
2951 MCU_EXT_CMD(EFUSE_BUFFER_MODE), true);
2959 int mt7915_mcu_set_eeprom(struct mt7915_dev *dev)
2961 struct mt7915_mcu_eeprom req = {
2962 .buffer_mode = EE_MODE_EFUSE,
2963 .format = EE_FORMAT_WHOLE,
2966 if (dev->flash_mode)
2967 return mt7915_mcu_set_eeprom_flash(dev);
2969 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(EFUSE_BUFFER_MODE),
2970 &req, sizeof(req), true);
2973 int mt7915_mcu_get_eeprom(struct mt7915_dev *dev, u32 offset)
2975 struct mt7915_mcu_eeprom_info req = {
2976 .addr = cpu_to_le32(round_down(offset,
2977 MT7915_EEPROM_BLOCK_SIZE)),
2979 struct mt7915_mcu_eeprom_info *res;
2980 struct sk_buff *skb;
2984 ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_EXT_QUERY(EFUSE_ACCESS), &req,
2985 sizeof(req), true, &skb);
2989 res = (struct mt7915_mcu_eeprom_info *)skb->data;
2990 buf = dev->mt76.eeprom.data + le32_to_cpu(res->addr);
2991 memcpy(buf, res->data, MT7915_EEPROM_BLOCK_SIZE);
2997 int mt7915_mcu_get_eeprom_free_block(struct mt7915_dev *dev, u8 *block_num)
3007 struct sk_buff *skb;
3010 ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_EXT_QUERY(EFUSE_FREE_BLOCK), &req,
3011 sizeof(req), true, &skb);
3015 *block_num = *(u8 *)skb->data;
3021 static int mt7915_mcu_set_pre_cal(struct mt7915_dev *dev, u8 idx,
3022 u8 *data, u32 len, int cmd)
3035 struct sk_buff *skb;
3037 skb = mt76_mcu_msg_alloc(&dev->mt76, NULL, sizeof(req) + len);
3042 req.len = cpu_to_le32(len);
3043 skb_put_data(skb, &req, sizeof(req));
3044 skb_put_data(skb, data, len);
3046 return mt76_mcu_skb_send_msg(&dev->mt76, skb, cmd, false);
3049 int mt7915_mcu_apply_group_cal(struct mt7915_dev *dev)
3051 u8 idx = 0, *cal = dev->cal, *eep = dev->mt76.eeprom.data;
3052 u32 total = MT_EE_CAL_GROUP_SIZE;
3054 if (!(eep[MT_EE_DO_PRE_CAL] & MT_EE_WIFI_CAL_GROUP))
3058 * Items: Rx DCOC, RSSI DCOC, Tx TSSI DCOC, Tx LPFG
3059 * Tx FDIQ, Tx DCIQ, Rx FDIQ, Rx FIIQ, ADCDCOC
3064 len = min_t(u32, total, MT_EE_CAL_UNIT);
3066 ret = mt7915_mcu_set_pre_cal(dev, idx, cal, len,
3067 MCU_EXT_CMD(GROUP_PRE_CAL_INFO));
3079 static int mt7915_find_freq_idx(const u16 *freqs, int n_freqs, u16 cur)
3083 for (i = 0; i < n_freqs; i++)
3084 if (cur == freqs[i])
3090 static int mt7915_dpd_freq_idx(u16 freq, u8 bw)
3092 static const u16 freq_list[] = {
3093 5180, 5200, 5220, 5240,
3094 5260, 5280, 5300, 5320,
3095 5500, 5520, 5540, 5560,
3096 5580, 5600, 5620, 5640,
3097 5660, 5680, 5700, 5745,
3098 5765, 5785, 5805, 5825
3100 int offset_2g = ARRAY_SIZE(freq_list);
3107 return offset_2g + 1;
3109 return offset_2g + 2;
3112 if (bw == NL80211_CHAN_WIDTH_80P80 || bw == NL80211_CHAN_WIDTH_160)
3115 if (bw != NL80211_CHAN_WIDTH_20) {
3116 idx = mt7915_find_freq_idx(freq_list, ARRAY_SIZE(freq_list),
3121 idx = mt7915_find_freq_idx(freq_list, ARRAY_SIZE(freq_list),
3127 return mt7915_find_freq_idx(freq_list, ARRAY_SIZE(freq_list), freq);
3130 int mt7915_mcu_apply_tx_dpd(struct mt7915_phy *phy)
3132 struct mt7915_dev *dev = phy->dev;
3133 struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
3134 u16 total = 2, center_freq = chandef->center_freq1;
3135 u8 *cal = dev->cal, *eep = dev->mt76.eeprom.data;
3138 if (!(eep[MT_EE_DO_PRE_CAL] & MT_EE_WIFI_CAL_DPD))
3141 idx = mt7915_dpd_freq_idx(center_freq, chandef->width);
3145 /* Items: Tx DPD, Tx Flatness */
3147 cal += MT_EE_CAL_GROUP_SIZE;
3152 cal += (idx * MT_EE_CAL_UNIT);
3153 ret = mt7915_mcu_set_pre_cal(dev, idx, cal, MT_EE_CAL_UNIT,
3154 MCU_EXT_CMD(DPD_PRE_CAL_INFO));
3164 int mt7915_mcu_get_chan_mib_info(struct mt7915_phy *phy, bool chan_switch)
3167 static const u32 offs[] = {
3168 MIB_BUSY_TIME, MIB_TX_TIME, MIB_RX_TIME, MIB_OBSS_AIRTIME,
3169 MIB_BUSY_TIME_V2, MIB_TX_TIME_V2, MIB_RX_TIME_V2,
3172 struct mt76_channel_state *state = phy->mt76->chan_state;
3173 struct mt76_channel_state *state_ts = &phy->state_ts;
3174 struct mt7915_dev *dev = phy->dev;
3175 struct mt7915_mcu_mib *res, req[4];
3176 struct sk_buff *skb;
3177 int i, ret, start = 0, ofs = 20;
3179 if (!is_mt7915(&dev->mt76)) {
3184 for (i = 0; i < 4; i++) {
3185 req[i].band = cpu_to_le32(phy != &dev->phy);
3186 req[i].offs = cpu_to_le32(offs[i + start]);
3189 ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_EXT_CMD(GET_MIB_INFO),
3190 req, sizeof(req), true, &skb);
3194 res = (struct mt7915_mcu_mib *)(skb->data + ofs);
3199 #define __res_u64(s) le64_to_cpu(res[s].data)
3200 state->cc_busy += __res_u64(0) - state_ts->cc_busy;
3201 state->cc_tx += __res_u64(1) - state_ts->cc_tx;
3202 state->cc_bss_rx += __res_u64(2) - state_ts->cc_bss_rx;
3203 state->cc_rx += __res_u64(2) + __res_u64(3) - state_ts->cc_rx;
3206 state_ts->cc_busy = __res_u64(0);
3207 state_ts->cc_tx = __res_u64(1);
3208 state_ts->cc_bss_rx = __res_u64(2);
3209 state_ts->cc_rx = __res_u64(2) + __res_u64(3);
3217 int mt7915_mcu_get_temperature(struct mt7915_phy *phy)
3219 struct mt7915_dev *dev = phy->dev;
3226 .ctrl_id = THERMAL_SENSOR_TEMP_QUERY,
3227 .dbdc_idx = phy != &dev->phy,
3230 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(THERMAL_CTRL), &req,
3234 int mt7915_mcu_set_thermal_throttling(struct mt7915_phy *phy, u8 state)
3236 struct mt7915_dev *dev = phy->dev;
3238 struct mt7915_mcu_thermal_ctrl ctrl;
3240 __le32 trigger_temp;
3241 __le32 restore_temp;
3242 __le16 sustain_time;
3246 .band_idx = phy->band_idx,
3252 req.ctrl.ctrl_id = THERMAL_PROTECT_DISABLE;
3256 /* set duty cycle and level */
3257 for (level = 0; level < 4; level++) {
3260 req.ctrl.ctrl_id = THERMAL_PROTECT_DUTY_CONFIG;
3261 req.ctrl.duty.duty_level = level;
3262 req.ctrl.duty.duty_cycle = state;
3265 ret = mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(THERMAL_PROT),
3266 &req, sizeof(req.ctrl), false);
3271 /* set high-temperature trigger threshold */
3272 req.ctrl.ctrl_id = THERMAL_PROTECT_ENABLE;
3273 /* add a safety margin ~10 */
3274 req.restore_temp = cpu_to_le32(phy->throttle_temp[0] - 10);
3275 req.trigger_temp = cpu_to_le32(phy->throttle_temp[1]);
3276 req.sustain_time = cpu_to_le16(10);
3279 req.ctrl.type.protect_type = 1;
3280 req.ctrl.type.trigger_type = 1;
3282 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(THERMAL_PROT),
3283 &req, sizeof(req), false);
3286 int mt7915_mcu_set_txpower_sku(struct mt7915_phy *phy)
3288 struct mt7915_dev *dev = phy->dev;
3289 struct mt76_phy *mphy = phy->mt76;
3290 struct ieee80211_hw *hw = mphy->hw;
3291 struct mt7915_sku_val {
3295 s8 val[MT7915_SKU_RATE_NUM];
3298 .dbdc_idx = phy != &dev->phy,
3300 struct mt76_power_limits limits_array;
3301 s8 *la = (s8 *)&limits_array;
3302 int i, idx, n_chains = hweight8(mphy->antenna_mask);
3303 int tx_power = hw->conf.power_level * 2;
3305 tx_power = mt76_get_sar_power(mphy, mphy->chandef.chan,
3307 tx_power -= mt76_tx_power_nss_delta(n_chains);
3308 tx_power = mt76_get_rate_power_limits(mphy, mphy->chandef.chan,
3309 &limits_array, tx_power);
3310 mphy->txpower_cur = tx_power;
3312 for (i = 0, idx = 0; i < ARRAY_SIZE(mt7915_sku_group_len); i++) {
3313 u8 mcs_num, len = mt7915_sku_group_len[i];
3316 if (i >= SKU_HT_BW20 && i <= SKU_VHT_BW160) {
3319 if (i == SKU_HT_BW20 || i == SKU_VHT_BW20)
3320 la = (s8 *)&limits_array + 12;
3325 for (j = 0; j < min_t(u8, mcs_num, len); j++)
3326 req.val[idx + j] = la[j];
3332 return mt76_mcu_send_msg(&dev->mt76,
3333 MCU_EXT_CMD(TX_POWER_FEATURE_CTRL), &req,
3337 int mt7915_mcu_get_txpower_sku(struct mt7915_phy *phy, s8 *txpower, int len)
3339 #define RATE_POWER_INFO 2
3340 struct mt7915_dev *dev = phy->dev;
3348 .category = RATE_POWER_INFO,
3349 .band = phy != &dev->phy,
3351 s8 res[MT7915_SKU_RATE_NUM][2];
3352 struct sk_buff *skb;
3355 ret = mt76_mcu_send_and_get_msg(&dev->mt76,
3356 MCU_EXT_CMD(TX_POWER_FEATURE_CTRL),
3357 &req, sizeof(req), true, &skb);
3361 memcpy(res, skb->data + 4, sizeof(res));
3362 for (i = 0; i < len; i++)
3363 txpower[i] = res[i][req.band];
3370 int mt7915_mcu_set_test_param(struct mt7915_dev *dev, u8 param, bool test_mode,
3383 .test_mode_en = test_mode,
3388 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(ATE_CTRL), &req,
3389 sizeof(req), false);
3392 int mt7915_mcu_set_sku_en(struct mt7915_phy *phy, bool enable)
3394 struct mt7915_dev *dev = phy->dev;
3402 .dbdc_idx = phy != &dev->phy,
3403 .sku_enable = enable,
3406 return mt76_mcu_send_msg(&dev->mt76,
3407 MCU_EXT_CMD(TX_POWER_FEATURE_CTRL), &req,
3411 int mt7915_mcu_set_ser(struct mt7915_dev *dev, u8 action, u8 set, u8 band)
3424 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_SER_TRIGGER),
3425 &req, sizeof(req), false);
3428 int mt7915_mcu_set_txbf(struct mt7915_dev *dev, u8 action)
3438 __le32 snd_period; /* ms */
3456 #define MT_BF_PROCESSING 4
3458 case MT_BF_SOUNDING_ON:
3459 req.snd.snd_mode = MT_BF_PROCESSING;
3461 case MT_BF_TYPE_UPDATE:
3462 req.type.ebf = true;
3463 req.type.ibf = dev->ibf;
3465 case MT_BF_MODULE_UPDATE:
3467 req.mod.bf_bitmap = GENMASK(1, 0);
3473 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(TXBF_ACTION), &req,
3477 int mt7915_mcu_add_obss_spr(struct mt7915_dev *dev, struct ieee80211_vif *vif,
3480 #define MT_SPR_ENABLE 1
3481 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
3488 u8 sta_idx; /* 256 sta */
3492 .action = MT_SPR_ENABLE,
3494 .band_idx = mvif->mt76.band_idx,
3495 .val = cpu_to_le32(enable),
3498 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_SPR), &req,
3502 int mt7915_mcu_get_rx_rate(struct mt7915_phy *phy, struct ieee80211_vif *vif,
3503 struct ieee80211_sta *sta, struct rate_info *rate)
3505 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
3506 struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
3507 struct mt7915_dev *dev = phy->dev;
3508 struct mt76_phy *mphy = phy->mt76;
3514 .category = MCU_PHY_STATE_CONTENTION_RX_RATE,
3515 .band = mvif->mt76.band_idx,
3516 .wcid = cpu_to_le16(msta->wcid.idx),
3518 struct ieee80211_supported_band *sband;
3519 struct mt7915_mcu_phy_rx_info *res;
3520 struct sk_buff *skb;
3524 ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_EXT_CMD(PHY_STAT_INFO),
3525 &req, sizeof(req), true, &skb);
3529 res = (struct mt7915_mcu_phy_rx_info *)skb->data;
3531 rate->mcs = res->rate;
3532 rate->nss = res->nsts + 1;
3534 switch (res->mode) {
3535 case MT_PHY_TYPE_CCK:
3538 case MT_PHY_TYPE_OFDM:
3539 if (mphy->chandef.chan->band == NL80211_BAND_5GHZ)
3540 sband = &mphy->sband_5g.sband;
3541 else if (mphy->chandef.chan->band == NL80211_BAND_6GHZ)
3542 sband = &mphy->sband_6g.sband;
3544 sband = &mphy->sband_2g.sband;
3546 rate->mcs = mt76_get_rate(&dev->mt76, sband, rate->mcs, cck);
3547 rate->legacy = sband->bitrates[rate->mcs].bitrate;
3549 case MT_PHY_TYPE_HT:
3550 case MT_PHY_TYPE_HT_GF:
3551 if (rate->mcs > 31) {
3556 rate->flags = RATE_INFO_FLAGS_MCS;
3558 rate->flags |= RATE_INFO_FLAGS_SHORT_GI;
3560 case MT_PHY_TYPE_VHT:
3561 if (rate->mcs > 9) {
3566 rate->flags = RATE_INFO_FLAGS_VHT_MCS;
3568 rate->flags |= RATE_INFO_FLAGS_SHORT_GI;
3570 case MT_PHY_TYPE_HE_SU:
3571 case MT_PHY_TYPE_HE_EXT_SU:
3572 case MT_PHY_TYPE_HE_TB:
3573 case MT_PHY_TYPE_HE_MU:
3574 if (res->gi > NL80211_RATE_INFO_HE_GI_3_2 || rate->mcs > 11) {
3578 rate->he_gi = res->gi;
3579 rate->flags = RATE_INFO_FLAGS_HE_MCS;
3587 case IEEE80211_STA_RX_BW_160:
3588 rate->bw = RATE_INFO_BW_160;
3590 case IEEE80211_STA_RX_BW_80:
3591 rate->bw = RATE_INFO_BW_80;
3593 case IEEE80211_STA_RX_BW_40:
3594 rate->bw = RATE_INFO_BW_40;
3597 rate->bw = RATE_INFO_BW_20;
3607 int mt7915_mcu_update_bss_color(struct mt7915_dev *dev, struct ieee80211_vif *vif,
3608 struct cfg80211_he_bss_color *he_bss_color)
3610 int len = sizeof(struct sta_req_hdr) + sizeof(struct bss_info_color);
3611 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
3612 struct bss_info_color *bss_color;
3613 struct sk_buff *skb;
3616 skb = __mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
3619 return PTR_ERR(skb);
3621 tlv = mt76_connac_mcu_add_tlv(skb, BSS_INFO_BSS_COLOR,
3622 sizeof(*bss_color));
3623 bss_color = (struct bss_info_color *)tlv;
3624 bss_color->disable = !he_bss_color->enabled;
3625 bss_color->color = he_bss_color->color;
3627 return mt76_mcu_skb_send_msg(&dev->mt76, skb,
3628 MCU_EXT_CMD(BSS_INFO_UPDATE), true);
3631 #define TWT_AGRT_TRIGGER BIT(0)
3632 #define TWT_AGRT_ANNOUNCE BIT(1)
3633 #define TWT_AGRT_PROTECT BIT(2)
3635 int mt7915_mcu_twt_agrt_update(struct mt7915_dev *dev,
3636 struct mt7915_vif *mvif,
3637 struct mt7915_twt_flow *flow,
3644 u8 flowid; /* 0xff for group id */
3645 __le16 peer_id; /* specify the peer_id (msb=0)
3646 * or group_id (msb=1)
3648 u8 duration; /* 256 us */
3657 .tbl_idx = flow->table_id,
3659 .own_mac_idx = mvif->mt76.omac_idx,
3661 .peer_id = cpu_to_le16(flow->wcid),
3662 .duration = flow->duration,
3663 .bss_idx = mvif->mt76.idx,
3664 .start_tsf = cpu_to_le64(flow->tsf),
3665 .mantissa = flow->mantissa,
3666 .exponent = flow->exp,
3670 if (flow->protection)
3671 req.agrt_params |= TWT_AGRT_PROTECT;
3672 if (!flow->flowtype)
3673 req.agrt_params |= TWT_AGRT_ANNOUNCE;
3675 req.agrt_params |= TWT_AGRT_TRIGGER;
3677 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(TWT_AGRT_UPDATE),
3678 &req, sizeof(req), true);