1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
32
33
34static 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 key->flags |= IEEE80211_KEY_FLAG_SW_MGMT_TX;
58 break;
59 case WLAN_CIPHER_SUITE_TKIP:
60 arg.key_cipher = WMI_CIPHER_TKIP;
61 arg.key_txmic_len = 8;
62 arg.key_rxmic_len = 8;
63 break;
64 case WLAN_CIPHER_SUITE_WEP40:
65 case WLAN_CIPHER_SUITE_WEP104:
66 arg.key_cipher = WMI_CIPHER_WEP;
67
68
69 if (memcmp(macaddr, arvif->vif->addr, ETH_ALEN))
70 arg.key_flags = WMI_KEY_PAIRWISE;
71 break;
72 default:
73 ath10k_warn("cipher %d is not supported\n", key->cipher);
74 return -EOPNOTSUPP;
75 }
76
77 if (cmd == DISABLE_KEY) {
78 arg.key_cipher = WMI_CIPHER_NONE;
79 arg.key_data = NULL;
80 }
81
82 return ath10k_wmi_vdev_install_key(arvif->ar, &arg);
83}
84
85static int ath10k_install_key(struct ath10k_vif *arvif,
86 struct ieee80211_key_conf *key,
87 enum set_key_cmd cmd,
88 const u8 *macaddr)
89{
90 struct ath10k *ar = arvif->ar;
91 int ret;
92
93 lockdep_assert_held(&ar->conf_mutex);
94
95 reinit_completion(&ar->install_key_done);
96
97 ret = ath10k_send_key(arvif, key, cmd, macaddr);
98 if (ret)
99 return ret;
100
101 ret = wait_for_completion_timeout(&ar->install_key_done, 3*HZ);
102 if (ret == 0)
103 return -ETIMEDOUT;
104
105 return 0;
106}
107
108static int ath10k_install_peer_wep_keys(struct ath10k_vif *arvif,
109 const u8 *addr)
110{
111 struct ath10k *ar = arvif->ar;
112 struct ath10k_peer *peer;
113 int ret;
114 int i;
115
116 lockdep_assert_held(&ar->conf_mutex);
117
118 spin_lock_bh(&ar->data_lock);
119 peer = ath10k_peer_find(ar, arvif->vdev_id, addr);
120 spin_unlock_bh(&ar->data_lock);
121
122 if (!peer)
123 return -ENOENT;
124
125 for (i = 0; i < ARRAY_SIZE(arvif->wep_keys); i++) {
126 if (arvif->wep_keys[i] == NULL)
127 continue;
128
129 ret = ath10k_install_key(arvif, arvif->wep_keys[i], SET_KEY,
130 addr);
131 if (ret)
132 return ret;
133
134 peer->keys[i] = arvif->wep_keys[i];
135 }
136
137 return 0;
138}
139
140static int ath10k_clear_peer_keys(struct ath10k_vif *arvif,
141 const u8 *addr)
142{
143 struct ath10k *ar = arvif->ar;
144 struct ath10k_peer *peer;
145 int first_errno = 0;
146 int ret;
147 int i;
148
149 lockdep_assert_held(&ar->conf_mutex);
150
151 spin_lock_bh(&ar->data_lock);
152 peer = ath10k_peer_find(ar, arvif->vdev_id, addr);
153 spin_unlock_bh(&ar->data_lock);
154
155 if (!peer)
156 return -ENOENT;
157
158 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
159 if (peer->keys[i] == NULL)
160 continue;
161
162 ret = ath10k_install_key(arvif, peer->keys[i],
163 DISABLE_KEY, addr);
164 if (ret && first_errno == 0)
165 first_errno = ret;
166
167 if (ret)
168 ath10k_warn("could not remove peer wep key %d (%d)\n",
169 i, ret);
170
171 peer->keys[i] = NULL;
172 }
173
174 return first_errno;
175}
176
177static int ath10k_clear_vdev_key(struct ath10k_vif *arvif,
178 struct ieee80211_key_conf *key)
179{
180 struct ath10k *ar = arvif->ar;
181 struct ath10k_peer *peer;
182 u8 addr[ETH_ALEN];
183 int first_errno = 0;
184 int ret;
185 int i;
186
187 lockdep_assert_held(&ar->conf_mutex);
188
189 for (;;) {
190
191
192 spin_lock_bh(&ar->data_lock);
193 i = 0;
194 list_for_each_entry(peer, &ar->peers, list) {
195 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
196 if (peer->keys[i] == key) {
197 memcpy(addr, peer->addr, ETH_ALEN);
198 peer->keys[i] = NULL;
199 break;
200 }
201 }
202
203 if (i < ARRAY_SIZE(peer->keys))
204 break;
205 }
206 spin_unlock_bh(&ar->data_lock);
207
208 if (i == ARRAY_SIZE(peer->keys))
209 break;
210
211 ret = ath10k_install_key(arvif, key, DISABLE_KEY, addr);
212 if (ret && first_errno == 0)
213 first_errno = ret;
214
215 if (ret)
216 ath10k_warn("could not remove key for %pM\n", addr);
217 }
218
219 return first_errno;
220}
221
222
223
224
225
226
227static inline enum wmi_phy_mode
228chan_to_phymode(const struct cfg80211_chan_def *chandef)
229{
230 enum wmi_phy_mode phymode = MODE_UNKNOWN;
231
232 switch (chandef->chan->band) {
233 case IEEE80211_BAND_2GHZ:
234 switch (chandef->width) {
235 case NL80211_CHAN_WIDTH_20_NOHT:
236 phymode = MODE_11G;
237 break;
238 case NL80211_CHAN_WIDTH_20:
239 phymode = MODE_11NG_HT20;
240 break;
241 case NL80211_CHAN_WIDTH_40:
242 phymode = MODE_11NG_HT40;
243 break;
244 case NL80211_CHAN_WIDTH_5:
245 case NL80211_CHAN_WIDTH_10:
246 case NL80211_CHAN_WIDTH_80:
247 case NL80211_CHAN_WIDTH_80P80:
248 case NL80211_CHAN_WIDTH_160:
249 phymode = MODE_UNKNOWN;
250 break;
251 }
252 break;
253 case IEEE80211_BAND_5GHZ:
254 switch (chandef->width) {
255 case NL80211_CHAN_WIDTH_20_NOHT:
256 phymode = MODE_11A;
257 break;
258 case NL80211_CHAN_WIDTH_20:
259 phymode = MODE_11NA_HT20;
260 break;
261 case NL80211_CHAN_WIDTH_40:
262 phymode = MODE_11NA_HT40;
263 break;
264 case NL80211_CHAN_WIDTH_80:
265 phymode = MODE_11AC_VHT80;
266 break;
267 case NL80211_CHAN_WIDTH_5:
268 case NL80211_CHAN_WIDTH_10:
269 case NL80211_CHAN_WIDTH_80P80:
270 case NL80211_CHAN_WIDTH_160:
271 phymode = MODE_UNKNOWN;
272 break;
273 }
274 break;
275 default:
276 break;
277 }
278
279 WARN_ON(phymode == MODE_UNKNOWN);
280 return phymode;
281}
282
283static u8 ath10k_parse_mpdudensity(u8 mpdudensity)
284{
285
286
287
288
289
290
291
292
293
294
295
296 switch (mpdudensity) {
297 case 0:
298 return 0;
299 case 1:
300 case 2:
301 case 3:
302
303
304 return 1;
305 case 4:
306 return 2;
307 case 5:
308 return 4;
309 case 6:
310 return 8;
311 case 7:
312 return 16;
313 default:
314 return 0;
315 }
316}
317
318static int ath10k_peer_create(struct ath10k *ar, u32 vdev_id, const u8 *addr)
319{
320 int ret;
321
322 lockdep_assert_held(&ar->conf_mutex);
323
324 ret = ath10k_wmi_peer_create(ar, vdev_id, addr);
325 if (ret) {
326 ath10k_warn("Failed to create wmi peer: %i\n", ret);
327 return ret;
328 }
329
330 ret = ath10k_wait_for_peer_created(ar, vdev_id, addr);
331 if (ret) {
332 ath10k_warn("Failed to wait for created wmi peer: %i\n", ret);
333 return ret;
334 }
335 spin_lock_bh(&ar->data_lock);
336 ar->num_peers++;
337 spin_unlock_bh(&ar->data_lock);
338
339 return 0;
340}
341
342static int ath10k_mac_set_rts(struct ath10k_vif *arvif, u32 value)
343{
344 struct ath10k *ar = arvif->ar;
345 u32 vdev_param;
346
347 if (value != 0xFFFFFFFF)
348 value = min_t(u32, arvif->ar->hw->wiphy->rts_threshold,
349 ATH10K_RTS_MAX);
350
351 vdev_param = ar->wmi.vdev_param->rts_threshold;
352 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, value);
353}
354
355static int ath10k_mac_set_frag(struct ath10k_vif *arvif, u32 value)
356{
357 struct ath10k *ar = arvif->ar;
358 u32 vdev_param;
359
360 if (value != 0xFFFFFFFF)
361 value = clamp_t(u32, arvif->ar->hw->wiphy->frag_threshold,
362 ATH10K_FRAGMT_THRESHOLD_MIN,
363 ATH10K_FRAGMT_THRESHOLD_MAX);
364
365 vdev_param = ar->wmi.vdev_param->fragmentation_threshold;
366 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, value);
367}
368
369static int ath10k_peer_delete(struct ath10k *ar, u32 vdev_id, const u8 *addr)
370{
371 int ret;
372
373 lockdep_assert_held(&ar->conf_mutex);
374
375 ret = ath10k_wmi_peer_delete(ar, vdev_id, addr);
376 if (ret)
377 return ret;
378
379 ret = ath10k_wait_for_peer_deleted(ar, vdev_id, addr);
380 if (ret)
381 return ret;
382
383 spin_lock_bh(&ar->data_lock);
384 ar->num_peers--;
385 spin_unlock_bh(&ar->data_lock);
386
387 return 0;
388}
389
390static void ath10k_peer_cleanup(struct ath10k *ar, u32 vdev_id)
391{
392 struct ath10k_peer *peer, *tmp;
393
394 lockdep_assert_held(&ar->conf_mutex);
395
396 spin_lock_bh(&ar->data_lock);
397 list_for_each_entry_safe(peer, tmp, &ar->peers, list) {
398 if (peer->vdev_id != vdev_id)
399 continue;
400
401 ath10k_warn("removing stale peer %pM from vdev_id %d\n",
402 peer->addr, vdev_id);
403
404 list_del(&peer->list);
405 kfree(peer);
406 ar->num_peers--;
407 }
408 spin_unlock_bh(&ar->data_lock);
409}
410
411static void ath10k_peer_cleanup_all(struct ath10k *ar)
412{
413 struct ath10k_peer *peer, *tmp;
414
415 lockdep_assert_held(&ar->conf_mutex);
416
417 spin_lock_bh(&ar->data_lock);
418 list_for_each_entry_safe(peer, tmp, &ar->peers, list) {
419 list_del(&peer->list);
420 kfree(peer);
421 }
422 ar->num_peers = 0;
423 spin_unlock_bh(&ar->data_lock);
424}
425
426
427
428
429
430static inline int ath10k_vdev_setup_sync(struct ath10k *ar)
431{
432 int ret;
433
434 lockdep_assert_held(&ar->conf_mutex);
435
436 ret = wait_for_completion_timeout(&ar->vdev_setup_done,
437 ATH10K_VDEV_SETUP_TIMEOUT_HZ);
438 if (ret == 0)
439 return -ETIMEDOUT;
440
441 return 0;
442}
443
444static int ath10k_vdev_start(struct ath10k_vif *arvif)
445{
446 struct ath10k *ar = arvif->ar;
447 struct ieee80211_conf *conf = &ar->hw->conf;
448 struct ieee80211_channel *channel = conf->chandef.chan;
449 struct wmi_vdev_start_request_arg arg = {};
450 int ret = 0;
451
452 lockdep_assert_held(&ar->conf_mutex);
453
454 reinit_completion(&ar->vdev_setup_done);
455
456 arg.vdev_id = arvif->vdev_id;
457 arg.dtim_period = arvif->dtim_period;
458 arg.bcn_intval = arvif->beacon_interval;
459
460 arg.channel.freq = channel->center_freq;
461
462 arg.channel.band_center_freq1 = conf->chandef.center_freq1;
463
464 arg.channel.mode = chan_to_phymode(&conf->chandef);
465
466 arg.channel.min_power = 0;
467 arg.channel.max_power = channel->max_power * 2;
468 arg.channel.max_reg_power = channel->max_reg_power * 2;
469 arg.channel.max_antenna_gain = channel->max_antenna_gain * 2;
470
471 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
472 arg.ssid = arvif->u.ap.ssid;
473 arg.ssid_len = arvif->u.ap.ssid_len;
474 arg.hidden_ssid = arvif->u.ap.hidden_ssid;
475
476
477 arg.channel.chan_radar =
478 !!(channel->flags & IEEE80211_CHAN_RADAR);
479 } else if (arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
480 arg.ssid = arvif->vif->bss_conf.ssid;
481 arg.ssid_len = arvif->vif->bss_conf.ssid_len;
482 }
483
484 ath10k_dbg(ATH10K_DBG_MAC,
485 "mac vdev %d start center_freq %d phymode %s\n",
486 arg.vdev_id, arg.channel.freq,
487 ath10k_wmi_phymode_str(arg.channel.mode));
488
489 ret = ath10k_wmi_vdev_start(ar, &arg);
490 if (ret) {
491 ath10k_warn("WMI vdev start failed: ret %d\n", ret);
492 return ret;
493 }
494
495 ret = ath10k_vdev_setup_sync(ar);
496 if (ret) {
497 ath10k_warn("vdev setup failed %d\n", ret);
498 return ret;
499 }
500
501 return ret;
502}
503
504static int ath10k_vdev_stop(struct ath10k_vif *arvif)
505{
506 struct ath10k *ar = arvif->ar;
507 int ret;
508
509 lockdep_assert_held(&ar->conf_mutex);
510
511 reinit_completion(&ar->vdev_setup_done);
512
513 ret = ath10k_wmi_vdev_stop(ar, arvif->vdev_id);
514 if (ret) {
515 ath10k_warn("WMI vdev stop failed: ret %d\n", ret);
516 return ret;
517 }
518
519 ret = ath10k_vdev_setup_sync(ar);
520 if (ret) {
521 ath10k_warn("vdev setup failed %d\n", ret);
522 return ret;
523 }
524
525 return ret;
526}
527
528static int ath10k_monitor_start(struct ath10k *ar, int vdev_id)
529{
530 struct ieee80211_channel *channel = ar->hw->conf.chandef.chan;
531 struct wmi_vdev_start_request_arg arg = {};
532 int ret = 0;
533
534 lockdep_assert_held(&ar->conf_mutex);
535
536 if (!ar->monitor_present) {
537 ath10k_warn("mac montor stop -- monitor is not present\n");
538 return -EINVAL;
539 }
540
541 arg.vdev_id = vdev_id;
542 arg.channel.freq = channel->center_freq;
543 arg.channel.band_center_freq1 = ar->hw->conf.chandef.center_freq1;
544
545
546
547 arg.channel.mode = chan_to_phymode(&ar->hw->conf.chandef);
548 arg.channel.chan_radar =
549 !!(channel->flags & IEEE80211_CHAN_RADAR);
550
551 arg.channel.min_power = 0;
552 arg.channel.max_power = channel->max_power * 2;
553 arg.channel.max_reg_power = channel->max_reg_power * 2;
554 arg.channel.max_antenna_gain = channel->max_antenna_gain * 2;
555
556 ret = ath10k_wmi_vdev_start(ar, &arg);
557 if (ret) {
558 ath10k_warn("Monitor vdev start failed: ret %d\n", ret);
559 return ret;
560 }
561
562 ret = ath10k_vdev_setup_sync(ar);
563 if (ret) {
564 ath10k_warn("Monitor vdev setup failed %d\n", ret);
565 return ret;
566 }
567
568 ret = ath10k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr);
569 if (ret) {
570 ath10k_warn("Monitor vdev up failed: %d\n", ret);
571 goto vdev_stop;
572 }
573
574 ar->monitor_vdev_id = vdev_id;
575 ar->monitor_enabled = true;
576
577 return 0;
578
579vdev_stop:
580 ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
581 if (ret)
582 ath10k_warn("Monitor vdev stop failed: %d\n", ret);
583
584 return ret;
585}
586
587static int ath10k_monitor_stop(struct ath10k *ar)
588{
589 int ret = 0;
590
591 lockdep_assert_held(&ar->conf_mutex);
592
593 if (!ar->monitor_present) {
594 ath10k_warn("mac montor stop -- monitor is not present\n");
595 return -EINVAL;
596 }
597
598 if (!ar->monitor_enabled) {
599 ath10k_warn("mac montor stop -- monitor is not enabled\n");
600 return -EINVAL;
601 }
602
603 ret = ath10k_wmi_vdev_down(ar, ar->monitor_vdev_id);
604 if (ret)
605 ath10k_warn("Monitor vdev down failed: %d\n", ret);
606
607 ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
608 if (ret)
609 ath10k_warn("Monitor vdev stop failed: %d\n", ret);
610
611 ret = ath10k_vdev_setup_sync(ar);
612 if (ret)
613 ath10k_warn("Monitor_down sync failed: %d\n", ret);
614
615 ar->monitor_enabled = false;
616 return ret;
617}
618
619static int ath10k_monitor_create(struct ath10k *ar)
620{
621 int bit, ret = 0;
622
623 lockdep_assert_held(&ar->conf_mutex);
624
625 if (ar->monitor_present) {
626 ath10k_warn("Monitor mode already enabled\n");
627 return 0;
628 }
629
630 bit = ffs(ar->free_vdev_map);
631 if (bit == 0) {
632 ath10k_warn("No free VDEV slots\n");
633 return -ENOMEM;
634 }
635
636 ar->monitor_vdev_id = bit - 1;
637 ar->free_vdev_map &= ~(1 << ar->monitor_vdev_id);
638
639 ret = ath10k_wmi_vdev_create(ar, ar->monitor_vdev_id,
640 WMI_VDEV_TYPE_MONITOR,
641 0, ar->mac_addr);
642 if (ret) {
643 ath10k_warn("WMI vdev monitor create failed: ret %d\n", ret);
644 goto vdev_fail;
645 }
646
647 ath10k_dbg(ATH10K_DBG_MAC, "mac monitor vdev %d created\n",
648 ar->monitor_vdev_id);
649
650 ar->monitor_present = true;
651 return 0;
652
653vdev_fail:
654
655
656
657 ar->free_vdev_map |= 1 << (ar->monitor_vdev_id);
658 return ret;
659}
660
661static int ath10k_monitor_destroy(struct ath10k *ar)
662{
663 int ret = 0;
664
665 lockdep_assert_held(&ar->conf_mutex);
666
667 if (!ar->monitor_present)
668 return 0;
669
670 ret = ath10k_wmi_vdev_delete(ar, ar->monitor_vdev_id);
671 if (ret) {
672 ath10k_warn("WMI vdev monitor delete failed: %d\n", ret);
673 return ret;
674 }
675
676 ar->free_vdev_map |= 1 << (ar->monitor_vdev_id);
677 ar->monitor_present = false;
678
679 ath10k_dbg(ATH10K_DBG_MAC, "mac monitor vdev %d deleted\n",
680 ar->monitor_vdev_id);
681 return ret;
682}
683
684static int ath10k_start_cac(struct ath10k *ar)
685{
686 int ret;
687
688 lockdep_assert_held(&ar->conf_mutex);
689
690 set_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
691
692 ret = ath10k_monitor_create(ar);
693 if (ret) {
694 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
695 return ret;
696 }
697
698 ret = ath10k_monitor_start(ar, ar->monitor_vdev_id);
699 if (ret) {
700 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
701 ath10k_monitor_destroy(ar);
702 return ret;
703 }
704
705 ath10k_dbg(ATH10K_DBG_MAC, "mac cac start monitor vdev %d\n",
706 ar->monitor_vdev_id);
707
708 return 0;
709}
710
711static int ath10k_stop_cac(struct ath10k *ar)
712{
713 lockdep_assert_held(&ar->conf_mutex);
714
715
716 if (!test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags))
717 return 0;
718
719 ath10k_monitor_stop(ar);
720 ath10k_monitor_destroy(ar);
721 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
722
723 ath10k_dbg(ATH10K_DBG_MAC, "mac cac finished\n");
724
725 return 0;
726}
727
728static const char *ath10k_dfs_state(enum nl80211_dfs_state dfs_state)
729{
730 switch (dfs_state) {
731 case NL80211_DFS_USABLE:
732 return "USABLE";
733 case NL80211_DFS_UNAVAILABLE:
734 return "UNAVAILABLE";
735 case NL80211_DFS_AVAILABLE:
736 return "AVAILABLE";
737 default:
738 WARN_ON(1);
739 return "bug";
740 }
741}
742
743static void ath10k_config_radar_detection(struct ath10k *ar)
744{
745 struct ieee80211_channel *chan = ar->hw->conf.chandef.chan;
746 bool radar = ar->hw->conf.radar_enabled;
747 bool chan_radar = !!(chan->flags & IEEE80211_CHAN_RADAR);
748 enum nl80211_dfs_state dfs_state = chan->dfs_state;
749 int ret;
750
751 lockdep_assert_held(&ar->conf_mutex);
752
753 ath10k_dbg(ATH10K_DBG_MAC,
754 "mac radar config update: chan %dMHz radar %d chan radar %d chan state %s\n",
755 chan->center_freq, radar, chan_radar,
756 ath10k_dfs_state(dfs_state));
757
758
759
760
761
762 ath10k_stop_cac(ar);
763
764 if (!radar)
765 return;
766
767 if (!chan_radar)
768 return;
769
770 if (dfs_state != NL80211_DFS_USABLE)
771 return;
772
773 ret = ath10k_start_cac(ar);
774 if (ret) {
775
776
777
778
779
780 ath10k_warn("failed to start CAC (%d)\n", ret);
781 ieee80211_radar_detected(ar->hw);
782 }
783}
784
785static void ath10k_control_beaconing(struct ath10k_vif *arvif,
786 struct ieee80211_bss_conf *info)
787{
788 int ret = 0;
789
790 lockdep_assert_held(&arvif->ar->conf_mutex);
791
792 if (!info->enable_beacon) {
793 ath10k_vdev_stop(arvif);
794 return;
795 }
796
797 arvif->tx_seq_no = 0x1000;
798
799 ret = ath10k_vdev_start(arvif);
800 if (ret)
801 return;
802
803 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, 0, info->bssid);
804 if (ret) {
805 ath10k_warn("Failed to bring up VDEV: %d\n",
806 arvif->vdev_id);
807 return;
808 }
809 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d up\n", arvif->vdev_id);
810}
811
812static void ath10k_control_ibss(struct ath10k_vif *arvif,
813 struct ieee80211_bss_conf *info,
814 const u8 self_peer[ETH_ALEN])
815{
816 u32 vdev_param;
817 int ret = 0;
818
819 lockdep_assert_held(&arvif->ar->conf_mutex);
820
821 if (!info->ibss_joined) {
822 ret = ath10k_peer_delete(arvif->ar, arvif->vdev_id, self_peer);
823 if (ret)
824 ath10k_warn("Failed to delete IBSS self peer:%pM for VDEV:%d ret:%d\n",
825 self_peer, arvif->vdev_id, ret);
826
827 if (is_zero_ether_addr(arvif->u.ibss.bssid))
828 return;
829
830 ret = ath10k_peer_delete(arvif->ar, arvif->vdev_id,
831 arvif->u.ibss.bssid);
832 if (ret) {
833 ath10k_warn("Failed to delete IBSS BSSID peer:%pM for VDEV:%d ret:%d\n",
834 arvif->u.ibss.bssid, arvif->vdev_id, ret);
835 return;
836 }
837
838 memset(arvif->u.ibss.bssid, 0, ETH_ALEN);
839
840 return;
841 }
842
843 ret = ath10k_peer_create(arvif->ar, arvif->vdev_id, self_peer);
844 if (ret) {
845 ath10k_warn("Failed to create IBSS self peer:%pM for VDEV:%d ret:%d\n",
846 self_peer, arvif->vdev_id, ret);
847 return;
848 }
849
850 vdev_param = arvif->ar->wmi.vdev_param->atim_window;
851 ret = ath10k_wmi_vdev_set_param(arvif->ar, arvif->vdev_id, vdev_param,
852 ATH10K_DEFAULT_ATIM);
853 if (ret)
854 ath10k_warn("Failed to set IBSS ATIM for VDEV:%d ret:%d\n",
855 arvif->vdev_id, ret);
856}
857
858
859
860
861static int ath10k_mac_vif_setup_ps(struct ath10k_vif *arvif)
862{
863 struct ath10k *ar = arvif->ar;
864 struct ieee80211_conf *conf = &ar->hw->conf;
865 enum wmi_sta_powersave_param param;
866 enum wmi_sta_ps_mode psmode;
867 int ret;
868
869 lockdep_assert_held(&arvif->ar->conf_mutex);
870
871 if (arvif->vif->type != NL80211_IFTYPE_STATION)
872 return 0;
873
874 if (conf->flags & IEEE80211_CONF_PS) {
875 psmode = WMI_STA_PS_MODE_ENABLED;
876 param = WMI_STA_PS_PARAM_INACTIVITY_TIME;
877
878 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param,
879 conf->dynamic_ps_timeout);
880 if (ret) {
881 ath10k_warn("Failed to set inactivity time for VDEV: %d\n",
882 arvif->vdev_id);
883 return ret;
884 }
885 } else {
886 psmode = WMI_STA_PS_MODE_DISABLED;
887 }
888
889 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d psmode %s\n",
890 arvif->vdev_id, psmode ? "enable" : "disable");
891
892 ret = ath10k_wmi_set_psmode(ar, arvif->vdev_id, psmode);
893 if (ret) {
894 ath10k_warn("Failed to set PS Mode: %d for VDEV: %d\n",
895 psmode, arvif->vdev_id);
896 return ret;
897 }
898
899 return 0;
900}
901
902
903
904
905
906static void ath10k_peer_assoc_h_basic(struct ath10k *ar,
907 struct ath10k_vif *arvif,
908 struct ieee80211_sta *sta,
909 struct ieee80211_bss_conf *bss_conf,
910 struct wmi_peer_assoc_complete_arg *arg)
911{
912 lockdep_assert_held(&ar->conf_mutex);
913
914 memcpy(arg->addr, sta->addr, ETH_ALEN);
915 arg->vdev_id = arvif->vdev_id;
916 arg->peer_aid = sta->aid;
917 arg->peer_flags |= WMI_PEER_AUTH;
918
919 if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
920
921
922
923
924
925
926
927
928
929
930
931
932
933 arg->peer_listen_intval = 1;
934 else
935 arg->peer_listen_intval = ar->hw->conf.listen_interval;
936
937 arg->peer_num_spatial_streams = 1;
938
939
940
941
942 if (arvif->vdev_type == WMI_VDEV_TYPE_STA && bss_conf)
943 arg->peer_caps = bss_conf->assoc_capability;
944}
945
946static void ath10k_peer_assoc_h_crypto(struct ath10k *ar,
947 struct ath10k_vif *arvif,
948 struct wmi_peer_assoc_complete_arg *arg)
949{
950 struct ieee80211_vif *vif = arvif->vif;
951 struct ieee80211_bss_conf *info = &vif->bss_conf;
952 struct cfg80211_bss *bss;
953 const u8 *rsnie = NULL;
954 const u8 *wpaie = NULL;
955
956 lockdep_assert_held(&ar->conf_mutex);
957
958 bss = cfg80211_get_bss(ar->hw->wiphy, ar->hw->conf.chandef.chan,
959 info->bssid, NULL, 0, 0, 0);
960 if (bss) {
961 const struct cfg80211_bss_ies *ies;
962
963 rcu_read_lock();
964 rsnie = ieee80211_bss_get_ie(bss, WLAN_EID_RSN);
965
966 ies = rcu_dereference(bss->ies);
967
968 wpaie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
969 WLAN_OUI_TYPE_MICROSOFT_WPA,
970 ies->data,
971 ies->len);
972 rcu_read_unlock();
973 cfg80211_put_bss(ar->hw->wiphy, bss);
974 }
975
976
977 if (rsnie || wpaie) {
978 ath10k_dbg(ATH10K_DBG_WMI, "%s: rsn ie found\n", __func__);
979 arg->peer_flags |= WMI_PEER_NEED_PTK_4_WAY;
980 }
981
982 if (wpaie) {
983 ath10k_dbg(ATH10K_DBG_WMI, "%s: wpa ie found\n", __func__);
984 arg->peer_flags |= WMI_PEER_NEED_GTK_2_WAY;
985 }
986}
987
988static void ath10k_peer_assoc_h_rates(struct ath10k *ar,
989 struct ieee80211_sta *sta,
990 struct wmi_peer_assoc_complete_arg *arg)
991{
992 struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates;
993 const struct ieee80211_supported_band *sband;
994 const struct ieee80211_rate *rates;
995 u32 ratemask;
996 int i;
997
998 lockdep_assert_held(&ar->conf_mutex);
999
1000 sband = ar->hw->wiphy->bands[ar->hw->conf.chandef.chan->band];
1001 ratemask = sta->supp_rates[ar->hw->conf.chandef.chan->band];
1002 rates = sband->bitrates;
1003
1004 rateset->num_rates = 0;
1005
1006 for (i = 0; i < 32; i++, ratemask >>= 1, rates++) {
1007 if (!(ratemask & 1))
1008 continue;
1009
1010 rateset->rates[rateset->num_rates] = rates->hw_value;
1011 rateset->num_rates++;
1012 }
1013}
1014
1015static void ath10k_peer_assoc_h_ht(struct ath10k *ar,
1016 struct ieee80211_sta *sta,
1017 struct wmi_peer_assoc_complete_arg *arg)
1018{
1019 const struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
1020 int smps;
1021 int i, n;
1022
1023 lockdep_assert_held(&ar->conf_mutex);
1024
1025 if (!ht_cap->ht_supported)
1026 return;
1027
1028 arg->peer_flags |= WMI_PEER_HT;
1029 arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
1030 ht_cap->ampdu_factor)) - 1;
1031
1032 arg->peer_mpdu_density =
1033 ath10k_parse_mpdudensity(ht_cap->ampdu_density);
1034
1035 arg->peer_ht_caps = ht_cap->cap;
1036 arg->peer_rate_caps |= WMI_RC_HT_FLAG;
1037
1038 if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING)
1039 arg->peer_flags |= WMI_PEER_LDPC;
1040
1041 if (sta->bandwidth >= IEEE80211_STA_RX_BW_40) {
1042 arg->peer_flags |= WMI_PEER_40MHZ;
1043 arg->peer_rate_caps |= WMI_RC_CW40_FLAG;
1044 }
1045
1046 if (ht_cap->cap & IEEE80211_HT_CAP_SGI_20)
1047 arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
1048
1049 if (ht_cap->cap & IEEE80211_HT_CAP_SGI_40)
1050 arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
1051
1052 if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) {
1053 arg->peer_rate_caps |= WMI_RC_TX_STBC_FLAG;
1054 arg->peer_flags |= WMI_PEER_STBC;
1055 }
1056
1057 if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) {
1058 u32 stbc;
1059 stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC;
1060 stbc = stbc >> IEEE80211_HT_CAP_RX_STBC_SHIFT;
1061 stbc = stbc << WMI_RC_RX_STBC_FLAG_S;
1062 arg->peer_rate_caps |= stbc;
1063 arg->peer_flags |= WMI_PEER_STBC;
1064 }
1065
1066 smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
1067 smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
1068
1069 if (smps == WLAN_HT_CAP_SM_PS_STATIC) {
1070 arg->peer_flags |= WMI_PEER_SPATIAL_MUX;
1071 arg->peer_flags |= WMI_PEER_STATIC_MIMOPS;
1072 } else if (smps == WLAN_HT_CAP_SM_PS_DYNAMIC) {
1073 arg->peer_flags |= WMI_PEER_SPATIAL_MUX;
1074 arg->peer_flags |= WMI_PEER_DYN_MIMOPS;
1075 }
1076
1077 if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2])
1078 arg->peer_rate_caps |= WMI_RC_TS_FLAG;
1079 else if (ht_cap->mcs.rx_mask[1])
1080 arg->peer_rate_caps |= WMI_RC_DS_FLAG;
1081
1082 for (i = 0, n = 0; i < IEEE80211_HT_MCS_MASK_LEN*8; i++)
1083 if (ht_cap->mcs.rx_mask[i/8] & (1 << i%8))
1084 arg->peer_ht_rates.rates[n++] = i;
1085
1086 arg->peer_ht_rates.num_rates = n;
1087 arg->peer_num_spatial_streams = max((n+7) / 8, 1);
1088
1089 ath10k_dbg(ATH10K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n",
1090 arg->addr,
1091 arg->peer_ht_rates.num_rates,
1092 arg->peer_num_spatial_streams);
1093}
1094
1095static void ath10k_peer_assoc_h_qos_ap(struct ath10k *ar,
1096 struct ath10k_vif *arvif,
1097 struct ieee80211_sta *sta,
1098 struct ieee80211_bss_conf *bss_conf,
1099 struct wmi_peer_assoc_complete_arg *arg)
1100{
1101 u32 uapsd = 0;
1102 u32 max_sp = 0;
1103
1104 lockdep_assert_held(&ar->conf_mutex);
1105
1106 if (sta->wme)
1107 arg->peer_flags |= WMI_PEER_QOS;
1108
1109 if (sta->wme && sta->uapsd_queues) {
1110 ath10k_dbg(ATH10K_DBG_MAC, "mac uapsd_queues 0x%x max_sp %d\n",
1111 sta->uapsd_queues, sta->max_sp);
1112
1113 arg->peer_flags |= WMI_PEER_APSD;
1114 arg->peer_rate_caps |= WMI_RC_UAPSD_FLAG;
1115
1116 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO)
1117 uapsd |= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN |
1118 WMI_AP_PS_UAPSD_AC3_TRIGGER_EN;
1119 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI)
1120 uapsd |= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN |
1121 WMI_AP_PS_UAPSD_AC2_TRIGGER_EN;
1122 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK)
1123 uapsd |= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN |
1124 WMI_AP_PS_UAPSD_AC1_TRIGGER_EN;
1125 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE)
1126 uapsd |= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN |
1127 WMI_AP_PS_UAPSD_AC0_TRIGGER_EN;
1128
1129
1130 if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP)
1131 max_sp = sta->max_sp;
1132
1133 ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
1134 sta->addr,
1135 WMI_AP_PS_PEER_PARAM_UAPSD,
1136 uapsd);
1137
1138 ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
1139 sta->addr,
1140 WMI_AP_PS_PEER_PARAM_MAX_SP,
1141 max_sp);
1142
1143
1144
1145
1146
1147 ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
1148 sta->addr,
1149 WMI_AP_PS_PEER_PARAM_AGEOUT_TIME,
1150 10);
1151 }
1152}
1153
1154static void ath10k_peer_assoc_h_qos_sta(struct ath10k *ar,
1155 struct ath10k_vif *arvif,
1156 struct ieee80211_sta *sta,
1157 struct ieee80211_bss_conf *bss_conf,
1158 struct wmi_peer_assoc_complete_arg *arg)
1159{
1160 if (bss_conf->qos)
1161 arg->peer_flags |= WMI_PEER_QOS;
1162}
1163
1164static void ath10k_peer_assoc_h_vht(struct ath10k *ar,
1165 struct ieee80211_sta *sta,
1166 struct wmi_peer_assoc_complete_arg *arg)
1167{
1168 const struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
1169 u8 ampdu_factor;
1170
1171 if (!vht_cap->vht_supported)
1172 return;
1173
1174 arg->peer_flags |= WMI_PEER_VHT;
1175 arg->peer_vht_caps = vht_cap->cap;
1176
1177
1178 ampdu_factor = (vht_cap->cap &
1179 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >>
1180 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
1181
1182
1183
1184
1185
1186 arg->peer_max_mpdu = max(arg->peer_max_mpdu,
1187 (1U << (IEEE80211_HT_MAX_AMPDU_FACTOR +
1188 ampdu_factor)) - 1);
1189
1190 if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
1191 arg->peer_flags |= WMI_PEER_80MHZ;
1192
1193 arg->peer_vht_rates.rx_max_rate =
1194 __le16_to_cpu(vht_cap->vht_mcs.rx_highest);
1195 arg->peer_vht_rates.rx_mcs_set =
1196 __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map);
1197 arg->peer_vht_rates.tx_max_rate =
1198 __le16_to_cpu(vht_cap->vht_mcs.tx_highest);
1199 arg->peer_vht_rates.tx_mcs_set =
1200 __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map);
1201
1202 ath10k_dbg(ATH10K_DBG_MAC, "mac vht peer %pM max_mpdu %d flags 0x%x\n",
1203 sta->addr, arg->peer_max_mpdu, arg->peer_flags);
1204}
1205
1206static void ath10k_peer_assoc_h_qos(struct ath10k *ar,
1207 struct ath10k_vif *arvif,
1208 struct ieee80211_sta *sta,
1209 struct ieee80211_bss_conf *bss_conf,
1210 struct wmi_peer_assoc_complete_arg *arg)
1211{
1212 switch (arvif->vdev_type) {
1213 case WMI_VDEV_TYPE_AP:
1214 ath10k_peer_assoc_h_qos_ap(ar, arvif, sta, bss_conf, arg);
1215 break;
1216 case WMI_VDEV_TYPE_STA:
1217 ath10k_peer_assoc_h_qos_sta(ar, arvif, sta, bss_conf, arg);
1218 break;
1219 default:
1220 break;
1221 }
1222}
1223
1224static void ath10k_peer_assoc_h_phymode(struct ath10k *ar,
1225 struct ath10k_vif *arvif,
1226 struct ieee80211_sta *sta,
1227 struct wmi_peer_assoc_complete_arg *arg)
1228{
1229 enum wmi_phy_mode phymode = MODE_UNKNOWN;
1230
1231 switch (ar->hw->conf.chandef.chan->band) {
1232 case IEEE80211_BAND_2GHZ:
1233 if (sta->ht_cap.ht_supported) {
1234 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1235 phymode = MODE_11NG_HT40;
1236 else
1237 phymode = MODE_11NG_HT20;
1238 } else {
1239 phymode = MODE_11G;
1240 }
1241
1242 break;
1243 case IEEE80211_BAND_5GHZ:
1244
1245
1246
1247 if (sta->vht_cap.vht_supported) {
1248 if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
1249 phymode = MODE_11AC_VHT80;
1250 else if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1251 phymode = MODE_11AC_VHT40;
1252 else if (sta->bandwidth == IEEE80211_STA_RX_BW_20)
1253 phymode = MODE_11AC_VHT20;
1254 } else if (sta->ht_cap.ht_supported) {
1255 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1256 phymode = MODE_11NA_HT40;
1257 else
1258 phymode = MODE_11NA_HT20;
1259 } else {
1260 phymode = MODE_11A;
1261 }
1262
1263 break;
1264 default:
1265 break;
1266 }
1267
1268 ath10k_dbg(ATH10K_DBG_MAC, "mac peer %pM phymode %s\n",
1269 sta->addr, ath10k_wmi_phymode_str(phymode));
1270
1271 arg->peer_phymode = phymode;
1272 WARN_ON(phymode == MODE_UNKNOWN);
1273}
1274
1275static int ath10k_peer_assoc_prepare(struct ath10k *ar,
1276 struct ath10k_vif *arvif,
1277 struct ieee80211_sta *sta,
1278 struct ieee80211_bss_conf *bss_conf,
1279 struct wmi_peer_assoc_complete_arg *arg)
1280{
1281 lockdep_assert_held(&ar->conf_mutex);
1282
1283 memset(arg, 0, sizeof(*arg));
1284
1285 ath10k_peer_assoc_h_basic(ar, arvif, sta, bss_conf, arg);
1286 ath10k_peer_assoc_h_crypto(ar, arvif, arg);
1287 ath10k_peer_assoc_h_rates(ar, sta, arg);
1288 ath10k_peer_assoc_h_ht(ar, sta, arg);
1289 ath10k_peer_assoc_h_vht(ar, sta, arg);
1290 ath10k_peer_assoc_h_qos(ar, arvif, sta, bss_conf, arg);
1291 ath10k_peer_assoc_h_phymode(ar, arvif, sta, arg);
1292
1293 return 0;
1294}
1295
1296
1297static void ath10k_bss_assoc(struct ieee80211_hw *hw,
1298 struct ieee80211_vif *vif,
1299 struct ieee80211_bss_conf *bss_conf)
1300{
1301 struct ath10k *ar = hw->priv;
1302 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1303 struct wmi_peer_assoc_complete_arg peer_arg;
1304 struct ieee80211_sta *ap_sta;
1305 int ret;
1306
1307 lockdep_assert_held(&ar->conf_mutex);
1308
1309 rcu_read_lock();
1310
1311 ap_sta = ieee80211_find_sta(vif, bss_conf->bssid);
1312 if (!ap_sta) {
1313 ath10k_warn("Failed to find station entry for %pM\n",
1314 bss_conf->bssid);
1315 rcu_read_unlock();
1316 return;
1317 }
1318
1319 ret = ath10k_peer_assoc_prepare(ar, arvif, ap_sta,
1320 bss_conf, &peer_arg);
1321 if (ret) {
1322 ath10k_warn("Peer assoc prepare failed for %pM\n: %d",
1323 bss_conf->bssid, ret);
1324 rcu_read_unlock();
1325 return;
1326 }
1327
1328 rcu_read_unlock();
1329
1330 ret = ath10k_wmi_peer_assoc(ar, &peer_arg);
1331 if (ret) {
1332 ath10k_warn("Peer assoc failed for %pM\n: %d",
1333 bss_conf->bssid, ret);
1334 return;
1335 }
1336
1337 ath10k_dbg(ATH10K_DBG_MAC,
1338 "mac vdev %d up (associated) bssid %pM aid %d\n",
1339 arvif->vdev_id, bss_conf->bssid, bss_conf->aid);
1340
1341 ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, bss_conf->aid,
1342 bss_conf->bssid);
1343 if (ret)
1344 ath10k_warn("VDEV: %d up failed: ret %d\n",
1345 arvif->vdev_id, ret);
1346}
1347
1348
1349
1350
1351static void ath10k_bss_disassoc(struct ieee80211_hw *hw,
1352 struct ieee80211_vif *vif)
1353{
1354 struct ath10k *ar = hw->priv;
1355 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1356 int ret;
1357
1358 lockdep_assert_held(&ar->conf_mutex);
1359
1360
1361
1362
1363
1364
1365
1366 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d stop (disassociated\n",
1367 arvif->vdev_id);
1368
1369
1370 ret = ath10k_vdev_stop(arvif);
1371
1372
1373
1374
1375
1376
1377
1378
1379 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d down\n", arvif->vdev_id);
1380
1381
1382 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
1383
1384 arvif->def_wep_key_idx = 0;
1385}
1386
1387static int ath10k_station_assoc(struct ath10k *ar, struct ath10k_vif *arvif,
1388 struct ieee80211_sta *sta)
1389{
1390 struct wmi_peer_assoc_complete_arg peer_arg;
1391 int ret = 0;
1392
1393 lockdep_assert_held(&ar->conf_mutex);
1394
1395 ret = ath10k_peer_assoc_prepare(ar, arvif, sta, NULL, &peer_arg);
1396 if (ret) {
1397 ath10k_warn("WMI peer assoc prepare failed for %pM\n",
1398 sta->addr);
1399 return ret;
1400 }
1401
1402 ret = ath10k_wmi_peer_assoc(ar, &peer_arg);
1403 if (ret) {
1404 ath10k_warn("Peer assoc failed for STA %pM\n: %d",
1405 sta->addr, ret);
1406 return ret;
1407 }
1408
1409 ret = ath10k_install_peer_wep_keys(arvif, sta->addr);
1410 if (ret) {
1411 ath10k_warn("could not install peer wep keys (%d)\n", ret);
1412 return ret;
1413 }
1414
1415 return ret;
1416}
1417
1418static int ath10k_station_disassoc(struct ath10k *ar, struct ath10k_vif *arvif,
1419 struct ieee80211_sta *sta)
1420{
1421 int ret = 0;
1422
1423 lockdep_assert_held(&ar->conf_mutex);
1424
1425 ret = ath10k_clear_peer_keys(arvif, sta->addr);
1426 if (ret) {
1427 ath10k_warn("could not clear all peer wep keys (%d)\n", ret);
1428 return ret;
1429 }
1430
1431 return ret;
1432}
1433
1434
1435
1436
1437
1438static int ath10k_update_channel_list(struct ath10k *ar)
1439{
1440 struct ieee80211_hw *hw = ar->hw;
1441 struct ieee80211_supported_band **bands;
1442 enum ieee80211_band band;
1443 struct ieee80211_channel *channel;
1444 struct wmi_scan_chan_list_arg arg = {0};
1445 struct wmi_channel_arg *ch;
1446 bool passive;
1447 int len;
1448 int ret;
1449 int i;
1450
1451 lockdep_assert_held(&ar->conf_mutex);
1452
1453 bands = hw->wiphy->bands;
1454 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
1455 if (!bands[band])
1456 continue;
1457
1458 for (i = 0; i < bands[band]->n_channels; i++) {
1459 if (bands[band]->channels[i].flags &
1460 IEEE80211_CHAN_DISABLED)
1461 continue;
1462
1463 arg.n_channels++;
1464 }
1465 }
1466
1467 len = sizeof(struct wmi_channel_arg) * arg.n_channels;
1468 arg.channels = kzalloc(len, GFP_KERNEL);
1469 if (!arg.channels)
1470 return -ENOMEM;
1471
1472 ch = arg.channels;
1473 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
1474 if (!bands[band])
1475 continue;
1476
1477 for (i = 0; i < bands[band]->n_channels; i++) {
1478 channel = &bands[band]->channels[i];
1479
1480 if (channel->flags & IEEE80211_CHAN_DISABLED)
1481 continue;
1482
1483 ch->allow_ht = true;
1484
1485
1486 ch->allow_vht = true;
1487
1488 ch->allow_ibss =
1489 !(channel->flags & IEEE80211_CHAN_NO_IR);
1490
1491 ch->ht40plus =
1492 !(channel->flags & IEEE80211_CHAN_NO_HT40PLUS);
1493
1494 ch->chan_radar =
1495 !!(channel->flags & IEEE80211_CHAN_RADAR);
1496
1497 passive = channel->flags & IEEE80211_CHAN_NO_IR;
1498 ch->passive = passive;
1499
1500 ch->freq = channel->center_freq;
1501 ch->min_power = 0;
1502 ch->max_power = channel->max_power * 2;
1503 ch->max_reg_power = channel->max_reg_power * 2;
1504 ch->max_antenna_gain = channel->max_antenna_gain * 2;
1505 ch->reg_class_id = 0;
1506
1507
1508
1509
1510 if (channel->band == IEEE80211_BAND_2GHZ)
1511 ch->mode = MODE_11G;
1512 else
1513 ch->mode = MODE_11A;
1514
1515 if (WARN_ON_ONCE(ch->mode == MODE_UNKNOWN))
1516 continue;
1517
1518 ath10k_dbg(ATH10K_DBG_WMI,
1519 "mac channel [%zd/%d] freq %d maxpower %d regpower %d antenna %d mode %d\n",
1520 ch - arg.channels, arg.n_channels,
1521 ch->freq, ch->max_power, ch->max_reg_power,
1522 ch->max_antenna_gain, ch->mode);
1523
1524 ch++;
1525 }
1526 }
1527
1528 ret = ath10k_wmi_scan_chan_list(ar, &arg);
1529 kfree(arg.channels);
1530
1531 return ret;
1532}
1533
1534static void ath10k_regd_update(struct ath10k *ar)
1535{
1536 struct reg_dmn_pair_mapping *regpair;
1537 int ret;
1538
1539 lockdep_assert_held(&ar->conf_mutex);
1540
1541 ret = ath10k_update_channel_list(ar);
1542 if (ret)
1543 ath10k_warn("could not update channel list (%d)\n", ret);
1544
1545 regpair = ar->ath_common.regulatory.regpair;
1546
1547
1548
1549 ret = ath10k_wmi_pdev_set_regdomain(ar,
1550 regpair->regDmnEnum,
1551 regpair->regDmnEnum,
1552 regpair->regDmnEnum,
1553 regpair->reg_2ghz_ctl,
1554 regpair->reg_5ghz_ctl);
1555 if (ret)
1556 ath10k_warn("could not set pdev regdomain (%d)\n", ret);
1557}
1558
1559static void ath10k_reg_notifier(struct wiphy *wiphy,
1560 struct regulatory_request *request)
1561{
1562 struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
1563 struct ath10k *ar = hw->priv;
1564 bool result;
1565
1566 ath_reg_notifier_apply(wiphy, request, &ar->ath_common.regulatory);
1567
1568 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) {
1569 ath10k_dbg(ATH10K_DBG_REGULATORY, "dfs region 0x%x\n",
1570 request->dfs_region);
1571 result = ar->dfs_detector->set_dfs_domain(ar->dfs_detector,
1572 request->dfs_region);
1573 if (!result)
1574 ath10k_warn("dfs region 0x%X not supported, will trigger radar for every pulse\n",
1575 request->dfs_region);
1576 }
1577
1578 mutex_lock(&ar->conf_mutex);
1579 if (ar->state == ATH10K_STATE_ON)
1580 ath10k_regd_update(ar);
1581 mutex_unlock(&ar->conf_mutex);
1582}
1583
1584
1585
1586
1587
1588static u8 ath10k_tx_h_get_tid(struct ieee80211_hdr *hdr)
1589{
1590 if (ieee80211_is_mgmt(hdr->frame_control))
1591 return HTT_DATA_TX_EXT_TID_MGMT;
1592
1593 if (!ieee80211_is_data_qos(hdr->frame_control))
1594 return HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
1595
1596 if (!is_unicast_ether_addr(ieee80211_get_DA(hdr)))
1597 return HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
1598
1599 return ieee80211_get_qos_ctl(hdr)[0] & IEEE80211_QOS_CTL_TID_MASK;
1600}
1601
1602static u8 ath10k_tx_h_get_vdev_id(struct ath10k *ar,
1603 struct ieee80211_tx_info *info)
1604{
1605 if (info->control.vif)
1606 return ath10k_vif_to_arvif(info->control.vif)->vdev_id;
1607
1608 if (ar->monitor_enabled)
1609 return ar->monitor_vdev_id;
1610
1611 ath10k_warn("could not resolve vdev id\n");
1612 return 0;
1613}
1614
1615
1616
1617
1618
1619static void ath10k_tx_h_qos_workaround(struct ieee80211_hw *hw,
1620 struct ieee80211_tx_control *control,
1621 struct sk_buff *skb)
1622{
1623 struct ieee80211_hdr *hdr = (void *)skb->data;
1624 u8 *qos_ctl;
1625
1626 if (!ieee80211_is_data_qos(hdr->frame_control))
1627 return;
1628
1629 qos_ctl = ieee80211_get_qos_ctl(hdr);
1630 memmove(skb->data + IEEE80211_QOS_CTL_LEN,
1631 skb->data, (void *)qos_ctl - (void *)skb->data);
1632 skb_pull(skb, IEEE80211_QOS_CTL_LEN);
1633}
1634
1635static void ath10k_tx_wep_key_work(struct work_struct *work)
1636{
1637 struct ath10k_vif *arvif = container_of(work, struct ath10k_vif,
1638 wep_key_work);
1639 int ret, keyidx = arvif->def_wep_key_newidx;
1640
1641 if (arvif->def_wep_key_idx == keyidx)
1642 return;
1643
1644 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d set keyidx %d\n",
1645 arvif->vdev_id, keyidx);
1646
1647 ret = ath10k_wmi_vdev_set_param(arvif->ar,
1648 arvif->vdev_id,
1649 arvif->ar->wmi.vdev_param->def_keyid,
1650 keyidx);
1651 if (ret) {
1652 ath10k_warn("could not update wep keyidx (%d)\n", ret);
1653 return;
1654 }
1655
1656 arvif->def_wep_key_idx = keyidx;
1657}
1658
1659static void ath10k_tx_h_update_wep_key(struct sk_buff *skb)
1660{
1661 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
1662 struct ieee80211_vif *vif = info->control.vif;
1663 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1664 struct ath10k *ar = arvif->ar;
1665 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
1666 struct ieee80211_key_conf *key = info->control.hw_key;
1667
1668 if (!ieee80211_has_protected(hdr->frame_control))
1669 return;
1670
1671 if (!key)
1672 return;
1673
1674 if (key->cipher != WLAN_CIPHER_SUITE_WEP40 &&
1675 key->cipher != WLAN_CIPHER_SUITE_WEP104)
1676 return;
1677
1678 if (key->keyidx == arvif->def_wep_key_idx)
1679 return;
1680
1681
1682
1683
1684 arvif->def_wep_key_newidx = key->keyidx;
1685 ieee80211_queue_work(ar->hw, &arvif->wep_key_work);
1686}
1687
1688static void ath10k_tx_h_add_p2p_noa_ie(struct ath10k *ar, struct sk_buff *skb)
1689{
1690 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
1691 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
1692 struct ieee80211_vif *vif = info->control.vif;
1693 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1694
1695
1696 if (arvif->vdev_type != WMI_VDEV_TYPE_AP ||
1697 arvif->vdev_subtype != WMI_VDEV_SUBTYPE_P2P_GO)
1698 return;
1699
1700 if (unlikely(ieee80211_is_probe_resp(hdr->frame_control))) {
1701 spin_lock_bh(&ar->data_lock);
1702 if (arvif->u.ap.noa_data)
1703 if (!pskb_expand_head(skb, 0, arvif->u.ap.noa_len,
1704 GFP_ATOMIC))
1705 memcpy(skb_put(skb, arvif->u.ap.noa_len),
1706 arvif->u.ap.noa_data,
1707 arvif->u.ap.noa_len);
1708 spin_unlock_bh(&ar->data_lock);
1709 }
1710}
1711
1712static void ath10k_tx_htt(struct ath10k *ar, struct sk_buff *skb)
1713{
1714 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
1715 int ret = 0;
1716
1717 if (ar->htt.target_version_major >= 3) {
1718
1719 ret = ath10k_htt_tx(&ar->htt, skb);
1720 goto exit;
1721 }
1722
1723 if (ieee80211_is_mgmt(hdr->frame_control)) {
1724 if (test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX,
1725 ar->fw_features)) {
1726 if (skb_queue_len(&ar->wmi_mgmt_tx_queue) >=
1727 ATH10K_MAX_NUM_MGMT_PENDING) {
1728 ath10k_warn("wmi mgmt_tx queue limit reached\n");
1729 ret = -EBUSY;
1730 goto exit;
1731 }
1732
1733 skb_queue_tail(&ar->wmi_mgmt_tx_queue, skb);
1734 ieee80211_queue_work(ar->hw, &ar->wmi_mgmt_tx_work);
1735 } else {
1736 ret = ath10k_htt_mgmt_tx(&ar->htt, skb);
1737 }
1738 } else if (!test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX,
1739 ar->fw_features) &&
1740 ieee80211_is_nullfunc(hdr->frame_control)) {
1741
1742
1743
1744
1745 ret = ath10k_htt_mgmt_tx(&ar->htt, skb);
1746 } else {
1747 ret = ath10k_htt_tx(&ar->htt, skb);
1748 }
1749
1750exit:
1751 if (ret) {
1752 ath10k_warn("tx failed (%d). dropping packet.\n", ret);
1753 ieee80211_free_txskb(ar->hw, skb);
1754 }
1755}
1756
1757void ath10k_offchan_tx_purge(struct ath10k *ar)
1758{
1759 struct sk_buff *skb;
1760
1761 for (;;) {
1762 skb = skb_dequeue(&ar->offchan_tx_queue);
1763 if (!skb)
1764 break;
1765
1766 ieee80211_free_txskb(ar->hw, skb);
1767 }
1768}
1769
1770void ath10k_offchan_tx_work(struct work_struct *work)
1771{
1772 struct ath10k *ar = container_of(work, struct ath10k, offchan_tx_work);
1773 struct ath10k_peer *peer;
1774 struct ieee80211_hdr *hdr;
1775 struct sk_buff *skb;
1776 const u8 *peer_addr;
1777 int vdev_id;
1778 int ret;
1779
1780
1781
1782
1783
1784
1785
1786
1787 for (;;) {
1788 skb = skb_dequeue(&ar->offchan_tx_queue);
1789 if (!skb)
1790 break;
1791
1792 mutex_lock(&ar->conf_mutex);
1793
1794 ath10k_dbg(ATH10K_DBG_MAC, "mac offchannel skb %p\n",
1795 skb);
1796
1797 hdr = (struct ieee80211_hdr *)skb->data;
1798 peer_addr = ieee80211_get_DA(hdr);
1799 vdev_id = ATH10K_SKB_CB(skb)->vdev_id;
1800
1801 spin_lock_bh(&ar->data_lock);
1802 peer = ath10k_peer_find(ar, vdev_id, peer_addr);
1803 spin_unlock_bh(&ar->data_lock);
1804
1805 if (peer)
1806
1807 ath10k_dbg(ATH10K_DBG_MAC, "peer %pM on vdev %d already present\n",
1808 peer_addr, vdev_id);
1809
1810 if (!peer) {
1811 ret = ath10k_peer_create(ar, vdev_id, peer_addr);
1812 if (ret)
1813 ath10k_warn("peer %pM on vdev %d not created (%d)\n",
1814 peer_addr, vdev_id, ret);
1815 }
1816
1817 spin_lock_bh(&ar->data_lock);
1818 reinit_completion(&ar->offchan_tx_completed);
1819 ar->offchan_tx_skb = skb;
1820 spin_unlock_bh(&ar->data_lock);
1821
1822 ath10k_tx_htt(ar, skb);
1823
1824 ret = wait_for_completion_timeout(&ar->offchan_tx_completed,
1825 3 * HZ);
1826 if (ret <= 0)
1827 ath10k_warn("timed out waiting for offchannel skb %p\n",
1828 skb);
1829
1830 if (!peer) {
1831 ret = ath10k_peer_delete(ar, vdev_id, peer_addr);
1832 if (ret)
1833 ath10k_warn("peer %pM on vdev %d not deleted (%d)\n",
1834 peer_addr, vdev_id, ret);
1835 }
1836
1837 mutex_unlock(&ar->conf_mutex);
1838 }
1839}
1840
1841void ath10k_mgmt_over_wmi_tx_purge(struct ath10k *ar)
1842{
1843 struct sk_buff *skb;
1844
1845 for (;;) {
1846 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
1847 if (!skb)
1848 break;
1849
1850 ieee80211_free_txskb(ar->hw, skb);
1851 }
1852}
1853
1854void ath10k_mgmt_over_wmi_tx_work(struct work_struct *work)
1855{
1856 struct ath10k *ar = container_of(work, struct ath10k, wmi_mgmt_tx_work);
1857 struct sk_buff *skb;
1858 int ret;
1859
1860 for (;;) {
1861 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
1862 if (!skb)
1863 break;
1864
1865 ret = ath10k_wmi_mgmt_tx(ar, skb);
1866 if (ret) {
1867 ath10k_warn("wmi mgmt_tx failed (%d)\n", ret);
1868 ieee80211_free_txskb(ar->hw, skb);
1869 }
1870 }
1871}
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882void ath10k_reset_scan(unsigned long ptr)
1883{
1884 struct ath10k *ar = (struct ath10k *)ptr;
1885
1886 spin_lock_bh(&ar->data_lock);
1887 if (!ar->scan.in_progress) {
1888 spin_unlock_bh(&ar->data_lock);
1889 return;
1890 }
1891
1892 ath10k_warn("scan timeout. resetting. fw issue?\n");
1893
1894 if (ar->scan.is_roc)
1895 ieee80211_remain_on_channel_expired(ar->hw);
1896 else
1897 ieee80211_scan_completed(ar->hw, 1 );
1898
1899 ar->scan.in_progress = false;
1900 complete_all(&ar->scan.completed);
1901 spin_unlock_bh(&ar->data_lock);
1902}
1903
1904static int ath10k_abort_scan(struct ath10k *ar)
1905{
1906 struct wmi_stop_scan_arg arg = {
1907 .req_id = 1,
1908 .req_type = WMI_SCAN_STOP_ONE,
1909 .u.scan_id = ATH10K_SCAN_ID,
1910 };
1911 int ret;
1912
1913 lockdep_assert_held(&ar->conf_mutex);
1914
1915 del_timer_sync(&ar->scan.timeout);
1916
1917 spin_lock_bh(&ar->data_lock);
1918 if (!ar->scan.in_progress) {
1919 spin_unlock_bh(&ar->data_lock);
1920 return 0;
1921 }
1922
1923 ar->scan.aborting = true;
1924 spin_unlock_bh(&ar->data_lock);
1925
1926 ret = ath10k_wmi_stop_scan(ar, &arg);
1927 if (ret) {
1928 ath10k_warn("could not submit wmi stop scan (%d)\n", ret);
1929 spin_lock_bh(&ar->data_lock);
1930 ar->scan.in_progress = false;
1931 ath10k_offchan_tx_purge(ar);
1932 spin_unlock_bh(&ar->data_lock);
1933 return -EIO;
1934 }
1935
1936 ret = wait_for_completion_timeout(&ar->scan.completed, 3*HZ);
1937 if (ret == 0)
1938 ath10k_warn("timed out while waiting for scan to stop\n");
1939
1940
1941
1942
1943
1944 ret = 0;
1945
1946 spin_lock_bh(&ar->data_lock);
1947 if (ar->scan.in_progress) {
1948 ath10k_warn("could not stop scan. its still in progress\n");
1949 ar->scan.in_progress = false;
1950 ath10k_offchan_tx_purge(ar);
1951 ret = -ETIMEDOUT;
1952 }
1953 spin_unlock_bh(&ar->data_lock);
1954
1955 return ret;
1956}
1957
1958static int ath10k_start_scan(struct ath10k *ar,
1959 const struct wmi_start_scan_arg *arg)
1960{
1961 int ret;
1962
1963 lockdep_assert_held(&ar->conf_mutex);
1964
1965 ret = ath10k_wmi_start_scan(ar, arg);
1966 if (ret)
1967 return ret;
1968
1969 ret = wait_for_completion_timeout(&ar->scan.started, 1*HZ);
1970 if (ret == 0) {
1971 ath10k_abort_scan(ar);
1972 return ret;
1973 }
1974
1975
1976
1977
1978
1979
1980 mod_timer(&ar->scan.timeout, jiffies +
1981 msecs_to_jiffies(arg->max_scan_time+200));
1982 return 0;
1983}
1984
1985
1986
1987
1988
1989static void ath10k_tx(struct ieee80211_hw *hw,
1990 struct ieee80211_tx_control *control,
1991 struct sk_buff *skb)
1992{
1993 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
1994 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
1995 struct ath10k *ar = hw->priv;
1996 u8 tid, vdev_id;
1997
1998
1999 if (info->flags & IEEE80211_TX_CTL_NO_CCK_RATE)
2000 ath10k_dbg(ATH10K_DBG_MAC, "IEEE80211_TX_CTL_NO_CCK_RATE\n");
2001
2002
2003
2004 tid = ath10k_tx_h_get_tid(hdr);
2005 vdev_id = ath10k_tx_h_get_vdev_id(ar, info);
2006
2007
2008 if (info->control.vif &&
2009 info->control.vif->type != NL80211_IFTYPE_MONITOR) {
2010 ath10k_tx_h_qos_workaround(hw, control, skb);
2011 ath10k_tx_h_update_wep_key(skb);
2012 ath10k_tx_h_add_p2p_noa_ie(ar, skb);
2013 ath10k_tx_h_seq_no(skb);
2014 }
2015
2016 ATH10K_SKB_CB(skb)->vdev_id = vdev_id;
2017 ATH10K_SKB_CB(skb)->htt.is_offchan = false;
2018 ATH10K_SKB_CB(skb)->htt.tid = tid;
2019
2020 if (info->flags & IEEE80211_TX_CTL_TX_OFFCHAN) {
2021 spin_lock_bh(&ar->data_lock);
2022 ATH10K_SKB_CB(skb)->htt.is_offchan = true;
2023 ATH10K_SKB_CB(skb)->vdev_id = ar->scan.vdev_id;
2024 spin_unlock_bh(&ar->data_lock);
2025
2026 ath10k_dbg(ATH10K_DBG_MAC, "queued offchannel skb %p\n", skb);
2027
2028 skb_queue_tail(&ar->offchan_tx_queue, skb);
2029 ieee80211_queue_work(hw, &ar->offchan_tx_work);
2030 return;
2031 }
2032
2033 ath10k_tx_htt(ar, skb);
2034}
2035
2036
2037
2038
2039void ath10k_halt(struct ath10k *ar)
2040{
2041 lockdep_assert_held(&ar->conf_mutex);
2042
2043 ath10k_stop_cac(ar);
2044 del_timer_sync(&ar->scan.timeout);
2045 ath10k_offchan_tx_purge(ar);
2046 ath10k_mgmt_over_wmi_tx_purge(ar);
2047 ath10k_peer_cleanup_all(ar);
2048 ath10k_core_stop(ar);
2049 ath10k_hif_power_down(ar);
2050
2051 spin_lock_bh(&ar->data_lock);
2052 if (ar->scan.in_progress) {
2053 del_timer(&ar->scan.timeout);
2054 ar->scan.in_progress = false;
2055 ieee80211_scan_completed(ar->hw, true);
2056 }
2057 spin_unlock_bh(&ar->data_lock);
2058}
2059
2060static int ath10k_start(struct ieee80211_hw *hw)
2061{
2062 struct ath10k *ar = hw->priv;
2063 int ret = 0;
2064
2065 mutex_lock(&ar->conf_mutex);
2066
2067 if (ar->state != ATH10K_STATE_OFF &&
2068 ar->state != ATH10K_STATE_RESTARTING) {
2069 ret = -EINVAL;
2070 goto exit;
2071 }
2072
2073 ret = ath10k_hif_power_up(ar);
2074 if (ret) {
2075 ath10k_err("could not init hif (%d)\n", ret);
2076 ar->state = ATH10K_STATE_OFF;
2077 goto exit;
2078 }
2079
2080 ret = ath10k_core_start(ar);
2081 if (ret) {
2082 ath10k_err("could not init core (%d)\n", ret);
2083 ath10k_hif_power_down(ar);
2084 ar->state = ATH10K_STATE_OFF;
2085 goto exit;
2086 }
2087
2088 if (ar->state == ATH10K_STATE_OFF)
2089 ar->state = ATH10K_STATE_ON;
2090 else if (ar->state == ATH10K_STATE_RESTARTING)
2091 ar->state = ATH10K_STATE_RESTARTED;
2092
2093 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->pmf_qos, 1);
2094 if (ret)
2095 ath10k_warn("could not enable WMI_PDEV_PARAM_PMF_QOS (%d)\n",
2096 ret);
2097
2098 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->dynamic_bw, 1);
2099 if (ret)
2100 ath10k_warn("could not init WMI_PDEV_PARAM_DYNAMIC_BW (%d)\n",
2101 ret);
2102
2103 ath10k_regd_update(ar);
2104
2105exit:
2106 mutex_unlock(&ar->conf_mutex);
2107 return 0;
2108}
2109
2110static void ath10k_stop(struct ieee80211_hw *hw)
2111{
2112 struct ath10k *ar = hw->priv;
2113
2114 mutex_lock(&ar->conf_mutex);
2115 if (ar->state == ATH10K_STATE_ON ||
2116 ar->state == ATH10K_STATE_RESTARTED ||
2117 ar->state == ATH10K_STATE_WEDGED)
2118 ath10k_halt(ar);
2119
2120 ar->state = ATH10K_STATE_OFF;
2121 mutex_unlock(&ar->conf_mutex);
2122
2123 ath10k_mgmt_over_wmi_tx_purge(ar);
2124
2125 cancel_work_sync(&ar->offchan_tx_work);
2126 cancel_work_sync(&ar->wmi_mgmt_tx_work);
2127 cancel_work_sync(&ar->restart_work);
2128}
2129
2130static int ath10k_config_ps(struct ath10k *ar)
2131{
2132 struct ath10k_vif *arvif;
2133 int ret = 0;
2134
2135 lockdep_assert_held(&ar->conf_mutex);
2136
2137 list_for_each_entry(arvif, &ar->arvifs, list) {
2138 ret = ath10k_mac_vif_setup_ps(arvif);
2139 if (ret) {
2140 ath10k_warn("could not setup powersave (%d)\n", ret);
2141 break;
2142 }
2143 }
2144
2145 return ret;
2146}
2147
2148static int ath10k_config(struct ieee80211_hw *hw, u32 changed)
2149{
2150 struct ath10k *ar = hw->priv;
2151 struct ieee80211_conf *conf = &hw->conf;
2152 int ret = 0;
2153 u32 param;
2154
2155 mutex_lock(&ar->conf_mutex);
2156
2157 if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
2158 ath10k_dbg(ATH10K_DBG_MAC,
2159 "mac config channel %d mhz flags 0x%x\n",
2160 conf->chandef.chan->center_freq,
2161 conf->chandef.chan->flags);
2162
2163 spin_lock_bh(&ar->data_lock);
2164 ar->rx_channel = conf->chandef.chan;
2165 spin_unlock_bh(&ar->data_lock);
2166
2167 ath10k_config_radar_detection(ar);
2168 }
2169
2170 if (changed & IEEE80211_CONF_CHANGE_POWER) {
2171 ath10k_dbg(ATH10K_DBG_MAC, "mac config power %d\n",
2172 hw->conf.power_level);
2173
2174 param = ar->wmi.pdev_param->txpower_limit2g;
2175 ret = ath10k_wmi_pdev_set_param(ar, param,
2176 hw->conf.power_level * 2);
2177 if (ret)
2178 ath10k_warn("mac failed to set 2g txpower %d (%d)\n",
2179 hw->conf.power_level, ret);
2180
2181 param = ar->wmi.pdev_param->txpower_limit5g;
2182 ret = ath10k_wmi_pdev_set_param(ar, param,
2183 hw->conf.power_level * 2);
2184 if (ret)
2185 ath10k_warn("mac failed to set 5g txpower %d (%d)\n",
2186 hw->conf.power_level, ret);
2187 }
2188
2189 if (changed & IEEE80211_CONF_CHANGE_PS)
2190 ath10k_config_ps(ar);
2191
2192 if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
2193 if (conf->flags & IEEE80211_CONF_MONITOR)
2194 ret = ath10k_monitor_create(ar);
2195 else
2196 ret = ath10k_monitor_destroy(ar);
2197 }
2198
2199 mutex_unlock(&ar->conf_mutex);
2200 return ret;
2201}
2202
2203
2204
2205
2206
2207
2208
2209
2210static int ath10k_add_interface(struct ieee80211_hw *hw,
2211 struct ieee80211_vif *vif)
2212{
2213 struct ath10k *ar = hw->priv;
2214 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2215 enum wmi_sta_powersave_param param;
2216 int ret = 0;
2217 u32 value, param_id;
2218 int bit;
2219 u32 vdev_param;
2220
2221 mutex_lock(&ar->conf_mutex);
2222
2223 memset(arvif, 0, sizeof(*arvif));
2224
2225 arvif->ar = ar;
2226 arvif->vif = vif;
2227
2228 INIT_WORK(&arvif->wep_key_work, ath10k_tx_wep_key_work);
2229 INIT_LIST_HEAD(&arvif->list);
2230
2231 if ((vif->type == NL80211_IFTYPE_MONITOR) && ar->monitor_present) {
2232 ath10k_warn("Only one monitor interface allowed\n");
2233 ret = -EBUSY;
2234 goto err;
2235 }
2236
2237 bit = ffs(ar->free_vdev_map);
2238 if (bit == 0) {
2239 ret = -EBUSY;
2240 goto err;
2241 }
2242
2243 arvif->vdev_id = bit - 1;
2244 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE;
2245
2246 if (ar->p2p)
2247 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_DEVICE;
2248
2249 switch (vif->type) {
2250 case NL80211_IFTYPE_UNSPECIFIED:
2251 case NL80211_IFTYPE_STATION:
2252 arvif->vdev_type = WMI_VDEV_TYPE_STA;
2253 if (vif->p2p)
2254 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_CLIENT;
2255 break;
2256 case NL80211_IFTYPE_ADHOC:
2257 arvif->vdev_type = WMI_VDEV_TYPE_IBSS;
2258 break;
2259 case NL80211_IFTYPE_AP:
2260 arvif->vdev_type = WMI_VDEV_TYPE_AP;
2261
2262 if (vif->p2p)
2263 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_GO;
2264 break;
2265 case NL80211_IFTYPE_MONITOR:
2266 arvif->vdev_type = WMI_VDEV_TYPE_MONITOR;
2267 break;
2268 default:
2269 WARN_ON(1);
2270 break;
2271 }
2272
2273 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev create %d (add interface) type %d subtype %d\n",
2274 arvif->vdev_id, arvif->vdev_type, arvif->vdev_subtype);
2275
2276 ret = ath10k_wmi_vdev_create(ar, arvif->vdev_id, arvif->vdev_type,
2277 arvif->vdev_subtype, vif->addr);
2278 if (ret) {
2279 ath10k_warn("WMI vdev create failed: ret %d\n", ret);
2280 goto err;
2281 }
2282
2283 ar->free_vdev_map &= ~BIT(arvif->vdev_id);
2284 list_add(&arvif->list, &ar->arvifs);
2285
2286 vdev_param = ar->wmi.vdev_param->def_keyid;
2287 ret = ath10k_wmi_vdev_set_param(ar, 0, vdev_param,
2288 arvif->def_wep_key_idx);
2289 if (ret) {
2290 ath10k_warn("Failed to set default keyid: %d\n", ret);
2291 goto err_vdev_delete;
2292 }
2293
2294 vdev_param = ar->wmi.vdev_param->tx_encap_type;
2295 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
2296 ATH10K_HW_TXRX_NATIVE_WIFI);
2297
2298 if (ret && ret != -EOPNOTSUPP) {
2299 ath10k_warn("Failed to set TX encap: %d\n", ret);
2300 goto err_vdev_delete;
2301 }
2302
2303 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
2304 ret = ath10k_peer_create(ar, arvif->vdev_id, vif->addr);
2305 if (ret) {
2306 ath10k_warn("Failed to create peer for AP: %d\n", ret);
2307 goto err_vdev_delete;
2308 }
2309
2310 param_id = ar->wmi.pdev_param->sta_kickout_th;
2311
2312
2313 ret = ath10k_wmi_pdev_set_param(ar, param_id, 0);
2314 if (ret)
2315 ath10k_warn("Failed to disable STA KICKOUT\n");
2316 }
2317
2318 if (arvif->vdev_type == WMI_VDEV_TYPE_STA) {
2319 param = WMI_STA_PS_PARAM_RX_WAKE_POLICY;
2320 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
2321 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
2322 param, value);
2323 if (ret) {
2324 ath10k_warn("Failed to set RX wake policy: %d\n", ret);
2325 goto err_peer_delete;
2326 }
2327
2328 param = WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD;
2329 value = WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS;
2330 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
2331 param, value);
2332 if (ret) {
2333 ath10k_warn("Failed to set TX wake thresh: %d\n", ret);
2334 goto err_peer_delete;
2335 }
2336
2337 param = WMI_STA_PS_PARAM_PSPOLL_COUNT;
2338 value = WMI_STA_PS_PSPOLL_COUNT_NO_MAX;
2339 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
2340 param, value);
2341 if (ret) {
2342 ath10k_warn("Failed to set PSPOLL count: %d\n", ret);
2343 goto err_peer_delete;
2344 }
2345 }
2346
2347 ret = ath10k_mac_set_rts(arvif, ar->hw->wiphy->rts_threshold);
2348 if (ret) {
2349 ath10k_warn("failed to set rts threshold for vdev %d (%d)\n",
2350 arvif->vdev_id, ret);
2351 goto err_peer_delete;
2352 }
2353
2354 ret = ath10k_mac_set_frag(arvif, ar->hw->wiphy->frag_threshold);
2355 if (ret) {
2356 ath10k_warn("failed to set frag threshold for vdev %d (%d)\n",
2357 arvif->vdev_id, ret);
2358 goto err_peer_delete;
2359 }
2360
2361 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
2362 ar->monitor_present = true;
2363
2364 mutex_unlock(&ar->conf_mutex);
2365 return 0;
2366
2367err_peer_delete:
2368 if (arvif->vdev_type == WMI_VDEV_TYPE_AP)
2369 ath10k_wmi_peer_delete(ar, arvif->vdev_id, vif->addr);
2370
2371err_vdev_delete:
2372 ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
2373 ar->free_vdev_map &= ~BIT(arvif->vdev_id);
2374 list_del(&arvif->list);
2375
2376err:
2377 mutex_unlock(&ar->conf_mutex);
2378
2379 return ret;
2380}
2381
2382static void ath10k_remove_interface(struct ieee80211_hw *hw,
2383 struct ieee80211_vif *vif)
2384{
2385 struct ath10k *ar = hw->priv;
2386 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2387 int ret;
2388
2389 mutex_lock(&ar->conf_mutex);
2390
2391 cancel_work_sync(&arvif->wep_key_work);
2392
2393 spin_lock_bh(&ar->data_lock);
2394 if (arvif->beacon) {
2395 dev_kfree_skb_any(arvif->beacon);
2396 arvif->beacon = NULL;
2397 }
2398 spin_unlock_bh(&ar->data_lock);
2399
2400 ar->free_vdev_map |= 1 << (arvif->vdev_id);
2401 list_del(&arvif->list);
2402
2403 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
2404 ret = ath10k_peer_delete(arvif->ar, arvif->vdev_id, vif->addr);
2405 if (ret)
2406 ath10k_warn("Failed to remove peer for AP: %d\n", ret);
2407
2408 kfree(arvif->u.ap.noa_data);
2409 }
2410
2411 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev delete %d (remove interface)\n",
2412 arvif->vdev_id);
2413
2414 ret = ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
2415 if (ret)
2416 ath10k_warn("WMI vdev delete failed: %d\n", ret);
2417
2418 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
2419 ar->monitor_present = false;
2420
2421 ath10k_peer_cleanup(ar, arvif->vdev_id);
2422
2423 mutex_unlock(&ar->conf_mutex);
2424}
2425
2426
2427
2428
2429#define SUPPORTED_FILTERS \
2430 (FIF_PROMISC_IN_BSS | \
2431 FIF_ALLMULTI | \
2432 FIF_CONTROL | \
2433 FIF_PSPOLL | \
2434 FIF_OTHER_BSS | \
2435 FIF_BCN_PRBRESP_PROMISC | \
2436 FIF_PROBE_REQ | \
2437 FIF_FCSFAIL)
2438
2439static void ath10k_configure_filter(struct ieee80211_hw *hw,
2440 unsigned int changed_flags,
2441 unsigned int *total_flags,
2442 u64 multicast)
2443{
2444 struct ath10k *ar = hw->priv;
2445 int ret;
2446
2447 mutex_lock(&ar->conf_mutex);
2448
2449 changed_flags &= SUPPORTED_FILTERS;
2450 *total_flags &= SUPPORTED_FILTERS;
2451 ar->filter_flags = *total_flags;
2452
2453
2454
2455
2456
2457
2458
2459 if ((ar->filter_flags & FIF_PROMISC_IN_BSS) &&
2460 !ar->monitor_enabled && ar->monitor_present) {
2461 ath10k_dbg(ATH10K_DBG_MAC, "mac monitor %d start\n",
2462 ar->monitor_vdev_id);
2463
2464 ret = ath10k_monitor_start(ar, ar->monitor_vdev_id);
2465 if (ret)
2466 ath10k_warn("Unable to start monitor mode\n");
2467 } else if (!(ar->filter_flags & FIF_PROMISC_IN_BSS) &&
2468 ar->monitor_enabled && ar->monitor_present) {
2469 ath10k_dbg(ATH10K_DBG_MAC, "mac monitor %d stop\n",
2470 ar->monitor_vdev_id);
2471
2472 ret = ath10k_monitor_stop(ar);
2473 if (ret)
2474 ath10k_warn("Unable to stop monitor mode\n");
2475 }
2476
2477 mutex_unlock(&ar->conf_mutex);
2478}
2479
2480static void ath10k_bss_info_changed(struct ieee80211_hw *hw,
2481 struct ieee80211_vif *vif,
2482 struct ieee80211_bss_conf *info,
2483 u32 changed)
2484{
2485 struct ath10k *ar = hw->priv;
2486 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2487 int ret = 0;
2488 u32 vdev_param, pdev_param;
2489
2490 mutex_lock(&ar->conf_mutex);
2491
2492 if (changed & BSS_CHANGED_IBSS)
2493 ath10k_control_ibss(arvif, info, vif->addr);
2494
2495 if (changed & BSS_CHANGED_BEACON_INT) {
2496 arvif->beacon_interval = info->beacon_int;
2497 vdev_param = ar->wmi.vdev_param->beacon_interval;
2498 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
2499 arvif->beacon_interval);
2500 ath10k_dbg(ATH10K_DBG_MAC,
2501 "mac vdev %d beacon_interval %d\n",
2502 arvif->vdev_id, arvif->beacon_interval);
2503
2504 if (ret)
2505 ath10k_warn("Failed to set beacon interval for VDEV: %d\n",
2506 arvif->vdev_id);
2507 }
2508
2509 if (changed & BSS_CHANGED_BEACON) {
2510 ath10k_dbg(ATH10K_DBG_MAC,
2511 "vdev %d set beacon tx mode to staggered\n",
2512 arvif->vdev_id);
2513
2514 pdev_param = ar->wmi.pdev_param->beacon_tx_mode;
2515 ret = ath10k_wmi_pdev_set_param(ar, pdev_param,
2516 WMI_BEACON_STAGGERED_MODE);
2517 if (ret)
2518 ath10k_warn("Failed to set beacon mode for VDEV: %d\n",
2519 arvif->vdev_id);
2520 }
2521
2522 if (changed & BSS_CHANGED_BEACON_INFO) {
2523 arvif->dtim_period = info->dtim_period;
2524
2525 ath10k_dbg(ATH10K_DBG_MAC,
2526 "mac vdev %d dtim_period %d\n",
2527 arvif->vdev_id, arvif->dtim_period);
2528
2529 vdev_param = ar->wmi.vdev_param->dtim_period;
2530 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
2531 arvif->dtim_period);
2532 if (ret)
2533 ath10k_warn("Failed to set dtim period for VDEV: %d\n",
2534 arvif->vdev_id);
2535 }
2536
2537 if (changed & BSS_CHANGED_SSID &&
2538 vif->type == NL80211_IFTYPE_AP) {
2539 arvif->u.ap.ssid_len = info->ssid_len;
2540 if (info->ssid_len)
2541 memcpy(arvif->u.ap.ssid, info->ssid, info->ssid_len);
2542 arvif->u.ap.hidden_ssid = info->hidden_ssid;
2543 }
2544
2545 if (changed & BSS_CHANGED_BSSID) {
2546 if (!is_zero_ether_addr(info->bssid)) {
2547 ath10k_dbg(ATH10K_DBG_MAC,
2548 "mac vdev %d create peer %pM\n",
2549 arvif->vdev_id, info->bssid);
2550
2551 ret = ath10k_peer_create(ar, arvif->vdev_id,
2552 info->bssid);
2553 if (ret)
2554 ath10k_warn("Failed to add peer %pM for vdev %d when changin bssid: %i\n",
2555 info->bssid, arvif->vdev_id, ret);
2556
2557 if (vif->type == NL80211_IFTYPE_STATION) {
2558
2559
2560
2561
2562 memcpy(arvif->u.sta.bssid, info->bssid,
2563 ETH_ALEN);
2564
2565 ath10k_dbg(ATH10K_DBG_MAC,
2566 "mac vdev %d start %pM\n",
2567 arvif->vdev_id, info->bssid);
2568
2569
2570 ret = ath10k_vdev_start(arvif);
2571 }
2572
2573
2574
2575
2576
2577
2578 if (vif->type == NL80211_IFTYPE_ADHOC)
2579 memcpy(arvif->u.ibss.bssid, info->bssid,
2580 ETH_ALEN);
2581 }
2582 }
2583
2584 if (changed & BSS_CHANGED_BEACON_ENABLED)
2585 ath10k_control_beaconing(arvif, info);
2586
2587 if (changed & BSS_CHANGED_ERP_CTS_PROT) {
2588 u32 cts_prot;
2589 if (info->use_cts_prot)
2590 cts_prot = 1;
2591 else
2592 cts_prot = 0;
2593
2594 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d cts_prot %d\n",
2595 arvif->vdev_id, cts_prot);
2596
2597 vdev_param = ar->wmi.vdev_param->enable_rtscts;
2598 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
2599 cts_prot);
2600 if (ret)
2601 ath10k_warn("Failed to set CTS prot for VDEV: %d\n",
2602 arvif->vdev_id);
2603 }
2604
2605 if (changed & BSS_CHANGED_ERP_SLOT) {
2606 u32 slottime;
2607 if (info->use_short_slot)
2608 slottime = WMI_VDEV_SLOT_TIME_SHORT;
2609
2610 else
2611 slottime = WMI_VDEV_SLOT_TIME_LONG;
2612
2613 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d slot_time %d\n",
2614 arvif->vdev_id, slottime);
2615
2616 vdev_param = ar->wmi.vdev_param->slot_time;
2617 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
2618 slottime);
2619 if (ret)
2620 ath10k_warn("Failed to set erp slot for VDEV: %d\n",
2621 arvif->vdev_id);
2622 }
2623
2624 if (changed & BSS_CHANGED_ERP_PREAMBLE) {
2625 u32 preamble;
2626 if (info->use_short_preamble)
2627 preamble = WMI_VDEV_PREAMBLE_SHORT;
2628 else
2629 preamble = WMI_VDEV_PREAMBLE_LONG;
2630
2631 ath10k_dbg(ATH10K_DBG_MAC,
2632 "mac vdev %d preamble %dn",
2633 arvif->vdev_id, preamble);
2634
2635 vdev_param = ar->wmi.vdev_param->preamble;
2636 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
2637 preamble);
2638 if (ret)
2639 ath10k_warn("Failed to set preamble for VDEV: %d\n",
2640 arvif->vdev_id);
2641 }
2642
2643 if (changed & BSS_CHANGED_ASSOC) {
2644 if (info->assoc)
2645 ath10k_bss_assoc(hw, vif, info);
2646 }
2647
2648 mutex_unlock(&ar->conf_mutex);
2649}
2650
2651static int ath10k_hw_scan(struct ieee80211_hw *hw,
2652 struct ieee80211_vif *vif,
2653 struct cfg80211_scan_request *req)
2654{
2655 struct ath10k *ar = hw->priv;
2656 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2657 struct wmi_start_scan_arg arg;
2658 int ret = 0;
2659 int i;
2660
2661 mutex_lock(&ar->conf_mutex);
2662
2663 spin_lock_bh(&ar->data_lock);
2664 if (ar->scan.in_progress) {
2665 spin_unlock_bh(&ar->data_lock);
2666 ret = -EBUSY;
2667 goto exit;
2668 }
2669
2670 reinit_completion(&ar->scan.started);
2671 reinit_completion(&ar->scan.completed);
2672 ar->scan.in_progress = true;
2673 ar->scan.aborting = false;
2674 ar->scan.is_roc = false;
2675 ar->scan.vdev_id = arvif->vdev_id;
2676 spin_unlock_bh(&ar->data_lock);
2677
2678 memset(&arg, 0, sizeof(arg));
2679 ath10k_wmi_start_scan_init(ar, &arg);
2680 arg.vdev_id = arvif->vdev_id;
2681 arg.scan_id = ATH10K_SCAN_ID;
2682
2683 if (!req->no_cck)
2684 arg.scan_ctrl_flags |= WMI_SCAN_ADD_CCK_RATES;
2685
2686 if (req->ie_len) {
2687 arg.ie_len = req->ie_len;
2688 memcpy(arg.ie, req->ie, arg.ie_len);
2689 }
2690
2691 if (req->n_ssids) {
2692 arg.n_ssids = req->n_ssids;
2693 for (i = 0; i < arg.n_ssids; i++) {
2694 arg.ssids[i].len = req->ssids[i].ssid_len;
2695 arg.ssids[i].ssid = req->ssids[i].ssid;
2696 }
2697 } else {
2698 arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
2699 }
2700
2701 if (req->n_channels) {
2702 arg.n_channels = req->n_channels;
2703 for (i = 0; i < arg.n_channels; i++)
2704 arg.channels[i] = req->channels[i]->center_freq;
2705 }
2706
2707 ret = ath10k_start_scan(ar, &arg);
2708 if (ret) {
2709 ath10k_warn("could not start hw scan (%d)\n", ret);
2710 spin_lock_bh(&ar->data_lock);
2711 ar->scan.in_progress = false;
2712 spin_unlock_bh(&ar->data_lock);
2713 }
2714
2715exit:
2716 mutex_unlock(&ar->conf_mutex);
2717 return ret;
2718}
2719
2720static void ath10k_cancel_hw_scan(struct ieee80211_hw *hw,
2721 struct ieee80211_vif *vif)
2722{
2723 struct ath10k *ar = hw->priv;
2724 int ret;
2725
2726 mutex_lock(&ar->conf_mutex);
2727 ret = ath10k_abort_scan(ar);
2728 if (ret) {
2729 ath10k_warn("couldn't abort scan (%d). forcefully sending scan completion to mac80211\n",
2730 ret);
2731 ieee80211_scan_completed(hw, 1 );
2732 }
2733 mutex_unlock(&ar->conf_mutex);
2734}
2735
2736static void ath10k_set_key_h_def_keyidx(struct ath10k *ar,
2737 struct ath10k_vif *arvif,
2738 enum set_key_cmd cmd,
2739 struct ieee80211_key_conf *key)
2740{
2741 u32 vdev_param = arvif->ar->wmi.vdev_param->def_keyid;
2742 int ret;
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752 if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
2753 return;
2754
2755 if (key->cipher == WLAN_CIPHER_SUITE_WEP40)
2756 return;
2757
2758 if (key->cipher == WLAN_CIPHER_SUITE_WEP104)
2759 return;
2760
2761 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
2762 return;
2763
2764 if (cmd != SET_KEY)
2765 return;
2766
2767 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
2768 key->keyidx);
2769 if (ret)
2770 ath10k_warn("failed to set group key as default key: %d\n",
2771 ret);
2772}
2773
2774static int ath10k_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
2775 struct ieee80211_vif *vif, struct ieee80211_sta *sta,
2776 struct ieee80211_key_conf *key)
2777{
2778 struct ath10k *ar = hw->priv;
2779 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2780 struct ath10k_peer *peer;
2781 const u8 *peer_addr;
2782 bool is_wep = key->cipher == WLAN_CIPHER_SUITE_WEP40 ||
2783 key->cipher == WLAN_CIPHER_SUITE_WEP104;
2784 int ret = 0;
2785
2786 if (key->keyidx > WMI_MAX_KEY_INDEX)
2787 return -ENOSPC;
2788
2789 mutex_lock(&ar->conf_mutex);
2790
2791 if (sta)
2792 peer_addr = sta->addr;
2793 else if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
2794 peer_addr = vif->bss_conf.bssid;
2795 else
2796 peer_addr = vif->addr;
2797
2798 key->hw_key_idx = key->keyidx;
2799
2800
2801
2802 spin_lock_bh(&ar->data_lock);
2803 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
2804 spin_unlock_bh(&ar->data_lock);
2805
2806 if (!peer) {
2807 if (cmd == SET_KEY) {
2808 ath10k_warn("cannot install key for non-existent peer %pM\n",
2809 peer_addr);
2810 ret = -EOPNOTSUPP;
2811 goto exit;
2812 } else {
2813
2814
2815 goto exit;
2816 }
2817 }
2818
2819 if (is_wep) {
2820 if (cmd == SET_KEY)
2821 arvif->wep_keys[key->keyidx] = key;
2822 else
2823 arvif->wep_keys[key->keyidx] = NULL;
2824
2825 if (cmd == DISABLE_KEY)
2826 ath10k_clear_vdev_key(arvif, key);
2827 }
2828
2829 ret = ath10k_install_key(arvif, key, cmd, peer_addr);
2830 if (ret) {
2831 ath10k_warn("ath10k_install_key failed (%d)\n", ret);
2832 goto exit;
2833 }
2834
2835 ath10k_set_key_h_def_keyidx(ar, arvif, cmd, key);
2836
2837 spin_lock_bh(&ar->data_lock);
2838 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
2839 if (peer && cmd == SET_KEY)
2840 peer->keys[key->keyidx] = key;
2841 else if (peer && cmd == DISABLE_KEY)
2842 peer->keys[key->keyidx] = NULL;
2843 else if (peer == NULL)
2844
2845 ath10k_warn("peer %pM disappeared!\n", peer_addr);
2846 spin_unlock_bh(&ar->data_lock);
2847
2848exit:
2849 mutex_unlock(&ar->conf_mutex);
2850 return ret;
2851}
2852
2853static int ath10k_sta_state(struct ieee80211_hw *hw,
2854 struct ieee80211_vif *vif,
2855 struct ieee80211_sta *sta,
2856 enum ieee80211_sta_state old_state,
2857 enum ieee80211_sta_state new_state)
2858{
2859 struct ath10k *ar = hw->priv;
2860 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2861 int max_num_peers;
2862 int ret = 0;
2863
2864 mutex_lock(&ar->conf_mutex);
2865
2866 if (old_state == IEEE80211_STA_NOTEXIST &&
2867 new_state == IEEE80211_STA_NONE &&
2868 vif->type != NL80211_IFTYPE_STATION) {
2869
2870
2871
2872 if (test_bit(ATH10K_FW_FEATURE_WMI_10X, ar->fw_features))
2873 max_num_peers = TARGET_10X_NUM_PEERS_MAX - 1;
2874 else
2875 max_num_peers = TARGET_NUM_PEERS;
2876
2877 if (ar->num_peers >= max_num_peers) {
2878 ath10k_warn("Number of peers exceeded: peers number %d (max peers %d)\n",
2879 ar->num_peers, max_num_peers);
2880 ret = -ENOBUFS;
2881 goto exit;
2882 }
2883
2884 ath10k_dbg(ATH10K_DBG_MAC,
2885 "mac vdev %d peer create %pM (new sta) num_peers %d\n",
2886 arvif->vdev_id, sta->addr, ar->num_peers);
2887
2888 ret = ath10k_peer_create(ar, arvif->vdev_id, sta->addr);
2889 if (ret)
2890 ath10k_warn("Failed to add peer %pM for vdev %d when adding a new sta: %i\n",
2891 sta->addr, arvif->vdev_id, ret);
2892 } else if ((old_state == IEEE80211_STA_NONE &&
2893 new_state == IEEE80211_STA_NOTEXIST)) {
2894
2895
2896
2897 ath10k_dbg(ATH10K_DBG_MAC,
2898 "mac vdev %d peer delete %pM (sta gone)\n",
2899 arvif->vdev_id, sta->addr);
2900 ret = ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
2901 if (ret)
2902 ath10k_warn("Failed to delete peer: %pM for VDEV: %d\n",
2903 sta->addr, arvif->vdev_id);
2904
2905 if (vif->type == NL80211_IFTYPE_STATION)
2906 ath10k_bss_disassoc(hw, vif);
2907 } else if (old_state == IEEE80211_STA_AUTH &&
2908 new_state == IEEE80211_STA_ASSOC &&
2909 (vif->type == NL80211_IFTYPE_AP ||
2910 vif->type == NL80211_IFTYPE_ADHOC)) {
2911
2912
2913
2914 ath10k_dbg(ATH10K_DBG_MAC, "mac sta %pM associated\n",
2915 sta->addr);
2916
2917 ret = ath10k_station_assoc(ar, arvif, sta);
2918 if (ret)
2919 ath10k_warn("Failed to associate station: %pM\n",
2920 sta->addr);
2921 } else if (old_state == IEEE80211_STA_ASSOC &&
2922 new_state == IEEE80211_STA_AUTH &&
2923 (vif->type == NL80211_IFTYPE_AP ||
2924 vif->type == NL80211_IFTYPE_ADHOC)) {
2925
2926
2927
2928 ath10k_dbg(ATH10K_DBG_MAC, "mac sta %pM disassociated\n",
2929 sta->addr);
2930
2931 ret = ath10k_station_disassoc(ar, arvif, sta);
2932 if (ret)
2933 ath10k_warn("Failed to disassociate station: %pM\n",
2934 sta->addr);
2935 }
2936exit:
2937 mutex_unlock(&ar->conf_mutex);
2938 return ret;
2939}
2940
2941static int ath10k_conf_tx_uapsd(struct ath10k *ar, struct ieee80211_vif *vif,
2942 u16 ac, bool enable)
2943{
2944 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2945 u32 value = 0;
2946 int ret = 0;
2947
2948 lockdep_assert_held(&ar->conf_mutex);
2949
2950 if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
2951 return 0;
2952
2953 switch (ac) {
2954 case IEEE80211_AC_VO:
2955 value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN |
2956 WMI_STA_PS_UAPSD_AC3_TRIGGER_EN;
2957 break;
2958 case IEEE80211_AC_VI:
2959 value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN |
2960 WMI_STA_PS_UAPSD_AC2_TRIGGER_EN;
2961 break;
2962 case IEEE80211_AC_BE:
2963 value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN |
2964 WMI_STA_PS_UAPSD_AC1_TRIGGER_EN;
2965 break;
2966 case IEEE80211_AC_BK:
2967 value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN |
2968 WMI_STA_PS_UAPSD_AC0_TRIGGER_EN;
2969 break;
2970 }
2971
2972 if (enable)
2973 arvif->u.sta.uapsd |= value;
2974 else
2975 arvif->u.sta.uapsd &= ~value;
2976
2977 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
2978 WMI_STA_PS_PARAM_UAPSD,
2979 arvif->u.sta.uapsd);
2980 if (ret) {
2981 ath10k_warn("could not set uapsd params %d\n", ret);
2982 goto exit;
2983 }
2984
2985 if (arvif->u.sta.uapsd)
2986 value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD;
2987 else
2988 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
2989
2990 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
2991 WMI_STA_PS_PARAM_RX_WAKE_POLICY,
2992 value);
2993 if (ret)
2994 ath10k_warn("could not set rx wake param %d\n", ret);
2995
2996exit:
2997 return ret;
2998}
2999
3000static int ath10k_conf_tx(struct ieee80211_hw *hw,
3001 struct ieee80211_vif *vif, u16 ac,
3002 const struct ieee80211_tx_queue_params *params)
3003{
3004 struct ath10k *ar = hw->priv;
3005 struct wmi_wmm_params_arg *p = NULL;
3006 int ret;
3007
3008 mutex_lock(&ar->conf_mutex);
3009
3010 switch (ac) {
3011 case IEEE80211_AC_VO:
3012 p = &ar->wmm_params.ac_vo;
3013 break;
3014 case IEEE80211_AC_VI:
3015 p = &ar->wmm_params.ac_vi;
3016 break;
3017 case IEEE80211_AC_BE:
3018 p = &ar->wmm_params.ac_be;
3019 break;
3020 case IEEE80211_AC_BK:
3021 p = &ar->wmm_params.ac_bk;
3022 break;
3023 }
3024
3025 if (WARN_ON(!p)) {
3026 ret = -EINVAL;
3027 goto exit;
3028 }
3029
3030 p->cwmin = params->cw_min;
3031 p->cwmax = params->cw_max;
3032 p->aifs = params->aifs;
3033
3034
3035
3036
3037
3038
3039 p->txop = params->txop * 32;
3040
3041
3042 ret = ath10k_wmi_pdev_set_wmm_params(ar, &ar->wmm_params);
3043 if (ret) {
3044 ath10k_warn("could not set wmm params %d\n", ret);
3045 goto exit;
3046 }
3047
3048 ret = ath10k_conf_tx_uapsd(ar, vif, ac, params->uapsd);
3049 if (ret)
3050 ath10k_warn("could not set sta uapsd %d\n", ret);
3051
3052exit:
3053 mutex_unlock(&ar->conf_mutex);
3054 return ret;
3055}
3056
3057#define ATH10K_ROC_TIMEOUT_HZ (2*HZ)
3058
3059static int ath10k_remain_on_channel(struct ieee80211_hw *hw,
3060 struct ieee80211_vif *vif,
3061 struct ieee80211_channel *chan,
3062 int duration,
3063 enum ieee80211_roc_type type)
3064{
3065 struct ath10k *ar = hw->priv;
3066 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3067 struct wmi_start_scan_arg arg;
3068 int ret;
3069
3070 mutex_lock(&ar->conf_mutex);
3071
3072 spin_lock_bh(&ar->data_lock);
3073 if (ar->scan.in_progress) {
3074 spin_unlock_bh(&ar->data_lock);
3075 ret = -EBUSY;
3076 goto exit;
3077 }
3078
3079 reinit_completion(&ar->scan.started);
3080 reinit_completion(&ar->scan.completed);
3081 reinit_completion(&ar->scan.on_channel);
3082 ar->scan.in_progress = true;
3083 ar->scan.aborting = false;
3084 ar->scan.is_roc = true;
3085 ar->scan.vdev_id = arvif->vdev_id;
3086 ar->scan.roc_freq = chan->center_freq;
3087 spin_unlock_bh(&ar->data_lock);
3088
3089 memset(&arg, 0, sizeof(arg));
3090 ath10k_wmi_start_scan_init(ar, &arg);
3091 arg.vdev_id = arvif->vdev_id;
3092 arg.scan_id = ATH10K_SCAN_ID;
3093 arg.n_channels = 1;
3094 arg.channels[0] = chan->center_freq;
3095 arg.dwell_time_active = duration;
3096 arg.dwell_time_passive = duration;
3097 arg.max_scan_time = 2 * duration;
3098 arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
3099 arg.scan_ctrl_flags |= WMI_SCAN_FILTER_PROBE_REQ;
3100
3101 ret = ath10k_start_scan(ar, &arg);
3102 if (ret) {
3103 ath10k_warn("could not start roc scan (%d)\n", ret);
3104 spin_lock_bh(&ar->data_lock);
3105 ar->scan.in_progress = false;
3106 spin_unlock_bh(&ar->data_lock);
3107 goto exit;
3108 }
3109
3110 ret = wait_for_completion_timeout(&ar->scan.on_channel, 3*HZ);
3111 if (ret == 0) {
3112 ath10k_warn("could not switch to channel for roc scan\n");
3113 ath10k_abort_scan(ar);
3114 ret = -ETIMEDOUT;
3115 goto exit;
3116 }
3117
3118 ret = 0;
3119exit:
3120 mutex_unlock(&ar->conf_mutex);
3121 return ret;
3122}
3123
3124static int ath10k_cancel_remain_on_channel(struct ieee80211_hw *hw)
3125{
3126 struct ath10k *ar = hw->priv;
3127
3128 mutex_lock(&ar->conf_mutex);
3129 ath10k_abort_scan(ar);
3130 mutex_unlock(&ar->conf_mutex);
3131
3132 return 0;
3133}
3134
3135
3136
3137
3138
3139
3140static int ath10k_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
3141{
3142 struct ath10k *ar = hw->priv;
3143 struct ath10k_vif *arvif;
3144 int ret = 0;
3145
3146 mutex_lock(&ar->conf_mutex);
3147 list_for_each_entry(arvif, &ar->arvifs, list) {
3148 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d rts threshold %d\n",
3149 arvif->vdev_id, value);
3150
3151 ret = ath10k_mac_set_rts(arvif, value);
3152 if (ret) {
3153 ath10k_warn("could not set rts threshold for vdev %d (%d)\n",
3154 arvif->vdev_id, ret);
3155 break;
3156 }
3157 }
3158 mutex_unlock(&ar->conf_mutex);
3159
3160 return ret;
3161}
3162
3163static int ath10k_set_frag_threshold(struct ieee80211_hw *hw, u32 value)
3164{
3165 struct ath10k *ar = hw->priv;
3166 struct ath10k_vif *arvif;
3167 int ret = 0;
3168
3169 mutex_lock(&ar->conf_mutex);
3170 list_for_each_entry(arvif, &ar->arvifs, list) {
3171 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d fragmentation threshold %d\n",
3172 arvif->vdev_id, value);
3173
3174 ret = ath10k_mac_set_rts(arvif, value);
3175 if (ret) {
3176 ath10k_warn("could not set fragmentation threshold for vdev %d (%d)\n",
3177 arvif->vdev_id, ret);
3178 break;
3179 }
3180 }
3181 mutex_unlock(&ar->conf_mutex);
3182
3183 return ret;
3184}
3185
3186static void ath10k_flush(struct ieee80211_hw *hw, u32 queues, bool drop)
3187{
3188 struct ath10k *ar = hw->priv;
3189 bool skip;
3190 int ret;
3191
3192
3193
3194 if (drop)
3195 return;
3196
3197 mutex_lock(&ar->conf_mutex);
3198
3199 if (ar->state == ATH10K_STATE_WEDGED)
3200 goto skip;
3201
3202 ret = wait_event_timeout(ar->htt.empty_tx_wq, ({
3203 bool empty;
3204
3205 spin_lock_bh(&ar->htt.tx_lock);
3206 empty = (ar->htt.num_pending_tx == 0);
3207 spin_unlock_bh(&ar->htt.tx_lock);
3208
3209 skip = (ar->state == ATH10K_STATE_WEDGED);
3210
3211 (empty || skip);
3212 }), ATH10K_FLUSH_TIMEOUT_HZ);
3213
3214 if (ret <= 0 || skip)
3215 ath10k_warn("tx not flushed\n");
3216
3217skip:
3218 mutex_unlock(&ar->conf_mutex);
3219}
3220
3221
3222
3223
3224
3225static int ath10k_tx_last_beacon(struct ieee80211_hw *hw)
3226{
3227 return 1;
3228}
3229
3230#ifdef CONFIG_PM
3231static int ath10k_suspend(struct ieee80211_hw *hw,
3232 struct cfg80211_wowlan *wowlan)
3233{
3234 struct ath10k *ar = hw->priv;
3235 int ret;
3236
3237 ar->is_target_paused = false;
3238
3239 ret = ath10k_wmi_pdev_suspend_target(ar);
3240 if (ret) {
3241 ath10k_warn("could not suspend target (%d)\n", ret);
3242 return 1;
3243 }
3244
3245 ret = wait_event_interruptible_timeout(ar->event_queue,
3246 ar->is_target_paused == true,
3247 1 * HZ);
3248 if (ret < 0) {
3249 ath10k_warn("suspend interrupted (%d)\n", ret);
3250 goto resume;
3251 } else if (ret == 0) {
3252 ath10k_warn("suspend timed out - target pause event never came\n");
3253 goto resume;
3254 }
3255
3256 ret = ath10k_hif_suspend(ar);
3257 if (ret) {
3258 ath10k_warn("could not suspend hif (%d)\n", ret);
3259 goto resume;
3260 }
3261
3262 return 0;
3263resume:
3264 ret = ath10k_wmi_pdev_resume_target(ar);
3265 if (ret)
3266 ath10k_warn("could not resume target (%d)\n", ret);
3267 return 1;
3268}
3269
3270static int ath10k_resume(struct ieee80211_hw *hw)
3271{
3272 struct ath10k *ar = hw->priv;
3273 int ret;
3274
3275 ret = ath10k_hif_resume(ar);
3276 if (ret) {
3277 ath10k_warn("could not resume hif (%d)\n", ret);
3278 return 1;
3279 }
3280
3281 ret = ath10k_wmi_pdev_resume_target(ar);
3282 if (ret) {
3283 ath10k_warn("could not resume target (%d)\n", ret);
3284 return 1;
3285 }
3286
3287 return 0;
3288}
3289#endif
3290
3291static void ath10k_restart_complete(struct ieee80211_hw *hw)
3292{
3293 struct ath10k *ar = hw->priv;
3294
3295 mutex_lock(&ar->conf_mutex);
3296
3297
3298
3299 if (ar->state == ATH10K_STATE_RESTARTED) {
3300 ath10k_info("device successfully recovered\n");
3301 ar->state = ATH10K_STATE_ON;
3302 }
3303
3304 mutex_unlock(&ar->conf_mutex);
3305}
3306
3307static int ath10k_get_survey(struct ieee80211_hw *hw, int idx,
3308 struct survey_info *survey)
3309{
3310 struct ath10k *ar = hw->priv;
3311 struct ieee80211_supported_band *sband;
3312 struct survey_info *ar_survey = &ar->survey[idx];
3313 int ret = 0;
3314
3315 mutex_lock(&ar->conf_mutex);
3316
3317 sband = hw->wiphy->bands[IEEE80211_BAND_2GHZ];
3318 if (sband && idx >= sband->n_channels) {
3319 idx -= sband->n_channels;
3320 sband = NULL;
3321 }
3322
3323 if (!sband)
3324 sband = hw->wiphy->bands[IEEE80211_BAND_5GHZ];
3325
3326 if (!sband || idx >= sband->n_channels) {
3327 ret = -ENOENT;
3328 goto exit;
3329 }
3330
3331 spin_lock_bh(&ar->data_lock);
3332 memcpy(survey, ar_survey, sizeof(*survey));
3333 spin_unlock_bh(&ar->data_lock);
3334
3335 survey->channel = &sband->channels[idx];
3336
3337exit:
3338 mutex_unlock(&ar->conf_mutex);
3339 return ret;
3340}
3341
3342
3343static const u8 cck_ofdm_rate[] = {
3344
3345 3,
3346 2,
3347 1,
3348 0,
3349
3350 3,
3351 7,
3352 2,
3353 6,
3354 1,
3355 5,
3356 0,
3357 4,
3358};
3359
3360
3361static int ath10k_check_single_mask(u32 mask)
3362{
3363 int bit;
3364
3365 bit = ffs(mask);
3366 if (!bit)
3367 return 0;
3368
3369 mask &= ~BIT(bit - 1);
3370 if (mask)
3371 return 2;
3372
3373 return 1;
3374}
3375
3376static bool
3377ath10k_default_bitrate_mask(struct ath10k *ar,
3378 enum ieee80211_band band,
3379 const struct cfg80211_bitrate_mask *mask)
3380{
3381 u32 legacy = 0x00ff;
3382 u8 ht = 0xff, i;
3383 u16 vht = 0x3ff;
3384
3385 switch (band) {
3386 case IEEE80211_BAND_2GHZ:
3387 legacy = 0x00fff;
3388 vht = 0;
3389 break;
3390 case IEEE80211_BAND_5GHZ:
3391 break;
3392 default:
3393 return false;
3394 }
3395
3396 if (mask->control[band].legacy != legacy)
3397 return false;
3398
3399 for (i = 0; i < ar->num_rf_chains; i++)
3400 if (mask->control[band].ht_mcs[i] != ht)
3401 return false;
3402
3403 for (i = 0; i < ar->num_rf_chains; i++)
3404 if (mask->control[band].vht_mcs[i] != vht)
3405 return false;
3406
3407 return true;
3408}
3409
3410static bool
3411ath10k_bitrate_mask_nss(const struct cfg80211_bitrate_mask *mask,
3412 enum ieee80211_band band,
3413 u8 *fixed_nss)
3414{
3415 int ht_nss = 0, vht_nss = 0, i;
3416
3417
3418 if (ath10k_check_single_mask(mask->control[band].legacy))
3419 return false;
3420
3421
3422 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++) {
3423 if (mask->control[band].ht_mcs[i] == 0xff)
3424 continue;
3425 else if (mask->control[band].ht_mcs[i] == 0x00)
3426 break;
3427 else
3428 return false;
3429 }
3430
3431 ht_nss = i;
3432
3433
3434 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
3435 if (mask->control[band].vht_mcs[i] == 0x03ff)
3436 continue;
3437 else if (mask->control[band].vht_mcs[i] == 0x0000)
3438 break;
3439 else
3440 return false;
3441 }
3442
3443 vht_nss = i;
3444
3445 if (ht_nss > 0 && vht_nss > 0)
3446 return false;
3447
3448 if (ht_nss)
3449 *fixed_nss = ht_nss;
3450 else if (vht_nss)
3451 *fixed_nss = vht_nss;
3452 else
3453 return false;
3454
3455 return true;
3456}
3457
3458static bool
3459ath10k_bitrate_mask_correct(const struct cfg80211_bitrate_mask *mask,
3460 enum ieee80211_band band,
3461 enum wmi_rate_preamble *preamble)
3462{
3463 int legacy = 0, ht = 0, vht = 0, i;
3464
3465 *preamble = WMI_RATE_PREAMBLE_OFDM;
3466
3467
3468 legacy = ath10k_check_single_mask(mask->control[band].legacy);
3469 if (legacy > 1)
3470 return false;
3471
3472
3473 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++)
3474 ht += ath10k_check_single_mask(mask->control[band].ht_mcs[i]);
3475 if (ht > 1)
3476 return false;
3477
3478
3479 for (i = 0; i < NL80211_VHT_NSS_MAX; i++)
3480 vht += ath10k_check_single_mask(mask->control[band].vht_mcs[i]);
3481 if (vht > 1)
3482 return false;
3483
3484
3485 if ((legacy + ht + vht) != 1)
3486 return false;
3487
3488 if (ht)
3489 *preamble = WMI_RATE_PREAMBLE_HT;
3490 else if (vht)
3491 *preamble = WMI_RATE_PREAMBLE_VHT;
3492
3493 return true;
3494}
3495
3496static bool
3497ath10k_bitrate_mask_rate(const struct cfg80211_bitrate_mask *mask,
3498 enum ieee80211_band band,
3499 u8 *fixed_rate,
3500 u8 *fixed_nss)
3501{
3502 u8 rate = 0, pream = 0, nss = 0, i;
3503 enum wmi_rate_preamble preamble;
3504
3505
3506 if (!ath10k_bitrate_mask_correct(mask, band, &preamble))
3507 return false;
3508
3509 pream = preamble;
3510
3511 switch (preamble) {
3512 case WMI_RATE_PREAMBLE_CCK:
3513 case WMI_RATE_PREAMBLE_OFDM:
3514 i = ffs(mask->control[band].legacy) - 1;
3515
3516 if (band == IEEE80211_BAND_2GHZ && i < 4)
3517 pream = WMI_RATE_PREAMBLE_CCK;
3518
3519 if (band == IEEE80211_BAND_5GHZ)
3520 i += 4;
3521
3522 if (i >= ARRAY_SIZE(cck_ofdm_rate))
3523 return false;
3524
3525 rate = cck_ofdm_rate[i];
3526 break;
3527 case WMI_RATE_PREAMBLE_HT:
3528 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++)
3529 if (mask->control[band].ht_mcs[i])
3530 break;
3531
3532 if (i == IEEE80211_HT_MCS_MASK_LEN)
3533 return false;
3534
3535 rate = ffs(mask->control[band].ht_mcs[i]) - 1;
3536 nss = i;
3537 break;
3538 case WMI_RATE_PREAMBLE_VHT:
3539 for (i = 0; i < NL80211_VHT_NSS_MAX; i++)
3540 if (mask->control[band].vht_mcs[i])
3541 break;
3542
3543 if (i == NL80211_VHT_NSS_MAX)
3544 return false;
3545
3546 rate = ffs(mask->control[band].vht_mcs[i]) - 1;
3547 nss = i;
3548 break;
3549 }
3550
3551 *fixed_nss = nss + 1;
3552 nss <<= 4;
3553 pream <<= 6;
3554
3555 ath10k_dbg(ATH10K_DBG_MAC, "mac fixed rate pream 0x%02x nss 0x%02x rate 0x%02x\n",
3556 pream, nss, rate);
3557
3558 *fixed_rate = pream | nss | rate;
3559
3560 return true;
3561}
3562
3563static bool ath10k_get_fixed_rate_nss(const struct cfg80211_bitrate_mask *mask,
3564 enum ieee80211_band band,
3565 u8 *fixed_rate,
3566 u8 *fixed_nss)
3567{
3568
3569 if (ath10k_bitrate_mask_nss(mask, band, fixed_nss))
3570 return true;
3571
3572
3573 return ath10k_bitrate_mask_rate(mask, band, fixed_rate, fixed_nss);
3574}
3575
3576static int ath10k_set_fixed_rate_param(struct ath10k_vif *arvif,
3577 u8 fixed_rate,
3578 u8 fixed_nss)
3579{
3580 struct ath10k *ar = arvif->ar;
3581 u32 vdev_param;
3582 int ret = 0;
3583
3584 mutex_lock(&ar->conf_mutex);
3585
3586 if (arvif->fixed_rate == fixed_rate &&
3587 arvif->fixed_nss == fixed_nss)
3588 goto exit;
3589
3590 if (fixed_rate == WMI_FIXED_RATE_NONE)
3591 ath10k_dbg(ATH10K_DBG_MAC, "mac disable fixed bitrate mask\n");
3592
3593 vdev_param = ar->wmi.vdev_param->fixed_rate;
3594 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
3595 vdev_param, fixed_rate);
3596 if (ret) {
3597 ath10k_warn("Could not set fixed_rate param 0x%02x: %d\n",
3598 fixed_rate, ret);
3599 ret = -EINVAL;
3600 goto exit;
3601 }
3602
3603 arvif->fixed_rate = fixed_rate;
3604
3605 vdev_param = ar->wmi.vdev_param->nss;
3606 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
3607 vdev_param, fixed_nss);
3608
3609 if (ret) {
3610 ath10k_warn("Could not set fixed_nss param %d: %d\n",
3611 fixed_nss, ret);
3612 ret = -EINVAL;
3613 goto exit;
3614 }
3615
3616 arvif->fixed_nss = fixed_nss;
3617
3618exit:
3619 mutex_unlock(&ar->conf_mutex);
3620 return ret;
3621}
3622
3623static int ath10k_set_bitrate_mask(struct ieee80211_hw *hw,
3624 struct ieee80211_vif *vif,
3625 const struct cfg80211_bitrate_mask *mask)
3626{
3627 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3628 struct ath10k *ar = arvif->ar;
3629 enum ieee80211_band band = ar->hw->conf.chandef.chan->band;
3630 u8 fixed_rate = WMI_FIXED_RATE_NONE;
3631 u8 fixed_nss = ar->num_rf_chains;
3632
3633 if (!ath10k_default_bitrate_mask(ar, band, mask)) {
3634 if (!ath10k_get_fixed_rate_nss(mask, band,
3635 &fixed_rate,
3636 &fixed_nss))
3637 return -EINVAL;
3638 }
3639
3640 return ath10k_set_fixed_rate_param(arvif, fixed_rate, fixed_nss);
3641}
3642
3643static const struct ieee80211_ops ath10k_ops = {
3644 .tx = ath10k_tx,
3645 .start = ath10k_start,
3646 .stop = ath10k_stop,
3647 .config = ath10k_config,
3648 .add_interface = ath10k_add_interface,
3649 .remove_interface = ath10k_remove_interface,
3650 .configure_filter = ath10k_configure_filter,
3651 .bss_info_changed = ath10k_bss_info_changed,
3652 .hw_scan = ath10k_hw_scan,
3653 .cancel_hw_scan = ath10k_cancel_hw_scan,
3654 .set_key = ath10k_set_key,
3655 .sta_state = ath10k_sta_state,
3656 .conf_tx = ath10k_conf_tx,
3657 .remain_on_channel = ath10k_remain_on_channel,
3658 .cancel_remain_on_channel = ath10k_cancel_remain_on_channel,
3659 .set_rts_threshold = ath10k_set_rts_threshold,
3660 .set_frag_threshold = ath10k_set_frag_threshold,
3661 .flush = ath10k_flush,
3662 .tx_last_beacon = ath10k_tx_last_beacon,
3663 .restart_complete = ath10k_restart_complete,
3664 .get_survey = ath10k_get_survey,
3665 .set_bitrate_mask = ath10k_set_bitrate_mask,
3666#ifdef CONFIG_PM
3667 .suspend = ath10k_suspend,
3668 .resume = ath10k_resume,
3669#endif
3670};
3671
3672#define RATETAB_ENT(_rate, _rateid, _flags) { \
3673 .bitrate = (_rate), \
3674 .flags = (_flags), \
3675 .hw_value = (_rateid), \
3676}
3677
3678#define CHAN2G(_channel, _freq, _flags) { \
3679 .band = IEEE80211_BAND_2GHZ, \
3680 .hw_value = (_channel), \
3681 .center_freq = (_freq), \
3682 .flags = (_flags), \
3683 .max_antenna_gain = 0, \
3684 .max_power = 30, \
3685}
3686
3687#define CHAN5G(_channel, _freq, _flags) { \
3688 .band = IEEE80211_BAND_5GHZ, \
3689 .hw_value = (_channel), \
3690 .center_freq = (_freq), \
3691 .flags = (_flags), \
3692 .max_antenna_gain = 0, \
3693 .max_power = 30, \
3694}
3695
3696static const struct ieee80211_channel ath10k_2ghz_channels[] = {
3697 CHAN2G(1, 2412, 0),
3698 CHAN2G(2, 2417, 0),
3699 CHAN2G(3, 2422, 0),
3700 CHAN2G(4, 2427, 0),
3701 CHAN2G(5, 2432, 0),
3702 CHAN2G(6, 2437, 0),
3703 CHAN2G(7, 2442, 0),
3704 CHAN2G(8, 2447, 0),
3705 CHAN2G(9, 2452, 0),
3706 CHAN2G(10, 2457, 0),
3707 CHAN2G(11, 2462, 0),
3708 CHAN2G(12, 2467, 0),
3709 CHAN2G(13, 2472, 0),
3710 CHAN2G(14, 2484, 0),
3711};
3712
3713static const struct ieee80211_channel ath10k_5ghz_channels[] = {
3714 CHAN5G(36, 5180, 0),
3715 CHAN5G(40, 5200, 0),
3716 CHAN5G(44, 5220, 0),
3717 CHAN5G(48, 5240, 0),
3718 CHAN5G(52, 5260, 0),
3719 CHAN5G(56, 5280, 0),
3720 CHAN5G(60, 5300, 0),
3721 CHAN5G(64, 5320, 0),
3722 CHAN5G(100, 5500, 0),
3723 CHAN5G(104, 5520, 0),
3724 CHAN5G(108, 5540, 0),
3725 CHAN5G(112, 5560, 0),
3726 CHAN5G(116, 5580, 0),
3727 CHAN5G(120, 5600, 0),
3728 CHAN5G(124, 5620, 0),
3729 CHAN5G(128, 5640, 0),
3730 CHAN5G(132, 5660, 0),
3731 CHAN5G(136, 5680, 0),
3732 CHAN5G(140, 5700, 0),
3733 CHAN5G(149, 5745, 0),
3734 CHAN5G(153, 5765, 0),
3735 CHAN5G(157, 5785, 0),
3736 CHAN5G(161, 5805, 0),
3737 CHAN5G(165, 5825, 0),
3738};
3739
3740static struct ieee80211_rate ath10k_rates[] = {
3741
3742 RATETAB_ENT(10, 0x82, 0),
3743 RATETAB_ENT(20, 0x84, 0),
3744 RATETAB_ENT(55, 0x8b, 0),
3745 RATETAB_ENT(110, 0x96, 0),
3746
3747 RATETAB_ENT(60, 0x0c, 0),
3748 RATETAB_ENT(90, 0x12, 0),
3749 RATETAB_ENT(120, 0x18, 0),
3750 RATETAB_ENT(180, 0x24, 0),
3751 RATETAB_ENT(240, 0x30, 0),
3752 RATETAB_ENT(360, 0x48, 0),
3753 RATETAB_ENT(480, 0x60, 0),
3754 RATETAB_ENT(540, 0x6c, 0),
3755};
3756
3757#define ath10k_a_rates (ath10k_rates + 4)
3758#define ath10k_a_rates_size (ARRAY_SIZE(ath10k_rates) - 4)
3759#define ath10k_g_rates (ath10k_rates + 0)
3760#define ath10k_g_rates_size (ARRAY_SIZE(ath10k_rates))
3761
3762struct ath10k *ath10k_mac_create(void)
3763{
3764 struct ieee80211_hw *hw;
3765 struct ath10k *ar;
3766
3767 hw = ieee80211_alloc_hw(sizeof(struct ath10k), &ath10k_ops);
3768 if (!hw)
3769 return NULL;
3770
3771 ar = hw->priv;
3772 ar->hw = hw;
3773
3774 return ar;
3775}
3776
3777void ath10k_mac_destroy(struct ath10k *ar)
3778{
3779 ieee80211_free_hw(ar->hw);
3780}
3781
3782static const struct ieee80211_iface_limit ath10k_if_limits[] = {
3783 {
3784 .max = 8,
3785 .types = BIT(NL80211_IFTYPE_STATION)
3786 | BIT(NL80211_IFTYPE_P2P_CLIENT)
3787 },
3788 {
3789 .max = 3,
3790 .types = BIT(NL80211_IFTYPE_P2P_GO)
3791 },
3792 {
3793 .max = 7,
3794 .types = BIT(NL80211_IFTYPE_AP)
3795 },
3796};
3797
3798static const struct ieee80211_iface_limit ath10k_10x_if_limits[] = {
3799 {
3800 .max = 8,
3801 .types = BIT(NL80211_IFTYPE_AP)
3802 },
3803};
3804
3805static const struct ieee80211_iface_combination ath10k_if_comb[] = {
3806 {
3807 .limits = ath10k_if_limits,
3808 .n_limits = ARRAY_SIZE(ath10k_if_limits),
3809 .max_interfaces = 8,
3810 .num_different_channels = 1,
3811 .beacon_int_infra_match = true,
3812 },
3813};
3814
3815static const struct ieee80211_iface_combination ath10k_10x_if_comb[] = {
3816 {
3817 .limits = ath10k_10x_if_limits,
3818 .n_limits = ARRAY_SIZE(ath10k_10x_if_limits),
3819 .max_interfaces = 8,
3820 .num_different_channels = 1,
3821 .beacon_int_infra_match = true,
3822#ifdef CONFIG_ATH10K_DFS_CERTIFIED
3823 .radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
3824 BIT(NL80211_CHAN_WIDTH_20) |
3825 BIT(NL80211_CHAN_WIDTH_40) |
3826 BIT(NL80211_CHAN_WIDTH_80),
3827#endif
3828 },
3829};
3830
3831static struct ieee80211_sta_vht_cap ath10k_create_vht_cap(struct ath10k *ar)
3832{
3833 struct ieee80211_sta_vht_cap vht_cap = {0};
3834 u16 mcs_map;
3835 int i;
3836
3837 vht_cap.vht_supported = 1;
3838 vht_cap.cap = ar->vht_cap_info;
3839
3840 mcs_map = 0;
3841 for (i = 0; i < 8; i++) {
3842 if (i < ar->num_rf_chains)
3843 mcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i*2);
3844 else
3845 mcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i*2);
3846 }
3847
3848 vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(mcs_map);
3849 vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(mcs_map);
3850
3851 return vht_cap;
3852}
3853
3854static struct ieee80211_sta_ht_cap ath10k_get_ht_cap(struct ath10k *ar)
3855{
3856 int i;
3857 struct ieee80211_sta_ht_cap ht_cap = {0};
3858
3859 if (!(ar->ht_cap_info & WMI_HT_CAP_ENABLED))
3860 return ht_cap;
3861
3862 ht_cap.ht_supported = 1;
3863 ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
3864 ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_8;
3865 ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
3866 ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
3867 ht_cap.cap |= WLAN_HT_CAP_SM_PS_STATIC << IEEE80211_HT_CAP_SM_PS_SHIFT;
3868
3869 if (ar->ht_cap_info & WMI_HT_CAP_HT20_SGI)
3870 ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
3871
3872 if (ar->ht_cap_info & WMI_HT_CAP_HT40_SGI)
3873 ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
3874
3875 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) {
3876 u32 smps;
3877
3878 smps = WLAN_HT_CAP_SM_PS_DYNAMIC;
3879 smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT;
3880
3881 ht_cap.cap |= smps;
3882 }
3883
3884 if (ar->ht_cap_info & WMI_HT_CAP_TX_STBC)
3885 ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC;
3886
3887 if (ar->ht_cap_info & WMI_HT_CAP_RX_STBC) {
3888 u32 stbc;
3889
3890 stbc = ar->ht_cap_info;
3891 stbc &= WMI_HT_CAP_RX_STBC;
3892 stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT;
3893 stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT;
3894 stbc &= IEEE80211_HT_CAP_RX_STBC;
3895
3896 ht_cap.cap |= stbc;
3897 }
3898
3899 if (ar->ht_cap_info & WMI_HT_CAP_LDPC)
3900 ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
3901
3902 if (ar->ht_cap_info & WMI_HT_CAP_L_SIG_TXOP_PROT)
3903 ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
3904
3905
3906 if (ar->vht_cap_info & WMI_VHT_CAP_MAX_MPDU_LEN_MASK)
3907 ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU;
3908
3909 for (i = 0; i < ar->num_rf_chains; i++)
3910 ht_cap.mcs.rx_mask[i] = 0xFF;
3911
3912 ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
3913
3914 return ht_cap;
3915}
3916
3917
3918static void ath10k_get_arvif_iter(void *data, u8 *mac,
3919 struct ieee80211_vif *vif)
3920{
3921 struct ath10k_vif_iter *arvif_iter = data;
3922 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3923
3924 if (arvif->vdev_id == arvif_iter->vdev_id)
3925 arvif_iter->arvif = arvif;
3926}
3927
3928struct ath10k_vif *ath10k_get_arvif(struct ath10k *ar, u32 vdev_id)
3929{
3930 struct ath10k_vif_iter arvif_iter;
3931 u32 flags;
3932
3933 memset(&arvif_iter, 0, sizeof(struct ath10k_vif_iter));
3934 arvif_iter.vdev_id = vdev_id;
3935
3936 flags = IEEE80211_IFACE_ITER_RESUME_ALL;
3937 ieee80211_iterate_active_interfaces_atomic(ar->hw,
3938 flags,
3939 ath10k_get_arvif_iter,
3940 &arvif_iter);
3941 if (!arvif_iter.arvif) {
3942 ath10k_warn("No VIF found for VDEV: %d\n", vdev_id);
3943 return NULL;
3944 }
3945
3946 return arvif_iter.arvif;
3947}
3948
3949int ath10k_mac_register(struct ath10k *ar)
3950{
3951 struct ieee80211_supported_band *band;
3952 struct ieee80211_sta_vht_cap vht_cap;
3953 struct ieee80211_sta_ht_cap ht_cap;
3954 void *channels;
3955 int ret;
3956
3957 SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr);
3958
3959 SET_IEEE80211_DEV(ar->hw, ar->dev);
3960
3961 ht_cap = ath10k_get_ht_cap(ar);
3962 vht_cap = ath10k_create_vht_cap(ar);
3963
3964 if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) {
3965 channels = kmemdup(ath10k_2ghz_channels,
3966 sizeof(ath10k_2ghz_channels),
3967 GFP_KERNEL);
3968 if (!channels) {
3969 ret = -ENOMEM;
3970 goto err_free;
3971 }
3972
3973 band = &ar->mac.sbands[IEEE80211_BAND_2GHZ];
3974 band->n_channels = ARRAY_SIZE(ath10k_2ghz_channels);
3975 band->channels = channels;
3976 band->n_bitrates = ath10k_g_rates_size;
3977 band->bitrates = ath10k_g_rates;
3978 band->ht_cap = ht_cap;
3979
3980
3981
3982 ar->hw->wiphy->bands[IEEE80211_BAND_2GHZ] = band;
3983 }
3984
3985 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) {
3986 channels = kmemdup(ath10k_5ghz_channels,
3987 sizeof(ath10k_5ghz_channels),
3988 GFP_KERNEL);
3989 if (!channels) {
3990 ret = -ENOMEM;
3991 goto err_free;
3992 }
3993
3994 band = &ar->mac.sbands[IEEE80211_BAND_5GHZ];
3995 band->n_channels = ARRAY_SIZE(ath10k_5ghz_channels);
3996 band->channels = channels;
3997 band->n_bitrates = ath10k_a_rates_size;
3998 band->bitrates = ath10k_a_rates;
3999 band->ht_cap = ht_cap;
4000 band->vht_cap = vht_cap;
4001 ar->hw->wiphy->bands[IEEE80211_BAND_5GHZ] = band;
4002 }
4003
4004 ar->hw->wiphy->interface_modes =
4005 BIT(NL80211_IFTYPE_STATION) |
4006 BIT(NL80211_IFTYPE_ADHOC) |
4007 BIT(NL80211_IFTYPE_AP);
4008
4009 if (!test_bit(ATH10K_FW_FEATURE_NO_P2P, ar->fw_features))
4010 ar->hw->wiphy->interface_modes |=
4011 BIT(NL80211_IFTYPE_P2P_CLIENT) |
4012 BIT(NL80211_IFTYPE_P2P_GO);
4013
4014 ar->hw->flags = IEEE80211_HW_SIGNAL_DBM |
4015 IEEE80211_HW_SUPPORTS_PS |
4016 IEEE80211_HW_SUPPORTS_DYNAMIC_PS |
4017 IEEE80211_HW_SUPPORTS_UAPSD |
4018 IEEE80211_HW_MFP_CAPABLE |
4019 IEEE80211_HW_REPORTS_TX_ACK_STATUS |
4020 IEEE80211_HW_HAS_RATE_CONTROL |
4021 IEEE80211_HW_SUPPORTS_STATIC_SMPS |
4022 IEEE80211_HW_WANT_MONITOR_VIF |
4023 IEEE80211_HW_AP_LINK_PS;
4024
4025
4026
4027 ar->hw->extra_tx_headroom += sizeof(struct htt_data_tx_desc_frag)*2 + 4;
4028
4029 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS)
4030 ar->hw->flags |= IEEE80211_HW_SUPPORTS_DYNAMIC_SMPS;
4031
4032 if (ar->ht_cap_info & WMI_HT_CAP_ENABLED) {
4033 ar->hw->flags |= IEEE80211_HW_AMPDU_AGGREGATION;
4034 ar->hw->flags |= IEEE80211_HW_TX_AMPDU_SETUP_IN_HW;
4035 }
4036
4037 ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID;
4038 ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN;
4039
4040 ar->hw->vif_data_size = sizeof(struct ath10k_vif);
4041
4042 ar->hw->max_listen_interval = ATH10K_MAX_HW_LISTEN_INTERVAL;
4043
4044 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
4045 ar->hw->wiphy->max_remain_on_channel_duration = 5000;
4046
4047 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
4048
4049
4050
4051
4052 ar->hw->queues = 4;
4053
4054 if (test_bit(ATH10K_FW_FEATURE_WMI_10X, ar->fw_features)) {
4055 ar->hw->wiphy->iface_combinations = ath10k_10x_if_comb;
4056 ar->hw->wiphy->n_iface_combinations =
4057 ARRAY_SIZE(ath10k_10x_if_comb);
4058 } else {
4059 ar->hw->wiphy->iface_combinations = ath10k_if_comb;
4060 ar->hw->wiphy->n_iface_combinations =
4061 ARRAY_SIZE(ath10k_if_comb);
4062 }
4063
4064 ar->hw->netdev_features = NETIF_F_HW_CSUM;
4065
4066 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED)) {
4067
4068 ar->ath_common.debug_mask = ATH_DBG_DFS;
4069 ar->dfs_detector = dfs_pattern_detector_init(&ar->ath_common,
4070 NL80211_DFS_UNSET);
4071
4072 if (!ar->dfs_detector)
4073 ath10k_warn("dfs pattern detector init failed\n");
4074 }
4075
4076 ret = ath_regd_init(&ar->ath_common.regulatory, ar->hw->wiphy,
4077 ath10k_reg_notifier);
4078 if (ret) {
4079 ath10k_err("Regulatory initialization failed\n");
4080 goto err_free;
4081 }
4082
4083 ret = ieee80211_register_hw(ar->hw);
4084 if (ret) {
4085 ath10k_err("ieee80211 registration failed: %d\n", ret);
4086 goto err_free;
4087 }
4088
4089 if (!ath_is_world_regd(&ar->ath_common.regulatory)) {
4090 ret = regulatory_hint(ar->hw->wiphy,
4091 ar->ath_common.regulatory.alpha2);
4092 if (ret)
4093 goto err_unregister;
4094 }
4095
4096 return 0;
4097
4098err_unregister:
4099 ieee80211_unregister_hw(ar->hw);
4100err_free:
4101 kfree(ar->mac.sbands[IEEE80211_BAND_2GHZ].channels);
4102 kfree(ar->mac.sbands[IEEE80211_BAND_5GHZ].channels);
4103
4104 return ret;
4105}
4106
4107void ath10k_mac_unregister(struct ath10k *ar)
4108{
4109 ieee80211_unregister_hw(ar->hw);
4110
4111 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector)
4112 ar->dfs_detector->exit(ar->dfs_detector);
4113
4114 kfree(ar->mac.sbands[IEEE80211_BAND_2GHZ].channels);
4115 kfree(ar->mac.sbands[IEEE80211_BAND_5GHZ].channels);
4116
4117 SET_IEEE80211_DEV(ar->hw, NULL);
4118}
4119