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>
37 static int ath10k_send_key(struct ath10k_vif *arvif,
38 struct ieee80211_key_conf *key,
42 struct ath10k *ar = arvif->ar;
43 struct wmi_vdev_install_key_arg arg = {
44 .vdev_id = arvif->vdev_id,
45 .key_idx = key->keyidx,
46 .key_len = key->keylen,
51 lockdep_assert_held(&arvif->ar->conf_mutex);
53 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
54 arg.key_flags = WMI_KEY_PAIRWISE;
56 arg.key_flags = WMI_KEY_GROUP;
58 switch (key->cipher) {
59 case WLAN_CIPHER_SUITE_CCMP:
60 arg.key_cipher = WMI_CIPHER_AES_CCM;
61 if (arvif->vdev_type == WMI_VDEV_TYPE_AP)
62 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT;
64 key->flags |= IEEE80211_KEY_FLAG_SW_MGMT_TX;
66 case WLAN_CIPHER_SUITE_TKIP:
67 arg.key_cipher = WMI_CIPHER_TKIP;
68 arg.key_txmic_len = 8;
69 arg.key_rxmic_len = 8;
71 case WLAN_CIPHER_SUITE_WEP40:
72 case WLAN_CIPHER_SUITE_WEP104:
73 arg.key_cipher = WMI_CIPHER_WEP;
74 /* AP/IBSS mode requires self-key to be groupwise
75 * Otherwise pairwise key must be set */
76 if (memcmp(macaddr, arvif->vif->addr, ETH_ALEN))
77 arg.key_flags = WMI_KEY_PAIRWISE;
80 ath10k_warn(ar, "cipher %d is not supported\n", key->cipher);
84 if (cmd == DISABLE_KEY) {
85 arg.key_cipher = WMI_CIPHER_NONE;
89 return ath10k_wmi_vdev_install_key(arvif->ar, &arg);
92 static int ath10k_install_key(struct ath10k_vif *arvif,
93 struct ieee80211_key_conf *key,
97 struct ath10k *ar = arvif->ar;
100 lockdep_assert_held(&ar->conf_mutex);
102 reinit_completion(&ar->install_key_done);
104 ret = ath10k_send_key(arvif, key, cmd, macaddr);
108 ret = wait_for_completion_timeout(&ar->install_key_done, 3*HZ);
115 static int ath10k_install_peer_wep_keys(struct ath10k_vif *arvif,
118 struct ath10k *ar = arvif->ar;
119 struct ath10k_peer *peer;
123 lockdep_assert_held(&ar->conf_mutex);
125 spin_lock_bh(&ar->data_lock);
126 peer = ath10k_peer_find(ar, arvif->vdev_id, addr);
127 spin_unlock_bh(&ar->data_lock);
132 for (i = 0; i < ARRAY_SIZE(arvif->wep_keys); i++) {
133 if (arvif->wep_keys[i] == NULL)
136 ret = ath10k_install_key(arvif, arvif->wep_keys[i], SET_KEY,
141 spin_lock_bh(&ar->data_lock);
142 peer->keys[i] = arvif->wep_keys[i];
143 spin_unlock_bh(&ar->data_lock);
149 static int ath10k_clear_peer_keys(struct ath10k_vif *arvif,
152 struct ath10k *ar = arvif->ar;
153 struct ath10k_peer *peer;
158 lockdep_assert_held(&ar->conf_mutex);
160 spin_lock_bh(&ar->data_lock);
161 peer = ath10k_peer_find(ar, arvif->vdev_id, addr);
162 spin_unlock_bh(&ar->data_lock);
167 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
168 if (peer->keys[i] == NULL)
171 ret = ath10k_install_key(arvif, peer->keys[i],
173 if (ret && first_errno == 0)
177 ath10k_warn(ar, "failed to remove peer wep key %d: %d\n",
180 spin_lock_bh(&ar->data_lock);
181 peer->keys[i] = NULL;
182 spin_unlock_bh(&ar->data_lock);
188 bool ath10k_mac_is_peer_wep_key_set(struct ath10k *ar, const u8 *addr,
191 struct ath10k_peer *peer;
194 lockdep_assert_held(&ar->data_lock);
196 /* We don't know which vdev this peer belongs to,
197 * since WMI doesn't give us that information.
199 * FIXME: multi-bss needs to be handled.
201 peer = ath10k_peer_find(ar, 0, addr);
205 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
206 if (peer->keys[i] && peer->keys[i]->keyidx == keyidx)
213 static int ath10k_clear_vdev_key(struct ath10k_vif *arvif,
214 struct ieee80211_key_conf *key)
216 struct ath10k *ar = arvif->ar;
217 struct ath10k_peer *peer;
223 lockdep_assert_held(&ar->conf_mutex);
226 /* since ath10k_install_key we can't hold data_lock all the
227 * time, so we try to remove the keys incrementally */
228 spin_lock_bh(&ar->data_lock);
230 list_for_each_entry(peer, &ar->peers, list) {
231 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
232 if (peer->keys[i] == key) {
233 ether_addr_copy(addr, peer->addr);
234 peer->keys[i] = NULL;
239 if (i < ARRAY_SIZE(peer->keys))
242 spin_unlock_bh(&ar->data_lock);
244 if (i == ARRAY_SIZE(peer->keys))
247 ret = ath10k_install_key(arvif, key, DISABLE_KEY, addr);
248 if (ret && first_errno == 0)
252 ath10k_warn(ar, "failed to remove key for %pM: %d\n",
259 /*********************/
260 /* General utilities */
261 /*********************/
263 static inline enum wmi_phy_mode
264 chan_to_phymode(const struct cfg80211_chan_def *chandef)
266 enum wmi_phy_mode phymode = MODE_UNKNOWN;
268 switch (chandef->chan->band) {
269 case IEEE80211_BAND_2GHZ:
270 switch (chandef->width) {
271 case NL80211_CHAN_WIDTH_20_NOHT:
274 case NL80211_CHAN_WIDTH_20:
275 phymode = MODE_11NG_HT20;
277 case NL80211_CHAN_WIDTH_40:
278 phymode = MODE_11NG_HT40;
280 case NL80211_CHAN_WIDTH_5:
281 case NL80211_CHAN_WIDTH_10:
282 case NL80211_CHAN_WIDTH_80:
283 case NL80211_CHAN_WIDTH_80P80:
284 case NL80211_CHAN_WIDTH_160:
285 phymode = MODE_UNKNOWN;
289 case IEEE80211_BAND_5GHZ:
290 switch (chandef->width) {
291 case NL80211_CHAN_WIDTH_20_NOHT:
294 case NL80211_CHAN_WIDTH_20:
295 phymode = MODE_11NA_HT20;
297 case NL80211_CHAN_WIDTH_40:
298 phymode = MODE_11NA_HT40;
300 case NL80211_CHAN_WIDTH_80:
301 phymode = MODE_11AC_VHT80;
303 case NL80211_CHAN_WIDTH_5:
304 case NL80211_CHAN_WIDTH_10:
305 case NL80211_CHAN_WIDTH_80P80:
306 case NL80211_CHAN_WIDTH_160:
307 phymode = MODE_UNKNOWN;
315 WARN_ON(phymode == MODE_UNKNOWN);
319 static u8 ath10k_parse_mpdudensity(u8 mpdudensity)
322 * 802.11n D2.0 defined values for "Minimum MPDU Start Spacing":
323 * 0 for no restriction
332 switch (mpdudensity) {
338 /* Our lower layer calculations limit our precision to
354 static int ath10k_peer_create(struct ath10k *ar, u32 vdev_id, const u8 *addr)
358 lockdep_assert_held(&ar->conf_mutex);
360 if (ar->num_peers >= ar->max_num_peers)
363 ret = ath10k_wmi_peer_create(ar, vdev_id, addr);
365 ath10k_warn(ar, "failed to create wmi peer %pM on vdev %i: %i\n",
370 ret = ath10k_wait_for_peer_created(ar, vdev_id, addr);
372 ath10k_warn(ar, "failed to wait for created wmi peer %pM on vdev %i: %i\n",
382 static int ath10k_mac_set_kickout(struct ath10k_vif *arvif)
384 struct ath10k *ar = arvif->ar;
388 param = ar->wmi.pdev_param->sta_kickout_th;
389 ret = ath10k_wmi_pdev_set_param(ar, param,
390 ATH10K_KICKOUT_THRESHOLD);
392 ath10k_warn(ar, "failed to set kickout threshold on vdev %i: %d\n",
393 arvif->vdev_id, ret);
397 param = ar->wmi.vdev_param->ap_keepalive_min_idle_inactive_time_secs;
398 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
399 ATH10K_KEEPALIVE_MIN_IDLE);
401 ath10k_warn(ar, "failed to set keepalive minimum idle time on vdev %i: %d\n",
402 arvif->vdev_id, ret);
406 param = ar->wmi.vdev_param->ap_keepalive_max_idle_inactive_time_secs;
407 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
408 ATH10K_KEEPALIVE_MAX_IDLE);
410 ath10k_warn(ar, "failed to set keepalive maximum idle time on vdev %i: %d\n",
411 arvif->vdev_id, ret);
415 param = ar->wmi.vdev_param->ap_keepalive_max_unresponsive_time_secs;
416 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
417 ATH10K_KEEPALIVE_MAX_UNRESPONSIVE);
419 ath10k_warn(ar, "failed to set keepalive maximum unresponsive time on vdev %i: %d\n",
420 arvif->vdev_id, ret);
427 static int ath10k_mac_set_rts(struct ath10k_vif *arvif, u32 value)
429 struct ath10k *ar = arvif->ar;
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);
469 static void ath10k_peer_cleanup(struct ath10k *ar, u32 vdev_id)
471 struct ath10k_peer *peer, *tmp;
473 lockdep_assert_held(&ar->conf_mutex);
475 spin_lock_bh(&ar->data_lock);
476 list_for_each_entry_safe(peer, tmp, &ar->peers, list) {
477 if (peer->vdev_id != vdev_id)
480 ath10k_warn(ar, "removing stale peer %pM from vdev_id %d\n",
481 peer->addr, vdev_id);
483 list_del(&peer->list);
487 spin_unlock_bh(&ar->data_lock);
490 static void ath10k_peer_cleanup_all(struct ath10k *ar)
492 struct ath10k_peer *peer, *tmp;
494 lockdep_assert_held(&ar->conf_mutex);
496 spin_lock_bh(&ar->data_lock);
497 list_for_each_entry_safe(peer, tmp, &ar->peers, list) {
498 list_del(&peer->list);
501 spin_unlock_bh(&ar->data_lock);
504 ar->num_stations = 0;
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 bool ath10k_mac_sta_has_11g_rates(struct ieee80211_sta *sta)
1421 /* First 4 rates in ath10k_rates are CCK (11b) rates. */
1422 return sta->supp_rates[IEEE80211_BAND_2GHZ] >> 4;
1425 static void ath10k_peer_assoc_h_phymode(struct ath10k *ar,
1426 struct ieee80211_vif *vif,
1427 struct ieee80211_sta *sta,
1428 struct wmi_peer_assoc_complete_arg *arg)
1430 enum wmi_phy_mode phymode = MODE_UNKNOWN;
1432 switch (ar->hw->conf.chandef.chan->band) {
1433 case IEEE80211_BAND_2GHZ:
1434 if (sta->ht_cap.ht_supported) {
1435 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1436 phymode = MODE_11NG_HT40;
1438 phymode = MODE_11NG_HT20;
1439 } else if (ath10k_mac_sta_has_11g_rates(sta)) {
1446 case IEEE80211_BAND_5GHZ:
1450 if (sta->vht_cap.vht_supported) {
1451 if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
1452 phymode = MODE_11AC_VHT80;
1453 else if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1454 phymode = MODE_11AC_VHT40;
1455 else if (sta->bandwidth == IEEE80211_STA_RX_BW_20)
1456 phymode = MODE_11AC_VHT20;
1457 } else if (sta->ht_cap.ht_supported) {
1458 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1459 phymode = MODE_11NA_HT40;
1461 phymode = MODE_11NA_HT20;
1471 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac peer %pM phymode %s\n",
1472 sta->addr, ath10k_wmi_phymode_str(phymode));
1474 arg->peer_phymode = phymode;
1475 WARN_ON(phymode == MODE_UNKNOWN);
1478 static int ath10k_peer_assoc_prepare(struct ath10k *ar,
1479 struct ieee80211_vif *vif,
1480 struct ieee80211_sta *sta,
1481 struct wmi_peer_assoc_complete_arg *arg)
1483 lockdep_assert_held(&ar->conf_mutex);
1485 memset(arg, 0, sizeof(*arg));
1487 ath10k_peer_assoc_h_basic(ar, vif, sta, arg);
1488 ath10k_peer_assoc_h_crypto(ar, vif, arg);
1489 ath10k_peer_assoc_h_rates(ar, sta, arg);
1490 ath10k_peer_assoc_h_ht(ar, sta, arg);
1491 ath10k_peer_assoc_h_vht(ar, sta, arg);
1492 ath10k_peer_assoc_h_qos(ar, vif, sta, arg);
1493 ath10k_peer_assoc_h_phymode(ar, vif, sta, arg);
1498 static const u32 ath10k_smps_map[] = {
1499 [WLAN_HT_CAP_SM_PS_STATIC] = WMI_PEER_SMPS_STATIC,
1500 [WLAN_HT_CAP_SM_PS_DYNAMIC] = WMI_PEER_SMPS_DYNAMIC,
1501 [WLAN_HT_CAP_SM_PS_INVALID] = WMI_PEER_SMPS_PS_NONE,
1502 [WLAN_HT_CAP_SM_PS_DISABLED] = WMI_PEER_SMPS_PS_NONE,
1505 static int ath10k_setup_peer_smps(struct ath10k *ar, struct ath10k_vif *arvif,
1507 const struct ieee80211_sta_ht_cap *ht_cap)
1511 if (!ht_cap->ht_supported)
1514 smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
1515 smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
1517 if (smps >= ARRAY_SIZE(ath10k_smps_map))
1520 return ath10k_wmi_peer_set_param(ar, arvif->vdev_id, addr,
1521 WMI_PEER_SMPS_STATE,
1522 ath10k_smps_map[smps]);
1525 /* can be called only in mac80211 callbacks due to `key_count` usage */
1526 static void ath10k_bss_assoc(struct ieee80211_hw *hw,
1527 struct ieee80211_vif *vif,
1528 struct ieee80211_bss_conf *bss_conf)
1530 struct ath10k *ar = hw->priv;
1531 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1532 struct ieee80211_sta_ht_cap ht_cap;
1533 struct wmi_peer_assoc_complete_arg peer_arg;
1534 struct ieee80211_sta *ap_sta;
1537 lockdep_assert_held(&ar->conf_mutex);
1539 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i assoc bssid %pM aid %d\n",
1540 arvif->vdev_id, arvif->bssid, arvif->aid);
1544 ap_sta = ieee80211_find_sta(vif, bss_conf->bssid);
1546 ath10k_warn(ar, "failed to find station entry for bss %pM vdev %i\n",
1547 bss_conf->bssid, arvif->vdev_id);
1552 /* ap_sta must be accessed only within rcu section which must be left
1553 * before calling ath10k_setup_peer_smps() which might sleep. */
1554 ht_cap = ap_sta->ht_cap;
1556 ret = ath10k_peer_assoc_prepare(ar, vif, ap_sta, &peer_arg);
1558 ath10k_warn(ar, "failed to prepare peer assoc for %pM vdev %i: %d\n",
1559 bss_conf->bssid, arvif->vdev_id, ret);
1566 ret = ath10k_wmi_peer_assoc(ar, &peer_arg);
1568 ath10k_warn(ar, "failed to run peer assoc for %pM vdev %i: %d\n",
1569 bss_conf->bssid, arvif->vdev_id, ret);
1573 ret = ath10k_setup_peer_smps(ar, arvif, bss_conf->bssid, &ht_cap);
1575 ath10k_warn(ar, "failed to setup peer SMPS for vdev %i: %d\n",
1576 arvif->vdev_id, ret);
1580 ath10k_dbg(ar, ATH10K_DBG_MAC,
1581 "mac vdev %d up (associated) bssid %pM aid %d\n",
1582 arvif->vdev_id, bss_conf->bssid, bss_conf->aid);
1584 WARN_ON(arvif->is_up);
1586 arvif->aid = bss_conf->aid;
1587 ether_addr_copy(arvif->bssid, bss_conf->bssid);
1589 ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid);
1591 ath10k_warn(ar, "failed to set vdev %d up: %d\n",
1592 arvif->vdev_id, ret);
1596 arvif->is_up = true;
1599 static void ath10k_bss_disassoc(struct ieee80211_hw *hw,
1600 struct ieee80211_vif *vif)
1602 struct ath10k *ar = hw->priv;
1603 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1606 lockdep_assert_held(&ar->conf_mutex);
1608 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i disassoc bssid %pM\n",
1609 arvif->vdev_id, arvif->bssid);
1611 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
1613 ath10k_warn(ar, "faield to down vdev %i: %d\n",
1614 arvif->vdev_id, ret);
1616 arvif->def_wep_key_idx = 0;
1617 arvif->is_up = false;
1620 static int ath10k_station_assoc(struct ath10k *ar,
1621 struct ieee80211_vif *vif,
1622 struct ieee80211_sta *sta,
1625 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1626 struct wmi_peer_assoc_complete_arg peer_arg;
1629 lockdep_assert_held(&ar->conf_mutex);
1631 ret = ath10k_peer_assoc_prepare(ar, vif, sta, &peer_arg);
1633 ath10k_warn(ar, "failed to prepare WMI peer assoc for %pM vdev %i: %i\n",
1634 sta->addr, arvif->vdev_id, ret);
1638 peer_arg.peer_reassoc = reassoc;
1639 ret = ath10k_wmi_peer_assoc(ar, &peer_arg);
1641 ath10k_warn(ar, "failed to run peer assoc for STA %pM vdev %i: %d\n",
1642 sta->addr, arvif->vdev_id, ret);
1646 /* Re-assoc is run only to update supported rates for given station. It
1647 * doesn't make much sense to reconfigure the peer completely.
1650 ret = ath10k_setup_peer_smps(ar, arvif, sta->addr,
1653 ath10k_warn(ar, "failed to setup peer SMPS for vdev %d: %d\n",
1654 arvif->vdev_id, ret);
1658 ret = ath10k_peer_assoc_qos_ap(ar, arvif, sta);
1660 ath10k_warn(ar, "failed to set qos params for STA %pM for vdev %i: %d\n",
1661 sta->addr, arvif->vdev_id, ret);
1666 arvif->num_legacy_stations++;
1667 ret = ath10k_recalc_rtscts_prot(arvif);
1669 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
1670 arvif->vdev_id, ret);
1675 ret = ath10k_install_peer_wep_keys(arvif, sta->addr);
1677 ath10k_warn(ar, "failed to install peer wep keys for vdev %i: %d\n",
1678 arvif->vdev_id, ret);
1686 static int ath10k_station_disassoc(struct ath10k *ar,
1687 struct ieee80211_vif *vif,
1688 struct ieee80211_sta *sta)
1690 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1693 lockdep_assert_held(&ar->conf_mutex);
1696 arvif->num_legacy_stations--;
1697 ret = ath10k_recalc_rtscts_prot(arvif);
1699 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
1700 arvif->vdev_id, ret);
1705 ret = ath10k_clear_peer_keys(arvif, sta->addr);
1707 ath10k_warn(ar, "failed to clear all peer wep keys for vdev %i: %d\n",
1708 arvif->vdev_id, ret);
1719 static int ath10k_update_channel_list(struct ath10k *ar)
1721 struct ieee80211_hw *hw = ar->hw;
1722 struct ieee80211_supported_band **bands;
1723 enum ieee80211_band band;
1724 struct ieee80211_channel *channel;
1725 struct wmi_scan_chan_list_arg arg = {0};
1726 struct wmi_channel_arg *ch;
1732 lockdep_assert_held(&ar->conf_mutex);
1734 bands = hw->wiphy->bands;
1735 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
1739 for (i = 0; i < bands[band]->n_channels; i++) {
1740 if (bands[band]->channels[i].flags &
1741 IEEE80211_CHAN_DISABLED)
1748 len = sizeof(struct wmi_channel_arg) * arg.n_channels;
1749 arg.channels = kzalloc(len, GFP_KERNEL);
1754 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
1758 for (i = 0; i < bands[band]->n_channels; i++) {
1759 channel = &bands[band]->channels[i];
1761 if (channel->flags & IEEE80211_CHAN_DISABLED)
1764 ch->allow_ht = true;
1766 /* FIXME: when should we really allow VHT? */
1767 ch->allow_vht = true;
1770 !(channel->flags & IEEE80211_CHAN_NO_IR);
1773 !(channel->flags & IEEE80211_CHAN_NO_HT40PLUS);
1776 !!(channel->flags & IEEE80211_CHAN_RADAR);
1778 passive = channel->flags & IEEE80211_CHAN_NO_IR;
1779 ch->passive = passive;
1781 ch->freq = channel->center_freq;
1782 ch->band_center_freq1 = channel->center_freq;
1784 ch->max_power = channel->max_power * 2;
1785 ch->max_reg_power = channel->max_reg_power * 2;
1786 ch->max_antenna_gain = channel->max_antenna_gain * 2;
1787 ch->reg_class_id = 0; /* FIXME */
1789 /* FIXME: why use only legacy modes, why not any
1790 * HT/VHT modes? Would that even make any
1792 if (channel->band == IEEE80211_BAND_2GHZ)
1793 ch->mode = MODE_11G;
1795 ch->mode = MODE_11A;
1797 if (WARN_ON_ONCE(ch->mode == MODE_UNKNOWN))
1800 ath10k_dbg(ar, ATH10K_DBG_WMI,
1801 "mac channel [%zd/%d] freq %d maxpower %d regpower %d antenna %d mode %d\n",
1802 ch - arg.channels, arg.n_channels,
1803 ch->freq, ch->max_power, ch->max_reg_power,
1804 ch->max_antenna_gain, ch->mode);
1810 ret = ath10k_wmi_scan_chan_list(ar, &arg);
1811 kfree(arg.channels);
1816 static enum wmi_dfs_region
1817 ath10k_mac_get_dfs_region(enum nl80211_dfs_regions dfs_region)
1819 switch (dfs_region) {
1820 case NL80211_DFS_UNSET:
1821 return WMI_UNINIT_DFS_DOMAIN;
1822 case NL80211_DFS_FCC:
1823 return WMI_FCC_DFS_DOMAIN;
1824 case NL80211_DFS_ETSI:
1825 return WMI_ETSI_DFS_DOMAIN;
1826 case NL80211_DFS_JP:
1827 return WMI_MKK4_DFS_DOMAIN;
1829 return WMI_UNINIT_DFS_DOMAIN;
1832 static void ath10k_regd_update(struct ath10k *ar)
1834 struct reg_dmn_pair_mapping *regpair;
1836 enum wmi_dfs_region wmi_dfs_reg;
1837 enum nl80211_dfs_regions nl_dfs_reg;
1839 lockdep_assert_held(&ar->conf_mutex);
1841 ret = ath10k_update_channel_list(ar);
1843 ath10k_warn(ar, "failed to update channel list: %d\n", ret);
1845 regpair = ar->ath_common.regulatory.regpair;
1847 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) {
1848 nl_dfs_reg = ar->dfs_detector->region;
1849 wmi_dfs_reg = ath10k_mac_get_dfs_region(nl_dfs_reg);
1851 wmi_dfs_reg = WMI_UNINIT_DFS_DOMAIN;
1854 /* Target allows setting up per-band regdomain but ath_common provides
1855 * a combined one only */
1856 ret = ath10k_wmi_pdev_set_regdomain(ar,
1857 regpair->reg_domain,
1858 regpair->reg_domain, /* 2ghz */
1859 regpair->reg_domain, /* 5ghz */
1860 regpair->reg_2ghz_ctl,
1861 regpair->reg_5ghz_ctl,
1864 ath10k_warn(ar, "failed to set pdev regdomain: %d\n", ret);
1867 static void ath10k_reg_notifier(struct wiphy *wiphy,
1868 struct regulatory_request *request)
1870 struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
1871 struct ath10k *ar = hw->priv;
1874 ath_reg_notifier_apply(wiphy, request, &ar->ath_common.regulatory);
1876 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) {
1877 ath10k_dbg(ar, ATH10K_DBG_REGULATORY, "dfs region 0x%x\n",
1878 request->dfs_region);
1879 result = ar->dfs_detector->set_dfs_domain(ar->dfs_detector,
1880 request->dfs_region);
1882 ath10k_warn(ar, "DFS region 0x%X not supported, will trigger radar for every pulse\n",
1883 request->dfs_region);
1886 mutex_lock(&ar->conf_mutex);
1887 if (ar->state == ATH10K_STATE_ON)
1888 ath10k_regd_update(ar);
1889 mutex_unlock(&ar->conf_mutex);
1896 static u8 ath10k_tx_h_get_tid(struct ieee80211_hdr *hdr)
1898 if (ieee80211_is_mgmt(hdr->frame_control))
1899 return HTT_DATA_TX_EXT_TID_MGMT;
1901 if (!ieee80211_is_data_qos(hdr->frame_control))
1902 return HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
1904 if (!is_unicast_ether_addr(ieee80211_get_DA(hdr)))
1905 return HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
1907 return ieee80211_get_qos_ctl(hdr)[0] & IEEE80211_QOS_CTL_TID_MASK;
1910 static u8 ath10k_tx_h_get_vdev_id(struct ath10k *ar, struct ieee80211_vif *vif)
1913 return ath10k_vif_to_arvif(vif)->vdev_id;
1915 if (ar->monitor_started)
1916 return ar->monitor_vdev_id;
1918 ath10k_warn(ar, "failed to resolve vdev id\n");
1922 /* HTT Tx uses Native Wifi tx mode which expects 802.11 frames without QoS
1923 * Control in the header.
1925 static void ath10k_tx_h_nwifi(struct ieee80211_hw *hw, struct sk_buff *skb)
1927 struct ieee80211_hdr *hdr = (void *)skb->data;
1928 struct ath10k_skb_cb *cb = ATH10K_SKB_CB(skb);
1931 if (!ieee80211_is_data_qos(hdr->frame_control))
1934 qos_ctl = ieee80211_get_qos_ctl(hdr);
1935 memmove(skb->data + IEEE80211_QOS_CTL_LEN,
1936 skb->data, (void *)qos_ctl - (void *)skb->data);
1937 skb_pull(skb, IEEE80211_QOS_CTL_LEN);
1939 /* Fw/Hw generates a corrupted QoS Control Field for QoS NullFunc
1940 * frames. Powersave is handled by the fw/hw so QoS NyllFunc frames are
1941 * used only for CQM purposes (e.g. hostapd station keepalive ping) so
1942 * it is safe to downgrade to NullFunc.
1944 if (ieee80211_is_qos_nullfunc(hdr->frame_control)) {
1945 hdr->frame_control &= ~__cpu_to_le16(IEEE80211_STYPE_QOS_DATA);
1946 cb->htt.tid = HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
1950 static void ath10k_tx_wep_key_work(struct work_struct *work)
1952 struct ath10k_vif *arvif = container_of(work, struct ath10k_vif,
1954 struct ath10k *ar = arvif->ar;
1955 int ret, keyidx = arvif->def_wep_key_newidx;
1957 mutex_lock(&arvif->ar->conf_mutex);
1959 if (arvif->ar->state != ATH10K_STATE_ON)
1962 if (arvif->def_wep_key_idx == keyidx)
1965 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d set keyidx %d\n",
1966 arvif->vdev_id, keyidx);
1968 ret = ath10k_wmi_vdev_set_param(arvif->ar,
1970 arvif->ar->wmi.vdev_param->def_keyid,
1973 ath10k_warn(ar, "failed to update wep key index for vdev %d: %d\n",
1979 arvif->def_wep_key_idx = keyidx;
1982 mutex_unlock(&arvif->ar->conf_mutex);
1985 static void ath10k_tx_h_update_wep_key(struct ieee80211_vif *vif,
1986 struct ieee80211_key_conf *key,
1987 struct sk_buff *skb)
1989 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1990 struct ath10k *ar = arvif->ar;
1991 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
1993 if (!ieee80211_has_protected(hdr->frame_control))
1999 if (key->cipher != WLAN_CIPHER_SUITE_WEP40 &&
2000 key->cipher != WLAN_CIPHER_SUITE_WEP104)
2003 if (key->keyidx == arvif->def_wep_key_idx)
2006 /* FIXME: Most likely a few frames will be TXed with an old key. Simply
2007 * queueing frames until key index is updated is not an option because
2008 * sk_buff may need more processing to be done, e.g. offchannel */
2009 arvif->def_wep_key_newidx = key->keyidx;
2010 ieee80211_queue_work(ar->hw, &arvif->wep_key_work);
2013 static void ath10k_tx_h_add_p2p_noa_ie(struct ath10k *ar,
2014 struct ieee80211_vif *vif,
2015 struct sk_buff *skb)
2017 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
2018 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2020 /* This is case only for P2P_GO */
2021 if (arvif->vdev_type != WMI_VDEV_TYPE_AP ||
2022 arvif->vdev_subtype != WMI_VDEV_SUBTYPE_P2P_GO)
2025 if (unlikely(ieee80211_is_probe_resp(hdr->frame_control))) {
2026 spin_lock_bh(&ar->data_lock);
2027 if (arvif->u.ap.noa_data)
2028 if (!pskb_expand_head(skb, 0, arvif->u.ap.noa_len,
2030 memcpy(skb_put(skb, arvif->u.ap.noa_len),
2031 arvif->u.ap.noa_data,
2032 arvif->u.ap.noa_len);
2033 spin_unlock_bh(&ar->data_lock);
2037 static bool ath10k_mac_need_offchan_tx_work(struct ath10k *ar)
2039 /* FIXME: Not really sure since when the behaviour changed. At some
2040 * point new firmware stopped requiring creation of peer entries for
2041 * offchannel tx (and actually creating them causes issues with wmi-htc
2042 * tx credit replenishment and reliability). Assuming it's at least 3.4
2043 * because that's when the `freq` was introduced to TX_FRM HTT command.
2045 return !(ar->htt.target_version_major >= 3 &&
2046 ar->htt.target_version_minor >= 4);
2049 static void ath10k_tx_htt(struct ath10k *ar, struct sk_buff *skb)
2051 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
2054 if (ar->htt.target_version_major >= 3) {
2055 /* Since HTT 3.0 there is no separate mgmt tx command */
2056 ret = ath10k_htt_tx(&ar->htt, skb);
2060 if (ieee80211_is_mgmt(hdr->frame_control)) {
2061 if (test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX,
2063 if (skb_queue_len(&ar->wmi_mgmt_tx_queue) >=
2064 ATH10K_MAX_NUM_MGMT_PENDING) {
2065 ath10k_warn(ar, "reached WMI management transmit queue limit\n");
2070 skb_queue_tail(&ar->wmi_mgmt_tx_queue, skb);
2071 ieee80211_queue_work(ar->hw, &ar->wmi_mgmt_tx_work);
2073 ret = ath10k_htt_mgmt_tx(&ar->htt, skb);
2075 } else if (!test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX,
2077 ieee80211_is_nullfunc(hdr->frame_control)) {
2078 /* FW does not report tx status properly for NullFunc frames
2079 * unless they are sent through mgmt tx path. mac80211 sends
2080 * those frames when it detects link/beacon loss and depends
2081 * on the tx status to be correct. */
2082 ret = ath10k_htt_mgmt_tx(&ar->htt, skb);
2084 ret = ath10k_htt_tx(&ar->htt, skb);
2089 ath10k_warn(ar, "failed to transmit packet, dropping: %d\n",
2091 ieee80211_free_txskb(ar->hw, skb);
2095 void ath10k_offchan_tx_purge(struct ath10k *ar)
2097 struct sk_buff *skb;
2100 skb = skb_dequeue(&ar->offchan_tx_queue);
2104 ieee80211_free_txskb(ar->hw, skb);
2108 void ath10k_offchan_tx_work(struct work_struct *work)
2110 struct ath10k *ar = container_of(work, struct ath10k, offchan_tx_work);
2111 struct ath10k_peer *peer;
2112 struct ieee80211_hdr *hdr;
2113 struct sk_buff *skb;
2114 const u8 *peer_addr;
2118 /* FW requirement: We must create a peer before FW will send out
2119 * an offchannel frame. Otherwise the frame will be stuck and
2120 * never transmitted. We delete the peer upon tx completion.
2121 * It is unlikely that a peer for offchannel tx will already be
2122 * present. However it may be in some rare cases so account for that.
2123 * Otherwise we might remove a legitimate peer and break stuff. */
2126 skb = skb_dequeue(&ar->offchan_tx_queue);
2130 mutex_lock(&ar->conf_mutex);
2132 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac offchannel skb %p\n",
2135 hdr = (struct ieee80211_hdr *)skb->data;
2136 peer_addr = ieee80211_get_DA(hdr);
2137 vdev_id = ATH10K_SKB_CB(skb)->vdev_id;
2139 spin_lock_bh(&ar->data_lock);
2140 peer = ath10k_peer_find(ar, vdev_id, peer_addr);
2141 spin_unlock_bh(&ar->data_lock);
2144 /* FIXME: should this use ath10k_warn()? */
2145 ath10k_dbg(ar, ATH10K_DBG_MAC, "peer %pM on vdev %d already present\n",
2146 peer_addr, vdev_id);
2149 ret = ath10k_peer_create(ar, vdev_id, peer_addr);
2151 ath10k_warn(ar, "failed to create peer %pM on vdev %d: %d\n",
2152 peer_addr, vdev_id, ret);
2155 spin_lock_bh(&ar->data_lock);
2156 reinit_completion(&ar->offchan_tx_completed);
2157 ar->offchan_tx_skb = skb;
2158 spin_unlock_bh(&ar->data_lock);
2160 ath10k_tx_htt(ar, skb);
2162 ret = wait_for_completion_timeout(&ar->offchan_tx_completed,
2165 ath10k_warn(ar, "timed out waiting for offchannel skb %p\n",
2169 ret = ath10k_peer_delete(ar, vdev_id, peer_addr);
2171 ath10k_warn(ar, "failed to delete peer %pM on vdev %d: %d\n",
2172 peer_addr, vdev_id, ret);
2175 mutex_unlock(&ar->conf_mutex);
2179 void ath10k_mgmt_over_wmi_tx_purge(struct ath10k *ar)
2181 struct sk_buff *skb;
2184 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
2188 ieee80211_free_txskb(ar->hw, skb);
2192 void ath10k_mgmt_over_wmi_tx_work(struct work_struct *work)
2194 struct ath10k *ar = container_of(work, struct ath10k, wmi_mgmt_tx_work);
2195 struct sk_buff *skb;
2199 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
2203 ret = ath10k_wmi_mgmt_tx(ar, skb);
2205 ath10k_warn(ar, "failed to transmit management frame via WMI: %d\n",
2207 ieee80211_free_txskb(ar->hw, skb);
2216 void __ath10k_scan_finish(struct ath10k *ar)
2218 lockdep_assert_held(&ar->data_lock);
2220 switch (ar->scan.state) {
2221 case ATH10K_SCAN_IDLE:
2223 case ATH10K_SCAN_RUNNING:
2224 if (ar->scan.is_roc)
2225 ieee80211_remain_on_channel_expired(ar->hw);
2226 case ATH10K_SCAN_ABORTING:
2227 if (!ar->scan.is_roc)
2228 ieee80211_scan_completed(ar->hw,
2230 ATH10K_SCAN_ABORTING));
2232 case ATH10K_SCAN_STARTING:
2233 ar->scan.state = ATH10K_SCAN_IDLE;
2234 ar->scan_channel = NULL;
2235 ath10k_offchan_tx_purge(ar);
2236 cancel_delayed_work(&ar->scan.timeout);
2237 complete_all(&ar->scan.completed);
2242 void ath10k_scan_finish(struct ath10k *ar)
2244 spin_lock_bh(&ar->data_lock);
2245 __ath10k_scan_finish(ar);
2246 spin_unlock_bh(&ar->data_lock);
2249 static int ath10k_scan_stop(struct ath10k *ar)
2251 struct wmi_stop_scan_arg arg = {
2252 .req_id = 1, /* FIXME */
2253 .req_type = WMI_SCAN_STOP_ONE,
2254 .u.scan_id = ATH10K_SCAN_ID,
2258 lockdep_assert_held(&ar->conf_mutex);
2260 ret = ath10k_wmi_stop_scan(ar, &arg);
2262 ath10k_warn(ar, "failed to stop wmi scan: %d\n", ret);
2266 ret = wait_for_completion_timeout(&ar->scan.completed, 3*HZ);
2268 ath10k_warn(ar, "failed to receive scan abortion completion: timed out\n");
2270 } else if (ret > 0) {
2275 /* Scan state should be updated upon scan completion but in case
2276 * firmware fails to deliver the event (for whatever reason) it is
2277 * desired to clean up scan state anyway. Firmware may have just
2278 * dropped the scan completion event delivery due to transport pipe
2279 * being overflown with data and/or it can recover on its own before
2280 * next scan request is submitted.
2282 spin_lock_bh(&ar->data_lock);
2283 if (ar->scan.state != ATH10K_SCAN_IDLE)
2284 __ath10k_scan_finish(ar);
2285 spin_unlock_bh(&ar->data_lock);
2290 static void ath10k_scan_abort(struct ath10k *ar)
2294 lockdep_assert_held(&ar->conf_mutex);
2296 spin_lock_bh(&ar->data_lock);
2298 switch (ar->scan.state) {
2299 case ATH10K_SCAN_IDLE:
2300 /* This can happen if timeout worker kicked in and called
2301 * abortion while scan completion was being processed.
2304 case ATH10K_SCAN_STARTING:
2305 case ATH10K_SCAN_ABORTING:
2306 ath10k_warn(ar, "refusing scan abortion due to invalid scan state: %s (%d)\n",
2307 ath10k_scan_state_str(ar->scan.state),
2310 case ATH10K_SCAN_RUNNING:
2311 ar->scan.state = ATH10K_SCAN_ABORTING;
2312 spin_unlock_bh(&ar->data_lock);
2314 ret = ath10k_scan_stop(ar);
2316 ath10k_warn(ar, "failed to abort scan: %d\n", ret);
2318 spin_lock_bh(&ar->data_lock);
2322 spin_unlock_bh(&ar->data_lock);
2325 void ath10k_scan_timeout_work(struct work_struct *work)
2327 struct ath10k *ar = container_of(work, struct ath10k,
2330 mutex_lock(&ar->conf_mutex);
2331 ath10k_scan_abort(ar);
2332 mutex_unlock(&ar->conf_mutex);
2335 static int ath10k_start_scan(struct ath10k *ar,
2336 const struct wmi_start_scan_arg *arg)
2340 lockdep_assert_held(&ar->conf_mutex);
2342 ret = ath10k_wmi_start_scan(ar, arg);
2346 ret = wait_for_completion_timeout(&ar->scan.started, 1*HZ);
2348 ret = ath10k_scan_stop(ar);
2350 ath10k_warn(ar, "failed to stop scan: %d\n", ret);
2355 /* Add a 200ms margin to account for event/command processing */
2356 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
2357 msecs_to_jiffies(arg->max_scan_time+200));
2361 /**********************/
2362 /* mac80211 callbacks */
2363 /**********************/
2365 static void ath10k_tx(struct ieee80211_hw *hw,
2366 struct ieee80211_tx_control *control,
2367 struct sk_buff *skb)
2369 struct ath10k *ar = hw->priv;
2370 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
2371 struct ieee80211_vif *vif = info->control.vif;
2372 struct ieee80211_key_conf *key = info->control.hw_key;
2373 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
2375 /* We should disable CCK RATE due to P2P */
2376 if (info->flags & IEEE80211_TX_CTL_NO_CCK_RATE)
2377 ath10k_dbg(ar, ATH10K_DBG_MAC, "IEEE80211_TX_CTL_NO_CCK_RATE\n");
2379 ATH10K_SKB_CB(skb)->htt.is_offchan = false;
2380 ATH10K_SKB_CB(skb)->htt.tid = ath10k_tx_h_get_tid(hdr);
2381 ATH10K_SKB_CB(skb)->vdev_id = ath10k_tx_h_get_vdev_id(ar, vif);
2383 /* it makes no sense to process injected frames like that */
2384 if (vif && vif->type != NL80211_IFTYPE_MONITOR) {
2385 ath10k_tx_h_nwifi(hw, skb);
2386 ath10k_tx_h_update_wep_key(vif, key, skb);
2387 ath10k_tx_h_add_p2p_noa_ie(ar, vif, skb);
2388 ath10k_tx_h_seq_no(vif, skb);
2391 if (info->flags & IEEE80211_TX_CTL_TX_OFFCHAN) {
2392 spin_lock_bh(&ar->data_lock);
2393 ATH10K_SKB_CB(skb)->htt.freq = ar->scan.roc_freq;
2394 ATH10K_SKB_CB(skb)->vdev_id = ar->scan.vdev_id;
2395 spin_unlock_bh(&ar->data_lock);
2397 if (ath10k_mac_need_offchan_tx_work(ar)) {
2398 ATH10K_SKB_CB(skb)->htt.freq = 0;
2399 ATH10K_SKB_CB(skb)->htt.is_offchan = true;
2401 ath10k_dbg(ar, ATH10K_DBG_MAC, "queued offchannel skb %p\n",
2404 skb_queue_tail(&ar->offchan_tx_queue, skb);
2405 ieee80211_queue_work(hw, &ar->offchan_tx_work);
2410 ath10k_tx_htt(ar, skb);
2413 /* Must not be called with conf_mutex held as workers can use that also. */
2414 void ath10k_drain_tx(struct ath10k *ar)
2416 /* make sure rcu-protected mac80211 tx path itself is drained */
2419 ath10k_offchan_tx_purge(ar);
2420 ath10k_mgmt_over_wmi_tx_purge(ar);
2422 cancel_work_sync(&ar->offchan_tx_work);
2423 cancel_work_sync(&ar->wmi_mgmt_tx_work);
2426 void ath10k_halt(struct ath10k *ar)
2428 struct ath10k_vif *arvif;
2430 lockdep_assert_held(&ar->conf_mutex);
2432 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
2433 ar->filter_flags = 0;
2434 ar->monitor = false;
2436 if (ar->monitor_started)
2437 ath10k_monitor_stop(ar);
2439 ar->monitor_started = false;
2441 ath10k_scan_finish(ar);
2442 ath10k_peer_cleanup_all(ar);
2443 ath10k_core_stop(ar);
2444 ath10k_hif_power_down(ar);
2446 spin_lock_bh(&ar->data_lock);
2447 list_for_each_entry(arvif, &ar->arvifs, list)
2448 ath10k_mac_vif_beacon_cleanup(arvif);
2449 spin_unlock_bh(&ar->data_lock);
2452 static int ath10k_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant)
2454 struct ath10k *ar = hw->priv;
2456 mutex_lock(&ar->conf_mutex);
2458 if (ar->cfg_tx_chainmask) {
2459 *tx_ant = ar->cfg_tx_chainmask;
2460 *rx_ant = ar->cfg_rx_chainmask;
2462 *tx_ant = ar->supp_tx_chainmask;
2463 *rx_ant = ar->supp_rx_chainmask;
2466 mutex_unlock(&ar->conf_mutex);
2471 static void ath10k_check_chain_mask(struct ath10k *ar, u32 cm, const char *dbg)
2473 /* It is not clear that allowing gaps in chainmask
2474 * is helpful. Probably it will not do what user
2475 * is hoping for, so warn in that case.
2477 if (cm == 15 || cm == 7 || cm == 3 || cm == 1 || cm == 0)
2480 ath10k_warn(ar, "mac %s antenna chainmask may be invalid: 0x%x. Suggested values: 15, 7, 3, 1 or 0.\n",
2484 static int __ath10k_set_antenna(struct ath10k *ar, u32 tx_ant, u32 rx_ant)
2488 lockdep_assert_held(&ar->conf_mutex);
2490 ath10k_check_chain_mask(ar, tx_ant, "tx");
2491 ath10k_check_chain_mask(ar, rx_ant, "rx");
2493 ar->cfg_tx_chainmask = tx_ant;
2494 ar->cfg_rx_chainmask = rx_ant;
2496 if ((ar->state != ATH10K_STATE_ON) &&
2497 (ar->state != ATH10K_STATE_RESTARTED))
2500 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->tx_chain_mask,
2503 ath10k_warn(ar, "failed to set tx-chainmask: %d, req 0x%x\n",
2508 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->rx_chain_mask,
2511 ath10k_warn(ar, "failed to set rx-chainmask: %d, req 0x%x\n",
2519 static int ath10k_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)
2521 struct ath10k *ar = hw->priv;
2524 mutex_lock(&ar->conf_mutex);
2525 ret = __ath10k_set_antenna(ar, tx_ant, rx_ant);
2526 mutex_unlock(&ar->conf_mutex);
2530 static int ath10k_start(struct ieee80211_hw *hw)
2532 struct ath10k *ar = hw->priv;
2536 * This makes sense only when restarting hw. It is harmless to call
2537 * uncoditionally. This is necessary to make sure no HTT/WMI tx
2538 * commands will be submitted while restarting.
2540 ath10k_drain_tx(ar);
2542 mutex_lock(&ar->conf_mutex);
2544 switch (ar->state) {
2545 case ATH10K_STATE_OFF:
2546 ar->state = ATH10K_STATE_ON;
2548 case ATH10K_STATE_RESTARTING:
2550 ar->state = ATH10K_STATE_RESTARTED;
2552 case ATH10K_STATE_ON:
2553 case ATH10K_STATE_RESTARTED:
2554 case ATH10K_STATE_WEDGED:
2558 case ATH10K_STATE_UTF:
2563 ret = ath10k_hif_power_up(ar);
2565 ath10k_err(ar, "Could not init hif: %d\n", ret);
2569 ret = ath10k_core_start(ar, ATH10K_FIRMWARE_MODE_NORMAL);
2571 ath10k_err(ar, "Could not init core: %d\n", ret);
2572 goto err_power_down;
2575 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->pmf_qos, 1);
2577 ath10k_warn(ar, "failed to enable PMF QOS: %d\n", ret);
2581 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->dynamic_bw, 1);
2583 ath10k_warn(ar, "failed to enable dynamic BW: %d\n", ret);
2587 if (ar->cfg_tx_chainmask)
2588 __ath10k_set_antenna(ar, ar->cfg_tx_chainmask,
2589 ar->cfg_rx_chainmask);
2592 * By default FW set ARP frames ac to voice (6). In that case ARP
2593 * exchange is not working properly for UAPSD enabled AP. ARP requests
2594 * which arrives with access category 0 are processed by network stack
2595 * and send back with access category 0, but FW changes access category
2596 * to 6. Set ARP frames access category to best effort (0) solves
2600 ret = ath10k_wmi_pdev_set_param(ar,
2601 ar->wmi.pdev_param->arp_ac_override, 0);
2603 ath10k_warn(ar, "failed to set arp ac override parameter: %d\n",
2608 ar->num_started_vdevs = 0;
2609 ath10k_regd_update(ar);
2611 ath10k_spectral_start(ar);
2613 mutex_unlock(&ar->conf_mutex);
2617 ath10k_core_stop(ar);
2620 ath10k_hif_power_down(ar);
2623 ar->state = ATH10K_STATE_OFF;
2626 mutex_unlock(&ar->conf_mutex);
2630 static void ath10k_stop(struct ieee80211_hw *hw)
2632 struct ath10k *ar = hw->priv;
2634 ath10k_drain_tx(ar);
2636 mutex_lock(&ar->conf_mutex);
2637 if (ar->state != ATH10K_STATE_OFF) {
2639 ar->state = ATH10K_STATE_OFF;
2641 mutex_unlock(&ar->conf_mutex);
2643 cancel_delayed_work_sync(&ar->scan.timeout);
2644 cancel_work_sync(&ar->restart_work);
2647 static int ath10k_config_ps(struct ath10k *ar)
2649 struct ath10k_vif *arvif;
2652 lockdep_assert_held(&ar->conf_mutex);
2654 list_for_each_entry(arvif, &ar->arvifs, list) {
2655 ret = ath10k_mac_vif_setup_ps(arvif);
2657 ath10k_warn(ar, "failed to setup powersave: %d\n", ret);
2665 static const char *chandef_get_width(enum nl80211_chan_width width)
2668 case NL80211_CHAN_WIDTH_20_NOHT:
2670 case NL80211_CHAN_WIDTH_20:
2672 case NL80211_CHAN_WIDTH_40:
2674 case NL80211_CHAN_WIDTH_80:
2676 case NL80211_CHAN_WIDTH_80P80:
2678 case NL80211_CHAN_WIDTH_160:
2680 case NL80211_CHAN_WIDTH_5:
2682 case NL80211_CHAN_WIDTH_10:
2688 static void ath10k_config_chan(struct ath10k *ar)
2690 struct ath10k_vif *arvif;
2693 lockdep_assert_held(&ar->conf_mutex);
2695 ath10k_dbg(ar, ATH10K_DBG_MAC,
2696 "mac config channel to %dMHz (cf1 %dMHz cf2 %dMHz width %s)\n",
2697 ar->chandef.chan->center_freq,
2698 ar->chandef.center_freq1,
2699 ar->chandef.center_freq2,
2700 chandef_get_width(ar->chandef.width));
2702 /* First stop monitor interface. Some FW versions crash if there's a
2703 * lone monitor interface. */
2704 if (ar->monitor_started)
2705 ath10k_monitor_stop(ar);
2707 list_for_each_entry(arvif, &ar->arvifs, list) {
2708 if (!arvif->is_started)
2714 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
2717 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
2719 ath10k_warn(ar, "failed to down vdev %d: %d\n",
2720 arvif->vdev_id, ret);
2725 /* all vdevs are downed now - attempt to restart and re-up them */
2727 list_for_each_entry(arvif, &ar->arvifs, list) {
2728 if (!arvif->is_started)
2731 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
2734 ret = ath10k_vdev_restart(arvif);
2736 ath10k_warn(ar, "failed to restart vdev %d: %d\n",
2737 arvif->vdev_id, ret);
2744 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
2747 ath10k_warn(ar, "failed to bring vdev up %d: %d\n",
2748 arvif->vdev_id, ret);
2753 ath10k_monitor_recalc(ar);
2756 static int ath10k_mac_txpower_setup(struct ath10k *ar, int txpower)
2761 lockdep_assert_held(&ar->conf_mutex);
2763 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac txpower %d\n", txpower);
2765 param = ar->wmi.pdev_param->txpower_limit2g;
2766 ret = ath10k_wmi_pdev_set_param(ar, param, txpower * 2);
2768 ath10k_warn(ar, "failed to set 2g txpower %d: %d\n",
2773 param = ar->wmi.pdev_param->txpower_limit5g;
2774 ret = ath10k_wmi_pdev_set_param(ar, param, txpower * 2);
2776 ath10k_warn(ar, "failed to set 5g txpower %d: %d\n",
2784 static int ath10k_mac_txpower_recalc(struct ath10k *ar)
2786 struct ath10k_vif *arvif;
2787 int ret, txpower = -1;
2789 lockdep_assert_held(&ar->conf_mutex);
2791 list_for_each_entry(arvif, &ar->arvifs, list) {
2792 WARN_ON(arvif->txpower < 0);
2795 txpower = arvif->txpower;
2797 txpower = min(txpower, arvif->txpower);
2800 if (WARN_ON(txpower == -1))
2803 ret = ath10k_mac_txpower_setup(ar, txpower);
2805 ath10k_warn(ar, "failed to setup tx power %d: %d\n",
2813 static int ath10k_config(struct ieee80211_hw *hw, u32 changed)
2815 struct ath10k *ar = hw->priv;
2816 struct ieee80211_conf *conf = &hw->conf;
2819 mutex_lock(&ar->conf_mutex);
2821 if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
2822 ath10k_dbg(ar, ATH10K_DBG_MAC,
2823 "mac config channel %dMHz flags 0x%x radar %d\n",
2824 conf->chandef.chan->center_freq,
2825 conf->chandef.chan->flags,
2826 conf->radar_enabled);
2828 spin_lock_bh(&ar->data_lock);
2829 ar->rx_channel = conf->chandef.chan;
2830 spin_unlock_bh(&ar->data_lock);
2832 ar->radar_enabled = conf->radar_enabled;
2833 ath10k_recalc_radar_detection(ar);
2835 if (!cfg80211_chandef_identical(&ar->chandef, &conf->chandef)) {
2836 ar->chandef = conf->chandef;
2837 ath10k_config_chan(ar);
2841 if (changed & IEEE80211_CONF_CHANGE_PS)
2842 ath10k_config_ps(ar);
2844 if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
2845 ar->monitor = conf->flags & IEEE80211_CONF_MONITOR;
2846 ret = ath10k_monitor_recalc(ar);
2848 ath10k_warn(ar, "failed to recalc monitor: %d\n", ret);
2851 mutex_unlock(&ar->conf_mutex);
2855 static u32 get_nss_from_chainmask(u16 chain_mask)
2857 if ((chain_mask & 0x15) == 0x15)
2859 else if ((chain_mask & 0x7) == 0x7)
2861 else if ((chain_mask & 0x3) == 0x3)
2868 * Figure out how to handle WMI_VDEV_SUBTYPE_P2P_DEVICE,
2869 * because we will send mgmt frames without CCK. This requirement
2870 * for P2P_FIND/GO_NEG should be handled by checking CCK flag
2873 static int ath10k_add_interface(struct ieee80211_hw *hw,
2874 struct ieee80211_vif *vif)
2876 struct ath10k *ar = hw->priv;
2877 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2878 enum wmi_sta_powersave_param param;
2884 mutex_lock(&ar->conf_mutex);
2886 memset(arvif, 0, sizeof(*arvif));
2891 INIT_WORK(&arvif->wep_key_work, ath10k_tx_wep_key_work);
2892 INIT_LIST_HEAD(&arvif->list);
2894 if (ar->free_vdev_map == 0) {
2895 ath10k_warn(ar, "Free vdev map is empty, no more interfaces allowed.\n");
2899 bit = __ffs64(ar->free_vdev_map);
2901 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac create vdev %i map %llx\n",
2902 bit, ar->free_vdev_map);
2904 arvif->vdev_id = bit;
2905 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE;
2908 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_DEVICE;
2910 switch (vif->type) {
2911 case NL80211_IFTYPE_UNSPECIFIED:
2912 case NL80211_IFTYPE_STATION:
2913 arvif->vdev_type = WMI_VDEV_TYPE_STA;
2915 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_CLIENT;
2917 case NL80211_IFTYPE_ADHOC:
2918 arvif->vdev_type = WMI_VDEV_TYPE_IBSS;
2920 case NL80211_IFTYPE_AP:
2921 arvif->vdev_type = WMI_VDEV_TYPE_AP;
2924 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_GO;
2926 case NL80211_IFTYPE_MONITOR:
2927 arvif->vdev_type = WMI_VDEV_TYPE_MONITOR;
2934 /* Some firmware revisions don't wait for beacon tx completion before
2935 * sending another SWBA event. This could lead to hardware using old
2936 * (freed) beacon data in some cases, e.g. tx credit starvation
2937 * combined with missed TBTT. This is very very rare.
2939 * On non-IOMMU-enabled hosts this could be a possible security issue
2940 * because hw could beacon some random data on the air. On
2941 * IOMMU-enabled hosts DMAR faults would occur in most cases and target
2942 * device would crash.
2944 * Since there are no beacon tx completions (implicit nor explicit)
2945 * propagated to host the only workaround for this is to allocate a
2946 * DMA-coherent buffer for a lifetime of a vif and use it for all
2947 * beacon tx commands. Worst case for this approach is some beacons may
2948 * become corrupted, e.g. have garbled IEs or out-of-date TIM bitmap.
2950 if (vif->type == NL80211_IFTYPE_ADHOC ||
2951 vif->type == NL80211_IFTYPE_AP) {
2952 arvif->beacon_buf = dma_zalloc_coherent(ar->dev,
2953 IEEE80211_MAX_FRAME_LEN,
2954 &arvif->beacon_paddr,
2956 if (!arvif->beacon_buf) {
2958 ath10k_warn(ar, "failed to allocate beacon buffer: %d\n",
2964 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev create %d (add interface) type %d subtype %d bcnmode %s\n",
2965 arvif->vdev_id, arvif->vdev_type, arvif->vdev_subtype,
2966 arvif->beacon_buf ? "single-buf" : "per-skb");
2968 ret = ath10k_wmi_vdev_create(ar, arvif->vdev_id, arvif->vdev_type,
2969 arvif->vdev_subtype, vif->addr);
2971 ath10k_warn(ar, "failed to create WMI vdev %i: %d\n",
2972 arvif->vdev_id, ret);
2976 ar->free_vdev_map &= ~(1LL << arvif->vdev_id);
2977 list_add(&arvif->list, &ar->arvifs);
2979 vdev_param = ar->wmi.vdev_param->def_keyid;
2980 ret = ath10k_wmi_vdev_set_param(ar, 0, vdev_param,
2981 arvif->def_wep_key_idx);
2983 ath10k_warn(ar, "failed to set vdev %i default key id: %d\n",
2984 arvif->vdev_id, ret);
2985 goto err_vdev_delete;
2988 vdev_param = ar->wmi.vdev_param->tx_encap_type;
2989 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
2990 ATH10K_HW_TXRX_NATIVE_WIFI);
2991 /* 10.X firmware does not support this VDEV parameter. Do not warn */
2992 if (ret && ret != -EOPNOTSUPP) {
2993 ath10k_warn(ar, "failed to set vdev %i TX encapsulation: %d\n",
2994 arvif->vdev_id, ret);
2995 goto err_vdev_delete;
2998 if (ar->cfg_tx_chainmask) {
2999 u16 nss = get_nss_from_chainmask(ar->cfg_tx_chainmask);
3001 vdev_param = ar->wmi.vdev_param->nss;
3002 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
3005 ath10k_warn(ar, "failed to set vdev %i chainmask 0x%x, nss %i: %d\n",
3006 arvif->vdev_id, ar->cfg_tx_chainmask, nss,
3008 goto err_vdev_delete;
3012 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
3013 ret = ath10k_peer_create(ar, arvif->vdev_id, vif->addr);
3015 ath10k_warn(ar, "failed to create vdev %i peer for AP: %d\n",
3016 arvif->vdev_id, ret);
3017 goto err_vdev_delete;
3020 ret = ath10k_mac_set_kickout(arvif);
3022 ath10k_warn(ar, "failed to set vdev %i kickout parameters: %d\n",
3023 arvif->vdev_id, ret);
3024 goto err_peer_delete;
3028 if (arvif->vdev_type == WMI_VDEV_TYPE_STA) {
3029 param = WMI_STA_PS_PARAM_RX_WAKE_POLICY;
3030 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
3031 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
3034 ath10k_warn(ar, "failed to set vdev %i RX wake policy: %d\n",
3035 arvif->vdev_id, ret);
3036 goto err_peer_delete;
3039 param = WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD;
3040 value = WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS;
3041 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
3044 ath10k_warn(ar, "failed to set vdev %i TX wake thresh: %d\n",
3045 arvif->vdev_id, ret);
3046 goto err_peer_delete;
3049 param = WMI_STA_PS_PARAM_PSPOLL_COUNT;
3050 value = WMI_STA_PS_PSPOLL_COUNT_NO_MAX;
3051 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
3054 ath10k_warn(ar, "failed to set vdev %i PSPOLL count: %d\n",
3055 arvif->vdev_id, ret);
3056 goto err_peer_delete;
3060 ret = ath10k_mac_set_rts(arvif, ar->hw->wiphy->rts_threshold);
3062 ath10k_warn(ar, "failed to set rts threshold for vdev %d: %d\n",
3063 arvif->vdev_id, ret);
3064 goto err_peer_delete;
3067 ret = ath10k_mac_set_frag(arvif, ar->hw->wiphy->frag_threshold);
3069 ath10k_warn(ar, "failed to set frag threshold for vdev %d: %d\n",
3070 arvif->vdev_id, ret);
3071 goto err_peer_delete;
3074 arvif->txpower = vif->bss_conf.txpower;
3075 ret = ath10k_mac_txpower_recalc(ar);
3077 ath10k_warn(ar, "failed to recalc tx power: %d\n", ret);
3078 goto err_peer_delete;
3081 mutex_unlock(&ar->conf_mutex);
3085 if (arvif->vdev_type == WMI_VDEV_TYPE_AP)
3086 ath10k_wmi_peer_delete(ar, arvif->vdev_id, vif->addr);
3089 ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
3090 ar->free_vdev_map |= 1LL << arvif->vdev_id;
3091 list_del(&arvif->list);
3094 if (arvif->beacon_buf) {
3095 dma_free_coherent(ar->dev, IEEE80211_MAX_FRAME_LEN,
3096 arvif->beacon_buf, arvif->beacon_paddr);
3097 arvif->beacon_buf = NULL;
3100 mutex_unlock(&ar->conf_mutex);
3105 static void ath10k_remove_interface(struct ieee80211_hw *hw,
3106 struct ieee80211_vif *vif)
3108 struct ath10k *ar = hw->priv;
3109 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3112 cancel_work_sync(&arvif->wep_key_work);
3114 mutex_lock(&ar->conf_mutex);
3116 spin_lock_bh(&ar->data_lock);
3117 ath10k_mac_vif_beacon_cleanup(arvif);
3118 spin_unlock_bh(&ar->data_lock);
3120 ret = ath10k_spectral_vif_stop(arvif);
3122 ath10k_warn(ar, "failed to stop spectral for vdev %i: %d\n",
3123 arvif->vdev_id, ret);
3125 ar->free_vdev_map |= 1LL << arvif->vdev_id;
3126 list_del(&arvif->list);
3128 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
3129 ret = ath10k_peer_delete(arvif->ar, arvif->vdev_id, vif->addr);
3131 ath10k_warn(ar, "failed to remove peer for AP vdev %i: %d\n",
3132 arvif->vdev_id, ret);
3134 kfree(arvif->u.ap.noa_data);
3137 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i delete (remove interface)\n",
3140 ret = ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
3142 ath10k_warn(ar, "failed to delete WMI vdev %i: %d\n",
3143 arvif->vdev_id, ret);
3145 ath10k_peer_cleanup(ar, arvif->vdev_id);
3147 mutex_unlock(&ar->conf_mutex);
3151 * FIXME: Has to be verified.
3153 #define SUPPORTED_FILTERS \
3154 (FIF_PROMISC_IN_BSS | \
3159 FIF_BCN_PRBRESP_PROMISC | \
3163 static void ath10k_configure_filter(struct ieee80211_hw *hw,
3164 unsigned int changed_flags,
3165 unsigned int *total_flags,
3168 struct ath10k *ar = hw->priv;
3171 mutex_lock(&ar->conf_mutex);
3173 changed_flags &= SUPPORTED_FILTERS;
3174 *total_flags &= SUPPORTED_FILTERS;
3175 ar->filter_flags = *total_flags;
3177 ret = ath10k_monitor_recalc(ar);
3179 ath10k_warn(ar, "failed to recalc montior: %d\n", ret);
3181 mutex_unlock(&ar->conf_mutex);
3184 static void ath10k_bss_info_changed(struct ieee80211_hw *hw,
3185 struct ieee80211_vif *vif,
3186 struct ieee80211_bss_conf *info,
3189 struct ath10k *ar = hw->priv;
3190 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3192 u32 vdev_param, pdev_param, slottime, preamble;
3194 mutex_lock(&ar->conf_mutex);
3196 if (changed & BSS_CHANGED_IBSS)
3197 ath10k_control_ibss(arvif, info, vif->addr);
3199 if (changed & BSS_CHANGED_BEACON_INT) {
3200 arvif->beacon_interval = info->beacon_int;
3201 vdev_param = ar->wmi.vdev_param->beacon_interval;
3202 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
3203 arvif->beacon_interval);
3204 ath10k_dbg(ar, ATH10K_DBG_MAC,
3205 "mac vdev %d beacon_interval %d\n",
3206 arvif->vdev_id, arvif->beacon_interval);
3209 ath10k_warn(ar, "failed to set beacon interval for vdev %d: %i\n",
3210 arvif->vdev_id, ret);
3213 if (changed & BSS_CHANGED_BEACON) {
3214 ath10k_dbg(ar, ATH10K_DBG_MAC,
3215 "vdev %d set beacon tx mode to staggered\n",
3218 pdev_param = ar->wmi.pdev_param->beacon_tx_mode;
3219 ret = ath10k_wmi_pdev_set_param(ar, pdev_param,
3220 WMI_BEACON_STAGGERED_MODE);
3222 ath10k_warn(ar, "failed to set beacon mode for vdev %d: %i\n",
3223 arvif->vdev_id, ret);
3226 if (changed & BSS_CHANGED_BEACON_INFO) {
3227 arvif->dtim_period = info->dtim_period;
3229 ath10k_dbg(ar, ATH10K_DBG_MAC,
3230 "mac vdev %d dtim_period %d\n",
3231 arvif->vdev_id, arvif->dtim_period);
3233 vdev_param = ar->wmi.vdev_param->dtim_period;
3234 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
3235 arvif->dtim_period);
3237 ath10k_warn(ar, "failed to set dtim period for vdev %d: %i\n",
3238 arvif->vdev_id, ret);
3241 if (changed & BSS_CHANGED_SSID &&
3242 vif->type == NL80211_IFTYPE_AP) {
3243 arvif->u.ap.ssid_len = info->ssid_len;
3245 memcpy(arvif->u.ap.ssid, info->ssid, info->ssid_len);
3246 arvif->u.ap.hidden_ssid = info->hidden_ssid;
3249 if (changed & BSS_CHANGED_BSSID && !is_zero_ether_addr(info->bssid))
3250 ether_addr_copy(arvif->bssid, info->bssid);
3252 if (changed & BSS_CHANGED_BEACON_ENABLED)
3253 ath10k_control_beaconing(arvif, info);
3255 if (changed & BSS_CHANGED_ERP_CTS_PROT) {
3256 arvif->use_cts_prot = info->use_cts_prot;
3257 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d cts_prot %d\n",
3258 arvif->vdev_id, info->use_cts_prot);
3260 ret = ath10k_recalc_rtscts_prot(arvif);
3262 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
3263 arvif->vdev_id, ret);
3266 if (changed & BSS_CHANGED_ERP_SLOT) {
3267 if (info->use_short_slot)
3268 slottime = WMI_VDEV_SLOT_TIME_SHORT; /* 9us */
3271 slottime = WMI_VDEV_SLOT_TIME_LONG; /* 20us */
3273 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d slot_time %d\n",
3274 arvif->vdev_id, slottime);
3276 vdev_param = ar->wmi.vdev_param->slot_time;
3277 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
3280 ath10k_warn(ar, "failed to set erp slot for vdev %d: %i\n",
3281 arvif->vdev_id, ret);
3284 if (changed & BSS_CHANGED_ERP_PREAMBLE) {
3285 if (info->use_short_preamble)
3286 preamble = WMI_VDEV_PREAMBLE_SHORT;
3288 preamble = WMI_VDEV_PREAMBLE_LONG;
3290 ath10k_dbg(ar, ATH10K_DBG_MAC,
3291 "mac vdev %d preamble %dn",
3292 arvif->vdev_id, preamble);
3294 vdev_param = ar->wmi.vdev_param->preamble;
3295 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
3298 ath10k_warn(ar, "failed to set preamble for vdev %d: %i\n",
3299 arvif->vdev_id, ret);
3302 if (changed & BSS_CHANGED_ASSOC) {
3304 /* Workaround: Make sure monitor vdev is not running
3305 * when associating to prevent some firmware revisions
3306 * (e.g. 10.1 and 10.2) from crashing.
3308 if (ar->monitor_started)
3309 ath10k_monitor_stop(ar);
3310 ath10k_bss_assoc(hw, vif, info);
3311 ath10k_monitor_recalc(ar);
3313 ath10k_bss_disassoc(hw, vif);
3317 if (changed & BSS_CHANGED_TXPOWER) {
3318 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev_id %i txpower %d\n",
3319 arvif->vdev_id, info->txpower);
3321 arvif->txpower = info->txpower;
3322 ret = ath10k_mac_txpower_recalc(ar);
3324 ath10k_warn(ar, "failed to recalc tx power: %d\n", ret);
3327 mutex_unlock(&ar->conf_mutex);
3330 static int ath10k_hw_scan(struct ieee80211_hw *hw,
3331 struct ieee80211_vif *vif,
3332 struct ieee80211_scan_request *hw_req)
3334 struct ath10k *ar = hw->priv;
3335 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3336 struct cfg80211_scan_request *req = &hw_req->req;
3337 struct wmi_start_scan_arg arg;
3341 mutex_lock(&ar->conf_mutex);
3343 spin_lock_bh(&ar->data_lock);
3344 switch (ar->scan.state) {
3345 case ATH10K_SCAN_IDLE:
3346 reinit_completion(&ar->scan.started);
3347 reinit_completion(&ar->scan.completed);
3348 ar->scan.state = ATH10K_SCAN_STARTING;
3349 ar->scan.is_roc = false;
3350 ar->scan.vdev_id = arvif->vdev_id;
3353 case ATH10K_SCAN_STARTING:
3354 case ATH10K_SCAN_RUNNING:
3355 case ATH10K_SCAN_ABORTING:
3359 spin_unlock_bh(&ar->data_lock);
3364 memset(&arg, 0, sizeof(arg));
3365 ath10k_wmi_start_scan_init(ar, &arg);
3366 arg.vdev_id = arvif->vdev_id;
3367 arg.scan_id = ATH10K_SCAN_ID;
3370 arg.scan_ctrl_flags |= WMI_SCAN_ADD_CCK_RATES;
3373 arg.ie_len = req->ie_len;
3374 memcpy(arg.ie, req->ie, arg.ie_len);
3378 arg.n_ssids = req->n_ssids;
3379 for (i = 0; i < arg.n_ssids; i++) {
3380 arg.ssids[i].len = req->ssids[i].ssid_len;
3381 arg.ssids[i].ssid = req->ssids[i].ssid;
3384 arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
3387 if (req->n_channels) {
3388 arg.n_channels = req->n_channels;
3389 for (i = 0; i < arg.n_channels; i++)
3390 arg.channels[i] = req->channels[i]->center_freq;
3393 ret = ath10k_start_scan(ar, &arg);
3395 ath10k_warn(ar, "failed to start hw scan: %d\n", ret);
3396 spin_lock_bh(&ar->data_lock);
3397 ar->scan.state = ATH10K_SCAN_IDLE;
3398 spin_unlock_bh(&ar->data_lock);
3402 mutex_unlock(&ar->conf_mutex);
3406 static void ath10k_cancel_hw_scan(struct ieee80211_hw *hw,
3407 struct ieee80211_vif *vif)
3409 struct ath10k *ar = hw->priv;
3411 mutex_lock(&ar->conf_mutex);
3412 ath10k_scan_abort(ar);
3413 mutex_unlock(&ar->conf_mutex);
3415 cancel_delayed_work_sync(&ar->scan.timeout);
3418 static void ath10k_set_key_h_def_keyidx(struct ath10k *ar,
3419 struct ath10k_vif *arvif,
3420 enum set_key_cmd cmd,
3421 struct ieee80211_key_conf *key)
3423 u32 vdev_param = arvif->ar->wmi.vdev_param->def_keyid;
3426 /* 10.1 firmware branch requires default key index to be set to group
3427 * key index after installing it. Otherwise FW/HW Txes corrupted
3428 * frames with multi-vif APs. This is not required for main firmware
3429 * branch (e.g. 636).
3431 * FIXME: This has been tested only in AP. It remains unknown if this
3432 * is required for multi-vif STA interfaces on 10.1 */
3434 if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
3437 if (key->cipher == WLAN_CIPHER_SUITE_WEP40)
3440 if (key->cipher == WLAN_CIPHER_SUITE_WEP104)
3443 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
3449 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
3452 ath10k_warn(ar, "failed to set vdev %i group key as default key: %d\n",
3453 arvif->vdev_id, ret);
3456 static int ath10k_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
3457 struct ieee80211_vif *vif, struct ieee80211_sta *sta,
3458 struct ieee80211_key_conf *key)
3460 struct ath10k *ar = hw->priv;
3461 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3462 struct ath10k_peer *peer;
3463 const u8 *peer_addr;
3464 bool is_wep = key->cipher == WLAN_CIPHER_SUITE_WEP40 ||
3465 key->cipher == WLAN_CIPHER_SUITE_WEP104;
3468 if (key->keyidx > WMI_MAX_KEY_INDEX)
3471 mutex_lock(&ar->conf_mutex);
3474 peer_addr = sta->addr;
3475 else if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
3476 peer_addr = vif->bss_conf.bssid;
3478 peer_addr = vif->addr;
3480 key->hw_key_idx = key->keyidx;
3482 /* the peer should not disappear in mid-way (unless FW goes awry) since
3483 * we already hold conf_mutex. we just make sure its there now. */
3484 spin_lock_bh(&ar->data_lock);
3485 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
3486 spin_unlock_bh(&ar->data_lock);
3489 if (cmd == SET_KEY) {
3490 ath10k_warn(ar, "failed to install key for non-existent peer %pM\n",
3495 /* if the peer doesn't exist there is no key to disable
3503 arvif->wep_keys[key->keyidx] = key;
3505 arvif->wep_keys[key->keyidx] = NULL;
3507 if (cmd == DISABLE_KEY)
3508 ath10k_clear_vdev_key(arvif, key);
3511 ret = ath10k_install_key(arvif, key, cmd, peer_addr);
3513 ath10k_warn(ar, "failed to install key for vdev %i peer %pM: %d\n",
3514 arvif->vdev_id, peer_addr, ret);
3518 ath10k_set_key_h_def_keyidx(ar, arvif, cmd, key);
3520 spin_lock_bh(&ar->data_lock);
3521 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
3522 if (peer && cmd == SET_KEY)
3523 peer->keys[key->keyidx] = key;
3524 else if (peer && cmd == DISABLE_KEY)
3525 peer->keys[key->keyidx] = NULL;
3526 else if (peer == NULL)
3527 /* impossible unless FW goes crazy */
3528 ath10k_warn(ar, "Peer %pM disappeared!\n", peer_addr);
3529 spin_unlock_bh(&ar->data_lock);
3532 mutex_unlock(&ar->conf_mutex);
3536 static void ath10k_sta_rc_update_wk(struct work_struct *wk)
3539 struct ath10k_vif *arvif;
3540 struct ath10k_sta *arsta;
3541 struct ieee80211_sta *sta;
3542 u32 changed, bw, nss, smps;
3545 arsta = container_of(wk, struct ath10k_sta, update_wk);
3546 sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv);
3547 arvif = arsta->arvif;
3550 spin_lock_bh(&ar->data_lock);
3552 changed = arsta->changed;
3559 spin_unlock_bh(&ar->data_lock);
3561 mutex_lock(&ar->conf_mutex);
3563 if (changed & IEEE80211_RC_BW_CHANGED) {
3564 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM peer bw %d\n",
3567 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
3568 WMI_PEER_CHAN_WIDTH, bw);
3570 ath10k_warn(ar, "failed to update STA %pM peer bw %d: %d\n",
3571 sta->addr, bw, err);
3574 if (changed & IEEE80211_RC_NSS_CHANGED) {
3575 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM nss %d\n",
3578 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
3581 ath10k_warn(ar, "failed to update STA %pM nss %d: %d\n",
3582 sta->addr, nss, err);
3585 if (changed & IEEE80211_RC_SMPS_CHANGED) {
3586 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM smps %d\n",
3589 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
3590 WMI_PEER_SMPS_STATE, smps);
3592 ath10k_warn(ar, "failed to update STA %pM smps %d: %d\n",
3593 sta->addr, smps, err);
3596 if (changed & IEEE80211_RC_SUPP_RATES_CHANGED) {
3597 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM supp rates\n",
3600 err = ath10k_station_assoc(ar, arvif->vif, sta, true);
3602 ath10k_warn(ar, "failed to reassociate station: %pM\n",
3606 mutex_unlock(&ar->conf_mutex);
3609 static int ath10k_mac_inc_num_stations(struct ath10k_vif *arvif)
3611 struct ath10k *ar = arvif->ar;
3613 lockdep_assert_held(&ar->conf_mutex);
3615 if (arvif->vdev_type != WMI_VDEV_TYPE_AP &&
3616 arvif->vdev_type != WMI_VDEV_TYPE_IBSS)
3619 if (ar->num_stations >= ar->max_num_stations)
3627 static void ath10k_mac_dec_num_stations(struct ath10k_vif *arvif)
3629 struct ath10k *ar = arvif->ar;
3631 lockdep_assert_held(&ar->conf_mutex);
3633 if (arvif->vdev_type != WMI_VDEV_TYPE_AP &&
3634 arvif->vdev_type != WMI_VDEV_TYPE_IBSS)
3640 static int ath10k_sta_state(struct ieee80211_hw *hw,
3641 struct ieee80211_vif *vif,
3642 struct ieee80211_sta *sta,
3643 enum ieee80211_sta_state old_state,
3644 enum ieee80211_sta_state new_state)
3646 struct ath10k *ar = hw->priv;
3647 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3648 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
3651 if (old_state == IEEE80211_STA_NOTEXIST &&
3652 new_state == IEEE80211_STA_NONE) {
3653 memset(arsta, 0, sizeof(*arsta));
3654 arsta->arvif = arvif;
3655 INIT_WORK(&arsta->update_wk, ath10k_sta_rc_update_wk);
3658 /* cancel must be done outside the mutex to avoid deadlock */
3659 if ((old_state == IEEE80211_STA_NONE &&
3660 new_state == IEEE80211_STA_NOTEXIST))
3661 cancel_work_sync(&arsta->update_wk);
3663 mutex_lock(&ar->conf_mutex);
3665 if (old_state == IEEE80211_STA_NOTEXIST &&
3666 new_state == IEEE80211_STA_NONE) {
3668 * New station addition.
3670 ath10k_dbg(ar, ATH10K_DBG_MAC,
3671 "mac vdev %d peer create %pM (new sta) sta %d / %d peer %d / %d\n",
3672 arvif->vdev_id, sta->addr,
3673 ar->num_stations + 1, ar->max_num_stations,
3674 ar->num_peers + 1, ar->max_num_peers);
3676 ret = ath10k_mac_inc_num_stations(arvif);
3678 ath10k_warn(ar, "refusing to associate station: too many connected already (%d)\n",
3679 ar->max_num_stations);
3683 ret = ath10k_peer_create(ar, arvif->vdev_id, sta->addr);
3685 ath10k_warn(ar, "failed to add peer %pM for vdev %d when adding a new sta: %i\n",
3686 sta->addr, arvif->vdev_id, ret);
3687 ath10k_mac_dec_num_stations(arvif);
3691 if (vif->type == NL80211_IFTYPE_STATION) {
3692 WARN_ON(arvif->is_started);
3694 ret = ath10k_vdev_start(arvif);
3696 ath10k_warn(ar, "failed to start vdev %i: %d\n",
3697 arvif->vdev_id, ret);
3698 WARN_ON(ath10k_peer_delete(ar, arvif->vdev_id,
3700 ath10k_mac_dec_num_stations(arvif);
3704 arvif->is_started = true;
3706 } else if ((old_state == IEEE80211_STA_NONE &&
3707 new_state == IEEE80211_STA_NOTEXIST)) {
3709 * Existing station deletion.
3711 ath10k_dbg(ar, ATH10K_DBG_MAC,
3712 "mac vdev %d peer delete %pM (sta gone)\n",
3713 arvif->vdev_id, sta->addr);
3715 if (vif->type == NL80211_IFTYPE_STATION) {
3716 WARN_ON(!arvif->is_started);
3718 ret = ath10k_vdev_stop(arvif);
3720 ath10k_warn(ar, "failed to stop vdev %i: %d\n",
3721 arvif->vdev_id, ret);
3723 arvif->is_started = false;
3726 ret = ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
3728 ath10k_warn(ar, "failed to delete peer %pM for vdev %d: %i\n",
3729 sta->addr, arvif->vdev_id, ret);
3731 ath10k_mac_dec_num_stations(arvif);
3732 } else if (old_state == IEEE80211_STA_AUTH &&
3733 new_state == IEEE80211_STA_ASSOC &&
3734 (vif->type == NL80211_IFTYPE_AP ||
3735 vif->type == NL80211_IFTYPE_ADHOC)) {
3739 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac sta %pM associated\n",
3742 ret = ath10k_station_assoc(ar, vif, sta, false);
3744 ath10k_warn(ar, "failed to associate station %pM for vdev %i: %i\n",
3745 sta->addr, arvif->vdev_id, ret);
3746 } else if (old_state == IEEE80211_STA_ASSOC &&
3747 new_state == IEEE80211_STA_AUTH &&
3748 (vif->type == NL80211_IFTYPE_AP ||
3749 vif->type == NL80211_IFTYPE_ADHOC)) {
3753 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac sta %pM disassociated\n",
3756 ret = ath10k_station_disassoc(ar, vif, sta);
3758 ath10k_warn(ar, "failed to disassociate station: %pM vdev %i: %i\n",
3759 sta->addr, arvif->vdev_id, ret);
3762 mutex_unlock(&ar->conf_mutex);
3766 static int ath10k_conf_tx_uapsd(struct ath10k *ar, struct ieee80211_vif *vif,
3767 u16 ac, bool enable)
3769 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3773 lockdep_assert_held(&ar->conf_mutex);
3775 if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
3779 case IEEE80211_AC_VO:
3780 value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN |
3781 WMI_STA_PS_UAPSD_AC3_TRIGGER_EN;
3783 case IEEE80211_AC_VI:
3784 value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN |
3785 WMI_STA_PS_UAPSD_AC2_TRIGGER_EN;
3787 case IEEE80211_AC_BE:
3788 value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN |
3789 WMI_STA_PS_UAPSD_AC1_TRIGGER_EN;
3791 case IEEE80211_AC_BK:
3792 value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN |
3793 WMI_STA_PS_UAPSD_AC0_TRIGGER_EN;
3798 arvif->u.sta.uapsd |= value;
3800 arvif->u.sta.uapsd &= ~value;
3802 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
3803 WMI_STA_PS_PARAM_UAPSD,
3804 arvif->u.sta.uapsd);
3806 ath10k_warn(ar, "failed to set uapsd params: %d\n", ret);
3810 if (arvif->u.sta.uapsd)
3811 value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD;
3813 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
3815 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
3816 WMI_STA_PS_PARAM_RX_WAKE_POLICY,
3819 ath10k_warn(ar, "failed to set rx wake param: %d\n", ret);
3825 static int ath10k_conf_tx(struct ieee80211_hw *hw,
3826 struct ieee80211_vif *vif, u16 ac,
3827 const struct ieee80211_tx_queue_params *params)
3829 struct ath10k *ar = hw->priv;
3830 struct wmi_wmm_params_arg *p = NULL;
3833 mutex_lock(&ar->conf_mutex);
3836 case IEEE80211_AC_VO:
3837 p = &ar->wmm_params.ac_vo;
3839 case IEEE80211_AC_VI:
3840 p = &ar->wmm_params.ac_vi;
3842 case IEEE80211_AC_BE:
3843 p = &ar->wmm_params.ac_be;
3845 case IEEE80211_AC_BK:
3846 p = &ar->wmm_params.ac_bk;
3855 p->cwmin = params->cw_min;
3856 p->cwmax = params->cw_max;
3857 p->aifs = params->aifs;
3860 * The channel time duration programmed in the HW is in absolute
3861 * microseconds, while mac80211 gives the txop in units of
3864 p->txop = params->txop * 32;
3866 /* FIXME: FW accepts wmm params per hw, not per vif */
3867 ret = ath10k_wmi_pdev_set_wmm_params(ar, &ar->wmm_params);
3869 ath10k_warn(ar, "failed to set wmm params: %d\n", ret);
3873 ret = ath10k_conf_tx_uapsd(ar, vif, ac, params->uapsd);
3875 ath10k_warn(ar, "failed to set sta uapsd: %d\n", ret);
3878 mutex_unlock(&ar->conf_mutex);
3882 #define ATH10K_ROC_TIMEOUT_HZ (2*HZ)
3884 static int ath10k_remain_on_channel(struct ieee80211_hw *hw,
3885 struct ieee80211_vif *vif,
3886 struct ieee80211_channel *chan,
3888 enum ieee80211_roc_type type)
3890 struct ath10k *ar = hw->priv;
3891 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3892 struct wmi_start_scan_arg arg;
3895 mutex_lock(&ar->conf_mutex);
3897 spin_lock_bh(&ar->data_lock);
3898 switch (ar->scan.state) {
3899 case ATH10K_SCAN_IDLE:
3900 reinit_completion(&ar->scan.started);
3901 reinit_completion(&ar->scan.completed);
3902 reinit_completion(&ar->scan.on_channel);
3903 ar->scan.state = ATH10K_SCAN_STARTING;
3904 ar->scan.is_roc = true;
3905 ar->scan.vdev_id = arvif->vdev_id;
3906 ar->scan.roc_freq = chan->center_freq;
3909 case ATH10K_SCAN_STARTING:
3910 case ATH10K_SCAN_RUNNING:
3911 case ATH10K_SCAN_ABORTING:
3915 spin_unlock_bh(&ar->data_lock);
3920 duration = max(duration, WMI_SCAN_CHAN_MIN_TIME_MSEC);
3922 memset(&arg, 0, sizeof(arg));
3923 ath10k_wmi_start_scan_init(ar, &arg);
3924 arg.vdev_id = arvif->vdev_id;
3925 arg.scan_id = ATH10K_SCAN_ID;
3927 arg.channels[0] = chan->center_freq;
3928 arg.dwell_time_active = duration;
3929 arg.dwell_time_passive = duration;
3930 arg.max_scan_time = 2 * duration;
3931 arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
3932 arg.scan_ctrl_flags |= WMI_SCAN_FILTER_PROBE_REQ;
3934 ret = ath10k_start_scan(ar, &arg);
3936 ath10k_warn(ar, "failed to start roc scan: %d\n", ret);
3937 spin_lock_bh(&ar->data_lock);
3938 ar->scan.state = ATH10K_SCAN_IDLE;
3939 spin_unlock_bh(&ar->data_lock);
3943 ret = wait_for_completion_timeout(&ar->scan.on_channel, 3*HZ);
3945 ath10k_warn(ar, "failed to switch to channel for roc scan\n");
3947 ret = ath10k_scan_stop(ar);
3949 ath10k_warn(ar, "failed to stop scan: %d\n", ret);
3957 mutex_unlock(&ar->conf_mutex);
3961 static int ath10k_cancel_remain_on_channel(struct ieee80211_hw *hw)
3963 struct ath10k *ar = hw->priv;
3965 mutex_lock(&ar->conf_mutex);
3966 ath10k_scan_abort(ar);
3967 mutex_unlock(&ar->conf_mutex);
3969 cancel_delayed_work_sync(&ar->scan.timeout);
3975 * Both RTS and Fragmentation threshold are interface-specific
3976 * in ath10k, but device-specific in mac80211.
3979 static int ath10k_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
3981 struct ath10k *ar = hw->priv;
3982 struct ath10k_vif *arvif;
3985 mutex_lock(&ar->conf_mutex);
3986 list_for_each_entry(arvif, &ar->arvifs, list) {
3987 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d rts threshold %d\n",
3988 arvif->vdev_id, value);
3990 ret = ath10k_mac_set_rts(arvif, value);
3992 ath10k_warn(ar, "failed to set rts threshold for vdev %d: %d\n",
3993 arvif->vdev_id, ret);
3997 mutex_unlock(&ar->conf_mutex);
4002 static void ath10k_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
4003 u32 queues, bool drop)
4005 struct ath10k *ar = hw->priv;
4009 /* mac80211 doesn't care if we really xmit queued frames or not
4010 * we'll collect those frames either way if we stop/delete vdevs */
4014 mutex_lock(&ar->conf_mutex);
4016 if (ar->state == ATH10K_STATE_WEDGED)
4019 ret = wait_event_timeout(ar->htt.empty_tx_wq, ({
4022 spin_lock_bh(&ar->htt.tx_lock);
4023 empty = (ar->htt.num_pending_tx == 0);
4024 spin_unlock_bh(&ar->htt.tx_lock);
4026 skip = (ar->state == ATH10K_STATE_WEDGED) ||
4027 test_bit(ATH10K_FLAG_CRASH_FLUSH,
4031 }), ATH10K_FLUSH_TIMEOUT_HZ);
4033 if (ret <= 0 || skip)
4034 ath10k_warn(ar, "failed to flush transmit queue (skip %i ar-state %i): %i\n",
4035 skip, ar->state, ret);
4038 mutex_unlock(&ar->conf_mutex);
4041 /* TODO: Implement this function properly
4042 * For now it is needed to reply to Probe Requests in IBSS mode.
4043 * Propably we need this information from FW.
4045 static int ath10k_tx_last_beacon(struct ieee80211_hw *hw)
4051 static int ath10k_suspend(struct ieee80211_hw *hw,
4052 struct cfg80211_wowlan *wowlan)
4054 struct ath10k *ar = hw->priv;
4057 mutex_lock(&ar->conf_mutex);
4059 ret = ath10k_wait_for_suspend(ar, WMI_PDEV_SUSPEND);
4061 if (ret == -ETIMEDOUT)
4067 ret = ath10k_hif_suspend(ar);
4069 ath10k_warn(ar, "failed to suspend hif: %d\n", ret);
4076 ret = ath10k_wmi_pdev_resume_target(ar);
4078 ath10k_warn(ar, "failed to resume target: %d\n", ret);
4082 mutex_unlock(&ar->conf_mutex);
4086 static int ath10k_resume(struct ieee80211_hw *hw)
4088 struct ath10k *ar = hw->priv;
4091 mutex_lock(&ar->conf_mutex);
4093 ret = ath10k_hif_resume(ar);
4095 ath10k_warn(ar, "failed to resume hif: %d\n", ret);
4100 ret = ath10k_wmi_pdev_resume_target(ar);
4102 ath10k_warn(ar, "failed to resume target: %d\n", ret);
4109 mutex_unlock(&ar->conf_mutex);
4114 static void ath10k_reconfig_complete(struct ieee80211_hw *hw,
4115 enum ieee80211_reconfig_type reconfig_type)
4117 struct ath10k *ar = hw->priv;
4119 if (reconfig_type != IEEE80211_RECONFIG_TYPE_RESTART)
4122 mutex_lock(&ar->conf_mutex);
4124 /* If device failed to restart it will be in a different state, e.g.
4125 * ATH10K_STATE_WEDGED */
4126 if (ar->state == ATH10K_STATE_RESTARTED) {
4127 ath10k_info(ar, "device successfully recovered\n");
4128 ar->state = ATH10K_STATE_ON;
4129 ieee80211_wake_queues(ar->hw);
4132 mutex_unlock(&ar->conf_mutex);
4135 static int ath10k_get_survey(struct ieee80211_hw *hw, int idx,
4136 struct survey_info *survey)
4138 struct ath10k *ar = hw->priv;
4139 struct ieee80211_supported_band *sband;
4140 struct survey_info *ar_survey = &ar->survey[idx];
4143 mutex_lock(&ar->conf_mutex);
4145 sband = hw->wiphy->bands[IEEE80211_BAND_2GHZ];
4146 if (sband && idx >= sband->n_channels) {
4147 idx -= sband->n_channels;
4152 sband = hw->wiphy->bands[IEEE80211_BAND_5GHZ];
4154 if (!sband || idx >= sband->n_channels) {
4159 spin_lock_bh(&ar->data_lock);
4160 memcpy(survey, ar_survey, sizeof(*survey));
4161 spin_unlock_bh(&ar->data_lock);
4163 survey->channel = &sband->channels[idx];
4165 if (ar->rx_channel == survey->channel)
4166 survey->filled |= SURVEY_INFO_IN_USE;
4169 mutex_unlock(&ar->conf_mutex);
4173 /* Helper table for legacy fixed_rate/bitrate_mask */
4174 static const u8 cck_ofdm_rate[] = {
4191 /* Check if only one bit set */
4192 static int ath10k_check_single_mask(u32 mask)
4200 mask &= ~BIT(bit - 1);
4208 ath10k_default_bitrate_mask(struct ath10k *ar,
4209 enum ieee80211_band band,
4210 const struct cfg80211_bitrate_mask *mask)
4212 u32 legacy = 0x00ff;
4215 u16 nrf = ar->num_rf_chains;
4217 if (ar->cfg_tx_chainmask)
4218 nrf = get_nss_from_chainmask(ar->cfg_tx_chainmask);
4221 case IEEE80211_BAND_2GHZ:
4225 case IEEE80211_BAND_5GHZ:
4231 if (mask->control[band].legacy != legacy)
4234 for (i = 0; i < nrf; i++)
4235 if (mask->control[band].ht_mcs[i] != ht)
4238 for (i = 0; i < nrf; i++)
4239 if (mask->control[band].vht_mcs[i] != vht)
4246 ath10k_bitrate_mask_nss(const struct cfg80211_bitrate_mask *mask,
4247 enum ieee80211_band band,
4250 int ht_nss = 0, vht_nss = 0, i;
4253 if (ath10k_check_single_mask(mask->control[band].legacy))
4257 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++) {
4258 if (mask->control[band].ht_mcs[i] == 0xff)
4260 else if (mask->control[band].ht_mcs[i] == 0x00)
4269 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
4270 if (mask->control[band].vht_mcs[i] == 0x03ff)
4272 else if (mask->control[band].vht_mcs[i] == 0x0000)
4280 if (ht_nss > 0 && vht_nss > 0)
4284 *fixed_nss = ht_nss;
4286 *fixed_nss = vht_nss;
4294 ath10k_bitrate_mask_correct(const struct cfg80211_bitrate_mask *mask,
4295 enum ieee80211_band band,
4296 enum wmi_rate_preamble *preamble)
4298 int legacy = 0, ht = 0, vht = 0, i;
4300 *preamble = WMI_RATE_PREAMBLE_OFDM;
4303 legacy = ath10k_check_single_mask(mask->control[band].legacy);
4308 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++)
4309 ht += ath10k_check_single_mask(mask->control[band].ht_mcs[i]);
4314 for (i = 0; i < NL80211_VHT_NSS_MAX; i++)
4315 vht += ath10k_check_single_mask(mask->control[band].vht_mcs[i]);
4319 /* Currently we support only one fixed_rate */
4320 if ((legacy + ht + vht) != 1)
4324 *preamble = WMI_RATE_PREAMBLE_HT;
4326 *preamble = WMI_RATE_PREAMBLE_VHT;
4332 ath10k_bitrate_mask_rate(struct ath10k *ar,
4333 const struct cfg80211_bitrate_mask *mask,
4334 enum ieee80211_band band,
4338 u8 rate = 0, pream = 0, nss = 0, i;
4339 enum wmi_rate_preamble preamble;
4341 /* Check if single rate correct */
4342 if (!ath10k_bitrate_mask_correct(mask, band, &preamble))
4348 case WMI_RATE_PREAMBLE_CCK:
4349 case WMI_RATE_PREAMBLE_OFDM:
4350 i = ffs(mask->control[band].legacy) - 1;
4352 if (band == IEEE80211_BAND_2GHZ && i < 4)
4353 pream = WMI_RATE_PREAMBLE_CCK;
4355 if (band == IEEE80211_BAND_5GHZ)
4358 if (i >= ARRAY_SIZE(cck_ofdm_rate))
4361 rate = cck_ofdm_rate[i];
4363 case WMI_RATE_PREAMBLE_HT:
4364 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++)
4365 if (mask->control[band].ht_mcs[i])
4368 if (i == IEEE80211_HT_MCS_MASK_LEN)
4371 rate = ffs(mask->control[band].ht_mcs[i]) - 1;
4374 case WMI_RATE_PREAMBLE_VHT:
4375 for (i = 0; i < NL80211_VHT_NSS_MAX; i++)
4376 if (mask->control[band].vht_mcs[i])
4379 if (i == NL80211_VHT_NSS_MAX)
4382 rate = ffs(mask->control[band].vht_mcs[i]) - 1;
4387 *fixed_nss = nss + 1;
4391 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac fixed rate pream 0x%02x nss 0x%02x rate 0x%02x\n",
4394 *fixed_rate = pream | nss | rate;
4399 static bool ath10k_get_fixed_rate_nss(struct ath10k *ar,
4400 const struct cfg80211_bitrate_mask *mask,
4401 enum ieee80211_band band,
4405 /* First check full NSS mask, if we can simply limit NSS */
4406 if (ath10k_bitrate_mask_nss(mask, band, fixed_nss))
4409 /* Next Check single rate is set */
4410 return ath10k_bitrate_mask_rate(ar, mask, band, fixed_rate, fixed_nss);
4413 static int ath10k_set_fixed_rate_param(struct ath10k_vif *arvif,
4418 struct ath10k *ar = arvif->ar;
4422 mutex_lock(&ar->conf_mutex);
4424 if (arvif->fixed_rate == fixed_rate &&
4425 arvif->fixed_nss == fixed_nss &&
4426 arvif->force_sgi == force_sgi)
4429 if (fixed_rate == WMI_FIXED_RATE_NONE)
4430 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac disable fixed bitrate mask\n");
4433 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac force sgi\n");
4435 vdev_param = ar->wmi.vdev_param->fixed_rate;
4436 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
4437 vdev_param, fixed_rate);
4439 ath10k_warn(ar, "failed to set fixed rate param 0x%02x: %d\n",
4445 arvif->fixed_rate = fixed_rate;
4447 vdev_param = ar->wmi.vdev_param->nss;
4448 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
4449 vdev_param, fixed_nss);
4452 ath10k_warn(ar, "failed to set fixed nss param %d: %d\n",
4458 arvif->fixed_nss = fixed_nss;
4460 vdev_param = ar->wmi.vdev_param->sgi;
4461 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
4465 ath10k_warn(ar, "failed to set sgi param %d: %d\n",
4471 arvif->force_sgi = force_sgi;
4474 mutex_unlock(&ar->conf_mutex);
4478 static int ath10k_set_bitrate_mask(struct ieee80211_hw *hw,
4479 struct ieee80211_vif *vif,
4480 const struct cfg80211_bitrate_mask *mask)
4482 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4483 struct ath10k *ar = arvif->ar;
4484 enum ieee80211_band band = ar->hw->conf.chandef.chan->band;
4485 u8 fixed_rate = WMI_FIXED_RATE_NONE;
4486 u8 fixed_nss = ar->num_rf_chains;
4489 if (ar->cfg_tx_chainmask)
4490 fixed_nss = get_nss_from_chainmask(ar->cfg_tx_chainmask);
4492 force_sgi = mask->control[band].gi;
4493 if (force_sgi == NL80211_TXRATE_FORCE_LGI)
4496 if (!ath10k_default_bitrate_mask(ar, band, mask)) {
4497 if (!ath10k_get_fixed_rate_nss(ar, mask, band,
4503 if (fixed_rate == WMI_FIXED_RATE_NONE && force_sgi) {
4504 ath10k_warn(ar, "failed to force SGI usage for default rate settings\n");
4508 return ath10k_set_fixed_rate_param(arvif, fixed_rate,
4509 fixed_nss, force_sgi);
4512 static void ath10k_sta_rc_update(struct ieee80211_hw *hw,
4513 struct ieee80211_vif *vif,
4514 struct ieee80211_sta *sta,
4517 struct ath10k *ar = hw->priv;
4518 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
4521 spin_lock_bh(&ar->data_lock);
4523 ath10k_dbg(ar, ATH10K_DBG_MAC,
4524 "mac sta rc update for %pM changed %08x bw %d nss %d smps %d\n",
4525 sta->addr, changed, sta->bandwidth, sta->rx_nss,
4528 if (changed & IEEE80211_RC_BW_CHANGED) {
4529 bw = WMI_PEER_CHWIDTH_20MHZ;
4531 switch (sta->bandwidth) {
4532 case IEEE80211_STA_RX_BW_20:
4533 bw = WMI_PEER_CHWIDTH_20MHZ;
4535 case IEEE80211_STA_RX_BW_40:
4536 bw = WMI_PEER_CHWIDTH_40MHZ;
4538 case IEEE80211_STA_RX_BW_80:
4539 bw = WMI_PEER_CHWIDTH_80MHZ;
4541 case IEEE80211_STA_RX_BW_160:
4542 ath10k_warn(ar, "Invalid bandwith %d in rc update for %pM\n",
4543 sta->bandwidth, sta->addr);
4544 bw = WMI_PEER_CHWIDTH_20MHZ;
4551 if (changed & IEEE80211_RC_NSS_CHANGED)
4552 arsta->nss = sta->rx_nss;
4554 if (changed & IEEE80211_RC_SMPS_CHANGED) {
4555 smps = WMI_PEER_SMPS_PS_NONE;
4557 switch (sta->smps_mode) {
4558 case IEEE80211_SMPS_AUTOMATIC:
4559 case IEEE80211_SMPS_OFF:
4560 smps = WMI_PEER_SMPS_PS_NONE;
4562 case IEEE80211_SMPS_STATIC:
4563 smps = WMI_PEER_SMPS_STATIC;
4565 case IEEE80211_SMPS_DYNAMIC:
4566 smps = WMI_PEER_SMPS_DYNAMIC;
4568 case IEEE80211_SMPS_NUM_MODES:
4569 ath10k_warn(ar, "Invalid smps %d in sta rc update for %pM\n",
4570 sta->smps_mode, sta->addr);
4571 smps = WMI_PEER_SMPS_PS_NONE;
4578 arsta->changed |= changed;
4580 spin_unlock_bh(&ar->data_lock);
4582 ieee80211_queue_work(hw, &arsta->update_wk);
4585 static u64 ath10k_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
4588 * FIXME: Return 0 for time being. Need to figure out whether FW
4589 * has the API to fetch 64-bit local TSF
4595 static int ath10k_ampdu_action(struct ieee80211_hw *hw,
4596 struct ieee80211_vif *vif,
4597 enum ieee80211_ampdu_mlme_action action,
4598 struct ieee80211_sta *sta, u16 tid, u16 *ssn,
4601 struct ath10k *ar = hw->priv;
4602 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4604 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac ampdu vdev_id %i sta %pM tid %hu action %d\n",
4605 arvif->vdev_id, sta->addr, tid, action);
4608 case IEEE80211_AMPDU_RX_START:
4609 case IEEE80211_AMPDU_RX_STOP:
4610 /* HTT AddBa/DelBa events trigger mac80211 Rx BA session
4611 * creation/removal. Do we need to verify this?
4614 case IEEE80211_AMPDU_TX_START:
4615 case IEEE80211_AMPDU_TX_STOP_CONT:
4616 case IEEE80211_AMPDU_TX_STOP_FLUSH:
4617 case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
4618 case IEEE80211_AMPDU_TX_OPERATIONAL:
4619 /* Firmware offloads Tx aggregation entirely so deny mac80211
4620 * Tx aggregation requests.
4628 static const struct ieee80211_ops ath10k_ops = {
4630 .start = ath10k_start,
4631 .stop = ath10k_stop,
4632 .config = ath10k_config,
4633 .add_interface = ath10k_add_interface,
4634 .remove_interface = ath10k_remove_interface,
4635 .configure_filter = ath10k_configure_filter,
4636 .bss_info_changed = ath10k_bss_info_changed,
4637 .hw_scan = ath10k_hw_scan,
4638 .cancel_hw_scan = ath10k_cancel_hw_scan,
4639 .set_key = ath10k_set_key,
4640 .sta_state = ath10k_sta_state,
4641 .conf_tx = ath10k_conf_tx,
4642 .remain_on_channel = ath10k_remain_on_channel,
4643 .cancel_remain_on_channel = ath10k_cancel_remain_on_channel,
4644 .set_rts_threshold = ath10k_set_rts_threshold,
4645 .flush = ath10k_flush,
4646 .tx_last_beacon = ath10k_tx_last_beacon,
4647 .set_antenna = ath10k_set_antenna,
4648 .get_antenna = ath10k_get_antenna,
4649 .reconfig_complete = ath10k_reconfig_complete,
4650 .get_survey = ath10k_get_survey,
4651 .set_bitrate_mask = ath10k_set_bitrate_mask,
4652 .sta_rc_update = ath10k_sta_rc_update,
4653 .get_tsf = ath10k_get_tsf,
4654 .ampdu_action = ath10k_ampdu_action,
4655 .get_et_sset_count = ath10k_debug_get_et_sset_count,
4656 .get_et_stats = ath10k_debug_get_et_stats,
4657 .get_et_strings = ath10k_debug_get_et_strings,
4659 CFG80211_TESTMODE_CMD(ath10k_tm_cmd)
4662 .suspend = ath10k_suspend,
4663 .resume = ath10k_resume,
4667 #define RATETAB_ENT(_rate, _rateid, _flags) { \
4668 .bitrate = (_rate), \
4669 .flags = (_flags), \
4670 .hw_value = (_rateid), \
4673 #define CHAN2G(_channel, _freq, _flags) { \
4674 .band = IEEE80211_BAND_2GHZ, \
4675 .hw_value = (_channel), \
4676 .center_freq = (_freq), \
4677 .flags = (_flags), \
4678 .max_antenna_gain = 0, \
4682 #define CHAN5G(_channel, _freq, _flags) { \
4683 .band = IEEE80211_BAND_5GHZ, \
4684 .hw_value = (_channel), \
4685 .center_freq = (_freq), \
4686 .flags = (_flags), \
4687 .max_antenna_gain = 0, \
4691 static const struct ieee80211_channel ath10k_2ghz_channels[] = {
4701 CHAN2G(10, 2457, 0),
4702 CHAN2G(11, 2462, 0),
4703 CHAN2G(12, 2467, 0),
4704 CHAN2G(13, 2472, 0),
4705 CHAN2G(14, 2484, 0),
4708 static const struct ieee80211_channel ath10k_5ghz_channels[] = {
4709 CHAN5G(36, 5180, 0),
4710 CHAN5G(40, 5200, 0),
4711 CHAN5G(44, 5220, 0),
4712 CHAN5G(48, 5240, 0),
4713 CHAN5G(52, 5260, 0),
4714 CHAN5G(56, 5280, 0),
4715 CHAN5G(60, 5300, 0),
4716 CHAN5G(64, 5320, 0),
4717 CHAN5G(100, 5500, 0),
4718 CHAN5G(104, 5520, 0),
4719 CHAN5G(108, 5540, 0),
4720 CHAN5G(112, 5560, 0),
4721 CHAN5G(116, 5580, 0),
4722 CHAN5G(120, 5600, 0),
4723 CHAN5G(124, 5620, 0),
4724 CHAN5G(128, 5640, 0),
4725 CHAN5G(132, 5660, 0),
4726 CHAN5G(136, 5680, 0),
4727 CHAN5G(140, 5700, 0),
4728 CHAN5G(149, 5745, 0),
4729 CHAN5G(153, 5765, 0),
4730 CHAN5G(157, 5785, 0),
4731 CHAN5G(161, 5805, 0),
4732 CHAN5G(165, 5825, 0),
4735 /* Note: Be careful if you re-order these. There is code which depends on this
4738 static struct ieee80211_rate ath10k_rates[] = {
4740 RATETAB_ENT(10, 0x82, 0),
4741 RATETAB_ENT(20, 0x84, 0),
4742 RATETAB_ENT(55, 0x8b, 0),
4743 RATETAB_ENT(110, 0x96, 0),
4745 RATETAB_ENT(60, 0x0c, 0),
4746 RATETAB_ENT(90, 0x12, 0),
4747 RATETAB_ENT(120, 0x18, 0),
4748 RATETAB_ENT(180, 0x24, 0),
4749 RATETAB_ENT(240, 0x30, 0),
4750 RATETAB_ENT(360, 0x48, 0),
4751 RATETAB_ENT(480, 0x60, 0),
4752 RATETAB_ENT(540, 0x6c, 0),
4755 #define ath10k_a_rates (ath10k_rates + 4)
4756 #define ath10k_a_rates_size (ARRAY_SIZE(ath10k_rates) - 4)
4757 #define ath10k_g_rates (ath10k_rates + 0)
4758 #define ath10k_g_rates_size (ARRAY_SIZE(ath10k_rates))
4760 struct ath10k *ath10k_mac_create(size_t priv_size)
4762 struct ieee80211_hw *hw;
4765 hw = ieee80211_alloc_hw(sizeof(struct ath10k) + priv_size, &ath10k_ops);
4775 void ath10k_mac_destroy(struct ath10k *ar)
4777 ieee80211_free_hw(ar->hw);
4780 static const struct ieee80211_iface_limit ath10k_if_limits[] = {
4783 .types = BIT(NL80211_IFTYPE_STATION)
4784 | BIT(NL80211_IFTYPE_P2P_CLIENT)
4788 .types = BIT(NL80211_IFTYPE_P2P_GO)
4792 .types = BIT(NL80211_IFTYPE_AP)
4796 static const struct ieee80211_iface_limit ath10k_10x_if_limits[] = {
4799 .types = BIT(NL80211_IFTYPE_AP)
4803 static const struct ieee80211_iface_combination ath10k_if_comb[] = {
4805 .limits = ath10k_if_limits,
4806 .n_limits = ARRAY_SIZE(ath10k_if_limits),
4807 .max_interfaces = 8,
4808 .num_different_channels = 1,
4809 .beacon_int_infra_match = true,
4813 static const struct ieee80211_iface_combination ath10k_10x_if_comb[] = {
4815 .limits = ath10k_10x_if_limits,
4816 .n_limits = ARRAY_SIZE(ath10k_10x_if_limits),
4817 .max_interfaces = 8,
4818 .num_different_channels = 1,
4819 .beacon_int_infra_match = true,
4820 #ifdef CONFIG_ATH10K_DFS_CERTIFIED
4821 .radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
4822 BIT(NL80211_CHAN_WIDTH_20) |
4823 BIT(NL80211_CHAN_WIDTH_40) |
4824 BIT(NL80211_CHAN_WIDTH_80),
4829 static struct ieee80211_sta_vht_cap ath10k_create_vht_cap(struct ath10k *ar)
4831 struct ieee80211_sta_vht_cap vht_cap = {0};
4835 vht_cap.vht_supported = 1;
4836 vht_cap.cap = ar->vht_cap_info;
4839 for (i = 0; i < 8; i++) {
4840 if (i < ar->num_rf_chains)
4841 mcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i*2);
4843 mcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i*2);
4846 vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(mcs_map);
4847 vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(mcs_map);
4852 static struct ieee80211_sta_ht_cap ath10k_get_ht_cap(struct ath10k *ar)
4855 struct ieee80211_sta_ht_cap ht_cap = {0};
4857 if (!(ar->ht_cap_info & WMI_HT_CAP_ENABLED))
4860 ht_cap.ht_supported = 1;
4861 ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
4862 ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_8;
4863 ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
4864 ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
4865 ht_cap.cap |= WLAN_HT_CAP_SM_PS_STATIC << IEEE80211_HT_CAP_SM_PS_SHIFT;
4867 if (ar->ht_cap_info & WMI_HT_CAP_HT20_SGI)
4868 ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
4870 if (ar->ht_cap_info & WMI_HT_CAP_HT40_SGI)
4871 ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
4873 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) {
4876 smps = WLAN_HT_CAP_SM_PS_DYNAMIC;
4877 smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT;
4882 if (ar->ht_cap_info & WMI_HT_CAP_TX_STBC)
4883 ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC;
4885 if (ar->ht_cap_info & WMI_HT_CAP_RX_STBC) {
4888 stbc = ar->ht_cap_info;
4889 stbc &= WMI_HT_CAP_RX_STBC;
4890 stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT;
4891 stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT;
4892 stbc &= IEEE80211_HT_CAP_RX_STBC;
4897 if (ar->ht_cap_info & WMI_HT_CAP_LDPC)
4898 ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
4900 if (ar->ht_cap_info & WMI_HT_CAP_L_SIG_TXOP_PROT)
4901 ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
4903 /* max AMSDU is implicitly taken from vht_cap_info */
4904 if (ar->vht_cap_info & WMI_VHT_CAP_MAX_MPDU_LEN_MASK)
4905 ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU;
4907 for (i = 0; i < ar->num_rf_chains; i++)
4908 ht_cap.mcs.rx_mask[i] = 0xFF;
4910 ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
4915 static void ath10k_get_arvif_iter(void *data, u8 *mac,
4916 struct ieee80211_vif *vif)
4918 struct ath10k_vif_iter *arvif_iter = data;
4919 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4921 if (arvif->vdev_id == arvif_iter->vdev_id)
4922 arvif_iter->arvif = arvif;
4925 struct ath10k_vif *ath10k_get_arvif(struct ath10k *ar, u32 vdev_id)
4927 struct ath10k_vif_iter arvif_iter;
4930 memset(&arvif_iter, 0, sizeof(struct ath10k_vif_iter));
4931 arvif_iter.vdev_id = vdev_id;
4933 flags = IEEE80211_IFACE_ITER_RESUME_ALL;
4934 ieee80211_iterate_active_interfaces_atomic(ar->hw,
4936 ath10k_get_arvif_iter,
4938 if (!arvif_iter.arvif) {
4939 ath10k_warn(ar, "No VIF found for vdev %d\n", vdev_id);
4943 return arvif_iter.arvif;
4946 int ath10k_mac_register(struct ath10k *ar)
4948 struct ieee80211_supported_band *band;
4949 struct ieee80211_sta_vht_cap vht_cap;
4950 struct ieee80211_sta_ht_cap ht_cap;
4954 SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr);
4956 SET_IEEE80211_DEV(ar->hw, ar->dev);
4958 ht_cap = ath10k_get_ht_cap(ar);
4959 vht_cap = ath10k_create_vht_cap(ar);
4961 if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) {
4962 channels = kmemdup(ath10k_2ghz_channels,
4963 sizeof(ath10k_2ghz_channels),
4970 band = &ar->mac.sbands[IEEE80211_BAND_2GHZ];
4971 band->n_channels = ARRAY_SIZE(ath10k_2ghz_channels);
4972 band->channels = channels;
4973 band->n_bitrates = ath10k_g_rates_size;
4974 band->bitrates = ath10k_g_rates;
4975 band->ht_cap = ht_cap;
4977 /* vht is not supported in 2.4 GHz */
4979 ar->hw->wiphy->bands[IEEE80211_BAND_2GHZ] = band;
4982 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) {
4983 channels = kmemdup(ath10k_5ghz_channels,
4984 sizeof(ath10k_5ghz_channels),
4991 band = &ar->mac.sbands[IEEE80211_BAND_5GHZ];
4992 band->n_channels = ARRAY_SIZE(ath10k_5ghz_channels);
4993 band->channels = channels;
4994 band->n_bitrates = ath10k_a_rates_size;
4995 band->bitrates = ath10k_a_rates;
4996 band->ht_cap = ht_cap;
4997 band->vht_cap = vht_cap;
4998 ar->hw->wiphy->bands[IEEE80211_BAND_5GHZ] = band;
5001 ar->hw->wiphy->interface_modes =
5002 BIT(NL80211_IFTYPE_STATION) |
5003 BIT(NL80211_IFTYPE_AP);
5005 ar->hw->wiphy->available_antennas_rx = ar->supp_rx_chainmask;
5006 ar->hw->wiphy->available_antennas_tx = ar->supp_tx_chainmask;
5008 if (!test_bit(ATH10K_FW_FEATURE_NO_P2P, ar->fw_features))
5009 ar->hw->wiphy->interface_modes |=
5010 BIT(NL80211_IFTYPE_P2P_CLIENT) |
5011 BIT(NL80211_IFTYPE_P2P_GO);
5013 ar->hw->flags = IEEE80211_HW_SIGNAL_DBM |
5014 IEEE80211_HW_SUPPORTS_PS |
5015 IEEE80211_HW_SUPPORTS_DYNAMIC_PS |
5016 IEEE80211_HW_SUPPORTS_UAPSD |
5017 IEEE80211_HW_MFP_CAPABLE |
5018 IEEE80211_HW_REPORTS_TX_ACK_STATUS |
5019 IEEE80211_HW_HAS_RATE_CONTROL |
5020 IEEE80211_HW_AP_LINK_PS |
5021 IEEE80211_HW_SPECTRUM_MGMT;
5023 ar->hw->wiphy->features |= NL80211_FEATURE_STATIC_SMPS;
5025 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS)
5026 ar->hw->wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS;
5028 if (ar->ht_cap_info & WMI_HT_CAP_ENABLED) {
5029 ar->hw->flags |= IEEE80211_HW_AMPDU_AGGREGATION;
5030 ar->hw->flags |= IEEE80211_HW_TX_AMPDU_SETUP_IN_HW;
5033 ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID;
5034 ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN;
5036 ar->hw->vif_data_size = sizeof(struct ath10k_vif);
5037 ar->hw->sta_data_size = sizeof(struct ath10k_sta);
5039 ar->hw->max_listen_interval = ATH10K_MAX_HW_LISTEN_INTERVAL;
5041 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
5042 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
5043 ar->hw->wiphy->max_remain_on_channel_duration = 5000;
5045 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
5046 ar->hw->wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE;
5049 * on LL hardware queues are managed entirely by the FW
5050 * so we only advertise to mac we can do the queues thing
5054 if (test_bit(ATH10K_FW_FEATURE_WMI_10X, ar->fw_features)) {
5055 ar->hw->wiphy->iface_combinations = ath10k_10x_if_comb;
5056 ar->hw->wiphy->n_iface_combinations =
5057 ARRAY_SIZE(ath10k_10x_if_comb);
5059 ar->hw->wiphy->iface_combinations = ath10k_if_comb;
5060 ar->hw->wiphy->n_iface_combinations =
5061 ARRAY_SIZE(ath10k_if_comb);
5063 ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC);
5066 ar->hw->netdev_features = NETIF_F_HW_CSUM;
5068 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED)) {
5069 /* Init ath dfs pattern detector */
5070 ar->ath_common.debug_mask = ATH_DBG_DFS;
5071 ar->dfs_detector = dfs_pattern_detector_init(&ar->ath_common,
5074 if (!ar->dfs_detector)
5075 ath10k_warn(ar, "failed to initialise DFS pattern detector\n");
5078 ret = ath_regd_init(&ar->ath_common.regulatory, ar->hw->wiphy,
5079 ath10k_reg_notifier);
5081 ath10k_err(ar, "failed to initialise regulatory: %i\n", ret);
5085 ret = ieee80211_register_hw(ar->hw);
5087 ath10k_err(ar, "failed to register ieee80211: %d\n", ret);
5091 if (!ath_is_world_regd(&ar->ath_common.regulatory)) {
5092 ret = regulatory_hint(ar->hw->wiphy,
5093 ar->ath_common.regulatory.alpha2);
5095 goto err_unregister;
5101 ieee80211_unregister_hw(ar->hw);
5103 kfree(ar->mac.sbands[IEEE80211_BAND_2GHZ].channels);
5104 kfree(ar->mac.sbands[IEEE80211_BAND_5GHZ].channels);
5109 void ath10k_mac_unregister(struct ath10k *ar)
5111 ieee80211_unregister_hw(ar->hw);
5113 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector)
5114 ar->dfs_detector->exit(ar->dfs_detector);
5116 kfree(ar->mac.sbands[IEEE80211_BAND_2GHZ].channels);
5117 kfree(ar->mac.sbands[IEEE80211_BAND_5GHZ].channels);
5119 SET_IEEE80211_DEV(ar->hw, NULL);