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