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