ARM: pmu: add support for interrupt-affinity property
[linux/fpc-iii.git] / drivers / net / wireless / ath / ath10k / mac.c
blobd6d2f0f00caad18ec00ba69f5635c79f161b2ba7
1 /*
2 * Copyright (c) 2005-2011 Atheros Communications Inc.
3 * Copyright (c) 2011-2013 Qualcomm Atheros, Inc.
5 * Permission to use, copy, modify, and/or distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 #include "mac.h"
20 #include <net/mac80211.h>
21 #include <linux/etherdevice.h>
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 #include "testmode.h"
30 #include "wmi.h"
31 #include "wmi-ops.h"
33 /**********/
34 /* Crypto */
35 /**********/
37 static int ath10k_send_key(struct ath10k_vif *arvif,
38 struct ieee80211_key_conf *key,
39 enum set_key_cmd cmd,
40 const u8 *macaddr, bool def_idx)
42 struct ath10k *ar = arvif->ar;
43 struct wmi_vdev_install_key_arg arg = {
44 .vdev_id = arvif->vdev_id,
45 .key_idx = key->keyidx,
46 .key_len = key->keylen,
47 .key_data = key->key,
48 .macaddr = macaddr,
51 lockdep_assert_held(&arvif->ar->conf_mutex);
53 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
54 arg.key_flags = WMI_KEY_PAIRWISE;
55 else
56 arg.key_flags = WMI_KEY_GROUP;
58 switch (key->cipher) {
59 case WLAN_CIPHER_SUITE_CCMP:
60 arg.key_cipher = WMI_CIPHER_AES_CCM;
61 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT;
62 break;
63 case WLAN_CIPHER_SUITE_TKIP:
64 arg.key_cipher = WMI_CIPHER_TKIP;
65 arg.key_txmic_len = 8;
66 arg.key_rxmic_len = 8;
67 break;
68 case WLAN_CIPHER_SUITE_WEP40:
69 case WLAN_CIPHER_SUITE_WEP104:
70 arg.key_cipher = WMI_CIPHER_WEP;
71 /* AP/IBSS mode requires self-key to be groupwise
72 * Otherwise pairwise key must be set */
73 if (memcmp(macaddr, arvif->vif->addr, ETH_ALEN))
74 arg.key_flags = WMI_KEY_PAIRWISE;
76 if (def_idx)
77 arg.key_flags |= WMI_KEY_TX_USAGE;
78 break;
79 case WLAN_CIPHER_SUITE_AES_CMAC:
80 /* this one needs to be done in software */
81 return 1;
82 default:
83 ath10k_warn(ar, "cipher %d is not supported\n", key->cipher);
84 return -EOPNOTSUPP;
87 if (cmd == DISABLE_KEY) {
88 arg.key_cipher = WMI_CIPHER_NONE;
89 arg.key_data = NULL;
92 return ath10k_wmi_vdev_install_key(arvif->ar, &arg);
95 static int ath10k_install_key(struct ath10k_vif *arvif,
96 struct ieee80211_key_conf *key,
97 enum set_key_cmd cmd,
98 const u8 *macaddr, bool def_idx)
100 struct ath10k *ar = arvif->ar;
101 int ret;
103 lockdep_assert_held(&ar->conf_mutex);
105 reinit_completion(&ar->install_key_done);
107 ret = ath10k_send_key(arvif, key, cmd, macaddr, def_idx);
108 if (ret)
109 return ret;
111 ret = wait_for_completion_timeout(&ar->install_key_done, 3*HZ);
112 if (ret == 0)
113 return -ETIMEDOUT;
115 return 0;
118 static int ath10k_install_peer_wep_keys(struct ath10k_vif *arvif,
119 const u8 *addr)
121 struct ath10k *ar = arvif->ar;
122 struct ath10k_peer *peer;
123 int ret;
124 int i;
125 bool def_idx;
127 lockdep_assert_held(&ar->conf_mutex);
129 spin_lock_bh(&ar->data_lock);
130 peer = ath10k_peer_find(ar, arvif->vdev_id, addr);
131 spin_unlock_bh(&ar->data_lock);
133 if (!peer)
134 return -ENOENT;
136 for (i = 0; i < ARRAY_SIZE(arvif->wep_keys); i++) {
137 if (arvif->wep_keys[i] == NULL)
138 continue;
139 /* set TX_USAGE flag for default key id */
140 if (arvif->def_wep_key_idx == i)
141 def_idx = true;
142 else
143 def_idx = false;
145 ret = ath10k_install_key(arvif, arvif->wep_keys[i], SET_KEY,
146 addr, def_idx);
147 if (ret)
148 return ret;
150 spin_lock_bh(&ar->data_lock);
151 peer->keys[i] = arvif->wep_keys[i];
152 spin_unlock_bh(&ar->data_lock);
155 return 0;
158 static int ath10k_clear_peer_keys(struct ath10k_vif *arvif,
159 const u8 *addr)
161 struct ath10k *ar = arvif->ar;
162 struct ath10k_peer *peer;
163 int first_errno = 0;
164 int ret;
165 int i;
167 lockdep_assert_held(&ar->conf_mutex);
169 spin_lock_bh(&ar->data_lock);
170 peer = ath10k_peer_find(ar, arvif->vdev_id, addr);
171 spin_unlock_bh(&ar->data_lock);
173 if (!peer)
174 return -ENOENT;
176 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
177 if (peer->keys[i] == NULL)
178 continue;
180 /* key flags are not required to delete the key */
181 ret = ath10k_install_key(arvif, peer->keys[i],
182 DISABLE_KEY, addr, false);
183 if (ret && first_errno == 0)
184 first_errno = ret;
186 if (ret)
187 ath10k_warn(ar, "failed to remove peer wep key %d: %d\n",
188 i, ret);
190 spin_lock_bh(&ar->data_lock);
191 peer->keys[i] = NULL;
192 spin_unlock_bh(&ar->data_lock);
195 return first_errno;
198 bool ath10k_mac_is_peer_wep_key_set(struct ath10k *ar, const u8 *addr,
199 u8 keyidx)
201 struct ath10k_peer *peer;
202 int i;
204 lockdep_assert_held(&ar->data_lock);
206 /* We don't know which vdev this peer belongs to,
207 * since WMI doesn't give us that information.
209 * FIXME: multi-bss needs to be handled.
211 peer = ath10k_peer_find(ar, 0, addr);
212 if (!peer)
213 return false;
215 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
216 if (peer->keys[i] && peer->keys[i]->keyidx == keyidx)
217 return true;
220 return false;
223 static int ath10k_clear_vdev_key(struct ath10k_vif *arvif,
224 struct ieee80211_key_conf *key)
226 struct ath10k *ar = arvif->ar;
227 struct ath10k_peer *peer;
228 u8 addr[ETH_ALEN];
229 int first_errno = 0;
230 int ret;
231 int i;
233 lockdep_assert_held(&ar->conf_mutex);
235 for (;;) {
236 /* since ath10k_install_key we can't hold data_lock all the
237 * time, so we try to remove the keys incrementally */
238 spin_lock_bh(&ar->data_lock);
239 i = 0;
240 list_for_each_entry(peer, &ar->peers, list) {
241 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
242 if (peer->keys[i] == key) {
243 ether_addr_copy(addr, peer->addr);
244 peer->keys[i] = NULL;
245 break;
249 if (i < ARRAY_SIZE(peer->keys))
250 break;
252 spin_unlock_bh(&ar->data_lock);
254 if (i == ARRAY_SIZE(peer->keys))
255 break;
256 /* key flags are not required to delete the key */
257 ret = ath10k_install_key(arvif, key, DISABLE_KEY, addr, false);
258 if (ret && first_errno == 0)
259 first_errno = ret;
261 if (ret)
262 ath10k_warn(ar, "failed to remove key for %pM: %d\n",
263 addr, ret);
266 return first_errno;
269 /*********************/
270 /* General utilities */
271 /*********************/
273 static inline enum wmi_phy_mode
274 chan_to_phymode(const struct cfg80211_chan_def *chandef)
276 enum wmi_phy_mode phymode = MODE_UNKNOWN;
278 switch (chandef->chan->band) {
279 case IEEE80211_BAND_2GHZ:
280 switch (chandef->width) {
281 case NL80211_CHAN_WIDTH_20_NOHT:
282 if (chandef->chan->flags & IEEE80211_CHAN_NO_OFDM)
283 phymode = MODE_11B;
284 else
285 phymode = MODE_11G;
286 break;
287 case NL80211_CHAN_WIDTH_20:
288 phymode = MODE_11NG_HT20;
289 break;
290 case NL80211_CHAN_WIDTH_40:
291 phymode = MODE_11NG_HT40;
292 break;
293 case NL80211_CHAN_WIDTH_5:
294 case NL80211_CHAN_WIDTH_10:
295 case NL80211_CHAN_WIDTH_80:
296 case NL80211_CHAN_WIDTH_80P80:
297 case NL80211_CHAN_WIDTH_160:
298 phymode = MODE_UNKNOWN;
299 break;
301 break;
302 case IEEE80211_BAND_5GHZ:
303 switch (chandef->width) {
304 case NL80211_CHAN_WIDTH_20_NOHT:
305 phymode = MODE_11A;
306 break;
307 case NL80211_CHAN_WIDTH_20:
308 phymode = MODE_11NA_HT20;
309 break;
310 case NL80211_CHAN_WIDTH_40:
311 phymode = MODE_11NA_HT40;
312 break;
313 case NL80211_CHAN_WIDTH_80:
314 phymode = MODE_11AC_VHT80;
315 break;
316 case NL80211_CHAN_WIDTH_5:
317 case NL80211_CHAN_WIDTH_10:
318 case NL80211_CHAN_WIDTH_80P80:
319 case NL80211_CHAN_WIDTH_160:
320 phymode = MODE_UNKNOWN;
321 break;
323 break;
324 default:
325 break;
328 WARN_ON(phymode == MODE_UNKNOWN);
329 return phymode;
332 static u8 ath10k_parse_mpdudensity(u8 mpdudensity)
335 * 802.11n D2.0 defined values for "Minimum MPDU Start Spacing":
336 * 0 for no restriction
337 * 1 for 1/4 us
338 * 2 for 1/2 us
339 * 3 for 1 us
340 * 4 for 2 us
341 * 5 for 4 us
342 * 6 for 8 us
343 * 7 for 16 us
345 switch (mpdudensity) {
346 case 0:
347 return 0;
348 case 1:
349 case 2:
350 case 3:
351 /* Our lower layer calculations limit our precision to
352 1 microsecond */
353 return 1;
354 case 4:
355 return 2;
356 case 5:
357 return 4;
358 case 6:
359 return 8;
360 case 7:
361 return 16;
362 default:
363 return 0;
367 static int ath10k_peer_create(struct ath10k *ar, u32 vdev_id, const u8 *addr)
369 int ret;
371 lockdep_assert_held(&ar->conf_mutex);
373 if (ar->num_peers >= ar->max_num_peers)
374 return -ENOBUFS;
376 ret = ath10k_wmi_peer_create(ar, vdev_id, addr);
377 if (ret) {
378 ath10k_warn(ar, "failed to create wmi peer %pM on vdev %i: %i\n",
379 addr, vdev_id, ret);
380 return ret;
383 ret = ath10k_wait_for_peer_created(ar, vdev_id, addr);
384 if (ret) {
385 ath10k_warn(ar, "failed to wait for created wmi peer %pM on vdev %i: %i\n",
386 addr, vdev_id, ret);
387 return ret;
390 ar->num_peers++;
392 return 0;
395 static int ath10k_mac_set_kickout(struct ath10k_vif *arvif)
397 struct ath10k *ar = arvif->ar;
398 u32 param;
399 int ret;
401 param = ar->wmi.pdev_param->sta_kickout_th;
402 ret = ath10k_wmi_pdev_set_param(ar, param,
403 ATH10K_KICKOUT_THRESHOLD);
404 if (ret) {
405 ath10k_warn(ar, "failed to set kickout threshold on vdev %i: %d\n",
406 arvif->vdev_id, ret);
407 return ret;
410 param = ar->wmi.vdev_param->ap_keepalive_min_idle_inactive_time_secs;
411 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
412 ATH10K_KEEPALIVE_MIN_IDLE);
413 if (ret) {
414 ath10k_warn(ar, "failed to set keepalive minimum idle time on vdev %i: %d\n",
415 arvif->vdev_id, ret);
416 return ret;
419 param = ar->wmi.vdev_param->ap_keepalive_max_idle_inactive_time_secs;
420 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
421 ATH10K_KEEPALIVE_MAX_IDLE);
422 if (ret) {
423 ath10k_warn(ar, "failed to set keepalive maximum idle time on vdev %i: %d\n",
424 arvif->vdev_id, ret);
425 return ret;
428 param = ar->wmi.vdev_param->ap_keepalive_max_unresponsive_time_secs;
429 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
430 ATH10K_KEEPALIVE_MAX_UNRESPONSIVE);
431 if (ret) {
432 ath10k_warn(ar, "failed to set keepalive maximum unresponsive time on vdev %i: %d\n",
433 arvif->vdev_id, ret);
434 return ret;
437 return 0;
440 static int ath10k_mac_set_rts(struct ath10k_vif *arvif, u32 value)
442 struct ath10k *ar = arvif->ar;
443 u32 vdev_param;
445 vdev_param = ar->wmi.vdev_param->rts_threshold;
446 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, value);
449 static int ath10k_mac_set_frag(struct ath10k_vif *arvif, u32 value)
451 struct ath10k *ar = arvif->ar;
452 u32 vdev_param;
454 if (value != 0xFFFFFFFF)
455 value = clamp_t(u32, arvif->ar->hw->wiphy->frag_threshold,
456 ATH10K_FRAGMT_THRESHOLD_MIN,
457 ATH10K_FRAGMT_THRESHOLD_MAX);
459 vdev_param = ar->wmi.vdev_param->fragmentation_threshold;
460 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, value);
463 static int ath10k_peer_delete(struct ath10k *ar, u32 vdev_id, const u8 *addr)
465 int ret;
467 lockdep_assert_held(&ar->conf_mutex);
469 ret = ath10k_wmi_peer_delete(ar, vdev_id, addr);
470 if (ret)
471 return ret;
473 ret = ath10k_wait_for_peer_deleted(ar, vdev_id, addr);
474 if (ret)
475 return ret;
477 ar->num_peers--;
479 return 0;
482 static void ath10k_peer_cleanup(struct ath10k *ar, u32 vdev_id)
484 struct ath10k_peer *peer, *tmp;
486 lockdep_assert_held(&ar->conf_mutex);
488 spin_lock_bh(&ar->data_lock);
489 list_for_each_entry_safe(peer, tmp, &ar->peers, list) {
490 if (peer->vdev_id != vdev_id)
491 continue;
493 ath10k_warn(ar, "removing stale peer %pM from vdev_id %d\n",
494 peer->addr, vdev_id);
496 list_del(&peer->list);
497 kfree(peer);
498 ar->num_peers--;
500 spin_unlock_bh(&ar->data_lock);
503 static void ath10k_peer_cleanup_all(struct ath10k *ar)
505 struct ath10k_peer *peer, *tmp;
507 lockdep_assert_held(&ar->conf_mutex);
509 spin_lock_bh(&ar->data_lock);
510 list_for_each_entry_safe(peer, tmp, &ar->peers, list) {
511 list_del(&peer->list);
512 kfree(peer);
514 spin_unlock_bh(&ar->data_lock);
516 ar->num_peers = 0;
517 ar->num_stations = 0;
520 /************************/
521 /* Interface management */
522 /************************/
524 void ath10k_mac_vif_beacon_free(struct ath10k_vif *arvif)
526 struct ath10k *ar = arvif->ar;
528 lockdep_assert_held(&ar->data_lock);
530 if (!arvif->beacon)
531 return;
533 if (!arvif->beacon_buf)
534 dma_unmap_single(ar->dev, ATH10K_SKB_CB(arvif->beacon)->paddr,
535 arvif->beacon->len, DMA_TO_DEVICE);
537 if (WARN_ON(arvif->beacon_state != ATH10K_BEACON_SCHEDULED &&
538 arvif->beacon_state != ATH10K_BEACON_SENT))
539 return;
541 dev_kfree_skb_any(arvif->beacon);
543 arvif->beacon = NULL;
544 arvif->beacon_state = ATH10K_BEACON_SCHEDULED;
547 static void ath10k_mac_vif_beacon_cleanup(struct ath10k_vif *arvif)
549 struct ath10k *ar = arvif->ar;
551 lockdep_assert_held(&ar->data_lock);
553 ath10k_mac_vif_beacon_free(arvif);
555 if (arvif->beacon_buf) {
556 dma_free_coherent(ar->dev, IEEE80211_MAX_FRAME_LEN,
557 arvif->beacon_buf, arvif->beacon_paddr);
558 arvif->beacon_buf = NULL;
562 static inline int ath10k_vdev_setup_sync(struct ath10k *ar)
564 int ret;
566 lockdep_assert_held(&ar->conf_mutex);
568 if (test_bit(ATH10K_FLAG_CRASH_FLUSH, &ar->dev_flags))
569 return -ESHUTDOWN;
571 ret = wait_for_completion_timeout(&ar->vdev_setup_done,
572 ATH10K_VDEV_SETUP_TIMEOUT_HZ);
573 if (ret == 0)
574 return -ETIMEDOUT;
576 return 0;
579 static int ath10k_monitor_vdev_start(struct ath10k *ar, int vdev_id)
581 struct cfg80211_chan_def *chandef = &ar->chandef;
582 struct ieee80211_channel *channel = chandef->chan;
583 struct wmi_vdev_start_request_arg arg = {};
584 int ret = 0;
586 lockdep_assert_held(&ar->conf_mutex);
588 arg.vdev_id = vdev_id;
589 arg.channel.freq = channel->center_freq;
590 arg.channel.band_center_freq1 = chandef->center_freq1;
592 /* TODO setup this dynamically, what in case we
593 don't have any vifs? */
594 arg.channel.mode = chan_to_phymode(chandef);
595 arg.channel.chan_radar =
596 !!(channel->flags & IEEE80211_CHAN_RADAR);
598 arg.channel.min_power = 0;
599 arg.channel.max_power = channel->max_power * 2;
600 arg.channel.max_reg_power = channel->max_reg_power * 2;
601 arg.channel.max_antenna_gain = channel->max_antenna_gain * 2;
603 reinit_completion(&ar->vdev_setup_done);
605 ret = ath10k_wmi_vdev_start(ar, &arg);
606 if (ret) {
607 ath10k_warn(ar, "failed to request monitor vdev %i start: %d\n",
608 vdev_id, ret);
609 return ret;
612 ret = ath10k_vdev_setup_sync(ar);
613 if (ret) {
614 ath10k_warn(ar, "failed to synchronize setup for monitor vdev %i: %d\n",
615 vdev_id, ret);
616 return ret;
619 ret = ath10k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr);
620 if (ret) {
621 ath10k_warn(ar, "failed to put up monitor vdev %i: %d\n",
622 vdev_id, ret);
623 goto vdev_stop;
626 ar->monitor_vdev_id = vdev_id;
628 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %i started\n",
629 ar->monitor_vdev_id);
630 return 0;
632 vdev_stop:
633 ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
634 if (ret)
635 ath10k_warn(ar, "failed to stop monitor vdev %i after start failure: %d\n",
636 ar->monitor_vdev_id, ret);
638 return ret;
641 static int ath10k_monitor_vdev_stop(struct ath10k *ar)
643 int ret = 0;
645 lockdep_assert_held(&ar->conf_mutex);
647 ret = ath10k_wmi_vdev_down(ar, ar->monitor_vdev_id);
648 if (ret)
649 ath10k_warn(ar, "failed to put down monitor vdev %i: %d\n",
650 ar->monitor_vdev_id, ret);
652 reinit_completion(&ar->vdev_setup_done);
654 ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
655 if (ret)
656 ath10k_warn(ar, "failed to to request monitor vdev %i stop: %d\n",
657 ar->monitor_vdev_id, ret);
659 ret = ath10k_vdev_setup_sync(ar);
660 if (ret)
661 ath10k_warn(ar, "failed to synchronise monitor vdev %i: %d\n",
662 ar->monitor_vdev_id, ret);
664 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %i stopped\n",
665 ar->monitor_vdev_id);
666 return ret;
669 static int ath10k_monitor_vdev_create(struct ath10k *ar)
671 int bit, ret = 0;
673 lockdep_assert_held(&ar->conf_mutex);
675 if (ar->free_vdev_map == 0) {
676 ath10k_warn(ar, "failed to find free vdev id for monitor vdev\n");
677 return -ENOMEM;
680 bit = __ffs64(ar->free_vdev_map);
682 ar->monitor_vdev_id = bit;
684 ret = ath10k_wmi_vdev_create(ar, ar->monitor_vdev_id,
685 WMI_VDEV_TYPE_MONITOR,
686 0, ar->mac_addr);
687 if (ret) {
688 ath10k_warn(ar, "failed to request monitor vdev %i creation: %d\n",
689 ar->monitor_vdev_id, ret);
690 return ret;
693 ar->free_vdev_map &= ~(1LL << ar->monitor_vdev_id);
694 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %d created\n",
695 ar->monitor_vdev_id);
697 return 0;
700 static int ath10k_monitor_vdev_delete(struct ath10k *ar)
702 int ret = 0;
704 lockdep_assert_held(&ar->conf_mutex);
706 ret = ath10k_wmi_vdev_delete(ar, ar->monitor_vdev_id);
707 if (ret) {
708 ath10k_warn(ar, "failed to request wmi monitor vdev %i removal: %d\n",
709 ar->monitor_vdev_id, ret);
710 return ret;
713 ar->free_vdev_map |= 1LL << ar->monitor_vdev_id;
715 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %d deleted\n",
716 ar->monitor_vdev_id);
717 return ret;
720 static int ath10k_monitor_start(struct ath10k *ar)
722 int ret;
724 lockdep_assert_held(&ar->conf_mutex);
726 ret = ath10k_monitor_vdev_create(ar);
727 if (ret) {
728 ath10k_warn(ar, "failed to create monitor vdev: %d\n", ret);
729 return ret;
732 ret = ath10k_monitor_vdev_start(ar, ar->monitor_vdev_id);
733 if (ret) {
734 ath10k_warn(ar, "failed to start monitor vdev: %d\n", ret);
735 ath10k_monitor_vdev_delete(ar);
736 return ret;
739 ar->monitor_started = true;
740 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor started\n");
742 return 0;
745 static int ath10k_monitor_stop(struct ath10k *ar)
747 int ret;
749 lockdep_assert_held(&ar->conf_mutex);
751 ret = ath10k_monitor_vdev_stop(ar);
752 if (ret) {
753 ath10k_warn(ar, "failed to stop monitor vdev: %d\n", ret);
754 return ret;
757 ret = ath10k_monitor_vdev_delete(ar);
758 if (ret) {
759 ath10k_warn(ar, "failed to delete monitor vdev: %d\n", ret);
760 return ret;
763 ar->monitor_started = false;
764 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor stopped\n");
766 return 0;
769 static int ath10k_monitor_recalc(struct ath10k *ar)
771 bool should_start;
773 lockdep_assert_held(&ar->conf_mutex);
775 should_start = ar->monitor ||
776 ar->filter_flags & FIF_PROMISC_IN_BSS ||
777 test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
779 ath10k_dbg(ar, ATH10K_DBG_MAC,
780 "mac monitor recalc started? %d should? %d\n",
781 ar->monitor_started, should_start);
783 if (should_start == ar->monitor_started)
784 return 0;
786 if (should_start)
787 return ath10k_monitor_start(ar);
789 return ath10k_monitor_stop(ar);
792 static int ath10k_recalc_rtscts_prot(struct ath10k_vif *arvif)
794 struct ath10k *ar = arvif->ar;
795 u32 vdev_param, rts_cts = 0;
797 lockdep_assert_held(&ar->conf_mutex);
799 vdev_param = ar->wmi.vdev_param->enable_rtscts;
801 if (arvif->use_cts_prot || arvif->num_legacy_stations > 0)
802 rts_cts |= SM(WMI_RTSCTS_ENABLED, WMI_RTSCTS_SET);
804 if (arvif->num_legacy_stations > 0)
805 rts_cts |= SM(WMI_RTSCTS_ACROSS_SW_RETRIES,
806 WMI_RTSCTS_PROFILE);
808 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
809 rts_cts);
812 static int ath10k_start_cac(struct ath10k *ar)
814 int ret;
816 lockdep_assert_held(&ar->conf_mutex);
818 set_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
820 ret = ath10k_monitor_recalc(ar);
821 if (ret) {
822 ath10k_warn(ar, "failed to start monitor (cac): %d\n", ret);
823 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
824 return ret;
827 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac cac start monitor vdev %d\n",
828 ar->monitor_vdev_id);
830 return 0;
833 static int ath10k_stop_cac(struct ath10k *ar)
835 lockdep_assert_held(&ar->conf_mutex);
837 /* CAC is not running - do nothing */
838 if (!test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags))
839 return 0;
841 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
842 ath10k_monitor_stop(ar);
844 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac cac finished\n");
846 return 0;
849 static void ath10k_recalc_radar_detection(struct ath10k *ar)
851 int ret;
853 lockdep_assert_held(&ar->conf_mutex);
855 ath10k_stop_cac(ar);
857 if (!ar->radar_enabled)
858 return;
860 if (ar->num_started_vdevs > 0)
861 return;
863 ret = ath10k_start_cac(ar);
864 if (ret) {
866 * Not possible to start CAC on current channel so starting
867 * radiation is not allowed, make this channel DFS_UNAVAILABLE
868 * by indicating that radar was detected.
870 ath10k_warn(ar, "failed to start CAC: %d\n", ret);
871 ieee80211_radar_detected(ar->hw);
875 static int ath10k_vdev_start_restart(struct ath10k_vif *arvif, bool restart)
877 struct ath10k *ar = arvif->ar;
878 struct cfg80211_chan_def *chandef = &ar->chandef;
879 struct wmi_vdev_start_request_arg arg = {};
880 int ret = 0;
882 lockdep_assert_held(&ar->conf_mutex);
884 reinit_completion(&ar->vdev_setup_done);
886 arg.vdev_id = arvif->vdev_id;
887 arg.dtim_period = arvif->dtim_period;
888 arg.bcn_intval = arvif->beacon_interval;
890 arg.channel.freq = chandef->chan->center_freq;
891 arg.channel.band_center_freq1 = chandef->center_freq1;
892 arg.channel.mode = chan_to_phymode(chandef);
894 arg.channel.min_power = 0;
895 arg.channel.max_power = chandef->chan->max_power * 2;
896 arg.channel.max_reg_power = chandef->chan->max_reg_power * 2;
897 arg.channel.max_antenna_gain = chandef->chan->max_antenna_gain * 2;
899 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
900 arg.ssid = arvif->u.ap.ssid;
901 arg.ssid_len = arvif->u.ap.ssid_len;
902 arg.hidden_ssid = arvif->u.ap.hidden_ssid;
904 /* For now allow DFS for AP mode */
905 arg.channel.chan_radar =
906 !!(chandef->chan->flags & IEEE80211_CHAN_RADAR);
907 } else if (arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
908 arg.ssid = arvif->vif->bss_conf.ssid;
909 arg.ssid_len = arvif->vif->bss_conf.ssid_len;
912 ath10k_dbg(ar, ATH10K_DBG_MAC,
913 "mac vdev %d start center_freq %d phymode %s\n",
914 arg.vdev_id, arg.channel.freq,
915 ath10k_wmi_phymode_str(arg.channel.mode));
917 if (restart)
918 ret = ath10k_wmi_vdev_restart(ar, &arg);
919 else
920 ret = ath10k_wmi_vdev_start(ar, &arg);
922 if (ret) {
923 ath10k_warn(ar, "failed to start WMI vdev %i: %d\n",
924 arg.vdev_id, ret);
925 return ret;
928 ret = ath10k_vdev_setup_sync(ar);
929 if (ret) {
930 ath10k_warn(ar, "failed to synchronise setup for vdev %i: %d\n",
931 arg.vdev_id, ret);
932 return ret;
935 ar->num_started_vdevs++;
936 ath10k_recalc_radar_detection(ar);
938 return ret;
941 static int ath10k_vdev_start(struct ath10k_vif *arvif)
943 return ath10k_vdev_start_restart(arvif, false);
946 static int ath10k_vdev_restart(struct ath10k_vif *arvif)
948 return ath10k_vdev_start_restart(arvif, true);
951 static int ath10k_vdev_stop(struct ath10k_vif *arvif)
953 struct ath10k *ar = arvif->ar;
954 int ret;
956 lockdep_assert_held(&ar->conf_mutex);
958 reinit_completion(&ar->vdev_setup_done);
960 ret = ath10k_wmi_vdev_stop(ar, arvif->vdev_id);
961 if (ret) {
962 ath10k_warn(ar, "failed to stop WMI vdev %i: %d\n",
963 arvif->vdev_id, ret);
964 return ret;
967 ret = ath10k_vdev_setup_sync(ar);
968 if (ret) {
969 ath10k_warn(ar, "failed to syncronise setup for vdev %i: %d\n",
970 arvif->vdev_id, ret);
971 return ret;
974 WARN_ON(ar->num_started_vdevs == 0);
976 if (ar->num_started_vdevs != 0) {
977 ar->num_started_vdevs--;
978 ath10k_recalc_radar_detection(ar);
981 return ret;
984 static int ath10k_mac_setup_bcn_p2p_ie(struct ath10k_vif *arvif,
985 struct sk_buff *bcn)
987 struct ath10k *ar = arvif->ar;
988 struct ieee80211_mgmt *mgmt;
989 const u8 *p2p_ie;
990 int ret;
992 if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
993 return 0;
995 if (arvif->vdev_subtype != WMI_VDEV_SUBTYPE_P2P_GO)
996 return 0;
998 mgmt = (void *)bcn->data;
999 p2p_ie = cfg80211_find_vendor_ie(WLAN_OUI_WFA, WLAN_OUI_TYPE_WFA_P2P,
1000 mgmt->u.beacon.variable,
1001 bcn->len - (mgmt->u.beacon.variable -
1002 bcn->data));
1003 if (!p2p_ie)
1004 return -ENOENT;
1006 ret = ath10k_wmi_p2p_go_bcn_ie(ar, arvif->vdev_id, p2p_ie);
1007 if (ret) {
1008 ath10k_warn(ar, "failed to submit p2p go bcn ie for vdev %i: %d\n",
1009 arvif->vdev_id, ret);
1010 return ret;
1013 return 0;
1016 static int ath10k_mac_remove_vendor_ie(struct sk_buff *skb, unsigned int oui,
1017 u8 oui_type, size_t ie_offset)
1019 size_t len;
1020 const u8 *next;
1021 const u8 *end;
1022 u8 *ie;
1024 if (WARN_ON(skb->len < ie_offset))
1025 return -EINVAL;
1027 ie = (u8 *)cfg80211_find_vendor_ie(oui, oui_type,
1028 skb->data + ie_offset,
1029 skb->len - ie_offset);
1030 if (!ie)
1031 return -ENOENT;
1033 len = ie[1] + 2;
1034 end = skb->data + skb->len;
1035 next = ie + len;
1037 if (WARN_ON(next > end))
1038 return -EINVAL;
1040 memmove(ie, next, end - next);
1041 skb_trim(skb, skb->len - len);
1043 return 0;
1046 static int ath10k_mac_setup_bcn_tmpl(struct ath10k_vif *arvif)
1048 struct ath10k *ar = arvif->ar;
1049 struct ieee80211_hw *hw = ar->hw;
1050 struct ieee80211_vif *vif = arvif->vif;
1051 struct ieee80211_mutable_offsets offs = {};
1052 struct sk_buff *bcn;
1053 int ret;
1055 if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map))
1056 return 0;
1058 bcn = ieee80211_beacon_get_template(hw, vif, &offs);
1059 if (!bcn) {
1060 ath10k_warn(ar, "failed to get beacon template from mac80211\n");
1061 return -EPERM;
1064 ret = ath10k_mac_setup_bcn_p2p_ie(arvif, bcn);
1065 if (ret) {
1066 ath10k_warn(ar, "failed to setup p2p go bcn ie: %d\n", ret);
1067 kfree_skb(bcn);
1068 return ret;
1071 /* P2P IE is inserted by firmware automatically (as configured above)
1072 * so remove it from the base beacon template to avoid duplicate P2P
1073 * IEs in beacon frames.
1075 ath10k_mac_remove_vendor_ie(bcn, WLAN_OUI_WFA, WLAN_OUI_TYPE_WFA_P2P,
1076 offsetof(struct ieee80211_mgmt,
1077 u.beacon.variable));
1079 ret = ath10k_wmi_bcn_tmpl(ar, arvif->vdev_id, offs.tim_offset, bcn, 0,
1080 0, NULL, 0);
1081 kfree_skb(bcn);
1083 if (ret) {
1084 ath10k_warn(ar, "failed to submit beacon template command: %d\n",
1085 ret);
1086 return ret;
1089 return 0;
1092 static int ath10k_mac_setup_prb_tmpl(struct ath10k_vif *arvif)
1094 struct ath10k *ar = arvif->ar;
1095 struct ieee80211_hw *hw = ar->hw;
1096 struct ieee80211_vif *vif = arvif->vif;
1097 struct sk_buff *prb;
1098 int ret;
1100 if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map))
1101 return 0;
1103 prb = ieee80211_proberesp_get(hw, vif);
1104 if (!prb) {
1105 ath10k_warn(ar, "failed to get probe resp template from mac80211\n");
1106 return -EPERM;
1109 ret = ath10k_wmi_prb_tmpl(ar, arvif->vdev_id, prb);
1110 kfree_skb(prb);
1112 if (ret) {
1113 ath10k_warn(ar, "failed to submit probe resp template command: %d\n",
1114 ret);
1115 return ret;
1118 return 0;
1121 static void ath10k_control_beaconing(struct ath10k_vif *arvif,
1122 struct ieee80211_bss_conf *info)
1124 struct ath10k *ar = arvif->ar;
1125 int ret = 0;
1127 lockdep_assert_held(&arvif->ar->conf_mutex);
1129 if (!info->enable_beacon) {
1130 ath10k_vdev_stop(arvif);
1132 arvif->is_started = false;
1133 arvif->is_up = false;
1135 spin_lock_bh(&arvif->ar->data_lock);
1136 ath10k_mac_vif_beacon_free(arvif);
1137 spin_unlock_bh(&arvif->ar->data_lock);
1139 return;
1142 arvif->tx_seq_no = 0x1000;
1144 ret = ath10k_vdev_start(arvif);
1145 if (ret)
1146 return;
1148 arvif->aid = 0;
1149 ether_addr_copy(arvif->bssid, info->bssid);
1151 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
1152 arvif->bssid);
1153 if (ret) {
1154 ath10k_warn(ar, "failed to bring up vdev %d: %i\n",
1155 arvif->vdev_id, ret);
1156 ath10k_vdev_stop(arvif);
1157 return;
1160 arvif->is_started = true;
1161 arvif->is_up = true;
1163 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d up\n", arvif->vdev_id);
1166 static void ath10k_control_ibss(struct ath10k_vif *arvif,
1167 struct ieee80211_bss_conf *info,
1168 const u8 self_peer[ETH_ALEN])
1170 struct ath10k *ar = arvif->ar;
1171 u32 vdev_param;
1172 int ret = 0;
1174 lockdep_assert_held(&arvif->ar->conf_mutex);
1176 if (!info->ibss_joined) {
1177 ret = ath10k_peer_delete(arvif->ar, arvif->vdev_id, self_peer);
1178 if (ret)
1179 ath10k_warn(ar, "failed to delete IBSS self peer %pM for vdev %d: %d\n",
1180 self_peer, arvif->vdev_id, ret);
1182 if (is_zero_ether_addr(arvif->bssid))
1183 return;
1185 memset(arvif->bssid, 0, ETH_ALEN);
1187 return;
1190 ret = ath10k_peer_create(arvif->ar, arvif->vdev_id, self_peer);
1191 if (ret) {
1192 ath10k_warn(ar, "failed to create IBSS self peer %pM for vdev %d: %d\n",
1193 self_peer, arvif->vdev_id, ret);
1194 return;
1197 vdev_param = arvif->ar->wmi.vdev_param->atim_window;
1198 ret = ath10k_wmi_vdev_set_param(arvif->ar, arvif->vdev_id, vdev_param,
1199 ATH10K_DEFAULT_ATIM);
1200 if (ret)
1201 ath10k_warn(ar, "failed to set IBSS ATIM for vdev %d: %d\n",
1202 arvif->vdev_id, ret);
1205 static int ath10k_mac_vif_recalc_ps_wake_threshold(struct ath10k_vif *arvif)
1207 struct ath10k *ar = arvif->ar;
1208 u32 param;
1209 u32 value;
1210 int ret;
1212 lockdep_assert_held(&arvif->ar->conf_mutex);
1214 if (arvif->u.sta.uapsd)
1215 value = WMI_STA_PS_TX_WAKE_THRESHOLD_NEVER;
1216 else
1217 value = WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS;
1219 param = WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD;
1220 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param, value);
1221 if (ret) {
1222 ath10k_warn(ar, "failed to submit ps wake threshold %u on vdev %i: %d\n",
1223 value, arvif->vdev_id, ret);
1224 return ret;
1227 return 0;
1230 static int ath10k_mac_vif_recalc_ps_poll_count(struct ath10k_vif *arvif)
1232 struct ath10k *ar = arvif->ar;
1233 u32 param;
1234 u32 value;
1235 int ret;
1237 lockdep_assert_held(&arvif->ar->conf_mutex);
1239 if (arvif->u.sta.uapsd)
1240 value = WMI_STA_PS_PSPOLL_COUNT_UAPSD;
1241 else
1242 value = WMI_STA_PS_PSPOLL_COUNT_NO_MAX;
1244 param = WMI_STA_PS_PARAM_PSPOLL_COUNT;
1245 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
1246 param, value);
1247 if (ret) {
1248 ath10k_warn(ar, "failed to submit ps poll count %u on vdev %i: %d\n",
1249 value, arvif->vdev_id, ret);
1250 return ret;
1253 return 0;
1256 static int ath10k_mac_vif_setup_ps(struct ath10k_vif *arvif)
1258 struct ath10k *ar = arvif->ar;
1259 struct ieee80211_vif *vif = arvif->vif;
1260 struct ieee80211_conf *conf = &ar->hw->conf;
1261 enum wmi_sta_powersave_param param;
1262 enum wmi_sta_ps_mode psmode;
1263 int ret;
1264 int ps_timeout;
1266 lockdep_assert_held(&arvif->ar->conf_mutex);
1268 if (arvif->vif->type != NL80211_IFTYPE_STATION)
1269 return 0;
1271 if (vif->bss_conf.ps) {
1272 psmode = WMI_STA_PS_MODE_ENABLED;
1273 param = WMI_STA_PS_PARAM_INACTIVITY_TIME;
1275 ps_timeout = conf->dynamic_ps_timeout;
1276 if (ps_timeout == 0) {
1277 /* Firmware doesn't like 0 */
1278 ps_timeout = ieee80211_tu_to_usec(
1279 vif->bss_conf.beacon_int) / 1000;
1282 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param,
1283 ps_timeout);
1284 if (ret) {
1285 ath10k_warn(ar, "failed to set inactivity time for vdev %d: %i\n",
1286 arvif->vdev_id, ret);
1287 return ret;
1289 } else {
1290 psmode = WMI_STA_PS_MODE_DISABLED;
1293 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d psmode %s\n",
1294 arvif->vdev_id, psmode ? "enable" : "disable");
1296 ret = ath10k_wmi_set_psmode(ar, arvif->vdev_id, psmode);
1297 if (ret) {
1298 ath10k_warn(ar, "failed to set PS Mode %d for vdev %d: %d\n",
1299 psmode, arvif->vdev_id, ret);
1300 return ret;
1303 return 0;
1306 static int ath10k_mac_vif_disable_keepalive(struct ath10k_vif *arvif)
1308 struct ath10k *ar = arvif->ar;
1309 struct wmi_sta_keepalive_arg arg = {};
1310 int ret;
1312 lockdep_assert_held(&arvif->ar->conf_mutex);
1314 if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
1315 return 0;
1317 if (!test_bit(WMI_SERVICE_STA_KEEP_ALIVE, ar->wmi.svc_map))
1318 return 0;
1320 /* Some firmware revisions have a bug and ignore the `enabled` field.
1321 * Instead use the interval to disable the keepalive.
1323 arg.vdev_id = arvif->vdev_id;
1324 arg.enabled = 1;
1325 arg.method = WMI_STA_KEEPALIVE_METHOD_NULL_FRAME;
1326 arg.interval = WMI_STA_KEEPALIVE_INTERVAL_DISABLE;
1328 ret = ath10k_wmi_sta_keepalive(ar, &arg);
1329 if (ret) {
1330 ath10k_warn(ar, "failed to submit keepalive on vdev %i: %d\n",
1331 arvif->vdev_id, ret);
1332 return ret;
1335 return 0;
1338 /**********************/
1339 /* Station management */
1340 /**********************/
1342 static u32 ath10k_peer_assoc_h_listen_intval(struct ath10k *ar,
1343 struct ieee80211_vif *vif)
1345 /* Some firmware revisions have unstable STA powersave when listen
1346 * interval is set too high (e.g. 5). The symptoms are firmware doesn't
1347 * generate NullFunc frames properly even if buffered frames have been
1348 * indicated in Beacon TIM. Firmware would seldom wake up to pull
1349 * buffered frames. Often pinging the device from AP would simply fail.
1351 * As a workaround set it to 1.
1353 if (vif->type == NL80211_IFTYPE_STATION)
1354 return 1;
1356 return ar->hw->conf.listen_interval;
1359 static void ath10k_peer_assoc_h_basic(struct ath10k *ar,
1360 struct ieee80211_vif *vif,
1361 struct ieee80211_sta *sta,
1362 struct wmi_peer_assoc_complete_arg *arg)
1364 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1366 lockdep_assert_held(&ar->conf_mutex);
1368 ether_addr_copy(arg->addr, sta->addr);
1369 arg->vdev_id = arvif->vdev_id;
1370 arg->peer_aid = sta->aid;
1371 arg->peer_flags |= WMI_PEER_AUTH;
1372 arg->peer_listen_intval = ath10k_peer_assoc_h_listen_intval(ar, vif);
1373 arg->peer_num_spatial_streams = 1;
1374 arg->peer_caps = vif->bss_conf.assoc_capability;
1377 static void ath10k_peer_assoc_h_crypto(struct ath10k *ar,
1378 struct ieee80211_vif *vif,
1379 struct wmi_peer_assoc_complete_arg *arg)
1381 struct ieee80211_bss_conf *info = &vif->bss_conf;
1382 struct cfg80211_bss *bss;
1383 const u8 *rsnie = NULL;
1384 const u8 *wpaie = NULL;
1386 lockdep_assert_held(&ar->conf_mutex);
1388 bss = cfg80211_get_bss(ar->hw->wiphy, ar->hw->conf.chandef.chan,
1389 info->bssid, NULL, 0, 0, 0);
1390 if (bss) {
1391 const struct cfg80211_bss_ies *ies;
1393 rcu_read_lock();
1394 rsnie = ieee80211_bss_get_ie(bss, WLAN_EID_RSN);
1396 ies = rcu_dereference(bss->ies);
1398 wpaie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
1399 WLAN_OUI_TYPE_MICROSOFT_WPA,
1400 ies->data,
1401 ies->len);
1402 rcu_read_unlock();
1403 cfg80211_put_bss(ar->hw->wiphy, bss);
1406 /* FIXME: base on RSN IE/WPA IE is a correct idea? */
1407 if (rsnie || wpaie) {
1408 ath10k_dbg(ar, ATH10K_DBG_WMI, "%s: rsn ie found\n", __func__);
1409 arg->peer_flags |= WMI_PEER_NEED_PTK_4_WAY;
1412 if (wpaie) {
1413 ath10k_dbg(ar, ATH10K_DBG_WMI, "%s: wpa ie found\n", __func__);
1414 arg->peer_flags |= WMI_PEER_NEED_GTK_2_WAY;
1418 static void ath10k_peer_assoc_h_rates(struct ath10k *ar,
1419 struct ieee80211_sta *sta,
1420 struct wmi_peer_assoc_complete_arg *arg)
1422 struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates;
1423 const struct ieee80211_supported_band *sband;
1424 const struct ieee80211_rate *rates;
1425 u32 ratemask;
1426 int i;
1428 lockdep_assert_held(&ar->conf_mutex);
1430 sband = ar->hw->wiphy->bands[ar->hw->conf.chandef.chan->band];
1431 ratemask = sta->supp_rates[ar->hw->conf.chandef.chan->band];
1432 rates = sband->bitrates;
1434 rateset->num_rates = 0;
1436 for (i = 0; i < 32; i++, ratemask >>= 1, rates++) {
1437 if (!(ratemask & 1))
1438 continue;
1440 rateset->rates[rateset->num_rates] = rates->hw_value;
1441 rateset->num_rates++;
1445 static void ath10k_peer_assoc_h_ht(struct ath10k *ar,
1446 struct ieee80211_sta *sta,
1447 struct wmi_peer_assoc_complete_arg *arg)
1449 const struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
1450 int i, n;
1451 u32 stbc;
1453 lockdep_assert_held(&ar->conf_mutex);
1455 if (!ht_cap->ht_supported)
1456 return;
1458 arg->peer_flags |= WMI_PEER_HT;
1459 arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
1460 ht_cap->ampdu_factor)) - 1;
1462 arg->peer_mpdu_density =
1463 ath10k_parse_mpdudensity(ht_cap->ampdu_density);
1465 arg->peer_ht_caps = ht_cap->cap;
1466 arg->peer_rate_caps |= WMI_RC_HT_FLAG;
1468 if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING)
1469 arg->peer_flags |= WMI_PEER_LDPC;
1471 if (sta->bandwidth >= IEEE80211_STA_RX_BW_40) {
1472 arg->peer_flags |= WMI_PEER_40MHZ;
1473 arg->peer_rate_caps |= WMI_RC_CW40_FLAG;
1476 if (ht_cap->cap & IEEE80211_HT_CAP_SGI_20)
1477 arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
1479 if (ht_cap->cap & IEEE80211_HT_CAP_SGI_40)
1480 arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
1482 if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) {
1483 arg->peer_rate_caps |= WMI_RC_TX_STBC_FLAG;
1484 arg->peer_flags |= WMI_PEER_STBC;
1487 if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) {
1488 stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC;
1489 stbc = stbc >> IEEE80211_HT_CAP_RX_STBC_SHIFT;
1490 stbc = stbc << WMI_RC_RX_STBC_FLAG_S;
1491 arg->peer_rate_caps |= stbc;
1492 arg->peer_flags |= WMI_PEER_STBC;
1495 if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2])
1496 arg->peer_rate_caps |= WMI_RC_TS_FLAG;
1497 else if (ht_cap->mcs.rx_mask[1])
1498 arg->peer_rate_caps |= WMI_RC_DS_FLAG;
1500 for (i = 0, n = 0; i < IEEE80211_HT_MCS_MASK_LEN*8; i++)
1501 if (ht_cap->mcs.rx_mask[i/8] & (1 << i%8))
1502 arg->peer_ht_rates.rates[n++] = i;
1505 * This is a workaround for HT-enabled STAs which break the spec
1506 * and have no HT capabilities RX mask (no HT RX MCS map).
1508 * As per spec, in section 20.3.5 Modulation and coding scheme (MCS),
1509 * MCS 0 through 7 are mandatory in 20MHz with 800 ns GI at all STAs.
1511 * Firmware asserts if such situation occurs.
1513 if (n == 0) {
1514 arg->peer_ht_rates.num_rates = 8;
1515 for (i = 0; i < arg->peer_ht_rates.num_rates; i++)
1516 arg->peer_ht_rates.rates[i] = i;
1517 } else {
1518 arg->peer_ht_rates.num_rates = n;
1519 arg->peer_num_spatial_streams = sta->rx_nss;
1522 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n",
1523 arg->addr,
1524 arg->peer_ht_rates.num_rates,
1525 arg->peer_num_spatial_streams);
1528 static int ath10k_peer_assoc_qos_ap(struct ath10k *ar,
1529 struct ath10k_vif *arvif,
1530 struct ieee80211_sta *sta)
1532 u32 uapsd = 0;
1533 u32 max_sp = 0;
1534 int ret = 0;
1536 lockdep_assert_held(&ar->conf_mutex);
1538 if (sta->wme && sta->uapsd_queues) {
1539 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac uapsd_queues 0x%x max_sp %d\n",
1540 sta->uapsd_queues, sta->max_sp);
1542 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO)
1543 uapsd |= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN |
1544 WMI_AP_PS_UAPSD_AC3_TRIGGER_EN;
1545 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI)
1546 uapsd |= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN |
1547 WMI_AP_PS_UAPSD_AC2_TRIGGER_EN;
1548 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK)
1549 uapsd |= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN |
1550 WMI_AP_PS_UAPSD_AC1_TRIGGER_EN;
1551 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE)
1552 uapsd |= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN |
1553 WMI_AP_PS_UAPSD_AC0_TRIGGER_EN;
1555 if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP)
1556 max_sp = sta->max_sp;
1558 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
1559 sta->addr,
1560 WMI_AP_PS_PEER_PARAM_UAPSD,
1561 uapsd);
1562 if (ret) {
1563 ath10k_warn(ar, "failed to set ap ps peer param uapsd for vdev %i: %d\n",
1564 arvif->vdev_id, ret);
1565 return ret;
1568 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
1569 sta->addr,
1570 WMI_AP_PS_PEER_PARAM_MAX_SP,
1571 max_sp);
1572 if (ret) {
1573 ath10k_warn(ar, "failed to set ap ps peer param max sp for vdev %i: %d\n",
1574 arvif->vdev_id, ret);
1575 return ret;
1578 /* TODO setup this based on STA listen interval and
1579 beacon interval. Currently we don't know
1580 sta->listen_interval - mac80211 patch required.
1581 Currently use 10 seconds */
1582 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id, sta->addr,
1583 WMI_AP_PS_PEER_PARAM_AGEOUT_TIME,
1584 10);
1585 if (ret) {
1586 ath10k_warn(ar, "failed to set ap ps peer param ageout time for vdev %i: %d\n",
1587 arvif->vdev_id, ret);
1588 return ret;
1592 return 0;
1595 static void ath10k_peer_assoc_h_vht(struct ath10k *ar,
1596 struct ieee80211_sta *sta,
1597 struct wmi_peer_assoc_complete_arg *arg)
1599 const struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
1600 u8 ampdu_factor;
1602 if (!vht_cap->vht_supported)
1603 return;
1605 arg->peer_flags |= WMI_PEER_VHT;
1607 if (ar->hw->conf.chandef.chan->band == IEEE80211_BAND_2GHZ)
1608 arg->peer_flags |= WMI_PEER_VHT_2G;
1610 arg->peer_vht_caps = vht_cap->cap;
1612 ampdu_factor = (vht_cap->cap &
1613 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >>
1614 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
1616 /* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to
1617 * zero in VHT IE. Using it would result in degraded throughput.
1618 * arg->peer_max_mpdu at this point contains HT max_mpdu so keep
1619 * it if VHT max_mpdu is smaller. */
1620 arg->peer_max_mpdu = max(arg->peer_max_mpdu,
1621 (1U << (IEEE80211_HT_MAX_AMPDU_FACTOR +
1622 ampdu_factor)) - 1);
1624 if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
1625 arg->peer_flags |= WMI_PEER_80MHZ;
1627 arg->peer_vht_rates.rx_max_rate =
1628 __le16_to_cpu(vht_cap->vht_mcs.rx_highest);
1629 arg->peer_vht_rates.rx_mcs_set =
1630 __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map);
1631 arg->peer_vht_rates.tx_max_rate =
1632 __le16_to_cpu(vht_cap->vht_mcs.tx_highest);
1633 arg->peer_vht_rates.tx_mcs_set =
1634 __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map);
1636 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vht peer %pM max_mpdu %d flags 0x%x\n",
1637 sta->addr, arg->peer_max_mpdu, arg->peer_flags);
1640 static void ath10k_peer_assoc_h_qos(struct ath10k *ar,
1641 struct ieee80211_vif *vif,
1642 struct ieee80211_sta *sta,
1643 struct wmi_peer_assoc_complete_arg *arg)
1645 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1647 switch (arvif->vdev_type) {
1648 case WMI_VDEV_TYPE_AP:
1649 if (sta->wme)
1650 arg->peer_flags |= WMI_PEER_QOS;
1652 if (sta->wme && sta->uapsd_queues) {
1653 arg->peer_flags |= WMI_PEER_APSD;
1654 arg->peer_rate_caps |= WMI_RC_UAPSD_FLAG;
1656 break;
1657 case WMI_VDEV_TYPE_STA:
1658 if (vif->bss_conf.qos)
1659 arg->peer_flags |= WMI_PEER_QOS;
1660 break;
1661 case WMI_VDEV_TYPE_IBSS:
1662 if (sta->wme)
1663 arg->peer_flags |= WMI_PEER_QOS;
1664 break;
1665 default:
1666 break;
1669 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac peer %pM qos %d\n",
1670 sta->addr, !!(arg->peer_flags & WMI_PEER_QOS));
1673 static bool ath10k_mac_sta_has_11g_rates(struct ieee80211_sta *sta)
1675 /* First 4 rates in ath10k_rates are CCK (11b) rates. */
1676 return sta->supp_rates[IEEE80211_BAND_2GHZ] >> 4;
1679 static void ath10k_peer_assoc_h_phymode(struct ath10k *ar,
1680 struct ieee80211_vif *vif,
1681 struct ieee80211_sta *sta,
1682 struct wmi_peer_assoc_complete_arg *arg)
1684 enum wmi_phy_mode phymode = MODE_UNKNOWN;
1686 switch (ar->hw->conf.chandef.chan->band) {
1687 case IEEE80211_BAND_2GHZ:
1688 if (sta->vht_cap.vht_supported) {
1689 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1690 phymode = MODE_11AC_VHT40;
1691 else
1692 phymode = MODE_11AC_VHT20;
1693 } else if (sta->ht_cap.ht_supported) {
1694 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1695 phymode = MODE_11NG_HT40;
1696 else
1697 phymode = MODE_11NG_HT20;
1698 } else if (ath10k_mac_sta_has_11g_rates(sta)) {
1699 phymode = MODE_11G;
1700 } else {
1701 phymode = MODE_11B;
1704 break;
1705 case IEEE80211_BAND_5GHZ:
1707 * Check VHT first.
1709 if (sta->vht_cap.vht_supported) {
1710 if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
1711 phymode = MODE_11AC_VHT80;
1712 else if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1713 phymode = MODE_11AC_VHT40;
1714 else if (sta->bandwidth == IEEE80211_STA_RX_BW_20)
1715 phymode = MODE_11AC_VHT20;
1716 } else if (sta->ht_cap.ht_supported) {
1717 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1718 phymode = MODE_11NA_HT40;
1719 else
1720 phymode = MODE_11NA_HT20;
1721 } else {
1722 phymode = MODE_11A;
1725 break;
1726 default:
1727 break;
1730 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac peer %pM phymode %s\n",
1731 sta->addr, ath10k_wmi_phymode_str(phymode));
1733 arg->peer_phymode = phymode;
1734 WARN_ON(phymode == MODE_UNKNOWN);
1737 static int ath10k_peer_assoc_prepare(struct ath10k *ar,
1738 struct ieee80211_vif *vif,
1739 struct ieee80211_sta *sta,
1740 struct wmi_peer_assoc_complete_arg *arg)
1742 lockdep_assert_held(&ar->conf_mutex);
1744 memset(arg, 0, sizeof(*arg));
1746 ath10k_peer_assoc_h_basic(ar, vif, sta, arg);
1747 ath10k_peer_assoc_h_crypto(ar, vif, arg);
1748 ath10k_peer_assoc_h_rates(ar, sta, arg);
1749 ath10k_peer_assoc_h_ht(ar, sta, arg);
1750 ath10k_peer_assoc_h_vht(ar, sta, arg);
1751 ath10k_peer_assoc_h_qos(ar, vif, sta, arg);
1752 ath10k_peer_assoc_h_phymode(ar, vif, sta, arg);
1754 return 0;
1757 static const u32 ath10k_smps_map[] = {
1758 [WLAN_HT_CAP_SM_PS_STATIC] = WMI_PEER_SMPS_STATIC,
1759 [WLAN_HT_CAP_SM_PS_DYNAMIC] = WMI_PEER_SMPS_DYNAMIC,
1760 [WLAN_HT_CAP_SM_PS_INVALID] = WMI_PEER_SMPS_PS_NONE,
1761 [WLAN_HT_CAP_SM_PS_DISABLED] = WMI_PEER_SMPS_PS_NONE,
1764 static int ath10k_setup_peer_smps(struct ath10k *ar, struct ath10k_vif *arvif,
1765 const u8 *addr,
1766 const struct ieee80211_sta_ht_cap *ht_cap)
1768 int smps;
1770 if (!ht_cap->ht_supported)
1771 return 0;
1773 smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
1774 smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
1776 if (smps >= ARRAY_SIZE(ath10k_smps_map))
1777 return -EINVAL;
1779 return ath10k_wmi_peer_set_param(ar, arvif->vdev_id, addr,
1780 WMI_PEER_SMPS_STATE,
1781 ath10k_smps_map[smps]);
1784 /* can be called only in mac80211 callbacks due to `key_count` usage */
1785 static void ath10k_bss_assoc(struct ieee80211_hw *hw,
1786 struct ieee80211_vif *vif,
1787 struct ieee80211_bss_conf *bss_conf)
1789 struct ath10k *ar = hw->priv;
1790 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1791 struct ieee80211_sta_ht_cap ht_cap;
1792 struct wmi_peer_assoc_complete_arg peer_arg;
1793 struct ieee80211_sta *ap_sta;
1794 int ret;
1796 lockdep_assert_held(&ar->conf_mutex);
1798 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i assoc bssid %pM aid %d\n",
1799 arvif->vdev_id, arvif->bssid, arvif->aid);
1801 rcu_read_lock();
1803 ap_sta = ieee80211_find_sta(vif, bss_conf->bssid);
1804 if (!ap_sta) {
1805 ath10k_warn(ar, "failed to find station entry for bss %pM vdev %i\n",
1806 bss_conf->bssid, arvif->vdev_id);
1807 rcu_read_unlock();
1808 return;
1811 /* ap_sta must be accessed only within rcu section which must be left
1812 * before calling ath10k_setup_peer_smps() which might sleep. */
1813 ht_cap = ap_sta->ht_cap;
1815 ret = ath10k_peer_assoc_prepare(ar, vif, ap_sta, &peer_arg);
1816 if (ret) {
1817 ath10k_warn(ar, "failed to prepare peer assoc for %pM vdev %i: %d\n",
1818 bss_conf->bssid, arvif->vdev_id, ret);
1819 rcu_read_unlock();
1820 return;
1823 rcu_read_unlock();
1825 ret = ath10k_wmi_peer_assoc(ar, &peer_arg);
1826 if (ret) {
1827 ath10k_warn(ar, "failed to run peer assoc for %pM vdev %i: %d\n",
1828 bss_conf->bssid, arvif->vdev_id, ret);
1829 return;
1832 ret = ath10k_setup_peer_smps(ar, arvif, bss_conf->bssid, &ht_cap);
1833 if (ret) {
1834 ath10k_warn(ar, "failed to setup peer SMPS for vdev %i: %d\n",
1835 arvif->vdev_id, ret);
1836 return;
1839 ath10k_dbg(ar, ATH10K_DBG_MAC,
1840 "mac vdev %d up (associated) bssid %pM aid %d\n",
1841 arvif->vdev_id, bss_conf->bssid, bss_conf->aid);
1843 WARN_ON(arvif->is_up);
1845 arvif->aid = bss_conf->aid;
1846 ether_addr_copy(arvif->bssid, bss_conf->bssid);
1848 ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid);
1849 if (ret) {
1850 ath10k_warn(ar, "failed to set vdev %d up: %d\n",
1851 arvif->vdev_id, ret);
1852 return;
1855 arvif->is_up = true;
1858 static void ath10k_bss_disassoc(struct ieee80211_hw *hw,
1859 struct ieee80211_vif *vif)
1861 struct ath10k *ar = hw->priv;
1862 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1863 int ret;
1865 lockdep_assert_held(&ar->conf_mutex);
1867 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i disassoc bssid %pM\n",
1868 arvif->vdev_id, arvif->bssid);
1870 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
1871 if (ret)
1872 ath10k_warn(ar, "faield to down vdev %i: %d\n",
1873 arvif->vdev_id, ret);
1875 arvif->def_wep_key_idx = -1;
1877 arvif->is_up = false;
1880 static int ath10k_station_assoc(struct ath10k *ar,
1881 struct ieee80211_vif *vif,
1882 struct ieee80211_sta *sta,
1883 bool reassoc)
1885 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1886 struct wmi_peer_assoc_complete_arg peer_arg;
1887 int ret = 0;
1889 lockdep_assert_held(&ar->conf_mutex);
1891 ret = ath10k_peer_assoc_prepare(ar, vif, sta, &peer_arg);
1892 if (ret) {
1893 ath10k_warn(ar, "failed to prepare WMI peer assoc for %pM vdev %i: %i\n",
1894 sta->addr, arvif->vdev_id, ret);
1895 return ret;
1898 peer_arg.peer_reassoc = reassoc;
1899 ret = ath10k_wmi_peer_assoc(ar, &peer_arg);
1900 if (ret) {
1901 ath10k_warn(ar, "failed to run peer assoc for STA %pM vdev %i: %d\n",
1902 sta->addr, arvif->vdev_id, ret);
1903 return ret;
1906 /* Re-assoc is run only to update supported rates for given station. It
1907 * doesn't make much sense to reconfigure the peer completely.
1909 if (!reassoc) {
1910 ret = ath10k_setup_peer_smps(ar, arvif, sta->addr,
1911 &sta->ht_cap);
1912 if (ret) {
1913 ath10k_warn(ar, "failed to setup peer SMPS for vdev %d: %d\n",
1914 arvif->vdev_id, ret);
1915 return ret;
1918 ret = ath10k_peer_assoc_qos_ap(ar, arvif, sta);
1919 if (ret) {
1920 ath10k_warn(ar, "failed to set qos params for STA %pM for vdev %i: %d\n",
1921 sta->addr, arvif->vdev_id, ret);
1922 return ret;
1925 if (!sta->wme) {
1926 arvif->num_legacy_stations++;
1927 ret = ath10k_recalc_rtscts_prot(arvif);
1928 if (ret) {
1929 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
1930 arvif->vdev_id, ret);
1931 return ret;
1935 /* Plumb cached keys only for static WEP */
1936 if (arvif->def_wep_key_idx != -1) {
1937 ret = ath10k_install_peer_wep_keys(arvif, sta->addr);
1938 if (ret) {
1939 ath10k_warn(ar, "failed to install peer wep keys for vdev %i: %d\n",
1940 arvif->vdev_id, ret);
1941 return ret;
1946 return ret;
1949 static int ath10k_station_disassoc(struct ath10k *ar,
1950 struct ieee80211_vif *vif,
1951 struct ieee80211_sta *sta)
1953 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1954 int ret = 0;
1956 lockdep_assert_held(&ar->conf_mutex);
1958 if (!sta->wme) {
1959 arvif->num_legacy_stations--;
1960 ret = ath10k_recalc_rtscts_prot(arvif);
1961 if (ret) {
1962 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
1963 arvif->vdev_id, ret);
1964 return ret;
1968 ret = ath10k_clear_peer_keys(arvif, sta->addr);
1969 if (ret) {
1970 ath10k_warn(ar, "failed to clear all peer wep keys for vdev %i: %d\n",
1971 arvif->vdev_id, ret);
1972 return ret;
1975 return ret;
1978 /**************/
1979 /* Regulatory */
1980 /**************/
1982 static int ath10k_update_channel_list(struct ath10k *ar)
1984 struct ieee80211_hw *hw = ar->hw;
1985 struct ieee80211_supported_band **bands;
1986 enum ieee80211_band band;
1987 struct ieee80211_channel *channel;
1988 struct wmi_scan_chan_list_arg arg = {0};
1989 struct wmi_channel_arg *ch;
1990 bool passive;
1991 int len;
1992 int ret;
1993 int i;
1995 lockdep_assert_held(&ar->conf_mutex);
1997 bands = hw->wiphy->bands;
1998 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
1999 if (!bands[band])
2000 continue;
2002 for (i = 0; i < bands[band]->n_channels; i++) {
2003 if (bands[band]->channels[i].flags &
2004 IEEE80211_CHAN_DISABLED)
2005 continue;
2007 arg.n_channels++;
2011 len = sizeof(struct wmi_channel_arg) * arg.n_channels;
2012 arg.channels = kzalloc(len, GFP_KERNEL);
2013 if (!arg.channels)
2014 return -ENOMEM;
2016 ch = arg.channels;
2017 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
2018 if (!bands[band])
2019 continue;
2021 for (i = 0; i < bands[band]->n_channels; i++) {
2022 channel = &bands[band]->channels[i];
2024 if (channel->flags & IEEE80211_CHAN_DISABLED)
2025 continue;
2027 ch->allow_ht = true;
2029 /* FIXME: when should we really allow VHT? */
2030 ch->allow_vht = true;
2032 ch->allow_ibss =
2033 !(channel->flags & IEEE80211_CHAN_NO_IR);
2035 ch->ht40plus =
2036 !(channel->flags & IEEE80211_CHAN_NO_HT40PLUS);
2038 ch->chan_radar =
2039 !!(channel->flags & IEEE80211_CHAN_RADAR);
2041 passive = channel->flags & IEEE80211_CHAN_NO_IR;
2042 ch->passive = passive;
2044 ch->freq = channel->center_freq;
2045 ch->band_center_freq1 = channel->center_freq;
2046 ch->min_power = 0;
2047 ch->max_power = channel->max_power * 2;
2048 ch->max_reg_power = channel->max_reg_power * 2;
2049 ch->max_antenna_gain = channel->max_antenna_gain * 2;
2050 ch->reg_class_id = 0; /* FIXME */
2052 /* FIXME: why use only legacy modes, why not any
2053 * HT/VHT modes? Would that even make any
2054 * difference? */
2055 if (channel->band == IEEE80211_BAND_2GHZ)
2056 ch->mode = MODE_11G;
2057 else
2058 ch->mode = MODE_11A;
2060 if (WARN_ON_ONCE(ch->mode == MODE_UNKNOWN))
2061 continue;
2063 ath10k_dbg(ar, ATH10K_DBG_WMI,
2064 "mac channel [%zd/%d] freq %d maxpower %d regpower %d antenna %d mode %d\n",
2065 ch - arg.channels, arg.n_channels,
2066 ch->freq, ch->max_power, ch->max_reg_power,
2067 ch->max_antenna_gain, ch->mode);
2069 ch++;
2073 ret = ath10k_wmi_scan_chan_list(ar, &arg);
2074 kfree(arg.channels);
2076 return ret;
2079 static enum wmi_dfs_region
2080 ath10k_mac_get_dfs_region(enum nl80211_dfs_regions dfs_region)
2082 switch (dfs_region) {
2083 case NL80211_DFS_UNSET:
2084 return WMI_UNINIT_DFS_DOMAIN;
2085 case NL80211_DFS_FCC:
2086 return WMI_FCC_DFS_DOMAIN;
2087 case NL80211_DFS_ETSI:
2088 return WMI_ETSI_DFS_DOMAIN;
2089 case NL80211_DFS_JP:
2090 return WMI_MKK4_DFS_DOMAIN;
2092 return WMI_UNINIT_DFS_DOMAIN;
2095 static void ath10k_regd_update(struct ath10k *ar)
2097 struct reg_dmn_pair_mapping *regpair;
2098 int ret;
2099 enum wmi_dfs_region wmi_dfs_reg;
2100 enum nl80211_dfs_regions nl_dfs_reg;
2102 lockdep_assert_held(&ar->conf_mutex);
2104 ret = ath10k_update_channel_list(ar);
2105 if (ret)
2106 ath10k_warn(ar, "failed to update channel list: %d\n", ret);
2108 regpair = ar->ath_common.regulatory.regpair;
2110 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) {
2111 nl_dfs_reg = ar->dfs_detector->region;
2112 wmi_dfs_reg = ath10k_mac_get_dfs_region(nl_dfs_reg);
2113 } else {
2114 wmi_dfs_reg = WMI_UNINIT_DFS_DOMAIN;
2117 /* Target allows setting up per-band regdomain but ath_common provides
2118 * a combined one only */
2119 ret = ath10k_wmi_pdev_set_regdomain(ar,
2120 regpair->reg_domain,
2121 regpair->reg_domain, /* 2ghz */
2122 regpair->reg_domain, /* 5ghz */
2123 regpair->reg_2ghz_ctl,
2124 regpair->reg_5ghz_ctl,
2125 wmi_dfs_reg);
2126 if (ret)
2127 ath10k_warn(ar, "failed to set pdev regdomain: %d\n", ret);
2130 static void ath10k_reg_notifier(struct wiphy *wiphy,
2131 struct regulatory_request *request)
2133 struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
2134 struct ath10k *ar = hw->priv;
2135 bool result;
2137 ath_reg_notifier_apply(wiphy, request, &ar->ath_common.regulatory);
2139 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) {
2140 ath10k_dbg(ar, ATH10K_DBG_REGULATORY, "dfs region 0x%x\n",
2141 request->dfs_region);
2142 result = ar->dfs_detector->set_dfs_domain(ar->dfs_detector,
2143 request->dfs_region);
2144 if (!result)
2145 ath10k_warn(ar, "DFS region 0x%X not supported, will trigger radar for every pulse\n",
2146 request->dfs_region);
2149 mutex_lock(&ar->conf_mutex);
2150 if (ar->state == ATH10K_STATE_ON)
2151 ath10k_regd_update(ar);
2152 mutex_unlock(&ar->conf_mutex);
2155 /***************/
2156 /* TX handlers */
2157 /***************/
2159 static u8 ath10k_tx_h_get_tid(struct ieee80211_hdr *hdr)
2161 if (ieee80211_is_mgmt(hdr->frame_control))
2162 return HTT_DATA_TX_EXT_TID_MGMT;
2164 if (!ieee80211_is_data_qos(hdr->frame_control))
2165 return HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
2167 if (!is_unicast_ether_addr(ieee80211_get_DA(hdr)))
2168 return HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
2170 return ieee80211_get_qos_ctl(hdr)[0] & IEEE80211_QOS_CTL_TID_MASK;
2173 static u8 ath10k_tx_h_get_vdev_id(struct ath10k *ar, struct ieee80211_vif *vif)
2175 if (vif)
2176 return ath10k_vif_to_arvif(vif)->vdev_id;
2178 if (ar->monitor_started)
2179 return ar->monitor_vdev_id;
2181 ath10k_warn(ar, "failed to resolve vdev id\n");
2182 return 0;
2185 /* HTT Tx uses Native Wifi tx mode which expects 802.11 frames without QoS
2186 * Control in the header.
2188 static void ath10k_tx_h_nwifi(struct ieee80211_hw *hw, struct sk_buff *skb)
2190 struct ieee80211_hdr *hdr = (void *)skb->data;
2191 struct ath10k_skb_cb *cb = ATH10K_SKB_CB(skb);
2192 u8 *qos_ctl;
2194 if (!ieee80211_is_data_qos(hdr->frame_control))
2195 return;
2197 qos_ctl = ieee80211_get_qos_ctl(hdr);
2198 memmove(skb->data + IEEE80211_QOS_CTL_LEN,
2199 skb->data, (void *)qos_ctl - (void *)skb->data);
2200 skb_pull(skb, IEEE80211_QOS_CTL_LEN);
2202 /* Fw/Hw generates a corrupted QoS Control Field for QoS NullFunc
2203 * frames. Powersave is handled by the fw/hw so QoS NyllFunc frames are
2204 * used only for CQM purposes (e.g. hostapd station keepalive ping) so
2205 * it is safe to downgrade to NullFunc.
2207 hdr = (void *)skb->data;
2208 if (ieee80211_is_qos_nullfunc(hdr->frame_control)) {
2209 hdr->frame_control &= ~__cpu_to_le16(IEEE80211_STYPE_QOS_DATA);
2210 cb->htt.tid = HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
2214 static void ath10k_tx_h_add_p2p_noa_ie(struct ath10k *ar,
2215 struct ieee80211_vif *vif,
2216 struct sk_buff *skb)
2218 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
2219 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2221 /* This is case only for P2P_GO */
2222 if (arvif->vdev_type != WMI_VDEV_TYPE_AP ||
2223 arvif->vdev_subtype != WMI_VDEV_SUBTYPE_P2P_GO)
2224 return;
2226 if (unlikely(ieee80211_is_probe_resp(hdr->frame_control))) {
2227 spin_lock_bh(&ar->data_lock);
2228 if (arvif->u.ap.noa_data)
2229 if (!pskb_expand_head(skb, 0, arvif->u.ap.noa_len,
2230 GFP_ATOMIC))
2231 memcpy(skb_put(skb, arvif->u.ap.noa_len),
2232 arvif->u.ap.noa_data,
2233 arvif->u.ap.noa_len);
2234 spin_unlock_bh(&ar->data_lock);
2238 static bool ath10k_mac_need_offchan_tx_work(struct ath10k *ar)
2240 /* FIXME: Not really sure since when the behaviour changed. At some
2241 * point new firmware stopped requiring creation of peer entries for
2242 * offchannel tx (and actually creating them causes issues with wmi-htc
2243 * tx credit replenishment and reliability). Assuming it's at least 3.4
2244 * because that's when the `freq` was introduced to TX_FRM HTT command.
2246 return !(ar->htt.target_version_major >= 3 &&
2247 ar->htt.target_version_minor >= 4);
2250 static void ath10k_tx_htt(struct ath10k *ar, struct sk_buff *skb)
2252 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
2253 int ret = 0;
2255 if (ar->htt.target_version_major >= 3) {
2256 /* Since HTT 3.0 there is no separate mgmt tx command */
2257 ret = ath10k_htt_tx(&ar->htt, skb);
2258 goto exit;
2261 if (ieee80211_is_mgmt(hdr->frame_control)) {
2262 if (test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX,
2263 ar->fw_features)) {
2264 if (skb_queue_len(&ar->wmi_mgmt_tx_queue) >=
2265 ATH10K_MAX_NUM_MGMT_PENDING) {
2266 ath10k_warn(ar, "reached WMI management transmit queue limit\n");
2267 ret = -EBUSY;
2268 goto exit;
2271 skb_queue_tail(&ar->wmi_mgmt_tx_queue, skb);
2272 ieee80211_queue_work(ar->hw, &ar->wmi_mgmt_tx_work);
2273 } else {
2274 ret = ath10k_htt_mgmt_tx(&ar->htt, skb);
2276 } else if (!test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX,
2277 ar->fw_features) &&
2278 ieee80211_is_nullfunc(hdr->frame_control)) {
2279 /* FW does not report tx status properly for NullFunc frames
2280 * unless they are sent through mgmt tx path. mac80211 sends
2281 * those frames when it detects link/beacon loss and depends
2282 * on the tx status to be correct. */
2283 ret = ath10k_htt_mgmt_tx(&ar->htt, skb);
2284 } else {
2285 ret = ath10k_htt_tx(&ar->htt, skb);
2288 exit:
2289 if (ret) {
2290 ath10k_warn(ar, "failed to transmit packet, dropping: %d\n",
2291 ret);
2292 ieee80211_free_txskb(ar->hw, skb);
2296 void ath10k_offchan_tx_purge(struct ath10k *ar)
2298 struct sk_buff *skb;
2300 for (;;) {
2301 skb = skb_dequeue(&ar->offchan_tx_queue);
2302 if (!skb)
2303 break;
2305 ieee80211_free_txskb(ar->hw, skb);
2309 void ath10k_offchan_tx_work(struct work_struct *work)
2311 struct ath10k *ar = container_of(work, struct ath10k, offchan_tx_work);
2312 struct ath10k_peer *peer;
2313 struct ieee80211_hdr *hdr;
2314 struct sk_buff *skb;
2315 const u8 *peer_addr;
2316 int vdev_id;
2317 int ret;
2319 /* FW requirement: We must create a peer before FW will send out
2320 * an offchannel frame. Otherwise the frame will be stuck and
2321 * never transmitted. We delete the peer upon tx completion.
2322 * It is unlikely that a peer for offchannel tx will already be
2323 * present. However it may be in some rare cases so account for that.
2324 * Otherwise we might remove a legitimate peer and break stuff. */
2326 for (;;) {
2327 skb = skb_dequeue(&ar->offchan_tx_queue);
2328 if (!skb)
2329 break;
2331 mutex_lock(&ar->conf_mutex);
2333 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac offchannel skb %p\n",
2334 skb);
2336 hdr = (struct ieee80211_hdr *)skb->data;
2337 peer_addr = ieee80211_get_DA(hdr);
2338 vdev_id = ATH10K_SKB_CB(skb)->vdev_id;
2340 spin_lock_bh(&ar->data_lock);
2341 peer = ath10k_peer_find(ar, vdev_id, peer_addr);
2342 spin_unlock_bh(&ar->data_lock);
2344 if (peer)
2345 /* FIXME: should this use ath10k_warn()? */
2346 ath10k_dbg(ar, ATH10K_DBG_MAC, "peer %pM on vdev %d already present\n",
2347 peer_addr, vdev_id);
2349 if (!peer) {
2350 ret = ath10k_peer_create(ar, vdev_id, peer_addr);
2351 if (ret)
2352 ath10k_warn(ar, "failed to create peer %pM on vdev %d: %d\n",
2353 peer_addr, vdev_id, ret);
2356 spin_lock_bh(&ar->data_lock);
2357 reinit_completion(&ar->offchan_tx_completed);
2358 ar->offchan_tx_skb = skb;
2359 spin_unlock_bh(&ar->data_lock);
2361 ath10k_tx_htt(ar, skb);
2363 ret = wait_for_completion_timeout(&ar->offchan_tx_completed,
2364 3 * HZ);
2365 if (ret == 0)
2366 ath10k_warn(ar, "timed out waiting for offchannel skb %p\n",
2367 skb);
2369 if (!peer) {
2370 ret = ath10k_peer_delete(ar, vdev_id, peer_addr);
2371 if (ret)
2372 ath10k_warn(ar, "failed to delete peer %pM on vdev %d: %d\n",
2373 peer_addr, vdev_id, ret);
2376 mutex_unlock(&ar->conf_mutex);
2380 void ath10k_mgmt_over_wmi_tx_purge(struct ath10k *ar)
2382 struct sk_buff *skb;
2384 for (;;) {
2385 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
2386 if (!skb)
2387 break;
2389 ieee80211_free_txskb(ar->hw, skb);
2393 void ath10k_mgmt_over_wmi_tx_work(struct work_struct *work)
2395 struct ath10k *ar = container_of(work, struct ath10k, wmi_mgmt_tx_work);
2396 struct sk_buff *skb;
2397 int ret;
2399 for (;;) {
2400 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
2401 if (!skb)
2402 break;
2404 ret = ath10k_wmi_mgmt_tx(ar, skb);
2405 if (ret) {
2406 ath10k_warn(ar, "failed to transmit management frame via WMI: %d\n",
2407 ret);
2408 ieee80211_free_txskb(ar->hw, skb);
2413 /************/
2414 /* Scanning */
2415 /************/
2417 void __ath10k_scan_finish(struct ath10k *ar)
2419 lockdep_assert_held(&ar->data_lock);
2421 switch (ar->scan.state) {
2422 case ATH10K_SCAN_IDLE:
2423 break;
2424 case ATH10K_SCAN_RUNNING:
2425 if (ar->scan.is_roc)
2426 ieee80211_remain_on_channel_expired(ar->hw);
2427 /* fall through */
2428 case ATH10K_SCAN_ABORTING:
2429 if (!ar->scan.is_roc)
2430 ieee80211_scan_completed(ar->hw,
2431 (ar->scan.state ==
2432 ATH10K_SCAN_ABORTING));
2433 /* fall through */
2434 case ATH10K_SCAN_STARTING:
2435 ar->scan.state = ATH10K_SCAN_IDLE;
2436 ar->scan_channel = NULL;
2437 ath10k_offchan_tx_purge(ar);
2438 cancel_delayed_work(&ar->scan.timeout);
2439 complete_all(&ar->scan.completed);
2440 break;
2444 void ath10k_scan_finish(struct ath10k *ar)
2446 spin_lock_bh(&ar->data_lock);
2447 __ath10k_scan_finish(ar);
2448 spin_unlock_bh(&ar->data_lock);
2451 static int ath10k_scan_stop(struct ath10k *ar)
2453 struct wmi_stop_scan_arg arg = {
2454 .req_id = 1, /* FIXME */
2455 .req_type = WMI_SCAN_STOP_ONE,
2456 .u.scan_id = ATH10K_SCAN_ID,
2458 int ret;
2460 lockdep_assert_held(&ar->conf_mutex);
2462 ret = ath10k_wmi_stop_scan(ar, &arg);
2463 if (ret) {
2464 ath10k_warn(ar, "failed to stop wmi scan: %d\n", ret);
2465 goto out;
2468 ret = wait_for_completion_timeout(&ar->scan.completed, 3*HZ);
2469 if (ret == 0) {
2470 ath10k_warn(ar, "failed to receive scan abortion completion: timed out\n");
2471 ret = -ETIMEDOUT;
2472 } else if (ret > 0) {
2473 ret = 0;
2476 out:
2477 /* Scan state should be updated upon scan completion but in case
2478 * firmware fails to deliver the event (for whatever reason) it is
2479 * desired to clean up scan state anyway. Firmware may have just
2480 * dropped the scan completion event delivery due to transport pipe
2481 * being overflown with data and/or it can recover on its own before
2482 * next scan request is submitted.
2484 spin_lock_bh(&ar->data_lock);
2485 if (ar->scan.state != ATH10K_SCAN_IDLE)
2486 __ath10k_scan_finish(ar);
2487 spin_unlock_bh(&ar->data_lock);
2489 return ret;
2492 static void ath10k_scan_abort(struct ath10k *ar)
2494 int ret;
2496 lockdep_assert_held(&ar->conf_mutex);
2498 spin_lock_bh(&ar->data_lock);
2500 switch (ar->scan.state) {
2501 case ATH10K_SCAN_IDLE:
2502 /* This can happen if timeout worker kicked in and called
2503 * abortion while scan completion was being processed.
2505 break;
2506 case ATH10K_SCAN_STARTING:
2507 case ATH10K_SCAN_ABORTING:
2508 ath10k_warn(ar, "refusing scan abortion due to invalid scan state: %s (%d)\n",
2509 ath10k_scan_state_str(ar->scan.state),
2510 ar->scan.state);
2511 break;
2512 case ATH10K_SCAN_RUNNING:
2513 ar->scan.state = ATH10K_SCAN_ABORTING;
2514 spin_unlock_bh(&ar->data_lock);
2516 ret = ath10k_scan_stop(ar);
2517 if (ret)
2518 ath10k_warn(ar, "failed to abort scan: %d\n", ret);
2520 spin_lock_bh(&ar->data_lock);
2521 break;
2524 spin_unlock_bh(&ar->data_lock);
2527 void ath10k_scan_timeout_work(struct work_struct *work)
2529 struct ath10k *ar = container_of(work, struct ath10k,
2530 scan.timeout.work);
2532 mutex_lock(&ar->conf_mutex);
2533 ath10k_scan_abort(ar);
2534 mutex_unlock(&ar->conf_mutex);
2537 static int ath10k_start_scan(struct ath10k *ar,
2538 const struct wmi_start_scan_arg *arg)
2540 int ret;
2542 lockdep_assert_held(&ar->conf_mutex);
2544 ret = ath10k_wmi_start_scan(ar, arg);
2545 if (ret)
2546 return ret;
2548 ret = wait_for_completion_timeout(&ar->scan.started, 1*HZ);
2549 if (ret == 0) {
2550 ret = ath10k_scan_stop(ar);
2551 if (ret)
2552 ath10k_warn(ar, "failed to stop scan: %d\n", ret);
2554 return -ETIMEDOUT;
2557 /* Add a 200ms margin to account for event/command processing */
2558 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
2559 msecs_to_jiffies(arg->max_scan_time+200));
2560 return 0;
2563 /**********************/
2564 /* mac80211 callbacks */
2565 /**********************/
2567 static void ath10k_tx(struct ieee80211_hw *hw,
2568 struct ieee80211_tx_control *control,
2569 struct sk_buff *skb)
2571 struct ath10k *ar = hw->priv;
2572 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
2573 struct ieee80211_vif *vif = info->control.vif;
2574 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
2576 /* We should disable CCK RATE due to P2P */
2577 if (info->flags & IEEE80211_TX_CTL_NO_CCK_RATE)
2578 ath10k_dbg(ar, ATH10K_DBG_MAC, "IEEE80211_TX_CTL_NO_CCK_RATE\n");
2580 ATH10K_SKB_CB(skb)->htt.is_offchan = false;
2581 ATH10K_SKB_CB(skb)->htt.tid = ath10k_tx_h_get_tid(hdr);
2582 ATH10K_SKB_CB(skb)->vdev_id = ath10k_tx_h_get_vdev_id(ar, vif);
2584 /* it makes no sense to process injected frames like that */
2585 if (vif && vif->type != NL80211_IFTYPE_MONITOR) {
2586 ath10k_tx_h_nwifi(hw, skb);
2587 ath10k_tx_h_add_p2p_noa_ie(ar, vif, skb);
2588 ath10k_tx_h_seq_no(vif, skb);
2591 if (info->flags & IEEE80211_TX_CTL_TX_OFFCHAN) {
2592 spin_lock_bh(&ar->data_lock);
2593 ATH10K_SKB_CB(skb)->htt.freq = ar->scan.roc_freq;
2594 ATH10K_SKB_CB(skb)->vdev_id = ar->scan.vdev_id;
2595 spin_unlock_bh(&ar->data_lock);
2597 if (ath10k_mac_need_offchan_tx_work(ar)) {
2598 ATH10K_SKB_CB(skb)->htt.freq = 0;
2599 ATH10K_SKB_CB(skb)->htt.is_offchan = true;
2601 ath10k_dbg(ar, ATH10K_DBG_MAC, "queued offchannel skb %p\n",
2602 skb);
2604 skb_queue_tail(&ar->offchan_tx_queue, skb);
2605 ieee80211_queue_work(hw, &ar->offchan_tx_work);
2606 return;
2610 ath10k_tx_htt(ar, skb);
2613 /* Must not be called with conf_mutex held as workers can use that also. */
2614 void ath10k_drain_tx(struct ath10k *ar)
2616 /* make sure rcu-protected mac80211 tx path itself is drained */
2617 synchronize_net();
2619 ath10k_offchan_tx_purge(ar);
2620 ath10k_mgmt_over_wmi_tx_purge(ar);
2622 cancel_work_sync(&ar->offchan_tx_work);
2623 cancel_work_sync(&ar->wmi_mgmt_tx_work);
2626 void ath10k_halt(struct ath10k *ar)
2628 struct ath10k_vif *arvif;
2630 lockdep_assert_held(&ar->conf_mutex);
2632 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
2633 ar->filter_flags = 0;
2634 ar->monitor = false;
2636 if (ar->monitor_started)
2637 ath10k_monitor_stop(ar);
2639 ar->monitor_started = false;
2641 ath10k_scan_finish(ar);
2642 ath10k_peer_cleanup_all(ar);
2643 ath10k_core_stop(ar);
2644 ath10k_hif_power_down(ar);
2646 spin_lock_bh(&ar->data_lock);
2647 list_for_each_entry(arvif, &ar->arvifs, list)
2648 ath10k_mac_vif_beacon_cleanup(arvif);
2649 spin_unlock_bh(&ar->data_lock);
2652 static int ath10k_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant)
2654 struct ath10k *ar = hw->priv;
2656 mutex_lock(&ar->conf_mutex);
2658 if (ar->cfg_tx_chainmask) {
2659 *tx_ant = ar->cfg_tx_chainmask;
2660 *rx_ant = ar->cfg_rx_chainmask;
2661 } else {
2662 *tx_ant = ar->supp_tx_chainmask;
2663 *rx_ant = ar->supp_rx_chainmask;
2666 mutex_unlock(&ar->conf_mutex);
2668 return 0;
2671 static void ath10k_check_chain_mask(struct ath10k *ar, u32 cm, const char *dbg)
2673 /* It is not clear that allowing gaps in chainmask
2674 * is helpful. Probably it will not do what user
2675 * is hoping for, so warn in that case.
2677 if (cm == 15 || cm == 7 || cm == 3 || cm == 1 || cm == 0)
2678 return;
2680 ath10k_warn(ar, "mac %s antenna chainmask may be invalid: 0x%x. Suggested values: 15, 7, 3, 1 or 0.\n",
2681 dbg, cm);
2684 static int __ath10k_set_antenna(struct ath10k *ar, u32 tx_ant, u32 rx_ant)
2686 int ret;
2688 lockdep_assert_held(&ar->conf_mutex);
2690 ath10k_check_chain_mask(ar, tx_ant, "tx");
2691 ath10k_check_chain_mask(ar, rx_ant, "rx");
2693 ar->cfg_tx_chainmask = tx_ant;
2694 ar->cfg_rx_chainmask = rx_ant;
2696 if ((ar->state != ATH10K_STATE_ON) &&
2697 (ar->state != ATH10K_STATE_RESTARTED))
2698 return 0;
2700 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->tx_chain_mask,
2701 tx_ant);
2702 if (ret) {
2703 ath10k_warn(ar, "failed to set tx-chainmask: %d, req 0x%x\n",
2704 ret, tx_ant);
2705 return ret;
2708 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->rx_chain_mask,
2709 rx_ant);
2710 if (ret) {
2711 ath10k_warn(ar, "failed to set rx-chainmask: %d, req 0x%x\n",
2712 ret, rx_ant);
2713 return ret;
2716 return 0;
2719 static int ath10k_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)
2721 struct ath10k *ar = hw->priv;
2722 int ret;
2724 mutex_lock(&ar->conf_mutex);
2725 ret = __ath10k_set_antenna(ar, tx_ant, rx_ant);
2726 mutex_unlock(&ar->conf_mutex);
2727 return ret;
2730 static int ath10k_start(struct ieee80211_hw *hw)
2732 struct ath10k *ar = hw->priv;
2733 int ret = 0;
2736 * This makes sense only when restarting hw. It is harmless to call
2737 * uncoditionally. This is necessary to make sure no HTT/WMI tx
2738 * commands will be submitted while restarting.
2740 ath10k_drain_tx(ar);
2742 mutex_lock(&ar->conf_mutex);
2744 switch (ar->state) {
2745 case ATH10K_STATE_OFF:
2746 ar->state = ATH10K_STATE_ON;
2747 break;
2748 case ATH10K_STATE_RESTARTING:
2749 ath10k_halt(ar);
2750 ar->state = ATH10K_STATE_RESTARTED;
2751 break;
2752 case ATH10K_STATE_ON:
2753 case ATH10K_STATE_RESTARTED:
2754 case ATH10K_STATE_WEDGED:
2755 WARN_ON(1);
2756 ret = -EINVAL;
2757 goto err;
2758 case ATH10K_STATE_UTF:
2759 ret = -EBUSY;
2760 goto err;
2763 ret = ath10k_hif_power_up(ar);
2764 if (ret) {
2765 ath10k_err(ar, "Could not init hif: %d\n", ret);
2766 goto err_off;
2769 ret = ath10k_core_start(ar, ATH10K_FIRMWARE_MODE_NORMAL);
2770 if (ret) {
2771 ath10k_err(ar, "Could not init core: %d\n", ret);
2772 goto err_power_down;
2775 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->pmf_qos, 1);
2776 if (ret) {
2777 ath10k_warn(ar, "failed to enable PMF QOS: %d\n", ret);
2778 goto err_core_stop;
2781 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->dynamic_bw, 1);
2782 if (ret) {
2783 ath10k_warn(ar, "failed to enable dynamic BW: %d\n", ret);
2784 goto err_core_stop;
2787 if (ar->cfg_tx_chainmask)
2788 __ath10k_set_antenna(ar, ar->cfg_tx_chainmask,
2789 ar->cfg_rx_chainmask);
2792 * By default FW set ARP frames ac to voice (6). In that case ARP
2793 * exchange is not working properly for UAPSD enabled AP. ARP requests
2794 * which arrives with access category 0 are processed by network stack
2795 * and send back with access category 0, but FW changes access category
2796 * to 6. Set ARP frames access category to best effort (0) solves
2797 * this problem.
2800 ret = ath10k_wmi_pdev_set_param(ar,
2801 ar->wmi.pdev_param->arp_ac_override, 0);
2802 if (ret) {
2803 ath10k_warn(ar, "failed to set arp ac override parameter: %d\n",
2804 ret);
2805 goto err_core_stop;
2808 ar->num_started_vdevs = 0;
2809 ath10k_regd_update(ar);
2811 ath10k_spectral_start(ar);
2813 mutex_unlock(&ar->conf_mutex);
2814 return 0;
2816 err_core_stop:
2817 ath10k_core_stop(ar);
2819 err_power_down:
2820 ath10k_hif_power_down(ar);
2822 err_off:
2823 ar->state = ATH10K_STATE_OFF;
2825 err:
2826 mutex_unlock(&ar->conf_mutex);
2827 return ret;
2830 static void ath10k_stop(struct ieee80211_hw *hw)
2832 struct ath10k *ar = hw->priv;
2834 ath10k_drain_tx(ar);
2836 mutex_lock(&ar->conf_mutex);
2837 if (ar->state != ATH10K_STATE_OFF) {
2838 ath10k_halt(ar);
2839 ar->state = ATH10K_STATE_OFF;
2841 mutex_unlock(&ar->conf_mutex);
2843 cancel_delayed_work_sync(&ar->scan.timeout);
2844 cancel_work_sync(&ar->restart_work);
2847 static int ath10k_config_ps(struct ath10k *ar)
2849 struct ath10k_vif *arvif;
2850 int ret = 0;
2852 lockdep_assert_held(&ar->conf_mutex);
2854 list_for_each_entry(arvif, &ar->arvifs, list) {
2855 ret = ath10k_mac_vif_setup_ps(arvif);
2856 if (ret) {
2857 ath10k_warn(ar, "failed to setup powersave: %d\n", ret);
2858 break;
2862 return ret;
2865 static const char *chandef_get_width(enum nl80211_chan_width width)
2867 switch (width) {
2868 case NL80211_CHAN_WIDTH_20_NOHT:
2869 return "20 (noht)";
2870 case NL80211_CHAN_WIDTH_20:
2871 return "20";
2872 case NL80211_CHAN_WIDTH_40:
2873 return "40";
2874 case NL80211_CHAN_WIDTH_80:
2875 return "80";
2876 case NL80211_CHAN_WIDTH_80P80:
2877 return "80+80";
2878 case NL80211_CHAN_WIDTH_160:
2879 return "160";
2880 case NL80211_CHAN_WIDTH_5:
2881 return "5";
2882 case NL80211_CHAN_WIDTH_10:
2883 return "10";
2885 return "?";
2888 static void ath10k_config_chan(struct ath10k *ar)
2890 struct ath10k_vif *arvif;
2891 int ret;
2893 lockdep_assert_held(&ar->conf_mutex);
2895 ath10k_dbg(ar, ATH10K_DBG_MAC,
2896 "mac config channel to %dMHz (cf1 %dMHz cf2 %dMHz width %s)\n",
2897 ar->chandef.chan->center_freq,
2898 ar->chandef.center_freq1,
2899 ar->chandef.center_freq2,
2900 chandef_get_width(ar->chandef.width));
2902 /* First stop monitor interface. Some FW versions crash if there's a
2903 * lone monitor interface. */
2904 if (ar->monitor_started)
2905 ath10k_monitor_stop(ar);
2907 list_for_each_entry(arvif, &ar->arvifs, list) {
2908 if (!arvif->is_started)
2909 continue;
2911 if (!arvif->is_up)
2912 continue;
2914 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
2915 continue;
2917 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
2918 if (ret) {
2919 ath10k_warn(ar, "failed to down vdev %d: %d\n",
2920 arvif->vdev_id, ret);
2921 continue;
2925 /* all vdevs are downed now - attempt to restart and re-up them */
2927 list_for_each_entry(arvif, &ar->arvifs, list) {
2928 if (!arvif->is_started)
2929 continue;
2931 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
2932 continue;
2934 ret = ath10k_vdev_restart(arvif);
2935 if (ret) {
2936 ath10k_warn(ar, "failed to restart vdev %d: %d\n",
2937 arvif->vdev_id, ret);
2938 continue;
2941 if (!arvif->is_up)
2942 continue;
2944 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
2945 arvif->bssid);
2946 if (ret) {
2947 ath10k_warn(ar, "failed to bring vdev up %d: %d\n",
2948 arvif->vdev_id, ret);
2949 continue;
2953 ath10k_monitor_recalc(ar);
2956 static int ath10k_mac_txpower_setup(struct ath10k *ar, int txpower)
2958 int ret;
2959 u32 param;
2961 lockdep_assert_held(&ar->conf_mutex);
2963 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac txpower %d\n", txpower);
2965 param = ar->wmi.pdev_param->txpower_limit2g;
2966 ret = ath10k_wmi_pdev_set_param(ar, param, txpower * 2);
2967 if (ret) {
2968 ath10k_warn(ar, "failed to set 2g txpower %d: %d\n",
2969 txpower, ret);
2970 return ret;
2973 param = ar->wmi.pdev_param->txpower_limit5g;
2974 ret = ath10k_wmi_pdev_set_param(ar, param, txpower * 2);
2975 if (ret) {
2976 ath10k_warn(ar, "failed to set 5g txpower %d: %d\n",
2977 txpower, ret);
2978 return ret;
2981 return 0;
2984 static int ath10k_mac_txpower_recalc(struct ath10k *ar)
2986 struct ath10k_vif *arvif;
2987 int ret, txpower = -1;
2989 lockdep_assert_held(&ar->conf_mutex);
2991 list_for_each_entry(arvif, &ar->arvifs, list) {
2992 WARN_ON(arvif->txpower < 0);
2994 if (txpower == -1)
2995 txpower = arvif->txpower;
2996 else
2997 txpower = min(txpower, arvif->txpower);
3000 if (WARN_ON(txpower == -1))
3001 return -EINVAL;
3003 ret = ath10k_mac_txpower_setup(ar, txpower);
3004 if (ret) {
3005 ath10k_warn(ar, "failed to setup tx power %d: %d\n",
3006 txpower, ret);
3007 return ret;
3010 return 0;
3013 static int ath10k_config(struct ieee80211_hw *hw, u32 changed)
3015 struct ath10k *ar = hw->priv;
3016 struct ieee80211_conf *conf = &hw->conf;
3017 int ret = 0;
3019 mutex_lock(&ar->conf_mutex);
3021 if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
3022 ath10k_dbg(ar, ATH10K_DBG_MAC,
3023 "mac config channel %dMHz flags 0x%x radar %d\n",
3024 conf->chandef.chan->center_freq,
3025 conf->chandef.chan->flags,
3026 conf->radar_enabled);
3028 spin_lock_bh(&ar->data_lock);
3029 ar->rx_channel = conf->chandef.chan;
3030 spin_unlock_bh(&ar->data_lock);
3032 ar->radar_enabled = conf->radar_enabled;
3033 ath10k_recalc_radar_detection(ar);
3035 if (!cfg80211_chandef_identical(&ar->chandef, &conf->chandef)) {
3036 ar->chandef = conf->chandef;
3037 ath10k_config_chan(ar);
3041 if (changed & IEEE80211_CONF_CHANGE_PS)
3042 ath10k_config_ps(ar);
3044 if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
3045 ar->monitor = conf->flags & IEEE80211_CONF_MONITOR;
3046 ret = ath10k_monitor_recalc(ar);
3047 if (ret)
3048 ath10k_warn(ar, "failed to recalc monitor: %d\n", ret);
3051 mutex_unlock(&ar->conf_mutex);
3052 return ret;
3055 static u32 get_nss_from_chainmask(u16 chain_mask)
3057 if ((chain_mask & 0x15) == 0x15)
3058 return 4;
3059 else if ((chain_mask & 0x7) == 0x7)
3060 return 3;
3061 else if ((chain_mask & 0x3) == 0x3)
3062 return 2;
3063 return 1;
3067 * TODO:
3068 * Figure out how to handle WMI_VDEV_SUBTYPE_P2P_DEVICE,
3069 * because we will send mgmt frames without CCK. This requirement
3070 * for P2P_FIND/GO_NEG should be handled by checking CCK flag
3071 * in the TX packet.
3073 static int ath10k_add_interface(struct ieee80211_hw *hw,
3074 struct ieee80211_vif *vif)
3076 struct ath10k *ar = hw->priv;
3077 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3078 enum wmi_sta_powersave_param param;
3079 int ret = 0;
3080 u32 value;
3081 int bit;
3082 u32 vdev_param;
3084 vif->driver_flags |= IEEE80211_VIF_SUPPORTS_UAPSD;
3086 mutex_lock(&ar->conf_mutex);
3088 memset(arvif, 0, sizeof(*arvif));
3090 arvif->ar = ar;
3091 arvif->vif = vif;
3093 INIT_LIST_HEAD(&arvif->list);
3095 if (ar->free_vdev_map == 0) {
3096 ath10k_warn(ar, "Free vdev map is empty, no more interfaces allowed.\n");
3097 ret = -EBUSY;
3098 goto err;
3100 bit = __ffs64(ar->free_vdev_map);
3102 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac create vdev %i map %llx\n",
3103 bit, ar->free_vdev_map);
3105 arvif->vdev_id = bit;
3106 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE;
3108 switch (vif->type) {
3109 case NL80211_IFTYPE_P2P_DEVICE:
3110 arvif->vdev_type = WMI_VDEV_TYPE_STA;
3111 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_DEVICE;
3112 break;
3113 case NL80211_IFTYPE_UNSPECIFIED:
3114 case NL80211_IFTYPE_STATION:
3115 arvif->vdev_type = WMI_VDEV_TYPE_STA;
3116 if (vif->p2p)
3117 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_CLIENT;
3118 break;
3119 case NL80211_IFTYPE_ADHOC:
3120 arvif->vdev_type = WMI_VDEV_TYPE_IBSS;
3121 break;
3122 case NL80211_IFTYPE_AP:
3123 arvif->vdev_type = WMI_VDEV_TYPE_AP;
3125 if (vif->p2p)
3126 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_GO;
3127 break;
3128 case NL80211_IFTYPE_MONITOR:
3129 arvif->vdev_type = WMI_VDEV_TYPE_MONITOR;
3130 break;
3131 default:
3132 WARN_ON(1);
3133 break;
3136 /* Some firmware revisions don't wait for beacon tx completion before
3137 * sending another SWBA event. This could lead to hardware using old
3138 * (freed) beacon data in some cases, e.g. tx credit starvation
3139 * combined with missed TBTT. This is very very rare.
3141 * On non-IOMMU-enabled hosts this could be a possible security issue
3142 * because hw could beacon some random data on the air. On
3143 * IOMMU-enabled hosts DMAR faults would occur in most cases and target
3144 * device would crash.
3146 * Since there are no beacon tx completions (implicit nor explicit)
3147 * propagated to host the only workaround for this is to allocate a
3148 * DMA-coherent buffer for a lifetime of a vif and use it for all
3149 * beacon tx commands. Worst case for this approach is some beacons may
3150 * become corrupted, e.g. have garbled IEs or out-of-date TIM bitmap.
3152 if (vif->type == NL80211_IFTYPE_ADHOC ||
3153 vif->type == NL80211_IFTYPE_AP) {
3154 arvif->beacon_buf = dma_zalloc_coherent(ar->dev,
3155 IEEE80211_MAX_FRAME_LEN,
3156 &arvif->beacon_paddr,
3157 GFP_ATOMIC);
3158 if (!arvif->beacon_buf) {
3159 ret = -ENOMEM;
3160 ath10k_warn(ar, "failed to allocate beacon buffer: %d\n",
3161 ret);
3162 goto err;
3166 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev create %d (add interface) type %d subtype %d bcnmode %s\n",
3167 arvif->vdev_id, arvif->vdev_type, arvif->vdev_subtype,
3168 arvif->beacon_buf ? "single-buf" : "per-skb");
3170 ret = ath10k_wmi_vdev_create(ar, arvif->vdev_id, arvif->vdev_type,
3171 arvif->vdev_subtype, vif->addr);
3172 if (ret) {
3173 ath10k_warn(ar, "failed to create WMI vdev %i: %d\n",
3174 arvif->vdev_id, ret);
3175 goto err;
3178 ar->free_vdev_map &= ~(1LL << arvif->vdev_id);
3179 list_add(&arvif->list, &ar->arvifs);
3181 /* It makes no sense to have firmware do keepalives. mac80211 already
3182 * takes care of this with idle connection polling.
3184 ret = ath10k_mac_vif_disable_keepalive(arvif);
3185 if (ret) {
3186 ath10k_warn(ar, "failed to disable keepalive on vdev %i: %d\n",
3187 arvif->vdev_id, ret);
3188 goto err_vdev_delete;
3191 arvif->def_wep_key_idx = -1;
3193 vdev_param = ar->wmi.vdev_param->tx_encap_type;
3194 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
3195 ATH10K_HW_TXRX_NATIVE_WIFI);
3196 /* 10.X firmware does not support this VDEV parameter. Do not warn */
3197 if (ret && ret != -EOPNOTSUPP) {
3198 ath10k_warn(ar, "failed to set vdev %i TX encapsulation: %d\n",
3199 arvif->vdev_id, ret);
3200 goto err_vdev_delete;
3203 if (ar->cfg_tx_chainmask) {
3204 u16 nss = get_nss_from_chainmask(ar->cfg_tx_chainmask);
3206 vdev_param = ar->wmi.vdev_param->nss;
3207 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
3208 nss);
3209 if (ret) {
3210 ath10k_warn(ar, "failed to set vdev %i chainmask 0x%x, nss %i: %d\n",
3211 arvif->vdev_id, ar->cfg_tx_chainmask, nss,
3212 ret);
3213 goto err_vdev_delete;
3217 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
3218 ret = ath10k_peer_create(ar, arvif->vdev_id, vif->addr);
3219 if (ret) {
3220 ath10k_warn(ar, "failed to create vdev %i peer for AP: %d\n",
3221 arvif->vdev_id, ret);
3222 goto err_vdev_delete;
3225 ret = ath10k_mac_set_kickout(arvif);
3226 if (ret) {
3227 ath10k_warn(ar, "failed to set vdev %i kickout parameters: %d\n",
3228 arvif->vdev_id, ret);
3229 goto err_peer_delete;
3233 if (arvif->vdev_type == WMI_VDEV_TYPE_STA) {
3234 param = WMI_STA_PS_PARAM_RX_WAKE_POLICY;
3235 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
3236 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
3237 param, value);
3238 if (ret) {
3239 ath10k_warn(ar, "failed to set vdev %i RX wake policy: %d\n",
3240 arvif->vdev_id, ret);
3241 goto err_peer_delete;
3244 ret = ath10k_mac_vif_recalc_ps_wake_threshold(arvif);
3245 if (ret) {
3246 ath10k_warn(ar, "failed to recalc ps wake threshold on vdev %i: %d\n",
3247 arvif->vdev_id, ret);
3248 goto err_peer_delete;
3251 ret = ath10k_mac_vif_recalc_ps_poll_count(arvif);
3252 if (ret) {
3253 ath10k_warn(ar, "failed to recalc ps poll count on vdev %i: %d\n",
3254 arvif->vdev_id, ret);
3255 goto err_peer_delete;
3259 ret = ath10k_mac_set_rts(arvif, ar->hw->wiphy->rts_threshold);
3260 if (ret) {
3261 ath10k_warn(ar, "failed to set rts threshold for vdev %d: %d\n",
3262 arvif->vdev_id, ret);
3263 goto err_peer_delete;
3266 ret = ath10k_mac_set_frag(arvif, ar->hw->wiphy->frag_threshold);
3267 if (ret) {
3268 ath10k_warn(ar, "failed to set frag threshold for vdev %d: %d\n",
3269 arvif->vdev_id, ret);
3270 goto err_peer_delete;
3273 arvif->txpower = vif->bss_conf.txpower;
3274 ret = ath10k_mac_txpower_recalc(ar);
3275 if (ret) {
3276 ath10k_warn(ar, "failed to recalc tx power: %d\n", ret);
3277 goto err_peer_delete;
3280 mutex_unlock(&ar->conf_mutex);
3281 return 0;
3283 err_peer_delete:
3284 if (arvif->vdev_type == WMI_VDEV_TYPE_AP)
3285 ath10k_wmi_peer_delete(ar, arvif->vdev_id, vif->addr);
3287 err_vdev_delete:
3288 ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
3289 ar->free_vdev_map |= 1LL << arvif->vdev_id;
3290 list_del(&arvif->list);
3292 err:
3293 if (arvif->beacon_buf) {
3294 dma_free_coherent(ar->dev, IEEE80211_MAX_FRAME_LEN,
3295 arvif->beacon_buf, arvif->beacon_paddr);
3296 arvif->beacon_buf = NULL;
3299 mutex_unlock(&ar->conf_mutex);
3301 return ret;
3304 static void ath10k_remove_interface(struct ieee80211_hw *hw,
3305 struct ieee80211_vif *vif)
3307 struct ath10k *ar = hw->priv;
3308 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3309 int ret;
3311 mutex_lock(&ar->conf_mutex);
3313 spin_lock_bh(&ar->data_lock);
3314 ath10k_mac_vif_beacon_cleanup(arvif);
3315 spin_unlock_bh(&ar->data_lock);
3317 ret = ath10k_spectral_vif_stop(arvif);
3318 if (ret)
3319 ath10k_warn(ar, "failed to stop spectral for vdev %i: %d\n",
3320 arvif->vdev_id, ret);
3322 ar->free_vdev_map |= 1LL << arvif->vdev_id;
3323 list_del(&arvif->list);
3325 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
3326 ret = ath10k_peer_delete(arvif->ar, arvif->vdev_id, vif->addr);
3327 if (ret)
3328 ath10k_warn(ar, "failed to remove peer for AP vdev %i: %d\n",
3329 arvif->vdev_id, ret);
3331 kfree(arvif->u.ap.noa_data);
3334 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i delete (remove interface)\n",
3335 arvif->vdev_id);
3337 ret = ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
3338 if (ret)
3339 ath10k_warn(ar, "failed to delete WMI vdev %i: %d\n",
3340 arvif->vdev_id, ret);
3342 ath10k_peer_cleanup(ar, arvif->vdev_id);
3344 mutex_unlock(&ar->conf_mutex);
3348 * FIXME: Has to be verified.
3350 #define SUPPORTED_FILTERS \
3351 (FIF_PROMISC_IN_BSS | \
3352 FIF_ALLMULTI | \
3353 FIF_CONTROL | \
3354 FIF_PSPOLL | \
3355 FIF_OTHER_BSS | \
3356 FIF_BCN_PRBRESP_PROMISC | \
3357 FIF_PROBE_REQ | \
3358 FIF_FCSFAIL)
3360 static void ath10k_configure_filter(struct ieee80211_hw *hw,
3361 unsigned int changed_flags,
3362 unsigned int *total_flags,
3363 u64 multicast)
3365 struct ath10k *ar = hw->priv;
3366 int ret;
3368 mutex_lock(&ar->conf_mutex);
3370 changed_flags &= SUPPORTED_FILTERS;
3371 *total_flags &= SUPPORTED_FILTERS;
3372 ar->filter_flags = *total_flags;
3374 ret = ath10k_monitor_recalc(ar);
3375 if (ret)
3376 ath10k_warn(ar, "failed to recalc montior: %d\n", ret);
3378 mutex_unlock(&ar->conf_mutex);
3381 static void ath10k_bss_info_changed(struct ieee80211_hw *hw,
3382 struct ieee80211_vif *vif,
3383 struct ieee80211_bss_conf *info,
3384 u32 changed)
3386 struct ath10k *ar = hw->priv;
3387 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3388 int ret = 0;
3389 u32 vdev_param, pdev_param, slottime, preamble;
3391 mutex_lock(&ar->conf_mutex);
3393 if (changed & BSS_CHANGED_IBSS)
3394 ath10k_control_ibss(arvif, info, vif->addr);
3396 if (changed & BSS_CHANGED_BEACON_INT) {
3397 arvif->beacon_interval = info->beacon_int;
3398 vdev_param = ar->wmi.vdev_param->beacon_interval;
3399 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
3400 arvif->beacon_interval);
3401 ath10k_dbg(ar, ATH10K_DBG_MAC,
3402 "mac vdev %d beacon_interval %d\n",
3403 arvif->vdev_id, arvif->beacon_interval);
3405 if (ret)
3406 ath10k_warn(ar, "failed to set beacon interval for vdev %d: %i\n",
3407 arvif->vdev_id, ret);
3410 if (changed & BSS_CHANGED_BEACON) {
3411 ath10k_dbg(ar, ATH10K_DBG_MAC,
3412 "vdev %d set beacon tx mode to staggered\n",
3413 arvif->vdev_id);
3415 pdev_param = ar->wmi.pdev_param->beacon_tx_mode;
3416 ret = ath10k_wmi_pdev_set_param(ar, pdev_param,
3417 WMI_BEACON_STAGGERED_MODE);
3418 if (ret)
3419 ath10k_warn(ar, "failed to set beacon mode for vdev %d: %i\n",
3420 arvif->vdev_id, ret);
3422 ret = ath10k_mac_setup_bcn_tmpl(arvif);
3423 if (ret)
3424 ath10k_warn(ar, "failed to update beacon template: %d\n",
3425 ret);
3428 if (changed & BSS_CHANGED_AP_PROBE_RESP) {
3429 ret = ath10k_mac_setup_prb_tmpl(arvif);
3430 if (ret)
3431 ath10k_warn(ar, "failed to setup probe resp template on vdev %i: %d\n",
3432 arvif->vdev_id, ret);
3435 if (changed & (BSS_CHANGED_BEACON_INFO | BSS_CHANGED_BEACON)) {
3436 arvif->dtim_period = info->dtim_period;
3438 ath10k_dbg(ar, ATH10K_DBG_MAC,
3439 "mac vdev %d dtim_period %d\n",
3440 arvif->vdev_id, arvif->dtim_period);
3442 vdev_param = ar->wmi.vdev_param->dtim_period;
3443 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
3444 arvif->dtim_period);
3445 if (ret)
3446 ath10k_warn(ar, "failed to set dtim period for vdev %d: %i\n",
3447 arvif->vdev_id, ret);
3450 if (changed & BSS_CHANGED_SSID &&
3451 vif->type == NL80211_IFTYPE_AP) {
3452 arvif->u.ap.ssid_len = info->ssid_len;
3453 if (info->ssid_len)
3454 memcpy(arvif->u.ap.ssid, info->ssid, info->ssid_len);
3455 arvif->u.ap.hidden_ssid = info->hidden_ssid;
3458 if (changed & BSS_CHANGED_BSSID && !is_zero_ether_addr(info->bssid))
3459 ether_addr_copy(arvif->bssid, info->bssid);
3461 if (changed & BSS_CHANGED_BEACON_ENABLED)
3462 ath10k_control_beaconing(arvif, info);
3464 if (changed & BSS_CHANGED_ERP_CTS_PROT) {
3465 arvif->use_cts_prot = info->use_cts_prot;
3466 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d cts_prot %d\n",
3467 arvif->vdev_id, info->use_cts_prot);
3469 ret = ath10k_recalc_rtscts_prot(arvif);
3470 if (ret)
3471 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
3472 arvif->vdev_id, ret);
3475 if (changed & BSS_CHANGED_ERP_SLOT) {
3476 if (info->use_short_slot)
3477 slottime = WMI_VDEV_SLOT_TIME_SHORT; /* 9us */
3479 else
3480 slottime = WMI_VDEV_SLOT_TIME_LONG; /* 20us */
3482 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d slot_time %d\n",
3483 arvif->vdev_id, slottime);
3485 vdev_param = ar->wmi.vdev_param->slot_time;
3486 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
3487 slottime);
3488 if (ret)
3489 ath10k_warn(ar, "failed to set erp slot for vdev %d: %i\n",
3490 arvif->vdev_id, ret);
3493 if (changed & BSS_CHANGED_ERP_PREAMBLE) {
3494 if (info->use_short_preamble)
3495 preamble = WMI_VDEV_PREAMBLE_SHORT;
3496 else
3497 preamble = WMI_VDEV_PREAMBLE_LONG;
3499 ath10k_dbg(ar, ATH10K_DBG_MAC,
3500 "mac vdev %d preamble %dn",
3501 arvif->vdev_id, preamble);
3503 vdev_param = ar->wmi.vdev_param->preamble;
3504 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
3505 preamble);
3506 if (ret)
3507 ath10k_warn(ar, "failed to set preamble for vdev %d: %i\n",
3508 arvif->vdev_id, ret);
3511 if (changed & BSS_CHANGED_ASSOC) {
3512 if (info->assoc) {
3513 /* Workaround: Make sure monitor vdev is not running
3514 * when associating to prevent some firmware revisions
3515 * (e.g. 10.1 and 10.2) from crashing.
3517 if (ar->monitor_started)
3518 ath10k_monitor_stop(ar);
3519 ath10k_bss_assoc(hw, vif, info);
3520 ath10k_monitor_recalc(ar);
3521 } else {
3522 ath10k_bss_disassoc(hw, vif);
3526 if (changed & BSS_CHANGED_TXPOWER) {
3527 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev_id %i txpower %d\n",
3528 arvif->vdev_id, info->txpower);
3530 arvif->txpower = info->txpower;
3531 ret = ath10k_mac_txpower_recalc(ar);
3532 if (ret)
3533 ath10k_warn(ar, "failed to recalc tx power: %d\n", ret);
3536 if (changed & BSS_CHANGED_PS) {
3537 ret = ath10k_mac_vif_setup_ps(arvif);
3538 if (ret)
3539 ath10k_warn(ar, "failed to setup ps on vdev %i: %d\n",
3540 arvif->vdev_id, ret);
3543 mutex_unlock(&ar->conf_mutex);
3546 static int ath10k_hw_scan(struct ieee80211_hw *hw,
3547 struct ieee80211_vif *vif,
3548 struct ieee80211_scan_request *hw_req)
3550 struct ath10k *ar = hw->priv;
3551 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3552 struct cfg80211_scan_request *req = &hw_req->req;
3553 struct wmi_start_scan_arg arg;
3554 int ret = 0;
3555 int i;
3557 mutex_lock(&ar->conf_mutex);
3559 spin_lock_bh(&ar->data_lock);
3560 switch (ar->scan.state) {
3561 case ATH10K_SCAN_IDLE:
3562 reinit_completion(&ar->scan.started);
3563 reinit_completion(&ar->scan.completed);
3564 ar->scan.state = ATH10K_SCAN_STARTING;
3565 ar->scan.is_roc = false;
3566 ar->scan.vdev_id = arvif->vdev_id;
3567 ret = 0;
3568 break;
3569 case ATH10K_SCAN_STARTING:
3570 case ATH10K_SCAN_RUNNING:
3571 case ATH10K_SCAN_ABORTING:
3572 ret = -EBUSY;
3573 break;
3575 spin_unlock_bh(&ar->data_lock);
3577 if (ret)
3578 goto exit;
3580 memset(&arg, 0, sizeof(arg));
3581 ath10k_wmi_start_scan_init(ar, &arg);
3582 arg.vdev_id = arvif->vdev_id;
3583 arg.scan_id = ATH10K_SCAN_ID;
3585 if (!req->no_cck)
3586 arg.scan_ctrl_flags |= WMI_SCAN_ADD_CCK_RATES;
3588 if (req->ie_len) {
3589 arg.ie_len = req->ie_len;
3590 memcpy(arg.ie, req->ie, arg.ie_len);
3593 if (req->n_ssids) {
3594 arg.n_ssids = req->n_ssids;
3595 for (i = 0; i < arg.n_ssids; i++) {
3596 arg.ssids[i].len = req->ssids[i].ssid_len;
3597 arg.ssids[i].ssid = req->ssids[i].ssid;
3599 } else {
3600 arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
3603 if (req->n_channels) {
3604 arg.n_channels = req->n_channels;
3605 for (i = 0; i < arg.n_channels; i++)
3606 arg.channels[i] = req->channels[i]->center_freq;
3609 ret = ath10k_start_scan(ar, &arg);
3610 if (ret) {
3611 ath10k_warn(ar, "failed to start hw scan: %d\n", ret);
3612 spin_lock_bh(&ar->data_lock);
3613 ar->scan.state = ATH10K_SCAN_IDLE;
3614 spin_unlock_bh(&ar->data_lock);
3617 exit:
3618 mutex_unlock(&ar->conf_mutex);
3619 return ret;
3622 static void ath10k_cancel_hw_scan(struct ieee80211_hw *hw,
3623 struct ieee80211_vif *vif)
3625 struct ath10k *ar = hw->priv;
3627 mutex_lock(&ar->conf_mutex);
3628 ath10k_scan_abort(ar);
3629 mutex_unlock(&ar->conf_mutex);
3631 cancel_delayed_work_sync(&ar->scan.timeout);
3634 static void ath10k_set_key_h_def_keyidx(struct ath10k *ar,
3635 struct ath10k_vif *arvif,
3636 enum set_key_cmd cmd,
3637 struct ieee80211_key_conf *key)
3639 u32 vdev_param = arvif->ar->wmi.vdev_param->def_keyid;
3640 int ret;
3642 /* 10.1 firmware branch requires default key index to be set to group
3643 * key index after installing it. Otherwise FW/HW Txes corrupted
3644 * frames with multi-vif APs. This is not required for main firmware
3645 * branch (e.g. 636).
3647 * FIXME: This has been tested only in AP. It remains unknown if this
3648 * is required for multi-vif STA interfaces on 10.1 */
3650 if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
3651 return;
3653 if (key->cipher == WLAN_CIPHER_SUITE_WEP40)
3654 return;
3656 if (key->cipher == WLAN_CIPHER_SUITE_WEP104)
3657 return;
3659 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
3660 return;
3662 if (cmd != SET_KEY)
3663 return;
3665 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
3666 key->keyidx);
3667 if (ret)
3668 ath10k_warn(ar, "failed to set vdev %i group key as default key: %d\n",
3669 arvif->vdev_id, ret);
3672 static int ath10k_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
3673 struct ieee80211_vif *vif, struct ieee80211_sta *sta,
3674 struct ieee80211_key_conf *key)
3676 struct ath10k *ar = hw->priv;
3677 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3678 struct ath10k_peer *peer;
3679 const u8 *peer_addr;
3680 bool is_wep = key->cipher == WLAN_CIPHER_SUITE_WEP40 ||
3681 key->cipher == WLAN_CIPHER_SUITE_WEP104;
3682 bool def_idx = false;
3683 int ret = 0;
3685 if (key->keyidx > WMI_MAX_KEY_INDEX)
3686 return -ENOSPC;
3688 mutex_lock(&ar->conf_mutex);
3690 if (sta)
3691 peer_addr = sta->addr;
3692 else if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
3693 peer_addr = vif->bss_conf.bssid;
3694 else
3695 peer_addr = vif->addr;
3697 key->hw_key_idx = key->keyidx;
3699 /* the peer should not disappear in mid-way (unless FW goes awry) since
3700 * we already hold conf_mutex. we just make sure its there now. */
3701 spin_lock_bh(&ar->data_lock);
3702 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
3703 spin_unlock_bh(&ar->data_lock);
3705 if (!peer) {
3706 if (cmd == SET_KEY) {
3707 ath10k_warn(ar, "failed to install key for non-existent peer %pM\n",
3708 peer_addr);
3709 ret = -EOPNOTSUPP;
3710 goto exit;
3711 } else {
3712 /* if the peer doesn't exist there is no key to disable
3713 * anymore */
3714 goto exit;
3718 if (is_wep) {
3719 if (cmd == SET_KEY)
3720 arvif->wep_keys[key->keyidx] = key;
3721 else
3722 arvif->wep_keys[key->keyidx] = NULL;
3724 if (cmd == DISABLE_KEY)
3725 ath10k_clear_vdev_key(arvif, key);
3728 /* set TX_USAGE flag for all the keys incase of dot1x-WEP. For
3729 * static WEP, do not set this flag for the keys whose key id
3730 * is greater than default key id.
3732 if (arvif->def_wep_key_idx == -1)
3733 def_idx = true;
3735 ret = ath10k_install_key(arvif, key, cmd, peer_addr, def_idx);
3736 if (ret) {
3737 ath10k_warn(ar, "failed to install key for vdev %i peer %pM: %d\n",
3738 arvif->vdev_id, peer_addr, ret);
3739 goto exit;
3742 ath10k_set_key_h_def_keyidx(ar, arvif, cmd, key);
3744 spin_lock_bh(&ar->data_lock);
3745 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
3746 if (peer && cmd == SET_KEY)
3747 peer->keys[key->keyidx] = key;
3748 else if (peer && cmd == DISABLE_KEY)
3749 peer->keys[key->keyidx] = NULL;
3750 else if (peer == NULL)
3751 /* impossible unless FW goes crazy */
3752 ath10k_warn(ar, "Peer %pM disappeared!\n", peer_addr);
3753 spin_unlock_bh(&ar->data_lock);
3755 exit:
3756 mutex_unlock(&ar->conf_mutex);
3757 return ret;
3760 static void ath10k_set_default_unicast_key(struct ieee80211_hw *hw,
3761 struct ieee80211_vif *vif,
3762 int keyidx)
3764 struct ath10k *ar = hw->priv;
3765 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3766 int ret;
3768 mutex_lock(&arvif->ar->conf_mutex);
3770 if (arvif->ar->state != ATH10K_STATE_ON)
3771 goto unlock;
3773 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d set keyidx %d\n",
3774 arvif->vdev_id, keyidx);
3776 ret = ath10k_wmi_vdev_set_param(arvif->ar,
3777 arvif->vdev_id,
3778 arvif->ar->wmi.vdev_param->def_keyid,
3779 keyidx);
3781 if (ret) {
3782 ath10k_warn(ar, "failed to update wep key index for vdev %d: %d\n",
3783 arvif->vdev_id,
3784 ret);
3785 goto unlock;
3788 arvif->def_wep_key_idx = keyidx;
3789 unlock:
3790 mutex_unlock(&arvif->ar->conf_mutex);
3793 static void ath10k_sta_rc_update_wk(struct work_struct *wk)
3795 struct ath10k *ar;
3796 struct ath10k_vif *arvif;
3797 struct ath10k_sta *arsta;
3798 struct ieee80211_sta *sta;
3799 u32 changed, bw, nss, smps;
3800 int err;
3802 arsta = container_of(wk, struct ath10k_sta, update_wk);
3803 sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv);
3804 arvif = arsta->arvif;
3805 ar = arvif->ar;
3807 spin_lock_bh(&ar->data_lock);
3809 changed = arsta->changed;
3810 arsta->changed = 0;
3812 bw = arsta->bw;
3813 nss = arsta->nss;
3814 smps = arsta->smps;
3816 spin_unlock_bh(&ar->data_lock);
3818 mutex_lock(&ar->conf_mutex);
3820 if (changed & IEEE80211_RC_BW_CHANGED) {
3821 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM peer bw %d\n",
3822 sta->addr, bw);
3824 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
3825 WMI_PEER_CHAN_WIDTH, bw);
3826 if (err)
3827 ath10k_warn(ar, "failed to update STA %pM peer bw %d: %d\n",
3828 sta->addr, bw, err);
3831 if (changed & IEEE80211_RC_NSS_CHANGED) {
3832 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM nss %d\n",
3833 sta->addr, nss);
3835 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
3836 WMI_PEER_NSS, nss);
3837 if (err)
3838 ath10k_warn(ar, "failed to update STA %pM nss %d: %d\n",
3839 sta->addr, nss, err);
3842 if (changed & IEEE80211_RC_SMPS_CHANGED) {
3843 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM smps %d\n",
3844 sta->addr, smps);
3846 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
3847 WMI_PEER_SMPS_STATE, smps);
3848 if (err)
3849 ath10k_warn(ar, "failed to update STA %pM smps %d: %d\n",
3850 sta->addr, smps, err);
3853 if (changed & IEEE80211_RC_SUPP_RATES_CHANGED ||
3854 changed & IEEE80211_RC_NSS_CHANGED) {
3855 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM supp rates/nss\n",
3856 sta->addr);
3858 err = ath10k_station_assoc(ar, arvif->vif, sta, true);
3859 if (err)
3860 ath10k_warn(ar, "failed to reassociate station: %pM\n",
3861 sta->addr);
3864 mutex_unlock(&ar->conf_mutex);
3867 static int ath10k_mac_inc_num_stations(struct ath10k_vif *arvif)
3869 struct ath10k *ar = arvif->ar;
3871 lockdep_assert_held(&ar->conf_mutex);
3873 if (arvif->vdev_type != WMI_VDEV_TYPE_AP &&
3874 arvif->vdev_type != WMI_VDEV_TYPE_IBSS)
3875 return 0;
3877 if (ar->num_stations >= ar->max_num_stations)
3878 return -ENOBUFS;
3880 ar->num_stations++;
3882 return 0;
3885 static void ath10k_mac_dec_num_stations(struct ath10k_vif *arvif)
3887 struct ath10k *ar = arvif->ar;
3889 lockdep_assert_held(&ar->conf_mutex);
3891 if (arvif->vdev_type != WMI_VDEV_TYPE_AP &&
3892 arvif->vdev_type != WMI_VDEV_TYPE_IBSS)
3893 return;
3895 ar->num_stations--;
3898 static int ath10k_sta_state(struct ieee80211_hw *hw,
3899 struct ieee80211_vif *vif,
3900 struct ieee80211_sta *sta,
3901 enum ieee80211_sta_state old_state,
3902 enum ieee80211_sta_state new_state)
3904 struct ath10k *ar = hw->priv;
3905 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3906 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
3907 int ret = 0;
3909 if (old_state == IEEE80211_STA_NOTEXIST &&
3910 new_state == IEEE80211_STA_NONE) {
3911 memset(arsta, 0, sizeof(*arsta));
3912 arsta->arvif = arvif;
3913 INIT_WORK(&arsta->update_wk, ath10k_sta_rc_update_wk);
3916 /* cancel must be done outside the mutex to avoid deadlock */
3917 if ((old_state == IEEE80211_STA_NONE &&
3918 new_state == IEEE80211_STA_NOTEXIST))
3919 cancel_work_sync(&arsta->update_wk);
3921 mutex_lock(&ar->conf_mutex);
3923 if (old_state == IEEE80211_STA_NOTEXIST &&
3924 new_state == IEEE80211_STA_NONE) {
3926 * New station addition.
3928 ath10k_dbg(ar, ATH10K_DBG_MAC,
3929 "mac vdev %d peer create %pM (new sta) sta %d / %d peer %d / %d\n",
3930 arvif->vdev_id, sta->addr,
3931 ar->num_stations + 1, ar->max_num_stations,
3932 ar->num_peers + 1, ar->max_num_peers);
3934 ret = ath10k_mac_inc_num_stations(arvif);
3935 if (ret) {
3936 ath10k_warn(ar, "refusing to associate station: too many connected already (%d)\n",
3937 ar->max_num_stations);
3938 goto exit;
3941 ret = ath10k_peer_create(ar, arvif->vdev_id, sta->addr);
3942 if (ret) {
3943 ath10k_warn(ar, "failed to add peer %pM for vdev %d when adding a new sta: %i\n",
3944 sta->addr, arvif->vdev_id, ret);
3945 ath10k_mac_dec_num_stations(arvif);
3946 goto exit;
3949 if (vif->type == NL80211_IFTYPE_STATION) {
3950 WARN_ON(arvif->is_started);
3952 ret = ath10k_vdev_start(arvif);
3953 if (ret) {
3954 ath10k_warn(ar, "failed to start vdev %i: %d\n",
3955 arvif->vdev_id, ret);
3956 WARN_ON(ath10k_peer_delete(ar, arvif->vdev_id,
3957 sta->addr));
3958 ath10k_mac_dec_num_stations(arvif);
3959 goto exit;
3962 arvif->is_started = true;
3964 } else if ((old_state == IEEE80211_STA_NONE &&
3965 new_state == IEEE80211_STA_NOTEXIST)) {
3967 * Existing station deletion.
3969 ath10k_dbg(ar, ATH10K_DBG_MAC,
3970 "mac vdev %d peer delete %pM (sta gone)\n",
3971 arvif->vdev_id, sta->addr);
3973 if (vif->type == NL80211_IFTYPE_STATION) {
3974 WARN_ON(!arvif->is_started);
3976 ret = ath10k_vdev_stop(arvif);
3977 if (ret)
3978 ath10k_warn(ar, "failed to stop vdev %i: %d\n",
3979 arvif->vdev_id, ret);
3981 arvif->is_started = false;
3984 ret = ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
3985 if (ret)
3986 ath10k_warn(ar, "failed to delete peer %pM for vdev %d: %i\n",
3987 sta->addr, arvif->vdev_id, ret);
3989 ath10k_mac_dec_num_stations(arvif);
3990 } else if (old_state == IEEE80211_STA_AUTH &&
3991 new_state == IEEE80211_STA_ASSOC &&
3992 (vif->type == NL80211_IFTYPE_AP ||
3993 vif->type == NL80211_IFTYPE_ADHOC)) {
3995 * New association.
3997 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac sta %pM associated\n",
3998 sta->addr);
4000 ret = ath10k_station_assoc(ar, vif, sta, false);
4001 if (ret)
4002 ath10k_warn(ar, "failed to associate station %pM for vdev %i: %i\n",
4003 sta->addr, arvif->vdev_id, ret);
4004 } else if (old_state == IEEE80211_STA_ASSOC &&
4005 new_state == IEEE80211_STA_AUTH &&
4006 (vif->type == NL80211_IFTYPE_AP ||
4007 vif->type == NL80211_IFTYPE_ADHOC)) {
4009 * Disassociation.
4011 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac sta %pM disassociated\n",
4012 sta->addr);
4014 ret = ath10k_station_disassoc(ar, vif, sta);
4015 if (ret)
4016 ath10k_warn(ar, "failed to disassociate station: %pM vdev %i: %i\n",
4017 sta->addr, arvif->vdev_id, ret);
4019 exit:
4020 mutex_unlock(&ar->conf_mutex);
4021 return ret;
4024 static int ath10k_conf_tx_uapsd(struct ath10k *ar, struct ieee80211_vif *vif,
4025 u16 ac, bool enable)
4027 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4028 struct wmi_sta_uapsd_auto_trig_arg arg = {};
4029 u32 prio = 0, acc = 0;
4030 u32 value = 0;
4031 int ret = 0;
4033 lockdep_assert_held(&ar->conf_mutex);
4035 if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
4036 return 0;
4038 switch (ac) {
4039 case IEEE80211_AC_VO:
4040 value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN |
4041 WMI_STA_PS_UAPSD_AC3_TRIGGER_EN;
4042 prio = 7;
4043 acc = 3;
4044 break;
4045 case IEEE80211_AC_VI:
4046 value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN |
4047 WMI_STA_PS_UAPSD_AC2_TRIGGER_EN;
4048 prio = 5;
4049 acc = 2;
4050 break;
4051 case IEEE80211_AC_BE:
4052 value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN |
4053 WMI_STA_PS_UAPSD_AC1_TRIGGER_EN;
4054 prio = 2;
4055 acc = 1;
4056 break;
4057 case IEEE80211_AC_BK:
4058 value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN |
4059 WMI_STA_PS_UAPSD_AC0_TRIGGER_EN;
4060 prio = 0;
4061 acc = 0;
4062 break;
4065 if (enable)
4066 arvif->u.sta.uapsd |= value;
4067 else
4068 arvif->u.sta.uapsd &= ~value;
4070 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
4071 WMI_STA_PS_PARAM_UAPSD,
4072 arvif->u.sta.uapsd);
4073 if (ret) {
4074 ath10k_warn(ar, "failed to set uapsd params: %d\n", ret);
4075 goto exit;
4078 if (arvif->u.sta.uapsd)
4079 value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD;
4080 else
4081 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
4083 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
4084 WMI_STA_PS_PARAM_RX_WAKE_POLICY,
4085 value);
4086 if (ret)
4087 ath10k_warn(ar, "failed to set rx wake param: %d\n", ret);
4089 ret = ath10k_mac_vif_recalc_ps_wake_threshold(arvif);
4090 if (ret) {
4091 ath10k_warn(ar, "failed to recalc ps wake threshold on vdev %i: %d\n",
4092 arvif->vdev_id, ret);
4093 return ret;
4096 ret = ath10k_mac_vif_recalc_ps_poll_count(arvif);
4097 if (ret) {
4098 ath10k_warn(ar, "failed to recalc ps poll count on vdev %i: %d\n",
4099 arvif->vdev_id, ret);
4100 return ret;
4103 if (test_bit(WMI_SERVICE_STA_UAPSD_BASIC_AUTO_TRIG, ar->wmi.svc_map) ||
4104 test_bit(WMI_SERVICE_STA_UAPSD_VAR_AUTO_TRIG, ar->wmi.svc_map)) {
4105 /* Only userspace can make an educated decision when to send
4106 * trigger frame. The following effectively disables u-UAPSD
4107 * autotrigger in firmware (which is enabled by default
4108 * provided the autotrigger service is available).
4111 arg.wmm_ac = acc;
4112 arg.user_priority = prio;
4113 arg.service_interval = 0;
4114 arg.suspend_interval = WMI_STA_UAPSD_MAX_INTERVAL_MSEC;
4115 arg.delay_interval = WMI_STA_UAPSD_MAX_INTERVAL_MSEC;
4117 ret = ath10k_wmi_vdev_sta_uapsd(ar, arvif->vdev_id,
4118 arvif->bssid, &arg, 1);
4119 if (ret) {
4120 ath10k_warn(ar, "failed to set uapsd auto trigger %d\n",
4121 ret);
4122 return ret;
4126 exit:
4127 return ret;
4130 static int ath10k_conf_tx(struct ieee80211_hw *hw,
4131 struct ieee80211_vif *vif, u16 ac,
4132 const struct ieee80211_tx_queue_params *params)
4134 struct ath10k *ar = hw->priv;
4135 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4136 struct wmi_wmm_params_arg *p = NULL;
4137 int ret;
4139 mutex_lock(&ar->conf_mutex);
4141 switch (ac) {
4142 case IEEE80211_AC_VO:
4143 p = &arvif->wmm_params.ac_vo;
4144 break;
4145 case IEEE80211_AC_VI:
4146 p = &arvif->wmm_params.ac_vi;
4147 break;
4148 case IEEE80211_AC_BE:
4149 p = &arvif->wmm_params.ac_be;
4150 break;
4151 case IEEE80211_AC_BK:
4152 p = &arvif->wmm_params.ac_bk;
4153 break;
4156 if (WARN_ON(!p)) {
4157 ret = -EINVAL;
4158 goto exit;
4161 p->cwmin = params->cw_min;
4162 p->cwmax = params->cw_max;
4163 p->aifs = params->aifs;
4166 * The channel time duration programmed in the HW is in absolute
4167 * microseconds, while mac80211 gives the txop in units of
4168 * 32 microseconds.
4170 p->txop = params->txop * 32;
4172 if (ar->wmi.ops->gen_vdev_wmm_conf) {
4173 ret = ath10k_wmi_vdev_wmm_conf(ar, arvif->vdev_id,
4174 &arvif->wmm_params);
4175 if (ret) {
4176 ath10k_warn(ar, "failed to set vdev wmm params on vdev %i: %d\n",
4177 arvif->vdev_id, ret);
4178 goto exit;
4180 } else {
4181 /* This won't work well with multi-interface cases but it's
4182 * better than nothing.
4184 ret = ath10k_wmi_pdev_set_wmm_params(ar, &arvif->wmm_params);
4185 if (ret) {
4186 ath10k_warn(ar, "failed to set wmm params: %d\n", ret);
4187 goto exit;
4191 ret = ath10k_conf_tx_uapsd(ar, vif, ac, params->uapsd);
4192 if (ret)
4193 ath10k_warn(ar, "failed to set sta uapsd: %d\n", ret);
4195 exit:
4196 mutex_unlock(&ar->conf_mutex);
4197 return ret;
4200 #define ATH10K_ROC_TIMEOUT_HZ (2*HZ)
4202 static int ath10k_remain_on_channel(struct ieee80211_hw *hw,
4203 struct ieee80211_vif *vif,
4204 struct ieee80211_channel *chan,
4205 int duration,
4206 enum ieee80211_roc_type type)
4208 struct ath10k *ar = hw->priv;
4209 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4210 struct wmi_start_scan_arg arg;
4211 int ret = 0;
4213 mutex_lock(&ar->conf_mutex);
4215 spin_lock_bh(&ar->data_lock);
4216 switch (ar->scan.state) {
4217 case ATH10K_SCAN_IDLE:
4218 reinit_completion(&ar->scan.started);
4219 reinit_completion(&ar->scan.completed);
4220 reinit_completion(&ar->scan.on_channel);
4221 ar->scan.state = ATH10K_SCAN_STARTING;
4222 ar->scan.is_roc = true;
4223 ar->scan.vdev_id = arvif->vdev_id;
4224 ar->scan.roc_freq = chan->center_freq;
4225 ret = 0;
4226 break;
4227 case ATH10K_SCAN_STARTING:
4228 case ATH10K_SCAN_RUNNING:
4229 case ATH10K_SCAN_ABORTING:
4230 ret = -EBUSY;
4231 break;
4233 spin_unlock_bh(&ar->data_lock);
4235 if (ret)
4236 goto exit;
4238 duration = max(duration, WMI_SCAN_CHAN_MIN_TIME_MSEC);
4240 memset(&arg, 0, sizeof(arg));
4241 ath10k_wmi_start_scan_init(ar, &arg);
4242 arg.vdev_id = arvif->vdev_id;
4243 arg.scan_id = ATH10K_SCAN_ID;
4244 arg.n_channels = 1;
4245 arg.channels[0] = chan->center_freq;
4246 arg.dwell_time_active = duration;
4247 arg.dwell_time_passive = duration;
4248 arg.max_scan_time = 2 * duration;
4249 arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
4250 arg.scan_ctrl_flags |= WMI_SCAN_FILTER_PROBE_REQ;
4252 ret = ath10k_start_scan(ar, &arg);
4253 if (ret) {
4254 ath10k_warn(ar, "failed to start roc scan: %d\n", ret);
4255 spin_lock_bh(&ar->data_lock);
4256 ar->scan.state = ATH10K_SCAN_IDLE;
4257 spin_unlock_bh(&ar->data_lock);
4258 goto exit;
4261 ret = wait_for_completion_timeout(&ar->scan.on_channel, 3*HZ);
4262 if (ret == 0) {
4263 ath10k_warn(ar, "failed to switch to channel for roc scan\n");
4265 ret = ath10k_scan_stop(ar);
4266 if (ret)
4267 ath10k_warn(ar, "failed to stop scan: %d\n", ret);
4269 ret = -ETIMEDOUT;
4270 goto exit;
4273 ret = 0;
4274 exit:
4275 mutex_unlock(&ar->conf_mutex);
4276 return ret;
4279 static int ath10k_cancel_remain_on_channel(struct ieee80211_hw *hw)
4281 struct ath10k *ar = hw->priv;
4283 mutex_lock(&ar->conf_mutex);
4284 ath10k_scan_abort(ar);
4285 mutex_unlock(&ar->conf_mutex);
4287 cancel_delayed_work_sync(&ar->scan.timeout);
4289 return 0;
4293 * Both RTS and Fragmentation threshold are interface-specific
4294 * in ath10k, but device-specific in mac80211.
4297 static int ath10k_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
4299 struct ath10k *ar = hw->priv;
4300 struct ath10k_vif *arvif;
4301 int ret = 0;
4303 mutex_lock(&ar->conf_mutex);
4304 list_for_each_entry(arvif, &ar->arvifs, list) {
4305 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d rts threshold %d\n",
4306 arvif->vdev_id, value);
4308 ret = ath10k_mac_set_rts(arvif, value);
4309 if (ret) {
4310 ath10k_warn(ar, "failed to set rts threshold for vdev %d: %d\n",
4311 arvif->vdev_id, ret);
4312 break;
4315 mutex_unlock(&ar->conf_mutex);
4317 return ret;
4320 static void ath10k_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
4321 u32 queues, bool drop)
4323 struct ath10k *ar = hw->priv;
4324 bool skip;
4325 int ret;
4327 /* mac80211 doesn't care if we really xmit queued frames or not
4328 * we'll collect those frames either way if we stop/delete vdevs */
4329 if (drop)
4330 return;
4332 mutex_lock(&ar->conf_mutex);
4334 if (ar->state == ATH10K_STATE_WEDGED)
4335 goto skip;
4337 ret = wait_event_timeout(ar->htt.empty_tx_wq, ({
4338 bool empty;
4340 spin_lock_bh(&ar->htt.tx_lock);
4341 empty = (ar->htt.num_pending_tx == 0);
4342 spin_unlock_bh(&ar->htt.tx_lock);
4344 skip = (ar->state == ATH10K_STATE_WEDGED) ||
4345 test_bit(ATH10K_FLAG_CRASH_FLUSH,
4346 &ar->dev_flags);
4348 (empty || skip);
4349 }), ATH10K_FLUSH_TIMEOUT_HZ);
4351 if (ret <= 0 || skip)
4352 ath10k_warn(ar, "failed to flush transmit queue (skip %i ar-state %i): %i\n",
4353 skip, ar->state, ret);
4355 skip:
4356 mutex_unlock(&ar->conf_mutex);
4359 /* TODO: Implement this function properly
4360 * For now it is needed to reply to Probe Requests in IBSS mode.
4361 * Propably we need this information from FW.
4363 static int ath10k_tx_last_beacon(struct ieee80211_hw *hw)
4365 return 1;
4368 #ifdef CONFIG_PM
4369 static int ath10k_suspend(struct ieee80211_hw *hw,
4370 struct cfg80211_wowlan *wowlan)
4372 struct ath10k *ar = hw->priv;
4373 int ret;
4375 mutex_lock(&ar->conf_mutex);
4377 ret = ath10k_wait_for_suspend(ar, WMI_PDEV_SUSPEND);
4378 if (ret) {
4379 if (ret == -ETIMEDOUT)
4380 goto resume;
4381 ret = 1;
4382 goto exit;
4385 ret = ath10k_hif_suspend(ar);
4386 if (ret) {
4387 ath10k_warn(ar, "failed to suspend hif: %d\n", ret);
4388 goto resume;
4391 ret = 0;
4392 goto exit;
4393 resume:
4394 ret = ath10k_wmi_pdev_resume_target(ar);
4395 if (ret)
4396 ath10k_warn(ar, "failed to resume target: %d\n", ret);
4398 ret = 1;
4399 exit:
4400 mutex_unlock(&ar->conf_mutex);
4401 return ret;
4404 static int ath10k_resume(struct ieee80211_hw *hw)
4406 struct ath10k *ar = hw->priv;
4407 int ret;
4409 mutex_lock(&ar->conf_mutex);
4411 ret = ath10k_hif_resume(ar);
4412 if (ret) {
4413 ath10k_warn(ar, "failed to resume hif: %d\n", ret);
4414 ret = 1;
4415 goto exit;
4418 ret = ath10k_wmi_pdev_resume_target(ar);
4419 if (ret) {
4420 ath10k_warn(ar, "failed to resume target: %d\n", ret);
4421 ret = 1;
4422 goto exit;
4425 ret = 0;
4426 exit:
4427 mutex_unlock(&ar->conf_mutex);
4428 return ret;
4430 #endif
4432 static void ath10k_reconfig_complete(struct ieee80211_hw *hw,
4433 enum ieee80211_reconfig_type reconfig_type)
4435 struct ath10k *ar = hw->priv;
4437 if (reconfig_type != IEEE80211_RECONFIG_TYPE_RESTART)
4438 return;
4440 mutex_lock(&ar->conf_mutex);
4442 /* If device failed to restart it will be in a different state, e.g.
4443 * ATH10K_STATE_WEDGED */
4444 if (ar->state == ATH10K_STATE_RESTARTED) {
4445 ath10k_info(ar, "device successfully recovered\n");
4446 ar->state = ATH10K_STATE_ON;
4447 ieee80211_wake_queues(ar->hw);
4450 mutex_unlock(&ar->conf_mutex);
4453 static int ath10k_get_survey(struct ieee80211_hw *hw, int idx,
4454 struct survey_info *survey)
4456 struct ath10k *ar = hw->priv;
4457 struct ieee80211_supported_band *sband;
4458 struct survey_info *ar_survey = &ar->survey[idx];
4459 int ret = 0;
4461 mutex_lock(&ar->conf_mutex);
4463 sband = hw->wiphy->bands[IEEE80211_BAND_2GHZ];
4464 if (sband && idx >= sband->n_channels) {
4465 idx -= sband->n_channels;
4466 sband = NULL;
4469 if (!sband)
4470 sband = hw->wiphy->bands[IEEE80211_BAND_5GHZ];
4472 if (!sband || idx >= sband->n_channels) {
4473 ret = -ENOENT;
4474 goto exit;
4477 spin_lock_bh(&ar->data_lock);
4478 memcpy(survey, ar_survey, sizeof(*survey));
4479 spin_unlock_bh(&ar->data_lock);
4481 survey->channel = &sband->channels[idx];
4483 if (ar->rx_channel == survey->channel)
4484 survey->filled |= SURVEY_INFO_IN_USE;
4486 exit:
4487 mutex_unlock(&ar->conf_mutex);
4488 return ret;
4491 /* Helper table for legacy fixed_rate/bitrate_mask */
4492 static const u8 cck_ofdm_rate[] = {
4493 /* CCK */
4494 3, /* 1Mbps */
4495 2, /* 2Mbps */
4496 1, /* 5.5Mbps */
4497 0, /* 11Mbps */
4498 /* OFDM */
4499 3, /* 6Mbps */
4500 7, /* 9Mbps */
4501 2, /* 12Mbps */
4502 6, /* 18Mbps */
4503 1, /* 24Mbps */
4504 5, /* 36Mbps */
4505 0, /* 48Mbps */
4506 4, /* 54Mbps */
4509 /* Check if only one bit set */
4510 static int ath10k_check_single_mask(u32 mask)
4512 int bit;
4514 bit = ffs(mask);
4515 if (!bit)
4516 return 0;
4518 mask &= ~BIT(bit - 1);
4519 if (mask)
4520 return 2;
4522 return 1;
4525 static bool
4526 ath10k_default_bitrate_mask(struct ath10k *ar,
4527 enum ieee80211_band band,
4528 const struct cfg80211_bitrate_mask *mask)
4530 u32 legacy = 0x00ff;
4531 u8 ht = 0xff, i;
4532 u16 vht = 0x3ff;
4533 u16 nrf = ar->num_rf_chains;
4535 if (ar->cfg_tx_chainmask)
4536 nrf = get_nss_from_chainmask(ar->cfg_tx_chainmask);
4538 switch (band) {
4539 case IEEE80211_BAND_2GHZ:
4540 legacy = 0x00fff;
4541 vht = 0;
4542 break;
4543 case IEEE80211_BAND_5GHZ:
4544 break;
4545 default:
4546 return false;
4549 if (mask->control[band].legacy != legacy)
4550 return false;
4552 for (i = 0; i < nrf; i++)
4553 if (mask->control[band].ht_mcs[i] != ht)
4554 return false;
4556 for (i = 0; i < nrf; i++)
4557 if (mask->control[band].vht_mcs[i] != vht)
4558 return false;
4560 return true;
4563 static bool
4564 ath10k_bitrate_mask_nss(const struct cfg80211_bitrate_mask *mask,
4565 enum ieee80211_band band,
4566 u8 *fixed_nss)
4568 int ht_nss = 0, vht_nss = 0, i;
4570 /* check legacy */
4571 if (ath10k_check_single_mask(mask->control[band].legacy))
4572 return false;
4574 /* check HT */
4575 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++) {
4576 if (mask->control[band].ht_mcs[i] == 0xff)
4577 continue;
4578 else if (mask->control[band].ht_mcs[i] == 0x00)
4579 break;
4581 return false;
4584 ht_nss = i;
4586 /* check VHT */
4587 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
4588 if (mask->control[band].vht_mcs[i] == 0x03ff)
4589 continue;
4590 else if (mask->control[band].vht_mcs[i] == 0x0000)
4591 break;
4593 return false;
4596 vht_nss = i;
4598 if (ht_nss > 0 && vht_nss > 0)
4599 return false;
4601 if (ht_nss)
4602 *fixed_nss = ht_nss;
4603 else if (vht_nss)
4604 *fixed_nss = vht_nss;
4605 else
4606 return false;
4608 return true;
4611 static bool
4612 ath10k_bitrate_mask_correct(const struct cfg80211_bitrate_mask *mask,
4613 enum ieee80211_band band,
4614 enum wmi_rate_preamble *preamble)
4616 int legacy = 0, ht = 0, vht = 0, i;
4618 *preamble = WMI_RATE_PREAMBLE_OFDM;
4620 /* check legacy */
4621 legacy = ath10k_check_single_mask(mask->control[band].legacy);
4622 if (legacy > 1)
4623 return false;
4625 /* check HT */
4626 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++)
4627 ht += ath10k_check_single_mask(mask->control[band].ht_mcs[i]);
4628 if (ht > 1)
4629 return false;
4631 /* check VHT */
4632 for (i = 0; i < NL80211_VHT_NSS_MAX; i++)
4633 vht += ath10k_check_single_mask(mask->control[band].vht_mcs[i]);
4634 if (vht > 1)
4635 return false;
4637 /* Currently we support only one fixed_rate */
4638 if ((legacy + ht + vht) != 1)
4639 return false;
4641 if (ht)
4642 *preamble = WMI_RATE_PREAMBLE_HT;
4643 else if (vht)
4644 *preamble = WMI_RATE_PREAMBLE_VHT;
4646 return true;
4649 static bool
4650 ath10k_bitrate_mask_rate(struct ath10k *ar,
4651 const struct cfg80211_bitrate_mask *mask,
4652 enum ieee80211_band band,
4653 u8 *fixed_rate,
4654 u8 *fixed_nss)
4656 u8 rate = 0, pream = 0, nss = 0, i;
4657 enum wmi_rate_preamble preamble;
4659 /* Check if single rate correct */
4660 if (!ath10k_bitrate_mask_correct(mask, band, &preamble))
4661 return false;
4663 pream = preamble;
4665 switch (preamble) {
4666 case WMI_RATE_PREAMBLE_CCK:
4667 case WMI_RATE_PREAMBLE_OFDM:
4668 i = ffs(mask->control[band].legacy) - 1;
4670 if (band == IEEE80211_BAND_2GHZ && i < 4)
4671 pream = WMI_RATE_PREAMBLE_CCK;
4673 if (band == IEEE80211_BAND_5GHZ)
4674 i += 4;
4676 if (i >= ARRAY_SIZE(cck_ofdm_rate))
4677 return false;
4679 rate = cck_ofdm_rate[i];
4680 break;
4681 case WMI_RATE_PREAMBLE_HT:
4682 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++)
4683 if (mask->control[band].ht_mcs[i])
4684 break;
4686 if (i == IEEE80211_HT_MCS_MASK_LEN)
4687 return false;
4689 rate = ffs(mask->control[band].ht_mcs[i]) - 1;
4690 nss = i;
4691 break;
4692 case WMI_RATE_PREAMBLE_VHT:
4693 for (i = 0; i < NL80211_VHT_NSS_MAX; i++)
4694 if (mask->control[band].vht_mcs[i])
4695 break;
4697 if (i == NL80211_VHT_NSS_MAX)
4698 return false;
4700 rate = ffs(mask->control[band].vht_mcs[i]) - 1;
4701 nss = i;
4702 break;
4705 *fixed_nss = nss + 1;
4706 nss <<= 4;
4707 pream <<= 6;
4709 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac fixed rate pream 0x%02x nss 0x%02x rate 0x%02x\n",
4710 pream, nss, rate);
4712 *fixed_rate = pream | nss | rate;
4714 return true;
4717 static bool ath10k_get_fixed_rate_nss(struct ath10k *ar,
4718 const struct cfg80211_bitrate_mask *mask,
4719 enum ieee80211_band band,
4720 u8 *fixed_rate,
4721 u8 *fixed_nss)
4723 /* First check full NSS mask, if we can simply limit NSS */
4724 if (ath10k_bitrate_mask_nss(mask, band, fixed_nss))
4725 return true;
4727 /* Next Check single rate is set */
4728 return ath10k_bitrate_mask_rate(ar, mask, band, fixed_rate, fixed_nss);
4731 static int ath10k_set_fixed_rate_param(struct ath10k_vif *arvif,
4732 u8 fixed_rate,
4733 u8 fixed_nss,
4734 u8 force_sgi)
4736 struct ath10k *ar = arvif->ar;
4737 u32 vdev_param;
4738 int ret = 0;
4740 mutex_lock(&ar->conf_mutex);
4742 if (arvif->fixed_rate == fixed_rate &&
4743 arvif->fixed_nss == fixed_nss &&
4744 arvif->force_sgi == force_sgi)
4745 goto exit;
4747 if (fixed_rate == WMI_FIXED_RATE_NONE)
4748 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac disable fixed bitrate mask\n");
4750 if (force_sgi)
4751 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac force sgi\n");
4753 vdev_param = ar->wmi.vdev_param->fixed_rate;
4754 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
4755 vdev_param, fixed_rate);
4756 if (ret) {
4757 ath10k_warn(ar, "failed to set fixed rate param 0x%02x: %d\n",
4758 fixed_rate, ret);
4759 ret = -EINVAL;
4760 goto exit;
4763 arvif->fixed_rate = fixed_rate;
4765 vdev_param = ar->wmi.vdev_param->nss;
4766 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
4767 vdev_param, fixed_nss);
4769 if (ret) {
4770 ath10k_warn(ar, "failed to set fixed nss param %d: %d\n",
4771 fixed_nss, ret);
4772 ret = -EINVAL;
4773 goto exit;
4776 arvif->fixed_nss = fixed_nss;
4778 vdev_param = ar->wmi.vdev_param->sgi;
4779 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
4780 force_sgi);
4782 if (ret) {
4783 ath10k_warn(ar, "failed to set sgi param %d: %d\n",
4784 force_sgi, ret);
4785 ret = -EINVAL;
4786 goto exit;
4789 arvif->force_sgi = force_sgi;
4791 exit:
4792 mutex_unlock(&ar->conf_mutex);
4793 return ret;
4796 static int ath10k_set_bitrate_mask(struct ieee80211_hw *hw,
4797 struct ieee80211_vif *vif,
4798 const struct cfg80211_bitrate_mask *mask)
4800 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4801 struct ath10k *ar = arvif->ar;
4802 enum ieee80211_band band = ar->hw->conf.chandef.chan->band;
4803 u8 fixed_rate = WMI_FIXED_RATE_NONE;
4804 u8 fixed_nss = ar->num_rf_chains;
4805 u8 force_sgi;
4807 if (ar->cfg_tx_chainmask)
4808 fixed_nss = get_nss_from_chainmask(ar->cfg_tx_chainmask);
4810 force_sgi = mask->control[band].gi;
4811 if (force_sgi == NL80211_TXRATE_FORCE_LGI)
4812 return -EINVAL;
4814 if (!ath10k_default_bitrate_mask(ar, band, mask)) {
4815 if (!ath10k_get_fixed_rate_nss(ar, mask, band,
4816 &fixed_rate,
4817 &fixed_nss))
4818 return -EINVAL;
4821 if (fixed_rate == WMI_FIXED_RATE_NONE && force_sgi) {
4822 ath10k_warn(ar, "failed to force SGI usage for default rate settings\n");
4823 return -EINVAL;
4826 return ath10k_set_fixed_rate_param(arvif, fixed_rate,
4827 fixed_nss, force_sgi);
4830 static void ath10k_sta_rc_update(struct ieee80211_hw *hw,
4831 struct ieee80211_vif *vif,
4832 struct ieee80211_sta *sta,
4833 u32 changed)
4835 struct ath10k *ar = hw->priv;
4836 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
4837 u32 bw, smps;
4839 spin_lock_bh(&ar->data_lock);
4841 ath10k_dbg(ar, ATH10K_DBG_MAC,
4842 "mac sta rc update for %pM changed %08x bw %d nss %d smps %d\n",
4843 sta->addr, changed, sta->bandwidth, sta->rx_nss,
4844 sta->smps_mode);
4846 if (changed & IEEE80211_RC_BW_CHANGED) {
4847 bw = WMI_PEER_CHWIDTH_20MHZ;
4849 switch (sta->bandwidth) {
4850 case IEEE80211_STA_RX_BW_20:
4851 bw = WMI_PEER_CHWIDTH_20MHZ;
4852 break;
4853 case IEEE80211_STA_RX_BW_40:
4854 bw = WMI_PEER_CHWIDTH_40MHZ;
4855 break;
4856 case IEEE80211_STA_RX_BW_80:
4857 bw = WMI_PEER_CHWIDTH_80MHZ;
4858 break;
4859 case IEEE80211_STA_RX_BW_160:
4860 ath10k_warn(ar, "Invalid bandwith %d in rc update for %pM\n",
4861 sta->bandwidth, sta->addr);
4862 bw = WMI_PEER_CHWIDTH_20MHZ;
4863 break;
4866 arsta->bw = bw;
4869 if (changed & IEEE80211_RC_NSS_CHANGED)
4870 arsta->nss = sta->rx_nss;
4872 if (changed & IEEE80211_RC_SMPS_CHANGED) {
4873 smps = WMI_PEER_SMPS_PS_NONE;
4875 switch (sta->smps_mode) {
4876 case IEEE80211_SMPS_AUTOMATIC:
4877 case IEEE80211_SMPS_OFF:
4878 smps = WMI_PEER_SMPS_PS_NONE;
4879 break;
4880 case IEEE80211_SMPS_STATIC:
4881 smps = WMI_PEER_SMPS_STATIC;
4882 break;
4883 case IEEE80211_SMPS_DYNAMIC:
4884 smps = WMI_PEER_SMPS_DYNAMIC;
4885 break;
4886 case IEEE80211_SMPS_NUM_MODES:
4887 ath10k_warn(ar, "Invalid smps %d in sta rc update for %pM\n",
4888 sta->smps_mode, sta->addr);
4889 smps = WMI_PEER_SMPS_PS_NONE;
4890 break;
4893 arsta->smps = smps;
4896 arsta->changed |= changed;
4898 spin_unlock_bh(&ar->data_lock);
4900 ieee80211_queue_work(hw, &arsta->update_wk);
4903 static u64 ath10k_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
4906 * FIXME: Return 0 for time being. Need to figure out whether FW
4907 * has the API to fetch 64-bit local TSF
4910 return 0;
4913 static int ath10k_ampdu_action(struct ieee80211_hw *hw,
4914 struct ieee80211_vif *vif,
4915 enum ieee80211_ampdu_mlme_action action,
4916 struct ieee80211_sta *sta, u16 tid, u16 *ssn,
4917 u8 buf_size)
4919 struct ath10k *ar = hw->priv;
4920 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4922 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac ampdu vdev_id %i sta %pM tid %hu action %d\n",
4923 arvif->vdev_id, sta->addr, tid, action);
4925 switch (action) {
4926 case IEEE80211_AMPDU_RX_START:
4927 case IEEE80211_AMPDU_RX_STOP:
4928 /* HTT AddBa/DelBa events trigger mac80211 Rx BA session
4929 * creation/removal. Do we need to verify this?
4931 return 0;
4932 case IEEE80211_AMPDU_TX_START:
4933 case IEEE80211_AMPDU_TX_STOP_CONT:
4934 case IEEE80211_AMPDU_TX_STOP_FLUSH:
4935 case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
4936 case IEEE80211_AMPDU_TX_OPERATIONAL:
4937 /* Firmware offloads Tx aggregation entirely so deny mac80211
4938 * Tx aggregation requests.
4940 return -EOPNOTSUPP;
4943 return -EINVAL;
4946 static const struct ieee80211_ops ath10k_ops = {
4947 .tx = ath10k_tx,
4948 .start = ath10k_start,
4949 .stop = ath10k_stop,
4950 .config = ath10k_config,
4951 .add_interface = ath10k_add_interface,
4952 .remove_interface = ath10k_remove_interface,
4953 .configure_filter = ath10k_configure_filter,
4954 .bss_info_changed = ath10k_bss_info_changed,
4955 .hw_scan = ath10k_hw_scan,
4956 .cancel_hw_scan = ath10k_cancel_hw_scan,
4957 .set_key = ath10k_set_key,
4958 .set_default_unicast_key = ath10k_set_default_unicast_key,
4959 .sta_state = ath10k_sta_state,
4960 .conf_tx = ath10k_conf_tx,
4961 .remain_on_channel = ath10k_remain_on_channel,
4962 .cancel_remain_on_channel = ath10k_cancel_remain_on_channel,
4963 .set_rts_threshold = ath10k_set_rts_threshold,
4964 .flush = ath10k_flush,
4965 .tx_last_beacon = ath10k_tx_last_beacon,
4966 .set_antenna = ath10k_set_antenna,
4967 .get_antenna = ath10k_get_antenna,
4968 .reconfig_complete = ath10k_reconfig_complete,
4969 .get_survey = ath10k_get_survey,
4970 .set_bitrate_mask = ath10k_set_bitrate_mask,
4971 .sta_rc_update = ath10k_sta_rc_update,
4972 .get_tsf = ath10k_get_tsf,
4973 .ampdu_action = ath10k_ampdu_action,
4974 .get_et_sset_count = ath10k_debug_get_et_sset_count,
4975 .get_et_stats = ath10k_debug_get_et_stats,
4976 .get_et_strings = ath10k_debug_get_et_strings,
4978 CFG80211_TESTMODE_CMD(ath10k_tm_cmd)
4980 #ifdef CONFIG_PM
4981 .suspend = ath10k_suspend,
4982 .resume = ath10k_resume,
4983 #endif
4984 #ifdef CONFIG_MAC80211_DEBUGFS
4985 .sta_add_debugfs = ath10k_sta_add_debugfs,
4986 #endif
4989 #define RATETAB_ENT(_rate, _rateid, _flags) { \
4990 .bitrate = (_rate), \
4991 .flags = (_flags), \
4992 .hw_value = (_rateid), \
4995 #define CHAN2G(_channel, _freq, _flags) { \
4996 .band = IEEE80211_BAND_2GHZ, \
4997 .hw_value = (_channel), \
4998 .center_freq = (_freq), \
4999 .flags = (_flags), \
5000 .max_antenna_gain = 0, \
5001 .max_power = 30, \
5004 #define CHAN5G(_channel, _freq, _flags) { \
5005 .band = IEEE80211_BAND_5GHZ, \
5006 .hw_value = (_channel), \
5007 .center_freq = (_freq), \
5008 .flags = (_flags), \
5009 .max_antenna_gain = 0, \
5010 .max_power = 30, \
5013 static const struct ieee80211_channel ath10k_2ghz_channels[] = {
5014 CHAN2G(1, 2412, 0),
5015 CHAN2G(2, 2417, 0),
5016 CHAN2G(3, 2422, 0),
5017 CHAN2G(4, 2427, 0),
5018 CHAN2G(5, 2432, 0),
5019 CHAN2G(6, 2437, 0),
5020 CHAN2G(7, 2442, 0),
5021 CHAN2G(8, 2447, 0),
5022 CHAN2G(9, 2452, 0),
5023 CHAN2G(10, 2457, 0),
5024 CHAN2G(11, 2462, 0),
5025 CHAN2G(12, 2467, 0),
5026 CHAN2G(13, 2472, 0),
5027 CHAN2G(14, 2484, 0),
5030 static const struct ieee80211_channel ath10k_5ghz_channels[] = {
5031 CHAN5G(36, 5180, 0),
5032 CHAN5G(40, 5200, 0),
5033 CHAN5G(44, 5220, 0),
5034 CHAN5G(48, 5240, 0),
5035 CHAN5G(52, 5260, 0),
5036 CHAN5G(56, 5280, 0),
5037 CHAN5G(60, 5300, 0),
5038 CHAN5G(64, 5320, 0),
5039 CHAN5G(100, 5500, 0),
5040 CHAN5G(104, 5520, 0),
5041 CHAN5G(108, 5540, 0),
5042 CHAN5G(112, 5560, 0),
5043 CHAN5G(116, 5580, 0),
5044 CHAN5G(120, 5600, 0),
5045 CHAN5G(124, 5620, 0),
5046 CHAN5G(128, 5640, 0),
5047 CHAN5G(132, 5660, 0),
5048 CHAN5G(136, 5680, 0),
5049 CHAN5G(140, 5700, 0),
5050 CHAN5G(149, 5745, 0),
5051 CHAN5G(153, 5765, 0),
5052 CHAN5G(157, 5785, 0),
5053 CHAN5G(161, 5805, 0),
5054 CHAN5G(165, 5825, 0),
5057 /* Note: Be careful if you re-order these. There is code which depends on this
5058 * ordering.
5060 static struct ieee80211_rate ath10k_rates[] = {
5061 /* CCK */
5062 RATETAB_ENT(10, 0x82, 0),
5063 RATETAB_ENT(20, 0x84, 0),
5064 RATETAB_ENT(55, 0x8b, 0),
5065 RATETAB_ENT(110, 0x96, 0),
5066 /* OFDM */
5067 RATETAB_ENT(60, 0x0c, 0),
5068 RATETAB_ENT(90, 0x12, 0),
5069 RATETAB_ENT(120, 0x18, 0),
5070 RATETAB_ENT(180, 0x24, 0),
5071 RATETAB_ENT(240, 0x30, 0),
5072 RATETAB_ENT(360, 0x48, 0),
5073 RATETAB_ENT(480, 0x60, 0),
5074 RATETAB_ENT(540, 0x6c, 0),
5077 #define ath10k_a_rates (ath10k_rates + 4)
5078 #define ath10k_a_rates_size (ARRAY_SIZE(ath10k_rates) - 4)
5079 #define ath10k_g_rates (ath10k_rates + 0)
5080 #define ath10k_g_rates_size (ARRAY_SIZE(ath10k_rates))
5082 struct ath10k *ath10k_mac_create(size_t priv_size)
5084 struct ieee80211_hw *hw;
5085 struct ath10k *ar;
5087 hw = ieee80211_alloc_hw(sizeof(struct ath10k) + priv_size, &ath10k_ops);
5088 if (!hw)
5089 return NULL;
5091 ar = hw->priv;
5092 ar->hw = hw;
5094 return ar;
5097 void ath10k_mac_destroy(struct ath10k *ar)
5099 ieee80211_free_hw(ar->hw);
5102 static const struct ieee80211_iface_limit ath10k_if_limits[] = {
5104 .max = 8,
5105 .types = BIT(NL80211_IFTYPE_STATION)
5106 | BIT(NL80211_IFTYPE_P2P_CLIENT)
5109 .max = 3,
5110 .types = BIT(NL80211_IFTYPE_P2P_GO)
5113 .max = 1,
5114 .types = BIT(NL80211_IFTYPE_P2P_DEVICE)
5117 .max = 7,
5118 .types = BIT(NL80211_IFTYPE_AP)
5122 static const struct ieee80211_iface_limit ath10k_10x_if_limits[] = {
5124 .max = 8,
5125 .types = BIT(NL80211_IFTYPE_AP)
5129 static const struct ieee80211_iface_combination ath10k_if_comb[] = {
5131 .limits = ath10k_if_limits,
5132 .n_limits = ARRAY_SIZE(ath10k_if_limits),
5133 .max_interfaces = 8,
5134 .num_different_channels = 1,
5135 .beacon_int_infra_match = true,
5139 static const struct ieee80211_iface_combination ath10k_10x_if_comb[] = {
5141 .limits = ath10k_10x_if_limits,
5142 .n_limits = ARRAY_SIZE(ath10k_10x_if_limits),
5143 .max_interfaces = 8,
5144 .num_different_channels = 1,
5145 .beacon_int_infra_match = true,
5146 #ifdef CONFIG_ATH10K_DFS_CERTIFIED
5147 .radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
5148 BIT(NL80211_CHAN_WIDTH_20) |
5149 BIT(NL80211_CHAN_WIDTH_40) |
5150 BIT(NL80211_CHAN_WIDTH_80),
5151 #endif
5155 static struct ieee80211_sta_vht_cap ath10k_create_vht_cap(struct ath10k *ar)
5157 struct ieee80211_sta_vht_cap vht_cap = {0};
5158 u16 mcs_map;
5159 int i;
5161 vht_cap.vht_supported = 1;
5162 vht_cap.cap = ar->vht_cap_info;
5164 mcs_map = 0;
5165 for (i = 0; i < 8; i++) {
5166 if (i < ar->num_rf_chains)
5167 mcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i*2);
5168 else
5169 mcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i*2);
5172 vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(mcs_map);
5173 vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(mcs_map);
5175 return vht_cap;
5178 static struct ieee80211_sta_ht_cap ath10k_get_ht_cap(struct ath10k *ar)
5180 int i;
5181 struct ieee80211_sta_ht_cap ht_cap = {0};
5183 if (!(ar->ht_cap_info & WMI_HT_CAP_ENABLED))
5184 return ht_cap;
5186 ht_cap.ht_supported = 1;
5187 ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
5188 ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_8;
5189 ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
5190 ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
5191 ht_cap.cap |= WLAN_HT_CAP_SM_PS_STATIC << IEEE80211_HT_CAP_SM_PS_SHIFT;
5193 if (ar->ht_cap_info & WMI_HT_CAP_HT20_SGI)
5194 ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
5196 if (ar->ht_cap_info & WMI_HT_CAP_HT40_SGI)
5197 ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
5199 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) {
5200 u32 smps;
5202 smps = WLAN_HT_CAP_SM_PS_DYNAMIC;
5203 smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT;
5205 ht_cap.cap |= smps;
5208 if (ar->ht_cap_info & WMI_HT_CAP_TX_STBC)
5209 ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC;
5211 if (ar->ht_cap_info & WMI_HT_CAP_RX_STBC) {
5212 u32 stbc;
5214 stbc = ar->ht_cap_info;
5215 stbc &= WMI_HT_CAP_RX_STBC;
5216 stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT;
5217 stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT;
5218 stbc &= IEEE80211_HT_CAP_RX_STBC;
5220 ht_cap.cap |= stbc;
5223 if (ar->ht_cap_info & WMI_HT_CAP_LDPC)
5224 ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
5226 if (ar->ht_cap_info & WMI_HT_CAP_L_SIG_TXOP_PROT)
5227 ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
5229 /* max AMSDU is implicitly taken from vht_cap_info */
5230 if (ar->vht_cap_info & WMI_VHT_CAP_MAX_MPDU_LEN_MASK)
5231 ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU;
5233 for (i = 0; i < ar->num_rf_chains; i++)
5234 ht_cap.mcs.rx_mask[i] = 0xFF;
5236 ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
5238 return ht_cap;
5241 static void ath10k_get_arvif_iter(void *data, u8 *mac,
5242 struct ieee80211_vif *vif)
5244 struct ath10k_vif_iter *arvif_iter = data;
5245 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
5247 if (arvif->vdev_id == arvif_iter->vdev_id)
5248 arvif_iter->arvif = arvif;
5251 struct ath10k_vif *ath10k_get_arvif(struct ath10k *ar, u32 vdev_id)
5253 struct ath10k_vif_iter arvif_iter;
5254 u32 flags;
5256 memset(&arvif_iter, 0, sizeof(struct ath10k_vif_iter));
5257 arvif_iter.vdev_id = vdev_id;
5259 flags = IEEE80211_IFACE_ITER_RESUME_ALL;
5260 ieee80211_iterate_active_interfaces_atomic(ar->hw,
5261 flags,
5262 ath10k_get_arvif_iter,
5263 &arvif_iter);
5264 if (!arvif_iter.arvif) {
5265 ath10k_warn(ar, "No VIF found for vdev %d\n", vdev_id);
5266 return NULL;
5269 return arvif_iter.arvif;
5272 int ath10k_mac_register(struct ath10k *ar)
5274 static const u32 cipher_suites[] = {
5275 WLAN_CIPHER_SUITE_WEP40,
5276 WLAN_CIPHER_SUITE_WEP104,
5277 WLAN_CIPHER_SUITE_TKIP,
5278 WLAN_CIPHER_SUITE_CCMP,
5279 WLAN_CIPHER_SUITE_AES_CMAC,
5281 struct ieee80211_supported_band *band;
5282 struct ieee80211_sta_vht_cap vht_cap;
5283 struct ieee80211_sta_ht_cap ht_cap;
5284 void *channels;
5285 int ret;
5287 SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr);
5289 SET_IEEE80211_DEV(ar->hw, ar->dev);
5291 ht_cap = ath10k_get_ht_cap(ar);
5292 vht_cap = ath10k_create_vht_cap(ar);
5294 if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) {
5295 channels = kmemdup(ath10k_2ghz_channels,
5296 sizeof(ath10k_2ghz_channels),
5297 GFP_KERNEL);
5298 if (!channels) {
5299 ret = -ENOMEM;
5300 goto err_free;
5303 band = &ar->mac.sbands[IEEE80211_BAND_2GHZ];
5304 band->n_channels = ARRAY_SIZE(ath10k_2ghz_channels);
5305 band->channels = channels;
5306 band->n_bitrates = ath10k_g_rates_size;
5307 band->bitrates = ath10k_g_rates;
5308 band->ht_cap = ht_cap;
5310 /* Enable the VHT support at 2.4 GHz */
5311 band->vht_cap = vht_cap;
5313 ar->hw->wiphy->bands[IEEE80211_BAND_2GHZ] = band;
5316 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) {
5317 channels = kmemdup(ath10k_5ghz_channels,
5318 sizeof(ath10k_5ghz_channels),
5319 GFP_KERNEL);
5320 if (!channels) {
5321 ret = -ENOMEM;
5322 goto err_free;
5325 band = &ar->mac.sbands[IEEE80211_BAND_5GHZ];
5326 band->n_channels = ARRAY_SIZE(ath10k_5ghz_channels);
5327 band->channels = channels;
5328 band->n_bitrates = ath10k_a_rates_size;
5329 band->bitrates = ath10k_a_rates;
5330 band->ht_cap = ht_cap;
5331 band->vht_cap = vht_cap;
5332 ar->hw->wiphy->bands[IEEE80211_BAND_5GHZ] = band;
5335 ar->hw->wiphy->interface_modes =
5336 BIT(NL80211_IFTYPE_STATION) |
5337 BIT(NL80211_IFTYPE_AP);
5339 ar->hw->wiphy->available_antennas_rx = ar->supp_rx_chainmask;
5340 ar->hw->wiphy->available_antennas_tx = ar->supp_tx_chainmask;
5342 if (!test_bit(ATH10K_FW_FEATURE_NO_P2P, ar->fw_features))
5343 ar->hw->wiphy->interface_modes |=
5344 BIT(NL80211_IFTYPE_P2P_DEVICE) |
5345 BIT(NL80211_IFTYPE_P2P_CLIENT) |
5346 BIT(NL80211_IFTYPE_P2P_GO);
5348 ar->hw->flags = IEEE80211_HW_SIGNAL_DBM |
5349 IEEE80211_HW_SUPPORTS_PS |
5350 IEEE80211_HW_SUPPORTS_DYNAMIC_PS |
5351 IEEE80211_HW_MFP_CAPABLE |
5352 IEEE80211_HW_REPORTS_TX_ACK_STATUS |
5353 IEEE80211_HW_HAS_RATE_CONTROL |
5354 IEEE80211_HW_AP_LINK_PS |
5355 IEEE80211_HW_SPECTRUM_MGMT |
5356 IEEE80211_HW_SW_CRYPTO_CONTROL;
5358 ar->hw->wiphy->features |= NL80211_FEATURE_STATIC_SMPS;
5360 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS)
5361 ar->hw->wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS;
5363 if (ar->ht_cap_info & WMI_HT_CAP_ENABLED) {
5364 ar->hw->flags |= IEEE80211_HW_AMPDU_AGGREGATION;
5365 ar->hw->flags |= IEEE80211_HW_TX_AMPDU_SETUP_IN_HW;
5368 ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID;
5369 ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN;
5371 ar->hw->vif_data_size = sizeof(struct ath10k_vif);
5372 ar->hw->sta_data_size = sizeof(struct ath10k_sta);
5374 ar->hw->max_listen_interval = ATH10K_MAX_HW_LISTEN_INTERVAL;
5376 if (test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map)) {
5377 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD;
5379 /* Firmware delivers WPS/P2P Probe Requests frames to driver so
5380 * that userspace (e.g. wpa_supplicant/hostapd) can generate
5381 * correct Probe Responses. This is more of a hack advert..
5383 ar->hw->wiphy->probe_resp_offload |=
5384 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS |
5385 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS2 |
5386 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_P2P;
5389 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
5390 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
5391 ar->hw->wiphy->max_remain_on_channel_duration = 5000;
5393 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
5394 ar->hw->wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE;
5397 * on LL hardware queues are managed entirely by the FW
5398 * so we only advertise to mac we can do the queues thing
5400 ar->hw->queues = 4;
5402 switch (ar->wmi.op_version) {
5403 case ATH10K_FW_WMI_OP_VERSION_MAIN:
5404 case ATH10K_FW_WMI_OP_VERSION_TLV:
5405 ar->hw->wiphy->iface_combinations = ath10k_if_comb;
5406 ar->hw->wiphy->n_iface_combinations =
5407 ARRAY_SIZE(ath10k_if_comb);
5408 ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC);
5409 break;
5410 case ATH10K_FW_WMI_OP_VERSION_10_1:
5411 case ATH10K_FW_WMI_OP_VERSION_10_2:
5412 case ATH10K_FW_WMI_OP_VERSION_10_2_4:
5413 ar->hw->wiphy->iface_combinations = ath10k_10x_if_comb;
5414 ar->hw->wiphy->n_iface_combinations =
5415 ARRAY_SIZE(ath10k_10x_if_comb);
5416 break;
5417 case ATH10K_FW_WMI_OP_VERSION_UNSET:
5418 case ATH10K_FW_WMI_OP_VERSION_MAX:
5419 WARN_ON(1);
5420 ret = -EINVAL;
5421 goto err_free;
5424 ar->hw->netdev_features = NETIF_F_HW_CSUM;
5426 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED)) {
5427 /* Init ath dfs pattern detector */
5428 ar->ath_common.debug_mask = ATH_DBG_DFS;
5429 ar->dfs_detector = dfs_pattern_detector_init(&ar->ath_common,
5430 NL80211_DFS_UNSET);
5432 if (!ar->dfs_detector)
5433 ath10k_warn(ar, "failed to initialise DFS pattern detector\n");
5436 ret = ath_regd_init(&ar->ath_common.regulatory, ar->hw->wiphy,
5437 ath10k_reg_notifier);
5438 if (ret) {
5439 ath10k_err(ar, "failed to initialise regulatory: %i\n", ret);
5440 goto err_free;
5443 ar->hw->wiphy->cipher_suites = cipher_suites;
5444 ar->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
5446 ret = ieee80211_register_hw(ar->hw);
5447 if (ret) {
5448 ath10k_err(ar, "failed to register ieee80211: %d\n", ret);
5449 goto err_free;
5452 if (!ath_is_world_regd(&ar->ath_common.regulatory)) {
5453 ret = regulatory_hint(ar->hw->wiphy,
5454 ar->ath_common.regulatory.alpha2);
5455 if (ret)
5456 goto err_unregister;
5459 return 0;
5461 err_unregister:
5462 ieee80211_unregister_hw(ar->hw);
5463 err_free:
5464 kfree(ar->mac.sbands[IEEE80211_BAND_2GHZ].channels);
5465 kfree(ar->mac.sbands[IEEE80211_BAND_5GHZ].channels);
5467 return ret;
5470 void ath10k_mac_unregister(struct ath10k *ar)
5472 ieee80211_unregister_hw(ar->hw);
5474 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector)
5475 ar->dfs_detector->exit(ar->dfs_detector);
5477 kfree(ar->mac.sbands[IEEE80211_BAND_2GHZ].channels);
5478 kfree(ar->mac.sbands[IEEE80211_BAND_5GHZ].channels);
5480 SET_IEEE80211_DEV(ar->hw, NULL);