Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/contrib/dev/athk/ath10k/mac.c
105911 views
1
// SPDX-License-Identifier: ISC
2
/*
3
* Copyright (c) 2005-2011 Atheros Communications Inc.
4
* Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
5
* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.
6
* Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
7
*/
8
9
#include "mac.h"
10
11
#include <linux/export.h>
12
#include <net/cfg80211.h>
13
#include <net/mac80211.h>
14
#include <linux/etherdevice.h>
15
#include <linux/acpi.h>
16
#include <linux/of.h>
17
#include <linux/bitfield.h>
18
#include <linux/random.h>
19
20
#include "hif.h"
21
#include "core.h"
22
#include "debug.h"
23
#include "wmi.h"
24
#include "htt.h"
25
#include "txrx.h"
26
#include "testmode.h"
27
#include "wmi-tlv.h"
28
#include "wmi-ops.h"
29
#include "wow.h"
30
#include "leds.h"
31
32
/*********/
33
/* Rates */
34
/*********/
35
36
static struct ieee80211_rate ath10k_rates[] = {
37
{ .bitrate = 10,
38
.hw_value = ATH10K_HW_RATE_CCK_LP_1M },
39
{ .bitrate = 20,
40
.hw_value = ATH10K_HW_RATE_CCK_LP_2M,
41
.hw_value_short = ATH10K_HW_RATE_CCK_SP_2M,
42
.flags = IEEE80211_RATE_SHORT_PREAMBLE },
43
{ .bitrate = 55,
44
.hw_value = ATH10K_HW_RATE_CCK_LP_5_5M,
45
.hw_value_short = ATH10K_HW_RATE_CCK_SP_5_5M,
46
.flags = IEEE80211_RATE_SHORT_PREAMBLE },
47
{ .bitrate = 110,
48
.hw_value = ATH10K_HW_RATE_CCK_LP_11M,
49
.hw_value_short = ATH10K_HW_RATE_CCK_SP_11M,
50
.flags = IEEE80211_RATE_SHORT_PREAMBLE },
51
52
{ .bitrate = 60, .hw_value = ATH10K_HW_RATE_OFDM_6M },
53
{ .bitrate = 90, .hw_value = ATH10K_HW_RATE_OFDM_9M },
54
{ .bitrate = 120, .hw_value = ATH10K_HW_RATE_OFDM_12M },
55
{ .bitrate = 180, .hw_value = ATH10K_HW_RATE_OFDM_18M },
56
{ .bitrate = 240, .hw_value = ATH10K_HW_RATE_OFDM_24M },
57
{ .bitrate = 360, .hw_value = ATH10K_HW_RATE_OFDM_36M },
58
{ .bitrate = 480, .hw_value = ATH10K_HW_RATE_OFDM_48M },
59
{ .bitrate = 540, .hw_value = ATH10K_HW_RATE_OFDM_54M },
60
};
61
62
static struct ieee80211_rate ath10k_rates_rev2[] = {
63
{ .bitrate = 10,
64
.hw_value = ATH10K_HW_RATE_REV2_CCK_LP_1M },
65
{ .bitrate = 20,
66
.hw_value = ATH10K_HW_RATE_REV2_CCK_LP_2M,
67
.hw_value_short = ATH10K_HW_RATE_REV2_CCK_SP_2M,
68
.flags = IEEE80211_RATE_SHORT_PREAMBLE },
69
{ .bitrate = 55,
70
.hw_value = ATH10K_HW_RATE_REV2_CCK_LP_5_5M,
71
.hw_value_short = ATH10K_HW_RATE_REV2_CCK_SP_5_5M,
72
.flags = IEEE80211_RATE_SHORT_PREAMBLE },
73
{ .bitrate = 110,
74
.hw_value = ATH10K_HW_RATE_REV2_CCK_LP_11M,
75
.hw_value_short = ATH10K_HW_RATE_REV2_CCK_SP_11M,
76
.flags = IEEE80211_RATE_SHORT_PREAMBLE },
77
78
{ .bitrate = 60, .hw_value = ATH10K_HW_RATE_OFDM_6M },
79
{ .bitrate = 90, .hw_value = ATH10K_HW_RATE_OFDM_9M },
80
{ .bitrate = 120, .hw_value = ATH10K_HW_RATE_OFDM_12M },
81
{ .bitrate = 180, .hw_value = ATH10K_HW_RATE_OFDM_18M },
82
{ .bitrate = 240, .hw_value = ATH10K_HW_RATE_OFDM_24M },
83
{ .bitrate = 360, .hw_value = ATH10K_HW_RATE_OFDM_36M },
84
{ .bitrate = 480, .hw_value = ATH10K_HW_RATE_OFDM_48M },
85
{ .bitrate = 540, .hw_value = ATH10K_HW_RATE_OFDM_54M },
86
};
87
88
static const struct cfg80211_sar_freq_ranges ath10k_sar_freq_ranges[] = {
89
{.start_freq = 2402, .end_freq = 2494 },
90
{.start_freq = 5170, .end_freq = 5875 },
91
};
92
93
static const struct cfg80211_sar_capa ath10k_sar_capa = {
94
.type = NL80211_SAR_TYPE_POWER,
95
.num_freq_ranges = (ARRAY_SIZE(ath10k_sar_freq_ranges)),
96
.freq_ranges = &ath10k_sar_freq_ranges[0],
97
};
98
99
#define ATH10K_MAC_FIRST_OFDM_RATE_IDX 4
100
101
#define ath10k_a_rates (ath10k_rates + ATH10K_MAC_FIRST_OFDM_RATE_IDX)
102
#define ath10k_a_rates_size (ARRAY_SIZE(ath10k_rates) - \
103
ATH10K_MAC_FIRST_OFDM_RATE_IDX)
104
#define ath10k_g_rates (ath10k_rates + 0)
105
#define ath10k_g_rates_size (ARRAY_SIZE(ath10k_rates))
106
107
#define ath10k_g_rates_rev2 (ath10k_rates_rev2 + 0)
108
#define ath10k_g_rates_rev2_size (ARRAY_SIZE(ath10k_rates_rev2))
109
110
#define ath10k_wmi_legacy_rates ath10k_rates
111
112
static bool ath10k_mac_bitrate_is_cck(int bitrate)
113
{
114
switch (bitrate) {
115
case 10:
116
case 20:
117
case 55:
118
case 110:
119
return true;
120
}
121
122
return false;
123
}
124
125
static u8 ath10k_mac_bitrate_to_rate(int bitrate)
126
{
127
return DIV_ROUND_UP(bitrate, 5) |
128
(ath10k_mac_bitrate_is_cck(bitrate) ? BIT(7) : 0);
129
}
130
131
u8 ath10k_mac_hw_rate_to_idx(const struct ieee80211_supported_band *sband,
132
u8 hw_rate, bool cck)
133
{
134
const struct ieee80211_rate *rate;
135
int i;
136
137
for (i = 0; i < sband->n_bitrates; i++) {
138
rate = &sband->bitrates[i];
139
140
if (ath10k_mac_bitrate_is_cck(rate->bitrate) != cck)
141
continue;
142
143
if (rate->hw_value == hw_rate)
144
return i;
145
else if (rate->flags & IEEE80211_RATE_SHORT_PREAMBLE &&
146
rate->hw_value_short == hw_rate)
147
return i;
148
}
149
150
return 0;
151
}
152
153
u8 ath10k_mac_bitrate_to_idx(const struct ieee80211_supported_band *sband,
154
u32 bitrate)
155
{
156
int i;
157
158
for (i = 0; i < sband->n_bitrates; i++)
159
if (sband->bitrates[i].bitrate == bitrate)
160
return i;
161
162
return 0;
163
}
164
165
static int ath10k_mac_get_rate_hw_value(int bitrate)
166
{
167
int i;
168
u8 hw_value_prefix = 0;
169
170
if (ath10k_mac_bitrate_is_cck(bitrate))
171
hw_value_prefix = WMI_RATE_PREAMBLE_CCK << 6;
172
173
for (i = 0; i < ARRAY_SIZE(ath10k_rates); i++) {
174
if (ath10k_rates[i].bitrate == bitrate)
175
return hw_value_prefix | ath10k_rates[i].hw_value;
176
}
177
178
return -EINVAL;
179
}
180
181
static int ath10k_mac_get_max_vht_mcs_map(u16 mcs_map, int nss)
182
{
183
switch ((mcs_map >> (2 * nss)) & 0x3) {
184
case IEEE80211_VHT_MCS_SUPPORT_0_7: return BIT(8) - 1;
185
case IEEE80211_VHT_MCS_SUPPORT_0_8: return BIT(9) - 1;
186
case IEEE80211_VHT_MCS_SUPPORT_0_9: return BIT(10) - 1;
187
}
188
return 0;
189
}
190
191
static u32
192
ath10k_mac_max_ht_nss(const u8 ht_mcs_mask[IEEE80211_HT_MCS_MASK_LEN])
193
{
194
int nss;
195
196
for (nss = IEEE80211_HT_MCS_MASK_LEN - 1; nss >= 0; nss--)
197
if (ht_mcs_mask[nss])
198
return nss + 1;
199
200
return 1;
201
}
202
203
static u32
204
ath10k_mac_max_vht_nss(const u16 vht_mcs_mask[NL80211_VHT_NSS_MAX])
205
{
206
int nss;
207
208
for (nss = NL80211_VHT_NSS_MAX - 1; nss >= 0; nss--)
209
if (vht_mcs_mask[nss])
210
return nss + 1;
211
212
return 1;
213
}
214
215
int ath10k_mac_ext_resource_config(struct ath10k *ar, u32 val)
216
{
217
enum wmi_host_platform_type platform_type;
218
int ret;
219
220
if (test_bit(WMI_SERVICE_TX_MODE_DYNAMIC, ar->wmi.svc_map))
221
platform_type = WMI_HOST_PLATFORM_LOW_PERF;
222
else
223
platform_type = WMI_HOST_PLATFORM_HIGH_PERF;
224
225
ret = ath10k_wmi_ext_resource_config(ar, platform_type, val);
226
227
if (ret && ret != -EOPNOTSUPP) {
228
ath10k_warn(ar, "failed to configure ext resource: %d\n", ret);
229
return ret;
230
}
231
232
return 0;
233
}
234
235
/**********/
236
/* Crypto */
237
/**********/
238
239
static int ath10k_send_key(struct ath10k_vif *arvif,
240
struct ieee80211_key_conf *key,
241
enum set_key_cmd cmd,
242
const u8 *macaddr, u32 flags)
243
{
244
struct ath10k *ar = arvif->ar;
245
struct wmi_vdev_install_key_arg arg = {
246
.vdev_id = arvif->vdev_id,
247
.key_idx = key->keyidx,
248
.key_len = key->keylen,
249
.key_data = key->key,
250
.key_flags = flags,
251
.macaddr = macaddr,
252
};
253
254
lockdep_assert_held(&arvif->ar->conf_mutex);
255
256
switch (key->cipher) {
257
case WLAN_CIPHER_SUITE_CCMP:
258
arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_AES_CCM];
259
key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT;
260
break;
261
case WLAN_CIPHER_SUITE_TKIP:
262
arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_TKIP];
263
arg.key_txmic_len = 8;
264
arg.key_rxmic_len = 8;
265
break;
266
case WLAN_CIPHER_SUITE_WEP40:
267
case WLAN_CIPHER_SUITE_WEP104:
268
arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_WEP];
269
break;
270
case WLAN_CIPHER_SUITE_CCMP_256:
271
arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_AES_CCM];
272
break;
273
case WLAN_CIPHER_SUITE_GCMP:
274
case WLAN_CIPHER_SUITE_GCMP_256:
275
arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_AES_GCM];
276
key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT;
277
break;
278
case WLAN_CIPHER_SUITE_BIP_GMAC_128:
279
case WLAN_CIPHER_SUITE_BIP_GMAC_256:
280
case WLAN_CIPHER_SUITE_BIP_CMAC_256:
281
case WLAN_CIPHER_SUITE_AES_CMAC:
282
WARN_ON(1);
283
return -EINVAL;
284
default:
285
ath10k_warn(ar, "cipher %d is not supported\n", key->cipher);
286
return -EOPNOTSUPP;
287
}
288
289
if (test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags))
290
key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
291
292
if (cmd == DISABLE_KEY) {
293
if (flags & WMI_KEY_GROUP) {
294
/* Not all hardware handles group-key deletion operation
295
* correctly. Replace the key with a junk value to invalidate it.
296
*/
297
get_random_bytes(key->key, key->keylen);
298
} else {
299
arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_NONE];
300
arg.key_data = NULL;
301
}
302
}
303
304
return ath10k_wmi_vdev_install_key(arvif->ar, &arg);
305
}
306
307
static int ath10k_install_key(struct ath10k_vif *arvif,
308
struct ieee80211_key_conf *key,
309
enum set_key_cmd cmd,
310
const u8 *macaddr, u32 flags)
311
{
312
struct ath10k *ar = arvif->ar;
313
int ret;
314
unsigned long time_left;
315
316
lockdep_assert_held(&ar->conf_mutex);
317
318
reinit_completion(&ar->install_key_done);
319
320
if (arvif->nohwcrypt)
321
return 1;
322
323
ret = ath10k_send_key(arvif, key, cmd, macaddr, flags);
324
if (ret)
325
return ret;
326
327
time_left = wait_for_completion_timeout(&ar->install_key_done, 3 * HZ);
328
if (time_left == 0)
329
return -ETIMEDOUT;
330
331
return 0;
332
}
333
334
static int ath10k_install_peer_wep_keys(struct ath10k_vif *arvif,
335
const u8 *addr)
336
{
337
struct ath10k *ar = arvif->ar;
338
struct ath10k_peer *peer;
339
int ret;
340
int i;
341
u32 flags;
342
343
lockdep_assert_held(&ar->conf_mutex);
344
345
if (WARN_ON(arvif->vif->type != NL80211_IFTYPE_AP &&
346
arvif->vif->type != NL80211_IFTYPE_ADHOC &&
347
arvif->vif->type != NL80211_IFTYPE_MESH_POINT))
348
return -EINVAL;
349
350
spin_lock_bh(&ar->data_lock);
351
peer = ath10k_peer_find(ar, arvif->vdev_id, addr);
352
spin_unlock_bh(&ar->data_lock);
353
354
if (!peer)
355
return -ENOENT;
356
357
for (i = 0; i < ARRAY_SIZE(arvif->wep_keys); i++) {
358
if (arvif->wep_keys[i] == NULL)
359
continue;
360
361
switch (arvif->vif->type) {
362
case NL80211_IFTYPE_AP:
363
flags = WMI_KEY_PAIRWISE;
364
365
if (arvif->def_wep_key_idx == i)
366
flags |= WMI_KEY_TX_USAGE;
367
368
ret = ath10k_install_key(arvif, arvif->wep_keys[i],
369
SET_KEY, addr, flags);
370
if (ret < 0)
371
return ret;
372
break;
373
case NL80211_IFTYPE_ADHOC:
374
ret = ath10k_install_key(arvif, arvif->wep_keys[i],
375
SET_KEY, addr,
376
WMI_KEY_PAIRWISE);
377
if (ret < 0)
378
return ret;
379
380
ret = ath10k_install_key(arvif, arvif->wep_keys[i],
381
SET_KEY, addr, WMI_KEY_GROUP);
382
if (ret < 0)
383
return ret;
384
break;
385
default:
386
WARN_ON(1);
387
return -EINVAL;
388
}
389
390
spin_lock_bh(&ar->data_lock);
391
peer->keys[i] = arvif->wep_keys[i];
392
spin_unlock_bh(&ar->data_lock);
393
}
394
395
/* In some cases (notably with static WEP IBSS with multiple keys)
396
* multicast Tx becomes broken. Both pairwise and groupwise keys are
397
* installed already. Using WMI_KEY_TX_USAGE in different combinations
398
* didn't seem help. Using def_keyid vdev parameter seems to be
399
* effective so use that.
400
*
401
* FIXME: Revisit. Perhaps this can be done in a less hacky way.
402
*/
403
if (arvif->vif->type != NL80211_IFTYPE_ADHOC)
404
return 0;
405
406
if (arvif->def_wep_key_idx == -1)
407
return 0;
408
409
ret = ath10k_wmi_vdev_set_param(arvif->ar,
410
arvif->vdev_id,
411
arvif->ar->wmi.vdev_param->def_keyid,
412
arvif->def_wep_key_idx);
413
if (ret) {
414
ath10k_warn(ar, "failed to re-set def wpa key idxon vdev %i: %d\n",
415
arvif->vdev_id, ret);
416
return ret;
417
}
418
419
return 0;
420
}
421
422
static int ath10k_clear_peer_keys(struct ath10k_vif *arvif,
423
const u8 *addr)
424
{
425
struct ath10k *ar = arvif->ar;
426
struct ath10k_peer *peer;
427
int first_errno = 0;
428
int ret;
429
int i;
430
u32 flags = 0;
431
432
lockdep_assert_held(&ar->conf_mutex);
433
434
spin_lock_bh(&ar->data_lock);
435
peer = ath10k_peer_find(ar, arvif->vdev_id, addr);
436
spin_unlock_bh(&ar->data_lock);
437
438
if (!peer)
439
return -ENOENT;
440
441
for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
442
if (peer->keys[i] == NULL)
443
continue;
444
445
/* key flags are not required to delete the key */
446
ret = ath10k_install_key(arvif, peer->keys[i],
447
DISABLE_KEY, addr, flags);
448
if (ret < 0 && first_errno == 0)
449
first_errno = ret;
450
451
if (ret < 0)
452
ath10k_warn(ar, "failed to remove peer wep key %d: %d\n",
453
i, ret);
454
455
spin_lock_bh(&ar->data_lock);
456
peer->keys[i] = NULL;
457
spin_unlock_bh(&ar->data_lock);
458
}
459
460
return first_errno;
461
}
462
463
bool ath10k_mac_is_peer_wep_key_set(struct ath10k *ar, const u8 *addr,
464
u8 keyidx)
465
{
466
struct ath10k_peer *peer;
467
int i;
468
469
lockdep_assert_held(&ar->data_lock);
470
471
/* We don't know which vdev this peer belongs to,
472
* since WMI doesn't give us that information.
473
*
474
* FIXME: multi-bss needs to be handled.
475
*/
476
peer = ath10k_peer_find(ar, 0, addr);
477
if (!peer)
478
return false;
479
480
for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
481
if (peer->keys[i] && peer->keys[i]->keyidx == keyidx)
482
return true;
483
}
484
485
return false;
486
}
487
488
static int ath10k_clear_vdev_key(struct ath10k_vif *arvif,
489
struct ieee80211_key_conf *key)
490
{
491
struct ath10k *ar = arvif->ar;
492
struct ath10k_peer *peer;
493
u8 addr[ETH_ALEN];
494
int first_errno = 0;
495
int ret;
496
int i;
497
u32 flags = 0;
498
499
lockdep_assert_held(&ar->conf_mutex);
500
501
for (;;) {
502
/* since ath10k_install_key we can't hold data_lock all the
503
* time, so we try to remove the keys incrementally
504
*/
505
spin_lock_bh(&ar->data_lock);
506
i = 0;
507
list_for_each_entry(peer, &ar->peers, list) {
508
for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
509
if (peer->keys[i] == key) {
510
ether_addr_copy(addr, peer->addr);
511
peer->keys[i] = NULL;
512
break;
513
}
514
}
515
516
if (i < ARRAY_SIZE(peer->keys))
517
break;
518
}
519
spin_unlock_bh(&ar->data_lock);
520
521
if (i == ARRAY_SIZE(peer->keys))
522
break;
523
/* key flags are not required to delete the key */
524
ret = ath10k_install_key(arvif, key, DISABLE_KEY, addr, flags);
525
if (ret < 0 && first_errno == 0)
526
first_errno = ret;
527
528
if (ret)
529
ath10k_warn(ar, "failed to remove key for %pM: %d\n",
530
addr, ret);
531
}
532
533
return first_errno;
534
}
535
536
static int ath10k_mac_vif_update_wep_key(struct ath10k_vif *arvif,
537
struct ieee80211_key_conf *key)
538
{
539
struct ath10k *ar = arvif->ar;
540
struct ath10k_peer *peer;
541
int ret;
542
543
lockdep_assert_held(&ar->conf_mutex);
544
545
list_for_each_entry(peer, &ar->peers, list) {
546
if (ether_addr_equal(peer->addr, arvif->vif->addr))
547
continue;
548
549
if (ether_addr_equal(peer->addr, arvif->bssid))
550
continue;
551
552
if (peer->keys[key->keyidx] == key)
553
continue;
554
555
ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vif vdev %i update key %i needs update\n",
556
arvif->vdev_id, key->keyidx);
557
558
ret = ath10k_install_peer_wep_keys(arvif, peer->addr);
559
if (ret) {
560
ath10k_warn(ar, "failed to update wep keys on vdev %i for peer %pM: %d\n",
561
arvif->vdev_id, peer->addr, ret);
562
return ret;
563
}
564
}
565
566
return 0;
567
}
568
569
/*********************/
570
/* General utilities */
571
/*********************/
572
573
static inline enum wmi_phy_mode
574
chan_to_phymode(const struct cfg80211_chan_def *chandef)
575
{
576
enum wmi_phy_mode phymode = MODE_UNKNOWN;
577
578
switch (chandef->chan->band) {
579
case NL80211_BAND_2GHZ:
580
switch (chandef->width) {
581
case NL80211_CHAN_WIDTH_20_NOHT:
582
if (chandef->chan->flags & IEEE80211_CHAN_NO_OFDM)
583
phymode = MODE_11B;
584
else
585
phymode = MODE_11G;
586
break;
587
case NL80211_CHAN_WIDTH_20:
588
phymode = MODE_11NG_HT20;
589
break;
590
case NL80211_CHAN_WIDTH_40:
591
phymode = MODE_11NG_HT40;
592
break;
593
default:
594
phymode = MODE_UNKNOWN;
595
break;
596
}
597
break;
598
case NL80211_BAND_5GHZ:
599
switch (chandef->width) {
600
case NL80211_CHAN_WIDTH_20_NOHT:
601
phymode = MODE_11A;
602
break;
603
case NL80211_CHAN_WIDTH_20:
604
phymode = MODE_11NA_HT20;
605
break;
606
case NL80211_CHAN_WIDTH_40:
607
phymode = MODE_11NA_HT40;
608
break;
609
case NL80211_CHAN_WIDTH_80:
610
phymode = MODE_11AC_VHT80;
611
break;
612
case NL80211_CHAN_WIDTH_160:
613
phymode = MODE_11AC_VHT160;
614
break;
615
case NL80211_CHAN_WIDTH_80P80:
616
phymode = MODE_11AC_VHT80_80;
617
break;
618
default:
619
phymode = MODE_UNKNOWN;
620
break;
621
}
622
break;
623
default:
624
break;
625
}
626
627
WARN_ON(phymode == MODE_UNKNOWN);
628
return phymode;
629
}
630
631
static u8 ath10k_parse_mpdudensity(u8 mpdudensity)
632
{
633
/*
634
* 802.11n D2.0 defined values for "Minimum MPDU Start Spacing":
635
* 0 for no restriction
636
* 1 for 1/4 us
637
* 2 for 1/2 us
638
* 3 for 1 us
639
* 4 for 2 us
640
* 5 for 4 us
641
* 6 for 8 us
642
* 7 for 16 us
643
*/
644
switch (mpdudensity) {
645
case 0:
646
return 0;
647
case 1:
648
case 2:
649
case 3:
650
/* Our lower layer calculations limit our precision to
651
* 1 microsecond
652
*/
653
return 1;
654
case 4:
655
return 2;
656
case 5:
657
return 4;
658
case 6:
659
return 8;
660
case 7:
661
return 16;
662
default:
663
return 0;
664
}
665
}
666
667
int ath10k_mac_vif_chan(struct ieee80211_vif *vif,
668
struct cfg80211_chan_def *def)
669
{
670
struct ieee80211_chanctx_conf *conf;
671
672
rcu_read_lock();
673
conf = rcu_dereference(vif->bss_conf.chanctx_conf);
674
if (!conf) {
675
rcu_read_unlock();
676
return -ENOENT;
677
}
678
679
*def = conf->def;
680
rcu_read_unlock();
681
682
return 0;
683
}
684
685
static void ath10k_mac_num_chanctxs_iter(struct ieee80211_hw *hw,
686
struct ieee80211_chanctx_conf *conf,
687
void *data)
688
{
689
int *num = data;
690
691
(*num)++;
692
}
693
694
static int ath10k_mac_num_chanctxs(struct ath10k *ar)
695
{
696
int num = 0;
697
698
ieee80211_iter_chan_contexts_atomic(ar->hw,
699
ath10k_mac_num_chanctxs_iter,
700
&num);
701
702
return num;
703
}
704
705
static void
706
ath10k_mac_get_any_chandef_iter(struct ieee80211_hw *hw,
707
struct ieee80211_chanctx_conf *conf,
708
void *data)
709
{
710
struct cfg80211_chan_def **def = data;
711
712
*def = &conf->def;
713
}
714
715
static void ath10k_wait_for_peer_delete_done(struct ath10k *ar, u32 vdev_id,
716
const u8 *addr)
717
{
718
unsigned long time_left;
719
int ret;
720
721
if (test_bit(WMI_SERVICE_SYNC_DELETE_CMDS, ar->wmi.svc_map)) {
722
ret = ath10k_wait_for_peer_deleted(ar, vdev_id, addr);
723
if (ret) {
724
ath10k_warn(ar, "failed wait for peer deleted");
725
return;
726
}
727
728
time_left = wait_for_completion_timeout(&ar->peer_delete_done,
729
5 * HZ);
730
if (!time_left)
731
ath10k_warn(ar, "Timeout in receiving peer delete response\n");
732
}
733
}
734
735
static int ath10k_peer_create(struct ath10k *ar,
736
struct ieee80211_vif *vif,
737
struct ieee80211_sta *sta,
738
u32 vdev_id,
739
const u8 *addr,
740
enum wmi_peer_type peer_type)
741
{
742
struct ath10k_peer *peer;
743
int ret;
744
745
lockdep_assert_held(&ar->conf_mutex);
746
747
/* Each vdev consumes a peer entry as well. */
748
if (ar->num_peers + list_count_nodes(&ar->arvifs) >= ar->max_num_peers)
749
return -ENOBUFS;
750
751
ret = ath10k_wmi_peer_create(ar, vdev_id, addr, peer_type);
752
if (ret) {
753
ath10k_warn(ar, "failed to create wmi peer %pM on vdev %i: %i\n",
754
addr, vdev_id, ret);
755
return ret;
756
}
757
758
ret = ath10k_wait_for_peer_created(ar, vdev_id, addr);
759
if (ret) {
760
ath10k_warn(ar, "failed to wait for created wmi peer %pM on vdev %i: %i\n",
761
addr, vdev_id, ret);
762
return ret;
763
}
764
765
spin_lock_bh(&ar->data_lock);
766
767
peer = ath10k_peer_find(ar, vdev_id, addr);
768
if (!peer) {
769
spin_unlock_bh(&ar->data_lock);
770
ath10k_warn(ar, "failed to find peer %pM on vdev %i after creation\n",
771
addr, vdev_id);
772
ath10k_wait_for_peer_delete_done(ar, vdev_id, addr);
773
return -ENOENT;
774
}
775
776
peer->vif = vif;
777
peer->sta = sta;
778
779
spin_unlock_bh(&ar->data_lock);
780
781
ar->num_peers++;
782
783
return 0;
784
}
785
786
static int ath10k_mac_set_kickout(struct ath10k_vif *arvif)
787
{
788
struct ath10k *ar = arvif->ar;
789
u32 param;
790
int ret;
791
792
param = ar->wmi.pdev_param->sta_kickout_th;
793
ret = ath10k_wmi_pdev_set_param(ar, param,
794
ATH10K_KICKOUT_THRESHOLD);
795
if (ret) {
796
ath10k_warn(ar, "failed to set kickout threshold on vdev %i: %d\n",
797
arvif->vdev_id, ret);
798
return ret;
799
}
800
801
param = ar->wmi.vdev_param->ap_keepalive_min_idle_inactive_time_secs;
802
ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
803
ATH10K_KEEPALIVE_MIN_IDLE);
804
if (ret) {
805
ath10k_warn(ar, "failed to set keepalive minimum idle time on vdev %i: %d\n",
806
arvif->vdev_id, ret);
807
return ret;
808
}
809
810
param = ar->wmi.vdev_param->ap_keepalive_max_idle_inactive_time_secs;
811
ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
812
ATH10K_KEEPALIVE_MAX_IDLE);
813
if (ret) {
814
ath10k_warn(ar, "failed to set keepalive maximum idle time on vdev %i: %d\n",
815
arvif->vdev_id, ret);
816
return ret;
817
}
818
819
param = ar->wmi.vdev_param->ap_keepalive_max_unresponsive_time_secs;
820
ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
821
ATH10K_KEEPALIVE_MAX_UNRESPONSIVE);
822
if (ret) {
823
ath10k_warn(ar, "failed to set keepalive maximum unresponsive time on vdev %i: %d\n",
824
arvif->vdev_id, ret);
825
return ret;
826
}
827
828
return 0;
829
}
830
831
static int ath10k_mac_set_rts(struct ath10k_vif *arvif, u32 value)
832
{
833
struct ath10k *ar = arvif->ar;
834
u32 vdev_param;
835
836
vdev_param = ar->wmi.vdev_param->rts_threshold;
837
return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, value);
838
}
839
840
static int ath10k_peer_delete(struct ath10k *ar, u32 vdev_id, const u8 *addr)
841
{
842
int ret;
843
844
lockdep_assert_held(&ar->conf_mutex);
845
846
ret = ath10k_wmi_peer_delete(ar, vdev_id, addr);
847
if (ret)
848
return ret;
849
850
ret = ath10k_wait_for_peer_deleted(ar, vdev_id, addr);
851
if (ret)
852
return ret;
853
854
if (test_bit(WMI_SERVICE_SYNC_DELETE_CMDS, ar->wmi.svc_map)) {
855
unsigned long time_left;
856
857
time_left = wait_for_completion_timeout
858
(&ar->peer_delete_done, 5 * HZ);
859
860
if (!time_left) {
861
ath10k_warn(ar, "Timeout in receiving peer delete response\n");
862
return -ETIMEDOUT;
863
}
864
}
865
866
ar->num_peers--;
867
868
return 0;
869
}
870
871
static void ath10k_peer_map_cleanup(struct ath10k *ar, struct ath10k_peer *peer)
872
{
873
int peer_id, i;
874
875
lockdep_assert_held(&ar->conf_mutex);
876
877
for_each_set_bit(peer_id, peer->peer_ids,
878
ATH10K_MAX_NUM_PEER_IDS) {
879
ar->peer_map[peer_id] = NULL;
880
}
881
882
/* Double check that peer is properly un-referenced from
883
* the peer_map
884
*/
885
for (i = 0; i < ARRAY_SIZE(ar->peer_map); i++) {
886
if (ar->peer_map[i] == peer) {
887
ath10k_warn(ar, "removing stale peer_map entry for %pM (ptr %p idx %d)\n",
888
peer->addr, peer, i);
889
ar->peer_map[i] = NULL;
890
}
891
}
892
893
list_del(&peer->list);
894
kfree(peer);
895
ar->num_peers--;
896
}
897
898
static void ath10k_peer_cleanup(struct ath10k *ar, u32 vdev_id)
899
{
900
struct ath10k_peer *peer, *tmp;
901
902
lockdep_assert_held(&ar->conf_mutex);
903
904
spin_lock_bh(&ar->data_lock);
905
list_for_each_entry_safe(peer, tmp, &ar->peers, list) {
906
if (peer->vdev_id != vdev_id)
907
continue;
908
909
ath10k_warn(ar, "removing stale peer %pM from vdev_id %d\n",
910
peer->addr, vdev_id);
911
912
ath10k_peer_map_cleanup(ar, peer);
913
}
914
spin_unlock_bh(&ar->data_lock);
915
}
916
917
static void ath10k_peer_cleanup_all(struct ath10k *ar)
918
{
919
struct ath10k_peer *peer, *tmp;
920
int i;
921
922
lockdep_assert_held(&ar->conf_mutex);
923
924
spin_lock_bh(&ar->data_lock);
925
list_for_each_entry_safe(peer, tmp, &ar->peers, list) {
926
list_del(&peer->list);
927
kfree(peer);
928
}
929
930
for (i = 0; i < ARRAY_SIZE(ar->peer_map); i++)
931
ar->peer_map[i] = NULL;
932
933
spin_unlock_bh(&ar->data_lock);
934
935
ar->num_peers = 0;
936
ar->num_stations = 0;
937
}
938
939
static int ath10k_mac_tdls_peer_update(struct ath10k *ar, u32 vdev_id,
940
struct ieee80211_sta *sta,
941
enum wmi_tdls_peer_state state)
942
{
943
int ret;
944
struct wmi_tdls_peer_update_cmd_arg arg = {};
945
struct wmi_tdls_peer_capab_arg cap = {};
946
struct wmi_channel_arg chan_arg = {};
947
948
lockdep_assert_held(&ar->conf_mutex);
949
950
arg.vdev_id = vdev_id;
951
arg.peer_state = state;
952
ether_addr_copy(arg.addr, sta->addr);
953
954
cap.peer_max_sp = sta->max_sp;
955
cap.peer_uapsd_queues = sta->uapsd_queues;
956
957
if (state == WMI_TDLS_PEER_STATE_CONNECTED &&
958
!sta->tdls_initiator)
959
cap.is_peer_responder = 1;
960
961
ret = ath10k_wmi_tdls_peer_update(ar, &arg, &cap, &chan_arg);
962
if (ret) {
963
ath10k_warn(ar, "failed to update tdls peer %pM on vdev %i: %i\n",
964
arg.addr, vdev_id, ret);
965
return ret;
966
}
967
968
return 0;
969
}
970
971
/************************/
972
/* Interface management */
973
/************************/
974
975
void ath10k_mac_vif_beacon_free(struct ath10k_vif *arvif)
976
{
977
struct ath10k *ar = arvif->ar;
978
979
lockdep_assert_held(&ar->data_lock);
980
981
if (!arvif->beacon)
982
return;
983
984
if (!arvif->beacon_buf)
985
dma_unmap_single(ar->dev, ATH10K_SKB_CB(arvif->beacon)->paddr,
986
arvif->beacon->len, DMA_TO_DEVICE);
987
988
if (WARN_ON(arvif->beacon_state != ATH10K_BEACON_SCHEDULED &&
989
arvif->beacon_state != ATH10K_BEACON_SENT))
990
return;
991
992
dev_kfree_skb_any(arvif->beacon);
993
994
arvif->beacon = NULL;
995
arvif->beacon_state = ATH10K_BEACON_SCHEDULED;
996
}
997
998
static void ath10k_mac_vif_beacon_cleanup(struct ath10k_vif *arvif)
999
{
1000
struct ath10k *ar = arvif->ar;
1001
1002
lockdep_assert_held(&ar->data_lock);
1003
1004
ath10k_mac_vif_beacon_free(arvif);
1005
1006
if (arvif->beacon_buf) {
1007
if (ar->bus_param.dev_type == ATH10K_DEV_TYPE_HL)
1008
kfree(arvif->beacon_buf);
1009
else
1010
dma_free_coherent(ar->dev, IEEE80211_MAX_FRAME_LEN,
1011
arvif->beacon_buf,
1012
arvif->beacon_paddr);
1013
arvif->beacon_buf = NULL;
1014
}
1015
}
1016
1017
static inline int ath10k_vdev_setup_sync(struct ath10k *ar)
1018
{
1019
unsigned long time_left;
1020
1021
lockdep_assert_held(&ar->conf_mutex);
1022
1023
if (test_bit(ATH10K_FLAG_CRASH_FLUSH, &ar->dev_flags))
1024
return -ESHUTDOWN;
1025
1026
time_left = wait_for_completion_timeout(&ar->vdev_setup_done,
1027
ATH10K_VDEV_SETUP_TIMEOUT_HZ);
1028
if (time_left == 0)
1029
return -ETIMEDOUT;
1030
1031
return ar->last_wmi_vdev_start_status;
1032
}
1033
1034
static inline int ath10k_vdev_delete_sync(struct ath10k *ar)
1035
{
1036
unsigned long time_left;
1037
1038
lockdep_assert_held(&ar->conf_mutex);
1039
1040
if (!test_bit(WMI_SERVICE_SYNC_DELETE_CMDS, ar->wmi.svc_map))
1041
return 0;
1042
1043
if (test_bit(ATH10K_FLAG_CRASH_FLUSH, &ar->dev_flags))
1044
return -ESHUTDOWN;
1045
1046
time_left = wait_for_completion_timeout(&ar->vdev_delete_done,
1047
ATH10K_VDEV_DELETE_TIMEOUT_HZ);
1048
if (time_left == 0)
1049
return -ETIMEDOUT;
1050
1051
return 0;
1052
}
1053
1054
static int ath10k_monitor_vdev_start(struct ath10k *ar, int vdev_id)
1055
{
1056
struct cfg80211_chan_def *chandef = NULL;
1057
struct ieee80211_channel *channel = NULL;
1058
struct wmi_vdev_start_request_arg arg = {};
1059
int ret = 0;
1060
1061
lockdep_assert_held(&ar->conf_mutex);
1062
1063
ieee80211_iter_chan_contexts_atomic(ar->hw,
1064
ath10k_mac_get_any_chandef_iter,
1065
&chandef);
1066
if (WARN_ON_ONCE(!chandef))
1067
return -ENOENT;
1068
1069
channel = chandef->chan;
1070
1071
arg.vdev_id = vdev_id;
1072
arg.channel.freq = channel->center_freq;
1073
arg.channel.band_center_freq1 = chandef->center_freq1;
1074
arg.channel.band_center_freq2 = chandef->center_freq2;
1075
1076
/* TODO setup this dynamically, what in case we
1077
* don't have any vifs?
1078
*/
1079
arg.channel.mode = chan_to_phymode(chandef);
1080
arg.channel.chan_radar =
1081
!!(channel->flags & IEEE80211_CHAN_RADAR);
1082
1083
arg.channel.min_power = 0;
1084
arg.channel.max_power = channel->max_power * 2;
1085
arg.channel.max_reg_power = channel->max_reg_power * 2;
1086
arg.channel.max_antenna_gain = channel->max_antenna_gain;
1087
1088
reinit_completion(&ar->vdev_setup_done);
1089
reinit_completion(&ar->vdev_delete_done);
1090
1091
ret = ath10k_wmi_vdev_start(ar, &arg);
1092
if (ret) {
1093
ath10k_warn(ar, "failed to request monitor vdev %i start: %d\n",
1094
vdev_id, ret);
1095
return ret;
1096
}
1097
1098
ret = ath10k_vdev_setup_sync(ar);
1099
if (ret) {
1100
ath10k_warn(ar, "failed to synchronize setup for monitor vdev %i start: %d\n",
1101
vdev_id, ret);
1102
return ret;
1103
}
1104
1105
ret = ath10k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr);
1106
if (ret) {
1107
ath10k_warn(ar, "failed to put up monitor vdev %i: %d\n",
1108
vdev_id, ret);
1109
goto vdev_stop;
1110
}
1111
1112
ar->monitor_vdev_id = vdev_id;
1113
1114
ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %i started\n",
1115
ar->monitor_vdev_id);
1116
return 0;
1117
1118
vdev_stop:
1119
ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
1120
if (ret)
1121
ath10k_warn(ar, "failed to stop monitor vdev %i after start failure: %d\n",
1122
ar->monitor_vdev_id, ret);
1123
1124
return ret;
1125
}
1126
1127
static int ath10k_monitor_vdev_stop(struct ath10k *ar)
1128
{
1129
int ret = 0;
1130
1131
lockdep_assert_held(&ar->conf_mutex);
1132
1133
ret = ath10k_wmi_vdev_down(ar, ar->monitor_vdev_id);
1134
if (ret)
1135
ath10k_warn(ar, "failed to put down monitor vdev %i: %d\n",
1136
ar->monitor_vdev_id, ret);
1137
1138
reinit_completion(&ar->vdev_setup_done);
1139
reinit_completion(&ar->vdev_delete_done);
1140
1141
ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
1142
if (ret)
1143
ath10k_warn(ar, "failed to request monitor vdev %i stop: %d\n",
1144
ar->monitor_vdev_id, ret);
1145
1146
ret = ath10k_vdev_setup_sync(ar);
1147
if (ret)
1148
ath10k_warn(ar, "failed to synchronize monitor vdev %i stop: %d\n",
1149
ar->monitor_vdev_id, ret);
1150
1151
ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %i stopped\n",
1152
ar->monitor_vdev_id);
1153
return ret;
1154
}
1155
1156
static int ath10k_monitor_vdev_create(struct ath10k *ar)
1157
{
1158
int bit, ret = 0;
1159
1160
lockdep_assert_held(&ar->conf_mutex);
1161
1162
if (ar->free_vdev_map == 0) {
1163
ath10k_warn(ar, "failed to find free vdev id for monitor vdev\n");
1164
return -ENOMEM;
1165
}
1166
1167
bit = __ffs64(ar->free_vdev_map);
1168
1169
ar->monitor_vdev_id = bit;
1170
1171
ret = ath10k_wmi_vdev_create(ar, ar->monitor_vdev_id,
1172
WMI_VDEV_TYPE_MONITOR,
1173
0, ar->mac_addr);
1174
if (ret) {
1175
ath10k_warn(ar, "failed to request monitor vdev %i creation: %d\n",
1176
ar->monitor_vdev_id, ret);
1177
return ret;
1178
}
1179
1180
ar->free_vdev_map &= ~(1LL << ar->monitor_vdev_id);
1181
ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %d created\n",
1182
ar->monitor_vdev_id);
1183
1184
return 0;
1185
}
1186
1187
static int ath10k_monitor_vdev_delete(struct ath10k *ar)
1188
{
1189
int ret = 0;
1190
1191
lockdep_assert_held(&ar->conf_mutex);
1192
1193
ret = ath10k_wmi_vdev_delete(ar, ar->monitor_vdev_id);
1194
if (ret) {
1195
ath10k_warn(ar, "failed to request wmi monitor vdev %i removal: %d\n",
1196
ar->monitor_vdev_id, ret);
1197
return ret;
1198
}
1199
1200
ar->free_vdev_map |= 1LL << ar->monitor_vdev_id;
1201
1202
ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %d deleted\n",
1203
ar->monitor_vdev_id);
1204
return ret;
1205
}
1206
1207
static int ath10k_monitor_start(struct ath10k *ar)
1208
{
1209
int ret;
1210
1211
lockdep_assert_held(&ar->conf_mutex);
1212
1213
ret = ath10k_monitor_vdev_create(ar);
1214
if (ret) {
1215
ath10k_warn(ar, "failed to create monitor vdev: %d\n", ret);
1216
return ret;
1217
}
1218
1219
ret = ath10k_monitor_vdev_start(ar, ar->monitor_vdev_id);
1220
if (ret) {
1221
ath10k_warn(ar, "failed to start monitor vdev: %d\n", ret);
1222
ath10k_monitor_vdev_delete(ar);
1223
return ret;
1224
}
1225
1226
ar->monitor_started = true;
1227
ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor started\n");
1228
1229
return 0;
1230
}
1231
1232
static int ath10k_monitor_stop(struct ath10k *ar)
1233
{
1234
int ret;
1235
1236
lockdep_assert_held(&ar->conf_mutex);
1237
1238
ret = ath10k_monitor_vdev_stop(ar);
1239
if (ret) {
1240
ath10k_warn(ar, "failed to stop monitor vdev: %d\n", ret);
1241
return ret;
1242
}
1243
1244
ret = ath10k_monitor_vdev_delete(ar);
1245
if (ret) {
1246
ath10k_warn(ar, "failed to delete monitor vdev: %d\n", ret);
1247
return ret;
1248
}
1249
1250
ar->monitor_started = false;
1251
ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor stopped\n");
1252
1253
return 0;
1254
}
1255
1256
static bool ath10k_mac_monitor_vdev_is_needed(struct ath10k *ar)
1257
{
1258
int num_ctx;
1259
1260
/* At least one chanctx is required to derive a channel to start
1261
* monitor vdev on.
1262
*/
1263
num_ctx = ath10k_mac_num_chanctxs(ar);
1264
if (num_ctx == 0)
1265
return false;
1266
1267
/* If there's already an existing special monitor interface then don't
1268
* bother creating another monitor vdev.
1269
*/
1270
if (ar->monitor_arvif)
1271
return false;
1272
1273
return ar->monitor ||
1274
(!test_bit(ATH10K_FW_FEATURE_ALLOWS_MESH_BCAST,
1275
ar->running_fw->fw_file.fw_features) &&
1276
(ar->filter_flags & (FIF_OTHER_BSS | FIF_MCAST_ACTION))) ||
1277
test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
1278
}
1279
1280
static bool ath10k_mac_monitor_vdev_is_allowed(struct ath10k *ar)
1281
{
1282
int num_ctx;
1283
1284
num_ctx = ath10k_mac_num_chanctxs(ar);
1285
1286
/* FIXME: Current interface combinations and cfg80211/mac80211 code
1287
* shouldn't allow this but make sure to prevent handling the following
1288
* case anyway since multi-channel DFS hasn't been tested at all.
1289
*/
1290
if (test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags) && num_ctx > 1)
1291
return false;
1292
1293
return true;
1294
}
1295
1296
static int ath10k_monitor_recalc(struct ath10k *ar)
1297
{
1298
bool needed;
1299
bool allowed;
1300
int ret;
1301
1302
lockdep_assert_held(&ar->conf_mutex);
1303
1304
needed = ath10k_mac_monitor_vdev_is_needed(ar);
1305
allowed = ath10k_mac_monitor_vdev_is_allowed(ar);
1306
1307
ath10k_dbg(ar, ATH10K_DBG_MAC,
1308
"mac monitor recalc started? %d needed? %d allowed? %d\n",
1309
ar->monitor_started, needed, allowed);
1310
1311
if (WARN_ON(needed && !allowed)) {
1312
if (ar->monitor_started) {
1313
ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor stopping disallowed monitor\n");
1314
1315
ret = ath10k_monitor_stop(ar);
1316
if (ret)
1317
ath10k_warn(ar, "failed to stop disallowed monitor: %d\n",
1318
ret);
1319
/* not serious */
1320
}
1321
1322
return -EPERM;
1323
}
1324
1325
if (needed == ar->monitor_started)
1326
return 0;
1327
1328
if (needed)
1329
return ath10k_monitor_start(ar);
1330
else
1331
return ath10k_monitor_stop(ar);
1332
}
1333
1334
static bool ath10k_mac_can_set_cts_prot(struct ath10k_vif *arvif)
1335
{
1336
struct ath10k *ar = arvif->ar;
1337
1338
lockdep_assert_held(&ar->conf_mutex);
1339
1340
if (!arvif->is_started) {
1341
ath10k_dbg(ar, ATH10K_DBG_MAC, "defer cts setup, vdev is not ready yet\n");
1342
return false;
1343
}
1344
1345
return true;
1346
}
1347
1348
static int ath10k_mac_set_cts_prot(struct ath10k_vif *arvif)
1349
{
1350
struct ath10k *ar = arvif->ar;
1351
u32 vdev_param;
1352
1353
lockdep_assert_held(&ar->conf_mutex);
1354
1355
vdev_param = ar->wmi.vdev_param->protection_mode;
1356
1357
ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d cts_protection %d\n",
1358
arvif->vdev_id, arvif->use_cts_prot);
1359
1360
return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
1361
arvif->use_cts_prot ? 1 : 0);
1362
}
1363
1364
static int ath10k_recalc_rtscts_prot(struct ath10k_vif *arvif)
1365
{
1366
struct ath10k *ar = arvif->ar;
1367
u32 vdev_param, rts_cts = 0;
1368
1369
lockdep_assert_held(&ar->conf_mutex);
1370
1371
vdev_param = ar->wmi.vdev_param->enable_rtscts;
1372
1373
rts_cts |= SM(WMI_RTSCTS_ENABLED, WMI_RTSCTS_SET);
1374
1375
if (arvif->num_legacy_stations > 0)
1376
rts_cts |= SM(WMI_RTSCTS_ACROSS_SW_RETRIES,
1377
WMI_RTSCTS_PROFILE);
1378
else
1379
rts_cts |= SM(WMI_RTSCTS_FOR_SECOND_RATESERIES,
1380
WMI_RTSCTS_PROFILE);
1381
1382
ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d recalc rts/cts prot %d\n",
1383
arvif->vdev_id, rts_cts);
1384
1385
return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
1386
rts_cts);
1387
}
1388
1389
static int ath10k_start_cac(struct ath10k *ar)
1390
{
1391
int ret;
1392
1393
lockdep_assert_held(&ar->conf_mutex);
1394
1395
set_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
1396
1397
ret = ath10k_monitor_recalc(ar);
1398
if (ret) {
1399
ath10k_warn(ar, "failed to start monitor (cac): %d\n", ret);
1400
clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
1401
return ret;
1402
}
1403
1404
ath10k_dbg(ar, ATH10K_DBG_MAC, "mac cac start monitor vdev %d\n",
1405
ar->monitor_vdev_id);
1406
1407
return 0;
1408
}
1409
1410
static int ath10k_stop_cac(struct ath10k *ar)
1411
{
1412
lockdep_assert_held(&ar->conf_mutex);
1413
1414
/* CAC is not running - do nothing */
1415
if (!test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags))
1416
return 0;
1417
1418
clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
1419
ath10k_monitor_stop(ar);
1420
1421
ath10k_dbg(ar, ATH10K_DBG_MAC, "mac cac finished\n");
1422
1423
return 0;
1424
}
1425
1426
static void ath10k_mac_has_radar_iter(struct ieee80211_hw *hw,
1427
struct ieee80211_chanctx_conf *conf,
1428
void *data)
1429
{
1430
bool *ret = data;
1431
1432
if (!*ret && conf->radar_enabled)
1433
*ret = true;
1434
}
1435
1436
static bool ath10k_mac_has_radar_enabled(struct ath10k *ar)
1437
{
1438
bool has_radar = false;
1439
1440
ieee80211_iter_chan_contexts_atomic(ar->hw,
1441
ath10k_mac_has_radar_iter,
1442
&has_radar);
1443
1444
return has_radar;
1445
}
1446
1447
static void ath10k_recalc_radar_detection(struct ath10k *ar)
1448
{
1449
int ret;
1450
1451
lockdep_assert_held(&ar->conf_mutex);
1452
1453
ath10k_stop_cac(ar);
1454
1455
if (!ath10k_mac_has_radar_enabled(ar))
1456
return;
1457
1458
if (ar->num_started_vdevs > 0)
1459
return;
1460
1461
ret = ath10k_start_cac(ar);
1462
if (ret) {
1463
/*
1464
* Not possible to start CAC on current channel so starting
1465
* radiation is not allowed, make this channel DFS_UNAVAILABLE
1466
* by indicating that radar was detected.
1467
*/
1468
ath10k_warn(ar, "failed to start CAC: %d\n", ret);
1469
ieee80211_radar_detected(ar->hw, NULL);
1470
}
1471
}
1472
1473
static int ath10k_vdev_stop(struct ath10k_vif *arvif)
1474
{
1475
struct ath10k *ar = arvif->ar;
1476
int ret;
1477
1478
lockdep_assert_held(&ar->conf_mutex);
1479
1480
reinit_completion(&ar->vdev_setup_done);
1481
reinit_completion(&ar->vdev_delete_done);
1482
1483
ret = ath10k_wmi_vdev_stop(ar, arvif->vdev_id);
1484
if (ret) {
1485
ath10k_warn(ar, "failed to stop WMI vdev %i: %d\n",
1486
arvif->vdev_id, ret);
1487
return ret;
1488
}
1489
1490
ret = ath10k_vdev_setup_sync(ar);
1491
if (ret) {
1492
ath10k_warn(ar, "failed to synchronize setup for vdev %i: %d\n",
1493
arvif->vdev_id, ret);
1494
return ret;
1495
}
1496
1497
WARN_ON(ar->num_started_vdevs == 0);
1498
1499
if (ar->num_started_vdevs != 0) {
1500
ar->num_started_vdevs--;
1501
ath10k_recalc_radar_detection(ar);
1502
}
1503
1504
return ret;
1505
}
1506
1507
static int ath10k_vdev_start_restart(struct ath10k_vif *arvif,
1508
const struct cfg80211_chan_def *chandef,
1509
bool restart)
1510
{
1511
struct ath10k *ar = arvif->ar;
1512
struct wmi_vdev_start_request_arg arg = {};
1513
int ret = 0;
1514
1515
lockdep_assert_held(&ar->conf_mutex);
1516
1517
reinit_completion(&ar->vdev_setup_done);
1518
reinit_completion(&ar->vdev_delete_done);
1519
1520
arg.vdev_id = arvif->vdev_id;
1521
arg.dtim_period = arvif->dtim_period;
1522
arg.bcn_intval = arvif->beacon_interval;
1523
1524
arg.channel.freq = chandef->chan->center_freq;
1525
arg.channel.band_center_freq1 = chandef->center_freq1;
1526
arg.channel.band_center_freq2 = chandef->center_freq2;
1527
arg.channel.mode = chan_to_phymode(chandef);
1528
1529
arg.channel.min_power = 0;
1530
arg.channel.max_power = chandef->chan->max_power * 2;
1531
arg.channel.max_reg_power = chandef->chan->max_reg_power * 2;
1532
arg.channel.max_antenna_gain = chandef->chan->max_antenna_gain;
1533
1534
if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
1535
arg.ssid = arvif->u.ap.ssid;
1536
arg.ssid_len = arvif->u.ap.ssid_len;
1537
arg.hidden_ssid = arvif->u.ap.hidden_ssid;
1538
1539
/* For now allow DFS for AP mode */
1540
arg.channel.chan_radar =
1541
!!(chandef->chan->flags & IEEE80211_CHAN_RADAR);
1542
} else if (arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
1543
arg.ssid = arvif->vif->cfg.ssid;
1544
arg.ssid_len = arvif->vif->cfg.ssid_len;
1545
}
1546
1547
ath10k_dbg(ar, ATH10K_DBG_MAC,
1548
"mac vdev %d start center_freq %d phymode %s\n",
1549
arg.vdev_id, arg.channel.freq,
1550
ath10k_wmi_phymode_str(arg.channel.mode));
1551
1552
if (restart)
1553
ret = ath10k_wmi_vdev_restart(ar, &arg);
1554
else
1555
ret = ath10k_wmi_vdev_start(ar, &arg);
1556
1557
if (ret) {
1558
ath10k_warn(ar, "failed to start WMI vdev %i: %d\n",
1559
arg.vdev_id, ret);
1560
return ret;
1561
}
1562
1563
ret = ath10k_vdev_setup_sync(ar);
1564
if (ret) {
1565
ath10k_warn(ar,
1566
"failed to synchronize setup for vdev %i restart %d: %d\n",
1567
arg.vdev_id, restart, ret);
1568
return ret;
1569
}
1570
1571
ar->num_started_vdevs++;
1572
ath10k_recalc_radar_detection(ar);
1573
1574
return ret;
1575
}
1576
1577
static int ath10k_vdev_start(struct ath10k_vif *arvif,
1578
const struct cfg80211_chan_def *def)
1579
{
1580
return ath10k_vdev_start_restart(arvif, def, false);
1581
}
1582
1583
static int ath10k_vdev_restart(struct ath10k_vif *arvif,
1584
const struct cfg80211_chan_def *def)
1585
{
1586
return ath10k_vdev_start_restart(arvif, def, true);
1587
}
1588
1589
static int ath10k_mac_setup_bcn_p2p_ie(struct ath10k_vif *arvif,
1590
struct sk_buff *bcn)
1591
{
1592
struct ath10k *ar = arvif->ar;
1593
struct ieee80211_mgmt *mgmt;
1594
const u8 *p2p_ie;
1595
int ret;
1596
1597
if (arvif->vif->type != NL80211_IFTYPE_AP || !arvif->vif->p2p)
1598
return 0;
1599
1600
mgmt = (void *)bcn->data;
1601
p2p_ie = cfg80211_find_vendor_ie(WLAN_OUI_WFA, WLAN_OUI_TYPE_WFA_P2P,
1602
mgmt->u.beacon.variable,
1603
bcn->len - (mgmt->u.beacon.variable -
1604
bcn->data));
1605
if (!p2p_ie)
1606
return -ENOENT;
1607
1608
ret = ath10k_wmi_p2p_go_bcn_ie(ar, arvif->vdev_id, p2p_ie);
1609
if (ret) {
1610
ath10k_warn(ar, "failed to submit p2p go bcn ie for vdev %i: %d\n",
1611
arvif->vdev_id, ret);
1612
return ret;
1613
}
1614
1615
return 0;
1616
}
1617
1618
static int ath10k_mac_remove_vendor_ie(struct sk_buff *skb, unsigned int oui,
1619
u8 oui_type, size_t ie_offset)
1620
{
1621
size_t len;
1622
const u8 *next;
1623
const u8 *end;
1624
u8 *ie;
1625
1626
if (WARN_ON(skb->len < ie_offset))
1627
return -EINVAL;
1628
1629
ie = (u8 *)cfg80211_find_vendor_ie(oui, oui_type,
1630
skb->data + ie_offset,
1631
skb->len - ie_offset);
1632
if (!ie)
1633
return -ENOENT;
1634
1635
len = ie[1] + 2;
1636
end = skb->data + skb->len;
1637
next = ie + len;
1638
1639
if (WARN_ON(next > end))
1640
return -EINVAL;
1641
1642
memmove(ie, next, end - next);
1643
skb_trim(skb, skb->len - len);
1644
1645
return 0;
1646
}
1647
1648
static int ath10k_mac_setup_bcn_tmpl(struct ath10k_vif *arvif)
1649
{
1650
struct ath10k *ar = arvif->ar;
1651
struct ieee80211_hw *hw = ar->hw;
1652
struct ieee80211_vif *vif = arvif->vif;
1653
struct ieee80211_mutable_offsets offs = {};
1654
struct sk_buff *bcn;
1655
int ret;
1656
1657
if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map))
1658
return 0;
1659
1660
if (arvif->vdev_type != WMI_VDEV_TYPE_AP &&
1661
arvif->vdev_type != WMI_VDEV_TYPE_IBSS)
1662
return 0;
1663
1664
bcn = ieee80211_beacon_get_template(hw, vif, &offs, 0);
1665
if (!bcn) {
1666
ath10k_warn(ar, "failed to get beacon template from mac80211\n");
1667
return -EPERM;
1668
}
1669
1670
ret = ath10k_mac_setup_bcn_p2p_ie(arvif, bcn);
1671
if (ret) {
1672
ath10k_warn(ar, "failed to setup p2p go bcn ie: %d\n", ret);
1673
kfree_skb(bcn);
1674
return ret;
1675
}
1676
1677
/* P2P IE is inserted by firmware automatically (as configured above)
1678
* so remove it from the base beacon template to avoid duplicate P2P
1679
* IEs in beacon frames.
1680
*/
1681
ath10k_mac_remove_vendor_ie(bcn, WLAN_OUI_WFA, WLAN_OUI_TYPE_WFA_P2P,
1682
offsetof(struct ieee80211_mgmt,
1683
u.beacon.variable));
1684
1685
ret = ath10k_wmi_bcn_tmpl(ar, arvif->vdev_id, offs.tim_offset, bcn, 0,
1686
0, NULL, 0);
1687
kfree_skb(bcn);
1688
1689
if (ret) {
1690
ath10k_warn(ar, "failed to submit beacon template command: %d\n",
1691
ret);
1692
return ret;
1693
}
1694
1695
return 0;
1696
}
1697
1698
static int ath10k_mac_setup_prb_tmpl(struct ath10k_vif *arvif)
1699
{
1700
struct ath10k *ar = arvif->ar;
1701
struct ieee80211_hw *hw = ar->hw;
1702
struct ieee80211_vif *vif = arvif->vif;
1703
struct sk_buff *prb;
1704
int ret;
1705
1706
if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map))
1707
return 0;
1708
1709
if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
1710
return 0;
1711
1712
/* For mesh, probe response and beacon share the same template */
1713
if (ieee80211_vif_is_mesh(vif))
1714
return 0;
1715
1716
prb = ieee80211_proberesp_get(hw, vif);
1717
if (!prb) {
1718
ath10k_warn(ar, "failed to get probe resp template from mac80211\n");
1719
return -EPERM;
1720
}
1721
1722
ret = ath10k_wmi_prb_tmpl(ar, arvif->vdev_id, prb);
1723
kfree_skb(prb);
1724
1725
if (ret) {
1726
ath10k_warn(ar, "failed to submit probe resp template command: %d\n",
1727
ret);
1728
return ret;
1729
}
1730
1731
return 0;
1732
}
1733
1734
static int ath10k_mac_vif_fix_hidden_ssid(struct ath10k_vif *arvif)
1735
{
1736
struct ath10k *ar = arvif->ar;
1737
struct cfg80211_chan_def def;
1738
int ret;
1739
1740
/* When originally vdev is started during assign_vif_chanctx() some
1741
* information is missing, notably SSID. Firmware revisions with beacon
1742
* offloading require the SSID to be provided during vdev (re)start to
1743
* handle hidden SSID properly.
1744
*
1745
* Vdev restart must be done after vdev has been both started and
1746
* upped. Otherwise some firmware revisions (at least 10.2) fail to
1747
* deliver vdev restart response event causing timeouts during vdev
1748
* syncing in ath10k.
1749
*
1750
* Note: The vdev down/up and template reinstallation could be skipped
1751
* since only wmi-tlv firmware are known to have beacon offload and
1752
* wmi-tlv doesn't seem to misbehave like 10.2 wrt vdev restart
1753
* response delivery. It's probably more robust to keep it as is.
1754
*/
1755
if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map))
1756
return 0;
1757
1758
if (WARN_ON(!arvif->is_started))
1759
return -EINVAL;
1760
1761
if (WARN_ON(!arvif->is_up))
1762
return -EINVAL;
1763
1764
if (WARN_ON(ath10k_mac_vif_chan(arvif->vif, &def)))
1765
return -EINVAL;
1766
1767
ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
1768
if (ret) {
1769
ath10k_warn(ar, "failed to bring down ap vdev %i: %d\n",
1770
arvif->vdev_id, ret);
1771
return ret;
1772
}
1773
1774
/* Vdev down reset beacon & presp templates. Reinstall them. Otherwise
1775
* firmware will crash upon vdev up.
1776
*/
1777
1778
ret = ath10k_mac_setup_bcn_tmpl(arvif);
1779
if (ret) {
1780
ath10k_warn(ar, "failed to update beacon template: %d\n", ret);
1781
return ret;
1782
}
1783
1784
ret = ath10k_mac_setup_prb_tmpl(arvif);
1785
if (ret) {
1786
ath10k_warn(ar, "failed to update presp template: %d\n", ret);
1787
return ret;
1788
}
1789
1790
ret = ath10k_vdev_restart(arvif, &def);
1791
if (ret) {
1792
ath10k_warn(ar, "failed to restart ap vdev %i: %d\n",
1793
arvif->vdev_id, ret);
1794
return ret;
1795
}
1796
1797
ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
1798
arvif->bssid);
1799
if (ret) {
1800
ath10k_warn(ar, "failed to bring up ap vdev %i: %d\n",
1801
arvif->vdev_id, ret);
1802
return ret;
1803
}
1804
1805
return 0;
1806
}
1807
1808
static void ath10k_control_beaconing(struct ath10k_vif *arvif,
1809
struct ieee80211_bss_conf *info)
1810
{
1811
struct ath10k *ar = arvif->ar;
1812
int ret = 0;
1813
1814
lockdep_assert_held(&arvif->ar->conf_mutex);
1815
1816
if (!info->enable_beacon) {
1817
ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
1818
if (ret)
1819
ath10k_warn(ar, "failed to down vdev_id %i: %d\n",
1820
arvif->vdev_id, ret);
1821
1822
arvif->is_up = false;
1823
1824
spin_lock_bh(&arvif->ar->data_lock);
1825
ath10k_mac_vif_beacon_free(arvif);
1826
spin_unlock_bh(&arvif->ar->data_lock);
1827
1828
return;
1829
}
1830
1831
arvif->tx_seq_no = 0x1000;
1832
1833
arvif->aid = 0;
1834
ether_addr_copy(arvif->bssid, info->bssid);
1835
1836
ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
1837
arvif->bssid);
1838
if (ret) {
1839
ath10k_warn(ar, "failed to bring up vdev %d: %i\n",
1840
arvif->vdev_id, ret);
1841
return;
1842
}
1843
1844
arvif->is_up = true;
1845
1846
ret = ath10k_mac_vif_fix_hidden_ssid(arvif);
1847
if (ret) {
1848
ath10k_warn(ar, "failed to fix hidden ssid for vdev %i, expect trouble: %d\n",
1849
arvif->vdev_id, ret);
1850
return;
1851
}
1852
1853
ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d up\n", arvif->vdev_id);
1854
}
1855
1856
static void ath10k_control_ibss(struct ath10k_vif *arvif,
1857
struct ieee80211_vif *vif)
1858
{
1859
struct ath10k *ar = arvif->ar;
1860
u32 vdev_param;
1861
int ret = 0;
1862
1863
lockdep_assert_held(&arvif->ar->conf_mutex);
1864
1865
if (!vif->cfg.ibss_joined) {
1866
if (is_zero_ether_addr(arvif->bssid))
1867
return;
1868
1869
eth_zero_addr(arvif->bssid);
1870
1871
return;
1872
}
1873
1874
vdev_param = arvif->ar->wmi.vdev_param->atim_window;
1875
ret = ath10k_wmi_vdev_set_param(arvif->ar, arvif->vdev_id, vdev_param,
1876
ATH10K_DEFAULT_ATIM);
1877
if (ret)
1878
ath10k_warn(ar, "failed to set IBSS ATIM for vdev %d: %d\n",
1879
arvif->vdev_id, ret);
1880
}
1881
1882
static int ath10k_mac_vif_recalc_ps_wake_threshold(struct ath10k_vif *arvif)
1883
{
1884
struct ath10k *ar = arvif->ar;
1885
u32 param;
1886
u32 value;
1887
int ret;
1888
1889
lockdep_assert_held(&arvif->ar->conf_mutex);
1890
1891
if (arvif->u.sta.uapsd)
1892
value = WMI_STA_PS_TX_WAKE_THRESHOLD_NEVER;
1893
else
1894
value = WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS;
1895
1896
param = WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD;
1897
ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param, value);
1898
if (ret) {
1899
ath10k_warn(ar, "failed to submit ps wake threshold %u on vdev %i: %d\n",
1900
value, arvif->vdev_id, ret);
1901
return ret;
1902
}
1903
1904
return 0;
1905
}
1906
1907
static int ath10k_mac_vif_recalc_ps_poll_count(struct ath10k_vif *arvif)
1908
{
1909
struct ath10k *ar = arvif->ar;
1910
u32 param;
1911
u32 value;
1912
int ret;
1913
1914
lockdep_assert_held(&arvif->ar->conf_mutex);
1915
1916
if (arvif->u.sta.uapsd)
1917
value = WMI_STA_PS_PSPOLL_COUNT_UAPSD;
1918
else
1919
value = WMI_STA_PS_PSPOLL_COUNT_NO_MAX;
1920
1921
param = WMI_STA_PS_PARAM_PSPOLL_COUNT;
1922
ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
1923
param, value);
1924
if (ret) {
1925
ath10k_warn(ar, "failed to submit ps poll count %u on vdev %i: %d\n",
1926
value, arvif->vdev_id, ret);
1927
return ret;
1928
}
1929
1930
return 0;
1931
}
1932
1933
static int ath10k_mac_num_vifs_started(struct ath10k *ar)
1934
{
1935
struct ath10k_vif *arvif;
1936
int num = 0;
1937
1938
lockdep_assert_held(&ar->conf_mutex);
1939
1940
list_for_each_entry(arvif, &ar->arvifs, list)
1941
if (arvif->is_started)
1942
num++;
1943
1944
return num;
1945
}
1946
1947
static int ath10k_mac_vif_setup_ps(struct ath10k_vif *arvif)
1948
{
1949
struct ath10k *ar = arvif->ar;
1950
struct ieee80211_vif *vif = arvif->vif;
1951
struct ieee80211_conf *conf = &ar->hw->conf;
1952
enum wmi_sta_powersave_param param;
1953
enum wmi_sta_ps_mode psmode;
1954
int ret;
1955
int ps_timeout;
1956
bool enable_ps;
1957
1958
lockdep_assert_held(&arvif->ar->conf_mutex);
1959
1960
if (arvif->vif->type != NL80211_IFTYPE_STATION)
1961
return 0;
1962
1963
enable_ps = arvif->ps;
1964
1965
if (enable_ps && ath10k_mac_num_vifs_started(ar) > 1 &&
1966
!test_bit(ATH10K_FW_FEATURE_MULTI_VIF_PS_SUPPORT,
1967
ar->running_fw->fw_file.fw_features)) {
1968
ath10k_warn(ar, "refusing to enable ps on vdev %i: not supported by fw\n",
1969
arvif->vdev_id);
1970
enable_ps = false;
1971
}
1972
1973
if (!arvif->is_started) {
1974
/* mac80211 can update vif powersave state while disconnected.
1975
* Firmware doesn't behave nicely and consumes more power than
1976
* necessary if PS is disabled on a non-started vdev. Hence
1977
* force-enable PS for non-running vdevs.
1978
*/
1979
psmode = WMI_STA_PS_MODE_ENABLED;
1980
} else if (enable_ps) {
1981
psmode = WMI_STA_PS_MODE_ENABLED;
1982
param = WMI_STA_PS_PARAM_INACTIVITY_TIME;
1983
1984
ps_timeout = conf->dynamic_ps_timeout;
1985
if (ps_timeout == 0) {
1986
/* Firmware doesn't like 0 */
1987
ps_timeout = ieee80211_tu_to_usec(
1988
vif->bss_conf.beacon_int) / 1000;
1989
}
1990
1991
ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param,
1992
ps_timeout);
1993
if (ret) {
1994
ath10k_warn(ar, "failed to set inactivity time for vdev %d: %i\n",
1995
arvif->vdev_id, ret);
1996
return ret;
1997
}
1998
} else {
1999
psmode = WMI_STA_PS_MODE_DISABLED;
2000
}
2001
2002
ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d psmode %s\n",
2003
arvif->vdev_id, psmode ? "enable" : "disable");
2004
2005
ret = ath10k_wmi_set_psmode(ar, arvif->vdev_id, psmode);
2006
if (ret) {
2007
ath10k_warn(ar, "failed to set PS Mode %d for vdev %d: %d\n",
2008
psmode, arvif->vdev_id, ret);
2009
return ret;
2010
}
2011
2012
return 0;
2013
}
2014
2015
static int ath10k_mac_vif_disable_keepalive(struct ath10k_vif *arvif)
2016
{
2017
struct ath10k *ar = arvif->ar;
2018
struct wmi_sta_keepalive_arg arg = {};
2019
int ret;
2020
2021
lockdep_assert_held(&arvif->ar->conf_mutex);
2022
2023
if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
2024
return 0;
2025
2026
if (!test_bit(WMI_SERVICE_STA_KEEP_ALIVE, ar->wmi.svc_map))
2027
return 0;
2028
2029
/* Some firmware revisions have a bug and ignore the `enabled` field.
2030
* Instead use the interval to disable the keepalive.
2031
*/
2032
arg.vdev_id = arvif->vdev_id;
2033
arg.enabled = 1;
2034
arg.method = WMI_STA_KEEPALIVE_METHOD_NULL_FRAME;
2035
arg.interval = WMI_STA_KEEPALIVE_INTERVAL_DISABLE;
2036
2037
ret = ath10k_wmi_sta_keepalive(ar, &arg);
2038
if (ret) {
2039
ath10k_warn(ar, "failed to submit keepalive on vdev %i: %d\n",
2040
arvif->vdev_id, ret);
2041
return ret;
2042
}
2043
2044
return 0;
2045
}
2046
2047
static void ath10k_mac_vif_ap_csa_count_down(struct ath10k_vif *arvif)
2048
{
2049
struct ath10k *ar = arvif->ar;
2050
struct ieee80211_vif *vif = arvif->vif;
2051
int ret;
2052
2053
lockdep_assert_held(&arvif->ar->conf_mutex);
2054
2055
if (WARN_ON(!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map)))
2056
return;
2057
2058
if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
2059
return;
2060
2061
if (!vif->bss_conf.csa_active)
2062
return;
2063
2064
if (!arvif->is_up)
2065
return;
2066
2067
if (!ieee80211_beacon_cntdwn_is_complete(vif, 0)) {
2068
ieee80211_beacon_update_cntdwn(vif, 0);
2069
2070
ret = ath10k_mac_setup_bcn_tmpl(arvif);
2071
if (ret)
2072
ath10k_warn(ar, "failed to update bcn tmpl during csa: %d\n",
2073
ret);
2074
2075
ret = ath10k_mac_setup_prb_tmpl(arvif);
2076
if (ret)
2077
ath10k_warn(ar, "failed to update prb tmpl during csa: %d\n",
2078
ret);
2079
} else {
2080
ieee80211_csa_finish(vif, 0);
2081
}
2082
}
2083
2084
static void ath10k_mac_vif_ap_csa_work(struct work_struct *work)
2085
{
2086
struct ath10k_vif *arvif = container_of(work, struct ath10k_vif,
2087
ap_csa_work);
2088
struct ath10k *ar = arvif->ar;
2089
2090
mutex_lock(&ar->conf_mutex);
2091
ath10k_mac_vif_ap_csa_count_down(arvif);
2092
mutex_unlock(&ar->conf_mutex);
2093
}
2094
2095
static void ath10k_mac_handle_beacon_iter(void *data, u8 *mac,
2096
struct ieee80211_vif *vif)
2097
{
2098
struct sk_buff *skb = data;
2099
struct ieee80211_mgmt *mgmt = (void *)skb->data;
2100
struct ath10k_vif *arvif = (void *)vif->drv_priv;
2101
2102
if (vif->type != NL80211_IFTYPE_STATION)
2103
return;
2104
2105
if (!ether_addr_equal(mgmt->bssid, vif->bss_conf.bssid))
2106
return;
2107
2108
cancel_delayed_work(&arvif->connection_loss_work);
2109
}
2110
2111
void ath10k_mac_handle_beacon(struct ath10k *ar, struct sk_buff *skb)
2112
{
2113
ieee80211_iterate_active_interfaces_atomic(ar->hw,
2114
ATH10K_ITER_NORMAL_FLAGS,
2115
ath10k_mac_handle_beacon_iter,
2116
skb);
2117
}
2118
2119
static void ath10k_mac_handle_beacon_miss_iter(void *data, u8 *mac,
2120
struct ieee80211_vif *vif)
2121
{
2122
u32 *vdev_id = data;
2123
struct ath10k_vif *arvif = (void *)vif->drv_priv;
2124
struct ath10k *ar = arvif->ar;
2125
struct ieee80211_hw *hw = ar->hw;
2126
2127
if (arvif->vdev_id != *vdev_id)
2128
return;
2129
2130
if (!arvif->is_up)
2131
return;
2132
2133
ieee80211_beacon_loss(vif);
2134
2135
/* Firmware doesn't report beacon loss events repeatedly. If AP probe
2136
* (done by mac80211) succeeds but beacons do not resume then it
2137
* doesn't make sense to continue operation. Queue connection loss work
2138
* which can be cancelled when beacon is received.
2139
*/
2140
ieee80211_queue_delayed_work(hw, &arvif->connection_loss_work,
2141
ATH10K_CONNECTION_LOSS_HZ);
2142
}
2143
2144
void ath10k_mac_handle_beacon_miss(struct ath10k *ar, u32 vdev_id)
2145
{
2146
ieee80211_iterate_active_interfaces_atomic(ar->hw,
2147
ATH10K_ITER_NORMAL_FLAGS,
2148
ath10k_mac_handle_beacon_miss_iter,
2149
&vdev_id);
2150
}
2151
2152
static void ath10k_mac_vif_sta_connection_loss_work(struct work_struct *work)
2153
{
2154
struct ath10k_vif *arvif = container_of(work, struct ath10k_vif,
2155
connection_loss_work.work);
2156
struct ieee80211_vif *vif = arvif->vif;
2157
2158
if (!arvif->is_up)
2159
return;
2160
2161
ieee80211_connection_loss(vif);
2162
}
2163
2164
/**********************/
2165
/* Station management */
2166
/**********************/
2167
2168
static u32 ath10k_peer_assoc_h_listen_intval(struct ath10k *ar,
2169
struct ieee80211_vif *vif)
2170
{
2171
/* Some firmware revisions have unstable STA powersave when listen
2172
* interval is set too high (e.g. 5). The symptoms are firmware doesn't
2173
* generate NullFunc frames properly even if buffered frames have been
2174
* indicated in Beacon TIM. Firmware would seldom wake up to pull
2175
* buffered frames. Often pinging the device from AP would simply fail.
2176
*
2177
* As a workaround set it to 1.
2178
*/
2179
if (vif->type == NL80211_IFTYPE_STATION)
2180
return 1;
2181
2182
return ar->hw->conf.listen_interval;
2183
}
2184
2185
static void ath10k_peer_assoc_h_basic(struct ath10k *ar,
2186
struct ieee80211_vif *vif,
2187
struct ieee80211_sta *sta,
2188
struct wmi_peer_assoc_complete_arg *arg)
2189
{
2190
struct ath10k_vif *arvif = (void *)vif->drv_priv;
2191
u32 aid;
2192
2193
lockdep_assert_held(&ar->conf_mutex);
2194
2195
if (vif->type == NL80211_IFTYPE_STATION)
2196
aid = vif->cfg.aid;
2197
else
2198
aid = sta->aid;
2199
2200
ether_addr_copy(arg->addr, sta->addr);
2201
arg->vdev_id = arvif->vdev_id;
2202
arg->peer_aid = aid;
2203
arg->peer_flags |= arvif->ar->wmi.peer_flags->auth;
2204
arg->peer_listen_intval = ath10k_peer_assoc_h_listen_intval(ar, vif);
2205
arg->peer_num_spatial_streams = 1;
2206
arg->peer_caps = vif->bss_conf.assoc_capability;
2207
}
2208
2209
static void ath10k_peer_assoc_h_crypto(struct ath10k *ar,
2210
struct ieee80211_vif *vif,
2211
struct ieee80211_sta *sta,
2212
struct wmi_peer_assoc_complete_arg *arg)
2213
{
2214
struct ieee80211_bss_conf *info = &vif->bss_conf;
2215
struct cfg80211_chan_def def;
2216
struct cfg80211_bss *bss;
2217
const u8 *rsnie = NULL;
2218
const u8 *wpaie = NULL;
2219
2220
lockdep_assert_held(&ar->conf_mutex);
2221
2222
if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2223
return;
2224
2225
bss = cfg80211_get_bss(ar->hw->wiphy, def.chan, info->bssid,
2226
vif->cfg.ssid_len ? vif->cfg.ssid : NULL,
2227
vif->cfg.ssid_len,
2228
IEEE80211_BSS_TYPE_ANY, IEEE80211_PRIVACY_ANY);
2229
if (bss) {
2230
const struct cfg80211_bss_ies *ies;
2231
2232
rcu_read_lock();
2233
rsnie = ieee80211_bss_get_ie(bss, WLAN_EID_RSN);
2234
2235
ies = rcu_dereference(bss->ies);
2236
2237
wpaie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
2238
WLAN_OUI_TYPE_MICROSOFT_WPA,
2239
ies->data,
2240
ies->len);
2241
rcu_read_unlock();
2242
cfg80211_put_bss(ar->hw->wiphy, bss);
2243
}
2244
2245
/* FIXME: base on RSN IE/WPA IE is a correct idea? */
2246
if (rsnie || wpaie) {
2247
ath10k_dbg(ar, ATH10K_DBG_WMI, "%s: rsn ie found\n", __func__);
2248
arg->peer_flags |= ar->wmi.peer_flags->need_ptk_4_way;
2249
}
2250
2251
if (wpaie) {
2252
ath10k_dbg(ar, ATH10K_DBG_WMI, "%s: wpa ie found\n", __func__);
2253
arg->peer_flags |= ar->wmi.peer_flags->need_gtk_2_way;
2254
}
2255
2256
if (sta->mfp &&
2257
test_bit(ATH10K_FW_FEATURE_MFP_SUPPORT,
2258
ar->running_fw->fw_file.fw_features)) {
2259
arg->peer_flags |= ar->wmi.peer_flags->pmf;
2260
}
2261
}
2262
2263
static void ath10k_peer_assoc_h_rates(struct ath10k *ar,
2264
struct ieee80211_vif *vif,
2265
struct ieee80211_sta *sta,
2266
struct wmi_peer_assoc_complete_arg *arg)
2267
{
2268
struct ath10k_vif *arvif = (void *)vif->drv_priv;
2269
struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates;
2270
struct cfg80211_chan_def def;
2271
const struct ieee80211_supported_band *sband;
2272
const struct ieee80211_rate *rates;
2273
enum nl80211_band band;
2274
u32 ratemask;
2275
u8 rate;
2276
int i;
2277
2278
lockdep_assert_held(&ar->conf_mutex);
2279
2280
if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2281
return;
2282
2283
band = def.chan->band;
2284
sband = ar->hw->wiphy->bands[band];
2285
ratemask = sta->deflink.supp_rates[band];
2286
ratemask &= arvif->bitrate_mask.control[band].legacy;
2287
rates = sband->bitrates;
2288
2289
rateset->num_rates = 0;
2290
2291
for (i = 0; i < 32; i++, ratemask >>= 1, rates++) {
2292
if (!(ratemask & 1))
2293
continue;
2294
2295
rate = ath10k_mac_bitrate_to_rate(rates->bitrate);
2296
rateset->rates[rateset->num_rates] = rate;
2297
rateset->num_rates++;
2298
}
2299
}
2300
2301
static bool
2302
ath10k_peer_assoc_h_ht_masked(const u8 ht_mcs_mask[IEEE80211_HT_MCS_MASK_LEN])
2303
{
2304
int nss;
2305
2306
for (nss = 0; nss < IEEE80211_HT_MCS_MASK_LEN; nss++)
2307
if (ht_mcs_mask[nss])
2308
return false;
2309
2310
return true;
2311
}
2312
2313
static bool
2314
ath10k_peer_assoc_h_vht_masked(const u16 vht_mcs_mask[NL80211_VHT_NSS_MAX])
2315
{
2316
int nss;
2317
2318
for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++)
2319
if (vht_mcs_mask[nss])
2320
return false;
2321
2322
return true;
2323
}
2324
2325
static void ath10k_peer_assoc_h_ht(struct ath10k *ar,
2326
struct ieee80211_vif *vif,
2327
struct ieee80211_sta *sta,
2328
struct wmi_peer_assoc_complete_arg *arg)
2329
{
2330
const struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
2331
struct ath10k_vif *arvif = (void *)vif->drv_priv;
2332
struct cfg80211_chan_def def;
2333
enum nl80211_band band;
2334
const u8 *ht_mcs_mask;
2335
const u16 *vht_mcs_mask;
2336
int i, n;
2337
u8 max_nss;
2338
u32 stbc;
2339
2340
lockdep_assert_held(&ar->conf_mutex);
2341
2342
if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2343
return;
2344
2345
if (!ht_cap->ht_supported)
2346
return;
2347
2348
band = def.chan->band;
2349
ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
2350
vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2351
2352
if (ath10k_peer_assoc_h_ht_masked(ht_mcs_mask) &&
2353
ath10k_peer_assoc_h_vht_masked(vht_mcs_mask))
2354
return;
2355
2356
arg->peer_flags |= ar->wmi.peer_flags->ht;
2357
arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
2358
ht_cap->ampdu_factor)) - 1;
2359
2360
arg->peer_mpdu_density =
2361
ath10k_parse_mpdudensity(ht_cap->ampdu_density);
2362
2363
arg->peer_ht_caps = ht_cap->cap;
2364
arg->peer_rate_caps |= WMI_RC_HT_FLAG;
2365
2366
if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING)
2367
arg->peer_flags |= ar->wmi.peer_flags->ldbc;
2368
2369
if (sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40) {
2370
arg->peer_flags |= ar->wmi.peer_flags->bw40;
2371
arg->peer_rate_caps |= WMI_RC_CW40_FLAG;
2372
}
2373
2374
if (arvif->bitrate_mask.control[band].gi != NL80211_TXRATE_FORCE_LGI) {
2375
if (ht_cap->cap & IEEE80211_HT_CAP_SGI_20)
2376
arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
2377
2378
if (ht_cap->cap & IEEE80211_HT_CAP_SGI_40)
2379
arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
2380
}
2381
2382
if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) {
2383
arg->peer_rate_caps |= WMI_RC_TX_STBC_FLAG;
2384
arg->peer_flags |= ar->wmi.peer_flags->stbc;
2385
}
2386
2387
if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) {
2388
stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC;
2389
stbc = stbc >> IEEE80211_HT_CAP_RX_STBC_SHIFT;
2390
stbc = stbc << WMI_RC_RX_STBC_FLAG_S;
2391
arg->peer_rate_caps |= stbc;
2392
arg->peer_flags |= ar->wmi.peer_flags->stbc;
2393
}
2394
2395
if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2])
2396
arg->peer_rate_caps |= WMI_RC_TS_FLAG;
2397
else if (ht_cap->mcs.rx_mask[1])
2398
arg->peer_rate_caps |= WMI_RC_DS_FLAG;
2399
2400
for (i = 0, n = 0, max_nss = 0; i < IEEE80211_HT_MCS_MASK_LEN * 8; i++)
2401
if ((ht_cap->mcs.rx_mask[i / 8] & BIT(i % 8)) &&
2402
(ht_mcs_mask[i / 8] & BIT(i % 8))) {
2403
max_nss = (i / 8) + 1;
2404
arg->peer_ht_rates.rates[n++] = i;
2405
}
2406
2407
/*
2408
* This is a workaround for HT-enabled STAs which break the spec
2409
* and have no HT capabilities RX mask (no HT RX MCS map).
2410
*
2411
* As per spec, in section 20.3.5 Modulation and coding scheme (MCS),
2412
* MCS 0 through 7 are mandatory in 20MHz with 800 ns GI at all STAs.
2413
*
2414
* Firmware asserts if such situation occurs.
2415
*/
2416
if (n == 0) {
2417
arg->peer_ht_rates.num_rates = 8;
2418
for (i = 0; i < arg->peer_ht_rates.num_rates; i++)
2419
arg->peer_ht_rates.rates[i] = i;
2420
} else {
2421
arg->peer_ht_rates.num_rates = n;
2422
arg->peer_num_spatial_streams = min(sta->deflink.rx_nss,
2423
max_nss);
2424
}
2425
2426
ath10k_dbg(ar, ATH10K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n",
2427
arg->addr,
2428
arg->peer_ht_rates.num_rates,
2429
arg->peer_num_spatial_streams);
2430
}
2431
2432
static int ath10k_peer_assoc_qos_ap(struct ath10k *ar,
2433
struct ath10k_vif *arvif,
2434
struct ieee80211_sta *sta)
2435
{
2436
u32 uapsd = 0;
2437
u32 max_sp = 0;
2438
int ret = 0;
2439
2440
lockdep_assert_held(&ar->conf_mutex);
2441
2442
if (sta->wme && sta->uapsd_queues) {
2443
ath10k_dbg(ar, ATH10K_DBG_MAC, "mac uapsd_queues 0x%x max_sp %d\n",
2444
sta->uapsd_queues, sta->max_sp);
2445
2446
if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO)
2447
uapsd |= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN |
2448
WMI_AP_PS_UAPSD_AC3_TRIGGER_EN;
2449
if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI)
2450
uapsd |= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN |
2451
WMI_AP_PS_UAPSD_AC2_TRIGGER_EN;
2452
if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK)
2453
uapsd |= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN |
2454
WMI_AP_PS_UAPSD_AC1_TRIGGER_EN;
2455
if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE)
2456
uapsd |= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN |
2457
WMI_AP_PS_UAPSD_AC0_TRIGGER_EN;
2458
2459
if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP)
2460
max_sp = sta->max_sp;
2461
2462
ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
2463
sta->addr,
2464
WMI_AP_PS_PEER_PARAM_UAPSD,
2465
uapsd);
2466
if (ret) {
2467
ath10k_warn(ar, "failed to set ap ps peer param uapsd for vdev %i: %d\n",
2468
arvif->vdev_id, ret);
2469
return ret;
2470
}
2471
2472
ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
2473
sta->addr,
2474
WMI_AP_PS_PEER_PARAM_MAX_SP,
2475
max_sp);
2476
if (ret) {
2477
ath10k_warn(ar, "failed to set ap ps peer param max sp for vdev %i: %d\n",
2478
arvif->vdev_id, ret);
2479
return ret;
2480
}
2481
2482
/* TODO setup this based on STA listen interval and
2483
* beacon interval. Currently we don't know
2484
* sta->listen_interval - mac80211 patch required.
2485
* Currently use 10 seconds
2486
*/
2487
ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id, sta->addr,
2488
WMI_AP_PS_PEER_PARAM_AGEOUT_TIME,
2489
10);
2490
if (ret) {
2491
ath10k_warn(ar, "failed to set ap ps peer param ageout time for vdev %i: %d\n",
2492
arvif->vdev_id, ret);
2493
return ret;
2494
}
2495
}
2496
2497
return 0;
2498
}
2499
2500
static u16
2501
ath10k_peer_assoc_h_vht_limit(u16 tx_mcs_set,
2502
const u16 vht_mcs_limit[NL80211_VHT_NSS_MAX])
2503
{
2504
int idx_limit;
2505
int nss;
2506
u16 mcs_map;
2507
u16 mcs;
2508
2509
for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) {
2510
mcs_map = ath10k_mac_get_max_vht_mcs_map(tx_mcs_set, nss) &
2511
vht_mcs_limit[nss];
2512
2513
if (mcs_map)
2514
idx_limit = fls(mcs_map) - 1;
2515
else
2516
idx_limit = -1;
2517
2518
switch (idx_limit) {
2519
case 0:
2520
case 1:
2521
case 2:
2522
case 3:
2523
case 4:
2524
case 5:
2525
case 6:
2526
default:
2527
/* see ath10k_mac_can_set_bitrate_mask() */
2528
WARN_ON(1);
2529
fallthrough;
2530
case -1:
2531
mcs = IEEE80211_VHT_MCS_NOT_SUPPORTED;
2532
break;
2533
case 7:
2534
mcs = IEEE80211_VHT_MCS_SUPPORT_0_7;
2535
break;
2536
case 8:
2537
mcs = IEEE80211_VHT_MCS_SUPPORT_0_8;
2538
break;
2539
case 9:
2540
mcs = IEEE80211_VHT_MCS_SUPPORT_0_9;
2541
break;
2542
}
2543
2544
tx_mcs_set &= ~(0x3 << (nss * 2));
2545
tx_mcs_set |= mcs << (nss * 2);
2546
}
2547
2548
return tx_mcs_set;
2549
}
2550
2551
static u32 get_160mhz_nss_from_maxrate(int rate)
2552
{
2553
u32 nss;
2554
2555
switch (rate) {
2556
case 780:
2557
nss = 1;
2558
break;
2559
case 1560:
2560
nss = 2;
2561
break;
2562
case 2106:
2563
nss = 3; /* not support MCS9 from spec*/
2564
break;
2565
case 3120:
2566
nss = 4;
2567
break;
2568
default:
2569
nss = 1;
2570
}
2571
2572
return nss;
2573
}
2574
2575
static void ath10k_peer_assoc_h_vht(struct ath10k *ar,
2576
struct ieee80211_vif *vif,
2577
struct ieee80211_sta *sta,
2578
struct wmi_peer_assoc_complete_arg *arg)
2579
{
2580
const struct ieee80211_sta_vht_cap *vht_cap = &sta->deflink.vht_cap;
2581
struct ath10k_vif *arvif = (void *)vif->drv_priv;
2582
struct ath10k_hw_params *hw = &ar->hw_params;
2583
struct cfg80211_chan_def def;
2584
enum nl80211_band band;
2585
const u16 *vht_mcs_mask;
2586
u8 ampdu_factor;
2587
u8 max_nss, vht_mcs;
2588
int i;
2589
2590
if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2591
return;
2592
2593
if (!vht_cap->vht_supported)
2594
return;
2595
2596
band = def.chan->band;
2597
vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2598
2599
if (ath10k_peer_assoc_h_vht_masked(vht_mcs_mask))
2600
return;
2601
2602
arg->peer_flags |= ar->wmi.peer_flags->vht;
2603
2604
if (def.chan->band == NL80211_BAND_2GHZ)
2605
arg->peer_flags |= ar->wmi.peer_flags->vht_2g;
2606
2607
arg->peer_vht_caps = vht_cap->cap;
2608
2609
ampdu_factor = (vht_cap->cap &
2610
IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >>
2611
IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
2612
2613
/* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to
2614
* zero in VHT IE. Using it would result in degraded throughput.
2615
* arg->peer_max_mpdu at this point contains HT max_mpdu so keep
2616
* it if VHT max_mpdu is smaller.
2617
*/
2618
arg->peer_max_mpdu = max(arg->peer_max_mpdu,
2619
(1U << (IEEE80211_HT_MAX_AMPDU_FACTOR +
2620
ampdu_factor)) - 1);
2621
2622
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
2623
arg->peer_flags |= ar->wmi.peer_flags->bw80;
2624
2625
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160)
2626
arg->peer_flags |= ar->wmi.peer_flags->bw160;
2627
2628
/* Calculate peer NSS capability from VHT capabilities if STA
2629
* supports VHT.
2630
*/
2631
for (i = 0, max_nss = 0, vht_mcs = 0; i < NL80211_VHT_NSS_MAX; i++) {
2632
vht_mcs = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map) >>
2633
(2 * i) & 3;
2634
2635
if ((vht_mcs != IEEE80211_VHT_MCS_NOT_SUPPORTED) &&
2636
vht_mcs_mask[i])
2637
max_nss = i + 1;
2638
}
2639
arg->peer_num_spatial_streams = min(sta->deflink.rx_nss, max_nss);
2640
arg->peer_vht_rates.rx_max_rate =
2641
__le16_to_cpu(vht_cap->vht_mcs.rx_highest);
2642
arg->peer_vht_rates.rx_mcs_set =
2643
__le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map);
2644
arg->peer_vht_rates.tx_max_rate =
2645
__le16_to_cpu(vht_cap->vht_mcs.tx_highest);
2646
arg->peer_vht_rates.tx_mcs_set = ath10k_peer_assoc_h_vht_limit(
2647
__le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map), vht_mcs_mask);
2648
2649
/* Configure bandwidth-NSS mapping to FW
2650
* for the chip's tx chains setting on 160Mhz bw
2651
*/
2652
if (arg->peer_phymode == MODE_11AC_VHT160 ||
2653
arg->peer_phymode == MODE_11AC_VHT80_80) {
2654
u32 rx_nss;
2655
u32 max_rate;
2656
2657
max_rate = arg->peer_vht_rates.rx_max_rate;
2658
rx_nss = get_160mhz_nss_from_maxrate(max_rate);
2659
2660
if (rx_nss == 0)
2661
rx_nss = arg->peer_num_spatial_streams;
2662
else
2663
rx_nss = min(arg->peer_num_spatial_streams, rx_nss);
2664
2665
max_rate = hw->vht160_mcs_tx_highest;
2666
rx_nss = min(rx_nss, get_160mhz_nss_from_maxrate(max_rate));
2667
2668
arg->peer_bw_rxnss_override =
2669
FIELD_PREP(WMI_PEER_NSS_MAP_ENABLE, 1) |
2670
FIELD_PREP(WMI_PEER_NSS_160MHZ_MASK, (rx_nss - 1));
2671
2672
if (arg->peer_phymode == MODE_11AC_VHT80_80) {
2673
arg->peer_bw_rxnss_override |=
2674
FIELD_PREP(WMI_PEER_NSS_80_80MHZ_MASK, (rx_nss - 1));
2675
}
2676
}
2677
ath10k_dbg(ar, ATH10K_DBG_MAC,
2678
"mac vht peer %pM max_mpdu %d flags 0x%x peer_rx_nss_override 0x%x\n",
2679
sta->addr, arg->peer_max_mpdu,
2680
arg->peer_flags, arg->peer_bw_rxnss_override);
2681
}
2682
2683
static void ath10k_peer_assoc_h_qos(struct ath10k *ar,
2684
struct ieee80211_vif *vif,
2685
struct ieee80211_sta *sta,
2686
struct wmi_peer_assoc_complete_arg *arg)
2687
{
2688
struct ath10k_vif *arvif = (void *)vif->drv_priv;
2689
2690
switch (arvif->vdev_type) {
2691
case WMI_VDEV_TYPE_AP:
2692
if (sta->wme)
2693
arg->peer_flags |= arvif->ar->wmi.peer_flags->qos;
2694
2695
if (sta->wme && sta->uapsd_queues) {
2696
arg->peer_flags |= arvif->ar->wmi.peer_flags->apsd;
2697
arg->peer_rate_caps |= WMI_RC_UAPSD_FLAG;
2698
}
2699
break;
2700
case WMI_VDEV_TYPE_STA:
2701
if (sta->wme)
2702
arg->peer_flags |= arvif->ar->wmi.peer_flags->qos;
2703
break;
2704
case WMI_VDEV_TYPE_IBSS:
2705
if (sta->wme)
2706
arg->peer_flags |= arvif->ar->wmi.peer_flags->qos;
2707
break;
2708
default:
2709
break;
2710
}
2711
2712
ath10k_dbg(ar, ATH10K_DBG_MAC, "mac peer %pM qos %d\n",
2713
sta->addr, !!(arg->peer_flags &
2714
arvif->ar->wmi.peer_flags->qos));
2715
}
2716
2717
static bool ath10k_mac_sta_has_ofdm_only(struct ieee80211_sta *sta)
2718
{
2719
return sta->deflink.supp_rates[NL80211_BAND_2GHZ] >>
2720
ATH10K_MAC_FIRST_OFDM_RATE_IDX;
2721
}
2722
2723
static enum wmi_phy_mode ath10k_mac_get_phymode_vht(struct ath10k *ar,
2724
struct ieee80211_sta *sta)
2725
{
2726
struct ieee80211_sta_vht_cap *vht_cap = &sta->deflink.vht_cap;
2727
2728
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160) {
2729
switch (vht_cap->cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK) {
2730
case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ:
2731
return MODE_11AC_VHT160;
2732
case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ:
2733
return MODE_11AC_VHT80_80;
2734
default:
2735
/* not sure if this is a valid case? */
2736
return MODE_11AC_VHT160;
2737
}
2738
}
2739
2740
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
2741
return MODE_11AC_VHT80;
2742
2743
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2744
return MODE_11AC_VHT40;
2745
2746
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_20)
2747
return MODE_11AC_VHT20;
2748
2749
return MODE_UNKNOWN;
2750
}
2751
2752
static void ath10k_peer_assoc_h_phymode(struct ath10k *ar,
2753
struct ieee80211_vif *vif,
2754
struct ieee80211_sta *sta,
2755
struct wmi_peer_assoc_complete_arg *arg)
2756
{
2757
struct ath10k_vif *arvif = (void *)vif->drv_priv;
2758
struct cfg80211_chan_def def;
2759
enum nl80211_band band;
2760
const u8 *ht_mcs_mask;
2761
const u16 *vht_mcs_mask;
2762
enum wmi_phy_mode phymode = MODE_UNKNOWN;
2763
2764
if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2765
return;
2766
2767
band = def.chan->band;
2768
ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
2769
vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2770
2771
switch (band) {
2772
case NL80211_BAND_2GHZ:
2773
if (sta->deflink.vht_cap.vht_supported &&
2774
!ath10k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
2775
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2776
phymode = MODE_11AC_VHT40;
2777
else
2778
phymode = MODE_11AC_VHT20;
2779
} else if (sta->deflink.ht_cap.ht_supported &&
2780
!ath10k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
2781
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2782
phymode = MODE_11NG_HT40;
2783
else
2784
phymode = MODE_11NG_HT20;
2785
} else if (ath10k_mac_sta_has_ofdm_only(sta)) {
2786
phymode = MODE_11G;
2787
} else {
2788
phymode = MODE_11B;
2789
}
2790
2791
break;
2792
case NL80211_BAND_5GHZ:
2793
/*
2794
* Check VHT first.
2795
*/
2796
if (sta->deflink.vht_cap.vht_supported &&
2797
!ath10k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
2798
phymode = ath10k_mac_get_phymode_vht(ar, sta);
2799
} else if (sta->deflink.ht_cap.ht_supported &&
2800
!ath10k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
2801
if (sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40)
2802
phymode = MODE_11NA_HT40;
2803
else
2804
phymode = MODE_11NA_HT20;
2805
} else {
2806
phymode = MODE_11A;
2807
}
2808
2809
break;
2810
default:
2811
break;
2812
}
2813
2814
ath10k_dbg(ar, ATH10K_DBG_MAC, "mac peer %pM phymode %s\n",
2815
sta->addr, ath10k_wmi_phymode_str(phymode));
2816
2817
arg->peer_phymode = phymode;
2818
WARN_ON(phymode == MODE_UNKNOWN);
2819
}
2820
2821
static int ath10k_peer_assoc_prepare(struct ath10k *ar,
2822
struct ieee80211_vif *vif,
2823
struct ieee80211_sta *sta,
2824
struct wmi_peer_assoc_complete_arg *arg)
2825
{
2826
lockdep_assert_held(&ar->conf_mutex);
2827
2828
memset(arg, 0, sizeof(*arg));
2829
2830
ath10k_peer_assoc_h_basic(ar, vif, sta, arg);
2831
ath10k_peer_assoc_h_crypto(ar, vif, sta, arg);
2832
ath10k_peer_assoc_h_rates(ar, vif, sta, arg);
2833
ath10k_peer_assoc_h_ht(ar, vif, sta, arg);
2834
ath10k_peer_assoc_h_phymode(ar, vif, sta, arg);
2835
ath10k_peer_assoc_h_vht(ar, vif, sta, arg);
2836
ath10k_peer_assoc_h_qos(ar, vif, sta, arg);
2837
2838
return 0;
2839
}
2840
2841
static const u32 ath10k_smps_map[] = {
2842
[WLAN_HT_CAP_SM_PS_STATIC] = WMI_PEER_SMPS_STATIC,
2843
[WLAN_HT_CAP_SM_PS_DYNAMIC] = WMI_PEER_SMPS_DYNAMIC,
2844
[WLAN_HT_CAP_SM_PS_INVALID] = WMI_PEER_SMPS_PS_NONE,
2845
[WLAN_HT_CAP_SM_PS_DISABLED] = WMI_PEER_SMPS_PS_NONE,
2846
};
2847
2848
static int ath10k_setup_peer_smps(struct ath10k *ar, struct ath10k_vif *arvif,
2849
const u8 *addr,
2850
const struct ieee80211_sta_ht_cap *ht_cap)
2851
{
2852
int smps;
2853
2854
if (!ht_cap->ht_supported)
2855
return 0;
2856
2857
smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
2858
smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
2859
2860
if (smps >= ARRAY_SIZE(ath10k_smps_map))
2861
return -EINVAL;
2862
2863
return ath10k_wmi_peer_set_param(ar, arvif->vdev_id, addr,
2864
ar->wmi.peer_param->smps_state,
2865
ath10k_smps_map[smps]);
2866
}
2867
2868
static int ath10k_mac_vif_recalc_txbf(struct ath10k *ar,
2869
struct ieee80211_vif *vif,
2870
struct ieee80211_sta_vht_cap vht_cap)
2871
{
2872
struct ath10k_vif *arvif = (void *)vif->drv_priv;
2873
int ret;
2874
u32 param;
2875
u32 value;
2876
2877
if (ath10k_wmi_get_txbf_conf_scheme(ar) != WMI_TXBF_CONF_AFTER_ASSOC)
2878
return 0;
2879
2880
if (!(ar->vht_cap_info &
2881
(IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
2882
IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE |
2883
IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
2884
IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)))
2885
return 0;
2886
2887
param = ar->wmi.vdev_param->txbf;
2888
value = 0;
2889
2890
if (WARN_ON(param == WMI_VDEV_PARAM_UNSUPPORTED))
2891
return 0;
2892
2893
/* The following logic is correct. If a remote STA advertises support
2894
* for being a beamformer then we should enable us being a beamformee.
2895
*/
2896
2897
if (ar->vht_cap_info &
2898
(IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
2899
IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)) {
2900
if (vht_cap.cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)
2901
value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
2902
2903
if (vht_cap.cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)
2904
value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFEE;
2905
}
2906
2907
if (ar->vht_cap_info &
2908
(IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
2909
IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)) {
2910
if (vht_cap.cap & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)
2911
value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
2912
2913
if (vht_cap.cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)
2914
value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFER;
2915
}
2916
2917
if (value & WMI_VDEV_PARAM_TXBF_MU_TX_BFEE)
2918
value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
2919
2920
if (value & WMI_VDEV_PARAM_TXBF_MU_TX_BFER)
2921
value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
2922
2923
ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param, value);
2924
if (ret) {
2925
ath10k_warn(ar, "failed to submit vdev param txbf 0x%x: %d\n",
2926
value, ret);
2927
return ret;
2928
}
2929
2930
return 0;
2931
}
2932
2933
static bool ath10k_mac_is_connected(struct ath10k *ar)
2934
{
2935
struct ath10k_vif *arvif;
2936
2937
list_for_each_entry(arvif, &ar->arvifs, list) {
2938
if (arvif->is_up && arvif->vdev_type == WMI_VDEV_TYPE_STA)
2939
return true;
2940
}
2941
2942
return false;
2943
}
2944
2945
static int ath10k_mac_txpower_setup(struct ath10k *ar, int txpower)
2946
{
2947
int ret;
2948
u32 param;
2949
int tx_power_2g, tx_power_5g;
2950
bool connected;
2951
2952
lockdep_assert_held(&ar->conf_mutex);
2953
2954
/* ath10k internally uses unit of 0.5 dBm so multiply by 2 */
2955
tx_power_2g = txpower * 2;
2956
tx_power_5g = txpower * 2;
2957
2958
connected = ath10k_mac_is_connected(ar);
2959
2960
if (connected && ar->tx_power_2g_limit)
2961
if (tx_power_2g > ar->tx_power_2g_limit)
2962
tx_power_2g = ar->tx_power_2g_limit;
2963
2964
if (connected && ar->tx_power_5g_limit)
2965
if (tx_power_5g > ar->tx_power_5g_limit)
2966
tx_power_5g = ar->tx_power_5g_limit;
2967
2968
ath10k_dbg(ar, ATH10K_DBG_MAC, "mac txpower 2g: %d, 5g: %d\n",
2969
tx_power_2g, tx_power_5g);
2970
2971
param = ar->wmi.pdev_param->txpower_limit2g;
2972
ret = ath10k_wmi_pdev_set_param(ar, param, tx_power_2g);
2973
if (ret) {
2974
ath10k_warn(ar, "failed to set 2g txpower %d: %d\n",
2975
tx_power_2g, ret);
2976
return ret;
2977
}
2978
2979
param = ar->wmi.pdev_param->txpower_limit5g;
2980
ret = ath10k_wmi_pdev_set_param(ar, param, tx_power_5g);
2981
if (ret) {
2982
ath10k_warn(ar, "failed to set 5g txpower %d: %d\n",
2983
tx_power_5g, ret);
2984
return ret;
2985
}
2986
2987
return 0;
2988
}
2989
2990
static int ath10k_mac_txpower_recalc(struct ath10k *ar)
2991
{
2992
struct ath10k_vif *arvif;
2993
int ret, txpower = -1;
2994
2995
lockdep_assert_held(&ar->conf_mutex);
2996
2997
list_for_each_entry(arvif, &ar->arvifs, list) {
2998
/* txpower not initialized yet? */
2999
if (arvif->txpower == INT_MIN)
3000
continue;
3001
3002
if (txpower == -1)
3003
txpower = arvif->txpower;
3004
else
3005
txpower = min(txpower, arvif->txpower);
3006
}
3007
3008
if (txpower == -1)
3009
return 0;
3010
3011
ret = ath10k_mac_txpower_setup(ar, txpower);
3012
if (ret) {
3013
ath10k_warn(ar, "failed to setup tx power %d: %d\n",
3014
txpower, ret);
3015
return ret;
3016
}
3017
3018
return 0;
3019
}
3020
3021
static int ath10k_mac_set_sar_power(struct ath10k *ar)
3022
{
3023
if (!ar->hw_params.dynamic_sar_support)
3024
return -EOPNOTSUPP;
3025
3026
if (!ath10k_mac_is_connected(ar))
3027
return 0;
3028
3029
/* if connected, then arvif->txpower must be valid */
3030
return ath10k_mac_txpower_recalc(ar);
3031
}
3032
3033
static int ath10k_mac_set_sar_specs(struct ieee80211_hw *hw,
3034
const struct cfg80211_sar_specs *sar)
3035
{
3036
const struct cfg80211_sar_sub_specs *sub_specs;
3037
struct ath10k *ar = hw->priv;
3038
u32 i;
3039
int ret;
3040
3041
mutex_lock(&ar->conf_mutex);
3042
3043
if (!ar->hw_params.dynamic_sar_support) {
3044
ret = -EOPNOTSUPP;
3045
goto err;
3046
}
3047
3048
if (!sar || sar->type != NL80211_SAR_TYPE_POWER ||
3049
sar->num_sub_specs == 0) {
3050
ret = -EINVAL;
3051
goto err;
3052
}
3053
3054
sub_specs = sar->sub_specs;
3055
3056
/* 0dbm is not a practical value for ath10k, so use 0
3057
* as no SAR limitation on it.
3058
*/
3059
ar->tx_power_2g_limit = 0;
3060
ar->tx_power_5g_limit = 0;
3061
3062
/* note the power is in 0.25dbm unit, while ath10k uses
3063
* 0.5dbm unit.
3064
*/
3065
for (i = 0; i < sar->num_sub_specs; i++) {
3066
if (sub_specs->freq_range_index == 0)
3067
ar->tx_power_2g_limit = sub_specs->power / 2;
3068
else if (sub_specs->freq_range_index == 1)
3069
ar->tx_power_5g_limit = sub_specs->power / 2;
3070
3071
sub_specs++;
3072
}
3073
3074
ret = ath10k_mac_set_sar_power(ar);
3075
if (ret) {
3076
ath10k_warn(ar, "failed to set sar power: %d", ret);
3077
goto err;
3078
}
3079
3080
err:
3081
mutex_unlock(&ar->conf_mutex);
3082
return ret;
3083
}
3084
3085
/* can be called only in mac80211 callbacks due to `key_count` usage */
3086
static void ath10k_bss_assoc(struct ieee80211_hw *hw,
3087
struct ieee80211_vif *vif,
3088
struct ieee80211_bss_conf *bss_conf)
3089
{
3090
struct ath10k *ar = hw->priv;
3091
struct ath10k_vif *arvif = (void *)vif->drv_priv;
3092
struct ieee80211_sta_ht_cap ht_cap;
3093
struct ieee80211_sta_vht_cap vht_cap;
3094
struct wmi_peer_assoc_complete_arg peer_arg;
3095
struct ieee80211_sta *ap_sta;
3096
int ret;
3097
3098
lockdep_assert_held(&ar->conf_mutex);
3099
3100
ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i assoc bssid %pM aid %d\n",
3101
arvif->vdev_id, arvif->bssid, arvif->aid);
3102
3103
rcu_read_lock();
3104
3105
ap_sta = ieee80211_find_sta(vif, bss_conf->bssid);
3106
if (!ap_sta) {
3107
ath10k_warn(ar, "failed to find station entry for bss %pM vdev %i\n",
3108
bss_conf->bssid, arvif->vdev_id);
3109
rcu_read_unlock();
3110
return;
3111
}
3112
3113
/* ap_sta must be accessed only within rcu section which must be left
3114
* before calling ath10k_setup_peer_smps() which might sleep.
3115
*/
3116
ht_cap = ap_sta->deflink.ht_cap;
3117
vht_cap = ap_sta->deflink.vht_cap;
3118
3119
ret = ath10k_peer_assoc_prepare(ar, vif, ap_sta, &peer_arg);
3120
if (ret) {
3121
ath10k_warn(ar, "failed to prepare peer assoc for %pM vdev %i: %d\n",
3122
bss_conf->bssid, arvif->vdev_id, ret);
3123
rcu_read_unlock();
3124
return;
3125
}
3126
3127
rcu_read_unlock();
3128
3129
ret = ath10k_wmi_peer_assoc(ar, &peer_arg);
3130
if (ret) {
3131
ath10k_warn(ar, "failed to run peer assoc for %pM vdev %i: %d\n",
3132
bss_conf->bssid, arvif->vdev_id, ret);
3133
return;
3134
}
3135
3136
ret = ath10k_setup_peer_smps(ar, arvif, bss_conf->bssid, &ht_cap);
3137
if (ret) {
3138
ath10k_warn(ar, "failed to setup peer SMPS for vdev %i: %d\n",
3139
arvif->vdev_id, ret);
3140
return;
3141
}
3142
3143
ret = ath10k_mac_vif_recalc_txbf(ar, vif, vht_cap);
3144
if (ret) {
3145
ath10k_warn(ar, "failed to recalc txbf for vdev %i on bss %pM: %d\n",
3146
arvif->vdev_id, bss_conf->bssid, ret);
3147
return;
3148
}
3149
3150
ath10k_dbg(ar, ATH10K_DBG_MAC,
3151
"mac vdev %d up (associated) bssid %pM aid %d\n",
3152
arvif->vdev_id, bss_conf->bssid, vif->cfg.aid);
3153
3154
WARN_ON(arvif->is_up);
3155
3156
arvif->aid = vif->cfg.aid;
3157
ether_addr_copy(arvif->bssid, bss_conf->bssid);
3158
3159
ret = ath10k_wmi_pdev_set_param(ar,
3160
ar->wmi.pdev_param->peer_stats_info_enable, 1);
3161
if (ret)
3162
ath10k_warn(ar, "failed to enable peer stats info: %d\n", ret);
3163
3164
ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid);
3165
if (ret) {
3166
ath10k_warn(ar, "failed to set vdev %d up: %d\n",
3167
arvif->vdev_id, ret);
3168
return;
3169
}
3170
3171
arvif->is_up = true;
3172
3173
ath10k_mac_set_sar_power(ar);
3174
3175
/* Workaround: Some firmware revisions (tested with qca6174
3176
* WLAN.RM.2.0-00073) have buggy powersave state machine and must be
3177
* poked with peer param command.
3178
*/
3179
ret = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, arvif->bssid,
3180
ar->wmi.peer_param->dummy_var, 1);
3181
if (ret) {
3182
ath10k_warn(ar, "failed to poke peer %pM param for ps workaround on vdev %i: %d\n",
3183
arvif->bssid, arvif->vdev_id, ret);
3184
return;
3185
}
3186
}
3187
3188
static void ath10k_bss_disassoc(struct ieee80211_hw *hw,
3189
struct ieee80211_vif *vif)
3190
{
3191
struct ath10k *ar = hw->priv;
3192
struct ath10k_vif *arvif = (void *)vif->drv_priv;
3193
struct ieee80211_sta_vht_cap vht_cap = {};
3194
int ret;
3195
3196
lockdep_assert_held(&ar->conf_mutex);
3197
3198
ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i disassoc bssid %pM\n",
3199
arvif->vdev_id, arvif->bssid);
3200
3201
ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
3202
if (ret)
3203
ath10k_warn(ar, "failed to down vdev %i: %d\n",
3204
arvif->vdev_id, ret);
3205
3206
arvif->def_wep_key_idx = -1;
3207
3208
ret = ath10k_mac_vif_recalc_txbf(ar, vif, vht_cap);
3209
if (ret) {
3210
ath10k_warn(ar, "failed to recalc txbf for vdev %i: %d\n",
3211
arvif->vdev_id, ret);
3212
return;
3213
}
3214
3215
arvif->is_up = false;
3216
3217
ath10k_mac_txpower_recalc(ar);
3218
3219
cancel_delayed_work_sync(&arvif->connection_loss_work);
3220
}
3221
3222
static int ath10k_new_peer_tid_config(struct ath10k *ar,
3223
struct ieee80211_sta *sta,
3224
struct ath10k_vif *arvif)
3225
{
3226
struct wmi_per_peer_per_tid_cfg_arg arg = {};
3227
struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
3228
bool config_apply;
3229
int ret, i;
3230
3231
for (i = 0; i < ATH10K_TID_MAX; i++) {
3232
config_apply = false;
3233
if (arvif->retry_long[i] || arvif->ampdu[i] ||
3234
arvif->rate_ctrl[i] || arvif->rtscts[i]) {
3235
config_apply = true;
3236
arg.tid = i;
3237
arg.vdev_id = arvif->vdev_id;
3238
arg.retry_count = arvif->retry_long[i];
3239
arg.aggr_control = arvif->ampdu[i];
3240
arg.rate_ctrl = arvif->rate_ctrl[i];
3241
arg.rcode_flags = arvif->rate_code[i];
3242
3243
if (arvif->rtscts[i])
3244
arg.ext_tid_cfg_bitmap =
3245
WMI_EXT_TID_RTS_CTS_CONFIG;
3246
else
3247
arg.ext_tid_cfg_bitmap = 0;
3248
3249
arg.rtscts_ctrl = arvif->rtscts[i];
3250
}
3251
3252
if (arvif->noack[i]) {
3253
arg.ack_policy = arvif->noack[i];
3254
arg.rate_ctrl = WMI_TID_CONFIG_RATE_CONTROL_DEFAULT_LOWEST_RATE;
3255
arg.aggr_control = WMI_TID_CONFIG_AGGR_CONTROL_DISABLE;
3256
config_apply = true;
3257
}
3258
3259
/* Assign default value(-1) to newly connected station.
3260
* This is to identify station specific tid configuration not
3261
* configured for the station.
3262
*/
3263
arsta->retry_long[i] = -1;
3264
arsta->noack[i] = -1;
3265
arsta->ampdu[i] = -1;
3266
3267
if (!config_apply)
3268
continue;
3269
3270
ether_addr_copy(arg.peer_macaddr.addr, sta->addr);
3271
3272
ret = ath10k_wmi_set_per_peer_per_tid_cfg(ar, &arg);
3273
if (ret) {
3274
ath10k_warn(ar, "failed to set per tid retry/aggr config for sta %pM: %d\n",
3275
sta->addr, ret);
3276
return ret;
3277
}
3278
3279
memset(&arg, 0, sizeof(arg));
3280
}
3281
3282
return 0;
3283
}
3284
3285
static int ath10k_station_assoc(struct ath10k *ar,
3286
struct ieee80211_vif *vif,
3287
struct ieee80211_sta *sta,
3288
bool reassoc)
3289
{
3290
struct ath10k_vif *arvif = (void *)vif->drv_priv;
3291
struct wmi_peer_assoc_complete_arg peer_arg;
3292
int ret = 0;
3293
3294
lockdep_assert_held(&ar->conf_mutex);
3295
3296
ret = ath10k_peer_assoc_prepare(ar, vif, sta, &peer_arg);
3297
if (ret) {
3298
ath10k_warn(ar, "failed to prepare WMI peer assoc for %pM vdev %i: %i\n",
3299
sta->addr, arvif->vdev_id, ret);
3300
return ret;
3301
}
3302
3303
ret = ath10k_wmi_peer_assoc(ar, &peer_arg);
3304
if (ret) {
3305
ath10k_warn(ar, "failed to run peer assoc for STA %pM vdev %i: %d\n",
3306
sta->addr, arvif->vdev_id, ret);
3307
return ret;
3308
}
3309
3310
/* Re-assoc is run only to update supported rates for given station. It
3311
* doesn't make much sense to reconfigure the peer completely.
3312
*/
3313
if (!reassoc) {
3314
ret = ath10k_setup_peer_smps(ar, arvif, sta->addr,
3315
&sta->deflink.ht_cap);
3316
if (ret) {
3317
ath10k_warn(ar, "failed to setup peer SMPS for vdev %d: %d\n",
3318
arvif->vdev_id, ret);
3319
return ret;
3320
}
3321
3322
ret = ath10k_peer_assoc_qos_ap(ar, arvif, sta);
3323
if (ret) {
3324
ath10k_warn(ar, "failed to set qos params for STA %pM for vdev %i: %d\n",
3325
sta->addr, arvif->vdev_id, ret);
3326
return ret;
3327
}
3328
3329
if (!sta->wme) {
3330
arvif->num_legacy_stations++;
3331
ret = ath10k_recalc_rtscts_prot(arvif);
3332
if (ret) {
3333
ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
3334
arvif->vdev_id, ret);
3335
return ret;
3336
}
3337
}
3338
3339
/* Plumb cached keys only for static WEP */
3340
if ((arvif->def_wep_key_idx != -1) && (!sta->tdls)) {
3341
ret = ath10k_install_peer_wep_keys(arvif, sta->addr);
3342
if (ret) {
3343
ath10k_warn(ar, "failed to install peer wep keys for vdev %i: %d\n",
3344
arvif->vdev_id, ret);
3345
return ret;
3346
}
3347
}
3348
}
3349
3350
if (!test_bit(WMI_SERVICE_PEER_TID_CONFIGS_SUPPORT, ar->wmi.svc_map))
3351
return ret;
3352
3353
return ath10k_new_peer_tid_config(ar, sta, arvif);
3354
}
3355
3356
static int ath10k_station_disassoc(struct ath10k *ar,
3357
struct ieee80211_vif *vif,
3358
struct ieee80211_sta *sta)
3359
{
3360
struct ath10k_vif *arvif = (void *)vif->drv_priv;
3361
int ret = 0;
3362
3363
lockdep_assert_held(&ar->conf_mutex);
3364
3365
if (!sta->wme) {
3366
arvif->num_legacy_stations--;
3367
ret = ath10k_recalc_rtscts_prot(arvif);
3368
if (ret) {
3369
ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
3370
arvif->vdev_id, ret);
3371
return ret;
3372
}
3373
}
3374
3375
ret = ath10k_clear_peer_keys(arvif, sta->addr);
3376
if (ret) {
3377
ath10k_warn(ar, "failed to clear all peer wep keys for vdev %i: %d\n",
3378
arvif->vdev_id, ret);
3379
return ret;
3380
}
3381
3382
return ret;
3383
}
3384
3385
/**************/
3386
/* Regulatory */
3387
/**************/
3388
3389
static int ath10k_update_channel_list(struct ath10k *ar)
3390
{
3391
struct ieee80211_hw *hw = ar->hw;
3392
struct ieee80211_supported_band **bands;
3393
enum nl80211_band band;
3394
struct ieee80211_channel *channel;
3395
struct wmi_scan_chan_list_arg arg = {};
3396
struct wmi_channel_arg *ch;
3397
bool passive;
3398
int len;
3399
int ret;
3400
int i;
3401
3402
lockdep_assert_held(&ar->conf_mutex);
3403
3404
bands = hw->wiphy->bands;
3405
for (band = 0; band < NUM_NL80211_BANDS; band++) {
3406
if (!bands[band])
3407
continue;
3408
3409
for (i = 0; i < bands[band]->n_channels; i++) {
3410
if (bands[band]->channels[i].flags &
3411
IEEE80211_CHAN_DISABLED)
3412
continue;
3413
3414
arg.n_channels++;
3415
}
3416
}
3417
3418
len = sizeof(struct wmi_channel_arg) * arg.n_channels;
3419
arg.channels = kzalloc(len, GFP_KERNEL);
3420
if (!arg.channels)
3421
return -ENOMEM;
3422
3423
ch = arg.channels;
3424
for (band = 0; band < NUM_NL80211_BANDS; band++) {
3425
if (!bands[band])
3426
continue;
3427
3428
for (i = 0; i < bands[band]->n_channels; i++) {
3429
channel = &bands[band]->channels[i];
3430
3431
if (channel->flags & IEEE80211_CHAN_DISABLED)
3432
continue;
3433
3434
ch->allow_ht = true;
3435
3436
/* FIXME: when should we really allow VHT? */
3437
ch->allow_vht = true;
3438
3439
ch->allow_ibss =
3440
!(channel->flags & IEEE80211_CHAN_NO_IR);
3441
3442
ch->ht40plus =
3443
!(channel->flags & IEEE80211_CHAN_NO_HT40PLUS);
3444
3445
ch->chan_radar =
3446
!!(channel->flags & IEEE80211_CHAN_RADAR);
3447
3448
passive = channel->flags & IEEE80211_CHAN_NO_IR;
3449
ch->passive = passive;
3450
3451
/* the firmware is ignoring the "radar" flag of the
3452
* channel and is scanning actively using Probe Requests
3453
* on "Radar detection"/DFS channels which are not
3454
* marked as "available"
3455
*/
3456
ch->passive |= ch->chan_radar;
3457
3458
ch->freq = channel->center_freq;
3459
ch->band_center_freq1 = channel->center_freq;
3460
ch->min_power = 0;
3461
ch->max_power = channel->max_power * 2;
3462
ch->max_reg_power = channel->max_reg_power * 2;
3463
ch->max_antenna_gain = channel->max_antenna_gain;
3464
ch->reg_class_id = 0; /* FIXME */
3465
3466
/* FIXME: why use only legacy modes, why not any
3467
* HT/VHT modes? Would that even make any
3468
* difference?
3469
*/
3470
if (channel->band == NL80211_BAND_2GHZ)
3471
ch->mode = MODE_11G;
3472
else
3473
ch->mode = MODE_11A;
3474
3475
if (WARN_ON_ONCE(ch->mode == MODE_UNKNOWN))
3476
continue;
3477
3478
ath10k_dbg(ar, ATH10K_DBG_WMI,
3479
"mac channel [%zd/%d] freq %d maxpower %d regpower %d antenna %d mode %d\n",
3480
ch - arg.channels, arg.n_channels,
3481
ch->freq, ch->max_power, ch->max_reg_power,
3482
ch->max_antenna_gain, ch->mode);
3483
3484
ch++;
3485
}
3486
}
3487
3488
ret = ath10k_wmi_scan_chan_list(ar, &arg);
3489
kfree(arg.channels);
3490
3491
return ret;
3492
}
3493
3494
static enum wmi_dfs_region
3495
ath10k_mac_get_dfs_region(enum nl80211_dfs_regions dfs_region)
3496
{
3497
switch (dfs_region) {
3498
case NL80211_DFS_UNSET:
3499
return WMI_UNINIT_DFS_DOMAIN;
3500
case NL80211_DFS_FCC:
3501
return WMI_FCC_DFS_DOMAIN;
3502
case NL80211_DFS_ETSI:
3503
return WMI_ETSI_DFS_DOMAIN;
3504
case NL80211_DFS_JP:
3505
return WMI_MKK4_DFS_DOMAIN;
3506
}
3507
return WMI_UNINIT_DFS_DOMAIN;
3508
}
3509
3510
static void ath10k_regd_update(struct ath10k *ar)
3511
{
3512
struct reg_dmn_pair_mapping *regpair;
3513
int ret;
3514
enum wmi_dfs_region wmi_dfs_reg;
3515
enum nl80211_dfs_regions nl_dfs_reg;
3516
3517
lockdep_assert_held(&ar->conf_mutex);
3518
3519
ret = ath10k_update_channel_list(ar);
3520
if (ret)
3521
ath10k_warn(ar, "failed to update channel list: %d\n", ret);
3522
3523
regpair = ar->ath_common.regulatory.regpair;
3524
3525
if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) {
3526
nl_dfs_reg = ar->dfs_detector->region;
3527
wmi_dfs_reg = ath10k_mac_get_dfs_region(nl_dfs_reg);
3528
} else {
3529
wmi_dfs_reg = WMI_UNINIT_DFS_DOMAIN;
3530
}
3531
3532
/* Target allows setting up per-band regdomain but ath_common provides
3533
* a combined one only
3534
*/
3535
ret = ath10k_wmi_pdev_set_regdomain(ar,
3536
regpair->reg_domain,
3537
regpair->reg_domain, /* 2ghz */
3538
regpair->reg_domain, /* 5ghz */
3539
regpair->reg_2ghz_ctl,
3540
regpair->reg_5ghz_ctl,
3541
wmi_dfs_reg);
3542
if (ret)
3543
ath10k_warn(ar, "failed to set pdev regdomain: %d\n", ret);
3544
}
3545
3546
static void ath10k_mac_update_channel_list(struct ath10k *ar,
3547
struct ieee80211_supported_band *band)
3548
{
3549
int i;
3550
3551
if (ar->low_5ghz_chan && ar->high_5ghz_chan) {
3552
for (i = 0; i < band->n_channels; i++) {
3553
if (band->channels[i].center_freq < ar->low_5ghz_chan ||
3554
band->channels[i].center_freq > ar->high_5ghz_chan)
3555
band->channels[i].flags |=
3556
IEEE80211_CHAN_DISABLED;
3557
}
3558
}
3559
}
3560
3561
static void ath10k_reg_notifier(struct wiphy *wiphy,
3562
struct regulatory_request *request)
3563
{
3564
struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
3565
struct ath10k *ar = hw->priv;
3566
bool result;
3567
3568
ath_reg_notifier_apply(wiphy, request, &ar->ath_common.regulatory);
3569
3570
if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) {
3571
ath10k_dbg(ar, ATH10K_DBG_REGULATORY, "dfs region 0x%x\n",
3572
request->dfs_region);
3573
result = ar->dfs_detector->set_dfs_domain(ar->dfs_detector,
3574
request->dfs_region);
3575
if (!result)
3576
ath10k_warn(ar, "DFS region 0x%X not supported, will trigger radar for every pulse\n",
3577
request->dfs_region);
3578
}
3579
3580
mutex_lock(&ar->conf_mutex);
3581
if (ar->state == ATH10K_STATE_ON)
3582
ath10k_regd_update(ar);
3583
mutex_unlock(&ar->conf_mutex);
3584
3585
if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY)
3586
ath10k_mac_update_channel_list(ar,
3587
ar->hw->wiphy->bands[NL80211_BAND_5GHZ]);
3588
}
3589
3590
static void ath10k_stop_radar_confirmation(struct ath10k *ar)
3591
{
3592
spin_lock_bh(&ar->data_lock);
3593
ar->radar_conf_state = ATH10K_RADAR_CONFIRMATION_STOPPED;
3594
spin_unlock_bh(&ar->data_lock);
3595
3596
cancel_work_sync(&ar->radar_confirmation_work);
3597
}
3598
3599
/***************/
3600
/* TX handlers */
3601
/***************/
3602
3603
enum ath10k_mac_tx_path {
3604
ATH10K_MAC_TX_HTT,
3605
ATH10K_MAC_TX_HTT_MGMT,
3606
ATH10K_MAC_TX_WMI_MGMT,
3607
ATH10K_MAC_TX_UNKNOWN,
3608
};
3609
3610
void ath10k_mac_tx_lock(struct ath10k *ar, int reason)
3611
{
3612
lockdep_assert_held(&ar->htt.tx_lock);
3613
3614
WARN_ON(reason >= ATH10K_TX_PAUSE_MAX);
3615
ar->tx_paused |= BIT(reason);
3616
ieee80211_stop_queues(ar->hw);
3617
}
3618
3619
static void ath10k_mac_tx_unlock_iter(void *data, u8 *mac,
3620
struct ieee80211_vif *vif)
3621
{
3622
struct ath10k *ar = data;
3623
struct ath10k_vif *arvif = (void *)vif->drv_priv;
3624
3625
if (arvif->tx_paused)
3626
return;
3627
3628
ieee80211_wake_queue(ar->hw, arvif->vdev_id);
3629
}
3630
3631
void ath10k_mac_tx_unlock(struct ath10k *ar, int reason)
3632
{
3633
lockdep_assert_held(&ar->htt.tx_lock);
3634
3635
WARN_ON(reason >= ATH10K_TX_PAUSE_MAX);
3636
ar->tx_paused &= ~BIT(reason);
3637
3638
if (ar->tx_paused)
3639
return;
3640
3641
ieee80211_iterate_active_interfaces_atomic(ar->hw,
3642
ATH10K_ITER_RESUME_FLAGS,
3643
ath10k_mac_tx_unlock_iter,
3644
ar);
3645
3646
ieee80211_wake_queue(ar->hw, ar->hw->offchannel_tx_hw_queue);
3647
}
3648
3649
void ath10k_mac_vif_tx_lock(struct ath10k_vif *arvif, int reason)
3650
{
3651
struct ath10k *ar = arvif->ar;
3652
3653
lockdep_assert_held(&ar->htt.tx_lock);
3654
3655
WARN_ON(reason >= BITS_PER_LONG);
3656
arvif->tx_paused |= BIT(reason);
3657
ieee80211_stop_queue(ar->hw, arvif->vdev_id);
3658
}
3659
3660
void ath10k_mac_vif_tx_unlock(struct ath10k_vif *arvif, int reason)
3661
{
3662
struct ath10k *ar = arvif->ar;
3663
3664
lockdep_assert_held(&ar->htt.tx_lock);
3665
3666
WARN_ON(reason >= BITS_PER_LONG);
3667
arvif->tx_paused &= ~BIT(reason);
3668
3669
if (ar->tx_paused)
3670
return;
3671
3672
if (arvif->tx_paused)
3673
return;
3674
3675
ieee80211_wake_queue(ar->hw, arvif->vdev_id);
3676
}
3677
3678
static void ath10k_mac_vif_handle_tx_pause(struct ath10k_vif *arvif,
3679
enum wmi_tlv_tx_pause_id pause_id,
3680
enum wmi_tlv_tx_pause_action action)
3681
{
3682
struct ath10k *ar = arvif->ar;
3683
3684
lockdep_assert_held(&ar->htt.tx_lock);
3685
3686
switch (action) {
3687
case WMI_TLV_TX_PAUSE_ACTION_STOP:
3688
ath10k_mac_vif_tx_lock(arvif, pause_id);
3689
break;
3690
case WMI_TLV_TX_PAUSE_ACTION_WAKE:
3691
ath10k_mac_vif_tx_unlock(arvif, pause_id);
3692
break;
3693
default:
3694
ath10k_dbg(ar, ATH10K_DBG_BOOT,
3695
"received unknown tx pause action %d on vdev %i, ignoring\n",
3696
action, arvif->vdev_id);
3697
break;
3698
}
3699
}
3700
3701
struct ath10k_mac_tx_pause {
3702
u32 vdev_id;
3703
enum wmi_tlv_tx_pause_id pause_id;
3704
enum wmi_tlv_tx_pause_action action;
3705
};
3706
3707
static void ath10k_mac_handle_tx_pause_iter(void *data, u8 *mac,
3708
struct ieee80211_vif *vif)
3709
{
3710
struct ath10k_vif *arvif = (void *)vif->drv_priv;
3711
struct ath10k_mac_tx_pause *arg = data;
3712
3713
if (arvif->vdev_id != arg->vdev_id)
3714
return;
3715
3716
ath10k_mac_vif_handle_tx_pause(arvif, arg->pause_id, arg->action);
3717
}
3718
3719
void ath10k_mac_handle_tx_pause_vdev(struct ath10k *ar, u32 vdev_id,
3720
enum wmi_tlv_tx_pause_id pause_id,
3721
enum wmi_tlv_tx_pause_action action)
3722
{
3723
struct ath10k_mac_tx_pause arg = {
3724
.vdev_id = vdev_id,
3725
.pause_id = pause_id,
3726
.action = action,
3727
};
3728
3729
spin_lock_bh(&ar->htt.tx_lock);
3730
ieee80211_iterate_active_interfaces_atomic(ar->hw,
3731
ATH10K_ITER_RESUME_FLAGS,
3732
ath10k_mac_handle_tx_pause_iter,
3733
&arg);
3734
spin_unlock_bh(&ar->htt.tx_lock);
3735
}
3736
3737
static enum ath10k_hw_txrx_mode
3738
ath10k_mac_tx_h_get_txmode(struct ath10k *ar,
3739
struct ieee80211_vif *vif,
3740
struct ieee80211_sta *sta,
3741
struct sk_buff *skb)
3742
{
3743
const struct ieee80211_hdr *hdr = (void *)skb->data;
3744
const struct ath10k_skb_cb *skb_cb = ATH10K_SKB_CB(skb);
3745
__le16 fc = hdr->frame_control;
3746
3747
if (IEEE80211_SKB_CB(skb)->flags & IEEE80211_TX_CTL_HW_80211_ENCAP)
3748
return ATH10K_HW_TXRX_ETHERNET;
3749
3750
if (!vif || vif->type == NL80211_IFTYPE_MONITOR)
3751
return ATH10K_HW_TXRX_RAW;
3752
3753
if (ieee80211_is_mgmt(fc))
3754
return ATH10K_HW_TXRX_MGMT;
3755
3756
/* Workaround:
3757
*
3758
* NullFunc frames are mostly used to ping if a client or AP are still
3759
* reachable and responsive. This implies tx status reports must be
3760
* accurate - otherwise either mac80211 or userspace (e.g. hostapd) can
3761
* come to a conclusion that the other end disappeared and tear down
3762
* BSS connection or it can never disconnect from BSS/client (which is
3763
* the case).
3764
*
3765
* Firmware with HTT older than 3.0 delivers incorrect tx status for
3766
* NullFunc frames to driver. However there's a HTT Mgmt Tx command
3767
* which seems to deliver correct tx reports for NullFunc frames. The
3768
* downside of using it is it ignores client powersave state so it can
3769
* end up disconnecting sleeping clients in AP mode. It should fix STA
3770
* mode though because AP don't sleep.
3771
*/
3772
if (ar->htt.target_version_major < 3 &&
3773
(ieee80211_is_nullfunc(fc) || ieee80211_is_qos_nullfunc(fc)) &&
3774
!test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX,
3775
ar->running_fw->fw_file.fw_features))
3776
return ATH10K_HW_TXRX_MGMT;
3777
3778
/* Workaround:
3779
*
3780
* Some wmi-tlv firmwares for qca6174 have broken Tx key selection for
3781
* NativeWifi txmode - it selects AP key instead of peer key. It seems
3782
* to work with Ethernet txmode so use it.
3783
*
3784
* FIXME: Check if raw mode works with TDLS.
3785
*/
3786
if (ieee80211_is_data_present(fc) && sta && sta->tdls)
3787
return ATH10K_HW_TXRX_ETHERNET;
3788
3789
if (test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags) ||
3790
skb_cb->flags & ATH10K_SKB_F_RAW_TX)
3791
return ATH10K_HW_TXRX_RAW;
3792
3793
return ATH10K_HW_TXRX_NATIVE_WIFI;
3794
}
3795
3796
static bool ath10k_tx_h_use_hwcrypto(struct ieee80211_vif *vif,
3797
struct sk_buff *skb)
3798
{
3799
const struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
3800
const struct ieee80211_hdr *hdr = (void *)skb->data;
3801
const u32 mask = IEEE80211_TX_INTFL_DONT_ENCRYPT |
3802
IEEE80211_TX_CTL_INJECTED;
3803
3804
if (!ieee80211_has_protected(hdr->frame_control))
3805
return false;
3806
3807
if ((info->flags & mask) == mask)
3808
return false;
3809
3810
if (vif)
3811
return !((struct ath10k_vif *)vif->drv_priv)->nohwcrypt;
3812
3813
return true;
3814
}
3815
3816
/* HTT Tx uses Native Wifi tx mode which expects 802.11 frames without QoS
3817
* Control in the header.
3818
*/
3819
static void ath10k_tx_h_nwifi(struct ieee80211_hw *hw, struct sk_buff *skb)
3820
{
3821
struct ieee80211_hdr *hdr = (void *)skb->data;
3822
struct ath10k_skb_cb *cb = ATH10K_SKB_CB(skb);
3823
u8 *qos_ctl;
3824
3825
if (!ieee80211_is_data_qos(hdr->frame_control))
3826
return;
3827
3828
qos_ctl = ieee80211_get_qos_ctl(hdr);
3829
memmove(skb->data + IEEE80211_QOS_CTL_LEN,
3830
#if defined(__linux__)
3831
skb->data, (void *)qos_ctl - (void *)skb->data);
3832
#elif defined(__FreeBSD__)
3833
skb->data, qos_ctl - skb->data);
3834
#endif
3835
skb_pull(skb, IEEE80211_QOS_CTL_LEN);
3836
3837
/* Some firmware revisions don't handle sending QoS NullFunc well.
3838
* These frames are mainly used for CQM purposes so it doesn't really
3839
* matter whether QoS NullFunc or NullFunc are sent.
3840
*/
3841
hdr = (void *)skb->data;
3842
if (ieee80211_is_qos_nullfunc(hdr->frame_control))
3843
cb->flags &= ~ATH10K_SKB_F_QOS;
3844
3845
hdr->frame_control &= ~__cpu_to_le16(IEEE80211_STYPE_QOS_DATA);
3846
}
3847
3848
static void ath10k_tx_h_8023(struct sk_buff *skb)
3849
{
3850
struct ieee80211_hdr *hdr;
3851
struct rfc1042_hdr *rfc1042;
3852
struct ethhdr *eth;
3853
size_t hdrlen;
3854
u8 da[ETH_ALEN];
3855
u8 sa[ETH_ALEN];
3856
__be16 type;
3857
3858
hdr = (void *)skb->data;
3859
hdrlen = ieee80211_hdrlen(hdr->frame_control);
3860
#if defined(__linux__)
3861
rfc1042 = (void *)skb->data + hdrlen;
3862
#elif defined(__FreeBSD__)
3863
rfc1042 = (void *)(skb->data + hdrlen);
3864
#endif
3865
3866
ether_addr_copy(da, ieee80211_get_DA(hdr));
3867
ether_addr_copy(sa, ieee80211_get_SA(hdr));
3868
type = rfc1042->snap_type;
3869
3870
skb_pull(skb, hdrlen + sizeof(*rfc1042));
3871
skb_push(skb, sizeof(*eth));
3872
3873
eth = (void *)skb->data;
3874
ether_addr_copy(eth->h_dest, da);
3875
ether_addr_copy(eth->h_source, sa);
3876
eth->h_proto = type;
3877
}
3878
3879
static void ath10k_tx_h_add_p2p_noa_ie(struct ath10k *ar,
3880
struct ieee80211_vif *vif,
3881
struct sk_buff *skb)
3882
{
3883
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
3884
struct ath10k_vif *arvif = (void *)vif->drv_priv;
3885
3886
/* This is case only for P2P_GO */
3887
if (vif->type != NL80211_IFTYPE_AP || !vif->p2p)
3888
return;
3889
3890
if (unlikely(ieee80211_is_probe_resp(hdr->frame_control))) {
3891
spin_lock_bh(&ar->data_lock);
3892
if (arvif->u.ap.noa_data)
3893
if (!pskb_expand_head(skb, 0, arvif->u.ap.noa_len,
3894
GFP_ATOMIC))
3895
skb_put_data(skb, arvif->u.ap.noa_data,
3896
arvif->u.ap.noa_len);
3897
spin_unlock_bh(&ar->data_lock);
3898
}
3899
}
3900
3901
static void ath10k_mac_tx_h_fill_cb(struct ath10k *ar,
3902
struct ieee80211_vif *vif,
3903
struct ieee80211_txq *txq,
3904
struct ieee80211_sta *sta,
3905
struct sk_buff *skb, u16 airtime)
3906
{
3907
struct ieee80211_hdr *hdr = (void *)skb->data;
3908
struct ath10k_skb_cb *cb = ATH10K_SKB_CB(skb);
3909
const struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
3910
bool is_data = ieee80211_is_data(hdr->frame_control) ||
3911
ieee80211_is_data_qos(hdr->frame_control);
3912
struct ath10k_vif *arvif = (void *)vif->drv_priv;
3913
struct ath10k_sta *arsta;
3914
u8 tid, *qos_ctl;
3915
bool noack = false;
3916
3917
cb->flags = 0;
3918
3919
if (info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP) {
3920
cb->flags |= ATH10K_SKB_F_QOS; /* Assume data frames are QoS */
3921
goto finish_cb_fill;
3922
}
3923
3924
if (!ath10k_tx_h_use_hwcrypto(vif, skb))
3925
cb->flags |= ATH10K_SKB_F_NO_HWCRYPT;
3926
3927
if (ieee80211_is_mgmt(hdr->frame_control))
3928
cb->flags |= ATH10K_SKB_F_MGMT;
3929
3930
if (ieee80211_is_data_qos(hdr->frame_control)) {
3931
cb->flags |= ATH10K_SKB_F_QOS;
3932
qos_ctl = ieee80211_get_qos_ctl(hdr);
3933
tid = (*qos_ctl) & IEEE80211_QOS_CTL_TID_MASK;
3934
3935
if (arvif->noack[tid] == WMI_PEER_TID_CONFIG_NOACK)
3936
noack = true;
3937
3938
if (sta) {
3939
arsta = (struct ath10k_sta *)sta->drv_priv;
3940
3941
if (arsta->noack[tid] == WMI_PEER_TID_CONFIG_NOACK)
3942
noack = true;
3943
3944
if (arsta->noack[tid] == WMI_PEER_TID_CONFIG_ACK)
3945
noack = false;
3946
}
3947
3948
if (noack)
3949
cb->flags |= ATH10K_SKB_F_NOACK_TID;
3950
}
3951
3952
/* Data frames encrypted in software will be posted to firmware
3953
* with tx encap mode set to RAW. Ex: Multicast traffic generated
3954
* for a specific VLAN group will always be encrypted in software.
3955
*/
3956
if (is_data && ieee80211_has_protected(hdr->frame_control) &&
3957
!info->control.hw_key) {
3958
cb->flags |= ATH10K_SKB_F_NO_HWCRYPT;
3959
cb->flags |= ATH10K_SKB_F_RAW_TX;
3960
}
3961
3962
finish_cb_fill:
3963
cb->vif = vif;
3964
cb->txq = txq;
3965
cb->airtime_est = airtime;
3966
if (sta) {
3967
arsta = (struct ath10k_sta *)sta->drv_priv;
3968
spin_lock_bh(&ar->data_lock);
3969
cb->ucast_cipher = arsta->ucast_cipher;
3970
spin_unlock_bh(&ar->data_lock);
3971
}
3972
}
3973
3974
bool ath10k_mac_tx_frm_has_freq(struct ath10k *ar)
3975
{
3976
/* FIXME: Not really sure since when the behaviour changed. At some
3977
* point new firmware stopped requiring creation of peer entries for
3978
* offchannel tx (and actually creating them causes issues with wmi-htc
3979
* tx credit replenishment and reliability). Assuming it's at least 3.4
3980
* because that's when the `freq` was introduced to TX_FRM HTT command.
3981
*/
3982
return (ar->htt.target_version_major >= 3 &&
3983
ar->htt.target_version_minor >= 4 &&
3984
ar->running_fw->fw_file.htt_op_version == ATH10K_FW_HTT_OP_VERSION_TLV);
3985
}
3986
3987
static int ath10k_mac_tx_wmi_mgmt(struct ath10k *ar, struct sk_buff *skb)
3988
{
3989
struct sk_buff_head *q = &ar->wmi_mgmt_tx_queue;
3990
3991
if (skb_queue_len_lockless(q) >= ATH10K_MAX_NUM_MGMT_PENDING) {
3992
ath10k_warn(ar, "wmi mgmt tx queue is full\n");
3993
return -ENOSPC;
3994
}
3995
3996
skb_queue_tail(q, skb);
3997
ieee80211_queue_work(ar->hw, &ar->wmi_mgmt_tx_work);
3998
3999
return 0;
4000
}
4001
4002
static enum ath10k_mac_tx_path
4003
ath10k_mac_tx_h_get_txpath(struct ath10k *ar,
4004
struct sk_buff *skb,
4005
enum ath10k_hw_txrx_mode txmode)
4006
{
4007
switch (txmode) {
4008
case ATH10K_HW_TXRX_RAW:
4009
case ATH10K_HW_TXRX_NATIVE_WIFI:
4010
case ATH10K_HW_TXRX_ETHERNET:
4011
return ATH10K_MAC_TX_HTT;
4012
case ATH10K_HW_TXRX_MGMT:
4013
if (test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX,
4014
ar->running_fw->fw_file.fw_features) ||
4015
test_bit(WMI_SERVICE_MGMT_TX_WMI,
4016
ar->wmi.svc_map))
4017
return ATH10K_MAC_TX_WMI_MGMT;
4018
else if (ar->htt.target_version_major >= 3)
4019
return ATH10K_MAC_TX_HTT;
4020
else
4021
return ATH10K_MAC_TX_HTT_MGMT;
4022
}
4023
4024
return ATH10K_MAC_TX_UNKNOWN;
4025
}
4026
4027
static int ath10k_mac_tx_submit(struct ath10k *ar,
4028
enum ath10k_hw_txrx_mode txmode,
4029
enum ath10k_mac_tx_path txpath,
4030
struct sk_buff *skb)
4031
{
4032
struct ath10k_htt *htt = &ar->htt;
4033
int ret = -EINVAL;
4034
4035
switch (txpath) {
4036
case ATH10K_MAC_TX_HTT:
4037
ret = ath10k_htt_tx(htt, txmode, skb);
4038
break;
4039
case ATH10K_MAC_TX_HTT_MGMT:
4040
ret = ath10k_htt_mgmt_tx(htt, skb);
4041
break;
4042
case ATH10K_MAC_TX_WMI_MGMT:
4043
ret = ath10k_mac_tx_wmi_mgmt(ar, skb);
4044
break;
4045
case ATH10K_MAC_TX_UNKNOWN:
4046
WARN_ON_ONCE(1);
4047
ret = -EINVAL;
4048
break;
4049
}
4050
4051
if (ret) {
4052
ath10k_warn(ar, "failed to transmit packet, dropping: %d\n",
4053
ret);
4054
ieee80211_free_txskb(ar->hw, skb);
4055
}
4056
4057
return ret;
4058
}
4059
4060
/* This function consumes the sk_buff regardless of return value as far as
4061
* caller is concerned so no freeing is necessary afterwards.
4062
*/
4063
static int ath10k_mac_tx(struct ath10k *ar,
4064
struct ieee80211_vif *vif,
4065
enum ath10k_hw_txrx_mode txmode,
4066
enum ath10k_mac_tx_path txpath,
4067
struct sk_buff *skb, bool noque_offchan)
4068
{
4069
struct ieee80211_hw *hw = ar->hw;
4070
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
4071
const struct ath10k_skb_cb *skb_cb = ATH10K_SKB_CB(skb);
4072
int ret;
4073
4074
/* We should disable CCK RATE due to P2P */
4075
if (info->flags & IEEE80211_TX_CTL_NO_CCK_RATE)
4076
ath10k_dbg(ar, ATH10K_DBG_MAC, "IEEE80211_TX_CTL_NO_CCK_RATE\n");
4077
4078
switch (txmode) {
4079
case ATH10K_HW_TXRX_MGMT:
4080
case ATH10K_HW_TXRX_NATIVE_WIFI:
4081
ath10k_tx_h_nwifi(hw, skb);
4082
ath10k_tx_h_add_p2p_noa_ie(ar, vif, skb);
4083
ath10k_tx_h_seq_no(vif, skb);
4084
break;
4085
case ATH10K_HW_TXRX_ETHERNET:
4086
/* Convert 802.11->802.3 header only if the frame was earlier
4087
* encapsulated to 802.11 by mac80211. Otherwise pass it as is.
4088
*/
4089
if (!(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP))
4090
ath10k_tx_h_8023(skb);
4091
break;
4092
case ATH10K_HW_TXRX_RAW:
4093
if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags) &&
4094
!(skb_cb->flags & ATH10K_SKB_F_RAW_TX)) {
4095
WARN_ON_ONCE(1);
4096
ieee80211_free_txskb(hw, skb);
4097
return -EOPNOTSUPP;
4098
}
4099
}
4100
4101
if (!noque_offchan && info->flags & IEEE80211_TX_CTL_TX_OFFCHAN) {
4102
if (!ath10k_mac_tx_frm_has_freq(ar)) {
4103
ath10k_dbg(ar, ATH10K_DBG_MAC, "mac queued offchannel skb %p len %d\n",
4104
skb, skb->len);
4105
4106
skb_queue_tail(&ar->offchan_tx_queue, skb);
4107
ieee80211_queue_work(hw, &ar->offchan_tx_work);
4108
return 0;
4109
}
4110
}
4111
4112
ret = ath10k_mac_tx_submit(ar, txmode, txpath, skb);
4113
if (ret) {
4114
ath10k_warn(ar, "failed to submit frame: %d\n", ret);
4115
return ret;
4116
}
4117
4118
return 0;
4119
}
4120
4121
void ath10k_offchan_tx_purge(struct ath10k *ar)
4122
{
4123
struct sk_buff *skb;
4124
4125
for (;;) {
4126
skb = skb_dequeue(&ar->offchan_tx_queue);
4127
if (!skb)
4128
break;
4129
4130
ieee80211_free_txskb(ar->hw, skb);
4131
}
4132
}
4133
4134
void ath10k_offchan_tx_work(struct work_struct *work)
4135
{
4136
struct ath10k *ar = container_of(work, struct ath10k, offchan_tx_work);
4137
struct ath10k_peer *peer;
4138
struct ath10k_vif *arvif;
4139
enum ath10k_hw_txrx_mode txmode;
4140
enum ath10k_mac_tx_path txpath;
4141
struct ieee80211_hdr *hdr;
4142
struct ieee80211_vif *vif;
4143
struct ieee80211_sta *sta;
4144
struct sk_buff *skb;
4145
const u8 *peer_addr;
4146
int vdev_id;
4147
int ret;
4148
unsigned long time_left;
4149
bool tmp_peer_created = false;
4150
4151
/* FW requirement: We must create a peer before FW will send out
4152
* an offchannel frame. Otherwise the frame will be stuck and
4153
* never transmitted. We delete the peer upon tx completion.
4154
* It is unlikely that a peer for offchannel tx will already be
4155
* present. However it may be in some rare cases so account for that.
4156
* Otherwise we might remove a legitimate peer and break stuff.
4157
*/
4158
4159
for (;;) {
4160
skb = skb_dequeue(&ar->offchan_tx_queue);
4161
if (!skb)
4162
break;
4163
4164
mutex_lock(&ar->conf_mutex);
4165
4166
ath10k_dbg(ar, ATH10K_DBG_MAC, "mac offchannel skb %p len %d\n",
4167
skb, skb->len);
4168
4169
hdr = (struct ieee80211_hdr *)skb->data;
4170
peer_addr = ieee80211_get_DA(hdr);
4171
4172
spin_lock_bh(&ar->data_lock);
4173
vdev_id = ar->scan.vdev_id;
4174
peer = ath10k_peer_find(ar, vdev_id, peer_addr);
4175
spin_unlock_bh(&ar->data_lock);
4176
4177
if (peer) {
4178
ath10k_warn(ar, "peer %pM on vdev %d already present\n",
4179
peer_addr, vdev_id);
4180
} else {
4181
ret = ath10k_peer_create(ar, NULL, NULL, vdev_id,
4182
peer_addr,
4183
WMI_PEER_TYPE_DEFAULT);
4184
if (ret)
4185
ath10k_warn(ar, "failed to create peer %pM on vdev %d: %d\n",
4186
peer_addr, vdev_id, ret);
4187
tmp_peer_created = (ret == 0);
4188
}
4189
4190
spin_lock_bh(&ar->data_lock);
4191
reinit_completion(&ar->offchan_tx_completed);
4192
ar->offchan_tx_skb = skb;
4193
spin_unlock_bh(&ar->data_lock);
4194
4195
/* It's safe to access vif and sta - conf_mutex guarantees that
4196
* sta_state() and remove_interface() are locked exclusively
4197
* out wrt to this offchannel worker.
4198
*/
4199
arvif = ath10k_get_arvif(ar, vdev_id);
4200
if (arvif) {
4201
vif = arvif->vif;
4202
sta = ieee80211_find_sta(vif, peer_addr);
4203
} else {
4204
vif = NULL;
4205
sta = NULL;
4206
}
4207
4208
txmode = ath10k_mac_tx_h_get_txmode(ar, vif, sta, skb);
4209
txpath = ath10k_mac_tx_h_get_txpath(ar, skb, txmode);
4210
4211
ret = ath10k_mac_tx(ar, vif, txmode, txpath, skb, true);
4212
if (ret) {
4213
ath10k_warn(ar, "failed to transmit offchannel frame: %d\n",
4214
ret);
4215
/* not serious */
4216
}
4217
4218
time_left =
4219
wait_for_completion_timeout(&ar->offchan_tx_completed, 3 * HZ);
4220
if (time_left == 0)
4221
ath10k_warn(ar, "timed out waiting for offchannel skb %p, len: %d\n",
4222
skb, skb->len);
4223
4224
if (!peer && tmp_peer_created) {
4225
ret = ath10k_peer_delete(ar, vdev_id, peer_addr);
4226
if (ret)
4227
ath10k_warn(ar, "failed to delete peer %pM on vdev %d: %d\n",
4228
peer_addr, vdev_id, ret);
4229
}
4230
4231
mutex_unlock(&ar->conf_mutex);
4232
}
4233
}
4234
4235
void ath10k_mgmt_over_wmi_tx_purge(struct ath10k *ar)
4236
{
4237
struct sk_buff *skb;
4238
4239
for (;;) {
4240
skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
4241
if (!skb)
4242
break;
4243
4244
ieee80211_free_txskb(ar->hw, skb);
4245
}
4246
}
4247
4248
void ath10k_mgmt_over_wmi_tx_work(struct work_struct *work)
4249
{
4250
struct ath10k *ar = container_of(work, struct ath10k, wmi_mgmt_tx_work);
4251
struct sk_buff *skb;
4252
dma_addr_t paddr;
4253
int ret;
4254
4255
for (;;) {
4256
skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
4257
if (!skb)
4258
break;
4259
4260
if (test_bit(ATH10K_FW_FEATURE_MGMT_TX_BY_REF,
4261
ar->running_fw->fw_file.fw_features)) {
4262
paddr = dma_map_single(ar->dev, skb->data,
4263
skb->len, DMA_TO_DEVICE);
4264
if (dma_mapping_error(ar->dev, paddr)) {
4265
ieee80211_free_txskb(ar->hw, skb);
4266
continue;
4267
}
4268
ret = ath10k_wmi_mgmt_tx_send(ar, skb, paddr);
4269
if (ret) {
4270
ath10k_warn(ar, "failed to transmit management frame by ref via WMI: %d\n",
4271
ret);
4272
/* remove this msdu from idr tracking */
4273
ath10k_wmi_cleanup_mgmt_tx_send(ar, skb);
4274
4275
dma_unmap_single(ar->dev, paddr, skb->len,
4276
DMA_TO_DEVICE);
4277
ieee80211_free_txskb(ar->hw, skb);
4278
}
4279
} else {
4280
ret = ath10k_wmi_mgmt_tx(ar, skb);
4281
if (ret) {
4282
ath10k_warn(ar, "failed to transmit management frame via WMI: %d\n",
4283
ret);
4284
ieee80211_free_txskb(ar->hw, skb);
4285
}
4286
}
4287
}
4288
}
4289
4290
static void ath10k_mac_txq_init(struct ieee80211_txq *txq)
4291
{
4292
struct ath10k_txq *artxq;
4293
4294
if (!txq)
4295
return;
4296
4297
artxq = (void *)txq->drv_priv;
4298
INIT_LIST_HEAD(&artxq->list);
4299
}
4300
4301
static void ath10k_mac_txq_unref(struct ath10k *ar, struct ieee80211_txq *txq)
4302
{
4303
struct ath10k_skb_cb *cb;
4304
struct sk_buff *msdu;
4305
int msdu_id;
4306
4307
if (!txq)
4308
return;
4309
4310
spin_lock_bh(&ar->htt.tx_lock);
4311
idr_for_each_entry(&ar->htt.pending_tx, msdu, msdu_id) {
4312
cb = ATH10K_SKB_CB(msdu);
4313
if (cb->txq == txq)
4314
cb->txq = NULL;
4315
}
4316
spin_unlock_bh(&ar->htt.tx_lock);
4317
}
4318
4319
struct ieee80211_txq *ath10k_mac_txq_lookup(struct ath10k *ar,
4320
u16 peer_id,
4321
u8 tid)
4322
{
4323
struct ath10k_peer *peer;
4324
4325
lockdep_assert_held(&ar->data_lock);
4326
4327
peer = ar->peer_map[peer_id];
4328
if (!peer)
4329
return NULL;
4330
4331
if (peer->removed)
4332
return NULL;
4333
4334
if (peer->sta)
4335
return peer->sta->txq[tid];
4336
else if (peer->vif)
4337
return peer->vif->txq;
4338
else
4339
return NULL;
4340
}
4341
4342
static bool ath10k_mac_tx_can_push(struct ieee80211_hw *hw,
4343
struct ieee80211_txq *txq)
4344
{
4345
struct ath10k *ar = hw->priv;
4346
struct ath10k_txq *artxq = (void *)txq->drv_priv;
4347
4348
/* No need to get locks */
4349
if (ar->htt.tx_q_state.mode == HTT_TX_MODE_SWITCH_PUSH)
4350
return true;
4351
4352
if (ar->htt.num_pending_tx < ar->htt.tx_q_state.num_push_allowed)
4353
return true;
4354
4355
if (artxq->num_fw_queued < artxq->num_push_allowed)
4356
return true;
4357
4358
return false;
4359
}
4360
4361
/* Return estimated airtime in microsecond, which is calculated using last
4362
* reported TX rate. This is just a rough estimation because host driver has no
4363
* knowledge of the actual transmit rate, retries or aggregation. If actual
4364
* airtime can be reported by firmware, then delta between estimated and actual
4365
* airtime can be adjusted from deficit.
4366
*/
4367
#define IEEE80211_ATF_OVERHEAD 100 /* IFS + some slot time */
4368
#define IEEE80211_ATF_OVERHEAD_IFS 16 /* IFS only */
4369
static u16 ath10k_mac_update_airtime(struct ath10k *ar,
4370
struct ieee80211_txq *txq,
4371
struct sk_buff *skb)
4372
{
4373
struct ath10k_sta *arsta;
4374
u32 pktlen;
4375
u16 airtime = 0;
4376
4377
if (!txq || !txq->sta)
4378
return airtime;
4379
4380
if (test_bit(WMI_SERVICE_REPORT_AIRTIME, ar->wmi.svc_map))
4381
return airtime;
4382
4383
spin_lock_bh(&ar->data_lock);
4384
arsta = (struct ath10k_sta *)txq->sta->drv_priv;
4385
4386
pktlen = skb->len + 38; /* Assume MAC header 30, SNAP 8 for most case */
4387
if (arsta->last_tx_bitrate) {
4388
/* airtime in us, last_tx_bitrate in 100kbps */
4389
airtime = (pktlen * 8 * (1000 / 100))
4390
/ arsta->last_tx_bitrate;
4391
/* overhead for media access time and IFS */
4392
airtime += IEEE80211_ATF_OVERHEAD_IFS;
4393
} else {
4394
/* This is mostly for throttle excessive BC/MC frames, and the
4395
* airtime/rate doesn't need be exact. Airtime of BC/MC frames
4396
* in 2G get some discount, which helps prevent very low rate
4397
* frames from being blocked for too long.
4398
*/
4399
airtime = (pktlen * 8 * (1000 / 100)) / 60; /* 6M */
4400
airtime += IEEE80211_ATF_OVERHEAD;
4401
}
4402
spin_unlock_bh(&ar->data_lock);
4403
4404
return airtime;
4405
}
4406
4407
int ath10k_mac_tx_push_txq(struct ieee80211_hw *hw,
4408
struct ieee80211_txq *txq)
4409
{
4410
struct ath10k *ar = hw->priv;
4411
struct ath10k_htt *htt = &ar->htt;
4412
struct ath10k_txq *artxq = (void *)txq->drv_priv;
4413
struct ieee80211_vif *vif = txq->vif;
4414
struct ieee80211_sta *sta = txq->sta;
4415
enum ath10k_hw_txrx_mode txmode;
4416
enum ath10k_mac_tx_path txpath;
4417
struct sk_buff *skb;
4418
struct ieee80211_hdr *hdr;
4419
size_t skb_len;
4420
bool is_mgmt, is_presp;
4421
int ret;
4422
u16 airtime;
4423
4424
spin_lock_bh(&ar->htt.tx_lock);
4425
ret = ath10k_htt_tx_inc_pending(htt);
4426
spin_unlock_bh(&ar->htt.tx_lock);
4427
4428
if (ret)
4429
return ret;
4430
4431
skb = ieee80211_tx_dequeue_ni(hw, txq);
4432
if (!skb) {
4433
spin_lock_bh(&ar->htt.tx_lock);
4434
ath10k_htt_tx_dec_pending(htt);
4435
spin_unlock_bh(&ar->htt.tx_lock);
4436
4437
return -ENOENT;
4438
}
4439
4440
airtime = ath10k_mac_update_airtime(ar, txq, skb);
4441
ath10k_mac_tx_h_fill_cb(ar, vif, txq, sta, skb, airtime);
4442
4443
skb_len = skb->len;
4444
txmode = ath10k_mac_tx_h_get_txmode(ar, vif, sta, skb);
4445
txpath = ath10k_mac_tx_h_get_txpath(ar, skb, txmode);
4446
is_mgmt = (txpath == ATH10K_MAC_TX_HTT_MGMT);
4447
4448
if (is_mgmt) {
4449
hdr = (struct ieee80211_hdr *)skb->data;
4450
is_presp = ieee80211_is_probe_resp(hdr->frame_control);
4451
4452
spin_lock_bh(&ar->htt.tx_lock);
4453
ret = ath10k_htt_tx_mgmt_inc_pending(htt, is_mgmt, is_presp);
4454
4455
if (ret) {
4456
ath10k_htt_tx_dec_pending(htt);
4457
spin_unlock_bh(&ar->htt.tx_lock);
4458
return ret;
4459
}
4460
spin_unlock_bh(&ar->htt.tx_lock);
4461
}
4462
4463
ret = ath10k_mac_tx(ar, vif, txmode, txpath, skb, false);
4464
if (unlikely(ret)) {
4465
ath10k_warn(ar, "failed to push frame: %d\n", ret);
4466
4467
spin_lock_bh(&ar->htt.tx_lock);
4468
ath10k_htt_tx_dec_pending(htt);
4469
if (is_mgmt)
4470
ath10k_htt_tx_mgmt_dec_pending(htt);
4471
spin_unlock_bh(&ar->htt.tx_lock);
4472
4473
return ret;
4474
}
4475
4476
spin_lock_bh(&ar->htt.tx_lock);
4477
artxq->num_fw_queued++;
4478
spin_unlock_bh(&ar->htt.tx_lock);
4479
4480
return skb_len;
4481
}
4482
4483
static int ath10k_mac_schedule_txq(struct ieee80211_hw *hw, u32 ac)
4484
{
4485
struct ieee80211_txq *txq;
4486
int ret = 0;
4487
4488
ieee80211_txq_schedule_start(hw, ac);
4489
while ((txq = ieee80211_next_txq(hw, ac))) {
4490
while (ath10k_mac_tx_can_push(hw, txq)) {
4491
ret = ath10k_mac_tx_push_txq(hw, txq);
4492
if (ret < 0)
4493
break;
4494
}
4495
ieee80211_return_txq(hw, txq, false);
4496
ath10k_htt_tx_txq_update(hw, txq);
4497
if (ret == -EBUSY)
4498
break;
4499
}
4500
ieee80211_txq_schedule_end(hw, ac);
4501
4502
return ret;
4503
}
4504
4505
void ath10k_mac_tx_push_pending(struct ath10k *ar)
4506
{
4507
struct ieee80211_hw *hw = ar->hw;
4508
u32 ac;
4509
4510
if (ar->htt.tx_q_state.mode != HTT_TX_MODE_SWITCH_PUSH)
4511
return;
4512
4513
if (ar->htt.num_pending_tx >= (ar->htt.max_num_pending_tx / 2))
4514
return;
4515
4516
rcu_read_lock();
4517
for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
4518
if (ath10k_mac_schedule_txq(hw, ac) == -EBUSY)
4519
break;
4520
}
4521
rcu_read_unlock();
4522
}
4523
EXPORT_SYMBOL(ath10k_mac_tx_push_pending);
4524
4525
/************/
4526
/* Scanning */
4527
/************/
4528
4529
void __ath10k_scan_finish(struct ath10k *ar)
4530
{
4531
lockdep_assert_held(&ar->data_lock);
4532
4533
switch (ar->scan.state) {
4534
case ATH10K_SCAN_IDLE:
4535
break;
4536
case ATH10K_SCAN_RUNNING:
4537
case ATH10K_SCAN_ABORTING:
4538
if (ar->scan.is_roc && ar->scan.roc_notify)
4539
ieee80211_remain_on_channel_expired(ar->hw);
4540
fallthrough;
4541
case ATH10K_SCAN_STARTING:
4542
if (!ar->scan.is_roc) {
4543
struct cfg80211_scan_info info = {
4544
.aborted = ((ar->scan.state ==
4545
ATH10K_SCAN_ABORTING) ||
4546
(ar->scan.state ==
4547
ATH10K_SCAN_STARTING)),
4548
};
4549
4550
ieee80211_scan_completed(ar->hw, &info);
4551
}
4552
4553
ar->scan.state = ATH10K_SCAN_IDLE;
4554
ar->scan_channel = NULL;
4555
ar->scan.roc_freq = 0;
4556
ath10k_offchan_tx_purge(ar);
4557
cancel_delayed_work(&ar->scan.timeout);
4558
complete(&ar->scan.completed);
4559
break;
4560
}
4561
}
4562
4563
void ath10k_scan_finish(struct ath10k *ar)
4564
{
4565
spin_lock_bh(&ar->data_lock);
4566
__ath10k_scan_finish(ar);
4567
spin_unlock_bh(&ar->data_lock);
4568
}
4569
4570
static int ath10k_scan_stop(struct ath10k *ar)
4571
{
4572
struct wmi_stop_scan_arg arg = {
4573
.req_id = 1, /* FIXME */
4574
.req_type = WMI_SCAN_STOP_ONE,
4575
.u.scan_id = ATH10K_SCAN_ID,
4576
};
4577
int ret;
4578
4579
lockdep_assert_held(&ar->conf_mutex);
4580
4581
ret = ath10k_wmi_stop_scan(ar, &arg);
4582
if (ret) {
4583
ath10k_warn(ar, "failed to stop wmi scan: %d\n", ret);
4584
goto out;
4585
}
4586
4587
ret = wait_for_completion_timeout(&ar->scan.completed, 3 * HZ);
4588
if (ret == 0) {
4589
ath10k_warn(ar, "failed to receive scan abortion completion: timed out\n");
4590
ret = -ETIMEDOUT;
4591
} else if (ret > 0) {
4592
ret = 0;
4593
}
4594
4595
out:
4596
/* Scan state should be updated upon scan completion but in case
4597
* firmware fails to deliver the event (for whatever reason) it is
4598
* desired to clean up scan state anyway. Firmware may have just
4599
* dropped the scan completion event delivery due to transport pipe
4600
* being overflown with data and/or it can recover on its own before
4601
* next scan request is submitted.
4602
*/
4603
spin_lock_bh(&ar->data_lock);
4604
if (ar->scan.state != ATH10K_SCAN_IDLE)
4605
__ath10k_scan_finish(ar);
4606
spin_unlock_bh(&ar->data_lock);
4607
4608
return ret;
4609
}
4610
4611
static void ath10k_scan_abort(struct ath10k *ar)
4612
{
4613
int ret;
4614
4615
lockdep_assert_held(&ar->conf_mutex);
4616
4617
spin_lock_bh(&ar->data_lock);
4618
4619
switch (ar->scan.state) {
4620
case ATH10K_SCAN_IDLE:
4621
/* This can happen if timeout worker kicked in and called
4622
* abortion while scan completion was being processed.
4623
*/
4624
break;
4625
case ATH10K_SCAN_STARTING:
4626
case ATH10K_SCAN_ABORTING:
4627
ath10k_warn(ar, "refusing scan abortion due to invalid scan state: %s (%d)\n",
4628
ath10k_scan_state_str(ar->scan.state),
4629
ar->scan.state);
4630
break;
4631
case ATH10K_SCAN_RUNNING:
4632
ar->scan.state = ATH10K_SCAN_ABORTING;
4633
spin_unlock_bh(&ar->data_lock);
4634
4635
ret = ath10k_scan_stop(ar);
4636
if (ret)
4637
ath10k_warn(ar, "failed to abort scan: %d\n", ret);
4638
4639
spin_lock_bh(&ar->data_lock);
4640
break;
4641
}
4642
4643
spin_unlock_bh(&ar->data_lock);
4644
}
4645
4646
void ath10k_scan_timeout_work(struct work_struct *work)
4647
{
4648
struct ath10k *ar = container_of(work, struct ath10k,
4649
scan.timeout.work);
4650
4651
mutex_lock(&ar->conf_mutex);
4652
ath10k_scan_abort(ar);
4653
mutex_unlock(&ar->conf_mutex);
4654
}
4655
4656
static int ath10k_start_scan(struct ath10k *ar,
4657
const struct wmi_start_scan_arg *arg)
4658
{
4659
int ret;
4660
4661
lockdep_assert_held(&ar->conf_mutex);
4662
4663
ret = ath10k_wmi_start_scan(ar, arg);
4664
if (ret)
4665
return ret;
4666
4667
ret = wait_for_completion_timeout(&ar->scan.started, 1 * HZ);
4668
if (ret == 0) {
4669
ret = ath10k_scan_stop(ar);
4670
if (ret)
4671
ath10k_warn(ar, "failed to stop scan: %d\n", ret);
4672
4673
return -ETIMEDOUT;
4674
}
4675
4676
/* If we failed to start the scan, return error code at
4677
* this point. This is probably due to some issue in the
4678
* firmware, but no need to wedge the driver due to that...
4679
*/
4680
spin_lock_bh(&ar->data_lock);
4681
if (ar->scan.state == ATH10K_SCAN_IDLE) {
4682
spin_unlock_bh(&ar->data_lock);
4683
return -EINVAL;
4684
}
4685
spin_unlock_bh(&ar->data_lock);
4686
4687
return 0;
4688
}
4689
4690
/**********************/
4691
/* mac80211 callbacks */
4692
/**********************/
4693
4694
static void ath10k_mac_op_tx(struct ieee80211_hw *hw,
4695
struct ieee80211_tx_control *control,
4696
struct sk_buff *skb)
4697
{
4698
struct ath10k *ar = hw->priv;
4699
struct ath10k_htt *htt = &ar->htt;
4700
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
4701
struct ieee80211_vif *vif = info->control.vif;
4702
struct ieee80211_sta *sta = control->sta;
4703
struct ieee80211_txq *txq = NULL;
4704
enum ath10k_hw_txrx_mode txmode;
4705
enum ath10k_mac_tx_path txpath;
4706
bool is_htt;
4707
bool is_mgmt;
4708
int ret;
4709
u16 airtime;
4710
4711
airtime = ath10k_mac_update_airtime(ar, txq, skb);
4712
ath10k_mac_tx_h_fill_cb(ar, vif, txq, sta, skb, airtime);
4713
4714
txmode = ath10k_mac_tx_h_get_txmode(ar, vif, sta, skb);
4715
txpath = ath10k_mac_tx_h_get_txpath(ar, skb, txmode);
4716
is_htt = (txpath == ATH10K_MAC_TX_HTT ||
4717
txpath == ATH10K_MAC_TX_HTT_MGMT);
4718
is_mgmt = (txpath == ATH10K_MAC_TX_HTT_MGMT);
4719
4720
if (is_htt) {
4721
bool is_presp = false;
4722
4723
spin_lock_bh(&ar->htt.tx_lock);
4724
if (!(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP)) {
4725
struct ieee80211_hdr *hdr = (void *)skb->data;
4726
4727
is_presp = ieee80211_is_probe_resp(hdr->frame_control);
4728
}
4729
4730
ret = ath10k_htt_tx_inc_pending(htt);
4731
if (ret) {
4732
ath10k_warn(ar, "failed to increase tx pending count: %d, dropping\n",
4733
ret);
4734
spin_unlock_bh(&ar->htt.tx_lock);
4735
ieee80211_free_txskb(ar->hw, skb);
4736
return;
4737
}
4738
4739
ret = ath10k_htt_tx_mgmt_inc_pending(htt, is_mgmt, is_presp);
4740
if (ret) {
4741
ath10k_dbg(ar, ATH10K_DBG_MAC, "failed to increase tx mgmt pending count: %d, dropping\n",
4742
ret);
4743
ath10k_htt_tx_dec_pending(htt);
4744
spin_unlock_bh(&ar->htt.tx_lock);
4745
ieee80211_free_txskb(ar->hw, skb);
4746
return;
4747
}
4748
spin_unlock_bh(&ar->htt.tx_lock);
4749
}
4750
4751
ret = ath10k_mac_tx(ar, vif, txmode, txpath, skb, false);
4752
if (ret) {
4753
ath10k_warn(ar, "failed to transmit frame: %d\n", ret);
4754
if (is_htt) {
4755
spin_lock_bh(&ar->htt.tx_lock);
4756
ath10k_htt_tx_dec_pending(htt);
4757
if (is_mgmt)
4758
ath10k_htt_tx_mgmt_dec_pending(htt);
4759
spin_unlock_bh(&ar->htt.tx_lock);
4760
}
4761
return;
4762
}
4763
}
4764
4765
static void ath10k_mac_op_wake_tx_queue(struct ieee80211_hw *hw,
4766
struct ieee80211_txq *txq)
4767
{
4768
struct ath10k *ar = hw->priv;
4769
int ret;
4770
u8 ac = txq->ac;
4771
4772
ath10k_htt_tx_txq_update(hw, txq);
4773
if (ar->htt.tx_q_state.mode != HTT_TX_MODE_SWITCH_PUSH)
4774
return;
4775
4776
spin_lock_bh(&ar->queue_lock[ac]);
4777
4778
ieee80211_txq_schedule_start(hw, ac);
4779
txq = ieee80211_next_txq(hw, ac);
4780
if (!txq)
4781
goto out;
4782
4783
while (ath10k_mac_tx_can_push(hw, txq)) {
4784
ret = ath10k_mac_tx_push_txq(hw, txq);
4785
if (ret < 0)
4786
break;
4787
}
4788
ieee80211_return_txq(hw, txq, false);
4789
ath10k_htt_tx_txq_update(hw, txq);
4790
out:
4791
ieee80211_txq_schedule_end(hw, ac);
4792
spin_unlock_bh(&ar->queue_lock[ac]);
4793
}
4794
4795
/* Must not be called with conf_mutex held as workers can use that also. */
4796
void ath10k_drain_tx(struct ath10k *ar)
4797
{
4798
lockdep_assert_not_held(&ar->conf_mutex);
4799
4800
/* make sure rcu-protected mac80211 tx path itself is drained */
4801
synchronize_net();
4802
4803
ath10k_offchan_tx_purge(ar);
4804
ath10k_mgmt_over_wmi_tx_purge(ar);
4805
4806
cancel_work_sync(&ar->offchan_tx_work);
4807
cancel_work_sync(&ar->wmi_mgmt_tx_work);
4808
}
4809
4810
void ath10k_halt(struct ath10k *ar)
4811
{
4812
struct ath10k_vif *arvif;
4813
4814
lockdep_assert_held(&ar->conf_mutex);
4815
4816
clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
4817
ar->filter_flags = 0;
4818
ar->monitor = false;
4819
ar->monitor_arvif = NULL;
4820
4821
if (ar->monitor_started)
4822
ath10k_monitor_stop(ar);
4823
4824
ar->monitor_started = false;
4825
ar->tx_paused = 0;
4826
4827
ath10k_scan_finish(ar);
4828
ath10k_peer_cleanup_all(ar);
4829
ath10k_stop_radar_confirmation(ar);
4830
ath10k_core_stop(ar);
4831
ath10k_hif_power_down(ar);
4832
4833
spin_lock_bh(&ar->data_lock);
4834
list_for_each_entry(arvif, &ar->arvifs, list)
4835
ath10k_mac_vif_beacon_cleanup(arvif);
4836
spin_unlock_bh(&ar->data_lock);
4837
}
4838
4839
static int ath10k_get_antenna(struct ieee80211_hw *hw, int radio_idx,
4840
u32 *tx_ant, u32 *rx_ant)
4841
{
4842
struct ath10k *ar = hw->priv;
4843
4844
mutex_lock(&ar->conf_mutex);
4845
4846
*tx_ant = ar->cfg_tx_chainmask;
4847
*rx_ant = ar->cfg_rx_chainmask;
4848
4849
mutex_unlock(&ar->conf_mutex);
4850
4851
return 0;
4852
}
4853
4854
static bool ath10k_check_chain_mask(struct ath10k *ar, u32 cm, const char *dbg)
4855
{
4856
/* It is not clear that allowing gaps in chainmask
4857
* is helpful. Probably it will not do what user
4858
* is hoping for, so warn in that case.
4859
*/
4860
if (cm == 15 || cm == 7 || cm == 3 || cm == 1 || cm == 0)
4861
return true;
4862
4863
ath10k_warn(ar, "mac %s antenna chainmask is invalid: 0x%x. Suggested values: 15, 7, 3, 1 or 0.\n",
4864
dbg, cm);
4865
return false;
4866
}
4867
4868
static int ath10k_mac_get_vht_cap_bf_sts(struct ath10k *ar)
4869
{
4870
int nsts = ar->vht_cap_info;
4871
4872
nsts &= IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
4873
nsts >>= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
4874
4875
/* If firmware does not deliver to host number of space-time
4876
* streams supported, assume it support up to 4 BF STS and return
4877
* the value for VHT CAP: nsts-1)
4878
*/
4879
if (nsts == 0)
4880
return 3;
4881
4882
return nsts;
4883
}
4884
4885
static int ath10k_mac_get_vht_cap_bf_sound_dim(struct ath10k *ar)
4886
{
4887
int sound_dim = ar->vht_cap_info;
4888
4889
sound_dim &= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
4890
sound_dim >>= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
4891
4892
/* If the sounding dimension is not advertised by the firmware,
4893
* let's use a default value of 1
4894
*/
4895
if (sound_dim == 0)
4896
return 1;
4897
4898
return sound_dim;
4899
}
4900
4901
static struct ieee80211_sta_vht_cap ath10k_create_vht_cap(struct ath10k *ar)
4902
{
4903
struct ieee80211_sta_vht_cap vht_cap = {};
4904
struct ath10k_hw_params *hw = &ar->hw_params;
4905
u16 mcs_map;
4906
u32 val;
4907
int i;
4908
4909
vht_cap.vht_supported = 1;
4910
vht_cap.cap = ar->vht_cap_info;
4911
4912
if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
4913
IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)) {
4914
val = ath10k_mac_get_vht_cap_bf_sts(ar);
4915
val <<= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
4916
val &= IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
4917
4918
vht_cap.cap |= val;
4919
}
4920
4921
if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
4922
IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)) {
4923
val = ath10k_mac_get_vht_cap_bf_sound_dim(ar);
4924
val <<= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
4925
val &= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
4926
4927
vht_cap.cap |= val;
4928
}
4929
4930
mcs_map = 0;
4931
for (i = 0; i < 8; i++) {
4932
if ((i < ar->num_rf_chains) && (ar->cfg_tx_chainmask & BIT(i)))
4933
mcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
4934
else
4935
mcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
4936
}
4937
4938
if (ar->cfg_tx_chainmask <= 1)
4939
vht_cap.cap &= ~IEEE80211_VHT_CAP_TXSTBC;
4940
4941
vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(mcs_map);
4942
vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(mcs_map);
4943
4944
/* If we are supporting 160Mhz or 80+80, then the NIC may be able to do
4945
* a restricted NSS for 160 or 80+80 vs what it can do for 80Mhz. Give
4946
* user-space a clue if that is the case.
4947
*/
4948
if ((vht_cap.cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK) &&
4949
(hw->vht160_mcs_rx_highest != 0 ||
4950
hw->vht160_mcs_tx_highest != 0)) {
4951
vht_cap.vht_mcs.rx_highest = cpu_to_le16(hw->vht160_mcs_rx_highest);
4952
vht_cap.vht_mcs.tx_highest = cpu_to_le16(hw->vht160_mcs_tx_highest);
4953
}
4954
4955
return vht_cap;
4956
}
4957
4958
static struct ieee80211_sta_ht_cap ath10k_get_ht_cap(struct ath10k *ar)
4959
{
4960
int i;
4961
struct ieee80211_sta_ht_cap ht_cap = {};
4962
4963
if (!(ar->ht_cap_info & WMI_HT_CAP_ENABLED))
4964
return ht_cap;
4965
4966
ht_cap.ht_supported = 1;
4967
ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
4968
ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_8;
4969
ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
4970
ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
4971
ht_cap.cap |=
4972
WLAN_HT_CAP_SM_PS_DISABLED << IEEE80211_HT_CAP_SM_PS_SHIFT;
4973
4974
if (ar->ht_cap_info & WMI_HT_CAP_HT20_SGI)
4975
ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
4976
4977
if (ar->ht_cap_info & WMI_HT_CAP_HT40_SGI)
4978
ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
4979
4980
if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) {
4981
u32 smps;
4982
4983
smps = WLAN_HT_CAP_SM_PS_DYNAMIC;
4984
smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT;
4985
4986
ht_cap.cap |= smps;
4987
}
4988
4989
if (ar->ht_cap_info & WMI_HT_CAP_TX_STBC && (ar->cfg_tx_chainmask > 1))
4990
ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC;
4991
4992
if (ar->ht_cap_info & WMI_HT_CAP_RX_STBC) {
4993
u32 stbc;
4994
4995
stbc = ar->ht_cap_info;
4996
stbc &= WMI_HT_CAP_RX_STBC;
4997
stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT;
4998
stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT;
4999
stbc &= IEEE80211_HT_CAP_RX_STBC;
5000
5001
ht_cap.cap |= stbc;
5002
}
5003
5004
if (ar->ht_cap_info & WMI_HT_CAP_LDPC || (ar->ht_cap_info &
5005
WMI_HT_CAP_RX_LDPC && (ar->ht_cap_info & WMI_HT_CAP_TX_LDPC)))
5006
ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
5007
5008
if (ar->ht_cap_info & WMI_HT_CAP_L_SIG_TXOP_PROT)
5009
ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
5010
5011
/* max AMSDU is implicitly taken from vht_cap_info */
5012
if (ar->vht_cap_info & WMI_VHT_CAP_MAX_MPDU_LEN_MASK)
5013
ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU;
5014
5015
for (i = 0; i < ar->num_rf_chains; i++) {
5016
if (ar->cfg_rx_chainmask & BIT(i))
5017
ht_cap.mcs.rx_mask[i] = 0xFF;
5018
}
5019
5020
ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
5021
5022
return ht_cap;
5023
}
5024
5025
static void ath10k_mac_setup_ht_vht_cap(struct ath10k *ar)
5026
{
5027
struct ieee80211_supported_band *band;
5028
struct ieee80211_sta_vht_cap vht_cap;
5029
struct ieee80211_sta_ht_cap ht_cap;
5030
5031
ht_cap = ath10k_get_ht_cap(ar);
5032
vht_cap = ath10k_create_vht_cap(ar);
5033
5034
if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) {
5035
band = &ar->mac.sbands[NL80211_BAND_2GHZ];
5036
band->ht_cap = ht_cap;
5037
}
5038
if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) {
5039
band = &ar->mac.sbands[NL80211_BAND_5GHZ];
5040
band->ht_cap = ht_cap;
5041
band->vht_cap = vht_cap;
5042
}
5043
}
5044
5045
static int __ath10k_set_antenna(struct ath10k *ar, u32 tx_ant, u32 rx_ant)
5046
{
5047
int ret;
5048
bool is_valid_tx_chain_mask, is_valid_rx_chain_mask;
5049
5050
lockdep_assert_held(&ar->conf_mutex);
5051
5052
is_valid_tx_chain_mask = ath10k_check_chain_mask(ar, tx_ant, "tx");
5053
is_valid_rx_chain_mask = ath10k_check_chain_mask(ar, rx_ant, "rx");
5054
5055
if (!is_valid_tx_chain_mask || !is_valid_rx_chain_mask)
5056
return -EINVAL;
5057
5058
ar->cfg_tx_chainmask = tx_ant;
5059
ar->cfg_rx_chainmask = rx_ant;
5060
5061
if ((ar->state != ATH10K_STATE_ON) &&
5062
(ar->state != ATH10K_STATE_RESTARTED))
5063
return 0;
5064
5065
ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->tx_chain_mask,
5066
tx_ant);
5067
if (ret) {
5068
ath10k_warn(ar, "failed to set tx-chainmask: %d, req 0x%x\n",
5069
ret, tx_ant);
5070
return ret;
5071
}
5072
5073
ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->rx_chain_mask,
5074
rx_ant);
5075
if (ret) {
5076
ath10k_warn(ar, "failed to set rx-chainmask: %d, req 0x%x\n",
5077
ret, rx_ant);
5078
return ret;
5079
}
5080
5081
/* Reload HT/VHT capability */
5082
ath10k_mac_setup_ht_vht_cap(ar);
5083
5084
return 0;
5085
}
5086
5087
static int ath10k_set_antenna(struct ieee80211_hw *hw, int radio_idx,
5088
u32 tx_ant, u32 rx_ant)
5089
{
5090
struct ath10k *ar = hw->priv;
5091
int ret;
5092
5093
mutex_lock(&ar->conf_mutex);
5094
ret = __ath10k_set_antenna(ar, tx_ant, rx_ant);
5095
mutex_unlock(&ar->conf_mutex);
5096
return ret;
5097
}
5098
5099
static int __ath10k_fetch_bb_timing_dt(struct ath10k *ar,
5100
struct wmi_bb_timing_cfg_arg *bb_timing)
5101
{
5102
#if defined(__linux__) || (defined(__FreeBSD__) && defined(CONFIG_OF))
5103
struct device_node *node;
5104
const char *fem_name;
5105
int ret;
5106
5107
node = ar->dev->of_node;
5108
if (!node)
5109
return -ENOENT;
5110
5111
ret = of_property_read_string_index(node, "ext-fem-name", 0, &fem_name);
5112
if (ret)
5113
return -ENOENT;
5114
5115
/*
5116
* If external Front End module used in hardware, then default base band timing
5117
* parameter cannot be used since they were fine tuned for reference hardware,
5118
* so choosing different value suitable for that external FEM.
5119
*/
5120
if (!strcmp("microsemi-lx5586", fem_name)) {
5121
bb_timing->bb_tx_timing = 0x00;
5122
bb_timing->bb_xpa_timing = 0x0101;
5123
} else {
5124
return -ENOENT;
5125
}
5126
5127
ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot bb_tx_timing 0x%x bb_xpa_timing 0x%x\n",
5128
bb_timing->bb_tx_timing, bb_timing->bb_xpa_timing);
5129
return 0;
5130
#else
5131
return -ENOENT;
5132
#endif
5133
}
5134
5135
static int ath10k_mac_rfkill_config(struct ath10k *ar)
5136
{
5137
u32 param;
5138
int ret;
5139
5140
if (ar->hw_values->rfkill_pin == 0) {
5141
ath10k_warn(ar, "ath10k does not support hardware rfkill with this device\n");
5142
return -EOPNOTSUPP;
5143
}
5144
5145
ath10k_dbg(ar, ATH10K_DBG_MAC,
5146
"mac rfkill_pin %d rfkill_cfg %d rfkill_on_level %d",
5147
ar->hw_values->rfkill_pin, ar->hw_values->rfkill_cfg,
5148
ar->hw_values->rfkill_on_level);
5149
5150
param = FIELD_PREP(WMI_TLV_RFKILL_CFG_RADIO_LEVEL,
5151
ar->hw_values->rfkill_on_level) |
5152
FIELD_PREP(WMI_TLV_RFKILL_CFG_GPIO_PIN_NUM,
5153
ar->hw_values->rfkill_pin) |
5154
FIELD_PREP(WMI_TLV_RFKILL_CFG_PIN_AS_GPIO,
5155
ar->hw_values->rfkill_cfg);
5156
5157
ret = ath10k_wmi_pdev_set_param(ar,
5158
ar->wmi.pdev_param->rfkill_config,
5159
param);
5160
if (ret) {
5161
ath10k_warn(ar,
5162
"failed to set rfkill config 0x%x: %d\n",
5163
param, ret);
5164
return ret;
5165
}
5166
return 0;
5167
}
5168
5169
int ath10k_mac_rfkill_enable_radio(struct ath10k *ar, bool enable)
5170
{
5171
enum wmi_tlv_rfkill_enable_radio param;
5172
int ret;
5173
5174
if (enable)
5175
param = WMI_TLV_RFKILL_ENABLE_RADIO_ON;
5176
else
5177
param = WMI_TLV_RFKILL_ENABLE_RADIO_OFF;
5178
5179
ath10k_dbg(ar, ATH10K_DBG_MAC, "mac rfkill enable %d", param);
5180
5181
ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->rfkill_enable,
5182
param);
5183
if (ret) {
5184
ath10k_warn(ar, "failed to set rfkill enable param %d: %d\n",
5185
param, ret);
5186
return ret;
5187
}
5188
5189
return 0;
5190
}
5191
5192
static int ath10k_start(struct ieee80211_hw *hw)
5193
{
5194
struct ath10k *ar = hw->priv;
5195
u32 param;
5196
int ret = 0;
5197
struct wmi_bb_timing_cfg_arg bb_timing = {};
5198
5199
/*
5200
* This makes sense only when restarting hw. It is harmless to call
5201
* unconditionally. This is necessary to make sure no HTT/WMI tx
5202
* commands will be submitted while restarting.
5203
*/
5204
ath10k_drain_tx(ar);
5205
5206
mutex_lock(&ar->conf_mutex);
5207
5208
switch (ar->state) {
5209
case ATH10K_STATE_OFF:
5210
ar->state = ATH10K_STATE_ON;
5211
break;
5212
case ATH10K_STATE_RESTARTING:
5213
ar->state = ATH10K_STATE_RESTARTED;
5214
break;
5215
case ATH10K_STATE_ON:
5216
case ATH10K_STATE_RESTARTED:
5217
case ATH10K_STATE_WEDGED:
5218
WARN_ON(1);
5219
ret = -EINVAL;
5220
goto err;
5221
case ATH10K_STATE_UTF:
5222
ret = -EBUSY;
5223
goto err;
5224
}
5225
5226
spin_lock_bh(&ar->data_lock);
5227
5228
if (ar->hw_rfkill_on) {
5229
ar->hw_rfkill_on = false;
5230
spin_unlock_bh(&ar->data_lock);
5231
goto err;
5232
}
5233
5234
spin_unlock_bh(&ar->data_lock);
5235
5236
ret = ath10k_hif_power_up(ar, ATH10K_FIRMWARE_MODE_NORMAL);
5237
if (ret) {
5238
ath10k_err(ar, "Could not init hif: %d\n", ret);
5239
goto err_off;
5240
}
5241
5242
ret = ath10k_core_start(ar, ATH10K_FIRMWARE_MODE_NORMAL,
5243
&ar->normal_mode_fw);
5244
if (ret) {
5245
ath10k_err(ar, "Could not init core: %d\n", ret);
5246
goto err_power_down;
5247
}
5248
5249
if (ar->sys_cap_info & WMI_TLV_SYS_CAP_INFO_RFKILL) {
5250
ret = ath10k_mac_rfkill_config(ar);
5251
if (ret && ret != -EOPNOTSUPP) {
5252
ath10k_warn(ar, "failed to configure rfkill: %d", ret);
5253
goto err_core_stop;
5254
}
5255
}
5256
5257
param = ar->wmi.pdev_param->pmf_qos;
5258
ret = ath10k_wmi_pdev_set_param(ar, param, 1);
5259
if (ret) {
5260
ath10k_warn(ar, "failed to enable PMF QOS: %d\n", ret);
5261
goto err_core_stop;
5262
}
5263
5264
param = ar->wmi.pdev_param->dynamic_bw;
5265
ret = ath10k_wmi_pdev_set_param(ar, param, 1);
5266
if (ret) {
5267
ath10k_warn(ar, "failed to enable dynamic BW: %d\n", ret);
5268
goto err_core_stop;
5269
}
5270
5271
if (test_bit(WMI_SERVICE_SPOOF_MAC_SUPPORT, ar->wmi.svc_map)) {
5272
ret = ath10k_wmi_scan_prob_req_oui(ar, ar->mac_addr);
5273
if (ret) {
5274
ath10k_err(ar, "failed to set prob req oui: %i\n", ret);
5275
goto err_core_stop;
5276
}
5277
}
5278
5279
if (test_bit(WMI_SERVICE_ADAPTIVE_OCS, ar->wmi.svc_map)) {
5280
ret = ath10k_wmi_adaptive_qcs(ar, true);
5281
if (ret) {
5282
ath10k_warn(ar, "failed to enable adaptive qcs: %d\n",
5283
ret);
5284
goto err_core_stop;
5285
}
5286
}
5287
5288
if (test_bit(WMI_SERVICE_BURST, ar->wmi.svc_map)) {
5289
param = ar->wmi.pdev_param->burst_enable;
5290
ret = ath10k_wmi_pdev_set_param(ar, param, 0);
5291
if (ret) {
5292
ath10k_warn(ar, "failed to disable burst: %d\n", ret);
5293
goto err_core_stop;
5294
}
5295
}
5296
5297
param = ar->wmi.pdev_param->idle_ps_config;
5298
ret = ath10k_wmi_pdev_set_param(ar, param, 1);
5299
if (ret && ret != -EOPNOTSUPP) {
5300
ath10k_warn(ar, "failed to enable idle_ps_config: %d\n", ret);
5301
goto err_core_stop;
5302
}
5303
5304
__ath10k_set_antenna(ar, ar->cfg_tx_chainmask, ar->cfg_rx_chainmask);
5305
5306
/*
5307
* By default FW set ARP frames ac to voice (6). In that case ARP
5308
* exchange is not working properly for UAPSD enabled AP. ARP requests
5309
* which arrives with access category 0 are processed by network stack
5310
* and send back with access category 0, but FW changes access category
5311
* to 6. Set ARP frames access category to best effort (0) solves
5312
* this problem.
5313
*/
5314
5315
param = ar->wmi.pdev_param->arp_ac_override;
5316
ret = ath10k_wmi_pdev_set_param(ar, param, 0);
5317
if (ret) {
5318
ath10k_warn(ar, "failed to set arp ac override parameter: %d\n",
5319
ret);
5320
goto err_core_stop;
5321
}
5322
5323
if (test_bit(ATH10K_FW_FEATURE_SUPPORTS_ADAPTIVE_CCA,
5324
ar->running_fw->fw_file.fw_features)) {
5325
ret = ath10k_wmi_pdev_enable_adaptive_cca(ar, 1,
5326
WMI_CCA_DETECT_LEVEL_AUTO,
5327
WMI_CCA_DETECT_MARGIN_AUTO);
5328
if (ret) {
5329
ath10k_warn(ar, "failed to enable adaptive cca: %d\n",
5330
ret);
5331
goto err_core_stop;
5332
}
5333
}
5334
5335
param = ar->wmi.pdev_param->ani_enable;
5336
ret = ath10k_wmi_pdev_set_param(ar, param, 1);
5337
if (ret) {
5338
ath10k_warn(ar, "failed to enable ani by default: %d\n",
5339
ret);
5340
goto err_core_stop;
5341
}
5342
5343
ar->ani_enabled = true;
5344
5345
if (ath10k_peer_stats_enabled(ar)) {
5346
param = ar->wmi.pdev_param->peer_stats_update_period;
5347
ret = ath10k_wmi_pdev_set_param(ar, param,
5348
PEER_DEFAULT_STATS_UPDATE_PERIOD);
5349
if (ret) {
5350
ath10k_warn(ar,
5351
"failed to set peer stats period : %d\n",
5352
ret);
5353
goto err_core_stop;
5354
}
5355
}
5356
5357
param = ar->wmi.pdev_param->enable_btcoex;
5358
if (test_bit(WMI_SERVICE_COEX_GPIO, ar->wmi.svc_map) &&
5359
test_bit(ATH10K_FW_FEATURE_BTCOEX_PARAM,
5360
ar->running_fw->fw_file.fw_features) &&
5361
ar->coex_support) {
5362
ret = ath10k_wmi_pdev_set_param(ar, param, 0);
5363
if (ret) {
5364
ath10k_warn(ar,
5365
"failed to set btcoex param: %d\n", ret);
5366
goto err_core_stop;
5367
}
5368
clear_bit(ATH10K_FLAG_BTCOEX, &ar->dev_flags);
5369
}
5370
5371
if (test_bit(WMI_SERVICE_BB_TIMING_CONFIG_SUPPORT, ar->wmi.svc_map)) {
5372
ret = __ath10k_fetch_bb_timing_dt(ar, &bb_timing);
5373
if (!ret) {
5374
ret = ath10k_wmi_pdev_bb_timing(ar, &bb_timing);
5375
if (ret) {
5376
ath10k_warn(ar,
5377
"failed to set bb timings: %d\n",
5378
ret);
5379
goto err_core_stop;
5380
}
5381
}
5382
}
5383
5384
ar->num_started_vdevs = 0;
5385
ath10k_regd_update(ar);
5386
5387
ath10k_spectral_start(ar);
5388
ath10k_thermal_set_throttling(ar);
5389
5390
ar->radar_conf_state = ATH10K_RADAR_CONFIRMATION_IDLE;
5391
5392
mutex_unlock(&ar->conf_mutex);
5393
return 0;
5394
5395
err_core_stop:
5396
ath10k_core_stop(ar);
5397
5398
err_power_down:
5399
ath10k_hif_power_down(ar);
5400
5401
err_off:
5402
ar->state = ATH10K_STATE_OFF;
5403
5404
err:
5405
mutex_unlock(&ar->conf_mutex);
5406
return ret;
5407
}
5408
5409
static void ath10k_stop(struct ieee80211_hw *hw, bool suspend)
5410
{
5411
struct ath10k *ar = hw->priv;
5412
u32 opt;
5413
5414
ath10k_drain_tx(ar);
5415
5416
mutex_lock(&ar->conf_mutex);
5417
if (ar->state != ATH10K_STATE_OFF) {
5418
if (!ar->hw_rfkill_on) {
5419
/* If the current driver state is RESTARTING but not yet
5420
* fully RESTARTED because of incoming suspend event,
5421
* then ath10k_halt() is already called via
5422
* ath10k_core_restart() and should not be called here.
5423
*/
5424
if (ar->state != ATH10K_STATE_RESTARTING) {
5425
ath10k_halt(ar);
5426
} else {
5427
/* Suspending here, because when in RESTARTING
5428
* state, ath10k_core_stop() skips
5429
* ath10k_wait_for_suspend().
5430
*/
5431
opt = WMI_PDEV_SUSPEND_AND_DISABLE_INTR;
5432
ath10k_wait_for_suspend(ar, opt);
5433
}
5434
}
5435
ar->state = ATH10K_STATE_OFF;
5436
}
5437
mutex_unlock(&ar->conf_mutex);
5438
5439
cancel_work_sync(&ar->set_coverage_class_work);
5440
cancel_delayed_work_sync(&ar->scan.timeout);
5441
cancel_work_sync(&ar->restart_work);
5442
cancel_work_sync(&ar->recovery_check_work);
5443
}
5444
5445
static int ath10k_config_ps(struct ath10k *ar)
5446
{
5447
struct ath10k_vif *arvif;
5448
int ret = 0;
5449
5450
lockdep_assert_held(&ar->conf_mutex);
5451
5452
list_for_each_entry(arvif, &ar->arvifs, list) {
5453
ret = ath10k_mac_vif_setup_ps(arvif);
5454
if (ret) {
5455
ath10k_warn(ar, "failed to setup powersave: %d\n", ret);
5456
break;
5457
}
5458
}
5459
5460
return ret;
5461
}
5462
5463
static int ath10k_config(struct ieee80211_hw *hw, int radio_idx, u32 changed)
5464
{
5465
struct ath10k *ar = hw->priv;
5466
struct ieee80211_conf *conf = &hw->conf;
5467
int ret = 0;
5468
5469
mutex_lock(&ar->conf_mutex);
5470
5471
if (changed & IEEE80211_CONF_CHANGE_PS)
5472
ath10k_config_ps(ar);
5473
5474
if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
5475
ar->monitor = conf->flags & IEEE80211_CONF_MONITOR;
5476
ret = ath10k_monitor_recalc(ar);
5477
if (ret)
5478
ath10k_warn(ar, "failed to recalc monitor: %d\n", ret);
5479
}
5480
5481
mutex_unlock(&ar->conf_mutex);
5482
return ret;
5483
}
5484
5485
static u32 get_nss_from_chainmask(u16 chain_mask)
5486
{
5487
if ((chain_mask & 0xf) == 0xf)
5488
return 4;
5489
else if ((chain_mask & 0x7) == 0x7)
5490
return 3;
5491
else if ((chain_mask & 0x3) == 0x3)
5492
return 2;
5493
return 1;
5494
}
5495
5496
static int ath10k_mac_set_txbf_conf(struct ath10k_vif *arvif)
5497
{
5498
u32 value = 0;
5499
struct ath10k *ar = arvif->ar;
5500
int nsts;
5501
int sound_dim;
5502
5503
if (ath10k_wmi_get_txbf_conf_scheme(ar) != WMI_TXBF_CONF_BEFORE_ASSOC)
5504
return 0;
5505
5506
nsts = ath10k_mac_get_vht_cap_bf_sts(ar);
5507
if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
5508
IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE))
5509
value |= SM(nsts, WMI_TXBF_STS_CAP_OFFSET);
5510
5511
sound_dim = ath10k_mac_get_vht_cap_bf_sound_dim(ar);
5512
if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
5513
IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE))
5514
value |= SM(sound_dim, WMI_BF_SOUND_DIM_OFFSET);
5515
5516
if (!value)
5517
return 0;
5518
5519
if (ar->vht_cap_info & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)
5520
value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
5521
5522
if (ar->vht_cap_info & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)
5523
value |= (WMI_VDEV_PARAM_TXBF_MU_TX_BFER |
5524
WMI_VDEV_PARAM_TXBF_SU_TX_BFER);
5525
5526
if (ar->vht_cap_info & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)
5527
value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
5528
5529
if (ar->vht_cap_info & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)
5530
value |= (WMI_VDEV_PARAM_TXBF_MU_TX_BFEE |
5531
WMI_VDEV_PARAM_TXBF_SU_TX_BFEE);
5532
5533
return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
5534
ar->wmi.vdev_param->txbf, value);
5535
}
5536
5537
static void ath10k_update_vif_offload(struct ieee80211_hw *hw,
5538
struct ieee80211_vif *vif)
5539
{
5540
struct ath10k_vif *arvif = (void *)vif->drv_priv;
5541
struct ath10k *ar = hw->priv;
5542
u32 vdev_param;
5543
int ret;
5544
5545
if (ath10k_frame_mode != ATH10K_HW_TXRX_ETHERNET ||
5546
ar->wmi.vdev_param->tx_encap_type == WMI_VDEV_PARAM_UNSUPPORTED ||
5547
(vif->type != NL80211_IFTYPE_STATION &&
5548
vif->type != NL80211_IFTYPE_AP))
5549
vif->offload_flags &= ~IEEE80211_OFFLOAD_ENCAP_ENABLED;
5550
5551
vdev_param = ar->wmi.vdev_param->tx_encap_type;
5552
ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
5553
ATH10K_HW_TXRX_NATIVE_WIFI);
5554
/* 10.X firmware does not support this VDEV parameter. Do not warn */
5555
if (ret && ret != -EOPNOTSUPP) {
5556
ath10k_warn(ar, "failed to set vdev %i TX encapsulation: %d\n",
5557
arvif->vdev_id, ret);
5558
}
5559
}
5560
5561
/*
5562
* TODO:
5563
* Figure out how to handle WMI_VDEV_SUBTYPE_P2P_DEVICE,
5564
* because we will send mgmt frames without CCK. This requirement
5565
* for P2P_FIND/GO_NEG should be handled by checking CCK flag
5566
* in the TX packet.
5567
*/
5568
static int ath10k_add_interface(struct ieee80211_hw *hw,
5569
struct ieee80211_vif *vif)
5570
{
5571
struct ath10k *ar = hw->priv;
5572
struct ath10k_vif *arvif = (void *)vif->drv_priv;
5573
struct ath10k_peer *peer;
5574
enum wmi_sta_powersave_param param;
5575
int ret = 0;
5576
u32 value;
5577
int bit;
5578
int i;
5579
u32 vdev_param;
5580
5581
vif->driver_flags |= IEEE80211_VIF_SUPPORTS_UAPSD;
5582
5583
mutex_lock(&ar->conf_mutex);
5584
5585
memset(arvif, 0, sizeof(*arvif));
5586
ath10k_mac_txq_init(vif->txq);
5587
5588
arvif->ar = ar;
5589
arvif->vif = vif;
5590
5591
INIT_LIST_HEAD(&arvif->list);
5592
INIT_WORK(&arvif->ap_csa_work, ath10k_mac_vif_ap_csa_work);
5593
INIT_DELAYED_WORK(&arvif->connection_loss_work,
5594
ath10k_mac_vif_sta_connection_loss_work);
5595
5596
for (i = 0; i < ARRAY_SIZE(arvif->bitrate_mask.control); i++) {
5597
arvif->bitrate_mask.control[i].legacy = 0xffffffff;
5598
memset(arvif->bitrate_mask.control[i].ht_mcs, 0xff,
5599
sizeof(arvif->bitrate_mask.control[i].ht_mcs));
5600
memset(arvif->bitrate_mask.control[i].vht_mcs, 0xff,
5601
sizeof(arvif->bitrate_mask.control[i].vht_mcs));
5602
}
5603
5604
if (ar->num_peers >= ar->max_num_peers) {
5605
ath10k_warn(ar, "refusing vdev creation due to insufficient peer entry resources in firmware\n");
5606
ret = -ENOBUFS;
5607
goto err;
5608
}
5609
5610
if (ar->free_vdev_map == 0) {
5611
ath10k_warn(ar, "Free vdev map is empty, no more interfaces allowed.\n");
5612
ret = -EBUSY;
5613
goto err;
5614
}
5615
bit = __ffs64(ar->free_vdev_map);
5616
5617
ath10k_dbg(ar, ATH10K_DBG_MAC, "mac create vdev %i map %llx\n",
5618
bit, ar->free_vdev_map);
5619
5620
arvif->vdev_id = bit;
5621
arvif->vdev_subtype =
5622
ath10k_wmi_get_vdev_subtype(ar, WMI_VDEV_SUBTYPE_NONE);
5623
5624
switch (vif->type) {
5625
case NL80211_IFTYPE_P2P_DEVICE:
5626
arvif->vdev_type = WMI_VDEV_TYPE_STA;
5627
arvif->vdev_subtype = ath10k_wmi_get_vdev_subtype
5628
(ar, WMI_VDEV_SUBTYPE_P2P_DEVICE);
5629
break;
5630
case NL80211_IFTYPE_UNSPECIFIED:
5631
case NL80211_IFTYPE_STATION:
5632
arvif->vdev_type = WMI_VDEV_TYPE_STA;
5633
if (vif->p2p)
5634
arvif->vdev_subtype = ath10k_wmi_get_vdev_subtype
5635
(ar, WMI_VDEV_SUBTYPE_P2P_CLIENT);
5636
break;
5637
case NL80211_IFTYPE_ADHOC:
5638
arvif->vdev_type = WMI_VDEV_TYPE_IBSS;
5639
break;
5640
case NL80211_IFTYPE_MESH_POINT:
5641
if (test_bit(WMI_SERVICE_MESH_11S, ar->wmi.svc_map)) {
5642
arvif->vdev_subtype = ath10k_wmi_get_vdev_subtype
5643
(ar, WMI_VDEV_SUBTYPE_MESH_11S);
5644
} else if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) {
5645
ret = -EINVAL;
5646
ath10k_warn(ar, "must load driver with rawmode=1 to add mesh interfaces\n");
5647
goto err;
5648
}
5649
arvif->vdev_type = WMI_VDEV_TYPE_AP;
5650
break;
5651
case NL80211_IFTYPE_AP:
5652
arvif->vdev_type = WMI_VDEV_TYPE_AP;
5653
5654
if (vif->p2p)
5655
arvif->vdev_subtype = ath10k_wmi_get_vdev_subtype
5656
(ar, WMI_VDEV_SUBTYPE_P2P_GO);
5657
break;
5658
case NL80211_IFTYPE_MONITOR:
5659
arvif->vdev_type = WMI_VDEV_TYPE_MONITOR;
5660
break;
5661
default:
5662
WARN_ON(1);
5663
break;
5664
}
5665
5666
/* Using vdev_id as queue number will make it very easy to do per-vif
5667
* tx queue locking. This shouldn't wrap due to interface combinations
5668
* but do a modulo for correctness sake and prevent using offchannel tx
5669
* queues for regular vif tx.
5670
*/
5671
vif->cab_queue = arvif->vdev_id % (IEEE80211_MAX_QUEUES - 1);
5672
for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++)
5673
vif->hw_queue[i] = arvif->vdev_id % (IEEE80211_MAX_QUEUES - 1);
5674
5675
/* Some firmware revisions don't wait for beacon tx completion before
5676
* sending another SWBA event. This could lead to hardware using old
5677
* (freed) beacon data in some cases, e.g. tx credit starvation
5678
* combined with missed TBTT. This is very rare.
5679
*
5680
* On non-IOMMU-enabled hosts this could be a possible security issue
5681
* because hw could beacon some random data on the air. On
5682
* IOMMU-enabled hosts DMAR faults would occur in most cases and target
5683
* device would crash.
5684
*
5685
* Since there are no beacon tx completions (implicit nor explicit)
5686
* propagated to host the only workaround for this is to allocate a
5687
* DMA-coherent buffer for a lifetime of a vif and use it for all
5688
* beacon tx commands. Worst case for this approach is some beacons may
5689
* become corrupted, e.g. have garbled IEs or out-of-date TIM bitmap.
5690
*/
5691
if (vif->type == NL80211_IFTYPE_ADHOC ||
5692
vif->type == NL80211_IFTYPE_MESH_POINT ||
5693
vif->type == NL80211_IFTYPE_AP) {
5694
if (ar->bus_param.dev_type == ATH10K_DEV_TYPE_HL) {
5695
arvif->beacon_buf = kmalloc(IEEE80211_MAX_FRAME_LEN,
5696
GFP_KERNEL);
5697
5698
/* Using a kernel pointer in place of a dma_addr_t
5699
* token can lead to undefined behavior if that
5700
* makes it into cache management functions. Use a
5701
* known-invalid address token instead, which
5702
* avoids the warning and makes it easier to catch
5703
* bugs if it does end up getting used.
5704
*/
5705
arvif->beacon_paddr = DMA_MAPPING_ERROR;
5706
} else {
5707
arvif->beacon_buf =
5708
dma_alloc_coherent(ar->dev,
5709
IEEE80211_MAX_FRAME_LEN,
5710
&arvif->beacon_paddr,
5711
GFP_ATOMIC);
5712
}
5713
if (!arvif->beacon_buf) {
5714
ret = -ENOMEM;
5715
ath10k_warn(ar, "failed to allocate beacon buffer: %d\n",
5716
ret);
5717
goto err;
5718
}
5719
}
5720
if (test_bit(ATH10K_FLAG_HW_CRYPTO_DISABLED, &ar->dev_flags))
5721
arvif->nohwcrypt = true;
5722
5723
if (arvif->nohwcrypt &&
5724
!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) {
5725
ret = -EINVAL;
5726
ath10k_warn(ar, "cryptmode module param needed for sw crypto\n");
5727
goto err;
5728
}
5729
5730
ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev create %d (add interface) type %d subtype %d bcnmode %s\n",
5731
arvif->vdev_id, arvif->vdev_type, arvif->vdev_subtype,
5732
arvif->beacon_buf ? "single-buf" : "per-skb");
5733
5734
ret = ath10k_wmi_vdev_create(ar, arvif->vdev_id, arvif->vdev_type,
5735
arvif->vdev_subtype, vif->addr);
5736
if (ret) {
5737
ath10k_warn(ar, "failed to create WMI vdev %i: %d\n",
5738
arvif->vdev_id, ret);
5739
goto err;
5740
}
5741
5742
if (test_bit(WMI_SERVICE_VDEV_DISABLE_4_ADDR_SRC_LRN_SUPPORT,
5743
ar->wmi.svc_map)) {
5744
vdev_param = ar->wmi.vdev_param->disable_4addr_src_lrn;
5745
ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
5746
WMI_VDEV_DISABLE_4_ADDR_SRC_LRN);
5747
if (ret && ret != -EOPNOTSUPP) {
5748
ath10k_warn(ar, "failed to disable 4addr src lrn vdev %i: %d\n",
5749
arvif->vdev_id, ret);
5750
}
5751
}
5752
5753
ar->free_vdev_map &= ~(1LL << arvif->vdev_id);
5754
spin_lock_bh(&ar->data_lock);
5755
list_add(&arvif->list, &ar->arvifs);
5756
spin_unlock_bh(&ar->data_lock);
5757
5758
/* It makes no sense to have firmware do keepalives. mac80211 already
5759
* takes care of this with idle connection polling.
5760
*/
5761
ret = ath10k_mac_vif_disable_keepalive(arvif);
5762
if (ret) {
5763
ath10k_warn(ar, "failed to disable keepalive on vdev %i: %d\n",
5764
arvif->vdev_id, ret);
5765
goto err_vdev_delete;
5766
}
5767
5768
arvif->def_wep_key_idx = -1;
5769
5770
ath10k_update_vif_offload(hw, vif);
5771
5772
/* Configuring number of spatial stream for monitor interface is causing
5773
* target assert in qca9888 and qca6174.
5774
*/
5775
if (ar->cfg_tx_chainmask && (vif->type != NL80211_IFTYPE_MONITOR)) {
5776
u16 nss = get_nss_from_chainmask(ar->cfg_tx_chainmask);
5777
5778
vdev_param = ar->wmi.vdev_param->nss;
5779
ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
5780
nss);
5781
if (ret) {
5782
ath10k_warn(ar, "failed to set vdev %i chainmask 0x%x, nss %i: %d\n",
5783
arvif->vdev_id, ar->cfg_tx_chainmask, nss,
5784
ret);
5785
goto err_vdev_delete;
5786
}
5787
}
5788
5789
if (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
5790
arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
5791
ret = ath10k_peer_create(ar, vif, NULL, arvif->vdev_id,
5792
vif->addr, WMI_PEER_TYPE_DEFAULT);
5793
if (ret) {
5794
ath10k_warn(ar, "failed to create vdev %i peer for AP/IBSS: %d\n",
5795
arvif->vdev_id, ret);
5796
goto err_vdev_delete;
5797
}
5798
5799
spin_lock_bh(&ar->data_lock);
5800
5801
peer = ath10k_peer_find(ar, arvif->vdev_id, vif->addr);
5802
if (!peer) {
5803
ath10k_warn(ar, "failed to lookup peer %pM on vdev %i\n",
5804
vif->addr, arvif->vdev_id);
5805
spin_unlock_bh(&ar->data_lock);
5806
ret = -ENOENT;
5807
goto err_peer_delete;
5808
}
5809
5810
arvif->peer_id = find_first_bit(peer->peer_ids,
5811
ATH10K_MAX_NUM_PEER_IDS);
5812
5813
spin_unlock_bh(&ar->data_lock);
5814
} else {
5815
arvif->peer_id = HTT_INVALID_PEERID;
5816
}
5817
5818
if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
5819
ret = ath10k_mac_set_kickout(arvif);
5820
if (ret) {
5821
ath10k_warn(ar, "failed to set vdev %i kickout parameters: %d\n",
5822
arvif->vdev_id, ret);
5823
goto err_peer_delete;
5824
}
5825
}
5826
5827
if (arvif->vdev_type == WMI_VDEV_TYPE_STA) {
5828
param = WMI_STA_PS_PARAM_RX_WAKE_POLICY;
5829
value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
5830
ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
5831
param, value);
5832
if (ret) {
5833
ath10k_warn(ar, "failed to set vdev %i RX wake policy: %d\n",
5834
arvif->vdev_id, ret);
5835
goto err_peer_delete;
5836
}
5837
5838
ret = ath10k_mac_vif_recalc_ps_wake_threshold(arvif);
5839
if (ret) {
5840
ath10k_warn(ar, "failed to recalc ps wake threshold on vdev %i: %d\n",
5841
arvif->vdev_id, ret);
5842
goto err_peer_delete;
5843
}
5844
5845
ret = ath10k_mac_vif_recalc_ps_poll_count(arvif);
5846
if (ret) {
5847
ath10k_warn(ar, "failed to recalc ps poll count on vdev %i: %d\n",
5848
arvif->vdev_id, ret);
5849
goto err_peer_delete;
5850
}
5851
}
5852
5853
ret = ath10k_mac_set_txbf_conf(arvif);
5854
if (ret) {
5855
ath10k_warn(ar, "failed to set txbf for vdev %d: %d\n",
5856
arvif->vdev_id, ret);
5857
goto err_peer_delete;
5858
}
5859
5860
ret = ath10k_mac_set_rts(arvif, ar->hw->wiphy->rts_threshold);
5861
if (ret) {
5862
ath10k_warn(ar, "failed to set rts threshold for vdev %d: %d\n",
5863
arvif->vdev_id, ret);
5864
goto err_peer_delete;
5865
}
5866
5867
arvif->txpower = vif->bss_conf.txpower;
5868
ret = ath10k_mac_txpower_recalc(ar);
5869
if (ret) {
5870
ath10k_warn(ar, "failed to recalc tx power: %d\n", ret);
5871
goto err_peer_delete;
5872
}
5873
5874
if (test_bit(WMI_SERVICE_RTT_RESPONDER_ROLE, ar->wmi.svc_map)) {
5875
vdev_param = ar->wmi.vdev_param->rtt_responder_role;
5876
ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
5877
arvif->ftm_responder);
5878
5879
/* It is harmless to not set FTM role. Do not warn */
5880
if (ret && ret != -EOPNOTSUPP)
5881
ath10k_warn(ar, "failed to set vdev %i FTM Responder: %d\n",
5882
arvif->vdev_id, ret);
5883
}
5884
5885
if (vif->type == NL80211_IFTYPE_MONITOR) {
5886
ar->monitor_arvif = arvif;
5887
ret = ath10k_monitor_recalc(ar);
5888
if (ret) {
5889
ath10k_warn(ar, "failed to recalc monitor: %d\n", ret);
5890
goto err_peer_delete;
5891
}
5892
}
5893
5894
spin_lock_bh(&ar->htt.tx_lock);
5895
if (!ar->tx_paused)
5896
ieee80211_wake_queue(ar->hw, arvif->vdev_id);
5897
spin_unlock_bh(&ar->htt.tx_lock);
5898
5899
mutex_unlock(&ar->conf_mutex);
5900
return 0;
5901
5902
err_peer_delete:
5903
if (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
5904
arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
5905
ath10k_wmi_peer_delete(ar, arvif->vdev_id, vif->addr);
5906
ath10k_wait_for_peer_delete_done(ar, arvif->vdev_id,
5907
vif->addr);
5908
}
5909
5910
err_vdev_delete:
5911
ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
5912
ar->free_vdev_map |= 1LL << arvif->vdev_id;
5913
spin_lock_bh(&ar->data_lock);
5914
list_del(&arvif->list);
5915
spin_unlock_bh(&ar->data_lock);
5916
5917
err:
5918
if (arvif->beacon_buf) {
5919
if (ar->bus_param.dev_type == ATH10K_DEV_TYPE_HL)
5920
kfree(arvif->beacon_buf);
5921
else
5922
dma_free_coherent(ar->dev, IEEE80211_MAX_FRAME_LEN,
5923
arvif->beacon_buf,
5924
arvif->beacon_paddr);
5925
arvif->beacon_buf = NULL;
5926
}
5927
5928
mutex_unlock(&ar->conf_mutex);
5929
5930
return ret;
5931
}
5932
5933
static void ath10k_mac_vif_tx_unlock_all(struct ath10k_vif *arvif)
5934
{
5935
int i;
5936
5937
for (i = 0; i < BITS_PER_LONG; i++)
5938
ath10k_mac_vif_tx_unlock(arvif, i);
5939
}
5940
5941
static void ath10k_remove_interface(struct ieee80211_hw *hw,
5942
struct ieee80211_vif *vif)
5943
{
5944
struct ath10k *ar = hw->priv;
5945
struct ath10k_vif *arvif = (void *)vif->drv_priv;
5946
struct ath10k_peer *peer;
5947
int ret;
5948
int i;
5949
5950
cancel_work_sync(&arvif->ap_csa_work);
5951
cancel_delayed_work_sync(&arvif->connection_loss_work);
5952
5953
mutex_lock(&ar->conf_mutex);
5954
5955
ret = ath10k_spectral_vif_stop(arvif);
5956
if (ret)
5957
ath10k_warn(ar, "failed to stop spectral for vdev %i: %d\n",
5958
arvif->vdev_id, ret);
5959
5960
ar->free_vdev_map |= 1LL << arvif->vdev_id;
5961
spin_lock_bh(&ar->data_lock);
5962
list_del(&arvif->list);
5963
spin_unlock_bh(&ar->data_lock);
5964
5965
if (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
5966
arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
5967
ret = ath10k_wmi_peer_delete(arvif->ar, arvif->vdev_id,
5968
vif->addr);
5969
if (ret)
5970
ath10k_warn(ar, "failed to submit AP/IBSS self-peer removal on vdev %i: %d\n",
5971
arvif->vdev_id, ret);
5972
5973
ath10k_wait_for_peer_delete_done(ar, arvif->vdev_id,
5974
vif->addr);
5975
kfree(arvif->u.ap.noa_data);
5976
}
5977
5978
ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i delete (remove interface)\n",
5979
arvif->vdev_id);
5980
5981
ret = ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
5982
if (ret)
5983
ath10k_warn(ar, "failed to delete WMI vdev %i: %d\n",
5984
arvif->vdev_id, ret);
5985
5986
ret = ath10k_vdev_delete_sync(ar);
5987
if (ret) {
5988
ath10k_warn(ar, "Error in receiving vdev delete response: %d\n", ret);
5989
goto out;
5990
}
5991
5992
/* Some firmware revisions don't notify host about self-peer removal
5993
* until after associated vdev is deleted.
5994
*/
5995
if (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
5996
arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
5997
ret = ath10k_wait_for_peer_deleted(ar, arvif->vdev_id,
5998
vif->addr);
5999
if (ret)
6000
ath10k_warn(ar, "failed to remove AP self-peer on vdev %i: %d\n",
6001
arvif->vdev_id, ret);
6002
6003
spin_lock_bh(&ar->data_lock);
6004
ar->num_peers--;
6005
spin_unlock_bh(&ar->data_lock);
6006
}
6007
6008
spin_lock_bh(&ar->data_lock);
6009
for (i = 0; i < ARRAY_SIZE(ar->peer_map); i++) {
6010
peer = ar->peer_map[i];
6011
if (!peer)
6012
continue;
6013
6014
if (peer->vif == vif) {
6015
ath10k_warn(ar, "found vif peer %pM entry on vdev %i after it was supposedly removed\n",
6016
vif->addr, arvif->vdev_id);
6017
peer->vif = NULL;
6018
}
6019
}
6020
6021
/* Clean this up late, less opportunity for firmware to access
6022
* DMA memory we have deleted.
6023
*/
6024
ath10k_mac_vif_beacon_cleanup(arvif);
6025
spin_unlock_bh(&ar->data_lock);
6026
6027
ath10k_peer_cleanup(ar, arvif->vdev_id);
6028
ath10k_mac_txq_unref(ar, vif->txq);
6029
6030
if (vif->type == NL80211_IFTYPE_MONITOR) {
6031
ar->monitor_arvif = NULL;
6032
ret = ath10k_monitor_recalc(ar);
6033
if (ret)
6034
ath10k_warn(ar, "failed to recalc monitor: %d\n", ret);
6035
}
6036
6037
ret = ath10k_mac_txpower_recalc(ar);
6038
if (ret)
6039
ath10k_warn(ar, "failed to recalc tx power: %d\n", ret);
6040
6041
spin_lock_bh(&ar->htt.tx_lock);
6042
ath10k_mac_vif_tx_unlock_all(arvif);
6043
spin_unlock_bh(&ar->htt.tx_lock);
6044
6045
ath10k_mac_txq_unref(ar, vif->txq);
6046
6047
out:
6048
mutex_unlock(&ar->conf_mutex);
6049
}
6050
6051
/*
6052
* FIXME: Has to be verified.
6053
*/
6054
#define SUPPORTED_FILTERS \
6055
(FIF_ALLMULTI | \
6056
FIF_CONTROL | \
6057
FIF_PSPOLL | \
6058
FIF_OTHER_BSS | \
6059
FIF_BCN_PRBRESP_PROMISC | \
6060
FIF_PROBE_REQ | \
6061
FIF_FCSFAIL)
6062
6063
static void ath10k_configure_filter(struct ieee80211_hw *hw,
6064
unsigned int changed_flags,
6065
unsigned int *total_flags,
6066
u64 multicast)
6067
{
6068
struct ath10k *ar = hw->priv;
6069
int ret;
6070
unsigned int supported = SUPPORTED_FILTERS;
6071
6072
mutex_lock(&ar->conf_mutex);
6073
6074
if (ar->hw_params.mcast_frame_registration)
6075
supported |= FIF_MCAST_ACTION;
6076
6077
*total_flags &= supported;
6078
6079
ar->filter_flags = *total_flags;
6080
6081
ret = ath10k_monitor_recalc(ar);
6082
if (ret)
6083
ath10k_warn(ar, "failed to recalc monitor: %d\n", ret);
6084
6085
mutex_unlock(&ar->conf_mutex);
6086
}
6087
6088
static void ath10k_recalculate_mgmt_rate(struct ath10k *ar,
6089
struct ieee80211_vif *vif,
6090
struct cfg80211_chan_def *def)
6091
{
6092
struct ath10k_vif *arvif = (void *)vif->drv_priv;
6093
const struct ieee80211_supported_band *sband;
6094
u8 basic_rate_idx;
6095
int hw_rate_code;
6096
u32 vdev_param;
6097
u16 bitrate;
6098
int ret;
6099
6100
lockdep_assert_held(&ar->conf_mutex);
6101
6102
sband = ar->hw->wiphy->bands[def->chan->band];
6103
basic_rate_idx = ffs(vif->bss_conf.basic_rates) - 1;
6104
bitrate = sband->bitrates[basic_rate_idx].bitrate;
6105
6106
hw_rate_code = ath10k_mac_get_rate_hw_value(bitrate);
6107
if (hw_rate_code < 0) {
6108
ath10k_warn(ar, "bitrate not supported %d\n", bitrate);
6109
return;
6110
}
6111
6112
vdev_param = ar->wmi.vdev_param->mgmt_rate;
6113
ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
6114
hw_rate_code);
6115
if (ret)
6116
ath10k_warn(ar, "failed to set mgmt tx rate %d\n", ret);
6117
}
6118
6119
static void ath10k_bss_info_changed(struct ieee80211_hw *hw,
6120
struct ieee80211_vif *vif,
6121
struct ieee80211_bss_conf *info,
6122
u64 changed)
6123
{
6124
struct ath10k *ar = hw->priv;
6125
struct ath10k_vif *arvif = (void *)vif->drv_priv;
6126
struct cfg80211_chan_def def;
6127
u32 vdev_param, pdev_param, slottime, preamble;
6128
u16 bitrate, hw_value;
6129
u8 rate, rateidx;
6130
int ret = 0, mcast_rate;
6131
enum nl80211_band band;
6132
6133
mutex_lock(&ar->conf_mutex);
6134
6135
if (changed & BSS_CHANGED_IBSS)
6136
ath10k_control_ibss(arvif, vif);
6137
6138
if (changed & BSS_CHANGED_BEACON_INT) {
6139
arvif->beacon_interval = info->beacon_int;
6140
vdev_param = ar->wmi.vdev_param->beacon_interval;
6141
ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
6142
arvif->beacon_interval);
6143
ath10k_dbg(ar, ATH10K_DBG_MAC,
6144
"mac vdev %d beacon_interval %d\n",
6145
arvif->vdev_id, arvif->beacon_interval);
6146
6147
if (ret)
6148
ath10k_warn(ar, "failed to set beacon interval for vdev %d: %i\n",
6149
arvif->vdev_id, ret);
6150
}
6151
6152
if (changed & BSS_CHANGED_BEACON) {
6153
ath10k_dbg(ar, ATH10K_DBG_MAC,
6154
"vdev %d set beacon tx mode to staggered\n",
6155
arvif->vdev_id);
6156
6157
pdev_param = ar->wmi.pdev_param->beacon_tx_mode;
6158
ret = ath10k_wmi_pdev_set_param(ar, pdev_param,
6159
WMI_BEACON_STAGGERED_MODE);
6160
if (ret)
6161
ath10k_warn(ar, "failed to set beacon mode for vdev %d: %i\n",
6162
arvif->vdev_id, ret);
6163
6164
ret = ath10k_mac_setup_bcn_tmpl(arvif);
6165
if (ret)
6166
ath10k_warn(ar, "failed to update beacon template: %d\n",
6167
ret);
6168
6169
if (ieee80211_vif_is_mesh(vif)) {
6170
/* mesh doesn't use SSID but firmware needs it */
6171
arvif->u.ap.ssid_len = 4;
6172
memcpy(arvif->u.ap.ssid, "mesh", arvif->u.ap.ssid_len);
6173
}
6174
}
6175
6176
if (changed & BSS_CHANGED_AP_PROBE_RESP) {
6177
ret = ath10k_mac_setup_prb_tmpl(arvif);
6178
if (ret)
6179
ath10k_warn(ar, "failed to setup probe resp template on vdev %i: %d\n",
6180
arvif->vdev_id, ret);
6181
}
6182
6183
if (changed & (BSS_CHANGED_BEACON_INFO | BSS_CHANGED_BEACON)) {
6184
arvif->dtim_period = info->dtim_period;
6185
6186
ath10k_dbg(ar, ATH10K_DBG_MAC,
6187
"mac vdev %d dtim_period %d\n",
6188
arvif->vdev_id, arvif->dtim_period);
6189
6190
vdev_param = ar->wmi.vdev_param->dtim_period;
6191
ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
6192
arvif->dtim_period);
6193
if (ret)
6194
ath10k_warn(ar, "failed to set dtim period for vdev %d: %i\n",
6195
arvif->vdev_id, ret);
6196
}
6197
6198
if (changed & BSS_CHANGED_SSID &&
6199
vif->type == NL80211_IFTYPE_AP) {
6200
arvif->u.ap.ssid_len = vif->cfg.ssid_len;
6201
if (vif->cfg.ssid_len)
6202
memcpy(arvif->u.ap.ssid, vif->cfg.ssid,
6203
vif->cfg.ssid_len);
6204
arvif->u.ap.hidden_ssid = info->hidden_ssid;
6205
}
6206
6207
if (changed & BSS_CHANGED_BSSID && !is_zero_ether_addr(info->bssid))
6208
ether_addr_copy(arvif->bssid, info->bssid);
6209
6210
if (changed & BSS_CHANGED_FTM_RESPONDER &&
6211
arvif->ftm_responder != info->ftm_responder &&
6212
test_bit(WMI_SERVICE_RTT_RESPONDER_ROLE, ar->wmi.svc_map)) {
6213
arvif->ftm_responder = info->ftm_responder;
6214
6215
vdev_param = ar->wmi.vdev_param->rtt_responder_role;
6216
ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
6217
arvif->ftm_responder);
6218
6219
ath10k_dbg(ar, ATH10K_DBG_MAC,
6220
"mac vdev %d ftm_responder %d:ret %d\n",
6221
arvif->vdev_id, arvif->ftm_responder, ret);
6222
}
6223
6224
if (changed & BSS_CHANGED_BEACON_ENABLED)
6225
ath10k_control_beaconing(arvif, info);
6226
6227
if (changed & BSS_CHANGED_ERP_CTS_PROT) {
6228
arvif->use_cts_prot = info->use_cts_prot;
6229
6230
ret = ath10k_recalc_rtscts_prot(arvif);
6231
if (ret)
6232
ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
6233
arvif->vdev_id, ret);
6234
6235
if (ath10k_mac_can_set_cts_prot(arvif)) {
6236
ret = ath10k_mac_set_cts_prot(arvif);
6237
if (ret)
6238
ath10k_warn(ar, "failed to set cts protection for vdev %d: %d\n",
6239
arvif->vdev_id, ret);
6240
}
6241
}
6242
6243
if (changed & BSS_CHANGED_ERP_SLOT) {
6244
if (info->use_short_slot)
6245
slottime = WMI_VDEV_SLOT_TIME_SHORT; /* 9us */
6246
6247
else
6248
slottime = WMI_VDEV_SLOT_TIME_LONG; /* 20us */
6249
6250
ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d slot_time %d\n",
6251
arvif->vdev_id, slottime);
6252
6253
vdev_param = ar->wmi.vdev_param->slot_time;
6254
ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
6255
slottime);
6256
if (ret)
6257
ath10k_warn(ar, "failed to set erp slot for vdev %d: %i\n",
6258
arvif->vdev_id, ret);
6259
}
6260
6261
if (changed & BSS_CHANGED_ERP_PREAMBLE) {
6262
if (info->use_short_preamble)
6263
preamble = WMI_VDEV_PREAMBLE_SHORT;
6264
else
6265
preamble = WMI_VDEV_PREAMBLE_LONG;
6266
6267
ath10k_dbg(ar, ATH10K_DBG_MAC,
6268
"mac vdev %d preamble %dn",
6269
arvif->vdev_id, preamble);
6270
6271
vdev_param = ar->wmi.vdev_param->preamble;
6272
ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
6273
preamble);
6274
if (ret)
6275
ath10k_warn(ar, "failed to set preamble for vdev %d: %i\n",
6276
arvif->vdev_id, ret);
6277
}
6278
6279
if (changed & BSS_CHANGED_ASSOC) {
6280
if (vif->cfg.assoc) {
6281
/* Workaround: Make sure monitor vdev is not running
6282
* when associating to prevent some firmware revisions
6283
* (e.g. 10.1 and 10.2) from crashing.
6284
*/
6285
if (ar->monitor_started)
6286
ath10k_monitor_stop(ar);
6287
ath10k_bss_assoc(hw, vif, info);
6288
ath10k_monitor_recalc(ar);
6289
} else {
6290
ath10k_bss_disassoc(hw, vif);
6291
}
6292
}
6293
6294
if (changed & BSS_CHANGED_TXPOWER) {
6295
ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev_id %i txpower %d\n",
6296
arvif->vdev_id, info->txpower);
6297
6298
arvif->txpower = info->txpower;
6299
ret = ath10k_mac_txpower_recalc(ar);
6300
if (ret)
6301
ath10k_warn(ar, "failed to recalc tx power: %d\n", ret);
6302
}
6303
6304
if (changed & BSS_CHANGED_PS) {
6305
arvif->ps = vif->cfg.ps;
6306
6307
ret = ath10k_config_ps(ar);
6308
if (ret)
6309
ath10k_warn(ar, "failed to setup ps on vdev %i: %d\n",
6310
arvif->vdev_id, ret);
6311
}
6312
6313
if (changed & BSS_CHANGED_MCAST_RATE &&
6314
!ath10k_mac_vif_chan(arvif->vif, &def)) {
6315
band = def.chan->band;
6316
mcast_rate = vif->bss_conf.mcast_rate[band];
6317
if (mcast_rate > 0)
6318
rateidx = mcast_rate - 1;
6319
else
6320
rateidx = ffs(vif->bss_conf.basic_rates) - 1;
6321
6322
if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY)
6323
rateidx += ATH10K_MAC_FIRST_OFDM_RATE_IDX;
6324
6325
bitrate = ath10k_wmi_legacy_rates[rateidx].bitrate;
6326
hw_value = ath10k_wmi_legacy_rates[rateidx].hw_value;
6327
if (ath10k_mac_bitrate_is_cck(bitrate))
6328
preamble = WMI_RATE_PREAMBLE_CCK;
6329
else
6330
preamble = WMI_RATE_PREAMBLE_OFDM;
6331
6332
rate = ATH10K_HW_RATECODE(hw_value, 0, preamble);
6333
6334
ath10k_dbg(ar, ATH10K_DBG_MAC,
6335
"mac vdev %d mcast_rate %x\n",
6336
arvif->vdev_id, rate);
6337
6338
vdev_param = ar->wmi.vdev_param->mcast_data_rate;
6339
ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
6340
vdev_param, rate);
6341
if (ret)
6342
ath10k_warn(ar,
6343
"failed to set mcast rate on vdev %i: %d\n",
6344
arvif->vdev_id, ret);
6345
6346
vdev_param = ar->wmi.vdev_param->bcast_data_rate;
6347
ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
6348
vdev_param, rate);
6349
if (ret)
6350
ath10k_warn(ar,
6351
"failed to set bcast rate on vdev %i: %d\n",
6352
arvif->vdev_id, ret);
6353
}
6354
6355
if (changed & BSS_CHANGED_BASIC_RATES &&
6356
!ath10k_mac_vif_chan(arvif->vif, &def))
6357
ath10k_recalculate_mgmt_rate(ar, vif, &def);
6358
6359
mutex_unlock(&ar->conf_mutex);
6360
}
6361
6362
static void ath10k_mac_op_set_coverage_class(struct ieee80211_hw *hw, int radio_idx,
6363
s16 value)
6364
{
6365
struct ath10k *ar = hw->priv;
6366
6367
/* This function should never be called if setting the coverage class
6368
* is not supported on this hardware.
6369
*/
6370
if (!ar->hw_params.hw_ops->set_coverage_class) {
6371
WARN_ON_ONCE(1);
6372
return;
6373
}
6374
ar->hw_params.hw_ops->set_coverage_class(ar, -1, value);
6375
}
6376
6377
struct ath10k_mac_tdls_iter_data {
6378
u32 num_tdls_stations;
6379
struct ieee80211_vif *curr_vif;
6380
};
6381
6382
static void ath10k_mac_tdls_vif_stations_count_iter(void *data,
6383
struct ieee80211_sta *sta)
6384
{
6385
struct ath10k_mac_tdls_iter_data *iter_data = data;
6386
struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
6387
struct ieee80211_vif *sta_vif = arsta->arvif->vif;
6388
6389
if (sta->tdls && sta_vif == iter_data->curr_vif)
6390
iter_data->num_tdls_stations++;
6391
}
6392
6393
static int ath10k_mac_tdls_vif_stations_count(struct ieee80211_hw *hw,
6394
struct ieee80211_vif *vif)
6395
{
6396
struct ath10k_mac_tdls_iter_data data = {};
6397
6398
data.curr_vif = vif;
6399
6400
ieee80211_iterate_stations_atomic(hw,
6401
ath10k_mac_tdls_vif_stations_count_iter,
6402
&data);
6403
return data.num_tdls_stations;
6404
}
6405
6406
static int ath10k_hw_scan(struct ieee80211_hw *hw,
6407
struct ieee80211_vif *vif,
6408
struct ieee80211_scan_request *hw_req)
6409
{
6410
struct ath10k *ar = hw->priv;
6411
struct ath10k_vif *arvif = (void *)vif->drv_priv;
6412
struct cfg80211_scan_request *req = &hw_req->req;
6413
struct wmi_start_scan_arg *arg = NULL;
6414
int ret = 0;
6415
int i;
6416
u32 scan_timeout;
6417
6418
mutex_lock(&ar->conf_mutex);
6419
6420
if (ath10k_mac_tdls_vif_stations_count(hw, vif) > 0) {
6421
ret = -EBUSY;
6422
goto exit;
6423
}
6424
6425
spin_lock_bh(&ar->data_lock);
6426
switch (ar->scan.state) {
6427
case ATH10K_SCAN_IDLE:
6428
reinit_completion(&ar->scan.started);
6429
reinit_completion(&ar->scan.completed);
6430
ar->scan.state = ATH10K_SCAN_STARTING;
6431
ar->scan.is_roc = false;
6432
ar->scan.vdev_id = arvif->vdev_id;
6433
ret = 0;
6434
break;
6435
case ATH10K_SCAN_STARTING:
6436
case ATH10K_SCAN_RUNNING:
6437
case ATH10K_SCAN_ABORTING:
6438
ret = -EBUSY;
6439
break;
6440
}
6441
spin_unlock_bh(&ar->data_lock);
6442
6443
if (ret)
6444
goto exit;
6445
6446
arg = kzalloc(sizeof(*arg), GFP_KERNEL);
6447
if (!arg) {
6448
ret = -ENOMEM;
6449
goto exit;
6450
}
6451
6452
ath10k_wmi_start_scan_init(ar, arg);
6453
arg->vdev_id = arvif->vdev_id;
6454
arg->scan_id = ATH10K_SCAN_ID;
6455
6456
if (req->ie_len) {
6457
arg->ie_len = req->ie_len;
6458
memcpy(arg->ie, req->ie, arg->ie_len);
6459
}
6460
6461
if (req->n_ssids) {
6462
arg->n_ssids = req->n_ssids;
6463
for (i = 0; i < arg->n_ssids; i++) {
6464
arg->ssids[i].len = req->ssids[i].ssid_len;
6465
arg->ssids[i].ssid = req->ssids[i].ssid;
6466
}
6467
} else {
6468
arg->scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
6469
}
6470
6471
if (req->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
6472
arg->scan_ctrl_flags |= WMI_SCAN_ADD_SPOOFED_MAC_IN_PROBE_REQ;
6473
ether_addr_copy(arg->mac_addr.addr, req->mac_addr);
6474
ether_addr_copy(arg->mac_mask.addr, req->mac_addr_mask);
6475
}
6476
6477
if (req->n_channels) {
6478
arg->n_channels = req->n_channels;
6479
for (i = 0; i < arg->n_channels; i++)
6480
arg->channels[i] = req->channels[i]->center_freq;
6481
}
6482
6483
/* if duration is set, default dwell times will be overwritten */
6484
if (req->duration) {
6485
arg->dwell_time_active = req->duration;
6486
arg->dwell_time_passive = req->duration;
6487
arg->burst_duration_ms = req->duration;
6488
6489
scan_timeout = min_t(u32, arg->max_rest_time *
6490
(arg->n_channels - 1) + (req->duration +
6491
ATH10K_SCAN_CHANNEL_SWITCH_WMI_EVT_OVERHEAD) *
6492
arg->n_channels, arg->max_scan_time);
6493
} else {
6494
scan_timeout = arg->max_scan_time;
6495
}
6496
6497
/* Add a 200ms margin to account for event/command processing */
6498
scan_timeout += 200;
6499
6500
ret = ath10k_start_scan(ar, arg);
6501
if (ret) {
6502
ath10k_warn(ar, "failed to start hw scan: %d\n", ret);
6503
spin_lock_bh(&ar->data_lock);
6504
ar->scan.state = ATH10K_SCAN_IDLE;
6505
spin_unlock_bh(&ar->data_lock);
6506
}
6507
6508
ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
6509
msecs_to_jiffies(scan_timeout));
6510
6511
exit:
6512
kfree(arg);
6513
6514
mutex_unlock(&ar->conf_mutex);
6515
return ret;
6516
}
6517
6518
static void ath10k_cancel_hw_scan(struct ieee80211_hw *hw,
6519
struct ieee80211_vif *vif)
6520
{
6521
struct ath10k *ar = hw->priv;
6522
6523
mutex_lock(&ar->conf_mutex);
6524
ath10k_scan_abort(ar);
6525
mutex_unlock(&ar->conf_mutex);
6526
6527
cancel_delayed_work_sync(&ar->scan.timeout);
6528
}
6529
6530
static void ath10k_set_key_h_def_keyidx(struct ath10k *ar,
6531
struct ath10k_vif *arvif,
6532
enum set_key_cmd cmd,
6533
struct ieee80211_key_conf *key)
6534
{
6535
u32 vdev_param = arvif->ar->wmi.vdev_param->def_keyid;
6536
int ret;
6537
6538
/* 10.1 firmware branch requires default key index to be set to group
6539
* key index after installing it. Otherwise FW/HW Txes corrupted
6540
* frames with multi-vif APs. This is not required for main firmware
6541
* branch (e.g. 636).
6542
*
6543
* This is also needed for 636 fw for IBSS-RSN to work more reliably.
6544
*
6545
* FIXME: It remains unknown if this is required for multi-vif STA
6546
* interfaces on 10.1.
6547
*/
6548
6549
if (arvif->vdev_type != WMI_VDEV_TYPE_AP &&
6550
arvif->vdev_type != WMI_VDEV_TYPE_IBSS)
6551
return;
6552
6553
if (key->cipher == WLAN_CIPHER_SUITE_WEP40)
6554
return;
6555
6556
if (key->cipher == WLAN_CIPHER_SUITE_WEP104)
6557
return;
6558
6559
if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
6560
return;
6561
6562
if (cmd != SET_KEY)
6563
return;
6564
6565
ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
6566
key->keyidx);
6567
if (ret)
6568
ath10k_warn(ar, "failed to set vdev %i group key as default key: %d\n",
6569
arvif->vdev_id, ret);
6570
}
6571
6572
static int ath10k_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
6573
struct ieee80211_vif *vif, struct ieee80211_sta *sta,
6574
struct ieee80211_key_conf *key)
6575
{
6576
struct ath10k *ar = hw->priv;
6577
struct ath10k_vif *arvif = (void *)vif->drv_priv;
6578
struct ath10k_sta *arsta;
6579
struct ath10k_peer *peer;
6580
const u8 *peer_addr;
6581
bool is_wep = key->cipher == WLAN_CIPHER_SUITE_WEP40 ||
6582
key->cipher == WLAN_CIPHER_SUITE_WEP104;
6583
int ret = 0;
6584
int ret2;
6585
u32 flags = 0;
6586
u32 flags2;
6587
6588
/* this one needs to be done in software */
6589
if (key->cipher == WLAN_CIPHER_SUITE_AES_CMAC ||
6590
key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_128 ||
6591
key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_256 ||
6592
key->cipher == WLAN_CIPHER_SUITE_BIP_CMAC_256)
6593
return 1;
6594
6595
if (arvif->nohwcrypt)
6596
return 1;
6597
6598
if (key->keyidx > WMI_MAX_KEY_INDEX)
6599
return -ENOSPC;
6600
6601
mutex_lock(&ar->conf_mutex);
6602
6603
if (sta) {
6604
arsta = (struct ath10k_sta *)sta->drv_priv;
6605
peer_addr = sta->addr;
6606
spin_lock_bh(&ar->data_lock);
6607
arsta->ucast_cipher = key->cipher;
6608
spin_unlock_bh(&ar->data_lock);
6609
} else if (arvif->vdev_type == WMI_VDEV_TYPE_STA) {
6610
peer_addr = vif->bss_conf.bssid;
6611
} else {
6612
peer_addr = vif->addr;
6613
}
6614
6615
key->hw_key_idx = key->keyidx;
6616
6617
if (is_wep) {
6618
if (cmd == SET_KEY)
6619
arvif->wep_keys[key->keyidx] = key;
6620
else
6621
arvif->wep_keys[key->keyidx] = NULL;
6622
}
6623
6624
/* the peer should not disappear in mid-way (unless FW goes awry) since
6625
* we already hold conf_mutex. we just make sure its there now.
6626
*/
6627
spin_lock_bh(&ar->data_lock);
6628
peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
6629
spin_unlock_bh(&ar->data_lock);
6630
6631
if (!peer) {
6632
if (cmd == SET_KEY) {
6633
ath10k_warn(ar, "failed to install key for non-existent peer %pM\n",
6634
peer_addr);
6635
ret = -EOPNOTSUPP;
6636
goto exit;
6637
} else {
6638
/* if the peer doesn't exist there is no key to disable anymore */
6639
goto exit;
6640
}
6641
}
6642
6643
if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
6644
flags |= WMI_KEY_PAIRWISE;
6645
else
6646
flags |= WMI_KEY_GROUP;
6647
6648
if (is_wep) {
6649
if (cmd == DISABLE_KEY)
6650
ath10k_clear_vdev_key(arvif, key);
6651
6652
/* When WEP keys are uploaded it's possible that there are
6653
* stations associated already (e.g. when merging) without any
6654
* keys. Static WEP needs an explicit per-peer key upload.
6655
*/
6656
if (vif->type == NL80211_IFTYPE_ADHOC &&
6657
cmd == SET_KEY)
6658
ath10k_mac_vif_update_wep_key(arvif, key);
6659
6660
/* 802.1x never sets the def_wep_key_idx so each set_key()
6661
* call changes default tx key.
6662
*
6663
* Static WEP sets def_wep_key_idx via .set_default_unicast_key
6664
* after first set_key().
6665
*/
6666
if (cmd == SET_KEY && arvif->def_wep_key_idx == -1)
6667
flags |= WMI_KEY_TX_USAGE;
6668
}
6669
6670
ret = ath10k_install_key(arvif, key, cmd, peer_addr, flags);
6671
if (ret) {
6672
WARN_ON(ret > 0);
6673
ath10k_warn(ar, "failed to install key for vdev %i peer %pM: %d\n",
6674
arvif->vdev_id, peer_addr, ret);
6675
goto exit;
6676
}
6677
6678
/* mac80211 sets static WEP keys as groupwise while firmware requires
6679
* them to be installed twice as both pairwise and groupwise.
6680
*/
6681
if (is_wep && !sta && vif->type == NL80211_IFTYPE_STATION) {
6682
flags2 = flags;
6683
flags2 &= ~WMI_KEY_GROUP;
6684
flags2 |= WMI_KEY_PAIRWISE;
6685
6686
ret = ath10k_install_key(arvif, key, cmd, peer_addr, flags2);
6687
if (ret) {
6688
WARN_ON(ret > 0);
6689
ath10k_warn(ar, "failed to install (ucast) key for vdev %i peer %pM: %d\n",
6690
arvif->vdev_id, peer_addr, ret);
6691
ret2 = ath10k_install_key(arvif, key, DISABLE_KEY,
6692
peer_addr, flags);
6693
if (ret2) {
6694
WARN_ON(ret2 > 0);
6695
ath10k_warn(ar, "failed to disable (mcast) key for vdev %i peer %pM: %d\n",
6696
arvif->vdev_id, peer_addr, ret2);
6697
}
6698
goto exit;
6699
}
6700
}
6701
6702
ath10k_set_key_h_def_keyidx(ar, arvif, cmd, key);
6703
6704
spin_lock_bh(&ar->data_lock);
6705
peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
6706
if (peer && cmd == SET_KEY)
6707
peer->keys[key->keyidx] = key;
6708
else if (peer && cmd == DISABLE_KEY)
6709
peer->keys[key->keyidx] = NULL;
6710
else if (peer == NULL)
6711
/* impossible unless FW goes crazy */
6712
ath10k_warn(ar, "Peer %pM disappeared!\n", peer_addr);
6713
spin_unlock_bh(&ar->data_lock);
6714
6715
if (sta && sta->tdls)
6716
ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
6717
ar->wmi.peer_param->authorize, 1);
6718
else if (sta && cmd == SET_KEY && (key->flags & IEEE80211_KEY_FLAG_PAIRWISE))
6719
ath10k_wmi_peer_set_param(ar, arvif->vdev_id, peer_addr,
6720
ar->wmi.peer_param->authorize, 1);
6721
6722
exit:
6723
mutex_unlock(&ar->conf_mutex);
6724
return ret;
6725
}
6726
6727
static void ath10k_set_default_unicast_key(struct ieee80211_hw *hw,
6728
struct ieee80211_vif *vif,
6729
int keyidx)
6730
{
6731
struct ath10k *ar = hw->priv;
6732
struct ath10k_vif *arvif = (void *)vif->drv_priv;
6733
int ret;
6734
6735
mutex_lock(&arvif->ar->conf_mutex);
6736
6737
if (arvif->ar->state != ATH10K_STATE_ON)
6738
goto unlock;
6739
6740
ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d set keyidx %d\n",
6741
arvif->vdev_id, keyidx);
6742
6743
ret = ath10k_wmi_vdev_set_param(arvif->ar,
6744
arvif->vdev_id,
6745
arvif->ar->wmi.vdev_param->def_keyid,
6746
keyidx);
6747
6748
if (ret) {
6749
ath10k_warn(ar, "failed to update wep key index for vdev %d: %d\n",
6750
arvif->vdev_id,
6751
ret);
6752
goto unlock;
6753
}
6754
6755
arvif->def_wep_key_idx = keyidx;
6756
6757
unlock:
6758
mutex_unlock(&arvif->ar->conf_mutex);
6759
}
6760
6761
static void ath10k_sta_rc_update_wk(struct work_struct *wk)
6762
{
6763
struct ath10k *ar;
6764
struct ath10k_vif *arvif;
6765
struct ath10k_sta *arsta;
6766
struct ieee80211_sta *sta;
6767
struct cfg80211_chan_def def;
6768
enum nl80211_band band;
6769
const u8 *ht_mcs_mask;
6770
const u16 *vht_mcs_mask;
6771
u32 changed, bw, nss, smps;
6772
int err;
6773
6774
arsta = container_of(wk, struct ath10k_sta, update_wk);
6775
sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv);
6776
arvif = arsta->arvif;
6777
ar = arvif->ar;
6778
6779
if (WARN_ON(ath10k_mac_vif_chan(arvif->vif, &def)))
6780
return;
6781
6782
band = def.chan->band;
6783
ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
6784
vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
6785
6786
spin_lock_bh(&ar->data_lock);
6787
6788
changed = arsta->changed;
6789
arsta->changed = 0;
6790
6791
bw = arsta->bw;
6792
nss = arsta->nss;
6793
smps = arsta->smps;
6794
6795
spin_unlock_bh(&ar->data_lock);
6796
6797
mutex_lock(&ar->conf_mutex);
6798
6799
nss = max_t(u32, 1, nss);
6800
nss = min(nss, max(ath10k_mac_max_ht_nss(ht_mcs_mask),
6801
ath10k_mac_max_vht_nss(vht_mcs_mask)));
6802
6803
if (changed & IEEE80211_RC_BW_CHANGED) {
6804
enum wmi_phy_mode mode;
6805
6806
mode = chan_to_phymode(&def);
6807
ath10k_dbg(ar, ATH10K_DBG_STA, "mac update sta %pM peer bw %d phymode %d\n",
6808
sta->addr, bw, mode);
6809
6810
err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
6811
ar->wmi.peer_param->phymode, mode);
6812
if (err) {
6813
ath10k_warn(ar, "failed to update STA %pM peer phymode %d: %d\n",
6814
sta->addr, mode, err);
6815
goto exit;
6816
}
6817
6818
err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
6819
ar->wmi.peer_param->chan_width, bw);
6820
if (err)
6821
ath10k_warn(ar, "failed to update STA %pM peer bw %d: %d\n",
6822
sta->addr, bw, err);
6823
}
6824
6825
if (changed & IEEE80211_RC_NSS_CHANGED) {
6826
ath10k_dbg(ar, ATH10K_DBG_STA, "mac update sta %pM nss %d\n",
6827
sta->addr, nss);
6828
6829
err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
6830
ar->wmi.peer_param->nss, nss);
6831
if (err)
6832
ath10k_warn(ar, "failed to update STA %pM nss %d: %d\n",
6833
sta->addr, nss, err);
6834
}
6835
6836
if (changed & IEEE80211_RC_SMPS_CHANGED) {
6837
ath10k_dbg(ar, ATH10K_DBG_STA, "mac update sta %pM smps %d\n",
6838
sta->addr, smps);
6839
6840
err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
6841
ar->wmi.peer_param->smps_state, smps);
6842
if (err)
6843
ath10k_warn(ar, "failed to update STA %pM smps %d: %d\n",
6844
sta->addr, smps, err);
6845
}
6846
6847
if (changed & IEEE80211_RC_SUPP_RATES_CHANGED) {
6848
ath10k_dbg(ar, ATH10K_DBG_STA, "mac update sta %pM supp rates\n",
6849
sta->addr);
6850
6851
err = ath10k_station_assoc(ar, arvif->vif, sta, true);
6852
if (err)
6853
ath10k_warn(ar, "failed to reassociate station: %pM\n",
6854
sta->addr);
6855
}
6856
6857
exit:
6858
mutex_unlock(&ar->conf_mutex);
6859
}
6860
6861
static int ath10k_mac_inc_num_stations(struct ath10k_vif *arvif,
6862
struct ieee80211_sta *sta)
6863
{
6864
struct ath10k *ar = arvif->ar;
6865
6866
lockdep_assert_held(&ar->conf_mutex);
6867
6868
if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
6869
return 0;
6870
6871
if (ar->num_stations >= ar->max_num_stations)
6872
return -ENOBUFS;
6873
6874
ar->num_stations++;
6875
6876
return 0;
6877
}
6878
6879
static void ath10k_mac_dec_num_stations(struct ath10k_vif *arvif,
6880
struct ieee80211_sta *sta)
6881
{
6882
struct ath10k *ar = arvif->ar;
6883
6884
lockdep_assert_held(&ar->conf_mutex);
6885
6886
if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
6887
return;
6888
6889
ar->num_stations--;
6890
}
6891
6892
static int ath10k_sta_set_txpwr(struct ieee80211_hw *hw,
6893
struct ieee80211_vif *vif,
6894
struct ieee80211_sta *sta)
6895
{
6896
struct ath10k *ar = hw->priv;
6897
struct ath10k_vif *arvif = (void *)vif->drv_priv;
6898
int ret = 0;
6899
s16 txpwr;
6900
6901
if (sta->deflink.txpwr.type == NL80211_TX_POWER_AUTOMATIC) {
6902
txpwr = 0;
6903
} else {
6904
txpwr = sta->deflink.txpwr.power;
6905
if (!txpwr)
6906
return -EINVAL;
6907
}
6908
6909
if (txpwr > ATH10K_TX_POWER_MAX_VAL || txpwr < ATH10K_TX_POWER_MIN_VAL)
6910
return -EINVAL;
6911
6912
mutex_lock(&ar->conf_mutex);
6913
6914
ret = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
6915
ar->wmi.peer_param->use_fixed_power, txpwr);
6916
if (ret) {
6917
ath10k_warn(ar, "failed to set tx power for station ret: %d\n",
6918
ret);
6919
goto out;
6920
}
6921
6922
out:
6923
mutex_unlock(&ar->conf_mutex);
6924
return ret;
6925
}
6926
6927
struct ath10k_mac_iter_tid_conf_data {
6928
struct ieee80211_vif *curr_vif;
6929
struct ath10k *ar;
6930
bool reset_config;
6931
};
6932
6933
static bool
6934
ath10k_mac_bitrate_mask_has_single_rate(struct ath10k *ar,
6935
enum nl80211_band band,
6936
const struct cfg80211_bitrate_mask *mask,
6937
int *vht_num_rates)
6938
{
6939
int num_rates = 0;
6940
int i, tmp;
6941
6942
num_rates += hweight32(mask->control[band].legacy);
6943
6944
for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++)
6945
num_rates += hweight8(mask->control[band].ht_mcs[i]);
6946
6947
*vht_num_rates = 0;
6948
for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
6949
tmp = hweight16(mask->control[band].vht_mcs[i]);
6950
num_rates += tmp;
6951
*vht_num_rates += tmp;
6952
}
6953
6954
return num_rates == 1;
6955
}
6956
6957
static int
6958
ath10k_mac_bitrate_mask_get_single_rate(struct ath10k *ar,
6959
enum nl80211_band band,
6960
const struct cfg80211_bitrate_mask *mask,
6961
u8 *rate, u8 *nss, bool vht_only)
6962
{
6963
int rate_idx;
6964
int i;
6965
u16 bitrate;
6966
u8 preamble;
6967
u8 hw_rate;
6968
6969
if (vht_only)
6970
goto next;
6971
6972
if (hweight32(mask->control[band].legacy) == 1) {
6973
rate_idx = ffs(mask->control[band].legacy) - 1;
6974
6975
if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY)
6976
rate_idx += ATH10K_MAC_FIRST_OFDM_RATE_IDX;
6977
6978
hw_rate = ath10k_wmi_legacy_rates[rate_idx].hw_value;
6979
bitrate = ath10k_wmi_legacy_rates[rate_idx].bitrate;
6980
6981
if (ath10k_mac_bitrate_is_cck(bitrate))
6982
preamble = WMI_RATE_PREAMBLE_CCK;
6983
else
6984
preamble = WMI_RATE_PREAMBLE_OFDM;
6985
6986
*nss = 1;
6987
*rate = preamble << 6 |
6988
(*nss - 1) << 4 |
6989
hw_rate << 0;
6990
6991
return 0;
6992
}
6993
6994
for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) {
6995
if (hweight8(mask->control[band].ht_mcs[i]) == 1) {
6996
*nss = i + 1;
6997
*rate = WMI_RATE_PREAMBLE_HT << 6 |
6998
(*nss - 1) << 4 |
6999
(ffs(mask->control[band].ht_mcs[i]) - 1);
7000
7001
return 0;
7002
}
7003
}
7004
7005
next:
7006
for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
7007
if (hweight16(mask->control[band].vht_mcs[i]) == 1) {
7008
*nss = i + 1;
7009
*rate = WMI_RATE_PREAMBLE_VHT << 6 |
7010
(*nss - 1) << 4 |
7011
(ffs(mask->control[band].vht_mcs[i]) - 1);
7012
7013
return 0;
7014
}
7015
}
7016
7017
return -EINVAL;
7018
}
7019
7020
static int ath10k_mac_validate_rate_mask(struct ath10k *ar,
7021
struct ieee80211_sta *sta,
7022
u32 rate_ctrl_flag, u8 nss)
7023
{
7024
struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
7025
struct ieee80211_sta_vht_cap *vht_cap = &sta->deflink.vht_cap;
7026
7027
if (nss > sta->deflink.rx_nss) {
7028
ath10k_warn(ar, "Invalid nss field, configured %u limit %u\n",
7029
nss, sta->deflink.rx_nss);
7030
return -EINVAL;
7031
}
7032
7033
if (ATH10K_HW_PREAMBLE(rate_ctrl_flag) == WMI_RATE_PREAMBLE_VHT) {
7034
if (!vht_cap->vht_supported) {
7035
ath10k_warn(ar, "Invalid VHT rate for sta %pM\n",
7036
sta->addr);
7037
return -EINVAL;
7038
}
7039
} else if (ATH10K_HW_PREAMBLE(rate_ctrl_flag) == WMI_RATE_PREAMBLE_HT) {
7040
if (!ht_cap->ht_supported || vht_cap->vht_supported) {
7041
ath10k_warn(ar, "Invalid HT rate for sta %pM\n",
7042
sta->addr);
7043
return -EINVAL;
7044
}
7045
} else {
7046
if (ht_cap->ht_supported || vht_cap->vht_supported)
7047
return -EINVAL;
7048
}
7049
7050
return 0;
7051
}
7052
7053
static int
7054
ath10k_mac_tid_bitrate_config(struct ath10k *ar,
7055
struct ieee80211_vif *vif,
7056
struct ieee80211_sta *sta,
7057
u32 *rate_ctrl_flag, u8 *rate_ctrl,
7058
enum nl80211_tx_rate_setting txrate_type,
7059
const struct cfg80211_bitrate_mask *mask)
7060
{
7061
struct cfg80211_chan_def def;
7062
enum nl80211_band band;
7063
u8 nss, rate;
7064
int vht_num_rates, ret;
7065
7066
if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
7067
return -EINVAL;
7068
7069
if (txrate_type == NL80211_TX_RATE_AUTOMATIC) {
7070
*rate_ctrl = WMI_TID_CONFIG_RATE_CONTROL_AUTO;
7071
*rate_ctrl_flag = 0;
7072
return 0;
7073
}
7074
7075
band = def.chan->band;
7076
7077
if (!ath10k_mac_bitrate_mask_has_single_rate(ar, band, mask,
7078
&vht_num_rates)) {
7079
return -EINVAL;
7080
}
7081
7082
ret = ath10k_mac_bitrate_mask_get_single_rate(ar, band, mask,
7083
&rate, &nss, false);
7084
if (ret) {
7085
ath10k_warn(ar, "failed to get single rate: %d\n",
7086
ret);
7087
return ret;
7088
}
7089
7090
*rate_ctrl_flag = rate;
7091
7092
if (sta && ath10k_mac_validate_rate_mask(ar, sta, *rate_ctrl_flag, nss))
7093
return -EINVAL;
7094
7095
if (txrate_type == NL80211_TX_RATE_FIXED)
7096
*rate_ctrl = WMI_TID_CONFIG_RATE_CONTROL_FIXED_RATE;
7097
else if (txrate_type == NL80211_TX_RATE_LIMITED &&
7098
(test_bit(WMI_SERVICE_EXT_PEER_TID_CONFIGS_SUPPORT,
7099
ar->wmi.svc_map)))
7100
*rate_ctrl = WMI_PEER_TID_CONFIG_RATE_UPPER_CAP;
7101
else
7102
return -EOPNOTSUPP;
7103
7104
return 0;
7105
}
7106
7107
static int ath10k_mac_set_tid_config(struct ath10k *ar, struct ieee80211_sta *sta,
7108
struct ieee80211_vif *vif, u32 changed,
7109
struct wmi_per_peer_per_tid_cfg_arg *arg)
7110
{
7111
struct ath10k_vif *arvif = (void *)vif->drv_priv;
7112
struct ath10k_sta *arsta;
7113
int ret;
7114
7115
if (sta) {
7116
if (!sta->wme)
7117
return -EOPNOTSUPP;
7118
7119
arsta = (struct ath10k_sta *)sta->drv_priv;
7120
7121
if (changed & BIT(NL80211_TID_CONFIG_ATTR_NOACK)) {
7122
if ((arsta->retry_long[arg->tid] > 0 ||
7123
arsta->rate_code[arg->tid] > 0 ||
7124
arsta->ampdu[arg->tid] ==
7125
WMI_TID_CONFIG_AGGR_CONTROL_ENABLE) &&
7126
arg->ack_policy == WMI_PEER_TID_CONFIG_NOACK) {
7127
changed &= ~BIT(NL80211_TID_CONFIG_ATTR_NOACK);
7128
arg->ack_policy = 0;
7129
arg->aggr_control = 0;
7130
arg->rate_ctrl = 0;
7131
arg->rcode_flags = 0;
7132
}
7133
}
7134
7135
if (changed & BIT(NL80211_TID_CONFIG_ATTR_AMPDU_CTRL)) {
7136
if (arsta->noack[arg->tid] == WMI_PEER_TID_CONFIG_NOACK ||
7137
arvif->noack[arg->tid] == WMI_PEER_TID_CONFIG_NOACK) {
7138
arg->aggr_control = 0;
7139
changed &= ~BIT(NL80211_TID_CONFIG_ATTR_RETRY_LONG);
7140
}
7141
}
7142
7143
if (changed & (BIT(NL80211_TID_CONFIG_ATTR_TX_RATE) |
7144
BIT(NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE))) {
7145
if (arsta->noack[arg->tid] == WMI_PEER_TID_CONFIG_NOACK ||
7146
arvif->noack[arg->tid] == WMI_PEER_TID_CONFIG_NOACK) {
7147
arg->rate_ctrl = 0;
7148
arg->rcode_flags = 0;
7149
}
7150
}
7151
7152
ether_addr_copy(arg->peer_macaddr.addr, sta->addr);
7153
7154
ret = ath10k_wmi_set_per_peer_per_tid_cfg(ar, arg);
7155
if (ret)
7156
return ret;
7157
7158
/* Store the configured parameters in success case */
7159
if (changed & BIT(NL80211_TID_CONFIG_ATTR_NOACK)) {
7160
arsta->noack[arg->tid] = arg->ack_policy;
7161
arg->ack_policy = 0;
7162
arg->aggr_control = 0;
7163
arg->rate_ctrl = 0;
7164
arg->rcode_flags = 0;
7165
}
7166
7167
if (changed & BIT(NL80211_TID_CONFIG_ATTR_RETRY_LONG)) {
7168
arsta->retry_long[arg->tid] = arg->retry_count;
7169
arg->retry_count = 0;
7170
}
7171
7172
if (changed & BIT(NL80211_TID_CONFIG_ATTR_AMPDU_CTRL)) {
7173
arsta->ampdu[arg->tid] = arg->aggr_control;
7174
arg->aggr_control = 0;
7175
}
7176
7177
if (changed & (BIT(NL80211_TID_CONFIG_ATTR_TX_RATE) |
7178
BIT(NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE))) {
7179
arsta->rate_ctrl[arg->tid] = arg->rate_ctrl;
7180
arg->rate_ctrl = 0;
7181
arg->rcode_flags = 0;
7182
}
7183
7184
if (changed & BIT(NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL)) {
7185
arsta->rtscts[arg->tid] = arg->rtscts_ctrl;
7186
arg->ext_tid_cfg_bitmap = 0;
7187
}
7188
} else {
7189
if (changed & BIT(NL80211_TID_CONFIG_ATTR_NOACK)) {
7190
if ((arvif->retry_long[arg->tid] ||
7191
arvif->rate_code[arg->tid] ||
7192
arvif->ampdu[arg->tid] ==
7193
WMI_TID_CONFIG_AGGR_CONTROL_ENABLE) &&
7194
arg->ack_policy == WMI_PEER_TID_CONFIG_NOACK) {
7195
changed &= ~BIT(NL80211_TID_CONFIG_ATTR_NOACK);
7196
} else {
7197
arvif->noack[arg->tid] = arg->ack_policy;
7198
arvif->ampdu[arg->tid] = arg->aggr_control;
7199
arvif->rate_ctrl[arg->tid] = arg->rate_ctrl;
7200
}
7201
}
7202
7203
if (changed & BIT(NL80211_TID_CONFIG_ATTR_RETRY_LONG)) {
7204
if (arvif->noack[arg->tid] == WMI_PEER_TID_CONFIG_NOACK)
7205
changed &= ~BIT(NL80211_TID_CONFIG_ATTR_RETRY_LONG);
7206
else
7207
arvif->retry_long[arg->tid] = arg->retry_count;
7208
}
7209
7210
if (changed & BIT(NL80211_TID_CONFIG_ATTR_AMPDU_CTRL)) {
7211
if (arvif->noack[arg->tid] == WMI_PEER_TID_CONFIG_NOACK)
7212
changed &= ~BIT(NL80211_TID_CONFIG_ATTR_AMPDU_CTRL);
7213
else
7214
arvif->ampdu[arg->tid] = arg->aggr_control;
7215
}
7216
7217
if (changed & (BIT(NL80211_TID_CONFIG_ATTR_TX_RATE) |
7218
BIT(NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE))) {
7219
if (arvif->noack[arg->tid] == WMI_PEER_TID_CONFIG_NOACK) {
7220
changed &= ~(BIT(NL80211_TID_CONFIG_ATTR_TX_RATE) |
7221
BIT(NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE));
7222
} else {
7223
arvif->rate_ctrl[arg->tid] = arg->rate_ctrl;
7224
arvif->rate_code[arg->tid] = arg->rcode_flags;
7225
}
7226
}
7227
7228
if (changed & BIT(NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL)) {
7229
arvif->rtscts[arg->tid] = arg->rtscts_ctrl;
7230
arg->ext_tid_cfg_bitmap = 0;
7231
}
7232
7233
if (changed)
7234
arvif->tid_conf_changed[arg->tid] |= changed;
7235
}
7236
7237
return 0;
7238
}
7239
7240
static int
7241
ath10k_mac_parse_tid_config(struct ath10k *ar,
7242
struct ieee80211_sta *sta,
7243
struct ieee80211_vif *vif,
7244
struct cfg80211_tid_cfg *tid_conf,
7245
struct wmi_per_peer_per_tid_cfg_arg *arg)
7246
{
7247
u32 changed = tid_conf->mask;
7248
int ret = 0, i = 0;
7249
7250
if (!changed)
7251
return -EINVAL;
7252
7253
while (i < ATH10K_TID_MAX) {
7254
if (!(tid_conf->tids & BIT(i))) {
7255
i++;
7256
continue;
7257
}
7258
7259
arg->tid = i;
7260
7261
if (changed & BIT(NL80211_TID_CONFIG_ATTR_NOACK)) {
7262
if (tid_conf->noack == NL80211_TID_CONFIG_ENABLE) {
7263
arg->ack_policy = WMI_PEER_TID_CONFIG_NOACK;
7264
arg->rate_ctrl =
7265
WMI_TID_CONFIG_RATE_CONTROL_DEFAULT_LOWEST_RATE;
7266
arg->aggr_control =
7267
WMI_TID_CONFIG_AGGR_CONTROL_DISABLE;
7268
} else {
7269
arg->ack_policy =
7270
WMI_PEER_TID_CONFIG_ACK;
7271
arg->rate_ctrl =
7272
WMI_TID_CONFIG_RATE_CONTROL_AUTO;
7273
arg->aggr_control =
7274
WMI_TID_CONFIG_AGGR_CONTROL_ENABLE;
7275
}
7276
}
7277
7278
if (changed & BIT(NL80211_TID_CONFIG_ATTR_RETRY_LONG))
7279
arg->retry_count = tid_conf->retry_long;
7280
7281
if (changed & BIT(NL80211_TID_CONFIG_ATTR_AMPDU_CTRL)) {
7282
if (tid_conf->noack == NL80211_TID_CONFIG_ENABLE)
7283
arg->aggr_control = WMI_TID_CONFIG_AGGR_CONTROL_ENABLE;
7284
else
7285
arg->aggr_control = WMI_TID_CONFIG_AGGR_CONTROL_DISABLE;
7286
}
7287
7288
if (changed & (BIT(NL80211_TID_CONFIG_ATTR_TX_RATE) |
7289
BIT(NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE))) {
7290
ret = ath10k_mac_tid_bitrate_config(ar, vif, sta,
7291
&arg->rcode_flags,
7292
&arg->rate_ctrl,
7293
tid_conf->txrate_type,
7294
&tid_conf->txrate_mask);
7295
if (ret) {
7296
ath10k_warn(ar, "failed to configure bitrate mask %d\n",
7297
ret);
7298
arg->rcode_flags = 0;
7299
arg->rate_ctrl = 0;
7300
}
7301
}
7302
7303
if (changed & BIT(NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL)) {
7304
if (tid_conf->rtscts)
7305
arg->rtscts_ctrl = tid_conf->rtscts;
7306
7307
arg->ext_tid_cfg_bitmap = WMI_EXT_TID_RTS_CTS_CONFIG;
7308
}
7309
7310
ret = ath10k_mac_set_tid_config(ar, sta, vif, changed, arg);
7311
if (ret)
7312
return ret;
7313
i++;
7314
}
7315
7316
return ret;
7317
}
7318
7319
static int ath10k_mac_reset_tid_config(struct ath10k *ar,
7320
struct ieee80211_sta *sta,
7321
struct ath10k_vif *arvif,
7322
u8 tids)
7323
{
7324
struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
7325
struct wmi_per_peer_per_tid_cfg_arg arg;
7326
int ret = 0, i = 0;
7327
7328
arg.vdev_id = arvif->vdev_id;
7329
while (i < ATH10K_TID_MAX) {
7330
if (!(tids & BIT(i))) {
7331
i++;
7332
continue;
7333
}
7334
7335
arg.tid = i;
7336
arg.ack_policy = WMI_PEER_TID_CONFIG_ACK;
7337
arg.retry_count = ATH10K_MAX_RETRY_COUNT;
7338
arg.rate_ctrl = WMI_TID_CONFIG_RATE_CONTROL_AUTO;
7339
arg.aggr_control = WMI_TID_CONFIG_AGGR_CONTROL_ENABLE;
7340
arg.rtscts_ctrl = WMI_TID_CONFIG_RTSCTS_CONTROL_ENABLE;
7341
arg.ext_tid_cfg_bitmap = WMI_EXT_TID_RTS_CTS_CONFIG;
7342
7343
ether_addr_copy(arg.peer_macaddr.addr, sta->addr);
7344
7345
ret = ath10k_wmi_set_per_peer_per_tid_cfg(ar, &arg);
7346
if (ret)
7347
return ret;
7348
7349
if (!arvif->tids_rst) {
7350
arsta->retry_long[i] = -1;
7351
arsta->noack[i] = -1;
7352
arsta->ampdu[i] = -1;
7353
arsta->rate_code[i] = -1;
7354
arsta->rate_ctrl[i] = 0;
7355
arsta->rtscts[i] = -1;
7356
} else {
7357
arvif->retry_long[i] = 0;
7358
arvif->noack[i] = 0;
7359
arvif->ampdu[i] = 0;
7360
arvif->rate_code[i] = 0;
7361
arvif->rate_ctrl[i] = 0;
7362
arvif->rtscts[i] = 0;
7363
}
7364
7365
i++;
7366
}
7367
7368
return ret;
7369
}
7370
7371
static void ath10k_sta_tid_cfg_wk(struct work_struct *wk)
7372
{
7373
struct wmi_per_peer_per_tid_cfg_arg arg = {};
7374
struct ieee80211_sta *sta;
7375
struct ath10k_sta *arsta;
7376
struct ath10k_vif *arvif;
7377
struct ath10k *ar;
7378
bool config_apply;
7379
int ret, i;
7380
u32 changed;
7381
u8 nss;
7382
7383
arsta = container_of(wk, struct ath10k_sta, tid_config_wk);
7384
sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv);
7385
arvif = arsta->arvif;
7386
ar = arvif->ar;
7387
7388
mutex_lock(&ar->conf_mutex);
7389
7390
if (arvif->tids_rst) {
7391
ret = ath10k_mac_reset_tid_config(ar, sta, arvif,
7392
arvif->tids_rst);
7393
goto exit;
7394
}
7395
7396
ether_addr_copy(arg.peer_macaddr.addr, sta->addr);
7397
7398
for (i = 0; i < ATH10K_TID_MAX; i++) {
7399
config_apply = false;
7400
changed = arvif->tid_conf_changed[i];
7401
7402
if (changed & BIT(NL80211_TID_CONFIG_ATTR_NOACK)) {
7403
if (arsta->noack[i] != -1) {
7404
arg.ack_policy = 0;
7405
} else {
7406
config_apply = true;
7407
arg.ack_policy = arvif->noack[i];
7408
arg.aggr_control = arvif->ampdu[i];
7409
arg.rate_ctrl = arvif->rate_ctrl[i];
7410
}
7411
}
7412
7413
if (changed & BIT(NL80211_TID_CONFIG_ATTR_RETRY_LONG)) {
7414
if (arsta->retry_long[i] != -1 ||
7415
arsta->noack[i] == WMI_PEER_TID_CONFIG_NOACK ||
7416
arvif->noack[i] == WMI_PEER_TID_CONFIG_NOACK) {
7417
arg.retry_count = 0;
7418
} else {
7419
arg.retry_count = arvif->retry_long[i];
7420
config_apply = true;
7421
}
7422
}
7423
7424
if (changed & BIT(NL80211_TID_CONFIG_ATTR_AMPDU_CTRL)) {
7425
if (arsta->ampdu[i] != -1 ||
7426
arsta->noack[i] == WMI_PEER_TID_CONFIG_NOACK ||
7427
arvif->noack[i] == WMI_PEER_TID_CONFIG_NOACK) {
7428
arg.aggr_control = 0;
7429
} else {
7430
arg.aggr_control = arvif->ampdu[i];
7431
config_apply = true;
7432
}
7433
}
7434
7435
if (changed & (BIT(NL80211_TID_CONFIG_ATTR_TX_RATE) |
7436
BIT(NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE))) {
7437
nss = ATH10K_HW_NSS(arvif->rate_code[i]);
7438
ret = ath10k_mac_validate_rate_mask(ar, sta,
7439
arvif->rate_code[i],
7440
nss);
7441
if (ret &&
7442
arvif->rate_ctrl[i] > WMI_TID_CONFIG_RATE_CONTROL_AUTO) {
7443
arg.rate_ctrl = 0;
7444
arg.rcode_flags = 0;
7445
}
7446
7447
if (arsta->rate_ctrl[i] >
7448
WMI_TID_CONFIG_RATE_CONTROL_AUTO ||
7449
arsta->noack[i] == WMI_PEER_TID_CONFIG_NOACK ||
7450
arvif->noack[i] == WMI_PEER_TID_CONFIG_NOACK) {
7451
arg.rate_ctrl = 0;
7452
arg.rcode_flags = 0;
7453
} else {
7454
arg.rate_ctrl = arvif->rate_ctrl[i];
7455
arg.rcode_flags = arvif->rate_code[i];
7456
config_apply = true;
7457
}
7458
}
7459
7460
if (changed & BIT(NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL)) {
7461
if (arsta->rtscts[i]) {
7462
arg.rtscts_ctrl = 0;
7463
arg.ext_tid_cfg_bitmap = 0;
7464
} else {
7465
arg.rtscts_ctrl = arvif->rtscts[i] - 1;
7466
arg.ext_tid_cfg_bitmap =
7467
WMI_EXT_TID_RTS_CTS_CONFIG;
7468
config_apply = true;
7469
}
7470
}
7471
7472
arg.tid = i;
7473
7474
if (config_apply) {
7475
ret = ath10k_wmi_set_per_peer_per_tid_cfg(ar, &arg);
7476
if (ret)
7477
ath10k_warn(ar, "failed to set per tid config for sta %pM: %d\n",
7478
sta->addr, ret);
7479
}
7480
7481
arg.ack_policy = 0;
7482
arg.retry_count = 0;
7483
arg.aggr_control = 0;
7484
arg.rate_ctrl = 0;
7485
arg.rcode_flags = 0;
7486
}
7487
7488
exit:
7489
mutex_unlock(&ar->conf_mutex);
7490
}
7491
7492
static void ath10k_mac_vif_stations_tid_conf(void *data,
7493
struct ieee80211_sta *sta)
7494
{
7495
struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
7496
struct ath10k_mac_iter_tid_conf_data *iter_data = data;
7497
struct ieee80211_vif *sta_vif = arsta->arvif->vif;
7498
7499
if (sta_vif != iter_data->curr_vif || !sta->wme)
7500
return;
7501
7502
ieee80211_queue_work(iter_data->ar->hw, &arsta->tid_config_wk);
7503
}
7504
7505
static int ath10k_sta_state(struct ieee80211_hw *hw,
7506
struct ieee80211_vif *vif,
7507
struct ieee80211_sta *sta,
7508
enum ieee80211_sta_state old_state,
7509
enum ieee80211_sta_state new_state)
7510
{
7511
struct ath10k *ar = hw->priv;
7512
struct ath10k_vif *arvif = (void *)vif->drv_priv;
7513
struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
7514
struct ath10k_peer *peer;
7515
int ret = 0;
7516
int i;
7517
7518
if (old_state == IEEE80211_STA_NOTEXIST &&
7519
new_state == IEEE80211_STA_NONE) {
7520
memset(arsta, 0, sizeof(*arsta));
7521
arsta->arvif = arvif;
7522
arsta->peer_ps_state = WMI_PEER_PS_STATE_DISABLED;
7523
INIT_WORK(&arsta->update_wk, ath10k_sta_rc_update_wk);
7524
INIT_WORK(&arsta->tid_config_wk, ath10k_sta_tid_cfg_wk);
7525
7526
for (i = 0; i < ARRAY_SIZE(sta->txq); i++)
7527
ath10k_mac_txq_init(sta->txq[i]);
7528
}
7529
7530
/* cancel must be done outside the mutex to avoid deadlock */
7531
if ((old_state == IEEE80211_STA_NONE &&
7532
new_state == IEEE80211_STA_NOTEXIST)) {
7533
cancel_work_sync(&arsta->update_wk);
7534
cancel_work_sync(&arsta->tid_config_wk);
7535
}
7536
7537
mutex_lock(&ar->conf_mutex);
7538
7539
if (old_state == IEEE80211_STA_NOTEXIST &&
7540
new_state == IEEE80211_STA_NONE) {
7541
/*
7542
* New station addition.
7543
*/
7544
enum wmi_peer_type peer_type = WMI_PEER_TYPE_DEFAULT;
7545
u32 num_tdls_stations;
7546
7547
ath10k_dbg(ar, ATH10K_DBG_STA,
7548
"mac vdev %d peer create %pM (new sta) sta %d / %d peer %d / %d\n",
7549
arvif->vdev_id, sta->addr,
7550
ar->num_stations + 1, ar->max_num_stations,
7551
ar->num_peers + 1, ar->max_num_peers);
7552
7553
num_tdls_stations = ath10k_mac_tdls_vif_stations_count(hw, vif);
7554
7555
if (sta->tdls) {
7556
if (num_tdls_stations >= ar->max_num_tdls_vdevs) {
7557
ath10k_warn(ar, "vdev %i exceeded maximum number of tdls vdevs %i\n",
7558
arvif->vdev_id,
7559
ar->max_num_tdls_vdevs);
7560
ret = -ELNRNG;
7561
goto exit;
7562
}
7563
peer_type = WMI_PEER_TYPE_TDLS;
7564
}
7565
7566
ret = ath10k_mac_inc_num_stations(arvif, sta);
7567
if (ret) {
7568
ath10k_warn(ar, "refusing to associate station: too many connected already (%d)\n",
7569
ar->max_num_stations);
7570
goto exit;
7571
}
7572
7573
if (ath10k_debug_is_extd_tx_stats_enabled(ar)) {
7574
arsta->tx_stats = kzalloc(sizeof(*arsta->tx_stats),
7575
GFP_KERNEL);
7576
if (!arsta->tx_stats) {
7577
ath10k_mac_dec_num_stations(arvif, sta);
7578
ret = -ENOMEM;
7579
goto exit;
7580
}
7581
}
7582
7583
ret = ath10k_peer_create(ar, vif, sta, arvif->vdev_id,
7584
sta->addr, peer_type);
7585
if (ret) {
7586
ath10k_warn(ar, "failed to add peer %pM for vdev %d when adding a new sta: %i\n",
7587
sta->addr, arvif->vdev_id, ret);
7588
ath10k_mac_dec_num_stations(arvif, sta);
7589
kfree(arsta->tx_stats);
7590
goto exit;
7591
}
7592
7593
spin_lock_bh(&ar->data_lock);
7594
7595
peer = ath10k_peer_find(ar, arvif->vdev_id, sta->addr);
7596
if (!peer) {
7597
ath10k_warn(ar, "failed to lookup peer %pM on vdev %i\n",
7598
vif->addr, arvif->vdev_id);
7599
spin_unlock_bh(&ar->data_lock);
7600
ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
7601
ath10k_mac_dec_num_stations(arvif, sta);
7602
kfree(arsta->tx_stats);
7603
ret = -ENOENT;
7604
goto exit;
7605
}
7606
7607
arsta->peer_id = find_first_bit(peer->peer_ids,
7608
ATH10K_MAX_NUM_PEER_IDS);
7609
7610
spin_unlock_bh(&ar->data_lock);
7611
7612
if (!sta->tdls)
7613
goto exit;
7614
7615
ret = ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id,
7616
WMI_TDLS_ENABLE_ACTIVE);
7617
if (ret) {
7618
ath10k_warn(ar, "failed to update fw tdls state on vdev %i: %i\n",
7619
arvif->vdev_id, ret);
7620
ath10k_peer_delete(ar, arvif->vdev_id,
7621
sta->addr);
7622
ath10k_mac_dec_num_stations(arvif, sta);
7623
kfree(arsta->tx_stats);
7624
goto exit;
7625
}
7626
7627
ret = ath10k_mac_tdls_peer_update(ar, arvif->vdev_id, sta,
7628
WMI_TDLS_PEER_STATE_PEERING);
7629
if (ret) {
7630
ath10k_warn(ar,
7631
"failed to update tdls peer %pM for vdev %d when adding a new sta: %i\n",
7632
sta->addr, arvif->vdev_id, ret);
7633
ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
7634
ath10k_mac_dec_num_stations(arvif, sta);
7635
kfree(arsta->tx_stats);
7636
7637
if (num_tdls_stations != 0)
7638
goto exit;
7639
ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id,
7640
WMI_TDLS_DISABLE);
7641
}
7642
} else if ((old_state == IEEE80211_STA_NONE &&
7643
new_state == IEEE80211_STA_NOTEXIST)) {
7644
/*
7645
* Existing station deletion.
7646
*/
7647
ath10k_dbg(ar, ATH10K_DBG_STA,
7648
"mac vdev %d peer delete %pM sta %p (sta gone)\n",
7649
arvif->vdev_id, sta->addr, sta);
7650
7651
if (sta->tdls) {
7652
ret = ath10k_mac_tdls_peer_update(ar, arvif->vdev_id,
7653
sta,
7654
WMI_TDLS_PEER_STATE_TEARDOWN);
7655
if (ret)
7656
ath10k_warn(ar, "failed to update tdls peer state for %pM state %d: %i\n",
7657
sta->addr,
7658
WMI_TDLS_PEER_STATE_TEARDOWN, ret);
7659
}
7660
7661
ret = ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
7662
if (ret)
7663
ath10k_warn(ar, "failed to delete peer %pM for vdev %d: %i\n",
7664
sta->addr, arvif->vdev_id, ret);
7665
7666
ath10k_mac_dec_num_stations(arvif, sta);
7667
7668
spin_lock_bh(&ar->data_lock);
7669
for (i = 0; i < ARRAY_SIZE(ar->peer_map); i++) {
7670
peer = ar->peer_map[i];
7671
if (!peer)
7672
continue;
7673
7674
if (peer->sta == sta) {
7675
ath10k_warn(ar, "found sta peer %pM (ptr %p id %d) entry on vdev %i after it was supposedly removed\n",
7676
sta->addr, peer, i, arvif->vdev_id);
7677
peer->sta = NULL;
7678
7679
/* Clean up the peer object as well since we
7680
* must have failed to do this above.
7681
*/
7682
ath10k_peer_map_cleanup(ar, peer);
7683
}
7684
}
7685
spin_unlock_bh(&ar->data_lock);
7686
7687
if (ath10k_debug_is_extd_tx_stats_enabled(ar)) {
7688
kfree(arsta->tx_stats);
7689
arsta->tx_stats = NULL;
7690
}
7691
7692
for (i = 0; i < ARRAY_SIZE(sta->txq); i++)
7693
ath10k_mac_txq_unref(ar, sta->txq[i]);
7694
7695
if (!sta->tdls)
7696
goto exit;
7697
7698
if (ath10k_mac_tdls_vif_stations_count(hw, vif))
7699
goto exit;
7700
7701
/* This was the last tdls peer in current vif */
7702
ret = ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id,
7703
WMI_TDLS_DISABLE);
7704
if (ret) {
7705
ath10k_warn(ar, "failed to update fw tdls state on vdev %i: %i\n",
7706
arvif->vdev_id, ret);
7707
}
7708
} else if (old_state == IEEE80211_STA_AUTH &&
7709
new_state == IEEE80211_STA_ASSOC &&
7710
(vif->type == NL80211_IFTYPE_AP ||
7711
vif->type == NL80211_IFTYPE_MESH_POINT ||
7712
vif->type == NL80211_IFTYPE_ADHOC)) {
7713
/*
7714
* New association.
7715
*/
7716
ath10k_dbg(ar, ATH10K_DBG_STA, "mac sta %pM associated\n",
7717
sta->addr);
7718
7719
ret = ath10k_station_assoc(ar, vif, sta, false);
7720
if (ret)
7721
ath10k_warn(ar, "failed to associate station %pM for vdev %i: %i\n",
7722
sta->addr, arvif->vdev_id, ret);
7723
} else if (old_state == IEEE80211_STA_ASSOC &&
7724
new_state == IEEE80211_STA_AUTHORIZED &&
7725
sta->tdls) {
7726
/*
7727
* Tdls station authorized.
7728
*/
7729
ath10k_dbg(ar, ATH10K_DBG_STA, "mac tdls sta %pM authorized\n",
7730
sta->addr);
7731
7732
ret = ath10k_station_assoc(ar, vif, sta, false);
7733
if (ret) {
7734
ath10k_warn(ar, "failed to associate tdls station %pM for vdev %i: %i\n",
7735
sta->addr, arvif->vdev_id, ret);
7736
goto exit;
7737
}
7738
7739
ret = ath10k_mac_tdls_peer_update(ar, arvif->vdev_id, sta,
7740
WMI_TDLS_PEER_STATE_CONNECTED);
7741
if (ret)
7742
ath10k_warn(ar, "failed to update tdls peer %pM for vdev %i: %i\n",
7743
sta->addr, arvif->vdev_id, ret);
7744
} else if (old_state == IEEE80211_STA_ASSOC &&
7745
new_state == IEEE80211_STA_AUTH &&
7746
(vif->type == NL80211_IFTYPE_AP ||
7747
vif->type == NL80211_IFTYPE_MESH_POINT ||
7748
vif->type == NL80211_IFTYPE_ADHOC)) {
7749
/*
7750
* Disassociation.
7751
*/
7752
ath10k_dbg(ar, ATH10K_DBG_STA, "mac sta %pM disassociated\n",
7753
sta->addr);
7754
7755
ret = ath10k_station_disassoc(ar, vif, sta);
7756
if (ret)
7757
ath10k_warn(ar, "failed to disassociate station: %pM vdev %i: %i\n",
7758
sta->addr, arvif->vdev_id, ret);
7759
}
7760
exit:
7761
mutex_unlock(&ar->conf_mutex);
7762
return ret;
7763
}
7764
7765
static int ath10k_conf_tx_uapsd(struct ath10k *ar, struct ieee80211_vif *vif,
7766
u16 ac, bool enable)
7767
{
7768
struct ath10k_vif *arvif = (void *)vif->drv_priv;
7769
struct wmi_sta_uapsd_auto_trig_arg arg = {};
7770
u32 prio = 0, acc = 0;
7771
u32 value = 0;
7772
int ret = 0;
7773
7774
lockdep_assert_held(&ar->conf_mutex);
7775
7776
if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
7777
return 0;
7778
7779
switch (ac) {
7780
case IEEE80211_AC_VO:
7781
value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN |
7782
WMI_STA_PS_UAPSD_AC3_TRIGGER_EN;
7783
prio = 7;
7784
acc = 3;
7785
break;
7786
case IEEE80211_AC_VI:
7787
value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN |
7788
WMI_STA_PS_UAPSD_AC2_TRIGGER_EN;
7789
prio = 5;
7790
acc = 2;
7791
break;
7792
case IEEE80211_AC_BE:
7793
value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN |
7794
WMI_STA_PS_UAPSD_AC1_TRIGGER_EN;
7795
prio = 2;
7796
acc = 1;
7797
break;
7798
case IEEE80211_AC_BK:
7799
value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN |
7800
WMI_STA_PS_UAPSD_AC0_TRIGGER_EN;
7801
prio = 0;
7802
acc = 0;
7803
break;
7804
}
7805
7806
if (enable)
7807
arvif->u.sta.uapsd |= value;
7808
else
7809
arvif->u.sta.uapsd &= ~value;
7810
7811
ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
7812
WMI_STA_PS_PARAM_UAPSD,
7813
arvif->u.sta.uapsd);
7814
if (ret) {
7815
ath10k_warn(ar, "failed to set uapsd params: %d\n", ret);
7816
goto exit;
7817
}
7818
7819
if (arvif->u.sta.uapsd)
7820
value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD;
7821
else
7822
value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
7823
7824
ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
7825
WMI_STA_PS_PARAM_RX_WAKE_POLICY,
7826
value);
7827
if (ret)
7828
ath10k_warn(ar, "failed to set rx wake param: %d\n", ret);
7829
7830
ret = ath10k_mac_vif_recalc_ps_wake_threshold(arvif);
7831
if (ret) {
7832
ath10k_warn(ar, "failed to recalc ps wake threshold on vdev %i: %d\n",
7833
arvif->vdev_id, ret);
7834
return ret;
7835
}
7836
7837
ret = ath10k_mac_vif_recalc_ps_poll_count(arvif);
7838
if (ret) {
7839
ath10k_warn(ar, "failed to recalc ps poll count on vdev %i: %d\n",
7840
arvif->vdev_id, ret);
7841
return ret;
7842
}
7843
7844
if (test_bit(WMI_SERVICE_STA_UAPSD_BASIC_AUTO_TRIG, ar->wmi.svc_map) ||
7845
test_bit(WMI_SERVICE_STA_UAPSD_VAR_AUTO_TRIG, ar->wmi.svc_map)) {
7846
/* Only userspace can make an educated decision when to send
7847
* trigger frame. The following effectively disables u-UAPSD
7848
* autotrigger in firmware (which is enabled by default
7849
* provided the autotrigger service is available).
7850
*/
7851
7852
arg.wmm_ac = acc;
7853
arg.user_priority = prio;
7854
arg.service_interval = 0;
7855
arg.suspend_interval = WMI_STA_UAPSD_MAX_INTERVAL_MSEC;
7856
arg.delay_interval = WMI_STA_UAPSD_MAX_INTERVAL_MSEC;
7857
7858
ret = ath10k_wmi_vdev_sta_uapsd(ar, arvif->vdev_id,
7859
arvif->bssid, &arg, 1);
7860
if (ret) {
7861
ath10k_warn(ar, "failed to set uapsd auto trigger %d\n",
7862
ret);
7863
return ret;
7864
}
7865
}
7866
7867
exit:
7868
return ret;
7869
}
7870
7871
static int ath10k_conf_tx(struct ieee80211_hw *hw,
7872
struct ieee80211_vif *vif,
7873
unsigned int link_id, u16 ac,
7874
const struct ieee80211_tx_queue_params *params)
7875
{
7876
struct ath10k *ar = hw->priv;
7877
struct ath10k_vif *arvif = (void *)vif->drv_priv;
7878
struct wmi_wmm_params_arg *p = NULL;
7879
int ret;
7880
7881
mutex_lock(&ar->conf_mutex);
7882
7883
switch (ac) {
7884
case IEEE80211_AC_VO:
7885
p = &arvif->wmm_params.ac_vo;
7886
break;
7887
case IEEE80211_AC_VI:
7888
p = &arvif->wmm_params.ac_vi;
7889
break;
7890
case IEEE80211_AC_BE:
7891
p = &arvif->wmm_params.ac_be;
7892
break;
7893
case IEEE80211_AC_BK:
7894
p = &arvif->wmm_params.ac_bk;
7895
break;
7896
}
7897
7898
if (WARN_ON(!p)) {
7899
ret = -EINVAL;
7900
goto exit;
7901
}
7902
7903
p->cwmin = params->cw_min;
7904
p->cwmax = params->cw_max;
7905
p->aifs = params->aifs;
7906
7907
/*
7908
* The channel time duration programmed in the HW is in absolute
7909
* microseconds, while mac80211 gives the txop in units of
7910
* 32 microseconds.
7911
*/
7912
p->txop = params->txop * 32;
7913
7914
if (ar->wmi.ops->gen_vdev_wmm_conf) {
7915
ret = ath10k_wmi_vdev_wmm_conf(ar, arvif->vdev_id,
7916
&arvif->wmm_params);
7917
if (ret) {
7918
ath10k_warn(ar, "failed to set vdev wmm params on vdev %i: %d\n",
7919
arvif->vdev_id, ret);
7920
goto exit;
7921
}
7922
} else {
7923
/* This won't work well with multi-interface cases but it's
7924
* better than nothing.
7925
*/
7926
ret = ath10k_wmi_pdev_set_wmm_params(ar, &arvif->wmm_params);
7927
if (ret) {
7928
ath10k_warn(ar, "failed to set wmm params: %d\n", ret);
7929
goto exit;
7930
}
7931
}
7932
7933
ret = ath10k_conf_tx_uapsd(ar, vif, ac, params->uapsd);
7934
if (ret)
7935
ath10k_warn(ar, "failed to set sta uapsd: %d\n", ret);
7936
7937
exit:
7938
mutex_unlock(&ar->conf_mutex);
7939
return ret;
7940
}
7941
7942
static int ath10k_remain_on_channel(struct ieee80211_hw *hw,
7943
struct ieee80211_vif *vif,
7944
struct ieee80211_channel *chan,
7945
int duration,
7946
enum ieee80211_roc_type type)
7947
{
7948
struct ath10k *ar = hw->priv;
7949
struct ath10k_vif *arvif = (void *)vif->drv_priv;
7950
struct wmi_start_scan_arg *arg = NULL;
7951
int ret = 0;
7952
u32 scan_time_msec;
7953
7954
mutex_lock(&ar->conf_mutex);
7955
7956
if (ath10k_mac_tdls_vif_stations_count(hw, vif) > 0) {
7957
ret = -EBUSY;
7958
goto exit;
7959
}
7960
7961
spin_lock_bh(&ar->data_lock);
7962
switch (ar->scan.state) {
7963
case ATH10K_SCAN_IDLE:
7964
reinit_completion(&ar->scan.started);
7965
reinit_completion(&ar->scan.completed);
7966
reinit_completion(&ar->scan.on_channel);
7967
ar->scan.state = ATH10K_SCAN_STARTING;
7968
ar->scan.is_roc = true;
7969
ar->scan.vdev_id = arvif->vdev_id;
7970
ar->scan.roc_freq = chan->center_freq;
7971
ar->scan.roc_notify = true;
7972
ret = 0;
7973
break;
7974
case ATH10K_SCAN_STARTING:
7975
case ATH10K_SCAN_RUNNING:
7976
case ATH10K_SCAN_ABORTING:
7977
ret = -EBUSY;
7978
break;
7979
}
7980
spin_unlock_bh(&ar->data_lock);
7981
7982
if (ret)
7983
goto exit;
7984
7985
scan_time_msec = ar->hw->wiphy->max_remain_on_channel_duration * 2;
7986
7987
arg = kzalloc(sizeof(*arg), GFP_KERNEL);
7988
if (!arg) {
7989
ret = -ENOMEM;
7990
goto exit;
7991
}
7992
7993
ath10k_wmi_start_scan_init(ar, arg);
7994
arg->vdev_id = arvif->vdev_id;
7995
arg->scan_id = ATH10K_SCAN_ID;
7996
arg->n_channels = 1;
7997
arg->channels[0] = chan->center_freq;
7998
arg->dwell_time_active = scan_time_msec;
7999
arg->dwell_time_passive = scan_time_msec;
8000
arg->max_scan_time = scan_time_msec;
8001
arg->scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
8002
arg->scan_ctrl_flags |= WMI_SCAN_FILTER_PROBE_REQ;
8003
arg->burst_duration_ms = duration;
8004
8005
ret = ath10k_start_scan(ar, arg);
8006
if (ret) {
8007
ath10k_warn(ar, "failed to start roc scan: %d\n", ret);
8008
spin_lock_bh(&ar->data_lock);
8009
ar->scan.state = ATH10K_SCAN_IDLE;
8010
spin_unlock_bh(&ar->data_lock);
8011
goto exit;
8012
}
8013
8014
ret = wait_for_completion_timeout(&ar->scan.on_channel, 3 * HZ);
8015
if (ret == 0) {
8016
ath10k_warn(ar, "failed to switch to channel for roc scan\n");
8017
8018
ret = ath10k_scan_stop(ar);
8019
if (ret)
8020
ath10k_warn(ar, "failed to stop scan: %d\n", ret);
8021
8022
ret = -ETIMEDOUT;
8023
goto exit;
8024
}
8025
8026
ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
8027
msecs_to_jiffies(duration));
8028
8029
ret = 0;
8030
exit:
8031
kfree(arg);
8032
8033
mutex_unlock(&ar->conf_mutex);
8034
return ret;
8035
}
8036
8037
static int ath10k_cancel_remain_on_channel(struct ieee80211_hw *hw,
8038
struct ieee80211_vif *vif)
8039
{
8040
struct ath10k *ar = hw->priv;
8041
8042
mutex_lock(&ar->conf_mutex);
8043
8044
spin_lock_bh(&ar->data_lock);
8045
ar->scan.roc_notify = false;
8046
spin_unlock_bh(&ar->data_lock);
8047
8048
ath10k_scan_abort(ar);
8049
8050
mutex_unlock(&ar->conf_mutex);
8051
8052
cancel_delayed_work_sync(&ar->scan.timeout);
8053
8054
return 0;
8055
}
8056
8057
/*
8058
* Both RTS and Fragmentation threshold are interface-specific
8059
* in ath10k, but device-specific in mac80211.
8060
*/
8061
8062
static int ath10k_set_rts_threshold(struct ieee80211_hw *hw, int radio_idx,
8063
u32 value)
8064
{
8065
struct ath10k *ar = hw->priv;
8066
struct ath10k_vif *arvif;
8067
int ret = 0;
8068
8069
mutex_lock(&ar->conf_mutex);
8070
list_for_each_entry(arvif, &ar->arvifs, list) {
8071
ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d rts threshold %d\n",
8072
arvif->vdev_id, value);
8073
8074
ret = ath10k_mac_set_rts(arvif, value);
8075
if (ret) {
8076
ath10k_warn(ar, "failed to set rts threshold for vdev %d: %d\n",
8077
arvif->vdev_id, ret);
8078
break;
8079
}
8080
}
8081
mutex_unlock(&ar->conf_mutex);
8082
8083
return ret;
8084
}
8085
8086
static int ath10k_mac_op_set_frag_threshold(struct ieee80211_hw *hw,
8087
int radio_idx, u32 value)
8088
{
8089
/* Even though there's a WMI enum for fragmentation threshold no known
8090
* firmware actually implements it. Moreover it is not possible to rely
8091
* frame fragmentation to mac80211 because firmware clears the "more
8092
* fragments" bit in frame control making it impossible for remote
8093
* devices to reassemble frames.
8094
*
8095
* Hence implement a dummy callback just to say fragmentation isn't
8096
* supported. This effectively prevents mac80211 from doing frame
8097
* fragmentation in software.
8098
*/
8099
return -EOPNOTSUPP;
8100
}
8101
8102
void ath10k_mac_wait_tx_complete(struct ath10k *ar)
8103
{
8104
bool skip;
8105
long time_left;
8106
8107
/* mac80211 doesn't care if we really xmit queued frames or not
8108
* we'll collect those frames either way if we stop/delete vdevs
8109
*/
8110
8111
if (ar->state == ATH10K_STATE_WEDGED)
8112
return;
8113
8114
time_left = wait_event_timeout(ar->htt.empty_tx_wq, ({
8115
bool empty;
8116
8117
spin_lock_bh(&ar->htt.tx_lock);
8118
empty = (ar->htt.num_pending_tx == 0);
8119
spin_unlock_bh(&ar->htt.tx_lock);
8120
8121
skip = (ar->state == ATH10K_STATE_WEDGED) ||
8122
test_bit(ATH10K_FLAG_CRASH_FLUSH,
8123
&ar->dev_flags);
8124
8125
(empty || skip);
8126
}), ATH10K_FLUSH_TIMEOUT_HZ);
8127
8128
if (time_left == 0 || skip)
8129
ath10k_warn(ar, "failed to flush transmit queue (skip %i ar-state %i): %ld\n",
8130
skip, ar->state, time_left);
8131
}
8132
8133
static void ath10k_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
8134
u32 queues, bool drop)
8135
{
8136
struct ath10k *ar = hw->priv;
8137
struct ath10k_vif *arvif;
8138
u32 bitmap;
8139
8140
if (drop) {
8141
if (vif && vif->type == NL80211_IFTYPE_STATION) {
8142
bitmap = ~(1 << WMI_MGMT_TID);
8143
list_for_each_entry(arvif, &ar->arvifs, list) {
8144
if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
8145
ath10k_wmi_peer_flush(ar, arvif->vdev_id,
8146
arvif->bssid, bitmap);
8147
}
8148
ath10k_htt_flush_tx(&ar->htt);
8149
}
8150
return;
8151
}
8152
8153
mutex_lock(&ar->conf_mutex);
8154
ath10k_mac_wait_tx_complete(ar);
8155
mutex_unlock(&ar->conf_mutex);
8156
}
8157
8158
/* TODO: Implement this function properly
8159
* For now it is needed to reply to Probe Requests in IBSS mode.
8160
* Probably we need this information from FW.
8161
*/
8162
static int ath10k_tx_last_beacon(struct ieee80211_hw *hw)
8163
{
8164
return 1;
8165
}
8166
8167
static void ath10k_reconfig_complete(struct ieee80211_hw *hw,
8168
enum ieee80211_reconfig_type reconfig_type)
8169
{
8170
struct ath10k *ar = hw->priv;
8171
struct ath10k_vif *arvif;
8172
8173
if (reconfig_type != IEEE80211_RECONFIG_TYPE_RESTART)
8174
return;
8175
8176
mutex_lock(&ar->conf_mutex);
8177
8178
/* If device failed to restart it will be in a different state, e.g.
8179
* ATH10K_STATE_WEDGED
8180
*/
8181
if (ar->state == ATH10K_STATE_RESTARTED) {
8182
ath10k_info(ar, "device successfully recovered\n");
8183
ar->state = ATH10K_STATE_ON;
8184
ieee80211_wake_queues(ar->hw);
8185
8186
/* Clear recovery state. */
8187
complete(&ar->driver_recovery);
8188
atomic_set(&ar->fail_cont_count, 0);
8189
atomic_set(&ar->pending_recovery, 0);
8190
8191
if (ar->hw_params.hw_restart_disconnect) {
8192
list_for_each_entry(arvif, &ar->arvifs, list) {
8193
if (arvif->is_up && arvif->vdev_type == WMI_VDEV_TYPE_STA)
8194
ieee80211_hw_restart_disconnect(arvif->vif);
8195
}
8196
}
8197
}
8198
8199
mutex_unlock(&ar->conf_mutex);
8200
}
8201
8202
static void
8203
ath10k_mac_update_bss_chan_survey(struct ath10k *ar,
8204
struct ieee80211_channel *channel)
8205
{
8206
int ret;
8207
enum wmi_bss_survey_req_type type = WMI_BSS_SURVEY_REQ_TYPE_READ;
8208
8209
lockdep_assert_held(&ar->conf_mutex);
8210
8211
if (!test_bit(WMI_SERVICE_BSS_CHANNEL_INFO_64, ar->wmi.svc_map) ||
8212
(ar->rx_channel != channel))
8213
return;
8214
8215
if (ar->scan.state != ATH10K_SCAN_IDLE) {
8216
ath10k_dbg(ar, ATH10K_DBG_MAC, "ignoring bss chan info request while scanning..\n");
8217
return;
8218
}
8219
8220
reinit_completion(&ar->bss_survey_done);
8221
8222
ret = ath10k_wmi_pdev_bss_chan_info_request(ar, type);
8223
if (ret) {
8224
ath10k_warn(ar, "failed to send pdev bss chan info request\n");
8225
return;
8226
}
8227
8228
ret = wait_for_completion_timeout(&ar->bss_survey_done, 3 * HZ);
8229
if (!ret) {
8230
ath10k_warn(ar, "bss channel survey timed out\n");
8231
return;
8232
}
8233
}
8234
8235
static int ath10k_get_survey(struct ieee80211_hw *hw, int idx,
8236
struct survey_info *survey)
8237
{
8238
struct ath10k *ar = hw->priv;
8239
struct ieee80211_supported_band *sband;
8240
struct survey_info *ar_survey = &ar->survey[idx];
8241
int ret = 0;
8242
8243
mutex_lock(&ar->conf_mutex);
8244
8245
sband = hw->wiphy->bands[NL80211_BAND_2GHZ];
8246
if (sband && idx >= sband->n_channels) {
8247
idx -= sband->n_channels;
8248
sband = NULL;
8249
}
8250
8251
if (!sband)
8252
sband = hw->wiphy->bands[NL80211_BAND_5GHZ];
8253
8254
if (!sband || idx >= sband->n_channels) {
8255
ret = -ENOENT;
8256
goto exit;
8257
}
8258
8259
ath10k_mac_update_bss_chan_survey(ar, &sband->channels[idx]);
8260
8261
spin_lock_bh(&ar->data_lock);
8262
memcpy(survey, ar_survey, sizeof(*survey));
8263
spin_unlock_bh(&ar->data_lock);
8264
8265
survey->channel = &sband->channels[idx];
8266
8267
if (ar->rx_channel == survey->channel)
8268
survey->filled |= SURVEY_INFO_IN_USE;
8269
8270
exit:
8271
mutex_unlock(&ar->conf_mutex);
8272
return ret;
8273
}
8274
8275
static bool
8276
ath10k_mac_bitrate_mask_get_single_nss(struct ath10k *ar,
8277
enum nl80211_band band,
8278
const struct cfg80211_bitrate_mask *mask,
8279
int *nss)
8280
{
8281
struct ieee80211_supported_band *sband = &ar->mac.sbands[band];
8282
u16 vht_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
8283
u8 ht_nss_mask = 0;
8284
u8 vht_nss_mask = 0;
8285
int i;
8286
8287
if (mask->control[band].legacy)
8288
return false;
8289
8290
for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) {
8291
if (mask->control[band].ht_mcs[i] == 0)
8292
continue;
8293
else if (mask->control[band].ht_mcs[i] ==
8294
sband->ht_cap.mcs.rx_mask[i])
8295
ht_nss_mask |= BIT(i);
8296
else
8297
return false;
8298
}
8299
8300
for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
8301
if (mask->control[band].vht_mcs[i] == 0)
8302
continue;
8303
else if (mask->control[band].vht_mcs[i] ==
8304
ath10k_mac_get_max_vht_mcs_map(vht_mcs_map, i))
8305
vht_nss_mask |= BIT(i);
8306
else
8307
return false;
8308
}
8309
8310
if (ht_nss_mask != vht_nss_mask)
8311
return false;
8312
8313
if (ht_nss_mask == 0)
8314
return false;
8315
8316
if (BIT(fls(ht_nss_mask)) - 1 != ht_nss_mask)
8317
return false;
8318
8319
*nss = fls(ht_nss_mask);
8320
8321
return true;
8322
}
8323
8324
static int ath10k_mac_set_fixed_rate_params(struct ath10k_vif *arvif,
8325
u8 rate, u8 nss, u8 sgi, u8 ldpc)
8326
{
8327
struct ath10k *ar = arvif->ar;
8328
u32 vdev_param;
8329
int ret;
8330
8331
lockdep_assert_held(&ar->conf_mutex);
8332
8333
ath10k_dbg(ar, ATH10K_DBG_MAC, "mac set fixed rate params vdev %i rate 0x%02x nss %u sgi %u\n",
8334
arvif->vdev_id, rate, nss, sgi);
8335
8336
vdev_param = ar->wmi.vdev_param->fixed_rate;
8337
ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, rate);
8338
if (ret) {
8339
ath10k_warn(ar, "failed to set fixed rate param 0x%02x: %d\n",
8340
rate, ret);
8341
return ret;
8342
}
8343
8344
vdev_param = ar->wmi.vdev_param->nss;
8345
ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, nss);
8346
if (ret) {
8347
ath10k_warn(ar, "failed to set nss param %d: %d\n", nss, ret);
8348
return ret;
8349
}
8350
8351
vdev_param = ar->wmi.vdev_param->sgi;
8352
ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, sgi);
8353
if (ret) {
8354
ath10k_warn(ar, "failed to set sgi param %d: %d\n", sgi, ret);
8355
return ret;
8356
}
8357
8358
vdev_param = ar->wmi.vdev_param->ldpc;
8359
ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, ldpc);
8360
if (ret) {
8361
ath10k_warn(ar, "failed to set ldpc param %d: %d\n", ldpc, ret);
8362
return ret;
8363
}
8364
8365
return 0;
8366
}
8367
8368
static bool
8369
ath10k_mac_can_set_bitrate_mask(struct ath10k *ar,
8370
enum nl80211_band band,
8371
const struct cfg80211_bitrate_mask *mask,
8372
bool allow_pfr)
8373
{
8374
int i;
8375
u16 vht_mcs;
8376
8377
/* Due to firmware limitation in WMI_PEER_ASSOC_CMDID it is impossible
8378
* to express all VHT MCS rate masks. Effectively only the following
8379
* ranges can be used: none, 0-7, 0-8 and 0-9.
8380
*/
8381
for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
8382
vht_mcs = mask->control[band].vht_mcs[i];
8383
8384
switch (vht_mcs) {
8385
case 0:
8386
case BIT(8) - 1:
8387
case BIT(9) - 1:
8388
case BIT(10) - 1:
8389
break;
8390
default:
8391
if (!allow_pfr)
8392
ath10k_warn(ar, "refusing bitrate mask with missing 0-7 VHT MCS rates\n");
8393
return false;
8394
}
8395
}
8396
8397
return true;
8398
}
8399
8400
static bool ath10k_mac_set_vht_bitrate_mask_fixup(struct ath10k *ar,
8401
struct ath10k_vif *arvif,
8402
struct ieee80211_sta *sta)
8403
{
8404
int err;
8405
u8 rate = arvif->vht_pfr;
8406
8407
/* skip non vht and multiple rate peers */
8408
if (!sta->deflink.vht_cap.vht_supported || arvif->vht_num_rates != 1)
8409
return false;
8410
8411
err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
8412
WMI_PEER_PARAM_FIXED_RATE, rate);
8413
if (err)
8414
ath10k_warn(ar, "failed to enable STA %pM peer fixed rate: %d\n",
8415
sta->addr, err);
8416
8417
return true;
8418
}
8419
8420
static void ath10k_mac_set_bitrate_mask_iter(void *data,
8421
struct ieee80211_sta *sta)
8422
{
8423
struct ath10k_vif *arvif = data;
8424
struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
8425
struct ath10k *ar = arvif->ar;
8426
8427
if (arsta->arvif != arvif)
8428
return;
8429
8430
if (ath10k_mac_set_vht_bitrate_mask_fixup(ar, arvif, sta))
8431
return;
8432
8433
spin_lock_bh(&ar->data_lock);
8434
arsta->changed |= IEEE80211_RC_SUPP_RATES_CHANGED;
8435
spin_unlock_bh(&ar->data_lock);
8436
8437
ieee80211_queue_work(ar->hw, &arsta->update_wk);
8438
}
8439
8440
static void ath10k_mac_clr_bitrate_mask_iter(void *data,
8441
struct ieee80211_sta *sta)
8442
{
8443
struct ath10k_vif *arvif = data;
8444
struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
8445
struct ath10k *ar = arvif->ar;
8446
int err;
8447
8448
/* clear vht peers only */
8449
if (arsta->arvif != arvif || !sta->deflink.vht_cap.vht_supported)
8450
return;
8451
8452
err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
8453
WMI_PEER_PARAM_FIXED_RATE,
8454
WMI_FIXED_RATE_NONE);
8455
if (err)
8456
ath10k_warn(ar, "failed to clear STA %pM peer fixed rate: %d\n",
8457
sta->addr, err);
8458
}
8459
8460
static int ath10k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw,
8461
struct ieee80211_vif *vif,
8462
const struct cfg80211_bitrate_mask *mask)
8463
{
8464
struct ath10k_vif *arvif = (void *)vif->drv_priv;
8465
struct cfg80211_chan_def def;
8466
struct ath10k *ar = arvif->ar;
8467
enum nl80211_band band;
8468
const u8 *ht_mcs_mask;
8469
const u16 *vht_mcs_mask;
8470
u8 rate;
8471
u8 nss;
8472
u8 sgi;
8473
u8 ldpc;
8474
int single_nss;
8475
int ret;
8476
int vht_num_rates, allow_pfr;
8477
u8 vht_pfr;
8478
bool update_bitrate_mask = true;
8479
8480
if (ath10k_mac_vif_chan(vif, &def))
8481
return -EPERM;
8482
8483
band = def.chan->band;
8484
ht_mcs_mask = mask->control[band].ht_mcs;
8485
vht_mcs_mask = mask->control[band].vht_mcs;
8486
ldpc = !!(ar->ht_cap_info & WMI_HT_CAP_LDPC);
8487
8488
sgi = mask->control[band].gi;
8489
if (sgi == NL80211_TXRATE_FORCE_LGI)
8490
return -EINVAL;
8491
8492
allow_pfr = test_bit(ATH10K_FW_FEATURE_PEER_FIXED_RATE,
8493
ar->normal_mode_fw.fw_file.fw_features);
8494
if (allow_pfr) {
8495
mutex_lock(&ar->conf_mutex);
8496
ieee80211_iterate_stations_atomic(ar->hw,
8497
ath10k_mac_clr_bitrate_mask_iter,
8498
arvif);
8499
mutex_unlock(&ar->conf_mutex);
8500
}
8501
8502
if (ath10k_mac_bitrate_mask_has_single_rate(ar, band, mask,
8503
&vht_num_rates)) {
8504
ret = ath10k_mac_bitrate_mask_get_single_rate(ar, band, mask,
8505
&rate, &nss,
8506
false);
8507
if (ret) {
8508
ath10k_warn(ar, "failed to get single rate for vdev %i: %d\n",
8509
arvif->vdev_id, ret);
8510
return ret;
8511
}
8512
} else if (ath10k_mac_bitrate_mask_get_single_nss(ar, band, mask,
8513
&single_nss)) {
8514
rate = WMI_FIXED_RATE_NONE;
8515
nss = single_nss;
8516
} else {
8517
rate = WMI_FIXED_RATE_NONE;
8518
nss = min(ar->num_rf_chains,
8519
max(ath10k_mac_max_ht_nss(ht_mcs_mask),
8520
ath10k_mac_max_vht_nss(vht_mcs_mask)));
8521
8522
#if defined(__FreeBSD__)
8523
vht_pfr = 0;
8524
#endif
8525
if (!ath10k_mac_can_set_bitrate_mask(ar, band, mask,
8526
allow_pfr)) {
8527
u8 vht_nss;
8528
8529
if (!allow_pfr || vht_num_rates != 1)
8530
return -EINVAL;
8531
8532
/* Reach here, firmware supports peer fixed rate and has
8533
* single vht rate, and don't update vif birate_mask, as
8534
* the rate only for specific peer.
8535
*/
8536
ath10k_mac_bitrate_mask_get_single_rate(ar, band, mask,
8537
&vht_pfr,
8538
&vht_nss,
8539
true);
8540
update_bitrate_mask = false;
8541
#if defined(__linux__)
8542
} else {
8543
vht_pfr = 0;
8544
#endif
8545
}
8546
8547
mutex_lock(&ar->conf_mutex);
8548
8549
if (update_bitrate_mask)
8550
arvif->bitrate_mask = *mask;
8551
arvif->vht_num_rates = vht_num_rates;
8552
arvif->vht_pfr = vht_pfr;
8553
ieee80211_iterate_stations_atomic(ar->hw,
8554
ath10k_mac_set_bitrate_mask_iter,
8555
arvif);
8556
8557
mutex_unlock(&ar->conf_mutex);
8558
}
8559
8560
mutex_lock(&ar->conf_mutex);
8561
8562
ret = ath10k_mac_set_fixed_rate_params(arvif, rate, nss, sgi, ldpc);
8563
if (ret) {
8564
ath10k_warn(ar, "failed to set fixed rate params on vdev %i: %d\n",
8565
arvif->vdev_id, ret);
8566
goto exit;
8567
}
8568
8569
exit:
8570
mutex_unlock(&ar->conf_mutex);
8571
8572
return ret;
8573
}
8574
8575
static void ath10k_sta_rc_update(struct ieee80211_hw *hw,
8576
struct ieee80211_vif *vif,
8577
struct ieee80211_link_sta *link_sta,
8578
u32 changed)
8579
{
8580
struct ieee80211_sta *sta = link_sta->sta;
8581
struct ath10k *ar = hw->priv;
8582
struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
8583
struct ath10k_vif *arvif = (void *)vif->drv_priv;
8584
struct ath10k_peer *peer;
8585
u32 bw, smps;
8586
8587
spin_lock_bh(&ar->data_lock);
8588
8589
peer = ath10k_peer_find(ar, arvif->vdev_id, sta->addr);
8590
if (!peer) {
8591
spin_unlock_bh(&ar->data_lock);
8592
ath10k_warn(ar, "mac sta rc update failed to find peer %pM on vdev %i\n",
8593
sta->addr, arvif->vdev_id);
8594
return;
8595
}
8596
8597
ath10k_dbg(ar, ATH10K_DBG_STA,
8598
"mac sta rc update for %pM changed %08x bw %d nss %d smps %d\n",
8599
sta->addr, changed, sta->deflink.bandwidth,
8600
sta->deflink.rx_nss,
8601
sta->deflink.smps_mode);
8602
8603
if (changed & IEEE80211_RC_BW_CHANGED) {
8604
bw = WMI_PEER_CHWIDTH_20MHZ;
8605
8606
switch (sta->deflink.bandwidth) {
8607
case IEEE80211_STA_RX_BW_20:
8608
bw = WMI_PEER_CHWIDTH_20MHZ;
8609
break;
8610
case IEEE80211_STA_RX_BW_40:
8611
bw = WMI_PEER_CHWIDTH_40MHZ;
8612
break;
8613
case IEEE80211_STA_RX_BW_80:
8614
bw = WMI_PEER_CHWIDTH_80MHZ;
8615
break;
8616
case IEEE80211_STA_RX_BW_160:
8617
bw = WMI_PEER_CHWIDTH_160MHZ;
8618
break;
8619
default:
8620
ath10k_warn(ar, "Invalid bandwidth %d in rc update for %pM\n",
8621
sta->deflink.bandwidth, sta->addr);
8622
bw = WMI_PEER_CHWIDTH_20MHZ;
8623
break;
8624
}
8625
8626
arsta->bw = bw;
8627
}
8628
8629
if (changed & IEEE80211_RC_NSS_CHANGED)
8630
arsta->nss = sta->deflink.rx_nss;
8631
8632
if (changed & IEEE80211_RC_SMPS_CHANGED) {
8633
smps = WMI_PEER_SMPS_PS_NONE;
8634
8635
switch (sta->deflink.smps_mode) {
8636
case IEEE80211_SMPS_AUTOMATIC:
8637
case IEEE80211_SMPS_OFF:
8638
smps = WMI_PEER_SMPS_PS_NONE;
8639
break;
8640
case IEEE80211_SMPS_STATIC:
8641
smps = WMI_PEER_SMPS_STATIC;
8642
break;
8643
case IEEE80211_SMPS_DYNAMIC:
8644
smps = WMI_PEER_SMPS_DYNAMIC;
8645
break;
8646
case IEEE80211_SMPS_NUM_MODES:
8647
ath10k_warn(ar, "Invalid smps %d in sta rc update for %pM\n",
8648
sta->deflink.smps_mode, sta->addr);
8649
smps = WMI_PEER_SMPS_PS_NONE;
8650
break;
8651
}
8652
8653
arsta->smps = smps;
8654
}
8655
8656
arsta->changed |= changed;
8657
8658
spin_unlock_bh(&ar->data_lock);
8659
8660
ieee80211_queue_work(hw, &arsta->update_wk);
8661
}
8662
8663
static void ath10k_offset_tsf(struct ieee80211_hw *hw,
8664
struct ieee80211_vif *vif, s64 tsf_offset)
8665
{
8666
struct ath10k *ar = hw->priv;
8667
struct ath10k_vif *arvif = (void *)vif->drv_priv;
8668
u32 offset, vdev_param;
8669
int ret;
8670
8671
if (tsf_offset < 0) {
8672
vdev_param = ar->wmi.vdev_param->dec_tsf;
8673
offset = -tsf_offset;
8674
} else {
8675
vdev_param = ar->wmi.vdev_param->inc_tsf;
8676
offset = tsf_offset;
8677
}
8678
8679
ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
8680
vdev_param, offset);
8681
8682
if (ret && ret != -EOPNOTSUPP)
8683
ath10k_warn(ar, "failed to set tsf offset %d cmd %d: %d\n",
8684
offset, vdev_param, ret);
8685
}
8686
8687
static int ath10k_ampdu_action(struct ieee80211_hw *hw,
8688
struct ieee80211_vif *vif,
8689
struct ieee80211_ampdu_params *params)
8690
{
8691
struct ath10k *ar = hw->priv;
8692
struct ath10k_vif *arvif = (void *)vif->drv_priv;
8693
struct ieee80211_sta *sta = params->sta;
8694
enum ieee80211_ampdu_mlme_action action = params->action;
8695
u16 tid = params->tid;
8696
8697
ath10k_dbg(ar, ATH10K_DBG_MAC, "mac ampdu vdev_id %i sta %pM tid %u action %d\n",
8698
arvif->vdev_id, sta->addr, tid, action);
8699
8700
switch (action) {
8701
case IEEE80211_AMPDU_RX_START:
8702
case IEEE80211_AMPDU_RX_STOP:
8703
/* HTT AddBa/DelBa events trigger mac80211 Rx BA session
8704
* creation/removal. Do we need to verify this?
8705
*/
8706
return 0;
8707
case IEEE80211_AMPDU_TX_START:
8708
case IEEE80211_AMPDU_TX_STOP_CONT:
8709
case IEEE80211_AMPDU_TX_STOP_FLUSH:
8710
case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
8711
case IEEE80211_AMPDU_TX_OPERATIONAL:
8712
/* Firmware offloads Tx aggregation entirely so deny mac80211
8713
* Tx aggregation requests.
8714
*/
8715
#if defined(__FreeBSD__)
8716
default:
8717
#endif
8718
return -EOPNOTSUPP;
8719
}
8720
8721
return -EINVAL;
8722
}
8723
8724
static void
8725
ath10k_mac_update_rx_channel(struct ath10k *ar,
8726
struct ieee80211_chanctx_conf *ctx,
8727
struct ieee80211_vif_chanctx_switch *vifs,
8728
int n_vifs)
8729
{
8730
struct cfg80211_chan_def *def = NULL;
8731
8732
/* Both locks are required because ar->rx_channel is modified. This
8733
* allows readers to hold either lock.
8734
*/
8735
lockdep_assert_held(&ar->conf_mutex);
8736
lockdep_assert_held(&ar->data_lock);
8737
8738
WARN_ON(ctx && vifs);
8739
WARN_ON(vifs && !n_vifs);
8740
8741
/* FIXME: Sort of an optimization and a workaround. Peers and vifs are
8742
* on a linked list now. Doing a lookup peer -> vif -> chanctx for each
8743
* ppdu on Rx may reduce performance on low-end systems. It should be
8744
* possible to make tables/hashmaps to speed the lookup up (be vary of
8745
* cpu data cache lines though regarding sizes) but to keep the initial
8746
* implementation simple and less intrusive fallback to the slow lookup
8747
* only for multi-channel cases. Single-channel cases will remain to
8748
* use the old channel derival and thus performance should not be
8749
* affected much.
8750
*/
8751
rcu_read_lock();
8752
if (!ctx && ath10k_mac_num_chanctxs(ar) == 1) {
8753
ieee80211_iter_chan_contexts_atomic(ar->hw,
8754
ath10k_mac_get_any_chandef_iter,
8755
&def);
8756
8757
if (vifs)
8758
def = &vifs[0].new_ctx->def;
8759
8760
ar->rx_channel = def->chan;
8761
} else if ((ctx && ath10k_mac_num_chanctxs(ar) == 0) ||
8762
(ctx && (ar->state == ATH10K_STATE_RESTARTED))) {
8763
/* During driver restart due to firmware assert, since mac80211
8764
* already has valid channel context for given radio, channel
8765
* context iteration return num_chanctx > 0. So fix rx_channel
8766
* when restart is in progress.
8767
*/
8768
ar->rx_channel = ctx->def.chan;
8769
} else {
8770
ar->rx_channel = NULL;
8771
}
8772
rcu_read_unlock();
8773
}
8774
8775
static void
8776
ath10k_mac_update_vif_chan(struct ath10k *ar,
8777
struct ieee80211_vif_chanctx_switch *vifs,
8778
int n_vifs)
8779
{
8780
struct ath10k_vif *arvif;
8781
int ret;
8782
int i;
8783
8784
lockdep_assert_held(&ar->conf_mutex);
8785
8786
/* First stop monitor interface. Some FW versions crash if there's a
8787
* lone monitor interface.
8788
*/
8789
if (ar->monitor_started)
8790
ath10k_monitor_stop(ar);
8791
8792
for (i = 0; i < n_vifs; i++) {
8793
arvif = (void *)vifs[i].vif->drv_priv;
8794
8795
ath10k_dbg(ar, ATH10K_DBG_MAC,
8796
"mac chanctx switch vdev_id %i freq %u->%u width %d->%d\n",
8797
arvif->vdev_id,
8798
vifs[i].old_ctx->def.chan->center_freq,
8799
vifs[i].new_ctx->def.chan->center_freq,
8800
vifs[i].old_ctx->def.width,
8801
vifs[i].new_ctx->def.width);
8802
8803
if (WARN_ON(!arvif->is_started))
8804
continue;
8805
8806
if (WARN_ON(!arvif->is_up))
8807
continue;
8808
8809
ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
8810
if (ret) {
8811
ath10k_warn(ar, "failed to down vdev %d: %d\n",
8812
arvif->vdev_id, ret);
8813
continue;
8814
}
8815
}
8816
8817
/* All relevant vdevs are downed and associated channel resources
8818
* should be available for the channel switch now.
8819
*/
8820
8821
spin_lock_bh(&ar->data_lock);
8822
ath10k_mac_update_rx_channel(ar, NULL, vifs, n_vifs);
8823
spin_unlock_bh(&ar->data_lock);
8824
8825
for (i = 0; i < n_vifs; i++) {
8826
arvif = (void *)vifs[i].vif->drv_priv;
8827
8828
if (WARN_ON(!arvif->is_started))
8829
continue;
8830
8831
if (WARN_ON(!arvif->is_up))
8832
continue;
8833
8834
ret = ath10k_mac_setup_bcn_tmpl(arvif);
8835
if (ret)
8836
ath10k_warn(ar, "failed to update bcn tmpl during csa: %d\n",
8837
ret);
8838
8839
ret = ath10k_mac_setup_prb_tmpl(arvif);
8840
if (ret)
8841
ath10k_warn(ar, "failed to update prb tmpl during csa: %d\n",
8842
ret);
8843
8844
ret = ath10k_vdev_restart(arvif, &vifs[i].new_ctx->def);
8845
if (ret) {
8846
ath10k_warn(ar, "failed to restart vdev %d: %d\n",
8847
arvif->vdev_id, ret);
8848
continue;
8849
}
8850
8851
ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
8852
arvif->bssid);
8853
if (ret) {
8854
ath10k_warn(ar, "failed to bring vdev up %d: %d\n",
8855
arvif->vdev_id, ret);
8856
continue;
8857
}
8858
}
8859
8860
ath10k_monitor_recalc(ar);
8861
}
8862
8863
static int
8864
ath10k_mac_op_add_chanctx(struct ieee80211_hw *hw,
8865
struct ieee80211_chanctx_conf *ctx)
8866
{
8867
struct ath10k *ar = hw->priv;
8868
8869
ath10k_dbg(ar, ATH10K_DBG_MAC,
8870
"mac chanctx add freq %u width %d ptr %p\n",
8871
ctx->def.chan->center_freq, ctx->def.width, ctx);
8872
8873
mutex_lock(&ar->conf_mutex);
8874
8875
spin_lock_bh(&ar->data_lock);
8876
ath10k_mac_update_rx_channel(ar, ctx, NULL, 0);
8877
spin_unlock_bh(&ar->data_lock);
8878
8879
ath10k_recalc_radar_detection(ar);
8880
ath10k_monitor_recalc(ar);
8881
8882
mutex_unlock(&ar->conf_mutex);
8883
8884
return 0;
8885
}
8886
8887
static void
8888
ath10k_mac_op_remove_chanctx(struct ieee80211_hw *hw,
8889
struct ieee80211_chanctx_conf *ctx)
8890
{
8891
struct ath10k *ar = hw->priv;
8892
8893
ath10k_dbg(ar, ATH10K_DBG_MAC,
8894
"mac chanctx remove freq %u width %d ptr %p\n",
8895
ctx->def.chan->center_freq, ctx->def.width, ctx);
8896
8897
mutex_lock(&ar->conf_mutex);
8898
8899
spin_lock_bh(&ar->data_lock);
8900
ath10k_mac_update_rx_channel(ar, NULL, NULL, 0);
8901
spin_unlock_bh(&ar->data_lock);
8902
8903
ath10k_recalc_radar_detection(ar);
8904
ath10k_monitor_recalc(ar);
8905
8906
mutex_unlock(&ar->conf_mutex);
8907
}
8908
8909
struct ath10k_mac_change_chanctx_arg {
8910
struct ieee80211_chanctx_conf *ctx;
8911
struct ieee80211_vif_chanctx_switch *vifs;
8912
int n_vifs;
8913
int next_vif;
8914
};
8915
8916
static void
8917
ath10k_mac_change_chanctx_cnt_iter(void *data, u8 *mac,
8918
struct ieee80211_vif *vif)
8919
{
8920
struct ath10k_mac_change_chanctx_arg *arg = data;
8921
8922
if (rcu_access_pointer(vif->bss_conf.chanctx_conf) != arg->ctx)
8923
return;
8924
8925
arg->n_vifs++;
8926
}
8927
8928
static void
8929
ath10k_mac_change_chanctx_fill_iter(void *data, u8 *mac,
8930
struct ieee80211_vif *vif)
8931
{
8932
struct ath10k_mac_change_chanctx_arg *arg = data;
8933
struct ieee80211_chanctx_conf *ctx;
8934
8935
ctx = rcu_access_pointer(vif->bss_conf.chanctx_conf);
8936
if (ctx != arg->ctx)
8937
return;
8938
8939
if (WARN_ON(arg->next_vif == arg->n_vifs))
8940
return;
8941
8942
arg->vifs[arg->next_vif].vif = vif;
8943
arg->vifs[arg->next_vif].old_ctx = ctx;
8944
arg->vifs[arg->next_vif].new_ctx = ctx;
8945
arg->next_vif++;
8946
}
8947
8948
static void
8949
ath10k_mac_op_change_chanctx(struct ieee80211_hw *hw,
8950
struct ieee80211_chanctx_conf *ctx,
8951
u32 changed)
8952
{
8953
struct ath10k *ar = hw->priv;
8954
struct ath10k_mac_change_chanctx_arg arg = { .ctx = ctx };
8955
8956
mutex_lock(&ar->conf_mutex);
8957
8958
ath10k_dbg(ar, ATH10K_DBG_MAC,
8959
"mac chanctx change freq %u width %d ptr %p changed %x\n",
8960
ctx->def.chan->center_freq, ctx->def.width, ctx, changed);
8961
8962
/* This shouldn't really happen because channel switching should use
8963
* switch_vif_chanctx().
8964
*/
8965
if (WARN_ON(changed & IEEE80211_CHANCTX_CHANGE_CHANNEL))
8966
goto unlock;
8967
8968
if (changed & IEEE80211_CHANCTX_CHANGE_WIDTH) {
8969
ieee80211_iterate_active_interfaces_atomic(
8970
hw,
8971
ATH10K_ITER_NORMAL_FLAGS,
8972
ath10k_mac_change_chanctx_cnt_iter,
8973
&arg);
8974
if (arg.n_vifs == 0)
8975
goto radar;
8976
8977
arg.vifs = kcalloc(arg.n_vifs, sizeof(arg.vifs[0]),
8978
GFP_KERNEL);
8979
if (!arg.vifs)
8980
goto radar;
8981
8982
ieee80211_iterate_active_interfaces_atomic(
8983
hw,
8984
ATH10K_ITER_NORMAL_FLAGS,
8985
ath10k_mac_change_chanctx_fill_iter,
8986
&arg);
8987
ath10k_mac_update_vif_chan(ar, arg.vifs, arg.n_vifs);
8988
kfree(arg.vifs);
8989
}
8990
8991
radar:
8992
ath10k_recalc_radar_detection(ar);
8993
8994
/* FIXME: How to configure Rx chains properly? */
8995
8996
/* No other actions are actually necessary. Firmware maintains channel
8997
* definitions per vdev internally and there's no host-side channel
8998
* context abstraction to configure, e.g. channel width.
8999
*/
9000
9001
unlock:
9002
mutex_unlock(&ar->conf_mutex);
9003
}
9004
9005
static int
9006
ath10k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw,
9007
struct ieee80211_vif *vif,
9008
struct ieee80211_bss_conf *link_conf,
9009
struct ieee80211_chanctx_conf *ctx)
9010
{
9011
struct ath10k *ar = hw->priv;
9012
struct ath10k_vif *arvif = (void *)vif->drv_priv;
9013
int ret;
9014
9015
mutex_lock(&ar->conf_mutex);
9016
9017
ath10k_dbg(ar, ATH10K_DBG_MAC,
9018
"mac chanctx assign ptr %p vdev_id %i\n",
9019
ctx, arvif->vdev_id);
9020
9021
if (WARN_ON(arvif->is_started)) {
9022
mutex_unlock(&ar->conf_mutex);
9023
return -EBUSY;
9024
}
9025
9026
ret = ath10k_vdev_start(arvif, &ctx->def);
9027
if (ret) {
9028
ath10k_warn(ar, "failed to start vdev %i addr %pM on freq %d: %d\n",
9029
arvif->vdev_id, vif->addr,
9030
ctx->def.chan->center_freq, ret);
9031
goto err;
9032
}
9033
9034
arvif->is_started = true;
9035
9036
ret = ath10k_mac_vif_setup_ps(arvif);
9037
if (ret) {
9038
ath10k_warn(ar, "failed to update vdev %i ps: %d\n",
9039
arvif->vdev_id, ret);
9040
goto err_stop;
9041
}
9042
9043
if (vif->type == NL80211_IFTYPE_MONITOR) {
9044
ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, 0, vif->addr);
9045
if (ret) {
9046
ath10k_warn(ar, "failed to up monitor vdev %i: %d\n",
9047
arvif->vdev_id, ret);
9048
goto err_stop;
9049
}
9050
9051
arvif->is_up = true;
9052
}
9053
9054
if (ath10k_mac_can_set_cts_prot(arvif)) {
9055
ret = ath10k_mac_set_cts_prot(arvif);
9056
if (ret)
9057
ath10k_warn(ar, "failed to set cts protection for vdev %d: %d\n",
9058
arvif->vdev_id, ret);
9059
}
9060
9061
if (ath10k_peer_stats_enabled(ar) &&
9062
ar->hw_params.tx_stats_over_pktlog) {
9063
ar->pktlog_filter |= ATH10K_PKTLOG_PEER_STATS;
9064
ret = ath10k_wmi_pdev_pktlog_enable(ar,
9065
ar->pktlog_filter);
9066
if (ret) {
9067
ath10k_warn(ar, "failed to enable pktlog %d\n", ret);
9068
goto err_stop;
9069
}
9070
}
9071
9072
mutex_unlock(&ar->conf_mutex);
9073
return 0;
9074
9075
err_stop:
9076
ath10k_vdev_stop(arvif);
9077
arvif->is_started = false;
9078
ath10k_mac_vif_setup_ps(arvif);
9079
9080
err:
9081
mutex_unlock(&ar->conf_mutex);
9082
return ret;
9083
}
9084
9085
static void
9086
ath10k_mac_op_unassign_vif_chanctx(struct ieee80211_hw *hw,
9087
struct ieee80211_vif *vif,
9088
struct ieee80211_bss_conf *link_conf,
9089
struct ieee80211_chanctx_conf *ctx)
9090
{
9091
struct ath10k *ar = hw->priv;
9092
struct ath10k_vif *arvif = (void *)vif->drv_priv;
9093
int ret;
9094
9095
mutex_lock(&ar->conf_mutex);
9096
9097
ath10k_dbg(ar, ATH10K_DBG_MAC,
9098
"mac chanctx unassign ptr %p vdev_id %i\n",
9099
ctx, arvif->vdev_id);
9100
9101
WARN_ON(!arvif->is_started);
9102
9103
if (vif->type == NL80211_IFTYPE_MONITOR) {
9104
WARN_ON(!arvif->is_up);
9105
9106
ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
9107
if (ret)
9108
ath10k_warn(ar, "failed to down monitor vdev %i: %d\n",
9109
arvif->vdev_id, ret);
9110
9111
arvif->is_up = false;
9112
}
9113
9114
ret = ath10k_vdev_stop(arvif);
9115
if (ret)
9116
ath10k_warn(ar, "failed to stop vdev %i: %d\n",
9117
arvif->vdev_id, ret);
9118
9119
arvif->is_started = false;
9120
9121
mutex_unlock(&ar->conf_mutex);
9122
}
9123
9124
static int
9125
ath10k_mac_op_switch_vif_chanctx(struct ieee80211_hw *hw,
9126
struct ieee80211_vif_chanctx_switch *vifs,
9127
int n_vifs,
9128
enum ieee80211_chanctx_switch_mode mode)
9129
{
9130
struct ath10k *ar = hw->priv;
9131
9132
mutex_lock(&ar->conf_mutex);
9133
9134
ath10k_dbg(ar, ATH10K_DBG_MAC,
9135
"mac chanctx switch n_vifs %d mode %d\n",
9136
n_vifs, mode);
9137
ath10k_mac_update_vif_chan(ar, vifs, n_vifs);
9138
9139
mutex_unlock(&ar->conf_mutex);
9140
return 0;
9141
}
9142
9143
static void ath10k_mac_op_sta_pre_rcu_remove(struct ieee80211_hw *hw,
9144
struct ieee80211_vif *vif,
9145
struct ieee80211_sta *sta)
9146
{
9147
struct ath10k *ar;
9148
struct ath10k_peer *peer;
9149
9150
ar = hw->priv;
9151
9152
list_for_each_entry(peer, &ar->peers, list)
9153
if (peer->sta == sta)
9154
peer->removed = true;
9155
}
9156
9157
/* HT MCS parameters with Nss = 1 */
9158
static const struct ath10k_index_ht_data_rate_type supported_ht_mcs_rate_nss1[] = {
9159
/* MCS L20 L40 S20 S40 */
9160
{0, { 65, 135, 72, 150} },
9161
{1, { 130, 270, 144, 300} },
9162
{2, { 195, 405, 217, 450} },
9163
{3, { 260, 540, 289, 600} },
9164
{4, { 390, 810, 433, 900} },
9165
{5, { 520, 1080, 578, 1200} },
9166
{6, { 585, 1215, 650, 1350} },
9167
{7, { 650, 1350, 722, 1500} }
9168
};
9169
9170
/* HT MCS parameters with Nss = 2 */
9171
static const struct ath10k_index_ht_data_rate_type supported_ht_mcs_rate_nss2[] = {
9172
/* MCS L20 L40 S20 S40 */
9173
{0, {130, 270, 144, 300} },
9174
{1, {260, 540, 289, 600} },
9175
{2, {390, 810, 433, 900} },
9176
{3, {520, 1080, 578, 1200} },
9177
{4, {780, 1620, 867, 1800} },
9178
{5, {1040, 2160, 1156, 2400} },
9179
{6, {1170, 2430, 1300, 2700} },
9180
{7, {1300, 2700, 1444, 3000} }
9181
};
9182
9183
/* MCS parameters with Nss = 1 */
9184
static const struct ath10k_index_vht_data_rate_type supported_vht_mcs_rate_nss1[] = {
9185
/* MCS L80 S80 L40 S40 L20 S20 */
9186
{0, {293, 325}, {135, 150}, {65, 72} },
9187
{1, {585, 650}, {270, 300}, {130, 144} },
9188
{2, {878, 975}, {405, 450}, {195, 217} },
9189
{3, {1170, 1300}, {540, 600}, {260, 289} },
9190
{4, {1755, 1950}, {810, 900}, {390, 433} },
9191
{5, {2340, 2600}, {1080, 1200}, {520, 578} },
9192
{6, {2633, 2925}, {1215, 1350}, {585, 650} },
9193
{7, {2925, 3250}, {1350, 1500}, {650, 722} },
9194
{8, {3510, 3900}, {1620, 1800}, {780, 867} },
9195
{9, {3900, 4333}, {1800, 2000}, {865, 960} }
9196
};
9197
9198
/*MCS parameters with Nss = 2 */
9199
static const struct ath10k_index_vht_data_rate_type supported_vht_mcs_rate_nss2[] = {
9200
/* MCS L80 S80 L40 S40 L20 S20 */
9201
{0, {585, 650}, {270, 300}, {130, 144} },
9202
{1, {1170, 1300}, {540, 600}, {260, 289} },
9203
{2, {1755, 1950}, {810, 900}, {390, 433} },
9204
{3, {2340, 2600}, {1080, 1200}, {520, 578} },
9205
{4, {3510, 3900}, {1620, 1800}, {780, 867} },
9206
{5, {4680, 5200}, {2160, 2400}, {1040, 1156} },
9207
{6, {5265, 5850}, {2430, 2700}, {1170, 1300} },
9208
{7, {5850, 6500}, {2700, 3000}, {1300, 1444} },
9209
{8, {7020, 7800}, {3240, 3600}, {1560, 1733} },
9210
{9, {7800, 8667}, {3600, 4000}, {1730, 1920} }
9211
};
9212
9213
static void ath10k_mac_get_rate_flags_ht(struct ath10k *ar, u32 rate, u8 nss, u8 mcs,
9214
u8 *flags, u8 *bw)
9215
{
9216
#if defined(__linux__)
9217
struct ath10k_index_ht_data_rate_type *mcs_rate;
9218
#elif defined(__FreeBSD__)
9219
const struct ath10k_index_ht_data_rate_type *mcs_rate;
9220
#endif
9221
u8 index;
9222
size_t len_nss1 = ARRAY_SIZE(supported_ht_mcs_rate_nss1);
9223
size_t len_nss2 = ARRAY_SIZE(supported_ht_mcs_rate_nss2);
9224
9225
if (mcs >= (len_nss1 + len_nss2)) {
9226
ath10k_warn(ar, "not supported mcs %d in current rate table", mcs);
9227
return;
9228
}
9229
9230
#if defined(__linux__)
9231
mcs_rate = (struct ath10k_index_ht_data_rate_type *)
9232
#elif defined(__FreeBSD__)
9233
mcs_rate = (const struct ath10k_index_ht_data_rate_type *)
9234
#endif
9235
((nss == 1) ? &supported_ht_mcs_rate_nss1 :
9236
&supported_ht_mcs_rate_nss2);
9237
9238
if (mcs >= len_nss1)
9239
index = mcs - len_nss1;
9240
else
9241
index = mcs;
9242
9243
if (rate == mcs_rate[index].supported_rate[0]) {
9244
*bw = RATE_INFO_BW_20;
9245
} else if (rate == mcs_rate[index].supported_rate[1]) {
9246
*bw |= RATE_INFO_BW_40;
9247
} else if (rate == mcs_rate[index].supported_rate[2]) {
9248
*bw |= RATE_INFO_BW_20;
9249
*flags |= RATE_INFO_FLAGS_SHORT_GI;
9250
} else if (rate == mcs_rate[index].supported_rate[3]) {
9251
*bw |= RATE_INFO_BW_40;
9252
*flags |= RATE_INFO_FLAGS_SHORT_GI;
9253
} else {
9254
ath10k_warn(ar, "invalid ht params rate %d 100kbps nss %d mcs %d",
9255
rate, nss, mcs);
9256
}
9257
}
9258
9259
static void ath10k_mac_get_rate_flags_vht(struct ath10k *ar, u32 rate, u8 nss, u8 mcs,
9260
u8 *flags, u8 *bw)
9261
{
9262
#if defined(__linux__)
9263
struct ath10k_index_vht_data_rate_type *mcs_rate;
9264
9265
mcs_rate = (struct ath10k_index_vht_data_rate_type *)
9266
#elif defined(__FreeBSD__)
9267
const struct ath10k_index_vht_data_rate_type *mcs_rate;
9268
9269
mcs_rate = (const struct ath10k_index_vht_data_rate_type *)
9270
#endif
9271
((nss == 1) ? &supported_vht_mcs_rate_nss1 :
9272
&supported_vht_mcs_rate_nss2);
9273
9274
if (rate == mcs_rate[mcs].supported_VHT80_rate[0]) {
9275
*bw = RATE_INFO_BW_80;
9276
} else if (rate == mcs_rate[mcs].supported_VHT80_rate[1]) {
9277
*bw = RATE_INFO_BW_80;
9278
*flags |= RATE_INFO_FLAGS_SHORT_GI;
9279
} else if (rate == mcs_rate[mcs].supported_VHT40_rate[0]) {
9280
*bw = RATE_INFO_BW_40;
9281
} else if (rate == mcs_rate[mcs].supported_VHT40_rate[1]) {
9282
*bw = RATE_INFO_BW_40;
9283
*flags |= RATE_INFO_FLAGS_SHORT_GI;
9284
} else if (rate == mcs_rate[mcs].supported_VHT20_rate[0]) {
9285
*bw = RATE_INFO_BW_20;
9286
} else if (rate == mcs_rate[mcs].supported_VHT20_rate[1]) {
9287
*bw = RATE_INFO_BW_20;
9288
*flags |= RATE_INFO_FLAGS_SHORT_GI;
9289
} else {
9290
ath10k_warn(ar, "invalid vht params rate %d 100kbps nss %d mcs %d",
9291
rate, nss, mcs);
9292
}
9293
}
9294
9295
static void ath10k_mac_get_rate_flags(struct ath10k *ar, u32 rate,
9296
enum ath10k_phy_mode mode, u8 nss, u8 mcs,
9297
u8 *flags, u8 *bw)
9298
{
9299
if (mode == ATH10K_PHY_MODE_HT) {
9300
*flags = RATE_INFO_FLAGS_MCS;
9301
ath10k_mac_get_rate_flags_ht(ar, rate, nss, mcs, flags, bw);
9302
} else if (mode == ATH10K_PHY_MODE_VHT) {
9303
*flags = RATE_INFO_FLAGS_VHT_MCS;
9304
ath10k_mac_get_rate_flags_vht(ar, rate, nss, mcs, flags, bw);
9305
}
9306
}
9307
9308
static void ath10k_mac_parse_bitrate(struct ath10k *ar, u32 rate_code,
9309
u32 bitrate_kbps, struct rate_info *rate)
9310
{
9311
enum ath10k_phy_mode mode = ATH10K_PHY_MODE_LEGACY;
9312
enum wmi_rate_preamble preamble = WMI_TLV_GET_HW_RC_PREAM_V1(rate_code);
9313
u8 nss = WMI_TLV_GET_HW_RC_NSS_V1(rate_code) + 1;
9314
u8 mcs = WMI_TLV_GET_HW_RC_RATE_V1(rate_code);
9315
u8 flags = 0, bw = 0;
9316
9317
ath10k_dbg(ar, ATH10K_DBG_MAC, "mac parse rate code 0x%x bitrate %d kbps\n",
9318
rate_code, bitrate_kbps);
9319
9320
if (preamble == WMI_RATE_PREAMBLE_HT)
9321
mode = ATH10K_PHY_MODE_HT;
9322
else if (preamble == WMI_RATE_PREAMBLE_VHT)
9323
mode = ATH10K_PHY_MODE_VHT;
9324
9325
ath10k_mac_get_rate_flags(ar, bitrate_kbps / 100, mode, nss, mcs, &flags, &bw);
9326
9327
ath10k_dbg(ar, ATH10K_DBG_MAC,
9328
"mac parse bitrate preamble %d mode %d nss %d mcs %d flags %x bw %d\n",
9329
preamble, mode, nss, mcs, flags, bw);
9330
9331
rate->flags = flags;
9332
rate->bw = bw;
9333
rate->legacy = bitrate_kbps / 100;
9334
rate->nss = nss;
9335
rate->mcs = mcs;
9336
}
9337
9338
static void ath10k_mac_sta_get_peer_stats_info(struct ath10k *ar,
9339
struct ieee80211_sta *sta,
9340
struct station_info *sinfo)
9341
{
9342
struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
9343
struct ath10k_peer *peer;
9344
unsigned long time_left;
9345
int ret;
9346
9347
if (!(ar->hw_params.supports_peer_stats_info &&
9348
arsta->arvif->vdev_type == WMI_VDEV_TYPE_STA))
9349
return;
9350
9351
spin_lock_bh(&ar->data_lock);
9352
peer = ath10k_peer_find(ar, arsta->arvif->vdev_id, sta->addr);
9353
spin_unlock_bh(&ar->data_lock);
9354
if (!peer)
9355
return;
9356
9357
reinit_completion(&ar->peer_stats_info_complete);
9358
9359
ret = ath10k_wmi_request_peer_stats_info(ar,
9360
arsta->arvif->vdev_id,
9361
WMI_REQUEST_ONE_PEER_STATS_INFO,
9362
arsta->arvif->bssid,
9363
0);
9364
if (ret && ret != -EOPNOTSUPP) {
9365
ath10k_warn(ar, "could not request peer stats info: %d\n", ret);
9366
return;
9367
}
9368
9369
time_left = wait_for_completion_timeout(&ar->peer_stats_info_complete, 3 * HZ);
9370
if (time_left == 0) {
9371
ath10k_warn(ar, "timed out waiting peer stats info\n");
9372
return;
9373
}
9374
9375
if (arsta->rx_rate_code != 0 && arsta->rx_bitrate_kbps != 0) {
9376
ath10k_mac_parse_bitrate(ar, arsta->rx_rate_code,
9377
arsta->rx_bitrate_kbps,
9378
&sinfo->rxrate);
9379
9380
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_BITRATE);
9381
arsta->rx_rate_code = 0;
9382
arsta->rx_bitrate_kbps = 0;
9383
}
9384
9385
if (arsta->tx_rate_code != 0 && arsta->tx_bitrate_kbps != 0) {
9386
ath10k_mac_parse_bitrate(ar, arsta->tx_rate_code,
9387
arsta->tx_bitrate_kbps,
9388
&sinfo->txrate);
9389
9390
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
9391
arsta->tx_rate_code = 0;
9392
arsta->tx_bitrate_kbps = 0;
9393
}
9394
}
9395
9396
static void ath10k_sta_statistics(struct ieee80211_hw *hw,
9397
struct ieee80211_vif *vif,
9398
struct ieee80211_sta *sta,
9399
struct station_info *sinfo)
9400
{
9401
struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
9402
struct ath10k *ar = arsta->arvif->ar;
9403
9404
if (!ath10k_peer_stats_enabled(ar))
9405
return;
9406
9407
mutex_lock(&ar->conf_mutex);
9408
ath10k_debug_fw_stats_request(ar);
9409
mutex_unlock(&ar->conf_mutex);
9410
9411
sinfo->rx_duration = arsta->rx_duration;
9412
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_DURATION);
9413
9414
if (arsta->txrate.legacy || arsta->txrate.nss) {
9415
if (arsta->txrate.legacy) {
9416
sinfo->txrate.legacy = arsta->txrate.legacy;
9417
} else {
9418
sinfo->txrate.mcs = arsta->txrate.mcs;
9419
sinfo->txrate.nss = arsta->txrate.nss;
9420
sinfo->txrate.bw = arsta->txrate.bw;
9421
}
9422
sinfo->txrate.flags = arsta->txrate.flags;
9423
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
9424
}
9425
9426
if (ar->htt.disable_tx_comp) {
9427
sinfo->tx_failed = arsta->tx_failed;
9428
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_FAILED);
9429
}
9430
9431
sinfo->tx_retries = arsta->tx_retries;
9432
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_RETRIES);
9433
9434
ath10k_mac_sta_get_peer_stats_info(ar, sta, sinfo);
9435
}
9436
9437
static int ath10k_mac_op_set_tid_config(struct ieee80211_hw *hw,
9438
struct ieee80211_vif *vif,
9439
struct ieee80211_sta *sta,
9440
struct cfg80211_tid_config *tid_config)
9441
{
9442
struct ath10k *ar = hw->priv;
9443
struct ath10k_vif *arvif = (void *)vif->drv_priv;
9444
struct ath10k_mac_iter_tid_conf_data data = {};
9445
struct wmi_per_peer_per_tid_cfg_arg arg = {};
9446
int ret, i;
9447
9448
mutex_lock(&ar->conf_mutex);
9449
arg.vdev_id = arvif->vdev_id;
9450
9451
arvif->tids_rst = 0;
9452
memset(arvif->tid_conf_changed, 0, sizeof(arvif->tid_conf_changed));
9453
9454
for (i = 0; i < tid_config->n_tid_conf; i++) {
9455
ret = ath10k_mac_parse_tid_config(ar, sta, vif,
9456
&tid_config->tid_conf[i],
9457
&arg);
9458
if (ret)
9459
goto exit;
9460
}
9461
9462
ret = 0;
9463
9464
if (sta)
9465
goto exit;
9466
9467
arvif->tids_rst = 0;
9468
data.curr_vif = vif;
9469
data.ar = ar;
9470
9471
ieee80211_iterate_stations_atomic(hw, ath10k_mac_vif_stations_tid_conf,
9472
&data);
9473
9474
exit:
9475
mutex_unlock(&ar->conf_mutex);
9476
return ret;
9477
}
9478
9479
static int ath10k_mac_op_reset_tid_config(struct ieee80211_hw *hw,
9480
struct ieee80211_vif *vif,
9481
struct ieee80211_sta *sta,
9482
u8 tids)
9483
{
9484
struct ath10k_vif *arvif = (void *)vif->drv_priv;
9485
struct ath10k_mac_iter_tid_conf_data data = {};
9486
struct ath10k *ar = hw->priv;
9487
int ret = 0;
9488
9489
mutex_lock(&ar->conf_mutex);
9490
9491
if (sta) {
9492
arvif->tids_rst = 0;
9493
ret = ath10k_mac_reset_tid_config(ar, sta, arvif, tids);
9494
goto exit;
9495
}
9496
9497
arvif->tids_rst = tids;
9498
data.curr_vif = vif;
9499
data.ar = ar;
9500
ieee80211_iterate_stations_atomic(hw, ath10k_mac_vif_stations_tid_conf,
9501
&data);
9502
9503
exit:
9504
mutex_unlock(&ar->conf_mutex);
9505
return ret;
9506
}
9507
9508
static const struct ieee80211_ops ath10k_ops = {
9509
.tx = ath10k_mac_op_tx,
9510
.wake_tx_queue = ath10k_mac_op_wake_tx_queue,
9511
.start = ath10k_start,
9512
.stop = ath10k_stop,
9513
.config = ath10k_config,
9514
.add_interface = ath10k_add_interface,
9515
.update_vif_offload = ath10k_update_vif_offload,
9516
.remove_interface = ath10k_remove_interface,
9517
.configure_filter = ath10k_configure_filter,
9518
.bss_info_changed = ath10k_bss_info_changed,
9519
.set_coverage_class = ath10k_mac_op_set_coverage_class,
9520
.hw_scan = ath10k_hw_scan,
9521
.cancel_hw_scan = ath10k_cancel_hw_scan,
9522
.set_key = ath10k_set_key,
9523
.set_default_unicast_key = ath10k_set_default_unicast_key,
9524
.sta_state = ath10k_sta_state,
9525
.sta_set_txpwr = ath10k_sta_set_txpwr,
9526
.conf_tx = ath10k_conf_tx,
9527
.remain_on_channel = ath10k_remain_on_channel,
9528
.cancel_remain_on_channel = ath10k_cancel_remain_on_channel,
9529
.set_rts_threshold = ath10k_set_rts_threshold,
9530
.set_frag_threshold = ath10k_mac_op_set_frag_threshold,
9531
.flush = ath10k_flush,
9532
.tx_last_beacon = ath10k_tx_last_beacon,
9533
.set_antenna = ath10k_set_antenna,
9534
.get_antenna = ath10k_get_antenna,
9535
.reconfig_complete = ath10k_reconfig_complete,
9536
.get_survey = ath10k_get_survey,
9537
.set_bitrate_mask = ath10k_mac_op_set_bitrate_mask,
9538
.link_sta_rc_update = ath10k_sta_rc_update,
9539
.offset_tsf = ath10k_offset_tsf,
9540
.ampdu_action = ath10k_ampdu_action,
9541
.get_et_sset_count = ath10k_debug_get_et_sset_count,
9542
.get_et_stats = ath10k_debug_get_et_stats,
9543
.get_et_strings = ath10k_debug_get_et_strings,
9544
.add_chanctx = ath10k_mac_op_add_chanctx,
9545
.remove_chanctx = ath10k_mac_op_remove_chanctx,
9546
.change_chanctx = ath10k_mac_op_change_chanctx,
9547
.assign_vif_chanctx = ath10k_mac_op_assign_vif_chanctx,
9548
.unassign_vif_chanctx = ath10k_mac_op_unassign_vif_chanctx,
9549
.switch_vif_chanctx = ath10k_mac_op_switch_vif_chanctx,
9550
.sta_pre_rcu_remove = ath10k_mac_op_sta_pre_rcu_remove,
9551
.sta_statistics = ath10k_sta_statistics,
9552
.set_tid_config = ath10k_mac_op_set_tid_config,
9553
.reset_tid_config = ath10k_mac_op_reset_tid_config,
9554
9555
CFG80211_TESTMODE_CMD(ath10k_tm_cmd)
9556
9557
#ifdef CONFIG_PM
9558
.suspend = ath10k_wow_op_suspend,
9559
.resume = ath10k_wow_op_resume,
9560
.set_wakeup = ath10k_wow_op_set_wakeup,
9561
#endif
9562
#ifdef CONFIG_MAC80211_DEBUGFS
9563
.sta_add_debugfs = ath10k_sta_add_debugfs,
9564
#endif
9565
.set_sar_specs = ath10k_mac_set_sar_specs,
9566
};
9567
9568
#define CHAN2G(_channel, _freq, _flags) { \
9569
.band = NL80211_BAND_2GHZ, \
9570
.hw_value = (_channel), \
9571
.center_freq = (_freq), \
9572
.flags = (_flags), \
9573
.max_antenna_gain = 0, \
9574
.max_power = 30, \
9575
}
9576
9577
#define CHAN5G(_channel, _freq, _flags) { \
9578
.band = NL80211_BAND_5GHZ, \
9579
.hw_value = (_channel), \
9580
.center_freq = (_freq), \
9581
.flags = (_flags), \
9582
.max_antenna_gain = 0, \
9583
.max_power = 30, \
9584
}
9585
9586
static const struct ieee80211_channel ath10k_2ghz_channels[] = {
9587
CHAN2G(1, 2412, 0),
9588
CHAN2G(2, 2417, 0),
9589
CHAN2G(3, 2422, 0),
9590
CHAN2G(4, 2427, 0),
9591
CHAN2G(5, 2432, 0),
9592
CHAN2G(6, 2437, 0),
9593
CHAN2G(7, 2442, 0),
9594
CHAN2G(8, 2447, 0),
9595
CHAN2G(9, 2452, 0),
9596
CHAN2G(10, 2457, 0),
9597
CHAN2G(11, 2462, 0),
9598
CHAN2G(12, 2467, 0),
9599
CHAN2G(13, 2472, 0),
9600
CHAN2G(14, 2484, 0),
9601
};
9602
9603
static const struct ieee80211_channel ath10k_5ghz_channels[] = {
9604
CHAN5G(36, 5180, 0),
9605
CHAN5G(40, 5200, 0),
9606
CHAN5G(44, 5220, 0),
9607
CHAN5G(48, 5240, 0),
9608
CHAN5G(52, 5260, 0),
9609
CHAN5G(56, 5280, 0),
9610
CHAN5G(60, 5300, 0),
9611
CHAN5G(64, 5320, 0),
9612
CHAN5G(100, 5500, 0),
9613
CHAN5G(104, 5520, 0),
9614
CHAN5G(108, 5540, 0),
9615
CHAN5G(112, 5560, 0),
9616
CHAN5G(116, 5580, 0),
9617
CHAN5G(120, 5600, 0),
9618
CHAN5G(124, 5620, 0),
9619
CHAN5G(128, 5640, 0),
9620
CHAN5G(132, 5660, 0),
9621
CHAN5G(136, 5680, 0),
9622
CHAN5G(140, 5700, 0),
9623
CHAN5G(144, 5720, 0),
9624
CHAN5G(149, 5745, 0),
9625
CHAN5G(153, 5765, 0),
9626
CHAN5G(157, 5785, 0),
9627
CHAN5G(161, 5805, 0),
9628
CHAN5G(165, 5825, 0),
9629
CHAN5G(169, 5845, 0),
9630
CHAN5G(173, 5865, 0),
9631
/* If you add more, you may need to change ATH10K_MAX_5G_CHAN */
9632
/* And you will definitely need to change ATH10K_NUM_CHANS in core.h */
9633
};
9634
9635
struct ath10k *ath10k_mac_create(size_t priv_size)
9636
{
9637
struct ieee80211_hw *hw;
9638
struct ieee80211_ops *ops;
9639
struct ath10k *ar;
9640
9641
ops = kmemdup(&ath10k_ops, sizeof(ath10k_ops), GFP_KERNEL);
9642
if (!ops)
9643
return NULL;
9644
9645
hw = ieee80211_alloc_hw(sizeof(struct ath10k) + priv_size, ops);
9646
if (!hw) {
9647
kfree(ops);
9648
return NULL;
9649
}
9650
9651
ar = hw->priv;
9652
ar->hw = hw;
9653
ar->ops = ops;
9654
9655
return ar;
9656
}
9657
9658
void ath10k_mac_destroy(struct ath10k *ar)
9659
{
9660
struct ieee80211_ops *ops = ar->ops;
9661
9662
ieee80211_free_hw(ar->hw);
9663
kfree(ops);
9664
}
9665
9666
static const struct ieee80211_iface_limit ath10k_if_limits[] = {
9667
{
9668
.max = 8,
9669
.types = BIT(NL80211_IFTYPE_STATION)
9670
| BIT(NL80211_IFTYPE_P2P_CLIENT)
9671
},
9672
{
9673
.max = 3,
9674
.types = BIT(NL80211_IFTYPE_P2P_GO)
9675
},
9676
{
9677
.max = 1,
9678
.types = BIT(NL80211_IFTYPE_P2P_DEVICE)
9679
},
9680
{
9681
.max = 7,
9682
.types = BIT(NL80211_IFTYPE_AP)
9683
#ifdef CONFIG_MAC80211_MESH
9684
| BIT(NL80211_IFTYPE_MESH_POINT)
9685
#endif
9686
},
9687
};
9688
9689
static const struct ieee80211_iface_limit ath10k_10x_if_limits[] = {
9690
{
9691
.max = 8,
9692
.types = BIT(NL80211_IFTYPE_AP)
9693
#ifdef CONFIG_MAC80211_MESH
9694
| BIT(NL80211_IFTYPE_MESH_POINT)
9695
#endif
9696
},
9697
{
9698
.max = 1,
9699
.types = BIT(NL80211_IFTYPE_STATION)
9700
},
9701
};
9702
9703
static const struct ieee80211_iface_combination ath10k_if_comb[] = {
9704
{
9705
.limits = ath10k_if_limits,
9706
.n_limits = ARRAY_SIZE(ath10k_if_limits),
9707
.max_interfaces = 8,
9708
.num_different_channels = 1,
9709
.beacon_int_infra_match = true,
9710
},
9711
};
9712
9713
static const struct ieee80211_iface_combination ath10k_10x_if_comb[] = {
9714
{
9715
.limits = ath10k_10x_if_limits,
9716
.n_limits = ARRAY_SIZE(ath10k_10x_if_limits),
9717
.max_interfaces = 8,
9718
.num_different_channels = 1,
9719
.beacon_int_infra_match = true,
9720
.beacon_int_min_gcd = 1,
9721
#ifdef CONFIG_ATH10K_DFS_CERTIFIED
9722
.radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
9723
BIT(NL80211_CHAN_WIDTH_20) |
9724
BIT(NL80211_CHAN_WIDTH_40) |
9725
BIT(NL80211_CHAN_WIDTH_80),
9726
#endif
9727
},
9728
};
9729
9730
static const struct ieee80211_iface_limit ath10k_tlv_if_limit[] = {
9731
{
9732
.max = 2,
9733
.types = BIT(NL80211_IFTYPE_STATION),
9734
},
9735
{
9736
.max = 2,
9737
.types = BIT(NL80211_IFTYPE_AP) |
9738
#ifdef CONFIG_MAC80211_MESH
9739
BIT(NL80211_IFTYPE_MESH_POINT) |
9740
#endif
9741
BIT(NL80211_IFTYPE_P2P_CLIENT) |
9742
BIT(NL80211_IFTYPE_P2P_GO),
9743
},
9744
{
9745
.max = 1,
9746
.types = BIT(NL80211_IFTYPE_P2P_DEVICE),
9747
},
9748
};
9749
9750
static const struct ieee80211_iface_limit ath10k_tlv_qcs_if_limit[] = {
9751
{
9752
.max = 2,
9753
.types = BIT(NL80211_IFTYPE_STATION),
9754
},
9755
{
9756
.max = 2,
9757
.types = BIT(NL80211_IFTYPE_P2P_CLIENT),
9758
},
9759
{
9760
.max = 1,
9761
.types = BIT(NL80211_IFTYPE_AP) |
9762
#ifdef CONFIG_MAC80211_MESH
9763
BIT(NL80211_IFTYPE_MESH_POINT) |
9764
#endif
9765
BIT(NL80211_IFTYPE_P2P_GO),
9766
},
9767
{
9768
.max = 1,
9769
.types = BIT(NL80211_IFTYPE_P2P_DEVICE),
9770
},
9771
};
9772
9773
static const struct ieee80211_iface_limit ath10k_tlv_if_limit_ibss[] = {
9774
{
9775
.max = 1,
9776
.types = BIT(NL80211_IFTYPE_STATION),
9777
},
9778
{
9779
.max = 1,
9780
.types = BIT(NL80211_IFTYPE_ADHOC),
9781
},
9782
};
9783
9784
/* FIXME: This is not thoroughly tested. These combinations may over- or
9785
* underestimate hw/fw capabilities.
9786
*/
9787
static struct ieee80211_iface_combination ath10k_tlv_if_comb[] = {
9788
{
9789
.limits = ath10k_tlv_if_limit,
9790
.num_different_channels = 1,
9791
.max_interfaces = 4,
9792
.n_limits = ARRAY_SIZE(ath10k_tlv_if_limit),
9793
},
9794
{
9795
.limits = ath10k_tlv_if_limit_ibss,
9796
.num_different_channels = 1,
9797
.max_interfaces = 2,
9798
.n_limits = ARRAY_SIZE(ath10k_tlv_if_limit_ibss),
9799
},
9800
};
9801
9802
static struct ieee80211_iface_combination ath10k_tlv_qcs_if_comb[] = {
9803
{
9804
.limits = ath10k_tlv_if_limit,
9805
.num_different_channels = 1,
9806
.max_interfaces = 4,
9807
.n_limits = ARRAY_SIZE(ath10k_tlv_if_limit),
9808
},
9809
{
9810
.limits = ath10k_tlv_qcs_if_limit,
9811
.num_different_channels = 2,
9812
.max_interfaces = 4,
9813
.n_limits = ARRAY_SIZE(ath10k_tlv_qcs_if_limit),
9814
},
9815
{
9816
.limits = ath10k_tlv_if_limit_ibss,
9817
.num_different_channels = 1,
9818
.max_interfaces = 2,
9819
.n_limits = ARRAY_SIZE(ath10k_tlv_if_limit_ibss),
9820
},
9821
};
9822
9823
static const struct ieee80211_iface_limit ath10k_10_4_if_limits[] = {
9824
{
9825
.max = 1,
9826
.types = BIT(NL80211_IFTYPE_STATION),
9827
},
9828
{
9829
.max = 16,
9830
.types = BIT(NL80211_IFTYPE_AP)
9831
#ifdef CONFIG_MAC80211_MESH
9832
| BIT(NL80211_IFTYPE_MESH_POINT)
9833
#endif
9834
},
9835
};
9836
9837
static const struct ieee80211_iface_combination ath10k_10_4_if_comb[] = {
9838
{
9839
.limits = ath10k_10_4_if_limits,
9840
.n_limits = ARRAY_SIZE(ath10k_10_4_if_limits),
9841
.max_interfaces = 16,
9842
.num_different_channels = 1,
9843
.beacon_int_infra_match = true,
9844
.beacon_int_min_gcd = 1,
9845
#ifdef CONFIG_ATH10K_DFS_CERTIFIED
9846
.radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
9847
BIT(NL80211_CHAN_WIDTH_20) |
9848
BIT(NL80211_CHAN_WIDTH_40) |
9849
BIT(NL80211_CHAN_WIDTH_80) |
9850
BIT(NL80211_CHAN_WIDTH_80P80) |
9851
BIT(NL80211_CHAN_WIDTH_160),
9852
#endif
9853
},
9854
};
9855
9856
static const struct
9857
ieee80211_iface_combination ath10k_10_4_bcn_int_if_comb[] = {
9858
{
9859
.limits = ath10k_10_4_if_limits,
9860
.n_limits = ARRAY_SIZE(ath10k_10_4_if_limits),
9861
.max_interfaces = 16,
9862
.num_different_channels = 1,
9863
.beacon_int_infra_match = true,
9864
.beacon_int_min_gcd = 100,
9865
#ifdef CONFIG_ATH10K_DFS_CERTIFIED
9866
.radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
9867
BIT(NL80211_CHAN_WIDTH_20) |
9868
BIT(NL80211_CHAN_WIDTH_40) |
9869
BIT(NL80211_CHAN_WIDTH_80) |
9870
BIT(NL80211_CHAN_WIDTH_80P80) |
9871
BIT(NL80211_CHAN_WIDTH_160),
9872
#endif
9873
},
9874
};
9875
9876
static void ath10k_get_arvif_iter(void *data, u8 *mac,
9877
struct ieee80211_vif *vif)
9878
{
9879
struct ath10k_vif_iter *arvif_iter = data;
9880
struct ath10k_vif *arvif = (void *)vif->drv_priv;
9881
9882
if (arvif->vdev_id == arvif_iter->vdev_id)
9883
arvif_iter->arvif = arvif;
9884
}
9885
9886
struct ath10k_vif *ath10k_get_arvif(struct ath10k *ar, u32 vdev_id)
9887
{
9888
struct ath10k_vif_iter arvif_iter;
9889
9890
memset(&arvif_iter, 0, sizeof(struct ath10k_vif_iter));
9891
arvif_iter.vdev_id = vdev_id;
9892
9893
ieee80211_iterate_active_interfaces_atomic(ar->hw,
9894
ATH10K_ITER_RESUME_FLAGS,
9895
ath10k_get_arvif_iter,
9896
&arvif_iter);
9897
if (!arvif_iter.arvif) {
9898
ath10k_warn(ar, "No VIF found for vdev %d\n", vdev_id);
9899
return NULL;
9900
}
9901
9902
return arvif_iter.arvif;
9903
}
9904
9905
#define WRD_METHOD "WRDD"
9906
#define WRDD_WIFI (0x07)
9907
9908
static u32 ath10k_mac_wrdd_get_mcc(struct ath10k *ar, union acpi_object *wrdd)
9909
{
9910
union acpi_object *mcc_pkg;
9911
union acpi_object *domain_type;
9912
union acpi_object *mcc_value;
9913
u32 i;
9914
9915
if (wrdd->type != ACPI_TYPE_PACKAGE ||
9916
wrdd->package.count < 2 ||
9917
wrdd->package.elements[0].type != ACPI_TYPE_INTEGER ||
9918
wrdd->package.elements[0].integer.value != 0) {
9919
ath10k_warn(ar, "ignoring malformed/unsupported wrdd structure\n");
9920
return 0;
9921
}
9922
9923
for (i = 1; i < wrdd->package.count; ++i) {
9924
mcc_pkg = &wrdd->package.elements[i];
9925
9926
if (mcc_pkg->type != ACPI_TYPE_PACKAGE)
9927
continue;
9928
if (mcc_pkg->package.count < 2)
9929
continue;
9930
if (mcc_pkg->package.elements[0].type != ACPI_TYPE_INTEGER ||
9931
mcc_pkg->package.elements[1].type != ACPI_TYPE_INTEGER)
9932
continue;
9933
9934
domain_type = &mcc_pkg->package.elements[0];
9935
if (domain_type->integer.value != WRDD_WIFI)
9936
continue;
9937
9938
mcc_value = &mcc_pkg->package.elements[1];
9939
return mcc_value->integer.value;
9940
}
9941
return 0;
9942
}
9943
9944
static int ath10k_mac_get_wrdd_regulatory(struct ath10k *ar, u16 *rd)
9945
{
9946
acpi_handle root_handle;
9947
acpi_handle handle;
9948
struct acpi_buffer wrdd = {ACPI_ALLOCATE_BUFFER, NULL};
9949
acpi_status status;
9950
u32 alpha2_code;
9951
char alpha2[3];
9952
9953
root_handle = ACPI_HANDLE(ar->dev);
9954
if (!root_handle)
9955
return -EOPNOTSUPP;
9956
9957
status = acpi_get_handle(root_handle, (acpi_string)WRD_METHOD, &handle);
9958
if (ACPI_FAILURE(status)) {
9959
ath10k_dbg(ar, ATH10K_DBG_BOOT,
9960
"failed to get wrd method %d\n", status);
9961
return -EIO;
9962
}
9963
9964
status = acpi_evaluate_object(handle, NULL, NULL, &wrdd);
9965
if (ACPI_FAILURE(status)) {
9966
ath10k_dbg(ar, ATH10K_DBG_BOOT,
9967
"failed to call wrdc %d\n", status);
9968
return -EIO;
9969
}
9970
9971
alpha2_code = ath10k_mac_wrdd_get_mcc(ar, wrdd.pointer);
9972
kfree(wrdd.pointer);
9973
if (!alpha2_code)
9974
return -EIO;
9975
9976
alpha2[0] = (alpha2_code >> 8) & 0xff;
9977
alpha2[1] = (alpha2_code >> 0) & 0xff;
9978
alpha2[2] = '\0';
9979
9980
ath10k_dbg(ar, ATH10K_DBG_BOOT,
9981
"regulatory hint from WRDD (alpha2-code): %s\n", alpha2);
9982
9983
*rd = ath_regd_find_country_by_name(alpha2);
9984
if (*rd == 0xffff)
9985
return -EIO;
9986
9987
*rd |= COUNTRY_ERD_FLAG;
9988
return 0;
9989
}
9990
9991
static int ath10k_mac_init_rd(struct ath10k *ar)
9992
{
9993
int ret;
9994
u16 rd;
9995
9996
ret = ath10k_mac_get_wrdd_regulatory(ar, &rd);
9997
if (ret) {
9998
ath10k_dbg(ar, ATH10K_DBG_BOOT,
9999
"fallback to eeprom programmed regulatory settings\n");
10000
rd = ar->hw_eeprom_rd;
10001
}
10002
10003
ar->ath_common.regulatory.current_rd = rd;
10004
return 0;
10005
}
10006
10007
int ath10k_mac_register(struct ath10k *ar)
10008
{
10009
static const u32 cipher_suites[] = {
10010
WLAN_CIPHER_SUITE_WEP40,
10011
WLAN_CIPHER_SUITE_WEP104,
10012
WLAN_CIPHER_SUITE_TKIP,
10013
WLAN_CIPHER_SUITE_CCMP,
10014
10015
/* Do not add hardware supported ciphers before this line.
10016
* Allow software encryption for all chips. Don't forget to
10017
* update n_cipher_suites below.
10018
*/
10019
WLAN_CIPHER_SUITE_AES_CMAC,
10020
WLAN_CIPHER_SUITE_BIP_CMAC_256,
10021
WLAN_CIPHER_SUITE_BIP_GMAC_128,
10022
WLAN_CIPHER_SUITE_BIP_GMAC_256,
10023
10024
/* Only QCA99x0 and QCA4019 variants support GCMP-128, GCMP-256
10025
* and CCMP-256 in hardware.
10026
*/
10027
WLAN_CIPHER_SUITE_GCMP,
10028
WLAN_CIPHER_SUITE_GCMP_256,
10029
WLAN_CIPHER_SUITE_CCMP_256,
10030
};
10031
struct ieee80211_supported_band *band;
10032
void *channels;
10033
int ret;
10034
10035
if (!is_valid_ether_addr(ar->mac_addr)) {
10036
ath10k_warn(ar, "invalid MAC address; choosing random\n");
10037
eth_random_addr(ar->mac_addr);
10038
}
10039
SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr);
10040
10041
SET_IEEE80211_DEV(ar->hw, ar->dev);
10042
10043
BUILD_BUG_ON((ARRAY_SIZE(ath10k_2ghz_channels) +
10044
ARRAY_SIZE(ath10k_5ghz_channels)) !=
10045
ATH10K_NUM_CHANS);
10046
10047
if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) {
10048
channels = kmemdup(ath10k_2ghz_channels,
10049
sizeof(ath10k_2ghz_channels),
10050
GFP_KERNEL);
10051
if (!channels) {
10052
ret = -ENOMEM;
10053
goto err_free;
10054
}
10055
10056
band = &ar->mac.sbands[NL80211_BAND_2GHZ];
10057
band->n_channels = ARRAY_SIZE(ath10k_2ghz_channels);
10058
band->channels = channels;
10059
10060
if (ar->hw_params.cck_rate_map_rev2) {
10061
band->n_bitrates = ath10k_g_rates_rev2_size;
10062
band->bitrates = ath10k_g_rates_rev2;
10063
} else {
10064
band->n_bitrates = ath10k_g_rates_size;
10065
band->bitrates = ath10k_g_rates;
10066
}
10067
10068
ar->hw->wiphy->bands[NL80211_BAND_2GHZ] = band;
10069
}
10070
10071
if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) {
10072
channels = kmemdup(ath10k_5ghz_channels,
10073
sizeof(ath10k_5ghz_channels),
10074
GFP_KERNEL);
10075
if (!channels) {
10076
ret = -ENOMEM;
10077
goto err_free;
10078
}
10079
10080
band = &ar->mac.sbands[NL80211_BAND_5GHZ];
10081
band->n_channels = ARRAY_SIZE(ath10k_5ghz_channels);
10082
band->channels = channels;
10083
band->n_bitrates = ath10k_a_rates_size;
10084
band->bitrates = ath10k_a_rates;
10085
ar->hw->wiphy->bands[NL80211_BAND_5GHZ] = band;
10086
}
10087
10088
wiphy_read_of_freq_limits(ar->hw->wiphy);
10089
ath10k_mac_setup_ht_vht_cap(ar);
10090
10091
ar->hw->wiphy->interface_modes =
10092
BIT(NL80211_IFTYPE_STATION) |
10093
BIT(NL80211_IFTYPE_AP) |
10094
BIT(NL80211_IFTYPE_MESH_POINT);
10095
10096
ar->hw->wiphy->available_antennas_rx = ar->cfg_rx_chainmask;
10097
ar->hw->wiphy->available_antennas_tx = ar->cfg_tx_chainmask;
10098
10099
if (!test_bit(ATH10K_FW_FEATURE_NO_P2P, ar->normal_mode_fw.fw_file.fw_features))
10100
ar->hw->wiphy->interface_modes |=
10101
BIT(NL80211_IFTYPE_P2P_DEVICE) |
10102
BIT(NL80211_IFTYPE_P2P_CLIENT) |
10103
BIT(NL80211_IFTYPE_P2P_GO);
10104
10105
ieee80211_hw_set(ar->hw, SIGNAL_DBM);
10106
10107
if (!test_bit(ATH10K_FW_FEATURE_NO_PS,
10108
ar->running_fw->fw_file.fw_features)) {
10109
ieee80211_hw_set(ar->hw, SUPPORTS_PS);
10110
ieee80211_hw_set(ar->hw, SUPPORTS_DYNAMIC_PS);
10111
}
10112
10113
ieee80211_hw_set(ar->hw, MFP_CAPABLE);
10114
ieee80211_hw_set(ar->hw, REPORTS_TX_ACK_STATUS);
10115
ieee80211_hw_set(ar->hw, HAS_RATE_CONTROL);
10116
ieee80211_hw_set(ar->hw, AP_LINK_PS);
10117
ieee80211_hw_set(ar->hw, SPECTRUM_MGMT);
10118
ieee80211_hw_set(ar->hw, SUPPORT_FAST_XMIT);
10119
ieee80211_hw_set(ar->hw, CONNECTION_MONITOR);
10120
ieee80211_hw_set(ar->hw, SUPPORTS_PER_STA_GTK);
10121
ieee80211_hw_set(ar->hw, WANT_MONITOR_VIF);
10122
ieee80211_hw_set(ar->hw, CHANCTX_STA_CSA);
10123
ieee80211_hw_set(ar->hw, QUEUE_CONTROL);
10124
ieee80211_hw_set(ar->hw, SUPPORTS_TX_FRAG);
10125
ieee80211_hw_set(ar->hw, REPORTS_LOW_ACK);
10126
10127
if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags))
10128
ieee80211_hw_set(ar->hw, SW_CRYPTO_CONTROL);
10129
10130
ar->hw->wiphy->features |= NL80211_FEATURE_STATIC_SMPS;
10131
ar->hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
10132
10133
if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS)
10134
ar->hw->wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS;
10135
10136
if (ar->ht_cap_info & WMI_HT_CAP_ENABLED) {
10137
ieee80211_hw_set(ar->hw, AMPDU_AGGREGATION);
10138
ieee80211_hw_set(ar->hw, TX_AMPDU_SETUP_IN_HW);
10139
}
10140
10141
ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID;
10142
ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN;
10143
10144
if (test_bit(WMI_SERVICE_NLO, ar->wmi.svc_map)) {
10145
ar->hw->wiphy->max_sched_scan_ssids = WMI_PNO_MAX_SUPP_NETWORKS;
10146
ar->hw->wiphy->max_match_sets = WMI_PNO_MAX_SUPP_NETWORKS;
10147
ar->hw->wiphy->max_sched_scan_ie_len = WMI_PNO_MAX_IE_LENGTH;
10148
ar->hw->wiphy->max_sched_scan_plans = WMI_PNO_MAX_SCHED_SCAN_PLANS;
10149
ar->hw->wiphy->max_sched_scan_plan_interval =
10150
WMI_PNO_MAX_SCHED_SCAN_PLAN_INT;
10151
ar->hw->wiphy->max_sched_scan_plan_iterations =
10152
WMI_PNO_MAX_SCHED_SCAN_PLAN_ITRNS;
10153
ar->hw->wiphy->features |= NL80211_FEATURE_ND_RANDOM_MAC_ADDR;
10154
}
10155
10156
ar->hw->vif_data_size = sizeof(struct ath10k_vif);
10157
ar->hw->sta_data_size = sizeof(struct ath10k_sta);
10158
ar->hw->txq_data_size = sizeof(struct ath10k_txq);
10159
10160
ar->hw->max_listen_interval = ATH10K_MAX_HW_LISTEN_INTERVAL;
10161
10162
if (test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map)) {
10163
ar->hw->wiphy->flags |= WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD;
10164
10165
/* Firmware delivers WPS/P2P Probe Requests frames to driver so
10166
* that userspace (e.g. wpa_supplicant/hostapd) can generate
10167
* correct Probe Responses. This is more of a hack advert..
10168
*/
10169
ar->hw->wiphy->probe_resp_offload |=
10170
NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS |
10171
NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS2 |
10172
NL80211_PROBE_RESP_OFFLOAD_SUPPORT_P2P;
10173
}
10174
10175
if (test_bit(WMI_SERVICE_TDLS, ar->wmi.svc_map) ||
10176
test_bit(WMI_SERVICE_TDLS_EXPLICIT_MODE_ONLY, ar->wmi.svc_map)) {
10177
ar->hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS;
10178
if (test_bit(WMI_SERVICE_TDLS_WIDER_BANDWIDTH, ar->wmi.svc_map))
10179
ieee80211_hw_set(ar->hw, TDLS_WIDER_BW);
10180
}
10181
10182
if (test_bit(WMI_SERVICE_TDLS_UAPSD_BUFFER_STA, ar->wmi.svc_map))
10183
ieee80211_hw_set(ar->hw, SUPPORTS_TDLS_BUFFER_STA);
10184
10185
if (ath10k_frame_mode == ATH10K_HW_TXRX_ETHERNET) {
10186
if (ar->wmi.vdev_param->tx_encap_type !=
10187
WMI_VDEV_PARAM_UNSUPPORTED)
10188
ieee80211_hw_set(ar->hw, SUPPORTS_TX_ENCAP_OFFLOAD);
10189
}
10190
10191
ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
10192
ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
10193
ar->hw->wiphy->max_remain_on_channel_duration = 5000;
10194
10195
ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
10196
ar->hw->wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE |
10197
NL80211_FEATURE_AP_SCAN;
10198
10199
ar->hw->wiphy->max_ap_assoc_sta = ar->max_num_stations;
10200
10201
ret = ath10k_wow_init(ar);
10202
if (ret) {
10203
ath10k_warn(ar, "failed to init wow: %d\n", ret);
10204
goto err_free;
10205
}
10206
10207
wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_VHT_IBSS);
10208
wiphy_ext_feature_set(ar->hw->wiphy,
10209
NL80211_EXT_FEATURE_SET_SCAN_DWELL);
10210
wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_AQL);
10211
10212
if (ar->hw_params.mcast_frame_registration)
10213
wiphy_ext_feature_set(ar->hw->wiphy,
10214
NL80211_EXT_FEATURE_MULTICAST_REGISTRATIONS);
10215
10216
if (test_bit(WMI_SERVICE_TX_DATA_ACK_RSSI, ar->wmi.svc_map) ||
10217
test_bit(WMI_SERVICE_HTT_MGMT_TX_COMP_VALID_FLAGS, ar->wmi.svc_map))
10218
wiphy_ext_feature_set(ar->hw->wiphy,
10219
NL80211_EXT_FEATURE_ACK_SIGNAL_SUPPORT);
10220
10221
if (ath10k_peer_stats_enabled(ar) ||
10222
test_bit(WMI_SERVICE_REPORT_AIRTIME, ar->wmi.svc_map))
10223
wiphy_ext_feature_set(ar->hw->wiphy,
10224
NL80211_EXT_FEATURE_AIRTIME_FAIRNESS);
10225
10226
if (test_bit(WMI_SERVICE_RTT_RESPONDER_ROLE, ar->wmi.svc_map))
10227
wiphy_ext_feature_set(ar->hw->wiphy,
10228
NL80211_EXT_FEATURE_ENABLE_FTM_RESPONDER);
10229
10230
if (test_bit(WMI_SERVICE_TX_PWR_PER_PEER, ar->wmi.svc_map))
10231
wiphy_ext_feature_set(ar->hw->wiphy,
10232
NL80211_EXT_FEATURE_STA_TX_PWR);
10233
10234
if (test_bit(WMI_SERVICE_PEER_TID_CONFIGS_SUPPORT, ar->wmi.svc_map)) {
10235
ar->hw->wiphy->tid_config_support.vif |=
10236
BIT(NL80211_TID_CONFIG_ATTR_NOACK) |
10237
BIT(NL80211_TID_CONFIG_ATTR_RETRY_SHORT) |
10238
BIT(NL80211_TID_CONFIG_ATTR_RETRY_LONG) |
10239
BIT(NL80211_TID_CONFIG_ATTR_AMPDU_CTRL) |
10240
BIT(NL80211_TID_CONFIG_ATTR_TX_RATE) |
10241
BIT(NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE);
10242
10243
if (test_bit(WMI_SERVICE_EXT_PEER_TID_CONFIGS_SUPPORT,
10244
ar->wmi.svc_map)) {
10245
ar->hw->wiphy->tid_config_support.vif |=
10246
BIT(NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL);
10247
}
10248
10249
ar->hw->wiphy->tid_config_support.peer =
10250
ar->hw->wiphy->tid_config_support.vif;
10251
ar->hw->wiphy->max_data_retry_count = ATH10K_MAX_RETRY_COUNT;
10252
} else {
10253
ar->ops->set_tid_config = NULL;
10254
}
10255
/*
10256
* on LL hardware queues are managed entirely by the FW
10257
* so we only advertise to mac we can do the queues thing
10258
*/
10259
ar->hw->queues = IEEE80211_MAX_QUEUES;
10260
10261
/* vdev_ids are used as hw queue numbers. Make sure offchan tx queue is
10262
* something that vdev_ids can't reach so that we don't stop the queue
10263
* accidentally.
10264
*/
10265
ar->hw->offchannel_tx_hw_queue = IEEE80211_MAX_QUEUES - 1;
10266
10267
switch (ar->running_fw->fw_file.wmi_op_version) {
10268
case ATH10K_FW_WMI_OP_VERSION_MAIN:
10269
ar->hw->wiphy->iface_combinations = ath10k_if_comb;
10270
ar->hw->wiphy->n_iface_combinations =
10271
ARRAY_SIZE(ath10k_if_comb);
10272
ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC);
10273
break;
10274
case ATH10K_FW_WMI_OP_VERSION_TLV:
10275
if (test_bit(WMI_SERVICE_ADAPTIVE_OCS, ar->wmi.svc_map)) {
10276
ar->hw->wiphy->iface_combinations =
10277
ath10k_tlv_qcs_if_comb;
10278
ar->hw->wiphy->n_iface_combinations =
10279
ARRAY_SIZE(ath10k_tlv_qcs_if_comb);
10280
} else {
10281
ar->hw->wiphy->iface_combinations = ath10k_tlv_if_comb;
10282
ar->hw->wiphy->n_iface_combinations =
10283
ARRAY_SIZE(ath10k_tlv_if_comb);
10284
}
10285
ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC);
10286
break;
10287
case ATH10K_FW_WMI_OP_VERSION_10_1:
10288
case ATH10K_FW_WMI_OP_VERSION_10_2:
10289
case ATH10K_FW_WMI_OP_VERSION_10_2_4:
10290
ar->hw->wiphy->iface_combinations = ath10k_10x_if_comb;
10291
ar->hw->wiphy->n_iface_combinations =
10292
ARRAY_SIZE(ath10k_10x_if_comb);
10293
break;
10294
case ATH10K_FW_WMI_OP_VERSION_10_4:
10295
ar->hw->wiphy->iface_combinations = ath10k_10_4_if_comb;
10296
ar->hw->wiphy->n_iface_combinations =
10297
ARRAY_SIZE(ath10k_10_4_if_comb);
10298
if (test_bit(WMI_SERVICE_VDEV_DIFFERENT_BEACON_INTERVAL_SUPPORT,
10299
ar->wmi.svc_map)) {
10300
ar->hw->wiphy->iface_combinations =
10301
ath10k_10_4_bcn_int_if_comb;
10302
ar->hw->wiphy->n_iface_combinations =
10303
ARRAY_SIZE(ath10k_10_4_bcn_int_if_comb);
10304
}
10305
break;
10306
case ATH10K_FW_WMI_OP_VERSION_UNSET:
10307
case ATH10K_FW_WMI_OP_VERSION_MAX:
10308
WARN_ON(1);
10309
ret = -EINVAL;
10310
goto err_free;
10311
}
10312
10313
if (ar->hw_params.dynamic_sar_support)
10314
ar->hw->wiphy->sar_capa = &ath10k_sar_capa;
10315
10316
if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags))
10317
ar->hw->netdev_features = NETIF_F_HW_CSUM;
10318
10319
if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED)) {
10320
/* Init ath dfs pattern detector */
10321
ar->ath_common.debug_mask = ATH_DBG_DFS;
10322
ar->dfs_detector = dfs_pattern_detector_init(&ar->ath_common,
10323
NL80211_DFS_UNSET);
10324
10325
if (!ar->dfs_detector)
10326
ath10k_warn(ar, "failed to initialise DFS pattern detector\n");
10327
}
10328
10329
ret = ath10k_mac_init_rd(ar);
10330
if (ret) {
10331
ath10k_err(ar, "failed to derive regdom: %d\n", ret);
10332
goto err_dfs_detector_exit;
10333
}
10334
10335
/* Disable set_coverage_class for chipsets that do not support it. */
10336
if (!ar->hw_params.hw_ops->set_coverage_class)
10337
ar->ops->set_coverage_class = NULL;
10338
10339
ret = ath_regd_init(&ar->ath_common.regulatory, ar->hw->wiphy,
10340
ath10k_reg_notifier);
10341
if (ret) {
10342
ath10k_err(ar, "failed to initialise regulatory: %i\n", ret);
10343
goto err_dfs_detector_exit;
10344
}
10345
10346
if (test_bit(WMI_SERVICE_SPOOF_MAC_SUPPORT, ar->wmi.svc_map)) {
10347
ar->hw->wiphy->features |=
10348
NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR;
10349
}
10350
10351
ar->hw->wiphy->cipher_suites = cipher_suites;
10352
10353
/* QCA988x and QCA6174 family chips do not support CCMP-256, GCMP-128
10354
* and GCMP-256 ciphers in hardware. Fetch number of ciphers supported
10355
* from chip specific hw_param table.
10356
*/
10357
if (!ar->hw_params.n_cipher_suites ||
10358
ar->hw_params.n_cipher_suites > ARRAY_SIZE(cipher_suites)) {
10359
ath10k_err(ar, "invalid hw_params.n_cipher_suites %d\n",
10360
ar->hw_params.n_cipher_suites);
10361
ar->hw_params.n_cipher_suites = 8;
10362
}
10363
ar->hw->wiphy->n_cipher_suites = ar->hw_params.n_cipher_suites;
10364
10365
wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
10366
10367
ar->hw->weight_multiplier = ATH10K_AIRTIME_WEIGHT_MULTIPLIER;
10368
10369
ret = ieee80211_register_hw(ar->hw);
10370
if (ret) {
10371
ath10k_err(ar, "failed to register ieee80211: %d\n", ret);
10372
goto err_dfs_detector_exit;
10373
}
10374
10375
if (test_bit(WMI_SERVICE_PER_PACKET_SW_ENCRYPT, ar->wmi.svc_map)) {
10376
ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_AP_VLAN);
10377
ar->hw->wiphy->software_iftypes |= BIT(NL80211_IFTYPE_AP_VLAN);
10378
}
10379
10380
if (!ath_is_world_regd(&ar->ath_common.reg_world_copy) &&
10381
!ath_is_world_regd(&ar->ath_common.regulatory)) {
10382
ret = regulatory_hint(ar->hw->wiphy,
10383
ar->ath_common.regulatory.alpha2);
10384
if (ret)
10385
goto err_unregister;
10386
}
10387
10388
return 0;
10389
10390
err_unregister:
10391
ieee80211_unregister_hw(ar->hw);
10392
10393
err_dfs_detector_exit:
10394
if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector)
10395
ar->dfs_detector->exit(ar->dfs_detector);
10396
10397
err_free:
10398
kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
10399
kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels);
10400
10401
SET_IEEE80211_DEV(ar->hw, NULL);
10402
return ret;
10403
}
10404
10405
void ath10k_mac_unregister(struct ath10k *ar)
10406
{
10407
ieee80211_unregister_hw(ar->hw);
10408
10409
if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector)
10410
ar->dfs_detector->exit(ar->dfs_detector);
10411
10412
kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
10413
kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels);
10414
10415
SET_IEEE80211_DEV(ar->hw, NULL);
10416
}
10417
10418