Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/contrib/dev/athk/ath11k/mac.c
48378 views
1
// SPDX-License-Identifier: BSD-3-Clause-Clear
2
/*
3
* Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
4
* Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
5
*/
6
7
#include <net/mac80211.h>
8
#include <linux/etherdevice.h>
9
#include <linux/bitfield.h>
10
#include <linux/inetdevice.h>
11
#include <net/if_inet6.h>
12
#include <net/ipv6.h>
13
14
#include "mac.h"
15
#include "core.h"
16
#include "debug.h"
17
#include "wmi.h"
18
#include "hw.h"
19
#include "dp_tx.h"
20
#include "dp_rx.h"
21
#include "testmode.h"
22
#include "peer.h"
23
#include "debugfs_sta.h"
24
#include "hif.h"
25
#include "wow.h"
26
27
#define CHAN2G(_channel, _freq, _flags) { \
28
.band = NL80211_BAND_2GHZ, \
29
.hw_value = (_channel), \
30
.center_freq = (_freq), \
31
.flags = (_flags), \
32
.max_antenna_gain = 0, \
33
.max_power = 30, \
34
}
35
36
#define CHAN5G(_channel, _freq, _flags) { \
37
.band = NL80211_BAND_5GHZ, \
38
.hw_value = (_channel), \
39
.center_freq = (_freq), \
40
.flags = (_flags), \
41
.max_antenna_gain = 0, \
42
.max_power = 30, \
43
}
44
45
#define CHAN6G(_channel, _freq, _flags) { \
46
.band = NL80211_BAND_6GHZ, \
47
.hw_value = (_channel), \
48
.center_freq = (_freq), \
49
.flags = (_flags), \
50
.max_antenna_gain = 0, \
51
.max_power = 30, \
52
}
53
54
static const struct ieee80211_channel ath11k_2ghz_channels[] = {
55
CHAN2G(1, 2412, 0),
56
CHAN2G(2, 2417, 0),
57
CHAN2G(3, 2422, 0),
58
CHAN2G(4, 2427, 0),
59
CHAN2G(5, 2432, 0),
60
CHAN2G(6, 2437, 0),
61
CHAN2G(7, 2442, 0),
62
CHAN2G(8, 2447, 0),
63
CHAN2G(9, 2452, 0),
64
CHAN2G(10, 2457, 0),
65
CHAN2G(11, 2462, 0),
66
CHAN2G(12, 2467, 0),
67
CHAN2G(13, 2472, 0),
68
CHAN2G(14, 2484, 0),
69
};
70
71
static const struct ieee80211_channel ath11k_5ghz_channels[] = {
72
CHAN5G(36, 5180, 0),
73
CHAN5G(40, 5200, 0),
74
CHAN5G(44, 5220, 0),
75
CHAN5G(48, 5240, 0),
76
CHAN5G(52, 5260, 0),
77
CHAN5G(56, 5280, 0),
78
CHAN5G(60, 5300, 0),
79
CHAN5G(64, 5320, 0),
80
CHAN5G(100, 5500, 0),
81
CHAN5G(104, 5520, 0),
82
CHAN5G(108, 5540, 0),
83
CHAN5G(112, 5560, 0),
84
CHAN5G(116, 5580, 0),
85
CHAN5G(120, 5600, 0),
86
CHAN5G(124, 5620, 0),
87
CHAN5G(128, 5640, 0),
88
CHAN5G(132, 5660, 0),
89
CHAN5G(136, 5680, 0),
90
CHAN5G(140, 5700, 0),
91
CHAN5G(144, 5720, 0),
92
CHAN5G(149, 5745, 0),
93
CHAN5G(153, 5765, 0),
94
CHAN5G(157, 5785, 0),
95
CHAN5G(161, 5805, 0),
96
CHAN5G(165, 5825, 0),
97
CHAN5G(169, 5845, 0),
98
CHAN5G(173, 5865, 0),
99
CHAN5G(177, 5885, 0),
100
};
101
102
static const struct ieee80211_channel ath11k_6ghz_channels[] = {
103
CHAN6G(1, 5955, 0),
104
CHAN6G(5, 5975, 0),
105
CHAN6G(9, 5995, 0),
106
CHAN6G(13, 6015, 0),
107
CHAN6G(17, 6035, 0),
108
CHAN6G(21, 6055, 0),
109
CHAN6G(25, 6075, 0),
110
CHAN6G(29, 6095, 0),
111
CHAN6G(33, 6115, 0),
112
CHAN6G(37, 6135, 0),
113
CHAN6G(41, 6155, 0),
114
CHAN6G(45, 6175, 0),
115
CHAN6G(49, 6195, 0),
116
CHAN6G(53, 6215, 0),
117
CHAN6G(57, 6235, 0),
118
CHAN6G(61, 6255, 0),
119
CHAN6G(65, 6275, 0),
120
CHAN6G(69, 6295, 0),
121
CHAN6G(73, 6315, 0),
122
CHAN6G(77, 6335, 0),
123
CHAN6G(81, 6355, 0),
124
CHAN6G(85, 6375, 0),
125
CHAN6G(89, 6395, 0),
126
CHAN6G(93, 6415, 0),
127
CHAN6G(97, 6435, 0),
128
CHAN6G(101, 6455, 0),
129
CHAN6G(105, 6475, 0),
130
CHAN6G(109, 6495, 0),
131
CHAN6G(113, 6515, 0),
132
CHAN6G(117, 6535, 0),
133
CHAN6G(121, 6555, 0),
134
CHAN6G(125, 6575, 0),
135
CHAN6G(129, 6595, 0),
136
CHAN6G(133, 6615, 0),
137
CHAN6G(137, 6635, 0),
138
CHAN6G(141, 6655, 0),
139
CHAN6G(145, 6675, 0),
140
CHAN6G(149, 6695, 0),
141
CHAN6G(153, 6715, 0),
142
CHAN6G(157, 6735, 0),
143
CHAN6G(161, 6755, 0),
144
CHAN6G(165, 6775, 0),
145
CHAN6G(169, 6795, 0),
146
CHAN6G(173, 6815, 0),
147
CHAN6G(177, 6835, 0),
148
CHAN6G(181, 6855, 0),
149
CHAN6G(185, 6875, 0),
150
CHAN6G(189, 6895, 0),
151
CHAN6G(193, 6915, 0),
152
CHAN6G(197, 6935, 0),
153
CHAN6G(201, 6955, 0),
154
CHAN6G(205, 6975, 0),
155
CHAN6G(209, 6995, 0),
156
CHAN6G(213, 7015, 0),
157
CHAN6G(217, 7035, 0),
158
CHAN6G(221, 7055, 0),
159
CHAN6G(225, 7075, 0),
160
CHAN6G(229, 7095, 0),
161
CHAN6G(233, 7115, 0),
162
163
/* new addition in IEEE Std 802.11ax-2021 */
164
CHAN6G(2, 5935, 0),
165
};
166
167
static struct ieee80211_rate ath11k_legacy_rates[] = {
168
{ .bitrate = 10,
169
.hw_value = ATH11K_HW_RATE_CCK_LP_1M },
170
{ .bitrate = 20,
171
.hw_value = ATH11K_HW_RATE_CCK_LP_2M,
172
.hw_value_short = ATH11K_HW_RATE_CCK_SP_2M,
173
.flags = IEEE80211_RATE_SHORT_PREAMBLE },
174
{ .bitrate = 55,
175
.hw_value = ATH11K_HW_RATE_CCK_LP_5_5M,
176
.hw_value_short = ATH11K_HW_RATE_CCK_SP_5_5M,
177
.flags = IEEE80211_RATE_SHORT_PREAMBLE },
178
{ .bitrate = 110,
179
.hw_value = ATH11K_HW_RATE_CCK_LP_11M,
180
.hw_value_short = ATH11K_HW_RATE_CCK_SP_11M,
181
.flags = IEEE80211_RATE_SHORT_PREAMBLE },
182
183
{ .bitrate = 60, .hw_value = ATH11K_HW_RATE_OFDM_6M },
184
{ .bitrate = 90, .hw_value = ATH11K_HW_RATE_OFDM_9M },
185
{ .bitrate = 120, .hw_value = ATH11K_HW_RATE_OFDM_12M },
186
{ .bitrate = 180, .hw_value = ATH11K_HW_RATE_OFDM_18M },
187
{ .bitrate = 240, .hw_value = ATH11K_HW_RATE_OFDM_24M },
188
{ .bitrate = 360, .hw_value = ATH11K_HW_RATE_OFDM_36M },
189
{ .bitrate = 480, .hw_value = ATH11K_HW_RATE_OFDM_48M },
190
{ .bitrate = 540, .hw_value = ATH11K_HW_RATE_OFDM_54M },
191
};
192
193
static const int
194
ath11k_phymodes[NUM_NL80211_BANDS][ATH11K_CHAN_WIDTH_NUM] = {
195
[NL80211_BAND_2GHZ] = {
196
[NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
197
[NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
198
[NL80211_CHAN_WIDTH_20_NOHT] = MODE_11AX_HE20_2G,
199
[NL80211_CHAN_WIDTH_20] = MODE_11AX_HE20_2G,
200
[NL80211_CHAN_WIDTH_40] = MODE_11AX_HE40_2G,
201
[NL80211_CHAN_WIDTH_80] = MODE_11AX_HE80_2G,
202
[NL80211_CHAN_WIDTH_80P80] = MODE_UNKNOWN,
203
[NL80211_CHAN_WIDTH_160] = MODE_UNKNOWN,
204
},
205
[NL80211_BAND_5GHZ] = {
206
[NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
207
[NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
208
[NL80211_CHAN_WIDTH_20_NOHT] = MODE_11AX_HE20,
209
[NL80211_CHAN_WIDTH_20] = MODE_11AX_HE20,
210
[NL80211_CHAN_WIDTH_40] = MODE_11AX_HE40,
211
[NL80211_CHAN_WIDTH_80] = MODE_11AX_HE80,
212
[NL80211_CHAN_WIDTH_160] = MODE_11AX_HE160,
213
[NL80211_CHAN_WIDTH_80P80] = MODE_11AX_HE80_80,
214
},
215
[NL80211_BAND_6GHZ] = {
216
[NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
217
[NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
218
[NL80211_CHAN_WIDTH_20_NOHT] = MODE_11AX_HE20,
219
[NL80211_CHAN_WIDTH_20] = MODE_11AX_HE20,
220
[NL80211_CHAN_WIDTH_40] = MODE_11AX_HE40,
221
[NL80211_CHAN_WIDTH_80] = MODE_11AX_HE80,
222
[NL80211_CHAN_WIDTH_160] = MODE_11AX_HE160,
223
[NL80211_CHAN_WIDTH_80P80] = MODE_11AX_HE80_80,
224
},
225
226
};
227
228
const struct htt_rx_ring_tlv_filter ath11k_mac_mon_status_filter_default = {
229
.rx_filter = HTT_RX_FILTER_TLV_FLAGS_MPDU_START |
230
HTT_RX_FILTER_TLV_FLAGS_PPDU_END |
231
HTT_RX_FILTER_TLV_FLAGS_PPDU_END_STATUS_DONE,
232
.pkt_filter_flags0 = HTT_RX_FP_MGMT_FILTER_FLAGS0,
233
.pkt_filter_flags1 = HTT_RX_FP_MGMT_FILTER_FLAGS1,
234
.pkt_filter_flags2 = HTT_RX_FP_CTRL_FILTER_FLASG2,
235
.pkt_filter_flags3 = HTT_RX_FP_DATA_FILTER_FLASG3 |
236
HTT_RX_FP_CTRL_FILTER_FLASG3
237
};
238
239
#define ATH11K_MAC_FIRST_OFDM_RATE_IDX 4
240
#define ath11k_g_rates ath11k_legacy_rates
241
#define ath11k_g_rates_size (ARRAY_SIZE(ath11k_legacy_rates))
242
#define ath11k_a_rates (ath11k_legacy_rates + 4)
243
#define ath11k_a_rates_size (ARRAY_SIZE(ath11k_legacy_rates) - 4)
244
245
#define ATH11K_MAC_SCAN_CMD_EVT_OVERHEAD 200 /* in msecs */
246
247
/* Overhead due to the processing of channel switch events from FW */
248
#define ATH11K_SCAN_CHANNEL_SWITCH_WMI_EVT_OVERHEAD 10 /* in msecs */
249
250
static const u32 ath11k_smps_map[] = {
251
[WLAN_HT_CAP_SM_PS_STATIC] = WMI_PEER_SMPS_STATIC,
252
[WLAN_HT_CAP_SM_PS_DYNAMIC] = WMI_PEER_SMPS_DYNAMIC,
253
[WLAN_HT_CAP_SM_PS_INVALID] = WMI_PEER_SMPS_PS_NONE,
254
[WLAN_HT_CAP_SM_PS_DISABLED] = WMI_PEER_SMPS_PS_NONE,
255
};
256
257
static int ath11k_start_vdev_delay(struct ieee80211_hw *hw,
258
struct ieee80211_vif *vif);
259
260
enum nl80211_he_ru_alloc ath11k_mac_phy_he_ru_to_nl80211_he_ru_alloc(u16 ru_phy)
261
{
262
enum nl80211_he_ru_alloc ret;
263
264
switch (ru_phy) {
265
case RU_26:
266
ret = NL80211_RATE_INFO_HE_RU_ALLOC_26;
267
break;
268
case RU_52:
269
ret = NL80211_RATE_INFO_HE_RU_ALLOC_52;
270
break;
271
case RU_106:
272
ret = NL80211_RATE_INFO_HE_RU_ALLOC_106;
273
break;
274
case RU_242:
275
ret = NL80211_RATE_INFO_HE_RU_ALLOC_242;
276
break;
277
case RU_484:
278
ret = NL80211_RATE_INFO_HE_RU_ALLOC_484;
279
break;
280
case RU_996:
281
ret = NL80211_RATE_INFO_HE_RU_ALLOC_996;
282
break;
283
default:
284
ret = NL80211_RATE_INFO_HE_RU_ALLOC_26;
285
break;
286
}
287
288
return ret;
289
}
290
291
enum nl80211_he_ru_alloc ath11k_mac_he_ru_tones_to_nl80211_he_ru_alloc(u16 ru_tones)
292
{
293
enum nl80211_he_ru_alloc ret;
294
295
switch (ru_tones) {
296
case 26:
297
ret = NL80211_RATE_INFO_HE_RU_ALLOC_26;
298
break;
299
case 52:
300
ret = NL80211_RATE_INFO_HE_RU_ALLOC_52;
301
break;
302
case 106:
303
ret = NL80211_RATE_INFO_HE_RU_ALLOC_106;
304
break;
305
case 242:
306
ret = NL80211_RATE_INFO_HE_RU_ALLOC_242;
307
break;
308
case 484:
309
ret = NL80211_RATE_INFO_HE_RU_ALLOC_484;
310
break;
311
case 996:
312
ret = NL80211_RATE_INFO_HE_RU_ALLOC_996;
313
break;
314
case (996 * 2):
315
ret = NL80211_RATE_INFO_HE_RU_ALLOC_2x996;
316
break;
317
default:
318
ret = NL80211_RATE_INFO_HE_RU_ALLOC_26;
319
break;
320
}
321
322
return ret;
323
}
324
325
enum nl80211_he_gi ath11k_mac_he_gi_to_nl80211_he_gi(u8 sgi)
326
{
327
enum nl80211_he_gi ret;
328
329
switch (sgi) {
330
case RX_MSDU_START_SGI_0_8_US:
331
ret = NL80211_RATE_INFO_HE_GI_0_8;
332
break;
333
case RX_MSDU_START_SGI_1_6_US:
334
ret = NL80211_RATE_INFO_HE_GI_1_6;
335
break;
336
case RX_MSDU_START_SGI_3_2_US:
337
ret = NL80211_RATE_INFO_HE_GI_3_2;
338
break;
339
default:
340
ret = NL80211_RATE_INFO_HE_GI_0_8;
341
break;
342
}
343
344
return ret;
345
}
346
347
u8 ath11k_mac_bw_to_mac80211_bw(u8 bw)
348
{
349
u8 ret = 0;
350
351
switch (bw) {
352
case ATH11K_BW_20:
353
ret = RATE_INFO_BW_20;
354
break;
355
case ATH11K_BW_40:
356
ret = RATE_INFO_BW_40;
357
break;
358
case ATH11K_BW_80:
359
ret = RATE_INFO_BW_80;
360
break;
361
case ATH11K_BW_160:
362
ret = RATE_INFO_BW_160;
363
break;
364
}
365
366
return ret;
367
}
368
369
enum ath11k_supported_bw ath11k_mac_mac80211_bw_to_ath11k_bw(enum rate_info_bw bw)
370
{
371
switch (bw) {
372
case RATE_INFO_BW_20:
373
return ATH11K_BW_20;
374
case RATE_INFO_BW_40:
375
return ATH11K_BW_40;
376
case RATE_INFO_BW_80:
377
return ATH11K_BW_80;
378
case RATE_INFO_BW_160:
379
return ATH11K_BW_160;
380
default:
381
return ATH11K_BW_20;
382
}
383
}
384
385
int ath11k_mac_hw_ratecode_to_legacy_rate(u8 hw_rc, u8 preamble, u8 *rateidx,
386
u16 *rate)
387
{
388
/* As default, it is OFDM rates */
389
int i = ATH11K_MAC_FIRST_OFDM_RATE_IDX;
390
int max_rates_idx = ath11k_g_rates_size;
391
392
if (preamble == WMI_RATE_PREAMBLE_CCK) {
393
hw_rc &= ~ATH11k_HW_RATECODE_CCK_SHORT_PREAM_MASK;
394
i = 0;
395
max_rates_idx = ATH11K_MAC_FIRST_OFDM_RATE_IDX;
396
}
397
398
while (i < max_rates_idx) {
399
if (hw_rc == ath11k_legacy_rates[i].hw_value) {
400
*rateidx = i;
401
*rate = ath11k_legacy_rates[i].bitrate;
402
return 0;
403
}
404
i++;
405
}
406
407
return -EINVAL;
408
}
409
410
static int get_num_chains(u32 mask)
411
{
412
int num_chains = 0;
413
414
while (mask) {
415
if (mask & BIT(0))
416
num_chains++;
417
mask >>= 1;
418
}
419
420
return num_chains;
421
}
422
423
u8 ath11k_mac_bitrate_to_idx(const struct ieee80211_supported_band *sband,
424
u32 bitrate)
425
{
426
int i;
427
428
for (i = 0; i < sband->n_bitrates; i++)
429
if (sband->bitrates[i].bitrate == bitrate)
430
return i;
431
432
return 0;
433
}
434
435
static u32
436
ath11k_mac_max_ht_nss(const u8 *ht_mcs_mask)
437
{
438
int nss;
439
440
for (nss = IEEE80211_HT_MCS_MASK_LEN - 1; nss >= 0; nss--)
441
if (ht_mcs_mask[nss])
442
return nss + 1;
443
444
return 1;
445
}
446
447
static u32
448
ath11k_mac_max_vht_nss(const u16 *vht_mcs_mask)
449
{
450
int nss;
451
452
for (nss = NL80211_VHT_NSS_MAX - 1; nss >= 0; nss--)
453
if (vht_mcs_mask[nss])
454
return nss + 1;
455
456
return 1;
457
}
458
459
static u32
460
ath11k_mac_max_he_nss(const u16 *he_mcs_mask)
461
{
462
int nss;
463
464
for (nss = NL80211_HE_NSS_MAX - 1; nss >= 0; nss--)
465
if (he_mcs_mask[nss])
466
return nss + 1;
467
468
return 1;
469
}
470
471
static u8 ath11k_parse_mpdudensity(u8 mpdudensity)
472
{
473
/* 802.11n D2.0 defined values for "Minimum MPDU Start Spacing":
474
* 0 for no restriction
475
* 1 for 1/4 us
476
* 2 for 1/2 us
477
* 3 for 1 us
478
* 4 for 2 us
479
* 5 for 4 us
480
* 6 for 8 us
481
* 7 for 16 us
482
*/
483
switch (mpdudensity) {
484
case 0:
485
return 0;
486
case 1:
487
case 2:
488
case 3:
489
/* Our lower layer calculations limit our precision to
490
* 1 microsecond
491
*/
492
return 1;
493
case 4:
494
return 2;
495
case 5:
496
return 4;
497
case 6:
498
return 8;
499
case 7:
500
return 16;
501
default:
502
return 0;
503
}
504
}
505
506
static int ath11k_mac_vif_chan(struct ieee80211_vif *vif,
507
struct cfg80211_chan_def *def)
508
{
509
struct ieee80211_chanctx_conf *conf;
510
511
rcu_read_lock();
512
conf = rcu_dereference(vif->bss_conf.chanctx_conf);
513
if (!conf) {
514
rcu_read_unlock();
515
return -ENOENT;
516
}
517
518
*def = conf->def;
519
rcu_read_unlock();
520
521
return 0;
522
}
523
524
static bool ath11k_mac_bitrate_is_cck(int bitrate)
525
{
526
switch (bitrate) {
527
case 10:
528
case 20:
529
case 55:
530
case 110:
531
return true;
532
}
533
534
return false;
535
}
536
537
u8 ath11k_mac_hw_rate_to_idx(const struct ieee80211_supported_band *sband,
538
u8 hw_rate, bool cck)
539
{
540
const struct ieee80211_rate *rate;
541
int i;
542
543
for (i = 0; i < sband->n_bitrates; i++) {
544
rate = &sband->bitrates[i];
545
546
if (ath11k_mac_bitrate_is_cck(rate->bitrate) != cck)
547
continue;
548
549
if (rate->hw_value == hw_rate)
550
return i;
551
else if (rate->flags & IEEE80211_RATE_SHORT_PREAMBLE &&
552
rate->hw_value_short == hw_rate)
553
return i;
554
}
555
556
return 0;
557
}
558
559
static u8 ath11k_mac_bitrate_to_rate(int bitrate)
560
{
561
return DIV_ROUND_UP(bitrate, 5) |
562
(ath11k_mac_bitrate_is_cck(bitrate) ? BIT(7) : 0);
563
}
564
565
static void ath11k_get_arvif_iter(void *data, u8 *mac,
566
struct ieee80211_vif *vif)
567
{
568
struct ath11k_vif_iter *arvif_iter = data;
569
struct ath11k_vif *arvif = (void *)vif->drv_priv;
570
571
if (arvif->vdev_id == arvif_iter->vdev_id)
572
arvif_iter->arvif = arvif;
573
}
574
575
struct ath11k_vif *ath11k_mac_get_arvif(struct ath11k *ar, u32 vdev_id)
576
{
577
struct ath11k_vif_iter arvif_iter;
578
u32 flags;
579
580
memset(&arvif_iter, 0, sizeof(struct ath11k_vif_iter));
581
arvif_iter.vdev_id = vdev_id;
582
583
flags = IEEE80211_IFACE_ITER_RESUME_ALL;
584
ieee80211_iterate_active_interfaces_atomic(ar->hw,
585
flags,
586
ath11k_get_arvif_iter,
587
&arvif_iter);
588
if (!arvif_iter.arvif) {
589
ath11k_warn(ar->ab, "No VIF found for vdev %d\n", vdev_id);
590
return NULL;
591
}
592
593
return arvif_iter.arvif;
594
}
595
596
struct ath11k_vif *ath11k_mac_get_arvif_by_vdev_id(struct ath11k_base *ab,
597
u32 vdev_id)
598
{
599
int i;
600
struct ath11k_pdev *pdev;
601
struct ath11k_vif *arvif;
602
603
for (i = 0; i < ab->num_radios; i++) {
604
pdev = rcu_dereference(ab->pdevs_active[i]);
605
if (pdev && pdev->ar &&
606
(pdev->ar->allocated_vdev_map & (1LL << vdev_id))) {
607
arvif = ath11k_mac_get_arvif(pdev->ar, vdev_id);
608
if (arvif)
609
return arvif;
610
}
611
}
612
613
return NULL;
614
}
615
616
struct ath11k *ath11k_mac_get_ar_by_vdev_id(struct ath11k_base *ab, u32 vdev_id)
617
{
618
int i;
619
struct ath11k_pdev *pdev;
620
621
for (i = 0; i < ab->num_radios; i++) {
622
pdev = rcu_dereference(ab->pdevs_active[i]);
623
if (pdev && pdev->ar) {
624
if (pdev->ar->allocated_vdev_map & (1LL << vdev_id))
625
return pdev->ar;
626
}
627
}
628
629
return NULL;
630
}
631
632
struct ath11k *ath11k_mac_get_ar_by_pdev_id(struct ath11k_base *ab, u32 pdev_id)
633
{
634
int i;
635
struct ath11k_pdev *pdev;
636
637
if (ab->hw_params.single_pdev_only) {
638
pdev = rcu_dereference(ab->pdevs_active[0]);
639
return pdev ? pdev->ar : NULL;
640
}
641
642
if (WARN_ON(pdev_id > ab->num_radios))
643
return NULL;
644
645
for (i = 0; i < ab->num_radios; i++) {
646
if (ab->fw_mode == ATH11K_FIRMWARE_MODE_FTM)
647
pdev = &ab->pdevs[i];
648
else
649
pdev = rcu_dereference(ab->pdevs_active[i]);
650
651
if (pdev && pdev->pdev_id == pdev_id)
652
return (pdev->ar ? pdev->ar : NULL);
653
}
654
655
return NULL;
656
}
657
658
struct ath11k_vif *ath11k_mac_get_vif_up(struct ath11k_base *ab)
659
{
660
struct ath11k *ar;
661
struct ath11k_pdev *pdev;
662
struct ath11k_vif *arvif;
663
int i;
664
665
for (i = 0; i < ab->num_radios; i++) {
666
pdev = &ab->pdevs[i];
667
ar = pdev->ar;
668
list_for_each_entry(arvif, &ar->arvifs, list) {
669
if (arvif->is_up)
670
return arvif;
671
}
672
}
673
674
return NULL;
675
}
676
677
static bool ath11k_mac_band_match(enum nl80211_band band1, enum WMI_HOST_WLAN_BAND band2)
678
{
679
return (((band1 == NL80211_BAND_2GHZ) && (band2 & WMI_HOST_WLAN_2G_CAP)) ||
680
(((band1 == NL80211_BAND_5GHZ) || (band1 == NL80211_BAND_6GHZ)) &&
681
(band2 & WMI_HOST_WLAN_5G_CAP)));
682
}
683
684
u8 ath11k_mac_get_target_pdev_id_from_vif(struct ath11k_vif *arvif)
685
{
686
struct ath11k *ar = arvif->ar;
687
struct ath11k_base *ab = ar->ab;
688
struct ieee80211_vif *vif = arvif->vif;
689
struct cfg80211_chan_def def;
690
enum nl80211_band band;
691
u8 pdev_id = ab->target_pdev_ids[0].pdev_id;
692
int i;
693
694
if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
695
return pdev_id;
696
697
band = def.chan->band;
698
699
for (i = 0; i < ab->target_pdev_count; i++) {
700
if (ath11k_mac_band_match(band, ab->target_pdev_ids[i].supported_bands))
701
return ab->target_pdev_ids[i].pdev_id;
702
}
703
704
return pdev_id;
705
}
706
707
u8 ath11k_mac_get_target_pdev_id(struct ath11k *ar)
708
{
709
struct ath11k_vif *arvif;
710
711
arvif = ath11k_mac_get_vif_up(ar->ab);
712
713
if (arvif)
714
return ath11k_mac_get_target_pdev_id_from_vif(arvif);
715
else
716
return ar->ab->target_pdev_ids[0].pdev_id;
717
}
718
719
static void ath11k_pdev_caps_update(struct ath11k *ar)
720
{
721
struct ath11k_base *ab = ar->ab;
722
723
ar->max_tx_power = ab->target_caps.hw_max_tx_power;
724
725
/* FIXME Set min_tx_power to ab->target_caps.hw_min_tx_power.
726
* But since the received value in svcrdy is same as hw_max_tx_power,
727
* we can set ar->min_tx_power to 0 currently until
728
* this is fixed in firmware
729
*/
730
ar->min_tx_power = 0;
731
732
ar->txpower_limit_2g = ar->max_tx_power;
733
ar->txpower_limit_5g = ar->max_tx_power;
734
ar->txpower_scale = WMI_HOST_TP_SCALE_MAX;
735
}
736
737
static int ath11k_mac_txpower_recalc(struct ath11k *ar)
738
{
739
struct ath11k_pdev *pdev = ar->pdev;
740
struct ath11k_vif *arvif;
741
int ret, txpower = -1;
742
u32 param;
743
744
lockdep_assert_held(&ar->conf_mutex);
745
746
list_for_each_entry(arvif, &ar->arvifs, list) {
747
if (arvif->txpower <= 0)
748
continue;
749
750
if (txpower == -1)
751
txpower = arvif->txpower;
752
else
753
txpower = min(txpower, arvif->txpower);
754
}
755
756
if (txpower == -1)
757
return 0;
758
759
/* txpwr is set as 2 units per dBm in FW*/
760
txpower = min_t(u32, max_t(u32, ar->min_tx_power, txpower),
761
ar->max_tx_power) * 2;
762
763
ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "txpower to set in hw %d\n",
764
txpower / 2);
765
766
if ((pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) &&
767
ar->txpower_limit_2g != txpower) {
768
param = WMI_PDEV_PARAM_TXPOWER_LIMIT2G;
769
ret = ath11k_wmi_pdev_set_param(ar, param,
770
txpower, ar->pdev->pdev_id);
771
if (ret)
772
goto fail;
773
ar->txpower_limit_2g = txpower;
774
}
775
776
if ((pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) &&
777
ar->txpower_limit_5g != txpower) {
778
param = WMI_PDEV_PARAM_TXPOWER_LIMIT5G;
779
ret = ath11k_wmi_pdev_set_param(ar, param,
780
txpower, ar->pdev->pdev_id);
781
if (ret)
782
goto fail;
783
ar->txpower_limit_5g = txpower;
784
}
785
786
return 0;
787
788
fail:
789
ath11k_warn(ar->ab, "failed to recalc txpower limit %d using pdev param %d: %d\n",
790
txpower / 2, param, ret);
791
return ret;
792
}
793
794
static int ath11k_recalc_rtscts_prot(struct ath11k_vif *arvif)
795
{
796
struct ath11k *ar = arvif->ar;
797
u32 vdev_param, rts_cts = 0;
798
int ret;
799
800
lockdep_assert_held(&ar->conf_mutex);
801
802
vdev_param = WMI_VDEV_PARAM_ENABLE_RTSCTS;
803
804
/* Enable RTS/CTS protection for sw retries (when legacy stations
805
* are in BSS) or by default only for second rate series.
806
* TODO: Check if we need to enable CTS 2 Self in any case
807
*/
808
rts_cts = WMI_USE_RTS_CTS;
809
810
if (arvif->num_legacy_stations > 0)
811
rts_cts |= WMI_RTSCTS_ACROSS_SW_RETRIES << 4;
812
else
813
rts_cts |= WMI_RTSCTS_FOR_SECOND_RATESERIES << 4;
814
815
/* Need not send duplicate param value to firmware */
816
if (arvif->rtscts_prot_mode == rts_cts)
817
return 0;
818
819
arvif->rtscts_prot_mode = rts_cts;
820
821
ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %d recalc rts/cts prot %d\n",
822
arvif->vdev_id, rts_cts);
823
824
ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
825
vdev_param, rts_cts);
826
if (ret)
827
ath11k_warn(ar->ab, "failed to recalculate rts/cts prot for vdev %d: %d\n",
828
arvif->vdev_id, ret);
829
830
return ret;
831
}
832
833
static int ath11k_mac_set_kickout(struct ath11k_vif *arvif)
834
{
835
struct ath11k *ar = arvif->ar;
836
u32 param;
837
int ret;
838
839
ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_STA_KICKOUT_TH,
840
ATH11K_KICKOUT_THRESHOLD,
841
ar->pdev->pdev_id);
842
if (ret) {
843
ath11k_warn(ar->ab, "failed to set kickout threshold on vdev %i: %d\n",
844
arvif->vdev_id, ret);
845
return ret;
846
}
847
848
param = WMI_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS;
849
ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param,
850
ATH11K_KEEPALIVE_MIN_IDLE);
851
if (ret) {
852
ath11k_warn(ar->ab, "failed to set keepalive minimum idle time on vdev %i: %d\n",
853
arvif->vdev_id, ret);
854
return ret;
855
}
856
857
param = WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS;
858
ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param,
859
ATH11K_KEEPALIVE_MAX_IDLE);
860
if (ret) {
861
ath11k_warn(ar->ab, "failed to set keepalive maximum idle time on vdev %i: %d\n",
862
arvif->vdev_id, ret);
863
return ret;
864
}
865
866
param = WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS;
867
ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param,
868
ATH11K_KEEPALIVE_MAX_UNRESPONSIVE);
869
if (ret) {
870
ath11k_warn(ar->ab, "failed to set keepalive maximum unresponsive time on vdev %i: %d\n",
871
arvif->vdev_id, ret);
872
return ret;
873
}
874
875
return 0;
876
}
877
878
void ath11k_mac_peer_cleanup_all(struct ath11k *ar)
879
{
880
struct ath11k_peer *peer, *tmp;
881
struct ath11k_base *ab = ar->ab;
882
883
lockdep_assert_held(&ar->conf_mutex);
884
885
mutex_lock(&ab->tbl_mtx_lock);
886
spin_lock_bh(&ab->base_lock);
887
list_for_each_entry_safe(peer, tmp, &ab->peers, list) {
888
ath11k_peer_rx_tid_cleanup(ar, peer);
889
ath11k_peer_rhash_delete(ab, peer);
890
list_del(&peer->list);
891
kfree(peer);
892
}
893
spin_unlock_bh(&ab->base_lock);
894
mutex_unlock(&ab->tbl_mtx_lock);
895
896
ar->num_peers = 0;
897
ar->num_stations = 0;
898
}
899
900
static inline int ath11k_mac_vdev_setup_sync(struct ath11k *ar)
901
{
902
lockdep_assert_held(&ar->conf_mutex);
903
904
if (test_bit(ATH11K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags))
905
return -ESHUTDOWN;
906
907
if (!wait_for_completion_timeout(&ar->vdev_setup_done,
908
ATH11K_VDEV_SETUP_TIMEOUT_HZ))
909
return -ETIMEDOUT;
910
911
return ar->last_wmi_vdev_start_status ? -EINVAL : 0;
912
}
913
914
static void
915
ath11k_mac_get_any_chandef_iter(struct ieee80211_hw *hw,
916
struct ieee80211_chanctx_conf *conf,
917
void *data)
918
{
919
struct cfg80211_chan_def **def = data;
920
921
*def = &conf->def;
922
}
923
924
static int ath11k_mac_monitor_vdev_start(struct ath11k *ar, int vdev_id,
925
struct cfg80211_chan_def *chandef)
926
{
927
struct ieee80211_channel *channel;
928
struct wmi_vdev_start_req_arg arg = {};
929
int ret;
930
931
lockdep_assert_held(&ar->conf_mutex);
932
933
channel = chandef->chan;
934
935
arg.vdev_id = vdev_id;
936
arg.channel.freq = channel->center_freq;
937
arg.channel.band_center_freq1 = chandef->center_freq1;
938
arg.channel.band_center_freq2 = chandef->center_freq2;
939
940
arg.channel.mode = ath11k_phymodes[chandef->chan->band][chandef->width];
941
arg.channel.chan_radar = !!(channel->flags & IEEE80211_CHAN_RADAR);
942
943
arg.channel.min_power = 0;
944
arg.channel.max_power = channel->max_power;
945
arg.channel.max_reg_power = channel->max_reg_power;
946
arg.channel.max_antenna_gain = channel->max_antenna_gain;
947
948
arg.pref_tx_streams = ar->num_tx_chains;
949
arg.pref_rx_streams = ar->num_rx_chains;
950
951
arg.channel.passive = !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR);
952
953
reinit_completion(&ar->vdev_setup_done);
954
reinit_completion(&ar->vdev_delete_done);
955
956
ret = ath11k_wmi_vdev_start(ar, &arg, false);
957
if (ret) {
958
ath11k_warn(ar->ab, "failed to request monitor vdev %i start: %d\n",
959
vdev_id, ret);
960
return ret;
961
}
962
963
ret = ath11k_mac_vdev_setup_sync(ar);
964
if (ret) {
965
ath11k_warn(ar->ab, "failed to synchronize setup for monitor vdev %i start: %d\n",
966
vdev_id, ret);
967
return ret;
968
}
969
970
ret = ath11k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr, NULL, 0, 0);
971
if (ret) {
972
ath11k_warn(ar->ab, "failed to put up monitor vdev %i: %d\n",
973
vdev_id, ret);
974
goto vdev_stop;
975
}
976
977
ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "monitor vdev %i started\n",
978
vdev_id);
979
980
return 0;
981
982
vdev_stop:
983
reinit_completion(&ar->vdev_setup_done);
984
985
ret = ath11k_wmi_vdev_stop(ar, vdev_id);
986
if (ret) {
987
ath11k_warn(ar->ab, "failed to stop monitor vdev %i after start failure: %d\n",
988
vdev_id, ret);
989
return ret;
990
}
991
992
ret = ath11k_mac_vdev_setup_sync(ar);
993
if (ret) {
994
ath11k_warn(ar->ab, "failed to synchronize setup for vdev %i stop: %d\n",
995
vdev_id, ret);
996
return ret;
997
}
998
999
return -EIO;
1000
}
1001
1002
static int ath11k_mac_monitor_vdev_stop(struct ath11k *ar)
1003
{
1004
int ret;
1005
1006
lockdep_assert_held(&ar->conf_mutex);
1007
1008
reinit_completion(&ar->vdev_setup_done);
1009
1010
ret = ath11k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
1011
if (ret) {
1012
ath11k_warn(ar->ab, "failed to request monitor vdev %i stop: %d\n",
1013
ar->monitor_vdev_id, ret);
1014
return ret;
1015
}
1016
1017
ret = ath11k_mac_vdev_setup_sync(ar);
1018
if (ret) {
1019
ath11k_warn(ar->ab, "failed to synchronize monitor vdev %i stop: %d\n",
1020
ar->monitor_vdev_id, ret);
1021
return ret;
1022
}
1023
1024
ret = ath11k_wmi_vdev_down(ar, ar->monitor_vdev_id);
1025
if (ret) {
1026
ath11k_warn(ar->ab, "failed to put down monitor vdev %i: %d\n",
1027
ar->monitor_vdev_id, ret);
1028
return ret;
1029
}
1030
1031
ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "monitor vdev %i stopped\n",
1032
ar->monitor_vdev_id);
1033
1034
return 0;
1035
}
1036
1037
static int ath11k_mac_monitor_vdev_create(struct ath11k *ar)
1038
{
1039
struct ath11k_pdev *pdev = ar->pdev;
1040
struct vdev_create_params param = {};
1041
int bit, ret;
1042
u8 tmp_addr[6] = {0};
1043
u16 nss;
1044
1045
lockdep_assert_held(&ar->conf_mutex);
1046
1047
if (test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags))
1048
return 0;
1049
1050
if (ar->ab->free_vdev_map == 0) {
1051
ath11k_warn(ar->ab, "failed to find free vdev id for monitor vdev\n");
1052
return -ENOMEM;
1053
}
1054
1055
bit = __ffs64(ar->ab->free_vdev_map);
1056
1057
ar->monitor_vdev_id = bit;
1058
1059
param.if_id = ar->monitor_vdev_id;
1060
param.type = WMI_VDEV_TYPE_MONITOR;
1061
param.subtype = WMI_VDEV_SUBTYPE_NONE;
1062
param.pdev_id = pdev->pdev_id;
1063
1064
if (pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) {
1065
param.chains[NL80211_BAND_2GHZ].tx = ar->num_tx_chains;
1066
param.chains[NL80211_BAND_2GHZ].rx = ar->num_rx_chains;
1067
}
1068
if (pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) {
1069
param.chains[NL80211_BAND_5GHZ].tx = ar->num_tx_chains;
1070
param.chains[NL80211_BAND_5GHZ].rx = ar->num_rx_chains;
1071
}
1072
1073
ret = ath11k_wmi_vdev_create(ar, tmp_addr, &param);
1074
if (ret) {
1075
ath11k_warn(ar->ab, "failed to request monitor vdev %i creation: %d\n",
1076
ar->monitor_vdev_id, ret);
1077
ar->monitor_vdev_id = -1;
1078
return ret;
1079
}
1080
1081
nss = get_num_chains(ar->cfg_tx_chainmask) ? : 1;
1082
ret = ath11k_wmi_vdev_set_param_cmd(ar, ar->monitor_vdev_id,
1083
WMI_VDEV_PARAM_NSS, nss);
1084
if (ret) {
1085
ath11k_warn(ar->ab, "failed to set vdev %d chainmask 0x%x, nss %d :%d\n",
1086
ar->monitor_vdev_id, ar->cfg_tx_chainmask, nss, ret);
1087
goto err_vdev_del;
1088
}
1089
1090
ret = ath11k_mac_txpower_recalc(ar);
1091
if (ret) {
1092
ath11k_warn(ar->ab, "failed to recalc txpower for monitor vdev %d: %d\n",
1093
ar->monitor_vdev_id, ret);
1094
goto err_vdev_del;
1095
}
1096
1097
ar->allocated_vdev_map |= 1LL << ar->monitor_vdev_id;
1098
ar->ab->free_vdev_map &= ~(1LL << ar->monitor_vdev_id);
1099
ar->num_created_vdevs++;
1100
set_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags);
1101
1102
ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "monitor vdev %d created\n",
1103
ar->monitor_vdev_id);
1104
1105
return 0;
1106
1107
err_vdev_del:
1108
ath11k_wmi_vdev_delete(ar, ar->monitor_vdev_id);
1109
ar->monitor_vdev_id = -1;
1110
return ret;
1111
}
1112
1113
static int ath11k_mac_monitor_vdev_delete(struct ath11k *ar)
1114
{
1115
int ret;
1116
unsigned long time_left;
1117
1118
lockdep_assert_held(&ar->conf_mutex);
1119
1120
if (!test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags))
1121
return 0;
1122
1123
reinit_completion(&ar->vdev_delete_done);
1124
1125
ret = ath11k_wmi_vdev_delete(ar, ar->monitor_vdev_id);
1126
if (ret) {
1127
ath11k_warn(ar->ab, "failed to request wmi monitor vdev %i removal: %d\n",
1128
ar->monitor_vdev_id, ret);
1129
return ret;
1130
}
1131
1132
time_left = wait_for_completion_timeout(&ar->vdev_delete_done,
1133
ATH11K_VDEV_DELETE_TIMEOUT_HZ);
1134
if (time_left == 0) {
1135
ath11k_warn(ar->ab, "Timeout in receiving vdev delete response\n");
1136
} else {
1137
ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "monitor vdev %d deleted\n",
1138
ar->monitor_vdev_id);
1139
1140
ar->allocated_vdev_map &= ~(1LL << ar->monitor_vdev_id);
1141
ar->ab->free_vdev_map |= 1LL << (ar->monitor_vdev_id);
1142
ar->num_created_vdevs--;
1143
ar->monitor_vdev_id = -1;
1144
clear_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags);
1145
}
1146
1147
return ret;
1148
}
1149
1150
static int ath11k_mac_monitor_start(struct ath11k *ar)
1151
{
1152
struct cfg80211_chan_def *chandef = NULL;
1153
int ret;
1154
1155
lockdep_assert_held(&ar->conf_mutex);
1156
1157
if (test_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags))
1158
return 0;
1159
1160
ieee80211_iter_chan_contexts_atomic(ar->hw,
1161
ath11k_mac_get_any_chandef_iter,
1162
&chandef);
1163
if (!chandef)
1164
return 0;
1165
1166
ret = ath11k_mac_monitor_vdev_start(ar, ar->monitor_vdev_id, chandef);
1167
if (ret) {
1168
ath11k_warn(ar->ab, "failed to start monitor vdev: %d\n", ret);
1169
ath11k_mac_monitor_vdev_delete(ar);
1170
return ret;
1171
}
1172
1173
set_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags);
1174
1175
ar->num_started_vdevs++;
1176
ret = ath11k_dp_tx_htt_monitor_mode_ring_config(ar, false);
1177
if (ret) {
1178
ath11k_warn(ar->ab, "failed to configure htt monitor mode ring during start: %d",
1179
ret);
1180
return ret;
1181
}
1182
1183
ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "monitor started\n");
1184
1185
return 0;
1186
}
1187
1188
static int ath11k_mac_monitor_stop(struct ath11k *ar)
1189
{
1190
int ret;
1191
1192
lockdep_assert_held(&ar->conf_mutex);
1193
1194
if (!test_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags))
1195
return 0;
1196
1197
ret = ath11k_mac_monitor_vdev_stop(ar);
1198
if (ret) {
1199
ath11k_warn(ar->ab, "failed to stop monitor vdev: %d\n", ret);
1200
return ret;
1201
}
1202
1203
clear_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags);
1204
ar->num_started_vdevs--;
1205
1206
ret = ath11k_dp_tx_htt_monitor_mode_ring_config(ar, true);
1207
if (ret) {
1208
ath11k_warn(ar->ab, "failed to configure htt monitor mode ring during stop: %d",
1209
ret);
1210
return ret;
1211
}
1212
1213
ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "monitor stopped ret %d\n", ret);
1214
1215
return 0;
1216
}
1217
1218
static int ath11k_mac_vif_setup_ps(struct ath11k_vif *arvif)
1219
{
1220
struct ath11k *ar = arvif->ar;
1221
struct ieee80211_vif *vif = arvif->vif;
1222
struct ieee80211_conf *conf = &ar->hw->conf;
1223
enum wmi_sta_powersave_param param;
1224
enum wmi_sta_ps_mode psmode;
1225
int ret;
1226
int timeout;
1227
bool enable_ps;
1228
1229
lockdep_assert_held(&arvif->ar->conf_mutex);
1230
1231
if (arvif->vif->type != NL80211_IFTYPE_STATION)
1232
return 0;
1233
1234
enable_ps = arvif->ps;
1235
1236
if (!arvif->is_started) {
1237
/* mac80211 can update vif powersave state while disconnected.
1238
* Firmware doesn't behave nicely and consumes more power than
1239
* necessary if PS is disabled on a non-started vdev. Hence
1240
* force-enable PS for non-running vdevs.
1241
*/
1242
psmode = WMI_STA_PS_MODE_ENABLED;
1243
} else if (enable_ps) {
1244
psmode = WMI_STA_PS_MODE_ENABLED;
1245
param = WMI_STA_PS_PARAM_INACTIVITY_TIME;
1246
1247
timeout = conf->dynamic_ps_timeout;
1248
if (timeout == 0) {
1249
/* firmware doesn't like 0 */
1250
timeout = ieee80211_tu_to_usec(vif->bss_conf.beacon_int) / 1000;
1251
}
1252
1253
ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param,
1254
timeout);
1255
if (ret) {
1256
ath11k_warn(ar->ab, "failed to set inactivity time for vdev %d: %i\n",
1257
arvif->vdev_id, ret);
1258
return ret;
1259
}
1260
} else {
1261
psmode = WMI_STA_PS_MODE_DISABLED;
1262
}
1263
1264
ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %d psmode %s\n",
1265
arvif->vdev_id, psmode ? "enable" : "disable");
1266
1267
ret = ath11k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id, psmode);
1268
if (ret) {
1269
ath11k_warn(ar->ab, "failed to set sta power save mode %d for vdev %d: %d\n",
1270
psmode, arvif->vdev_id, ret);
1271
return ret;
1272
}
1273
1274
return 0;
1275
}
1276
1277
static int ath11k_mac_config_ps(struct ath11k *ar)
1278
{
1279
struct ath11k_vif *arvif;
1280
int ret = 0;
1281
1282
lockdep_assert_held(&ar->conf_mutex);
1283
1284
list_for_each_entry(arvif, &ar->arvifs, list) {
1285
ret = ath11k_mac_vif_setup_ps(arvif);
1286
if (ret) {
1287
ath11k_warn(ar->ab, "failed to setup powersave: %d\n", ret);
1288
break;
1289
}
1290
}
1291
1292
return ret;
1293
}
1294
1295
static int ath11k_mac_op_config(struct ieee80211_hw *hw, u32 changed)
1296
{
1297
struct ath11k *ar = hw->priv;
1298
struct ieee80211_conf *conf = &hw->conf;
1299
int ret = 0;
1300
1301
mutex_lock(&ar->conf_mutex);
1302
1303
if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
1304
if (conf->flags & IEEE80211_CONF_MONITOR) {
1305
set_bit(ATH11K_FLAG_MONITOR_CONF_ENABLED, &ar->monitor_flags);
1306
1307
if (test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED,
1308
&ar->monitor_flags))
1309
goto out;
1310
1311
ret = ath11k_mac_monitor_vdev_create(ar);
1312
if (ret) {
1313
ath11k_warn(ar->ab, "failed to create monitor vdev: %d",
1314
ret);
1315
goto out;
1316
}
1317
1318
ret = ath11k_mac_monitor_start(ar);
1319
if (ret) {
1320
ath11k_warn(ar->ab, "failed to start monitor: %d",
1321
ret);
1322
goto err_mon_del;
1323
}
1324
} else {
1325
clear_bit(ATH11K_FLAG_MONITOR_CONF_ENABLED, &ar->monitor_flags);
1326
1327
if (!test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED,
1328
&ar->monitor_flags))
1329
goto out;
1330
1331
ret = ath11k_mac_monitor_stop(ar);
1332
if (ret) {
1333
ath11k_warn(ar->ab, "failed to stop monitor: %d",
1334
ret);
1335
goto out;
1336
}
1337
1338
ret = ath11k_mac_monitor_vdev_delete(ar);
1339
if (ret) {
1340
ath11k_warn(ar->ab, "failed to delete monitor vdev: %d",
1341
ret);
1342
goto out;
1343
}
1344
}
1345
}
1346
1347
out:
1348
mutex_unlock(&ar->conf_mutex);
1349
return ret;
1350
1351
err_mon_del:
1352
ath11k_mac_monitor_vdev_delete(ar);
1353
mutex_unlock(&ar->conf_mutex);
1354
return ret;
1355
}
1356
1357
static void ath11k_mac_setup_nontx_vif_rsnie(struct ath11k_vif *arvif,
1358
bool tx_arvif_rsnie_present,
1359
const u8 *profile, u8 profile_len)
1360
{
1361
if (cfg80211_find_ie(WLAN_EID_RSN, profile, profile_len)) {
1362
arvif->rsnie_present = true;
1363
} else if (tx_arvif_rsnie_present) {
1364
int i;
1365
u8 nie_len;
1366
const u8 *nie = cfg80211_find_ext_ie(WLAN_EID_EXT_NON_INHERITANCE,
1367
profile, profile_len);
1368
if (!nie)
1369
return;
1370
1371
nie_len = nie[1];
1372
nie += 2;
1373
for (i = 0; i < nie_len; i++) {
1374
if (nie[i] == WLAN_EID_RSN) {
1375
arvif->rsnie_present = false;
1376
break;
1377
}
1378
}
1379
}
1380
}
1381
1382
static bool ath11k_mac_set_nontx_vif_params(struct ath11k_vif *tx_arvif,
1383
struct ath11k_vif *arvif,
1384
struct sk_buff *bcn)
1385
{
1386
struct ieee80211_mgmt *mgmt;
1387
const u8 *ies, *profile, *next_profile;
1388
int ies_len;
1389
1390
ies = bcn->data + ieee80211_get_hdrlen_from_skb(bcn);
1391
mgmt = (struct ieee80211_mgmt *)bcn->data;
1392
ies += sizeof(mgmt->u.beacon);
1393
ies_len = skb_tail_pointer(bcn) - ies;
1394
1395
ies = cfg80211_find_ie(WLAN_EID_MULTIPLE_BSSID, ies, ies_len);
1396
arvif->rsnie_present = tx_arvif->rsnie_present;
1397
1398
while (ies) {
1399
u8 mbssid_len;
1400
1401
ies_len -= (2 + ies[1]);
1402
mbssid_len = ies[1] - 1;
1403
profile = &ies[3];
1404
1405
while (mbssid_len) {
1406
u8 profile_len;
1407
1408
profile_len = profile[1];
1409
next_profile = profile + (2 + profile_len);
1410
mbssid_len -= (2 + profile_len);
1411
1412
profile += 2;
1413
profile_len -= (2 + profile[1]);
1414
profile += (2 + profile[1]); /* nontx capabilities */
1415
profile_len -= (2 + profile[1]);
1416
profile += (2 + profile[1]); /* SSID */
1417
if (profile[2] == arvif->vif->bss_conf.bssid_index) {
1418
profile_len -= 5;
1419
profile = profile + 5;
1420
ath11k_mac_setup_nontx_vif_rsnie(arvif,
1421
tx_arvif->rsnie_present,
1422
profile,
1423
profile_len);
1424
return true;
1425
}
1426
profile = next_profile;
1427
}
1428
ies = cfg80211_find_ie(WLAN_EID_MULTIPLE_BSSID, profile,
1429
ies_len);
1430
}
1431
1432
return false;
1433
}
1434
1435
static void ath11k_mac_set_vif_params(struct ath11k_vif *arvif,
1436
struct sk_buff *bcn)
1437
{
1438
struct ieee80211_mgmt *mgmt;
1439
u8 *ies;
1440
1441
ies = bcn->data + ieee80211_get_hdrlen_from_skb(bcn);
1442
mgmt = (struct ieee80211_mgmt *)bcn->data;
1443
ies += sizeof(mgmt->u.beacon);
1444
1445
if (cfg80211_find_ie(WLAN_EID_RSN, ies, (skb_tail_pointer(bcn) - ies)))
1446
arvif->rsnie_present = true;
1447
else
1448
arvif->rsnie_present = false;
1449
1450
if (cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
1451
WLAN_OUI_TYPE_MICROSOFT_WPA,
1452
ies, (skb_tail_pointer(bcn) - ies)))
1453
arvif->wpaie_present = true;
1454
else
1455
arvif->wpaie_present = false;
1456
}
1457
1458
static int ath11k_mac_setup_bcn_tmpl_ema(struct ath11k_vif *arvif)
1459
{
1460
struct ath11k_vif *tx_arvif;
1461
struct ieee80211_ema_beacons *beacons;
1462
int ret = 0;
1463
bool nontx_vif_params_set = false;
1464
u32 params = 0;
1465
u8 i = 0;
1466
1467
tx_arvif = (void *)arvif->vif->mbssid_tx_vif->drv_priv;
1468
1469
beacons = ieee80211_beacon_get_template_ema_list(tx_arvif->ar->hw,
1470
tx_arvif->vif, 0);
1471
if (!beacons || !beacons->cnt) {
1472
ath11k_warn(arvif->ar->ab,
1473
"failed to get ema beacon templates from mac80211\n");
1474
return -EPERM;
1475
}
1476
1477
if (tx_arvif == arvif)
1478
ath11k_mac_set_vif_params(tx_arvif, beacons->bcn[0].skb);
1479
else
1480
arvif->wpaie_present = tx_arvif->wpaie_present;
1481
1482
for (i = 0; i < beacons->cnt; i++) {
1483
if (tx_arvif != arvif && !nontx_vif_params_set)
1484
nontx_vif_params_set =
1485
ath11k_mac_set_nontx_vif_params(tx_arvif, arvif,
1486
beacons->bcn[i].skb);
1487
1488
params = beacons->cnt;
1489
params |= (i << WMI_EMA_TMPL_IDX_SHIFT);
1490
params |= ((!i ? 1 : 0) << WMI_EMA_FIRST_TMPL_SHIFT);
1491
params |= ((i + 1 == beacons->cnt ? 1 : 0) << WMI_EMA_LAST_TMPL_SHIFT);
1492
1493
ret = ath11k_wmi_bcn_tmpl(tx_arvif->ar, tx_arvif->vdev_id,
1494
&beacons->bcn[i].offs,
1495
beacons->bcn[i].skb, params);
1496
if (ret) {
1497
ath11k_warn(tx_arvif->ar->ab,
1498
"failed to set ema beacon template id %i error %d\n",
1499
i, ret);
1500
break;
1501
}
1502
}
1503
1504
ieee80211_beacon_free_ema_list(beacons);
1505
1506
if (tx_arvif != arvif && !nontx_vif_params_set)
1507
return -EINVAL; /* Profile not found in the beacons */
1508
1509
return ret;
1510
}
1511
1512
static int ath11k_mac_setup_bcn_tmpl_mbssid(struct ath11k_vif *arvif)
1513
{
1514
struct ath11k *ar = arvif->ar;
1515
struct ath11k_base *ab = ar->ab;
1516
struct ath11k_vif *tx_arvif = arvif;
1517
struct ieee80211_hw *hw = ar->hw;
1518
struct ieee80211_vif *vif = arvif->vif;
1519
struct ieee80211_mutable_offsets offs = {};
1520
struct sk_buff *bcn;
1521
int ret;
1522
1523
if (arvif->vif->mbssid_tx_vif) {
1524
tx_arvif = (void *)arvif->vif->mbssid_tx_vif->drv_priv;
1525
if (tx_arvif != arvif) {
1526
ar = tx_arvif->ar;
1527
ab = ar->ab;
1528
hw = ar->hw;
1529
vif = tx_arvif->vif;
1530
}
1531
}
1532
1533
bcn = ieee80211_beacon_get_template(hw, vif, &offs, 0);
1534
if (!bcn) {
1535
ath11k_warn(ab, "failed to get beacon template from mac80211\n");
1536
return -EPERM;
1537
}
1538
1539
if (tx_arvif == arvif)
1540
ath11k_mac_set_vif_params(tx_arvif, bcn);
1541
else if (!ath11k_mac_set_nontx_vif_params(tx_arvif, arvif, bcn))
1542
return -EINVAL;
1543
1544
ret = ath11k_wmi_bcn_tmpl(ar, arvif->vdev_id, &offs, bcn, 0);
1545
kfree_skb(bcn);
1546
1547
if (ret)
1548
ath11k_warn(ab, "failed to submit beacon template command: %d\n",
1549
ret);
1550
1551
return ret;
1552
}
1553
1554
static int ath11k_mac_setup_bcn_tmpl(struct ath11k_vif *arvif)
1555
{
1556
struct ieee80211_vif *vif = arvif->vif;
1557
1558
if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
1559
return 0;
1560
1561
/* Target does not expect beacon templates for the already up
1562
* non-transmitting interfaces, and results in a crash if sent.
1563
*/
1564
if (vif->mbssid_tx_vif &&
1565
arvif != (void *)vif->mbssid_tx_vif->drv_priv && arvif->is_up)
1566
return 0;
1567
1568
if (vif->bss_conf.ema_ap && vif->mbssid_tx_vif)
1569
return ath11k_mac_setup_bcn_tmpl_ema(arvif);
1570
1571
return ath11k_mac_setup_bcn_tmpl_mbssid(arvif);
1572
}
1573
1574
void ath11k_mac_bcn_tx_event(struct ath11k_vif *arvif)
1575
{
1576
struct ieee80211_vif *vif = arvif->vif;
1577
1578
if (!vif->bss_conf.color_change_active && !arvif->bcca_zero_sent)
1579
return;
1580
1581
if (vif->bss_conf.color_change_active &&
1582
ieee80211_beacon_cntdwn_is_complete(vif)) {
1583
arvif->bcca_zero_sent = true;
1584
ieee80211_color_change_finish(vif);
1585
return;
1586
}
1587
1588
arvif->bcca_zero_sent = false;
1589
1590
if (vif->bss_conf.color_change_active)
1591
ieee80211_beacon_update_cntdwn(vif);
1592
ath11k_mac_setup_bcn_tmpl(arvif);
1593
}
1594
1595
static void ath11k_control_beaconing(struct ath11k_vif *arvif,
1596
struct ieee80211_bss_conf *info)
1597
{
1598
struct ath11k *ar = arvif->ar;
1599
struct ath11k_vif *tx_arvif = NULL;
1600
int ret = 0;
1601
1602
lockdep_assert_held(&arvif->ar->conf_mutex);
1603
1604
if (!info->enable_beacon) {
1605
ret = ath11k_wmi_vdev_down(ar, arvif->vdev_id);
1606
if (ret)
1607
ath11k_warn(ar->ab, "failed to down vdev_id %i: %d\n",
1608
arvif->vdev_id, ret);
1609
1610
arvif->is_up = false;
1611
return;
1612
}
1613
1614
/* Install the beacon template to the FW */
1615
ret = ath11k_mac_setup_bcn_tmpl(arvif);
1616
if (ret) {
1617
ath11k_warn(ar->ab, "failed to update bcn tmpl during vdev up: %d\n",
1618
ret);
1619
return;
1620
}
1621
1622
arvif->tx_seq_no = 0x1000;
1623
1624
arvif->aid = 0;
1625
1626
ether_addr_copy(arvif->bssid, info->bssid);
1627
1628
if (arvif->vif->mbssid_tx_vif)
1629
tx_arvif = (struct ath11k_vif *)arvif->vif->mbssid_tx_vif->drv_priv;
1630
1631
ret = ath11k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
1632
arvif->bssid,
1633
tx_arvif ? tx_arvif->bssid : NULL,
1634
info->bssid_index,
1635
1 << info->bssid_indicator);
1636
if (ret) {
1637
ath11k_warn(ar->ab, "failed to bring up vdev %d: %i\n",
1638
arvif->vdev_id, ret);
1639
return;
1640
}
1641
1642
arvif->is_up = true;
1643
1644
ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %d up\n", arvif->vdev_id);
1645
}
1646
1647
static void ath11k_mac_handle_beacon_iter(void *data, u8 *mac,
1648
struct ieee80211_vif *vif)
1649
{
1650
struct sk_buff *skb = data;
1651
struct ieee80211_mgmt *mgmt = (void *)skb->data;
1652
struct ath11k_vif *arvif = (void *)vif->drv_priv;
1653
1654
if (vif->type != NL80211_IFTYPE_STATION)
1655
return;
1656
1657
if (!ether_addr_equal(mgmt->bssid, vif->bss_conf.bssid))
1658
return;
1659
1660
cancel_delayed_work(&arvif->connection_loss_work);
1661
}
1662
1663
void ath11k_mac_handle_beacon(struct ath11k *ar, struct sk_buff *skb)
1664
{
1665
ieee80211_iterate_active_interfaces_atomic(ar->hw,
1666
IEEE80211_IFACE_ITER_NORMAL,
1667
ath11k_mac_handle_beacon_iter,
1668
skb);
1669
}
1670
1671
static void ath11k_mac_handle_beacon_miss_iter(void *data, u8 *mac,
1672
struct ieee80211_vif *vif)
1673
{
1674
u32 *vdev_id = data;
1675
struct ath11k_vif *arvif = (void *)vif->drv_priv;
1676
struct ath11k *ar = arvif->ar;
1677
struct ieee80211_hw *hw = ar->hw;
1678
1679
if (arvif->vdev_id != *vdev_id)
1680
return;
1681
1682
if (!arvif->is_up)
1683
return;
1684
1685
ieee80211_beacon_loss(vif);
1686
1687
/* Firmware doesn't report beacon loss events repeatedly. If AP probe
1688
* (done by mac80211) succeeds but beacons do not resume then it
1689
* doesn't make sense to continue operation. Queue connection loss work
1690
* which can be cancelled when beacon is received.
1691
*/
1692
ieee80211_queue_delayed_work(hw, &arvif->connection_loss_work,
1693
ATH11K_CONNECTION_LOSS_HZ);
1694
}
1695
1696
void ath11k_mac_handle_beacon_miss(struct ath11k *ar, u32 vdev_id)
1697
{
1698
ieee80211_iterate_active_interfaces_atomic(ar->hw,
1699
IEEE80211_IFACE_ITER_NORMAL,
1700
ath11k_mac_handle_beacon_miss_iter,
1701
&vdev_id);
1702
}
1703
1704
static void ath11k_mac_vif_sta_connection_loss_work(struct work_struct *work)
1705
{
1706
struct ath11k_vif *arvif = container_of(work, struct ath11k_vif,
1707
connection_loss_work.work);
1708
struct ieee80211_vif *vif = arvif->vif;
1709
1710
if (!arvif->is_up)
1711
return;
1712
1713
ieee80211_connection_loss(vif);
1714
}
1715
1716
static void ath11k_peer_assoc_h_basic(struct ath11k *ar,
1717
struct ieee80211_vif *vif,
1718
struct ieee80211_sta *sta,
1719
struct peer_assoc_params *arg)
1720
{
1721
struct ath11k_vif *arvif = (void *)vif->drv_priv;
1722
u32 aid;
1723
1724
lockdep_assert_held(&ar->conf_mutex);
1725
1726
if (vif->type == NL80211_IFTYPE_STATION)
1727
aid = vif->cfg.aid;
1728
else
1729
aid = sta->aid;
1730
1731
ether_addr_copy(arg->peer_mac, sta->addr);
1732
arg->vdev_id = arvif->vdev_id;
1733
arg->peer_associd = aid;
1734
arg->auth_flag = true;
1735
/* TODO: STA WAR in ath10k for listen interval required? */
1736
arg->peer_listen_intval = ar->hw->conf.listen_interval;
1737
arg->peer_nss = 1;
1738
arg->peer_caps = vif->bss_conf.assoc_capability;
1739
}
1740
1741
static void ath11k_peer_assoc_h_crypto(struct ath11k *ar,
1742
struct ieee80211_vif *vif,
1743
struct ieee80211_sta *sta,
1744
struct peer_assoc_params *arg)
1745
{
1746
struct ieee80211_bss_conf *info = &vif->bss_conf;
1747
struct cfg80211_chan_def def;
1748
struct cfg80211_bss *bss;
1749
struct ath11k_vif *arvif = (struct ath11k_vif *)vif->drv_priv;
1750
const u8 *rsnie = NULL;
1751
const u8 *wpaie = NULL;
1752
1753
lockdep_assert_held(&ar->conf_mutex);
1754
1755
if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
1756
return;
1757
1758
bss = cfg80211_get_bss(ar->hw->wiphy, def.chan, info->bssid, NULL, 0,
1759
IEEE80211_BSS_TYPE_ANY, IEEE80211_PRIVACY_ANY);
1760
1761
if (arvif->rsnie_present || arvif->wpaie_present) {
1762
arg->need_ptk_4_way = true;
1763
if (arvif->wpaie_present)
1764
arg->need_gtk_2_way = true;
1765
} else if (bss) {
1766
const struct cfg80211_bss_ies *ies;
1767
1768
rcu_read_lock();
1769
rsnie = ieee80211_bss_get_ie(bss, WLAN_EID_RSN);
1770
1771
ies = rcu_dereference(bss->ies);
1772
1773
wpaie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
1774
WLAN_OUI_TYPE_MICROSOFT_WPA,
1775
ies->data,
1776
ies->len);
1777
rcu_read_unlock();
1778
cfg80211_put_bss(ar->hw->wiphy, bss);
1779
}
1780
1781
/* FIXME: base on RSN IE/WPA IE is a correct idea? */
1782
if (rsnie || wpaie) {
1783
ath11k_dbg(ar->ab, ATH11K_DBG_WMI,
1784
"%s: rsn ie found\n", __func__);
1785
arg->need_ptk_4_way = true;
1786
}
1787
1788
if (wpaie) {
1789
ath11k_dbg(ar->ab, ATH11K_DBG_WMI,
1790
"%s: wpa ie found\n", __func__);
1791
arg->need_gtk_2_way = true;
1792
}
1793
1794
if (sta->mfp) {
1795
/* TODO: Need to check if FW supports PMF? */
1796
arg->is_pmf_enabled = true;
1797
}
1798
1799
/* TODO: safe_mode_enabled (bypass 4-way handshake) flag req? */
1800
}
1801
1802
static void ath11k_peer_assoc_h_rates(struct ath11k *ar,
1803
struct ieee80211_vif *vif,
1804
struct ieee80211_sta *sta,
1805
struct peer_assoc_params *arg)
1806
{
1807
struct ath11k_vif *arvif = (void *)vif->drv_priv;
1808
struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates;
1809
struct cfg80211_chan_def def;
1810
const struct ieee80211_supported_band *sband;
1811
const struct ieee80211_rate *rates;
1812
enum nl80211_band band;
1813
u32 ratemask;
1814
u8 rate;
1815
int i;
1816
1817
lockdep_assert_held(&ar->conf_mutex);
1818
1819
if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
1820
return;
1821
1822
band = def.chan->band;
1823
sband = ar->hw->wiphy->bands[band];
1824
ratemask = sta->deflink.supp_rates[band];
1825
ratemask &= arvif->bitrate_mask.control[band].legacy;
1826
rates = sband->bitrates;
1827
1828
rateset->num_rates = 0;
1829
1830
for (i = 0; i < 32; i++, ratemask >>= 1, rates++) {
1831
if (!(ratemask & 1))
1832
continue;
1833
1834
rate = ath11k_mac_bitrate_to_rate(rates->bitrate);
1835
rateset->rates[rateset->num_rates] = rate;
1836
rateset->num_rates++;
1837
}
1838
}
1839
1840
static bool
1841
ath11k_peer_assoc_h_ht_masked(const u8 *ht_mcs_mask)
1842
{
1843
int nss;
1844
1845
for (nss = 0; nss < IEEE80211_HT_MCS_MASK_LEN; nss++)
1846
if (ht_mcs_mask[nss])
1847
return false;
1848
1849
return true;
1850
}
1851
1852
static bool
1853
ath11k_peer_assoc_h_vht_masked(const u16 *vht_mcs_mask)
1854
{
1855
int nss;
1856
1857
for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++)
1858
if (vht_mcs_mask[nss])
1859
return false;
1860
1861
return true;
1862
}
1863
1864
static void ath11k_peer_assoc_h_ht(struct ath11k *ar,
1865
struct ieee80211_vif *vif,
1866
struct ieee80211_sta *sta,
1867
struct peer_assoc_params *arg)
1868
{
1869
const struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
1870
struct ath11k_vif *arvif = (void *)vif->drv_priv;
1871
struct cfg80211_chan_def def;
1872
enum nl80211_band band;
1873
const u8 *ht_mcs_mask;
1874
int i, n;
1875
u8 max_nss;
1876
u32 stbc;
1877
1878
lockdep_assert_held(&ar->conf_mutex);
1879
1880
if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
1881
return;
1882
1883
if (!ht_cap->ht_supported)
1884
return;
1885
1886
band = def.chan->band;
1887
ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
1888
1889
if (ath11k_peer_assoc_h_ht_masked(ht_mcs_mask))
1890
return;
1891
1892
arg->ht_flag = true;
1893
1894
arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
1895
ht_cap->ampdu_factor)) - 1;
1896
1897
arg->peer_mpdu_density =
1898
ath11k_parse_mpdudensity(ht_cap->ampdu_density);
1899
1900
arg->peer_ht_caps = ht_cap->cap;
1901
arg->peer_rate_caps |= WMI_HOST_RC_HT_FLAG;
1902
1903
if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING)
1904
arg->ldpc_flag = true;
1905
1906
if (sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40) {
1907
arg->bw_40 = true;
1908
arg->peer_rate_caps |= WMI_HOST_RC_CW40_FLAG;
1909
}
1910
1911
/* As firmware handles this two flags (IEEE80211_HT_CAP_SGI_20
1912
* and IEEE80211_HT_CAP_SGI_40) for enabling SGI, we reset
1913
* both flags if guard interval is Default GI
1914
*/
1915
if (arvif->bitrate_mask.control[band].gi == NL80211_TXRATE_DEFAULT_GI)
1916
arg->peer_ht_caps &= ~(IEEE80211_HT_CAP_SGI_20 |
1917
IEEE80211_HT_CAP_SGI_40);
1918
1919
if (arvif->bitrate_mask.control[band].gi != NL80211_TXRATE_FORCE_LGI) {
1920
if (ht_cap->cap & (IEEE80211_HT_CAP_SGI_20 |
1921
IEEE80211_HT_CAP_SGI_40))
1922
arg->peer_rate_caps |= WMI_HOST_RC_SGI_FLAG;
1923
}
1924
1925
if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) {
1926
arg->peer_rate_caps |= WMI_HOST_RC_TX_STBC_FLAG;
1927
arg->stbc_flag = true;
1928
}
1929
1930
if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) {
1931
stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC;
1932
stbc = stbc >> IEEE80211_HT_CAP_RX_STBC_SHIFT;
1933
stbc = stbc << WMI_HOST_RC_RX_STBC_FLAG_S;
1934
arg->peer_rate_caps |= stbc;
1935
arg->stbc_flag = true;
1936
}
1937
1938
if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2])
1939
arg->peer_rate_caps |= WMI_HOST_RC_TS_FLAG;
1940
else if (ht_cap->mcs.rx_mask[1])
1941
arg->peer_rate_caps |= WMI_HOST_RC_DS_FLAG;
1942
1943
for (i = 0, n = 0, max_nss = 0; i < IEEE80211_HT_MCS_MASK_LEN * 8; i++)
1944
if ((ht_cap->mcs.rx_mask[i / 8] & BIT(i % 8)) &&
1945
(ht_mcs_mask[i / 8] & BIT(i % 8))) {
1946
max_nss = (i / 8) + 1;
1947
arg->peer_ht_rates.rates[n++] = i;
1948
}
1949
1950
/* This is a workaround for HT-enabled STAs which break the spec
1951
* and have no HT capabilities RX mask (no HT RX MCS map).
1952
*
1953
* As per spec, in section 20.3.5 Modulation and coding scheme (MCS),
1954
* MCS 0 through 7 are mandatory in 20MHz with 800 ns GI at all STAs.
1955
*
1956
* Firmware asserts if such situation occurs.
1957
*/
1958
if (n == 0) {
1959
arg->peer_ht_rates.num_rates = 8;
1960
for (i = 0; i < arg->peer_ht_rates.num_rates; i++)
1961
arg->peer_ht_rates.rates[i] = i;
1962
} else {
1963
arg->peer_ht_rates.num_rates = n;
1964
arg->peer_nss = min(sta->deflink.rx_nss, max_nss);
1965
}
1966
1967
ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "ht peer %pM mcs cnt %d nss %d\n",
1968
arg->peer_mac,
1969
arg->peer_ht_rates.num_rates,
1970
arg->peer_nss);
1971
}
1972
1973
static int ath11k_mac_get_max_vht_mcs_map(u16 mcs_map, int nss)
1974
{
1975
switch ((mcs_map >> (2 * nss)) & 0x3) {
1976
case IEEE80211_VHT_MCS_SUPPORT_0_7: return BIT(8) - 1;
1977
case IEEE80211_VHT_MCS_SUPPORT_0_8: return BIT(9) - 1;
1978
case IEEE80211_VHT_MCS_SUPPORT_0_9: return BIT(10) - 1;
1979
}
1980
return 0;
1981
}
1982
1983
static u16
1984
ath11k_peer_assoc_h_vht_limit(u16 tx_mcs_set,
1985
const u16 vht_mcs_limit[NL80211_VHT_NSS_MAX])
1986
{
1987
int idx_limit;
1988
int nss;
1989
u16 mcs_map;
1990
u16 mcs;
1991
1992
for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) {
1993
mcs_map = ath11k_mac_get_max_vht_mcs_map(tx_mcs_set, nss) &
1994
vht_mcs_limit[nss];
1995
1996
if (mcs_map)
1997
idx_limit = fls(mcs_map) - 1;
1998
else
1999
idx_limit = -1;
2000
2001
switch (idx_limit) {
2002
case 0:
2003
case 1:
2004
case 2:
2005
case 3:
2006
case 4:
2007
case 5:
2008
case 6:
2009
case 7:
2010
mcs = IEEE80211_VHT_MCS_SUPPORT_0_7;
2011
break;
2012
case 8:
2013
mcs = IEEE80211_VHT_MCS_SUPPORT_0_8;
2014
break;
2015
case 9:
2016
mcs = IEEE80211_VHT_MCS_SUPPORT_0_9;
2017
break;
2018
default:
2019
WARN_ON(1);
2020
fallthrough;
2021
case -1:
2022
mcs = IEEE80211_VHT_MCS_NOT_SUPPORTED;
2023
break;
2024
}
2025
2026
tx_mcs_set &= ~(0x3 << (nss * 2));
2027
tx_mcs_set |= mcs << (nss * 2);
2028
}
2029
2030
return tx_mcs_set;
2031
}
2032
2033
static u8 ath11k_get_nss_160mhz(struct ath11k *ar,
2034
u8 max_nss)
2035
{
2036
u8 nss_ratio_info = ar->pdev->cap.nss_ratio_info;
2037
u8 max_sup_nss = 0;
2038
2039
switch (nss_ratio_info) {
2040
case WMI_NSS_RATIO_1BY2_NSS:
2041
max_sup_nss = max_nss >> 1;
2042
break;
2043
case WMI_NSS_RATIO_3BY4_NSS:
2044
ath11k_warn(ar->ab, "WMI_NSS_RATIO_3BY4_NSS not supported\n");
2045
break;
2046
case WMI_NSS_RATIO_1_NSS:
2047
max_sup_nss = max_nss;
2048
break;
2049
case WMI_NSS_RATIO_2_NSS:
2050
ath11k_warn(ar->ab, "WMI_NSS_RATIO_2_NSS not supported\n");
2051
break;
2052
default:
2053
ath11k_warn(ar->ab, "invalid nss ratio received from firmware: %d\n",
2054
nss_ratio_info);
2055
break;
2056
}
2057
2058
return max_sup_nss;
2059
}
2060
2061
static void ath11k_peer_assoc_h_vht(struct ath11k *ar,
2062
struct ieee80211_vif *vif,
2063
struct ieee80211_sta *sta,
2064
struct peer_assoc_params *arg)
2065
{
2066
const struct ieee80211_sta_vht_cap *vht_cap = &sta->deflink.vht_cap;
2067
struct ath11k_vif *arvif = (void *)vif->drv_priv;
2068
struct cfg80211_chan_def def;
2069
enum nl80211_band band;
2070
u16 *vht_mcs_mask;
2071
u8 ampdu_factor;
2072
u8 max_nss, vht_mcs;
2073
int i, vht_nss, nss_idx;
2074
bool user_rate_valid = true;
2075
u32 rx_nss, tx_nss, nss_160;
2076
2077
if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
2078
return;
2079
2080
if (!vht_cap->vht_supported)
2081
return;
2082
2083
band = def.chan->band;
2084
vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2085
2086
if (ath11k_peer_assoc_h_vht_masked(vht_mcs_mask))
2087
return;
2088
2089
arg->vht_flag = true;
2090
2091
/* TODO: similar flags required? */
2092
arg->vht_capable = true;
2093
2094
if (def.chan->band == NL80211_BAND_2GHZ)
2095
arg->vht_ng_flag = true;
2096
2097
arg->peer_vht_caps = vht_cap->cap;
2098
2099
ampdu_factor = (vht_cap->cap &
2100
IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >>
2101
IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
2102
2103
/* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to
2104
* zero in VHT IE. Using it would result in degraded throughput.
2105
* arg->peer_max_mpdu at this point contains HT max_mpdu so keep
2106
* it if VHT max_mpdu is smaller.
2107
*/
2108
arg->peer_max_mpdu = max(arg->peer_max_mpdu,
2109
(1U << (IEEE80211_HT_MAX_AMPDU_FACTOR +
2110
ampdu_factor)) - 1);
2111
2112
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
2113
arg->bw_80 = true;
2114
2115
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160)
2116
arg->bw_160 = true;
2117
2118
vht_nss = ath11k_mac_max_vht_nss(vht_mcs_mask);
2119
2120
if (vht_nss > sta->deflink.rx_nss) {
2121
user_rate_valid = false;
2122
for (nss_idx = sta->deflink.rx_nss - 1; nss_idx >= 0; nss_idx--) {
2123
if (vht_mcs_mask[nss_idx]) {
2124
user_rate_valid = true;
2125
break;
2126
}
2127
}
2128
}
2129
2130
if (!user_rate_valid) {
2131
ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "setting vht range mcs value to peer supported nss %d for peer %pM\n",
2132
sta->deflink.rx_nss, sta->addr);
2133
vht_mcs_mask[sta->deflink.rx_nss - 1] = vht_mcs_mask[vht_nss - 1];
2134
}
2135
2136
/* Calculate peer NSS capability from VHT capabilities if STA
2137
* supports VHT.
2138
*/
2139
for (i = 0, max_nss = 0; i < NL80211_VHT_NSS_MAX; i++) {
2140
vht_mcs = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map) >>
2141
(2 * i) & 3;
2142
2143
if (vht_mcs != IEEE80211_VHT_MCS_NOT_SUPPORTED &&
2144
vht_mcs_mask[i])
2145
max_nss = i + 1;
2146
}
2147
arg->peer_nss = min(sta->deflink.rx_nss, max_nss);
2148
arg->rx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.rx_highest);
2149
arg->rx_mcs_set = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map);
2150
arg->tx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.tx_highest);
2151
arg->tx_mcs_set = ath11k_peer_assoc_h_vht_limit(
2152
__le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map), vht_mcs_mask);
2153
2154
/* In IPQ8074 platform, VHT mcs rate 10 and 11 is enabled by default.
2155
* VHT mcs rate 10 and 11 is not suppoerted in 11ac standard.
2156
* so explicitly disable the VHT MCS rate 10 and 11 in 11ac mode.
2157
*/
2158
arg->tx_mcs_set &= ~IEEE80211_VHT_MCS_SUPPORT_0_11_MASK;
2159
arg->tx_mcs_set |= IEEE80211_DISABLE_VHT_MCS_SUPPORT_0_11;
2160
2161
if ((arg->tx_mcs_set & IEEE80211_VHT_MCS_NOT_SUPPORTED) ==
2162
IEEE80211_VHT_MCS_NOT_SUPPORTED)
2163
arg->peer_vht_caps &= ~IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE;
2164
2165
/* TODO: Check */
2166
arg->tx_max_mcs_nss = 0xFF;
2167
2168
if (arg->peer_phymode == MODE_11AC_VHT160 ||
2169
arg->peer_phymode == MODE_11AC_VHT80_80) {
2170
tx_nss = ath11k_get_nss_160mhz(ar, max_nss);
2171
rx_nss = min(arg->peer_nss, tx_nss);
2172
arg->peer_bw_rxnss_override = ATH11K_BW_NSS_MAP_ENABLE;
2173
2174
if (!rx_nss) {
2175
ath11k_warn(ar->ab, "invalid max_nss\n");
2176
return;
2177
}
2178
2179
if (arg->peer_phymode == MODE_11AC_VHT160)
2180
nss_160 = FIELD_PREP(ATH11K_PEER_RX_NSS_160MHZ, rx_nss - 1);
2181
else
2182
nss_160 = FIELD_PREP(ATH11K_PEER_RX_NSS_80_80MHZ, rx_nss - 1);
2183
2184
arg->peer_bw_rxnss_override |= nss_160;
2185
}
2186
2187
ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
2188
"vht peer %pM max_mpdu %d flags 0x%x nss_override 0x%x\n",
2189
sta->addr, arg->peer_max_mpdu, arg->peer_flags,
2190
arg->peer_bw_rxnss_override);
2191
}
2192
2193
static int ath11k_mac_get_max_he_mcs_map(u16 mcs_map, int nss)
2194
{
2195
switch ((mcs_map >> (2 * nss)) & 0x3) {
2196
case IEEE80211_HE_MCS_SUPPORT_0_7: return BIT(8) - 1;
2197
case IEEE80211_HE_MCS_SUPPORT_0_9: return BIT(10) - 1;
2198
case IEEE80211_HE_MCS_SUPPORT_0_11: return BIT(12) - 1;
2199
}
2200
return 0;
2201
}
2202
2203
static u16 ath11k_peer_assoc_h_he_limit(u16 tx_mcs_set,
2204
const u16 he_mcs_limit[NL80211_HE_NSS_MAX])
2205
{
2206
int idx_limit;
2207
int nss;
2208
u16 mcs_map;
2209
u16 mcs;
2210
2211
for (nss = 0; nss < NL80211_HE_NSS_MAX; nss++) {
2212
mcs_map = ath11k_mac_get_max_he_mcs_map(tx_mcs_set, nss) &
2213
he_mcs_limit[nss];
2214
2215
if (mcs_map)
2216
idx_limit = fls(mcs_map) - 1;
2217
else
2218
idx_limit = -1;
2219
2220
switch (idx_limit) {
2221
case 0 ... 7:
2222
mcs = IEEE80211_HE_MCS_SUPPORT_0_7;
2223
break;
2224
case 8:
2225
case 9:
2226
mcs = IEEE80211_HE_MCS_SUPPORT_0_9;
2227
break;
2228
case 10:
2229
case 11:
2230
mcs = IEEE80211_HE_MCS_SUPPORT_0_11;
2231
break;
2232
default:
2233
WARN_ON(1);
2234
fallthrough;
2235
case -1:
2236
mcs = IEEE80211_HE_MCS_NOT_SUPPORTED;
2237
break;
2238
}
2239
2240
tx_mcs_set &= ~(0x3 << (nss * 2));
2241
tx_mcs_set |= mcs << (nss * 2);
2242
}
2243
2244
return tx_mcs_set;
2245
}
2246
2247
static bool
2248
ath11k_peer_assoc_h_he_masked(const u16 *he_mcs_mask)
2249
{
2250
int nss;
2251
2252
for (nss = 0; nss < NL80211_HE_NSS_MAX; nss++)
2253
if (he_mcs_mask[nss])
2254
return false;
2255
2256
return true;
2257
}
2258
2259
static void ath11k_peer_assoc_h_he(struct ath11k *ar,
2260
struct ieee80211_vif *vif,
2261
struct ieee80211_sta *sta,
2262
struct peer_assoc_params *arg)
2263
{
2264
struct ath11k_vif *arvif = (void *)vif->drv_priv;
2265
struct cfg80211_chan_def def;
2266
const struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap;
2267
enum nl80211_band band;
2268
u16 he_mcs_mask[NL80211_HE_NSS_MAX];
2269
u8 max_nss, he_mcs;
2270
u16 he_tx_mcs = 0, v = 0;
2271
int i, he_nss, nss_idx;
2272
bool user_rate_valid = true;
2273
u32 rx_nss, tx_nss, nss_160;
2274
u8 ampdu_factor, rx_mcs_80, rx_mcs_160;
2275
u16 mcs_160_map, mcs_80_map;
2276
bool support_160;
2277
2278
if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
2279
return;
2280
2281
if (!he_cap->has_he)
2282
return;
2283
2284
band = def.chan->band;
2285
memcpy(he_mcs_mask, arvif->bitrate_mask.control[band].he_mcs,
2286
sizeof(he_mcs_mask));
2287
2288
if (ath11k_peer_assoc_h_he_masked(he_mcs_mask))
2289
return;
2290
2291
arg->he_flag = true;
2292
support_160 = !!(he_cap->he_cap_elem.phy_cap_info[0] &
2293
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G);
2294
2295
/* Supported HE-MCS and NSS Set of peer he_cap is intersection with self he_cp */
2296
mcs_160_map = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160);
2297
mcs_80_map = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80);
2298
2299
if (support_160) {
2300
for (i = 7; i >= 0; i--) {
2301
u8 mcs_160 = (mcs_160_map >> (2 * i)) & 3;
2302
2303
if (mcs_160 != IEEE80211_VHT_MCS_NOT_SUPPORTED) {
2304
rx_mcs_160 = i + 1;
2305
break;
2306
}
2307
}
2308
}
2309
2310
for (i = 7; i >= 0; i--) {
2311
u8 mcs_80 = (mcs_80_map >> (2 * i)) & 3;
2312
2313
if (mcs_80 != IEEE80211_VHT_MCS_NOT_SUPPORTED) {
2314
rx_mcs_80 = i + 1;
2315
break;
2316
}
2317
}
2318
2319
if (support_160)
2320
max_nss = min(rx_mcs_80, rx_mcs_160);
2321
else
2322
max_nss = rx_mcs_80;
2323
2324
arg->peer_nss = min(sta->deflink.rx_nss, max_nss);
2325
2326
memcpy_and_pad(&arg->peer_he_cap_macinfo,
2327
sizeof(arg->peer_he_cap_macinfo),
2328
he_cap->he_cap_elem.mac_cap_info,
2329
sizeof(he_cap->he_cap_elem.mac_cap_info),
2330
0);
2331
memcpy_and_pad(&arg->peer_he_cap_phyinfo,
2332
sizeof(arg->peer_he_cap_phyinfo),
2333
he_cap->he_cap_elem.phy_cap_info,
2334
sizeof(he_cap->he_cap_elem.phy_cap_info),
2335
0);
2336
arg->peer_he_ops = vif->bss_conf.he_oper.params;
2337
2338
/* the top most byte is used to indicate BSS color info */
2339
arg->peer_he_ops &= 0xffffff;
2340
2341
/* As per section 26.6.1 11ax Draft5.0, if the Max AMPDU Exponent Extension
2342
* in HE cap is zero, use the arg->peer_max_mpdu as calculated while parsing
2343
* VHT caps(if VHT caps is present) or HT caps (if VHT caps is not present).
2344
*
2345
* For non-zero value of Max AMPDU Extponent Extension in HE MAC caps,
2346
* if a HE STA sends VHT cap and HE cap IE in assoc request then, use
2347
* MAX_AMPDU_LEN_FACTOR as 20 to calculate max_ampdu length.
2348
* If a HE STA that does not send VHT cap, but HE and HT cap in assoc
2349
* request, then use MAX_AMPDU_LEN_FACTOR as 16 to calculate max_ampdu
2350
* length.
2351
*/
2352
ampdu_factor = u8_get_bits(he_cap->he_cap_elem.mac_cap_info[3],
2353
IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK);
2354
2355
if (ampdu_factor) {
2356
if (sta->deflink.vht_cap.vht_supported)
2357
arg->peer_max_mpdu = (1 << (IEEE80211_HE_VHT_MAX_AMPDU_FACTOR +
2358
ampdu_factor)) - 1;
2359
else if (sta->deflink.ht_cap.ht_supported)
2360
arg->peer_max_mpdu = (1 << (IEEE80211_HE_HT_MAX_AMPDU_FACTOR +
2361
ampdu_factor)) - 1;
2362
}
2363
2364
if (he_cap->he_cap_elem.phy_cap_info[6] &
2365
IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT) {
2366
int bit = 7;
2367
int nss, ru;
2368
2369
arg->peer_ppet.numss_m1 = he_cap->ppe_thres[0] &
2370
IEEE80211_PPE_THRES_NSS_MASK;
2371
arg->peer_ppet.ru_bit_mask =
2372
(he_cap->ppe_thres[0] &
2373
IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK) >>
2374
IEEE80211_PPE_THRES_RU_INDEX_BITMASK_POS;
2375
2376
for (nss = 0; nss <= arg->peer_ppet.numss_m1; nss++) {
2377
for (ru = 0; ru < 4; ru++) {
2378
u32 val = 0;
2379
int i;
2380
2381
if ((arg->peer_ppet.ru_bit_mask & BIT(ru)) == 0)
2382
continue;
2383
for (i = 0; i < 6; i++) {
2384
val >>= 1;
2385
val |= ((he_cap->ppe_thres[bit / 8] >>
2386
(bit % 8)) & 0x1) << 5;
2387
bit++;
2388
}
2389
arg->peer_ppet.ppet16_ppet8_ru3_ru0[nss] |=
2390
val << (ru * 6);
2391
}
2392
}
2393
}
2394
2395
if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_RES)
2396
arg->twt_responder = true;
2397
if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_REQ)
2398
arg->twt_requester = true;
2399
2400
he_nss = ath11k_mac_max_he_nss(he_mcs_mask);
2401
2402
if (he_nss > sta->deflink.rx_nss) {
2403
user_rate_valid = false;
2404
for (nss_idx = sta->deflink.rx_nss - 1; nss_idx >= 0; nss_idx--) {
2405
if (he_mcs_mask[nss_idx]) {
2406
user_rate_valid = true;
2407
break;
2408
}
2409
}
2410
}
2411
2412
if (!user_rate_valid) {
2413
ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "setting he range mcs value to peer supported nss %d for peer %pM\n",
2414
sta->deflink.rx_nss, sta->addr);
2415
he_mcs_mask[sta->deflink.rx_nss - 1] = he_mcs_mask[he_nss - 1];
2416
}
2417
2418
switch (sta->deflink.bandwidth) {
2419
case IEEE80211_STA_RX_BW_160:
2420
if (he_cap->he_cap_elem.phy_cap_info[0] &
2421
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G) {
2422
v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80p80);
2423
v = ath11k_peer_assoc_h_he_limit(v, he_mcs_mask);
2424
arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80_80] = v;
2425
2426
v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80p80);
2427
arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80_80] = v;
2428
2429
arg->peer_he_mcs_count++;
2430
he_tx_mcs = v;
2431
}
2432
v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160);
2433
arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v;
2434
2435
v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_160);
2436
v = ath11k_peer_assoc_h_he_limit(v, he_mcs_mask);
2437
arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v;
2438
2439
arg->peer_he_mcs_count++;
2440
if (!he_tx_mcs)
2441
he_tx_mcs = v;
2442
fallthrough;
2443
2444
default:
2445
v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80);
2446
arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v;
2447
2448
v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80);
2449
v = ath11k_peer_assoc_h_he_limit(v, he_mcs_mask);
2450
arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v;
2451
2452
arg->peer_he_mcs_count++;
2453
if (!he_tx_mcs)
2454
he_tx_mcs = v;
2455
break;
2456
}
2457
2458
/* Calculate peer NSS capability from HE capabilities if STA
2459
* supports HE.
2460
*/
2461
for (i = 0, max_nss = 0; i < NL80211_HE_NSS_MAX; i++) {
2462
he_mcs = he_tx_mcs >> (2 * i) & 3;
2463
2464
/* In case of fixed rates, MCS Range in he_tx_mcs might have
2465
* unsupported range, with he_mcs_mask set, so check either of them
2466
* to find nss.
2467
*/
2468
if (he_mcs != IEEE80211_HE_MCS_NOT_SUPPORTED ||
2469
he_mcs_mask[i])
2470
max_nss = i + 1;
2471
}
2472
arg->peer_nss = min(sta->deflink.rx_nss, max_nss);
2473
2474
if (arg->peer_phymode == MODE_11AX_HE160 ||
2475
arg->peer_phymode == MODE_11AX_HE80_80) {
2476
tx_nss = ath11k_get_nss_160mhz(ar, max_nss);
2477
rx_nss = min(arg->peer_nss, tx_nss);
2478
arg->peer_bw_rxnss_override = ATH11K_BW_NSS_MAP_ENABLE;
2479
2480
if (!rx_nss) {
2481
ath11k_warn(ar->ab, "invalid max_nss\n");
2482
return;
2483
}
2484
2485
if (arg->peer_phymode == MODE_11AX_HE160)
2486
nss_160 = FIELD_PREP(ATH11K_PEER_RX_NSS_160MHZ, rx_nss - 1);
2487
else
2488
nss_160 = FIELD_PREP(ATH11K_PEER_RX_NSS_80_80MHZ, rx_nss - 1);
2489
2490
arg->peer_bw_rxnss_override |= nss_160;
2491
}
2492
2493
ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
2494
"he peer %pM nss %d mcs cnt %d nss_override 0x%x\n",
2495
sta->addr, arg->peer_nss,
2496
arg->peer_he_mcs_count,
2497
arg->peer_bw_rxnss_override);
2498
}
2499
2500
static void ath11k_peer_assoc_h_he_6ghz(struct ath11k *ar,
2501
struct ieee80211_vif *vif,
2502
struct ieee80211_sta *sta,
2503
struct peer_assoc_params *arg)
2504
{
2505
const struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap;
2506
struct cfg80211_chan_def def;
2507
enum nl80211_band band;
2508
u8 ampdu_factor;
2509
2510
if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
2511
return;
2512
2513
band = def.chan->band;
2514
2515
if (!arg->he_flag || band != NL80211_BAND_6GHZ || !sta->deflink.he_6ghz_capa.capa)
2516
return;
2517
2518
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2519
arg->bw_40 = true;
2520
2521
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
2522
arg->bw_80 = true;
2523
2524
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160)
2525
arg->bw_160 = true;
2526
2527
arg->peer_he_caps_6ghz = le16_to_cpu(sta->deflink.he_6ghz_capa.capa);
2528
arg->peer_mpdu_density =
2529
ath11k_parse_mpdudensity(FIELD_GET(IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START,
2530
arg->peer_he_caps_6ghz));
2531
2532
/* From IEEE Std 802.11ax-2021 - Section 10.12.2: An HE STA shall be capable of
2533
* receiving A-MPDU where the A-MPDU pre-EOF padding length is up to the value
2534
* indicated by the Maximum A-MPDU Length Exponent Extension field in the HE
2535
* Capabilities element and the Maximum A-MPDU Length Exponent field in HE 6 GHz
2536
* Band Capabilities element in the 6 GHz band.
2537
*
2538
* Here, we are extracting the Max A-MPDU Exponent Extension from HE caps and
2539
* factor is the Maximum A-MPDU Length Exponent from HE 6 GHZ Band capability.
2540
*/
2541
ampdu_factor = FIELD_GET(IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK,
2542
he_cap->he_cap_elem.mac_cap_info[3]) +
2543
FIELD_GET(IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP,
2544
arg->peer_he_caps_6ghz);
2545
2546
arg->peer_max_mpdu = (1u << (IEEE80211_HE_6GHZ_MAX_AMPDU_FACTOR +
2547
ampdu_factor)) - 1;
2548
}
2549
2550
static void ath11k_peer_assoc_h_smps(struct ieee80211_sta *sta,
2551
struct peer_assoc_params *arg)
2552
{
2553
const struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
2554
int smps;
2555
2556
if (!ht_cap->ht_supported && !sta->deflink.he_6ghz_capa.capa)
2557
return;
2558
2559
if (ht_cap->ht_supported) {
2560
smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
2561
smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
2562
} else {
2563
smps = le16_get_bits(sta->deflink.he_6ghz_capa.capa,
2564
IEEE80211_HE_6GHZ_CAP_SM_PS);
2565
}
2566
2567
switch (smps) {
2568
case WLAN_HT_CAP_SM_PS_STATIC:
2569
arg->static_mimops_flag = true;
2570
break;
2571
case WLAN_HT_CAP_SM_PS_DYNAMIC:
2572
arg->dynamic_mimops_flag = true;
2573
break;
2574
case WLAN_HT_CAP_SM_PS_DISABLED:
2575
arg->spatial_mux_flag = true;
2576
break;
2577
default:
2578
break;
2579
}
2580
}
2581
2582
static void ath11k_peer_assoc_h_qos(struct ath11k *ar,
2583
struct ieee80211_vif *vif,
2584
struct ieee80211_sta *sta,
2585
struct peer_assoc_params *arg)
2586
{
2587
struct ath11k_vif *arvif = (void *)vif->drv_priv;
2588
2589
switch (arvif->vdev_type) {
2590
case WMI_VDEV_TYPE_AP:
2591
if (sta->wme) {
2592
/* TODO: Check WME vs QoS */
2593
arg->is_wme_set = true;
2594
arg->qos_flag = true;
2595
}
2596
2597
if (sta->wme && sta->uapsd_queues) {
2598
/* TODO: Check WME vs QoS */
2599
arg->is_wme_set = true;
2600
arg->apsd_flag = true;
2601
arg->peer_rate_caps |= WMI_HOST_RC_UAPSD_FLAG;
2602
}
2603
break;
2604
case WMI_VDEV_TYPE_STA:
2605
if (sta->wme) {
2606
arg->is_wme_set = true;
2607
arg->qos_flag = true;
2608
}
2609
break;
2610
default:
2611
break;
2612
}
2613
2614
ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "peer %pM qos %d\n",
2615
sta->addr, arg->qos_flag);
2616
}
2617
2618
static int ath11k_peer_assoc_qos_ap(struct ath11k *ar,
2619
struct ath11k_vif *arvif,
2620
struct ieee80211_sta *sta)
2621
{
2622
struct ap_ps_params params;
2623
u32 max_sp;
2624
u32 uapsd;
2625
int ret;
2626
2627
lockdep_assert_held(&ar->conf_mutex);
2628
2629
params.vdev_id = arvif->vdev_id;
2630
2631
ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "uapsd_queues 0x%x max_sp %d\n",
2632
sta->uapsd_queues, sta->max_sp);
2633
2634
uapsd = 0;
2635
if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO)
2636
uapsd |= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN |
2637
WMI_AP_PS_UAPSD_AC3_TRIGGER_EN;
2638
if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI)
2639
uapsd |= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN |
2640
WMI_AP_PS_UAPSD_AC2_TRIGGER_EN;
2641
if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK)
2642
uapsd |= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN |
2643
WMI_AP_PS_UAPSD_AC1_TRIGGER_EN;
2644
if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE)
2645
uapsd |= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN |
2646
WMI_AP_PS_UAPSD_AC0_TRIGGER_EN;
2647
2648
max_sp = 0;
2649
if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP)
2650
max_sp = sta->max_sp;
2651
2652
params.param = WMI_AP_PS_PEER_PARAM_UAPSD;
2653
params.value = uapsd;
2654
ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, &params);
2655
if (ret)
2656
goto err;
2657
2658
params.param = WMI_AP_PS_PEER_PARAM_MAX_SP;
2659
params.value = max_sp;
2660
ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, &params);
2661
if (ret)
2662
goto err;
2663
2664
/* TODO revisit during testing */
2665
params.param = WMI_AP_PS_PEER_PARAM_SIFS_RESP_FRMTYPE;
2666
params.value = DISABLE_SIFS_RESPONSE_TRIGGER;
2667
ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, &params);
2668
if (ret)
2669
goto err;
2670
2671
params.param = WMI_AP_PS_PEER_PARAM_SIFS_RESP_UAPSD;
2672
params.value = DISABLE_SIFS_RESPONSE_TRIGGER;
2673
ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, &params);
2674
if (ret)
2675
goto err;
2676
2677
return 0;
2678
2679
err:
2680
ath11k_warn(ar->ab, "failed to set ap ps peer param %d for vdev %i: %d\n",
2681
params.param, arvif->vdev_id, ret);
2682
return ret;
2683
}
2684
2685
static bool ath11k_mac_sta_has_ofdm_only(struct ieee80211_sta *sta)
2686
{
2687
return sta->deflink.supp_rates[NL80211_BAND_2GHZ] >>
2688
ATH11K_MAC_FIRST_OFDM_RATE_IDX;
2689
}
2690
2691
static enum wmi_phy_mode ath11k_mac_get_phymode_vht(struct ath11k *ar,
2692
struct ieee80211_sta *sta)
2693
{
2694
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160) {
2695
switch (sta->deflink.vht_cap.cap &
2696
IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK) {
2697
case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ:
2698
return MODE_11AC_VHT160;
2699
case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ:
2700
return MODE_11AC_VHT80_80;
2701
default:
2702
/* not sure if this is a valid case? */
2703
return MODE_11AC_VHT160;
2704
}
2705
}
2706
2707
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
2708
return MODE_11AC_VHT80;
2709
2710
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2711
return MODE_11AC_VHT40;
2712
2713
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_20)
2714
return MODE_11AC_VHT20;
2715
2716
return MODE_UNKNOWN;
2717
}
2718
2719
static enum wmi_phy_mode ath11k_mac_get_phymode_he(struct ath11k *ar,
2720
struct ieee80211_sta *sta)
2721
{
2722
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160) {
2723
if (sta->deflink.he_cap.he_cap_elem.phy_cap_info[0] &
2724
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
2725
return MODE_11AX_HE160;
2726
else if (sta->deflink.he_cap.he_cap_elem.phy_cap_info[0] &
2727
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
2728
return MODE_11AX_HE80_80;
2729
/* not sure if this is a valid case? */
2730
return MODE_11AX_HE160;
2731
}
2732
2733
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
2734
return MODE_11AX_HE80;
2735
2736
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2737
return MODE_11AX_HE40;
2738
2739
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_20)
2740
return MODE_11AX_HE20;
2741
2742
return MODE_UNKNOWN;
2743
}
2744
2745
static void ath11k_peer_assoc_h_phymode(struct ath11k *ar,
2746
struct ieee80211_vif *vif,
2747
struct ieee80211_sta *sta,
2748
struct peer_assoc_params *arg)
2749
{
2750
struct ath11k_vif *arvif = (void *)vif->drv_priv;
2751
struct cfg80211_chan_def def;
2752
enum nl80211_band band;
2753
const u8 *ht_mcs_mask;
2754
const u16 *vht_mcs_mask;
2755
const u16 *he_mcs_mask;
2756
enum wmi_phy_mode phymode = MODE_UNKNOWN;
2757
2758
if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
2759
return;
2760
2761
band = def.chan->band;
2762
ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
2763
vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2764
he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs;
2765
2766
switch (band) {
2767
case NL80211_BAND_2GHZ:
2768
if (sta->deflink.he_cap.has_he &&
2769
!ath11k_peer_assoc_h_he_masked(he_mcs_mask)) {
2770
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
2771
phymode = MODE_11AX_HE80_2G;
2772
else if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2773
phymode = MODE_11AX_HE40_2G;
2774
else
2775
phymode = MODE_11AX_HE20_2G;
2776
} else if (sta->deflink.vht_cap.vht_supported &&
2777
!ath11k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
2778
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2779
phymode = MODE_11AC_VHT40;
2780
else
2781
phymode = MODE_11AC_VHT20;
2782
} else if (sta->deflink.ht_cap.ht_supported &&
2783
!ath11k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
2784
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2785
phymode = MODE_11NG_HT40;
2786
else
2787
phymode = MODE_11NG_HT20;
2788
} else if (ath11k_mac_sta_has_ofdm_only(sta)) {
2789
phymode = MODE_11G;
2790
} else {
2791
phymode = MODE_11B;
2792
}
2793
break;
2794
case NL80211_BAND_5GHZ:
2795
case NL80211_BAND_6GHZ:
2796
/* Check HE first */
2797
if (sta->deflink.he_cap.has_he &&
2798
!ath11k_peer_assoc_h_he_masked(he_mcs_mask)) {
2799
phymode = ath11k_mac_get_phymode_he(ar, sta);
2800
} else if (sta->deflink.vht_cap.vht_supported &&
2801
!ath11k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
2802
phymode = ath11k_mac_get_phymode_vht(ar, sta);
2803
} else if (sta->deflink.ht_cap.ht_supported &&
2804
!ath11k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
2805
if (sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40)
2806
phymode = MODE_11NA_HT40;
2807
else
2808
phymode = MODE_11NA_HT20;
2809
} else {
2810
phymode = MODE_11A;
2811
}
2812
break;
2813
default:
2814
break;
2815
}
2816
2817
ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "peer %pM phymode %s\n",
2818
sta->addr, ath11k_wmi_phymode_str(phymode));
2819
2820
arg->peer_phymode = phymode;
2821
WARN_ON(phymode == MODE_UNKNOWN);
2822
}
2823
2824
static void ath11k_peer_assoc_prepare(struct ath11k *ar,
2825
struct ieee80211_vif *vif,
2826
struct ieee80211_sta *sta,
2827
struct peer_assoc_params *arg,
2828
bool reassoc)
2829
{
2830
struct ath11k_sta *arsta;
2831
2832
lockdep_assert_held(&ar->conf_mutex);
2833
2834
arsta = (struct ath11k_sta *)sta->drv_priv;
2835
2836
memset(arg, 0, sizeof(*arg));
2837
2838
reinit_completion(&ar->peer_assoc_done);
2839
2840
arg->peer_new_assoc = !reassoc;
2841
ath11k_peer_assoc_h_basic(ar, vif, sta, arg);
2842
ath11k_peer_assoc_h_crypto(ar, vif, sta, arg);
2843
ath11k_peer_assoc_h_rates(ar, vif, sta, arg);
2844
ath11k_peer_assoc_h_phymode(ar, vif, sta, arg);
2845
ath11k_peer_assoc_h_ht(ar, vif, sta, arg);
2846
ath11k_peer_assoc_h_vht(ar, vif, sta, arg);
2847
ath11k_peer_assoc_h_he(ar, vif, sta, arg);
2848
ath11k_peer_assoc_h_he_6ghz(ar, vif, sta, arg);
2849
ath11k_peer_assoc_h_qos(ar, vif, sta, arg);
2850
ath11k_peer_assoc_h_smps(sta, arg);
2851
2852
arsta->peer_nss = arg->peer_nss;
2853
2854
/* TODO: amsdu_disable req? */
2855
}
2856
2857
static int ath11k_setup_peer_smps(struct ath11k *ar, struct ath11k_vif *arvif,
2858
const u8 *addr,
2859
const struct ieee80211_sta_ht_cap *ht_cap,
2860
u16 he_6ghz_capa)
2861
{
2862
int smps;
2863
2864
if (!ht_cap->ht_supported && !he_6ghz_capa)
2865
return 0;
2866
2867
if (ht_cap->ht_supported) {
2868
smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
2869
smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
2870
} else {
2871
smps = FIELD_GET(IEEE80211_HE_6GHZ_CAP_SM_PS, he_6ghz_capa);
2872
}
2873
2874
if (smps >= ARRAY_SIZE(ath11k_smps_map))
2875
return -EINVAL;
2876
2877
return ath11k_wmi_set_peer_param(ar, addr, arvif->vdev_id,
2878
WMI_PEER_MIMO_PS_STATE,
2879
ath11k_smps_map[smps]);
2880
}
2881
2882
static bool ath11k_mac_set_he_txbf_conf(struct ath11k_vif *arvif)
2883
{
2884
struct ath11k *ar = arvif->ar;
2885
u32 param, value;
2886
int ret;
2887
2888
if (!arvif->vif->bss_conf.he_support)
2889
return true;
2890
2891
param = WMI_VDEV_PARAM_SET_HEMU_MODE;
2892
value = 0;
2893
if (arvif->vif->bss_conf.he_su_beamformer) {
2894
value |= FIELD_PREP(HE_MODE_SU_TX_BFER, HE_SU_BFER_ENABLE);
2895
if (arvif->vif->bss_conf.he_mu_beamformer &&
2896
arvif->vdev_type == WMI_VDEV_TYPE_AP)
2897
value |= FIELD_PREP(HE_MODE_MU_TX_BFER, HE_MU_BFER_ENABLE);
2898
}
2899
2900
if (arvif->vif->type != NL80211_IFTYPE_MESH_POINT) {
2901
value |= FIELD_PREP(HE_MODE_DL_OFDMA, HE_DL_MUOFDMA_ENABLE) |
2902
FIELD_PREP(HE_MODE_UL_OFDMA, HE_UL_MUOFDMA_ENABLE);
2903
2904
if (arvif->vif->bss_conf.he_full_ul_mumimo)
2905
value |= FIELD_PREP(HE_MODE_UL_MUMIMO, HE_UL_MUMIMO_ENABLE);
2906
2907
if (arvif->vif->bss_conf.he_su_beamformee)
2908
value |= FIELD_PREP(HE_MODE_SU_TX_BFEE, HE_SU_BFEE_ENABLE);
2909
}
2910
2911
ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, value);
2912
if (ret) {
2913
ath11k_warn(ar->ab, "failed to set vdev %d HE MU mode: %d\n",
2914
arvif->vdev_id, ret);
2915
return false;
2916
}
2917
2918
param = WMI_VDEV_PARAM_SET_HE_SOUNDING_MODE;
2919
value = FIELD_PREP(HE_VHT_SOUNDING_MODE, HE_VHT_SOUNDING_MODE_ENABLE) |
2920
FIELD_PREP(HE_TRIG_NONTRIG_SOUNDING_MODE,
2921
HE_TRIG_NONTRIG_SOUNDING_MODE_ENABLE);
2922
ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
2923
param, value);
2924
if (ret) {
2925
ath11k_warn(ar->ab, "failed to set vdev %d sounding mode: %d\n",
2926
arvif->vdev_id, ret);
2927
return false;
2928
}
2929
return true;
2930
}
2931
2932
static bool ath11k_mac_vif_recalc_sta_he_txbf(struct ath11k *ar,
2933
struct ieee80211_vif *vif,
2934
struct ieee80211_sta_he_cap *he_cap)
2935
{
2936
struct ath11k_vif *arvif = (void *)vif->drv_priv;
2937
struct ieee80211_he_cap_elem he_cap_elem = {0};
2938
struct ieee80211_sta_he_cap *cap_band = NULL;
2939
struct cfg80211_chan_def def;
2940
u32 param = WMI_VDEV_PARAM_SET_HEMU_MODE;
2941
u32 hemode = 0;
2942
int ret;
2943
2944
if (!vif->bss_conf.he_support)
2945
return true;
2946
2947
if (vif->type != NL80211_IFTYPE_STATION)
2948
return false;
2949
2950
if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
2951
return false;
2952
2953
if (def.chan->band == NL80211_BAND_2GHZ)
2954
cap_band = &ar->mac.iftype[NL80211_BAND_2GHZ][vif->type].he_cap;
2955
else
2956
cap_band = &ar->mac.iftype[NL80211_BAND_5GHZ][vif->type].he_cap;
2957
2958
memcpy(&he_cap_elem, &cap_band->he_cap_elem, sizeof(he_cap_elem));
2959
2960
if (HECAP_PHY_SUBFME_GET(he_cap_elem.phy_cap_info)) {
2961
if (HECAP_PHY_SUBFMR_GET(he_cap->he_cap_elem.phy_cap_info))
2962
hemode |= FIELD_PREP(HE_MODE_SU_TX_BFEE, HE_SU_BFEE_ENABLE);
2963
if (HECAP_PHY_MUBFMR_GET(he_cap->he_cap_elem.phy_cap_info))
2964
hemode |= FIELD_PREP(HE_MODE_MU_TX_BFEE, HE_MU_BFEE_ENABLE);
2965
}
2966
2967
if (vif->type != NL80211_IFTYPE_MESH_POINT) {
2968
hemode |= FIELD_PREP(HE_MODE_DL_OFDMA, HE_DL_MUOFDMA_ENABLE) |
2969
FIELD_PREP(HE_MODE_UL_OFDMA, HE_UL_MUOFDMA_ENABLE);
2970
2971
if (HECAP_PHY_ULMUMIMO_GET(he_cap_elem.phy_cap_info))
2972
if (HECAP_PHY_ULMUMIMO_GET(he_cap->he_cap_elem.phy_cap_info))
2973
hemode |= FIELD_PREP(HE_MODE_UL_MUMIMO,
2974
HE_UL_MUMIMO_ENABLE);
2975
2976
if (FIELD_GET(HE_MODE_MU_TX_BFEE, hemode))
2977
hemode |= FIELD_PREP(HE_MODE_SU_TX_BFEE, HE_SU_BFEE_ENABLE);
2978
2979
if (FIELD_GET(HE_MODE_MU_TX_BFER, hemode))
2980
hemode |= FIELD_PREP(HE_MODE_SU_TX_BFER, HE_SU_BFER_ENABLE);
2981
}
2982
2983
ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, hemode);
2984
if (ret) {
2985
ath11k_warn(ar->ab, "failed to submit vdev param txbf 0x%x: %d\n",
2986
hemode, ret);
2987
return false;
2988
}
2989
2990
return true;
2991
}
2992
2993
static void ath11k_bss_assoc(struct ieee80211_hw *hw,
2994
struct ieee80211_vif *vif,
2995
struct ieee80211_bss_conf *bss_conf)
2996
{
2997
struct ath11k *ar = hw->priv;
2998
struct ath11k_vif *arvif = (void *)vif->drv_priv;
2999
struct peer_assoc_params peer_arg;
3000
struct ieee80211_sta *ap_sta;
3001
struct ath11k_peer *peer;
3002
bool is_auth = false;
3003
struct ieee80211_sta_he_cap he_cap;
3004
int ret;
3005
3006
lockdep_assert_held(&ar->conf_mutex);
3007
3008
ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %i assoc bssid %pM aid %d\n",
3009
arvif->vdev_id, arvif->bssid, arvif->aid);
3010
3011
rcu_read_lock();
3012
3013
ap_sta = ieee80211_find_sta(vif, bss_conf->bssid);
3014
if (!ap_sta) {
3015
ath11k_warn(ar->ab, "failed to find station entry for bss %pM vdev %i\n",
3016
bss_conf->bssid, arvif->vdev_id);
3017
rcu_read_unlock();
3018
return;
3019
}
3020
3021
/* he_cap here is updated at assoc success for sta mode only */
3022
he_cap = ap_sta->deflink.he_cap;
3023
3024
ath11k_peer_assoc_prepare(ar, vif, ap_sta, &peer_arg, false);
3025
3026
rcu_read_unlock();
3027
3028
peer_arg.is_assoc = true;
3029
ret = ath11k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
3030
if (ret) {
3031
ath11k_warn(ar->ab, "failed to run peer assoc for %pM vdev %i: %d\n",
3032
bss_conf->bssid, arvif->vdev_id, ret);
3033
return;
3034
}
3035
3036
if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) {
3037
ath11k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
3038
bss_conf->bssid, arvif->vdev_id);
3039
return;
3040
}
3041
3042
ret = ath11k_setup_peer_smps(ar, arvif, bss_conf->bssid,
3043
&ap_sta->deflink.ht_cap,
3044
le16_to_cpu(ap_sta->deflink.he_6ghz_capa.capa));
3045
if (ret) {
3046
ath11k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n",
3047
arvif->vdev_id, ret);
3048
return;
3049
}
3050
3051
if (!ath11k_mac_vif_recalc_sta_he_txbf(ar, vif, &he_cap)) {
3052
ath11k_warn(ar->ab, "failed to recalc he txbf for vdev %i on bss %pM\n",
3053
arvif->vdev_id, bss_conf->bssid);
3054
return;
3055
}
3056
3057
WARN_ON(arvif->is_up);
3058
3059
arvif->aid = vif->cfg.aid;
3060
ether_addr_copy(arvif->bssid, bss_conf->bssid);
3061
3062
ret = ath11k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid,
3063
NULL, 0, 0);
3064
if (ret) {
3065
ath11k_warn(ar->ab, "failed to set vdev %d up: %d\n",
3066
arvif->vdev_id, ret);
3067
return;
3068
}
3069
3070
arvif->is_up = true;
3071
arvif->rekey_data.enable_offload = false;
3072
3073
ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3074
"vdev %d up (associated) bssid %pM aid %d\n",
3075
arvif->vdev_id, bss_conf->bssid, vif->cfg.aid);
3076
3077
spin_lock_bh(&ar->ab->base_lock);
3078
3079
peer = ath11k_peer_find(ar->ab, arvif->vdev_id, arvif->bssid);
3080
if (peer && peer->is_authorized)
3081
is_auth = true;
3082
3083
spin_unlock_bh(&ar->ab->base_lock);
3084
3085
if (is_auth) {
3086
ret = ath11k_wmi_set_peer_param(ar, arvif->bssid,
3087
arvif->vdev_id,
3088
WMI_PEER_AUTHORIZE,
3089
1);
3090
if (ret)
3091
ath11k_warn(ar->ab, "Unable to authorize BSS peer: %d\n", ret);
3092
}
3093
3094
ret = ath11k_wmi_send_obss_spr_cmd(ar, arvif->vdev_id,
3095
&bss_conf->he_obss_pd);
3096
if (ret)
3097
ath11k_warn(ar->ab, "failed to set vdev %i OBSS PD parameters: %d\n",
3098
arvif->vdev_id, ret);
3099
3100
ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3101
WMI_VDEV_PARAM_DTIM_POLICY,
3102
WMI_DTIM_POLICY_STICK);
3103
if (ret)
3104
ath11k_warn(ar->ab, "failed to set vdev %d dtim policy: %d\n",
3105
arvif->vdev_id, ret);
3106
3107
ath11k_mac_11d_scan_stop_all(ar->ab);
3108
}
3109
3110
static void ath11k_bss_disassoc(struct ieee80211_hw *hw,
3111
struct ieee80211_vif *vif)
3112
{
3113
struct ath11k *ar = hw->priv;
3114
struct ath11k_vif *arvif = (void *)vif->drv_priv;
3115
int ret;
3116
3117
lockdep_assert_held(&ar->conf_mutex);
3118
3119
ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %i disassoc bssid %pM\n",
3120
arvif->vdev_id, arvif->bssid);
3121
3122
ret = ath11k_wmi_vdev_down(ar, arvif->vdev_id);
3123
if (ret)
3124
ath11k_warn(ar->ab, "failed to down vdev %i: %d\n",
3125
arvif->vdev_id, ret);
3126
3127
arvif->is_up = false;
3128
3129
memset(&arvif->rekey_data, 0, sizeof(arvif->rekey_data));
3130
3131
cancel_delayed_work_sync(&arvif->connection_loss_work);
3132
}
3133
3134
static u32 ath11k_mac_get_rate_hw_value(int bitrate)
3135
{
3136
u32 preamble;
3137
u16 hw_value;
3138
int rate;
3139
size_t i;
3140
3141
if (ath11k_mac_bitrate_is_cck(bitrate))
3142
preamble = WMI_RATE_PREAMBLE_CCK;
3143
else
3144
preamble = WMI_RATE_PREAMBLE_OFDM;
3145
3146
for (i = 0; i < ARRAY_SIZE(ath11k_legacy_rates); i++) {
3147
if (ath11k_legacy_rates[i].bitrate != bitrate)
3148
continue;
3149
3150
hw_value = ath11k_legacy_rates[i].hw_value;
3151
rate = ATH11K_HW_RATE_CODE(hw_value, 0, preamble);
3152
3153
return rate;
3154
}
3155
3156
return -EINVAL;
3157
}
3158
3159
static void ath11k_recalculate_mgmt_rate(struct ath11k *ar,
3160
struct ieee80211_vif *vif,
3161
struct cfg80211_chan_def *def)
3162
{
3163
struct ath11k_vif *arvif = (void *)vif->drv_priv;
3164
const struct ieee80211_supported_band *sband;
3165
u8 basic_rate_idx;
3166
int hw_rate_code;
3167
u32 vdev_param;
3168
u16 bitrate;
3169
int ret;
3170
3171
lockdep_assert_held(&ar->conf_mutex);
3172
3173
sband = ar->hw->wiphy->bands[def->chan->band];
3174
basic_rate_idx = ffs(vif->bss_conf.basic_rates) - 1;
3175
bitrate = sband->bitrates[basic_rate_idx].bitrate;
3176
3177
hw_rate_code = ath11k_mac_get_rate_hw_value(bitrate);
3178
if (hw_rate_code < 0) {
3179
ath11k_warn(ar->ab, "bitrate not supported %d\n", bitrate);
3180
return;
3181
}
3182
3183
vdev_param = WMI_VDEV_PARAM_MGMT_RATE;
3184
ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param,
3185
hw_rate_code);
3186
if (ret)
3187
ath11k_warn(ar->ab, "failed to set mgmt tx rate %d\n", ret);
3188
3189
/* For WCN6855, firmware will clear this param when vdev starts, hence
3190
* cache it here so that we can reconfigure it once vdev starts.
3191
*/
3192
ar->hw_rate_code = hw_rate_code;
3193
3194
vdev_param = WMI_VDEV_PARAM_BEACON_RATE;
3195
ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param,
3196
hw_rate_code);
3197
if (ret)
3198
ath11k_warn(ar->ab, "failed to set beacon tx rate %d\n", ret);
3199
}
3200
3201
static int ath11k_mac_fils_discovery(struct ath11k_vif *arvif,
3202
struct ieee80211_bss_conf *info)
3203
{
3204
struct ath11k *ar = arvif->ar;
3205
struct sk_buff *tmpl;
3206
int ret;
3207
u32 interval;
3208
bool unsol_bcast_probe_resp_enabled = false;
3209
3210
if (info->fils_discovery.max_interval) {
3211
interval = info->fils_discovery.max_interval;
3212
3213
tmpl = ieee80211_get_fils_discovery_tmpl(ar->hw, arvif->vif);
3214
if (tmpl)
3215
ret = ath11k_wmi_fils_discovery_tmpl(ar, arvif->vdev_id,
3216
tmpl);
3217
} else if (info->unsol_bcast_probe_resp_interval) {
3218
unsol_bcast_probe_resp_enabled = 1;
3219
interval = info->unsol_bcast_probe_resp_interval;
3220
3221
tmpl = ieee80211_get_unsol_bcast_probe_resp_tmpl(ar->hw,
3222
arvif->vif);
3223
if (tmpl)
3224
ret = ath11k_wmi_probe_resp_tmpl(ar, arvif->vdev_id,
3225
tmpl);
3226
} else { /* Disable */
3227
return ath11k_wmi_fils_discovery(ar, arvif->vdev_id, 0, false);
3228
}
3229
3230
if (!tmpl) {
3231
ath11k_warn(ar->ab,
3232
"mac vdev %i failed to retrieve %s template\n",
3233
arvif->vdev_id, (unsol_bcast_probe_resp_enabled ?
3234
"unsolicited broadcast probe response" :
3235
"FILS discovery"));
3236
return -EPERM;
3237
}
3238
kfree_skb(tmpl);
3239
3240
if (!ret)
3241
ret = ath11k_wmi_fils_discovery(ar, arvif->vdev_id, interval,
3242
unsol_bcast_probe_resp_enabled);
3243
3244
return ret;
3245
}
3246
3247
static int ath11k_mac_config_obss_pd(struct ath11k *ar,
3248
struct ieee80211_he_obss_pd *he_obss_pd)
3249
{
3250
u32 bitmap[2], param_id, param_val, pdev_id;
3251
int ret;
3252
s8 non_srg_th = 0, srg_th = 0;
3253
3254
pdev_id = ar->pdev->pdev_id;
3255
3256
/* Set and enable SRG/non-SRG OBSS PD Threshold */
3257
param_id = WMI_PDEV_PARAM_SET_CMD_OBSS_PD_THRESHOLD;
3258
if (test_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags)) {
3259
ret = ath11k_wmi_pdev_set_param(ar, param_id, 0, pdev_id);
3260
if (ret)
3261
ath11k_warn(ar->ab,
3262
"failed to set obss_pd_threshold for pdev: %u\n",
3263
pdev_id);
3264
return ret;
3265
}
3266
3267
ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3268
"obss pd sr_ctrl %x non_srg_thres %u srg_max %u\n",
3269
he_obss_pd->sr_ctrl, he_obss_pd->non_srg_max_offset,
3270
he_obss_pd->max_offset);
3271
3272
param_val = 0;
3273
3274
if (he_obss_pd->sr_ctrl &
3275
IEEE80211_HE_SPR_NON_SRG_OBSS_PD_SR_DISALLOWED) {
3276
non_srg_th = ATH11K_OBSS_PD_MAX_THRESHOLD;
3277
} else {
3278
if (he_obss_pd->sr_ctrl & IEEE80211_HE_SPR_NON_SRG_OFFSET_PRESENT)
3279
non_srg_th = (ATH11K_OBSS_PD_MAX_THRESHOLD +
3280
he_obss_pd->non_srg_max_offset);
3281
else
3282
non_srg_th = ATH11K_OBSS_PD_NON_SRG_MAX_THRESHOLD;
3283
3284
param_val |= ATH11K_OBSS_PD_NON_SRG_EN;
3285
}
3286
3287
if (he_obss_pd->sr_ctrl & IEEE80211_HE_SPR_SRG_INFORMATION_PRESENT) {
3288
srg_th = ATH11K_OBSS_PD_MAX_THRESHOLD + he_obss_pd->max_offset;
3289
param_val |= ATH11K_OBSS_PD_SRG_EN;
3290
}
3291
3292
if (test_bit(WMI_TLV_SERVICE_SRG_SRP_SPATIAL_REUSE_SUPPORT,
3293
ar->ab->wmi_ab.svc_map)) {
3294
param_val |= ATH11K_OBSS_PD_THRESHOLD_IN_DBM;
3295
param_val |= FIELD_PREP(GENMASK(15, 8), srg_th);
3296
} else {
3297
non_srg_th -= ATH11K_DEFAULT_NOISE_FLOOR;
3298
/* SRG not supported and threshold in dB */
3299
param_val &= ~(ATH11K_OBSS_PD_SRG_EN |
3300
ATH11K_OBSS_PD_THRESHOLD_IN_DBM);
3301
}
3302
3303
param_val |= (non_srg_th & GENMASK(7, 0));
3304
ret = ath11k_wmi_pdev_set_param(ar, param_id, param_val, pdev_id);
3305
if (ret) {
3306
ath11k_warn(ar->ab,
3307
"failed to set obss_pd_threshold for pdev: %u\n",
3308
pdev_id);
3309
return ret;
3310
}
3311
3312
/* Enable OBSS PD for all access category */
3313
param_id = WMI_PDEV_PARAM_SET_CMD_OBSS_PD_PER_AC;
3314
param_val = 0xf;
3315
ret = ath11k_wmi_pdev_set_param(ar, param_id, param_val, pdev_id);
3316
if (ret) {
3317
ath11k_warn(ar->ab,
3318
"failed to set obss_pd_per_ac for pdev: %u\n",
3319
pdev_id);
3320
return ret;
3321
}
3322
3323
/* Set SR Prohibit */
3324
param_id = WMI_PDEV_PARAM_ENABLE_SR_PROHIBIT;
3325
param_val = !!(he_obss_pd->sr_ctrl &
3326
IEEE80211_HE_SPR_HESIGA_SR_VAL15_ALLOWED);
3327
ret = ath11k_wmi_pdev_set_param(ar, param_id, param_val, pdev_id);
3328
if (ret) {
3329
ath11k_warn(ar->ab, "failed to set sr_prohibit for pdev: %u\n",
3330
pdev_id);
3331
return ret;
3332
}
3333
3334
if (!test_bit(WMI_TLV_SERVICE_SRG_SRP_SPATIAL_REUSE_SUPPORT,
3335
ar->ab->wmi_ab.svc_map))
3336
return 0;
3337
3338
/* Set SRG BSS Color Bitmap */
3339
memcpy(bitmap, he_obss_pd->bss_color_bitmap, sizeof(bitmap));
3340
ret = ath11k_wmi_pdev_set_srg_bss_color_bitmap(ar, bitmap);
3341
if (ret) {
3342
ath11k_warn(ar->ab,
3343
"failed to set bss_color_bitmap for pdev: %u\n",
3344
pdev_id);
3345
return ret;
3346
}
3347
3348
/* Set SRG Partial BSSID Bitmap */
3349
memcpy(bitmap, he_obss_pd->partial_bssid_bitmap, sizeof(bitmap));
3350
ret = ath11k_wmi_pdev_set_srg_patial_bssid_bitmap(ar, bitmap);
3351
if (ret) {
3352
ath11k_warn(ar->ab,
3353
"failed to set partial_bssid_bitmap for pdev: %u\n",
3354
pdev_id);
3355
return ret;
3356
}
3357
3358
memset(bitmap, 0xff, sizeof(bitmap));
3359
3360
/* Enable all BSS Colors for SRG */
3361
ret = ath11k_wmi_pdev_srg_obss_color_enable_bitmap(ar, bitmap);
3362
if (ret) {
3363
ath11k_warn(ar->ab,
3364
"failed to set srg_color_en_bitmap pdev: %u\n",
3365
pdev_id);
3366
return ret;
3367
}
3368
3369
/* Enable all partial BSSID mask for SRG */
3370
ret = ath11k_wmi_pdev_srg_obss_bssid_enable_bitmap(ar, bitmap);
3371
if (ret) {
3372
ath11k_warn(ar->ab,
3373
"failed to set srg_bssid_en_bitmap pdev: %u\n",
3374
pdev_id);
3375
return ret;
3376
}
3377
3378
/* Enable all BSS Colors for non-SRG */
3379
ret = ath11k_wmi_pdev_non_srg_obss_color_enable_bitmap(ar, bitmap);
3380
if (ret) {
3381
ath11k_warn(ar->ab,
3382
"failed to set non_srg_color_en_bitmap pdev: %u\n",
3383
pdev_id);
3384
return ret;
3385
}
3386
3387
/* Enable all partial BSSID mask for non-SRG */
3388
ret = ath11k_wmi_pdev_non_srg_obss_bssid_enable_bitmap(ar, bitmap);
3389
if (ret) {
3390
ath11k_warn(ar->ab,
3391
"failed to set non_srg_bssid_en_bitmap pdev: %u\n",
3392
pdev_id);
3393
return ret;
3394
}
3395
3396
return 0;
3397
}
3398
3399
static void ath11k_mac_op_bss_info_changed(struct ieee80211_hw *hw,
3400
struct ieee80211_vif *vif,
3401
struct ieee80211_bss_conf *info,
3402
u64 changed)
3403
{
3404
struct ath11k *ar = hw->priv;
3405
struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
3406
struct cfg80211_chan_def def;
3407
u32 param_id, param_value;
3408
enum nl80211_band band;
3409
u32 vdev_param;
3410
int mcast_rate;
3411
u32 preamble;
3412
u16 hw_value;
3413
u16 bitrate;
3414
int ret = 0;
3415
u8 rateidx;
3416
u32 rate, param;
3417
u32 ipv4_cnt;
3418
3419
mutex_lock(&ar->conf_mutex);
3420
3421
if (changed & BSS_CHANGED_BEACON_INT) {
3422
arvif->beacon_interval = info->beacon_int;
3423
3424
param_id = WMI_VDEV_PARAM_BEACON_INTERVAL;
3425
ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3426
param_id,
3427
arvif->beacon_interval);
3428
if (ret)
3429
ath11k_warn(ar->ab, "Failed to set beacon interval for VDEV: %d\n",
3430
arvif->vdev_id);
3431
else
3432
ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3433
"Beacon interval: %d set for VDEV: %d\n",
3434
arvif->beacon_interval, arvif->vdev_id);
3435
}
3436
3437
if (changed & BSS_CHANGED_BEACON) {
3438
param_id = WMI_PDEV_PARAM_BEACON_TX_MODE;
3439
param_value = WMI_BEACON_STAGGERED_MODE;
3440
ret = ath11k_wmi_pdev_set_param(ar, param_id,
3441
param_value, ar->pdev->pdev_id);
3442
if (ret)
3443
ath11k_warn(ar->ab, "Failed to set beacon mode for VDEV: %d\n",
3444
arvif->vdev_id);
3445
else
3446
ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3447
"Set staggered beacon mode for VDEV: %d\n",
3448
arvif->vdev_id);
3449
3450
if (!arvif->do_not_send_tmpl || !arvif->bcca_zero_sent) {
3451
ret = ath11k_mac_setup_bcn_tmpl(arvif);
3452
if (ret)
3453
ath11k_warn(ar->ab, "failed to update bcn template: %d\n",
3454
ret);
3455
}
3456
3457
if (arvif->bcca_zero_sent)
3458
arvif->do_not_send_tmpl = true;
3459
else
3460
arvif->do_not_send_tmpl = false;
3461
3462
if (vif->bss_conf.he_support) {
3463
ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3464
WMI_VDEV_PARAM_BA_MODE,
3465
WMI_BA_MODE_BUFFER_SIZE_256);
3466
if (ret)
3467
ath11k_warn(ar->ab,
3468
"failed to set BA BUFFER SIZE 256 for vdev: %d\n",
3469
arvif->vdev_id);
3470
else
3471
ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3472
"Set BA BUFFER SIZE 256 for VDEV: %d\n",
3473
arvif->vdev_id);
3474
}
3475
}
3476
3477
if (changed & (BSS_CHANGED_BEACON_INFO | BSS_CHANGED_BEACON)) {
3478
arvif->dtim_period = info->dtim_period;
3479
3480
param_id = WMI_VDEV_PARAM_DTIM_PERIOD;
3481
ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3482
param_id,
3483
arvif->dtim_period);
3484
3485
if (ret)
3486
ath11k_warn(ar->ab, "Failed to set dtim period for VDEV %d: %i\n",
3487
arvif->vdev_id, ret);
3488
else
3489
ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3490
"DTIM period: %d set for VDEV: %d\n",
3491
arvif->dtim_period, arvif->vdev_id);
3492
}
3493
3494
if (changed & BSS_CHANGED_SSID &&
3495
vif->type == NL80211_IFTYPE_AP) {
3496
arvif->u.ap.ssid_len = vif->cfg.ssid_len;
3497
if (vif->cfg.ssid_len)
3498
memcpy(arvif->u.ap.ssid, vif->cfg.ssid,
3499
vif->cfg.ssid_len);
3500
arvif->u.ap.hidden_ssid = info->hidden_ssid;
3501
}
3502
3503
if (changed & BSS_CHANGED_BSSID && !is_zero_ether_addr(info->bssid))
3504
ether_addr_copy(arvif->bssid, info->bssid);
3505
3506
if (changed & BSS_CHANGED_BEACON_ENABLED) {
3507
if (info->enable_beacon)
3508
ath11k_mac_set_he_txbf_conf(arvif);
3509
ath11k_control_beaconing(arvif, info);
3510
3511
if (arvif->is_up && vif->bss_conf.he_support &&
3512
vif->bss_conf.he_oper.params) {
3513
param_id = WMI_VDEV_PARAM_HEOPS_0_31;
3514
param_value = vif->bss_conf.he_oper.params;
3515
ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3516
param_id, param_value);
3517
ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3518
"he oper param: %x set for VDEV: %d\n",
3519
param_value, arvif->vdev_id);
3520
3521
if (ret)
3522
ath11k_warn(ar->ab, "Failed to set he oper params %x for VDEV %d: %i\n",
3523
param_value, arvif->vdev_id, ret);
3524
}
3525
}
3526
3527
if (changed & BSS_CHANGED_ERP_CTS_PROT) {
3528
u32 cts_prot;
3529
3530
cts_prot = !!(info->use_cts_prot);
3531
param_id = WMI_VDEV_PARAM_PROTECTION_MODE;
3532
3533
if (arvif->is_started) {
3534
ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3535
param_id, cts_prot);
3536
if (ret)
3537
ath11k_warn(ar->ab, "Failed to set CTS prot for VDEV: %d\n",
3538
arvif->vdev_id);
3539
else
3540
ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "Set CTS prot: %d for VDEV: %d\n",
3541
cts_prot, arvif->vdev_id);
3542
} else {
3543
ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "defer protection mode setup, vdev is not ready yet\n");
3544
}
3545
}
3546
3547
if (changed & BSS_CHANGED_ERP_SLOT) {
3548
u32 slottime;
3549
3550
if (info->use_short_slot)
3551
slottime = WMI_VDEV_SLOT_TIME_SHORT; /* 9us */
3552
3553
else
3554
slottime = WMI_VDEV_SLOT_TIME_LONG; /* 20us */
3555
3556
param_id = WMI_VDEV_PARAM_SLOT_TIME;
3557
ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3558
param_id, slottime);
3559
if (ret)
3560
ath11k_warn(ar->ab, "Failed to set erp slot for VDEV: %d\n",
3561
arvif->vdev_id);
3562
else
3563
ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3564
"Set slottime: %d for VDEV: %d\n",
3565
slottime, arvif->vdev_id);
3566
}
3567
3568
if (changed & BSS_CHANGED_ERP_PREAMBLE) {
3569
u32 preamble;
3570
3571
if (info->use_short_preamble)
3572
preamble = WMI_VDEV_PREAMBLE_SHORT;
3573
else
3574
preamble = WMI_VDEV_PREAMBLE_LONG;
3575
3576
param_id = WMI_VDEV_PARAM_PREAMBLE;
3577
ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3578
param_id, preamble);
3579
if (ret)
3580
ath11k_warn(ar->ab, "Failed to set preamble for VDEV: %d\n",
3581
arvif->vdev_id);
3582
else
3583
ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3584
"Set preamble: %d for VDEV: %d\n",
3585
preamble, arvif->vdev_id);
3586
}
3587
3588
if (changed & BSS_CHANGED_ASSOC) {
3589
if (vif->cfg.assoc)
3590
ath11k_bss_assoc(hw, vif, info);
3591
else
3592
ath11k_bss_disassoc(hw, vif);
3593
}
3594
3595
if (changed & BSS_CHANGED_TXPOWER) {
3596
ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev_id %i txpower %d\n",
3597
arvif->vdev_id, info->txpower);
3598
3599
arvif->txpower = info->txpower;
3600
ath11k_mac_txpower_recalc(ar);
3601
}
3602
3603
if (changed & BSS_CHANGED_PS &&
3604
ar->ab->hw_params.supports_sta_ps) {
3605
arvif->ps = vif->cfg.ps;
3606
3607
ret = ath11k_mac_config_ps(ar);
3608
if (ret)
3609
ath11k_warn(ar->ab, "failed to setup ps on vdev %i: %d\n",
3610
arvif->vdev_id, ret);
3611
}
3612
3613
if (changed & BSS_CHANGED_MCAST_RATE &&
3614
!ath11k_mac_vif_chan(arvif->vif, &def)) {
3615
band = def.chan->band;
3616
mcast_rate = vif->bss_conf.mcast_rate[band];
3617
3618
if (mcast_rate > 0)
3619
rateidx = mcast_rate - 1;
3620
else
3621
rateidx = ffs(vif->bss_conf.basic_rates) - 1;
3622
3623
if (ar->pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP)
3624
rateidx += ATH11K_MAC_FIRST_OFDM_RATE_IDX;
3625
3626
bitrate = ath11k_legacy_rates[rateidx].bitrate;
3627
hw_value = ath11k_legacy_rates[rateidx].hw_value;
3628
3629
if (ath11k_mac_bitrate_is_cck(bitrate))
3630
preamble = WMI_RATE_PREAMBLE_CCK;
3631
else
3632
preamble = WMI_RATE_PREAMBLE_OFDM;
3633
3634
rate = ATH11K_HW_RATE_CODE(hw_value, 0, preamble);
3635
3636
ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3637
"vdev %d mcast_rate %x\n",
3638
arvif->vdev_id, rate);
3639
3640
vdev_param = WMI_VDEV_PARAM_MCAST_DATA_RATE;
3641
ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3642
vdev_param, rate);
3643
if (ret)
3644
ath11k_warn(ar->ab,
3645
"failed to set mcast rate on vdev %i: %d\n",
3646
arvif->vdev_id, ret);
3647
3648
vdev_param = WMI_VDEV_PARAM_BCAST_DATA_RATE;
3649
ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3650
vdev_param, rate);
3651
if (ret)
3652
ath11k_warn(ar->ab,
3653
"failed to set bcast rate on vdev %i: %d\n",
3654
arvif->vdev_id, ret);
3655
}
3656
3657
if (changed & BSS_CHANGED_BASIC_RATES &&
3658
!ath11k_mac_vif_chan(arvif->vif, &def))
3659
ath11k_recalculate_mgmt_rate(ar, vif, &def);
3660
3661
if (changed & BSS_CHANGED_TWT) {
3662
struct wmi_twt_enable_params twt_params = {0};
3663
3664
if (info->twt_requester || info->twt_responder) {
3665
ath11k_wmi_fill_default_twt_params(&twt_params);
3666
ath11k_wmi_send_twt_enable_cmd(ar, ar->pdev->pdev_id,
3667
&twt_params);
3668
} else {
3669
ath11k_wmi_send_twt_disable_cmd(ar, ar->pdev->pdev_id);
3670
}
3671
}
3672
3673
if (changed & BSS_CHANGED_HE_OBSS_PD)
3674
ath11k_mac_config_obss_pd(ar, &info->he_obss_pd);
3675
3676
if (changed & BSS_CHANGED_HE_BSS_COLOR) {
3677
if (vif->type == NL80211_IFTYPE_AP) {
3678
ret = ath11k_wmi_send_obss_color_collision_cfg_cmd(
3679
ar, arvif->vdev_id, info->he_bss_color.color,
3680
ATH11K_BSS_COLOR_COLLISION_DETECTION_AP_PERIOD_MS,
3681
info->he_bss_color.enabled);
3682
if (ret)
3683
ath11k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n",
3684
arvif->vdev_id, ret);
3685
3686
param_id = WMI_VDEV_PARAM_BSS_COLOR;
3687
if (info->he_bss_color.enabled)
3688
param_value = info->he_bss_color.color <<
3689
IEEE80211_HE_OPERATION_BSS_COLOR_OFFSET;
3690
else
3691
param_value = IEEE80211_HE_OPERATION_BSS_COLOR_DISABLED;
3692
3693
ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3694
param_id,
3695
param_value);
3696
if (ret)
3697
ath11k_warn(ar->ab,
3698
"failed to set bss color param on vdev %i: %d\n",
3699
arvif->vdev_id, ret);
3700
3701
ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3702
"bss color param 0x%x set on vdev %i\n",
3703
param_value, arvif->vdev_id);
3704
} else if (vif->type == NL80211_IFTYPE_STATION) {
3705
ret = ath11k_wmi_send_bss_color_change_enable_cmd(ar,
3706
arvif->vdev_id,
3707
1);
3708
if (ret)
3709
ath11k_warn(ar->ab, "failed to enable bss color change on vdev %i: %d\n",
3710
arvif->vdev_id, ret);
3711
ret = ath11k_wmi_send_obss_color_collision_cfg_cmd(
3712
ar, arvif->vdev_id, 0,
3713
ATH11K_BSS_COLOR_COLLISION_DETECTION_STA_PERIOD_MS, 1);
3714
if (ret)
3715
ath11k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n",
3716
arvif->vdev_id, ret);
3717
}
3718
}
3719
3720
if (changed & BSS_CHANGED_FTM_RESPONDER &&
3721
arvif->ftm_responder != info->ftm_responder &&
3722
test_bit(WMI_TLV_SERVICE_RTT, ar->ab->wmi_ab.svc_map) &&
3723
(vif->type == NL80211_IFTYPE_AP ||
3724
vif->type == NL80211_IFTYPE_MESH_POINT)) {
3725
arvif->ftm_responder = info->ftm_responder;
3726
param = WMI_VDEV_PARAM_ENABLE_DISABLE_RTT_RESPONDER_ROLE;
3727
ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param,
3728
arvif->ftm_responder);
3729
if (ret)
3730
ath11k_warn(ar->ab, "Failed to set ftm responder %i: %d\n",
3731
arvif->vdev_id, ret);
3732
}
3733
3734
if (changed & BSS_CHANGED_FILS_DISCOVERY ||
3735
changed & BSS_CHANGED_UNSOL_BCAST_PROBE_RESP)
3736
ath11k_mac_fils_discovery(arvif, info);
3737
3738
if (changed & BSS_CHANGED_ARP_FILTER) {
3739
ipv4_cnt = min(vif->cfg.arp_addr_cnt, ATH11K_IPV4_MAX_COUNT);
3740
memcpy(arvif->arp_ns_offload.ipv4_addr,
3741
vif->cfg.arp_addr_list,
3742
ipv4_cnt * sizeof(u32));
3743
memcpy(arvif->arp_ns_offload.mac_addr, vif->addr, ETH_ALEN);
3744
arvif->arp_ns_offload.ipv4_count = ipv4_cnt;
3745
3746
ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "arp_addr_cnt %d vif->addr %pM, offload_addr %pI4\n",
3747
vif->cfg.arp_addr_cnt,
3748
vif->addr, arvif->arp_ns_offload.ipv4_addr);
3749
}
3750
3751
mutex_unlock(&ar->conf_mutex);
3752
}
3753
3754
void __ath11k_mac_scan_finish(struct ath11k *ar)
3755
{
3756
lockdep_assert_held(&ar->data_lock);
3757
3758
switch (ar->scan.state) {
3759
case ATH11K_SCAN_IDLE:
3760
break;
3761
case ATH11K_SCAN_RUNNING:
3762
case ATH11K_SCAN_ABORTING:
3763
if (ar->scan.is_roc && ar->scan.roc_notify)
3764
ieee80211_remain_on_channel_expired(ar->hw);
3765
fallthrough;
3766
case ATH11K_SCAN_STARTING:
3767
if (!ar->scan.is_roc) {
3768
struct cfg80211_scan_info info = {
3769
.aborted = ((ar->scan.state ==
3770
ATH11K_SCAN_ABORTING) ||
3771
(ar->scan.state ==
3772
ATH11K_SCAN_STARTING)),
3773
};
3774
3775
ieee80211_scan_completed(ar->hw, &info);
3776
}
3777
3778
ar->scan.state = ATH11K_SCAN_IDLE;
3779
ar->scan_channel = NULL;
3780
ar->scan.roc_freq = 0;
3781
cancel_delayed_work(&ar->scan.timeout);
3782
complete_all(&ar->scan.completed);
3783
break;
3784
}
3785
}
3786
3787
void ath11k_mac_scan_finish(struct ath11k *ar)
3788
{
3789
spin_lock_bh(&ar->data_lock);
3790
__ath11k_mac_scan_finish(ar);
3791
spin_unlock_bh(&ar->data_lock);
3792
}
3793
3794
static int ath11k_scan_stop(struct ath11k *ar)
3795
{
3796
struct scan_cancel_param arg = {
3797
.req_type = WLAN_SCAN_CANCEL_SINGLE,
3798
.scan_id = ATH11K_SCAN_ID,
3799
};
3800
int ret;
3801
3802
lockdep_assert_held(&ar->conf_mutex);
3803
3804
/* TODO: Fill other STOP Params */
3805
arg.pdev_id = ar->pdev->pdev_id;
3806
3807
ret = ath11k_wmi_send_scan_stop_cmd(ar, &arg);
3808
if (ret) {
3809
ath11k_warn(ar->ab, "failed to stop wmi scan: %d\n", ret);
3810
goto out;
3811
}
3812
3813
ret = wait_for_completion_timeout(&ar->scan.completed, 3 * HZ);
3814
if (ret == 0) {
3815
ath11k_warn(ar->ab,
3816
"failed to receive scan abort comple: timed out\n");
3817
ret = -ETIMEDOUT;
3818
} else if (ret > 0) {
3819
ret = 0;
3820
}
3821
3822
out:
3823
/* Scan state should be updated upon scan completion but in case
3824
* firmware fails to deliver the event (for whatever reason) it is
3825
* desired to clean up scan state anyway. Firmware may have just
3826
* dropped the scan completion event delivery due to transport pipe
3827
* being overflown with data and/or it can recover on its own before
3828
* next scan request is submitted.
3829
*/
3830
spin_lock_bh(&ar->data_lock);
3831
if (ar->scan.state != ATH11K_SCAN_IDLE)
3832
__ath11k_mac_scan_finish(ar);
3833
spin_unlock_bh(&ar->data_lock);
3834
3835
return ret;
3836
}
3837
3838
static void ath11k_scan_abort(struct ath11k *ar)
3839
{
3840
int ret;
3841
3842
lockdep_assert_held(&ar->conf_mutex);
3843
3844
spin_lock_bh(&ar->data_lock);
3845
3846
switch (ar->scan.state) {
3847
case ATH11K_SCAN_IDLE:
3848
/* This can happen if timeout worker kicked in and called
3849
* abortion while scan completion was being processed.
3850
*/
3851
break;
3852
case ATH11K_SCAN_STARTING:
3853
case ATH11K_SCAN_ABORTING:
3854
ath11k_warn(ar->ab, "refusing scan abortion due to invalid scan state: %d\n",
3855
ar->scan.state);
3856
break;
3857
case ATH11K_SCAN_RUNNING:
3858
ar->scan.state = ATH11K_SCAN_ABORTING;
3859
spin_unlock_bh(&ar->data_lock);
3860
3861
ret = ath11k_scan_stop(ar);
3862
if (ret)
3863
ath11k_warn(ar->ab, "failed to abort scan: %d\n", ret);
3864
3865
spin_lock_bh(&ar->data_lock);
3866
break;
3867
}
3868
3869
spin_unlock_bh(&ar->data_lock);
3870
}
3871
3872
static void ath11k_scan_timeout_work(struct work_struct *work)
3873
{
3874
struct ath11k *ar = container_of(work, struct ath11k,
3875
scan.timeout.work);
3876
3877
mutex_lock(&ar->conf_mutex);
3878
ath11k_scan_abort(ar);
3879
mutex_unlock(&ar->conf_mutex);
3880
}
3881
3882
static int ath11k_start_scan(struct ath11k *ar,
3883
struct scan_req_params *arg)
3884
{
3885
int ret;
3886
unsigned long timeout = 1 * HZ;
3887
3888
lockdep_assert_held(&ar->conf_mutex);
3889
3890
if (ath11k_spectral_get_mode(ar) == ATH11K_SPECTRAL_BACKGROUND)
3891
ath11k_spectral_reset_buffer(ar);
3892
3893
ret = ath11k_wmi_send_scan_start_cmd(ar, arg);
3894
if (ret)
3895
return ret;
3896
3897
if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map)) {
3898
timeout = 5 * HZ;
3899
3900
if (ar->supports_6ghz)
3901
timeout += 5 * HZ;
3902
}
3903
3904
ret = wait_for_completion_timeout(&ar->scan.started, timeout);
3905
if (ret == 0) {
3906
ret = ath11k_scan_stop(ar);
3907
if (ret)
3908
ath11k_warn(ar->ab, "failed to stop scan: %d\n", ret);
3909
3910
return -ETIMEDOUT;
3911
}
3912
3913
/* If we failed to start the scan, return error code at
3914
* this point. This is probably due to some issue in the
3915
* firmware, but no need to wedge the driver due to that...
3916
*/
3917
spin_lock_bh(&ar->data_lock);
3918
if (ar->scan.state == ATH11K_SCAN_IDLE) {
3919
spin_unlock_bh(&ar->data_lock);
3920
return -EINVAL;
3921
}
3922
spin_unlock_bh(&ar->data_lock);
3923
3924
return 0;
3925
}
3926
3927
static int ath11k_mac_op_hw_scan(struct ieee80211_hw *hw,
3928
struct ieee80211_vif *vif,
3929
struct ieee80211_scan_request *hw_req)
3930
{
3931
struct ath11k *ar = hw->priv;
3932
struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
3933
struct cfg80211_scan_request *req = &hw_req->req;
3934
struct scan_req_params *arg = NULL;
3935
int ret = 0;
3936
int i;
3937
u32 scan_timeout;
3938
3939
/* Firmwares advertising the support of triggering 11D algorithm
3940
* on the scan results of a regular scan expects driver to send
3941
* WMI_11D_SCAN_START_CMDID before sending WMI_START_SCAN_CMDID.
3942
* With this feature, separate 11D scan can be avoided since
3943
* regdomain can be determined with the scan results of the
3944
* regular scan.
3945
*/
3946
if (ar->state_11d == ATH11K_11D_PREPARING &&
3947
test_bit(WMI_TLV_SERVICE_SUPPORT_11D_FOR_HOST_SCAN,
3948
ar->ab->wmi_ab.svc_map))
3949
ath11k_mac_11d_scan_start(ar, arvif->vdev_id);
3950
3951
mutex_lock(&ar->conf_mutex);
3952
3953
spin_lock_bh(&ar->data_lock);
3954
switch (ar->scan.state) {
3955
case ATH11K_SCAN_IDLE:
3956
reinit_completion(&ar->scan.started);
3957
reinit_completion(&ar->scan.completed);
3958
ar->scan.state = ATH11K_SCAN_STARTING;
3959
ar->scan.is_roc = false;
3960
ar->scan.vdev_id = arvif->vdev_id;
3961
ret = 0;
3962
break;
3963
case ATH11K_SCAN_STARTING:
3964
case ATH11K_SCAN_RUNNING:
3965
case ATH11K_SCAN_ABORTING:
3966
ret = -EBUSY;
3967
break;
3968
}
3969
spin_unlock_bh(&ar->data_lock);
3970
3971
if (ret)
3972
goto exit;
3973
3974
arg = kzalloc(sizeof(*arg), GFP_KERNEL);
3975
3976
if (!arg) {
3977
ret = -ENOMEM;
3978
goto exit;
3979
}
3980
3981
ath11k_wmi_start_scan_init(ar, arg);
3982
arg->vdev_id = arvif->vdev_id;
3983
arg->scan_id = ATH11K_SCAN_ID;
3984
3985
if (req->ie_len) {
3986
arg->extraie.ptr = kmemdup(req->ie, req->ie_len, GFP_KERNEL);
3987
if (!arg->extraie.ptr) {
3988
ret = -ENOMEM;
3989
goto exit;
3990
}
3991
arg->extraie.len = req->ie_len;
3992
}
3993
3994
if (req->n_ssids) {
3995
arg->num_ssids = req->n_ssids;
3996
for (i = 0; i < arg->num_ssids; i++) {
3997
arg->ssid[i].length = req->ssids[i].ssid_len;
3998
memcpy(&arg->ssid[i].ssid, req->ssids[i].ssid,
3999
req->ssids[i].ssid_len);
4000
}
4001
} else {
4002
arg->scan_flags |= WMI_SCAN_FLAG_PASSIVE;
4003
}
4004
4005
if (req->n_channels) {
4006
arg->num_chan = req->n_channels;
4007
arg->chan_list = kcalloc(arg->num_chan, sizeof(*arg->chan_list),
4008
GFP_KERNEL);
4009
4010
if (!arg->chan_list) {
4011
ret = -ENOMEM;
4012
goto exit;
4013
}
4014
4015
for (i = 0; i < arg->num_chan; i++) {
4016
if (test_bit(WMI_TLV_SERVICE_SCAN_CONFIG_PER_CHANNEL,
4017
ar->ab->wmi_ab.svc_map)) {
4018
arg->chan_list[i] =
4019
u32_encode_bits(req->channels[i]->center_freq,
4020
WMI_SCAN_CONFIG_PER_CHANNEL_MASK);
4021
4022
/* If NL80211_SCAN_FLAG_COLOCATED_6GHZ is set in scan
4023
* flags, then scan all PSC channels in 6 GHz band and
4024
* those non-PSC channels where RNR IE is found during
4025
* the legacy 2.4/5 GHz scan.
4026
* If NL80211_SCAN_FLAG_COLOCATED_6GHZ is not set,
4027
* then all channels in 6 GHz will be scanned.
4028
*/
4029
if (req->channels[i]->band == NL80211_BAND_6GHZ &&
4030
req->flags & NL80211_SCAN_FLAG_COLOCATED_6GHZ &&
4031
!cfg80211_channel_is_psc(req->channels[i]))
4032
arg->chan_list[i] |=
4033
WMI_SCAN_CH_FLAG_SCAN_ONLY_IF_RNR_FOUND;
4034
} else {
4035
arg->chan_list[i] = req->channels[i]->center_freq;
4036
}
4037
}
4038
}
4039
4040
if (req->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
4041
arg->scan_f_add_spoofed_mac_in_probe = 1;
4042
ether_addr_copy(arg->mac_addr.addr, req->mac_addr);
4043
ether_addr_copy(arg->mac_mask.addr, req->mac_addr_mask);
4044
}
4045
4046
/* if duration is set, default dwell times will be overwritten */
4047
if (req->duration) {
4048
arg->dwell_time_active = req->duration;
4049
arg->dwell_time_active_2g = req->duration;
4050
arg->dwell_time_active_6g = req->duration;
4051
arg->dwell_time_passive = req->duration;
4052
arg->dwell_time_passive_6g = req->duration;
4053
arg->burst_duration = req->duration;
4054
4055
scan_timeout = min_t(u32, arg->max_rest_time *
4056
(arg->num_chan - 1) + (req->duration +
4057
ATH11K_SCAN_CHANNEL_SWITCH_WMI_EVT_OVERHEAD) *
4058
arg->num_chan, arg->max_scan_time);
4059
} else {
4060
scan_timeout = arg->max_scan_time;
4061
}
4062
4063
/* Add a margin to account for event/command processing */
4064
scan_timeout += ATH11K_MAC_SCAN_CMD_EVT_OVERHEAD;
4065
4066
ret = ath11k_start_scan(ar, arg);
4067
if (ret) {
4068
ath11k_warn(ar->ab, "failed to start hw scan: %d\n", ret);
4069
spin_lock_bh(&ar->data_lock);
4070
ar->scan.state = ATH11K_SCAN_IDLE;
4071
spin_unlock_bh(&ar->data_lock);
4072
}
4073
4074
ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
4075
msecs_to_jiffies(scan_timeout));
4076
4077
exit:
4078
if (arg) {
4079
kfree(arg->chan_list);
4080
kfree(arg->extraie.ptr);
4081
kfree(arg);
4082
}
4083
4084
mutex_unlock(&ar->conf_mutex);
4085
4086
if (ar->state_11d == ATH11K_11D_PREPARING)
4087
ath11k_mac_11d_scan_start(ar, arvif->vdev_id);
4088
4089
return ret;
4090
}
4091
4092
static void ath11k_mac_op_cancel_hw_scan(struct ieee80211_hw *hw,
4093
struct ieee80211_vif *vif)
4094
{
4095
struct ath11k *ar = hw->priv;
4096
4097
mutex_lock(&ar->conf_mutex);
4098
ath11k_scan_abort(ar);
4099
mutex_unlock(&ar->conf_mutex);
4100
4101
cancel_delayed_work_sync(&ar->scan.timeout);
4102
}
4103
4104
static int ath11k_install_key(struct ath11k_vif *arvif,
4105
struct ieee80211_key_conf *key,
4106
enum set_key_cmd cmd,
4107
const u8 *macaddr, u32 flags)
4108
{
4109
int ret;
4110
struct ath11k *ar = arvif->ar;
4111
struct wmi_vdev_install_key_arg arg = {
4112
.vdev_id = arvif->vdev_id,
4113
.key_idx = key->keyidx,
4114
.key_len = key->keylen,
4115
.key_data = key->key,
4116
.key_flags = flags,
4117
.macaddr = macaddr,
4118
};
4119
4120
lockdep_assert_held(&arvif->ar->conf_mutex);
4121
4122
reinit_completion(&ar->install_key_done);
4123
4124
if (test_bit(ATH11K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags))
4125
return 0;
4126
4127
if (cmd == DISABLE_KEY) {
4128
arg.key_cipher = WMI_CIPHER_NONE;
4129
arg.key_data = NULL;
4130
goto install;
4131
}
4132
4133
switch (key->cipher) {
4134
case WLAN_CIPHER_SUITE_CCMP:
4135
arg.key_cipher = WMI_CIPHER_AES_CCM;
4136
/* TODO: Re-check if flag is valid */
4137
key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT;
4138
break;
4139
case WLAN_CIPHER_SUITE_TKIP:
4140
arg.key_cipher = WMI_CIPHER_TKIP;
4141
arg.key_txmic_len = 8;
4142
arg.key_rxmic_len = 8;
4143
break;
4144
case WLAN_CIPHER_SUITE_CCMP_256:
4145
arg.key_cipher = WMI_CIPHER_AES_CCM;
4146
break;
4147
case WLAN_CIPHER_SUITE_GCMP:
4148
case WLAN_CIPHER_SUITE_GCMP_256:
4149
arg.key_cipher = WMI_CIPHER_AES_GCM;
4150
break;
4151
default:
4152
ath11k_warn(ar->ab, "cipher %d is not supported\n", key->cipher);
4153
return -EOPNOTSUPP;
4154
}
4155
4156
if (test_bit(ATH11K_FLAG_RAW_MODE, &ar->ab->dev_flags))
4157
key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV |
4158
IEEE80211_KEY_FLAG_RESERVE_TAILROOM;
4159
4160
install:
4161
ret = ath11k_wmi_vdev_install_key(arvif->ar, &arg);
4162
4163
if (ret)
4164
return ret;
4165
4166
if (!wait_for_completion_timeout(&ar->install_key_done, 1 * HZ))
4167
return -ETIMEDOUT;
4168
4169
return ar->install_key_status ? -EINVAL : 0;
4170
}
4171
4172
static int ath11k_clear_peer_keys(struct ath11k_vif *arvif,
4173
const u8 *addr)
4174
{
4175
struct ath11k *ar = arvif->ar;
4176
struct ath11k_base *ab = ar->ab;
4177
struct ath11k_peer *peer;
4178
int first_errno = 0;
4179
int ret;
4180
int i;
4181
u32 flags = 0;
4182
4183
lockdep_assert_held(&ar->conf_mutex);
4184
4185
spin_lock_bh(&ab->base_lock);
4186
peer = ath11k_peer_find(ab, arvif->vdev_id, addr);
4187
spin_unlock_bh(&ab->base_lock);
4188
4189
if (!peer)
4190
return -ENOENT;
4191
4192
for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
4193
if (!peer->keys[i])
4194
continue;
4195
4196
/* key flags are not required to delete the key */
4197
ret = ath11k_install_key(arvif, peer->keys[i],
4198
DISABLE_KEY, addr, flags);
4199
if (ret < 0 && first_errno == 0)
4200
first_errno = ret;
4201
4202
if (ret < 0)
4203
ath11k_warn(ab, "failed to remove peer key %d: %d\n",
4204
i, ret);
4205
4206
spin_lock_bh(&ab->base_lock);
4207
peer->keys[i] = NULL;
4208
spin_unlock_bh(&ab->base_lock);
4209
}
4210
4211
return first_errno;
4212
}
4213
4214
static int ath11k_mac_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
4215
struct ieee80211_vif *vif, struct ieee80211_sta *sta,
4216
struct ieee80211_key_conf *key)
4217
{
4218
struct ath11k *ar = hw->priv;
4219
struct ath11k_base *ab = ar->ab;
4220
struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
4221
struct ath11k_peer *peer;
4222
struct ath11k_sta *arsta;
4223
const u8 *peer_addr;
4224
int ret = 0;
4225
u32 flags = 0;
4226
4227
/* BIP needs to be done in software */
4228
if (key->cipher == WLAN_CIPHER_SUITE_AES_CMAC ||
4229
key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_128 ||
4230
key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_256 ||
4231
key->cipher == WLAN_CIPHER_SUITE_BIP_CMAC_256)
4232
return 1;
4233
4234
if (test_bit(ATH11K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags))
4235
return 1;
4236
4237
if (key->keyidx > WMI_MAX_KEY_INDEX)
4238
return -ENOSPC;
4239
4240
mutex_lock(&ar->conf_mutex);
4241
4242
if (sta)
4243
peer_addr = sta->addr;
4244
else if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
4245
peer_addr = vif->bss_conf.bssid;
4246
else
4247
peer_addr = vif->addr;
4248
4249
key->hw_key_idx = key->keyidx;
4250
4251
/* the peer should not disappear in mid-way (unless FW goes awry) since
4252
* we already hold conf_mutex. we just make sure its there now.
4253
*/
4254
spin_lock_bh(&ab->base_lock);
4255
peer = ath11k_peer_find(ab, arvif->vdev_id, peer_addr);
4256
4257
/* flush the fragments cache during key (re)install to
4258
* ensure all frags in the new frag list belong to the same key.
4259
*/
4260
if (peer && sta && cmd == SET_KEY)
4261
ath11k_peer_frags_flush(ar, peer);
4262
spin_unlock_bh(&ab->base_lock);
4263
4264
if (!peer) {
4265
if (cmd == SET_KEY) {
4266
ath11k_warn(ab, "cannot install key for non-existent peer %pM\n",
4267
peer_addr);
4268
ret = -EOPNOTSUPP;
4269
goto exit;
4270
} else {
4271
/* if the peer doesn't exist there is no key to disable
4272
* anymore
4273
*/
4274
goto exit;
4275
}
4276
}
4277
4278
if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
4279
flags |= WMI_KEY_PAIRWISE;
4280
else
4281
flags |= WMI_KEY_GROUP;
4282
4283
ret = ath11k_install_key(arvif, key, cmd, peer_addr, flags);
4284
if (ret) {
4285
ath11k_warn(ab, "ath11k_install_key failed (%d)\n", ret);
4286
goto exit;
4287
}
4288
4289
ret = ath11k_dp_peer_rx_pn_replay_config(arvif, peer_addr, cmd, key);
4290
if (ret) {
4291
ath11k_warn(ab, "failed to offload PN replay detection %d\n", ret);
4292
goto exit;
4293
}
4294
4295
spin_lock_bh(&ab->base_lock);
4296
peer = ath11k_peer_find(ab, arvif->vdev_id, peer_addr);
4297
if (peer && cmd == SET_KEY) {
4298
peer->keys[key->keyidx] = key;
4299
if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) {
4300
peer->ucast_keyidx = key->keyidx;
4301
peer->sec_type = ath11k_dp_tx_get_encrypt_type(key->cipher);
4302
} else {
4303
peer->mcast_keyidx = key->keyidx;
4304
peer->sec_type_grp = ath11k_dp_tx_get_encrypt_type(key->cipher);
4305
}
4306
} else if (peer && cmd == DISABLE_KEY) {
4307
peer->keys[key->keyidx] = NULL;
4308
if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
4309
peer->ucast_keyidx = 0;
4310
else
4311
peer->mcast_keyidx = 0;
4312
} else if (!peer)
4313
/* impossible unless FW goes crazy */
4314
ath11k_warn(ab, "peer %pM disappeared!\n", peer_addr);
4315
4316
if (sta) {
4317
arsta = (struct ath11k_sta *)sta->drv_priv;
4318
4319
switch (key->cipher) {
4320
case WLAN_CIPHER_SUITE_TKIP:
4321
case WLAN_CIPHER_SUITE_CCMP:
4322
case WLAN_CIPHER_SUITE_CCMP_256:
4323
case WLAN_CIPHER_SUITE_GCMP:
4324
case WLAN_CIPHER_SUITE_GCMP_256:
4325
if (cmd == SET_KEY)
4326
arsta->pn_type = HAL_PN_TYPE_WPA;
4327
else
4328
arsta->pn_type = HAL_PN_TYPE_NONE;
4329
break;
4330
default:
4331
arsta->pn_type = HAL_PN_TYPE_NONE;
4332
break;
4333
}
4334
}
4335
4336
spin_unlock_bh(&ab->base_lock);
4337
4338
exit:
4339
mutex_unlock(&ar->conf_mutex);
4340
return ret;
4341
}
4342
4343
static int
4344
ath11k_mac_bitrate_mask_num_ht_rates(struct ath11k *ar,
4345
enum nl80211_band band,
4346
const struct cfg80211_bitrate_mask *mask)
4347
{
4348
int num_rates = 0;
4349
int i;
4350
4351
for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++)
4352
num_rates += hweight8(mask->control[band].ht_mcs[i]);
4353
4354
return num_rates;
4355
}
4356
4357
static int
4358
ath11k_mac_bitrate_mask_num_vht_rates(struct ath11k *ar,
4359
enum nl80211_band band,
4360
const struct cfg80211_bitrate_mask *mask)
4361
{
4362
int num_rates = 0;
4363
int i;
4364
4365
for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++)
4366
num_rates += hweight16(mask->control[band].vht_mcs[i]);
4367
4368
return num_rates;
4369
}
4370
4371
static int
4372
ath11k_mac_bitrate_mask_num_he_rates(struct ath11k *ar,
4373
enum nl80211_band band,
4374
const struct cfg80211_bitrate_mask *mask)
4375
{
4376
int num_rates = 0;
4377
int i;
4378
4379
for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++)
4380
num_rates += hweight16(mask->control[band].he_mcs[i]);
4381
4382
return num_rates;
4383
}
4384
4385
static int
4386
ath11k_mac_set_peer_vht_fixed_rate(struct ath11k_vif *arvif,
4387
struct ieee80211_sta *sta,
4388
const struct cfg80211_bitrate_mask *mask,
4389
enum nl80211_band band)
4390
{
4391
struct ath11k *ar = arvif->ar;
4392
u8 vht_rate, nss;
4393
u32 rate_code;
4394
int ret, i;
4395
4396
lockdep_assert_held(&ar->conf_mutex);
4397
4398
nss = 0;
4399
4400
for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
4401
if (hweight16(mask->control[band].vht_mcs[i]) == 1) {
4402
nss = i + 1;
4403
vht_rate = ffs(mask->control[band].vht_mcs[i]) - 1;
4404
}
4405
}
4406
4407
if (!nss) {
4408
ath11k_warn(ar->ab, "No single VHT Fixed rate found to set for %pM",
4409
sta->addr);
4410
return -EINVAL;
4411
}
4412
4413
/* Avoid updating invalid nss as fixed rate*/
4414
if (nss > sta->deflink.rx_nss)
4415
return -EINVAL;
4416
4417
ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
4418
"Setting Fixed VHT Rate for peer %pM. Device will not switch to any other selected rates",
4419
sta->addr);
4420
4421
rate_code = ATH11K_HW_RATE_CODE(vht_rate, nss - 1,
4422
WMI_RATE_PREAMBLE_VHT);
4423
ret = ath11k_wmi_set_peer_param(ar, sta->addr,
4424
arvif->vdev_id,
4425
WMI_PEER_PARAM_FIXED_RATE,
4426
rate_code);
4427
if (ret)
4428
ath11k_warn(ar->ab,
4429
"failed to update STA %pM Fixed Rate %d: %d\n",
4430
sta->addr, rate_code, ret);
4431
4432
return ret;
4433
}
4434
4435
static int
4436
ath11k_mac_set_peer_he_fixed_rate(struct ath11k_vif *arvif,
4437
struct ieee80211_sta *sta,
4438
const struct cfg80211_bitrate_mask *mask,
4439
enum nl80211_band band)
4440
{
4441
struct ath11k *ar = arvif->ar;
4442
u8 he_rate, nss;
4443
u32 rate_code;
4444
int ret, i;
4445
4446
lockdep_assert_held(&ar->conf_mutex);
4447
4448
nss = 0;
4449
4450
for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) {
4451
if (hweight16(mask->control[band].he_mcs[i]) == 1) {
4452
nss = i + 1;
4453
he_rate = ffs(mask->control[band].he_mcs[i]) - 1;
4454
}
4455
}
4456
4457
if (!nss) {
4458
ath11k_warn(ar->ab, "No single he fixed rate found to set for %pM",
4459
sta->addr);
4460
return -EINVAL;
4461
}
4462
4463
/* Avoid updating invalid nss as fixed rate */
4464
if (nss > sta->deflink.rx_nss)
4465
return -EINVAL;
4466
4467
ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
4468
"setting fixed he rate for peer %pM, device will not switch to any other selected rates",
4469
sta->addr);
4470
4471
rate_code = ATH11K_HW_RATE_CODE(he_rate, nss - 1,
4472
WMI_RATE_PREAMBLE_HE);
4473
4474
ret = ath11k_wmi_set_peer_param(ar, sta->addr,
4475
arvif->vdev_id,
4476
WMI_PEER_PARAM_FIXED_RATE,
4477
rate_code);
4478
if (ret)
4479
ath11k_warn(ar->ab,
4480
"failed to update sta %pM fixed rate %d: %d\n",
4481
sta->addr, rate_code, ret);
4482
4483
return ret;
4484
}
4485
4486
static int
4487
ath11k_mac_set_peer_ht_fixed_rate(struct ath11k_vif *arvif,
4488
struct ieee80211_sta *sta,
4489
const struct cfg80211_bitrate_mask *mask,
4490
enum nl80211_band band)
4491
{
4492
struct ath11k *ar = arvif->ar;
4493
u8 ht_rate, nss = 0;
4494
u32 rate_code;
4495
int ret, i;
4496
4497
lockdep_assert_held(&ar->conf_mutex);
4498
4499
for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) {
4500
if (hweight8(mask->control[band].ht_mcs[i]) == 1) {
4501
nss = i + 1;
4502
ht_rate = ffs(mask->control[band].ht_mcs[i]) - 1;
4503
}
4504
}
4505
4506
if (!nss) {
4507
ath11k_warn(ar->ab, "No single HT Fixed rate found to set for %pM",
4508
sta->addr);
4509
return -EINVAL;
4510
}
4511
4512
/* Avoid updating invalid nss as fixed rate*/
4513
if (nss > sta->deflink.rx_nss)
4514
return -EINVAL;
4515
4516
ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
4517
"Setting Fixed HT Rate for peer %pM. Device will not switch to any other selected rates",
4518
sta->addr);
4519
4520
rate_code = ATH11K_HW_RATE_CODE(ht_rate, nss - 1,
4521
WMI_RATE_PREAMBLE_HT);
4522
ret = ath11k_wmi_set_peer_param(ar, sta->addr,
4523
arvif->vdev_id,
4524
WMI_PEER_PARAM_FIXED_RATE,
4525
rate_code);
4526
if (ret)
4527
ath11k_warn(ar->ab,
4528
"failed to update STA %pM HT Fixed Rate %d: %d\n",
4529
sta->addr, rate_code, ret);
4530
4531
return ret;
4532
}
4533
4534
static int ath11k_station_assoc(struct ath11k *ar,
4535
struct ieee80211_vif *vif,
4536
struct ieee80211_sta *sta,
4537
bool reassoc)
4538
{
4539
struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
4540
struct peer_assoc_params peer_arg;
4541
int ret = 0;
4542
struct cfg80211_chan_def def;
4543
enum nl80211_band band;
4544
struct cfg80211_bitrate_mask *mask;
4545
u8 num_ht_rates, num_vht_rates, num_he_rates;
4546
4547
lockdep_assert_held(&ar->conf_mutex);
4548
4549
if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
4550
return -EPERM;
4551
4552
band = def.chan->band;
4553
mask = &arvif->bitrate_mask;
4554
4555
ath11k_peer_assoc_prepare(ar, vif, sta, &peer_arg, reassoc);
4556
4557
peer_arg.is_assoc = true;
4558
ret = ath11k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
4559
if (ret) {
4560
ath11k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n",
4561
sta->addr, arvif->vdev_id, ret);
4562
return ret;
4563
}
4564
4565
if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) {
4566
ath11k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
4567
sta->addr, arvif->vdev_id);
4568
return -ETIMEDOUT;
4569
}
4570
4571
num_vht_rates = ath11k_mac_bitrate_mask_num_vht_rates(ar, band, mask);
4572
num_he_rates = ath11k_mac_bitrate_mask_num_he_rates(ar, band, mask);
4573
num_ht_rates = ath11k_mac_bitrate_mask_num_ht_rates(ar, band, mask);
4574
4575
/* If single VHT/HE rate is configured (by set_bitrate_mask()),
4576
* peer_assoc will disable VHT/HE. This is now enabled by a peer specific
4577
* fixed param.
4578
* Note that all other rates and NSS will be disabled for this peer.
4579
*/
4580
if (sta->deflink.vht_cap.vht_supported && num_vht_rates == 1) {
4581
ret = ath11k_mac_set_peer_vht_fixed_rate(arvif, sta, mask,
4582
band);
4583
if (ret)
4584
return ret;
4585
} else if (sta->deflink.he_cap.has_he && num_he_rates == 1) {
4586
ret = ath11k_mac_set_peer_he_fixed_rate(arvif, sta, mask,
4587
band);
4588
if (ret)
4589
return ret;
4590
} else if (sta->deflink.ht_cap.ht_supported && num_ht_rates == 1) {
4591
ret = ath11k_mac_set_peer_ht_fixed_rate(arvif, sta, mask,
4592
band);
4593
if (ret)
4594
return ret;
4595
}
4596
4597
/* Re-assoc is run only to update supported rates for given station. It
4598
* doesn't make much sense to reconfigure the peer completely.
4599
*/
4600
if (reassoc)
4601
return 0;
4602
4603
ret = ath11k_setup_peer_smps(ar, arvif, sta->addr,
4604
&sta->deflink.ht_cap,
4605
le16_to_cpu(sta->deflink.he_6ghz_capa.capa));
4606
if (ret) {
4607
ath11k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n",
4608
arvif->vdev_id, ret);
4609
return ret;
4610
}
4611
4612
if (!sta->wme) {
4613
arvif->num_legacy_stations++;
4614
ret = ath11k_recalc_rtscts_prot(arvif);
4615
if (ret)
4616
return ret;
4617
}
4618
4619
if (sta->wme && sta->uapsd_queues) {
4620
ret = ath11k_peer_assoc_qos_ap(ar, arvif, sta);
4621
if (ret) {
4622
ath11k_warn(ar->ab, "failed to set qos params for STA %pM for vdev %i: %d\n",
4623
sta->addr, arvif->vdev_id, ret);
4624
return ret;
4625
}
4626
}
4627
4628
return 0;
4629
}
4630
4631
static int ath11k_station_disassoc(struct ath11k *ar,
4632
struct ieee80211_vif *vif,
4633
struct ieee80211_sta *sta)
4634
{
4635
struct ath11k_vif *arvif = (void *)vif->drv_priv;
4636
int ret = 0;
4637
4638
lockdep_assert_held(&ar->conf_mutex);
4639
4640
if (!sta->wme) {
4641
arvif->num_legacy_stations--;
4642
ret = ath11k_recalc_rtscts_prot(arvif);
4643
if (ret)
4644
return ret;
4645
}
4646
4647
ret = ath11k_clear_peer_keys(arvif, sta->addr);
4648
if (ret) {
4649
ath11k_warn(ar->ab, "failed to clear all peer keys for vdev %i: %d\n",
4650
arvif->vdev_id, ret);
4651
return ret;
4652
}
4653
return 0;
4654
}
4655
4656
static void ath11k_sta_rc_update_wk(struct work_struct *wk)
4657
{
4658
struct ath11k *ar;
4659
struct ath11k_vif *arvif;
4660
struct ath11k_sta *arsta;
4661
struct ieee80211_sta *sta;
4662
struct cfg80211_chan_def def;
4663
enum nl80211_band band;
4664
const u8 *ht_mcs_mask;
4665
const u16 *vht_mcs_mask;
4666
const u16 *he_mcs_mask;
4667
u32 changed, bw, nss, smps, bw_prev;
4668
int err, num_ht_rates, num_vht_rates, num_he_rates;
4669
const struct cfg80211_bitrate_mask *mask;
4670
struct peer_assoc_params peer_arg;
4671
enum wmi_phy_mode peer_phymode;
4672
4673
arsta = container_of(wk, struct ath11k_sta, update_wk);
4674
sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv);
4675
arvif = arsta->arvif;
4676
ar = arvif->ar;
4677
4678
if (WARN_ON(ath11k_mac_vif_chan(arvif->vif, &def)))
4679
return;
4680
4681
band = def.chan->band;
4682
ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
4683
vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
4684
he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs;
4685
4686
spin_lock_bh(&ar->data_lock);
4687
4688
changed = arsta->changed;
4689
arsta->changed = 0;
4690
4691
bw = arsta->bw;
4692
bw_prev = arsta->bw_prev;
4693
nss = arsta->nss;
4694
smps = arsta->smps;
4695
4696
spin_unlock_bh(&ar->data_lock);
4697
4698
mutex_lock(&ar->conf_mutex);
4699
4700
nss = max_t(u32, 1, nss);
4701
nss = min(nss, max(max(ath11k_mac_max_ht_nss(ht_mcs_mask),
4702
ath11k_mac_max_vht_nss(vht_mcs_mask)),
4703
ath11k_mac_max_he_nss(he_mcs_mask)));
4704
4705
if (changed & IEEE80211_RC_BW_CHANGED) {
4706
/* Get the peer phymode */
4707
ath11k_peer_assoc_h_phymode(ar, arvif->vif, sta, &peer_arg);
4708
peer_phymode = peer_arg.peer_phymode;
4709
4710
ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "update sta %pM peer bw %d phymode %d\n",
4711
sta->addr, bw, peer_phymode);
4712
4713
if (bw > bw_prev) {
4714
/* BW is upgraded. In this case we send WMI_PEER_PHYMODE
4715
* followed by WMI_PEER_CHWIDTH
4716
*/
4717
ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "BW upgrade for sta %pM new BW %d, old BW %d\n",
4718
sta->addr, bw, bw_prev);
4719
4720
err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
4721
WMI_PEER_PHYMODE, peer_phymode);
4722
4723
if (err) {
4724
ath11k_warn(ar->ab, "failed to update STA %pM peer phymode %d: %d\n",
4725
sta->addr, peer_phymode, err);
4726
goto err_rc_bw_changed;
4727
}
4728
4729
err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
4730
WMI_PEER_CHWIDTH, bw);
4731
4732
if (err)
4733
ath11k_warn(ar->ab, "failed to update STA %pM peer bw %d: %d\n",
4734
sta->addr, bw, err);
4735
} else {
4736
/* BW is downgraded. In this case we send WMI_PEER_CHWIDTH
4737
* followed by WMI_PEER_PHYMODE
4738
*/
4739
ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "BW downgrade for sta %pM new BW %d,old BW %d\n",
4740
sta->addr, bw, bw_prev);
4741
4742
err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
4743
WMI_PEER_CHWIDTH, bw);
4744
4745
if (err) {
4746
ath11k_warn(ar->ab, "failed to update STA %pM peer bw %d: %d\n",
4747
sta->addr, bw, err);
4748
goto err_rc_bw_changed;
4749
}
4750
4751
err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
4752
WMI_PEER_PHYMODE, peer_phymode);
4753
4754
if (err)
4755
ath11k_warn(ar->ab, "failed to update STA %pM peer phymode %d: %d\n",
4756
sta->addr, peer_phymode, err);
4757
}
4758
}
4759
4760
if (changed & IEEE80211_RC_NSS_CHANGED) {
4761
ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "update sta %pM nss %d\n",
4762
sta->addr, nss);
4763
4764
err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
4765
WMI_PEER_NSS, nss);
4766
if (err)
4767
ath11k_warn(ar->ab, "failed to update STA %pM nss %d: %d\n",
4768
sta->addr, nss, err);
4769
}
4770
4771
if (changed & IEEE80211_RC_SMPS_CHANGED) {
4772
ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "update sta %pM smps %d\n",
4773
sta->addr, smps);
4774
4775
err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
4776
WMI_PEER_MIMO_PS_STATE, smps);
4777
if (err)
4778
ath11k_warn(ar->ab, "failed to update STA %pM smps %d: %d\n",
4779
sta->addr, smps, err);
4780
}
4781
4782
if (changed & IEEE80211_RC_SUPP_RATES_CHANGED) {
4783
mask = &arvif->bitrate_mask;
4784
num_ht_rates = ath11k_mac_bitrate_mask_num_ht_rates(ar, band,
4785
mask);
4786
num_vht_rates = ath11k_mac_bitrate_mask_num_vht_rates(ar, band,
4787
mask);
4788
num_he_rates = ath11k_mac_bitrate_mask_num_he_rates(ar, band,
4789
mask);
4790
4791
/* Peer_assoc_prepare will reject vht rates in
4792
* bitrate_mask if its not available in range format and
4793
* sets vht tx_rateset as unsupported. So multiple VHT MCS
4794
* setting(eg. MCS 4,5,6) per peer is not supported here.
4795
* But, Single rate in VHT mask can be set as per-peer
4796
* fixed rate. But even if any HT rates are configured in
4797
* the bitrate mask, device will not switch to those rates
4798
* when per-peer Fixed rate is set.
4799
* TODO: Check RATEMASK_CMDID to support auto rates selection
4800
* across HT/VHT and for multiple VHT MCS support.
4801
*/
4802
if (sta->deflink.vht_cap.vht_supported && num_vht_rates == 1) {
4803
ath11k_mac_set_peer_vht_fixed_rate(arvif, sta, mask,
4804
band);
4805
} else if (sta->deflink.he_cap.has_he && num_he_rates == 1) {
4806
ath11k_mac_set_peer_he_fixed_rate(arvif, sta, mask,
4807
band);
4808
} else if (sta->deflink.ht_cap.ht_supported && num_ht_rates == 1) {
4809
ath11k_mac_set_peer_ht_fixed_rate(arvif, sta, mask,
4810
band);
4811
} else {
4812
/* If the peer is non-VHT/HE or no fixed VHT/HE rate
4813
* is provided in the new bitrate mask we set the
4814
* other rates using peer_assoc command. Also clear
4815
* the peer fixed rate settings as it has higher proprity
4816
* than peer assoc
4817
*/
4818
err = ath11k_wmi_set_peer_param(ar, sta->addr,
4819
arvif->vdev_id,
4820
WMI_PEER_PARAM_FIXED_RATE,
4821
WMI_FIXED_RATE_NONE);
4822
if (err)
4823
ath11k_warn(ar->ab,
4824
"failed to disable peer fixed rate for sta %pM: %d\n",
4825
sta->addr, err);
4826
4827
ath11k_peer_assoc_prepare(ar, arvif->vif, sta,
4828
&peer_arg, true);
4829
4830
peer_arg.is_assoc = false;
4831
err = ath11k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
4832
if (err)
4833
ath11k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n",
4834
sta->addr, arvif->vdev_id, err);
4835
4836
if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ))
4837
ath11k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
4838
sta->addr, arvif->vdev_id);
4839
}
4840
}
4841
4842
err_rc_bw_changed:
4843
mutex_unlock(&ar->conf_mutex);
4844
}
4845
4846
static void ath11k_sta_set_4addr_wk(struct work_struct *wk)
4847
{
4848
struct ath11k *ar;
4849
struct ath11k_vif *arvif;
4850
struct ath11k_sta *arsta;
4851
struct ieee80211_sta *sta;
4852
int ret = 0;
4853
4854
arsta = container_of(wk, struct ath11k_sta, set_4addr_wk);
4855
sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv);
4856
arvif = arsta->arvif;
4857
ar = arvif->ar;
4858
4859
ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
4860
"setting USE_4ADDR for peer %pM\n", sta->addr);
4861
4862
ret = ath11k_wmi_set_peer_param(ar, sta->addr,
4863
arvif->vdev_id,
4864
WMI_PEER_USE_4ADDR, 1);
4865
4866
if (ret)
4867
ath11k_warn(ar->ab, "failed to set peer %pM 4addr capability: %d\n",
4868
sta->addr, ret);
4869
}
4870
4871
static int ath11k_mac_inc_num_stations(struct ath11k_vif *arvif,
4872
struct ieee80211_sta *sta)
4873
{
4874
struct ath11k *ar = arvif->ar;
4875
4876
lockdep_assert_held(&ar->conf_mutex);
4877
4878
if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
4879
return 0;
4880
4881
if (ar->num_stations >= ar->max_num_stations)
4882
return -ENOBUFS;
4883
4884
ar->num_stations++;
4885
4886
return 0;
4887
}
4888
4889
static void ath11k_mac_dec_num_stations(struct ath11k_vif *arvif,
4890
struct ieee80211_sta *sta)
4891
{
4892
struct ath11k *ar = arvif->ar;
4893
4894
lockdep_assert_held(&ar->conf_mutex);
4895
4896
if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
4897
return;
4898
4899
ar->num_stations--;
4900
}
4901
4902
static int ath11k_mac_station_add(struct ath11k *ar,
4903
struct ieee80211_vif *vif,
4904
struct ieee80211_sta *sta)
4905
{
4906
struct ath11k_base *ab = ar->ab;
4907
struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
4908
struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
4909
struct peer_create_params peer_param;
4910
int ret;
4911
4912
lockdep_assert_held(&ar->conf_mutex);
4913
4914
ret = ath11k_mac_inc_num_stations(arvif, sta);
4915
if (ret) {
4916
ath11k_warn(ab, "refusing to associate station: too many connected already (%d)\n",
4917
ar->max_num_stations);
4918
goto exit;
4919
}
4920
4921
arsta->rx_stats = kzalloc(sizeof(*arsta->rx_stats), GFP_KERNEL);
4922
if (!arsta->rx_stats) {
4923
ret = -ENOMEM;
4924
goto dec_num_station;
4925
}
4926
4927
peer_param.vdev_id = arvif->vdev_id;
4928
peer_param.peer_addr = sta->addr;
4929
peer_param.peer_type = WMI_PEER_TYPE_DEFAULT;
4930
4931
ret = ath11k_peer_create(ar, arvif, sta, &peer_param);
4932
if (ret) {
4933
ath11k_warn(ab, "Failed to add peer: %pM for VDEV: %d\n",
4934
sta->addr, arvif->vdev_id);
4935
goto free_rx_stats;
4936
}
4937
4938
ath11k_dbg(ab, ATH11K_DBG_MAC, "Added peer: %pM for VDEV: %d\n",
4939
sta->addr, arvif->vdev_id);
4940
4941
if (ath11k_debugfs_is_extd_tx_stats_enabled(ar)) {
4942
arsta->tx_stats = kzalloc(sizeof(*arsta->tx_stats), GFP_KERNEL);
4943
if (!arsta->tx_stats) {
4944
ret = -ENOMEM;
4945
goto free_peer;
4946
}
4947
}
4948
4949
if (ieee80211_vif_is_mesh(vif)) {
4950
ath11k_dbg(ab, ATH11K_DBG_MAC,
4951
"setting USE_4ADDR for mesh STA %pM\n", sta->addr);
4952
ret = ath11k_wmi_set_peer_param(ar, sta->addr,
4953
arvif->vdev_id,
4954
WMI_PEER_USE_4ADDR, 1);
4955
if (ret) {
4956
ath11k_warn(ab, "failed to set mesh STA %pM 4addr capability: %d\n",
4957
sta->addr, ret);
4958
goto free_tx_stats;
4959
}
4960
}
4961
4962
ret = ath11k_dp_peer_setup(ar, arvif->vdev_id, sta->addr);
4963
if (ret) {
4964
ath11k_warn(ab, "failed to setup dp for peer %pM on vdev %i (%d)\n",
4965
sta->addr, arvif->vdev_id, ret);
4966
goto free_tx_stats;
4967
}
4968
4969
if (ab->hw_params.vdev_start_delay &&
4970
!arvif->is_started &&
4971
arvif->vdev_type != WMI_VDEV_TYPE_AP) {
4972
ret = ath11k_start_vdev_delay(ar->hw, vif);
4973
if (ret) {
4974
ath11k_warn(ab, "failed to delay vdev start: %d\n", ret);
4975
goto free_tx_stats;
4976
}
4977
}
4978
4979
ewma_avg_rssi_init(&arsta->avg_rssi);
4980
return 0;
4981
4982
free_tx_stats:
4983
kfree(arsta->tx_stats);
4984
arsta->tx_stats = NULL;
4985
free_peer:
4986
ath11k_peer_delete(ar, arvif->vdev_id, sta->addr);
4987
free_rx_stats:
4988
kfree(arsta->rx_stats);
4989
arsta->rx_stats = NULL;
4990
dec_num_station:
4991
ath11k_mac_dec_num_stations(arvif, sta);
4992
exit:
4993
return ret;
4994
}
4995
4996
static u32 ath11k_mac_ieee80211_sta_bw_to_wmi(struct ath11k *ar,
4997
struct ieee80211_sta *sta)
4998
{
4999
u32 bw = WMI_PEER_CHWIDTH_20MHZ;
5000
5001
switch (sta->deflink.bandwidth) {
5002
case IEEE80211_STA_RX_BW_20:
5003
bw = WMI_PEER_CHWIDTH_20MHZ;
5004
break;
5005
case IEEE80211_STA_RX_BW_40:
5006
bw = WMI_PEER_CHWIDTH_40MHZ;
5007
break;
5008
case IEEE80211_STA_RX_BW_80:
5009
bw = WMI_PEER_CHWIDTH_80MHZ;
5010
break;
5011
case IEEE80211_STA_RX_BW_160:
5012
bw = WMI_PEER_CHWIDTH_160MHZ;
5013
break;
5014
default:
5015
ath11k_warn(ar->ab, "Invalid bandwidth %d for %pM\n",
5016
sta->deflink.bandwidth, sta->addr);
5017
bw = WMI_PEER_CHWIDTH_20MHZ;
5018
break;
5019
}
5020
5021
return bw;
5022
}
5023
5024
static int ath11k_mac_op_sta_state(struct ieee80211_hw *hw,
5025
struct ieee80211_vif *vif,
5026
struct ieee80211_sta *sta,
5027
enum ieee80211_sta_state old_state,
5028
enum ieee80211_sta_state new_state)
5029
{
5030
struct ath11k *ar = hw->priv;
5031
struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
5032
struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
5033
struct ath11k_peer *peer;
5034
int ret = 0;
5035
5036
/* cancel must be done outside the mutex to avoid deadlock */
5037
if ((old_state == IEEE80211_STA_NONE &&
5038
new_state == IEEE80211_STA_NOTEXIST)) {
5039
cancel_work_sync(&arsta->update_wk);
5040
cancel_work_sync(&arsta->set_4addr_wk);
5041
}
5042
5043
mutex_lock(&ar->conf_mutex);
5044
5045
if (old_state == IEEE80211_STA_NOTEXIST &&
5046
new_state == IEEE80211_STA_NONE) {
5047
memset(arsta, 0, sizeof(*arsta));
5048
arsta->arvif = arvif;
5049
arsta->peer_ps_state = WMI_PEER_PS_STATE_DISABLED;
5050
INIT_WORK(&arsta->update_wk, ath11k_sta_rc_update_wk);
5051
INIT_WORK(&arsta->set_4addr_wk, ath11k_sta_set_4addr_wk);
5052
5053
ret = ath11k_mac_station_add(ar, vif, sta);
5054
if (ret)
5055
ath11k_warn(ar->ab, "Failed to add station: %pM for VDEV: %d\n",
5056
sta->addr, arvif->vdev_id);
5057
} else if ((old_state == IEEE80211_STA_NONE &&
5058
new_state == IEEE80211_STA_NOTEXIST)) {
5059
bool skip_peer_delete = ar->ab->hw_params.vdev_start_delay &&
5060
vif->type == NL80211_IFTYPE_STATION;
5061
5062
ath11k_dp_peer_cleanup(ar, arvif->vdev_id, sta->addr);
5063
5064
if (!skip_peer_delete) {
5065
ret = ath11k_peer_delete(ar, arvif->vdev_id, sta->addr);
5066
if (ret)
5067
ath11k_warn(ar->ab,
5068
"Failed to delete peer: %pM for VDEV: %d\n",
5069
sta->addr, arvif->vdev_id);
5070
else
5071
ath11k_dbg(ar->ab,
5072
ATH11K_DBG_MAC,
5073
"Removed peer: %pM for VDEV: %d\n",
5074
sta->addr, arvif->vdev_id);
5075
}
5076
5077
ath11k_mac_dec_num_stations(arvif, sta);
5078
mutex_lock(&ar->ab->tbl_mtx_lock);
5079
spin_lock_bh(&ar->ab->base_lock);
5080
peer = ath11k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
5081
if (skip_peer_delete && peer) {
5082
peer->sta = NULL;
5083
} else if (peer && peer->sta == sta) {
5084
ath11k_warn(ar->ab, "Found peer entry %pM n vdev %i after it was supposedly removed\n",
5085
vif->addr, arvif->vdev_id);
5086
ath11k_peer_rhash_delete(ar->ab, peer);
5087
peer->sta = NULL;
5088
list_del(&peer->list);
5089
kfree(peer);
5090
ar->num_peers--;
5091
}
5092
spin_unlock_bh(&ar->ab->base_lock);
5093
mutex_unlock(&ar->ab->tbl_mtx_lock);
5094
5095
kfree(arsta->tx_stats);
5096
arsta->tx_stats = NULL;
5097
5098
kfree(arsta->rx_stats);
5099
arsta->rx_stats = NULL;
5100
} else if (old_state == IEEE80211_STA_AUTH &&
5101
new_state == IEEE80211_STA_ASSOC &&
5102
(vif->type == NL80211_IFTYPE_AP ||
5103
vif->type == NL80211_IFTYPE_MESH_POINT ||
5104
vif->type == NL80211_IFTYPE_ADHOC)) {
5105
ret = ath11k_station_assoc(ar, vif, sta, false);
5106
if (ret)
5107
ath11k_warn(ar->ab, "Failed to associate station: %pM\n",
5108
sta->addr);
5109
5110
spin_lock_bh(&ar->data_lock);
5111
/* Set arsta bw and prev bw */
5112
arsta->bw = ath11k_mac_ieee80211_sta_bw_to_wmi(ar, sta);
5113
arsta->bw_prev = arsta->bw;
5114
spin_unlock_bh(&ar->data_lock);
5115
} else if (old_state == IEEE80211_STA_ASSOC &&
5116
new_state == IEEE80211_STA_AUTHORIZED) {
5117
spin_lock_bh(&ar->ab->base_lock);
5118
5119
peer = ath11k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
5120
if (peer)
5121
peer->is_authorized = true;
5122
5123
spin_unlock_bh(&ar->ab->base_lock);
5124
5125
if (vif->type == NL80211_IFTYPE_STATION && arvif->is_up) {
5126
ret = ath11k_wmi_set_peer_param(ar, sta->addr,
5127
arvif->vdev_id,
5128
WMI_PEER_AUTHORIZE,
5129
1);
5130
if (ret)
5131
ath11k_warn(ar->ab, "Unable to authorize peer %pM vdev %d: %d\n",
5132
sta->addr, arvif->vdev_id, ret);
5133
}
5134
} else if (old_state == IEEE80211_STA_AUTHORIZED &&
5135
new_state == IEEE80211_STA_ASSOC) {
5136
spin_lock_bh(&ar->ab->base_lock);
5137
5138
peer = ath11k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
5139
if (peer)
5140
peer->is_authorized = false;
5141
5142
spin_unlock_bh(&ar->ab->base_lock);
5143
} else if (old_state == IEEE80211_STA_ASSOC &&
5144
new_state == IEEE80211_STA_AUTH &&
5145
(vif->type == NL80211_IFTYPE_AP ||
5146
vif->type == NL80211_IFTYPE_MESH_POINT ||
5147
vif->type == NL80211_IFTYPE_ADHOC)) {
5148
ret = ath11k_station_disassoc(ar, vif, sta);
5149
if (ret)
5150
ath11k_warn(ar->ab, "Failed to disassociate station: %pM\n",
5151
sta->addr);
5152
}
5153
5154
mutex_unlock(&ar->conf_mutex);
5155
return ret;
5156
}
5157
5158
static int ath11k_mac_op_sta_set_txpwr(struct ieee80211_hw *hw,
5159
struct ieee80211_vif *vif,
5160
struct ieee80211_sta *sta)
5161
{
5162
struct ath11k *ar = hw->priv;
5163
struct ath11k_vif *arvif = (void *)vif->drv_priv;
5164
int ret = 0;
5165
s16 txpwr;
5166
5167
if (sta->deflink.txpwr.type == NL80211_TX_POWER_AUTOMATIC) {
5168
txpwr = 0;
5169
} else {
5170
txpwr = sta->deflink.txpwr.power;
5171
if (!txpwr)
5172
return -EINVAL;
5173
}
5174
5175
if (txpwr > ATH11K_TX_POWER_MAX_VAL || txpwr < ATH11K_TX_POWER_MIN_VAL)
5176
return -EINVAL;
5177
5178
mutex_lock(&ar->conf_mutex);
5179
5180
ret = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
5181
WMI_PEER_USE_FIXED_PWR, txpwr);
5182
if (ret) {
5183
ath11k_warn(ar->ab, "failed to set tx power for station ret: %d\n",
5184
ret);
5185
goto out;
5186
}
5187
5188
out:
5189
mutex_unlock(&ar->conf_mutex);
5190
return ret;
5191
}
5192
5193
static void ath11k_mac_op_sta_set_4addr(struct ieee80211_hw *hw,
5194
struct ieee80211_vif *vif,
5195
struct ieee80211_sta *sta, bool enabled)
5196
{
5197
struct ath11k *ar = hw->priv;
5198
struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
5199
5200
if (enabled && !arsta->use_4addr_set) {
5201
ieee80211_queue_work(ar->hw, &arsta->set_4addr_wk);
5202
arsta->use_4addr_set = true;
5203
}
5204
}
5205
5206
static void ath11k_mac_op_sta_rc_update(struct ieee80211_hw *hw,
5207
struct ieee80211_vif *vif,
5208
struct ieee80211_sta *sta,
5209
u32 changed)
5210
{
5211
struct ath11k *ar = hw->priv;
5212
struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
5213
struct ath11k_vif *arvif = (void *)vif->drv_priv;
5214
struct ath11k_peer *peer;
5215
u32 bw, smps;
5216
5217
spin_lock_bh(&ar->ab->base_lock);
5218
5219
peer = ath11k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
5220
if (!peer) {
5221
spin_unlock_bh(&ar->ab->base_lock);
5222
ath11k_warn(ar->ab, "mac sta rc update failed to find peer %pM on vdev %i\n",
5223
sta->addr, arvif->vdev_id);
5224
return;
5225
}
5226
5227
spin_unlock_bh(&ar->ab->base_lock);
5228
5229
ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
5230
"sta rc update for %pM changed %08x bw %d nss %d smps %d\n",
5231
sta->addr, changed, sta->deflink.bandwidth,
5232
sta->deflink.rx_nss,
5233
sta->deflink.smps_mode);
5234
5235
spin_lock_bh(&ar->data_lock);
5236
5237
if (changed & IEEE80211_RC_BW_CHANGED) {
5238
bw = ath11k_mac_ieee80211_sta_bw_to_wmi(ar, sta);
5239
arsta->bw_prev = arsta->bw;
5240
arsta->bw = bw;
5241
}
5242
5243
if (changed & IEEE80211_RC_NSS_CHANGED)
5244
arsta->nss = sta->deflink.rx_nss;
5245
5246
if (changed & IEEE80211_RC_SMPS_CHANGED) {
5247
smps = WMI_PEER_SMPS_PS_NONE;
5248
5249
switch (sta->deflink.smps_mode) {
5250
case IEEE80211_SMPS_AUTOMATIC:
5251
case IEEE80211_SMPS_OFF:
5252
smps = WMI_PEER_SMPS_PS_NONE;
5253
break;
5254
case IEEE80211_SMPS_STATIC:
5255
smps = WMI_PEER_SMPS_STATIC;
5256
break;
5257
case IEEE80211_SMPS_DYNAMIC:
5258
smps = WMI_PEER_SMPS_DYNAMIC;
5259
break;
5260
default:
5261
ath11k_warn(ar->ab, "Invalid smps %d in sta rc update for %pM\n",
5262
sta->deflink.smps_mode, sta->addr);
5263
smps = WMI_PEER_SMPS_PS_NONE;
5264
break;
5265
}
5266
5267
arsta->smps = smps;
5268
}
5269
5270
arsta->changed |= changed;
5271
5272
spin_unlock_bh(&ar->data_lock);
5273
5274
ieee80211_queue_work(hw, &arsta->update_wk);
5275
}
5276
5277
static int ath11k_conf_tx_uapsd(struct ath11k *ar, struct ieee80211_vif *vif,
5278
u16 ac, bool enable)
5279
{
5280
struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
5281
u32 value = 0;
5282
int ret = 0;
5283
5284
if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
5285
return 0;
5286
5287
switch (ac) {
5288
case IEEE80211_AC_VO:
5289
value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN |
5290
WMI_STA_PS_UAPSD_AC3_TRIGGER_EN;
5291
break;
5292
case IEEE80211_AC_VI:
5293
value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN |
5294
WMI_STA_PS_UAPSD_AC2_TRIGGER_EN;
5295
break;
5296
case IEEE80211_AC_BE:
5297
value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN |
5298
WMI_STA_PS_UAPSD_AC1_TRIGGER_EN;
5299
break;
5300
case IEEE80211_AC_BK:
5301
value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN |
5302
WMI_STA_PS_UAPSD_AC0_TRIGGER_EN;
5303
break;
5304
}
5305
5306
if (enable)
5307
arvif->u.sta.uapsd |= value;
5308
else
5309
arvif->u.sta.uapsd &= ~value;
5310
5311
ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
5312
WMI_STA_PS_PARAM_UAPSD,
5313
arvif->u.sta.uapsd);
5314
if (ret) {
5315
ath11k_warn(ar->ab, "could not set uapsd params %d\n", ret);
5316
goto exit;
5317
}
5318
5319
if (arvif->u.sta.uapsd)
5320
value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD;
5321
else
5322
value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
5323
5324
ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
5325
WMI_STA_PS_PARAM_RX_WAKE_POLICY,
5326
value);
5327
if (ret)
5328
ath11k_warn(ar->ab, "could not set rx wake param %d\n", ret);
5329
5330
exit:
5331
return ret;
5332
}
5333
5334
static int ath11k_mac_op_conf_tx(struct ieee80211_hw *hw,
5335
struct ieee80211_vif *vif,
5336
unsigned int link_id, u16 ac,
5337
const struct ieee80211_tx_queue_params *params)
5338
{
5339
struct ath11k *ar = hw->priv;
5340
struct ath11k_vif *arvif = (void *)vif->drv_priv;
5341
struct wmi_wmm_params_arg *p = NULL;
5342
int ret;
5343
5344
mutex_lock(&ar->conf_mutex);
5345
5346
switch (ac) {
5347
case IEEE80211_AC_VO:
5348
p = &arvif->wmm_params.ac_vo;
5349
break;
5350
case IEEE80211_AC_VI:
5351
p = &arvif->wmm_params.ac_vi;
5352
break;
5353
case IEEE80211_AC_BE:
5354
p = &arvif->wmm_params.ac_be;
5355
break;
5356
case IEEE80211_AC_BK:
5357
p = &arvif->wmm_params.ac_bk;
5358
break;
5359
}
5360
5361
if (WARN_ON(!p)) {
5362
ret = -EINVAL;
5363
goto exit;
5364
}
5365
5366
p->cwmin = params->cw_min;
5367
p->cwmax = params->cw_max;
5368
p->aifs = params->aifs;
5369
p->txop = params->txop;
5370
5371
ret = ath11k_wmi_send_wmm_update_cmd_tlv(ar, arvif->vdev_id,
5372
&arvif->wmm_params);
5373
if (ret) {
5374
ath11k_warn(ar->ab, "failed to set wmm params: %d\n", ret);
5375
goto exit;
5376
}
5377
5378
ret = ath11k_conf_tx_uapsd(ar, vif, ac, params->uapsd);
5379
5380
if (ret)
5381
ath11k_warn(ar->ab, "failed to set sta uapsd: %d\n", ret);
5382
5383
exit:
5384
mutex_unlock(&ar->conf_mutex);
5385
return ret;
5386
}
5387
5388
static struct ieee80211_sta_ht_cap
5389
ath11k_create_ht_cap(struct ath11k *ar, u32 ar_ht_cap, u32 rate_cap_rx_chainmask)
5390
{
5391
int i;
5392
struct ieee80211_sta_ht_cap ht_cap = {0};
5393
u32 ar_vht_cap = ar->pdev->cap.vht_cap;
5394
5395
if (!(ar_ht_cap & WMI_HT_CAP_ENABLED))
5396
return ht_cap;
5397
5398
ht_cap.ht_supported = 1;
5399
ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
5400
ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_NONE;
5401
ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
5402
ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
5403
ht_cap.cap |= WLAN_HT_CAP_SM_PS_STATIC << IEEE80211_HT_CAP_SM_PS_SHIFT;
5404
5405
if (ar_ht_cap & WMI_HT_CAP_HT20_SGI)
5406
ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
5407
5408
if (ar_ht_cap & WMI_HT_CAP_HT40_SGI)
5409
ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
5410
5411
if (ar_ht_cap & WMI_HT_CAP_DYNAMIC_SMPS) {
5412
u32 smps;
5413
5414
smps = WLAN_HT_CAP_SM_PS_DYNAMIC;
5415
smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT;
5416
5417
ht_cap.cap |= smps;
5418
}
5419
5420
if (ar_ht_cap & WMI_HT_CAP_TX_STBC)
5421
ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC;
5422
5423
if (ar_ht_cap & WMI_HT_CAP_RX_STBC) {
5424
u32 stbc;
5425
5426
stbc = ar_ht_cap;
5427
stbc &= WMI_HT_CAP_RX_STBC;
5428
stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT;
5429
stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT;
5430
stbc &= IEEE80211_HT_CAP_RX_STBC;
5431
5432
ht_cap.cap |= stbc;
5433
}
5434
5435
if (ar_ht_cap & WMI_HT_CAP_RX_LDPC)
5436
ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
5437
5438
if (ar_ht_cap & WMI_HT_CAP_L_SIG_TXOP_PROT)
5439
ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
5440
5441
if (ar_vht_cap & WMI_VHT_CAP_MAX_MPDU_LEN_MASK)
5442
ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU;
5443
5444
for (i = 0; i < ar->num_rx_chains; i++) {
5445
if (rate_cap_rx_chainmask & BIT(i))
5446
ht_cap.mcs.rx_mask[i] = 0xFF;
5447
}
5448
5449
ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
5450
5451
return ht_cap;
5452
}
5453
5454
static int ath11k_mac_set_txbf_conf(struct ath11k_vif *arvif)
5455
{
5456
u32 value = 0;
5457
struct ath11k *ar = arvif->ar;
5458
int nsts;
5459
int sound_dim;
5460
u32 vht_cap = ar->pdev->cap.vht_cap;
5461
u32 vdev_param = WMI_VDEV_PARAM_TXBF;
5462
5463
if (vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)) {
5464
nsts = vht_cap & IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
5465
nsts >>= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
5466
if (nsts > (ar->num_rx_chains - 1))
5467
nsts = ar->num_rx_chains - 1;
5468
value |= SM(nsts, WMI_TXBF_STS_CAP_OFFSET);
5469
}
5470
5471
if (vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)) {
5472
sound_dim = vht_cap &
5473
IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
5474
sound_dim >>= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
5475
if (sound_dim > (ar->num_tx_chains - 1))
5476
sound_dim = ar->num_tx_chains - 1;
5477
value |= SM(sound_dim, WMI_BF_SOUND_DIM_OFFSET);
5478
}
5479
5480
if (!value)
5481
return 0;
5482
5483
if (vht_cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE) {
5484
value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
5485
5486
if ((vht_cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE) &&
5487
arvif->vdev_type == WMI_VDEV_TYPE_AP)
5488
value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFER;
5489
}
5490
5491
/* TODO: SUBFEE not validated in HK, disable here until validated? */
5492
5493
if (vht_cap & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE) {
5494
value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
5495
5496
if ((vht_cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE) &&
5497
arvif->vdev_type == WMI_VDEV_TYPE_STA)
5498
value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFEE;
5499
}
5500
5501
return ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
5502
vdev_param, value);
5503
}
5504
5505
static void ath11k_set_vht_txbf_cap(struct ath11k *ar, u32 *vht_cap)
5506
{
5507
bool subfer, subfee;
5508
int sound_dim = 0, nsts = 0;
5509
5510
subfer = !!(*vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE));
5511
subfee = !!(*vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE));
5512
5513
if (ar->num_tx_chains < 2) {
5514
*vht_cap &= ~(IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE);
5515
subfer = false;
5516
}
5517
5518
if (ar->num_rx_chains < 2) {
5519
*vht_cap &= ~(IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE);
5520
subfee = false;
5521
}
5522
5523
/* If SU Beaformer is not set, then disable MU Beamformer Capability */
5524
if (!subfer)
5525
*vht_cap &= ~(IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE);
5526
5527
/* If SU Beaformee is not set, then disable MU Beamformee Capability */
5528
if (!subfee)
5529
*vht_cap &= ~(IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE);
5530
5531
sound_dim = (*vht_cap & IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK);
5532
sound_dim >>= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
5533
*vht_cap &= ~IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
5534
5535
nsts = (*vht_cap & IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK);
5536
nsts >>= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
5537
*vht_cap &= ~IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
5538
5539
/* Enable Sounding Dimension Field only if SU BF is enabled */
5540
if (subfer) {
5541
if (sound_dim > (ar->num_tx_chains - 1))
5542
sound_dim = ar->num_tx_chains - 1;
5543
5544
sound_dim <<= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
5545
sound_dim &= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
5546
*vht_cap |= sound_dim;
5547
}
5548
5549
/* Enable Beamformee STS Field only if SU BF is enabled */
5550
if (subfee) {
5551
if (nsts > (ar->num_rx_chains - 1))
5552
nsts = ar->num_rx_chains - 1;
5553
5554
nsts <<= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
5555
nsts &= IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
5556
*vht_cap |= nsts;
5557
}
5558
}
5559
5560
static struct ieee80211_sta_vht_cap
5561
ath11k_create_vht_cap(struct ath11k *ar, u32 rate_cap_tx_chainmask,
5562
u32 rate_cap_rx_chainmask)
5563
{
5564
struct ieee80211_sta_vht_cap vht_cap = {0};
5565
u16 txmcs_map, rxmcs_map;
5566
int i;
5567
5568
vht_cap.vht_supported = 1;
5569
vht_cap.cap = ar->pdev->cap.vht_cap;
5570
5571
if (ar->pdev->cap.nss_ratio_enabled)
5572
vht_cap.vht_mcs.tx_highest |=
5573
cpu_to_le16(IEEE80211_VHT_EXT_NSS_BW_CAPABLE);
5574
5575
ath11k_set_vht_txbf_cap(ar, &vht_cap.cap);
5576
5577
rxmcs_map = 0;
5578
txmcs_map = 0;
5579
for (i = 0; i < 8; i++) {
5580
if (i < ar->num_tx_chains && rate_cap_tx_chainmask & BIT(i))
5581
txmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
5582
else
5583
txmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
5584
5585
if (i < ar->num_rx_chains && rate_cap_rx_chainmask & BIT(i))
5586
rxmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
5587
else
5588
rxmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
5589
}
5590
5591
if (rate_cap_tx_chainmask <= 1)
5592
vht_cap.cap &= ~IEEE80211_VHT_CAP_TXSTBC;
5593
5594
vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(rxmcs_map);
5595
vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(txmcs_map);
5596
5597
return vht_cap;
5598
}
5599
5600
static void ath11k_mac_setup_ht_vht_cap(struct ath11k *ar,
5601
struct ath11k_pdev_cap *cap,
5602
u32 *ht_cap_info)
5603
{
5604
struct ieee80211_supported_band *band;
5605
u32 rate_cap_tx_chainmask;
5606
u32 rate_cap_rx_chainmask;
5607
u32 ht_cap;
5608
5609
rate_cap_tx_chainmask = ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift;
5610
rate_cap_rx_chainmask = ar->cfg_rx_chainmask >> cap->rx_chain_mask_shift;
5611
5612
if (cap->supported_bands & WMI_HOST_WLAN_2G_CAP) {
5613
band = &ar->mac.sbands[NL80211_BAND_2GHZ];
5614
ht_cap = cap->band[NL80211_BAND_2GHZ].ht_cap_info;
5615
if (ht_cap_info)
5616
*ht_cap_info = ht_cap;
5617
band->ht_cap = ath11k_create_ht_cap(ar, ht_cap,
5618
rate_cap_rx_chainmask);
5619
}
5620
5621
if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP &&
5622
(ar->ab->hw_params.single_pdev_only ||
5623
!ar->supports_6ghz)) {
5624
band = &ar->mac.sbands[NL80211_BAND_5GHZ];
5625
ht_cap = cap->band[NL80211_BAND_5GHZ].ht_cap_info;
5626
if (ht_cap_info)
5627
*ht_cap_info = ht_cap;
5628
band->ht_cap = ath11k_create_ht_cap(ar, ht_cap,
5629
rate_cap_rx_chainmask);
5630
band->vht_cap = ath11k_create_vht_cap(ar, rate_cap_tx_chainmask,
5631
rate_cap_rx_chainmask);
5632
}
5633
}
5634
5635
static int ath11k_check_chain_mask(struct ath11k *ar, u32 ant, bool is_tx_ant)
5636
{
5637
/* TODO: Check the request chainmask against the supported
5638
* chainmask table which is advertised in extented_service_ready event
5639
*/
5640
5641
return 0;
5642
}
5643
5644
static void ath11k_gen_ppe_thresh(struct ath11k_ppe_threshold *fw_ppet,
5645
u8 *he_ppet)
5646
{
5647
int nss, ru;
5648
u8 bit = 7;
5649
5650
he_ppet[0] = fw_ppet->numss_m1 & IEEE80211_PPE_THRES_NSS_MASK;
5651
he_ppet[0] |= (fw_ppet->ru_bit_mask <<
5652
IEEE80211_PPE_THRES_RU_INDEX_BITMASK_POS) &
5653
IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK;
5654
for (nss = 0; nss <= fw_ppet->numss_m1; nss++) {
5655
for (ru = 0; ru < 4; ru++) {
5656
u8 val;
5657
int i;
5658
5659
if ((fw_ppet->ru_bit_mask & BIT(ru)) == 0)
5660
continue;
5661
val = (fw_ppet->ppet16_ppet8_ru3_ru0[nss] >> (ru * 6)) &
5662
0x3f;
5663
val = ((val >> 3) & 0x7) | ((val & 0x7) << 3);
5664
for (i = 5; i >= 0; i--) {
5665
he_ppet[bit / 8] |=
5666
((val >> i) & 0x1) << ((bit % 8));
5667
bit++;
5668
}
5669
}
5670
}
5671
}
5672
5673
static void
5674
ath11k_mac_filter_he_cap_mesh(struct ieee80211_he_cap_elem *he_cap_elem)
5675
{
5676
u8 m;
5677
5678
m = IEEE80211_HE_MAC_CAP0_TWT_RES |
5679
IEEE80211_HE_MAC_CAP0_TWT_REQ;
5680
he_cap_elem->mac_cap_info[0] &= ~m;
5681
5682
m = IEEE80211_HE_MAC_CAP2_TRS |
5683
IEEE80211_HE_MAC_CAP2_BCAST_TWT |
5684
IEEE80211_HE_MAC_CAP2_MU_CASCADING;
5685
he_cap_elem->mac_cap_info[2] &= ~m;
5686
5687
m = IEEE80211_HE_MAC_CAP3_FLEX_TWT_SCHED |
5688
IEEE80211_HE_MAC_CAP2_BCAST_TWT |
5689
IEEE80211_HE_MAC_CAP2_MU_CASCADING;
5690
he_cap_elem->mac_cap_info[3] &= ~m;
5691
5692
m = IEEE80211_HE_MAC_CAP4_BSRP_BQRP_A_MPDU_AGG |
5693
IEEE80211_HE_MAC_CAP4_BQR;
5694
he_cap_elem->mac_cap_info[4] &= ~m;
5695
5696
m = IEEE80211_HE_MAC_CAP5_SUBCHAN_SELECTIVE_TRANSMISSION |
5697
IEEE80211_HE_MAC_CAP5_UL_2x996_TONE_RU |
5698
IEEE80211_HE_MAC_CAP5_PUNCTURED_SOUNDING |
5699
IEEE80211_HE_MAC_CAP5_HT_VHT_TRIG_FRAME_RX;
5700
he_cap_elem->mac_cap_info[5] &= ~m;
5701
5702
m = IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO |
5703
IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO;
5704
he_cap_elem->phy_cap_info[2] &= ~m;
5705
5706
m = IEEE80211_HE_PHY_CAP3_RX_PARTIAL_BW_SU_IN_20MHZ_MU |
5707
IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK |
5708
IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_MASK;
5709
he_cap_elem->phy_cap_info[3] &= ~m;
5710
5711
m = IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER;
5712
he_cap_elem->phy_cap_info[4] &= ~m;
5713
5714
m = IEEE80211_HE_PHY_CAP5_NG16_MU_FEEDBACK;
5715
he_cap_elem->phy_cap_info[5] &= ~m;
5716
5717
m = IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_75_MU |
5718
IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB |
5719
IEEE80211_HE_PHY_CAP6_TRIG_CQI_FB |
5720
IEEE80211_HE_PHY_CAP6_PARTIAL_BANDWIDTH_DL_MUMIMO;
5721
he_cap_elem->phy_cap_info[6] &= ~m;
5722
5723
m = IEEE80211_HE_PHY_CAP7_PSR_BASED_SR |
5724
IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_SUPP |
5725
IEEE80211_HE_PHY_CAP7_STBC_TX_ABOVE_80MHZ |
5726
IEEE80211_HE_PHY_CAP7_STBC_RX_ABOVE_80MHZ;
5727
he_cap_elem->phy_cap_info[7] &= ~m;
5728
5729
m = IEEE80211_HE_PHY_CAP8_HE_ER_SU_PPDU_4XLTF_AND_08_US_GI |
5730
IEEE80211_HE_PHY_CAP8_20MHZ_IN_40MHZ_HE_PPDU_IN_2G |
5731
IEEE80211_HE_PHY_CAP8_20MHZ_IN_160MHZ_HE_PPDU |
5732
IEEE80211_HE_PHY_CAP8_80MHZ_IN_160MHZ_HE_PPDU;
5733
he_cap_elem->phy_cap_info[8] &= ~m;
5734
5735
m = IEEE80211_HE_PHY_CAP9_LONGER_THAN_16_SIGB_OFDM_SYM |
5736
IEEE80211_HE_PHY_CAP9_NON_TRIGGERED_CQI_FEEDBACK |
5737
IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU |
5738
IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU |
5739
IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_COMP_SIGB |
5740
IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_NON_COMP_SIGB;
5741
he_cap_elem->phy_cap_info[9] &= ~m;
5742
}
5743
5744
static __le16 ath11k_mac_setup_he_6ghz_cap(struct ath11k_pdev_cap *pcap,
5745
struct ath11k_band_cap *bcap)
5746
{
5747
u8 val;
5748
5749
bcap->he_6ghz_capa = IEEE80211_HT_MPDU_DENSITY_NONE;
5750
if (bcap->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS)
5751
bcap->he_6ghz_capa |=
5752
FIELD_PREP(IEEE80211_HE_6GHZ_CAP_SM_PS,
5753
WLAN_HT_CAP_SM_PS_DYNAMIC);
5754
else
5755
bcap->he_6ghz_capa |=
5756
FIELD_PREP(IEEE80211_HE_6GHZ_CAP_SM_PS,
5757
WLAN_HT_CAP_SM_PS_DISABLED);
5758
val = FIELD_GET(IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK,
5759
pcap->vht_cap);
5760
bcap->he_6ghz_capa |=
5761
FIELD_PREP(IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP, val);
5762
val = FIELD_GET(IEEE80211_VHT_CAP_MAX_MPDU_MASK, pcap->vht_cap);
5763
bcap->he_6ghz_capa |=
5764
FIELD_PREP(IEEE80211_HE_6GHZ_CAP_MAX_MPDU_LEN, val);
5765
if (pcap->vht_cap & IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN)
5766
bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_RX_ANTPAT_CONS;
5767
if (pcap->vht_cap & IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN)
5768
bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_TX_ANTPAT_CONS;
5769
5770
return cpu_to_le16(bcap->he_6ghz_capa);
5771
}
5772
5773
static void ath11k_mac_set_hemcsmap(struct ath11k *ar,
5774
struct ath11k_pdev_cap *cap,
5775
struct ieee80211_sta_he_cap *he_cap,
5776
int band)
5777
{
5778
u16 txmcs_map, rxmcs_map;
5779
u32 i;
5780
5781
rxmcs_map = 0;
5782
txmcs_map = 0;
5783
for (i = 0; i < 8; i++) {
5784
if (i < ar->num_tx_chains &&
5785
(ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift) & BIT(i))
5786
txmcs_map |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2);
5787
else
5788
txmcs_map |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2);
5789
5790
if (i < ar->num_rx_chains &&
5791
(ar->cfg_rx_chainmask >> cap->tx_chain_mask_shift) & BIT(i))
5792
rxmcs_map |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2);
5793
else
5794
rxmcs_map |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2);
5795
}
5796
he_cap->he_mcs_nss_supp.rx_mcs_80 =
5797
cpu_to_le16(rxmcs_map & 0xffff);
5798
he_cap->he_mcs_nss_supp.tx_mcs_80 =
5799
cpu_to_le16(txmcs_map & 0xffff);
5800
he_cap->he_mcs_nss_supp.rx_mcs_160 =
5801
cpu_to_le16(rxmcs_map & 0xffff);
5802
he_cap->he_mcs_nss_supp.tx_mcs_160 =
5803
cpu_to_le16(txmcs_map & 0xffff);
5804
he_cap->he_mcs_nss_supp.rx_mcs_80p80 =
5805
cpu_to_le16(rxmcs_map & 0xffff);
5806
he_cap->he_mcs_nss_supp.tx_mcs_80p80 =
5807
cpu_to_le16(txmcs_map & 0xffff);
5808
}
5809
5810
static int ath11k_mac_copy_he_cap(struct ath11k *ar,
5811
struct ath11k_pdev_cap *cap,
5812
struct ieee80211_sband_iftype_data *data,
5813
int band)
5814
{
5815
int i, idx = 0;
5816
5817
for (i = 0; i < NUM_NL80211_IFTYPES; i++) {
5818
struct ieee80211_sta_he_cap *he_cap = &data[idx].he_cap;
5819
struct ath11k_band_cap *band_cap = &cap->band[band];
5820
struct ieee80211_he_cap_elem *he_cap_elem =
5821
&he_cap->he_cap_elem;
5822
5823
switch (i) {
5824
case NL80211_IFTYPE_STATION:
5825
case NL80211_IFTYPE_AP:
5826
case NL80211_IFTYPE_MESH_POINT:
5827
break;
5828
5829
default:
5830
continue;
5831
}
5832
5833
data[idx].types_mask = BIT(i);
5834
he_cap->has_he = true;
5835
memcpy(he_cap_elem->mac_cap_info, band_cap->he_cap_info,
5836
sizeof(he_cap_elem->mac_cap_info));
5837
memcpy(he_cap_elem->phy_cap_info, band_cap->he_cap_phy_info,
5838
sizeof(he_cap_elem->phy_cap_info));
5839
5840
he_cap_elem->mac_cap_info[1] &=
5841
IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_MASK;
5842
5843
he_cap_elem->phy_cap_info[5] &=
5844
~IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK;
5845
he_cap_elem->phy_cap_info[5] |= ar->num_tx_chains - 1;
5846
5847
switch (i) {
5848
case NL80211_IFTYPE_AP:
5849
he_cap_elem->phy_cap_info[3] &=
5850
~IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK;
5851
he_cap_elem->phy_cap_info[9] |=
5852
IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU;
5853
break;
5854
case NL80211_IFTYPE_STATION:
5855
he_cap_elem->mac_cap_info[0] &=
5856
~IEEE80211_HE_MAC_CAP0_TWT_RES;
5857
he_cap_elem->mac_cap_info[0] |=
5858
IEEE80211_HE_MAC_CAP0_TWT_REQ;
5859
he_cap_elem->phy_cap_info[9] |=
5860
IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU;
5861
break;
5862
case NL80211_IFTYPE_MESH_POINT:
5863
ath11k_mac_filter_he_cap_mesh(he_cap_elem);
5864
break;
5865
}
5866
5867
ath11k_mac_set_hemcsmap(ar, cap, he_cap, band);
5868
5869
memset(he_cap->ppe_thres, 0, sizeof(he_cap->ppe_thres));
5870
if (he_cap_elem->phy_cap_info[6] &
5871
IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT)
5872
ath11k_gen_ppe_thresh(&band_cap->he_ppet,
5873
he_cap->ppe_thres);
5874
5875
if (band == NL80211_BAND_6GHZ) {
5876
data[idx].he_6ghz_capa.capa =
5877
ath11k_mac_setup_he_6ghz_cap(cap, band_cap);
5878
}
5879
idx++;
5880
}
5881
5882
return idx;
5883
}
5884
5885
static void ath11k_mac_setup_he_cap(struct ath11k *ar,
5886
struct ath11k_pdev_cap *cap)
5887
{
5888
struct ieee80211_supported_band *band;
5889
int count;
5890
5891
if (cap->supported_bands & WMI_HOST_WLAN_2G_CAP) {
5892
count = ath11k_mac_copy_he_cap(ar, cap,
5893
ar->mac.iftype[NL80211_BAND_2GHZ],
5894
NL80211_BAND_2GHZ);
5895
band = &ar->mac.sbands[NL80211_BAND_2GHZ];
5896
band->iftype_data = ar->mac.iftype[NL80211_BAND_2GHZ];
5897
band->n_iftype_data = count;
5898
}
5899
5900
if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP) {
5901
count = ath11k_mac_copy_he_cap(ar, cap,
5902
ar->mac.iftype[NL80211_BAND_5GHZ],
5903
NL80211_BAND_5GHZ);
5904
band = &ar->mac.sbands[NL80211_BAND_5GHZ];
5905
band->iftype_data = ar->mac.iftype[NL80211_BAND_5GHZ];
5906
band->n_iftype_data = count;
5907
}
5908
5909
if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP &&
5910
ar->supports_6ghz) {
5911
count = ath11k_mac_copy_he_cap(ar, cap,
5912
ar->mac.iftype[NL80211_BAND_6GHZ],
5913
NL80211_BAND_6GHZ);
5914
band = &ar->mac.sbands[NL80211_BAND_6GHZ];
5915
band->iftype_data = ar->mac.iftype[NL80211_BAND_6GHZ];
5916
band->n_iftype_data = count;
5917
}
5918
}
5919
5920
static int __ath11k_set_antenna(struct ath11k *ar, u32 tx_ant, u32 rx_ant)
5921
{
5922
int ret;
5923
5924
lockdep_assert_held(&ar->conf_mutex);
5925
5926
if (ath11k_check_chain_mask(ar, tx_ant, true))
5927
return -EINVAL;
5928
5929
if (ath11k_check_chain_mask(ar, rx_ant, false))
5930
return -EINVAL;
5931
5932
ar->cfg_tx_chainmask = tx_ant;
5933
ar->cfg_rx_chainmask = rx_ant;
5934
5935
if (ar->state != ATH11K_STATE_ON &&
5936
ar->state != ATH11K_STATE_RESTARTED)
5937
return 0;
5938
5939
ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_TX_CHAIN_MASK,
5940
tx_ant, ar->pdev->pdev_id);
5941
if (ret) {
5942
ath11k_warn(ar->ab, "failed to set tx-chainmask: %d, req 0x%x\n",
5943
ret, tx_ant);
5944
return ret;
5945
}
5946
5947
ar->num_tx_chains = get_num_chains(tx_ant);
5948
5949
ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_RX_CHAIN_MASK,
5950
rx_ant, ar->pdev->pdev_id);
5951
if (ret) {
5952
ath11k_warn(ar->ab, "failed to set rx-chainmask: %d, req 0x%x\n",
5953
ret, rx_ant);
5954
return ret;
5955
}
5956
5957
ar->num_rx_chains = get_num_chains(rx_ant);
5958
5959
/* Reload HT/VHT/HE capability */
5960
ath11k_mac_setup_ht_vht_cap(ar, &ar->pdev->cap, NULL);
5961
ath11k_mac_setup_he_cap(ar, &ar->pdev->cap);
5962
5963
return 0;
5964
}
5965
5966
static void ath11k_mgmt_over_wmi_tx_drop(struct ath11k *ar, struct sk_buff *skb)
5967
{
5968
int num_mgmt;
5969
5970
ieee80211_free_txskb(ar->hw, skb);
5971
5972
num_mgmt = atomic_dec_if_positive(&ar->num_pending_mgmt_tx);
5973
5974
if (num_mgmt < 0)
5975
WARN_ON_ONCE(1);
5976
5977
if (!num_mgmt)
5978
wake_up(&ar->txmgmt_empty_waitq);
5979
}
5980
5981
static void ath11k_mac_tx_mgmt_free(struct ath11k *ar, int buf_id)
5982
{
5983
struct sk_buff *msdu;
5984
struct ieee80211_tx_info *info;
5985
5986
spin_lock_bh(&ar->txmgmt_idr_lock);
5987
msdu = idr_remove(&ar->txmgmt_idr, buf_id);
5988
spin_unlock_bh(&ar->txmgmt_idr_lock);
5989
5990
if (!msdu)
5991
return;
5992
5993
dma_unmap_single(ar->ab->dev, ATH11K_SKB_CB(msdu)->paddr, msdu->len,
5994
DMA_TO_DEVICE);
5995
5996
info = IEEE80211_SKB_CB(msdu);
5997
memset(&info->status, 0, sizeof(info->status));
5998
5999
ath11k_mgmt_over_wmi_tx_drop(ar, msdu);
6000
}
6001
6002
int ath11k_mac_tx_mgmt_pending_free(int buf_id, void *skb, void *ctx)
6003
{
6004
struct ath11k *ar = ctx;
6005
6006
ath11k_mac_tx_mgmt_free(ar, buf_id);
6007
6008
return 0;
6009
}
6010
6011
static int ath11k_mac_vif_txmgmt_idr_remove(int buf_id, void *skb, void *ctx)
6012
{
6013
struct ieee80211_vif *vif = ctx;
6014
struct ath11k_skb_cb *skb_cb = ATH11K_SKB_CB((struct sk_buff *)skb);
6015
struct ath11k *ar = skb_cb->ar;
6016
6017
if (skb_cb->vif == vif)
6018
ath11k_mac_tx_mgmt_free(ar, buf_id);
6019
6020
return 0;
6021
}
6022
6023
static int ath11k_mac_mgmt_tx_wmi(struct ath11k *ar, struct ath11k_vif *arvif,
6024
struct sk_buff *skb)
6025
{
6026
struct ath11k_base *ab = ar->ab;
6027
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
6028
struct ieee80211_tx_info *info;
6029
dma_addr_t paddr;
6030
int buf_id;
6031
int ret;
6032
6033
ATH11K_SKB_CB(skb)->ar = ar;
6034
6035
spin_lock_bh(&ar->txmgmt_idr_lock);
6036
buf_id = idr_alloc(&ar->txmgmt_idr, skb, 0,
6037
ATH11K_TX_MGMT_NUM_PENDING_MAX, GFP_ATOMIC);
6038
spin_unlock_bh(&ar->txmgmt_idr_lock);
6039
6040
ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
6041
"tx mgmt frame, buf id %d\n", buf_id);
6042
6043
if (buf_id < 0)
6044
return -ENOSPC;
6045
6046
info = IEEE80211_SKB_CB(skb);
6047
if (!(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP)) {
6048
if ((ieee80211_is_action(hdr->frame_control) ||
6049
ieee80211_is_deauth(hdr->frame_control) ||
6050
ieee80211_is_disassoc(hdr->frame_control)) &&
6051
ieee80211_has_protected(hdr->frame_control)) {
6052
skb_put(skb, IEEE80211_CCMP_MIC_LEN);
6053
}
6054
}
6055
6056
paddr = dma_map_single(ab->dev, skb->data, skb->len, DMA_TO_DEVICE);
6057
if (dma_mapping_error(ab->dev, paddr)) {
6058
ath11k_warn(ab, "failed to DMA map mgmt Tx buffer\n");
6059
ret = -EIO;
6060
goto err_free_idr;
6061
}
6062
6063
ATH11K_SKB_CB(skb)->paddr = paddr;
6064
6065
ret = ath11k_wmi_mgmt_send(ar, arvif->vdev_id, buf_id, skb);
6066
if (ret) {
6067
ath11k_warn(ar->ab, "failed to send mgmt frame: %d\n", ret);
6068
goto err_unmap_buf;
6069
}
6070
6071
return 0;
6072
6073
err_unmap_buf:
6074
dma_unmap_single(ab->dev, ATH11K_SKB_CB(skb)->paddr,
6075
skb->len, DMA_TO_DEVICE);
6076
err_free_idr:
6077
spin_lock_bh(&ar->txmgmt_idr_lock);
6078
idr_remove(&ar->txmgmt_idr, buf_id);
6079
spin_unlock_bh(&ar->txmgmt_idr_lock);
6080
6081
return ret;
6082
}
6083
6084
static void ath11k_mgmt_over_wmi_tx_purge(struct ath11k *ar)
6085
{
6086
struct sk_buff *skb;
6087
6088
while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL)
6089
ath11k_mgmt_over_wmi_tx_drop(ar, skb);
6090
}
6091
6092
static void ath11k_mgmt_over_wmi_tx_work(struct work_struct *work)
6093
{
6094
struct ath11k *ar = container_of(work, struct ath11k, wmi_mgmt_tx_work);
6095
struct ath11k_skb_cb *skb_cb;
6096
struct ath11k_vif *arvif;
6097
struct sk_buff *skb;
6098
int ret;
6099
6100
while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL) {
6101
skb_cb = ATH11K_SKB_CB(skb);
6102
if (!skb_cb->vif) {
6103
ath11k_warn(ar->ab, "no vif found for mgmt frame\n");
6104
ath11k_mgmt_over_wmi_tx_drop(ar, skb);
6105
continue;
6106
}
6107
6108
arvif = ath11k_vif_to_arvif(skb_cb->vif);
6109
mutex_lock(&ar->conf_mutex);
6110
if (ar->allocated_vdev_map & (1LL << arvif->vdev_id)) {
6111
ret = ath11k_mac_mgmt_tx_wmi(ar, arvif, skb);
6112
if (ret) {
6113
ath11k_warn(ar->ab, "failed to tx mgmt frame, vdev_id %d :%d\n",
6114
arvif->vdev_id, ret);
6115
ath11k_mgmt_over_wmi_tx_drop(ar, skb);
6116
} else {
6117
ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
6118
"tx mgmt frame, vdev_id %d\n",
6119
arvif->vdev_id);
6120
}
6121
} else {
6122
ath11k_warn(ar->ab,
6123
"dropping mgmt frame for vdev %d, is_started %d\n",
6124
arvif->vdev_id,
6125
arvif->is_started);
6126
ath11k_mgmt_over_wmi_tx_drop(ar, skb);
6127
}
6128
mutex_unlock(&ar->conf_mutex);
6129
}
6130
}
6131
6132
static int ath11k_mac_mgmt_tx(struct ath11k *ar, struct sk_buff *skb,
6133
bool is_prb_rsp)
6134
{
6135
struct sk_buff_head *q = &ar->wmi_mgmt_tx_queue;
6136
6137
if (test_bit(ATH11K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags))
6138
return -ESHUTDOWN;
6139
6140
/* Drop probe response packets when the pending management tx
6141
* count has reached a certain threshold, so as to prioritize
6142
* other mgmt packets like auth and assoc to be sent on time
6143
* for establishing successful connections.
6144
*/
6145
if (is_prb_rsp &&
6146
atomic_read(&ar->num_pending_mgmt_tx) > ATH11K_PRB_RSP_DROP_THRESHOLD) {
6147
ath11k_warn(ar->ab,
6148
"dropping probe response as pending queue is almost full\n");
6149
return -ENOSPC;
6150
}
6151
6152
if (skb_queue_len_lockless(q) >= ATH11K_TX_MGMT_NUM_PENDING_MAX) {
6153
ath11k_warn(ar->ab, "mgmt tx queue is full\n");
6154
return -ENOSPC;
6155
}
6156
6157
skb_queue_tail(q, skb);
6158
atomic_inc(&ar->num_pending_mgmt_tx);
6159
queue_work(ar->ab->workqueue_aux, &ar->wmi_mgmt_tx_work);
6160
6161
return 0;
6162
}
6163
6164
static void ath11k_mac_op_tx(struct ieee80211_hw *hw,
6165
struct ieee80211_tx_control *control,
6166
struct sk_buff *skb)
6167
{
6168
struct ath11k_skb_cb *skb_cb = ATH11K_SKB_CB(skb);
6169
struct ath11k *ar = hw->priv;
6170
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
6171
struct ieee80211_vif *vif = info->control.vif;
6172
struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
6173
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
6174
struct ieee80211_key_conf *key = info->control.hw_key;
6175
struct ath11k_sta *arsta = NULL;
6176
u32 info_flags = info->flags;
6177
bool is_prb_rsp;
6178
int ret;
6179
6180
memset(skb_cb, 0, sizeof(*skb_cb));
6181
skb_cb->vif = vif;
6182
6183
if (key) {
6184
skb_cb->cipher = key->cipher;
6185
skb_cb->flags |= ATH11K_SKB_CIPHER_SET;
6186
}
6187
6188
if (info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP) {
6189
skb_cb->flags |= ATH11K_SKB_HW_80211_ENCAP;
6190
} else if (ieee80211_is_mgmt(hdr->frame_control)) {
6191
is_prb_rsp = ieee80211_is_probe_resp(hdr->frame_control);
6192
ret = ath11k_mac_mgmt_tx(ar, skb, is_prb_rsp);
6193
if (ret) {
6194
ath11k_warn(ar->ab, "failed to queue management frame %d\n",
6195
ret);
6196
ieee80211_free_txskb(ar->hw, skb);
6197
}
6198
return;
6199
}
6200
6201
if (control->sta)
6202
arsta = (struct ath11k_sta *)control->sta->drv_priv;
6203
6204
ret = ath11k_dp_tx(ar, arvif, arsta, skb);
6205
if (unlikely(ret)) {
6206
ath11k_warn(ar->ab, "failed to transmit frame %d\n", ret);
6207
ieee80211_free_txskb(ar->hw, skb);
6208
}
6209
}
6210
6211
void ath11k_mac_drain_tx(struct ath11k *ar)
6212
{
6213
/* make sure rcu-protected mac80211 tx path itself is drained */
6214
synchronize_net();
6215
6216
cancel_work_sync(&ar->wmi_mgmt_tx_work);
6217
ath11k_mgmt_over_wmi_tx_purge(ar);
6218
}
6219
6220
static int ath11k_mac_config_mon_status_default(struct ath11k *ar, bool enable)
6221
{
6222
struct htt_rx_ring_tlv_filter tlv_filter = {0};
6223
struct ath11k_base *ab = ar->ab;
6224
int i, ret = 0;
6225
u32 ring_id;
6226
6227
if (enable) {
6228
tlv_filter = ath11k_mac_mon_status_filter_default;
6229
if (ath11k_debugfs_rx_filter(ar))
6230
tlv_filter.rx_filter = ath11k_debugfs_rx_filter(ar);
6231
}
6232
6233
for (i = 0; i < ab->hw_params.num_rxmda_per_pdev; i++) {
6234
ring_id = ar->dp.rx_mon_status_refill_ring[i].refill_buf_ring.ring_id;
6235
ret = ath11k_dp_tx_htt_rx_filter_setup(ar->ab, ring_id,
6236
ar->dp.mac_id + i,
6237
HAL_RXDMA_MONITOR_STATUS,
6238
DP_RX_BUFFER_SIZE,
6239
&tlv_filter);
6240
}
6241
6242
if (enable && !ar->ab->hw_params.rxdma1_enable)
6243
mod_timer(&ar->ab->mon_reap_timer, jiffies +
6244
msecs_to_jiffies(ATH11K_MON_TIMER_INTERVAL));
6245
6246
return ret;
6247
}
6248
6249
static void ath11k_mac_wait_reconfigure(struct ath11k_base *ab)
6250
{
6251
int recovery_start_count;
6252
6253
if (!ab->is_reset)
6254
return;
6255
6256
recovery_start_count = atomic_inc_return(&ab->recovery_start_count);
6257
ath11k_dbg(ab, ATH11K_DBG_MAC, "recovery start count %d\n", recovery_start_count);
6258
6259
if (recovery_start_count == ab->num_radios) {
6260
complete(&ab->recovery_start);
6261
ath11k_dbg(ab, ATH11K_DBG_MAC, "recovery started success\n");
6262
}
6263
6264
ath11k_dbg(ab, ATH11K_DBG_MAC, "waiting reconfigure...\n");
6265
6266
wait_for_completion_timeout(&ab->reconfigure_complete,
6267
ATH11K_RECONFIGURE_TIMEOUT_HZ);
6268
}
6269
6270
static int ath11k_mac_op_start(struct ieee80211_hw *hw)
6271
{
6272
struct ath11k *ar = hw->priv;
6273
struct ath11k_base *ab = ar->ab;
6274
struct ath11k_pdev *pdev = ar->pdev;
6275
int ret;
6276
6277
if (ath11k_ftm_mode) {
6278
ath11k_warn(ab, "mac operations not supported in factory test mode\n");
6279
return -EOPNOTSUPP;
6280
}
6281
6282
ath11k_mac_drain_tx(ar);
6283
mutex_lock(&ar->conf_mutex);
6284
6285
switch (ar->state) {
6286
case ATH11K_STATE_OFF:
6287
ar->state = ATH11K_STATE_ON;
6288
break;
6289
case ATH11K_STATE_RESTARTING:
6290
ar->state = ATH11K_STATE_RESTARTED;
6291
ath11k_mac_wait_reconfigure(ab);
6292
break;
6293
case ATH11K_STATE_RESTARTED:
6294
case ATH11K_STATE_WEDGED:
6295
case ATH11K_STATE_ON:
6296
case ATH11K_STATE_FTM:
6297
WARN_ON(1);
6298
ret = -EINVAL;
6299
goto err;
6300
}
6301
6302
ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_PMF_QOS,
6303
1, pdev->pdev_id);
6304
6305
if (ret) {
6306
ath11k_err(ar->ab, "failed to enable PMF QOS: (%d\n", ret);
6307
goto err;
6308
}
6309
6310
ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_DYNAMIC_BW, 1,
6311
pdev->pdev_id);
6312
if (ret) {
6313
ath11k_err(ar->ab, "failed to enable dynamic bw: %d\n", ret);
6314
goto err;
6315
}
6316
6317
if (test_bit(WMI_TLV_SERVICE_SPOOF_MAC_SUPPORT, ar->wmi->wmi_ab->svc_map)) {
6318
ret = ath11k_wmi_scan_prob_req_oui(ar, ar->mac_addr);
6319
if (ret) {
6320
ath11k_err(ab, "failed to set prob req oui: %i\n", ret);
6321
goto err;
6322
}
6323
}
6324
6325
ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_ARP_AC_OVERRIDE,
6326
0, pdev->pdev_id);
6327
if (ret) {
6328
ath11k_err(ab, "failed to set ac override for ARP: %d\n",
6329
ret);
6330
goto err;
6331
}
6332
6333
ret = ath11k_wmi_send_dfs_phyerr_offload_enable_cmd(ar, pdev->pdev_id);
6334
if (ret) {
6335
ath11k_err(ab, "failed to offload radar detection: %d\n",
6336
ret);
6337
goto err;
6338
}
6339
6340
ret = ath11k_dp_tx_htt_h2t_ppdu_stats_req(ar,
6341
HTT_PPDU_STATS_TAG_DEFAULT);
6342
if (ret) {
6343
ath11k_err(ab, "failed to req ppdu stats: %d\n", ret);
6344
goto err;
6345
}
6346
6347
ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_MESH_MCAST_ENABLE,
6348
1, pdev->pdev_id);
6349
6350
if (ret) {
6351
ath11k_err(ar->ab, "failed to enable MESH MCAST ENABLE: (%d\n", ret);
6352
goto err;
6353
}
6354
6355
__ath11k_set_antenna(ar, ar->cfg_tx_chainmask, ar->cfg_rx_chainmask);
6356
6357
/* TODO: Do we need to enable ANI? */
6358
6359
ath11k_reg_update_chan_list(ar, false);
6360
6361
ar->num_started_vdevs = 0;
6362
ar->num_created_vdevs = 0;
6363
ar->num_peers = 0;
6364
ar->allocated_vdev_map = 0;
6365
6366
/* Configure monitor status ring with default rx_filter to get rx status
6367
* such as rssi, rx_duration.
6368
*/
6369
ret = ath11k_mac_config_mon_status_default(ar, true);
6370
if (ret) {
6371
ath11k_err(ab, "failed to configure monitor status ring with default rx_filter: (%d)\n",
6372
ret);
6373
goto err;
6374
}
6375
6376
/* Configure the hash seed for hash based reo dest ring selection */
6377
ath11k_wmi_pdev_lro_cfg(ar, ar->pdev->pdev_id);
6378
6379
/* allow device to enter IMPS */
6380
if (ab->hw_params.idle_ps) {
6381
ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_IDLE_PS_CONFIG,
6382
1, pdev->pdev_id);
6383
if (ret) {
6384
ath11k_err(ab, "failed to enable idle ps: %d\n", ret);
6385
goto err;
6386
}
6387
}
6388
6389
mutex_unlock(&ar->conf_mutex);
6390
6391
rcu_assign_pointer(ab->pdevs_active[ar->pdev_idx],
6392
&ab->pdevs[ar->pdev_idx]);
6393
6394
return 0;
6395
6396
err:
6397
ar->state = ATH11K_STATE_OFF;
6398
mutex_unlock(&ar->conf_mutex);
6399
6400
return ret;
6401
}
6402
6403
static void ath11k_mac_op_stop(struct ieee80211_hw *hw)
6404
{
6405
struct ath11k *ar = hw->priv;
6406
struct htt_ppdu_stats_info *ppdu_stats, *tmp;
6407
int ret;
6408
6409
ath11k_mac_drain_tx(ar);
6410
6411
mutex_lock(&ar->conf_mutex);
6412
ret = ath11k_mac_config_mon_status_default(ar, false);
6413
if (ret)
6414
ath11k_err(ar->ab, "failed to clear rx_filter for monitor status ring: (%d)\n",
6415
ret);
6416
6417
clear_bit(ATH11K_CAC_RUNNING, &ar->dev_flags);
6418
ar->state = ATH11K_STATE_OFF;
6419
mutex_unlock(&ar->conf_mutex);
6420
6421
cancel_delayed_work_sync(&ar->scan.timeout);
6422
cancel_work_sync(&ar->regd_update_work);
6423
cancel_work_sync(&ar->ab->update_11d_work);
6424
6425
if (ar->state_11d == ATH11K_11D_PREPARING) {
6426
ar->state_11d = ATH11K_11D_IDLE;
6427
complete(&ar->completed_11d_scan);
6428
}
6429
6430
spin_lock_bh(&ar->data_lock);
6431
list_for_each_entry_safe(ppdu_stats, tmp, &ar->ppdu_stats_info, list) {
6432
list_del(&ppdu_stats->list);
6433
kfree(ppdu_stats);
6434
}
6435
spin_unlock_bh(&ar->data_lock);
6436
6437
rcu_assign_pointer(ar->ab->pdevs_active[ar->pdev_idx], NULL);
6438
6439
synchronize_rcu();
6440
6441
atomic_set(&ar->num_pending_mgmt_tx, 0);
6442
}
6443
6444
static int ath11k_mac_setup_vdev_params_mbssid(struct ath11k_vif *arvif,
6445
u32 *flags, u32 *tx_vdev_id)
6446
{
6447
struct ath11k *ar = arvif->ar;
6448
struct ath11k_vif *tx_arvif;
6449
struct ieee80211_vif *tx_vif;
6450
6451
*tx_vdev_id = 0;
6452
tx_vif = arvif->vif->mbssid_tx_vif;
6453
if (!tx_vif) {
6454
*flags = WMI_HOST_VDEV_FLAGS_NON_MBSSID_AP;
6455
return 0;
6456
}
6457
6458
tx_arvif = (void *)tx_vif->drv_priv;
6459
6460
if (arvif->vif->bss_conf.nontransmitted) {
6461
if (ar->hw->wiphy != ieee80211_vif_to_wdev(tx_vif)->wiphy)
6462
return -EINVAL;
6463
6464
*flags = WMI_HOST_VDEV_FLAGS_NON_TRANSMIT_AP;
6465
*tx_vdev_id = ath11k_vif_to_arvif(tx_vif)->vdev_id;
6466
} else if (tx_arvif == arvif) {
6467
*flags = WMI_HOST_VDEV_FLAGS_TRANSMIT_AP;
6468
} else {
6469
return -EINVAL;
6470
}
6471
6472
if (arvif->vif->bss_conf.ema_ap)
6473
*flags |= WMI_HOST_VDEV_FLAGS_EMA_MODE;
6474
6475
return 0;
6476
}
6477
6478
static int ath11k_mac_setup_vdev_create_params(struct ath11k_vif *arvif,
6479
struct vdev_create_params *params)
6480
{
6481
struct ath11k *ar = arvif->ar;
6482
struct ath11k_pdev *pdev = ar->pdev;
6483
int ret;
6484
6485
params->if_id = arvif->vdev_id;
6486
params->type = arvif->vdev_type;
6487
params->subtype = arvif->vdev_subtype;
6488
params->pdev_id = pdev->pdev_id;
6489
params->mbssid_flags = 0;
6490
params->mbssid_tx_vdev_id = 0;
6491
6492
if (!test_bit(WMI_TLV_SERVICE_MBSS_PARAM_IN_VDEV_START_SUPPORT,
6493
ar->ab->wmi_ab.svc_map)) {
6494
ret = ath11k_mac_setup_vdev_params_mbssid(arvif,
6495
&params->mbssid_flags,
6496
&params->mbssid_tx_vdev_id);
6497
if (ret)
6498
return ret;
6499
}
6500
6501
if (pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) {
6502
params->chains[NL80211_BAND_2GHZ].tx = ar->num_tx_chains;
6503
params->chains[NL80211_BAND_2GHZ].rx = ar->num_rx_chains;
6504
}
6505
if (pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) {
6506
params->chains[NL80211_BAND_5GHZ].tx = ar->num_tx_chains;
6507
params->chains[NL80211_BAND_5GHZ].rx = ar->num_rx_chains;
6508
}
6509
if (pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP &&
6510
ar->supports_6ghz) {
6511
params->chains[NL80211_BAND_6GHZ].tx = ar->num_tx_chains;
6512
params->chains[NL80211_BAND_6GHZ].rx = ar->num_rx_chains;
6513
}
6514
return 0;
6515
}
6516
6517
static void ath11k_mac_op_update_vif_offload(struct ieee80211_hw *hw,
6518
struct ieee80211_vif *vif)
6519
{
6520
struct ath11k *ar = hw->priv;
6521
struct ath11k_base *ab = ar->ab;
6522
struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
6523
u32 param_id, param_value;
6524
int ret;
6525
6526
param_id = WMI_VDEV_PARAM_TX_ENCAP_TYPE;
6527
if (ath11k_frame_mode != ATH11K_HW_TXRX_ETHERNET ||
6528
(vif->type != NL80211_IFTYPE_STATION &&
6529
vif->type != NL80211_IFTYPE_AP))
6530
vif->offload_flags &= ~(IEEE80211_OFFLOAD_ENCAP_ENABLED |
6531
IEEE80211_OFFLOAD_DECAP_ENABLED);
6532
6533
if (vif->offload_flags & IEEE80211_OFFLOAD_ENCAP_ENABLED)
6534
param_value = ATH11K_HW_TXRX_ETHERNET;
6535
else if (test_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags))
6536
param_value = ATH11K_HW_TXRX_RAW;
6537
else
6538
param_value = ATH11K_HW_TXRX_NATIVE_WIFI;
6539
6540
ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
6541
param_id, param_value);
6542
if (ret) {
6543
ath11k_warn(ab, "failed to set vdev %d tx encap mode: %d\n",
6544
arvif->vdev_id, ret);
6545
vif->offload_flags &= ~IEEE80211_OFFLOAD_ENCAP_ENABLED;
6546
}
6547
6548
param_id = WMI_VDEV_PARAM_RX_DECAP_TYPE;
6549
if (vif->offload_flags & IEEE80211_OFFLOAD_DECAP_ENABLED)
6550
param_value = ATH11K_HW_TXRX_ETHERNET;
6551
else if (test_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags))
6552
param_value = ATH11K_HW_TXRX_RAW;
6553
else
6554
param_value = ATH11K_HW_TXRX_NATIVE_WIFI;
6555
6556
ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
6557
param_id, param_value);
6558
if (ret) {
6559
ath11k_warn(ab, "failed to set vdev %d rx decap mode: %d\n",
6560
arvif->vdev_id, ret);
6561
vif->offload_flags &= ~IEEE80211_OFFLOAD_DECAP_ENABLED;
6562
}
6563
}
6564
6565
static bool ath11k_mac_vif_ap_active_any(struct ath11k_base *ab)
6566
{
6567
struct ath11k *ar;
6568
struct ath11k_pdev *pdev;
6569
struct ath11k_vif *arvif;
6570
int i;
6571
6572
for (i = 0; i < ab->num_radios; i++) {
6573
pdev = &ab->pdevs[i];
6574
ar = pdev->ar;
6575
list_for_each_entry(arvif, &ar->arvifs, list) {
6576
if (arvif->is_up && arvif->vdev_type == WMI_VDEV_TYPE_AP)
6577
return true;
6578
}
6579
}
6580
return false;
6581
}
6582
6583
void ath11k_mac_11d_scan_start(struct ath11k *ar, u32 vdev_id)
6584
{
6585
struct wmi_11d_scan_start_params param;
6586
int ret;
6587
6588
mutex_lock(&ar->ab->vdev_id_11d_lock);
6589
6590
ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev id for 11d scan %d\n",
6591
ar->vdev_id_11d_scan);
6592
6593
if (ar->regdom_set_by_user)
6594
goto fin;
6595
6596
if (ar->vdev_id_11d_scan != ATH11K_11D_INVALID_VDEV_ID)
6597
goto fin;
6598
6599
if (!test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map))
6600
goto fin;
6601
6602
if (ath11k_mac_vif_ap_active_any(ar->ab))
6603
goto fin;
6604
6605
param.vdev_id = vdev_id;
6606
param.start_interval_msec = 0;
6607
param.scan_period_msec = ATH11K_SCAN_11D_INTERVAL;
6608
6609
ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "start 11d scan\n");
6610
6611
ret = ath11k_wmi_send_11d_scan_start_cmd(ar, &param);
6612
if (ret) {
6613
ath11k_warn(ar->ab, "failed to start 11d scan vdev %d ret: %d\n",
6614
vdev_id, ret);
6615
} else {
6616
ar->vdev_id_11d_scan = vdev_id;
6617
if (ar->state_11d == ATH11K_11D_PREPARING)
6618
ar->state_11d = ATH11K_11D_RUNNING;
6619
}
6620
6621
fin:
6622
if (ar->state_11d == ATH11K_11D_PREPARING) {
6623
ar->state_11d = ATH11K_11D_IDLE;
6624
complete(&ar->completed_11d_scan);
6625
}
6626
6627
mutex_unlock(&ar->ab->vdev_id_11d_lock);
6628
}
6629
6630
void ath11k_mac_11d_scan_stop(struct ath11k *ar)
6631
{
6632
int ret;
6633
u32 vdev_id;
6634
6635
if (!test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map))
6636
return;
6637
6638
ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "stop 11d scan\n");
6639
6640
mutex_lock(&ar->ab->vdev_id_11d_lock);
6641
6642
ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "stop 11d vdev id %d\n",
6643
ar->vdev_id_11d_scan);
6644
6645
if (ar->state_11d == ATH11K_11D_PREPARING) {
6646
ar->state_11d = ATH11K_11D_IDLE;
6647
complete(&ar->completed_11d_scan);
6648
}
6649
6650
if (ar->vdev_id_11d_scan != ATH11K_11D_INVALID_VDEV_ID) {
6651
vdev_id = ar->vdev_id_11d_scan;
6652
6653
ret = ath11k_wmi_send_11d_scan_stop_cmd(ar, vdev_id);
6654
if (ret) {
6655
ath11k_warn(ar->ab,
6656
"failed to stopt 11d scan vdev %d ret: %d\n",
6657
vdev_id, ret);
6658
} else {
6659
ar->vdev_id_11d_scan = ATH11K_11D_INVALID_VDEV_ID;
6660
ar->state_11d = ATH11K_11D_IDLE;
6661
complete(&ar->completed_11d_scan);
6662
}
6663
}
6664
mutex_unlock(&ar->ab->vdev_id_11d_lock);
6665
}
6666
6667
void ath11k_mac_11d_scan_stop_all(struct ath11k_base *ab)
6668
{
6669
struct ath11k *ar;
6670
struct ath11k_pdev *pdev;
6671
int i;
6672
6673
ath11k_dbg(ab, ATH11K_DBG_MAC, "stop soc 11d scan\n");
6674
6675
for (i = 0; i < ab->num_radios; i++) {
6676
pdev = &ab->pdevs[i];
6677
ar = pdev->ar;
6678
6679
ath11k_mac_11d_scan_stop(ar);
6680
}
6681
}
6682
6683
static int ath11k_mac_vdev_delete(struct ath11k *ar, struct ath11k_vif *arvif)
6684
{
6685
unsigned long time_left;
6686
struct ieee80211_vif *vif = arvif->vif;
6687
int ret = 0;
6688
6689
lockdep_assert_held(&ar->conf_mutex);
6690
6691
reinit_completion(&ar->vdev_delete_done);
6692
6693
ret = ath11k_wmi_vdev_delete(ar, arvif->vdev_id);
6694
if (ret) {
6695
ath11k_warn(ar->ab, "failed to delete WMI vdev %d: %d\n",
6696
arvif->vdev_id, ret);
6697
return ret;
6698
}
6699
6700
time_left = wait_for_completion_timeout(&ar->vdev_delete_done,
6701
ATH11K_VDEV_DELETE_TIMEOUT_HZ);
6702
if (time_left == 0) {
6703
ath11k_warn(ar->ab, "Timeout in receiving vdev delete response\n");
6704
return -ETIMEDOUT;
6705
}
6706
6707
ar->ab->free_vdev_map |= 1LL << (arvif->vdev_id);
6708
ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id);
6709
ar->num_created_vdevs--;
6710
6711
ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %pM deleted, vdev_id %d\n",
6712
vif->addr, arvif->vdev_id);
6713
6714
return ret;
6715
}
6716
6717
static int ath11k_mac_op_add_interface(struct ieee80211_hw *hw,
6718
struct ieee80211_vif *vif)
6719
{
6720
struct ath11k *ar = hw->priv;
6721
struct ath11k_base *ab = ar->ab;
6722
struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
6723
struct vdev_create_params vdev_param = {0};
6724
struct peer_create_params peer_param;
6725
u32 param_id, param_value;
6726
u16 nss;
6727
int i;
6728
int ret, fbret;
6729
int bit;
6730
6731
vif->driver_flags |= IEEE80211_VIF_SUPPORTS_UAPSD;
6732
6733
mutex_lock(&ar->conf_mutex);
6734
6735
if (vif->type == NL80211_IFTYPE_AP &&
6736
ar->num_peers > (ar->max_num_peers - 1)) {
6737
ath11k_warn(ab, "failed to create vdev due to insufficient peer entry resource in firmware\n");
6738
ret = -ENOBUFS;
6739
goto err;
6740
}
6741
6742
if (ar->num_created_vdevs > (TARGET_NUM_VDEVS(ab) - 1)) {
6743
ath11k_warn(ab, "failed to create vdev %u, reached max vdev limit %d\n",
6744
ar->num_created_vdevs, TARGET_NUM_VDEVS(ab));
6745
ret = -EBUSY;
6746
goto err;
6747
}
6748
6749
/* In the case of hardware recovery, debugfs files are
6750
* not deleted since ieee80211_ops.remove_interface() is
6751
* not invoked. In such cases, try to delete the files.
6752
* These will be re-created later.
6753
*/
6754
ath11k_debugfs_remove_interface(arvif);
6755
6756
memset(arvif, 0, sizeof(*arvif));
6757
6758
arvif->ar = ar;
6759
arvif->vif = vif;
6760
6761
INIT_LIST_HEAD(&arvif->list);
6762
INIT_DELAYED_WORK(&arvif->connection_loss_work,
6763
ath11k_mac_vif_sta_connection_loss_work);
6764
6765
for (i = 0; i < ARRAY_SIZE(arvif->bitrate_mask.control); i++) {
6766
arvif->bitrate_mask.control[i].legacy = 0xffffffff;
6767
arvif->bitrate_mask.control[i].gi = NL80211_TXRATE_FORCE_SGI;
6768
memset(arvif->bitrate_mask.control[i].ht_mcs, 0xff,
6769
sizeof(arvif->bitrate_mask.control[i].ht_mcs));
6770
memset(arvif->bitrate_mask.control[i].vht_mcs, 0xff,
6771
sizeof(arvif->bitrate_mask.control[i].vht_mcs));
6772
memset(arvif->bitrate_mask.control[i].he_mcs, 0xff,
6773
sizeof(arvif->bitrate_mask.control[i].he_mcs));
6774
}
6775
6776
bit = __ffs64(ab->free_vdev_map);
6777
6778
arvif->vdev_id = bit;
6779
arvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE;
6780
6781
switch (vif->type) {
6782
case NL80211_IFTYPE_UNSPECIFIED:
6783
case NL80211_IFTYPE_STATION:
6784
arvif->vdev_type = WMI_VDEV_TYPE_STA;
6785
break;
6786
case NL80211_IFTYPE_MESH_POINT:
6787
arvif->vdev_subtype = WMI_VDEV_SUBTYPE_MESH_11S;
6788
fallthrough;
6789
case NL80211_IFTYPE_AP:
6790
arvif->vdev_type = WMI_VDEV_TYPE_AP;
6791
break;
6792
case NL80211_IFTYPE_MONITOR:
6793
arvif->vdev_type = WMI_VDEV_TYPE_MONITOR;
6794
ar->monitor_vdev_id = bit;
6795
break;
6796
default:
6797
WARN_ON(1);
6798
break;
6799
}
6800
6801
ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "add interface id %d type %d subtype %d map %llx\n",
6802
arvif->vdev_id, arvif->vdev_type, arvif->vdev_subtype,
6803
ab->free_vdev_map);
6804
6805
vif->cab_queue = arvif->vdev_id % (ATH11K_HW_MAX_QUEUES - 1);
6806
for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++)
6807
vif->hw_queue[i] = i % (ATH11K_HW_MAX_QUEUES - 1);
6808
6809
ret = ath11k_mac_setup_vdev_create_params(arvif, &vdev_param);
6810
if (ret) {
6811
ath11k_warn(ab, "failed to create vdev parameters %d: %d\n",
6812
arvif->vdev_id, ret);
6813
goto err;
6814
}
6815
6816
ret = ath11k_wmi_vdev_create(ar, vif->addr, &vdev_param);
6817
if (ret) {
6818
ath11k_warn(ab, "failed to create WMI vdev %d: %d\n",
6819
arvif->vdev_id, ret);
6820
goto err;
6821
}
6822
6823
ar->num_created_vdevs++;
6824
ath11k_dbg(ab, ATH11K_DBG_MAC, "vdev %pM created, vdev_id %d\n",
6825
vif->addr, arvif->vdev_id);
6826
ar->allocated_vdev_map |= 1LL << arvif->vdev_id;
6827
ab->free_vdev_map &= ~(1LL << arvif->vdev_id);
6828
6829
spin_lock_bh(&ar->data_lock);
6830
list_add(&arvif->list, &ar->arvifs);
6831
spin_unlock_bh(&ar->data_lock);
6832
6833
ath11k_mac_op_update_vif_offload(hw, vif);
6834
6835
nss = get_num_chains(ar->cfg_tx_chainmask) ? : 1;
6836
ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
6837
WMI_VDEV_PARAM_NSS, nss);
6838
if (ret) {
6839
ath11k_warn(ab, "failed to set vdev %d chainmask 0x%x, nss %d :%d\n",
6840
arvif->vdev_id, ar->cfg_tx_chainmask, nss, ret);
6841
goto err_vdev_del;
6842
}
6843
6844
switch (arvif->vdev_type) {
6845
case WMI_VDEV_TYPE_AP:
6846
peer_param.vdev_id = arvif->vdev_id;
6847
peer_param.peer_addr = vif->addr;
6848
peer_param.peer_type = WMI_PEER_TYPE_DEFAULT;
6849
ret = ath11k_peer_create(ar, arvif, NULL, &peer_param);
6850
if (ret) {
6851
ath11k_warn(ab, "failed to vdev %d create peer for AP: %d\n",
6852
arvif->vdev_id, ret);
6853
goto err_vdev_del;
6854
}
6855
6856
ret = ath11k_mac_set_kickout(arvif);
6857
if (ret) {
6858
ath11k_warn(ar->ab, "failed to set vdev %i kickout parameters: %d\n",
6859
arvif->vdev_id, ret);
6860
goto err_peer_del;
6861
}
6862
6863
ath11k_mac_11d_scan_stop_all(ar->ab);
6864
break;
6865
case WMI_VDEV_TYPE_STA:
6866
param_id = WMI_STA_PS_PARAM_RX_WAKE_POLICY;
6867
param_value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
6868
ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
6869
param_id, param_value);
6870
if (ret) {
6871
ath11k_warn(ar->ab, "failed to set vdev %d RX wake policy: %d\n",
6872
arvif->vdev_id, ret);
6873
goto err_peer_del;
6874
}
6875
6876
param_id = WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD;
6877
param_value = WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS;
6878
ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
6879
param_id, param_value);
6880
if (ret) {
6881
ath11k_warn(ar->ab, "failed to set vdev %d TX wake threshold: %d\n",
6882
arvif->vdev_id, ret);
6883
goto err_peer_del;
6884
}
6885
6886
param_id = WMI_STA_PS_PARAM_PSPOLL_COUNT;
6887
param_value = WMI_STA_PS_PSPOLL_COUNT_NO_MAX;
6888
ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
6889
param_id, param_value);
6890
if (ret) {
6891
ath11k_warn(ar->ab, "failed to set vdev %d pspoll count: %d\n",
6892
arvif->vdev_id, ret);
6893
goto err_peer_del;
6894
}
6895
6896
ret = ath11k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id,
6897
WMI_STA_PS_MODE_DISABLED);
6898
if (ret) {
6899
ath11k_warn(ar->ab, "failed to disable vdev %d ps mode: %d\n",
6900
arvif->vdev_id, ret);
6901
goto err_peer_del;
6902
}
6903
6904
if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ab->wmi_ab.svc_map)) {
6905
reinit_completion(&ar->completed_11d_scan);
6906
ar->state_11d = ATH11K_11D_PREPARING;
6907
}
6908
break;
6909
case WMI_VDEV_TYPE_MONITOR:
6910
set_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags);
6911
break;
6912
default:
6913
break;
6914
}
6915
6916
arvif->txpower = vif->bss_conf.txpower;
6917
ret = ath11k_mac_txpower_recalc(ar);
6918
if (ret)
6919
goto err_peer_del;
6920
6921
param_id = WMI_VDEV_PARAM_RTS_THRESHOLD;
6922
param_value = ar->hw->wiphy->rts_threshold;
6923
ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
6924
param_id, param_value);
6925
if (ret) {
6926
ath11k_warn(ar->ab, "failed to set rts threshold for vdev %d: %d\n",
6927
arvif->vdev_id, ret);
6928
}
6929
6930
ath11k_dp_vdev_tx_attach(ar, arvif);
6931
6932
ath11k_debugfs_add_interface(arvif);
6933
6934
if (vif->type != NL80211_IFTYPE_MONITOR &&
6935
test_bit(ATH11K_FLAG_MONITOR_CONF_ENABLED, &ar->monitor_flags)) {
6936
ret = ath11k_mac_monitor_vdev_create(ar);
6937
if (ret)
6938
ath11k_warn(ar->ab, "failed to create monitor vdev during add interface: %d",
6939
ret);
6940
}
6941
6942
mutex_unlock(&ar->conf_mutex);
6943
6944
return 0;
6945
6946
err_peer_del:
6947
if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
6948
fbret = ath11k_peer_delete(ar, arvif->vdev_id, vif->addr);
6949
if (fbret) {
6950
ath11k_warn(ar->ab, "fallback fail to delete peer addr %pM vdev_id %d ret %d\n",
6951
vif->addr, arvif->vdev_id, fbret);
6952
goto err;
6953
}
6954
}
6955
6956
err_vdev_del:
6957
ath11k_mac_vdev_delete(ar, arvif);
6958
spin_lock_bh(&ar->data_lock);
6959
list_del(&arvif->list);
6960
spin_unlock_bh(&ar->data_lock);
6961
6962
err:
6963
mutex_unlock(&ar->conf_mutex);
6964
6965
return ret;
6966
}
6967
6968
static int ath11k_mac_vif_unref(int buf_id, void *skb, void *ctx)
6969
{
6970
struct ieee80211_vif *vif = (struct ieee80211_vif *)ctx;
6971
struct ath11k_skb_cb *skb_cb = ATH11K_SKB_CB((struct sk_buff *)skb);
6972
6973
if (skb_cb->vif == vif)
6974
skb_cb->vif = NULL;
6975
6976
return 0;
6977
}
6978
6979
static void ath11k_mac_op_remove_interface(struct ieee80211_hw *hw,
6980
struct ieee80211_vif *vif)
6981
{
6982
struct ath11k *ar = hw->priv;
6983
struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
6984
struct ath11k_base *ab = ar->ab;
6985
int ret;
6986
int i;
6987
6988
cancel_delayed_work_sync(&arvif->connection_loss_work);
6989
6990
mutex_lock(&ar->conf_mutex);
6991
6992
ath11k_dbg(ab, ATH11K_DBG_MAC, "remove interface (vdev %d)\n",
6993
arvif->vdev_id);
6994
6995
ret = ath11k_spectral_vif_stop(arvif);
6996
if (ret)
6997
ath11k_warn(ab, "failed to stop spectral for vdev %i: %d\n",
6998
arvif->vdev_id, ret);
6999
7000
if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
7001
ath11k_mac_11d_scan_stop(ar);
7002
7003
if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
7004
ret = ath11k_peer_delete(ar, arvif->vdev_id, vif->addr);
7005
if (ret)
7006
ath11k_warn(ab, "failed to submit AP self-peer removal on vdev %d: %d\n",
7007
arvif->vdev_id, ret);
7008
}
7009
7010
ret = ath11k_mac_vdev_delete(ar, arvif);
7011
if (ret) {
7012
ath11k_warn(ab, "failed to delete vdev %d: %d\n",
7013
arvif->vdev_id, ret);
7014
goto err_vdev_del;
7015
}
7016
7017
if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
7018
clear_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags);
7019
ar->monitor_vdev_id = -1;
7020
} else if (test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags) &&
7021
!test_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags)) {
7022
ret = ath11k_mac_monitor_vdev_delete(ar);
7023
if (ret)
7024
/* continue even if there's an error */
7025
ath11k_warn(ar->ab, "failed to delete vdev monitor during remove interface: %d",
7026
ret);
7027
}
7028
7029
err_vdev_del:
7030
spin_lock_bh(&ar->data_lock);
7031
list_del(&arvif->list);
7032
spin_unlock_bh(&ar->data_lock);
7033
7034
ath11k_peer_cleanup(ar, arvif->vdev_id);
7035
7036
idr_for_each(&ar->txmgmt_idr,
7037
ath11k_mac_vif_txmgmt_idr_remove, vif);
7038
7039
for (i = 0; i < ab->hw_params.max_tx_ring; i++) {
7040
spin_lock_bh(&ab->dp.tx_ring[i].tx_idr_lock);
7041
idr_for_each(&ab->dp.tx_ring[i].txbuf_idr,
7042
ath11k_mac_vif_unref, vif);
7043
spin_unlock_bh(&ab->dp.tx_ring[i].tx_idr_lock);
7044
}
7045
7046
/* Recalc txpower for remaining vdev */
7047
ath11k_mac_txpower_recalc(ar);
7048
7049
ath11k_debugfs_remove_interface(arvif);
7050
7051
/* TODO: recal traffic pause state based on the available vdevs */
7052
7053
mutex_unlock(&ar->conf_mutex);
7054
}
7055
7056
/* FIXME: Has to be verified. */
7057
#define SUPPORTED_FILTERS \
7058
(FIF_ALLMULTI | \
7059
FIF_CONTROL | \
7060
FIF_PSPOLL | \
7061
FIF_OTHER_BSS | \
7062
FIF_BCN_PRBRESP_PROMISC | \
7063
FIF_PROBE_REQ | \
7064
FIF_FCSFAIL)
7065
7066
static void ath11k_mac_op_configure_filter(struct ieee80211_hw *hw,
7067
unsigned int changed_flags,
7068
unsigned int *total_flags,
7069
u64 multicast)
7070
{
7071
struct ath11k *ar = hw->priv;
7072
7073
mutex_lock(&ar->conf_mutex);
7074
7075
*total_flags &= SUPPORTED_FILTERS;
7076
ar->filter_flags = *total_flags;
7077
7078
mutex_unlock(&ar->conf_mutex);
7079
}
7080
7081
static int ath11k_mac_op_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant)
7082
{
7083
struct ath11k *ar = hw->priv;
7084
7085
mutex_lock(&ar->conf_mutex);
7086
7087
*tx_ant = ar->cfg_tx_chainmask;
7088
*rx_ant = ar->cfg_rx_chainmask;
7089
7090
mutex_unlock(&ar->conf_mutex);
7091
7092
return 0;
7093
}
7094
7095
static int ath11k_mac_op_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)
7096
{
7097
struct ath11k *ar = hw->priv;
7098
int ret;
7099
7100
mutex_lock(&ar->conf_mutex);
7101
ret = __ath11k_set_antenna(ar, tx_ant, rx_ant);
7102
mutex_unlock(&ar->conf_mutex);
7103
7104
return ret;
7105
}
7106
7107
static int ath11k_mac_op_ampdu_action(struct ieee80211_hw *hw,
7108
struct ieee80211_vif *vif,
7109
struct ieee80211_ampdu_params *params)
7110
{
7111
struct ath11k *ar = hw->priv;
7112
int ret = -EINVAL;
7113
7114
mutex_lock(&ar->conf_mutex);
7115
7116
switch (params->action) {
7117
case IEEE80211_AMPDU_RX_START:
7118
ret = ath11k_dp_rx_ampdu_start(ar, params);
7119
break;
7120
case IEEE80211_AMPDU_RX_STOP:
7121
ret = ath11k_dp_rx_ampdu_stop(ar, params);
7122
break;
7123
case IEEE80211_AMPDU_TX_START:
7124
case IEEE80211_AMPDU_TX_STOP_CONT:
7125
case IEEE80211_AMPDU_TX_STOP_FLUSH:
7126
case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
7127
case IEEE80211_AMPDU_TX_OPERATIONAL:
7128
/* Tx A-MPDU aggregation offloaded to hw/fw so deny mac80211
7129
* Tx aggregation requests.
7130
*/
7131
ret = -EOPNOTSUPP;
7132
break;
7133
}
7134
7135
mutex_unlock(&ar->conf_mutex);
7136
7137
return ret;
7138
}
7139
7140
static int ath11k_mac_op_add_chanctx(struct ieee80211_hw *hw,
7141
struct ieee80211_chanctx_conf *ctx)
7142
{
7143
struct ath11k *ar = hw->priv;
7144
struct ath11k_base *ab = ar->ab;
7145
7146
ath11k_dbg(ab, ATH11K_DBG_MAC,
7147
"chanctx add freq %u width %d ptr %p\n",
7148
ctx->def.chan->center_freq, ctx->def.width, ctx);
7149
7150
mutex_lock(&ar->conf_mutex);
7151
7152
spin_lock_bh(&ar->data_lock);
7153
/* TODO: In case of multiple channel context, populate rx_channel from
7154
* Rx PPDU desc information.
7155
*/
7156
ar->rx_channel = ctx->def.chan;
7157
spin_unlock_bh(&ar->data_lock);
7158
7159
mutex_unlock(&ar->conf_mutex);
7160
7161
return 0;
7162
}
7163
7164
static void ath11k_mac_op_remove_chanctx(struct ieee80211_hw *hw,
7165
struct ieee80211_chanctx_conf *ctx)
7166
{
7167
struct ath11k *ar = hw->priv;
7168
struct ath11k_base *ab = ar->ab;
7169
7170
ath11k_dbg(ab, ATH11K_DBG_MAC,
7171
"chanctx remove freq %u width %d ptr %p\n",
7172
ctx->def.chan->center_freq, ctx->def.width, ctx);
7173
7174
mutex_lock(&ar->conf_mutex);
7175
7176
spin_lock_bh(&ar->data_lock);
7177
/* TODO: In case of there is one more channel context left, populate
7178
* rx_channel with the channel of that remaining channel context.
7179
*/
7180
ar->rx_channel = NULL;
7181
spin_unlock_bh(&ar->data_lock);
7182
7183
mutex_unlock(&ar->conf_mutex);
7184
}
7185
7186
static int
7187
ath11k_mac_vdev_start_restart(struct ath11k_vif *arvif,
7188
struct ieee80211_chanctx_conf *ctx,
7189
bool restart)
7190
{
7191
struct ath11k *ar = arvif->ar;
7192
struct ath11k_base *ab = ar->ab;
7193
struct wmi_vdev_start_req_arg arg = {};
7194
const struct cfg80211_chan_def *chandef = &ctx->def;
7195
int ret = 0;
7196
7197
lockdep_assert_held(&ar->conf_mutex);
7198
7199
reinit_completion(&ar->vdev_setup_done);
7200
7201
arg.vdev_id = arvif->vdev_id;
7202
arg.dtim_period = arvif->dtim_period;
7203
arg.bcn_intval = arvif->beacon_interval;
7204
7205
arg.channel.freq = chandef->chan->center_freq;
7206
arg.channel.band_center_freq1 = chandef->center_freq1;
7207
arg.channel.band_center_freq2 = chandef->center_freq2;
7208
arg.channel.mode =
7209
ath11k_phymodes[chandef->chan->band][chandef->width];
7210
7211
arg.channel.min_power = 0;
7212
arg.channel.max_power = chandef->chan->max_power;
7213
arg.channel.max_reg_power = chandef->chan->max_reg_power;
7214
arg.channel.max_antenna_gain = chandef->chan->max_antenna_gain;
7215
7216
arg.pref_tx_streams = ar->num_tx_chains;
7217
arg.pref_rx_streams = ar->num_rx_chains;
7218
7219
arg.mbssid_flags = 0;
7220
arg.mbssid_tx_vdev_id = 0;
7221
if (test_bit(WMI_TLV_SERVICE_MBSS_PARAM_IN_VDEV_START_SUPPORT,
7222
ar->ab->wmi_ab.svc_map)) {
7223
ret = ath11k_mac_setup_vdev_params_mbssid(arvif,
7224
&arg.mbssid_flags,
7225
&arg.mbssid_tx_vdev_id);
7226
if (ret)
7227
return ret;
7228
}
7229
7230
if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
7231
arg.ssid = arvif->u.ap.ssid;
7232
arg.ssid_len = arvif->u.ap.ssid_len;
7233
arg.hidden_ssid = arvif->u.ap.hidden_ssid;
7234
7235
/* For now allow DFS for AP mode */
7236
arg.channel.chan_radar =
7237
!!(chandef->chan->flags & IEEE80211_CHAN_RADAR);
7238
7239
arg.channel.freq2_radar = ctx->radar_enabled;
7240
7241
arg.channel.passive = arg.channel.chan_radar;
7242
7243
spin_lock_bh(&ab->base_lock);
7244
arg.regdomain = ar->ab->dfs_region;
7245
spin_unlock_bh(&ab->base_lock);
7246
}
7247
7248
arg.channel.passive |= !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR);
7249
7250
ath11k_dbg(ab, ATH11K_DBG_MAC,
7251
"vdev %d start center_freq %d phymode %s\n",
7252
arg.vdev_id, arg.channel.freq,
7253
ath11k_wmi_phymode_str(arg.channel.mode));
7254
7255
ret = ath11k_wmi_vdev_start(ar, &arg, restart);
7256
if (ret) {
7257
ath11k_warn(ar->ab, "failed to %s WMI vdev %i\n",
7258
restart ? "restart" : "start", arg.vdev_id);
7259
return ret;
7260
}
7261
7262
ret = ath11k_mac_vdev_setup_sync(ar);
7263
if (ret) {
7264
ath11k_warn(ab, "failed to synchronize setup for vdev %i %s: %d\n",
7265
arg.vdev_id, restart ? "restart" : "start", ret);
7266
return ret;
7267
}
7268
7269
if (!restart)
7270
ar->num_started_vdevs++;
7271
7272
ath11k_dbg(ab, ATH11K_DBG_MAC, "vdev %pM started, vdev_id %d\n",
7273
arvif->vif->addr, arvif->vdev_id);
7274
7275
/* Enable CAC Flag in the driver by checking the channel DFS cac time,
7276
* i.e dfs_cac_ms value which will be valid only for radar channels
7277
* and state as NL80211_DFS_USABLE which indicates CAC needs to be
7278
* done before channel usage. This flags is used to drop rx packets.
7279
* during CAC.
7280
*/
7281
/* TODO Set the flag for other interface types as required */
7282
if (arvif->vdev_type == WMI_VDEV_TYPE_AP &&
7283
chandef->chan->dfs_cac_ms &&
7284
chandef->chan->dfs_state == NL80211_DFS_USABLE) {
7285
set_bit(ATH11K_CAC_RUNNING, &ar->dev_flags);
7286
ath11k_dbg(ab, ATH11K_DBG_MAC,
7287
"CAC Started in chan_freq %d for vdev %d\n",
7288
arg.channel.freq, arg.vdev_id);
7289
}
7290
7291
ret = ath11k_mac_set_txbf_conf(arvif);
7292
if (ret)
7293
ath11k_warn(ab, "failed to set txbf conf for vdev %d: %d\n",
7294
arvif->vdev_id, ret);
7295
7296
return 0;
7297
}
7298
7299
static int ath11k_mac_vdev_stop(struct ath11k_vif *arvif)
7300
{
7301
struct ath11k *ar = arvif->ar;
7302
int ret;
7303
7304
lockdep_assert_held(&ar->conf_mutex);
7305
7306
reinit_completion(&ar->vdev_setup_done);
7307
7308
ret = ath11k_wmi_vdev_stop(ar, arvif->vdev_id);
7309
if (ret) {
7310
ath11k_warn(ar->ab, "failed to stop WMI vdev %i: %d\n",
7311
arvif->vdev_id, ret);
7312
goto err;
7313
}
7314
7315
ret = ath11k_mac_vdev_setup_sync(ar);
7316
if (ret) {
7317
ath11k_warn(ar->ab, "failed to synchronize setup for vdev %i: %d\n",
7318
arvif->vdev_id, ret);
7319
goto err;
7320
}
7321
7322
WARN_ON(ar->num_started_vdevs == 0);
7323
7324
ar->num_started_vdevs--;
7325
ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %pM stopped, vdev_id %d\n",
7326
arvif->vif->addr, arvif->vdev_id);
7327
7328
if (test_bit(ATH11K_CAC_RUNNING, &ar->dev_flags)) {
7329
clear_bit(ATH11K_CAC_RUNNING, &ar->dev_flags);
7330
ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "CAC Stopped for vdev %d\n",
7331
arvif->vdev_id);
7332
}
7333
7334
return 0;
7335
err:
7336
return ret;
7337
}
7338
7339
static int ath11k_mac_vdev_start(struct ath11k_vif *arvif,
7340
struct ieee80211_chanctx_conf *ctx)
7341
{
7342
return ath11k_mac_vdev_start_restart(arvif, ctx, false);
7343
}
7344
7345
static int ath11k_mac_vdev_restart(struct ath11k_vif *arvif,
7346
struct ieee80211_chanctx_conf *ctx)
7347
{
7348
return ath11k_mac_vdev_start_restart(arvif, ctx, true);
7349
}
7350
7351
struct ath11k_mac_change_chanctx_arg {
7352
struct ieee80211_chanctx_conf *ctx;
7353
struct ieee80211_vif_chanctx_switch *vifs;
7354
int n_vifs;
7355
int next_vif;
7356
};
7357
7358
static void
7359
ath11k_mac_change_chanctx_cnt_iter(void *data, u8 *mac,
7360
struct ieee80211_vif *vif)
7361
{
7362
struct ath11k_mac_change_chanctx_arg *arg = data;
7363
7364
if (rcu_access_pointer(vif->bss_conf.chanctx_conf) != arg->ctx)
7365
return;
7366
7367
arg->n_vifs++;
7368
}
7369
7370
static void
7371
ath11k_mac_change_chanctx_fill_iter(void *data, u8 *mac,
7372
struct ieee80211_vif *vif)
7373
{
7374
struct ath11k_mac_change_chanctx_arg *arg = data;
7375
struct ieee80211_chanctx_conf *ctx;
7376
7377
ctx = rcu_access_pointer(vif->bss_conf.chanctx_conf);
7378
if (ctx != arg->ctx)
7379
return;
7380
7381
if (WARN_ON(arg->next_vif == arg->n_vifs))
7382
return;
7383
7384
arg->vifs[arg->next_vif].vif = vif;
7385
arg->vifs[arg->next_vif].old_ctx = ctx;
7386
arg->vifs[arg->next_vif].new_ctx = ctx;
7387
arg->next_vif++;
7388
}
7389
7390
static void
7391
ath11k_mac_update_vif_chan(struct ath11k *ar,
7392
struct ieee80211_vif_chanctx_switch *vifs,
7393
int n_vifs)
7394
{
7395
struct ath11k_base *ab = ar->ab;
7396
struct ath11k_vif *arvif, *tx_arvif = NULL;
7397
struct ieee80211_vif *mbssid_tx_vif;
7398
int ret;
7399
int i;
7400
bool monitor_vif = false;
7401
7402
lockdep_assert_held(&ar->conf_mutex);
7403
7404
/* Associated channel resources of all relevant vdevs
7405
* should be available for the channel switch now.
7406
*/
7407
7408
/* TODO: Update ar->rx_channel */
7409
7410
for (i = 0; i < n_vifs; i++) {
7411
arvif = (void *)vifs[i].vif->drv_priv;
7412
7413
if (WARN_ON(!arvif->is_started))
7414
continue;
7415
7416
/* change_chanctx can be called even before vdev_up from
7417
* ieee80211_start_ap->ieee80211_vif_use_channel->
7418
* ieee80211_recalc_radar_chanctx.
7419
*
7420
* Firmware expect vdev_restart only if vdev is up.
7421
* If vdev is down then it expect vdev_stop->vdev_start.
7422
*/
7423
if (arvif->is_up) {
7424
ret = ath11k_mac_vdev_restart(arvif, vifs[i].new_ctx);
7425
if (ret) {
7426
ath11k_warn(ab, "failed to restart vdev %d: %d\n",
7427
arvif->vdev_id, ret);
7428
continue;
7429
}
7430
} else {
7431
ret = ath11k_mac_vdev_stop(arvif);
7432
if (ret) {
7433
ath11k_warn(ab, "failed to stop vdev %d: %d\n",
7434
arvif->vdev_id, ret);
7435
continue;
7436
}
7437
7438
ret = ath11k_mac_vdev_start(arvif, vifs[i].new_ctx);
7439
if (ret)
7440
ath11k_warn(ab, "failed to start vdev %d: %d\n",
7441
arvif->vdev_id, ret);
7442
7443
continue;
7444
}
7445
7446
ret = ath11k_mac_setup_bcn_tmpl(arvif);
7447
if (ret)
7448
ath11k_warn(ab, "failed to update bcn tmpl during csa: %d\n",
7449
ret);
7450
7451
mbssid_tx_vif = arvif->vif->mbssid_tx_vif;
7452
if (mbssid_tx_vif)
7453
tx_arvif = (struct ath11k_vif *)mbssid_tx_vif->drv_priv;
7454
7455
ret = ath11k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
7456
arvif->bssid,
7457
tx_arvif ? tx_arvif->bssid : NULL,
7458
arvif->vif->bss_conf.bssid_index,
7459
1 << arvif->vif->bss_conf.bssid_indicator);
7460
if (ret) {
7461
ath11k_warn(ab, "failed to bring vdev up %d: %d\n",
7462
arvif->vdev_id, ret);
7463
continue;
7464
}
7465
}
7466
7467
/* Restart the internal monitor vdev on new channel */
7468
if (!monitor_vif &&
7469
test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags)) {
7470
ret = ath11k_mac_monitor_stop(ar);
7471
if (ret) {
7472
ath11k_warn(ar->ab, "failed to stop monitor during vif channel update: %d",
7473
ret);
7474
return;
7475
}
7476
7477
ret = ath11k_mac_monitor_start(ar);
7478
if (ret) {
7479
ath11k_warn(ar->ab, "failed to start monitor during vif channel update: %d",
7480
ret);
7481
return;
7482
}
7483
}
7484
}
7485
7486
static void
7487
ath11k_mac_update_active_vif_chan(struct ath11k *ar,
7488
struct ieee80211_chanctx_conf *ctx)
7489
{
7490
struct ath11k_mac_change_chanctx_arg arg = { .ctx = ctx };
7491
7492
lockdep_assert_held(&ar->conf_mutex);
7493
7494
ieee80211_iterate_active_interfaces_atomic(ar->hw,
7495
IEEE80211_IFACE_ITER_NORMAL,
7496
ath11k_mac_change_chanctx_cnt_iter,
7497
&arg);
7498
if (arg.n_vifs == 0)
7499
return;
7500
7501
arg.vifs = kcalloc(arg.n_vifs, sizeof(arg.vifs[0]), GFP_KERNEL);
7502
if (!arg.vifs)
7503
return;
7504
7505
ieee80211_iterate_active_interfaces_atomic(ar->hw,
7506
IEEE80211_IFACE_ITER_NORMAL,
7507
ath11k_mac_change_chanctx_fill_iter,
7508
&arg);
7509
7510
ath11k_mac_update_vif_chan(ar, arg.vifs, arg.n_vifs);
7511
7512
kfree(arg.vifs);
7513
}
7514
7515
static void ath11k_mac_op_change_chanctx(struct ieee80211_hw *hw,
7516
struct ieee80211_chanctx_conf *ctx,
7517
u32 changed)
7518
{
7519
struct ath11k *ar = hw->priv;
7520
struct ath11k_base *ab = ar->ab;
7521
7522
mutex_lock(&ar->conf_mutex);
7523
7524
ath11k_dbg(ab, ATH11K_DBG_MAC,
7525
"chanctx change freq %u width %d ptr %p changed %x\n",
7526
ctx->def.chan->center_freq, ctx->def.width, ctx, changed);
7527
7528
/* This shouldn't really happen because channel switching should use
7529
* switch_vif_chanctx().
7530
*/
7531
if (WARN_ON(changed & IEEE80211_CHANCTX_CHANGE_CHANNEL))
7532
goto unlock;
7533
7534
if (changed & IEEE80211_CHANCTX_CHANGE_WIDTH ||
7535
changed & IEEE80211_CHANCTX_CHANGE_RADAR)
7536
ath11k_mac_update_active_vif_chan(ar, ctx);
7537
7538
/* TODO: Recalc radar detection */
7539
7540
unlock:
7541
mutex_unlock(&ar->conf_mutex);
7542
}
7543
7544
static int ath11k_start_vdev_delay(struct ieee80211_hw *hw,
7545
struct ieee80211_vif *vif)
7546
{
7547
struct ath11k *ar = hw->priv;
7548
struct ath11k_base *ab = ar->ab;
7549
struct ath11k_vif *arvif = (void *)vif->drv_priv;
7550
int ret;
7551
7552
if (WARN_ON(arvif->is_started))
7553
return -EBUSY;
7554
7555
ret = ath11k_mac_vdev_start(arvif, &arvif->chanctx);
7556
if (ret) {
7557
ath11k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n",
7558
arvif->vdev_id, vif->addr,
7559
arvif->chanctx.def.chan->center_freq, ret);
7560
return ret;
7561
}
7562
7563
/* Reconfigure hardware rate code since it is cleared by firmware.
7564
*/
7565
if (ar->hw_rate_code > 0) {
7566
u32 vdev_param = WMI_VDEV_PARAM_MGMT_RATE;
7567
7568
ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param,
7569
ar->hw_rate_code);
7570
if (ret) {
7571
ath11k_warn(ar->ab, "failed to set mgmt tx rate %d\n", ret);
7572
return ret;
7573
}
7574
}
7575
7576
if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
7577
ret = ath11k_wmi_vdev_up(ar, arvif->vdev_id, 0, ar->mac_addr,
7578
NULL, 0, 0);
7579
if (ret) {
7580
ath11k_warn(ab, "failed put monitor up: %d\n", ret);
7581
return ret;
7582
}
7583
}
7584
7585
arvif->is_started = true;
7586
7587
/* TODO: Setup ps and cts/rts protection */
7588
return 0;
7589
}
7590
7591
static int
7592
ath11k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw,
7593
struct ieee80211_vif *vif,
7594
struct ieee80211_bss_conf *link_conf,
7595
struct ieee80211_chanctx_conf *ctx)
7596
{
7597
struct ath11k *ar = hw->priv;
7598
struct ath11k_base *ab = ar->ab;
7599
struct ath11k_vif *arvif = (void *)vif->drv_priv;
7600
int ret;
7601
struct peer_create_params param;
7602
7603
mutex_lock(&ar->conf_mutex);
7604
7605
ath11k_dbg(ab, ATH11K_DBG_MAC,
7606
"chanctx assign ptr %p vdev_id %i\n",
7607
ctx, arvif->vdev_id);
7608
7609
/* for QCA6390 bss peer must be created before vdev_start */
7610
if (ab->hw_params.vdev_start_delay &&
7611
arvif->vdev_type != WMI_VDEV_TYPE_AP &&
7612
arvif->vdev_type != WMI_VDEV_TYPE_MONITOR &&
7613
!ath11k_peer_find_by_vdev_id(ab, arvif->vdev_id)) {
7614
memcpy(&arvif->chanctx, ctx, sizeof(*ctx));
7615
ret = 0;
7616
goto out;
7617
}
7618
7619
if (WARN_ON(arvif->is_started)) {
7620
ret = -EBUSY;
7621
goto out;
7622
}
7623
7624
if (ab->hw_params.vdev_start_delay &&
7625
arvif->vdev_type != WMI_VDEV_TYPE_AP &&
7626
arvif->vdev_type != WMI_VDEV_TYPE_MONITOR) {
7627
param.vdev_id = arvif->vdev_id;
7628
param.peer_type = WMI_PEER_TYPE_DEFAULT;
7629
param.peer_addr = ar->mac_addr;
7630
7631
ret = ath11k_peer_create(ar, arvif, NULL, &param);
7632
if (ret) {
7633
ath11k_warn(ab, "failed to create peer after vdev start delay: %d",
7634
ret);
7635
goto out;
7636
}
7637
}
7638
7639
if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
7640
ret = ath11k_mac_monitor_start(ar);
7641
if (ret) {
7642
ath11k_warn(ar->ab, "failed to start monitor during vif channel context assignment: %d",
7643
ret);
7644
goto out;
7645
}
7646
7647
arvif->is_started = true;
7648
goto out;
7649
}
7650
7651
ret = ath11k_mac_vdev_start(arvif, ctx);
7652
if (ret) {
7653
ath11k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n",
7654
arvif->vdev_id, vif->addr,
7655
ctx->def.chan->center_freq, ret);
7656
goto out;
7657
}
7658
7659
arvif->is_started = true;
7660
7661
if (arvif->vdev_type != WMI_VDEV_TYPE_MONITOR &&
7662
test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags)) {
7663
ret = ath11k_mac_monitor_start(ar);
7664
if (ret) {
7665
ath11k_warn(ar->ab, "failed to start monitor during vif channel context assignment: %d",
7666
ret);
7667
goto out;
7668
}
7669
}
7670
7671
/* TODO: Setup ps and cts/rts protection */
7672
7673
ret = 0;
7674
7675
out:
7676
mutex_unlock(&ar->conf_mutex);
7677
7678
return ret;
7679
}
7680
7681
static void
7682
ath11k_mac_op_unassign_vif_chanctx(struct ieee80211_hw *hw,
7683
struct ieee80211_vif *vif,
7684
struct ieee80211_bss_conf *link_conf,
7685
struct ieee80211_chanctx_conf *ctx)
7686
{
7687
struct ath11k *ar = hw->priv;
7688
struct ath11k_base *ab = ar->ab;
7689
struct ath11k_vif *arvif = (void *)vif->drv_priv;
7690
struct ath11k_peer *peer;
7691
int ret;
7692
7693
mutex_lock(&ar->conf_mutex);
7694
7695
ath11k_dbg(ab, ATH11K_DBG_MAC,
7696
"chanctx unassign ptr %p vdev_id %i\n",
7697
ctx, arvif->vdev_id);
7698
7699
WARN_ON(!arvif->is_started);
7700
7701
if (ab->hw_params.vdev_start_delay &&
7702
arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
7703
spin_lock_bh(&ab->base_lock);
7704
peer = ath11k_peer_find_by_addr(ab, ar->mac_addr);
7705
spin_unlock_bh(&ab->base_lock);
7706
if (peer)
7707
ath11k_peer_delete(ar, arvif->vdev_id, ar->mac_addr);
7708
}
7709
7710
if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
7711
ret = ath11k_mac_monitor_stop(ar);
7712
if (ret) {
7713
ath11k_warn(ar->ab, "failed to stop monitor during vif channel context unassignment: %d",
7714
ret);
7715
mutex_unlock(&ar->conf_mutex);
7716
return;
7717
}
7718
7719
arvif->is_started = false;
7720
mutex_unlock(&ar->conf_mutex);
7721
return;
7722
}
7723
7724
ret = ath11k_mac_vdev_stop(arvif);
7725
if (ret)
7726
ath11k_warn(ab, "failed to stop vdev %i: %d\n",
7727
arvif->vdev_id, ret);
7728
7729
arvif->is_started = false;
7730
7731
if (ab->hw_params.vdev_start_delay &&
7732
arvif->vdev_type == WMI_VDEV_TYPE_STA) {
7733
ret = ath11k_peer_delete(ar, arvif->vdev_id, arvif->bssid);
7734
if (ret)
7735
ath11k_warn(ar->ab,
7736
"failed to delete peer %pM for vdev %d: %d\n",
7737
arvif->bssid, arvif->vdev_id, ret);
7738
else
7739
ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
7740
"removed peer %pM vdev %d after vdev stop\n",
7741
arvif->bssid, arvif->vdev_id);
7742
}
7743
7744
if (ab->hw_params.vdev_start_delay &&
7745
arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
7746
ath11k_wmi_vdev_down(ar, arvif->vdev_id);
7747
7748
if (arvif->vdev_type != WMI_VDEV_TYPE_MONITOR &&
7749
ar->num_started_vdevs == 1 &&
7750
test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags)) {
7751
ret = ath11k_mac_monitor_stop(ar);
7752
if (ret)
7753
/* continue even if there's an error */
7754
ath11k_warn(ar->ab, "failed to stop monitor during vif channel context unassignment: %d",
7755
ret);
7756
}
7757
7758
if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
7759
ath11k_mac_11d_scan_start(ar, arvif->vdev_id);
7760
7761
mutex_unlock(&ar->conf_mutex);
7762
}
7763
7764
static int
7765
ath11k_mac_op_switch_vif_chanctx(struct ieee80211_hw *hw,
7766
struct ieee80211_vif_chanctx_switch *vifs,
7767
int n_vifs,
7768
enum ieee80211_chanctx_switch_mode mode)
7769
{
7770
struct ath11k *ar = hw->priv;
7771
7772
mutex_lock(&ar->conf_mutex);
7773
7774
ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
7775
"chanctx switch n_vifs %d mode %d\n",
7776
n_vifs, mode);
7777
ath11k_mac_update_vif_chan(ar, vifs, n_vifs);
7778
7779
mutex_unlock(&ar->conf_mutex);
7780
7781
return 0;
7782
}
7783
7784
static int
7785
ath11k_set_vdev_param_to_all_vifs(struct ath11k *ar, int param, u32 value)
7786
{
7787
struct ath11k_vif *arvif;
7788
int ret = 0;
7789
7790
mutex_lock(&ar->conf_mutex);
7791
list_for_each_entry(arvif, &ar->arvifs, list) {
7792
ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "setting mac vdev %d param %d value %d\n",
7793
param, arvif->vdev_id, value);
7794
7795
ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
7796
param, value);
7797
if (ret) {
7798
ath11k_warn(ar->ab, "failed to set param %d for vdev %d: %d\n",
7799
param, arvif->vdev_id, ret);
7800
break;
7801
}
7802
}
7803
mutex_unlock(&ar->conf_mutex);
7804
return ret;
7805
}
7806
7807
/* mac80211 stores device specific RTS/Fragmentation threshold value,
7808
* this is set interface specific to firmware from ath11k driver
7809
*/
7810
static int ath11k_mac_op_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
7811
{
7812
struct ath11k *ar = hw->priv;
7813
int param_id = WMI_VDEV_PARAM_RTS_THRESHOLD;
7814
7815
return ath11k_set_vdev_param_to_all_vifs(ar, param_id, value);
7816
}
7817
7818
static int ath11k_mac_op_set_frag_threshold(struct ieee80211_hw *hw, u32 value)
7819
{
7820
/* Even though there's a WMI vdev param for fragmentation threshold no
7821
* known firmware actually implements it. Moreover it is not possible to
7822
* rely frame fragmentation to mac80211 because firmware clears the
7823
* "more fragments" bit in frame control making it impossible for remote
7824
* devices to reassemble frames.
7825
*
7826
* Hence implement a dummy callback just to say fragmentation isn't
7827
* supported. This effectively prevents mac80211 from doing frame
7828
* fragmentation in software.
7829
*/
7830
return -EOPNOTSUPP;
7831
}
7832
7833
static int ath11k_mac_flush_tx_complete(struct ath11k *ar)
7834
{
7835
long time_left;
7836
int ret = 0;
7837
7838
time_left = wait_event_timeout(ar->dp.tx_empty_waitq,
7839
(atomic_read(&ar->dp.num_tx_pending) == 0),
7840
ATH11K_FLUSH_TIMEOUT);
7841
if (time_left == 0) {
7842
ath11k_warn(ar->ab, "failed to flush transmit queue, data pkts pending %d\n",
7843
atomic_read(&ar->dp.num_tx_pending));
7844
ret = -ETIMEDOUT;
7845
}
7846
7847
time_left = wait_event_timeout(ar->txmgmt_empty_waitq,
7848
(atomic_read(&ar->num_pending_mgmt_tx) == 0),
7849
ATH11K_FLUSH_TIMEOUT);
7850
if (time_left == 0) {
7851
ath11k_warn(ar->ab, "failed to flush mgmt transmit queue, mgmt pkts pending %d\n",
7852
atomic_read(&ar->num_pending_mgmt_tx));
7853
ret = -ETIMEDOUT;
7854
}
7855
7856
return ret;
7857
}
7858
7859
int ath11k_mac_wait_tx_complete(struct ath11k *ar)
7860
{
7861
ath11k_mac_drain_tx(ar);
7862
return ath11k_mac_flush_tx_complete(ar);
7863
}
7864
7865
static void ath11k_mac_op_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
7866
u32 queues, bool drop)
7867
{
7868
struct ath11k *ar = hw->priv;
7869
7870
if (drop)
7871
return;
7872
7873
ath11k_mac_flush_tx_complete(ar);
7874
}
7875
7876
static bool
7877
ath11k_mac_has_single_legacy_rate(struct ath11k *ar,
7878
enum nl80211_band band,
7879
const struct cfg80211_bitrate_mask *mask)
7880
{
7881
int num_rates = 0;
7882
7883
num_rates = hweight32(mask->control[band].legacy);
7884
7885
if (ath11k_mac_bitrate_mask_num_ht_rates(ar, band, mask))
7886
return false;
7887
7888
if (ath11k_mac_bitrate_mask_num_vht_rates(ar, band, mask))
7889
return false;
7890
7891
if (ath11k_mac_bitrate_mask_num_he_rates(ar, band, mask))
7892
return false;
7893
7894
return num_rates == 1;
7895
}
7896
7897
static __le16
7898
ath11k_mac_get_tx_mcs_map(const struct ieee80211_sta_he_cap *he_cap)
7899
{
7900
if (he_cap->he_cap_elem.phy_cap_info[0] &
7901
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
7902
return he_cap->he_mcs_nss_supp.tx_mcs_80p80;
7903
7904
if (he_cap->he_cap_elem.phy_cap_info[0] &
7905
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
7906
return he_cap->he_mcs_nss_supp.tx_mcs_160;
7907
7908
return he_cap->he_mcs_nss_supp.tx_mcs_80;
7909
}
7910
7911
static bool
7912
ath11k_mac_bitrate_mask_get_single_nss(struct ath11k *ar,
7913
enum nl80211_band band,
7914
const struct cfg80211_bitrate_mask *mask,
7915
int *nss)
7916
{
7917
struct ieee80211_supported_band *sband = &ar->mac.sbands[band];
7918
u16 vht_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
7919
u16 he_mcs_map = 0;
7920
u8 ht_nss_mask = 0;
7921
u8 vht_nss_mask = 0;
7922
u8 he_nss_mask = 0;
7923
int i;
7924
7925
/* No need to consider legacy here. Basic rates are always present
7926
* in bitrate mask
7927
*/
7928
7929
for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) {
7930
if (mask->control[band].ht_mcs[i] == 0)
7931
continue;
7932
else if (mask->control[band].ht_mcs[i] ==
7933
sband->ht_cap.mcs.rx_mask[i])
7934
ht_nss_mask |= BIT(i);
7935
else
7936
return false;
7937
}
7938
7939
for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
7940
if (mask->control[band].vht_mcs[i] == 0)
7941
continue;
7942
else if (mask->control[band].vht_mcs[i] ==
7943
ath11k_mac_get_max_vht_mcs_map(vht_mcs_map, i))
7944
vht_nss_mask |= BIT(i);
7945
else
7946
return false;
7947
}
7948
7949
he_mcs_map = le16_to_cpu(ath11k_mac_get_tx_mcs_map(&sband->iftype_data->he_cap));
7950
7951
for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) {
7952
if (mask->control[band].he_mcs[i] == 0)
7953
continue;
7954
7955
if (mask->control[band].he_mcs[i] ==
7956
ath11k_mac_get_max_he_mcs_map(he_mcs_map, i))
7957
he_nss_mask |= BIT(i);
7958
else
7959
return false;
7960
}
7961
7962
if (ht_nss_mask != vht_nss_mask || ht_nss_mask != he_nss_mask)
7963
return false;
7964
7965
if (ht_nss_mask == 0)
7966
return false;
7967
7968
if (BIT(fls(ht_nss_mask)) - 1 != ht_nss_mask)
7969
return false;
7970
7971
*nss = fls(ht_nss_mask);
7972
7973
return true;
7974
}
7975
7976
static int
7977
ath11k_mac_get_single_legacy_rate(struct ath11k *ar,
7978
enum nl80211_band band,
7979
const struct cfg80211_bitrate_mask *mask,
7980
u32 *rate, u8 *nss)
7981
{
7982
int rate_idx;
7983
u16 bitrate;
7984
u8 preamble;
7985
u8 hw_rate;
7986
7987
if (hweight32(mask->control[band].legacy) != 1)
7988
return -EINVAL;
7989
7990
rate_idx = ffs(mask->control[band].legacy) - 1;
7991
7992
if (band == NL80211_BAND_5GHZ || band == NL80211_BAND_6GHZ)
7993
rate_idx += ATH11K_MAC_FIRST_OFDM_RATE_IDX;
7994
7995
hw_rate = ath11k_legacy_rates[rate_idx].hw_value;
7996
bitrate = ath11k_legacy_rates[rate_idx].bitrate;
7997
7998
if (ath11k_mac_bitrate_is_cck(bitrate))
7999
preamble = WMI_RATE_PREAMBLE_CCK;
8000
else
8001
preamble = WMI_RATE_PREAMBLE_OFDM;
8002
8003
*nss = 1;
8004
*rate = ATH11K_HW_RATE_CODE(hw_rate, 0, preamble);
8005
8006
return 0;
8007
}
8008
8009
static int
8010
ath11k_mac_set_fixed_rate_gi_ltf(struct ath11k_vif *arvif, u8 he_gi, u8 he_ltf)
8011
{
8012
struct ath11k *ar = arvif->ar;
8013
int ret;
8014
8015
/* 0.8 = 0, 1.6 = 2 and 3.2 = 3. */
8016
if (he_gi && he_gi != 0xFF)
8017
he_gi += 1;
8018
8019
ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
8020
WMI_VDEV_PARAM_SGI, he_gi);
8021
if (ret) {
8022
ath11k_warn(ar->ab, "failed to set he gi %d: %d\n",
8023
he_gi, ret);
8024
return ret;
8025
}
8026
/* start from 1 */
8027
if (he_ltf != 0xFF)
8028
he_ltf += 1;
8029
8030
ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
8031
WMI_VDEV_PARAM_HE_LTF, he_ltf);
8032
if (ret) {
8033
ath11k_warn(ar->ab, "failed to set he ltf %d: %d\n",
8034
he_ltf, ret);
8035
return ret;
8036
}
8037
8038
return 0;
8039
}
8040
8041
static int
8042
ath11k_mac_set_auto_rate_gi_ltf(struct ath11k_vif *arvif, u16 he_gi, u8 he_ltf)
8043
{
8044
struct ath11k *ar = arvif->ar;
8045
int ret;
8046
u32 he_ar_gi_ltf;
8047
8048
if (he_gi != 0xFF) {
8049
switch (he_gi) {
8050
case NL80211_RATE_INFO_HE_GI_0_8:
8051
he_gi = WMI_AUTORATE_800NS_GI;
8052
break;
8053
case NL80211_RATE_INFO_HE_GI_1_6:
8054
he_gi = WMI_AUTORATE_1600NS_GI;
8055
break;
8056
case NL80211_RATE_INFO_HE_GI_3_2:
8057
he_gi = WMI_AUTORATE_3200NS_GI;
8058
break;
8059
default:
8060
ath11k_warn(ar->ab, "invalid he gi: %d\n", he_gi);
8061
return -EINVAL;
8062
}
8063
}
8064
8065
if (he_ltf != 0xFF) {
8066
switch (he_ltf) {
8067
case NL80211_RATE_INFO_HE_1XLTF:
8068
he_ltf = WMI_HE_AUTORATE_LTF_1X;
8069
break;
8070
case NL80211_RATE_INFO_HE_2XLTF:
8071
he_ltf = WMI_HE_AUTORATE_LTF_2X;
8072
break;
8073
case NL80211_RATE_INFO_HE_4XLTF:
8074
he_ltf = WMI_HE_AUTORATE_LTF_4X;
8075
break;
8076
default:
8077
ath11k_warn(ar->ab, "invalid he ltf: %d\n", he_ltf);
8078
return -EINVAL;
8079
}
8080
}
8081
8082
he_ar_gi_ltf = he_gi | he_ltf;
8083
ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
8084
WMI_VDEV_PARAM_AUTORATE_MISC_CFG,
8085
he_ar_gi_ltf);
8086
if (ret) {
8087
ath11k_warn(ar->ab,
8088
"failed to set he autorate gi %u ltf %u: %d\n",
8089
he_gi, he_ltf, ret);
8090
return ret;
8091
}
8092
8093
return 0;
8094
}
8095
8096
static int ath11k_mac_set_rate_params(struct ath11k_vif *arvif,
8097
u32 rate, u8 nss, u8 sgi, u8 ldpc,
8098
u8 he_gi, u8 he_ltf, bool he_fixed_rate)
8099
{
8100
struct ath11k *ar = arvif->ar;
8101
u32 vdev_param;
8102
int ret;
8103
8104
lockdep_assert_held(&ar->conf_mutex);
8105
8106
ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
8107
"set rate params vdev %i rate 0x%02x nss 0x%02x sgi 0x%02x ldpc 0x%02x he_gi 0x%02x he_ltf 0x%02x he_fixed_rate %d\n",
8108
arvif->vdev_id, rate, nss, sgi, ldpc, he_gi,
8109
he_ltf, he_fixed_rate);
8110
8111
if (!arvif->vif->bss_conf.he_support) {
8112
vdev_param = WMI_VDEV_PARAM_FIXED_RATE;
8113
ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
8114
vdev_param, rate);
8115
if (ret) {
8116
ath11k_warn(ar->ab, "failed to set fixed rate param 0x%02x: %d\n",
8117
rate, ret);
8118
return ret;
8119
}
8120
}
8121
8122
vdev_param = WMI_VDEV_PARAM_NSS;
8123
ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
8124
vdev_param, nss);
8125
if (ret) {
8126
ath11k_warn(ar->ab, "failed to set nss param %d: %d\n",
8127
nss, ret);
8128
return ret;
8129
}
8130
8131
vdev_param = WMI_VDEV_PARAM_LDPC;
8132
ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
8133
vdev_param, ldpc);
8134
if (ret) {
8135
ath11k_warn(ar->ab, "failed to set ldpc param %d: %d\n",
8136
ldpc, ret);
8137
return ret;
8138
}
8139
8140
if (arvif->vif->bss_conf.he_support) {
8141
if (he_fixed_rate) {
8142
ret = ath11k_mac_set_fixed_rate_gi_ltf(arvif, he_gi,
8143
he_ltf);
8144
if (ret) {
8145
ath11k_warn(ar->ab, "failed to set fixed rate gi ltf: %d\n",
8146
ret);
8147
return ret;
8148
}
8149
} else {
8150
ret = ath11k_mac_set_auto_rate_gi_ltf(arvif, he_gi,
8151
he_ltf);
8152
if (ret) {
8153
ath11k_warn(ar->ab, "failed to set auto rate gi ltf: %d\n",
8154
ret);
8155
return ret;
8156
}
8157
}
8158
} else {
8159
vdev_param = WMI_VDEV_PARAM_SGI;
8160
ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
8161
vdev_param, sgi);
8162
if (ret) {
8163
ath11k_warn(ar->ab, "failed to set sgi param %d: %d\n",
8164
sgi, ret);
8165
return ret;
8166
}
8167
}
8168
8169
return 0;
8170
}
8171
8172
static bool
8173
ath11k_mac_vht_mcs_range_present(struct ath11k *ar,
8174
enum nl80211_band band,
8175
const struct cfg80211_bitrate_mask *mask)
8176
{
8177
int i;
8178
u16 vht_mcs;
8179
8180
for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
8181
vht_mcs = mask->control[band].vht_mcs[i];
8182
8183
switch (vht_mcs) {
8184
case 0:
8185
case BIT(8) - 1:
8186
case BIT(9) - 1:
8187
case BIT(10) - 1:
8188
break;
8189
default:
8190
return false;
8191
}
8192
}
8193
8194
return true;
8195
}
8196
8197
static bool
8198
ath11k_mac_he_mcs_range_present(struct ath11k *ar,
8199
enum nl80211_band band,
8200
const struct cfg80211_bitrate_mask *mask)
8201
{
8202
int i;
8203
u16 he_mcs;
8204
8205
for (i = 0; i < NL80211_HE_NSS_MAX; i++) {
8206
he_mcs = mask->control[band].he_mcs[i];
8207
8208
switch (he_mcs) {
8209
case 0:
8210
case BIT(8) - 1:
8211
case BIT(10) - 1:
8212
case BIT(12) - 1:
8213
break;
8214
default:
8215
return false;
8216
}
8217
}
8218
8219
return true;
8220
}
8221
8222
static void ath11k_mac_set_bitrate_mask_iter(void *data,
8223
struct ieee80211_sta *sta)
8224
{
8225
struct ath11k_vif *arvif = data;
8226
struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
8227
struct ath11k *ar = arvif->ar;
8228
8229
spin_lock_bh(&ar->data_lock);
8230
arsta->changed |= IEEE80211_RC_SUPP_RATES_CHANGED;
8231
spin_unlock_bh(&ar->data_lock);
8232
8233
ieee80211_queue_work(ar->hw, &arsta->update_wk);
8234
}
8235
8236
static void ath11k_mac_disable_peer_fixed_rate(void *data,
8237
struct ieee80211_sta *sta)
8238
{
8239
struct ath11k_vif *arvif = data;
8240
struct ath11k *ar = arvif->ar;
8241
int ret;
8242
8243
ret = ath11k_wmi_set_peer_param(ar, sta->addr,
8244
arvif->vdev_id,
8245
WMI_PEER_PARAM_FIXED_RATE,
8246
WMI_FIXED_RATE_NONE);
8247
if (ret)
8248
ath11k_warn(ar->ab,
8249
"failed to disable peer fixed rate for STA %pM ret %d\n",
8250
sta->addr, ret);
8251
}
8252
8253
static bool
8254
ath11k_mac_validate_vht_he_fixed_rate_settings(struct ath11k *ar, enum nl80211_band band,
8255
const struct cfg80211_bitrate_mask *mask)
8256
{
8257
bool he_fixed_rate = false, vht_fixed_rate = false;
8258
struct ath11k_peer *peer;
8259
const u16 *vht_mcs_mask, *he_mcs_mask;
8260
struct ieee80211_link_sta *deflink;
8261
u8 vht_nss, he_nss;
8262
bool ret = true;
8263
8264
vht_mcs_mask = mask->control[band].vht_mcs;
8265
he_mcs_mask = mask->control[band].he_mcs;
8266
8267
if (ath11k_mac_bitrate_mask_num_vht_rates(ar, band, mask) == 1)
8268
vht_fixed_rate = true;
8269
8270
if (ath11k_mac_bitrate_mask_num_he_rates(ar, band, mask) == 1)
8271
he_fixed_rate = true;
8272
8273
if (!vht_fixed_rate && !he_fixed_rate)
8274
return true;
8275
8276
vht_nss = ath11k_mac_max_vht_nss(vht_mcs_mask);
8277
he_nss = ath11k_mac_max_he_nss(he_mcs_mask);
8278
8279
rcu_read_lock();
8280
spin_lock_bh(&ar->ab->base_lock);
8281
list_for_each_entry(peer, &ar->ab->peers, list) {
8282
if (peer->sta) {
8283
deflink = &peer->sta->deflink;
8284
8285
if (vht_fixed_rate && (!deflink->vht_cap.vht_supported ||
8286
deflink->rx_nss < vht_nss)) {
8287
ret = false;
8288
goto out;
8289
}
8290
8291
if (he_fixed_rate && (!deflink->he_cap.has_he ||
8292
deflink->rx_nss < he_nss)) {
8293
ret = false;
8294
goto out;
8295
}
8296
}
8297
}
8298
8299
out:
8300
spin_unlock_bh(&ar->ab->base_lock);
8301
rcu_read_unlock();
8302
return ret;
8303
}
8304
8305
static int
8306
ath11k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw,
8307
struct ieee80211_vif *vif,
8308
const struct cfg80211_bitrate_mask *mask)
8309
{
8310
struct ath11k_vif *arvif = (void *)vif->drv_priv;
8311
struct cfg80211_chan_def def;
8312
struct ath11k_pdev_cap *cap;
8313
struct ath11k *ar = arvif->ar;
8314
enum nl80211_band band;
8315
const u8 *ht_mcs_mask;
8316
const u16 *vht_mcs_mask;
8317
const u16 *he_mcs_mask;
8318
u8 he_ltf = 0;
8319
u8 he_gi = 0;
8320
u32 rate;
8321
u8 nss;
8322
u8 sgi;
8323
u8 ldpc;
8324
int single_nss;
8325
int ret;
8326
int num_rates;
8327
bool he_fixed_rate = false;
8328
8329
if (ath11k_mac_vif_chan(vif, &def))
8330
return -EPERM;
8331
8332
band = def.chan->band;
8333
cap = &ar->pdev->cap;
8334
ht_mcs_mask = mask->control[band].ht_mcs;
8335
vht_mcs_mask = mask->control[band].vht_mcs;
8336
he_mcs_mask = mask->control[band].he_mcs;
8337
ldpc = !!(cap->band[band].ht_cap_info & WMI_HT_CAP_TX_LDPC);
8338
8339
sgi = mask->control[band].gi;
8340
if (sgi == NL80211_TXRATE_FORCE_LGI)
8341
return -EINVAL;
8342
8343
he_gi = mask->control[band].he_gi;
8344
he_ltf = mask->control[band].he_ltf;
8345
8346
/* mac80211 doesn't support sending a fixed HT/VHT MCS alone, rather it
8347
* requires passing at least one of used basic rates along with them.
8348
* Fixed rate setting across different preambles(legacy, HT, VHT) is
8349
* not supported by the FW. Hence use of FIXED_RATE vdev param is not
8350
* suitable for setting single HT/VHT rates.
8351
* But, there could be a single basic rate passed from userspace which
8352
* can be done through the FIXED_RATE param.
8353
*/
8354
if (ath11k_mac_has_single_legacy_rate(ar, band, mask)) {
8355
ret = ath11k_mac_get_single_legacy_rate(ar, band, mask, &rate,
8356
&nss);
8357
if (ret) {
8358
ath11k_warn(ar->ab, "failed to get single legacy rate for vdev %i: %d\n",
8359
arvif->vdev_id, ret);
8360
return ret;
8361
}
8362
ieee80211_iterate_stations_atomic(ar->hw,
8363
ath11k_mac_disable_peer_fixed_rate,
8364
arvif);
8365
} else if (ath11k_mac_bitrate_mask_get_single_nss(ar, band, mask,
8366
&single_nss)) {
8367
rate = WMI_FIXED_RATE_NONE;
8368
nss = single_nss;
8369
mutex_lock(&ar->conf_mutex);
8370
arvif->bitrate_mask = *mask;
8371
ieee80211_iterate_stations_atomic(ar->hw,
8372
ath11k_mac_set_bitrate_mask_iter,
8373
arvif);
8374
mutex_unlock(&ar->conf_mutex);
8375
} else {
8376
rate = WMI_FIXED_RATE_NONE;
8377
8378
if (!ath11k_mac_validate_vht_he_fixed_rate_settings(ar, band, mask))
8379
ath11k_warn(ar->ab,
8380
"could not update fixed rate settings to all peers due to mcs/nss incompatibility\n");
8381
nss = min_t(u32, ar->num_tx_chains,
8382
max(max(ath11k_mac_max_ht_nss(ht_mcs_mask),
8383
ath11k_mac_max_vht_nss(vht_mcs_mask)),
8384
ath11k_mac_max_he_nss(he_mcs_mask)));
8385
8386
/* If multiple rates across different preambles are given
8387
* we can reconfigure this info with all peers using PEER_ASSOC
8388
* command with the below exception cases.
8389
* - Single VHT Rate : peer_assoc command accommodates only MCS
8390
* range values i.e 0-7, 0-8, 0-9 for VHT. Though mac80211
8391
* mandates passing basic rates along with HT/VHT rates, FW
8392
* doesn't allow switching from VHT to Legacy. Hence instead of
8393
* setting legacy and VHT rates using RATEMASK_CMD vdev cmd,
8394
* we could set this VHT rate as peer fixed rate param, which
8395
* will override FIXED rate and FW rate control algorithm.
8396
* If single VHT rate is passed along with HT rates, we select
8397
* the VHT rate as fixed rate for vht peers.
8398
* - Multiple VHT Rates : When Multiple VHT rates are given,this
8399
* can be set using RATEMASK CMD which uses FW rate-ctl alg.
8400
* TODO: Setting multiple VHT MCS and replacing peer_assoc with
8401
* RATEMASK_CMDID can cover all use cases of setting rates
8402
* across multiple preambles and rates within same type.
8403
* But requires more validation of the command at this point.
8404
*/
8405
8406
num_rates = ath11k_mac_bitrate_mask_num_vht_rates(ar, band,
8407
mask);
8408
8409
if (!ath11k_mac_vht_mcs_range_present(ar, band, mask) &&
8410
num_rates > 1) {
8411
/* TODO: Handle multiple VHT MCS values setting using
8412
* RATEMASK CMD
8413
*/
8414
ath11k_warn(ar->ab,
8415
"setting %d mcs values in bitrate mask not supported\n",
8416
num_rates);
8417
return -EINVAL;
8418
}
8419
8420
num_rates = ath11k_mac_bitrate_mask_num_he_rates(ar, band,
8421
mask);
8422
if (num_rates == 1)
8423
he_fixed_rate = true;
8424
8425
if (!ath11k_mac_he_mcs_range_present(ar, band, mask) &&
8426
num_rates > 1) {
8427
ath11k_warn(ar->ab,
8428
"Setting more than one HE MCS Value in bitrate mask not supported\n");
8429
return -EINVAL;
8430
}
8431
8432
mutex_lock(&ar->conf_mutex);
8433
ieee80211_iterate_stations_atomic(ar->hw,
8434
ath11k_mac_disable_peer_fixed_rate,
8435
arvif);
8436
8437
arvif->bitrate_mask = *mask;
8438
ieee80211_iterate_stations_atomic(ar->hw,
8439
ath11k_mac_set_bitrate_mask_iter,
8440
arvif);
8441
8442
mutex_unlock(&ar->conf_mutex);
8443
}
8444
8445
mutex_lock(&ar->conf_mutex);
8446
8447
ret = ath11k_mac_set_rate_params(arvif, rate, nss, sgi, ldpc, he_gi,
8448
he_ltf, he_fixed_rate);
8449
if (ret) {
8450
ath11k_warn(ar->ab, "failed to set rate params on vdev %i: %d\n",
8451
arvif->vdev_id, ret);
8452
}
8453
8454
mutex_unlock(&ar->conf_mutex);
8455
8456
return ret;
8457
}
8458
8459
static void
8460
ath11k_mac_op_reconfig_complete(struct ieee80211_hw *hw,
8461
enum ieee80211_reconfig_type reconfig_type)
8462
{
8463
struct ath11k *ar = hw->priv;
8464
struct ath11k_base *ab = ar->ab;
8465
int recovery_count;
8466
struct ath11k_vif *arvif;
8467
8468
if (reconfig_type != IEEE80211_RECONFIG_TYPE_RESTART)
8469
return;
8470
8471
mutex_lock(&ar->conf_mutex);
8472
8473
if (ar->state == ATH11K_STATE_RESTARTED) {
8474
ath11k_warn(ar->ab, "pdev %d successfully recovered\n",
8475
ar->pdev->pdev_id);
8476
ar->state = ATH11K_STATE_ON;
8477
ieee80211_wake_queues(ar->hw);
8478
8479
if (ar->ab->hw_params.current_cc_support &&
8480
ar->alpha2[0] != 0 && ar->alpha2[1] != 0) {
8481
struct wmi_set_current_country_params set_current_param = {};
8482
8483
memcpy(&set_current_param.alpha2, ar->alpha2, 2);
8484
ath11k_wmi_send_set_current_country_cmd(ar, &set_current_param);
8485
}
8486
8487
if (ab->is_reset) {
8488
recovery_count = atomic_inc_return(&ab->recovery_count);
8489
ath11k_dbg(ab, ATH11K_DBG_BOOT,
8490
"recovery count %d\n", recovery_count);
8491
/* When there are multiple radios in an SOC,
8492
* the recovery has to be done for each radio
8493
*/
8494
if (recovery_count == ab->num_radios) {
8495
atomic_dec(&ab->reset_count);
8496
complete(&ab->reset_complete);
8497
ab->is_reset = false;
8498
atomic_set(&ab->fail_cont_count, 0);
8499
ath11k_dbg(ab, ATH11K_DBG_BOOT, "reset success\n");
8500
}
8501
}
8502
if (ar->ab->hw_params.support_fw_mac_sequence) {
8503
list_for_each_entry(arvif, &ar->arvifs, list) {
8504
if (arvif->is_up && arvif->vdev_type == WMI_VDEV_TYPE_STA)
8505
ieee80211_hw_restart_disconnect(arvif->vif);
8506
}
8507
}
8508
}
8509
8510
mutex_unlock(&ar->conf_mutex);
8511
}
8512
8513
static void
8514
ath11k_mac_update_bss_chan_survey(struct ath11k *ar,
8515
struct ieee80211_channel *channel)
8516
{
8517
int ret;
8518
enum wmi_bss_chan_info_req_type type = WMI_BSS_SURVEY_REQ_TYPE_READ;
8519
8520
lockdep_assert_held(&ar->conf_mutex);
8521
8522
if (!test_bit(WMI_TLV_SERVICE_BSS_CHANNEL_INFO_64, ar->ab->wmi_ab.svc_map) ||
8523
ar->rx_channel != channel)
8524
return;
8525
8526
if (ar->scan.state != ATH11K_SCAN_IDLE) {
8527
ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
8528
"ignoring bss chan info req while scanning..\n");
8529
return;
8530
}
8531
8532
reinit_completion(&ar->bss_survey_done);
8533
8534
ret = ath11k_wmi_pdev_bss_chan_info_request(ar, type);
8535
if (ret) {
8536
ath11k_warn(ar->ab, "failed to send pdev bss chan info request\n");
8537
return;
8538
}
8539
8540
ret = wait_for_completion_timeout(&ar->bss_survey_done, 3 * HZ);
8541
if (ret == 0)
8542
ath11k_warn(ar->ab, "bss channel survey timed out\n");
8543
}
8544
8545
static int ath11k_mac_op_get_survey(struct ieee80211_hw *hw, int idx,
8546
struct survey_info *survey)
8547
{
8548
struct ath11k *ar = hw->priv;
8549
struct ieee80211_supported_band *sband;
8550
struct survey_info *ar_survey;
8551
int ret = 0;
8552
8553
if (idx >= ATH11K_NUM_CHANS)
8554
return -ENOENT;
8555
8556
ar_survey = &ar->survey[idx];
8557
8558
mutex_lock(&ar->conf_mutex);
8559
8560
sband = hw->wiphy->bands[NL80211_BAND_2GHZ];
8561
if (sband && idx >= sband->n_channels) {
8562
idx -= sband->n_channels;
8563
sband = NULL;
8564
}
8565
8566
if (!sband)
8567
sband = hw->wiphy->bands[NL80211_BAND_5GHZ];
8568
if (sband && idx >= sband->n_channels) {
8569
idx -= sband->n_channels;
8570
sband = NULL;
8571
}
8572
8573
if (!sband)
8574
sband = hw->wiphy->bands[NL80211_BAND_6GHZ];
8575
if (!sband || idx >= sband->n_channels) {
8576
ret = -ENOENT;
8577
goto exit;
8578
}
8579
8580
ath11k_mac_update_bss_chan_survey(ar, &sband->channels[idx]);
8581
8582
spin_lock_bh(&ar->data_lock);
8583
memcpy(survey, ar_survey, sizeof(*survey));
8584
spin_unlock_bh(&ar->data_lock);
8585
8586
survey->channel = &sband->channels[idx];
8587
8588
if (ar->rx_channel == survey->channel)
8589
survey->filled |= SURVEY_INFO_IN_USE;
8590
8591
exit:
8592
mutex_unlock(&ar->conf_mutex);
8593
return ret;
8594
}
8595
8596
static void ath11k_mac_put_chain_rssi(struct station_info *sinfo,
8597
struct ath11k_sta *arsta,
8598
char *pre,
8599
bool clear)
8600
{
8601
struct ath11k *ar = arsta->arvif->ar;
8602
int i;
8603
s8 rssi;
8604
8605
for (i = 0; i < ARRAY_SIZE(sinfo->chain_signal); i++) {
8606
sinfo->chains &= ~BIT(i);
8607
rssi = arsta->chain_signal[i];
8608
if (clear)
8609
arsta->chain_signal[i] = ATH11K_INVALID_RSSI_FULL;
8610
8611
ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
8612
"sta statistics %s rssi[%d] %d\n", pre, i, rssi);
8613
8614
if (rssi != ATH11K_DEFAULT_NOISE_FLOOR &&
8615
rssi != ATH11K_INVALID_RSSI_FULL &&
8616
rssi != ATH11K_INVALID_RSSI_EMPTY &&
8617
rssi != 0) {
8618
sinfo->chain_signal[i] = rssi;
8619
sinfo->chains |= BIT(i);
8620
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL);
8621
}
8622
}
8623
}
8624
8625
static void ath11k_mac_op_sta_statistics(struct ieee80211_hw *hw,
8626
struct ieee80211_vif *vif,
8627
struct ieee80211_sta *sta,
8628
struct station_info *sinfo)
8629
{
8630
struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
8631
struct ath11k *ar = arsta->arvif->ar;
8632
s8 signal;
8633
bool db2dbm = test_bit(WMI_TLV_SERVICE_HW_DB2DBM_CONVERSION_SUPPORT,
8634
ar->ab->wmi_ab.svc_map);
8635
8636
sinfo->rx_duration = arsta->rx_duration;
8637
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_DURATION);
8638
8639
sinfo->tx_duration = arsta->tx_duration;
8640
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_DURATION);
8641
8642
if (arsta->txrate.legacy || arsta->txrate.nss) {
8643
if (arsta->txrate.legacy) {
8644
sinfo->txrate.legacy = arsta->txrate.legacy;
8645
} else {
8646
sinfo->txrate.mcs = arsta->txrate.mcs;
8647
sinfo->txrate.nss = arsta->txrate.nss;
8648
sinfo->txrate.bw = arsta->txrate.bw;
8649
sinfo->txrate.he_gi = arsta->txrate.he_gi;
8650
sinfo->txrate.he_dcm = arsta->txrate.he_dcm;
8651
sinfo->txrate.he_ru_alloc = arsta->txrate.he_ru_alloc;
8652
}
8653
sinfo->txrate.flags = arsta->txrate.flags;
8654
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
8655
}
8656
8657
ath11k_mac_put_chain_rssi(sinfo, arsta, "ppdu", false);
8658
8659
if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL)) &&
8660
arsta->arvif->vdev_type == WMI_VDEV_TYPE_STA &&
8661
ar->ab->hw_params.supports_rssi_stats &&
8662
!ath11k_debugfs_get_fw_stats(ar, ar->pdev->pdev_id, 0,
8663
WMI_REQUEST_RSSI_PER_CHAIN_STAT)) {
8664
ath11k_mac_put_chain_rssi(sinfo, arsta, "fw stats", true);
8665
}
8666
8667
signal = arsta->rssi_comb;
8668
if (!signal &&
8669
arsta->arvif->vdev_type == WMI_VDEV_TYPE_STA &&
8670
ar->ab->hw_params.supports_rssi_stats &&
8671
!(ath11k_debugfs_get_fw_stats(ar, ar->pdev->pdev_id, 0,
8672
WMI_REQUEST_VDEV_STAT)))
8673
signal = arsta->rssi_beacon;
8674
8675
ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
8676
"sta statistics db2dbm %u rssi comb %d rssi beacon %d\n",
8677
db2dbm, arsta->rssi_comb, arsta->rssi_beacon);
8678
8679
if (signal) {
8680
sinfo->signal = db2dbm ? signal : signal + ATH11K_DEFAULT_NOISE_FLOOR;
8681
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL);
8682
}
8683
8684
sinfo->signal_avg = ewma_avg_rssi_read(&arsta->avg_rssi) +
8685
ATH11K_DEFAULT_NOISE_FLOOR;
8686
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG);
8687
}
8688
8689
#if IS_ENABLED(CONFIG_IPV6)
8690
static void ath11k_generate_ns_mc_addr(struct ath11k *ar,
8691
struct ath11k_arp_ns_offload *offload)
8692
{
8693
int i;
8694
8695
for (i = 0; i < offload->ipv6_count; i++) {
8696
offload->self_ipv6_addr[i][0] = 0xff;
8697
offload->self_ipv6_addr[i][1] = 0x02;
8698
offload->self_ipv6_addr[i][11] = 0x01;
8699
offload->self_ipv6_addr[i][12] = 0xff;
8700
offload->self_ipv6_addr[i][13] =
8701
offload->ipv6_addr[i][13];
8702
offload->self_ipv6_addr[i][14] =
8703
offload->ipv6_addr[i][14];
8704
offload->self_ipv6_addr[i][15] =
8705
offload->ipv6_addr[i][15];
8706
ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "NS solicited addr %pI6\n",
8707
offload->self_ipv6_addr[i]);
8708
}
8709
}
8710
8711
static void ath11k_mac_op_ipv6_changed(struct ieee80211_hw *hw,
8712
struct ieee80211_vif *vif,
8713
struct inet6_dev *idev)
8714
{
8715
struct ath11k *ar = hw->priv;
8716
struct ath11k_arp_ns_offload *offload;
8717
struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
8718
struct inet6_ifaddr *ifa6;
8719
struct ifacaddr6 *ifaca6;
8720
struct list_head *p;
8721
u32 count, scope;
8722
8723
ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "op ipv6 changed\n");
8724
8725
offload = &arvif->arp_ns_offload;
8726
count = 0;
8727
8728
read_lock_bh(&idev->lock);
8729
8730
memset(offload->ipv6_addr, 0, sizeof(offload->ipv6_addr));
8731
memset(offload->self_ipv6_addr, 0, sizeof(offload->self_ipv6_addr));
8732
memcpy(offload->mac_addr, vif->addr, ETH_ALEN);
8733
8734
/* get unicast address */
8735
list_for_each(p, &idev->addr_list) {
8736
if (count >= ATH11K_IPV6_MAX_COUNT)
8737
goto generate;
8738
8739
ifa6 = list_entry(p, struct inet6_ifaddr, if_list);
8740
if (ifa6->flags & IFA_F_DADFAILED)
8741
continue;
8742
scope = ipv6_addr_src_scope(&ifa6->addr);
8743
if (scope == IPV6_ADDR_SCOPE_LINKLOCAL ||
8744
scope == IPV6_ADDR_SCOPE_GLOBAL) {
8745
memcpy(offload->ipv6_addr[count], &ifa6->addr.s6_addr,
8746
sizeof(ifa6->addr.s6_addr));
8747
offload->ipv6_type[count] = ATH11K_IPV6_UC_TYPE;
8748
ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "count %d ipv6 uc %pI6 scope %d\n",
8749
count, offload->ipv6_addr[count],
8750
scope);
8751
count++;
8752
} else {
8753
ath11k_warn(ar->ab, "Unsupported ipv6 scope: %d\n", scope);
8754
}
8755
}
8756
8757
/* get anycast address */
8758
for (ifaca6 = idev->ac_list; ifaca6; ifaca6 = ifaca6->aca_next) {
8759
if (count >= ATH11K_IPV6_MAX_COUNT)
8760
goto generate;
8761
8762
scope = ipv6_addr_src_scope(&ifaca6->aca_addr);
8763
if (scope == IPV6_ADDR_SCOPE_LINKLOCAL ||
8764
scope == IPV6_ADDR_SCOPE_GLOBAL) {
8765
memcpy(offload->ipv6_addr[count], &ifaca6->aca_addr,
8766
sizeof(ifaca6->aca_addr));
8767
offload->ipv6_type[count] = ATH11K_IPV6_AC_TYPE;
8768
ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "count %d ipv6 ac %pI6 scope %d\n",
8769
count, offload->ipv6_addr[count],
8770
scope);
8771
count++;
8772
} else {
8773
ath11k_warn(ar->ab, "Unsupported ipv scope: %d\n", scope);
8774
}
8775
}
8776
8777
generate:
8778
offload->ipv6_count = count;
8779
read_unlock_bh(&idev->lock);
8780
8781
/* generate ns multicast address */
8782
ath11k_generate_ns_mc_addr(ar, offload);
8783
}
8784
#endif
8785
8786
static void ath11k_mac_op_set_rekey_data(struct ieee80211_hw *hw,
8787
struct ieee80211_vif *vif,
8788
struct cfg80211_gtk_rekey_data *data)
8789
{
8790
struct ath11k *ar = hw->priv;
8791
struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
8792
struct ath11k_rekey_data *rekey_data = &arvif->rekey_data;
8793
8794
ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "set rekey data vdev %d\n",
8795
arvif->vdev_id);
8796
8797
mutex_lock(&ar->conf_mutex);
8798
8799
memcpy(rekey_data->kck, data->kck, NL80211_KCK_LEN);
8800
memcpy(rekey_data->kek, data->kek, NL80211_KEK_LEN);
8801
8802
/* The supplicant works on big-endian, the firmware expects it on
8803
* little endian.
8804
*/
8805
rekey_data->replay_ctr = get_unaligned_be64(data->replay_ctr);
8806
8807
arvif->rekey_data.enable_offload = true;
8808
8809
ath11k_dbg_dump(ar->ab, ATH11K_DBG_MAC, "kck", NULL,
8810
rekey_data->kck, NL80211_KCK_LEN);
8811
ath11k_dbg_dump(ar->ab, ATH11K_DBG_MAC, "kek", NULL,
8812
rekey_data->kck, NL80211_KEK_LEN);
8813
ath11k_dbg_dump(ar->ab, ATH11K_DBG_MAC, "replay ctr", NULL,
8814
&rekey_data->replay_ctr, sizeof(rekey_data->replay_ctr));
8815
8816
mutex_unlock(&ar->conf_mutex);
8817
}
8818
8819
static int ath11k_mac_op_set_bios_sar_specs(struct ieee80211_hw *hw,
8820
const struct cfg80211_sar_specs *sar)
8821
{
8822
struct ath11k *ar = hw->priv;
8823
const struct cfg80211_sar_sub_specs *sspec;
8824
int ret, index;
8825
u8 *sar_tbl;
8826
u32 i;
8827
8828
if (!sar || sar->type != NL80211_SAR_TYPE_POWER ||
8829
sar->num_sub_specs == 0)
8830
return -EINVAL;
8831
8832
mutex_lock(&ar->conf_mutex);
8833
8834
if (!test_bit(WMI_TLV_SERVICE_BIOS_SAR_SUPPORT, ar->ab->wmi_ab.svc_map) ||
8835
!ar->ab->hw_params.bios_sar_capa) {
8836
ret = -EOPNOTSUPP;
8837
goto exit;
8838
}
8839
8840
ret = ath11k_wmi_pdev_set_bios_geo_table_param(ar);
8841
if (ret) {
8842
ath11k_warn(ar->ab, "failed to set geo table: %d\n", ret);
8843
goto exit;
8844
}
8845
8846
sar_tbl = kzalloc(BIOS_SAR_TABLE_LEN, GFP_KERNEL);
8847
if (!sar_tbl) {
8848
ret = -ENOMEM;
8849
goto exit;
8850
}
8851
8852
sspec = sar->sub_specs;
8853
for (i = 0; i < sar->num_sub_specs; i++) {
8854
if (sspec->freq_range_index >= (BIOS_SAR_TABLE_LEN >> 1)) {
8855
ath11k_warn(ar->ab, "Ignore bad frequency index %u, max allowed %u\n",
8856
sspec->freq_range_index, BIOS_SAR_TABLE_LEN >> 1);
8857
continue;
8858
}
8859
8860
/* chain0 and chain1 share same power setting */
8861
sar_tbl[sspec->freq_range_index] = sspec->power;
8862
index = sspec->freq_range_index + (BIOS_SAR_TABLE_LEN >> 1);
8863
sar_tbl[index] = sspec->power;
8864
ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "sar tbl[%d] = %d\n",
8865
sspec->freq_range_index, sar_tbl[sspec->freq_range_index]);
8866
sspec++;
8867
}
8868
8869
ret = ath11k_wmi_pdev_set_bios_sar_table_param(ar, sar_tbl);
8870
if (ret)
8871
ath11k_warn(ar->ab, "failed to set sar power: %d", ret);
8872
8873
kfree(sar_tbl);
8874
exit:
8875
mutex_unlock(&ar->conf_mutex);
8876
8877
return ret;
8878
}
8879
8880
static int ath11k_mac_op_cancel_remain_on_channel(struct ieee80211_hw *hw,
8881
struct ieee80211_vif *vif)
8882
{
8883
struct ath11k *ar = hw->priv;
8884
8885
mutex_lock(&ar->conf_mutex);
8886
8887
spin_lock_bh(&ar->data_lock);
8888
ar->scan.roc_notify = false;
8889
spin_unlock_bh(&ar->data_lock);
8890
8891
ath11k_scan_abort(ar);
8892
8893
mutex_unlock(&ar->conf_mutex);
8894
8895
cancel_delayed_work_sync(&ar->scan.timeout);
8896
8897
return 0;
8898
}
8899
8900
static int ath11k_mac_op_remain_on_channel(struct ieee80211_hw *hw,
8901
struct ieee80211_vif *vif,
8902
struct ieee80211_channel *chan,
8903
int duration,
8904
enum ieee80211_roc_type type)
8905
{
8906
struct ath11k *ar = hw->priv;
8907
struct ath11k_vif *arvif = (void *)vif->drv_priv;
8908
struct scan_req_params arg;
8909
int ret;
8910
u32 scan_time_msec;
8911
8912
mutex_lock(&ar->conf_mutex);
8913
8914
spin_lock_bh(&ar->data_lock);
8915
switch (ar->scan.state) {
8916
case ATH11K_SCAN_IDLE:
8917
reinit_completion(&ar->scan.started);
8918
reinit_completion(&ar->scan.completed);
8919
reinit_completion(&ar->scan.on_channel);
8920
ar->scan.state = ATH11K_SCAN_STARTING;
8921
ar->scan.is_roc = true;
8922
ar->scan.vdev_id = arvif->vdev_id;
8923
ar->scan.roc_freq = chan->center_freq;
8924
ar->scan.roc_notify = true;
8925
ret = 0;
8926
break;
8927
case ATH11K_SCAN_STARTING:
8928
case ATH11K_SCAN_RUNNING:
8929
case ATH11K_SCAN_ABORTING:
8930
ret = -EBUSY;
8931
break;
8932
}
8933
spin_unlock_bh(&ar->data_lock);
8934
8935
if (ret)
8936
goto exit;
8937
8938
scan_time_msec = ar->hw->wiphy->max_remain_on_channel_duration * 2;
8939
8940
memset(&arg, 0, sizeof(arg));
8941
ath11k_wmi_start_scan_init(ar, &arg);
8942
arg.num_chan = 1;
8943
arg.chan_list = kcalloc(arg.num_chan, sizeof(*arg.chan_list),
8944
GFP_KERNEL);
8945
if (!arg.chan_list) {
8946
ret = -ENOMEM;
8947
goto exit;
8948
}
8949
8950
arg.vdev_id = arvif->vdev_id;
8951
arg.scan_id = ATH11K_SCAN_ID;
8952
arg.chan_list[0] = chan->center_freq;
8953
arg.dwell_time_active = scan_time_msec;
8954
arg.dwell_time_passive = scan_time_msec;
8955
arg.max_scan_time = scan_time_msec;
8956
arg.scan_flags |= WMI_SCAN_FLAG_PASSIVE;
8957
arg.scan_flags |= WMI_SCAN_FILTER_PROBE_REQ;
8958
arg.burst_duration = duration;
8959
8960
ret = ath11k_start_scan(ar, &arg);
8961
if (ret) {
8962
ath11k_warn(ar->ab, "failed to start roc scan: %d\n", ret);
8963
8964
spin_lock_bh(&ar->data_lock);
8965
ar->scan.state = ATH11K_SCAN_IDLE;
8966
spin_unlock_bh(&ar->data_lock);
8967
goto free_chan_list;
8968
}
8969
8970
ret = wait_for_completion_timeout(&ar->scan.on_channel, 3 * HZ);
8971
if (ret == 0) {
8972
ath11k_warn(ar->ab, "failed to switch to channel for roc scan\n");
8973
ret = ath11k_scan_stop(ar);
8974
if (ret)
8975
ath11k_warn(ar->ab, "failed to stop scan: %d\n", ret);
8976
ret = -ETIMEDOUT;
8977
goto free_chan_list;
8978
}
8979
8980
ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
8981
msecs_to_jiffies(duration));
8982
8983
ret = 0;
8984
8985
free_chan_list:
8986
kfree(arg.chan_list);
8987
exit:
8988
mutex_unlock(&ar->conf_mutex);
8989
return ret;
8990
}
8991
8992
static int ath11k_fw_stats_request(struct ath11k *ar,
8993
struct stats_request_params *req_param)
8994
{
8995
struct ath11k_base *ab = ar->ab;
8996
unsigned long time_left;
8997
int ret;
8998
8999
lockdep_assert_held(&ar->conf_mutex);
9000
9001
spin_lock_bh(&ar->data_lock);
9002
ar->fw_stats_done = false;
9003
ath11k_fw_stats_pdevs_free(&ar->fw_stats.pdevs);
9004
spin_unlock_bh(&ar->data_lock);
9005
9006
reinit_completion(&ar->fw_stats_complete);
9007
9008
ret = ath11k_wmi_send_stats_request_cmd(ar, req_param);
9009
if (ret) {
9010
ath11k_warn(ab, "could not request fw stats (%d)\n",
9011
ret);
9012
return ret;
9013
}
9014
9015
time_left = wait_for_completion_timeout(&ar->fw_stats_complete,
9016
1 * HZ);
9017
9018
if (!time_left)
9019
return -ETIMEDOUT;
9020
9021
return 0;
9022
}
9023
9024
static int ath11k_mac_op_get_txpower(struct ieee80211_hw *hw,
9025
struct ieee80211_vif *vif,
9026
int *dbm)
9027
{
9028
struct ath11k *ar = hw->priv;
9029
struct ath11k_base *ab = ar->ab;
9030
struct stats_request_params req_param = {0};
9031
struct ath11k_fw_stats_pdev *pdev;
9032
int ret;
9033
9034
/* Final Tx power is minimum of Target Power, CTL power, Regulatory
9035
* Power, PSD EIRP Power. We just know the Regulatory power from the
9036
* regulatory rules obtained. FW knows all these power and sets the min
9037
* of these. Hence, we request the FW pdev stats in which FW reports
9038
* the minimum of all vdev's channel Tx power.
9039
*/
9040
mutex_lock(&ar->conf_mutex);
9041
9042
if (ar->state != ATH11K_STATE_ON)
9043
goto err_fallback;
9044
9045
req_param.pdev_id = ar->pdev->pdev_id;
9046
req_param.stats_id = WMI_REQUEST_PDEV_STAT;
9047
9048
ret = ath11k_fw_stats_request(ar, &req_param);
9049
if (ret) {
9050
ath11k_warn(ab, "failed to request fw pdev stats: %d\n", ret);
9051
goto err_fallback;
9052
}
9053
9054
spin_lock_bh(&ar->data_lock);
9055
pdev = list_first_entry_or_null(&ar->fw_stats.pdevs,
9056
struct ath11k_fw_stats_pdev, list);
9057
if (!pdev) {
9058
spin_unlock_bh(&ar->data_lock);
9059
goto err_fallback;
9060
}
9061
9062
/* tx power is set as 2 units per dBm in FW. */
9063
*dbm = pdev->chan_tx_power / 2;
9064
9065
spin_unlock_bh(&ar->data_lock);
9066
mutex_unlock(&ar->conf_mutex);
9067
9068
ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "txpower from firmware %d, reported %d dBm\n",
9069
pdev->chan_tx_power, *dbm);
9070
return 0;
9071
9072
err_fallback:
9073
mutex_unlock(&ar->conf_mutex);
9074
/* We didn't get txpower from FW. Hence, relying on vif->bss_conf.txpower */
9075
*dbm = vif->bss_conf.txpower;
9076
ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "txpower from firmware NaN, reported %d dBm\n",
9077
*dbm);
9078
return 0;
9079
}
9080
9081
static const struct ieee80211_ops ath11k_ops = {
9082
.tx = ath11k_mac_op_tx,
9083
.wake_tx_queue = ieee80211_handle_wake_tx_queue,
9084
.start = ath11k_mac_op_start,
9085
.stop = ath11k_mac_op_stop,
9086
.reconfig_complete = ath11k_mac_op_reconfig_complete,
9087
.add_interface = ath11k_mac_op_add_interface,
9088
.remove_interface = ath11k_mac_op_remove_interface,
9089
.update_vif_offload = ath11k_mac_op_update_vif_offload,
9090
.config = ath11k_mac_op_config,
9091
.bss_info_changed = ath11k_mac_op_bss_info_changed,
9092
.configure_filter = ath11k_mac_op_configure_filter,
9093
.hw_scan = ath11k_mac_op_hw_scan,
9094
.cancel_hw_scan = ath11k_mac_op_cancel_hw_scan,
9095
.set_key = ath11k_mac_op_set_key,
9096
.set_rekey_data = ath11k_mac_op_set_rekey_data,
9097
.sta_state = ath11k_mac_op_sta_state,
9098
.sta_set_4addr = ath11k_mac_op_sta_set_4addr,
9099
.sta_set_txpwr = ath11k_mac_op_sta_set_txpwr,
9100
.sta_rc_update = ath11k_mac_op_sta_rc_update,
9101
.conf_tx = ath11k_mac_op_conf_tx,
9102
.set_antenna = ath11k_mac_op_set_antenna,
9103
.get_antenna = ath11k_mac_op_get_antenna,
9104
.ampdu_action = ath11k_mac_op_ampdu_action,
9105
.add_chanctx = ath11k_mac_op_add_chanctx,
9106
.remove_chanctx = ath11k_mac_op_remove_chanctx,
9107
.change_chanctx = ath11k_mac_op_change_chanctx,
9108
.assign_vif_chanctx = ath11k_mac_op_assign_vif_chanctx,
9109
.unassign_vif_chanctx = ath11k_mac_op_unassign_vif_chanctx,
9110
.switch_vif_chanctx = ath11k_mac_op_switch_vif_chanctx,
9111
.set_rts_threshold = ath11k_mac_op_set_rts_threshold,
9112
.set_frag_threshold = ath11k_mac_op_set_frag_threshold,
9113
.set_bitrate_mask = ath11k_mac_op_set_bitrate_mask,
9114
.get_survey = ath11k_mac_op_get_survey,
9115
.flush = ath11k_mac_op_flush,
9116
.sta_statistics = ath11k_mac_op_sta_statistics,
9117
CFG80211_TESTMODE_CMD(ath11k_tm_cmd)
9118
9119
#ifdef CONFIG_PM
9120
.suspend = ath11k_wow_op_suspend,
9121
.resume = ath11k_wow_op_resume,
9122
.set_wakeup = ath11k_wow_op_set_wakeup,
9123
#endif
9124
9125
#ifdef CONFIG_ATH11K_DEBUGFS
9126
.sta_add_debugfs = ath11k_debugfs_sta_op_add,
9127
#endif
9128
9129
#if IS_ENABLED(CONFIG_IPV6)
9130
.ipv6_addr_change = ath11k_mac_op_ipv6_changed,
9131
#endif
9132
.get_txpower = ath11k_mac_op_get_txpower,
9133
9134
.set_sar_specs = ath11k_mac_op_set_bios_sar_specs,
9135
.remain_on_channel = ath11k_mac_op_remain_on_channel,
9136
.cancel_remain_on_channel = ath11k_mac_op_cancel_remain_on_channel,
9137
};
9138
9139
static void ath11k_mac_update_ch_list(struct ath11k *ar,
9140
struct ieee80211_supported_band *band,
9141
u32 freq_low, u32 freq_high)
9142
{
9143
int i;
9144
9145
if (!(freq_low && freq_high))
9146
return;
9147
9148
for (i = 0; i < band->n_channels; i++) {
9149
if (band->channels[i].center_freq < freq_low ||
9150
band->channels[i].center_freq > freq_high)
9151
band->channels[i].flags |= IEEE80211_CHAN_DISABLED;
9152
}
9153
}
9154
9155
static u32 ath11k_get_phy_id(struct ath11k *ar, u32 band)
9156
{
9157
struct ath11k_pdev *pdev = ar->pdev;
9158
struct ath11k_pdev_cap *pdev_cap = &pdev->cap;
9159
9160
if (band == WMI_HOST_WLAN_2G_CAP)
9161
return pdev_cap->band[NL80211_BAND_2GHZ].phy_id;
9162
9163
if (band == WMI_HOST_WLAN_5G_CAP)
9164
return pdev_cap->band[NL80211_BAND_5GHZ].phy_id;
9165
9166
ath11k_warn(ar->ab, "unsupported phy cap:%d\n", band);
9167
9168
return 0;
9169
}
9170
9171
static int ath11k_mac_setup_channels_rates(struct ath11k *ar,
9172
u32 supported_bands)
9173
{
9174
struct ieee80211_supported_band *band;
9175
struct ath11k_hal_reg_capabilities_ext *reg_cap, *temp_reg_cap;
9176
void *channels;
9177
u32 phy_id;
9178
9179
BUILD_BUG_ON((ARRAY_SIZE(ath11k_2ghz_channels) +
9180
ARRAY_SIZE(ath11k_5ghz_channels) +
9181
ARRAY_SIZE(ath11k_6ghz_channels)) !=
9182
ATH11K_NUM_CHANS);
9183
9184
reg_cap = &ar->ab->hal_reg_cap[ar->pdev_idx];
9185
temp_reg_cap = reg_cap;
9186
9187
if (supported_bands & WMI_HOST_WLAN_2G_CAP) {
9188
channels = kmemdup(ath11k_2ghz_channels,
9189
sizeof(ath11k_2ghz_channels),
9190
GFP_KERNEL);
9191
if (!channels)
9192
return -ENOMEM;
9193
9194
band = &ar->mac.sbands[NL80211_BAND_2GHZ];
9195
band->band = NL80211_BAND_2GHZ;
9196
band->n_channels = ARRAY_SIZE(ath11k_2ghz_channels);
9197
band->channels = channels;
9198
band->n_bitrates = ath11k_g_rates_size;
9199
band->bitrates = ath11k_g_rates;
9200
ar->hw->wiphy->bands[NL80211_BAND_2GHZ] = band;
9201
9202
if (ar->ab->hw_params.single_pdev_only) {
9203
phy_id = ath11k_get_phy_id(ar, WMI_HOST_WLAN_2G_CAP);
9204
temp_reg_cap = &ar->ab->hal_reg_cap[phy_id];
9205
}
9206
ath11k_mac_update_ch_list(ar, band,
9207
temp_reg_cap->low_2ghz_chan,
9208
temp_reg_cap->high_2ghz_chan);
9209
}
9210
9211
if (supported_bands & WMI_HOST_WLAN_5G_CAP) {
9212
if (reg_cap->high_5ghz_chan >= ATH11K_MIN_6G_FREQ) {
9213
channels = kmemdup(ath11k_6ghz_channels,
9214
sizeof(ath11k_6ghz_channels), GFP_KERNEL);
9215
if (!channels) {
9216
kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
9217
return -ENOMEM;
9218
}
9219
9220
ar->supports_6ghz = true;
9221
band = &ar->mac.sbands[NL80211_BAND_6GHZ];
9222
band->band = NL80211_BAND_6GHZ;
9223
band->n_channels = ARRAY_SIZE(ath11k_6ghz_channels);
9224
band->channels = channels;
9225
band->n_bitrates = ath11k_a_rates_size;
9226
band->bitrates = ath11k_a_rates;
9227
ar->hw->wiphy->bands[NL80211_BAND_6GHZ] = band;
9228
9229
if (ar->ab->hw_params.single_pdev_only) {
9230
phy_id = ath11k_get_phy_id(ar, WMI_HOST_WLAN_5G_CAP);
9231
temp_reg_cap = &ar->ab->hal_reg_cap[phy_id];
9232
}
9233
9234
ath11k_mac_update_ch_list(ar, band,
9235
temp_reg_cap->low_5ghz_chan,
9236
temp_reg_cap->high_5ghz_chan);
9237
}
9238
9239
if (reg_cap->low_5ghz_chan < ATH11K_MIN_6G_FREQ) {
9240
channels = kmemdup(ath11k_5ghz_channels,
9241
sizeof(ath11k_5ghz_channels),
9242
GFP_KERNEL);
9243
if (!channels) {
9244
kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
9245
kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
9246
return -ENOMEM;
9247
}
9248
9249
band = &ar->mac.sbands[NL80211_BAND_5GHZ];
9250
band->band = NL80211_BAND_5GHZ;
9251
band->n_channels = ARRAY_SIZE(ath11k_5ghz_channels);
9252
band->channels = channels;
9253
band->n_bitrates = ath11k_a_rates_size;
9254
band->bitrates = ath11k_a_rates;
9255
ar->hw->wiphy->bands[NL80211_BAND_5GHZ] = band;
9256
9257
if (ar->ab->hw_params.single_pdev_only) {
9258
phy_id = ath11k_get_phy_id(ar, WMI_HOST_WLAN_5G_CAP);
9259
temp_reg_cap = &ar->ab->hal_reg_cap[phy_id];
9260
}
9261
9262
ath11k_mac_update_ch_list(ar, band,
9263
temp_reg_cap->low_5ghz_chan,
9264
temp_reg_cap->high_5ghz_chan);
9265
}
9266
}
9267
9268
return 0;
9269
}
9270
9271
static int ath11k_mac_setup_iface_combinations(struct ath11k *ar)
9272
{
9273
struct ath11k_base *ab = ar->ab;
9274
struct ieee80211_iface_combination *combinations;
9275
struct ieee80211_iface_limit *limits;
9276
int n_limits;
9277
9278
combinations = kzalloc(sizeof(*combinations), GFP_KERNEL);
9279
if (!combinations)
9280
return -ENOMEM;
9281
9282
n_limits = 2;
9283
9284
limits = kcalloc(n_limits, sizeof(*limits), GFP_KERNEL);
9285
if (!limits) {
9286
kfree(combinations);
9287
return -ENOMEM;
9288
}
9289
9290
limits[0].max = 1;
9291
limits[0].types |= BIT(NL80211_IFTYPE_STATION);
9292
9293
limits[1].max = 16;
9294
limits[1].types |= BIT(NL80211_IFTYPE_AP);
9295
9296
if (IS_ENABLED(CONFIG_MAC80211_MESH) &&
9297
ab->hw_params.interface_modes & BIT(NL80211_IFTYPE_MESH_POINT))
9298
limits[1].types |= BIT(NL80211_IFTYPE_MESH_POINT);
9299
9300
combinations[0].limits = limits;
9301
combinations[0].n_limits = n_limits;
9302
combinations[0].max_interfaces = 16;
9303
combinations[0].num_different_channels = 1;
9304
combinations[0].beacon_int_infra_match = true;
9305
combinations[0].beacon_int_min_gcd = 100;
9306
combinations[0].radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
9307
BIT(NL80211_CHAN_WIDTH_20) |
9308
BIT(NL80211_CHAN_WIDTH_40) |
9309
BIT(NL80211_CHAN_WIDTH_80) |
9310
BIT(NL80211_CHAN_WIDTH_80P80) |
9311
BIT(NL80211_CHAN_WIDTH_160);
9312
9313
ar->hw->wiphy->iface_combinations = combinations;
9314
ar->hw->wiphy->n_iface_combinations = 1;
9315
9316
return 0;
9317
}
9318
9319
static const u8 ath11k_if_types_ext_capa[] = {
9320
[0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
9321
[2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT,
9322
[7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
9323
};
9324
9325
static const u8 ath11k_if_types_ext_capa_sta[] = {
9326
[0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
9327
[2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT,
9328
[7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
9329
[9] = WLAN_EXT_CAPA10_TWT_REQUESTER_SUPPORT,
9330
};
9331
9332
static const u8 ath11k_if_types_ext_capa_ap[] = {
9333
[0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
9334
[2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT,
9335
[7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
9336
[9] = WLAN_EXT_CAPA10_TWT_RESPONDER_SUPPORT,
9337
[10] = WLAN_EXT_CAPA11_EMA_SUPPORT,
9338
};
9339
9340
static const struct wiphy_iftype_ext_capab ath11k_iftypes_ext_capa[] = {
9341
{
9342
.extended_capabilities = ath11k_if_types_ext_capa,
9343
.extended_capabilities_mask = ath11k_if_types_ext_capa,
9344
.extended_capabilities_len = sizeof(ath11k_if_types_ext_capa),
9345
}, {
9346
.iftype = NL80211_IFTYPE_STATION,
9347
.extended_capabilities = ath11k_if_types_ext_capa_sta,
9348
.extended_capabilities_mask = ath11k_if_types_ext_capa_sta,
9349
.extended_capabilities_len =
9350
sizeof(ath11k_if_types_ext_capa_sta),
9351
}, {
9352
.iftype = NL80211_IFTYPE_AP,
9353
.extended_capabilities = ath11k_if_types_ext_capa_ap,
9354
.extended_capabilities_mask = ath11k_if_types_ext_capa_ap,
9355
.extended_capabilities_len =
9356
sizeof(ath11k_if_types_ext_capa_ap),
9357
},
9358
};
9359
9360
static void __ath11k_mac_unregister(struct ath11k *ar)
9361
{
9362
cancel_work_sync(&ar->regd_update_work);
9363
9364
ieee80211_unregister_hw(ar->hw);
9365
9366
idr_for_each(&ar->txmgmt_idr, ath11k_mac_tx_mgmt_pending_free, ar);
9367
idr_destroy(&ar->txmgmt_idr);
9368
9369
kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
9370
kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels);
9371
kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
9372
9373
kfree(ar->hw->wiphy->iface_combinations[0].limits);
9374
kfree(ar->hw->wiphy->iface_combinations);
9375
9376
SET_IEEE80211_DEV(ar->hw, NULL);
9377
}
9378
9379
void ath11k_mac_unregister(struct ath11k_base *ab)
9380
{
9381
struct ath11k *ar;
9382
struct ath11k_pdev *pdev;
9383
int i;
9384
9385
for (i = 0; i < ab->num_radios; i++) {
9386
pdev = &ab->pdevs[i];
9387
ar = pdev->ar;
9388
if (!ar)
9389
continue;
9390
9391
__ath11k_mac_unregister(ar);
9392
}
9393
9394
ath11k_peer_rhash_tbl_destroy(ab);
9395
}
9396
9397
static int __ath11k_mac_register(struct ath11k *ar)
9398
{
9399
struct ath11k_base *ab = ar->ab;
9400
struct ath11k_pdev_cap *cap = &ar->pdev->cap;
9401
static const u32 cipher_suites[] = {
9402
WLAN_CIPHER_SUITE_TKIP,
9403
WLAN_CIPHER_SUITE_CCMP,
9404
WLAN_CIPHER_SUITE_AES_CMAC,
9405
WLAN_CIPHER_SUITE_BIP_CMAC_256,
9406
WLAN_CIPHER_SUITE_BIP_GMAC_128,
9407
WLAN_CIPHER_SUITE_BIP_GMAC_256,
9408
WLAN_CIPHER_SUITE_GCMP,
9409
WLAN_CIPHER_SUITE_GCMP_256,
9410
WLAN_CIPHER_SUITE_CCMP_256,
9411
};
9412
int ret;
9413
u32 ht_cap = 0;
9414
9415
ath11k_pdev_caps_update(ar);
9416
9417
SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr);
9418
9419
SET_IEEE80211_DEV(ar->hw, ab->dev);
9420
9421
ret = ath11k_mac_setup_channels_rates(ar,
9422
cap->supported_bands);
9423
if (ret)
9424
goto err;
9425
9426
ath11k_mac_setup_ht_vht_cap(ar, cap, &ht_cap);
9427
ath11k_mac_setup_he_cap(ar, cap);
9428
9429
ret = ath11k_mac_setup_iface_combinations(ar);
9430
if (ret) {
9431
ath11k_err(ar->ab, "failed to setup interface combinations: %d\n", ret);
9432
goto err_free_channels;
9433
}
9434
9435
ar->hw->wiphy->available_antennas_rx = cap->rx_chain_mask;
9436
ar->hw->wiphy->available_antennas_tx = cap->tx_chain_mask;
9437
9438
ar->hw->wiphy->interface_modes = ab->hw_params.interface_modes;
9439
9440
if (ab->hw_params.single_pdev_only && ar->supports_6ghz)
9441
ieee80211_hw_set(ar->hw, SINGLE_SCAN_ON_ALL_BANDS);
9442
9443
if (ab->hw_params.supports_multi_bssid) {
9444
ieee80211_hw_set(ar->hw, SUPPORTS_MULTI_BSSID);
9445
ieee80211_hw_set(ar->hw, SUPPORTS_ONLY_HE_MULTI_BSSID);
9446
}
9447
9448
ieee80211_hw_set(ar->hw, SIGNAL_DBM);
9449
ieee80211_hw_set(ar->hw, SUPPORTS_PS);
9450
ieee80211_hw_set(ar->hw, SUPPORTS_DYNAMIC_PS);
9451
ieee80211_hw_set(ar->hw, MFP_CAPABLE);
9452
ieee80211_hw_set(ar->hw, REPORTS_TX_ACK_STATUS);
9453
ieee80211_hw_set(ar->hw, HAS_RATE_CONTROL);
9454
ieee80211_hw_set(ar->hw, AP_LINK_PS);
9455
ieee80211_hw_set(ar->hw, SPECTRUM_MGMT);
9456
ieee80211_hw_set(ar->hw, CONNECTION_MONITOR);
9457
ieee80211_hw_set(ar->hw, SUPPORTS_PER_STA_GTK);
9458
ieee80211_hw_set(ar->hw, WANT_MONITOR_VIF);
9459
ieee80211_hw_set(ar->hw, CHANCTX_STA_CSA);
9460
ieee80211_hw_set(ar->hw, QUEUE_CONTROL);
9461
ieee80211_hw_set(ar->hw, SUPPORTS_TX_FRAG);
9462
ieee80211_hw_set(ar->hw, REPORTS_LOW_ACK);
9463
9464
if (ath11k_frame_mode == ATH11K_HW_TXRX_ETHERNET) {
9465
ieee80211_hw_set(ar->hw, SUPPORTS_TX_ENCAP_OFFLOAD);
9466
ieee80211_hw_set(ar->hw, SUPPORTS_RX_DECAP_OFFLOAD);
9467
}
9468
9469
if (cap->nss_ratio_enabled)
9470
ieee80211_hw_set(ar->hw, SUPPORTS_VHT_EXT_NSS_BW);
9471
9472
if ((ht_cap & WMI_HT_CAP_ENABLED) || ar->supports_6ghz) {
9473
ieee80211_hw_set(ar->hw, AMPDU_AGGREGATION);
9474
ieee80211_hw_set(ar->hw, TX_AMPDU_SETUP_IN_HW);
9475
ieee80211_hw_set(ar->hw, SUPPORTS_REORDERING_BUFFER);
9476
ieee80211_hw_set(ar->hw, SUPPORTS_AMSDU_IN_AMPDU);
9477
ieee80211_hw_set(ar->hw, USES_RSS);
9478
}
9479
9480
ar->hw->wiphy->features |= NL80211_FEATURE_STATIC_SMPS;
9481
ar->hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
9482
9483
/* TODO: Check if HT capability advertised from firmware is different
9484
* for each band for a dual band capable radio. It will be tricky to
9485
* handle it when the ht capability different for each band.
9486
*/
9487
if (ht_cap & WMI_HT_CAP_DYNAMIC_SMPS ||
9488
(ar->supports_6ghz && ab->hw_params.supports_dynamic_smps_6ghz))
9489
ar->hw->wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS;
9490
9491
ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID;
9492
ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN;
9493
9494
ar->hw->max_listen_interval = ATH11K_MAX_HW_LISTEN_INTERVAL;
9495
9496
ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
9497
ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
9498
ar->hw->wiphy->max_remain_on_channel_duration = 5000;
9499
9500
ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
9501
ar->hw->wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE |
9502
NL80211_FEATURE_AP_SCAN;
9503
9504
ar->max_num_stations = TARGET_NUM_STATIONS(ab);
9505
ar->max_num_peers = TARGET_NUM_PEERS_PDEV(ab);
9506
9507
ar->hw->wiphy->max_ap_assoc_sta = ar->max_num_stations;
9508
9509
if (test_bit(WMI_TLV_SERVICE_SPOOF_MAC_SUPPORT, ar->wmi->wmi_ab->svc_map)) {
9510
ar->hw->wiphy->features |=
9511
NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR;
9512
}
9513
9514
if (test_bit(WMI_TLV_SERVICE_NLO, ar->wmi->wmi_ab->svc_map)) {
9515
ar->hw->wiphy->max_sched_scan_ssids = WMI_PNO_MAX_SUPP_NETWORKS;
9516
ar->hw->wiphy->max_match_sets = WMI_PNO_MAX_SUPP_NETWORKS;
9517
ar->hw->wiphy->max_sched_scan_ie_len = WMI_PNO_MAX_IE_LENGTH;
9518
ar->hw->wiphy->max_sched_scan_plans = WMI_PNO_MAX_SCHED_SCAN_PLANS;
9519
ar->hw->wiphy->max_sched_scan_plan_interval =
9520
WMI_PNO_MAX_SCHED_SCAN_PLAN_INT;
9521
ar->hw->wiphy->max_sched_scan_plan_iterations =
9522
WMI_PNO_MAX_SCHED_SCAN_PLAN_ITRNS;
9523
ar->hw->wiphy->features |= NL80211_FEATURE_ND_RANDOM_MAC_ADDR;
9524
}
9525
9526
ret = ath11k_wow_init(ar);
9527
if (ret) {
9528
ath11k_warn(ar->ab, "failed to init wow: %d\n", ret);
9529
goto err_free_if_combs;
9530
}
9531
9532
if (test_bit(WMI_TLV_SERVICE_TX_DATA_MGMT_ACK_RSSI,
9533
ar->ab->wmi_ab.svc_map))
9534
wiphy_ext_feature_set(ar->hw->wiphy,
9535
NL80211_EXT_FEATURE_ACK_SIGNAL_SUPPORT);
9536
9537
ar->hw->queues = ATH11K_HW_MAX_QUEUES;
9538
ar->hw->wiphy->tx_queue_len = ATH11K_QUEUE_LEN;
9539
ar->hw->offchannel_tx_hw_queue = ATH11K_HW_MAX_QUEUES - 1;
9540
ar->hw->max_rx_aggregation_subframes = IEEE80211_MAX_AMPDU_BUF_HE;
9541
9542
ar->hw->vif_data_size = sizeof(struct ath11k_vif);
9543
ar->hw->sta_data_size = sizeof(struct ath11k_sta);
9544
9545
wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
9546
wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_STA_TX_PWR);
9547
if (test_bit(WMI_TLV_SERVICE_BSS_COLOR_OFFLOAD,
9548
ar->ab->wmi_ab.svc_map)) {
9549
wiphy_ext_feature_set(ar->hw->wiphy,
9550
NL80211_EXT_FEATURE_BSS_COLOR);
9551
ieee80211_hw_set(ar->hw, DETECTS_COLOR_COLLISION);
9552
}
9553
9554
ar->hw->wiphy->cipher_suites = cipher_suites;
9555
ar->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
9556
9557
ar->hw->wiphy->iftype_ext_capab = ath11k_iftypes_ext_capa;
9558
ar->hw->wiphy->num_iftype_ext_capab =
9559
ARRAY_SIZE(ath11k_iftypes_ext_capa);
9560
9561
if (ar->supports_6ghz) {
9562
wiphy_ext_feature_set(ar->hw->wiphy,
9563
NL80211_EXT_FEATURE_FILS_DISCOVERY);
9564
wiphy_ext_feature_set(ar->hw->wiphy,
9565
NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP);
9566
}
9567
9568
wiphy_ext_feature_set(ar->hw->wiphy,
9569
NL80211_EXT_FEATURE_SET_SCAN_DWELL);
9570
9571
if (test_bit(WMI_TLV_SERVICE_RTT, ar->ab->wmi_ab.svc_map))
9572
wiphy_ext_feature_set(ar->hw->wiphy,
9573
NL80211_EXT_FEATURE_ENABLE_FTM_RESPONDER);
9574
9575
ar->hw->wiphy->mbssid_max_interfaces = TARGET_NUM_VDEVS(ab);
9576
ar->hw->wiphy->ema_max_profile_periodicity = TARGET_EMA_MAX_PROFILE_PERIOD;
9577
9578
ath11k_reg_init(ar);
9579
9580
if (!test_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags)) {
9581
ar->hw->netdev_features = NETIF_F_HW_CSUM;
9582
ieee80211_hw_set(ar->hw, SW_CRYPTO_CONTROL);
9583
ieee80211_hw_set(ar->hw, SUPPORT_FAST_XMIT);
9584
}
9585
9586
if (test_bit(WMI_TLV_SERVICE_BIOS_SAR_SUPPORT, ar->ab->wmi_ab.svc_map) &&
9587
ab->hw_params.bios_sar_capa)
9588
ar->hw->wiphy->sar_capa = ab->hw_params.bios_sar_capa;
9589
9590
ret = ieee80211_register_hw(ar->hw);
9591
if (ret) {
9592
ath11k_err(ar->ab, "ieee80211 registration failed: %d\n", ret);
9593
goto err_free_if_combs;
9594
}
9595
9596
if (!ab->hw_params.supports_monitor)
9597
/* There's a race between calling ieee80211_register_hw()
9598
* and here where the monitor mode is enabled for a little
9599
* while. But that time is so short and in practise it make
9600
* a difference in real life.
9601
*/
9602
ar->hw->wiphy->interface_modes &= ~BIT(NL80211_IFTYPE_MONITOR);
9603
9604
/* Apply the regd received during initialization */
9605
ret = ath11k_regd_update(ar);
9606
if (ret) {
9607
ath11k_err(ar->ab, "ath11k regd update failed: %d\n", ret);
9608
goto err_unregister_hw;
9609
}
9610
9611
if (ab->hw_params.current_cc_support && ab->new_alpha2[0]) {
9612
struct wmi_set_current_country_params set_current_param = {};
9613
9614
memcpy(&set_current_param.alpha2, ab->new_alpha2, 2);
9615
memcpy(&ar->alpha2, ab->new_alpha2, 2);
9616
ret = ath11k_wmi_send_set_current_country_cmd(ar, &set_current_param);
9617
if (ret)
9618
ath11k_warn(ar->ab,
9619
"failed set cc code for mac register: %d\n", ret);
9620
}
9621
9622
ret = ath11k_debugfs_register(ar);
9623
if (ret) {
9624
ath11k_err(ar->ab, "debugfs registration failed: %d\n", ret);
9625
goto err_unregister_hw;
9626
}
9627
9628
return 0;
9629
9630
err_unregister_hw:
9631
ieee80211_unregister_hw(ar->hw);
9632
9633
err_free_if_combs:
9634
kfree(ar->hw->wiphy->iface_combinations[0].limits);
9635
kfree(ar->hw->wiphy->iface_combinations);
9636
9637
err_free_channels:
9638
kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
9639
kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels);
9640
kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
9641
9642
err:
9643
SET_IEEE80211_DEV(ar->hw, NULL);
9644
return ret;
9645
}
9646
9647
int ath11k_mac_register(struct ath11k_base *ab)
9648
{
9649
struct ath11k *ar;
9650
struct ath11k_pdev *pdev;
9651
int i;
9652
int ret;
9653
u8 mac_addr[ETH_ALEN] = {0};
9654
9655
if (test_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags))
9656
return 0;
9657
9658
/* Initialize channel counters frequency value in hertz */
9659
ab->cc_freq_hz = IPQ8074_CC_FREQ_HERTZ;
9660
ab->free_vdev_map = (1LL << (ab->num_radios * TARGET_NUM_VDEVS(ab))) - 1;
9661
9662
ret = ath11k_peer_rhash_tbl_init(ab);
9663
if (ret)
9664
return ret;
9665
9666
device_get_mac_address(ab->dev, mac_addr);
9667
9668
for (i = 0; i < ab->num_radios; i++) {
9669
pdev = &ab->pdevs[i];
9670
ar = pdev->ar;
9671
if (ab->pdevs_macaddr_valid) {
9672
ether_addr_copy(ar->mac_addr, pdev->mac_addr);
9673
} else {
9674
if (is_zero_ether_addr(mac_addr))
9675
ether_addr_copy(ar->mac_addr, ab->mac_addr);
9676
else
9677
ether_addr_copy(ar->mac_addr, mac_addr);
9678
ar->mac_addr[4] += i;
9679
}
9680
9681
idr_init(&ar->txmgmt_idr);
9682
spin_lock_init(&ar->txmgmt_idr_lock);
9683
9684
ret = __ath11k_mac_register(ar);
9685
if (ret)
9686
goto err_cleanup;
9687
9688
init_waitqueue_head(&ar->txmgmt_empty_waitq);
9689
}
9690
9691
return 0;
9692
9693
err_cleanup:
9694
for (i = i - 1; i >= 0; i--) {
9695
pdev = &ab->pdevs[i];
9696
ar = pdev->ar;
9697
__ath11k_mac_unregister(ar);
9698
}
9699
9700
ath11k_peer_rhash_tbl_destroy(ab);
9701
9702
return ret;
9703
}
9704
9705
int ath11k_mac_allocate(struct ath11k_base *ab)
9706
{
9707
struct ieee80211_hw *hw;
9708
struct ath11k *ar;
9709
struct ath11k_pdev *pdev;
9710
int ret;
9711
int i;
9712
9713
if (test_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags))
9714
return 0;
9715
9716
for (i = 0; i < ab->num_radios; i++) {
9717
pdev = &ab->pdevs[i];
9718
hw = ieee80211_alloc_hw(sizeof(struct ath11k), &ath11k_ops);
9719
if (!hw) {
9720
ath11k_warn(ab, "failed to allocate mac80211 hw device\n");
9721
ret = -ENOMEM;
9722
goto err_free_mac;
9723
}
9724
9725
ar = hw->priv;
9726
ar->hw = hw;
9727
ar->ab = ab;
9728
ar->pdev = pdev;
9729
ar->pdev_idx = i;
9730
ar->lmac_id = ath11k_hw_get_mac_from_pdev_id(&ab->hw_params, i);
9731
9732
ar->wmi = &ab->wmi_ab.wmi[i];
9733
/* FIXME wmi[0] is already initialized during attach,
9734
* Should we do this again?
9735
*/
9736
ath11k_wmi_pdev_attach(ab, i);
9737
9738
ar->cfg_tx_chainmask = pdev->cap.tx_chain_mask;
9739
ar->cfg_rx_chainmask = pdev->cap.rx_chain_mask;
9740
ar->num_tx_chains = get_num_chains(pdev->cap.tx_chain_mask);
9741
ar->num_rx_chains = get_num_chains(pdev->cap.rx_chain_mask);
9742
9743
pdev->ar = ar;
9744
spin_lock_init(&ar->data_lock);
9745
INIT_LIST_HEAD(&ar->arvifs);
9746
INIT_LIST_HEAD(&ar->ppdu_stats_info);
9747
mutex_init(&ar->conf_mutex);
9748
init_completion(&ar->vdev_setup_done);
9749
init_completion(&ar->vdev_delete_done);
9750
init_completion(&ar->peer_assoc_done);
9751
init_completion(&ar->peer_delete_done);
9752
init_completion(&ar->install_key_done);
9753
init_completion(&ar->bss_survey_done);
9754
init_completion(&ar->scan.started);
9755
init_completion(&ar->scan.completed);
9756
init_completion(&ar->scan.on_channel);
9757
init_completion(&ar->thermal.wmi_sync);
9758
9759
INIT_DELAYED_WORK(&ar->scan.timeout, ath11k_scan_timeout_work);
9760
INIT_WORK(&ar->regd_update_work, ath11k_regd_update_work);
9761
9762
INIT_WORK(&ar->wmi_mgmt_tx_work, ath11k_mgmt_over_wmi_tx_work);
9763
skb_queue_head_init(&ar->wmi_mgmt_tx_queue);
9764
9765
clear_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags);
9766
9767
ar->monitor_vdev_id = -1;
9768
clear_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags);
9769
ar->vdev_id_11d_scan = ATH11K_11D_INVALID_VDEV_ID;
9770
init_completion(&ar->completed_11d_scan);
9771
9772
ath11k_fw_stats_init(ar);
9773
}
9774
9775
return 0;
9776
9777
err_free_mac:
9778
ath11k_mac_destroy(ab);
9779
9780
return ret;
9781
}
9782
9783
void ath11k_mac_destroy(struct ath11k_base *ab)
9784
{
9785
struct ath11k *ar;
9786
struct ath11k_pdev *pdev;
9787
int i;
9788
9789
for (i = 0; i < ab->num_radios; i++) {
9790
pdev = &ab->pdevs[i];
9791
ar = pdev->ar;
9792
if (!ar)
9793
continue;
9794
9795
ath11k_fw_stats_free(&ar->fw_stats);
9796
ieee80211_free_hw(ar->hw);
9797
pdev->ar = NULL;
9798
}
9799
}
9800
9801
int ath11k_mac_vif_set_keepalive(struct ath11k_vif *arvif,
9802
enum wmi_sta_keepalive_method method,
9803
u32 interval)
9804
{
9805
struct ath11k *ar = arvif->ar;
9806
struct wmi_sta_keepalive_arg arg = {};
9807
int ret;
9808
9809
lockdep_assert_held(&ar->conf_mutex);
9810
9811
if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
9812
return 0;
9813
9814
if (!test_bit(WMI_TLV_SERVICE_STA_KEEP_ALIVE, ar->ab->wmi_ab.svc_map))
9815
return 0;
9816
9817
arg.vdev_id = arvif->vdev_id;
9818
arg.enabled = 1;
9819
arg.method = method;
9820
arg.interval = interval;
9821
9822
ret = ath11k_wmi_sta_keepalive(ar, &arg);
9823
if (ret) {
9824
ath11k_warn(ar->ab, "failed to set keepalive on vdev %i: %d\n",
9825
arvif->vdev_id, ret);
9826
return ret;
9827
}
9828
9829
return 0;
9830
}
9831
9832