Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/contrib/dev/athk/ath12k/mac.c
48378 views
1
// SPDX-License-Identifier: BSD-3-Clause-Clear
2
/*
3
* Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
4
* Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
5
*/
6
7
#include <net/mac80211.h>
8
#include <linux/etherdevice.h>
9
#include "mac.h"
10
#include "core.h"
11
#include "debug.h"
12
#include "wmi.h"
13
#include "hw.h"
14
#include "dp_tx.h"
15
#include "dp_rx.h"
16
#include "peer.h"
17
18
#define CHAN2G(_channel, _freq, _flags) { \
19
.band = NL80211_BAND_2GHZ, \
20
.hw_value = (_channel), \
21
.center_freq = (_freq), \
22
.flags = (_flags), \
23
.max_antenna_gain = 0, \
24
.max_power = 30, \
25
}
26
27
#define CHAN5G(_channel, _freq, _flags) { \
28
.band = NL80211_BAND_5GHZ, \
29
.hw_value = (_channel), \
30
.center_freq = (_freq), \
31
.flags = (_flags), \
32
.max_antenna_gain = 0, \
33
.max_power = 30, \
34
}
35
36
#define CHAN6G(_channel, _freq, _flags) { \
37
.band = NL80211_BAND_6GHZ, \
38
.hw_value = (_channel), \
39
.center_freq = (_freq), \
40
.flags = (_flags), \
41
.max_antenna_gain = 0, \
42
.max_power = 30, \
43
}
44
45
static const struct ieee80211_channel ath12k_2ghz_channels[] = {
46
CHAN2G(1, 2412, 0),
47
CHAN2G(2, 2417, 0),
48
CHAN2G(3, 2422, 0),
49
CHAN2G(4, 2427, 0),
50
CHAN2G(5, 2432, 0),
51
CHAN2G(6, 2437, 0),
52
CHAN2G(7, 2442, 0),
53
CHAN2G(8, 2447, 0),
54
CHAN2G(9, 2452, 0),
55
CHAN2G(10, 2457, 0),
56
CHAN2G(11, 2462, 0),
57
CHAN2G(12, 2467, 0),
58
CHAN2G(13, 2472, 0),
59
CHAN2G(14, 2484, 0),
60
};
61
62
static const struct ieee80211_channel ath12k_5ghz_channels[] = {
63
CHAN5G(36, 5180, 0),
64
CHAN5G(40, 5200, 0),
65
CHAN5G(44, 5220, 0),
66
CHAN5G(48, 5240, 0),
67
CHAN5G(52, 5260, 0),
68
CHAN5G(56, 5280, 0),
69
CHAN5G(60, 5300, 0),
70
CHAN5G(64, 5320, 0),
71
CHAN5G(100, 5500, 0),
72
CHAN5G(104, 5520, 0),
73
CHAN5G(108, 5540, 0),
74
CHAN5G(112, 5560, 0),
75
CHAN5G(116, 5580, 0),
76
CHAN5G(120, 5600, 0),
77
CHAN5G(124, 5620, 0),
78
CHAN5G(128, 5640, 0),
79
CHAN5G(132, 5660, 0),
80
CHAN5G(136, 5680, 0),
81
CHAN5G(140, 5700, 0),
82
CHAN5G(144, 5720, 0),
83
CHAN5G(149, 5745, 0),
84
CHAN5G(153, 5765, 0),
85
CHAN5G(157, 5785, 0),
86
CHAN5G(161, 5805, 0),
87
CHAN5G(165, 5825, 0),
88
CHAN5G(169, 5845, 0),
89
CHAN5G(173, 5865, 0),
90
};
91
92
static const struct ieee80211_channel ath12k_6ghz_channels[] = {
93
CHAN6G(1, 5955, 0),
94
CHAN6G(5, 5975, 0),
95
CHAN6G(9, 5995, 0),
96
CHAN6G(13, 6015, 0),
97
CHAN6G(17, 6035, 0),
98
CHAN6G(21, 6055, 0),
99
CHAN6G(25, 6075, 0),
100
CHAN6G(29, 6095, 0),
101
CHAN6G(33, 6115, 0),
102
CHAN6G(37, 6135, 0),
103
CHAN6G(41, 6155, 0),
104
CHAN6G(45, 6175, 0),
105
CHAN6G(49, 6195, 0),
106
CHAN6G(53, 6215, 0),
107
CHAN6G(57, 6235, 0),
108
CHAN6G(61, 6255, 0),
109
CHAN6G(65, 6275, 0),
110
CHAN6G(69, 6295, 0),
111
CHAN6G(73, 6315, 0),
112
CHAN6G(77, 6335, 0),
113
CHAN6G(81, 6355, 0),
114
CHAN6G(85, 6375, 0),
115
CHAN6G(89, 6395, 0),
116
CHAN6G(93, 6415, 0),
117
CHAN6G(97, 6435, 0),
118
CHAN6G(101, 6455, 0),
119
CHAN6G(105, 6475, 0),
120
CHAN6G(109, 6495, 0),
121
CHAN6G(113, 6515, 0),
122
CHAN6G(117, 6535, 0),
123
CHAN6G(121, 6555, 0),
124
CHAN6G(125, 6575, 0),
125
CHAN6G(129, 6595, 0),
126
CHAN6G(133, 6615, 0),
127
CHAN6G(137, 6635, 0),
128
CHAN6G(141, 6655, 0),
129
CHAN6G(145, 6675, 0),
130
CHAN6G(149, 6695, 0),
131
CHAN6G(153, 6715, 0),
132
CHAN6G(157, 6735, 0),
133
CHAN6G(161, 6755, 0),
134
CHAN6G(165, 6775, 0),
135
CHAN6G(169, 6795, 0),
136
CHAN6G(173, 6815, 0),
137
CHAN6G(177, 6835, 0),
138
CHAN6G(181, 6855, 0),
139
CHAN6G(185, 6875, 0),
140
CHAN6G(189, 6895, 0),
141
CHAN6G(193, 6915, 0),
142
CHAN6G(197, 6935, 0),
143
CHAN6G(201, 6955, 0),
144
CHAN6G(205, 6975, 0),
145
CHAN6G(209, 6995, 0),
146
CHAN6G(213, 7015, 0),
147
CHAN6G(217, 7035, 0),
148
CHAN6G(221, 7055, 0),
149
CHAN6G(225, 7075, 0),
150
CHAN6G(229, 7095, 0),
151
CHAN6G(233, 7115, 0),
152
};
153
154
static struct ieee80211_rate ath12k_legacy_rates[] = {
155
{ .bitrate = 10,
156
.hw_value = ATH12K_HW_RATE_CCK_LP_1M },
157
{ .bitrate = 20,
158
.hw_value = ATH12K_HW_RATE_CCK_LP_2M,
159
.hw_value_short = ATH12K_HW_RATE_CCK_SP_2M,
160
.flags = IEEE80211_RATE_SHORT_PREAMBLE },
161
{ .bitrate = 55,
162
.hw_value = ATH12K_HW_RATE_CCK_LP_5_5M,
163
.hw_value_short = ATH12K_HW_RATE_CCK_SP_5_5M,
164
.flags = IEEE80211_RATE_SHORT_PREAMBLE },
165
{ .bitrate = 110,
166
.hw_value = ATH12K_HW_RATE_CCK_LP_11M,
167
.hw_value_short = ATH12K_HW_RATE_CCK_SP_11M,
168
.flags = IEEE80211_RATE_SHORT_PREAMBLE },
169
170
{ .bitrate = 60, .hw_value = ATH12K_HW_RATE_OFDM_6M },
171
{ .bitrate = 90, .hw_value = ATH12K_HW_RATE_OFDM_9M },
172
{ .bitrate = 120, .hw_value = ATH12K_HW_RATE_OFDM_12M },
173
{ .bitrate = 180, .hw_value = ATH12K_HW_RATE_OFDM_18M },
174
{ .bitrate = 240, .hw_value = ATH12K_HW_RATE_OFDM_24M },
175
{ .bitrate = 360, .hw_value = ATH12K_HW_RATE_OFDM_36M },
176
{ .bitrate = 480, .hw_value = ATH12K_HW_RATE_OFDM_48M },
177
{ .bitrate = 540, .hw_value = ATH12K_HW_RATE_OFDM_54M },
178
};
179
180
static const int
181
ath12k_phymodes[NUM_NL80211_BANDS][ATH12K_CHAN_WIDTH_NUM] = {
182
[NL80211_BAND_2GHZ] = {
183
[NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
184
[NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
185
[NL80211_CHAN_WIDTH_20_NOHT] = MODE_11BE_EHT20_2G,
186
[NL80211_CHAN_WIDTH_20] = MODE_11BE_EHT20_2G,
187
[NL80211_CHAN_WIDTH_40] = MODE_11BE_EHT40_2G,
188
[NL80211_CHAN_WIDTH_80] = MODE_UNKNOWN,
189
[NL80211_CHAN_WIDTH_80P80] = MODE_UNKNOWN,
190
[NL80211_CHAN_WIDTH_160] = MODE_UNKNOWN,
191
[NL80211_CHAN_WIDTH_320] = MODE_UNKNOWN,
192
},
193
[NL80211_BAND_5GHZ] = {
194
[NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
195
[NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
196
[NL80211_CHAN_WIDTH_20_NOHT] = MODE_11BE_EHT20,
197
[NL80211_CHAN_WIDTH_20] = MODE_11BE_EHT20,
198
[NL80211_CHAN_WIDTH_40] = MODE_11BE_EHT40,
199
[NL80211_CHAN_WIDTH_80] = MODE_11BE_EHT80,
200
[NL80211_CHAN_WIDTH_160] = MODE_11BE_EHT160,
201
[NL80211_CHAN_WIDTH_80P80] = MODE_11BE_EHT80_80,
202
[NL80211_CHAN_WIDTH_320] = MODE_11BE_EHT320,
203
},
204
[NL80211_BAND_6GHZ] = {
205
[NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
206
[NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
207
[NL80211_CHAN_WIDTH_20_NOHT] = MODE_11BE_EHT20,
208
[NL80211_CHAN_WIDTH_20] = MODE_11BE_EHT20,
209
[NL80211_CHAN_WIDTH_40] = MODE_11BE_EHT40,
210
[NL80211_CHAN_WIDTH_80] = MODE_11BE_EHT80,
211
[NL80211_CHAN_WIDTH_160] = MODE_11BE_EHT160,
212
[NL80211_CHAN_WIDTH_80P80] = MODE_11BE_EHT80_80,
213
[NL80211_CHAN_WIDTH_320] = MODE_11BE_EHT320,
214
},
215
216
};
217
218
const struct htt_rx_ring_tlv_filter ath12k_mac_mon_status_filter_default = {
219
.rx_filter = HTT_RX_FILTER_TLV_FLAGS_MPDU_START |
220
HTT_RX_FILTER_TLV_FLAGS_PPDU_END |
221
HTT_RX_FILTER_TLV_FLAGS_PPDU_END_STATUS_DONE,
222
.pkt_filter_flags0 = HTT_RX_FP_MGMT_FILTER_FLAGS0,
223
.pkt_filter_flags1 = HTT_RX_FP_MGMT_FILTER_FLAGS1,
224
.pkt_filter_flags2 = HTT_RX_FP_CTRL_FILTER_FLASG2,
225
.pkt_filter_flags3 = HTT_RX_FP_DATA_FILTER_FLASG3 |
226
HTT_RX_FP_CTRL_FILTER_FLASG3
227
};
228
229
#define ATH12K_MAC_FIRST_OFDM_RATE_IDX 4
230
#define ath12k_g_rates ath12k_legacy_rates
231
#define ath12k_g_rates_size (ARRAY_SIZE(ath12k_legacy_rates))
232
#define ath12k_a_rates (ath12k_legacy_rates + 4)
233
#define ath12k_a_rates_size (ARRAY_SIZE(ath12k_legacy_rates) - 4)
234
235
#define ATH12K_MAC_SCAN_TIMEOUT_MSECS 200 /* in msecs */
236
237
static const u32 ath12k_smps_map[] = {
238
[WLAN_HT_CAP_SM_PS_STATIC] = WMI_PEER_SMPS_STATIC,
239
[WLAN_HT_CAP_SM_PS_DYNAMIC] = WMI_PEER_SMPS_DYNAMIC,
240
[WLAN_HT_CAP_SM_PS_INVALID] = WMI_PEER_SMPS_PS_NONE,
241
[WLAN_HT_CAP_SM_PS_DISABLED] = WMI_PEER_SMPS_PS_NONE,
242
};
243
244
static int ath12k_start_vdev_delay(struct ieee80211_hw *hw,
245
struct ieee80211_vif *vif);
246
247
static const char *ath12k_mac_phymode_str(enum wmi_phy_mode mode)
248
{
249
switch (mode) {
250
case MODE_11A:
251
return "11a";
252
case MODE_11G:
253
return "11g";
254
case MODE_11B:
255
return "11b";
256
case MODE_11GONLY:
257
return "11gonly";
258
case MODE_11NA_HT20:
259
return "11na-ht20";
260
case MODE_11NG_HT20:
261
return "11ng-ht20";
262
case MODE_11NA_HT40:
263
return "11na-ht40";
264
case MODE_11NG_HT40:
265
return "11ng-ht40";
266
case MODE_11AC_VHT20:
267
return "11ac-vht20";
268
case MODE_11AC_VHT40:
269
return "11ac-vht40";
270
case MODE_11AC_VHT80:
271
return "11ac-vht80";
272
case MODE_11AC_VHT160:
273
return "11ac-vht160";
274
case MODE_11AC_VHT80_80:
275
return "11ac-vht80+80";
276
case MODE_11AC_VHT20_2G:
277
return "11ac-vht20-2g";
278
case MODE_11AC_VHT40_2G:
279
return "11ac-vht40-2g";
280
case MODE_11AC_VHT80_2G:
281
return "11ac-vht80-2g";
282
case MODE_11AX_HE20:
283
return "11ax-he20";
284
case MODE_11AX_HE40:
285
return "11ax-he40";
286
case MODE_11AX_HE80:
287
return "11ax-he80";
288
case MODE_11AX_HE80_80:
289
return "11ax-he80+80";
290
case MODE_11AX_HE160:
291
return "11ax-he160";
292
case MODE_11AX_HE20_2G:
293
return "11ax-he20-2g";
294
case MODE_11AX_HE40_2G:
295
return "11ax-he40-2g";
296
case MODE_11AX_HE80_2G:
297
return "11ax-he80-2g";
298
case MODE_11BE_EHT20:
299
return "11be-eht20";
300
case MODE_11BE_EHT40:
301
return "11be-eht40";
302
case MODE_11BE_EHT80:
303
return "11be-eht80";
304
case MODE_11BE_EHT80_80:
305
return "11be-eht80+80";
306
case MODE_11BE_EHT160:
307
return "11be-eht160";
308
case MODE_11BE_EHT160_160:
309
return "11be-eht160+160";
310
case MODE_11BE_EHT320:
311
return "11be-eht320";
312
case MODE_11BE_EHT20_2G:
313
return "11be-eht20-2g";
314
case MODE_11BE_EHT40_2G:
315
return "11be-eht40-2g";
316
case MODE_UNKNOWN:
317
/* skip */
318
break;
319
320
/* no default handler to allow compiler to check that the
321
* enum is fully handled
322
*/
323
}
324
325
return "<unknown>";
326
}
327
328
enum rate_info_bw
329
ath12k_mac_bw_to_mac80211_bw(enum ath12k_supported_bw bw)
330
{
331
u8 ret = RATE_INFO_BW_20;
332
333
switch (bw) {
334
case ATH12K_BW_20:
335
ret = RATE_INFO_BW_20;
336
break;
337
case ATH12K_BW_40:
338
ret = RATE_INFO_BW_40;
339
break;
340
case ATH12K_BW_80:
341
ret = RATE_INFO_BW_80;
342
break;
343
case ATH12K_BW_160:
344
ret = RATE_INFO_BW_160;
345
break;
346
}
347
348
return ret;
349
}
350
351
enum ath12k_supported_bw ath12k_mac_mac80211_bw_to_ath12k_bw(enum rate_info_bw bw)
352
{
353
switch (bw) {
354
case RATE_INFO_BW_20:
355
return ATH12K_BW_20;
356
case RATE_INFO_BW_40:
357
return ATH12K_BW_40;
358
case RATE_INFO_BW_80:
359
return ATH12K_BW_80;
360
case RATE_INFO_BW_160:
361
return ATH12K_BW_160;
362
default:
363
return ATH12K_BW_20;
364
}
365
}
366
367
int ath12k_mac_hw_ratecode_to_legacy_rate(u8 hw_rc, u8 preamble, u8 *rateidx,
368
u16 *rate)
369
{
370
/* As default, it is OFDM rates */
371
int i = ATH12K_MAC_FIRST_OFDM_RATE_IDX;
372
int max_rates_idx = ath12k_g_rates_size;
373
374
if (preamble == WMI_RATE_PREAMBLE_CCK) {
375
hw_rc &= ~ATH12K_HW_RATECODE_CCK_SHORT_PREAM_MASK;
376
i = 0;
377
max_rates_idx = ATH12K_MAC_FIRST_OFDM_RATE_IDX;
378
}
379
380
while (i < max_rates_idx) {
381
if (hw_rc == ath12k_legacy_rates[i].hw_value) {
382
*rateidx = i;
383
*rate = ath12k_legacy_rates[i].bitrate;
384
return 0;
385
}
386
i++;
387
}
388
389
return -EINVAL;
390
}
391
392
u8 ath12k_mac_bitrate_to_idx(const struct ieee80211_supported_band *sband,
393
u32 bitrate)
394
{
395
int i;
396
397
for (i = 0; i < sband->n_bitrates; i++)
398
if (sband->bitrates[i].bitrate == bitrate)
399
return i;
400
401
return 0;
402
}
403
404
static u32
405
ath12k_mac_max_ht_nss(const u8 *ht_mcs_mask)
406
{
407
int nss;
408
409
for (nss = IEEE80211_HT_MCS_MASK_LEN - 1; nss >= 0; nss--)
410
if (ht_mcs_mask[nss])
411
return nss + 1;
412
413
return 1;
414
}
415
416
static u32
417
ath12k_mac_max_vht_nss(const u16 *vht_mcs_mask)
418
{
419
int nss;
420
421
for (nss = NL80211_VHT_NSS_MAX - 1; nss >= 0; nss--)
422
if (vht_mcs_mask[nss])
423
return nss + 1;
424
425
return 1;
426
}
427
428
static u8 ath12k_parse_mpdudensity(u8 mpdudensity)
429
{
430
/* From IEEE Std 802.11-2020 defined values for "Minimum MPDU Start Spacing":
431
* 0 for no restriction
432
* 1 for 1/4 us
433
* 2 for 1/2 us
434
* 3 for 1 us
435
* 4 for 2 us
436
* 5 for 4 us
437
* 6 for 8 us
438
* 7 for 16 us
439
*/
440
switch (mpdudensity) {
441
case 0:
442
return 0;
443
case 1:
444
case 2:
445
case 3:
446
/* Our lower layer calculations limit our precision to
447
* 1 microsecond
448
*/
449
return 1;
450
case 4:
451
return 2;
452
case 5:
453
return 4;
454
case 6:
455
return 8;
456
case 7:
457
return 16;
458
default:
459
return 0;
460
}
461
}
462
463
static int ath12k_mac_vif_chan(struct ieee80211_vif *vif,
464
struct cfg80211_chan_def *def)
465
{
466
struct ieee80211_chanctx_conf *conf;
467
468
rcu_read_lock();
469
conf = rcu_dereference(vif->bss_conf.chanctx_conf);
470
if (!conf) {
471
rcu_read_unlock();
472
return -ENOENT;
473
}
474
475
*def = conf->def;
476
rcu_read_unlock();
477
478
return 0;
479
}
480
481
static bool ath12k_mac_bitrate_is_cck(int bitrate)
482
{
483
switch (bitrate) {
484
case 10:
485
case 20:
486
case 55:
487
case 110:
488
return true;
489
}
490
491
return false;
492
}
493
494
u8 ath12k_mac_hw_rate_to_idx(const struct ieee80211_supported_band *sband,
495
u8 hw_rate, bool cck)
496
{
497
const struct ieee80211_rate *rate;
498
int i;
499
500
for (i = 0; i < sband->n_bitrates; i++) {
501
rate = &sband->bitrates[i];
502
503
if (ath12k_mac_bitrate_is_cck(rate->bitrate) != cck)
504
continue;
505
506
if (rate->hw_value == hw_rate)
507
return i;
508
else if (rate->flags & IEEE80211_RATE_SHORT_PREAMBLE &&
509
rate->hw_value_short == hw_rate)
510
return i;
511
}
512
513
return 0;
514
}
515
516
static u8 ath12k_mac_bitrate_to_rate(int bitrate)
517
{
518
return DIV_ROUND_UP(bitrate, 5) |
519
(ath12k_mac_bitrate_is_cck(bitrate) ? BIT(7) : 0);
520
}
521
522
static void ath12k_get_arvif_iter(void *data, u8 *mac,
523
struct ieee80211_vif *vif)
524
{
525
struct ath12k_vif_iter *arvif_iter = data;
526
struct ath12k_vif *arvif = (void *)vif->drv_priv;
527
528
if (arvif->vdev_id == arvif_iter->vdev_id)
529
arvif_iter->arvif = arvif;
530
}
531
532
struct ath12k_vif *ath12k_mac_get_arvif(struct ath12k *ar, u32 vdev_id)
533
{
534
struct ath12k_vif_iter arvif_iter = {};
535
u32 flags;
536
537
arvif_iter.vdev_id = vdev_id;
538
539
flags = IEEE80211_IFACE_ITER_RESUME_ALL;
540
ieee80211_iterate_active_interfaces_atomic(ar->hw,
541
flags,
542
ath12k_get_arvif_iter,
543
&arvif_iter);
544
if (!arvif_iter.arvif) {
545
ath12k_warn(ar->ab, "No VIF found for vdev %d\n", vdev_id);
546
return NULL;
547
}
548
549
return arvif_iter.arvif;
550
}
551
552
struct ath12k_vif *ath12k_mac_get_arvif_by_vdev_id(struct ath12k_base *ab,
553
u32 vdev_id)
554
{
555
int i;
556
struct ath12k_pdev *pdev;
557
struct ath12k_vif *arvif;
558
559
for (i = 0; i < ab->num_radios; i++) {
560
pdev = rcu_dereference(ab->pdevs_active[i]);
561
if (pdev && pdev->ar) {
562
arvif = ath12k_mac_get_arvif(pdev->ar, vdev_id);
563
if (arvif)
564
return arvif;
565
}
566
}
567
568
return NULL;
569
}
570
571
struct ath12k *ath12k_mac_get_ar_by_vdev_id(struct ath12k_base *ab, u32 vdev_id)
572
{
573
int i;
574
struct ath12k_pdev *pdev;
575
576
for (i = 0; i < ab->num_radios; i++) {
577
pdev = rcu_dereference(ab->pdevs_active[i]);
578
if (pdev && pdev->ar) {
579
if (pdev->ar->allocated_vdev_map & (1LL << vdev_id))
580
return pdev->ar;
581
}
582
}
583
584
return NULL;
585
}
586
587
struct ath12k *ath12k_mac_get_ar_by_pdev_id(struct ath12k_base *ab, u32 pdev_id)
588
{
589
int i;
590
struct ath12k_pdev *pdev;
591
592
if (ab->hw_params->single_pdev_only) {
593
pdev = rcu_dereference(ab->pdevs_active[0]);
594
return pdev ? pdev->ar : NULL;
595
}
596
597
if (WARN_ON(pdev_id > ab->num_radios))
598
return NULL;
599
600
for (i = 0; i < ab->num_radios; i++) {
601
pdev = rcu_dereference(ab->pdevs_active[i]);
602
603
if (pdev && pdev->pdev_id == pdev_id)
604
return (pdev->ar ? pdev->ar : NULL);
605
}
606
607
return NULL;
608
}
609
610
static void ath12k_pdev_caps_update(struct ath12k *ar)
611
{
612
struct ath12k_base *ab = ar->ab;
613
614
ar->max_tx_power = ab->target_caps.hw_max_tx_power;
615
616
/* FIXME: Set min_tx_power to ab->target_caps.hw_min_tx_power.
617
* But since the received value in svcrdy is same as hw_max_tx_power,
618
* we can set ar->min_tx_power to 0 currently until
619
* this is fixed in firmware
620
*/
621
ar->min_tx_power = 0;
622
623
ar->txpower_limit_2g = ar->max_tx_power;
624
ar->txpower_limit_5g = ar->max_tx_power;
625
ar->txpower_scale = WMI_HOST_TP_SCALE_MAX;
626
}
627
628
static int ath12k_mac_txpower_recalc(struct ath12k *ar)
629
{
630
struct ath12k_pdev *pdev = ar->pdev;
631
struct ath12k_vif *arvif;
632
int ret, txpower = -1;
633
u32 param;
634
635
lockdep_assert_held(&ar->conf_mutex);
636
637
list_for_each_entry(arvif, &ar->arvifs, list) {
638
if (arvif->txpower <= 0)
639
continue;
640
641
if (txpower == -1)
642
txpower = arvif->txpower;
643
else
644
txpower = min(txpower, arvif->txpower);
645
}
646
647
if (txpower == -1)
648
return 0;
649
650
/* txpwr is set as 2 units per dBm in FW*/
651
txpower = min_t(u32, max_t(u32, ar->min_tx_power, txpower),
652
ar->max_tx_power) * 2;
653
654
ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "txpower to set in hw %d\n",
655
txpower / 2);
656
657
if ((pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) &&
658
ar->txpower_limit_2g != txpower) {
659
param = WMI_PDEV_PARAM_TXPOWER_LIMIT2G;
660
ret = ath12k_wmi_pdev_set_param(ar, param,
661
txpower, ar->pdev->pdev_id);
662
if (ret)
663
goto fail;
664
ar->txpower_limit_2g = txpower;
665
}
666
667
if ((pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) &&
668
ar->txpower_limit_5g != txpower) {
669
param = WMI_PDEV_PARAM_TXPOWER_LIMIT5G;
670
ret = ath12k_wmi_pdev_set_param(ar, param,
671
txpower, ar->pdev->pdev_id);
672
if (ret)
673
goto fail;
674
ar->txpower_limit_5g = txpower;
675
}
676
677
return 0;
678
679
fail:
680
ath12k_warn(ar->ab, "failed to recalc txpower limit %d using pdev param %d: %d\n",
681
txpower / 2, param, ret);
682
return ret;
683
}
684
685
static int ath12k_recalc_rtscts_prot(struct ath12k_vif *arvif)
686
{
687
struct ath12k *ar = arvif->ar;
688
u32 vdev_param, rts_cts;
689
int ret;
690
691
lockdep_assert_held(&ar->conf_mutex);
692
693
vdev_param = WMI_VDEV_PARAM_ENABLE_RTSCTS;
694
695
/* Enable RTS/CTS protection for sw retries (when legacy stations
696
* are in BSS) or by default only for second rate series.
697
* TODO: Check if we need to enable CTS 2 Self in any case
698
*/
699
rts_cts = WMI_USE_RTS_CTS;
700
701
if (arvif->num_legacy_stations > 0)
702
rts_cts |= WMI_RTSCTS_ACROSS_SW_RETRIES << 4;
703
else
704
rts_cts |= WMI_RTSCTS_FOR_SECOND_RATESERIES << 4;
705
706
/* Need not send duplicate param value to firmware */
707
if (arvif->rtscts_prot_mode == rts_cts)
708
return 0;
709
710
arvif->rtscts_prot_mode = rts_cts;
711
712
ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %d recalc rts/cts prot %d\n",
713
arvif->vdev_id, rts_cts);
714
715
ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
716
vdev_param, rts_cts);
717
if (ret)
718
ath12k_warn(ar->ab, "failed to recalculate rts/cts prot for vdev %d: %d\n",
719
arvif->vdev_id, ret);
720
721
return ret;
722
}
723
724
static int ath12k_mac_set_kickout(struct ath12k_vif *arvif)
725
{
726
struct ath12k *ar = arvif->ar;
727
u32 param;
728
int ret;
729
730
ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_STA_KICKOUT_TH,
731
ATH12K_KICKOUT_THRESHOLD,
732
ar->pdev->pdev_id);
733
if (ret) {
734
ath12k_warn(ar->ab, "failed to set kickout threshold on vdev %i: %d\n",
735
arvif->vdev_id, ret);
736
return ret;
737
}
738
739
param = WMI_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS;
740
ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param,
741
ATH12K_KEEPALIVE_MIN_IDLE);
742
if (ret) {
743
ath12k_warn(ar->ab, "failed to set keepalive minimum idle time on vdev %i: %d\n",
744
arvif->vdev_id, ret);
745
return ret;
746
}
747
748
param = WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS;
749
ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param,
750
ATH12K_KEEPALIVE_MAX_IDLE);
751
if (ret) {
752
ath12k_warn(ar->ab, "failed to set keepalive maximum idle time on vdev %i: %d\n",
753
arvif->vdev_id, ret);
754
return ret;
755
}
756
757
param = WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS;
758
ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param,
759
ATH12K_KEEPALIVE_MAX_UNRESPONSIVE);
760
if (ret) {
761
ath12k_warn(ar->ab, "failed to set keepalive maximum unresponsive time on vdev %i: %d\n",
762
arvif->vdev_id, ret);
763
return ret;
764
}
765
766
return 0;
767
}
768
769
void ath12k_mac_peer_cleanup_all(struct ath12k *ar)
770
{
771
struct ath12k_peer *peer, *tmp;
772
struct ath12k_base *ab = ar->ab;
773
774
lockdep_assert_held(&ar->conf_mutex);
775
776
spin_lock_bh(&ab->base_lock);
777
list_for_each_entry_safe(peer, tmp, &ab->peers, list) {
778
ath12k_dp_rx_peer_tid_cleanup(ar, peer);
779
list_del(&peer->list);
780
kfree(peer);
781
}
782
spin_unlock_bh(&ab->base_lock);
783
784
ar->num_peers = 0;
785
ar->num_stations = 0;
786
}
787
788
static int ath12k_mac_vdev_setup_sync(struct ath12k *ar)
789
{
790
lockdep_assert_held(&ar->conf_mutex);
791
792
if (test_bit(ATH12K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags))
793
return -ESHUTDOWN;
794
795
ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "vdev setup timeout %d\n",
796
ATH12K_VDEV_SETUP_TIMEOUT_HZ);
797
798
if (!wait_for_completion_timeout(&ar->vdev_setup_done,
799
ATH12K_VDEV_SETUP_TIMEOUT_HZ))
800
return -ETIMEDOUT;
801
802
return ar->last_wmi_vdev_start_status ? -EINVAL : 0;
803
}
804
805
static int ath12k_monitor_vdev_up(struct ath12k *ar, int vdev_id)
806
{
807
int ret;
808
809
ret = ath12k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr);
810
if (ret) {
811
ath12k_warn(ar->ab, "failed to put up monitor vdev %i: %d\n",
812
vdev_id, ret);
813
return ret;
814
}
815
816
ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %i started\n",
817
vdev_id);
818
return 0;
819
}
820
821
static int ath12k_mac_monitor_vdev_start(struct ath12k *ar, int vdev_id,
822
struct cfg80211_chan_def *chandef)
823
{
824
struct ieee80211_channel *channel;
825
struct wmi_vdev_start_req_arg arg = {};
826
int ret;
827
828
lockdep_assert_held(&ar->conf_mutex);
829
830
channel = chandef->chan;
831
arg.vdev_id = vdev_id;
832
arg.freq = channel->center_freq;
833
arg.band_center_freq1 = chandef->center_freq1;
834
arg.band_center_freq2 = chandef->center_freq2;
835
arg.mode = ath12k_phymodes[chandef->chan->band][chandef->width];
836
arg.chan_radar = !!(channel->flags & IEEE80211_CHAN_RADAR);
837
838
arg.min_power = 0;
839
arg.max_power = channel->max_power;
840
arg.max_reg_power = channel->max_reg_power;
841
arg.max_antenna_gain = channel->max_antenna_gain;
842
843
arg.pref_tx_streams = ar->num_tx_chains;
844
arg.pref_rx_streams = ar->num_rx_chains;
845
arg.punct_bitmap = 0xFFFFFFFF;
846
847
arg.passive |= !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR);
848
849
reinit_completion(&ar->vdev_setup_done);
850
reinit_completion(&ar->vdev_delete_done);
851
852
ret = ath12k_wmi_vdev_start(ar, &arg, false);
853
if (ret) {
854
ath12k_warn(ar->ab, "failed to request monitor vdev %i start: %d\n",
855
vdev_id, ret);
856
return ret;
857
}
858
859
ret = ath12k_mac_vdev_setup_sync(ar);
860
if (ret) {
861
ath12k_warn(ar->ab, "failed to synchronize setup for monitor vdev %i start: %d\n",
862
vdev_id, ret);
863
return ret;
864
}
865
866
ret = ath12k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr);
867
if (ret) {
868
ath12k_warn(ar->ab, "failed to put up monitor vdev %i: %d\n",
869
vdev_id, ret);
870
goto vdev_stop;
871
}
872
873
ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %i started\n",
874
vdev_id);
875
return 0;
876
877
vdev_stop:
878
ret = ath12k_wmi_vdev_stop(ar, vdev_id);
879
if (ret)
880
ath12k_warn(ar->ab, "failed to stop monitor vdev %i after start failure: %d\n",
881
vdev_id, ret);
882
return ret;
883
}
884
885
static int ath12k_mac_monitor_vdev_stop(struct ath12k *ar)
886
{
887
int ret;
888
889
lockdep_assert_held(&ar->conf_mutex);
890
891
reinit_completion(&ar->vdev_setup_done);
892
893
ret = ath12k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
894
if (ret)
895
ath12k_warn(ar->ab, "failed to request monitor vdev %i stop: %d\n",
896
ar->monitor_vdev_id, ret);
897
898
ret = ath12k_mac_vdev_setup_sync(ar);
899
if (ret)
900
ath12k_warn(ar->ab, "failed to synchronize monitor vdev %i stop: %d\n",
901
ar->monitor_vdev_id, ret);
902
903
ret = ath12k_wmi_vdev_down(ar, ar->monitor_vdev_id);
904
if (ret)
905
ath12k_warn(ar->ab, "failed to put down monitor vdev %i: %d\n",
906
ar->monitor_vdev_id, ret);
907
908
ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %i stopped\n",
909
ar->monitor_vdev_id);
910
return ret;
911
}
912
913
static int ath12k_mac_monitor_vdev_create(struct ath12k *ar)
914
{
915
struct ath12k_pdev *pdev = ar->pdev;
916
struct ath12k_wmi_vdev_create_arg arg = {};
917
int bit, ret;
918
u8 tmp_addr[6];
919
u16 nss;
920
921
lockdep_assert_held(&ar->conf_mutex);
922
923
if (ar->monitor_vdev_created)
924
return 0;
925
926
if (ar->ab->free_vdev_map == 0) {
927
ath12k_warn(ar->ab, "failed to find free vdev id for monitor vdev\n");
928
return -ENOMEM;
929
}
930
931
bit = __ffs64(ar->ab->free_vdev_map);
932
933
ar->monitor_vdev_id = bit;
934
935
arg.if_id = ar->monitor_vdev_id;
936
arg.type = WMI_VDEV_TYPE_MONITOR;
937
arg.subtype = WMI_VDEV_SUBTYPE_NONE;
938
arg.pdev_id = pdev->pdev_id;
939
arg.if_stats_id = ATH12K_INVAL_VDEV_STATS_ID;
940
941
if (pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) {
942
arg.chains[NL80211_BAND_2GHZ].tx = ar->num_tx_chains;
943
arg.chains[NL80211_BAND_2GHZ].rx = ar->num_rx_chains;
944
}
945
946
if (pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) {
947
arg.chains[NL80211_BAND_5GHZ].tx = ar->num_tx_chains;
948
arg.chains[NL80211_BAND_5GHZ].rx = ar->num_rx_chains;
949
}
950
951
ret = ath12k_wmi_vdev_create(ar, tmp_addr, &arg);
952
if (ret) {
953
ath12k_warn(ar->ab, "failed to request monitor vdev %i creation: %d\n",
954
ar->monitor_vdev_id, ret);
955
ar->monitor_vdev_id = -1;
956
return ret;
957
}
958
959
nss = hweight32(ar->cfg_tx_chainmask) ? : 1;
960
ret = ath12k_wmi_vdev_set_param_cmd(ar, ar->monitor_vdev_id,
961
WMI_VDEV_PARAM_NSS, nss);
962
if (ret) {
963
ath12k_warn(ar->ab, "failed to set vdev %d chainmask 0x%x, nss %d :%d\n",
964
ar->monitor_vdev_id, ar->cfg_tx_chainmask, nss, ret);
965
return ret;
966
}
967
968
ret = ath12k_mac_txpower_recalc(ar);
969
if (ret)
970
return ret;
971
972
ar->allocated_vdev_map |= 1LL << ar->monitor_vdev_id;
973
ar->ab->free_vdev_map &= ~(1LL << ar->monitor_vdev_id);
974
ar->num_created_vdevs++;
975
ar->monitor_vdev_created = true;
976
ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %d created\n",
977
ar->monitor_vdev_id);
978
979
return 0;
980
}
981
982
static int ath12k_mac_monitor_vdev_delete(struct ath12k *ar)
983
{
984
int ret;
985
unsigned long time_left;
986
987
lockdep_assert_held(&ar->conf_mutex);
988
989
if (!ar->monitor_vdev_created)
990
return 0;
991
992
reinit_completion(&ar->vdev_delete_done);
993
994
ret = ath12k_wmi_vdev_delete(ar, ar->monitor_vdev_id);
995
if (ret) {
996
ath12k_warn(ar->ab, "failed to request wmi monitor vdev %i removal: %d\n",
997
ar->monitor_vdev_id, ret);
998
return ret;
999
}
1000
1001
time_left = wait_for_completion_timeout(&ar->vdev_delete_done,
1002
ATH12K_VDEV_DELETE_TIMEOUT_HZ);
1003
if (time_left == 0) {
1004
ath12k_warn(ar->ab, "Timeout in receiving vdev delete response\n");
1005
} else {
1006
ar->allocated_vdev_map &= ~(1LL << ar->monitor_vdev_id);
1007
ar->ab->free_vdev_map |= 1LL << (ar->monitor_vdev_id);
1008
ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %d deleted\n",
1009
ar->monitor_vdev_id);
1010
ar->num_created_vdevs--;
1011
ar->monitor_vdev_id = -1;
1012
ar->monitor_vdev_created = false;
1013
}
1014
1015
return ret;
1016
}
1017
1018
static void
1019
ath12k_mac_get_any_chandef_iter(struct ieee80211_hw *hw,
1020
struct ieee80211_chanctx_conf *conf,
1021
void *data)
1022
{
1023
struct cfg80211_chan_def **def = data;
1024
1025
*def = &conf->def;
1026
}
1027
1028
static int ath12k_mac_monitor_start(struct ath12k *ar)
1029
{
1030
struct cfg80211_chan_def *chandef = NULL;
1031
int ret;
1032
1033
lockdep_assert_held(&ar->conf_mutex);
1034
1035
if (ar->monitor_started)
1036
return 0;
1037
1038
ieee80211_iter_chan_contexts_atomic(ar->hw,
1039
ath12k_mac_get_any_chandef_iter,
1040
&chandef);
1041
if (!chandef)
1042
return 0;
1043
1044
ret = ath12k_mac_monitor_vdev_start(ar, ar->monitor_vdev_id, chandef);
1045
if (ret) {
1046
ath12k_warn(ar->ab, "failed to start monitor vdev: %d\n", ret);
1047
ath12k_mac_monitor_vdev_delete(ar);
1048
return ret;
1049
}
1050
1051
ar->monitor_started = true;
1052
ar->num_started_vdevs++;
1053
ret = ath12k_dp_tx_htt_monitor_mode_ring_config(ar, false);
1054
ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor started ret %d\n", ret);
1055
1056
return ret;
1057
}
1058
1059
static int ath12k_mac_monitor_stop(struct ath12k *ar)
1060
{
1061
int ret;
1062
1063
lockdep_assert_held(&ar->conf_mutex);
1064
1065
if (!ar->monitor_started)
1066
return 0;
1067
1068
ret = ath12k_mac_monitor_vdev_stop(ar);
1069
if (ret) {
1070
ath12k_warn(ar->ab, "failed to stop monitor vdev: %d\n", ret);
1071
return ret;
1072
}
1073
1074
ar->monitor_started = false;
1075
ar->num_started_vdevs--;
1076
ret = ath12k_dp_tx_htt_monitor_mode_ring_config(ar, true);
1077
ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor stopped ret %d\n", ret);
1078
return ret;
1079
}
1080
1081
static int ath12k_mac_op_config(struct ieee80211_hw *hw, u32 changed)
1082
{
1083
struct ath12k *ar = hw->priv;
1084
struct ieee80211_conf *conf = &hw->conf;
1085
int ret = 0;
1086
1087
mutex_lock(&ar->conf_mutex);
1088
1089
if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
1090
ar->monitor_conf_enabled = conf->flags & IEEE80211_CONF_MONITOR;
1091
if (ar->monitor_conf_enabled) {
1092
if (ar->monitor_vdev_created)
1093
goto exit;
1094
ret = ath12k_mac_monitor_vdev_create(ar);
1095
if (ret)
1096
goto exit;
1097
ret = ath12k_mac_monitor_start(ar);
1098
if (ret)
1099
goto err_mon_del;
1100
} else {
1101
if (!ar->monitor_vdev_created)
1102
goto exit;
1103
ret = ath12k_mac_monitor_stop(ar);
1104
if (ret)
1105
goto exit;
1106
ath12k_mac_monitor_vdev_delete(ar);
1107
}
1108
}
1109
1110
exit:
1111
mutex_unlock(&ar->conf_mutex);
1112
return ret;
1113
1114
err_mon_del:
1115
ath12k_mac_monitor_vdev_delete(ar);
1116
mutex_unlock(&ar->conf_mutex);
1117
return ret;
1118
}
1119
1120
static int ath12k_mac_setup_bcn_tmpl(struct ath12k_vif *arvif)
1121
{
1122
struct ath12k *ar = arvif->ar;
1123
struct ath12k_base *ab = ar->ab;
1124
struct ieee80211_hw *hw = ar->hw;
1125
struct ieee80211_vif *vif = arvif->vif;
1126
struct ieee80211_mutable_offsets offs = {};
1127
struct sk_buff *bcn;
1128
struct ieee80211_mgmt *mgmt;
1129
u8 *ies;
1130
int ret;
1131
1132
if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
1133
return 0;
1134
1135
bcn = ieee80211_beacon_get_template(hw, vif, &offs, 0);
1136
if (!bcn) {
1137
ath12k_warn(ab, "failed to get beacon template from mac80211\n");
1138
return -EPERM;
1139
}
1140
1141
ies = bcn->data + ieee80211_get_hdrlen_from_skb(bcn);
1142
ies += sizeof(mgmt->u.beacon);
1143
1144
if (cfg80211_find_ie(WLAN_EID_RSN, ies, (skb_tail_pointer(bcn) - ies)))
1145
arvif->rsnie_present = true;
1146
1147
if (cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
1148
WLAN_OUI_TYPE_MICROSOFT_WPA,
1149
ies, (skb_tail_pointer(bcn) - ies)))
1150
arvif->wpaie_present = true;
1151
1152
ret = ath12k_wmi_bcn_tmpl(ar, arvif->vdev_id, &offs, bcn);
1153
1154
kfree_skb(bcn);
1155
1156
if (ret)
1157
ath12k_warn(ab, "failed to submit beacon template command: %d\n",
1158
ret);
1159
1160
return ret;
1161
}
1162
1163
static void ath12k_control_beaconing(struct ath12k_vif *arvif,
1164
struct ieee80211_bss_conf *info)
1165
{
1166
struct ath12k *ar = arvif->ar;
1167
int ret;
1168
1169
lockdep_assert_held(&arvif->ar->conf_mutex);
1170
1171
if (!info->enable_beacon) {
1172
ret = ath12k_wmi_vdev_down(ar, arvif->vdev_id);
1173
if (ret)
1174
ath12k_warn(ar->ab, "failed to down vdev_id %i: %d\n",
1175
arvif->vdev_id, ret);
1176
1177
arvif->is_up = false;
1178
return;
1179
}
1180
1181
/* Install the beacon template to the FW */
1182
ret = ath12k_mac_setup_bcn_tmpl(arvif);
1183
if (ret) {
1184
ath12k_warn(ar->ab, "failed to update bcn tmpl during vdev up: %d\n",
1185
ret);
1186
return;
1187
}
1188
1189
arvif->aid = 0;
1190
1191
ether_addr_copy(arvif->bssid, info->bssid);
1192
1193
ret = ath12k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
1194
arvif->bssid);
1195
if (ret) {
1196
ath12k_warn(ar->ab, "failed to bring up vdev %d: %i\n",
1197
arvif->vdev_id, ret);
1198
return;
1199
}
1200
1201
arvif->is_up = true;
1202
1203
ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %d up\n", arvif->vdev_id);
1204
}
1205
1206
static void ath12k_peer_assoc_h_basic(struct ath12k *ar,
1207
struct ieee80211_vif *vif,
1208
struct ieee80211_sta *sta,
1209
struct ath12k_wmi_peer_assoc_arg *arg)
1210
{
1211
struct ath12k_vif *arvif = (void *)vif->drv_priv;
1212
u32 aid;
1213
1214
lockdep_assert_held(&ar->conf_mutex);
1215
1216
if (vif->type == NL80211_IFTYPE_STATION)
1217
aid = vif->cfg.aid;
1218
else
1219
aid = sta->aid;
1220
1221
ether_addr_copy(arg->peer_mac, sta->addr);
1222
arg->vdev_id = arvif->vdev_id;
1223
arg->peer_associd = aid;
1224
arg->auth_flag = true;
1225
/* TODO: STA WAR in ath10k for listen interval required? */
1226
arg->peer_listen_intval = ar->hw->conf.listen_interval;
1227
arg->peer_nss = 1;
1228
arg->peer_caps = vif->bss_conf.assoc_capability;
1229
}
1230
1231
static void ath12k_peer_assoc_h_crypto(struct ath12k *ar,
1232
struct ieee80211_vif *vif,
1233
struct ieee80211_sta *sta,
1234
struct ath12k_wmi_peer_assoc_arg *arg)
1235
{
1236
struct ieee80211_bss_conf *info = &vif->bss_conf;
1237
struct cfg80211_chan_def def;
1238
struct cfg80211_bss *bss;
1239
struct ath12k_vif *arvif = (struct ath12k_vif *)vif->drv_priv;
1240
const u8 *rsnie = NULL;
1241
const u8 *wpaie = NULL;
1242
1243
lockdep_assert_held(&ar->conf_mutex);
1244
1245
if (WARN_ON(ath12k_mac_vif_chan(vif, &def)))
1246
return;
1247
1248
bss = cfg80211_get_bss(ar->hw->wiphy, def.chan, info->bssid, NULL, 0,
1249
IEEE80211_BSS_TYPE_ANY, IEEE80211_PRIVACY_ANY);
1250
1251
if (arvif->rsnie_present || arvif->wpaie_present) {
1252
arg->need_ptk_4_way = true;
1253
if (arvif->wpaie_present)
1254
arg->need_gtk_2_way = true;
1255
} else if (bss) {
1256
const struct cfg80211_bss_ies *ies;
1257
1258
rcu_read_lock();
1259
rsnie = ieee80211_bss_get_ie(bss, WLAN_EID_RSN);
1260
1261
ies = rcu_dereference(bss->ies);
1262
1263
wpaie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
1264
WLAN_OUI_TYPE_MICROSOFT_WPA,
1265
ies->data,
1266
ies->len);
1267
rcu_read_unlock();
1268
cfg80211_put_bss(ar->hw->wiphy, bss);
1269
}
1270
1271
/* FIXME: base on RSN IE/WPA IE is a correct idea? */
1272
if (rsnie || wpaie) {
1273
ath12k_dbg(ar->ab, ATH12K_DBG_WMI,
1274
"%s: rsn ie found\n", __func__);
1275
arg->need_ptk_4_way = true;
1276
}
1277
1278
if (wpaie) {
1279
ath12k_dbg(ar->ab, ATH12K_DBG_WMI,
1280
"%s: wpa ie found\n", __func__);
1281
arg->need_gtk_2_way = true;
1282
}
1283
1284
if (sta->mfp) {
1285
/* TODO: Need to check if FW supports PMF? */
1286
arg->is_pmf_enabled = true;
1287
}
1288
1289
/* TODO: safe_mode_enabled (bypass 4-way handshake) flag req? */
1290
}
1291
1292
static void ath12k_peer_assoc_h_rates(struct ath12k *ar,
1293
struct ieee80211_vif *vif,
1294
struct ieee80211_sta *sta,
1295
struct ath12k_wmi_peer_assoc_arg *arg)
1296
{
1297
struct ath12k_vif *arvif = (void *)vif->drv_priv;
1298
struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates;
1299
struct cfg80211_chan_def def;
1300
const struct ieee80211_supported_band *sband;
1301
const struct ieee80211_rate *rates;
1302
enum nl80211_band band;
1303
u32 ratemask;
1304
u8 rate;
1305
int i;
1306
1307
lockdep_assert_held(&ar->conf_mutex);
1308
1309
if (WARN_ON(ath12k_mac_vif_chan(vif, &def)))
1310
return;
1311
1312
band = def.chan->band;
1313
sband = ar->hw->wiphy->bands[band];
1314
ratemask = sta->deflink.supp_rates[band];
1315
ratemask &= arvif->bitrate_mask.control[band].legacy;
1316
rates = sband->bitrates;
1317
1318
rateset->num_rates = 0;
1319
1320
for (i = 0; i < 32; i++, ratemask >>= 1, rates++) {
1321
if (!(ratemask & 1))
1322
continue;
1323
1324
rate = ath12k_mac_bitrate_to_rate(rates->bitrate);
1325
rateset->rates[rateset->num_rates] = rate;
1326
rateset->num_rates++;
1327
}
1328
}
1329
1330
static bool
1331
ath12k_peer_assoc_h_ht_masked(const u8 *ht_mcs_mask)
1332
{
1333
int nss;
1334
1335
for (nss = 0; nss < IEEE80211_HT_MCS_MASK_LEN; nss++)
1336
if (ht_mcs_mask[nss])
1337
return false;
1338
1339
return true;
1340
}
1341
1342
static bool
1343
ath12k_peer_assoc_h_vht_masked(const u16 *vht_mcs_mask)
1344
{
1345
int nss;
1346
1347
for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++)
1348
if (vht_mcs_mask[nss])
1349
return false;
1350
1351
return true;
1352
}
1353
1354
static void ath12k_peer_assoc_h_ht(struct ath12k *ar,
1355
struct ieee80211_vif *vif,
1356
struct ieee80211_sta *sta,
1357
struct ath12k_wmi_peer_assoc_arg *arg)
1358
{
1359
const struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
1360
struct ath12k_vif *arvif = (void *)vif->drv_priv;
1361
struct cfg80211_chan_def def;
1362
enum nl80211_band band;
1363
const u8 *ht_mcs_mask;
1364
int i, n;
1365
u8 max_nss;
1366
u32 stbc;
1367
1368
lockdep_assert_held(&ar->conf_mutex);
1369
1370
if (WARN_ON(ath12k_mac_vif_chan(vif, &def)))
1371
return;
1372
1373
if (!ht_cap->ht_supported)
1374
return;
1375
1376
band = def.chan->band;
1377
ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
1378
1379
if (ath12k_peer_assoc_h_ht_masked(ht_mcs_mask))
1380
return;
1381
1382
arg->ht_flag = true;
1383
1384
arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
1385
ht_cap->ampdu_factor)) - 1;
1386
1387
arg->peer_mpdu_density =
1388
ath12k_parse_mpdudensity(ht_cap->ampdu_density);
1389
1390
arg->peer_ht_caps = ht_cap->cap;
1391
arg->peer_rate_caps |= WMI_HOST_RC_HT_FLAG;
1392
1393
if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING)
1394
arg->ldpc_flag = true;
1395
1396
if (sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40) {
1397
arg->bw_40 = true;
1398
arg->peer_rate_caps |= WMI_HOST_RC_CW40_FLAG;
1399
}
1400
1401
if (arvif->bitrate_mask.control[band].gi != NL80211_TXRATE_FORCE_LGI) {
1402
if (ht_cap->cap & (IEEE80211_HT_CAP_SGI_20 |
1403
IEEE80211_HT_CAP_SGI_40))
1404
arg->peer_rate_caps |= WMI_HOST_RC_SGI_FLAG;
1405
}
1406
1407
if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) {
1408
arg->peer_rate_caps |= WMI_HOST_RC_TX_STBC_FLAG;
1409
arg->stbc_flag = true;
1410
}
1411
1412
if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) {
1413
stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC;
1414
stbc = stbc >> IEEE80211_HT_CAP_RX_STBC_SHIFT;
1415
stbc = stbc << WMI_HOST_RC_RX_STBC_FLAG_S;
1416
arg->peer_rate_caps |= stbc;
1417
arg->stbc_flag = true;
1418
}
1419
1420
if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2])
1421
arg->peer_rate_caps |= WMI_HOST_RC_TS_FLAG;
1422
else if (ht_cap->mcs.rx_mask[1])
1423
arg->peer_rate_caps |= WMI_HOST_RC_DS_FLAG;
1424
1425
for (i = 0, n = 0, max_nss = 0; i < IEEE80211_HT_MCS_MASK_LEN * 8; i++)
1426
if ((ht_cap->mcs.rx_mask[i / 8] & BIT(i % 8)) &&
1427
(ht_mcs_mask[i / 8] & BIT(i % 8))) {
1428
max_nss = (i / 8) + 1;
1429
arg->peer_ht_rates.rates[n++] = i;
1430
}
1431
1432
/* This is a workaround for HT-enabled STAs which break the spec
1433
* and have no HT capabilities RX mask (no HT RX MCS map).
1434
*
1435
* As per spec, in section 20.3.5 Modulation and coding scheme (MCS),
1436
* MCS 0 through 7 are mandatory in 20MHz with 800 ns GI at all STAs.
1437
*
1438
* Firmware asserts if such situation occurs.
1439
*/
1440
if (n == 0) {
1441
arg->peer_ht_rates.num_rates = 8;
1442
for (i = 0; i < arg->peer_ht_rates.num_rates; i++)
1443
arg->peer_ht_rates.rates[i] = i;
1444
} else {
1445
arg->peer_ht_rates.num_rates = n;
1446
arg->peer_nss = min(sta->deflink.rx_nss, max_nss);
1447
}
1448
1449
ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n",
1450
arg->peer_mac,
1451
arg->peer_ht_rates.num_rates,
1452
arg->peer_nss);
1453
}
1454
1455
static int ath12k_mac_get_max_vht_mcs_map(u16 mcs_map, int nss)
1456
{
1457
switch ((mcs_map >> (2 * nss)) & 0x3) {
1458
case IEEE80211_VHT_MCS_SUPPORT_0_7: return BIT(8) - 1;
1459
case IEEE80211_VHT_MCS_SUPPORT_0_8: return BIT(9) - 1;
1460
case IEEE80211_VHT_MCS_SUPPORT_0_9: return BIT(10) - 1;
1461
}
1462
return 0;
1463
}
1464
1465
static u16
1466
ath12k_peer_assoc_h_vht_limit(u16 tx_mcs_set,
1467
const u16 vht_mcs_limit[NL80211_VHT_NSS_MAX])
1468
{
1469
int idx_limit;
1470
int nss;
1471
u16 mcs_map;
1472
u16 mcs;
1473
1474
for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) {
1475
mcs_map = ath12k_mac_get_max_vht_mcs_map(tx_mcs_set, nss) &
1476
vht_mcs_limit[nss];
1477
1478
if (mcs_map)
1479
idx_limit = fls(mcs_map) - 1;
1480
else
1481
idx_limit = -1;
1482
1483
switch (idx_limit) {
1484
case 0:
1485
case 1:
1486
case 2:
1487
case 3:
1488
case 4:
1489
case 5:
1490
case 6:
1491
case 7:
1492
mcs = IEEE80211_VHT_MCS_SUPPORT_0_7;
1493
break;
1494
case 8:
1495
mcs = IEEE80211_VHT_MCS_SUPPORT_0_8;
1496
break;
1497
case 9:
1498
mcs = IEEE80211_VHT_MCS_SUPPORT_0_9;
1499
break;
1500
default:
1501
WARN_ON(1);
1502
fallthrough;
1503
case -1:
1504
mcs = IEEE80211_VHT_MCS_NOT_SUPPORTED;
1505
break;
1506
}
1507
1508
tx_mcs_set &= ~(0x3 << (nss * 2));
1509
tx_mcs_set |= mcs << (nss * 2);
1510
}
1511
1512
return tx_mcs_set;
1513
}
1514
1515
static void ath12k_peer_assoc_h_vht(struct ath12k *ar,
1516
struct ieee80211_vif *vif,
1517
struct ieee80211_sta *sta,
1518
struct ath12k_wmi_peer_assoc_arg *arg)
1519
{
1520
const struct ieee80211_sta_vht_cap *vht_cap = &sta->deflink.vht_cap;
1521
struct ath12k_vif *arvif = (void *)vif->drv_priv;
1522
struct cfg80211_chan_def def;
1523
enum nl80211_band band;
1524
const u16 *vht_mcs_mask;
1525
u16 tx_mcs_map;
1526
u8 ampdu_factor;
1527
u8 max_nss, vht_mcs;
1528
int i;
1529
1530
if (WARN_ON(ath12k_mac_vif_chan(vif, &def)))
1531
return;
1532
1533
if (!vht_cap->vht_supported)
1534
return;
1535
1536
band = def.chan->band;
1537
vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
1538
1539
if (ath12k_peer_assoc_h_vht_masked(vht_mcs_mask))
1540
return;
1541
1542
arg->vht_flag = true;
1543
1544
/* TODO: similar flags required? */
1545
arg->vht_capable = true;
1546
1547
if (def.chan->band == NL80211_BAND_2GHZ)
1548
arg->vht_ng_flag = true;
1549
1550
arg->peer_vht_caps = vht_cap->cap;
1551
1552
ampdu_factor = (vht_cap->cap &
1553
IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >>
1554
IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
1555
1556
/* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to
1557
* zero in VHT IE. Using it would result in degraded throughput.
1558
* arg->peer_max_mpdu at this point contains HT max_mpdu so keep
1559
* it if VHT max_mpdu is smaller.
1560
*/
1561
arg->peer_max_mpdu = max(arg->peer_max_mpdu,
1562
(1U << (IEEE80211_HT_MAX_AMPDU_FACTOR +
1563
ampdu_factor)) - 1);
1564
1565
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
1566
arg->bw_80 = true;
1567
1568
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160)
1569
arg->bw_160 = true;
1570
1571
/* Calculate peer NSS capability from VHT capabilities if STA
1572
* supports VHT.
1573
*/
1574
for (i = 0, max_nss = 0, vht_mcs = 0; i < NL80211_VHT_NSS_MAX; i++) {
1575
vht_mcs = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map) >>
1576
(2 * i) & 3;
1577
1578
if (vht_mcs != IEEE80211_VHT_MCS_NOT_SUPPORTED &&
1579
vht_mcs_mask[i])
1580
max_nss = i + 1;
1581
}
1582
arg->peer_nss = min(sta->deflink.rx_nss, max_nss);
1583
arg->rx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.rx_highest);
1584
arg->rx_mcs_set = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map);
1585
arg->tx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.tx_highest);
1586
1587
tx_mcs_map = __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map);
1588
arg->tx_mcs_set = ath12k_peer_assoc_h_vht_limit(tx_mcs_map, vht_mcs_mask);
1589
1590
/* In QCN9274 platform, VHT MCS rate 10 and 11 is enabled by default.
1591
* VHT MCS rate 10 and 11 is not supported in 11ac standard.
1592
* so explicitly disable the VHT MCS rate 10 and 11 in 11ac mode.
1593
*/
1594
arg->tx_mcs_set &= ~IEEE80211_VHT_MCS_SUPPORT_0_11_MASK;
1595
arg->tx_mcs_set |= IEEE80211_DISABLE_VHT_MCS_SUPPORT_0_11;
1596
1597
if ((arg->tx_mcs_set & IEEE80211_VHT_MCS_NOT_SUPPORTED) ==
1598
IEEE80211_VHT_MCS_NOT_SUPPORTED)
1599
arg->peer_vht_caps &= ~IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE;
1600
1601
/* TODO: Check */
1602
arg->tx_max_mcs_nss = 0xFF;
1603
1604
ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vht peer %pM max_mpdu %d flags 0x%x\n",
1605
sta->addr, arg->peer_max_mpdu, arg->peer_flags);
1606
1607
/* TODO: rxnss_override */
1608
}
1609
1610
static void ath12k_peer_assoc_h_he(struct ath12k *ar,
1611
struct ieee80211_vif *vif,
1612
struct ieee80211_sta *sta,
1613
struct ath12k_wmi_peer_assoc_arg *arg)
1614
{
1615
const struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap;
1616
int i;
1617
u8 ampdu_factor, rx_mcs_80, rx_mcs_160, max_nss;
1618
u16 mcs_160_map, mcs_80_map;
1619
bool support_160;
1620
u16 v;
1621
1622
if (!he_cap->has_he)
1623
return;
1624
1625
arg->he_flag = true;
1626
1627
support_160 = !!(he_cap->he_cap_elem.phy_cap_info[0] &
1628
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G);
1629
1630
/* Supported HE-MCS and NSS Set of peer he_cap is intersection with self he_cp */
1631
mcs_160_map = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160);
1632
mcs_80_map = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80);
1633
1634
if (support_160) {
1635
for (i = 7; i >= 0; i--) {
1636
u8 mcs_160 = (mcs_160_map >> (2 * i)) & 3;
1637
1638
if (mcs_160 != IEEE80211_HE_MCS_NOT_SUPPORTED) {
1639
rx_mcs_160 = i + 1;
1640
break;
1641
}
1642
}
1643
}
1644
1645
for (i = 7; i >= 0; i--) {
1646
u8 mcs_80 = (mcs_80_map >> (2 * i)) & 3;
1647
1648
if (mcs_80 != IEEE80211_HE_MCS_NOT_SUPPORTED) {
1649
rx_mcs_80 = i + 1;
1650
break;
1651
}
1652
}
1653
1654
if (support_160)
1655
max_nss = min(rx_mcs_80, rx_mcs_160);
1656
else
1657
max_nss = rx_mcs_80;
1658
1659
arg->peer_nss = min(sta->deflink.rx_nss, max_nss);
1660
1661
memcpy(&arg->peer_he_cap_macinfo, he_cap->he_cap_elem.mac_cap_info,
1662
sizeof(he_cap->he_cap_elem.mac_cap_info));
1663
memcpy(&arg->peer_he_cap_phyinfo, he_cap->he_cap_elem.phy_cap_info,
1664
sizeof(he_cap->he_cap_elem.phy_cap_info));
1665
arg->peer_he_ops = vif->bss_conf.he_oper.params;
1666
1667
/* the top most byte is used to indicate BSS color info */
1668
arg->peer_he_ops &= 0xffffff;
1669
1670
/* As per section 26.6.1 IEEE Std 802.11ax‐2022, if the Max AMPDU
1671
* Exponent Extension in HE cap is zero, use the arg->peer_max_mpdu
1672
* as calculated while parsing VHT caps(if VHT caps is present)
1673
* or HT caps (if VHT caps is not present).
1674
*
1675
* For non-zero value of Max AMPDU Exponent Extension in HE MAC caps,
1676
* if a HE STA sends VHT cap and HE cap IE in assoc request then, use
1677
* MAX_AMPDU_LEN_FACTOR as 20 to calculate max_ampdu length.
1678
* If a HE STA that does not send VHT cap, but HE and HT cap in assoc
1679
* request, then use MAX_AMPDU_LEN_FACTOR as 16 to calculate max_ampdu
1680
* length.
1681
*/
1682
ampdu_factor = (he_cap->he_cap_elem.mac_cap_info[3] &
1683
IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK) >>
1684
IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK;
1685
1686
if (ampdu_factor) {
1687
if (sta->deflink.vht_cap.vht_supported)
1688
arg->peer_max_mpdu = (1 << (IEEE80211_HE_VHT_MAX_AMPDU_FACTOR +
1689
ampdu_factor)) - 1;
1690
else if (sta->deflink.ht_cap.ht_supported)
1691
arg->peer_max_mpdu = (1 << (IEEE80211_HE_HT_MAX_AMPDU_FACTOR +
1692
ampdu_factor)) - 1;
1693
}
1694
1695
if (he_cap->he_cap_elem.phy_cap_info[6] &
1696
IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT) {
1697
int bit = 7;
1698
int nss, ru;
1699
1700
arg->peer_ppet.numss_m1 = he_cap->ppe_thres[0] &
1701
IEEE80211_PPE_THRES_NSS_MASK;
1702
arg->peer_ppet.ru_bit_mask =
1703
(he_cap->ppe_thres[0] &
1704
IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK) >>
1705
IEEE80211_PPE_THRES_RU_INDEX_BITMASK_POS;
1706
1707
for (nss = 0; nss <= arg->peer_ppet.numss_m1; nss++) {
1708
for (ru = 0; ru < 4; ru++) {
1709
u32 val = 0;
1710
int i;
1711
1712
if ((arg->peer_ppet.ru_bit_mask & BIT(ru)) == 0)
1713
continue;
1714
for (i = 0; i < 6; i++) {
1715
val >>= 1;
1716
val |= ((he_cap->ppe_thres[bit / 8] >>
1717
(bit % 8)) & 0x1) << 5;
1718
bit++;
1719
}
1720
arg->peer_ppet.ppet16_ppet8_ru3_ru0[nss] |=
1721
val << (ru * 6);
1722
}
1723
}
1724
}
1725
1726
if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_RES)
1727
arg->twt_responder = true;
1728
if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_REQ)
1729
arg->twt_requester = true;
1730
1731
switch (sta->deflink.bandwidth) {
1732
case IEEE80211_STA_RX_BW_160:
1733
if (he_cap->he_cap_elem.phy_cap_info[0] &
1734
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G) {
1735
v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80p80);
1736
arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80_80] = v;
1737
1738
v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80p80);
1739
arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80_80] = v;
1740
1741
arg->peer_he_mcs_count++;
1742
}
1743
v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160);
1744
arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v;
1745
1746
v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_160);
1747
arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v;
1748
1749
arg->peer_he_mcs_count++;
1750
fallthrough;
1751
1752
default:
1753
v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80);
1754
arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v;
1755
1756
v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80);
1757
arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v;
1758
1759
arg->peer_he_mcs_count++;
1760
break;
1761
}
1762
}
1763
1764
static void ath12k_peer_assoc_h_smps(struct ieee80211_sta *sta,
1765
struct ath12k_wmi_peer_assoc_arg *arg)
1766
{
1767
const struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
1768
int smps;
1769
1770
if (!ht_cap->ht_supported)
1771
return;
1772
1773
smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
1774
smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
1775
1776
switch (smps) {
1777
case WLAN_HT_CAP_SM_PS_STATIC:
1778
arg->static_mimops_flag = true;
1779
break;
1780
case WLAN_HT_CAP_SM_PS_DYNAMIC:
1781
arg->dynamic_mimops_flag = true;
1782
break;
1783
case WLAN_HT_CAP_SM_PS_DISABLED:
1784
arg->spatial_mux_flag = true;
1785
break;
1786
default:
1787
break;
1788
}
1789
}
1790
1791
static void ath12k_peer_assoc_h_qos(struct ath12k *ar,
1792
struct ieee80211_vif *vif,
1793
struct ieee80211_sta *sta,
1794
struct ath12k_wmi_peer_assoc_arg *arg)
1795
{
1796
struct ath12k_vif *arvif = (void *)vif->drv_priv;
1797
1798
switch (arvif->vdev_type) {
1799
case WMI_VDEV_TYPE_AP:
1800
if (sta->wme) {
1801
/* TODO: Check WME vs QoS */
1802
arg->is_wme_set = true;
1803
arg->qos_flag = true;
1804
}
1805
1806
if (sta->wme && sta->uapsd_queues) {
1807
/* TODO: Check WME vs QoS */
1808
arg->is_wme_set = true;
1809
arg->apsd_flag = true;
1810
arg->peer_rate_caps |= WMI_HOST_RC_UAPSD_FLAG;
1811
}
1812
break;
1813
case WMI_VDEV_TYPE_STA:
1814
if (sta->wme) {
1815
arg->is_wme_set = true;
1816
arg->qos_flag = true;
1817
}
1818
break;
1819
default:
1820
break;
1821
}
1822
1823
ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac peer %pM qos %d\n",
1824
sta->addr, arg->qos_flag);
1825
}
1826
1827
static int ath12k_peer_assoc_qos_ap(struct ath12k *ar,
1828
struct ath12k_vif *arvif,
1829
struct ieee80211_sta *sta)
1830
{
1831
struct ath12k_wmi_ap_ps_arg arg;
1832
u32 max_sp;
1833
u32 uapsd;
1834
int ret;
1835
1836
lockdep_assert_held(&ar->conf_mutex);
1837
1838
arg.vdev_id = arvif->vdev_id;
1839
1840
ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac uapsd_queues 0x%x max_sp %d\n",
1841
sta->uapsd_queues, sta->max_sp);
1842
1843
uapsd = 0;
1844
if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO)
1845
uapsd |= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN |
1846
WMI_AP_PS_UAPSD_AC3_TRIGGER_EN;
1847
if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI)
1848
uapsd |= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN |
1849
WMI_AP_PS_UAPSD_AC2_TRIGGER_EN;
1850
if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK)
1851
uapsd |= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN |
1852
WMI_AP_PS_UAPSD_AC1_TRIGGER_EN;
1853
if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE)
1854
uapsd |= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN |
1855
WMI_AP_PS_UAPSD_AC0_TRIGGER_EN;
1856
1857
max_sp = 0;
1858
if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP)
1859
max_sp = sta->max_sp;
1860
1861
arg.param = WMI_AP_PS_PEER_PARAM_UAPSD;
1862
arg.value = uapsd;
1863
ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, &arg);
1864
if (ret)
1865
goto err;
1866
1867
arg.param = WMI_AP_PS_PEER_PARAM_MAX_SP;
1868
arg.value = max_sp;
1869
ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, &arg);
1870
if (ret)
1871
goto err;
1872
1873
/* TODO: revisit during testing */
1874
arg.param = WMI_AP_PS_PEER_PARAM_SIFS_RESP_FRMTYPE;
1875
arg.value = DISABLE_SIFS_RESPONSE_TRIGGER;
1876
ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, &arg);
1877
if (ret)
1878
goto err;
1879
1880
arg.param = WMI_AP_PS_PEER_PARAM_SIFS_RESP_UAPSD;
1881
arg.value = DISABLE_SIFS_RESPONSE_TRIGGER;
1882
ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, &arg);
1883
if (ret)
1884
goto err;
1885
1886
return 0;
1887
1888
err:
1889
ath12k_warn(ar->ab, "failed to set ap ps peer param %d for vdev %i: %d\n",
1890
arg.param, arvif->vdev_id, ret);
1891
return ret;
1892
}
1893
1894
static bool ath12k_mac_sta_has_ofdm_only(struct ieee80211_sta *sta)
1895
{
1896
return sta->deflink.supp_rates[NL80211_BAND_2GHZ] >>
1897
ATH12K_MAC_FIRST_OFDM_RATE_IDX;
1898
}
1899
1900
static enum wmi_phy_mode ath12k_mac_get_phymode_vht(struct ath12k *ar,
1901
struct ieee80211_sta *sta)
1902
{
1903
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160) {
1904
switch (sta->deflink.vht_cap.cap &
1905
IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK) {
1906
case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ:
1907
return MODE_11AC_VHT160;
1908
case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ:
1909
return MODE_11AC_VHT80_80;
1910
default:
1911
/* not sure if this is a valid case? */
1912
return MODE_11AC_VHT160;
1913
}
1914
}
1915
1916
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
1917
return MODE_11AC_VHT80;
1918
1919
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
1920
return MODE_11AC_VHT40;
1921
1922
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_20)
1923
return MODE_11AC_VHT20;
1924
1925
return MODE_UNKNOWN;
1926
}
1927
1928
static enum wmi_phy_mode ath12k_mac_get_phymode_he(struct ath12k *ar,
1929
struct ieee80211_sta *sta)
1930
{
1931
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160) {
1932
if (sta->deflink.he_cap.he_cap_elem.phy_cap_info[0] &
1933
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
1934
return MODE_11AX_HE160;
1935
else if (sta->deflink.he_cap.he_cap_elem.phy_cap_info[0] &
1936
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
1937
return MODE_11AX_HE80_80;
1938
/* not sure if this is a valid case? */
1939
return MODE_11AX_HE160;
1940
}
1941
1942
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
1943
return MODE_11AX_HE80;
1944
1945
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
1946
return MODE_11AX_HE40;
1947
1948
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_20)
1949
return MODE_11AX_HE20;
1950
1951
return MODE_UNKNOWN;
1952
}
1953
1954
static enum wmi_phy_mode ath12k_mac_get_phymode_eht(struct ath12k *ar,
1955
struct ieee80211_sta *sta)
1956
{
1957
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_320)
1958
if (sta->deflink.eht_cap.eht_cap_elem.phy_cap_info[0] &
1959
IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ)
1960
return MODE_11BE_EHT320;
1961
1962
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160) {
1963
if (sta->deflink.he_cap.he_cap_elem.phy_cap_info[0] &
1964
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
1965
return MODE_11BE_EHT160;
1966
1967
if (sta->deflink.he_cap.he_cap_elem.phy_cap_info[0] &
1968
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
1969
return MODE_11BE_EHT80_80;
1970
1971
ath12k_warn(ar->ab, "invalid EHT PHY capability info for 160 Mhz: %d\n",
1972
sta->deflink.he_cap.he_cap_elem.phy_cap_info[0]);
1973
1974
return MODE_11BE_EHT160;
1975
}
1976
1977
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
1978
return MODE_11BE_EHT80;
1979
1980
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
1981
return MODE_11BE_EHT40;
1982
1983
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_20)
1984
return MODE_11BE_EHT20;
1985
1986
return MODE_UNKNOWN;
1987
}
1988
1989
static void ath12k_peer_assoc_h_phymode(struct ath12k *ar,
1990
struct ieee80211_vif *vif,
1991
struct ieee80211_sta *sta,
1992
struct ath12k_wmi_peer_assoc_arg *arg)
1993
{
1994
struct ath12k_vif *arvif = (void *)vif->drv_priv;
1995
struct cfg80211_chan_def def;
1996
enum nl80211_band band;
1997
const u8 *ht_mcs_mask;
1998
const u16 *vht_mcs_mask;
1999
enum wmi_phy_mode phymode = MODE_UNKNOWN;
2000
2001
if (WARN_ON(ath12k_mac_vif_chan(vif, &def)))
2002
return;
2003
2004
band = def.chan->band;
2005
ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
2006
vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2007
2008
switch (band) {
2009
case NL80211_BAND_2GHZ:
2010
if (sta->deflink.eht_cap.has_eht) {
2011
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2012
phymode = MODE_11BE_EHT40_2G;
2013
else
2014
phymode = MODE_11BE_EHT20_2G;
2015
} else if (sta->deflink.he_cap.has_he) {
2016
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
2017
phymode = MODE_11AX_HE80_2G;
2018
else if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2019
phymode = MODE_11AX_HE40_2G;
2020
else
2021
phymode = MODE_11AX_HE20_2G;
2022
} else if (sta->deflink.vht_cap.vht_supported &&
2023
!ath12k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
2024
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2025
phymode = MODE_11AC_VHT40;
2026
else
2027
phymode = MODE_11AC_VHT20;
2028
} else if (sta->deflink.ht_cap.ht_supported &&
2029
!ath12k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
2030
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2031
phymode = MODE_11NG_HT40;
2032
else
2033
phymode = MODE_11NG_HT20;
2034
} else if (ath12k_mac_sta_has_ofdm_only(sta)) {
2035
phymode = MODE_11G;
2036
} else {
2037
phymode = MODE_11B;
2038
}
2039
break;
2040
case NL80211_BAND_5GHZ:
2041
case NL80211_BAND_6GHZ:
2042
/* Check EHT first */
2043
if (sta->deflink.eht_cap.has_eht) {
2044
phymode = ath12k_mac_get_phymode_eht(ar, sta);
2045
} else if (sta->deflink.he_cap.has_he) {
2046
phymode = ath12k_mac_get_phymode_he(ar, sta);
2047
} else if (sta->deflink.vht_cap.vht_supported &&
2048
!ath12k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
2049
phymode = ath12k_mac_get_phymode_vht(ar, sta);
2050
} else if (sta->deflink.ht_cap.ht_supported &&
2051
!ath12k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
2052
if (sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40)
2053
phymode = MODE_11NA_HT40;
2054
else
2055
phymode = MODE_11NA_HT20;
2056
} else {
2057
phymode = MODE_11A;
2058
}
2059
break;
2060
default:
2061
break;
2062
}
2063
2064
ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac peer %pM phymode %s\n",
2065
sta->addr, ath12k_mac_phymode_str(phymode));
2066
2067
arg->peer_phymode = phymode;
2068
WARN_ON(phymode == MODE_UNKNOWN);
2069
}
2070
2071
static void ath12k_mac_set_eht_mcs(u8 rx_tx_mcs7, u8 rx_tx_mcs9,
2072
u8 rx_tx_mcs11, u8 rx_tx_mcs13,
2073
u32 *rx_mcs, u32 *tx_mcs)
2074
{
2075
*rx_mcs = 0;
2076
u32p_replace_bits(rx_mcs,
2077
u8_get_bits(rx_tx_mcs7, IEEE80211_EHT_MCS_NSS_RX),
2078
WMI_EHT_MCS_NSS_0_7);
2079
u32p_replace_bits(rx_mcs,
2080
u8_get_bits(rx_tx_mcs9, IEEE80211_EHT_MCS_NSS_RX),
2081
WMI_EHT_MCS_NSS_8_9);
2082
u32p_replace_bits(rx_mcs,
2083
u8_get_bits(rx_tx_mcs11, IEEE80211_EHT_MCS_NSS_RX),
2084
WMI_EHT_MCS_NSS_10_11);
2085
u32p_replace_bits(rx_mcs,
2086
u8_get_bits(rx_tx_mcs13, IEEE80211_EHT_MCS_NSS_RX),
2087
WMI_EHT_MCS_NSS_12_13);
2088
2089
*tx_mcs = 0;
2090
u32p_replace_bits(tx_mcs,
2091
u8_get_bits(rx_tx_mcs7, IEEE80211_EHT_MCS_NSS_TX),
2092
WMI_EHT_MCS_NSS_0_7);
2093
u32p_replace_bits(tx_mcs,
2094
u8_get_bits(rx_tx_mcs9, IEEE80211_EHT_MCS_NSS_TX),
2095
WMI_EHT_MCS_NSS_8_9);
2096
u32p_replace_bits(tx_mcs,
2097
u8_get_bits(rx_tx_mcs11, IEEE80211_EHT_MCS_NSS_TX),
2098
WMI_EHT_MCS_NSS_10_11);
2099
u32p_replace_bits(tx_mcs,
2100
u8_get_bits(rx_tx_mcs13, IEEE80211_EHT_MCS_NSS_TX),
2101
WMI_EHT_MCS_NSS_12_13);
2102
}
2103
2104
static void ath12k_mac_set_eht_ppe_threshold(const u8 *ppe_thres,
2105
struct ath12k_wmi_ppe_threshold_arg *ppet)
2106
{
2107
u32 bit_pos = IEEE80211_EHT_PPE_THRES_INFO_HEADER_SIZE, val;
2108
u8 nss, ru, i;
2109
u8 ppet_bit_len_per_ru = IEEE80211_EHT_PPE_THRES_INFO_PPET_SIZE * 2;
2110
2111
ppet->numss_m1 = u8_get_bits(ppe_thres[0], IEEE80211_EHT_PPE_THRES_NSS_MASK);
2112
ppet->ru_bit_mask = u16_get_bits(get_unaligned_le16(ppe_thres),
2113
IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK);
2114
2115
for (nss = 0; nss <= ppet->numss_m1; nss++) {
2116
for (ru = 0;
2117
ru < hweight16(IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK);
2118
ru++) {
2119
if ((ppet->ru_bit_mask & BIT(ru)) == 0)
2120
continue;
2121
2122
val = 0;
2123
for (i = 0; i < ppet_bit_len_per_ru; i++) {
2124
val |= (((ppe_thres[bit_pos / 8] >>
2125
(bit_pos % 8)) & 0x1) << i);
2126
bit_pos++;
2127
}
2128
ppet->ppet16_ppet8_ru3_ru0[nss] |=
2129
(val << (ru * ppet_bit_len_per_ru));
2130
}
2131
}
2132
}
2133
2134
static void ath12k_peer_assoc_h_eht(struct ath12k *ar,
2135
struct ieee80211_vif *vif,
2136
struct ieee80211_sta *sta,
2137
struct ath12k_wmi_peer_assoc_arg *arg)
2138
{
2139
const struct ieee80211_sta_eht_cap *eht_cap = &sta->deflink.eht_cap;
2140
const struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap;
2141
const struct ieee80211_eht_mcs_nss_supp_20mhz_only *bw_20;
2142
const struct ieee80211_eht_mcs_nss_supp_bw *bw;
2143
struct ath12k_vif *arvif = (struct ath12k_vif *)vif->drv_priv;
2144
u32 *rx_mcs, *tx_mcs;
2145
2146
if (!sta->deflink.he_cap.has_he || !eht_cap->has_eht)
2147
return;
2148
2149
arg->eht_flag = true;
2150
2151
if ((eht_cap->eht_cap_elem.phy_cap_info[5] &
2152
IEEE80211_EHT_PHY_CAP5_PPE_THRESHOLD_PRESENT) &&
2153
eht_cap->eht_ppe_thres[0] != 0)
2154
ath12k_mac_set_eht_ppe_threshold(eht_cap->eht_ppe_thres,
2155
&arg->peer_eht_ppet);
2156
2157
memcpy(arg->peer_eht_cap_mac, eht_cap->eht_cap_elem.mac_cap_info,
2158
sizeof(eht_cap->eht_cap_elem.mac_cap_info));
2159
memcpy(arg->peer_eht_cap_phy, eht_cap->eht_cap_elem.phy_cap_info,
2160
sizeof(eht_cap->eht_cap_elem.phy_cap_info));
2161
2162
rx_mcs = arg->peer_eht_rx_mcs_set;
2163
tx_mcs = arg->peer_eht_tx_mcs_set;
2164
2165
switch (sta->deflink.bandwidth) {
2166
case IEEE80211_STA_RX_BW_320:
2167
bw = &eht_cap->eht_mcs_nss_supp.bw._320;
2168
ath12k_mac_set_eht_mcs(bw->rx_tx_mcs9_max_nss,
2169
bw->rx_tx_mcs9_max_nss,
2170
bw->rx_tx_mcs11_max_nss,
2171
bw->rx_tx_mcs13_max_nss,
2172
&rx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_320],
2173
&tx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_320]);
2174
arg->peer_eht_mcs_count++;
2175
fallthrough;
2176
case IEEE80211_STA_RX_BW_160:
2177
bw = &eht_cap->eht_mcs_nss_supp.bw._160;
2178
ath12k_mac_set_eht_mcs(bw->rx_tx_mcs9_max_nss,
2179
bw->rx_tx_mcs9_max_nss,
2180
bw->rx_tx_mcs11_max_nss,
2181
bw->rx_tx_mcs13_max_nss,
2182
&rx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_160],
2183
&tx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_160]);
2184
arg->peer_eht_mcs_count++;
2185
fallthrough;
2186
default:
2187
if ((he_cap->he_cap_elem.phy_cap_info[0] &
2188
(IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G |
2189
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G |
2190
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G |
2191
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)) == 0) {
2192
bw_20 = &eht_cap->eht_mcs_nss_supp.only_20mhz;
2193
2194
ath12k_mac_set_eht_mcs(bw_20->rx_tx_mcs7_max_nss,
2195
bw_20->rx_tx_mcs9_max_nss,
2196
bw_20->rx_tx_mcs11_max_nss,
2197
bw_20->rx_tx_mcs13_max_nss,
2198
&rx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_80],
2199
&tx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_80]);
2200
} else {
2201
bw = &eht_cap->eht_mcs_nss_supp.bw._80;
2202
ath12k_mac_set_eht_mcs(bw->rx_tx_mcs9_max_nss,
2203
bw->rx_tx_mcs9_max_nss,
2204
bw->rx_tx_mcs11_max_nss,
2205
bw->rx_tx_mcs13_max_nss,
2206
&rx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_80],
2207
&tx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_80]);
2208
}
2209
2210
arg->peer_eht_mcs_count++;
2211
break;
2212
}
2213
2214
arg->punct_bitmap = ~arvif->punct_bitmap;
2215
}
2216
2217
static void ath12k_peer_assoc_prepare(struct ath12k *ar,
2218
struct ieee80211_vif *vif,
2219
struct ieee80211_sta *sta,
2220
struct ath12k_wmi_peer_assoc_arg *arg,
2221
bool reassoc)
2222
{
2223
lockdep_assert_held(&ar->conf_mutex);
2224
2225
memset(arg, 0, sizeof(*arg));
2226
2227
reinit_completion(&ar->peer_assoc_done);
2228
2229
arg->peer_new_assoc = !reassoc;
2230
ath12k_peer_assoc_h_basic(ar, vif, sta, arg);
2231
ath12k_peer_assoc_h_crypto(ar, vif, sta, arg);
2232
ath12k_peer_assoc_h_rates(ar, vif, sta, arg);
2233
ath12k_peer_assoc_h_ht(ar, vif, sta, arg);
2234
ath12k_peer_assoc_h_vht(ar, vif, sta, arg);
2235
ath12k_peer_assoc_h_he(ar, vif, sta, arg);
2236
ath12k_peer_assoc_h_eht(ar, vif, sta, arg);
2237
ath12k_peer_assoc_h_qos(ar, vif, sta, arg);
2238
ath12k_peer_assoc_h_phymode(ar, vif, sta, arg);
2239
ath12k_peer_assoc_h_smps(sta, arg);
2240
2241
/* TODO: amsdu_disable req? */
2242
}
2243
2244
static int ath12k_setup_peer_smps(struct ath12k *ar, struct ath12k_vif *arvif,
2245
const u8 *addr,
2246
const struct ieee80211_sta_ht_cap *ht_cap)
2247
{
2248
int smps;
2249
2250
if (!ht_cap->ht_supported)
2251
return 0;
2252
2253
smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
2254
smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
2255
2256
if (smps >= ARRAY_SIZE(ath12k_smps_map))
2257
return -EINVAL;
2258
2259
return ath12k_wmi_set_peer_param(ar, addr, arvif->vdev_id,
2260
WMI_PEER_MIMO_PS_STATE,
2261
ath12k_smps_map[smps]);
2262
}
2263
2264
static void ath12k_bss_assoc(struct ieee80211_hw *hw,
2265
struct ieee80211_vif *vif,
2266
struct ieee80211_bss_conf *bss_conf)
2267
{
2268
struct ath12k *ar = hw->priv;
2269
struct ath12k_vif *arvif = (void *)vif->drv_priv;
2270
struct ath12k_wmi_peer_assoc_arg peer_arg;
2271
struct ieee80211_sta *ap_sta;
2272
struct ath12k_peer *peer;
2273
bool is_auth = false;
2274
int ret;
2275
2276
lockdep_assert_held(&ar->conf_mutex);
2277
2278
ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %i assoc bssid %pM aid %d\n",
2279
arvif->vdev_id, arvif->bssid, arvif->aid);
2280
2281
rcu_read_lock();
2282
2283
ap_sta = ieee80211_find_sta(vif, bss_conf->bssid);
2284
if (!ap_sta) {
2285
ath12k_warn(ar->ab, "failed to find station entry for bss %pM vdev %i\n",
2286
bss_conf->bssid, arvif->vdev_id);
2287
rcu_read_unlock();
2288
return;
2289
}
2290
2291
ath12k_peer_assoc_prepare(ar, vif, ap_sta, &peer_arg, false);
2292
2293
rcu_read_unlock();
2294
2295
ret = ath12k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
2296
if (ret) {
2297
ath12k_warn(ar->ab, "failed to run peer assoc for %pM vdev %i: %d\n",
2298
bss_conf->bssid, arvif->vdev_id, ret);
2299
return;
2300
}
2301
2302
if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) {
2303
ath12k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
2304
bss_conf->bssid, arvif->vdev_id);
2305
return;
2306
}
2307
2308
ret = ath12k_setup_peer_smps(ar, arvif, bss_conf->bssid,
2309
&ap_sta->deflink.ht_cap);
2310
if (ret) {
2311
ath12k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n",
2312
arvif->vdev_id, ret);
2313
return;
2314
}
2315
2316
WARN_ON(arvif->is_up);
2317
2318
arvif->aid = vif->cfg.aid;
2319
ether_addr_copy(arvif->bssid, bss_conf->bssid);
2320
2321
ret = ath12k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid);
2322
if (ret) {
2323
ath12k_warn(ar->ab, "failed to set vdev %d up: %d\n",
2324
arvif->vdev_id, ret);
2325
return;
2326
}
2327
2328
arvif->is_up = true;
2329
2330
ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
2331
"mac vdev %d up (associated) bssid %pM aid %d\n",
2332
arvif->vdev_id, bss_conf->bssid, vif->cfg.aid);
2333
2334
spin_lock_bh(&ar->ab->base_lock);
2335
2336
peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arvif->bssid);
2337
if (peer && peer->is_authorized)
2338
is_auth = true;
2339
2340
spin_unlock_bh(&ar->ab->base_lock);
2341
2342
/* Authorize BSS Peer */
2343
if (is_auth) {
2344
ret = ath12k_wmi_set_peer_param(ar, arvif->bssid,
2345
arvif->vdev_id,
2346
WMI_PEER_AUTHORIZE,
2347
1);
2348
if (ret)
2349
ath12k_warn(ar->ab, "Unable to authorize BSS peer: %d\n", ret);
2350
}
2351
2352
ret = ath12k_wmi_send_obss_spr_cmd(ar, arvif->vdev_id,
2353
&bss_conf->he_obss_pd);
2354
if (ret)
2355
ath12k_warn(ar->ab, "failed to set vdev %i OBSS PD parameters: %d\n",
2356
arvif->vdev_id, ret);
2357
}
2358
2359
static void ath12k_bss_disassoc(struct ieee80211_hw *hw,
2360
struct ieee80211_vif *vif)
2361
{
2362
struct ath12k *ar = hw->priv;
2363
struct ath12k_vif *arvif = (void *)vif->drv_priv;
2364
int ret;
2365
2366
lockdep_assert_held(&ar->conf_mutex);
2367
2368
ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %i disassoc bssid %pM\n",
2369
arvif->vdev_id, arvif->bssid);
2370
2371
ret = ath12k_wmi_vdev_down(ar, arvif->vdev_id);
2372
if (ret)
2373
ath12k_warn(ar->ab, "failed to down vdev %i: %d\n",
2374
arvif->vdev_id, ret);
2375
2376
arvif->is_up = false;
2377
2378
/* TODO: cancel connection_loss_work */
2379
}
2380
2381
static u32 ath12k_mac_get_rate_hw_value(int bitrate)
2382
{
2383
u32 preamble;
2384
u16 hw_value;
2385
int rate;
2386
size_t i;
2387
2388
if (ath12k_mac_bitrate_is_cck(bitrate))
2389
preamble = WMI_RATE_PREAMBLE_CCK;
2390
else
2391
preamble = WMI_RATE_PREAMBLE_OFDM;
2392
2393
for (i = 0; i < ARRAY_SIZE(ath12k_legacy_rates); i++) {
2394
if (ath12k_legacy_rates[i].bitrate != bitrate)
2395
continue;
2396
2397
hw_value = ath12k_legacy_rates[i].hw_value;
2398
rate = ATH12K_HW_RATE_CODE(hw_value, 0, preamble);
2399
2400
return rate;
2401
}
2402
2403
return -EINVAL;
2404
}
2405
2406
static void ath12k_recalculate_mgmt_rate(struct ath12k *ar,
2407
struct ieee80211_vif *vif,
2408
struct cfg80211_chan_def *def)
2409
{
2410
struct ath12k_vif *arvif = (void *)vif->drv_priv;
2411
const struct ieee80211_supported_band *sband;
2412
u8 basic_rate_idx;
2413
int hw_rate_code;
2414
u32 vdev_param;
2415
u16 bitrate;
2416
int ret;
2417
2418
lockdep_assert_held(&ar->conf_mutex);
2419
2420
sband = ar->hw->wiphy->bands[def->chan->band];
2421
basic_rate_idx = ffs(vif->bss_conf.basic_rates) - 1;
2422
bitrate = sband->bitrates[basic_rate_idx].bitrate;
2423
2424
hw_rate_code = ath12k_mac_get_rate_hw_value(bitrate);
2425
if (hw_rate_code < 0) {
2426
ath12k_warn(ar->ab, "bitrate not supported %d\n", bitrate);
2427
return;
2428
}
2429
2430
vdev_param = WMI_VDEV_PARAM_MGMT_RATE;
2431
ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param,
2432
hw_rate_code);
2433
if (ret)
2434
ath12k_warn(ar->ab, "failed to set mgmt tx rate %d\n", ret);
2435
2436
vdev_param = WMI_VDEV_PARAM_BEACON_RATE;
2437
ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param,
2438
hw_rate_code);
2439
if (ret)
2440
ath12k_warn(ar->ab, "failed to set beacon tx rate %d\n", ret);
2441
}
2442
2443
static int ath12k_mac_fils_discovery(struct ath12k_vif *arvif,
2444
struct ieee80211_bss_conf *info)
2445
{
2446
struct ath12k *ar = arvif->ar;
2447
struct sk_buff *tmpl;
2448
int ret;
2449
u32 interval;
2450
bool unsol_bcast_probe_resp_enabled = false;
2451
2452
if (info->fils_discovery.max_interval) {
2453
interval = info->fils_discovery.max_interval;
2454
2455
tmpl = ieee80211_get_fils_discovery_tmpl(ar->hw, arvif->vif);
2456
if (tmpl)
2457
ret = ath12k_wmi_fils_discovery_tmpl(ar, arvif->vdev_id,
2458
tmpl);
2459
} else if (info->unsol_bcast_probe_resp_interval) {
2460
unsol_bcast_probe_resp_enabled = 1;
2461
interval = info->unsol_bcast_probe_resp_interval;
2462
2463
tmpl = ieee80211_get_unsol_bcast_probe_resp_tmpl(ar->hw,
2464
arvif->vif);
2465
if (tmpl)
2466
ret = ath12k_wmi_probe_resp_tmpl(ar, arvif->vdev_id,
2467
tmpl);
2468
} else { /* Disable */
2469
return ath12k_wmi_fils_discovery(ar, arvif->vdev_id, 0, false);
2470
}
2471
2472
if (!tmpl) {
2473
ath12k_warn(ar->ab,
2474
"mac vdev %i failed to retrieve %s template\n",
2475
arvif->vdev_id, (unsol_bcast_probe_resp_enabled ?
2476
"unsolicited broadcast probe response" :
2477
"FILS discovery"));
2478
return -EPERM;
2479
}
2480
kfree_skb(tmpl);
2481
2482
if (!ret)
2483
ret = ath12k_wmi_fils_discovery(ar, arvif->vdev_id, interval,
2484
unsol_bcast_probe_resp_enabled);
2485
2486
return ret;
2487
}
2488
2489
static void ath12k_mac_op_bss_info_changed(struct ieee80211_hw *hw,
2490
struct ieee80211_vif *vif,
2491
struct ieee80211_bss_conf *info,
2492
u64 changed)
2493
{
2494
struct ath12k *ar = hw->priv;
2495
struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
2496
struct cfg80211_chan_def def;
2497
u32 param_id, param_value;
2498
enum nl80211_band band;
2499
u32 vdev_param;
2500
int mcast_rate;
2501
u32 preamble;
2502
u16 hw_value;
2503
u16 bitrate;
2504
int ret;
2505
u8 rateidx;
2506
u32 rate;
2507
2508
mutex_lock(&ar->conf_mutex);
2509
2510
if (changed & BSS_CHANGED_BEACON_INT) {
2511
arvif->beacon_interval = info->beacon_int;
2512
2513
param_id = WMI_VDEV_PARAM_BEACON_INTERVAL;
2514
ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
2515
param_id,
2516
arvif->beacon_interval);
2517
if (ret)
2518
ath12k_warn(ar->ab, "Failed to set beacon interval for VDEV: %d\n",
2519
arvif->vdev_id);
2520
else
2521
ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
2522
"Beacon interval: %d set for VDEV: %d\n",
2523
arvif->beacon_interval, arvif->vdev_id);
2524
}
2525
2526
if (changed & BSS_CHANGED_BEACON) {
2527
param_id = WMI_PDEV_PARAM_BEACON_TX_MODE;
2528
param_value = WMI_BEACON_STAGGERED_MODE;
2529
ret = ath12k_wmi_pdev_set_param(ar, param_id,
2530
param_value, ar->pdev->pdev_id);
2531
if (ret)
2532
ath12k_warn(ar->ab, "Failed to set beacon mode for VDEV: %d\n",
2533
arvif->vdev_id);
2534
else
2535
ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
2536
"Set staggered beacon mode for VDEV: %d\n",
2537
arvif->vdev_id);
2538
2539
ret = ath12k_mac_setup_bcn_tmpl(arvif);
2540
if (ret)
2541
ath12k_warn(ar->ab, "failed to update bcn template: %d\n",
2542
ret);
2543
}
2544
2545
if (changed & (BSS_CHANGED_BEACON_INFO | BSS_CHANGED_BEACON)) {
2546
arvif->dtim_period = info->dtim_period;
2547
2548
param_id = WMI_VDEV_PARAM_DTIM_PERIOD;
2549
ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
2550
param_id,
2551
arvif->dtim_period);
2552
2553
if (ret)
2554
ath12k_warn(ar->ab, "Failed to set dtim period for VDEV %d: %i\n",
2555
arvif->vdev_id, ret);
2556
else
2557
ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
2558
"DTIM period: %d set for VDEV: %d\n",
2559
arvif->dtim_period, arvif->vdev_id);
2560
}
2561
2562
if (changed & BSS_CHANGED_SSID &&
2563
vif->type == NL80211_IFTYPE_AP) {
2564
arvif->u.ap.ssid_len = vif->cfg.ssid_len;
2565
if (vif->cfg.ssid_len)
2566
memcpy(arvif->u.ap.ssid, vif->cfg.ssid, vif->cfg.ssid_len);
2567
arvif->u.ap.hidden_ssid = info->hidden_ssid;
2568
}
2569
2570
if (changed & BSS_CHANGED_BSSID && !is_zero_ether_addr(info->bssid))
2571
ether_addr_copy(arvif->bssid, info->bssid);
2572
2573
if (changed & BSS_CHANGED_BEACON_ENABLED) {
2574
ath12k_control_beaconing(arvif, info);
2575
2576
if (arvif->is_up && vif->bss_conf.he_support &&
2577
vif->bss_conf.he_oper.params) {
2578
/* TODO: Extend to support 1024 BA Bitmap size */
2579
ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
2580
WMI_VDEV_PARAM_BA_MODE,
2581
WMI_BA_MODE_BUFFER_SIZE_256);
2582
if (ret)
2583
ath12k_warn(ar->ab,
2584
"failed to set BA BUFFER SIZE 256 for vdev: %d\n",
2585
arvif->vdev_id);
2586
2587
param_id = WMI_VDEV_PARAM_HEOPS_0_31;
2588
param_value = vif->bss_conf.he_oper.params;
2589
ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
2590
param_id, param_value);
2591
ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
2592
"he oper param: %x set for VDEV: %d\n",
2593
param_value, arvif->vdev_id);
2594
2595
if (ret)
2596
ath12k_warn(ar->ab, "Failed to set he oper params %x for VDEV %d: %i\n",
2597
param_value, arvif->vdev_id, ret);
2598
}
2599
}
2600
2601
if (changed & BSS_CHANGED_ERP_CTS_PROT) {
2602
u32 cts_prot;
2603
2604
cts_prot = !!(info->use_cts_prot);
2605
param_id = WMI_VDEV_PARAM_PROTECTION_MODE;
2606
2607
if (arvif->is_started) {
2608
ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
2609
param_id, cts_prot);
2610
if (ret)
2611
ath12k_warn(ar->ab, "Failed to set CTS prot for VDEV: %d\n",
2612
arvif->vdev_id);
2613
else
2614
ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "Set CTS prot: %d for VDEV: %d\n",
2615
cts_prot, arvif->vdev_id);
2616
} else {
2617
ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "defer protection mode setup, vdev is not ready yet\n");
2618
}
2619
}
2620
2621
if (changed & BSS_CHANGED_ERP_SLOT) {
2622
u32 slottime;
2623
2624
if (info->use_short_slot)
2625
slottime = WMI_VDEV_SLOT_TIME_SHORT; /* 9us */
2626
2627
else
2628
slottime = WMI_VDEV_SLOT_TIME_LONG; /* 20us */
2629
2630
param_id = WMI_VDEV_PARAM_SLOT_TIME;
2631
ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
2632
param_id, slottime);
2633
if (ret)
2634
ath12k_warn(ar->ab, "Failed to set erp slot for VDEV: %d\n",
2635
arvif->vdev_id);
2636
else
2637
ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
2638
"Set slottime: %d for VDEV: %d\n",
2639
slottime, arvif->vdev_id);
2640
}
2641
2642
if (changed & BSS_CHANGED_ERP_PREAMBLE) {
2643
u32 preamble;
2644
2645
if (info->use_short_preamble)
2646
preamble = WMI_VDEV_PREAMBLE_SHORT;
2647
else
2648
preamble = WMI_VDEV_PREAMBLE_LONG;
2649
2650
param_id = WMI_VDEV_PARAM_PREAMBLE;
2651
ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
2652
param_id, preamble);
2653
if (ret)
2654
ath12k_warn(ar->ab, "Failed to set preamble for VDEV: %d\n",
2655
arvif->vdev_id);
2656
else
2657
ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
2658
"Set preamble: %d for VDEV: %d\n",
2659
preamble, arvif->vdev_id);
2660
}
2661
2662
if (changed & BSS_CHANGED_ASSOC) {
2663
if (vif->cfg.assoc)
2664
ath12k_bss_assoc(hw, vif, info);
2665
else
2666
ath12k_bss_disassoc(hw, vif);
2667
}
2668
2669
if (changed & BSS_CHANGED_TXPOWER) {
2670
ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev_id %i txpower %d\n",
2671
arvif->vdev_id, info->txpower);
2672
2673
arvif->txpower = info->txpower;
2674
ath12k_mac_txpower_recalc(ar);
2675
}
2676
2677
if (changed & BSS_CHANGED_MCAST_RATE &&
2678
!ath12k_mac_vif_chan(arvif->vif, &def)) {
2679
band = def.chan->band;
2680
mcast_rate = vif->bss_conf.mcast_rate[band];
2681
2682
if (mcast_rate > 0)
2683
rateidx = mcast_rate - 1;
2684
else
2685
rateidx = ffs(vif->bss_conf.basic_rates) - 1;
2686
2687
if (ar->pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP)
2688
rateidx += ATH12K_MAC_FIRST_OFDM_RATE_IDX;
2689
2690
bitrate = ath12k_legacy_rates[rateidx].bitrate;
2691
hw_value = ath12k_legacy_rates[rateidx].hw_value;
2692
2693
if (ath12k_mac_bitrate_is_cck(bitrate))
2694
preamble = WMI_RATE_PREAMBLE_CCK;
2695
else
2696
preamble = WMI_RATE_PREAMBLE_OFDM;
2697
2698
rate = ATH12K_HW_RATE_CODE(hw_value, 0, preamble);
2699
2700
ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
2701
"mac vdev %d mcast_rate %x\n",
2702
arvif->vdev_id, rate);
2703
2704
vdev_param = WMI_VDEV_PARAM_MCAST_DATA_RATE;
2705
ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
2706
vdev_param, rate);
2707
if (ret)
2708
ath12k_warn(ar->ab,
2709
"failed to set mcast rate on vdev %i: %d\n",
2710
arvif->vdev_id, ret);
2711
2712
vdev_param = WMI_VDEV_PARAM_BCAST_DATA_RATE;
2713
ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
2714
vdev_param, rate);
2715
if (ret)
2716
ath12k_warn(ar->ab,
2717
"failed to set bcast rate on vdev %i: %d\n",
2718
arvif->vdev_id, ret);
2719
}
2720
2721
if (changed & BSS_CHANGED_BASIC_RATES &&
2722
!ath12k_mac_vif_chan(arvif->vif, &def))
2723
ath12k_recalculate_mgmt_rate(ar, vif, &def);
2724
2725
if (changed & BSS_CHANGED_TWT) {
2726
if (info->twt_requester || info->twt_responder)
2727
ath12k_wmi_send_twt_enable_cmd(ar, ar->pdev->pdev_id);
2728
else
2729
ath12k_wmi_send_twt_disable_cmd(ar, ar->pdev->pdev_id);
2730
}
2731
2732
if (changed & BSS_CHANGED_HE_OBSS_PD)
2733
ath12k_wmi_send_obss_spr_cmd(ar, arvif->vdev_id,
2734
&info->he_obss_pd);
2735
2736
if (changed & BSS_CHANGED_HE_BSS_COLOR) {
2737
if (vif->type == NL80211_IFTYPE_AP) {
2738
ret = ath12k_wmi_obss_color_cfg_cmd(ar,
2739
arvif->vdev_id,
2740
info->he_bss_color.color,
2741
ATH12K_BSS_COLOR_AP_PERIODS,
2742
info->he_bss_color.enabled);
2743
if (ret)
2744
ath12k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n",
2745
arvif->vdev_id, ret);
2746
} else if (vif->type == NL80211_IFTYPE_STATION) {
2747
ret = ath12k_wmi_send_bss_color_change_enable_cmd(ar,
2748
arvif->vdev_id,
2749
1);
2750
if (ret)
2751
ath12k_warn(ar->ab, "failed to enable bss color change on vdev %i: %d\n",
2752
arvif->vdev_id, ret);
2753
ret = ath12k_wmi_obss_color_cfg_cmd(ar,
2754
arvif->vdev_id,
2755
0,
2756
ATH12K_BSS_COLOR_STA_PERIODS,
2757
1);
2758
if (ret)
2759
ath12k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n",
2760
arvif->vdev_id, ret);
2761
}
2762
}
2763
2764
if (changed & BSS_CHANGED_FILS_DISCOVERY ||
2765
changed & BSS_CHANGED_UNSOL_BCAST_PROBE_RESP)
2766
ath12k_mac_fils_discovery(arvif, info);
2767
2768
if (changed & BSS_CHANGED_EHT_PUNCTURING)
2769
arvif->punct_bitmap = info->eht_puncturing;
2770
2771
mutex_unlock(&ar->conf_mutex);
2772
}
2773
2774
void __ath12k_mac_scan_finish(struct ath12k *ar)
2775
{
2776
lockdep_assert_held(&ar->data_lock);
2777
2778
switch (ar->scan.state) {
2779
case ATH12K_SCAN_IDLE:
2780
break;
2781
case ATH12K_SCAN_RUNNING:
2782
case ATH12K_SCAN_ABORTING:
2783
if (!ar->scan.is_roc) {
2784
struct cfg80211_scan_info info = {
2785
.aborted = (ar->scan.state ==
2786
ATH12K_SCAN_ABORTING),
2787
};
2788
2789
ieee80211_scan_completed(ar->hw, &info);
2790
} else if (ar->scan.roc_notify) {
2791
ieee80211_remain_on_channel_expired(ar->hw);
2792
}
2793
fallthrough;
2794
case ATH12K_SCAN_STARTING:
2795
ar->scan.state = ATH12K_SCAN_IDLE;
2796
ar->scan_channel = NULL;
2797
ar->scan.roc_freq = 0;
2798
cancel_delayed_work(&ar->scan.timeout);
2799
complete(&ar->scan.completed);
2800
break;
2801
}
2802
}
2803
2804
void ath12k_mac_scan_finish(struct ath12k *ar)
2805
{
2806
spin_lock_bh(&ar->data_lock);
2807
__ath12k_mac_scan_finish(ar);
2808
spin_unlock_bh(&ar->data_lock);
2809
}
2810
2811
static int ath12k_scan_stop(struct ath12k *ar)
2812
{
2813
struct ath12k_wmi_scan_cancel_arg arg = {
2814
.req_type = WLAN_SCAN_CANCEL_SINGLE,
2815
.scan_id = ATH12K_SCAN_ID,
2816
};
2817
int ret;
2818
2819
lockdep_assert_held(&ar->conf_mutex);
2820
2821
/* TODO: Fill other STOP Params */
2822
arg.pdev_id = ar->pdev->pdev_id;
2823
2824
ret = ath12k_wmi_send_scan_stop_cmd(ar, &arg);
2825
if (ret) {
2826
ath12k_warn(ar->ab, "failed to stop wmi scan: %d\n", ret);
2827
goto out;
2828
}
2829
2830
ret = wait_for_completion_timeout(&ar->scan.completed, 3 * HZ);
2831
if (ret == 0) {
2832
ath12k_warn(ar->ab,
2833
"failed to receive scan abort comple: timed out\n");
2834
ret = -ETIMEDOUT;
2835
} else if (ret > 0) {
2836
ret = 0;
2837
}
2838
2839
out:
2840
/* Scan state should be updated upon scan completion but in case
2841
* firmware fails to deliver the event (for whatever reason) it is
2842
* desired to clean up scan state anyway. Firmware may have just
2843
* dropped the scan completion event delivery due to transport pipe
2844
* being overflown with data and/or it can recover on its own before
2845
* next scan request is submitted.
2846
*/
2847
spin_lock_bh(&ar->data_lock);
2848
if (ar->scan.state != ATH12K_SCAN_IDLE)
2849
__ath12k_mac_scan_finish(ar);
2850
spin_unlock_bh(&ar->data_lock);
2851
2852
return ret;
2853
}
2854
2855
static void ath12k_scan_abort(struct ath12k *ar)
2856
{
2857
int ret;
2858
2859
lockdep_assert_held(&ar->conf_mutex);
2860
2861
spin_lock_bh(&ar->data_lock);
2862
2863
switch (ar->scan.state) {
2864
case ATH12K_SCAN_IDLE:
2865
/* This can happen if timeout worker kicked in and called
2866
* abortion while scan completion was being processed.
2867
*/
2868
break;
2869
case ATH12K_SCAN_STARTING:
2870
case ATH12K_SCAN_ABORTING:
2871
ath12k_warn(ar->ab, "refusing scan abortion due to invalid scan state: %d\n",
2872
ar->scan.state);
2873
break;
2874
case ATH12K_SCAN_RUNNING:
2875
ar->scan.state = ATH12K_SCAN_ABORTING;
2876
spin_unlock_bh(&ar->data_lock);
2877
2878
ret = ath12k_scan_stop(ar);
2879
if (ret)
2880
ath12k_warn(ar->ab, "failed to abort scan: %d\n", ret);
2881
2882
spin_lock_bh(&ar->data_lock);
2883
break;
2884
}
2885
2886
spin_unlock_bh(&ar->data_lock);
2887
}
2888
2889
static void ath12k_scan_timeout_work(struct work_struct *work)
2890
{
2891
struct ath12k *ar = container_of(work, struct ath12k,
2892
scan.timeout.work);
2893
2894
mutex_lock(&ar->conf_mutex);
2895
ath12k_scan_abort(ar);
2896
mutex_unlock(&ar->conf_mutex);
2897
}
2898
2899
static int ath12k_start_scan(struct ath12k *ar,
2900
struct ath12k_wmi_scan_req_arg *arg)
2901
{
2902
int ret;
2903
2904
lockdep_assert_held(&ar->conf_mutex);
2905
2906
ret = ath12k_wmi_send_scan_start_cmd(ar, arg);
2907
if (ret)
2908
return ret;
2909
2910
ret = wait_for_completion_timeout(&ar->scan.started, 1 * HZ);
2911
if (ret == 0) {
2912
ret = ath12k_scan_stop(ar);
2913
if (ret)
2914
ath12k_warn(ar->ab, "failed to stop scan: %d\n", ret);
2915
2916
return -ETIMEDOUT;
2917
}
2918
2919
/* If we failed to start the scan, return error code at
2920
* this point. This is probably due to some issue in the
2921
* firmware, but no need to wedge the driver due to that...
2922
*/
2923
spin_lock_bh(&ar->data_lock);
2924
if (ar->scan.state == ATH12K_SCAN_IDLE) {
2925
spin_unlock_bh(&ar->data_lock);
2926
return -EINVAL;
2927
}
2928
spin_unlock_bh(&ar->data_lock);
2929
2930
return 0;
2931
}
2932
2933
static int ath12k_mac_op_hw_scan(struct ieee80211_hw *hw,
2934
struct ieee80211_vif *vif,
2935
struct ieee80211_scan_request *hw_req)
2936
{
2937
struct ath12k *ar = hw->priv;
2938
struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
2939
struct cfg80211_scan_request *req = &hw_req->req;
2940
struct ath12k_wmi_scan_req_arg arg = {};
2941
int ret;
2942
int i;
2943
2944
mutex_lock(&ar->conf_mutex);
2945
2946
spin_lock_bh(&ar->data_lock);
2947
switch (ar->scan.state) {
2948
case ATH12K_SCAN_IDLE:
2949
reinit_completion(&ar->scan.started);
2950
reinit_completion(&ar->scan.completed);
2951
ar->scan.state = ATH12K_SCAN_STARTING;
2952
ar->scan.is_roc = false;
2953
ar->scan.vdev_id = arvif->vdev_id;
2954
ret = 0;
2955
break;
2956
case ATH12K_SCAN_STARTING:
2957
case ATH12K_SCAN_RUNNING:
2958
case ATH12K_SCAN_ABORTING:
2959
ret = -EBUSY;
2960
break;
2961
}
2962
spin_unlock_bh(&ar->data_lock);
2963
2964
if (ret)
2965
goto exit;
2966
2967
ath12k_wmi_start_scan_init(ar, &arg);
2968
arg.vdev_id = arvif->vdev_id;
2969
arg.scan_id = ATH12K_SCAN_ID;
2970
2971
if (req->ie_len) {
2972
arg.extraie.ptr = kmemdup(req->ie, req->ie_len, GFP_KERNEL);
2973
if (!arg.extraie.ptr) {
2974
ret = -ENOMEM;
2975
goto exit;
2976
}
2977
arg.extraie.len = req->ie_len;
2978
}
2979
2980
if (req->n_ssids) {
2981
arg.num_ssids = req->n_ssids;
2982
for (i = 0; i < arg.num_ssids; i++)
2983
arg.ssid[i] = req->ssids[i];
2984
} else {
2985
arg.scan_flags |= WMI_SCAN_FLAG_PASSIVE;
2986
}
2987
2988
if (req->n_channels) {
2989
arg.num_chan = req->n_channels;
2990
arg.chan_list = kcalloc(arg.num_chan, sizeof(*arg.chan_list),
2991
GFP_KERNEL);
2992
2993
if (!arg.chan_list) {
2994
ret = -ENOMEM;
2995
goto exit;
2996
}
2997
2998
for (i = 0; i < arg.num_chan; i++)
2999
arg.chan_list[i] = req->channels[i]->center_freq;
3000
}
3001
3002
ret = ath12k_start_scan(ar, &arg);
3003
if (ret) {
3004
ath12k_warn(ar->ab, "failed to start hw scan: %d\n", ret);
3005
spin_lock_bh(&ar->data_lock);
3006
ar->scan.state = ATH12K_SCAN_IDLE;
3007
spin_unlock_bh(&ar->data_lock);
3008
}
3009
3010
/* Add a margin to account for event/command processing */
3011
ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
3012
msecs_to_jiffies(arg.max_scan_time +
3013
ATH12K_MAC_SCAN_TIMEOUT_MSECS));
3014
3015
exit:
3016
kfree(arg.chan_list);
3017
3018
if (req->ie_len)
3019
kfree(arg.extraie.ptr);
3020
3021
mutex_unlock(&ar->conf_mutex);
3022
return ret;
3023
}
3024
3025
static void ath12k_mac_op_cancel_hw_scan(struct ieee80211_hw *hw,
3026
struct ieee80211_vif *vif)
3027
{
3028
struct ath12k *ar = hw->priv;
3029
3030
mutex_lock(&ar->conf_mutex);
3031
ath12k_scan_abort(ar);
3032
mutex_unlock(&ar->conf_mutex);
3033
3034
cancel_delayed_work_sync(&ar->scan.timeout);
3035
}
3036
3037
static int ath12k_install_key(struct ath12k_vif *arvif,
3038
struct ieee80211_key_conf *key,
3039
enum set_key_cmd cmd,
3040
const u8 *macaddr, u32 flags)
3041
{
3042
int ret;
3043
struct ath12k *ar = arvif->ar;
3044
struct wmi_vdev_install_key_arg arg = {
3045
.vdev_id = arvif->vdev_id,
3046
.key_idx = key->keyidx,
3047
.key_len = key->keylen,
3048
.key_data = key->key,
3049
.key_flags = flags,
3050
.macaddr = macaddr,
3051
};
3052
3053
lockdep_assert_held(&arvif->ar->conf_mutex);
3054
3055
reinit_completion(&ar->install_key_done);
3056
3057
if (test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags))
3058
return 0;
3059
3060
if (cmd == DISABLE_KEY) {
3061
/* TODO: Check if FW expects value other than NONE for del */
3062
/* arg.key_cipher = WMI_CIPHER_NONE; */
3063
arg.key_len = 0;
3064
arg.key_data = NULL;
3065
goto install;
3066
}
3067
3068
switch (key->cipher) {
3069
case WLAN_CIPHER_SUITE_CCMP:
3070
arg.key_cipher = WMI_CIPHER_AES_CCM;
3071
/* TODO: Re-check if flag is valid */
3072
key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT;
3073
break;
3074
case WLAN_CIPHER_SUITE_TKIP:
3075
arg.key_cipher = WMI_CIPHER_TKIP;
3076
arg.key_txmic_len = 8;
3077
arg.key_rxmic_len = 8;
3078
break;
3079
case WLAN_CIPHER_SUITE_CCMP_256:
3080
arg.key_cipher = WMI_CIPHER_AES_CCM;
3081
break;
3082
case WLAN_CIPHER_SUITE_GCMP:
3083
case WLAN_CIPHER_SUITE_GCMP_256:
3084
arg.key_cipher = WMI_CIPHER_AES_GCM;
3085
break;
3086
default:
3087
ath12k_warn(ar->ab, "cipher %d is not supported\n", key->cipher);
3088
return -EOPNOTSUPP;
3089
}
3090
3091
if (test_bit(ATH12K_FLAG_RAW_MODE, &ar->ab->dev_flags))
3092
key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV |
3093
IEEE80211_KEY_FLAG_RESERVE_TAILROOM;
3094
3095
install:
3096
ret = ath12k_wmi_vdev_install_key(arvif->ar, &arg);
3097
3098
if (ret)
3099
return ret;
3100
3101
if (!wait_for_completion_timeout(&ar->install_key_done, 1 * HZ))
3102
return -ETIMEDOUT;
3103
3104
if (ether_addr_equal(macaddr, arvif->vif->addr))
3105
arvif->key_cipher = key->cipher;
3106
3107
return ar->install_key_status ? -EINVAL : 0;
3108
}
3109
3110
static int ath12k_clear_peer_keys(struct ath12k_vif *arvif,
3111
const u8 *addr)
3112
{
3113
struct ath12k *ar = arvif->ar;
3114
struct ath12k_base *ab = ar->ab;
3115
struct ath12k_peer *peer;
3116
int first_errno = 0;
3117
int ret;
3118
int i;
3119
u32 flags = 0;
3120
3121
lockdep_assert_held(&ar->conf_mutex);
3122
3123
spin_lock_bh(&ab->base_lock);
3124
peer = ath12k_peer_find(ab, arvif->vdev_id, addr);
3125
spin_unlock_bh(&ab->base_lock);
3126
3127
if (!peer)
3128
return -ENOENT;
3129
3130
for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
3131
if (!peer->keys[i])
3132
continue;
3133
3134
/* key flags are not required to delete the key */
3135
ret = ath12k_install_key(arvif, peer->keys[i],
3136
DISABLE_KEY, addr, flags);
3137
if (ret < 0 && first_errno == 0)
3138
first_errno = ret;
3139
3140
if (ret < 0)
3141
ath12k_warn(ab, "failed to remove peer key %d: %d\n",
3142
i, ret);
3143
3144
spin_lock_bh(&ab->base_lock);
3145
peer->keys[i] = NULL;
3146
spin_unlock_bh(&ab->base_lock);
3147
}
3148
3149
return first_errno;
3150
}
3151
3152
static int ath12k_mac_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
3153
struct ieee80211_vif *vif, struct ieee80211_sta *sta,
3154
struct ieee80211_key_conf *key)
3155
{
3156
struct ath12k *ar = hw->priv;
3157
struct ath12k_base *ab = ar->ab;
3158
struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
3159
struct ath12k_peer *peer;
3160
struct ath12k_sta *arsta;
3161
const u8 *peer_addr;
3162
int ret = 0;
3163
u32 flags = 0;
3164
3165
/* BIP needs to be done in software */
3166
if (key->cipher == WLAN_CIPHER_SUITE_AES_CMAC ||
3167
key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_128 ||
3168
key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_256 ||
3169
key->cipher == WLAN_CIPHER_SUITE_BIP_CMAC_256)
3170
return 1;
3171
3172
if (test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags))
3173
return 1;
3174
3175
if (key->keyidx > WMI_MAX_KEY_INDEX)
3176
return -ENOSPC;
3177
3178
mutex_lock(&ar->conf_mutex);
3179
3180
if (sta)
3181
peer_addr = sta->addr;
3182
else if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
3183
peer_addr = vif->bss_conf.bssid;
3184
else
3185
peer_addr = vif->addr;
3186
3187
key->hw_key_idx = key->keyidx;
3188
3189
/* the peer should not disappear in mid-way (unless FW goes awry) since
3190
* we already hold conf_mutex. we just make sure its there now.
3191
*/
3192
spin_lock_bh(&ab->base_lock);
3193
peer = ath12k_peer_find(ab, arvif->vdev_id, peer_addr);
3194
spin_unlock_bh(&ab->base_lock);
3195
3196
if (!peer) {
3197
if (cmd == SET_KEY) {
3198
ath12k_warn(ab, "cannot install key for non-existent peer %pM\n",
3199
peer_addr);
3200
ret = -EOPNOTSUPP;
3201
goto exit;
3202
} else {
3203
/* if the peer doesn't exist there is no key to disable
3204
* anymore
3205
*/
3206
goto exit;
3207
}
3208
}
3209
3210
if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
3211
flags |= WMI_KEY_PAIRWISE;
3212
else
3213
flags |= WMI_KEY_GROUP;
3214
3215
ret = ath12k_install_key(arvif, key, cmd, peer_addr, flags);
3216
if (ret) {
3217
ath12k_warn(ab, "ath12k_install_key failed (%d)\n", ret);
3218
goto exit;
3219
}
3220
3221
ret = ath12k_dp_rx_peer_pn_replay_config(arvif, peer_addr, cmd, key);
3222
if (ret) {
3223
ath12k_warn(ab, "failed to offload PN replay detection %d\n", ret);
3224
goto exit;
3225
}
3226
3227
spin_lock_bh(&ab->base_lock);
3228
peer = ath12k_peer_find(ab, arvif->vdev_id, peer_addr);
3229
if (peer && cmd == SET_KEY) {
3230
peer->keys[key->keyidx] = key;
3231
if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) {
3232
peer->ucast_keyidx = key->keyidx;
3233
peer->sec_type = ath12k_dp_tx_get_encrypt_type(key->cipher);
3234
} else {
3235
peer->mcast_keyidx = key->keyidx;
3236
peer->sec_type_grp = ath12k_dp_tx_get_encrypt_type(key->cipher);
3237
}
3238
} else if (peer && cmd == DISABLE_KEY) {
3239
peer->keys[key->keyidx] = NULL;
3240
if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
3241
peer->ucast_keyidx = 0;
3242
else
3243
peer->mcast_keyidx = 0;
3244
} else if (!peer)
3245
/* impossible unless FW goes crazy */
3246
ath12k_warn(ab, "peer %pM disappeared!\n", peer_addr);
3247
3248
if (sta) {
3249
arsta = (struct ath12k_sta *)sta->drv_priv;
3250
3251
switch (key->cipher) {
3252
case WLAN_CIPHER_SUITE_TKIP:
3253
case WLAN_CIPHER_SUITE_CCMP:
3254
case WLAN_CIPHER_SUITE_CCMP_256:
3255
case WLAN_CIPHER_SUITE_GCMP:
3256
case WLAN_CIPHER_SUITE_GCMP_256:
3257
if (cmd == SET_KEY)
3258
arsta->pn_type = HAL_PN_TYPE_WPA;
3259
else
3260
arsta->pn_type = HAL_PN_TYPE_NONE;
3261
break;
3262
default:
3263
arsta->pn_type = HAL_PN_TYPE_NONE;
3264
break;
3265
}
3266
}
3267
3268
spin_unlock_bh(&ab->base_lock);
3269
3270
exit:
3271
mutex_unlock(&ar->conf_mutex);
3272
return ret;
3273
}
3274
3275
static int
3276
ath12k_mac_bitrate_mask_num_vht_rates(struct ath12k *ar,
3277
enum nl80211_band band,
3278
const struct cfg80211_bitrate_mask *mask)
3279
{
3280
int num_rates = 0;
3281
int i;
3282
3283
for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++)
3284
num_rates += hweight16(mask->control[band].vht_mcs[i]);
3285
3286
return num_rates;
3287
}
3288
3289
static int
3290
ath12k_mac_set_peer_vht_fixed_rate(struct ath12k_vif *arvif,
3291
struct ieee80211_sta *sta,
3292
const struct cfg80211_bitrate_mask *mask,
3293
enum nl80211_band band)
3294
{
3295
struct ath12k *ar = arvif->ar;
3296
u8 vht_rate, nss;
3297
u32 rate_code;
3298
int ret, i;
3299
3300
lockdep_assert_held(&ar->conf_mutex);
3301
3302
nss = 0;
3303
3304
for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
3305
if (hweight16(mask->control[band].vht_mcs[i]) == 1) {
3306
nss = i + 1;
3307
vht_rate = ffs(mask->control[band].vht_mcs[i]) - 1;
3308
}
3309
}
3310
3311
if (!nss) {
3312
ath12k_warn(ar->ab, "No single VHT Fixed rate found to set for %pM",
3313
sta->addr);
3314
return -EINVAL;
3315
}
3316
3317
ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
3318
"Setting Fixed VHT Rate for peer %pM. Device will not switch to any other selected rates",
3319
sta->addr);
3320
3321
rate_code = ATH12K_HW_RATE_CODE(vht_rate, nss - 1,
3322
WMI_RATE_PREAMBLE_VHT);
3323
ret = ath12k_wmi_set_peer_param(ar, sta->addr,
3324
arvif->vdev_id,
3325
WMI_PEER_PARAM_FIXED_RATE,
3326
rate_code);
3327
if (ret)
3328
ath12k_warn(ar->ab,
3329
"failed to update STA %pM Fixed Rate %d: %d\n",
3330
sta->addr, rate_code, ret);
3331
3332
return ret;
3333
}
3334
3335
static int ath12k_station_assoc(struct ath12k *ar,
3336
struct ieee80211_vif *vif,
3337
struct ieee80211_sta *sta,
3338
bool reassoc)
3339
{
3340
struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
3341
struct ath12k_wmi_peer_assoc_arg peer_arg;
3342
int ret;
3343
struct cfg80211_chan_def def;
3344
enum nl80211_band band;
3345
struct cfg80211_bitrate_mask *mask;
3346
u8 num_vht_rates;
3347
3348
lockdep_assert_held(&ar->conf_mutex);
3349
3350
if (WARN_ON(ath12k_mac_vif_chan(vif, &def)))
3351
return -EPERM;
3352
3353
band = def.chan->band;
3354
mask = &arvif->bitrate_mask;
3355
3356
ath12k_peer_assoc_prepare(ar, vif, sta, &peer_arg, reassoc);
3357
3358
ret = ath12k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
3359
if (ret) {
3360
ath12k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n",
3361
sta->addr, arvif->vdev_id, ret);
3362
return ret;
3363
}
3364
3365
if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) {
3366
ath12k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
3367
sta->addr, arvif->vdev_id);
3368
return -ETIMEDOUT;
3369
}
3370
3371
num_vht_rates = ath12k_mac_bitrate_mask_num_vht_rates(ar, band, mask);
3372
3373
/* If single VHT rate is configured (by set_bitrate_mask()),
3374
* peer_assoc will disable VHT. This is now enabled by a peer specific
3375
* fixed param.
3376
* Note that all other rates and NSS will be disabled for this peer.
3377
*/
3378
if (sta->deflink.vht_cap.vht_supported && num_vht_rates == 1) {
3379
ret = ath12k_mac_set_peer_vht_fixed_rate(arvif, sta, mask,
3380
band);
3381
if (ret)
3382
return ret;
3383
}
3384
3385
/* Re-assoc is run only to update supported rates for given station. It
3386
* doesn't make much sense to reconfigure the peer completely.
3387
*/
3388
if (reassoc)
3389
return 0;
3390
3391
ret = ath12k_setup_peer_smps(ar, arvif, sta->addr,
3392
&sta->deflink.ht_cap);
3393
if (ret) {
3394
ath12k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n",
3395
arvif->vdev_id, ret);
3396
return ret;
3397
}
3398
3399
if (!sta->wme) {
3400
arvif->num_legacy_stations++;
3401
ret = ath12k_recalc_rtscts_prot(arvif);
3402
if (ret)
3403
return ret;
3404
}
3405
3406
if (sta->wme && sta->uapsd_queues) {
3407
ret = ath12k_peer_assoc_qos_ap(ar, arvif, sta);
3408
if (ret) {
3409
ath12k_warn(ar->ab, "failed to set qos params for STA %pM for vdev %i: %d\n",
3410
sta->addr, arvif->vdev_id, ret);
3411
return ret;
3412
}
3413
}
3414
3415
return 0;
3416
}
3417
3418
static int ath12k_station_disassoc(struct ath12k *ar,
3419
struct ieee80211_vif *vif,
3420
struct ieee80211_sta *sta)
3421
{
3422
struct ath12k_vif *arvif = (void *)vif->drv_priv;
3423
int ret;
3424
3425
lockdep_assert_held(&ar->conf_mutex);
3426
3427
if (!sta->wme) {
3428
arvif->num_legacy_stations--;
3429
ret = ath12k_recalc_rtscts_prot(arvif);
3430
if (ret)
3431
return ret;
3432
}
3433
3434
ret = ath12k_clear_peer_keys(arvif, sta->addr);
3435
if (ret) {
3436
ath12k_warn(ar->ab, "failed to clear all peer keys for vdev %i: %d\n",
3437
arvif->vdev_id, ret);
3438
return ret;
3439
}
3440
return 0;
3441
}
3442
3443
static void ath12k_sta_rc_update_wk(struct work_struct *wk)
3444
{
3445
struct ath12k *ar;
3446
struct ath12k_vif *arvif;
3447
struct ath12k_sta *arsta;
3448
struct ieee80211_sta *sta;
3449
struct cfg80211_chan_def def;
3450
enum nl80211_band band;
3451
const u8 *ht_mcs_mask;
3452
const u16 *vht_mcs_mask;
3453
u32 changed, bw, nss, smps, bw_prev;
3454
int err, num_vht_rates;
3455
const struct cfg80211_bitrate_mask *mask;
3456
struct ath12k_wmi_peer_assoc_arg peer_arg;
3457
enum wmi_phy_mode peer_phymode;
3458
3459
arsta = container_of(wk, struct ath12k_sta, update_wk);
3460
sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv);
3461
arvif = arsta->arvif;
3462
ar = arvif->ar;
3463
3464
if (WARN_ON(ath12k_mac_vif_chan(arvif->vif, &def)))
3465
return;
3466
3467
band = def.chan->band;
3468
ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
3469
vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
3470
3471
spin_lock_bh(&ar->data_lock);
3472
3473
changed = arsta->changed;
3474
arsta->changed = 0;
3475
3476
bw = arsta->bw;
3477
bw_prev = arsta->bw_prev;
3478
nss = arsta->nss;
3479
smps = arsta->smps;
3480
3481
spin_unlock_bh(&ar->data_lock);
3482
3483
mutex_lock(&ar->conf_mutex);
3484
3485
nss = max_t(u32, 1, nss);
3486
nss = min(nss, max(ath12k_mac_max_ht_nss(ht_mcs_mask),
3487
ath12k_mac_max_vht_nss(vht_mcs_mask)));
3488
3489
if (changed & IEEE80211_RC_BW_CHANGED) {
3490
ath12k_peer_assoc_h_phymode(ar, arvif->vif, sta, &peer_arg);
3491
peer_phymode = peer_arg.peer_phymode;
3492
3493
if (bw > bw_prev) {
3494
/* Phymode shows maximum supported channel width, if we
3495
* upgrade bandwidth then due to sanity check of firmware,
3496
* we have to send WMI_PEER_PHYMODE followed by
3497
* WMI_PEER_CHWIDTH
3498
*/
3499
ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac bandwidth upgrade for sta %pM new %d old %d\n",
3500
sta->addr, bw, bw_prev);
3501
err = ath12k_wmi_set_peer_param(ar, sta->addr,
3502
arvif->vdev_id, WMI_PEER_PHYMODE,
3503
peer_phymode);
3504
if (err) {
3505
ath12k_warn(ar->ab, "failed to update STA %pM to peer phymode %d: %d\n",
3506
sta->addr, peer_phymode, err);
3507
goto err_rc_bw_changed;
3508
}
3509
err = ath12k_wmi_set_peer_param(ar, sta->addr,
3510
arvif->vdev_id, WMI_PEER_CHWIDTH,
3511
bw);
3512
if (err)
3513
ath12k_warn(ar->ab, "failed to update STA %pM to peer bandwidth %d: %d\n",
3514
sta->addr, bw, err);
3515
} else {
3516
/* When we downgrade bandwidth this will conflict with phymode
3517
* and cause to trigger firmware crash. In this case we send
3518
* WMI_PEER_CHWIDTH followed by WMI_PEER_PHYMODE
3519
*/
3520
ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac bandwidth downgrade for sta %pM new %d old %d\n",
3521
sta->addr, bw, bw_prev);
3522
err = ath12k_wmi_set_peer_param(ar, sta->addr,
3523
arvif->vdev_id, WMI_PEER_CHWIDTH,
3524
bw);
3525
if (err) {
3526
ath12k_warn(ar->ab, "failed to update STA %pM peer to bandwidth %d: %d\n",
3527
sta->addr, bw, err);
3528
goto err_rc_bw_changed;
3529
}
3530
err = ath12k_wmi_set_peer_param(ar, sta->addr,
3531
arvif->vdev_id, WMI_PEER_PHYMODE,
3532
peer_phymode);
3533
if (err)
3534
ath12k_warn(ar->ab, "failed to update STA %pM to peer phymode %d: %d\n",
3535
sta->addr, peer_phymode, err);
3536
}
3537
}
3538
3539
if (changed & IEEE80211_RC_NSS_CHANGED) {
3540
ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac update sta %pM nss %d\n",
3541
sta->addr, nss);
3542
3543
err = ath12k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
3544
WMI_PEER_NSS, nss);
3545
if (err)
3546
ath12k_warn(ar->ab, "failed to update STA %pM nss %d: %d\n",
3547
sta->addr, nss, err);
3548
}
3549
3550
if (changed & IEEE80211_RC_SMPS_CHANGED) {
3551
ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac update sta %pM smps %d\n",
3552
sta->addr, smps);
3553
3554
err = ath12k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
3555
WMI_PEER_MIMO_PS_STATE, smps);
3556
if (err)
3557
ath12k_warn(ar->ab, "failed to update STA %pM smps %d: %d\n",
3558
sta->addr, smps, err);
3559
}
3560
3561
if (changed & IEEE80211_RC_SUPP_RATES_CHANGED) {
3562
mask = &arvif->bitrate_mask;
3563
num_vht_rates = ath12k_mac_bitrate_mask_num_vht_rates(ar, band,
3564
mask);
3565
3566
/* Peer_assoc_prepare will reject vht rates in
3567
* bitrate_mask if its not available in range format and
3568
* sets vht tx_rateset as unsupported. So multiple VHT MCS
3569
* setting(eg. MCS 4,5,6) per peer is not supported here.
3570
* But, Single rate in VHT mask can be set as per-peer
3571
* fixed rate. But even if any HT rates are configured in
3572
* the bitrate mask, device will not switch to those rates
3573
* when per-peer Fixed rate is set.
3574
* TODO: Check RATEMASK_CMDID to support auto rates selection
3575
* across HT/VHT and for multiple VHT MCS support.
3576
*/
3577
if (sta->deflink.vht_cap.vht_supported && num_vht_rates == 1) {
3578
ath12k_mac_set_peer_vht_fixed_rate(arvif, sta, mask,
3579
band);
3580
} else {
3581
/* If the peer is non-VHT or no fixed VHT rate
3582
* is provided in the new bitrate mask we set the
3583
* other rates using peer_assoc command.
3584
*/
3585
ath12k_peer_assoc_prepare(ar, arvif->vif, sta,
3586
&peer_arg, true);
3587
3588
err = ath12k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
3589
if (err)
3590
ath12k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n",
3591
sta->addr, arvif->vdev_id, err);
3592
3593
if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ))
3594
ath12k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
3595
sta->addr, arvif->vdev_id);
3596
}
3597
}
3598
err_rc_bw_changed:
3599
mutex_unlock(&ar->conf_mutex);
3600
}
3601
3602
static int ath12k_mac_inc_num_stations(struct ath12k_vif *arvif,
3603
struct ieee80211_sta *sta)
3604
{
3605
struct ath12k *ar = arvif->ar;
3606
3607
lockdep_assert_held(&ar->conf_mutex);
3608
3609
if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
3610
return 0;
3611
3612
if (ar->num_stations >= ar->max_num_stations)
3613
return -ENOBUFS;
3614
3615
ar->num_stations++;
3616
3617
return 0;
3618
}
3619
3620
static void ath12k_mac_dec_num_stations(struct ath12k_vif *arvif,
3621
struct ieee80211_sta *sta)
3622
{
3623
struct ath12k *ar = arvif->ar;
3624
3625
lockdep_assert_held(&ar->conf_mutex);
3626
3627
if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
3628
return;
3629
3630
ar->num_stations--;
3631
}
3632
3633
static int ath12k_mac_station_add(struct ath12k *ar,
3634
struct ieee80211_vif *vif,
3635
struct ieee80211_sta *sta)
3636
{
3637
struct ath12k_base *ab = ar->ab;
3638
struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
3639
struct ath12k_sta *arsta = (struct ath12k_sta *)sta->drv_priv;
3640
struct ath12k_wmi_peer_create_arg peer_param;
3641
int ret;
3642
3643
lockdep_assert_held(&ar->conf_mutex);
3644
3645
ret = ath12k_mac_inc_num_stations(arvif, sta);
3646
if (ret) {
3647
ath12k_warn(ab, "refusing to associate station: too many connected already (%d)\n",
3648
ar->max_num_stations);
3649
goto exit;
3650
}
3651
3652
arsta->rx_stats = kzalloc(sizeof(*arsta->rx_stats), GFP_KERNEL);
3653
if (!arsta->rx_stats) {
3654
ret = -ENOMEM;
3655
goto dec_num_station;
3656
}
3657
3658
peer_param.vdev_id = arvif->vdev_id;
3659
peer_param.peer_addr = sta->addr;
3660
peer_param.peer_type = WMI_PEER_TYPE_DEFAULT;
3661
3662
ret = ath12k_peer_create(ar, arvif, sta, &peer_param);
3663
if (ret) {
3664
ath12k_warn(ab, "Failed to add peer: %pM for VDEV: %d\n",
3665
sta->addr, arvif->vdev_id);
3666
goto free_peer;
3667
}
3668
3669
ath12k_dbg(ab, ATH12K_DBG_MAC, "Added peer: %pM for VDEV: %d\n",
3670
sta->addr, arvif->vdev_id);
3671
3672
if (ieee80211_vif_is_mesh(vif)) {
3673
ret = ath12k_wmi_set_peer_param(ar, sta->addr,
3674
arvif->vdev_id,
3675
WMI_PEER_USE_4ADDR, 1);
3676
if (ret) {
3677
ath12k_warn(ab, "failed to STA %pM 4addr capability: %d\n",
3678
sta->addr, ret);
3679
goto free_peer;
3680
}
3681
}
3682
3683
ret = ath12k_dp_peer_setup(ar, arvif->vdev_id, sta->addr);
3684
if (ret) {
3685
ath12k_warn(ab, "failed to setup dp for peer %pM on vdev %i (%d)\n",
3686
sta->addr, arvif->vdev_id, ret);
3687
goto free_peer;
3688
}
3689
3690
if (ab->hw_params->vdev_start_delay &&
3691
!arvif->is_started &&
3692
arvif->vdev_type != WMI_VDEV_TYPE_AP) {
3693
ret = ath12k_start_vdev_delay(ar->hw, vif);
3694
if (ret) {
3695
ath12k_warn(ab, "failed to delay vdev start: %d\n", ret);
3696
goto free_peer;
3697
}
3698
}
3699
3700
return 0;
3701
3702
free_peer:
3703
ath12k_peer_delete(ar, arvif->vdev_id, sta->addr);
3704
dec_num_station:
3705
ath12k_mac_dec_num_stations(arvif, sta);
3706
exit:
3707
return ret;
3708
}
3709
3710
static u32 ath12k_mac_ieee80211_sta_bw_to_wmi(struct ath12k *ar,
3711
struct ieee80211_sta *sta)
3712
{
3713
u32 bw = WMI_PEER_CHWIDTH_20MHZ;
3714
3715
switch (sta->deflink.bandwidth) {
3716
case IEEE80211_STA_RX_BW_20:
3717
bw = WMI_PEER_CHWIDTH_20MHZ;
3718
break;
3719
case IEEE80211_STA_RX_BW_40:
3720
bw = WMI_PEER_CHWIDTH_40MHZ;
3721
break;
3722
case IEEE80211_STA_RX_BW_80:
3723
bw = WMI_PEER_CHWIDTH_80MHZ;
3724
break;
3725
case IEEE80211_STA_RX_BW_160:
3726
bw = WMI_PEER_CHWIDTH_160MHZ;
3727
break;
3728
default:
3729
ath12k_warn(ar->ab, "Invalid bandwidth %d in rc update for %pM\n",
3730
sta->deflink.bandwidth, sta->addr);
3731
bw = WMI_PEER_CHWIDTH_20MHZ;
3732
break;
3733
}
3734
3735
return bw;
3736
}
3737
3738
static int ath12k_mac_op_sta_state(struct ieee80211_hw *hw,
3739
struct ieee80211_vif *vif,
3740
struct ieee80211_sta *sta,
3741
enum ieee80211_sta_state old_state,
3742
enum ieee80211_sta_state new_state)
3743
{
3744
struct ath12k *ar = hw->priv;
3745
struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
3746
struct ath12k_sta *arsta = (struct ath12k_sta *)sta->drv_priv;
3747
struct ath12k_peer *peer;
3748
int ret = 0;
3749
3750
/* cancel must be done outside the mutex to avoid deadlock */
3751
if ((old_state == IEEE80211_STA_NONE &&
3752
new_state == IEEE80211_STA_NOTEXIST))
3753
cancel_work_sync(&arsta->update_wk);
3754
3755
mutex_lock(&ar->conf_mutex);
3756
3757
if (old_state == IEEE80211_STA_NOTEXIST &&
3758
new_state == IEEE80211_STA_NONE) {
3759
memset(arsta, 0, sizeof(*arsta));
3760
arsta->arvif = arvif;
3761
INIT_WORK(&arsta->update_wk, ath12k_sta_rc_update_wk);
3762
3763
ret = ath12k_mac_station_add(ar, vif, sta);
3764
if (ret)
3765
ath12k_warn(ar->ab, "Failed to add station: %pM for VDEV: %d\n",
3766
sta->addr, arvif->vdev_id);
3767
} else if ((old_state == IEEE80211_STA_NONE &&
3768
new_state == IEEE80211_STA_NOTEXIST)) {
3769
ath12k_dp_peer_cleanup(ar, arvif->vdev_id, sta->addr);
3770
3771
ret = ath12k_peer_delete(ar, arvif->vdev_id, sta->addr);
3772
if (ret)
3773
ath12k_warn(ar->ab, "Failed to delete peer: %pM for VDEV: %d\n",
3774
sta->addr, arvif->vdev_id);
3775
else
3776
ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "Removed peer: %pM for VDEV: %d\n",
3777
sta->addr, arvif->vdev_id);
3778
3779
ath12k_mac_dec_num_stations(arvif, sta);
3780
spin_lock_bh(&ar->ab->base_lock);
3781
peer = ath12k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
3782
if (peer && peer->sta == sta) {
3783
ath12k_warn(ar->ab, "Found peer entry %pM n vdev %i after it was supposedly removed\n",
3784
vif->addr, arvif->vdev_id);
3785
peer->sta = NULL;
3786
list_del(&peer->list);
3787
kfree(peer);
3788
ar->num_peers--;
3789
}
3790
spin_unlock_bh(&ar->ab->base_lock);
3791
3792
kfree(arsta->rx_stats);
3793
arsta->rx_stats = NULL;
3794
} else if (old_state == IEEE80211_STA_AUTH &&
3795
new_state == IEEE80211_STA_ASSOC &&
3796
(vif->type == NL80211_IFTYPE_AP ||
3797
vif->type == NL80211_IFTYPE_MESH_POINT ||
3798
vif->type == NL80211_IFTYPE_ADHOC)) {
3799
ret = ath12k_station_assoc(ar, vif, sta, false);
3800
if (ret)
3801
ath12k_warn(ar->ab, "Failed to associate station: %pM\n",
3802
sta->addr);
3803
3804
spin_lock_bh(&ar->data_lock);
3805
3806
arsta->bw = ath12k_mac_ieee80211_sta_bw_to_wmi(ar, sta);
3807
arsta->bw_prev = sta->deflink.bandwidth;
3808
3809
spin_unlock_bh(&ar->data_lock);
3810
} else if (old_state == IEEE80211_STA_ASSOC &&
3811
new_state == IEEE80211_STA_AUTHORIZED) {
3812
spin_lock_bh(&ar->ab->base_lock);
3813
3814
peer = ath12k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
3815
if (peer)
3816
peer->is_authorized = true;
3817
3818
spin_unlock_bh(&ar->ab->base_lock);
3819
3820
if (vif->type == NL80211_IFTYPE_STATION && arvif->is_up) {
3821
ret = ath12k_wmi_set_peer_param(ar, sta->addr,
3822
arvif->vdev_id,
3823
WMI_PEER_AUTHORIZE,
3824
1);
3825
if (ret)
3826
ath12k_warn(ar->ab, "Unable to authorize peer %pM vdev %d: %d\n",
3827
sta->addr, arvif->vdev_id, ret);
3828
}
3829
} else if (old_state == IEEE80211_STA_AUTHORIZED &&
3830
new_state == IEEE80211_STA_ASSOC) {
3831
spin_lock_bh(&ar->ab->base_lock);
3832
3833
peer = ath12k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
3834
if (peer)
3835
peer->is_authorized = false;
3836
3837
spin_unlock_bh(&ar->ab->base_lock);
3838
} else if (old_state == IEEE80211_STA_ASSOC &&
3839
new_state == IEEE80211_STA_AUTH &&
3840
(vif->type == NL80211_IFTYPE_AP ||
3841
vif->type == NL80211_IFTYPE_MESH_POINT ||
3842
vif->type == NL80211_IFTYPE_ADHOC)) {
3843
ret = ath12k_station_disassoc(ar, vif, sta);
3844
if (ret)
3845
ath12k_warn(ar->ab, "Failed to disassociate station: %pM\n",
3846
sta->addr);
3847
}
3848
3849
mutex_unlock(&ar->conf_mutex);
3850
return ret;
3851
}
3852
3853
static int ath12k_mac_op_sta_set_txpwr(struct ieee80211_hw *hw,
3854
struct ieee80211_vif *vif,
3855
struct ieee80211_sta *sta)
3856
{
3857
struct ath12k *ar = hw->priv;
3858
struct ath12k_vif *arvif = (void *)vif->drv_priv;
3859
int ret;
3860
s16 txpwr;
3861
3862
if (sta->deflink.txpwr.type == NL80211_TX_POWER_AUTOMATIC) {
3863
txpwr = 0;
3864
} else {
3865
txpwr = sta->deflink.txpwr.power;
3866
if (!txpwr)
3867
return -EINVAL;
3868
}
3869
3870
if (txpwr > ATH12K_TX_POWER_MAX_VAL || txpwr < ATH12K_TX_POWER_MIN_VAL)
3871
return -EINVAL;
3872
3873
mutex_lock(&ar->conf_mutex);
3874
3875
ret = ath12k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
3876
WMI_PEER_USE_FIXED_PWR, txpwr);
3877
if (ret) {
3878
ath12k_warn(ar->ab, "failed to set tx power for station ret: %d\n",
3879
ret);
3880
goto out;
3881
}
3882
3883
out:
3884
mutex_unlock(&ar->conf_mutex);
3885
return ret;
3886
}
3887
3888
static void ath12k_mac_op_sta_rc_update(struct ieee80211_hw *hw,
3889
struct ieee80211_vif *vif,
3890
struct ieee80211_sta *sta,
3891
u32 changed)
3892
{
3893
struct ath12k *ar = hw->priv;
3894
struct ath12k_sta *arsta = (struct ath12k_sta *)sta->drv_priv;
3895
struct ath12k_vif *arvif = (void *)vif->drv_priv;
3896
struct ath12k_peer *peer;
3897
u32 bw, smps;
3898
3899
spin_lock_bh(&ar->ab->base_lock);
3900
3901
peer = ath12k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
3902
if (!peer) {
3903
spin_unlock_bh(&ar->ab->base_lock);
3904
ath12k_warn(ar->ab, "mac sta rc update failed to find peer %pM on vdev %i\n",
3905
sta->addr, arvif->vdev_id);
3906
return;
3907
}
3908
3909
spin_unlock_bh(&ar->ab->base_lock);
3910
3911
ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
3912
"mac sta rc update for %pM changed %08x bw %d nss %d smps %d\n",
3913
sta->addr, changed, sta->deflink.bandwidth, sta->deflink.rx_nss,
3914
sta->deflink.smps_mode);
3915
3916
spin_lock_bh(&ar->data_lock);
3917
3918
if (changed & IEEE80211_RC_BW_CHANGED) {
3919
bw = ath12k_mac_ieee80211_sta_bw_to_wmi(ar, sta);
3920
arsta->bw_prev = arsta->bw;
3921
arsta->bw = bw;
3922
}
3923
3924
if (changed & IEEE80211_RC_NSS_CHANGED)
3925
arsta->nss = sta->deflink.rx_nss;
3926
3927
if (changed & IEEE80211_RC_SMPS_CHANGED) {
3928
smps = WMI_PEER_SMPS_PS_NONE;
3929
3930
switch (sta->deflink.smps_mode) {
3931
case IEEE80211_SMPS_AUTOMATIC:
3932
case IEEE80211_SMPS_OFF:
3933
smps = WMI_PEER_SMPS_PS_NONE;
3934
break;
3935
case IEEE80211_SMPS_STATIC:
3936
smps = WMI_PEER_SMPS_STATIC;
3937
break;
3938
case IEEE80211_SMPS_DYNAMIC:
3939
smps = WMI_PEER_SMPS_DYNAMIC;
3940
break;
3941
default:
3942
ath12k_warn(ar->ab, "Invalid smps %d in sta rc update for %pM\n",
3943
sta->deflink.smps_mode, sta->addr);
3944
smps = WMI_PEER_SMPS_PS_NONE;
3945
break;
3946
}
3947
3948
arsta->smps = smps;
3949
}
3950
3951
arsta->changed |= changed;
3952
3953
spin_unlock_bh(&ar->data_lock);
3954
3955
ieee80211_queue_work(hw, &arsta->update_wk);
3956
}
3957
3958
static int ath12k_conf_tx_uapsd(struct ath12k *ar, struct ieee80211_vif *vif,
3959
u16 ac, bool enable)
3960
{
3961
struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
3962
u32 value;
3963
int ret;
3964
3965
if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
3966
return 0;
3967
3968
switch (ac) {
3969
case IEEE80211_AC_VO:
3970
value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN |
3971
WMI_STA_PS_UAPSD_AC3_TRIGGER_EN;
3972
break;
3973
case IEEE80211_AC_VI:
3974
value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN |
3975
WMI_STA_PS_UAPSD_AC2_TRIGGER_EN;
3976
break;
3977
case IEEE80211_AC_BE:
3978
value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN |
3979
WMI_STA_PS_UAPSD_AC1_TRIGGER_EN;
3980
break;
3981
case IEEE80211_AC_BK:
3982
value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN |
3983
WMI_STA_PS_UAPSD_AC0_TRIGGER_EN;
3984
break;
3985
}
3986
3987
if (enable)
3988
arvif->u.sta.uapsd |= value;
3989
else
3990
arvif->u.sta.uapsd &= ~value;
3991
3992
ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
3993
WMI_STA_PS_PARAM_UAPSD,
3994
arvif->u.sta.uapsd);
3995
if (ret) {
3996
ath12k_warn(ar->ab, "could not set uapsd params %d\n", ret);
3997
goto exit;
3998
}
3999
4000
if (arvif->u.sta.uapsd)
4001
value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD;
4002
else
4003
value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
4004
4005
ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
4006
WMI_STA_PS_PARAM_RX_WAKE_POLICY,
4007
value);
4008
if (ret)
4009
ath12k_warn(ar->ab, "could not set rx wake param %d\n", ret);
4010
4011
exit:
4012
return ret;
4013
}
4014
4015
static int ath12k_mac_op_conf_tx(struct ieee80211_hw *hw,
4016
struct ieee80211_vif *vif,
4017
unsigned int link_id, u16 ac,
4018
const struct ieee80211_tx_queue_params *params)
4019
{
4020
struct ath12k *ar = hw->priv;
4021
struct ath12k_vif *arvif = (void *)vif->drv_priv;
4022
struct wmi_wmm_params_arg *p = NULL;
4023
int ret;
4024
4025
mutex_lock(&ar->conf_mutex);
4026
4027
switch (ac) {
4028
case IEEE80211_AC_VO:
4029
p = &arvif->wmm_params.ac_vo;
4030
break;
4031
case IEEE80211_AC_VI:
4032
p = &arvif->wmm_params.ac_vi;
4033
break;
4034
case IEEE80211_AC_BE:
4035
p = &arvif->wmm_params.ac_be;
4036
break;
4037
case IEEE80211_AC_BK:
4038
p = &arvif->wmm_params.ac_bk;
4039
break;
4040
}
4041
4042
if (WARN_ON(!p)) {
4043
ret = -EINVAL;
4044
goto exit;
4045
}
4046
4047
p->cwmin = params->cw_min;
4048
p->cwmax = params->cw_max;
4049
p->aifs = params->aifs;
4050
p->txop = params->txop;
4051
4052
ret = ath12k_wmi_send_wmm_update_cmd(ar, arvif->vdev_id,
4053
&arvif->wmm_params);
4054
if (ret) {
4055
ath12k_warn(ar->ab, "failed to set wmm params: %d\n", ret);
4056
goto exit;
4057
}
4058
4059
ret = ath12k_conf_tx_uapsd(ar, vif, ac, params->uapsd);
4060
4061
if (ret)
4062
ath12k_warn(ar->ab, "failed to set sta uapsd: %d\n", ret);
4063
4064
exit:
4065
mutex_unlock(&ar->conf_mutex);
4066
return ret;
4067
}
4068
4069
static struct ieee80211_sta_ht_cap
4070
ath12k_create_ht_cap(struct ath12k *ar, u32 ar_ht_cap, u32 rate_cap_rx_chainmask)
4071
{
4072
int i;
4073
struct ieee80211_sta_ht_cap ht_cap = {0};
4074
u32 ar_vht_cap = ar->pdev->cap.vht_cap;
4075
4076
if (!(ar_ht_cap & WMI_HT_CAP_ENABLED))
4077
return ht_cap;
4078
4079
ht_cap.ht_supported = 1;
4080
ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
4081
ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_NONE;
4082
ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
4083
ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
4084
ht_cap.cap |= WLAN_HT_CAP_SM_PS_STATIC << IEEE80211_HT_CAP_SM_PS_SHIFT;
4085
4086
if (ar_ht_cap & WMI_HT_CAP_HT20_SGI)
4087
ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
4088
4089
if (ar_ht_cap & WMI_HT_CAP_HT40_SGI)
4090
ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
4091
4092
if (ar_ht_cap & WMI_HT_CAP_DYNAMIC_SMPS) {
4093
u32 smps;
4094
4095
smps = WLAN_HT_CAP_SM_PS_DYNAMIC;
4096
smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT;
4097
4098
ht_cap.cap |= smps;
4099
}
4100
4101
if (ar_ht_cap & WMI_HT_CAP_TX_STBC)
4102
ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC;
4103
4104
if (ar_ht_cap & WMI_HT_CAP_RX_STBC) {
4105
u32 stbc;
4106
4107
stbc = ar_ht_cap;
4108
stbc &= WMI_HT_CAP_RX_STBC;
4109
stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT;
4110
stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT;
4111
stbc &= IEEE80211_HT_CAP_RX_STBC;
4112
4113
ht_cap.cap |= stbc;
4114
}
4115
4116
if (ar_ht_cap & WMI_HT_CAP_RX_LDPC)
4117
ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
4118
4119
if (ar_ht_cap & WMI_HT_CAP_L_SIG_TXOP_PROT)
4120
ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
4121
4122
if (ar_vht_cap & WMI_VHT_CAP_MAX_MPDU_LEN_MASK)
4123
ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU;
4124
4125
for (i = 0; i < ar->num_rx_chains; i++) {
4126
if (rate_cap_rx_chainmask & BIT(i))
4127
ht_cap.mcs.rx_mask[i] = 0xFF;
4128
}
4129
4130
ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
4131
4132
return ht_cap;
4133
}
4134
4135
static int ath12k_mac_set_txbf_conf(struct ath12k_vif *arvif)
4136
{
4137
u32 value = 0;
4138
struct ath12k *ar = arvif->ar;
4139
int nsts;
4140
int sound_dim;
4141
u32 vht_cap = ar->pdev->cap.vht_cap;
4142
u32 vdev_param = WMI_VDEV_PARAM_TXBF;
4143
4144
if (vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)) {
4145
nsts = vht_cap & IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
4146
nsts >>= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
4147
value |= SM(nsts, WMI_TXBF_STS_CAP_OFFSET);
4148
}
4149
4150
if (vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)) {
4151
sound_dim = vht_cap &
4152
IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
4153
sound_dim >>= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
4154
if (sound_dim > (ar->num_tx_chains - 1))
4155
sound_dim = ar->num_tx_chains - 1;
4156
value |= SM(sound_dim, WMI_BF_SOUND_DIM_OFFSET);
4157
}
4158
4159
if (!value)
4160
return 0;
4161
4162
if (vht_cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE) {
4163
value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
4164
4165
if ((vht_cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE) &&
4166
arvif->vdev_type == WMI_VDEV_TYPE_AP)
4167
value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFER;
4168
}
4169
4170
if (vht_cap & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE) {
4171
value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
4172
4173
if ((vht_cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE) &&
4174
arvif->vdev_type == WMI_VDEV_TYPE_STA)
4175
value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFEE;
4176
}
4177
4178
return ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4179
vdev_param, value);
4180
}
4181
4182
static void ath12k_set_vht_txbf_cap(struct ath12k *ar, u32 *vht_cap)
4183
{
4184
bool subfer, subfee;
4185
int sound_dim = 0;
4186
4187
subfer = !!(*vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE));
4188
subfee = !!(*vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE));
4189
4190
if (ar->num_tx_chains < 2) {
4191
*vht_cap &= ~(IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE);
4192
subfer = false;
4193
}
4194
4195
/* If SU Beaformer is not set, then disable MU Beamformer Capability */
4196
if (!subfer)
4197
*vht_cap &= ~(IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE);
4198
4199
/* If SU Beaformee is not set, then disable MU Beamformee Capability */
4200
if (!subfee)
4201
*vht_cap &= ~(IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE);
4202
4203
sound_dim = u32_get_bits(*vht_cap,
4204
IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK);
4205
*vht_cap = u32_replace_bits(*vht_cap, 0,
4206
IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK);
4207
4208
/* TODO: Need to check invalid STS and Sound_dim values set by FW? */
4209
4210
/* Enable Sounding Dimension Field only if SU BF is enabled */
4211
if (subfer) {
4212
if (sound_dim > (ar->num_tx_chains - 1))
4213
sound_dim = ar->num_tx_chains - 1;
4214
4215
*vht_cap = u32_replace_bits(*vht_cap, sound_dim,
4216
IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK);
4217
}
4218
4219
/* Use the STS advertised by FW unless SU Beamformee is not supported*/
4220
if (!subfee)
4221
*vht_cap &= ~(IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK);
4222
}
4223
4224
static struct ieee80211_sta_vht_cap
4225
ath12k_create_vht_cap(struct ath12k *ar, u32 rate_cap_tx_chainmask,
4226
u32 rate_cap_rx_chainmask)
4227
{
4228
struct ieee80211_sta_vht_cap vht_cap = {0};
4229
u16 txmcs_map, rxmcs_map;
4230
int i;
4231
4232
vht_cap.vht_supported = 1;
4233
vht_cap.cap = ar->pdev->cap.vht_cap;
4234
4235
ath12k_set_vht_txbf_cap(ar, &vht_cap.cap);
4236
4237
/* TODO: Enable back VHT160 mode once association issues are fixed */
4238
/* Disabling VHT160 and VHT80+80 modes */
4239
vht_cap.cap &= ~IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK;
4240
vht_cap.cap &= ~IEEE80211_VHT_CAP_SHORT_GI_160;
4241
4242
rxmcs_map = 0;
4243
txmcs_map = 0;
4244
for (i = 0; i < 8; i++) {
4245
if (i < ar->num_tx_chains && rate_cap_tx_chainmask & BIT(i))
4246
txmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
4247
else
4248
txmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
4249
4250
if (i < ar->num_rx_chains && rate_cap_rx_chainmask & BIT(i))
4251
rxmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
4252
else
4253
rxmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
4254
}
4255
4256
if (rate_cap_tx_chainmask <= 1)
4257
vht_cap.cap &= ~IEEE80211_VHT_CAP_TXSTBC;
4258
4259
vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(rxmcs_map);
4260
vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(txmcs_map);
4261
4262
return vht_cap;
4263
}
4264
4265
static void ath12k_mac_setup_ht_vht_cap(struct ath12k *ar,
4266
struct ath12k_pdev_cap *cap,
4267
u32 *ht_cap_info)
4268
{
4269
struct ieee80211_supported_band *band;
4270
u32 rate_cap_tx_chainmask;
4271
u32 rate_cap_rx_chainmask;
4272
u32 ht_cap;
4273
4274
rate_cap_tx_chainmask = ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift;
4275
rate_cap_rx_chainmask = ar->cfg_rx_chainmask >> cap->rx_chain_mask_shift;
4276
4277
if (cap->supported_bands & WMI_HOST_WLAN_2G_CAP) {
4278
band = &ar->mac.sbands[NL80211_BAND_2GHZ];
4279
ht_cap = cap->band[NL80211_BAND_2GHZ].ht_cap_info;
4280
if (ht_cap_info)
4281
*ht_cap_info = ht_cap;
4282
band->ht_cap = ath12k_create_ht_cap(ar, ht_cap,
4283
rate_cap_rx_chainmask);
4284
}
4285
4286
if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP &&
4287
(ar->ab->hw_params->single_pdev_only ||
4288
!ar->supports_6ghz)) {
4289
band = &ar->mac.sbands[NL80211_BAND_5GHZ];
4290
ht_cap = cap->band[NL80211_BAND_5GHZ].ht_cap_info;
4291
if (ht_cap_info)
4292
*ht_cap_info = ht_cap;
4293
band->ht_cap = ath12k_create_ht_cap(ar, ht_cap,
4294
rate_cap_rx_chainmask);
4295
band->vht_cap = ath12k_create_vht_cap(ar, rate_cap_tx_chainmask,
4296
rate_cap_rx_chainmask);
4297
}
4298
}
4299
4300
static int ath12k_check_chain_mask(struct ath12k *ar, u32 ant, bool is_tx_ant)
4301
{
4302
/* TODO: Check the request chainmask against the supported
4303
* chainmask table which is advertised in extented_service_ready event
4304
*/
4305
4306
return 0;
4307
}
4308
4309
static void ath12k_gen_ppe_thresh(struct ath12k_wmi_ppe_threshold_arg *fw_ppet,
4310
u8 *he_ppet)
4311
{
4312
int nss, ru;
4313
u8 bit = 7;
4314
4315
he_ppet[0] = fw_ppet->numss_m1 & IEEE80211_PPE_THRES_NSS_MASK;
4316
he_ppet[0] |= (fw_ppet->ru_bit_mask <<
4317
IEEE80211_PPE_THRES_RU_INDEX_BITMASK_POS) &
4318
IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK;
4319
for (nss = 0; nss <= fw_ppet->numss_m1; nss++) {
4320
for (ru = 0; ru < 4; ru++) {
4321
u8 val;
4322
int i;
4323
4324
if ((fw_ppet->ru_bit_mask & BIT(ru)) == 0)
4325
continue;
4326
val = (fw_ppet->ppet16_ppet8_ru3_ru0[nss] >> (ru * 6)) &
4327
0x3f;
4328
val = ((val >> 3) & 0x7) | ((val & 0x7) << 3);
4329
for (i = 5; i >= 0; i--) {
4330
he_ppet[bit / 8] |=
4331
((val >> i) & 0x1) << ((bit % 8));
4332
bit++;
4333
}
4334
}
4335
}
4336
}
4337
4338
static void
4339
ath12k_mac_filter_he_cap_mesh(struct ieee80211_he_cap_elem *he_cap_elem)
4340
{
4341
u8 m;
4342
4343
m = IEEE80211_HE_MAC_CAP0_TWT_RES |
4344
IEEE80211_HE_MAC_CAP0_TWT_REQ;
4345
he_cap_elem->mac_cap_info[0] &= ~m;
4346
4347
m = IEEE80211_HE_MAC_CAP2_TRS |
4348
IEEE80211_HE_MAC_CAP2_BCAST_TWT |
4349
IEEE80211_HE_MAC_CAP2_MU_CASCADING;
4350
he_cap_elem->mac_cap_info[2] &= ~m;
4351
4352
m = IEEE80211_HE_MAC_CAP3_FLEX_TWT_SCHED |
4353
IEEE80211_HE_MAC_CAP2_BCAST_TWT |
4354
IEEE80211_HE_MAC_CAP2_MU_CASCADING;
4355
he_cap_elem->mac_cap_info[3] &= ~m;
4356
4357
m = IEEE80211_HE_MAC_CAP4_BSRP_BQRP_A_MPDU_AGG |
4358
IEEE80211_HE_MAC_CAP4_BQR;
4359
he_cap_elem->mac_cap_info[4] &= ~m;
4360
4361
m = IEEE80211_HE_MAC_CAP5_SUBCHAN_SELECTIVE_TRANSMISSION |
4362
IEEE80211_HE_MAC_CAP5_UL_2x996_TONE_RU |
4363
IEEE80211_HE_MAC_CAP5_PUNCTURED_SOUNDING |
4364
IEEE80211_HE_MAC_CAP5_HT_VHT_TRIG_FRAME_RX;
4365
he_cap_elem->mac_cap_info[5] &= ~m;
4366
4367
m = IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO |
4368
IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO;
4369
he_cap_elem->phy_cap_info[2] &= ~m;
4370
4371
m = IEEE80211_HE_PHY_CAP3_RX_PARTIAL_BW_SU_IN_20MHZ_MU |
4372
IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK |
4373
IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_MASK;
4374
he_cap_elem->phy_cap_info[3] &= ~m;
4375
4376
m = IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER;
4377
he_cap_elem->phy_cap_info[4] &= ~m;
4378
4379
m = IEEE80211_HE_PHY_CAP5_NG16_MU_FEEDBACK;
4380
he_cap_elem->phy_cap_info[5] &= ~m;
4381
4382
m = IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_75_MU |
4383
IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB |
4384
IEEE80211_HE_PHY_CAP6_TRIG_CQI_FB |
4385
IEEE80211_HE_PHY_CAP6_PARTIAL_BANDWIDTH_DL_MUMIMO;
4386
he_cap_elem->phy_cap_info[6] &= ~m;
4387
4388
m = IEEE80211_HE_PHY_CAP7_PSR_BASED_SR |
4389
IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_SUPP |
4390
IEEE80211_HE_PHY_CAP7_STBC_TX_ABOVE_80MHZ |
4391
IEEE80211_HE_PHY_CAP7_STBC_RX_ABOVE_80MHZ;
4392
he_cap_elem->phy_cap_info[7] &= ~m;
4393
4394
m = IEEE80211_HE_PHY_CAP8_HE_ER_SU_PPDU_4XLTF_AND_08_US_GI |
4395
IEEE80211_HE_PHY_CAP8_20MHZ_IN_40MHZ_HE_PPDU_IN_2G |
4396
IEEE80211_HE_PHY_CAP8_20MHZ_IN_160MHZ_HE_PPDU |
4397
IEEE80211_HE_PHY_CAP8_80MHZ_IN_160MHZ_HE_PPDU;
4398
he_cap_elem->phy_cap_info[8] &= ~m;
4399
4400
m = IEEE80211_HE_PHY_CAP9_LONGER_THAN_16_SIGB_OFDM_SYM |
4401
IEEE80211_HE_PHY_CAP9_NON_TRIGGERED_CQI_FEEDBACK |
4402
IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU |
4403
IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU |
4404
IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_COMP_SIGB |
4405
IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_NON_COMP_SIGB;
4406
he_cap_elem->phy_cap_info[9] &= ~m;
4407
}
4408
4409
static __le16 ath12k_mac_setup_he_6ghz_cap(struct ath12k_pdev_cap *pcap,
4410
struct ath12k_band_cap *bcap)
4411
{
4412
u8 val;
4413
4414
bcap->he_6ghz_capa = IEEE80211_HT_MPDU_DENSITY_NONE;
4415
if (bcap->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS)
4416
bcap->he_6ghz_capa |=
4417
u32_encode_bits(WLAN_HT_CAP_SM_PS_DYNAMIC,
4418
IEEE80211_HE_6GHZ_CAP_SM_PS);
4419
else
4420
bcap->he_6ghz_capa |=
4421
u32_encode_bits(WLAN_HT_CAP_SM_PS_DISABLED,
4422
IEEE80211_HE_6GHZ_CAP_SM_PS);
4423
val = u32_get_bits(pcap->vht_cap,
4424
IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK);
4425
bcap->he_6ghz_capa |=
4426
u32_encode_bits(val, IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP);
4427
val = u32_get_bits(pcap->vht_cap,
4428
IEEE80211_VHT_CAP_MAX_MPDU_MASK);
4429
bcap->he_6ghz_capa |=
4430
u32_encode_bits(val, IEEE80211_HE_6GHZ_CAP_MAX_MPDU_LEN);
4431
if (pcap->vht_cap & IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN)
4432
bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_RX_ANTPAT_CONS;
4433
if (pcap->vht_cap & IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN)
4434
bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_TX_ANTPAT_CONS;
4435
4436
return cpu_to_le16(bcap->he_6ghz_capa);
4437
}
4438
4439
static void ath12k_mac_copy_he_cap(struct ath12k_band_cap *band_cap,
4440
int iftype, u8 num_tx_chains,
4441
struct ieee80211_sta_he_cap *he_cap)
4442
{
4443
struct ieee80211_he_cap_elem *he_cap_elem = &he_cap->he_cap_elem;
4444
struct ieee80211_he_mcs_nss_supp *mcs_nss = &he_cap->he_mcs_nss_supp;
4445
4446
he_cap->has_he = true;
4447
memcpy(he_cap_elem->mac_cap_info, band_cap->he_cap_info,
4448
sizeof(he_cap_elem->mac_cap_info));
4449
memcpy(he_cap_elem->phy_cap_info, band_cap->he_cap_phy_info,
4450
sizeof(he_cap_elem->phy_cap_info));
4451
4452
he_cap_elem->mac_cap_info[1] &=
4453
IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_MASK;
4454
4455
he_cap_elem->phy_cap_info[5] &=
4456
~IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK;
4457
he_cap_elem->phy_cap_info[5] &=
4458
~IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_MASK;
4459
he_cap_elem->phy_cap_info[5] |= num_tx_chains - 1;
4460
4461
switch (iftype) {
4462
case NL80211_IFTYPE_AP:
4463
he_cap_elem->phy_cap_info[3] &=
4464
~IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK;
4465
he_cap_elem->phy_cap_info[9] |=
4466
IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU;
4467
break;
4468
case NL80211_IFTYPE_STATION:
4469
he_cap_elem->mac_cap_info[0] &= ~IEEE80211_HE_MAC_CAP0_TWT_RES;
4470
he_cap_elem->mac_cap_info[0] |= IEEE80211_HE_MAC_CAP0_TWT_REQ;
4471
he_cap_elem->phy_cap_info[9] |=
4472
IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU;
4473
break;
4474
case NL80211_IFTYPE_MESH_POINT:
4475
ath12k_mac_filter_he_cap_mesh(he_cap_elem);
4476
break;
4477
}
4478
4479
mcs_nss->rx_mcs_80 = cpu_to_le16(band_cap->he_mcs & 0xffff);
4480
mcs_nss->tx_mcs_80 = cpu_to_le16(band_cap->he_mcs & 0xffff);
4481
mcs_nss->rx_mcs_160 = cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
4482
mcs_nss->tx_mcs_160 = cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
4483
mcs_nss->rx_mcs_80p80 = cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
4484
mcs_nss->tx_mcs_80p80 = cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
4485
4486
memset(he_cap->ppe_thres, 0, sizeof(he_cap->ppe_thres));
4487
if (he_cap_elem->phy_cap_info[6] &
4488
IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT)
4489
ath12k_gen_ppe_thresh(&band_cap->he_ppet, he_cap->ppe_thres);
4490
}
4491
4492
static void
4493
ath12k_mac_copy_eht_mcs_nss(struct ath12k_band_cap *band_cap,
4494
struct ieee80211_eht_mcs_nss_supp *mcs_nss,
4495
const struct ieee80211_he_cap_elem *he_cap,
4496
const struct ieee80211_eht_cap_elem_fixed *eht_cap)
4497
{
4498
if ((he_cap->phy_cap_info[0] &
4499
(IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G |
4500
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G |
4501
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G |
4502
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)) == 0)
4503
memcpy(&mcs_nss->only_20mhz, &band_cap->eht_mcs_20_only,
4504
sizeof(struct ieee80211_eht_mcs_nss_supp_20mhz_only));
4505
4506
if (he_cap->phy_cap_info[0] &
4507
(IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G |
4508
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G))
4509
memcpy(&mcs_nss->bw._80, &band_cap->eht_mcs_80,
4510
sizeof(struct ieee80211_eht_mcs_nss_supp_bw));
4511
4512
if (he_cap->phy_cap_info[0] &
4513
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
4514
memcpy(&mcs_nss->bw._160, &band_cap->eht_mcs_160,
4515
sizeof(struct ieee80211_eht_mcs_nss_supp_bw));
4516
4517
if (eht_cap->phy_cap_info[0] & IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ)
4518
memcpy(&mcs_nss->bw._320, &band_cap->eht_mcs_320,
4519
sizeof(struct ieee80211_eht_mcs_nss_supp_bw));
4520
}
4521
4522
static void ath12k_mac_copy_eht_ppe_thresh(struct ath12k_wmi_ppe_threshold_arg *fw_ppet,
4523
struct ieee80211_sta_eht_cap *cap)
4524
{
4525
u16 bit = IEEE80211_EHT_PPE_THRES_INFO_HEADER_SIZE;
4526
u8 i, nss, ru, ppet_bit_len_per_ru = IEEE80211_EHT_PPE_THRES_INFO_PPET_SIZE * 2;
4527
4528
u8p_replace_bits(&cap->eht_ppe_thres[0], fw_ppet->numss_m1,
4529
IEEE80211_EHT_PPE_THRES_NSS_MASK);
4530
4531
u16p_replace_bits((u16 *)&cap->eht_ppe_thres[0], fw_ppet->ru_bit_mask,
4532
IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK);
4533
4534
for (nss = 0; nss <= fw_ppet->numss_m1; nss++) {
4535
for (ru = 0;
4536
ru < hweight16(IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK);
4537
ru++) {
4538
u32 val = 0;
4539
4540
if ((fw_ppet->ru_bit_mask & BIT(ru)) == 0)
4541
continue;
4542
4543
u32p_replace_bits(&val, fw_ppet->ppet16_ppet8_ru3_ru0[nss] >>
4544
(ru * ppet_bit_len_per_ru),
4545
GENMASK(ppet_bit_len_per_ru - 1, 0));
4546
4547
for (i = 0; i < ppet_bit_len_per_ru; i++) {
4548
cap->eht_ppe_thres[bit / 8] |=
4549
(((val >> i) & 0x1) << ((bit % 8)));
4550
bit++;
4551
}
4552
}
4553
}
4554
}
4555
4556
static void ath12k_mac_copy_eht_cap(struct ath12k_band_cap *band_cap,
4557
struct ieee80211_he_cap_elem *he_cap_elem,
4558
int iftype,
4559
struct ieee80211_sta_eht_cap *eht_cap)
4560
{
4561
struct ieee80211_eht_cap_elem_fixed *eht_cap_elem = &eht_cap->eht_cap_elem;
4562
4563
memset(eht_cap, 0, sizeof(struct ieee80211_sta_eht_cap));
4564
eht_cap->has_eht = true;
4565
memcpy(eht_cap_elem->mac_cap_info, band_cap->eht_cap_mac_info,
4566
sizeof(eht_cap_elem->mac_cap_info));
4567
memcpy(eht_cap_elem->phy_cap_info, band_cap->eht_cap_phy_info,
4568
sizeof(eht_cap_elem->phy_cap_info));
4569
4570
switch (iftype) {
4571
case NL80211_IFTYPE_AP:
4572
eht_cap_elem->phy_cap_info[0] &=
4573
~IEEE80211_EHT_PHY_CAP0_242_TONE_RU_GT20MHZ;
4574
eht_cap_elem->phy_cap_info[4] &=
4575
~IEEE80211_EHT_PHY_CAP4_PART_BW_DL_MU_MIMO;
4576
eht_cap_elem->phy_cap_info[5] &=
4577
~IEEE80211_EHT_PHY_CAP5_TX_LESS_242_TONE_RU_SUPP;
4578
break;
4579
case NL80211_IFTYPE_STATION:
4580
eht_cap_elem->phy_cap_info[7] &=
4581
~(IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_80MHZ |
4582
IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_160MHZ |
4583
IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_320MHZ);
4584
eht_cap_elem->phy_cap_info[7] &=
4585
~(IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_80MHZ |
4586
IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_160MHZ |
4587
IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_320MHZ);
4588
break;
4589
default:
4590
break;
4591
}
4592
4593
ath12k_mac_copy_eht_mcs_nss(band_cap, &eht_cap->eht_mcs_nss_supp,
4594
he_cap_elem, eht_cap_elem);
4595
4596
if (eht_cap_elem->phy_cap_info[5] &
4597
IEEE80211_EHT_PHY_CAP5_PPE_THRESHOLD_PRESENT)
4598
ath12k_mac_copy_eht_ppe_thresh(&band_cap->eht_ppet, eht_cap);
4599
}
4600
4601
static int ath12k_mac_copy_sband_iftype_data(struct ath12k *ar,
4602
struct ath12k_pdev_cap *cap,
4603
struct ieee80211_sband_iftype_data *data,
4604
int band)
4605
{
4606
struct ath12k_band_cap *band_cap = &cap->band[band];
4607
int i, idx = 0;
4608
4609
for (i = 0; i < NUM_NL80211_IFTYPES; i++) {
4610
struct ieee80211_sta_he_cap *he_cap = &data[idx].he_cap;
4611
4612
switch (i) {
4613
case NL80211_IFTYPE_STATION:
4614
case NL80211_IFTYPE_AP:
4615
case NL80211_IFTYPE_MESH_POINT:
4616
break;
4617
4618
default:
4619
continue;
4620
}
4621
4622
data[idx].types_mask = BIT(i);
4623
4624
ath12k_mac_copy_he_cap(band_cap, i, ar->num_tx_chains, he_cap);
4625
if (band == NL80211_BAND_6GHZ) {
4626
data[idx].he_6ghz_capa.capa =
4627
ath12k_mac_setup_he_6ghz_cap(cap, band_cap);
4628
}
4629
ath12k_mac_copy_eht_cap(band_cap, &he_cap->he_cap_elem, i,
4630
&data[idx].eht_cap);
4631
idx++;
4632
}
4633
4634
return idx;
4635
}
4636
4637
static void ath12k_mac_setup_sband_iftype_data(struct ath12k *ar,
4638
struct ath12k_pdev_cap *cap)
4639
{
4640
struct ieee80211_supported_band *sband;
4641
enum nl80211_band band;
4642
int count;
4643
4644
if (cap->supported_bands & WMI_HOST_WLAN_2G_CAP) {
4645
band = NL80211_BAND_2GHZ;
4646
count = ath12k_mac_copy_sband_iftype_data(ar, cap,
4647
ar->mac.iftype[band],
4648
band);
4649
sband = &ar->mac.sbands[band];
4650
sband->iftype_data = ar->mac.iftype[band];
4651
sband->n_iftype_data = count;
4652
}
4653
4654
if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP) {
4655
band = NL80211_BAND_5GHZ;
4656
count = ath12k_mac_copy_sband_iftype_data(ar, cap,
4657
ar->mac.iftype[band],
4658
band);
4659
sband = &ar->mac.sbands[band];
4660
sband->iftype_data = ar->mac.iftype[band];
4661
sband->n_iftype_data = count;
4662
}
4663
4664
if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP &&
4665
ar->supports_6ghz) {
4666
band = NL80211_BAND_6GHZ;
4667
count = ath12k_mac_copy_sband_iftype_data(ar, cap,
4668
ar->mac.iftype[band],
4669
band);
4670
sband = &ar->mac.sbands[band];
4671
sband->iftype_data = ar->mac.iftype[band];
4672
sband->n_iftype_data = count;
4673
}
4674
}
4675
4676
static int __ath12k_set_antenna(struct ath12k *ar, u32 tx_ant, u32 rx_ant)
4677
{
4678
int ret;
4679
4680
lockdep_assert_held(&ar->conf_mutex);
4681
4682
if (ath12k_check_chain_mask(ar, tx_ant, true))
4683
return -EINVAL;
4684
4685
if (ath12k_check_chain_mask(ar, rx_ant, false))
4686
return -EINVAL;
4687
4688
ar->cfg_tx_chainmask = tx_ant;
4689
ar->cfg_rx_chainmask = rx_ant;
4690
4691
if (ar->state != ATH12K_STATE_ON &&
4692
ar->state != ATH12K_STATE_RESTARTED)
4693
return 0;
4694
4695
ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_TX_CHAIN_MASK,
4696
tx_ant, ar->pdev->pdev_id);
4697
if (ret) {
4698
ath12k_warn(ar->ab, "failed to set tx-chainmask: %d, req 0x%x\n",
4699
ret, tx_ant);
4700
return ret;
4701
}
4702
4703
ar->num_tx_chains = hweight32(tx_ant);
4704
4705
ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_RX_CHAIN_MASK,
4706
rx_ant, ar->pdev->pdev_id);
4707
if (ret) {
4708
ath12k_warn(ar->ab, "failed to set rx-chainmask: %d, req 0x%x\n",
4709
ret, rx_ant);
4710
return ret;
4711
}
4712
4713
ar->num_rx_chains = hweight32(rx_ant);
4714
4715
/* Reload HT/VHT/HE capability */
4716
ath12k_mac_setup_ht_vht_cap(ar, &ar->pdev->cap, NULL);
4717
ath12k_mac_setup_sband_iftype_data(ar, &ar->pdev->cap);
4718
4719
return 0;
4720
}
4721
4722
static void ath12k_mgmt_over_wmi_tx_drop(struct ath12k *ar, struct sk_buff *skb)
4723
{
4724
int num_mgmt;
4725
4726
ieee80211_free_txskb(ar->hw, skb);
4727
4728
num_mgmt = atomic_dec_if_positive(&ar->num_pending_mgmt_tx);
4729
4730
if (num_mgmt < 0)
4731
WARN_ON_ONCE(1);
4732
4733
if (!num_mgmt)
4734
wake_up(&ar->txmgmt_empty_waitq);
4735
}
4736
4737
int ath12k_mac_tx_mgmt_pending_free(int buf_id, void *skb, void *ctx)
4738
{
4739
struct sk_buff *msdu = skb;
4740
struct ieee80211_tx_info *info;
4741
struct ath12k *ar = ctx;
4742
struct ath12k_base *ab = ar->ab;
4743
4744
spin_lock_bh(&ar->txmgmt_idr_lock);
4745
idr_remove(&ar->txmgmt_idr, buf_id);
4746
spin_unlock_bh(&ar->txmgmt_idr_lock);
4747
dma_unmap_single(ab->dev, ATH12K_SKB_CB(msdu)->paddr, msdu->len,
4748
DMA_TO_DEVICE);
4749
4750
info = IEEE80211_SKB_CB(msdu);
4751
memset(&info->status, 0, sizeof(info->status));
4752
4753
ath12k_mgmt_over_wmi_tx_drop(ar, skb);
4754
4755
return 0;
4756
}
4757
4758
static int ath12k_mac_vif_txmgmt_idr_remove(int buf_id, void *skb, void *ctx)
4759
{
4760
struct ieee80211_vif *vif = ctx;
4761
struct ath12k_skb_cb *skb_cb = ATH12K_SKB_CB(skb);
4762
struct sk_buff *msdu = skb;
4763
struct ath12k *ar = skb_cb->ar;
4764
struct ath12k_base *ab = ar->ab;
4765
4766
if (skb_cb->vif == vif) {
4767
spin_lock_bh(&ar->txmgmt_idr_lock);
4768
idr_remove(&ar->txmgmt_idr, buf_id);
4769
spin_unlock_bh(&ar->txmgmt_idr_lock);
4770
dma_unmap_single(ab->dev, skb_cb->paddr, msdu->len,
4771
DMA_TO_DEVICE);
4772
}
4773
4774
return 0;
4775
}
4776
4777
static int ath12k_mac_mgmt_tx_wmi(struct ath12k *ar, struct ath12k_vif *arvif,
4778
struct sk_buff *skb)
4779
{
4780
struct ath12k_base *ab = ar->ab;
4781
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
4782
struct ieee80211_tx_info *info;
4783
dma_addr_t paddr;
4784
int buf_id;
4785
int ret;
4786
4787
ATH12K_SKB_CB(skb)->ar = ar;
4788
spin_lock_bh(&ar->txmgmt_idr_lock);
4789
buf_id = idr_alloc(&ar->txmgmt_idr, skb, 0,
4790
ATH12K_TX_MGMT_NUM_PENDING_MAX, GFP_ATOMIC);
4791
spin_unlock_bh(&ar->txmgmt_idr_lock);
4792
if (buf_id < 0)
4793
return -ENOSPC;
4794
4795
info = IEEE80211_SKB_CB(skb);
4796
if (!(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP)) {
4797
if ((ieee80211_is_action(hdr->frame_control) ||
4798
ieee80211_is_deauth(hdr->frame_control) ||
4799
ieee80211_is_disassoc(hdr->frame_control)) &&
4800
ieee80211_has_protected(hdr->frame_control)) {
4801
skb_put(skb, IEEE80211_CCMP_MIC_LEN);
4802
}
4803
}
4804
4805
paddr = dma_map_single(ab->dev, skb->data, skb->len, DMA_TO_DEVICE);
4806
if (dma_mapping_error(ab->dev, paddr)) {
4807
ath12k_warn(ab, "failed to DMA map mgmt Tx buffer\n");
4808
ret = -EIO;
4809
goto err_free_idr;
4810
}
4811
4812
ATH12K_SKB_CB(skb)->paddr = paddr;
4813
4814
ret = ath12k_wmi_mgmt_send(ar, arvif->vdev_id, buf_id, skb);
4815
if (ret) {
4816
ath12k_warn(ar->ab, "failed to send mgmt frame: %d\n", ret);
4817
goto err_unmap_buf;
4818
}
4819
4820
return 0;
4821
4822
err_unmap_buf:
4823
dma_unmap_single(ab->dev, ATH12K_SKB_CB(skb)->paddr,
4824
skb->len, DMA_TO_DEVICE);
4825
err_free_idr:
4826
spin_lock_bh(&ar->txmgmt_idr_lock);
4827
idr_remove(&ar->txmgmt_idr, buf_id);
4828
spin_unlock_bh(&ar->txmgmt_idr_lock);
4829
4830
return ret;
4831
}
4832
4833
static void ath12k_mgmt_over_wmi_tx_purge(struct ath12k *ar)
4834
{
4835
struct sk_buff *skb;
4836
4837
while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL)
4838
ath12k_mgmt_over_wmi_tx_drop(ar, skb);
4839
}
4840
4841
static void ath12k_mgmt_over_wmi_tx_work(struct work_struct *work)
4842
{
4843
struct ath12k *ar = container_of(work, struct ath12k, wmi_mgmt_tx_work);
4844
struct ath12k_skb_cb *skb_cb;
4845
struct ath12k_vif *arvif;
4846
struct sk_buff *skb;
4847
int ret;
4848
4849
while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL) {
4850
skb_cb = ATH12K_SKB_CB(skb);
4851
if (!skb_cb->vif) {
4852
ath12k_warn(ar->ab, "no vif found for mgmt frame\n");
4853
ath12k_mgmt_over_wmi_tx_drop(ar, skb);
4854
continue;
4855
}
4856
4857
arvif = ath12k_vif_to_arvif(skb_cb->vif);
4858
if (ar->allocated_vdev_map & (1LL << arvif->vdev_id) &&
4859
arvif->is_started) {
4860
ret = ath12k_mac_mgmt_tx_wmi(ar, arvif, skb);
4861
if (ret) {
4862
ath12k_warn(ar->ab, "failed to tx mgmt frame, vdev_id %d :%d\n",
4863
arvif->vdev_id, ret);
4864
ath12k_mgmt_over_wmi_tx_drop(ar, skb);
4865
}
4866
} else {
4867
ath12k_warn(ar->ab,
4868
"dropping mgmt frame for vdev %d, is_started %d\n",
4869
arvif->vdev_id,
4870
arvif->is_started);
4871
ath12k_mgmt_over_wmi_tx_drop(ar, skb);
4872
}
4873
}
4874
}
4875
4876
static int ath12k_mac_mgmt_tx(struct ath12k *ar, struct sk_buff *skb,
4877
bool is_prb_rsp)
4878
{
4879
struct sk_buff_head *q = &ar->wmi_mgmt_tx_queue;
4880
4881
if (test_bit(ATH12K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags))
4882
return -ESHUTDOWN;
4883
4884
/* Drop probe response packets when the pending management tx
4885
* count has reached a certain threshold, so as to prioritize
4886
* other mgmt packets like auth and assoc to be sent on time
4887
* for establishing successful connections.
4888
*/
4889
if (is_prb_rsp &&
4890
atomic_read(&ar->num_pending_mgmt_tx) > ATH12K_PRB_RSP_DROP_THRESHOLD) {
4891
ath12k_warn(ar->ab,
4892
"dropping probe response as pending queue is almost full\n");
4893
return -ENOSPC;
4894
}
4895
4896
if (skb_queue_len_lockless(q) >= ATH12K_TX_MGMT_NUM_PENDING_MAX) {
4897
ath12k_warn(ar->ab, "mgmt tx queue is full\n");
4898
return -ENOSPC;
4899
}
4900
4901
skb_queue_tail(q, skb);
4902
atomic_inc(&ar->num_pending_mgmt_tx);
4903
ieee80211_queue_work(ar->hw, &ar->wmi_mgmt_tx_work);
4904
4905
return 0;
4906
}
4907
4908
static void ath12k_mac_op_tx(struct ieee80211_hw *hw,
4909
struct ieee80211_tx_control *control,
4910
struct sk_buff *skb)
4911
{
4912
struct ath12k_skb_cb *skb_cb = ATH12K_SKB_CB(skb);
4913
struct ath12k *ar = hw->priv;
4914
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
4915
struct ieee80211_vif *vif = info->control.vif;
4916
struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
4917
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
4918
struct ieee80211_key_conf *key = info->control.hw_key;
4919
u32 info_flags = info->flags;
4920
bool is_prb_rsp;
4921
int ret;
4922
4923
memset(skb_cb, 0, sizeof(*skb_cb));
4924
skb_cb->vif = vif;
4925
4926
if (key) {
4927
skb_cb->cipher = key->cipher;
4928
skb_cb->flags |= ATH12K_SKB_CIPHER_SET;
4929
}
4930
4931
if (info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP) {
4932
skb_cb->flags |= ATH12K_SKB_HW_80211_ENCAP;
4933
} else if (ieee80211_is_mgmt(hdr->frame_control)) {
4934
is_prb_rsp = ieee80211_is_probe_resp(hdr->frame_control);
4935
ret = ath12k_mac_mgmt_tx(ar, skb, is_prb_rsp);
4936
if (ret) {
4937
ath12k_warn(ar->ab, "failed to queue management frame %d\n",
4938
ret);
4939
ieee80211_free_txskb(ar->hw, skb);
4940
}
4941
return;
4942
}
4943
4944
ret = ath12k_dp_tx(ar, arvif, skb);
4945
if (ret) {
4946
ath12k_warn(ar->ab, "failed to transmit frame %d\n", ret);
4947
ieee80211_free_txskb(ar->hw, skb);
4948
}
4949
}
4950
4951
void ath12k_mac_drain_tx(struct ath12k *ar)
4952
{
4953
/* make sure rcu-protected mac80211 tx path itself is drained */
4954
synchronize_net();
4955
4956
cancel_work_sync(&ar->wmi_mgmt_tx_work);
4957
ath12k_mgmt_over_wmi_tx_purge(ar);
4958
}
4959
4960
static int ath12k_mac_config_mon_status_default(struct ath12k *ar, bool enable)
4961
{
4962
return -ENOTSUPP;
4963
/* TODO: Need to support new monitor mode */
4964
}
4965
4966
static void ath12k_mac_wait_reconfigure(struct ath12k_base *ab)
4967
{
4968
int recovery_start_count;
4969
4970
if (!ab->is_reset)
4971
return;
4972
4973
recovery_start_count = atomic_inc_return(&ab->recovery_start_count);
4974
4975
ath12k_dbg(ab, ATH12K_DBG_MAC, "recovery start count %d\n", recovery_start_count);
4976
4977
if (recovery_start_count == ab->num_radios) {
4978
complete(&ab->recovery_start);
4979
ath12k_dbg(ab, ATH12K_DBG_MAC, "recovery started success\n");
4980
}
4981
4982
ath12k_dbg(ab, ATH12K_DBG_MAC, "waiting reconfigure...\n");
4983
4984
wait_for_completion_timeout(&ab->reconfigure_complete,
4985
ATH12K_RECONFIGURE_TIMEOUT_HZ);
4986
}
4987
4988
static int ath12k_mac_op_start(struct ieee80211_hw *hw)
4989
{
4990
struct ath12k *ar = hw->priv;
4991
struct ath12k_base *ab = ar->ab;
4992
struct ath12k_pdev *pdev = ar->pdev;
4993
int ret;
4994
4995
ath12k_mac_drain_tx(ar);
4996
mutex_lock(&ar->conf_mutex);
4997
4998
switch (ar->state) {
4999
case ATH12K_STATE_OFF:
5000
ar->state = ATH12K_STATE_ON;
5001
break;
5002
case ATH12K_STATE_RESTARTING:
5003
ar->state = ATH12K_STATE_RESTARTED;
5004
ath12k_mac_wait_reconfigure(ab);
5005
break;
5006
case ATH12K_STATE_RESTARTED:
5007
case ATH12K_STATE_WEDGED:
5008
case ATH12K_STATE_ON:
5009
WARN_ON(1);
5010
ret = -EINVAL;
5011
goto err;
5012
}
5013
5014
ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_PMF_QOS,
5015
1, pdev->pdev_id);
5016
5017
if (ret) {
5018
ath12k_err(ar->ab, "failed to enable PMF QOS: (%d\n", ret);
5019
goto err;
5020
}
5021
5022
ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_DYNAMIC_BW, 1,
5023
pdev->pdev_id);
5024
if (ret) {
5025
ath12k_err(ar->ab, "failed to enable dynamic bw: %d\n", ret);
5026
goto err;
5027
}
5028
5029
ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_ARP_AC_OVERRIDE,
5030
0, pdev->pdev_id);
5031
if (ret) {
5032
ath12k_err(ab, "failed to set ac override for ARP: %d\n",
5033
ret);
5034
goto err;
5035
}
5036
5037
ret = ath12k_wmi_send_dfs_phyerr_offload_enable_cmd(ar, pdev->pdev_id);
5038
if (ret) {
5039
ath12k_err(ab, "failed to offload radar detection: %d\n",
5040
ret);
5041
goto err;
5042
}
5043
5044
ret = ath12k_dp_tx_htt_h2t_ppdu_stats_req(ar,
5045
HTT_PPDU_STATS_TAG_DEFAULT);
5046
if (ret) {
5047
ath12k_err(ab, "failed to req ppdu stats: %d\n", ret);
5048
goto err;
5049
}
5050
5051
ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_MESH_MCAST_ENABLE,
5052
1, pdev->pdev_id);
5053
5054
if (ret) {
5055
ath12k_err(ar->ab, "failed to enable MESH MCAST ENABLE: (%d\n", ret);
5056
goto err;
5057
}
5058
5059
__ath12k_set_antenna(ar, ar->cfg_tx_chainmask, ar->cfg_rx_chainmask);
5060
5061
/* TODO: Do we need to enable ANI? */
5062
5063
ath12k_reg_update_chan_list(ar);
5064
5065
ar->num_started_vdevs = 0;
5066
ar->num_created_vdevs = 0;
5067
ar->num_peers = 0;
5068
ar->allocated_vdev_map = 0;
5069
5070
/* Configure monitor status ring with default rx_filter to get rx status
5071
* such as rssi, rx_duration.
5072
*/
5073
ret = ath12k_mac_config_mon_status_default(ar, true);
5074
if (ret && (ret != -ENOTSUPP)) {
5075
ath12k_err(ab, "failed to configure monitor status ring with default rx_filter: (%d)\n",
5076
ret);
5077
goto err;
5078
}
5079
5080
if (ret == -ENOTSUPP)
5081
ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
5082
"monitor status config is not yet supported");
5083
5084
/* Configure the hash seed for hash based reo dest ring selection */
5085
ath12k_wmi_pdev_lro_cfg(ar, ar->pdev->pdev_id);
5086
5087
/* allow device to enter IMPS */
5088
if (ab->hw_params->idle_ps) {
5089
ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_IDLE_PS_CONFIG,
5090
1, pdev->pdev_id);
5091
if (ret) {
5092
ath12k_err(ab, "failed to enable idle ps: %d\n", ret);
5093
goto err;
5094
}
5095
}
5096
5097
mutex_unlock(&ar->conf_mutex);
5098
5099
rcu_assign_pointer(ab->pdevs_active[ar->pdev_idx],
5100
&ab->pdevs[ar->pdev_idx]);
5101
5102
return 0;
5103
5104
err:
5105
ar->state = ATH12K_STATE_OFF;
5106
mutex_unlock(&ar->conf_mutex);
5107
5108
return ret;
5109
}
5110
5111
static void ath12k_mac_op_stop(struct ieee80211_hw *hw)
5112
{
5113
struct ath12k *ar = hw->priv;
5114
struct htt_ppdu_stats_info *ppdu_stats, *tmp;
5115
int ret;
5116
5117
ath12k_mac_drain_tx(ar);
5118
5119
mutex_lock(&ar->conf_mutex);
5120
ret = ath12k_mac_config_mon_status_default(ar, false);
5121
if (ret && (ret != -ENOTSUPP))
5122
ath12k_err(ar->ab, "failed to clear rx_filter for monitor status ring: (%d)\n",
5123
ret);
5124
5125
clear_bit(ATH12K_CAC_RUNNING, &ar->dev_flags);
5126
ar->state = ATH12K_STATE_OFF;
5127
mutex_unlock(&ar->conf_mutex);
5128
5129
cancel_delayed_work_sync(&ar->scan.timeout);
5130
cancel_work_sync(&ar->regd_update_work);
5131
5132
spin_lock_bh(&ar->data_lock);
5133
list_for_each_entry_safe(ppdu_stats, tmp, &ar->ppdu_stats_info, list) {
5134
list_del(&ppdu_stats->list);
5135
kfree(ppdu_stats);
5136
}
5137
spin_unlock_bh(&ar->data_lock);
5138
5139
rcu_assign_pointer(ar->ab->pdevs_active[ar->pdev_idx], NULL);
5140
5141
synchronize_rcu();
5142
5143
atomic_set(&ar->num_pending_mgmt_tx, 0);
5144
}
5145
5146
static u8
5147
ath12k_mac_get_vdev_stats_id(struct ath12k_vif *arvif)
5148
{
5149
struct ath12k_base *ab = arvif->ar->ab;
5150
u8 vdev_stats_id = 0;
5151
5152
do {
5153
if (ab->free_vdev_stats_id_map & (1LL << vdev_stats_id)) {
5154
vdev_stats_id++;
5155
if (vdev_stats_id <= ATH12K_INVAL_VDEV_STATS_ID) {
5156
vdev_stats_id = ATH12K_INVAL_VDEV_STATS_ID;
5157
break;
5158
}
5159
} else {
5160
ab->free_vdev_stats_id_map |= (1LL << vdev_stats_id);
5161
break;
5162
}
5163
} while (vdev_stats_id);
5164
5165
arvif->vdev_stats_id = vdev_stats_id;
5166
return vdev_stats_id;
5167
}
5168
5169
static void ath12k_mac_setup_vdev_create_arg(struct ath12k_vif *arvif,
5170
struct ath12k_wmi_vdev_create_arg *arg)
5171
{
5172
struct ath12k *ar = arvif->ar;
5173
struct ath12k_pdev *pdev = ar->pdev;
5174
5175
arg->if_id = arvif->vdev_id;
5176
arg->type = arvif->vdev_type;
5177
arg->subtype = arvif->vdev_subtype;
5178
arg->pdev_id = pdev->pdev_id;
5179
5180
if (pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) {
5181
arg->chains[NL80211_BAND_2GHZ].tx = ar->num_tx_chains;
5182
arg->chains[NL80211_BAND_2GHZ].rx = ar->num_rx_chains;
5183
}
5184
if (pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) {
5185
arg->chains[NL80211_BAND_5GHZ].tx = ar->num_tx_chains;
5186
arg->chains[NL80211_BAND_5GHZ].rx = ar->num_rx_chains;
5187
}
5188
if (pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP &&
5189
ar->supports_6ghz) {
5190
arg->chains[NL80211_BAND_6GHZ].tx = ar->num_tx_chains;
5191
arg->chains[NL80211_BAND_6GHZ].rx = ar->num_rx_chains;
5192
}
5193
5194
arg->if_stats_id = ath12k_mac_get_vdev_stats_id(arvif);
5195
}
5196
5197
static u32
5198
ath12k_mac_prepare_he_mode(struct ath12k_pdev *pdev, u32 viftype)
5199
{
5200
struct ath12k_pdev_cap *pdev_cap = &pdev->cap;
5201
struct ath12k_band_cap *cap_band = NULL;
5202
u32 *hecap_phy_ptr = NULL;
5203
u32 hemode;
5204
5205
if (pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP)
5206
cap_band = &pdev_cap->band[NL80211_BAND_2GHZ];
5207
else
5208
cap_band = &pdev_cap->band[NL80211_BAND_5GHZ];
5209
5210
hecap_phy_ptr = &cap_band->he_cap_phy_info[0];
5211
5212
hemode = u32_encode_bits(HE_SU_BFEE_ENABLE, HE_MODE_SU_TX_BFEE) |
5213
u32_encode_bits(HECAP_PHY_SUBFMR_GET(hecap_phy_ptr),
5214
HE_MODE_SU_TX_BFER) |
5215
u32_encode_bits(HECAP_PHY_ULMUMIMO_GET(hecap_phy_ptr),
5216
HE_MODE_UL_MUMIMO);
5217
5218
/* TODO: WDS and other modes */
5219
if (viftype == NL80211_IFTYPE_AP) {
5220
hemode |= u32_encode_bits(HECAP_PHY_MUBFMR_GET(hecap_phy_ptr),
5221
HE_MODE_MU_TX_BFER) |
5222
u32_encode_bits(HE_DL_MUOFDMA_ENABLE, HE_MODE_DL_OFDMA) |
5223
u32_encode_bits(HE_UL_MUOFDMA_ENABLE, HE_MODE_UL_OFDMA);
5224
} else {
5225
hemode |= u32_encode_bits(HE_MU_BFEE_ENABLE, HE_MODE_MU_TX_BFEE);
5226
}
5227
5228
return hemode;
5229
}
5230
5231
static int ath12k_set_he_mu_sounding_mode(struct ath12k *ar,
5232
struct ath12k_vif *arvif)
5233
{
5234
u32 param_id, param_value;
5235
struct ath12k_base *ab = ar->ab;
5236
int ret;
5237
5238
param_id = WMI_VDEV_PARAM_SET_HEMU_MODE;
5239
param_value = ath12k_mac_prepare_he_mode(ar->pdev, arvif->vif->type);
5240
ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
5241
param_id, param_value);
5242
if (ret) {
5243
ath12k_warn(ab, "failed to set vdev %d HE MU mode: %d param_value %x\n",
5244
arvif->vdev_id, ret, param_value);
5245
return ret;
5246
}
5247
param_id = WMI_VDEV_PARAM_SET_HE_SOUNDING_MODE;
5248
param_value =
5249
u32_encode_bits(HE_VHT_SOUNDING_MODE_ENABLE, HE_VHT_SOUNDING_MODE) |
5250
u32_encode_bits(HE_TRIG_NONTRIG_SOUNDING_MODE_ENABLE,
5251
HE_TRIG_NONTRIG_SOUNDING_MODE);
5252
ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
5253
param_id, param_value);
5254
if (ret) {
5255
ath12k_warn(ab, "failed to set vdev %d HE MU mode: %d\n",
5256
arvif->vdev_id, ret);
5257
return ret;
5258
}
5259
return ret;
5260
}
5261
5262
static void ath12k_mac_op_update_vif_offload(struct ieee80211_hw *hw,
5263
struct ieee80211_vif *vif)
5264
{
5265
struct ath12k *ar = hw->priv;
5266
struct ath12k_base *ab = ar->ab;
5267
struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
5268
u32 param_id, param_value;
5269
int ret;
5270
5271
param_id = WMI_VDEV_PARAM_TX_ENCAP_TYPE;
5272
if (vif->type != NL80211_IFTYPE_STATION &&
5273
vif->type != NL80211_IFTYPE_AP)
5274
vif->offload_flags &= ~(IEEE80211_OFFLOAD_ENCAP_ENABLED |
5275
IEEE80211_OFFLOAD_DECAP_ENABLED);
5276
5277
if (vif->offload_flags & IEEE80211_OFFLOAD_ENCAP_ENABLED)
5278
arvif->tx_encap_type = ATH12K_HW_TXRX_ETHERNET;
5279
else if (test_bit(ATH12K_FLAG_RAW_MODE, &ab->dev_flags))
5280
arvif->tx_encap_type = ATH12K_HW_TXRX_RAW;
5281
else
5282
arvif->tx_encap_type = ATH12K_HW_TXRX_NATIVE_WIFI;
5283
5284
ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
5285
param_id, arvif->tx_encap_type);
5286
if (ret) {
5287
ath12k_warn(ab, "failed to set vdev %d tx encap mode: %d\n",
5288
arvif->vdev_id, ret);
5289
vif->offload_flags &= ~IEEE80211_OFFLOAD_ENCAP_ENABLED;
5290
}
5291
5292
param_id = WMI_VDEV_PARAM_RX_DECAP_TYPE;
5293
if (vif->offload_flags & IEEE80211_OFFLOAD_DECAP_ENABLED)
5294
param_value = ATH12K_HW_TXRX_ETHERNET;
5295
else if (test_bit(ATH12K_FLAG_RAW_MODE, &ab->dev_flags))
5296
param_value = ATH12K_HW_TXRX_RAW;
5297
else
5298
param_value = ATH12K_HW_TXRX_NATIVE_WIFI;
5299
5300
ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
5301
param_id, param_value);
5302
if (ret) {
5303
ath12k_warn(ab, "failed to set vdev %d rx decap mode: %d\n",
5304
arvif->vdev_id, ret);
5305
vif->offload_flags &= ~IEEE80211_OFFLOAD_DECAP_ENABLED;
5306
}
5307
}
5308
5309
static int ath12k_mac_op_add_interface(struct ieee80211_hw *hw,
5310
struct ieee80211_vif *vif)
5311
{
5312
struct ath12k *ar = hw->priv;
5313
struct ath12k_base *ab = ar->ab;
5314
struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
5315
struct ath12k_wmi_vdev_create_arg vdev_arg = {0};
5316
struct ath12k_wmi_peer_create_arg peer_param;
5317
u32 param_id, param_value;
5318
u16 nss;
5319
int i;
5320
int ret;
5321
int bit;
5322
5323
vif->driver_flags |= IEEE80211_VIF_SUPPORTS_UAPSD;
5324
5325
mutex_lock(&ar->conf_mutex);
5326
5327
if (vif->type == NL80211_IFTYPE_AP &&
5328
ar->num_peers > (ar->max_num_peers - 1)) {
5329
ath12k_warn(ab, "failed to create vdev due to insufficient peer entry resource in firmware\n");
5330
ret = -ENOBUFS;
5331
goto err;
5332
}
5333
5334
if (ar->num_created_vdevs > (TARGET_NUM_VDEVS - 1)) {
5335
ath12k_warn(ab, "failed to create vdev, reached max vdev limit %d\n",
5336
TARGET_NUM_VDEVS);
5337
ret = -EBUSY;
5338
goto err;
5339
}
5340
5341
memset(arvif, 0, sizeof(*arvif));
5342
5343
arvif->ar = ar;
5344
arvif->vif = vif;
5345
5346
INIT_LIST_HEAD(&arvif->list);
5347
5348
/* Should we initialize any worker to handle connection loss indication
5349
* from firmware in sta mode?
5350
*/
5351
5352
for (i = 0; i < ARRAY_SIZE(arvif->bitrate_mask.control); i++) {
5353
arvif->bitrate_mask.control[i].legacy = 0xffffffff;
5354
memset(arvif->bitrate_mask.control[i].ht_mcs, 0xff,
5355
sizeof(arvif->bitrate_mask.control[i].ht_mcs));
5356
memset(arvif->bitrate_mask.control[i].vht_mcs, 0xff,
5357
sizeof(arvif->bitrate_mask.control[i].vht_mcs));
5358
}
5359
5360
bit = __ffs64(ab->free_vdev_map);
5361
5362
arvif->vdev_id = bit;
5363
arvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE;
5364
5365
switch (vif->type) {
5366
case NL80211_IFTYPE_UNSPECIFIED:
5367
case NL80211_IFTYPE_STATION:
5368
arvif->vdev_type = WMI_VDEV_TYPE_STA;
5369
break;
5370
case NL80211_IFTYPE_MESH_POINT:
5371
arvif->vdev_subtype = WMI_VDEV_SUBTYPE_MESH_11S;
5372
fallthrough;
5373
case NL80211_IFTYPE_AP:
5374
arvif->vdev_type = WMI_VDEV_TYPE_AP;
5375
break;
5376
case NL80211_IFTYPE_MONITOR:
5377
arvif->vdev_type = WMI_VDEV_TYPE_MONITOR;
5378
ar->monitor_vdev_id = bit;
5379
break;
5380
default:
5381
WARN_ON(1);
5382
break;
5383
}
5384
5385
ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac add interface id %d type %d subtype %d map %llx\n",
5386
arvif->vdev_id, arvif->vdev_type, arvif->vdev_subtype,
5387
ab->free_vdev_map);
5388
5389
vif->cab_queue = arvif->vdev_id % (ATH12K_HW_MAX_QUEUES - 1);
5390
for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++)
5391
vif->hw_queue[i] = i % (ATH12K_HW_MAX_QUEUES - 1);
5392
5393
ath12k_mac_setup_vdev_create_arg(arvif, &vdev_arg);
5394
5395
ret = ath12k_wmi_vdev_create(ar, vif->addr, &vdev_arg);
5396
if (ret) {
5397
ath12k_warn(ab, "failed to create WMI vdev %d: %d\n",
5398
arvif->vdev_id, ret);
5399
goto err;
5400
}
5401
5402
ar->num_created_vdevs++;
5403
ath12k_dbg(ab, ATH12K_DBG_MAC, "vdev %pM created, vdev_id %d\n",
5404
vif->addr, arvif->vdev_id);
5405
ar->allocated_vdev_map |= 1LL << arvif->vdev_id;
5406
ab->free_vdev_map &= ~(1LL << arvif->vdev_id);
5407
5408
spin_lock_bh(&ar->data_lock);
5409
list_add(&arvif->list, &ar->arvifs);
5410
spin_unlock_bh(&ar->data_lock);
5411
5412
ath12k_mac_op_update_vif_offload(hw, vif);
5413
5414
nss = hweight32(ar->cfg_tx_chainmask) ? : 1;
5415
ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
5416
WMI_VDEV_PARAM_NSS, nss);
5417
if (ret) {
5418
ath12k_warn(ab, "failed to set vdev %d chainmask 0x%x, nss %d :%d\n",
5419
arvif->vdev_id, ar->cfg_tx_chainmask, nss, ret);
5420
goto err_vdev_del;
5421
}
5422
5423
switch (arvif->vdev_type) {
5424
case WMI_VDEV_TYPE_AP:
5425
peer_param.vdev_id = arvif->vdev_id;
5426
peer_param.peer_addr = vif->addr;
5427
peer_param.peer_type = WMI_PEER_TYPE_DEFAULT;
5428
ret = ath12k_peer_create(ar, arvif, NULL, &peer_param);
5429
if (ret) {
5430
ath12k_warn(ab, "failed to vdev %d create peer for AP: %d\n",
5431
arvif->vdev_id, ret);
5432
goto err_vdev_del;
5433
}
5434
5435
ret = ath12k_mac_set_kickout(arvif);
5436
if (ret) {
5437
ath12k_warn(ar->ab, "failed to set vdev %i kickout parameters: %d\n",
5438
arvif->vdev_id, ret);
5439
goto err_peer_del;
5440
}
5441
break;
5442
case WMI_VDEV_TYPE_STA:
5443
param_id = WMI_STA_PS_PARAM_RX_WAKE_POLICY;
5444
param_value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
5445
ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
5446
param_id, param_value);
5447
if (ret) {
5448
ath12k_warn(ar->ab, "failed to set vdev %d RX wake policy: %d\n",
5449
arvif->vdev_id, ret);
5450
goto err_peer_del;
5451
}
5452
5453
param_id = WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD;
5454
param_value = WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS;
5455
ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
5456
param_id, param_value);
5457
if (ret) {
5458
ath12k_warn(ar->ab, "failed to set vdev %d TX wake threshold: %d\n",
5459
arvif->vdev_id, ret);
5460
goto err_peer_del;
5461
}
5462
5463
param_id = WMI_STA_PS_PARAM_PSPOLL_COUNT;
5464
param_value = WMI_STA_PS_PSPOLL_COUNT_NO_MAX;
5465
ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
5466
param_id, param_value);
5467
if (ret) {
5468
ath12k_warn(ar->ab, "failed to set vdev %d pspoll count: %d\n",
5469
arvif->vdev_id, ret);
5470
goto err_peer_del;
5471
}
5472
5473
ret = ath12k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id, false);
5474
if (ret) {
5475
ath12k_warn(ar->ab, "failed to disable vdev %d ps mode: %d\n",
5476
arvif->vdev_id, ret);
5477
goto err_peer_del;
5478
}
5479
break;
5480
default:
5481
break;
5482
}
5483
5484
arvif->txpower = vif->bss_conf.txpower;
5485
ret = ath12k_mac_txpower_recalc(ar);
5486
if (ret)
5487
goto err_peer_del;
5488
5489
param_id = WMI_VDEV_PARAM_RTS_THRESHOLD;
5490
param_value = ar->hw->wiphy->rts_threshold;
5491
ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
5492
param_id, param_value);
5493
if (ret) {
5494
ath12k_warn(ar->ab, "failed to set rts threshold for vdev %d: %d\n",
5495
arvif->vdev_id, ret);
5496
}
5497
5498
ath12k_dp_vdev_tx_attach(ar, arvif);
5499
5500
if (vif->type != NL80211_IFTYPE_MONITOR && ar->monitor_conf_enabled)
5501
ath12k_mac_monitor_vdev_create(ar);
5502
5503
mutex_unlock(&ar->conf_mutex);
5504
5505
return ret;
5506
5507
err_peer_del:
5508
if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
5509
reinit_completion(&ar->peer_delete_done);
5510
5511
ret = ath12k_wmi_send_peer_delete_cmd(ar, vif->addr,
5512
arvif->vdev_id);
5513
if (ret) {
5514
ath12k_warn(ar->ab, "failed to delete peer vdev_id %d addr %pM\n",
5515
arvif->vdev_id, vif->addr);
5516
goto err;
5517
}
5518
5519
ret = ath12k_wait_for_peer_delete_done(ar, arvif->vdev_id,
5520
vif->addr);
5521
if (ret)
5522
goto err;
5523
5524
ar->num_peers--;
5525
}
5526
5527
err_vdev_del:
5528
ath12k_wmi_vdev_delete(ar, arvif->vdev_id);
5529
ar->num_created_vdevs--;
5530
ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id);
5531
ab->free_vdev_map |= 1LL << arvif->vdev_id;
5532
ab->free_vdev_stats_id_map &= ~(1LL << arvif->vdev_stats_id);
5533
spin_lock_bh(&ar->data_lock);
5534
list_del(&arvif->list);
5535
spin_unlock_bh(&ar->data_lock);
5536
5537
err:
5538
mutex_unlock(&ar->conf_mutex);
5539
5540
return ret;
5541
}
5542
5543
static void ath12k_mac_vif_unref(struct ath12k_dp *dp, struct ieee80211_vif *vif)
5544
{
5545
struct ath12k_tx_desc_info *tx_desc_info;
5546
struct ath12k_skb_cb *skb_cb;
5547
struct sk_buff *skb;
5548
int i;
5549
5550
for (i = 0; i < ATH12K_HW_MAX_QUEUES; i++) {
5551
spin_lock_bh(&dp->tx_desc_lock[i]);
5552
5553
list_for_each_entry(tx_desc_info, &dp->tx_desc_used_list[i],
5554
list) {
5555
skb = tx_desc_info->skb;
5556
if (!skb)
5557
continue;
5558
5559
skb_cb = ATH12K_SKB_CB(skb);
5560
if (skb_cb->vif == vif)
5561
skb_cb->vif = NULL;
5562
}
5563
5564
spin_unlock_bh(&dp->tx_desc_lock[i]);
5565
}
5566
}
5567
5568
static void ath12k_mac_op_remove_interface(struct ieee80211_hw *hw,
5569
struct ieee80211_vif *vif)
5570
{
5571
struct ath12k *ar = hw->priv;
5572
struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
5573
struct ath12k_base *ab = ar->ab;
5574
unsigned long time_left;
5575
int ret;
5576
5577
mutex_lock(&ar->conf_mutex);
5578
5579
ath12k_dbg(ab, ATH12K_DBG_MAC, "mac remove interface (vdev %d)\n",
5580
arvif->vdev_id);
5581
5582
if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
5583
ret = ath12k_peer_delete(ar, arvif->vdev_id, vif->addr);
5584
if (ret)
5585
ath12k_warn(ab, "failed to submit AP self-peer removal on vdev %d: %d\n",
5586
arvif->vdev_id, ret);
5587
}
5588
5589
reinit_completion(&ar->vdev_delete_done);
5590
5591
ret = ath12k_wmi_vdev_delete(ar, arvif->vdev_id);
5592
if (ret) {
5593
ath12k_warn(ab, "failed to delete WMI vdev %d: %d\n",
5594
arvif->vdev_id, ret);
5595
goto err_vdev_del;
5596
}
5597
5598
time_left = wait_for_completion_timeout(&ar->vdev_delete_done,
5599
ATH12K_VDEV_DELETE_TIMEOUT_HZ);
5600
if (time_left == 0) {
5601
ath12k_warn(ab, "Timeout in receiving vdev delete response\n");
5602
goto err_vdev_del;
5603
}
5604
5605
if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
5606
ar->monitor_vdev_id = -1;
5607
ar->monitor_vdev_created = false;
5608
} else if (ar->monitor_vdev_created && !ar->monitor_started) {
5609
ret = ath12k_mac_monitor_vdev_delete(ar);
5610
}
5611
5612
ab->free_vdev_map |= 1LL << (arvif->vdev_id);
5613
ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id);
5614
ab->free_vdev_stats_id_map &= ~(1LL << arvif->vdev_stats_id);
5615
ar->num_created_vdevs--;
5616
5617
ath12k_dbg(ab, ATH12K_DBG_MAC, "vdev %pM deleted, vdev_id %d\n",
5618
vif->addr, arvif->vdev_id);
5619
5620
err_vdev_del:
5621
spin_lock_bh(&ar->data_lock);
5622
list_del(&arvif->list);
5623
spin_unlock_bh(&ar->data_lock);
5624
5625
ath12k_peer_cleanup(ar, arvif->vdev_id);
5626
5627
idr_for_each(&ar->txmgmt_idr,
5628
ath12k_mac_vif_txmgmt_idr_remove, vif);
5629
5630
ath12k_mac_vif_unref(&ab->dp, vif);
5631
ath12k_dp_tx_put_bank_profile(&ab->dp, arvif->bank_id);
5632
5633
/* Recalc txpower for remaining vdev */
5634
ath12k_mac_txpower_recalc(ar);
5635
clear_bit(ATH12K_FLAG_MONITOR_ENABLED, &ar->monitor_flags);
5636
5637
/* TODO: recal traffic pause state based on the available vdevs */
5638
5639
mutex_unlock(&ar->conf_mutex);
5640
}
5641
5642
/* FIXME: Has to be verified. */
5643
#define SUPPORTED_FILTERS \
5644
(FIF_ALLMULTI | \
5645
FIF_CONTROL | \
5646
FIF_PSPOLL | \
5647
FIF_OTHER_BSS | \
5648
FIF_BCN_PRBRESP_PROMISC | \
5649
FIF_PROBE_REQ | \
5650
FIF_FCSFAIL)
5651
5652
static void ath12k_mac_op_configure_filter(struct ieee80211_hw *hw,
5653
unsigned int changed_flags,
5654
unsigned int *total_flags,
5655
u64 multicast)
5656
{
5657
struct ath12k *ar = hw->priv;
5658
bool reset_flag;
5659
int ret;
5660
5661
mutex_lock(&ar->conf_mutex);
5662
5663
changed_flags &= SUPPORTED_FILTERS;
5664
*total_flags &= SUPPORTED_FILTERS;
5665
ar->filter_flags = *total_flags;
5666
5667
/* For monitor mode */
5668
reset_flag = !(ar->filter_flags & FIF_BCN_PRBRESP_PROMISC);
5669
5670
ret = ath12k_dp_tx_htt_monitor_mode_ring_config(ar, reset_flag);
5671
if (!ret) {
5672
if (!reset_flag)
5673
set_bit(ATH12K_FLAG_MONITOR_ENABLED, &ar->monitor_flags);
5674
else
5675
clear_bit(ATH12K_FLAG_MONITOR_ENABLED, &ar->monitor_flags);
5676
} else {
5677
ath12k_warn(ar->ab,
5678
"fail to set monitor filter: %d\n", ret);
5679
}
5680
ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
5681
"changed_flags:0x%x, total_flags:0x%x, reset_flag:%d\n",
5682
changed_flags, *total_flags, reset_flag);
5683
5684
mutex_unlock(&ar->conf_mutex);
5685
}
5686
5687
static int ath12k_mac_op_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant)
5688
{
5689
struct ath12k *ar = hw->priv;
5690
5691
mutex_lock(&ar->conf_mutex);
5692
5693
*tx_ant = ar->cfg_tx_chainmask;
5694
*rx_ant = ar->cfg_rx_chainmask;
5695
5696
mutex_unlock(&ar->conf_mutex);
5697
5698
return 0;
5699
}
5700
5701
static int ath12k_mac_op_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)
5702
{
5703
struct ath12k *ar = hw->priv;
5704
int ret;
5705
5706
mutex_lock(&ar->conf_mutex);
5707
ret = __ath12k_set_antenna(ar, tx_ant, rx_ant);
5708
mutex_unlock(&ar->conf_mutex);
5709
5710
return ret;
5711
}
5712
5713
static int ath12k_mac_op_ampdu_action(struct ieee80211_hw *hw,
5714
struct ieee80211_vif *vif,
5715
struct ieee80211_ampdu_params *params)
5716
{
5717
struct ath12k *ar = hw->priv;
5718
int ret = -EINVAL;
5719
5720
mutex_lock(&ar->conf_mutex);
5721
5722
switch (params->action) {
5723
case IEEE80211_AMPDU_RX_START:
5724
ret = ath12k_dp_rx_ampdu_start(ar, params);
5725
break;
5726
case IEEE80211_AMPDU_RX_STOP:
5727
ret = ath12k_dp_rx_ampdu_stop(ar, params);
5728
break;
5729
case IEEE80211_AMPDU_TX_START:
5730
case IEEE80211_AMPDU_TX_STOP_CONT:
5731
case IEEE80211_AMPDU_TX_STOP_FLUSH:
5732
case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
5733
case IEEE80211_AMPDU_TX_OPERATIONAL:
5734
/* Tx A-MPDU aggregation offloaded to hw/fw so deny mac80211
5735
* Tx aggregation requests.
5736
*/
5737
ret = -EOPNOTSUPP;
5738
break;
5739
}
5740
5741
mutex_unlock(&ar->conf_mutex);
5742
5743
return ret;
5744
}
5745
5746
static int ath12k_mac_op_add_chanctx(struct ieee80211_hw *hw,
5747
struct ieee80211_chanctx_conf *ctx)
5748
{
5749
struct ath12k *ar = hw->priv;
5750
struct ath12k_base *ab = ar->ab;
5751
5752
ath12k_dbg(ab, ATH12K_DBG_MAC,
5753
"mac chanctx add freq %u width %d ptr %pK\n",
5754
ctx->def.chan->center_freq, ctx->def.width, ctx);
5755
5756
mutex_lock(&ar->conf_mutex);
5757
5758
spin_lock_bh(&ar->data_lock);
5759
/* TODO: In case of multiple channel context, populate rx_channel from
5760
* Rx PPDU desc information.
5761
*/
5762
ar->rx_channel = ctx->def.chan;
5763
spin_unlock_bh(&ar->data_lock);
5764
5765
mutex_unlock(&ar->conf_mutex);
5766
5767
return 0;
5768
}
5769
5770
static void ath12k_mac_op_remove_chanctx(struct ieee80211_hw *hw,
5771
struct ieee80211_chanctx_conf *ctx)
5772
{
5773
struct ath12k *ar = hw->priv;
5774
struct ath12k_base *ab = ar->ab;
5775
5776
ath12k_dbg(ab, ATH12K_DBG_MAC,
5777
"mac chanctx remove freq %u width %d ptr %pK\n",
5778
ctx->def.chan->center_freq, ctx->def.width, ctx);
5779
5780
mutex_lock(&ar->conf_mutex);
5781
5782
spin_lock_bh(&ar->data_lock);
5783
/* TODO: In case of there is one more channel context left, populate
5784
* rx_channel with the channel of that remaining channel context.
5785
*/
5786
ar->rx_channel = NULL;
5787
spin_unlock_bh(&ar->data_lock);
5788
5789
mutex_unlock(&ar->conf_mutex);
5790
}
5791
5792
static int
5793
ath12k_mac_vdev_start_restart(struct ath12k_vif *arvif,
5794
const struct cfg80211_chan_def *chandef,
5795
bool restart)
5796
{
5797
struct ath12k *ar = arvif->ar;
5798
struct ath12k_base *ab = ar->ab;
5799
struct wmi_vdev_start_req_arg arg = {};
5800
int he_support = arvif->vif->bss_conf.he_support;
5801
int ret;
5802
5803
lockdep_assert_held(&ar->conf_mutex);
5804
5805
reinit_completion(&ar->vdev_setup_done);
5806
5807
arg.vdev_id = arvif->vdev_id;
5808
arg.dtim_period = arvif->dtim_period;
5809
arg.bcn_intval = arvif->beacon_interval;
5810
arg.punct_bitmap = ~arvif->punct_bitmap;
5811
5812
arg.freq = chandef->chan->center_freq;
5813
arg.band_center_freq1 = chandef->center_freq1;
5814
arg.band_center_freq2 = chandef->center_freq2;
5815
arg.mode = ath12k_phymodes[chandef->chan->band][chandef->width];
5816
5817
arg.min_power = 0;
5818
arg.max_power = chandef->chan->max_power * 2;
5819
arg.max_reg_power = chandef->chan->max_reg_power * 2;
5820
arg.max_antenna_gain = chandef->chan->max_antenna_gain * 2;
5821
5822
arg.pref_tx_streams = ar->num_tx_chains;
5823
arg.pref_rx_streams = ar->num_rx_chains;
5824
5825
if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
5826
arg.ssid = arvif->u.ap.ssid;
5827
arg.ssid_len = arvif->u.ap.ssid_len;
5828
arg.hidden_ssid = arvif->u.ap.hidden_ssid;
5829
5830
/* For now allow DFS for AP mode */
5831
arg.chan_radar = !!(chandef->chan->flags & IEEE80211_CHAN_RADAR);
5832
5833
arg.passive = arg.chan_radar;
5834
5835
spin_lock_bh(&ab->base_lock);
5836
arg.regdomain = ar->ab->dfs_region;
5837
spin_unlock_bh(&ab->base_lock);
5838
5839
/* TODO: Notify if secondary 80Mhz also needs radar detection */
5840
if (he_support) {
5841
ret = ath12k_set_he_mu_sounding_mode(ar, arvif);
5842
if (ret) {
5843
ath12k_warn(ar->ab, "failed to set he mode vdev %i\n",
5844
arg.vdev_id);
5845
return ret;
5846
}
5847
}
5848
}
5849
5850
arg.passive |= !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR);
5851
5852
ath12k_dbg(ab, ATH12K_DBG_MAC,
5853
"mac vdev %d start center_freq %d phymode %s punct_bitmap 0x%x\n",
5854
arg.vdev_id, arg.freq,
5855
ath12k_mac_phymode_str(arg.mode), arg.punct_bitmap);
5856
5857
ret = ath12k_wmi_vdev_start(ar, &arg, restart);
5858
if (ret) {
5859
ath12k_warn(ar->ab, "failed to %s WMI vdev %i\n",
5860
restart ? "restart" : "start", arg.vdev_id);
5861
return ret;
5862
}
5863
5864
ret = ath12k_mac_vdev_setup_sync(ar);
5865
if (ret) {
5866
ath12k_warn(ab, "failed to synchronize setup for vdev %i %s: %d\n",
5867
arg.vdev_id, restart ? "restart" : "start", ret);
5868
return ret;
5869
}
5870
5871
ar->num_started_vdevs++;
5872
ath12k_dbg(ab, ATH12K_DBG_MAC, "vdev %pM started, vdev_id %d\n",
5873
arvif->vif->addr, arvif->vdev_id);
5874
5875
/* Enable CAC Flag in the driver by checking the channel DFS cac time,
5876
* i.e dfs_cac_ms value which will be valid only for radar channels
5877
* and state as NL80211_DFS_USABLE which indicates CAC needs to be
5878
* done before channel usage. This flags is used to drop rx packets.
5879
* during CAC.
5880
*/
5881
/* TODO: Set the flag for other interface types as required */
5882
if (arvif->vdev_type == WMI_VDEV_TYPE_AP &&
5883
chandef->chan->dfs_cac_ms &&
5884
chandef->chan->dfs_state == NL80211_DFS_USABLE) {
5885
set_bit(ATH12K_CAC_RUNNING, &ar->dev_flags);
5886
ath12k_dbg(ab, ATH12K_DBG_MAC,
5887
"CAC Started in chan_freq %d for vdev %d\n",
5888
arg.freq, arg.vdev_id);
5889
}
5890
5891
ret = ath12k_mac_set_txbf_conf(arvif);
5892
if (ret)
5893
ath12k_warn(ab, "failed to set txbf conf for vdev %d: %d\n",
5894
arvif->vdev_id, ret);
5895
5896
return 0;
5897
}
5898
5899
static int ath12k_mac_vdev_stop(struct ath12k_vif *arvif)
5900
{
5901
struct ath12k *ar = arvif->ar;
5902
int ret;
5903
5904
lockdep_assert_held(&ar->conf_mutex);
5905
5906
reinit_completion(&ar->vdev_setup_done);
5907
5908
ret = ath12k_wmi_vdev_stop(ar, arvif->vdev_id);
5909
if (ret) {
5910
ath12k_warn(ar->ab, "failed to stop WMI vdev %i: %d\n",
5911
arvif->vdev_id, ret);
5912
goto err;
5913
}
5914
5915
ret = ath12k_mac_vdev_setup_sync(ar);
5916
if (ret) {
5917
ath12k_warn(ar->ab, "failed to synchronize setup for vdev %i: %d\n",
5918
arvif->vdev_id, ret);
5919
goto err;
5920
}
5921
5922
WARN_ON(ar->num_started_vdevs == 0);
5923
5924
ar->num_started_vdevs--;
5925
ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "vdev %pM stopped, vdev_id %d\n",
5926
arvif->vif->addr, arvif->vdev_id);
5927
5928
if (test_bit(ATH12K_CAC_RUNNING, &ar->dev_flags)) {
5929
clear_bit(ATH12K_CAC_RUNNING, &ar->dev_flags);
5930
ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "CAC Stopped for vdev %d\n",
5931
arvif->vdev_id);
5932
}
5933
5934
return 0;
5935
err:
5936
return ret;
5937
}
5938
5939
static int ath12k_mac_vdev_start(struct ath12k_vif *arvif,
5940
const struct cfg80211_chan_def *chandef)
5941
{
5942
return ath12k_mac_vdev_start_restart(arvif, chandef, false);
5943
}
5944
5945
static int ath12k_mac_vdev_restart(struct ath12k_vif *arvif,
5946
const struct cfg80211_chan_def *chandef)
5947
{
5948
return ath12k_mac_vdev_start_restart(arvif, chandef, true);
5949
}
5950
5951
struct ath12k_mac_change_chanctx_arg {
5952
struct ieee80211_chanctx_conf *ctx;
5953
struct ieee80211_vif_chanctx_switch *vifs;
5954
int n_vifs;
5955
int next_vif;
5956
};
5957
5958
static void
5959
ath12k_mac_change_chanctx_cnt_iter(void *data, u8 *mac,
5960
struct ieee80211_vif *vif)
5961
{
5962
struct ath12k_mac_change_chanctx_arg *arg = data;
5963
5964
if (rcu_access_pointer(vif->bss_conf.chanctx_conf) != arg->ctx)
5965
return;
5966
5967
arg->n_vifs++;
5968
}
5969
5970
static void
5971
ath12k_mac_change_chanctx_fill_iter(void *data, u8 *mac,
5972
struct ieee80211_vif *vif)
5973
{
5974
struct ath12k_mac_change_chanctx_arg *arg = data;
5975
struct ieee80211_chanctx_conf *ctx;
5976
5977
ctx = rcu_access_pointer(vif->bss_conf.chanctx_conf);
5978
if (ctx != arg->ctx)
5979
return;
5980
5981
if (WARN_ON(arg->next_vif == arg->n_vifs))
5982
return;
5983
5984
arg->vifs[arg->next_vif].vif = vif;
5985
arg->vifs[arg->next_vif].old_ctx = ctx;
5986
arg->vifs[arg->next_vif].new_ctx = ctx;
5987
arg->next_vif++;
5988
}
5989
5990
static void
5991
ath12k_mac_update_vif_chan(struct ath12k *ar,
5992
struct ieee80211_vif_chanctx_switch *vifs,
5993
int n_vifs)
5994
{
5995
struct ath12k_base *ab = ar->ab;
5996
struct ath12k_vif *arvif;
5997
int ret;
5998
int i;
5999
bool monitor_vif = false;
6000
6001
lockdep_assert_held(&ar->conf_mutex);
6002
6003
for (i = 0; i < n_vifs; i++) {
6004
arvif = (void *)vifs[i].vif->drv_priv;
6005
6006
if (vifs[i].vif->type == NL80211_IFTYPE_MONITOR)
6007
monitor_vif = true;
6008
6009
ath12k_dbg(ab, ATH12K_DBG_MAC,
6010
"mac chanctx switch vdev_id %i freq %u->%u width %d->%d\n",
6011
arvif->vdev_id,
6012
vifs[i].old_ctx->def.chan->center_freq,
6013
vifs[i].new_ctx->def.chan->center_freq,
6014
vifs[i].old_ctx->def.width,
6015
vifs[i].new_ctx->def.width);
6016
6017
if (WARN_ON(!arvif->is_started))
6018
continue;
6019
6020
if (WARN_ON(!arvif->is_up))
6021
continue;
6022
6023
ret = ath12k_wmi_vdev_down(ar, arvif->vdev_id);
6024
if (ret) {
6025
ath12k_warn(ab, "failed to down vdev %d: %d\n",
6026
arvif->vdev_id, ret);
6027
continue;
6028
}
6029
}
6030
6031
/* All relevant vdevs are downed and associated channel resources
6032
* should be available for the channel switch now.
6033
*/
6034
6035
/* TODO: Update ar->rx_channel */
6036
6037
for (i = 0; i < n_vifs; i++) {
6038
arvif = (void *)vifs[i].vif->drv_priv;
6039
6040
if (WARN_ON(!arvif->is_started))
6041
continue;
6042
6043
if (WARN_ON(!arvif->is_up))
6044
continue;
6045
6046
ret = ath12k_mac_vdev_restart(arvif, &vifs[i].new_ctx->def);
6047
if (ret) {
6048
ath12k_warn(ab, "failed to restart vdev %d: %d\n",
6049
arvif->vdev_id, ret);
6050
continue;
6051
}
6052
6053
ret = ath12k_mac_setup_bcn_tmpl(arvif);
6054
if (ret)
6055
ath12k_warn(ab, "failed to update bcn tmpl during csa: %d\n",
6056
ret);
6057
6058
ret = ath12k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
6059
arvif->bssid);
6060
if (ret) {
6061
ath12k_warn(ab, "failed to bring vdev up %d: %d\n",
6062
arvif->vdev_id, ret);
6063
continue;
6064
}
6065
}
6066
6067
/* Restart the internal monitor vdev on new channel */
6068
if (!monitor_vif && ar->monitor_vdev_created) {
6069
if (!ath12k_mac_monitor_stop(ar))
6070
ath12k_mac_monitor_start(ar);
6071
}
6072
}
6073
6074
static void
6075
ath12k_mac_update_active_vif_chan(struct ath12k *ar,
6076
struct ieee80211_chanctx_conf *ctx)
6077
{
6078
struct ath12k_mac_change_chanctx_arg arg = { .ctx = ctx };
6079
6080
lockdep_assert_held(&ar->conf_mutex);
6081
6082
ieee80211_iterate_active_interfaces_atomic(ar->hw,
6083
IEEE80211_IFACE_ITER_NORMAL,
6084
ath12k_mac_change_chanctx_cnt_iter,
6085
&arg);
6086
if (arg.n_vifs == 0)
6087
return;
6088
6089
arg.vifs = kcalloc(arg.n_vifs, sizeof(arg.vifs[0]), GFP_KERNEL);
6090
if (!arg.vifs)
6091
return;
6092
6093
ieee80211_iterate_active_interfaces_atomic(ar->hw,
6094
IEEE80211_IFACE_ITER_NORMAL,
6095
ath12k_mac_change_chanctx_fill_iter,
6096
&arg);
6097
6098
ath12k_mac_update_vif_chan(ar, arg.vifs, arg.n_vifs);
6099
6100
kfree(arg.vifs);
6101
}
6102
6103
static void ath12k_mac_op_change_chanctx(struct ieee80211_hw *hw,
6104
struct ieee80211_chanctx_conf *ctx,
6105
u32 changed)
6106
{
6107
struct ath12k *ar = hw->priv;
6108
struct ath12k_base *ab = ar->ab;
6109
6110
mutex_lock(&ar->conf_mutex);
6111
6112
ath12k_dbg(ab, ATH12K_DBG_MAC,
6113
"mac chanctx change freq %u width %d ptr %pK changed %x\n",
6114
ctx->def.chan->center_freq, ctx->def.width, ctx, changed);
6115
6116
/* This shouldn't really happen because channel switching should use
6117
* switch_vif_chanctx().
6118
*/
6119
if (WARN_ON(changed & IEEE80211_CHANCTX_CHANGE_CHANNEL))
6120
goto unlock;
6121
6122
if (changed & IEEE80211_CHANCTX_CHANGE_WIDTH)
6123
ath12k_mac_update_active_vif_chan(ar, ctx);
6124
6125
/* TODO: Recalc radar detection */
6126
6127
unlock:
6128
mutex_unlock(&ar->conf_mutex);
6129
}
6130
6131
static int ath12k_start_vdev_delay(struct ieee80211_hw *hw,
6132
struct ieee80211_vif *vif)
6133
{
6134
struct ath12k *ar = hw->priv;
6135
struct ath12k_base *ab = ar->ab;
6136
struct ath12k_vif *arvif = (void *)vif->drv_priv;
6137
int ret;
6138
6139
if (WARN_ON(arvif->is_started))
6140
return -EBUSY;
6141
6142
ret = ath12k_mac_vdev_start(arvif, &arvif->chanctx.def);
6143
if (ret) {
6144
ath12k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n",
6145
arvif->vdev_id, vif->addr,
6146
arvif->chanctx.def.chan->center_freq, ret);
6147
return ret;
6148
}
6149
6150
if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
6151
ret = ath12k_monitor_vdev_up(ar, arvif->vdev_id);
6152
if (ret) {
6153
ath12k_warn(ab, "failed put monitor up: %d\n", ret);
6154
return ret;
6155
}
6156
}
6157
6158
arvif->is_started = true;
6159
6160
/* TODO: Setup ps and cts/rts protection */
6161
return 0;
6162
}
6163
6164
static int
6165
ath12k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw,
6166
struct ieee80211_vif *vif,
6167
struct ieee80211_bss_conf *link_conf,
6168
struct ieee80211_chanctx_conf *ctx)
6169
{
6170
struct ath12k *ar = hw->priv;
6171
struct ath12k_base *ab = ar->ab;
6172
struct ath12k_vif *arvif = (void *)vif->drv_priv;
6173
int ret;
6174
struct ath12k_wmi_peer_create_arg param;
6175
6176
mutex_lock(&ar->conf_mutex);
6177
6178
ath12k_dbg(ab, ATH12K_DBG_MAC,
6179
"mac chanctx assign ptr %pK vdev_id %i\n",
6180
ctx, arvif->vdev_id);
6181
6182
arvif->punct_bitmap = link_conf->eht_puncturing;
6183
6184
/* for some targets bss peer must be created before vdev_start */
6185
if (ab->hw_params->vdev_start_delay &&
6186
arvif->vdev_type != WMI_VDEV_TYPE_AP &&
6187
arvif->vdev_type != WMI_VDEV_TYPE_MONITOR &&
6188
!ath12k_peer_exist_by_vdev_id(ab, arvif->vdev_id)) {
6189
memcpy(&arvif->chanctx, ctx, sizeof(*ctx));
6190
ret = 0;
6191
goto out;
6192
}
6193
6194
if (WARN_ON(arvif->is_started)) {
6195
ret = -EBUSY;
6196
goto out;
6197
}
6198
6199
if (ab->hw_params->vdev_start_delay &&
6200
(arvif->vdev_type == WMI_VDEV_TYPE_AP ||
6201
arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)) {
6202
param.vdev_id = arvif->vdev_id;
6203
param.peer_type = WMI_PEER_TYPE_DEFAULT;
6204
param.peer_addr = ar->mac_addr;
6205
6206
ret = ath12k_peer_create(ar, arvif, NULL, &param);
6207
if (ret) {
6208
ath12k_warn(ab, "failed to create peer after vdev start delay: %d",
6209
ret);
6210
goto out;
6211
}
6212
}
6213
6214
if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
6215
ret = ath12k_mac_monitor_start(ar);
6216
if (ret)
6217
goto out;
6218
arvif->is_started = true;
6219
goto out;
6220
}
6221
6222
ret = ath12k_mac_vdev_start(arvif, &ctx->def);
6223
if (ret) {
6224
ath12k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n",
6225
arvif->vdev_id, vif->addr,
6226
ctx->def.chan->center_freq, ret);
6227
goto out;
6228
}
6229
6230
if (arvif->vdev_type != WMI_VDEV_TYPE_MONITOR && ar->monitor_vdev_created)
6231
ath12k_mac_monitor_start(ar);
6232
6233
arvif->is_started = true;
6234
6235
/* TODO: Setup ps and cts/rts protection */
6236
6237
out:
6238
mutex_unlock(&ar->conf_mutex);
6239
6240
return ret;
6241
}
6242
6243
static void
6244
ath12k_mac_op_unassign_vif_chanctx(struct ieee80211_hw *hw,
6245
struct ieee80211_vif *vif,
6246
struct ieee80211_bss_conf *link_conf,
6247
struct ieee80211_chanctx_conf *ctx)
6248
{
6249
struct ath12k *ar = hw->priv;
6250
struct ath12k_base *ab = ar->ab;
6251
struct ath12k_vif *arvif = (void *)vif->drv_priv;
6252
int ret;
6253
6254
mutex_lock(&ar->conf_mutex);
6255
6256
ath12k_dbg(ab, ATH12K_DBG_MAC,
6257
"mac chanctx unassign ptr %pK vdev_id %i\n",
6258
ctx, arvif->vdev_id);
6259
6260
WARN_ON(!arvif->is_started);
6261
6262
if (ab->hw_params->vdev_start_delay &&
6263
arvif->vdev_type == WMI_VDEV_TYPE_MONITOR &&
6264
ath12k_peer_find_by_addr(ab, ar->mac_addr))
6265
ath12k_peer_delete(ar, arvif->vdev_id, ar->mac_addr);
6266
6267
if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
6268
ret = ath12k_mac_monitor_stop(ar);
6269
if (ret) {
6270
mutex_unlock(&ar->conf_mutex);
6271
return;
6272
}
6273
6274
arvif->is_started = false;
6275
}
6276
6277
ret = ath12k_mac_vdev_stop(arvif);
6278
if (ret)
6279
ath12k_warn(ab, "failed to stop vdev %i: %d\n",
6280
arvif->vdev_id, ret);
6281
6282
arvif->is_started = false;
6283
6284
if (ab->hw_params->vdev_start_delay &&
6285
arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
6286
ath12k_wmi_vdev_down(ar, arvif->vdev_id);
6287
6288
if (arvif->vdev_type != WMI_VDEV_TYPE_MONITOR &&
6289
ar->num_started_vdevs == 1 && ar->monitor_vdev_created)
6290
ath12k_mac_monitor_stop(ar);
6291
6292
mutex_unlock(&ar->conf_mutex);
6293
}
6294
6295
static int
6296
ath12k_mac_op_switch_vif_chanctx(struct ieee80211_hw *hw,
6297
struct ieee80211_vif_chanctx_switch *vifs,
6298
int n_vifs,
6299
enum ieee80211_chanctx_switch_mode mode)
6300
{
6301
struct ath12k *ar = hw->priv;
6302
6303
mutex_lock(&ar->conf_mutex);
6304
6305
ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
6306
"mac chanctx switch n_vifs %d mode %d\n",
6307
n_vifs, mode);
6308
ath12k_mac_update_vif_chan(ar, vifs, n_vifs);
6309
6310
mutex_unlock(&ar->conf_mutex);
6311
6312
return 0;
6313
}
6314
6315
static int
6316
ath12k_set_vdev_param_to_all_vifs(struct ath12k *ar, int param, u32 value)
6317
{
6318
struct ath12k_vif *arvif;
6319
int ret = 0;
6320
6321
mutex_lock(&ar->conf_mutex);
6322
list_for_each_entry(arvif, &ar->arvifs, list) {
6323
ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "setting mac vdev %d param %d value %d\n",
6324
param, arvif->vdev_id, value);
6325
6326
ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
6327
param, value);
6328
if (ret) {
6329
ath12k_warn(ar->ab, "failed to set param %d for vdev %d: %d\n",
6330
param, arvif->vdev_id, ret);
6331
break;
6332
}
6333
}
6334
mutex_unlock(&ar->conf_mutex);
6335
return ret;
6336
}
6337
6338
/* mac80211 stores device specific RTS/Fragmentation threshold value,
6339
* this is set interface specific to firmware from ath12k driver
6340
*/
6341
static int ath12k_mac_op_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
6342
{
6343
struct ath12k *ar = hw->priv;
6344
int param_id = WMI_VDEV_PARAM_RTS_THRESHOLD;
6345
6346
return ath12k_set_vdev_param_to_all_vifs(ar, param_id, value);
6347
}
6348
6349
static int ath12k_mac_op_set_frag_threshold(struct ieee80211_hw *hw, u32 value)
6350
{
6351
/* Even though there's a WMI vdev param for fragmentation threshold no
6352
* known firmware actually implements it. Moreover it is not possible to
6353
* rely frame fragmentation to mac80211 because firmware clears the
6354
* "more fragments" bit in frame control making it impossible for remote
6355
* devices to reassemble frames.
6356
*
6357
* Hence implement a dummy callback just to say fragmentation isn't
6358
* supported. This effectively prevents mac80211 from doing frame
6359
* fragmentation in software.
6360
*/
6361
return -EOPNOTSUPP;
6362
}
6363
6364
static void ath12k_mac_op_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
6365
u32 queues, bool drop)
6366
{
6367
struct ath12k *ar = hw->priv;
6368
long time_left;
6369
6370
if (drop)
6371
return;
6372
6373
time_left = wait_event_timeout(ar->dp.tx_empty_waitq,
6374
(atomic_read(&ar->dp.num_tx_pending) == 0),
6375
ATH12K_FLUSH_TIMEOUT);
6376
if (time_left == 0)
6377
ath12k_warn(ar->ab, "failed to flush transmit queue %ld\n", time_left);
6378
6379
time_left = wait_event_timeout(ar->txmgmt_empty_waitq,
6380
(atomic_read(&ar->num_pending_mgmt_tx) == 0),
6381
ATH12K_FLUSH_TIMEOUT);
6382
if (time_left == 0)
6383
ath12k_warn(ar->ab, "failed to flush mgmt transmit queue %ld\n",
6384
time_left);
6385
}
6386
6387
static int
6388
ath12k_mac_bitrate_mask_num_ht_rates(struct ath12k *ar,
6389
enum nl80211_band band,
6390
const struct cfg80211_bitrate_mask *mask)
6391
{
6392
int num_rates = 0;
6393
int i;
6394
6395
for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++)
6396
num_rates += hweight16(mask->control[band].ht_mcs[i]);
6397
6398
return num_rates;
6399
}
6400
6401
static bool
6402
ath12k_mac_has_single_legacy_rate(struct ath12k *ar,
6403
enum nl80211_band band,
6404
const struct cfg80211_bitrate_mask *mask)
6405
{
6406
int num_rates = 0;
6407
6408
num_rates = hweight32(mask->control[band].legacy);
6409
6410
if (ath12k_mac_bitrate_mask_num_ht_rates(ar, band, mask))
6411
return false;
6412
6413
if (ath12k_mac_bitrate_mask_num_vht_rates(ar, band, mask))
6414
return false;
6415
6416
return num_rates == 1;
6417
}
6418
6419
static bool
6420
ath12k_mac_bitrate_mask_get_single_nss(struct ath12k *ar,
6421
enum nl80211_band band,
6422
const struct cfg80211_bitrate_mask *mask,
6423
int *nss)
6424
{
6425
struct ieee80211_supported_band *sband = &ar->mac.sbands[band];
6426
u16 vht_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
6427
u8 ht_nss_mask = 0;
6428
u8 vht_nss_mask = 0;
6429
int i;
6430
6431
/* No need to consider legacy here. Basic rates are always present
6432
* in bitrate mask
6433
*/
6434
6435
for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) {
6436
if (mask->control[band].ht_mcs[i] == 0)
6437
continue;
6438
else if (mask->control[band].ht_mcs[i] ==
6439
sband->ht_cap.mcs.rx_mask[i])
6440
ht_nss_mask |= BIT(i);
6441
else
6442
return false;
6443
}
6444
6445
for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
6446
if (mask->control[band].vht_mcs[i] == 0)
6447
continue;
6448
else if (mask->control[band].vht_mcs[i] ==
6449
ath12k_mac_get_max_vht_mcs_map(vht_mcs_map, i))
6450
vht_nss_mask |= BIT(i);
6451
else
6452
return false;
6453
}
6454
6455
if (ht_nss_mask != vht_nss_mask)
6456
return false;
6457
6458
if (ht_nss_mask == 0)
6459
return false;
6460
6461
if (BIT(fls(ht_nss_mask)) - 1 != ht_nss_mask)
6462
return false;
6463
6464
*nss = fls(ht_nss_mask);
6465
6466
return true;
6467
}
6468
6469
static int
6470
ath12k_mac_get_single_legacy_rate(struct ath12k *ar,
6471
enum nl80211_band band,
6472
const struct cfg80211_bitrate_mask *mask,
6473
u32 *rate, u8 *nss)
6474
{
6475
int rate_idx;
6476
u16 bitrate;
6477
u8 preamble;
6478
u8 hw_rate;
6479
6480
if (hweight32(mask->control[band].legacy) != 1)
6481
return -EINVAL;
6482
6483
rate_idx = ffs(mask->control[band].legacy) - 1;
6484
6485
if (band == NL80211_BAND_5GHZ || band == NL80211_BAND_6GHZ)
6486
rate_idx += ATH12K_MAC_FIRST_OFDM_RATE_IDX;
6487
6488
hw_rate = ath12k_legacy_rates[rate_idx].hw_value;
6489
bitrate = ath12k_legacy_rates[rate_idx].bitrate;
6490
6491
if (ath12k_mac_bitrate_is_cck(bitrate))
6492
preamble = WMI_RATE_PREAMBLE_CCK;
6493
else
6494
preamble = WMI_RATE_PREAMBLE_OFDM;
6495
6496
*nss = 1;
6497
*rate = ATH12K_HW_RATE_CODE(hw_rate, 0, preamble);
6498
6499
return 0;
6500
}
6501
6502
static int ath12k_mac_set_fixed_rate_params(struct ath12k_vif *arvif,
6503
u32 rate, u8 nss, u8 sgi, u8 ldpc)
6504
{
6505
struct ath12k *ar = arvif->ar;
6506
u32 vdev_param;
6507
int ret;
6508
6509
lockdep_assert_held(&ar->conf_mutex);
6510
6511
ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac set fixed rate params vdev %i rate 0x%02x nss %u sgi %u\n",
6512
arvif->vdev_id, rate, nss, sgi);
6513
6514
vdev_param = WMI_VDEV_PARAM_FIXED_RATE;
6515
ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
6516
vdev_param, rate);
6517
if (ret) {
6518
ath12k_warn(ar->ab, "failed to set fixed rate param 0x%02x: %d\n",
6519
rate, ret);
6520
return ret;
6521
}
6522
6523
vdev_param = WMI_VDEV_PARAM_NSS;
6524
ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
6525
vdev_param, nss);
6526
if (ret) {
6527
ath12k_warn(ar->ab, "failed to set nss param %d: %d\n",
6528
nss, ret);
6529
return ret;
6530
}
6531
6532
vdev_param = WMI_VDEV_PARAM_SGI;
6533
ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
6534
vdev_param, sgi);
6535
if (ret) {
6536
ath12k_warn(ar->ab, "failed to set sgi param %d: %d\n",
6537
sgi, ret);
6538
return ret;
6539
}
6540
6541
vdev_param = WMI_VDEV_PARAM_LDPC;
6542
ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
6543
vdev_param, ldpc);
6544
if (ret) {
6545
ath12k_warn(ar->ab, "failed to set ldpc param %d: %d\n",
6546
ldpc, ret);
6547
return ret;
6548
}
6549
6550
return 0;
6551
}
6552
6553
static bool
6554
ath12k_mac_vht_mcs_range_present(struct ath12k *ar,
6555
enum nl80211_band band,
6556
const struct cfg80211_bitrate_mask *mask)
6557
{
6558
int i;
6559
u16 vht_mcs;
6560
6561
for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
6562
vht_mcs = mask->control[band].vht_mcs[i];
6563
6564
switch (vht_mcs) {
6565
case 0:
6566
case BIT(8) - 1:
6567
case BIT(9) - 1:
6568
case BIT(10) - 1:
6569
break;
6570
default:
6571
return false;
6572
}
6573
}
6574
6575
return true;
6576
}
6577
6578
static void ath12k_mac_set_bitrate_mask_iter(void *data,
6579
struct ieee80211_sta *sta)
6580
{
6581
struct ath12k_vif *arvif = data;
6582
struct ath12k_sta *arsta = (struct ath12k_sta *)sta->drv_priv;
6583
struct ath12k *ar = arvif->ar;
6584
6585
spin_lock_bh(&ar->data_lock);
6586
arsta->changed |= IEEE80211_RC_SUPP_RATES_CHANGED;
6587
spin_unlock_bh(&ar->data_lock);
6588
6589
ieee80211_queue_work(ar->hw, &arsta->update_wk);
6590
}
6591
6592
static void ath12k_mac_disable_peer_fixed_rate(void *data,
6593
struct ieee80211_sta *sta)
6594
{
6595
struct ath12k_vif *arvif = data;
6596
struct ath12k *ar = arvif->ar;
6597
int ret;
6598
6599
ret = ath12k_wmi_set_peer_param(ar, sta->addr,
6600
arvif->vdev_id,
6601
WMI_PEER_PARAM_FIXED_RATE,
6602
WMI_FIXED_RATE_NONE);
6603
if (ret)
6604
ath12k_warn(ar->ab,
6605
"failed to disable peer fixed rate for STA %pM ret %d\n",
6606
sta->addr, ret);
6607
}
6608
6609
static int
6610
ath12k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw,
6611
struct ieee80211_vif *vif,
6612
const struct cfg80211_bitrate_mask *mask)
6613
{
6614
struct ath12k_vif *arvif = (void *)vif->drv_priv;
6615
struct cfg80211_chan_def def;
6616
struct ath12k *ar = arvif->ar;
6617
enum nl80211_band band;
6618
const u8 *ht_mcs_mask;
6619
const u16 *vht_mcs_mask;
6620
u32 rate;
6621
u8 nss;
6622
u8 sgi;
6623
u8 ldpc;
6624
int single_nss;
6625
int ret;
6626
int num_rates;
6627
6628
if (ath12k_mac_vif_chan(vif, &def))
6629
return -EPERM;
6630
6631
band = def.chan->band;
6632
ht_mcs_mask = mask->control[band].ht_mcs;
6633
vht_mcs_mask = mask->control[band].vht_mcs;
6634
ldpc = !!(ar->ht_cap_info & WMI_HT_CAP_LDPC);
6635
6636
sgi = mask->control[band].gi;
6637
if (sgi == NL80211_TXRATE_FORCE_LGI)
6638
return -EINVAL;
6639
6640
/* mac80211 doesn't support sending a fixed HT/VHT MCS alone, rather it
6641
* requires passing at least one of used basic rates along with them.
6642
* Fixed rate setting across different preambles(legacy, HT, VHT) is
6643
* not supported by the FW. Hence use of FIXED_RATE vdev param is not
6644
* suitable for setting single HT/VHT rates.
6645
* But, there could be a single basic rate passed from userspace which
6646
* can be done through the FIXED_RATE param.
6647
*/
6648
if (ath12k_mac_has_single_legacy_rate(ar, band, mask)) {
6649
ret = ath12k_mac_get_single_legacy_rate(ar, band, mask, &rate,
6650
&nss);
6651
if (ret) {
6652
ath12k_warn(ar->ab, "failed to get single legacy rate for vdev %i: %d\n",
6653
arvif->vdev_id, ret);
6654
return ret;
6655
}
6656
ieee80211_iterate_stations_atomic(ar->hw,
6657
ath12k_mac_disable_peer_fixed_rate,
6658
arvif);
6659
} else if (ath12k_mac_bitrate_mask_get_single_nss(ar, band, mask,
6660
&single_nss)) {
6661
rate = WMI_FIXED_RATE_NONE;
6662
nss = single_nss;
6663
} else {
6664
rate = WMI_FIXED_RATE_NONE;
6665
nss = min_t(u32, ar->num_tx_chains,
6666
max(ath12k_mac_max_ht_nss(ht_mcs_mask),
6667
ath12k_mac_max_vht_nss(vht_mcs_mask)));
6668
6669
/* If multiple rates across different preambles are given
6670
* we can reconfigure this info with all peers using PEER_ASSOC
6671
* command with the below exception cases.
6672
* - Single VHT Rate : peer_assoc command accommodates only MCS
6673
* range values i.e 0-7, 0-8, 0-9 for VHT. Though mac80211
6674
* mandates passing basic rates along with HT/VHT rates, FW
6675
* doesn't allow switching from VHT to Legacy. Hence instead of
6676
* setting legacy and VHT rates using RATEMASK_CMD vdev cmd,
6677
* we could set this VHT rate as peer fixed rate param, which
6678
* will override FIXED rate and FW rate control algorithm.
6679
* If single VHT rate is passed along with HT rates, we select
6680
* the VHT rate as fixed rate for vht peers.
6681
* - Multiple VHT Rates : When Multiple VHT rates are given,this
6682
* can be set using RATEMASK CMD which uses FW rate-ctl alg.
6683
* TODO: Setting multiple VHT MCS and replacing peer_assoc with
6684
* RATEMASK_CMDID can cover all use cases of setting rates
6685
* across multiple preambles and rates within same type.
6686
* But requires more validation of the command at this point.
6687
*/
6688
6689
num_rates = ath12k_mac_bitrate_mask_num_vht_rates(ar, band,
6690
mask);
6691
6692
if (!ath12k_mac_vht_mcs_range_present(ar, band, mask) &&
6693
num_rates > 1) {
6694
/* TODO: Handle multiple VHT MCS values setting using
6695
* RATEMASK CMD
6696
*/
6697
ath12k_warn(ar->ab,
6698
"Setting more than one MCS Value in bitrate mask not supported\n");
6699
return -EINVAL;
6700
}
6701
6702
ieee80211_iterate_stations_atomic(ar->hw,
6703
ath12k_mac_disable_peer_fixed_rate,
6704
arvif);
6705
6706
mutex_lock(&ar->conf_mutex);
6707
6708
arvif->bitrate_mask = *mask;
6709
ieee80211_iterate_stations_atomic(ar->hw,
6710
ath12k_mac_set_bitrate_mask_iter,
6711
arvif);
6712
6713
mutex_unlock(&ar->conf_mutex);
6714
}
6715
6716
mutex_lock(&ar->conf_mutex);
6717
6718
ret = ath12k_mac_set_fixed_rate_params(arvif, rate, nss, sgi, ldpc);
6719
if (ret) {
6720
ath12k_warn(ar->ab, "failed to set fixed rate params on vdev %i: %d\n",
6721
arvif->vdev_id, ret);
6722
}
6723
6724
mutex_unlock(&ar->conf_mutex);
6725
6726
return ret;
6727
}
6728
6729
static void
6730
ath12k_mac_op_reconfig_complete(struct ieee80211_hw *hw,
6731
enum ieee80211_reconfig_type reconfig_type)
6732
{
6733
struct ath12k *ar = hw->priv;
6734
struct ath12k_base *ab = ar->ab;
6735
struct ath12k_vif *arvif;
6736
int recovery_count;
6737
6738
if (reconfig_type != IEEE80211_RECONFIG_TYPE_RESTART)
6739
return;
6740
6741
mutex_lock(&ar->conf_mutex);
6742
6743
if (ar->state == ATH12K_STATE_RESTARTED) {
6744
ath12k_warn(ar->ab, "pdev %d successfully recovered\n",
6745
ar->pdev->pdev_id);
6746
ar->state = ATH12K_STATE_ON;
6747
ieee80211_wake_queues(ar->hw);
6748
6749
if (ab->is_reset) {
6750
recovery_count = atomic_inc_return(&ab->recovery_count);
6751
ath12k_dbg(ab, ATH12K_DBG_BOOT, "recovery count %d\n",
6752
recovery_count);
6753
/* When there are multiple radios in an SOC,
6754
* the recovery has to be done for each radio
6755
*/
6756
if (recovery_count == ab->num_radios) {
6757
atomic_dec(&ab->reset_count);
6758
complete(&ab->reset_complete);
6759
ab->is_reset = false;
6760
atomic_set(&ab->fail_cont_count, 0);
6761
ath12k_dbg(ab, ATH12K_DBG_BOOT, "reset success\n");
6762
}
6763
}
6764
6765
list_for_each_entry(arvif, &ar->arvifs, list) {
6766
ath12k_dbg(ab, ATH12K_DBG_BOOT,
6767
"reconfig cipher %d up %d vdev type %d\n",
6768
arvif->key_cipher,
6769
arvif->is_up,
6770
arvif->vdev_type);
6771
/* After trigger disconnect, then upper layer will
6772
* trigger connect again, then the PN number of
6773
* upper layer will be reset to keep up with AP
6774
* side, hence PN number mis-match will not happened.
6775
*/
6776
if (arvif->is_up &&
6777
arvif->vdev_type == WMI_VDEV_TYPE_STA &&
6778
arvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE) {
6779
ieee80211_hw_restart_disconnect(arvif->vif);
6780
ath12k_dbg(ab, ATH12K_DBG_BOOT,
6781
"restart disconnect\n");
6782
}
6783
}
6784
}
6785
6786
mutex_unlock(&ar->conf_mutex);
6787
}
6788
6789
static void
6790
ath12k_mac_update_bss_chan_survey(struct ath12k *ar,
6791
struct ieee80211_channel *channel)
6792
{
6793
int ret;
6794
enum wmi_bss_chan_info_req_type type = WMI_BSS_SURVEY_REQ_TYPE_READ;
6795
6796
lockdep_assert_held(&ar->conf_mutex);
6797
6798
if (!test_bit(WMI_TLV_SERVICE_BSS_CHANNEL_INFO_64, ar->ab->wmi_ab.svc_map) ||
6799
ar->rx_channel != channel)
6800
return;
6801
6802
if (ar->scan.state != ATH12K_SCAN_IDLE) {
6803
ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
6804
"ignoring bss chan info req while scanning..\n");
6805
return;
6806
}
6807
6808
reinit_completion(&ar->bss_survey_done);
6809
6810
ret = ath12k_wmi_pdev_bss_chan_info_request(ar, type);
6811
if (ret) {
6812
ath12k_warn(ar->ab, "failed to send pdev bss chan info request\n");
6813
return;
6814
}
6815
6816
ret = wait_for_completion_timeout(&ar->bss_survey_done, 3 * HZ);
6817
if (ret == 0)
6818
ath12k_warn(ar->ab, "bss channel survey timed out\n");
6819
}
6820
6821
static int ath12k_mac_op_get_survey(struct ieee80211_hw *hw, int idx,
6822
struct survey_info *survey)
6823
{
6824
struct ath12k *ar = hw->priv;
6825
struct ieee80211_supported_band *sband;
6826
struct survey_info *ar_survey;
6827
int ret = 0;
6828
6829
if (idx >= ATH12K_NUM_CHANS)
6830
return -ENOENT;
6831
6832
ar_survey = &ar->survey[idx];
6833
6834
mutex_lock(&ar->conf_mutex);
6835
6836
sband = hw->wiphy->bands[NL80211_BAND_2GHZ];
6837
if (sband && idx >= sband->n_channels) {
6838
idx -= sband->n_channels;
6839
sband = NULL;
6840
}
6841
6842
if (!sband)
6843
sband = hw->wiphy->bands[NL80211_BAND_5GHZ];
6844
6845
if (!sband || idx >= sband->n_channels) {
6846
ret = -ENOENT;
6847
goto exit;
6848
}
6849
6850
ath12k_mac_update_bss_chan_survey(ar, &sband->channels[idx]);
6851
6852
spin_lock_bh(&ar->data_lock);
6853
memcpy(survey, ar_survey, sizeof(*survey));
6854
spin_unlock_bh(&ar->data_lock);
6855
6856
survey->channel = &sband->channels[idx];
6857
6858
if (ar->rx_channel == survey->channel)
6859
survey->filled |= SURVEY_INFO_IN_USE;
6860
6861
exit:
6862
mutex_unlock(&ar->conf_mutex);
6863
return ret;
6864
}
6865
6866
static void ath12k_mac_op_sta_statistics(struct ieee80211_hw *hw,
6867
struct ieee80211_vif *vif,
6868
struct ieee80211_sta *sta,
6869
struct station_info *sinfo)
6870
{
6871
struct ath12k_sta *arsta = (struct ath12k_sta *)sta->drv_priv;
6872
6873
sinfo->rx_duration = arsta->rx_duration;
6874
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_DURATION);
6875
6876
sinfo->tx_duration = arsta->tx_duration;
6877
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_DURATION);
6878
6879
if (!arsta->txrate.legacy && !arsta->txrate.nss)
6880
return;
6881
6882
if (arsta->txrate.legacy) {
6883
sinfo->txrate.legacy = arsta->txrate.legacy;
6884
} else {
6885
sinfo->txrate.mcs = arsta->txrate.mcs;
6886
sinfo->txrate.nss = arsta->txrate.nss;
6887
sinfo->txrate.bw = arsta->txrate.bw;
6888
sinfo->txrate.he_gi = arsta->txrate.he_gi;
6889
sinfo->txrate.he_dcm = arsta->txrate.he_dcm;
6890
sinfo->txrate.he_ru_alloc = arsta->txrate.he_ru_alloc;
6891
}
6892
sinfo->txrate.flags = arsta->txrate.flags;
6893
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
6894
6895
/* TODO: Use real NF instead of default one. */
6896
sinfo->signal = arsta->rssi_comb + ATH12K_DEFAULT_NOISE_FLOOR;
6897
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL);
6898
}
6899
6900
static const struct ieee80211_ops ath12k_ops = {
6901
.tx = ath12k_mac_op_tx,
6902
.wake_tx_queue = ieee80211_handle_wake_tx_queue,
6903
.start = ath12k_mac_op_start,
6904
.stop = ath12k_mac_op_stop,
6905
.reconfig_complete = ath12k_mac_op_reconfig_complete,
6906
.add_interface = ath12k_mac_op_add_interface,
6907
.remove_interface = ath12k_mac_op_remove_interface,
6908
.update_vif_offload = ath12k_mac_op_update_vif_offload,
6909
.config = ath12k_mac_op_config,
6910
.bss_info_changed = ath12k_mac_op_bss_info_changed,
6911
.configure_filter = ath12k_mac_op_configure_filter,
6912
.hw_scan = ath12k_mac_op_hw_scan,
6913
.cancel_hw_scan = ath12k_mac_op_cancel_hw_scan,
6914
.set_key = ath12k_mac_op_set_key,
6915
.sta_state = ath12k_mac_op_sta_state,
6916
.sta_set_txpwr = ath12k_mac_op_sta_set_txpwr,
6917
.sta_rc_update = ath12k_mac_op_sta_rc_update,
6918
.conf_tx = ath12k_mac_op_conf_tx,
6919
.set_antenna = ath12k_mac_op_set_antenna,
6920
.get_antenna = ath12k_mac_op_get_antenna,
6921
.ampdu_action = ath12k_mac_op_ampdu_action,
6922
.add_chanctx = ath12k_mac_op_add_chanctx,
6923
.remove_chanctx = ath12k_mac_op_remove_chanctx,
6924
.change_chanctx = ath12k_mac_op_change_chanctx,
6925
.assign_vif_chanctx = ath12k_mac_op_assign_vif_chanctx,
6926
.unassign_vif_chanctx = ath12k_mac_op_unassign_vif_chanctx,
6927
.switch_vif_chanctx = ath12k_mac_op_switch_vif_chanctx,
6928
.set_rts_threshold = ath12k_mac_op_set_rts_threshold,
6929
.set_frag_threshold = ath12k_mac_op_set_frag_threshold,
6930
.set_bitrate_mask = ath12k_mac_op_set_bitrate_mask,
6931
.get_survey = ath12k_mac_op_get_survey,
6932
.flush = ath12k_mac_op_flush,
6933
.sta_statistics = ath12k_mac_op_sta_statistics,
6934
};
6935
6936
static void ath12k_mac_update_ch_list(struct ath12k *ar,
6937
struct ieee80211_supported_band *band,
6938
u32 freq_low, u32 freq_high)
6939
{
6940
int i;
6941
6942
if (!(freq_low && freq_high))
6943
return;
6944
6945
for (i = 0; i < band->n_channels; i++) {
6946
if (band->channels[i].center_freq < freq_low ||
6947
band->channels[i].center_freq > freq_high)
6948
band->channels[i].flags |= IEEE80211_CHAN_DISABLED;
6949
}
6950
}
6951
6952
static u32 ath12k_get_phy_id(struct ath12k *ar, u32 band)
6953
{
6954
struct ath12k_pdev *pdev = ar->pdev;
6955
struct ath12k_pdev_cap *pdev_cap = &pdev->cap;
6956
6957
if (band == WMI_HOST_WLAN_2G_CAP)
6958
return pdev_cap->band[NL80211_BAND_2GHZ].phy_id;
6959
6960
if (band == WMI_HOST_WLAN_5G_CAP)
6961
return pdev_cap->band[NL80211_BAND_5GHZ].phy_id;
6962
6963
ath12k_warn(ar->ab, "unsupported phy cap:%d\n", band);
6964
6965
return 0;
6966
}
6967
6968
static int ath12k_mac_setup_channels_rates(struct ath12k *ar,
6969
u32 supported_bands)
6970
{
6971
struct ieee80211_supported_band *band;
6972
struct ath12k_wmi_hal_reg_capabilities_ext_arg *reg_cap;
6973
void *channels;
6974
u32 phy_id;
6975
6976
BUILD_BUG_ON((ARRAY_SIZE(ath12k_2ghz_channels) +
6977
ARRAY_SIZE(ath12k_5ghz_channels) +
6978
ARRAY_SIZE(ath12k_6ghz_channels)) !=
6979
ATH12K_NUM_CHANS);
6980
6981
reg_cap = &ar->ab->hal_reg_cap[ar->pdev_idx];
6982
6983
if (supported_bands & WMI_HOST_WLAN_2G_CAP) {
6984
channels = kmemdup(ath12k_2ghz_channels,
6985
sizeof(ath12k_2ghz_channels),
6986
GFP_KERNEL);
6987
if (!channels)
6988
return -ENOMEM;
6989
6990
band = &ar->mac.sbands[NL80211_BAND_2GHZ];
6991
band->band = NL80211_BAND_2GHZ;
6992
band->n_channels = ARRAY_SIZE(ath12k_2ghz_channels);
6993
band->channels = channels;
6994
band->n_bitrates = ath12k_g_rates_size;
6995
band->bitrates = ath12k_g_rates;
6996
ar->hw->wiphy->bands[NL80211_BAND_2GHZ] = band;
6997
6998
if (ar->ab->hw_params->single_pdev_only) {
6999
phy_id = ath12k_get_phy_id(ar, WMI_HOST_WLAN_2G_CAP);
7000
reg_cap = &ar->ab->hal_reg_cap[phy_id];
7001
}
7002
ath12k_mac_update_ch_list(ar, band,
7003
reg_cap->low_2ghz_chan,
7004
reg_cap->high_2ghz_chan);
7005
}
7006
7007
if (supported_bands & WMI_HOST_WLAN_5G_CAP) {
7008
if (reg_cap->high_5ghz_chan >= ATH12K_MAX_6G_FREQ) {
7009
channels = kmemdup(ath12k_6ghz_channels,
7010
sizeof(ath12k_6ghz_channels), GFP_KERNEL);
7011
if (!channels) {
7012
kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
7013
return -ENOMEM;
7014
}
7015
7016
ar->supports_6ghz = true;
7017
band = &ar->mac.sbands[NL80211_BAND_6GHZ];
7018
band->band = NL80211_BAND_6GHZ;
7019
band->n_channels = ARRAY_SIZE(ath12k_6ghz_channels);
7020
band->channels = channels;
7021
band->n_bitrates = ath12k_a_rates_size;
7022
band->bitrates = ath12k_a_rates;
7023
ar->hw->wiphy->bands[NL80211_BAND_6GHZ] = band;
7024
ath12k_mac_update_ch_list(ar, band,
7025
reg_cap->low_5ghz_chan,
7026
reg_cap->high_5ghz_chan);
7027
}
7028
7029
if (reg_cap->low_5ghz_chan < ATH12K_MIN_6G_FREQ) {
7030
channels = kmemdup(ath12k_5ghz_channels,
7031
sizeof(ath12k_5ghz_channels),
7032
GFP_KERNEL);
7033
if (!channels) {
7034
kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
7035
kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
7036
return -ENOMEM;
7037
}
7038
7039
band = &ar->mac.sbands[NL80211_BAND_5GHZ];
7040
band->band = NL80211_BAND_5GHZ;
7041
band->n_channels = ARRAY_SIZE(ath12k_5ghz_channels);
7042
band->channels = channels;
7043
band->n_bitrates = ath12k_a_rates_size;
7044
band->bitrates = ath12k_a_rates;
7045
ar->hw->wiphy->bands[NL80211_BAND_5GHZ] = band;
7046
7047
if (ar->ab->hw_params->single_pdev_only) {
7048
phy_id = ath12k_get_phy_id(ar, WMI_HOST_WLAN_5G_CAP);
7049
reg_cap = &ar->ab->hal_reg_cap[phy_id];
7050
}
7051
7052
ath12k_mac_update_ch_list(ar, band,
7053
reg_cap->low_5ghz_chan,
7054
reg_cap->high_5ghz_chan);
7055
}
7056
}
7057
7058
return 0;
7059
}
7060
7061
static int ath12k_mac_setup_iface_combinations(struct ath12k *ar)
7062
{
7063
struct ath12k_base *ab = ar->ab;
7064
struct ieee80211_iface_combination *combinations;
7065
struct ieee80211_iface_limit *limits;
7066
int n_limits, max_interfaces;
7067
bool ap, mesh;
7068
7069
ap = ab->hw_params->interface_modes & BIT(NL80211_IFTYPE_AP);
7070
7071
mesh = IS_ENABLED(CONFIG_MAC80211_MESH) &&
7072
ab->hw_params->interface_modes & BIT(NL80211_IFTYPE_MESH_POINT);
7073
7074
combinations = kzalloc(sizeof(*combinations), GFP_KERNEL);
7075
if (!combinations)
7076
return -ENOMEM;
7077
7078
if (ap || mesh) {
7079
n_limits = 2;
7080
max_interfaces = 16;
7081
} else {
7082
n_limits = 1;
7083
max_interfaces = 1;
7084
}
7085
7086
limits = kcalloc(n_limits, sizeof(*limits), GFP_KERNEL);
7087
if (!limits) {
7088
kfree(combinations);
7089
return -ENOMEM;
7090
}
7091
7092
limits[0].max = 1;
7093
limits[0].types |= BIT(NL80211_IFTYPE_STATION);
7094
7095
if (ap) {
7096
limits[1].max = max_interfaces;
7097
limits[1].types |= BIT(NL80211_IFTYPE_AP);
7098
}
7099
7100
if (mesh)
7101
limits[1].types |= BIT(NL80211_IFTYPE_MESH_POINT);
7102
7103
combinations[0].limits = limits;
7104
combinations[0].n_limits = n_limits;
7105
combinations[0].max_interfaces = max_interfaces;
7106
combinations[0].num_different_channels = 1;
7107
combinations[0].beacon_int_infra_match = true;
7108
combinations[0].beacon_int_min_gcd = 100;
7109
combinations[0].radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
7110
BIT(NL80211_CHAN_WIDTH_20) |
7111
BIT(NL80211_CHAN_WIDTH_40) |
7112
BIT(NL80211_CHAN_WIDTH_80);
7113
7114
ar->hw->wiphy->iface_combinations = combinations;
7115
ar->hw->wiphy->n_iface_combinations = 1;
7116
7117
return 0;
7118
}
7119
7120
static const u8 ath12k_if_types_ext_capa[] = {
7121
[0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
7122
[7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
7123
};
7124
7125
static const u8 ath12k_if_types_ext_capa_sta[] = {
7126
[0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
7127
[7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
7128
[9] = WLAN_EXT_CAPA10_TWT_REQUESTER_SUPPORT,
7129
};
7130
7131
static const u8 ath12k_if_types_ext_capa_ap[] = {
7132
[0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
7133
[7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
7134
[9] = WLAN_EXT_CAPA10_TWT_RESPONDER_SUPPORT,
7135
};
7136
7137
static const struct wiphy_iftype_ext_capab ath12k_iftypes_ext_capa[] = {
7138
{
7139
.extended_capabilities = ath12k_if_types_ext_capa,
7140
.extended_capabilities_mask = ath12k_if_types_ext_capa,
7141
.extended_capabilities_len = sizeof(ath12k_if_types_ext_capa),
7142
}, {
7143
.iftype = NL80211_IFTYPE_STATION,
7144
.extended_capabilities = ath12k_if_types_ext_capa_sta,
7145
.extended_capabilities_mask = ath12k_if_types_ext_capa_sta,
7146
.extended_capabilities_len =
7147
sizeof(ath12k_if_types_ext_capa_sta),
7148
}, {
7149
.iftype = NL80211_IFTYPE_AP,
7150
.extended_capabilities = ath12k_if_types_ext_capa_ap,
7151
.extended_capabilities_mask = ath12k_if_types_ext_capa_ap,
7152
.extended_capabilities_len =
7153
sizeof(ath12k_if_types_ext_capa_ap),
7154
},
7155
};
7156
7157
static void __ath12k_mac_unregister(struct ath12k *ar)
7158
{
7159
cancel_work_sync(&ar->regd_update_work);
7160
7161
ieee80211_unregister_hw(ar->hw);
7162
7163
idr_for_each(&ar->txmgmt_idr, ath12k_mac_tx_mgmt_pending_free, ar);
7164
idr_destroy(&ar->txmgmt_idr);
7165
7166
kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
7167
kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels);
7168
kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
7169
7170
kfree(ar->hw->wiphy->iface_combinations[0].limits);
7171
kfree(ar->hw->wiphy->iface_combinations);
7172
7173
SET_IEEE80211_DEV(ar->hw, NULL);
7174
}
7175
7176
void ath12k_mac_unregister(struct ath12k_base *ab)
7177
{
7178
struct ath12k *ar;
7179
struct ath12k_pdev *pdev;
7180
int i;
7181
7182
for (i = 0; i < ab->num_radios; i++) {
7183
pdev = &ab->pdevs[i];
7184
ar = pdev->ar;
7185
if (!ar)
7186
continue;
7187
7188
__ath12k_mac_unregister(ar);
7189
}
7190
}
7191
7192
static int __ath12k_mac_register(struct ath12k *ar)
7193
{
7194
struct ath12k_base *ab = ar->ab;
7195
struct ath12k_pdev_cap *cap = &ar->pdev->cap;
7196
static const u32 cipher_suites[] = {
7197
WLAN_CIPHER_SUITE_TKIP,
7198
WLAN_CIPHER_SUITE_CCMP,
7199
WLAN_CIPHER_SUITE_AES_CMAC,
7200
WLAN_CIPHER_SUITE_BIP_CMAC_256,
7201
WLAN_CIPHER_SUITE_BIP_GMAC_128,
7202
WLAN_CIPHER_SUITE_BIP_GMAC_256,
7203
WLAN_CIPHER_SUITE_GCMP,
7204
WLAN_CIPHER_SUITE_GCMP_256,
7205
WLAN_CIPHER_SUITE_CCMP_256,
7206
};
7207
int ret;
7208
u32 ht_cap = 0;
7209
7210
ath12k_pdev_caps_update(ar);
7211
7212
SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr);
7213
7214
SET_IEEE80211_DEV(ar->hw, ab->dev);
7215
7216
ret = ath12k_mac_setup_channels_rates(ar,
7217
cap->supported_bands);
7218
if (ret)
7219
goto err;
7220
7221
ath12k_mac_setup_ht_vht_cap(ar, cap, &ht_cap);
7222
ath12k_mac_setup_sband_iftype_data(ar, cap);
7223
7224
ret = ath12k_mac_setup_iface_combinations(ar);
7225
if (ret) {
7226
ath12k_err(ar->ab, "failed to setup interface combinations: %d\n", ret);
7227
goto err_free_channels;
7228
}
7229
7230
ar->hw->wiphy->available_antennas_rx = cap->rx_chain_mask;
7231
ar->hw->wiphy->available_antennas_tx = cap->tx_chain_mask;
7232
7233
ar->hw->wiphy->interface_modes = ab->hw_params->interface_modes;
7234
7235
ieee80211_hw_set(ar->hw, SIGNAL_DBM);
7236
ieee80211_hw_set(ar->hw, SUPPORTS_PS);
7237
ieee80211_hw_set(ar->hw, SUPPORTS_DYNAMIC_PS);
7238
ieee80211_hw_set(ar->hw, MFP_CAPABLE);
7239
ieee80211_hw_set(ar->hw, REPORTS_TX_ACK_STATUS);
7240
ieee80211_hw_set(ar->hw, HAS_RATE_CONTROL);
7241
ieee80211_hw_set(ar->hw, AP_LINK_PS);
7242
ieee80211_hw_set(ar->hw, SPECTRUM_MGMT);
7243
ieee80211_hw_set(ar->hw, CONNECTION_MONITOR);
7244
ieee80211_hw_set(ar->hw, SUPPORTS_PER_STA_GTK);
7245
ieee80211_hw_set(ar->hw, CHANCTX_STA_CSA);
7246
ieee80211_hw_set(ar->hw, QUEUE_CONTROL);
7247
ieee80211_hw_set(ar->hw, SUPPORTS_TX_FRAG);
7248
ieee80211_hw_set(ar->hw, REPORTS_LOW_ACK);
7249
7250
if (ht_cap & WMI_HT_CAP_ENABLED) {
7251
ieee80211_hw_set(ar->hw, AMPDU_AGGREGATION);
7252
ieee80211_hw_set(ar->hw, TX_AMPDU_SETUP_IN_HW);
7253
ieee80211_hw_set(ar->hw, SUPPORTS_REORDERING_BUFFER);
7254
ieee80211_hw_set(ar->hw, SUPPORTS_AMSDU_IN_AMPDU);
7255
ieee80211_hw_set(ar->hw, USES_RSS);
7256
}
7257
7258
ar->hw->wiphy->features |= NL80211_FEATURE_STATIC_SMPS;
7259
ar->hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
7260
7261
/* TODO: Check if HT capability advertised from firmware is different
7262
* for each band for a dual band capable radio. It will be tricky to
7263
* handle it when the ht capability different for each band.
7264
*/
7265
if (ht_cap & WMI_HT_CAP_DYNAMIC_SMPS)
7266
ar->hw->wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS;
7267
7268
ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID;
7269
ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN;
7270
7271
ar->hw->max_listen_interval = ATH12K_MAX_HW_LISTEN_INTERVAL;
7272
7273
ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
7274
ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
7275
ar->hw->wiphy->max_remain_on_channel_duration = 5000;
7276
7277
ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
7278
ar->hw->wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE |
7279
NL80211_FEATURE_AP_SCAN;
7280
7281
ar->max_num_stations = TARGET_NUM_STATIONS;
7282
ar->max_num_peers = TARGET_NUM_PEERS_PDEV;
7283
7284
ar->hw->wiphy->max_ap_assoc_sta = ar->max_num_stations;
7285
7286
ar->hw->queues = ATH12K_HW_MAX_QUEUES;
7287
ar->hw->wiphy->tx_queue_len = ATH12K_QUEUE_LEN;
7288
ar->hw->offchannel_tx_hw_queue = ATH12K_HW_MAX_QUEUES - 1;
7289
ar->hw->max_rx_aggregation_subframes = IEEE80211_MAX_AMPDU_BUF_HE;
7290
7291
ar->hw->vif_data_size = sizeof(struct ath12k_vif);
7292
ar->hw->sta_data_size = sizeof(struct ath12k_sta);
7293
7294
wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
7295
wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_STA_TX_PWR);
7296
7297
ar->hw->wiphy->cipher_suites = cipher_suites;
7298
ar->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
7299
7300
ar->hw->wiphy->iftype_ext_capab = ath12k_iftypes_ext_capa;
7301
ar->hw->wiphy->num_iftype_ext_capab =
7302
ARRAY_SIZE(ath12k_iftypes_ext_capa);
7303
7304
if (ar->supports_6ghz) {
7305
wiphy_ext_feature_set(ar->hw->wiphy,
7306
NL80211_EXT_FEATURE_FILS_DISCOVERY);
7307
wiphy_ext_feature_set(ar->hw->wiphy,
7308
NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP);
7309
}
7310
7311
wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_PUNCT);
7312
7313
ath12k_reg_init(ar);
7314
7315
if (!test_bit(ATH12K_FLAG_RAW_MODE, &ab->dev_flags)) {
7316
ar->hw->netdev_features = NETIF_F_HW_CSUM;
7317
ieee80211_hw_set(ar->hw, SW_CRYPTO_CONTROL);
7318
ieee80211_hw_set(ar->hw, SUPPORT_FAST_XMIT);
7319
}
7320
7321
ret = ieee80211_register_hw(ar->hw);
7322
if (ret) {
7323
ath12k_err(ar->ab, "ieee80211 registration failed: %d\n", ret);
7324
goto err_free_if_combs;
7325
}
7326
7327
if (!ab->hw_params->supports_monitor)
7328
/* There's a race between calling ieee80211_register_hw()
7329
* and here where the monitor mode is enabled for a little
7330
* while. But that time is so short and in practise it make
7331
* a difference in real life.
7332
*/
7333
ar->hw->wiphy->interface_modes &= ~BIT(NL80211_IFTYPE_MONITOR);
7334
7335
/* Apply the regd received during initialization */
7336
ret = ath12k_regd_update(ar, true);
7337
if (ret) {
7338
ath12k_err(ar->ab, "ath12k regd update failed: %d\n", ret);
7339
goto err_unregister_hw;
7340
}
7341
7342
return 0;
7343
7344
err_unregister_hw:
7345
ieee80211_unregister_hw(ar->hw);
7346
7347
err_free_if_combs:
7348
kfree(ar->hw->wiphy->iface_combinations[0].limits);
7349
kfree(ar->hw->wiphy->iface_combinations);
7350
7351
err_free_channels:
7352
kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
7353
kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels);
7354
kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
7355
7356
err:
7357
SET_IEEE80211_DEV(ar->hw, NULL);
7358
return ret;
7359
}
7360
7361
int ath12k_mac_register(struct ath12k_base *ab)
7362
{
7363
struct ath12k *ar;
7364
struct ath12k_pdev *pdev;
7365
int i;
7366
int ret;
7367
7368
if (test_bit(ATH12K_FLAG_REGISTERED, &ab->dev_flags))
7369
return 0;
7370
7371
for (i = 0; i < ab->num_radios; i++) {
7372
pdev = &ab->pdevs[i];
7373
ar = pdev->ar;
7374
if (ab->pdevs_macaddr_valid) {
7375
ether_addr_copy(ar->mac_addr, pdev->mac_addr);
7376
} else {
7377
ether_addr_copy(ar->mac_addr, ab->mac_addr);
7378
ar->mac_addr[4] += i;
7379
}
7380
7381
ret = __ath12k_mac_register(ar);
7382
if (ret)
7383
goto err_cleanup;
7384
7385
init_waitqueue_head(&ar->txmgmt_empty_waitq);
7386
idr_init(&ar->txmgmt_idr);
7387
spin_lock_init(&ar->txmgmt_idr_lock);
7388
}
7389
7390
/* Initialize channel counters frequency value in hertz */
7391
ab->cc_freq_hz = 320000;
7392
ab->free_vdev_map = (1LL << (ab->num_radios * TARGET_NUM_VDEVS)) - 1;
7393
7394
return 0;
7395
7396
err_cleanup:
7397
for (i = i - 1; i >= 0; i--) {
7398
pdev = &ab->pdevs[i];
7399
ar = pdev->ar;
7400
__ath12k_mac_unregister(ar);
7401
}
7402
7403
return ret;
7404
}
7405
7406
int ath12k_mac_allocate(struct ath12k_base *ab)
7407
{
7408
struct ieee80211_hw *hw;
7409
struct ath12k *ar;
7410
struct ath12k_pdev *pdev;
7411
int ret;
7412
int i;
7413
7414
if (test_bit(ATH12K_FLAG_REGISTERED, &ab->dev_flags))
7415
return 0;
7416
7417
for (i = 0; i < ab->num_radios; i++) {
7418
pdev = &ab->pdevs[i];
7419
hw = ieee80211_alloc_hw(sizeof(struct ath12k), &ath12k_ops);
7420
if (!hw) {
7421
ath12k_warn(ab, "failed to allocate mac80211 hw device\n");
7422
ret = -ENOMEM;
7423
goto err_free_mac;
7424
}
7425
7426
ar = hw->priv;
7427
ar->hw = hw;
7428
ar->ab = ab;
7429
ar->pdev = pdev;
7430
ar->pdev_idx = i;
7431
ar->lmac_id = ath12k_hw_get_mac_from_pdev_id(ab->hw_params, i);
7432
7433
ar->wmi = &ab->wmi_ab.wmi[i];
7434
/* FIXME: wmi[0] is already initialized during attach,
7435
* Should we do this again?
7436
*/
7437
ath12k_wmi_pdev_attach(ab, i);
7438
7439
ar->cfg_tx_chainmask = pdev->cap.tx_chain_mask;
7440
ar->cfg_rx_chainmask = pdev->cap.rx_chain_mask;
7441
ar->num_tx_chains = hweight32(pdev->cap.tx_chain_mask);
7442
ar->num_rx_chains = hweight32(pdev->cap.rx_chain_mask);
7443
7444
pdev->ar = ar;
7445
spin_lock_init(&ar->data_lock);
7446
INIT_LIST_HEAD(&ar->arvifs);
7447
INIT_LIST_HEAD(&ar->ppdu_stats_info);
7448
mutex_init(&ar->conf_mutex);
7449
init_completion(&ar->vdev_setup_done);
7450
init_completion(&ar->vdev_delete_done);
7451
init_completion(&ar->peer_assoc_done);
7452
init_completion(&ar->peer_delete_done);
7453
init_completion(&ar->install_key_done);
7454
init_completion(&ar->bss_survey_done);
7455
init_completion(&ar->scan.started);
7456
init_completion(&ar->scan.completed);
7457
7458
INIT_DELAYED_WORK(&ar->scan.timeout, ath12k_scan_timeout_work);
7459
INIT_WORK(&ar->regd_update_work, ath12k_regd_update_work);
7460
7461
INIT_WORK(&ar->wmi_mgmt_tx_work, ath12k_mgmt_over_wmi_tx_work);
7462
skb_queue_head_init(&ar->wmi_mgmt_tx_queue);
7463
clear_bit(ATH12K_FLAG_MONITOR_ENABLED, &ar->monitor_flags);
7464
}
7465
7466
return 0;
7467
7468
err_free_mac:
7469
ath12k_mac_destroy(ab);
7470
7471
return ret;
7472
}
7473
7474
void ath12k_mac_destroy(struct ath12k_base *ab)
7475
{
7476
struct ath12k *ar;
7477
struct ath12k_pdev *pdev;
7478
int i;
7479
7480
for (i = 0; i < ab->num_radios; i++) {
7481
pdev = &ab->pdevs[i];
7482
ar = pdev->ar;
7483
if (!ar)
7484
continue;
7485
7486
ieee80211_free_hw(ar->hw);
7487
pdev->ar = NULL;
7488
}
7489
}
7490
7491