Loading...
Note: File does not exist in v5.9.
1// SPDX-License-Identifier: ISC
2/* Copyright (C) 2023 MediaTek Inc. */
3
4#include <linux/fs.h>
5#include <linux/firmware.h>
6#include "mt7925.h"
7#include "mcu.h"
8#include "mac.h"
9
10#define MT_STA_BFER BIT(0)
11#define MT_STA_BFEE BIT(1)
12
13static bool mt7925_disable_clc;
14module_param_named(disable_clc, mt7925_disable_clc, bool, 0644);
15MODULE_PARM_DESC(disable_clc, "disable CLC support");
16
17int mt7925_mcu_parse_response(struct mt76_dev *mdev, int cmd,
18 struct sk_buff *skb, int seq)
19{
20 int mcu_cmd = FIELD_GET(__MCU_CMD_FIELD_ID, cmd);
21 struct mt7925_mcu_rxd *rxd;
22 int ret = 0;
23
24 if (!skb) {
25 dev_err(mdev->dev, "Message %08x (seq %d) timeout\n", cmd, seq);
26 mt792x_reset(mdev);
27
28 return -ETIMEDOUT;
29 }
30
31 rxd = (struct mt7925_mcu_rxd *)skb->data;
32 if (seq != rxd->seq)
33 return -EAGAIN;
34
35 if (cmd == MCU_CMD(PATCH_SEM_CONTROL) ||
36 cmd == MCU_CMD(PATCH_FINISH_REQ)) {
37 skb_pull(skb, sizeof(*rxd) - 4);
38 ret = *skb->data;
39 } else if (cmd == MCU_UNI_CMD(DEV_INFO_UPDATE) ||
40 cmd == MCU_UNI_CMD(BSS_INFO_UPDATE) ||
41 cmd == MCU_UNI_CMD(STA_REC_UPDATE) ||
42 cmd == MCU_UNI_CMD(HIF_CTRL) ||
43 cmd == MCU_UNI_CMD(OFFLOAD) ||
44 cmd == MCU_UNI_CMD(SUSPEND)) {
45 struct mt7925_mcu_uni_event *event;
46
47 skb_pull(skb, sizeof(*rxd));
48 event = (struct mt7925_mcu_uni_event *)skb->data;
49 ret = le32_to_cpu(event->status);
50 /* skip invalid event */
51 if (mcu_cmd != event->cid)
52 ret = -EAGAIN;
53 } else {
54 skb_pull(skb, sizeof(*rxd));
55 }
56
57 return ret;
58}
59EXPORT_SYMBOL_GPL(mt7925_mcu_parse_response);
60
61int mt7925_mcu_regval(struct mt792x_dev *dev, u32 regidx, u32 *val, bool set)
62{
63#define MT_RF_REG_HDR GENMASK(31, 24)
64#define MT_RF_REG_ANT GENMASK(23, 16)
65#define RF_REG_PREFIX 0x99
66 struct {
67 u8 __rsv[4];
68 union {
69 struct uni_cmd_access_reg_basic {
70 __le16 tag;
71 __le16 len;
72 __le32 idx;
73 __le32 data;
74 } __packed reg;
75 struct uni_cmd_access_rf_reg_basic {
76 __le16 tag;
77 __le16 len;
78 __le16 ant;
79 u8 __rsv[2];
80 __le32 idx;
81 __le32 data;
82 } __packed rf_reg;
83 };
84 } __packed * res, req;
85 struct sk_buff *skb;
86 int ret;
87
88 if (u32_get_bits(regidx, MT_RF_REG_HDR) == RF_REG_PREFIX) {
89 req.rf_reg.tag = cpu_to_le16(UNI_CMD_ACCESS_RF_REG_BASIC);
90 req.rf_reg.len = cpu_to_le16(sizeof(req.rf_reg));
91 req.rf_reg.ant = cpu_to_le16(u32_get_bits(regidx, MT_RF_REG_ANT));
92 req.rf_reg.idx = cpu_to_le32(regidx);
93 req.rf_reg.data = set ? cpu_to_le32(*val) : 0;
94 } else {
95 req.reg.tag = cpu_to_le16(UNI_CMD_ACCESS_REG_BASIC);
96 req.reg.len = cpu_to_le16(sizeof(req.reg));
97 req.reg.idx = cpu_to_le32(regidx);
98 req.reg.data = set ? cpu_to_le32(*val) : 0;
99 }
100
101 if (set)
102 return mt76_mcu_send_msg(&dev->mt76, MCU_WM_UNI_CMD(REG_ACCESS),
103 &req, sizeof(req), true);
104
105 ret = mt76_mcu_send_and_get_msg(&dev->mt76,
106 MCU_WM_UNI_CMD_QUERY(REG_ACCESS),
107 &req, sizeof(req), true, &skb);
108 if (ret)
109 return ret;
110
111 res = (void *)skb->data;
112 if (u32_get_bits(regidx, MT_RF_REG_HDR) == RF_REG_PREFIX)
113 *val = le32_to_cpu(res->rf_reg.data);
114 else
115 *val = le32_to_cpu(res->reg.data);
116
117 dev_kfree_skb(skb);
118
119 return 0;
120}
121EXPORT_SYMBOL_GPL(mt7925_mcu_regval);
122
123int mt7925_mcu_update_arp_filter(struct mt76_dev *dev,
124 struct mt76_vif *vif,
125 struct ieee80211_bss_conf *info)
126{
127 struct ieee80211_vif *mvif = container_of(info, struct ieee80211_vif,
128 bss_conf);
129 struct sk_buff *skb;
130 int i, len = min_t(int, mvif->cfg.arp_addr_cnt,
131 IEEE80211_BSS_ARP_ADDR_LIST_LEN);
132 struct {
133 struct {
134 u8 bss_idx;
135 u8 pad[3];
136 } __packed hdr;
137 struct mt7925_arpns_tlv arp;
138 } req = {
139 .hdr = {
140 .bss_idx = vif->idx,
141 },
142 .arp = {
143 .tag = cpu_to_le16(UNI_OFFLOAD_OFFLOAD_ARP),
144 .len = cpu_to_le16(sizeof(req) - 4 + len * 2 * sizeof(__be32)),
145 .ips_num = len,
146 .enable = true,
147 },
148 };
149
150 skb = mt76_mcu_msg_alloc(dev, NULL, sizeof(req) + len * 2 * sizeof(__be32));
151 if (!skb)
152 return -ENOMEM;
153
154 skb_put_data(skb, &req, sizeof(req));
155 for (i = 0; i < len; i++) {
156 skb_put_data(skb, &mvif->cfg.arp_addr_list[i], sizeof(__be32));
157 skb_put_zero(skb, sizeof(__be32));
158 }
159
160 return mt76_mcu_skb_send_msg(dev, skb, MCU_UNI_CMD(OFFLOAD), true);
161}
162
163#ifdef CONFIG_PM
164static int
165mt7925_connac_mcu_set_wow_ctrl(struct mt76_phy *phy, struct ieee80211_vif *vif,
166 bool suspend, struct cfg80211_wowlan *wowlan)
167{
168 struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
169 struct mt76_dev *dev = phy->dev;
170 struct {
171 struct {
172 u8 bss_idx;
173 u8 pad[3];
174 } __packed hdr;
175 struct mt76_connac_wow_ctrl_tlv wow_ctrl_tlv;
176 struct mt76_connac_wow_gpio_param_tlv gpio_tlv;
177 } req = {
178 .hdr = {
179 .bss_idx = mvif->idx,
180 },
181 .wow_ctrl_tlv = {
182 .tag = cpu_to_le16(UNI_SUSPEND_WOW_CTRL),
183 .len = cpu_to_le16(sizeof(struct mt76_connac_wow_ctrl_tlv)),
184 .cmd = suspend ? 1 : 2,
185 },
186 .gpio_tlv = {
187 .tag = cpu_to_le16(UNI_SUSPEND_WOW_GPIO_PARAM),
188 .len = cpu_to_le16(sizeof(struct mt76_connac_wow_gpio_param_tlv)),
189 .gpio_pin = 0xff, /* follow fw about GPIO pin */
190 },
191 };
192
193 if (wowlan->magic_pkt)
194 req.wow_ctrl_tlv.trigger |= UNI_WOW_DETECT_TYPE_MAGIC;
195 if (wowlan->disconnect)
196 req.wow_ctrl_tlv.trigger |= (UNI_WOW_DETECT_TYPE_DISCONNECT |
197 UNI_WOW_DETECT_TYPE_BCN_LOST);
198 if (wowlan->nd_config) {
199 mt7925_mcu_sched_scan_req(phy, vif, wowlan->nd_config);
200 req.wow_ctrl_tlv.trigger |= UNI_WOW_DETECT_TYPE_SCH_SCAN_HIT;
201 mt7925_mcu_sched_scan_enable(phy, vif, suspend);
202 }
203 if (wowlan->n_patterns)
204 req.wow_ctrl_tlv.trigger |= UNI_WOW_DETECT_TYPE_BITMAP;
205
206 if (mt76_is_mmio(dev))
207 req.wow_ctrl_tlv.wakeup_hif = WOW_PCIE;
208 else if (mt76_is_usb(dev))
209 req.wow_ctrl_tlv.wakeup_hif = WOW_USB;
210 else if (mt76_is_sdio(dev))
211 req.wow_ctrl_tlv.wakeup_hif = WOW_GPIO;
212
213 return mt76_mcu_send_msg(dev, MCU_UNI_CMD(SUSPEND), &req,
214 sizeof(req), true);
215}
216
217static int
218mt7925_mcu_set_wow_pattern(struct mt76_dev *dev,
219 struct ieee80211_vif *vif,
220 u8 index, bool enable,
221 struct cfg80211_pkt_pattern *pattern)
222{
223 struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
224 struct mt7925_wow_pattern_tlv *tlv;
225 struct sk_buff *skb;
226 struct {
227 u8 bss_idx;
228 u8 pad[3];
229 } __packed hdr = {
230 .bss_idx = mvif->idx,
231 };
232
233 skb = mt76_mcu_msg_alloc(dev, NULL, sizeof(hdr) + sizeof(*tlv));
234 if (!skb)
235 return -ENOMEM;
236
237 skb_put_data(skb, &hdr, sizeof(hdr));
238 tlv = (struct mt7925_wow_pattern_tlv *)skb_put(skb, sizeof(*tlv));
239 tlv->tag = cpu_to_le16(UNI_SUSPEND_WOW_PATTERN);
240 tlv->len = cpu_to_le16(sizeof(*tlv));
241 tlv->bss_idx = 0xF;
242 tlv->data_len = pattern->pattern_len;
243 tlv->enable = enable;
244 tlv->index = index;
245 tlv->offset = 0;
246
247 memcpy(tlv->pattern, pattern->pattern, pattern->pattern_len);
248 memcpy(tlv->mask, pattern->mask, DIV_ROUND_UP(pattern->pattern_len, 8));
249
250 return mt76_mcu_skb_send_msg(dev, skb, MCU_UNI_CMD(SUSPEND), true);
251}
252
253void mt7925_mcu_set_suspend_iter(void *priv, u8 *mac,
254 struct ieee80211_vif *vif)
255{
256 struct mt76_phy *phy = priv;
257 bool suspend = !test_bit(MT76_STATE_RUNNING, &phy->state);
258 struct ieee80211_hw *hw = phy->hw;
259 struct cfg80211_wowlan *wowlan = hw->wiphy->wowlan_config;
260 int i;
261
262 mt76_connac_mcu_set_gtk_rekey(phy->dev, vif, suspend);
263
264 mt76_connac_mcu_set_suspend_mode(phy->dev, vif, suspend, 1, true);
265
266 for (i = 0; i < wowlan->n_patterns; i++)
267 mt7925_mcu_set_wow_pattern(phy->dev, vif, i, suspend,
268 &wowlan->patterns[i]);
269 mt7925_connac_mcu_set_wow_ctrl(phy, vif, suspend, wowlan);
270}
271
272#endif /* CONFIG_PM */
273
274static void
275mt7925_mcu_connection_loss_iter(void *priv, u8 *mac,
276 struct ieee80211_vif *vif)
277{
278 struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
279 struct mt7925_uni_beacon_loss_event *event = priv;
280
281 if (mvif->idx != event->hdr.bss_idx)
282 return;
283
284 if (!(vif->driver_flags & IEEE80211_VIF_BEACON_FILTER) ||
285 vif->type != NL80211_IFTYPE_STATION)
286 return;
287
288 ieee80211_connection_loss(vif);
289}
290
291static void
292mt7925_mcu_connection_loss_event(struct mt792x_dev *dev, struct sk_buff *skb)
293{
294 struct mt7925_uni_beacon_loss_event *event;
295 struct mt76_phy *mphy = &dev->mt76.phy;
296
297 skb_pull(skb, sizeof(struct mt7925_mcu_rxd));
298 event = (struct mt7925_uni_beacon_loss_event *)skb->data;
299
300 ieee80211_iterate_active_interfaces_atomic(mphy->hw,
301 IEEE80211_IFACE_ITER_RESUME_ALL,
302 mt7925_mcu_connection_loss_iter, event);
303}
304
305static void
306mt7925_mcu_roc_iter(void *priv, u8 *mac, struct ieee80211_vif *vif)
307{
308 struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
309 struct mt7925_roc_grant_tlv *grant = priv;
310
311 if (mvif->idx != grant->bss_idx)
312 return;
313
314 mvif->band_idx = grant->dbdcband;
315}
316
317static void
318mt7925_mcu_uni_roc_event(struct mt792x_dev *dev, struct sk_buff *skb)
319{
320 struct ieee80211_hw *hw = dev->mt76.hw;
321 struct mt7925_roc_grant_tlv *grant;
322 struct mt7925_mcu_rxd *rxd;
323 int duration;
324
325 rxd = (struct mt7925_mcu_rxd *)skb->data;
326 grant = (struct mt7925_roc_grant_tlv *)(rxd->tlv + 4);
327
328 /* should never happen */
329 WARN_ON_ONCE((le16_to_cpu(grant->tag) != UNI_EVENT_ROC_GRANT));
330
331 if (grant->reqtype == MT7925_ROC_REQ_ROC)
332 ieee80211_ready_on_channel(hw);
333 else if (grant->reqtype == MT7925_ROC_REQ_JOIN)
334 ieee80211_iterate_active_interfaces_atomic(hw,
335 IEEE80211_IFACE_ITER_RESUME_ALL,
336 mt7925_mcu_roc_iter, grant);
337 dev->phy.roc_grant = true;
338 wake_up(&dev->phy.roc_wait);
339 duration = le32_to_cpu(grant->max_interval);
340 mod_timer(&dev->phy.roc_timer,
341 jiffies + msecs_to_jiffies(duration));
342}
343
344static void
345mt7925_mcu_scan_event(struct mt792x_dev *dev, struct sk_buff *skb)
346{
347 struct mt76_phy *mphy = &dev->mt76.phy;
348 struct mt792x_phy *phy = mphy->priv;
349
350 spin_lock_bh(&dev->mt76.lock);
351 __skb_queue_tail(&phy->scan_event_list, skb);
352 spin_unlock_bh(&dev->mt76.lock);
353
354 ieee80211_queue_delayed_work(mphy->hw, &phy->scan_work,
355 MT792x_HW_SCAN_TIMEOUT);
356}
357
358static void
359mt7925_mcu_tx_done_event(struct mt792x_dev *dev, struct sk_buff *skb)
360{
361#define UNI_EVENT_TX_DONE_MSG 0
362#define UNI_EVENT_TX_DONE_RAW 1
363 struct mt7925_mcu_txs_event {
364 u8 ver;
365 u8 rsv[3];
366 u8 data[0];
367 } __packed * txs;
368 struct tlv *tlv;
369 u32 tlv_len;
370
371 skb_pull(skb, sizeof(struct mt7925_mcu_rxd) + 4);
372 tlv = (struct tlv *)skb->data;
373 tlv_len = skb->len;
374
375 while (tlv_len > 0 && le16_to_cpu(tlv->len) <= tlv_len) {
376 switch (le16_to_cpu(tlv->tag)) {
377 case UNI_EVENT_TX_DONE_RAW:
378 txs = (struct mt7925_mcu_txs_event *)tlv->data;
379 mt7925_mac_add_txs(dev, txs->data);
380 break;
381 default:
382 break;
383 }
384 tlv_len -= le16_to_cpu(tlv->len);
385 tlv = (struct tlv *)((char *)(tlv) + le16_to_cpu(tlv->len));
386 }
387}
388
389static void
390mt7925_mcu_uni_debug_msg_event(struct mt792x_dev *dev, struct sk_buff *skb)
391{
392 struct mt7925_uni_debug_msg {
393 __le16 tag;
394 __le16 len;
395 u8 fmt;
396 u8 rsv[3];
397 u8 id;
398 u8 type:3;
399 u8 nr_args:5;
400 union {
401 struct idxlog {
402 __le16 rsv;
403 __le32 ts;
404 __le32 idx;
405 u8 data[];
406 } __packed idx;
407 struct txtlog {
408 u8 len;
409 u8 rsv;
410 __le32 ts;
411 u8 data[];
412 } __packed txt;
413 };
414 } __packed * hdr;
415
416 skb_pull(skb, sizeof(struct mt7925_mcu_rxd) + 4);
417 hdr = (struct mt7925_uni_debug_msg *)skb->data;
418
419 if (hdr->id == 0x28) {
420 skb_pull(skb, offsetof(struct mt7925_uni_debug_msg, id));
421 wiphy_info(mt76_hw(dev)->wiphy, "%.*s", skb->len, skb->data);
422 return;
423 } else if (hdr->id != 0xa8) {
424 return;
425 }
426
427 if (hdr->type == 0) { /* idx log */
428 int i, ret, len = PAGE_SIZE - 1, nr_val;
429 struct page *page = dev_alloc_pages(get_order(len));
430 __le32 *val;
431 char *buf, *cur;
432
433 if (!page)
434 return;
435
436 buf = page_address(page);
437 cur = buf;
438
439 nr_val = (le16_to_cpu(hdr->len) - sizeof(*hdr)) / 4;
440 val = (__le32 *)hdr->idx.data;
441 for (i = 0; i < nr_val && len > 0; i++) {
442 ret = snprintf(cur, len, "0x%x,", le32_to_cpu(val[i]));
443 if (ret <= 0)
444 break;
445
446 cur += ret;
447 len -= ret;
448 }
449 if (cur > buf)
450 wiphy_info(mt76_hw(dev)->wiphy, "idx: 0x%X,%d,%s",
451 le32_to_cpu(hdr->idx.idx), nr_val, buf);
452 put_page(page);
453 } else if (hdr->type == 2) { /* str log */
454 wiphy_info(mt76_hw(dev)->wiphy, "%.*s", hdr->txt.len, hdr->txt.data);
455 }
456}
457
458static void
459mt7925_mcu_uni_rx_unsolicited_event(struct mt792x_dev *dev,
460 struct sk_buff *skb)
461{
462 struct mt7925_mcu_rxd *rxd;
463
464 rxd = (struct mt7925_mcu_rxd *)skb->data;
465
466 switch (rxd->eid) {
467 case MCU_UNI_EVENT_FW_LOG_2_HOST:
468 mt7925_mcu_uni_debug_msg_event(dev, skb);
469 break;
470 case MCU_UNI_EVENT_ROC:
471 mt7925_mcu_uni_roc_event(dev, skb);
472 break;
473 case MCU_UNI_EVENT_SCAN_DONE:
474 mt7925_mcu_scan_event(dev, skb);
475 return;
476 case MCU_UNI_EVENT_TX_DONE:
477 mt7925_mcu_tx_done_event(dev, skb);
478 break;
479 case MCU_UNI_EVENT_BSS_BEACON_LOSS:
480 mt7925_mcu_connection_loss_event(dev, skb);
481 break;
482 case MCU_UNI_EVENT_COREDUMP:
483 dev->fw_assert = true;
484 mt76_connac_mcu_coredump_event(&dev->mt76, skb, &dev->coredump);
485 return;
486 default:
487 break;
488 }
489 dev_kfree_skb(skb);
490}
491
492void mt7925_mcu_rx_event(struct mt792x_dev *dev, struct sk_buff *skb)
493{
494 struct mt7925_mcu_rxd *rxd = (struct mt7925_mcu_rxd *)skb->data;
495
496 if (skb_linearize(skb))
497 return;
498
499 if (rxd->option & MCU_UNI_CMD_UNSOLICITED_EVENT) {
500 mt7925_mcu_uni_rx_unsolicited_event(dev, skb);
501 return;
502 }
503
504 mt76_mcu_rx_event(&dev->mt76, skb);
505}
506
507static int
508mt7925_mcu_sta_ba(struct mt76_dev *dev, struct mt76_vif *mvif,
509 struct ieee80211_ampdu_params *params,
510 bool enable, bool tx)
511{
512 struct mt76_wcid *wcid = (struct mt76_wcid *)params->sta->drv_priv;
513 struct sta_rec_ba_uni *ba;
514 struct sk_buff *skb;
515 struct tlv *tlv;
516 int len;
517
518 len = sizeof(struct sta_req_hdr) + sizeof(*ba);
519 skb = __mt76_connac_mcu_alloc_sta_req(dev, mvif, wcid,
520 len);
521 if (IS_ERR(skb))
522 return PTR_ERR(skb);
523
524 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_BA, sizeof(*ba));
525
526 ba = (struct sta_rec_ba_uni *)tlv;
527 ba->ba_type = tx ? MT_BA_TYPE_ORIGINATOR : MT_BA_TYPE_RECIPIENT;
528 ba->winsize = cpu_to_le16(params->buf_size);
529 ba->ssn = cpu_to_le16(params->ssn);
530 ba->ba_en = enable << params->tid;
531 ba->amsdu = params->amsdu;
532 ba->tid = params->tid;
533
534 return mt76_mcu_skb_send_msg(dev, skb,
535 MCU_UNI_CMD(STA_REC_UPDATE), true);
536}
537
538/** starec & wtbl **/
539int mt7925_mcu_uni_tx_ba(struct mt792x_dev *dev,
540 struct ieee80211_ampdu_params *params,
541 bool enable)
542{
543 struct mt792x_sta *msta = (struct mt792x_sta *)params->sta->drv_priv;
544 struct mt792x_vif *mvif = msta->vif;
545
546 if (enable && !params->amsdu)
547 msta->wcid.amsdu = false;
548
549 return mt7925_mcu_sta_ba(&dev->mt76, &mvif->mt76, params,
550 enable, true);
551}
552
553int mt7925_mcu_uni_rx_ba(struct mt792x_dev *dev,
554 struct ieee80211_ampdu_params *params,
555 bool enable)
556{
557 struct mt792x_sta *msta = (struct mt792x_sta *)params->sta->drv_priv;
558 struct mt792x_vif *mvif = msta->vif;
559
560 return mt7925_mcu_sta_ba(&dev->mt76, &mvif->mt76, params,
561 enable, false);
562}
563
564static int mt7925_load_clc(struct mt792x_dev *dev, const char *fw_name)
565{
566 const struct mt76_connac2_fw_trailer *hdr;
567 const struct mt76_connac2_fw_region *region;
568 const struct mt7925_clc *clc;
569 struct mt76_dev *mdev = &dev->mt76;
570 struct mt792x_phy *phy = &dev->phy;
571 const struct firmware *fw;
572 int ret, i, len, offset = 0;
573 u8 *clc_base = NULL;
574
575 if (mt7925_disable_clc ||
576 mt76_is_usb(&dev->mt76))
577 return 0;
578
579 ret = request_firmware(&fw, fw_name, mdev->dev);
580 if (ret)
581 return ret;
582
583 if (!fw || !fw->data || fw->size < sizeof(*hdr)) {
584 dev_err(mdev->dev, "Invalid firmware\n");
585 ret = -EINVAL;
586 goto out;
587 }
588
589 hdr = (const void *)(fw->data + fw->size - sizeof(*hdr));
590 for (i = 0; i < hdr->n_region; i++) {
591 region = (const void *)((const u8 *)hdr -
592 (hdr->n_region - i) * sizeof(*region));
593 len = le32_to_cpu(region->len);
594
595 /* check if we have valid buffer size */
596 if (offset + len > fw->size) {
597 dev_err(mdev->dev, "Invalid firmware region\n");
598 ret = -EINVAL;
599 goto out;
600 }
601
602 if ((region->feature_set & FW_FEATURE_NON_DL) &&
603 region->type == FW_TYPE_CLC) {
604 clc_base = (u8 *)(fw->data + offset);
605 break;
606 }
607 offset += len;
608 }
609
610 if (!clc_base)
611 goto out;
612
613 for (offset = 0; offset < len; offset += le32_to_cpu(clc->len)) {
614 clc = (const struct mt7925_clc *)(clc_base + offset);
615
616 /* do not init buf again if chip reset triggered */
617 if (phy->clc[clc->idx])
618 continue;
619
620 phy->clc[clc->idx] = devm_kmemdup(mdev->dev, clc,
621 le32_to_cpu(clc->len),
622 GFP_KERNEL);
623
624 if (!phy->clc[clc->idx]) {
625 ret = -ENOMEM;
626 goto out;
627 }
628 }
629
630 ret = mt7925_mcu_set_clc(dev, "00", ENVIRON_INDOOR);
631out:
632 release_firmware(fw);
633
634 return ret;
635}
636
637int mt7925_mcu_fw_log_2_host(struct mt792x_dev *dev, u8 ctrl)
638{
639 struct {
640 u8 _rsv[4];
641
642 __le16 tag;
643 __le16 len;
644 u8 ctrl;
645 u8 interval;
646 u8 _rsv2[2];
647 } __packed req = {
648 .tag = cpu_to_le16(UNI_WSYS_CONFIG_FW_LOG_CTRL),
649 .len = cpu_to_le16(sizeof(req) - 4),
650 .ctrl = ctrl,
651 };
652 int ret;
653
654 ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_UNI_CMD(WSYS_CONFIG),
655 &req, sizeof(req), false, NULL);
656 return ret;
657}
658
659static void
660mt7925_mcu_parse_phy_cap(struct mt792x_dev *dev, char *data)
661{
662 struct mt76_phy *mphy = &dev->mt76.phy;
663 struct mt76_dev *mdev = mphy->dev;
664 struct mt7925_mcu_phy_cap {
665 u8 ht;
666 u8 vht;
667 u8 _5g;
668 u8 max_bw;
669 u8 nss;
670 u8 dbdc;
671 u8 tx_ldpc;
672 u8 rx_ldpc;
673 u8 tx_stbc;
674 u8 rx_stbc;
675 u8 hw_path;
676 u8 he;
677 u8 eht;
678 } __packed * cap;
679 enum {
680 WF0_24G,
681 WF0_5G
682 };
683
684 cap = (struct mt7925_mcu_phy_cap *)data;
685
686 mdev->phy.antenna_mask = BIT(cap->nss) - 1;
687 mdev->phy.chainmask = mdev->phy.antenna_mask;
688 mdev->phy.cap.has_2ghz = cap->hw_path & BIT(WF0_24G);
689 mdev->phy.cap.has_5ghz = cap->hw_path & BIT(WF0_5G);
690 dev->has_eht = cap->eht;
691}
692
693static int
694mt7925_mcu_get_nic_capability(struct mt792x_dev *dev)
695{
696 struct mt76_phy *mphy = &dev->mt76.phy;
697 struct {
698 u8 _rsv[4];
699
700 __le16 tag;
701 __le16 len;
702 } __packed req = {
703 .tag = cpu_to_le16(UNI_CHIP_CONFIG_NIC_CAPA),
704 .len = cpu_to_le16(sizeof(req) - 4),
705 };
706 struct mt76_connac_cap_hdr {
707 __le16 n_element;
708 u8 rsv[2];
709 } __packed * hdr;
710 struct sk_buff *skb;
711 int ret, i;
712
713 ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_UNI_CMD(CHIP_CONFIG),
714 &req, sizeof(req), true, &skb);
715 if (ret)
716 return ret;
717
718 hdr = (struct mt76_connac_cap_hdr *)skb->data;
719 if (skb->len < sizeof(*hdr)) {
720 ret = -EINVAL;
721 goto out;
722 }
723
724 skb_pull(skb, sizeof(*hdr));
725
726 for (i = 0; i < le16_to_cpu(hdr->n_element); i++) {
727 struct tlv *tlv = (struct tlv *)skb->data;
728 int len;
729
730 if (skb->len < sizeof(*tlv))
731 break;
732
733 len = le16_to_cpu(tlv->len);
734 if (skb->len < len)
735 break;
736
737 switch (le16_to_cpu(tlv->tag)) {
738 case MT_NIC_CAP_6G:
739 mphy->cap.has_6ghz = !!tlv->data[0];
740 break;
741 case MT_NIC_CAP_MAC_ADDR:
742 memcpy(mphy->macaddr, (void *)tlv->data, ETH_ALEN);
743 break;
744 case MT_NIC_CAP_PHY:
745 mt7925_mcu_parse_phy_cap(dev, tlv->data);
746 break;
747 default:
748 break;
749 }
750 skb_pull(skb, len);
751 }
752out:
753 dev_kfree_skb(skb);
754 return ret;
755}
756
757int mt7925_mcu_chip_config(struct mt792x_dev *dev, const char *cmd)
758{
759 u16 len = strlen(cmd) + 1;
760 struct {
761 u8 _rsv[4];
762 __le16 tag;
763 __le16 len;
764 struct mt76_connac_config config;
765 } __packed req = {
766 .tag = cpu_to_le16(UNI_CHIP_CONFIG_CHIP_CFG),
767 .len = cpu_to_le16(sizeof(req) - 4),
768 .config = {
769 .resp_type = 0,
770 .type = 0,
771 .data_size = cpu_to_le16(len),
772 },
773 };
774
775 memcpy(req.config.data, cmd, len);
776
777 return mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD(CHIP_CONFIG),
778 &req, sizeof(req), false);
779}
780
781int mt7925_mcu_set_deep_sleep(struct mt792x_dev *dev, bool enable)
782{
783 char cmd[16];
784
785 snprintf(cmd, sizeof(cmd), "KeepFullPwr %d", !enable);
786
787 return mt7925_mcu_chip_config(dev, cmd);
788}
789EXPORT_SYMBOL_GPL(mt7925_mcu_set_deep_sleep);
790
791int mt7925_run_firmware(struct mt792x_dev *dev)
792{
793 int err;
794
795 err = mt792x_load_firmware(dev);
796 if (err)
797 return err;
798
799 err = mt7925_mcu_get_nic_capability(dev);
800 if (err)
801 return err;
802
803 set_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state);
804 err = mt7925_load_clc(dev, mt792x_ram_name(dev));
805 if (err)
806 return err;
807
808 return mt7925_mcu_fw_log_2_host(dev, 1);
809}
810EXPORT_SYMBOL_GPL(mt7925_run_firmware);
811
812static void
813mt7925_mcu_sta_hdr_trans_tlv(struct sk_buff *skb,
814 struct ieee80211_vif *vif,
815 struct ieee80211_sta *sta)
816{
817 struct sta_rec_hdr_trans *hdr_trans;
818 struct mt76_wcid *wcid;
819 struct tlv *tlv;
820
821 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_HDR_TRANS, sizeof(*hdr_trans));
822 hdr_trans = (struct sta_rec_hdr_trans *)tlv;
823 hdr_trans->dis_rx_hdr_tran = true;
824
825 if (vif->type == NL80211_IFTYPE_STATION)
826 hdr_trans->to_ds = true;
827 else
828 hdr_trans->from_ds = true;
829
830 wcid = (struct mt76_wcid *)sta->drv_priv;
831 if (!wcid)
832 return;
833
834 hdr_trans->dis_rx_hdr_tran = !test_bit(MT_WCID_FLAG_HDR_TRANS, &wcid->flags);
835 if (test_bit(MT_WCID_FLAG_4ADDR, &wcid->flags)) {
836 hdr_trans->to_ds = true;
837 hdr_trans->from_ds = true;
838 }
839}
840
841int mt7925_mcu_wtbl_update_hdr_trans(struct mt792x_dev *dev,
842 struct ieee80211_vif *vif,
843 struct ieee80211_sta *sta)
844{
845 struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
846 struct mt792x_sta *msta;
847 struct sk_buff *skb;
848
849 msta = sta ? (struct mt792x_sta *)sta->drv_priv : &mvif->sta;
850
851 skb = __mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
852 &msta->wcid,
853 MT7925_STA_UPDATE_MAX_SIZE);
854 if (IS_ERR(skb))
855 return PTR_ERR(skb);
856
857 /* starec hdr trans */
858 mt7925_mcu_sta_hdr_trans_tlv(skb, vif, sta);
859 return mt76_mcu_skb_send_msg(&dev->mt76, skb,
860 MCU_WMWA_UNI_CMD(STA_REC_UPDATE), true);
861}
862
863int mt7925_mcu_set_tx(struct mt792x_dev *dev, struct ieee80211_vif *vif)
864{
865#define MCU_EDCA_AC_PARAM 0
866#define WMM_AIFS_SET BIT(0)
867#define WMM_CW_MIN_SET BIT(1)
868#define WMM_CW_MAX_SET BIT(2)
869#define WMM_TXOP_SET BIT(3)
870#define WMM_PARAM_SET (WMM_AIFS_SET | WMM_CW_MIN_SET | \
871 WMM_CW_MAX_SET | WMM_TXOP_SET)
872 struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
873 struct {
874 u8 bss_idx;
875 u8 __rsv[3];
876 } __packed hdr = {
877 .bss_idx = mvif->mt76.idx,
878 };
879 struct sk_buff *skb;
880 int len = sizeof(hdr) + IEEE80211_NUM_ACS * sizeof(struct edca);
881 int ac;
882
883 skb = mt76_mcu_msg_alloc(&dev->mt76, NULL, len);
884 if (!skb)
885 return -ENOMEM;
886
887 skb_put_data(skb, &hdr, sizeof(hdr));
888
889 for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
890 struct ieee80211_tx_queue_params *q = &mvif->queue_params[ac];
891 struct edca *e;
892 struct tlv *tlv;
893
894 tlv = mt76_connac_mcu_add_tlv(skb, MCU_EDCA_AC_PARAM, sizeof(*e));
895
896 e = (struct edca *)tlv;
897 e->set = WMM_PARAM_SET;
898 e->queue = ac + mvif->mt76.wmm_idx * MT76_CONNAC_MAX_WMM_SETS;
899 e->aifs = q->aifs;
900 e->txop = cpu_to_le16(q->txop);
901
902 if (q->cw_min)
903 e->cw_min = fls(q->cw_min);
904 else
905 e->cw_min = 5;
906
907 if (q->cw_max)
908 e->cw_max = fls(q->cw_max);
909 else
910 e->cw_max = 10;
911 }
912
913 return mt76_mcu_skb_send_msg(&dev->mt76, skb,
914 MCU_UNI_CMD(EDCA_UPDATE), true);
915}
916
917static int
918mt7925_mcu_sta_key_tlv(struct mt76_wcid *wcid,
919 struct mt76_connac_sta_key_conf *sta_key_conf,
920 struct sk_buff *skb,
921 struct ieee80211_key_conf *key,
922 enum set_key_cmd cmd)
923{
924 struct sta_rec_sec_uni *sec;
925 struct tlv *tlv;
926
927 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_KEY_V2, sizeof(*sec));
928 sec = (struct sta_rec_sec_uni *)tlv;
929 sec->add = cmd;
930
931 if (cmd == SET_KEY) {
932 struct sec_key_uni *sec_key;
933 u8 cipher;
934
935 cipher = mt76_connac_mcu_get_cipher(key->cipher);
936 if (cipher == MCU_CIPHER_NONE)
937 return -EOPNOTSUPP;
938
939 sec_key = &sec->key[0];
940 sec_key->cipher_len = sizeof(*sec_key);
941
942 if (cipher == MCU_CIPHER_BIP_CMAC_128) {
943 sec_key->wlan_idx = cpu_to_le16(wcid->idx);
944 sec_key->cipher_id = MCU_CIPHER_AES_CCMP;
945 sec_key->key_id = sta_key_conf->keyidx;
946 sec_key->key_len = 16;
947 memcpy(sec_key->key, sta_key_conf->key, 16);
948
949 sec_key = &sec->key[1];
950 sec_key->wlan_idx = cpu_to_le16(wcid->idx);
951 sec_key->cipher_id = MCU_CIPHER_BIP_CMAC_128;
952 sec_key->cipher_len = sizeof(*sec_key);
953 sec_key->key_len = 16;
954 memcpy(sec_key->key, key->key, 16);
955 sec->n_cipher = 2;
956 } else {
957 sec_key->wlan_idx = cpu_to_le16(wcid->idx);
958 sec_key->cipher_id = cipher;
959 sec_key->key_id = key->keyidx;
960 sec_key->key_len = key->keylen;
961 memcpy(sec_key->key, key->key, key->keylen);
962
963 if (cipher == MCU_CIPHER_TKIP) {
964 /* Rx/Tx MIC keys are swapped */
965 memcpy(sec_key->key + 16, key->key + 24, 8);
966 memcpy(sec_key->key + 24, key->key + 16, 8);
967 }
968
969 /* store key_conf for BIP batch update */
970 if (cipher == MCU_CIPHER_AES_CCMP) {
971 memcpy(sta_key_conf->key, key->key, key->keylen);
972 sta_key_conf->keyidx = key->keyidx;
973 }
974
975 sec->n_cipher = 1;
976 }
977 } else {
978 sec->n_cipher = 0;
979 }
980
981 return 0;
982}
983
984int mt7925_mcu_add_key(struct mt76_dev *dev, struct ieee80211_vif *vif,
985 struct mt76_connac_sta_key_conf *sta_key_conf,
986 struct ieee80211_key_conf *key, int mcu_cmd,
987 struct mt76_wcid *wcid, enum set_key_cmd cmd)
988{
989 struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
990 struct sk_buff *skb;
991 int ret;
992
993 skb = __mt76_connac_mcu_alloc_sta_req(dev, mvif, wcid,
994 MT7925_STA_UPDATE_MAX_SIZE);
995 if (IS_ERR(skb))
996 return PTR_ERR(skb);
997
998 ret = mt7925_mcu_sta_key_tlv(wcid, sta_key_conf, skb, key, cmd);
999 if (ret)
1000 return ret;
1001
1002 return mt76_mcu_skb_send_msg(dev, skb, mcu_cmd, true);
1003}
1004
1005int mt7925_mcu_set_roc(struct mt792x_phy *phy, struct mt792x_vif *vif,
1006 struct ieee80211_channel *chan, int duration,
1007 enum mt7925_roc_req type, u8 token_id)
1008{
1009 int center_ch = ieee80211_frequency_to_channel(chan->center_freq);
1010 struct mt792x_dev *dev = phy->dev;
1011 struct {
1012 struct {
1013 u8 rsv[4];
1014 } __packed hdr;
1015 struct roc_acquire_tlv {
1016 __le16 tag;
1017 __le16 len;
1018 u8 bss_idx;
1019 u8 tokenid;
1020 u8 control_channel;
1021 u8 sco;
1022 u8 band;
1023 u8 bw;
1024 u8 center_chan;
1025 u8 center_chan2;
1026 u8 bw_from_ap;
1027 u8 center_chan_from_ap;
1028 u8 center_chan2_from_ap;
1029 u8 reqtype;
1030 __le32 maxinterval;
1031 u8 dbdcband;
1032 u8 rsv[3];
1033 } __packed roc;
1034 } __packed req = {
1035 .roc = {
1036 .tag = cpu_to_le16(UNI_ROC_ACQUIRE),
1037 .len = cpu_to_le16(sizeof(struct roc_acquire_tlv)),
1038 .tokenid = token_id,
1039 .reqtype = type,
1040 .maxinterval = cpu_to_le32(duration),
1041 .bss_idx = vif->mt76.idx,
1042 .control_channel = chan->hw_value,
1043 .bw = CMD_CBW_20MHZ,
1044 .bw_from_ap = CMD_CBW_20MHZ,
1045 .center_chan = center_ch,
1046 .center_chan_from_ap = center_ch,
1047 .dbdcband = 0xff, /* auto */
1048 },
1049 };
1050
1051 if (chan->hw_value < center_ch)
1052 req.roc.sco = 1; /* SCA */
1053 else if (chan->hw_value > center_ch)
1054 req.roc.sco = 3; /* SCB */
1055
1056 switch (chan->band) {
1057 case NL80211_BAND_6GHZ:
1058 req.roc.band = 3;
1059 break;
1060 case NL80211_BAND_5GHZ:
1061 req.roc.band = 2;
1062 break;
1063 default:
1064 req.roc.band = 1;
1065 break;
1066 }
1067
1068 return mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD(ROC),
1069 &req, sizeof(req), false);
1070}
1071
1072int mt7925_mcu_abort_roc(struct mt792x_phy *phy, struct mt792x_vif *vif,
1073 u8 token_id)
1074{
1075 struct mt792x_dev *dev = phy->dev;
1076 struct {
1077 struct {
1078 u8 rsv[4];
1079 } __packed hdr;
1080 struct roc_abort_tlv {
1081 __le16 tag;
1082 __le16 len;
1083 u8 bss_idx;
1084 u8 tokenid;
1085 u8 dbdcband;
1086 u8 rsv[5];
1087 } __packed abort;
1088 } __packed req = {
1089 .abort = {
1090 .tag = cpu_to_le16(UNI_ROC_ABORT),
1091 .len = cpu_to_le16(sizeof(struct roc_abort_tlv)),
1092 .tokenid = token_id,
1093 .bss_idx = vif->mt76.idx,
1094 .dbdcband = 0xff, /* auto*/
1095 },
1096 };
1097
1098 return mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD(ROC),
1099 &req, sizeof(req), false);
1100}
1101
1102int mt7925_mcu_set_chan_info(struct mt792x_phy *phy, u16 tag)
1103{
1104 static const u8 ch_band[] = {
1105 [NL80211_BAND_2GHZ] = 0,
1106 [NL80211_BAND_5GHZ] = 1,
1107 [NL80211_BAND_6GHZ] = 2,
1108 };
1109 struct mt792x_dev *dev = phy->dev;
1110 struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
1111 int freq1 = chandef->center_freq1;
1112 u8 band_idx = chandef->chan->band != NL80211_BAND_2GHZ;
1113 struct {
1114 /* fixed field */
1115 u8 __rsv[4];
1116
1117 __le16 tag;
1118 __le16 len;
1119 u8 control_ch;
1120 u8 center_ch;
1121 u8 bw;
1122 u8 tx_path_num;
1123 u8 rx_path; /* mask or num */
1124 u8 switch_reason;
1125 u8 band_idx;
1126 u8 center_ch2; /* for 80+80 only */
1127 __le16 cac_case;
1128 u8 channel_band;
1129 u8 rsv0;
1130 __le32 outband_freq;
1131 u8 txpower_drop;
1132 u8 ap_bw;
1133 u8 ap_center_ch;
1134 u8 rsv1[53];
1135 } __packed req = {
1136 .tag = cpu_to_le16(tag),
1137 .len = cpu_to_le16(sizeof(req) - 4),
1138 .control_ch = chandef->chan->hw_value,
1139 .center_ch = ieee80211_frequency_to_channel(freq1),
1140 .bw = mt76_connac_chan_bw(chandef),
1141 .tx_path_num = hweight8(phy->mt76->antenna_mask),
1142 .rx_path = phy->mt76->antenna_mask,
1143 .band_idx = band_idx,
1144 .channel_band = ch_band[chandef->chan->band],
1145 };
1146
1147 if (chandef->chan->band == NL80211_BAND_6GHZ)
1148 req.channel_band = 2;
1149 else
1150 req.channel_band = chandef->chan->band;
1151
1152 if (tag == UNI_CHANNEL_RX_PATH ||
1153 dev->mt76.hw->conf.flags & IEEE80211_CONF_MONITOR)
1154 req.switch_reason = CH_SWITCH_NORMAL;
1155 else if (phy->mt76->hw->conf.flags & IEEE80211_CONF_OFFCHANNEL)
1156 req.switch_reason = CH_SWITCH_SCAN_BYPASS_DPD;
1157 else if (!cfg80211_reg_can_beacon(phy->mt76->hw->wiphy, chandef,
1158 NL80211_IFTYPE_AP))
1159 req.switch_reason = CH_SWITCH_DFS;
1160 else
1161 req.switch_reason = CH_SWITCH_NORMAL;
1162
1163 if (tag == UNI_CHANNEL_SWITCH)
1164 req.rx_path = hweight8(req.rx_path);
1165
1166 if (chandef->width == NL80211_CHAN_WIDTH_80P80) {
1167 int freq2 = chandef->center_freq2;
1168
1169 req.center_ch2 = ieee80211_frequency_to_channel(freq2);
1170 }
1171
1172 return mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD(CHANNEL_SWITCH),
1173 &req, sizeof(req), true);
1174}
1175
1176int mt7925_mcu_set_eeprom(struct mt792x_dev *dev)
1177{
1178 struct {
1179 u8 _rsv[4];
1180
1181 __le16 tag;
1182 __le16 len;
1183 u8 buffer_mode;
1184 u8 format;
1185 __le16 buf_len;
1186 } __packed req = {
1187 .tag = cpu_to_le16(UNI_EFUSE_BUFFER_MODE),
1188 .len = cpu_to_le16(sizeof(req) - 4),
1189 .buffer_mode = EE_MODE_EFUSE,
1190 .format = EE_FORMAT_WHOLE
1191 };
1192
1193 return mt76_mcu_send_and_get_msg(&dev->mt76, MCU_UNI_CMD(EFUSE_CTRL),
1194 &req, sizeof(req), false, NULL);
1195}
1196EXPORT_SYMBOL_GPL(mt7925_mcu_set_eeprom);
1197
1198int mt7925_mcu_uni_bss_ps(struct mt792x_dev *dev, struct ieee80211_vif *vif)
1199{
1200 struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
1201 struct {
1202 struct {
1203 u8 bss_idx;
1204 u8 pad[3];
1205 } __packed hdr;
1206 struct ps_tlv {
1207 __le16 tag;
1208 __le16 len;
1209 u8 ps_state; /* 0: device awake
1210 * 1: static power save
1211 * 2: dynamic power saving
1212 * 3: enter TWT power saving
1213 * 4: leave TWT power saving
1214 */
1215 u8 pad[3];
1216 } __packed ps;
1217 } __packed ps_req = {
1218 .hdr = {
1219 .bss_idx = mvif->mt76.idx,
1220 },
1221 .ps = {
1222 .tag = cpu_to_le16(UNI_BSS_INFO_PS),
1223 .len = cpu_to_le16(sizeof(struct ps_tlv)),
1224 .ps_state = vif->cfg.ps ? 2 : 0,
1225 },
1226 };
1227
1228 if (vif->type != NL80211_IFTYPE_STATION)
1229 return -EOPNOTSUPP;
1230
1231 return mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD(BSS_INFO_UPDATE),
1232 &ps_req, sizeof(ps_req), true);
1233}
1234
1235static int
1236mt7925_mcu_uni_bss_bcnft(struct mt792x_dev *dev, struct ieee80211_vif *vif,
1237 bool enable)
1238{
1239 struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
1240 struct {
1241 struct {
1242 u8 bss_idx;
1243 u8 pad[3];
1244 } __packed hdr;
1245 struct bcnft_tlv {
1246 __le16 tag;
1247 __le16 len;
1248 __le16 bcn_interval;
1249 u8 dtim_period;
1250 u8 bmc_delivered_ac;
1251 u8 bmc_triggered_ac;
1252 u8 pad[3];
1253 } __packed bcnft;
1254 } __packed bcnft_req = {
1255 .hdr = {
1256 .bss_idx = mvif->mt76.idx,
1257 },
1258 .bcnft = {
1259 .tag = cpu_to_le16(UNI_BSS_INFO_BCNFT),
1260 .len = cpu_to_le16(sizeof(struct bcnft_tlv)),
1261 .bcn_interval = cpu_to_le16(vif->bss_conf.beacon_int),
1262 .dtim_period = vif->bss_conf.dtim_period,
1263 },
1264 };
1265
1266 if (vif->type != NL80211_IFTYPE_STATION)
1267 return 0;
1268
1269 return mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD(BSS_INFO_UPDATE),
1270 &bcnft_req, sizeof(bcnft_req), true);
1271}
1272
1273int
1274mt7925_mcu_set_bss_pm(struct mt792x_dev *dev, struct ieee80211_vif *vif,
1275 bool enable)
1276{
1277 struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
1278 struct {
1279 struct {
1280 u8 bss_idx;
1281 u8 pad[3];
1282 } __packed hdr;
1283 struct bcnft_tlv {
1284 __le16 tag;
1285 __le16 len;
1286 __le16 bcn_interval;
1287 u8 dtim_period;
1288 u8 bmc_delivered_ac;
1289 u8 bmc_triggered_ac;
1290 u8 pad[3];
1291 } __packed enable;
1292 } req = {
1293 .hdr = {
1294 .bss_idx = mvif->mt76.idx,
1295 },
1296 .enable = {
1297 .tag = cpu_to_le16(UNI_BSS_INFO_BCNFT),
1298 .len = cpu_to_le16(sizeof(struct bcnft_tlv)),
1299 .dtim_period = vif->bss_conf.dtim_period,
1300 .bcn_interval = cpu_to_le16(vif->bss_conf.beacon_int),
1301 },
1302 };
1303 struct {
1304 struct {
1305 u8 bss_idx;
1306 u8 pad[3];
1307 } __packed hdr;
1308 struct pm_disable {
1309 __le16 tag;
1310 __le16 len;
1311 } __packed disable;
1312 } req1 = {
1313 .hdr = {
1314 .bss_idx = mvif->mt76.idx,
1315 },
1316 .disable = {
1317 .tag = cpu_to_le16(UNI_BSS_INFO_PM_DISABLE),
1318 .len = cpu_to_le16(sizeof(struct pm_disable))
1319 },
1320 };
1321 int err;
1322
1323 err = mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD(BSS_INFO_UPDATE),
1324 &req1, sizeof(req1), false);
1325 if (err < 0 || !enable)
1326 return err;
1327
1328 return mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD(BSS_INFO_UPDATE),
1329 &req, sizeof(req), false);
1330}
1331
1332static void
1333mt7925_mcu_sta_he_tlv(struct sk_buff *skb, struct ieee80211_sta *sta)
1334{
1335 if (!sta->deflink.he_cap.has_he)
1336 return;
1337
1338 mt76_connac_mcu_sta_he_tlv_v2(skb, sta);
1339}
1340
1341static void
1342mt7925_mcu_sta_he_6g_tlv(struct sk_buff *skb, struct ieee80211_sta *sta)
1343{
1344 struct sta_rec_he_6g_capa *he_6g;
1345 struct tlv *tlv;
1346
1347 if (!sta->deflink.he_6ghz_capa.capa)
1348 return;
1349
1350 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_HE_6G, sizeof(*he_6g));
1351
1352 he_6g = (struct sta_rec_he_6g_capa *)tlv;
1353 he_6g->capa = sta->deflink.he_6ghz_capa.capa;
1354}
1355
1356static void
1357mt7925_mcu_sta_eht_tlv(struct sk_buff *skb, struct ieee80211_sta *sta)
1358{
1359 struct ieee80211_eht_mcs_nss_supp *mcs_map;
1360 struct ieee80211_eht_cap_elem_fixed *elem;
1361 struct sta_rec_eht *eht;
1362 struct tlv *tlv;
1363
1364 if (!sta->deflink.eht_cap.has_eht)
1365 return;
1366
1367 mcs_map = &sta->deflink.eht_cap.eht_mcs_nss_supp;
1368 elem = &sta->deflink.eht_cap.eht_cap_elem;
1369
1370 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_EHT, sizeof(*eht));
1371
1372 eht = (struct sta_rec_eht *)tlv;
1373 eht->tid_bitmap = 0xff;
1374 eht->mac_cap = cpu_to_le16(*(u16 *)elem->mac_cap_info);
1375 eht->phy_cap = cpu_to_le64(*(u64 *)elem->phy_cap_info);
1376 eht->phy_cap_ext = cpu_to_le64(elem->phy_cap_info[8]);
1377
1378 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_20)
1379 memcpy(eht->mcs_map_bw20, &mcs_map->only_20mhz, sizeof(eht->mcs_map_bw20));
1380 memcpy(eht->mcs_map_bw80, &mcs_map->bw._80, sizeof(eht->mcs_map_bw80));
1381 memcpy(eht->mcs_map_bw160, &mcs_map->bw._160, sizeof(eht->mcs_map_bw160));
1382}
1383
1384static void
1385mt7925_mcu_sta_ht_tlv(struct sk_buff *skb, struct ieee80211_sta *sta)
1386{
1387 struct sta_rec_ht *ht;
1388 struct tlv *tlv;
1389
1390 if (!sta->deflink.ht_cap.ht_supported)
1391 return;
1392
1393 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_HT, sizeof(*ht));
1394
1395 ht = (struct sta_rec_ht *)tlv;
1396 ht->ht_cap = cpu_to_le16(sta->deflink.ht_cap.cap);
1397}
1398
1399static void
1400mt7925_mcu_sta_vht_tlv(struct sk_buff *skb, struct ieee80211_sta *sta)
1401{
1402 struct sta_rec_vht *vht;
1403 struct tlv *tlv;
1404
1405 /* For 6G band, this tlv is necessary to let hw work normally */
1406 if (!sta->deflink.he_6ghz_capa.capa && !sta->deflink.vht_cap.vht_supported)
1407 return;
1408
1409 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_VHT, sizeof(*vht));
1410
1411 vht = (struct sta_rec_vht *)tlv;
1412 vht->vht_cap = cpu_to_le32(sta->deflink.vht_cap.cap);
1413 vht->vht_rx_mcs_map = sta->deflink.vht_cap.vht_mcs.rx_mcs_map;
1414 vht->vht_tx_mcs_map = sta->deflink.vht_cap.vht_mcs.tx_mcs_map;
1415}
1416
1417static void
1418mt7925_mcu_sta_amsdu_tlv(struct sk_buff *skb,
1419 struct ieee80211_vif *vif, struct ieee80211_sta *sta)
1420{
1421 struct mt792x_sta *msta = (struct mt792x_sta *)sta->drv_priv;
1422 struct sta_rec_amsdu *amsdu;
1423 struct tlv *tlv;
1424
1425 if (vif->type != NL80211_IFTYPE_STATION &&
1426 vif->type != NL80211_IFTYPE_AP)
1427 return;
1428
1429 if (!sta->deflink.agg.max_amsdu_len)
1430 return;
1431
1432 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_HW_AMSDU, sizeof(*amsdu));
1433 amsdu = (struct sta_rec_amsdu *)tlv;
1434 amsdu->max_amsdu_num = 8;
1435 amsdu->amsdu_en = true;
1436 msta->wcid.amsdu = true;
1437
1438 switch (sta->deflink.agg.max_amsdu_len) {
1439 case IEEE80211_MAX_MPDU_LEN_VHT_11454:
1440 amsdu->max_mpdu_size =
1441 IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454;
1442 return;
1443 case IEEE80211_MAX_MPDU_LEN_HT_7935:
1444 case IEEE80211_MAX_MPDU_LEN_VHT_7991:
1445 amsdu->max_mpdu_size = IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_7991;
1446 return;
1447 default:
1448 amsdu->max_mpdu_size = IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_3895;
1449 return;
1450 }
1451}
1452
1453static void
1454mt7925_mcu_sta_phy_tlv(struct sk_buff *skb,
1455 struct ieee80211_vif *vif, struct ieee80211_sta *sta)
1456{
1457 struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
1458 struct cfg80211_chan_def *chandef = &mvif->mt76.ctx->def;
1459 struct sta_rec_phy *phy;
1460 struct tlv *tlv;
1461 u8 af = 0, mm = 0;
1462
1463 if (!sta->deflink.ht_cap.ht_supported && !sta->deflink.he_6ghz_capa.capa)
1464 return;
1465
1466 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_PHY, sizeof(*phy));
1467 phy = (struct sta_rec_phy *)tlv;
1468 phy->phy_type = mt76_connac_get_phy_mode_v2(mvif->phy->mt76, vif, chandef->chan->band, sta);
1469 if (sta->deflink.ht_cap.ht_supported) {
1470 af = sta->deflink.ht_cap.ampdu_factor;
1471 mm = sta->deflink.ht_cap.ampdu_density;
1472 }
1473
1474 if (sta->deflink.vht_cap.vht_supported) {
1475 u8 vht_af = FIELD_GET(IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK,
1476 sta->deflink.vht_cap.cap);
1477
1478 af = max_t(u8, af, vht_af);
1479 }
1480
1481 if (sta->deflink.he_6ghz_capa.capa) {
1482 af = le16_get_bits(sta->deflink.he_6ghz_capa.capa,
1483 IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP);
1484 mm = le16_get_bits(sta->deflink.he_6ghz_capa.capa,
1485 IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START);
1486 }
1487
1488 phy->ampdu = FIELD_PREP(IEEE80211_HT_AMPDU_PARM_FACTOR, af) |
1489 FIELD_PREP(IEEE80211_HT_AMPDU_PARM_DENSITY, mm);
1490 phy->max_ampdu_len = af;
1491}
1492
1493static void
1494mt7925_mcu_sta_state_v2_tlv(struct mt76_phy *mphy, struct sk_buff *skb,
1495 struct ieee80211_sta *sta,
1496 struct ieee80211_vif *vif,
1497 u8 rcpi, u8 sta_state)
1498{
1499 struct sta_rec_state_v2 {
1500 __le16 tag;
1501 __le16 len;
1502 u8 state;
1503 u8 rsv[3];
1504 __le32 flags;
1505 u8 vht_opmode;
1506 u8 action;
1507 u8 rsv2[2];
1508 } __packed * state;
1509 struct tlv *tlv;
1510
1511 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_STATE, sizeof(*state));
1512 state = (struct sta_rec_state_v2 *)tlv;
1513 state->state = sta_state;
1514
1515 if (sta->deflink.vht_cap.vht_supported) {
1516 state->vht_opmode = sta->deflink.bandwidth;
1517 state->vht_opmode |= sta->deflink.rx_nss <<
1518 IEEE80211_OPMODE_NOTIF_RX_NSS_SHIFT;
1519 }
1520}
1521
1522static void
1523mt7925_mcu_sta_rate_ctrl_tlv(struct sk_buff *skb,
1524 struct ieee80211_vif *vif, struct ieee80211_sta *sta)
1525{
1526 struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
1527 struct cfg80211_chan_def *chandef = &mvif->mt76.ctx->def;
1528 enum nl80211_band band = chandef->chan->band;
1529 struct sta_rec_ra_info *ra_info;
1530 struct tlv *tlv;
1531 u16 supp_rates;
1532
1533 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_RA, sizeof(*ra_info));
1534 ra_info = (struct sta_rec_ra_info *)tlv;
1535
1536 supp_rates = sta->deflink.supp_rates[band];
1537 if (band == NL80211_BAND_2GHZ)
1538 supp_rates = FIELD_PREP(RA_LEGACY_OFDM, supp_rates >> 4) |
1539 FIELD_PREP(RA_LEGACY_CCK, supp_rates & 0xf);
1540 else
1541 supp_rates = FIELD_PREP(RA_LEGACY_OFDM, supp_rates);
1542
1543 ra_info->legacy = cpu_to_le16(supp_rates);
1544
1545 if (sta->deflink.ht_cap.ht_supported)
1546 memcpy(ra_info->rx_mcs_bitmask,
1547 sta->deflink.ht_cap.mcs.rx_mask,
1548 HT_MCS_MASK_NUM);
1549}
1550
1551static void
1552mt7925_mcu_sta_mld_tlv(struct sk_buff *skb,
1553 struct ieee80211_vif *vif, struct ieee80211_sta *sta)
1554{
1555 struct mt76_wcid *wcid = (struct mt76_wcid *)sta->drv_priv;
1556 struct sta_rec_mld *mld;
1557 struct tlv *tlv;
1558
1559 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_MLD, sizeof(*mld));
1560 mld = (struct sta_rec_mld *)tlv;
1561 memcpy(mld->mac_addr, vif->addr, ETH_ALEN);
1562 mld->primary_id = cpu_to_le16(wcid->idx);
1563 mld->wlan_id = cpu_to_le16(wcid->idx);
1564
1565 /* TODO: 0 means deflink only, add secondary link(1) later */
1566 mld->link_num = !!(hweight8(vif->active_links) > 1);
1567 WARN_ON_ONCE(mld->link_num);
1568}
1569
1570static int
1571mt7925_mcu_sta_cmd(struct mt76_phy *phy,
1572 struct mt76_sta_cmd_info *info)
1573{
1574 struct mt76_vif *mvif = (struct mt76_vif *)info->vif->drv_priv;
1575 struct mt76_dev *dev = phy->dev;
1576 struct wtbl_req_hdr *wtbl_hdr;
1577 struct tlv *sta_wtbl;
1578 struct sk_buff *skb;
1579
1580 skb = __mt76_connac_mcu_alloc_sta_req(dev, mvif, info->wcid,
1581 MT7925_STA_UPDATE_MAX_SIZE);
1582 if (IS_ERR(skb))
1583 return PTR_ERR(skb);
1584
1585 if (info->sta || !info->offload_fw)
1586 mt76_connac_mcu_sta_basic_tlv(dev, skb, info->vif, info->sta,
1587 info->enable, info->newly);
1588 if (info->sta && info->enable) {
1589 mt7925_mcu_sta_phy_tlv(skb, info->vif, info->sta);
1590 mt7925_mcu_sta_ht_tlv(skb, info->sta);
1591 mt7925_mcu_sta_vht_tlv(skb, info->sta);
1592 mt76_connac_mcu_sta_uapsd(skb, info->vif, info->sta);
1593 mt7925_mcu_sta_amsdu_tlv(skb, info->vif, info->sta);
1594 mt7925_mcu_sta_he_tlv(skb, info->sta);
1595 mt7925_mcu_sta_he_6g_tlv(skb, info->sta);
1596 mt7925_mcu_sta_eht_tlv(skb, info->sta);
1597 mt7925_mcu_sta_rate_ctrl_tlv(skb, info->vif, info->sta);
1598 mt7925_mcu_sta_state_v2_tlv(phy, skb, info->sta,
1599 info->vif, info->rcpi,
1600 info->state);
1601 mt7925_mcu_sta_hdr_trans_tlv(skb, info->vif, info->sta);
1602 mt7925_mcu_sta_mld_tlv(skb, info->vif, info->sta);
1603 }
1604
1605 sta_wtbl = mt76_connac_mcu_add_tlv(skb, STA_REC_WTBL,
1606 sizeof(struct tlv));
1607
1608 wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(dev, info->wcid,
1609 WTBL_RESET_AND_SET,
1610 sta_wtbl, &skb);
1611 if (IS_ERR(wtbl_hdr))
1612 return PTR_ERR(wtbl_hdr);
1613
1614 if (info->enable) {
1615 mt76_connac_mcu_wtbl_generic_tlv(dev, skb, info->vif,
1616 info->sta, sta_wtbl,
1617 wtbl_hdr);
1618 mt76_connac_mcu_wtbl_hdr_trans_tlv(skb, info->vif, info->wcid,
1619 sta_wtbl, wtbl_hdr);
1620 if (info->sta)
1621 mt76_connac_mcu_wtbl_ht_tlv(dev, skb, info->sta,
1622 sta_wtbl, wtbl_hdr,
1623 true, true);
1624 }
1625
1626 return mt76_mcu_skb_send_msg(dev, skb, info->cmd, true);
1627}
1628
1629int mt7925_mcu_sta_update(struct mt792x_dev *dev, struct ieee80211_sta *sta,
1630 struct ieee80211_vif *vif, bool enable,
1631 enum mt76_sta_info_state state)
1632{
1633 struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
1634 int rssi = -ewma_rssi_read(&mvif->rssi);
1635 struct mt76_sta_cmd_info info = {
1636 .sta = sta,
1637 .vif = vif,
1638 .enable = enable,
1639 .cmd = MCU_UNI_CMD(STA_REC_UPDATE),
1640 .state = state,
1641 .offload_fw = true,
1642 .rcpi = to_rcpi(rssi),
1643 };
1644 struct mt792x_sta *msta;
1645
1646 msta = sta ? (struct mt792x_sta *)sta->drv_priv : NULL;
1647 info.wcid = msta ? &msta->wcid : &mvif->sta.wcid;
1648 info.newly = msta ? state != MT76_STA_INFO_STATE_ASSOC : true;
1649
1650 return mt7925_mcu_sta_cmd(&dev->mphy, &info);
1651}
1652
1653int mt7925_mcu_set_beacon_filter(struct mt792x_dev *dev,
1654 struct ieee80211_vif *vif,
1655 bool enable)
1656{
1657#define MT7925_FIF_BIT_CLR BIT(1)
1658#define MT7925_FIF_BIT_SET BIT(0)
1659 int err = 0;
1660
1661 if (enable) {
1662 err = mt7925_mcu_uni_bss_bcnft(dev, vif, true);
1663 if (err)
1664 return err;
1665
1666 return mt7925_mcu_set_rxfilter(dev, 0,
1667 MT7925_FIF_BIT_SET,
1668 MT_WF_RFCR_DROP_OTHER_BEACON);
1669 }
1670
1671 err = mt7925_mcu_set_bss_pm(dev, vif, false);
1672 if (err)
1673 return err;
1674
1675 return mt7925_mcu_set_rxfilter(dev, 0,
1676 MT7925_FIF_BIT_CLR,
1677 MT_WF_RFCR_DROP_OTHER_BEACON);
1678}
1679
1680int mt7925_get_txpwr_info(struct mt792x_dev *dev, u8 band_idx, struct mt7925_txpwr *txpwr)
1681{
1682#define TX_POWER_SHOW_INFO 0x7
1683#define TXPOWER_ALL_RATE_POWER_INFO 0x2
1684 struct mt7925_txpwr_event *event;
1685 struct mt7925_txpwr_req req = {
1686 .tag = cpu_to_le16(TX_POWER_SHOW_INFO),
1687 .len = cpu_to_le16(sizeof(req) - 4),
1688 .catg = TXPOWER_ALL_RATE_POWER_INFO,
1689 .band_idx = band_idx,
1690 };
1691 struct sk_buff *skb;
1692 int ret;
1693
1694 ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_UNI_CMD(TXPOWER),
1695 &req, sizeof(req), true, &skb);
1696 if (ret)
1697 return ret;
1698
1699 event = (struct mt7925_txpwr_event *)skb->data;
1700 memcpy(txpwr, &event->txpwr, sizeof(event->txpwr));
1701
1702 dev_kfree_skb(skb);
1703
1704 return 0;
1705}
1706
1707int mt7925_mcu_set_sniffer(struct mt792x_dev *dev, struct ieee80211_vif *vif,
1708 bool enable)
1709{
1710 struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
1711
1712 struct {
1713 struct {
1714 u8 band_idx;
1715 u8 pad[3];
1716 } __packed hdr;
1717 struct sniffer_enable_tlv {
1718 __le16 tag;
1719 __le16 len;
1720 u8 enable;
1721 u8 pad[3];
1722 } __packed enable;
1723 } __packed req = {
1724 .hdr = {
1725 .band_idx = mvif->mt76.band_idx,
1726 },
1727 .enable = {
1728 .tag = cpu_to_le16(UNI_SNIFFER_ENABLE),
1729 .len = cpu_to_le16(sizeof(struct sniffer_enable_tlv)),
1730 .enable = enable,
1731 },
1732 };
1733
1734 mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD(SNIFFER), &req, sizeof(req), true);
1735
1736 return mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD(SNIFFER), &req, sizeof(req),
1737 true);
1738}
1739
1740int mt7925_mcu_config_sniffer(struct mt792x_vif *vif,
1741 struct ieee80211_chanctx_conf *ctx)
1742{
1743 struct mt76_phy *mphy = vif->phy->mt76;
1744 struct cfg80211_chan_def *chandef = ctx ? &ctx->def : &mphy->chandef;
1745 int freq1 = chandef->center_freq1, freq2 = chandef->center_freq2;
1746
1747 const u8 ch_band[] = {
1748 [NL80211_BAND_2GHZ] = 1,
1749 [NL80211_BAND_5GHZ] = 2,
1750 [NL80211_BAND_6GHZ] = 3,
1751 };
1752 const u8 ch_width[] = {
1753 [NL80211_CHAN_WIDTH_20_NOHT] = 0,
1754 [NL80211_CHAN_WIDTH_20] = 0,
1755 [NL80211_CHAN_WIDTH_40] = 0,
1756 [NL80211_CHAN_WIDTH_80] = 1,
1757 [NL80211_CHAN_WIDTH_160] = 2,
1758 [NL80211_CHAN_WIDTH_80P80] = 3,
1759 [NL80211_CHAN_WIDTH_5] = 4,
1760 [NL80211_CHAN_WIDTH_10] = 5,
1761 [NL80211_CHAN_WIDTH_320] = 6,
1762 };
1763
1764 struct {
1765 struct {
1766 u8 band_idx;
1767 u8 pad[3];
1768 } __packed hdr;
1769 struct config_tlv {
1770 __le16 tag;
1771 __le16 len;
1772 u16 aid;
1773 u8 ch_band;
1774 u8 bw;
1775 u8 control_ch;
1776 u8 sco;
1777 u8 center_ch;
1778 u8 center_ch2;
1779 u8 drop_err;
1780 u8 pad[3];
1781 } __packed tlv;
1782 } __packed req = {
1783 .hdr = {
1784 .band_idx = vif->mt76.band_idx,
1785 },
1786 .tlv = {
1787 .tag = cpu_to_le16(UNI_SNIFFER_CONFIG),
1788 .len = cpu_to_le16(sizeof(req.tlv)),
1789 .control_ch = chandef->chan->hw_value,
1790 .center_ch = ieee80211_frequency_to_channel(freq1),
1791 .drop_err = 1,
1792 },
1793 };
1794
1795 if (chandef->chan->band < ARRAY_SIZE(ch_band))
1796 req.tlv.ch_band = ch_band[chandef->chan->band];
1797 if (chandef->width < ARRAY_SIZE(ch_width))
1798 req.tlv.bw = ch_width[chandef->width];
1799
1800 if (freq2)
1801 req.tlv.center_ch2 = ieee80211_frequency_to_channel(freq2);
1802
1803 if (req.tlv.control_ch < req.tlv.center_ch)
1804 req.tlv.sco = 1; /* SCA */
1805 else if (req.tlv.control_ch > req.tlv.center_ch)
1806 req.tlv.sco = 3; /* SCB */
1807
1808 return mt76_mcu_send_msg(mphy->dev, MCU_UNI_CMD(SNIFFER),
1809 &req, sizeof(req), true);
1810}
1811
1812int
1813mt7925_mcu_uni_add_beacon_offload(struct mt792x_dev *dev,
1814 struct ieee80211_hw *hw,
1815 struct ieee80211_vif *vif,
1816 bool enable)
1817{
1818 struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
1819 struct ieee80211_mutable_offsets offs;
1820 struct {
1821 struct req_hdr {
1822 u8 bss_idx;
1823 u8 pad[3];
1824 } __packed hdr;
1825 struct bcn_content_tlv {
1826 __le16 tag;
1827 __le16 len;
1828 __le16 tim_ie_pos;
1829 __le16 csa_ie_pos;
1830 __le16 bcc_ie_pos;
1831 /* 0: disable beacon offload
1832 * 1: enable beacon offload
1833 * 2: update probe respond offload
1834 */
1835 u8 enable;
1836 /* 0: legacy format (TXD + payload)
1837 * 1: only cap field IE
1838 */
1839 u8 type;
1840 __le16 pkt_len;
1841 u8 pkt[512];
1842 } __packed beacon_tlv;
1843 } req = {
1844 .hdr = {
1845 .bss_idx = mvif->mt76.idx,
1846 },
1847 .beacon_tlv = {
1848 .tag = cpu_to_le16(UNI_BSS_INFO_BCN_CONTENT),
1849 .len = cpu_to_le16(sizeof(struct bcn_content_tlv)),
1850 .enable = enable,
1851 .type = 1,
1852 },
1853 };
1854 struct sk_buff *skb;
1855 u8 cap_offs;
1856
1857 /* support enable/update process only
1858 * disable flow would be handled in bss stop handler automatically
1859 */
1860 if (!enable)
1861 return -EOPNOTSUPP;
1862
1863 skb = ieee80211_beacon_get_template(mt76_hw(dev), vif, &offs, 0);
1864 if (!skb)
1865 return -EINVAL;
1866
1867 cap_offs = offsetof(struct ieee80211_mgmt, u.beacon.capab_info);
1868 if (!skb_pull(skb, cap_offs)) {
1869 dev_err(dev->mt76.dev, "beacon format err\n");
1870 dev_kfree_skb(skb);
1871 return -EINVAL;
1872 }
1873
1874 if (skb->len > 512) {
1875 dev_err(dev->mt76.dev, "beacon size limit exceed\n");
1876 dev_kfree_skb(skb);
1877 return -EINVAL;
1878 }
1879
1880 memcpy(req.beacon_tlv.pkt, skb->data, skb->len);
1881 req.beacon_tlv.pkt_len = cpu_to_le16(skb->len);
1882 offs.tim_offset -= cap_offs;
1883 req.beacon_tlv.tim_ie_pos = cpu_to_le16(offs.tim_offset);
1884
1885 if (offs.cntdwn_counter_offs[0]) {
1886 u16 csa_offs;
1887
1888 csa_offs = offs.cntdwn_counter_offs[0] - cap_offs - 4;
1889 req.beacon_tlv.csa_ie_pos = cpu_to_le16(csa_offs);
1890 }
1891 dev_kfree_skb(skb);
1892
1893 return mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD(BSS_INFO_UPDATE),
1894 &req, sizeof(req), true);
1895}
1896
1897int mt7925_mcu_set_chctx(struct mt76_phy *phy, struct mt76_vif *mvif,
1898 struct ieee80211_chanctx_conf *ctx)
1899{
1900 struct cfg80211_chan_def *chandef = ctx ? &ctx->def : &phy->chandef;
1901 int freq1 = chandef->center_freq1, freq2 = chandef->center_freq2;
1902 enum nl80211_band band = chandef->chan->band;
1903 struct mt76_dev *mdev = phy->dev;
1904 struct {
1905 struct {
1906 u8 bss_idx;
1907 u8 pad[3];
1908 } __packed hdr;
1909 struct rlm_tlv {
1910 __le16 tag;
1911 __le16 len;
1912 u8 control_channel;
1913 u8 center_chan;
1914 u8 center_chan2;
1915 u8 bw;
1916 u8 tx_streams;
1917 u8 rx_streams;
1918 u8 ht_op_info;
1919 u8 sco;
1920 u8 band;
1921 u8 pad[3];
1922 } __packed rlm;
1923 } __packed rlm_req = {
1924 .hdr = {
1925 .bss_idx = mvif->idx,
1926 },
1927 .rlm = {
1928 .tag = cpu_to_le16(UNI_BSS_INFO_RLM),
1929 .len = cpu_to_le16(sizeof(struct rlm_tlv)),
1930 .control_channel = chandef->chan->hw_value,
1931 .center_chan = ieee80211_frequency_to_channel(freq1),
1932 .center_chan2 = ieee80211_frequency_to_channel(freq2),
1933 .tx_streams = hweight8(phy->antenna_mask),
1934 .ht_op_info = 4, /* set HT 40M allowed */
1935 .rx_streams = hweight8(phy->antenna_mask),
1936 .band = band,
1937 },
1938 };
1939
1940 switch (chandef->width) {
1941 case NL80211_CHAN_WIDTH_40:
1942 rlm_req.rlm.bw = CMD_CBW_40MHZ;
1943 break;
1944 case NL80211_CHAN_WIDTH_80:
1945 rlm_req.rlm.bw = CMD_CBW_80MHZ;
1946 break;
1947 case NL80211_CHAN_WIDTH_80P80:
1948 rlm_req.rlm.bw = CMD_CBW_8080MHZ;
1949 break;
1950 case NL80211_CHAN_WIDTH_160:
1951 rlm_req.rlm.bw = CMD_CBW_160MHZ;
1952 break;
1953 case NL80211_CHAN_WIDTH_5:
1954 rlm_req.rlm.bw = CMD_CBW_5MHZ;
1955 break;
1956 case NL80211_CHAN_WIDTH_10:
1957 rlm_req.rlm.bw = CMD_CBW_10MHZ;
1958 break;
1959 case NL80211_CHAN_WIDTH_20_NOHT:
1960 case NL80211_CHAN_WIDTH_20:
1961 default:
1962 rlm_req.rlm.bw = CMD_CBW_20MHZ;
1963 rlm_req.rlm.ht_op_info = 0;
1964 break;
1965 }
1966
1967 if (rlm_req.rlm.control_channel < rlm_req.rlm.center_chan)
1968 rlm_req.rlm.sco = 1; /* SCA */
1969 else if (rlm_req.rlm.control_channel > rlm_req.rlm.center_chan)
1970 rlm_req.rlm.sco = 3; /* SCB */
1971
1972 return mt76_mcu_send_msg(mdev, MCU_UNI_CMD(BSS_INFO_UPDATE), &rlm_req,
1973 sizeof(rlm_req), true);
1974}
1975
1976static struct sk_buff *
1977__mt7925_mcu_alloc_bss_req(struct mt76_dev *dev, struct mt76_vif *mvif, int len)
1978{
1979 struct bss_req_hdr hdr = {
1980 .bss_idx = mvif->idx,
1981 };
1982 struct sk_buff *skb;
1983
1984 skb = mt76_mcu_msg_alloc(dev, NULL, len);
1985 if (!skb)
1986 return ERR_PTR(-ENOMEM);
1987
1988 skb_put_data(skb, &hdr, sizeof(hdr));
1989
1990 return skb;
1991}
1992
1993static u8
1994mt7925_get_phy_mode_ext(struct mt76_phy *phy, struct ieee80211_vif *vif,
1995 enum nl80211_band band, struct ieee80211_sta *sta)
1996{
1997 struct ieee80211_he_6ghz_capa *he_6ghz_capa;
1998 const struct ieee80211_sta_eht_cap *eht_cap;
1999 __le16 capa = 0;
2000 u8 mode = 0;
2001
2002 if (sta) {
2003 he_6ghz_capa = &sta->deflink.he_6ghz_capa;
2004 eht_cap = &sta->deflink.eht_cap;
2005 } else {
2006 struct ieee80211_supported_band *sband;
2007
2008 sband = phy->hw->wiphy->bands[band];
2009 capa = ieee80211_get_he_6ghz_capa(sband, vif->type);
2010 he_6ghz_capa = (struct ieee80211_he_6ghz_capa *)&capa;
2011
2012 eht_cap = ieee80211_get_eht_iftype_cap(sband, vif->type);
2013 }
2014
2015 switch (band) {
2016 case NL80211_BAND_2GHZ:
2017 if (eht_cap && eht_cap->has_eht)
2018 mode |= PHY_MODE_BE_24G;
2019 break;
2020 case NL80211_BAND_5GHZ:
2021 if (eht_cap && eht_cap->has_eht)
2022 mode |= PHY_MODE_BE_5G;
2023 break;
2024 case NL80211_BAND_6GHZ:
2025 if (he_6ghz_capa && he_6ghz_capa->capa)
2026 mode |= PHY_MODE_AX_6G;
2027
2028 if (eht_cap && eht_cap->has_eht)
2029 mode |= PHY_MODE_BE_6G;
2030 break;
2031 default:
2032 break;
2033 }
2034
2035 return mode;
2036}
2037
2038static void
2039mt7925_mcu_bss_basic_tlv(struct sk_buff *skb,
2040 struct ieee80211_vif *vif,
2041 struct ieee80211_sta *sta,
2042 struct ieee80211_chanctx_conf *ctx,
2043 struct mt76_phy *phy, u16 wlan_idx,
2044 bool enable)
2045{
2046 struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
2047 struct mt792x_sta *msta = sta ? (struct mt792x_sta *)sta->drv_priv :
2048 &mvif->sta;
2049 struct cfg80211_chan_def *chandef = ctx ? &ctx->def : &phy->chandef;
2050 enum nl80211_band band = chandef->chan->band;
2051 struct mt76_connac_bss_basic_tlv *basic_req;
2052 u8 idx, basic_phy;
2053 struct tlv *tlv;
2054 int conn_type;
2055
2056 tlv = mt76_connac_mcu_add_tlv(skb, UNI_BSS_INFO_BASIC, sizeof(*basic_req));
2057 basic_req = (struct mt76_connac_bss_basic_tlv *)tlv;
2058
2059 idx = mvif->mt76.omac_idx > EXT_BSSID_START ? HW_BSSID_0 :
2060 mvif->mt76.omac_idx;
2061 basic_req->hw_bss_idx = idx;
2062
2063 basic_req->phymode_ext = mt7925_get_phy_mode_ext(phy, vif, band, sta);
2064
2065 basic_phy = mt76_connac_get_phy_mode_v2(phy, vif, band, sta);
2066 basic_req->nonht_basic_phy = cpu_to_le16(basic_phy);
2067
2068 memcpy(basic_req->bssid, vif->bss_conf.bssid, ETH_ALEN);
2069 basic_req->phymode = mt76_connac_get_phy_mode(phy, vif, band, sta);
2070 basic_req->bcn_interval = cpu_to_le16(vif->bss_conf.beacon_int);
2071 basic_req->dtim_period = vif->bss_conf.dtim_period;
2072 basic_req->bmc_tx_wlan_idx = cpu_to_le16(wlan_idx);
2073 basic_req->sta_idx = cpu_to_le16(msta->wcid.idx);
2074 basic_req->omac_idx = mvif->mt76.omac_idx;
2075 basic_req->band_idx = mvif->mt76.band_idx;
2076 basic_req->wmm_idx = mvif->mt76.wmm_idx;
2077 basic_req->conn_state = !enable;
2078
2079 switch (vif->type) {
2080 case NL80211_IFTYPE_MESH_POINT:
2081 case NL80211_IFTYPE_AP:
2082 if (vif->p2p)
2083 conn_type = CONNECTION_P2P_GO;
2084 else
2085 conn_type = CONNECTION_INFRA_AP;
2086 basic_req->conn_type = cpu_to_le32(conn_type);
2087 basic_req->active = enable;
2088 break;
2089 case NL80211_IFTYPE_STATION:
2090 if (vif->p2p)
2091 conn_type = CONNECTION_P2P_GC;
2092 else
2093 conn_type = CONNECTION_INFRA_STA;
2094 basic_req->conn_type = cpu_to_le32(conn_type);
2095 basic_req->active = true;
2096 break;
2097 case NL80211_IFTYPE_ADHOC:
2098 basic_req->conn_type = cpu_to_le32(CONNECTION_IBSS_ADHOC);
2099 basic_req->active = true;
2100 break;
2101 default:
2102 WARN_ON(1);
2103 break;
2104 }
2105}
2106
2107static void
2108mt7925_mcu_bss_sec_tlv(struct sk_buff *skb, struct ieee80211_vif *vif)
2109{
2110 struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
2111 struct bss_sec_tlv {
2112 __le16 tag;
2113 __le16 len;
2114 u8 mode;
2115 u8 status;
2116 u8 cipher;
2117 u8 __rsv;
2118 } __packed * sec;
2119 struct tlv *tlv;
2120
2121 tlv = mt76_connac_mcu_add_tlv(skb, UNI_BSS_INFO_SEC, sizeof(*sec));
2122 sec = (struct bss_sec_tlv *)tlv;
2123
2124 switch (mvif->cipher) {
2125 case MCU_CIPHER_GCMP_256:
2126 case MCU_CIPHER_GCMP:
2127 sec->mode = MODE_WPA3_SAE;
2128 sec->status = 8;
2129 break;
2130 case MCU_CIPHER_AES_CCMP:
2131 sec->mode = MODE_WPA2_PSK;
2132 sec->status = 6;
2133 break;
2134 case MCU_CIPHER_TKIP:
2135 sec->mode = MODE_WPA2_PSK;
2136 sec->status = 4;
2137 break;
2138 case MCU_CIPHER_WEP104:
2139 case MCU_CIPHER_WEP40:
2140 sec->mode = MODE_SHARED;
2141 sec->status = 0;
2142 break;
2143 default:
2144 sec->mode = MODE_OPEN;
2145 sec->status = 1;
2146 break;
2147 }
2148
2149 sec->cipher = mvif->cipher;
2150}
2151
2152static void
2153mt7925_mcu_bss_bmc_tlv(struct sk_buff *skb, struct mt792x_phy *phy,
2154 struct ieee80211_chanctx_conf *ctx,
2155 struct ieee80211_vif *vif,
2156 struct ieee80211_sta *sta)
2157{
2158 struct cfg80211_chan_def *chandef = ctx ? &ctx->def : &phy->mt76->chandef;
2159 struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
2160 enum nl80211_band band = chandef->chan->band;
2161 struct bss_rate_tlv *bmc;
2162 struct tlv *tlv;
2163 u8 idx = mvif->mcast_rates_idx ?
2164 mvif->mcast_rates_idx : mvif->basic_rates_idx;
2165
2166 tlv = mt76_connac_mcu_add_tlv(skb, UNI_BSS_INFO_RATE, sizeof(*bmc));
2167
2168 bmc = (struct bss_rate_tlv *)tlv;
2169
2170 bmc->short_preamble = (band == NL80211_BAND_2GHZ);
2171 bmc->bc_fixed_rate = idx;
2172 bmc->mc_fixed_rate = idx;
2173}
2174
2175static void
2176mt7925_mcu_bss_mld_tlv(struct sk_buff *skb,
2177 struct ieee80211_vif *vif,
2178 struct ieee80211_sta *sta)
2179{
2180 struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
2181 bool is_mld = ieee80211_vif_is_mld(vif);
2182 struct bss_mld_tlv *mld;
2183 struct tlv *tlv;
2184
2185 tlv = mt76_connac_mcu_add_tlv(skb, UNI_BSS_INFO_MLD, sizeof(*mld));
2186 mld = (struct bss_mld_tlv *)tlv;
2187
2188 mld->link_id = sta ? (is_mld ? vif->bss_conf.link_id : 0) : 0xff;
2189 mld->group_mld_id = is_mld ? mvif->mt76.idx : 0xff;
2190 mld->own_mld_id = mvif->mt76.idx + 32;
2191 mld->remap_idx = 0xff;
2192
2193 if (sta)
2194 memcpy(mld->mac_addr, sta->addr, ETH_ALEN);
2195}
2196
2197static void
2198mt7925_mcu_bss_qos_tlv(struct sk_buff *skb, struct ieee80211_vif *vif)
2199{
2200 struct mt76_connac_bss_qos_tlv *qos;
2201 struct tlv *tlv;
2202
2203 tlv = mt76_connac_mcu_add_tlv(skb, UNI_BSS_INFO_QBSS, sizeof(*qos));
2204 qos = (struct mt76_connac_bss_qos_tlv *)tlv;
2205 qos->qos = vif->bss_conf.qos;
2206}
2207
2208static void
2209mt7925_mcu_bss_he_tlv(struct sk_buff *skb, struct ieee80211_vif *vif,
2210 struct mt792x_phy *phy)
2211{
2212#define DEFAULT_HE_PE_DURATION 4
2213#define DEFAULT_HE_DURATION_RTS_THRES 1023
2214 const struct ieee80211_sta_he_cap *cap;
2215 struct bss_info_uni_he *he;
2216 struct tlv *tlv;
2217
2218 cap = mt76_connac_get_he_phy_cap(phy->mt76, vif);
2219
2220 tlv = mt76_connac_mcu_add_tlv(skb, UNI_BSS_INFO_HE_BASIC, sizeof(*he));
2221
2222 he = (struct bss_info_uni_he *)tlv;
2223 he->he_pe_duration = vif->bss_conf.htc_trig_based_pkt_ext;
2224 if (!he->he_pe_duration)
2225 he->he_pe_duration = DEFAULT_HE_PE_DURATION;
2226
2227 he->he_rts_thres = cpu_to_le16(vif->bss_conf.frame_time_rts_th);
2228 if (!he->he_rts_thres)
2229 he->he_rts_thres = cpu_to_le16(DEFAULT_HE_DURATION_RTS_THRES);
2230
2231 he->max_nss_mcs[CMD_HE_MCS_BW80] = cap->he_mcs_nss_supp.tx_mcs_80;
2232 he->max_nss_mcs[CMD_HE_MCS_BW160] = cap->he_mcs_nss_supp.tx_mcs_160;
2233 he->max_nss_mcs[CMD_HE_MCS_BW8080] = cap->he_mcs_nss_supp.tx_mcs_80p80;
2234}
2235
2236static void
2237mt7925_mcu_bss_color_tlv(struct sk_buff *skb, struct ieee80211_vif *vif,
2238 bool enable)
2239{
2240 struct bss_info_uni_bss_color *color;
2241 struct tlv *tlv;
2242
2243 tlv = mt76_connac_mcu_add_tlv(skb, UNI_BSS_INFO_BSS_COLOR, sizeof(*color));
2244 color = (struct bss_info_uni_bss_color *)tlv;
2245
2246 color->enable = enable ?
2247 vif->bss_conf.he_bss_color.enabled : 0;
2248 color->bss_color = enable ?
2249 vif->bss_conf.he_bss_color.color : 0;
2250}
2251
2252int mt7925_mcu_add_bss_info(struct mt792x_phy *phy,
2253 struct ieee80211_chanctx_conf *ctx,
2254 struct ieee80211_vif *vif,
2255 struct ieee80211_sta *sta,
2256 int enable)
2257{
2258 struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
2259 struct mt792x_dev *dev = phy->dev;
2260 struct sk_buff *skb;
2261 int err;
2262
2263 skb = __mt7925_mcu_alloc_bss_req(&dev->mt76, &mvif->mt76,
2264 MT7925_BSS_UPDATE_MAX_SIZE);
2265 if (IS_ERR(skb))
2266 return PTR_ERR(skb);
2267
2268 /* bss_basic must be first */
2269 mt7925_mcu_bss_basic_tlv(skb, vif, sta, ctx, phy->mt76,
2270 mvif->sta.wcid.idx, enable);
2271 mt7925_mcu_bss_sec_tlv(skb, vif);
2272
2273 mt7925_mcu_bss_bmc_tlv(skb, phy, ctx, vif, sta);
2274 mt7925_mcu_bss_qos_tlv(skb, vif);
2275 mt7925_mcu_bss_mld_tlv(skb, vif, sta);
2276
2277 if (vif->bss_conf.he_support) {
2278 mt7925_mcu_bss_he_tlv(skb, vif, phy);
2279 mt7925_mcu_bss_color_tlv(skb, vif, enable);
2280 }
2281
2282 err = mt76_mcu_skb_send_msg(&dev->mt76, skb,
2283 MCU_UNI_CMD(BSS_INFO_UPDATE), true);
2284 if (err < 0)
2285 return err;
2286
2287 return mt7925_mcu_set_chctx(phy->mt76, &mvif->mt76, ctx);
2288}
2289
2290int mt7925_mcu_set_dbdc(struct mt76_phy *phy)
2291{
2292 struct mt76_dev *mdev = phy->dev;
2293
2294 struct mbmc_conf_tlv *conf;
2295 struct mbmc_set_req *hdr;
2296 struct sk_buff *skb;
2297 struct tlv *tlv;
2298 int max_len, err;
2299
2300 max_len = sizeof(*hdr) + sizeof(*conf);
2301 skb = mt76_mcu_msg_alloc(mdev, NULL, max_len);
2302 if (!skb)
2303 return -ENOMEM;
2304
2305 hdr = (struct mbmc_set_req *)skb_put(skb, sizeof(*hdr));
2306
2307 tlv = mt76_connac_mcu_add_tlv(skb, UNI_MBMC_SETTING, sizeof(*conf));
2308 conf = (struct mbmc_conf_tlv *)tlv;
2309
2310 conf->mbmc_en = 1;
2311 conf->band = 0; /* unused */
2312
2313 err = mt76_mcu_skb_send_msg(mdev, skb, MCU_UNI_CMD(SET_DBDC_PARMS),
2314 false);
2315
2316 return err;
2317}
2318
2319#define MT76_CONNAC_SCAN_CHANNEL_TIME 60
2320
2321int mt7925_mcu_hw_scan(struct mt76_phy *phy, struct ieee80211_vif *vif,
2322 struct ieee80211_scan_request *scan_req)
2323{
2324 struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
2325 struct cfg80211_scan_request *sreq = &scan_req->req;
2326 int n_ssids = 0, err, i, duration;
2327 struct ieee80211_channel **scan_list = sreq->channels;
2328 struct mt76_dev *mdev = phy->dev;
2329 struct mt76_connac_mcu_scan_channel *chan;
2330 struct sk_buff *skb;
2331
2332 struct scan_hdr_tlv *hdr;
2333 struct scan_req_tlv *req;
2334 struct scan_ssid_tlv *ssid;
2335 struct scan_bssid_tlv *bssid;
2336 struct scan_chan_info_tlv *chan_info;
2337 struct scan_ie_tlv *ie;
2338 struct scan_misc_tlv *misc;
2339 struct tlv *tlv;
2340 int max_len;
2341
2342 max_len = sizeof(*hdr) + sizeof(*req) + sizeof(*ssid) +
2343 sizeof(*bssid) + sizeof(*chan_info) +
2344 sizeof(*misc) + sizeof(*ie);
2345
2346 skb = mt76_mcu_msg_alloc(mdev, NULL, max_len);
2347 if (!skb)
2348 return -ENOMEM;
2349
2350 set_bit(MT76_HW_SCANNING, &phy->state);
2351 mvif->scan_seq_num = (mvif->scan_seq_num + 1) & 0x7f;
2352
2353 hdr = (struct scan_hdr_tlv *)skb_put(skb, sizeof(*hdr));
2354 hdr->seq_num = mvif->scan_seq_num | mvif->band_idx << 7;
2355 hdr->bss_idx = mvif->idx;
2356
2357 tlv = mt76_connac_mcu_add_tlv(skb, UNI_SCAN_REQ, sizeof(*req));
2358 req = (struct scan_req_tlv *)tlv;
2359 req->scan_type = sreq->n_ssids ? 1 : 0;
2360 req->probe_req_num = sreq->n_ssids ? 2 : 0;
2361
2362 duration = MT76_CONNAC_SCAN_CHANNEL_TIME;
2363 /* increase channel time for passive scan */
2364 if (!sreq->n_ssids)
2365 duration *= 2;
2366 req->timeout_value = cpu_to_le16(sreq->n_channels * duration);
2367 req->channel_min_dwell_time = cpu_to_le16(duration);
2368 req->channel_dwell_time = cpu_to_le16(duration);
2369
2370 tlv = mt76_connac_mcu_add_tlv(skb, UNI_SCAN_SSID, sizeof(*ssid));
2371 ssid = (struct scan_ssid_tlv *)tlv;
2372 for (i = 0; i < sreq->n_ssids; i++) {
2373 if (!sreq->ssids[i].ssid_len)
2374 continue;
2375
2376 ssid->ssids[i].ssid_len = cpu_to_le32(sreq->ssids[i].ssid_len);
2377 memcpy(ssid->ssids[i].ssid, sreq->ssids[i].ssid,
2378 sreq->ssids[i].ssid_len);
2379 n_ssids++;
2380 }
2381 ssid->ssid_type = n_ssids ? BIT(2) : BIT(0);
2382 ssid->ssids_num = n_ssids;
2383
2384 tlv = mt76_connac_mcu_add_tlv(skb, UNI_SCAN_BSSID, sizeof(*bssid));
2385 bssid = (struct scan_bssid_tlv *)tlv;
2386
2387 memcpy(bssid->bssid, sreq->bssid, ETH_ALEN);
2388
2389 tlv = mt76_connac_mcu_add_tlv(skb, UNI_SCAN_CHANNEL, sizeof(*chan_info));
2390 chan_info = (struct scan_chan_info_tlv *)tlv;
2391 chan_info->channels_num = min_t(u8, sreq->n_channels,
2392 ARRAY_SIZE(chan_info->channels));
2393 for (i = 0; i < chan_info->channels_num; i++) {
2394 chan = &chan_info->channels[i];
2395
2396 switch (scan_list[i]->band) {
2397 case NL80211_BAND_2GHZ:
2398 chan->band = 1;
2399 break;
2400 case NL80211_BAND_6GHZ:
2401 chan->band = 3;
2402 break;
2403 default:
2404 chan->band = 2;
2405 break;
2406 }
2407 chan->channel_num = scan_list[i]->hw_value;
2408 }
2409 chan_info->channel_type = sreq->n_channels ? 4 : 0;
2410
2411 tlv = mt76_connac_mcu_add_tlv(skb, UNI_SCAN_IE, sizeof(*ie));
2412 ie = (struct scan_ie_tlv *)tlv;
2413 if (sreq->ie_len > 0) {
2414 memcpy(ie->ies, sreq->ie, sreq->ie_len);
2415 ie->ies_len = cpu_to_le16(sreq->ie_len);
2416 }
2417
2418 req->scan_func |= SCAN_FUNC_SPLIT_SCAN;
2419
2420 tlv = mt76_connac_mcu_add_tlv(skb, UNI_SCAN_MISC, sizeof(*misc));
2421 misc = (struct scan_misc_tlv *)tlv;
2422 if (sreq->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
2423 get_random_mask_addr(misc->random_mac, sreq->mac_addr,
2424 sreq->mac_addr_mask);
2425 req->scan_func |= SCAN_FUNC_RANDOM_MAC;
2426 }
2427
2428 err = mt76_mcu_skb_send_msg(mdev, skb, MCU_UNI_CMD(SCAN_REQ),
2429 false);
2430 if (err < 0)
2431 clear_bit(MT76_HW_SCANNING, &phy->state);
2432
2433 return err;
2434}
2435EXPORT_SYMBOL_GPL(mt7925_mcu_hw_scan);
2436
2437int mt7925_mcu_sched_scan_req(struct mt76_phy *phy,
2438 struct ieee80211_vif *vif,
2439 struct cfg80211_sched_scan_request *sreq)
2440{
2441 struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
2442 struct ieee80211_channel **scan_list = sreq->channels;
2443 struct mt76_connac_mcu_scan_channel *chan;
2444 struct mt76_dev *mdev = phy->dev;
2445 struct cfg80211_match_set *cfg_match;
2446 struct cfg80211_ssid *cfg_ssid;
2447
2448 struct scan_hdr_tlv *hdr;
2449 struct scan_sched_req *req;
2450 struct scan_ssid_tlv *ssid;
2451 struct scan_chan_info_tlv *chan_info;
2452 struct scan_ie_tlv *ie;
2453 struct scan_sched_ssid_match_sets *match;
2454 struct sk_buff *skb;
2455 struct tlv *tlv;
2456 int i, max_len;
2457
2458 max_len = sizeof(*hdr) + sizeof(*req) + sizeof(*ssid) +
2459 sizeof(*chan_info) + sizeof(*ie) +
2460 sizeof(*match);
2461
2462 skb = mt76_mcu_msg_alloc(mdev, NULL, max_len);
2463 if (!skb)
2464 return -ENOMEM;
2465
2466 mvif->scan_seq_num = (mvif->scan_seq_num + 1) & 0x7f;
2467
2468 hdr = (struct scan_hdr_tlv *)skb_put(skb, sizeof(*hdr));
2469 hdr->seq_num = mvif->scan_seq_num | mvif->band_idx << 7;
2470 hdr->bss_idx = mvif->idx;
2471
2472 tlv = mt76_connac_mcu_add_tlv(skb, UNI_SCAN_SCHED_REQ, sizeof(*req));
2473 req = (struct scan_sched_req *)tlv;
2474 req->version = 1;
2475
2476 if (sreq->flags & NL80211_SCAN_FLAG_RANDOM_ADDR)
2477 req->scan_func |= SCAN_FUNC_RANDOM_MAC;
2478
2479 req->intervals_num = sreq->n_scan_plans;
2480 for (i = 0; i < req->intervals_num; i++)
2481 req->intervals[i] = cpu_to_le16(sreq->scan_plans[i].interval);
2482
2483 tlv = mt76_connac_mcu_add_tlv(skb, UNI_SCAN_SSID, sizeof(*ssid));
2484 ssid = (struct scan_ssid_tlv *)tlv;
2485
2486 ssid->ssids_num = sreq->n_ssids;
2487 ssid->ssid_type = BIT(2);
2488 for (i = 0; i < ssid->ssids_num; i++) {
2489 cfg_ssid = &sreq->ssids[i];
2490 memcpy(ssid->ssids[i].ssid, cfg_ssid->ssid, cfg_ssid->ssid_len);
2491 ssid->ssids[i].ssid_len = cpu_to_le32(cfg_ssid->ssid_len);
2492 }
2493
2494 tlv = mt76_connac_mcu_add_tlv(skb, UNI_SCAN_SSID_MATCH_SETS, sizeof(*match));
2495 match = (struct scan_sched_ssid_match_sets *)tlv;
2496 match->match_num = sreq->n_match_sets;
2497 for (i = 0; i < match->match_num; i++) {
2498 cfg_match = &sreq->match_sets[i];
2499 memcpy(match->match[i].ssid, cfg_match->ssid.ssid,
2500 cfg_match->ssid.ssid_len);
2501 match->match[i].rssi_th = cpu_to_le32(cfg_match->rssi_thold);
2502 match->match[i].ssid_len = cfg_match->ssid.ssid_len;
2503 }
2504
2505 tlv = mt76_connac_mcu_add_tlv(skb, UNI_SCAN_CHANNEL, sizeof(*chan_info));
2506 chan_info = (struct scan_chan_info_tlv *)tlv;
2507 chan_info->channels_num = min_t(u8, sreq->n_channels,
2508 ARRAY_SIZE(chan_info->channels));
2509 for (i = 0; i < chan_info->channels_num; i++) {
2510 chan = &chan_info->channels[i];
2511
2512 switch (scan_list[i]->band) {
2513 case NL80211_BAND_2GHZ:
2514 chan->band = 1;
2515 break;
2516 case NL80211_BAND_6GHZ:
2517 chan->band = 3;
2518 break;
2519 default:
2520 chan->band = 2;
2521 break;
2522 }
2523 chan->channel_num = scan_list[i]->hw_value;
2524 }
2525 chan_info->channel_type = sreq->n_channels ? 4 : 0;
2526
2527 tlv = mt76_connac_mcu_add_tlv(skb, UNI_SCAN_IE, sizeof(*ie));
2528 ie = (struct scan_ie_tlv *)tlv;
2529 if (sreq->ie_len > 0) {
2530 memcpy(ie->ies, sreq->ie, sreq->ie_len);
2531 ie->ies_len = cpu_to_le16(sreq->ie_len);
2532 }
2533
2534 return mt76_mcu_skb_send_msg(mdev, skb, MCU_UNI_CMD(SCAN_REQ),
2535 false);
2536}
2537EXPORT_SYMBOL_GPL(mt7925_mcu_sched_scan_req);
2538
2539int
2540mt7925_mcu_sched_scan_enable(struct mt76_phy *phy,
2541 struct ieee80211_vif *vif,
2542 bool enable)
2543{
2544 struct mt76_dev *mdev = phy->dev;
2545 struct scan_sched_enable *req;
2546 struct scan_hdr_tlv *hdr;
2547 struct sk_buff *skb;
2548 struct tlv *tlv;
2549 int max_len;
2550
2551 max_len = sizeof(*hdr) + sizeof(*req);
2552
2553 skb = mt76_mcu_msg_alloc(mdev, NULL, max_len);
2554 if (!skb)
2555 return -ENOMEM;
2556
2557 hdr = (struct scan_hdr_tlv *)skb_put(skb, sizeof(*hdr));
2558 hdr->seq_num = 0;
2559 hdr->bss_idx = 0;
2560
2561 tlv = mt76_connac_mcu_add_tlv(skb, UNI_SCAN_SCHED_ENABLE, sizeof(*req));
2562 req = (struct scan_sched_enable *)tlv;
2563 req->active = !enable;
2564
2565 if (enable)
2566 set_bit(MT76_HW_SCHED_SCANNING, &phy->state);
2567 else
2568 clear_bit(MT76_HW_SCHED_SCANNING, &phy->state);
2569
2570 return mt76_mcu_skb_send_msg(mdev, skb, MCU_UNI_CMD(SCAN_REQ),
2571 false);
2572}
2573
2574int mt7925_mcu_cancel_hw_scan(struct mt76_phy *phy,
2575 struct ieee80211_vif *vif)
2576{
2577 struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
2578 struct {
2579 struct scan_hdr {
2580 u8 seq_num;
2581 u8 bss_idx;
2582 u8 pad[2];
2583 } __packed hdr;
2584 struct scan_cancel_tlv {
2585 __le16 tag;
2586 __le16 len;
2587 u8 is_ext_channel;
2588 u8 rsv[3];
2589 } __packed cancel;
2590 } req = {
2591 .hdr = {
2592 .seq_num = mvif->scan_seq_num,
2593 .bss_idx = mvif->idx,
2594 },
2595 .cancel = {
2596 .tag = cpu_to_le16(UNI_SCAN_CANCEL),
2597 .len = cpu_to_le16(sizeof(struct scan_cancel_tlv)),
2598 },
2599 };
2600
2601 if (test_and_clear_bit(MT76_HW_SCANNING, &phy->state)) {
2602 struct cfg80211_scan_info info = {
2603 .aborted = true,
2604 };
2605
2606 ieee80211_scan_completed(phy->hw, &info);
2607 }
2608
2609 return mt76_mcu_send_msg(phy->dev, MCU_UNI_CMD(SCAN_REQ),
2610 &req, sizeof(req), false);
2611}
2612EXPORT_SYMBOL_GPL(mt7925_mcu_cancel_hw_scan);
2613
2614int mt7925_mcu_set_channel_domain(struct mt76_phy *phy)
2615{
2616 int len, i, n_max_channels, n_2ch = 0, n_5ch = 0, n_6ch = 0;
2617 struct {
2618 struct {
2619 u8 alpha2[4]; /* regulatory_request.alpha2 */
2620 u8 bw_2g; /* BW_20_40M 0
2621 * BW_20M 1
2622 * BW_20_40_80M 2
2623 * BW_20_40_80_160M 3
2624 * BW_20_40_80_8080M 4
2625 */
2626 u8 bw_5g;
2627 u8 bw_6g;
2628 u8 pad;
2629 } __packed hdr;
2630 struct n_chan {
2631 __le16 tag;
2632 __le16 len;
2633 u8 n_2ch;
2634 u8 n_5ch;
2635 u8 n_6ch;
2636 u8 pad;
2637 } __packed n_ch;
2638 } req = {
2639 .hdr = {
2640 .bw_2g = 0,
2641 .bw_5g = 3, /* BW_20_40_80_160M */
2642 .bw_6g = 3,
2643 },
2644 .n_ch = {
2645 .tag = cpu_to_le16(2),
2646 },
2647 };
2648 struct mt76_connac_mcu_chan {
2649 __le16 hw_value;
2650 __le16 pad;
2651 __le32 flags;
2652 } __packed channel;
2653 struct mt76_dev *dev = phy->dev;
2654 struct ieee80211_channel *chan;
2655 struct sk_buff *skb;
2656
2657 n_max_channels = phy->sband_2g.sband.n_channels +
2658 phy->sband_5g.sband.n_channels +
2659 phy->sband_6g.sband.n_channels;
2660 len = sizeof(req) + n_max_channels * sizeof(channel);
2661
2662 skb = mt76_mcu_msg_alloc(dev, NULL, len);
2663 if (!skb)
2664 return -ENOMEM;
2665
2666 skb_reserve(skb, sizeof(req));
2667
2668 for (i = 0; i < phy->sband_2g.sband.n_channels; i++) {
2669 chan = &phy->sband_2g.sband.channels[i];
2670 if (chan->flags & IEEE80211_CHAN_DISABLED)
2671 continue;
2672
2673 channel.hw_value = cpu_to_le16(chan->hw_value);
2674 channel.flags = cpu_to_le32(chan->flags);
2675 channel.pad = 0;
2676
2677 skb_put_data(skb, &channel, sizeof(channel));
2678 n_2ch++;
2679 }
2680 for (i = 0; i < phy->sband_5g.sband.n_channels; i++) {
2681 chan = &phy->sband_5g.sband.channels[i];
2682 if (chan->flags & IEEE80211_CHAN_DISABLED)
2683 continue;
2684
2685 channel.hw_value = cpu_to_le16(chan->hw_value);
2686 channel.flags = cpu_to_le32(chan->flags);
2687 channel.pad = 0;
2688
2689 skb_put_data(skb, &channel, sizeof(channel));
2690 n_5ch++;
2691 }
2692 for (i = 0; i < phy->sband_6g.sband.n_channels; i++) {
2693 chan = &phy->sband_6g.sband.channels[i];
2694 if (chan->flags & IEEE80211_CHAN_DISABLED)
2695 continue;
2696
2697 channel.hw_value = cpu_to_le16(chan->hw_value);
2698 channel.flags = cpu_to_le32(chan->flags);
2699 channel.pad = 0;
2700
2701 skb_put_data(skb, &channel, sizeof(channel));
2702 n_6ch++;
2703 }
2704
2705 BUILD_BUG_ON(sizeof(dev->alpha2) > sizeof(req.hdr.alpha2));
2706 memcpy(req.hdr.alpha2, dev->alpha2, sizeof(dev->alpha2));
2707 req.n_ch.n_2ch = n_2ch;
2708 req.n_ch.n_5ch = n_5ch;
2709 req.n_ch.n_6ch = n_6ch;
2710 len = sizeof(struct n_chan) + (n_2ch + n_5ch + n_6ch) * sizeof(channel);
2711 req.n_ch.len = cpu_to_le16(len);
2712 memcpy(__skb_push(skb, sizeof(req)), &req, sizeof(req));
2713
2714 return mt76_mcu_skb_send_msg(dev, skb, MCU_UNI_CMD(SET_DOMAIN_INFO),
2715 false);
2716}
2717EXPORT_SYMBOL_GPL(mt7925_mcu_set_channel_domain);
2718
2719static int
2720__mt7925_mcu_set_clc(struct mt792x_dev *dev, u8 *alpha2,
2721 enum environment_cap env_cap,
2722 struct mt7925_clc *clc, u8 idx)
2723{
2724 struct mt7925_clc_segment *seg;
2725 struct sk_buff *skb;
2726 struct {
2727 u8 rsv[4];
2728 __le16 tag;
2729 __le16 len;
2730
2731 u8 ver;
2732 u8 pad0;
2733 __le16 size;
2734 u8 idx;
2735 u8 env;
2736 u8 acpi_conf;
2737 u8 pad1;
2738 u8 alpha2[2];
2739 u8 type[2];
2740 u8 rsvd[64];
2741 } __packed req = {
2742 .tag = cpu_to_le16(0x3),
2743 .len = cpu_to_le16(sizeof(req) - 4),
2744
2745 .idx = idx,
2746 .env = env_cap,
2747 .acpi_conf = mt792x_acpi_get_flags(&dev->phy),
2748 };
2749 int ret, valid_cnt = 0;
2750 u8 i, *pos;
2751
2752 if (!clc)
2753 return 0;
2754
2755 pos = clc->data + sizeof(*seg) * clc->nr_seg;
2756 for (i = 0; i < clc->nr_country; i++) {
2757 struct mt7925_clc_rule *rule = (struct mt7925_clc_rule *)pos;
2758
2759 pos += sizeof(*rule);
2760 if (rule->alpha2[0] != alpha2[0] ||
2761 rule->alpha2[1] != alpha2[1])
2762 continue;
2763
2764 seg = (struct mt7925_clc_segment *)clc->data
2765 + rule->seg_idx - 1;
2766
2767 memcpy(req.alpha2, rule->alpha2, 2);
2768 memcpy(req.type, rule->type, 2);
2769
2770 req.size = cpu_to_le16(seg->len);
2771 skb = __mt76_mcu_msg_alloc(&dev->mt76, &req,
2772 le16_to_cpu(req.size) + sizeof(req),
2773 sizeof(req), GFP_KERNEL);
2774 if (!skb)
2775 return -ENOMEM;
2776 skb_put_data(skb, clc->data + seg->offset, seg->len);
2777
2778 ret = mt76_mcu_skb_send_msg(&dev->mt76, skb,
2779 MCU_UNI_CMD(SET_POWER_LIMIT),
2780 true);
2781 if (ret < 0)
2782 return ret;
2783 valid_cnt++;
2784 }
2785
2786 if (!valid_cnt)
2787 return -ENOENT;
2788
2789 return 0;
2790}
2791
2792int mt7925_mcu_set_clc(struct mt792x_dev *dev, u8 *alpha2,
2793 enum environment_cap env_cap)
2794{
2795 struct mt792x_phy *phy = (struct mt792x_phy *)&dev->phy;
2796 int i, ret;
2797
2798 /* submit all clc config */
2799 for (i = 0; i < ARRAY_SIZE(phy->clc); i++) {
2800 ret = __mt7925_mcu_set_clc(dev, alpha2, env_cap,
2801 phy->clc[i], i);
2802
2803 /* If no country found, set "00" as default */
2804 if (ret == -ENOENT)
2805 ret = __mt7925_mcu_set_clc(dev, "00",
2806 ENVIRON_INDOOR,
2807 phy->clc[i], i);
2808 if (ret < 0)
2809 return ret;
2810 }
2811 return 0;
2812}
2813
2814int mt7925_mcu_fill_message(struct mt76_dev *mdev, struct sk_buff *skb,
2815 int cmd, int *wait_seq)
2816{
2817 int txd_len, mcu_cmd = FIELD_GET(__MCU_CMD_FIELD_ID, cmd);
2818 struct mt76_connac2_mcu_uni_txd *uni_txd;
2819 struct mt76_connac2_mcu_txd *mcu_txd;
2820 __le32 *txd;
2821 u32 val;
2822 u8 seq;
2823
2824 /* TODO: make dynamic based on msg type */
2825 mdev->mcu.timeout = 20 * HZ;
2826
2827 seq = ++mdev->mcu.msg_seq & 0xf;
2828 if (!seq)
2829 seq = ++mdev->mcu.msg_seq & 0xf;
2830
2831 if (cmd == MCU_CMD(FW_SCATTER))
2832 goto exit;
2833
2834 txd_len = cmd & __MCU_CMD_FIELD_UNI ? sizeof(*uni_txd) : sizeof(*mcu_txd);
2835 txd = (__le32 *)skb_push(skb, txd_len);
2836
2837 val = FIELD_PREP(MT_TXD0_TX_BYTES, skb->len) |
2838 FIELD_PREP(MT_TXD0_PKT_FMT, MT_TX_TYPE_CMD) |
2839 FIELD_PREP(MT_TXD0_Q_IDX, MT_TX_MCU_PORT_RX_Q0);
2840 txd[0] = cpu_to_le32(val);
2841
2842 val = FIELD_PREP(MT_TXD1_HDR_FORMAT, MT_HDR_FORMAT_CMD);
2843 txd[1] = cpu_to_le32(val);
2844
2845 if (cmd & __MCU_CMD_FIELD_UNI) {
2846 uni_txd = (struct mt76_connac2_mcu_uni_txd *)txd;
2847 uni_txd->len = cpu_to_le16(skb->len - sizeof(uni_txd->txd));
2848 uni_txd->option = MCU_CMD_UNI_EXT_ACK;
2849 uni_txd->cid = cpu_to_le16(mcu_cmd);
2850 uni_txd->s2d_index = MCU_S2D_H2N;
2851 uni_txd->pkt_type = MCU_PKT_ID;
2852 uni_txd->seq = seq;
2853
2854 goto exit;
2855 }
2856
2857 mcu_txd = (struct mt76_connac2_mcu_txd *)txd;
2858 mcu_txd->len = cpu_to_le16(skb->len - sizeof(mcu_txd->txd));
2859 mcu_txd->pq_id = cpu_to_le16(MCU_PQ_ID(MT_TX_PORT_IDX_MCU,
2860 MT_TX_MCU_PORT_RX_Q0));
2861 mcu_txd->pkt_type = MCU_PKT_ID;
2862 mcu_txd->seq = seq;
2863 mcu_txd->cid = mcu_cmd;
2864 mcu_txd->ext_cid = FIELD_GET(__MCU_CMD_FIELD_EXT_ID, cmd);
2865
2866 if (mcu_txd->ext_cid || (cmd & __MCU_CMD_FIELD_CE)) {
2867 if (cmd & __MCU_CMD_FIELD_QUERY)
2868 mcu_txd->set_query = MCU_Q_QUERY;
2869 else
2870 mcu_txd->set_query = MCU_Q_SET;
2871 mcu_txd->ext_cid_ack = !!mcu_txd->ext_cid;
2872 } else {
2873 mcu_txd->set_query = MCU_Q_NA;
2874 }
2875
2876 if (cmd & __MCU_CMD_FIELD_WA)
2877 mcu_txd->s2d_index = MCU_S2D_H2C;
2878 else
2879 mcu_txd->s2d_index = MCU_S2D_H2N;
2880
2881exit:
2882 if (wait_seq)
2883 *wait_seq = seq;
2884
2885 return 0;
2886}
2887EXPORT_SYMBOL_GPL(mt7925_mcu_fill_message);
2888
2889int mt7925_mcu_set_rts_thresh(struct mt792x_phy *phy, u32 val)
2890{
2891 struct {
2892 u8 band_idx;
2893 u8 _rsv[3];
2894
2895 __le16 tag;
2896 __le16 len;
2897 __le32 len_thresh;
2898 __le32 pkt_thresh;
2899 } __packed req = {
2900 .band_idx = phy->mt76->band_idx,
2901 .tag = cpu_to_le16(UNI_BAND_CONFIG_RTS_THRESHOLD),
2902 .len = cpu_to_le16(sizeof(req) - 4),
2903 .len_thresh = cpu_to_le32(val),
2904 .pkt_thresh = cpu_to_le32(0x2),
2905 };
2906
2907 return mt76_mcu_send_msg(&phy->dev->mt76, MCU_UNI_CMD(BAND_CONFIG),
2908 &req, sizeof(req), true);
2909}
2910
2911int mt7925_mcu_set_radio_en(struct mt792x_phy *phy, bool enable)
2912{
2913 struct {
2914 u8 band_idx;
2915 u8 _rsv[3];
2916
2917 __le16 tag;
2918 __le16 len;
2919 u8 enable;
2920 u8 _rsv2[3];
2921 } __packed req = {
2922 .band_idx = phy->mt76->band_idx,
2923 .tag = cpu_to_le16(UNI_BAND_CONFIG_RADIO_ENABLE),
2924 .len = cpu_to_le16(sizeof(req) - 4),
2925 .enable = enable,
2926 };
2927
2928 return mt76_mcu_send_msg(&phy->dev->mt76, MCU_UNI_CMD(BAND_CONFIG),
2929 &req, sizeof(req), true);
2930}
2931
2932static void
2933mt7925_mcu_build_sku(struct mt76_dev *dev, s8 *sku,
2934 struct mt76_power_limits *limits,
2935 enum nl80211_band band)
2936{
2937 int i, offset = sizeof(limits->cck);
2938
2939 memset(sku, 127, MT_CONNAC3_SKU_POWER_LIMIT);
2940
2941 if (band == NL80211_BAND_2GHZ) {
2942 /* cck */
2943 memcpy(sku, limits->cck, sizeof(limits->cck));
2944 }
2945
2946 /* ofdm */
2947 memcpy(&sku[offset], limits->ofdm, sizeof(limits->ofdm));
2948 offset += (sizeof(limits->ofdm) * 5);
2949
2950 /* ht */
2951 for (i = 0; i < 2; i++) {
2952 memcpy(&sku[offset], limits->mcs[i], 8);
2953 offset += 8;
2954 }
2955 sku[offset++] = limits->mcs[0][0];
2956
2957 /* vht */
2958 for (i = 0; i < ARRAY_SIZE(limits->mcs); i++) {
2959 memcpy(&sku[offset], limits->mcs[i],
2960 ARRAY_SIZE(limits->mcs[i]));
2961 offset += 12;
2962 }
2963
2964 /* he */
2965 for (i = 0; i < ARRAY_SIZE(limits->ru); i++) {
2966 memcpy(&sku[offset], limits->ru[i], ARRAY_SIZE(limits->ru[i]));
2967 offset += ARRAY_SIZE(limits->ru[i]);
2968 }
2969
2970 /* eht */
2971 for (i = 0; i < ARRAY_SIZE(limits->eht); i++) {
2972 memcpy(&sku[offset], limits->eht[i], ARRAY_SIZE(limits->eht[i]));
2973 offset += ARRAY_SIZE(limits->eht[i]);
2974 }
2975}
2976
2977static int
2978mt7925_mcu_rate_txpower_band(struct mt76_phy *phy,
2979 enum nl80211_band band)
2980{
2981 int tx_power, n_chan, last_ch, err = 0, idx = 0;
2982 int i, sku_len, batch_size, batch_len = 3;
2983 struct mt76_dev *dev = phy->dev;
2984 static const u8 chan_list_2ghz[] = {
2985 1, 2, 3, 4, 5, 6, 7,
2986 8, 9, 10, 11, 12, 13, 14
2987 };
2988 static const u8 chan_list_5ghz[] = {
2989 36, 38, 40, 42, 44, 46, 48,
2990 50, 52, 54, 56, 58, 60, 62,
2991 64, 100, 102, 104, 106, 108, 110,
2992 112, 114, 116, 118, 120, 122, 124,
2993 126, 128, 132, 134, 136, 138, 140,
2994 142, 144, 149, 151, 153, 155, 157,
2995 159, 161, 165, 167
2996 };
2997 static const u8 chan_list_6ghz[] = {
2998 1, 3, 5, 7, 9, 11, 13,
2999 15, 17, 19, 21, 23, 25, 27,
3000 29, 33, 35, 37, 39, 41, 43,
3001 45, 47, 49, 51, 53, 55, 57,
3002 59, 61, 65, 67, 69, 71, 73,
3003 75, 77, 79, 81, 83, 85, 87,
3004 89, 91, 93, 97, 99, 101, 103,
3005 105, 107, 109, 111, 113, 115, 117,
3006 119, 121, 123, 125, 129, 131, 133,
3007 135, 137, 139, 141, 143, 145, 147,
3008 149, 151, 153, 155, 157, 161, 163,
3009 165, 167, 169, 171, 173, 175, 177,
3010 179, 181, 183, 185, 187, 189, 193,
3011 195, 197, 199, 201, 203, 205, 207,
3012 209, 211, 213, 215, 217, 219, 221,
3013 225, 227, 229, 233
3014 };
3015 struct mt76_power_limits *limits;
3016 struct mt7925_sku_tlv *sku_tlbv;
3017 const u8 *ch_list;
3018
3019 sku_len = sizeof(*sku_tlbv);
3020 tx_power = 2 * phy->hw->conf.power_level;
3021 if (!tx_power)
3022 tx_power = 127;
3023
3024 if (band == NL80211_BAND_2GHZ) {
3025 n_chan = ARRAY_SIZE(chan_list_2ghz);
3026 ch_list = chan_list_2ghz;
3027 last_ch = chan_list_2ghz[ARRAY_SIZE(chan_list_2ghz) - 1];
3028 } else if (band == NL80211_BAND_6GHZ) {
3029 n_chan = ARRAY_SIZE(chan_list_6ghz);
3030 ch_list = chan_list_6ghz;
3031 last_ch = chan_list_6ghz[ARRAY_SIZE(chan_list_6ghz) - 1];
3032 } else {
3033 n_chan = ARRAY_SIZE(chan_list_5ghz);
3034 ch_list = chan_list_5ghz;
3035 last_ch = chan_list_5ghz[ARRAY_SIZE(chan_list_5ghz) - 1];
3036 }
3037 batch_size = DIV_ROUND_UP(n_chan, batch_len);
3038
3039 limits = devm_kmalloc(dev->dev, sizeof(*limits), GFP_KERNEL);
3040 if (!limits)
3041 return -ENOMEM;
3042
3043 sku_tlbv = devm_kmalloc(dev->dev, sku_len, GFP_KERNEL);
3044 if (!sku_tlbv) {
3045 devm_kfree(dev->dev, limits);
3046 return -ENOMEM;
3047 }
3048
3049 for (i = 0; i < batch_size; i++) {
3050 struct mt7925_tx_power_limit_tlv *tx_power_tlv;
3051 int j, msg_len, num_ch;
3052 struct sk_buff *skb;
3053
3054 num_ch = i == batch_size - 1 ? n_chan % batch_len : batch_len;
3055 msg_len = sizeof(*tx_power_tlv) + num_ch * sku_len;
3056 skb = mt76_mcu_msg_alloc(dev, NULL, msg_len);
3057 if (!skb) {
3058 err = -ENOMEM;
3059 goto out;
3060 }
3061
3062 tx_power_tlv = (struct mt7925_tx_power_limit_tlv *)
3063 skb_put(skb, sizeof(*tx_power_tlv));
3064
3065 BUILD_BUG_ON(sizeof(dev->alpha2) > sizeof(tx_power_tlv->alpha2));
3066 memcpy(tx_power_tlv->alpha2, dev->alpha2, sizeof(dev->alpha2));
3067 tx_power_tlv->n_chan = num_ch;
3068 tx_power_tlv->tag = cpu_to_le16(0x1);
3069 tx_power_tlv->len = cpu_to_le16(sizeof(*tx_power_tlv));
3070
3071 switch (band) {
3072 case NL80211_BAND_2GHZ:
3073 tx_power_tlv->band = 1;
3074 break;
3075 case NL80211_BAND_6GHZ:
3076 tx_power_tlv->band = 3;
3077 break;
3078 default:
3079 tx_power_tlv->band = 2;
3080 break;
3081 }
3082
3083 for (j = 0; j < num_ch; j++, idx++) {
3084 struct ieee80211_channel chan = {
3085 .hw_value = ch_list[idx],
3086 .band = band,
3087 };
3088 s8 reg_power, sar_power;
3089
3090 reg_power = mt76_connac_get_ch_power(phy, &chan,
3091 tx_power);
3092 sar_power = mt76_get_sar_power(phy, &chan, reg_power);
3093
3094 mt76_get_rate_power_limits(phy, &chan, limits,
3095 sar_power);
3096
3097 tx_power_tlv->last_msg = ch_list[idx] == last_ch;
3098 sku_tlbv->channel = ch_list[idx];
3099
3100 mt7925_mcu_build_sku(dev, sku_tlbv->pwr_limit,
3101 limits, band);
3102 skb_put_data(skb, sku_tlbv, sku_len);
3103 }
3104 err = mt76_mcu_skb_send_msg(dev, skb,
3105 MCU_UNI_CMD(SET_POWER_LIMIT),
3106 true);
3107 if (err < 0)
3108 goto out;
3109 }
3110
3111out:
3112 devm_kfree(dev->dev, sku_tlbv);
3113 devm_kfree(dev->dev, limits);
3114 return err;
3115}
3116
3117int mt7925_mcu_set_rate_txpower(struct mt76_phy *phy)
3118{
3119 int err;
3120
3121 if (phy->cap.has_2ghz) {
3122 err = mt7925_mcu_rate_txpower_band(phy,
3123 NL80211_BAND_2GHZ);
3124 if (err < 0)
3125 return err;
3126 }
3127
3128 if (phy->cap.has_5ghz) {
3129 err = mt7925_mcu_rate_txpower_band(phy,
3130 NL80211_BAND_5GHZ);
3131 if (err < 0)
3132 return err;
3133 }
3134
3135 if (phy->cap.has_6ghz) {
3136 err = mt7925_mcu_rate_txpower_band(phy,
3137 NL80211_BAND_6GHZ);
3138 if (err < 0)
3139 return err;
3140 }
3141
3142 return 0;
3143}
3144
3145int mt7925_mcu_set_rxfilter(struct mt792x_dev *dev, u32 fif,
3146 u8 bit_op, u32 bit_map)
3147{
3148 struct mt792x_phy *phy = &dev->phy;
3149 struct {
3150 u8 band_idx;
3151 u8 rsv1[3];
3152
3153 __le16 tag;
3154 __le16 len;
3155 u8 mode;
3156 u8 rsv2[3];
3157 __le32 fif;
3158 __le32 bit_map; /* bit_* for bitmap update */
3159 u8 bit_op;
3160 u8 pad[51];
3161 } __packed req = {
3162 .band_idx = phy->mt76->band_idx,
3163 .tag = cpu_to_le16(UNI_BAND_CONFIG_SET_MAC80211_RX_FILTER),
3164 .len = cpu_to_le16(sizeof(req) - 4),
3165
3166 .mode = fif ? 0 : 1,
3167 .fif = cpu_to_le32(fif),
3168 .bit_map = cpu_to_le32(bit_map),
3169 .bit_op = bit_op,
3170 };
3171
3172 return mt76_mcu_send_msg(&phy->dev->mt76, MCU_UNI_CMD(BAND_CONFIG),
3173 &req, sizeof(req), true);
3174}