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>
34 static int ath10k_send_key(struct ath10k_vif *arvif,
35 struct ieee80211_key_conf *key,
39 struct wmi_vdev_install_key_arg arg = {
40 .vdev_id = arvif->vdev_id,
41 .key_idx = key->keyidx,
42 .key_len = key->keylen,
47 lockdep_assert_held(&arvif->ar->conf_mutex);
49 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
50 arg.key_flags = WMI_KEY_PAIRWISE;
52 arg.key_flags = WMI_KEY_GROUP;
54 switch (key->cipher) {
55 case WLAN_CIPHER_SUITE_CCMP:
56 arg.key_cipher = WMI_CIPHER_AES_CCM;
57 key->flags |= IEEE80211_KEY_FLAG_SW_MGMT_TX;
59 case WLAN_CIPHER_SUITE_TKIP:
60 arg.key_cipher = WMI_CIPHER_TKIP;
61 arg.key_txmic_len = 8;
62 arg.key_rxmic_len = 8;
64 case WLAN_CIPHER_SUITE_WEP40:
65 case WLAN_CIPHER_SUITE_WEP104:
66 arg.key_cipher = WMI_CIPHER_WEP;
67 /* AP/IBSS mode requires self-key to be groupwise
68 * Otherwise pairwise key must be set */
69 if (memcmp(macaddr, arvif->vif->addr, ETH_ALEN))
70 arg.key_flags = WMI_KEY_PAIRWISE;
73 ath10k_warn("cipher %d is not supported\n", key->cipher);
77 if (cmd == DISABLE_KEY) {
78 arg.key_cipher = WMI_CIPHER_NONE;
82 return ath10k_wmi_vdev_install_key(arvif->ar, &arg);
85 static int ath10k_install_key(struct ath10k_vif *arvif,
86 struct ieee80211_key_conf *key,
90 struct ath10k *ar = arvif->ar;
93 lockdep_assert_held(&ar->conf_mutex);
95 INIT_COMPLETION(ar->install_key_done);
97 ret = ath10k_send_key(arvif, key, cmd, macaddr);
101 ret = wait_for_completion_timeout(&ar->install_key_done, 3*HZ);
108 static int ath10k_install_peer_wep_keys(struct ath10k_vif *arvif,
111 struct ath10k *ar = arvif->ar;
112 struct ath10k_peer *peer;
116 lockdep_assert_held(&ar->conf_mutex);
118 spin_lock_bh(&ar->data_lock);
119 peer = ath10k_peer_find(ar, arvif->vdev_id, addr);
120 spin_unlock_bh(&ar->data_lock);
125 for (i = 0; i < ARRAY_SIZE(arvif->wep_keys); i++) {
126 if (arvif->wep_keys[i] == NULL)
129 ret = ath10k_install_key(arvif, arvif->wep_keys[i], SET_KEY,
134 peer->keys[i] = arvif->wep_keys[i];
140 static int ath10k_clear_peer_keys(struct ath10k_vif *arvif,
143 struct ath10k *ar = arvif->ar;
144 struct ath10k_peer *peer;
149 lockdep_assert_held(&ar->conf_mutex);
151 spin_lock_bh(&ar->data_lock);
152 peer = ath10k_peer_find(ar, arvif->vdev_id, addr);
153 spin_unlock_bh(&ar->data_lock);
158 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
159 if (peer->keys[i] == NULL)
162 ret = ath10k_install_key(arvif, peer->keys[i],
164 if (ret && first_errno == 0)
168 ath10k_warn("could not remove peer wep key %d (%d)\n",
171 peer->keys[i] = NULL;
177 static int ath10k_clear_vdev_key(struct ath10k_vif *arvif,
178 struct ieee80211_key_conf *key)
180 struct ath10k *ar = arvif->ar;
181 struct ath10k_peer *peer;
187 lockdep_assert_held(&ar->conf_mutex);
190 /* since ath10k_install_key we can't hold data_lock all the
191 * time, so we try to remove the keys incrementally */
192 spin_lock_bh(&ar->data_lock);
194 list_for_each_entry(peer, &ar->peers, list) {
195 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
196 if (peer->keys[i] == key) {
197 memcpy(addr, peer->addr, ETH_ALEN);
198 peer->keys[i] = NULL;
203 if (i < ARRAY_SIZE(peer->keys))
206 spin_unlock_bh(&ar->data_lock);
208 if (i == ARRAY_SIZE(peer->keys))
211 ret = ath10k_install_key(arvif, key, DISABLE_KEY, addr);
212 if (ret && first_errno == 0)
216 ath10k_warn("could not remove key for %pM\n", addr);
223 /*********************/
224 /* General utilities */
225 /*********************/
227 static inline enum wmi_phy_mode
228 chan_to_phymode(const struct cfg80211_chan_def *chandef)
230 enum wmi_phy_mode phymode = MODE_UNKNOWN;
232 switch (chandef->chan->band) {
233 case IEEE80211_BAND_2GHZ:
234 switch (chandef->width) {
235 case NL80211_CHAN_WIDTH_20_NOHT:
238 case NL80211_CHAN_WIDTH_20:
239 phymode = MODE_11NG_HT20;
241 case NL80211_CHAN_WIDTH_40:
242 phymode = MODE_11NG_HT40;
244 case NL80211_CHAN_WIDTH_5:
245 case NL80211_CHAN_WIDTH_10:
246 case NL80211_CHAN_WIDTH_80:
247 case NL80211_CHAN_WIDTH_80P80:
248 case NL80211_CHAN_WIDTH_160:
249 phymode = MODE_UNKNOWN;
253 case IEEE80211_BAND_5GHZ:
254 switch (chandef->width) {
255 case NL80211_CHAN_WIDTH_20_NOHT:
258 case NL80211_CHAN_WIDTH_20:
259 phymode = MODE_11NA_HT20;
261 case NL80211_CHAN_WIDTH_40:
262 phymode = MODE_11NA_HT40;
264 case NL80211_CHAN_WIDTH_80:
265 phymode = MODE_11AC_VHT80;
267 case NL80211_CHAN_WIDTH_5:
268 case NL80211_CHAN_WIDTH_10:
269 case NL80211_CHAN_WIDTH_80P80:
270 case NL80211_CHAN_WIDTH_160:
271 phymode = MODE_UNKNOWN;
279 WARN_ON(phymode == MODE_UNKNOWN);
283 static u8 ath10k_parse_mpdudensity(u8 mpdudensity)
286 * 802.11n D2.0 defined values for "Minimum MPDU Start Spacing":
287 * 0 for no restriction
296 switch (mpdudensity) {
302 /* Our lower layer calculations limit our precision to
318 static int ath10k_peer_create(struct ath10k *ar, u32 vdev_id, const u8 *addr)
322 lockdep_assert_held(&ar->conf_mutex);
324 ret = ath10k_wmi_peer_create(ar, vdev_id, addr);
328 ret = ath10k_wait_for_peer_created(ar, vdev_id, addr);
335 static int ath10k_mac_set_rts(struct ath10k_vif *arvif, u32 value)
337 struct ath10k *ar = arvif->ar;
340 if (value != 0xFFFFFFFF)
341 value = min_t(u32, arvif->ar->hw->wiphy->rts_threshold,
344 vdev_param = ar->wmi.vdev_param->rts_threshold;
345 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, value);
348 static int ath10k_mac_set_frag(struct ath10k_vif *arvif, u32 value)
350 struct ath10k *ar = arvif->ar;
353 if (value != 0xFFFFFFFF)
354 value = clamp_t(u32, arvif->ar->hw->wiphy->frag_threshold,
355 ATH10K_FRAGMT_THRESHOLD_MIN,
356 ATH10K_FRAGMT_THRESHOLD_MAX);
358 vdev_param = ar->wmi.vdev_param->fragmentation_threshold;
359 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, value);
362 static int ath10k_peer_delete(struct ath10k *ar, u32 vdev_id, const u8 *addr)
366 lockdep_assert_held(&ar->conf_mutex);
368 ret = ath10k_wmi_peer_delete(ar, vdev_id, addr);
372 ret = ath10k_wait_for_peer_deleted(ar, vdev_id, addr);
379 static void ath10k_peer_cleanup(struct ath10k *ar, u32 vdev_id)
381 struct ath10k_peer *peer, *tmp;
383 lockdep_assert_held(&ar->conf_mutex);
385 spin_lock_bh(&ar->data_lock);
386 list_for_each_entry_safe(peer, tmp, &ar->peers, list) {
387 if (peer->vdev_id != vdev_id)
390 ath10k_warn("removing stale peer %pM from vdev_id %d\n",
391 peer->addr, vdev_id);
393 list_del(&peer->list);
396 spin_unlock_bh(&ar->data_lock);
399 static void ath10k_peer_cleanup_all(struct ath10k *ar)
401 struct ath10k_peer *peer, *tmp;
403 lockdep_assert_held(&ar->conf_mutex);
405 spin_lock_bh(&ar->data_lock);
406 list_for_each_entry_safe(peer, tmp, &ar->peers, list) {
407 list_del(&peer->list);
410 spin_unlock_bh(&ar->data_lock);
413 /************************/
414 /* Interface management */
415 /************************/
417 static inline int ath10k_vdev_setup_sync(struct ath10k *ar)
421 lockdep_assert_held(&ar->conf_mutex);
423 ret = wait_for_completion_timeout(&ar->vdev_setup_done,
424 ATH10K_VDEV_SETUP_TIMEOUT_HZ);
431 static int ath10k_vdev_start(struct ath10k_vif *arvif)
433 struct ath10k *ar = arvif->ar;
434 struct ieee80211_conf *conf = &ar->hw->conf;
435 struct ieee80211_channel *channel = conf->chandef.chan;
436 struct wmi_vdev_start_request_arg arg = {};
439 lockdep_assert_held(&ar->conf_mutex);
441 INIT_COMPLETION(ar->vdev_setup_done);
443 arg.vdev_id = arvif->vdev_id;
444 arg.dtim_period = arvif->dtim_period;
445 arg.bcn_intval = arvif->beacon_interval;
447 arg.channel.freq = channel->center_freq;
449 arg.channel.band_center_freq1 = conf->chandef.center_freq1;
451 arg.channel.mode = chan_to_phymode(&conf->chandef);
453 arg.channel.min_power = channel->max_power * 3;
454 arg.channel.max_power = channel->max_power * 4;
455 arg.channel.max_reg_power = channel->max_reg_power * 4;
456 arg.channel.max_antenna_gain = channel->max_antenna_gain;
458 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
459 arg.ssid = arvif->u.ap.ssid;
460 arg.ssid_len = arvif->u.ap.ssid_len;
461 arg.hidden_ssid = arvif->u.ap.hidden_ssid;
462 } else if (arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
463 arg.ssid = arvif->vif->bss_conf.ssid;
464 arg.ssid_len = arvif->vif->bss_conf.ssid_len;
467 ath10k_dbg(ATH10K_DBG_MAC,
468 "mac vdev %d start center_freq %d phymode %s\n",
469 arg.vdev_id, arg.channel.freq,
470 ath10k_wmi_phymode_str(arg.channel.mode));
472 ret = ath10k_wmi_vdev_start(ar, &arg);
474 ath10k_warn("WMI vdev start failed: ret %d\n", ret);
478 ret = ath10k_vdev_setup_sync(ar);
480 ath10k_warn("vdev setup failed %d\n", ret);
487 static int ath10k_vdev_stop(struct ath10k_vif *arvif)
489 struct ath10k *ar = arvif->ar;
492 lockdep_assert_held(&ar->conf_mutex);
494 INIT_COMPLETION(ar->vdev_setup_done);
496 ret = ath10k_wmi_vdev_stop(ar, arvif->vdev_id);
498 ath10k_warn("WMI vdev stop failed: ret %d\n", ret);
502 ret = ath10k_vdev_setup_sync(ar);
504 ath10k_warn("vdev setup failed %d\n", ret);
511 static int ath10k_monitor_start(struct ath10k *ar, int vdev_id)
513 struct ieee80211_channel *channel = ar->hw->conf.chandef.chan;
514 struct wmi_vdev_start_request_arg arg = {};
517 lockdep_assert_held(&ar->conf_mutex);
519 arg.vdev_id = vdev_id;
520 arg.channel.freq = channel->center_freq;
521 arg.channel.band_center_freq1 = ar->hw->conf.chandef.center_freq1;
523 /* TODO setup this dynamically, what in case we
524 don't have any vifs? */
525 arg.channel.mode = chan_to_phymode(&ar->hw->conf.chandef);
527 arg.channel.min_power = channel->max_power * 3;
528 arg.channel.max_power = channel->max_power * 4;
529 arg.channel.max_reg_power = channel->max_reg_power * 4;
530 arg.channel.max_antenna_gain = channel->max_antenna_gain;
532 ret = ath10k_wmi_vdev_start(ar, &arg);
534 ath10k_warn("Monitor vdev start failed: ret %d\n", ret);
538 ret = ath10k_vdev_setup_sync(ar);
540 ath10k_warn("Monitor vdev setup failed %d\n", ret);
544 ret = ath10k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr);
546 ath10k_warn("Monitor vdev up failed: %d\n", ret);
550 ar->monitor_vdev_id = vdev_id;
551 ar->monitor_enabled = true;
556 ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
558 ath10k_warn("Monitor vdev stop failed: %d\n", ret);
563 static int ath10k_monitor_stop(struct ath10k *ar)
567 lockdep_assert_held(&ar->conf_mutex);
569 ret = ath10k_wmi_vdev_down(ar, ar->monitor_vdev_id);
571 ath10k_warn("Monitor vdev down failed: %d\n", ret);
573 ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
575 ath10k_warn("Monitor vdev stop failed: %d\n", ret);
577 ret = ath10k_vdev_setup_sync(ar);
579 ath10k_warn("Monitor_down sync failed: %d\n", ret);
581 ar->monitor_enabled = false;
585 static int ath10k_monitor_create(struct ath10k *ar)
589 lockdep_assert_held(&ar->conf_mutex);
591 if (ar->monitor_present) {
592 ath10k_warn("Monitor mode already enabled\n");
596 bit = ffs(ar->free_vdev_map);
598 ath10k_warn("No free VDEV slots\n");
602 ar->monitor_vdev_id = bit - 1;
603 ar->free_vdev_map &= ~(1 << ar->monitor_vdev_id);
605 ret = ath10k_wmi_vdev_create(ar, ar->monitor_vdev_id,
606 WMI_VDEV_TYPE_MONITOR,
609 ath10k_warn("WMI vdev monitor create failed: ret %d\n", ret);
613 ath10k_dbg(ATH10K_DBG_MAC, "mac monitor vdev %d created\n",
614 ar->monitor_vdev_id);
616 ar->monitor_present = true;
621 * Restore the ID to the global map.
623 ar->free_vdev_map |= 1 << (ar->monitor_vdev_id);
627 static int ath10k_monitor_destroy(struct ath10k *ar)
631 lockdep_assert_held(&ar->conf_mutex);
633 if (!ar->monitor_present)
636 ret = ath10k_wmi_vdev_delete(ar, ar->monitor_vdev_id);
638 ath10k_warn("WMI vdev monitor delete failed: %d\n", ret);
642 ar->free_vdev_map |= 1 << (ar->monitor_vdev_id);
643 ar->monitor_present = false;
645 ath10k_dbg(ATH10K_DBG_MAC, "mac monitor vdev %d deleted\n",
646 ar->monitor_vdev_id);
650 static void ath10k_control_beaconing(struct ath10k_vif *arvif,
651 struct ieee80211_bss_conf *info)
655 lockdep_assert_held(&arvif->ar->conf_mutex);
657 if (!info->enable_beacon) {
658 ath10k_vdev_stop(arvif);
662 arvif->tx_seq_no = 0x1000;
664 ret = ath10k_vdev_start(arvif);
668 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, 0, info->bssid);
670 ath10k_warn("Failed to bring up VDEV: %d\n",
674 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d up\n", arvif->vdev_id);
677 static void ath10k_control_ibss(struct ath10k_vif *arvif,
678 struct ieee80211_bss_conf *info,
679 const u8 self_peer[ETH_ALEN])
684 lockdep_assert_held(&arvif->ar->conf_mutex);
686 if (!info->ibss_joined) {
687 ret = ath10k_peer_delete(arvif->ar, arvif->vdev_id, self_peer);
689 ath10k_warn("Failed to delete IBSS self peer:%pM for VDEV:%d ret:%d\n",
690 self_peer, arvif->vdev_id, ret);
692 if (is_zero_ether_addr(arvif->u.ibss.bssid))
695 ret = ath10k_peer_delete(arvif->ar, arvif->vdev_id,
696 arvif->u.ibss.bssid);
698 ath10k_warn("Failed to delete IBSS BSSID peer:%pM for VDEV:%d ret:%d\n",
699 arvif->u.ibss.bssid, arvif->vdev_id, ret);
703 memset(arvif->u.ibss.bssid, 0, ETH_ALEN);
708 ret = ath10k_peer_create(arvif->ar, arvif->vdev_id, self_peer);
710 ath10k_warn("Failed to create IBSS self peer:%pM for VDEV:%d ret:%d\n",
711 self_peer, arvif->vdev_id, ret);
715 vdev_param = arvif->ar->wmi.vdev_param->atim_window;
716 ret = ath10k_wmi_vdev_set_param(arvif->ar, arvif->vdev_id, vdev_param,
717 ATH10K_DEFAULT_ATIM);
719 ath10k_warn("Failed to set IBSS ATIM for VDEV:%d ret:%d\n",
720 arvif->vdev_id, ret);
724 * Review this when mac80211 gains per-interface powersave support.
726 static int ath10k_mac_vif_setup_ps(struct ath10k_vif *arvif)
728 struct ath10k *ar = arvif->ar;
729 struct ieee80211_conf *conf = &ar->hw->conf;
730 enum wmi_sta_powersave_param param;
731 enum wmi_sta_ps_mode psmode;
734 lockdep_assert_held(&arvif->ar->conf_mutex);
736 if (arvif->vif->type != NL80211_IFTYPE_STATION)
739 if (conf->flags & IEEE80211_CONF_PS) {
740 psmode = WMI_STA_PS_MODE_ENABLED;
741 param = WMI_STA_PS_PARAM_INACTIVITY_TIME;
743 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param,
744 conf->dynamic_ps_timeout);
746 ath10k_warn("Failed to set inactivity time for VDEV: %d\n",
751 psmode = WMI_STA_PS_MODE_DISABLED;
754 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d psmode %s\n",
755 arvif->vdev_id, psmode ? "enable" : "disable");
757 ret = ath10k_wmi_set_psmode(ar, arvif->vdev_id, psmode);
759 ath10k_warn("Failed to set PS Mode: %d for VDEV: %d\n",
760 psmode, arvif->vdev_id);
767 /**********************/
768 /* Station management */
769 /**********************/
771 static void ath10k_peer_assoc_h_basic(struct ath10k *ar,
772 struct ath10k_vif *arvif,
773 struct ieee80211_sta *sta,
774 struct ieee80211_bss_conf *bss_conf,
775 struct wmi_peer_assoc_complete_arg *arg)
777 lockdep_assert_held(&ar->conf_mutex);
779 memcpy(arg->addr, sta->addr, ETH_ALEN);
780 arg->vdev_id = arvif->vdev_id;
781 arg->peer_aid = sta->aid;
782 arg->peer_flags |= WMI_PEER_AUTH;
784 if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
786 * Seems FW have problems with Power Save in STA
787 * mode when we setup this parameter to high (eg. 5).
788 * Often we see that FW don't send NULL (with clean P flags)
789 * frame even there is info about buffered frames in beacons.
790 * Sometimes we have to wait more than 10 seconds before FW
791 * will wakeup. Often sending one ping from AP to our device
792 * just fail (more than 50%).
794 * Seems setting this FW parameter to 1 couse FW
795 * will check every beacon and will wakup immediately
796 * after detection buffered data.
798 arg->peer_listen_intval = 1;
800 arg->peer_listen_intval = ar->hw->conf.listen_interval;
802 arg->peer_num_spatial_streams = 1;
805 * The assoc capabilities are available only in managed mode.
807 if (arvif->vdev_type == WMI_VDEV_TYPE_STA && bss_conf)
808 arg->peer_caps = bss_conf->assoc_capability;
811 static void ath10k_peer_assoc_h_crypto(struct ath10k *ar,
812 struct ath10k_vif *arvif,
813 struct wmi_peer_assoc_complete_arg *arg)
815 struct ieee80211_vif *vif = arvif->vif;
816 struct ieee80211_bss_conf *info = &vif->bss_conf;
817 struct cfg80211_bss *bss;
818 const u8 *rsnie = NULL;
819 const u8 *wpaie = NULL;
821 lockdep_assert_held(&ar->conf_mutex);
823 bss = cfg80211_get_bss(ar->hw->wiphy, ar->hw->conf.chandef.chan,
824 info->bssid, NULL, 0, 0, 0);
826 const struct cfg80211_bss_ies *ies;
829 rsnie = ieee80211_bss_get_ie(bss, WLAN_EID_RSN);
831 ies = rcu_dereference(bss->ies);
833 wpaie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
834 WLAN_OUI_TYPE_MICROSOFT_WPA,
838 cfg80211_put_bss(ar->hw->wiphy, bss);
841 /* FIXME: base on RSN IE/WPA IE is a correct idea? */
842 if (rsnie || wpaie) {
843 ath10k_dbg(ATH10K_DBG_WMI, "%s: rsn ie found\n", __func__);
844 arg->peer_flags |= WMI_PEER_NEED_PTK_4_WAY;
848 ath10k_dbg(ATH10K_DBG_WMI, "%s: wpa ie found\n", __func__);
849 arg->peer_flags |= WMI_PEER_NEED_GTK_2_WAY;
853 static void ath10k_peer_assoc_h_rates(struct ath10k *ar,
854 struct ieee80211_sta *sta,
855 struct wmi_peer_assoc_complete_arg *arg)
857 struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates;
858 const struct ieee80211_supported_band *sband;
859 const struct ieee80211_rate *rates;
863 lockdep_assert_held(&ar->conf_mutex);
865 sband = ar->hw->wiphy->bands[ar->hw->conf.chandef.chan->band];
866 ratemask = sta->supp_rates[ar->hw->conf.chandef.chan->band];
867 rates = sband->bitrates;
869 rateset->num_rates = 0;
871 for (i = 0; i < 32; i++, ratemask >>= 1, rates++) {
875 rateset->rates[rateset->num_rates] = rates->hw_value;
876 rateset->num_rates++;
880 static void ath10k_peer_assoc_h_ht(struct ath10k *ar,
881 struct ieee80211_sta *sta,
882 struct wmi_peer_assoc_complete_arg *arg)
884 const struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
888 lockdep_assert_held(&ar->conf_mutex);
890 if (!ht_cap->ht_supported)
893 arg->peer_flags |= WMI_PEER_HT;
894 arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
895 ht_cap->ampdu_factor)) - 1;
897 arg->peer_mpdu_density =
898 ath10k_parse_mpdudensity(ht_cap->ampdu_density);
900 arg->peer_ht_caps = ht_cap->cap;
901 arg->peer_rate_caps |= WMI_RC_HT_FLAG;
903 if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING)
904 arg->peer_flags |= WMI_PEER_LDPC;
906 if (sta->bandwidth >= IEEE80211_STA_RX_BW_40) {
907 arg->peer_flags |= WMI_PEER_40MHZ;
908 arg->peer_rate_caps |= WMI_RC_CW40_FLAG;
911 if (ht_cap->cap & IEEE80211_HT_CAP_SGI_20)
912 arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
914 if (ht_cap->cap & IEEE80211_HT_CAP_SGI_40)
915 arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
917 if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) {
918 arg->peer_rate_caps |= WMI_RC_TX_STBC_FLAG;
919 arg->peer_flags |= WMI_PEER_STBC;
922 if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) {
924 stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC;
925 stbc = stbc >> IEEE80211_HT_CAP_RX_STBC_SHIFT;
926 stbc = stbc << WMI_RC_RX_STBC_FLAG_S;
927 arg->peer_rate_caps |= stbc;
928 arg->peer_flags |= WMI_PEER_STBC;
931 smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
932 smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
934 if (smps == WLAN_HT_CAP_SM_PS_STATIC) {
935 arg->peer_flags |= WMI_PEER_SPATIAL_MUX;
936 arg->peer_flags |= WMI_PEER_STATIC_MIMOPS;
937 } else if (smps == WLAN_HT_CAP_SM_PS_DYNAMIC) {
938 arg->peer_flags |= WMI_PEER_SPATIAL_MUX;
939 arg->peer_flags |= WMI_PEER_DYN_MIMOPS;
942 if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2])
943 arg->peer_rate_caps |= WMI_RC_TS_FLAG;
944 else if (ht_cap->mcs.rx_mask[1])
945 arg->peer_rate_caps |= WMI_RC_DS_FLAG;
947 for (i = 0, n = 0; i < IEEE80211_HT_MCS_MASK_LEN*8; i++)
948 if (ht_cap->mcs.rx_mask[i/8] & (1 << i%8))
949 arg->peer_ht_rates.rates[n++] = i;
951 arg->peer_ht_rates.num_rates = n;
952 arg->peer_num_spatial_streams = max((n+7) / 8, 1);
954 ath10k_dbg(ATH10K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n",
956 arg->peer_ht_rates.num_rates,
957 arg->peer_num_spatial_streams);
960 static void ath10k_peer_assoc_h_qos_ap(struct ath10k *ar,
961 struct ath10k_vif *arvif,
962 struct ieee80211_sta *sta,
963 struct ieee80211_bss_conf *bss_conf,
964 struct wmi_peer_assoc_complete_arg *arg)
969 lockdep_assert_held(&ar->conf_mutex);
972 arg->peer_flags |= WMI_PEER_QOS;
974 if (sta->wme && sta->uapsd_queues) {
975 ath10k_dbg(ATH10K_DBG_MAC, "mac uapsd_queues 0x%x max_sp %d\n",
976 sta->uapsd_queues, sta->max_sp);
978 arg->peer_flags |= WMI_PEER_APSD;
979 arg->peer_rate_caps |= WMI_RC_UAPSD_FLAG;
981 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO)
982 uapsd |= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN |
983 WMI_AP_PS_UAPSD_AC3_TRIGGER_EN;
984 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI)
985 uapsd |= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN |
986 WMI_AP_PS_UAPSD_AC2_TRIGGER_EN;
987 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK)
988 uapsd |= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN |
989 WMI_AP_PS_UAPSD_AC1_TRIGGER_EN;
990 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE)
991 uapsd |= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN |
992 WMI_AP_PS_UAPSD_AC0_TRIGGER_EN;
995 if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP)
996 max_sp = sta->max_sp;
998 ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
1000 WMI_AP_PS_PEER_PARAM_UAPSD,
1003 ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
1005 WMI_AP_PS_PEER_PARAM_MAX_SP,
1008 /* TODO setup this based on STA listen interval and
1009 beacon interval. Currently we don't know
1010 sta->listen_interval - mac80211 patch required.
1011 Currently use 10 seconds */
1012 ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
1014 WMI_AP_PS_PEER_PARAM_AGEOUT_TIME,
1019 static void ath10k_peer_assoc_h_qos_sta(struct ath10k *ar,
1020 struct ath10k_vif *arvif,
1021 struct ieee80211_sta *sta,
1022 struct ieee80211_bss_conf *bss_conf,
1023 struct wmi_peer_assoc_complete_arg *arg)
1026 arg->peer_flags |= WMI_PEER_QOS;
1029 static void ath10k_peer_assoc_h_vht(struct ath10k *ar,
1030 struct ieee80211_sta *sta,
1031 struct wmi_peer_assoc_complete_arg *arg)
1033 const struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
1036 if (!vht_cap->vht_supported)
1039 arg->peer_flags |= WMI_PEER_VHT;
1040 arg->peer_vht_caps = vht_cap->cap;
1043 ampdu_factor = (vht_cap->cap &
1044 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >>
1045 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
1047 /* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to
1048 * zero in VHT IE. Using it would result in degraded throughput.
1049 * arg->peer_max_mpdu at this point contains HT max_mpdu so keep
1050 * it if VHT max_mpdu is smaller. */
1051 arg->peer_max_mpdu = max(arg->peer_max_mpdu,
1052 (1U << (IEEE80211_HT_MAX_AMPDU_FACTOR +
1053 ampdu_factor)) - 1);
1055 if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
1056 arg->peer_flags |= WMI_PEER_80MHZ;
1058 arg->peer_vht_rates.rx_max_rate =
1059 __le16_to_cpu(vht_cap->vht_mcs.rx_highest);
1060 arg->peer_vht_rates.rx_mcs_set =
1061 __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map);
1062 arg->peer_vht_rates.tx_max_rate =
1063 __le16_to_cpu(vht_cap->vht_mcs.tx_highest);
1064 arg->peer_vht_rates.tx_mcs_set =
1065 __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map);
1067 ath10k_dbg(ATH10K_DBG_MAC, "mac vht peer %pM max_mpdu %d flags 0x%x\n",
1068 sta->addr, arg->peer_max_mpdu, arg->peer_flags);
1071 static void ath10k_peer_assoc_h_qos(struct ath10k *ar,
1072 struct ath10k_vif *arvif,
1073 struct ieee80211_sta *sta,
1074 struct ieee80211_bss_conf *bss_conf,
1075 struct wmi_peer_assoc_complete_arg *arg)
1077 switch (arvif->vdev_type) {
1078 case WMI_VDEV_TYPE_AP:
1079 ath10k_peer_assoc_h_qos_ap(ar, arvif, sta, bss_conf, arg);
1081 case WMI_VDEV_TYPE_STA:
1082 ath10k_peer_assoc_h_qos_sta(ar, arvif, sta, bss_conf, arg);
1089 static void ath10k_peer_assoc_h_phymode(struct ath10k *ar,
1090 struct ath10k_vif *arvif,
1091 struct ieee80211_sta *sta,
1092 struct wmi_peer_assoc_complete_arg *arg)
1094 enum wmi_phy_mode phymode = MODE_UNKNOWN;
1096 switch (ar->hw->conf.chandef.chan->band) {
1097 case IEEE80211_BAND_2GHZ:
1098 if (sta->ht_cap.ht_supported) {
1099 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1100 phymode = MODE_11NG_HT40;
1102 phymode = MODE_11NG_HT20;
1108 case IEEE80211_BAND_5GHZ:
1112 if (sta->vht_cap.vht_supported) {
1113 if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
1114 phymode = MODE_11AC_VHT80;
1115 else if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1116 phymode = MODE_11AC_VHT40;
1117 else if (sta->bandwidth == IEEE80211_STA_RX_BW_20)
1118 phymode = MODE_11AC_VHT20;
1119 } else if (sta->ht_cap.ht_supported) {
1120 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1121 phymode = MODE_11NA_HT40;
1123 phymode = MODE_11NA_HT20;
1133 ath10k_dbg(ATH10K_DBG_MAC, "mac peer %pM phymode %s\n",
1134 sta->addr, ath10k_wmi_phymode_str(phymode));
1136 arg->peer_phymode = phymode;
1137 WARN_ON(phymode == MODE_UNKNOWN);
1140 static int ath10k_peer_assoc(struct ath10k *ar,
1141 struct ath10k_vif *arvif,
1142 struct ieee80211_sta *sta,
1143 struct ieee80211_bss_conf *bss_conf)
1145 struct wmi_peer_assoc_complete_arg arg;
1147 lockdep_assert_held(&ar->conf_mutex);
1149 memset(&arg, 0, sizeof(struct wmi_peer_assoc_complete_arg));
1151 ath10k_peer_assoc_h_basic(ar, arvif, sta, bss_conf, &arg);
1152 ath10k_peer_assoc_h_crypto(ar, arvif, &arg);
1153 ath10k_peer_assoc_h_rates(ar, sta, &arg);
1154 ath10k_peer_assoc_h_ht(ar, sta, &arg);
1155 ath10k_peer_assoc_h_vht(ar, sta, &arg);
1156 ath10k_peer_assoc_h_qos(ar, arvif, sta, bss_conf, &arg);
1157 ath10k_peer_assoc_h_phymode(ar, arvif, sta, &arg);
1159 return ath10k_wmi_peer_assoc(ar, &arg);
1162 /* can be called only in mac80211 callbacks due to `key_count` usage */
1163 static void ath10k_bss_assoc(struct ieee80211_hw *hw,
1164 struct ieee80211_vif *vif,
1165 struct ieee80211_bss_conf *bss_conf)
1167 struct ath10k *ar = hw->priv;
1168 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1169 struct ieee80211_sta *ap_sta;
1172 lockdep_assert_held(&ar->conf_mutex);
1176 ap_sta = ieee80211_find_sta(vif, bss_conf->bssid);
1178 ath10k_warn("Failed to find station entry for %pM\n",
1184 ret = ath10k_peer_assoc(ar, arvif, ap_sta, bss_conf);
1186 ath10k_warn("Peer assoc failed for %pM\n", bss_conf->bssid);
1193 ath10k_dbg(ATH10K_DBG_MAC,
1194 "mac vdev %d up (associated) bssid %pM aid %d\n",
1195 arvif->vdev_id, bss_conf->bssid, bss_conf->aid);
1197 ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, bss_conf->aid,
1200 ath10k_warn("VDEV: %d up failed: ret %d\n",
1201 arvif->vdev_id, ret);
1207 static void ath10k_bss_disassoc(struct ieee80211_hw *hw,
1208 struct ieee80211_vif *vif)
1210 struct ath10k *ar = hw->priv;
1211 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1214 lockdep_assert_held(&ar->conf_mutex);
1217 * For some reason, calling VDEV-DOWN before VDEV-STOP
1218 * makes the FW to send frames via HTT after disassociation.
1219 * No idea why this happens, even though VDEV-DOWN is supposed
1220 * to be analogous to link down, so just stop the VDEV.
1222 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d stop (disassociated\n",
1225 /* FIXME: check return value */
1226 ret = ath10k_vdev_stop(arvif);
1229 * If we don't call VDEV-DOWN after VDEV-STOP FW will remain active and
1230 * report beacons from previously associated network through HTT.
1231 * This in turn would spam mac80211 WARN_ON if we bring down all
1232 * interfaces as it expects there is no rx when no interface is
1235 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d down\n", arvif->vdev_id);
1237 /* FIXME: why don't we print error if wmi call fails? */
1238 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
1240 arvif->def_wep_key_idx = 0;
1243 static int ath10k_station_assoc(struct ath10k *ar, struct ath10k_vif *arvif,
1244 struct ieee80211_sta *sta)
1248 lockdep_assert_held(&ar->conf_mutex);
1250 ret = ath10k_peer_assoc(ar, arvif, sta, NULL);
1252 ath10k_warn("WMI peer assoc failed for %pM\n", sta->addr);
1256 ret = ath10k_install_peer_wep_keys(arvif, sta->addr);
1258 ath10k_warn("could not install peer wep keys (%d)\n", ret);
1265 static int ath10k_station_disassoc(struct ath10k *ar, struct ath10k_vif *arvif,
1266 struct ieee80211_sta *sta)
1270 lockdep_assert_held(&ar->conf_mutex);
1272 ret = ath10k_clear_peer_keys(arvif, sta->addr);
1274 ath10k_warn("could not clear all peer wep keys (%d)\n", ret);
1285 static int ath10k_update_channel_list(struct ath10k *ar)
1287 struct ieee80211_hw *hw = ar->hw;
1288 struct ieee80211_supported_band **bands;
1289 enum ieee80211_band band;
1290 struct ieee80211_channel *channel;
1291 struct wmi_scan_chan_list_arg arg = {0};
1292 struct wmi_channel_arg *ch;
1298 lockdep_assert_held(&ar->conf_mutex);
1300 bands = hw->wiphy->bands;
1301 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
1305 for (i = 0; i < bands[band]->n_channels; i++) {
1306 if (bands[band]->channels[i].flags &
1307 IEEE80211_CHAN_DISABLED)
1314 len = sizeof(struct wmi_channel_arg) * arg.n_channels;
1315 arg.channels = kzalloc(len, GFP_KERNEL);
1320 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
1324 for (i = 0; i < bands[band]->n_channels; i++) {
1325 channel = &bands[band]->channels[i];
1327 if (channel->flags & IEEE80211_CHAN_DISABLED)
1330 ch->allow_ht = true;
1332 /* FIXME: when should we really allow VHT? */
1333 ch->allow_vht = true;
1336 !(channel->flags & IEEE80211_CHAN_NO_IBSS);
1339 !(channel->flags & IEEE80211_CHAN_NO_HT40PLUS);
1341 passive = channel->flags & IEEE80211_CHAN_PASSIVE_SCAN;
1342 ch->passive = passive;
1344 ch->freq = channel->center_freq;
1345 ch->min_power = channel->max_power * 3;
1346 ch->max_power = channel->max_power * 4;
1347 ch->max_reg_power = channel->max_reg_power * 4;
1348 ch->max_antenna_gain = channel->max_antenna_gain;
1349 ch->reg_class_id = 0; /* FIXME */
1351 /* FIXME: why use only legacy modes, why not any
1352 * HT/VHT modes? Would that even make any
1354 if (channel->band == IEEE80211_BAND_2GHZ)
1355 ch->mode = MODE_11G;
1357 ch->mode = MODE_11A;
1359 if (WARN_ON_ONCE(ch->mode == MODE_UNKNOWN))
1362 ath10k_dbg(ATH10K_DBG_WMI,
1363 "mac channel [%zd/%d] freq %d maxpower %d regpower %d antenna %d mode %d\n",
1364 ch - arg.channels, arg.n_channels,
1365 ch->freq, ch->max_power, ch->max_reg_power,
1366 ch->max_antenna_gain, ch->mode);
1372 ret = ath10k_wmi_scan_chan_list(ar, &arg);
1373 kfree(arg.channels);
1378 static void ath10k_regd_update(struct ath10k *ar)
1380 struct reg_dmn_pair_mapping *regpair;
1383 lockdep_assert_held(&ar->conf_mutex);
1385 ret = ath10k_update_channel_list(ar);
1387 ath10k_warn("could not update channel list (%d)\n", ret);
1389 regpair = ar->ath_common.regulatory.regpair;
1391 /* Target allows setting up per-band regdomain but ath_common provides
1392 * a combined one only */
1393 ret = ath10k_wmi_pdev_set_regdomain(ar,
1394 regpair->regDmnEnum,
1395 regpair->regDmnEnum, /* 2ghz */
1396 regpair->regDmnEnum, /* 5ghz */
1397 regpair->reg_2ghz_ctl,
1398 regpair->reg_5ghz_ctl);
1400 ath10k_warn("could not set pdev regdomain (%d)\n", ret);
1403 static void ath10k_reg_notifier(struct wiphy *wiphy,
1404 struct regulatory_request *request)
1406 struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
1407 struct ath10k *ar = hw->priv;
1409 ath_reg_notifier_apply(wiphy, request, &ar->ath_common.regulatory);
1411 mutex_lock(&ar->conf_mutex);
1412 if (ar->state == ATH10K_STATE_ON)
1413 ath10k_regd_update(ar);
1414 mutex_unlock(&ar->conf_mutex);
1421 static u8 ath10k_tx_h_get_tid(struct ieee80211_hdr *hdr)
1423 if (ieee80211_is_mgmt(hdr->frame_control))
1424 return HTT_DATA_TX_EXT_TID_MGMT;
1426 if (!ieee80211_is_data_qos(hdr->frame_control))
1427 return HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
1429 if (!is_unicast_ether_addr(ieee80211_get_DA(hdr)))
1430 return HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
1432 return ieee80211_get_qos_ctl(hdr)[0] & IEEE80211_QOS_CTL_TID_MASK;
1435 static u8 ath10k_tx_h_get_vdev_id(struct ath10k *ar,
1436 struct ieee80211_tx_info *info)
1438 if (info->control.vif)
1439 return ath10k_vif_to_arvif(info->control.vif)->vdev_id;
1441 if (ar->monitor_enabled)
1442 return ar->monitor_vdev_id;
1444 ath10k_warn("could not resolve vdev id\n");
1449 * Frames sent to the FW have to be in "Native Wifi" format.
1450 * Strip the QoS field from the 802.11 header.
1452 static void ath10k_tx_h_qos_workaround(struct ieee80211_hw *hw,
1453 struct ieee80211_tx_control *control,
1454 struct sk_buff *skb)
1456 struct ieee80211_hdr *hdr = (void *)skb->data;
1459 if (!ieee80211_is_data_qos(hdr->frame_control))
1462 qos_ctl = ieee80211_get_qos_ctl(hdr);
1463 memmove(skb->data + IEEE80211_QOS_CTL_LEN,
1464 skb->data, (void *)qos_ctl - (void *)skb->data);
1465 skb_pull(skb, IEEE80211_QOS_CTL_LEN);
1468 static void ath10k_tx_wep_key_work(struct work_struct *work)
1470 struct ath10k_vif *arvif = container_of(work, struct ath10k_vif,
1472 int ret, keyidx = arvif->def_wep_key_newidx;
1474 if (arvif->def_wep_key_idx == keyidx)
1477 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d set keyidx %d\n",
1478 arvif->vdev_id, keyidx);
1480 ret = ath10k_wmi_vdev_set_param(arvif->ar,
1482 arvif->ar->wmi.vdev_param->def_keyid,
1485 ath10k_warn("could not update wep keyidx (%d)\n", ret);
1489 arvif->def_wep_key_idx = keyidx;
1492 static void ath10k_tx_h_update_wep_key(struct sk_buff *skb)
1494 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
1495 struct ieee80211_vif *vif = info->control.vif;
1496 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1497 struct ath10k *ar = arvif->ar;
1498 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
1499 struct ieee80211_key_conf *key = info->control.hw_key;
1501 if (!ieee80211_has_protected(hdr->frame_control))
1507 if (key->cipher != WLAN_CIPHER_SUITE_WEP40 &&
1508 key->cipher != WLAN_CIPHER_SUITE_WEP104)
1511 if (key->keyidx == arvif->def_wep_key_idx)
1514 /* FIXME: Most likely a few frames will be TXed with an old key. Simply
1515 * queueing frames until key index is updated is not an option because
1516 * sk_buff may need more processing to be done, e.g. offchannel */
1517 arvif->def_wep_key_newidx = key->keyidx;
1518 ieee80211_queue_work(ar->hw, &arvif->wep_key_work);
1521 static void ath10k_tx_h_add_p2p_noa_ie(struct ath10k *ar, struct sk_buff *skb)
1523 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
1524 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
1525 struct ieee80211_vif *vif = info->control.vif;
1526 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1528 /* This is case only for P2P_GO */
1529 if (arvif->vdev_type != WMI_VDEV_TYPE_AP ||
1530 arvif->vdev_subtype != WMI_VDEV_SUBTYPE_P2P_GO)
1533 if (unlikely(ieee80211_is_probe_resp(hdr->frame_control))) {
1534 spin_lock_bh(&ar->data_lock);
1535 if (arvif->u.ap.noa_data)
1536 if (!pskb_expand_head(skb, 0, arvif->u.ap.noa_len,
1538 memcpy(skb_put(skb, arvif->u.ap.noa_len),
1539 arvif->u.ap.noa_data,
1540 arvif->u.ap.noa_len);
1541 spin_unlock_bh(&ar->data_lock);
1545 static void ath10k_tx_htt(struct ath10k *ar, struct sk_buff *skb)
1547 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
1550 if (ar->htt.target_version_major >= 3) {
1551 /* Since HTT 3.0 there is no separate mgmt tx command */
1552 ret = ath10k_htt_tx(&ar->htt, skb);
1556 if (ieee80211_is_mgmt(hdr->frame_control)) {
1557 if (test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX,
1559 if (skb_queue_len(&ar->wmi_mgmt_tx_queue) >=
1560 ATH10K_MAX_NUM_MGMT_PENDING) {
1561 ath10k_warn("wmi mgmt_tx queue limit reached\n");
1566 skb_queue_tail(&ar->wmi_mgmt_tx_queue, skb);
1567 ieee80211_queue_work(ar->hw, &ar->wmi_mgmt_tx_work);
1569 ret = ath10k_htt_mgmt_tx(&ar->htt, skb);
1571 } else if (!test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX,
1573 ieee80211_is_nullfunc(hdr->frame_control)) {
1574 /* FW does not report tx status properly for NullFunc frames
1575 * unless they are sent through mgmt tx path. mac80211 sends
1576 * those frames when it detects link/beacon loss and depends
1577 * on the tx status to be correct. */
1578 ret = ath10k_htt_mgmt_tx(&ar->htt, skb);
1580 ret = ath10k_htt_tx(&ar->htt, skb);
1585 ath10k_warn("tx failed (%d). dropping packet.\n", ret);
1586 ieee80211_free_txskb(ar->hw, skb);
1590 void ath10k_offchan_tx_purge(struct ath10k *ar)
1592 struct sk_buff *skb;
1595 skb = skb_dequeue(&ar->offchan_tx_queue);
1599 ieee80211_free_txskb(ar->hw, skb);
1603 void ath10k_offchan_tx_work(struct work_struct *work)
1605 struct ath10k *ar = container_of(work, struct ath10k, offchan_tx_work);
1606 struct ath10k_peer *peer;
1607 struct ieee80211_hdr *hdr;
1608 struct sk_buff *skb;
1609 const u8 *peer_addr;
1613 /* FW requirement: We must create a peer before FW will send out
1614 * an offchannel frame. Otherwise the frame will be stuck and
1615 * never transmitted. We delete the peer upon tx completion.
1616 * It is unlikely that a peer for offchannel tx will already be
1617 * present. However it may be in some rare cases so account for that.
1618 * Otherwise we might remove a legitimate peer and break stuff. */
1621 skb = skb_dequeue(&ar->offchan_tx_queue);
1625 mutex_lock(&ar->conf_mutex);
1627 ath10k_dbg(ATH10K_DBG_MAC, "mac offchannel skb %p\n",
1630 hdr = (struct ieee80211_hdr *)skb->data;
1631 peer_addr = ieee80211_get_DA(hdr);
1632 vdev_id = ATH10K_SKB_CB(skb)->vdev_id;
1634 spin_lock_bh(&ar->data_lock);
1635 peer = ath10k_peer_find(ar, vdev_id, peer_addr);
1636 spin_unlock_bh(&ar->data_lock);
1639 /* FIXME: should this use ath10k_warn()? */
1640 ath10k_dbg(ATH10K_DBG_MAC, "peer %pM on vdev %d already present\n",
1641 peer_addr, vdev_id);
1644 ret = ath10k_peer_create(ar, vdev_id, peer_addr);
1646 ath10k_warn("peer %pM on vdev %d not created (%d)\n",
1647 peer_addr, vdev_id, ret);
1650 spin_lock_bh(&ar->data_lock);
1651 INIT_COMPLETION(ar->offchan_tx_completed);
1652 ar->offchan_tx_skb = skb;
1653 spin_unlock_bh(&ar->data_lock);
1655 ath10k_tx_htt(ar, skb);
1657 ret = wait_for_completion_timeout(&ar->offchan_tx_completed,
1660 ath10k_warn("timed out waiting for offchannel skb %p\n",
1664 ret = ath10k_peer_delete(ar, vdev_id, peer_addr);
1666 ath10k_warn("peer %pM on vdev %d not deleted (%d)\n",
1667 peer_addr, vdev_id, ret);
1670 mutex_unlock(&ar->conf_mutex);
1674 void ath10k_mgmt_over_wmi_tx_purge(struct ath10k *ar)
1676 struct sk_buff *skb;
1679 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
1683 ieee80211_free_txskb(ar->hw, skb);
1687 void ath10k_mgmt_over_wmi_tx_work(struct work_struct *work)
1689 struct ath10k *ar = container_of(work, struct ath10k, wmi_mgmt_tx_work);
1690 struct sk_buff *skb;
1694 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
1698 ret = ath10k_wmi_mgmt_tx(ar, skb);
1700 ath10k_warn("wmi mgmt_tx failed (%d)\n", ret);
1709 * This gets called if we dont get a heart-beat during scan.
1710 * This may indicate the FW has hung and we need to abort the
1711 * scan manually to prevent cancel_hw_scan() from deadlocking
1713 void ath10k_reset_scan(unsigned long ptr)
1715 struct ath10k *ar = (struct ath10k *)ptr;
1717 spin_lock_bh(&ar->data_lock);
1718 if (!ar->scan.in_progress) {
1719 spin_unlock_bh(&ar->data_lock);
1723 ath10k_warn("scan timeout. resetting. fw issue?\n");
1725 if (ar->scan.is_roc)
1726 ieee80211_remain_on_channel_expired(ar->hw);
1728 ieee80211_scan_completed(ar->hw, 1 /* aborted */);
1730 ar->scan.in_progress = false;
1731 complete_all(&ar->scan.completed);
1732 spin_unlock_bh(&ar->data_lock);
1735 static int ath10k_abort_scan(struct ath10k *ar)
1737 struct wmi_stop_scan_arg arg = {
1738 .req_id = 1, /* FIXME */
1739 .req_type = WMI_SCAN_STOP_ONE,
1740 .u.scan_id = ATH10K_SCAN_ID,
1744 lockdep_assert_held(&ar->conf_mutex);
1746 del_timer_sync(&ar->scan.timeout);
1748 spin_lock_bh(&ar->data_lock);
1749 if (!ar->scan.in_progress) {
1750 spin_unlock_bh(&ar->data_lock);
1754 ar->scan.aborting = true;
1755 spin_unlock_bh(&ar->data_lock);
1757 ret = ath10k_wmi_stop_scan(ar, &arg);
1759 ath10k_warn("could not submit wmi stop scan (%d)\n", ret);
1760 spin_lock_bh(&ar->data_lock);
1761 ar->scan.in_progress = false;
1762 ath10k_offchan_tx_purge(ar);
1763 spin_unlock_bh(&ar->data_lock);
1767 ret = wait_for_completion_timeout(&ar->scan.completed, 3*HZ);
1769 ath10k_warn("timed out while waiting for scan to stop\n");
1771 /* scan completion may be done right after we timeout here, so let's
1772 * check the in_progress and tell mac80211 scan is completed. if we
1773 * don't do that and FW fails to send us scan completion indication
1774 * then userspace won't be able to scan anymore */
1777 spin_lock_bh(&ar->data_lock);
1778 if (ar->scan.in_progress) {
1779 ath10k_warn("could not stop scan. its still in progress\n");
1780 ar->scan.in_progress = false;
1781 ath10k_offchan_tx_purge(ar);
1784 spin_unlock_bh(&ar->data_lock);
1789 static int ath10k_start_scan(struct ath10k *ar,
1790 const struct wmi_start_scan_arg *arg)
1794 lockdep_assert_held(&ar->conf_mutex);
1796 ret = ath10k_wmi_start_scan(ar, arg);
1800 ret = wait_for_completion_timeout(&ar->scan.started, 1*HZ);
1802 ath10k_abort_scan(ar);
1806 /* the scan can complete earlier, before we even
1807 * start the timer. in that case the timer handler
1808 * checks ar->scan.in_progress and bails out if its
1809 * false. Add a 200ms margin to account event/command
1811 mod_timer(&ar->scan.timeout, jiffies +
1812 msecs_to_jiffies(arg->max_scan_time+200));
1816 /**********************/
1817 /* mac80211 callbacks */
1818 /**********************/
1820 static void ath10k_tx(struct ieee80211_hw *hw,
1821 struct ieee80211_tx_control *control,
1822 struct sk_buff *skb)
1824 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
1825 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
1826 struct ath10k *ar = hw->priv;
1829 /* We should disable CCK RATE due to P2P */
1830 if (info->flags & IEEE80211_TX_CTL_NO_CCK_RATE)
1831 ath10k_dbg(ATH10K_DBG_MAC, "IEEE80211_TX_CTL_NO_CCK_RATE\n");
1833 /* we must calculate tid before we apply qos workaround
1834 * as we'd lose the qos control field */
1835 tid = ath10k_tx_h_get_tid(hdr);
1836 vdev_id = ath10k_tx_h_get_vdev_id(ar, info);
1838 /* it makes no sense to process injected frames like that */
1839 if (info->control.vif &&
1840 info->control.vif->type != NL80211_IFTYPE_MONITOR) {
1841 ath10k_tx_h_qos_workaround(hw, control, skb);
1842 ath10k_tx_h_update_wep_key(skb);
1843 ath10k_tx_h_add_p2p_noa_ie(ar, skb);
1844 ath10k_tx_h_seq_no(skb);
1847 ATH10K_SKB_CB(skb)->vdev_id = vdev_id;
1848 ATH10K_SKB_CB(skb)->htt.is_offchan = false;
1849 ATH10K_SKB_CB(skb)->htt.tid = tid;
1851 if (info->flags & IEEE80211_TX_CTL_TX_OFFCHAN) {
1852 spin_lock_bh(&ar->data_lock);
1853 ATH10K_SKB_CB(skb)->htt.is_offchan = true;
1854 ATH10K_SKB_CB(skb)->vdev_id = ar->scan.vdev_id;
1855 spin_unlock_bh(&ar->data_lock);
1857 ath10k_dbg(ATH10K_DBG_MAC, "queued offchannel skb %p\n", skb);
1859 skb_queue_tail(&ar->offchan_tx_queue, skb);
1860 ieee80211_queue_work(hw, &ar->offchan_tx_work);
1864 ath10k_tx_htt(ar, skb);
1868 * Initialize various parameters with default vaules.
1870 void ath10k_halt(struct ath10k *ar)
1872 lockdep_assert_held(&ar->conf_mutex);
1874 del_timer_sync(&ar->scan.timeout);
1875 ath10k_offchan_tx_purge(ar);
1876 ath10k_mgmt_over_wmi_tx_purge(ar);
1877 ath10k_peer_cleanup_all(ar);
1878 ath10k_core_stop(ar);
1879 ath10k_hif_power_down(ar);
1881 spin_lock_bh(&ar->data_lock);
1882 if (ar->scan.in_progress) {
1883 del_timer(&ar->scan.timeout);
1884 ar->scan.in_progress = false;
1885 ieee80211_scan_completed(ar->hw, true);
1887 spin_unlock_bh(&ar->data_lock);
1890 static int ath10k_start(struct ieee80211_hw *hw)
1892 struct ath10k *ar = hw->priv;
1895 mutex_lock(&ar->conf_mutex);
1897 if (ar->state != ATH10K_STATE_OFF &&
1898 ar->state != ATH10K_STATE_RESTARTING) {
1903 ret = ath10k_hif_power_up(ar);
1905 ath10k_err("could not init hif (%d)\n", ret);
1906 ar->state = ATH10K_STATE_OFF;
1910 ret = ath10k_core_start(ar);
1912 ath10k_err("could not init core (%d)\n", ret);
1913 ath10k_hif_power_down(ar);
1914 ar->state = ATH10K_STATE_OFF;
1918 if (ar->state == ATH10K_STATE_OFF)
1919 ar->state = ATH10K_STATE_ON;
1920 else if (ar->state == ATH10K_STATE_RESTARTING)
1921 ar->state = ATH10K_STATE_RESTARTED;
1923 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->pmf_qos, 1);
1925 ath10k_warn("could not enable WMI_PDEV_PARAM_PMF_QOS (%d)\n",
1928 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->dynamic_bw, 0);
1930 ath10k_warn("could not init WMI_PDEV_PARAM_DYNAMIC_BW (%d)\n",
1933 ath10k_regd_update(ar);
1936 mutex_unlock(&ar->conf_mutex);
1940 static void ath10k_stop(struct ieee80211_hw *hw)
1942 struct ath10k *ar = hw->priv;
1944 mutex_lock(&ar->conf_mutex);
1945 if (ar->state == ATH10K_STATE_ON ||
1946 ar->state == ATH10K_STATE_RESTARTED ||
1947 ar->state == ATH10K_STATE_WEDGED)
1950 ar->state = ATH10K_STATE_OFF;
1951 mutex_unlock(&ar->conf_mutex);
1953 ath10k_mgmt_over_wmi_tx_purge(ar);
1955 cancel_work_sync(&ar->offchan_tx_work);
1956 cancel_work_sync(&ar->wmi_mgmt_tx_work);
1957 cancel_work_sync(&ar->restart_work);
1960 static int ath10k_config_ps(struct ath10k *ar)
1962 struct ath10k_vif *arvif;
1965 lockdep_assert_held(&ar->conf_mutex);
1967 /* During HW reconfiguration mac80211 reports all interfaces that were
1968 * running until reconfiguration was started. Since FW doesn't have any
1969 * vdevs at this point we must not iterate over this interface list.
1970 * This setting will be updated upon add_interface(). */
1971 if (ar->state == ATH10K_STATE_RESTARTED)
1974 list_for_each_entry(arvif, &ar->arvifs, list) {
1975 ret = ath10k_mac_vif_setup_ps(arvif);
1977 ath10k_warn("could not setup powersave (%d)\n", ret);
1985 static int ath10k_config(struct ieee80211_hw *hw, u32 changed)
1987 struct ath10k *ar = hw->priv;
1988 struct ieee80211_conf *conf = &hw->conf;
1991 mutex_lock(&ar->conf_mutex);
1993 if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
1994 ath10k_dbg(ATH10K_DBG_MAC, "mac config channel %d mhz\n",
1995 conf->chandef.chan->center_freq);
1996 spin_lock_bh(&ar->data_lock);
1997 ar->rx_channel = conf->chandef.chan;
1998 spin_unlock_bh(&ar->data_lock);
2001 if (changed & IEEE80211_CONF_CHANGE_PS)
2002 ath10k_config_ps(ar);
2004 if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
2005 if (conf->flags & IEEE80211_CONF_MONITOR)
2006 ret = ath10k_monitor_create(ar);
2008 ret = ath10k_monitor_destroy(ar);
2011 mutex_unlock(&ar->conf_mutex);
2017 * Figure out how to handle WMI_VDEV_SUBTYPE_P2P_DEVICE,
2018 * because we will send mgmt frames without CCK. This requirement
2019 * for P2P_FIND/GO_NEG should be handled by checking CCK flag
2022 static int ath10k_add_interface(struct ieee80211_hw *hw,
2023 struct ieee80211_vif *vif)
2025 struct ath10k *ar = hw->priv;
2026 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2027 enum wmi_sta_powersave_param param;
2033 mutex_lock(&ar->conf_mutex);
2035 memset(arvif, 0, sizeof(*arvif));
2040 INIT_WORK(&arvif->wep_key_work, ath10k_tx_wep_key_work);
2042 if ((vif->type == NL80211_IFTYPE_MONITOR) && ar->monitor_present) {
2043 ath10k_warn("Only one monitor interface allowed\n");
2048 bit = ffs(ar->free_vdev_map);
2054 arvif->vdev_id = bit - 1;
2055 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE;
2058 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_DEVICE;
2060 switch (vif->type) {
2061 case NL80211_IFTYPE_UNSPECIFIED:
2062 case NL80211_IFTYPE_STATION:
2063 arvif->vdev_type = WMI_VDEV_TYPE_STA;
2065 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_CLIENT;
2067 case NL80211_IFTYPE_ADHOC:
2068 arvif->vdev_type = WMI_VDEV_TYPE_IBSS;
2070 case NL80211_IFTYPE_AP:
2071 arvif->vdev_type = WMI_VDEV_TYPE_AP;
2074 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_GO;
2076 case NL80211_IFTYPE_MONITOR:
2077 arvif->vdev_type = WMI_VDEV_TYPE_MONITOR;
2084 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev create %d (add interface) type %d subtype %d\n",
2085 arvif->vdev_id, arvif->vdev_type, arvif->vdev_subtype);
2087 ret = ath10k_wmi_vdev_create(ar, arvif->vdev_id, arvif->vdev_type,
2088 arvif->vdev_subtype, vif->addr);
2090 ath10k_warn("WMI vdev create failed: ret %d\n", ret);
2094 ar->free_vdev_map &= ~BIT(arvif->vdev_id);
2095 list_add(&arvif->list, &ar->arvifs);
2097 vdev_param = ar->wmi.vdev_param->def_keyid;
2098 ret = ath10k_wmi_vdev_set_param(ar, 0, vdev_param,
2099 arvif->def_wep_key_idx);
2101 ath10k_warn("Failed to set default keyid: %d\n", ret);
2102 goto err_vdev_delete;
2105 vdev_param = ar->wmi.vdev_param->tx_encap_type;
2106 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
2107 ATH10K_HW_TXRX_NATIVE_WIFI);
2108 /* 10.X firmware does not support this VDEV parameter. Do not warn */
2109 if (ret && ret != -EOPNOTSUPP) {
2110 ath10k_warn("Failed to set TX encap: %d\n", ret);
2111 goto err_vdev_delete;
2114 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
2115 ret = ath10k_peer_create(ar, arvif->vdev_id, vif->addr);
2117 ath10k_warn("Failed to create peer for AP: %d\n", ret);
2118 goto err_vdev_delete;
2122 if (arvif->vdev_type == WMI_VDEV_TYPE_STA) {
2123 param = WMI_STA_PS_PARAM_RX_WAKE_POLICY;
2124 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
2125 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
2128 ath10k_warn("Failed to set RX wake policy: %d\n", ret);
2129 goto err_peer_delete;
2132 param = WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD;
2133 value = WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS;
2134 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
2137 ath10k_warn("Failed to set TX wake thresh: %d\n", ret);
2138 goto err_peer_delete;
2141 param = WMI_STA_PS_PARAM_PSPOLL_COUNT;
2142 value = WMI_STA_PS_PSPOLL_COUNT_NO_MAX;
2143 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
2146 ath10k_warn("Failed to set PSPOLL count: %d\n", ret);
2147 goto err_peer_delete;
2151 ret = ath10k_mac_set_rts(arvif, ar->hw->wiphy->rts_threshold);
2153 ath10k_warn("failed to set rts threshold for vdev %d (%d)\n",
2154 arvif->vdev_id, ret);
2155 goto err_peer_delete;
2158 ret = ath10k_mac_set_frag(arvif, ar->hw->wiphy->frag_threshold);
2160 ath10k_warn("failed to set frag threshold for vdev %d (%d)\n",
2161 arvif->vdev_id, ret);
2162 goto err_peer_delete;
2165 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
2166 ar->monitor_present = true;
2168 mutex_unlock(&ar->conf_mutex);
2172 if (arvif->vdev_type == WMI_VDEV_TYPE_AP)
2173 ath10k_wmi_peer_delete(ar, arvif->vdev_id, vif->addr);
2176 ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
2177 ar->free_vdev_map &= ~BIT(arvif->vdev_id);
2178 list_del(&arvif->list);
2181 mutex_unlock(&ar->conf_mutex);
2186 static void ath10k_remove_interface(struct ieee80211_hw *hw,
2187 struct ieee80211_vif *vif)
2189 struct ath10k *ar = hw->priv;
2190 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2193 mutex_lock(&ar->conf_mutex);
2195 cancel_work_sync(&arvif->wep_key_work);
2197 spin_lock_bh(&ar->data_lock);
2198 if (arvif->beacon) {
2199 dev_kfree_skb_any(arvif->beacon);
2200 arvif->beacon = NULL;
2202 spin_unlock_bh(&ar->data_lock);
2204 ar->free_vdev_map |= 1 << (arvif->vdev_id);
2205 list_del(&arvif->list);
2207 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
2208 ret = ath10k_peer_delete(arvif->ar, arvif->vdev_id, vif->addr);
2210 ath10k_warn("Failed to remove peer for AP: %d\n", ret);
2212 kfree(arvif->u.ap.noa_data);
2215 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev delete %d (remove interface)\n",
2218 ret = ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
2220 ath10k_warn("WMI vdev delete failed: %d\n", ret);
2222 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
2223 ar->monitor_present = false;
2225 ath10k_peer_cleanup(ar, arvif->vdev_id);
2227 mutex_unlock(&ar->conf_mutex);
2231 * FIXME: Has to be verified.
2233 #define SUPPORTED_FILTERS \
2234 (FIF_PROMISC_IN_BSS | \
2239 FIF_BCN_PRBRESP_PROMISC | \
2243 static void ath10k_configure_filter(struct ieee80211_hw *hw,
2244 unsigned int changed_flags,
2245 unsigned int *total_flags,
2248 struct ath10k *ar = hw->priv;
2251 mutex_lock(&ar->conf_mutex);
2253 changed_flags &= SUPPORTED_FILTERS;
2254 *total_flags &= SUPPORTED_FILTERS;
2255 ar->filter_flags = *total_flags;
2257 if ((ar->filter_flags & FIF_PROMISC_IN_BSS) &&
2258 !ar->monitor_enabled) {
2259 ath10k_dbg(ATH10K_DBG_MAC, "mac monitor %d start\n",
2260 ar->monitor_vdev_id);
2262 ret = ath10k_monitor_start(ar, ar->monitor_vdev_id);
2264 ath10k_warn("Unable to start monitor mode\n");
2265 } else if (!(ar->filter_flags & FIF_PROMISC_IN_BSS) &&
2266 ar->monitor_enabled) {
2267 ath10k_dbg(ATH10K_DBG_MAC, "mac monitor %d stop\n",
2268 ar->monitor_vdev_id);
2270 ret = ath10k_monitor_stop(ar);
2272 ath10k_warn("Unable to stop monitor mode\n");
2275 mutex_unlock(&ar->conf_mutex);
2278 static void ath10k_bss_info_changed(struct ieee80211_hw *hw,
2279 struct ieee80211_vif *vif,
2280 struct ieee80211_bss_conf *info,
2283 struct ath10k *ar = hw->priv;
2284 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2286 u32 vdev_param, pdev_param;
2288 mutex_lock(&ar->conf_mutex);
2290 if (changed & BSS_CHANGED_IBSS)
2291 ath10k_control_ibss(arvif, info, vif->addr);
2293 if (changed & BSS_CHANGED_BEACON_INT) {
2294 arvif->beacon_interval = info->beacon_int;
2295 vdev_param = ar->wmi.vdev_param->beacon_interval;
2296 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
2297 arvif->beacon_interval);
2298 ath10k_dbg(ATH10K_DBG_MAC,
2299 "mac vdev %d beacon_interval %d\n",
2300 arvif->vdev_id, arvif->beacon_interval);
2303 ath10k_warn("Failed to set beacon interval for VDEV: %d\n",
2307 if (changed & BSS_CHANGED_BEACON) {
2308 ath10k_dbg(ATH10K_DBG_MAC,
2309 "vdev %d set beacon tx mode to staggered\n",
2312 pdev_param = ar->wmi.pdev_param->beacon_tx_mode;
2313 ret = ath10k_wmi_pdev_set_param(ar, pdev_param,
2314 WMI_BEACON_STAGGERED_MODE);
2316 ath10k_warn("Failed to set beacon mode for VDEV: %d\n",
2320 if (changed & BSS_CHANGED_BEACON_INFO) {
2321 arvif->dtim_period = info->dtim_period;
2323 ath10k_dbg(ATH10K_DBG_MAC,
2324 "mac vdev %d dtim_period %d\n",
2325 arvif->vdev_id, arvif->dtim_period);
2327 vdev_param = ar->wmi.vdev_param->dtim_period;
2328 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
2329 arvif->dtim_period);
2331 ath10k_warn("Failed to set dtim period for VDEV: %d\n",
2335 if (changed & BSS_CHANGED_SSID &&
2336 vif->type == NL80211_IFTYPE_AP) {
2337 arvif->u.ap.ssid_len = info->ssid_len;
2339 memcpy(arvif->u.ap.ssid, info->ssid, info->ssid_len);
2340 arvif->u.ap.hidden_ssid = info->hidden_ssid;
2343 if (changed & BSS_CHANGED_BSSID) {
2344 if (!is_zero_ether_addr(info->bssid)) {
2345 ath10k_dbg(ATH10K_DBG_MAC,
2346 "mac vdev %d create peer %pM\n",
2347 arvif->vdev_id, info->bssid);
2349 ret = ath10k_peer_create(ar, arvif->vdev_id,
2352 ath10k_warn("Failed to add peer: %pM for VDEV: %d\n",
2353 info->bssid, arvif->vdev_id);
2355 if (vif->type == NL80211_IFTYPE_STATION) {
2357 * this is never erased as we it for crypto key
2358 * clearing; this is FW requirement
2360 memcpy(arvif->u.sta.bssid, info->bssid,
2363 ath10k_dbg(ATH10K_DBG_MAC,
2364 "mac vdev %d start %pM\n",
2365 arvif->vdev_id, info->bssid);
2367 /* FIXME: check return value */
2368 ret = ath10k_vdev_start(arvif);
2372 * Mac80211 does not keep IBSS bssid when leaving IBSS,
2373 * so driver need to store it. It is needed when leaving
2374 * IBSS in order to remove BSSID peer.
2376 if (vif->type == NL80211_IFTYPE_ADHOC)
2377 memcpy(arvif->u.ibss.bssid, info->bssid,
2382 if (changed & BSS_CHANGED_BEACON_ENABLED)
2383 ath10k_control_beaconing(arvif, info);
2385 if (changed & BSS_CHANGED_ERP_CTS_PROT) {
2387 if (info->use_cts_prot)
2392 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d cts_prot %d\n",
2393 arvif->vdev_id, cts_prot);
2395 vdev_param = ar->wmi.vdev_param->enable_rtscts;
2396 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
2399 ath10k_warn("Failed to set CTS prot for VDEV: %d\n",
2403 if (changed & BSS_CHANGED_ERP_SLOT) {
2405 if (info->use_short_slot)
2406 slottime = WMI_VDEV_SLOT_TIME_SHORT; /* 9us */
2409 slottime = WMI_VDEV_SLOT_TIME_LONG; /* 20us */
2411 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d slot_time %d\n",
2412 arvif->vdev_id, slottime);
2414 vdev_param = ar->wmi.vdev_param->slot_time;
2415 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
2418 ath10k_warn("Failed to set erp slot for VDEV: %d\n",
2422 if (changed & BSS_CHANGED_ERP_PREAMBLE) {
2424 if (info->use_short_preamble)
2425 preamble = WMI_VDEV_PREAMBLE_SHORT;
2427 preamble = WMI_VDEV_PREAMBLE_LONG;
2429 ath10k_dbg(ATH10K_DBG_MAC,
2430 "mac vdev %d preamble %dn",
2431 arvif->vdev_id, preamble);
2433 vdev_param = ar->wmi.vdev_param->preamble;
2434 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
2437 ath10k_warn("Failed to set preamble for VDEV: %d\n",
2441 if (changed & BSS_CHANGED_ASSOC) {
2443 ath10k_bss_assoc(hw, vif, info);
2446 mutex_unlock(&ar->conf_mutex);
2449 static int ath10k_hw_scan(struct ieee80211_hw *hw,
2450 struct ieee80211_vif *vif,
2451 struct cfg80211_scan_request *req)
2453 struct ath10k *ar = hw->priv;
2454 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2455 struct wmi_start_scan_arg arg;
2459 mutex_lock(&ar->conf_mutex);
2461 spin_lock_bh(&ar->data_lock);
2462 if (ar->scan.in_progress) {
2463 spin_unlock_bh(&ar->data_lock);
2468 INIT_COMPLETION(ar->scan.started);
2469 INIT_COMPLETION(ar->scan.completed);
2470 ar->scan.in_progress = true;
2471 ar->scan.aborting = false;
2472 ar->scan.is_roc = false;
2473 ar->scan.vdev_id = arvif->vdev_id;
2474 spin_unlock_bh(&ar->data_lock);
2476 memset(&arg, 0, sizeof(arg));
2477 ath10k_wmi_start_scan_init(ar, &arg);
2478 arg.vdev_id = arvif->vdev_id;
2479 arg.scan_id = ATH10K_SCAN_ID;
2482 arg.scan_ctrl_flags |= WMI_SCAN_ADD_CCK_RATES;
2485 arg.ie_len = req->ie_len;
2486 memcpy(arg.ie, req->ie, arg.ie_len);
2490 arg.n_ssids = req->n_ssids;
2491 for (i = 0; i < arg.n_ssids; i++) {
2492 arg.ssids[i].len = req->ssids[i].ssid_len;
2493 arg.ssids[i].ssid = req->ssids[i].ssid;
2496 arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
2499 if (req->n_channels) {
2500 arg.n_channels = req->n_channels;
2501 for (i = 0; i < arg.n_channels; i++)
2502 arg.channels[i] = req->channels[i]->center_freq;
2505 ret = ath10k_start_scan(ar, &arg);
2507 ath10k_warn("could not start hw scan (%d)\n", ret);
2508 spin_lock_bh(&ar->data_lock);
2509 ar->scan.in_progress = false;
2510 spin_unlock_bh(&ar->data_lock);
2514 mutex_unlock(&ar->conf_mutex);
2518 static void ath10k_cancel_hw_scan(struct ieee80211_hw *hw,
2519 struct ieee80211_vif *vif)
2521 struct ath10k *ar = hw->priv;
2524 mutex_lock(&ar->conf_mutex);
2525 ret = ath10k_abort_scan(ar);
2527 ath10k_warn("couldn't abort scan (%d). forcefully sending scan completion to mac80211\n",
2529 ieee80211_scan_completed(hw, 1 /* aborted */);
2531 mutex_unlock(&ar->conf_mutex);
2534 static int ath10k_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
2535 struct ieee80211_vif *vif, struct ieee80211_sta *sta,
2536 struct ieee80211_key_conf *key)
2538 struct ath10k *ar = hw->priv;
2539 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2540 struct ath10k_peer *peer;
2541 const u8 *peer_addr;
2542 bool is_wep = key->cipher == WLAN_CIPHER_SUITE_WEP40 ||
2543 key->cipher == WLAN_CIPHER_SUITE_WEP104;
2546 if (key->keyidx > WMI_MAX_KEY_INDEX)
2549 mutex_lock(&ar->conf_mutex);
2552 peer_addr = sta->addr;
2553 else if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
2554 peer_addr = vif->bss_conf.bssid;
2556 peer_addr = vif->addr;
2558 key->hw_key_idx = key->keyidx;
2560 /* the peer should not disappear in mid-way (unless FW goes awry) since
2561 * we already hold conf_mutex. we just make sure its there now. */
2562 spin_lock_bh(&ar->data_lock);
2563 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
2564 spin_unlock_bh(&ar->data_lock);
2567 if (cmd == SET_KEY) {
2568 ath10k_warn("cannot install key for non-existent peer %pM\n",
2573 /* if the peer doesn't exist there is no key to disable
2581 arvif->wep_keys[key->keyidx] = key;
2583 arvif->wep_keys[key->keyidx] = NULL;
2585 if (cmd == DISABLE_KEY)
2586 ath10k_clear_vdev_key(arvif, key);
2589 ret = ath10k_install_key(arvif, key, cmd, peer_addr);
2591 ath10k_warn("ath10k_install_key failed (%d)\n", ret);
2595 spin_lock_bh(&ar->data_lock);
2596 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
2597 if (peer && cmd == SET_KEY)
2598 peer->keys[key->keyidx] = key;
2599 else if (peer && cmd == DISABLE_KEY)
2600 peer->keys[key->keyidx] = NULL;
2601 else if (peer == NULL)
2602 /* impossible unless FW goes crazy */
2603 ath10k_warn("peer %pM disappeared!\n", peer_addr);
2604 spin_unlock_bh(&ar->data_lock);
2607 mutex_unlock(&ar->conf_mutex);
2611 static int ath10k_sta_state(struct ieee80211_hw *hw,
2612 struct ieee80211_vif *vif,
2613 struct ieee80211_sta *sta,
2614 enum ieee80211_sta_state old_state,
2615 enum ieee80211_sta_state new_state)
2617 struct ath10k *ar = hw->priv;
2618 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2621 mutex_lock(&ar->conf_mutex);
2623 if (old_state == IEEE80211_STA_NOTEXIST &&
2624 new_state == IEEE80211_STA_NONE &&
2625 vif->type != NL80211_IFTYPE_STATION) {
2627 * New station addition.
2629 ath10k_dbg(ATH10K_DBG_MAC,
2630 "mac vdev %d peer create %pM (new sta)\n",
2631 arvif->vdev_id, sta->addr);
2633 ret = ath10k_peer_create(ar, arvif->vdev_id, sta->addr);
2635 ath10k_warn("Failed to add peer: %pM for VDEV: %d\n",
2636 sta->addr, arvif->vdev_id);
2637 } else if ((old_state == IEEE80211_STA_NONE &&
2638 new_state == IEEE80211_STA_NOTEXIST)) {
2640 * Existing station deletion.
2642 ath10k_dbg(ATH10K_DBG_MAC,
2643 "mac vdev %d peer delete %pM (sta gone)\n",
2644 arvif->vdev_id, sta->addr);
2645 ret = ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
2647 ath10k_warn("Failed to delete peer: %pM for VDEV: %d\n",
2648 sta->addr, arvif->vdev_id);
2650 if (vif->type == NL80211_IFTYPE_STATION)
2651 ath10k_bss_disassoc(hw, vif);
2652 } else if (old_state == IEEE80211_STA_AUTH &&
2653 new_state == IEEE80211_STA_ASSOC &&
2654 (vif->type == NL80211_IFTYPE_AP ||
2655 vif->type == NL80211_IFTYPE_ADHOC)) {
2659 ath10k_dbg(ATH10K_DBG_MAC, "mac sta %pM associated\n",
2662 ret = ath10k_station_assoc(ar, arvif, sta);
2664 ath10k_warn("Failed to associate station: %pM\n",
2666 } else if (old_state == IEEE80211_STA_ASSOC &&
2667 new_state == IEEE80211_STA_AUTH &&
2668 (vif->type == NL80211_IFTYPE_AP ||
2669 vif->type == NL80211_IFTYPE_ADHOC)) {
2673 ath10k_dbg(ATH10K_DBG_MAC, "mac sta %pM disassociated\n",
2676 ret = ath10k_station_disassoc(ar, arvif, sta);
2678 ath10k_warn("Failed to disassociate station: %pM\n",
2682 mutex_unlock(&ar->conf_mutex);
2686 static int ath10k_conf_tx_uapsd(struct ath10k *ar, struct ieee80211_vif *vif,
2687 u16 ac, bool enable)
2689 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2693 lockdep_assert_held(&ar->conf_mutex);
2695 if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
2699 case IEEE80211_AC_VO:
2700 value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN |
2701 WMI_STA_PS_UAPSD_AC3_TRIGGER_EN;
2703 case IEEE80211_AC_VI:
2704 value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN |
2705 WMI_STA_PS_UAPSD_AC2_TRIGGER_EN;
2707 case IEEE80211_AC_BE:
2708 value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN |
2709 WMI_STA_PS_UAPSD_AC1_TRIGGER_EN;
2711 case IEEE80211_AC_BK:
2712 value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN |
2713 WMI_STA_PS_UAPSD_AC0_TRIGGER_EN;
2718 arvif->u.sta.uapsd |= value;
2720 arvif->u.sta.uapsd &= ~value;
2722 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
2723 WMI_STA_PS_PARAM_UAPSD,
2724 arvif->u.sta.uapsd);
2726 ath10k_warn("could not set uapsd params %d\n", ret);
2730 if (arvif->u.sta.uapsd)
2731 value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD;
2733 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
2735 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
2736 WMI_STA_PS_PARAM_RX_WAKE_POLICY,
2739 ath10k_warn("could not set rx wake param %d\n", ret);
2745 static int ath10k_conf_tx(struct ieee80211_hw *hw,
2746 struct ieee80211_vif *vif, u16 ac,
2747 const struct ieee80211_tx_queue_params *params)
2749 struct ath10k *ar = hw->priv;
2750 struct wmi_wmm_params_arg *p = NULL;
2753 mutex_lock(&ar->conf_mutex);
2756 case IEEE80211_AC_VO:
2757 p = &ar->wmm_params.ac_vo;
2759 case IEEE80211_AC_VI:
2760 p = &ar->wmm_params.ac_vi;
2762 case IEEE80211_AC_BE:
2763 p = &ar->wmm_params.ac_be;
2765 case IEEE80211_AC_BK:
2766 p = &ar->wmm_params.ac_bk;
2775 p->cwmin = params->cw_min;
2776 p->cwmax = params->cw_max;
2777 p->aifs = params->aifs;
2780 * The channel time duration programmed in the HW is in absolute
2781 * microseconds, while mac80211 gives the txop in units of
2784 p->txop = params->txop * 32;
2786 /* FIXME: FW accepts wmm params per hw, not per vif */
2787 ret = ath10k_wmi_pdev_set_wmm_params(ar, &ar->wmm_params);
2789 ath10k_warn("could not set wmm params %d\n", ret);
2793 ret = ath10k_conf_tx_uapsd(ar, vif, ac, params->uapsd);
2795 ath10k_warn("could not set sta uapsd %d\n", ret);
2798 mutex_unlock(&ar->conf_mutex);
2802 #define ATH10K_ROC_TIMEOUT_HZ (2*HZ)
2804 static int ath10k_remain_on_channel(struct ieee80211_hw *hw,
2805 struct ieee80211_vif *vif,
2806 struct ieee80211_channel *chan,
2808 enum ieee80211_roc_type type)
2810 struct ath10k *ar = hw->priv;
2811 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2812 struct wmi_start_scan_arg arg;
2815 mutex_lock(&ar->conf_mutex);
2817 spin_lock_bh(&ar->data_lock);
2818 if (ar->scan.in_progress) {
2819 spin_unlock_bh(&ar->data_lock);
2824 INIT_COMPLETION(ar->scan.started);
2825 INIT_COMPLETION(ar->scan.completed);
2826 INIT_COMPLETION(ar->scan.on_channel);
2827 ar->scan.in_progress = true;
2828 ar->scan.aborting = false;
2829 ar->scan.is_roc = true;
2830 ar->scan.vdev_id = arvif->vdev_id;
2831 ar->scan.roc_freq = chan->center_freq;
2832 spin_unlock_bh(&ar->data_lock);
2834 memset(&arg, 0, sizeof(arg));
2835 ath10k_wmi_start_scan_init(ar, &arg);
2836 arg.vdev_id = arvif->vdev_id;
2837 arg.scan_id = ATH10K_SCAN_ID;
2839 arg.channels[0] = chan->center_freq;
2840 arg.dwell_time_active = duration;
2841 arg.dwell_time_passive = duration;
2842 arg.max_scan_time = 2 * duration;
2843 arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
2844 arg.scan_ctrl_flags |= WMI_SCAN_FILTER_PROBE_REQ;
2846 ret = ath10k_start_scan(ar, &arg);
2848 ath10k_warn("could not start roc scan (%d)\n", ret);
2849 spin_lock_bh(&ar->data_lock);
2850 ar->scan.in_progress = false;
2851 spin_unlock_bh(&ar->data_lock);
2855 ret = wait_for_completion_timeout(&ar->scan.on_channel, 3*HZ);
2857 ath10k_warn("could not switch to channel for roc scan\n");
2858 ath10k_abort_scan(ar);
2865 mutex_unlock(&ar->conf_mutex);
2869 static int ath10k_cancel_remain_on_channel(struct ieee80211_hw *hw)
2871 struct ath10k *ar = hw->priv;
2873 mutex_lock(&ar->conf_mutex);
2874 ath10k_abort_scan(ar);
2875 mutex_unlock(&ar->conf_mutex);
2881 * Both RTS and Fragmentation threshold are interface-specific
2882 * in ath10k, but device-specific in mac80211.
2885 static int ath10k_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
2887 struct ath10k *ar = hw->priv;
2888 struct ath10k_vif *arvif;
2891 /* During HW reconfiguration mac80211 reports all interfaces that were
2892 * running until reconfiguration was started. Since FW doesn't have any
2893 * vdevs at this point we must not iterate over this interface list.
2894 * This setting will be updated upon add_interface(). */
2895 if (ar->state == ATH10K_STATE_RESTARTED)
2898 mutex_lock(&ar->conf_mutex);
2899 list_for_each_entry(arvif, &ar->arvifs, list) {
2900 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d rts threshold %d\n",
2901 arvif->vdev_id, value);
2903 ret = ath10k_mac_set_rts(arvif, value);
2905 ath10k_warn("could not set rts threshold for vdev %d (%d)\n",
2906 arvif->vdev_id, ret);
2910 mutex_unlock(&ar->conf_mutex);
2915 static int ath10k_set_frag_threshold(struct ieee80211_hw *hw, u32 value)
2917 struct ath10k *ar = hw->priv;
2918 struct ath10k_vif *arvif;
2921 /* During HW reconfiguration mac80211 reports all interfaces that were
2922 * running until reconfiguration was started. Since FW doesn't have any
2923 * vdevs at this point we must not iterate over this interface list.
2924 * This setting will be updated upon add_interface(). */
2925 if (ar->state == ATH10K_STATE_RESTARTED)
2928 mutex_lock(&ar->conf_mutex);
2929 list_for_each_entry(arvif, &ar->arvifs, list) {
2930 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d fragmentation threshold %d\n",
2931 arvif->vdev_id, value);
2933 ret = ath10k_mac_set_rts(arvif, value);
2935 ath10k_warn("could not set fragmentation threshold for vdev %d (%d)\n",
2936 arvif->vdev_id, ret);
2940 mutex_unlock(&ar->conf_mutex);
2945 static void ath10k_flush(struct ieee80211_hw *hw, u32 queues, bool drop)
2947 struct ath10k *ar = hw->priv;
2951 /* mac80211 doesn't care if we really xmit queued frames or not
2952 * we'll collect those frames either way if we stop/delete vdevs */
2956 mutex_lock(&ar->conf_mutex);
2958 if (ar->state == ATH10K_STATE_WEDGED)
2961 ret = wait_event_timeout(ar->htt.empty_tx_wq, ({
2964 spin_lock_bh(&ar->htt.tx_lock);
2965 empty = (ar->htt.num_pending_tx == 0);
2966 spin_unlock_bh(&ar->htt.tx_lock);
2968 skip = (ar->state == ATH10K_STATE_WEDGED);
2971 }), ATH10K_FLUSH_TIMEOUT_HZ);
2973 if (ret <= 0 || skip)
2974 ath10k_warn("tx not flushed\n");
2977 mutex_unlock(&ar->conf_mutex);
2980 /* TODO: Implement this function properly
2981 * For now it is needed to reply to Probe Requests in IBSS mode.
2982 * Propably we need this information from FW.
2984 static int ath10k_tx_last_beacon(struct ieee80211_hw *hw)
2990 static int ath10k_suspend(struct ieee80211_hw *hw,
2991 struct cfg80211_wowlan *wowlan)
2993 struct ath10k *ar = hw->priv;
2996 ar->is_target_paused = false;
2998 ret = ath10k_wmi_pdev_suspend_target(ar);
3000 ath10k_warn("could not suspend target (%d)\n", ret);
3004 ret = wait_event_interruptible_timeout(ar->event_queue,
3005 ar->is_target_paused == true,
3008 ath10k_warn("suspend interrupted (%d)\n", ret);
3010 } else if (ret == 0) {
3011 ath10k_warn("suspend timed out - target pause event never came\n");
3015 ret = ath10k_hif_suspend(ar);
3017 ath10k_warn("could not suspend hif (%d)\n", ret);
3023 ret = ath10k_wmi_pdev_resume_target(ar);
3025 ath10k_warn("could not resume target (%d)\n", ret);
3029 static int ath10k_resume(struct ieee80211_hw *hw)
3031 struct ath10k *ar = hw->priv;
3034 ret = ath10k_hif_resume(ar);
3036 ath10k_warn("could not resume hif (%d)\n", ret);
3040 ret = ath10k_wmi_pdev_resume_target(ar);
3042 ath10k_warn("could not resume target (%d)\n", ret);
3050 static void ath10k_restart_complete(struct ieee80211_hw *hw)
3052 struct ath10k *ar = hw->priv;
3054 mutex_lock(&ar->conf_mutex);
3056 /* If device failed to restart it will be in a different state, e.g.
3057 * ATH10K_STATE_WEDGED */
3058 if (ar->state == ATH10K_STATE_RESTARTED) {
3059 ath10k_info("device successfully recovered\n");
3060 ar->state = ATH10K_STATE_ON;
3063 mutex_unlock(&ar->conf_mutex);
3066 static int ath10k_get_survey(struct ieee80211_hw *hw, int idx,
3067 struct survey_info *survey)
3069 struct ath10k *ar = hw->priv;
3070 struct ieee80211_supported_band *sband;
3071 struct survey_info *ar_survey = &ar->survey[idx];
3074 mutex_lock(&ar->conf_mutex);
3076 sband = hw->wiphy->bands[IEEE80211_BAND_2GHZ];
3077 if (sband && idx >= sband->n_channels) {
3078 idx -= sband->n_channels;
3083 sband = hw->wiphy->bands[IEEE80211_BAND_5GHZ];
3085 if (!sband || idx >= sband->n_channels) {
3090 spin_lock_bh(&ar->data_lock);
3091 memcpy(survey, ar_survey, sizeof(*survey));
3092 spin_unlock_bh(&ar->data_lock);
3094 survey->channel = &sband->channels[idx];
3097 mutex_unlock(&ar->conf_mutex);
3101 static const struct ieee80211_ops ath10k_ops = {
3103 .start = ath10k_start,
3104 .stop = ath10k_stop,
3105 .config = ath10k_config,
3106 .add_interface = ath10k_add_interface,
3107 .remove_interface = ath10k_remove_interface,
3108 .configure_filter = ath10k_configure_filter,
3109 .bss_info_changed = ath10k_bss_info_changed,
3110 .hw_scan = ath10k_hw_scan,
3111 .cancel_hw_scan = ath10k_cancel_hw_scan,
3112 .set_key = ath10k_set_key,
3113 .sta_state = ath10k_sta_state,
3114 .conf_tx = ath10k_conf_tx,
3115 .remain_on_channel = ath10k_remain_on_channel,
3116 .cancel_remain_on_channel = ath10k_cancel_remain_on_channel,
3117 .set_rts_threshold = ath10k_set_rts_threshold,
3118 .set_frag_threshold = ath10k_set_frag_threshold,
3119 .flush = ath10k_flush,
3120 .tx_last_beacon = ath10k_tx_last_beacon,
3121 .restart_complete = ath10k_restart_complete,
3122 .get_survey = ath10k_get_survey,
3124 .suspend = ath10k_suspend,
3125 .resume = ath10k_resume,
3129 #define RATETAB_ENT(_rate, _rateid, _flags) { \
3130 .bitrate = (_rate), \
3131 .flags = (_flags), \
3132 .hw_value = (_rateid), \
3135 #define CHAN2G(_channel, _freq, _flags) { \
3136 .band = IEEE80211_BAND_2GHZ, \
3137 .hw_value = (_channel), \
3138 .center_freq = (_freq), \
3139 .flags = (_flags), \
3140 .max_antenna_gain = 0, \
3144 #define CHAN5G(_channel, _freq, _flags) { \
3145 .band = IEEE80211_BAND_5GHZ, \
3146 .hw_value = (_channel), \
3147 .center_freq = (_freq), \
3148 .flags = (_flags), \
3149 .max_antenna_gain = 0, \
3153 static const struct ieee80211_channel ath10k_2ghz_channels[] = {
3163 CHAN2G(10, 2457, 0),
3164 CHAN2G(11, 2462, 0),
3165 CHAN2G(12, 2467, 0),
3166 CHAN2G(13, 2472, 0),
3167 CHAN2G(14, 2484, 0),
3170 static const struct ieee80211_channel ath10k_5ghz_channels[] = {
3171 CHAN5G(36, 5180, 0),
3172 CHAN5G(40, 5200, 0),
3173 CHAN5G(44, 5220, 0),
3174 CHAN5G(48, 5240, 0),
3175 CHAN5G(52, 5260, 0),
3176 CHAN5G(56, 5280, 0),
3177 CHAN5G(60, 5300, 0),
3178 CHAN5G(64, 5320, 0),
3179 CHAN5G(100, 5500, 0),
3180 CHAN5G(104, 5520, 0),
3181 CHAN5G(108, 5540, 0),
3182 CHAN5G(112, 5560, 0),
3183 CHAN5G(116, 5580, 0),
3184 CHAN5G(120, 5600, 0),
3185 CHAN5G(124, 5620, 0),
3186 CHAN5G(128, 5640, 0),
3187 CHAN5G(132, 5660, 0),
3188 CHAN5G(136, 5680, 0),
3189 CHAN5G(140, 5700, 0),
3190 CHAN5G(149, 5745, 0),
3191 CHAN5G(153, 5765, 0),
3192 CHAN5G(157, 5785, 0),
3193 CHAN5G(161, 5805, 0),
3194 CHAN5G(165, 5825, 0),
3197 static struct ieee80211_rate ath10k_rates[] = {
3199 RATETAB_ENT(10, 0x82, 0),
3200 RATETAB_ENT(20, 0x84, 0),
3201 RATETAB_ENT(55, 0x8b, 0),
3202 RATETAB_ENT(110, 0x96, 0),
3204 RATETAB_ENT(60, 0x0c, 0),
3205 RATETAB_ENT(90, 0x12, 0),
3206 RATETAB_ENT(120, 0x18, 0),
3207 RATETAB_ENT(180, 0x24, 0),
3208 RATETAB_ENT(240, 0x30, 0),
3209 RATETAB_ENT(360, 0x48, 0),
3210 RATETAB_ENT(480, 0x60, 0),
3211 RATETAB_ENT(540, 0x6c, 0),
3214 #define ath10k_a_rates (ath10k_rates + 4)
3215 #define ath10k_a_rates_size (ARRAY_SIZE(ath10k_rates) - 4)
3216 #define ath10k_g_rates (ath10k_rates + 0)
3217 #define ath10k_g_rates_size (ARRAY_SIZE(ath10k_rates))
3219 struct ath10k *ath10k_mac_create(void)
3221 struct ieee80211_hw *hw;
3224 hw = ieee80211_alloc_hw(sizeof(struct ath10k), &ath10k_ops);
3234 void ath10k_mac_destroy(struct ath10k *ar)
3236 ieee80211_free_hw(ar->hw);
3239 static const struct ieee80211_iface_limit ath10k_if_limits[] = {
3242 .types = BIT(NL80211_IFTYPE_STATION)
3243 | BIT(NL80211_IFTYPE_P2P_CLIENT)
3247 .types = BIT(NL80211_IFTYPE_P2P_GO)
3251 .types = BIT(NL80211_IFTYPE_AP)
3255 static const struct ieee80211_iface_combination ath10k_if_comb = {
3256 .limits = ath10k_if_limits,
3257 .n_limits = ARRAY_SIZE(ath10k_if_limits),
3258 .max_interfaces = 8,
3259 .num_different_channels = 1,
3260 .beacon_int_infra_match = true,
3263 static struct ieee80211_sta_vht_cap ath10k_create_vht_cap(struct ath10k *ar)
3265 struct ieee80211_sta_vht_cap vht_cap = {0};
3269 vht_cap.vht_supported = 1;
3270 vht_cap.cap = ar->vht_cap_info;
3273 for (i = 0; i < 8; i++) {
3274 if (i < ar->num_rf_chains)
3275 mcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i*2);
3277 mcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i*2);
3280 vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(mcs_map);
3281 vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(mcs_map);
3286 static struct ieee80211_sta_ht_cap ath10k_get_ht_cap(struct ath10k *ar)
3289 struct ieee80211_sta_ht_cap ht_cap = {0};
3291 if (!(ar->ht_cap_info & WMI_HT_CAP_ENABLED))
3294 ht_cap.ht_supported = 1;
3295 ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
3296 ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_8;
3297 ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
3298 ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
3299 ht_cap.cap |= WLAN_HT_CAP_SM_PS_STATIC << IEEE80211_HT_CAP_SM_PS_SHIFT;
3301 if (ar->ht_cap_info & WMI_HT_CAP_HT20_SGI)
3302 ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
3304 if (ar->ht_cap_info & WMI_HT_CAP_HT40_SGI)
3305 ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
3307 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) {
3310 smps = WLAN_HT_CAP_SM_PS_DYNAMIC;
3311 smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT;
3316 if (ar->ht_cap_info & WMI_HT_CAP_TX_STBC)
3317 ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC;
3319 if (ar->ht_cap_info & WMI_HT_CAP_RX_STBC) {
3322 stbc = ar->ht_cap_info;
3323 stbc &= WMI_HT_CAP_RX_STBC;
3324 stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT;
3325 stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT;
3326 stbc &= IEEE80211_HT_CAP_RX_STBC;
3331 if (ar->ht_cap_info & WMI_HT_CAP_LDPC)
3332 ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
3334 if (ar->ht_cap_info & WMI_HT_CAP_L_SIG_TXOP_PROT)
3335 ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
3337 /* max AMSDU is implicitly taken from vht_cap_info */
3338 if (ar->vht_cap_info & WMI_VHT_CAP_MAX_MPDU_LEN_MASK)
3339 ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU;
3341 for (i = 0; i < ar->num_rf_chains; i++)
3342 ht_cap.mcs.rx_mask[i] = 0xFF;
3344 ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
3350 static void ath10k_get_arvif_iter(void *data, u8 *mac,
3351 struct ieee80211_vif *vif)
3353 struct ath10k_vif_iter *arvif_iter = data;
3354 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3356 if (arvif->vdev_id == arvif_iter->vdev_id)
3357 arvif_iter->arvif = arvif;
3360 struct ath10k_vif *ath10k_get_arvif(struct ath10k *ar, u32 vdev_id)
3362 struct ath10k_vif_iter arvif_iter;
3365 memset(&arvif_iter, 0, sizeof(struct ath10k_vif_iter));
3366 arvif_iter.vdev_id = vdev_id;
3368 flags = IEEE80211_IFACE_ITER_RESUME_ALL;
3369 ieee80211_iterate_active_interfaces_atomic(ar->hw,
3371 ath10k_get_arvif_iter,
3373 if (!arvif_iter.arvif) {
3374 ath10k_warn("No VIF found for VDEV: %d\n", vdev_id);
3378 return arvif_iter.arvif;
3381 int ath10k_mac_register(struct ath10k *ar)
3383 struct ieee80211_supported_band *band;
3384 struct ieee80211_sta_vht_cap vht_cap;
3385 struct ieee80211_sta_ht_cap ht_cap;
3389 SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr);
3391 SET_IEEE80211_DEV(ar->hw, ar->dev);
3393 ht_cap = ath10k_get_ht_cap(ar);
3394 vht_cap = ath10k_create_vht_cap(ar);
3396 if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) {
3397 channels = kmemdup(ath10k_2ghz_channels,
3398 sizeof(ath10k_2ghz_channels),
3405 band = &ar->mac.sbands[IEEE80211_BAND_2GHZ];
3406 band->n_channels = ARRAY_SIZE(ath10k_2ghz_channels);
3407 band->channels = channels;
3408 band->n_bitrates = ath10k_g_rates_size;
3409 band->bitrates = ath10k_g_rates;
3410 band->ht_cap = ht_cap;
3412 /* vht is not supported in 2.4 GHz */
3414 ar->hw->wiphy->bands[IEEE80211_BAND_2GHZ] = band;
3417 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) {
3418 channels = kmemdup(ath10k_5ghz_channels,
3419 sizeof(ath10k_5ghz_channels),
3426 band = &ar->mac.sbands[IEEE80211_BAND_5GHZ];
3427 band->n_channels = ARRAY_SIZE(ath10k_5ghz_channels);
3428 band->channels = channels;
3429 band->n_bitrates = ath10k_a_rates_size;
3430 band->bitrates = ath10k_a_rates;
3431 band->ht_cap = ht_cap;
3432 band->vht_cap = vht_cap;
3433 ar->hw->wiphy->bands[IEEE80211_BAND_5GHZ] = band;
3436 ar->hw->wiphy->interface_modes =
3437 BIT(NL80211_IFTYPE_STATION) |
3438 BIT(NL80211_IFTYPE_ADHOC) |
3439 BIT(NL80211_IFTYPE_AP) |
3440 BIT(NL80211_IFTYPE_P2P_CLIENT) |
3441 BIT(NL80211_IFTYPE_P2P_GO);
3443 ar->hw->flags = IEEE80211_HW_SIGNAL_DBM |
3444 IEEE80211_HW_SUPPORTS_PS |
3445 IEEE80211_HW_SUPPORTS_DYNAMIC_PS |
3446 IEEE80211_HW_SUPPORTS_UAPSD |
3447 IEEE80211_HW_MFP_CAPABLE |
3448 IEEE80211_HW_REPORTS_TX_ACK_STATUS |
3449 IEEE80211_HW_HAS_RATE_CONTROL |
3450 IEEE80211_HW_SUPPORTS_STATIC_SMPS |
3451 IEEE80211_HW_WANT_MONITOR_VIF |
3452 IEEE80211_HW_AP_LINK_PS;
3454 /* MSDU can have HTT TX fragment pushed in front. The additional 4
3455 * bytes is used for padding/alignment if necessary. */
3456 ar->hw->extra_tx_headroom += sizeof(struct htt_data_tx_desc_frag)*2 + 4;
3458 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS)
3459 ar->hw->flags |= IEEE80211_HW_SUPPORTS_DYNAMIC_SMPS;
3461 if (ar->ht_cap_info & WMI_HT_CAP_ENABLED) {
3462 ar->hw->flags |= IEEE80211_HW_AMPDU_AGGREGATION;
3463 ar->hw->flags |= IEEE80211_HW_TX_AMPDU_SETUP_IN_HW;
3466 ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID;
3467 ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN;
3469 ar->hw->vif_data_size = sizeof(struct ath10k_vif);
3471 ar->hw->channel_change_time = 5000;
3472 ar->hw->max_listen_interval = ATH10K_MAX_HW_LISTEN_INTERVAL;
3474 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
3475 ar->hw->wiphy->max_remain_on_channel_duration = 5000;
3477 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
3479 * on LL hardware queues are managed entirely by the FW
3480 * so we only advertise to mac we can do the queues thing
3484 ar->hw->wiphy->iface_combinations = &ath10k_if_comb;
3485 ar->hw->wiphy->n_iface_combinations = 1;
3487 ar->hw->netdev_features = NETIF_F_HW_CSUM;
3489 ret = ath_regd_init(&ar->ath_common.regulatory, ar->hw->wiphy,
3490 ath10k_reg_notifier);
3492 ath10k_err("Regulatory initialization failed\n");
3496 ret = ieee80211_register_hw(ar->hw);
3498 ath10k_err("ieee80211 registration failed: %d\n", ret);
3502 if (!ath_is_world_regd(&ar->ath_common.regulatory)) {
3503 ret = regulatory_hint(ar->hw->wiphy,
3504 ar->ath_common.regulatory.alpha2);
3506 goto err_unregister;
3512 ieee80211_unregister_hw(ar->hw);
3514 kfree(ar->mac.sbands[IEEE80211_BAND_2GHZ].channels);
3515 kfree(ar->mac.sbands[IEEE80211_BAND_5GHZ].channels);
3520 void ath10k_mac_unregister(struct ath10k *ar)
3522 ieee80211_unregister_hw(ar->hw);
3524 kfree(ar->mac.sbands[IEEE80211_BAND_2GHZ].channels);
3525 kfree(ar->mac.sbands[IEEE80211_BAND_5GHZ].channels);
3527 SET_IEEE80211_DEV(ar->hw, NULL);