blob: ac2083fa12aaa001dc79196917c3f3e6642f5313 [file] [log] [blame]
developerb11a5392022-03-31 00:34:47 +08001// SPDX-License-Identifier: ISC
2/* Copyright (C) 2020 MediaTek Inc. */
3
4#include <linux/firmware.h>
5#include <linux/fs.h>
6#include "mt7915.h"
7#include "mcu.h"
8#include "mac.h"
9#include "eeprom.h"
10
11struct mt7915_patch_hdr {
12 char build_date[16];
13 char platform[4];
14 __be32 hw_sw_ver;
15 __be32 patch_ver;
16 __be16 checksum;
17 u16 reserved;
18 struct {
19 __be32 patch_ver;
20 __be32 subsys;
21 __be32 feature;
22 __be32 n_region;
23 __be32 crc;
24 u32 reserved[11];
25 } desc;
26} __packed;
27
28struct mt7915_patch_sec {
29 __be32 type;
30 __be32 offs;
31 __be32 size;
32 union {
33 __be32 spec[13];
34 struct {
35 __be32 addr;
36 __be32 len;
37 __be32 sec_key_idx;
38 __be32 align_len;
39 u32 reserved[9];
40 } info;
41 };
42} __packed;
43
44struct mt7915_fw_trailer {
45 u8 chip_id;
46 u8 eco_code;
47 u8 n_region;
48 u8 format_ver;
49 u8 format_flag;
50 u8 reserved[2];
51 char fw_ver[10];
52 char build_date[15];
53 u32 crc;
54} __packed;
55
56struct mt7915_fw_region {
57 __le32 decomp_crc;
58 __le32 decomp_len;
59 __le32 decomp_blk_sz;
60 u8 reserved[4];
61 __le32 addr;
62 __le32 len;
63 u8 feature_set;
64 u8 reserved1[15];
65} __packed;
66
67#define fw_name(_dev, name, ...) ({ \
68 char *_fw; \
69 switch (mt76_chip(&(_dev)->mt76)) { \
70 case 0x7915: \
71 _fw = MT7915_##name; \
72 break; \
73 case 0x7986: \
74 _fw = MT7986_##name##__VA_ARGS__; \
75 break; \
76 default: \
77 _fw = MT7916_##name; \
78 break; \
79 } \
80 _fw; \
81})
82
83#define fw_name_var(_dev, name) (mt7915_check_adie(dev, false) ? \
84 fw_name(_dev, name) : \
85 fw_name(_dev, name, _MT7975))
86
87#define MCU_PATCH_ADDRESS 0x200000
88
89#define HE_PHY(p, c) u8_get_bits(c, IEEE80211_HE_PHY_##p)
90#define HE_MAC(m, c) u8_get_bits(c, IEEE80211_HE_MAC_##m)
91
92static u8
93mt7915_mcu_get_sta_nss(u16 mcs_map)
94{
95 u8 nss;
96
97 for (nss = 8; nss > 0; nss--) {
98 u8 nss_mcs = (mcs_map >> (2 * (nss - 1))) & 3;
99
100 if (nss_mcs != IEEE80211_VHT_MCS_NOT_SUPPORTED)
101 break;
102 }
103
104 return nss - 1;
105}
106
107static void
108mt7915_mcu_set_sta_he_mcs(struct ieee80211_sta *sta, __le16 *he_mcs,
109 u16 mcs_map)
110{
111 struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
112 struct mt7915_dev *dev = msta->vif->phy->dev;
113 enum nl80211_band band = msta->vif->phy->mt76->chandef.chan->band;
114 const u16 *mask = msta->vif->bitrate_mask.control[band].he_mcs;
115 int nss, max_nss = sta->rx_nss > 3 ? 4 : sta->rx_nss;
116
117 for (nss = 0; nss < max_nss; nss++) {
118 int mcs;
119
120 switch ((mcs_map >> (2 * nss)) & 0x3) {
121 case IEEE80211_HE_MCS_SUPPORT_0_11:
122 mcs = GENMASK(11, 0);
123 break;
124 case IEEE80211_HE_MCS_SUPPORT_0_9:
125 mcs = GENMASK(9, 0);
126 break;
127 case IEEE80211_HE_MCS_SUPPORT_0_7:
128 mcs = GENMASK(7, 0);
129 break;
130 default:
131 mcs = 0;
132 }
133
134 mcs = mcs ? fls(mcs & mask[nss]) - 1 : -1;
135
136 switch (mcs) {
137 case 0 ... 7:
138 mcs = IEEE80211_HE_MCS_SUPPORT_0_7;
139 break;
140 case 8 ... 9:
141 mcs = IEEE80211_HE_MCS_SUPPORT_0_9;
142 break;
143 case 10 ... 11:
144 mcs = IEEE80211_HE_MCS_SUPPORT_0_11;
145 break;
146 default:
147 mcs = IEEE80211_HE_MCS_NOT_SUPPORTED;
148 break;
149 }
150 mcs_map &= ~(0x3 << (nss * 2));
151 mcs_map |= mcs << (nss * 2);
152
153 /* only support 2ss on 160MHz for mt7915 */
154 if (is_mt7915(&dev->mt76) && nss > 1 &&
155 sta->bandwidth == IEEE80211_STA_RX_BW_160)
156 break;
157 }
158
159 *he_mcs = cpu_to_le16(mcs_map);
160}
161
162static void
163mt7915_mcu_set_sta_vht_mcs(struct ieee80211_sta *sta, __le16 *vht_mcs,
164 const u16 *mask)
165{
166 struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
167 struct mt7915_dev *dev = msta->vif->phy->dev;
168 u16 mcs_map = le16_to_cpu(sta->vht_cap.vht_mcs.rx_mcs_map);
169 int nss, max_nss = sta->rx_nss > 3 ? 4 : sta->rx_nss;
170 u16 mcs;
171
172 for (nss = 0; nss < max_nss; nss++, mcs_map >>= 2) {
173 switch (mcs_map & 0x3) {
174 case IEEE80211_VHT_MCS_SUPPORT_0_9:
175 mcs = GENMASK(9, 0);
176 break;
177 case IEEE80211_VHT_MCS_SUPPORT_0_8:
178 mcs = GENMASK(8, 0);
179 break;
180 case IEEE80211_VHT_MCS_SUPPORT_0_7:
181 mcs = GENMASK(7, 0);
182 break;
183 default:
184 mcs = 0;
185 }
186
187 vht_mcs[nss] = cpu_to_le16(mcs & mask[nss]);
188
189 /* only support 2ss on 160MHz for mt7915 */
190 if (is_mt7915(&dev->mt76) && nss > 1 &&
191 sta->bandwidth == IEEE80211_STA_RX_BW_160)
192 break;
193 }
194}
195
196static void
197mt7915_mcu_set_sta_ht_mcs(struct ieee80211_sta *sta, u8 *ht_mcs,
198 const u8 *mask)
199{
200 int nss, max_nss = sta->rx_nss > 3 ? 4 : sta->rx_nss;
201
202 for (nss = 0; nss < max_nss; nss++)
203 ht_mcs[nss] = sta->ht_cap.mcs.rx_mask[nss] & mask[nss];
204}
205
206static int
207mt7915_mcu_parse_response(struct mt76_dev *mdev, int cmd,
208 struct sk_buff *skb, int seq)
209{
210 struct mt7915_mcu_rxd *rxd;
211 int ret = 0;
212
213 if (!skb) {
214 dev_err(mdev->dev, "Message %08x (seq %d) timeout\n",
215 cmd, seq);
216 return -ETIMEDOUT;
217 }
218
219 rxd = (struct mt7915_mcu_rxd *)skb->data;
220 if (seq != rxd->seq)
221 return -EAGAIN;
222
223 if (cmd == MCU_CMD(PATCH_SEM_CONTROL)) {
224 skb_pull(skb, sizeof(*rxd) - 4);
225 ret = *skb->data;
226 } else if (cmd == MCU_EXT_CMD(THERMAL_CTRL)) {
227 skb_pull(skb, sizeof(*rxd) + 4);
228 ret = le32_to_cpu(*(__le32 *)skb->data);
229 } else {
230 skb_pull(skb, sizeof(struct mt7915_mcu_rxd));
231 }
232
233 return ret;
234}
235
236static int
237mt7915_mcu_send_message(struct mt76_dev *mdev, struct sk_buff *skb,
238 int cmd, int *wait_seq)
239{
240 struct mt7915_dev *dev = container_of(mdev, struct mt7915_dev, mt76);
241 struct mt7915_mcu_txd *mcu_txd;
242 enum mt76_mcuq_id qid;
243 __le32 *txd;
244 u32 val;
245 u8 seq;
246
247 /* TODO: make dynamic based on msg type */
248 mdev->mcu.timeout = 20 * HZ;
249
250 seq = ++dev->mt76.mcu.msg_seq & 0xf;
251 if (!seq)
252 seq = ++dev->mt76.mcu.msg_seq & 0xf;
253
254 if (cmd == MCU_CMD(FW_SCATTER)) {
255 qid = MT_MCUQ_FWDL;
256 goto exit;
257 }
258
259 mcu_txd = (struct mt7915_mcu_txd *)skb_push(skb, sizeof(*mcu_txd));
260 if (test_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state))
261 qid = MT_MCUQ_WA;
262 else
263 qid = MT_MCUQ_WM;
264
265 txd = mcu_txd->txd;
266
267 val = FIELD_PREP(MT_TXD0_TX_BYTES, skb->len) |
268 FIELD_PREP(MT_TXD0_PKT_FMT, MT_TX_TYPE_CMD) |
269 FIELD_PREP(MT_TXD0_Q_IDX, MT_TX_MCU_PORT_RX_Q0);
270 txd[0] = cpu_to_le32(val);
271
272 val = MT_TXD1_LONG_FORMAT |
273 FIELD_PREP(MT_TXD1_HDR_FORMAT, MT_HDR_FORMAT_CMD);
274 txd[1] = cpu_to_le32(val);
275
276 mcu_txd->len = cpu_to_le16(skb->len - sizeof(mcu_txd->txd));
277 mcu_txd->pq_id = cpu_to_le16(MCU_PQ_ID(MT_TX_PORT_IDX_MCU,
278 MT_TX_MCU_PORT_RX_Q0));
279 mcu_txd->pkt_type = MCU_PKT_ID;
280 mcu_txd->seq = seq;
281
282 mcu_txd->cid = FIELD_GET(__MCU_CMD_FIELD_ID, cmd);
283 mcu_txd->set_query = MCU_Q_NA;
284 mcu_txd->ext_cid = FIELD_GET(__MCU_CMD_FIELD_EXT_ID, cmd);
285 if (mcu_txd->ext_cid) {
286 mcu_txd->ext_cid_ack = 1;
287
288 /* do not use Q_SET for efuse */
289 if (cmd & __MCU_CMD_FIELD_QUERY)
290 mcu_txd->set_query = MCU_Q_QUERY;
291 else
292 mcu_txd->set_query = MCU_Q_SET;
293 }
294
295 if (cmd & __MCU_CMD_FIELD_WA)
296 mcu_txd->s2d_index = MCU_S2D_H2C;
297 else
298 mcu_txd->s2d_index = MCU_S2D_H2N;
299
300exit:
301 if (wait_seq)
302 *wait_seq = seq;
303
304 return mt76_tx_queue_skb_raw(dev, mdev->q_mcu[qid], skb, 0);
305}
306
307int mt7915_mcu_wa_cmd(struct mt7915_dev *dev, int cmd, u32 a1, u32 a2, u32 a3)
308{
309 struct {
310 __le32 args[3];
311 } req = {
312 .args = {
313 cpu_to_le32(a1),
314 cpu_to_le32(a2),
315 cpu_to_le32(a3),
316 },
317 };
318
319 return mt76_mcu_send_msg(&dev->mt76, cmd, &req, sizeof(req), false);
320}
321
322static void
323mt7915_mcu_csa_finish(void *priv, u8 *mac, struct ieee80211_vif *vif)
324{
325 if (vif->csa_active)
326 ieee80211_csa_finish(vif);
327}
328
329static void
330mt7915_mcu_rx_csa_notify(struct mt7915_dev *dev, struct sk_buff *skb)
331{
332 struct mt76_phy *mphy = &dev->mt76.phy;
333 struct mt7915_mcu_csa_notify *c;
334
335 c = (struct mt7915_mcu_csa_notify *)skb->data;
336
337 if ((c->band_idx && !dev->phy.band_idx) && dev->mt76.phy2)
338 mphy = dev->mt76.phy2;
339
340 ieee80211_iterate_active_interfaces_atomic(mphy->hw,
341 IEEE80211_IFACE_ITER_RESUME_ALL,
342 mt7915_mcu_csa_finish, mphy->hw);
343}
344
345static void
346mt7915_mcu_rx_thermal_notify(struct mt7915_dev *dev, struct sk_buff *skb)
347{
348 struct mt76_phy *mphy = &dev->mt76.phy;
349 struct mt7915_mcu_thermal_notify *t;
350 struct mt7915_phy *phy;
351
352 t = (struct mt7915_mcu_thermal_notify *)skb->data;
353 if (t->ctrl.ctrl_id != THERMAL_PROTECT_ENABLE)
354 return;
355
356 if ((t->ctrl.band_idx && !dev->phy.band_idx) && dev->mt76.phy2)
357 mphy = dev->mt76.phy2;
358
359 phy = (struct mt7915_phy *)mphy->priv;
360 phy->throttle_state = t->ctrl.duty.duty_cycle;
361}
362
363static void
364mt7915_mcu_rx_radar_detected(struct mt7915_dev *dev, struct sk_buff *skb)
365{
366 struct mt76_phy *mphy = &dev->mt76.phy;
367 struct mt7915_mcu_rdd_report *r;
368
369 r = (struct mt7915_mcu_rdd_report *)skb->data;
370
371 if ((r->band_idx && !dev->phy.band_idx) && dev->mt76.phy2)
372 mphy = dev->mt76.phy2;
373
374 if (r->band_idx == MT_RX_SEL2)
375 cfg80211_background_radar_event(mphy->hw->wiphy,
376 &dev->rdd2_chandef,
377 GFP_ATOMIC);
378 else
379 ieee80211_radar_detected(mphy->hw);
380 dev->hw_pattern++;
381}
382
383static void
384mt7915_mcu_rx_log_message(struct mt7915_dev *dev, struct sk_buff *skb)
385{
386 struct mt7915_mcu_rxd *rxd = (struct mt7915_mcu_rxd *)skb->data;
387 const char *data = (char *)&rxd[1];
388 const char *type;
389 int len = skb->len - sizeof(*rxd);
390
391 switch (rxd->s2d_index) {
392 case 0:
393 if (mt7915_debugfs_rx_log(dev, data, len))
394 return;
395
396 type = "WM";
397 break;
398 case 2:
399 type = "WA";
400 break;
401 default:
402 type = "unknown";
403 break;
404 }
405
406 wiphy_info(mt76_hw(dev)->wiphy, "%s: %.*s", type, len, data);
407}
408
409static void
410mt7915_mcu_cca_finish(void *priv, u8 *mac, struct ieee80211_vif *vif)
411{
412 if (!vif->color_change_active)
413 return;
414
415 ieee80211_color_change_finish(vif);
416}
417
418static void
419mt7915_mcu_rx_bcc_notify(struct mt7915_dev *dev, struct sk_buff *skb)
420{
421 struct mt76_phy *mphy = &dev->mt76.phy;
422 struct mt7915_mcu_bcc_notify *b;
423
424 b = (struct mt7915_mcu_bcc_notify *)skb->data;
425
426 if ((b->band_idx && !dev->phy.band_idx) && dev->mt76.phy2)
427 mphy = dev->mt76.phy2;
428
429 ieee80211_iterate_active_interfaces_atomic(mphy->hw,
430 IEEE80211_IFACE_ITER_RESUME_ALL,
431 mt7915_mcu_cca_finish, mphy->hw);
432}
433
434static void
435mt7915_mcu_rx_ext_event(struct mt7915_dev *dev, struct sk_buff *skb)
436{
437 struct mt7915_mcu_rxd *rxd = (struct mt7915_mcu_rxd *)skb->data;
438
439 switch (rxd->ext_eid) {
440 case MCU_EXT_EVENT_THERMAL_PROTECT:
441 mt7915_mcu_rx_thermal_notify(dev, skb);
442 break;
443 case MCU_EXT_EVENT_RDD_REPORT:
444 mt7915_mcu_rx_radar_detected(dev, skb);
445 break;
446 case MCU_EXT_EVENT_CSA_NOTIFY:
447 mt7915_mcu_rx_csa_notify(dev, skb);
448 break;
449 case MCU_EXT_EVENT_FW_LOG_2_HOST:
450 mt7915_mcu_rx_log_message(dev, skb);
451 break;
452 case MCU_EXT_EVENT_BCC_NOTIFY:
453 mt7915_mcu_rx_bcc_notify(dev, skb);
454 break;
455 default:
456 break;
457 }
458}
459
460static void
461mt7915_mcu_rx_unsolicited_event(struct mt7915_dev *dev, struct sk_buff *skb)
462{
463 struct mt7915_mcu_rxd *rxd = (struct mt7915_mcu_rxd *)skb->data;
464
465 switch (rxd->eid) {
466 case MCU_EVENT_EXT:
467 mt7915_mcu_rx_ext_event(dev, skb);
468 break;
469 default:
470 break;
471 }
472 dev_kfree_skb(skb);
473}
474
475void mt7915_mcu_rx_event(struct mt7915_dev *dev, struct sk_buff *skb)
476{
477 struct mt7915_mcu_rxd *rxd = (struct mt7915_mcu_rxd *)skb->data;
478
479 if (rxd->ext_eid == MCU_EXT_EVENT_THERMAL_PROTECT ||
480 rxd->ext_eid == MCU_EXT_EVENT_FW_LOG_2_HOST ||
481 rxd->ext_eid == MCU_EXT_EVENT_ASSERT_DUMP ||
482 rxd->ext_eid == MCU_EXT_EVENT_PS_SYNC ||
483 rxd->ext_eid == MCU_EXT_EVENT_BCC_NOTIFY ||
484 !rxd->seq)
485 mt7915_mcu_rx_unsolicited_event(dev, skb);
486 else
487 mt76_mcu_rx_event(&dev->mt76, skb);
488}
489
490static struct tlv *
491mt7915_mcu_add_nested_subtlv(struct sk_buff *skb, int sub_tag, int sub_len,
492 __le16 *sub_ntlv, __le16 *len)
493{
494 struct tlv *ptlv, tlv = {
495 .tag = cpu_to_le16(sub_tag),
496 .len = cpu_to_le16(sub_len),
497 };
498
499 ptlv = skb_put(skb, sub_len);
500 memcpy(ptlv, &tlv, sizeof(tlv));
501
502 le16_add_cpu(sub_ntlv, 1);
503 le16_add_cpu(len, sub_len);
504
505 return ptlv;
506}
507
508/** bss info **/
509struct mt7915_he_obss_narrow_bw_ru_data {
510 bool tolerated;
511};
512
513static void mt7915_check_he_obss_narrow_bw_ru_iter(struct wiphy *wiphy,
514 struct cfg80211_bss *bss,
515 void *_data)
516{
517 struct mt7915_he_obss_narrow_bw_ru_data *data = _data;
518 const struct element *elem;
519
520 rcu_read_lock();
521 elem = ieee80211_bss_get_elem(bss, WLAN_EID_EXT_CAPABILITY);
522
523 if (!elem || elem->datalen <= 10 ||
524 !(elem->data[10] &
525 WLAN_EXT_CAPA10_OBSS_NARROW_BW_RU_TOLERANCE_SUPPORT))
526 data->tolerated = false;
527
528 rcu_read_unlock();
529}
530
531static bool mt7915_check_he_obss_narrow_bw_ru(struct ieee80211_hw *hw,
532 struct ieee80211_vif *vif)
533{
534 struct mt7915_he_obss_narrow_bw_ru_data iter_data = {
535 .tolerated = true,
536 };
537
538 if (!(vif->bss_conf.chandef.chan->flags & IEEE80211_CHAN_RADAR))
539 return false;
540
541 cfg80211_bss_iter(hw->wiphy, &vif->bss_conf.chandef,
542 mt7915_check_he_obss_narrow_bw_ru_iter,
543 &iter_data);
544
545 /*
546 * If there is at least one AP on radar channel that cannot
547 * tolerate 26-tone RU UL OFDMA transmissions using HE TB PPDU.
548 */
549 return !iter_data.tolerated;
550}
551
552static void
553mt7915_mcu_bss_rfch_tlv(struct sk_buff *skb, struct ieee80211_vif *vif,
554 struct mt7915_phy *phy)
555{
556 struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
557 struct bss_info_rf_ch *ch;
558 struct tlv *tlv;
559 int freq1 = chandef->center_freq1;
560
561 tlv = mt76_connac_mcu_add_tlv(skb, BSS_INFO_RF_CH, sizeof(*ch));
562
563 ch = (struct bss_info_rf_ch *)tlv;
564 ch->pri_ch = chandef->chan->hw_value;
565 ch->center_ch0 = ieee80211_frequency_to_channel(freq1);
566 ch->bw = mt76_connac_chan_bw(chandef);
567
568 if (chandef->width == NL80211_CHAN_WIDTH_80P80) {
569 int freq2 = chandef->center_freq2;
570
571 ch->center_ch1 = ieee80211_frequency_to_channel(freq2);
572 }
573
574 if (vif->bss_conf.he_support && vif->type == NL80211_IFTYPE_STATION) {
575 struct mt76_phy *mphy = phy->mt76;
576
577 ch->he_ru26_block =
578 mt7915_check_he_obss_narrow_bw_ru(mphy->hw, vif);
579 ch->he_all_disable = false;
580 } else {
581 ch->he_all_disable = true;
582 }
583}
584
585static void
586mt7915_mcu_bss_ra_tlv(struct sk_buff *skb, struct ieee80211_vif *vif,
587 struct mt7915_phy *phy)
588{
589 int max_nss = hweight8(phy->mt76->chainmask);
590 struct bss_info_ra *ra;
591 struct tlv *tlv;
592
593 tlv = mt76_connac_mcu_add_tlv(skb, BSS_INFO_RA, sizeof(*ra));
594
595 ra = (struct bss_info_ra *)tlv;
596 ra->op_mode = vif->type == NL80211_IFTYPE_AP;
597 ra->adhoc_en = vif->type == NL80211_IFTYPE_ADHOC;
598 ra->short_preamble = true;
599 ra->tx_streams = max_nss;
600 ra->rx_streams = max_nss;
601 ra->algo = 4;
602 ra->train_up_rule = 2;
603 ra->train_up_high_thres = 110;
604 ra->train_up_rule_rssi = -70;
605 ra->low_traffic_thres = 2;
606 ra->phy_cap = cpu_to_le32(0xfdf);
607 ra->interval = cpu_to_le32(500);
608 ra->fast_interval = cpu_to_le32(100);
609}
610
611static void
612mt7915_mcu_bss_he_tlv(struct sk_buff *skb, struct ieee80211_vif *vif,
613 struct mt7915_phy *phy)
614{
615#define DEFAULT_HE_PE_DURATION 4
616#define DEFAULT_HE_DURATION_RTS_THRES 1023
617 const struct ieee80211_sta_he_cap *cap;
618 struct bss_info_he *he;
619 struct tlv *tlv;
620
621 cap = mt76_connac_get_he_phy_cap(phy->mt76, vif);
622
623 tlv = mt76_connac_mcu_add_tlv(skb, BSS_INFO_HE_BASIC, sizeof(*he));
624
625 he = (struct bss_info_he *)tlv;
626 he->he_pe_duration = vif->bss_conf.htc_trig_based_pkt_ext;
627 if (!he->he_pe_duration)
628 he->he_pe_duration = DEFAULT_HE_PE_DURATION;
629
630 he->he_rts_thres = cpu_to_le16(vif->bss_conf.frame_time_rts_th);
631 if (!he->he_rts_thres)
632 he->he_rts_thres = cpu_to_le16(DEFAULT_HE_DURATION_RTS_THRES);
633
634 he->max_nss_mcs[CMD_HE_MCS_BW80] = cap->he_mcs_nss_supp.tx_mcs_80;
635 he->max_nss_mcs[CMD_HE_MCS_BW160] = cap->he_mcs_nss_supp.tx_mcs_160;
636 he->max_nss_mcs[CMD_HE_MCS_BW8080] = cap->he_mcs_nss_supp.tx_mcs_80p80;
637}
638
639static void
640mt7915_mcu_bss_hw_amsdu_tlv(struct sk_buff *skb)
641{
642#define TXD_CMP_MAP1 GENMASK(15, 0)
643#define TXD_CMP_MAP2 (GENMASK(31, 0) & ~BIT(23))
644 struct bss_info_hw_amsdu *amsdu;
645 struct tlv *tlv;
646
647 tlv = mt76_connac_mcu_add_tlv(skb, BSS_INFO_HW_AMSDU, sizeof(*amsdu));
648
649 amsdu = (struct bss_info_hw_amsdu *)tlv;
650 amsdu->cmp_bitmap_0 = cpu_to_le32(TXD_CMP_MAP1);
651 amsdu->cmp_bitmap_1 = cpu_to_le32(TXD_CMP_MAP2);
652 amsdu->trig_thres = cpu_to_le16(2);
653 amsdu->enable = true;
654}
655
656static void
657mt7915_mcu_bss_bmc_tlv(struct sk_buff *skb, struct mt7915_phy *phy)
658{
659 struct bss_info_bmc_rate *bmc;
660 struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
661 enum nl80211_band band = chandef->chan->band;
662 struct tlv *tlv;
663
664 tlv = mt76_connac_mcu_add_tlv(skb, BSS_INFO_BMC_RATE, sizeof(*bmc));
665
666 bmc = (struct bss_info_bmc_rate *)tlv;
667 if (band == NL80211_BAND_2GHZ) {
668 bmc->short_preamble = true;
669 } else {
670 bmc->bc_trans = cpu_to_le16(0x2000);
671 bmc->mc_trans = cpu_to_le16(0x2080);
672 }
673}
674
675static int
676mt7915_mcu_muar_config(struct mt7915_phy *phy, struct ieee80211_vif *vif,
677 bool bssid, bool enable)
678{
679 struct mt7915_dev *dev = phy->dev;
680 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
681 u32 idx = mvif->mt76.omac_idx - REPEATER_BSSID_START;
682 u32 mask = phy->omac_mask >> 32 & ~BIT(idx);
683 const u8 *addr = vif->addr;
684 struct {
685 u8 mode;
686 u8 force_clear;
687 u8 clear_bitmap[8];
688 u8 entry_count;
689 u8 write;
690 u8 band;
691
692 u8 index;
693 u8 bssid;
694 u8 addr[ETH_ALEN];
695 } __packed req = {
696 .mode = !!mask || enable,
697 .entry_count = 1,
698 .write = 1,
699 .band = phy != &dev->phy,
700 .index = idx * 2 + bssid,
701 };
702
703 if (bssid)
704 addr = vif->bss_conf.bssid;
705
706 if (enable)
707 ether_addr_copy(req.addr, addr);
708
709 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(MUAR_UPDATE), &req,
710 sizeof(req), true);
711}
712
713int mt7915_mcu_add_bss_info(struct mt7915_phy *phy,
714 struct ieee80211_vif *vif, int enable)
715{
716 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
717 struct mt7915_dev *dev = phy->dev;
718 struct sk_buff *skb;
719
720 if (mvif->mt76.omac_idx >= REPEATER_BSSID_START) {
721 mt7915_mcu_muar_config(phy, vif, false, enable);
722 mt7915_mcu_muar_config(phy, vif, true, enable);
723 }
724
725 skb = __mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76, NULL,
726 MT7915_BSS_UPDATE_MAX_SIZE);
727 if (IS_ERR(skb))
728 return PTR_ERR(skb);
729
730 /* bss_omac must be first */
731 if (enable)
732 mt76_connac_mcu_bss_omac_tlv(skb, vif);
733
734 mt76_connac_mcu_bss_basic_tlv(skb, vif, NULL, phy->mt76,
735 mvif->sta.wcid.idx, enable);
736
737 if (vif->type == NL80211_IFTYPE_MONITOR)
738 goto out;
739
740 if (enable) {
741 mt7915_mcu_bss_rfch_tlv(skb, vif, phy);
742 mt7915_mcu_bss_bmc_tlv(skb, phy);
743 mt7915_mcu_bss_ra_tlv(skb, vif, phy);
744 mt7915_mcu_bss_hw_amsdu_tlv(skb);
745
746 if (vif->bss_conf.he_support)
747 mt7915_mcu_bss_he_tlv(skb, vif, phy);
748
749 if (mvif->mt76.omac_idx >= EXT_BSSID_START &&
750 mvif->mt76.omac_idx < REPEATER_BSSID_START)
751 mt76_connac_mcu_bss_ext_tlv(skb, &mvif->mt76);
752 }
753out:
754 return mt76_mcu_skb_send_msg(&dev->mt76, skb,
755 MCU_EXT_CMD(BSS_INFO_UPDATE), true);
756}
757
758/** starec & wtbl **/
759int mt7915_mcu_add_tx_ba(struct mt7915_dev *dev,
760 struct ieee80211_ampdu_params *params,
761 bool enable)
762{
763 struct mt7915_sta *msta = (struct mt7915_sta *)params->sta->drv_priv;
764 struct mt7915_vif *mvif = msta->vif;
765
766 if (enable && !params->amsdu)
767 msta->wcid.amsdu = false;
768
769 return mt76_connac_mcu_sta_ba(&dev->mt76, &mvif->mt76, params,
770 MCU_EXT_CMD(STA_REC_UPDATE),
771 enable, true);
772}
773
774int mt7915_mcu_add_rx_ba(struct mt7915_dev *dev,
775 struct ieee80211_ampdu_params *params,
776 bool enable)
777{
778 struct mt7915_sta *msta = (struct mt7915_sta *)params->sta->drv_priv;
779 struct mt7915_vif *mvif = msta->vif;
780
781 return mt76_connac_mcu_sta_ba(&dev->mt76, &mvif->mt76, params,
782 MCU_EXT_CMD(STA_REC_UPDATE),
783 enable, false);
784}
785
786static void
787mt7915_mcu_sta_he_tlv(struct sk_buff *skb, struct ieee80211_sta *sta,
788 struct ieee80211_vif *vif)
789{
790 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
791 struct ieee80211_he_cap_elem *elem = &sta->he_cap.he_cap_elem;
792 struct ieee80211_he_mcs_nss_supp mcs_map;
793 struct sta_rec_he *he;
794 struct tlv *tlv;
795 u32 cap = 0;
796
797 if (!sta->he_cap.has_he)
798 return;
799
800 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_HE, sizeof(*he));
801
802 he = (struct sta_rec_he *)tlv;
803
804 if (elem->mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_HTC_HE)
805 cap |= STA_REC_HE_CAP_HTC;
806
807 if (elem->mac_cap_info[2] & IEEE80211_HE_MAC_CAP2_BSR)
808 cap |= STA_REC_HE_CAP_BSR;
809
810 if (elem->mac_cap_info[3] & IEEE80211_HE_MAC_CAP3_OMI_CONTROL)
811 cap |= STA_REC_HE_CAP_OM;
812
813 if (elem->mac_cap_info[4] & IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU)
814 cap |= STA_REC_HE_CAP_AMSDU_IN_AMPDU;
815
816 if (elem->mac_cap_info[4] & IEEE80211_HE_MAC_CAP4_BQR)
817 cap |= STA_REC_HE_CAP_BQR;
818
819 if (elem->phy_cap_info[0] &
820 (IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_RU_MAPPING_IN_2G |
821 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_RU_MAPPING_IN_5G))
822 cap |= STA_REC_HE_CAP_BW20_RU242_SUPPORT;
823
824 if (mvif->cap.he_ldpc &&
825 (elem->phy_cap_info[1] &
826 IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD))
827 cap |= STA_REC_HE_CAP_LDPC;
828
829 if (elem->phy_cap_info[1] &
830 IEEE80211_HE_PHY_CAP1_HE_LTF_AND_GI_FOR_HE_PPDUS_0_8US)
831 cap |= STA_REC_HE_CAP_SU_PPDU_1LTF_8US_GI;
832
833 if (elem->phy_cap_info[2] &
834 IEEE80211_HE_PHY_CAP2_NDP_4x_LTF_AND_3_2US)
835 cap |= STA_REC_HE_CAP_NDP_4LTF_3DOT2MS_GI;
836
837 if (elem->phy_cap_info[2] &
838 IEEE80211_HE_PHY_CAP2_STBC_TX_UNDER_80MHZ)
839 cap |= STA_REC_HE_CAP_LE_EQ_80M_TX_STBC;
840
841 if (elem->phy_cap_info[2] &
842 IEEE80211_HE_PHY_CAP2_STBC_RX_UNDER_80MHZ)
843 cap |= STA_REC_HE_CAP_LE_EQ_80M_RX_STBC;
844
845 if (elem->phy_cap_info[6] &
846 IEEE80211_HE_PHY_CAP6_TRIG_CQI_FB)
847 cap |= STA_REC_HE_CAP_TRIG_CQI_FK;
848
849 if (elem->phy_cap_info[6] &
850 IEEE80211_HE_PHY_CAP6_PARTIAL_BW_EXT_RANGE)
851 cap |= STA_REC_HE_CAP_PARTIAL_BW_EXT_RANGE;
852
853 if (elem->phy_cap_info[7] &
854 IEEE80211_HE_PHY_CAP7_HE_SU_MU_PPDU_4XLTF_AND_08_US_GI)
855 cap |= STA_REC_HE_CAP_SU_MU_PPDU_4LTF_8US_GI;
856
857 if (elem->phy_cap_info[7] &
858 IEEE80211_HE_PHY_CAP7_STBC_TX_ABOVE_80MHZ)
859 cap |= STA_REC_HE_CAP_GT_80M_TX_STBC;
860
861 if (elem->phy_cap_info[7] &
862 IEEE80211_HE_PHY_CAP7_STBC_RX_ABOVE_80MHZ)
863 cap |= STA_REC_HE_CAP_GT_80M_RX_STBC;
864
865 if (elem->phy_cap_info[8] &
866 IEEE80211_HE_PHY_CAP8_HE_ER_SU_PPDU_4XLTF_AND_08_US_GI)
867 cap |= STA_REC_HE_CAP_ER_SU_PPDU_4LTF_8US_GI;
868
869 if (elem->phy_cap_info[8] &
870 IEEE80211_HE_PHY_CAP8_HE_ER_SU_1XLTF_AND_08_US_GI)
871 cap |= STA_REC_HE_CAP_ER_SU_PPDU_1LTF_8US_GI;
872
873 if (elem->phy_cap_info[9] &
874 IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU)
875 cap |= STA_REC_HE_CAP_TX_1024QAM_UNDER_RU242;
876
877 if (elem->phy_cap_info[9] &
878 IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU)
879 cap |= STA_REC_HE_CAP_RX_1024QAM_UNDER_RU242;
880
881 he->he_cap = cpu_to_le32(cap);
882
883 mcs_map = sta->he_cap.he_mcs_nss_supp;
884 switch (sta->bandwidth) {
885 case IEEE80211_STA_RX_BW_160:
886 if (elem->phy_cap_info[0] &
887 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
888 mt7915_mcu_set_sta_he_mcs(sta,
889 &he->max_nss_mcs[CMD_HE_MCS_BW8080],
890 le16_to_cpu(mcs_map.rx_mcs_80p80));
891
892 mt7915_mcu_set_sta_he_mcs(sta,
893 &he->max_nss_mcs[CMD_HE_MCS_BW160],
894 le16_to_cpu(mcs_map.rx_mcs_160));
895 fallthrough;
896 default:
897 mt7915_mcu_set_sta_he_mcs(sta,
898 &he->max_nss_mcs[CMD_HE_MCS_BW80],
899 le16_to_cpu(mcs_map.rx_mcs_80));
900 break;
901 }
902
903 he->t_frame_dur =
904 HE_MAC(CAP1_TF_MAC_PAD_DUR_MASK, elem->mac_cap_info[1]);
905 he->max_ampdu_exp =
906 HE_MAC(CAP3_MAX_AMPDU_LEN_EXP_MASK, elem->mac_cap_info[3]);
907
908 he->bw_set =
909 HE_PHY(CAP0_CHANNEL_WIDTH_SET_MASK, elem->phy_cap_info[0]);
910 he->device_class =
911 HE_PHY(CAP1_DEVICE_CLASS_A, elem->phy_cap_info[1]);
912 he->punc_pream_rx =
913 HE_PHY(CAP1_PREAMBLE_PUNC_RX_MASK, elem->phy_cap_info[1]);
914
915 he->dcm_tx_mode =
916 HE_PHY(CAP3_DCM_MAX_CONST_TX_MASK, elem->phy_cap_info[3]);
917 he->dcm_tx_max_nss =
918 HE_PHY(CAP3_DCM_MAX_TX_NSS_2, elem->phy_cap_info[3]);
919 he->dcm_rx_mode =
920 HE_PHY(CAP3_DCM_MAX_CONST_RX_MASK, elem->phy_cap_info[3]);
921 he->dcm_rx_max_nss =
922 HE_PHY(CAP3_DCM_MAX_RX_NSS_2, elem->phy_cap_info[3]);
923 he->dcm_rx_max_nss =
924 HE_PHY(CAP8_DCM_MAX_RU_MASK, elem->phy_cap_info[8]);
925
926 he->pkt_ext = 2;
927}
928
929static void
930mt7915_mcu_sta_muru_tlv(struct sk_buff *skb, struct ieee80211_sta *sta,
931 struct ieee80211_vif *vif)
932{
933 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
934 struct ieee80211_he_cap_elem *elem = &sta->he_cap.he_cap_elem;
935 struct sta_rec_muru *muru;
936 struct tlv *tlv;
937
938 if (vif->type != NL80211_IFTYPE_STATION &&
939 vif->type != NL80211_IFTYPE_AP)
940 return;
941
942 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_MURU, sizeof(*muru));
943
944 muru = (struct sta_rec_muru *)tlv;
945
946 muru->cfg.mimo_dl_en = mvif->cap.he_mu_ebfer ||
947 mvif->cap.vht_mu_ebfer ||
948 mvif->cap.vht_mu_ebfee;
949 muru->cfg.mimo_ul_en = true;
950 muru->cfg.ofdma_dl_en = true;
951
952 if (sta->vht_cap.vht_supported)
953 muru->mimo_dl.vht_mu_bfee =
954 !!(sta->vht_cap.cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE);
955
956 if (!sta->he_cap.has_he)
957 return;
958
959 muru->mimo_dl.partial_bw_dl_mimo =
960 HE_PHY(CAP6_PARTIAL_BANDWIDTH_DL_MUMIMO, elem->phy_cap_info[6]);
961
962 muru->mimo_ul.full_ul_mimo =
963 HE_PHY(CAP2_UL_MU_FULL_MU_MIMO, elem->phy_cap_info[2]);
964 muru->mimo_ul.partial_ul_mimo =
965 HE_PHY(CAP2_UL_MU_PARTIAL_MU_MIMO, elem->phy_cap_info[2]);
966
967 muru->ofdma_dl.punc_pream_rx =
968 HE_PHY(CAP1_PREAMBLE_PUNC_RX_MASK, elem->phy_cap_info[1]);
969 muru->ofdma_dl.he_20m_in_40m_2g =
970 HE_PHY(CAP8_20MHZ_IN_40MHZ_HE_PPDU_IN_2G, elem->phy_cap_info[8]);
971 muru->ofdma_dl.he_20m_in_160m =
972 HE_PHY(CAP8_20MHZ_IN_160MHZ_HE_PPDU, elem->phy_cap_info[8]);
973 muru->ofdma_dl.he_80m_in_160m =
974 HE_PHY(CAP8_80MHZ_IN_160MHZ_HE_PPDU, elem->phy_cap_info[8]);
975
976 muru->ofdma_ul.t_frame_dur =
977 HE_MAC(CAP1_TF_MAC_PAD_DUR_MASK, elem->mac_cap_info[1]);
978 muru->ofdma_ul.mu_cascading =
979 HE_MAC(CAP2_MU_CASCADING, elem->mac_cap_info[2]);
980 muru->ofdma_ul.uo_ra =
981 HE_MAC(CAP3_OFDMA_RA, elem->mac_cap_info[3]);
982}
983
984static void
985mt7915_mcu_sta_ht_tlv(struct sk_buff *skb, struct ieee80211_sta *sta)
986{
987 struct sta_rec_ht *ht;
988 struct tlv *tlv;
989
990 if (!sta->ht_cap.ht_supported)
991 return;
992
993 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_HT, sizeof(*ht));
994
995 ht = (struct sta_rec_ht *)tlv;
996 ht->ht_cap = cpu_to_le16(sta->ht_cap.cap);
997}
998
999static void
1000mt7915_mcu_sta_vht_tlv(struct sk_buff *skb, struct ieee80211_sta *sta)
1001{
1002 struct sta_rec_vht *vht;
1003 struct tlv *tlv;
1004
1005 if (!sta->vht_cap.vht_supported)
1006 return;
1007
1008 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_VHT, sizeof(*vht));
1009
1010 vht = (struct sta_rec_vht *)tlv;
1011 vht->vht_cap = cpu_to_le32(sta->vht_cap.cap);
1012 vht->vht_rx_mcs_map = sta->vht_cap.vht_mcs.rx_mcs_map;
1013 vht->vht_tx_mcs_map = sta->vht_cap.vht_mcs.tx_mcs_map;
1014}
1015
1016static void
1017mt7915_mcu_sta_amsdu_tlv(struct mt7915_dev *dev, struct sk_buff *skb,
1018 struct ieee80211_vif *vif, struct ieee80211_sta *sta)
1019{
1020 struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
1021 struct sta_rec_amsdu *amsdu;
1022 struct tlv *tlv;
1023
1024 if (vif->type != NL80211_IFTYPE_STATION &&
1025 vif->type != NL80211_IFTYPE_AP)
1026 return;
1027
1028 if (!sta->max_amsdu_len)
1029 return;
1030
1031 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_HW_AMSDU, sizeof(*amsdu));
1032 amsdu = (struct sta_rec_amsdu *)tlv;
1033 amsdu->max_amsdu_num = 8;
1034 amsdu->amsdu_en = true;
1035 msta->wcid.amsdu = true;
1036
1037 switch (sta->max_amsdu_len) {
1038 case IEEE80211_MAX_MPDU_LEN_VHT_11454:
1039 if (!is_mt7915(&dev->mt76)) {
1040 amsdu->max_mpdu_size =
1041 IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454;
1042 return;
1043 }
1044 fallthrough;
1045 case IEEE80211_MAX_MPDU_LEN_HT_7935:
1046 case IEEE80211_MAX_MPDU_LEN_VHT_7991:
1047 amsdu->max_mpdu_size = IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_7991;
1048 return;
1049 default:
1050 amsdu->max_mpdu_size = IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_3895;
1051 return;
1052 }
1053}
1054
1055static int
1056mt7915_mcu_sta_wtbl_tlv(struct mt7915_dev *dev, struct sk_buff *skb,
1057 struct ieee80211_vif *vif, struct ieee80211_sta *sta)
1058{
1059 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1060 struct mt7915_sta *msta;
1061 struct wtbl_req_hdr *wtbl_hdr;
1062 struct mt76_wcid *wcid;
1063 struct tlv *tlv;
1064
1065 msta = sta ? (struct mt7915_sta *)sta->drv_priv : &mvif->sta;
1066 wcid = sta ? &msta->wcid : NULL;
1067
1068 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_WTBL, sizeof(struct tlv));
1069 wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(&dev->mt76, &msta->wcid,
1070 WTBL_RESET_AND_SET, tlv,
1071 &skb);
1072 if (IS_ERR(wtbl_hdr))
1073 return PTR_ERR(wtbl_hdr);
1074
1075 mt76_connac_mcu_wtbl_generic_tlv(&dev->mt76, skb, vif, sta, tlv,
1076 wtbl_hdr);
1077 mt76_connac_mcu_wtbl_hdr_trans_tlv(skb, vif, wcid, tlv, wtbl_hdr);
1078 if (sta)
1079 mt76_connac_mcu_wtbl_ht_tlv(&dev->mt76, skb, sta, tlv,
1080 wtbl_hdr, mvif->cap.ht_ldpc,
1081 mvif->cap.vht_ldpc);
1082
1083 return 0;
1084}
1085
1086static inline bool
1087mt7915_is_ebf_supported(struct mt7915_phy *phy, struct ieee80211_vif *vif,
1088 struct ieee80211_sta *sta, bool bfee)
1089{
1090 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1091 int tx_ant = hweight8(phy->mt76->chainmask) - 1;
1092
1093 if (vif->type != NL80211_IFTYPE_STATION &&
1094 vif->type != NL80211_IFTYPE_AP)
1095 return false;
1096
1097 if (!bfee && tx_ant < 2)
1098 return false;
1099
1100 if (sta->he_cap.has_he) {
1101 struct ieee80211_he_cap_elem *pe = &sta->he_cap.he_cap_elem;
1102
1103 if (bfee)
1104 return mvif->cap.he_su_ebfee &&
1105 HE_PHY(CAP3_SU_BEAMFORMER, pe->phy_cap_info[3]);
1106 else
1107 return mvif->cap.he_su_ebfer &&
1108 HE_PHY(CAP4_SU_BEAMFORMEE, pe->phy_cap_info[4]);
1109 }
1110
1111 if (sta->vht_cap.vht_supported) {
1112 u32 cap = sta->vht_cap.cap;
1113
1114 if (bfee)
1115 return mvif->cap.vht_su_ebfee &&
1116 (cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE);
1117 else
1118 return mvif->cap.vht_su_ebfer &&
1119 (cap & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE);
1120 }
1121
1122 return false;
1123}
1124
1125static void
1126mt7915_mcu_sta_sounding_rate(struct sta_rec_bf *bf)
1127{
1128 bf->sounding_phy = MT_PHY_TYPE_OFDM;
1129 bf->ndp_rate = 0; /* mcs0 */
1130 bf->ndpa_rate = MT7915_CFEND_RATE_DEFAULT; /* ofdm 24m */
1131 bf->rept_poll_rate = MT7915_CFEND_RATE_DEFAULT; /* ofdm 24m */
1132}
1133
1134static void
1135mt7915_mcu_sta_bfer_ht(struct ieee80211_sta *sta, struct mt7915_phy *phy,
1136 struct sta_rec_bf *bf)
1137{
1138 struct ieee80211_mcs_info *mcs = &sta->ht_cap.mcs;
1139 u8 n = 0;
1140
1141 bf->tx_mode = MT_PHY_TYPE_HT;
1142
1143 if ((mcs->tx_params & IEEE80211_HT_MCS_TX_RX_DIFF) &&
1144 (mcs->tx_params & IEEE80211_HT_MCS_TX_DEFINED))
1145 n = FIELD_GET(IEEE80211_HT_MCS_TX_MAX_STREAMS_MASK,
1146 mcs->tx_params);
1147 else if (mcs->rx_mask[3])
1148 n = 3;
1149 else if (mcs->rx_mask[2])
1150 n = 2;
1151 else if (mcs->rx_mask[1])
1152 n = 1;
1153
1154 bf->nrow = hweight8(phy->mt76->chainmask) - 1;
1155 bf->ncol = min_t(u8, bf->nrow, n);
1156 bf->ibf_ncol = n;
1157}
1158
1159static void
1160mt7915_mcu_sta_bfer_vht(struct ieee80211_sta *sta, struct mt7915_phy *phy,
1161 struct sta_rec_bf *bf, bool explicit)
1162{
1163 struct ieee80211_sta_vht_cap *pc = &sta->vht_cap;
1164 struct ieee80211_sta_vht_cap *vc = &phy->mt76->sband_5g.sband.vht_cap;
1165 u16 mcs_map = le16_to_cpu(pc->vht_mcs.rx_mcs_map);
1166 u8 nss_mcs = mt7915_mcu_get_sta_nss(mcs_map);
1167 u8 tx_ant = hweight8(phy->mt76->chainmask) - 1;
1168
1169 bf->tx_mode = MT_PHY_TYPE_VHT;
1170
1171 if (explicit) {
1172 u8 sts, snd_dim;
1173
1174 mt7915_mcu_sta_sounding_rate(bf);
1175
1176 sts = FIELD_GET(IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK,
1177 pc->cap);
1178 snd_dim = FIELD_GET(IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK,
1179 vc->cap);
1180 bf->nrow = min_t(u8, min_t(u8, snd_dim, sts), tx_ant);
1181 bf->ncol = min_t(u8, nss_mcs, bf->nrow);
1182 bf->ibf_ncol = bf->ncol;
1183
1184 if (sta->bandwidth == IEEE80211_STA_RX_BW_160)
1185 bf->nrow = 1;
1186 } else {
1187 bf->nrow = tx_ant;
1188 bf->ncol = min_t(u8, nss_mcs, bf->nrow);
1189 bf->ibf_ncol = nss_mcs;
1190
1191 if (sta->bandwidth == IEEE80211_STA_RX_BW_160)
1192 bf->ibf_nrow = 1;
1193 }
1194}
1195
1196static void
1197mt7915_mcu_sta_bfer_he(struct ieee80211_sta *sta, struct ieee80211_vif *vif,
1198 struct mt7915_phy *phy, struct sta_rec_bf *bf)
1199{
1200 struct ieee80211_sta_he_cap *pc = &sta->he_cap;
1201 struct ieee80211_he_cap_elem *pe = &pc->he_cap_elem;
1202 const struct ieee80211_sta_he_cap *vc =
1203 mt76_connac_get_he_phy_cap(phy->mt76, vif);
1204 const struct ieee80211_he_cap_elem *ve = &vc->he_cap_elem;
1205 u16 mcs_map = le16_to_cpu(pc->he_mcs_nss_supp.rx_mcs_80);
1206 u8 nss_mcs = mt7915_mcu_get_sta_nss(mcs_map);
1207 u8 snd_dim, sts;
1208
1209 bf->tx_mode = MT_PHY_TYPE_HE_SU;
1210
1211 mt7915_mcu_sta_sounding_rate(bf);
1212
1213 bf->trigger_su = HE_PHY(CAP6_TRIG_SU_BEAMFORMING_FB,
1214 pe->phy_cap_info[6]);
1215 bf->trigger_mu = HE_PHY(CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB,
1216 pe->phy_cap_info[6]);
1217 snd_dim = HE_PHY(CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK,
1218 ve->phy_cap_info[5]);
1219 sts = HE_PHY(CAP4_BEAMFORMEE_MAX_STS_UNDER_80MHZ_MASK,
1220 pe->phy_cap_info[4]);
1221 bf->nrow = min_t(u8, snd_dim, sts);
1222 bf->ncol = min_t(u8, nss_mcs, bf->nrow);
1223 bf->ibf_ncol = bf->ncol;
1224
1225 if (sta->bandwidth != IEEE80211_STA_RX_BW_160)
1226 return;
1227
1228 /* go over for 160MHz and 80p80 */
1229 if (pe->phy_cap_info[0] &
1230 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G) {
1231 mcs_map = le16_to_cpu(pc->he_mcs_nss_supp.rx_mcs_160);
1232 nss_mcs = mt7915_mcu_get_sta_nss(mcs_map);
1233
1234 bf->ncol_bw160 = nss_mcs;
1235 }
1236
1237 if (pe->phy_cap_info[0] &
1238 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G) {
1239 mcs_map = le16_to_cpu(pc->he_mcs_nss_supp.rx_mcs_80p80);
1240 nss_mcs = mt7915_mcu_get_sta_nss(mcs_map);
1241
1242 if (bf->ncol_bw160)
1243 bf->ncol_bw160 = min_t(u8, bf->ncol_bw160, nss_mcs);
1244 else
1245 bf->ncol_bw160 = nss_mcs;
1246 }
1247
1248 snd_dim = HE_PHY(CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_MASK,
1249 ve->phy_cap_info[5]);
1250 sts = HE_PHY(CAP4_BEAMFORMEE_MAX_STS_ABOVE_80MHZ_MASK,
1251 pe->phy_cap_info[4]);
1252
1253 bf->nrow_bw160 = min_t(int, snd_dim, sts);
1254}
1255
1256static void
1257mt7915_mcu_sta_bfer_tlv(struct mt7915_dev *dev, struct sk_buff *skb,
1258 struct ieee80211_vif *vif, struct ieee80211_sta *sta)
1259{
1260 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1261 struct mt7915_phy *phy = mvif->phy;
1262 int tx_ant = hweight8(phy->mt76->chainmask) - 1;
1263 struct sta_rec_bf *bf;
1264 struct tlv *tlv;
1265 const u8 matrix[4][4] = {
1266 {0, 0, 0, 0},
1267 {1, 1, 0, 0}, /* 2x1, 2x2, 2x3, 2x4 */
1268 {2, 4, 4, 0}, /* 3x1, 3x2, 3x3, 3x4 */
1269 {3, 5, 6, 0} /* 4x1, 4x2, 4x3, 4x4 */
1270 };
1271 bool ebf;
1272
1273 if (!(sta->ht_cap.ht_supported || sta->he_cap.has_he))
1274 return;
1275
1276 ebf = mt7915_is_ebf_supported(phy, vif, sta, false);
1277 if (!ebf && !dev->ibf)
1278 return;
1279
1280 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_BF, sizeof(*bf));
1281 bf = (struct sta_rec_bf *)tlv;
1282
1283 /* he: eBF only, in accordance with spec
1284 * vht: support eBF and iBF
1285 * ht: iBF only, since mac80211 lacks of eBF support
1286 */
1287 if (sta->he_cap.has_he && ebf)
1288 mt7915_mcu_sta_bfer_he(sta, vif, phy, bf);
1289 else if (sta->vht_cap.vht_supported)
1290 mt7915_mcu_sta_bfer_vht(sta, phy, bf, ebf);
1291 else if (sta->ht_cap.ht_supported)
1292 mt7915_mcu_sta_bfer_ht(sta, phy, bf);
1293 else
1294 return;
1295
1296 bf->bf_cap = ebf ? ebf : dev->ibf << 1;
1297 bf->bw = sta->bandwidth;
1298 bf->ibf_dbw = sta->bandwidth;
1299 bf->ibf_nrow = tx_ant;
1300
1301 if (!ebf && sta->bandwidth <= IEEE80211_STA_RX_BW_40 && !bf->ncol)
1302 bf->ibf_timeout = 0x48;
1303 else
1304 bf->ibf_timeout = 0x18;
1305
1306 if (ebf && bf->nrow != tx_ant)
1307 bf->mem_20m = matrix[tx_ant][bf->ncol];
1308 else
1309 bf->mem_20m = matrix[bf->nrow][bf->ncol];
1310
1311 switch (sta->bandwidth) {
1312 case IEEE80211_STA_RX_BW_160:
1313 case IEEE80211_STA_RX_BW_80:
1314 bf->mem_total = bf->mem_20m * 2;
1315 break;
1316 case IEEE80211_STA_RX_BW_40:
1317 bf->mem_total = bf->mem_20m;
1318 break;
1319 case IEEE80211_STA_RX_BW_20:
1320 default:
1321 break;
1322 }
1323}
1324
1325static void
1326mt7915_mcu_sta_bfee_tlv(struct mt7915_dev *dev, struct sk_buff *skb,
1327 struct ieee80211_vif *vif, struct ieee80211_sta *sta)
1328{
1329 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1330 struct mt7915_phy *phy = mvif->phy;
1331 int tx_ant = hweight8(phy->mt76->chainmask) - 1;
1332 struct sta_rec_bfee *bfee;
1333 struct tlv *tlv;
1334 u8 nrow = 0;
1335
1336 if (!(sta->vht_cap.vht_supported || sta->he_cap.has_he))
1337 return;
1338
1339 if (!mt7915_is_ebf_supported(phy, vif, sta, true))
1340 return;
1341
1342 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_BFEE, sizeof(*bfee));
1343 bfee = (struct sta_rec_bfee *)tlv;
1344
1345 if (sta->he_cap.has_he) {
1346 struct ieee80211_he_cap_elem *pe = &sta->he_cap.he_cap_elem;
1347
1348 nrow = HE_PHY(CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK,
1349 pe->phy_cap_info[5]);
1350 } else if (sta->vht_cap.vht_supported) {
1351 struct ieee80211_sta_vht_cap *pc = &sta->vht_cap;
1352
1353 nrow = FIELD_GET(IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK,
1354 pc->cap);
1355 }
1356
1357 /* reply with identity matrix to avoid 2x2 BF negative gain */
1358 bfee->fb_identity_matrix = (nrow == 1 && tx_ant == 2);
1359}
1360
1361static enum mcu_mmps_mode
1362mt7915_mcu_get_mmps_mode(enum ieee80211_smps_mode smps)
1363{
1364 switch (smps) {
1365 case IEEE80211_SMPS_OFF:
1366 return MCU_MMPS_DISABLE;
1367 case IEEE80211_SMPS_STATIC:
1368 return MCU_MMPS_STATIC;
1369 case IEEE80211_SMPS_DYNAMIC:
1370 return MCU_MMPS_DYNAMIC;
1371 default:
1372 return MCU_MMPS_DISABLE;
1373 }
1374}
1375
1376int mt7915_mcu_set_fixed_rate_ctrl(struct mt7915_dev *dev,
1377 struct ieee80211_vif *vif,
1378 struct ieee80211_sta *sta,
1379 void *data, u32 field)
1380{
1381 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1382 struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
1383 struct sta_phy *phy = data;
1384 struct sta_rec_ra_fixed *ra;
1385 struct sk_buff *skb;
1386 struct tlv *tlv;
1387
1388 skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
1389 &msta->wcid);
1390 if (IS_ERR(skb))
1391 return PTR_ERR(skb);
1392
1393 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_RA_UPDATE, sizeof(*ra));
1394 ra = (struct sta_rec_ra_fixed *)tlv;
1395
1396 switch (field) {
1397 case RATE_PARAM_AUTO:
1398 break;
1399 case RATE_PARAM_FIXED:
1400 case RATE_PARAM_FIXED_MCS:
1401 case RATE_PARAM_FIXED_GI:
1402 case RATE_PARAM_FIXED_HE_LTF:
1403 if (phy)
1404 ra->phy = *phy;
1405 break;
1406 case RATE_PARAM_MMPS_UPDATE:
1407 ra->mmps_mode = mt7915_mcu_get_mmps_mode(sta->smps_mode);
1408 break;
1409 default:
1410 break;
1411 }
1412 ra->field = cpu_to_le32(field);
1413
1414 return mt76_mcu_skb_send_msg(&dev->mt76, skb,
1415 MCU_EXT_CMD(STA_REC_UPDATE), true);
1416}
1417
1418int mt7915_mcu_add_smps(struct mt7915_dev *dev, struct ieee80211_vif *vif,
1419 struct ieee80211_sta *sta)
1420{
1421 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1422 struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
1423 struct wtbl_req_hdr *wtbl_hdr;
1424 struct tlv *sta_wtbl;
1425 struct sk_buff *skb;
1426 int ret;
1427
1428 skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
1429 &msta->wcid);
1430 if (IS_ERR(skb))
1431 return PTR_ERR(skb);
1432
1433 sta_wtbl = mt76_connac_mcu_add_tlv(skb, STA_REC_WTBL,
1434 sizeof(struct tlv));
1435 wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(&dev->mt76, &msta->wcid,
1436 WTBL_SET, sta_wtbl, &skb);
1437 if (IS_ERR(wtbl_hdr))
1438 return PTR_ERR(wtbl_hdr);
1439
1440 mt76_connac_mcu_wtbl_smps_tlv(skb, sta, sta_wtbl, wtbl_hdr);
1441
1442 ret = mt76_mcu_skb_send_msg(&dev->mt76, skb,
1443 MCU_EXT_CMD(STA_REC_UPDATE), true);
1444 if (ret)
1445 return ret;
1446
1447 return mt7915_mcu_set_fixed_rate_ctrl(dev, vif, sta, NULL,
1448 RATE_PARAM_MMPS_UPDATE);
1449}
1450
1451static int
1452mt7915_mcu_add_rate_ctrl_fixed(struct mt7915_dev *dev,
1453 struct ieee80211_vif *vif,
1454 struct ieee80211_sta *sta)
1455{
1456 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1457 struct cfg80211_chan_def *chandef = &mvif->phy->mt76->chandef;
1458 struct cfg80211_bitrate_mask *mask = &mvif->bitrate_mask;
1459 enum nl80211_band band = chandef->chan->band;
1460 struct sta_phy phy = {};
1461 int ret, nrates = 0;
1462
1463#define __sta_phy_bitrate_mask_check(_mcs, _gi, _he) \
1464 do { \
1465 u8 i, gi = mask->control[band]._gi; \
1466 gi = (_he) ? gi : gi == NL80211_TXRATE_FORCE_SGI; \
1467 for (i = 0; i <= sta->bandwidth; i++) { \
1468 phy.sgi |= gi << (i << (_he)); \
1469 phy.he_ltf |= mask->control[band].he_ltf << (i << (_he));\
1470 } \
1471 for (i = 0; i < ARRAY_SIZE(mask->control[band]._mcs); i++) { \
1472 if (!mask->control[band]._mcs[i]) \
1473 continue; \
1474 nrates += hweight16(mask->control[band]._mcs[i]); \
1475 phy.mcs = ffs(mask->control[band]._mcs[i]) - 1; \
1476 } \
1477 } while (0)
1478
1479 if (sta->he_cap.has_he) {
1480 __sta_phy_bitrate_mask_check(he_mcs, he_gi, 1);
1481 } else if (sta->vht_cap.vht_supported) {
1482 __sta_phy_bitrate_mask_check(vht_mcs, gi, 0);
1483 } else if (sta->ht_cap.ht_supported) {
1484 __sta_phy_bitrate_mask_check(ht_mcs, gi, 0);
1485 } else {
1486 nrates = hweight32(mask->control[band].legacy);
1487 phy.mcs = ffs(mask->control[band].legacy) - 1;
1488 }
1489#undef __sta_phy_bitrate_mask_check
1490
1491 /* fall back to auto rate control */
1492 if (mask->control[band].gi == NL80211_TXRATE_DEFAULT_GI &&
1493 mask->control[band].he_gi == GENMASK(7, 0) &&
1494 mask->control[band].he_ltf == GENMASK(7, 0) &&
1495 nrates != 1)
1496 return 0;
1497
1498 /* fixed single rate */
1499 if (nrates == 1) {
1500 ret = mt7915_mcu_set_fixed_rate_ctrl(dev, vif, sta, &phy,
1501 RATE_PARAM_FIXED_MCS);
1502 if (ret)
1503 return ret;
1504 }
1505
1506 /* fixed GI */
1507 if (mask->control[band].gi != NL80211_TXRATE_DEFAULT_GI ||
1508 mask->control[band].he_gi != GENMASK(7, 0)) {
1509 struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
1510 u32 addr;
1511
1512 /* firmware updates only TXCMD but doesn't take WTBL into
1513 * account, so driver should update here to reflect the
1514 * actual txrate hardware sends out.
1515 */
1516 addr = mt7915_mac_wtbl_lmac_addr(dev, msta->wcid.idx, 7);
1517 if (sta->he_cap.has_he)
1518 mt76_rmw_field(dev, addr, GENMASK(31, 24), phy.sgi);
1519 else
1520 mt76_rmw_field(dev, addr, GENMASK(15, 12), phy.sgi);
1521
1522 ret = mt7915_mcu_set_fixed_rate_ctrl(dev, vif, sta, &phy,
1523 RATE_PARAM_FIXED_GI);
1524 if (ret)
1525 return ret;
1526 }
1527
1528 /* fixed HE_LTF */
1529 if (mask->control[band].he_ltf != GENMASK(7, 0)) {
1530 ret = mt7915_mcu_set_fixed_rate_ctrl(dev, vif, sta, &phy,
1531 RATE_PARAM_FIXED_HE_LTF);
1532 if (ret)
1533 return ret;
1534 }
1535
1536 return 0;
1537}
1538
1539static void
1540mt7915_mcu_sta_rate_ctrl_tlv(struct sk_buff *skb, struct mt7915_dev *dev,
1541 struct ieee80211_vif *vif, struct ieee80211_sta *sta)
1542{
1543 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1544 struct mt76_phy *mphy = mvif->phy->mt76;
1545 struct cfg80211_chan_def *chandef = &mphy->chandef;
1546 struct cfg80211_bitrate_mask *mask = &mvif->bitrate_mask;
1547 enum nl80211_band band = chandef->chan->band;
1548 struct sta_rec_ra *ra;
1549 struct tlv *tlv;
1550 u32 supp_rate = sta->supp_rates[band];
1551 u32 cap = sta->wme ? STA_CAP_WMM : 0;
1552
1553 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_RA, sizeof(*ra));
1554 ra = (struct sta_rec_ra *)tlv;
1555
1556 ra->valid = true;
1557 ra->auto_rate = true;
1558 ra->phy_mode = mt76_connac_get_phy_mode(mphy, vif, band, sta);
1559 ra->channel = chandef->chan->hw_value;
1560 ra->bw = sta->bandwidth;
1561 ra->phy.bw = sta->bandwidth;
1562 ra->mmps_mode = mt7915_mcu_get_mmps_mode(sta->smps_mode);
1563
1564 if (supp_rate) {
1565 supp_rate &= mask->control[band].legacy;
1566 ra->rate_len = hweight32(supp_rate);
1567
1568 if (band == NL80211_BAND_2GHZ) {
1569 ra->supp_mode = MODE_CCK;
1570 ra->supp_cck_rate = supp_rate & GENMASK(3, 0);
1571
1572 if (ra->rate_len > 4) {
1573 ra->supp_mode |= MODE_OFDM;
1574 ra->supp_ofdm_rate = supp_rate >> 4;
1575 }
1576 } else {
1577 ra->supp_mode = MODE_OFDM;
1578 ra->supp_ofdm_rate = supp_rate;
1579 }
1580 }
1581
1582 if (sta->ht_cap.ht_supported) {
1583 ra->supp_mode |= MODE_HT;
1584 ra->af = sta->ht_cap.ampdu_factor;
1585 ra->ht_gf = !!(sta->ht_cap.cap & IEEE80211_HT_CAP_GRN_FLD);
1586
1587 cap |= STA_CAP_HT;
1588 if (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20)
1589 cap |= STA_CAP_SGI_20;
1590 if (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40)
1591 cap |= STA_CAP_SGI_40;
1592 if (sta->ht_cap.cap & IEEE80211_HT_CAP_TX_STBC)
1593 cap |= STA_CAP_TX_STBC;
1594 if (sta->ht_cap.cap & IEEE80211_HT_CAP_RX_STBC)
1595 cap |= STA_CAP_RX_STBC;
1596 if (mvif->cap.ht_ldpc &&
1597 (sta->ht_cap.cap & IEEE80211_HT_CAP_LDPC_CODING))
1598 cap |= STA_CAP_LDPC;
1599
1600 mt7915_mcu_set_sta_ht_mcs(sta, ra->ht_mcs,
1601 mask->control[band].ht_mcs);
1602 ra->supp_ht_mcs = *(__le32 *)ra->ht_mcs;
1603 }
1604
1605 if (sta->vht_cap.vht_supported) {
1606 u8 af;
1607
1608 ra->supp_mode |= MODE_VHT;
1609 af = FIELD_GET(IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK,
1610 sta->vht_cap.cap);
1611 ra->af = max_t(u8, ra->af, af);
1612
1613 cap |= STA_CAP_VHT;
1614 if (sta->vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_80)
1615 cap |= STA_CAP_VHT_SGI_80;
1616 if (sta->vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_160)
1617 cap |= STA_CAP_VHT_SGI_160;
1618 if (sta->vht_cap.cap & IEEE80211_VHT_CAP_TXSTBC)
1619 cap |= STA_CAP_VHT_TX_STBC;
1620 if (sta->vht_cap.cap & IEEE80211_VHT_CAP_RXSTBC_1)
1621 cap |= STA_CAP_VHT_RX_STBC;
1622 if (mvif->cap.vht_ldpc &&
1623 (sta->vht_cap.cap & IEEE80211_VHT_CAP_RXLDPC))
1624 cap |= STA_CAP_VHT_LDPC;
1625
1626 mt7915_mcu_set_sta_vht_mcs(sta, ra->supp_vht_mcs,
1627 mask->control[band].vht_mcs);
1628 }
1629
1630 if (sta->he_cap.has_he) {
1631 ra->supp_mode |= MODE_HE;
1632 cap |= STA_CAP_HE;
1633
1634 if (sta->he_6ghz_capa.capa)
1635 ra->af = le16_get_bits(sta->he_6ghz_capa.capa,
1636 IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP);
1637 }
1638
1639 ra->sta_cap = cpu_to_le32(cap);
1640}
1641
1642int mt7915_mcu_add_rate_ctrl(struct mt7915_dev *dev, struct ieee80211_vif *vif,
1643 struct ieee80211_sta *sta, bool changed)
1644{
1645 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1646 struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
1647 struct sk_buff *skb;
1648 int ret;
1649
1650 skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
1651 &msta->wcid);
1652 if (IS_ERR(skb))
1653 return PTR_ERR(skb);
1654
1655 /* firmware rc algorithm refers to sta_rec_he for HE control.
1656 * once dev->rc_work changes the settings driver should also
1657 * update sta_rec_he here.
1658 */
1659 if (changed)
1660 mt7915_mcu_sta_he_tlv(skb, sta, vif);
1661
1662 /* sta_rec_ra accommodates BW, NSS and only MCS range format
1663 * i.e 0-{7,8,9} for VHT.
1664 */
1665 mt7915_mcu_sta_rate_ctrl_tlv(skb, dev, vif, sta);
1666
1667 ret = mt76_mcu_skb_send_msg(&dev->mt76, skb,
1668 MCU_EXT_CMD(STA_REC_UPDATE), true);
1669 if (ret)
1670 return ret;
1671
1672 /* sta_rec_ra_fixed accommodates single rate, (HE)GI and HE_LTE,
1673 * and updates as peer fixed rate parameters, which overrides
1674 * sta_rec_ra and firmware rate control algorithm.
1675 */
1676 return mt7915_mcu_add_rate_ctrl_fixed(dev, vif, sta);
1677}
1678
1679static int
1680mt7915_mcu_add_group(struct mt7915_dev *dev, struct ieee80211_vif *vif,
1681 struct ieee80211_sta *sta)
1682{
1683#define MT_STA_BSS_GROUP 1
1684 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1685 struct mt7915_sta *msta;
1686 struct {
1687 __le32 action;
1688 u8 wlan_idx_lo;
1689 u8 status;
1690 u8 wlan_idx_hi;
1691 u8 rsv0[5];
1692 __le32 val;
1693 u8 rsv1[8];
1694 } __packed req = {
1695 .action = cpu_to_le32(MT_STA_BSS_GROUP),
1696 .val = cpu_to_le32(mvif->mt76.idx % 16),
1697 };
1698
1699 msta = sta ? (struct mt7915_sta *)sta->drv_priv : &mvif->sta;
1700 req.wlan_idx_lo = to_wcid_lo(msta->wcid.idx);
1701 req.wlan_idx_hi = to_wcid_hi(msta->wcid.idx);
1702
1703 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_DRR_CTRL), &req,
1704 sizeof(req), true);
1705}
1706
1707int mt7915_mcu_add_sta(struct mt7915_dev *dev, struct ieee80211_vif *vif,
1708 struct ieee80211_sta *sta, bool enable)
1709{
1710 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1711 struct mt7915_sta *msta;
1712 struct sk_buff *skb;
1713 int ret;
1714
1715 msta = sta ? (struct mt7915_sta *)sta->drv_priv : &mvif->sta;
1716
1717 skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
1718 &msta->wcid);
1719 if (IS_ERR(skb))
1720 return PTR_ERR(skb);
1721
1722 /* starec basic */
1723 mt76_connac_mcu_sta_basic_tlv(skb, vif, sta, enable, true);
1724 if (!enable)
1725 goto out;
1726
1727 /* tag order is in accordance with firmware dependency. */
1728 if (sta) {
1729 /* starec bfer */
1730 mt7915_mcu_sta_bfer_tlv(dev, skb, vif, sta);
1731 /* starec ht */
1732 mt7915_mcu_sta_ht_tlv(skb, sta);
1733 /* starec vht */
1734 mt7915_mcu_sta_vht_tlv(skb, sta);
1735 /* starec uapsd */
1736 mt76_connac_mcu_sta_uapsd(skb, vif, sta);
1737 }
1738
1739 ret = mt7915_mcu_sta_wtbl_tlv(dev, skb, vif, sta);
1740 if (ret) {
1741 dev_kfree_skb(skb);
1742 return ret;
1743 }
1744
1745 if (sta) {
1746 /* starec amsdu */
1747 mt7915_mcu_sta_amsdu_tlv(dev, skb, vif, sta);
1748 /* starec he */
1749 mt7915_mcu_sta_he_tlv(skb, sta, vif);
1750 /* starec muru */
1751 mt7915_mcu_sta_muru_tlv(skb, sta, vif);
1752 /* starec bfee */
1753 mt7915_mcu_sta_bfee_tlv(dev, skb, vif, sta);
1754 }
1755
1756 ret = mt7915_mcu_add_group(dev, vif, sta);
1757 if (ret) {
1758 dev_kfree_skb(skb);
1759 return ret;
1760 }
1761out:
1762 return mt76_mcu_skb_send_msg(&dev->mt76, skb,
1763 MCU_EXT_CMD(STA_REC_UPDATE), true);
1764}
1765
1766int mt7915_mcu_add_dev_info(struct mt7915_phy *phy,
1767 struct ieee80211_vif *vif, bool enable)
1768{
1769 struct mt7915_dev *dev = phy->dev;
1770 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1771 struct {
1772 struct req_hdr {
1773 u8 omac_idx;
1774 u8 dbdc_idx;
1775 __le16 tlv_num;
1776 u8 is_tlv_append;
1777 u8 rsv[3];
1778 } __packed hdr;
1779 struct req_tlv {
1780 __le16 tag;
1781 __le16 len;
1782 u8 active;
1783 u8 dbdc_idx;
1784 u8 omac_addr[ETH_ALEN];
1785 } __packed tlv;
1786 } data = {
1787 .hdr = {
1788 .omac_idx = mvif->mt76.omac_idx,
1789 .dbdc_idx = mvif->mt76.band_idx,
1790 .tlv_num = cpu_to_le16(1),
1791 .is_tlv_append = 1,
1792 },
1793 .tlv = {
1794 .tag = cpu_to_le16(DEV_INFO_ACTIVE),
1795 .len = cpu_to_le16(sizeof(struct req_tlv)),
1796 .active = enable,
1797 .dbdc_idx = mvif->mt76.band_idx,
1798 },
1799 };
1800
1801 if (mvif->mt76.omac_idx >= REPEATER_BSSID_START)
1802 return mt7915_mcu_muar_config(phy, vif, false, enable);
1803
1804 memcpy(data.tlv.omac_addr, vif->addr, ETH_ALEN);
1805 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(DEV_INFO_UPDATE),
1806 &data, sizeof(data), true);
1807}
1808
1809static void
1810mt7915_mcu_beacon_cntdwn(struct ieee80211_vif *vif, struct sk_buff *rskb,
1811 struct sk_buff *skb, struct bss_info_bcn *bcn,
1812 struct ieee80211_mutable_offsets *offs)
1813{
1814 struct bss_info_bcn_cntdwn *info;
1815 struct tlv *tlv;
1816 int sub_tag;
1817
1818 if (!offs->cntdwn_counter_offs[0])
1819 return;
1820
1821 sub_tag = vif->csa_active ? BSS_INFO_BCN_CSA : BSS_INFO_BCN_BCC;
1822 tlv = mt7915_mcu_add_nested_subtlv(rskb, sub_tag, sizeof(*info),
1823 &bcn->sub_ntlv, &bcn->len);
1824 info = (struct bss_info_bcn_cntdwn *)tlv;
1825 info->cnt = skb->data[offs->cntdwn_counter_offs[0]];
1826}
1827
1828static void
1829mt7915_mcu_beacon_mbss(struct sk_buff *rskb, struct sk_buff *skb,
1830 struct ieee80211_vif *vif, struct bss_info_bcn *bcn,
1831 struct ieee80211_mutable_offsets *offs)
1832{
1833 struct bss_info_bcn_mbss *mbss;
1834 const struct element *elem;
1835 struct tlv *tlv;
1836
1837 if (!vif->bss_conf.bssid_indicator)
1838 return;
1839
1840 tlv = mt7915_mcu_add_nested_subtlv(rskb, BSS_INFO_BCN_MBSSID,
1841 sizeof(*mbss), &bcn->sub_ntlv,
1842 &bcn->len);
1843
1844 mbss = (struct bss_info_bcn_mbss *)tlv;
1845 mbss->offset[0] = cpu_to_le16(offs->tim_offset);
1846 mbss->bitmap = cpu_to_le32(1);
1847
1848 for_each_element_id(elem, WLAN_EID_MULTIPLE_BSSID,
1849 &skb->data[offs->mbssid_off],
1850 skb->len - offs->mbssid_off) {
1851 const struct element *sub_elem;
1852
1853 if (elem->datalen < 2)
1854 continue;
1855
1856 for_each_element(sub_elem, elem->data + 1, elem->datalen - 1) {
1857 const struct ieee80211_bssid_index *idx;
1858 const u8 *idx_ie;
1859
1860 if (sub_elem->id || sub_elem->datalen < 4)
1861 continue; /* not a valid BSS profile */
1862
1863 /* Find WLAN_EID_MULTI_BSSID_IDX
1864 * in the merged nontransmitted profile
1865 */
1866 idx_ie = cfg80211_find_ie(WLAN_EID_MULTI_BSSID_IDX,
1867 sub_elem->data,
1868 sub_elem->datalen);
1869 if (!idx_ie || idx_ie[1] < sizeof(*idx))
1870 continue;
1871
1872 idx = (void *)(idx_ie + 2);
1873 if (!idx->bssid_index || idx->bssid_index > 31)
1874 continue;
1875
1876 mbss->offset[idx->bssid_index] =
1877 cpu_to_le16(idx_ie - skb->data);
1878 mbss->bitmap |= cpu_to_le32(BIT(idx->bssid_index));
1879 }
1880 }
1881}
1882
1883static void
1884mt7915_mcu_beacon_cont(struct mt7915_dev *dev, struct ieee80211_vif *vif,
1885 struct sk_buff *rskb, struct sk_buff *skb,
1886 struct bss_info_bcn *bcn,
1887 struct ieee80211_mutable_offsets *offs)
1888{
1889 struct mt76_wcid *wcid = &dev->mt76.global_wcid;
1890 struct bss_info_bcn_cont *cont;
1891 struct tlv *tlv;
1892 u8 *buf;
1893 int len = sizeof(*cont) + MT_TXD_SIZE + skb->len;
1894
1895 tlv = mt7915_mcu_add_nested_subtlv(rskb, BSS_INFO_BCN_CONTENT,
1896 len, &bcn->sub_ntlv, &bcn->len);
1897
1898 cont = (struct bss_info_bcn_cont *)tlv;
1899 cont->pkt_len = cpu_to_le16(MT_TXD_SIZE + skb->len);
1900 cont->tim_ofs = cpu_to_le16(offs->tim_offset);
1901
1902 if (offs->cntdwn_counter_offs[0]) {
1903 u16 offset = offs->cntdwn_counter_offs[0];
1904
1905 if (vif->csa_active)
1906 cont->csa_ofs = cpu_to_le16(offset - 4);
1907 if (vif->color_change_active)
1908 cont->bcc_ofs = cpu_to_le16(offset - 3);
1909 }
1910
1911 buf = (u8 *)tlv + sizeof(*cont);
1912 mt7915_mac_write_txwi(dev, (__le32 *)buf, skb, wcid, 0, NULL,
1913 true);
1914 memcpy(buf + MT_TXD_SIZE, skb->data, skb->len);
1915}
1916
1917static void
1918mt7915_mcu_beacon_check_caps(struct mt7915_phy *phy, struct ieee80211_vif *vif,
1919 struct sk_buff *skb)
1920{
1921 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1922 struct mt7915_vif_cap *vc = &mvif->cap;
1923 const struct ieee80211_he_cap_elem *he;
1924 const struct ieee80211_vht_cap *vht;
1925 const struct ieee80211_ht_cap *ht;
1926 struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)skb->data;
1927 const u8 *ie;
1928 u32 len, bc;
1929
1930 /* Check missing configuration options to allow AP mode in mac80211
1931 * to remain in sync with hostapd settings, and get a subset of
1932 * beacon and hardware capabilities.
1933 */
1934 if (WARN_ON_ONCE(skb->len <= (mgmt->u.beacon.variable - skb->data)))
1935 return;
1936
1937 memset(vc, 0, sizeof(*vc));
1938
1939 len = skb->len - (mgmt->u.beacon.variable - skb->data);
1940
1941 ie = cfg80211_find_ie(WLAN_EID_HT_CAPABILITY, mgmt->u.beacon.variable,
1942 len);
1943 if (ie && ie[1] >= sizeof(*ht)) {
1944 ht = (void *)(ie + 2);
1945 vc->ht_ldpc = !!(le16_to_cpu(ht->cap_info) &
1946 IEEE80211_HT_CAP_LDPC_CODING);
1947 }
1948
1949 ie = cfg80211_find_ie(WLAN_EID_VHT_CAPABILITY, mgmt->u.beacon.variable,
1950 len);
1951 if (ie && ie[1] >= sizeof(*vht)) {
1952 u32 pc = phy->mt76->sband_5g.sband.vht_cap.cap;
1953
1954 vht = (void *)(ie + 2);
1955 bc = le32_to_cpu(vht->vht_cap_info);
1956
1957 vc->vht_ldpc = !!(bc & IEEE80211_VHT_CAP_RXLDPC);
1958 vc->vht_su_ebfer =
1959 (bc & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE) &&
1960 (pc & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE);
1961 vc->vht_su_ebfee =
1962 (bc & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE) &&
1963 (pc & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE);
1964 vc->vht_mu_ebfer =
1965 (bc & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE) &&
1966 (pc & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE);
1967 vc->vht_mu_ebfee =
1968 (bc & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE) &&
1969 (pc & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE);
1970 }
1971
1972 ie = cfg80211_find_ext_ie(WLAN_EID_EXT_HE_CAPABILITY,
1973 mgmt->u.beacon.variable, len);
1974 if (ie && ie[1] >= sizeof(*he) + 1) {
1975 const struct ieee80211_sta_he_cap *pc =
1976 mt76_connac_get_he_phy_cap(phy->mt76, vif);
1977 const struct ieee80211_he_cap_elem *pe = &pc->he_cap_elem;
1978
1979 he = (void *)(ie + 3);
1980
1981 vc->he_ldpc =
1982 HE_PHY(CAP1_LDPC_CODING_IN_PAYLOAD, pe->phy_cap_info[1]);
1983 vc->he_su_ebfer =
1984 HE_PHY(CAP3_SU_BEAMFORMER, he->phy_cap_info[3]) &&
1985 HE_PHY(CAP3_SU_BEAMFORMER, pe->phy_cap_info[3]);
1986 vc->he_su_ebfee =
1987 HE_PHY(CAP4_SU_BEAMFORMEE, he->phy_cap_info[4]) &&
1988 HE_PHY(CAP4_SU_BEAMFORMEE, pe->phy_cap_info[4]);
1989 vc->he_mu_ebfer =
1990 HE_PHY(CAP4_MU_BEAMFORMER, he->phy_cap_info[4]) &&
1991 HE_PHY(CAP4_MU_BEAMFORMER, pe->phy_cap_info[4]);
1992 }
1993}
1994
1995int mt7915_mcu_add_beacon(struct ieee80211_hw *hw,
1996 struct ieee80211_vif *vif, int en)
1997{
1998#define MAX_BEACON_SIZE 512
1999 struct mt7915_dev *dev = mt7915_hw_dev(hw);
2000 struct mt7915_phy *phy = mt7915_hw_phy(hw);
2001 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
2002 struct ieee80211_mutable_offsets offs;
2003 struct ieee80211_tx_info *info;
2004 struct sk_buff *skb, *rskb;
2005 struct tlv *tlv;
2006 struct bss_info_bcn *bcn;
2007 int len = MT7915_BEACON_UPDATE_SIZE + MAX_BEACON_SIZE;
2008 bool ext_phy = phy != &dev->phy;
2009
2010 if (vif->bss_conf.nontransmitted)
2011 return 0;
2012
2013 rskb = __mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
2014 NULL, len);
2015 if (IS_ERR(rskb))
2016 return PTR_ERR(rskb);
2017
2018 tlv = mt76_connac_mcu_add_tlv(rskb, BSS_INFO_OFFLOAD, sizeof(*bcn));
2019 bcn = (struct bss_info_bcn *)tlv;
2020 bcn->enable = en;
2021
2022 if (!en)
2023 goto out;
2024
2025 skb = ieee80211_beacon_get_template(hw, vif, &offs);
2026 if (!skb)
2027 return -EINVAL;
2028
2029 if (skb->len > MAX_BEACON_SIZE - MT_TXD_SIZE) {
2030 dev_err(dev->mt76.dev, "Bcn size limit exceed\n");
2031 dev_kfree_skb(skb);
2032 return -EINVAL;
2033 }
2034
2035 if (ext_phy) {
2036 info = IEEE80211_SKB_CB(skb);
2037 info->hw_queue |= MT_TX_HW_QUEUE_EXT_PHY;
2038 }
2039
2040 mt7915_mcu_beacon_check_caps(phy, vif, skb);
2041
2042 mt7915_mcu_beacon_cntdwn(vif, rskb, skb, bcn, &offs);
2043 mt7915_mcu_beacon_mbss(rskb, skb, vif, bcn, &offs);
2044 mt7915_mcu_beacon_cont(dev, vif, rskb, skb, bcn, &offs);
2045 dev_kfree_skb(skb);
2046
2047out:
2048 return mt76_mcu_skb_send_msg(&phy->dev->mt76, rskb,
2049 MCU_EXT_CMD(BSS_INFO_UPDATE), true);
2050}
2051
2052static int mt7915_driver_own(struct mt7915_dev *dev, u8 band)
2053{
2054 mt76_wr(dev, MT_TOP_LPCR_HOST_BAND(band), MT_TOP_LPCR_HOST_DRV_OWN);
2055 if (!mt76_poll_msec(dev, MT_TOP_LPCR_HOST_BAND(band),
2056 MT_TOP_LPCR_HOST_FW_OWN_STAT, 0, 500)) {
2057 dev_err(dev->mt76.dev, "Timeout for driver own\n");
2058 return -EIO;
2059 }
2060
2061 /* clear irq when the driver own success */
2062 mt76_wr(dev, MT_TOP_LPCR_HOST_BAND_IRQ_STAT(band),
2063 MT_TOP_LPCR_HOST_BAND_STAT);
2064
2065 return 0;
2066}
2067
2068static int mt7915_load_patch(struct mt7915_dev *dev)
2069{
2070 const struct mt7915_patch_hdr *hdr;
2071 const struct firmware *fw = NULL;
2072 int i, ret, sem;
2073
2074 sem = mt76_connac_mcu_patch_sem_ctrl(&dev->mt76, 1);
2075 switch (sem) {
2076 case PATCH_IS_DL:
2077 return 0;
2078 case PATCH_NOT_DL_SEM_SUCCESS:
2079 break;
2080 default:
2081 dev_err(dev->mt76.dev, "Failed to get patch semaphore\n");
2082 return -EAGAIN;
2083 }
2084
2085 ret = request_firmware(&fw, fw_name_var(dev, ROM_PATCH),
2086 dev->mt76.dev);
2087 if (ret)
2088 goto out;
2089
2090 if (!fw || !fw->data || fw->size < sizeof(*hdr)) {
2091 dev_err(dev->mt76.dev, "Invalid firmware\n");
2092 ret = -EINVAL;
2093 goto out;
2094 }
2095
2096 hdr = (const struct mt7915_patch_hdr *)(fw->data);
2097
2098 dev_info(dev->mt76.dev, "HW/SW Version: 0x%x, Build Time: %.16s\n",
2099 be32_to_cpu(hdr->hw_sw_ver), hdr->build_date);
2100
2101 for (i = 0; i < be32_to_cpu(hdr->desc.n_region); i++) {
2102 struct mt7915_patch_sec *sec;
2103 const u8 *dl;
2104 u32 len, addr;
2105
2106 sec = (struct mt7915_patch_sec *)(fw->data + sizeof(*hdr) +
2107 i * sizeof(*sec));
2108 if ((be32_to_cpu(sec->type) & PATCH_SEC_TYPE_MASK) !=
2109 PATCH_SEC_TYPE_INFO) {
2110 ret = -EINVAL;
2111 goto out;
2112 }
2113
2114 addr = be32_to_cpu(sec->info.addr);
2115 len = be32_to_cpu(sec->info.len);
2116 dl = fw->data + be32_to_cpu(sec->offs);
2117
2118 ret = mt76_connac_mcu_init_download(&dev->mt76, addr, len,
2119 DL_MODE_NEED_RSP);
2120 if (ret) {
2121 dev_err(dev->mt76.dev, "Download request failed\n");
2122 goto out;
2123 }
2124
2125 ret = __mt76_mcu_send_firmware(&dev->mt76, MCU_CMD(FW_SCATTER),
2126 dl, len, 4096);
2127 if (ret) {
2128 dev_err(dev->mt76.dev, "Failed to send patch\n");
2129 goto out;
2130 }
2131 }
2132
2133 ret = mt76_connac_mcu_start_patch(&dev->mt76);
2134 if (ret)
2135 dev_err(dev->mt76.dev, "Failed to start patch\n");
2136
2137out:
2138 sem = mt76_connac_mcu_patch_sem_ctrl(&dev->mt76, 0);
2139 switch (sem) {
2140 case PATCH_REL_SEM_SUCCESS:
2141 break;
2142 default:
2143 ret = -EAGAIN;
2144 dev_err(dev->mt76.dev, "Failed to release patch semaphore\n");
2145 break;
2146 }
2147 release_firmware(fw);
2148
2149 return ret;
2150}
2151
2152static int
2153mt7915_mcu_send_ram_firmware(struct mt7915_dev *dev,
2154 const struct mt7915_fw_trailer *hdr,
2155 const u8 *data, bool is_wa)
2156{
2157 int i, offset = 0;
2158 u32 override = 0, option = 0;
2159
2160 for (i = 0; i < hdr->n_region; i++) {
2161 const struct mt7915_fw_region *region;
2162 int err;
2163 u32 len, addr, mode;
2164
2165 region = (const struct mt7915_fw_region *)((const u8 *)hdr -
2166 (hdr->n_region - i) * sizeof(*region));
2167 mode = mt76_connac_mcu_gen_dl_mode(&dev->mt76,
2168 region->feature_set, is_wa);
2169 len = le32_to_cpu(region->len);
2170 addr = le32_to_cpu(region->addr);
2171
2172 if (region->feature_set & FW_FEATURE_OVERRIDE_ADDR)
2173 override = addr;
2174
2175 err = mt76_connac_mcu_init_download(&dev->mt76, addr, len,
2176 mode);
2177 if (err) {
2178 dev_err(dev->mt76.dev, "Download request failed\n");
2179 return err;
2180 }
2181
2182 err = __mt76_mcu_send_firmware(&dev->mt76, MCU_CMD(FW_SCATTER),
2183 data + offset, len, 4096);
2184 if (err) {
2185 dev_err(dev->mt76.dev, "Failed to send firmware.\n");
2186 return err;
2187 }
2188
2189 offset += len;
2190 }
2191
2192 if (override)
2193 option |= FW_START_OVERRIDE;
2194
2195 if (is_wa)
2196 option |= FW_START_WORKING_PDA_CR4;
2197
2198 return mt76_connac_mcu_start_firmware(&dev->mt76, override, option);
2199}
2200
2201static int mt7915_load_ram(struct mt7915_dev *dev)
2202{
2203 const struct mt7915_fw_trailer *hdr;
2204 const struct firmware *fw;
2205 int ret;
2206
2207 ret = request_firmware(&fw, fw_name_var(dev, FIRMWARE_WM),
2208 dev->mt76.dev);
2209 if (ret)
2210 return ret;
2211
2212 if (!fw || !fw->data || fw->size < sizeof(*hdr)) {
2213 dev_err(dev->mt76.dev, "Invalid firmware\n");
2214 ret = -EINVAL;
2215 goto out;
2216 }
2217
2218 hdr = (const struct mt7915_fw_trailer *)(fw->data + fw->size -
2219 sizeof(*hdr));
2220
2221 dev_info(dev->mt76.dev, "WM Firmware Version: %.10s, Build Time: %.15s\n",
2222 hdr->fw_ver, hdr->build_date);
2223
2224 ret = mt7915_mcu_send_ram_firmware(dev, hdr, fw->data, false);
2225 if (ret) {
2226 dev_err(dev->mt76.dev, "Failed to start WM firmware\n");
2227 goto out;
2228 }
2229
2230 release_firmware(fw);
2231
2232 ret = request_firmware(&fw, fw_name(dev, FIRMWARE_WA),
2233 dev->mt76.dev);
2234 if (ret)
2235 return ret;
2236
2237 if (!fw || !fw->data || fw->size < sizeof(*hdr)) {
2238 dev_err(dev->mt76.dev, "Invalid firmware\n");
2239 ret = -EINVAL;
2240 goto out;
2241 }
2242
2243 hdr = (const struct mt7915_fw_trailer *)(fw->data + fw->size -
2244 sizeof(*hdr));
2245
2246 dev_info(dev->mt76.dev, "WA Firmware Version: %.10s, Build Time: %.15s\n",
2247 hdr->fw_ver, hdr->build_date);
2248
2249 ret = mt7915_mcu_send_ram_firmware(dev, hdr, fw->data, true);
2250 if (ret) {
2251 dev_err(dev->mt76.dev, "Failed to start WA firmware\n");
2252 goto out;
2253 }
2254
2255 snprintf(dev->mt76.hw->wiphy->fw_version,
2256 sizeof(dev->mt76.hw->wiphy->fw_version),
2257 "%.10s-%.15s", hdr->fw_ver, hdr->build_date);
2258
2259out:
2260 release_firmware(fw);
2261
2262 return ret;
2263}
2264
2265static int
2266mt7915_firmware_state(struct mt7915_dev *dev, bool wa)
2267{
2268 u32 state = FIELD_PREP(MT_TOP_MISC_FW_STATE,
2269 wa ? FW_STATE_RDY : FW_STATE_FW_DOWNLOAD);
2270
2271 if (!mt76_poll_msec(dev, MT_TOP_MISC, MT_TOP_MISC_FW_STATE,
2272 state, 1000)) {
2273 dev_err(dev->mt76.dev, "Timeout for initializing firmware\n");
2274 return -EIO;
2275 }
2276 return 0;
2277}
2278
2279static int mt7915_load_firmware(struct mt7915_dev *dev)
2280{
2281 int ret;
2282
2283 /* make sure fw is download state */
2284 if (mt7915_firmware_state(dev, false)) {
2285 /* restart firmware once */
2286 __mt76_mcu_restart(&dev->mt76);
2287 ret = mt7915_firmware_state(dev, false);
2288 if (ret) {
2289 dev_err(dev->mt76.dev,
2290 "Firmware is not ready for download\n");
2291 return ret;
2292 }
2293 }
2294
2295 ret = mt7915_load_patch(dev);
2296 if (ret)
2297 return ret;
2298
2299 ret = mt7915_load_ram(dev);
2300 if (ret)
2301 return ret;
2302
2303 ret = mt7915_firmware_state(dev, true);
2304 if (ret)
2305 return ret;
2306
2307 mt76_queue_tx_cleanup(dev, dev->mt76.q_mcu[MT_MCUQ_FWDL], false);
2308
2309 dev_dbg(dev->mt76.dev, "Firmware init done\n");
2310
2311 return 0;
2312}
2313
2314int mt7915_mcu_fw_log_2_host(struct mt7915_dev *dev, u8 type, u8 ctrl)
2315{
2316 struct {
2317 u8 ctrl_val;
2318 u8 pad[3];
2319 } data = {
2320 .ctrl_val = ctrl
2321 };
2322
2323 if (type == MCU_FW_LOG_WA)
2324 return mt76_mcu_send_msg(&dev->mt76, MCU_WA_EXT_CMD(FW_LOG_2_HOST),
2325 &data, sizeof(data), true);
2326
2327 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(FW_LOG_2_HOST), &data,
2328 sizeof(data), true);
2329}
2330
2331int mt7915_mcu_fw_dbg_ctrl(struct mt7915_dev *dev, u32 module, u8 level)
2332{
2333 struct {
2334 u8 ver;
2335 u8 pad;
2336 __le16 len;
2337 u8 level;
2338 u8 rsv[3];
2339 __le32 module_idx;
2340 } data = {
2341 .module_idx = cpu_to_le32(module),
2342 .level = level,
2343 };
2344
2345 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(FW_DBG_CTRL), &data,
2346 sizeof(data), false);
2347}
2348
2349int mt7915_mcu_muru_debug_set(struct mt7915_dev *dev, bool enabled)
2350{
2351 struct {
2352 __le32 cmd;
2353 u8 enable;
2354 } data = {
2355 .cmd = cpu_to_le32(MURU_SET_TXC_TX_STATS_EN),
2356 .enable = enabled,
2357 };
2358
2359 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(MURU_CTRL), &data,
2360 sizeof(data), false);
2361}
2362
2363int mt7915_mcu_muru_debug_get(struct mt7915_phy *phy, void *ms)
2364{
2365 struct mt7915_dev *dev = phy->dev;
2366 struct sk_buff *skb;
2367 struct mt7915_mcu_muru_stats *mu_stats =
2368 (struct mt7915_mcu_muru_stats *)ms;
2369 int ret;
2370
2371 struct {
2372 __le32 cmd;
2373 u8 band_idx;
2374 } req = {
2375 .cmd = cpu_to_le32(MURU_GET_TXC_TX_STATS),
2376 .band_idx = phy->band_idx,
2377 };
2378
2379 ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_EXT_CMD(MURU_CTRL),
2380 &req, sizeof(req), true, &skb);
2381 if (ret)
2382 return ret;
2383
2384 memcpy(mu_stats, skb->data, sizeof(struct mt7915_mcu_muru_stats));
2385 dev_kfree_skb(skb);
2386
2387 return 0;
2388}
2389
2390static int mt7915_mcu_set_mwds(struct mt7915_dev *dev, bool enabled)
2391{
2392 struct {
2393 u8 enable;
2394 u8 _rsv[3];
2395 } __packed req = {
2396 .enable = enabled
2397 };
2398
2399 return mt76_mcu_send_msg(&dev->mt76, MCU_WA_EXT_CMD(MWDS_SUPPORT), &req,
2400 sizeof(req), false);
2401}
2402
2403int mt7915_mcu_set_muru_ctrl(struct mt7915_dev *dev, u32 cmd, u32 val)
2404{
2405 struct {
2406 __le32 cmd;
2407 u8 val[4];
2408 } __packed req = {
2409 .cmd = cpu_to_le32(cmd),
2410 };
2411
2412 put_unaligned_le32(val, req.val);
2413
2414 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(MURU_CTRL), &req,
2415 sizeof(req), false);
2416}
2417
2418static int
2419mt7915_mcu_init_rx_airtime(struct mt7915_dev *dev)
2420{
2421#define RX_AIRTIME_FEATURE_CTRL 1
2422#define RX_AIRTIME_BITWISE_CTRL 2
2423#define RX_AIRTIME_CLEAR_EN 1
2424 struct {
2425 __le16 field;
2426 __le16 sub_field;
2427 __le32 set_status;
2428 __le32 get_status;
2429 u8 _rsv[12];
2430
2431 bool airtime_en;
2432 bool mibtime_en;
2433 bool earlyend_en;
2434 u8 _rsv1[9];
2435
2436 bool airtime_clear;
2437 bool mibtime_clear;
2438 u8 _rsv2[98];
2439 } __packed req = {
2440 .field = cpu_to_le16(RX_AIRTIME_BITWISE_CTRL),
2441 .sub_field = cpu_to_le16(RX_AIRTIME_CLEAR_EN),
2442 .airtime_clear = true,
2443 };
2444 int ret;
2445
2446 ret = mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(RX_AIRTIME_CTRL), &req,
2447 sizeof(req), true);
2448 if (ret)
2449 return ret;
2450
2451 req.field = cpu_to_le16(RX_AIRTIME_FEATURE_CTRL);
2452 req.sub_field = cpu_to_le16(RX_AIRTIME_CLEAR_EN);
2453 req.airtime_en = true;
2454
2455 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(RX_AIRTIME_CTRL), &req,
2456 sizeof(req), true);
2457}
2458
2459int mt7915_mcu_init(struct mt7915_dev *dev)
2460{
2461 static const struct mt76_mcu_ops mt7915_mcu_ops = {
2462 .headroom = sizeof(struct mt7915_mcu_txd),
2463 .mcu_skb_send_msg = mt7915_mcu_send_message,
2464 .mcu_parse_response = mt7915_mcu_parse_response,
2465 .mcu_restart = mt76_connac_mcu_restart,
2466 };
2467 int ret;
2468
2469 dev->mt76.mcu_ops = &mt7915_mcu_ops;
2470
2471 /* force firmware operation mode into normal state,
2472 * which should be set before firmware download stage.
2473 */
2474 if (is_mt7915(&dev->mt76))
2475 mt76_wr(dev, MT_SWDEF_MODE, MT_SWDEF_NORMAL_MODE);
2476 else
2477 mt76_wr(dev, MT_SWDEF_MODE_MT7916, MT_SWDEF_NORMAL_MODE);
2478
2479 ret = mt7915_driver_own(dev, 0);
2480 if (ret)
2481 return ret;
2482 /* set driver own for band1 when two hif exist */
2483 if (dev->hif2) {
2484 ret = mt7915_driver_own(dev, 1);
2485 if (ret)
2486 return ret;
2487 }
2488
2489 ret = mt7915_load_firmware(dev);
2490 if (ret)
2491 return ret;
2492
2493 set_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state);
2494 ret = mt7915_mcu_fw_log_2_host(dev, MCU_FW_LOG_WM, 0);
2495 if (ret)
2496 return ret;
2497
2498 ret = mt7915_mcu_fw_log_2_host(dev, MCU_FW_LOG_WA, 0);
2499 if (ret)
2500 return ret;
2501
developer66cd2092022-05-10 15:43:01 +08002502 if (mtk_wed_device_active(&dev->mt76.mmio.wed))
2503 mt7915_mcu_wa_cmd(dev, MCU_WA_PARAM_CMD(CAPABILITY), 0, 0, 0);
2504
developerb11a5392022-03-31 00:34:47 +08002505 ret = mt7915_mcu_set_mwds(dev, 1);
2506 if (ret)
2507 return ret;
2508
2509 ret = mt7915_mcu_set_muru_ctrl(dev, MURU_SET_PLATFORM_TYPE,
2510 MURU_PLATFORM_TYPE_PERF_LEVEL_2);
2511 if (ret)
2512 return ret;
2513
2514 ret = mt7915_mcu_init_rx_airtime(dev);
2515 if (ret)
2516 return ret;
2517
2518 return mt7915_mcu_wa_cmd(dev, MCU_WA_PARAM_CMD(SET),
2519 MCU_WA_PARAM_RED, 0, 0);
2520}
2521
2522void mt7915_mcu_exit(struct mt7915_dev *dev)
2523{
2524 __mt76_mcu_restart(&dev->mt76);
2525 if (mt7915_firmware_state(dev, false)) {
2526 dev_err(dev->mt76.dev, "Failed to exit mcu\n");
2527 return;
2528 }
2529
2530 mt76_wr(dev, MT_TOP_LPCR_HOST_BAND(0), MT_TOP_LPCR_HOST_FW_OWN);
2531 if (dev->hif2)
2532 mt76_wr(dev, MT_TOP_LPCR_HOST_BAND(1),
2533 MT_TOP_LPCR_HOST_FW_OWN);
2534 skb_queue_purge(&dev->mt76.mcu.res_q);
2535}
2536
2537static int
2538mt7915_mcu_set_rx_hdr_trans_blacklist(struct mt7915_dev *dev, int band)
2539{
2540 struct {
2541 u8 operation;
2542 u8 count;
2543 u8 _rsv[2];
2544 u8 index;
2545 u8 enable;
2546 __le16 etype;
2547 } req = {
2548 .operation = 1,
2549 .count = 1,
2550 .enable = 1,
2551 .etype = cpu_to_le16(ETH_P_PAE),
2552 };
2553
2554 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(RX_HDR_TRANS),
2555 &req, sizeof(req), false);
2556}
2557
2558int mt7915_mcu_set_mac(struct mt7915_dev *dev, int band,
2559 bool enable, bool hdr_trans)
2560{
2561 struct {
2562 u8 operation;
2563 u8 enable;
2564 u8 check_bssid;
2565 u8 insert_vlan;
2566 u8 remove_vlan;
2567 u8 tid;
2568 u8 mode;
2569 u8 rsv;
2570 } __packed req_trans = {
2571 .enable = hdr_trans,
2572 };
2573 struct {
2574 u8 enable;
2575 u8 band;
2576 u8 rsv[2];
2577 } __packed req_mac = {
2578 .enable = enable,
2579 .band = band,
2580 };
2581 int ret;
2582
2583 ret = mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(RX_HDR_TRANS),
2584 &req_trans, sizeof(req_trans), false);
2585 if (ret)
2586 return ret;
2587
2588 if (hdr_trans)
2589 mt7915_mcu_set_rx_hdr_trans_blacklist(dev, band);
2590
2591 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(MAC_INIT_CTRL),
2592 &req_mac, sizeof(req_mac), true);
2593}
2594
developerb11a5392022-03-31 00:34:47 +08002595int mt7915_mcu_update_edca(struct mt7915_dev *dev, void *param)
2596{
2597 struct mt7915_mcu_tx *req = (struct mt7915_mcu_tx *)param;
2598 u8 num = req->total;
2599 size_t len = sizeof(*req) -
2600 (IEEE80211_NUM_ACS - num) * sizeof(struct edca);
2601
2602 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(EDCA_UPDATE), req,
2603 len, true);
2604}
2605
2606int mt7915_mcu_set_tx(struct mt7915_dev *dev, struct ieee80211_vif *vif)
2607{
2608#define TX_CMD_MODE 1
2609 struct mt7915_mcu_tx req = {
2610 .valid = true,
2611 .mode = TX_CMD_MODE,
2612 .total = IEEE80211_NUM_ACS,
2613 };
2614 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
2615 int ac;
2616
2617 for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
2618 struct ieee80211_tx_queue_params *q = &mvif->queue_params[ac];
2619 struct edca *e = &req.edca[ac];
2620
2621 e->set = WMM_PARAM_SET;
2622 e->queue = ac + mvif->mt76.wmm_idx * MT7915_MAX_WMM_SETS;
2623 e->aifs = q->aifs;
2624 e->txop = cpu_to_le16(q->txop);
2625
2626 if (q->cw_min)
2627 e->cw_min = fls(q->cw_min);
2628 else
2629 e->cw_min = 5;
2630
2631 if (q->cw_max)
2632 e->cw_max = cpu_to_le16(fls(q->cw_max));
2633 else
2634 e->cw_max = cpu_to_le16(10);
2635 }
2636
2637 return mt7915_mcu_update_edca(dev, &req);
2638}
2639
2640int mt7915_mcu_set_fcc5_lpn(struct mt7915_dev *dev, int val)
2641{
2642 struct {
2643 __le32 tag;
2644 __le16 min_lpn;
2645 u8 rsv[2];
2646 } __packed req = {
2647 .tag = cpu_to_le32(0x1),
2648 .min_lpn = cpu_to_le16(val),
2649 };
2650
2651 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_RDD_TH), &req,
2652 sizeof(req), true);
2653}
2654
2655int mt7915_mcu_set_pulse_th(struct mt7915_dev *dev,
2656 const struct mt7915_dfs_pulse *pulse)
2657{
2658 struct {
2659 __le32 tag;
2660
2661 __le32 max_width; /* us */
2662 __le32 max_pwr; /* dbm */
2663 __le32 min_pwr; /* dbm */
2664 __le32 min_stgr_pri; /* us */
2665 __le32 max_stgr_pri; /* us */
2666 __le32 min_cr_pri; /* us */
2667 __le32 max_cr_pri; /* us */
2668 } __packed req = {
2669 .tag = cpu_to_le32(0x3),
2670
2671#define __req_field(field) .field = cpu_to_le32(pulse->field)
2672 __req_field(max_width),
2673 __req_field(max_pwr),
2674 __req_field(min_pwr),
2675 __req_field(min_stgr_pri),
2676 __req_field(max_stgr_pri),
2677 __req_field(min_cr_pri),
2678 __req_field(max_cr_pri),
2679#undef __req_field
2680 };
2681
2682 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_RDD_TH), &req,
2683 sizeof(req), true);
2684}
2685
2686int mt7915_mcu_set_radar_th(struct mt7915_dev *dev, int index,
2687 const struct mt7915_dfs_pattern *pattern)
2688{
2689 struct {
2690 __le32 tag;
2691 __le16 radar_type;
2692
2693 u8 enb;
2694 u8 stgr;
2695 u8 min_crpn;
2696 u8 max_crpn;
2697 u8 min_crpr;
2698 u8 min_pw;
2699 __le32 min_pri;
2700 __le32 max_pri;
2701 u8 max_pw;
2702 u8 min_crbn;
2703 u8 max_crbn;
2704 u8 min_stgpn;
2705 u8 max_stgpn;
2706 u8 min_stgpr;
2707 u8 rsv[2];
2708 __le32 min_stgpr_diff;
2709 } __packed req = {
2710 .tag = cpu_to_le32(0x2),
2711 .radar_type = cpu_to_le16(index),
2712
2713#define __req_field_u8(field) .field = pattern->field
2714#define __req_field_u32(field) .field = cpu_to_le32(pattern->field)
2715 __req_field_u8(enb),
2716 __req_field_u8(stgr),
2717 __req_field_u8(min_crpn),
2718 __req_field_u8(max_crpn),
2719 __req_field_u8(min_crpr),
2720 __req_field_u8(min_pw),
2721 __req_field_u32(min_pri),
2722 __req_field_u32(max_pri),
2723 __req_field_u8(max_pw),
2724 __req_field_u8(min_crbn),
2725 __req_field_u8(max_crbn),
2726 __req_field_u8(min_stgpn),
2727 __req_field_u8(max_stgpn),
2728 __req_field_u8(min_stgpr),
2729 __req_field_u32(min_stgpr_diff),
2730#undef __req_field_u8
2731#undef __req_field_u32
2732 };
2733
2734 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_RDD_TH), &req,
2735 sizeof(req), true);
2736}
2737
2738static int
2739mt7915_mcu_background_chain_ctrl(struct mt7915_phy *phy,
2740 struct cfg80211_chan_def *chandef,
2741 int cmd)
2742{
2743 struct mt7915_dev *dev = phy->dev;
2744 struct mt76_phy *mphy = phy->mt76;
2745 struct ieee80211_channel *chan = mphy->chandef.chan;
2746 int freq = mphy->chandef.center_freq1;
2747 struct mt7915_mcu_background_chain_ctrl req = {
2748 .monitor_scan_type = 2, /* simple rx */
2749 };
2750
2751 if (!chandef && cmd != CH_SWITCH_BACKGROUND_SCAN_STOP)
2752 return -EINVAL;
2753
2754 if (!cfg80211_chandef_valid(&mphy->chandef))
2755 return -EINVAL;
2756
2757 switch (cmd) {
2758 case CH_SWITCH_BACKGROUND_SCAN_START: {
2759 req.chan = chan->hw_value;
2760 req.central_chan = ieee80211_frequency_to_channel(freq);
2761 req.bw = mt76_connac_chan_bw(&mphy->chandef);
2762 req.monitor_chan = chandef->chan->hw_value;
2763 req.monitor_central_chan =
2764 ieee80211_frequency_to_channel(chandef->center_freq1);
2765 req.monitor_bw = mt76_connac_chan_bw(chandef);
2766 req.band_idx = phy != &dev->phy;
2767 req.scan_mode = 1;
2768 break;
2769 }
2770 case CH_SWITCH_BACKGROUND_SCAN_RUNNING:
2771 req.monitor_chan = chandef->chan->hw_value;
2772 req.monitor_central_chan =
2773 ieee80211_frequency_to_channel(chandef->center_freq1);
2774 req.band_idx = phy != &dev->phy;
2775 req.scan_mode = 2;
2776 break;
2777 case CH_SWITCH_BACKGROUND_SCAN_STOP:
2778 req.chan = chan->hw_value;
2779 req.central_chan = ieee80211_frequency_to_channel(freq);
2780 req.bw = mt76_connac_chan_bw(&mphy->chandef);
2781 req.tx_stream = hweight8(mphy->antenna_mask);
2782 req.rx_stream = mphy->antenna_mask;
2783 break;
2784 default:
2785 return -EINVAL;
2786 }
2787 req.band = chandef ? chandef->chan->band == NL80211_BAND_5GHZ : 1;
2788
2789 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(OFFCH_SCAN_CTRL),
2790 &req, sizeof(req), false);
2791}
2792
2793int mt7915_mcu_rdd_background_enable(struct mt7915_phy *phy,
2794 struct cfg80211_chan_def *chandef)
2795{
2796 struct mt7915_dev *dev = phy->dev;
2797 int err, region;
2798
2799 if (!chandef) { /* disable offchain */
2800 err = mt76_connac_mcu_rdd_cmd(&dev->mt76, RDD_STOP, MT_RX_SEL2,
2801 0, 0);
2802 if (err)
2803 return err;
2804
2805 return mt7915_mcu_background_chain_ctrl(phy, NULL,
2806 CH_SWITCH_BACKGROUND_SCAN_STOP);
2807 }
2808
2809 err = mt7915_mcu_background_chain_ctrl(phy, chandef,
2810 CH_SWITCH_BACKGROUND_SCAN_START);
2811 if (err)
2812 return err;
2813
2814 switch (dev->mt76.region) {
2815 case NL80211_DFS_ETSI:
2816 region = 0;
2817 break;
2818 case NL80211_DFS_JP:
2819 region = 2;
2820 break;
2821 case NL80211_DFS_FCC:
2822 default:
2823 region = 1;
2824 break;
2825 }
2826
2827 return mt76_connac_mcu_rdd_cmd(&dev->mt76, RDD_START, MT_RX_SEL2,
2828 0, region);
2829}
2830
2831int mt7915_mcu_set_chan_info(struct mt7915_phy *phy, int cmd)
2832{
2833 static const u8 ch_band[] = {
2834 [NL80211_BAND_2GHZ] = 0,
2835 [NL80211_BAND_5GHZ] = 1,
2836 [NL80211_BAND_6GHZ] = 2,
2837 };
2838 struct mt7915_dev *dev = phy->dev;
2839 struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
2840 int freq1 = chandef->center_freq1;
2841 struct {
2842 u8 control_ch;
2843 u8 center_ch;
2844 u8 bw;
2845 u8 tx_streams_num;
2846 u8 rx_streams; /* mask or num */
2847 u8 switch_reason;
2848 u8 band_idx;
2849 u8 center_ch2; /* for 80+80 only */
2850 __le16 cac_case;
2851 u8 channel_band;
2852 u8 rsv0;
2853 __le32 outband_freq;
2854 u8 txpower_drop;
2855 u8 ap_bw;
2856 u8 ap_center_ch;
2857 u8 rsv1[57];
2858 } __packed req = {
2859 .control_ch = chandef->chan->hw_value,
2860 .center_ch = ieee80211_frequency_to_channel(freq1),
2861 .bw = mt76_connac_chan_bw(chandef),
2862 .tx_streams_num = hweight8(phy->mt76->antenna_mask),
2863 .rx_streams = phy->mt76->antenna_mask,
2864 .band_idx = phy->band_idx,
2865 .channel_band = ch_band[chandef->chan->band],
2866 };
2867
2868#ifdef CONFIG_NL80211_TESTMODE
2869 if (phy->mt76->test.tx_antenna_mask &&
2870 (phy->mt76->test.state == MT76_TM_STATE_TX_FRAMES ||
2871 phy->mt76->test.state == MT76_TM_STATE_RX_FRAMES ||
2872 phy->mt76->test.state == MT76_TM_STATE_TX_CONT)) {
2873 req.tx_streams_num = fls(phy->mt76->test.tx_antenna_mask);
2874 req.rx_streams = phy->mt76->test.tx_antenna_mask;
2875
2876 if (phy != &dev->phy)
2877 req.rx_streams >>= dev->chainshift;
2878 }
2879#endif
2880
2881 if (cmd == MCU_EXT_CMD(SET_RX_PATH) ||
2882 dev->mt76.hw->conf.flags & IEEE80211_CONF_MONITOR)
2883 req.switch_reason = CH_SWITCH_NORMAL;
2884 else if (phy->mt76->hw->conf.flags & IEEE80211_CONF_OFFCHANNEL)
2885 req.switch_reason = CH_SWITCH_SCAN_BYPASS_DPD;
2886 else if (!cfg80211_reg_can_beacon(phy->mt76->hw->wiphy, chandef,
2887 NL80211_IFTYPE_AP))
2888 req.switch_reason = CH_SWITCH_DFS;
2889 else
2890 req.switch_reason = CH_SWITCH_NORMAL;
2891
2892 if (cmd == MCU_EXT_CMD(CHANNEL_SWITCH))
2893 req.rx_streams = hweight8(req.rx_streams);
2894
2895 if (chandef->width == NL80211_CHAN_WIDTH_80P80) {
2896 int freq2 = chandef->center_freq2;
2897
2898 req.center_ch2 = ieee80211_frequency_to_channel(freq2);
2899 }
2900
2901 return mt76_mcu_send_msg(&dev->mt76, cmd, &req, sizeof(req), true);
2902}
2903
2904static int mt7915_mcu_set_eeprom_flash(struct mt7915_dev *dev)
2905{
2906#define MAX_PAGE_IDX_MASK GENMASK(7, 5)
2907#define PAGE_IDX_MASK GENMASK(4, 2)
2908#define PER_PAGE_SIZE 0x400
2909 struct mt7915_mcu_eeprom req = { .buffer_mode = EE_MODE_BUFFER };
2910 u16 eeprom_size = mt7915_eeprom_size(dev);
2911 u8 total = DIV_ROUND_UP(eeprom_size, PER_PAGE_SIZE);
2912 u8 *eep = (u8 *)dev->mt76.eeprom.data;
2913 int eep_len;
2914 int i;
2915
2916 for (i = 0; i < total; i++, eep += eep_len) {
2917 struct sk_buff *skb;
2918 int ret;
2919
2920 if (i == total - 1 && !!(eeprom_size % PER_PAGE_SIZE))
2921 eep_len = eeprom_size % PER_PAGE_SIZE;
2922 else
2923 eep_len = PER_PAGE_SIZE;
2924
2925 skb = mt76_mcu_msg_alloc(&dev->mt76, NULL,
2926 sizeof(req) + eep_len);
2927 if (!skb)
2928 return -ENOMEM;
2929
2930 req.format = FIELD_PREP(MAX_PAGE_IDX_MASK, total - 1) |
2931 FIELD_PREP(PAGE_IDX_MASK, i) | EE_FORMAT_WHOLE;
2932 req.len = cpu_to_le16(eep_len);
2933
2934 skb_put_data(skb, &req, sizeof(req));
2935 skb_put_data(skb, eep, eep_len);
2936
2937 ret = mt76_mcu_skb_send_msg(&dev->mt76, skb,
2938 MCU_EXT_CMD(EFUSE_BUFFER_MODE), true);
2939 if (ret)
2940 return ret;
2941 }
2942
2943 return 0;
2944}
2945
2946int mt7915_mcu_set_eeprom(struct mt7915_dev *dev)
2947{
2948 struct mt7915_mcu_eeprom req = {
2949 .buffer_mode = EE_MODE_EFUSE,
2950 .format = EE_FORMAT_WHOLE,
2951 };
2952
2953 if (dev->flash_mode)
2954 return mt7915_mcu_set_eeprom_flash(dev);
2955
2956 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(EFUSE_BUFFER_MODE),
2957 &req, sizeof(req), true);
2958}
2959
2960int mt7915_mcu_get_eeprom(struct mt7915_dev *dev, u32 offset)
2961{
2962 struct mt7915_mcu_eeprom_info req = {
2963 .addr = cpu_to_le32(round_down(offset,
2964 MT7915_EEPROM_BLOCK_SIZE)),
2965 };
2966 struct mt7915_mcu_eeprom_info *res;
2967 struct sk_buff *skb;
2968 int ret;
2969 u8 *buf;
2970
2971 ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_EXT_QUERY(EFUSE_ACCESS), &req,
2972 sizeof(req), true, &skb);
2973 if (ret)
2974 return ret;
2975
2976 res = (struct mt7915_mcu_eeprom_info *)skb->data;
2977 buf = dev->mt76.eeprom.data + le32_to_cpu(res->addr);
2978 memcpy(buf, res->data, MT7915_EEPROM_BLOCK_SIZE);
2979 dev_kfree_skb(skb);
2980
2981 return 0;
2982}
2983
2984int mt7915_mcu_get_eeprom_free_block(struct mt7915_dev *dev, u8 *block_num)
2985{
2986 struct {
2987 u8 _rsv;
2988 u8 version;
2989 u8 die_idx;
2990 u8 _rsv2;
2991 } __packed req = {
2992 .version = 1,
2993 };
2994 struct sk_buff *skb;
2995 int ret;
2996
2997 ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_EXT_QUERY(EFUSE_FREE_BLOCK), &req,
2998 sizeof(req), true, &skb);
2999 if (ret)
3000 return ret;
3001
3002 *block_num = *(u8 *)skb->data;
3003 dev_kfree_skb(skb);
3004
3005 return 0;
3006}
3007
3008static int mt7915_mcu_set_pre_cal(struct mt7915_dev *dev, u8 idx,
3009 u8 *data, u32 len, int cmd)
3010{
3011 struct {
3012 u8 dir;
3013 u8 valid;
3014 __le16 bitmap;
3015 s8 precal;
3016 u8 action;
3017 u8 band;
3018 u8 idx;
3019 u8 rsv[4];
3020 __le32 len;
3021 } req = {};
3022 struct sk_buff *skb;
3023
3024 skb = mt76_mcu_msg_alloc(&dev->mt76, NULL, sizeof(req) + len);
3025 if (!skb)
3026 return -ENOMEM;
3027
3028 req.idx = idx;
3029 req.len = cpu_to_le32(len);
3030 skb_put_data(skb, &req, sizeof(req));
3031 skb_put_data(skb, data, len);
3032
3033 return mt76_mcu_skb_send_msg(&dev->mt76, skb, cmd, false);
3034}
3035
3036int mt7915_mcu_apply_group_cal(struct mt7915_dev *dev)
3037{
3038 u8 idx = 0, *cal = dev->cal, *eep = dev->mt76.eeprom.data;
3039 u32 total = MT_EE_CAL_GROUP_SIZE;
3040
3041 if (1 || !(eep[MT_EE_DO_PRE_CAL] & MT_EE_WIFI_CAL_GROUP))
3042 return 0;
3043
3044 /*
3045 * Items: Rx DCOC, RSSI DCOC, Tx TSSI DCOC, Tx LPFG
3046 * Tx FDIQ, Tx DCIQ, Rx FDIQ, Rx FIIQ, ADCDCOC
3047 */
3048 while (total > 0) {
3049 int ret, len;
3050
3051 len = min_t(u32, total, MT_EE_CAL_UNIT);
3052
3053 ret = mt7915_mcu_set_pre_cal(dev, idx, cal, len,
3054 MCU_EXT_CMD(GROUP_PRE_CAL_INFO));
3055 if (ret)
3056 return ret;
3057
3058 total -= len;
3059 cal += len;
3060 idx++;
3061 }
3062
3063 return 0;
3064}
3065
3066static int mt7915_find_freq_idx(const u16 *freqs, int n_freqs, u16 cur)
3067{
3068 int i;
3069
3070 for (i = 0; i < n_freqs; i++)
3071 if (cur == freqs[i])
3072 return i;
3073
3074 return -1;
3075}
3076
3077static int mt7915_dpd_freq_idx(u16 freq, u8 bw)
3078{
3079 static const u16 freq_list[] = {
3080 5180, 5200, 5220, 5240,
3081 5260, 5280, 5300, 5320,
3082 5500, 5520, 5540, 5560,
3083 5580, 5600, 5620, 5640,
3084 5660, 5680, 5700, 5745,
3085 5765, 5785, 5805, 5825
3086 };
3087 int offset_2g = ARRAY_SIZE(freq_list);
3088 int idx;
3089
3090 if (freq < 4000) {
3091 if (freq < 2432)
3092 return offset_2g;
3093 if (freq < 2457)
3094 return offset_2g + 1;
3095
3096 return offset_2g + 2;
3097 }
3098
3099 if (bw == NL80211_CHAN_WIDTH_80P80 || bw == NL80211_CHAN_WIDTH_160)
3100 return -1;
3101
3102 if (bw != NL80211_CHAN_WIDTH_20) {
3103 idx = mt7915_find_freq_idx(freq_list, ARRAY_SIZE(freq_list),
3104 freq + 10);
3105 if (idx >= 0)
3106 return idx;
3107
3108 idx = mt7915_find_freq_idx(freq_list, ARRAY_SIZE(freq_list),
3109 freq - 10);
3110 if (idx >= 0)
3111 return idx;
3112 }
3113
3114 return mt7915_find_freq_idx(freq_list, ARRAY_SIZE(freq_list), freq);
3115}
3116
3117int mt7915_mcu_apply_tx_dpd(struct mt7915_phy *phy)
3118{
3119 struct mt7915_dev *dev = phy->dev;
3120 struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
3121 u16 total = 2, center_freq = chandef->center_freq1;
3122 u8 *cal = dev->cal, *eep = dev->mt76.eeprom.data;
3123 int idx;
3124
3125 if (1 || !(eep[MT_EE_DO_PRE_CAL] & MT_EE_WIFI_CAL_DPD))
3126 return 0;
3127
3128 idx = mt7915_dpd_freq_idx(center_freq, chandef->width);
3129 if (idx < 0)
3130 return -EINVAL;
3131
3132 /* Items: Tx DPD, Tx Flatness */
3133 idx = idx * 2;
3134 cal += MT_EE_CAL_GROUP_SIZE;
3135
3136 while (total--) {
3137 int ret;
3138
3139 cal += (idx * MT_EE_CAL_UNIT);
3140 ret = mt7915_mcu_set_pre_cal(dev, idx, cal, MT_EE_CAL_UNIT,
3141 MCU_EXT_CMD(DPD_PRE_CAL_INFO));
3142 if (ret)
3143 return ret;
3144
3145 idx++;
3146 }
3147
3148 return 0;
3149}
3150
3151int mt7915_mcu_get_chan_mib_info(struct mt7915_phy *phy, bool chan_switch)
3152{
3153 /* strict order */
3154 static const u32 offs[] = {
3155 MIB_BUSY_TIME, MIB_TX_TIME, MIB_RX_TIME, MIB_OBSS_AIRTIME,
3156 MIB_BUSY_TIME_V2, MIB_TX_TIME_V2, MIB_RX_TIME_V2,
3157 MIB_OBSS_AIRTIME_V2
3158 };
3159 struct mt76_channel_state *state = phy->mt76->chan_state;
3160 struct mt76_channel_state *state_ts = &phy->state_ts;
3161 struct mt7915_dev *dev = phy->dev;
3162 struct mt7915_mcu_mib *res, req[4];
3163 struct sk_buff *skb;
3164 int i, ret, start = 0, ofs = 20;
3165
3166 if (!is_mt7915(&dev->mt76)) {
3167 start = 4;
3168 ofs = 0;
3169 }
3170
3171 for (i = 0; i < 4; i++) {
3172 req[i].band = cpu_to_le32(phy != &dev->phy);
3173 req[i].offs = cpu_to_le32(offs[i + start]);
3174 }
3175
3176 ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_EXT_CMD(GET_MIB_INFO),
3177 req, sizeof(req), true, &skb);
3178 if (ret)
3179 return ret;
3180
3181 res = (struct mt7915_mcu_mib *)(skb->data + ofs);
3182
3183 if (chan_switch)
3184 goto out;
3185
3186#define __res_u64(s) le64_to_cpu(res[s].data)
3187 state->cc_busy += __res_u64(0) - state_ts->cc_busy;
3188 state->cc_tx += __res_u64(1) - state_ts->cc_tx;
3189 state->cc_bss_rx += __res_u64(2) - state_ts->cc_bss_rx;
3190 state->cc_rx += __res_u64(2) + __res_u64(3) - state_ts->cc_rx;
3191
3192out:
3193 state_ts->cc_busy = __res_u64(0);
3194 state_ts->cc_tx = __res_u64(1);
3195 state_ts->cc_bss_rx = __res_u64(2);
3196 state_ts->cc_rx = __res_u64(2) + __res_u64(3);
3197#undef __res_u64
3198
3199 dev_kfree_skb(skb);
3200
3201 return 0;
3202}
3203
3204int mt7915_mcu_get_temperature(struct mt7915_phy *phy)
3205{
3206 struct mt7915_dev *dev = phy->dev;
3207 struct {
3208 u8 ctrl_id;
3209 u8 action;
3210 u8 dbdc_idx;
3211 u8 rsv[5];
3212 } req = {
3213 .ctrl_id = THERMAL_SENSOR_TEMP_QUERY,
3214 .dbdc_idx = phy != &dev->phy,
3215 };
3216
3217 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(THERMAL_CTRL), &req,
3218 sizeof(req), true);
3219}
3220
3221int mt7915_mcu_set_thermal_throttling(struct mt7915_phy *phy, u8 state)
3222{
3223 struct mt7915_dev *dev = phy->dev;
3224 struct {
3225 struct mt7915_mcu_thermal_ctrl ctrl;
3226
3227 __le32 trigger_temp;
3228 __le32 restore_temp;
3229 __le16 sustain_time;
3230 u8 rsv[2];
3231 } __packed req = {
3232 .ctrl = {
3233 .band_idx = phy->band_idx,
3234 },
3235 };
3236 int level;
3237
3238 if (!state) {
3239 req.ctrl.ctrl_id = THERMAL_PROTECT_DISABLE;
3240 goto out;
3241 }
3242
3243 /* set duty cycle and level */
3244 for (level = 0; level < 4; level++) {
3245 int ret;
3246
3247 req.ctrl.ctrl_id = THERMAL_PROTECT_DUTY_CONFIG;
3248 req.ctrl.duty.duty_level = level;
3249 req.ctrl.duty.duty_cycle = state;
3250 state /= 2;
3251
3252 ret = mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(THERMAL_PROT),
3253 &req, sizeof(req.ctrl), false);
3254 if (ret)
3255 return ret;
3256 }
3257
3258 /* set high-temperature trigger threshold */
3259 req.ctrl.ctrl_id = THERMAL_PROTECT_ENABLE;
3260 /* add a safety margin ~10 */
3261 req.restore_temp = cpu_to_le32(phy->throttle_temp[0] - 10);
3262 req.trigger_temp = cpu_to_le32(phy->throttle_temp[1]);
3263 req.sustain_time = cpu_to_le16(10);
3264
3265out:
3266 req.ctrl.type.protect_type = 1;
3267 req.ctrl.type.trigger_type = 1;
3268
3269 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(THERMAL_PROT),
3270 &req, sizeof(req), false);
3271}
3272
3273int mt7915_mcu_set_txpower_sku(struct mt7915_phy *phy)
3274{
3275 struct mt7915_dev *dev = phy->dev;
3276 struct mt76_phy *mphy = phy->mt76;
3277 struct ieee80211_hw *hw = mphy->hw;
3278 struct mt7915_sku_val {
3279 u8 format_id;
3280 u8 limit_type;
3281 u8 dbdc_idx;
3282 s8 val[MT7915_SKU_RATE_NUM];
3283 } __packed req = {
3284 .format_id = 4,
3285 .dbdc_idx = phy != &dev->phy,
3286 };
3287 struct mt76_power_limits limits_array;
3288 s8 *la = (s8 *)&limits_array;
3289 int i, idx, n_chains = hweight8(mphy->antenna_mask);
3290 int tx_power = hw->conf.power_level * 2;
3291
3292 tx_power = mt76_get_sar_power(mphy, mphy->chandef.chan,
3293 tx_power);
3294 tx_power -= mt76_tx_power_nss_delta(n_chains);
3295 tx_power = mt76_get_rate_power_limits(mphy, mphy->chandef.chan,
3296 &limits_array, tx_power);
3297 mphy->txpower_cur = tx_power;
3298
3299 for (i = 0, idx = 0; i < ARRAY_SIZE(mt7915_sku_group_len); i++) {
3300 u8 mcs_num, len = mt7915_sku_group_len[i];
3301 int j;
3302
3303 if (i >= SKU_HT_BW20 && i <= SKU_VHT_BW160) {
3304 mcs_num = 10;
3305
3306 if (i == SKU_HT_BW20 || i == SKU_VHT_BW20)
3307 la = (s8 *)&limits_array + 12;
3308 } else {
3309 mcs_num = len;
3310 }
3311
3312 for (j = 0; j < min_t(u8, mcs_num, len); j++)
3313 req.val[idx + j] = la[j];
3314
3315 la += mcs_num;
3316 idx += len;
3317 }
3318
3319 return mt76_mcu_send_msg(&dev->mt76,
3320 MCU_EXT_CMD(TX_POWER_FEATURE_CTRL), &req,
3321 sizeof(req), true);
3322}
3323
3324int mt7915_mcu_get_txpower_sku(struct mt7915_phy *phy, s8 *txpower, int len)
3325{
3326#define RATE_POWER_INFO 2
3327 struct mt7915_dev *dev = phy->dev;
3328 struct {
3329 u8 format_id;
3330 u8 category;
3331 u8 band;
3332 u8 _rsv;
3333 } __packed req = {
3334 .format_id = 7,
3335 .category = RATE_POWER_INFO,
3336 .band = phy != &dev->phy,
3337 };
3338 s8 res[MT7915_SKU_RATE_NUM][2];
3339 struct sk_buff *skb;
3340 int ret, i;
3341
3342 ret = mt76_mcu_send_and_get_msg(&dev->mt76,
3343 MCU_EXT_CMD(TX_POWER_FEATURE_CTRL),
3344 &req, sizeof(req), true, &skb);
3345 if (ret)
3346 return ret;
3347
3348 memcpy(res, skb->data + 4, sizeof(res));
3349 for (i = 0; i < len; i++)
3350 txpower[i] = res[i][req.band];
3351
3352 dev_kfree_skb(skb);
3353
3354 return 0;
3355}
3356
3357int mt7915_mcu_set_test_param(struct mt7915_dev *dev, u8 param, bool test_mode,
3358 u8 en)
3359{
3360 struct {
3361 u8 test_mode_en;
3362 u8 param_idx;
3363 u8 _rsv[2];
3364
3365 u8 enable;
3366 u8 _rsv2[3];
3367
3368 u8 pad[8];
3369 } __packed req = {
3370 .test_mode_en = test_mode,
3371 .param_idx = param,
3372 .enable = en,
3373 };
3374
3375 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(ATE_CTRL), &req,
3376 sizeof(req), false);
3377}
3378
3379int mt7915_mcu_set_sku_en(struct mt7915_phy *phy, bool enable)
3380{
3381 struct mt7915_dev *dev = phy->dev;
3382 struct mt7915_sku {
3383 u8 format_id;
3384 u8 sku_enable;
3385 u8 dbdc_idx;
3386 u8 rsv;
3387 } __packed req = {
3388 .format_id = 0,
3389 .dbdc_idx = phy != &dev->phy,
3390 .sku_enable = enable,
3391 };
3392
3393 return mt76_mcu_send_msg(&dev->mt76,
3394 MCU_EXT_CMD(TX_POWER_FEATURE_CTRL), &req,
3395 sizeof(req), true);
3396}
3397
3398int mt7915_mcu_set_ser(struct mt7915_dev *dev, u8 action, u8 set, u8 band)
3399{
3400 struct {
3401 u8 action;
3402 u8 set;
3403 u8 band;
3404 u8 rsv;
3405 } req = {
3406 .action = action,
3407 .set = set,
3408 .band = band,
3409 };
3410
3411 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_SER_TRIGGER),
3412 &req, sizeof(req), false);
3413}
3414
3415int mt7915_mcu_set_txbf(struct mt7915_dev *dev, u8 action)
3416{
3417 struct {
3418 u8 action;
3419 union {
3420 struct {
3421 u8 snd_mode;
3422 u8 sta_num;
3423 u8 rsv;
3424 u8 wlan_idx[4];
3425 __le32 snd_period; /* ms */
3426 } __packed snd;
3427 struct {
3428 bool ebf;
3429 bool ibf;
3430 u8 rsv;
3431 } __packed type;
3432 struct {
3433 u8 bf_num;
3434 u8 bf_bitmap;
3435 u8 bf_sel[8];
3436 u8 rsv[5];
3437 } __packed mod;
3438 };
3439 } __packed req = {
3440 .action = action,
3441 };
3442
3443#define MT_BF_PROCESSING 4
3444 switch (action) {
3445 case MT_BF_SOUNDING_ON:
3446 req.snd.snd_mode = MT_BF_PROCESSING;
3447 break;
3448 case MT_BF_TYPE_UPDATE:
3449 req.type.ebf = true;
3450 req.type.ibf = dev->ibf;
3451 break;
3452 case MT_BF_MODULE_UPDATE:
3453 req.mod.bf_num = 2;
3454 req.mod.bf_bitmap = GENMASK(1, 0);
3455 break;
3456 default:
3457 return -EINVAL;
3458 }
3459
3460 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(TXBF_ACTION), &req,
3461 sizeof(req), true);
3462}
3463
3464int mt7915_mcu_add_obss_spr(struct mt7915_dev *dev, struct ieee80211_vif *vif,
3465 bool enable)
3466{
3467#define MT_SPR_ENABLE 1
3468 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
3469 struct {
3470 u8 action;
3471 u8 arg_num;
3472 u8 band_idx;
3473 u8 status;
3474 u8 drop_tx_idx;
3475 u8 sta_idx; /* 256 sta */
3476 u8 rsv[2];
3477 __le32 val;
3478 } __packed req = {
3479 .action = MT_SPR_ENABLE,
3480 .arg_num = 1,
3481 .band_idx = mvif->mt76.band_idx,
3482 .val = cpu_to_le32(enable),
3483 };
3484
3485 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_SPR), &req,
3486 sizeof(req), true);
3487}
3488
3489int mt7915_mcu_get_rx_rate(struct mt7915_phy *phy, struct ieee80211_vif *vif,
3490 struct ieee80211_sta *sta, struct rate_info *rate)
3491{
3492 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
3493 struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
3494 struct mt7915_dev *dev = phy->dev;
3495 struct mt76_phy *mphy = phy->mt76;
3496 struct {
3497 u8 category;
3498 u8 band;
3499 __le16 wcid;
3500 } __packed req = {
3501 .category = MCU_PHY_STATE_CONTENTION_RX_RATE,
3502 .band = mvif->mt76.band_idx,
3503 .wcid = cpu_to_le16(msta->wcid.idx),
3504 };
3505 struct ieee80211_supported_band *sband;
3506 struct mt7915_mcu_phy_rx_info *res;
3507 struct sk_buff *skb;
3508 int ret;
3509 bool cck = false;
3510
3511 ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_EXT_CMD(PHY_STAT_INFO),
3512 &req, sizeof(req), true, &skb);
3513 if (ret)
3514 return ret;
3515
3516 res = (struct mt7915_mcu_phy_rx_info *)skb->data;
3517
3518 rate->mcs = res->rate;
3519 rate->nss = res->nsts + 1;
3520
3521 switch (res->mode) {
3522 case MT_PHY_TYPE_CCK:
3523 cck = true;
3524 fallthrough;
3525 case MT_PHY_TYPE_OFDM:
3526 if (mphy->chandef.chan->band == NL80211_BAND_5GHZ)
3527 sband = &mphy->sband_5g.sband;
3528 else if (mphy->chandef.chan->band == NL80211_BAND_6GHZ)
3529 sband = &mphy->sband_6g.sband;
3530 else
3531 sband = &mphy->sband_2g.sband;
3532
3533 rate->mcs = mt76_get_rate(&dev->mt76, sband, rate->mcs, cck);
3534 rate->legacy = sband->bitrates[rate->mcs].bitrate;
3535 break;
3536 case MT_PHY_TYPE_HT:
3537 case MT_PHY_TYPE_HT_GF:
3538 if (rate->mcs > 31) {
3539 ret = -EINVAL;
3540 goto out;
3541 }
3542
3543 rate->flags = RATE_INFO_FLAGS_MCS;
3544 if (res->gi)
3545 rate->flags |= RATE_INFO_FLAGS_SHORT_GI;
3546 break;
3547 case MT_PHY_TYPE_VHT:
3548 if (rate->mcs > 9) {
3549 ret = -EINVAL;
3550 goto out;
3551 }
3552
3553 rate->flags = RATE_INFO_FLAGS_VHT_MCS;
3554 if (res->gi)
3555 rate->flags |= RATE_INFO_FLAGS_SHORT_GI;
3556 break;
3557 case MT_PHY_TYPE_HE_SU:
3558 case MT_PHY_TYPE_HE_EXT_SU:
3559 case MT_PHY_TYPE_HE_TB:
3560 case MT_PHY_TYPE_HE_MU:
3561 if (res->gi > NL80211_RATE_INFO_HE_GI_3_2 || rate->mcs > 11) {
3562 ret = -EINVAL;
3563 goto out;
3564 }
3565 rate->he_gi = res->gi;
3566 rate->flags = RATE_INFO_FLAGS_HE_MCS;
3567 break;
3568 default:
3569 ret = -EINVAL;
3570 goto out;
3571 }
3572
3573 switch (res->bw) {
3574 case IEEE80211_STA_RX_BW_160:
3575 rate->bw = RATE_INFO_BW_160;
3576 break;
3577 case IEEE80211_STA_RX_BW_80:
3578 rate->bw = RATE_INFO_BW_80;
3579 break;
3580 case IEEE80211_STA_RX_BW_40:
3581 rate->bw = RATE_INFO_BW_40;
3582 break;
3583 default:
3584 rate->bw = RATE_INFO_BW_20;
3585 break;
3586 }
3587
3588out:
3589 dev_kfree_skb(skb);
3590
3591 return ret;
3592}
3593
3594int mt7915_mcu_update_bss_color(struct mt7915_dev *dev, struct ieee80211_vif *vif,
3595 struct cfg80211_he_bss_color *he_bss_color)
3596{
3597 int len = sizeof(struct sta_req_hdr) + sizeof(struct bss_info_color);
3598 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
3599 struct bss_info_color *bss_color;
3600 struct sk_buff *skb;
3601 struct tlv *tlv;
3602
3603 skb = __mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
3604 NULL, len);
3605 if (IS_ERR(skb))
3606 return PTR_ERR(skb);
3607
3608 tlv = mt76_connac_mcu_add_tlv(skb, BSS_INFO_BSS_COLOR,
3609 sizeof(*bss_color));
3610 bss_color = (struct bss_info_color *)tlv;
3611 bss_color->disable = !he_bss_color->enabled;
3612 bss_color->color = he_bss_color->color;
3613
3614 return mt76_mcu_skb_send_msg(&dev->mt76, skb,
3615 MCU_EXT_CMD(BSS_INFO_UPDATE), true);
3616}
3617
3618#define TWT_AGRT_TRIGGER BIT(0)
3619#define TWT_AGRT_ANNOUNCE BIT(1)
3620#define TWT_AGRT_PROTECT BIT(2)
3621
3622int mt7915_mcu_twt_agrt_update(struct mt7915_dev *dev,
3623 struct mt7915_vif *mvif,
3624 struct mt7915_twt_flow *flow,
3625 int cmd)
3626{
3627 struct {
3628 u8 tbl_idx;
3629 u8 cmd;
3630 u8 own_mac_idx;
3631 u8 flowid; /* 0xff for group id */
3632 __le16 peer_id; /* specify the peer_id (msb=0)
3633 * or group_id (msb=1)
3634 */
3635 u8 duration; /* 256 us */
3636 u8 bss_idx;
3637 __le64 start_tsf;
3638 __le16 mantissa;
3639 u8 exponent;
3640 u8 is_ap;
3641 u8 agrt_params;
3642 u8 rsv[23];
3643 } __packed req = {
3644 .tbl_idx = flow->table_id,
3645 .cmd = cmd,
3646 .own_mac_idx = mvif->mt76.omac_idx,
3647 .flowid = flow->id,
3648 .peer_id = cpu_to_le16(flow->wcid),
3649 .duration = flow->duration,
3650 .bss_idx = mvif->mt76.idx,
3651 .start_tsf = cpu_to_le64(flow->tsf),
3652 .mantissa = flow->mantissa,
3653 .exponent = flow->exp,
3654 .is_ap = true,
3655 };
3656
3657 if (flow->protection)
3658 req.agrt_params |= TWT_AGRT_PROTECT;
3659 if (!flow->flowtype)
3660 req.agrt_params |= TWT_AGRT_ANNOUNCE;
3661 if (flow->trigger)
3662 req.agrt_params |= TWT_AGRT_TRIGGER;
3663
3664 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(TWT_AGRT_UPDATE),
3665 &req, sizeof(req), true);
3666}
developer66cd2092022-05-10 15:43:01 +08003667
3668int mt7915_mcu_rf_regval(struct mt7915_dev *dev, u32 regidx, u32 *val, bool set)
3669{
3670 struct {
3671 __le32 idx;
3672 __le32 ofs;
3673 __le32 data;
3674 } __packed req = {
3675 .idx = cpu_to_le32(u32_get_bits(regidx, GENMASK(31, 28))),
3676 .ofs = cpu_to_le32(u32_get_bits(regidx, GENMASK(27, 0))),
3677 .data = set ? cpu_to_le32(*val) : 0,
3678 };
3679 struct sk_buff *skb;
3680 int ret;
3681
3682 if (set)
3683 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(RF_REG_ACCESS),
3684 &req, sizeof(req), false);
3685
3686 ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_EXT_QUERY(RF_REG_ACCESS),
3687 &req, sizeof(req), true, &skb);
3688 if (ret)
3689 return ret;
3690
3691 *val = le32_to_cpu(*(__le32 *)(skb->data + 8));
3692 dev_kfree_skb(skb);
3693
3694 return 0;
3695}