Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/contrib/dev/mediatek/mt76/mt7925/mcu.c
107416 views
1
// SPDX-License-Identifier: BSD-3-Clause-Clear
2
/* Copyright (C) 2023 MediaTek Inc. */
3
4
#if defined(__FreeBSD__)
5
#define LINUXKPI_PARAM_PREFIX mt7925_
6
#endif
7
8
#include <linux/fs.h>
9
#include <linux/firmware.h>
10
#include "mt7925.h"
11
#include "regd.h"
12
#include "mcu.h"
13
#include "mac.h"
14
15
#define MT_STA_BFER BIT(0)
16
#define MT_STA_BFEE BIT(1)
17
18
int mt7925_mcu_parse_response(struct mt76_dev *mdev, int cmd,
19
struct sk_buff *skb, int seq)
20
{
21
int mcu_cmd = FIELD_GET(__MCU_CMD_FIELD_ID, cmd);
22
struct mt7925_mcu_rxd *rxd;
23
int ret = 0;
24
25
if (!skb) {
26
dev_err(mdev->dev, "Message %08x (seq %d) timeout\n", cmd, seq);
27
mt792x_reset(mdev);
28
29
return -ETIMEDOUT;
30
}
31
32
rxd = (struct mt7925_mcu_rxd *)skb->data;
33
if (seq != rxd->seq)
34
return -EAGAIN;
35
36
if (cmd == MCU_CMD(PATCH_SEM_CONTROL) ||
37
cmd == MCU_CMD(PATCH_FINISH_REQ)) {
38
skb_pull(skb, sizeof(*rxd) - 4);
39
ret = *skb->data;
40
} else if (cmd == MCU_UNI_CMD(DEV_INFO_UPDATE) ||
41
cmd == MCU_UNI_CMD(BSS_INFO_UPDATE) ||
42
cmd == MCU_UNI_CMD(STA_REC_UPDATE) ||
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
}
59
EXPORT_SYMBOL_GPL(mt7925_mcu_parse_response);
60
61
int 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
}
121
EXPORT_SYMBOL_GPL(mt7925_mcu_regval);
122
123
int mt7925_mcu_update_arp_filter(struct mt76_dev *dev,
124
struct ieee80211_bss_conf *link_conf)
125
{
126
struct mt792x_bss_conf *mconf = mt792x_link_conf_to_mconf(link_conf);
127
struct ieee80211_vif *mvif = link_conf->vif;
128
struct sk_buff *skb;
129
int i, len = min_t(int, mvif->cfg.arp_addr_cnt,
130
IEEE80211_BSS_ARP_ADDR_LIST_LEN);
131
struct {
132
struct {
133
u8 bss_idx;
134
u8 pad[3];
135
} __packed hdr;
136
struct mt7925_arpns_tlv arp;
137
} req = {
138
.hdr = {
139
.bss_idx = mconf->mt76.idx,
140
},
141
.arp = {
142
.tag = cpu_to_le16(UNI_OFFLOAD_OFFLOAD_ARP),
143
.len = cpu_to_le16(sizeof(req) - 4 + len * 2 * sizeof(__be32)),
144
.ips_num = len,
145
.enable = true,
146
},
147
};
148
149
skb = mt76_mcu_msg_alloc(dev, NULL, sizeof(req) + len * 2 * sizeof(__be32));
150
if (!skb)
151
return -ENOMEM;
152
153
skb_put_data(skb, &req, sizeof(req));
154
for (i = 0; i < len; i++) {
155
skb_put_data(skb, &mvif->cfg.arp_addr_list[i], sizeof(__be32));
156
skb_put_zero(skb, sizeof(__be32));
157
}
158
159
return mt76_mcu_skb_send_msg(dev, skb, MCU_UNI_CMD(OFFLOAD), true);
160
}
161
162
#ifdef CONFIG_PM
163
static int
164
mt7925_connac_mcu_set_wow_ctrl(struct mt76_phy *phy, struct ieee80211_vif *vif,
165
bool suspend, struct cfg80211_wowlan *wowlan)
166
{
167
struct mt76_vif_link *mvif = (struct mt76_vif_link *)vif->drv_priv;
168
struct ieee80211_scan_ies ies = {};
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, &ies);
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
217
static int
218
mt7925_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_link *mvif = (struct mt76_vif_link *)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
253
void 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
274
static void
275
mt7925_mcu_connection_loss_iter(void *priv, u8 *mac,
276
struct ieee80211_vif *vif)
277
{
278
struct mt76_vif_link *mvif = (struct mt76_vif_link *)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
291
static void
292
mt7925_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
305
static void
306
mt7925_mcu_roc_iter(void *priv, u8 *mac, struct ieee80211_vif *vif)
307
{
308
struct mt76_vif_link *mvif = (struct mt76_vif_link *)vif->drv_priv;
309
struct mt7925_roc_grant_tlv *grant = priv;
310
311
if (ieee80211_vif_is_mld(vif) && vif->type == NL80211_IFTYPE_STATION)
312
return;
313
314
if (mvif->idx != grant->bss_idx)
315
return;
316
317
mvif->band_idx = grant->dbdcband;
318
}
319
320
static void mt7925_mcu_roc_handle_grant(struct mt792x_dev *dev,
321
struct tlv *tlv)
322
{
323
struct ieee80211_hw *hw = dev->mt76.hw;
324
struct mt7925_roc_grant_tlv *grant;
325
int duration;
326
327
grant = (struct mt7925_roc_grant_tlv *)tlv;
328
329
/* should never happen */
330
WARN_ON_ONCE((le16_to_cpu(grant->tag) != UNI_EVENT_ROC_GRANT));
331
332
if (grant->reqtype == MT7925_ROC_REQ_ROC)
333
ieee80211_ready_on_channel(hw);
334
else if (grant->reqtype == MT7925_ROC_REQ_JOIN)
335
ieee80211_iterate_active_interfaces_atomic(hw,
336
IEEE80211_IFACE_ITER_RESUME_ALL,
337
mt7925_mcu_roc_iter, grant);
338
dev->phy.roc_grant = true;
339
wake_up(&dev->phy.roc_wait);
340
duration = le32_to_cpu(grant->max_interval);
341
mod_timer(&dev->phy.roc_timer,
342
jiffies + msecs_to_jiffies(duration));
343
}
344
345
static void
346
mt7925_mcu_handle_hif_ctrl_basic(struct mt792x_dev *dev, struct tlv *tlv)
347
{
348
struct mt7925_mcu_hif_ctrl_basic_tlv *basic;
349
350
basic = (struct mt7925_mcu_hif_ctrl_basic_tlv *)tlv;
351
352
if (basic->hifsuspend) {
353
dev->hif_idle = true;
354
if (!(basic->hif_tx_traffic_status == HIF_TRAFFIC_IDLE &&
355
basic->hif_rx_traffic_status == HIF_TRAFFIC_IDLE))
356
dev_info(dev->mt76.dev, "Hif traffic not idle.\n");
357
} else {
358
dev->hif_resumed = true;
359
}
360
wake_up(&dev->wait);
361
}
362
363
static void
364
mt7925_mcu_uni_hif_ctrl_event(struct mt792x_dev *dev, struct sk_buff *skb)
365
{
366
struct tlv *tlv;
367
u32 tlv_len;
368
369
skb_pull(skb, sizeof(struct mt7925_mcu_rxd) + 4);
370
tlv = (struct tlv *)skb->data;
371
tlv_len = skb->len;
372
373
while (tlv_len > 0 && le16_to_cpu(tlv->len) <= tlv_len) {
374
switch (le16_to_cpu(tlv->tag)) {
375
case UNI_EVENT_HIF_CTRL_BASIC:
376
mt7925_mcu_handle_hif_ctrl_basic(dev, tlv);
377
break;
378
default:
379
break;
380
}
381
tlv_len -= le16_to_cpu(tlv->len);
382
tlv = (struct tlv *)((char *)(tlv) + le16_to_cpu(tlv->len));
383
}
384
}
385
386
static void
387
mt7925_mcu_uni_roc_event(struct mt792x_dev *dev, struct sk_buff *skb)
388
{
389
struct tlv *tlv;
390
int i = 0;
391
392
skb_pull(skb, sizeof(struct mt7925_mcu_rxd) + 4);
393
394
while (i < skb->len) {
395
tlv = (struct tlv *)(skb->data + i);
396
397
switch (le16_to_cpu(tlv->tag)) {
398
case UNI_EVENT_ROC_GRANT:
399
mt7925_mcu_roc_handle_grant(dev, tlv);
400
break;
401
case UNI_EVENT_ROC_GRANT_SUB_LINK:
402
break;
403
}
404
405
i += le16_to_cpu(tlv->len);
406
}
407
}
408
409
static void
410
mt7925_mcu_scan_event(struct mt792x_dev *dev, struct sk_buff *skb)
411
{
412
struct mt76_phy *mphy = &dev->mt76.phy;
413
struct mt792x_phy *phy = mphy->priv;
414
415
spin_lock_bh(&dev->mt76.lock);
416
__skb_queue_tail(&phy->scan_event_list, skb);
417
spin_unlock_bh(&dev->mt76.lock);
418
419
ieee80211_queue_delayed_work(mphy->hw, &phy->scan_work,
420
MT792x_HW_SCAN_TIMEOUT);
421
}
422
423
static void
424
mt7925_mcu_tx_done_event(struct mt792x_dev *dev, struct sk_buff *skb)
425
{
426
#define UNI_EVENT_TX_DONE_MSG 0
427
#define UNI_EVENT_TX_DONE_RAW 1
428
struct mt7925_mcu_txs_event {
429
u8 ver;
430
u8 rsv[3];
431
u8 data[];
432
} __packed * txs;
433
struct tlv *tlv;
434
u32 tlv_len;
435
436
skb_pull(skb, sizeof(struct mt7925_mcu_rxd) + 4);
437
tlv = (struct tlv *)skb->data;
438
tlv_len = skb->len;
439
440
while (tlv_len > 0 && le16_to_cpu(tlv->len) <= tlv_len) {
441
switch (le16_to_cpu(tlv->tag)) {
442
case UNI_EVENT_TX_DONE_RAW:
443
txs = (struct mt7925_mcu_txs_event *)tlv->data;
444
mt7925_mac_add_txs(dev, txs->data);
445
break;
446
default:
447
break;
448
}
449
tlv_len -= le16_to_cpu(tlv->len);
450
tlv = (struct tlv *)((char *)(tlv) + le16_to_cpu(tlv->len));
451
}
452
}
453
454
static void
455
mt7925_mcu_rssi_monitor_iter(void *priv, u8 *mac,
456
struct ieee80211_vif *vif)
457
{
458
struct mt7925_uni_rssi_monitor_event *event = priv;
459
enum nl80211_cqm_rssi_threshold_event nl_event;
460
s32 rssi = le32_to_cpu(event->rssi);
461
462
if (vif->type != NL80211_IFTYPE_STATION)
463
return;
464
465
if (!(vif->driver_flags & IEEE80211_VIF_SUPPORTS_CQM_RSSI))
466
return;
467
468
if (rssi > vif->bss_conf.cqm_rssi_thold)
469
nl_event = NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH;
470
else
471
nl_event = NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW;
472
473
ieee80211_cqm_rssi_notify(vif, nl_event, rssi, GFP_KERNEL);
474
}
475
476
static void
477
mt7925_mcu_rssi_monitor_event(struct mt792x_dev *dev, struct sk_buff *skb)
478
{
479
struct tlv *tlv;
480
u32 tlv_len;
481
struct mt7925_uni_rssi_monitor_event *event;
482
483
skb_pull(skb, sizeof(struct mt7925_mcu_rxd) + 4);
484
tlv = (struct tlv *)skb->data;
485
tlv_len = skb->len;
486
487
while (tlv_len > 0 && le16_to_cpu(tlv->len) <= tlv_len) {
488
switch (le16_to_cpu(tlv->tag)) {
489
case UNI_EVENT_RSSI_MONITOR_INFO:
490
event = (struct mt7925_uni_rssi_monitor_event *)skb->data;
491
ieee80211_iterate_active_interfaces_atomic(dev->mt76.hw,
492
IEEE80211_IFACE_ITER_RESUME_ALL,
493
mt7925_mcu_rssi_monitor_iter,
494
event);
495
break;
496
default:
497
break;
498
}
499
tlv_len -= le16_to_cpu(tlv->len);
500
tlv = (struct tlv *)((char *)(tlv) + le16_to_cpu(tlv->len));
501
}
502
}
503
504
static void
505
mt7925_mcu_uni_debug_msg_event(struct mt792x_dev *dev, struct sk_buff *skb)
506
{
507
struct mt7925_uni_debug_msg {
508
__le16 tag;
509
__le16 len;
510
u8 fmt;
511
u8 rsv[3];
512
u8 id;
513
u8 type:3;
514
u8 nr_args:5;
515
union {
516
struct idxlog {
517
__le16 rsv;
518
__le32 ts;
519
__le32 idx;
520
u8 data[];
521
} __packed idx;
522
struct txtlog {
523
u8 len;
524
u8 rsv;
525
__le32 ts;
526
u8 data[];
527
} __packed txt;
528
};
529
} __packed * hdr;
530
531
skb_pull(skb, sizeof(struct mt7925_mcu_rxd) + 4);
532
hdr = (struct mt7925_uni_debug_msg *)skb->data;
533
534
if (hdr->id == 0x28) {
535
skb_pull(skb, offsetof(struct mt7925_uni_debug_msg, id));
536
wiphy_info(mt76_hw(dev)->wiphy, "%.*s", skb->len, skb->data);
537
return;
538
} else if (hdr->id != 0xa8) {
539
return;
540
}
541
542
if (hdr->type == 0) { /* idx log */
543
int i, ret, len = PAGE_SIZE - 1, nr_val;
544
struct page *page = dev_alloc_pages(get_order(len));
545
__le32 *val;
546
char *buf, *cur;
547
548
if (!page)
549
return;
550
551
buf = page_address(page);
552
cur = buf;
553
554
nr_val = (le16_to_cpu(hdr->len) - sizeof(*hdr)) / 4;
555
val = (__le32 *)hdr->idx.data;
556
for (i = 0; i < nr_val && len > 0; i++) {
557
ret = snprintf(cur, len, "0x%x,", le32_to_cpu(val[i]));
558
if (ret <= 0)
559
break;
560
561
cur += ret;
562
len -= ret;
563
}
564
if (cur > buf)
565
wiphy_info(mt76_hw(dev)->wiphy, "idx: 0x%X,%d,%s",
566
le32_to_cpu(hdr->idx.idx), nr_val, buf);
567
put_page(page);
568
} else if (hdr->type == 2) { /* str log */
569
wiphy_info(mt76_hw(dev)->wiphy, "%.*s", hdr->txt.len, hdr->txt.data);
570
}
571
}
572
573
static void
574
mt7925_mcu_uni_rx_unsolicited_event(struct mt792x_dev *dev,
575
struct sk_buff *skb)
576
{
577
struct mt7925_mcu_rxd *rxd;
578
579
rxd = (struct mt7925_mcu_rxd *)skb->data;
580
581
switch (rxd->eid) {
582
case MCU_UNI_EVENT_HIF_CTRL:
583
mt7925_mcu_uni_hif_ctrl_event(dev, skb);
584
break;
585
case MCU_UNI_EVENT_FW_LOG_2_HOST:
586
mt7925_mcu_uni_debug_msg_event(dev, skb);
587
break;
588
case MCU_UNI_EVENT_ROC:
589
mt7925_mcu_uni_roc_event(dev, skb);
590
break;
591
case MCU_UNI_EVENT_SCAN_DONE:
592
mt7925_mcu_scan_event(dev, skb);
593
return;
594
case MCU_UNI_EVENT_TX_DONE:
595
mt7925_mcu_tx_done_event(dev, skb);
596
break;
597
case MCU_UNI_EVENT_BSS_BEACON_LOSS:
598
mt7925_mcu_connection_loss_event(dev, skb);
599
break;
600
case MCU_UNI_EVENT_RSSI_MONITOR:
601
mt7925_mcu_rssi_monitor_event(dev, skb);
602
break;
603
case MCU_UNI_EVENT_COREDUMP:
604
dev->fw_assert = true;
605
mt76_connac_mcu_coredump_event(&dev->mt76, skb, &dev->coredump);
606
return;
607
default:
608
break;
609
}
610
dev_kfree_skb(skb);
611
}
612
613
void mt7925_mcu_rx_event(struct mt792x_dev *dev, struct sk_buff *skb)
614
{
615
struct mt7925_mcu_rxd *rxd = (struct mt7925_mcu_rxd *)skb->data;
616
617
if (skb_linearize(skb))
618
return;
619
620
if (rxd->option & MCU_UNI_CMD_UNSOLICITED_EVENT) {
621
mt7925_mcu_uni_rx_unsolicited_event(dev, skb);
622
return;
623
}
624
625
mt76_mcu_rx_event(&dev->mt76, skb);
626
}
627
628
static int
629
mt7925_mcu_sta_ba(struct mt76_dev *dev, struct mt76_vif_link *mvif,
630
struct ieee80211_ampdu_params *params,
631
bool enable, bool tx)
632
{
633
struct mt76_wcid *wcid = (struct mt76_wcid *)params->sta->drv_priv;
634
struct sta_rec_ba_uni *ba;
635
struct sk_buff *skb;
636
struct tlv *tlv;
637
int len;
638
639
len = sizeof(struct sta_req_hdr) + sizeof(*ba);
640
skb = __mt76_connac_mcu_alloc_sta_req(dev, mvif, wcid,
641
len);
642
if (IS_ERR(skb))
643
return PTR_ERR(skb);
644
645
tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_BA, sizeof(*ba));
646
647
ba = (struct sta_rec_ba_uni *)tlv;
648
ba->ba_type = tx ? MT_BA_TYPE_ORIGINATOR : MT_BA_TYPE_RECIPIENT;
649
ba->winsize = cpu_to_le16(params->buf_size);
650
ba->ssn = cpu_to_le16(params->ssn);
651
ba->ba_en = enable << params->tid;
652
ba->amsdu = params->amsdu;
653
ba->tid = params->tid;
654
655
return mt76_mcu_skb_send_msg(dev, skb,
656
MCU_UNI_CMD(STA_REC_UPDATE), true);
657
}
658
659
/** starec & wtbl **/
660
int mt7925_mcu_uni_tx_ba(struct mt792x_dev *dev,
661
struct ieee80211_ampdu_params *params,
662
bool enable)
663
{
664
struct mt792x_sta *msta = (struct mt792x_sta *)params->sta->drv_priv;
665
struct mt792x_vif *mvif = msta->vif;
666
667
if (enable && !params->amsdu)
668
msta->deflink.wcid.amsdu = false;
669
670
return mt7925_mcu_sta_ba(&dev->mt76, &mvif->bss_conf.mt76, params,
671
enable, true);
672
}
673
674
int mt7925_mcu_uni_rx_ba(struct mt792x_dev *dev,
675
struct ieee80211_ampdu_params *params,
676
bool enable)
677
{
678
struct mt792x_sta *msta = (struct mt792x_sta *)params->sta->drv_priv;
679
struct mt792x_vif *mvif = msta->vif;
680
681
return mt7925_mcu_sta_ba(&dev->mt76, &mvif->bss_conf.mt76, params,
682
enable, false);
683
}
684
685
static int mt7925_mcu_read_eeprom(struct mt792x_dev *dev, u32 offset, u8 *val)
686
{
687
struct {
688
u8 rsv[4];
689
690
__le16 tag;
691
__le16 len;
692
693
__le32 addr;
694
__le32 valid;
695
u8 data[MT7925_EEPROM_BLOCK_SIZE];
696
} __packed req = {
697
.tag = cpu_to_le16(1),
698
.len = cpu_to_le16(sizeof(req) - 4),
699
.addr = cpu_to_le32(round_down(offset,
700
MT7925_EEPROM_BLOCK_SIZE)),
701
};
702
struct evt {
703
u8 rsv[4];
704
705
__le16 tag;
706
__le16 len;
707
708
__le32 ver;
709
__le32 addr;
710
__le32 valid;
711
__le32 size;
712
__le32 magic_num;
713
__le32 type;
714
__le32 rsv1[4];
715
u8 data[32];
716
} __packed *res;
717
struct sk_buff *skb;
718
int ret;
719
720
ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_WM_UNI_CMD_QUERY(EFUSE_CTRL),
721
&req, sizeof(req), true, &skb);
722
if (ret)
723
return ret;
724
725
res = (struct evt *)skb->data;
726
*val = res->data[offset % MT7925_EEPROM_BLOCK_SIZE];
727
728
dev_kfree_skb(skb);
729
730
return 0;
731
}
732
733
static int mt7925_load_clc(struct mt792x_dev *dev, const char *fw_name)
734
{
735
const struct mt76_connac2_fw_trailer *hdr;
736
const struct mt76_connac2_fw_region *region;
737
const struct mt7925_clc *clc;
738
struct mt76_dev *mdev = &dev->mt76;
739
struct mt792x_phy *phy = &dev->phy;
740
const struct firmware *fw;
741
#if defined(__linux__)
742
u8 *clc_base = NULL, hw_encap = 0;
743
#elif defined(__FreeBSD__)
744
const u8 *clc_base = NULL;
745
u8 hw_encap = 0;
746
#endif
747
int ret, i, len, offset = 0;
748
749
dev->phy.clc_chan_conf = 0xff;
750
dev->regd_user = false;
751
if (!mt7925_regd_clc_supported(dev))
752
return 0;
753
754
if (mt76_is_mmio(&dev->mt76)) {
755
ret = mt7925_mcu_read_eeprom(dev, MT_EE_HW_TYPE, &hw_encap);
756
if (ret)
757
return ret;
758
hw_encap = u8_get_bits(hw_encap, MT_EE_HW_TYPE_ENCAP);
759
}
760
761
ret = request_firmware(&fw, fw_name, mdev->dev);
762
if (ret)
763
return ret;
764
765
if (!fw || !fw->data || fw->size < sizeof(*hdr)) {
766
dev_err(mdev->dev, "Invalid firmware\n");
767
ret = -EINVAL;
768
goto out;
769
}
770
771
hdr = (const void *)(fw->data + fw->size - sizeof(*hdr));
772
for (i = 0; i < hdr->n_region; i++) {
773
region = (const void *)((const u8 *)hdr -
774
(hdr->n_region - i) * sizeof(*region));
775
len = le32_to_cpu(region->len);
776
777
/* check if we have valid buffer size */
778
if (offset + len > fw->size) {
779
dev_err(mdev->dev, "Invalid firmware region\n");
780
ret = -EINVAL;
781
goto out;
782
}
783
784
if ((region->feature_set & FW_FEATURE_NON_DL) &&
785
region->type == FW_TYPE_CLC) {
786
#if defined(__linux__)
787
clc_base = (u8 *)(fw->data + offset);
788
#elif defined(__FreeBSD__)
789
clc_base = (const u8 *)(fw->data + offset);
790
#endif
791
break;
792
}
793
offset += len;
794
}
795
796
if (!clc_base)
797
goto out;
798
799
for (offset = 0; offset < len; offset += le32_to_cpu(clc->len)) {
800
clc = (const struct mt7925_clc *)(clc_base + offset);
801
802
if (clc->idx >= ARRAY_SIZE(phy->clc))
803
break;
804
805
/* do not init buf again if chip reset triggered */
806
if (phy->clc[clc->idx])
807
continue;
808
809
/* header content sanity */
810
if ((clc->idx == MT792x_CLC_BE_CTRL &&
811
u8_get_bits(clc->t2.type, MT_EE_HW_TYPE_ENCAP) != hw_encap) ||
812
u8_get_bits(clc->t0.type, MT_EE_HW_TYPE_ENCAP) != hw_encap)
813
continue;
814
815
phy->clc[clc->idx] = devm_kmemdup(mdev->dev, clc,
816
le32_to_cpu(clc->len),
817
GFP_KERNEL);
818
819
if (!phy->clc[clc->idx]) {
820
ret = -ENOMEM;
821
goto out;
822
}
823
}
824
825
ret = mt7925_regd_init(phy);
826
out:
827
release_firmware(fw);
828
829
return ret;
830
}
831
832
int mt7925_mcu_fw_log_2_host(struct mt792x_dev *dev, u8 ctrl)
833
{
834
struct {
835
u8 _rsv[4];
836
837
__le16 tag;
838
__le16 len;
839
u8 ctrl;
840
u8 interval;
841
u8 _rsv2[2];
842
} __packed req = {
843
.tag = cpu_to_le16(UNI_WSYS_CONFIG_FW_LOG_CTRL),
844
.len = cpu_to_le16(sizeof(req) - 4),
845
.ctrl = ctrl,
846
};
847
int ret;
848
849
ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_UNI_CMD(WSYS_CONFIG),
850
&req, sizeof(req), true, NULL);
851
return ret;
852
}
853
854
int mt7925_mcu_get_temperature(struct mt792x_phy *phy)
855
{
856
struct {
857
u8 _rsv[4];
858
859
__le16 tag;
860
__le16 len;
861
u8 _rsv2[4];
862
} __packed req = {
863
.tag = cpu_to_le16(0x0),
864
.len = cpu_to_le16(sizeof(req) - 4),
865
};
866
struct mt7925_thermal_evt {
867
u8 rsv[4];
868
__le32 temperature;
869
} __packed * evt;
870
struct mt792x_dev *dev = phy->dev;
871
int temperature, ret;
872
struct sk_buff *skb;
873
874
ret = mt76_mcu_send_and_get_msg(&dev->mt76,
875
MCU_WM_UNI_CMD_QUERY(THERMAL),
876
&req, sizeof(req), true, &skb);
877
if (ret)
878
return ret;
879
880
skb_pull(skb, 4 + sizeof(struct tlv));
881
evt = (struct mt7925_thermal_evt *)skb->data;
882
883
temperature = le32_to_cpu(evt->temperature);
884
885
dev_kfree_skb(skb);
886
887
return temperature;
888
}
889
890
static void
891
mt7925_mcu_parse_phy_cap(struct mt792x_dev *dev, char *data)
892
{
893
struct mt76_phy *mphy = &dev->mt76.phy;
894
struct mt76_dev *mdev = mphy->dev;
895
struct mt7925_mcu_phy_cap {
896
u8 ht;
897
u8 vht;
898
u8 _5g;
899
u8 max_bw;
900
u8 nss;
901
u8 dbdc;
902
u8 tx_ldpc;
903
u8 rx_ldpc;
904
u8 tx_stbc;
905
u8 rx_stbc;
906
u8 hw_path;
907
u8 he;
908
u8 eht;
909
} __packed * cap;
910
enum {
911
WF0_24G,
912
WF0_5G
913
};
914
915
cap = (struct mt7925_mcu_phy_cap *)data;
916
917
mdev->phy.antenna_mask = BIT(cap->nss) - 1;
918
mdev->phy.chainmask = mdev->phy.antenna_mask;
919
mdev->phy.cap.has_2ghz = cap->hw_path & BIT(WF0_24G);
920
mdev->phy.cap.has_5ghz = cap->hw_path & BIT(WF0_5G);
921
}
922
923
static void
924
mt7925_mcu_parse_eml_cap(struct mt792x_dev *dev, char *data)
925
{
926
struct mt7925_mcu_eml_cap {
927
u8 rsv[4];
928
__le16 eml_cap;
929
u8 rsv2[6];
930
} __packed * cap;
931
932
cap = (struct mt7925_mcu_eml_cap *)data;
933
934
dev->phy.eml_cap = le16_to_cpu(cap->eml_cap);
935
}
936
937
static int
938
mt7925_mcu_get_nic_capability(struct mt792x_dev *dev)
939
{
940
struct mt76_phy *mphy = &dev->mt76.phy;
941
struct {
942
u8 _rsv[4];
943
944
__le16 tag;
945
__le16 len;
946
} __packed req = {
947
.tag = cpu_to_le16(UNI_CHIP_CONFIG_NIC_CAPA),
948
.len = cpu_to_le16(sizeof(req) - 4),
949
};
950
struct mt76_connac_cap_hdr {
951
__le16 n_element;
952
u8 rsv[2];
953
} __packed * hdr;
954
struct sk_buff *skb;
955
int ret, i;
956
957
ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_UNI_CMD(CHIP_CONFIG),
958
&req, sizeof(req), true, &skb);
959
if (ret)
960
return ret;
961
962
hdr = (struct mt76_connac_cap_hdr *)skb->data;
963
if (skb->len < sizeof(*hdr)) {
964
ret = -EINVAL;
965
goto out;
966
}
967
968
skb_pull(skb, sizeof(*hdr));
969
970
for (i = 0; i < le16_to_cpu(hdr->n_element); i++) {
971
struct tlv *tlv = (struct tlv *)skb->data;
972
int len;
973
974
if (skb->len < sizeof(*tlv))
975
break;
976
977
len = le16_to_cpu(tlv->len);
978
if (skb->len < len)
979
break;
980
981
switch (le16_to_cpu(tlv->tag)) {
982
case MT_NIC_CAP_6G:
983
mphy->cap.has_6ghz = !!tlv->data[0];
984
break;
985
case MT_NIC_CAP_MAC_ADDR:
986
memcpy(mphy->macaddr, (void *)tlv->data, ETH_ALEN);
987
break;
988
case MT_NIC_CAP_PHY:
989
mt7925_mcu_parse_phy_cap(dev, tlv->data);
990
break;
991
case MT_NIC_CAP_CHIP_CAP:
992
dev->phy.chip_cap = le64_to_cpu(*(__le64 *)tlv->data);
993
break;
994
case MT_NIC_CAP_EML_CAP:
995
mt7925_mcu_parse_eml_cap(dev, tlv->data);
996
break;
997
default:
998
break;
999
}
1000
skb_pull(skb, len);
1001
}
1002
out:
1003
dev_kfree_skb(skb);
1004
return ret;
1005
}
1006
1007
int mt7925_mcu_chip_config(struct mt792x_dev *dev, const char *cmd)
1008
{
1009
u16 len = strlen(cmd) + 1;
1010
struct {
1011
u8 _rsv[4];
1012
__le16 tag;
1013
__le16 len;
1014
struct mt76_connac_config config;
1015
} __packed req = {
1016
.tag = cpu_to_le16(UNI_CHIP_CONFIG_CHIP_CFG),
1017
.len = cpu_to_le16(sizeof(req) - 4),
1018
.config = {
1019
.resp_type = 0,
1020
.type = 0,
1021
.data_size = cpu_to_le16(len),
1022
},
1023
};
1024
1025
memcpy(req.config.data, cmd, len);
1026
1027
return mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD(CHIP_CONFIG),
1028
&req, sizeof(req), false);
1029
}
1030
1031
int mt7925_mcu_set_deep_sleep(struct mt792x_dev *dev, bool enable)
1032
{
1033
char cmd[16];
1034
1035
snprintf(cmd, sizeof(cmd), "KeepFullPwr %d", !enable);
1036
1037
return mt7925_mcu_chip_config(dev, cmd);
1038
}
1039
EXPORT_SYMBOL_GPL(mt7925_mcu_set_deep_sleep);
1040
1041
int mt7925_mcu_set_thermal_protect(struct mt792x_dev *dev)
1042
{
1043
char cmd[64];
1044
int ret = 0;
1045
1046
snprintf(cmd, sizeof(cmd), "ThermalProtGband %d %d %d %d %d %d %d %d %d %d",
1047
0, 100, 90, 80, 30, 1, 1, 115, 105, 5);
1048
ret = mt7925_mcu_chip_config(dev, cmd);
1049
1050
snprintf(cmd, sizeof(cmd), "ThermalProtAband %d %d %d %d %d %d %d %d %d %d",
1051
1, 100, 90, 80, 30, 1, 1, 115, 105, 5);
1052
ret |= mt7925_mcu_chip_config(dev, cmd);
1053
1054
return ret;
1055
}
1056
EXPORT_SYMBOL_GPL(mt7925_mcu_set_thermal_protect);
1057
1058
int mt7925_run_firmware(struct mt792x_dev *dev)
1059
{
1060
int err;
1061
1062
err = mt792x_load_firmware(dev);
1063
if (err)
1064
return err;
1065
1066
err = mt7925_mcu_get_nic_capability(dev);
1067
if (err)
1068
return err;
1069
1070
err = mt7925_load_clc(dev, mt792x_ram_name(dev));
1071
if (err)
1072
return err;
1073
set_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state);
1074
1075
return mt7925_mcu_fw_log_2_host(dev, 1);
1076
}
1077
EXPORT_SYMBOL_GPL(mt7925_run_firmware);
1078
1079
static void
1080
mt7925_mcu_sta_hdr_trans_tlv(struct sk_buff *skb,
1081
struct ieee80211_vif *vif,
1082
struct ieee80211_link_sta *link_sta)
1083
{
1084
struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
1085
struct sta_rec_hdr_trans *hdr_trans;
1086
struct mt76_wcid *wcid;
1087
struct tlv *tlv;
1088
1089
tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_HDR_TRANS, sizeof(*hdr_trans));
1090
hdr_trans = (struct sta_rec_hdr_trans *)tlv;
1091
hdr_trans->dis_rx_hdr_tran = true;
1092
1093
if (vif->type == NL80211_IFTYPE_STATION)
1094
hdr_trans->to_ds = true;
1095
else
1096
hdr_trans->from_ds = true;
1097
1098
if (link_sta) {
1099
struct mt792x_sta *msta = (struct mt792x_sta *)link_sta->sta->drv_priv;
1100
struct mt792x_link_sta *mlink;
1101
1102
mlink = mt792x_sta_to_link(msta, link_sta->link_id);
1103
wcid = &mlink->wcid;
1104
} else {
1105
wcid = &mvif->sta.deflink.wcid;
1106
}
1107
1108
if (!wcid)
1109
return;
1110
1111
hdr_trans->dis_rx_hdr_tran = !test_bit(MT_WCID_FLAG_HDR_TRANS, &wcid->flags);
1112
if (test_bit(MT_WCID_FLAG_4ADDR, &wcid->flags)) {
1113
hdr_trans->to_ds = true;
1114
hdr_trans->from_ds = true;
1115
}
1116
}
1117
1118
int mt7925_mcu_wtbl_update_hdr_trans(struct mt792x_dev *dev,
1119
struct ieee80211_vif *vif,
1120
struct ieee80211_sta *sta,
1121
int link_id)
1122
{
1123
struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
1124
struct ieee80211_link_sta *link_sta = sta ? &sta->deflink : NULL;
1125
struct mt792x_link_sta *mlink;
1126
struct mt792x_bss_conf *mconf;
1127
struct mt792x_sta *msta;
1128
struct sk_buff *skb;
1129
1130
msta = sta ? (struct mt792x_sta *)sta->drv_priv : &mvif->sta;
1131
1132
mlink = mt792x_sta_to_link(msta, link_id);
1133
link_sta = mt792x_sta_to_link_sta(vif, sta, link_id);
1134
mconf = mt792x_vif_to_link(mvif, link_id);
1135
1136
skb = __mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mconf->mt76,
1137
&mlink->wcid,
1138
MT7925_STA_UPDATE_MAX_SIZE);
1139
if (IS_ERR(skb))
1140
return PTR_ERR(skb);
1141
1142
/* starec hdr trans */
1143
mt7925_mcu_sta_hdr_trans_tlv(skb, vif, link_sta);
1144
return mt76_mcu_skb_send_msg(&dev->mt76, skb,
1145
MCU_WMWA_UNI_CMD(STA_REC_UPDATE), true);
1146
}
1147
1148
int mt7925_mcu_set_tx(struct mt792x_dev *dev,
1149
struct ieee80211_bss_conf *bss_conf)
1150
{
1151
#define MCU_EDCA_AC_PARAM 0
1152
#define WMM_AIFS_SET BIT(0)
1153
#define WMM_CW_MIN_SET BIT(1)
1154
#define WMM_CW_MAX_SET BIT(2)
1155
#define WMM_TXOP_SET BIT(3)
1156
#define WMM_PARAM_SET (WMM_AIFS_SET | WMM_CW_MIN_SET | \
1157
WMM_CW_MAX_SET | WMM_TXOP_SET)
1158
struct mt792x_bss_conf *mconf = mt792x_link_conf_to_mconf(bss_conf);
1159
struct {
1160
u8 bss_idx;
1161
u8 __rsv[3];
1162
} __packed hdr = {
1163
.bss_idx = mconf->mt76.idx,
1164
};
1165
struct sk_buff *skb;
1166
int len = sizeof(hdr) + IEEE80211_NUM_ACS * sizeof(struct edca);
1167
int ac;
1168
1169
skb = mt76_mcu_msg_alloc(&dev->mt76, NULL, len);
1170
if (!skb)
1171
return -ENOMEM;
1172
1173
skb_put_data(skb, &hdr, sizeof(hdr));
1174
1175
for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
1176
struct ieee80211_tx_queue_params *q = &mconf->queue_params[ac];
1177
struct edca *e;
1178
struct tlv *tlv;
1179
1180
tlv = mt76_connac_mcu_add_tlv(skb, MCU_EDCA_AC_PARAM, sizeof(*e));
1181
1182
e = (struct edca *)tlv;
1183
e->set = WMM_PARAM_SET;
1184
e->queue = ac;
1185
e->aifs = q->aifs;
1186
e->txop = cpu_to_le16(q->txop);
1187
1188
if (q->cw_min)
1189
e->cw_min = fls(q->cw_min);
1190
else
1191
e->cw_min = 5;
1192
1193
if (q->cw_max)
1194
e->cw_max = fls(q->cw_max);
1195
else
1196
e->cw_max = 10;
1197
}
1198
1199
return mt76_mcu_skb_send_msg(&dev->mt76, skb,
1200
MCU_UNI_CMD(EDCA_UPDATE), true);
1201
}
1202
1203
static int
1204
mt7925_mcu_sta_key_tlv(struct mt76_wcid *wcid,
1205
struct mt76_connac_sta_key_conf *sta_key_conf,
1206
struct sk_buff *skb,
1207
struct ieee80211_key_conf *key,
1208
enum set_key_cmd cmd,
1209
struct mt792x_sta *msta)
1210
{
1211
struct mt792x_vif *mvif = msta->vif;
1212
struct mt792x_bss_conf *mconf = mt792x_vif_to_link(mvif, wcid->link_id);
1213
struct sta_rec_sec_uni *sec;
1214
struct ieee80211_sta *sta;
1215
struct ieee80211_vif *vif;
1216
struct tlv *tlv;
1217
1218
sta = msta == &mvif->sta ?
1219
NULL :
1220
container_of((void *)msta, struct ieee80211_sta, drv_priv);
1221
vif = container_of((void *)mvif, struct ieee80211_vif, drv_priv);
1222
1223
tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_KEY_V3, sizeof(*sec));
1224
sec = (struct sta_rec_sec_uni *)tlv;
1225
sec->bss_idx = mconf->mt76.idx;
1226
sec->is_authenticator = 0;
1227
sec->mgmt_prot = 1; /* only used in MLO mode */
1228
sec->wlan_idx = (u8)wcid->idx;
1229
1230
if (sta) {
1231
struct ieee80211_link_sta *link_sta;
1232
1233
sec->tx_key = 1;
1234
sec->key_type = 1;
1235
link_sta = mt792x_sta_to_link_sta(vif, sta, wcid->link_id);
1236
1237
if (link_sta)
1238
memcpy(sec->peer_addr, link_sta->addr, ETH_ALEN);
1239
} else {
1240
struct ieee80211_bss_conf *link_conf;
1241
1242
link_conf = mt792x_vif_to_bss_conf(vif, wcid->link_id);
1243
1244
if (link_conf)
1245
memcpy(sec->peer_addr, link_conf->bssid, ETH_ALEN);
1246
}
1247
1248
if (cmd == SET_KEY) {
1249
u8 cipher;
1250
1251
sec->add = 1;
1252
cipher = mt7925_mcu_get_cipher(key->cipher);
1253
if (cipher == CONNAC3_CIPHER_NONE)
1254
return -EOPNOTSUPP;
1255
1256
if (cipher == CONNAC3_CIPHER_BIP_CMAC_128) {
1257
sec->cipher_id = CONNAC3_CIPHER_BIP_CMAC_128;
1258
sec->key_id = sta_key_conf->keyidx;
1259
sec->key_len = 32;
1260
memcpy(sec->key, sta_key_conf->key, 16);
1261
memcpy(sec->key + 16, key->key, 16);
1262
} else {
1263
sec->cipher_id = cipher;
1264
sec->key_id = key->keyidx;
1265
sec->key_len = key->keylen;
1266
memcpy(sec->key, key->key, key->keylen);
1267
1268
if (cipher == CONNAC3_CIPHER_TKIP) {
1269
/* Rx/Tx MIC keys are swapped */
1270
memcpy(sec->key + 16, key->key + 24, 8);
1271
memcpy(sec->key + 24, key->key + 16, 8);
1272
}
1273
1274
/* store key_conf for BIP batch update */
1275
if (cipher == CONNAC3_CIPHER_AES_CCMP) {
1276
memcpy(sta_key_conf->key, key->key, key->keylen);
1277
sta_key_conf->keyidx = key->keyidx;
1278
}
1279
}
1280
} else {
1281
sec->add = 0;
1282
}
1283
1284
return 0;
1285
}
1286
1287
int mt7925_mcu_add_key(struct mt76_dev *dev, struct ieee80211_vif *vif,
1288
struct mt76_connac_sta_key_conf *sta_key_conf,
1289
struct ieee80211_key_conf *key, int mcu_cmd,
1290
struct mt76_wcid *wcid, enum set_key_cmd cmd,
1291
struct mt792x_sta *msta)
1292
{
1293
struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
1294
struct mt792x_bss_conf *mconf = mt792x_vif_to_link(mvif, wcid->link_id);
1295
struct sk_buff *skb;
1296
int ret;
1297
1298
skb = __mt76_connac_mcu_alloc_sta_req(dev, &mconf->mt76, wcid,
1299
MT7925_STA_UPDATE_MAX_SIZE);
1300
if (IS_ERR(skb))
1301
return PTR_ERR(skb);
1302
1303
ret = mt7925_mcu_sta_key_tlv(wcid, sta_key_conf, skb, key, cmd, msta);
1304
if (ret)
1305
return ret;
1306
1307
return mt76_mcu_skb_send_msg(dev, skb, mcu_cmd, true);
1308
}
1309
1310
int mt7925_mcu_set_mlo_roc(struct mt792x_bss_conf *mconf, u16 sel_links,
1311
int duration, u8 token_id)
1312
{
1313
struct mt792x_vif *mvif = mconf->vif;
1314
struct ieee80211_vif *vif = container_of((void *)mvif,
1315
struct ieee80211_vif, drv_priv);
1316
struct ieee80211_bss_conf *link_conf;
1317
struct ieee80211_channel *chan;
1318
const u8 ch_band[] = {
1319
[NL80211_BAND_2GHZ] = 1,
1320
[NL80211_BAND_5GHZ] = 2,
1321
[NL80211_BAND_6GHZ] = 3,
1322
};
1323
enum mt7925_roc_req type;
1324
int center_ch, i = 0;
1325
bool is_AG_band = false;
1326
struct {
1327
u8 id;
1328
u8 bss_idx;
1329
u16 tag;
1330
struct mt792x_bss_conf *mconf;
1331
struct ieee80211_channel *chan;
1332
} links[2];
1333
1334
struct {
1335
struct {
1336
u8 rsv[4];
1337
} __packed hdr;
1338
struct roc_acquire_tlv roc[2];
1339
} __packed req = {
1340
.roc[0].tag = cpu_to_le16(UNI_ROC_NUM),
1341
.roc[0].len = cpu_to_le16(sizeof(struct roc_acquire_tlv)),
1342
.roc[1].tag = cpu_to_le16(UNI_ROC_NUM),
1343
.roc[1].len = cpu_to_le16(sizeof(struct roc_acquire_tlv))
1344
};
1345
1346
if (!mconf || hweight16(vif->valid_links) < 2 ||
1347
hweight16(sel_links) != 2)
1348
return -EPERM;
1349
1350
for (i = 0; i < ARRAY_SIZE(links); i++) {
1351
links[i].id = i ? __ffs(~BIT(mconf->link_id) & sel_links) :
1352
mconf->link_id;
1353
link_conf = mt792x_vif_to_bss_conf(vif, links[i].id);
1354
if (WARN_ON_ONCE(!link_conf))
1355
return -EPERM;
1356
1357
links[i].chan = link_conf->chanreq.oper.chan;
1358
if (WARN_ON_ONCE(!links[i].chan))
1359
return -EPERM;
1360
1361
links[i].mconf = mt792x_vif_to_link(mvif, links[i].id);
1362
links[i].tag = links[i].id == mconf->link_id ?
1363
UNI_ROC_ACQUIRE : UNI_ROC_SUB_LINK;
1364
1365
is_AG_band |= links[i].chan->band == NL80211_BAND_2GHZ;
1366
}
1367
1368
if (vif->cfg.eml_cap & IEEE80211_EML_CAP_EMLSR_SUPP)
1369
type = is_AG_band ? MT7925_ROC_REQ_MLSR_AG :
1370
MT7925_ROC_REQ_MLSR_AA;
1371
else
1372
type = MT7925_ROC_REQ_JOIN;
1373
1374
for (i = 0; i < ARRAY_SIZE(links) && i < hweight16(vif->active_links); i++) {
1375
if (WARN_ON_ONCE(!links[i].mconf || !links[i].chan))
1376
continue;
1377
1378
chan = links[i].chan;
1379
center_ch = ieee80211_frequency_to_channel(chan->center_freq);
1380
req.roc[i].len = cpu_to_le16(sizeof(struct roc_acquire_tlv));
1381
req.roc[i].tag = cpu_to_le16(links[i].tag);
1382
req.roc[i].tokenid = token_id;
1383
req.roc[i].reqtype = type;
1384
req.roc[i].maxinterval = cpu_to_le32(duration);
1385
req.roc[i].bss_idx = links[i].mconf->mt76.idx;
1386
req.roc[i].control_channel = chan->hw_value;
1387
req.roc[i].bw = CMD_CBW_20MHZ;
1388
req.roc[i].bw_from_ap = CMD_CBW_20MHZ;
1389
req.roc[i].center_chan = center_ch;
1390
req.roc[i].center_chan_from_ap = center_ch;
1391
req.roc[i].center_chan2 = 0;
1392
req.roc[i].center_chan2_from_ap = 0;
1393
1394
/* STR : 0xfe indicates BAND_ALL with enabling DBDC
1395
* EMLSR : 0xff indicates (BAND_AUTO) without DBDC
1396
*/
1397
req.roc[i].dbdcband = type == MT7925_ROC_REQ_JOIN ? 0xfe : 0xff;
1398
1399
if (chan->hw_value < center_ch)
1400
req.roc[i].sco = 1; /* SCA */
1401
else if (chan->hw_value > center_ch)
1402
req.roc[i].sco = 3; /* SCB */
1403
1404
req.roc[i].band = ch_band[chan->band];
1405
}
1406
1407
return mt76_mcu_send_msg(&mvif->phy->dev->mt76, MCU_UNI_CMD(ROC),
1408
&req, sizeof(req), true);
1409
}
1410
1411
int mt7925_mcu_set_roc(struct mt792x_phy *phy, struct mt792x_bss_conf *mconf,
1412
struct ieee80211_channel *chan, int duration,
1413
enum mt7925_roc_req type, u8 token_id)
1414
{
1415
int center_ch = ieee80211_frequency_to_channel(chan->center_freq);
1416
struct mt792x_dev *dev = phy->dev;
1417
struct {
1418
struct {
1419
u8 rsv[4];
1420
} __packed hdr;
1421
struct roc_acquire_tlv roc;
1422
} __packed req = {
1423
.roc = {
1424
.tag = cpu_to_le16(UNI_ROC_ACQUIRE),
1425
.len = cpu_to_le16(sizeof(struct roc_acquire_tlv)),
1426
.tokenid = token_id,
1427
.reqtype = type,
1428
.maxinterval = cpu_to_le32(duration),
1429
.bss_idx = mconf->mt76.idx,
1430
.control_channel = chan->hw_value,
1431
.bw = CMD_CBW_20MHZ,
1432
.bw_from_ap = CMD_CBW_20MHZ,
1433
.center_chan = center_ch,
1434
.center_chan_from_ap = center_ch,
1435
.dbdcband = 0xff, /* auto */
1436
},
1437
};
1438
1439
if (chan->hw_value < center_ch)
1440
req.roc.sco = 1; /* SCA */
1441
else if (chan->hw_value > center_ch)
1442
req.roc.sco = 3; /* SCB */
1443
1444
switch (chan->band) {
1445
case NL80211_BAND_6GHZ:
1446
req.roc.band = 3;
1447
break;
1448
case NL80211_BAND_5GHZ:
1449
req.roc.band = 2;
1450
break;
1451
default:
1452
req.roc.band = 1;
1453
break;
1454
}
1455
1456
return mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD(ROC),
1457
&req, sizeof(req), true);
1458
}
1459
1460
int mt7925_mcu_abort_roc(struct mt792x_phy *phy, struct mt792x_bss_conf *mconf,
1461
u8 token_id)
1462
{
1463
struct mt792x_dev *dev = phy->dev;
1464
struct {
1465
struct {
1466
u8 rsv[4];
1467
} __packed hdr;
1468
struct roc_abort_tlv {
1469
__le16 tag;
1470
__le16 len;
1471
u8 bss_idx;
1472
u8 tokenid;
1473
u8 dbdcband;
1474
u8 rsv[5];
1475
} __packed abort;
1476
} __packed req = {
1477
.abort = {
1478
.tag = cpu_to_le16(UNI_ROC_ABORT),
1479
.len = cpu_to_le16(sizeof(struct roc_abort_tlv)),
1480
.tokenid = token_id,
1481
.bss_idx = mconf->mt76.idx,
1482
.dbdcband = 0xff, /* auto*/
1483
},
1484
};
1485
1486
return mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD(ROC),
1487
&req, sizeof(req), true);
1488
}
1489
1490
int mt7925_mcu_set_eeprom(struct mt792x_dev *dev)
1491
{
1492
struct {
1493
u8 _rsv[4];
1494
1495
__le16 tag;
1496
__le16 len;
1497
u8 buffer_mode;
1498
u8 format;
1499
__le16 buf_len;
1500
} __packed req = {
1501
.tag = cpu_to_le16(UNI_EFUSE_BUFFER_MODE),
1502
.len = cpu_to_le16(sizeof(req) - 4),
1503
.buffer_mode = EE_MODE_EFUSE,
1504
.format = EE_FORMAT_WHOLE
1505
};
1506
1507
return mt76_mcu_send_and_get_msg(&dev->mt76, MCU_UNI_CMD(EFUSE_CTRL),
1508
&req, sizeof(req), true, NULL);
1509
}
1510
EXPORT_SYMBOL_GPL(mt7925_mcu_set_eeprom);
1511
1512
int mt7925_mcu_uni_bss_ps(struct mt792x_dev *dev,
1513
struct ieee80211_bss_conf *link_conf)
1514
{
1515
struct mt792x_bss_conf *mconf = mt792x_link_conf_to_mconf(link_conf);
1516
struct {
1517
struct {
1518
u8 bss_idx;
1519
u8 pad[3];
1520
} __packed hdr;
1521
struct ps_tlv {
1522
__le16 tag;
1523
__le16 len;
1524
u8 ps_state; /* 0: device awake
1525
* 1: static power save
1526
* 2: dynamic power saving
1527
* 3: enter TWT power saving
1528
* 4: leave TWT power saving
1529
*/
1530
u8 pad[3];
1531
} __packed ps;
1532
} __packed ps_req = {
1533
.hdr = {
1534
.bss_idx = mconf->mt76.idx,
1535
},
1536
.ps = {
1537
.tag = cpu_to_le16(UNI_BSS_INFO_PS),
1538
.len = cpu_to_le16(sizeof(struct ps_tlv)),
1539
.ps_state = link_conf->vif->cfg.ps ? 2 : 0,
1540
},
1541
};
1542
1543
if (link_conf->vif->type != NL80211_IFTYPE_STATION)
1544
return -EOPNOTSUPP;
1545
1546
return mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD(BSS_INFO_UPDATE),
1547
&ps_req, sizeof(ps_req), true);
1548
}
1549
1550
int
1551
mt7925_mcu_uni_bss_bcnft(struct mt792x_dev *dev,
1552
struct ieee80211_bss_conf *link_conf, bool enable)
1553
{
1554
struct mt792x_bss_conf *mconf = mt792x_link_conf_to_mconf(link_conf);
1555
struct {
1556
struct {
1557
u8 bss_idx;
1558
u8 pad[3];
1559
} __packed hdr;
1560
struct bcnft_tlv {
1561
__le16 tag;
1562
__le16 len;
1563
__le16 bcn_interval;
1564
u8 dtim_period;
1565
u8 bmc_delivered_ac;
1566
u8 bmc_triggered_ac;
1567
u8 pad[3];
1568
} __packed bcnft;
1569
} __packed bcnft_req = {
1570
.hdr = {
1571
.bss_idx = mconf->mt76.idx,
1572
},
1573
.bcnft = {
1574
.tag = cpu_to_le16(UNI_BSS_INFO_BCNFT),
1575
.len = cpu_to_le16(sizeof(struct bcnft_tlv)),
1576
.bcn_interval = cpu_to_le16(link_conf->beacon_int),
1577
.dtim_period = link_conf->dtim_period,
1578
},
1579
};
1580
1581
if (link_conf->vif->type != NL80211_IFTYPE_STATION)
1582
return 0;
1583
1584
return mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD(BSS_INFO_UPDATE),
1585
&bcnft_req, sizeof(bcnft_req), true);
1586
}
1587
1588
int
1589
mt7925_mcu_set_bss_pm(struct mt792x_dev *dev,
1590
struct ieee80211_bss_conf *link_conf,
1591
bool enable)
1592
{
1593
struct mt792x_bss_conf *mconf = mt792x_link_conf_to_mconf(link_conf);
1594
struct {
1595
struct {
1596
u8 bss_idx;
1597
u8 pad[3];
1598
} __packed hdr;
1599
struct bcnft_tlv {
1600
__le16 tag;
1601
__le16 len;
1602
__le16 bcn_interval;
1603
u8 dtim_period;
1604
u8 bmc_delivered_ac;
1605
u8 bmc_triggered_ac;
1606
u8 pad[3];
1607
} __packed enable;
1608
} req = {
1609
.hdr = {
1610
.bss_idx = mconf->mt76.idx,
1611
},
1612
.enable = {
1613
.tag = cpu_to_le16(UNI_BSS_INFO_BCNFT),
1614
.len = cpu_to_le16(sizeof(struct bcnft_tlv)),
1615
.dtim_period = link_conf->dtim_period,
1616
.bcn_interval = cpu_to_le16(link_conf->beacon_int),
1617
},
1618
};
1619
struct {
1620
struct {
1621
u8 bss_idx;
1622
u8 pad[3];
1623
} __packed hdr;
1624
struct pm_disable {
1625
__le16 tag;
1626
__le16 len;
1627
} __packed disable;
1628
} req1 = {
1629
.hdr = {
1630
.bss_idx = mconf->mt76.idx,
1631
},
1632
.disable = {
1633
.tag = cpu_to_le16(UNI_BSS_INFO_PM_DISABLE),
1634
.len = cpu_to_le16(sizeof(struct pm_disable))
1635
},
1636
};
1637
int err;
1638
1639
err = mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD(BSS_INFO_UPDATE),
1640
&req1, sizeof(req1), true);
1641
if (err < 0 || !enable)
1642
return err;
1643
1644
return mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD(BSS_INFO_UPDATE),
1645
&req, sizeof(req), true);
1646
}
1647
1648
static void
1649
mt7925_mcu_sta_he_tlv(struct sk_buff *skb, struct ieee80211_link_sta *link_sta)
1650
{
1651
if (!link_sta->he_cap.has_he)
1652
return;
1653
1654
mt76_connac_mcu_sta_he_tlv_v2(skb, link_sta->sta);
1655
}
1656
1657
static void
1658
mt7925_mcu_sta_he_6g_tlv(struct sk_buff *skb,
1659
struct ieee80211_link_sta *link_sta)
1660
{
1661
struct sta_rec_he_6g_capa *he_6g;
1662
struct tlv *tlv;
1663
1664
if (!link_sta->he_6ghz_capa.capa)
1665
return;
1666
1667
tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_HE_6G, sizeof(*he_6g));
1668
1669
he_6g = (struct sta_rec_he_6g_capa *)tlv;
1670
he_6g->capa = link_sta->he_6ghz_capa.capa;
1671
}
1672
1673
static void
1674
mt7925_mcu_sta_eht_tlv(struct sk_buff *skb, struct ieee80211_link_sta *link_sta)
1675
{
1676
struct ieee80211_eht_mcs_nss_supp *mcs_map;
1677
struct ieee80211_eht_cap_elem_fixed *elem;
1678
struct sta_rec_eht *eht;
1679
struct tlv *tlv;
1680
1681
if (!link_sta->eht_cap.has_eht)
1682
return;
1683
1684
mcs_map = &link_sta->eht_cap.eht_mcs_nss_supp;
1685
elem = &link_sta->eht_cap.eht_cap_elem;
1686
1687
tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_EHT, sizeof(*eht));
1688
1689
eht = (struct sta_rec_eht *)tlv;
1690
eht->tid_bitmap = 0xff;
1691
eht->mac_cap = cpu_to_le16(*(u16 *)elem->mac_cap_info);
1692
eht->phy_cap = cpu_to_le64(*(u64 *)elem->phy_cap_info);
1693
eht->phy_cap_ext = cpu_to_le64(elem->phy_cap_info[8]);
1694
1695
if (link_sta->bandwidth == IEEE80211_STA_RX_BW_20)
1696
memcpy(eht->mcs_map_bw20, &mcs_map->only_20mhz, sizeof(eht->mcs_map_bw20));
1697
memcpy(eht->mcs_map_bw80, &mcs_map->bw._80, sizeof(eht->mcs_map_bw80));
1698
memcpy(eht->mcs_map_bw160, &mcs_map->bw._160, sizeof(eht->mcs_map_bw160));
1699
}
1700
1701
static void
1702
mt7925_mcu_sta_ht_tlv(struct sk_buff *skb, struct ieee80211_link_sta *link_sta)
1703
{
1704
struct sta_rec_ht *ht;
1705
struct tlv *tlv;
1706
1707
if (!link_sta->ht_cap.ht_supported)
1708
return;
1709
1710
tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_HT, sizeof(*ht));
1711
1712
ht = (struct sta_rec_ht *)tlv;
1713
ht->ht_cap = cpu_to_le16(link_sta->ht_cap.cap);
1714
}
1715
1716
static void
1717
mt7925_mcu_sta_vht_tlv(struct sk_buff *skb, struct ieee80211_link_sta *link_sta)
1718
{
1719
struct sta_rec_vht *vht;
1720
struct tlv *tlv;
1721
1722
/* For 6G band, this tlv is necessary to let hw work normally */
1723
if (!link_sta->he_6ghz_capa.capa && !link_sta->vht_cap.vht_supported)
1724
return;
1725
1726
tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_VHT, sizeof(*vht));
1727
1728
vht = (struct sta_rec_vht *)tlv;
1729
vht->vht_cap = cpu_to_le32(link_sta->vht_cap.cap);
1730
vht->vht_rx_mcs_map = link_sta->vht_cap.vht_mcs.rx_mcs_map;
1731
vht->vht_tx_mcs_map = link_sta->vht_cap.vht_mcs.tx_mcs_map;
1732
}
1733
1734
static void
1735
mt7925_mcu_sta_amsdu_tlv(struct sk_buff *skb,
1736
struct ieee80211_vif *vif,
1737
struct ieee80211_link_sta *link_sta)
1738
{
1739
struct mt792x_sta *msta = (struct mt792x_sta *)link_sta->sta->drv_priv;
1740
struct mt792x_link_sta *mlink;
1741
struct sta_rec_amsdu *amsdu;
1742
struct tlv *tlv;
1743
1744
if (vif->type != NL80211_IFTYPE_STATION &&
1745
vif->type != NL80211_IFTYPE_AP)
1746
return;
1747
1748
if (!link_sta->agg.max_amsdu_len)
1749
return;
1750
1751
tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_HW_AMSDU, sizeof(*amsdu));
1752
amsdu = (struct sta_rec_amsdu *)tlv;
1753
amsdu->max_amsdu_num = 8;
1754
amsdu->amsdu_en = true;
1755
1756
mlink = mt792x_sta_to_link(msta, link_sta->link_id);
1757
mlink->wcid.amsdu = true;
1758
1759
switch (link_sta->agg.max_amsdu_len) {
1760
case IEEE80211_MAX_MPDU_LEN_VHT_11454:
1761
amsdu->max_mpdu_size =
1762
IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454;
1763
return;
1764
case IEEE80211_MAX_MPDU_LEN_HT_7935:
1765
case IEEE80211_MAX_MPDU_LEN_VHT_7991:
1766
amsdu->max_mpdu_size = IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_7991;
1767
return;
1768
default:
1769
amsdu->max_mpdu_size = IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_3895;
1770
return;
1771
}
1772
}
1773
1774
static void
1775
mt7925_mcu_sta_phy_tlv(struct sk_buff *skb,
1776
struct ieee80211_vif *vif,
1777
struct ieee80211_link_sta *link_sta)
1778
{
1779
struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
1780
struct ieee80211_bss_conf *link_conf;
1781
struct cfg80211_chan_def *chandef;
1782
struct mt792x_bss_conf *mconf;
1783
struct sta_rec_phy *phy;
1784
struct tlv *tlv;
1785
u8 af = 0, mm = 0;
1786
1787
link_conf = mt792x_vif_to_bss_conf(vif, link_sta->link_id);
1788
mconf = mt792x_vif_to_link(mvif, link_sta->link_id);
1789
chandef = mconf->mt76.ctx ? &mconf->mt76.ctx->def :
1790
&link_conf->chanreq.oper;
1791
1792
tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_PHY, sizeof(*phy));
1793
phy = (struct sta_rec_phy *)tlv;
1794
phy->phy_type = mt76_connac_get_phy_mode_v2(mvif->phy->mt76, vif,
1795
chandef->chan->band,
1796
link_sta);
1797
phy->basic_rate = cpu_to_le16((u16)link_conf->basic_rates);
1798
if (link_sta->ht_cap.ht_supported) {
1799
af = link_sta->ht_cap.ampdu_factor;
1800
mm = link_sta->ht_cap.ampdu_density;
1801
}
1802
1803
if (link_sta->vht_cap.vht_supported) {
1804
u8 vht_af = FIELD_GET(IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK,
1805
link_sta->vht_cap.cap);
1806
1807
af = max_t(u8, af, vht_af);
1808
}
1809
1810
if (link_sta->he_6ghz_capa.capa) {
1811
af = le16_get_bits(link_sta->he_6ghz_capa.capa,
1812
IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP);
1813
mm = le16_get_bits(link_sta->he_6ghz_capa.capa,
1814
IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START);
1815
}
1816
1817
phy->ampdu = FIELD_PREP(IEEE80211_HT_AMPDU_PARM_FACTOR, af) |
1818
FIELD_PREP(IEEE80211_HT_AMPDU_PARM_DENSITY, mm);
1819
phy->max_ampdu_len = af;
1820
}
1821
1822
static void
1823
mt7925_mcu_sta_state_v2_tlv(struct mt76_phy *mphy, struct sk_buff *skb,
1824
struct ieee80211_link_sta *link_sta,
1825
struct ieee80211_vif *vif,
1826
u8 rcpi, u8 sta_state)
1827
{
1828
struct sta_rec_state_v2 {
1829
__le16 tag;
1830
__le16 len;
1831
u8 state;
1832
u8 rsv[3];
1833
__le32 flags;
1834
u8 vht_opmode;
1835
u8 action;
1836
u8 rsv2[2];
1837
} __packed * state;
1838
struct tlv *tlv;
1839
1840
tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_STATE, sizeof(*state));
1841
state = (struct sta_rec_state_v2 *)tlv;
1842
state->state = sta_state;
1843
1844
if (link_sta->vht_cap.vht_supported) {
1845
state->vht_opmode = link_sta->bandwidth;
1846
state->vht_opmode |= link_sta->rx_nss <<
1847
IEEE80211_OPMODE_NOTIF_RX_NSS_SHIFT;
1848
}
1849
}
1850
1851
static void
1852
mt7925_mcu_sta_rate_ctrl_tlv(struct sk_buff *skb,
1853
struct ieee80211_vif *vif,
1854
struct ieee80211_link_sta *link_sta)
1855
{
1856
struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
1857
struct ieee80211_bss_conf *link_conf;
1858
struct cfg80211_chan_def *chandef;
1859
struct sta_rec_ra_info *ra_info;
1860
struct mt792x_bss_conf *mconf;
1861
enum nl80211_band band;
1862
struct tlv *tlv;
1863
u16 supp_rates;
1864
1865
link_conf = mt792x_vif_to_bss_conf(vif, link_sta->link_id);
1866
mconf = mt792x_vif_to_link(mvif, link_sta->link_id);
1867
chandef = mconf->mt76.ctx ? &mconf->mt76.ctx->def :
1868
&link_conf->chanreq.oper;
1869
band = chandef->chan->band;
1870
1871
tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_RA, sizeof(*ra_info));
1872
ra_info = (struct sta_rec_ra_info *)tlv;
1873
1874
supp_rates = link_sta->supp_rates[band];
1875
if (band == NL80211_BAND_2GHZ)
1876
supp_rates = FIELD_PREP(RA_LEGACY_OFDM, supp_rates >> 4) |
1877
FIELD_PREP(RA_LEGACY_CCK, supp_rates & 0xf);
1878
else
1879
supp_rates = FIELD_PREP(RA_LEGACY_OFDM, supp_rates);
1880
1881
ra_info->legacy = cpu_to_le16(supp_rates);
1882
1883
if (link_sta->ht_cap.ht_supported)
1884
memcpy(ra_info->rx_mcs_bitmask,
1885
link_sta->ht_cap.mcs.rx_mask,
1886
HT_MCS_MASK_NUM);
1887
}
1888
1889
static void
1890
mt7925_mcu_sta_eht_mld_tlv(struct sk_buff *skb,
1891
struct ieee80211_vif *vif, struct ieee80211_sta *sta)
1892
{
1893
struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
1894
struct wiphy *wiphy = mvif->phy->mt76->hw->wiphy;
1895
const struct wiphy_iftype_ext_capab *ext_capa;
1896
struct sta_rec_eht_mld *eht_mld;
1897
struct tlv *tlv;
1898
u16 eml_cap;
1899
1900
if (!ieee80211_vif_is_mld(vif))
1901
return;
1902
1903
tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_EHT_MLD, sizeof(*eht_mld));
1904
eht_mld = (struct sta_rec_eht_mld *)tlv;
1905
eht_mld->mld_type = 0xff;
1906
1907
ext_capa = cfg80211_get_iftype_ext_capa(wiphy,
1908
ieee80211_vif_type_p2p(vif));
1909
if (!ext_capa)
1910
return;
1911
1912
eml_cap = (vif->cfg.eml_cap & (IEEE80211_EML_CAP_EMLSR_SUPP |
1913
IEEE80211_EML_CAP_TRANSITION_TIMEOUT)) |
1914
(ext_capa->eml_capabilities & (IEEE80211_EML_CAP_EMLSR_PADDING_DELAY |
1915
IEEE80211_EML_CAP_EMLSR_TRANSITION_DELAY));
1916
1917
if (eml_cap & IEEE80211_EML_CAP_EMLSR_SUPP) {
1918
eht_mld->eml_cap[0] = u16_get_bits(eml_cap, GENMASK(7, 0));
1919
eht_mld->eml_cap[1] = u16_get_bits(eml_cap, GENMASK(15, 8));
1920
} else {
1921
eht_mld->str_cap[0] = BIT(1);
1922
}
1923
}
1924
1925
static void
1926
mt7925_mcu_sta_mld_tlv(struct sk_buff *skb,
1927
struct ieee80211_vif *vif, struct ieee80211_sta *sta)
1928
{
1929
struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
1930
struct mt792x_sta *msta = (struct mt792x_sta *)sta->drv_priv;
1931
unsigned long valid = mvif->valid_links;
1932
struct mt792x_bss_conf *mconf;
1933
struct mt792x_link_sta *mlink;
1934
struct sta_rec_mld *mld;
1935
struct tlv *tlv;
1936
int i, cnt = 0;
1937
1938
tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_MLD, sizeof(*mld));
1939
mld = (struct sta_rec_mld *)tlv;
1940
memcpy(mld->mac_addr, sta->addr, ETH_ALEN);
1941
mld->primary_id = cpu_to_le16(msta->deflink.wcid.idx);
1942
mld->wlan_id = cpu_to_le16(msta->deflink.wcid.idx);
1943
mld->link_num = min_t(u8, hweight16(mvif->valid_links), 2);
1944
1945
for_each_set_bit(i, &valid, IEEE80211_MLD_MAX_NUM_LINKS) {
1946
if (cnt == mld->link_num)
1947
break;
1948
1949
mconf = mt792x_vif_to_link(mvif, i);
1950
mlink = mt792x_sta_to_link(msta, i);
1951
mld->link[cnt].wlan_id = cpu_to_le16(mlink->wcid.idx);
1952
mld->link[cnt++].bss_idx = mconf->mt76.idx;
1953
1954
if (mlink != &msta->deflink)
1955
mld->secondary_id = cpu_to_le16(mlink->wcid.idx);
1956
}
1957
}
1958
1959
static void
1960
mt7925_mcu_sta_remove_tlv(struct sk_buff *skb)
1961
{
1962
struct sta_rec_remove *rem;
1963
struct tlv *tlv;
1964
1965
tlv = mt76_connac_mcu_add_tlv(skb, 0x25, sizeof(*rem));
1966
rem = (struct sta_rec_remove *)tlv;
1967
rem->action = 0;
1968
}
1969
1970
static int
1971
mt7925_mcu_sta_cmd(struct mt76_phy *phy,
1972
struct mt76_sta_cmd_info *info)
1973
{
1974
struct mt792x_vif *mvif = (struct mt792x_vif *)info->vif->drv_priv;
1975
struct mt76_dev *dev = phy->dev;
1976
struct mt792x_bss_conf *mconf;
1977
struct sk_buff *skb;
1978
int conn_state;
1979
1980
mconf = mt792x_vif_to_link(mvif, info->wcid->link_id);
1981
1982
skb = __mt76_connac_mcu_alloc_sta_req(dev, &mconf->mt76, info->wcid,
1983
MT7925_STA_UPDATE_MAX_SIZE);
1984
if (IS_ERR(skb))
1985
return PTR_ERR(skb);
1986
1987
conn_state = info->enable ? CONN_STATE_PORT_SECURE :
1988
CONN_STATE_DISCONNECT;
1989
1990
if (info->enable && info->link_sta) {
1991
mt76_connac_mcu_sta_basic_tlv(dev, skb, info->link_conf,
1992
info->link_sta,
1993
conn_state, info->newly);
1994
mt7925_mcu_sta_phy_tlv(skb, info->vif, info->link_sta);
1995
mt7925_mcu_sta_ht_tlv(skb, info->link_sta);
1996
mt7925_mcu_sta_vht_tlv(skb, info->link_sta);
1997
mt76_connac_mcu_sta_uapsd(skb, info->vif, info->link_sta->sta);
1998
mt7925_mcu_sta_amsdu_tlv(skb, info->vif, info->link_sta);
1999
mt7925_mcu_sta_he_tlv(skb, info->link_sta);
2000
mt7925_mcu_sta_he_6g_tlv(skb, info->link_sta);
2001
mt7925_mcu_sta_eht_tlv(skb, info->link_sta);
2002
mt7925_mcu_sta_rate_ctrl_tlv(skb, info->vif,
2003
info->link_sta);
2004
mt7925_mcu_sta_state_v2_tlv(phy, skb, info->link_sta,
2005
info->vif, info->rcpi,
2006
info->state);
2007
2008
if (info->state != MT76_STA_INFO_STATE_NONE) {
2009
mt7925_mcu_sta_mld_tlv(skb, info->vif, info->link_sta->sta);
2010
mt7925_mcu_sta_eht_mld_tlv(skb, info->vif, info->link_sta->sta);
2011
}
2012
}
2013
2014
if (!info->enable) {
2015
mt7925_mcu_sta_remove_tlv(skb);
2016
mt76_connac_mcu_add_tlv(skb, STA_REC_MLD_OFF,
2017
sizeof(struct tlv));
2018
} else {
2019
mt7925_mcu_sta_hdr_trans_tlv(skb, info->vif, info->link_sta);
2020
}
2021
2022
return mt76_mcu_skb_send_msg(dev, skb, info->cmd, true);
2023
}
2024
2025
int mt7925_mcu_sta_update(struct mt792x_dev *dev,
2026
struct ieee80211_link_sta *link_sta,
2027
struct ieee80211_vif *vif, bool enable,
2028
enum mt76_sta_info_state state)
2029
{
2030
struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
2031
int rssi = -ewma_rssi_read(&mvif->bss_conf.rssi);
2032
struct mt76_sta_cmd_info info = {
2033
.link_sta = link_sta,
2034
.vif = vif,
2035
.link_conf = &vif->bss_conf,
2036
.enable = enable,
2037
.cmd = MCU_UNI_CMD(STA_REC_UPDATE),
2038
.state = state,
2039
.offload_fw = true,
2040
.rcpi = to_rcpi(rssi),
2041
};
2042
struct mt792x_sta *msta;
2043
struct mt792x_link_sta *mlink;
2044
2045
if (link_sta) {
2046
msta = (struct mt792x_sta *)link_sta->sta->drv_priv;
2047
mlink = mt792x_sta_to_link(msta, link_sta->link_id);
2048
}
2049
info.wcid = link_sta ? &mlink->wcid : &mvif->sta.deflink.wcid;
2050
info.newly = state != MT76_STA_INFO_STATE_ASSOC;
2051
2052
return mt7925_mcu_sta_cmd(&dev->mphy, &info);
2053
}
2054
2055
int mt7925_mcu_set_beacon_filter(struct mt792x_dev *dev,
2056
struct ieee80211_vif *vif,
2057
bool enable)
2058
{
2059
#define MT7925_FIF_BIT_CLR BIT(1)
2060
#define MT7925_FIF_BIT_SET BIT(0)
2061
int err = 0;
2062
2063
if (enable) {
2064
err = mt7925_mcu_uni_bss_bcnft(dev, &vif->bss_conf, true);
2065
if (err < 0)
2066
return err;
2067
2068
return mt7925_mcu_set_rxfilter(dev, 0,
2069
MT7925_FIF_BIT_SET,
2070
MT_WF_RFCR_DROP_OTHER_BEACON);
2071
}
2072
2073
err = mt7925_mcu_set_bss_pm(dev, &vif->bss_conf, false);
2074
if (err < 0)
2075
return err;
2076
2077
return mt7925_mcu_set_rxfilter(dev, 0,
2078
MT7925_FIF_BIT_CLR,
2079
MT_WF_RFCR_DROP_OTHER_BEACON);
2080
}
2081
2082
int mt7925_get_txpwr_info(struct mt792x_dev *dev, u8 band_idx, struct mt7925_txpwr *txpwr)
2083
{
2084
#define TX_POWER_SHOW_INFO 0x7
2085
#define TXPOWER_ALL_RATE_POWER_INFO 0x2
2086
struct mt7925_txpwr_event *event;
2087
struct mt7925_txpwr_req req = {
2088
.tag = cpu_to_le16(TX_POWER_SHOW_INFO),
2089
.len = cpu_to_le16(sizeof(req) - 4),
2090
.catg = TXPOWER_ALL_RATE_POWER_INFO,
2091
.band_idx = band_idx,
2092
};
2093
struct sk_buff *skb;
2094
int ret;
2095
2096
ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_UNI_CMD(TXPOWER),
2097
&req, sizeof(req), true, &skb);
2098
if (ret)
2099
return ret;
2100
2101
event = (struct mt7925_txpwr_event *)skb->data;
2102
memcpy(txpwr, &event->txpwr, sizeof(event->txpwr));
2103
2104
dev_kfree_skb(skb);
2105
2106
return 0;
2107
}
2108
2109
int mt7925_mcu_set_sniffer(struct mt792x_dev *dev, struct ieee80211_vif *vif,
2110
bool enable)
2111
{
2112
struct {
2113
struct {
2114
u8 band_idx;
2115
u8 pad[3];
2116
} __packed hdr;
2117
struct sniffer_enable_tlv {
2118
__le16 tag;
2119
__le16 len;
2120
u8 enable;
2121
u8 pad[3];
2122
} __packed enable;
2123
} __packed req = {
2124
.hdr = {
2125
.band_idx = 0,
2126
},
2127
.enable = {
2128
.tag = cpu_to_le16(UNI_SNIFFER_ENABLE),
2129
.len = cpu_to_le16(sizeof(struct sniffer_enable_tlv)),
2130
.enable = enable,
2131
},
2132
};
2133
2134
return mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD(SNIFFER), &req, sizeof(req),
2135
true);
2136
}
2137
2138
int mt7925_mcu_config_sniffer(struct mt792x_vif *vif,
2139
struct ieee80211_chanctx_conf *ctx)
2140
{
2141
struct mt76_phy *mphy = vif->phy->mt76;
2142
struct cfg80211_chan_def *chandef = ctx ? &ctx->def : &mphy->chandef;
2143
int freq1 = chandef->center_freq1, freq2 = chandef->center_freq2;
2144
2145
static const u8 ch_band[] = {
2146
[NL80211_BAND_2GHZ] = 1,
2147
[NL80211_BAND_5GHZ] = 2,
2148
[NL80211_BAND_6GHZ] = 3,
2149
};
2150
static const u8 ch_width[] = {
2151
[NL80211_CHAN_WIDTH_20_NOHT] = 0,
2152
[NL80211_CHAN_WIDTH_20] = 0,
2153
[NL80211_CHAN_WIDTH_40] = 0,
2154
[NL80211_CHAN_WIDTH_80] = 1,
2155
[NL80211_CHAN_WIDTH_160] = 2,
2156
[NL80211_CHAN_WIDTH_80P80] = 3,
2157
[NL80211_CHAN_WIDTH_5] = 4,
2158
[NL80211_CHAN_WIDTH_10] = 5,
2159
[NL80211_CHAN_WIDTH_320] = 6,
2160
};
2161
2162
struct {
2163
struct {
2164
u8 band_idx;
2165
u8 pad[3];
2166
} __packed hdr;
2167
struct config_tlv {
2168
__le16 tag;
2169
__le16 len;
2170
u16 aid;
2171
u8 ch_band;
2172
u8 bw;
2173
u8 control_ch;
2174
u8 sco;
2175
u8 center_ch;
2176
u8 center_ch2;
2177
u8 drop_err;
2178
u8 pad[3];
2179
} __packed tlv;
2180
} __packed req = {
2181
.hdr = {
2182
.band_idx = 0,
2183
},
2184
.tlv = {
2185
.tag = cpu_to_le16(UNI_SNIFFER_CONFIG),
2186
.len = cpu_to_le16(sizeof(req.tlv)),
2187
.control_ch = chandef->chan->hw_value,
2188
.center_ch = ieee80211_frequency_to_channel(freq1),
2189
.drop_err = 1,
2190
},
2191
};
2192
2193
if (chandef->chan->band < ARRAY_SIZE(ch_band))
2194
req.tlv.ch_band = ch_band[chandef->chan->band];
2195
if (chandef->width < ARRAY_SIZE(ch_width))
2196
req.tlv.bw = ch_width[chandef->width];
2197
2198
if (freq2)
2199
req.tlv.center_ch2 = ieee80211_frequency_to_channel(freq2);
2200
2201
if (req.tlv.control_ch < req.tlv.center_ch)
2202
req.tlv.sco = 1; /* SCA */
2203
else if (req.tlv.control_ch > req.tlv.center_ch)
2204
req.tlv.sco = 3; /* SCB */
2205
2206
return mt76_mcu_send_msg(mphy->dev, MCU_UNI_CMD(SNIFFER),
2207
&req, sizeof(req), true);
2208
}
2209
2210
int
2211
mt7925_mcu_uni_add_beacon_offload(struct mt792x_dev *dev,
2212
struct ieee80211_hw *hw,
2213
struct ieee80211_vif *vif,
2214
bool enable)
2215
{
2216
struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
2217
struct ieee80211_mutable_offsets offs;
2218
struct {
2219
struct req_hdr {
2220
u8 bss_idx;
2221
u8 pad[3];
2222
} __packed hdr;
2223
struct bcn_content_tlv {
2224
__le16 tag;
2225
__le16 len;
2226
__le16 tim_ie_pos;
2227
__le16 csa_ie_pos;
2228
__le16 bcc_ie_pos;
2229
/* 0: disable beacon offload
2230
* 1: enable beacon offload
2231
* 2: update probe respond offload
2232
*/
2233
u8 enable;
2234
/* 0: legacy format (TXD + payload)
2235
* 1: only cap field IE
2236
*/
2237
u8 type;
2238
__le16 pkt_len;
2239
u8 pkt[512];
2240
} __packed beacon_tlv;
2241
} req = {
2242
.hdr = {
2243
.bss_idx = mvif->bss_conf.mt76.idx,
2244
},
2245
.beacon_tlv = {
2246
.tag = cpu_to_le16(UNI_BSS_INFO_BCN_CONTENT),
2247
.len = cpu_to_le16(sizeof(struct bcn_content_tlv)),
2248
.enable = enable,
2249
.type = 1,
2250
},
2251
};
2252
struct sk_buff *skb;
2253
u8 cap_offs;
2254
2255
/* support enable/update process only
2256
* disable flow would be handled in bss stop handler automatically
2257
*/
2258
if (!enable)
2259
return -EOPNOTSUPP;
2260
2261
skb = ieee80211_beacon_get_template(mt76_hw(dev), vif, &offs, 0);
2262
if (!skb)
2263
return -EINVAL;
2264
2265
cap_offs = offsetof(struct ieee80211_mgmt, u.beacon.capab_info);
2266
if (!skb_pull(skb, cap_offs)) {
2267
dev_err(dev->mt76.dev, "beacon format err\n");
2268
dev_kfree_skb(skb);
2269
return -EINVAL;
2270
}
2271
2272
if (skb->len > 512) {
2273
dev_err(dev->mt76.dev, "beacon size limit exceed\n");
2274
dev_kfree_skb(skb);
2275
return -EINVAL;
2276
}
2277
2278
memcpy(req.beacon_tlv.pkt, skb->data, skb->len);
2279
req.beacon_tlv.pkt_len = cpu_to_le16(skb->len);
2280
offs.tim_offset -= cap_offs;
2281
req.beacon_tlv.tim_ie_pos = cpu_to_le16(offs.tim_offset);
2282
2283
if (offs.cntdwn_counter_offs[0]) {
2284
u16 csa_offs;
2285
2286
csa_offs = offs.cntdwn_counter_offs[0] - cap_offs - 4;
2287
req.beacon_tlv.csa_ie_pos = cpu_to_le16(csa_offs);
2288
}
2289
dev_kfree_skb(skb);
2290
2291
return mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD(BSS_INFO_UPDATE),
2292
&req, sizeof(req), true);
2293
}
2294
2295
static
2296
void mt7925_mcu_bss_rlm_tlv(struct sk_buff *skb, struct mt76_phy *phy,
2297
struct ieee80211_bss_conf *link_conf,
2298
struct ieee80211_chanctx_conf *ctx)
2299
{
2300
struct cfg80211_chan_def *chandef = ctx ? &ctx->def :
2301
&link_conf->chanreq.oper;
2302
int freq1 = chandef->center_freq1, freq2 = chandef->center_freq2;
2303
enum nl80211_band band = chandef->chan->band;
2304
struct bss_rlm_tlv *req;
2305
struct tlv *tlv;
2306
2307
tlv = mt76_connac_mcu_add_tlv(skb, UNI_BSS_INFO_RLM, sizeof(*req));
2308
req = (struct bss_rlm_tlv *)tlv;
2309
req->control_channel = chandef->chan->hw_value;
2310
req->center_chan = ieee80211_frequency_to_channel(freq1);
2311
req->center_chan2 = 0;
2312
req->tx_streams = hweight8(phy->antenna_mask);
2313
req->ht_op_info = 4; /* set HT 40M allowed */
2314
req->rx_streams = hweight8(phy->antenna_mask);
2315
req->center_chan2 = 0;
2316
req->sco = 0;
2317
req->band = 1;
2318
2319
switch (band) {
2320
case NL80211_BAND_2GHZ:
2321
req->band = 1;
2322
break;
2323
case NL80211_BAND_5GHZ:
2324
req->band = 2;
2325
break;
2326
case NL80211_BAND_6GHZ:
2327
req->band = 3;
2328
break;
2329
default:
2330
break;
2331
}
2332
2333
switch (chandef->width) {
2334
case NL80211_CHAN_WIDTH_40:
2335
req->bw = CMD_CBW_40MHZ;
2336
break;
2337
case NL80211_CHAN_WIDTH_80:
2338
req->bw = CMD_CBW_80MHZ;
2339
break;
2340
case NL80211_CHAN_WIDTH_80P80:
2341
req->bw = CMD_CBW_8080MHZ;
2342
req->center_chan2 = ieee80211_frequency_to_channel(freq2);
2343
break;
2344
case NL80211_CHAN_WIDTH_160:
2345
req->bw = CMD_CBW_160MHZ;
2346
break;
2347
case NL80211_CHAN_WIDTH_5:
2348
req->bw = CMD_CBW_5MHZ;
2349
break;
2350
case NL80211_CHAN_WIDTH_10:
2351
req->bw = CMD_CBW_10MHZ;
2352
break;
2353
case NL80211_CHAN_WIDTH_20_NOHT:
2354
case NL80211_CHAN_WIDTH_20:
2355
default:
2356
req->bw = CMD_CBW_20MHZ;
2357
req->ht_op_info = 0;
2358
break;
2359
}
2360
2361
if (req->control_channel < req->center_chan)
2362
req->sco = 1; /* SCA */
2363
else if (req->control_channel > req->center_chan)
2364
req->sco = 3; /* SCB */
2365
}
2366
2367
static struct sk_buff *
2368
__mt7925_mcu_alloc_bss_req(struct mt76_dev *dev, struct mt76_vif_link *mvif, int len)
2369
{
2370
struct bss_req_hdr hdr = {
2371
.bss_idx = mvif->idx,
2372
};
2373
struct sk_buff *skb;
2374
2375
skb = mt76_mcu_msg_alloc(dev, NULL, len);
2376
if (!skb)
2377
return ERR_PTR(-ENOMEM);
2378
2379
skb_put_data(skb, &hdr, sizeof(hdr));
2380
2381
return skb;
2382
}
2383
2384
static
2385
void mt7925_mcu_bss_eht_tlv(struct sk_buff *skb, struct mt76_phy *phy,
2386
struct ieee80211_bss_conf *link_conf,
2387
struct ieee80211_chanctx_conf *ctx)
2388
{
2389
struct cfg80211_chan_def *chandef = ctx ? &ctx->def :
2390
&link_conf->chanreq.oper;
2391
2392
struct bss_eht_tlv *req;
2393
struct tlv *tlv;
2394
2395
tlv = mt76_connac_mcu_add_tlv(skb, UNI_BSS_INFO_EHT, sizeof(*req));
2396
req = (struct bss_eht_tlv *)tlv;
2397
req->is_eth_dscb_present = chandef->punctured ? 1 : 0;
2398
req->eht_dis_sub_chan_bitmap = cpu_to_le16(chandef->punctured);
2399
}
2400
2401
int mt7925_mcu_set_eht_pp(struct mt76_phy *phy, struct mt76_vif_link *mvif,
2402
struct ieee80211_bss_conf *link_conf,
2403
struct ieee80211_chanctx_conf *ctx)
2404
{
2405
struct sk_buff *skb;
2406
2407
skb = __mt7925_mcu_alloc_bss_req(phy->dev, mvif,
2408
MT7925_BSS_UPDATE_MAX_SIZE);
2409
if (IS_ERR(skb))
2410
return PTR_ERR(skb);
2411
2412
mt7925_mcu_bss_eht_tlv(skb, phy, link_conf, ctx);
2413
2414
return mt76_mcu_skb_send_msg(phy->dev, skb,
2415
MCU_UNI_CMD(BSS_INFO_UPDATE), true);
2416
}
2417
2418
int mt7925_mcu_set_chctx(struct mt76_phy *phy, struct mt76_vif_link *mvif,
2419
struct ieee80211_bss_conf *link_conf,
2420
struct ieee80211_chanctx_conf *ctx)
2421
{
2422
struct sk_buff *skb;
2423
2424
skb = __mt7925_mcu_alloc_bss_req(phy->dev, mvif,
2425
MT7925_BSS_UPDATE_MAX_SIZE);
2426
if (IS_ERR(skb))
2427
return PTR_ERR(skb);
2428
2429
mt7925_mcu_bss_rlm_tlv(skb, phy, link_conf, ctx);
2430
2431
return mt76_mcu_skb_send_msg(phy->dev, skb,
2432
MCU_UNI_CMD(BSS_INFO_UPDATE), true);
2433
}
2434
2435
static u8
2436
mt7925_get_phy_mode_ext(struct mt76_phy *phy, struct ieee80211_vif *vif,
2437
enum nl80211_band band,
2438
struct ieee80211_link_sta *link_sta)
2439
{
2440
struct ieee80211_he_6ghz_capa *he_6ghz_capa;
2441
const struct ieee80211_sta_eht_cap *eht_cap;
2442
__le16 capa = 0;
2443
u8 mode = 0;
2444
2445
if (link_sta) {
2446
he_6ghz_capa = &link_sta->he_6ghz_capa;
2447
eht_cap = &link_sta->eht_cap;
2448
} else {
2449
struct ieee80211_supported_band *sband;
2450
2451
sband = phy->hw->wiphy->bands[band];
2452
capa = ieee80211_get_he_6ghz_capa(sband, vif->type);
2453
he_6ghz_capa = (struct ieee80211_he_6ghz_capa *)&capa;
2454
2455
eht_cap = ieee80211_get_eht_iftype_cap(sband, vif->type);
2456
}
2457
2458
switch (band) {
2459
case NL80211_BAND_2GHZ:
2460
if (eht_cap && eht_cap->has_eht)
2461
mode |= PHY_MODE_BE_24G;
2462
break;
2463
case NL80211_BAND_5GHZ:
2464
if (eht_cap && eht_cap->has_eht)
2465
mode |= PHY_MODE_BE_5G;
2466
break;
2467
case NL80211_BAND_6GHZ:
2468
if (he_6ghz_capa && he_6ghz_capa->capa)
2469
mode |= PHY_MODE_AX_6G;
2470
2471
if (eht_cap && eht_cap->has_eht)
2472
mode |= PHY_MODE_BE_6G;
2473
break;
2474
default:
2475
break;
2476
}
2477
2478
return mode;
2479
}
2480
2481
static void
2482
mt7925_mcu_bss_basic_tlv(struct sk_buff *skb,
2483
struct ieee80211_bss_conf *link_conf,
2484
struct ieee80211_link_sta *link_sta,
2485
struct ieee80211_chanctx_conf *ctx,
2486
struct mt76_phy *phy, u16 wlan_idx,
2487
bool enable)
2488
{
2489
struct ieee80211_vif *vif = link_conf->vif;
2490
struct mt792x_bss_conf *mconf = mt792x_link_conf_to_mconf(link_conf);
2491
struct cfg80211_chan_def *chandef = ctx ? &ctx->def :
2492
&link_conf->chanreq.oper;
2493
enum nl80211_band band = chandef->chan->band;
2494
struct mt76_connac_bss_basic_tlv *basic_req;
2495
struct mt792x_link_sta *mlink;
2496
struct tlv *tlv;
2497
int conn_type;
2498
u8 idx;
2499
2500
tlv = mt76_connac_mcu_add_tlv(skb, UNI_BSS_INFO_BASIC, sizeof(*basic_req));
2501
basic_req = (struct mt76_connac_bss_basic_tlv *)tlv;
2502
2503
idx = mconf->mt76.omac_idx > EXT_BSSID_START ? HW_BSSID_0 :
2504
mconf->mt76.omac_idx;
2505
basic_req->hw_bss_idx = idx;
2506
2507
basic_req->phymode_ext = mt7925_get_phy_mode_ext(phy, vif, band,
2508
link_sta);
2509
2510
if (band == NL80211_BAND_2GHZ)
2511
basic_req->nonht_basic_phy = cpu_to_le16(PHY_TYPE_ERP_INDEX);
2512
else
2513
basic_req->nonht_basic_phy = cpu_to_le16(PHY_TYPE_OFDM_INDEX);
2514
2515
memcpy(basic_req->bssid, link_conf->bssid, ETH_ALEN);
2516
basic_req->phymode = mt76_connac_get_phy_mode(phy, vif, band, link_sta);
2517
basic_req->bcn_interval = cpu_to_le16(link_conf->beacon_int);
2518
basic_req->dtim_period = link_conf->dtim_period;
2519
basic_req->bmc_tx_wlan_idx = cpu_to_le16(wlan_idx);
2520
basic_req->link_idx = mconf->mt76.idx;
2521
2522
if (link_sta) {
2523
struct mt792x_sta *msta;
2524
2525
msta = (struct mt792x_sta *)link_sta->sta->drv_priv;
2526
mlink = mt792x_sta_to_link(msta, link_sta->link_id);
2527
2528
} else {
2529
mlink = &mconf->vif->sta.deflink;
2530
}
2531
2532
basic_req->sta_idx = cpu_to_le16(mlink->wcid.idx);
2533
basic_req->omac_idx = mconf->mt76.omac_idx;
2534
basic_req->band_idx = mconf->mt76.band_idx;
2535
basic_req->wmm_idx = mconf->mt76.wmm_idx;
2536
basic_req->conn_state = !enable;
2537
2538
switch (vif->type) {
2539
case NL80211_IFTYPE_MESH_POINT:
2540
case NL80211_IFTYPE_AP:
2541
if (vif->p2p)
2542
conn_type = CONNECTION_P2P_GO;
2543
else
2544
conn_type = CONNECTION_INFRA_AP;
2545
basic_req->conn_type = cpu_to_le32(conn_type);
2546
basic_req->active = enable;
2547
break;
2548
case NL80211_IFTYPE_STATION:
2549
if (vif->p2p)
2550
conn_type = CONNECTION_P2P_GC;
2551
else
2552
conn_type = CONNECTION_INFRA_STA;
2553
basic_req->conn_type = cpu_to_le32(conn_type);
2554
basic_req->active = true;
2555
break;
2556
case NL80211_IFTYPE_ADHOC:
2557
basic_req->conn_type = cpu_to_le32(CONNECTION_IBSS_ADHOC);
2558
basic_req->active = true;
2559
break;
2560
default:
2561
WARN_ON(1);
2562
break;
2563
}
2564
}
2565
2566
static void
2567
mt7925_mcu_bss_sec_tlv(struct sk_buff *skb,
2568
struct ieee80211_bss_conf *link_conf)
2569
{
2570
struct mt792x_bss_conf *mconf = mt792x_link_conf_to_mconf(link_conf);
2571
struct mt76_vif_link *mvif = &mconf->mt76;
2572
struct bss_sec_tlv {
2573
__le16 tag;
2574
__le16 len;
2575
u8 mode;
2576
u8 status;
2577
u8 cipher;
2578
u8 __rsv;
2579
} __packed * sec;
2580
struct tlv *tlv;
2581
2582
tlv = mt76_connac_mcu_add_tlv(skb, UNI_BSS_INFO_SEC, sizeof(*sec));
2583
sec = (struct bss_sec_tlv *)tlv;
2584
2585
switch (mvif->cipher) {
2586
case CONNAC3_CIPHER_GCMP_256:
2587
case CONNAC3_CIPHER_GCMP:
2588
sec->mode = MODE_WPA3_SAE;
2589
sec->status = 8;
2590
break;
2591
case CONNAC3_CIPHER_AES_CCMP:
2592
sec->mode = MODE_WPA2_PSK;
2593
sec->status = 6;
2594
break;
2595
case CONNAC3_CIPHER_TKIP:
2596
sec->mode = MODE_WPA2_PSK;
2597
sec->status = 4;
2598
break;
2599
case CONNAC3_CIPHER_WEP104:
2600
case CONNAC3_CIPHER_WEP40:
2601
sec->mode = MODE_SHARED;
2602
sec->status = 0;
2603
break;
2604
default:
2605
sec->mode = MODE_OPEN;
2606
sec->status = 1;
2607
break;
2608
}
2609
2610
sec->cipher = mvif->cipher;
2611
}
2612
2613
static void
2614
mt7925_mcu_bss_bmc_tlv(struct sk_buff *skb, struct mt792x_phy *phy,
2615
struct ieee80211_chanctx_conf *ctx,
2616
struct ieee80211_bss_conf *link_conf)
2617
{
2618
struct cfg80211_chan_def *chandef = ctx ? &ctx->def :
2619
&link_conf->chanreq.oper;
2620
struct mt792x_bss_conf *mconf = mt792x_link_conf_to_mconf(link_conf);
2621
enum nl80211_band band = chandef->chan->band;
2622
struct mt76_vif_link *mvif = &mconf->mt76;
2623
struct bss_rate_tlv *bmc;
2624
struct tlv *tlv;
2625
u8 idx = mvif->mcast_rates_idx ?
2626
mvif->mcast_rates_idx : mvif->basic_rates_idx;
2627
2628
tlv = mt76_connac_mcu_add_tlv(skb, UNI_BSS_INFO_RATE, sizeof(*bmc));
2629
2630
bmc = (struct bss_rate_tlv *)tlv;
2631
2632
if (band == NL80211_BAND_2GHZ)
2633
bmc->basic_rate = cpu_to_le16(HR_DSSS_ERP_BASIC_RATE);
2634
else
2635
bmc->basic_rate = cpu_to_le16(OFDM_BASIC_RATE);
2636
2637
bmc->short_preamble = (band == NL80211_BAND_2GHZ);
2638
bmc->bc_fixed_rate = idx;
2639
bmc->mc_fixed_rate = idx;
2640
}
2641
2642
static void
2643
mt7925_mcu_bss_mld_tlv(struct sk_buff *skb,
2644
struct ieee80211_bss_conf *link_conf)
2645
{
2646
struct ieee80211_vif *vif = link_conf->vif;
2647
struct mt792x_bss_conf *mconf = mt792x_link_conf_to_mconf(link_conf);
2648
struct mt792x_vif *mvif = (struct mt792x_vif *)link_conf->vif->drv_priv;
2649
struct mt792x_phy *phy = mvif->phy;
2650
struct bss_mld_tlv *mld;
2651
struct tlv *tlv;
2652
bool is_mld;
2653
2654
is_mld = ieee80211_vif_is_mld(link_conf->vif) ||
2655
(hweight16(mvif->valid_links) > 1);
2656
2657
tlv = mt76_connac_mcu_add_tlv(skb, UNI_BSS_INFO_MLD, sizeof(*mld));
2658
mld = (struct bss_mld_tlv *)tlv;
2659
2660
mld->link_id = is_mld ? link_conf->link_id : 0xff;
2661
/* apply the index of the primary link */
2662
mld->group_mld_id = is_mld ? mvif->bss_conf.mt76.idx : 0xff;
2663
mld->own_mld_id = mconf->mt76.idx + 32;
2664
mld->remap_idx = 0xff;
2665
2666
if (phy->chip_cap & MT792x_CHIP_CAP_MLO_EML_EN) {
2667
mld->eml_enable = !!(link_conf->vif->cfg.eml_cap &
2668
IEEE80211_EML_CAP_EMLSR_SUPP);
2669
} else {
2670
mld->eml_enable = 0;
2671
}
2672
2673
memcpy(mld->mac_addr, vif->addr, ETH_ALEN);
2674
}
2675
2676
static void
2677
mt7925_mcu_bss_qos_tlv(struct sk_buff *skb, struct ieee80211_bss_conf *link_conf)
2678
{
2679
struct mt76_connac_bss_qos_tlv *qos;
2680
struct tlv *tlv;
2681
2682
tlv = mt76_connac_mcu_add_tlv(skb, UNI_BSS_INFO_QBSS, sizeof(*qos));
2683
qos = (struct mt76_connac_bss_qos_tlv *)tlv;
2684
qos->qos = link_conf->qos;
2685
}
2686
2687
static void
2688
mt7925_mcu_bss_mbssid_tlv(struct sk_buff *skb, struct ieee80211_bss_conf *link_conf,
2689
bool enable)
2690
{
2691
struct bss_info_uni_mbssid *mbssid;
2692
struct tlv *tlv;
2693
2694
if (!enable && !link_conf->bssid_indicator)
2695
return;
2696
2697
tlv = mt76_connac_mcu_add_tlv(skb, UNI_BSS_INFO_11V_MBSSID,
2698
sizeof(*mbssid));
2699
2700
mbssid = (struct bss_info_uni_mbssid *)tlv;
2701
mbssid->max_indicator = link_conf->bssid_indicator;
2702
mbssid->mbss_idx = link_conf->bssid_index;
2703
mbssid->tx_bss_omac_idx = 0;
2704
}
2705
2706
static void
2707
mt7925_mcu_bss_he_tlv(struct sk_buff *skb, struct ieee80211_bss_conf *link_conf,
2708
struct mt792x_phy *phy)
2709
{
2710
#define DEFAULT_HE_PE_DURATION 4
2711
#define DEFAULT_HE_DURATION_RTS_THRES 1023
2712
const struct ieee80211_sta_he_cap *cap;
2713
struct bss_info_uni_he *he;
2714
struct tlv *tlv;
2715
2716
cap = mt76_connac_get_he_phy_cap(phy->mt76, link_conf->vif);
2717
2718
tlv = mt76_connac_mcu_add_tlv(skb, UNI_BSS_INFO_HE_BASIC, sizeof(*he));
2719
2720
he = (struct bss_info_uni_he *)tlv;
2721
he->he_pe_duration = link_conf->htc_trig_based_pkt_ext;
2722
if (!he->he_pe_duration)
2723
he->he_pe_duration = DEFAULT_HE_PE_DURATION;
2724
2725
he->he_rts_thres = cpu_to_le16(link_conf->frame_time_rts_th);
2726
if (!he->he_rts_thres)
2727
he->he_rts_thres = cpu_to_le16(DEFAULT_HE_DURATION_RTS_THRES);
2728
2729
he->max_nss_mcs[CMD_HE_MCS_BW80] = cap->he_mcs_nss_supp.tx_mcs_80;
2730
he->max_nss_mcs[CMD_HE_MCS_BW160] = cap->he_mcs_nss_supp.tx_mcs_160;
2731
he->max_nss_mcs[CMD_HE_MCS_BW8080] = cap->he_mcs_nss_supp.tx_mcs_80p80;
2732
}
2733
2734
static void
2735
mt7925_mcu_bss_color_tlv(struct sk_buff *skb, struct ieee80211_bss_conf *link_conf,
2736
bool enable)
2737
{
2738
struct bss_info_uni_bss_color *color;
2739
struct tlv *tlv;
2740
2741
tlv = mt76_connac_mcu_add_tlv(skb, UNI_BSS_INFO_BSS_COLOR, sizeof(*color));
2742
color = (struct bss_info_uni_bss_color *)tlv;
2743
2744
color->enable = enable ?
2745
link_conf->he_bss_color.enabled : 0;
2746
color->bss_color = enable ?
2747
link_conf->he_bss_color.color : 0;
2748
}
2749
2750
static void
2751
mt7925_mcu_bss_ifs_tlv(struct sk_buff *skb,
2752
struct ieee80211_bss_conf *link_conf)
2753
{
2754
struct mt792x_vif *mvif = (struct mt792x_vif *)link_conf->vif->drv_priv;
2755
struct mt792x_phy *phy = mvif->phy;
2756
struct bss_ifs_time_tlv *ifs_time;
2757
struct tlv *tlv;
2758
2759
tlv = mt76_connac_mcu_add_tlv(skb, UNI_BSS_INFO_IFS_TIME, sizeof(*ifs_time));
2760
ifs_time = (struct bss_ifs_time_tlv *)tlv;
2761
ifs_time->slot_valid = true;
2762
ifs_time->slot_time = cpu_to_le16(phy->slottime);
2763
}
2764
2765
int mt7925_mcu_set_timing(struct mt792x_phy *phy,
2766
struct ieee80211_bss_conf *link_conf)
2767
{
2768
struct mt792x_bss_conf *mconf = mt792x_link_conf_to_mconf(link_conf);
2769
struct mt792x_dev *dev = phy->dev;
2770
struct sk_buff *skb;
2771
2772
skb = __mt7925_mcu_alloc_bss_req(&dev->mt76, &mconf->mt76,
2773
MT7925_BSS_UPDATE_MAX_SIZE);
2774
if (IS_ERR(skb))
2775
return PTR_ERR(skb);
2776
2777
mt7925_mcu_bss_ifs_tlv(skb, link_conf);
2778
2779
return mt76_mcu_skb_send_msg(&dev->mt76, skb,
2780
MCU_UNI_CMD(BSS_INFO_UPDATE), true);
2781
}
2782
2783
void mt7925_mcu_del_dev(struct mt76_dev *mdev,
2784
struct ieee80211_vif *vif)
2785
{
2786
struct mt76_vif_link *mvif = (struct mt76_vif_link *)vif->drv_priv;
2787
struct {
2788
struct {
2789
u8 omac_idx;
2790
u8 band_idx;
2791
__le16 pad;
2792
} __packed hdr;
2793
struct req_tlv {
2794
__le16 tag;
2795
__le16 len;
2796
u8 active;
2797
u8 link_idx; /* hw link idx */
2798
u8 omac_addr[ETH_ALEN];
2799
} __packed tlv;
2800
} dev_req = {
2801
.tlv = {
2802
.tag = cpu_to_le16(DEV_INFO_ACTIVE),
2803
.len = cpu_to_le16(sizeof(struct req_tlv)),
2804
.active = true,
2805
},
2806
};
2807
struct {
2808
struct {
2809
u8 bss_idx;
2810
u8 pad[3];
2811
} __packed hdr;
2812
struct mt76_connac_bss_basic_tlv basic;
2813
} basic_req = {
2814
.basic = {
2815
.tag = cpu_to_le16(UNI_BSS_INFO_BASIC),
2816
.len = cpu_to_le16(sizeof(struct mt76_connac_bss_basic_tlv)),
2817
.active = true,
2818
.conn_state = 1,
2819
},
2820
};
2821
2822
dev_req.hdr.omac_idx = mvif->omac_idx;
2823
dev_req.hdr.band_idx = mvif->band_idx;
2824
2825
basic_req.hdr.bss_idx = mvif->idx;
2826
basic_req.basic.omac_idx = mvif->omac_idx;
2827
basic_req.basic.band_idx = mvif->band_idx;
2828
basic_req.basic.link_idx = mvif->link_idx;
2829
2830
mt76_mcu_send_msg(mdev, MCU_UNI_CMD(BSS_INFO_UPDATE),
2831
&basic_req, sizeof(basic_req), true);
2832
2833
/* recovery omac address for the legacy interface */
2834
memcpy(dev_req.tlv.omac_addr, vif->addr, ETH_ALEN);
2835
mt76_mcu_send_msg(mdev, MCU_UNI_CMD(DEV_INFO_UPDATE),
2836
&dev_req, sizeof(dev_req), true);
2837
}
2838
2839
int mt7925_mcu_add_bss_info(struct mt792x_phy *phy,
2840
struct ieee80211_chanctx_conf *ctx,
2841
struct ieee80211_bss_conf *link_conf,
2842
struct ieee80211_link_sta *link_sta,
2843
int enable)
2844
{
2845
struct mt792x_vif *mvif = (struct mt792x_vif *)link_conf->vif->drv_priv;
2846
struct mt792x_bss_conf *mconf = mt792x_link_conf_to_mconf(link_conf);
2847
struct mt792x_dev *dev = phy->dev;
2848
struct mt792x_link_sta *mlink_bc;
2849
struct sk_buff *skb;
2850
2851
skb = __mt7925_mcu_alloc_bss_req(&dev->mt76, &mconf->mt76,
2852
MT7925_BSS_UPDATE_MAX_SIZE);
2853
if (IS_ERR(skb))
2854
return PTR_ERR(skb);
2855
2856
mlink_bc = mt792x_sta_to_link(&mvif->sta, mconf->link_id);
2857
2858
/* bss_basic must be first */
2859
mt7925_mcu_bss_basic_tlv(skb, link_conf, link_sta, ctx, phy->mt76,
2860
mlink_bc->wcid.idx, enable);
2861
mt7925_mcu_bss_sec_tlv(skb, link_conf);
2862
mt7925_mcu_bss_bmc_tlv(skb, phy, ctx, link_conf);
2863
mt7925_mcu_bss_qos_tlv(skb, link_conf);
2864
mt7925_mcu_bss_mld_tlv(skb, link_conf);
2865
mt7925_mcu_bss_ifs_tlv(skb, link_conf);
2866
2867
if (link_conf->he_support) {
2868
mt7925_mcu_bss_he_tlv(skb, link_conf, phy);
2869
mt7925_mcu_bss_color_tlv(skb, link_conf, enable);
2870
}
2871
2872
if (enable) {
2873
mt7925_mcu_bss_rlm_tlv(skb, phy->mt76, link_conf, ctx);
2874
mt7925_mcu_bss_mbssid_tlv(skb, link_conf, enable);
2875
}
2876
2877
return mt76_mcu_skb_send_msg(&dev->mt76, skb,
2878
MCU_UNI_CMD(BSS_INFO_UPDATE), true);
2879
}
2880
2881
int mt7925_mcu_set_dbdc(struct mt76_phy *phy, bool enable)
2882
{
2883
struct mt76_dev *mdev = phy->dev;
2884
2885
struct mbmc_conf_tlv *conf;
2886
struct mbmc_set_req *hdr;
2887
struct sk_buff *skb;
2888
struct tlv *tlv;
2889
int max_len, err;
2890
2891
max_len = sizeof(*hdr) + sizeof(*conf);
2892
skb = mt76_mcu_msg_alloc(mdev, NULL, max_len);
2893
if (!skb)
2894
return -ENOMEM;
2895
2896
hdr = (struct mbmc_set_req *)skb_put(skb, sizeof(*hdr));
2897
2898
tlv = mt76_connac_mcu_add_tlv(skb, UNI_MBMC_SETTING, sizeof(*conf));
2899
conf = (struct mbmc_conf_tlv *)tlv;
2900
2901
conf->mbmc_en = enable;
2902
conf->band = 0; /* unused */
2903
2904
err = mt76_mcu_skb_send_msg(mdev, skb, MCU_UNI_CMD(SET_DBDC_PARMS),
2905
true);
2906
2907
return err;
2908
}
2909
2910
static void
2911
mt7925_mcu_build_scan_ie_tlv(struct mt76_dev *mdev,
2912
struct sk_buff *skb,
2913
struct ieee80211_scan_ies *scan_ies)
2914
{
2915
u32 max_len = sizeof(struct scan_ie_tlv) + MT76_CONNAC_SCAN_IE_LEN;
2916
struct scan_ie_tlv *ie;
2917
enum nl80211_band i;
2918
struct tlv *tlv;
2919
const u8 *ies;
2920
u16 ies_len;
2921
2922
for (i = 0; i <= NL80211_BAND_6GHZ; i++) {
2923
if (i == NL80211_BAND_60GHZ)
2924
continue;
2925
2926
ies = scan_ies->ies[i];
2927
ies_len = scan_ies->len[i];
2928
2929
if (!ies || !ies_len)
2930
continue;
2931
2932
if (ies_len > max_len)
2933
return;
2934
2935
tlv = mt76_connac_mcu_add_tlv(skb, UNI_SCAN_IE,
2936
sizeof(*ie) + ies_len);
2937
ie = (struct scan_ie_tlv *)tlv;
2938
2939
memcpy(ie->ies, ies, ies_len);
2940
ie->ies_len = cpu_to_le16(ies_len);
2941
2942
switch (i) {
2943
case NL80211_BAND_2GHZ:
2944
ie->band = 1;
2945
break;
2946
case NL80211_BAND_6GHZ:
2947
ie->band = 3;
2948
break;
2949
default:
2950
ie->band = 2;
2951
break;
2952
}
2953
2954
max_len -= (sizeof(*ie) + ies_len);
2955
}
2956
}
2957
2958
int mt7925_mcu_hw_scan(struct mt76_phy *phy, struct ieee80211_vif *vif,
2959
struct ieee80211_scan_request *scan_req)
2960
{
2961
struct mt76_vif_link *mvif = (struct mt76_vif_link *)vif->drv_priv;
2962
struct cfg80211_scan_request *sreq = &scan_req->req;
2963
int n_ssids = 0, err, i;
2964
struct ieee80211_channel **scan_list = sreq->channels;
2965
struct mt76_dev *mdev = phy->dev;
2966
struct mt76_connac_mcu_scan_channel *chan;
2967
struct sk_buff *skb;
2968
struct scan_hdr_tlv *hdr;
2969
struct scan_req_tlv *req;
2970
struct scan_ssid_tlv *ssid;
2971
struct scan_bssid_tlv *bssid;
2972
struct scan_chan_info_tlv *chan_info;
2973
struct scan_ie_tlv *ie;
2974
struct scan_misc_tlv *misc;
2975
struct tlv *tlv;
2976
int max_len;
2977
2978
if (test_bit(MT76_HW_SCANNING, &phy->state))
2979
return -EBUSY;
2980
2981
max_len = sizeof(*hdr) + sizeof(*req) + sizeof(*ssid) +
2982
sizeof(*bssid) * MT7925_RNR_SCAN_MAX_BSSIDS +
2983
sizeof(*chan_info) + sizeof(*misc) + sizeof(*ie) +
2984
MT76_CONNAC_SCAN_IE_LEN;
2985
2986
skb = mt76_mcu_msg_alloc(mdev, NULL, max_len);
2987
if (!skb)
2988
return -ENOMEM;
2989
2990
set_bit(MT76_HW_SCANNING, &phy->state);
2991
mvif->scan_seq_num = (mvif->scan_seq_num + 1) & 0x7f;
2992
2993
hdr = (struct scan_hdr_tlv *)skb_put(skb, sizeof(*hdr));
2994
hdr->seq_num = mvif->scan_seq_num | mvif->band_idx << 7;
2995
hdr->bss_idx = mvif->idx;
2996
2997
tlv = mt76_connac_mcu_add_tlv(skb, UNI_SCAN_REQ, sizeof(*req));
2998
req = (struct scan_req_tlv *)tlv;
2999
req->scan_type = sreq->n_ssids ? 1 : 0;
3000
req->probe_req_num = sreq->n_ssids ? 2 : 0;
3001
3002
tlv = mt76_connac_mcu_add_tlv(skb, UNI_SCAN_SSID, sizeof(*ssid));
3003
ssid = (struct scan_ssid_tlv *)tlv;
3004
for (i = 0; i < sreq->n_ssids; i++) {
3005
if (!sreq->ssids[i].ssid_len)
3006
continue;
3007
if (i >= MT7925_RNR_SCAN_MAX_BSSIDS)
3008
break;
3009
3010
ssid->ssids[n_ssids].ssid_len = cpu_to_le32(sreq->ssids[i].ssid_len);
3011
memcpy(ssid->ssids[n_ssids].ssid, sreq->ssids[i].ssid,
3012
sreq->ssids[i].ssid_len);
3013
n_ssids++;
3014
}
3015
ssid->ssid_type = n_ssids ? BIT(2) : BIT(0);
3016
ssid->ssids_num = n_ssids;
3017
3018
if (sreq->n_6ghz_params) {
3019
u8 j;
3020
3021
mt76_connac_mcu_build_rnr_scan_param(mdev, sreq);
3022
3023
for (j = 0; j < mdev->rnr.bssid_num; j++) {
3024
if (j >= MT7925_RNR_SCAN_MAX_BSSIDS)
3025
break;
3026
3027
tlv = mt76_connac_mcu_add_tlv(skb, UNI_SCAN_BSSID,
3028
sizeof(*bssid));
3029
bssid = (struct scan_bssid_tlv *)tlv;
3030
3031
ether_addr_copy(bssid->bssid, mdev->rnr.bssid[j]);
3032
bssid->match_ch = mdev->rnr.channel[j];
3033
bssid->match_ssid_ind = MT7925_RNR_SCAN_MAX_BSSIDS;
3034
bssid->match_short_ssid_ind = MT7925_RNR_SCAN_MAX_BSSIDS;
3035
}
3036
req->scan_func |= SCAN_FUNC_RNR_SCAN;
3037
} else {
3038
tlv = mt76_connac_mcu_add_tlv(skb, UNI_SCAN_BSSID, sizeof(*bssid));
3039
bssid = (struct scan_bssid_tlv *)tlv;
3040
3041
ether_addr_copy(bssid->bssid, sreq->bssid);
3042
}
3043
3044
tlv = mt76_connac_mcu_add_tlv(skb, UNI_SCAN_CHANNEL, sizeof(*chan_info));
3045
chan_info = (struct scan_chan_info_tlv *)tlv;
3046
chan_info->channels_num = min_t(u8, sreq->n_channels,
3047
ARRAY_SIZE(chan_info->channels));
3048
for (i = 0; i < chan_info->channels_num; i++) {
3049
chan = &chan_info->channels[i];
3050
3051
switch (scan_list[i]->band) {
3052
case NL80211_BAND_2GHZ:
3053
chan->band = 1;
3054
break;
3055
case NL80211_BAND_6GHZ:
3056
chan->band = 3;
3057
break;
3058
default:
3059
chan->band = 2;
3060
break;
3061
}
3062
chan->channel_num = scan_list[i]->hw_value;
3063
}
3064
chan_info->channel_type = sreq->n_channels ? 4 : 0;
3065
3066
req->scan_func |= SCAN_FUNC_SPLIT_SCAN;
3067
3068
tlv = mt76_connac_mcu_add_tlv(skb, UNI_SCAN_MISC, sizeof(*misc));
3069
misc = (struct scan_misc_tlv *)tlv;
3070
if (sreq->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
3071
get_random_mask_addr(misc->random_mac, sreq->mac_addr,
3072
sreq->mac_addr_mask);
3073
req->scan_func |= SCAN_FUNC_RANDOM_MAC;
3074
}
3075
3076
/* Append scan probe IEs as the last tlv */
3077
mt7925_mcu_build_scan_ie_tlv(mdev, skb, &scan_req->ies);
3078
3079
err = mt76_mcu_skb_send_msg(mdev, skb, MCU_UNI_CMD(SCAN_REQ),
3080
true);
3081
if (err < 0)
3082
clear_bit(MT76_HW_SCANNING, &phy->state);
3083
3084
return err;
3085
}
3086
EXPORT_SYMBOL_GPL(mt7925_mcu_hw_scan);
3087
3088
int mt7925_mcu_sched_scan_req(struct mt76_phy *phy,
3089
struct ieee80211_vif *vif,
3090
struct cfg80211_sched_scan_request *sreq,
3091
struct ieee80211_scan_ies *ies)
3092
{
3093
struct mt76_vif_link *mvif = (struct mt76_vif_link *)vif->drv_priv;
3094
struct ieee80211_channel **scan_list = sreq->channels;
3095
struct mt76_connac_mcu_scan_channel *chan;
3096
struct mt76_dev *mdev = phy->dev;
3097
struct cfg80211_match_set *cfg_match;
3098
struct cfg80211_ssid *cfg_ssid;
3099
3100
struct scan_hdr_tlv *hdr;
3101
struct scan_sched_req *req;
3102
struct scan_ssid_tlv *ssid;
3103
struct scan_chan_info_tlv *chan_info;
3104
struct scan_ie_tlv *ie;
3105
struct scan_sched_ssid_match_sets *match;
3106
struct sk_buff *skb;
3107
struct tlv *tlv;
3108
int i, max_len;
3109
3110
max_len = sizeof(*hdr) + sizeof(*req) + sizeof(*ssid) +
3111
sizeof(*chan_info) + sizeof(*ie) +
3112
sizeof(*match);
3113
3114
skb = mt76_mcu_msg_alloc(mdev, NULL, max_len);
3115
if (!skb)
3116
return -ENOMEM;
3117
3118
mvif->scan_seq_num = (mvif->scan_seq_num + 1) & 0x7f;
3119
3120
hdr = (struct scan_hdr_tlv *)skb_put(skb, sizeof(*hdr));
3121
hdr->seq_num = mvif->scan_seq_num | mvif->band_idx << 7;
3122
hdr->bss_idx = mvif->idx;
3123
3124
tlv = mt76_connac_mcu_add_tlv(skb, UNI_SCAN_SCHED_REQ, sizeof(*req));
3125
req = (struct scan_sched_req *)tlv;
3126
req->version = 1;
3127
3128
if (sreq->flags & NL80211_SCAN_FLAG_RANDOM_ADDR)
3129
req->scan_func |= SCAN_FUNC_RANDOM_MAC;
3130
3131
req->intervals_num = sreq->n_scan_plans;
3132
for (i = 0; i < req->intervals_num; i++)
3133
req->intervals[i] = cpu_to_le16(sreq->scan_plans[i].interval);
3134
3135
tlv = mt76_connac_mcu_add_tlv(skb, UNI_SCAN_SSID, sizeof(*ssid));
3136
ssid = (struct scan_ssid_tlv *)tlv;
3137
3138
ssid->ssids_num = sreq->n_ssids;
3139
ssid->ssid_type = BIT(2);
3140
for (i = 0; i < ssid->ssids_num; i++) {
3141
cfg_ssid = &sreq->ssids[i];
3142
memcpy(ssid->ssids[i].ssid, cfg_ssid->ssid, cfg_ssid->ssid_len);
3143
ssid->ssids[i].ssid_len = cpu_to_le32(cfg_ssid->ssid_len);
3144
}
3145
3146
tlv = mt76_connac_mcu_add_tlv(skb, UNI_SCAN_SSID_MATCH_SETS, sizeof(*match));
3147
match = (struct scan_sched_ssid_match_sets *)tlv;
3148
match->match_num = sreq->n_match_sets;
3149
for (i = 0; i < match->match_num; i++) {
3150
cfg_match = &sreq->match_sets[i];
3151
memcpy(match->match[i].ssid, cfg_match->ssid.ssid,
3152
cfg_match->ssid.ssid_len);
3153
match->match[i].rssi_th = cpu_to_le32(cfg_match->rssi_thold);
3154
match->match[i].ssid_len = cfg_match->ssid.ssid_len;
3155
}
3156
3157
tlv = mt76_connac_mcu_add_tlv(skb, UNI_SCAN_CHANNEL, sizeof(*chan_info));
3158
chan_info = (struct scan_chan_info_tlv *)tlv;
3159
chan_info->channels_num = min_t(u8, sreq->n_channels,
3160
ARRAY_SIZE(chan_info->channels));
3161
for (i = 0; i < chan_info->channels_num; i++) {
3162
chan = &chan_info->channels[i];
3163
3164
switch (scan_list[i]->band) {
3165
case NL80211_BAND_2GHZ:
3166
chan->band = 1;
3167
break;
3168
case NL80211_BAND_6GHZ:
3169
chan->band = 3;
3170
break;
3171
default:
3172
chan->band = 2;
3173
break;
3174
}
3175
chan->channel_num = scan_list[i]->hw_value;
3176
}
3177
chan_info->channel_type = sreq->n_channels ? 4 : 0;
3178
3179
/* Append scan probe IEs as the last tlv */
3180
mt7925_mcu_build_scan_ie_tlv(mdev, skb, ies);
3181
3182
return mt76_mcu_skb_send_msg(mdev, skb, MCU_UNI_CMD(SCAN_REQ),
3183
true);
3184
}
3185
EXPORT_SYMBOL_GPL(mt7925_mcu_sched_scan_req);
3186
3187
int
3188
mt7925_mcu_sched_scan_enable(struct mt76_phy *phy,
3189
struct ieee80211_vif *vif,
3190
bool enable)
3191
{
3192
struct mt76_dev *mdev = phy->dev;
3193
struct scan_sched_enable *req;
3194
struct scan_hdr_tlv *hdr;
3195
struct sk_buff *skb;
3196
struct tlv *tlv;
3197
int max_len;
3198
3199
max_len = sizeof(*hdr) + sizeof(*req);
3200
3201
skb = mt76_mcu_msg_alloc(mdev, NULL, max_len);
3202
if (!skb)
3203
return -ENOMEM;
3204
3205
hdr = (struct scan_hdr_tlv *)skb_put(skb, sizeof(*hdr));
3206
hdr->seq_num = 0;
3207
hdr->bss_idx = 0;
3208
3209
tlv = mt76_connac_mcu_add_tlv(skb, UNI_SCAN_SCHED_ENABLE, sizeof(*req));
3210
req = (struct scan_sched_enable *)tlv;
3211
req->active = !enable;
3212
3213
if (enable)
3214
set_bit(MT76_HW_SCHED_SCANNING, &phy->state);
3215
else
3216
clear_bit(MT76_HW_SCHED_SCANNING, &phy->state);
3217
3218
return mt76_mcu_skb_send_msg(mdev, skb, MCU_UNI_CMD(SCAN_REQ),
3219
true);
3220
}
3221
3222
int mt7925_mcu_cancel_hw_scan(struct mt76_phy *phy,
3223
struct ieee80211_vif *vif)
3224
{
3225
struct mt76_vif_link *mvif = (struct mt76_vif_link *)vif->drv_priv;
3226
struct {
3227
struct scan_hdr {
3228
u8 seq_num;
3229
u8 bss_idx;
3230
u8 pad[2];
3231
} __packed hdr;
3232
struct scan_cancel_tlv {
3233
__le16 tag;
3234
__le16 len;
3235
u8 is_ext_channel;
3236
u8 rsv[3];
3237
} __packed cancel;
3238
} req = {
3239
.hdr = {
3240
.seq_num = mvif->scan_seq_num,
3241
.bss_idx = mvif->idx,
3242
},
3243
.cancel = {
3244
.tag = cpu_to_le16(UNI_SCAN_CANCEL),
3245
.len = cpu_to_le16(sizeof(struct scan_cancel_tlv)),
3246
},
3247
};
3248
3249
if (test_and_clear_bit(MT76_HW_SCANNING, &phy->state)) {
3250
struct cfg80211_scan_info info = {
3251
.aborted = true,
3252
};
3253
3254
ieee80211_scan_completed(phy->hw, &info);
3255
}
3256
3257
return mt76_mcu_send_msg(phy->dev, MCU_UNI_CMD(SCAN_REQ),
3258
&req, sizeof(req), true);
3259
}
3260
EXPORT_SYMBOL_GPL(mt7925_mcu_cancel_hw_scan);
3261
3262
int mt7925_mcu_set_channel_domain(struct mt76_phy *phy)
3263
{
3264
int len, i, n_max_channels, n_2ch = 0, n_5ch = 0, n_6ch = 0;
3265
struct {
3266
struct {
3267
u8 alpha2[4]; /* regulatory_request.alpha2 */
3268
u8 bw_2g; /* BW_20_40M 0
3269
* BW_20M 1
3270
* BW_20_40_80M 2
3271
* BW_20_40_80_160M 3
3272
* BW_20_40_80_8080M 4
3273
*/
3274
u8 bw_5g;
3275
u8 bw_6g;
3276
u8 pad;
3277
} __packed hdr;
3278
struct n_chan {
3279
__le16 tag;
3280
__le16 len;
3281
u8 n_2ch;
3282
u8 n_5ch;
3283
u8 n_6ch;
3284
u8 pad;
3285
} __packed n_ch;
3286
} req = {
3287
.hdr = {
3288
.bw_2g = 0,
3289
.bw_5g = 3, /* BW_20_40_80_160M */
3290
.bw_6g = 3,
3291
},
3292
.n_ch = {
3293
.tag = cpu_to_le16(2),
3294
},
3295
};
3296
struct mt76_connac_mcu_chan {
3297
__le16 hw_value;
3298
__le16 pad;
3299
__le32 flags;
3300
} __packed channel;
3301
struct mt76_dev *dev = phy->dev;
3302
struct ieee80211_channel *chan;
3303
struct sk_buff *skb;
3304
3305
n_max_channels = phy->sband_2g.sband.n_channels +
3306
phy->sband_5g.sband.n_channels +
3307
phy->sband_6g.sband.n_channels;
3308
len = sizeof(req) + n_max_channels * sizeof(channel);
3309
3310
skb = mt76_mcu_msg_alloc(dev, NULL, len);
3311
if (!skb)
3312
return -ENOMEM;
3313
3314
skb_reserve(skb, sizeof(req));
3315
3316
for (i = 0; i < phy->sband_2g.sband.n_channels; i++) {
3317
chan = &phy->sband_2g.sband.channels[i];
3318
if (chan->flags & IEEE80211_CHAN_DISABLED)
3319
continue;
3320
3321
channel.hw_value = cpu_to_le16(chan->hw_value);
3322
channel.flags = cpu_to_le32(chan->flags);
3323
channel.pad = 0;
3324
3325
skb_put_data(skb, &channel, sizeof(channel));
3326
n_2ch++;
3327
}
3328
for (i = 0; i < phy->sband_5g.sband.n_channels; i++) {
3329
chan = &phy->sband_5g.sband.channels[i];
3330
if (chan->flags & IEEE80211_CHAN_DISABLED)
3331
continue;
3332
3333
channel.hw_value = cpu_to_le16(chan->hw_value);
3334
channel.flags = cpu_to_le32(chan->flags);
3335
channel.pad = 0;
3336
3337
skb_put_data(skb, &channel, sizeof(channel));
3338
n_5ch++;
3339
}
3340
for (i = 0; i < phy->sband_6g.sband.n_channels; i++) {
3341
chan = &phy->sband_6g.sband.channels[i];
3342
if (chan->flags & IEEE80211_CHAN_DISABLED)
3343
continue;
3344
3345
channel.hw_value = cpu_to_le16(chan->hw_value);
3346
channel.flags = cpu_to_le32(chan->flags);
3347
channel.pad = 0;
3348
3349
skb_put_data(skb, &channel, sizeof(channel));
3350
n_6ch++;
3351
}
3352
3353
BUILD_BUG_ON(sizeof(dev->alpha2) > sizeof(req.hdr.alpha2));
3354
memcpy(req.hdr.alpha2, dev->alpha2, sizeof(dev->alpha2));
3355
req.n_ch.n_2ch = n_2ch;
3356
req.n_ch.n_5ch = n_5ch;
3357
req.n_ch.n_6ch = n_6ch;
3358
len = sizeof(struct n_chan) + (n_2ch + n_5ch + n_6ch) * sizeof(channel);
3359
req.n_ch.len = cpu_to_le16(len);
3360
memcpy(__skb_push(skb, sizeof(req)), &req, sizeof(req));
3361
3362
return mt76_mcu_skb_send_msg(dev, skb, MCU_UNI_CMD(SET_DOMAIN_INFO),
3363
true);
3364
}
3365
EXPORT_SYMBOL_GPL(mt7925_mcu_set_channel_domain);
3366
3367
static int
3368
__mt7925_mcu_set_clc(struct mt792x_dev *dev, u8 *alpha2,
3369
enum environment_cap env_cap,
3370
struct mt7925_clc *clc, u8 idx)
3371
{
3372
struct mt7925_clc_segment *seg;
3373
struct sk_buff *skb;
3374
struct {
3375
u8 rsv[4];
3376
__le16 tag;
3377
__le16 len;
3378
3379
u8 ver;
3380
u8 pad0;
3381
__le16 size;
3382
u8 idx;
3383
u8 env;
3384
u8 acpi_conf;
3385
u8 pad1;
3386
u8 alpha2[2];
3387
u8 type[2];
3388
u8 rsvd[64];
3389
} __packed req = {
3390
.tag = cpu_to_le16(0x3),
3391
.len = cpu_to_le16(sizeof(req) - 4),
3392
3393
.idx = idx,
3394
.env = env_cap,
3395
};
3396
int ret, valid_cnt = 0;
3397
u8 *pos, *last_pos;
3398
3399
if (!clc)
3400
return 0;
3401
3402
req.ver = clc->ver;
3403
pos = clc->data + sizeof(*seg) * clc->t0.nr_seg;
3404
last_pos = clc->data + le32_to_cpu(*(__le32 *)(clc->data + 4));
3405
while (pos < last_pos) {
3406
struct mt7925_clc_rule *rule = (struct mt7925_clc_rule *)pos;
3407
3408
pos += sizeof(*rule);
3409
if (rule->alpha2[0] != alpha2[0] ||
3410
rule->alpha2[1] != alpha2[1])
3411
continue;
3412
3413
seg = (struct mt7925_clc_segment *)clc->data
3414
+ rule->seg_idx - 1;
3415
3416
memcpy(req.alpha2, rule->alpha2, 2);
3417
memcpy(req.type, rule->type, 2);
3418
3419
req.size = cpu_to_le16(seg->len);
3420
dev->phy.clc_chan_conf = clc->ver == 1 ? 0xff : rule->flag;
3421
skb = __mt76_mcu_msg_alloc(&dev->mt76, &req,
3422
le16_to_cpu(req.size) + sizeof(req),
3423
sizeof(req), GFP_KERNEL);
3424
if (!skb)
3425
return -ENOMEM;
3426
skb_put_data(skb, clc->data + seg->offset, seg->len);
3427
3428
ret = mt76_mcu_skb_send_msg(&dev->mt76, skb,
3429
MCU_UNI_CMD(SET_POWER_LIMIT),
3430
true);
3431
if (ret < 0)
3432
return ret;
3433
valid_cnt++;
3434
}
3435
3436
if (!valid_cnt) {
3437
dev->phy.clc_chan_conf = 0xff;
3438
return -ENOENT;
3439
}
3440
3441
return 0;
3442
}
3443
3444
int mt7925_mcu_set_clc(struct mt792x_dev *dev, u8 *alpha2,
3445
enum environment_cap env_cap)
3446
{
3447
struct mt792x_phy *phy = (struct mt792x_phy *)&dev->phy;
3448
int i, ret;
3449
3450
if (!ARRAY_SIZE(phy->clc))
3451
return -ESRCH;
3452
3453
/* submit all clc config */
3454
for (i = 0; i < ARRAY_SIZE(phy->clc); i++) {
3455
if (i == MT792x_CLC_BE_CTRL)
3456
continue;
3457
3458
ret = __mt7925_mcu_set_clc(dev, alpha2, env_cap,
3459
phy->clc[i], i);
3460
3461
/* If no country found, set "00" as default */
3462
if (ret == -ENOENT)
3463
ret = __mt7925_mcu_set_clc(dev, "00",
3464
ENVIRON_INDOOR,
3465
phy->clc[i], i);
3466
if (ret < 0)
3467
return ret;
3468
}
3469
return 0;
3470
}
3471
3472
int mt7925_mcu_fill_message(struct mt76_dev *mdev, struct sk_buff *skb,
3473
int cmd, int *wait_seq)
3474
{
3475
int txd_len, mcu_cmd = FIELD_GET(__MCU_CMD_FIELD_ID, cmd);
3476
struct mt76_connac2_mcu_uni_txd *uni_txd;
3477
struct mt76_connac2_mcu_txd *mcu_txd;
3478
__le32 *txd;
3479
u32 val;
3480
u8 seq;
3481
3482
/* TODO: make dynamic based on msg type */
3483
mdev->mcu.timeout = 20 * HZ;
3484
3485
seq = ++mdev->mcu.msg_seq & 0xf;
3486
if (!seq)
3487
seq = ++mdev->mcu.msg_seq & 0xf;
3488
3489
if (cmd == MCU_CMD(FW_SCATTER))
3490
goto exit;
3491
3492
txd_len = cmd & __MCU_CMD_FIELD_UNI ? sizeof(*uni_txd) : sizeof(*mcu_txd);
3493
txd = (__le32 *)skb_push(skb, txd_len);
3494
3495
val = FIELD_PREP(MT_TXD0_TX_BYTES, skb->len) |
3496
FIELD_PREP(MT_TXD0_PKT_FMT, MT_TX_TYPE_CMD) |
3497
FIELD_PREP(MT_TXD0_Q_IDX, MT_TX_MCU_PORT_RX_Q0);
3498
txd[0] = cpu_to_le32(val);
3499
3500
val = FIELD_PREP(MT_TXD1_HDR_FORMAT, MT_HDR_FORMAT_CMD);
3501
txd[1] = cpu_to_le32(val);
3502
3503
if (cmd & __MCU_CMD_FIELD_UNI) {
3504
uni_txd = (struct mt76_connac2_mcu_uni_txd *)txd;
3505
uni_txd->len = cpu_to_le16(skb->len - sizeof(uni_txd->txd));
3506
uni_txd->cid = cpu_to_le16(mcu_cmd);
3507
uni_txd->s2d_index = MCU_S2D_H2N;
3508
uni_txd->pkt_type = MCU_PKT_ID;
3509
uni_txd->seq = seq;
3510
3511
if (cmd & __MCU_CMD_FIELD_QUERY)
3512
uni_txd->option = MCU_CMD_UNI_QUERY_ACK;
3513
else
3514
uni_txd->option = MCU_CMD_UNI_EXT_ACK;
3515
3516
if (cmd == MCU_UNI_CMD(HIF_CTRL) ||
3517
cmd == MCU_UNI_CMD(CHIP_CONFIG))
3518
uni_txd->option &= ~MCU_CMD_ACK;
3519
3520
if (mcu_cmd == MCU_UNI_CMD_TESTMODE_CTRL ||
3521
mcu_cmd == MCU_UNI_CMD_TESTMODE_RX_STAT) {
3522
if (cmd & __MCU_CMD_FIELD_QUERY)
3523
uni_txd->option = 0x2;
3524
else
3525
uni_txd->option = 0x6;
3526
}
3527
3528
goto exit;
3529
}
3530
3531
mcu_txd = (struct mt76_connac2_mcu_txd *)txd;
3532
mcu_txd->len = cpu_to_le16(skb->len - sizeof(mcu_txd->txd));
3533
mcu_txd->pq_id = cpu_to_le16(MCU_PQ_ID(MT_TX_PORT_IDX_MCU,
3534
MT_TX_MCU_PORT_RX_Q0));
3535
mcu_txd->pkt_type = MCU_PKT_ID;
3536
mcu_txd->seq = seq;
3537
mcu_txd->cid = mcu_cmd;
3538
mcu_txd->ext_cid = FIELD_GET(__MCU_CMD_FIELD_EXT_ID, cmd);
3539
3540
if (mcu_txd->ext_cid || (cmd & __MCU_CMD_FIELD_CE)) {
3541
if (cmd & __MCU_CMD_FIELD_QUERY)
3542
mcu_txd->set_query = MCU_Q_QUERY;
3543
else
3544
mcu_txd->set_query = MCU_Q_SET;
3545
mcu_txd->ext_cid_ack = !!mcu_txd->ext_cid;
3546
} else {
3547
mcu_txd->set_query = MCU_Q_NA;
3548
}
3549
3550
if (cmd & __MCU_CMD_FIELD_WA)
3551
mcu_txd->s2d_index = MCU_S2D_H2C;
3552
else
3553
mcu_txd->s2d_index = MCU_S2D_H2N;
3554
3555
exit:
3556
if (wait_seq)
3557
*wait_seq = seq;
3558
3559
return 0;
3560
}
3561
EXPORT_SYMBOL_GPL(mt7925_mcu_fill_message);
3562
3563
int mt7925_mcu_set_rts_thresh(struct mt792x_phy *phy, u32 val)
3564
{
3565
struct {
3566
u8 band_idx;
3567
u8 _rsv[3];
3568
3569
__le16 tag;
3570
__le16 len;
3571
__le32 len_thresh;
3572
__le32 pkt_thresh;
3573
} __packed req = {
3574
.band_idx = phy->mt76->band_idx,
3575
.tag = cpu_to_le16(UNI_BAND_CONFIG_RTS_THRESHOLD),
3576
.len = cpu_to_le16(sizeof(req) - 4),
3577
.len_thresh = cpu_to_le32(val),
3578
.pkt_thresh = cpu_to_le32(0x2),
3579
};
3580
3581
return mt76_mcu_send_msg(&phy->dev->mt76, MCU_UNI_CMD(BAND_CONFIG),
3582
&req, sizeof(req), true);
3583
}
3584
3585
int mt7925_mcu_set_radio_en(struct mt792x_phy *phy, bool enable)
3586
{
3587
struct {
3588
u8 band_idx;
3589
u8 _rsv[3];
3590
3591
__le16 tag;
3592
__le16 len;
3593
u8 enable;
3594
u8 _rsv2[3];
3595
} __packed req = {
3596
.band_idx = phy->mt76->band_idx,
3597
.tag = cpu_to_le16(UNI_BAND_CONFIG_RADIO_ENABLE),
3598
.len = cpu_to_le16(sizeof(req) - 4),
3599
.enable = enable,
3600
};
3601
3602
return mt76_mcu_send_msg(&phy->dev->mt76, MCU_UNI_CMD(BAND_CONFIG),
3603
&req, sizeof(req), true);
3604
}
3605
3606
static void
3607
mt7925_mcu_build_sku(struct mt76_dev *dev, s8 *sku,
3608
struct mt76_power_limits *limits,
3609
enum nl80211_band band)
3610
{
3611
int i, offset = sizeof(limits->cck);
3612
3613
memset(sku, 127, MT_CONNAC3_SKU_POWER_LIMIT);
3614
3615
if (band == NL80211_BAND_2GHZ) {
3616
/* cck */
3617
memcpy(sku, limits->cck, sizeof(limits->cck));
3618
}
3619
3620
/* ofdm */
3621
memcpy(&sku[offset], limits->ofdm, sizeof(limits->ofdm));
3622
offset += (sizeof(limits->ofdm) * 5);
3623
3624
/* ht */
3625
for (i = 0; i < 2; i++) {
3626
memcpy(&sku[offset], limits->mcs[i], 8);
3627
offset += 8;
3628
}
3629
sku[offset++] = limits->mcs[0][0];
3630
3631
/* vht */
3632
for (i = 0; i < ARRAY_SIZE(limits->mcs); i++) {
3633
memcpy(&sku[offset], limits->mcs[i],
3634
ARRAY_SIZE(limits->mcs[i]));
3635
offset += 12;
3636
}
3637
3638
/* he */
3639
for (i = 0; i < ARRAY_SIZE(limits->ru); i++) {
3640
memcpy(&sku[offset], limits->ru[i], ARRAY_SIZE(limits->ru[i]));
3641
offset += ARRAY_SIZE(limits->ru[i]);
3642
}
3643
3644
/* eht */
3645
for (i = 0; i < ARRAY_SIZE(limits->eht); i++) {
3646
memcpy(&sku[offset], limits->eht[i], ARRAY_SIZE(limits->eht[i]));
3647
offset += ARRAY_SIZE(limits->eht[i]);
3648
}
3649
}
3650
3651
static int
3652
mt7925_mcu_rate_txpower_band(struct mt76_phy *phy,
3653
enum nl80211_band band)
3654
{
3655
int tx_power, n_chan, last_ch, err = 0, idx = 0;
3656
int i, sku_len, batch_size, batch_len = 3;
3657
struct mt76_dev *dev = phy->dev;
3658
static const u8 chan_list_2ghz[] = {
3659
1, 2, 3, 4, 5, 6, 7,
3660
8, 9, 10, 11, 12, 13, 14
3661
};
3662
static const u8 chan_list_5ghz[] = {
3663
36, 38, 40, 42, 44, 46, 48,
3664
50, 52, 54, 56, 58, 60, 62,
3665
64, 100, 102, 104, 106, 108, 110,
3666
112, 114, 116, 118, 120, 122, 124,
3667
126, 128, 132, 134, 136, 138, 140,
3668
142, 144, 149, 151, 153, 155, 157,
3669
159, 161, 165, 167
3670
};
3671
static const u8 chan_list_6ghz[] = {
3672
1, 3, 5, 7, 9, 11, 13,
3673
15, 17, 19, 21, 23, 25, 27,
3674
29, 33, 35, 37, 39, 41, 43,
3675
45, 47, 49, 51, 53, 55, 57,
3676
59, 61, 65, 67, 69, 71, 73,
3677
75, 77, 79, 81, 83, 85, 87,
3678
89, 91, 93, 97, 99, 101, 103,
3679
105, 107, 109, 111, 113, 115, 117,
3680
119, 121, 123, 125, 129, 131, 133,
3681
135, 137, 139, 141, 143, 145, 147,
3682
149, 151, 153, 155, 157, 161, 163,
3683
165, 167, 169, 171, 173, 175, 177,
3684
179, 181, 183, 185, 187, 189, 193,
3685
195, 197, 199, 201, 203, 205, 207,
3686
209, 211, 213, 215, 217, 219, 221,
3687
225, 227, 229, 233
3688
};
3689
struct mt76_power_limits *limits;
3690
struct mt7925_sku_tlv *sku_tlbv;
3691
const u8 *ch_list;
3692
3693
sku_len = sizeof(*sku_tlbv);
3694
tx_power = 2 * phy->hw->conf.power_level;
3695
if (!tx_power)
3696
tx_power = 127;
3697
3698
if (band == NL80211_BAND_2GHZ) {
3699
n_chan = ARRAY_SIZE(chan_list_2ghz);
3700
ch_list = chan_list_2ghz;
3701
last_ch = chan_list_2ghz[ARRAY_SIZE(chan_list_2ghz) - 1];
3702
} else if (band == NL80211_BAND_6GHZ) {
3703
n_chan = ARRAY_SIZE(chan_list_6ghz);
3704
ch_list = chan_list_6ghz;
3705
last_ch = chan_list_6ghz[ARRAY_SIZE(chan_list_6ghz) - 1];
3706
} else {
3707
n_chan = ARRAY_SIZE(chan_list_5ghz);
3708
ch_list = chan_list_5ghz;
3709
last_ch = chan_list_5ghz[ARRAY_SIZE(chan_list_5ghz) - 1];
3710
}
3711
batch_size = DIV_ROUND_UP(n_chan, batch_len);
3712
3713
limits = devm_kmalloc(dev->dev, sizeof(*limits), GFP_KERNEL);
3714
if (!limits)
3715
return -ENOMEM;
3716
3717
sku_tlbv = devm_kmalloc(dev->dev, sku_len, GFP_KERNEL);
3718
if (!sku_tlbv) {
3719
devm_kfree(dev->dev, limits);
3720
return -ENOMEM;
3721
}
3722
3723
for (i = 0; i < batch_size; i++) {
3724
struct mt7925_tx_power_limit_tlv *tx_power_tlv;
3725
int j, msg_len, num_ch;
3726
struct sk_buff *skb;
3727
3728
num_ch = i == batch_size - 1 ? n_chan % batch_len : batch_len;
3729
msg_len = sizeof(*tx_power_tlv) + num_ch * sku_len;
3730
skb = mt76_mcu_msg_alloc(dev, NULL, msg_len);
3731
if (!skb) {
3732
err = -ENOMEM;
3733
goto out;
3734
}
3735
3736
tx_power_tlv = (struct mt7925_tx_power_limit_tlv *)
3737
skb_put(skb, sizeof(*tx_power_tlv));
3738
3739
BUILD_BUG_ON(sizeof(dev->alpha2) > sizeof(tx_power_tlv->alpha2));
3740
memcpy(tx_power_tlv->alpha2, dev->alpha2, sizeof(dev->alpha2));
3741
tx_power_tlv->n_chan = num_ch;
3742
tx_power_tlv->tag = cpu_to_le16(0x1);
3743
tx_power_tlv->len = cpu_to_le16(sizeof(*tx_power_tlv));
3744
3745
switch (band) {
3746
case NL80211_BAND_2GHZ:
3747
tx_power_tlv->band = 1;
3748
break;
3749
case NL80211_BAND_6GHZ:
3750
tx_power_tlv->band = 3;
3751
break;
3752
default:
3753
tx_power_tlv->band = 2;
3754
break;
3755
}
3756
3757
for (j = 0; j < num_ch; j++, idx++) {
3758
struct ieee80211_channel chan = {
3759
.hw_value = ch_list[idx],
3760
.band = band,
3761
};
3762
s8 reg_power, sar_power;
3763
3764
reg_power = mt76_connac_get_ch_power(phy, &chan,
3765
tx_power);
3766
sar_power = mt76_get_sar_power(phy, &chan, reg_power);
3767
3768
mt76_get_rate_power_limits(phy, &chan, limits,
3769
sar_power);
3770
3771
tx_power_tlv->last_msg = ch_list[idx] == last_ch;
3772
sku_tlbv->channel = ch_list[idx];
3773
3774
mt7925_mcu_build_sku(dev, sku_tlbv->pwr_limit,
3775
limits, band);
3776
skb_put_data(skb, sku_tlbv, sku_len);
3777
}
3778
err = mt76_mcu_skb_send_msg(dev, skb,
3779
MCU_UNI_CMD(SET_POWER_LIMIT),
3780
true);
3781
if (err < 0)
3782
goto out;
3783
}
3784
3785
out:
3786
devm_kfree(dev->dev, sku_tlbv);
3787
devm_kfree(dev->dev, limits);
3788
return err;
3789
}
3790
3791
int mt7925_mcu_set_rate_txpower(struct mt76_phy *phy)
3792
{
3793
struct mt76_dev *mdev = phy->dev;
3794
struct mt792x_dev *dev = mt792x_hw_dev(mdev->hw);
3795
int err;
3796
3797
if (phy->cap.has_2ghz) {
3798
err = mt7925_mcu_rate_txpower_band(phy,
3799
NL80211_BAND_2GHZ);
3800
if (err < 0)
3801
return err;
3802
}
3803
3804
if (phy->cap.has_5ghz) {
3805
err = mt7925_mcu_rate_txpower_band(phy,
3806
NL80211_BAND_5GHZ);
3807
if (err < 0)
3808
return err;
3809
}
3810
3811
if (phy->cap.has_6ghz && dev->phy.clc_chan_conf) {
3812
err = mt7925_mcu_rate_txpower_band(phy,
3813
NL80211_BAND_6GHZ);
3814
if (err < 0)
3815
return err;
3816
}
3817
3818
return 0;
3819
}
3820
3821
int mt7925_mcu_wf_rf_pin_ctrl(struct mt792x_phy *phy)
3822
{
3823
#define UNI_CMD_RADIO_STATUS_GET 0
3824
struct mt792x_dev *dev = phy->dev;
3825
struct sk_buff *skb;
3826
int ret;
3827
struct {
3828
__le16 tag;
3829
__le16 len;
3830
u8 rsv[4];
3831
} __packed req = {
3832
.tag = UNI_CMD_RADIO_STATUS_GET,
3833
.len = cpu_to_le16(sizeof(req)),
3834
};
3835
struct mt7925_radio_status_event {
3836
__le16 tag;
3837
__le16 len;
3838
3839
u8 data;
3840
u8 rsv[3];
3841
} __packed *status;
3842
3843
ret = mt76_mcu_send_and_get_msg(&dev->mt76,
3844
MCU_UNI_CMD(RADIO_STATUS),
3845
&req, sizeof(req), true, &skb);
3846
if (ret)
3847
return ret;
3848
3849
skb_pull(skb, sizeof(struct tlv));
3850
status = (struct mt7925_radio_status_event *)skb->data;
3851
ret = status->data;
3852
3853
dev_kfree_skb(skb);
3854
3855
return ret;
3856
}
3857
3858
int mt7925_mcu_set_rxfilter(struct mt792x_dev *dev, u32 fif,
3859
u8 bit_op, u32 bit_map)
3860
{
3861
struct mt792x_phy *phy = &dev->phy;
3862
struct {
3863
u8 band_idx;
3864
u8 rsv1[3];
3865
3866
__le16 tag;
3867
__le16 len;
3868
u8 mode;
3869
u8 rsv2[3];
3870
__le32 fif;
3871
__le32 bit_map; /* bit_* for bitmap update */
3872
u8 bit_op;
3873
u8 pad[51];
3874
} __packed req = {
3875
.band_idx = phy->mt76->band_idx,
3876
.tag = cpu_to_le16(UNI_BAND_CONFIG_SET_MAC80211_RX_FILTER),
3877
.len = cpu_to_le16(sizeof(req) - 4),
3878
3879
.mode = fif ? 0 : 1,
3880
.fif = cpu_to_le32(fif),
3881
.bit_map = cpu_to_le32(bit_map),
3882
.bit_op = bit_op,
3883
};
3884
3885
return mt76_mcu_send_msg(&phy->dev->mt76, MCU_UNI_CMD(BAND_CONFIG),
3886
&req, sizeof(req), true);
3887
}
3888
3889
int mt7925_mcu_set_rssimonitor(struct mt792x_dev *dev, struct ieee80211_vif *vif)
3890
{
3891
struct mt792x_bss_conf *mconf = mt792x_link_conf_to_mconf(&vif->bss_conf);
3892
struct {
3893
struct {
3894
u8 bss_idx;
3895
u8 pad[3];
3896
} __packed hdr;
3897
__le16 tag;
3898
__le16 len;
3899
u8 enable;
3900
s8 cqm_rssi_high;
3901
s8 cqm_rssi_low;
3902
u8 rsv;
3903
} req = {
3904
.hdr = {
3905
.bss_idx = mconf->mt76.idx,
3906
},
3907
.tag = cpu_to_le16(UNI_CMD_RSSI_MONITOR_SET),
3908
.len = cpu_to_le16(sizeof(req) - 4),
3909
.enable = vif->cfg.assoc,
3910
.cqm_rssi_high = (s8)(vif->bss_conf.cqm_rssi_thold + vif->bss_conf.cqm_rssi_hyst),
3911
.cqm_rssi_low = (s8)(vif->bss_conf.cqm_rssi_thold - vif->bss_conf.cqm_rssi_hyst),
3912
};
3913
3914
return mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD(RSSI_MONITOR), &req,
3915
sizeof(req), false);
3916
}
3917
3918