Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/contrib/dev/mediatek/mt76/mt76_connac_mcu.c
109069 views
1
// SPDX-License-Identifier: BSD-3-Clause-Clear
2
/* Copyright (C) 2020 MediaTek Inc. */
3
4
#include <linux/firmware.h>
5
#include "mt76_connac2_mac.h"
6
#include "mt76_connac_mcu.h"
7
8
int mt76_connac_mcu_start_firmware(struct mt76_dev *dev, u32 addr, u32 option)
9
{
10
struct {
11
__le32 option;
12
__le32 addr;
13
} req = {
14
.option = cpu_to_le32(option),
15
.addr = cpu_to_le32(addr),
16
};
17
18
return mt76_mcu_send_msg(dev, MCU_CMD(FW_START_REQ), &req,
19
sizeof(req), true);
20
}
21
EXPORT_SYMBOL_GPL(mt76_connac_mcu_start_firmware);
22
23
int mt76_connac_mcu_patch_sem_ctrl(struct mt76_dev *dev, bool get)
24
{
25
u32 op = get ? PATCH_SEM_GET : PATCH_SEM_RELEASE;
26
struct {
27
__le32 op;
28
} req = {
29
.op = cpu_to_le32(op),
30
};
31
32
return mt76_mcu_send_msg(dev, MCU_CMD(PATCH_SEM_CONTROL),
33
&req, sizeof(req), true);
34
}
35
EXPORT_SYMBOL_GPL(mt76_connac_mcu_patch_sem_ctrl);
36
37
int mt76_connac_mcu_start_patch(struct mt76_dev *dev)
38
{
39
struct {
40
u8 check_crc;
41
u8 reserved[3];
42
} req = {
43
.check_crc = 0,
44
};
45
46
return mt76_mcu_send_msg(dev, MCU_CMD(PATCH_FINISH_REQ),
47
&req, sizeof(req), true);
48
}
49
EXPORT_SYMBOL_GPL(mt76_connac_mcu_start_patch);
50
51
#define MCU_PATCH_ADDRESS 0x200000
52
53
int mt76_connac_mcu_init_download(struct mt76_dev *dev, u32 addr, u32 len,
54
u32 mode)
55
{
56
struct {
57
__le32 addr;
58
__le32 len;
59
__le32 mode;
60
} req = {
61
.addr = cpu_to_le32(addr),
62
.len = cpu_to_le32(len),
63
.mode = cpu_to_le32(mode),
64
};
65
int cmd;
66
67
if ((!is_connac_v1(dev) && addr == MCU_PATCH_ADDRESS) ||
68
(is_mt7921(dev) && addr == 0x900000) ||
69
(is_mt7925(dev) && (addr == 0x900000 || addr == 0xe0002800)) ||
70
(is_mt799x(dev) && addr == 0x900000))
71
cmd = MCU_CMD(PATCH_START_REQ);
72
else
73
cmd = MCU_CMD(TARGET_ADDRESS_LEN_REQ);
74
75
return mt76_mcu_send_msg(dev, cmd, &req, sizeof(req), true);
76
}
77
EXPORT_SYMBOL_GPL(mt76_connac_mcu_init_download);
78
79
int mt76_connac_mcu_set_channel_domain(struct mt76_phy *phy)
80
{
81
int len, i, n_max_channels, n_2ch = 0, n_5ch = 0, n_6ch = 0;
82
struct mt76_connac_mcu_channel_domain {
83
u8 alpha2[4]; /* regulatory_request.alpha2 */
84
u8 bw_2g; /* BW_20_40M 0
85
* BW_20M 1
86
* BW_20_40_80M 2
87
* BW_20_40_80_160M 3
88
* BW_20_40_80_8080M 4
89
*/
90
u8 bw_5g;
91
u8 bw_6g;
92
u8 pad;
93
u8 n_2ch;
94
u8 n_5ch;
95
u8 n_6ch;
96
u8 pad2;
97
} __packed hdr = {
98
.bw_2g = 0,
99
.bw_5g = 3, /* BW_20_40_80_160M */
100
.bw_6g = 3,
101
};
102
struct mt76_connac_mcu_chan {
103
__le16 hw_value;
104
__le16 pad;
105
__le32 flags;
106
} __packed channel;
107
struct mt76_dev *dev = phy->dev;
108
struct ieee80211_channel *chan;
109
struct sk_buff *skb;
110
111
n_max_channels = phy->sband_2g.sband.n_channels +
112
phy->sband_5g.sband.n_channels +
113
phy->sband_6g.sband.n_channels;
114
len = sizeof(hdr) + n_max_channels * sizeof(channel);
115
116
skb = mt76_mcu_msg_alloc(dev, NULL, len);
117
if (!skb)
118
return -ENOMEM;
119
120
skb_reserve(skb, sizeof(hdr));
121
122
for (i = 0; i < phy->sband_2g.sband.n_channels; i++) {
123
chan = &phy->sband_2g.sband.channels[i];
124
if (chan->flags & IEEE80211_CHAN_DISABLED)
125
continue;
126
127
channel.hw_value = cpu_to_le16(chan->hw_value);
128
channel.flags = cpu_to_le32(chan->flags);
129
channel.pad = 0;
130
131
skb_put_data(skb, &channel, sizeof(channel));
132
n_2ch++;
133
}
134
for (i = 0; i < phy->sband_5g.sband.n_channels; i++) {
135
chan = &phy->sband_5g.sband.channels[i];
136
if (chan->flags & IEEE80211_CHAN_DISABLED)
137
continue;
138
139
channel.hw_value = cpu_to_le16(chan->hw_value);
140
channel.flags = cpu_to_le32(chan->flags);
141
channel.pad = 0;
142
143
skb_put_data(skb, &channel, sizeof(channel));
144
n_5ch++;
145
}
146
for (i = 0; i < phy->sband_6g.sband.n_channels; i++) {
147
chan = &phy->sband_6g.sband.channels[i];
148
if (chan->flags & IEEE80211_CHAN_DISABLED)
149
continue;
150
151
channel.hw_value = cpu_to_le16(chan->hw_value);
152
channel.flags = cpu_to_le32(chan->flags);
153
channel.pad = 0;
154
155
skb_put_data(skb, &channel, sizeof(channel));
156
n_6ch++;
157
}
158
159
BUILD_BUG_ON(sizeof(dev->alpha2) > sizeof(hdr.alpha2));
160
memcpy(hdr.alpha2, dev->alpha2, sizeof(dev->alpha2));
161
hdr.n_2ch = n_2ch;
162
hdr.n_5ch = n_5ch;
163
hdr.n_6ch = n_6ch;
164
165
memcpy(__skb_push(skb, sizeof(hdr)), &hdr, sizeof(hdr));
166
167
return mt76_mcu_skb_send_msg(dev, skb, MCU_CE_CMD(SET_CHAN_DOMAIN),
168
false);
169
}
170
EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_channel_domain);
171
172
int mt76_connac_mcu_set_mac_enable(struct mt76_dev *dev, int band, bool enable,
173
bool hdr_trans)
174
{
175
struct {
176
u8 enable;
177
u8 band;
178
u8 rsv[2];
179
} __packed req_mac = {
180
.enable = enable,
181
.band = band,
182
};
183
184
return mt76_mcu_send_msg(dev, MCU_EXT_CMD(MAC_INIT_CTRL), &req_mac,
185
sizeof(req_mac), true);
186
}
187
EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_mac_enable);
188
189
int mt76_connac_mcu_set_vif_ps(struct mt76_dev *dev, struct ieee80211_vif *vif)
190
{
191
struct mt76_vif_link *mvif = (struct mt76_vif_link *)vif->drv_priv;
192
struct {
193
u8 bss_idx;
194
u8 ps_state; /* 0: device awake
195
* 1: static power save
196
* 2: dynamic power saving
197
*/
198
} req = {
199
.bss_idx = mvif->idx,
200
.ps_state = vif->cfg.ps ? 2 : 0,
201
};
202
203
if (vif->type != NL80211_IFTYPE_STATION)
204
return -EOPNOTSUPP;
205
206
return mt76_mcu_send_msg(dev, MCU_CE_CMD(SET_PS_PROFILE),
207
&req, sizeof(req), false);
208
}
209
EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_vif_ps);
210
211
int mt76_connac_mcu_set_rts_thresh(struct mt76_dev *dev, u32 val, u8 band)
212
{
213
struct {
214
u8 prot_idx;
215
u8 band;
216
u8 rsv[2];
217
__le32 len_thresh;
218
__le32 pkt_thresh;
219
} __packed req = {
220
.prot_idx = 1,
221
.band = band,
222
.len_thresh = cpu_to_le32(val),
223
.pkt_thresh = cpu_to_le32(0x2),
224
};
225
226
return mt76_mcu_send_msg(dev, MCU_EXT_CMD(PROTECT_CTRL), &req,
227
sizeof(req), true);
228
}
229
EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_rts_thresh);
230
231
void mt76_connac_mcu_beacon_loss_iter(void *priv, u8 *mac,
232
struct ieee80211_vif *vif)
233
{
234
struct mt76_vif_link *mvif = (struct mt76_vif_link *)vif->drv_priv;
235
struct mt76_connac_beacon_loss_event *event = priv;
236
237
if (mvif->idx != event->bss_idx)
238
return;
239
240
if (!(vif->driver_flags & IEEE80211_VIF_BEACON_FILTER))
241
return;
242
243
ieee80211_beacon_loss(vif);
244
}
245
EXPORT_SYMBOL_GPL(mt76_connac_mcu_beacon_loss_iter);
246
247
struct tlv *
248
mt76_connac_mcu_add_nested_tlv(struct sk_buff *skb, int tag, int len,
249
void *sta_ntlv, void *sta_wtbl)
250
{
251
struct sta_ntlv_hdr *ntlv_hdr = sta_ntlv;
252
struct tlv *sta_hdr = sta_wtbl;
253
struct tlv *ptlv, tlv = {
254
.tag = cpu_to_le16(tag),
255
.len = cpu_to_le16(len),
256
};
257
u16 ntlv;
258
259
ptlv = skb_put_zero(skb, len);
260
memcpy(ptlv, &tlv, sizeof(tlv));
261
262
ntlv = le16_to_cpu(ntlv_hdr->tlv_num);
263
ntlv_hdr->tlv_num = cpu_to_le16(ntlv + 1);
264
265
if (sta_hdr) {
266
len += le16_to_cpu(sta_hdr->len);
267
sta_hdr->len = cpu_to_le16(len);
268
}
269
270
return ptlv;
271
}
272
EXPORT_SYMBOL_GPL(mt76_connac_mcu_add_nested_tlv);
273
274
struct sk_buff *
275
__mt76_connac_mcu_alloc_sta_req(struct mt76_dev *dev, struct mt76_vif_link *mvif,
276
struct mt76_wcid *wcid, int len)
277
{
278
struct sta_req_hdr hdr = {
279
.bss_idx = mvif->idx,
280
.muar_idx = wcid ? mvif->omac_idx : 0,
281
.is_tlv_append = 1,
282
};
283
struct sk_buff *skb;
284
285
if (wcid && !wcid->sta && !wcid->sta_disabled)
286
hdr.muar_idx = 0xe;
287
288
mt76_connac_mcu_get_wlan_idx(dev, wcid, &hdr.wlan_idx_lo,
289
&hdr.wlan_idx_hi);
290
skb = __mt76_mcu_msg_alloc(dev, NULL, len, len, GFP_ATOMIC);
291
if (!skb)
292
return ERR_PTR(-ENOMEM);
293
294
skb_put_data(skb, &hdr, sizeof(hdr));
295
296
return skb;
297
}
298
EXPORT_SYMBOL_GPL(__mt76_connac_mcu_alloc_sta_req);
299
300
struct wtbl_req_hdr *
301
mt76_connac_mcu_alloc_wtbl_req(struct mt76_dev *dev, struct mt76_wcid *wcid,
302
int cmd, void *sta_wtbl, struct sk_buff **skb)
303
{
304
struct tlv *sta_hdr = sta_wtbl;
305
struct wtbl_req_hdr hdr = {
306
.operation = cmd,
307
};
308
struct sk_buff *nskb = *skb;
309
310
mt76_connac_mcu_get_wlan_idx(dev, wcid, &hdr.wlan_idx_lo,
311
&hdr.wlan_idx_hi);
312
if (!nskb) {
313
nskb = mt76_mcu_msg_alloc(dev, NULL,
314
MT76_CONNAC_WTBL_UPDATE_MAX_SIZE);
315
if (!nskb)
316
return ERR_PTR(-ENOMEM);
317
318
*skb = nskb;
319
}
320
321
if (sta_hdr)
322
le16_add_cpu(&sta_hdr->len, sizeof(hdr));
323
324
return skb_put_data(nskb, &hdr, sizeof(hdr));
325
}
326
EXPORT_SYMBOL_GPL(mt76_connac_mcu_alloc_wtbl_req);
327
328
void mt76_connac_mcu_bss_omac_tlv(struct sk_buff *skb,
329
struct ieee80211_vif *vif)
330
{
331
struct mt76_vif_link *mvif = (struct mt76_vif_link *)vif->drv_priv;
332
u8 omac_idx = mvif->omac_idx;
333
struct bss_info_omac *omac;
334
struct tlv *tlv;
335
u32 type = 0;
336
337
switch (vif->type) {
338
case NL80211_IFTYPE_MONITOR:
339
case NL80211_IFTYPE_MESH_POINT:
340
case NL80211_IFTYPE_AP:
341
if (vif->p2p)
342
type = CONNECTION_P2P_GO;
343
else
344
type = CONNECTION_INFRA_AP;
345
break;
346
case NL80211_IFTYPE_STATION:
347
if (vif->p2p)
348
type = CONNECTION_P2P_GC;
349
else
350
type = CONNECTION_INFRA_STA;
351
break;
352
case NL80211_IFTYPE_ADHOC:
353
type = CONNECTION_IBSS_ADHOC;
354
break;
355
default:
356
WARN_ON(1);
357
break;
358
}
359
360
tlv = mt76_connac_mcu_add_tlv(skb, BSS_INFO_OMAC, sizeof(*omac));
361
362
omac = (struct bss_info_omac *)tlv;
363
omac->conn_type = cpu_to_le32(type);
364
omac->omac_idx = mvif->omac_idx;
365
omac->band_idx = mvif->band_idx;
366
omac->hw_bss_idx = omac_idx > EXT_BSSID_START ? HW_BSSID_0 : omac_idx;
367
}
368
EXPORT_SYMBOL_GPL(mt76_connac_mcu_bss_omac_tlv);
369
370
void mt76_connac_mcu_sta_basic_tlv(struct mt76_dev *dev, struct sk_buff *skb,
371
struct ieee80211_bss_conf *link_conf,
372
struct ieee80211_link_sta *link_sta,
373
int conn_state, bool newly)
374
{
375
struct ieee80211_vif *vif = link_conf->vif;
376
struct sta_rec_basic *basic;
377
struct tlv *tlv;
378
int conn_type;
379
380
tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_BASIC, sizeof(*basic));
381
382
basic = (struct sta_rec_basic *)tlv;
383
basic->extra_info = cpu_to_le16(EXTRA_INFO_VER);
384
385
if (newly && conn_state != CONN_STATE_DISCONNECT)
386
basic->extra_info |= cpu_to_le16(EXTRA_INFO_NEW);
387
basic->conn_state = conn_state;
388
389
if (!link_sta) {
390
basic->conn_type = cpu_to_le32(CONNECTION_INFRA_BC);
391
392
if (vif->type == NL80211_IFTYPE_STATION &&
393
!is_zero_ether_addr(link_conf->bssid)) {
394
memcpy(basic->peer_addr, link_conf->bssid, ETH_ALEN);
395
basic->aid = cpu_to_le16(vif->cfg.aid);
396
} else {
397
eth_broadcast_addr(basic->peer_addr);
398
}
399
return;
400
}
401
402
switch (vif->type) {
403
case NL80211_IFTYPE_MESH_POINT:
404
case NL80211_IFTYPE_AP:
405
if (vif->p2p && !is_mt7921(dev))
406
conn_type = CONNECTION_P2P_GC;
407
else
408
conn_type = CONNECTION_INFRA_STA;
409
basic->conn_type = cpu_to_le32(conn_type);
410
basic->aid = cpu_to_le16(link_sta->sta->aid);
411
break;
412
case NL80211_IFTYPE_STATION:
413
if (vif->p2p && !is_mt7921(dev))
414
conn_type = CONNECTION_P2P_GO;
415
else
416
conn_type = CONNECTION_INFRA_AP;
417
basic->conn_type = cpu_to_le32(conn_type);
418
basic->aid = cpu_to_le16(vif->cfg.aid);
419
break;
420
case NL80211_IFTYPE_ADHOC:
421
basic->conn_type = cpu_to_le32(CONNECTION_IBSS_ADHOC);
422
basic->aid = cpu_to_le16(link_sta->sta->aid);
423
break;
424
default:
425
WARN_ON(1);
426
break;
427
}
428
429
memcpy(basic->peer_addr, link_sta->addr, ETH_ALEN);
430
basic->qos = link_sta->sta->wme;
431
}
432
EXPORT_SYMBOL_GPL(mt76_connac_mcu_sta_basic_tlv);
433
434
void mt76_connac_mcu_sta_uapsd(struct sk_buff *skb, struct ieee80211_vif *vif,
435
struct ieee80211_sta *sta)
436
{
437
struct sta_rec_uapsd *uapsd;
438
struct tlv *tlv;
439
440
if (vif->type != NL80211_IFTYPE_AP || !sta->wme)
441
return;
442
443
tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_APPS, sizeof(*uapsd));
444
uapsd = (struct sta_rec_uapsd *)tlv;
445
446
if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO) {
447
uapsd->dac_map |= BIT(3);
448
uapsd->tac_map |= BIT(3);
449
}
450
if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI) {
451
uapsd->dac_map |= BIT(2);
452
uapsd->tac_map |= BIT(2);
453
}
454
if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE) {
455
uapsd->dac_map |= BIT(1);
456
uapsd->tac_map |= BIT(1);
457
}
458
if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK) {
459
uapsd->dac_map |= BIT(0);
460
uapsd->tac_map |= BIT(0);
461
}
462
uapsd->max_sp = sta->max_sp;
463
}
464
EXPORT_SYMBOL_GPL(mt76_connac_mcu_sta_uapsd);
465
466
void mt76_connac_mcu_wtbl_hdr_trans_tlv(struct sk_buff *skb,
467
struct ieee80211_vif *vif,
468
struct mt76_wcid *wcid,
469
void *sta_wtbl, void *wtbl_tlv)
470
{
471
struct wtbl_hdr_trans *htr;
472
struct tlv *tlv;
473
474
tlv = mt76_connac_mcu_add_nested_tlv(skb, WTBL_HDR_TRANS,
475
sizeof(*htr),
476
wtbl_tlv, sta_wtbl);
477
htr = (struct wtbl_hdr_trans *)tlv;
478
htr->no_rx_trans = true;
479
480
if (vif->type == NL80211_IFTYPE_STATION)
481
htr->to_ds = true;
482
else
483
htr->from_ds = true;
484
485
if (!wcid)
486
return;
487
488
htr->no_rx_trans = !test_bit(MT_WCID_FLAG_HDR_TRANS, &wcid->flags);
489
if (test_bit(MT_WCID_FLAG_4ADDR, &wcid->flags)) {
490
htr->to_ds = true;
491
htr->from_ds = true;
492
}
493
}
494
EXPORT_SYMBOL_GPL(mt76_connac_mcu_wtbl_hdr_trans_tlv);
495
496
int mt76_connac_mcu_sta_update_hdr_trans(struct mt76_dev *dev,
497
struct ieee80211_vif *vif,
498
struct mt76_wcid *wcid, int cmd)
499
{
500
struct mt76_vif_link *mvif = (struct mt76_vif_link *)vif->drv_priv;
501
struct wtbl_req_hdr *wtbl_hdr;
502
struct tlv *sta_wtbl;
503
struct sk_buff *skb;
504
505
skb = mt76_connac_mcu_alloc_sta_req(dev, mvif, wcid);
506
if (IS_ERR(skb))
507
return PTR_ERR(skb);
508
509
sta_wtbl = mt76_connac_mcu_add_tlv(skb, STA_REC_WTBL,
510
sizeof(struct tlv));
511
512
wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(dev, wcid, WTBL_SET,
513
sta_wtbl, &skb);
514
if (IS_ERR(wtbl_hdr))
515
return PTR_ERR(wtbl_hdr);
516
517
mt76_connac_mcu_wtbl_hdr_trans_tlv(skb, vif, wcid, sta_wtbl, wtbl_hdr);
518
519
return mt76_mcu_skb_send_msg(dev, skb, cmd, true);
520
}
521
EXPORT_SYMBOL_GPL(mt76_connac_mcu_sta_update_hdr_trans);
522
523
int mt76_connac_mcu_wtbl_update_hdr_trans(struct mt76_dev *dev,
524
struct ieee80211_vif *vif,
525
struct ieee80211_sta *sta)
526
{
527
struct mt76_wcid *wcid = (struct mt76_wcid *)sta->drv_priv;
528
struct wtbl_req_hdr *wtbl_hdr;
529
struct sk_buff *skb = NULL;
530
531
wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(dev, wcid, WTBL_SET, NULL,
532
&skb);
533
if (IS_ERR(wtbl_hdr))
534
return PTR_ERR(wtbl_hdr);
535
536
mt76_connac_mcu_wtbl_hdr_trans_tlv(skb, vif, wcid, NULL, wtbl_hdr);
537
538
return mt76_mcu_skb_send_msg(dev, skb, MCU_EXT_CMD(WTBL_UPDATE), true);
539
}
540
EXPORT_SYMBOL_GPL(mt76_connac_mcu_wtbl_update_hdr_trans);
541
542
void mt76_connac_mcu_wtbl_generic_tlv(struct mt76_dev *dev,
543
struct sk_buff *skb,
544
struct ieee80211_vif *vif,
545
struct ieee80211_sta *sta,
546
void *sta_wtbl, void *wtbl_tlv)
547
{
548
struct mt76_vif_link *mvif = (struct mt76_vif_link *)vif->drv_priv;
549
struct wtbl_generic *generic;
550
struct wtbl_rx *rx;
551
struct wtbl_spe *spe;
552
struct tlv *tlv;
553
554
tlv = mt76_connac_mcu_add_nested_tlv(skb, WTBL_GENERIC,
555
sizeof(*generic),
556
wtbl_tlv, sta_wtbl);
557
558
generic = (struct wtbl_generic *)tlv;
559
560
if (sta) {
561
if (vif->type == NL80211_IFTYPE_STATION)
562
generic->partial_aid = cpu_to_le16(vif->cfg.aid);
563
else
564
generic->partial_aid = cpu_to_le16(sta->aid);
565
memcpy(generic->peer_addr, sta->addr, ETH_ALEN);
566
generic->muar_idx = mvif->omac_idx;
567
generic->qos = sta->wme;
568
} else {
569
if (!is_connac_v1(dev) && vif->type == NL80211_IFTYPE_STATION)
570
memcpy(generic->peer_addr, vif->bss_conf.bssid,
571
ETH_ALEN);
572
else
573
eth_broadcast_addr(generic->peer_addr);
574
575
generic->muar_idx = 0xe;
576
}
577
578
tlv = mt76_connac_mcu_add_nested_tlv(skb, WTBL_RX, sizeof(*rx),
579
wtbl_tlv, sta_wtbl);
580
581
rx = (struct wtbl_rx *)tlv;
582
rx->rca1 = sta ? vif->type != NL80211_IFTYPE_AP : 1;
583
rx->rca2 = 1;
584
rx->rv = 1;
585
586
if (!is_connac_v1(dev))
587
return;
588
589
tlv = mt76_connac_mcu_add_nested_tlv(skb, WTBL_SPE, sizeof(*spe),
590
wtbl_tlv, sta_wtbl);
591
spe = (struct wtbl_spe *)tlv;
592
spe->spe_idx = 24;
593
}
594
EXPORT_SYMBOL_GPL(mt76_connac_mcu_wtbl_generic_tlv);
595
596
static void
597
mt76_connac_mcu_sta_amsdu_tlv(struct sk_buff *skb, struct ieee80211_sta *sta,
598
struct ieee80211_vif *vif)
599
{
600
struct mt76_wcid *wcid = (struct mt76_wcid *)sta->drv_priv;
601
struct sta_rec_amsdu *amsdu;
602
struct tlv *tlv;
603
604
if (vif->type != NL80211_IFTYPE_AP &&
605
vif->type != NL80211_IFTYPE_STATION)
606
return;
607
608
if (!sta->deflink.agg.max_amsdu_len)
609
return;
610
611
tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_HW_AMSDU, sizeof(*amsdu));
612
amsdu = (struct sta_rec_amsdu *)tlv;
613
amsdu->max_amsdu_num = 8;
614
amsdu->amsdu_en = true;
615
amsdu->max_mpdu_size = sta->deflink.agg.max_amsdu_len >=
616
IEEE80211_MAX_MPDU_LEN_VHT_7991;
617
618
wcid->amsdu = true;
619
}
620
621
#define HE_PHY(p, c) u8_get_bits(c, IEEE80211_HE_PHY_##p)
622
#define HE_MAC(m, c) u8_get_bits(c, IEEE80211_HE_MAC_##m)
623
static void
624
mt76_connac_mcu_sta_he_tlv(struct sk_buff *skb, struct ieee80211_sta *sta)
625
{
626
struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap;
627
struct ieee80211_he_cap_elem *elem = &he_cap->he_cap_elem;
628
struct sta_rec_he *he;
629
struct tlv *tlv;
630
u32 cap = 0;
631
632
tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_HE, sizeof(*he));
633
634
he = (struct sta_rec_he *)tlv;
635
636
if (elem->mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_HTC_HE)
637
cap |= STA_REC_HE_CAP_HTC;
638
639
if (elem->mac_cap_info[2] & IEEE80211_HE_MAC_CAP2_BSR)
640
cap |= STA_REC_HE_CAP_BSR;
641
642
if (elem->mac_cap_info[3] & IEEE80211_HE_MAC_CAP3_OMI_CONTROL)
643
cap |= STA_REC_HE_CAP_OM;
644
645
if (elem->mac_cap_info[4] & IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU)
646
cap |= STA_REC_HE_CAP_AMSDU_IN_AMPDU;
647
648
if (elem->mac_cap_info[4] & IEEE80211_HE_MAC_CAP4_BQR)
649
cap |= STA_REC_HE_CAP_BQR;
650
651
if (elem->phy_cap_info[0] &
652
(IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_RU_MAPPING_IN_2G |
653
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_RU_MAPPING_IN_5G))
654
cap |= STA_REC_HE_CAP_BW20_RU242_SUPPORT;
655
656
if (elem->phy_cap_info[1] &
657
IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD)
658
cap |= STA_REC_HE_CAP_LDPC;
659
660
if (elem->phy_cap_info[1] &
661
IEEE80211_HE_PHY_CAP1_HE_LTF_AND_GI_FOR_HE_PPDUS_0_8US)
662
cap |= STA_REC_HE_CAP_SU_PPDU_1LTF_8US_GI;
663
664
if (elem->phy_cap_info[2] &
665
IEEE80211_HE_PHY_CAP2_NDP_4x_LTF_AND_3_2US)
666
cap |= STA_REC_HE_CAP_NDP_4LTF_3DOT2MS_GI;
667
668
if (elem->phy_cap_info[2] &
669
IEEE80211_HE_PHY_CAP2_STBC_TX_UNDER_80MHZ)
670
cap |= STA_REC_HE_CAP_LE_EQ_80M_TX_STBC;
671
672
if (elem->phy_cap_info[2] &
673
IEEE80211_HE_PHY_CAP2_STBC_RX_UNDER_80MHZ)
674
cap |= STA_REC_HE_CAP_LE_EQ_80M_RX_STBC;
675
676
if (elem->phy_cap_info[6] &
677
IEEE80211_HE_PHY_CAP6_PARTIAL_BW_EXT_RANGE)
678
cap |= STA_REC_HE_CAP_PARTIAL_BW_EXT_RANGE;
679
680
if (elem->phy_cap_info[7] &
681
IEEE80211_HE_PHY_CAP7_HE_SU_MU_PPDU_4XLTF_AND_08_US_GI)
682
cap |= STA_REC_HE_CAP_SU_MU_PPDU_4LTF_8US_GI;
683
684
if (elem->phy_cap_info[7] &
685
IEEE80211_HE_PHY_CAP7_STBC_TX_ABOVE_80MHZ)
686
cap |= STA_REC_HE_CAP_GT_80M_TX_STBC;
687
688
if (elem->phy_cap_info[7] &
689
IEEE80211_HE_PHY_CAP7_STBC_RX_ABOVE_80MHZ)
690
cap |= STA_REC_HE_CAP_GT_80M_RX_STBC;
691
692
if (elem->phy_cap_info[8] &
693
IEEE80211_HE_PHY_CAP8_HE_ER_SU_PPDU_4XLTF_AND_08_US_GI)
694
cap |= STA_REC_HE_CAP_ER_SU_PPDU_4LTF_8US_GI;
695
696
if (elem->phy_cap_info[8] &
697
IEEE80211_HE_PHY_CAP8_HE_ER_SU_1XLTF_AND_08_US_GI)
698
cap |= STA_REC_HE_CAP_ER_SU_PPDU_1LTF_8US_GI;
699
700
if (elem->phy_cap_info[9] &
701
IEEE80211_HE_PHY_CAP9_NON_TRIGGERED_CQI_FEEDBACK)
702
cap |= STA_REC_HE_CAP_TRIG_CQI_FK;
703
704
if (elem->phy_cap_info[9] &
705
IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU)
706
cap |= STA_REC_HE_CAP_TX_1024QAM_UNDER_RU242;
707
708
if (elem->phy_cap_info[9] &
709
IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU)
710
cap |= STA_REC_HE_CAP_RX_1024QAM_UNDER_RU242;
711
712
he->he_cap = cpu_to_le32(cap);
713
714
switch (sta->deflink.bandwidth) {
715
case IEEE80211_STA_RX_BW_160:
716
if (elem->phy_cap_info[0] &
717
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
718
he->max_nss_mcs[CMD_HE_MCS_BW8080] =
719
he_cap->he_mcs_nss_supp.rx_mcs_80p80;
720
721
he->max_nss_mcs[CMD_HE_MCS_BW160] =
722
he_cap->he_mcs_nss_supp.rx_mcs_160;
723
fallthrough;
724
default:
725
he->max_nss_mcs[CMD_HE_MCS_BW80] =
726
he_cap->he_mcs_nss_supp.rx_mcs_80;
727
break;
728
}
729
730
he->t_frame_dur =
731
HE_MAC(CAP1_TF_MAC_PAD_DUR_MASK, elem->mac_cap_info[1]);
732
he->max_ampdu_exp =
733
HE_MAC(CAP3_MAX_AMPDU_LEN_EXP_MASK, elem->mac_cap_info[3]);
734
735
he->bw_set =
736
HE_PHY(CAP0_CHANNEL_WIDTH_SET_MASK, elem->phy_cap_info[0]);
737
he->device_class =
738
HE_PHY(CAP1_DEVICE_CLASS_A, elem->phy_cap_info[1]);
739
he->punc_pream_rx =
740
HE_PHY(CAP1_PREAMBLE_PUNC_RX_MASK, elem->phy_cap_info[1]);
741
742
he->dcm_tx_mode =
743
HE_PHY(CAP3_DCM_MAX_CONST_TX_MASK, elem->phy_cap_info[3]);
744
he->dcm_tx_max_nss =
745
HE_PHY(CAP3_DCM_MAX_TX_NSS_2, elem->phy_cap_info[3]);
746
he->dcm_rx_mode =
747
HE_PHY(CAP3_DCM_MAX_CONST_RX_MASK, elem->phy_cap_info[3]);
748
he->dcm_rx_max_nss =
749
HE_PHY(CAP3_DCM_MAX_RX_NSS_2, elem->phy_cap_info[3]);
750
he->dcm_rx_max_nss =
751
HE_PHY(CAP8_DCM_MAX_RU_MASK, elem->phy_cap_info[8]);
752
753
he->pkt_ext = 2;
754
}
755
756
void
757
mt76_connac_mcu_sta_he_tlv_v2(struct sk_buff *skb, struct ieee80211_sta *sta)
758
{
759
struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap;
760
struct ieee80211_he_cap_elem *elem = &he_cap->he_cap_elem;
761
struct sta_rec_he_v2 *he;
762
struct tlv *tlv;
763
764
tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_HE_V2, sizeof(*he));
765
766
he = (struct sta_rec_he_v2 *)tlv;
767
memcpy(he->he_phy_cap, elem->phy_cap_info, sizeof(he->he_phy_cap));
768
memcpy(he->he_mac_cap, elem->mac_cap_info, sizeof(he->he_mac_cap));
769
770
switch (sta->deflink.bandwidth) {
771
case IEEE80211_STA_RX_BW_160:
772
if (elem->phy_cap_info[0] &
773
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
774
he->max_nss_mcs[CMD_HE_MCS_BW8080] =
775
he_cap->he_mcs_nss_supp.rx_mcs_80p80;
776
777
he->max_nss_mcs[CMD_HE_MCS_BW160] =
778
he_cap->he_mcs_nss_supp.rx_mcs_160;
779
fallthrough;
780
default:
781
he->max_nss_mcs[CMD_HE_MCS_BW80] =
782
he_cap->he_mcs_nss_supp.rx_mcs_80;
783
break;
784
}
785
786
he->pkt_ext = IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_16US;
787
}
788
EXPORT_SYMBOL_GPL(mt76_connac_mcu_sta_he_tlv_v2);
789
790
u8
791
mt76_connac_get_phy_mode_v2(struct mt76_phy *mphy, struct ieee80211_vif *vif,
792
enum nl80211_band band,
793
struct ieee80211_link_sta *link_sta)
794
{
795
struct ieee80211_sta_ht_cap *ht_cap;
796
struct ieee80211_sta_vht_cap *vht_cap;
797
const struct ieee80211_sta_he_cap *he_cap;
798
const struct ieee80211_sta_eht_cap *eht_cap;
799
u8 mode = 0;
800
801
if (link_sta) {
802
ht_cap = &link_sta->ht_cap;
803
vht_cap = &link_sta->vht_cap;
804
he_cap = &link_sta->he_cap;
805
eht_cap = &link_sta->eht_cap;
806
} else {
807
struct ieee80211_supported_band *sband;
808
809
sband = mphy->hw->wiphy->bands[band];
810
ht_cap = &sband->ht_cap;
811
vht_cap = &sband->vht_cap;
812
he_cap = ieee80211_get_he_iftype_cap(sband, vif->type);
813
eht_cap = ieee80211_get_eht_iftype_cap(sband, vif->type);
814
}
815
816
if (band == NL80211_BAND_2GHZ) {
817
mode |= PHY_TYPE_BIT_HR_DSSS | PHY_TYPE_BIT_ERP;
818
819
if (ht_cap->ht_supported)
820
mode |= PHY_TYPE_BIT_HT;
821
822
if (he_cap && he_cap->has_he)
823
mode |= PHY_TYPE_BIT_HE;
824
825
if (eht_cap && eht_cap->has_eht)
826
mode |= PHY_TYPE_BIT_BE;
827
} else if (band == NL80211_BAND_5GHZ || band == NL80211_BAND_6GHZ) {
828
mode |= PHY_TYPE_BIT_OFDM;
829
830
if (ht_cap->ht_supported)
831
mode |= PHY_TYPE_BIT_HT;
832
833
if (vht_cap->vht_supported)
834
mode |= PHY_TYPE_BIT_VHT;
835
836
if (he_cap && he_cap->has_he)
837
mode |= PHY_TYPE_BIT_HE;
838
839
if (eht_cap && eht_cap->has_eht)
840
mode |= PHY_TYPE_BIT_BE;
841
}
842
843
return mode;
844
}
845
EXPORT_SYMBOL_GPL(mt76_connac_get_phy_mode_v2);
846
847
void mt76_connac_mcu_sta_tlv(struct mt76_phy *mphy, struct sk_buff *skb,
848
struct ieee80211_sta *sta,
849
struct ieee80211_vif *vif,
850
u8 rcpi, u8 sta_state)
851
{
852
struct mt76_vif_link *mvif = (struct mt76_vif_link *)vif->drv_priv;
853
struct cfg80211_chan_def *chandef = mvif->ctx ?
854
&mvif->ctx->def : &mphy->chandef;
855
enum nl80211_band band = chandef->chan->band;
856
struct mt76_dev *dev = mphy->dev;
857
struct sta_rec_ra_info *ra_info;
858
struct sta_rec_state *state;
859
struct sta_rec_phy *phy;
860
struct tlv *tlv;
861
u16 supp_rates;
862
863
/* starec ht */
864
if (sta->deflink.ht_cap.ht_supported) {
865
struct sta_rec_ht *ht;
866
867
tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_HT, sizeof(*ht));
868
ht = (struct sta_rec_ht *)tlv;
869
ht->ht_cap = cpu_to_le16(sta->deflink.ht_cap.cap);
870
}
871
872
/* starec vht */
873
if (sta->deflink.vht_cap.vht_supported) {
874
struct sta_rec_vht *vht;
875
int len;
876
877
len = is_mt7921(dev) ? sizeof(*vht) : sizeof(*vht) - 4;
878
tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_VHT, len);
879
vht = (struct sta_rec_vht *)tlv;
880
vht->vht_cap = cpu_to_le32(sta->deflink.vht_cap.cap);
881
vht->vht_rx_mcs_map = sta->deflink.vht_cap.vht_mcs.rx_mcs_map;
882
vht->vht_tx_mcs_map = sta->deflink.vht_cap.vht_mcs.tx_mcs_map;
883
}
884
885
/* starec uapsd */
886
mt76_connac_mcu_sta_uapsd(skb, vif, sta);
887
888
if (!is_mt7921(dev))
889
return;
890
891
if (sta->deflink.ht_cap.ht_supported || sta->deflink.he_cap.has_he)
892
mt76_connac_mcu_sta_amsdu_tlv(skb, sta, vif);
893
894
/* starec he */
895
if (sta->deflink.he_cap.has_he) {
896
mt76_connac_mcu_sta_he_tlv(skb, sta);
897
mt76_connac_mcu_sta_he_tlv_v2(skb, sta);
898
if (band == NL80211_BAND_6GHZ &&
899
sta_state == MT76_STA_INFO_STATE_ASSOC) {
900
struct sta_rec_he_6g_capa *he_6g_capa;
901
902
tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_HE_6G,
903
sizeof(*he_6g_capa));
904
he_6g_capa = (struct sta_rec_he_6g_capa *)tlv;
905
he_6g_capa->capa = sta->deflink.he_6ghz_capa.capa;
906
}
907
}
908
909
tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_PHY, sizeof(*phy));
910
phy = (struct sta_rec_phy *)tlv;
911
phy->phy_type = mt76_connac_get_phy_mode_v2(mphy, vif, band,
912
&sta->deflink);
913
phy->basic_rate = cpu_to_le16((u16)vif->bss_conf.basic_rates);
914
phy->rcpi = rcpi;
915
phy->ampdu = FIELD_PREP(IEEE80211_HT_AMPDU_PARM_FACTOR,
916
sta->deflink.ht_cap.ampdu_factor) |
917
FIELD_PREP(IEEE80211_HT_AMPDU_PARM_DENSITY,
918
sta->deflink.ht_cap.ampdu_density);
919
920
tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_RA, sizeof(*ra_info));
921
ra_info = (struct sta_rec_ra_info *)tlv;
922
923
supp_rates = sta->deflink.supp_rates[band];
924
if (band == NL80211_BAND_2GHZ)
925
supp_rates = FIELD_PREP(RA_LEGACY_OFDM, supp_rates >> 4) |
926
FIELD_PREP(RA_LEGACY_CCK, supp_rates & 0xf);
927
else
928
supp_rates = FIELD_PREP(RA_LEGACY_OFDM, supp_rates);
929
930
ra_info->legacy = cpu_to_le16(supp_rates);
931
932
if (sta->deflink.ht_cap.ht_supported)
933
memcpy(ra_info->rx_mcs_bitmask,
934
sta->deflink.ht_cap.mcs.rx_mask,
935
HT_MCS_MASK_NUM);
936
937
tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_STATE, sizeof(*state));
938
state = (struct sta_rec_state *)tlv;
939
state->state = sta_state;
940
941
if (sta->deflink.vht_cap.vht_supported) {
942
state->vht_opmode = sta->deflink.bandwidth;
943
state->vht_opmode |= (sta->deflink.rx_nss - 1) <<
944
IEEE80211_OPMODE_NOTIF_RX_NSS_SHIFT;
945
}
946
}
947
EXPORT_SYMBOL_GPL(mt76_connac_mcu_sta_tlv);
948
949
void mt76_connac_mcu_wtbl_smps_tlv(struct sk_buff *skb,
950
struct ieee80211_sta *sta,
951
void *sta_wtbl, void *wtbl_tlv)
952
{
953
struct wtbl_smps *smps;
954
struct tlv *tlv;
955
956
tlv = mt76_connac_mcu_add_nested_tlv(skb, WTBL_SMPS, sizeof(*smps),
957
wtbl_tlv, sta_wtbl);
958
smps = (struct wtbl_smps *)tlv;
959
smps->smps = (sta->deflink.smps_mode == IEEE80211_SMPS_DYNAMIC);
960
}
961
EXPORT_SYMBOL_GPL(mt76_connac_mcu_wtbl_smps_tlv);
962
963
void mt76_connac_mcu_wtbl_ht_tlv(struct mt76_dev *dev, struct sk_buff *skb,
964
struct ieee80211_sta *sta, void *sta_wtbl,
965
void *wtbl_tlv, bool ht_ldpc, bool vht_ldpc)
966
{
967
struct wtbl_ht *ht = NULL;
968
struct tlv *tlv;
969
u32 flags = 0;
970
971
if (sta->deflink.ht_cap.ht_supported || sta->deflink.he_6ghz_capa.capa) {
972
tlv = mt76_connac_mcu_add_nested_tlv(skb, WTBL_HT, sizeof(*ht),
973
wtbl_tlv, sta_wtbl);
974
ht = (struct wtbl_ht *)tlv;
975
ht->ldpc = ht_ldpc &&
976
!!(sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_LDPC_CODING);
977
978
if (sta->deflink.ht_cap.ht_supported) {
979
ht->af = sta->deflink.ht_cap.ampdu_factor;
980
ht->mm = sta->deflink.ht_cap.ampdu_density;
981
} else {
982
ht->af = le16_get_bits(sta->deflink.he_6ghz_capa.capa,
983
IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP);
984
ht->mm = le16_get_bits(sta->deflink.he_6ghz_capa.capa,
985
IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START);
986
}
987
988
ht->ht = true;
989
}
990
991
if (sta->deflink.vht_cap.vht_supported || sta->deflink.he_6ghz_capa.capa) {
992
struct wtbl_vht *vht;
993
u8 af;
994
995
tlv = mt76_connac_mcu_add_nested_tlv(skb, WTBL_VHT,
996
sizeof(*vht), wtbl_tlv,
997
sta_wtbl);
998
vht = (struct wtbl_vht *)tlv;
999
vht->ldpc = vht_ldpc &&
1000
!!(sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_RXLDPC);
1001
vht->vht = true;
1002
1003
af = FIELD_GET(IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK,
1004
sta->deflink.vht_cap.cap);
1005
if (ht)
1006
ht->af = max(ht->af, af);
1007
}
1008
1009
mt76_connac_mcu_wtbl_smps_tlv(skb, sta, sta_wtbl, wtbl_tlv);
1010
1011
if (is_connac_v1(dev) && sta->deflink.ht_cap.ht_supported) {
1012
/* sgi */
1013
u32 msk = MT_WTBL_W5_SHORT_GI_20 | MT_WTBL_W5_SHORT_GI_40 |
1014
MT_WTBL_W5_SHORT_GI_80 | MT_WTBL_W5_SHORT_GI_160;
1015
struct wtbl_raw *raw;
1016
1017
tlv = mt76_connac_mcu_add_nested_tlv(skb, WTBL_RAW_DATA,
1018
sizeof(*raw), wtbl_tlv,
1019
sta_wtbl);
1020
1021
if (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20)
1022
flags |= MT_WTBL_W5_SHORT_GI_20;
1023
if (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40)
1024
flags |= MT_WTBL_W5_SHORT_GI_40;
1025
1026
if (sta->deflink.vht_cap.vht_supported) {
1027
if (sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_80)
1028
flags |= MT_WTBL_W5_SHORT_GI_80;
1029
if (sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_160)
1030
flags |= MT_WTBL_W5_SHORT_GI_160;
1031
}
1032
raw = (struct wtbl_raw *)tlv;
1033
raw->val = cpu_to_le32(flags);
1034
raw->msk = cpu_to_le32(~msk);
1035
raw->wtbl_idx = 1;
1036
raw->dw = 5;
1037
}
1038
}
1039
EXPORT_SYMBOL_GPL(mt76_connac_mcu_wtbl_ht_tlv);
1040
1041
int mt76_connac_mcu_sta_cmd(struct mt76_phy *phy,
1042
struct mt76_sta_cmd_info *info)
1043
{
1044
struct mt76_vif_link *mvif = (struct mt76_vif_link *)info->vif->drv_priv;
1045
struct ieee80211_link_sta *link_sta;
1046
struct mt76_dev *dev = phy->dev;
1047
struct wtbl_req_hdr *wtbl_hdr;
1048
struct tlv *sta_wtbl;
1049
struct sk_buff *skb;
1050
int conn_state;
1051
1052
if (!info->link_conf)
1053
info->link_conf = &info->vif->bss_conf;
1054
1055
skb = mt76_connac_mcu_alloc_sta_req(dev, mvif, info->wcid);
1056
if (IS_ERR(skb))
1057
return PTR_ERR(skb);
1058
1059
conn_state = info->enable ? CONN_STATE_PORT_SECURE :
1060
CONN_STATE_DISCONNECT;
1061
link_sta = info->sta ? &info->sta->deflink : NULL;
1062
if (info->sta || !info->offload_fw)
1063
mt76_connac_mcu_sta_basic_tlv(dev, skb, info->link_conf,
1064
link_sta, conn_state,
1065
info->newly);
1066
if (info->sta && info->enable)
1067
mt76_connac_mcu_sta_tlv(phy, skb, info->sta,
1068
info->vif, info->rcpi,
1069
info->state);
1070
1071
sta_wtbl = mt76_connac_mcu_add_tlv(skb, STA_REC_WTBL,
1072
sizeof(struct tlv));
1073
1074
wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(dev, info->wcid,
1075
WTBL_RESET_AND_SET,
1076
sta_wtbl, &skb);
1077
if (IS_ERR(wtbl_hdr))
1078
return PTR_ERR(wtbl_hdr);
1079
1080
if (info->enable) {
1081
mt76_connac_mcu_wtbl_generic_tlv(dev, skb, info->vif,
1082
info->sta, sta_wtbl,
1083
wtbl_hdr);
1084
mt76_connac_mcu_wtbl_hdr_trans_tlv(skb, info->vif, info->wcid,
1085
sta_wtbl, wtbl_hdr);
1086
if (info->sta)
1087
mt76_connac_mcu_wtbl_ht_tlv(dev, skb, info->sta,
1088
sta_wtbl, wtbl_hdr,
1089
true, true);
1090
}
1091
1092
return mt76_mcu_skb_send_msg(dev, skb, info->cmd, true);
1093
}
1094
EXPORT_SYMBOL_GPL(mt76_connac_mcu_sta_cmd);
1095
1096
void mt76_connac_mcu_wtbl_ba_tlv(struct mt76_dev *dev, struct sk_buff *skb,
1097
struct ieee80211_ampdu_params *params,
1098
bool enable, bool tx, void *sta_wtbl,
1099
void *wtbl_tlv)
1100
{
1101
struct wtbl_ba *ba;
1102
struct tlv *tlv;
1103
1104
tlv = mt76_connac_mcu_add_nested_tlv(skb, WTBL_BA, sizeof(*ba),
1105
wtbl_tlv, sta_wtbl);
1106
1107
ba = (struct wtbl_ba *)tlv;
1108
ba->tid = params->tid;
1109
1110
if (tx) {
1111
ba->ba_type = MT_BA_TYPE_ORIGINATOR;
1112
ba->sn = enable ? cpu_to_le16(params->ssn) : 0;
1113
ba->ba_winsize = enable ? cpu_to_le16(params->buf_size) : 0;
1114
ba->ba_en = enable;
1115
} else {
1116
memcpy(ba->peer_addr, params->sta->addr, ETH_ALEN);
1117
ba->ba_type = MT_BA_TYPE_RECIPIENT;
1118
ba->rst_ba_tid = params->tid;
1119
ba->rst_ba_sel = RST_BA_MAC_TID_MATCH;
1120
ba->rst_ba_sb = 1;
1121
}
1122
1123
if (!is_connac_v1(dev)) {
1124
ba->ba_winsize = enable ? cpu_to_le16(params->buf_size) : 0;
1125
return;
1126
}
1127
1128
if (enable && tx) {
1129
static const u8 ba_range[] = { 4, 8, 12, 24, 36, 48, 54, 64 };
1130
int i;
1131
1132
for (i = 7; i > 0; i--) {
1133
if (params->buf_size >= ba_range[i])
1134
break;
1135
}
1136
ba->ba_winsize_idx = i;
1137
}
1138
}
1139
EXPORT_SYMBOL_GPL(mt76_connac_mcu_wtbl_ba_tlv);
1140
1141
int mt76_connac_mcu_uni_add_dev(struct mt76_phy *phy,
1142
struct ieee80211_bss_conf *bss_conf,
1143
struct mt76_vif_link *mvif,
1144
struct mt76_wcid *wcid,
1145
bool enable)
1146
{
1147
struct mt76_dev *dev = phy->dev;
1148
struct {
1149
struct {
1150
u8 omac_idx;
1151
u8 band_idx;
1152
__le16 pad;
1153
} __packed hdr;
1154
struct req_tlv {
1155
__le16 tag;
1156
__le16 len;
1157
u8 active;
1158
u8 link_idx; /* not link_id */
1159
u8 omac_addr[ETH_ALEN];
1160
} __packed tlv;
1161
} dev_req = {
1162
.hdr = {
1163
.omac_idx = mvif->omac_idx,
1164
.band_idx = mvif->band_idx,
1165
},
1166
.tlv = {
1167
.tag = cpu_to_le16(DEV_INFO_ACTIVE),
1168
.len = cpu_to_le16(sizeof(struct req_tlv)),
1169
.active = enable,
1170
.link_idx = mvif->link_idx,
1171
},
1172
};
1173
struct {
1174
struct {
1175
u8 bss_idx;
1176
u8 pad[3];
1177
} __packed hdr;
1178
struct mt76_connac_bss_basic_tlv basic;
1179
} basic_req = {
1180
.hdr = {
1181
.bss_idx = mvif->idx,
1182
},
1183
.basic = {
1184
.tag = cpu_to_le16(UNI_BSS_INFO_BASIC),
1185
.len = cpu_to_le16(sizeof(struct mt76_connac_bss_basic_tlv)),
1186
.omac_idx = mvif->omac_idx,
1187
.band_idx = mvif->band_idx,
1188
.wmm_idx = mvif->wmm_idx,
1189
.active = enable,
1190
.bmc_tx_wlan_idx = cpu_to_le16(wcid->idx),
1191
.sta_idx = cpu_to_le16(wcid->idx),
1192
.conn_state = 1,
1193
.link_idx = mvif->link_idx,
1194
},
1195
};
1196
int err, idx, cmd, len;
1197
void *data;
1198
1199
switch (bss_conf->vif->type) {
1200
case NL80211_IFTYPE_MESH_POINT:
1201
case NL80211_IFTYPE_MONITOR:
1202
case NL80211_IFTYPE_AP:
1203
basic_req.basic.conn_type = cpu_to_le32(CONNECTION_INFRA_AP);
1204
break;
1205
case NL80211_IFTYPE_STATION:
1206
basic_req.basic.conn_type = cpu_to_le32(CONNECTION_INFRA_STA);
1207
break;
1208
case NL80211_IFTYPE_P2P_DEVICE:
1209
basic_req.basic.conn_type = cpu_to_le32(CONNECTION_P2P_GO);
1210
break;
1211
case NL80211_IFTYPE_ADHOC:
1212
basic_req.basic.conn_type = cpu_to_le32(CONNECTION_IBSS_ADHOC);
1213
break;
1214
default:
1215
WARN_ON(1);
1216
break;
1217
}
1218
1219
idx = mvif->omac_idx > EXT_BSSID_START ? HW_BSSID_0 : mvif->omac_idx;
1220
basic_req.basic.hw_bss_idx = idx;
1221
1222
memcpy(dev_req.tlv.omac_addr, bss_conf->addr, ETH_ALEN);
1223
1224
cmd = enable ? MCU_UNI_CMD(DEV_INFO_UPDATE) : MCU_UNI_CMD(BSS_INFO_UPDATE);
1225
data = enable ? (void *)&dev_req : (void *)&basic_req;
1226
len = enable ? sizeof(dev_req) : sizeof(basic_req);
1227
1228
err = mt76_mcu_send_msg(dev, cmd, data, len, true);
1229
if (err < 0)
1230
return err;
1231
1232
cmd = enable ? MCU_UNI_CMD(BSS_INFO_UPDATE) : MCU_UNI_CMD(DEV_INFO_UPDATE);
1233
data = enable ? (void *)&basic_req : (void *)&dev_req;
1234
len = enable ? sizeof(basic_req) : sizeof(dev_req);
1235
1236
return mt76_mcu_send_msg(dev, cmd, data, len, true);
1237
}
1238
EXPORT_SYMBOL_GPL(mt76_connac_mcu_uni_add_dev);
1239
1240
void mt76_connac_mcu_sta_ba_tlv(struct sk_buff *skb,
1241
struct ieee80211_ampdu_params *params,
1242
bool enable, bool tx)
1243
{
1244
struct sta_rec_ba *ba;
1245
struct tlv *tlv;
1246
1247
tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_BA, sizeof(*ba));
1248
1249
ba = (struct sta_rec_ba *)tlv;
1250
ba->ba_type = tx ? MT_BA_TYPE_ORIGINATOR : MT_BA_TYPE_RECIPIENT;
1251
ba->winsize = cpu_to_le16(params->buf_size);
1252
ba->ssn = cpu_to_le16(params->ssn);
1253
ba->ba_en = enable << params->tid;
1254
ba->amsdu = params->amsdu;
1255
ba->tid = params->tid;
1256
}
1257
EXPORT_SYMBOL_GPL(mt76_connac_mcu_sta_ba_tlv);
1258
1259
int mt76_connac_mcu_sta_wed_update(struct mt76_dev *dev, struct sk_buff *skb)
1260
{
1261
if (!mt76_is_mmio(dev))
1262
return 0;
1263
1264
if (!mtk_wed_device_active(&dev->mmio.wed))
1265
return 0;
1266
1267
return mtk_wed_device_update_msg(&dev->mmio.wed, WED_WO_STA_REC,
1268
skb->data, skb->len);
1269
}
1270
EXPORT_SYMBOL_GPL(mt76_connac_mcu_sta_wed_update);
1271
1272
int mt76_connac_mcu_sta_ba(struct mt76_dev *dev, struct mt76_vif_link *mvif,
1273
struct ieee80211_ampdu_params *params,
1274
int cmd, bool enable, bool tx)
1275
{
1276
struct mt76_wcid *wcid = (struct mt76_wcid *)params->sta->drv_priv;
1277
struct wtbl_req_hdr *wtbl_hdr;
1278
struct tlv *sta_wtbl;
1279
struct sk_buff *skb;
1280
int ret;
1281
1282
skb = mt76_connac_mcu_alloc_sta_req(dev, mvif, wcid);
1283
if (IS_ERR(skb))
1284
return PTR_ERR(skb);
1285
1286
sta_wtbl = mt76_connac_mcu_add_tlv(skb, STA_REC_WTBL,
1287
sizeof(struct tlv));
1288
1289
wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(dev, wcid, WTBL_SET,
1290
sta_wtbl, &skb);
1291
if (IS_ERR(wtbl_hdr))
1292
return PTR_ERR(wtbl_hdr);
1293
1294
mt76_connac_mcu_wtbl_ba_tlv(dev, skb, params, enable, tx, sta_wtbl,
1295
wtbl_hdr);
1296
1297
ret = mt76_connac_mcu_sta_wed_update(dev, skb);
1298
if (ret)
1299
return ret;
1300
1301
ret = mt76_mcu_skb_send_msg(dev, skb, cmd, true);
1302
if (ret)
1303
return ret;
1304
1305
skb = mt76_connac_mcu_alloc_sta_req(dev, mvif, wcid);
1306
if (IS_ERR(skb))
1307
return PTR_ERR(skb);
1308
1309
mt76_connac_mcu_sta_ba_tlv(skb, params, enable, tx);
1310
1311
ret = mt76_connac_mcu_sta_wed_update(dev, skb);
1312
if (ret)
1313
return ret;
1314
1315
return mt76_mcu_skb_send_msg(dev, skb, cmd, true);
1316
}
1317
EXPORT_SYMBOL_GPL(mt76_connac_mcu_sta_ba);
1318
1319
u8 mt76_connac_get_phy_mode(struct mt76_phy *phy, struct ieee80211_vif *vif,
1320
enum nl80211_band band,
1321
struct ieee80211_link_sta *link_sta)
1322
{
1323
struct mt76_dev *dev = phy->dev;
1324
const struct ieee80211_sta_he_cap *he_cap;
1325
struct ieee80211_sta_vht_cap *vht_cap;
1326
struct ieee80211_sta_ht_cap *ht_cap;
1327
u8 mode = 0;
1328
1329
if (is_connac_v1(dev))
1330
return 0x38;
1331
1332
if (link_sta) {
1333
ht_cap = &link_sta->ht_cap;
1334
vht_cap = &link_sta->vht_cap;
1335
he_cap = &link_sta->he_cap;
1336
} else {
1337
struct ieee80211_supported_band *sband;
1338
1339
sband = phy->hw->wiphy->bands[band];
1340
ht_cap = &sband->ht_cap;
1341
vht_cap = &sband->vht_cap;
1342
he_cap = ieee80211_get_he_iftype_cap(sband, vif->type);
1343
}
1344
1345
if (band == NL80211_BAND_2GHZ) {
1346
mode |= PHY_MODE_B | PHY_MODE_G;
1347
1348
if (ht_cap->ht_supported)
1349
mode |= PHY_MODE_GN;
1350
1351
if (he_cap && he_cap->has_he)
1352
mode |= PHY_MODE_AX_24G;
1353
} else if (band == NL80211_BAND_5GHZ) {
1354
mode |= PHY_MODE_A;
1355
1356
if (ht_cap->ht_supported)
1357
mode |= PHY_MODE_AN;
1358
1359
if (vht_cap->vht_supported)
1360
mode |= PHY_MODE_AC;
1361
1362
if (he_cap && he_cap->has_he)
1363
mode |= PHY_MODE_AX_5G;
1364
} else if (band == NL80211_BAND_6GHZ) {
1365
mode |= PHY_MODE_A | PHY_MODE_AN |
1366
PHY_MODE_AC | PHY_MODE_AX_5G;
1367
}
1368
1369
return mode;
1370
}
1371
EXPORT_SYMBOL_GPL(mt76_connac_get_phy_mode);
1372
1373
u8 mt76_connac_get_phy_mode_ext(struct mt76_phy *phy, struct ieee80211_bss_conf *conf,
1374
enum nl80211_band band)
1375
{
1376
const struct ieee80211_sta_eht_cap *eht_cap;
1377
struct ieee80211_supported_band *sband;
1378
u8 mode = 0;
1379
1380
if (band == NL80211_BAND_6GHZ)
1381
mode |= PHY_MODE_AX_6G;
1382
1383
sband = phy->hw->wiphy->bands[band];
1384
eht_cap = ieee80211_get_eht_iftype_cap(sband, conf->vif->type);
1385
1386
if (!eht_cap || !eht_cap->has_eht || !conf->eht_support)
1387
return mode;
1388
1389
switch (band) {
1390
case NL80211_BAND_6GHZ:
1391
mode |= PHY_MODE_BE_6G;
1392
break;
1393
case NL80211_BAND_5GHZ:
1394
mode |= PHY_MODE_BE_5G;
1395
break;
1396
case NL80211_BAND_2GHZ:
1397
mode |= PHY_MODE_BE_24G;
1398
break;
1399
default:
1400
break;
1401
}
1402
1403
return mode;
1404
}
1405
EXPORT_SYMBOL_GPL(mt76_connac_get_phy_mode_ext);
1406
1407
const struct ieee80211_sta_he_cap *
1408
mt76_connac_get_he_phy_cap(struct mt76_phy *phy, struct ieee80211_vif *vif)
1409
{
1410
struct mt76_vif_link *mvif = (struct mt76_vif_link *)vif->drv_priv;
1411
struct cfg80211_chan_def *chandef = mvif->ctx ?
1412
&mvif->ctx->def : &phy->chandef;
1413
enum nl80211_band band = chandef->chan->band;
1414
struct ieee80211_supported_band *sband;
1415
1416
sband = phy->hw->wiphy->bands[band];
1417
1418
return ieee80211_get_he_iftype_cap(sband, vif->type);
1419
}
1420
EXPORT_SYMBOL_GPL(mt76_connac_get_he_phy_cap);
1421
1422
const struct ieee80211_sta_eht_cap *
1423
mt76_connac_get_eht_phy_cap(struct mt76_phy *phy, struct ieee80211_vif *vif)
1424
{
1425
enum nl80211_band band = phy->chandef.chan->band;
1426
struct ieee80211_supported_band *sband;
1427
1428
sband = phy->hw->wiphy->bands[band];
1429
1430
return ieee80211_get_eht_iftype_cap(sband, vif->type);
1431
}
1432
EXPORT_SYMBOL_GPL(mt76_connac_get_eht_phy_cap);
1433
1434
#define DEFAULT_HE_PE_DURATION 4
1435
#define DEFAULT_HE_DURATION_RTS_THRES 1023
1436
static void
1437
mt76_connac_mcu_uni_bss_he_tlv(struct mt76_phy *phy, struct ieee80211_vif *vif,
1438
struct tlv *tlv)
1439
{
1440
const struct ieee80211_sta_he_cap *cap;
1441
struct bss_info_uni_he *he;
1442
1443
cap = mt76_connac_get_he_phy_cap(phy, vif);
1444
1445
he = (struct bss_info_uni_he *)tlv;
1446
he->he_pe_duration = vif->bss_conf.htc_trig_based_pkt_ext;
1447
if (!he->he_pe_duration)
1448
he->he_pe_duration = DEFAULT_HE_PE_DURATION;
1449
1450
he->he_rts_thres = cpu_to_le16(vif->bss_conf.frame_time_rts_th);
1451
if (!he->he_rts_thres)
1452
he->he_rts_thres = cpu_to_le16(DEFAULT_HE_DURATION_RTS_THRES);
1453
1454
he->max_nss_mcs[CMD_HE_MCS_BW80] = cap->he_mcs_nss_supp.tx_mcs_80;
1455
he->max_nss_mcs[CMD_HE_MCS_BW160] = cap->he_mcs_nss_supp.tx_mcs_160;
1456
he->max_nss_mcs[CMD_HE_MCS_BW8080] = cap->he_mcs_nss_supp.tx_mcs_80p80;
1457
}
1458
1459
int mt76_connac_mcu_uni_set_chctx(struct mt76_phy *phy, struct mt76_vif_link *mvif,
1460
struct ieee80211_chanctx_conf *ctx)
1461
{
1462
struct cfg80211_chan_def *chandef = ctx ? &ctx->def : &phy->chandef;
1463
int freq1 = chandef->center_freq1, freq2 = chandef->center_freq2;
1464
enum nl80211_band band = chandef->chan->band;
1465
struct mt76_dev *mdev = phy->dev;
1466
struct {
1467
struct {
1468
u8 bss_idx;
1469
u8 pad[3];
1470
} __packed hdr;
1471
struct rlm_tlv {
1472
__le16 tag;
1473
__le16 len;
1474
u8 control_channel;
1475
u8 center_chan;
1476
u8 center_chan2;
1477
u8 bw;
1478
u8 tx_streams;
1479
u8 rx_streams;
1480
u8 short_st;
1481
u8 ht_op_info;
1482
u8 sco;
1483
u8 band;
1484
u8 pad[2];
1485
} __packed rlm;
1486
} __packed rlm_req = {
1487
.hdr = {
1488
.bss_idx = mvif->idx,
1489
},
1490
.rlm = {
1491
.tag = cpu_to_le16(UNI_BSS_INFO_RLM),
1492
.len = cpu_to_le16(sizeof(struct rlm_tlv)),
1493
.control_channel = chandef->chan->hw_value,
1494
.center_chan = ieee80211_frequency_to_channel(freq1),
1495
.center_chan2 = ieee80211_frequency_to_channel(freq2),
1496
.tx_streams = hweight8(phy->antenna_mask),
1497
.ht_op_info = 4, /* set HT 40M allowed */
1498
.rx_streams = phy->chainmask,
1499
.short_st = true,
1500
.band = band,
1501
},
1502
};
1503
1504
switch (chandef->width) {
1505
case NL80211_CHAN_WIDTH_40:
1506
rlm_req.rlm.bw = CMD_CBW_40MHZ;
1507
break;
1508
case NL80211_CHAN_WIDTH_80:
1509
rlm_req.rlm.bw = CMD_CBW_80MHZ;
1510
break;
1511
case NL80211_CHAN_WIDTH_80P80:
1512
rlm_req.rlm.bw = CMD_CBW_8080MHZ;
1513
break;
1514
case NL80211_CHAN_WIDTH_160:
1515
rlm_req.rlm.bw = CMD_CBW_160MHZ;
1516
break;
1517
case NL80211_CHAN_WIDTH_5:
1518
rlm_req.rlm.bw = CMD_CBW_5MHZ;
1519
break;
1520
case NL80211_CHAN_WIDTH_10:
1521
rlm_req.rlm.bw = CMD_CBW_10MHZ;
1522
break;
1523
case NL80211_CHAN_WIDTH_20_NOHT:
1524
case NL80211_CHAN_WIDTH_20:
1525
default:
1526
rlm_req.rlm.bw = CMD_CBW_20MHZ;
1527
rlm_req.rlm.ht_op_info = 0;
1528
break;
1529
}
1530
1531
if (rlm_req.rlm.control_channel < rlm_req.rlm.center_chan)
1532
rlm_req.rlm.sco = 1; /* SCA */
1533
else if (rlm_req.rlm.control_channel > rlm_req.rlm.center_chan)
1534
rlm_req.rlm.sco = 3; /* SCB */
1535
1536
return mt76_mcu_send_msg(mdev, MCU_UNI_CMD(BSS_INFO_UPDATE), &rlm_req,
1537
sizeof(rlm_req), true);
1538
}
1539
EXPORT_SYMBOL_GPL(mt76_connac_mcu_uni_set_chctx);
1540
1541
int mt76_connac_mcu_uni_add_bss(struct mt76_phy *phy,
1542
struct ieee80211_vif *vif,
1543
struct mt76_wcid *wcid,
1544
bool enable,
1545
struct ieee80211_chanctx_conf *ctx)
1546
{
1547
struct mt76_vif_link *mvif = (struct mt76_vif_link *)vif->drv_priv;
1548
struct cfg80211_chan_def *chandef = ctx ? &ctx->def : &phy->chandef;
1549
enum nl80211_band band = chandef->chan->band;
1550
struct mt76_dev *mdev = phy->dev;
1551
struct {
1552
struct {
1553
u8 bss_idx;
1554
u8 pad[3];
1555
} __packed hdr;
1556
struct mt76_connac_bss_basic_tlv basic;
1557
struct mt76_connac_bss_qos_tlv qos;
1558
} basic_req = {
1559
.hdr = {
1560
.bss_idx = mvif->idx,
1561
},
1562
.basic = {
1563
.tag = cpu_to_le16(UNI_BSS_INFO_BASIC),
1564
.len = cpu_to_le16(sizeof(struct mt76_connac_bss_basic_tlv)),
1565
.bcn_interval = cpu_to_le16(vif->bss_conf.beacon_int),
1566
.dtim_period = vif->bss_conf.dtim_period,
1567
.omac_idx = mvif->omac_idx,
1568
.band_idx = mvif->band_idx,
1569
.wmm_idx = mvif->wmm_idx,
1570
.active = true, /* keep bss deactivated */
1571
.phymode = mt76_connac_get_phy_mode(phy, vif, band, NULL),
1572
},
1573
.qos = {
1574
.tag = cpu_to_le16(UNI_BSS_INFO_QBSS),
1575
.len = cpu_to_le16(sizeof(struct mt76_connac_bss_qos_tlv)),
1576
.qos = vif->bss_conf.qos,
1577
},
1578
};
1579
int err, conn_type;
1580
u8 idx, basic_phy;
1581
1582
idx = mvif->omac_idx > EXT_BSSID_START ? HW_BSSID_0 : mvif->omac_idx;
1583
basic_req.basic.hw_bss_idx = idx;
1584
if (band == NL80211_BAND_6GHZ)
1585
basic_req.basic.phymode_ext = PHY_MODE_AX_6G;
1586
1587
basic_phy = mt76_connac_get_phy_mode_v2(phy, vif, band, NULL);
1588
basic_req.basic.nonht_basic_phy = cpu_to_le16(basic_phy);
1589
1590
switch (vif->type) {
1591
case NL80211_IFTYPE_MESH_POINT:
1592
case NL80211_IFTYPE_AP:
1593
if (vif->p2p)
1594
conn_type = CONNECTION_P2P_GO;
1595
else
1596
conn_type = CONNECTION_INFRA_AP;
1597
basic_req.basic.conn_type = cpu_to_le32(conn_type);
1598
/* Fully active/deactivate BSS network in AP mode only */
1599
basic_req.basic.active = enable;
1600
break;
1601
case NL80211_IFTYPE_STATION:
1602
if (vif->p2p)
1603
conn_type = CONNECTION_P2P_GC;
1604
else
1605
conn_type = CONNECTION_INFRA_STA;
1606
basic_req.basic.conn_type = cpu_to_le32(conn_type);
1607
break;
1608
case NL80211_IFTYPE_ADHOC:
1609
basic_req.basic.conn_type = cpu_to_le32(CONNECTION_IBSS_ADHOC);
1610
break;
1611
default:
1612
WARN_ON(1);
1613
break;
1614
}
1615
1616
memcpy(basic_req.basic.bssid, vif->bss_conf.bssid, ETH_ALEN);
1617
basic_req.basic.bmc_tx_wlan_idx = cpu_to_le16(wcid->idx);
1618
basic_req.basic.sta_idx = cpu_to_le16(wcid->idx);
1619
basic_req.basic.conn_state = !enable;
1620
1621
err = mt76_mcu_send_msg(mdev, MCU_UNI_CMD(BSS_INFO_UPDATE), &basic_req,
1622
sizeof(basic_req), true);
1623
if (err < 0)
1624
return err;
1625
1626
if (vif->bss_conf.he_support) {
1627
struct {
1628
struct {
1629
u8 bss_idx;
1630
u8 pad[3];
1631
} __packed hdr;
1632
struct bss_info_uni_he he;
1633
struct bss_info_uni_bss_color bss_color;
1634
} he_req = {
1635
.hdr = {
1636
.bss_idx = mvif->idx,
1637
},
1638
.he = {
1639
.tag = cpu_to_le16(UNI_BSS_INFO_HE_BASIC),
1640
.len = cpu_to_le16(sizeof(struct bss_info_uni_he)),
1641
},
1642
.bss_color = {
1643
.tag = cpu_to_le16(UNI_BSS_INFO_BSS_COLOR),
1644
.len = cpu_to_le16(sizeof(struct bss_info_uni_bss_color)),
1645
.enable = 0,
1646
.bss_color = 0,
1647
},
1648
};
1649
1650
if (enable) {
1651
he_req.bss_color.enable =
1652
vif->bss_conf.he_bss_color.enabled;
1653
he_req.bss_color.bss_color =
1654
vif->bss_conf.he_bss_color.color;
1655
}
1656
1657
mt76_connac_mcu_uni_bss_he_tlv(phy, vif,
1658
(struct tlv *)&he_req.he);
1659
err = mt76_mcu_send_msg(mdev, MCU_UNI_CMD(BSS_INFO_UPDATE),
1660
&he_req, sizeof(he_req), true);
1661
if (err < 0)
1662
return err;
1663
}
1664
1665
if (enable && vif->bss_conf.bssid_indicator) {
1666
struct {
1667
struct {
1668
u8 bss_idx;
1669
u8 pad[3];
1670
} __packed hdr;
1671
struct bss_info_uni_mbssid mbssid;
1672
} mbssid_req = {
1673
.hdr = {
1674
.bss_idx = mvif->idx,
1675
},
1676
.mbssid = {
1677
.tag = cpu_to_le16(UNI_BSS_INFO_11V_MBSSID),
1678
.len = cpu_to_le16(sizeof(struct bss_info_uni_mbssid)),
1679
.max_indicator = vif->bss_conf.bssid_indicator,
1680
.mbss_idx = vif->bss_conf.bssid_index,
1681
},
1682
};
1683
1684
err = mt76_mcu_send_msg(mdev, MCU_UNI_CMD(BSS_INFO_UPDATE),
1685
&mbssid_req, sizeof(mbssid_req), true);
1686
if (err < 0)
1687
return err;
1688
}
1689
1690
return mt76_connac_mcu_uni_set_chctx(phy, mvif, ctx);
1691
}
1692
EXPORT_SYMBOL_GPL(mt76_connac_mcu_uni_add_bss);
1693
1694
void mt76_connac_mcu_build_rnr_scan_param(struct mt76_dev *mdev,
1695
struct cfg80211_scan_request *sreq)
1696
{
1697
struct ieee80211_channel **scan_list = sreq->channels;
1698
int i, bssid_index = 0;
1699
1700
/* clear 6G active Scan BSSID table */
1701
memset(&mdev->rnr, 0, sizeof(mdev->rnr));
1702
1703
for (i = 0; i < sreq->n_6ghz_params; i++) {
1704
u8 ch_idx = sreq->scan_6ghz_params[i].channel_idx;
1705
int k = 0;
1706
1707
/* Remove the duplicated BSSID */
1708
for (k = 0; k < bssid_index; k++) {
1709
if (!memcmp(&mdev->rnr.bssid[k],
1710
sreq->scan_6ghz_params[i].bssid,
1711
ETH_ALEN))
1712
break;
1713
}
1714
1715
if (k == bssid_index &&
1716
bssid_index < MT76_RNR_SCAN_MAX_BSSIDS) {
1717
memcpy(&mdev->rnr.bssid[bssid_index++],
1718
sreq->scan_6ghz_params[i].bssid, ETH_ALEN);
1719
mdev->rnr.channel[k] = scan_list[ch_idx]->hw_value;
1720
}
1721
}
1722
1723
mdev->rnr.bssid_num = bssid_index;
1724
1725
if (sreq->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
1726
memcpy(mdev->rnr.random_mac, sreq->mac_addr, ETH_ALEN);
1727
mdev->rnr.sreq_flag = sreq->flags;
1728
}
1729
}
1730
EXPORT_SYMBOL_GPL(mt76_connac_mcu_build_rnr_scan_param);
1731
1732
#define MT76_CONNAC_SCAN_CHANNEL_TIME 60
1733
int mt76_connac_mcu_hw_scan(struct mt76_phy *phy, struct ieee80211_vif *vif,
1734
struct ieee80211_scan_request *scan_req)
1735
{
1736
struct mt76_vif_link *mvif = (struct mt76_vif_link *)vif->drv_priv;
1737
struct cfg80211_scan_request *sreq = &scan_req->req;
1738
int n_ssids = 0, err, i, duration;
1739
int ext_channels_num = max_t(int, sreq->n_channels - 32, 0);
1740
struct ieee80211_channel **scan_list = sreq->channels;
1741
struct mt76_dev *mdev = phy->dev;
1742
struct mt76_connac_mcu_scan_channel *chan;
1743
struct mt76_connac_hw_scan_req *req;
1744
struct sk_buff *skb;
1745
1746
if (test_bit(MT76_HW_SCANNING, &phy->state))
1747
return -EBUSY;
1748
1749
skb = mt76_mcu_msg_alloc(mdev, NULL, sizeof(*req));
1750
if (!skb)
1751
return -ENOMEM;
1752
1753
set_bit(MT76_HW_SCANNING, &phy->state);
1754
mvif->scan_seq_num = (mvif->scan_seq_num + 1) & 0x7f;
1755
1756
req = (struct mt76_connac_hw_scan_req *)skb_put_zero(skb, sizeof(*req));
1757
1758
req->seq_num = mvif->scan_seq_num | mvif->band_idx << 7;
1759
req->bss_idx = mvif->idx;
1760
req->scan_type = sreq->n_ssids ? 1 : 0;
1761
req->probe_req_num = sreq->n_ssids ? 2 : 0;
1762
req->version = 1;
1763
1764
for (i = 0; i < sreq->n_ssids; i++) {
1765
if (!sreq->ssids[i].ssid_len)
1766
continue;
1767
1768
req->ssids[n_ssids].ssid_len = cpu_to_le32(sreq->ssids[i].ssid_len);
1769
memcpy(req->ssids[n_ssids].ssid, sreq->ssids[i].ssid,
1770
sreq->ssids[i].ssid_len);
1771
n_ssids++;
1772
}
1773
req->ssid_type = n_ssids ? BIT(2) : BIT(0);
1774
req->ssid_type_ext = n_ssids ? BIT(0) : 0;
1775
req->ssids_num = n_ssids;
1776
1777
duration = is_mt7921(phy->dev) ? 0 : MT76_CONNAC_SCAN_CHANNEL_TIME;
1778
/* increase channel time for passive scan */
1779
if (!sreq->n_ssids)
1780
duration *= 2;
1781
req->timeout_value = cpu_to_le16(sreq->n_channels * duration);
1782
req->channel_min_dwell_time = cpu_to_le16(duration);
1783
req->channel_dwell_time = cpu_to_le16(duration);
1784
1785
if (sreq->n_channels == 0 || sreq->n_channels > 64) {
1786
req->channel_type = 0;
1787
req->channels_num = 0;
1788
req->ext_channels_num = 0;
1789
} else {
1790
req->channel_type = 4;
1791
req->channels_num = min_t(u8, sreq->n_channels, 32);
1792
req->ext_channels_num = min_t(u8, ext_channels_num, 32);
1793
}
1794
1795
for (i = 0; i < req->channels_num + req->ext_channels_num; i++) {
1796
if (i >= 32)
1797
chan = &req->ext_channels[i - 32];
1798
else
1799
chan = &req->channels[i];
1800
1801
switch (scan_list[i]->band) {
1802
case NL80211_BAND_2GHZ:
1803
chan->band = 1;
1804
break;
1805
case NL80211_BAND_6GHZ:
1806
chan->band = 3;
1807
break;
1808
default:
1809
chan->band = 2;
1810
break;
1811
}
1812
chan->channel_num = scan_list[i]->hw_value;
1813
}
1814
1815
if (sreq->ie_len > 0) {
1816
memcpy(req->ies, sreq->ie, sreq->ie_len);
1817
req->ies_len = cpu_to_le16(sreq->ie_len);
1818
}
1819
1820
if (is_mt7921(phy->dev))
1821
req->scan_func |= SCAN_FUNC_SPLIT_SCAN;
1822
1823
memcpy(req->bssid, sreq->bssid, ETH_ALEN);
1824
if (sreq->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
1825
get_random_mask_addr(req->random_mac, sreq->mac_addr,
1826
sreq->mac_addr_mask);
1827
req->scan_func |= SCAN_FUNC_RANDOM_MAC;
1828
}
1829
1830
err = mt76_mcu_skb_send_msg(mdev, skb, MCU_CE_CMD(START_HW_SCAN),
1831
false);
1832
if (err < 0)
1833
clear_bit(MT76_HW_SCANNING, &phy->state);
1834
1835
return err;
1836
}
1837
EXPORT_SYMBOL_GPL(mt76_connac_mcu_hw_scan);
1838
1839
int mt76_connac_mcu_cancel_hw_scan(struct mt76_phy *phy,
1840
struct ieee80211_vif *vif)
1841
{
1842
struct mt76_vif_link *mvif = (struct mt76_vif_link *)vif->drv_priv;
1843
struct {
1844
u8 seq_num;
1845
u8 is_ext_channel;
1846
u8 rsv[2];
1847
} __packed req = {
1848
.seq_num = mvif->scan_seq_num,
1849
};
1850
1851
if (test_and_clear_bit(MT76_HW_SCANNING, &phy->state)) {
1852
struct cfg80211_scan_info info = {
1853
.aborted = true,
1854
};
1855
1856
ieee80211_scan_completed(phy->hw, &info);
1857
}
1858
1859
return mt76_mcu_send_msg(phy->dev, MCU_CE_CMD(CANCEL_HW_SCAN),
1860
&req, sizeof(req), false);
1861
}
1862
EXPORT_SYMBOL_GPL(mt76_connac_mcu_cancel_hw_scan);
1863
1864
int mt76_connac_mcu_sched_scan_req(struct mt76_phy *phy,
1865
struct ieee80211_vif *vif,
1866
struct cfg80211_sched_scan_request *sreq)
1867
{
1868
struct mt76_vif_link *mvif = (struct mt76_vif_link *)vif->drv_priv;
1869
struct ieee80211_channel **scan_list = sreq->channels;
1870
struct mt76_connac_mcu_scan_channel *chan;
1871
struct mt76_connac_sched_scan_req *req;
1872
struct mt76_dev *mdev = phy->dev;
1873
struct cfg80211_match_set *match;
1874
struct cfg80211_ssid *ssid;
1875
struct sk_buff *skb;
1876
int i;
1877
1878
skb = mt76_mcu_msg_alloc(mdev, NULL, sizeof(*req) + sreq->ie_len);
1879
if (!skb)
1880
return -ENOMEM;
1881
1882
mvif->scan_seq_num = (mvif->scan_seq_num + 1) & 0x7f;
1883
1884
req = (struct mt76_connac_sched_scan_req *)skb_put_zero(skb, sizeof(*req));
1885
req->version = 1;
1886
req->seq_num = mvif->scan_seq_num | mvif->band_idx << 7;
1887
1888
if (sreq->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
1889
u8 *addr = is_mt7663(phy->dev) ? req->mt7663.random_mac
1890
: req->mt7921.random_mac;
1891
1892
req->scan_func = 1;
1893
get_random_mask_addr(addr, sreq->mac_addr,
1894
sreq->mac_addr_mask);
1895
}
1896
if (is_mt7921(phy->dev)) {
1897
req->mt7921.bss_idx = mvif->idx;
1898
req->mt7921.delay = cpu_to_le32(sreq->delay);
1899
}
1900
1901
req->ssids_num = sreq->n_ssids;
1902
for (i = 0; i < req->ssids_num; i++) {
1903
ssid = &sreq->ssids[i];
1904
memcpy(req->ssids[i].ssid, ssid->ssid, ssid->ssid_len);
1905
req->ssids[i].ssid_len = cpu_to_le32(ssid->ssid_len);
1906
}
1907
1908
req->match_num = sreq->n_match_sets;
1909
for (i = 0; i < req->match_num; i++) {
1910
match = &sreq->match_sets[i];
1911
memcpy(req->match[i].ssid, match->ssid.ssid,
1912
match->ssid.ssid_len);
1913
req->match[i].rssi_th = cpu_to_le32(match->rssi_thold);
1914
req->match[i].ssid_len = match->ssid.ssid_len;
1915
}
1916
1917
req->channel_type = sreq->n_channels ? 4 : 0;
1918
req->channels_num = min_t(u8, sreq->n_channels, 64);
1919
for (i = 0; i < req->channels_num; i++) {
1920
chan = &req->channels[i];
1921
1922
switch (scan_list[i]->band) {
1923
case NL80211_BAND_2GHZ:
1924
chan->band = 1;
1925
break;
1926
case NL80211_BAND_6GHZ:
1927
chan->band = 3;
1928
break;
1929
default:
1930
chan->band = 2;
1931
break;
1932
}
1933
chan->channel_num = scan_list[i]->hw_value;
1934
}
1935
1936
req->intervals_num = sreq->n_scan_plans;
1937
for (i = 0; i < req->intervals_num; i++)
1938
req->intervals[i] = cpu_to_le16(sreq->scan_plans[i].interval);
1939
1940
if (sreq->ie_len > 0) {
1941
req->ie_len = cpu_to_le16(sreq->ie_len);
1942
memcpy(skb_put(skb, sreq->ie_len), sreq->ie, sreq->ie_len);
1943
}
1944
1945
return mt76_mcu_skb_send_msg(mdev, skb, MCU_CE_CMD(SCHED_SCAN_REQ),
1946
false);
1947
}
1948
EXPORT_SYMBOL_GPL(mt76_connac_mcu_sched_scan_req);
1949
1950
int mt76_connac_mcu_sched_scan_enable(struct mt76_phy *phy,
1951
struct ieee80211_vif *vif,
1952
bool enable)
1953
{
1954
struct {
1955
u8 active; /* 0: enabled 1: disabled */
1956
u8 rsv[3];
1957
} __packed req = {
1958
.active = !enable,
1959
};
1960
1961
if (enable)
1962
set_bit(MT76_HW_SCHED_SCANNING, &phy->state);
1963
else
1964
clear_bit(MT76_HW_SCHED_SCANNING, &phy->state);
1965
1966
return mt76_mcu_send_msg(phy->dev, MCU_CE_CMD(SCHED_SCAN_ENABLE),
1967
&req, sizeof(req), false);
1968
}
1969
EXPORT_SYMBOL_GPL(mt76_connac_mcu_sched_scan_enable);
1970
1971
int mt76_connac_mcu_chip_config(struct mt76_dev *dev)
1972
{
1973
struct mt76_connac_config req = {
1974
.resp_type = 0,
1975
};
1976
1977
#if defined(__linux__)
1978
strscpy(req.data, "assert");
1979
#elif defined(__FreeBSD__)
1980
strscpy(req.data, "assert", sizeof(req.data));
1981
#endif
1982
1983
return mt76_mcu_send_msg(dev, MCU_CE_CMD(CHIP_CONFIG),
1984
&req, sizeof(req), false);
1985
}
1986
EXPORT_SYMBOL_GPL(mt76_connac_mcu_chip_config);
1987
1988
int mt76_connac_mcu_set_deep_sleep(struct mt76_dev *dev, bool enable)
1989
{
1990
struct mt76_connac_config req = {
1991
.resp_type = 0,
1992
};
1993
1994
snprintf(req.data, sizeof(req.data), "KeepFullPwr %d", !enable);
1995
1996
return mt76_mcu_send_msg(dev, MCU_CE_CMD(CHIP_CONFIG),
1997
&req, sizeof(req), false);
1998
}
1999
EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_deep_sleep);
2000
2001
int mt76_connac_sta_state_dp(struct mt76_dev *dev,
2002
enum ieee80211_sta_state old_state,
2003
enum ieee80211_sta_state new_state)
2004
{
2005
if ((old_state == IEEE80211_STA_ASSOC &&
2006
new_state == IEEE80211_STA_AUTHORIZED) ||
2007
(old_state == IEEE80211_STA_NONE &&
2008
new_state == IEEE80211_STA_NOTEXIST))
2009
mt76_connac_mcu_set_deep_sleep(dev, true);
2010
2011
if ((old_state == IEEE80211_STA_NOTEXIST &&
2012
new_state == IEEE80211_STA_NONE) ||
2013
(old_state == IEEE80211_STA_AUTHORIZED &&
2014
new_state == IEEE80211_STA_ASSOC))
2015
mt76_connac_mcu_set_deep_sleep(dev, false);
2016
2017
return 0;
2018
}
2019
EXPORT_SYMBOL_GPL(mt76_connac_sta_state_dp);
2020
2021
void mt76_connac_mcu_coredump_event(struct mt76_dev *dev, struct sk_buff *skb,
2022
struct mt76_connac_coredump *coredump)
2023
{
2024
spin_lock_bh(&dev->lock);
2025
__skb_queue_tail(&coredump->msg_list, skb);
2026
spin_unlock_bh(&dev->lock);
2027
2028
coredump->last_activity = jiffies;
2029
2030
queue_delayed_work(dev->wq, &coredump->work,
2031
MT76_CONNAC_COREDUMP_TIMEOUT);
2032
}
2033
EXPORT_SYMBOL_GPL(mt76_connac_mcu_coredump_event);
2034
2035
static void
2036
mt76_connac_mcu_build_sku(struct mt76_dev *dev, s8 *sku,
2037
struct mt76_power_limits *limits,
2038
enum nl80211_band band)
2039
{
2040
int max_power = is_mt7921(dev) ? 127 : 63;
2041
int i, offset = sizeof(limits->cck);
2042
2043
memset(sku, max_power, MT_SKU_POWER_LIMIT);
2044
2045
if (band == NL80211_BAND_2GHZ) {
2046
/* cck */
2047
memcpy(sku, limits->cck, sizeof(limits->cck));
2048
}
2049
2050
/* ofdm */
2051
memcpy(&sku[offset], limits->ofdm, sizeof(limits->ofdm));
2052
offset += sizeof(limits->ofdm);
2053
2054
/* ht */
2055
for (i = 0; i < 2; i++) {
2056
memcpy(&sku[offset], limits->mcs[i], 8);
2057
offset += 8;
2058
}
2059
sku[offset++] = limits->mcs[0][0];
2060
2061
/* vht */
2062
for (i = 0; i < ARRAY_SIZE(limits->mcs); i++) {
2063
memcpy(&sku[offset], limits->mcs[i],
2064
ARRAY_SIZE(limits->mcs[i]));
2065
offset += 12;
2066
}
2067
2068
if (!is_mt7921(dev))
2069
return;
2070
2071
/* he */
2072
for (i = 0; i < ARRAY_SIZE(limits->ru); i++) {
2073
memcpy(&sku[offset], limits->ru[i], ARRAY_SIZE(limits->ru[i]));
2074
offset += ARRAY_SIZE(limits->ru[i]);
2075
}
2076
}
2077
2078
s8 mt76_connac_get_ch_power(struct mt76_phy *phy,
2079
struct ieee80211_channel *chan,
2080
s8 target_power)
2081
{
2082
struct mt76_dev *dev = phy->dev;
2083
struct ieee80211_supported_band *sband;
2084
int i;
2085
2086
switch (chan->band) {
2087
case NL80211_BAND_2GHZ:
2088
sband = &phy->sband_2g.sband;
2089
break;
2090
case NL80211_BAND_5GHZ:
2091
sband = &phy->sband_5g.sband;
2092
break;
2093
case NL80211_BAND_6GHZ:
2094
sband = &phy->sband_6g.sband;
2095
break;
2096
default:
2097
return target_power;
2098
}
2099
2100
for (i = 0; i < sband->n_channels; i++) {
2101
struct ieee80211_channel *ch = &sband->channels[i];
2102
2103
if (ch->hw_value == chan->hw_value) {
2104
if (!(ch->flags & IEEE80211_CHAN_DISABLED)) {
2105
int power = 2 * ch->max_reg_power;
2106
2107
if (is_mt7663(dev) && (power > 63 || power < -64))
2108
power = 63;
2109
target_power = min_t(s8, power, target_power);
2110
}
2111
break;
2112
}
2113
}
2114
2115
return target_power;
2116
}
2117
EXPORT_SYMBOL_GPL(mt76_connac_get_ch_power);
2118
2119
static int
2120
mt76_connac_mcu_rate_txpower_band(struct mt76_phy *phy,
2121
enum nl80211_band band)
2122
{
2123
struct mt76_dev *dev = phy->dev;
2124
int sku_len, batch_len = is_mt7921(dev) ? 8 : 16;
2125
static const u8 chan_list_2ghz[] = {
2126
1, 2, 3, 4, 5, 6, 7,
2127
8, 9, 10, 11, 12, 13, 14
2128
};
2129
static const u8 chan_list_5ghz[] = {
2130
36, 38, 40, 42, 44, 46, 48,
2131
50, 52, 54, 56, 58, 60, 62,
2132
64, 100, 102, 104, 106, 108, 110,
2133
112, 114, 116, 118, 120, 122, 124,
2134
126, 128, 132, 134, 136, 138, 140,
2135
142, 144, 149, 151, 153, 155, 157,
2136
159, 161, 165, 169, 173, 177
2137
};
2138
static const u8 chan_list_6ghz[] = {
2139
1, 3, 5, 7, 9, 11, 13,
2140
15, 17, 19, 21, 23, 25, 27,
2141
29, 33, 35, 37, 39, 41, 43,
2142
45, 47, 49, 51, 53, 55, 57,
2143
59, 61, 65, 67, 69, 71, 73,
2144
75, 77, 79, 81, 83, 85, 87,
2145
89, 91, 93, 97, 99, 101, 103,
2146
105, 107, 109, 111, 113, 115, 117,
2147
119, 121, 123, 125, 129, 131, 133,
2148
135, 137, 139, 141, 143, 145, 147,
2149
149, 151, 153, 155, 157, 161, 163,
2150
165, 167, 169, 171, 173, 175, 177,
2151
179, 181, 183, 185, 187, 189, 193,
2152
195, 197, 199, 201, 203, 205, 207,
2153
209, 211, 213, 215, 217, 219, 221,
2154
225, 227, 229, 233
2155
};
2156
int i, n_chan, batch_size, idx = 0, tx_power, last_ch, err = 0;
2157
struct mt76_connac_sku_tlv sku_tlbv;
2158
struct mt76_power_limits *limits;
2159
const u8 *ch_list;
2160
2161
limits = devm_kmalloc(dev->dev, sizeof(*limits), GFP_KERNEL);
2162
if (!limits)
2163
return -ENOMEM;
2164
2165
sku_len = is_mt7921(dev) ? sizeof(sku_tlbv) : sizeof(sku_tlbv) - 92;
2166
tx_power = 2 * phy->hw->conf.power_level;
2167
if (!tx_power)
2168
tx_power = 127;
2169
2170
if (band == NL80211_BAND_2GHZ) {
2171
n_chan = ARRAY_SIZE(chan_list_2ghz);
2172
ch_list = chan_list_2ghz;
2173
} else if (band == NL80211_BAND_6GHZ) {
2174
n_chan = ARRAY_SIZE(chan_list_6ghz);
2175
ch_list = chan_list_6ghz;
2176
} else {
2177
n_chan = ARRAY_SIZE(chan_list_5ghz);
2178
ch_list = chan_list_5ghz;
2179
}
2180
batch_size = DIV_ROUND_UP(n_chan, batch_len);
2181
2182
if (phy->cap.has_6ghz)
2183
last_ch = chan_list_6ghz[ARRAY_SIZE(chan_list_6ghz) - 1];
2184
else if (phy->cap.has_5ghz)
2185
last_ch = chan_list_5ghz[ARRAY_SIZE(chan_list_5ghz) - 1];
2186
else
2187
last_ch = chan_list_2ghz[ARRAY_SIZE(chan_list_2ghz) - 1];
2188
2189
for (i = 0; i < batch_size; i++) {
2190
struct mt76_connac_tx_power_limit_tlv tx_power_tlv = {};
2191
int j, msg_len, num_ch;
2192
struct sk_buff *skb;
2193
2194
num_ch = i == batch_size - 1 ? n_chan - i * batch_len : batch_len;
2195
msg_len = sizeof(tx_power_tlv) + num_ch * sizeof(sku_tlbv);
2196
skb = mt76_mcu_msg_alloc(dev, NULL, msg_len);
2197
if (!skb) {
2198
err = -ENOMEM;
2199
goto out;
2200
}
2201
2202
skb_reserve(skb, sizeof(tx_power_tlv));
2203
2204
BUILD_BUG_ON(sizeof(dev->alpha2) > sizeof(tx_power_tlv.alpha2));
2205
memcpy(tx_power_tlv.alpha2, dev->alpha2, sizeof(dev->alpha2));
2206
tx_power_tlv.n_chan = num_ch;
2207
2208
switch (band) {
2209
case NL80211_BAND_2GHZ:
2210
tx_power_tlv.band = 1;
2211
break;
2212
case NL80211_BAND_6GHZ:
2213
tx_power_tlv.band = 3;
2214
break;
2215
default:
2216
tx_power_tlv.band = 2;
2217
break;
2218
}
2219
2220
for (j = 0; j < num_ch; j++, idx++) {
2221
struct ieee80211_channel chan = {
2222
.hw_value = ch_list[idx],
2223
.band = band,
2224
};
2225
s8 reg_power, sar_power;
2226
2227
reg_power = mt76_connac_get_ch_power(phy, &chan,
2228
tx_power);
2229
sar_power = mt76_get_sar_power(phy, &chan, reg_power);
2230
2231
mt76_get_rate_power_limits(phy, &chan, limits,
2232
sar_power);
2233
2234
tx_power_tlv.last_msg = ch_list[idx] == last_ch;
2235
sku_tlbv.channel = ch_list[idx];
2236
2237
mt76_connac_mcu_build_sku(dev, sku_tlbv.pwr_limit,
2238
limits, band);
2239
skb_put_data(skb, &sku_tlbv, sku_len);
2240
}
2241
__skb_push(skb, sizeof(tx_power_tlv));
2242
memcpy(skb->data, &tx_power_tlv, sizeof(tx_power_tlv));
2243
2244
err = mt76_mcu_skb_send_msg(dev, skb,
2245
MCU_CE_CMD(SET_RATE_TX_POWER),
2246
false);
2247
if (err < 0)
2248
goto out;
2249
}
2250
2251
out:
2252
devm_kfree(dev->dev, limits);
2253
return err;
2254
}
2255
2256
int mt76_connac_mcu_set_rate_txpower(struct mt76_phy *phy)
2257
{
2258
int err;
2259
2260
if (phy->cap.has_2ghz) {
2261
err = mt76_connac_mcu_rate_txpower_band(phy,
2262
NL80211_BAND_2GHZ);
2263
if (err < 0)
2264
return err;
2265
}
2266
if (phy->cap.has_5ghz) {
2267
err = mt76_connac_mcu_rate_txpower_band(phy,
2268
NL80211_BAND_5GHZ);
2269
if (err < 0)
2270
return err;
2271
}
2272
if (phy->cap.has_6ghz) {
2273
err = mt76_connac_mcu_rate_txpower_band(phy,
2274
NL80211_BAND_6GHZ);
2275
if (err < 0)
2276
return err;
2277
}
2278
2279
return 0;
2280
}
2281
EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_rate_txpower);
2282
2283
int mt76_connac_mcu_update_arp_filter(struct mt76_dev *dev,
2284
struct mt76_vif_link *vif,
2285
struct ieee80211_bss_conf *info)
2286
{
2287
struct ieee80211_vif *mvif = container_of(info, struct ieee80211_vif,
2288
bss_conf);
2289
struct sk_buff *skb;
2290
int i, len = min_t(int, mvif->cfg.arp_addr_cnt,
2291
IEEE80211_BSS_ARP_ADDR_LIST_LEN);
2292
struct {
2293
struct {
2294
u8 bss_idx;
2295
u8 pad[3];
2296
} __packed hdr;
2297
struct mt76_connac_arpns_tlv arp;
2298
} req_hdr = {
2299
.hdr = {
2300
.bss_idx = vif->idx,
2301
},
2302
.arp = {
2303
.tag = cpu_to_le16(UNI_OFFLOAD_OFFLOAD_ARP),
2304
.len = cpu_to_le16(sizeof(struct mt76_connac_arpns_tlv)),
2305
.ips_num = len,
2306
.mode = 2, /* update */
2307
.option = 1,
2308
},
2309
};
2310
2311
skb = mt76_mcu_msg_alloc(dev, NULL,
2312
sizeof(req_hdr) + len * sizeof(__be32));
2313
if (!skb)
2314
return -ENOMEM;
2315
2316
skb_put_data(skb, &req_hdr, sizeof(req_hdr));
2317
for (i = 0; i < len; i++)
2318
skb_put_data(skb, &mvif->cfg.arp_addr_list[i], sizeof(__be32));
2319
2320
return mt76_mcu_skb_send_msg(dev, skb, MCU_UNI_CMD(OFFLOAD), true);
2321
}
2322
EXPORT_SYMBOL_GPL(mt76_connac_mcu_update_arp_filter);
2323
2324
int mt76_connac_mcu_set_p2p_oppps(struct ieee80211_hw *hw,
2325
struct ieee80211_vif *vif)
2326
{
2327
struct mt76_vif_link *mvif = (struct mt76_vif_link *)vif->drv_priv;
2328
int ct_window = vif->bss_conf.p2p_noa_attr.oppps_ctwindow;
2329
struct mt76_phy *phy = hw->priv;
2330
struct {
2331
__le32 ct_win;
2332
u8 bss_idx;
2333
u8 rsv[3];
2334
} __packed req = {
2335
.ct_win = cpu_to_le32(ct_window),
2336
.bss_idx = mvif->idx,
2337
};
2338
2339
return mt76_mcu_send_msg(phy->dev, MCU_CE_CMD(SET_P2P_OPPPS),
2340
&req, sizeof(req), false);
2341
}
2342
EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_p2p_oppps);
2343
2344
#ifdef CONFIG_PM
2345
2346
const struct wiphy_wowlan_support mt76_connac_wowlan_support = {
2347
.flags = WIPHY_WOWLAN_MAGIC_PKT | WIPHY_WOWLAN_DISCONNECT |
2348
WIPHY_WOWLAN_SUPPORTS_GTK_REKEY | WIPHY_WOWLAN_NET_DETECT,
2349
.n_patterns = 1,
2350
.pattern_min_len = 1,
2351
.pattern_max_len = MT76_CONNAC_WOW_PATTEN_MAX_LEN,
2352
.max_nd_match_sets = 10,
2353
};
2354
EXPORT_SYMBOL_GPL(mt76_connac_wowlan_support);
2355
2356
static void
2357
mt76_connac_mcu_key_iter(struct ieee80211_hw *hw,
2358
struct ieee80211_vif *vif,
2359
struct ieee80211_sta *sta,
2360
struct ieee80211_key_conf *key,
2361
void *data)
2362
{
2363
struct mt76_connac_gtk_rekey_tlv *gtk_tlv = data;
2364
u32 cipher;
2365
2366
if (key->cipher != WLAN_CIPHER_SUITE_AES_CMAC &&
2367
key->cipher != WLAN_CIPHER_SUITE_CCMP &&
2368
key->cipher != WLAN_CIPHER_SUITE_TKIP)
2369
return;
2370
2371
if (key->cipher == WLAN_CIPHER_SUITE_TKIP)
2372
cipher = BIT(3);
2373
else
2374
cipher = BIT(4);
2375
2376
/* we are assuming here to have a single pairwise key */
2377
if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) {
2378
if (key->cipher == WLAN_CIPHER_SUITE_TKIP)
2379
gtk_tlv->proto = cpu_to_le32(NL80211_WPA_VERSION_1);
2380
else
2381
gtk_tlv->proto = cpu_to_le32(NL80211_WPA_VERSION_2);
2382
2383
gtk_tlv->pairwise_cipher = cpu_to_le32(cipher);
2384
gtk_tlv->keyid = key->keyidx;
2385
} else {
2386
gtk_tlv->group_cipher = cpu_to_le32(cipher);
2387
}
2388
}
2389
2390
int mt76_connac_mcu_update_gtk_rekey(struct ieee80211_hw *hw,
2391
struct ieee80211_vif *vif,
2392
struct cfg80211_gtk_rekey_data *key)
2393
{
2394
struct mt76_vif_link *mvif = (struct mt76_vif_link *)vif->drv_priv;
2395
struct mt76_connac_gtk_rekey_tlv *gtk_tlv;
2396
struct mt76_phy *phy = hw->priv;
2397
struct sk_buff *skb;
2398
struct {
2399
u8 bss_idx;
2400
u8 pad[3];
2401
} __packed hdr = {
2402
.bss_idx = mvif->idx,
2403
};
2404
2405
skb = mt76_mcu_msg_alloc(phy->dev, NULL,
2406
sizeof(hdr) + sizeof(*gtk_tlv));
2407
if (!skb)
2408
return -ENOMEM;
2409
2410
skb_put_data(skb, &hdr, sizeof(hdr));
2411
gtk_tlv = (struct mt76_connac_gtk_rekey_tlv *)skb_put_zero(skb,
2412
sizeof(*gtk_tlv));
2413
gtk_tlv->tag = cpu_to_le16(UNI_OFFLOAD_OFFLOAD_GTK_REKEY);
2414
gtk_tlv->len = cpu_to_le16(sizeof(*gtk_tlv));
2415
gtk_tlv->rekey_mode = 2;
2416
gtk_tlv->option = 1;
2417
2418
rcu_read_lock();
2419
ieee80211_iter_keys_rcu(hw, vif, mt76_connac_mcu_key_iter, gtk_tlv);
2420
rcu_read_unlock();
2421
2422
memcpy(gtk_tlv->kek, key->kek, NL80211_KEK_LEN);
2423
memcpy(gtk_tlv->kck, key->kck, NL80211_KCK_LEN);
2424
memcpy(gtk_tlv->replay_ctr, key->replay_ctr, NL80211_REPLAY_CTR_LEN);
2425
2426
return mt76_mcu_skb_send_msg(phy->dev, skb,
2427
MCU_UNI_CMD(OFFLOAD), true);
2428
}
2429
EXPORT_SYMBOL_GPL(mt76_connac_mcu_update_gtk_rekey);
2430
2431
static int
2432
mt76_connac_mcu_set_arp_filter(struct mt76_dev *dev, struct ieee80211_vif *vif,
2433
bool suspend)
2434
{
2435
struct mt76_vif_link *mvif = (struct mt76_vif_link *)vif->drv_priv;
2436
struct {
2437
struct {
2438
u8 bss_idx;
2439
u8 pad[3];
2440
} __packed hdr;
2441
struct mt76_connac_arpns_tlv arpns;
2442
} req = {
2443
.hdr = {
2444
.bss_idx = mvif->idx,
2445
},
2446
.arpns = {
2447
.tag = cpu_to_le16(UNI_OFFLOAD_OFFLOAD_ARP),
2448
.len = cpu_to_le16(sizeof(struct mt76_connac_arpns_tlv)),
2449
.mode = suspend,
2450
},
2451
};
2452
2453
return mt76_mcu_send_msg(dev, MCU_UNI_CMD(OFFLOAD), &req,
2454
sizeof(req), true);
2455
}
2456
2457
int
2458
mt76_connac_mcu_set_gtk_rekey(struct mt76_dev *dev, struct ieee80211_vif *vif,
2459
bool suspend)
2460
{
2461
struct mt76_vif_link *mvif = (struct mt76_vif_link *)vif->drv_priv;
2462
struct {
2463
struct {
2464
u8 bss_idx;
2465
u8 pad[3];
2466
} __packed hdr;
2467
struct mt76_connac_gtk_rekey_tlv gtk_tlv;
2468
} __packed req = {
2469
.hdr = {
2470
.bss_idx = mvif->idx,
2471
},
2472
.gtk_tlv = {
2473
.tag = cpu_to_le16(UNI_OFFLOAD_OFFLOAD_GTK_REKEY),
2474
.len = cpu_to_le16(sizeof(struct mt76_connac_gtk_rekey_tlv)),
2475
.rekey_mode = !suspend,
2476
},
2477
};
2478
2479
return mt76_mcu_send_msg(dev, MCU_UNI_CMD(OFFLOAD), &req,
2480
sizeof(req), true);
2481
}
2482
EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_gtk_rekey);
2483
2484
int
2485
mt76_connac_mcu_set_suspend_mode(struct mt76_dev *dev,
2486
struct ieee80211_vif *vif,
2487
bool enable, u8 mdtim,
2488
bool wow_suspend)
2489
{
2490
struct mt76_vif_link *mvif = (struct mt76_vif_link *)vif->drv_priv;
2491
struct {
2492
struct {
2493
u8 bss_idx;
2494
u8 pad[3];
2495
} __packed hdr;
2496
struct mt76_connac_suspend_tlv suspend_tlv;
2497
} req = {
2498
.hdr = {
2499
.bss_idx = mvif->idx,
2500
},
2501
.suspend_tlv = {
2502
.tag = cpu_to_le16(UNI_SUSPEND_MODE_SETTING),
2503
.len = cpu_to_le16(sizeof(struct mt76_connac_suspend_tlv)),
2504
.enable = enable,
2505
.mdtim = mdtim,
2506
.wow_suspend = wow_suspend,
2507
},
2508
};
2509
2510
return mt76_mcu_send_msg(dev, MCU_UNI_CMD(SUSPEND), &req,
2511
sizeof(req), true);
2512
}
2513
EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_suspend_mode);
2514
2515
static int
2516
mt76_connac_mcu_set_wow_pattern(struct mt76_dev *dev,
2517
struct ieee80211_vif *vif,
2518
u8 index, bool enable,
2519
struct cfg80211_pkt_pattern *pattern)
2520
{
2521
struct mt76_vif_link *mvif = (struct mt76_vif_link *)vif->drv_priv;
2522
struct mt76_connac_wow_pattern_tlv *ptlv;
2523
struct sk_buff *skb;
2524
struct req_hdr {
2525
u8 bss_idx;
2526
u8 pad[3];
2527
} __packed hdr = {
2528
.bss_idx = mvif->idx,
2529
};
2530
2531
skb = mt76_mcu_msg_alloc(dev, NULL, sizeof(hdr) + sizeof(*ptlv));
2532
if (!skb)
2533
return -ENOMEM;
2534
2535
skb_put_data(skb, &hdr, sizeof(hdr));
2536
ptlv = (struct mt76_connac_wow_pattern_tlv *)skb_put_zero(skb, sizeof(*ptlv));
2537
ptlv->tag = cpu_to_le16(UNI_SUSPEND_WOW_PATTERN);
2538
ptlv->len = cpu_to_le16(sizeof(*ptlv));
2539
ptlv->data_len = pattern->pattern_len;
2540
ptlv->enable = enable;
2541
ptlv->index = index;
2542
2543
memcpy(ptlv->pattern, pattern->pattern, pattern->pattern_len);
2544
memcpy(ptlv->mask, pattern->mask, DIV_ROUND_UP(pattern->pattern_len, 8));
2545
2546
return mt76_mcu_skb_send_msg(dev, skb, MCU_UNI_CMD(SUSPEND), true);
2547
}
2548
2549
int
2550
mt76_connac_mcu_set_wow_ctrl(struct mt76_phy *phy, struct ieee80211_vif *vif,
2551
bool suspend, struct cfg80211_wowlan *wowlan)
2552
{
2553
struct mt76_vif_link *mvif = (struct mt76_vif_link *)vif->drv_priv;
2554
struct mt76_dev *dev = phy->dev;
2555
struct {
2556
struct {
2557
u8 bss_idx;
2558
u8 pad[3];
2559
} __packed hdr;
2560
struct mt76_connac_wow_ctrl_tlv wow_ctrl_tlv;
2561
struct mt76_connac_wow_gpio_param_tlv gpio_tlv;
2562
} req = {
2563
.hdr = {
2564
.bss_idx = mvif->idx,
2565
},
2566
.wow_ctrl_tlv = {
2567
.tag = cpu_to_le16(UNI_SUSPEND_WOW_CTRL),
2568
.len = cpu_to_le16(sizeof(struct mt76_connac_wow_ctrl_tlv)),
2569
.cmd = suspend ? 1 : 2,
2570
},
2571
.gpio_tlv = {
2572
.tag = cpu_to_le16(UNI_SUSPEND_WOW_GPIO_PARAM),
2573
.len = cpu_to_le16(sizeof(struct mt76_connac_wow_gpio_param_tlv)),
2574
.gpio_pin = 0xff, /* follow fw about GPIO pin */
2575
},
2576
};
2577
2578
if (wowlan->magic_pkt)
2579
req.wow_ctrl_tlv.trigger |= UNI_WOW_DETECT_TYPE_MAGIC;
2580
if (wowlan->disconnect)
2581
req.wow_ctrl_tlv.trigger |= (UNI_WOW_DETECT_TYPE_DISCONNECT |
2582
UNI_WOW_DETECT_TYPE_BCN_LOST);
2583
if (wowlan->nd_config) {
2584
mt76_connac_mcu_sched_scan_req(phy, vif, wowlan->nd_config);
2585
req.wow_ctrl_tlv.trigger |= UNI_WOW_DETECT_TYPE_SCH_SCAN_HIT;
2586
mt76_connac_mcu_sched_scan_enable(phy, vif, suspend);
2587
}
2588
if (wowlan->n_patterns)
2589
req.wow_ctrl_tlv.trigger |= UNI_WOW_DETECT_TYPE_BITMAP;
2590
2591
if (mt76_is_mmio(dev))
2592
req.wow_ctrl_tlv.wakeup_hif = WOW_PCIE;
2593
else if (mt76_is_usb(dev))
2594
req.wow_ctrl_tlv.wakeup_hif = WOW_USB;
2595
else if (mt76_is_sdio(dev))
2596
req.wow_ctrl_tlv.wakeup_hif = WOW_GPIO;
2597
2598
return mt76_mcu_send_msg(dev, MCU_UNI_CMD(SUSPEND), &req,
2599
sizeof(req), true);
2600
}
2601
EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_wow_ctrl);
2602
2603
int mt76_connac_mcu_set_hif_suspend(struct mt76_dev *dev, bool suspend, bool wait_resp)
2604
{
2605
struct {
2606
struct {
2607
u8 hif_type; /* 0x0: HIF_SDIO
2608
* 0x1: HIF_USB
2609
* 0x2: HIF_PCIE
2610
*/
2611
u8 pad[3];
2612
} __packed hdr;
2613
struct hif_suspend_tlv {
2614
__le16 tag;
2615
__le16 len;
2616
u8 suspend;
2617
u8 pad[7];
2618
} __packed hif_suspend;
2619
} req = {
2620
.hif_suspend = {
2621
.tag = cpu_to_le16(0), /* 0: UNI_HIF_CTRL_BASIC */
2622
.len = cpu_to_le16(sizeof(struct hif_suspend_tlv)),
2623
.suspend = suspend,
2624
},
2625
};
2626
2627
if (mt76_is_mmio(dev))
2628
req.hdr.hif_type = 2;
2629
else if (mt76_is_usb(dev))
2630
req.hdr.hif_type = 1;
2631
else if (mt76_is_sdio(dev))
2632
req.hdr.hif_type = 0;
2633
2634
return mt76_mcu_send_msg(dev, MCU_UNI_CMD(HIF_CTRL), &req,
2635
sizeof(req), wait_resp);
2636
}
2637
EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_hif_suspend);
2638
2639
void mt76_connac_mcu_set_suspend_iter(void *priv, u8 *mac,
2640
struct ieee80211_vif *vif)
2641
{
2642
struct mt76_phy *phy = priv;
2643
bool suspend = !test_bit(MT76_STATE_RUNNING, &phy->state);
2644
struct ieee80211_hw *hw = phy->hw;
2645
struct cfg80211_wowlan *wowlan = hw->wiphy->wowlan_config;
2646
int i;
2647
2648
mt76_connac_mcu_set_gtk_rekey(phy->dev, vif, suspend);
2649
mt76_connac_mcu_set_arp_filter(phy->dev, vif, suspend);
2650
2651
mt76_connac_mcu_set_suspend_mode(phy->dev, vif, suspend, 1, true);
2652
2653
for (i = 0; i < wowlan->n_patterns; i++)
2654
mt76_connac_mcu_set_wow_pattern(phy->dev, vif, i, suspend,
2655
&wowlan->patterns[i]);
2656
mt76_connac_mcu_set_wow_ctrl(phy, vif, suspend, wowlan);
2657
}
2658
EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_suspend_iter);
2659
#endif /* CONFIG_PM */
2660
2661
u32 mt76_connac_mcu_reg_rr(struct mt76_dev *dev, u32 offset)
2662
{
2663
struct {
2664
__le32 addr;
2665
__le32 val;
2666
} __packed req = {
2667
.addr = cpu_to_le32(offset),
2668
};
2669
2670
return mt76_mcu_send_msg(dev, MCU_CE_QUERY(REG_READ), &req,
2671
sizeof(req), true);
2672
}
2673
EXPORT_SYMBOL_GPL(mt76_connac_mcu_reg_rr);
2674
2675
void mt76_connac_mcu_reg_wr(struct mt76_dev *dev, u32 offset, u32 val)
2676
{
2677
struct {
2678
__le32 addr;
2679
__le32 val;
2680
} __packed req = {
2681
.addr = cpu_to_le32(offset),
2682
.val = cpu_to_le32(val),
2683
};
2684
2685
mt76_mcu_send_msg(dev, MCU_CE_CMD(REG_WRITE), &req,
2686
sizeof(req), false);
2687
}
2688
EXPORT_SYMBOL_GPL(mt76_connac_mcu_reg_wr);
2689
2690
static int
2691
mt76_connac_mcu_sta_key_tlv(struct mt76_connac_sta_key_conf *sta_key_conf,
2692
struct sk_buff *skb,
2693
struct ieee80211_key_conf *key,
2694
enum set_key_cmd cmd)
2695
{
2696
struct sta_rec_sec *sec;
2697
u32 len = sizeof(*sec);
2698
struct tlv *tlv;
2699
2700
tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_KEY_V2, sizeof(*sec));
2701
sec = (struct sta_rec_sec *)tlv;
2702
sec->add = cmd;
2703
2704
if (cmd == SET_KEY) {
2705
struct sec_key *sec_key;
2706
u8 cipher;
2707
2708
cipher = mt76_connac_mcu_get_cipher(key->cipher);
2709
if (cipher == MCU_CIPHER_NONE)
2710
return -EOPNOTSUPP;
2711
2712
sec_key = &sec->key[0];
2713
sec_key->cipher_len = sizeof(*sec_key);
2714
2715
if (cipher == MCU_CIPHER_BIP_CMAC_128) {
2716
sec_key->cipher_id = MCU_CIPHER_AES_CCMP;
2717
sec_key->key_id = sta_key_conf->keyidx;
2718
sec_key->key_len = 16;
2719
memcpy(sec_key->key, sta_key_conf->key, 16);
2720
2721
sec_key = &sec->key[1];
2722
sec_key->cipher_id = MCU_CIPHER_BIP_CMAC_128;
2723
sec_key->cipher_len = sizeof(*sec_key);
2724
sec_key->key_len = 16;
2725
memcpy(sec_key->key, key->key, 16);
2726
sec->n_cipher = 2;
2727
} else {
2728
sec_key->cipher_id = cipher;
2729
sec_key->key_id = key->keyidx;
2730
sec_key->key_len = key->keylen;
2731
memcpy(sec_key->key, key->key, key->keylen);
2732
2733
if (cipher == MCU_CIPHER_TKIP) {
2734
/* Rx/Tx MIC keys are swapped */
2735
memcpy(sec_key->key + 16, key->key + 24, 8);
2736
memcpy(sec_key->key + 24, key->key + 16, 8);
2737
}
2738
2739
/* store key_conf for BIP batch update */
2740
if (cipher == MCU_CIPHER_AES_CCMP) {
2741
memcpy(sta_key_conf->key, key->key, key->keylen);
2742
sta_key_conf->keyidx = key->keyidx;
2743
}
2744
2745
len -= sizeof(*sec_key);
2746
sec->n_cipher = 1;
2747
}
2748
} else {
2749
len -= sizeof(sec->key);
2750
sec->n_cipher = 0;
2751
}
2752
sec->len = cpu_to_le16(len);
2753
2754
return 0;
2755
}
2756
2757
int mt76_connac_mcu_add_key(struct mt76_dev *dev, struct ieee80211_vif *vif,
2758
struct mt76_connac_sta_key_conf *sta_key_conf,
2759
struct ieee80211_key_conf *key, int mcu_cmd,
2760
struct mt76_wcid *wcid, enum set_key_cmd cmd)
2761
{
2762
struct mt76_vif_link *mvif = (struct mt76_vif_link *)vif->drv_priv;
2763
struct sk_buff *skb;
2764
int ret;
2765
2766
skb = mt76_connac_mcu_alloc_sta_req(dev, mvif, wcid);
2767
if (IS_ERR(skb))
2768
return PTR_ERR(skb);
2769
2770
ret = mt76_connac_mcu_sta_key_tlv(sta_key_conf, skb, key, cmd);
2771
if (ret)
2772
return ret;
2773
2774
ret = mt76_connac_mcu_sta_wed_update(dev, skb);
2775
if (ret)
2776
return ret;
2777
2778
return mt76_mcu_skb_send_msg(dev, skb, mcu_cmd, true);
2779
}
2780
EXPORT_SYMBOL_GPL(mt76_connac_mcu_add_key);
2781
2782
/* SIFS 20us + 512 byte beacon transmitted by 1Mbps (3906us) */
2783
#define BCN_TX_ESTIMATE_TIME (4096 + 20)
2784
void mt76_connac_mcu_bss_ext_tlv(struct sk_buff *skb, struct mt76_vif_link *mvif)
2785
{
2786
struct bss_info_ext_bss *ext;
2787
int ext_bss_idx, tsf_offset;
2788
struct tlv *tlv;
2789
2790
ext_bss_idx = mvif->omac_idx - EXT_BSSID_START;
2791
if (ext_bss_idx < 0)
2792
return;
2793
2794
tlv = mt76_connac_mcu_add_tlv(skb, BSS_INFO_EXT_BSS, sizeof(*ext));
2795
2796
ext = (struct bss_info_ext_bss *)tlv;
2797
tsf_offset = ext_bss_idx * BCN_TX_ESTIMATE_TIME;
2798
ext->mbss_tsf_offset = cpu_to_le32(tsf_offset);
2799
}
2800
EXPORT_SYMBOL_GPL(mt76_connac_mcu_bss_ext_tlv);
2801
2802
int mt76_connac_mcu_bss_basic_tlv(struct sk_buff *skb,
2803
struct ieee80211_vif *vif,
2804
struct ieee80211_sta *sta,
2805
struct mt76_phy *phy, u16 wlan_idx,
2806
bool enable)
2807
{
2808
struct mt76_vif_link *mvif = (struct mt76_vif_link *)vif->drv_priv;
2809
u32 type = vif->p2p ? NETWORK_P2P : NETWORK_INFRA;
2810
struct bss_info_basic *bss;
2811
struct tlv *tlv;
2812
2813
tlv = mt76_connac_mcu_add_tlv(skb, BSS_INFO_BASIC, sizeof(*bss));
2814
bss = (struct bss_info_basic *)tlv;
2815
2816
switch (vif->type) {
2817
case NL80211_IFTYPE_MESH_POINT:
2818
case NL80211_IFTYPE_MONITOR:
2819
break;
2820
case NL80211_IFTYPE_AP:
2821
if (ieee80211_hw_check(phy->hw, SUPPORTS_MULTI_BSSID)) {
2822
u8 bssid_id = vif->bss_conf.bssid_indicator;
2823
struct wiphy *wiphy = phy->hw->wiphy;
2824
2825
if (bssid_id > ilog2(wiphy->mbssid_max_interfaces))
2826
return -EINVAL;
2827
2828
bss->non_tx_bssid = vif->bss_conf.bssid_index;
2829
bss->max_bssid = bssid_id;
2830
}
2831
break;
2832
case NL80211_IFTYPE_STATION:
2833
if (enable) {
2834
rcu_read_lock();
2835
if (!sta)
2836
sta = ieee80211_find_sta(vif,
2837
vif->bss_conf.bssid);
2838
/* TODO: enable BSS_INFO_UAPSD & BSS_INFO_PM */
2839
if (sta) {
2840
struct mt76_wcid *wcid;
2841
2842
wcid = (struct mt76_wcid *)sta->drv_priv;
2843
wlan_idx = wcid->idx;
2844
}
2845
rcu_read_unlock();
2846
}
2847
break;
2848
case NL80211_IFTYPE_ADHOC:
2849
type = NETWORK_IBSS;
2850
break;
2851
default:
2852
WARN_ON(1);
2853
break;
2854
}
2855
2856
bss->network_type = cpu_to_le32(type);
2857
bss->bmc_wcid_lo = to_wcid_lo(wlan_idx);
2858
bss->bmc_wcid_hi = to_wcid_hi(wlan_idx);
2859
bss->wmm_idx = mvif->wmm_idx;
2860
bss->active = enable;
2861
bss->cipher = mvif->cipher;
2862
2863
if (vif->type != NL80211_IFTYPE_MONITOR) {
2864
struct cfg80211_chan_def *chandef = &phy->chandef;
2865
2866
memcpy(bss->bssid, vif->bss_conf.bssid, ETH_ALEN);
2867
bss->bcn_interval = cpu_to_le16(vif->bss_conf.beacon_int);
2868
bss->dtim_period = vif->bss_conf.dtim_period;
2869
bss->phy_mode = mt76_connac_get_phy_mode(phy, vif,
2870
chandef->chan->band, NULL);
2871
} else {
2872
memcpy(bss->bssid, phy->macaddr, ETH_ALEN);
2873
}
2874
2875
return 0;
2876
}
2877
EXPORT_SYMBOL_GPL(mt76_connac_mcu_bss_basic_tlv);
2878
2879
#define ENTER_PM_STATE 1
2880
#define EXIT_PM_STATE 2
2881
int mt76_connac_mcu_set_pm(struct mt76_dev *dev, int band, int enter)
2882
{
2883
struct {
2884
u8 pm_number;
2885
u8 pm_state;
2886
u8 bssid[ETH_ALEN];
2887
u8 dtim_period;
2888
u8 wlan_idx_lo;
2889
__le16 bcn_interval;
2890
__le32 aid;
2891
__le32 rx_filter;
2892
u8 band_idx;
2893
u8 wlan_idx_hi;
2894
u8 rsv[2];
2895
__le32 feature;
2896
u8 omac_idx;
2897
u8 wmm_idx;
2898
u8 bcn_loss_cnt;
2899
u8 bcn_sp_duration;
2900
} __packed req = {
2901
.pm_number = 5,
2902
.pm_state = enter ? ENTER_PM_STATE : EXIT_PM_STATE,
2903
.band_idx = band,
2904
};
2905
2906
return mt76_mcu_send_msg(dev, MCU_EXT_CMD(PM_STATE_CTRL), &req,
2907
sizeof(req), true);
2908
}
2909
EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_pm);
2910
2911
int mt76_connac_mcu_restart(struct mt76_dev *dev)
2912
{
2913
struct {
2914
u8 power_mode;
2915
u8 rsv[3];
2916
} req = {
2917
.power_mode = 1,
2918
};
2919
2920
return mt76_mcu_send_msg(dev, MCU_CMD(NIC_POWER_CTRL), &req,
2921
sizeof(req), false);
2922
}
2923
EXPORT_SYMBOL_GPL(mt76_connac_mcu_restart);
2924
2925
int mt76_connac_mcu_del_wtbl_all(struct mt76_dev *dev)
2926
{
2927
struct wtbl_req_hdr req = {
2928
.operation = WTBL_RESET_ALL,
2929
};
2930
2931
return mt76_mcu_send_msg(dev, MCU_EXT_CMD(WTBL_UPDATE),
2932
&req, sizeof(req), true);
2933
}
2934
EXPORT_SYMBOL_GPL(mt76_connac_mcu_del_wtbl_all);
2935
2936
int mt76_connac_mcu_rdd_cmd(struct mt76_dev *dev, int cmd, u8 index,
2937
u8 rx_sel, u8 val)
2938
{
2939
struct {
2940
u8 ctrl;
2941
u8 rdd_idx;
2942
u8 rdd_rx_sel;
2943
u8 val;
2944
u8 rsv[4];
2945
} __packed req = {
2946
.ctrl = cmd,
2947
.rdd_idx = index,
2948
.rdd_rx_sel = rx_sel,
2949
.val = val,
2950
};
2951
2952
return mt76_mcu_send_msg(dev, MCU_EXT_CMD(SET_RDD_CTRL), &req,
2953
sizeof(req), true);
2954
}
2955
EXPORT_SYMBOL_GPL(mt76_connac_mcu_rdd_cmd);
2956
2957
static int
2958
mt76_connac_mcu_send_ram_firmware(struct mt76_dev *dev,
2959
const struct mt76_connac2_fw_trailer *hdr,
2960
const u8 *data, bool is_wa)
2961
{
2962
int i, offset = 0, max_len = mt76_is_sdio(dev) ? 2048 : 4096;
2963
u32 override = 0, option = 0;
2964
2965
for (i = 0; i < hdr->n_region; i++) {
2966
const struct mt76_connac2_fw_region *region;
2967
u32 len, addr, mode;
2968
int err;
2969
2970
region = (const void *)((const u8 *)hdr -
2971
(hdr->n_region - i) * sizeof(*region));
2972
mode = mt76_connac_mcu_gen_dl_mode(dev, region->feature_set,
2973
is_wa);
2974
len = le32_to_cpu(region->len);
2975
addr = le32_to_cpu(region->addr);
2976
2977
if (region->feature_set & FW_FEATURE_NON_DL)
2978
goto next;
2979
2980
if (region->feature_set & FW_FEATURE_OVERRIDE_ADDR)
2981
override = addr;
2982
2983
err = mt76_connac_mcu_init_download(dev, addr, len, mode);
2984
if (err) {
2985
dev_err(dev->dev, "Download request failed\n");
2986
return err;
2987
}
2988
2989
err = __mt76_mcu_send_firmware(dev, MCU_CMD(FW_SCATTER),
2990
data + offset, len, max_len);
2991
if (err) {
2992
dev_err(dev->dev, "Failed to send firmware.\n");
2993
return err;
2994
}
2995
2996
next:
2997
offset += len;
2998
}
2999
3000
if (override)
3001
option |= FW_START_OVERRIDE;
3002
if (is_wa)
3003
option |= FW_START_WORKING_PDA_CR4;
3004
3005
return mt76_connac_mcu_start_firmware(dev, override, option);
3006
}
3007
3008
int mt76_connac2_load_ram(struct mt76_dev *dev, const char *fw_wm,
3009
const char *fw_wa)
3010
{
3011
const struct mt76_connac2_fw_trailer *hdr;
3012
const struct firmware *fw;
3013
int ret;
3014
3015
ret = request_firmware(&fw, fw_wm, dev->dev);
3016
if (ret)
3017
return ret;
3018
3019
if (!fw || !fw->data || fw->size < sizeof(*hdr)) {
3020
dev_err(dev->dev, "Invalid firmware\n");
3021
ret = -EINVAL;
3022
goto out;
3023
}
3024
3025
hdr = (const void *)(fw->data + fw->size - sizeof(*hdr));
3026
dev_info(dev->dev, "WM Firmware Version: %.10s, Build Time: %.15s",
3027
hdr->fw_ver, hdr->build_date);
3028
3029
ret = mt76_connac_mcu_send_ram_firmware(dev, hdr, fw->data, false);
3030
if (ret) {
3031
dev_err(dev->dev, "Failed to start WM firmware\n");
3032
goto out;
3033
}
3034
3035
snprintf(dev->hw->wiphy->fw_version,
3036
sizeof(dev->hw->wiphy->fw_version),
3037
"%.10s-%.15s", hdr->fw_ver, hdr->build_date);
3038
3039
release_firmware(fw);
3040
3041
if (!fw_wa)
3042
return 0;
3043
3044
ret = request_firmware(&fw, fw_wa, dev->dev);
3045
if (ret)
3046
return ret;
3047
3048
if (!fw || !fw->data || fw->size < sizeof(*hdr)) {
3049
dev_err(dev->dev, "Invalid firmware\n");
3050
ret = -EINVAL;
3051
goto out;
3052
}
3053
3054
hdr = (const void *)(fw->data + fw->size - sizeof(*hdr));
3055
dev_info(dev->dev, "WA Firmware Version: %.10s, Build Time: %.15s",
3056
hdr->fw_ver, hdr->build_date);
3057
3058
ret = mt76_connac_mcu_send_ram_firmware(dev, hdr, fw->data, true);
3059
if (ret) {
3060
dev_err(dev->dev, "Failed to start WA firmware\n");
3061
goto out;
3062
}
3063
3064
snprintf(dev->hw->wiphy->fw_version,
3065
sizeof(dev->hw->wiphy->fw_version),
3066
"%.10s-%.15s", hdr->fw_ver, hdr->build_date);
3067
3068
out:
3069
release_firmware(fw);
3070
3071
return ret;
3072
}
3073
EXPORT_SYMBOL_GPL(mt76_connac2_load_ram);
3074
3075
static u32 mt76_connac2_get_data_mode(struct mt76_dev *dev, u32 info)
3076
{
3077
u32 mode = DL_MODE_NEED_RSP;
3078
3079
if ((!is_mt7921(dev) && !is_mt7925(dev)) || info == PATCH_SEC_NOT_SUPPORT)
3080
return mode;
3081
3082
switch (FIELD_GET(PATCH_SEC_ENC_TYPE_MASK, info)) {
3083
case PATCH_SEC_ENC_TYPE_PLAIN:
3084
break;
3085
case PATCH_SEC_ENC_TYPE_AES:
3086
mode |= DL_MODE_ENCRYPT;
3087
mode |= FIELD_PREP(DL_MODE_KEY_IDX,
3088
(info & PATCH_SEC_ENC_AES_KEY_MASK)) & DL_MODE_KEY_IDX;
3089
mode |= DL_MODE_RESET_SEC_IV;
3090
break;
3091
case PATCH_SEC_ENC_TYPE_SCRAMBLE:
3092
mode |= DL_MODE_ENCRYPT;
3093
mode |= DL_CONFIG_ENCRY_MODE_SEL;
3094
mode |= DL_MODE_RESET_SEC_IV;
3095
break;
3096
default:
3097
dev_err(dev->dev, "Encryption type not support!\n");
3098
}
3099
3100
return mode;
3101
}
3102
3103
int mt76_connac2_load_patch(struct mt76_dev *dev, const char *fw_name)
3104
{
3105
int i, ret, sem, max_len = mt76_is_sdio(dev) ? 2048 : 4096;
3106
const struct mt76_connac2_patch_hdr *hdr;
3107
const struct firmware *fw = NULL;
3108
3109
sem = mt76_connac_mcu_patch_sem_ctrl(dev, true);
3110
switch (sem) {
3111
case PATCH_IS_DL:
3112
return 0;
3113
case PATCH_NOT_DL_SEM_SUCCESS:
3114
break;
3115
default:
3116
dev_err(dev->dev, "Failed to get patch semaphore\n");
3117
return -EAGAIN;
3118
}
3119
3120
ret = request_firmware(&fw, fw_name, dev->dev);
3121
if (ret)
3122
goto out;
3123
3124
if (!fw || !fw->data || fw->size < sizeof(*hdr)) {
3125
dev_err(dev->dev, "Invalid firmware\n");
3126
ret = -EINVAL;
3127
goto out;
3128
}
3129
3130
hdr = (const void *)fw->data;
3131
dev_info(dev->dev, "HW/SW Version: 0x%x, Build Time: %.16s",
3132
be32_to_cpu(hdr->hw_sw_ver), hdr->build_date);
3133
3134
for (i = 0; i < be32_to_cpu(hdr->desc.n_region); i++) {
3135
#if defined(__linux__)
3136
struct mt76_connac2_patch_sec *sec;
3137
#elif defined(__FreeBSD__)
3138
const struct mt76_connac2_patch_sec *sec;
3139
#endif
3140
u32 len, addr, mode;
3141
const u8 *dl;
3142
u32 sec_info;
3143
3144
#if defined(__linux__)
3145
sec = (void *)(fw->data + sizeof(*hdr) + i * sizeof(*sec));
3146
#elif defined(__FreeBSD__)
3147
sec = (const void *)(fw->data + sizeof(*hdr) + i * sizeof(*sec));
3148
#endif
3149
if ((be32_to_cpu(sec->type) & PATCH_SEC_TYPE_MASK) !=
3150
PATCH_SEC_TYPE_INFO) {
3151
ret = -EINVAL;
3152
goto out;
3153
}
3154
3155
addr = be32_to_cpu(sec->info.addr);
3156
len = be32_to_cpu(sec->info.len);
3157
dl = fw->data + be32_to_cpu(sec->offs);
3158
sec_info = be32_to_cpu(sec->info.sec_key_idx);
3159
mode = mt76_connac2_get_data_mode(dev, sec_info);
3160
3161
ret = mt76_connac_mcu_init_download(dev, addr, len, mode);
3162
if (ret) {
3163
dev_err(dev->dev, "Download request failed\n");
3164
goto out;
3165
}
3166
3167
ret = __mt76_mcu_send_firmware(dev, MCU_CMD(FW_SCATTER),
3168
dl, len, max_len);
3169
if (ret) {
3170
dev_err(dev->dev, "Failed to send patch\n");
3171
goto out;
3172
}
3173
}
3174
3175
ret = mt76_connac_mcu_start_patch(dev);
3176
if (ret)
3177
dev_err(dev->dev, "Failed to start patch\n");
3178
3179
out:
3180
sem = mt76_connac_mcu_patch_sem_ctrl(dev, false);
3181
switch (sem) {
3182
case PATCH_REL_SEM_SUCCESS:
3183
break;
3184
default:
3185
ret = -EAGAIN;
3186
dev_err(dev->dev, "Failed to release patch semaphore\n");
3187
break;
3188
}
3189
3190
release_firmware(fw);
3191
3192
return ret;
3193
}
3194
EXPORT_SYMBOL_GPL(mt76_connac2_load_patch);
3195
3196
int mt76_connac2_mcu_fill_message(struct mt76_dev *dev, struct sk_buff *skb,
3197
int cmd, int *wait_seq)
3198
{
3199
int txd_len, mcu_cmd = FIELD_GET(__MCU_CMD_FIELD_ID, cmd);
3200
struct mt76_connac2_mcu_uni_txd *uni_txd;
3201
struct mt76_connac2_mcu_txd *mcu_txd;
3202
__le32 *txd;
3203
u32 val;
3204
u8 seq;
3205
3206
/* TODO: make dynamic based on msg type */
3207
dev->mcu.timeout = 20 * HZ;
3208
3209
seq = ++dev->mcu.msg_seq & 0xf;
3210
if (!seq)
3211
seq = ++dev->mcu.msg_seq & 0xf;
3212
3213
if (cmd == MCU_CMD(FW_SCATTER))
3214
goto exit;
3215
3216
txd_len = cmd & __MCU_CMD_FIELD_UNI ? sizeof(*uni_txd) : sizeof(*mcu_txd);
3217
txd = (__le32 *)skb_push(skb, txd_len);
3218
3219
val = FIELD_PREP(MT_TXD0_TX_BYTES, skb->len) |
3220
FIELD_PREP(MT_TXD0_PKT_FMT, MT_TX_TYPE_CMD) |
3221
FIELD_PREP(MT_TXD0_Q_IDX, MT_TX_MCU_PORT_RX_Q0);
3222
txd[0] = cpu_to_le32(val);
3223
3224
val = MT_TXD1_LONG_FORMAT |
3225
FIELD_PREP(MT_TXD1_HDR_FORMAT, MT_HDR_FORMAT_CMD);
3226
txd[1] = cpu_to_le32(val);
3227
3228
if (cmd & __MCU_CMD_FIELD_UNI) {
3229
uni_txd = (struct mt76_connac2_mcu_uni_txd *)txd;
3230
uni_txd->len = cpu_to_le16(skb->len - sizeof(uni_txd->txd));
3231
uni_txd->option = MCU_CMD_UNI_EXT_ACK;
3232
uni_txd->cid = cpu_to_le16(mcu_cmd);
3233
uni_txd->s2d_index = MCU_S2D_H2N;
3234
uni_txd->pkt_type = MCU_PKT_ID;
3235
uni_txd->seq = seq;
3236
3237
goto exit;
3238
}
3239
3240
mcu_txd = (struct mt76_connac2_mcu_txd *)txd;
3241
mcu_txd->len = cpu_to_le16(skb->len - sizeof(mcu_txd->txd));
3242
mcu_txd->pq_id = cpu_to_le16(MCU_PQ_ID(MT_TX_PORT_IDX_MCU,
3243
MT_TX_MCU_PORT_RX_Q0));
3244
mcu_txd->pkt_type = MCU_PKT_ID;
3245
mcu_txd->seq = seq;
3246
mcu_txd->cid = mcu_cmd;
3247
mcu_txd->ext_cid = FIELD_GET(__MCU_CMD_FIELD_EXT_ID, cmd);
3248
3249
if (mcu_txd->ext_cid || (cmd & __MCU_CMD_FIELD_CE)) {
3250
if (cmd & __MCU_CMD_FIELD_QUERY)
3251
mcu_txd->set_query = MCU_Q_QUERY;
3252
else
3253
mcu_txd->set_query = MCU_Q_SET;
3254
mcu_txd->ext_cid_ack = !!mcu_txd->ext_cid;
3255
} else {
3256
mcu_txd->set_query = MCU_Q_NA;
3257
}
3258
3259
if (cmd & __MCU_CMD_FIELD_WA)
3260
mcu_txd->s2d_index = MCU_S2D_H2C;
3261
else
3262
mcu_txd->s2d_index = MCU_S2D_H2N;
3263
3264
exit:
3265
if (wait_seq)
3266
*wait_seq = seq;
3267
3268
return 0;
3269
}
3270
EXPORT_SYMBOL_GPL(mt76_connac2_mcu_fill_message);
3271
3272
MODULE_AUTHOR("Lorenzo Bianconi <[email protected]>");
3273
MODULE_DESCRIPTION("MediaTek MT76x connac layer helpers");
3274
MODULE_LICENSE("Dual BSD/GPL");
3275
3276