ath10k: improve channel switching
[linux-2.6-block.git] / drivers / net / wireless / ath / ath10k / mac.c
1 /*
2  * Copyright (c) 2005-2011 Atheros Communications Inc.
3  * Copyright (c) 2011-2013 Qualcomm Atheros, Inc.
4  *
5  * Permission to use, copy, modify, and/or distribute this software for any
6  * purpose with or without fee is hereby granted, provided that the above
7  * copyright notice and this permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16  */
17
18 #include "mac.h"
19
20 #include <net/mac80211.h>
21 #include <linux/etherdevice.h>
22
23 #include "hif.h"
24 #include "core.h"
25 #include "debug.h"
26 #include "wmi.h"
27 #include "htt.h"
28 #include "txrx.h"
29
30 /**********/
31 /* Crypto */
32 /**********/
33
34 static int ath10k_send_key(struct ath10k_vif *arvif,
35                            struct ieee80211_key_conf *key,
36                            enum set_key_cmd cmd,
37                            const u8 *macaddr)
38 {
39         struct wmi_vdev_install_key_arg arg = {
40                 .vdev_id = arvif->vdev_id,
41                 .key_idx = key->keyidx,
42                 .key_len = key->keylen,
43                 .key_data = key->key,
44                 .macaddr = macaddr,
45         };
46
47         lockdep_assert_held(&arvif->ar->conf_mutex);
48
49         if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
50                 arg.key_flags = WMI_KEY_PAIRWISE;
51         else
52                 arg.key_flags = WMI_KEY_GROUP;
53
54         switch (key->cipher) {
55         case WLAN_CIPHER_SUITE_CCMP:
56                 arg.key_cipher = WMI_CIPHER_AES_CCM;
57                 if (arvif->vdev_type == WMI_VDEV_TYPE_AP)
58                         key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT;
59                 else
60                         key->flags |= IEEE80211_KEY_FLAG_SW_MGMT_TX;
61                 break;
62         case WLAN_CIPHER_SUITE_TKIP:
63                 arg.key_cipher = WMI_CIPHER_TKIP;
64                 arg.key_txmic_len = 8;
65                 arg.key_rxmic_len = 8;
66                 break;
67         case WLAN_CIPHER_SUITE_WEP40:
68         case WLAN_CIPHER_SUITE_WEP104:
69                 arg.key_cipher = WMI_CIPHER_WEP;
70                 /* AP/IBSS mode requires self-key to be groupwise
71                  * Otherwise pairwise key must be set */
72                 if (memcmp(macaddr, arvif->vif->addr, ETH_ALEN))
73                         arg.key_flags = WMI_KEY_PAIRWISE;
74                 break;
75         default:
76                 ath10k_warn("cipher %d is not supported\n", key->cipher);
77                 return -EOPNOTSUPP;
78         }
79
80         if (cmd == DISABLE_KEY) {
81                 arg.key_cipher = WMI_CIPHER_NONE;
82                 arg.key_data = NULL;
83         }
84
85         return ath10k_wmi_vdev_install_key(arvif->ar, &arg);
86 }
87
88 static int ath10k_install_key(struct ath10k_vif *arvif,
89                               struct ieee80211_key_conf *key,
90                               enum set_key_cmd cmd,
91                               const u8 *macaddr)
92 {
93         struct ath10k *ar = arvif->ar;
94         int ret;
95
96         lockdep_assert_held(&ar->conf_mutex);
97
98         reinit_completion(&ar->install_key_done);
99
100         ret = ath10k_send_key(arvif, key, cmd, macaddr);
101         if (ret)
102                 return ret;
103
104         ret = wait_for_completion_timeout(&ar->install_key_done, 3*HZ);
105         if (ret == 0)
106                 return -ETIMEDOUT;
107
108         return 0;
109 }
110
111 static int ath10k_install_peer_wep_keys(struct ath10k_vif *arvif,
112                                         const u8 *addr)
113 {
114         struct ath10k *ar = arvif->ar;
115         struct ath10k_peer *peer;
116         int ret;
117         int i;
118
119         lockdep_assert_held(&ar->conf_mutex);
120
121         spin_lock_bh(&ar->data_lock);
122         peer = ath10k_peer_find(ar, arvif->vdev_id, addr);
123         spin_unlock_bh(&ar->data_lock);
124
125         if (!peer)
126                 return -ENOENT;
127
128         for (i = 0; i < ARRAY_SIZE(arvif->wep_keys); i++) {
129                 if (arvif->wep_keys[i] == NULL)
130                         continue;
131
132                 ret = ath10k_install_key(arvif, arvif->wep_keys[i], SET_KEY,
133                                          addr);
134                 if (ret)
135                         return ret;
136
137                 peer->keys[i] = arvif->wep_keys[i];
138         }
139
140         return 0;
141 }
142
143 static int ath10k_clear_peer_keys(struct ath10k_vif *arvif,
144                                   const u8 *addr)
145 {
146         struct ath10k *ar = arvif->ar;
147         struct ath10k_peer *peer;
148         int first_errno = 0;
149         int ret;
150         int i;
151
152         lockdep_assert_held(&ar->conf_mutex);
153
154         spin_lock_bh(&ar->data_lock);
155         peer = ath10k_peer_find(ar, arvif->vdev_id, addr);
156         spin_unlock_bh(&ar->data_lock);
157
158         if (!peer)
159                 return -ENOENT;
160
161         for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
162                 if (peer->keys[i] == NULL)
163                         continue;
164
165                 ret = ath10k_install_key(arvif, peer->keys[i],
166                                          DISABLE_KEY, addr);
167                 if (ret && first_errno == 0)
168                         first_errno = ret;
169
170                 if (ret)
171                         ath10k_warn("failed to remove peer wep key %d: %d\n",
172                                     i, ret);
173
174                 peer->keys[i] = NULL;
175         }
176
177         return first_errno;
178 }
179
180 static int ath10k_clear_vdev_key(struct ath10k_vif *arvif,
181                                  struct ieee80211_key_conf *key)
182 {
183         struct ath10k *ar = arvif->ar;
184         struct ath10k_peer *peer;
185         u8 addr[ETH_ALEN];
186         int first_errno = 0;
187         int ret;
188         int i;
189
190         lockdep_assert_held(&ar->conf_mutex);
191
192         for (;;) {
193                 /* since ath10k_install_key we can't hold data_lock all the
194                  * time, so we try to remove the keys incrementally */
195                 spin_lock_bh(&ar->data_lock);
196                 i = 0;
197                 list_for_each_entry(peer, &ar->peers, list) {
198                         for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
199                                 if (peer->keys[i] == key) {
200                                         memcpy(addr, peer->addr, ETH_ALEN);
201                                         peer->keys[i] = NULL;
202                                         break;
203                                 }
204                         }
205
206                         if (i < ARRAY_SIZE(peer->keys))
207                                 break;
208                 }
209                 spin_unlock_bh(&ar->data_lock);
210
211                 if (i == ARRAY_SIZE(peer->keys))
212                         break;
213
214                 ret = ath10k_install_key(arvif, key, DISABLE_KEY, addr);
215                 if (ret && first_errno == 0)
216                         first_errno = ret;
217
218                 if (ret)
219                         ath10k_warn("failed to remove key for %pM: %d\n",
220                                     addr, ret);
221         }
222
223         return first_errno;
224 }
225
226
227 /*********************/
228 /* General utilities */
229 /*********************/
230
231 static inline enum wmi_phy_mode
232 chan_to_phymode(const struct cfg80211_chan_def *chandef)
233 {
234         enum wmi_phy_mode phymode = MODE_UNKNOWN;
235
236         switch (chandef->chan->band) {
237         case IEEE80211_BAND_2GHZ:
238                 switch (chandef->width) {
239                 case NL80211_CHAN_WIDTH_20_NOHT:
240                         phymode = MODE_11G;
241                         break;
242                 case NL80211_CHAN_WIDTH_20:
243                         phymode = MODE_11NG_HT20;
244                         break;
245                 case NL80211_CHAN_WIDTH_40:
246                         phymode = MODE_11NG_HT40;
247                         break;
248                 case NL80211_CHAN_WIDTH_5:
249                 case NL80211_CHAN_WIDTH_10:
250                 case NL80211_CHAN_WIDTH_80:
251                 case NL80211_CHAN_WIDTH_80P80:
252                 case NL80211_CHAN_WIDTH_160:
253                         phymode = MODE_UNKNOWN;
254                         break;
255                 }
256                 break;
257         case IEEE80211_BAND_5GHZ:
258                 switch (chandef->width) {
259                 case NL80211_CHAN_WIDTH_20_NOHT:
260                         phymode = MODE_11A;
261                         break;
262                 case NL80211_CHAN_WIDTH_20:
263                         phymode = MODE_11NA_HT20;
264                         break;
265                 case NL80211_CHAN_WIDTH_40:
266                         phymode = MODE_11NA_HT40;
267                         break;
268                 case NL80211_CHAN_WIDTH_80:
269                         phymode = MODE_11AC_VHT80;
270                         break;
271                 case NL80211_CHAN_WIDTH_5:
272                 case NL80211_CHAN_WIDTH_10:
273                 case NL80211_CHAN_WIDTH_80P80:
274                 case NL80211_CHAN_WIDTH_160:
275                         phymode = MODE_UNKNOWN;
276                         break;
277                 }
278                 break;
279         default:
280                 break;
281         }
282
283         WARN_ON(phymode == MODE_UNKNOWN);
284         return phymode;
285 }
286
287 static u8 ath10k_parse_mpdudensity(u8 mpdudensity)
288 {
289 /*
290  * 802.11n D2.0 defined values for "Minimum MPDU Start Spacing":
291  *   0 for no restriction
292  *   1 for 1/4 us
293  *   2 for 1/2 us
294  *   3 for 1 us
295  *   4 for 2 us
296  *   5 for 4 us
297  *   6 for 8 us
298  *   7 for 16 us
299  */
300         switch (mpdudensity) {
301         case 0:
302                 return 0;
303         case 1:
304         case 2:
305         case 3:
306         /* Our lower layer calculations limit our precision to
307            1 microsecond */
308                 return 1;
309         case 4:
310                 return 2;
311         case 5:
312                 return 4;
313         case 6:
314                 return 8;
315         case 7:
316                 return 16;
317         default:
318                 return 0;
319         }
320 }
321
322 static int ath10k_peer_create(struct ath10k *ar, u32 vdev_id, const u8 *addr)
323 {
324         int ret;
325
326         lockdep_assert_held(&ar->conf_mutex);
327
328         ret = ath10k_wmi_peer_create(ar, vdev_id, addr);
329         if (ret) {
330                 ath10k_warn("failed to create wmi peer %pM on vdev %i: %i\n",
331                             addr, vdev_id, ret);
332                 return ret;
333         }
334
335         ret = ath10k_wait_for_peer_created(ar, vdev_id, addr);
336         if (ret) {
337                 ath10k_warn("failed to wait for created wmi peer %pM on vdev %i: %i\n",
338                             addr, vdev_id, ret);
339                 return ret;
340         }
341         spin_lock_bh(&ar->data_lock);
342         ar->num_peers++;
343         spin_unlock_bh(&ar->data_lock);
344
345         return 0;
346 }
347
348 static int ath10k_mac_set_kickout(struct ath10k_vif *arvif)
349 {
350         struct ath10k *ar = arvif->ar;
351         u32 param;
352         int ret;
353
354         param = ar->wmi.pdev_param->sta_kickout_th;
355         ret = ath10k_wmi_pdev_set_param(ar, param,
356                                         ATH10K_KICKOUT_THRESHOLD);
357         if (ret) {
358                 ath10k_warn("failed to set kickout threshold on vdev %i: %d\n",
359                             arvif->vdev_id, ret);
360                 return ret;
361         }
362
363         param = ar->wmi.vdev_param->ap_keepalive_min_idle_inactive_time_secs;
364         ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
365                                         ATH10K_KEEPALIVE_MIN_IDLE);
366         if (ret) {
367                 ath10k_warn("failed to set keepalive minimum idle time on vdev %i: %d\n",
368                             arvif->vdev_id, ret);
369                 return ret;
370         }
371
372         param = ar->wmi.vdev_param->ap_keepalive_max_idle_inactive_time_secs;
373         ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
374                                         ATH10K_KEEPALIVE_MAX_IDLE);
375         if (ret) {
376                 ath10k_warn("failed to set keepalive maximum idle time on vdev %i: %d\n",
377                             arvif->vdev_id, ret);
378                 return ret;
379         }
380
381         param = ar->wmi.vdev_param->ap_keepalive_max_unresponsive_time_secs;
382         ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
383                                         ATH10K_KEEPALIVE_MAX_UNRESPONSIVE);
384         if (ret) {
385                 ath10k_warn("failed to set keepalive maximum unresponsive time on vdev %i: %d\n",
386                             arvif->vdev_id, ret);
387                 return ret;
388         }
389
390         return 0;
391 }
392
393 static int  ath10k_mac_set_rts(struct ath10k_vif *arvif, u32 value)
394 {
395         struct ath10k *ar = arvif->ar;
396         u32 vdev_param;
397
398         if (value != 0xFFFFFFFF)
399                 value = min_t(u32, arvif->ar->hw->wiphy->rts_threshold,
400                               ATH10K_RTS_MAX);
401
402         vdev_param = ar->wmi.vdev_param->rts_threshold;
403         return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, value);
404 }
405
406 static int ath10k_mac_set_frag(struct ath10k_vif *arvif, u32 value)
407 {
408         struct ath10k *ar = arvif->ar;
409         u32 vdev_param;
410
411         if (value != 0xFFFFFFFF)
412                 value = clamp_t(u32, arvif->ar->hw->wiphy->frag_threshold,
413                                 ATH10K_FRAGMT_THRESHOLD_MIN,
414                                 ATH10K_FRAGMT_THRESHOLD_MAX);
415
416         vdev_param = ar->wmi.vdev_param->fragmentation_threshold;
417         return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, value);
418 }
419
420 static int ath10k_peer_delete(struct ath10k *ar, u32 vdev_id, const u8 *addr)
421 {
422         int ret;
423
424         lockdep_assert_held(&ar->conf_mutex);
425
426         ret = ath10k_wmi_peer_delete(ar, vdev_id, addr);
427         if (ret)
428                 return ret;
429
430         ret = ath10k_wait_for_peer_deleted(ar, vdev_id, addr);
431         if (ret)
432                 return ret;
433
434         spin_lock_bh(&ar->data_lock);
435         ar->num_peers--;
436         spin_unlock_bh(&ar->data_lock);
437
438         return 0;
439 }
440
441 static void ath10k_peer_cleanup(struct ath10k *ar, u32 vdev_id)
442 {
443         struct ath10k_peer *peer, *tmp;
444
445         lockdep_assert_held(&ar->conf_mutex);
446
447         spin_lock_bh(&ar->data_lock);
448         list_for_each_entry_safe(peer, tmp, &ar->peers, list) {
449                 if (peer->vdev_id != vdev_id)
450                         continue;
451
452                 ath10k_warn("removing stale peer %pM from vdev_id %d\n",
453                             peer->addr, vdev_id);
454
455                 list_del(&peer->list);
456                 kfree(peer);
457                 ar->num_peers--;
458         }
459         spin_unlock_bh(&ar->data_lock);
460 }
461
462 static void ath10k_peer_cleanup_all(struct ath10k *ar)
463 {
464         struct ath10k_peer *peer, *tmp;
465
466         lockdep_assert_held(&ar->conf_mutex);
467
468         spin_lock_bh(&ar->data_lock);
469         list_for_each_entry_safe(peer, tmp, &ar->peers, list) {
470                 list_del(&peer->list);
471                 kfree(peer);
472         }
473         ar->num_peers = 0;
474         spin_unlock_bh(&ar->data_lock);
475 }
476
477 /************************/
478 /* Interface management */
479 /************************/
480
481 static inline int ath10k_vdev_setup_sync(struct ath10k *ar)
482 {
483         int ret;
484
485         lockdep_assert_held(&ar->conf_mutex);
486
487         ret = wait_for_completion_timeout(&ar->vdev_setup_done,
488                                           ATH10K_VDEV_SETUP_TIMEOUT_HZ);
489         if (ret == 0)
490                 return -ETIMEDOUT;
491
492         return 0;
493 }
494
495 static bool ath10k_monitor_is_enabled(struct ath10k *ar)
496 {
497         lockdep_assert_held(&ar->conf_mutex);
498
499         ath10k_dbg(ATH10K_DBG_MAC,
500                    "mac monitor refs: promisc %d monitor %d cac %d\n",
501                    ar->promisc, ar->monitor,
502                    test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags));
503
504         return ar->promisc || ar->monitor ||
505                test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
506 }
507
508 static int ath10k_monitor_vdev_start(struct ath10k *ar, int vdev_id)
509 {
510         struct cfg80211_chan_def *chandef = &ar->chandef;
511         struct ieee80211_channel *channel = chandef->chan;
512         struct wmi_vdev_start_request_arg arg = {};
513         int ret = 0;
514
515         lockdep_assert_held(&ar->conf_mutex);
516
517         arg.vdev_id = vdev_id;
518         arg.channel.freq = channel->center_freq;
519         arg.channel.band_center_freq1 = chandef->center_freq1;
520
521         /* TODO setup this dynamically, what in case we
522            don't have any vifs? */
523         arg.channel.mode = chan_to_phymode(chandef);
524         arg.channel.chan_radar =
525                         !!(channel->flags & IEEE80211_CHAN_RADAR);
526
527         arg.channel.min_power = 0;
528         arg.channel.max_power = channel->max_power * 2;
529         arg.channel.max_reg_power = channel->max_reg_power * 2;
530         arg.channel.max_antenna_gain = channel->max_antenna_gain * 2;
531
532         ret = ath10k_wmi_vdev_start(ar, &arg);
533         if (ret) {
534                 ath10k_warn("failed to request monitor vdev %i start: %d\n",
535                             vdev_id, ret);
536                 return ret;
537         }
538
539         ret = ath10k_vdev_setup_sync(ar);
540         if (ret) {
541                 ath10k_warn("failed to synchronize setup for monitor vdev %i: %d\n",
542                             vdev_id, ret);
543                 return ret;
544         }
545
546         ret = ath10k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr);
547         if (ret) {
548                 ath10k_warn("failed to put up monitor vdev %i: %d\n",
549                             vdev_id, ret);
550                 goto vdev_stop;
551         }
552
553         ar->monitor_vdev_id = vdev_id;
554
555         ath10k_dbg(ATH10K_DBG_MAC, "mac monitor vdev %i started\n",
556                    ar->monitor_vdev_id);
557         return 0;
558
559 vdev_stop:
560         ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
561         if (ret)
562                 ath10k_warn("failed to stop monitor vdev %i after start failure: %d\n",
563                             ar->monitor_vdev_id, ret);
564
565         return ret;
566 }
567
568 static int ath10k_monitor_vdev_stop(struct ath10k *ar)
569 {
570         int ret = 0;
571
572         lockdep_assert_held(&ar->conf_mutex);
573
574         ret = ath10k_wmi_vdev_down(ar, ar->monitor_vdev_id);
575         if (ret)
576                 ath10k_warn("failed to put down monitor vdev %i: %d\n",
577                             ar->monitor_vdev_id, ret);
578
579         ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
580         if (ret)
581                 ath10k_warn("failed to to request monitor vdev %i stop: %d\n",
582                             ar->monitor_vdev_id, ret);
583
584         ret = ath10k_vdev_setup_sync(ar);
585         if (ret)
586                 ath10k_warn("failed to synchronise monitor vdev %i: %d\n",
587                             ar->monitor_vdev_id, ret);
588
589         ath10k_dbg(ATH10K_DBG_MAC, "mac monitor vdev %i stopped\n",
590                    ar->monitor_vdev_id);
591         return ret;
592 }
593
594 static int ath10k_monitor_vdev_create(struct ath10k *ar)
595 {
596         int bit, ret = 0;
597
598         lockdep_assert_held(&ar->conf_mutex);
599
600         bit = ffs(ar->free_vdev_map);
601         if (bit == 0) {
602                 ath10k_warn("failed to find free vdev id for monitor vdev\n");
603                 return -ENOMEM;
604         }
605
606         ar->monitor_vdev_id = bit - 1;
607         ar->free_vdev_map &= ~(1 << ar->monitor_vdev_id);
608
609         ret = ath10k_wmi_vdev_create(ar, ar->monitor_vdev_id,
610                                      WMI_VDEV_TYPE_MONITOR,
611                                      0, ar->mac_addr);
612         if (ret) {
613                 ath10k_warn("failed to request monitor vdev %i creation: %d\n",
614                             ar->monitor_vdev_id, ret);
615                 goto vdev_fail;
616         }
617
618         ath10k_dbg(ATH10K_DBG_MAC, "mac monitor vdev %d created\n",
619                    ar->monitor_vdev_id);
620
621         return 0;
622
623 vdev_fail:
624         /*
625          * Restore the ID to the global map.
626          */
627         ar->free_vdev_map |= 1 << (ar->monitor_vdev_id);
628         return ret;
629 }
630
631 static int ath10k_monitor_vdev_delete(struct ath10k *ar)
632 {
633         int ret = 0;
634
635         lockdep_assert_held(&ar->conf_mutex);
636
637         ret = ath10k_wmi_vdev_delete(ar, ar->monitor_vdev_id);
638         if (ret) {
639                 ath10k_warn("failed to request wmi monitor vdev %i removal: %d\n",
640                             ar->monitor_vdev_id, ret);
641                 return ret;
642         }
643
644         ar->free_vdev_map |= 1 << (ar->monitor_vdev_id);
645
646         ath10k_dbg(ATH10K_DBG_MAC, "mac monitor vdev %d deleted\n",
647                    ar->monitor_vdev_id);
648         return ret;
649 }
650
651 static int ath10k_monitor_start(struct ath10k *ar)
652 {
653         int ret;
654
655         lockdep_assert_held(&ar->conf_mutex);
656
657         if (!ath10k_monitor_is_enabled(ar)) {
658                 ath10k_warn("trying to start monitor with no references\n");
659                 return 0;
660         }
661
662         if (ar->monitor_started) {
663                 ath10k_dbg(ATH10K_DBG_MAC, "mac monitor already started\n");
664                 return 0;
665         }
666
667         ret = ath10k_monitor_vdev_create(ar);
668         if (ret) {
669                 ath10k_warn("failed to create monitor vdev: %d\n", ret);
670                 return ret;
671         }
672
673         ret = ath10k_monitor_vdev_start(ar, ar->monitor_vdev_id);
674         if (ret) {
675                 ath10k_warn("failed to start monitor vdev: %d\n", ret);
676                 ath10k_monitor_vdev_delete(ar);
677                 return ret;
678         }
679
680         ar->monitor_started = true;
681         ath10k_dbg(ATH10K_DBG_MAC, "mac monitor started\n");
682
683         return 0;
684 }
685
686 static void ath10k_monitor_stop(struct ath10k *ar)
687 {
688         int ret;
689
690         lockdep_assert_held(&ar->conf_mutex);
691
692         if (ath10k_monitor_is_enabled(ar)) {
693                 ath10k_dbg(ATH10K_DBG_MAC,
694                            "mac monitor will be stopped later\n");
695                 return;
696         }
697
698         if (!ar->monitor_started) {
699                 ath10k_dbg(ATH10K_DBG_MAC,
700                            "mac monitor probably failed to start earlier\n");
701                 return;
702         }
703
704         ret = ath10k_monitor_vdev_stop(ar);
705         if (ret)
706                 ath10k_warn("failed to stop monitor vdev: %d\n", ret);
707
708         ret = ath10k_monitor_vdev_delete(ar);
709         if (ret)
710                 ath10k_warn("failed to delete monitor vdev: %d\n", ret);
711
712         ar->monitor_started = false;
713         ath10k_dbg(ATH10K_DBG_MAC, "mac monitor stopped\n");
714 }
715
716 static int ath10k_recalc_rtscts_prot(struct ath10k_vif *arvif)
717 {
718         struct ath10k *ar = arvif->ar;
719         u32 vdev_param, rts_cts = 0;
720
721         lockdep_assert_held(&ar->conf_mutex);
722
723         vdev_param = ar->wmi.vdev_param->enable_rtscts;
724
725         if (arvif->use_cts_prot || arvif->num_legacy_stations > 0)
726                 rts_cts |= SM(WMI_RTSCTS_ENABLED, WMI_RTSCTS_SET);
727
728         if (arvif->num_legacy_stations > 0)
729                 rts_cts |= SM(WMI_RTSCTS_ACROSS_SW_RETRIES,
730                               WMI_RTSCTS_PROFILE);
731
732         return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
733                                          rts_cts);
734 }
735
736 static int ath10k_start_cac(struct ath10k *ar)
737 {
738         int ret;
739
740         lockdep_assert_held(&ar->conf_mutex);
741
742         set_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
743
744         ret = ath10k_monitor_start(ar);
745         if (ret) {
746                 ath10k_warn("failed to start monitor (cac): %d\n", ret);
747                 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
748                 return ret;
749         }
750
751         ath10k_dbg(ATH10K_DBG_MAC, "mac cac start monitor vdev %d\n",
752                    ar->monitor_vdev_id);
753
754         return 0;
755 }
756
757 static int ath10k_stop_cac(struct ath10k *ar)
758 {
759         lockdep_assert_held(&ar->conf_mutex);
760
761         /* CAC is not running - do nothing */
762         if (!test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags))
763                 return 0;
764
765         clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
766         ath10k_monitor_stop(ar);
767
768         ath10k_dbg(ATH10K_DBG_MAC, "mac cac finished\n");
769
770         return 0;
771 }
772
773 static void ath10k_recalc_radar_detection(struct ath10k *ar)
774 {
775         int ret;
776
777         lockdep_assert_held(&ar->conf_mutex);
778
779         ath10k_stop_cac(ar);
780
781         if (!ar->radar_enabled)
782                 return;
783
784         if (ar->num_started_vdevs > 0)
785                 return;
786
787         ret = ath10k_start_cac(ar);
788         if (ret) {
789                 /*
790                  * Not possible to start CAC on current channel so starting
791                  * radiation is not allowed, make this channel DFS_UNAVAILABLE
792                  * by indicating that radar was detected.
793                  */
794                 ath10k_warn("failed to start CAC: %d\n", ret);
795                 ieee80211_radar_detected(ar->hw);
796         }
797 }
798
799 static int ath10k_vdev_start_restart(struct ath10k_vif *arvif, bool restart)
800 {
801         struct ath10k *ar = arvif->ar;
802         struct cfg80211_chan_def *chandef = &ar->chandef;
803         struct wmi_vdev_start_request_arg arg = {};
804         int ret = 0;
805
806         lockdep_assert_held(&ar->conf_mutex);
807
808         reinit_completion(&ar->vdev_setup_done);
809
810         arg.vdev_id = arvif->vdev_id;
811         arg.dtim_period = arvif->dtim_period;
812         arg.bcn_intval = arvif->beacon_interval;
813
814         arg.channel.freq = chandef->chan->center_freq;
815         arg.channel.band_center_freq1 = chandef->center_freq1;
816         arg.channel.mode = chan_to_phymode(chandef);
817
818         arg.channel.min_power = 0;
819         arg.channel.max_power = chandef->chan->max_power * 2;
820         arg.channel.max_reg_power = chandef->chan->max_reg_power * 2;
821         arg.channel.max_antenna_gain = chandef->chan->max_antenna_gain * 2;
822
823         if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
824                 arg.ssid = arvif->u.ap.ssid;
825                 arg.ssid_len = arvif->u.ap.ssid_len;
826                 arg.hidden_ssid = arvif->u.ap.hidden_ssid;
827
828                 /* For now allow DFS for AP mode */
829                 arg.channel.chan_radar =
830                         !!(chandef->chan->flags & IEEE80211_CHAN_RADAR);
831         } else if (arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
832                 arg.ssid = arvif->vif->bss_conf.ssid;
833                 arg.ssid_len = arvif->vif->bss_conf.ssid_len;
834         }
835
836         ath10k_dbg(ATH10K_DBG_MAC,
837                    "mac vdev %d start center_freq %d phymode %s\n",
838                    arg.vdev_id, arg.channel.freq,
839                    ath10k_wmi_phymode_str(arg.channel.mode));
840
841         if (restart)
842                 ret = ath10k_wmi_vdev_restart(ar, &arg);
843         else
844                 ret = ath10k_wmi_vdev_start(ar, &arg);
845
846         if (ret) {
847                 ath10k_warn("failed to start WMI vdev %i: %d\n",
848                             arg.vdev_id, ret);
849                 return ret;
850         }
851
852         ret = ath10k_vdev_setup_sync(ar);
853         if (ret) {
854                 ath10k_warn("failed to synchronise setup for vdev %i: %d\n",
855                             arg.vdev_id, ret);
856                 return ret;
857         }
858
859         ar->num_started_vdevs++;
860         ath10k_recalc_radar_detection(ar);
861
862         return ret;
863 }
864
865 static int ath10k_vdev_start(struct ath10k_vif *arvif)
866 {
867         return ath10k_vdev_start_restart(arvif, false);
868 }
869
870 static int ath10k_vdev_restart(struct ath10k_vif *arvif)
871 {
872         return ath10k_vdev_start_restart(arvif, true);
873 }
874
875 static int ath10k_vdev_stop(struct ath10k_vif *arvif)
876 {
877         struct ath10k *ar = arvif->ar;
878         int ret;
879
880         lockdep_assert_held(&ar->conf_mutex);
881
882         reinit_completion(&ar->vdev_setup_done);
883
884         ret = ath10k_wmi_vdev_stop(ar, arvif->vdev_id);
885         if (ret) {
886                 ath10k_warn("failed to stop WMI vdev %i: %d\n",
887                             arvif->vdev_id, ret);
888                 return ret;
889         }
890
891         ret = ath10k_vdev_setup_sync(ar);
892         if (ret) {
893                 ath10k_warn("failed to syncronise setup for vdev %i: %d\n",
894                             arvif->vdev_id, ret);
895                 return ret;
896         }
897
898         WARN_ON(ar->num_started_vdevs == 0);
899
900         if (ar->num_started_vdevs != 0) {
901                 ar->num_started_vdevs--;
902                 ath10k_recalc_radar_detection(ar);
903         }
904
905         return ret;
906 }
907
908 static void ath10k_control_beaconing(struct ath10k_vif *arvif,
909                                 struct ieee80211_bss_conf *info)
910 {
911         int ret = 0;
912
913         lockdep_assert_held(&arvif->ar->conf_mutex);
914
915         if (!info->enable_beacon) {
916                 ath10k_vdev_stop(arvif);
917
918                 arvif->is_started = false;
919                 arvif->is_up = false;
920
921                 spin_lock_bh(&arvif->ar->data_lock);
922                 if (arvif->beacon) {
923                         dma_unmap_single(arvif->ar->dev,
924                                          ATH10K_SKB_CB(arvif->beacon)->paddr,
925                                          arvif->beacon->len, DMA_TO_DEVICE);
926                         dev_kfree_skb_any(arvif->beacon);
927
928                         arvif->beacon = NULL;
929                         arvif->beacon_sent = false;
930                 }
931                 spin_unlock_bh(&arvif->ar->data_lock);
932
933                 return;
934         }
935
936         arvif->tx_seq_no = 0x1000;
937
938         ret = ath10k_vdev_start(arvif);
939         if (ret)
940                 return;
941
942         arvif->aid = 0;
943         memcpy(arvif->bssid, info->bssid, ETH_ALEN);
944
945         ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
946                                  arvif->bssid);
947         if (ret) {
948                 ath10k_warn("failed to bring up vdev %d: %i\n",
949                             arvif->vdev_id, ret);
950                 ath10k_vdev_stop(arvif);
951                 return;
952         }
953
954         arvif->is_started = true;
955         arvif->is_up = true;
956
957         ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d up\n", arvif->vdev_id);
958 }
959
960 static void ath10k_control_ibss(struct ath10k_vif *arvif,
961                                 struct ieee80211_bss_conf *info,
962                                 const u8 self_peer[ETH_ALEN])
963 {
964         u32 vdev_param;
965         int ret = 0;
966
967         lockdep_assert_held(&arvif->ar->conf_mutex);
968
969         if (!info->ibss_joined) {
970                 ret = ath10k_peer_delete(arvif->ar, arvif->vdev_id, self_peer);
971                 if (ret)
972                         ath10k_warn("failed to delete IBSS self peer %pM for vdev %d: %d\n",
973                                     self_peer, arvif->vdev_id, ret);
974
975                 if (is_zero_ether_addr(arvif->bssid))
976                         return;
977
978                 ret = ath10k_peer_delete(arvif->ar, arvif->vdev_id,
979                                          arvif->bssid);
980                 if (ret) {
981                         ath10k_warn("failed to delete IBSS BSSID peer %pM for vdev %d: %d\n",
982                                     arvif->bssid, arvif->vdev_id, ret);
983                         return;
984                 }
985
986                 memset(arvif->bssid, 0, ETH_ALEN);
987
988                 return;
989         }
990
991         ret = ath10k_peer_create(arvif->ar, arvif->vdev_id, self_peer);
992         if (ret) {
993                 ath10k_warn("failed to create IBSS self peer %pM for vdev %d: %d\n",
994                             self_peer, arvif->vdev_id, ret);
995                 return;
996         }
997
998         vdev_param = arvif->ar->wmi.vdev_param->atim_window;
999         ret = ath10k_wmi_vdev_set_param(arvif->ar, arvif->vdev_id, vdev_param,
1000                                         ATH10K_DEFAULT_ATIM);
1001         if (ret)
1002                 ath10k_warn("failed to set IBSS ATIM for vdev %d: %d\n",
1003                             arvif->vdev_id, ret);
1004 }
1005
1006 /*
1007  * Review this when mac80211 gains per-interface powersave support.
1008  */
1009 static int ath10k_mac_vif_setup_ps(struct ath10k_vif *arvif)
1010 {
1011         struct ath10k *ar = arvif->ar;
1012         struct ieee80211_conf *conf = &ar->hw->conf;
1013         enum wmi_sta_powersave_param param;
1014         enum wmi_sta_ps_mode psmode;
1015         int ret;
1016
1017         lockdep_assert_held(&arvif->ar->conf_mutex);
1018
1019         if (arvif->vif->type != NL80211_IFTYPE_STATION)
1020                 return 0;
1021
1022         if (conf->flags & IEEE80211_CONF_PS) {
1023                 psmode = WMI_STA_PS_MODE_ENABLED;
1024                 param = WMI_STA_PS_PARAM_INACTIVITY_TIME;
1025
1026                 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param,
1027                                                   conf->dynamic_ps_timeout);
1028                 if (ret) {
1029                         ath10k_warn("failed to set inactivity time for vdev %d: %i\n",
1030                                     arvif->vdev_id, ret);
1031                         return ret;
1032                 }
1033         } else {
1034                 psmode = WMI_STA_PS_MODE_DISABLED;
1035         }
1036
1037         ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d psmode %s\n",
1038                    arvif->vdev_id, psmode ? "enable" : "disable");
1039
1040         ret = ath10k_wmi_set_psmode(ar, arvif->vdev_id, psmode);
1041         if (ret) {
1042                 ath10k_warn("failed to set PS Mode %d for vdev %d: %d\n",
1043                             psmode, arvif->vdev_id, ret);
1044                 return ret;
1045         }
1046
1047         return 0;
1048 }
1049
1050 /**********************/
1051 /* Station management */
1052 /**********************/
1053
1054 static void ath10k_peer_assoc_h_basic(struct ath10k *ar,
1055                                       struct ath10k_vif *arvif,
1056                                       struct ieee80211_sta *sta,
1057                                       struct ieee80211_bss_conf *bss_conf,
1058                                       struct wmi_peer_assoc_complete_arg *arg)
1059 {
1060         lockdep_assert_held(&ar->conf_mutex);
1061
1062         memcpy(arg->addr, sta->addr, ETH_ALEN);
1063         arg->vdev_id = arvif->vdev_id;
1064         arg->peer_aid = sta->aid;
1065         arg->peer_flags |= WMI_PEER_AUTH;
1066
1067         if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
1068                 /*
1069                  * Seems FW have problems with Power Save in STA
1070                  * mode when we setup this parameter to high (eg. 5).
1071                  * Often we see that FW don't send NULL (with clean P flags)
1072                  * frame even there is info about buffered frames in beacons.
1073                  * Sometimes we have to wait more than 10 seconds before FW
1074                  * will wakeup. Often sending one ping from AP to our device
1075                  * just fail (more than 50%).
1076                  *
1077                  * Seems setting this FW parameter to 1 couse FW
1078                  * will check every beacon and will wakup immediately
1079                  * after detection buffered data.
1080                  */
1081                 arg->peer_listen_intval = 1;
1082         else
1083                 arg->peer_listen_intval = ar->hw->conf.listen_interval;
1084
1085         arg->peer_num_spatial_streams = 1;
1086
1087         /*
1088          * The assoc capabilities are available only in managed mode.
1089          */
1090         if (arvif->vdev_type == WMI_VDEV_TYPE_STA && bss_conf)
1091                 arg->peer_caps = bss_conf->assoc_capability;
1092 }
1093
1094 static void ath10k_peer_assoc_h_crypto(struct ath10k *ar,
1095                                        struct ath10k_vif *arvif,
1096                                        struct wmi_peer_assoc_complete_arg *arg)
1097 {
1098         struct ieee80211_vif *vif = arvif->vif;
1099         struct ieee80211_bss_conf *info = &vif->bss_conf;
1100         struct cfg80211_bss *bss;
1101         const u8 *rsnie = NULL;
1102         const u8 *wpaie = NULL;
1103
1104         lockdep_assert_held(&ar->conf_mutex);
1105
1106         bss = cfg80211_get_bss(ar->hw->wiphy, ar->hw->conf.chandef.chan,
1107                                info->bssid, NULL, 0, 0, 0);
1108         if (bss) {
1109                 const struct cfg80211_bss_ies *ies;
1110
1111                 rcu_read_lock();
1112                 rsnie = ieee80211_bss_get_ie(bss, WLAN_EID_RSN);
1113
1114                 ies = rcu_dereference(bss->ies);
1115
1116                 wpaie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
1117                                 WLAN_OUI_TYPE_MICROSOFT_WPA,
1118                                 ies->data,
1119                                 ies->len);
1120                 rcu_read_unlock();
1121                 cfg80211_put_bss(ar->hw->wiphy, bss);
1122         }
1123
1124         /* FIXME: base on RSN IE/WPA IE is a correct idea? */
1125         if (rsnie || wpaie) {
1126                 ath10k_dbg(ATH10K_DBG_WMI, "%s: rsn ie found\n", __func__);
1127                 arg->peer_flags |= WMI_PEER_NEED_PTK_4_WAY;
1128         }
1129
1130         if (wpaie) {
1131                 ath10k_dbg(ATH10K_DBG_WMI, "%s: wpa ie found\n", __func__);
1132                 arg->peer_flags |= WMI_PEER_NEED_GTK_2_WAY;
1133         }
1134 }
1135
1136 static void ath10k_peer_assoc_h_rates(struct ath10k *ar,
1137                                       struct ieee80211_sta *sta,
1138                                       struct wmi_peer_assoc_complete_arg *arg)
1139 {
1140         struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates;
1141         const struct ieee80211_supported_band *sband;
1142         const struct ieee80211_rate *rates;
1143         u32 ratemask;
1144         int i;
1145
1146         lockdep_assert_held(&ar->conf_mutex);
1147
1148         sband = ar->hw->wiphy->bands[ar->hw->conf.chandef.chan->band];
1149         ratemask = sta->supp_rates[ar->hw->conf.chandef.chan->band];
1150         rates = sband->bitrates;
1151
1152         rateset->num_rates = 0;
1153
1154         for (i = 0; i < 32; i++, ratemask >>= 1, rates++) {
1155                 if (!(ratemask & 1))
1156                         continue;
1157
1158                 rateset->rates[rateset->num_rates] = rates->hw_value;
1159                 rateset->num_rates++;
1160         }
1161 }
1162
1163 static void ath10k_peer_assoc_h_ht(struct ath10k *ar,
1164                                    struct ieee80211_sta *sta,
1165                                    struct wmi_peer_assoc_complete_arg *arg)
1166 {
1167         const struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
1168         int i, n;
1169
1170         lockdep_assert_held(&ar->conf_mutex);
1171
1172         if (!ht_cap->ht_supported)
1173                 return;
1174
1175         arg->peer_flags |= WMI_PEER_HT;
1176         arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
1177                                     ht_cap->ampdu_factor)) - 1;
1178
1179         arg->peer_mpdu_density =
1180                 ath10k_parse_mpdudensity(ht_cap->ampdu_density);
1181
1182         arg->peer_ht_caps = ht_cap->cap;
1183         arg->peer_rate_caps |= WMI_RC_HT_FLAG;
1184
1185         if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING)
1186                 arg->peer_flags |= WMI_PEER_LDPC;
1187
1188         if (sta->bandwidth >= IEEE80211_STA_RX_BW_40) {
1189                 arg->peer_flags |= WMI_PEER_40MHZ;
1190                 arg->peer_rate_caps |= WMI_RC_CW40_FLAG;
1191         }
1192
1193         if (ht_cap->cap & IEEE80211_HT_CAP_SGI_20)
1194                 arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
1195
1196         if (ht_cap->cap & IEEE80211_HT_CAP_SGI_40)
1197                 arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
1198
1199         if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) {
1200                 arg->peer_rate_caps |= WMI_RC_TX_STBC_FLAG;
1201                 arg->peer_flags |= WMI_PEER_STBC;
1202         }
1203
1204         if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) {
1205                 u32 stbc;
1206                 stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC;
1207                 stbc = stbc >> IEEE80211_HT_CAP_RX_STBC_SHIFT;
1208                 stbc = stbc << WMI_RC_RX_STBC_FLAG_S;
1209                 arg->peer_rate_caps |= stbc;
1210                 arg->peer_flags |= WMI_PEER_STBC;
1211         }
1212
1213         if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2])
1214                 arg->peer_rate_caps |= WMI_RC_TS_FLAG;
1215         else if (ht_cap->mcs.rx_mask[1])
1216                 arg->peer_rate_caps |= WMI_RC_DS_FLAG;
1217
1218         for (i = 0, n = 0; i < IEEE80211_HT_MCS_MASK_LEN*8; i++)
1219                 if (ht_cap->mcs.rx_mask[i/8] & (1 << i%8))
1220                         arg->peer_ht_rates.rates[n++] = i;
1221
1222         /*
1223          * This is a workaround for HT-enabled STAs which break the spec
1224          * and have no HT capabilities RX mask (no HT RX MCS map).
1225          *
1226          * As per spec, in section 20.3.5 Modulation and coding scheme (MCS),
1227          * MCS 0 through 7 are mandatory in 20MHz with 800 ns GI at all STAs.
1228          *
1229          * Firmware asserts if such situation occurs.
1230          */
1231         if (n == 0) {
1232                 arg->peer_ht_rates.num_rates = 8;
1233                 for (i = 0; i < arg->peer_ht_rates.num_rates; i++)
1234                         arg->peer_ht_rates.rates[i] = i;
1235         } else {
1236                 arg->peer_ht_rates.num_rates = n;
1237                 arg->peer_num_spatial_streams = sta->rx_nss;
1238         }
1239
1240         ath10k_dbg(ATH10K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n",
1241                    arg->addr,
1242                    arg->peer_ht_rates.num_rates,
1243                    arg->peer_num_spatial_streams);
1244 }
1245
1246 static int ath10k_peer_assoc_qos_ap(struct ath10k *ar,
1247                                     struct ath10k_vif *arvif,
1248                                     struct ieee80211_sta *sta)
1249 {
1250         u32 uapsd = 0;
1251         u32 max_sp = 0;
1252         int ret = 0;
1253
1254         lockdep_assert_held(&ar->conf_mutex);
1255
1256         if (sta->wme && sta->uapsd_queues) {
1257                 ath10k_dbg(ATH10K_DBG_MAC, "mac uapsd_queues 0x%x max_sp %d\n",
1258                            sta->uapsd_queues, sta->max_sp);
1259
1260                 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO)
1261                         uapsd |= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN |
1262                                  WMI_AP_PS_UAPSD_AC3_TRIGGER_EN;
1263                 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI)
1264                         uapsd |= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN |
1265                                  WMI_AP_PS_UAPSD_AC2_TRIGGER_EN;
1266                 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK)
1267                         uapsd |= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN |
1268                                  WMI_AP_PS_UAPSD_AC1_TRIGGER_EN;
1269                 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE)
1270                         uapsd |= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN |
1271                                  WMI_AP_PS_UAPSD_AC0_TRIGGER_EN;
1272
1273
1274                 if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP)
1275                         max_sp = sta->max_sp;
1276
1277                 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
1278                                                  sta->addr,
1279                                                  WMI_AP_PS_PEER_PARAM_UAPSD,
1280                                                  uapsd);
1281                 if (ret) {
1282                         ath10k_warn("failed to set ap ps peer param uapsd for vdev %i: %d\n",
1283                                     arvif->vdev_id, ret);
1284                         return ret;
1285                 }
1286
1287                 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
1288                                                  sta->addr,
1289                                                  WMI_AP_PS_PEER_PARAM_MAX_SP,
1290                                                  max_sp);
1291                 if (ret) {
1292                         ath10k_warn("failed to set ap ps peer param max sp for vdev %i: %d\n",
1293                                     arvif->vdev_id, ret);
1294                         return ret;
1295                 }
1296
1297                 /* TODO setup this based on STA listen interval and
1298                    beacon interval. Currently we don't know
1299                    sta->listen_interval - mac80211 patch required.
1300                    Currently use 10 seconds */
1301                 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id, sta->addr,
1302                                         WMI_AP_PS_PEER_PARAM_AGEOUT_TIME, 10);
1303                 if (ret) {
1304                         ath10k_warn("failed to set ap ps peer param ageout time for vdev %i: %d\n",
1305                                     arvif->vdev_id, ret);
1306                         return ret;
1307                 }
1308         }
1309
1310         return 0;
1311 }
1312
1313 static void ath10k_peer_assoc_h_vht(struct ath10k *ar,
1314                                     struct ieee80211_sta *sta,
1315                                     struct wmi_peer_assoc_complete_arg *arg)
1316 {
1317         const struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
1318         u8 ampdu_factor;
1319
1320         if (!vht_cap->vht_supported)
1321                 return;
1322
1323         arg->peer_flags |= WMI_PEER_VHT;
1324         arg->peer_vht_caps = vht_cap->cap;
1325
1326
1327         ampdu_factor = (vht_cap->cap &
1328                         IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >>
1329                        IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
1330
1331         /* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to
1332          * zero in VHT IE. Using it would result in degraded throughput.
1333          * arg->peer_max_mpdu at this point contains HT max_mpdu so keep
1334          * it if VHT max_mpdu is smaller. */
1335         arg->peer_max_mpdu = max(arg->peer_max_mpdu,
1336                                  (1U << (IEEE80211_HT_MAX_AMPDU_FACTOR +
1337                                         ampdu_factor)) - 1);
1338
1339         if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
1340                 arg->peer_flags |= WMI_PEER_80MHZ;
1341
1342         arg->peer_vht_rates.rx_max_rate =
1343                 __le16_to_cpu(vht_cap->vht_mcs.rx_highest);
1344         arg->peer_vht_rates.rx_mcs_set =
1345                 __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map);
1346         arg->peer_vht_rates.tx_max_rate =
1347                 __le16_to_cpu(vht_cap->vht_mcs.tx_highest);
1348         arg->peer_vht_rates.tx_mcs_set =
1349                 __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map);
1350
1351         ath10k_dbg(ATH10K_DBG_MAC, "mac vht peer %pM max_mpdu %d flags 0x%x\n",
1352                    sta->addr, arg->peer_max_mpdu, arg->peer_flags);
1353 }
1354
1355 static void ath10k_peer_assoc_h_qos(struct ath10k *ar,
1356                                     struct ath10k_vif *arvif,
1357                                     struct ieee80211_sta *sta,
1358                                     struct ieee80211_bss_conf *bss_conf,
1359                                     struct wmi_peer_assoc_complete_arg *arg)
1360 {
1361         switch (arvif->vdev_type) {
1362         case WMI_VDEV_TYPE_AP:
1363                 if (sta->wme)
1364                         arg->peer_flags |= WMI_PEER_QOS;
1365
1366                 if (sta->wme && sta->uapsd_queues) {
1367                         arg->peer_flags |= WMI_PEER_APSD;
1368                         arg->peer_rate_caps |= WMI_RC_UAPSD_FLAG;
1369                 }
1370                 break;
1371         case WMI_VDEV_TYPE_STA:
1372                 if (bss_conf->qos)
1373                         arg->peer_flags |= WMI_PEER_QOS;
1374                 break;
1375         default:
1376                 break;
1377         }
1378 }
1379
1380 static void ath10k_peer_assoc_h_phymode(struct ath10k *ar,
1381                                         struct ath10k_vif *arvif,
1382                                         struct ieee80211_sta *sta,
1383                                         struct wmi_peer_assoc_complete_arg *arg)
1384 {
1385         enum wmi_phy_mode phymode = MODE_UNKNOWN;
1386
1387         switch (ar->hw->conf.chandef.chan->band) {
1388         case IEEE80211_BAND_2GHZ:
1389                 if (sta->ht_cap.ht_supported) {
1390                         if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1391                                 phymode = MODE_11NG_HT40;
1392                         else
1393                                 phymode = MODE_11NG_HT20;
1394                 } else {
1395                         phymode = MODE_11G;
1396                 }
1397
1398                 break;
1399         case IEEE80211_BAND_5GHZ:
1400                 /*
1401                  * Check VHT first.
1402                  */
1403                 if (sta->vht_cap.vht_supported) {
1404                         if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
1405                                 phymode = MODE_11AC_VHT80;
1406                         else if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1407                                 phymode = MODE_11AC_VHT40;
1408                         else if (sta->bandwidth == IEEE80211_STA_RX_BW_20)
1409                                 phymode = MODE_11AC_VHT20;
1410                 } else if (sta->ht_cap.ht_supported) {
1411                         if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1412                                 phymode = MODE_11NA_HT40;
1413                         else
1414                                 phymode = MODE_11NA_HT20;
1415                 } else {
1416                         phymode = MODE_11A;
1417                 }
1418
1419                 break;
1420         default:
1421                 break;
1422         }
1423
1424         ath10k_dbg(ATH10K_DBG_MAC, "mac peer %pM phymode %s\n",
1425                    sta->addr, ath10k_wmi_phymode_str(phymode));
1426
1427         arg->peer_phymode = phymode;
1428         WARN_ON(phymode == MODE_UNKNOWN);
1429 }
1430
1431 static int ath10k_peer_assoc_prepare(struct ath10k *ar,
1432                                      struct ath10k_vif *arvif,
1433                                      struct ieee80211_sta *sta,
1434                                      struct ieee80211_bss_conf *bss_conf,
1435                                      struct wmi_peer_assoc_complete_arg *arg)
1436 {
1437         lockdep_assert_held(&ar->conf_mutex);
1438
1439         memset(arg, 0, sizeof(*arg));
1440
1441         ath10k_peer_assoc_h_basic(ar, arvif, sta, bss_conf, arg);
1442         ath10k_peer_assoc_h_crypto(ar, arvif, arg);
1443         ath10k_peer_assoc_h_rates(ar, sta, arg);
1444         ath10k_peer_assoc_h_ht(ar, sta, arg);
1445         ath10k_peer_assoc_h_vht(ar, sta, arg);
1446         ath10k_peer_assoc_h_qos(ar, arvif, sta, bss_conf, arg);
1447         ath10k_peer_assoc_h_phymode(ar, arvif, sta, arg);
1448
1449         return 0;
1450 }
1451
1452 static const u32 ath10k_smps_map[] = {
1453         [WLAN_HT_CAP_SM_PS_STATIC] = WMI_PEER_SMPS_STATIC,
1454         [WLAN_HT_CAP_SM_PS_DYNAMIC] = WMI_PEER_SMPS_DYNAMIC,
1455         [WLAN_HT_CAP_SM_PS_INVALID] = WMI_PEER_SMPS_PS_NONE,
1456         [WLAN_HT_CAP_SM_PS_DISABLED] = WMI_PEER_SMPS_PS_NONE,
1457 };
1458
1459 static int ath10k_setup_peer_smps(struct ath10k *ar, struct ath10k_vif *arvif,
1460                                   const u8 *addr,
1461                                   const struct ieee80211_sta_ht_cap *ht_cap)
1462 {
1463         int smps;
1464
1465         if (!ht_cap->ht_supported)
1466                 return 0;
1467
1468         smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
1469         smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
1470
1471         if (smps >= ARRAY_SIZE(ath10k_smps_map))
1472                 return -EINVAL;
1473
1474         return ath10k_wmi_peer_set_param(ar, arvif->vdev_id, addr,
1475                                          WMI_PEER_SMPS_STATE,
1476                                          ath10k_smps_map[smps]);
1477 }
1478
1479 /* can be called only in mac80211 callbacks due to `key_count` usage */
1480 static void ath10k_bss_assoc(struct ieee80211_hw *hw,
1481                              struct ieee80211_vif *vif,
1482                              struct ieee80211_bss_conf *bss_conf)
1483 {
1484         struct ath10k *ar = hw->priv;
1485         struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1486         struct ieee80211_sta_ht_cap ht_cap;
1487         struct wmi_peer_assoc_complete_arg peer_arg;
1488         struct ieee80211_sta *ap_sta;
1489         int ret;
1490
1491         lockdep_assert_held(&ar->conf_mutex);
1492
1493         rcu_read_lock();
1494
1495         ap_sta = ieee80211_find_sta(vif, bss_conf->bssid);
1496         if (!ap_sta) {
1497                 ath10k_warn("failed to find station entry for bss %pM vdev %i\n",
1498                             bss_conf->bssid, arvif->vdev_id);
1499                 rcu_read_unlock();
1500                 return;
1501         }
1502
1503         /* ap_sta must be accessed only within rcu section which must be left
1504          * before calling ath10k_setup_peer_smps() which might sleep. */
1505         ht_cap = ap_sta->ht_cap;
1506
1507         ret = ath10k_peer_assoc_prepare(ar, arvif, ap_sta,
1508                                         bss_conf, &peer_arg);
1509         if (ret) {
1510                 ath10k_warn("failed to prepare peer assoc for %pM vdev %i: %d\n",
1511                             bss_conf->bssid, arvif->vdev_id, ret);
1512                 rcu_read_unlock();
1513                 return;
1514         }
1515
1516         rcu_read_unlock();
1517
1518         ret = ath10k_wmi_peer_assoc(ar, &peer_arg);
1519         if (ret) {
1520                 ath10k_warn("failed to run peer assoc for %pM vdev %i: %d\n",
1521                             bss_conf->bssid, arvif->vdev_id, ret);
1522                 return;
1523         }
1524
1525         ret = ath10k_setup_peer_smps(ar, arvif, bss_conf->bssid, &ht_cap);
1526         if (ret) {
1527                 ath10k_warn("failed to setup peer SMPS for vdev %i: %d\n",
1528                             arvif->vdev_id, ret);
1529                 return;
1530         }
1531
1532         ath10k_dbg(ATH10K_DBG_MAC,
1533                    "mac vdev %d up (associated) bssid %pM aid %d\n",
1534                    arvif->vdev_id, bss_conf->bssid, bss_conf->aid);
1535
1536         arvif->aid = bss_conf->aid;
1537         memcpy(arvif->bssid, bss_conf->bssid, ETH_ALEN);
1538
1539         ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid);
1540         if (ret) {
1541                 ath10k_warn("failed to set vdev %d up: %d\n",
1542                             arvif->vdev_id, ret);
1543                 return;
1544         }
1545
1546         arvif->is_up = true;
1547 }
1548
1549 /*
1550  * FIXME: flush TIDs
1551  */
1552 static void ath10k_bss_disassoc(struct ieee80211_hw *hw,
1553                                 struct ieee80211_vif *vif)
1554 {
1555         struct ath10k *ar = hw->priv;
1556         struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1557         int ret;
1558
1559         lockdep_assert_held(&ar->conf_mutex);
1560
1561         /*
1562          * For some reason, calling VDEV-DOWN before VDEV-STOP
1563          * makes the FW to send frames via HTT after disassociation.
1564          * No idea why this happens, even though VDEV-DOWN is supposed
1565          * to be analogous to link down, so just stop the VDEV.
1566          */
1567         ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d stop (disassociated\n",
1568                    arvif->vdev_id);
1569
1570         /* FIXME: check return value */
1571         ret = ath10k_vdev_stop(arvif);
1572
1573         /*
1574          * If we don't call VDEV-DOWN after VDEV-STOP FW will remain active and
1575          * report beacons from previously associated network through HTT.
1576          * This in turn would spam mac80211 WARN_ON if we bring down all
1577          * interfaces as it expects there is no rx when no interface is
1578          * running.
1579          */
1580         ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d down\n", arvif->vdev_id);
1581
1582         /* FIXME: why don't we print error if wmi call fails? */
1583         ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
1584
1585         arvif->def_wep_key_idx = 0;
1586
1587         arvif->is_started = false;
1588         arvif->is_up = false;
1589 }
1590
1591 static int ath10k_station_assoc(struct ath10k *ar, struct ath10k_vif *arvif,
1592                                 struct ieee80211_sta *sta, bool reassoc)
1593 {
1594         struct wmi_peer_assoc_complete_arg peer_arg;
1595         int ret = 0;
1596
1597         lockdep_assert_held(&ar->conf_mutex);
1598
1599         ret = ath10k_peer_assoc_prepare(ar, arvif, sta, NULL, &peer_arg);
1600         if (ret) {
1601                 ath10k_warn("failed to prepare WMI peer assoc for %pM vdev %i: %i\n",
1602                             sta->addr, arvif->vdev_id, ret);
1603                 return ret;
1604         }
1605
1606         peer_arg.peer_reassoc = reassoc;
1607         ret = ath10k_wmi_peer_assoc(ar, &peer_arg);
1608         if (ret) {
1609                 ath10k_warn("failed to run peer assoc for STA %pM vdev %i: %d\n",
1610                             sta->addr, arvif->vdev_id, ret);
1611                 return ret;
1612         }
1613
1614         ret = ath10k_setup_peer_smps(ar, arvif, sta->addr, &sta->ht_cap);
1615         if (ret) {
1616                 ath10k_warn("failed to setup peer SMPS for vdev %d: %d\n",
1617                             arvif->vdev_id, ret);
1618                 return ret;
1619         }
1620
1621         if (!sta->wme) {
1622                 arvif->num_legacy_stations++;
1623                 ret  = ath10k_recalc_rtscts_prot(arvif);
1624                 if (ret) {
1625                         ath10k_warn("failed to recalculate rts/cts prot for vdev %d: %d\n",
1626                                     arvif->vdev_id, ret);
1627                         return ret;
1628                 }
1629         }
1630
1631         ret = ath10k_install_peer_wep_keys(arvif, sta->addr);
1632         if (ret) {
1633                 ath10k_warn("failed to install peer wep keys for vdev %i: %d\n",
1634                             arvif->vdev_id, ret);
1635                 return ret;
1636         }
1637
1638         ret = ath10k_peer_assoc_qos_ap(ar, arvif, sta);
1639         if (ret) {
1640                 ath10k_warn("failed to set qos params for STA %pM for vdev %i: %d\n",
1641                             sta->addr, arvif->vdev_id, ret);
1642                 return ret;
1643         }
1644
1645         return ret;
1646 }
1647
1648 static int ath10k_station_disassoc(struct ath10k *ar, struct ath10k_vif *arvif,
1649                                    struct ieee80211_sta *sta)
1650 {
1651         int ret = 0;
1652
1653         lockdep_assert_held(&ar->conf_mutex);
1654
1655         if (!sta->wme) {
1656                 arvif->num_legacy_stations--;
1657                 ret = ath10k_recalc_rtscts_prot(arvif);
1658                 if (ret) {
1659                         ath10k_warn("failed to recalculate rts/cts prot for vdev %d: %d\n",
1660                                     arvif->vdev_id, ret);
1661                         return ret;
1662                 }
1663         }
1664
1665         ret = ath10k_clear_peer_keys(arvif, sta->addr);
1666         if (ret) {
1667                 ath10k_warn("failed to clear all peer wep keys for vdev %i: %d\n",
1668                             arvif->vdev_id, ret);
1669                 return ret;
1670         }
1671
1672         return ret;
1673 }
1674
1675 /**************/
1676 /* Regulatory */
1677 /**************/
1678
1679 static int ath10k_update_channel_list(struct ath10k *ar)
1680 {
1681         struct ieee80211_hw *hw = ar->hw;
1682         struct ieee80211_supported_band **bands;
1683         enum ieee80211_band band;
1684         struct ieee80211_channel *channel;
1685         struct wmi_scan_chan_list_arg arg = {0};
1686         struct wmi_channel_arg *ch;
1687         bool passive;
1688         int len;
1689         int ret;
1690         int i;
1691
1692         lockdep_assert_held(&ar->conf_mutex);
1693
1694         bands = hw->wiphy->bands;
1695         for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
1696                 if (!bands[band])
1697                         continue;
1698
1699                 for (i = 0; i < bands[band]->n_channels; i++) {
1700                         if (bands[band]->channels[i].flags &
1701                             IEEE80211_CHAN_DISABLED)
1702                                 continue;
1703
1704                         arg.n_channels++;
1705                 }
1706         }
1707
1708         len = sizeof(struct wmi_channel_arg) * arg.n_channels;
1709         arg.channels = kzalloc(len, GFP_KERNEL);
1710         if (!arg.channels)
1711                 return -ENOMEM;
1712
1713         ch = arg.channels;
1714         for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
1715                 if (!bands[band])
1716                         continue;
1717
1718                 for (i = 0; i < bands[band]->n_channels; i++) {
1719                         channel = &bands[band]->channels[i];
1720
1721                         if (channel->flags & IEEE80211_CHAN_DISABLED)
1722                                 continue;
1723
1724                         ch->allow_ht   = true;
1725
1726                         /* FIXME: when should we really allow VHT? */
1727                         ch->allow_vht = true;
1728
1729                         ch->allow_ibss =
1730                                 !(channel->flags & IEEE80211_CHAN_NO_IR);
1731
1732                         ch->ht40plus =
1733                                 !(channel->flags & IEEE80211_CHAN_NO_HT40PLUS);
1734
1735                         ch->chan_radar =
1736                                 !!(channel->flags & IEEE80211_CHAN_RADAR);
1737
1738                         passive = channel->flags & IEEE80211_CHAN_NO_IR;
1739                         ch->passive = passive;
1740
1741                         ch->freq = channel->center_freq;
1742                         ch->min_power = 0;
1743                         ch->max_power = channel->max_power * 2;
1744                         ch->max_reg_power = channel->max_reg_power * 2;
1745                         ch->max_antenna_gain = channel->max_antenna_gain * 2;
1746                         ch->reg_class_id = 0; /* FIXME */
1747
1748                         /* FIXME: why use only legacy modes, why not any
1749                          * HT/VHT modes? Would that even make any
1750                          * difference? */
1751                         if (channel->band == IEEE80211_BAND_2GHZ)
1752                                 ch->mode = MODE_11G;
1753                         else
1754                                 ch->mode = MODE_11A;
1755
1756                         if (WARN_ON_ONCE(ch->mode == MODE_UNKNOWN))
1757                                 continue;
1758
1759                         ath10k_dbg(ATH10K_DBG_WMI,
1760                                    "mac channel [%zd/%d] freq %d maxpower %d regpower %d antenna %d mode %d\n",
1761                                     ch - arg.channels, arg.n_channels,
1762                                    ch->freq, ch->max_power, ch->max_reg_power,
1763                                    ch->max_antenna_gain, ch->mode);
1764
1765                         ch++;
1766                 }
1767         }
1768
1769         ret = ath10k_wmi_scan_chan_list(ar, &arg);
1770         kfree(arg.channels);
1771
1772         return ret;
1773 }
1774
1775 static enum wmi_dfs_region
1776 ath10k_mac_get_dfs_region(enum nl80211_dfs_regions dfs_region)
1777 {
1778         switch (dfs_region) {
1779         case NL80211_DFS_UNSET:
1780                 return WMI_UNINIT_DFS_DOMAIN;
1781         case NL80211_DFS_FCC:
1782                 return WMI_FCC_DFS_DOMAIN;
1783         case NL80211_DFS_ETSI:
1784                 return WMI_ETSI_DFS_DOMAIN;
1785         case NL80211_DFS_JP:
1786                 return WMI_MKK4_DFS_DOMAIN;
1787         }
1788         return WMI_UNINIT_DFS_DOMAIN;
1789 }
1790
1791 static void ath10k_regd_update(struct ath10k *ar)
1792 {
1793         struct reg_dmn_pair_mapping *regpair;
1794         int ret;
1795         enum wmi_dfs_region wmi_dfs_reg;
1796         enum nl80211_dfs_regions nl_dfs_reg;
1797
1798         lockdep_assert_held(&ar->conf_mutex);
1799
1800         ret = ath10k_update_channel_list(ar);
1801         if (ret)
1802                 ath10k_warn("failed to update channel list: %d\n", ret);
1803
1804         regpair = ar->ath_common.regulatory.regpair;
1805
1806         if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) {
1807                 nl_dfs_reg = ar->dfs_detector->region;
1808                 wmi_dfs_reg = ath10k_mac_get_dfs_region(nl_dfs_reg);
1809         } else {
1810                 wmi_dfs_reg = WMI_UNINIT_DFS_DOMAIN;
1811         }
1812
1813         /* Target allows setting up per-band regdomain but ath_common provides
1814          * a combined one only */
1815         ret = ath10k_wmi_pdev_set_regdomain(ar,
1816                                             regpair->reg_domain,
1817                                             regpair->reg_domain, /* 2ghz */
1818                                             regpair->reg_domain, /* 5ghz */
1819                                             regpair->reg_2ghz_ctl,
1820                                             regpair->reg_5ghz_ctl,
1821                                             wmi_dfs_reg);
1822         if (ret)
1823                 ath10k_warn("failed to set pdev regdomain: %d\n", ret);
1824 }
1825
1826 static void ath10k_reg_notifier(struct wiphy *wiphy,
1827                                 struct regulatory_request *request)
1828 {
1829         struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
1830         struct ath10k *ar = hw->priv;
1831         bool result;
1832
1833         ath_reg_notifier_apply(wiphy, request, &ar->ath_common.regulatory);
1834
1835         if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) {
1836                 ath10k_dbg(ATH10K_DBG_REGULATORY, "dfs region 0x%x\n",
1837                            request->dfs_region);
1838                 result = ar->dfs_detector->set_dfs_domain(ar->dfs_detector,
1839                                                           request->dfs_region);
1840                 if (!result)
1841                         ath10k_warn("DFS region 0x%X not supported, will trigger radar for every pulse\n",
1842                                     request->dfs_region);
1843         }
1844
1845         mutex_lock(&ar->conf_mutex);
1846         if (ar->state == ATH10K_STATE_ON)
1847                 ath10k_regd_update(ar);
1848         mutex_unlock(&ar->conf_mutex);
1849 }
1850
1851 /***************/
1852 /* TX handlers */
1853 /***************/
1854
1855 static u8 ath10k_tx_h_get_tid(struct ieee80211_hdr *hdr)
1856 {
1857         if (ieee80211_is_mgmt(hdr->frame_control))
1858                 return HTT_DATA_TX_EXT_TID_MGMT;
1859
1860         if (!ieee80211_is_data_qos(hdr->frame_control))
1861                 return HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
1862
1863         if (!is_unicast_ether_addr(ieee80211_get_DA(hdr)))
1864                 return HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
1865
1866         return ieee80211_get_qos_ctl(hdr)[0] & IEEE80211_QOS_CTL_TID_MASK;
1867 }
1868
1869 static u8 ath10k_tx_h_get_vdev_id(struct ath10k *ar,
1870                                   struct ieee80211_tx_info *info)
1871 {
1872         if (info->control.vif)
1873                 return ath10k_vif_to_arvif(info->control.vif)->vdev_id;
1874
1875         if (ar->monitor_started)
1876                 return ar->monitor_vdev_id;
1877
1878         ath10k_warn("failed to resolve vdev id\n");
1879         return 0;
1880 }
1881
1882 /* HTT Tx uses Native Wifi tx mode which expects 802.11 frames without QoS
1883  * Control in the header.
1884  */
1885 static void ath10k_tx_h_nwifi(struct ieee80211_hw *hw, struct sk_buff *skb)
1886 {
1887         struct ieee80211_hdr *hdr = (void *)skb->data;
1888         struct ath10k_skb_cb *cb = ATH10K_SKB_CB(skb);
1889         u8 *qos_ctl;
1890
1891         if (!ieee80211_is_data_qos(hdr->frame_control))
1892                 return;
1893
1894         qos_ctl = ieee80211_get_qos_ctl(hdr);
1895         memmove(skb->data + IEEE80211_QOS_CTL_LEN,
1896                 skb->data, (void *)qos_ctl - (void *)skb->data);
1897         skb_pull(skb, IEEE80211_QOS_CTL_LEN);
1898
1899         /* Fw/Hw generates a corrupted QoS Control Field for QoS NullFunc
1900          * frames. Powersave is handled by the fw/hw so QoS NyllFunc frames are
1901          * used only for CQM purposes (e.g. hostapd station keepalive ping) so
1902          * it is safe to downgrade to NullFunc.
1903          */
1904         if (ieee80211_is_qos_nullfunc(hdr->frame_control)) {
1905                 hdr->frame_control &= ~__cpu_to_le16(IEEE80211_STYPE_QOS_DATA);
1906                 cb->htt.tid = HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
1907         }
1908 }
1909
1910 static void ath10k_tx_wep_key_work(struct work_struct *work)
1911 {
1912         struct ath10k_vif *arvif = container_of(work, struct ath10k_vif,
1913                                                 wep_key_work);
1914         int ret, keyidx = arvif->def_wep_key_newidx;
1915
1916         mutex_lock(&arvif->ar->conf_mutex);
1917
1918         if (arvif->ar->state != ATH10K_STATE_ON)
1919                 goto unlock;
1920
1921         if (arvif->def_wep_key_idx == keyidx)
1922                 goto unlock;
1923
1924         ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d set keyidx %d\n",
1925                    arvif->vdev_id, keyidx);
1926
1927         ret = ath10k_wmi_vdev_set_param(arvif->ar,
1928                                         arvif->vdev_id,
1929                                         arvif->ar->wmi.vdev_param->def_keyid,
1930                                         keyidx);
1931         if (ret) {
1932                 ath10k_warn("failed to update wep key index for vdev %d: %d\n",
1933                             arvif->vdev_id,
1934                             ret);
1935                 goto unlock;
1936         }
1937
1938         arvif->def_wep_key_idx = keyidx;
1939
1940 unlock:
1941         mutex_unlock(&arvif->ar->conf_mutex);
1942 }
1943
1944 static void ath10k_tx_h_update_wep_key(struct ieee80211_vif *vif,
1945                                        struct ieee80211_key_conf *key,
1946                                        struct sk_buff *skb)
1947 {
1948         struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1949         struct ath10k *ar = arvif->ar;
1950         struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
1951
1952         if (!ieee80211_has_protected(hdr->frame_control))
1953                 return;
1954
1955         if (!key)
1956                 return;
1957
1958         if (key->cipher != WLAN_CIPHER_SUITE_WEP40 &&
1959             key->cipher != WLAN_CIPHER_SUITE_WEP104)
1960                 return;
1961
1962         if (key->keyidx == arvif->def_wep_key_idx)
1963                 return;
1964
1965         /* FIXME: Most likely a few frames will be TXed with an old key. Simply
1966          * queueing frames until key index is updated is not an option because
1967          * sk_buff may need more processing to be done, e.g. offchannel */
1968         arvif->def_wep_key_newidx = key->keyidx;
1969         ieee80211_queue_work(ar->hw, &arvif->wep_key_work);
1970 }
1971
1972 static void ath10k_tx_h_add_p2p_noa_ie(struct ath10k *ar,
1973                                        struct ieee80211_vif *vif,
1974                                        struct sk_buff *skb)
1975 {
1976         struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
1977         struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1978
1979         /* This is case only for P2P_GO */
1980         if (arvif->vdev_type != WMI_VDEV_TYPE_AP ||
1981             arvif->vdev_subtype != WMI_VDEV_SUBTYPE_P2P_GO)
1982                 return;
1983
1984         if (unlikely(ieee80211_is_probe_resp(hdr->frame_control))) {
1985                 spin_lock_bh(&ar->data_lock);
1986                 if (arvif->u.ap.noa_data)
1987                         if (!pskb_expand_head(skb, 0, arvif->u.ap.noa_len,
1988                                               GFP_ATOMIC))
1989                                 memcpy(skb_put(skb, arvif->u.ap.noa_len),
1990                                        arvif->u.ap.noa_data,
1991                                        arvif->u.ap.noa_len);
1992                 spin_unlock_bh(&ar->data_lock);
1993         }
1994 }
1995
1996 static void ath10k_tx_htt(struct ath10k *ar, struct sk_buff *skb)
1997 {
1998         struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
1999         int ret = 0;
2000
2001         if (ar->htt.target_version_major >= 3) {
2002                 /* Since HTT 3.0 there is no separate mgmt tx command */
2003                 ret = ath10k_htt_tx(&ar->htt, skb);
2004                 goto exit;
2005         }
2006
2007         if (ieee80211_is_mgmt(hdr->frame_control)) {
2008                 if (test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX,
2009                              ar->fw_features)) {
2010                         if (skb_queue_len(&ar->wmi_mgmt_tx_queue) >=
2011                             ATH10K_MAX_NUM_MGMT_PENDING) {
2012                                 ath10k_warn("reached WMI management tranmist queue limit\n");
2013                                 ret = -EBUSY;
2014                                 goto exit;
2015                         }
2016
2017                         skb_queue_tail(&ar->wmi_mgmt_tx_queue, skb);
2018                         ieee80211_queue_work(ar->hw, &ar->wmi_mgmt_tx_work);
2019                 } else {
2020                         ret = ath10k_htt_mgmt_tx(&ar->htt, skb);
2021                 }
2022         } else if (!test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX,
2023                              ar->fw_features) &&
2024                    ieee80211_is_nullfunc(hdr->frame_control)) {
2025                 /* FW does not report tx status properly for NullFunc frames
2026                  * unless they are sent through mgmt tx path. mac80211 sends
2027                  * those frames when it detects link/beacon loss and depends
2028                  * on the tx status to be correct. */
2029                 ret = ath10k_htt_mgmt_tx(&ar->htt, skb);
2030         } else {
2031                 ret = ath10k_htt_tx(&ar->htt, skb);
2032         }
2033
2034 exit:
2035         if (ret) {
2036                 ath10k_warn("failed to transmit packet, dropping: %d\n", ret);
2037                 ieee80211_free_txskb(ar->hw, skb);
2038         }
2039 }
2040
2041 void ath10k_offchan_tx_purge(struct ath10k *ar)
2042 {
2043         struct sk_buff *skb;
2044
2045         for (;;) {
2046                 skb = skb_dequeue(&ar->offchan_tx_queue);
2047                 if (!skb)
2048                         break;
2049
2050                 ieee80211_free_txskb(ar->hw, skb);
2051         }
2052 }
2053
2054 void ath10k_offchan_tx_work(struct work_struct *work)
2055 {
2056         struct ath10k *ar = container_of(work, struct ath10k, offchan_tx_work);
2057         struct ath10k_peer *peer;
2058         struct ieee80211_hdr *hdr;
2059         struct sk_buff *skb;
2060         const u8 *peer_addr;
2061         int vdev_id;
2062         int ret;
2063
2064         /* FW requirement: We must create a peer before FW will send out
2065          * an offchannel frame. Otherwise the frame will be stuck and
2066          * never transmitted. We delete the peer upon tx completion.
2067          * It is unlikely that a peer for offchannel tx will already be
2068          * present. However it may be in some rare cases so account for that.
2069          * Otherwise we might remove a legitimate peer and break stuff. */
2070
2071         for (;;) {
2072                 skb = skb_dequeue(&ar->offchan_tx_queue);
2073                 if (!skb)
2074                         break;
2075
2076                 mutex_lock(&ar->conf_mutex);
2077
2078                 ath10k_dbg(ATH10K_DBG_MAC, "mac offchannel skb %p\n",
2079                            skb);
2080
2081                 hdr = (struct ieee80211_hdr *)skb->data;
2082                 peer_addr = ieee80211_get_DA(hdr);
2083                 vdev_id = ATH10K_SKB_CB(skb)->vdev_id;
2084
2085                 spin_lock_bh(&ar->data_lock);
2086                 peer = ath10k_peer_find(ar, vdev_id, peer_addr);
2087                 spin_unlock_bh(&ar->data_lock);
2088
2089                 if (peer)
2090                         /* FIXME: should this use ath10k_warn()? */
2091                         ath10k_dbg(ATH10K_DBG_MAC, "peer %pM on vdev %d already present\n",
2092                                    peer_addr, vdev_id);
2093
2094                 if (!peer) {
2095                         ret = ath10k_peer_create(ar, vdev_id, peer_addr);
2096                         if (ret)
2097                                 ath10k_warn("failed to create peer %pM on vdev %d: %d\n",
2098                                             peer_addr, vdev_id, ret);
2099                 }
2100
2101                 spin_lock_bh(&ar->data_lock);
2102                 reinit_completion(&ar->offchan_tx_completed);
2103                 ar->offchan_tx_skb = skb;
2104                 spin_unlock_bh(&ar->data_lock);
2105
2106                 ath10k_tx_htt(ar, skb);
2107
2108                 ret = wait_for_completion_timeout(&ar->offchan_tx_completed,
2109                                                   3 * HZ);
2110                 if (ret <= 0)
2111                         ath10k_warn("timed out waiting for offchannel skb %p\n",
2112                                     skb);
2113
2114                 if (!peer) {
2115                         ret = ath10k_peer_delete(ar, vdev_id, peer_addr);
2116                         if (ret)
2117                                 ath10k_warn("failed to delete peer %pM on vdev %d: %d\n",
2118                                             peer_addr, vdev_id, ret);
2119                 }
2120
2121                 mutex_unlock(&ar->conf_mutex);
2122         }
2123 }
2124
2125 void ath10k_mgmt_over_wmi_tx_purge(struct ath10k *ar)
2126 {
2127         struct sk_buff *skb;
2128
2129         for (;;) {
2130                 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
2131                 if (!skb)
2132                         break;
2133
2134                 ieee80211_free_txskb(ar->hw, skb);
2135         }
2136 }
2137
2138 void ath10k_mgmt_over_wmi_tx_work(struct work_struct *work)
2139 {
2140         struct ath10k *ar = container_of(work, struct ath10k, wmi_mgmt_tx_work);
2141         struct sk_buff *skb;
2142         int ret;
2143
2144         for (;;) {
2145                 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
2146                 if (!skb)
2147                         break;
2148
2149                 ret = ath10k_wmi_mgmt_tx(ar, skb);
2150                 if (ret) {
2151                         ath10k_warn("failed to transmit management frame via WMI: %d\n",
2152                                     ret);
2153                         ieee80211_free_txskb(ar->hw, skb);
2154                 }
2155         }
2156 }
2157
2158 /************/
2159 /* Scanning */
2160 /************/
2161
2162 /*
2163  * This gets called if we dont get a heart-beat during scan.
2164  * This may indicate the FW has hung and we need to abort the
2165  * scan manually to prevent cancel_hw_scan() from deadlocking
2166  */
2167 void ath10k_reset_scan(unsigned long ptr)
2168 {
2169         struct ath10k *ar = (struct ath10k *)ptr;
2170
2171         spin_lock_bh(&ar->data_lock);
2172         if (!ar->scan.in_progress) {
2173                 spin_unlock_bh(&ar->data_lock);
2174                 return;
2175         }
2176
2177         ath10k_warn("scan timed out, firmware problem?\n");
2178
2179         if (ar->scan.is_roc)
2180                 ieee80211_remain_on_channel_expired(ar->hw);
2181         else
2182                 ieee80211_scan_completed(ar->hw, 1 /* aborted */);
2183
2184         ar->scan.in_progress = false;
2185         complete_all(&ar->scan.completed);
2186         spin_unlock_bh(&ar->data_lock);
2187 }
2188
2189 static int ath10k_abort_scan(struct ath10k *ar)
2190 {
2191         struct wmi_stop_scan_arg arg = {
2192                 .req_id = 1, /* FIXME */
2193                 .req_type = WMI_SCAN_STOP_ONE,
2194                 .u.scan_id = ATH10K_SCAN_ID,
2195         };
2196         int ret;
2197
2198         lockdep_assert_held(&ar->conf_mutex);
2199
2200         del_timer_sync(&ar->scan.timeout);
2201
2202         spin_lock_bh(&ar->data_lock);
2203         if (!ar->scan.in_progress) {
2204                 spin_unlock_bh(&ar->data_lock);
2205                 return 0;
2206         }
2207
2208         ar->scan.aborting = true;
2209         spin_unlock_bh(&ar->data_lock);
2210
2211         ret = ath10k_wmi_stop_scan(ar, &arg);
2212         if (ret) {
2213                 ath10k_warn("failed to stop wmi scan: %d\n", ret);
2214                 spin_lock_bh(&ar->data_lock);
2215                 ar->scan.in_progress = false;
2216                 ath10k_offchan_tx_purge(ar);
2217                 spin_unlock_bh(&ar->data_lock);
2218                 return -EIO;
2219         }
2220
2221         ret = wait_for_completion_timeout(&ar->scan.completed, 3*HZ);
2222         if (ret == 0)
2223                 ath10k_warn("timed out while waiting for scan to stop\n");
2224
2225         /* scan completion may be done right after we timeout here, so let's
2226          * check the in_progress and tell mac80211 scan is completed. if we
2227          * don't do that and FW fails to send us scan completion indication
2228          * then userspace won't be able to scan anymore */
2229         ret = 0;
2230
2231         spin_lock_bh(&ar->data_lock);
2232         if (ar->scan.in_progress) {
2233                 ath10k_warn("failed to stop scan, it's still in progress\n");
2234                 ar->scan.in_progress = false;
2235                 ath10k_offchan_tx_purge(ar);
2236                 ret = -ETIMEDOUT;
2237         }
2238         spin_unlock_bh(&ar->data_lock);
2239
2240         return ret;
2241 }
2242
2243 static int ath10k_start_scan(struct ath10k *ar,
2244                              const struct wmi_start_scan_arg *arg)
2245 {
2246         int ret;
2247
2248         lockdep_assert_held(&ar->conf_mutex);
2249
2250         ret = ath10k_wmi_start_scan(ar, arg);
2251         if (ret)
2252                 return ret;
2253
2254         ret = wait_for_completion_timeout(&ar->scan.started, 1*HZ);
2255         if (ret == 0) {
2256                 ath10k_abort_scan(ar);
2257                 return ret;
2258         }
2259
2260         /* the scan can complete earlier, before we even
2261          * start the timer. in that case the timer handler
2262          * checks ar->scan.in_progress and bails out if its
2263          * false. Add a 200ms margin to account event/command
2264          * processing. */
2265         mod_timer(&ar->scan.timeout, jiffies +
2266                   msecs_to_jiffies(arg->max_scan_time+200));
2267         return 0;
2268 }
2269
2270 /**********************/
2271 /* mac80211 callbacks */
2272 /**********************/
2273
2274 static void ath10k_tx(struct ieee80211_hw *hw,
2275                       struct ieee80211_tx_control *control,
2276                       struct sk_buff *skb)
2277 {
2278         struct ath10k *ar = hw->priv;
2279         struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
2280         struct ieee80211_vif *vif = info->control.vif;
2281         struct ieee80211_key_conf *key = info->control.hw_key;
2282         struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
2283
2284         /* We should disable CCK RATE due to P2P */
2285         if (info->flags & IEEE80211_TX_CTL_NO_CCK_RATE)
2286                 ath10k_dbg(ATH10K_DBG_MAC, "IEEE80211_TX_CTL_NO_CCK_RATE\n");
2287
2288         ATH10K_SKB_CB(skb)->htt.is_offchan = false;
2289         ATH10K_SKB_CB(skb)->htt.tid = ath10k_tx_h_get_tid(hdr);
2290         ATH10K_SKB_CB(skb)->vdev_id = ath10k_tx_h_get_vdev_id(ar, info);
2291
2292         /* it makes no sense to process injected frames like that */
2293         if (vif && vif->type != NL80211_IFTYPE_MONITOR) {
2294                 ath10k_tx_h_nwifi(hw, skb);
2295                 ath10k_tx_h_update_wep_key(vif, key, skb);
2296                 ath10k_tx_h_add_p2p_noa_ie(ar, vif, skb);
2297                 ath10k_tx_h_seq_no(vif, skb);
2298         }
2299
2300         if (info->flags & IEEE80211_TX_CTL_TX_OFFCHAN) {
2301                 spin_lock_bh(&ar->data_lock);
2302                 ATH10K_SKB_CB(skb)->htt.is_offchan = true;
2303                 ATH10K_SKB_CB(skb)->vdev_id = ar->scan.vdev_id;
2304                 spin_unlock_bh(&ar->data_lock);
2305
2306                 ath10k_dbg(ATH10K_DBG_MAC, "queued offchannel skb %p\n", skb);
2307
2308                 skb_queue_tail(&ar->offchan_tx_queue, skb);
2309                 ieee80211_queue_work(hw, &ar->offchan_tx_work);
2310                 return;
2311         }
2312
2313         ath10k_tx_htt(ar, skb);
2314 }
2315
2316 /* Must not be called with conf_mutex held as workers can use that also. */
2317 static void ath10k_drain_tx(struct ath10k *ar)
2318 {
2319         /* make sure rcu-protected mac80211 tx path itself is drained */
2320         synchronize_net();
2321
2322         ath10k_offchan_tx_purge(ar);
2323         ath10k_mgmt_over_wmi_tx_purge(ar);
2324
2325         cancel_work_sync(&ar->offchan_tx_work);
2326         cancel_work_sync(&ar->wmi_mgmt_tx_work);
2327 }
2328
2329 void ath10k_halt(struct ath10k *ar)
2330 {
2331         struct ath10k_vif *arvif;
2332
2333         lockdep_assert_held(&ar->conf_mutex);
2334
2335         if (ath10k_monitor_is_enabled(ar)) {
2336                 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
2337                 ar->promisc = false;
2338                 ar->monitor = false;
2339                 ath10k_monitor_stop(ar);
2340         }
2341
2342         del_timer_sync(&ar->scan.timeout);
2343         ath10k_reset_scan((unsigned long)ar);
2344         ath10k_peer_cleanup_all(ar);
2345         ath10k_core_stop(ar);
2346         ath10k_hif_power_down(ar);
2347
2348         spin_lock_bh(&ar->data_lock);
2349         list_for_each_entry(arvif, &ar->arvifs, list) {
2350                 if (!arvif->beacon)
2351                         continue;
2352
2353                 dma_unmap_single(arvif->ar->dev,
2354                                  ATH10K_SKB_CB(arvif->beacon)->paddr,
2355                                  arvif->beacon->len, DMA_TO_DEVICE);
2356                 dev_kfree_skb_any(arvif->beacon);
2357                 arvif->beacon = NULL;
2358         }
2359         spin_unlock_bh(&ar->data_lock);
2360 }
2361
2362 static int ath10k_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant)
2363 {
2364         struct ath10k *ar = hw->priv;
2365
2366         mutex_lock(&ar->conf_mutex);
2367
2368         if (ar->cfg_tx_chainmask) {
2369                 *tx_ant = ar->cfg_tx_chainmask;
2370                 *rx_ant = ar->cfg_rx_chainmask;
2371         } else {
2372                 *tx_ant = ar->supp_tx_chainmask;
2373                 *rx_ant = ar->supp_rx_chainmask;
2374         }
2375
2376         mutex_unlock(&ar->conf_mutex);
2377
2378         return 0;
2379 }
2380
2381 static int __ath10k_set_antenna(struct ath10k *ar, u32 tx_ant, u32 rx_ant)
2382 {
2383         int ret;
2384
2385         lockdep_assert_held(&ar->conf_mutex);
2386
2387         ar->cfg_tx_chainmask = tx_ant;
2388         ar->cfg_rx_chainmask = rx_ant;
2389
2390         if ((ar->state != ATH10K_STATE_ON) &&
2391             (ar->state != ATH10K_STATE_RESTARTED))
2392                 return 0;
2393
2394         ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->tx_chain_mask,
2395                                         tx_ant);
2396         if (ret) {
2397                 ath10k_warn("failed to set tx-chainmask: %d, req 0x%x\n",
2398                             ret, tx_ant);
2399                 return ret;
2400         }
2401
2402         ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->rx_chain_mask,
2403                                         rx_ant);
2404         if (ret) {
2405                 ath10k_warn("failed to set rx-chainmask: %d, req 0x%x\n",
2406                             ret, rx_ant);
2407                 return ret;
2408         }
2409
2410         return 0;
2411 }
2412
2413 static int ath10k_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)
2414 {
2415         struct ath10k *ar = hw->priv;
2416         int ret;
2417
2418         mutex_lock(&ar->conf_mutex);
2419         ret = __ath10k_set_antenna(ar, tx_ant, rx_ant);
2420         mutex_unlock(&ar->conf_mutex);
2421         return ret;
2422 }
2423
2424 static int ath10k_start(struct ieee80211_hw *hw)
2425 {
2426         struct ath10k *ar = hw->priv;
2427         int ret = 0;
2428
2429         /*
2430          * This makes sense only when restarting hw. It is harmless to call
2431          * uncoditionally. This is necessary to make sure no HTT/WMI tx
2432          * commands will be submitted while restarting.
2433          */
2434         ath10k_drain_tx(ar);
2435
2436         mutex_lock(&ar->conf_mutex);
2437
2438         switch (ar->state) {
2439         case ATH10K_STATE_OFF:
2440                 ar->state = ATH10K_STATE_ON;
2441                 break;
2442         case ATH10K_STATE_RESTARTING:
2443                 ath10k_halt(ar);
2444                 ar->state = ATH10K_STATE_RESTARTED;
2445                 break;
2446         case ATH10K_STATE_ON:
2447         case ATH10K_STATE_RESTARTED:
2448         case ATH10K_STATE_WEDGED:
2449                 WARN_ON(1);
2450                 ret = -EINVAL;
2451                 goto err;
2452         }
2453
2454         ret = ath10k_hif_power_up(ar);
2455         if (ret) {
2456                 ath10k_err("Could not init hif: %d\n", ret);
2457                 goto err_off;
2458         }
2459
2460         ret = ath10k_core_start(ar);
2461         if (ret) {
2462                 ath10k_err("Could not init core: %d\n", ret);
2463                 goto err_power_down;
2464         }
2465
2466         ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->pmf_qos, 1);
2467         if (ret) {
2468                 ath10k_warn("failed to enable PMF QOS: %d\n", ret);
2469                 goto err_core_stop;
2470         }
2471
2472         ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->dynamic_bw, 1);
2473         if (ret) {
2474                 ath10k_warn("failed to enable dynamic BW: %d\n", ret);
2475                 goto err_core_stop;
2476         }
2477
2478         if (ar->cfg_tx_chainmask)
2479                 __ath10k_set_antenna(ar, ar->cfg_tx_chainmask,
2480                                      ar->cfg_rx_chainmask);
2481
2482         /*
2483          * By default FW set ARP frames ac to voice (6). In that case ARP
2484          * exchange is not working properly for UAPSD enabled AP. ARP requests
2485          * which arrives with access category 0 are processed by network stack
2486          * and send back with access category 0, but FW changes access category
2487          * to 6. Set ARP frames access category to best effort (0) solves
2488          * this problem.
2489          */
2490
2491         ret = ath10k_wmi_pdev_set_param(ar,
2492                                         ar->wmi.pdev_param->arp_ac_override, 0);
2493         if (ret) {
2494                 ath10k_warn("failed to set arp ac override parameter: %d\n",
2495                             ret);
2496                 goto err_core_stop;
2497         }
2498
2499         ar->num_started_vdevs = 0;
2500         ath10k_regd_update(ar);
2501
2502         mutex_unlock(&ar->conf_mutex);
2503         return 0;
2504
2505 err_core_stop:
2506         ath10k_core_stop(ar);
2507
2508 err_power_down:
2509         ath10k_hif_power_down(ar);
2510
2511 err_off:
2512         ar->state = ATH10K_STATE_OFF;
2513
2514 err:
2515         mutex_unlock(&ar->conf_mutex);
2516         return ret;
2517 }
2518
2519 static void ath10k_stop(struct ieee80211_hw *hw)
2520 {
2521         struct ath10k *ar = hw->priv;
2522
2523         ath10k_drain_tx(ar);
2524
2525         mutex_lock(&ar->conf_mutex);
2526         if (ar->state != ATH10K_STATE_OFF) {
2527                 ath10k_halt(ar);
2528                 ar->state = ATH10K_STATE_OFF;
2529         }
2530         mutex_unlock(&ar->conf_mutex);
2531
2532         cancel_work_sync(&ar->restart_work);
2533 }
2534
2535 static int ath10k_config_ps(struct ath10k *ar)
2536 {
2537         struct ath10k_vif *arvif;
2538         int ret = 0;
2539
2540         lockdep_assert_held(&ar->conf_mutex);
2541
2542         list_for_each_entry(arvif, &ar->arvifs, list) {
2543                 ret = ath10k_mac_vif_setup_ps(arvif);
2544                 if (ret) {
2545                         ath10k_warn("failed to setup powersave: %d\n", ret);
2546                         break;
2547                 }
2548         }
2549
2550         return ret;
2551 }
2552
2553 static const char *chandef_get_width(enum nl80211_chan_width width)
2554 {
2555         switch (width) {
2556         case NL80211_CHAN_WIDTH_20_NOHT:
2557                 return "20 (noht)";
2558         case NL80211_CHAN_WIDTH_20:
2559                 return "20";
2560         case NL80211_CHAN_WIDTH_40:
2561                 return "40";
2562         case NL80211_CHAN_WIDTH_80:
2563                 return "80";
2564         case NL80211_CHAN_WIDTH_80P80:
2565                 return "80+80";
2566         case NL80211_CHAN_WIDTH_160:
2567                 return "160";
2568         case NL80211_CHAN_WIDTH_5:
2569                 return "5";
2570         case NL80211_CHAN_WIDTH_10:
2571                 return "10";
2572         }
2573         return "?";
2574 }
2575
2576 static void ath10k_config_chan(struct ath10k *ar)
2577 {
2578         struct ath10k_vif *arvif;
2579         int ret;
2580
2581         lockdep_assert_held(&ar->conf_mutex);
2582
2583         ath10k_dbg(ATH10K_DBG_MAC,
2584                    "mac config channel to %dMHz (cf1 %dMHz cf2 %dMHz width %s)\n",
2585                    ar->chandef.chan->center_freq,
2586                    ar->chandef.center_freq1,
2587                    ar->chandef.center_freq2,
2588                    chandef_get_width(ar->chandef.width));
2589
2590         /* First stop monitor interface. Some FW versions crash if there's a
2591          * lone monitor interface. */
2592         if (ar->monitor_started)
2593                 ath10k_monitor_vdev_stop(ar);
2594
2595         list_for_each_entry(arvif, &ar->arvifs, list) {
2596                 if (!arvif->is_started)
2597                         continue;
2598
2599                 if (!arvif->is_up)
2600                         continue;
2601
2602                 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
2603                         continue;
2604
2605                 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
2606                 if (ret) {
2607                         ath10k_warn("failed to down vdev %d: %d\n",
2608                                     arvif->vdev_id, ret);
2609                         continue;
2610                 }
2611         }
2612
2613         /* all vdevs are downed now - attempt to restart and re-up them */
2614
2615         list_for_each_entry(arvif, &ar->arvifs, list) {
2616                 if (!arvif->is_started)
2617                         continue;
2618
2619                 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
2620                         continue;
2621
2622                 ret = ath10k_vdev_restart(arvif);
2623                 if (ret) {
2624                         ath10k_warn("failed to restart vdev %d: %d\n",
2625                                     arvif->vdev_id, ret);
2626                         continue;
2627                 }
2628
2629                 if (!arvif->is_up)
2630                         continue;
2631
2632                 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
2633                                          arvif->bssid);
2634                 if (ret) {
2635                         ath10k_warn("failed to bring vdev up %d: %d\n",
2636                                     arvif->vdev_id, ret);
2637                         continue;
2638                 }
2639         }
2640
2641         if (ath10k_monitor_is_enabled(ar))
2642                 ath10k_monitor_vdev_start(ar, ar->monitor_vdev_id);
2643 }
2644
2645 static int ath10k_config(struct ieee80211_hw *hw, u32 changed)
2646 {
2647         struct ath10k *ar = hw->priv;
2648         struct ieee80211_conf *conf = &hw->conf;
2649         int ret = 0;
2650         u32 param;
2651
2652         mutex_lock(&ar->conf_mutex);
2653
2654         if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
2655                 ath10k_dbg(ATH10K_DBG_MAC,
2656                            "mac config channel %dMHz flags 0x%x radar %d\n",
2657                            conf->chandef.chan->center_freq,
2658                            conf->chandef.chan->flags,
2659                            conf->radar_enabled);
2660
2661                 spin_lock_bh(&ar->data_lock);
2662                 ar->rx_channel = conf->chandef.chan;
2663                 spin_unlock_bh(&ar->data_lock);
2664
2665                 ar->radar_enabled = conf->radar_enabled;
2666                 ath10k_recalc_radar_detection(ar);
2667
2668                 if (!cfg80211_chandef_identical(&ar->chandef, &conf->chandef)) {
2669                         ar->chandef = conf->chandef;
2670                         ath10k_config_chan(ar);
2671                 }
2672         }
2673
2674         if (changed & IEEE80211_CONF_CHANGE_POWER) {
2675                 ath10k_dbg(ATH10K_DBG_MAC, "mac config power %d\n",
2676                            hw->conf.power_level);
2677
2678                 param = ar->wmi.pdev_param->txpower_limit2g;
2679                 ret = ath10k_wmi_pdev_set_param(ar, param,
2680                                                 hw->conf.power_level * 2);
2681                 if (ret)
2682                         ath10k_warn("failed to set 2g txpower %d: %d\n",
2683                                     hw->conf.power_level, ret);
2684
2685                 param = ar->wmi.pdev_param->txpower_limit5g;
2686                 ret = ath10k_wmi_pdev_set_param(ar, param,
2687                                                 hw->conf.power_level * 2);
2688                 if (ret)
2689                         ath10k_warn("failed to set 5g txpower %d: %d\n",
2690                                     hw->conf.power_level, ret);
2691         }
2692
2693         if (changed & IEEE80211_CONF_CHANGE_PS)
2694                 ath10k_config_ps(ar);
2695
2696         if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
2697                 if (conf->flags & IEEE80211_CONF_MONITOR && !ar->monitor) {
2698                         ar->monitor = true;
2699                         ret = ath10k_monitor_start(ar);
2700                         if (ret) {
2701                                 ath10k_warn("failed to start monitor (config): %d\n",
2702                                             ret);
2703                                 ar->monitor = false;
2704                         }
2705                 } else if (!(conf->flags & IEEE80211_CONF_MONITOR) &&
2706                            ar->monitor) {
2707                         ar->monitor = false;
2708                         ath10k_monitor_stop(ar);
2709                 }
2710         }
2711
2712         mutex_unlock(&ar->conf_mutex);
2713         return ret;
2714 }
2715
2716 /*
2717  * TODO:
2718  * Figure out how to handle WMI_VDEV_SUBTYPE_P2P_DEVICE,
2719  * because we will send mgmt frames without CCK. This requirement
2720  * for P2P_FIND/GO_NEG should be handled by checking CCK flag
2721  * in the TX packet.
2722  */
2723 static int ath10k_add_interface(struct ieee80211_hw *hw,
2724                                 struct ieee80211_vif *vif)
2725 {
2726         struct ath10k *ar = hw->priv;
2727         struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2728         enum wmi_sta_powersave_param param;
2729         int ret = 0;
2730         u32 value;
2731         int bit;
2732         u32 vdev_param;
2733
2734         mutex_lock(&ar->conf_mutex);
2735
2736         memset(arvif, 0, sizeof(*arvif));
2737
2738         arvif->ar = ar;
2739         arvif->vif = vif;
2740
2741         INIT_WORK(&arvif->wep_key_work, ath10k_tx_wep_key_work);
2742         INIT_LIST_HEAD(&arvif->list);
2743
2744         bit = ffs(ar->free_vdev_map);
2745         if (bit == 0) {
2746                 ret = -EBUSY;
2747                 goto err;
2748         }
2749
2750         arvif->vdev_id = bit - 1;
2751         arvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE;
2752
2753         if (ar->p2p)
2754                 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_DEVICE;
2755
2756         switch (vif->type) {
2757         case NL80211_IFTYPE_UNSPECIFIED:
2758         case NL80211_IFTYPE_STATION:
2759                 arvif->vdev_type = WMI_VDEV_TYPE_STA;
2760                 if (vif->p2p)
2761                         arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_CLIENT;
2762                 break;
2763         case NL80211_IFTYPE_ADHOC:
2764                 arvif->vdev_type = WMI_VDEV_TYPE_IBSS;
2765                 break;
2766         case NL80211_IFTYPE_AP:
2767                 arvif->vdev_type = WMI_VDEV_TYPE_AP;
2768
2769                 if (vif->p2p)
2770                         arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_GO;
2771                 break;
2772         case NL80211_IFTYPE_MONITOR:
2773                 arvif->vdev_type = WMI_VDEV_TYPE_MONITOR;
2774                 break;
2775         default:
2776                 WARN_ON(1);
2777                 break;
2778         }
2779
2780         ath10k_dbg(ATH10K_DBG_MAC, "mac vdev create %d (add interface) type %d subtype %d\n",
2781                    arvif->vdev_id, arvif->vdev_type, arvif->vdev_subtype);
2782
2783         ret = ath10k_wmi_vdev_create(ar, arvif->vdev_id, arvif->vdev_type,
2784                                      arvif->vdev_subtype, vif->addr);
2785         if (ret) {
2786                 ath10k_warn("failed to create WMI vdev %i: %d\n",
2787                             arvif->vdev_id, ret);
2788                 goto err;
2789         }
2790
2791         ar->free_vdev_map &= ~BIT(arvif->vdev_id);
2792         list_add(&arvif->list, &ar->arvifs);
2793
2794         vdev_param = ar->wmi.vdev_param->def_keyid;
2795         ret = ath10k_wmi_vdev_set_param(ar, 0, vdev_param,
2796                                         arvif->def_wep_key_idx);
2797         if (ret) {
2798                 ath10k_warn("failed to set vdev %i default key id: %d\n",
2799                             arvif->vdev_id, ret);
2800                 goto err_vdev_delete;
2801         }
2802
2803         vdev_param = ar->wmi.vdev_param->tx_encap_type;
2804         ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
2805                                         ATH10K_HW_TXRX_NATIVE_WIFI);
2806         /* 10.X firmware does not support this VDEV parameter. Do not warn */
2807         if (ret && ret != -EOPNOTSUPP) {
2808                 ath10k_warn("failed to set vdev %i TX encapsulation: %d\n",
2809                             arvif->vdev_id, ret);
2810                 goto err_vdev_delete;
2811         }
2812
2813         if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
2814                 ret = ath10k_peer_create(ar, arvif->vdev_id, vif->addr);
2815                 if (ret) {
2816                         ath10k_warn("failed to create vdev %i peer for AP: %d\n",
2817                                     arvif->vdev_id, ret);
2818                         goto err_vdev_delete;
2819                 }
2820
2821                 ret = ath10k_mac_set_kickout(arvif);
2822                 if (ret) {
2823                         ath10k_warn("failed to set vdev %i kickout parameters: %d\n",
2824                                     arvif->vdev_id, ret);
2825                         goto err_peer_delete;
2826                 }
2827         }
2828
2829         if (arvif->vdev_type == WMI_VDEV_TYPE_STA) {
2830                 param = WMI_STA_PS_PARAM_RX_WAKE_POLICY;
2831                 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
2832                 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
2833                                                   param, value);
2834                 if (ret) {
2835                         ath10k_warn("failed to set vdev %i RX wake policy: %d\n",
2836                                     arvif->vdev_id, ret);
2837                         goto err_peer_delete;
2838                 }
2839
2840                 param = WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD;
2841                 value = WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS;
2842                 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
2843                                                   param, value);
2844                 if (ret) {
2845                         ath10k_warn("failed to set vdev %i TX wake thresh: %d\n",
2846                                     arvif->vdev_id, ret);
2847                         goto err_peer_delete;
2848                 }
2849
2850                 param = WMI_STA_PS_PARAM_PSPOLL_COUNT;
2851                 value = WMI_STA_PS_PSPOLL_COUNT_NO_MAX;
2852                 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
2853                                                   param, value);
2854                 if (ret) {
2855                         ath10k_warn("failed to set vdev %i PSPOLL count: %d\n",
2856                                     arvif->vdev_id, ret);
2857                         goto err_peer_delete;
2858                 }
2859         }
2860
2861         ret = ath10k_mac_set_rts(arvif, ar->hw->wiphy->rts_threshold);
2862         if (ret) {
2863                 ath10k_warn("failed to set rts threshold for vdev %d: %d\n",
2864                             arvif->vdev_id, ret);
2865                 goto err_peer_delete;
2866         }
2867
2868         ret = ath10k_mac_set_frag(arvif, ar->hw->wiphy->frag_threshold);
2869         if (ret) {
2870                 ath10k_warn("failed to set frag threshold for vdev %d: %d\n",
2871                             arvif->vdev_id, ret);
2872                 goto err_peer_delete;
2873         }
2874
2875         mutex_unlock(&ar->conf_mutex);
2876         return 0;
2877
2878 err_peer_delete:
2879         if (arvif->vdev_type == WMI_VDEV_TYPE_AP)
2880                 ath10k_wmi_peer_delete(ar, arvif->vdev_id, vif->addr);
2881
2882 err_vdev_delete:
2883         ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
2884         ar->free_vdev_map &= ~BIT(arvif->vdev_id);
2885         list_del(&arvif->list);
2886
2887 err:
2888         mutex_unlock(&ar->conf_mutex);
2889
2890         return ret;
2891 }
2892
2893 static void ath10k_remove_interface(struct ieee80211_hw *hw,
2894                                     struct ieee80211_vif *vif)
2895 {
2896         struct ath10k *ar = hw->priv;
2897         struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2898         int ret;
2899
2900         mutex_lock(&ar->conf_mutex);
2901
2902         cancel_work_sync(&arvif->wep_key_work);
2903
2904         spin_lock_bh(&ar->data_lock);
2905         if (arvif->beacon) {
2906                 dma_unmap_single(arvif->ar->dev,
2907                                  ATH10K_SKB_CB(arvif->beacon)->paddr,
2908                                  arvif->beacon->len, DMA_TO_DEVICE);
2909                 dev_kfree_skb_any(arvif->beacon);
2910                 arvif->beacon = NULL;
2911         }
2912         spin_unlock_bh(&ar->data_lock);
2913
2914         ar->free_vdev_map |= 1 << (arvif->vdev_id);
2915         list_del(&arvif->list);
2916
2917         if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
2918                 ret = ath10k_peer_delete(arvif->ar, arvif->vdev_id, vif->addr);
2919                 if (ret)
2920                         ath10k_warn("failed to remove peer for AP vdev %i: %d\n",
2921                                     arvif->vdev_id, ret);
2922
2923                 kfree(arvif->u.ap.noa_data);
2924         }
2925
2926         ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %i delete (remove interface)\n",
2927                    arvif->vdev_id);
2928
2929         ret = ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
2930         if (ret)
2931                 ath10k_warn("failed to delete WMI vdev %i: %d\n",
2932                             arvif->vdev_id, ret);
2933
2934         ath10k_peer_cleanup(ar, arvif->vdev_id);
2935
2936         mutex_unlock(&ar->conf_mutex);
2937 }
2938
2939 /*
2940  * FIXME: Has to be verified.
2941  */
2942 #define SUPPORTED_FILTERS                       \
2943         (FIF_PROMISC_IN_BSS |                   \
2944         FIF_ALLMULTI |                          \
2945         FIF_CONTROL |                           \
2946         FIF_PSPOLL |                            \
2947         FIF_OTHER_BSS |                         \
2948         FIF_BCN_PRBRESP_PROMISC |               \
2949         FIF_PROBE_REQ |                         \
2950         FIF_FCSFAIL)
2951
2952 static void ath10k_configure_filter(struct ieee80211_hw *hw,
2953                                     unsigned int changed_flags,
2954                                     unsigned int *total_flags,
2955                                     u64 multicast)
2956 {
2957         struct ath10k *ar = hw->priv;
2958         int ret;
2959
2960         mutex_lock(&ar->conf_mutex);
2961
2962         changed_flags &= SUPPORTED_FILTERS;
2963         *total_flags &= SUPPORTED_FILTERS;
2964         ar->filter_flags = *total_flags;
2965
2966         if (ar->filter_flags & FIF_PROMISC_IN_BSS && !ar->promisc) {
2967                 ar->promisc = true;
2968                 ret = ath10k_monitor_start(ar);
2969                 if (ret) {
2970                         ath10k_warn("failed to start monitor (promisc): %d\n",
2971                                     ret);
2972                         ar->promisc = false;
2973                 }
2974         } else if (!(ar->filter_flags & FIF_PROMISC_IN_BSS) && ar->promisc) {
2975                 ar->promisc = false;
2976                 ath10k_monitor_stop(ar);
2977         }
2978
2979         mutex_unlock(&ar->conf_mutex);
2980 }
2981
2982 static void ath10k_bss_info_changed(struct ieee80211_hw *hw,
2983                                     struct ieee80211_vif *vif,
2984                                     struct ieee80211_bss_conf *info,
2985                                     u32 changed)
2986 {
2987         struct ath10k *ar = hw->priv;
2988         struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2989         int ret = 0;
2990         u32 vdev_param, pdev_param;
2991
2992         mutex_lock(&ar->conf_mutex);
2993
2994         if (changed & BSS_CHANGED_IBSS)
2995                 ath10k_control_ibss(arvif, info, vif->addr);
2996
2997         if (changed & BSS_CHANGED_BEACON_INT) {
2998                 arvif->beacon_interval = info->beacon_int;
2999                 vdev_param = ar->wmi.vdev_param->beacon_interval;
3000                 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
3001                                                 arvif->beacon_interval);
3002                 ath10k_dbg(ATH10K_DBG_MAC,
3003                            "mac vdev %d beacon_interval %d\n",
3004                            arvif->vdev_id, arvif->beacon_interval);
3005
3006                 if (ret)
3007                         ath10k_warn("failed to set beacon interval for vdev %d: %i\n",
3008                                     arvif->vdev_id, ret);
3009         }
3010
3011         if (changed & BSS_CHANGED_BEACON) {
3012                 ath10k_dbg(ATH10K_DBG_MAC,
3013                            "vdev %d set beacon tx mode to staggered\n",
3014                            arvif->vdev_id);
3015
3016                 pdev_param = ar->wmi.pdev_param->beacon_tx_mode;
3017                 ret = ath10k_wmi_pdev_set_param(ar, pdev_param,
3018                                                 WMI_BEACON_STAGGERED_MODE);
3019                 if (ret)
3020                         ath10k_warn("failed to set beacon mode for vdev %d: %i\n",
3021                                     arvif->vdev_id, ret);
3022         }
3023
3024         if (changed & BSS_CHANGED_BEACON_INFO) {
3025                 arvif->dtim_period = info->dtim_period;
3026
3027                 ath10k_dbg(ATH10K_DBG_MAC,
3028                            "mac vdev %d dtim_period %d\n",
3029                            arvif->vdev_id, arvif->dtim_period);
3030
3031                 vdev_param = ar->wmi.vdev_param->dtim_period;
3032                 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
3033                                                 arvif->dtim_period);
3034                 if (ret)
3035                         ath10k_warn("failed to set dtim period for vdev %d: %i\n",
3036                                     arvif->vdev_id, ret);
3037         }
3038
3039         if (changed & BSS_CHANGED_SSID &&
3040             vif->type == NL80211_IFTYPE_AP) {
3041                 arvif->u.ap.ssid_len = info->ssid_len;
3042                 if (info->ssid_len)
3043                         memcpy(arvif->u.ap.ssid, info->ssid, info->ssid_len);
3044                 arvif->u.ap.hidden_ssid = info->hidden_ssid;
3045         }
3046
3047         /*
3048          * Firmware manages AP self-peer internally so make sure to not create
3049          * it in driver. Otherwise AP self-peer deletion may timeout later.
3050          */
3051         if (changed & BSS_CHANGED_BSSID &&
3052             vif->type != NL80211_IFTYPE_AP) {
3053                 if (!is_zero_ether_addr(info->bssid)) {
3054                         ath10k_dbg(ATH10K_DBG_MAC,
3055                                    "mac vdev %d create peer %pM\n",
3056                                    arvif->vdev_id, info->bssid);
3057
3058                         ret = ath10k_peer_create(ar, arvif->vdev_id,
3059                                                  info->bssid);
3060                         if (ret)
3061                                 ath10k_warn("failed to add peer %pM for vdev %d when changing bssid: %i\n",
3062                                             info->bssid, arvif->vdev_id, ret);
3063
3064                         if (vif->type == NL80211_IFTYPE_STATION) {
3065                                 /*
3066                                  * this is never erased as we it for crypto key
3067                                  * clearing; this is FW requirement
3068                                  */
3069                                 memcpy(arvif->bssid, info->bssid, ETH_ALEN);
3070
3071                                 ath10k_dbg(ATH10K_DBG_MAC,
3072                                            "mac vdev %d start %pM\n",
3073                                            arvif->vdev_id, info->bssid);
3074
3075                                 ret = ath10k_vdev_start(arvif);
3076                                 if (ret) {
3077                                         ath10k_warn("failed to start vdev %i: %d\n",
3078                                                     arvif->vdev_id, ret);
3079                                         goto exit;
3080                                 }
3081
3082                                 arvif->is_started = true;
3083                         }
3084
3085                         /*
3086                          * Mac80211 does not keep IBSS bssid when leaving IBSS,
3087                          * so driver need to store it. It is needed when leaving
3088                          * IBSS in order to remove BSSID peer.
3089                          */
3090                         if (vif->type == NL80211_IFTYPE_ADHOC)
3091                                 memcpy(arvif->bssid, info->bssid,
3092                                        ETH_ALEN);
3093                 }
3094         }
3095
3096         if (changed & BSS_CHANGED_BEACON_ENABLED)
3097                 ath10k_control_beaconing(arvif, info);
3098
3099         if (changed & BSS_CHANGED_ERP_CTS_PROT) {
3100                 arvif->use_cts_prot = info->use_cts_prot;
3101                 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d cts_prot %d\n",
3102                            arvif->vdev_id, info->use_cts_prot);
3103
3104                 ret = ath10k_recalc_rtscts_prot(arvif);
3105                 if (ret)
3106                         ath10k_warn("failed to recalculate rts/cts prot for vdev %d: %d\n",
3107                                     arvif->vdev_id, ret);
3108         }
3109
3110         if (changed & BSS_CHANGED_ERP_SLOT) {
3111                 u32 slottime;
3112                 if (info->use_short_slot)
3113                         slottime = WMI_VDEV_SLOT_TIME_SHORT; /* 9us */
3114
3115                 else
3116                         slottime = WMI_VDEV_SLOT_TIME_LONG; /* 20us */
3117
3118                 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d slot_time %d\n",
3119                            arvif->vdev_id, slottime);
3120
3121                 vdev_param = ar->wmi.vdev_param->slot_time;
3122                 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
3123                                                 slottime);
3124                 if (ret)
3125                         ath10k_warn("failed to set erp slot for vdev %d: %i\n",
3126                                     arvif->vdev_id, ret);
3127         }
3128
3129         if (changed & BSS_CHANGED_ERP_PREAMBLE) {
3130                 u32 preamble;
3131                 if (info->use_short_preamble)
3132                         preamble = WMI_VDEV_PREAMBLE_SHORT;
3133                 else
3134                         preamble = WMI_VDEV_PREAMBLE_LONG;
3135
3136                 ath10k_dbg(ATH10K_DBG_MAC,
3137                            "mac vdev %d preamble %dn",
3138                            arvif->vdev_id, preamble);
3139
3140                 vdev_param = ar->wmi.vdev_param->preamble;
3141                 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
3142                                                 preamble);
3143                 if (ret)
3144                         ath10k_warn("failed to set preamble for vdev %d: %i\n",
3145                                     arvif->vdev_id, ret);
3146         }
3147
3148         if (changed & BSS_CHANGED_ASSOC) {
3149                 if (info->assoc)
3150                         ath10k_bss_assoc(hw, vif, info);
3151         }
3152
3153 exit:
3154         mutex_unlock(&ar->conf_mutex);
3155 }
3156
3157 static int ath10k_hw_scan(struct ieee80211_hw *hw,
3158                           struct ieee80211_vif *vif,
3159                           struct ieee80211_scan_request *hw_req)
3160 {
3161         struct ath10k *ar = hw->priv;
3162         struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3163         struct cfg80211_scan_request *req = &hw_req->req;
3164         struct wmi_start_scan_arg arg;
3165         int ret = 0;
3166         int i;
3167
3168         mutex_lock(&ar->conf_mutex);
3169
3170         spin_lock_bh(&ar->data_lock);
3171         if (ar->scan.in_progress) {
3172                 spin_unlock_bh(&ar->data_lock);
3173                 ret = -EBUSY;
3174                 goto exit;
3175         }
3176
3177         reinit_completion(&ar->scan.started);
3178         reinit_completion(&ar->scan.completed);
3179         ar->scan.in_progress = true;
3180         ar->scan.aborting = false;
3181         ar->scan.is_roc = false;
3182         ar->scan.vdev_id = arvif->vdev_id;
3183         spin_unlock_bh(&ar->data_lock);
3184
3185         memset(&arg, 0, sizeof(arg));
3186         ath10k_wmi_start_scan_init(ar, &arg);
3187         arg.vdev_id = arvif->vdev_id;
3188         arg.scan_id = ATH10K_SCAN_ID;
3189
3190         if (!req->no_cck)
3191                 arg.scan_ctrl_flags |= WMI_SCAN_ADD_CCK_RATES;
3192
3193         if (req->ie_len) {
3194                 arg.ie_len = req->ie_len;
3195                 memcpy(arg.ie, req->ie, arg.ie_len);
3196         }
3197
3198         if (req->n_ssids) {
3199                 arg.n_ssids = req->n_ssids;
3200                 for (i = 0; i < arg.n_ssids; i++) {
3201                         arg.ssids[i].len  = req->ssids[i].ssid_len;
3202                         arg.ssids[i].ssid = req->ssids[i].ssid;
3203                 }
3204         } else {
3205                 arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
3206         }
3207
3208         if (req->n_channels) {
3209                 arg.n_channels = req->n_channels;
3210                 for (i = 0; i < arg.n_channels; i++)
3211                         arg.channels[i] = req->channels[i]->center_freq;
3212         }
3213
3214         ret = ath10k_start_scan(ar, &arg);
3215         if (ret) {
3216                 ath10k_warn("failed to start hw scan: %d\n", ret);
3217                 spin_lock_bh(&ar->data_lock);
3218                 ar->scan.in_progress = false;
3219                 spin_unlock_bh(&ar->data_lock);
3220         }
3221
3222 exit:
3223         mutex_unlock(&ar->conf_mutex);
3224         return ret;
3225 }
3226
3227 static void ath10k_cancel_hw_scan(struct ieee80211_hw *hw,
3228                                   struct ieee80211_vif *vif)
3229 {
3230         struct ath10k *ar = hw->priv;
3231         int ret;
3232
3233         mutex_lock(&ar->conf_mutex);
3234         ret = ath10k_abort_scan(ar);
3235         if (ret) {
3236                 ath10k_warn("failed to abort scan: %d\n", ret);
3237                 ieee80211_scan_completed(hw, 1 /* aborted */);
3238         }
3239         mutex_unlock(&ar->conf_mutex);
3240 }
3241
3242 static void ath10k_set_key_h_def_keyidx(struct ath10k *ar,
3243                                         struct ath10k_vif *arvif,
3244                                         enum set_key_cmd cmd,
3245                                         struct ieee80211_key_conf *key)
3246 {
3247         u32 vdev_param = arvif->ar->wmi.vdev_param->def_keyid;
3248         int ret;
3249
3250         /* 10.1 firmware branch requires default key index to be set to group
3251          * key index after installing it. Otherwise FW/HW Txes corrupted
3252          * frames with multi-vif APs. This is not required for main firmware
3253          * branch (e.g. 636).
3254          *
3255          * FIXME: This has been tested only in AP. It remains unknown if this
3256          * is required for multi-vif STA interfaces on 10.1 */
3257
3258         if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
3259                 return;
3260
3261         if (key->cipher == WLAN_CIPHER_SUITE_WEP40)
3262                 return;
3263
3264         if (key->cipher == WLAN_CIPHER_SUITE_WEP104)
3265                 return;
3266
3267         if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
3268                 return;
3269
3270         if (cmd != SET_KEY)
3271                 return;
3272
3273         ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
3274                                         key->keyidx);
3275         if (ret)
3276                 ath10k_warn("failed to set vdev %i group key as default key: %d\n",
3277                             arvif->vdev_id, ret);
3278 }
3279
3280 static int ath10k_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
3281                           struct ieee80211_vif *vif, struct ieee80211_sta *sta,
3282                           struct ieee80211_key_conf *key)
3283 {
3284         struct ath10k *ar = hw->priv;
3285         struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3286         struct ath10k_peer *peer;
3287         const u8 *peer_addr;
3288         bool is_wep = key->cipher == WLAN_CIPHER_SUITE_WEP40 ||
3289                       key->cipher == WLAN_CIPHER_SUITE_WEP104;
3290         int ret = 0;
3291
3292         if (key->keyidx > WMI_MAX_KEY_INDEX)
3293                 return -ENOSPC;
3294
3295         mutex_lock(&ar->conf_mutex);
3296
3297         if (sta)
3298                 peer_addr = sta->addr;
3299         else if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
3300                 peer_addr = vif->bss_conf.bssid;
3301         else
3302                 peer_addr = vif->addr;
3303
3304         key->hw_key_idx = key->keyidx;
3305
3306         /* the peer should not disappear in mid-way (unless FW goes awry) since
3307          * we already hold conf_mutex. we just make sure its there now. */
3308         spin_lock_bh(&ar->data_lock);
3309         peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
3310         spin_unlock_bh(&ar->data_lock);
3311
3312         if (!peer) {
3313                 if (cmd == SET_KEY) {
3314                         ath10k_warn("failed to install key for non-existent peer %pM\n",
3315                                     peer_addr);
3316                         ret = -EOPNOTSUPP;
3317                         goto exit;
3318                 } else {
3319                         /* if the peer doesn't exist there is no key to disable
3320                          * anymore */
3321                         goto exit;
3322                 }
3323         }
3324
3325         if (is_wep) {
3326                 if (cmd == SET_KEY)
3327                         arvif->wep_keys[key->keyidx] = key;
3328                 else
3329                         arvif->wep_keys[key->keyidx] = NULL;
3330
3331                 if (cmd == DISABLE_KEY)
3332                         ath10k_clear_vdev_key(arvif, key);
3333         }
3334
3335         ret = ath10k_install_key(arvif, key, cmd, peer_addr);
3336         if (ret) {
3337                 ath10k_warn("failed to install key for vdev %i peer %pM: %d\n",
3338                             arvif->vdev_id, peer_addr, ret);
3339                 goto exit;
3340         }
3341
3342         ath10k_set_key_h_def_keyidx(ar, arvif, cmd, key);
3343
3344         spin_lock_bh(&ar->data_lock);
3345         peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
3346         if (peer && cmd == SET_KEY)
3347                 peer->keys[key->keyidx] = key;
3348         else if (peer && cmd == DISABLE_KEY)
3349                 peer->keys[key->keyidx] = NULL;
3350         else if (peer == NULL)
3351                 /* impossible unless FW goes crazy */
3352                 ath10k_warn("Peer %pM disappeared!\n", peer_addr);
3353         spin_unlock_bh(&ar->data_lock);
3354
3355 exit:
3356         mutex_unlock(&ar->conf_mutex);
3357         return ret;
3358 }
3359
3360 static void ath10k_sta_rc_update_wk(struct work_struct *wk)
3361 {
3362         struct ath10k *ar;
3363         struct ath10k_vif *arvif;
3364         struct ath10k_sta *arsta;
3365         struct ieee80211_sta *sta;
3366         u32 changed, bw, nss, smps;
3367         int err;
3368
3369         arsta = container_of(wk, struct ath10k_sta, update_wk);
3370         sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv);
3371         arvif = arsta->arvif;
3372         ar = arvif->ar;
3373
3374         spin_lock_bh(&ar->data_lock);
3375
3376         changed = arsta->changed;
3377         arsta->changed = 0;
3378
3379         bw = arsta->bw;
3380         nss = arsta->nss;
3381         smps = arsta->smps;
3382
3383         spin_unlock_bh(&ar->data_lock);
3384
3385         mutex_lock(&ar->conf_mutex);
3386
3387         if (changed & IEEE80211_RC_BW_CHANGED) {
3388                 ath10k_dbg(ATH10K_DBG_MAC, "mac update sta %pM peer bw %d\n",
3389                            sta->addr, bw);
3390
3391                 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
3392                                                 WMI_PEER_CHAN_WIDTH, bw);
3393                 if (err)
3394                         ath10k_warn("failed to update STA %pM peer bw %d: %d\n",
3395                                     sta->addr, bw, err);
3396         }
3397
3398         if (changed & IEEE80211_RC_NSS_CHANGED) {
3399                 ath10k_dbg(ATH10K_DBG_MAC, "mac update sta %pM nss %d\n",
3400                            sta->addr, nss);
3401
3402                 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
3403                                                 WMI_PEER_NSS, nss);
3404                 if (err)
3405                         ath10k_warn("failed to update STA %pM nss %d: %d\n",
3406                                     sta->addr, nss, err);
3407         }
3408
3409         if (changed & IEEE80211_RC_SMPS_CHANGED) {
3410                 ath10k_dbg(ATH10K_DBG_MAC, "mac update sta %pM smps %d\n",
3411                            sta->addr, smps);
3412
3413                 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
3414                                                 WMI_PEER_SMPS_STATE, smps);
3415                 if (err)
3416                         ath10k_warn("failed to update STA %pM smps %d: %d\n",
3417                                     sta->addr, smps, err);
3418         }
3419
3420         if (changed & IEEE80211_RC_SUPP_RATES_CHANGED) {
3421                 ath10k_dbg(ATH10K_DBG_MAC, "mac update sta %pM supp rates\n",
3422                            sta->addr);
3423
3424                 err = ath10k_station_assoc(ar, arvif, sta, true);
3425                 if (err)
3426                         ath10k_warn("failed to reassociate station: %pM\n",
3427                                     sta->addr);
3428         }
3429
3430         mutex_unlock(&ar->conf_mutex);
3431 }
3432
3433 static int ath10k_sta_state(struct ieee80211_hw *hw,
3434                             struct ieee80211_vif *vif,
3435                             struct ieee80211_sta *sta,
3436                             enum ieee80211_sta_state old_state,
3437                             enum ieee80211_sta_state new_state)
3438 {
3439         struct ath10k *ar = hw->priv;
3440         struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3441         struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
3442         int max_num_peers;
3443         int ret = 0;
3444
3445         if (old_state == IEEE80211_STA_NOTEXIST &&
3446             new_state == IEEE80211_STA_NONE) {
3447                 memset(arsta, 0, sizeof(*arsta));
3448                 arsta->arvif = arvif;
3449                 INIT_WORK(&arsta->update_wk, ath10k_sta_rc_update_wk);
3450         }
3451
3452         /* cancel must be done outside the mutex to avoid deadlock */
3453         if ((old_state == IEEE80211_STA_NONE &&
3454              new_state == IEEE80211_STA_NOTEXIST))
3455                 cancel_work_sync(&arsta->update_wk);
3456
3457         mutex_lock(&ar->conf_mutex);
3458
3459         if (old_state == IEEE80211_STA_NOTEXIST &&
3460             new_state == IEEE80211_STA_NONE &&
3461             vif->type != NL80211_IFTYPE_STATION) {
3462                 /*
3463                  * New station addition.
3464                  */
3465                 if (test_bit(ATH10K_FW_FEATURE_WMI_10X, ar->fw_features))
3466                         max_num_peers = TARGET_10X_NUM_PEERS_MAX - 1;
3467                 else
3468                         max_num_peers = TARGET_NUM_PEERS;
3469
3470                 if (ar->num_peers >= max_num_peers) {
3471                         ath10k_warn("number of peers exceeded: peers number %d (max peers %d)\n",
3472                                     ar->num_peers, max_num_peers);
3473                         ret = -ENOBUFS;
3474                         goto exit;
3475                 }
3476
3477                 ath10k_dbg(ATH10K_DBG_MAC,
3478                            "mac vdev %d peer create %pM (new sta) num_peers %d\n",
3479                            arvif->vdev_id, sta->addr, ar->num_peers);
3480
3481                 ret = ath10k_peer_create(ar, arvif->vdev_id, sta->addr);
3482                 if (ret)
3483                         ath10k_warn("failed to add peer %pM for vdev %d when adding a new sta: %i\n",
3484                                     sta->addr, arvif->vdev_id, ret);
3485         } else if ((old_state == IEEE80211_STA_NONE &&
3486                     new_state == IEEE80211_STA_NOTEXIST)) {
3487                 /*
3488                  * Existing station deletion.
3489                  */
3490                 ath10k_dbg(ATH10K_DBG_MAC,
3491                            "mac vdev %d peer delete %pM (sta gone)\n",
3492                            arvif->vdev_id, sta->addr);
3493                 ret = ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
3494                 if (ret)
3495                         ath10k_warn("failed to delete peer %pM for vdev %d: %i\n",
3496                                     sta->addr, arvif->vdev_id, ret);
3497
3498                 if (vif->type == NL80211_IFTYPE_STATION)
3499                         ath10k_bss_disassoc(hw, vif);
3500         } else if (old_state == IEEE80211_STA_AUTH &&
3501                    new_state == IEEE80211_STA_ASSOC &&
3502                    (vif->type == NL80211_IFTYPE_AP ||
3503                     vif->type == NL80211_IFTYPE_ADHOC)) {
3504                 /*
3505                  * New association.
3506                  */
3507                 ath10k_dbg(ATH10K_DBG_MAC, "mac sta %pM associated\n",
3508                            sta->addr);
3509
3510                 ret = ath10k_station_assoc(ar, arvif, sta, false);
3511                 if (ret)
3512                         ath10k_warn("failed to associate station %pM for vdev %i: %i\n",
3513                                     sta->addr, arvif->vdev_id, ret);
3514         } else if (old_state == IEEE80211_STA_ASSOC &&
3515                    new_state == IEEE80211_STA_AUTH &&
3516                    (vif->type == NL80211_IFTYPE_AP ||
3517                     vif->type == NL80211_IFTYPE_ADHOC)) {
3518                 /*
3519                  * Disassociation.
3520                  */
3521                 ath10k_dbg(ATH10K_DBG_MAC, "mac sta %pM disassociated\n",
3522                            sta->addr);
3523
3524                 ret = ath10k_station_disassoc(ar, arvif, sta);
3525                 if (ret)
3526                         ath10k_warn("failed to disassociate station: %pM vdev %i: %i\n",
3527                                     sta->addr, arvif->vdev_id, ret);
3528         }
3529 exit:
3530         mutex_unlock(&ar->conf_mutex);
3531         return ret;
3532 }
3533
3534 static int ath10k_conf_tx_uapsd(struct ath10k *ar, struct ieee80211_vif *vif,
3535                                  u16 ac, bool enable)
3536 {
3537         struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3538         u32 value = 0;
3539         int ret = 0;
3540
3541         lockdep_assert_held(&ar->conf_mutex);
3542
3543         if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
3544                 return 0;
3545
3546         switch (ac) {
3547         case IEEE80211_AC_VO:
3548                 value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN |
3549                         WMI_STA_PS_UAPSD_AC3_TRIGGER_EN;
3550                 break;
3551         case IEEE80211_AC_VI:
3552                 value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN |
3553                         WMI_STA_PS_UAPSD_AC2_TRIGGER_EN;
3554                 break;
3555         case IEEE80211_AC_BE:
3556                 value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN |
3557                         WMI_STA_PS_UAPSD_AC1_TRIGGER_EN;
3558                 break;
3559         case IEEE80211_AC_BK:
3560                 value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN |
3561                         WMI_STA_PS_UAPSD_AC0_TRIGGER_EN;
3562                 break;
3563         }
3564
3565         if (enable)
3566                 arvif->u.sta.uapsd |= value;
3567         else
3568                 arvif->u.sta.uapsd &= ~value;
3569
3570         ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
3571                                           WMI_STA_PS_PARAM_UAPSD,
3572                                           arvif->u.sta.uapsd);
3573         if (ret) {
3574                 ath10k_warn("failed to set uapsd params: %d\n", ret);
3575                 goto exit;
3576         }
3577
3578         if (arvif->u.sta.uapsd)
3579                 value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD;
3580         else
3581                 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
3582
3583         ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
3584                                           WMI_STA_PS_PARAM_RX_WAKE_POLICY,
3585                                           value);
3586         if (ret)
3587                 ath10k_warn("failed to set rx wake param: %d\n", ret);
3588
3589 exit:
3590         return ret;
3591 }
3592
3593 static int ath10k_conf_tx(struct ieee80211_hw *hw,
3594                           struct ieee80211_vif *vif, u16 ac,
3595                           const struct ieee80211_tx_queue_params *params)
3596 {
3597         struct ath10k *ar = hw->priv;
3598         struct wmi_wmm_params_arg *p = NULL;
3599         int ret;
3600
3601         mutex_lock(&ar->conf_mutex);
3602
3603         switch (ac) {
3604         case IEEE80211_AC_VO:
3605                 p = &ar->wmm_params.ac_vo;
3606                 break;
3607         case IEEE80211_AC_VI:
3608                 p = &ar->wmm_params.ac_vi;
3609                 break;
3610         case IEEE80211_AC_BE:
3611                 p = &ar->wmm_params.ac_be;
3612                 break;
3613         case IEEE80211_AC_BK:
3614                 p = &ar->wmm_params.ac_bk;
3615                 break;
3616         }
3617
3618         if (WARN_ON(!p)) {
3619                 ret = -EINVAL;
3620                 goto exit;
3621         }
3622
3623         p->cwmin = params->cw_min;
3624         p->cwmax = params->cw_max;
3625         p->aifs = params->aifs;
3626
3627         /*
3628          * The channel time duration programmed in the HW is in absolute
3629          * microseconds, while mac80211 gives the txop in units of
3630          * 32 microseconds.
3631          */
3632         p->txop = params->txop * 32;
3633
3634         /* FIXME: FW accepts wmm params per hw, not per vif */
3635         ret = ath10k_wmi_pdev_set_wmm_params(ar, &ar->wmm_params);
3636         if (ret) {
3637                 ath10k_warn("failed to set wmm params: %d\n", ret);
3638                 goto exit;
3639         }
3640
3641         ret = ath10k_conf_tx_uapsd(ar, vif, ac, params->uapsd);
3642         if (ret)
3643                 ath10k_warn("failed to set sta uapsd: %d\n", ret);
3644
3645 exit:
3646         mutex_unlock(&ar->conf_mutex);
3647         return ret;
3648 }
3649
3650 #define ATH10K_ROC_TIMEOUT_HZ (2*HZ)
3651
3652 static int ath10k_remain_on_channel(struct ieee80211_hw *hw,
3653                                     struct ieee80211_vif *vif,
3654                                     struct ieee80211_channel *chan,
3655                                     int duration,
3656                                     enum ieee80211_roc_type type)
3657 {
3658         struct ath10k *ar = hw->priv;
3659         struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3660         struct wmi_start_scan_arg arg;
3661         int ret;
3662
3663         mutex_lock(&ar->conf_mutex);
3664
3665         spin_lock_bh(&ar->data_lock);
3666         if (ar->scan.in_progress) {
3667                 spin_unlock_bh(&ar->data_lock);
3668                 ret = -EBUSY;
3669                 goto exit;
3670         }
3671
3672         reinit_completion(&ar->scan.started);
3673         reinit_completion(&ar->scan.completed);
3674         reinit_completion(&ar->scan.on_channel);
3675         ar->scan.in_progress = true;
3676         ar->scan.aborting = false;
3677         ar->scan.is_roc = true;
3678         ar->scan.vdev_id = arvif->vdev_id;
3679         ar->scan.roc_freq = chan->center_freq;
3680         spin_unlock_bh(&ar->data_lock);
3681
3682         memset(&arg, 0, sizeof(arg));
3683         ath10k_wmi_start_scan_init(ar, &arg);
3684         arg.vdev_id = arvif->vdev_id;
3685         arg.scan_id = ATH10K_SCAN_ID;
3686         arg.n_channels = 1;
3687         arg.channels[0] = chan->center_freq;
3688         arg.dwell_time_active = duration;
3689         arg.dwell_time_passive = duration;
3690         arg.max_scan_time = 2 * duration;
3691         arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
3692         arg.scan_ctrl_flags |= WMI_SCAN_FILTER_PROBE_REQ;
3693
3694         ret = ath10k_start_scan(ar, &arg);
3695         if (ret) {
3696                 ath10k_warn("failed to start roc scan: %d\n", ret);
3697                 spin_lock_bh(&ar->data_lock);
3698                 ar->scan.in_progress = false;
3699                 spin_unlock_bh(&ar->data_lock);
3700                 goto exit;
3701         }
3702
3703         ret = wait_for_completion_timeout(&ar->scan.on_channel, 3*HZ);
3704         if (ret == 0) {
3705                 ath10k_warn("failed to switch to channel for roc scan\n");
3706                 ath10k_abort_scan(ar);
3707                 ret = -ETIMEDOUT;
3708                 goto exit;
3709         }
3710
3711         ret = 0;
3712 exit:
3713         mutex_unlock(&ar->conf_mutex);
3714         return ret;
3715 }
3716
3717 static int ath10k_cancel_remain_on_channel(struct ieee80211_hw *hw)
3718 {
3719         struct ath10k *ar = hw->priv;
3720
3721         mutex_lock(&ar->conf_mutex);
3722         ath10k_abort_scan(ar);
3723         mutex_unlock(&ar->conf_mutex);
3724
3725         return 0;
3726 }
3727
3728 /*
3729  * Both RTS and Fragmentation threshold are interface-specific
3730  * in ath10k, but device-specific in mac80211.
3731  */
3732
3733 static int ath10k_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
3734 {
3735         struct ath10k *ar = hw->priv;
3736         struct ath10k_vif *arvif;
3737         int ret = 0;
3738
3739         mutex_lock(&ar->conf_mutex);
3740         list_for_each_entry(arvif, &ar->arvifs, list) {
3741                 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d rts threshold %d\n",
3742                            arvif->vdev_id, value);
3743
3744                 ret = ath10k_mac_set_rts(arvif, value);
3745                 if (ret) {
3746                         ath10k_warn("failed to set rts threshold for vdev %d: %d\n",
3747                                     arvif->vdev_id, ret);
3748                         break;
3749                 }
3750         }
3751         mutex_unlock(&ar->conf_mutex);
3752
3753         return ret;
3754 }
3755
3756 static int ath10k_set_frag_threshold(struct ieee80211_hw *hw, u32 value)
3757 {
3758         struct ath10k *ar = hw->priv;
3759         struct ath10k_vif *arvif;
3760         int ret = 0;
3761
3762         mutex_lock(&ar->conf_mutex);
3763         list_for_each_entry(arvif, &ar->arvifs, list) {
3764                 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d fragmentation threshold %d\n",
3765                            arvif->vdev_id, value);
3766
3767                 ret = ath10k_mac_set_rts(arvif, value);
3768                 if (ret) {
3769                         ath10k_warn("failed to set fragmentation threshold for vdev %d: %d\n",
3770                                     arvif->vdev_id, ret);
3771                         break;
3772                 }
3773         }
3774         mutex_unlock(&ar->conf_mutex);
3775
3776         return ret;
3777 }
3778
3779 static void ath10k_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
3780                          u32 queues, bool drop)
3781 {
3782         struct ath10k *ar = hw->priv;
3783         bool skip;
3784         int ret;
3785
3786         /* mac80211 doesn't care if we really xmit queued frames or not
3787          * we'll collect those frames either way if we stop/delete vdevs */
3788         if (drop)
3789                 return;
3790
3791         mutex_lock(&ar->conf_mutex);
3792
3793         if (ar->state == ATH10K_STATE_WEDGED)
3794                 goto skip;
3795
3796         ret = wait_event_timeout(ar->htt.empty_tx_wq, ({
3797                         bool empty;
3798
3799                         spin_lock_bh(&ar->htt.tx_lock);
3800                         empty = (ar->htt.num_pending_tx == 0);
3801                         spin_unlock_bh(&ar->htt.tx_lock);
3802
3803                         skip = (ar->state == ATH10K_STATE_WEDGED);
3804
3805                         (empty || skip);
3806                 }), ATH10K_FLUSH_TIMEOUT_HZ);
3807
3808         if (ret <= 0 || skip)
3809                 ath10k_warn("failed to flush transmit queue (skip %i ar-state %i): %i\n",
3810                             skip, ar->state, ret);
3811
3812 skip:
3813         mutex_unlock(&ar->conf_mutex);
3814 }
3815
3816 /* TODO: Implement this function properly
3817  * For now it is needed to reply to Probe Requests in IBSS mode.
3818  * Propably we need this information from FW.
3819  */
3820 static int ath10k_tx_last_beacon(struct ieee80211_hw *hw)
3821 {
3822         return 1;
3823 }
3824
3825 #ifdef CONFIG_PM
3826 static int ath10k_suspend(struct ieee80211_hw *hw,
3827                           struct cfg80211_wowlan *wowlan)
3828 {
3829         struct ath10k *ar = hw->priv;
3830         int ret;
3831
3832         mutex_lock(&ar->conf_mutex);
3833
3834         ret = ath10k_wait_for_suspend(ar, WMI_PDEV_SUSPEND);
3835         if (ret) {
3836                 if (ret == -ETIMEDOUT)
3837                         goto resume;
3838                 ret = 1;
3839                 goto exit;
3840         }
3841
3842         ret = ath10k_hif_suspend(ar);
3843         if (ret) {
3844                 ath10k_warn("failed to suspend hif: %d\n", ret);
3845                 goto resume;
3846         }
3847
3848         ret = 0;
3849         goto exit;
3850 resume:
3851         ret = ath10k_wmi_pdev_resume_target(ar);
3852         if (ret)
3853                 ath10k_warn("failed to resume target: %d\n", ret);
3854
3855         ret = 1;
3856 exit:
3857         mutex_unlock(&ar->conf_mutex);
3858         return ret;
3859 }
3860
3861 static int ath10k_resume(struct ieee80211_hw *hw)
3862 {
3863         struct ath10k *ar = hw->priv;
3864         int ret;
3865
3866         mutex_lock(&ar->conf_mutex);
3867
3868         ret = ath10k_hif_resume(ar);
3869         if (ret) {
3870                 ath10k_warn("failed to resume hif: %d\n", ret);
3871                 ret = 1;
3872                 goto exit;
3873         }
3874
3875         ret = ath10k_wmi_pdev_resume_target(ar);
3876         if (ret) {
3877                 ath10k_warn("failed to resume target: %d\n", ret);
3878                 ret = 1;
3879                 goto exit;
3880         }
3881
3882         ret = 0;
3883 exit:
3884         mutex_unlock(&ar->conf_mutex);
3885         return ret;
3886 }
3887 #endif
3888
3889 static void ath10k_restart_complete(struct ieee80211_hw *hw)
3890 {
3891         struct ath10k *ar = hw->priv;
3892
3893         mutex_lock(&ar->conf_mutex);
3894
3895         /* If device failed to restart it will be in a different state, e.g.
3896          * ATH10K_STATE_WEDGED */
3897         if (ar->state == ATH10K_STATE_RESTARTED) {
3898                 ath10k_info("device successfully recovered\n");
3899                 ar->state = ATH10K_STATE_ON;
3900         }
3901
3902         mutex_unlock(&ar->conf_mutex);
3903 }
3904
3905 static int ath10k_get_survey(struct ieee80211_hw *hw, int idx,
3906                              struct survey_info *survey)
3907 {
3908         struct ath10k *ar = hw->priv;
3909         struct ieee80211_supported_band *sband;
3910         struct survey_info *ar_survey = &ar->survey[idx];
3911         int ret = 0;
3912
3913         mutex_lock(&ar->conf_mutex);
3914
3915         sband = hw->wiphy->bands[IEEE80211_BAND_2GHZ];
3916         if (sband && idx >= sband->n_channels) {
3917                 idx -= sband->n_channels;
3918                 sband = NULL;
3919         }
3920
3921         if (!sband)
3922                 sband = hw->wiphy->bands[IEEE80211_BAND_5GHZ];
3923
3924         if (!sband || idx >= sband->n_channels) {
3925                 ret = -ENOENT;
3926                 goto exit;
3927         }
3928
3929         spin_lock_bh(&ar->data_lock);
3930         memcpy(survey, ar_survey, sizeof(*survey));
3931         spin_unlock_bh(&ar->data_lock);
3932
3933         survey->channel = &sband->channels[idx];
3934
3935 exit:
3936         mutex_unlock(&ar->conf_mutex);
3937         return ret;
3938 }
3939
3940 /* Helper table for legacy fixed_rate/bitrate_mask */
3941 static const u8 cck_ofdm_rate[] = {
3942         /* CCK */
3943         3, /* 1Mbps */
3944         2, /* 2Mbps */
3945         1, /* 5.5Mbps */
3946         0, /* 11Mbps */
3947         /* OFDM */
3948         3, /* 6Mbps */
3949         7, /* 9Mbps */
3950         2, /* 12Mbps */
3951         6, /* 18Mbps */
3952         1, /* 24Mbps */
3953         5, /* 36Mbps */
3954         0, /* 48Mbps */
3955         4, /* 54Mbps */
3956 };
3957
3958 /* Check if only one bit set */
3959 static int ath10k_check_single_mask(u32 mask)
3960 {
3961         int bit;
3962
3963         bit = ffs(mask);
3964         if (!bit)
3965                 return 0;
3966
3967         mask &= ~BIT(bit - 1);
3968         if (mask)
3969                 return 2;
3970
3971         return 1;
3972 }
3973
3974 static bool
3975 ath10k_default_bitrate_mask(struct ath10k *ar,
3976                             enum ieee80211_band band,
3977                             const struct cfg80211_bitrate_mask *mask)
3978 {
3979         u32 legacy = 0x00ff;
3980         u8 ht = 0xff, i;
3981         u16 vht = 0x3ff;
3982
3983         switch (band) {
3984         case IEEE80211_BAND_2GHZ:
3985                 legacy = 0x00fff;
3986                 vht = 0;
3987                 break;
3988         case IEEE80211_BAND_5GHZ:
3989                 break;
3990         default:
3991                 return false;
3992         }
3993
3994         if (mask->control[band].legacy != legacy)
3995                 return false;
3996
3997         for (i = 0; i < ar->num_rf_chains; i++)
3998                 if (mask->control[band].ht_mcs[i] != ht)
3999                         return false;
4000
4001         for (i = 0; i < ar->num_rf_chains; i++)
4002                 if (mask->control[band].vht_mcs[i] != vht)
4003                         return false;
4004
4005         return true;
4006 }
4007
4008 static bool
4009 ath10k_bitrate_mask_nss(const struct cfg80211_bitrate_mask *mask,
4010                         enum ieee80211_band band,
4011                         u8 *fixed_nss)
4012 {
4013         int ht_nss = 0, vht_nss = 0, i;
4014
4015         /* check legacy */
4016         if (ath10k_check_single_mask(mask->control[band].legacy))
4017                 return false;
4018
4019         /* check HT */
4020         for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++) {
4021                 if (mask->control[band].ht_mcs[i] == 0xff)
4022                         continue;
4023                 else if (mask->control[band].ht_mcs[i] == 0x00)
4024                         break;
4025                 else
4026                         return false;
4027         }
4028
4029         ht_nss = i;
4030
4031         /* check VHT */
4032         for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
4033                 if (mask->control[band].vht_mcs[i] == 0x03ff)
4034                         continue;
4035                 else if (mask->control[band].vht_mcs[i] == 0x0000)
4036                         break;
4037                 else
4038                         return false;
4039         }
4040
4041         vht_nss = i;
4042
4043         if (ht_nss > 0 && vht_nss > 0)
4044                 return false;
4045
4046         if (ht_nss)
4047                 *fixed_nss = ht_nss;
4048         else if (vht_nss)
4049                 *fixed_nss = vht_nss;
4050         else
4051                 return false;
4052
4053         return true;
4054 }
4055
4056 static bool
4057 ath10k_bitrate_mask_correct(const struct cfg80211_bitrate_mask *mask,
4058                             enum ieee80211_band band,
4059                             enum wmi_rate_preamble *preamble)
4060 {
4061         int legacy = 0, ht = 0, vht = 0, i;
4062
4063         *preamble = WMI_RATE_PREAMBLE_OFDM;
4064
4065         /* check legacy */
4066         legacy = ath10k_check_single_mask(mask->control[band].legacy);
4067         if (legacy > 1)
4068                 return false;
4069
4070         /* check HT */
4071         for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++)
4072                 ht += ath10k_check_single_mask(mask->control[band].ht_mcs[i]);
4073         if (ht > 1)
4074                 return false;
4075
4076         /* check VHT */
4077         for (i = 0; i < NL80211_VHT_NSS_MAX; i++)
4078                 vht += ath10k_check_single_mask(mask->control[band].vht_mcs[i]);
4079         if (vht > 1)
4080                 return false;
4081
4082         /* Currently we support only one fixed_rate */
4083         if ((legacy + ht + vht) != 1)
4084                 return false;
4085
4086         if (ht)
4087                 *preamble = WMI_RATE_PREAMBLE_HT;
4088         else if (vht)
4089                 *preamble = WMI_RATE_PREAMBLE_VHT;
4090
4091         return true;
4092 }
4093
4094 static bool
4095 ath10k_bitrate_mask_rate(const struct cfg80211_bitrate_mask *mask,
4096                          enum ieee80211_band band,
4097                          u8 *fixed_rate,
4098                          u8 *fixed_nss)
4099 {
4100         u8 rate = 0, pream = 0, nss = 0, i;
4101         enum wmi_rate_preamble preamble;
4102
4103         /* Check if single rate correct */
4104         if (!ath10k_bitrate_mask_correct(mask, band, &preamble))
4105                 return false;
4106
4107         pream = preamble;
4108
4109         switch (preamble) {
4110         case WMI_RATE_PREAMBLE_CCK:
4111         case WMI_RATE_PREAMBLE_OFDM:
4112                 i = ffs(mask->control[band].legacy) - 1;
4113
4114                 if (band == IEEE80211_BAND_2GHZ && i < 4)
4115                         pream = WMI_RATE_PREAMBLE_CCK;
4116
4117                 if (band == IEEE80211_BAND_5GHZ)
4118                         i += 4;
4119
4120                 if (i >= ARRAY_SIZE(cck_ofdm_rate))
4121                         return false;
4122
4123                 rate = cck_ofdm_rate[i];
4124                 break;
4125         case WMI_RATE_PREAMBLE_HT:
4126                 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++)
4127                         if (mask->control[band].ht_mcs[i])
4128                                 break;
4129
4130                 if (i == IEEE80211_HT_MCS_MASK_LEN)
4131                         return false;
4132
4133                 rate = ffs(mask->control[band].ht_mcs[i]) - 1;
4134                 nss = i;
4135                 break;
4136         case WMI_RATE_PREAMBLE_VHT:
4137                 for (i = 0; i < NL80211_VHT_NSS_MAX; i++)
4138                         if (mask->control[band].vht_mcs[i])
4139                                 break;
4140
4141                 if (i == NL80211_VHT_NSS_MAX)
4142                         return false;
4143
4144                 rate = ffs(mask->control[band].vht_mcs[i]) - 1;
4145                 nss = i;
4146                 break;
4147         }
4148
4149         *fixed_nss = nss + 1;
4150         nss <<= 4;
4151         pream <<= 6;
4152
4153         ath10k_dbg(ATH10K_DBG_MAC, "mac fixed rate pream 0x%02x nss 0x%02x rate 0x%02x\n",
4154                    pream, nss, rate);
4155
4156         *fixed_rate = pream | nss | rate;
4157
4158         return true;
4159 }
4160
4161 static bool ath10k_get_fixed_rate_nss(const struct cfg80211_bitrate_mask *mask,
4162                                       enum ieee80211_band band,
4163                                       u8 *fixed_rate,
4164                                       u8 *fixed_nss)
4165 {
4166         /* First check full NSS mask, if we can simply limit NSS */
4167         if (ath10k_bitrate_mask_nss(mask, band, fixed_nss))
4168                 return true;
4169
4170         /* Next Check single rate is set */
4171         return ath10k_bitrate_mask_rate(mask, band, fixed_rate, fixed_nss);
4172 }
4173
4174 static int ath10k_set_fixed_rate_param(struct ath10k_vif *arvif,
4175                                        u8 fixed_rate,
4176                                        u8 fixed_nss,
4177                                        u8 force_sgi)
4178 {
4179         struct ath10k *ar = arvif->ar;
4180         u32 vdev_param;
4181         int ret = 0;
4182
4183         mutex_lock(&ar->conf_mutex);
4184
4185         if (arvif->fixed_rate == fixed_rate &&
4186             arvif->fixed_nss == fixed_nss &&
4187             arvif->force_sgi == force_sgi)
4188                 goto exit;
4189
4190         if (fixed_rate == WMI_FIXED_RATE_NONE)
4191                 ath10k_dbg(ATH10K_DBG_MAC, "mac disable fixed bitrate mask\n");
4192
4193         if (force_sgi)
4194                 ath10k_dbg(ATH10K_DBG_MAC, "mac force sgi\n");
4195
4196         vdev_param = ar->wmi.vdev_param->fixed_rate;
4197         ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
4198                                         vdev_param, fixed_rate);
4199         if (ret) {
4200                 ath10k_warn("failed to set fixed rate param 0x%02x: %d\n",
4201                             fixed_rate, ret);
4202                 ret = -EINVAL;
4203                 goto exit;
4204         }
4205
4206         arvif->fixed_rate = fixed_rate;
4207
4208         vdev_param = ar->wmi.vdev_param->nss;
4209         ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
4210                                         vdev_param, fixed_nss);
4211
4212         if (ret) {
4213                 ath10k_warn("failed to set fixed nss param %d: %d\n",
4214                             fixed_nss, ret);
4215                 ret = -EINVAL;
4216                 goto exit;
4217         }
4218
4219         arvif->fixed_nss = fixed_nss;
4220
4221         vdev_param = ar->wmi.vdev_param->sgi;
4222         ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
4223                                         force_sgi);
4224
4225         if (ret) {
4226                 ath10k_warn("failed to set sgi param %d: %d\n",
4227                             force_sgi, ret);
4228                 ret = -EINVAL;
4229                 goto exit;
4230         }
4231
4232         arvif->force_sgi = force_sgi;
4233
4234 exit:
4235         mutex_unlock(&ar->conf_mutex);
4236         return ret;
4237 }
4238
4239 static int ath10k_set_bitrate_mask(struct ieee80211_hw *hw,
4240                                    struct ieee80211_vif *vif,
4241                                    const struct cfg80211_bitrate_mask *mask)
4242 {
4243         struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4244         struct ath10k *ar = arvif->ar;
4245         enum ieee80211_band band = ar->hw->conf.chandef.chan->band;
4246         u8 fixed_rate = WMI_FIXED_RATE_NONE;
4247         u8 fixed_nss = ar->num_rf_chains;
4248         u8 force_sgi;
4249
4250         force_sgi = mask->control[band].gi;
4251         if (force_sgi == NL80211_TXRATE_FORCE_LGI)
4252                 return -EINVAL;
4253
4254         if (!ath10k_default_bitrate_mask(ar, band, mask)) {
4255                 if (!ath10k_get_fixed_rate_nss(mask, band,
4256                                                &fixed_rate,
4257                                                &fixed_nss))
4258                         return -EINVAL;
4259         }
4260
4261         if (fixed_rate == WMI_FIXED_RATE_NONE && force_sgi) {
4262                 ath10k_warn("failed to force SGI usage for default rate settings\n");
4263                 return -EINVAL;
4264         }
4265
4266         return ath10k_set_fixed_rate_param(arvif, fixed_rate,
4267                                            fixed_nss, force_sgi);
4268 }
4269
4270 static void ath10k_sta_rc_update(struct ieee80211_hw *hw,
4271                                  struct ieee80211_vif *vif,
4272                                  struct ieee80211_sta *sta,
4273                                  u32 changed)
4274 {
4275         struct ath10k *ar = hw->priv;
4276         struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
4277         u32 bw, smps;
4278
4279         spin_lock_bh(&ar->data_lock);
4280
4281         ath10k_dbg(ATH10K_DBG_MAC,
4282                    "mac sta rc update for %pM changed %08x bw %d nss %d smps %d\n",
4283                    sta->addr, changed, sta->bandwidth, sta->rx_nss,
4284                    sta->smps_mode);
4285
4286         if (changed & IEEE80211_RC_BW_CHANGED) {
4287                 bw = WMI_PEER_CHWIDTH_20MHZ;
4288
4289                 switch (sta->bandwidth) {
4290                 case IEEE80211_STA_RX_BW_20:
4291                         bw = WMI_PEER_CHWIDTH_20MHZ;
4292                         break;
4293                 case IEEE80211_STA_RX_BW_40:
4294                         bw = WMI_PEER_CHWIDTH_40MHZ;
4295                         break;
4296                 case IEEE80211_STA_RX_BW_80:
4297                         bw = WMI_PEER_CHWIDTH_80MHZ;
4298                         break;
4299                 case IEEE80211_STA_RX_BW_160:
4300                         ath10k_warn("Invalid bandwith %d in rc update for %pM\n",
4301                                     sta->bandwidth, sta->addr);
4302                         bw = WMI_PEER_CHWIDTH_20MHZ;
4303                         break;
4304                 }
4305
4306                 arsta->bw = bw;
4307         }
4308
4309         if (changed & IEEE80211_RC_NSS_CHANGED)
4310                 arsta->nss = sta->rx_nss;
4311
4312         if (changed & IEEE80211_RC_SMPS_CHANGED) {
4313                 smps = WMI_PEER_SMPS_PS_NONE;
4314
4315                 switch (sta->smps_mode) {
4316                 case IEEE80211_SMPS_AUTOMATIC:
4317                 case IEEE80211_SMPS_OFF:
4318                         smps = WMI_PEER_SMPS_PS_NONE;
4319                         break;
4320                 case IEEE80211_SMPS_STATIC:
4321                         smps = WMI_PEER_SMPS_STATIC;
4322                         break;
4323                 case IEEE80211_SMPS_DYNAMIC:
4324                         smps = WMI_PEER_SMPS_DYNAMIC;
4325                         break;
4326                 case IEEE80211_SMPS_NUM_MODES:
4327                         ath10k_warn("Invalid smps %d in sta rc update for %pM\n",
4328                                     sta->smps_mode, sta->addr);
4329                         smps = WMI_PEER_SMPS_PS_NONE;
4330                         break;
4331                 }
4332
4333                 arsta->smps = smps;
4334         }
4335
4336         arsta->changed |= changed;
4337
4338         spin_unlock_bh(&ar->data_lock);
4339
4340         ieee80211_queue_work(hw, &arsta->update_wk);
4341 }
4342
4343 static u64 ath10k_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
4344 {
4345         /*
4346          * FIXME: Return 0 for time being. Need to figure out whether FW
4347          * has the API to fetch 64-bit local TSF
4348          */
4349
4350         return 0;
4351 }
4352
4353 static int ath10k_ampdu_action(struct ieee80211_hw *hw,
4354                                struct ieee80211_vif *vif,
4355                                enum ieee80211_ampdu_mlme_action action,
4356                                struct ieee80211_sta *sta, u16 tid, u16 *ssn,
4357                                u8 buf_size)
4358 {
4359         struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4360
4361         ath10k_dbg(ATH10K_DBG_MAC, "mac ampdu vdev_id %i sta %pM tid %hu action %d\n",
4362                    arvif->vdev_id, sta->addr, tid, action);
4363
4364         switch (action) {
4365         case IEEE80211_AMPDU_RX_START:
4366         case IEEE80211_AMPDU_RX_STOP:
4367                 /* HTT AddBa/DelBa events trigger mac80211 Rx BA session
4368                  * creation/removal. Do we need to verify this?
4369                  */
4370                 return 0;
4371         case IEEE80211_AMPDU_TX_START:
4372         case IEEE80211_AMPDU_TX_STOP_CONT:
4373         case IEEE80211_AMPDU_TX_STOP_FLUSH:
4374         case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
4375         case IEEE80211_AMPDU_TX_OPERATIONAL:
4376                 /* Firmware offloads Tx aggregation entirely so deny mac80211
4377                  * Tx aggregation requests.
4378                  */
4379                 return -EOPNOTSUPP;
4380         }
4381
4382         return -EINVAL;
4383 }
4384
4385 static const struct ieee80211_ops ath10k_ops = {
4386         .tx                             = ath10k_tx,
4387         .start                          = ath10k_start,
4388         .stop                           = ath10k_stop,
4389         .config                         = ath10k_config,
4390         .add_interface                  = ath10k_add_interface,
4391         .remove_interface               = ath10k_remove_interface,
4392         .configure_filter               = ath10k_configure_filter,
4393         .bss_info_changed               = ath10k_bss_info_changed,
4394         .hw_scan                        = ath10k_hw_scan,
4395         .cancel_hw_scan                 = ath10k_cancel_hw_scan,
4396         .set_key                        = ath10k_set_key,
4397         .sta_state                      = ath10k_sta_state,
4398         .conf_tx                        = ath10k_conf_tx,
4399         .remain_on_channel              = ath10k_remain_on_channel,
4400         .cancel_remain_on_channel       = ath10k_cancel_remain_on_channel,
4401         .set_rts_threshold              = ath10k_set_rts_threshold,
4402         .set_frag_threshold             = ath10k_set_frag_threshold,
4403         .flush                          = ath10k_flush,
4404         .tx_last_beacon                 = ath10k_tx_last_beacon,
4405         .set_antenna                    = ath10k_set_antenna,
4406         .get_antenna                    = ath10k_get_antenna,
4407         .restart_complete               = ath10k_restart_complete,
4408         .get_survey                     = ath10k_get_survey,
4409         .set_bitrate_mask               = ath10k_set_bitrate_mask,
4410         .sta_rc_update                  = ath10k_sta_rc_update,
4411         .get_tsf                        = ath10k_get_tsf,
4412         .ampdu_action                   = ath10k_ampdu_action,
4413 #ifdef CONFIG_PM
4414         .suspend                        = ath10k_suspend,
4415         .resume                         = ath10k_resume,
4416 #endif
4417 };
4418
4419 #define RATETAB_ENT(_rate, _rateid, _flags) { \
4420         .bitrate                = (_rate), \
4421         .flags                  = (_flags), \
4422         .hw_value               = (_rateid), \
4423 }
4424
4425 #define CHAN2G(_channel, _freq, _flags) { \
4426         .band                   = IEEE80211_BAND_2GHZ, \
4427         .hw_value               = (_channel), \
4428         .center_freq            = (_freq), \
4429         .flags                  = (_flags), \
4430         .max_antenna_gain       = 0, \
4431         .max_power              = 30, \
4432 }
4433
4434 #define CHAN5G(_channel, _freq, _flags) { \
4435         .band                   = IEEE80211_BAND_5GHZ, \
4436         .hw_value               = (_channel), \
4437         .center_freq            = (_freq), \
4438         .flags                  = (_flags), \
4439         .max_antenna_gain       = 0, \
4440         .max_power              = 30, \
4441 }
4442
4443 static const struct ieee80211_channel ath10k_2ghz_channels[] = {
4444         CHAN2G(1, 2412, 0),
4445         CHAN2G(2, 2417, 0),
4446         CHAN2G(3, 2422, 0),
4447         CHAN2G(4, 2427, 0),
4448         CHAN2G(5, 2432, 0),
4449         CHAN2G(6, 2437, 0),
4450         CHAN2G(7, 2442, 0),
4451         CHAN2G(8, 2447, 0),
4452         CHAN2G(9, 2452, 0),
4453         CHAN2G(10, 2457, 0),
4454         CHAN2G(11, 2462, 0),
4455         CHAN2G(12, 2467, 0),
4456         CHAN2G(13, 2472, 0),
4457         CHAN2G(14, 2484, 0),
4458 };
4459
4460 static const struct ieee80211_channel ath10k_5ghz_channels[] = {
4461         CHAN5G(36, 5180, 0),
4462         CHAN5G(40, 5200, 0),
4463         CHAN5G(44, 5220, 0),
4464         CHAN5G(48, 5240, 0),
4465         CHAN5G(52, 5260, 0),
4466         CHAN5G(56, 5280, 0),
4467         CHAN5G(60, 5300, 0),
4468         CHAN5G(64, 5320, 0),
4469         CHAN5G(100, 5500, 0),
4470         CHAN5G(104, 5520, 0),
4471         CHAN5G(108, 5540, 0),
4472         CHAN5G(112, 5560, 0),
4473         CHAN5G(116, 5580, 0),
4474         CHAN5G(120, 5600, 0),
4475         CHAN5G(124, 5620, 0),
4476         CHAN5G(128, 5640, 0),
4477         CHAN5G(132, 5660, 0),
4478         CHAN5G(136, 5680, 0),
4479         CHAN5G(140, 5700, 0),
4480         CHAN5G(149, 5745, 0),
4481         CHAN5G(153, 5765, 0),
4482         CHAN5G(157, 5785, 0),
4483         CHAN5G(161, 5805, 0),
4484         CHAN5G(165, 5825, 0),
4485 };
4486
4487 static struct ieee80211_rate ath10k_rates[] = {
4488         /* CCK */
4489         RATETAB_ENT(10,  0x82, 0),
4490         RATETAB_ENT(20,  0x84, 0),
4491         RATETAB_ENT(55,  0x8b, 0),
4492         RATETAB_ENT(110, 0x96, 0),
4493         /* OFDM */
4494         RATETAB_ENT(60,  0x0c, 0),
4495         RATETAB_ENT(90,  0x12, 0),
4496         RATETAB_ENT(120, 0x18, 0),
4497         RATETAB_ENT(180, 0x24, 0),
4498         RATETAB_ENT(240, 0x30, 0),
4499         RATETAB_ENT(360, 0x48, 0),
4500         RATETAB_ENT(480, 0x60, 0),
4501         RATETAB_ENT(540, 0x6c, 0),
4502 };
4503
4504 #define ath10k_a_rates (ath10k_rates + 4)
4505 #define ath10k_a_rates_size (ARRAY_SIZE(ath10k_rates) - 4)
4506 #define ath10k_g_rates (ath10k_rates + 0)
4507 #define ath10k_g_rates_size (ARRAY_SIZE(ath10k_rates))
4508
4509 struct ath10k *ath10k_mac_create(void)
4510 {
4511         struct ieee80211_hw *hw;
4512         struct ath10k *ar;
4513
4514         hw = ieee80211_alloc_hw(sizeof(struct ath10k), &ath10k_ops);
4515         if (!hw)
4516                 return NULL;
4517
4518         ar = hw->priv;
4519         ar->hw = hw;
4520
4521         return ar;
4522 }
4523
4524 void ath10k_mac_destroy(struct ath10k *ar)
4525 {
4526         ieee80211_free_hw(ar->hw);
4527 }
4528
4529 static const struct ieee80211_iface_limit ath10k_if_limits[] = {
4530         {
4531         .max    = 8,
4532         .types  = BIT(NL80211_IFTYPE_STATION)
4533                 | BIT(NL80211_IFTYPE_P2P_CLIENT)
4534         },
4535         {
4536         .max    = 3,
4537         .types  = BIT(NL80211_IFTYPE_P2P_GO)
4538         },
4539         {
4540         .max    = 7,
4541         .types  = BIT(NL80211_IFTYPE_AP)
4542         },
4543 };
4544
4545 static const struct ieee80211_iface_limit ath10k_10x_if_limits[] = {
4546         {
4547         .max    = 8,
4548         .types  = BIT(NL80211_IFTYPE_AP)
4549         },
4550 };
4551
4552 static const struct ieee80211_iface_combination ath10k_if_comb[] = {
4553         {
4554                 .limits = ath10k_if_limits,
4555                 .n_limits = ARRAY_SIZE(ath10k_if_limits),
4556                 .max_interfaces = 8,
4557                 .num_different_channels = 1,
4558                 .beacon_int_infra_match = true,
4559         },
4560 };
4561
4562 static const struct ieee80211_iface_combination ath10k_10x_if_comb[] = {
4563         {
4564                 .limits = ath10k_10x_if_limits,
4565                 .n_limits = ARRAY_SIZE(ath10k_10x_if_limits),
4566                 .max_interfaces = 8,
4567                 .num_different_channels = 1,
4568                 .beacon_int_infra_match = true,
4569 #ifdef CONFIG_ATH10K_DFS_CERTIFIED
4570                 .radar_detect_widths =  BIT(NL80211_CHAN_WIDTH_20_NOHT) |
4571                                         BIT(NL80211_CHAN_WIDTH_20) |
4572                                         BIT(NL80211_CHAN_WIDTH_40) |
4573                                         BIT(NL80211_CHAN_WIDTH_80),
4574 #endif
4575         },
4576 };
4577
4578 static struct ieee80211_sta_vht_cap ath10k_create_vht_cap(struct ath10k *ar)
4579 {
4580         struct ieee80211_sta_vht_cap vht_cap = {0};
4581         u16 mcs_map;
4582         int i;
4583
4584         vht_cap.vht_supported = 1;
4585         vht_cap.cap = ar->vht_cap_info;
4586
4587         mcs_map = 0;
4588         for (i = 0; i < 8; i++) {
4589                 if (i < ar->num_rf_chains)
4590                         mcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i*2);
4591                 else
4592                         mcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i*2);
4593         }
4594
4595         vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(mcs_map);
4596         vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(mcs_map);
4597
4598         return vht_cap;
4599 }
4600
4601 static struct ieee80211_sta_ht_cap ath10k_get_ht_cap(struct ath10k *ar)
4602 {
4603         int i;
4604         struct ieee80211_sta_ht_cap ht_cap = {0};
4605
4606         if (!(ar->ht_cap_info & WMI_HT_CAP_ENABLED))
4607                 return ht_cap;
4608
4609         ht_cap.ht_supported = 1;
4610         ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
4611         ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_8;
4612         ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
4613         ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
4614         ht_cap.cap |= WLAN_HT_CAP_SM_PS_STATIC << IEEE80211_HT_CAP_SM_PS_SHIFT;
4615
4616         if (ar->ht_cap_info & WMI_HT_CAP_HT20_SGI)
4617                 ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
4618
4619         if (ar->ht_cap_info & WMI_HT_CAP_HT40_SGI)
4620                 ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
4621
4622         if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) {
4623                 u32 smps;
4624
4625                 smps   = WLAN_HT_CAP_SM_PS_DYNAMIC;
4626                 smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT;
4627
4628                 ht_cap.cap |= smps;
4629         }
4630
4631         if (ar->ht_cap_info & WMI_HT_CAP_TX_STBC)
4632                 ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC;
4633
4634         if (ar->ht_cap_info & WMI_HT_CAP_RX_STBC) {
4635                 u32 stbc;
4636
4637                 stbc   = ar->ht_cap_info;
4638                 stbc  &= WMI_HT_CAP_RX_STBC;
4639                 stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT;
4640                 stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT;
4641                 stbc  &= IEEE80211_HT_CAP_RX_STBC;
4642
4643                 ht_cap.cap |= stbc;
4644         }
4645
4646         if (ar->ht_cap_info & WMI_HT_CAP_LDPC)
4647                 ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
4648
4649         if (ar->ht_cap_info & WMI_HT_CAP_L_SIG_TXOP_PROT)
4650                 ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
4651
4652         /* max AMSDU is implicitly taken from vht_cap_info */
4653         if (ar->vht_cap_info & WMI_VHT_CAP_MAX_MPDU_LEN_MASK)
4654                 ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU;
4655
4656         for (i = 0; i < ar->num_rf_chains; i++)
4657                 ht_cap.mcs.rx_mask[i] = 0xFF;
4658
4659         ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
4660
4661         return ht_cap;
4662 }
4663
4664
4665 static void ath10k_get_arvif_iter(void *data, u8 *mac,
4666                                   struct ieee80211_vif *vif)
4667 {
4668         struct ath10k_vif_iter *arvif_iter = data;
4669         struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4670
4671         if (arvif->vdev_id == arvif_iter->vdev_id)
4672                 arvif_iter->arvif = arvif;
4673 }
4674
4675 struct ath10k_vif *ath10k_get_arvif(struct ath10k *ar, u32 vdev_id)
4676 {
4677         struct ath10k_vif_iter arvif_iter;
4678         u32 flags;
4679
4680         memset(&arvif_iter, 0, sizeof(struct ath10k_vif_iter));
4681         arvif_iter.vdev_id = vdev_id;
4682
4683         flags = IEEE80211_IFACE_ITER_RESUME_ALL;
4684         ieee80211_iterate_active_interfaces_atomic(ar->hw,
4685                                                    flags,
4686                                                    ath10k_get_arvif_iter,
4687                                                    &arvif_iter);
4688         if (!arvif_iter.arvif) {
4689                 ath10k_warn("No VIF found for vdev %d\n", vdev_id);
4690                 return NULL;
4691         }
4692
4693         return arvif_iter.arvif;
4694 }
4695
4696 int ath10k_mac_register(struct ath10k *ar)
4697 {
4698         struct ieee80211_supported_band *band;
4699         struct ieee80211_sta_vht_cap vht_cap;
4700         struct ieee80211_sta_ht_cap ht_cap;
4701         void *channels;
4702         int ret;
4703
4704         SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr);
4705
4706         SET_IEEE80211_DEV(ar->hw, ar->dev);
4707
4708         ht_cap = ath10k_get_ht_cap(ar);
4709         vht_cap = ath10k_create_vht_cap(ar);
4710
4711         if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) {
4712                 channels = kmemdup(ath10k_2ghz_channels,
4713                                    sizeof(ath10k_2ghz_channels),
4714                                    GFP_KERNEL);
4715                 if (!channels) {
4716                         ret = -ENOMEM;
4717                         goto err_free;
4718                 }
4719
4720                 band = &ar->mac.sbands[IEEE80211_BAND_2GHZ];
4721                 band->n_channels = ARRAY_SIZE(ath10k_2ghz_channels);
4722                 band->channels = channels;
4723                 band->n_bitrates = ath10k_g_rates_size;
4724                 band->bitrates = ath10k_g_rates;
4725                 band->ht_cap = ht_cap;
4726
4727                 /* vht is not supported in 2.4 GHz */
4728
4729                 ar->hw->wiphy->bands[IEEE80211_BAND_2GHZ] = band;
4730         }
4731
4732         if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) {
4733                 channels = kmemdup(ath10k_5ghz_channels,
4734                                    sizeof(ath10k_5ghz_channels),
4735                                    GFP_KERNEL);
4736                 if (!channels) {
4737                         ret = -ENOMEM;
4738                         goto err_free;
4739                 }
4740
4741                 band = &ar->mac.sbands[IEEE80211_BAND_5GHZ];
4742                 band->n_channels = ARRAY_SIZE(ath10k_5ghz_channels);
4743                 band->channels = channels;
4744                 band->n_bitrates = ath10k_a_rates_size;
4745                 band->bitrates = ath10k_a_rates;
4746                 band->ht_cap = ht_cap;
4747                 band->vht_cap = vht_cap;
4748                 ar->hw->wiphy->bands[IEEE80211_BAND_5GHZ] = band;
4749         }
4750
4751         ar->hw->wiphy->interface_modes =
4752                 BIT(NL80211_IFTYPE_STATION) |
4753                 BIT(NL80211_IFTYPE_AP);
4754
4755         if (test_bit(ATH10K_FW_FEATURE_WMI_10X, ar->fw_features)) {
4756                 /* TODO:  Have to deal with 2x2 chips if/when the come out. */
4757                 ar->supp_tx_chainmask = TARGET_10X_TX_CHAIN_MASK;
4758                 ar->supp_rx_chainmask = TARGET_10X_RX_CHAIN_MASK;
4759         } else {
4760                 ar->supp_tx_chainmask = TARGET_TX_CHAIN_MASK;
4761                 ar->supp_rx_chainmask = TARGET_RX_CHAIN_MASK;
4762         }
4763
4764         ar->hw->wiphy->available_antennas_rx = ar->supp_rx_chainmask;
4765         ar->hw->wiphy->available_antennas_tx = ar->supp_tx_chainmask;
4766
4767         if (!test_bit(ATH10K_FW_FEATURE_NO_P2P, ar->fw_features))
4768                 ar->hw->wiphy->interface_modes |=
4769                         BIT(NL80211_IFTYPE_P2P_CLIENT) |
4770                         BIT(NL80211_IFTYPE_P2P_GO);
4771
4772         ar->hw->flags = IEEE80211_HW_SIGNAL_DBM |
4773                         IEEE80211_HW_SUPPORTS_PS |
4774                         IEEE80211_HW_SUPPORTS_DYNAMIC_PS |
4775                         IEEE80211_HW_SUPPORTS_UAPSD |
4776                         IEEE80211_HW_MFP_CAPABLE |
4777                         IEEE80211_HW_REPORTS_TX_ACK_STATUS |
4778                         IEEE80211_HW_HAS_RATE_CONTROL |
4779                         IEEE80211_HW_SUPPORTS_STATIC_SMPS |
4780                         IEEE80211_HW_AP_LINK_PS |
4781                         IEEE80211_HW_SPECTRUM_MGMT;
4782
4783         /* MSDU can have HTT TX fragment pushed in front. The additional 4
4784          * bytes is used for padding/alignment if necessary. */
4785         ar->hw->extra_tx_headroom += sizeof(struct htt_data_tx_desc_frag)*2 + 4;
4786
4787         if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS)
4788                 ar->hw->flags |= IEEE80211_HW_SUPPORTS_DYNAMIC_SMPS;
4789
4790         if (ar->ht_cap_info & WMI_HT_CAP_ENABLED) {
4791                 ar->hw->flags |= IEEE80211_HW_AMPDU_AGGREGATION;
4792                 ar->hw->flags |= IEEE80211_HW_TX_AMPDU_SETUP_IN_HW;
4793         }
4794
4795         ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID;
4796         ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN;
4797
4798         ar->hw->vif_data_size = sizeof(struct ath10k_vif);
4799         ar->hw->sta_data_size = sizeof(struct ath10k_sta);
4800
4801         ar->hw->max_listen_interval = ATH10K_MAX_HW_LISTEN_INTERVAL;
4802
4803         ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
4804         ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
4805         ar->hw->wiphy->max_remain_on_channel_duration = 5000;
4806
4807         ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
4808         /*
4809          * on LL hardware queues are managed entirely by the FW
4810          * so we only advertise to mac we can do the queues thing
4811          */
4812         ar->hw->queues = 4;
4813
4814         if (test_bit(ATH10K_FW_FEATURE_WMI_10X, ar->fw_features)) {
4815                 ar->hw->wiphy->iface_combinations = ath10k_10x_if_comb;
4816                 ar->hw->wiphy->n_iface_combinations =
4817                         ARRAY_SIZE(ath10k_10x_if_comb);
4818         } else {
4819                 ar->hw->wiphy->iface_combinations = ath10k_if_comb;
4820                 ar->hw->wiphy->n_iface_combinations =
4821                         ARRAY_SIZE(ath10k_if_comb);
4822
4823                 ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC);
4824         }
4825
4826         ar->hw->netdev_features = NETIF_F_HW_CSUM;
4827
4828         if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED)) {
4829                 /* Init ath dfs pattern detector */
4830                 ar->ath_common.debug_mask = ATH_DBG_DFS;
4831                 ar->dfs_detector = dfs_pattern_detector_init(&ar->ath_common,
4832                                                              NL80211_DFS_UNSET);
4833
4834                 if (!ar->dfs_detector)
4835                         ath10k_warn("failed to initialise DFS pattern detector\n");
4836         }
4837
4838         ret = ath_regd_init(&ar->ath_common.regulatory, ar->hw->wiphy,
4839                             ath10k_reg_notifier);
4840         if (ret) {
4841                 ath10k_err("failed to initialise regulatory: %i\n", ret);
4842                 goto err_free;
4843         }
4844
4845         ret = ieee80211_register_hw(ar->hw);
4846         if (ret) {
4847                 ath10k_err("failed to register ieee80211: %d\n", ret);
4848                 goto err_free;
4849         }
4850
4851         if (!ath_is_world_regd(&ar->ath_common.regulatory)) {
4852                 ret = regulatory_hint(ar->hw->wiphy,
4853                                       ar->ath_common.regulatory.alpha2);
4854                 if (ret)
4855                         goto err_unregister;
4856         }
4857
4858         return 0;
4859
4860 err_unregister:
4861         ieee80211_unregister_hw(ar->hw);
4862 err_free:
4863         kfree(ar->mac.sbands[IEEE80211_BAND_2GHZ].channels);
4864         kfree(ar->mac.sbands[IEEE80211_BAND_5GHZ].channels);
4865
4866         return ret;
4867 }
4868
4869 void ath10k_mac_unregister(struct ath10k *ar)
4870 {
4871         ieee80211_unregister_hw(ar->hw);
4872
4873         if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector)
4874                 ar->dfs_detector->exit(ar->dfs_detector);
4875
4876         kfree(ar->mac.sbands[IEEE80211_BAND_2GHZ].channels);
4877         kfree(ar->mac.sbands[IEEE80211_BAND_5GHZ].channels);
4878
4879         SET_IEEE80211_DEV(ar->hw, NULL);
4880 }