1 // SPDX-License-Identifier: ISC
2 /* Copyright (C) 2020 MediaTek Inc. */
10 #define fw_name(_dev, name, ...) ({ \
12 switch (mt76_chip(&(_dev)->mt76)) { \
14 _fw = MT7915_##name; \
17 _fw = MT7981_##name; \
20 _fw = MT7986_##name##__VA_ARGS__; \
23 _fw = MT7916_##name; \
29 #define fw_name_var(_dev, name) (mt7915_check_adie(dev, false) ? \
30 fw_name(_dev, name) : \
31 fw_name(_dev, name, _MT7975))
33 #define MCU_PATCH_ADDRESS 0x200000
35 #define HE_PHY(p, c) u8_get_bits(c, IEEE80211_HE_PHY_##p)
36 #define HE_MAC(m, c) u8_get_bits(c, IEEE80211_HE_MAC_##m)
38 static bool sr_scene_detect
= true;
39 module_param(sr_scene_detect
, bool, 0644);
40 MODULE_PARM_DESC(sr_scene_detect
, "Enable firmware scene detection algorithm");
43 mt7915_mcu_get_sta_nss(u16 mcs_map
)
47 for (nss
= 8; nss
> 0; nss
--) {
48 u8 nss_mcs
= (mcs_map
>> (2 * (nss
- 1))) & 3;
50 if (nss_mcs
!= IEEE80211_VHT_MCS_NOT_SUPPORTED
)
58 mt7915_mcu_set_sta_he_mcs(struct ieee80211_sta
*sta
, __le16
*he_mcs
,
61 struct mt7915_sta
*msta
= (struct mt7915_sta
*)sta
->drv_priv
;
62 struct mt7915_dev
*dev
= msta
->vif
->phy
->dev
;
63 enum nl80211_band band
= msta
->vif
->phy
->mt76
->chandef
.chan
->band
;
64 const u16
*mask
= msta
->vif
->bitrate_mask
.control
[band
].he_mcs
;
65 int nss
, max_nss
= sta
->deflink
.rx_nss
> 3 ? 4 : sta
->deflink
.rx_nss
;
67 for (nss
= 0; nss
< max_nss
; nss
++) {
70 switch ((mcs_map
>> (2 * nss
)) & 0x3) {
71 case IEEE80211_HE_MCS_SUPPORT_0_11
:
74 case IEEE80211_HE_MCS_SUPPORT_0_9
:
77 case IEEE80211_HE_MCS_SUPPORT_0_7
:
84 mcs
= mcs
? fls(mcs
& mask
[nss
]) - 1 : -1;
88 mcs
= IEEE80211_HE_MCS_SUPPORT_0_7
;
91 mcs
= IEEE80211_HE_MCS_SUPPORT_0_9
;
94 mcs
= IEEE80211_HE_MCS_SUPPORT_0_11
;
97 mcs
= IEEE80211_HE_MCS_NOT_SUPPORTED
;
100 mcs_map
&= ~(0x3 << (nss
* 2));
101 mcs_map
|= mcs
<< (nss
* 2);
103 /* only support 2ss on 160MHz for mt7915 */
104 if (is_mt7915(&dev
->mt76
) && nss
> 1 &&
105 sta
->deflink
.bandwidth
== IEEE80211_STA_RX_BW_160
)
109 *he_mcs
= cpu_to_le16(mcs_map
);
113 mt7915_mcu_set_sta_vht_mcs(struct ieee80211_sta
*sta
, __le16
*vht_mcs
,
116 struct mt7915_sta
*msta
= (struct mt7915_sta
*)sta
->drv_priv
;
117 struct mt7915_dev
*dev
= msta
->vif
->phy
->dev
;
118 u16 mcs_map
= le16_to_cpu(sta
->deflink
.vht_cap
.vht_mcs
.rx_mcs_map
);
119 int nss
, max_nss
= sta
->deflink
.rx_nss
> 3 ? 4 : sta
->deflink
.rx_nss
;
122 for (nss
= 0; nss
< max_nss
; nss
++, mcs_map
>>= 2) {
123 switch (mcs_map
& 0x3) {
124 case IEEE80211_VHT_MCS_SUPPORT_0_9
:
127 case IEEE80211_VHT_MCS_SUPPORT_0_8
:
130 case IEEE80211_VHT_MCS_SUPPORT_0_7
:
137 vht_mcs
[nss
] = cpu_to_le16(mcs
& mask
[nss
]);
139 /* only support 2ss on 160MHz for mt7915 */
140 if (is_mt7915(&dev
->mt76
) && nss
> 1 &&
141 sta
->deflink
.bandwidth
== IEEE80211_STA_RX_BW_160
)
147 mt7915_mcu_set_sta_ht_mcs(struct ieee80211_sta
*sta
, u8
*ht_mcs
,
150 int nss
, max_nss
= sta
->deflink
.rx_nss
> 3 ? 4 : sta
->deflink
.rx_nss
;
152 for (nss
= 0; nss
< max_nss
; nss
++)
153 ht_mcs
[nss
] = sta
->deflink
.ht_cap
.mcs
.rx_mask
[nss
] & mask
[nss
];
157 mt7915_mcu_parse_response(struct mt76_dev
*mdev
, int cmd
,
158 struct sk_buff
*skb
, int seq
)
160 struct mt7915_dev
*dev
= container_of(mdev
, struct mt7915_dev
, mt76
);
161 struct mt76_connac2_mcu_rxd
*rxd
;
165 dev_err(mdev
->dev
, "Message %08x (seq %d) timeout\n",
168 if (!test_and_set_bit(MT76_MCU_RESET
, &dev
->mphy
.state
)) {
169 dev
->recovery
.restart
= true;
170 wake_up(&dev
->mt76
.mcu
.wait
);
171 queue_work(dev
->mt76
.wq
, &dev
->reset_work
);
172 wake_up(&dev
->reset_wait
);
178 rxd
= (struct mt76_connac2_mcu_rxd
*)skb
->data
;
179 if (seq
!= rxd
->seq
&&
180 !(rxd
->eid
== MCU_CMD_EXT_CID
&&
181 rxd
->ext_eid
== MCU_EXT_EVENT_WA_TX_STAT
))
184 if (cmd
== MCU_CMD(PATCH_SEM_CONTROL
)) {
185 skb_pull(skb
, sizeof(*rxd
) - 4);
187 } else if (cmd
== MCU_EXT_CMD(THERMAL_CTRL
)) {
188 skb_pull(skb
, sizeof(*rxd
) + 4);
189 ret
= le32_to_cpu(*(__le32
*)skb
->data
);
191 skb_pull(skb
, sizeof(struct mt76_connac2_mcu_rxd
));
198 mt7915_mcu_send_message(struct mt76_dev
*mdev
, struct sk_buff
*skb
,
199 int cmd
, int *wait_seq
)
201 struct mt7915_dev
*dev
= container_of(mdev
, struct mt7915_dev
, mt76
);
202 enum mt76_mcuq_id qid
;
204 if (cmd
== MCU_CMD(FW_SCATTER
))
206 else if (test_bit(MT76_STATE_MCU_RUNNING
, &dev
->mphy
.state
))
211 return mt76_tx_queue_skb_raw(dev
, mdev
->q_mcu
[qid
], skb
, 0);
214 int mt7915_mcu_wa_cmd(struct mt7915_dev
*dev
, int cmd
, u32 a1
, u32 a2
, u32 a3
)
226 return mt76_mcu_send_msg(&dev
->mt76
, cmd
, &req
, sizeof(req
), false);
230 mt7915_mcu_csa_finish(void *priv
, u8
*mac
, struct ieee80211_vif
*vif
)
232 if (!vif
->bss_conf
.csa_active
|| vif
->type
== NL80211_IFTYPE_STATION
)
235 ieee80211_csa_finish(vif
, 0);
239 mt7915_mcu_rx_csa_notify(struct mt7915_dev
*dev
, struct sk_buff
*skb
)
241 struct mt76_phy
*mphy
= &dev
->mt76
.phy
;
242 struct mt7915_mcu_csa_notify
*c
;
244 c
= (struct mt7915_mcu_csa_notify
*)skb
->data
;
246 if (c
->band_idx
> MT_BAND1
)
249 if ((c
->band_idx
&& !dev
->phy
.mt76
->band_idx
) &&
250 dev
->mt76
.phys
[MT_BAND1
])
251 mphy
= dev
->mt76
.phys
[MT_BAND1
];
253 ieee80211_iterate_active_interfaces_atomic(mphy
->hw
,
254 IEEE80211_IFACE_ITER_RESUME_ALL
,
255 mt7915_mcu_csa_finish
, mphy
->hw
);
259 mt7915_mcu_rx_thermal_notify(struct mt7915_dev
*dev
, struct sk_buff
*skb
)
261 struct mt76_phy
*mphy
= &dev
->mt76
.phy
;
262 struct mt7915_mcu_thermal_notify
*t
;
263 struct mt7915_phy
*phy
;
265 t
= (struct mt7915_mcu_thermal_notify
*)skb
->data
;
266 if (t
->ctrl
.ctrl_id
!= THERMAL_PROTECT_ENABLE
)
269 if (t
->ctrl
.band_idx
> MT_BAND1
)
272 if ((t
->ctrl
.band_idx
&& !dev
->phy
.mt76
->band_idx
) &&
273 dev
->mt76
.phys
[MT_BAND1
])
274 mphy
= dev
->mt76
.phys
[MT_BAND1
];
277 phy
->throttle_state
= t
->ctrl
.duty
.duty_cycle
;
281 mt7915_mcu_rx_radar_detected(struct mt7915_dev
*dev
, struct sk_buff
*skb
)
283 struct mt76_phy
*mphy
= &dev
->mt76
.phy
;
284 struct mt7915_mcu_rdd_report
*r
;
286 r
= (struct mt7915_mcu_rdd_report
*)skb
->data
;
288 if (r
->band_idx
> MT_RX_SEL2
)
291 if ((r
->band_idx
&& !dev
->phy
.mt76
->band_idx
) &&
292 dev
->mt76
.phys
[MT_BAND1
])
293 mphy
= dev
->mt76
.phys
[MT_BAND1
];
295 if (r
->band_idx
== MT_RX_SEL2
)
296 cfg80211_background_radar_event(mphy
->hw
->wiphy
,
300 ieee80211_radar_detected(mphy
->hw
, NULL
);
305 mt7915_mcu_rx_log_message(struct mt7915_dev
*dev
, struct sk_buff
*skb
)
307 struct mt76_connac2_mcu_rxd
*rxd
;
308 int len
= skb
->len
- sizeof(*rxd
);
309 const char *data
, *type
;
311 rxd
= (struct mt76_connac2_mcu_rxd
*)skb
->data
;
312 data
= (char *)&rxd
[1];
314 switch (rxd
->s2d_index
) {
316 if (mt7915_debugfs_rx_log(dev
, data
, len
))
329 wiphy_info(mt76_hw(dev
)->wiphy
, "%s: %.*s", type
, len
, data
);
333 mt7915_mcu_cca_finish(void *priv
, u8
*mac
, struct ieee80211_vif
*vif
)
335 if (!vif
->bss_conf
.color_change_active
|| vif
->type
== NL80211_IFTYPE_STATION
)
338 ieee80211_color_change_finish(vif
, 0);
342 mt7915_mcu_rx_bcc_notify(struct mt7915_dev
*dev
, struct sk_buff
*skb
)
344 struct mt76_phy
*mphy
= &dev
->mt76
.phy
;
345 struct mt7915_mcu_bcc_notify
*b
;
347 b
= (struct mt7915_mcu_bcc_notify
*)skb
->data
;
349 if (b
->band_idx
> MT_BAND1
)
352 if ((b
->band_idx
&& !dev
->phy
.mt76
->band_idx
) &&
353 dev
->mt76
.phys
[MT_BAND1
])
354 mphy
= dev
->mt76
.phys
[MT_BAND1
];
356 ieee80211_iterate_active_interfaces_atomic(mphy
->hw
,
357 IEEE80211_IFACE_ITER_RESUME_ALL
,
358 mt7915_mcu_cca_finish
, mphy
->hw
);
362 mt7915_mcu_rx_ext_event(struct mt7915_dev
*dev
, struct sk_buff
*skb
)
364 struct mt76_connac2_mcu_rxd
*rxd
;
366 rxd
= (struct mt76_connac2_mcu_rxd
*)skb
->data
;
367 switch (rxd
->ext_eid
) {
368 case MCU_EXT_EVENT_THERMAL_PROTECT
:
369 mt7915_mcu_rx_thermal_notify(dev
, skb
);
371 case MCU_EXT_EVENT_RDD_REPORT
:
372 mt7915_mcu_rx_radar_detected(dev
, skb
);
374 case MCU_EXT_EVENT_CSA_NOTIFY
:
375 mt7915_mcu_rx_csa_notify(dev
, skb
);
377 case MCU_EXT_EVENT_FW_LOG_2_HOST
:
378 mt7915_mcu_rx_log_message(dev
, skb
);
380 case MCU_EXT_EVENT_BCC_NOTIFY
:
381 mt7915_mcu_rx_bcc_notify(dev
, skb
);
389 mt7915_mcu_rx_unsolicited_event(struct mt7915_dev
*dev
, struct sk_buff
*skb
)
391 struct mt76_connac2_mcu_rxd
*rxd
;
393 rxd
= (struct mt76_connac2_mcu_rxd
*)skb
->data
;
396 mt7915_mcu_rx_ext_event(dev
, skb
);
404 void mt7915_mcu_rx_event(struct mt7915_dev
*dev
, struct sk_buff
*skb
)
406 struct mt76_connac2_mcu_rxd
*rxd
;
408 rxd
= (struct mt76_connac2_mcu_rxd
*)skb
->data
;
409 if ((rxd
->ext_eid
== MCU_EXT_EVENT_THERMAL_PROTECT
||
410 rxd
->ext_eid
== MCU_EXT_EVENT_FW_LOG_2_HOST
||
411 rxd
->ext_eid
== MCU_EXT_EVENT_ASSERT_DUMP
||
412 rxd
->ext_eid
== MCU_EXT_EVENT_PS_SYNC
||
413 rxd
->ext_eid
== MCU_EXT_EVENT_BCC_NOTIFY
||
415 !(rxd
->eid
== MCU_CMD_EXT_CID
&&
416 rxd
->ext_eid
== MCU_EXT_EVENT_WA_TX_STAT
))
417 mt7915_mcu_rx_unsolicited_event(dev
, skb
);
419 mt76_mcu_rx_event(&dev
->mt76
, skb
);
423 mt7915_mcu_add_nested_subtlv(struct sk_buff
*skb
, int sub_tag
, int sub_len
,
424 __le16
*sub_ntlv
, __le16
*len
)
426 struct tlv
*ptlv
, tlv
= {
427 .tag
= cpu_to_le16(sub_tag
),
428 .len
= cpu_to_le16(sub_len
),
431 ptlv
= skb_put_zero(skb
, sub_len
);
432 memcpy(ptlv
, &tlv
, sizeof(tlv
));
434 le16_add_cpu(sub_ntlv
, 1);
435 le16_add_cpu(len
, sub_len
);
441 struct mt7915_he_obss_narrow_bw_ru_data
{
445 static void mt7915_check_he_obss_narrow_bw_ru_iter(struct wiphy
*wiphy
,
446 struct cfg80211_bss
*bss
,
449 struct mt7915_he_obss_narrow_bw_ru_data
*data
= _data
;
450 const struct element
*elem
;
453 elem
= ieee80211_bss_get_elem(bss
, WLAN_EID_EXT_CAPABILITY
);
455 if (!elem
|| elem
->datalen
<= 10 ||
457 WLAN_EXT_CAPA10_OBSS_NARROW_BW_RU_TOLERANCE_SUPPORT
))
458 data
->tolerated
= false;
463 static bool mt7915_check_he_obss_narrow_bw_ru(struct ieee80211_hw
*hw
,
464 struct ieee80211_vif
*vif
)
466 struct mt7915_he_obss_narrow_bw_ru_data iter_data
= {
470 if (!(vif
->bss_conf
.chanreq
.oper
.chan
->flags
& IEEE80211_CHAN_RADAR
))
473 cfg80211_bss_iter(hw
->wiphy
, &vif
->bss_conf
.chanreq
.oper
,
474 mt7915_check_he_obss_narrow_bw_ru_iter
,
478 * If there is at least one AP on radar channel that cannot
479 * tolerate 26-tone RU UL OFDMA transmissions using HE TB PPDU.
481 return !iter_data
.tolerated
;
485 mt7915_mcu_bss_rfch_tlv(struct sk_buff
*skb
, struct ieee80211_vif
*vif
,
486 struct mt7915_phy
*phy
)
488 struct cfg80211_chan_def
*chandef
= &phy
->mt76
->chandef
;
489 struct bss_info_rf_ch
*ch
;
491 int freq1
= chandef
->center_freq1
;
493 tlv
= mt76_connac_mcu_add_tlv(skb
, BSS_INFO_RF_CH
, sizeof(*ch
));
495 ch
= (struct bss_info_rf_ch
*)tlv
;
496 ch
->pri_ch
= chandef
->chan
->hw_value
;
497 ch
->center_ch0
= ieee80211_frequency_to_channel(freq1
);
498 ch
->bw
= mt76_connac_chan_bw(chandef
);
500 if (chandef
->width
== NL80211_CHAN_WIDTH_80P80
) {
501 int freq2
= chandef
->center_freq2
;
503 ch
->center_ch1
= ieee80211_frequency_to_channel(freq2
);
506 if (vif
->bss_conf
.he_support
&& vif
->type
== NL80211_IFTYPE_STATION
) {
507 struct mt76_phy
*mphy
= phy
->mt76
;
510 mt7915_check_he_obss_narrow_bw_ru(mphy
->hw
, vif
);
511 ch
->he_all_disable
= false;
513 ch
->he_all_disable
= true;
518 mt7915_mcu_bss_ra_tlv(struct sk_buff
*skb
, struct ieee80211_vif
*vif
,
519 struct mt7915_phy
*phy
)
521 int max_nss
= hweight8(phy
->mt76
->antenna_mask
);
522 struct bss_info_ra
*ra
;
525 tlv
= mt76_connac_mcu_add_tlv(skb
, BSS_INFO_RA
, sizeof(*ra
));
527 ra
= (struct bss_info_ra
*)tlv
;
528 ra
->op_mode
= vif
->type
== NL80211_IFTYPE_AP
;
529 ra
->adhoc_en
= vif
->type
== NL80211_IFTYPE_ADHOC
;
530 ra
->short_preamble
= true;
531 ra
->tx_streams
= max_nss
;
532 ra
->rx_streams
= max_nss
;
534 ra
->train_up_rule
= 2;
535 ra
->train_up_high_thres
= 110;
536 ra
->train_up_rule_rssi
= -70;
537 ra
->low_traffic_thres
= 2;
538 ra
->phy_cap
= cpu_to_le32(0xfdf);
539 ra
->interval
= cpu_to_le32(500);
540 ra
->fast_interval
= cpu_to_le32(100);
544 mt7915_mcu_bss_he_tlv(struct sk_buff
*skb
, struct ieee80211_vif
*vif
,
545 struct mt7915_phy
*phy
)
547 #define DEFAULT_HE_PE_DURATION 4
548 #define DEFAULT_HE_DURATION_RTS_THRES 1023
549 const struct ieee80211_sta_he_cap
*cap
;
550 struct bss_info_he
*he
;
553 cap
= mt76_connac_get_he_phy_cap(phy
->mt76
, vif
);
555 tlv
= mt76_connac_mcu_add_tlv(skb
, BSS_INFO_HE_BASIC
, sizeof(*he
));
557 he
= (struct bss_info_he
*)tlv
;
558 he
->he_pe_duration
= vif
->bss_conf
.htc_trig_based_pkt_ext
;
559 if (!he
->he_pe_duration
)
560 he
->he_pe_duration
= DEFAULT_HE_PE_DURATION
;
562 he
->he_rts_thres
= cpu_to_le16(vif
->bss_conf
.frame_time_rts_th
);
563 if (!he
->he_rts_thres
)
564 he
->he_rts_thres
= cpu_to_le16(DEFAULT_HE_DURATION_RTS_THRES
);
566 he
->max_nss_mcs
[CMD_HE_MCS_BW80
] = cap
->he_mcs_nss_supp
.tx_mcs_80
;
567 he
->max_nss_mcs
[CMD_HE_MCS_BW160
] = cap
->he_mcs_nss_supp
.tx_mcs_160
;
568 he
->max_nss_mcs
[CMD_HE_MCS_BW8080
] = cap
->he_mcs_nss_supp
.tx_mcs_80p80
;
572 mt7915_mcu_bss_hw_amsdu_tlv(struct sk_buff
*skb
)
574 #define TXD_CMP_MAP1 GENMASK(15, 0)
575 #define TXD_CMP_MAP2 (GENMASK(31, 0) & ~BIT(23))
576 struct bss_info_hw_amsdu
*amsdu
;
579 tlv
= mt76_connac_mcu_add_tlv(skb
, BSS_INFO_HW_AMSDU
, sizeof(*amsdu
));
581 amsdu
= (struct bss_info_hw_amsdu
*)tlv
;
582 amsdu
->cmp_bitmap_0
= cpu_to_le32(TXD_CMP_MAP1
);
583 amsdu
->cmp_bitmap_1
= cpu_to_le32(TXD_CMP_MAP2
);
584 amsdu
->trig_thres
= cpu_to_le16(2);
585 amsdu
->enable
= true;
589 mt7915_mcu_bss_bmc_tlv(struct sk_buff
*skb
, struct mt7915_phy
*phy
)
591 struct bss_info_bmc_rate
*bmc
;
592 struct cfg80211_chan_def
*chandef
= &phy
->mt76
->chandef
;
593 enum nl80211_band band
= chandef
->chan
->band
;
596 tlv
= mt76_connac_mcu_add_tlv(skb
, BSS_INFO_BMC_RATE
, sizeof(*bmc
));
598 bmc
= (struct bss_info_bmc_rate
*)tlv
;
599 if (band
== NL80211_BAND_2GHZ
) {
600 bmc
->short_preamble
= true;
602 bmc
->bc_trans
= cpu_to_le16(0x2000);
603 bmc
->mc_trans
= cpu_to_le16(0x2080);
608 mt7915_mcu_muar_config(struct mt7915_phy
*phy
, struct ieee80211_vif
*vif
,
609 bool bssid
, bool enable
)
611 struct mt7915_dev
*dev
= phy
->dev
;
612 struct mt7915_vif
*mvif
= (struct mt7915_vif
*)vif
->drv_priv
;
613 u32 idx
= mvif
->mt76
.omac_idx
- REPEATER_BSSID_START
;
614 u32 mask
= phy
->omac_mask
>> 32 & ~BIT(idx
);
615 const u8
*addr
= vif
->addr
;
628 .mode
= !!mask
|| enable
,
631 .band
= phy
->mt76
->band_idx
,
632 .index
= idx
* 2 + bssid
,
636 addr
= vif
->bss_conf
.bssid
;
639 ether_addr_copy(req
.addr
, addr
);
641 return mt76_mcu_send_msg(&dev
->mt76
, MCU_EXT_CMD(MUAR_UPDATE
), &req
,
645 int mt7915_mcu_add_bss_info(struct mt7915_phy
*phy
,
646 struct ieee80211_vif
*vif
, int enable
)
648 struct mt7915_vif
*mvif
= (struct mt7915_vif
*)vif
->drv_priv
;
649 struct mt7915_dev
*dev
= phy
->dev
;
652 if (mvif
->mt76
.omac_idx
>= REPEATER_BSSID_START
) {
653 mt7915_mcu_muar_config(phy
, vif
, false, enable
);
654 mt7915_mcu_muar_config(phy
, vif
, true, enable
);
657 skb
= __mt76_connac_mcu_alloc_sta_req(&dev
->mt76
, &mvif
->mt76
, NULL
,
658 MT7915_BSS_UPDATE_MAX_SIZE
);
662 /* bss_omac must be first */
664 mt76_connac_mcu_bss_omac_tlv(skb
, vif
);
666 mt76_connac_mcu_bss_basic_tlv(skb
, vif
, NULL
, phy
->mt76
,
667 mvif
->sta
.wcid
.idx
, enable
);
669 if (vif
->type
== NL80211_IFTYPE_MONITOR
)
673 mt7915_mcu_bss_rfch_tlv(skb
, vif
, phy
);
674 mt7915_mcu_bss_bmc_tlv(skb
, phy
);
675 mt7915_mcu_bss_ra_tlv(skb
, vif
, phy
);
676 mt7915_mcu_bss_hw_amsdu_tlv(skb
);
678 if (vif
->bss_conf
.he_support
)
679 mt7915_mcu_bss_he_tlv(skb
, vif
, phy
);
681 if (mvif
->mt76
.omac_idx
>= EXT_BSSID_START
&&
682 mvif
->mt76
.omac_idx
< REPEATER_BSSID_START
)
683 mt76_connac_mcu_bss_ext_tlv(skb
, &mvif
->mt76
);
686 return mt76_mcu_skb_send_msg(&dev
->mt76
, skb
,
687 MCU_EXT_CMD(BSS_INFO_UPDATE
), true);
690 /** starec & wtbl **/
691 int mt7915_mcu_add_tx_ba(struct mt7915_dev
*dev
,
692 struct ieee80211_ampdu_params
*params
,
695 struct mt7915_sta
*msta
= (struct mt7915_sta
*)params
->sta
->drv_priv
;
696 struct mt7915_vif
*mvif
= msta
->vif
;
699 mt76_worker_disable(&dev
->mt76
.tx_worker
);
700 if (enable
&& !params
->amsdu
)
701 msta
->wcid
.amsdu
= false;
702 ret
= mt76_connac_mcu_sta_ba(&dev
->mt76
, &mvif
->mt76
, params
,
703 MCU_EXT_CMD(STA_REC_UPDATE
),
705 mt76_worker_enable(&dev
->mt76
.tx_worker
);
710 int mt7915_mcu_add_rx_ba(struct mt7915_dev
*dev
,
711 struct ieee80211_ampdu_params
*params
,
714 struct mt7915_sta
*msta
= (struct mt7915_sta
*)params
->sta
->drv_priv
;
715 struct mt7915_vif
*mvif
= msta
->vif
;
717 return mt76_connac_mcu_sta_ba(&dev
->mt76
, &mvif
->mt76
, params
,
718 MCU_EXT_CMD(STA_REC_UPDATE
),
723 mt7915_mcu_sta_he_tlv(struct sk_buff
*skb
, struct ieee80211_sta
*sta
,
724 struct ieee80211_vif
*vif
)
726 struct mt7915_vif
*mvif
= (struct mt7915_vif
*)vif
->drv_priv
;
727 struct ieee80211_he_cap_elem
*elem
= &sta
->deflink
.he_cap
.he_cap_elem
;
728 struct ieee80211_he_mcs_nss_supp mcs_map
;
729 struct sta_rec_he
*he
;
733 if (!sta
->deflink
.he_cap
.has_he
)
736 tlv
= mt76_connac_mcu_add_tlv(skb
, STA_REC_HE
, sizeof(*he
));
738 he
= (struct sta_rec_he
*)tlv
;
740 if (elem
->mac_cap_info
[0] & IEEE80211_HE_MAC_CAP0_HTC_HE
)
741 cap
|= STA_REC_HE_CAP_HTC
;
743 if (elem
->mac_cap_info
[2] & IEEE80211_HE_MAC_CAP2_BSR
)
744 cap
|= STA_REC_HE_CAP_BSR
;
746 if (elem
->mac_cap_info
[3] & IEEE80211_HE_MAC_CAP3_OMI_CONTROL
)
747 cap
|= STA_REC_HE_CAP_OM
;
749 if (elem
->mac_cap_info
[4] & IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU
)
750 cap
|= STA_REC_HE_CAP_AMSDU_IN_AMPDU
;
752 if (elem
->mac_cap_info
[4] & IEEE80211_HE_MAC_CAP4_BQR
)
753 cap
|= STA_REC_HE_CAP_BQR
;
755 if (elem
->phy_cap_info
[0] &
756 (IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_RU_MAPPING_IN_2G
|
757 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_RU_MAPPING_IN_5G
))
758 cap
|= STA_REC_HE_CAP_BW20_RU242_SUPPORT
;
760 if (mvif
->cap
.he_ldpc
&&
761 (elem
->phy_cap_info
[1] &
762 IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD
))
763 cap
|= STA_REC_HE_CAP_LDPC
;
765 if (elem
->phy_cap_info
[1] &
766 IEEE80211_HE_PHY_CAP1_HE_LTF_AND_GI_FOR_HE_PPDUS_0_8US
)
767 cap
|= STA_REC_HE_CAP_SU_PPDU_1LTF_8US_GI
;
769 if (elem
->phy_cap_info
[2] &
770 IEEE80211_HE_PHY_CAP2_NDP_4x_LTF_AND_3_2US
)
771 cap
|= STA_REC_HE_CAP_NDP_4LTF_3DOT2MS_GI
;
773 if (elem
->phy_cap_info
[2] &
774 IEEE80211_HE_PHY_CAP2_STBC_TX_UNDER_80MHZ
)
775 cap
|= STA_REC_HE_CAP_LE_EQ_80M_TX_STBC
;
777 if (elem
->phy_cap_info
[2] &
778 IEEE80211_HE_PHY_CAP2_STBC_RX_UNDER_80MHZ
)
779 cap
|= STA_REC_HE_CAP_LE_EQ_80M_RX_STBC
;
781 if (elem
->phy_cap_info
[6] &
782 IEEE80211_HE_PHY_CAP6_TRIG_CQI_FB
)
783 cap
|= STA_REC_HE_CAP_TRIG_CQI_FK
;
785 if (elem
->phy_cap_info
[6] &
786 IEEE80211_HE_PHY_CAP6_PARTIAL_BW_EXT_RANGE
)
787 cap
|= STA_REC_HE_CAP_PARTIAL_BW_EXT_RANGE
;
789 if (elem
->phy_cap_info
[7] &
790 IEEE80211_HE_PHY_CAP7_HE_SU_MU_PPDU_4XLTF_AND_08_US_GI
)
791 cap
|= STA_REC_HE_CAP_SU_MU_PPDU_4LTF_8US_GI
;
793 if (elem
->phy_cap_info
[7] &
794 IEEE80211_HE_PHY_CAP7_STBC_TX_ABOVE_80MHZ
)
795 cap
|= STA_REC_HE_CAP_GT_80M_TX_STBC
;
797 if (elem
->phy_cap_info
[7] &
798 IEEE80211_HE_PHY_CAP7_STBC_RX_ABOVE_80MHZ
)
799 cap
|= STA_REC_HE_CAP_GT_80M_RX_STBC
;
801 if (elem
->phy_cap_info
[8] &
802 IEEE80211_HE_PHY_CAP8_HE_ER_SU_PPDU_4XLTF_AND_08_US_GI
)
803 cap
|= STA_REC_HE_CAP_ER_SU_PPDU_4LTF_8US_GI
;
805 if (elem
->phy_cap_info
[8] &
806 IEEE80211_HE_PHY_CAP8_HE_ER_SU_1XLTF_AND_08_US_GI
)
807 cap
|= STA_REC_HE_CAP_ER_SU_PPDU_1LTF_8US_GI
;
809 if (elem
->phy_cap_info
[9] &
810 IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU
)
811 cap
|= STA_REC_HE_CAP_TX_1024QAM_UNDER_RU242
;
813 if (elem
->phy_cap_info
[9] &
814 IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU
)
815 cap
|= STA_REC_HE_CAP_RX_1024QAM_UNDER_RU242
;
817 he
->he_cap
= cpu_to_le32(cap
);
819 mcs_map
= sta
->deflink
.he_cap
.he_mcs_nss_supp
;
820 switch (sta
->deflink
.bandwidth
) {
821 case IEEE80211_STA_RX_BW_160
:
822 if (elem
->phy_cap_info
[0] &
823 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G
)
824 mt7915_mcu_set_sta_he_mcs(sta
,
825 &he
->max_nss_mcs
[CMD_HE_MCS_BW8080
],
826 le16_to_cpu(mcs_map
.rx_mcs_80p80
));
828 mt7915_mcu_set_sta_he_mcs(sta
,
829 &he
->max_nss_mcs
[CMD_HE_MCS_BW160
],
830 le16_to_cpu(mcs_map
.rx_mcs_160
));
833 mt7915_mcu_set_sta_he_mcs(sta
,
834 &he
->max_nss_mcs
[CMD_HE_MCS_BW80
],
835 le16_to_cpu(mcs_map
.rx_mcs_80
));
840 HE_MAC(CAP1_TF_MAC_PAD_DUR_MASK
, elem
->mac_cap_info
[1]);
842 HE_MAC(CAP3_MAX_AMPDU_LEN_EXP_MASK
, elem
->mac_cap_info
[3]);
845 HE_PHY(CAP0_CHANNEL_WIDTH_SET_MASK
, elem
->phy_cap_info
[0]);
847 HE_PHY(CAP1_DEVICE_CLASS_A
, elem
->phy_cap_info
[1]);
849 HE_PHY(CAP1_PREAMBLE_PUNC_RX_MASK
, elem
->phy_cap_info
[1]);
852 HE_PHY(CAP3_DCM_MAX_CONST_TX_MASK
, elem
->phy_cap_info
[3]);
854 HE_PHY(CAP3_DCM_MAX_TX_NSS_2
, elem
->phy_cap_info
[3]);
856 HE_PHY(CAP3_DCM_MAX_CONST_RX_MASK
, elem
->phy_cap_info
[3]);
858 HE_PHY(CAP3_DCM_MAX_RX_NSS_2
, elem
->phy_cap_info
[3]);
860 HE_PHY(CAP8_DCM_MAX_RU_MASK
, elem
->phy_cap_info
[8]);
866 mt7915_mcu_sta_muru_tlv(struct mt7915_dev
*dev
, struct sk_buff
*skb
,
867 struct ieee80211_sta
*sta
, struct ieee80211_vif
*vif
)
869 struct mt7915_vif
*mvif
= (struct mt7915_vif
*)vif
->drv_priv
;
870 struct ieee80211_he_cap_elem
*elem
= &sta
->deflink
.he_cap
.he_cap_elem
;
871 struct sta_rec_muru
*muru
;
874 if (vif
->type
!= NL80211_IFTYPE_STATION
&&
875 vif
->type
!= NL80211_IFTYPE_AP
)
878 tlv
= mt76_connac_mcu_add_tlv(skb
, STA_REC_MURU
, sizeof(*muru
));
880 muru
= (struct sta_rec_muru
*)tlv
;
882 muru
->cfg
.mimo_dl_en
= mvif
->cap
.he_mu_ebfer
||
883 mvif
->cap
.vht_mu_ebfer
||
884 mvif
->cap
.vht_mu_ebfee
;
885 if (!is_mt7915(&dev
->mt76
))
886 muru
->cfg
.mimo_ul_en
= true;
887 muru
->cfg
.ofdma_dl_en
= true;
889 if (sta
->deflink
.vht_cap
.vht_supported
)
890 muru
->mimo_dl
.vht_mu_bfee
=
891 !!(sta
->deflink
.vht_cap
.cap
& IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE
);
893 if (!sta
->deflink
.he_cap
.has_he
)
896 muru
->mimo_dl
.partial_bw_dl_mimo
=
897 HE_PHY(CAP6_PARTIAL_BANDWIDTH_DL_MUMIMO
, elem
->phy_cap_info
[6]);
899 muru
->mimo_ul
.full_ul_mimo
=
900 HE_PHY(CAP2_UL_MU_FULL_MU_MIMO
, elem
->phy_cap_info
[2]);
901 muru
->mimo_ul
.partial_ul_mimo
=
902 HE_PHY(CAP2_UL_MU_PARTIAL_MU_MIMO
, elem
->phy_cap_info
[2]);
904 muru
->ofdma_dl
.punc_pream_rx
=
905 HE_PHY(CAP1_PREAMBLE_PUNC_RX_MASK
, elem
->phy_cap_info
[1]);
906 muru
->ofdma_dl
.he_20m_in_40m_2g
=
907 HE_PHY(CAP8_20MHZ_IN_40MHZ_HE_PPDU_IN_2G
, elem
->phy_cap_info
[8]);
908 muru
->ofdma_dl
.he_20m_in_160m
=
909 HE_PHY(CAP8_20MHZ_IN_160MHZ_HE_PPDU
, elem
->phy_cap_info
[8]);
910 muru
->ofdma_dl
.he_80m_in_160m
=
911 HE_PHY(CAP8_80MHZ_IN_160MHZ_HE_PPDU
, elem
->phy_cap_info
[8]);
913 muru
->ofdma_ul
.t_frame_dur
=
914 HE_MAC(CAP1_TF_MAC_PAD_DUR_MASK
, elem
->mac_cap_info
[1]);
915 muru
->ofdma_ul
.mu_cascading
=
916 HE_MAC(CAP2_MU_CASCADING
, elem
->mac_cap_info
[2]);
917 muru
->ofdma_ul
.uo_ra
=
918 HE_MAC(CAP3_OFDMA_RA
, elem
->mac_cap_info
[3]);
919 muru
->ofdma_ul
.rx_ctrl_frame_to_mbss
=
920 HE_MAC(CAP3_RX_CTRL_FRAME_TO_MULTIBSS
, elem
->mac_cap_info
[3]);
924 mt7915_mcu_sta_ht_tlv(struct sk_buff
*skb
, struct ieee80211_sta
*sta
)
926 struct sta_rec_ht
*ht
;
929 if (!sta
->deflink
.ht_cap
.ht_supported
)
932 tlv
= mt76_connac_mcu_add_tlv(skb
, STA_REC_HT
, sizeof(*ht
));
934 ht
= (struct sta_rec_ht
*)tlv
;
935 ht
->ht_cap
= cpu_to_le16(sta
->deflink
.ht_cap
.cap
);
939 mt7915_mcu_sta_vht_tlv(struct sk_buff
*skb
, struct ieee80211_sta
*sta
)
941 struct sta_rec_vht
*vht
;
944 if (!sta
->deflink
.vht_cap
.vht_supported
)
947 tlv
= mt76_connac_mcu_add_tlv(skb
, STA_REC_VHT
, sizeof(*vht
));
949 vht
= (struct sta_rec_vht
*)tlv
;
950 vht
->vht_cap
= cpu_to_le32(sta
->deflink
.vht_cap
.cap
);
951 vht
->vht_rx_mcs_map
= sta
->deflink
.vht_cap
.vht_mcs
.rx_mcs_map
;
952 vht
->vht_tx_mcs_map
= sta
->deflink
.vht_cap
.vht_mcs
.tx_mcs_map
;
956 mt7915_mcu_sta_amsdu_tlv(struct mt7915_dev
*dev
, struct sk_buff
*skb
,
957 struct ieee80211_vif
*vif
, struct ieee80211_sta
*sta
)
959 struct mt7915_sta
*msta
= (struct mt7915_sta
*)sta
->drv_priv
;
960 struct sta_rec_amsdu
*amsdu
;
963 if (vif
->type
!= NL80211_IFTYPE_STATION
&&
964 vif
->type
!= NL80211_IFTYPE_AP
)
967 if (!sta
->deflink
.agg
.max_amsdu_len
)
970 tlv
= mt76_connac_mcu_add_tlv(skb
, STA_REC_HW_AMSDU
, sizeof(*amsdu
));
971 amsdu
= (struct sta_rec_amsdu
*)tlv
;
972 amsdu
->max_amsdu_num
= 8;
973 amsdu
->amsdu_en
= true;
974 msta
->wcid
.amsdu
= true;
976 switch (sta
->deflink
.agg
.max_amsdu_len
) {
977 case IEEE80211_MAX_MPDU_LEN_VHT_11454
:
978 if (!is_mt7915(&dev
->mt76
)) {
979 amsdu
->max_mpdu_size
=
980 IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454
;
984 case IEEE80211_MAX_MPDU_LEN_HT_7935
:
985 case IEEE80211_MAX_MPDU_LEN_VHT_7991
:
986 amsdu
->max_mpdu_size
= IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_7991
;
989 amsdu
->max_mpdu_size
= IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_3895
;
995 mt7915_mcu_sta_wtbl_tlv(struct mt7915_dev
*dev
, struct sk_buff
*skb
,
996 struct ieee80211_vif
*vif
, struct ieee80211_sta
*sta
)
998 struct mt7915_vif
*mvif
= (struct mt7915_vif
*)vif
->drv_priv
;
999 struct mt7915_sta
*msta
;
1000 struct wtbl_req_hdr
*wtbl_hdr
;
1001 struct mt76_wcid
*wcid
;
1004 msta
= sta
? (struct mt7915_sta
*)sta
->drv_priv
: &mvif
->sta
;
1005 wcid
= sta
? &msta
->wcid
: NULL
;
1007 tlv
= mt76_connac_mcu_add_tlv(skb
, STA_REC_WTBL
, sizeof(struct tlv
));
1008 wtbl_hdr
= mt76_connac_mcu_alloc_wtbl_req(&dev
->mt76
, &msta
->wcid
,
1009 WTBL_RESET_AND_SET
, tlv
,
1011 if (IS_ERR(wtbl_hdr
))
1012 return PTR_ERR(wtbl_hdr
);
1014 mt76_connac_mcu_wtbl_generic_tlv(&dev
->mt76
, skb
, vif
, sta
, tlv
,
1016 mt76_connac_mcu_wtbl_hdr_trans_tlv(skb
, vif
, wcid
, tlv
, wtbl_hdr
);
1018 mt76_connac_mcu_wtbl_ht_tlv(&dev
->mt76
, skb
, sta
, tlv
,
1019 wtbl_hdr
, mvif
->cap
.ht_ldpc
,
1020 mvif
->cap
.vht_ldpc
);
1026 mt7915_is_ebf_supported(struct mt7915_phy
*phy
, struct ieee80211_vif
*vif
,
1027 struct ieee80211_sta
*sta
, bool bfee
)
1029 struct mt7915_vif
*mvif
= (struct mt7915_vif
*)vif
->drv_priv
;
1030 int sts
= hweight16(phy
->mt76
->chainmask
);
1032 if (vif
->type
!= NL80211_IFTYPE_STATION
&&
1033 vif
->type
!= NL80211_IFTYPE_AP
)
1036 if (!bfee
&& sts
< 2)
1039 if (sta
->deflink
.he_cap
.has_he
) {
1040 struct ieee80211_he_cap_elem
*pe
= &sta
->deflink
.he_cap
.he_cap_elem
;
1043 return mvif
->cap
.he_su_ebfee
&&
1044 HE_PHY(CAP3_SU_BEAMFORMER
, pe
->phy_cap_info
[3]);
1046 return mvif
->cap
.he_su_ebfer
&&
1047 HE_PHY(CAP4_SU_BEAMFORMEE
, pe
->phy_cap_info
[4]);
1050 if (sta
->deflink
.vht_cap
.vht_supported
) {
1051 u32 cap
= sta
->deflink
.vht_cap
.cap
;
1054 return mvif
->cap
.vht_su_ebfee
&&
1055 (cap
& IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE
);
1057 return mvif
->cap
.vht_su_ebfer
&&
1058 (cap
& IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE
);
1065 mt7915_mcu_sta_sounding_rate(struct sta_rec_bf
*bf
)
1067 bf
->sounding_phy
= MT_PHY_TYPE_OFDM
;
1068 bf
->ndp_rate
= 0; /* mcs0 */
1069 bf
->ndpa_rate
= MT7915_CFEND_RATE_DEFAULT
; /* ofdm 24m */
1070 bf
->rept_poll_rate
= MT7915_CFEND_RATE_DEFAULT
; /* ofdm 24m */
1074 mt7915_mcu_sta_bfer_ht(struct ieee80211_sta
*sta
, struct mt7915_phy
*phy
,
1075 struct sta_rec_bf
*bf
)
1077 struct ieee80211_mcs_info
*mcs
= &sta
->deflink
.ht_cap
.mcs
;
1080 bf
->tx_mode
= MT_PHY_TYPE_HT
;
1082 if ((mcs
->tx_params
& IEEE80211_HT_MCS_TX_RX_DIFF
) &&
1083 (mcs
->tx_params
& IEEE80211_HT_MCS_TX_DEFINED
))
1084 n
= FIELD_GET(IEEE80211_HT_MCS_TX_MAX_STREAMS_MASK
,
1086 else if (mcs
->rx_mask
[3])
1088 else if (mcs
->rx_mask
[2])
1090 else if (mcs
->rx_mask
[1])
1093 bf
->nrow
= hweight8(phy
->mt76
->chainmask
) - 1;
1094 bf
->ncol
= min_t(u8
, bf
->nrow
, n
);
1099 mt7915_mcu_sta_bfer_vht(struct ieee80211_sta
*sta
, struct mt7915_phy
*phy
,
1100 struct sta_rec_bf
*bf
, bool explicit)
1102 struct ieee80211_sta_vht_cap
*pc
= &sta
->deflink
.vht_cap
;
1103 struct ieee80211_sta_vht_cap
*vc
= &phy
->mt76
->sband_5g
.sband
.vht_cap
;
1104 u16 mcs_map
= le16_to_cpu(pc
->vht_mcs
.rx_mcs_map
);
1105 u8 nss_mcs
= mt7915_mcu_get_sta_nss(mcs_map
);
1106 u8 tx_ant
= hweight8(phy
->mt76
->chainmask
) - 1;
1108 bf
->tx_mode
= MT_PHY_TYPE_VHT
;
1113 mt7915_mcu_sta_sounding_rate(bf
);
1115 sts
= FIELD_GET(IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK
,
1117 snd_dim
= FIELD_GET(IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK
,
1119 bf
->nrow
= min_t(u8
, min_t(u8
, snd_dim
, sts
), tx_ant
);
1120 bf
->ncol
= min_t(u8
, nss_mcs
, bf
->nrow
);
1121 bf
->ibf_ncol
= bf
->ncol
;
1123 if (sta
->deflink
.bandwidth
== IEEE80211_STA_RX_BW_160
)
1127 bf
->ncol
= min_t(u8
, nss_mcs
, bf
->nrow
);
1128 bf
->ibf_ncol
= nss_mcs
;
1130 if (sta
->deflink
.bandwidth
== IEEE80211_STA_RX_BW_160
)
1136 mt7915_mcu_sta_bfer_he(struct ieee80211_sta
*sta
, struct ieee80211_vif
*vif
,
1137 struct mt7915_phy
*phy
, struct sta_rec_bf
*bf
)
1139 struct ieee80211_sta_he_cap
*pc
= &sta
->deflink
.he_cap
;
1140 struct ieee80211_he_cap_elem
*pe
= &pc
->he_cap_elem
;
1141 const struct ieee80211_sta_he_cap
*vc
=
1142 mt76_connac_get_he_phy_cap(phy
->mt76
, vif
);
1143 const struct ieee80211_he_cap_elem
*ve
= &vc
->he_cap_elem
;
1144 u16 mcs_map
= le16_to_cpu(pc
->he_mcs_nss_supp
.rx_mcs_80
);
1145 u8 nss_mcs
= mt7915_mcu_get_sta_nss(mcs_map
);
1148 bf
->tx_mode
= MT_PHY_TYPE_HE_SU
;
1150 mt7915_mcu_sta_sounding_rate(bf
);
1152 bf
->trigger_su
= HE_PHY(CAP6_TRIG_SU_BEAMFORMING_FB
,
1153 pe
->phy_cap_info
[6]);
1154 bf
->trigger_mu
= HE_PHY(CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB
,
1155 pe
->phy_cap_info
[6]);
1156 snd_dim
= HE_PHY(CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK
,
1157 ve
->phy_cap_info
[5]);
1158 sts
= HE_PHY(CAP4_BEAMFORMEE_MAX_STS_UNDER_80MHZ_MASK
,
1159 pe
->phy_cap_info
[4]);
1160 bf
->nrow
= min_t(u8
, snd_dim
, sts
);
1161 bf
->ncol
= min_t(u8
, nss_mcs
, bf
->nrow
);
1162 bf
->ibf_ncol
= bf
->ncol
;
1164 if (sta
->deflink
.bandwidth
!= IEEE80211_STA_RX_BW_160
)
1167 /* go over for 160MHz and 80p80 */
1168 if (pe
->phy_cap_info
[0] &
1169 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G
) {
1170 mcs_map
= le16_to_cpu(pc
->he_mcs_nss_supp
.rx_mcs_160
);
1171 nss_mcs
= mt7915_mcu_get_sta_nss(mcs_map
);
1173 bf
->ncol_gt_bw80
= nss_mcs
;
1176 if (pe
->phy_cap_info
[0] &
1177 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G
) {
1178 mcs_map
= le16_to_cpu(pc
->he_mcs_nss_supp
.rx_mcs_80p80
);
1179 nss_mcs
= mt7915_mcu_get_sta_nss(mcs_map
);
1181 if (bf
->ncol_gt_bw80
)
1182 bf
->ncol_gt_bw80
= min_t(u8
, bf
->ncol_gt_bw80
, nss_mcs
);
1184 bf
->ncol_gt_bw80
= nss_mcs
;
1187 snd_dim
= HE_PHY(CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_MASK
,
1188 ve
->phy_cap_info
[5]);
1189 sts
= HE_PHY(CAP4_BEAMFORMEE_MAX_STS_ABOVE_80MHZ_MASK
,
1190 pe
->phy_cap_info
[4]);
1192 bf
->nrow_gt_bw80
= min_t(int, snd_dim
, sts
);
1196 mt7915_mcu_sta_bfer_tlv(struct mt7915_dev
*dev
, struct sk_buff
*skb
,
1197 struct ieee80211_vif
*vif
, struct ieee80211_sta
*sta
)
1199 struct mt7915_vif
*mvif
= (struct mt7915_vif
*)vif
->drv_priv
;
1200 struct mt7915_phy
*phy
= mvif
->phy
;
1201 int tx_ant
= hweight8(phy
->mt76
->chainmask
) - 1;
1202 struct sta_rec_bf
*bf
;
1204 static const u8 matrix
[4][4] = {
1206 {1, 1, 0, 0}, /* 2x1, 2x2, 2x3, 2x4 */
1207 {2, 4, 4, 0}, /* 3x1, 3x2, 3x3, 3x4 */
1208 {3, 5, 6, 0} /* 4x1, 4x2, 4x3, 4x4 */
1212 if (!(sta
->deflink
.ht_cap
.ht_supported
|| sta
->deflink
.he_cap
.has_he
))
1215 ebf
= mt7915_is_ebf_supported(phy
, vif
, sta
, false);
1216 if (!ebf
&& !dev
->ibf
)
1219 tlv
= mt76_connac_mcu_add_tlv(skb
, STA_REC_BF
, sizeof(*bf
));
1220 bf
= (struct sta_rec_bf
*)tlv
;
1222 /* he: eBF only, in accordance with spec
1223 * vht: support eBF and iBF
1224 * ht: iBF only, since mac80211 lacks of eBF support
1226 if (sta
->deflink
.he_cap
.has_he
&& ebf
)
1227 mt7915_mcu_sta_bfer_he(sta
, vif
, phy
, bf
);
1228 else if (sta
->deflink
.vht_cap
.vht_supported
)
1229 mt7915_mcu_sta_bfer_vht(sta
, phy
, bf
, ebf
);
1230 else if (sta
->deflink
.ht_cap
.ht_supported
)
1231 mt7915_mcu_sta_bfer_ht(sta
, phy
, bf
);
1235 bf
->bf_cap
= ebf
? ebf
: dev
->ibf
<< 1;
1236 bf
->bw
= sta
->deflink
.bandwidth
;
1237 bf
->ibf_dbw
= sta
->deflink
.bandwidth
;
1238 bf
->ibf_nrow
= tx_ant
;
1240 if (!ebf
&& sta
->deflink
.bandwidth
<= IEEE80211_STA_RX_BW_40
&& !bf
->ncol
)
1241 bf
->ibf_timeout
= 0x48;
1243 bf
->ibf_timeout
= 0x18;
1245 if (ebf
&& bf
->nrow
!= tx_ant
)
1246 bf
->mem_20m
= matrix
[tx_ant
][bf
->ncol
];
1248 bf
->mem_20m
= matrix
[bf
->nrow
][bf
->ncol
];
1250 switch (sta
->deflink
.bandwidth
) {
1251 case IEEE80211_STA_RX_BW_160
:
1252 case IEEE80211_STA_RX_BW_80
:
1253 bf
->mem_total
= bf
->mem_20m
* 2;
1255 case IEEE80211_STA_RX_BW_40
:
1256 bf
->mem_total
= bf
->mem_20m
;
1258 case IEEE80211_STA_RX_BW_20
:
1265 mt7915_mcu_sta_bfee_tlv(struct mt7915_dev
*dev
, struct sk_buff
*skb
,
1266 struct ieee80211_vif
*vif
, struct ieee80211_sta
*sta
)
1268 struct mt7915_vif
*mvif
= (struct mt7915_vif
*)vif
->drv_priv
;
1269 struct mt7915_phy
*phy
= mvif
->phy
;
1270 int tx_ant
= hweight8(phy
->mt76
->chainmask
) - 1;
1271 struct sta_rec_bfee
*bfee
;
1275 if (!(sta
->deflink
.vht_cap
.vht_supported
|| sta
->deflink
.he_cap
.has_he
))
1278 if (!mt7915_is_ebf_supported(phy
, vif
, sta
, true))
1281 tlv
= mt76_connac_mcu_add_tlv(skb
, STA_REC_BFEE
, sizeof(*bfee
));
1282 bfee
= (struct sta_rec_bfee
*)tlv
;
1284 if (sta
->deflink
.he_cap
.has_he
) {
1285 struct ieee80211_he_cap_elem
*pe
= &sta
->deflink
.he_cap
.he_cap_elem
;
1287 nrow
= HE_PHY(CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK
,
1288 pe
->phy_cap_info
[5]);
1289 } else if (sta
->deflink
.vht_cap
.vht_supported
) {
1290 struct ieee80211_sta_vht_cap
*pc
= &sta
->deflink
.vht_cap
;
1292 nrow
= FIELD_GET(IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK
,
1296 /* reply with identity matrix to avoid 2x2 BF negative gain */
1297 bfee
->fb_identity_matrix
= (nrow
== 1 && tx_ant
== 2);
1300 static enum mcu_mmps_mode
1301 mt7915_mcu_get_mmps_mode(enum ieee80211_smps_mode smps
)
1304 case IEEE80211_SMPS_OFF
:
1305 return MCU_MMPS_DISABLE
;
1306 case IEEE80211_SMPS_STATIC
:
1307 return MCU_MMPS_STATIC
;
1308 case IEEE80211_SMPS_DYNAMIC
:
1309 return MCU_MMPS_DYNAMIC
;
1311 return MCU_MMPS_DISABLE
;
1315 int mt7915_mcu_set_fixed_rate_ctrl(struct mt7915_dev
*dev
,
1316 struct ieee80211_vif
*vif
,
1317 struct ieee80211_sta
*sta
,
1318 void *data
, u32 field
)
1320 struct mt7915_vif
*mvif
= (struct mt7915_vif
*)vif
->drv_priv
;
1321 struct mt7915_sta
*msta
= (struct mt7915_sta
*)sta
->drv_priv
;
1322 struct sta_phy
*phy
= data
;
1323 struct sta_rec_ra_fixed
*ra
;
1324 struct sk_buff
*skb
;
1327 skb
= mt76_connac_mcu_alloc_sta_req(&dev
->mt76
, &mvif
->mt76
,
1330 return PTR_ERR(skb
);
1332 tlv
= mt76_connac_mcu_add_tlv(skb
, STA_REC_RA_UPDATE
, sizeof(*ra
));
1333 ra
= (struct sta_rec_ra_fixed
*)tlv
;
1336 case RATE_PARAM_AUTO
:
1338 case RATE_PARAM_FIXED
:
1339 case RATE_PARAM_FIXED_MCS
:
1340 case RATE_PARAM_FIXED_GI
:
1341 case RATE_PARAM_FIXED_HE_LTF
:
1345 case RATE_PARAM_MMPS_UPDATE
:
1346 ra
->mmps_mode
= mt7915_mcu_get_mmps_mode(sta
->deflink
.smps_mode
);
1348 case RATE_PARAM_SPE_UPDATE
:
1349 ra
->spe_idx
= *(u8
*)data
;
1354 ra
->field
= cpu_to_le32(field
);
1356 return mt76_mcu_skb_send_msg(&dev
->mt76
, skb
,
1357 MCU_EXT_CMD(STA_REC_UPDATE
), true);
1360 int mt7915_mcu_add_smps(struct mt7915_dev
*dev
, struct ieee80211_vif
*vif
,
1361 struct ieee80211_sta
*sta
)
1363 struct mt7915_vif
*mvif
= (struct mt7915_vif
*)vif
->drv_priv
;
1364 struct mt7915_sta
*msta
= (struct mt7915_sta
*)sta
->drv_priv
;
1365 struct wtbl_req_hdr
*wtbl_hdr
;
1366 struct tlv
*sta_wtbl
;
1367 struct sk_buff
*skb
;
1370 skb
= mt76_connac_mcu_alloc_sta_req(&dev
->mt76
, &mvif
->mt76
,
1373 return PTR_ERR(skb
);
1375 sta_wtbl
= mt76_connac_mcu_add_tlv(skb
, STA_REC_WTBL
,
1376 sizeof(struct tlv
));
1377 wtbl_hdr
= mt76_connac_mcu_alloc_wtbl_req(&dev
->mt76
, &msta
->wcid
,
1378 WTBL_SET
, sta_wtbl
, &skb
);
1379 if (IS_ERR(wtbl_hdr
))
1380 return PTR_ERR(wtbl_hdr
);
1382 mt76_connac_mcu_wtbl_smps_tlv(skb
, sta
, sta_wtbl
, wtbl_hdr
);
1384 ret
= mt76_mcu_skb_send_msg(&dev
->mt76
, skb
,
1385 MCU_EXT_CMD(STA_REC_UPDATE
), true);
1389 return mt7915_mcu_set_fixed_rate_ctrl(dev
, vif
, sta
, NULL
,
1390 RATE_PARAM_MMPS_UPDATE
);
1394 mt7915_mcu_set_spe_idx(struct mt7915_dev
*dev
, struct ieee80211_vif
*vif
,
1395 struct ieee80211_sta
*sta
)
1397 struct mt7915_vif
*mvif
= (struct mt7915_vif
*)vif
->drv_priv
;
1398 struct mt76_phy
*mphy
= mvif
->phy
->mt76
;
1399 u8 spe_idx
= mt76_connac_spe_idx(mphy
->antenna_mask
);
1401 return mt7915_mcu_set_fixed_rate_ctrl(dev
, vif
, sta
, &spe_idx
,
1402 RATE_PARAM_SPE_UPDATE
);
1406 mt7915_mcu_add_rate_ctrl_fixed(struct mt7915_dev
*dev
,
1407 struct ieee80211_vif
*vif
,
1408 struct ieee80211_sta
*sta
)
1410 struct mt7915_vif
*mvif
= (struct mt7915_vif
*)vif
->drv_priv
;
1411 struct cfg80211_chan_def
*chandef
= &mvif
->phy
->mt76
->chandef
;
1412 struct cfg80211_bitrate_mask
*mask
= &mvif
->bitrate_mask
;
1413 enum nl80211_band band
= chandef
->chan
->band
;
1414 struct sta_phy phy
= {};
1415 int ret
, nrates
= 0;
1417 #define __sta_phy_bitrate_mask_check(_mcs, _gi, _ht, _he) \
1419 u8 i, gi = mask->control[band]._gi; \
1420 gi = (_he) ? gi : gi == NL80211_TXRATE_FORCE_SGI; \
1421 for (i = 0; i <= sta->deflink.bandwidth; i++) { \
1422 phy.sgi |= gi << (i << (_he)); \
1423 phy.he_ltf |= mask->control[band].he_ltf << (i << (_he));\
1425 for (i = 0; i < ARRAY_SIZE(mask->control[band]._mcs); i++) { \
1426 if (!mask->control[band]._mcs[i]) \
1428 nrates += hweight16(mask->control[band]._mcs[i]); \
1429 phy.mcs = ffs(mask->control[band]._mcs[i]) - 1; \
1435 if (sta
->deflink
.he_cap
.has_he
) {
1436 __sta_phy_bitrate_mask_check(he_mcs
, he_gi
, 0, 1);
1437 } else if (sta
->deflink
.vht_cap
.vht_supported
) {
1438 __sta_phy_bitrate_mask_check(vht_mcs
, gi
, 0, 0);
1439 } else if (sta
->deflink
.ht_cap
.ht_supported
) {
1440 __sta_phy_bitrate_mask_check(ht_mcs
, gi
, 1, 0);
1442 nrates
= hweight32(mask
->control
[band
].legacy
);
1443 phy
.mcs
= ffs(mask
->control
[band
].legacy
) - 1;
1445 #undef __sta_phy_bitrate_mask_check
1447 /* fall back to auto rate control */
1448 if (mask
->control
[band
].gi
== NL80211_TXRATE_DEFAULT_GI
&&
1449 mask
->control
[band
].he_gi
== GENMASK(7, 0) &&
1450 mask
->control
[band
].he_ltf
== GENMASK(7, 0) &&
1454 /* fixed single rate */
1456 ret
= mt7915_mcu_set_fixed_rate_ctrl(dev
, vif
, sta
, &phy
,
1457 RATE_PARAM_FIXED_MCS
);
1463 if (mask
->control
[band
].gi
!= NL80211_TXRATE_DEFAULT_GI
||
1464 mask
->control
[band
].he_gi
!= GENMASK(7, 0)) {
1465 struct mt7915_sta
*msta
= (struct mt7915_sta
*)sta
->drv_priv
;
1468 /* firmware updates only TXCMD but doesn't take WTBL into
1469 * account, so driver should update here to reflect the
1470 * actual txrate hardware sends out.
1472 addr
= mt7915_mac_wtbl_lmac_addr(dev
, msta
->wcid
.idx
, 7);
1473 if (sta
->deflink
.he_cap
.has_he
)
1474 mt76_rmw_field(dev
, addr
, GENMASK(31, 24), phy
.sgi
);
1476 mt76_rmw_field(dev
, addr
, GENMASK(15, 12), phy
.sgi
);
1478 ret
= mt7915_mcu_set_fixed_rate_ctrl(dev
, vif
, sta
, &phy
,
1479 RATE_PARAM_FIXED_GI
);
1485 if (mask
->control
[band
].he_ltf
!= GENMASK(7, 0)) {
1486 ret
= mt7915_mcu_set_fixed_rate_ctrl(dev
, vif
, sta
, &phy
,
1487 RATE_PARAM_FIXED_HE_LTF
);
1492 return mt7915_mcu_set_spe_idx(dev
, vif
, sta
);
1496 mt7915_mcu_sta_rate_ctrl_tlv(struct sk_buff
*skb
, struct mt7915_dev
*dev
,
1497 struct ieee80211_vif
*vif
, struct ieee80211_sta
*sta
)
1499 struct mt7915_vif
*mvif
= (struct mt7915_vif
*)vif
->drv_priv
;
1500 struct mt76_phy
*mphy
= mvif
->phy
->mt76
;
1501 struct cfg80211_chan_def
*chandef
= &mphy
->chandef
;
1502 struct cfg80211_bitrate_mask
*mask
= &mvif
->bitrate_mask
;
1503 enum nl80211_band band
= chandef
->chan
->band
;
1504 struct sta_rec_ra
*ra
;
1506 u32 supp_rate
= sta
->deflink
.supp_rates
[band
];
1507 u32 cap
= sta
->wme
? STA_CAP_WMM
: 0;
1509 tlv
= mt76_connac_mcu_add_tlv(skb
, STA_REC_RA
, sizeof(*ra
));
1510 ra
= (struct sta_rec_ra
*)tlv
;
1513 ra
->auto_rate
= true;
1514 ra
->phy_mode
= mt76_connac_get_phy_mode(mphy
, vif
, band
, &sta
->deflink
);
1515 ra
->channel
= chandef
->chan
->hw_value
;
1516 ra
->bw
= sta
->deflink
.bandwidth
;
1517 ra
->phy
.bw
= sta
->deflink
.bandwidth
;
1518 ra
->mmps_mode
= mt7915_mcu_get_mmps_mode(sta
->deflink
.smps_mode
);
1521 supp_rate
&= mask
->control
[band
].legacy
;
1522 ra
->rate_len
= hweight32(supp_rate
);
1524 if (band
== NL80211_BAND_2GHZ
) {
1525 ra
->supp_mode
= MODE_CCK
;
1526 ra
->supp_cck_rate
= supp_rate
& GENMASK(3, 0);
1528 if (ra
->rate_len
> 4) {
1529 ra
->supp_mode
|= MODE_OFDM
;
1530 ra
->supp_ofdm_rate
= supp_rate
>> 4;
1533 ra
->supp_mode
= MODE_OFDM
;
1534 ra
->supp_ofdm_rate
= supp_rate
;
1538 if (sta
->deflink
.ht_cap
.ht_supported
) {
1539 ra
->supp_mode
|= MODE_HT
;
1540 ra
->af
= sta
->deflink
.ht_cap
.ampdu_factor
;
1541 ra
->ht_gf
= !!(sta
->deflink
.ht_cap
.cap
& IEEE80211_HT_CAP_GRN_FLD
);
1544 if (sta
->deflink
.ht_cap
.cap
& IEEE80211_HT_CAP_SGI_20
)
1545 cap
|= STA_CAP_SGI_20
;
1546 if (sta
->deflink
.ht_cap
.cap
& IEEE80211_HT_CAP_SGI_40
)
1547 cap
|= STA_CAP_SGI_40
;
1548 if (sta
->deflink
.ht_cap
.cap
& IEEE80211_HT_CAP_TX_STBC
)
1549 cap
|= STA_CAP_TX_STBC
;
1550 if (sta
->deflink
.ht_cap
.cap
& IEEE80211_HT_CAP_RX_STBC
)
1551 cap
|= STA_CAP_RX_STBC
;
1552 if (mvif
->cap
.ht_ldpc
&&
1553 (sta
->deflink
.ht_cap
.cap
& IEEE80211_HT_CAP_LDPC_CODING
))
1554 cap
|= STA_CAP_LDPC
;
1556 mt7915_mcu_set_sta_ht_mcs(sta
, ra
->ht_mcs
,
1557 mask
->control
[band
].ht_mcs
);
1558 ra
->supp_ht_mcs
= *(__le32
*)ra
->ht_mcs
;
1561 if (sta
->deflink
.vht_cap
.vht_supported
) {
1564 ra
->supp_mode
|= MODE_VHT
;
1565 af
= FIELD_GET(IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK
,
1566 sta
->deflink
.vht_cap
.cap
);
1567 ra
->af
= max_t(u8
, ra
->af
, af
);
1570 if (sta
->deflink
.vht_cap
.cap
& IEEE80211_VHT_CAP_SHORT_GI_80
)
1571 cap
|= STA_CAP_VHT_SGI_80
;
1572 if (sta
->deflink
.vht_cap
.cap
& IEEE80211_VHT_CAP_SHORT_GI_160
)
1573 cap
|= STA_CAP_VHT_SGI_160
;
1574 if (sta
->deflink
.vht_cap
.cap
& IEEE80211_VHT_CAP_TXSTBC
)
1575 cap
|= STA_CAP_VHT_TX_STBC
;
1576 if (sta
->deflink
.vht_cap
.cap
& IEEE80211_VHT_CAP_RXSTBC_1
)
1577 cap
|= STA_CAP_VHT_RX_STBC
;
1578 if (mvif
->cap
.vht_ldpc
&&
1579 (sta
->deflink
.vht_cap
.cap
& IEEE80211_VHT_CAP_RXLDPC
))
1580 cap
|= STA_CAP_VHT_LDPC
;
1582 mt7915_mcu_set_sta_vht_mcs(sta
, ra
->supp_vht_mcs
,
1583 mask
->control
[band
].vht_mcs
);
1586 if (sta
->deflink
.he_cap
.has_he
) {
1587 ra
->supp_mode
|= MODE_HE
;
1590 if (sta
->deflink
.he_6ghz_capa
.capa
)
1591 ra
->af
= le16_get_bits(sta
->deflink
.he_6ghz_capa
.capa
,
1592 IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP
);
1595 ra
->sta_cap
= cpu_to_le32(cap
);
1598 int mt7915_mcu_add_rate_ctrl(struct mt7915_dev
*dev
, struct ieee80211_vif
*vif
,
1599 struct ieee80211_sta
*sta
, bool changed
)
1601 struct mt7915_vif
*mvif
= (struct mt7915_vif
*)vif
->drv_priv
;
1602 struct mt7915_sta
*msta
= (struct mt7915_sta
*)sta
->drv_priv
;
1603 struct sk_buff
*skb
;
1606 skb
= mt76_connac_mcu_alloc_sta_req(&dev
->mt76
, &mvif
->mt76
,
1609 return PTR_ERR(skb
);
1611 /* firmware rc algorithm refers to sta_rec_he for HE control.
1612 * once dev->rc_work changes the settings driver should also
1613 * update sta_rec_he here.
1616 mt7915_mcu_sta_he_tlv(skb
, sta
, vif
);
1618 /* sta_rec_ra accommodates BW, NSS and only MCS range format
1619 * i.e 0-{7,8,9} for VHT.
1621 mt7915_mcu_sta_rate_ctrl_tlv(skb
, dev
, vif
, sta
);
1623 ret
= mt76_mcu_skb_send_msg(&dev
->mt76
, skb
,
1624 MCU_EXT_CMD(STA_REC_UPDATE
), true);
1628 /* sta_rec_ra_fixed accommodates single rate, (HE)GI and HE_LTE,
1629 * and updates as peer fixed rate parameters, which overrides
1630 * sta_rec_ra and firmware rate control algorithm.
1632 return mt7915_mcu_add_rate_ctrl_fixed(dev
, vif
, sta
);
1636 mt7915_mcu_add_group(struct mt7915_dev
*dev
, struct ieee80211_vif
*vif
,
1637 struct ieee80211_sta
*sta
)
1639 #define MT_STA_BSS_GROUP 1
1640 struct mt7915_vif
*mvif
= (struct mt7915_vif
*)vif
->drv_priv
;
1641 struct mt7915_sta
*msta
;
1651 .action
= cpu_to_le32(MT_STA_BSS_GROUP
),
1652 .val
= cpu_to_le32(mvif
->mt76
.idx
% 16),
1655 msta
= sta
? (struct mt7915_sta
*)sta
->drv_priv
: &mvif
->sta
;
1656 req
.wlan_idx_lo
= to_wcid_lo(msta
->wcid
.idx
);
1657 req
.wlan_idx_hi
= to_wcid_hi(msta
->wcid
.idx
);
1659 return mt76_mcu_send_msg(&dev
->mt76
, MCU_EXT_CMD(SET_DRR_CTRL
), &req
,
1663 int mt7915_mcu_add_sta(struct mt7915_dev
*dev
, struct ieee80211_vif
*vif
,
1664 struct ieee80211_sta
*sta
, int conn_state
, bool newly
)
1666 struct mt7915_vif
*mvif
= (struct mt7915_vif
*)vif
->drv_priv
;
1667 struct ieee80211_link_sta
*link_sta
;
1668 struct mt7915_sta
*msta
;
1669 struct sk_buff
*skb
;
1672 msta
= sta
? (struct mt7915_sta
*)sta
->drv_priv
: &mvif
->sta
;
1673 link_sta
= sta
? &sta
->deflink
: NULL
;
1675 skb
= mt76_connac_mcu_alloc_sta_req(&dev
->mt76
, &mvif
->mt76
,
1678 return PTR_ERR(skb
);
1681 mt76_connac_mcu_sta_basic_tlv(&dev
->mt76
, skb
, vif
, link_sta
,
1683 /* tag order is in accordance with firmware dependency. */
1684 if (sta
&& conn_state
!= CONN_STATE_DISCONNECT
) {
1686 mt7915_mcu_sta_bfer_tlv(dev
, skb
, vif
, sta
);
1688 mt7915_mcu_sta_ht_tlv(skb
, sta
);
1690 mt7915_mcu_sta_vht_tlv(skb
, sta
);
1692 mt76_connac_mcu_sta_uapsd(skb
, vif
, sta
);
1695 if (newly
|| conn_state
!= CONN_STATE_DISCONNECT
) {
1696 ret
= mt7915_mcu_sta_wtbl_tlv(dev
, skb
, vif
, sta
);
1703 if (conn_state
== CONN_STATE_DISCONNECT
)
1708 mt7915_mcu_sta_amsdu_tlv(dev
, skb
, vif
, sta
);
1710 mt7915_mcu_sta_he_tlv(skb
, sta
, vif
);
1712 mt7915_mcu_sta_muru_tlv(dev
, skb
, sta
, vif
);
1714 mt7915_mcu_sta_bfee_tlv(dev
, skb
, vif
, sta
);
1717 ret
= mt7915_mcu_add_group(dev
, vif
, sta
);
1723 ret
= mt76_connac_mcu_sta_wed_update(&dev
->mt76
, skb
);
1727 return mt76_mcu_skb_send_msg(&dev
->mt76
, skb
,
1728 MCU_EXT_CMD(STA_REC_UPDATE
), true);
1731 int mt7915_mcu_wed_enable_rx_stats(struct mt7915_dev
*dev
)
1733 #ifdef CONFIG_NET_MEDIATEK_SOC_WED
1734 struct mtk_wed_device
*wed
= &dev
->mt76
.mmio
.wed
;
1738 .args
[0] = cpu_to_le32(1),
1739 .args
[1] = cpu_to_le32(6),
1742 return mtk_wed_device_update_msg(wed
, MTK_WED_WO_CMD_RXCNT_CTRL
,
1749 int mt7915_mcu_add_dev_info(struct mt7915_phy
*phy
,
1750 struct ieee80211_vif
*vif
, bool enable
)
1752 struct mt7915_dev
*dev
= phy
->dev
;
1753 struct mt7915_vif
*mvif
= (struct mt7915_vif
*)vif
->drv_priv
;
1767 u8 omac_addr
[ETH_ALEN
];
1771 .omac_idx
= mvif
->mt76
.omac_idx
,
1772 .band_idx
= mvif
->mt76
.band_idx
,
1773 .tlv_num
= cpu_to_le16(1),
1777 .tag
= cpu_to_le16(DEV_INFO_ACTIVE
),
1778 .len
= cpu_to_le16(sizeof(struct req_tlv
)),
1780 .band_idx
= mvif
->mt76
.band_idx
,
1784 if (mvif
->mt76
.omac_idx
>= REPEATER_BSSID_START
)
1785 return mt7915_mcu_muar_config(phy
, vif
, false, enable
);
1787 memcpy(data
.tlv
.omac_addr
, vif
->addr
, ETH_ALEN
);
1788 return mt76_mcu_send_msg(&dev
->mt76
, MCU_EXT_CMD(DEV_INFO_UPDATE
),
1789 &data
, sizeof(data
), true);
1793 mt7915_mcu_beacon_cntdwn(struct ieee80211_vif
*vif
, struct sk_buff
*rskb
,
1794 struct sk_buff
*skb
, struct bss_info_bcn
*bcn
,
1795 struct ieee80211_mutable_offsets
*offs
)
1797 struct bss_info_bcn_cntdwn
*info
;
1801 if (!offs
->cntdwn_counter_offs
[0])
1804 sub_tag
= vif
->bss_conf
.csa_active
? BSS_INFO_BCN_CSA
: BSS_INFO_BCN_BCC
;
1805 tlv
= mt7915_mcu_add_nested_subtlv(rskb
, sub_tag
, sizeof(*info
),
1806 &bcn
->sub_ntlv
, &bcn
->len
);
1807 info
= (struct bss_info_bcn_cntdwn
*)tlv
;
1808 info
->cnt
= skb
->data
[offs
->cntdwn_counter_offs
[0]];
1812 mt7915_mcu_beacon_mbss(struct sk_buff
*rskb
, struct sk_buff
*skb
,
1813 struct ieee80211_vif
*vif
, struct bss_info_bcn
*bcn
,
1814 struct ieee80211_mutable_offsets
*offs
)
1816 struct bss_info_bcn_mbss
*mbss
;
1817 const struct element
*elem
;
1820 if (!vif
->bss_conf
.bssid_indicator
)
1823 tlv
= mt7915_mcu_add_nested_subtlv(rskb
, BSS_INFO_BCN_MBSSID
,
1824 sizeof(*mbss
), &bcn
->sub_ntlv
,
1827 mbss
= (struct bss_info_bcn_mbss
*)tlv
;
1828 mbss
->offset
[0] = cpu_to_le16(offs
->tim_offset
);
1829 mbss
->bitmap
= cpu_to_le32(1);
1831 for_each_element_id(elem
, WLAN_EID_MULTIPLE_BSSID
,
1832 &skb
->data
[offs
->mbssid_off
],
1833 skb
->len
- offs
->mbssid_off
) {
1834 const struct element
*sub_elem
;
1836 if (elem
->datalen
< 2)
1839 for_each_element(sub_elem
, elem
->data
+ 1, elem
->datalen
- 1) {
1840 const struct ieee80211_bssid_index
*idx
;
1843 if (sub_elem
->id
|| sub_elem
->datalen
< 4)
1844 continue; /* not a valid BSS profile */
1846 /* Find WLAN_EID_MULTI_BSSID_IDX
1847 * in the merged nontransmitted profile
1849 idx_ie
= cfg80211_find_ie(WLAN_EID_MULTI_BSSID_IDX
,
1852 if (!idx_ie
|| idx_ie
[1] < sizeof(*idx
))
1855 idx
= (void *)(idx_ie
+ 2);
1856 if (!idx
->bssid_index
|| idx
->bssid_index
> 31)
1859 mbss
->offset
[idx
->bssid_index
] =
1860 cpu_to_le16(idx_ie
- skb
->data
);
1861 mbss
->bitmap
|= cpu_to_le32(BIT(idx
->bssid_index
));
1867 mt7915_mcu_beacon_cont(struct mt7915_dev
*dev
, struct ieee80211_vif
*vif
,
1868 struct sk_buff
*rskb
, struct sk_buff
*skb
,
1869 struct bss_info_bcn
*bcn
,
1870 struct ieee80211_mutable_offsets
*offs
)
1872 struct mt76_wcid
*wcid
= &dev
->mt76
.global_wcid
;
1873 struct bss_info_bcn_cont
*cont
;
1876 int len
= sizeof(*cont
) + MT_TXD_SIZE
+ skb
->len
;
1878 len
= (len
& 0x3) ? ((len
| 0x3) + 1) : len
;
1879 tlv
= mt7915_mcu_add_nested_subtlv(rskb
, BSS_INFO_BCN_CONTENT
,
1880 len
, &bcn
->sub_ntlv
, &bcn
->len
);
1882 cont
= (struct bss_info_bcn_cont
*)tlv
;
1883 cont
->pkt_len
= cpu_to_le16(MT_TXD_SIZE
+ skb
->len
);
1884 cont
->tim_ofs
= cpu_to_le16(offs
->tim_offset
);
1886 if (offs
->cntdwn_counter_offs
[0]) {
1887 u16 offset
= offs
->cntdwn_counter_offs
[0];
1889 if (vif
->bss_conf
.csa_active
)
1890 cont
->csa_ofs
= cpu_to_le16(offset
- 4);
1891 if (vif
->bss_conf
.color_change_active
)
1892 cont
->bcc_ofs
= cpu_to_le16(offset
- 3);
1895 buf
= (u8
*)tlv
+ sizeof(*cont
);
1896 mt7915_mac_write_txwi(&dev
->mt76
, (__le32
*)buf
, skb
, wcid
, 0, NULL
,
1897 0, BSS_CHANGED_BEACON
);
1898 memcpy(buf
+ MT_TXD_SIZE
, skb
->data
, skb
->len
);
1902 mt7915_mcu_add_inband_discov(struct mt7915_dev
*dev
, struct ieee80211_vif
*vif
,
1905 #define OFFLOAD_TX_MODE_SU BIT(0)
1906 #define OFFLOAD_TX_MODE_MU BIT(1)
1907 struct ieee80211_hw
*hw
= mt76_hw(dev
);
1908 struct mt7915_phy
*phy
= mt7915_hw_phy(hw
);
1909 struct mt7915_vif
*mvif
= (struct mt7915_vif
*)vif
->drv_priv
;
1910 struct cfg80211_chan_def
*chandef
= &mvif
->phy
->mt76
->chandef
;
1911 enum nl80211_band band
= chandef
->chan
->band
;
1912 struct mt76_wcid
*wcid
= &dev
->mt76
.global_wcid
;
1913 struct bss_info_bcn
*bcn
;
1914 struct bss_info_inband_discovery
*discov
;
1915 struct ieee80211_tx_info
*info
;
1916 struct sk_buff
*rskb
, *skb
= NULL
;
1917 struct tlv
*tlv
, *sub_tlv
;
1918 bool ext_phy
= phy
!= &dev
->phy
;
1922 if (vif
->bss_conf
.nontransmitted
)
1925 rskb
= __mt76_connac_mcu_alloc_sta_req(&dev
->mt76
, &mvif
->mt76
, NULL
,
1926 MT7915_MAX_BSS_OFFLOAD_SIZE
);
1928 return PTR_ERR(rskb
);
1930 tlv
= mt76_connac_mcu_add_tlv(rskb
, BSS_INFO_OFFLOAD
, sizeof(*bcn
));
1931 bcn
= (struct bss_info_bcn
*)tlv
;
1934 if (changed
& BSS_CHANGED_FILS_DISCOVERY
) {
1935 interval
= vif
->bss_conf
.fils_discovery
.max_interval
;
1936 skb
= ieee80211_get_fils_discovery_tmpl(hw
, vif
);
1937 } else if (changed
& BSS_CHANGED_UNSOL_BCAST_PROBE_RESP
&&
1938 vif
->bss_conf
.unsol_bcast_probe_resp_interval
) {
1939 interval
= vif
->bss_conf
.unsol_bcast_probe_resp_interval
;
1940 skb
= ieee80211_get_unsol_bcast_probe_resp_tmpl(hw
, vif
);
1944 dev_kfree_skb(rskb
);
1948 info
= IEEE80211_SKB_CB(skb
);
1949 info
->control
.vif
= vif
;
1951 info
->hw_queue
|= FIELD_PREP(MT_TX_HW_QUEUE_PHY
, ext_phy
);
1953 len
= sizeof(*discov
) + MT_TXD_SIZE
+ skb
->len
;
1954 len
= (len
& 0x3) ? ((len
| 0x3) + 1) : len
;
1956 if (skb
->len
> MT7915_MAX_BEACON_SIZE
) {
1957 dev_err(dev
->mt76
.dev
, "inband discovery size limit exceed\n");
1958 dev_kfree_skb(rskb
);
1963 sub_tlv
= mt7915_mcu_add_nested_subtlv(rskb
, BSS_INFO_BCN_DISCOV
,
1964 len
, &bcn
->sub_ntlv
, &bcn
->len
);
1965 discov
= (struct bss_info_inband_discovery
*)sub_tlv
;
1966 discov
->tx_mode
= OFFLOAD_TX_MODE_SU
;
1967 /* 0: UNSOL PROBE RESP, 1: FILS DISCOV */
1968 discov
->tx_type
= !!(changed
& BSS_CHANGED_FILS_DISCOVERY
);
1969 discov
->tx_interval
= interval
;
1970 discov
->prob_rsp_len
= cpu_to_le16(MT_TXD_SIZE
+ skb
->len
);
1971 discov
->enable
= !!interval
;
1973 buf
= (u8
*)sub_tlv
+ sizeof(*discov
);
1975 mt7915_mac_write_txwi(&dev
->mt76
, (__le32
*)buf
, skb
, wcid
, 0, NULL
,
1977 memcpy(buf
+ MT_TXD_SIZE
, skb
->data
, skb
->len
);
1981 return mt76_mcu_skb_send_msg(&phy
->dev
->mt76
, rskb
,
1982 MCU_EXT_CMD(BSS_INFO_UPDATE
), true);
1985 int mt7915_mcu_add_beacon(struct ieee80211_hw
*hw
, struct ieee80211_vif
*vif
,
1986 int en
, u32 changed
)
1988 struct mt7915_dev
*dev
= mt7915_hw_dev(hw
);
1989 struct mt7915_phy
*phy
= mt7915_hw_phy(hw
);
1990 struct mt7915_vif
*mvif
= (struct mt7915_vif
*)vif
->drv_priv
;
1991 struct ieee80211_mutable_offsets offs
;
1992 struct ieee80211_tx_info
*info
;
1993 struct sk_buff
*skb
, *rskb
;
1995 struct bss_info_bcn
*bcn
;
1996 int len
= MT7915_MAX_BSS_OFFLOAD_SIZE
;
1997 bool ext_phy
= phy
!= &dev
->phy
;
1999 if (vif
->bss_conf
.nontransmitted
)
2002 rskb
= __mt76_connac_mcu_alloc_sta_req(&dev
->mt76
, &mvif
->mt76
,
2005 return PTR_ERR(rskb
);
2007 tlv
= mt76_connac_mcu_add_tlv(rskb
, BSS_INFO_OFFLOAD
, sizeof(*bcn
));
2008 bcn
= (struct bss_info_bcn
*)tlv
;
2014 skb
= ieee80211_beacon_get_template(hw
, vif
, &offs
, 0);
2016 dev_kfree_skb(rskb
);
2020 if (skb
->len
> MT7915_MAX_BEACON_SIZE
) {
2021 dev_err(dev
->mt76
.dev
, "Bcn size limit exceed\n");
2022 dev_kfree_skb(rskb
);
2027 info
= IEEE80211_SKB_CB(skb
);
2028 info
->hw_queue
= FIELD_PREP(MT_TX_HW_QUEUE_PHY
, ext_phy
);
2030 mt7915_mcu_beacon_cntdwn(vif
, rskb
, skb
, bcn
, &offs
);
2031 mt7915_mcu_beacon_mbss(rskb
, skb
, vif
, bcn
, &offs
);
2032 mt7915_mcu_beacon_cont(dev
, vif
, rskb
, skb
, bcn
, &offs
);
2036 return mt76_mcu_skb_send_msg(&phy
->dev
->mt76
, rskb
,
2037 MCU_EXT_CMD(BSS_INFO_UPDATE
), true);
2040 static int mt7915_driver_own(struct mt7915_dev
*dev
, u8 band
)
2042 mt76_wr(dev
, MT_TOP_LPCR_HOST_BAND(band
), MT_TOP_LPCR_HOST_DRV_OWN
);
2043 if (!mt76_poll_msec(dev
, MT_TOP_LPCR_HOST_BAND(band
),
2044 MT_TOP_LPCR_HOST_FW_OWN_STAT
, 0, 500)) {
2045 dev_err(dev
->mt76
.dev
, "Timeout for driver own\n");
2049 /* clear irq when the driver own success */
2050 mt76_wr(dev
, MT_TOP_LPCR_HOST_BAND_IRQ_STAT(band
),
2051 MT_TOP_LPCR_HOST_BAND_STAT
);
2057 mt7915_firmware_state(struct mt7915_dev
*dev
, bool wa
)
2059 u32 state
= FIELD_PREP(MT_TOP_MISC_FW_STATE
,
2060 wa
? FW_STATE_RDY
: FW_STATE_FW_DOWNLOAD
);
2062 if (!mt76_poll_msec(dev
, MT_TOP_MISC
, MT_TOP_MISC_FW_STATE
,
2064 dev_err(dev
->mt76
.dev
, "Timeout for initializing firmware\n");
2070 static int mt7915_load_firmware(struct mt7915_dev
*dev
)
2074 /* make sure fw is download state */
2075 if (mt7915_firmware_state(dev
, false)) {
2076 /* restart firmware once */
2077 mt76_connac_mcu_restart(&dev
->mt76
);
2078 ret
= mt7915_firmware_state(dev
, false);
2080 dev_err(dev
->mt76
.dev
,
2081 "Firmware is not ready for download\n");
2086 ret
= mt76_connac2_load_patch(&dev
->mt76
, fw_name_var(dev
, ROM_PATCH
));
2090 ret
= mt76_connac2_load_ram(&dev
->mt76
, fw_name_var(dev
, FIRMWARE_WM
),
2091 fw_name(dev
, FIRMWARE_WA
));
2095 ret
= mt7915_firmware_state(dev
, true);
2099 mt76_queue_tx_cleanup(dev
, dev
->mt76
.q_mcu
[MT_MCUQ_FWDL
], false);
2101 dev_dbg(dev
->mt76
.dev
, "Firmware init done\n");
2106 int mt7915_mcu_fw_log_2_host(struct mt7915_dev
*dev
, u8 type
, u8 ctrl
)
2115 if (type
== MCU_FW_LOG_WA
)
2116 return mt76_mcu_send_msg(&dev
->mt76
, MCU_WA_EXT_CMD(FW_LOG_2_HOST
),
2117 &data
, sizeof(data
), true);
2119 return mt76_mcu_send_msg(&dev
->mt76
, MCU_EXT_CMD(FW_LOG_2_HOST
), &data
,
2120 sizeof(data
), true);
2123 int mt7915_mcu_fw_dbg_ctrl(struct mt7915_dev
*dev
, u32 module
, u8 level
)
2133 .module_idx
= cpu_to_le32(module
),
2137 return mt76_mcu_send_msg(&dev
->mt76
, MCU_EXT_CMD(FW_DBG_CTRL
), &data
,
2138 sizeof(data
), false);
2141 int mt7915_mcu_muru_debug_set(struct mt7915_dev
*dev
, bool enabled
)
2147 .cmd
= cpu_to_le32(MURU_SET_TXC_TX_STATS_EN
),
2151 return mt76_mcu_send_msg(&dev
->mt76
, MCU_EXT_CMD(MURU_CTRL
), &data
,
2152 sizeof(data
), false);
2155 int mt7915_mcu_muru_debug_get(struct mt7915_phy
*phy
)
2157 struct mt7915_dev
*dev
= phy
->dev
;
2158 struct sk_buff
*skb
;
2159 struct mt7915_mcu_muru_stats
*mu_stats
;
2166 .cmd
= cpu_to_le32(MURU_GET_TXC_TX_STATS
),
2167 .band_idx
= phy
->mt76
->band_idx
,
2170 ret
= mt76_mcu_send_and_get_msg(&dev
->mt76
, MCU_EXT_CMD(MURU_CTRL
),
2171 &req
, sizeof(req
), true, &skb
);
2175 mu_stats
= (struct mt7915_mcu_muru_stats
*)(skb
->data
);
2177 /* accumulate stats, these are clear-on-read */
2178 #define __dl_u32(s) phy->mib.dl_##s += le32_to_cpu(mu_stats->dl.s)
2179 #define __ul_u32(s) phy->mib.ul_##s += le32_to_cpu(mu_stats->ul.s)
2182 __dl_u32(htmix_cnt
);
2184 __dl_u32(vht_su_cnt
);
2185 __dl_u32(vht_2mu_cnt
);
2186 __dl_u32(vht_3mu_cnt
);
2187 __dl_u32(vht_4mu_cnt
);
2188 __dl_u32(he_su_cnt
);
2189 __dl_u32(he_2ru_cnt
);
2190 __dl_u32(he_2mu_cnt
);
2191 __dl_u32(he_3ru_cnt
);
2192 __dl_u32(he_3mu_cnt
);
2193 __dl_u32(he_4ru_cnt
);
2194 __dl_u32(he_4mu_cnt
);
2195 __dl_u32(he_5to8ru_cnt
);
2196 __dl_u32(he_9to16ru_cnt
);
2197 __dl_u32(he_gtr16ru_cnt
);
2199 __ul_u32(hetrig_su_cnt
);
2200 __ul_u32(hetrig_2ru_cnt
);
2201 __ul_u32(hetrig_3ru_cnt
);
2202 __ul_u32(hetrig_4ru_cnt
);
2203 __ul_u32(hetrig_5to8ru_cnt
);
2204 __ul_u32(hetrig_9to16ru_cnt
);
2205 __ul_u32(hetrig_gtr16ru_cnt
);
2206 __ul_u32(hetrig_2mu_cnt
);
2207 __ul_u32(hetrig_3mu_cnt
);
2208 __ul_u32(hetrig_4mu_cnt
);
2217 static int mt7915_mcu_set_mwds(struct mt7915_dev
*dev
, bool enabled
)
2226 return mt76_mcu_send_msg(&dev
->mt76
, MCU_WA_EXT_CMD(MWDS_SUPPORT
), &req
,
2227 sizeof(req
), false);
2230 int mt7915_mcu_set_muru_ctrl(struct mt7915_dev
*dev
, u32 cmd
, u32 val
)
2236 .cmd
= cpu_to_le32(cmd
),
2239 put_unaligned_le32(val
, req
.val
);
2241 return mt76_mcu_send_msg(&dev
->mt76
, MCU_EXT_CMD(MURU_CTRL
), &req
,
2242 sizeof(req
), false);
2246 mt7915_mcu_init_rx_airtime(struct mt7915_dev
*dev
)
2248 #define RX_AIRTIME_FEATURE_CTRL 1
2249 #define RX_AIRTIME_BITWISE_CTRL 2
2250 #define RX_AIRTIME_CLEAR_EN 1
2267 .field
= cpu_to_le16(RX_AIRTIME_BITWISE_CTRL
),
2268 .sub_field
= cpu_to_le16(RX_AIRTIME_CLEAR_EN
),
2269 .airtime_clear
= true,
2273 ret
= mt76_mcu_send_msg(&dev
->mt76
, MCU_EXT_CMD(RX_AIRTIME_CTRL
), &req
,
2278 req
.field
= cpu_to_le16(RX_AIRTIME_FEATURE_CTRL
);
2279 req
.sub_field
= cpu_to_le16(RX_AIRTIME_CLEAR_EN
);
2280 req
.airtime_en
= true;
2282 return mt76_mcu_send_msg(&dev
->mt76
, MCU_EXT_CMD(RX_AIRTIME_CTRL
), &req
,
2286 static int mt7915_red_set_watermark(struct mt7915_dev
*dev
)
2288 #define RED_GLOBAL_TOKEN_WATERMARK 2
2299 .args
[0] = cpu_to_le32(MCU_WA_PARAM_RED_SETTING
),
2300 .cmd
= RED_GLOBAL_TOKEN_WATERMARK
,
2301 .len
= cpu_to_le16(sizeof(req
) - sizeof(req
.args
)),
2302 .high_mark
= cpu_to_le16(MT7915_HW_TOKEN_SIZE
- 256),
2303 .low_mark
= cpu_to_le16(MT7915_HW_TOKEN_SIZE
- 256 - 1536),
2306 return mt76_mcu_send_msg(&dev
->mt76
, MCU_WA_PARAM_CMD(SET
), &req
,
2307 sizeof(req
), false);
2310 static int mt7915_mcu_set_red(struct mt7915_dev
*dev
, bool enabled
)
2312 #define RED_DISABLE 0
2313 #define RED_BY_WA_ENABLE 2
2315 u32 red_type
= enabled
? RED_BY_WA_ENABLE
: RED_DISABLE
;
2316 __le32 req
= cpu_to_le32(red_type
);
2319 ret
= mt7915_red_set_watermark(dev
);
2324 ret
= mt76_mcu_send_msg(&dev
->mt76
, MCU_EXT_CMD(RED_ENABLE
), &req
,
2325 sizeof(req
), false);
2329 return mt7915_mcu_wa_cmd(dev
, MCU_WA_PARAM_CMD(SET
),
2330 MCU_WA_PARAM_RED
, enabled
, 0);
2333 int mt7915_mcu_init_firmware(struct mt7915_dev
*dev
)
2337 /* force firmware operation mode into normal state,
2338 * which should be set before firmware download stage.
2340 mt76_wr(dev
, MT_SWDEF_MODE
, MT_SWDEF_NORMAL_MODE
);
2342 ret
= mt7915_driver_own(dev
, 0);
2345 /* set driver own for band1 when two hif exist */
2347 ret
= mt7915_driver_own(dev
, 1);
2352 ret
= mt7915_load_firmware(dev
);
2356 set_bit(MT76_STATE_MCU_RUNNING
, &dev
->mphy
.state
);
2357 ret
= mt7915_mcu_fw_log_2_host(dev
, MCU_FW_LOG_WM
, 0);
2361 ret
= mt7915_mcu_fw_log_2_host(dev
, MCU_FW_LOG_WA
, 0);
2365 mt76_connac_mcu_del_wtbl_all(&dev
->mt76
);
2367 if ((mtk_wed_device_active(&dev
->mt76
.mmio
.wed
) &&
2368 is_mt7915(&dev
->mt76
)) ||
2369 !mtk_wed_get_rx_capa(&dev
->mt76
.mmio
.wed
))
2370 mt7915_mcu_wa_cmd(dev
, MCU_WA_PARAM_CMD(CAPABILITY
), 0, 0, 0);
2372 ret
= mt7915_mcu_set_mwds(dev
, 1);
2376 ret
= mt7915_mcu_set_muru_ctrl(dev
, MURU_SET_PLATFORM_TYPE
,
2377 MURU_PLATFORM_TYPE_PERF_LEVEL_2
);
2381 ret
= mt7915_mcu_init_rx_airtime(dev
);
2385 return mt7915_mcu_set_red(dev
, mtk_wed_device_active(&dev
->mt76
.mmio
.wed
));
2388 int mt7915_mcu_init(struct mt7915_dev
*dev
)
2390 static const struct mt76_mcu_ops mt7915_mcu_ops
= {
2392 .headroom
= sizeof(struct mt76_connac2_mcu_txd
),
2393 .mcu_skb_prepare_msg
= mt76_connac2_mcu_fill_message
,
2394 .mcu_skb_send_msg
= mt7915_mcu_send_message
,
2395 .mcu_parse_response
= mt7915_mcu_parse_response
,
2398 dev
->mt76
.mcu_ops
= &mt7915_mcu_ops
;
2400 return mt7915_mcu_init_firmware(dev
);
2403 void mt7915_mcu_exit(struct mt7915_dev
*dev
)
2405 mt76_connac_mcu_restart(&dev
->mt76
);
2406 if (mt7915_firmware_state(dev
, false)) {
2407 dev_err(dev
->mt76
.dev
, "Failed to exit mcu\n");
2411 mt76_wr(dev
, MT_TOP_LPCR_HOST_BAND(0), MT_TOP_LPCR_HOST_FW_OWN
);
2413 mt76_wr(dev
, MT_TOP_LPCR_HOST_BAND(1),
2414 MT_TOP_LPCR_HOST_FW_OWN
);
2416 skb_queue_purge(&dev
->mt76
.mcu
.res_q
);
2420 mt7915_mcu_set_rx_hdr_trans_blacklist(struct mt7915_dev
*dev
, int band
)
2433 .etype
= cpu_to_le16(ETH_P_PAE
),
2436 return mt76_mcu_send_msg(&dev
->mt76
, MCU_EXT_CMD(RX_HDR_TRANS
),
2437 &req
, sizeof(req
), false);
2440 int mt7915_mcu_set_mac(struct mt7915_dev
*dev
, int band
,
2441 bool enable
, bool hdr_trans
)
2452 } __packed req_trans
= {
2453 .enable
= hdr_trans
,
2459 } __packed req_mac
= {
2465 ret
= mt76_mcu_send_msg(&dev
->mt76
, MCU_EXT_CMD(RX_HDR_TRANS
),
2466 &req_trans
, sizeof(req_trans
), false);
2471 mt7915_mcu_set_rx_hdr_trans_blacklist(dev
, band
);
2473 return mt76_mcu_send_msg(&dev
->mt76
, MCU_EXT_CMD(MAC_INIT_CTRL
),
2474 &req_mac
, sizeof(req_mac
), true);
2477 int mt7915_mcu_update_edca(struct mt7915_dev
*dev
, void *param
)
2479 struct mt7915_mcu_tx
*req
= (struct mt7915_mcu_tx
*)param
;
2480 u8 num
= req
->total
;
2481 size_t len
= sizeof(*req
) -
2482 (IEEE80211_NUM_ACS
- num
) * sizeof(struct edca
);
2484 return mt76_mcu_send_msg(&dev
->mt76
, MCU_EXT_CMD(EDCA_UPDATE
), req
,
2488 int mt7915_mcu_set_tx(struct mt7915_dev
*dev
, struct ieee80211_vif
*vif
)
2490 #define TX_CMD_MODE 1
2491 struct mt7915_mcu_tx req
= {
2493 .mode
= TX_CMD_MODE
,
2494 .total
= IEEE80211_NUM_ACS
,
2496 struct mt7915_vif
*mvif
= (struct mt7915_vif
*)vif
->drv_priv
;
2499 for (ac
= 0; ac
< IEEE80211_NUM_ACS
; ac
++) {
2500 struct ieee80211_tx_queue_params
*q
= &mvif
->queue_params
[ac
];
2501 struct edca
*e
= &req
.edca
[ac
];
2503 e
->set
= WMM_PARAM_SET
;
2504 e
->queue
= ac
+ mvif
->mt76
.wmm_idx
* MT76_CONNAC_MAX_WMM_SETS
;
2506 e
->txop
= cpu_to_le16(q
->txop
);
2509 e
->cw_min
= fls(q
->cw_min
);
2514 e
->cw_max
= cpu_to_le16(fls(q
->cw_max
));
2516 e
->cw_max
= cpu_to_le16(10);
2519 return mt7915_mcu_update_edca(dev
, &req
);
2522 int mt7915_mcu_set_fcc5_lpn(struct mt7915_dev
*dev
, int val
)
2529 .tag
= cpu_to_le32(0x1),
2530 .min_lpn
= cpu_to_le16(val
),
2533 return mt76_mcu_send_msg(&dev
->mt76
, MCU_EXT_CMD(SET_RDD_TH
), &req
,
2537 int mt7915_mcu_set_pulse_th(struct mt7915_dev
*dev
,
2538 const struct mt7915_dfs_pulse
*pulse
)
2543 __le32 max_width
; /* us */
2544 __le32 max_pwr
; /* dbm */
2545 __le32 min_pwr
; /* dbm */
2546 __le32 min_stgr_pri
; /* us */
2547 __le32 max_stgr_pri
; /* us */
2548 __le32 min_cr_pri
; /* us */
2549 __le32 max_cr_pri
; /* us */
2551 .tag
= cpu_to_le32(0x3),
2553 #define __req_field(field) .field = cpu_to_le32(pulse->field)
2554 __req_field(max_width
),
2555 __req_field(max_pwr
),
2556 __req_field(min_pwr
),
2557 __req_field(min_stgr_pri
),
2558 __req_field(max_stgr_pri
),
2559 __req_field(min_cr_pri
),
2560 __req_field(max_cr_pri
),
2564 return mt76_mcu_send_msg(&dev
->mt76
, MCU_EXT_CMD(SET_RDD_TH
), &req
,
2568 int mt7915_mcu_set_radar_th(struct mt7915_dev
*dev
, int index
,
2569 const struct mt7915_dfs_pattern
*pattern
)
2590 __le32 min_stgpr_diff
;
2592 .tag
= cpu_to_le32(0x2),
2593 .radar_type
= cpu_to_le16(index
),
2595 #define __req_field_u8(field) .field = pattern->field
2596 #define __req_field_u32(field) .field = cpu_to_le32(pattern->field)
2597 __req_field_u8(enb
),
2598 __req_field_u8(stgr
),
2599 __req_field_u8(min_crpn
),
2600 __req_field_u8(max_crpn
),
2601 __req_field_u8(min_crpr
),
2602 __req_field_u8(min_pw
),
2603 __req_field_u32(min_pri
),
2604 __req_field_u32(max_pri
),
2605 __req_field_u8(max_pw
),
2606 __req_field_u8(min_crbn
),
2607 __req_field_u8(max_crbn
),
2608 __req_field_u8(min_stgpn
),
2609 __req_field_u8(max_stgpn
),
2610 __req_field_u8(min_stgpr
),
2611 __req_field_u32(min_stgpr_diff
),
2612 #undef __req_field_u8
2613 #undef __req_field_u32
2616 return mt76_mcu_send_msg(&dev
->mt76
, MCU_EXT_CMD(SET_RDD_TH
), &req
,
2621 mt7915_mcu_background_chain_ctrl(struct mt7915_phy
*phy
,
2622 struct cfg80211_chan_def
*chandef
,
2625 struct mt7915_dev
*dev
= phy
->dev
;
2626 struct mt76_phy
*mphy
= phy
->mt76
;
2627 struct ieee80211_channel
*chan
= mphy
->chandef
.chan
;
2628 int freq
= mphy
->chandef
.center_freq1
;
2629 struct mt7915_mcu_background_chain_ctrl req
= {
2630 .monitor_scan_type
= 2, /* simple rx */
2633 if (!chandef
&& cmd
!= CH_SWITCH_BACKGROUND_SCAN_STOP
)
2636 if (!cfg80211_chandef_valid(&mphy
->chandef
))
2640 case CH_SWITCH_BACKGROUND_SCAN_START
: {
2641 req
.chan
= chan
->hw_value
;
2642 req
.central_chan
= ieee80211_frequency_to_channel(freq
);
2643 req
.bw
= mt76_connac_chan_bw(&mphy
->chandef
);
2644 req
.monitor_chan
= chandef
->chan
->hw_value
;
2645 req
.monitor_central_chan
=
2646 ieee80211_frequency_to_channel(chandef
->center_freq1
);
2647 req
.monitor_bw
= mt76_connac_chan_bw(chandef
);
2648 req
.band_idx
= phy
->mt76
->band_idx
;
2652 case CH_SWITCH_BACKGROUND_SCAN_RUNNING
:
2653 req
.monitor_chan
= chandef
->chan
->hw_value
;
2654 req
.monitor_central_chan
=
2655 ieee80211_frequency_to_channel(chandef
->center_freq1
);
2656 req
.band_idx
= phy
->mt76
->band_idx
;
2659 case CH_SWITCH_BACKGROUND_SCAN_STOP
:
2660 req
.chan
= chan
->hw_value
;
2661 req
.central_chan
= ieee80211_frequency_to_channel(freq
);
2662 req
.bw
= mt76_connac_chan_bw(&mphy
->chandef
);
2663 req
.tx_stream
= hweight8(mphy
->antenna_mask
);
2664 req
.rx_stream
= mphy
->antenna_mask
;
2669 req
.band
= chandef
? chandef
->chan
->band
== NL80211_BAND_5GHZ
: 1;
2671 return mt76_mcu_send_msg(&dev
->mt76
, MCU_EXT_CMD(OFFCH_SCAN_CTRL
),
2672 &req
, sizeof(req
), false);
2675 int mt7915_mcu_rdd_background_enable(struct mt7915_phy
*phy
,
2676 struct cfg80211_chan_def
*chandef
)
2678 struct mt7915_dev
*dev
= phy
->dev
;
2681 if (!chandef
) { /* disable offchain */
2682 err
= mt76_connac_mcu_rdd_cmd(&dev
->mt76
, RDD_STOP
, MT_RX_SEL2
,
2687 return mt7915_mcu_background_chain_ctrl(phy
, NULL
,
2688 CH_SWITCH_BACKGROUND_SCAN_STOP
);
2691 err
= mt7915_mcu_background_chain_ctrl(phy
, chandef
,
2692 CH_SWITCH_BACKGROUND_SCAN_START
);
2696 switch (dev
->mt76
.region
) {
2697 case NL80211_DFS_ETSI
:
2700 case NL80211_DFS_JP
:
2703 case NL80211_DFS_FCC
:
2709 return mt76_connac_mcu_rdd_cmd(&dev
->mt76
, RDD_START
, MT_RX_SEL2
,
2713 int mt7915_mcu_set_chan_info(struct mt7915_phy
*phy
, int cmd
)
2715 static const u8 ch_band
[] = {
2716 [NL80211_BAND_2GHZ
] = 0,
2717 [NL80211_BAND_5GHZ
] = 1,
2718 [NL80211_BAND_6GHZ
] = 2,
2720 struct mt7915_dev
*dev
= phy
->dev
;
2721 struct cfg80211_chan_def
*chandef
= &phy
->mt76
->chandef
;
2722 int freq1
= chandef
->center_freq1
;
2723 u8 band
= phy
->mt76
->band_idx
;
2729 u8 rx_path
; /* mask or num */
2732 u8 center_ch2
; /* for 80+80 only */
2736 __le32 outband_freq
;
2742 .control_ch
= chandef
->chan
->hw_value
,
2743 .center_ch
= ieee80211_frequency_to_channel(freq1
),
2744 .bw
= mt76_connac_chan_bw(chandef
),
2745 .tx_path_num
= hweight16(phy
->mt76
->chainmask
),
2746 .rx_path
= phy
->mt76
->chainmask
>> (dev
->chainshift
* band
),
2748 .channel_band
= ch_band
[chandef
->chan
->band
],
2751 #ifdef CONFIG_NL80211_TESTMODE
2752 if (phy
->mt76
->test
.tx_antenna_mask
&&
2753 mt76_testmode_enabled(phy
->mt76
)) {
2754 req
.tx_path_num
= fls(phy
->mt76
->test
.tx_antenna_mask
);
2755 req
.rx_path
= phy
->mt76
->test
.tx_antenna_mask
;
2759 if (mt76_connac_spe_idx(phy
->mt76
->antenna_mask
))
2760 req
.tx_path_num
= fls(phy
->mt76
->antenna_mask
);
2762 if (phy
->mt76
->hw
->conf
.flags
& IEEE80211_CONF_MONITOR
)
2763 req
.switch_reason
= CH_SWITCH_NORMAL
;
2764 else if (phy
->mt76
->offchannel
||
2765 phy
->mt76
->hw
->conf
.flags
& IEEE80211_CONF_IDLE
)
2766 req
.switch_reason
= CH_SWITCH_SCAN_BYPASS_DPD
;
2767 else if (!cfg80211_reg_can_beacon(phy
->mt76
->hw
->wiphy
, chandef
,
2769 req
.switch_reason
= CH_SWITCH_DFS
;
2771 req
.switch_reason
= CH_SWITCH_NORMAL
;
2773 if (cmd
== MCU_EXT_CMD(CHANNEL_SWITCH
))
2774 req
.rx_path
= hweight8(req
.rx_path
);
2776 if (chandef
->width
== NL80211_CHAN_WIDTH_80P80
) {
2777 int freq2
= chandef
->center_freq2
;
2779 req
.center_ch2
= ieee80211_frequency_to_channel(freq2
);
2782 return mt76_mcu_send_msg(&dev
->mt76
, cmd
, &req
, sizeof(req
), true);
2785 static int mt7915_mcu_set_eeprom_flash(struct mt7915_dev
*dev
)
2787 #define MAX_PAGE_IDX_MASK GENMASK(7, 5)
2788 #define PAGE_IDX_MASK GENMASK(4, 2)
2789 #define PER_PAGE_SIZE 0x400
2790 struct mt7915_mcu_eeprom req
= { .buffer_mode
= EE_MODE_BUFFER
};
2791 u16 eeprom_size
= mt7915_eeprom_size(dev
);
2792 u8 total
= DIV_ROUND_UP(eeprom_size
, PER_PAGE_SIZE
);
2793 u8
*eep
= (u8
*)dev
->mt76
.eeprom
.data
;
2797 for (i
= 0; i
< total
; i
++, eep
+= eep_len
) {
2798 struct sk_buff
*skb
;
2801 if (i
== total
- 1 && !!(eeprom_size
% PER_PAGE_SIZE
))
2802 eep_len
= eeprom_size
% PER_PAGE_SIZE
;
2804 eep_len
= PER_PAGE_SIZE
;
2806 skb
= mt76_mcu_msg_alloc(&dev
->mt76
, NULL
,
2807 sizeof(req
) + eep_len
);
2811 req
.format
= FIELD_PREP(MAX_PAGE_IDX_MASK
, total
- 1) |
2812 FIELD_PREP(PAGE_IDX_MASK
, i
) | EE_FORMAT_WHOLE
;
2813 req
.len
= cpu_to_le16(eep_len
);
2815 skb_put_data(skb
, &req
, sizeof(req
));
2816 skb_put_data(skb
, eep
, eep_len
);
2818 ret
= mt76_mcu_skb_send_msg(&dev
->mt76
, skb
,
2819 MCU_EXT_CMD(EFUSE_BUFFER_MODE
), true);
2827 int mt7915_mcu_set_eeprom(struct mt7915_dev
*dev
)
2829 struct mt7915_mcu_eeprom req
= {
2830 .buffer_mode
= EE_MODE_EFUSE
,
2831 .format
= EE_FORMAT_WHOLE
,
2834 if (dev
->flash_mode
)
2835 return mt7915_mcu_set_eeprom_flash(dev
);
2837 return mt76_mcu_send_msg(&dev
->mt76
, MCU_EXT_CMD(EFUSE_BUFFER_MODE
),
2838 &req
, sizeof(req
), true);
2841 int mt7915_mcu_get_eeprom(struct mt7915_dev
*dev
, u32 offset
)
2843 struct mt7915_mcu_eeprom_info req
= {
2844 .addr
= cpu_to_le32(round_down(offset
,
2845 MT7915_EEPROM_BLOCK_SIZE
)),
2847 struct mt7915_mcu_eeprom_info
*res
;
2848 struct sk_buff
*skb
;
2852 ret
= mt76_mcu_send_and_get_msg(&dev
->mt76
,
2853 MCU_EXT_QUERY(EFUSE_ACCESS
),
2854 &req
, sizeof(req
), true, &skb
);
2858 res
= (struct mt7915_mcu_eeprom_info
*)skb
->data
;
2859 buf
= dev
->mt76
.eeprom
.data
+ le32_to_cpu(res
->addr
);
2860 memcpy(buf
, res
->data
, MT7915_EEPROM_BLOCK_SIZE
);
2866 int mt7915_mcu_get_eeprom_free_block(struct mt7915_dev
*dev
, u8
*block_num
)
2876 struct sk_buff
*skb
;
2879 ret
= mt76_mcu_send_and_get_msg(&dev
->mt76
,
2880 MCU_EXT_QUERY(EFUSE_FREE_BLOCK
),
2881 &req
, sizeof(req
), true, &skb
);
2885 *block_num
= *(u8
*)skb
->data
;
2891 static int mt7915_mcu_set_pre_cal(struct mt7915_dev
*dev
, u8 idx
,
2892 u8
*data
, u32 len
, int cmd
)
2905 struct sk_buff
*skb
;
2907 skb
= mt76_mcu_msg_alloc(&dev
->mt76
, NULL
, sizeof(req
) + len
);
2912 req
.len
= cpu_to_le32(len
);
2913 skb_put_data(skb
, &req
, sizeof(req
));
2914 skb_put_data(skb
, data
, len
);
2916 return mt76_mcu_skb_send_msg(&dev
->mt76
, skb
, cmd
, false);
2919 int mt7915_mcu_apply_group_cal(struct mt7915_dev
*dev
)
2921 u8 idx
= 0, *cal
= dev
->cal
, *eep
= dev
->mt76
.eeprom
.data
;
2922 u32 total
= mt7915_get_cal_group_size(dev
);
2923 u32 offs
= is_mt7915(&dev
->mt76
) ? MT_EE_DO_PRE_CAL
: MT_EE_DO_PRE_CAL_V2
;
2925 if (!(eep
[offs
] & MT_EE_WIFI_CAL_GROUP
))
2929 * Items: Rx DCOC, RSSI DCOC, Tx TSSI DCOC, Tx LPFG
2930 * Tx FDIQ, Tx DCIQ, Rx FDIQ, Rx FIIQ, ADCDCOC
2935 len
= min_t(u32
, total
, MT_EE_CAL_UNIT
);
2937 ret
= mt7915_mcu_set_pre_cal(dev
, idx
, cal
, len
,
2938 MCU_EXT_CMD(GROUP_PRE_CAL_INFO
));
2950 static int mt7915_find_freq_idx(const u16
*freqs
, int n_freqs
, u16 cur
)
2954 for (i
= 0; i
< n_freqs
; i
++)
2955 if (cur
== freqs
[i
])
2961 static int mt7915_dpd_freq_idx(struct mt7915_dev
*dev
, u16 freq
, u8 bw
)
2963 static const u16 freq_list_v1
[] = {
2964 5180, 5200, 5220, 5240,
2965 5260, 5280, 5300, 5320,
2966 5500, 5520, 5540, 5560,
2967 5580, 5600, 5620, 5640,
2968 5660, 5680, 5700, 5745,
2969 5765, 5785, 5805, 5825
2971 static const u16 freq_list_v2
[] = {
2973 5955, 5975, 5995, 6015,
2974 6035, 6055, 6075, 6095,
2975 6115, 6135, 6155, 6175,
2976 6195, 6215, 6235, 6255,
2977 6275, 6295, 6315, 6335,
2978 6355, 6375, 6395, 6415,
2979 6435, 6455, 6475, 6495,
2980 6515, 6535, 6555, 6575,
2981 6595, 6615, 6635, 6655,
2982 6675, 6695, 6715, 6735,
2983 6755, 6775, 6795, 6815,
2984 6835, 6855, 6875, 6895,
2985 6915, 6935, 6955, 6975,
2986 6995, 7015, 7035, 7055,
2989 6025, 6185, 6345, 6505,
2992 5180, 5200, 5220, 5240,
2993 5260, 5280, 5300, 5320,
2994 5500, 5520, 5540, 5560,
2995 5580, 5600, 5620, 5640,
2996 5660, 5680, 5700, 5720,
2997 5745, 5765, 5785, 5805,
2998 5825, 5845, 5865, 5885,
3002 static const u16 freq_list_v2_7981
[] = {
3004 5180, 5200, 5220, 5240,
3005 5260, 5280, 5300, 5320,
3006 5500, 5520, 5540, 5560,
3007 5580, 5600, 5620, 5640,
3008 5660, 5680, 5700, 5720,
3009 5745, 5765, 5785, 5805,
3010 5825, 5845, 5865, 5885,
3014 const u16
*freq_list
= freq_list_v1
;
3015 int n_freqs
= ARRAY_SIZE(freq_list_v1
);
3018 if (!is_mt7915(&dev
->mt76
)) {
3019 if (is_mt7981(&dev
->mt76
)) {
3020 freq_list
= freq_list_v2_7981
;
3021 n_freqs
= ARRAY_SIZE(freq_list_v2_7981
);
3023 freq_list
= freq_list_v2
;
3024 n_freqs
= ARRAY_SIZE(freq_list_v2
);
3037 if (bw
== NL80211_CHAN_WIDTH_80P80
)
3040 if (bw
!= NL80211_CHAN_WIDTH_20
) {
3041 idx
= mt7915_find_freq_idx(freq_list
, n_freqs
, freq
+ 10);
3045 idx
= mt7915_find_freq_idx(freq_list
, n_freqs
, freq
- 10);
3050 return mt7915_find_freq_idx(freq_list
, n_freqs
, freq
);
3053 int mt7915_mcu_apply_tx_dpd(struct mt7915_phy
*phy
)
3055 struct mt7915_dev
*dev
= phy
->dev
;
3056 struct cfg80211_chan_def
*chandef
= &phy
->mt76
->chandef
;
3057 enum nl80211_band band
= chandef
->chan
->band
;
3058 u32 offs
= is_mt7915(&dev
->mt76
) ? MT_EE_DO_PRE_CAL
: MT_EE_DO_PRE_CAL_V2
;
3059 u16 center_freq
= chandef
->center_freq1
;
3060 u8
*cal
= dev
->cal
, *eep
= dev
->mt76
.eeprom
.data
;
3061 u8 dpd_mask
, cal_num
= is_mt7915(&dev
->mt76
) ? 2 : 3;
3065 case NL80211_BAND_2GHZ
:
3066 dpd_mask
= MT_EE_WIFI_CAL_DPD_2G
;
3068 case NL80211_BAND_5GHZ
:
3069 dpd_mask
= MT_EE_WIFI_CAL_DPD_5G
;
3071 case NL80211_BAND_6GHZ
:
3072 dpd_mask
= MT_EE_WIFI_CAL_DPD_6G
;
3079 if (!(eep
[offs
] & dpd_mask
))
3082 idx
= mt7915_dpd_freq_idx(dev
, center_freq
, chandef
->width
);
3086 /* Items: Tx DPD, Tx Flatness */
3087 idx
= idx
* cal_num
;
3088 cal
+= mt7915_get_cal_group_size(dev
) + (idx
* MT_EE_CAL_UNIT
);
3093 ret
= mt7915_mcu_set_pre_cal(dev
, idx
, cal
, MT_EE_CAL_UNIT
,
3094 MCU_EXT_CMD(DPD_PRE_CAL_INFO
));
3099 cal
+= MT_EE_CAL_UNIT
;
3105 int mt7915_mcu_get_chan_mib_info(struct mt7915_phy
*phy
, bool chan_switch
)
3107 struct mt76_channel_state
*state
= phy
->mt76
->chan_state
;
3108 struct mt76_channel_state
*state_ts
= &phy
->state_ts
;
3109 struct mt7915_dev
*dev
= phy
->dev
;
3110 struct mt7915_mcu_mib
*res
, req
[5];
3111 struct sk_buff
*skb
;
3112 static const u32
*offs
;
3113 int i
, ret
, len
, offs_cc
;
3117 if (is_mt7915(&dev
->mt76
)) {
3118 static const u32 chip_offs
[] = {
3123 MIB_TXOP_INIT_COUNT
,
3125 len
= ARRAY_SIZE(chip_offs
);
3129 static const u32 chip_offs
[] = {
3130 MIB_NON_WIFI_TIME_V2
,
3135 len
= ARRAY_SIZE(chip_offs
);
3140 for (i
= 0; i
< len
; i
++) {
3141 req
[i
].band
= cpu_to_le32(phy
->mt76
->band_idx
);
3142 req
[i
].offs
= cpu_to_le32(offs
[i
]);
3145 ret
= mt76_mcu_send_and_get_msg(&dev
->mt76
, MCU_EXT_CMD(GET_MIB_INFO
),
3146 req
, len
* sizeof(req
[0]), true, &skb
);
3150 res
= (struct mt7915_mcu_mib
*)(skb
->data
+ offs_cc
);
3152 #define __res_u64(s) le64_to_cpu(res[s].data)
3153 /* subtract Tx backoff time from Tx duration */
3154 cc_tx
= is_mt7915(&dev
->mt76
) ? __res_u64(1) - __res_u64(4) : __res_u64(1);
3159 state
->cc_tx
+= cc_tx
- state_ts
->cc_tx
;
3160 state
->cc_bss_rx
+= __res_u64(2) - state_ts
->cc_bss_rx
;
3161 state
->cc_rx
+= __res_u64(2) + __res_u64(3) - state_ts
->cc_rx
;
3162 state
->cc_busy
+= __res_u64(0) + cc_tx
+ __res_u64(2) + __res_u64(3) -
3166 state_ts
->cc_tx
= cc_tx
;
3167 state_ts
->cc_bss_rx
= __res_u64(2);
3168 state_ts
->cc_rx
= __res_u64(2) + __res_u64(3);
3169 state_ts
->cc_busy
= __res_u64(0) + cc_tx
+ __res_u64(2) + __res_u64(3);
3177 int mt7915_mcu_get_temperature(struct mt7915_phy
*phy
)
3179 struct mt7915_dev
*dev
= phy
->dev
;
3186 .ctrl_id
= THERMAL_SENSOR_TEMP_QUERY
,
3187 .band_idx
= phy
->mt76
->band_idx
,
3190 return mt76_mcu_send_msg(&dev
->mt76
, MCU_EXT_CMD(THERMAL_CTRL
), &req
,
3194 int mt7915_mcu_set_thermal_throttling(struct mt7915_phy
*phy
, u8 state
)
3196 struct mt7915_dev
*dev
= phy
->dev
;
3197 struct mt7915_mcu_thermal_ctrl req
= {
3198 .band_idx
= phy
->mt76
->band_idx
,
3199 .ctrl_id
= THERMAL_PROTECT_DUTY_CONFIG
,
3203 /* set duty cycle and level */
3204 for (level
= 0; level
< 4; level
++) {
3205 req
.duty
.duty_level
= level
;
3206 req
.duty
.duty_cycle
= state
;
3209 ret
= mt76_mcu_send_msg(&dev
->mt76
, MCU_EXT_CMD(THERMAL_PROT
),
3210 &req
, sizeof(req
), false);
3217 int mt7915_mcu_set_thermal_protect(struct mt7915_phy
*phy
)
3219 struct mt7915_dev
*dev
= phy
->dev
;
3221 struct mt7915_mcu_thermal_ctrl ctrl
;
3223 __le32 trigger_temp
;
3224 __le32 restore_temp
;
3225 __le16 sustain_time
;
3229 .band_idx
= phy
->mt76
->band_idx
,
3230 .type
.protect_type
= 1,
3231 .type
.trigger_type
= 1,
3236 req
.ctrl
.ctrl_id
= THERMAL_PROTECT_DISABLE
;
3237 ret
= mt76_mcu_send_msg(&dev
->mt76
, MCU_EXT_CMD(THERMAL_PROT
),
3238 &req
, sizeof(req
.ctrl
), false);
3243 /* set high-temperature trigger threshold */
3244 req
.ctrl
.ctrl_id
= THERMAL_PROTECT_ENABLE
;
3245 /* add a safety margin ~10 */
3246 req
.restore_temp
= cpu_to_le32(phy
->throttle_temp
[0] - 10);
3247 req
.trigger_temp
= cpu_to_le32(phy
->throttle_temp
[1]);
3248 req
.sustain_time
= cpu_to_le16(10);
3250 return mt76_mcu_send_msg(&dev
->mt76
, MCU_EXT_CMD(THERMAL_PROT
),
3251 &req
, sizeof(req
), false);
3254 int mt7915_mcu_set_txpower_frame_min(struct mt7915_phy
*phy
, s8 txpower
)
3256 struct mt7915_dev
*dev
= phy
->dev
;
3263 .format_id
= TX_POWER_LIMIT_FRAME_MIN
,
3264 .band_idx
= phy
->mt76
->band_idx
,
3265 .txpower_min
= txpower
* 2, /* 0.5db */
3268 return mt76_mcu_send_msg(&dev
->mt76
,
3269 MCU_EXT_CMD(TX_POWER_FEATURE_CTRL
), &req
,
3273 int mt7915_mcu_set_txpower_frame(struct mt7915_phy
*phy
,
3274 struct ieee80211_vif
*vif
,
3275 struct ieee80211_sta
*sta
, s8 txpower
)
3277 struct mt7915_sta
*msta
= (struct mt7915_sta
*)sta
->drv_priv
;
3278 struct mt7915_dev
*dev
= phy
->dev
;
3279 struct mt76_phy
*mphy
= phy
->mt76
;
3286 s8 txpower_offs
[48];
3288 .format_id
= TX_POWER_LIMIT_FRAME
,
3289 .band_idx
= phy
->mt76
->band_idx
,
3290 .txpower_max
= DIV_ROUND_UP(mphy
->txpower_cur
, 2),
3291 .wcid
= cpu_to_le16(msta
->wcid
.idx
),
3294 s8 txpower_sku
[MT7915_SKU_RATE_NUM
];
3296 ret
= mt7915_mcu_get_txpower_sku(phy
, txpower_sku
, sizeof(txpower_sku
));
3300 txpower
= mt7915_get_power_bound(phy
, txpower
);
3301 if (txpower
> mphy
->txpower_cur
|| txpower
< 0)
3307 if (sta
->deflink
.ht_cap
.ht_supported
) {
3308 const u8
*sku_len
= mt7915_sku_group_len
;
3310 offs
= sku_len
[SKU_CCK
] + sku_len
[SKU_OFDM
];
3311 len
= sku_len
[SKU_HT_BW20
] + sku_len
[SKU_HT_BW40
];
3313 if (sta
->deflink
.vht_cap
.vht_supported
) {
3315 len
= sku_len
[SKU_VHT_BW20
] * 4;
3317 if (sta
->deflink
.he_cap
.has_he
) {
3318 offs
+= len
+ sku_len
[SKU_HE_RU26
] * 3;
3319 len
= sku_len
[SKU_HE_RU242
] * 4;
3326 for (i
= 0; i
< len
; i
++, offs
++)
3327 req
.txpower_offs
[i
] =
3328 DIV_ROUND_UP(txpower
- txpower_sku
[offs
], 2);
3331 return mt76_mcu_send_msg(&dev
->mt76
,
3332 MCU_EXT_CMD(TX_POWER_FEATURE_CTRL
), &req
,
3336 int mt7915_mcu_set_txpower_sku(struct mt7915_phy
*phy
)
3338 struct mt7915_dev
*dev
= phy
->dev
;
3339 struct mt76_phy
*mphy
= phy
->mt76
;
3340 struct ieee80211_hw
*hw
= mphy
->hw
;
3341 struct mt7915_mcu_txpower_sku req
= {
3342 .format_id
= TX_POWER_LIMIT_TABLE
,
3343 .band_idx
= phy
->mt76
->band_idx
,
3345 struct mt76_power_limits limits_array
;
3346 s8
*la
= (s8
*)&limits_array
;
3350 tx_power
= mt7915_get_power_bound(phy
, hw
->conf
.power_level
);
3351 tx_power
= mt76_get_rate_power_limits(mphy
, mphy
->chandef
.chan
,
3352 &limits_array
, tx_power
);
3353 mphy
->txpower_cur
= tx_power
;
3355 for (i
= 0, idx
= 0; i
< ARRAY_SIZE(mt7915_sku_group_len
); i
++) {
3356 u8 mcs_num
, len
= mt7915_sku_group_len
[i
];
3359 if (i
>= SKU_HT_BW20
&& i
<= SKU_VHT_BW160
) {
3362 if (i
== SKU_HT_BW20
|| i
== SKU_VHT_BW20
)
3363 la
= (s8
*)&limits_array
+ 12;
3368 for (j
= 0; j
< min_t(u8
, mcs_num
, len
); j
++)
3369 req
.txpower_sku
[idx
+ j
] = la
[j
];
3375 return mt76_mcu_send_msg(&dev
->mt76
,
3376 MCU_EXT_CMD(TX_POWER_FEATURE_CTRL
), &req
,
3380 int mt7915_mcu_get_txpower_sku(struct mt7915_phy
*phy
, s8
*txpower
, int len
)
3382 #define RATE_POWER_INFO 2
3383 struct mt7915_dev
*dev
= phy
->dev
;
3390 .format_id
= TX_POWER_LIMIT_INFO
,
3391 .category
= RATE_POWER_INFO
,
3392 .band_idx
= phy
->mt76
->band_idx
,
3394 s8 txpower_sku
[MT7915_SKU_RATE_NUM
][2];
3395 struct sk_buff
*skb
;
3398 ret
= mt76_mcu_send_and_get_msg(&dev
->mt76
,
3399 MCU_EXT_CMD(TX_POWER_FEATURE_CTRL
),
3400 &req
, sizeof(req
), true, &skb
);
3404 memcpy(txpower_sku
, skb
->data
+ 4, sizeof(txpower_sku
));
3405 for (i
= 0; i
< len
; i
++)
3406 txpower
[i
] = txpower_sku
[i
][req
.band_idx
];
3413 int mt7915_mcu_set_test_param(struct mt7915_dev
*dev
, u8 param
, bool test_mode
,
3426 .test_mode_en
= test_mode
,
3431 return mt76_mcu_send_msg(&dev
->mt76
, MCU_EXT_CMD(ATE_CTRL
), &req
,
3432 sizeof(req
), false);
3435 int mt7915_mcu_set_sku_en(struct mt7915_phy
*phy
, bool enable
)
3437 struct mt7915_dev
*dev
= phy
->dev
;
3444 .format_id
= TX_POWER_LIMIT_ENABLE
,
3445 .band_idx
= phy
->mt76
->band_idx
,
3446 .sku_enable
= enable
,
3449 return mt76_mcu_send_msg(&dev
->mt76
,
3450 MCU_EXT_CMD(TX_POWER_FEATURE_CTRL
), &req
,
3454 int mt7915_mcu_set_ser(struct mt7915_dev
*dev
, u8 action
, u8 set
, u8 band
)
3467 return mt76_mcu_send_msg(&dev
->mt76
, MCU_EXT_CMD(SET_SER_TRIGGER
),
3468 &req
, sizeof(req
), false);
3471 int mt7915_mcu_set_txbf(struct mt7915_dev
*dev
, u8 action
)
3481 __le32 snd_period
; /* ms */
3499 #define MT_BF_PROCESSING 4
3501 case MT_BF_SOUNDING_ON
:
3502 req
.snd
.snd_mode
= MT_BF_PROCESSING
;
3504 case MT_BF_TYPE_UPDATE
:
3505 req
.type
.ebf
= true;
3506 req
.type
.ibf
= dev
->ibf
;
3508 case MT_BF_MODULE_UPDATE
:
3510 req
.mod
.bf_bitmap
= GENMASK(1, 0);
3516 return mt76_mcu_send_msg(&dev
->mt76
, MCU_EXT_CMD(TXBF_ACTION
), &req
,
3521 mt7915_mcu_enable_obss_spr(struct mt7915_phy
*phy
, u8 action
, u8 val
)
3523 struct mt7915_dev
*dev
= phy
->dev
;
3524 struct mt7915_mcu_sr_ctrl req
= {
3527 .band_idx
= phy
->mt76
->band_idx
,
3528 .val
= cpu_to_le32(val
),
3531 return mt76_mcu_send_msg(&dev
->mt76
, MCU_EXT_CMD(SET_SPR
), &req
,
3536 mt7915_mcu_set_obss_spr_pd(struct mt7915_phy
*phy
,
3537 struct ieee80211_he_obss_pd
*he_obss_pd
)
3539 struct mt7915_dev
*dev
= phy
->dev
;
3541 struct mt7915_mcu_sr_ctrl ctrl
;
3548 __le16 obss_pd_min_srg
;
3550 u8 txpwr_restrict_mode
;
3556 .action
= SPR_SET_PARAM
,
3558 .band_idx
= phy
->mt76
->band_idx
,
3562 u8 max_th
= 82, non_srg_max_th
= 62;
3564 /* disable firmware dynamical PD asjustment */
3565 ret
= mt7915_mcu_enable_obss_spr(phy
, SPR_ENABLE_DPD
, false);
3569 if (he_obss_pd
->sr_ctrl
&
3570 IEEE80211_HE_SPR_NON_SRG_OBSS_PD_SR_DISALLOWED
)
3571 req
.param
.pd_th_non_srg
= max_th
;
3572 else if (he_obss_pd
->sr_ctrl
& IEEE80211_HE_SPR_NON_SRG_OFFSET_PRESENT
)
3573 req
.param
.pd_th_non_srg
= max_th
- he_obss_pd
->non_srg_max_offset
;
3575 req
.param
.pd_th_non_srg
= non_srg_max_th
;
3577 if (he_obss_pd
->sr_ctrl
& IEEE80211_HE_SPR_SRG_INFORMATION_PRESENT
)
3578 req
.param
.pd_th_srg
= max_th
- he_obss_pd
->max_offset
;
3580 req
.param
.obss_pd_min
= cpu_to_le16(82);
3581 req
.param
.obss_pd_min_srg
= cpu_to_le16(82);
3582 req
.param
.txpwr_restrict_mode
= 2;
3583 req
.param
.txpwr_ref
= 21;
3585 return mt76_mcu_send_msg(&dev
->mt76
, MCU_EXT_CMD(SET_SPR
), &req
,
3590 mt7915_mcu_set_obss_spr_siga(struct mt7915_phy
*phy
, struct ieee80211_vif
*vif
,
3591 struct ieee80211_he_obss_pd
*he_obss_pd
)
3593 struct mt7915_vif
*mvif
= (struct mt7915_vif
*)vif
->drv_priv
;
3594 struct mt7915_dev
*dev
= phy
->dev
;
3595 u8 omac
= mvif
->mt76
.omac_idx
;
3597 struct mt7915_mcu_sr_ctrl ctrl
;
3605 .action
= SPR_SET_SIGA
,
3607 .band_idx
= phy
->mt76
->band_idx
,
3610 .omac
= omac
> HW_BSSID_MAX
? omac
- 12 : omac
,
3615 if (he_obss_pd
->sr_ctrl
& IEEE80211_HE_SPR_HESIGA_SR_VAL15_ALLOWED
)
3616 req
.siga
.flag
[req
.siga
.omac
] = 0xf;
3620 /* switch to normal AP mode */
3621 ret
= mt7915_mcu_enable_obss_spr(phy
, SPR_ENABLE_MODE
, 0);
3625 return mt76_mcu_send_msg(&dev
->mt76
, MCU_EXT_CMD(SET_SPR
), &req
,
3630 mt7915_mcu_set_obss_spr_bitmap(struct mt7915_phy
*phy
,
3631 struct ieee80211_he_obss_pd
*he_obss_pd
)
3633 struct mt7915_dev
*dev
= phy
->dev
;
3635 struct mt7915_mcu_sr_ctrl ctrl
;
3644 .action
= SPR_SET_SRG_BITMAP
,
3646 .band_idx
= phy
->mt76
->band_idx
,
3651 memcpy(&bitmap
, he_obss_pd
->bss_color_bitmap
, sizeof(bitmap
));
3652 req
.bitmap
.color_l
[req
.ctrl
.band_idx
] = cpu_to_le32(bitmap
);
3654 memcpy(&bitmap
, he_obss_pd
->bss_color_bitmap
+ 4, sizeof(bitmap
));
3655 req
.bitmap
.color_h
[req
.ctrl
.band_idx
] = cpu_to_le32(bitmap
);
3657 memcpy(&bitmap
, he_obss_pd
->partial_bssid_bitmap
, sizeof(bitmap
));
3658 req
.bitmap
.bssid_l
[req
.ctrl
.band_idx
] = cpu_to_le32(bitmap
);
3660 memcpy(&bitmap
, he_obss_pd
->partial_bssid_bitmap
+ 4, sizeof(bitmap
));
3661 req
.bitmap
.bssid_h
[req
.ctrl
.band_idx
] = cpu_to_le32(bitmap
);
3663 return mt76_mcu_send_msg(&dev
->mt76
, MCU_EXT_CMD(SET_SPR
), &req
,
3667 int mt7915_mcu_add_obss_spr(struct mt7915_phy
*phy
, struct ieee80211_vif
*vif
,
3668 struct ieee80211_he_obss_pd
*he_obss_pd
)
3672 /* enable firmware scene detection algorithms */
3673 ret
= mt7915_mcu_enable_obss_spr(phy
, SPR_ENABLE_SD
, sr_scene_detect
);
3677 /* firmware dynamically adjusts PD threshold so skip manual control */
3678 if (sr_scene_detect
&& !he_obss_pd
->enable
)
3681 /* enable spatial reuse */
3682 ret
= mt7915_mcu_enable_obss_spr(phy
, SPR_ENABLE
, he_obss_pd
->enable
);
3686 if (sr_scene_detect
|| !he_obss_pd
->enable
)
3689 ret
= mt7915_mcu_enable_obss_spr(phy
, SPR_ENABLE_TX
, true);
3693 /* set SRG/non-SRG OBSS PD threshold */
3694 ret
= mt7915_mcu_set_obss_spr_pd(phy
, he_obss_pd
);
3698 /* Set SR prohibit */
3699 ret
= mt7915_mcu_set_obss_spr_siga(phy
, vif
, he_obss_pd
);
3703 /* set SRG BSS color/BSSID bitmap */
3704 return mt7915_mcu_set_obss_spr_bitmap(phy
, he_obss_pd
);
3707 int mt7915_mcu_get_rx_rate(struct mt7915_phy
*phy
, struct ieee80211_vif
*vif
,
3708 struct ieee80211_sta
*sta
, struct rate_info
*rate
)
3710 struct mt7915_vif
*mvif
= (struct mt7915_vif
*)vif
->drv_priv
;
3711 struct mt7915_sta
*msta
= (struct mt7915_sta
*)sta
->drv_priv
;
3712 struct mt7915_dev
*dev
= phy
->dev
;
3713 struct mt76_phy
*mphy
= phy
->mt76
;
3719 .category
= MCU_PHY_STATE_CONTENTION_RX_RATE
,
3720 .band
= mvif
->mt76
.band_idx
,
3721 .wcid
= cpu_to_le16(msta
->wcid
.idx
),
3723 struct ieee80211_supported_band
*sband
;
3724 struct mt7915_mcu_phy_rx_info
*res
;
3725 struct sk_buff
*skb
;
3729 ret
= mt76_mcu_send_and_get_msg(&dev
->mt76
, MCU_EXT_CMD(PHY_STAT_INFO
),
3730 &req
, sizeof(req
), true, &skb
);
3734 res
= (struct mt7915_mcu_phy_rx_info
*)skb
->data
;
3736 rate
->mcs
= res
->rate
;
3737 rate
->nss
= res
->nsts
+ 1;
3739 switch (res
->mode
) {
3740 case MT_PHY_TYPE_CCK
:
3743 case MT_PHY_TYPE_OFDM
:
3744 if (mphy
->chandef
.chan
->band
== NL80211_BAND_5GHZ
)
3745 sband
= &mphy
->sband_5g
.sband
;
3746 else if (mphy
->chandef
.chan
->band
== NL80211_BAND_6GHZ
)
3747 sband
= &mphy
->sband_6g
.sband
;
3749 sband
= &mphy
->sband_2g
.sband
;
3751 rate
->mcs
= mt76_get_rate(&dev
->mt76
, sband
, rate
->mcs
, cck
);
3752 rate
->legacy
= sband
->bitrates
[rate
->mcs
].bitrate
;
3754 case MT_PHY_TYPE_HT
:
3755 case MT_PHY_TYPE_HT_GF
:
3756 if (rate
->mcs
> 31) {
3761 rate
->flags
= RATE_INFO_FLAGS_MCS
;
3763 rate
->flags
|= RATE_INFO_FLAGS_SHORT_GI
;
3765 case MT_PHY_TYPE_VHT
:
3766 if (rate
->mcs
> 9) {
3771 rate
->flags
= RATE_INFO_FLAGS_VHT_MCS
;
3773 rate
->flags
|= RATE_INFO_FLAGS_SHORT_GI
;
3775 case MT_PHY_TYPE_HE_SU
:
3776 case MT_PHY_TYPE_HE_EXT_SU
:
3777 case MT_PHY_TYPE_HE_TB
:
3778 case MT_PHY_TYPE_HE_MU
:
3779 if (res
->gi
> NL80211_RATE_INFO_HE_GI_3_2
|| rate
->mcs
> 11) {
3783 rate
->he_gi
= res
->gi
;
3784 rate
->flags
= RATE_INFO_FLAGS_HE_MCS
;
3792 case IEEE80211_STA_RX_BW_160
:
3793 rate
->bw
= RATE_INFO_BW_160
;
3795 case IEEE80211_STA_RX_BW_80
:
3796 rate
->bw
= RATE_INFO_BW_80
;
3798 case IEEE80211_STA_RX_BW_40
:
3799 rate
->bw
= RATE_INFO_BW_40
;
3802 rate
->bw
= RATE_INFO_BW_20
;
3812 int mt7915_mcu_update_bss_color(struct mt7915_dev
*dev
, struct ieee80211_vif
*vif
,
3813 struct cfg80211_he_bss_color
*he_bss_color
)
3815 int len
= sizeof(struct sta_req_hdr
) + sizeof(struct bss_info_color
);
3816 struct mt7915_vif
*mvif
= (struct mt7915_vif
*)vif
->drv_priv
;
3817 struct bss_info_color
*bss_color
;
3818 struct sk_buff
*skb
;
3821 skb
= __mt76_connac_mcu_alloc_sta_req(&dev
->mt76
, &mvif
->mt76
,
3824 return PTR_ERR(skb
);
3826 tlv
= mt76_connac_mcu_add_tlv(skb
, BSS_INFO_BSS_COLOR
,
3827 sizeof(*bss_color
));
3828 bss_color
= (struct bss_info_color
*)tlv
;
3829 bss_color
->disable
= !he_bss_color
->enabled
;
3830 bss_color
->color
= he_bss_color
->color
;
3832 return mt76_mcu_skb_send_msg(&dev
->mt76
, skb
,
3833 MCU_EXT_CMD(BSS_INFO_UPDATE
), true);
3836 #define TWT_AGRT_TRIGGER BIT(0)
3837 #define TWT_AGRT_ANNOUNCE BIT(1)
3838 #define TWT_AGRT_PROTECT BIT(2)
3840 int mt7915_mcu_twt_agrt_update(struct mt7915_dev
*dev
,
3841 struct mt7915_vif
*mvif
,
3842 struct mt7915_twt_flow
*flow
,
3849 u8 flowid
; /* 0xff for group id */
3850 __le16 peer_id
; /* specify the peer_id (msb=0)
3851 * or group_id (msb=1)
3853 u8 duration
; /* 256 us */
3862 .tbl_idx
= flow
->table_id
,
3864 .own_mac_idx
= mvif
->mt76
.omac_idx
,
3866 .peer_id
= cpu_to_le16(flow
->wcid
),
3867 .duration
= flow
->duration
,
3868 .bss_idx
= mvif
->mt76
.idx
,
3869 .start_tsf
= cpu_to_le64(flow
->tsf
),
3870 .mantissa
= flow
->mantissa
,
3871 .exponent
= flow
->exp
,
3875 if (flow
->protection
)
3876 req
.agrt_params
|= TWT_AGRT_PROTECT
;
3877 if (!flow
->flowtype
)
3878 req
.agrt_params
|= TWT_AGRT_ANNOUNCE
;
3880 req
.agrt_params
|= TWT_AGRT_TRIGGER
;
3882 return mt76_mcu_send_msg(&dev
->mt76
, MCU_EXT_CMD(TWT_AGRT_UPDATE
),
3883 &req
, sizeof(req
), true);
3886 int mt7915_mcu_wed_wa_tx_stats(struct mt7915_dev
*dev
, u16 wlan_idx
)
3894 .cmd
= cpu_to_le32(0x15),
3896 struct mt7915_mcu_wa_tx_stat
{
3900 /* tx_bytes is deprecated since WA byte counter uses u32,
3901 * which easily leads to overflow.
3906 struct mt76_wcid
*wcid
;
3907 struct sk_buff
*skb
;
3911 if (is_mt7915(&dev
->mt76
)) {
3912 req
.arg0
= cpu_to_le32(wlan_idx
);
3913 len
= sizeof(req
) - sizeof(req
.arg2
);
3915 req
.arg0
= cpu_to_le32(1);
3916 req
.arg2
= cpu_to_le16(wlan_idx
);
3920 ret
= mt76_mcu_send_and_get_msg(&dev
->mt76
, MCU_WA_PARAM_CMD(QUERY
),
3921 &req
, len
, true, &skb
);
3925 if (!is_mt7915(&dev
->mt76
))
3928 res
= (struct mt7915_mcu_wa_tx_stat
*)skb
->data
;
3930 ret_wcid
= le16_to_cpu(res
->wcid
);
3931 if (is_mt7915(&dev
->mt76
))
3934 if (ret_wcid
!= wlan_idx
) {
3941 wcid
= rcu_dereference(dev
->mt76
.wcid
[wlan_idx
]);
3943 wcid
->stats
.tx_packets
+= le32_to_cpu(res
->tx_packets
);
3954 int mt7915_mcu_rf_regval(struct mt7915_dev
*dev
, u32 regidx
, u32
*val
, bool set
)
3961 .idx
= cpu_to_le32(u32_get_bits(regidx
, GENMASK(31, 24))),
3962 .ofs
= cpu_to_le32(u32_get_bits(regidx
, GENMASK(23, 0))),
3963 .data
= set
? cpu_to_le32(*val
) : 0,
3965 struct sk_buff
*skb
;
3969 return mt76_mcu_send_msg(&dev
->mt76
, MCU_EXT_CMD(RF_REG_ACCESS
),
3970 &req
, sizeof(req
), false);
3972 ret
= mt76_mcu_send_and_get_msg(&dev
->mt76
, MCU_EXT_QUERY(RF_REG_ACCESS
),
3973 &req
, sizeof(req
), true, &skb
);
3977 *val
= le32_to_cpu(*(__le32
*)(skb
->data
+ 8));