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.
20 #include <net/mac80211.h>
21 #include <linux/etherdevice.h>
35 static int ath10k_send_key(struct ath10k_vif *arvif,
36 struct ieee80211_key_conf *key,
40 struct ath10k *ar = arvif->ar;
41 struct wmi_vdev_install_key_arg arg = {
42 .vdev_id = arvif->vdev_id,
43 .key_idx = key->keyidx,
44 .key_len = key->keylen,
49 lockdep_assert_held(&arvif->ar->conf_mutex);
51 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
52 arg.key_flags = WMI_KEY_PAIRWISE;
54 arg.key_flags = WMI_KEY_GROUP;
56 switch (key->cipher) {
57 case WLAN_CIPHER_SUITE_CCMP:
58 arg.key_cipher = WMI_CIPHER_AES_CCM;
59 if (arvif->vdev_type == WMI_VDEV_TYPE_AP)
60 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT;
62 key->flags |= IEEE80211_KEY_FLAG_SW_MGMT_TX;
64 case WLAN_CIPHER_SUITE_TKIP:
65 arg.key_cipher = WMI_CIPHER_TKIP;
66 arg.key_txmic_len = 8;
67 arg.key_rxmic_len = 8;
69 case WLAN_CIPHER_SUITE_WEP40:
70 case WLAN_CIPHER_SUITE_WEP104:
71 arg.key_cipher = WMI_CIPHER_WEP;
72 /* AP/IBSS mode requires self-key to be groupwise
73 * Otherwise pairwise key must be set */
74 if (memcmp(macaddr, arvif->vif->addr, ETH_ALEN))
75 arg.key_flags = WMI_KEY_PAIRWISE;
78 ath10k_warn(ar, "cipher %d is not supported\n", key->cipher);
82 if (cmd == DISABLE_KEY) {
83 arg.key_cipher = WMI_CIPHER_NONE;
87 return ath10k_wmi_vdev_install_key(arvif->ar, &arg);
90 static int ath10k_install_key(struct ath10k_vif *arvif,
91 struct ieee80211_key_conf *key,
95 struct ath10k *ar = arvif->ar;
98 lockdep_assert_held(&ar->conf_mutex);
100 reinit_completion(&ar->install_key_done);
102 ret = ath10k_send_key(arvif, key, cmd, macaddr);
106 ret = wait_for_completion_timeout(&ar->install_key_done, 3*HZ);
113 static int ath10k_install_peer_wep_keys(struct ath10k_vif *arvif,
116 struct ath10k *ar = arvif->ar;
117 struct ath10k_peer *peer;
121 lockdep_assert_held(&ar->conf_mutex);
123 spin_lock_bh(&ar->data_lock);
124 peer = ath10k_peer_find(ar, arvif->vdev_id, addr);
125 spin_unlock_bh(&ar->data_lock);
130 for (i = 0; i < ARRAY_SIZE(arvif->wep_keys); i++) {
131 if (arvif->wep_keys[i] == NULL)
134 ret = ath10k_install_key(arvif, arvif->wep_keys[i], SET_KEY,
139 spin_lock_bh(&ar->data_lock);
140 peer->keys[i] = arvif->wep_keys[i];
141 spin_unlock_bh(&ar->data_lock);
147 static int ath10k_clear_peer_keys(struct ath10k_vif *arvif,
150 struct ath10k *ar = arvif->ar;
151 struct ath10k_peer *peer;
156 lockdep_assert_held(&ar->conf_mutex);
158 spin_lock_bh(&ar->data_lock);
159 peer = ath10k_peer_find(ar, arvif->vdev_id, addr);
160 spin_unlock_bh(&ar->data_lock);
165 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
166 if (peer->keys[i] == NULL)
169 ret = ath10k_install_key(arvif, peer->keys[i],
171 if (ret && first_errno == 0)
175 ath10k_warn(ar, "failed to remove peer wep key %d: %d\n",
178 spin_lock_bh(&ar->data_lock);
179 peer->keys[i] = NULL;
180 spin_unlock_bh(&ar->data_lock);
186 bool ath10k_mac_is_peer_wep_key_set(struct ath10k *ar, const u8 *addr,
189 struct ath10k_peer *peer;
192 lockdep_assert_held(&ar->data_lock);
194 /* We don't know which vdev this peer belongs to,
195 * since WMI doesn't give us that information.
197 * FIXME: multi-bss needs to be handled.
199 peer = ath10k_peer_find(ar, 0, addr);
203 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
204 if (peer->keys[i] && peer->keys[i]->keyidx == keyidx)
211 static int ath10k_clear_vdev_key(struct ath10k_vif *arvif,
212 struct ieee80211_key_conf *key)
214 struct ath10k *ar = arvif->ar;
215 struct ath10k_peer *peer;
221 lockdep_assert_held(&ar->conf_mutex);
224 /* since ath10k_install_key we can't hold data_lock all the
225 * time, so we try to remove the keys incrementally */
226 spin_lock_bh(&ar->data_lock);
228 list_for_each_entry(peer, &ar->peers, list) {
229 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
230 if (peer->keys[i] == key) {
231 ether_addr_copy(addr, peer->addr);
232 peer->keys[i] = NULL;
237 if (i < ARRAY_SIZE(peer->keys))
240 spin_unlock_bh(&ar->data_lock);
242 if (i == ARRAY_SIZE(peer->keys))
245 ret = ath10k_install_key(arvif, key, DISABLE_KEY, addr);
246 if (ret && first_errno == 0)
250 ath10k_warn(ar, "failed to remove key for %pM: %d\n",
257 /*********************/
258 /* General utilities */
259 /*********************/
261 static inline enum wmi_phy_mode
262 chan_to_phymode(const struct cfg80211_chan_def *chandef)
264 enum wmi_phy_mode phymode = MODE_UNKNOWN;
266 switch (chandef->chan->band) {
267 case IEEE80211_BAND_2GHZ:
268 switch (chandef->width) {
269 case NL80211_CHAN_WIDTH_20_NOHT:
272 case NL80211_CHAN_WIDTH_20:
273 phymode = MODE_11NG_HT20;
275 case NL80211_CHAN_WIDTH_40:
276 phymode = MODE_11NG_HT40;
278 case NL80211_CHAN_WIDTH_5:
279 case NL80211_CHAN_WIDTH_10:
280 case NL80211_CHAN_WIDTH_80:
281 case NL80211_CHAN_WIDTH_80P80:
282 case NL80211_CHAN_WIDTH_160:
283 phymode = MODE_UNKNOWN;
287 case IEEE80211_BAND_5GHZ:
288 switch (chandef->width) {
289 case NL80211_CHAN_WIDTH_20_NOHT:
292 case NL80211_CHAN_WIDTH_20:
293 phymode = MODE_11NA_HT20;
295 case NL80211_CHAN_WIDTH_40:
296 phymode = MODE_11NA_HT40;
298 case NL80211_CHAN_WIDTH_80:
299 phymode = MODE_11AC_VHT80;
301 case NL80211_CHAN_WIDTH_5:
302 case NL80211_CHAN_WIDTH_10:
303 case NL80211_CHAN_WIDTH_80P80:
304 case NL80211_CHAN_WIDTH_160:
305 phymode = MODE_UNKNOWN;
313 WARN_ON(phymode == MODE_UNKNOWN);
317 static u8 ath10k_parse_mpdudensity(u8 mpdudensity)
320 * 802.11n D2.0 defined values for "Minimum MPDU Start Spacing":
321 * 0 for no restriction
330 switch (mpdudensity) {
336 /* Our lower layer calculations limit our precision to
352 static int ath10k_peer_create(struct ath10k *ar, u32 vdev_id, const u8 *addr)
356 lockdep_assert_held(&ar->conf_mutex);
358 ret = ath10k_wmi_peer_create(ar, vdev_id, addr);
360 ath10k_warn(ar, "failed to create wmi peer %pM on vdev %i: %i\n",
365 ret = ath10k_wait_for_peer_created(ar, vdev_id, addr);
367 ath10k_warn(ar, "failed to wait for created wmi peer %pM on vdev %i: %i\n",
371 spin_lock_bh(&ar->data_lock);
373 spin_unlock_bh(&ar->data_lock);
378 static int ath10k_mac_set_kickout(struct ath10k_vif *arvif)
380 struct ath10k *ar = arvif->ar;
384 param = ar->wmi.pdev_param->sta_kickout_th;
385 ret = ath10k_wmi_pdev_set_param(ar, param,
386 ATH10K_KICKOUT_THRESHOLD);
388 ath10k_warn(ar, "failed to set kickout threshold on vdev %i: %d\n",
389 arvif->vdev_id, ret);
393 param = ar->wmi.vdev_param->ap_keepalive_min_idle_inactive_time_secs;
394 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
395 ATH10K_KEEPALIVE_MIN_IDLE);
397 ath10k_warn(ar, "failed to set keepalive minimum idle time on vdev %i: %d\n",
398 arvif->vdev_id, ret);
402 param = ar->wmi.vdev_param->ap_keepalive_max_idle_inactive_time_secs;
403 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
404 ATH10K_KEEPALIVE_MAX_IDLE);
406 ath10k_warn(ar, "failed to set keepalive maximum idle time on vdev %i: %d\n",
407 arvif->vdev_id, ret);
411 param = ar->wmi.vdev_param->ap_keepalive_max_unresponsive_time_secs;
412 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
413 ATH10K_KEEPALIVE_MAX_UNRESPONSIVE);
415 ath10k_warn(ar, "failed to set keepalive maximum unresponsive time on vdev %i: %d\n",
416 arvif->vdev_id, ret);
423 static int ath10k_mac_set_rts(struct ath10k_vif *arvif, u32 value)
425 struct ath10k *ar = arvif->ar;
428 if (value != 0xFFFFFFFF)
429 value = min_t(u32, arvif->ar->hw->wiphy->rts_threshold,
432 vdev_param = ar->wmi.vdev_param->rts_threshold;
433 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, value);
436 static int ath10k_mac_set_frag(struct ath10k_vif *arvif, u32 value)
438 struct ath10k *ar = arvif->ar;
441 if (value != 0xFFFFFFFF)
442 value = clamp_t(u32, arvif->ar->hw->wiphy->frag_threshold,
443 ATH10K_FRAGMT_THRESHOLD_MIN,
444 ATH10K_FRAGMT_THRESHOLD_MAX);
446 vdev_param = ar->wmi.vdev_param->fragmentation_threshold;
447 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, value);
450 static int ath10k_peer_delete(struct ath10k *ar, u32 vdev_id, const u8 *addr)
454 lockdep_assert_held(&ar->conf_mutex);
456 ret = ath10k_wmi_peer_delete(ar, vdev_id, addr);
460 ret = ath10k_wait_for_peer_deleted(ar, vdev_id, addr);
464 spin_lock_bh(&ar->data_lock);
466 spin_unlock_bh(&ar->data_lock);
471 static void ath10k_peer_cleanup(struct ath10k *ar, u32 vdev_id)
473 struct ath10k_peer *peer, *tmp;
475 lockdep_assert_held(&ar->conf_mutex);
477 spin_lock_bh(&ar->data_lock);
478 list_for_each_entry_safe(peer, tmp, &ar->peers, list) {
479 if (peer->vdev_id != vdev_id)
482 ath10k_warn(ar, "removing stale peer %pM from vdev_id %d\n",
483 peer->addr, vdev_id);
485 list_del(&peer->list);
489 spin_unlock_bh(&ar->data_lock);
492 static void ath10k_peer_cleanup_all(struct ath10k *ar)
494 struct ath10k_peer *peer, *tmp;
496 lockdep_assert_held(&ar->conf_mutex);
498 spin_lock_bh(&ar->data_lock);
499 list_for_each_entry_safe(peer, tmp, &ar->peers, list) {
500 list_del(&peer->list);
504 spin_unlock_bh(&ar->data_lock);
507 /************************/
508 /* Interface management */
509 /************************/
511 void ath10k_mac_vif_beacon_free(struct ath10k_vif *arvif)
513 struct ath10k *ar = arvif->ar;
515 lockdep_assert_held(&ar->data_lock);
520 if (!arvif->beacon_buf)
521 dma_unmap_single(ar->dev, ATH10K_SKB_CB(arvif->beacon)->paddr,
522 arvif->beacon->len, DMA_TO_DEVICE);
524 dev_kfree_skb_any(arvif->beacon);
526 arvif->beacon = NULL;
527 arvif->beacon_sent = false;
530 static void ath10k_mac_vif_beacon_cleanup(struct ath10k_vif *arvif)
532 struct ath10k *ar = arvif->ar;
534 lockdep_assert_held(&ar->data_lock);
536 ath10k_mac_vif_beacon_free(arvif);
538 if (arvif->beacon_buf) {
539 dma_free_coherent(ar->dev, IEEE80211_MAX_FRAME_LEN,
540 arvif->beacon_buf, arvif->beacon_paddr);
541 arvif->beacon_buf = NULL;
545 static inline int ath10k_vdev_setup_sync(struct ath10k *ar)
549 lockdep_assert_held(&ar->conf_mutex);
551 if (test_bit(ATH10K_FLAG_CRASH_FLUSH, &ar->dev_flags))
554 ret = wait_for_completion_timeout(&ar->vdev_setup_done,
555 ATH10K_VDEV_SETUP_TIMEOUT_HZ);
562 static int ath10k_monitor_vdev_start(struct ath10k *ar, int vdev_id)
564 struct cfg80211_chan_def *chandef = &ar->chandef;
565 struct ieee80211_channel *channel = chandef->chan;
566 struct wmi_vdev_start_request_arg arg = {};
569 lockdep_assert_held(&ar->conf_mutex);
571 arg.vdev_id = vdev_id;
572 arg.channel.freq = channel->center_freq;
573 arg.channel.band_center_freq1 = chandef->center_freq1;
575 /* TODO setup this dynamically, what in case we
576 don't have any vifs? */
577 arg.channel.mode = chan_to_phymode(chandef);
578 arg.channel.chan_radar =
579 !!(channel->flags & IEEE80211_CHAN_RADAR);
581 arg.channel.min_power = 0;
582 arg.channel.max_power = channel->max_power * 2;
583 arg.channel.max_reg_power = channel->max_reg_power * 2;
584 arg.channel.max_antenna_gain = channel->max_antenna_gain * 2;
586 reinit_completion(&ar->vdev_setup_done);
588 ret = ath10k_wmi_vdev_start(ar, &arg);
590 ath10k_warn(ar, "failed to request monitor vdev %i start: %d\n",
595 ret = ath10k_vdev_setup_sync(ar);
597 ath10k_warn(ar, "failed to synchronize setup for monitor vdev %i: %d\n",
602 ret = ath10k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr);
604 ath10k_warn(ar, "failed to put up monitor vdev %i: %d\n",
609 ar->monitor_vdev_id = vdev_id;
611 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %i started\n",
612 ar->monitor_vdev_id);
616 ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
618 ath10k_warn(ar, "failed to stop monitor vdev %i after start failure: %d\n",
619 ar->monitor_vdev_id, ret);
624 static int ath10k_monitor_vdev_stop(struct ath10k *ar)
628 lockdep_assert_held(&ar->conf_mutex);
630 ret = ath10k_wmi_vdev_down(ar, ar->monitor_vdev_id);
632 ath10k_warn(ar, "failed to put down monitor vdev %i: %d\n",
633 ar->monitor_vdev_id, ret);
635 reinit_completion(&ar->vdev_setup_done);
637 ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
639 ath10k_warn(ar, "failed to to request monitor vdev %i stop: %d\n",
640 ar->monitor_vdev_id, ret);
642 ret = ath10k_vdev_setup_sync(ar);
644 ath10k_warn(ar, "failed to synchronise monitor vdev %i: %d\n",
645 ar->monitor_vdev_id, ret);
647 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %i stopped\n",
648 ar->monitor_vdev_id);
652 static int ath10k_monitor_vdev_create(struct ath10k *ar)
656 lockdep_assert_held(&ar->conf_mutex);
658 if (ar->free_vdev_map == 0) {
659 ath10k_warn(ar, "failed to find free vdev id for monitor vdev\n");
663 bit = __ffs64(ar->free_vdev_map);
665 ar->monitor_vdev_id = bit;
667 ret = ath10k_wmi_vdev_create(ar, ar->monitor_vdev_id,
668 WMI_VDEV_TYPE_MONITOR,
671 ath10k_warn(ar, "failed to request monitor vdev %i creation: %d\n",
672 ar->monitor_vdev_id, ret);
676 ar->free_vdev_map &= ~(1LL << ar->monitor_vdev_id);
677 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %d created\n",
678 ar->monitor_vdev_id);
683 static int ath10k_monitor_vdev_delete(struct ath10k *ar)
687 lockdep_assert_held(&ar->conf_mutex);
689 ret = ath10k_wmi_vdev_delete(ar, ar->monitor_vdev_id);
691 ath10k_warn(ar, "failed to request wmi monitor vdev %i removal: %d\n",
692 ar->monitor_vdev_id, ret);
696 ar->free_vdev_map |= 1LL << ar->monitor_vdev_id;
698 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %d deleted\n",
699 ar->monitor_vdev_id);
703 static int ath10k_monitor_start(struct ath10k *ar)
707 lockdep_assert_held(&ar->conf_mutex);
709 ret = ath10k_monitor_vdev_create(ar);
711 ath10k_warn(ar, "failed to create monitor vdev: %d\n", ret);
715 ret = ath10k_monitor_vdev_start(ar, ar->monitor_vdev_id);
717 ath10k_warn(ar, "failed to start monitor vdev: %d\n", ret);
718 ath10k_monitor_vdev_delete(ar);
722 ar->monitor_started = true;
723 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor started\n");
728 static int ath10k_monitor_stop(struct ath10k *ar)
732 lockdep_assert_held(&ar->conf_mutex);
734 ret = ath10k_monitor_vdev_stop(ar);
736 ath10k_warn(ar, "failed to stop monitor vdev: %d\n", ret);
740 ret = ath10k_monitor_vdev_delete(ar);
742 ath10k_warn(ar, "failed to delete monitor vdev: %d\n", ret);
746 ar->monitor_started = false;
747 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor stopped\n");
752 static int ath10k_monitor_recalc(struct ath10k *ar)
756 lockdep_assert_held(&ar->conf_mutex);
758 should_start = ar->monitor ||
759 ar->filter_flags & FIF_PROMISC_IN_BSS ||
760 test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
762 ath10k_dbg(ar, ATH10K_DBG_MAC,
763 "mac monitor recalc started? %d should? %d\n",
764 ar->monitor_started, should_start);
766 if (should_start == ar->monitor_started)
770 return ath10k_monitor_start(ar);
772 return ath10k_monitor_stop(ar);
775 static int ath10k_recalc_rtscts_prot(struct ath10k_vif *arvif)
777 struct ath10k *ar = arvif->ar;
778 u32 vdev_param, rts_cts = 0;
780 lockdep_assert_held(&ar->conf_mutex);
782 vdev_param = ar->wmi.vdev_param->enable_rtscts;
784 if (arvif->use_cts_prot || arvif->num_legacy_stations > 0)
785 rts_cts |= SM(WMI_RTSCTS_ENABLED, WMI_RTSCTS_SET);
787 if (arvif->num_legacy_stations > 0)
788 rts_cts |= SM(WMI_RTSCTS_ACROSS_SW_RETRIES,
791 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
795 static int ath10k_start_cac(struct ath10k *ar)
799 lockdep_assert_held(&ar->conf_mutex);
801 set_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
803 ret = ath10k_monitor_recalc(ar);
805 ath10k_warn(ar, "failed to start monitor (cac): %d\n", ret);
806 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
810 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac cac start monitor vdev %d\n",
811 ar->monitor_vdev_id);
816 static int ath10k_stop_cac(struct ath10k *ar)
818 lockdep_assert_held(&ar->conf_mutex);
820 /* CAC is not running - do nothing */
821 if (!test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags))
824 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
825 ath10k_monitor_stop(ar);
827 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac cac finished\n");
832 static void ath10k_recalc_radar_detection(struct ath10k *ar)
836 lockdep_assert_held(&ar->conf_mutex);
840 if (!ar->radar_enabled)
843 if (ar->num_started_vdevs > 0)
846 ret = ath10k_start_cac(ar);
849 * Not possible to start CAC on current channel so starting
850 * radiation is not allowed, make this channel DFS_UNAVAILABLE
851 * by indicating that radar was detected.
853 ath10k_warn(ar, "failed to start CAC: %d\n", ret);
854 ieee80211_radar_detected(ar->hw);
858 static int ath10k_vdev_start_restart(struct ath10k_vif *arvif, bool restart)
860 struct ath10k *ar = arvif->ar;
861 struct cfg80211_chan_def *chandef = &ar->chandef;
862 struct wmi_vdev_start_request_arg arg = {};
865 lockdep_assert_held(&ar->conf_mutex);
867 reinit_completion(&ar->vdev_setup_done);
869 arg.vdev_id = arvif->vdev_id;
870 arg.dtim_period = arvif->dtim_period;
871 arg.bcn_intval = arvif->beacon_interval;
873 arg.channel.freq = chandef->chan->center_freq;
874 arg.channel.band_center_freq1 = chandef->center_freq1;
875 arg.channel.mode = chan_to_phymode(chandef);
877 arg.channel.min_power = 0;
878 arg.channel.max_power = chandef->chan->max_power * 2;
879 arg.channel.max_reg_power = chandef->chan->max_reg_power * 2;
880 arg.channel.max_antenna_gain = chandef->chan->max_antenna_gain * 2;
882 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
883 arg.ssid = arvif->u.ap.ssid;
884 arg.ssid_len = arvif->u.ap.ssid_len;
885 arg.hidden_ssid = arvif->u.ap.hidden_ssid;
887 /* For now allow DFS for AP mode */
888 arg.channel.chan_radar =
889 !!(chandef->chan->flags & IEEE80211_CHAN_RADAR);
890 } else if (arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
891 arg.ssid = arvif->vif->bss_conf.ssid;
892 arg.ssid_len = arvif->vif->bss_conf.ssid_len;
895 ath10k_dbg(ar, ATH10K_DBG_MAC,
896 "mac vdev %d start center_freq %d phymode %s\n",
897 arg.vdev_id, arg.channel.freq,
898 ath10k_wmi_phymode_str(arg.channel.mode));
901 ret = ath10k_wmi_vdev_restart(ar, &arg);
903 ret = ath10k_wmi_vdev_start(ar, &arg);
906 ath10k_warn(ar, "failed to start WMI vdev %i: %d\n",
911 ret = ath10k_vdev_setup_sync(ar);
913 ath10k_warn(ar, "failed to synchronise setup for vdev %i: %d\n",
918 ar->num_started_vdevs++;
919 ath10k_recalc_radar_detection(ar);
924 static int ath10k_vdev_start(struct ath10k_vif *arvif)
926 return ath10k_vdev_start_restart(arvif, false);
929 static int ath10k_vdev_restart(struct ath10k_vif *arvif)
931 return ath10k_vdev_start_restart(arvif, true);
934 static int ath10k_vdev_stop(struct ath10k_vif *arvif)
936 struct ath10k *ar = arvif->ar;
939 lockdep_assert_held(&ar->conf_mutex);
941 reinit_completion(&ar->vdev_setup_done);
943 ret = ath10k_wmi_vdev_stop(ar, arvif->vdev_id);
945 ath10k_warn(ar, "failed to stop WMI vdev %i: %d\n",
946 arvif->vdev_id, ret);
950 ret = ath10k_vdev_setup_sync(ar);
952 ath10k_warn(ar, "failed to syncronise setup for vdev %i: %d\n",
953 arvif->vdev_id, ret);
957 WARN_ON(ar->num_started_vdevs == 0);
959 if (ar->num_started_vdevs != 0) {
960 ar->num_started_vdevs--;
961 ath10k_recalc_radar_detection(ar);
967 static void ath10k_control_beaconing(struct ath10k_vif *arvif,
968 struct ieee80211_bss_conf *info)
970 struct ath10k *ar = arvif->ar;
973 lockdep_assert_held(&arvif->ar->conf_mutex);
975 if (!info->enable_beacon) {
976 ath10k_vdev_stop(arvif);
978 arvif->is_started = false;
979 arvif->is_up = false;
981 spin_lock_bh(&arvif->ar->data_lock);
982 ath10k_mac_vif_beacon_free(arvif);
983 spin_unlock_bh(&arvif->ar->data_lock);
988 arvif->tx_seq_no = 0x1000;
990 ret = ath10k_vdev_start(arvif);
995 ether_addr_copy(arvif->bssid, info->bssid);
997 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
1000 ath10k_warn(ar, "failed to bring up vdev %d: %i\n",
1001 arvif->vdev_id, ret);
1002 ath10k_vdev_stop(arvif);
1006 arvif->is_started = true;
1007 arvif->is_up = true;
1009 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d up\n", arvif->vdev_id);
1012 static void ath10k_control_ibss(struct ath10k_vif *arvif,
1013 struct ieee80211_bss_conf *info,
1014 const u8 self_peer[ETH_ALEN])
1016 struct ath10k *ar = arvif->ar;
1020 lockdep_assert_held(&arvif->ar->conf_mutex);
1022 if (!info->ibss_joined) {
1023 ret = ath10k_peer_delete(arvif->ar, arvif->vdev_id, self_peer);
1025 ath10k_warn(ar, "failed to delete IBSS self peer %pM for vdev %d: %d\n",
1026 self_peer, arvif->vdev_id, ret);
1028 if (is_zero_ether_addr(arvif->bssid))
1031 memset(arvif->bssid, 0, ETH_ALEN);
1036 ret = ath10k_peer_create(arvif->ar, arvif->vdev_id, self_peer);
1038 ath10k_warn(ar, "failed to create IBSS self peer %pM for vdev %d: %d\n",
1039 self_peer, arvif->vdev_id, ret);
1043 vdev_param = arvif->ar->wmi.vdev_param->atim_window;
1044 ret = ath10k_wmi_vdev_set_param(arvif->ar, arvif->vdev_id, vdev_param,
1045 ATH10K_DEFAULT_ATIM);
1047 ath10k_warn(ar, "failed to set IBSS ATIM for vdev %d: %d\n",
1048 arvif->vdev_id, ret);
1052 * Review this when mac80211 gains per-interface powersave support.
1054 static int ath10k_mac_vif_setup_ps(struct ath10k_vif *arvif)
1056 struct ath10k *ar = arvif->ar;
1057 struct ieee80211_conf *conf = &ar->hw->conf;
1058 enum wmi_sta_powersave_param param;
1059 enum wmi_sta_ps_mode psmode;
1062 lockdep_assert_held(&arvif->ar->conf_mutex);
1064 if (arvif->vif->type != NL80211_IFTYPE_STATION)
1067 if (conf->flags & IEEE80211_CONF_PS) {
1068 psmode = WMI_STA_PS_MODE_ENABLED;
1069 param = WMI_STA_PS_PARAM_INACTIVITY_TIME;
1071 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param,
1072 conf->dynamic_ps_timeout);
1074 ath10k_warn(ar, "failed to set inactivity time for vdev %d: %i\n",
1075 arvif->vdev_id, ret);
1079 psmode = WMI_STA_PS_MODE_DISABLED;
1082 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d psmode %s\n",
1083 arvif->vdev_id, psmode ? "enable" : "disable");
1085 ret = ath10k_wmi_set_psmode(ar, arvif->vdev_id, psmode);
1087 ath10k_warn(ar, "failed to set PS Mode %d for vdev %d: %d\n",
1088 psmode, arvif->vdev_id, ret);
1095 /**********************/
1096 /* Station management */
1097 /**********************/
1099 static u32 ath10k_peer_assoc_h_listen_intval(struct ath10k *ar,
1100 struct ieee80211_vif *vif)
1102 /* Some firmware revisions have unstable STA powersave when listen
1103 * interval is set too high (e.g. 5). The symptoms are firmware doesn't
1104 * generate NullFunc frames properly even if buffered frames have been
1105 * indicated in Beacon TIM. Firmware would seldom wake up to pull
1106 * buffered frames. Often pinging the device from AP would simply fail.
1108 * As a workaround set it to 1.
1110 if (vif->type == NL80211_IFTYPE_STATION)
1113 return ar->hw->conf.listen_interval;
1116 static void ath10k_peer_assoc_h_basic(struct ath10k *ar,
1117 struct ieee80211_vif *vif,
1118 struct ieee80211_sta *sta,
1119 struct wmi_peer_assoc_complete_arg *arg)
1121 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1123 lockdep_assert_held(&ar->conf_mutex);
1125 ether_addr_copy(arg->addr, sta->addr);
1126 arg->vdev_id = arvif->vdev_id;
1127 arg->peer_aid = sta->aid;
1128 arg->peer_flags |= WMI_PEER_AUTH;
1129 arg->peer_listen_intval = ath10k_peer_assoc_h_listen_intval(ar, vif);
1130 arg->peer_num_spatial_streams = 1;
1131 arg->peer_caps = vif->bss_conf.assoc_capability;
1134 static void ath10k_peer_assoc_h_crypto(struct ath10k *ar,
1135 struct ieee80211_vif *vif,
1136 struct wmi_peer_assoc_complete_arg *arg)
1138 struct ieee80211_bss_conf *info = &vif->bss_conf;
1139 struct cfg80211_bss *bss;
1140 const u8 *rsnie = NULL;
1141 const u8 *wpaie = NULL;
1143 lockdep_assert_held(&ar->conf_mutex);
1145 bss = cfg80211_get_bss(ar->hw->wiphy, ar->hw->conf.chandef.chan,
1146 info->bssid, NULL, 0, 0, 0);
1148 const struct cfg80211_bss_ies *ies;
1151 rsnie = ieee80211_bss_get_ie(bss, WLAN_EID_RSN);
1153 ies = rcu_dereference(bss->ies);
1155 wpaie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
1156 WLAN_OUI_TYPE_MICROSOFT_WPA,
1160 cfg80211_put_bss(ar->hw->wiphy, bss);
1163 /* FIXME: base on RSN IE/WPA IE is a correct idea? */
1164 if (rsnie || wpaie) {
1165 ath10k_dbg(ar, ATH10K_DBG_WMI, "%s: rsn ie found\n", __func__);
1166 arg->peer_flags |= WMI_PEER_NEED_PTK_4_WAY;
1170 ath10k_dbg(ar, ATH10K_DBG_WMI, "%s: wpa ie found\n", __func__);
1171 arg->peer_flags |= WMI_PEER_NEED_GTK_2_WAY;
1175 static void ath10k_peer_assoc_h_rates(struct ath10k *ar,
1176 struct ieee80211_sta *sta,
1177 struct wmi_peer_assoc_complete_arg *arg)
1179 struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates;
1180 const struct ieee80211_supported_band *sband;
1181 const struct ieee80211_rate *rates;
1185 lockdep_assert_held(&ar->conf_mutex);
1187 sband = ar->hw->wiphy->bands[ar->hw->conf.chandef.chan->band];
1188 ratemask = sta->supp_rates[ar->hw->conf.chandef.chan->band];
1189 rates = sband->bitrates;
1191 rateset->num_rates = 0;
1193 for (i = 0; i < 32; i++, ratemask >>= 1, rates++) {
1194 if (!(ratemask & 1))
1197 rateset->rates[rateset->num_rates] = rates->hw_value;
1198 rateset->num_rates++;
1202 static void ath10k_peer_assoc_h_ht(struct ath10k *ar,
1203 struct ieee80211_sta *sta,
1204 struct wmi_peer_assoc_complete_arg *arg)
1206 const struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
1210 lockdep_assert_held(&ar->conf_mutex);
1212 if (!ht_cap->ht_supported)
1215 arg->peer_flags |= WMI_PEER_HT;
1216 arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
1217 ht_cap->ampdu_factor)) - 1;
1219 arg->peer_mpdu_density =
1220 ath10k_parse_mpdudensity(ht_cap->ampdu_density);
1222 arg->peer_ht_caps = ht_cap->cap;
1223 arg->peer_rate_caps |= WMI_RC_HT_FLAG;
1225 if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING)
1226 arg->peer_flags |= WMI_PEER_LDPC;
1228 if (sta->bandwidth >= IEEE80211_STA_RX_BW_40) {
1229 arg->peer_flags |= WMI_PEER_40MHZ;
1230 arg->peer_rate_caps |= WMI_RC_CW40_FLAG;
1233 if (ht_cap->cap & IEEE80211_HT_CAP_SGI_20)
1234 arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
1236 if (ht_cap->cap & IEEE80211_HT_CAP_SGI_40)
1237 arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
1239 if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) {
1240 arg->peer_rate_caps |= WMI_RC_TX_STBC_FLAG;
1241 arg->peer_flags |= WMI_PEER_STBC;
1244 if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) {
1245 stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC;
1246 stbc = stbc >> IEEE80211_HT_CAP_RX_STBC_SHIFT;
1247 stbc = stbc << WMI_RC_RX_STBC_FLAG_S;
1248 arg->peer_rate_caps |= stbc;
1249 arg->peer_flags |= WMI_PEER_STBC;
1252 if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2])
1253 arg->peer_rate_caps |= WMI_RC_TS_FLAG;
1254 else if (ht_cap->mcs.rx_mask[1])
1255 arg->peer_rate_caps |= WMI_RC_DS_FLAG;
1257 for (i = 0, n = 0; i < IEEE80211_HT_MCS_MASK_LEN*8; i++)
1258 if (ht_cap->mcs.rx_mask[i/8] & (1 << i%8))
1259 arg->peer_ht_rates.rates[n++] = i;
1262 * This is a workaround for HT-enabled STAs which break the spec
1263 * and have no HT capabilities RX mask (no HT RX MCS map).
1265 * As per spec, in section 20.3.5 Modulation and coding scheme (MCS),
1266 * MCS 0 through 7 are mandatory in 20MHz with 800 ns GI at all STAs.
1268 * Firmware asserts if such situation occurs.
1271 arg->peer_ht_rates.num_rates = 8;
1272 for (i = 0; i < arg->peer_ht_rates.num_rates; i++)
1273 arg->peer_ht_rates.rates[i] = i;
1275 arg->peer_ht_rates.num_rates = n;
1276 arg->peer_num_spatial_streams = sta->rx_nss;
1279 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n",
1281 arg->peer_ht_rates.num_rates,
1282 arg->peer_num_spatial_streams);
1285 static int ath10k_peer_assoc_qos_ap(struct ath10k *ar,
1286 struct ath10k_vif *arvif,
1287 struct ieee80211_sta *sta)
1293 lockdep_assert_held(&ar->conf_mutex);
1295 if (sta->wme && sta->uapsd_queues) {
1296 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac uapsd_queues 0x%x max_sp %d\n",
1297 sta->uapsd_queues, sta->max_sp);
1299 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO)
1300 uapsd |= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN |
1301 WMI_AP_PS_UAPSD_AC3_TRIGGER_EN;
1302 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI)
1303 uapsd |= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN |
1304 WMI_AP_PS_UAPSD_AC2_TRIGGER_EN;
1305 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK)
1306 uapsd |= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN |
1307 WMI_AP_PS_UAPSD_AC1_TRIGGER_EN;
1308 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE)
1309 uapsd |= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN |
1310 WMI_AP_PS_UAPSD_AC0_TRIGGER_EN;
1312 if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP)
1313 max_sp = sta->max_sp;
1315 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
1317 WMI_AP_PS_PEER_PARAM_UAPSD,
1320 ath10k_warn(ar, "failed to set ap ps peer param uapsd for vdev %i: %d\n",
1321 arvif->vdev_id, ret);
1325 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
1327 WMI_AP_PS_PEER_PARAM_MAX_SP,
1330 ath10k_warn(ar, "failed to set ap ps peer param max sp for vdev %i: %d\n",
1331 arvif->vdev_id, ret);
1335 /* TODO setup this based on STA listen interval and
1336 beacon interval. Currently we don't know
1337 sta->listen_interval - mac80211 patch required.
1338 Currently use 10 seconds */
1339 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id, sta->addr,
1340 WMI_AP_PS_PEER_PARAM_AGEOUT_TIME,
1343 ath10k_warn(ar, "failed to set ap ps peer param ageout time for vdev %i: %d\n",
1344 arvif->vdev_id, ret);
1352 static void ath10k_peer_assoc_h_vht(struct ath10k *ar,
1353 struct ieee80211_sta *sta,
1354 struct wmi_peer_assoc_complete_arg *arg)
1356 const struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
1359 if (!vht_cap->vht_supported)
1362 arg->peer_flags |= WMI_PEER_VHT;
1363 arg->peer_vht_caps = vht_cap->cap;
1365 ampdu_factor = (vht_cap->cap &
1366 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >>
1367 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
1369 /* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to
1370 * zero in VHT IE. Using it would result in degraded throughput.
1371 * arg->peer_max_mpdu at this point contains HT max_mpdu so keep
1372 * it if VHT max_mpdu is smaller. */
1373 arg->peer_max_mpdu = max(arg->peer_max_mpdu,
1374 (1U << (IEEE80211_HT_MAX_AMPDU_FACTOR +
1375 ampdu_factor)) - 1);
1377 if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
1378 arg->peer_flags |= WMI_PEER_80MHZ;
1380 arg->peer_vht_rates.rx_max_rate =
1381 __le16_to_cpu(vht_cap->vht_mcs.rx_highest);
1382 arg->peer_vht_rates.rx_mcs_set =
1383 __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map);
1384 arg->peer_vht_rates.tx_max_rate =
1385 __le16_to_cpu(vht_cap->vht_mcs.tx_highest);
1386 arg->peer_vht_rates.tx_mcs_set =
1387 __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map);
1389 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vht peer %pM max_mpdu %d flags 0x%x\n",
1390 sta->addr, arg->peer_max_mpdu, arg->peer_flags);
1393 static void ath10k_peer_assoc_h_qos(struct ath10k *ar,
1394 struct ieee80211_vif *vif,
1395 struct ieee80211_sta *sta,
1396 struct wmi_peer_assoc_complete_arg *arg)
1398 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1400 switch (arvif->vdev_type) {
1401 case WMI_VDEV_TYPE_AP:
1403 arg->peer_flags |= WMI_PEER_QOS;
1405 if (sta->wme && sta->uapsd_queues) {
1406 arg->peer_flags |= WMI_PEER_APSD;
1407 arg->peer_rate_caps |= WMI_RC_UAPSD_FLAG;
1410 case WMI_VDEV_TYPE_STA:
1411 if (vif->bss_conf.qos)
1412 arg->peer_flags |= WMI_PEER_QOS;
1419 static void ath10k_peer_assoc_h_phymode(struct ath10k *ar,
1420 struct ieee80211_vif *vif,
1421 struct ieee80211_sta *sta,
1422 struct wmi_peer_assoc_complete_arg *arg)
1424 enum wmi_phy_mode phymode = MODE_UNKNOWN;
1426 switch (ar->hw->conf.chandef.chan->band) {
1427 case IEEE80211_BAND_2GHZ:
1428 if (sta->ht_cap.ht_supported) {
1429 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1430 phymode = MODE_11NG_HT40;
1432 phymode = MODE_11NG_HT20;
1438 case IEEE80211_BAND_5GHZ:
1442 if (sta->vht_cap.vht_supported) {
1443 if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
1444 phymode = MODE_11AC_VHT80;
1445 else if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1446 phymode = MODE_11AC_VHT40;
1447 else if (sta->bandwidth == IEEE80211_STA_RX_BW_20)
1448 phymode = MODE_11AC_VHT20;
1449 } else if (sta->ht_cap.ht_supported) {
1450 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1451 phymode = MODE_11NA_HT40;
1453 phymode = MODE_11NA_HT20;
1463 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac peer %pM phymode %s\n",
1464 sta->addr, ath10k_wmi_phymode_str(phymode));
1466 arg->peer_phymode = phymode;
1467 WARN_ON(phymode == MODE_UNKNOWN);
1470 static int ath10k_peer_assoc_prepare(struct ath10k *ar,
1471 struct ieee80211_vif *vif,
1472 struct ieee80211_sta *sta,
1473 struct wmi_peer_assoc_complete_arg *arg)
1475 lockdep_assert_held(&ar->conf_mutex);
1477 memset(arg, 0, sizeof(*arg));
1479 ath10k_peer_assoc_h_basic(ar, vif, sta, arg);
1480 ath10k_peer_assoc_h_crypto(ar, vif, arg);
1481 ath10k_peer_assoc_h_rates(ar, sta, arg);
1482 ath10k_peer_assoc_h_ht(ar, sta, arg);
1483 ath10k_peer_assoc_h_vht(ar, sta, arg);
1484 ath10k_peer_assoc_h_qos(ar, vif, sta, arg);
1485 ath10k_peer_assoc_h_phymode(ar, vif, sta, arg);
1490 static const u32 ath10k_smps_map[] = {
1491 [WLAN_HT_CAP_SM_PS_STATIC] = WMI_PEER_SMPS_STATIC,
1492 [WLAN_HT_CAP_SM_PS_DYNAMIC] = WMI_PEER_SMPS_DYNAMIC,
1493 [WLAN_HT_CAP_SM_PS_INVALID] = WMI_PEER_SMPS_PS_NONE,
1494 [WLAN_HT_CAP_SM_PS_DISABLED] = WMI_PEER_SMPS_PS_NONE,
1497 static int ath10k_setup_peer_smps(struct ath10k *ar, struct ath10k_vif *arvif,
1499 const struct ieee80211_sta_ht_cap *ht_cap)
1503 if (!ht_cap->ht_supported)
1506 smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
1507 smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
1509 if (smps >= ARRAY_SIZE(ath10k_smps_map))
1512 return ath10k_wmi_peer_set_param(ar, arvif->vdev_id, addr,
1513 WMI_PEER_SMPS_STATE,
1514 ath10k_smps_map[smps]);
1517 /* can be called only in mac80211 callbacks due to `key_count` usage */
1518 static void ath10k_bss_assoc(struct ieee80211_hw *hw,
1519 struct ieee80211_vif *vif,
1520 struct ieee80211_bss_conf *bss_conf)
1522 struct ath10k *ar = hw->priv;
1523 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1524 struct ieee80211_sta_ht_cap ht_cap;
1525 struct wmi_peer_assoc_complete_arg peer_arg;
1526 struct ieee80211_sta *ap_sta;
1529 lockdep_assert_held(&ar->conf_mutex);
1531 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i assoc bssid %pM aid %d\n",
1532 arvif->vdev_id, arvif->bssid, arvif->aid);
1536 ap_sta = ieee80211_find_sta(vif, bss_conf->bssid);
1538 ath10k_warn(ar, "failed to find station entry for bss %pM vdev %i\n",
1539 bss_conf->bssid, arvif->vdev_id);
1544 /* ap_sta must be accessed only within rcu section which must be left
1545 * before calling ath10k_setup_peer_smps() which might sleep. */
1546 ht_cap = ap_sta->ht_cap;
1548 ret = ath10k_peer_assoc_prepare(ar, vif, ap_sta, &peer_arg);
1550 ath10k_warn(ar, "failed to prepare peer assoc for %pM vdev %i: %d\n",
1551 bss_conf->bssid, arvif->vdev_id, ret);
1558 ret = ath10k_wmi_peer_assoc(ar, &peer_arg);
1560 ath10k_warn(ar, "failed to run peer assoc for %pM vdev %i: %d\n",
1561 bss_conf->bssid, arvif->vdev_id, ret);
1565 ret = ath10k_setup_peer_smps(ar, arvif, bss_conf->bssid, &ht_cap);
1567 ath10k_warn(ar, "failed to setup peer SMPS for vdev %i: %d\n",
1568 arvif->vdev_id, ret);
1572 ath10k_dbg(ar, ATH10K_DBG_MAC,
1573 "mac vdev %d up (associated) bssid %pM aid %d\n",
1574 arvif->vdev_id, bss_conf->bssid, bss_conf->aid);
1576 WARN_ON(arvif->is_up);
1578 arvif->aid = bss_conf->aid;
1579 ether_addr_copy(arvif->bssid, bss_conf->bssid);
1581 ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid);
1583 ath10k_warn(ar, "failed to set vdev %d up: %d\n",
1584 arvif->vdev_id, ret);
1588 arvif->is_up = true;
1591 static void ath10k_bss_disassoc(struct ieee80211_hw *hw,
1592 struct ieee80211_vif *vif)
1594 struct ath10k *ar = hw->priv;
1595 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1598 lockdep_assert_held(&ar->conf_mutex);
1600 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i disassoc bssid %pM\n",
1601 arvif->vdev_id, arvif->bssid);
1603 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
1605 ath10k_warn(ar, "faield to down vdev %i: %d\n",
1606 arvif->vdev_id, ret);
1608 arvif->def_wep_key_idx = 0;
1609 arvif->is_up = false;
1612 static int ath10k_station_assoc(struct ath10k *ar,
1613 struct ieee80211_vif *vif,
1614 struct ieee80211_sta *sta,
1617 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1618 struct wmi_peer_assoc_complete_arg peer_arg;
1621 lockdep_assert_held(&ar->conf_mutex);
1623 ret = ath10k_peer_assoc_prepare(ar, vif, sta, &peer_arg);
1625 ath10k_warn(ar, "failed to prepare WMI peer assoc for %pM vdev %i: %i\n",
1626 sta->addr, arvif->vdev_id, ret);
1630 peer_arg.peer_reassoc = reassoc;
1631 ret = ath10k_wmi_peer_assoc(ar, &peer_arg);
1633 ath10k_warn(ar, "failed to run peer assoc for STA %pM vdev %i: %d\n",
1634 sta->addr, arvif->vdev_id, ret);
1638 /* Re-assoc is run only to update supported rates for given station. It
1639 * doesn't make much sense to reconfigure the peer completely.
1642 ret = ath10k_setup_peer_smps(ar, arvif, sta->addr,
1645 ath10k_warn(ar, "failed to setup peer SMPS for vdev %d: %d\n",
1646 arvif->vdev_id, ret);
1650 ret = ath10k_peer_assoc_qos_ap(ar, arvif, sta);
1652 ath10k_warn(ar, "failed to set qos params for STA %pM for vdev %i: %d\n",
1653 sta->addr, arvif->vdev_id, ret);
1658 arvif->num_legacy_stations++;
1659 ret = ath10k_recalc_rtscts_prot(arvif);
1661 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
1662 arvif->vdev_id, ret);
1667 ret = ath10k_install_peer_wep_keys(arvif, sta->addr);
1669 ath10k_warn(ar, "failed to install peer wep keys for vdev %i: %d\n",
1670 arvif->vdev_id, ret);
1678 static int ath10k_station_disassoc(struct ath10k *ar,
1679 struct ieee80211_vif *vif,
1680 struct ieee80211_sta *sta)
1682 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1685 lockdep_assert_held(&ar->conf_mutex);
1688 arvif->num_legacy_stations--;
1689 ret = ath10k_recalc_rtscts_prot(arvif);
1691 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
1692 arvif->vdev_id, ret);
1697 ret = ath10k_clear_peer_keys(arvif, sta->addr);
1699 ath10k_warn(ar, "failed to clear all peer wep keys for vdev %i: %d\n",
1700 arvif->vdev_id, ret);
1711 static int ath10k_update_channel_list(struct ath10k *ar)
1713 struct ieee80211_hw *hw = ar->hw;
1714 struct ieee80211_supported_band **bands;
1715 enum ieee80211_band band;
1716 struct ieee80211_channel *channel;
1717 struct wmi_scan_chan_list_arg arg = {0};
1718 struct wmi_channel_arg *ch;
1724 lockdep_assert_held(&ar->conf_mutex);
1726 bands = hw->wiphy->bands;
1727 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
1731 for (i = 0; i < bands[band]->n_channels; i++) {
1732 if (bands[band]->channels[i].flags &
1733 IEEE80211_CHAN_DISABLED)
1740 len = sizeof(struct wmi_channel_arg) * arg.n_channels;
1741 arg.channels = kzalloc(len, GFP_KERNEL);
1746 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
1750 for (i = 0; i < bands[band]->n_channels; i++) {
1751 channel = &bands[band]->channels[i];
1753 if (channel->flags & IEEE80211_CHAN_DISABLED)
1756 ch->allow_ht = true;
1758 /* FIXME: when should we really allow VHT? */
1759 ch->allow_vht = true;
1762 !(channel->flags & IEEE80211_CHAN_NO_IR);
1765 !(channel->flags & IEEE80211_CHAN_NO_HT40PLUS);
1768 !!(channel->flags & IEEE80211_CHAN_RADAR);
1770 passive = channel->flags & IEEE80211_CHAN_NO_IR;
1771 ch->passive = passive;
1773 ch->freq = channel->center_freq;
1774 ch->band_center_freq1 = channel->center_freq;
1776 ch->max_power = channel->max_power * 2;
1777 ch->max_reg_power = channel->max_reg_power * 2;
1778 ch->max_antenna_gain = channel->max_antenna_gain * 2;
1779 ch->reg_class_id = 0; /* FIXME */
1781 /* FIXME: why use only legacy modes, why not any
1782 * HT/VHT modes? Would that even make any
1784 if (channel->band == IEEE80211_BAND_2GHZ)
1785 ch->mode = MODE_11G;
1787 ch->mode = MODE_11A;
1789 if (WARN_ON_ONCE(ch->mode == MODE_UNKNOWN))
1792 ath10k_dbg(ar, ATH10K_DBG_WMI,
1793 "mac channel [%zd/%d] freq %d maxpower %d regpower %d antenna %d mode %d\n",
1794 ch - arg.channels, arg.n_channels,
1795 ch->freq, ch->max_power, ch->max_reg_power,
1796 ch->max_antenna_gain, ch->mode);
1802 ret = ath10k_wmi_scan_chan_list(ar, &arg);
1803 kfree(arg.channels);
1808 static enum wmi_dfs_region
1809 ath10k_mac_get_dfs_region(enum nl80211_dfs_regions dfs_region)
1811 switch (dfs_region) {
1812 case NL80211_DFS_UNSET:
1813 return WMI_UNINIT_DFS_DOMAIN;
1814 case NL80211_DFS_FCC:
1815 return WMI_FCC_DFS_DOMAIN;
1816 case NL80211_DFS_ETSI:
1817 return WMI_ETSI_DFS_DOMAIN;
1818 case NL80211_DFS_JP:
1819 return WMI_MKK4_DFS_DOMAIN;
1821 return WMI_UNINIT_DFS_DOMAIN;
1824 static void ath10k_regd_update(struct ath10k *ar)
1826 struct reg_dmn_pair_mapping *regpair;
1828 enum wmi_dfs_region wmi_dfs_reg;
1829 enum nl80211_dfs_regions nl_dfs_reg;
1831 lockdep_assert_held(&ar->conf_mutex);
1833 ret = ath10k_update_channel_list(ar);
1835 ath10k_warn(ar, "failed to update channel list: %d\n", ret);
1837 regpair = ar->ath_common.regulatory.regpair;
1839 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) {
1840 nl_dfs_reg = ar->dfs_detector->region;
1841 wmi_dfs_reg = ath10k_mac_get_dfs_region(nl_dfs_reg);
1843 wmi_dfs_reg = WMI_UNINIT_DFS_DOMAIN;
1846 /* Target allows setting up per-band regdomain but ath_common provides
1847 * a combined one only */
1848 ret = ath10k_wmi_pdev_set_regdomain(ar,
1849 regpair->reg_domain,
1850 regpair->reg_domain, /* 2ghz */
1851 regpair->reg_domain, /* 5ghz */
1852 regpair->reg_2ghz_ctl,
1853 regpair->reg_5ghz_ctl,
1856 ath10k_warn(ar, "failed to set pdev regdomain: %d\n", ret);
1859 static void ath10k_reg_notifier(struct wiphy *wiphy,
1860 struct regulatory_request *request)
1862 struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
1863 struct ath10k *ar = hw->priv;
1866 ath_reg_notifier_apply(wiphy, request, &ar->ath_common.regulatory);
1868 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) {
1869 ath10k_dbg(ar, ATH10K_DBG_REGULATORY, "dfs region 0x%x\n",
1870 request->dfs_region);
1871 result = ar->dfs_detector->set_dfs_domain(ar->dfs_detector,
1872 request->dfs_region);
1874 ath10k_warn(ar, "DFS region 0x%X not supported, will trigger radar for every pulse\n",
1875 request->dfs_region);
1878 mutex_lock(&ar->conf_mutex);
1879 if (ar->state == ATH10K_STATE_ON)
1880 ath10k_regd_update(ar);
1881 mutex_unlock(&ar->conf_mutex);
1888 static u8 ath10k_tx_h_get_tid(struct ieee80211_hdr *hdr)
1890 if (ieee80211_is_mgmt(hdr->frame_control))
1891 return HTT_DATA_TX_EXT_TID_MGMT;
1893 if (!ieee80211_is_data_qos(hdr->frame_control))
1894 return HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
1896 if (!is_unicast_ether_addr(ieee80211_get_DA(hdr)))
1897 return HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
1899 return ieee80211_get_qos_ctl(hdr)[0] & IEEE80211_QOS_CTL_TID_MASK;
1902 static u8 ath10k_tx_h_get_vdev_id(struct ath10k *ar, struct ieee80211_vif *vif)
1905 return ath10k_vif_to_arvif(vif)->vdev_id;
1907 if (ar->monitor_started)
1908 return ar->monitor_vdev_id;
1910 ath10k_warn(ar, "failed to resolve vdev id\n");
1914 /* HTT Tx uses Native Wifi tx mode which expects 802.11 frames without QoS
1915 * Control in the header.
1917 static void ath10k_tx_h_nwifi(struct ieee80211_hw *hw, struct sk_buff *skb)
1919 struct ieee80211_hdr *hdr = (void *)skb->data;
1920 struct ath10k_skb_cb *cb = ATH10K_SKB_CB(skb);
1923 if (!ieee80211_is_data_qos(hdr->frame_control))
1926 qos_ctl = ieee80211_get_qos_ctl(hdr);
1927 memmove(skb->data + IEEE80211_QOS_CTL_LEN,
1928 skb->data, (void *)qos_ctl - (void *)skb->data);
1929 skb_pull(skb, IEEE80211_QOS_CTL_LEN);
1931 /* Fw/Hw generates a corrupted QoS Control Field for QoS NullFunc
1932 * frames. Powersave is handled by the fw/hw so QoS NyllFunc frames are
1933 * used only for CQM purposes (e.g. hostapd station keepalive ping) so
1934 * it is safe to downgrade to NullFunc.
1936 if (ieee80211_is_qos_nullfunc(hdr->frame_control)) {
1937 hdr->frame_control &= ~__cpu_to_le16(IEEE80211_STYPE_QOS_DATA);
1938 cb->htt.tid = HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
1942 static void ath10k_tx_wep_key_work(struct work_struct *work)
1944 struct ath10k_vif *arvif = container_of(work, struct ath10k_vif,
1946 struct ath10k *ar = arvif->ar;
1947 int ret, keyidx = arvif->def_wep_key_newidx;
1949 mutex_lock(&arvif->ar->conf_mutex);
1951 if (arvif->ar->state != ATH10K_STATE_ON)
1954 if (arvif->def_wep_key_idx == keyidx)
1957 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d set keyidx %d\n",
1958 arvif->vdev_id, keyidx);
1960 ret = ath10k_wmi_vdev_set_param(arvif->ar,
1962 arvif->ar->wmi.vdev_param->def_keyid,
1965 ath10k_warn(ar, "failed to update wep key index for vdev %d: %d\n",
1971 arvif->def_wep_key_idx = keyidx;
1974 mutex_unlock(&arvif->ar->conf_mutex);
1977 static void ath10k_tx_h_update_wep_key(struct ieee80211_vif *vif,
1978 struct ieee80211_key_conf *key,
1979 struct sk_buff *skb)
1981 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1982 struct ath10k *ar = arvif->ar;
1983 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
1985 if (!ieee80211_has_protected(hdr->frame_control))
1991 if (key->cipher != WLAN_CIPHER_SUITE_WEP40 &&
1992 key->cipher != WLAN_CIPHER_SUITE_WEP104)
1995 if (key->keyidx == arvif->def_wep_key_idx)
1998 /* FIXME: Most likely a few frames will be TXed with an old key. Simply
1999 * queueing frames until key index is updated is not an option because
2000 * sk_buff may need more processing to be done, e.g. offchannel */
2001 arvif->def_wep_key_newidx = key->keyidx;
2002 ieee80211_queue_work(ar->hw, &arvif->wep_key_work);
2005 static void ath10k_tx_h_add_p2p_noa_ie(struct ath10k *ar,
2006 struct ieee80211_vif *vif,
2007 struct sk_buff *skb)
2009 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
2010 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2012 /* This is case only for P2P_GO */
2013 if (arvif->vdev_type != WMI_VDEV_TYPE_AP ||
2014 arvif->vdev_subtype != WMI_VDEV_SUBTYPE_P2P_GO)
2017 if (unlikely(ieee80211_is_probe_resp(hdr->frame_control))) {
2018 spin_lock_bh(&ar->data_lock);
2019 if (arvif->u.ap.noa_data)
2020 if (!pskb_expand_head(skb, 0, arvif->u.ap.noa_len,
2022 memcpy(skb_put(skb, arvif->u.ap.noa_len),
2023 arvif->u.ap.noa_data,
2024 arvif->u.ap.noa_len);
2025 spin_unlock_bh(&ar->data_lock);
2029 static bool ath10k_mac_need_offchan_tx_work(struct ath10k *ar)
2031 /* FIXME: Not really sure since when the behaviour changed. At some
2032 * point new firmware stopped requiring creation of peer entries for
2033 * offchannel tx (and actually creating them causes issues with wmi-htc
2034 * tx credit replenishment and reliability). Assuming it's at least 3.4
2035 * because that's when the `freq` was introduced to TX_FRM HTT command.
2037 return !(ar->htt.target_version_major >= 3 &&
2038 ar->htt.target_version_minor >= 4);
2041 static void ath10k_tx_htt(struct ath10k *ar, struct sk_buff *skb)
2043 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
2046 if (ar->htt.target_version_major >= 3) {
2047 /* Since HTT 3.0 there is no separate mgmt tx command */
2048 ret = ath10k_htt_tx(&ar->htt, skb);
2052 if (ieee80211_is_mgmt(hdr->frame_control)) {
2053 if (test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX,
2055 if (skb_queue_len(&ar->wmi_mgmt_tx_queue) >=
2056 ATH10K_MAX_NUM_MGMT_PENDING) {
2057 ath10k_warn(ar, "reached WMI management transmit queue limit\n");
2062 skb_queue_tail(&ar->wmi_mgmt_tx_queue, skb);
2063 ieee80211_queue_work(ar->hw, &ar->wmi_mgmt_tx_work);
2065 ret = ath10k_htt_mgmt_tx(&ar->htt, skb);
2067 } else if (!test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX,
2069 ieee80211_is_nullfunc(hdr->frame_control)) {
2070 /* FW does not report tx status properly for NullFunc frames
2071 * unless they are sent through mgmt tx path. mac80211 sends
2072 * those frames when it detects link/beacon loss and depends
2073 * on the tx status to be correct. */
2074 ret = ath10k_htt_mgmt_tx(&ar->htt, skb);
2076 ret = ath10k_htt_tx(&ar->htt, skb);
2081 ath10k_warn(ar, "failed to transmit packet, dropping: %d\n",
2083 ieee80211_free_txskb(ar->hw, skb);
2087 void ath10k_offchan_tx_purge(struct ath10k *ar)
2089 struct sk_buff *skb;
2092 skb = skb_dequeue(&ar->offchan_tx_queue);
2096 ieee80211_free_txskb(ar->hw, skb);
2100 void ath10k_offchan_tx_work(struct work_struct *work)
2102 struct ath10k *ar = container_of(work, struct ath10k, offchan_tx_work);
2103 struct ath10k_peer *peer;
2104 struct ieee80211_hdr *hdr;
2105 struct sk_buff *skb;
2106 const u8 *peer_addr;
2110 /* FW requirement: We must create a peer before FW will send out
2111 * an offchannel frame. Otherwise the frame will be stuck and
2112 * never transmitted. We delete the peer upon tx completion.
2113 * It is unlikely that a peer for offchannel tx will already be
2114 * present. However it may be in some rare cases so account for that.
2115 * Otherwise we might remove a legitimate peer and break stuff. */
2118 skb = skb_dequeue(&ar->offchan_tx_queue);
2122 mutex_lock(&ar->conf_mutex);
2124 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac offchannel skb %p\n",
2127 hdr = (struct ieee80211_hdr *)skb->data;
2128 peer_addr = ieee80211_get_DA(hdr);
2129 vdev_id = ATH10K_SKB_CB(skb)->vdev_id;
2131 spin_lock_bh(&ar->data_lock);
2132 peer = ath10k_peer_find(ar, vdev_id, peer_addr);
2133 spin_unlock_bh(&ar->data_lock);
2136 /* FIXME: should this use ath10k_warn()? */
2137 ath10k_dbg(ar, ATH10K_DBG_MAC, "peer %pM on vdev %d already present\n",
2138 peer_addr, vdev_id);
2141 ret = ath10k_peer_create(ar, vdev_id, peer_addr);
2143 ath10k_warn(ar, "failed to create peer %pM on vdev %d: %d\n",
2144 peer_addr, vdev_id, ret);
2147 spin_lock_bh(&ar->data_lock);
2148 reinit_completion(&ar->offchan_tx_completed);
2149 ar->offchan_tx_skb = skb;
2150 spin_unlock_bh(&ar->data_lock);
2152 ath10k_tx_htt(ar, skb);
2154 ret = wait_for_completion_timeout(&ar->offchan_tx_completed,
2157 ath10k_warn(ar, "timed out waiting for offchannel skb %p\n",
2161 ret = ath10k_peer_delete(ar, vdev_id, peer_addr);
2163 ath10k_warn(ar, "failed to delete peer %pM on vdev %d: %d\n",
2164 peer_addr, vdev_id, ret);
2167 mutex_unlock(&ar->conf_mutex);
2171 void ath10k_mgmt_over_wmi_tx_purge(struct ath10k *ar)
2173 struct sk_buff *skb;
2176 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
2180 ieee80211_free_txskb(ar->hw, skb);
2184 void ath10k_mgmt_over_wmi_tx_work(struct work_struct *work)
2186 struct ath10k *ar = container_of(work, struct ath10k, wmi_mgmt_tx_work);
2187 struct sk_buff *skb;
2191 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
2195 ret = ath10k_wmi_mgmt_tx(ar, skb);
2197 ath10k_warn(ar, "failed to transmit management frame via WMI: %d\n",
2199 ieee80211_free_txskb(ar->hw, skb);
2208 void __ath10k_scan_finish(struct ath10k *ar)
2210 lockdep_assert_held(&ar->data_lock);
2212 switch (ar->scan.state) {
2213 case ATH10K_SCAN_IDLE:
2215 case ATH10K_SCAN_RUNNING:
2216 if (ar->scan.is_roc)
2217 ieee80211_remain_on_channel_expired(ar->hw);
2218 case ATH10K_SCAN_ABORTING:
2219 if (!ar->scan.is_roc)
2220 ieee80211_scan_completed(ar->hw,
2222 ATH10K_SCAN_ABORTING));
2224 case ATH10K_SCAN_STARTING:
2225 ar->scan.state = ATH10K_SCAN_IDLE;
2226 ar->scan_channel = NULL;
2227 ath10k_offchan_tx_purge(ar);
2228 cancel_delayed_work(&ar->scan.timeout);
2229 complete_all(&ar->scan.completed);
2234 void ath10k_scan_finish(struct ath10k *ar)
2236 spin_lock_bh(&ar->data_lock);
2237 __ath10k_scan_finish(ar);
2238 spin_unlock_bh(&ar->data_lock);
2241 static int ath10k_scan_stop(struct ath10k *ar)
2243 struct wmi_stop_scan_arg arg = {
2244 .req_id = 1, /* FIXME */
2245 .req_type = WMI_SCAN_STOP_ONE,
2246 .u.scan_id = ATH10K_SCAN_ID,
2250 lockdep_assert_held(&ar->conf_mutex);
2252 ret = ath10k_wmi_stop_scan(ar, &arg);
2254 ath10k_warn(ar, "failed to stop wmi scan: %d\n", ret);
2258 ret = wait_for_completion_timeout(&ar->scan.completed, 3*HZ);
2260 ath10k_warn(ar, "failed to receive scan abortion completion: timed out\n");
2262 } else if (ret > 0) {
2267 /* Scan state should be updated upon scan completion but in case
2268 * firmware fails to deliver the event (for whatever reason) it is
2269 * desired to clean up scan state anyway. Firmware may have just
2270 * dropped the scan completion event delivery due to transport pipe
2271 * being overflown with data and/or it can recover on its own before
2272 * next scan request is submitted.
2274 spin_lock_bh(&ar->data_lock);
2275 if (ar->scan.state != ATH10K_SCAN_IDLE)
2276 __ath10k_scan_finish(ar);
2277 spin_unlock_bh(&ar->data_lock);
2282 static void ath10k_scan_abort(struct ath10k *ar)
2286 lockdep_assert_held(&ar->conf_mutex);
2288 spin_lock_bh(&ar->data_lock);
2290 switch (ar->scan.state) {
2291 case ATH10K_SCAN_IDLE:
2292 /* This can happen if timeout worker kicked in and called
2293 * abortion while scan completion was being processed.
2296 case ATH10K_SCAN_STARTING:
2297 case ATH10K_SCAN_ABORTING:
2298 ath10k_warn(ar, "refusing scan abortion due to invalid scan state: %s (%d)\n",
2299 ath10k_scan_state_str(ar->scan.state),
2302 case ATH10K_SCAN_RUNNING:
2303 ar->scan.state = ATH10K_SCAN_ABORTING;
2304 spin_unlock_bh(&ar->data_lock);
2306 ret = ath10k_scan_stop(ar);
2308 ath10k_warn(ar, "failed to abort scan: %d\n", ret);
2310 spin_lock_bh(&ar->data_lock);
2314 spin_unlock_bh(&ar->data_lock);
2317 void ath10k_scan_timeout_work(struct work_struct *work)
2319 struct ath10k *ar = container_of(work, struct ath10k,
2322 mutex_lock(&ar->conf_mutex);
2323 ath10k_scan_abort(ar);
2324 mutex_unlock(&ar->conf_mutex);
2327 static int ath10k_start_scan(struct ath10k *ar,
2328 const struct wmi_start_scan_arg *arg)
2332 lockdep_assert_held(&ar->conf_mutex);
2334 ret = ath10k_wmi_start_scan(ar, arg);
2338 ret = wait_for_completion_timeout(&ar->scan.started, 1*HZ);
2340 ret = ath10k_scan_stop(ar);
2342 ath10k_warn(ar, "failed to stop scan: %d\n", ret);
2347 /* Add a 200ms margin to account for event/command processing */
2348 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
2349 msecs_to_jiffies(arg->max_scan_time+200));
2353 /**********************/
2354 /* mac80211 callbacks */
2355 /**********************/
2357 static void ath10k_tx(struct ieee80211_hw *hw,
2358 struct ieee80211_tx_control *control,
2359 struct sk_buff *skb)
2361 struct ath10k *ar = hw->priv;
2362 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
2363 struct ieee80211_vif *vif = info->control.vif;
2364 struct ieee80211_key_conf *key = info->control.hw_key;
2365 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
2367 /* We should disable CCK RATE due to P2P */
2368 if (info->flags & IEEE80211_TX_CTL_NO_CCK_RATE)
2369 ath10k_dbg(ar, ATH10K_DBG_MAC, "IEEE80211_TX_CTL_NO_CCK_RATE\n");
2371 ATH10K_SKB_CB(skb)->htt.is_offchan = false;
2372 ATH10K_SKB_CB(skb)->htt.tid = ath10k_tx_h_get_tid(hdr);
2373 ATH10K_SKB_CB(skb)->vdev_id = ath10k_tx_h_get_vdev_id(ar, vif);
2375 /* it makes no sense to process injected frames like that */
2376 if (vif && vif->type != NL80211_IFTYPE_MONITOR) {
2377 ath10k_tx_h_nwifi(hw, skb);
2378 ath10k_tx_h_update_wep_key(vif, key, skb);
2379 ath10k_tx_h_add_p2p_noa_ie(ar, vif, skb);
2380 ath10k_tx_h_seq_no(vif, skb);
2383 if (info->flags & IEEE80211_TX_CTL_TX_OFFCHAN) {
2384 spin_lock_bh(&ar->data_lock);
2385 ATH10K_SKB_CB(skb)->htt.freq = ar->scan.roc_freq;
2386 ATH10K_SKB_CB(skb)->vdev_id = ar->scan.vdev_id;
2387 spin_unlock_bh(&ar->data_lock);
2389 if (ath10k_mac_need_offchan_tx_work(ar)) {
2390 ATH10K_SKB_CB(skb)->htt.freq = 0;
2391 ATH10K_SKB_CB(skb)->htt.is_offchan = true;
2393 ath10k_dbg(ar, ATH10K_DBG_MAC, "queued offchannel skb %p\n",
2396 skb_queue_tail(&ar->offchan_tx_queue, skb);
2397 ieee80211_queue_work(hw, &ar->offchan_tx_work);
2402 ath10k_tx_htt(ar, skb);
2405 /* Must not be called with conf_mutex held as workers can use that also. */
2406 void ath10k_drain_tx(struct ath10k *ar)
2408 /* make sure rcu-protected mac80211 tx path itself is drained */
2411 ath10k_offchan_tx_purge(ar);
2412 ath10k_mgmt_over_wmi_tx_purge(ar);
2414 cancel_work_sync(&ar->offchan_tx_work);
2415 cancel_work_sync(&ar->wmi_mgmt_tx_work);
2418 void ath10k_halt(struct ath10k *ar)
2420 struct ath10k_vif *arvif;
2422 lockdep_assert_held(&ar->conf_mutex);
2424 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
2425 ar->filter_flags = 0;
2426 ar->monitor = false;
2428 if (ar->monitor_started)
2429 ath10k_monitor_stop(ar);
2431 ar->monitor_started = false;
2433 ath10k_scan_finish(ar);
2434 ath10k_peer_cleanup_all(ar);
2435 ath10k_core_stop(ar);
2436 ath10k_hif_power_down(ar);
2438 spin_lock_bh(&ar->data_lock);
2439 list_for_each_entry(arvif, &ar->arvifs, list)
2440 ath10k_mac_vif_beacon_cleanup(arvif);
2441 spin_unlock_bh(&ar->data_lock);
2444 static int ath10k_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant)
2446 struct ath10k *ar = hw->priv;
2448 mutex_lock(&ar->conf_mutex);
2450 if (ar->cfg_tx_chainmask) {
2451 *tx_ant = ar->cfg_tx_chainmask;
2452 *rx_ant = ar->cfg_rx_chainmask;
2454 *tx_ant = ar->supp_tx_chainmask;
2455 *rx_ant = ar->supp_rx_chainmask;
2458 mutex_unlock(&ar->conf_mutex);
2463 static void ath10k_check_chain_mask(struct ath10k *ar, u32 cm, const char *dbg)
2465 /* It is not clear that allowing gaps in chainmask
2466 * is helpful. Probably it will not do what user
2467 * is hoping for, so warn in that case.
2469 if (cm == 15 || cm == 7 || cm == 3 || cm == 1 || cm == 0)
2472 ath10k_warn(ar, "mac %s antenna chainmask may be invalid: 0x%x. Suggested values: 15, 7, 3, 1 or 0.\n",
2476 static int __ath10k_set_antenna(struct ath10k *ar, u32 tx_ant, u32 rx_ant)
2480 lockdep_assert_held(&ar->conf_mutex);
2482 ath10k_check_chain_mask(ar, tx_ant, "tx");
2483 ath10k_check_chain_mask(ar, rx_ant, "rx");
2485 ar->cfg_tx_chainmask = tx_ant;
2486 ar->cfg_rx_chainmask = rx_ant;
2488 if ((ar->state != ATH10K_STATE_ON) &&
2489 (ar->state != ATH10K_STATE_RESTARTED))
2492 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->tx_chain_mask,
2495 ath10k_warn(ar, "failed to set tx-chainmask: %d, req 0x%x\n",
2500 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->rx_chain_mask,
2503 ath10k_warn(ar, "failed to set rx-chainmask: %d, req 0x%x\n",
2511 static int ath10k_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)
2513 struct ath10k *ar = hw->priv;
2516 mutex_lock(&ar->conf_mutex);
2517 ret = __ath10k_set_antenna(ar, tx_ant, rx_ant);
2518 mutex_unlock(&ar->conf_mutex);
2522 static int ath10k_start(struct ieee80211_hw *hw)
2524 struct ath10k *ar = hw->priv;
2528 * This makes sense only when restarting hw. It is harmless to call
2529 * uncoditionally. This is necessary to make sure no HTT/WMI tx
2530 * commands will be submitted while restarting.
2532 ath10k_drain_tx(ar);
2534 mutex_lock(&ar->conf_mutex);
2536 switch (ar->state) {
2537 case ATH10K_STATE_OFF:
2538 ar->state = ATH10K_STATE_ON;
2540 case ATH10K_STATE_RESTARTING:
2542 ar->state = ATH10K_STATE_RESTARTED;
2544 case ATH10K_STATE_ON:
2545 case ATH10K_STATE_RESTARTED:
2546 case ATH10K_STATE_WEDGED:
2550 case ATH10K_STATE_UTF:
2555 ret = ath10k_hif_power_up(ar);
2557 ath10k_err(ar, "Could not init hif: %d\n", ret);
2561 ret = ath10k_core_start(ar, ATH10K_FIRMWARE_MODE_NORMAL);
2563 ath10k_err(ar, "Could not init core: %d\n", ret);
2564 goto err_power_down;
2567 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->pmf_qos, 1);
2569 ath10k_warn(ar, "failed to enable PMF QOS: %d\n", ret);
2573 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->dynamic_bw, 1);
2575 ath10k_warn(ar, "failed to enable dynamic BW: %d\n", ret);
2579 if (ar->cfg_tx_chainmask)
2580 __ath10k_set_antenna(ar, ar->cfg_tx_chainmask,
2581 ar->cfg_rx_chainmask);
2584 * By default FW set ARP frames ac to voice (6). In that case ARP
2585 * exchange is not working properly for UAPSD enabled AP. ARP requests
2586 * which arrives with access category 0 are processed by network stack
2587 * and send back with access category 0, but FW changes access category
2588 * to 6. Set ARP frames access category to best effort (0) solves
2592 ret = ath10k_wmi_pdev_set_param(ar,
2593 ar->wmi.pdev_param->arp_ac_override, 0);
2595 ath10k_warn(ar, "failed to set arp ac override parameter: %d\n",
2600 ar->num_started_vdevs = 0;
2601 ath10k_regd_update(ar);
2603 ath10k_spectral_start(ar);
2605 mutex_unlock(&ar->conf_mutex);
2609 ath10k_core_stop(ar);
2612 ath10k_hif_power_down(ar);
2615 ar->state = ATH10K_STATE_OFF;
2618 mutex_unlock(&ar->conf_mutex);
2622 static void ath10k_stop(struct ieee80211_hw *hw)
2624 struct ath10k *ar = hw->priv;
2626 ath10k_drain_tx(ar);
2628 mutex_lock(&ar->conf_mutex);
2629 if (ar->state != ATH10K_STATE_OFF) {
2631 ar->state = ATH10K_STATE_OFF;
2633 mutex_unlock(&ar->conf_mutex);
2635 cancel_delayed_work_sync(&ar->scan.timeout);
2636 cancel_work_sync(&ar->restart_work);
2639 static int ath10k_config_ps(struct ath10k *ar)
2641 struct ath10k_vif *arvif;
2644 lockdep_assert_held(&ar->conf_mutex);
2646 list_for_each_entry(arvif, &ar->arvifs, list) {
2647 ret = ath10k_mac_vif_setup_ps(arvif);
2649 ath10k_warn(ar, "failed to setup powersave: %d\n", ret);
2657 static const char *chandef_get_width(enum nl80211_chan_width width)
2660 case NL80211_CHAN_WIDTH_20_NOHT:
2662 case NL80211_CHAN_WIDTH_20:
2664 case NL80211_CHAN_WIDTH_40:
2666 case NL80211_CHAN_WIDTH_80:
2668 case NL80211_CHAN_WIDTH_80P80:
2670 case NL80211_CHAN_WIDTH_160:
2672 case NL80211_CHAN_WIDTH_5:
2674 case NL80211_CHAN_WIDTH_10:
2680 static void ath10k_config_chan(struct ath10k *ar)
2682 struct ath10k_vif *arvif;
2685 lockdep_assert_held(&ar->conf_mutex);
2687 ath10k_dbg(ar, ATH10K_DBG_MAC,
2688 "mac config channel to %dMHz (cf1 %dMHz cf2 %dMHz width %s)\n",
2689 ar->chandef.chan->center_freq,
2690 ar->chandef.center_freq1,
2691 ar->chandef.center_freq2,
2692 chandef_get_width(ar->chandef.width));
2694 /* First stop monitor interface. Some FW versions crash if there's a
2695 * lone monitor interface. */
2696 if (ar->monitor_started)
2697 ath10k_monitor_stop(ar);
2699 list_for_each_entry(arvif, &ar->arvifs, list) {
2700 if (!arvif->is_started)
2706 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
2709 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
2711 ath10k_warn(ar, "failed to down vdev %d: %d\n",
2712 arvif->vdev_id, ret);
2717 /* all vdevs are downed now - attempt to restart and re-up them */
2719 list_for_each_entry(arvif, &ar->arvifs, list) {
2720 if (!arvif->is_started)
2723 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
2726 ret = ath10k_vdev_restart(arvif);
2728 ath10k_warn(ar, "failed to restart vdev %d: %d\n",
2729 arvif->vdev_id, ret);
2736 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
2739 ath10k_warn(ar, "failed to bring vdev up %d: %d\n",
2740 arvif->vdev_id, ret);
2745 ath10k_monitor_recalc(ar);
2748 static int ath10k_mac_txpower_setup(struct ath10k *ar, int txpower)
2753 lockdep_assert_held(&ar->conf_mutex);
2755 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac txpower %d\n", txpower);
2757 param = ar->wmi.pdev_param->txpower_limit2g;
2758 ret = ath10k_wmi_pdev_set_param(ar, param, txpower * 2);
2760 ath10k_warn(ar, "failed to set 2g txpower %d: %d\n",
2765 param = ar->wmi.pdev_param->txpower_limit5g;
2766 ret = ath10k_wmi_pdev_set_param(ar, param, txpower * 2);
2768 ath10k_warn(ar, "failed to set 5g txpower %d: %d\n",
2776 static int ath10k_mac_txpower_recalc(struct ath10k *ar)
2778 struct ath10k_vif *arvif;
2779 int ret, txpower = -1;
2781 lockdep_assert_held(&ar->conf_mutex);
2783 list_for_each_entry(arvif, &ar->arvifs, list) {
2784 WARN_ON(arvif->txpower < 0);
2787 txpower = arvif->txpower;
2789 txpower = min(txpower, arvif->txpower);
2792 if (WARN_ON(txpower == -1))
2795 ret = ath10k_mac_txpower_setup(ar, txpower);
2797 ath10k_warn(ar, "failed to setup tx power %d: %d\n",
2805 static int ath10k_config(struct ieee80211_hw *hw, u32 changed)
2807 struct ath10k *ar = hw->priv;
2808 struct ieee80211_conf *conf = &hw->conf;
2811 mutex_lock(&ar->conf_mutex);
2813 if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
2814 ath10k_dbg(ar, ATH10K_DBG_MAC,
2815 "mac config channel %dMHz flags 0x%x radar %d\n",
2816 conf->chandef.chan->center_freq,
2817 conf->chandef.chan->flags,
2818 conf->radar_enabled);
2820 spin_lock_bh(&ar->data_lock);
2821 ar->rx_channel = conf->chandef.chan;
2822 spin_unlock_bh(&ar->data_lock);
2824 ar->radar_enabled = conf->radar_enabled;
2825 ath10k_recalc_radar_detection(ar);
2827 if (!cfg80211_chandef_identical(&ar->chandef, &conf->chandef)) {
2828 ar->chandef = conf->chandef;
2829 ath10k_config_chan(ar);
2833 if (changed & IEEE80211_CONF_CHANGE_PS)
2834 ath10k_config_ps(ar);
2836 if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
2837 ar->monitor = conf->flags & IEEE80211_CONF_MONITOR;
2838 ret = ath10k_monitor_recalc(ar);
2840 ath10k_warn(ar, "failed to recalc monitor: %d\n", ret);
2843 mutex_unlock(&ar->conf_mutex);
2847 static u32 get_nss_from_chainmask(u16 chain_mask)
2849 if ((chain_mask & 0x15) == 0x15)
2851 else if ((chain_mask & 0x7) == 0x7)
2853 else if ((chain_mask & 0x3) == 0x3)
2860 * Figure out how to handle WMI_VDEV_SUBTYPE_P2P_DEVICE,
2861 * because we will send mgmt frames without CCK. This requirement
2862 * for P2P_FIND/GO_NEG should be handled by checking CCK flag
2865 static int ath10k_add_interface(struct ieee80211_hw *hw,
2866 struct ieee80211_vif *vif)
2868 struct ath10k *ar = hw->priv;
2869 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2870 enum wmi_sta_powersave_param param;
2876 mutex_lock(&ar->conf_mutex);
2878 memset(arvif, 0, sizeof(*arvif));
2883 INIT_WORK(&arvif->wep_key_work, ath10k_tx_wep_key_work);
2884 INIT_LIST_HEAD(&arvif->list);
2886 if (ar->free_vdev_map == 0) {
2887 ath10k_warn(ar, "Free vdev map is empty, no more interfaces allowed.\n");
2891 bit = __ffs64(ar->free_vdev_map);
2893 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac create vdev %i map %llx\n",
2894 bit, ar->free_vdev_map);
2896 arvif->vdev_id = bit;
2897 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE;
2900 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_DEVICE;
2902 switch (vif->type) {
2903 case NL80211_IFTYPE_UNSPECIFIED:
2904 case NL80211_IFTYPE_STATION:
2905 arvif->vdev_type = WMI_VDEV_TYPE_STA;
2907 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_CLIENT;
2909 case NL80211_IFTYPE_ADHOC:
2910 arvif->vdev_type = WMI_VDEV_TYPE_IBSS;
2912 case NL80211_IFTYPE_AP:
2913 arvif->vdev_type = WMI_VDEV_TYPE_AP;
2916 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_GO;
2918 case NL80211_IFTYPE_MONITOR:
2919 arvif->vdev_type = WMI_VDEV_TYPE_MONITOR;
2926 /* Some firmware revisions don't wait for beacon tx completion before
2927 * sending another SWBA event. This could lead to hardware using old
2928 * (freed) beacon data in some cases, e.g. tx credit starvation
2929 * combined with missed TBTT. This is very very rare.
2931 * On non-IOMMU-enabled hosts this could be a possible security issue
2932 * because hw could beacon some random data on the air. On
2933 * IOMMU-enabled hosts DMAR faults would occur in most cases and target
2934 * device would crash.
2936 * Since there are no beacon tx completions (implicit nor explicit)
2937 * propagated to host the only workaround for this is to allocate a
2938 * DMA-coherent buffer for a lifetime of a vif and use it for all
2939 * beacon tx commands. Worst case for this approach is some beacons may
2940 * become corrupted, e.g. have garbled IEs or out-of-date TIM bitmap.
2942 if (vif->type == NL80211_IFTYPE_ADHOC ||
2943 vif->type == NL80211_IFTYPE_AP) {
2944 arvif->beacon_buf = dma_zalloc_coherent(ar->dev,
2945 IEEE80211_MAX_FRAME_LEN,
2946 &arvif->beacon_paddr,
2948 if (!arvif->beacon_buf) {
2950 ath10k_warn(ar, "failed to allocate beacon buffer: %d\n",
2956 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev create %d (add interface) type %d subtype %d bcnmode %s\n",
2957 arvif->vdev_id, arvif->vdev_type, arvif->vdev_subtype,
2958 arvif->beacon_buf ? "single-buf" : "per-skb");
2960 ret = ath10k_wmi_vdev_create(ar, arvif->vdev_id, arvif->vdev_type,
2961 arvif->vdev_subtype, vif->addr);
2963 ath10k_warn(ar, "failed to create WMI vdev %i: %d\n",
2964 arvif->vdev_id, ret);
2968 ar->free_vdev_map &= ~(1LL << arvif->vdev_id);
2969 list_add(&arvif->list, &ar->arvifs);
2971 vdev_param = ar->wmi.vdev_param->def_keyid;
2972 ret = ath10k_wmi_vdev_set_param(ar, 0, vdev_param,
2973 arvif->def_wep_key_idx);
2975 ath10k_warn(ar, "failed to set vdev %i default key id: %d\n",
2976 arvif->vdev_id, ret);
2977 goto err_vdev_delete;
2980 vdev_param = ar->wmi.vdev_param->tx_encap_type;
2981 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
2982 ATH10K_HW_TXRX_NATIVE_WIFI);
2983 /* 10.X firmware does not support this VDEV parameter. Do not warn */
2984 if (ret && ret != -EOPNOTSUPP) {
2985 ath10k_warn(ar, "failed to set vdev %i TX encapsulation: %d\n",
2986 arvif->vdev_id, ret);
2987 goto err_vdev_delete;
2990 if (ar->cfg_tx_chainmask) {
2991 u16 nss = get_nss_from_chainmask(ar->cfg_tx_chainmask);
2993 vdev_param = ar->wmi.vdev_param->nss;
2994 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
2997 ath10k_warn(ar, "failed to set vdev %i chainmask 0x%x, nss %i: %d\n",
2998 arvif->vdev_id, ar->cfg_tx_chainmask, nss,
3000 goto err_vdev_delete;
3004 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
3005 ret = ath10k_peer_create(ar, arvif->vdev_id, vif->addr);
3007 ath10k_warn(ar, "failed to create vdev %i peer for AP: %d\n",
3008 arvif->vdev_id, ret);
3009 goto err_vdev_delete;
3012 ret = ath10k_mac_set_kickout(arvif);
3014 ath10k_warn(ar, "failed to set vdev %i kickout parameters: %d\n",
3015 arvif->vdev_id, ret);
3016 goto err_peer_delete;
3020 if (arvif->vdev_type == WMI_VDEV_TYPE_STA) {
3021 param = WMI_STA_PS_PARAM_RX_WAKE_POLICY;
3022 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
3023 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
3026 ath10k_warn(ar, "failed to set vdev %i RX wake policy: %d\n",
3027 arvif->vdev_id, ret);
3028 goto err_peer_delete;
3031 param = WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD;
3032 value = WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS;
3033 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
3036 ath10k_warn(ar, "failed to set vdev %i TX wake thresh: %d\n",
3037 arvif->vdev_id, ret);
3038 goto err_peer_delete;
3041 param = WMI_STA_PS_PARAM_PSPOLL_COUNT;
3042 value = WMI_STA_PS_PSPOLL_COUNT_NO_MAX;
3043 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
3046 ath10k_warn(ar, "failed to set vdev %i PSPOLL count: %d\n",
3047 arvif->vdev_id, ret);
3048 goto err_peer_delete;
3052 ret = ath10k_mac_set_rts(arvif, ar->hw->wiphy->rts_threshold);
3054 ath10k_warn(ar, "failed to set rts threshold for vdev %d: %d\n",
3055 arvif->vdev_id, ret);
3056 goto err_peer_delete;
3059 ret = ath10k_mac_set_frag(arvif, ar->hw->wiphy->frag_threshold);
3061 ath10k_warn(ar, "failed to set frag threshold for vdev %d: %d\n",
3062 arvif->vdev_id, ret);
3063 goto err_peer_delete;
3066 arvif->txpower = vif->bss_conf.txpower;
3067 ret = ath10k_mac_txpower_recalc(ar);
3069 ath10k_warn(ar, "failed to recalc tx power: %d\n", ret);
3070 goto err_peer_delete;
3073 mutex_unlock(&ar->conf_mutex);
3077 if (arvif->vdev_type == WMI_VDEV_TYPE_AP)
3078 ath10k_wmi_peer_delete(ar, arvif->vdev_id, vif->addr);
3081 ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
3082 ar->free_vdev_map |= 1LL << arvif->vdev_id;
3083 list_del(&arvif->list);
3086 if (arvif->beacon_buf) {
3087 dma_free_coherent(ar->dev, IEEE80211_MAX_FRAME_LEN,
3088 arvif->beacon_buf, arvif->beacon_paddr);
3089 arvif->beacon_buf = NULL;
3092 mutex_unlock(&ar->conf_mutex);
3097 static void ath10k_remove_interface(struct ieee80211_hw *hw,
3098 struct ieee80211_vif *vif)
3100 struct ath10k *ar = hw->priv;
3101 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3104 mutex_lock(&ar->conf_mutex);
3106 cancel_work_sync(&arvif->wep_key_work);
3108 spin_lock_bh(&ar->data_lock);
3109 ath10k_mac_vif_beacon_cleanup(arvif);
3110 spin_unlock_bh(&ar->data_lock);
3112 ret = ath10k_spectral_vif_stop(arvif);
3114 ath10k_warn(ar, "failed to stop spectral for vdev %i: %d\n",
3115 arvif->vdev_id, ret);
3117 ar->free_vdev_map |= 1LL << arvif->vdev_id;
3118 list_del(&arvif->list);
3120 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
3121 ret = ath10k_peer_delete(arvif->ar, arvif->vdev_id, vif->addr);
3123 ath10k_warn(ar, "failed to remove peer for AP vdev %i: %d\n",
3124 arvif->vdev_id, ret);
3126 kfree(arvif->u.ap.noa_data);
3129 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i delete (remove interface)\n",
3132 ret = ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
3134 ath10k_warn(ar, "failed to delete WMI vdev %i: %d\n",
3135 arvif->vdev_id, ret);
3137 ath10k_peer_cleanup(ar, arvif->vdev_id);
3139 mutex_unlock(&ar->conf_mutex);
3143 * FIXME: Has to be verified.
3145 #define SUPPORTED_FILTERS \
3146 (FIF_PROMISC_IN_BSS | \
3151 FIF_BCN_PRBRESP_PROMISC | \
3155 static void ath10k_configure_filter(struct ieee80211_hw *hw,
3156 unsigned int changed_flags,
3157 unsigned int *total_flags,
3160 struct ath10k *ar = hw->priv;
3163 mutex_lock(&ar->conf_mutex);
3165 changed_flags &= SUPPORTED_FILTERS;
3166 *total_flags &= SUPPORTED_FILTERS;
3167 ar->filter_flags = *total_flags;
3169 ret = ath10k_monitor_recalc(ar);
3171 ath10k_warn(ar, "failed to recalc montior: %d\n", ret);
3173 mutex_unlock(&ar->conf_mutex);
3176 static void ath10k_bss_info_changed(struct ieee80211_hw *hw,
3177 struct ieee80211_vif *vif,
3178 struct ieee80211_bss_conf *info,
3181 struct ath10k *ar = hw->priv;
3182 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3184 u32 vdev_param, pdev_param, slottime, preamble;
3186 mutex_lock(&ar->conf_mutex);
3188 if (changed & BSS_CHANGED_IBSS)
3189 ath10k_control_ibss(arvif, info, vif->addr);
3191 if (changed & BSS_CHANGED_BEACON_INT) {
3192 arvif->beacon_interval = info->beacon_int;
3193 vdev_param = ar->wmi.vdev_param->beacon_interval;
3194 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
3195 arvif->beacon_interval);
3196 ath10k_dbg(ar, ATH10K_DBG_MAC,
3197 "mac vdev %d beacon_interval %d\n",
3198 arvif->vdev_id, arvif->beacon_interval);
3201 ath10k_warn(ar, "failed to set beacon interval for vdev %d: %i\n",
3202 arvif->vdev_id, ret);
3205 if (changed & BSS_CHANGED_BEACON) {
3206 ath10k_dbg(ar, ATH10K_DBG_MAC,
3207 "vdev %d set beacon tx mode to staggered\n",
3210 pdev_param = ar->wmi.pdev_param->beacon_tx_mode;
3211 ret = ath10k_wmi_pdev_set_param(ar, pdev_param,
3212 WMI_BEACON_STAGGERED_MODE);
3214 ath10k_warn(ar, "failed to set beacon mode for vdev %d: %i\n",
3215 arvif->vdev_id, ret);
3218 if (changed & BSS_CHANGED_BEACON_INFO) {
3219 arvif->dtim_period = info->dtim_period;
3221 ath10k_dbg(ar, ATH10K_DBG_MAC,
3222 "mac vdev %d dtim_period %d\n",
3223 arvif->vdev_id, arvif->dtim_period);
3225 vdev_param = ar->wmi.vdev_param->dtim_period;
3226 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
3227 arvif->dtim_period);
3229 ath10k_warn(ar, "failed to set dtim period for vdev %d: %i\n",
3230 arvif->vdev_id, ret);
3233 if (changed & BSS_CHANGED_SSID &&
3234 vif->type == NL80211_IFTYPE_AP) {
3235 arvif->u.ap.ssid_len = info->ssid_len;
3237 memcpy(arvif->u.ap.ssid, info->ssid, info->ssid_len);
3238 arvif->u.ap.hidden_ssid = info->hidden_ssid;
3241 if (changed & BSS_CHANGED_BSSID && !is_zero_ether_addr(info->bssid))
3242 ether_addr_copy(arvif->bssid, info->bssid);
3244 if (changed & BSS_CHANGED_BEACON_ENABLED)
3245 ath10k_control_beaconing(arvif, info);
3247 if (changed & BSS_CHANGED_ERP_CTS_PROT) {
3248 arvif->use_cts_prot = info->use_cts_prot;
3249 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d cts_prot %d\n",
3250 arvif->vdev_id, info->use_cts_prot);
3252 ret = ath10k_recalc_rtscts_prot(arvif);
3254 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
3255 arvif->vdev_id, ret);
3258 if (changed & BSS_CHANGED_ERP_SLOT) {
3259 if (info->use_short_slot)
3260 slottime = WMI_VDEV_SLOT_TIME_SHORT; /* 9us */
3263 slottime = WMI_VDEV_SLOT_TIME_LONG; /* 20us */
3265 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d slot_time %d\n",
3266 arvif->vdev_id, slottime);
3268 vdev_param = ar->wmi.vdev_param->slot_time;
3269 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
3272 ath10k_warn(ar, "failed to set erp slot for vdev %d: %i\n",
3273 arvif->vdev_id, ret);
3276 if (changed & BSS_CHANGED_ERP_PREAMBLE) {
3277 if (info->use_short_preamble)
3278 preamble = WMI_VDEV_PREAMBLE_SHORT;
3280 preamble = WMI_VDEV_PREAMBLE_LONG;
3282 ath10k_dbg(ar, ATH10K_DBG_MAC,
3283 "mac vdev %d preamble %dn",
3284 arvif->vdev_id, preamble);
3286 vdev_param = ar->wmi.vdev_param->preamble;
3287 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
3290 ath10k_warn(ar, "failed to set preamble for vdev %d: %i\n",
3291 arvif->vdev_id, ret);
3294 if (changed & BSS_CHANGED_ASSOC) {
3296 /* Workaround: Make sure monitor vdev is not running
3297 * when associating to prevent some firmware revisions
3298 * (e.g. 10.1 and 10.2) from crashing.
3300 if (ar->monitor_started)
3301 ath10k_monitor_stop(ar);
3302 ath10k_bss_assoc(hw, vif, info);
3303 ath10k_monitor_recalc(ar);
3305 ath10k_bss_disassoc(hw, vif);
3309 if (changed & BSS_CHANGED_TXPOWER) {
3310 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev_id %i txpower %d\n",
3311 arvif->vdev_id, info->txpower);
3313 arvif->txpower = info->txpower;
3314 ret = ath10k_mac_txpower_recalc(ar);
3316 ath10k_warn(ar, "failed to recalc tx power: %d\n", ret);
3319 mutex_unlock(&ar->conf_mutex);
3322 static int ath10k_hw_scan(struct ieee80211_hw *hw,
3323 struct ieee80211_vif *vif,
3324 struct ieee80211_scan_request *hw_req)
3326 struct ath10k *ar = hw->priv;
3327 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3328 struct cfg80211_scan_request *req = &hw_req->req;
3329 struct wmi_start_scan_arg arg;
3333 mutex_lock(&ar->conf_mutex);
3335 spin_lock_bh(&ar->data_lock);
3336 switch (ar->scan.state) {
3337 case ATH10K_SCAN_IDLE:
3338 reinit_completion(&ar->scan.started);
3339 reinit_completion(&ar->scan.completed);
3340 ar->scan.state = ATH10K_SCAN_STARTING;
3341 ar->scan.is_roc = false;
3342 ar->scan.vdev_id = arvif->vdev_id;
3345 case ATH10K_SCAN_STARTING:
3346 case ATH10K_SCAN_RUNNING:
3347 case ATH10K_SCAN_ABORTING:
3351 spin_unlock_bh(&ar->data_lock);
3356 memset(&arg, 0, sizeof(arg));
3357 ath10k_wmi_start_scan_init(ar, &arg);
3358 arg.vdev_id = arvif->vdev_id;
3359 arg.scan_id = ATH10K_SCAN_ID;
3362 arg.scan_ctrl_flags |= WMI_SCAN_ADD_CCK_RATES;
3365 arg.ie_len = req->ie_len;
3366 memcpy(arg.ie, req->ie, arg.ie_len);
3370 arg.n_ssids = req->n_ssids;
3371 for (i = 0; i < arg.n_ssids; i++) {
3372 arg.ssids[i].len = req->ssids[i].ssid_len;
3373 arg.ssids[i].ssid = req->ssids[i].ssid;
3376 arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
3379 if (req->n_channels) {
3380 arg.n_channels = req->n_channels;
3381 for (i = 0; i < arg.n_channels; i++)
3382 arg.channels[i] = req->channels[i]->center_freq;
3385 ret = ath10k_start_scan(ar, &arg);
3387 ath10k_warn(ar, "failed to start hw scan: %d\n", ret);
3388 spin_lock_bh(&ar->data_lock);
3389 ar->scan.state = ATH10K_SCAN_IDLE;
3390 spin_unlock_bh(&ar->data_lock);
3394 mutex_unlock(&ar->conf_mutex);
3398 static void ath10k_cancel_hw_scan(struct ieee80211_hw *hw,
3399 struct ieee80211_vif *vif)
3401 struct ath10k *ar = hw->priv;
3403 mutex_lock(&ar->conf_mutex);
3404 ath10k_scan_abort(ar);
3405 mutex_unlock(&ar->conf_mutex);
3407 cancel_delayed_work_sync(&ar->scan.timeout);
3410 static void ath10k_set_key_h_def_keyidx(struct ath10k *ar,
3411 struct ath10k_vif *arvif,
3412 enum set_key_cmd cmd,
3413 struct ieee80211_key_conf *key)
3415 u32 vdev_param = arvif->ar->wmi.vdev_param->def_keyid;
3418 /* 10.1 firmware branch requires default key index to be set to group
3419 * key index after installing it. Otherwise FW/HW Txes corrupted
3420 * frames with multi-vif APs. This is not required for main firmware
3421 * branch (e.g. 636).
3423 * FIXME: This has been tested only in AP. It remains unknown if this
3424 * is required for multi-vif STA interfaces on 10.1 */
3426 if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
3429 if (key->cipher == WLAN_CIPHER_SUITE_WEP40)
3432 if (key->cipher == WLAN_CIPHER_SUITE_WEP104)
3435 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
3441 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
3444 ath10k_warn(ar, "failed to set vdev %i group key as default key: %d\n",
3445 arvif->vdev_id, ret);
3448 static int ath10k_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
3449 struct ieee80211_vif *vif, struct ieee80211_sta *sta,
3450 struct ieee80211_key_conf *key)
3452 struct ath10k *ar = hw->priv;
3453 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3454 struct ath10k_peer *peer;
3455 const u8 *peer_addr;
3456 bool is_wep = key->cipher == WLAN_CIPHER_SUITE_WEP40 ||
3457 key->cipher == WLAN_CIPHER_SUITE_WEP104;
3460 if (key->keyidx > WMI_MAX_KEY_INDEX)
3463 mutex_lock(&ar->conf_mutex);
3466 peer_addr = sta->addr;
3467 else if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
3468 peer_addr = vif->bss_conf.bssid;
3470 peer_addr = vif->addr;
3472 key->hw_key_idx = key->keyidx;
3474 /* the peer should not disappear in mid-way (unless FW goes awry) since
3475 * we already hold conf_mutex. we just make sure its there now. */
3476 spin_lock_bh(&ar->data_lock);
3477 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
3478 spin_unlock_bh(&ar->data_lock);
3481 if (cmd == SET_KEY) {
3482 ath10k_warn(ar, "failed to install key for non-existent peer %pM\n",
3487 /* if the peer doesn't exist there is no key to disable
3495 arvif->wep_keys[key->keyidx] = key;
3497 arvif->wep_keys[key->keyidx] = NULL;
3499 if (cmd == DISABLE_KEY)
3500 ath10k_clear_vdev_key(arvif, key);
3503 ret = ath10k_install_key(arvif, key, cmd, peer_addr);
3505 ath10k_warn(ar, "failed to install key for vdev %i peer %pM: %d\n",
3506 arvif->vdev_id, peer_addr, ret);
3510 ath10k_set_key_h_def_keyidx(ar, arvif, cmd, key);
3512 spin_lock_bh(&ar->data_lock);
3513 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
3514 if (peer && cmd == SET_KEY)
3515 peer->keys[key->keyidx] = key;
3516 else if (peer && cmd == DISABLE_KEY)
3517 peer->keys[key->keyidx] = NULL;
3518 else if (peer == NULL)
3519 /* impossible unless FW goes crazy */
3520 ath10k_warn(ar, "Peer %pM disappeared!\n", peer_addr);
3521 spin_unlock_bh(&ar->data_lock);
3524 mutex_unlock(&ar->conf_mutex);
3528 static void ath10k_sta_rc_update_wk(struct work_struct *wk)
3531 struct ath10k_vif *arvif;
3532 struct ath10k_sta *arsta;
3533 struct ieee80211_sta *sta;
3534 u32 changed, bw, nss, smps;
3537 arsta = container_of(wk, struct ath10k_sta, update_wk);
3538 sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv);
3539 arvif = arsta->arvif;
3542 spin_lock_bh(&ar->data_lock);
3544 changed = arsta->changed;
3551 spin_unlock_bh(&ar->data_lock);
3553 mutex_lock(&ar->conf_mutex);
3555 if (changed & IEEE80211_RC_BW_CHANGED) {
3556 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM peer bw %d\n",
3559 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
3560 WMI_PEER_CHAN_WIDTH, bw);
3562 ath10k_warn(ar, "failed to update STA %pM peer bw %d: %d\n",
3563 sta->addr, bw, err);
3566 if (changed & IEEE80211_RC_NSS_CHANGED) {
3567 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM nss %d\n",
3570 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
3573 ath10k_warn(ar, "failed to update STA %pM nss %d: %d\n",
3574 sta->addr, nss, err);
3577 if (changed & IEEE80211_RC_SMPS_CHANGED) {
3578 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM smps %d\n",
3581 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
3582 WMI_PEER_SMPS_STATE, smps);
3584 ath10k_warn(ar, "failed to update STA %pM smps %d: %d\n",
3585 sta->addr, smps, err);
3588 if (changed & IEEE80211_RC_SUPP_RATES_CHANGED) {
3589 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM supp rates\n",
3592 err = ath10k_station_assoc(ar, arvif->vif, sta, true);
3594 ath10k_warn(ar, "failed to reassociate station: %pM\n",
3598 mutex_unlock(&ar->conf_mutex);
3601 static int ath10k_sta_state(struct ieee80211_hw *hw,
3602 struct ieee80211_vif *vif,
3603 struct ieee80211_sta *sta,
3604 enum ieee80211_sta_state old_state,
3605 enum ieee80211_sta_state new_state)
3607 struct ath10k *ar = hw->priv;
3608 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3609 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
3613 if (old_state == IEEE80211_STA_NOTEXIST &&
3614 new_state == IEEE80211_STA_NONE) {
3615 memset(arsta, 0, sizeof(*arsta));
3616 arsta->arvif = arvif;
3617 INIT_WORK(&arsta->update_wk, ath10k_sta_rc_update_wk);
3620 /* cancel must be done outside the mutex to avoid deadlock */
3621 if ((old_state == IEEE80211_STA_NONE &&
3622 new_state == IEEE80211_STA_NOTEXIST))
3623 cancel_work_sync(&arsta->update_wk);
3625 mutex_lock(&ar->conf_mutex);
3627 if (old_state == IEEE80211_STA_NOTEXIST &&
3628 new_state == IEEE80211_STA_NONE) {
3630 * New station addition.
3632 if (test_bit(ATH10K_FW_FEATURE_WMI_10X, ar->fw_features))
3633 max_num_peers = TARGET_10X_NUM_PEERS_MAX - 1;
3635 max_num_peers = TARGET_NUM_PEERS;
3637 if (ar->num_peers >= max_num_peers) {
3638 ath10k_warn(ar, "number of peers exceeded: peers number %d (max peers %d)\n",
3639 ar->num_peers, max_num_peers);
3644 ath10k_dbg(ar, ATH10K_DBG_MAC,
3645 "mac vdev %d peer create %pM (new sta) num_peers %d\n",
3646 arvif->vdev_id, sta->addr, ar->num_peers);
3648 ret = ath10k_peer_create(ar, arvif->vdev_id, sta->addr);
3650 ath10k_warn(ar, "failed to add peer %pM for vdev %d when adding a new sta: %i\n",
3651 sta->addr, arvif->vdev_id, ret);
3653 if (vif->type == NL80211_IFTYPE_STATION) {
3654 WARN_ON(arvif->is_started);
3656 ret = ath10k_vdev_start(arvif);
3658 ath10k_warn(ar, "failed to start vdev %i: %d\n",
3659 arvif->vdev_id, ret);
3660 WARN_ON(ath10k_peer_delete(ar, arvif->vdev_id,
3665 arvif->is_started = true;
3667 } else if ((old_state == IEEE80211_STA_NONE &&
3668 new_state == IEEE80211_STA_NOTEXIST)) {
3670 * Existing station deletion.
3672 ath10k_dbg(ar, ATH10K_DBG_MAC,
3673 "mac vdev %d peer delete %pM (sta gone)\n",
3674 arvif->vdev_id, sta->addr);
3676 if (vif->type == NL80211_IFTYPE_STATION) {
3677 WARN_ON(!arvif->is_started);
3679 ret = ath10k_vdev_stop(arvif);
3681 ath10k_warn(ar, "failed to stop vdev %i: %d\n",
3682 arvif->vdev_id, ret);
3684 arvif->is_started = false;
3687 ret = ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
3689 ath10k_warn(ar, "failed to delete peer %pM for vdev %d: %i\n",
3690 sta->addr, arvif->vdev_id, ret);
3692 } else if (old_state == IEEE80211_STA_AUTH &&
3693 new_state == IEEE80211_STA_ASSOC &&
3694 (vif->type == NL80211_IFTYPE_AP ||
3695 vif->type == NL80211_IFTYPE_ADHOC)) {
3699 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac sta %pM associated\n",
3702 ret = ath10k_station_assoc(ar, vif, sta, false);
3704 ath10k_warn(ar, "failed to associate station %pM for vdev %i: %i\n",
3705 sta->addr, arvif->vdev_id, ret);
3706 } else if (old_state == IEEE80211_STA_ASSOC &&
3707 new_state == IEEE80211_STA_AUTH &&
3708 (vif->type == NL80211_IFTYPE_AP ||
3709 vif->type == NL80211_IFTYPE_ADHOC)) {
3713 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac sta %pM disassociated\n",
3716 ret = ath10k_station_disassoc(ar, vif, sta);
3718 ath10k_warn(ar, "failed to disassociate station: %pM vdev %i: %i\n",
3719 sta->addr, arvif->vdev_id, ret);
3722 mutex_unlock(&ar->conf_mutex);
3726 static int ath10k_conf_tx_uapsd(struct ath10k *ar, struct ieee80211_vif *vif,
3727 u16 ac, bool enable)
3729 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3733 lockdep_assert_held(&ar->conf_mutex);
3735 if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
3739 case IEEE80211_AC_VO:
3740 value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN |
3741 WMI_STA_PS_UAPSD_AC3_TRIGGER_EN;
3743 case IEEE80211_AC_VI:
3744 value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN |
3745 WMI_STA_PS_UAPSD_AC2_TRIGGER_EN;
3747 case IEEE80211_AC_BE:
3748 value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN |
3749 WMI_STA_PS_UAPSD_AC1_TRIGGER_EN;
3751 case IEEE80211_AC_BK:
3752 value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN |
3753 WMI_STA_PS_UAPSD_AC0_TRIGGER_EN;
3758 arvif->u.sta.uapsd |= value;
3760 arvif->u.sta.uapsd &= ~value;
3762 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
3763 WMI_STA_PS_PARAM_UAPSD,
3764 arvif->u.sta.uapsd);
3766 ath10k_warn(ar, "failed to set uapsd params: %d\n", ret);
3770 if (arvif->u.sta.uapsd)
3771 value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD;
3773 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
3775 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
3776 WMI_STA_PS_PARAM_RX_WAKE_POLICY,
3779 ath10k_warn(ar, "failed to set rx wake param: %d\n", ret);
3785 static int ath10k_conf_tx(struct ieee80211_hw *hw,
3786 struct ieee80211_vif *vif, u16 ac,
3787 const struct ieee80211_tx_queue_params *params)
3789 struct ath10k *ar = hw->priv;
3790 struct wmi_wmm_params_arg *p = NULL;
3793 mutex_lock(&ar->conf_mutex);
3796 case IEEE80211_AC_VO:
3797 p = &ar->wmm_params.ac_vo;
3799 case IEEE80211_AC_VI:
3800 p = &ar->wmm_params.ac_vi;
3802 case IEEE80211_AC_BE:
3803 p = &ar->wmm_params.ac_be;
3805 case IEEE80211_AC_BK:
3806 p = &ar->wmm_params.ac_bk;
3815 p->cwmin = params->cw_min;
3816 p->cwmax = params->cw_max;
3817 p->aifs = params->aifs;
3820 * The channel time duration programmed in the HW is in absolute
3821 * microseconds, while mac80211 gives the txop in units of
3824 p->txop = params->txop * 32;
3826 /* FIXME: FW accepts wmm params per hw, not per vif */
3827 ret = ath10k_wmi_pdev_set_wmm_params(ar, &ar->wmm_params);
3829 ath10k_warn(ar, "failed to set wmm params: %d\n", ret);
3833 ret = ath10k_conf_tx_uapsd(ar, vif, ac, params->uapsd);
3835 ath10k_warn(ar, "failed to set sta uapsd: %d\n", ret);
3838 mutex_unlock(&ar->conf_mutex);
3842 #define ATH10K_ROC_TIMEOUT_HZ (2*HZ)
3844 static int ath10k_remain_on_channel(struct ieee80211_hw *hw,
3845 struct ieee80211_vif *vif,
3846 struct ieee80211_channel *chan,
3848 enum ieee80211_roc_type type)
3850 struct ath10k *ar = hw->priv;
3851 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3852 struct wmi_start_scan_arg arg;
3855 mutex_lock(&ar->conf_mutex);
3857 spin_lock_bh(&ar->data_lock);
3858 switch (ar->scan.state) {
3859 case ATH10K_SCAN_IDLE:
3860 reinit_completion(&ar->scan.started);
3861 reinit_completion(&ar->scan.completed);
3862 reinit_completion(&ar->scan.on_channel);
3863 ar->scan.state = ATH10K_SCAN_STARTING;
3864 ar->scan.is_roc = true;
3865 ar->scan.vdev_id = arvif->vdev_id;
3866 ar->scan.roc_freq = chan->center_freq;
3869 case ATH10K_SCAN_STARTING:
3870 case ATH10K_SCAN_RUNNING:
3871 case ATH10K_SCAN_ABORTING:
3875 spin_unlock_bh(&ar->data_lock);
3880 duration = max(duration, WMI_SCAN_CHAN_MIN_TIME_MSEC);
3882 memset(&arg, 0, sizeof(arg));
3883 ath10k_wmi_start_scan_init(ar, &arg);
3884 arg.vdev_id = arvif->vdev_id;
3885 arg.scan_id = ATH10K_SCAN_ID;
3887 arg.channels[0] = chan->center_freq;
3888 arg.dwell_time_active = duration;
3889 arg.dwell_time_passive = duration;
3890 arg.max_scan_time = 2 * duration;
3891 arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
3892 arg.scan_ctrl_flags |= WMI_SCAN_FILTER_PROBE_REQ;
3894 ret = ath10k_start_scan(ar, &arg);
3896 ath10k_warn(ar, "failed to start roc scan: %d\n", ret);
3897 spin_lock_bh(&ar->data_lock);
3898 ar->scan.state = ATH10K_SCAN_IDLE;
3899 spin_unlock_bh(&ar->data_lock);
3903 ret = wait_for_completion_timeout(&ar->scan.on_channel, 3*HZ);
3905 ath10k_warn(ar, "failed to switch to channel for roc scan\n");
3907 ret = ath10k_scan_stop(ar);
3909 ath10k_warn(ar, "failed to stop scan: %d\n", ret);
3917 mutex_unlock(&ar->conf_mutex);
3921 static int ath10k_cancel_remain_on_channel(struct ieee80211_hw *hw)
3923 struct ath10k *ar = hw->priv;
3925 mutex_lock(&ar->conf_mutex);
3926 ath10k_scan_abort(ar);
3927 mutex_unlock(&ar->conf_mutex);
3929 cancel_delayed_work_sync(&ar->scan.timeout);
3935 * Both RTS and Fragmentation threshold are interface-specific
3936 * in ath10k, but device-specific in mac80211.
3939 static int ath10k_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
3941 struct ath10k *ar = hw->priv;
3942 struct ath10k_vif *arvif;
3945 mutex_lock(&ar->conf_mutex);
3946 list_for_each_entry(arvif, &ar->arvifs, list) {
3947 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d rts threshold %d\n",
3948 arvif->vdev_id, value);
3950 ret = ath10k_mac_set_rts(arvif, value);
3952 ath10k_warn(ar, "failed to set rts threshold for vdev %d: %d\n",
3953 arvif->vdev_id, ret);
3957 mutex_unlock(&ar->conf_mutex);
3962 static int ath10k_set_frag_threshold(struct ieee80211_hw *hw, u32 value)
3964 struct ath10k *ar = hw->priv;
3965 struct ath10k_vif *arvif;
3968 mutex_lock(&ar->conf_mutex);
3969 list_for_each_entry(arvif, &ar->arvifs, list) {
3970 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d fragmentation threshold %d\n",
3971 arvif->vdev_id, value);
3973 ret = ath10k_mac_set_frag(arvif, value);
3975 ath10k_warn(ar, "failed to set fragmentation threshold for vdev %d: %d\n",
3976 arvif->vdev_id, ret);
3980 mutex_unlock(&ar->conf_mutex);
3985 static void ath10k_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
3986 u32 queues, bool drop)
3988 struct ath10k *ar = hw->priv;
3992 /* mac80211 doesn't care if we really xmit queued frames or not
3993 * we'll collect those frames either way if we stop/delete vdevs */
3997 mutex_lock(&ar->conf_mutex);
3999 if (ar->state == ATH10K_STATE_WEDGED)
4002 ret = wait_event_timeout(ar->htt.empty_tx_wq, ({
4005 spin_lock_bh(&ar->htt.tx_lock);
4006 empty = (ar->htt.num_pending_tx == 0);
4007 spin_unlock_bh(&ar->htt.tx_lock);
4009 skip = (ar->state == ATH10K_STATE_WEDGED) ||
4010 test_bit(ATH10K_FLAG_CRASH_FLUSH,
4014 }), ATH10K_FLUSH_TIMEOUT_HZ);
4016 if (ret <= 0 || skip)
4017 ath10k_warn(ar, "failed to flush transmit queue (skip %i ar-state %i): %i\n",
4018 skip, ar->state, ret);
4021 mutex_unlock(&ar->conf_mutex);
4024 /* TODO: Implement this function properly
4025 * For now it is needed to reply to Probe Requests in IBSS mode.
4026 * Propably we need this information from FW.
4028 static int ath10k_tx_last_beacon(struct ieee80211_hw *hw)
4034 static int ath10k_suspend(struct ieee80211_hw *hw,
4035 struct cfg80211_wowlan *wowlan)
4037 struct ath10k *ar = hw->priv;
4040 mutex_lock(&ar->conf_mutex);
4042 ret = ath10k_wait_for_suspend(ar, WMI_PDEV_SUSPEND);
4044 if (ret == -ETIMEDOUT)
4050 ret = ath10k_hif_suspend(ar);
4052 ath10k_warn(ar, "failed to suspend hif: %d\n", ret);
4059 ret = ath10k_wmi_pdev_resume_target(ar);
4061 ath10k_warn(ar, "failed to resume target: %d\n", ret);
4065 mutex_unlock(&ar->conf_mutex);
4069 static int ath10k_resume(struct ieee80211_hw *hw)
4071 struct ath10k *ar = hw->priv;
4074 mutex_lock(&ar->conf_mutex);
4076 ret = ath10k_hif_resume(ar);
4078 ath10k_warn(ar, "failed to resume hif: %d\n", ret);
4083 ret = ath10k_wmi_pdev_resume_target(ar);
4085 ath10k_warn(ar, "failed to resume target: %d\n", ret);
4092 mutex_unlock(&ar->conf_mutex);
4097 static void ath10k_reconfig_complete(struct ieee80211_hw *hw,
4098 enum ieee80211_reconfig_type reconfig_type)
4100 struct ath10k *ar = hw->priv;
4102 if (reconfig_type != IEEE80211_RECONFIG_TYPE_RESTART)
4105 mutex_lock(&ar->conf_mutex);
4107 /* If device failed to restart it will be in a different state, e.g.
4108 * ATH10K_STATE_WEDGED */
4109 if (ar->state == ATH10K_STATE_RESTARTED) {
4110 ath10k_info(ar, "device successfully recovered\n");
4111 ar->state = ATH10K_STATE_ON;
4112 ieee80211_wake_queues(ar->hw);
4115 mutex_unlock(&ar->conf_mutex);
4118 static int ath10k_get_survey(struct ieee80211_hw *hw, int idx,
4119 struct survey_info *survey)
4121 struct ath10k *ar = hw->priv;
4122 struct ieee80211_supported_band *sband;
4123 struct survey_info *ar_survey = &ar->survey[idx];
4126 mutex_lock(&ar->conf_mutex);
4128 sband = hw->wiphy->bands[IEEE80211_BAND_2GHZ];
4129 if (sband && idx >= sband->n_channels) {
4130 idx -= sband->n_channels;
4135 sband = hw->wiphy->bands[IEEE80211_BAND_5GHZ];
4137 if (!sband || idx >= sband->n_channels) {
4142 spin_lock_bh(&ar->data_lock);
4143 memcpy(survey, ar_survey, sizeof(*survey));
4144 spin_unlock_bh(&ar->data_lock);
4146 survey->channel = &sband->channels[idx];
4148 if (ar->rx_channel == survey->channel)
4149 survey->filled |= SURVEY_INFO_IN_USE;
4152 mutex_unlock(&ar->conf_mutex);
4156 /* Helper table for legacy fixed_rate/bitrate_mask */
4157 static const u8 cck_ofdm_rate[] = {
4174 /* Check if only one bit set */
4175 static int ath10k_check_single_mask(u32 mask)
4183 mask &= ~BIT(bit - 1);
4191 ath10k_default_bitrate_mask(struct ath10k *ar,
4192 enum ieee80211_band band,
4193 const struct cfg80211_bitrate_mask *mask)
4195 u32 legacy = 0x00ff;
4198 u16 nrf = ar->num_rf_chains;
4200 if (ar->cfg_tx_chainmask)
4201 nrf = get_nss_from_chainmask(ar->cfg_tx_chainmask);
4204 case IEEE80211_BAND_2GHZ:
4208 case IEEE80211_BAND_5GHZ:
4214 if (mask->control[band].legacy != legacy)
4217 for (i = 0; i < nrf; i++)
4218 if (mask->control[band].ht_mcs[i] != ht)
4221 for (i = 0; i < nrf; i++)
4222 if (mask->control[band].vht_mcs[i] != vht)
4229 ath10k_bitrate_mask_nss(const struct cfg80211_bitrate_mask *mask,
4230 enum ieee80211_band band,
4233 int ht_nss = 0, vht_nss = 0, i;
4236 if (ath10k_check_single_mask(mask->control[band].legacy))
4240 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++) {
4241 if (mask->control[band].ht_mcs[i] == 0xff)
4243 else if (mask->control[band].ht_mcs[i] == 0x00)
4252 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
4253 if (mask->control[band].vht_mcs[i] == 0x03ff)
4255 else if (mask->control[band].vht_mcs[i] == 0x0000)
4263 if (ht_nss > 0 && vht_nss > 0)
4267 *fixed_nss = ht_nss;
4269 *fixed_nss = vht_nss;
4277 ath10k_bitrate_mask_correct(const struct cfg80211_bitrate_mask *mask,
4278 enum ieee80211_band band,
4279 enum wmi_rate_preamble *preamble)
4281 int legacy = 0, ht = 0, vht = 0, i;
4283 *preamble = WMI_RATE_PREAMBLE_OFDM;
4286 legacy = ath10k_check_single_mask(mask->control[band].legacy);
4291 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++)
4292 ht += ath10k_check_single_mask(mask->control[band].ht_mcs[i]);
4297 for (i = 0; i < NL80211_VHT_NSS_MAX; i++)
4298 vht += ath10k_check_single_mask(mask->control[band].vht_mcs[i]);
4302 /* Currently we support only one fixed_rate */
4303 if ((legacy + ht + vht) != 1)
4307 *preamble = WMI_RATE_PREAMBLE_HT;
4309 *preamble = WMI_RATE_PREAMBLE_VHT;
4315 ath10k_bitrate_mask_rate(struct ath10k *ar,
4316 const struct cfg80211_bitrate_mask *mask,
4317 enum ieee80211_band band,
4321 u8 rate = 0, pream = 0, nss = 0, i;
4322 enum wmi_rate_preamble preamble;
4324 /* Check if single rate correct */
4325 if (!ath10k_bitrate_mask_correct(mask, band, &preamble))
4331 case WMI_RATE_PREAMBLE_CCK:
4332 case WMI_RATE_PREAMBLE_OFDM:
4333 i = ffs(mask->control[band].legacy) - 1;
4335 if (band == IEEE80211_BAND_2GHZ && i < 4)
4336 pream = WMI_RATE_PREAMBLE_CCK;
4338 if (band == IEEE80211_BAND_5GHZ)
4341 if (i >= ARRAY_SIZE(cck_ofdm_rate))
4344 rate = cck_ofdm_rate[i];
4346 case WMI_RATE_PREAMBLE_HT:
4347 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++)
4348 if (mask->control[band].ht_mcs[i])
4351 if (i == IEEE80211_HT_MCS_MASK_LEN)
4354 rate = ffs(mask->control[band].ht_mcs[i]) - 1;
4357 case WMI_RATE_PREAMBLE_VHT:
4358 for (i = 0; i < NL80211_VHT_NSS_MAX; i++)
4359 if (mask->control[band].vht_mcs[i])
4362 if (i == NL80211_VHT_NSS_MAX)
4365 rate = ffs(mask->control[band].vht_mcs[i]) - 1;
4370 *fixed_nss = nss + 1;
4374 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac fixed rate pream 0x%02x nss 0x%02x rate 0x%02x\n",
4377 *fixed_rate = pream | nss | rate;
4382 static bool ath10k_get_fixed_rate_nss(struct ath10k *ar,
4383 const struct cfg80211_bitrate_mask *mask,
4384 enum ieee80211_band band,
4388 /* First check full NSS mask, if we can simply limit NSS */
4389 if (ath10k_bitrate_mask_nss(mask, band, fixed_nss))
4392 /* Next Check single rate is set */
4393 return ath10k_bitrate_mask_rate(ar, mask, band, fixed_rate, fixed_nss);
4396 static int ath10k_set_fixed_rate_param(struct ath10k_vif *arvif,
4401 struct ath10k *ar = arvif->ar;
4405 mutex_lock(&ar->conf_mutex);
4407 if (arvif->fixed_rate == fixed_rate &&
4408 arvif->fixed_nss == fixed_nss &&
4409 arvif->force_sgi == force_sgi)
4412 if (fixed_rate == WMI_FIXED_RATE_NONE)
4413 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac disable fixed bitrate mask\n");
4416 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac force sgi\n");
4418 vdev_param = ar->wmi.vdev_param->fixed_rate;
4419 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
4420 vdev_param, fixed_rate);
4422 ath10k_warn(ar, "failed to set fixed rate param 0x%02x: %d\n",
4428 arvif->fixed_rate = fixed_rate;
4430 vdev_param = ar->wmi.vdev_param->nss;
4431 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
4432 vdev_param, fixed_nss);
4435 ath10k_warn(ar, "failed to set fixed nss param %d: %d\n",
4441 arvif->fixed_nss = fixed_nss;
4443 vdev_param = ar->wmi.vdev_param->sgi;
4444 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
4448 ath10k_warn(ar, "failed to set sgi param %d: %d\n",
4454 arvif->force_sgi = force_sgi;
4457 mutex_unlock(&ar->conf_mutex);
4461 static int ath10k_set_bitrate_mask(struct ieee80211_hw *hw,
4462 struct ieee80211_vif *vif,
4463 const struct cfg80211_bitrate_mask *mask)
4465 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4466 struct ath10k *ar = arvif->ar;
4467 enum ieee80211_band band = ar->hw->conf.chandef.chan->band;
4468 u8 fixed_rate = WMI_FIXED_RATE_NONE;
4469 u8 fixed_nss = ar->num_rf_chains;
4472 if (ar->cfg_tx_chainmask)
4473 fixed_nss = get_nss_from_chainmask(ar->cfg_tx_chainmask);
4475 force_sgi = mask->control[band].gi;
4476 if (force_sgi == NL80211_TXRATE_FORCE_LGI)
4479 if (!ath10k_default_bitrate_mask(ar, band, mask)) {
4480 if (!ath10k_get_fixed_rate_nss(ar, mask, band,
4486 if (fixed_rate == WMI_FIXED_RATE_NONE && force_sgi) {
4487 ath10k_warn(ar, "failed to force SGI usage for default rate settings\n");
4491 return ath10k_set_fixed_rate_param(arvif, fixed_rate,
4492 fixed_nss, force_sgi);
4495 static void ath10k_sta_rc_update(struct ieee80211_hw *hw,
4496 struct ieee80211_vif *vif,
4497 struct ieee80211_sta *sta,
4500 struct ath10k *ar = hw->priv;
4501 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
4504 spin_lock_bh(&ar->data_lock);
4506 ath10k_dbg(ar, ATH10K_DBG_MAC,
4507 "mac sta rc update for %pM changed %08x bw %d nss %d smps %d\n",
4508 sta->addr, changed, sta->bandwidth, sta->rx_nss,
4511 if (changed & IEEE80211_RC_BW_CHANGED) {
4512 bw = WMI_PEER_CHWIDTH_20MHZ;
4514 switch (sta->bandwidth) {
4515 case IEEE80211_STA_RX_BW_20:
4516 bw = WMI_PEER_CHWIDTH_20MHZ;
4518 case IEEE80211_STA_RX_BW_40:
4519 bw = WMI_PEER_CHWIDTH_40MHZ;
4521 case IEEE80211_STA_RX_BW_80:
4522 bw = WMI_PEER_CHWIDTH_80MHZ;
4524 case IEEE80211_STA_RX_BW_160:
4525 ath10k_warn(ar, "Invalid bandwith %d in rc update for %pM\n",
4526 sta->bandwidth, sta->addr);
4527 bw = WMI_PEER_CHWIDTH_20MHZ;
4534 if (changed & IEEE80211_RC_NSS_CHANGED)
4535 arsta->nss = sta->rx_nss;
4537 if (changed & IEEE80211_RC_SMPS_CHANGED) {
4538 smps = WMI_PEER_SMPS_PS_NONE;
4540 switch (sta->smps_mode) {
4541 case IEEE80211_SMPS_AUTOMATIC:
4542 case IEEE80211_SMPS_OFF:
4543 smps = WMI_PEER_SMPS_PS_NONE;
4545 case IEEE80211_SMPS_STATIC:
4546 smps = WMI_PEER_SMPS_STATIC;
4548 case IEEE80211_SMPS_DYNAMIC:
4549 smps = WMI_PEER_SMPS_DYNAMIC;
4551 case IEEE80211_SMPS_NUM_MODES:
4552 ath10k_warn(ar, "Invalid smps %d in sta rc update for %pM\n",
4553 sta->smps_mode, sta->addr);
4554 smps = WMI_PEER_SMPS_PS_NONE;
4561 arsta->changed |= changed;
4563 spin_unlock_bh(&ar->data_lock);
4565 ieee80211_queue_work(hw, &arsta->update_wk);
4568 static u64 ath10k_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
4571 * FIXME: Return 0 for time being. Need to figure out whether FW
4572 * has the API to fetch 64-bit local TSF
4578 static int ath10k_ampdu_action(struct ieee80211_hw *hw,
4579 struct ieee80211_vif *vif,
4580 enum ieee80211_ampdu_mlme_action action,
4581 struct ieee80211_sta *sta, u16 tid, u16 *ssn,
4584 struct ath10k *ar = hw->priv;
4585 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4587 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac ampdu vdev_id %i sta %pM tid %hu action %d\n",
4588 arvif->vdev_id, sta->addr, tid, action);
4591 case IEEE80211_AMPDU_RX_START:
4592 case IEEE80211_AMPDU_RX_STOP:
4593 /* HTT AddBa/DelBa events trigger mac80211 Rx BA session
4594 * creation/removal. Do we need to verify this?
4597 case IEEE80211_AMPDU_TX_START:
4598 case IEEE80211_AMPDU_TX_STOP_CONT:
4599 case IEEE80211_AMPDU_TX_STOP_FLUSH:
4600 case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
4601 case IEEE80211_AMPDU_TX_OPERATIONAL:
4602 /* Firmware offloads Tx aggregation entirely so deny mac80211
4603 * Tx aggregation requests.
4611 static const struct ieee80211_ops ath10k_ops = {
4613 .start = ath10k_start,
4614 .stop = ath10k_stop,
4615 .config = ath10k_config,
4616 .add_interface = ath10k_add_interface,
4617 .remove_interface = ath10k_remove_interface,
4618 .configure_filter = ath10k_configure_filter,
4619 .bss_info_changed = ath10k_bss_info_changed,
4620 .hw_scan = ath10k_hw_scan,
4621 .cancel_hw_scan = ath10k_cancel_hw_scan,
4622 .set_key = ath10k_set_key,
4623 .sta_state = ath10k_sta_state,
4624 .conf_tx = ath10k_conf_tx,
4625 .remain_on_channel = ath10k_remain_on_channel,
4626 .cancel_remain_on_channel = ath10k_cancel_remain_on_channel,
4627 .set_rts_threshold = ath10k_set_rts_threshold,
4628 .set_frag_threshold = ath10k_set_frag_threshold,
4629 .flush = ath10k_flush,
4630 .tx_last_beacon = ath10k_tx_last_beacon,
4631 .set_antenna = ath10k_set_antenna,
4632 .get_antenna = ath10k_get_antenna,
4633 .reconfig_complete = ath10k_reconfig_complete,
4634 .get_survey = ath10k_get_survey,
4635 .set_bitrate_mask = ath10k_set_bitrate_mask,
4636 .sta_rc_update = ath10k_sta_rc_update,
4637 .get_tsf = ath10k_get_tsf,
4638 .ampdu_action = ath10k_ampdu_action,
4639 .get_et_sset_count = ath10k_debug_get_et_sset_count,
4640 .get_et_stats = ath10k_debug_get_et_stats,
4641 .get_et_strings = ath10k_debug_get_et_strings,
4643 CFG80211_TESTMODE_CMD(ath10k_tm_cmd)
4646 .suspend = ath10k_suspend,
4647 .resume = ath10k_resume,
4651 #define RATETAB_ENT(_rate, _rateid, _flags) { \
4652 .bitrate = (_rate), \
4653 .flags = (_flags), \
4654 .hw_value = (_rateid), \
4657 #define CHAN2G(_channel, _freq, _flags) { \
4658 .band = IEEE80211_BAND_2GHZ, \
4659 .hw_value = (_channel), \
4660 .center_freq = (_freq), \
4661 .flags = (_flags), \
4662 .max_antenna_gain = 0, \
4666 #define CHAN5G(_channel, _freq, _flags) { \
4667 .band = IEEE80211_BAND_5GHZ, \
4668 .hw_value = (_channel), \
4669 .center_freq = (_freq), \
4670 .flags = (_flags), \
4671 .max_antenna_gain = 0, \
4675 static const struct ieee80211_channel ath10k_2ghz_channels[] = {
4685 CHAN2G(10, 2457, 0),
4686 CHAN2G(11, 2462, 0),
4687 CHAN2G(12, 2467, 0),
4688 CHAN2G(13, 2472, 0),
4689 CHAN2G(14, 2484, 0),
4692 static const struct ieee80211_channel ath10k_5ghz_channels[] = {
4693 CHAN5G(36, 5180, 0),
4694 CHAN5G(40, 5200, 0),
4695 CHAN5G(44, 5220, 0),
4696 CHAN5G(48, 5240, 0),
4697 CHAN5G(52, 5260, 0),
4698 CHAN5G(56, 5280, 0),
4699 CHAN5G(60, 5300, 0),
4700 CHAN5G(64, 5320, 0),
4701 CHAN5G(100, 5500, 0),
4702 CHAN5G(104, 5520, 0),
4703 CHAN5G(108, 5540, 0),
4704 CHAN5G(112, 5560, 0),
4705 CHAN5G(116, 5580, 0),
4706 CHAN5G(120, 5600, 0),
4707 CHAN5G(124, 5620, 0),
4708 CHAN5G(128, 5640, 0),
4709 CHAN5G(132, 5660, 0),
4710 CHAN5G(136, 5680, 0),
4711 CHAN5G(140, 5700, 0),
4712 CHAN5G(149, 5745, 0),
4713 CHAN5G(153, 5765, 0),
4714 CHAN5G(157, 5785, 0),
4715 CHAN5G(161, 5805, 0),
4716 CHAN5G(165, 5825, 0),
4719 static struct ieee80211_rate ath10k_rates[] = {
4721 RATETAB_ENT(10, 0x82, 0),
4722 RATETAB_ENT(20, 0x84, 0),
4723 RATETAB_ENT(55, 0x8b, 0),
4724 RATETAB_ENT(110, 0x96, 0),
4726 RATETAB_ENT(60, 0x0c, 0),
4727 RATETAB_ENT(90, 0x12, 0),
4728 RATETAB_ENT(120, 0x18, 0),
4729 RATETAB_ENT(180, 0x24, 0),
4730 RATETAB_ENT(240, 0x30, 0),
4731 RATETAB_ENT(360, 0x48, 0),
4732 RATETAB_ENT(480, 0x60, 0),
4733 RATETAB_ENT(540, 0x6c, 0),
4736 #define ath10k_a_rates (ath10k_rates + 4)
4737 #define ath10k_a_rates_size (ARRAY_SIZE(ath10k_rates) - 4)
4738 #define ath10k_g_rates (ath10k_rates + 0)
4739 #define ath10k_g_rates_size (ARRAY_SIZE(ath10k_rates))
4741 struct ath10k *ath10k_mac_create(size_t priv_size)
4743 struct ieee80211_hw *hw;
4746 hw = ieee80211_alloc_hw(sizeof(struct ath10k) + priv_size, &ath10k_ops);
4756 void ath10k_mac_destroy(struct ath10k *ar)
4758 ieee80211_free_hw(ar->hw);
4761 static const struct ieee80211_iface_limit ath10k_if_limits[] = {
4764 .types = BIT(NL80211_IFTYPE_STATION)
4765 | BIT(NL80211_IFTYPE_P2P_CLIENT)
4769 .types = BIT(NL80211_IFTYPE_P2P_GO)
4773 .types = BIT(NL80211_IFTYPE_AP)
4777 static const struct ieee80211_iface_limit ath10k_10x_if_limits[] = {
4780 .types = BIT(NL80211_IFTYPE_AP)
4784 static const struct ieee80211_iface_combination ath10k_if_comb[] = {
4786 .limits = ath10k_if_limits,
4787 .n_limits = ARRAY_SIZE(ath10k_if_limits),
4788 .max_interfaces = 8,
4789 .num_different_channels = 1,
4790 .beacon_int_infra_match = true,
4794 static const struct ieee80211_iface_combination ath10k_10x_if_comb[] = {
4796 .limits = ath10k_10x_if_limits,
4797 .n_limits = ARRAY_SIZE(ath10k_10x_if_limits),
4798 .max_interfaces = 8,
4799 .num_different_channels = 1,
4800 .beacon_int_infra_match = true,
4801 #ifdef CONFIG_ATH10K_DFS_CERTIFIED
4802 .radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
4803 BIT(NL80211_CHAN_WIDTH_20) |
4804 BIT(NL80211_CHAN_WIDTH_40) |
4805 BIT(NL80211_CHAN_WIDTH_80),
4810 static struct ieee80211_sta_vht_cap ath10k_create_vht_cap(struct ath10k *ar)
4812 struct ieee80211_sta_vht_cap vht_cap = {0};
4816 vht_cap.vht_supported = 1;
4817 vht_cap.cap = ar->vht_cap_info;
4820 for (i = 0; i < 8; i++) {
4821 if (i < ar->num_rf_chains)
4822 mcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i*2);
4824 mcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i*2);
4827 vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(mcs_map);
4828 vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(mcs_map);
4833 static struct ieee80211_sta_ht_cap ath10k_get_ht_cap(struct ath10k *ar)
4836 struct ieee80211_sta_ht_cap ht_cap = {0};
4838 if (!(ar->ht_cap_info & WMI_HT_CAP_ENABLED))
4841 ht_cap.ht_supported = 1;
4842 ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
4843 ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_8;
4844 ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
4845 ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
4846 ht_cap.cap |= WLAN_HT_CAP_SM_PS_STATIC << IEEE80211_HT_CAP_SM_PS_SHIFT;
4848 if (ar->ht_cap_info & WMI_HT_CAP_HT20_SGI)
4849 ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
4851 if (ar->ht_cap_info & WMI_HT_CAP_HT40_SGI)
4852 ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
4854 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) {
4857 smps = WLAN_HT_CAP_SM_PS_DYNAMIC;
4858 smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT;
4863 if (ar->ht_cap_info & WMI_HT_CAP_TX_STBC)
4864 ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC;
4866 if (ar->ht_cap_info & WMI_HT_CAP_RX_STBC) {
4869 stbc = ar->ht_cap_info;
4870 stbc &= WMI_HT_CAP_RX_STBC;
4871 stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT;
4872 stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT;
4873 stbc &= IEEE80211_HT_CAP_RX_STBC;
4878 if (ar->ht_cap_info & WMI_HT_CAP_LDPC)
4879 ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
4881 if (ar->ht_cap_info & WMI_HT_CAP_L_SIG_TXOP_PROT)
4882 ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
4884 /* max AMSDU is implicitly taken from vht_cap_info */
4885 if (ar->vht_cap_info & WMI_VHT_CAP_MAX_MPDU_LEN_MASK)
4886 ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU;
4888 for (i = 0; i < ar->num_rf_chains; i++)
4889 ht_cap.mcs.rx_mask[i] = 0xFF;
4891 ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
4896 static void ath10k_get_arvif_iter(void *data, u8 *mac,
4897 struct ieee80211_vif *vif)
4899 struct ath10k_vif_iter *arvif_iter = data;
4900 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4902 if (arvif->vdev_id == arvif_iter->vdev_id)
4903 arvif_iter->arvif = arvif;
4906 struct ath10k_vif *ath10k_get_arvif(struct ath10k *ar, u32 vdev_id)
4908 struct ath10k_vif_iter arvif_iter;
4911 memset(&arvif_iter, 0, sizeof(struct ath10k_vif_iter));
4912 arvif_iter.vdev_id = vdev_id;
4914 flags = IEEE80211_IFACE_ITER_RESUME_ALL;
4915 ieee80211_iterate_active_interfaces_atomic(ar->hw,
4917 ath10k_get_arvif_iter,
4919 if (!arvif_iter.arvif) {
4920 ath10k_warn(ar, "No VIF found for vdev %d\n", vdev_id);
4924 return arvif_iter.arvif;
4927 int ath10k_mac_register(struct ath10k *ar)
4929 struct ieee80211_supported_band *band;
4930 struct ieee80211_sta_vht_cap vht_cap;
4931 struct ieee80211_sta_ht_cap ht_cap;
4935 SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr);
4937 SET_IEEE80211_DEV(ar->hw, ar->dev);
4939 ht_cap = ath10k_get_ht_cap(ar);
4940 vht_cap = ath10k_create_vht_cap(ar);
4942 if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) {
4943 channels = kmemdup(ath10k_2ghz_channels,
4944 sizeof(ath10k_2ghz_channels),
4951 band = &ar->mac.sbands[IEEE80211_BAND_2GHZ];
4952 band->n_channels = ARRAY_SIZE(ath10k_2ghz_channels);
4953 band->channels = channels;
4954 band->n_bitrates = ath10k_g_rates_size;
4955 band->bitrates = ath10k_g_rates;
4956 band->ht_cap = ht_cap;
4958 /* vht is not supported in 2.4 GHz */
4960 ar->hw->wiphy->bands[IEEE80211_BAND_2GHZ] = band;
4963 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) {
4964 channels = kmemdup(ath10k_5ghz_channels,
4965 sizeof(ath10k_5ghz_channels),
4972 band = &ar->mac.sbands[IEEE80211_BAND_5GHZ];
4973 band->n_channels = ARRAY_SIZE(ath10k_5ghz_channels);
4974 band->channels = channels;
4975 band->n_bitrates = ath10k_a_rates_size;
4976 band->bitrates = ath10k_a_rates;
4977 band->ht_cap = ht_cap;
4978 band->vht_cap = vht_cap;
4979 ar->hw->wiphy->bands[IEEE80211_BAND_5GHZ] = band;
4982 ar->hw->wiphy->interface_modes =
4983 BIT(NL80211_IFTYPE_STATION) |
4984 BIT(NL80211_IFTYPE_AP);
4986 ar->hw->wiphy->available_antennas_rx = ar->supp_rx_chainmask;
4987 ar->hw->wiphy->available_antennas_tx = ar->supp_tx_chainmask;
4989 if (!test_bit(ATH10K_FW_FEATURE_NO_P2P, ar->fw_features))
4990 ar->hw->wiphy->interface_modes |=
4991 BIT(NL80211_IFTYPE_P2P_CLIENT) |
4992 BIT(NL80211_IFTYPE_P2P_GO);
4994 ar->hw->flags = IEEE80211_HW_SIGNAL_DBM |
4995 IEEE80211_HW_SUPPORTS_PS |
4996 IEEE80211_HW_SUPPORTS_DYNAMIC_PS |
4997 IEEE80211_HW_SUPPORTS_UAPSD |
4998 IEEE80211_HW_MFP_CAPABLE |
4999 IEEE80211_HW_REPORTS_TX_ACK_STATUS |
5000 IEEE80211_HW_HAS_RATE_CONTROL |
5001 IEEE80211_HW_AP_LINK_PS |
5002 IEEE80211_HW_SPECTRUM_MGMT;
5004 ar->hw->wiphy->features |= NL80211_FEATURE_STATIC_SMPS;
5006 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS)
5007 ar->hw->wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS;
5009 if (ar->ht_cap_info & WMI_HT_CAP_ENABLED) {
5010 ar->hw->flags |= IEEE80211_HW_AMPDU_AGGREGATION;
5011 ar->hw->flags |= IEEE80211_HW_TX_AMPDU_SETUP_IN_HW;
5014 ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID;
5015 ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN;
5017 ar->hw->vif_data_size = sizeof(struct ath10k_vif);
5018 ar->hw->sta_data_size = sizeof(struct ath10k_sta);
5020 ar->hw->max_listen_interval = ATH10K_MAX_HW_LISTEN_INTERVAL;
5022 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
5023 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
5024 ar->hw->wiphy->max_remain_on_channel_duration = 5000;
5026 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
5027 ar->hw->wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE;
5030 * on LL hardware queues are managed entirely by the FW
5031 * so we only advertise to mac we can do the queues thing
5035 if (test_bit(ATH10K_FW_FEATURE_WMI_10X, ar->fw_features)) {
5036 ar->hw->wiphy->iface_combinations = ath10k_10x_if_comb;
5037 ar->hw->wiphy->n_iface_combinations =
5038 ARRAY_SIZE(ath10k_10x_if_comb);
5040 ar->hw->wiphy->iface_combinations = ath10k_if_comb;
5041 ar->hw->wiphy->n_iface_combinations =
5042 ARRAY_SIZE(ath10k_if_comb);
5044 ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC);
5047 ar->hw->netdev_features = NETIF_F_HW_CSUM;
5049 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED)) {
5050 /* Init ath dfs pattern detector */
5051 ar->ath_common.debug_mask = ATH_DBG_DFS;
5052 ar->dfs_detector = dfs_pattern_detector_init(&ar->ath_common,
5055 if (!ar->dfs_detector)
5056 ath10k_warn(ar, "failed to initialise DFS pattern detector\n");
5059 ret = ath_regd_init(&ar->ath_common.regulatory, ar->hw->wiphy,
5060 ath10k_reg_notifier);
5062 ath10k_err(ar, "failed to initialise regulatory: %i\n", ret);
5066 ret = ieee80211_register_hw(ar->hw);
5068 ath10k_err(ar, "failed to register ieee80211: %d\n", ret);
5072 if (!ath_is_world_regd(&ar->ath_common.regulatory)) {
5073 ret = regulatory_hint(ar->hw->wiphy,
5074 ar->ath_common.regulatory.alpha2);
5076 goto err_unregister;
5082 ieee80211_unregister_hw(ar->hw);
5084 kfree(ar->mac.sbands[IEEE80211_BAND_2GHZ].channels);
5085 kfree(ar->mac.sbands[IEEE80211_BAND_5GHZ].channels);
5090 void ath10k_mac_unregister(struct ath10k *ar)
5092 ieee80211_unregister_hw(ar->hw);
5094 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector)
5095 ar->dfs_detector->exit(ar->dfs_detector);
5097 kfree(ar->mac.sbands[IEEE80211_BAND_2GHZ].channels);
5098 kfree(ar->mac.sbands[IEEE80211_BAND_5GHZ].channels);
5100 SET_IEEE80211_DEV(ar->hw, NULL);