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>
33 static int ath10k_send_key(struct ath10k_vif *arvif,
34 struct ieee80211_key_conf *key,
38 struct wmi_vdev_install_key_arg arg = {
39 .vdev_id = arvif->vdev_id,
40 .key_idx = key->keyidx,
41 .key_len = key->keylen,
46 lockdep_assert_held(&arvif->ar->conf_mutex);
48 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
49 arg.key_flags = WMI_KEY_PAIRWISE;
51 arg.key_flags = WMI_KEY_GROUP;
53 switch (key->cipher) {
54 case WLAN_CIPHER_SUITE_CCMP:
55 arg.key_cipher = WMI_CIPHER_AES_CCM;
56 key->flags |= IEEE80211_KEY_FLAG_SW_MGMT_TX;
58 case WLAN_CIPHER_SUITE_TKIP:
59 arg.key_cipher = WMI_CIPHER_TKIP;
60 arg.key_txmic_len = 8;
61 arg.key_rxmic_len = 8;
63 case WLAN_CIPHER_SUITE_WEP40:
64 case WLAN_CIPHER_SUITE_WEP104:
65 arg.key_cipher = WMI_CIPHER_WEP;
66 /* AP/IBSS mode requires self-key to be groupwise
67 * Otherwise pairwise key must be set */
68 if (memcmp(macaddr, arvif->vif->addr, ETH_ALEN))
69 arg.key_flags = WMI_KEY_PAIRWISE;
72 ath10k_warn("cipher %d is not supported\n", key->cipher);
76 if (cmd == DISABLE_KEY) {
77 arg.key_cipher = WMI_CIPHER_NONE;
81 return ath10k_wmi_vdev_install_key(arvif->ar, &arg);
84 static int ath10k_install_key(struct ath10k_vif *arvif,
85 struct ieee80211_key_conf *key,
89 struct ath10k *ar = arvif->ar;
92 lockdep_assert_held(&ar->conf_mutex);
94 INIT_COMPLETION(ar->install_key_done);
96 ret = ath10k_send_key(arvif, key, cmd, macaddr);
100 ret = wait_for_completion_timeout(&ar->install_key_done, 3*HZ);
107 static int ath10k_install_peer_wep_keys(struct ath10k_vif *arvif,
110 struct ath10k *ar = arvif->ar;
111 struct ath10k_peer *peer;
115 lockdep_assert_held(&ar->conf_mutex);
117 spin_lock_bh(&ar->data_lock);
118 peer = ath10k_peer_find(ar, arvif->vdev_id, addr);
119 spin_unlock_bh(&ar->data_lock);
124 for (i = 0; i < ARRAY_SIZE(arvif->wep_keys); i++) {
125 if (arvif->wep_keys[i] == NULL)
128 ret = ath10k_install_key(arvif, arvif->wep_keys[i], SET_KEY,
133 peer->keys[i] = arvif->wep_keys[i];
139 static int ath10k_clear_peer_keys(struct ath10k_vif *arvif,
142 struct ath10k *ar = arvif->ar;
143 struct ath10k_peer *peer;
148 lockdep_assert_held(&ar->conf_mutex);
150 spin_lock_bh(&ar->data_lock);
151 peer = ath10k_peer_find(ar, arvif->vdev_id, addr);
152 spin_unlock_bh(&ar->data_lock);
157 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
158 if (peer->keys[i] == NULL)
161 ret = ath10k_install_key(arvif, peer->keys[i],
163 if (ret && first_errno == 0)
167 ath10k_warn("could not remove peer wep key %d (%d)\n",
170 peer->keys[i] = NULL;
176 static int ath10k_clear_vdev_key(struct ath10k_vif *arvif,
177 struct ieee80211_key_conf *key)
179 struct ath10k *ar = arvif->ar;
180 struct ath10k_peer *peer;
186 lockdep_assert_held(&ar->conf_mutex);
189 /* since ath10k_install_key we can't hold data_lock all the
190 * time, so we try to remove the keys incrementally */
191 spin_lock_bh(&ar->data_lock);
193 list_for_each_entry(peer, &ar->peers, list) {
194 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
195 if (peer->keys[i] == key) {
196 memcpy(addr, peer->addr, ETH_ALEN);
197 peer->keys[i] = NULL;
202 if (i < ARRAY_SIZE(peer->keys))
205 spin_unlock_bh(&ar->data_lock);
207 if (i == ARRAY_SIZE(peer->keys))
210 ret = ath10k_install_key(arvif, key, DISABLE_KEY, addr);
211 if (ret && first_errno == 0)
215 ath10k_warn("could not remove key for %pM\n", addr);
222 /*********************/
223 /* General utilities */
224 /*********************/
226 static inline enum wmi_phy_mode
227 chan_to_phymode(const struct cfg80211_chan_def *chandef)
229 enum wmi_phy_mode phymode = MODE_UNKNOWN;
231 switch (chandef->chan->band) {
232 case IEEE80211_BAND_2GHZ:
233 switch (chandef->width) {
234 case NL80211_CHAN_WIDTH_20_NOHT:
237 case NL80211_CHAN_WIDTH_20:
238 phymode = MODE_11NG_HT20;
240 case NL80211_CHAN_WIDTH_40:
241 phymode = MODE_11NG_HT40;
243 case NL80211_CHAN_WIDTH_5:
244 case NL80211_CHAN_WIDTH_10:
245 case NL80211_CHAN_WIDTH_80:
246 case NL80211_CHAN_WIDTH_80P80:
247 case NL80211_CHAN_WIDTH_160:
248 phymode = MODE_UNKNOWN;
252 case IEEE80211_BAND_5GHZ:
253 switch (chandef->width) {
254 case NL80211_CHAN_WIDTH_20_NOHT:
257 case NL80211_CHAN_WIDTH_20:
258 phymode = MODE_11NA_HT20;
260 case NL80211_CHAN_WIDTH_40:
261 phymode = MODE_11NA_HT40;
263 case NL80211_CHAN_WIDTH_80:
264 phymode = MODE_11AC_VHT80;
266 case NL80211_CHAN_WIDTH_5:
267 case NL80211_CHAN_WIDTH_10:
268 case NL80211_CHAN_WIDTH_80P80:
269 case NL80211_CHAN_WIDTH_160:
270 phymode = MODE_UNKNOWN;
278 WARN_ON(phymode == MODE_UNKNOWN);
282 static u8 ath10k_parse_mpdudensity(u8 mpdudensity)
285 * 802.11n D2.0 defined values for "Minimum MPDU Start Spacing":
286 * 0 for no restriction
295 switch (mpdudensity) {
301 /* Our lower layer calculations limit our precision to
317 static int ath10k_peer_create(struct ath10k *ar, u32 vdev_id, const u8 *addr)
321 lockdep_assert_held(&ar->conf_mutex);
323 ret = ath10k_wmi_peer_create(ar, vdev_id, addr);
327 ret = ath10k_wait_for_peer_created(ar, vdev_id, addr);
334 static int ath10k_peer_delete(struct ath10k *ar, u32 vdev_id, const u8 *addr)
338 lockdep_assert_held(&ar->conf_mutex);
340 ret = ath10k_wmi_peer_delete(ar, vdev_id, addr);
344 ret = ath10k_wait_for_peer_deleted(ar, vdev_id, addr);
351 static void ath10k_peer_cleanup(struct ath10k *ar, u32 vdev_id)
353 struct ath10k_peer *peer, *tmp;
355 lockdep_assert_held(&ar->conf_mutex);
357 spin_lock_bh(&ar->data_lock);
358 list_for_each_entry_safe(peer, tmp, &ar->peers, list) {
359 if (peer->vdev_id != vdev_id)
362 ath10k_warn("removing stale peer %pM from vdev_id %d\n",
363 peer->addr, vdev_id);
365 list_del(&peer->list);
368 spin_unlock_bh(&ar->data_lock);
371 /************************/
372 /* Interface management */
373 /************************/
375 static inline int ath10k_vdev_setup_sync(struct ath10k *ar)
379 lockdep_assert_held(&ar->conf_mutex);
381 ret = wait_for_completion_timeout(&ar->vdev_setup_done,
382 ATH10K_VDEV_SETUP_TIMEOUT_HZ);
389 static int ath10k_vdev_start(struct ath10k_vif *arvif)
391 struct ath10k *ar = arvif->ar;
392 struct ieee80211_conf *conf = &ar->hw->conf;
393 struct ieee80211_channel *channel = conf->chandef.chan;
394 struct wmi_vdev_start_request_arg arg = {};
397 lockdep_assert_held(&ar->conf_mutex);
399 INIT_COMPLETION(ar->vdev_setup_done);
401 arg.vdev_id = arvif->vdev_id;
402 arg.dtim_period = arvif->dtim_period;
403 arg.bcn_intval = arvif->beacon_interval;
405 arg.channel.freq = channel->center_freq;
407 arg.channel.band_center_freq1 = conf->chandef.center_freq1;
409 arg.channel.mode = chan_to_phymode(&conf->chandef);
411 arg.channel.min_power = channel->max_power * 3;
412 arg.channel.max_power = channel->max_power * 4;
413 arg.channel.max_reg_power = channel->max_reg_power * 4;
414 arg.channel.max_antenna_gain = channel->max_antenna_gain;
416 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
417 arg.ssid = arvif->u.ap.ssid;
418 arg.ssid_len = arvif->u.ap.ssid_len;
419 arg.hidden_ssid = arvif->u.ap.hidden_ssid;
420 } else if (arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
421 arg.ssid = arvif->vif->bss_conf.ssid;
422 arg.ssid_len = arvif->vif->bss_conf.ssid_len;
425 ret = ath10k_wmi_vdev_start(ar, &arg);
427 ath10k_warn("WMI vdev start failed: ret %d\n", ret);
431 ret = ath10k_vdev_setup_sync(ar);
433 ath10k_warn("vdev setup failed %d\n", ret);
440 static int ath10k_vdev_stop(struct ath10k_vif *arvif)
442 struct ath10k *ar = arvif->ar;
445 lockdep_assert_held(&ar->conf_mutex);
447 INIT_COMPLETION(ar->vdev_setup_done);
449 ret = ath10k_wmi_vdev_stop(ar, arvif->vdev_id);
451 ath10k_warn("WMI vdev stop failed: ret %d\n", ret);
455 ret = ath10k_vdev_setup_sync(ar);
457 ath10k_warn("vdev setup failed %d\n", ret);
464 static int ath10k_monitor_start(struct ath10k *ar, int vdev_id)
466 struct ieee80211_channel *channel = ar->hw->conf.chandef.chan;
467 struct wmi_vdev_start_request_arg arg = {};
468 enum nl80211_channel_type type;
471 lockdep_assert_held(&ar->conf_mutex);
473 type = cfg80211_get_chandef_type(&ar->hw->conf.chandef);
475 arg.vdev_id = vdev_id;
476 arg.channel.freq = channel->center_freq;
477 arg.channel.band_center_freq1 = ar->hw->conf.chandef.center_freq1;
479 /* TODO setup this dynamically, what in case we
480 don't have any vifs? */
481 arg.channel.mode = chan_to_phymode(&ar->hw->conf.chandef);
483 arg.channel.min_power = channel->max_power * 3;
484 arg.channel.max_power = channel->max_power * 4;
485 arg.channel.max_reg_power = channel->max_reg_power * 4;
486 arg.channel.max_antenna_gain = channel->max_antenna_gain;
488 ret = ath10k_wmi_vdev_start(ar, &arg);
490 ath10k_warn("Monitor vdev start failed: ret %d\n", ret);
494 ret = ath10k_vdev_setup_sync(ar);
496 ath10k_warn("Monitor vdev setup failed %d\n", ret);
500 ret = ath10k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr);
502 ath10k_warn("Monitor vdev up failed: %d\n", ret);
506 ar->monitor_vdev_id = vdev_id;
507 ar->monitor_enabled = true;
512 ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
514 ath10k_warn("Monitor vdev stop failed: %d\n", ret);
519 static int ath10k_monitor_stop(struct ath10k *ar)
523 lockdep_assert_held(&ar->conf_mutex);
525 /* For some reasons, ath10k_wmi_vdev_down() here couse
526 * often ath10k_wmi_vdev_stop() to fail. Next we could
527 * not run monitor vdev and driver reload
528 * required. Don't see such problems we skip
529 * ath10k_wmi_vdev_down() here.
532 ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
534 ath10k_warn("Monitor vdev stop failed: %d\n", ret);
536 ret = ath10k_vdev_setup_sync(ar);
538 ath10k_warn("Monitor_down sync failed: %d\n", ret);
540 ar->monitor_enabled = false;
544 static int ath10k_monitor_create(struct ath10k *ar)
548 lockdep_assert_held(&ar->conf_mutex);
550 if (ar->monitor_present) {
551 ath10k_warn("Monitor mode already enabled\n");
555 bit = ffs(ar->free_vdev_map);
557 ath10k_warn("No free VDEV slots\n");
561 ar->monitor_vdev_id = bit - 1;
562 ar->free_vdev_map &= ~(1 << ar->monitor_vdev_id);
564 ret = ath10k_wmi_vdev_create(ar, ar->monitor_vdev_id,
565 WMI_VDEV_TYPE_MONITOR,
568 ath10k_warn("WMI vdev monitor create failed: ret %d\n", ret);
572 ath10k_dbg(ATH10K_DBG_MAC, "Monitor interface created, vdev id: %d\n",
573 ar->monitor_vdev_id);
575 ar->monitor_present = true;
580 * Restore the ID to the global map.
582 ar->free_vdev_map |= 1 << (ar->monitor_vdev_id);
586 static int ath10k_monitor_destroy(struct ath10k *ar)
590 lockdep_assert_held(&ar->conf_mutex);
592 if (!ar->monitor_present)
595 ret = ath10k_wmi_vdev_delete(ar, ar->monitor_vdev_id);
597 ath10k_warn("WMI vdev monitor delete failed: %d\n", ret);
601 ar->free_vdev_map |= 1 << (ar->monitor_vdev_id);
602 ar->monitor_present = false;
604 ath10k_dbg(ATH10K_DBG_MAC, "Monitor interface destroyed, vdev id: %d\n",
605 ar->monitor_vdev_id);
609 static void ath10k_control_beaconing(struct ath10k_vif *arvif,
610 struct ieee80211_bss_conf *info)
614 lockdep_assert_held(&arvif->ar->conf_mutex);
616 if (!info->enable_beacon) {
617 ath10k_vdev_stop(arvif);
621 arvif->tx_seq_no = 0x1000;
623 ret = ath10k_vdev_start(arvif);
627 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, 0, info->bssid);
629 ath10k_warn("Failed to bring up VDEV: %d\n",
633 ath10k_dbg(ATH10K_DBG_MAC, "VDEV: %d up\n", arvif->vdev_id);
636 static void ath10k_control_ibss(struct ath10k_vif *arvif,
637 struct ieee80211_bss_conf *info,
638 const u8 self_peer[ETH_ALEN])
642 lockdep_assert_held(&arvif->ar->conf_mutex);
644 if (!info->ibss_joined) {
645 ret = ath10k_peer_delete(arvif->ar, arvif->vdev_id, self_peer);
647 ath10k_warn("Failed to delete IBSS self peer:%pM for VDEV:%d ret:%d\n",
648 self_peer, arvif->vdev_id, ret);
650 if (is_zero_ether_addr(arvif->u.ibss.bssid))
653 ret = ath10k_peer_delete(arvif->ar, arvif->vdev_id,
654 arvif->u.ibss.bssid);
656 ath10k_warn("Failed to delete IBSS BSSID peer:%pM for VDEV:%d ret:%d\n",
657 arvif->u.ibss.bssid, arvif->vdev_id, ret);
661 memset(arvif->u.ibss.bssid, 0, ETH_ALEN);
666 ret = ath10k_peer_create(arvif->ar, arvif->vdev_id, self_peer);
668 ath10k_warn("Failed to create IBSS self peer:%pM for VDEV:%d ret:%d\n",
669 self_peer, arvif->vdev_id, ret);
673 ret = ath10k_wmi_vdev_set_param(arvif->ar, arvif->vdev_id,
674 WMI_VDEV_PARAM_ATIM_WINDOW,
675 ATH10K_DEFAULT_ATIM);
677 ath10k_warn("Failed to set IBSS ATIM for VDEV:%d ret:%d\n",
678 arvif->vdev_id, ret);
682 * Review this when mac80211 gains per-interface powersave support.
684 static void ath10k_ps_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
686 struct ath10k_generic_iter *ar_iter = data;
687 struct ieee80211_conf *conf = &ar_iter->ar->hw->conf;
688 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
689 enum wmi_sta_powersave_param param;
690 enum wmi_sta_ps_mode psmode;
693 lockdep_assert_held(&arvif->ar->conf_mutex);
695 if (vif->type != NL80211_IFTYPE_STATION)
698 if (conf->flags & IEEE80211_CONF_PS) {
699 psmode = WMI_STA_PS_MODE_ENABLED;
700 param = WMI_STA_PS_PARAM_INACTIVITY_TIME;
702 ret = ath10k_wmi_set_sta_ps_param(ar_iter->ar,
705 conf->dynamic_ps_timeout);
707 ath10k_warn("Failed to set inactivity time for VDEV: %d\n",
714 psmode = WMI_STA_PS_MODE_DISABLED;
717 ar_iter->ret = ath10k_wmi_set_psmode(ar_iter->ar, arvif->vdev_id,
720 ath10k_warn("Failed to set PS Mode: %d for VDEV: %d\n",
721 psmode, arvif->vdev_id);
723 ath10k_dbg(ATH10K_DBG_MAC, "Set PS Mode: %d for VDEV: %d\n",
724 psmode, arvif->vdev_id);
727 /**********************/
728 /* Station management */
729 /**********************/
731 static void ath10k_peer_assoc_h_basic(struct ath10k *ar,
732 struct ath10k_vif *arvif,
733 struct ieee80211_sta *sta,
734 struct ieee80211_bss_conf *bss_conf,
735 struct wmi_peer_assoc_complete_arg *arg)
737 lockdep_assert_held(&ar->conf_mutex);
739 memcpy(arg->addr, sta->addr, ETH_ALEN);
740 arg->vdev_id = arvif->vdev_id;
741 arg->peer_aid = sta->aid;
742 arg->peer_flags |= WMI_PEER_AUTH;
744 if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
746 * Seems FW have problems with Power Save in STA
747 * mode when we setup this parameter to high (eg. 5).
748 * Often we see that FW don't send NULL (with clean P flags)
749 * frame even there is info about buffered frames in beacons.
750 * Sometimes we have to wait more than 10 seconds before FW
751 * will wakeup. Often sending one ping from AP to our device
752 * just fail (more than 50%).
754 * Seems setting this FW parameter to 1 couse FW
755 * will check every beacon and will wakup immediately
756 * after detection buffered data.
758 arg->peer_listen_intval = 1;
760 arg->peer_listen_intval = ar->hw->conf.listen_interval;
762 arg->peer_num_spatial_streams = 1;
765 * The assoc capabilities are available only in managed mode.
767 if (arvif->vdev_type == WMI_VDEV_TYPE_STA && bss_conf)
768 arg->peer_caps = bss_conf->assoc_capability;
771 static void ath10k_peer_assoc_h_crypto(struct ath10k *ar,
772 struct ath10k_vif *arvif,
773 struct wmi_peer_assoc_complete_arg *arg)
775 struct ieee80211_vif *vif = arvif->vif;
776 struct ieee80211_bss_conf *info = &vif->bss_conf;
777 struct cfg80211_bss *bss;
778 const u8 *rsnie = NULL;
779 const u8 *wpaie = NULL;
781 lockdep_assert_held(&ar->conf_mutex);
783 bss = cfg80211_get_bss(ar->hw->wiphy, ar->hw->conf.chandef.chan,
784 info->bssid, NULL, 0, 0, 0);
786 const struct cfg80211_bss_ies *ies;
789 rsnie = ieee80211_bss_get_ie(bss, WLAN_EID_RSN);
791 ies = rcu_dereference(bss->ies);
793 wpaie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
794 WLAN_OUI_TYPE_MICROSOFT_WPA,
798 cfg80211_put_bss(ar->hw->wiphy, bss);
801 /* FIXME: base on RSN IE/WPA IE is a correct idea? */
802 if (rsnie || wpaie) {
803 ath10k_dbg(ATH10K_DBG_WMI, "%s: rsn ie found\n", __func__);
804 arg->peer_flags |= WMI_PEER_NEED_PTK_4_WAY;
808 ath10k_dbg(ATH10K_DBG_WMI, "%s: wpa ie found\n", __func__);
809 arg->peer_flags |= WMI_PEER_NEED_GTK_2_WAY;
813 static void ath10k_peer_assoc_h_rates(struct ath10k *ar,
814 struct ieee80211_sta *sta,
815 struct wmi_peer_assoc_complete_arg *arg)
817 struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates;
818 const struct ieee80211_supported_band *sband;
819 const struct ieee80211_rate *rates;
823 lockdep_assert_held(&ar->conf_mutex);
825 sband = ar->hw->wiphy->bands[ar->hw->conf.chandef.chan->band];
826 ratemask = sta->supp_rates[ar->hw->conf.chandef.chan->band];
827 rates = sband->bitrates;
829 rateset->num_rates = 0;
831 for (i = 0; i < 32; i++, ratemask >>= 1, rates++) {
835 rateset->rates[rateset->num_rates] = rates->hw_value;
836 rateset->num_rates++;
840 static void ath10k_peer_assoc_h_ht(struct ath10k *ar,
841 struct ieee80211_sta *sta,
842 struct wmi_peer_assoc_complete_arg *arg)
844 const struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
848 lockdep_assert_held(&ar->conf_mutex);
850 if (!ht_cap->ht_supported)
853 arg->peer_flags |= WMI_PEER_HT;
854 arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
855 ht_cap->ampdu_factor)) - 1;
857 arg->peer_mpdu_density =
858 ath10k_parse_mpdudensity(ht_cap->ampdu_density);
860 arg->peer_ht_caps = ht_cap->cap;
861 arg->peer_rate_caps |= WMI_RC_HT_FLAG;
863 if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING)
864 arg->peer_flags |= WMI_PEER_LDPC;
866 if (sta->bandwidth >= IEEE80211_STA_RX_BW_40) {
867 arg->peer_flags |= WMI_PEER_40MHZ;
868 arg->peer_rate_caps |= WMI_RC_CW40_FLAG;
871 if (ht_cap->cap & IEEE80211_HT_CAP_SGI_20)
872 arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
874 if (ht_cap->cap & IEEE80211_HT_CAP_SGI_40)
875 arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
877 if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) {
878 arg->peer_rate_caps |= WMI_RC_TX_STBC_FLAG;
879 arg->peer_flags |= WMI_PEER_STBC;
882 if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) {
884 stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC;
885 stbc = stbc >> IEEE80211_HT_CAP_RX_STBC_SHIFT;
886 stbc = stbc << WMI_RC_RX_STBC_FLAG_S;
887 arg->peer_rate_caps |= stbc;
888 arg->peer_flags |= WMI_PEER_STBC;
891 smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
892 smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
894 if (smps == WLAN_HT_CAP_SM_PS_STATIC) {
895 arg->peer_flags |= WMI_PEER_SPATIAL_MUX;
896 arg->peer_flags |= WMI_PEER_STATIC_MIMOPS;
897 } else if (smps == WLAN_HT_CAP_SM_PS_DYNAMIC) {
898 arg->peer_flags |= WMI_PEER_SPATIAL_MUX;
899 arg->peer_flags |= WMI_PEER_DYN_MIMOPS;
902 if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2])
903 arg->peer_rate_caps |= WMI_RC_TS_FLAG;
904 else if (ht_cap->mcs.rx_mask[1])
905 arg->peer_rate_caps |= WMI_RC_DS_FLAG;
907 for (i = 0, n = 0; i < IEEE80211_HT_MCS_MASK_LEN*8; i++)
908 if (ht_cap->mcs.rx_mask[i/8] & (1 << i%8))
909 arg->peer_ht_rates.rates[n++] = i;
911 arg->peer_ht_rates.num_rates = n;
912 arg->peer_num_spatial_streams = max((n+7) / 8, 1);
914 ath10k_dbg(ATH10K_DBG_MAC, "mcs cnt %d nss %d\n",
915 arg->peer_ht_rates.num_rates,
916 arg->peer_num_spatial_streams);
919 static void ath10k_peer_assoc_h_qos_ap(struct ath10k *ar,
920 struct ath10k_vif *arvif,
921 struct ieee80211_sta *sta,
922 struct ieee80211_bss_conf *bss_conf,
923 struct wmi_peer_assoc_complete_arg *arg)
928 lockdep_assert_held(&ar->conf_mutex);
931 arg->peer_flags |= WMI_PEER_QOS;
933 if (sta->wme && sta->uapsd_queues) {
934 ath10k_dbg(ATH10K_DBG_MAC, "uapsd_queues: 0x%X, max_sp: %d\n",
935 sta->uapsd_queues, sta->max_sp);
937 arg->peer_flags |= WMI_PEER_APSD;
938 arg->peer_flags |= WMI_RC_UAPSD_FLAG;
940 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO)
941 uapsd |= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN |
942 WMI_AP_PS_UAPSD_AC3_TRIGGER_EN;
943 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI)
944 uapsd |= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN |
945 WMI_AP_PS_UAPSD_AC2_TRIGGER_EN;
946 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK)
947 uapsd |= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN |
948 WMI_AP_PS_UAPSD_AC1_TRIGGER_EN;
949 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE)
950 uapsd |= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN |
951 WMI_AP_PS_UAPSD_AC0_TRIGGER_EN;
954 if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP)
955 max_sp = sta->max_sp;
957 ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
959 WMI_AP_PS_PEER_PARAM_UAPSD,
962 ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
964 WMI_AP_PS_PEER_PARAM_MAX_SP,
967 /* TODO setup this based on STA listen interval and
968 beacon interval. Currently we don't know
969 sta->listen_interval - mac80211 patch required.
970 Currently use 10 seconds */
971 ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
973 WMI_AP_PS_PEER_PARAM_AGEOUT_TIME,
978 static void ath10k_peer_assoc_h_qos_sta(struct ath10k *ar,
979 struct ath10k_vif *arvif,
980 struct ieee80211_sta *sta,
981 struct ieee80211_bss_conf *bss_conf,
982 struct wmi_peer_assoc_complete_arg *arg)
985 arg->peer_flags |= WMI_PEER_QOS;
988 static void ath10k_peer_assoc_h_vht(struct ath10k *ar,
989 struct ieee80211_sta *sta,
990 struct wmi_peer_assoc_complete_arg *arg)
992 const struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
994 if (!vht_cap->vht_supported)
997 arg->peer_flags |= WMI_PEER_VHT;
999 arg->peer_vht_caps = vht_cap->cap;
1001 if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
1002 arg->peer_flags |= WMI_PEER_80MHZ;
1004 arg->peer_vht_rates.rx_max_rate =
1005 __le16_to_cpu(vht_cap->vht_mcs.rx_highest);
1006 arg->peer_vht_rates.rx_mcs_set =
1007 __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map);
1008 arg->peer_vht_rates.tx_max_rate =
1009 __le16_to_cpu(vht_cap->vht_mcs.tx_highest);
1010 arg->peer_vht_rates.tx_mcs_set =
1011 __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map);
1013 ath10k_dbg(ATH10K_DBG_MAC, "mac vht peer\n");
1016 static void ath10k_peer_assoc_h_qos(struct ath10k *ar,
1017 struct ath10k_vif *arvif,
1018 struct ieee80211_sta *sta,
1019 struct ieee80211_bss_conf *bss_conf,
1020 struct wmi_peer_assoc_complete_arg *arg)
1022 switch (arvif->vdev_type) {
1023 case WMI_VDEV_TYPE_AP:
1024 ath10k_peer_assoc_h_qos_ap(ar, arvif, sta, bss_conf, arg);
1026 case WMI_VDEV_TYPE_STA:
1027 ath10k_peer_assoc_h_qos_sta(ar, arvif, sta, bss_conf, arg);
1034 static void ath10k_peer_assoc_h_phymode(struct ath10k *ar,
1035 struct ath10k_vif *arvif,
1036 struct ieee80211_sta *sta,
1037 struct wmi_peer_assoc_complete_arg *arg)
1039 enum wmi_phy_mode phymode = MODE_UNKNOWN;
1041 /* FIXME: add VHT */
1043 switch (ar->hw->conf.chandef.chan->band) {
1044 case IEEE80211_BAND_2GHZ:
1045 if (sta->ht_cap.ht_supported) {
1046 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1047 phymode = MODE_11NG_HT40;
1049 phymode = MODE_11NG_HT20;
1055 case IEEE80211_BAND_5GHZ:
1056 if (sta->ht_cap.ht_supported) {
1057 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1058 phymode = MODE_11NA_HT40;
1060 phymode = MODE_11NA_HT20;
1070 arg->peer_phymode = phymode;
1071 WARN_ON(phymode == MODE_UNKNOWN);
1074 static int ath10k_peer_assoc(struct ath10k *ar,
1075 struct ath10k_vif *arvif,
1076 struct ieee80211_sta *sta,
1077 struct ieee80211_bss_conf *bss_conf)
1079 struct wmi_peer_assoc_complete_arg arg;
1081 lockdep_assert_held(&ar->conf_mutex);
1083 memset(&arg, 0, sizeof(struct wmi_peer_assoc_complete_arg));
1085 ath10k_peer_assoc_h_basic(ar, arvif, sta, bss_conf, &arg);
1086 ath10k_peer_assoc_h_crypto(ar, arvif, &arg);
1087 ath10k_peer_assoc_h_rates(ar, sta, &arg);
1088 ath10k_peer_assoc_h_ht(ar, sta, &arg);
1089 ath10k_peer_assoc_h_vht(ar, sta, &arg);
1090 ath10k_peer_assoc_h_qos(ar, arvif, sta, bss_conf, &arg);
1091 ath10k_peer_assoc_h_phymode(ar, arvif, sta, &arg);
1093 return ath10k_wmi_peer_assoc(ar, &arg);
1096 /* can be called only in mac80211 callbacks due to `key_count` usage */
1097 static void ath10k_bss_assoc(struct ieee80211_hw *hw,
1098 struct ieee80211_vif *vif,
1099 struct ieee80211_bss_conf *bss_conf)
1101 struct ath10k *ar = hw->priv;
1102 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1103 struct ieee80211_sta *ap_sta;
1106 lockdep_assert_held(&ar->conf_mutex);
1110 ap_sta = ieee80211_find_sta(vif, bss_conf->bssid);
1112 ath10k_warn("Failed to find station entry for %pM\n",
1118 ret = ath10k_peer_assoc(ar, arvif, ap_sta, bss_conf);
1120 ath10k_warn("Peer assoc failed for %pM\n", bss_conf->bssid);
1127 ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, bss_conf->aid,
1130 ath10k_warn("VDEV: %d up failed: ret %d\n",
1131 arvif->vdev_id, ret);
1133 ath10k_dbg(ATH10K_DBG_MAC,
1134 "VDEV: %d associated, BSSID: %pM, AID: %d\n",
1135 arvif->vdev_id, bss_conf->bssid, bss_conf->aid);
1141 static void ath10k_bss_disassoc(struct ieee80211_hw *hw,
1142 struct ieee80211_vif *vif)
1144 struct ath10k *ar = hw->priv;
1145 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1148 lockdep_assert_held(&ar->conf_mutex);
1151 * For some reason, calling VDEV-DOWN before VDEV-STOP
1152 * makes the FW to send frames via HTT after disassociation.
1153 * No idea why this happens, even though VDEV-DOWN is supposed
1154 * to be analogous to link down, so just stop the VDEV.
1156 ret = ath10k_vdev_stop(arvif);
1158 ath10k_dbg(ATH10K_DBG_MAC, "VDEV: %d stopped\n",
1162 * If we don't call VDEV-DOWN after VDEV-STOP FW will remain active and
1163 * report beacons from previously associated network through HTT.
1164 * This in turn would spam mac80211 WARN_ON if we bring down all
1165 * interfaces as it expects there is no rx when no interface is
1168 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
1170 ath10k_dbg(ATH10K_DBG_MAC, "VDEV: %d ath10k_wmi_vdev_down failed (%d)\n",
1171 arvif->vdev_id, ret);
1173 ath10k_wmi_flush_tx(ar);
1175 arvif->def_wep_key_index = 0;
1178 static int ath10k_station_assoc(struct ath10k *ar, struct ath10k_vif *arvif,
1179 struct ieee80211_sta *sta)
1183 lockdep_assert_held(&ar->conf_mutex);
1185 ret = ath10k_peer_assoc(ar, arvif, sta, NULL);
1187 ath10k_warn("WMI peer assoc failed for %pM\n", sta->addr);
1191 ret = ath10k_install_peer_wep_keys(arvif, sta->addr);
1193 ath10k_warn("could not install peer wep keys (%d)\n", ret);
1200 static int ath10k_station_disassoc(struct ath10k *ar, struct ath10k_vif *arvif,
1201 struct ieee80211_sta *sta)
1205 lockdep_assert_held(&ar->conf_mutex);
1207 ret = ath10k_clear_peer_keys(arvif, sta->addr);
1209 ath10k_warn("could not clear all peer wep keys (%d)\n", ret);
1220 static int ath10k_update_channel_list(struct ath10k *ar)
1222 struct ieee80211_hw *hw = ar->hw;
1223 struct ieee80211_supported_band **bands;
1224 enum ieee80211_band band;
1225 struct ieee80211_channel *channel;
1226 struct wmi_scan_chan_list_arg arg = {0};
1227 struct wmi_channel_arg *ch;
1233 lockdep_assert_held(&ar->conf_mutex);
1235 bands = hw->wiphy->bands;
1236 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
1240 for (i = 0; i < bands[band]->n_channels; i++) {
1241 if (bands[band]->channels[i].flags &
1242 IEEE80211_CHAN_DISABLED)
1249 len = sizeof(struct wmi_channel_arg) * arg.n_channels;
1250 arg.channels = kzalloc(len, GFP_KERNEL);
1255 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
1259 for (i = 0; i < bands[band]->n_channels; i++) {
1260 channel = &bands[band]->channels[i];
1262 if (channel->flags & IEEE80211_CHAN_DISABLED)
1265 ch->allow_ht = true;
1267 /* FIXME: when should we really allow VHT? */
1268 ch->allow_vht = true;
1271 !(channel->flags & IEEE80211_CHAN_NO_IBSS);
1274 !(channel->flags & IEEE80211_CHAN_NO_HT40PLUS);
1276 passive = channel->flags & IEEE80211_CHAN_PASSIVE_SCAN;
1277 ch->passive = passive;
1279 ch->freq = channel->center_freq;
1280 ch->min_power = channel->max_power * 3;
1281 ch->max_power = channel->max_power * 4;
1282 ch->max_reg_power = channel->max_reg_power * 4;
1283 ch->max_antenna_gain = channel->max_antenna_gain;
1284 ch->reg_class_id = 0; /* FIXME */
1286 /* FIXME: why use only legacy modes, why not any
1287 * HT/VHT modes? Would that even make any
1289 if (channel->band == IEEE80211_BAND_2GHZ)
1290 ch->mode = MODE_11G;
1292 ch->mode = MODE_11A;
1294 if (WARN_ON_ONCE(ch->mode == MODE_UNKNOWN))
1297 ath10k_dbg(ATH10K_DBG_WMI,
1298 "%s: [%zd/%d] freq %d maxpower %d regpower %d antenna %d mode %d\n",
1299 __func__, ch - arg.channels, arg.n_channels,
1300 ch->freq, ch->max_power, ch->max_reg_power,
1301 ch->max_antenna_gain, ch->mode);
1307 ret = ath10k_wmi_scan_chan_list(ar, &arg);
1308 kfree(arg.channels);
1313 static void ath10k_reg_notifier(struct wiphy *wiphy,
1314 struct regulatory_request *request)
1316 struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
1317 struct reg_dmn_pair_mapping *regpair;
1318 struct ath10k *ar = hw->priv;
1321 mutex_lock(&ar->conf_mutex);
1323 ath_reg_notifier_apply(wiphy, request, &ar->ath_common.regulatory);
1325 ret = ath10k_update_channel_list(ar);
1327 ath10k_warn("could not update channel list (%d)\n", ret);
1329 regpair = ar->ath_common.regulatory.regpair;
1330 /* Target allows setting up per-band regdomain but ath_common provides
1331 * a combined one only */
1332 ret = ath10k_wmi_pdev_set_regdomain(ar,
1333 regpair->regDmnEnum,
1334 regpair->regDmnEnum, /* 2ghz */
1335 regpair->regDmnEnum, /* 5ghz */
1336 regpair->reg_2ghz_ctl,
1337 regpair->reg_5ghz_ctl);
1339 ath10k_warn("could not set pdev regdomain (%d)\n", ret);
1341 mutex_unlock(&ar->conf_mutex);
1349 * Frames sent to the FW have to be in "Native Wifi" format.
1350 * Strip the QoS field from the 802.11 header.
1352 static void ath10k_tx_h_qos_workaround(struct ieee80211_hw *hw,
1353 struct ieee80211_tx_control *control,
1354 struct sk_buff *skb)
1356 struct ieee80211_hdr *hdr = (void *)skb->data;
1359 if (!ieee80211_is_data_qos(hdr->frame_control))
1362 qos_ctl = ieee80211_get_qos_ctl(hdr);
1363 memmove(qos_ctl, qos_ctl + IEEE80211_QOS_CTL_LEN,
1364 skb->len - ieee80211_hdrlen(hdr->frame_control));
1365 skb_trim(skb, skb->len - IEEE80211_QOS_CTL_LEN);
1368 static void ath10k_tx_h_update_wep_key(struct sk_buff *skb)
1370 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
1371 struct ieee80211_vif *vif = info->control.vif;
1372 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1373 struct ath10k *ar = arvif->ar;
1374 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
1375 struct ieee80211_key_conf *key = info->control.hw_key;
1378 /* TODO AP mode should be implemented */
1379 if (vif->type != NL80211_IFTYPE_STATION)
1382 if (!ieee80211_has_protected(hdr->frame_control))
1388 if (key->cipher != WLAN_CIPHER_SUITE_WEP40 &&
1389 key->cipher != WLAN_CIPHER_SUITE_WEP104)
1392 if (key->keyidx == arvif->def_wep_key_index)
1395 ath10k_dbg(ATH10K_DBG_MAC, "new wep keyidx will be %d\n", key->keyidx);
1397 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
1398 WMI_VDEV_PARAM_DEF_KEYID,
1401 ath10k_warn("could not update wep keyidx (%d)\n", ret);
1405 arvif->def_wep_key_index = key->keyidx;
1408 static void ath10k_tx_h_add_p2p_noa_ie(struct ath10k *ar, struct sk_buff *skb)
1410 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
1411 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
1412 struct ieee80211_vif *vif = info->control.vif;
1413 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1415 /* This is case only for P2P_GO */
1416 if (arvif->vdev_type != WMI_VDEV_TYPE_AP ||
1417 arvif->vdev_subtype != WMI_VDEV_SUBTYPE_P2P_GO)
1420 if (unlikely(ieee80211_is_probe_resp(hdr->frame_control))) {
1421 spin_lock_bh(&ar->data_lock);
1422 if (arvif->u.ap.noa_data)
1423 if (!pskb_expand_head(skb, 0, arvif->u.ap.noa_len,
1425 memcpy(skb_put(skb, arvif->u.ap.noa_len),
1426 arvif->u.ap.noa_data,
1427 arvif->u.ap.noa_len);
1428 spin_unlock_bh(&ar->data_lock);
1432 static void ath10k_tx_htt(struct ath10k *ar, struct sk_buff *skb)
1434 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
1437 if (ieee80211_is_mgmt(hdr->frame_control))
1438 ret = ath10k_htt_mgmt_tx(&ar->htt, skb);
1439 else if (ieee80211_is_nullfunc(hdr->frame_control))
1440 /* FW does not report tx status properly for NullFunc frames
1441 * unless they are sent through mgmt tx path. mac80211 sends
1442 * those frames when it detects link/beacon loss and depends on
1443 * the tx status to be correct. */
1444 ret = ath10k_htt_mgmt_tx(&ar->htt, skb);
1446 ret = ath10k_htt_tx(&ar->htt, skb);
1449 ath10k_warn("tx failed (%d). dropping packet.\n", ret);
1450 ieee80211_free_txskb(ar->hw, skb);
1454 void ath10k_offchan_tx_purge(struct ath10k *ar)
1456 struct sk_buff *skb;
1459 skb = skb_dequeue(&ar->offchan_tx_queue);
1463 ieee80211_free_txskb(ar->hw, skb);
1467 void ath10k_offchan_tx_work(struct work_struct *work)
1469 struct ath10k *ar = container_of(work, struct ath10k, offchan_tx_work);
1470 struct ath10k_peer *peer;
1471 struct ieee80211_hdr *hdr;
1472 struct sk_buff *skb;
1473 const u8 *peer_addr;
1477 /* FW requirement: We must create a peer before FW will send out
1478 * an offchannel frame. Otherwise the frame will be stuck and
1479 * never transmitted. We delete the peer upon tx completion.
1480 * It is unlikely that a peer for offchannel tx will already be
1481 * present. However it may be in some rare cases so account for that.
1482 * Otherwise we might remove a legitimate peer and break stuff. */
1485 skb = skb_dequeue(&ar->offchan_tx_queue);
1489 mutex_lock(&ar->conf_mutex);
1491 ath10k_dbg(ATH10K_DBG_MAC, "processing offchannel skb %p\n",
1494 hdr = (struct ieee80211_hdr *)skb->data;
1495 peer_addr = ieee80211_get_DA(hdr);
1496 vdev_id = ATH10K_SKB_CB(skb)->htt.vdev_id;
1498 spin_lock_bh(&ar->data_lock);
1499 peer = ath10k_peer_find(ar, vdev_id, peer_addr);
1500 spin_unlock_bh(&ar->data_lock);
1503 ath10k_dbg(ATH10K_DBG_MAC, "peer %pM on vdev %d already present\n",
1504 peer_addr, vdev_id);
1507 ret = ath10k_peer_create(ar, vdev_id, peer_addr);
1509 ath10k_warn("peer %pM on vdev %d not created (%d)\n",
1510 peer_addr, vdev_id, ret);
1513 spin_lock_bh(&ar->data_lock);
1514 INIT_COMPLETION(ar->offchan_tx_completed);
1515 ar->offchan_tx_skb = skb;
1516 spin_unlock_bh(&ar->data_lock);
1518 ath10k_tx_htt(ar, skb);
1520 ret = wait_for_completion_timeout(&ar->offchan_tx_completed,
1523 ath10k_warn("timed out waiting for offchannel skb %p\n",
1527 ret = ath10k_peer_delete(ar, vdev_id, peer_addr);
1529 ath10k_warn("peer %pM on vdev %d not deleted (%d)\n",
1530 peer_addr, vdev_id, ret);
1533 mutex_unlock(&ar->conf_mutex);
1542 * This gets called if we dont get a heart-beat during scan.
1543 * This may indicate the FW has hung and we need to abort the
1544 * scan manually to prevent cancel_hw_scan() from deadlocking
1546 void ath10k_reset_scan(unsigned long ptr)
1548 struct ath10k *ar = (struct ath10k *)ptr;
1550 spin_lock_bh(&ar->data_lock);
1551 if (!ar->scan.in_progress) {
1552 spin_unlock_bh(&ar->data_lock);
1556 ath10k_warn("scan timeout. resetting. fw issue?\n");
1558 if (ar->scan.is_roc)
1559 ieee80211_remain_on_channel_expired(ar->hw);
1561 ieee80211_scan_completed(ar->hw, 1 /* aborted */);
1563 ar->scan.in_progress = false;
1564 complete_all(&ar->scan.completed);
1565 spin_unlock_bh(&ar->data_lock);
1568 static int ath10k_abort_scan(struct ath10k *ar)
1570 struct wmi_stop_scan_arg arg = {
1571 .req_id = 1, /* FIXME */
1572 .req_type = WMI_SCAN_STOP_ONE,
1573 .u.scan_id = ATH10K_SCAN_ID,
1577 lockdep_assert_held(&ar->conf_mutex);
1579 del_timer_sync(&ar->scan.timeout);
1581 spin_lock_bh(&ar->data_lock);
1582 if (!ar->scan.in_progress) {
1583 spin_unlock_bh(&ar->data_lock);
1587 ar->scan.aborting = true;
1588 spin_unlock_bh(&ar->data_lock);
1590 ret = ath10k_wmi_stop_scan(ar, &arg);
1592 ath10k_warn("could not submit wmi stop scan (%d)\n", ret);
1596 ath10k_wmi_flush_tx(ar);
1598 ret = wait_for_completion_timeout(&ar->scan.completed, 3*HZ);
1600 ath10k_warn("timed out while waiting for scan to stop\n");
1602 /* scan completion may be done right after we timeout here, so let's
1603 * check the in_progress and tell mac80211 scan is completed. if we
1604 * don't do that and FW fails to send us scan completion indication
1605 * then userspace won't be able to scan anymore */
1608 spin_lock_bh(&ar->data_lock);
1609 if (ar->scan.in_progress) {
1610 ath10k_warn("could not stop scan. its still in progress\n");
1611 ar->scan.in_progress = false;
1612 ath10k_offchan_tx_purge(ar);
1615 spin_unlock_bh(&ar->data_lock);
1620 static int ath10k_start_scan(struct ath10k *ar,
1621 const struct wmi_start_scan_arg *arg)
1625 lockdep_assert_held(&ar->conf_mutex);
1627 ret = ath10k_wmi_start_scan(ar, arg);
1631 /* make sure we submit the command so the completion
1632 * timeout makes sense */
1633 ath10k_wmi_flush_tx(ar);
1635 ret = wait_for_completion_timeout(&ar->scan.started, 1*HZ);
1637 ath10k_abort_scan(ar);
1641 /* the scan can complete earlier, before we even
1642 * start the timer. in that case the timer handler
1643 * checks ar->scan.in_progress and bails out if its
1644 * false. Add a 200ms margin to account event/command
1646 mod_timer(&ar->scan.timeout, jiffies +
1647 msecs_to_jiffies(arg->max_scan_time+200));
1651 /**********************/
1652 /* mac80211 callbacks */
1653 /**********************/
1655 static void ath10k_tx(struct ieee80211_hw *hw,
1656 struct ieee80211_tx_control *control,
1657 struct sk_buff *skb)
1659 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
1660 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
1661 struct ath10k *ar = hw->priv;
1662 struct ath10k_vif *arvif = NULL;
1666 if (info->control.vif) {
1667 arvif = ath10k_vif_to_arvif(info->control.vif);
1668 vdev_id = arvif->vdev_id;
1669 } else if (ar->monitor_enabled) {
1670 vdev_id = ar->monitor_vdev_id;
1673 /* We should disable CCK RATE due to P2P */
1674 if (info->flags & IEEE80211_TX_CTL_NO_CCK_RATE)
1675 ath10k_dbg(ATH10K_DBG_MAC, "IEEE80211_TX_CTL_NO_CCK_RATE\n");
1677 /* we must calculate tid before we apply qos workaround
1678 * as we'd lose the qos control field */
1679 tid = HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
1680 if (ieee80211_is_data_qos(hdr->frame_control) &&
1681 is_unicast_ether_addr(ieee80211_get_DA(hdr))) {
1682 u8 *qc = ieee80211_get_qos_ctl(hdr);
1683 tid = qc[0] & IEEE80211_QOS_CTL_TID_MASK;
1686 ath10k_tx_h_qos_workaround(hw, control, skb);
1687 ath10k_tx_h_update_wep_key(skb);
1688 ath10k_tx_h_add_p2p_noa_ie(ar, skb);
1689 ath10k_tx_h_seq_no(skb);
1691 memset(ATH10K_SKB_CB(skb), 0, sizeof(*ATH10K_SKB_CB(skb)));
1692 ATH10K_SKB_CB(skb)->htt.vdev_id = vdev_id;
1693 ATH10K_SKB_CB(skb)->htt.tid = tid;
1695 if (info->flags & IEEE80211_TX_CTL_TX_OFFCHAN) {
1696 spin_lock_bh(&ar->data_lock);
1697 ATH10K_SKB_CB(skb)->htt.is_offchan = true;
1698 ATH10K_SKB_CB(skb)->htt.vdev_id = ar->scan.vdev_id;
1699 spin_unlock_bh(&ar->data_lock);
1701 ath10k_dbg(ATH10K_DBG_MAC, "queued offchannel skb %p\n", skb);
1703 skb_queue_tail(&ar->offchan_tx_queue, skb);
1704 ieee80211_queue_work(hw, &ar->offchan_tx_work);
1708 ath10k_tx_htt(ar, skb);
1712 * Initialize various parameters with default vaules.
1714 static int ath10k_start(struct ieee80211_hw *hw)
1716 struct ath10k *ar = hw->priv;
1719 mutex_lock(&ar->conf_mutex);
1721 ret = ath10k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_PMF_QOS, 1);
1723 ath10k_warn("could not enable WMI_PDEV_PARAM_PMF_QOS (%d)\n",
1726 ret = ath10k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_DYNAMIC_BW, 0);
1728 ath10k_warn("could not init WMI_PDEV_PARAM_DYNAMIC_BW (%d)\n",
1731 mutex_unlock(&ar->conf_mutex);
1735 static void ath10k_stop(struct ieee80211_hw *hw)
1737 struct ath10k *ar = hw->priv;
1739 mutex_lock(&ar->conf_mutex);
1740 ath10k_offchan_tx_purge(ar);
1741 mutex_unlock(&ar->conf_mutex);
1743 cancel_work_sync(&ar->offchan_tx_work);
1746 static int ath10k_config(struct ieee80211_hw *hw, u32 changed)
1748 struct ath10k_generic_iter ar_iter;
1749 struct ath10k *ar = hw->priv;
1750 struct ieee80211_conf *conf = &hw->conf;
1754 mutex_lock(&ar->conf_mutex);
1756 if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
1757 ath10k_dbg(ATH10K_DBG_MAC, "Config channel %d mhz\n",
1758 conf->chandef.chan->center_freq);
1759 spin_lock_bh(&ar->data_lock);
1760 ar->rx_channel = conf->chandef.chan;
1761 spin_unlock_bh(&ar->data_lock);
1764 if (changed & IEEE80211_CONF_CHANGE_PS) {
1765 memset(&ar_iter, 0, sizeof(struct ath10k_generic_iter));
1767 flags = IEEE80211_IFACE_ITER_RESUME_ALL;
1769 ieee80211_iterate_active_interfaces_atomic(hw,
1777 if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
1778 if (conf->flags & IEEE80211_CONF_MONITOR)
1779 ret = ath10k_monitor_create(ar);
1781 ret = ath10k_monitor_destroy(ar);
1784 mutex_unlock(&ar->conf_mutex);
1790 * Figure out how to handle WMI_VDEV_SUBTYPE_P2P_DEVICE,
1791 * because we will send mgmt frames without CCK. This requirement
1792 * for P2P_FIND/GO_NEG should be handled by checking CCK flag
1795 static int ath10k_add_interface(struct ieee80211_hw *hw,
1796 struct ieee80211_vif *vif)
1798 struct ath10k *ar = hw->priv;
1799 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1800 enum wmi_sta_powersave_param param;
1802 u32 value, rts, frag;
1805 mutex_lock(&ar->conf_mutex);
1810 if ((vif->type == NL80211_IFTYPE_MONITOR) && ar->monitor_present) {
1811 ath10k_warn("Only one monitor interface allowed\n");
1816 bit = ffs(ar->free_vdev_map);
1822 arvif->vdev_id = bit - 1;
1823 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE;
1824 ar->free_vdev_map &= ~(1 << arvif->vdev_id);
1827 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_DEVICE;
1829 switch (vif->type) {
1830 case NL80211_IFTYPE_UNSPECIFIED:
1831 case NL80211_IFTYPE_STATION:
1832 arvif->vdev_type = WMI_VDEV_TYPE_STA;
1834 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_CLIENT;
1836 case NL80211_IFTYPE_ADHOC:
1837 arvif->vdev_type = WMI_VDEV_TYPE_IBSS;
1839 case NL80211_IFTYPE_AP:
1840 arvif->vdev_type = WMI_VDEV_TYPE_AP;
1843 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_GO;
1845 case NL80211_IFTYPE_MONITOR:
1846 arvif->vdev_type = WMI_VDEV_TYPE_MONITOR;
1853 ath10k_dbg(ATH10K_DBG_MAC, "Add interface: id %d type %d subtype %d\n",
1854 arvif->vdev_id, arvif->vdev_type, arvif->vdev_subtype);
1856 ret = ath10k_wmi_vdev_create(ar, arvif->vdev_id, arvif->vdev_type,
1857 arvif->vdev_subtype, vif->addr);
1859 ath10k_warn("WMI vdev create failed: ret %d\n", ret);
1863 ret = ath10k_wmi_vdev_set_param(ar, 0, WMI_VDEV_PARAM_DEF_KEYID,
1864 arvif->def_wep_key_index);
1866 ath10k_warn("Failed to set default keyid: %d\n", ret);
1868 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
1869 WMI_VDEV_PARAM_TX_ENCAP_TYPE,
1870 ATH10K_HW_TXRX_NATIVE_WIFI);
1872 ath10k_warn("Failed to set TX encap: %d\n", ret);
1874 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
1875 ret = ath10k_peer_create(ar, arvif->vdev_id, vif->addr);
1877 ath10k_warn("Failed to create peer for AP: %d\n", ret);
1882 if (arvif->vdev_type == WMI_VDEV_TYPE_STA) {
1883 param = WMI_STA_PS_PARAM_RX_WAKE_POLICY;
1884 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
1885 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
1888 ath10k_warn("Failed to set RX wake policy: %d\n", ret);
1890 param = WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD;
1891 value = WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS;
1892 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
1895 ath10k_warn("Failed to set TX wake thresh: %d\n", ret);
1897 param = WMI_STA_PS_PARAM_PSPOLL_COUNT;
1898 value = WMI_STA_PS_PSPOLL_COUNT_NO_MAX;
1899 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
1902 ath10k_warn("Failed to set PSPOLL count: %d\n", ret);
1905 rts = min_t(u32, ar->hw->wiphy->rts_threshold, ATH10K_RTS_MAX);
1906 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
1907 WMI_VDEV_PARAM_RTS_THRESHOLD,
1910 ath10k_warn("failed to set rts threshold for vdev %d (%d)\n",
1911 arvif->vdev_id, ret);
1913 frag = clamp_t(u32, ar->hw->wiphy->frag_threshold,
1914 ATH10K_FRAGMT_THRESHOLD_MIN,
1915 ATH10K_FRAGMT_THRESHOLD_MAX);
1916 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
1917 WMI_VDEV_PARAM_FRAGMENTATION_THRESHOLD,
1920 ath10k_warn("failed to set frag threshold for vdev %d (%d)\n",
1921 arvif->vdev_id, ret);
1923 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
1924 ar->monitor_present = true;
1927 mutex_unlock(&ar->conf_mutex);
1931 static void ath10k_remove_interface(struct ieee80211_hw *hw,
1932 struct ieee80211_vif *vif)
1934 struct ath10k *ar = hw->priv;
1935 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1938 mutex_lock(&ar->conf_mutex);
1940 ath10k_dbg(ATH10K_DBG_MAC, "Remove interface: id %d\n", arvif->vdev_id);
1942 ar->free_vdev_map |= 1 << (arvif->vdev_id);
1944 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
1945 ret = ath10k_peer_delete(arvif->ar, arvif->vdev_id, vif->addr);
1947 ath10k_warn("Failed to remove peer for AP: %d\n", ret);
1949 kfree(arvif->u.ap.noa_data);
1952 ret = ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
1954 ath10k_warn("WMI vdev delete failed: %d\n", ret);
1956 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
1957 ar->monitor_present = false;
1959 ath10k_peer_cleanup(ar, arvif->vdev_id);
1961 mutex_unlock(&ar->conf_mutex);
1965 * FIXME: Has to be verified.
1967 #define SUPPORTED_FILTERS \
1968 (FIF_PROMISC_IN_BSS | \
1973 FIF_BCN_PRBRESP_PROMISC | \
1977 static void ath10k_configure_filter(struct ieee80211_hw *hw,
1978 unsigned int changed_flags,
1979 unsigned int *total_flags,
1982 struct ath10k *ar = hw->priv;
1985 mutex_lock(&ar->conf_mutex);
1987 changed_flags &= SUPPORTED_FILTERS;
1988 *total_flags &= SUPPORTED_FILTERS;
1989 ar->filter_flags = *total_flags;
1991 if ((ar->filter_flags & FIF_PROMISC_IN_BSS) &&
1992 !ar->monitor_enabled) {
1993 ret = ath10k_monitor_start(ar, ar->monitor_vdev_id);
1995 ath10k_warn("Unable to start monitor mode\n");
1997 ath10k_dbg(ATH10K_DBG_MAC, "Monitor mode started\n");
1998 } else if (!(ar->filter_flags & FIF_PROMISC_IN_BSS) &&
1999 ar->monitor_enabled) {
2000 ret = ath10k_monitor_stop(ar);
2002 ath10k_warn("Unable to stop monitor mode\n");
2004 ath10k_dbg(ATH10K_DBG_MAC, "Monitor mode stopped\n");
2007 mutex_unlock(&ar->conf_mutex);
2010 static void ath10k_bss_info_changed(struct ieee80211_hw *hw,
2011 struct ieee80211_vif *vif,
2012 struct ieee80211_bss_conf *info,
2015 struct ath10k *ar = hw->priv;
2016 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2019 mutex_lock(&ar->conf_mutex);
2021 if (changed & BSS_CHANGED_IBSS)
2022 ath10k_control_ibss(arvif, info, vif->addr);
2024 if (changed & BSS_CHANGED_BEACON_INT) {
2025 arvif->beacon_interval = info->beacon_int;
2026 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
2027 WMI_VDEV_PARAM_BEACON_INTERVAL,
2028 arvif->beacon_interval);
2030 ath10k_warn("Failed to set beacon interval for VDEV: %d\n",
2033 ath10k_dbg(ATH10K_DBG_MAC,
2034 "Beacon interval: %d set for VDEV: %d\n",
2035 arvif->beacon_interval, arvif->vdev_id);
2038 if (changed & BSS_CHANGED_BEACON) {
2039 ret = ath10k_wmi_pdev_set_param(ar,
2040 WMI_PDEV_PARAM_BEACON_TX_MODE,
2041 WMI_BEACON_STAGGERED_MODE);
2043 ath10k_warn("Failed to set beacon mode for VDEV: %d\n",
2046 ath10k_dbg(ATH10K_DBG_MAC,
2047 "Set staggered beacon mode for VDEV: %d\n",
2051 if (changed & BSS_CHANGED_BEACON_INFO) {
2052 arvif->dtim_period = info->dtim_period;
2054 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
2055 WMI_VDEV_PARAM_DTIM_PERIOD,
2056 arvif->dtim_period);
2058 ath10k_warn("Failed to set dtim period for VDEV: %d\n",
2061 ath10k_dbg(ATH10K_DBG_MAC,
2062 "Set dtim period: %d for VDEV: %d\n",
2063 arvif->dtim_period, arvif->vdev_id);
2066 if (changed & BSS_CHANGED_SSID &&
2067 vif->type == NL80211_IFTYPE_AP) {
2068 arvif->u.ap.ssid_len = info->ssid_len;
2070 memcpy(arvif->u.ap.ssid, info->ssid, info->ssid_len);
2071 arvif->u.ap.hidden_ssid = info->hidden_ssid;
2074 if (changed & BSS_CHANGED_BSSID) {
2075 if (!is_zero_ether_addr(info->bssid)) {
2076 ret = ath10k_peer_create(ar, arvif->vdev_id,
2079 ath10k_warn("Failed to add peer: %pM for VDEV: %d\n",
2080 info->bssid, arvif->vdev_id);
2082 ath10k_dbg(ATH10K_DBG_MAC,
2083 "Added peer: %pM for VDEV: %d\n",
2084 info->bssid, arvif->vdev_id);
2087 if (vif->type == NL80211_IFTYPE_STATION) {
2089 * this is never erased as we it for crypto key
2090 * clearing; this is FW requirement
2092 memcpy(arvif->u.sta.bssid, info->bssid,
2095 ret = ath10k_vdev_start(arvif);
2097 ath10k_dbg(ATH10K_DBG_MAC,
2098 "VDEV: %d started with BSSID: %pM\n",
2099 arvif->vdev_id, info->bssid);
2103 * Mac80211 does not keep IBSS bssid when leaving IBSS,
2104 * so driver need to store it. It is needed when leaving
2105 * IBSS in order to remove BSSID peer.
2107 if (vif->type == NL80211_IFTYPE_ADHOC)
2108 memcpy(arvif->u.ibss.bssid, info->bssid,
2113 if (changed & BSS_CHANGED_BEACON_ENABLED)
2114 ath10k_control_beaconing(arvif, info);
2116 if (changed & BSS_CHANGED_ERP_CTS_PROT) {
2118 if (info->use_cts_prot)
2123 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
2124 WMI_VDEV_PARAM_ENABLE_RTSCTS,
2127 ath10k_warn("Failed to set CTS prot for VDEV: %d\n",
2130 ath10k_dbg(ATH10K_DBG_MAC,
2131 "Set CTS prot: %d for VDEV: %d\n",
2132 cts_prot, arvif->vdev_id);
2135 if (changed & BSS_CHANGED_ERP_SLOT) {
2137 if (info->use_short_slot)
2138 slottime = WMI_VDEV_SLOT_TIME_SHORT; /* 9us */
2141 slottime = WMI_VDEV_SLOT_TIME_LONG; /* 20us */
2143 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
2144 WMI_VDEV_PARAM_SLOT_TIME,
2147 ath10k_warn("Failed to set erp slot for VDEV: %d\n",
2150 ath10k_dbg(ATH10K_DBG_MAC,
2151 "Set slottime: %d for VDEV: %d\n",
2152 slottime, arvif->vdev_id);
2155 if (changed & BSS_CHANGED_ERP_PREAMBLE) {
2157 if (info->use_short_preamble)
2158 preamble = WMI_VDEV_PREAMBLE_SHORT;
2160 preamble = WMI_VDEV_PREAMBLE_LONG;
2162 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
2163 WMI_VDEV_PARAM_PREAMBLE,
2166 ath10k_warn("Failed to set preamble for VDEV: %d\n",
2169 ath10k_dbg(ATH10K_DBG_MAC,
2170 "Set preamble: %d for VDEV: %d\n",
2171 preamble, arvif->vdev_id);
2174 if (changed & BSS_CHANGED_ASSOC) {
2176 ath10k_bss_assoc(hw, vif, info);
2179 mutex_unlock(&ar->conf_mutex);
2182 static int ath10k_hw_scan(struct ieee80211_hw *hw,
2183 struct ieee80211_vif *vif,
2184 struct cfg80211_scan_request *req)
2186 struct ath10k *ar = hw->priv;
2187 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2188 struct wmi_start_scan_arg arg;
2192 mutex_lock(&ar->conf_mutex);
2194 spin_lock_bh(&ar->data_lock);
2195 if (ar->scan.in_progress) {
2196 spin_unlock_bh(&ar->data_lock);
2201 INIT_COMPLETION(ar->scan.started);
2202 INIT_COMPLETION(ar->scan.completed);
2203 ar->scan.in_progress = true;
2204 ar->scan.aborting = false;
2205 ar->scan.is_roc = false;
2206 ar->scan.vdev_id = arvif->vdev_id;
2207 spin_unlock_bh(&ar->data_lock);
2209 memset(&arg, 0, sizeof(arg));
2210 ath10k_wmi_start_scan_init(ar, &arg);
2211 arg.vdev_id = arvif->vdev_id;
2212 arg.scan_id = ATH10K_SCAN_ID;
2215 arg.scan_ctrl_flags |= WMI_SCAN_ADD_CCK_RATES;
2218 arg.ie_len = req->ie_len;
2219 memcpy(arg.ie, req->ie, arg.ie_len);
2223 arg.n_ssids = req->n_ssids;
2224 for (i = 0; i < arg.n_ssids; i++) {
2225 arg.ssids[i].len = req->ssids[i].ssid_len;
2226 arg.ssids[i].ssid = req->ssids[i].ssid;
2230 if (req->n_channels) {
2231 arg.n_channels = req->n_channels;
2232 for (i = 0; i < arg.n_channels; i++)
2233 arg.channels[i] = req->channels[i]->center_freq;
2236 ret = ath10k_start_scan(ar, &arg);
2238 ath10k_warn("could not start hw scan (%d)\n", ret);
2239 spin_lock_bh(&ar->data_lock);
2240 ar->scan.in_progress = false;
2241 spin_unlock_bh(&ar->data_lock);
2245 mutex_unlock(&ar->conf_mutex);
2249 static void ath10k_cancel_hw_scan(struct ieee80211_hw *hw,
2250 struct ieee80211_vif *vif)
2252 struct ath10k *ar = hw->priv;
2255 mutex_lock(&ar->conf_mutex);
2256 ret = ath10k_abort_scan(ar);
2258 ath10k_warn("couldn't abort scan (%d). forcefully sending scan completion to mac80211\n",
2260 ieee80211_scan_completed(hw, 1 /* aborted */);
2262 mutex_unlock(&ar->conf_mutex);
2265 static int ath10k_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
2266 struct ieee80211_vif *vif, struct ieee80211_sta *sta,
2267 struct ieee80211_key_conf *key)
2269 struct ath10k *ar = hw->priv;
2270 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2271 struct ath10k_peer *peer;
2272 const u8 *peer_addr;
2273 bool is_wep = key->cipher == WLAN_CIPHER_SUITE_WEP40 ||
2274 key->cipher == WLAN_CIPHER_SUITE_WEP104;
2277 if (key->keyidx > WMI_MAX_KEY_INDEX)
2280 mutex_lock(&ar->conf_mutex);
2283 peer_addr = sta->addr;
2284 else if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
2285 peer_addr = vif->bss_conf.bssid;
2287 peer_addr = vif->addr;
2289 key->hw_key_idx = key->keyidx;
2291 /* the peer should not disappear in mid-way (unless FW goes awry) since
2292 * we already hold conf_mutex. we just make sure its there now. */
2293 spin_lock_bh(&ar->data_lock);
2294 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
2295 spin_unlock_bh(&ar->data_lock);
2298 if (cmd == SET_KEY) {
2299 ath10k_warn("cannot install key for non-existent peer %pM\n",
2304 /* if the peer doesn't exist there is no key to disable
2312 arvif->wep_keys[key->keyidx] = key;
2314 arvif->wep_keys[key->keyidx] = NULL;
2316 if (cmd == DISABLE_KEY)
2317 ath10k_clear_vdev_key(arvif, key);
2320 ret = ath10k_install_key(arvif, key, cmd, peer_addr);
2322 ath10k_warn("ath10k_install_key failed (%d)\n", ret);
2326 spin_lock_bh(&ar->data_lock);
2327 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
2328 if (peer && cmd == SET_KEY)
2329 peer->keys[key->keyidx] = key;
2330 else if (peer && cmd == DISABLE_KEY)
2331 peer->keys[key->keyidx] = NULL;
2332 else if (peer == NULL)
2333 /* impossible unless FW goes crazy */
2334 ath10k_warn("peer %pM disappeared!\n", peer_addr);
2335 spin_unlock_bh(&ar->data_lock);
2338 mutex_unlock(&ar->conf_mutex);
2342 static int ath10k_sta_state(struct ieee80211_hw *hw,
2343 struct ieee80211_vif *vif,
2344 struct ieee80211_sta *sta,
2345 enum ieee80211_sta_state old_state,
2346 enum ieee80211_sta_state new_state)
2348 struct ath10k *ar = hw->priv;
2349 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2352 mutex_lock(&ar->conf_mutex);
2354 if (old_state == IEEE80211_STA_NOTEXIST &&
2355 new_state == IEEE80211_STA_NONE &&
2356 vif->type != NL80211_IFTYPE_STATION) {
2358 * New station addition.
2360 ret = ath10k_peer_create(ar, arvif->vdev_id, sta->addr);
2362 ath10k_warn("Failed to add peer: %pM for VDEV: %d\n",
2363 sta->addr, arvif->vdev_id);
2365 ath10k_dbg(ATH10K_DBG_MAC,
2366 "Added peer: %pM for VDEV: %d\n",
2367 sta->addr, arvif->vdev_id);
2368 } else if ((old_state == IEEE80211_STA_NONE &&
2369 new_state == IEEE80211_STA_NOTEXIST)) {
2371 * Existing station deletion.
2373 ret = ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
2375 ath10k_warn("Failed to delete peer: %pM for VDEV: %d\n",
2376 sta->addr, arvif->vdev_id);
2378 ath10k_dbg(ATH10K_DBG_MAC,
2379 "Removed peer: %pM for VDEV: %d\n",
2380 sta->addr, arvif->vdev_id);
2382 if (vif->type == NL80211_IFTYPE_STATION)
2383 ath10k_bss_disassoc(hw, vif);
2384 } else if (old_state == IEEE80211_STA_AUTH &&
2385 new_state == IEEE80211_STA_ASSOC &&
2386 (vif->type == NL80211_IFTYPE_AP ||
2387 vif->type == NL80211_IFTYPE_ADHOC)) {
2391 ret = ath10k_station_assoc(ar, arvif, sta);
2393 ath10k_warn("Failed to associate station: %pM\n",
2396 ath10k_dbg(ATH10K_DBG_MAC,
2397 "Station %pM moved to assoc state\n",
2399 } else if (old_state == IEEE80211_STA_ASSOC &&
2400 new_state == IEEE80211_STA_AUTH &&
2401 (vif->type == NL80211_IFTYPE_AP ||
2402 vif->type == NL80211_IFTYPE_ADHOC)) {
2406 ret = ath10k_station_disassoc(ar, arvif, sta);
2408 ath10k_warn("Failed to disassociate station: %pM\n",
2411 ath10k_dbg(ATH10K_DBG_MAC,
2412 "Station %pM moved to disassociated state\n",
2416 mutex_unlock(&ar->conf_mutex);
2420 static int ath10k_conf_tx_uapsd(struct ath10k *ar, struct ieee80211_vif *vif,
2421 u16 ac, bool enable)
2423 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2427 lockdep_assert_held(&ar->conf_mutex);
2429 if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
2433 case IEEE80211_AC_VO:
2434 value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN |
2435 WMI_STA_PS_UAPSD_AC3_TRIGGER_EN;
2437 case IEEE80211_AC_VI:
2438 value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN |
2439 WMI_STA_PS_UAPSD_AC2_TRIGGER_EN;
2441 case IEEE80211_AC_BE:
2442 value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN |
2443 WMI_STA_PS_UAPSD_AC1_TRIGGER_EN;
2445 case IEEE80211_AC_BK:
2446 value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN |
2447 WMI_STA_PS_UAPSD_AC0_TRIGGER_EN;
2452 arvif->u.sta.uapsd |= value;
2454 arvif->u.sta.uapsd &= ~value;
2456 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
2457 WMI_STA_PS_PARAM_UAPSD,
2458 arvif->u.sta.uapsd);
2460 ath10k_warn("could not set uapsd params %d\n", ret);
2464 if (arvif->u.sta.uapsd)
2465 value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD;
2467 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
2469 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
2470 WMI_STA_PS_PARAM_RX_WAKE_POLICY,
2473 ath10k_warn("could not set rx wake param %d\n", ret);
2479 static int ath10k_conf_tx(struct ieee80211_hw *hw,
2480 struct ieee80211_vif *vif, u16 ac,
2481 const struct ieee80211_tx_queue_params *params)
2483 struct ath10k *ar = hw->priv;
2484 struct wmi_wmm_params_arg *p = NULL;
2487 mutex_lock(&ar->conf_mutex);
2490 case IEEE80211_AC_VO:
2491 p = &ar->wmm_params.ac_vo;
2493 case IEEE80211_AC_VI:
2494 p = &ar->wmm_params.ac_vi;
2496 case IEEE80211_AC_BE:
2497 p = &ar->wmm_params.ac_be;
2499 case IEEE80211_AC_BK:
2500 p = &ar->wmm_params.ac_bk;
2509 p->cwmin = params->cw_min;
2510 p->cwmax = params->cw_max;
2511 p->aifs = params->aifs;
2514 * The channel time duration programmed in the HW is in absolute
2515 * microseconds, while mac80211 gives the txop in units of
2518 p->txop = params->txop * 32;
2520 /* FIXME: FW accepts wmm params per hw, not per vif */
2521 ret = ath10k_wmi_pdev_set_wmm_params(ar, &ar->wmm_params);
2523 ath10k_warn("could not set wmm params %d\n", ret);
2527 ret = ath10k_conf_tx_uapsd(ar, vif, ac, params->uapsd);
2529 ath10k_warn("could not set sta uapsd %d\n", ret);
2532 mutex_unlock(&ar->conf_mutex);
2536 #define ATH10K_ROC_TIMEOUT_HZ (2*HZ)
2538 static int ath10k_remain_on_channel(struct ieee80211_hw *hw,
2539 struct ieee80211_vif *vif,
2540 struct ieee80211_channel *chan,
2542 enum ieee80211_roc_type type)
2544 struct ath10k *ar = hw->priv;
2545 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2546 struct wmi_start_scan_arg arg;
2549 mutex_lock(&ar->conf_mutex);
2551 spin_lock_bh(&ar->data_lock);
2552 if (ar->scan.in_progress) {
2553 spin_unlock_bh(&ar->data_lock);
2558 INIT_COMPLETION(ar->scan.started);
2559 INIT_COMPLETION(ar->scan.completed);
2560 INIT_COMPLETION(ar->scan.on_channel);
2561 ar->scan.in_progress = true;
2562 ar->scan.aborting = false;
2563 ar->scan.is_roc = true;
2564 ar->scan.vdev_id = arvif->vdev_id;
2565 ar->scan.roc_freq = chan->center_freq;
2566 spin_unlock_bh(&ar->data_lock);
2568 memset(&arg, 0, sizeof(arg));
2569 ath10k_wmi_start_scan_init(ar, &arg);
2570 arg.vdev_id = arvif->vdev_id;
2571 arg.scan_id = ATH10K_SCAN_ID;
2573 arg.channels[0] = chan->center_freq;
2574 arg.dwell_time_active = duration;
2575 arg.dwell_time_passive = duration;
2576 arg.max_scan_time = 2 * duration;
2577 arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
2578 arg.scan_ctrl_flags |= WMI_SCAN_FILTER_PROBE_REQ;
2580 ret = ath10k_start_scan(ar, &arg);
2582 ath10k_warn("could not start roc scan (%d)\n", ret);
2583 spin_lock_bh(&ar->data_lock);
2584 ar->scan.in_progress = false;
2585 spin_unlock_bh(&ar->data_lock);
2589 ret = wait_for_completion_timeout(&ar->scan.on_channel, 3*HZ);
2591 ath10k_warn("could not switch to channel for roc scan\n");
2592 ath10k_abort_scan(ar);
2599 mutex_unlock(&ar->conf_mutex);
2603 static int ath10k_cancel_remain_on_channel(struct ieee80211_hw *hw)
2605 struct ath10k *ar = hw->priv;
2607 mutex_lock(&ar->conf_mutex);
2608 ath10k_abort_scan(ar);
2609 mutex_unlock(&ar->conf_mutex);
2615 * Both RTS and Fragmentation threshold are interface-specific
2616 * in ath10k, but device-specific in mac80211.
2618 static void ath10k_set_rts_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
2620 struct ath10k_generic_iter *ar_iter = data;
2621 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2622 u32 rts = ar_iter->ar->hw->wiphy->rts_threshold;
2624 lockdep_assert_held(&arvif->ar->conf_mutex);
2626 rts = min_t(u32, rts, ATH10K_RTS_MAX);
2628 ar_iter->ret = ath10k_wmi_vdev_set_param(ar_iter->ar, arvif->vdev_id,
2629 WMI_VDEV_PARAM_RTS_THRESHOLD,
2632 ath10k_warn("Failed to set RTS threshold for VDEV: %d\n",
2635 ath10k_dbg(ATH10K_DBG_MAC,
2636 "Set RTS threshold: %d for VDEV: %d\n",
2637 rts, arvif->vdev_id);
2640 static int ath10k_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
2642 struct ath10k_generic_iter ar_iter;
2643 struct ath10k *ar = hw->priv;
2645 memset(&ar_iter, 0, sizeof(struct ath10k_generic_iter));
2648 mutex_lock(&ar->conf_mutex);
2649 ieee80211_iterate_active_interfaces_atomic(
2650 hw, IEEE80211_IFACE_ITER_NORMAL,
2651 ath10k_set_rts_iter, &ar_iter);
2652 mutex_unlock(&ar->conf_mutex);
2657 static void ath10k_set_frag_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
2659 struct ath10k_generic_iter *ar_iter = data;
2660 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2661 u32 frag = ar_iter->ar->hw->wiphy->frag_threshold;
2664 lockdep_assert_held(&arvif->ar->conf_mutex);
2666 frag = clamp_t(u32, frag,
2667 ATH10K_FRAGMT_THRESHOLD_MIN,
2668 ATH10K_FRAGMT_THRESHOLD_MAX);
2670 ret = ath10k_wmi_vdev_set_param(ar_iter->ar, arvif->vdev_id,
2671 WMI_VDEV_PARAM_FRAGMENTATION_THRESHOLD,
2676 ath10k_warn("Failed to set frag threshold for VDEV: %d\n",
2679 ath10k_dbg(ATH10K_DBG_MAC,
2680 "Set frag threshold: %d for VDEV: %d\n",
2681 frag, arvif->vdev_id);
2684 static int ath10k_set_frag_threshold(struct ieee80211_hw *hw, u32 value)
2686 struct ath10k_generic_iter ar_iter;
2687 struct ath10k *ar = hw->priv;
2689 memset(&ar_iter, 0, sizeof(struct ath10k_generic_iter));
2692 mutex_lock(&ar->conf_mutex);
2693 ieee80211_iterate_active_interfaces_atomic(
2694 hw, IEEE80211_IFACE_ITER_NORMAL,
2695 ath10k_set_frag_iter, &ar_iter);
2696 mutex_unlock(&ar->conf_mutex);
2701 static void ath10k_flush(struct ieee80211_hw *hw, u32 queues, bool drop)
2703 struct ath10k *ar = hw->priv;
2706 /* mac80211 doesn't care if we really xmit queued frames or not
2707 * we'll collect those frames either way if we stop/delete vdevs */
2711 mutex_lock(&ar->conf_mutex);
2713 ret = wait_event_timeout(ar->htt.empty_tx_wq, ({
2715 spin_lock_bh(&ar->htt.tx_lock);
2716 empty = bitmap_empty(ar->htt.used_msdu_ids,
2717 ar->htt.max_num_pending_tx);
2718 spin_unlock_bh(&ar->htt.tx_lock);
2720 }), ATH10K_FLUSH_TIMEOUT_HZ);
2722 ath10k_warn("tx not flushed\n");
2724 mutex_unlock(&ar->conf_mutex);
2727 /* TODO: Implement this function properly
2728 * For now it is needed to reply to Probe Requests in IBSS mode.
2729 * Propably we need this information from FW.
2731 static int ath10k_tx_last_beacon(struct ieee80211_hw *hw)
2736 static const struct ieee80211_ops ath10k_ops = {
2738 .start = ath10k_start,
2739 .stop = ath10k_stop,
2740 .config = ath10k_config,
2741 .add_interface = ath10k_add_interface,
2742 .remove_interface = ath10k_remove_interface,
2743 .configure_filter = ath10k_configure_filter,
2744 .bss_info_changed = ath10k_bss_info_changed,
2745 .hw_scan = ath10k_hw_scan,
2746 .cancel_hw_scan = ath10k_cancel_hw_scan,
2747 .set_key = ath10k_set_key,
2748 .sta_state = ath10k_sta_state,
2749 .conf_tx = ath10k_conf_tx,
2750 .remain_on_channel = ath10k_remain_on_channel,
2751 .cancel_remain_on_channel = ath10k_cancel_remain_on_channel,
2752 .set_rts_threshold = ath10k_set_rts_threshold,
2753 .set_frag_threshold = ath10k_set_frag_threshold,
2754 .flush = ath10k_flush,
2755 .tx_last_beacon = ath10k_tx_last_beacon,
2758 #define RATETAB_ENT(_rate, _rateid, _flags) { \
2759 .bitrate = (_rate), \
2760 .flags = (_flags), \
2761 .hw_value = (_rateid), \
2764 #define CHAN2G(_channel, _freq, _flags) { \
2765 .band = IEEE80211_BAND_2GHZ, \
2766 .hw_value = (_channel), \
2767 .center_freq = (_freq), \
2768 .flags = (_flags), \
2769 .max_antenna_gain = 0, \
2773 #define CHAN5G(_channel, _freq, _flags) { \
2774 .band = IEEE80211_BAND_5GHZ, \
2775 .hw_value = (_channel), \
2776 .center_freq = (_freq), \
2777 .flags = (_flags), \
2778 .max_antenna_gain = 0, \
2782 static const struct ieee80211_channel ath10k_2ghz_channels[] = {
2792 CHAN2G(10, 2457, 0),
2793 CHAN2G(11, 2462, 0),
2794 CHAN2G(12, 2467, 0),
2795 CHAN2G(13, 2472, 0),
2796 CHAN2G(14, 2484, 0),
2799 static const struct ieee80211_channel ath10k_5ghz_channels[] = {
2800 CHAN5G(36, 5180, 0),
2801 CHAN5G(40, 5200, 0),
2802 CHAN5G(44, 5220, 0),
2803 CHAN5G(48, 5240, 0),
2804 CHAN5G(52, 5260, 0),
2805 CHAN5G(56, 5280, 0),
2806 CHAN5G(60, 5300, 0),
2807 CHAN5G(64, 5320, 0),
2808 CHAN5G(100, 5500, 0),
2809 CHAN5G(104, 5520, 0),
2810 CHAN5G(108, 5540, 0),
2811 CHAN5G(112, 5560, 0),
2812 CHAN5G(116, 5580, 0),
2813 CHAN5G(120, 5600, 0),
2814 CHAN5G(124, 5620, 0),
2815 CHAN5G(128, 5640, 0),
2816 CHAN5G(132, 5660, 0),
2817 CHAN5G(136, 5680, 0),
2818 CHAN5G(140, 5700, 0),
2819 CHAN5G(149, 5745, 0),
2820 CHAN5G(153, 5765, 0),
2821 CHAN5G(157, 5785, 0),
2822 CHAN5G(161, 5805, 0),
2823 CHAN5G(165, 5825, 0),
2826 static struct ieee80211_rate ath10k_rates[] = {
2828 RATETAB_ENT(10, 0x82, 0),
2829 RATETAB_ENT(20, 0x84, 0),
2830 RATETAB_ENT(55, 0x8b, 0),
2831 RATETAB_ENT(110, 0x96, 0),
2833 RATETAB_ENT(60, 0x0c, 0),
2834 RATETAB_ENT(90, 0x12, 0),
2835 RATETAB_ENT(120, 0x18, 0),
2836 RATETAB_ENT(180, 0x24, 0),
2837 RATETAB_ENT(240, 0x30, 0),
2838 RATETAB_ENT(360, 0x48, 0),
2839 RATETAB_ENT(480, 0x60, 0),
2840 RATETAB_ENT(540, 0x6c, 0),
2843 #define ath10k_a_rates (ath10k_rates + 4)
2844 #define ath10k_a_rates_size (ARRAY_SIZE(ath10k_rates) - 4)
2845 #define ath10k_g_rates (ath10k_rates + 0)
2846 #define ath10k_g_rates_size (ARRAY_SIZE(ath10k_rates))
2848 struct ath10k *ath10k_mac_create(void)
2850 struct ieee80211_hw *hw;
2853 hw = ieee80211_alloc_hw(sizeof(struct ath10k), &ath10k_ops);
2863 void ath10k_mac_destroy(struct ath10k *ar)
2865 ieee80211_free_hw(ar->hw);
2868 static const struct ieee80211_iface_limit ath10k_if_limits[] = {
2871 .types = BIT(NL80211_IFTYPE_STATION)
2872 | BIT(NL80211_IFTYPE_P2P_CLIENT)
2873 | BIT(NL80211_IFTYPE_P2P_GO)
2874 | BIT(NL80211_IFTYPE_AP)
2878 static const struct ieee80211_iface_combination ath10k_if_comb = {
2879 .limits = ath10k_if_limits,
2880 .n_limits = ARRAY_SIZE(ath10k_if_limits),
2881 .max_interfaces = 8,
2882 .num_different_channels = 1,
2883 .beacon_int_infra_match = true,
2886 static struct ieee80211_sta_vht_cap ath10k_create_vht_cap(struct ath10k *ar)
2888 struct ieee80211_sta_vht_cap vht_cap = {0};
2891 vht_cap.vht_supported = 1;
2892 vht_cap.cap = ar->vht_cap_info;
2894 /* FIXME: check dynamically how many streams board supports */
2895 mcs_map = IEEE80211_VHT_MCS_SUPPORT_0_9 << 0 |
2896 IEEE80211_VHT_MCS_SUPPORT_0_9 << 2 |
2897 IEEE80211_VHT_MCS_SUPPORT_0_9 << 4 |
2898 IEEE80211_VHT_MCS_NOT_SUPPORTED << 6 |
2899 IEEE80211_VHT_MCS_NOT_SUPPORTED << 8 |
2900 IEEE80211_VHT_MCS_NOT_SUPPORTED << 10 |
2901 IEEE80211_VHT_MCS_NOT_SUPPORTED << 12 |
2902 IEEE80211_VHT_MCS_NOT_SUPPORTED << 14;
2904 vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(mcs_map);
2905 vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(mcs_map);
2910 static struct ieee80211_sta_ht_cap ath10k_get_ht_cap(struct ath10k *ar)
2913 struct ieee80211_sta_ht_cap ht_cap = {0};
2915 if (!(ar->ht_cap_info & WMI_HT_CAP_ENABLED))
2918 ht_cap.ht_supported = 1;
2919 ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
2920 ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_8;
2921 ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
2922 ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
2923 ht_cap.cap |= WLAN_HT_CAP_SM_PS_STATIC << IEEE80211_HT_CAP_SM_PS_SHIFT;
2925 if (ar->ht_cap_info & WMI_HT_CAP_HT20_SGI)
2926 ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
2928 if (ar->ht_cap_info & WMI_HT_CAP_HT40_SGI)
2929 ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
2931 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) {
2934 smps = WLAN_HT_CAP_SM_PS_DYNAMIC;
2935 smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT;
2940 if (ar->ht_cap_info & WMI_HT_CAP_TX_STBC)
2941 ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC;
2943 if (ar->ht_cap_info & WMI_HT_CAP_RX_STBC) {
2946 stbc = ar->ht_cap_info;
2947 stbc &= WMI_HT_CAP_RX_STBC;
2948 stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT;
2949 stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT;
2950 stbc &= IEEE80211_HT_CAP_RX_STBC;
2955 if (ar->ht_cap_info & WMI_HT_CAP_LDPC)
2956 ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
2958 if (ar->ht_cap_info & WMI_HT_CAP_L_SIG_TXOP_PROT)
2959 ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
2961 /* max AMSDU is implicitly taken from vht_cap_info */
2962 if (ar->vht_cap_info & WMI_VHT_CAP_MAX_MPDU_LEN_MASK)
2963 ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU;
2965 for (i = 0; i < WMI_MAX_SPATIAL_STREAM; i++)
2966 ht_cap.mcs.rx_mask[i] = 0xFF;
2968 ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
2974 static void ath10k_get_arvif_iter(void *data, u8 *mac,
2975 struct ieee80211_vif *vif)
2977 struct ath10k_vif_iter *arvif_iter = data;
2978 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2980 if (arvif->vdev_id == arvif_iter->vdev_id)
2981 arvif_iter->arvif = arvif;
2984 struct ath10k_vif *ath10k_get_arvif(struct ath10k *ar, u32 vdev_id)
2986 struct ath10k_vif_iter arvif_iter;
2989 memset(&arvif_iter, 0, sizeof(struct ath10k_vif_iter));
2990 arvif_iter.vdev_id = vdev_id;
2992 flags = IEEE80211_IFACE_ITER_RESUME_ALL;
2993 ieee80211_iterate_active_interfaces_atomic(ar->hw,
2995 ath10k_get_arvif_iter,
2997 if (!arvif_iter.arvif) {
2998 ath10k_warn("No VIF found for VDEV: %d\n", vdev_id);
3002 return arvif_iter.arvif;
3005 int ath10k_mac_register(struct ath10k *ar)
3007 struct ieee80211_supported_band *band;
3008 struct ieee80211_sta_vht_cap vht_cap;
3009 struct ieee80211_sta_ht_cap ht_cap;
3013 SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr);
3015 SET_IEEE80211_DEV(ar->hw, ar->dev);
3017 ht_cap = ath10k_get_ht_cap(ar);
3018 vht_cap = ath10k_create_vht_cap(ar);
3020 if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) {
3021 channels = kmemdup(ath10k_2ghz_channels,
3022 sizeof(ath10k_2ghz_channels),
3027 band = &ar->mac.sbands[IEEE80211_BAND_2GHZ];
3028 band->n_channels = ARRAY_SIZE(ath10k_2ghz_channels);
3029 band->channels = channels;
3030 band->n_bitrates = ath10k_g_rates_size;
3031 band->bitrates = ath10k_g_rates;
3032 band->ht_cap = ht_cap;
3034 /* vht is not supported in 2.4 GHz */
3036 ar->hw->wiphy->bands[IEEE80211_BAND_2GHZ] = band;
3039 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) {
3040 channels = kmemdup(ath10k_5ghz_channels,
3041 sizeof(ath10k_5ghz_channels),
3044 if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) {
3045 band = &ar->mac.sbands[IEEE80211_BAND_2GHZ];
3046 kfree(band->channels);
3051 band = &ar->mac.sbands[IEEE80211_BAND_5GHZ];
3052 band->n_channels = ARRAY_SIZE(ath10k_5ghz_channels);
3053 band->channels = channels;
3054 band->n_bitrates = ath10k_a_rates_size;
3055 band->bitrates = ath10k_a_rates;
3056 band->ht_cap = ht_cap;
3057 band->vht_cap = vht_cap;
3058 ar->hw->wiphy->bands[IEEE80211_BAND_5GHZ] = band;
3061 ar->hw->wiphy->interface_modes =
3062 BIT(NL80211_IFTYPE_STATION) |
3063 BIT(NL80211_IFTYPE_ADHOC) |
3064 BIT(NL80211_IFTYPE_AP) |
3065 BIT(NL80211_IFTYPE_P2P_CLIENT) |
3066 BIT(NL80211_IFTYPE_P2P_GO);
3068 ar->hw->flags = IEEE80211_HW_SIGNAL_DBM |
3069 IEEE80211_HW_SUPPORTS_PS |
3070 IEEE80211_HW_SUPPORTS_DYNAMIC_PS |
3071 IEEE80211_HW_SUPPORTS_UAPSD |
3072 IEEE80211_HW_MFP_CAPABLE |
3073 IEEE80211_HW_REPORTS_TX_ACK_STATUS |
3074 IEEE80211_HW_HAS_RATE_CONTROL |
3075 IEEE80211_HW_SUPPORTS_STATIC_SMPS |
3076 IEEE80211_HW_WANT_MONITOR_VIF |
3077 IEEE80211_HW_AP_LINK_PS;
3079 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS)
3080 ar->hw->flags |= IEEE80211_HW_SUPPORTS_DYNAMIC_SMPS;
3082 if (ar->ht_cap_info & WMI_HT_CAP_ENABLED) {
3083 ar->hw->flags |= IEEE80211_HW_AMPDU_AGGREGATION;
3084 ar->hw->flags |= IEEE80211_HW_TX_AMPDU_SETUP_IN_HW;
3087 ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID;
3088 ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN;
3090 ar->hw->vif_data_size = sizeof(struct ath10k_vif);
3092 ar->hw->channel_change_time = 5000;
3093 ar->hw->max_listen_interval = ATH10K_MAX_HW_LISTEN_INTERVAL;
3095 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
3096 ar->hw->wiphy->max_remain_on_channel_duration = 5000;
3098 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
3100 * on LL hardware queues are managed entirely by the FW
3101 * so we only advertise to mac we can do the queues thing
3105 ar->hw->wiphy->iface_combinations = &ath10k_if_comb;
3106 ar->hw->wiphy->n_iface_combinations = 1;
3108 ret = ath_regd_init(&ar->ath_common.regulatory, ar->hw->wiphy,
3109 ath10k_reg_notifier);
3111 ath10k_err("Regulatory initialization failed\n");
3115 ret = ieee80211_register_hw(ar->hw);
3117 ath10k_err("ieee80211 registration failed: %d\n", ret);
3121 if (!ath_is_world_regd(&ar->ath_common.regulatory)) {
3122 ret = regulatory_hint(ar->hw->wiphy,
3123 ar->ath_common.regulatory.alpha2);
3130 ieee80211_unregister_hw(ar->hw);
3134 void ath10k_mac_unregister(struct ath10k *ar)
3136 ieee80211_unregister_hw(ar->hw);
3138 kfree(ar->mac.sbands[IEEE80211_BAND_2GHZ].channels);
3139 kfree(ar->mac.sbands[IEEE80211_BAND_5GHZ].channels);
3141 SET_IEEE80211_DEV(ar->hw, NULL);