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,
40 const u8 *macaddr, bool def_idx)
42 struct ath10k *ar = arvif->ar;
43 struct wmi_vdev_install_key_arg arg = {
44 .vdev_id = arvif->vdev_id,
45 .key_idx = key->keyidx,
46 .key_len = key->keylen,
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 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT;
63 case WLAN_CIPHER_SUITE_TKIP:
64 arg.key_cipher = WMI_CIPHER_TKIP;
65 arg.key_txmic_len = 8;
66 arg.key_rxmic_len = 8;
68 case WLAN_CIPHER_SUITE_WEP40:
69 case WLAN_CIPHER_SUITE_WEP104:
70 arg.key_cipher = WMI_CIPHER_WEP;
71 /* AP/IBSS mode requires self-key to be groupwise
72 * Otherwise pairwise key must be set */
73 if (memcmp(macaddr, arvif->vif->addr, ETH_ALEN))
74 arg.key_flags = WMI_KEY_PAIRWISE;
77 arg.key_flags |= WMI_KEY_TX_USAGE;
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,
95 const u8 *macaddr, bool def_idx)
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, def_idx);
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;
124 lockdep_assert_held(&ar->conf_mutex);
126 spin_lock_bh(&ar->data_lock);
127 peer = ath10k_peer_find(ar, arvif->vdev_id, addr);
128 spin_unlock_bh(&ar->data_lock);
133 for (i = 0; i < ARRAY_SIZE(arvif->wep_keys); i++) {
134 if (arvif->wep_keys[i] == NULL)
136 /* set TX_USAGE flag for default key id */
137 if (arvif->def_wep_key_idx == i)
142 ret = ath10k_install_key(arvif, arvif->wep_keys[i], SET_KEY,
147 spin_lock_bh(&ar->data_lock);
148 peer->keys[i] = arvif->wep_keys[i];
149 spin_unlock_bh(&ar->data_lock);
155 static int ath10k_clear_peer_keys(struct ath10k_vif *arvif,
158 struct ath10k *ar = arvif->ar;
159 struct ath10k_peer *peer;
164 lockdep_assert_held(&ar->conf_mutex);
166 spin_lock_bh(&ar->data_lock);
167 peer = ath10k_peer_find(ar, arvif->vdev_id, addr);
168 spin_unlock_bh(&ar->data_lock);
173 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
174 if (peer->keys[i] == NULL)
177 /* key flags are not required to delete the key */
178 ret = ath10k_install_key(arvif, peer->keys[i],
179 DISABLE_KEY, addr, false);
180 if (ret && first_errno == 0)
184 ath10k_warn(ar, "failed to remove peer wep key %d: %d\n",
187 spin_lock_bh(&ar->data_lock);
188 peer->keys[i] = NULL;
189 spin_unlock_bh(&ar->data_lock);
195 bool ath10k_mac_is_peer_wep_key_set(struct ath10k *ar, const u8 *addr,
198 struct ath10k_peer *peer;
201 lockdep_assert_held(&ar->data_lock);
203 /* We don't know which vdev this peer belongs to,
204 * since WMI doesn't give us that information.
206 * FIXME: multi-bss needs to be handled.
208 peer = ath10k_peer_find(ar, 0, addr);
212 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
213 if (peer->keys[i] && peer->keys[i]->keyidx == keyidx)
220 static int ath10k_clear_vdev_key(struct ath10k_vif *arvif,
221 struct ieee80211_key_conf *key)
223 struct ath10k *ar = arvif->ar;
224 struct ath10k_peer *peer;
230 lockdep_assert_held(&ar->conf_mutex);
233 /* since ath10k_install_key we can't hold data_lock all the
234 * time, so we try to remove the keys incrementally */
235 spin_lock_bh(&ar->data_lock);
237 list_for_each_entry(peer, &ar->peers, list) {
238 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
239 if (peer->keys[i] == key) {
240 ether_addr_copy(addr, peer->addr);
241 peer->keys[i] = NULL;
246 if (i < ARRAY_SIZE(peer->keys))
249 spin_unlock_bh(&ar->data_lock);
251 if (i == ARRAY_SIZE(peer->keys))
253 /* key flags are not required to delete the key */
254 ret = ath10k_install_key(arvif, key, DISABLE_KEY, addr, false);
255 if (ret && first_errno == 0)
259 ath10k_warn(ar, "failed to remove key for %pM: %d\n",
266 /*********************/
267 /* General utilities */
268 /*********************/
270 static inline enum wmi_phy_mode
271 chan_to_phymode(const struct cfg80211_chan_def *chandef)
273 enum wmi_phy_mode phymode = MODE_UNKNOWN;
275 switch (chandef->chan->band) {
276 case IEEE80211_BAND_2GHZ:
277 switch (chandef->width) {
278 case NL80211_CHAN_WIDTH_20_NOHT:
279 if (chandef->chan->flags & IEEE80211_CHAN_NO_OFDM)
284 case NL80211_CHAN_WIDTH_20:
285 phymode = MODE_11NG_HT20;
287 case NL80211_CHAN_WIDTH_40:
288 phymode = MODE_11NG_HT40;
290 case NL80211_CHAN_WIDTH_5:
291 case NL80211_CHAN_WIDTH_10:
292 case NL80211_CHAN_WIDTH_80:
293 case NL80211_CHAN_WIDTH_80P80:
294 case NL80211_CHAN_WIDTH_160:
295 phymode = MODE_UNKNOWN;
299 case IEEE80211_BAND_5GHZ:
300 switch (chandef->width) {
301 case NL80211_CHAN_WIDTH_20_NOHT:
304 case NL80211_CHAN_WIDTH_20:
305 phymode = MODE_11NA_HT20;
307 case NL80211_CHAN_WIDTH_40:
308 phymode = MODE_11NA_HT40;
310 case NL80211_CHAN_WIDTH_80:
311 phymode = MODE_11AC_VHT80;
313 case NL80211_CHAN_WIDTH_5:
314 case NL80211_CHAN_WIDTH_10:
315 case NL80211_CHAN_WIDTH_80P80:
316 case NL80211_CHAN_WIDTH_160:
317 phymode = MODE_UNKNOWN;
325 WARN_ON(phymode == MODE_UNKNOWN);
329 static u8 ath10k_parse_mpdudensity(u8 mpdudensity)
332 * 802.11n D2.0 defined values for "Minimum MPDU Start Spacing":
333 * 0 for no restriction
342 switch (mpdudensity) {
348 /* Our lower layer calculations limit our precision to
364 static int ath10k_peer_create(struct ath10k *ar, u32 vdev_id, const u8 *addr)
368 lockdep_assert_held(&ar->conf_mutex);
370 if (ar->num_peers >= ar->max_num_peers)
373 ret = ath10k_wmi_peer_create(ar, vdev_id, addr);
375 ath10k_warn(ar, "failed to create wmi peer %pM on vdev %i: %i\n",
380 ret = ath10k_wait_for_peer_created(ar, vdev_id, addr);
382 ath10k_warn(ar, "failed to wait for created wmi peer %pM on vdev %i: %i\n",
392 static int ath10k_mac_set_kickout(struct ath10k_vif *arvif)
394 struct ath10k *ar = arvif->ar;
398 param = ar->wmi.pdev_param->sta_kickout_th;
399 ret = ath10k_wmi_pdev_set_param(ar, param,
400 ATH10K_KICKOUT_THRESHOLD);
402 ath10k_warn(ar, "failed to set kickout threshold on vdev %i: %d\n",
403 arvif->vdev_id, ret);
407 param = ar->wmi.vdev_param->ap_keepalive_min_idle_inactive_time_secs;
408 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
409 ATH10K_KEEPALIVE_MIN_IDLE);
411 ath10k_warn(ar, "failed to set keepalive minimum idle time on vdev %i: %d\n",
412 arvif->vdev_id, ret);
416 param = ar->wmi.vdev_param->ap_keepalive_max_idle_inactive_time_secs;
417 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
418 ATH10K_KEEPALIVE_MAX_IDLE);
420 ath10k_warn(ar, "failed to set keepalive maximum idle time on vdev %i: %d\n",
421 arvif->vdev_id, ret);
425 param = ar->wmi.vdev_param->ap_keepalive_max_unresponsive_time_secs;
426 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
427 ATH10K_KEEPALIVE_MAX_UNRESPONSIVE);
429 ath10k_warn(ar, "failed to set keepalive maximum unresponsive time on vdev %i: %d\n",
430 arvif->vdev_id, ret);
437 static int ath10k_mac_set_rts(struct ath10k_vif *arvif, u32 value)
439 struct ath10k *ar = arvif->ar;
442 vdev_param = ar->wmi.vdev_param->rts_threshold;
443 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, value);
446 static int ath10k_mac_set_frag(struct ath10k_vif *arvif, u32 value)
448 struct ath10k *ar = arvif->ar;
451 if (value != 0xFFFFFFFF)
452 value = clamp_t(u32, arvif->ar->hw->wiphy->frag_threshold,
453 ATH10K_FRAGMT_THRESHOLD_MIN,
454 ATH10K_FRAGMT_THRESHOLD_MAX);
456 vdev_param = ar->wmi.vdev_param->fragmentation_threshold;
457 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, value);
460 static int ath10k_peer_delete(struct ath10k *ar, u32 vdev_id, const u8 *addr)
464 lockdep_assert_held(&ar->conf_mutex);
466 ret = ath10k_wmi_peer_delete(ar, vdev_id, addr);
470 ret = ath10k_wait_for_peer_deleted(ar, vdev_id, addr);
479 static void ath10k_peer_cleanup(struct ath10k *ar, u32 vdev_id)
481 struct ath10k_peer *peer, *tmp;
483 lockdep_assert_held(&ar->conf_mutex);
485 spin_lock_bh(&ar->data_lock);
486 list_for_each_entry_safe(peer, tmp, &ar->peers, list) {
487 if (peer->vdev_id != vdev_id)
490 ath10k_warn(ar, "removing stale peer %pM from vdev_id %d\n",
491 peer->addr, vdev_id);
493 list_del(&peer->list);
497 spin_unlock_bh(&ar->data_lock);
500 static void ath10k_peer_cleanup_all(struct ath10k *ar)
502 struct ath10k_peer *peer, *tmp;
504 lockdep_assert_held(&ar->conf_mutex);
506 spin_lock_bh(&ar->data_lock);
507 list_for_each_entry_safe(peer, tmp, &ar->peers, list) {
508 list_del(&peer->list);
511 spin_unlock_bh(&ar->data_lock);
514 ar->num_stations = 0;
517 /************************/
518 /* Interface management */
519 /************************/
521 void ath10k_mac_vif_beacon_free(struct ath10k_vif *arvif)
523 struct ath10k *ar = arvif->ar;
525 lockdep_assert_held(&ar->data_lock);
530 if (!arvif->beacon_buf)
531 dma_unmap_single(ar->dev, ATH10K_SKB_CB(arvif->beacon)->paddr,
532 arvif->beacon->len, DMA_TO_DEVICE);
534 if (WARN_ON(arvif->beacon_state != ATH10K_BEACON_SCHEDULED &&
535 arvif->beacon_state != ATH10K_BEACON_SENT))
538 dev_kfree_skb_any(arvif->beacon);
540 arvif->beacon = NULL;
541 arvif->beacon_state = ATH10K_BEACON_SCHEDULED;
544 static void ath10k_mac_vif_beacon_cleanup(struct ath10k_vif *arvif)
546 struct ath10k *ar = arvif->ar;
548 lockdep_assert_held(&ar->data_lock);
550 ath10k_mac_vif_beacon_free(arvif);
552 if (arvif->beacon_buf) {
553 dma_free_coherent(ar->dev, IEEE80211_MAX_FRAME_LEN,
554 arvif->beacon_buf, arvif->beacon_paddr);
555 arvif->beacon_buf = NULL;
559 static inline int ath10k_vdev_setup_sync(struct ath10k *ar)
563 lockdep_assert_held(&ar->conf_mutex);
565 if (test_bit(ATH10K_FLAG_CRASH_FLUSH, &ar->dev_flags))
568 ret = wait_for_completion_timeout(&ar->vdev_setup_done,
569 ATH10K_VDEV_SETUP_TIMEOUT_HZ);
576 static int ath10k_monitor_vdev_start(struct ath10k *ar, int vdev_id)
578 struct cfg80211_chan_def *chandef = &ar->chandef;
579 struct ieee80211_channel *channel = chandef->chan;
580 struct wmi_vdev_start_request_arg arg = {};
583 lockdep_assert_held(&ar->conf_mutex);
585 arg.vdev_id = vdev_id;
586 arg.channel.freq = channel->center_freq;
587 arg.channel.band_center_freq1 = chandef->center_freq1;
589 /* TODO setup this dynamically, what in case we
590 don't have any vifs? */
591 arg.channel.mode = chan_to_phymode(chandef);
592 arg.channel.chan_radar =
593 !!(channel->flags & IEEE80211_CHAN_RADAR);
595 arg.channel.min_power = 0;
596 arg.channel.max_power = channel->max_power * 2;
597 arg.channel.max_reg_power = channel->max_reg_power * 2;
598 arg.channel.max_antenna_gain = channel->max_antenna_gain * 2;
600 reinit_completion(&ar->vdev_setup_done);
602 ret = ath10k_wmi_vdev_start(ar, &arg);
604 ath10k_warn(ar, "failed to request monitor vdev %i start: %d\n",
609 ret = ath10k_vdev_setup_sync(ar);
611 ath10k_warn(ar, "failed to synchronize setup for monitor vdev %i start: %d\n",
616 ret = ath10k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr);
618 ath10k_warn(ar, "failed to put up monitor vdev %i: %d\n",
623 ar->monitor_vdev_id = vdev_id;
625 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %i started\n",
626 ar->monitor_vdev_id);
630 ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
632 ath10k_warn(ar, "failed to stop monitor vdev %i after start failure: %d\n",
633 ar->monitor_vdev_id, ret);
638 static int ath10k_monitor_vdev_stop(struct ath10k *ar)
642 lockdep_assert_held(&ar->conf_mutex);
644 ret = ath10k_wmi_vdev_down(ar, ar->monitor_vdev_id);
646 ath10k_warn(ar, "failed to put down monitor vdev %i: %d\n",
647 ar->monitor_vdev_id, ret);
649 reinit_completion(&ar->vdev_setup_done);
651 ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
653 ath10k_warn(ar, "failed to to request monitor vdev %i stop: %d\n",
654 ar->monitor_vdev_id, ret);
656 ret = ath10k_vdev_setup_sync(ar);
658 ath10k_warn(ar, "failed to synchronize monitor vdev %i stop: %d\n",
659 ar->monitor_vdev_id, ret);
661 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %i stopped\n",
662 ar->monitor_vdev_id);
666 static int ath10k_monitor_vdev_create(struct ath10k *ar)
670 lockdep_assert_held(&ar->conf_mutex);
672 if (ar->free_vdev_map == 0) {
673 ath10k_warn(ar, "failed to find free vdev id for monitor vdev\n");
677 bit = __ffs64(ar->free_vdev_map);
679 ar->monitor_vdev_id = bit;
681 ret = ath10k_wmi_vdev_create(ar, ar->monitor_vdev_id,
682 WMI_VDEV_TYPE_MONITOR,
685 ath10k_warn(ar, "failed to request monitor vdev %i creation: %d\n",
686 ar->monitor_vdev_id, ret);
690 ar->free_vdev_map &= ~(1LL << ar->monitor_vdev_id);
691 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %d created\n",
692 ar->monitor_vdev_id);
697 static int ath10k_monitor_vdev_delete(struct ath10k *ar)
701 lockdep_assert_held(&ar->conf_mutex);
703 ret = ath10k_wmi_vdev_delete(ar, ar->monitor_vdev_id);
705 ath10k_warn(ar, "failed to request wmi monitor vdev %i removal: %d\n",
706 ar->monitor_vdev_id, ret);
710 ar->free_vdev_map |= 1LL << ar->monitor_vdev_id;
712 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %d deleted\n",
713 ar->monitor_vdev_id);
717 static int ath10k_monitor_start(struct ath10k *ar)
721 lockdep_assert_held(&ar->conf_mutex);
723 ret = ath10k_monitor_vdev_create(ar);
725 ath10k_warn(ar, "failed to create monitor vdev: %d\n", ret);
729 ret = ath10k_monitor_vdev_start(ar, ar->monitor_vdev_id);
731 ath10k_warn(ar, "failed to start monitor vdev: %d\n", ret);
732 ath10k_monitor_vdev_delete(ar);
736 ar->monitor_started = true;
737 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor started\n");
742 static int ath10k_monitor_stop(struct ath10k *ar)
746 lockdep_assert_held(&ar->conf_mutex);
748 ret = ath10k_monitor_vdev_stop(ar);
750 ath10k_warn(ar, "failed to stop monitor vdev: %d\n", ret);
754 ret = ath10k_monitor_vdev_delete(ar);
756 ath10k_warn(ar, "failed to delete monitor vdev: %d\n", ret);
760 ar->monitor_started = false;
761 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor stopped\n");
766 static int ath10k_monitor_recalc(struct ath10k *ar)
770 lockdep_assert_held(&ar->conf_mutex);
772 should_start = ar->monitor ||
773 ar->filter_flags & FIF_PROMISC_IN_BSS ||
774 test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
776 ath10k_dbg(ar, ATH10K_DBG_MAC,
777 "mac monitor recalc started? %d should? %d\n",
778 ar->monitor_started, should_start);
780 if (should_start == ar->monitor_started)
784 return ath10k_monitor_start(ar);
786 return ath10k_monitor_stop(ar);
789 static int ath10k_recalc_rtscts_prot(struct ath10k_vif *arvif)
791 struct ath10k *ar = arvif->ar;
792 u32 vdev_param, rts_cts = 0;
794 lockdep_assert_held(&ar->conf_mutex);
796 vdev_param = ar->wmi.vdev_param->enable_rtscts;
798 if (arvif->use_cts_prot || arvif->num_legacy_stations > 0)
799 rts_cts |= SM(WMI_RTSCTS_ENABLED, WMI_RTSCTS_SET);
801 if (arvif->num_legacy_stations > 0)
802 rts_cts |= SM(WMI_RTSCTS_ACROSS_SW_RETRIES,
805 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
809 static int ath10k_start_cac(struct ath10k *ar)
813 lockdep_assert_held(&ar->conf_mutex);
815 set_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
817 ret = ath10k_monitor_recalc(ar);
819 ath10k_warn(ar, "failed to start monitor (cac): %d\n", ret);
820 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
824 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac cac start monitor vdev %d\n",
825 ar->monitor_vdev_id);
830 static int ath10k_stop_cac(struct ath10k *ar)
832 lockdep_assert_held(&ar->conf_mutex);
834 /* CAC is not running - do nothing */
835 if (!test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags))
838 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
839 ath10k_monitor_stop(ar);
841 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac cac finished\n");
846 static void ath10k_recalc_radar_detection(struct ath10k *ar)
850 lockdep_assert_held(&ar->conf_mutex);
854 if (!ar->radar_enabled)
857 if (ar->num_started_vdevs > 0)
860 ret = ath10k_start_cac(ar);
863 * Not possible to start CAC on current channel so starting
864 * radiation is not allowed, make this channel DFS_UNAVAILABLE
865 * by indicating that radar was detected.
867 ath10k_warn(ar, "failed to start CAC: %d\n", ret);
868 ieee80211_radar_detected(ar->hw);
872 static int ath10k_vdev_start_restart(struct ath10k_vif *arvif, bool restart)
874 struct ath10k *ar = arvif->ar;
875 struct cfg80211_chan_def *chandef = &ar->chandef;
876 struct wmi_vdev_start_request_arg arg = {};
879 lockdep_assert_held(&ar->conf_mutex);
881 reinit_completion(&ar->vdev_setup_done);
883 arg.vdev_id = arvif->vdev_id;
884 arg.dtim_period = arvif->dtim_period;
885 arg.bcn_intval = arvif->beacon_interval;
887 arg.channel.freq = chandef->chan->center_freq;
888 arg.channel.band_center_freq1 = chandef->center_freq1;
889 arg.channel.mode = chan_to_phymode(chandef);
891 arg.channel.min_power = 0;
892 arg.channel.max_power = chandef->chan->max_power * 2;
893 arg.channel.max_reg_power = chandef->chan->max_reg_power * 2;
894 arg.channel.max_antenna_gain = chandef->chan->max_antenna_gain * 2;
896 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
897 arg.ssid = arvif->u.ap.ssid;
898 arg.ssid_len = arvif->u.ap.ssid_len;
899 arg.hidden_ssid = arvif->u.ap.hidden_ssid;
901 /* For now allow DFS for AP mode */
902 arg.channel.chan_radar =
903 !!(chandef->chan->flags & IEEE80211_CHAN_RADAR);
904 } else if (arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
905 arg.ssid = arvif->vif->bss_conf.ssid;
906 arg.ssid_len = arvif->vif->bss_conf.ssid_len;
909 ath10k_dbg(ar, ATH10K_DBG_MAC,
910 "mac vdev %d start center_freq %d phymode %s\n",
911 arg.vdev_id, arg.channel.freq,
912 ath10k_wmi_phymode_str(arg.channel.mode));
915 ret = ath10k_wmi_vdev_restart(ar, &arg);
917 ret = ath10k_wmi_vdev_start(ar, &arg);
920 ath10k_warn(ar, "failed to start WMI vdev %i: %d\n",
925 ret = ath10k_vdev_setup_sync(ar);
928 "failed to synchronize setup for vdev %i restart %d: %d\n",
929 arg.vdev_id, restart, ret);
933 ar->num_started_vdevs++;
934 ath10k_recalc_radar_detection(ar);
939 static int ath10k_vdev_start(struct ath10k_vif *arvif)
941 return ath10k_vdev_start_restart(arvif, false);
944 static int ath10k_vdev_restart(struct ath10k_vif *arvif)
946 return ath10k_vdev_start_restart(arvif, true);
949 static int ath10k_vdev_stop(struct ath10k_vif *arvif)
951 struct ath10k *ar = arvif->ar;
954 lockdep_assert_held(&ar->conf_mutex);
956 reinit_completion(&ar->vdev_setup_done);
958 ret = ath10k_wmi_vdev_stop(ar, arvif->vdev_id);
960 ath10k_warn(ar, "failed to stop WMI vdev %i: %d\n",
961 arvif->vdev_id, ret);
965 ret = ath10k_vdev_setup_sync(ar);
967 ath10k_warn(ar, "failed to synchronize setup for vdev %i stop: %d\n",
968 arvif->vdev_id, ret);
972 WARN_ON(ar->num_started_vdevs == 0);
974 if (ar->num_started_vdevs != 0) {
975 ar->num_started_vdevs--;
976 ath10k_recalc_radar_detection(ar);
982 static int ath10k_mac_setup_bcn_p2p_ie(struct ath10k_vif *arvif,
985 struct ath10k *ar = arvif->ar;
986 struct ieee80211_mgmt *mgmt;
990 if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
993 if (arvif->vdev_subtype != WMI_VDEV_SUBTYPE_P2P_GO)
996 mgmt = (void *)bcn->data;
997 p2p_ie = cfg80211_find_vendor_ie(WLAN_OUI_WFA, WLAN_OUI_TYPE_WFA_P2P,
998 mgmt->u.beacon.variable,
999 bcn->len - (mgmt->u.beacon.variable -
1004 ret = ath10k_wmi_p2p_go_bcn_ie(ar, arvif->vdev_id, p2p_ie);
1006 ath10k_warn(ar, "failed to submit p2p go bcn ie for vdev %i: %d\n",
1007 arvif->vdev_id, ret);
1014 static int ath10k_mac_remove_vendor_ie(struct sk_buff *skb, unsigned int oui,
1015 u8 oui_type, size_t ie_offset)
1022 if (WARN_ON(skb->len < ie_offset))
1025 ie = (u8 *)cfg80211_find_vendor_ie(oui, oui_type,
1026 skb->data + ie_offset,
1027 skb->len - ie_offset);
1032 end = skb->data + skb->len;
1035 if (WARN_ON(next > end))
1038 memmove(ie, next, end - next);
1039 skb_trim(skb, skb->len - len);
1044 static int ath10k_mac_setup_bcn_tmpl(struct ath10k_vif *arvif)
1046 struct ath10k *ar = arvif->ar;
1047 struct ieee80211_hw *hw = ar->hw;
1048 struct ieee80211_vif *vif = arvif->vif;
1049 struct ieee80211_mutable_offsets offs = {};
1050 struct sk_buff *bcn;
1053 if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map))
1056 bcn = ieee80211_beacon_get_template(hw, vif, &offs);
1058 ath10k_warn(ar, "failed to get beacon template from mac80211\n");
1062 ret = ath10k_mac_setup_bcn_p2p_ie(arvif, bcn);
1064 ath10k_warn(ar, "failed to setup p2p go bcn ie: %d\n", ret);
1069 /* P2P IE is inserted by firmware automatically (as configured above)
1070 * so remove it from the base beacon template to avoid duplicate P2P
1071 * IEs in beacon frames.
1073 ath10k_mac_remove_vendor_ie(bcn, WLAN_OUI_WFA, WLAN_OUI_TYPE_WFA_P2P,
1074 offsetof(struct ieee80211_mgmt,
1075 u.beacon.variable));
1077 ret = ath10k_wmi_bcn_tmpl(ar, arvif->vdev_id, offs.tim_offset, bcn, 0,
1082 ath10k_warn(ar, "failed to submit beacon template command: %d\n",
1090 static int ath10k_mac_setup_prb_tmpl(struct ath10k_vif *arvif)
1092 struct ath10k *ar = arvif->ar;
1093 struct ieee80211_hw *hw = ar->hw;
1094 struct ieee80211_vif *vif = arvif->vif;
1095 struct sk_buff *prb;
1098 if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map))
1101 prb = ieee80211_proberesp_get(hw, vif);
1103 ath10k_warn(ar, "failed to get probe resp template from mac80211\n");
1107 ret = ath10k_wmi_prb_tmpl(ar, arvif->vdev_id, prb);
1111 ath10k_warn(ar, "failed to submit probe resp template command: %d\n",
1119 static void ath10k_control_beaconing(struct ath10k_vif *arvif,
1120 struct ieee80211_bss_conf *info)
1122 struct ath10k *ar = arvif->ar;
1125 lockdep_assert_held(&arvif->ar->conf_mutex);
1127 if (!info->enable_beacon) {
1128 ath10k_vdev_stop(arvif);
1130 arvif->is_started = false;
1131 arvif->is_up = false;
1133 spin_lock_bh(&arvif->ar->data_lock);
1134 ath10k_mac_vif_beacon_free(arvif);
1135 spin_unlock_bh(&arvif->ar->data_lock);
1140 arvif->tx_seq_no = 0x1000;
1142 ret = ath10k_vdev_start(arvif);
1147 ether_addr_copy(arvif->bssid, info->bssid);
1149 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
1152 ath10k_warn(ar, "failed to bring up vdev %d: %i\n",
1153 arvif->vdev_id, ret);
1154 ath10k_vdev_stop(arvif);
1158 arvif->is_started = true;
1159 arvif->is_up = true;
1161 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d up\n", arvif->vdev_id);
1164 static void ath10k_control_ibss(struct ath10k_vif *arvif,
1165 struct ieee80211_bss_conf *info,
1166 const u8 self_peer[ETH_ALEN])
1168 struct ath10k *ar = arvif->ar;
1172 lockdep_assert_held(&arvif->ar->conf_mutex);
1174 if (!info->ibss_joined) {
1175 ret = ath10k_peer_delete(arvif->ar, arvif->vdev_id, self_peer);
1177 ath10k_warn(ar, "failed to delete IBSS self peer %pM for vdev %d: %d\n",
1178 self_peer, arvif->vdev_id, ret);
1180 if (is_zero_ether_addr(arvif->bssid))
1183 memset(arvif->bssid, 0, ETH_ALEN);
1188 ret = ath10k_peer_create(arvif->ar, arvif->vdev_id, self_peer);
1190 ath10k_warn(ar, "failed to create IBSS self peer %pM for vdev %d: %d\n",
1191 self_peer, arvif->vdev_id, ret);
1195 vdev_param = arvif->ar->wmi.vdev_param->atim_window;
1196 ret = ath10k_wmi_vdev_set_param(arvif->ar, arvif->vdev_id, vdev_param,
1197 ATH10K_DEFAULT_ATIM);
1199 ath10k_warn(ar, "failed to set IBSS ATIM for vdev %d: %d\n",
1200 arvif->vdev_id, ret);
1203 static int ath10k_mac_vif_recalc_ps_wake_threshold(struct ath10k_vif *arvif)
1205 struct ath10k *ar = arvif->ar;
1210 lockdep_assert_held(&arvif->ar->conf_mutex);
1212 if (arvif->u.sta.uapsd)
1213 value = WMI_STA_PS_TX_WAKE_THRESHOLD_NEVER;
1215 value = WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS;
1217 param = WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD;
1218 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param, value);
1220 ath10k_warn(ar, "failed to submit ps wake threshold %u on vdev %i: %d\n",
1221 value, arvif->vdev_id, ret);
1228 static int ath10k_mac_vif_recalc_ps_poll_count(struct ath10k_vif *arvif)
1230 struct ath10k *ar = arvif->ar;
1235 lockdep_assert_held(&arvif->ar->conf_mutex);
1237 if (arvif->u.sta.uapsd)
1238 value = WMI_STA_PS_PSPOLL_COUNT_UAPSD;
1240 value = WMI_STA_PS_PSPOLL_COUNT_NO_MAX;
1242 param = WMI_STA_PS_PARAM_PSPOLL_COUNT;
1243 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
1246 ath10k_warn(ar, "failed to submit ps poll count %u on vdev %i: %d\n",
1247 value, arvif->vdev_id, ret);
1254 static int ath10k_mac_vif_setup_ps(struct ath10k_vif *arvif)
1256 struct ath10k *ar = arvif->ar;
1257 struct ieee80211_vif *vif = arvif->vif;
1258 struct ieee80211_conf *conf = &ar->hw->conf;
1259 enum wmi_sta_powersave_param param;
1260 enum wmi_sta_ps_mode psmode;
1264 lockdep_assert_held(&arvif->ar->conf_mutex);
1266 if (arvif->vif->type != NL80211_IFTYPE_STATION)
1269 if (vif->bss_conf.ps) {
1270 psmode = WMI_STA_PS_MODE_ENABLED;
1271 param = WMI_STA_PS_PARAM_INACTIVITY_TIME;
1273 ps_timeout = conf->dynamic_ps_timeout;
1274 if (ps_timeout == 0) {
1275 /* Firmware doesn't like 0 */
1276 ps_timeout = ieee80211_tu_to_usec(
1277 vif->bss_conf.beacon_int) / 1000;
1280 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param,
1283 ath10k_warn(ar, "failed to set inactivity time for vdev %d: %i\n",
1284 arvif->vdev_id, ret);
1288 psmode = WMI_STA_PS_MODE_DISABLED;
1291 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d psmode %s\n",
1292 arvif->vdev_id, psmode ? "enable" : "disable");
1294 ret = ath10k_wmi_set_psmode(ar, arvif->vdev_id, psmode);
1296 ath10k_warn(ar, "failed to set PS Mode %d for vdev %d: %d\n",
1297 psmode, arvif->vdev_id, ret);
1304 static int ath10k_mac_vif_disable_keepalive(struct ath10k_vif *arvif)
1306 struct ath10k *ar = arvif->ar;
1307 struct wmi_sta_keepalive_arg arg = {};
1310 lockdep_assert_held(&arvif->ar->conf_mutex);
1312 if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
1315 if (!test_bit(WMI_SERVICE_STA_KEEP_ALIVE, ar->wmi.svc_map))
1318 /* Some firmware revisions have a bug and ignore the `enabled` field.
1319 * Instead use the interval to disable the keepalive.
1321 arg.vdev_id = arvif->vdev_id;
1323 arg.method = WMI_STA_KEEPALIVE_METHOD_NULL_FRAME;
1324 arg.interval = WMI_STA_KEEPALIVE_INTERVAL_DISABLE;
1326 ret = ath10k_wmi_sta_keepalive(ar, &arg);
1328 ath10k_warn(ar, "failed to submit keepalive on vdev %i: %d\n",
1329 arvif->vdev_id, ret);
1336 /**********************/
1337 /* Station management */
1338 /**********************/
1340 static u32 ath10k_peer_assoc_h_listen_intval(struct ath10k *ar,
1341 struct ieee80211_vif *vif)
1343 /* Some firmware revisions have unstable STA powersave when listen
1344 * interval is set too high (e.g. 5). The symptoms are firmware doesn't
1345 * generate NullFunc frames properly even if buffered frames have been
1346 * indicated in Beacon TIM. Firmware would seldom wake up to pull
1347 * buffered frames. Often pinging the device from AP would simply fail.
1349 * As a workaround set it to 1.
1351 if (vif->type == NL80211_IFTYPE_STATION)
1354 return ar->hw->conf.listen_interval;
1357 static void ath10k_peer_assoc_h_basic(struct ath10k *ar,
1358 struct ieee80211_vif *vif,
1359 struct ieee80211_sta *sta,
1360 struct wmi_peer_assoc_complete_arg *arg)
1362 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1364 lockdep_assert_held(&ar->conf_mutex);
1366 ether_addr_copy(arg->addr, sta->addr);
1367 arg->vdev_id = arvif->vdev_id;
1368 arg->peer_aid = sta->aid;
1369 arg->peer_flags |= WMI_PEER_AUTH;
1370 arg->peer_listen_intval = ath10k_peer_assoc_h_listen_intval(ar, vif);
1371 arg->peer_num_spatial_streams = 1;
1372 arg->peer_caps = vif->bss_conf.assoc_capability;
1375 static void ath10k_peer_assoc_h_crypto(struct ath10k *ar,
1376 struct ieee80211_vif *vif,
1377 struct wmi_peer_assoc_complete_arg *arg)
1379 struct ieee80211_bss_conf *info = &vif->bss_conf;
1380 struct cfg80211_bss *bss;
1381 const u8 *rsnie = NULL;
1382 const u8 *wpaie = NULL;
1384 lockdep_assert_held(&ar->conf_mutex);
1386 bss = cfg80211_get_bss(ar->hw->wiphy, ar->hw->conf.chandef.chan,
1387 info->bssid, NULL, 0, 0, 0);
1389 const struct cfg80211_bss_ies *ies;
1392 rsnie = ieee80211_bss_get_ie(bss, WLAN_EID_RSN);
1394 ies = rcu_dereference(bss->ies);
1396 wpaie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
1397 WLAN_OUI_TYPE_MICROSOFT_WPA,
1401 cfg80211_put_bss(ar->hw->wiphy, bss);
1404 /* FIXME: base on RSN IE/WPA IE is a correct idea? */
1405 if (rsnie || wpaie) {
1406 ath10k_dbg(ar, ATH10K_DBG_WMI, "%s: rsn ie found\n", __func__);
1407 arg->peer_flags |= WMI_PEER_NEED_PTK_4_WAY;
1411 ath10k_dbg(ar, ATH10K_DBG_WMI, "%s: wpa ie found\n", __func__);
1412 arg->peer_flags |= WMI_PEER_NEED_GTK_2_WAY;
1416 static void ath10k_peer_assoc_h_rates(struct ath10k *ar,
1417 struct ieee80211_sta *sta,
1418 struct wmi_peer_assoc_complete_arg *arg)
1420 struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates;
1421 const struct ieee80211_supported_band *sband;
1422 const struct ieee80211_rate *rates;
1426 lockdep_assert_held(&ar->conf_mutex);
1428 sband = ar->hw->wiphy->bands[ar->hw->conf.chandef.chan->band];
1429 ratemask = sta->supp_rates[ar->hw->conf.chandef.chan->band];
1430 rates = sband->bitrates;
1432 rateset->num_rates = 0;
1434 for (i = 0; i < 32; i++, ratemask >>= 1, rates++) {
1435 if (!(ratemask & 1))
1438 rateset->rates[rateset->num_rates] = rates->hw_value;
1439 rateset->num_rates++;
1443 static void ath10k_peer_assoc_h_ht(struct ath10k *ar,
1444 struct ieee80211_sta *sta,
1445 struct wmi_peer_assoc_complete_arg *arg)
1447 const struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
1451 lockdep_assert_held(&ar->conf_mutex);
1453 if (!ht_cap->ht_supported)
1456 arg->peer_flags |= WMI_PEER_HT;
1457 arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
1458 ht_cap->ampdu_factor)) - 1;
1460 arg->peer_mpdu_density =
1461 ath10k_parse_mpdudensity(ht_cap->ampdu_density);
1463 arg->peer_ht_caps = ht_cap->cap;
1464 arg->peer_rate_caps |= WMI_RC_HT_FLAG;
1466 if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING)
1467 arg->peer_flags |= WMI_PEER_LDPC;
1469 if (sta->bandwidth >= IEEE80211_STA_RX_BW_40) {
1470 arg->peer_flags |= WMI_PEER_40MHZ;
1471 arg->peer_rate_caps |= WMI_RC_CW40_FLAG;
1474 if (ht_cap->cap & IEEE80211_HT_CAP_SGI_20)
1475 arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
1477 if (ht_cap->cap & IEEE80211_HT_CAP_SGI_40)
1478 arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
1480 if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) {
1481 arg->peer_rate_caps |= WMI_RC_TX_STBC_FLAG;
1482 arg->peer_flags |= WMI_PEER_STBC;
1485 if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) {
1486 stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC;
1487 stbc = stbc >> IEEE80211_HT_CAP_RX_STBC_SHIFT;
1488 stbc = stbc << WMI_RC_RX_STBC_FLAG_S;
1489 arg->peer_rate_caps |= stbc;
1490 arg->peer_flags |= WMI_PEER_STBC;
1493 if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2])
1494 arg->peer_rate_caps |= WMI_RC_TS_FLAG;
1495 else if (ht_cap->mcs.rx_mask[1])
1496 arg->peer_rate_caps |= WMI_RC_DS_FLAG;
1498 for (i = 0, n = 0; i < IEEE80211_HT_MCS_MASK_LEN*8; i++)
1499 if (ht_cap->mcs.rx_mask[i/8] & (1 << i%8))
1500 arg->peer_ht_rates.rates[n++] = i;
1503 * This is a workaround for HT-enabled STAs which break the spec
1504 * and have no HT capabilities RX mask (no HT RX MCS map).
1506 * As per spec, in section 20.3.5 Modulation and coding scheme (MCS),
1507 * MCS 0 through 7 are mandatory in 20MHz with 800 ns GI at all STAs.
1509 * Firmware asserts if such situation occurs.
1512 arg->peer_ht_rates.num_rates = 8;
1513 for (i = 0; i < arg->peer_ht_rates.num_rates; i++)
1514 arg->peer_ht_rates.rates[i] = i;
1516 arg->peer_ht_rates.num_rates = n;
1517 arg->peer_num_spatial_streams = sta->rx_nss;
1520 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n",
1522 arg->peer_ht_rates.num_rates,
1523 arg->peer_num_spatial_streams);
1526 static int ath10k_peer_assoc_qos_ap(struct ath10k *ar,
1527 struct ath10k_vif *arvif,
1528 struct ieee80211_sta *sta)
1534 lockdep_assert_held(&ar->conf_mutex);
1536 if (sta->wme && sta->uapsd_queues) {
1537 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac uapsd_queues 0x%x max_sp %d\n",
1538 sta->uapsd_queues, sta->max_sp);
1540 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO)
1541 uapsd |= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN |
1542 WMI_AP_PS_UAPSD_AC3_TRIGGER_EN;
1543 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI)
1544 uapsd |= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN |
1545 WMI_AP_PS_UAPSD_AC2_TRIGGER_EN;
1546 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK)
1547 uapsd |= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN |
1548 WMI_AP_PS_UAPSD_AC1_TRIGGER_EN;
1549 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE)
1550 uapsd |= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN |
1551 WMI_AP_PS_UAPSD_AC0_TRIGGER_EN;
1553 if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP)
1554 max_sp = sta->max_sp;
1556 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
1558 WMI_AP_PS_PEER_PARAM_UAPSD,
1561 ath10k_warn(ar, "failed to set ap ps peer param uapsd for vdev %i: %d\n",
1562 arvif->vdev_id, ret);
1566 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
1568 WMI_AP_PS_PEER_PARAM_MAX_SP,
1571 ath10k_warn(ar, "failed to set ap ps peer param max sp for vdev %i: %d\n",
1572 arvif->vdev_id, ret);
1576 /* TODO setup this based on STA listen interval and
1577 beacon interval. Currently we don't know
1578 sta->listen_interval - mac80211 patch required.
1579 Currently use 10 seconds */
1580 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id, sta->addr,
1581 WMI_AP_PS_PEER_PARAM_AGEOUT_TIME,
1584 ath10k_warn(ar, "failed to set ap ps peer param ageout time for vdev %i: %d\n",
1585 arvif->vdev_id, ret);
1593 static void ath10k_peer_assoc_h_vht(struct ath10k *ar,
1594 struct ieee80211_sta *sta,
1595 struct wmi_peer_assoc_complete_arg *arg)
1597 const struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
1600 if (!vht_cap->vht_supported)
1603 arg->peer_flags |= WMI_PEER_VHT;
1605 if (ar->hw->conf.chandef.chan->band == IEEE80211_BAND_2GHZ)
1606 arg->peer_flags |= WMI_PEER_VHT_2G;
1608 arg->peer_vht_caps = vht_cap->cap;
1610 ampdu_factor = (vht_cap->cap &
1611 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >>
1612 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
1614 /* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to
1615 * zero in VHT IE. Using it would result in degraded throughput.
1616 * arg->peer_max_mpdu at this point contains HT max_mpdu so keep
1617 * it if VHT max_mpdu is smaller. */
1618 arg->peer_max_mpdu = max(arg->peer_max_mpdu,
1619 (1U << (IEEE80211_HT_MAX_AMPDU_FACTOR +
1620 ampdu_factor)) - 1);
1622 if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
1623 arg->peer_flags |= WMI_PEER_80MHZ;
1625 arg->peer_vht_rates.rx_max_rate =
1626 __le16_to_cpu(vht_cap->vht_mcs.rx_highest);
1627 arg->peer_vht_rates.rx_mcs_set =
1628 __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map);
1629 arg->peer_vht_rates.tx_max_rate =
1630 __le16_to_cpu(vht_cap->vht_mcs.tx_highest);
1631 arg->peer_vht_rates.tx_mcs_set =
1632 __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map);
1634 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vht peer %pM max_mpdu %d flags 0x%x\n",
1635 sta->addr, arg->peer_max_mpdu, arg->peer_flags);
1638 static void ath10k_peer_assoc_h_qos(struct ath10k *ar,
1639 struct ieee80211_vif *vif,
1640 struct ieee80211_sta *sta,
1641 struct wmi_peer_assoc_complete_arg *arg)
1643 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1645 switch (arvif->vdev_type) {
1646 case WMI_VDEV_TYPE_AP:
1648 arg->peer_flags |= WMI_PEER_QOS;
1650 if (sta->wme && sta->uapsd_queues) {
1651 arg->peer_flags |= WMI_PEER_APSD;
1652 arg->peer_rate_caps |= WMI_RC_UAPSD_FLAG;
1655 case WMI_VDEV_TYPE_STA:
1656 if (vif->bss_conf.qos)
1657 arg->peer_flags |= WMI_PEER_QOS;
1659 case WMI_VDEV_TYPE_IBSS:
1661 arg->peer_flags |= WMI_PEER_QOS;
1667 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac peer %pM qos %d\n",
1668 sta->addr, !!(arg->peer_flags & WMI_PEER_QOS));
1671 static bool ath10k_mac_sta_has_11g_rates(struct ieee80211_sta *sta)
1673 /* First 4 rates in ath10k_rates are CCK (11b) rates. */
1674 return sta->supp_rates[IEEE80211_BAND_2GHZ] >> 4;
1677 static void ath10k_peer_assoc_h_phymode(struct ath10k *ar,
1678 struct ieee80211_vif *vif,
1679 struct ieee80211_sta *sta,
1680 struct wmi_peer_assoc_complete_arg *arg)
1682 enum wmi_phy_mode phymode = MODE_UNKNOWN;
1684 switch (ar->hw->conf.chandef.chan->band) {
1685 case IEEE80211_BAND_2GHZ:
1686 if (sta->vht_cap.vht_supported) {
1687 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1688 phymode = MODE_11AC_VHT40;
1690 phymode = MODE_11AC_VHT20;
1691 } else if (sta->ht_cap.ht_supported) {
1692 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1693 phymode = MODE_11NG_HT40;
1695 phymode = MODE_11NG_HT20;
1696 } else if (ath10k_mac_sta_has_11g_rates(sta)) {
1703 case IEEE80211_BAND_5GHZ:
1707 if (sta->vht_cap.vht_supported) {
1708 if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
1709 phymode = MODE_11AC_VHT80;
1710 else if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1711 phymode = MODE_11AC_VHT40;
1712 else if (sta->bandwidth == IEEE80211_STA_RX_BW_20)
1713 phymode = MODE_11AC_VHT20;
1714 } else if (sta->ht_cap.ht_supported) {
1715 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1716 phymode = MODE_11NA_HT40;
1718 phymode = MODE_11NA_HT20;
1728 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac peer %pM phymode %s\n",
1729 sta->addr, ath10k_wmi_phymode_str(phymode));
1731 arg->peer_phymode = phymode;
1732 WARN_ON(phymode == MODE_UNKNOWN);
1735 static int ath10k_peer_assoc_prepare(struct ath10k *ar,
1736 struct ieee80211_vif *vif,
1737 struct ieee80211_sta *sta,
1738 struct wmi_peer_assoc_complete_arg *arg)
1740 lockdep_assert_held(&ar->conf_mutex);
1742 memset(arg, 0, sizeof(*arg));
1744 ath10k_peer_assoc_h_basic(ar, vif, sta, arg);
1745 ath10k_peer_assoc_h_crypto(ar, vif, arg);
1746 ath10k_peer_assoc_h_rates(ar, sta, arg);
1747 ath10k_peer_assoc_h_ht(ar, sta, arg);
1748 ath10k_peer_assoc_h_vht(ar, sta, arg);
1749 ath10k_peer_assoc_h_qos(ar, vif, sta, arg);
1750 ath10k_peer_assoc_h_phymode(ar, vif, sta, arg);
1755 static const u32 ath10k_smps_map[] = {
1756 [WLAN_HT_CAP_SM_PS_STATIC] = WMI_PEER_SMPS_STATIC,
1757 [WLAN_HT_CAP_SM_PS_DYNAMIC] = WMI_PEER_SMPS_DYNAMIC,
1758 [WLAN_HT_CAP_SM_PS_INVALID] = WMI_PEER_SMPS_PS_NONE,
1759 [WLAN_HT_CAP_SM_PS_DISABLED] = WMI_PEER_SMPS_PS_NONE,
1762 static int ath10k_setup_peer_smps(struct ath10k *ar, struct ath10k_vif *arvif,
1764 const struct ieee80211_sta_ht_cap *ht_cap)
1768 if (!ht_cap->ht_supported)
1771 smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
1772 smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
1774 if (smps >= ARRAY_SIZE(ath10k_smps_map))
1777 return ath10k_wmi_peer_set_param(ar, arvif->vdev_id, addr,
1778 WMI_PEER_SMPS_STATE,
1779 ath10k_smps_map[smps]);
1782 static int ath10k_mac_vif_recalc_txbf(struct ath10k *ar,
1783 struct ieee80211_vif *vif,
1784 struct ieee80211_sta_vht_cap vht_cap)
1786 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1791 if (!(ar->vht_cap_info &
1792 (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
1793 IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE |
1794 IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
1795 IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)))
1798 param = ar->wmi.vdev_param->txbf;
1801 if (WARN_ON(param == WMI_VDEV_PARAM_UNSUPPORTED))
1804 /* The following logic is correct. If a remote STA advertises support
1805 * for being a beamformer then we should enable us being a beamformee.
1808 if (ar->vht_cap_info &
1809 (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
1810 IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)) {
1811 if (vht_cap.cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)
1812 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
1814 if (vht_cap.cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)
1815 value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFEE;
1818 if (ar->vht_cap_info &
1819 (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
1820 IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)) {
1821 if (vht_cap.cap & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)
1822 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
1824 if (vht_cap.cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)
1825 value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFER;
1828 if (value & WMI_VDEV_PARAM_TXBF_MU_TX_BFEE)
1829 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
1831 if (value & WMI_VDEV_PARAM_TXBF_MU_TX_BFER)
1832 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
1834 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param, value);
1836 ath10k_warn(ar, "failed to submit vdev param txbf 0x%x: %d\n",
1844 /* can be called only in mac80211 callbacks due to `key_count` usage */
1845 static void ath10k_bss_assoc(struct ieee80211_hw *hw,
1846 struct ieee80211_vif *vif,
1847 struct ieee80211_bss_conf *bss_conf)
1849 struct ath10k *ar = hw->priv;
1850 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1851 struct ieee80211_sta_ht_cap ht_cap;
1852 struct ieee80211_sta_vht_cap vht_cap;
1853 struct wmi_peer_assoc_complete_arg peer_arg;
1854 struct ieee80211_sta *ap_sta;
1857 lockdep_assert_held(&ar->conf_mutex);
1859 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i assoc bssid %pM aid %d\n",
1860 arvif->vdev_id, arvif->bssid, arvif->aid);
1864 ap_sta = ieee80211_find_sta(vif, bss_conf->bssid);
1866 ath10k_warn(ar, "failed to find station entry for bss %pM vdev %i\n",
1867 bss_conf->bssid, arvif->vdev_id);
1872 /* ap_sta must be accessed only within rcu section which must be left
1873 * before calling ath10k_setup_peer_smps() which might sleep. */
1874 ht_cap = ap_sta->ht_cap;
1875 vht_cap = ap_sta->vht_cap;
1877 ret = ath10k_peer_assoc_prepare(ar, vif, ap_sta, &peer_arg);
1879 ath10k_warn(ar, "failed to prepare peer assoc for %pM vdev %i: %d\n",
1880 bss_conf->bssid, arvif->vdev_id, ret);
1887 ret = ath10k_wmi_peer_assoc(ar, &peer_arg);
1889 ath10k_warn(ar, "failed to run peer assoc for %pM vdev %i: %d\n",
1890 bss_conf->bssid, arvif->vdev_id, ret);
1894 ret = ath10k_setup_peer_smps(ar, arvif, bss_conf->bssid, &ht_cap);
1896 ath10k_warn(ar, "failed to setup peer SMPS for vdev %i: %d\n",
1897 arvif->vdev_id, ret);
1901 ret = ath10k_mac_vif_recalc_txbf(ar, vif, vht_cap);
1903 ath10k_warn(ar, "failed to recalc txbf for vdev %i on bss %pM: %d\n",
1904 arvif->vdev_id, bss_conf->bssid, ret);
1908 ath10k_dbg(ar, ATH10K_DBG_MAC,
1909 "mac vdev %d up (associated) bssid %pM aid %d\n",
1910 arvif->vdev_id, bss_conf->bssid, bss_conf->aid);
1912 WARN_ON(arvif->is_up);
1914 arvif->aid = bss_conf->aid;
1915 ether_addr_copy(arvif->bssid, bss_conf->bssid);
1917 ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid);
1919 ath10k_warn(ar, "failed to set vdev %d up: %d\n",
1920 arvif->vdev_id, ret);
1924 arvif->is_up = true;
1926 /* Workaround: Some firmware revisions (tested with qca6174
1927 * WLAN.RM.2.0-00073) have buggy powersave state machine and must be
1928 * poked with peer param command.
1930 ret = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, arvif->bssid,
1931 WMI_PEER_DUMMY_VAR, 1);
1933 ath10k_warn(ar, "failed to poke peer %pM param for ps workaround on vdev %i: %d\n",
1934 arvif->bssid, arvif->vdev_id, ret);
1939 static void ath10k_bss_disassoc(struct ieee80211_hw *hw,
1940 struct ieee80211_vif *vif)
1942 struct ath10k *ar = hw->priv;
1943 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1944 struct ieee80211_sta_vht_cap vht_cap = {};
1947 lockdep_assert_held(&ar->conf_mutex);
1949 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i disassoc bssid %pM\n",
1950 arvif->vdev_id, arvif->bssid);
1952 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
1954 ath10k_warn(ar, "faield to down vdev %i: %d\n",
1955 arvif->vdev_id, ret);
1957 arvif->def_wep_key_idx = -1;
1959 ret = ath10k_mac_vif_recalc_txbf(ar, vif, vht_cap);
1961 ath10k_warn(ar, "failed to recalc txbf for vdev %i: %d\n",
1962 arvif->vdev_id, ret);
1966 arvif->is_up = false;
1969 static int ath10k_station_assoc(struct ath10k *ar,
1970 struct ieee80211_vif *vif,
1971 struct ieee80211_sta *sta,
1974 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1975 struct wmi_peer_assoc_complete_arg peer_arg;
1978 lockdep_assert_held(&ar->conf_mutex);
1980 ret = ath10k_peer_assoc_prepare(ar, vif, sta, &peer_arg);
1982 ath10k_warn(ar, "failed to prepare WMI peer assoc for %pM vdev %i: %i\n",
1983 sta->addr, arvif->vdev_id, ret);
1987 peer_arg.peer_reassoc = reassoc;
1988 ret = ath10k_wmi_peer_assoc(ar, &peer_arg);
1990 ath10k_warn(ar, "failed to run peer assoc for STA %pM vdev %i: %d\n",
1991 sta->addr, arvif->vdev_id, ret);
1995 /* Re-assoc is run only to update supported rates for given station. It
1996 * doesn't make much sense to reconfigure the peer completely.
1999 ret = ath10k_setup_peer_smps(ar, arvif, sta->addr,
2002 ath10k_warn(ar, "failed to setup peer SMPS for vdev %d: %d\n",
2003 arvif->vdev_id, ret);
2007 ret = ath10k_peer_assoc_qos_ap(ar, arvif, sta);
2009 ath10k_warn(ar, "failed to set qos params for STA %pM for vdev %i: %d\n",
2010 sta->addr, arvif->vdev_id, ret);
2015 arvif->num_legacy_stations++;
2016 ret = ath10k_recalc_rtscts_prot(arvif);
2018 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
2019 arvif->vdev_id, ret);
2024 /* Plumb cached keys only for static WEP */
2025 if (arvif->def_wep_key_idx != -1) {
2026 ret = ath10k_install_peer_wep_keys(arvif, sta->addr);
2028 ath10k_warn(ar, "failed to install peer wep keys for vdev %i: %d\n",
2029 arvif->vdev_id, ret);
2038 static int ath10k_station_disassoc(struct ath10k *ar,
2039 struct ieee80211_vif *vif,
2040 struct ieee80211_sta *sta)
2042 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2045 lockdep_assert_held(&ar->conf_mutex);
2048 arvif->num_legacy_stations--;
2049 ret = ath10k_recalc_rtscts_prot(arvif);
2051 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
2052 arvif->vdev_id, ret);
2057 ret = ath10k_clear_peer_keys(arvif, sta->addr);
2059 ath10k_warn(ar, "failed to clear all peer wep keys for vdev %i: %d\n",
2060 arvif->vdev_id, ret);
2071 static int ath10k_update_channel_list(struct ath10k *ar)
2073 struct ieee80211_hw *hw = ar->hw;
2074 struct ieee80211_supported_band **bands;
2075 enum ieee80211_band band;
2076 struct ieee80211_channel *channel;
2077 struct wmi_scan_chan_list_arg arg = {0};
2078 struct wmi_channel_arg *ch;
2084 lockdep_assert_held(&ar->conf_mutex);
2086 bands = hw->wiphy->bands;
2087 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
2091 for (i = 0; i < bands[band]->n_channels; i++) {
2092 if (bands[band]->channels[i].flags &
2093 IEEE80211_CHAN_DISABLED)
2100 len = sizeof(struct wmi_channel_arg) * arg.n_channels;
2101 arg.channels = kzalloc(len, GFP_KERNEL);
2106 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
2110 for (i = 0; i < bands[band]->n_channels; i++) {
2111 channel = &bands[band]->channels[i];
2113 if (channel->flags & IEEE80211_CHAN_DISABLED)
2116 ch->allow_ht = true;
2118 /* FIXME: when should we really allow VHT? */
2119 ch->allow_vht = true;
2122 !(channel->flags & IEEE80211_CHAN_NO_IR);
2125 !(channel->flags & IEEE80211_CHAN_NO_HT40PLUS);
2128 !!(channel->flags & IEEE80211_CHAN_RADAR);
2130 passive = channel->flags & IEEE80211_CHAN_NO_IR;
2131 ch->passive = passive;
2133 ch->freq = channel->center_freq;
2134 ch->band_center_freq1 = channel->center_freq;
2136 ch->max_power = channel->max_power * 2;
2137 ch->max_reg_power = channel->max_reg_power * 2;
2138 ch->max_antenna_gain = channel->max_antenna_gain * 2;
2139 ch->reg_class_id = 0; /* FIXME */
2141 /* FIXME: why use only legacy modes, why not any
2142 * HT/VHT modes? Would that even make any
2144 if (channel->band == IEEE80211_BAND_2GHZ)
2145 ch->mode = MODE_11G;
2147 ch->mode = MODE_11A;
2149 if (WARN_ON_ONCE(ch->mode == MODE_UNKNOWN))
2152 ath10k_dbg(ar, ATH10K_DBG_WMI,
2153 "mac channel [%zd/%d] freq %d maxpower %d regpower %d antenna %d mode %d\n",
2154 ch - arg.channels, arg.n_channels,
2155 ch->freq, ch->max_power, ch->max_reg_power,
2156 ch->max_antenna_gain, ch->mode);
2162 ret = ath10k_wmi_scan_chan_list(ar, &arg);
2163 kfree(arg.channels);
2168 static enum wmi_dfs_region
2169 ath10k_mac_get_dfs_region(enum nl80211_dfs_regions dfs_region)
2171 switch (dfs_region) {
2172 case NL80211_DFS_UNSET:
2173 return WMI_UNINIT_DFS_DOMAIN;
2174 case NL80211_DFS_FCC:
2175 return WMI_FCC_DFS_DOMAIN;
2176 case NL80211_DFS_ETSI:
2177 return WMI_ETSI_DFS_DOMAIN;
2178 case NL80211_DFS_JP:
2179 return WMI_MKK4_DFS_DOMAIN;
2181 return WMI_UNINIT_DFS_DOMAIN;
2184 static void ath10k_regd_update(struct ath10k *ar)
2186 struct reg_dmn_pair_mapping *regpair;
2188 enum wmi_dfs_region wmi_dfs_reg;
2189 enum nl80211_dfs_regions nl_dfs_reg;
2191 lockdep_assert_held(&ar->conf_mutex);
2193 ret = ath10k_update_channel_list(ar);
2195 ath10k_warn(ar, "failed to update channel list: %d\n", ret);
2197 regpair = ar->ath_common.regulatory.regpair;
2199 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) {
2200 nl_dfs_reg = ar->dfs_detector->region;
2201 wmi_dfs_reg = ath10k_mac_get_dfs_region(nl_dfs_reg);
2203 wmi_dfs_reg = WMI_UNINIT_DFS_DOMAIN;
2206 /* Target allows setting up per-band regdomain but ath_common provides
2207 * a combined one only */
2208 ret = ath10k_wmi_pdev_set_regdomain(ar,
2209 regpair->reg_domain,
2210 regpair->reg_domain, /* 2ghz */
2211 regpair->reg_domain, /* 5ghz */
2212 regpair->reg_2ghz_ctl,
2213 regpair->reg_5ghz_ctl,
2216 ath10k_warn(ar, "failed to set pdev regdomain: %d\n", ret);
2219 static void ath10k_reg_notifier(struct wiphy *wiphy,
2220 struct regulatory_request *request)
2222 struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
2223 struct ath10k *ar = hw->priv;
2226 ath_reg_notifier_apply(wiphy, request, &ar->ath_common.regulatory);
2228 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) {
2229 ath10k_dbg(ar, ATH10K_DBG_REGULATORY, "dfs region 0x%x\n",
2230 request->dfs_region);
2231 result = ar->dfs_detector->set_dfs_domain(ar->dfs_detector,
2232 request->dfs_region);
2234 ath10k_warn(ar, "DFS region 0x%X not supported, will trigger radar for every pulse\n",
2235 request->dfs_region);
2238 mutex_lock(&ar->conf_mutex);
2239 if (ar->state == ATH10K_STATE_ON)
2240 ath10k_regd_update(ar);
2241 mutex_unlock(&ar->conf_mutex);
2248 static u8 ath10k_tx_h_get_tid(struct ieee80211_hdr *hdr)
2250 if (ieee80211_is_mgmt(hdr->frame_control))
2251 return HTT_DATA_TX_EXT_TID_MGMT;
2253 if (!ieee80211_is_data_qos(hdr->frame_control))
2254 return HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
2256 if (!is_unicast_ether_addr(ieee80211_get_DA(hdr)))
2257 return HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
2259 return ieee80211_get_qos_ctl(hdr)[0] & IEEE80211_QOS_CTL_TID_MASK;
2262 static u8 ath10k_tx_h_get_vdev_id(struct ath10k *ar, struct ieee80211_vif *vif)
2265 return ath10k_vif_to_arvif(vif)->vdev_id;
2267 if (ar->monitor_started)
2268 return ar->monitor_vdev_id;
2270 ath10k_warn(ar, "failed to resolve vdev id\n");
2274 /* HTT Tx uses Native Wifi tx mode which expects 802.11 frames without QoS
2275 * Control in the header.
2277 static void ath10k_tx_h_nwifi(struct ieee80211_hw *hw, struct sk_buff *skb)
2279 struct ieee80211_hdr *hdr = (void *)skb->data;
2280 struct ath10k_skb_cb *cb = ATH10K_SKB_CB(skb);
2283 if (!ieee80211_is_data_qos(hdr->frame_control))
2286 qos_ctl = ieee80211_get_qos_ctl(hdr);
2287 memmove(skb->data + IEEE80211_QOS_CTL_LEN,
2288 skb->data, (void *)qos_ctl - (void *)skb->data);
2289 skb_pull(skb, IEEE80211_QOS_CTL_LEN);
2291 /* Fw/Hw generates a corrupted QoS Control Field for QoS NullFunc
2292 * frames. Powersave is handled by the fw/hw so QoS NyllFunc frames are
2293 * used only for CQM purposes (e.g. hostapd station keepalive ping) so
2294 * it is safe to downgrade to NullFunc.
2296 hdr = (void *)skb->data;
2297 if (ieee80211_is_qos_nullfunc(hdr->frame_control)) {
2298 hdr->frame_control &= ~__cpu_to_le16(IEEE80211_STYPE_QOS_DATA);
2299 cb->htt.tid = HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
2303 static void ath10k_tx_h_add_p2p_noa_ie(struct ath10k *ar,
2304 struct ieee80211_vif *vif,
2305 struct sk_buff *skb)
2307 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
2308 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2310 /* This is case only for P2P_GO */
2311 if (arvif->vdev_type != WMI_VDEV_TYPE_AP ||
2312 arvif->vdev_subtype != WMI_VDEV_SUBTYPE_P2P_GO)
2315 if (unlikely(ieee80211_is_probe_resp(hdr->frame_control))) {
2316 spin_lock_bh(&ar->data_lock);
2317 if (arvif->u.ap.noa_data)
2318 if (!pskb_expand_head(skb, 0, arvif->u.ap.noa_len,
2320 memcpy(skb_put(skb, arvif->u.ap.noa_len),
2321 arvif->u.ap.noa_data,
2322 arvif->u.ap.noa_len);
2323 spin_unlock_bh(&ar->data_lock);
2327 static bool ath10k_mac_need_offchan_tx_work(struct ath10k *ar)
2329 /* FIXME: Not really sure since when the behaviour changed. At some
2330 * point new firmware stopped requiring creation of peer entries for
2331 * offchannel tx (and actually creating them causes issues with wmi-htc
2332 * tx credit replenishment and reliability). Assuming it's at least 3.4
2333 * because that's when the `freq` was introduced to TX_FRM HTT command.
2335 return !(ar->htt.target_version_major >= 3 &&
2336 ar->htt.target_version_minor >= 4);
2339 static void ath10k_tx_htt(struct ath10k *ar, struct sk_buff *skb)
2341 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
2344 if (ar->htt.target_version_major >= 3) {
2345 /* Since HTT 3.0 there is no separate mgmt tx command */
2346 ret = ath10k_htt_tx(&ar->htt, skb);
2350 if (ieee80211_is_mgmt(hdr->frame_control)) {
2351 if (test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX,
2353 if (skb_queue_len(&ar->wmi_mgmt_tx_queue) >=
2354 ATH10K_MAX_NUM_MGMT_PENDING) {
2355 ath10k_warn(ar, "reached WMI management transmit queue limit\n");
2360 skb_queue_tail(&ar->wmi_mgmt_tx_queue, skb);
2361 ieee80211_queue_work(ar->hw, &ar->wmi_mgmt_tx_work);
2363 ret = ath10k_htt_mgmt_tx(&ar->htt, skb);
2365 } else if (!test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX,
2367 ieee80211_is_nullfunc(hdr->frame_control)) {
2368 /* FW does not report tx status properly for NullFunc frames
2369 * unless they are sent through mgmt tx path. mac80211 sends
2370 * those frames when it detects link/beacon loss and depends
2371 * on the tx status to be correct. */
2372 ret = ath10k_htt_mgmt_tx(&ar->htt, skb);
2374 ret = ath10k_htt_tx(&ar->htt, skb);
2379 ath10k_warn(ar, "failed to transmit packet, dropping: %d\n",
2381 ieee80211_free_txskb(ar->hw, skb);
2385 void ath10k_offchan_tx_purge(struct ath10k *ar)
2387 struct sk_buff *skb;
2390 skb = skb_dequeue(&ar->offchan_tx_queue);
2394 ieee80211_free_txskb(ar->hw, skb);
2398 void ath10k_offchan_tx_work(struct work_struct *work)
2400 struct ath10k *ar = container_of(work, struct ath10k, offchan_tx_work);
2401 struct ath10k_peer *peer;
2402 struct ieee80211_hdr *hdr;
2403 struct sk_buff *skb;
2404 const u8 *peer_addr;
2408 /* FW requirement: We must create a peer before FW will send out
2409 * an offchannel frame. Otherwise the frame will be stuck and
2410 * never transmitted. We delete the peer upon tx completion.
2411 * It is unlikely that a peer for offchannel tx will already be
2412 * present. However it may be in some rare cases so account for that.
2413 * Otherwise we might remove a legitimate peer and break stuff. */
2416 skb = skb_dequeue(&ar->offchan_tx_queue);
2420 mutex_lock(&ar->conf_mutex);
2422 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac offchannel skb %p\n",
2425 hdr = (struct ieee80211_hdr *)skb->data;
2426 peer_addr = ieee80211_get_DA(hdr);
2427 vdev_id = ATH10K_SKB_CB(skb)->vdev_id;
2429 spin_lock_bh(&ar->data_lock);
2430 peer = ath10k_peer_find(ar, vdev_id, peer_addr);
2431 spin_unlock_bh(&ar->data_lock);
2434 /* FIXME: should this use ath10k_warn()? */
2435 ath10k_dbg(ar, ATH10K_DBG_MAC, "peer %pM on vdev %d already present\n",
2436 peer_addr, vdev_id);
2439 ret = ath10k_peer_create(ar, vdev_id, peer_addr);
2441 ath10k_warn(ar, "failed to create peer %pM on vdev %d: %d\n",
2442 peer_addr, vdev_id, ret);
2445 spin_lock_bh(&ar->data_lock);
2446 reinit_completion(&ar->offchan_tx_completed);
2447 ar->offchan_tx_skb = skb;
2448 spin_unlock_bh(&ar->data_lock);
2450 ath10k_tx_htt(ar, skb);
2452 ret = wait_for_completion_timeout(&ar->offchan_tx_completed,
2455 ath10k_warn(ar, "timed out waiting for offchannel skb %p\n",
2459 ret = ath10k_peer_delete(ar, vdev_id, peer_addr);
2461 ath10k_warn(ar, "failed to delete peer %pM on vdev %d: %d\n",
2462 peer_addr, vdev_id, ret);
2465 mutex_unlock(&ar->conf_mutex);
2469 void ath10k_mgmt_over_wmi_tx_purge(struct ath10k *ar)
2471 struct sk_buff *skb;
2474 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
2478 ieee80211_free_txskb(ar->hw, skb);
2482 void ath10k_mgmt_over_wmi_tx_work(struct work_struct *work)
2484 struct ath10k *ar = container_of(work, struct ath10k, wmi_mgmt_tx_work);
2485 struct sk_buff *skb;
2489 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
2493 ret = ath10k_wmi_mgmt_tx(ar, skb);
2495 ath10k_warn(ar, "failed to transmit management frame via WMI: %d\n",
2497 ieee80211_free_txskb(ar->hw, skb);
2506 void __ath10k_scan_finish(struct ath10k *ar)
2508 lockdep_assert_held(&ar->data_lock);
2510 switch (ar->scan.state) {
2511 case ATH10K_SCAN_IDLE:
2513 case ATH10K_SCAN_RUNNING:
2514 if (ar->scan.is_roc)
2515 ieee80211_remain_on_channel_expired(ar->hw);
2517 case ATH10K_SCAN_ABORTING:
2518 if (!ar->scan.is_roc)
2519 ieee80211_scan_completed(ar->hw,
2521 ATH10K_SCAN_ABORTING));
2523 case ATH10K_SCAN_STARTING:
2524 ar->scan.state = ATH10K_SCAN_IDLE;
2525 ar->scan_channel = NULL;
2526 ath10k_offchan_tx_purge(ar);
2527 cancel_delayed_work(&ar->scan.timeout);
2528 complete_all(&ar->scan.completed);
2533 void ath10k_scan_finish(struct ath10k *ar)
2535 spin_lock_bh(&ar->data_lock);
2536 __ath10k_scan_finish(ar);
2537 spin_unlock_bh(&ar->data_lock);
2540 static int ath10k_scan_stop(struct ath10k *ar)
2542 struct wmi_stop_scan_arg arg = {
2543 .req_id = 1, /* FIXME */
2544 .req_type = WMI_SCAN_STOP_ONE,
2545 .u.scan_id = ATH10K_SCAN_ID,
2549 lockdep_assert_held(&ar->conf_mutex);
2551 ret = ath10k_wmi_stop_scan(ar, &arg);
2553 ath10k_warn(ar, "failed to stop wmi scan: %d\n", ret);
2557 ret = wait_for_completion_timeout(&ar->scan.completed, 3*HZ);
2559 ath10k_warn(ar, "failed to receive scan abortion completion: timed out\n");
2561 } else if (ret > 0) {
2566 /* Scan state should be updated upon scan completion but in case
2567 * firmware fails to deliver the event (for whatever reason) it is
2568 * desired to clean up scan state anyway. Firmware may have just
2569 * dropped the scan completion event delivery due to transport pipe
2570 * being overflown with data and/or it can recover on its own before
2571 * next scan request is submitted.
2573 spin_lock_bh(&ar->data_lock);
2574 if (ar->scan.state != ATH10K_SCAN_IDLE)
2575 __ath10k_scan_finish(ar);
2576 spin_unlock_bh(&ar->data_lock);
2581 static void ath10k_scan_abort(struct ath10k *ar)
2585 lockdep_assert_held(&ar->conf_mutex);
2587 spin_lock_bh(&ar->data_lock);
2589 switch (ar->scan.state) {
2590 case ATH10K_SCAN_IDLE:
2591 /* This can happen if timeout worker kicked in and called
2592 * abortion while scan completion was being processed.
2595 case ATH10K_SCAN_STARTING:
2596 case ATH10K_SCAN_ABORTING:
2597 ath10k_warn(ar, "refusing scan abortion due to invalid scan state: %s (%d)\n",
2598 ath10k_scan_state_str(ar->scan.state),
2601 case ATH10K_SCAN_RUNNING:
2602 ar->scan.state = ATH10K_SCAN_ABORTING;
2603 spin_unlock_bh(&ar->data_lock);
2605 ret = ath10k_scan_stop(ar);
2607 ath10k_warn(ar, "failed to abort scan: %d\n", ret);
2609 spin_lock_bh(&ar->data_lock);
2613 spin_unlock_bh(&ar->data_lock);
2616 void ath10k_scan_timeout_work(struct work_struct *work)
2618 struct ath10k *ar = container_of(work, struct ath10k,
2621 mutex_lock(&ar->conf_mutex);
2622 ath10k_scan_abort(ar);
2623 mutex_unlock(&ar->conf_mutex);
2626 static int ath10k_start_scan(struct ath10k *ar,
2627 const struct wmi_start_scan_arg *arg)
2631 lockdep_assert_held(&ar->conf_mutex);
2633 ret = ath10k_wmi_start_scan(ar, arg);
2637 ret = wait_for_completion_timeout(&ar->scan.started, 1*HZ);
2639 ret = ath10k_scan_stop(ar);
2641 ath10k_warn(ar, "failed to stop scan: %d\n", ret);
2646 /* If we failed to start the scan, return error code at
2647 * this point. This is probably due to some issue in the
2648 * firmware, but no need to wedge the driver due to that...
2650 spin_lock_bh(&ar->data_lock);
2651 if (ar->scan.state == ATH10K_SCAN_IDLE) {
2652 spin_unlock_bh(&ar->data_lock);
2655 spin_unlock_bh(&ar->data_lock);
2657 /* Add a 200ms margin to account for event/command processing */
2658 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
2659 msecs_to_jiffies(arg->max_scan_time+200));
2663 /**********************/
2664 /* mac80211 callbacks */
2665 /**********************/
2667 static void ath10k_tx(struct ieee80211_hw *hw,
2668 struct ieee80211_tx_control *control,
2669 struct sk_buff *skb)
2671 struct ath10k *ar = hw->priv;
2672 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
2673 struct ieee80211_vif *vif = info->control.vif;
2674 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
2676 /* We should disable CCK RATE due to P2P */
2677 if (info->flags & IEEE80211_TX_CTL_NO_CCK_RATE)
2678 ath10k_dbg(ar, ATH10K_DBG_MAC, "IEEE80211_TX_CTL_NO_CCK_RATE\n");
2680 ATH10K_SKB_CB(skb)->htt.is_offchan = false;
2681 ATH10K_SKB_CB(skb)->htt.tid = ath10k_tx_h_get_tid(hdr);
2682 ATH10K_SKB_CB(skb)->vdev_id = ath10k_tx_h_get_vdev_id(ar, vif);
2684 /* it makes no sense to process injected frames like that */
2685 if (vif && vif->type != NL80211_IFTYPE_MONITOR) {
2686 ath10k_tx_h_nwifi(hw, skb);
2687 ath10k_tx_h_add_p2p_noa_ie(ar, vif, skb);
2688 ath10k_tx_h_seq_no(vif, skb);
2691 if (info->flags & IEEE80211_TX_CTL_TX_OFFCHAN) {
2692 spin_lock_bh(&ar->data_lock);
2693 ATH10K_SKB_CB(skb)->htt.freq = ar->scan.roc_freq;
2694 ATH10K_SKB_CB(skb)->vdev_id = ar->scan.vdev_id;
2695 spin_unlock_bh(&ar->data_lock);
2697 if (ath10k_mac_need_offchan_tx_work(ar)) {
2698 ATH10K_SKB_CB(skb)->htt.freq = 0;
2699 ATH10K_SKB_CB(skb)->htt.is_offchan = true;
2701 ath10k_dbg(ar, ATH10K_DBG_MAC, "queued offchannel skb %p\n",
2704 skb_queue_tail(&ar->offchan_tx_queue, skb);
2705 ieee80211_queue_work(hw, &ar->offchan_tx_work);
2710 ath10k_tx_htt(ar, skb);
2713 /* Must not be called with conf_mutex held as workers can use that also. */
2714 void ath10k_drain_tx(struct ath10k *ar)
2716 /* make sure rcu-protected mac80211 tx path itself is drained */
2719 ath10k_offchan_tx_purge(ar);
2720 ath10k_mgmt_over_wmi_tx_purge(ar);
2722 cancel_work_sync(&ar->offchan_tx_work);
2723 cancel_work_sync(&ar->wmi_mgmt_tx_work);
2726 void ath10k_halt(struct ath10k *ar)
2728 struct ath10k_vif *arvif;
2730 lockdep_assert_held(&ar->conf_mutex);
2732 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
2733 ar->filter_flags = 0;
2734 ar->monitor = false;
2736 if (ar->monitor_started)
2737 ath10k_monitor_stop(ar);
2739 ar->monitor_started = false;
2741 ath10k_scan_finish(ar);
2742 ath10k_peer_cleanup_all(ar);
2743 ath10k_core_stop(ar);
2744 ath10k_hif_power_down(ar);
2746 spin_lock_bh(&ar->data_lock);
2747 list_for_each_entry(arvif, &ar->arvifs, list)
2748 ath10k_mac_vif_beacon_cleanup(arvif);
2749 spin_unlock_bh(&ar->data_lock);
2752 static int ath10k_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant)
2754 struct ath10k *ar = hw->priv;
2756 mutex_lock(&ar->conf_mutex);
2758 if (ar->cfg_tx_chainmask) {
2759 *tx_ant = ar->cfg_tx_chainmask;
2760 *rx_ant = ar->cfg_rx_chainmask;
2762 *tx_ant = ar->supp_tx_chainmask;
2763 *rx_ant = ar->supp_rx_chainmask;
2766 mutex_unlock(&ar->conf_mutex);
2771 static void ath10k_check_chain_mask(struct ath10k *ar, u32 cm, const char *dbg)
2773 /* It is not clear that allowing gaps in chainmask
2774 * is helpful. Probably it will not do what user
2775 * is hoping for, so warn in that case.
2777 if (cm == 15 || cm == 7 || cm == 3 || cm == 1 || cm == 0)
2780 ath10k_warn(ar, "mac %s antenna chainmask may be invalid: 0x%x. Suggested values: 15, 7, 3, 1 or 0.\n",
2784 static int __ath10k_set_antenna(struct ath10k *ar, u32 tx_ant, u32 rx_ant)
2788 lockdep_assert_held(&ar->conf_mutex);
2790 ath10k_check_chain_mask(ar, tx_ant, "tx");
2791 ath10k_check_chain_mask(ar, rx_ant, "rx");
2793 ar->cfg_tx_chainmask = tx_ant;
2794 ar->cfg_rx_chainmask = rx_ant;
2796 if ((ar->state != ATH10K_STATE_ON) &&
2797 (ar->state != ATH10K_STATE_RESTARTED))
2800 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->tx_chain_mask,
2803 ath10k_warn(ar, "failed to set tx-chainmask: %d, req 0x%x\n",
2808 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->rx_chain_mask,
2811 ath10k_warn(ar, "failed to set rx-chainmask: %d, req 0x%x\n",
2819 static int ath10k_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)
2821 struct ath10k *ar = hw->priv;
2824 mutex_lock(&ar->conf_mutex);
2825 ret = __ath10k_set_antenna(ar, tx_ant, rx_ant);
2826 mutex_unlock(&ar->conf_mutex);
2830 static int ath10k_start(struct ieee80211_hw *hw)
2832 struct ath10k *ar = hw->priv;
2836 * This makes sense only when restarting hw. It is harmless to call
2837 * uncoditionally. This is necessary to make sure no HTT/WMI tx
2838 * commands will be submitted while restarting.
2840 ath10k_drain_tx(ar);
2842 mutex_lock(&ar->conf_mutex);
2844 switch (ar->state) {
2845 case ATH10K_STATE_OFF:
2846 ar->state = ATH10K_STATE_ON;
2848 case ATH10K_STATE_RESTARTING:
2850 ar->state = ATH10K_STATE_RESTARTED;
2852 case ATH10K_STATE_ON:
2853 case ATH10K_STATE_RESTARTED:
2854 case ATH10K_STATE_WEDGED:
2858 case ATH10K_STATE_UTF:
2863 ret = ath10k_hif_power_up(ar);
2865 ath10k_err(ar, "Could not init hif: %d\n", ret);
2869 ret = ath10k_core_start(ar, ATH10K_FIRMWARE_MODE_NORMAL);
2871 ath10k_err(ar, "Could not init core: %d\n", ret);
2872 goto err_power_down;
2875 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->pmf_qos, 1);
2877 ath10k_warn(ar, "failed to enable PMF QOS: %d\n", ret);
2881 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->dynamic_bw, 1);
2883 ath10k_warn(ar, "failed to enable dynamic BW: %d\n", ret);
2887 if (ar->cfg_tx_chainmask)
2888 __ath10k_set_antenna(ar, ar->cfg_tx_chainmask,
2889 ar->cfg_rx_chainmask);
2892 * By default FW set ARP frames ac to voice (6). In that case ARP
2893 * exchange is not working properly for UAPSD enabled AP. ARP requests
2894 * which arrives with access category 0 are processed by network stack
2895 * and send back with access category 0, but FW changes access category
2896 * to 6. Set ARP frames access category to best effort (0) solves
2900 ret = ath10k_wmi_pdev_set_param(ar,
2901 ar->wmi.pdev_param->arp_ac_override, 0);
2903 ath10k_warn(ar, "failed to set arp ac override parameter: %d\n",
2908 ar->num_started_vdevs = 0;
2909 ath10k_regd_update(ar);
2911 ath10k_spectral_start(ar);
2913 mutex_unlock(&ar->conf_mutex);
2917 ath10k_core_stop(ar);
2920 ath10k_hif_power_down(ar);
2923 ar->state = ATH10K_STATE_OFF;
2926 mutex_unlock(&ar->conf_mutex);
2930 static void ath10k_stop(struct ieee80211_hw *hw)
2932 struct ath10k *ar = hw->priv;
2934 ath10k_drain_tx(ar);
2936 mutex_lock(&ar->conf_mutex);
2937 if (ar->state != ATH10K_STATE_OFF) {
2939 ar->state = ATH10K_STATE_OFF;
2941 mutex_unlock(&ar->conf_mutex);
2943 cancel_delayed_work_sync(&ar->scan.timeout);
2944 cancel_work_sync(&ar->restart_work);
2947 static int ath10k_config_ps(struct ath10k *ar)
2949 struct ath10k_vif *arvif;
2952 lockdep_assert_held(&ar->conf_mutex);
2954 list_for_each_entry(arvif, &ar->arvifs, list) {
2955 ret = ath10k_mac_vif_setup_ps(arvif);
2957 ath10k_warn(ar, "failed to setup powersave: %d\n", ret);
2965 static const char *chandef_get_width(enum nl80211_chan_width width)
2968 case NL80211_CHAN_WIDTH_20_NOHT:
2970 case NL80211_CHAN_WIDTH_20:
2972 case NL80211_CHAN_WIDTH_40:
2974 case NL80211_CHAN_WIDTH_80:
2976 case NL80211_CHAN_WIDTH_80P80:
2978 case NL80211_CHAN_WIDTH_160:
2980 case NL80211_CHAN_WIDTH_5:
2982 case NL80211_CHAN_WIDTH_10:
2988 static void ath10k_config_chan(struct ath10k *ar)
2990 struct ath10k_vif *arvif;
2993 lockdep_assert_held(&ar->conf_mutex);
2995 ath10k_dbg(ar, ATH10K_DBG_MAC,
2996 "mac config channel to %dMHz (cf1 %dMHz cf2 %dMHz width %s)\n",
2997 ar->chandef.chan->center_freq,
2998 ar->chandef.center_freq1,
2999 ar->chandef.center_freq2,
3000 chandef_get_width(ar->chandef.width));
3002 /* First stop monitor interface. Some FW versions crash if there's a
3003 * lone monitor interface. */
3004 if (ar->monitor_started)
3005 ath10k_monitor_stop(ar);
3007 list_for_each_entry(arvif, &ar->arvifs, list) {
3008 if (!arvif->is_started)
3014 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
3017 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
3019 ath10k_warn(ar, "failed to down vdev %d: %d\n",
3020 arvif->vdev_id, ret);
3025 /* all vdevs are downed now - attempt to restart and re-up them */
3027 list_for_each_entry(arvif, &ar->arvifs, list) {
3028 if (!arvif->is_started)
3031 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
3034 ret = ath10k_vdev_restart(arvif);
3036 ath10k_warn(ar, "failed to restart vdev %d: %d\n",
3037 arvif->vdev_id, ret);
3044 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
3047 ath10k_warn(ar, "failed to bring vdev up %d: %d\n",
3048 arvif->vdev_id, ret);
3053 ath10k_monitor_recalc(ar);
3056 static int ath10k_mac_txpower_setup(struct ath10k *ar, int txpower)
3061 lockdep_assert_held(&ar->conf_mutex);
3063 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac txpower %d\n", txpower);
3065 param = ar->wmi.pdev_param->txpower_limit2g;
3066 ret = ath10k_wmi_pdev_set_param(ar, param, txpower * 2);
3068 ath10k_warn(ar, "failed to set 2g txpower %d: %d\n",
3073 param = ar->wmi.pdev_param->txpower_limit5g;
3074 ret = ath10k_wmi_pdev_set_param(ar, param, txpower * 2);
3076 ath10k_warn(ar, "failed to set 5g txpower %d: %d\n",
3084 static int ath10k_mac_txpower_recalc(struct ath10k *ar)
3086 struct ath10k_vif *arvif;
3087 int ret, txpower = -1;
3089 lockdep_assert_held(&ar->conf_mutex);
3091 list_for_each_entry(arvif, &ar->arvifs, list) {
3092 WARN_ON(arvif->txpower < 0);
3095 txpower = arvif->txpower;
3097 txpower = min(txpower, arvif->txpower);
3100 if (WARN_ON(txpower == -1))
3103 ret = ath10k_mac_txpower_setup(ar, txpower);
3105 ath10k_warn(ar, "failed to setup tx power %d: %d\n",
3113 static int ath10k_config(struct ieee80211_hw *hw, u32 changed)
3115 struct ath10k *ar = hw->priv;
3116 struct ieee80211_conf *conf = &hw->conf;
3119 mutex_lock(&ar->conf_mutex);
3121 if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
3122 ath10k_dbg(ar, ATH10K_DBG_MAC,
3123 "mac config channel %dMHz flags 0x%x radar %d\n",
3124 conf->chandef.chan->center_freq,
3125 conf->chandef.chan->flags,
3126 conf->radar_enabled);
3128 spin_lock_bh(&ar->data_lock);
3129 ar->rx_channel = conf->chandef.chan;
3130 spin_unlock_bh(&ar->data_lock);
3132 ar->radar_enabled = conf->radar_enabled;
3133 ath10k_recalc_radar_detection(ar);
3135 if (!cfg80211_chandef_identical(&ar->chandef, &conf->chandef)) {
3136 ar->chandef = conf->chandef;
3137 ath10k_config_chan(ar);
3141 if (changed & IEEE80211_CONF_CHANGE_PS)
3142 ath10k_config_ps(ar);
3144 if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
3145 ar->monitor = conf->flags & IEEE80211_CONF_MONITOR;
3146 ret = ath10k_monitor_recalc(ar);
3148 ath10k_warn(ar, "failed to recalc monitor: %d\n", ret);
3151 mutex_unlock(&ar->conf_mutex);
3155 static u32 get_nss_from_chainmask(u16 chain_mask)
3157 if ((chain_mask & 0x15) == 0x15)
3159 else if ((chain_mask & 0x7) == 0x7)
3161 else if ((chain_mask & 0x3) == 0x3)
3168 * Figure out how to handle WMI_VDEV_SUBTYPE_P2P_DEVICE,
3169 * because we will send mgmt frames without CCK. This requirement
3170 * for P2P_FIND/GO_NEG should be handled by checking CCK flag
3173 static int ath10k_add_interface(struct ieee80211_hw *hw,
3174 struct ieee80211_vif *vif)
3176 struct ath10k *ar = hw->priv;
3177 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3178 enum wmi_sta_powersave_param param;
3184 vif->driver_flags |= IEEE80211_VIF_SUPPORTS_UAPSD;
3186 mutex_lock(&ar->conf_mutex);
3188 memset(arvif, 0, sizeof(*arvif));
3193 INIT_LIST_HEAD(&arvif->list);
3195 if (ar->free_vdev_map == 0) {
3196 ath10k_warn(ar, "Free vdev map is empty, no more interfaces allowed.\n");
3200 bit = __ffs64(ar->free_vdev_map);
3202 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac create vdev %i map %llx\n",
3203 bit, ar->free_vdev_map);
3205 arvif->vdev_id = bit;
3206 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE;
3208 switch (vif->type) {
3209 case NL80211_IFTYPE_P2P_DEVICE:
3210 arvif->vdev_type = WMI_VDEV_TYPE_STA;
3211 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_DEVICE;
3213 case NL80211_IFTYPE_UNSPECIFIED:
3214 case NL80211_IFTYPE_STATION:
3215 arvif->vdev_type = WMI_VDEV_TYPE_STA;
3217 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_CLIENT;
3219 case NL80211_IFTYPE_ADHOC:
3220 arvif->vdev_type = WMI_VDEV_TYPE_IBSS;
3222 case NL80211_IFTYPE_AP:
3223 arvif->vdev_type = WMI_VDEV_TYPE_AP;
3226 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_GO;
3228 case NL80211_IFTYPE_MONITOR:
3229 arvif->vdev_type = WMI_VDEV_TYPE_MONITOR;
3236 /* Some firmware revisions don't wait for beacon tx completion before
3237 * sending another SWBA event. This could lead to hardware using old
3238 * (freed) beacon data in some cases, e.g. tx credit starvation
3239 * combined with missed TBTT. This is very very rare.
3241 * On non-IOMMU-enabled hosts this could be a possible security issue
3242 * because hw could beacon some random data on the air. On
3243 * IOMMU-enabled hosts DMAR faults would occur in most cases and target
3244 * device would crash.
3246 * Since there are no beacon tx completions (implicit nor explicit)
3247 * propagated to host the only workaround for this is to allocate a
3248 * DMA-coherent buffer for a lifetime of a vif and use it for all
3249 * beacon tx commands. Worst case for this approach is some beacons may
3250 * become corrupted, e.g. have garbled IEs or out-of-date TIM bitmap.
3252 if (vif->type == NL80211_IFTYPE_ADHOC ||
3253 vif->type == NL80211_IFTYPE_AP) {
3254 arvif->beacon_buf = dma_zalloc_coherent(ar->dev,
3255 IEEE80211_MAX_FRAME_LEN,
3256 &arvif->beacon_paddr,
3258 if (!arvif->beacon_buf) {
3260 ath10k_warn(ar, "failed to allocate beacon buffer: %d\n",
3266 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev create %d (add interface) type %d subtype %d bcnmode %s\n",
3267 arvif->vdev_id, arvif->vdev_type, arvif->vdev_subtype,
3268 arvif->beacon_buf ? "single-buf" : "per-skb");
3270 ret = ath10k_wmi_vdev_create(ar, arvif->vdev_id, arvif->vdev_type,
3271 arvif->vdev_subtype, vif->addr);
3273 ath10k_warn(ar, "failed to create WMI vdev %i: %d\n",
3274 arvif->vdev_id, ret);
3278 ar->free_vdev_map &= ~(1LL << arvif->vdev_id);
3279 list_add(&arvif->list, &ar->arvifs);
3281 /* It makes no sense to have firmware do keepalives. mac80211 already
3282 * takes care of this with idle connection polling.
3284 ret = ath10k_mac_vif_disable_keepalive(arvif);
3286 ath10k_warn(ar, "failed to disable keepalive on vdev %i: %d\n",
3287 arvif->vdev_id, ret);
3288 goto err_vdev_delete;
3291 arvif->def_wep_key_idx = -1;
3293 vdev_param = ar->wmi.vdev_param->tx_encap_type;
3294 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
3295 ATH10K_HW_TXRX_NATIVE_WIFI);
3296 /* 10.X firmware does not support this VDEV parameter. Do not warn */
3297 if (ret && ret != -EOPNOTSUPP) {
3298 ath10k_warn(ar, "failed to set vdev %i TX encapsulation: %d\n",
3299 arvif->vdev_id, ret);
3300 goto err_vdev_delete;
3303 if (ar->cfg_tx_chainmask) {
3304 u16 nss = get_nss_from_chainmask(ar->cfg_tx_chainmask);
3306 vdev_param = ar->wmi.vdev_param->nss;
3307 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
3310 ath10k_warn(ar, "failed to set vdev %i chainmask 0x%x, nss %i: %d\n",
3311 arvif->vdev_id, ar->cfg_tx_chainmask, nss,
3313 goto err_vdev_delete;
3317 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
3318 ret = ath10k_peer_create(ar, arvif->vdev_id, vif->addr);
3320 ath10k_warn(ar, "failed to create vdev %i peer for AP: %d\n",
3321 arvif->vdev_id, ret);
3322 goto err_vdev_delete;
3325 ret = ath10k_mac_set_kickout(arvif);
3327 ath10k_warn(ar, "failed to set vdev %i kickout parameters: %d\n",
3328 arvif->vdev_id, ret);
3329 goto err_peer_delete;
3333 if (arvif->vdev_type == WMI_VDEV_TYPE_STA) {
3334 param = WMI_STA_PS_PARAM_RX_WAKE_POLICY;
3335 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
3336 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
3339 ath10k_warn(ar, "failed to set vdev %i RX wake policy: %d\n",
3340 arvif->vdev_id, ret);
3341 goto err_peer_delete;
3344 ret = ath10k_mac_vif_recalc_ps_wake_threshold(arvif);
3346 ath10k_warn(ar, "failed to recalc ps wake threshold on vdev %i: %d\n",
3347 arvif->vdev_id, ret);
3348 goto err_peer_delete;
3351 ret = ath10k_mac_vif_recalc_ps_poll_count(arvif);
3353 ath10k_warn(ar, "failed to recalc ps poll count on vdev %i: %d\n",
3354 arvif->vdev_id, ret);
3355 goto err_peer_delete;
3359 ret = ath10k_mac_set_rts(arvif, ar->hw->wiphy->rts_threshold);
3361 ath10k_warn(ar, "failed to set rts threshold for vdev %d: %d\n",
3362 arvif->vdev_id, ret);
3363 goto err_peer_delete;
3366 ret = ath10k_mac_set_frag(arvif, ar->hw->wiphy->frag_threshold);
3368 ath10k_warn(ar, "failed to set frag threshold for vdev %d: %d\n",
3369 arvif->vdev_id, ret);
3370 goto err_peer_delete;
3373 arvif->txpower = vif->bss_conf.txpower;
3374 ret = ath10k_mac_txpower_recalc(ar);
3376 ath10k_warn(ar, "failed to recalc tx power: %d\n", ret);
3377 goto err_peer_delete;
3380 mutex_unlock(&ar->conf_mutex);
3384 if (arvif->vdev_type == WMI_VDEV_TYPE_AP)
3385 ath10k_wmi_peer_delete(ar, arvif->vdev_id, vif->addr);
3388 ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
3389 ar->free_vdev_map |= 1LL << arvif->vdev_id;
3390 list_del(&arvif->list);
3393 if (arvif->beacon_buf) {
3394 dma_free_coherent(ar->dev, IEEE80211_MAX_FRAME_LEN,
3395 arvif->beacon_buf, arvif->beacon_paddr);
3396 arvif->beacon_buf = NULL;
3399 mutex_unlock(&ar->conf_mutex);
3404 static void ath10k_remove_interface(struct ieee80211_hw *hw,
3405 struct ieee80211_vif *vif)
3407 struct ath10k *ar = hw->priv;
3408 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3411 mutex_lock(&ar->conf_mutex);
3413 spin_lock_bh(&ar->data_lock);
3414 ath10k_mac_vif_beacon_cleanup(arvif);
3415 spin_unlock_bh(&ar->data_lock);
3417 ret = ath10k_spectral_vif_stop(arvif);
3419 ath10k_warn(ar, "failed to stop spectral for vdev %i: %d\n",
3420 arvif->vdev_id, ret);
3422 ar->free_vdev_map |= 1LL << arvif->vdev_id;
3423 list_del(&arvif->list);
3425 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
3426 ret = ath10k_wmi_peer_delete(arvif->ar, arvif->vdev_id,
3429 ath10k_warn(ar, "failed to submit AP self-peer removal on vdev %i: %d\n",
3430 arvif->vdev_id, ret);
3432 kfree(arvif->u.ap.noa_data);
3435 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i delete (remove interface)\n",
3438 ret = ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
3440 ath10k_warn(ar, "failed to delete WMI vdev %i: %d\n",
3441 arvif->vdev_id, ret);
3443 /* Some firmware revisions don't notify host about self-peer removal
3444 * until after associated vdev is deleted.
3446 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
3447 ret = ath10k_wait_for_peer_deleted(ar, arvif->vdev_id,
3450 ath10k_warn(ar, "failed to remove AP self-peer on vdev %i: %d\n",
3451 arvif->vdev_id, ret);
3453 spin_lock_bh(&ar->data_lock);
3455 spin_unlock_bh(&ar->data_lock);
3458 ath10k_peer_cleanup(ar, arvif->vdev_id);
3460 mutex_unlock(&ar->conf_mutex);
3464 * FIXME: Has to be verified.
3466 #define SUPPORTED_FILTERS \
3467 (FIF_PROMISC_IN_BSS | \
3472 FIF_BCN_PRBRESP_PROMISC | \
3476 static void ath10k_configure_filter(struct ieee80211_hw *hw,
3477 unsigned int changed_flags,
3478 unsigned int *total_flags,
3481 struct ath10k *ar = hw->priv;
3484 mutex_lock(&ar->conf_mutex);
3486 changed_flags &= SUPPORTED_FILTERS;
3487 *total_flags &= SUPPORTED_FILTERS;
3488 ar->filter_flags = *total_flags;
3490 ret = ath10k_monitor_recalc(ar);
3492 ath10k_warn(ar, "failed to recalc montior: %d\n", ret);
3494 mutex_unlock(&ar->conf_mutex);
3497 static void ath10k_bss_info_changed(struct ieee80211_hw *hw,
3498 struct ieee80211_vif *vif,
3499 struct ieee80211_bss_conf *info,
3502 struct ath10k *ar = hw->priv;
3503 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3505 u32 vdev_param, pdev_param, slottime, preamble;
3507 mutex_lock(&ar->conf_mutex);
3509 if (changed & BSS_CHANGED_IBSS)
3510 ath10k_control_ibss(arvif, info, vif->addr);
3512 if (changed & BSS_CHANGED_BEACON_INT) {
3513 arvif->beacon_interval = info->beacon_int;
3514 vdev_param = ar->wmi.vdev_param->beacon_interval;
3515 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
3516 arvif->beacon_interval);
3517 ath10k_dbg(ar, ATH10K_DBG_MAC,
3518 "mac vdev %d beacon_interval %d\n",
3519 arvif->vdev_id, arvif->beacon_interval);
3522 ath10k_warn(ar, "failed to set beacon interval for vdev %d: %i\n",
3523 arvif->vdev_id, ret);
3526 if (changed & BSS_CHANGED_BEACON) {
3527 ath10k_dbg(ar, ATH10K_DBG_MAC,
3528 "vdev %d set beacon tx mode to staggered\n",
3531 pdev_param = ar->wmi.pdev_param->beacon_tx_mode;
3532 ret = ath10k_wmi_pdev_set_param(ar, pdev_param,
3533 WMI_BEACON_STAGGERED_MODE);
3535 ath10k_warn(ar, "failed to set beacon mode for vdev %d: %i\n",
3536 arvif->vdev_id, ret);
3538 ret = ath10k_mac_setup_bcn_tmpl(arvif);
3540 ath10k_warn(ar, "failed to update beacon template: %d\n",
3544 if (changed & BSS_CHANGED_AP_PROBE_RESP) {
3545 ret = ath10k_mac_setup_prb_tmpl(arvif);
3547 ath10k_warn(ar, "failed to setup probe resp template on vdev %i: %d\n",
3548 arvif->vdev_id, ret);
3551 if (changed & (BSS_CHANGED_BEACON_INFO | BSS_CHANGED_BEACON)) {
3552 arvif->dtim_period = info->dtim_period;
3554 ath10k_dbg(ar, ATH10K_DBG_MAC,
3555 "mac vdev %d dtim_period %d\n",
3556 arvif->vdev_id, arvif->dtim_period);
3558 vdev_param = ar->wmi.vdev_param->dtim_period;
3559 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
3560 arvif->dtim_period);
3562 ath10k_warn(ar, "failed to set dtim period for vdev %d: %i\n",
3563 arvif->vdev_id, ret);
3566 if (changed & BSS_CHANGED_SSID &&
3567 vif->type == NL80211_IFTYPE_AP) {
3568 arvif->u.ap.ssid_len = info->ssid_len;
3570 memcpy(arvif->u.ap.ssid, info->ssid, info->ssid_len);
3571 arvif->u.ap.hidden_ssid = info->hidden_ssid;
3574 if (changed & BSS_CHANGED_BSSID && !is_zero_ether_addr(info->bssid))
3575 ether_addr_copy(arvif->bssid, info->bssid);
3577 if (changed & BSS_CHANGED_BEACON_ENABLED)
3578 ath10k_control_beaconing(arvif, info);
3580 if (changed & BSS_CHANGED_ERP_CTS_PROT) {
3581 arvif->use_cts_prot = info->use_cts_prot;
3582 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d cts_prot %d\n",
3583 arvif->vdev_id, info->use_cts_prot);
3585 ret = ath10k_recalc_rtscts_prot(arvif);
3587 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
3588 arvif->vdev_id, ret);
3591 if (changed & BSS_CHANGED_ERP_SLOT) {
3592 if (info->use_short_slot)
3593 slottime = WMI_VDEV_SLOT_TIME_SHORT; /* 9us */
3596 slottime = WMI_VDEV_SLOT_TIME_LONG; /* 20us */
3598 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d slot_time %d\n",
3599 arvif->vdev_id, slottime);
3601 vdev_param = ar->wmi.vdev_param->slot_time;
3602 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
3605 ath10k_warn(ar, "failed to set erp slot for vdev %d: %i\n",
3606 arvif->vdev_id, ret);
3609 if (changed & BSS_CHANGED_ERP_PREAMBLE) {
3610 if (info->use_short_preamble)
3611 preamble = WMI_VDEV_PREAMBLE_SHORT;
3613 preamble = WMI_VDEV_PREAMBLE_LONG;
3615 ath10k_dbg(ar, ATH10K_DBG_MAC,
3616 "mac vdev %d preamble %dn",
3617 arvif->vdev_id, preamble);
3619 vdev_param = ar->wmi.vdev_param->preamble;
3620 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
3623 ath10k_warn(ar, "failed to set preamble for vdev %d: %i\n",
3624 arvif->vdev_id, ret);
3627 if (changed & BSS_CHANGED_ASSOC) {
3629 /* Workaround: Make sure monitor vdev is not running
3630 * when associating to prevent some firmware revisions
3631 * (e.g. 10.1 and 10.2) from crashing.
3633 if (ar->monitor_started)
3634 ath10k_monitor_stop(ar);
3635 ath10k_bss_assoc(hw, vif, info);
3636 ath10k_monitor_recalc(ar);
3638 ath10k_bss_disassoc(hw, vif);
3642 if (changed & BSS_CHANGED_TXPOWER) {
3643 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev_id %i txpower %d\n",
3644 arvif->vdev_id, info->txpower);
3646 arvif->txpower = info->txpower;
3647 ret = ath10k_mac_txpower_recalc(ar);
3649 ath10k_warn(ar, "failed to recalc tx power: %d\n", ret);
3652 if (changed & BSS_CHANGED_PS) {
3653 ret = ath10k_mac_vif_setup_ps(arvif);
3655 ath10k_warn(ar, "failed to setup ps on vdev %i: %d\n",
3656 arvif->vdev_id, ret);
3659 mutex_unlock(&ar->conf_mutex);
3662 static int ath10k_hw_scan(struct ieee80211_hw *hw,
3663 struct ieee80211_vif *vif,
3664 struct ieee80211_scan_request *hw_req)
3666 struct ath10k *ar = hw->priv;
3667 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3668 struct cfg80211_scan_request *req = &hw_req->req;
3669 struct wmi_start_scan_arg arg;
3673 mutex_lock(&ar->conf_mutex);
3675 spin_lock_bh(&ar->data_lock);
3676 switch (ar->scan.state) {
3677 case ATH10K_SCAN_IDLE:
3678 reinit_completion(&ar->scan.started);
3679 reinit_completion(&ar->scan.completed);
3680 ar->scan.state = ATH10K_SCAN_STARTING;
3681 ar->scan.is_roc = false;
3682 ar->scan.vdev_id = arvif->vdev_id;
3685 case ATH10K_SCAN_STARTING:
3686 case ATH10K_SCAN_RUNNING:
3687 case ATH10K_SCAN_ABORTING:
3691 spin_unlock_bh(&ar->data_lock);
3696 memset(&arg, 0, sizeof(arg));
3697 ath10k_wmi_start_scan_init(ar, &arg);
3698 arg.vdev_id = arvif->vdev_id;
3699 arg.scan_id = ATH10K_SCAN_ID;
3702 arg.scan_ctrl_flags |= WMI_SCAN_ADD_CCK_RATES;
3705 arg.ie_len = req->ie_len;
3706 memcpy(arg.ie, req->ie, arg.ie_len);
3710 arg.n_ssids = req->n_ssids;
3711 for (i = 0; i < arg.n_ssids; i++) {
3712 arg.ssids[i].len = req->ssids[i].ssid_len;
3713 arg.ssids[i].ssid = req->ssids[i].ssid;
3716 arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
3719 if (req->n_channels) {
3720 arg.n_channels = req->n_channels;
3721 for (i = 0; i < arg.n_channels; i++)
3722 arg.channels[i] = req->channels[i]->center_freq;
3725 ret = ath10k_start_scan(ar, &arg);
3727 ath10k_warn(ar, "failed to start hw scan: %d\n", ret);
3728 spin_lock_bh(&ar->data_lock);
3729 ar->scan.state = ATH10K_SCAN_IDLE;
3730 spin_unlock_bh(&ar->data_lock);
3734 mutex_unlock(&ar->conf_mutex);
3738 static void ath10k_cancel_hw_scan(struct ieee80211_hw *hw,
3739 struct ieee80211_vif *vif)
3741 struct ath10k *ar = hw->priv;
3743 mutex_lock(&ar->conf_mutex);
3744 ath10k_scan_abort(ar);
3745 mutex_unlock(&ar->conf_mutex);
3747 cancel_delayed_work_sync(&ar->scan.timeout);
3750 static void ath10k_set_key_h_def_keyidx(struct ath10k *ar,
3751 struct ath10k_vif *arvif,
3752 enum set_key_cmd cmd,
3753 struct ieee80211_key_conf *key)
3755 u32 vdev_param = arvif->ar->wmi.vdev_param->def_keyid;
3758 /* 10.1 firmware branch requires default key index to be set to group
3759 * key index after installing it. Otherwise FW/HW Txes corrupted
3760 * frames with multi-vif APs. This is not required for main firmware
3761 * branch (e.g. 636).
3763 * FIXME: This has been tested only in AP. It remains unknown if this
3764 * is required for multi-vif STA interfaces on 10.1 */
3766 if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
3769 if (key->cipher == WLAN_CIPHER_SUITE_WEP40)
3772 if (key->cipher == WLAN_CIPHER_SUITE_WEP104)
3775 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
3781 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
3784 ath10k_warn(ar, "failed to set vdev %i group key as default key: %d\n",
3785 arvif->vdev_id, ret);
3788 static int ath10k_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
3789 struct ieee80211_vif *vif, struct ieee80211_sta *sta,
3790 struct ieee80211_key_conf *key)
3792 struct ath10k *ar = hw->priv;
3793 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3794 struct ath10k_peer *peer;
3795 const u8 *peer_addr;
3796 bool is_wep = key->cipher == WLAN_CIPHER_SUITE_WEP40 ||
3797 key->cipher == WLAN_CIPHER_SUITE_WEP104;
3798 bool def_idx = false;
3801 if (key->keyidx > WMI_MAX_KEY_INDEX)
3804 mutex_lock(&ar->conf_mutex);
3807 peer_addr = sta->addr;
3808 else if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
3809 peer_addr = vif->bss_conf.bssid;
3811 peer_addr = vif->addr;
3813 key->hw_key_idx = key->keyidx;
3815 /* the peer should not disappear in mid-way (unless FW goes awry) since
3816 * we already hold conf_mutex. we just make sure its there now. */
3817 spin_lock_bh(&ar->data_lock);
3818 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
3819 spin_unlock_bh(&ar->data_lock);
3822 if (cmd == SET_KEY) {
3823 ath10k_warn(ar, "failed to install key for non-existent peer %pM\n",
3828 /* if the peer doesn't exist there is no key to disable
3836 arvif->wep_keys[key->keyidx] = key;
3838 arvif->wep_keys[key->keyidx] = NULL;
3840 if (cmd == DISABLE_KEY)
3841 ath10k_clear_vdev_key(arvif, key);
3844 /* set TX_USAGE flag for all the keys incase of dot1x-WEP. For
3845 * static WEP, do not set this flag for the keys whose key id
3846 * is greater than default key id.
3848 if (arvif->def_wep_key_idx == -1)
3851 ret = ath10k_install_key(arvif, key, cmd, peer_addr, def_idx);
3853 ath10k_warn(ar, "failed to install key for vdev %i peer %pM: %d\n",
3854 arvif->vdev_id, peer_addr, ret);
3858 ath10k_set_key_h_def_keyidx(ar, arvif, cmd, key);
3860 spin_lock_bh(&ar->data_lock);
3861 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
3862 if (peer && cmd == SET_KEY)
3863 peer->keys[key->keyidx] = key;
3864 else if (peer && cmd == DISABLE_KEY)
3865 peer->keys[key->keyidx] = NULL;
3866 else if (peer == NULL)
3867 /* impossible unless FW goes crazy */
3868 ath10k_warn(ar, "Peer %pM disappeared!\n", peer_addr);
3869 spin_unlock_bh(&ar->data_lock);
3872 mutex_unlock(&ar->conf_mutex);
3876 static void ath10k_set_default_unicast_key(struct ieee80211_hw *hw,
3877 struct ieee80211_vif *vif,
3880 struct ath10k *ar = hw->priv;
3881 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3884 mutex_lock(&arvif->ar->conf_mutex);
3886 if (arvif->ar->state != ATH10K_STATE_ON)
3889 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d set keyidx %d\n",
3890 arvif->vdev_id, keyidx);
3892 ret = ath10k_wmi_vdev_set_param(arvif->ar,
3894 arvif->ar->wmi.vdev_param->def_keyid,
3898 ath10k_warn(ar, "failed to update wep key index for vdev %d: %d\n",
3904 arvif->def_wep_key_idx = keyidx;
3906 mutex_unlock(&arvif->ar->conf_mutex);
3909 static void ath10k_sta_rc_update_wk(struct work_struct *wk)
3912 struct ath10k_vif *arvif;
3913 struct ath10k_sta *arsta;
3914 struct ieee80211_sta *sta;
3915 u32 changed, bw, nss, smps;
3918 arsta = container_of(wk, struct ath10k_sta, update_wk);
3919 sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv);
3920 arvif = arsta->arvif;
3923 spin_lock_bh(&ar->data_lock);
3925 changed = arsta->changed;
3932 spin_unlock_bh(&ar->data_lock);
3934 mutex_lock(&ar->conf_mutex);
3936 if (changed & IEEE80211_RC_BW_CHANGED) {
3937 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM peer bw %d\n",
3940 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
3941 WMI_PEER_CHAN_WIDTH, bw);
3943 ath10k_warn(ar, "failed to update STA %pM peer bw %d: %d\n",
3944 sta->addr, bw, err);
3947 if (changed & IEEE80211_RC_NSS_CHANGED) {
3948 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM nss %d\n",
3951 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
3954 ath10k_warn(ar, "failed to update STA %pM nss %d: %d\n",
3955 sta->addr, nss, err);
3958 if (changed & IEEE80211_RC_SMPS_CHANGED) {
3959 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM smps %d\n",
3962 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
3963 WMI_PEER_SMPS_STATE, smps);
3965 ath10k_warn(ar, "failed to update STA %pM smps %d: %d\n",
3966 sta->addr, smps, err);
3969 if (changed & IEEE80211_RC_SUPP_RATES_CHANGED ||
3970 changed & IEEE80211_RC_NSS_CHANGED) {
3971 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM supp rates/nss\n",
3974 err = ath10k_station_assoc(ar, arvif->vif, sta, true);
3976 ath10k_warn(ar, "failed to reassociate station: %pM\n",
3980 mutex_unlock(&ar->conf_mutex);
3983 static int ath10k_mac_inc_num_stations(struct ath10k_vif *arvif)
3985 struct ath10k *ar = arvif->ar;
3987 lockdep_assert_held(&ar->conf_mutex);
3989 if (arvif->vdev_type != WMI_VDEV_TYPE_AP &&
3990 arvif->vdev_type != WMI_VDEV_TYPE_IBSS)
3993 if (ar->num_stations >= ar->max_num_stations)
4001 static void ath10k_mac_dec_num_stations(struct ath10k_vif *arvif)
4003 struct ath10k *ar = arvif->ar;
4005 lockdep_assert_held(&ar->conf_mutex);
4007 if (arvif->vdev_type != WMI_VDEV_TYPE_AP &&
4008 arvif->vdev_type != WMI_VDEV_TYPE_IBSS)
4014 static int ath10k_sta_state(struct ieee80211_hw *hw,
4015 struct ieee80211_vif *vif,
4016 struct ieee80211_sta *sta,
4017 enum ieee80211_sta_state old_state,
4018 enum ieee80211_sta_state new_state)
4020 struct ath10k *ar = hw->priv;
4021 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4022 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
4025 if (old_state == IEEE80211_STA_NOTEXIST &&
4026 new_state == IEEE80211_STA_NONE) {
4027 memset(arsta, 0, sizeof(*arsta));
4028 arsta->arvif = arvif;
4029 INIT_WORK(&arsta->update_wk, ath10k_sta_rc_update_wk);
4032 /* cancel must be done outside the mutex to avoid deadlock */
4033 if ((old_state == IEEE80211_STA_NONE &&
4034 new_state == IEEE80211_STA_NOTEXIST))
4035 cancel_work_sync(&arsta->update_wk);
4037 mutex_lock(&ar->conf_mutex);
4039 if (old_state == IEEE80211_STA_NOTEXIST &&
4040 new_state == IEEE80211_STA_NONE) {
4042 * New station addition.
4044 ath10k_dbg(ar, ATH10K_DBG_MAC,
4045 "mac vdev %d peer create %pM (new sta) sta %d / %d peer %d / %d\n",
4046 arvif->vdev_id, sta->addr,
4047 ar->num_stations + 1, ar->max_num_stations,
4048 ar->num_peers + 1, ar->max_num_peers);
4050 ret = ath10k_mac_inc_num_stations(arvif);
4052 ath10k_warn(ar, "refusing to associate station: too many connected already (%d)\n",
4053 ar->max_num_stations);
4057 ret = ath10k_peer_create(ar, arvif->vdev_id, sta->addr);
4059 ath10k_warn(ar, "failed to add peer %pM for vdev %d when adding a new sta: %i\n",
4060 sta->addr, arvif->vdev_id, ret);
4061 ath10k_mac_dec_num_stations(arvif);
4065 if (vif->type == NL80211_IFTYPE_STATION) {
4066 WARN_ON(arvif->is_started);
4068 ret = ath10k_vdev_start(arvif);
4070 ath10k_warn(ar, "failed to start vdev %i: %d\n",
4071 arvif->vdev_id, ret);
4072 WARN_ON(ath10k_peer_delete(ar, arvif->vdev_id,
4074 ath10k_mac_dec_num_stations(arvif);
4078 arvif->is_started = true;
4080 } else if ((old_state == IEEE80211_STA_NONE &&
4081 new_state == IEEE80211_STA_NOTEXIST)) {
4083 * Existing station deletion.
4085 ath10k_dbg(ar, ATH10K_DBG_MAC,
4086 "mac vdev %d peer delete %pM (sta gone)\n",
4087 arvif->vdev_id, sta->addr);
4089 if (vif->type == NL80211_IFTYPE_STATION) {
4090 WARN_ON(!arvif->is_started);
4092 ret = ath10k_vdev_stop(arvif);
4094 ath10k_warn(ar, "failed to stop vdev %i: %d\n",
4095 arvif->vdev_id, ret);
4097 arvif->is_started = false;
4100 ret = ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
4102 ath10k_warn(ar, "failed to delete peer %pM for vdev %d: %i\n",
4103 sta->addr, arvif->vdev_id, ret);
4105 ath10k_mac_dec_num_stations(arvif);
4106 } else if (old_state == IEEE80211_STA_AUTH &&
4107 new_state == IEEE80211_STA_ASSOC &&
4108 (vif->type == NL80211_IFTYPE_AP ||
4109 vif->type == NL80211_IFTYPE_ADHOC)) {
4113 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac sta %pM associated\n",
4116 ret = ath10k_station_assoc(ar, vif, sta, false);
4118 ath10k_warn(ar, "failed to associate station %pM for vdev %i: %i\n",
4119 sta->addr, arvif->vdev_id, ret);
4120 } else if (old_state == IEEE80211_STA_ASSOC &&
4121 new_state == IEEE80211_STA_AUTH &&
4122 (vif->type == NL80211_IFTYPE_AP ||
4123 vif->type == NL80211_IFTYPE_ADHOC)) {
4127 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac sta %pM disassociated\n",
4130 ret = ath10k_station_disassoc(ar, vif, sta);
4132 ath10k_warn(ar, "failed to disassociate station: %pM vdev %i: %i\n",
4133 sta->addr, arvif->vdev_id, ret);
4136 mutex_unlock(&ar->conf_mutex);
4140 static int ath10k_conf_tx_uapsd(struct ath10k *ar, struct ieee80211_vif *vif,
4141 u16 ac, bool enable)
4143 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4144 struct wmi_sta_uapsd_auto_trig_arg arg = {};
4145 u32 prio = 0, acc = 0;
4149 lockdep_assert_held(&ar->conf_mutex);
4151 if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
4155 case IEEE80211_AC_VO:
4156 value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN |
4157 WMI_STA_PS_UAPSD_AC3_TRIGGER_EN;
4161 case IEEE80211_AC_VI:
4162 value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN |
4163 WMI_STA_PS_UAPSD_AC2_TRIGGER_EN;
4167 case IEEE80211_AC_BE:
4168 value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN |
4169 WMI_STA_PS_UAPSD_AC1_TRIGGER_EN;
4173 case IEEE80211_AC_BK:
4174 value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN |
4175 WMI_STA_PS_UAPSD_AC0_TRIGGER_EN;
4182 arvif->u.sta.uapsd |= value;
4184 arvif->u.sta.uapsd &= ~value;
4186 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
4187 WMI_STA_PS_PARAM_UAPSD,
4188 arvif->u.sta.uapsd);
4190 ath10k_warn(ar, "failed to set uapsd params: %d\n", ret);
4194 if (arvif->u.sta.uapsd)
4195 value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD;
4197 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
4199 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
4200 WMI_STA_PS_PARAM_RX_WAKE_POLICY,
4203 ath10k_warn(ar, "failed to set rx wake param: %d\n", ret);
4205 ret = ath10k_mac_vif_recalc_ps_wake_threshold(arvif);
4207 ath10k_warn(ar, "failed to recalc ps wake threshold on vdev %i: %d\n",
4208 arvif->vdev_id, ret);
4212 ret = ath10k_mac_vif_recalc_ps_poll_count(arvif);
4214 ath10k_warn(ar, "failed to recalc ps poll count on vdev %i: %d\n",
4215 arvif->vdev_id, ret);
4219 if (test_bit(WMI_SERVICE_STA_UAPSD_BASIC_AUTO_TRIG, ar->wmi.svc_map) ||
4220 test_bit(WMI_SERVICE_STA_UAPSD_VAR_AUTO_TRIG, ar->wmi.svc_map)) {
4221 /* Only userspace can make an educated decision when to send
4222 * trigger frame. The following effectively disables u-UAPSD
4223 * autotrigger in firmware (which is enabled by default
4224 * provided the autotrigger service is available).
4228 arg.user_priority = prio;
4229 arg.service_interval = 0;
4230 arg.suspend_interval = WMI_STA_UAPSD_MAX_INTERVAL_MSEC;
4231 arg.delay_interval = WMI_STA_UAPSD_MAX_INTERVAL_MSEC;
4233 ret = ath10k_wmi_vdev_sta_uapsd(ar, arvif->vdev_id,
4234 arvif->bssid, &arg, 1);
4236 ath10k_warn(ar, "failed to set uapsd auto trigger %d\n",
4246 static int ath10k_conf_tx(struct ieee80211_hw *hw,
4247 struct ieee80211_vif *vif, u16 ac,
4248 const struct ieee80211_tx_queue_params *params)
4250 struct ath10k *ar = hw->priv;
4251 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4252 struct wmi_wmm_params_arg *p = NULL;
4255 mutex_lock(&ar->conf_mutex);
4258 case IEEE80211_AC_VO:
4259 p = &arvif->wmm_params.ac_vo;
4261 case IEEE80211_AC_VI:
4262 p = &arvif->wmm_params.ac_vi;
4264 case IEEE80211_AC_BE:
4265 p = &arvif->wmm_params.ac_be;
4267 case IEEE80211_AC_BK:
4268 p = &arvif->wmm_params.ac_bk;
4277 p->cwmin = params->cw_min;
4278 p->cwmax = params->cw_max;
4279 p->aifs = params->aifs;
4282 * The channel time duration programmed in the HW is in absolute
4283 * microseconds, while mac80211 gives the txop in units of
4286 p->txop = params->txop * 32;
4288 if (ar->wmi.ops->gen_vdev_wmm_conf) {
4289 ret = ath10k_wmi_vdev_wmm_conf(ar, arvif->vdev_id,
4290 &arvif->wmm_params);
4292 ath10k_warn(ar, "failed to set vdev wmm params on vdev %i: %d\n",
4293 arvif->vdev_id, ret);
4297 /* This won't work well with multi-interface cases but it's
4298 * better than nothing.
4300 ret = ath10k_wmi_pdev_set_wmm_params(ar, &arvif->wmm_params);
4302 ath10k_warn(ar, "failed to set wmm params: %d\n", ret);
4307 ret = ath10k_conf_tx_uapsd(ar, vif, ac, params->uapsd);
4309 ath10k_warn(ar, "failed to set sta uapsd: %d\n", ret);
4312 mutex_unlock(&ar->conf_mutex);
4316 #define ATH10K_ROC_TIMEOUT_HZ (2*HZ)
4318 static int ath10k_remain_on_channel(struct ieee80211_hw *hw,
4319 struct ieee80211_vif *vif,
4320 struct ieee80211_channel *chan,
4322 enum ieee80211_roc_type type)
4324 struct ath10k *ar = hw->priv;
4325 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4326 struct wmi_start_scan_arg arg;
4329 mutex_lock(&ar->conf_mutex);
4331 spin_lock_bh(&ar->data_lock);
4332 switch (ar->scan.state) {
4333 case ATH10K_SCAN_IDLE:
4334 reinit_completion(&ar->scan.started);
4335 reinit_completion(&ar->scan.completed);
4336 reinit_completion(&ar->scan.on_channel);
4337 ar->scan.state = ATH10K_SCAN_STARTING;
4338 ar->scan.is_roc = true;
4339 ar->scan.vdev_id = arvif->vdev_id;
4340 ar->scan.roc_freq = chan->center_freq;
4343 case ATH10K_SCAN_STARTING:
4344 case ATH10K_SCAN_RUNNING:
4345 case ATH10K_SCAN_ABORTING:
4349 spin_unlock_bh(&ar->data_lock);
4354 duration = max(duration, WMI_SCAN_CHAN_MIN_TIME_MSEC);
4356 memset(&arg, 0, sizeof(arg));
4357 ath10k_wmi_start_scan_init(ar, &arg);
4358 arg.vdev_id = arvif->vdev_id;
4359 arg.scan_id = ATH10K_SCAN_ID;
4361 arg.channels[0] = chan->center_freq;
4362 arg.dwell_time_active = duration;
4363 arg.dwell_time_passive = duration;
4364 arg.max_scan_time = 2 * duration;
4365 arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
4366 arg.scan_ctrl_flags |= WMI_SCAN_FILTER_PROBE_REQ;
4368 ret = ath10k_start_scan(ar, &arg);
4370 ath10k_warn(ar, "failed to start roc scan: %d\n", ret);
4371 spin_lock_bh(&ar->data_lock);
4372 ar->scan.state = ATH10K_SCAN_IDLE;
4373 spin_unlock_bh(&ar->data_lock);
4377 ret = wait_for_completion_timeout(&ar->scan.on_channel, 3*HZ);
4379 ath10k_warn(ar, "failed to switch to channel for roc scan\n");
4381 ret = ath10k_scan_stop(ar);
4383 ath10k_warn(ar, "failed to stop scan: %d\n", ret);
4391 mutex_unlock(&ar->conf_mutex);
4395 static int ath10k_cancel_remain_on_channel(struct ieee80211_hw *hw)
4397 struct ath10k *ar = hw->priv;
4399 mutex_lock(&ar->conf_mutex);
4400 ath10k_scan_abort(ar);
4401 mutex_unlock(&ar->conf_mutex);
4403 cancel_delayed_work_sync(&ar->scan.timeout);
4409 * Both RTS and Fragmentation threshold are interface-specific
4410 * in ath10k, but device-specific in mac80211.
4413 static int ath10k_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
4415 struct ath10k *ar = hw->priv;
4416 struct ath10k_vif *arvif;
4419 mutex_lock(&ar->conf_mutex);
4420 list_for_each_entry(arvif, &ar->arvifs, list) {
4421 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d rts threshold %d\n",
4422 arvif->vdev_id, value);
4424 ret = ath10k_mac_set_rts(arvif, value);
4426 ath10k_warn(ar, "failed to set rts threshold for vdev %d: %d\n",
4427 arvif->vdev_id, ret);
4431 mutex_unlock(&ar->conf_mutex);
4436 static void ath10k_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
4437 u32 queues, bool drop)
4439 struct ath10k *ar = hw->priv;
4443 /* mac80211 doesn't care if we really xmit queued frames or not
4444 * we'll collect those frames either way if we stop/delete vdevs */
4448 mutex_lock(&ar->conf_mutex);
4450 if (ar->state == ATH10K_STATE_WEDGED)
4453 ret = wait_event_timeout(ar->htt.empty_tx_wq, ({
4456 spin_lock_bh(&ar->htt.tx_lock);
4457 empty = (ar->htt.num_pending_tx == 0);
4458 spin_unlock_bh(&ar->htt.tx_lock);
4460 skip = (ar->state == ATH10K_STATE_WEDGED) ||
4461 test_bit(ATH10K_FLAG_CRASH_FLUSH,
4465 }), ATH10K_FLUSH_TIMEOUT_HZ);
4467 if (ret <= 0 || skip)
4468 ath10k_warn(ar, "failed to flush transmit queue (skip %i ar-state %i): %i\n",
4469 skip, ar->state, ret);
4472 mutex_unlock(&ar->conf_mutex);
4475 /* TODO: Implement this function properly
4476 * For now it is needed to reply to Probe Requests in IBSS mode.
4477 * Propably we need this information from FW.
4479 static int ath10k_tx_last_beacon(struct ieee80211_hw *hw)
4485 static int ath10k_suspend(struct ieee80211_hw *hw,
4486 struct cfg80211_wowlan *wowlan)
4488 struct ath10k *ar = hw->priv;
4491 mutex_lock(&ar->conf_mutex);
4493 ret = ath10k_wait_for_suspend(ar, WMI_PDEV_SUSPEND);
4495 if (ret == -ETIMEDOUT)
4501 ret = ath10k_hif_suspend(ar);
4503 ath10k_warn(ar, "failed to suspend hif: %d\n", ret);
4510 ret = ath10k_wmi_pdev_resume_target(ar);
4512 ath10k_warn(ar, "failed to resume target: %d\n", ret);
4516 mutex_unlock(&ar->conf_mutex);
4520 static int ath10k_resume(struct ieee80211_hw *hw)
4522 struct ath10k *ar = hw->priv;
4525 mutex_lock(&ar->conf_mutex);
4527 ret = ath10k_hif_resume(ar);
4529 ath10k_warn(ar, "failed to resume hif: %d\n", ret);
4534 ret = ath10k_wmi_pdev_resume_target(ar);
4536 ath10k_warn(ar, "failed to resume target: %d\n", ret);
4543 mutex_unlock(&ar->conf_mutex);
4548 static void ath10k_reconfig_complete(struct ieee80211_hw *hw,
4549 enum ieee80211_reconfig_type reconfig_type)
4551 struct ath10k *ar = hw->priv;
4553 if (reconfig_type != IEEE80211_RECONFIG_TYPE_RESTART)
4556 mutex_lock(&ar->conf_mutex);
4558 /* If device failed to restart it will be in a different state, e.g.
4559 * ATH10K_STATE_WEDGED */
4560 if (ar->state == ATH10K_STATE_RESTARTED) {
4561 ath10k_info(ar, "device successfully recovered\n");
4562 ar->state = ATH10K_STATE_ON;
4563 ieee80211_wake_queues(ar->hw);
4566 mutex_unlock(&ar->conf_mutex);
4569 static int ath10k_get_survey(struct ieee80211_hw *hw, int idx,
4570 struct survey_info *survey)
4572 struct ath10k *ar = hw->priv;
4573 struct ieee80211_supported_band *sband;
4574 struct survey_info *ar_survey = &ar->survey[idx];
4577 mutex_lock(&ar->conf_mutex);
4579 sband = hw->wiphy->bands[IEEE80211_BAND_2GHZ];
4580 if (sband && idx >= sband->n_channels) {
4581 idx -= sband->n_channels;
4586 sband = hw->wiphy->bands[IEEE80211_BAND_5GHZ];
4588 if (!sband || idx >= sband->n_channels) {
4593 spin_lock_bh(&ar->data_lock);
4594 memcpy(survey, ar_survey, sizeof(*survey));
4595 spin_unlock_bh(&ar->data_lock);
4597 survey->channel = &sband->channels[idx];
4599 if (ar->rx_channel == survey->channel)
4600 survey->filled |= SURVEY_INFO_IN_USE;
4603 mutex_unlock(&ar->conf_mutex);
4607 /* Helper table for legacy fixed_rate/bitrate_mask */
4608 static const u8 cck_ofdm_rate[] = {
4625 /* Check if only one bit set */
4626 static int ath10k_check_single_mask(u32 mask)
4634 mask &= ~BIT(bit - 1);
4642 ath10k_default_bitrate_mask(struct ath10k *ar,
4643 enum ieee80211_band band,
4644 const struct cfg80211_bitrate_mask *mask)
4646 u32 legacy = 0x00ff;
4649 u16 nrf = ar->num_rf_chains;
4651 if (ar->cfg_tx_chainmask)
4652 nrf = get_nss_from_chainmask(ar->cfg_tx_chainmask);
4655 case IEEE80211_BAND_2GHZ:
4659 case IEEE80211_BAND_5GHZ:
4665 if (mask->control[band].legacy != legacy)
4668 for (i = 0; i < nrf; i++)
4669 if (mask->control[band].ht_mcs[i] != ht)
4672 for (i = 0; i < nrf; i++)
4673 if (mask->control[band].vht_mcs[i] != vht)
4680 ath10k_bitrate_mask_nss(const struct cfg80211_bitrate_mask *mask,
4681 enum ieee80211_band band,
4684 int ht_nss = 0, vht_nss = 0, i;
4687 if (ath10k_check_single_mask(mask->control[band].legacy))
4691 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++) {
4692 if (mask->control[band].ht_mcs[i] == 0xff)
4694 else if (mask->control[band].ht_mcs[i] == 0x00)
4703 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
4704 if (mask->control[band].vht_mcs[i] == 0x03ff)
4706 else if (mask->control[band].vht_mcs[i] == 0x0000)
4714 if (ht_nss > 0 && vht_nss > 0)
4718 *fixed_nss = ht_nss;
4720 *fixed_nss = vht_nss;
4728 ath10k_bitrate_mask_correct(const struct cfg80211_bitrate_mask *mask,
4729 enum ieee80211_band band,
4730 enum wmi_rate_preamble *preamble)
4732 int legacy = 0, ht = 0, vht = 0, i;
4734 *preamble = WMI_RATE_PREAMBLE_OFDM;
4737 legacy = ath10k_check_single_mask(mask->control[band].legacy);
4742 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++)
4743 ht += ath10k_check_single_mask(mask->control[band].ht_mcs[i]);
4748 for (i = 0; i < NL80211_VHT_NSS_MAX; i++)
4749 vht += ath10k_check_single_mask(mask->control[band].vht_mcs[i]);
4753 /* Currently we support only one fixed_rate */
4754 if ((legacy + ht + vht) != 1)
4758 *preamble = WMI_RATE_PREAMBLE_HT;
4760 *preamble = WMI_RATE_PREAMBLE_VHT;
4766 ath10k_bitrate_mask_rate(struct ath10k *ar,
4767 const struct cfg80211_bitrate_mask *mask,
4768 enum ieee80211_band band,
4772 u8 rate = 0, pream = 0, nss = 0, i;
4773 enum wmi_rate_preamble preamble;
4775 /* Check if single rate correct */
4776 if (!ath10k_bitrate_mask_correct(mask, band, &preamble))
4782 case WMI_RATE_PREAMBLE_CCK:
4783 case WMI_RATE_PREAMBLE_OFDM:
4784 i = ffs(mask->control[band].legacy) - 1;
4786 if (band == IEEE80211_BAND_2GHZ && i < 4)
4787 pream = WMI_RATE_PREAMBLE_CCK;
4789 if (band == IEEE80211_BAND_5GHZ)
4792 if (i >= ARRAY_SIZE(cck_ofdm_rate))
4795 rate = cck_ofdm_rate[i];
4797 case WMI_RATE_PREAMBLE_HT:
4798 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++)
4799 if (mask->control[band].ht_mcs[i])
4802 if (i == IEEE80211_HT_MCS_MASK_LEN)
4805 rate = ffs(mask->control[band].ht_mcs[i]) - 1;
4808 case WMI_RATE_PREAMBLE_VHT:
4809 for (i = 0; i < NL80211_VHT_NSS_MAX; i++)
4810 if (mask->control[band].vht_mcs[i])
4813 if (i == NL80211_VHT_NSS_MAX)
4816 rate = ffs(mask->control[band].vht_mcs[i]) - 1;
4821 *fixed_nss = nss + 1;
4825 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac fixed rate pream 0x%02x nss 0x%02x rate 0x%02x\n",
4828 *fixed_rate = pream | nss | rate;
4833 static bool ath10k_get_fixed_rate_nss(struct ath10k *ar,
4834 const struct cfg80211_bitrate_mask *mask,
4835 enum ieee80211_band band,
4839 /* First check full NSS mask, if we can simply limit NSS */
4840 if (ath10k_bitrate_mask_nss(mask, band, fixed_nss))
4843 /* Next Check single rate is set */
4844 return ath10k_bitrate_mask_rate(ar, mask, band, fixed_rate, fixed_nss);
4847 static int ath10k_set_fixed_rate_param(struct ath10k_vif *arvif,
4852 struct ath10k *ar = arvif->ar;
4856 mutex_lock(&ar->conf_mutex);
4858 if (arvif->fixed_rate == fixed_rate &&
4859 arvif->fixed_nss == fixed_nss &&
4860 arvif->force_sgi == force_sgi)
4863 if (fixed_rate == WMI_FIXED_RATE_NONE)
4864 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac disable fixed bitrate mask\n");
4867 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac force sgi\n");
4869 vdev_param = ar->wmi.vdev_param->fixed_rate;
4870 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
4871 vdev_param, fixed_rate);
4873 ath10k_warn(ar, "failed to set fixed rate param 0x%02x: %d\n",
4879 arvif->fixed_rate = fixed_rate;
4881 vdev_param = ar->wmi.vdev_param->nss;
4882 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
4883 vdev_param, fixed_nss);
4886 ath10k_warn(ar, "failed to set fixed nss param %d: %d\n",
4892 arvif->fixed_nss = fixed_nss;
4894 vdev_param = ar->wmi.vdev_param->sgi;
4895 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
4899 ath10k_warn(ar, "failed to set sgi param %d: %d\n",
4905 arvif->force_sgi = force_sgi;
4908 mutex_unlock(&ar->conf_mutex);
4912 static int ath10k_set_bitrate_mask(struct ieee80211_hw *hw,
4913 struct ieee80211_vif *vif,
4914 const struct cfg80211_bitrate_mask *mask)
4916 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4917 struct ath10k *ar = arvif->ar;
4918 enum ieee80211_band band = ar->hw->conf.chandef.chan->band;
4919 u8 fixed_rate = WMI_FIXED_RATE_NONE;
4920 u8 fixed_nss = ar->num_rf_chains;
4923 if (ar->cfg_tx_chainmask)
4924 fixed_nss = get_nss_from_chainmask(ar->cfg_tx_chainmask);
4926 force_sgi = mask->control[band].gi;
4927 if (force_sgi == NL80211_TXRATE_FORCE_LGI)
4930 if (!ath10k_default_bitrate_mask(ar, band, mask)) {
4931 if (!ath10k_get_fixed_rate_nss(ar, mask, band,
4937 if (fixed_rate == WMI_FIXED_RATE_NONE && force_sgi) {
4938 ath10k_warn(ar, "failed to force SGI usage for default rate settings\n");
4942 return ath10k_set_fixed_rate_param(arvif, fixed_rate,
4943 fixed_nss, force_sgi);
4946 static void ath10k_sta_rc_update(struct ieee80211_hw *hw,
4947 struct ieee80211_vif *vif,
4948 struct ieee80211_sta *sta,
4951 struct ath10k *ar = hw->priv;
4952 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
4955 spin_lock_bh(&ar->data_lock);
4957 ath10k_dbg(ar, ATH10K_DBG_MAC,
4958 "mac sta rc update for %pM changed %08x bw %d nss %d smps %d\n",
4959 sta->addr, changed, sta->bandwidth, sta->rx_nss,
4962 if (changed & IEEE80211_RC_BW_CHANGED) {
4963 bw = WMI_PEER_CHWIDTH_20MHZ;
4965 switch (sta->bandwidth) {
4966 case IEEE80211_STA_RX_BW_20:
4967 bw = WMI_PEER_CHWIDTH_20MHZ;
4969 case IEEE80211_STA_RX_BW_40:
4970 bw = WMI_PEER_CHWIDTH_40MHZ;
4972 case IEEE80211_STA_RX_BW_80:
4973 bw = WMI_PEER_CHWIDTH_80MHZ;
4975 case IEEE80211_STA_RX_BW_160:
4976 ath10k_warn(ar, "Invalid bandwith %d in rc update for %pM\n",
4977 sta->bandwidth, sta->addr);
4978 bw = WMI_PEER_CHWIDTH_20MHZ;
4985 if (changed & IEEE80211_RC_NSS_CHANGED)
4986 arsta->nss = sta->rx_nss;
4988 if (changed & IEEE80211_RC_SMPS_CHANGED) {
4989 smps = WMI_PEER_SMPS_PS_NONE;
4991 switch (sta->smps_mode) {
4992 case IEEE80211_SMPS_AUTOMATIC:
4993 case IEEE80211_SMPS_OFF:
4994 smps = WMI_PEER_SMPS_PS_NONE;
4996 case IEEE80211_SMPS_STATIC:
4997 smps = WMI_PEER_SMPS_STATIC;
4999 case IEEE80211_SMPS_DYNAMIC:
5000 smps = WMI_PEER_SMPS_DYNAMIC;
5002 case IEEE80211_SMPS_NUM_MODES:
5003 ath10k_warn(ar, "Invalid smps %d in sta rc update for %pM\n",
5004 sta->smps_mode, sta->addr);
5005 smps = WMI_PEER_SMPS_PS_NONE;
5012 arsta->changed |= changed;
5014 spin_unlock_bh(&ar->data_lock);
5016 ieee80211_queue_work(hw, &arsta->update_wk);
5019 static u64 ath10k_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
5022 * FIXME: Return 0 for time being. Need to figure out whether FW
5023 * has the API to fetch 64-bit local TSF
5029 static int ath10k_ampdu_action(struct ieee80211_hw *hw,
5030 struct ieee80211_vif *vif,
5031 enum ieee80211_ampdu_mlme_action action,
5032 struct ieee80211_sta *sta, u16 tid, u16 *ssn,
5035 struct ath10k *ar = hw->priv;
5036 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
5038 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac ampdu vdev_id %i sta %pM tid %hu action %d\n",
5039 arvif->vdev_id, sta->addr, tid, action);
5042 case IEEE80211_AMPDU_RX_START:
5043 case IEEE80211_AMPDU_RX_STOP:
5044 /* HTT AddBa/DelBa events trigger mac80211 Rx BA session
5045 * creation/removal. Do we need to verify this?
5048 case IEEE80211_AMPDU_TX_START:
5049 case IEEE80211_AMPDU_TX_STOP_CONT:
5050 case IEEE80211_AMPDU_TX_STOP_FLUSH:
5051 case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
5052 case IEEE80211_AMPDU_TX_OPERATIONAL:
5053 /* Firmware offloads Tx aggregation entirely so deny mac80211
5054 * Tx aggregation requests.
5062 static const struct ieee80211_ops ath10k_ops = {
5064 .start = ath10k_start,
5065 .stop = ath10k_stop,
5066 .config = ath10k_config,
5067 .add_interface = ath10k_add_interface,
5068 .remove_interface = ath10k_remove_interface,
5069 .configure_filter = ath10k_configure_filter,
5070 .bss_info_changed = ath10k_bss_info_changed,
5071 .hw_scan = ath10k_hw_scan,
5072 .cancel_hw_scan = ath10k_cancel_hw_scan,
5073 .set_key = ath10k_set_key,
5074 .set_default_unicast_key = ath10k_set_default_unicast_key,
5075 .sta_state = ath10k_sta_state,
5076 .conf_tx = ath10k_conf_tx,
5077 .remain_on_channel = ath10k_remain_on_channel,
5078 .cancel_remain_on_channel = ath10k_cancel_remain_on_channel,
5079 .set_rts_threshold = ath10k_set_rts_threshold,
5080 .flush = ath10k_flush,
5081 .tx_last_beacon = ath10k_tx_last_beacon,
5082 .set_antenna = ath10k_set_antenna,
5083 .get_antenna = ath10k_get_antenna,
5084 .reconfig_complete = ath10k_reconfig_complete,
5085 .get_survey = ath10k_get_survey,
5086 .set_bitrate_mask = ath10k_set_bitrate_mask,
5087 .sta_rc_update = ath10k_sta_rc_update,
5088 .get_tsf = ath10k_get_tsf,
5089 .ampdu_action = ath10k_ampdu_action,
5090 .get_et_sset_count = ath10k_debug_get_et_sset_count,
5091 .get_et_stats = ath10k_debug_get_et_stats,
5092 .get_et_strings = ath10k_debug_get_et_strings,
5094 CFG80211_TESTMODE_CMD(ath10k_tm_cmd)
5097 .suspend = ath10k_suspend,
5098 .resume = ath10k_resume,
5100 #ifdef CONFIG_MAC80211_DEBUGFS
5101 .sta_add_debugfs = ath10k_sta_add_debugfs,
5105 #define RATETAB_ENT(_rate, _rateid, _flags) { \
5106 .bitrate = (_rate), \
5107 .flags = (_flags), \
5108 .hw_value = (_rateid), \
5111 #define CHAN2G(_channel, _freq, _flags) { \
5112 .band = IEEE80211_BAND_2GHZ, \
5113 .hw_value = (_channel), \
5114 .center_freq = (_freq), \
5115 .flags = (_flags), \
5116 .max_antenna_gain = 0, \
5120 #define CHAN5G(_channel, _freq, _flags) { \
5121 .band = IEEE80211_BAND_5GHZ, \
5122 .hw_value = (_channel), \
5123 .center_freq = (_freq), \
5124 .flags = (_flags), \
5125 .max_antenna_gain = 0, \
5129 static const struct ieee80211_channel ath10k_2ghz_channels[] = {
5139 CHAN2G(10, 2457, 0),
5140 CHAN2G(11, 2462, 0),
5141 CHAN2G(12, 2467, 0),
5142 CHAN2G(13, 2472, 0),
5143 CHAN2G(14, 2484, 0),
5146 static const struct ieee80211_channel ath10k_5ghz_channels[] = {
5147 CHAN5G(36, 5180, 0),
5148 CHAN5G(40, 5200, 0),
5149 CHAN5G(44, 5220, 0),
5150 CHAN5G(48, 5240, 0),
5151 CHAN5G(52, 5260, 0),
5152 CHAN5G(56, 5280, 0),
5153 CHAN5G(60, 5300, 0),
5154 CHAN5G(64, 5320, 0),
5155 CHAN5G(100, 5500, 0),
5156 CHAN5G(104, 5520, 0),
5157 CHAN5G(108, 5540, 0),
5158 CHAN5G(112, 5560, 0),
5159 CHAN5G(116, 5580, 0),
5160 CHAN5G(120, 5600, 0),
5161 CHAN5G(124, 5620, 0),
5162 CHAN5G(128, 5640, 0),
5163 CHAN5G(132, 5660, 0),
5164 CHAN5G(136, 5680, 0),
5165 CHAN5G(140, 5700, 0),
5166 CHAN5G(149, 5745, 0),
5167 CHAN5G(153, 5765, 0),
5168 CHAN5G(157, 5785, 0),
5169 CHAN5G(161, 5805, 0),
5170 CHAN5G(165, 5825, 0),
5173 /* Note: Be careful if you re-order these. There is code which depends on this
5176 static struct ieee80211_rate ath10k_rates[] = {
5178 RATETAB_ENT(10, 0x82, 0),
5179 RATETAB_ENT(20, 0x84, 0),
5180 RATETAB_ENT(55, 0x8b, 0),
5181 RATETAB_ENT(110, 0x96, 0),
5183 RATETAB_ENT(60, 0x0c, 0),
5184 RATETAB_ENT(90, 0x12, 0),
5185 RATETAB_ENT(120, 0x18, 0),
5186 RATETAB_ENT(180, 0x24, 0),
5187 RATETAB_ENT(240, 0x30, 0),
5188 RATETAB_ENT(360, 0x48, 0),
5189 RATETAB_ENT(480, 0x60, 0),
5190 RATETAB_ENT(540, 0x6c, 0),
5193 #define ath10k_a_rates (ath10k_rates + 4)
5194 #define ath10k_a_rates_size (ARRAY_SIZE(ath10k_rates) - 4)
5195 #define ath10k_g_rates (ath10k_rates + 0)
5196 #define ath10k_g_rates_size (ARRAY_SIZE(ath10k_rates))
5198 struct ath10k *ath10k_mac_create(size_t priv_size)
5200 struct ieee80211_hw *hw;
5203 hw = ieee80211_alloc_hw(sizeof(struct ath10k) + priv_size, &ath10k_ops);
5213 void ath10k_mac_destroy(struct ath10k *ar)
5215 ieee80211_free_hw(ar->hw);
5218 static const struct ieee80211_iface_limit ath10k_if_limits[] = {
5221 .types = BIT(NL80211_IFTYPE_STATION)
5222 | BIT(NL80211_IFTYPE_P2P_CLIENT)
5226 .types = BIT(NL80211_IFTYPE_P2P_GO)
5230 .types = BIT(NL80211_IFTYPE_P2P_DEVICE)
5234 .types = BIT(NL80211_IFTYPE_AP)
5238 static const struct ieee80211_iface_limit ath10k_10x_if_limits[] = {
5241 .types = BIT(NL80211_IFTYPE_AP)
5245 static const struct ieee80211_iface_combination ath10k_if_comb[] = {
5247 .limits = ath10k_if_limits,
5248 .n_limits = ARRAY_SIZE(ath10k_if_limits),
5249 .max_interfaces = 8,
5250 .num_different_channels = 1,
5251 .beacon_int_infra_match = true,
5255 static const struct ieee80211_iface_combination ath10k_10x_if_comb[] = {
5257 .limits = ath10k_10x_if_limits,
5258 .n_limits = ARRAY_SIZE(ath10k_10x_if_limits),
5259 .max_interfaces = 8,
5260 .num_different_channels = 1,
5261 .beacon_int_infra_match = true,
5262 #ifdef CONFIG_ATH10K_DFS_CERTIFIED
5263 .radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
5264 BIT(NL80211_CHAN_WIDTH_20) |
5265 BIT(NL80211_CHAN_WIDTH_40) |
5266 BIT(NL80211_CHAN_WIDTH_80),
5271 static struct ieee80211_sta_vht_cap ath10k_create_vht_cap(struct ath10k *ar)
5273 struct ieee80211_sta_vht_cap vht_cap = {0};
5277 vht_cap.vht_supported = 1;
5278 vht_cap.cap = ar->vht_cap_info;
5281 for (i = 0; i < 8; i++) {
5282 if (i < ar->num_rf_chains)
5283 mcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i*2);
5285 mcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i*2);
5288 vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(mcs_map);
5289 vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(mcs_map);
5294 static struct ieee80211_sta_ht_cap ath10k_get_ht_cap(struct ath10k *ar)
5297 struct ieee80211_sta_ht_cap ht_cap = {0};
5299 if (!(ar->ht_cap_info & WMI_HT_CAP_ENABLED))
5302 ht_cap.ht_supported = 1;
5303 ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
5304 ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_8;
5305 ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
5306 ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
5307 ht_cap.cap |= WLAN_HT_CAP_SM_PS_STATIC << IEEE80211_HT_CAP_SM_PS_SHIFT;
5309 if (ar->ht_cap_info & WMI_HT_CAP_HT20_SGI)
5310 ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
5312 if (ar->ht_cap_info & WMI_HT_CAP_HT40_SGI)
5313 ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
5315 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) {
5318 smps = WLAN_HT_CAP_SM_PS_DYNAMIC;
5319 smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT;
5324 if (ar->ht_cap_info & WMI_HT_CAP_TX_STBC)
5325 ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC;
5327 if (ar->ht_cap_info & WMI_HT_CAP_RX_STBC) {
5330 stbc = ar->ht_cap_info;
5331 stbc &= WMI_HT_CAP_RX_STBC;
5332 stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT;
5333 stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT;
5334 stbc &= IEEE80211_HT_CAP_RX_STBC;
5339 if (ar->ht_cap_info & WMI_HT_CAP_LDPC)
5340 ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
5342 if (ar->ht_cap_info & WMI_HT_CAP_L_SIG_TXOP_PROT)
5343 ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
5345 /* max AMSDU is implicitly taken from vht_cap_info */
5346 if (ar->vht_cap_info & WMI_VHT_CAP_MAX_MPDU_LEN_MASK)
5347 ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU;
5349 for (i = 0; i < ar->num_rf_chains; i++)
5350 ht_cap.mcs.rx_mask[i] = 0xFF;
5352 ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
5357 static void ath10k_get_arvif_iter(void *data, u8 *mac,
5358 struct ieee80211_vif *vif)
5360 struct ath10k_vif_iter *arvif_iter = data;
5361 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
5363 if (arvif->vdev_id == arvif_iter->vdev_id)
5364 arvif_iter->arvif = arvif;
5367 struct ath10k_vif *ath10k_get_arvif(struct ath10k *ar, u32 vdev_id)
5369 struct ath10k_vif_iter arvif_iter;
5372 memset(&arvif_iter, 0, sizeof(struct ath10k_vif_iter));
5373 arvif_iter.vdev_id = vdev_id;
5375 flags = IEEE80211_IFACE_ITER_RESUME_ALL;
5376 ieee80211_iterate_active_interfaces_atomic(ar->hw,
5378 ath10k_get_arvif_iter,
5380 if (!arvif_iter.arvif) {
5381 ath10k_warn(ar, "No VIF found for vdev %d\n", vdev_id);
5385 return arvif_iter.arvif;
5388 int ath10k_mac_register(struct ath10k *ar)
5390 struct ieee80211_supported_band *band;
5391 struct ieee80211_sta_vht_cap vht_cap;
5392 struct ieee80211_sta_ht_cap ht_cap;
5396 SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr);
5398 SET_IEEE80211_DEV(ar->hw, ar->dev);
5400 ht_cap = ath10k_get_ht_cap(ar);
5401 vht_cap = ath10k_create_vht_cap(ar);
5403 if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) {
5404 channels = kmemdup(ath10k_2ghz_channels,
5405 sizeof(ath10k_2ghz_channels),
5412 band = &ar->mac.sbands[IEEE80211_BAND_2GHZ];
5413 band->n_channels = ARRAY_SIZE(ath10k_2ghz_channels);
5414 band->channels = channels;
5415 band->n_bitrates = ath10k_g_rates_size;
5416 band->bitrates = ath10k_g_rates;
5417 band->ht_cap = ht_cap;
5419 /* Enable the VHT support at 2.4 GHz */
5420 band->vht_cap = vht_cap;
5422 ar->hw->wiphy->bands[IEEE80211_BAND_2GHZ] = band;
5425 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) {
5426 channels = kmemdup(ath10k_5ghz_channels,
5427 sizeof(ath10k_5ghz_channels),
5434 band = &ar->mac.sbands[IEEE80211_BAND_5GHZ];
5435 band->n_channels = ARRAY_SIZE(ath10k_5ghz_channels);
5436 band->channels = channels;
5437 band->n_bitrates = ath10k_a_rates_size;
5438 band->bitrates = ath10k_a_rates;
5439 band->ht_cap = ht_cap;
5440 band->vht_cap = vht_cap;
5441 ar->hw->wiphy->bands[IEEE80211_BAND_5GHZ] = band;
5444 ar->hw->wiphy->interface_modes =
5445 BIT(NL80211_IFTYPE_STATION) |
5446 BIT(NL80211_IFTYPE_AP);
5448 ar->hw->wiphy->available_antennas_rx = ar->supp_rx_chainmask;
5449 ar->hw->wiphy->available_antennas_tx = ar->supp_tx_chainmask;
5451 if (!test_bit(ATH10K_FW_FEATURE_NO_P2P, ar->fw_features))
5452 ar->hw->wiphy->interface_modes |=
5453 BIT(NL80211_IFTYPE_P2P_DEVICE) |
5454 BIT(NL80211_IFTYPE_P2P_CLIENT) |
5455 BIT(NL80211_IFTYPE_P2P_GO);
5457 ar->hw->flags = IEEE80211_HW_SIGNAL_DBM |
5458 IEEE80211_HW_SUPPORTS_PS |
5459 IEEE80211_HW_SUPPORTS_DYNAMIC_PS |
5460 IEEE80211_HW_MFP_CAPABLE |
5461 IEEE80211_HW_REPORTS_TX_ACK_STATUS |
5462 IEEE80211_HW_HAS_RATE_CONTROL |
5463 IEEE80211_HW_AP_LINK_PS |
5464 IEEE80211_HW_SPECTRUM_MGMT;
5466 ar->hw->wiphy->features |= NL80211_FEATURE_STATIC_SMPS;
5468 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS)
5469 ar->hw->wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS;
5471 if (ar->ht_cap_info & WMI_HT_CAP_ENABLED) {
5472 ar->hw->flags |= IEEE80211_HW_AMPDU_AGGREGATION;
5473 ar->hw->flags |= IEEE80211_HW_TX_AMPDU_SETUP_IN_HW;
5476 ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID;
5477 ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN;
5479 ar->hw->vif_data_size = sizeof(struct ath10k_vif);
5480 ar->hw->sta_data_size = sizeof(struct ath10k_sta);
5482 ar->hw->max_listen_interval = ATH10K_MAX_HW_LISTEN_INTERVAL;
5484 if (test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map)) {
5485 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD;
5487 /* Firmware delivers WPS/P2P Probe Requests frames to driver so
5488 * that userspace (e.g. wpa_supplicant/hostapd) can generate
5489 * correct Probe Responses. This is more of a hack advert..
5491 ar->hw->wiphy->probe_resp_offload |=
5492 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS |
5493 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS2 |
5494 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_P2P;
5497 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
5498 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
5499 ar->hw->wiphy->max_remain_on_channel_duration = 5000;
5501 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
5502 ar->hw->wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE;
5505 * on LL hardware queues are managed entirely by the FW
5506 * so we only advertise to mac we can do the queues thing
5510 switch (ar->wmi.op_version) {
5511 case ATH10K_FW_WMI_OP_VERSION_MAIN:
5512 case ATH10K_FW_WMI_OP_VERSION_TLV:
5513 ar->hw->wiphy->iface_combinations = ath10k_if_comb;
5514 ar->hw->wiphy->n_iface_combinations =
5515 ARRAY_SIZE(ath10k_if_comb);
5516 ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC);
5518 case ATH10K_FW_WMI_OP_VERSION_10_1:
5519 case ATH10K_FW_WMI_OP_VERSION_10_2:
5520 case ATH10K_FW_WMI_OP_VERSION_10_2_4:
5521 ar->hw->wiphy->iface_combinations = ath10k_10x_if_comb;
5522 ar->hw->wiphy->n_iface_combinations =
5523 ARRAY_SIZE(ath10k_10x_if_comb);
5525 case ATH10K_FW_WMI_OP_VERSION_UNSET:
5526 case ATH10K_FW_WMI_OP_VERSION_MAX:
5532 ar->hw->netdev_features = NETIF_F_HW_CSUM;
5534 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED)) {
5535 /* Init ath dfs pattern detector */
5536 ar->ath_common.debug_mask = ATH_DBG_DFS;
5537 ar->dfs_detector = dfs_pattern_detector_init(&ar->ath_common,
5540 if (!ar->dfs_detector)
5541 ath10k_warn(ar, "failed to initialise DFS pattern detector\n");
5544 ret = ath_regd_init(&ar->ath_common.regulatory, ar->hw->wiphy,
5545 ath10k_reg_notifier);
5547 ath10k_err(ar, "failed to initialise regulatory: %i\n", ret);
5551 ret = ieee80211_register_hw(ar->hw);
5553 ath10k_err(ar, "failed to register ieee80211: %d\n", ret);
5557 if (!ath_is_world_regd(&ar->ath_common.regulatory)) {
5558 ret = regulatory_hint(ar->hw->wiphy,
5559 ar->ath_common.regulatory.alpha2);
5561 goto err_unregister;
5567 ieee80211_unregister_hw(ar->hw);
5569 kfree(ar->mac.sbands[IEEE80211_BAND_2GHZ].channels);
5570 kfree(ar->mac.sbands[IEEE80211_BAND_5GHZ].channels);
5575 void ath10k_mac_unregister(struct ath10k *ar)
5577 ieee80211_unregister_hw(ar->hw);
5579 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector)
5580 ar->dfs_detector->exit(ar->dfs_detector);
5582 kfree(ar->mac.sbands[IEEE80211_BAND_2GHZ].channels);
5583 kfree(ar->mac.sbands[IEEE80211_BAND_5GHZ].channels);
5585 SET_IEEE80211_DEV(ar->hw, NULL);