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