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_regd_update(struct ath10k *ar)
1315 struct reg_dmn_pair_mapping *regpair;
1318 lockdep_assert_held(&ar->conf_mutex);
1320 ret = ath10k_update_channel_list(ar);
1322 ath10k_warn("could not update channel list (%d)\n", ret);
1324 regpair = ar->ath_common.regulatory.regpair;
1326 /* Target allows setting up per-band regdomain but ath_common provides
1327 * a combined one only */
1328 ret = ath10k_wmi_pdev_set_regdomain(ar,
1329 regpair->regDmnEnum,
1330 regpair->regDmnEnum, /* 2ghz */
1331 regpair->regDmnEnum, /* 5ghz */
1332 regpair->reg_2ghz_ctl,
1333 regpair->reg_5ghz_ctl);
1335 ath10k_warn("could not set pdev regdomain (%d)\n", ret);
1338 static void ath10k_reg_notifier(struct wiphy *wiphy,
1339 struct regulatory_request *request)
1341 struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
1342 struct ath10k *ar = hw->priv;
1344 ath_reg_notifier_apply(wiphy, request, &ar->ath_common.regulatory);
1346 mutex_lock(&ar->conf_mutex);
1347 if (ar->state == ATH10K_STATE_ON)
1348 ath10k_regd_update(ar);
1349 mutex_unlock(&ar->conf_mutex);
1357 * Frames sent to the FW have to be in "Native Wifi" format.
1358 * Strip the QoS field from the 802.11 header.
1360 static void ath10k_tx_h_qos_workaround(struct ieee80211_hw *hw,
1361 struct ieee80211_tx_control *control,
1362 struct sk_buff *skb)
1364 struct ieee80211_hdr *hdr = (void *)skb->data;
1367 if (!ieee80211_is_data_qos(hdr->frame_control))
1370 qos_ctl = ieee80211_get_qos_ctl(hdr);
1371 memmove(qos_ctl, qos_ctl + IEEE80211_QOS_CTL_LEN,
1372 skb->len - ieee80211_hdrlen(hdr->frame_control));
1373 skb_trim(skb, skb->len - IEEE80211_QOS_CTL_LEN);
1376 static void ath10k_tx_h_update_wep_key(struct sk_buff *skb)
1378 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
1379 struct ieee80211_vif *vif = info->control.vif;
1380 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1381 struct ath10k *ar = arvif->ar;
1382 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
1383 struct ieee80211_key_conf *key = info->control.hw_key;
1386 /* TODO AP mode should be implemented */
1387 if (vif->type != NL80211_IFTYPE_STATION)
1390 if (!ieee80211_has_protected(hdr->frame_control))
1396 if (key->cipher != WLAN_CIPHER_SUITE_WEP40 &&
1397 key->cipher != WLAN_CIPHER_SUITE_WEP104)
1400 if (key->keyidx == arvif->def_wep_key_index)
1403 ath10k_dbg(ATH10K_DBG_MAC, "new wep keyidx will be %d\n", key->keyidx);
1405 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
1406 WMI_VDEV_PARAM_DEF_KEYID,
1409 ath10k_warn("could not update wep keyidx (%d)\n", ret);
1413 arvif->def_wep_key_index = key->keyidx;
1416 static void ath10k_tx_h_add_p2p_noa_ie(struct ath10k *ar, struct sk_buff *skb)
1418 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
1419 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
1420 struct ieee80211_vif *vif = info->control.vif;
1421 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1423 /* This is case only for P2P_GO */
1424 if (arvif->vdev_type != WMI_VDEV_TYPE_AP ||
1425 arvif->vdev_subtype != WMI_VDEV_SUBTYPE_P2P_GO)
1428 if (unlikely(ieee80211_is_probe_resp(hdr->frame_control))) {
1429 spin_lock_bh(&ar->data_lock);
1430 if (arvif->u.ap.noa_data)
1431 if (!pskb_expand_head(skb, 0, arvif->u.ap.noa_len,
1433 memcpy(skb_put(skb, arvif->u.ap.noa_len),
1434 arvif->u.ap.noa_data,
1435 arvif->u.ap.noa_len);
1436 spin_unlock_bh(&ar->data_lock);
1440 static void ath10k_tx_htt(struct ath10k *ar, struct sk_buff *skb)
1442 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
1445 if (ieee80211_is_mgmt(hdr->frame_control))
1446 ret = ath10k_htt_mgmt_tx(&ar->htt, skb);
1447 else if (ieee80211_is_nullfunc(hdr->frame_control))
1448 /* FW does not report tx status properly for NullFunc frames
1449 * unless they are sent through mgmt tx path. mac80211 sends
1450 * those frames when it detects link/beacon loss and depends on
1451 * the tx status to be correct. */
1452 ret = ath10k_htt_mgmt_tx(&ar->htt, skb);
1454 ret = ath10k_htt_tx(&ar->htt, skb);
1457 ath10k_warn("tx failed (%d). dropping packet.\n", ret);
1458 ieee80211_free_txskb(ar->hw, skb);
1462 void ath10k_offchan_tx_purge(struct ath10k *ar)
1464 struct sk_buff *skb;
1467 skb = skb_dequeue(&ar->offchan_tx_queue);
1471 ieee80211_free_txskb(ar->hw, skb);
1475 void ath10k_offchan_tx_work(struct work_struct *work)
1477 struct ath10k *ar = container_of(work, struct ath10k, offchan_tx_work);
1478 struct ath10k_peer *peer;
1479 struct ieee80211_hdr *hdr;
1480 struct sk_buff *skb;
1481 const u8 *peer_addr;
1485 /* FW requirement: We must create a peer before FW will send out
1486 * an offchannel frame. Otherwise the frame will be stuck and
1487 * never transmitted. We delete the peer upon tx completion.
1488 * It is unlikely that a peer for offchannel tx will already be
1489 * present. However it may be in some rare cases so account for that.
1490 * Otherwise we might remove a legitimate peer and break stuff. */
1493 skb = skb_dequeue(&ar->offchan_tx_queue);
1497 mutex_lock(&ar->conf_mutex);
1499 ath10k_dbg(ATH10K_DBG_MAC, "processing offchannel skb %p\n",
1502 hdr = (struct ieee80211_hdr *)skb->data;
1503 peer_addr = ieee80211_get_DA(hdr);
1504 vdev_id = ATH10K_SKB_CB(skb)->htt.vdev_id;
1506 spin_lock_bh(&ar->data_lock);
1507 peer = ath10k_peer_find(ar, vdev_id, peer_addr);
1508 spin_unlock_bh(&ar->data_lock);
1511 ath10k_dbg(ATH10K_DBG_MAC, "peer %pM on vdev %d already present\n",
1512 peer_addr, vdev_id);
1515 ret = ath10k_peer_create(ar, vdev_id, peer_addr);
1517 ath10k_warn("peer %pM on vdev %d not created (%d)\n",
1518 peer_addr, vdev_id, ret);
1521 spin_lock_bh(&ar->data_lock);
1522 INIT_COMPLETION(ar->offchan_tx_completed);
1523 ar->offchan_tx_skb = skb;
1524 spin_unlock_bh(&ar->data_lock);
1526 ath10k_tx_htt(ar, skb);
1528 ret = wait_for_completion_timeout(&ar->offchan_tx_completed,
1531 ath10k_warn("timed out waiting for offchannel skb %p\n",
1535 ret = ath10k_peer_delete(ar, vdev_id, peer_addr);
1537 ath10k_warn("peer %pM on vdev %d not deleted (%d)\n",
1538 peer_addr, vdev_id, ret);
1541 mutex_unlock(&ar->conf_mutex);
1550 * This gets called if we dont get a heart-beat during scan.
1551 * This may indicate the FW has hung and we need to abort the
1552 * scan manually to prevent cancel_hw_scan() from deadlocking
1554 void ath10k_reset_scan(unsigned long ptr)
1556 struct ath10k *ar = (struct ath10k *)ptr;
1558 spin_lock_bh(&ar->data_lock);
1559 if (!ar->scan.in_progress) {
1560 spin_unlock_bh(&ar->data_lock);
1564 ath10k_warn("scan timeout. resetting. fw issue?\n");
1566 if (ar->scan.is_roc)
1567 ieee80211_remain_on_channel_expired(ar->hw);
1569 ieee80211_scan_completed(ar->hw, 1 /* aborted */);
1571 ar->scan.in_progress = false;
1572 complete_all(&ar->scan.completed);
1573 spin_unlock_bh(&ar->data_lock);
1576 static int ath10k_abort_scan(struct ath10k *ar)
1578 struct wmi_stop_scan_arg arg = {
1579 .req_id = 1, /* FIXME */
1580 .req_type = WMI_SCAN_STOP_ONE,
1581 .u.scan_id = ATH10K_SCAN_ID,
1585 lockdep_assert_held(&ar->conf_mutex);
1587 del_timer_sync(&ar->scan.timeout);
1589 spin_lock_bh(&ar->data_lock);
1590 if (!ar->scan.in_progress) {
1591 spin_unlock_bh(&ar->data_lock);
1595 ar->scan.aborting = true;
1596 spin_unlock_bh(&ar->data_lock);
1598 ret = ath10k_wmi_stop_scan(ar, &arg);
1600 ath10k_warn("could not submit wmi stop scan (%d)\n", ret);
1601 spin_lock_bh(&ar->data_lock);
1602 ar->scan.in_progress = false;
1603 ath10k_offchan_tx_purge(ar);
1604 spin_unlock_bh(&ar->data_lock);
1608 ath10k_wmi_flush_tx(ar);
1610 ret = wait_for_completion_timeout(&ar->scan.completed, 3*HZ);
1612 ath10k_warn("timed out while waiting for scan to stop\n");
1614 /* scan completion may be done right after we timeout here, so let's
1615 * check the in_progress and tell mac80211 scan is completed. if we
1616 * don't do that and FW fails to send us scan completion indication
1617 * then userspace won't be able to scan anymore */
1620 spin_lock_bh(&ar->data_lock);
1621 if (ar->scan.in_progress) {
1622 ath10k_warn("could not stop scan. its still in progress\n");
1623 ar->scan.in_progress = false;
1624 ath10k_offchan_tx_purge(ar);
1627 spin_unlock_bh(&ar->data_lock);
1632 static int ath10k_start_scan(struct ath10k *ar,
1633 const struct wmi_start_scan_arg *arg)
1637 lockdep_assert_held(&ar->conf_mutex);
1639 ret = ath10k_wmi_start_scan(ar, arg);
1643 /* make sure we submit the command so the completion
1644 * timeout makes sense */
1645 ath10k_wmi_flush_tx(ar);
1647 ret = wait_for_completion_timeout(&ar->scan.started, 1*HZ);
1649 ath10k_abort_scan(ar);
1653 /* the scan can complete earlier, before we even
1654 * start the timer. in that case the timer handler
1655 * checks ar->scan.in_progress and bails out if its
1656 * false. Add a 200ms margin to account event/command
1658 mod_timer(&ar->scan.timeout, jiffies +
1659 msecs_to_jiffies(arg->max_scan_time+200));
1663 /**********************/
1664 /* mac80211 callbacks */
1665 /**********************/
1667 static void ath10k_tx(struct ieee80211_hw *hw,
1668 struct ieee80211_tx_control *control,
1669 struct sk_buff *skb)
1671 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
1672 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
1673 struct ath10k *ar = hw->priv;
1674 struct ath10k_vif *arvif = NULL;
1678 if (info->control.vif) {
1679 arvif = ath10k_vif_to_arvif(info->control.vif);
1680 vdev_id = arvif->vdev_id;
1681 } else if (ar->monitor_enabled) {
1682 vdev_id = ar->monitor_vdev_id;
1685 /* We should disable CCK RATE due to P2P */
1686 if (info->flags & IEEE80211_TX_CTL_NO_CCK_RATE)
1687 ath10k_dbg(ATH10K_DBG_MAC, "IEEE80211_TX_CTL_NO_CCK_RATE\n");
1689 /* we must calculate tid before we apply qos workaround
1690 * as we'd lose the qos control field */
1691 tid = HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
1692 if (ieee80211_is_data_qos(hdr->frame_control) &&
1693 is_unicast_ether_addr(ieee80211_get_DA(hdr))) {
1694 u8 *qc = ieee80211_get_qos_ctl(hdr);
1695 tid = qc[0] & IEEE80211_QOS_CTL_TID_MASK;
1698 ath10k_tx_h_qos_workaround(hw, control, skb);
1699 ath10k_tx_h_update_wep_key(skb);
1700 ath10k_tx_h_add_p2p_noa_ie(ar, skb);
1701 ath10k_tx_h_seq_no(skb);
1703 memset(ATH10K_SKB_CB(skb), 0, sizeof(*ATH10K_SKB_CB(skb)));
1704 ATH10K_SKB_CB(skb)->htt.vdev_id = vdev_id;
1705 ATH10K_SKB_CB(skb)->htt.tid = tid;
1707 if (info->flags & IEEE80211_TX_CTL_TX_OFFCHAN) {
1708 spin_lock_bh(&ar->data_lock);
1709 ATH10K_SKB_CB(skb)->htt.is_offchan = true;
1710 ATH10K_SKB_CB(skb)->htt.vdev_id = ar->scan.vdev_id;
1711 spin_unlock_bh(&ar->data_lock);
1713 ath10k_dbg(ATH10K_DBG_MAC, "queued offchannel skb %p\n", skb);
1715 skb_queue_tail(&ar->offchan_tx_queue, skb);
1716 ieee80211_queue_work(hw, &ar->offchan_tx_work);
1720 ath10k_tx_htt(ar, skb);
1724 * Initialize various parameters with default vaules.
1726 static int ath10k_start(struct ieee80211_hw *hw)
1728 struct ath10k *ar = hw->priv;
1731 mutex_lock(&ar->conf_mutex);
1733 ret = ath10k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_PMF_QOS, 1);
1735 ath10k_warn("could not enable WMI_PDEV_PARAM_PMF_QOS (%d)\n",
1738 ret = ath10k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_DYNAMIC_BW, 0);
1740 ath10k_warn("could not init WMI_PDEV_PARAM_DYNAMIC_BW (%d)\n",
1743 ar->state = ATH10K_STATE_ON;
1744 ath10k_regd_update(ar);
1746 mutex_unlock(&ar->conf_mutex);
1750 static void ath10k_stop(struct ieee80211_hw *hw)
1752 struct ath10k *ar = hw->priv;
1754 mutex_lock(&ar->conf_mutex);
1755 ath10k_offchan_tx_purge(ar);
1756 ar->state = ATH10K_STATE_OFF;
1757 mutex_unlock(&ar->conf_mutex);
1759 cancel_work_sync(&ar->offchan_tx_work);
1762 static int ath10k_config(struct ieee80211_hw *hw, u32 changed)
1764 struct ath10k_generic_iter ar_iter;
1765 struct ath10k *ar = hw->priv;
1766 struct ieee80211_conf *conf = &hw->conf;
1770 mutex_lock(&ar->conf_mutex);
1772 if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
1773 ath10k_dbg(ATH10K_DBG_MAC, "Config channel %d mhz\n",
1774 conf->chandef.chan->center_freq);
1775 spin_lock_bh(&ar->data_lock);
1776 ar->rx_channel = conf->chandef.chan;
1777 spin_unlock_bh(&ar->data_lock);
1780 if (changed & IEEE80211_CONF_CHANGE_PS) {
1781 memset(&ar_iter, 0, sizeof(struct ath10k_generic_iter));
1783 flags = IEEE80211_IFACE_ITER_RESUME_ALL;
1785 ieee80211_iterate_active_interfaces_atomic(hw,
1793 if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
1794 if (conf->flags & IEEE80211_CONF_MONITOR)
1795 ret = ath10k_monitor_create(ar);
1797 ret = ath10k_monitor_destroy(ar);
1800 mutex_unlock(&ar->conf_mutex);
1806 * Figure out how to handle WMI_VDEV_SUBTYPE_P2P_DEVICE,
1807 * because we will send mgmt frames without CCK. This requirement
1808 * for P2P_FIND/GO_NEG should be handled by checking CCK flag
1811 static int ath10k_add_interface(struct ieee80211_hw *hw,
1812 struct ieee80211_vif *vif)
1814 struct ath10k *ar = hw->priv;
1815 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1816 enum wmi_sta_powersave_param param;
1818 u32 value, rts, frag;
1821 mutex_lock(&ar->conf_mutex);
1826 if ((vif->type == NL80211_IFTYPE_MONITOR) && ar->monitor_present) {
1827 ath10k_warn("Only one monitor interface allowed\n");
1832 bit = ffs(ar->free_vdev_map);
1838 arvif->vdev_id = bit - 1;
1839 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE;
1840 ar->free_vdev_map &= ~(1 << arvif->vdev_id);
1843 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_DEVICE;
1845 switch (vif->type) {
1846 case NL80211_IFTYPE_UNSPECIFIED:
1847 case NL80211_IFTYPE_STATION:
1848 arvif->vdev_type = WMI_VDEV_TYPE_STA;
1850 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_CLIENT;
1852 case NL80211_IFTYPE_ADHOC:
1853 arvif->vdev_type = WMI_VDEV_TYPE_IBSS;
1855 case NL80211_IFTYPE_AP:
1856 arvif->vdev_type = WMI_VDEV_TYPE_AP;
1859 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_GO;
1861 case NL80211_IFTYPE_MONITOR:
1862 arvif->vdev_type = WMI_VDEV_TYPE_MONITOR;
1869 ath10k_dbg(ATH10K_DBG_MAC, "Add interface: id %d type %d subtype %d\n",
1870 arvif->vdev_id, arvif->vdev_type, arvif->vdev_subtype);
1872 ret = ath10k_wmi_vdev_create(ar, arvif->vdev_id, arvif->vdev_type,
1873 arvif->vdev_subtype, vif->addr);
1875 ath10k_warn("WMI vdev create failed: ret %d\n", ret);
1879 ret = ath10k_wmi_vdev_set_param(ar, 0, WMI_VDEV_PARAM_DEF_KEYID,
1880 arvif->def_wep_key_index);
1882 ath10k_warn("Failed to set default keyid: %d\n", ret);
1884 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
1885 WMI_VDEV_PARAM_TX_ENCAP_TYPE,
1886 ATH10K_HW_TXRX_NATIVE_WIFI);
1888 ath10k_warn("Failed to set TX encap: %d\n", ret);
1890 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
1891 ret = ath10k_peer_create(ar, arvif->vdev_id, vif->addr);
1893 ath10k_warn("Failed to create peer for AP: %d\n", ret);
1898 if (arvif->vdev_type == WMI_VDEV_TYPE_STA) {
1899 param = WMI_STA_PS_PARAM_RX_WAKE_POLICY;
1900 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
1901 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
1904 ath10k_warn("Failed to set RX wake policy: %d\n", ret);
1906 param = WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD;
1907 value = WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS;
1908 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
1911 ath10k_warn("Failed to set TX wake thresh: %d\n", ret);
1913 param = WMI_STA_PS_PARAM_PSPOLL_COUNT;
1914 value = WMI_STA_PS_PSPOLL_COUNT_NO_MAX;
1915 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
1918 ath10k_warn("Failed to set PSPOLL count: %d\n", ret);
1921 rts = min_t(u32, ar->hw->wiphy->rts_threshold, ATH10K_RTS_MAX);
1922 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
1923 WMI_VDEV_PARAM_RTS_THRESHOLD,
1926 ath10k_warn("failed to set rts threshold for vdev %d (%d)\n",
1927 arvif->vdev_id, ret);
1929 frag = clamp_t(u32, ar->hw->wiphy->frag_threshold,
1930 ATH10K_FRAGMT_THRESHOLD_MIN,
1931 ATH10K_FRAGMT_THRESHOLD_MAX);
1932 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
1933 WMI_VDEV_PARAM_FRAGMENTATION_THRESHOLD,
1936 ath10k_warn("failed to set frag threshold for vdev %d (%d)\n",
1937 arvif->vdev_id, ret);
1939 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
1940 ar->monitor_present = true;
1943 mutex_unlock(&ar->conf_mutex);
1947 static void ath10k_remove_interface(struct ieee80211_hw *hw,
1948 struct ieee80211_vif *vif)
1950 struct ath10k *ar = hw->priv;
1951 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1954 mutex_lock(&ar->conf_mutex);
1956 ath10k_dbg(ATH10K_DBG_MAC, "Remove interface: id %d\n", arvif->vdev_id);
1958 ar->free_vdev_map |= 1 << (arvif->vdev_id);
1960 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
1961 ret = ath10k_peer_delete(arvif->ar, arvif->vdev_id, vif->addr);
1963 ath10k_warn("Failed to remove peer for AP: %d\n", ret);
1965 kfree(arvif->u.ap.noa_data);
1968 ret = ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
1970 ath10k_warn("WMI vdev delete failed: %d\n", ret);
1972 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
1973 ar->monitor_present = false;
1975 ath10k_peer_cleanup(ar, arvif->vdev_id);
1977 mutex_unlock(&ar->conf_mutex);
1981 * FIXME: Has to be verified.
1983 #define SUPPORTED_FILTERS \
1984 (FIF_PROMISC_IN_BSS | \
1989 FIF_BCN_PRBRESP_PROMISC | \
1993 static void ath10k_configure_filter(struct ieee80211_hw *hw,
1994 unsigned int changed_flags,
1995 unsigned int *total_flags,
1998 struct ath10k *ar = hw->priv;
2001 mutex_lock(&ar->conf_mutex);
2003 changed_flags &= SUPPORTED_FILTERS;
2004 *total_flags &= SUPPORTED_FILTERS;
2005 ar->filter_flags = *total_flags;
2007 if ((ar->filter_flags & FIF_PROMISC_IN_BSS) &&
2008 !ar->monitor_enabled) {
2009 ret = ath10k_monitor_start(ar, ar->monitor_vdev_id);
2011 ath10k_warn("Unable to start monitor mode\n");
2013 ath10k_dbg(ATH10K_DBG_MAC, "Monitor mode started\n");
2014 } else if (!(ar->filter_flags & FIF_PROMISC_IN_BSS) &&
2015 ar->monitor_enabled) {
2016 ret = ath10k_monitor_stop(ar);
2018 ath10k_warn("Unable to stop monitor mode\n");
2020 ath10k_dbg(ATH10K_DBG_MAC, "Monitor mode stopped\n");
2023 mutex_unlock(&ar->conf_mutex);
2026 static void ath10k_bss_info_changed(struct ieee80211_hw *hw,
2027 struct ieee80211_vif *vif,
2028 struct ieee80211_bss_conf *info,
2031 struct ath10k *ar = hw->priv;
2032 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2035 mutex_lock(&ar->conf_mutex);
2037 if (changed & BSS_CHANGED_IBSS)
2038 ath10k_control_ibss(arvif, info, vif->addr);
2040 if (changed & BSS_CHANGED_BEACON_INT) {
2041 arvif->beacon_interval = info->beacon_int;
2042 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
2043 WMI_VDEV_PARAM_BEACON_INTERVAL,
2044 arvif->beacon_interval);
2046 ath10k_warn("Failed to set beacon interval for VDEV: %d\n",
2049 ath10k_dbg(ATH10K_DBG_MAC,
2050 "Beacon interval: %d set for VDEV: %d\n",
2051 arvif->beacon_interval, arvif->vdev_id);
2054 if (changed & BSS_CHANGED_BEACON) {
2055 ret = ath10k_wmi_pdev_set_param(ar,
2056 WMI_PDEV_PARAM_BEACON_TX_MODE,
2057 WMI_BEACON_STAGGERED_MODE);
2059 ath10k_warn("Failed to set beacon mode for VDEV: %d\n",
2062 ath10k_dbg(ATH10K_DBG_MAC,
2063 "Set staggered beacon mode for VDEV: %d\n",
2067 if (changed & BSS_CHANGED_BEACON_INFO) {
2068 arvif->dtim_period = info->dtim_period;
2070 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
2071 WMI_VDEV_PARAM_DTIM_PERIOD,
2072 arvif->dtim_period);
2074 ath10k_warn("Failed to set dtim period for VDEV: %d\n",
2077 ath10k_dbg(ATH10K_DBG_MAC,
2078 "Set dtim period: %d for VDEV: %d\n",
2079 arvif->dtim_period, arvif->vdev_id);
2082 if (changed & BSS_CHANGED_SSID &&
2083 vif->type == NL80211_IFTYPE_AP) {
2084 arvif->u.ap.ssid_len = info->ssid_len;
2086 memcpy(arvif->u.ap.ssid, info->ssid, info->ssid_len);
2087 arvif->u.ap.hidden_ssid = info->hidden_ssid;
2090 if (changed & BSS_CHANGED_BSSID) {
2091 if (!is_zero_ether_addr(info->bssid)) {
2092 ret = ath10k_peer_create(ar, arvif->vdev_id,
2095 ath10k_warn("Failed to add peer: %pM for VDEV: %d\n",
2096 info->bssid, arvif->vdev_id);
2098 ath10k_dbg(ATH10K_DBG_MAC,
2099 "Added peer: %pM for VDEV: %d\n",
2100 info->bssid, arvif->vdev_id);
2103 if (vif->type == NL80211_IFTYPE_STATION) {
2105 * this is never erased as we it for crypto key
2106 * clearing; this is FW requirement
2108 memcpy(arvif->u.sta.bssid, info->bssid,
2111 ret = ath10k_vdev_start(arvif);
2113 ath10k_dbg(ATH10K_DBG_MAC,
2114 "VDEV: %d started with BSSID: %pM\n",
2115 arvif->vdev_id, info->bssid);
2119 * Mac80211 does not keep IBSS bssid when leaving IBSS,
2120 * so driver need to store it. It is needed when leaving
2121 * IBSS in order to remove BSSID peer.
2123 if (vif->type == NL80211_IFTYPE_ADHOC)
2124 memcpy(arvif->u.ibss.bssid, info->bssid,
2129 if (changed & BSS_CHANGED_BEACON_ENABLED)
2130 ath10k_control_beaconing(arvif, info);
2132 if (changed & BSS_CHANGED_ERP_CTS_PROT) {
2134 if (info->use_cts_prot)
2139 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
2140 WMI_VDEV_PARAM_ENABLE_RTSCTS,
2143 ath10k_warn("Failed to set CTS prot for VDEV: %d\n",
2146 ath10k_dbg(ATH10K_DBG_MAC,
2147 "Set CTS prot: %d for VDEV: %d\n",
2148 cts_prot, arvif->vdev_id);
2151 if (changed & BSS_CHANGED_ERP_SLOT) {
2153 if (info->use_short_slot)
2154 slottime = WMI_VDEV_SLOT_TIME_SHORT; /* 9us */
2157 slottime = WMI_VDEV_SLOT_TIME_LONG; /* 20us */
2159 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
2160 WMI_VDEV_PARAM_SLOT_TIME,
2163 ath10k_warn("Failed to set erp slot for VDEV: %d\n",
2166 ath10k_dbg(ATH10K_DBG_MAC,
2167 "Set slottime: %d for VDEV: %d\n",
2168 slottime, arvif->vdev_id);
2171 if (changed & BSS_CHANGED_ERP_PREAMBLE) {
2173 if (info->use_short_preamble)
2174 preamble = WMI_VDEV_PREAMBLE_SHORT;
2176 preamble = WMI_VDEV_PREAMBLE_LONG;
2178 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
2179 WMI_VDEV_PARAM_PREAMBLE,
2182 ath10k_warn("Failed to set preamble for VDEV: %d\n",
2185 ath10k_dbg(ATH10K_DBG_MAC,
2186 "Set preamble: %d for VDEV: %d\n",
2187 preamble, arvif->vdev_id);
2190 if (changed & BSS_CHANGED_ASSOC) {
2192 ath10k_bss_assoc(hw, vif, info);
2195 mutex_unlock(&ar->conf_mutex);
2198 static int ath10k_hw_scan(struct ieee80211_hw *hw,
2199 struct ieee80211_vif *vif,
2200 struct cfg80211_scan_request *req)
2202 struct ath10k *ar = hw->priv;
2203 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2204 struct wmi_start_scan_arg arg;
2208 mutex_lock(&ar->conf_mutex);
2210 spin_lock_bh(&ar->data_lock);
2211 if (ar->scan.in_progress) {
2212 spin_unlock_bh(&ar->data_lock);
2217 INIT_COMPLETION(ar->scan.started);
2218 INIT_COMPLETION(ar->scan.completed);
2219 ar->scan.in_progress = true;
2220 ar->scan.aborting = false;
2221 ar->scan.is_roc = false;
2222 ar->scan.vdev_id = arvif->vdev_id;
2223 spin_unlock_bh(&ar->data_lock);
2225 memset(&arg, 0, sizeof(arg));
2226 ath10k_wmi_start_scan_init(ar, &arg);
2227 arg.vdev_id = arvif->vdev_id;
2228 arg.scan_id = ATH10K_SCAN_ID;
2231 arg.scan_ctrl_flags |= WMI_SCAN_ADD_CCK_RATES;
2234 arg.ie_len = req->ie_len;
2235 memcpy(arg.ie, req->ie, arg.ie_len);
2239 arg.n_ssids = req->n_ssids;
2240 for (i = 0; i < arg.n_ssids; i++) {
2241 arg.ssids[i].len = req->ssids[i].ssid_len;
2242 arg.ssids[i].ssid = req->ssids[i].ssid;
2246 if (req->n_channels) {
2247 arg.n_channels = req->n_channels;
2248 for (i = 0; i < arg.n_channels; i++)
2249 arg.channels[i] = req->channels[i]->center_freq;
2252 ret = ath10k_start_scan(ar, &arg);
2254 ath10k_warn("could not start hw scan (%d)\n", ret);
2255 spin_lock_bh(&ar->data_lock);
2256 ar->scan.in_progress = false;
2257 spin_unlock_bh(&ar->data_lock);
2261 mutex_unlock(&ar->conf_mutex);
2265 static void ath10k_cancel_hw_scan(struct ieee80211_hw *hw,
2266 struct ieee80211_vif *vif)
2268 struct ath10k *ar = hw->priv;
2271 mutex_lock(&ar->conf_mutex);
2272 ret = ath10k_abort_scan(ar);
2274 ath10k_warn("couldn't abort scan (%d). forcefully sending scan completion to mac80211\n",
2276 ieee80211_scan_completed(hw, 1 /* aborted */);
2278 mutex_unlock(&ar->conf_mutex);
2281 static int ath10k_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
2282 struct ieee80211_vif *vif, struct ieee80211_sta *sta,
2283 struct ieee80211_key_conf *key)
2285 struct ath10k *ar = hw->priv;
2286 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2287 struct ath10k_peer *peer;
2288 const u8 *peer_addr;
2289 bool is_wep = key->cipher == WLAN_CIPHER_SUITE_WEP40 ||
2290 key->cipher == WLAN_CIPHER_SUITE_WEP104;
2293 if (key->keyidx > WMI_MAX_KEY_INDEX)
2296 mutex_lock(&ar->conf_mutex);
2299 peer_addr = sta->addr;
2300 else if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
2301 peer_addr = vif->bss_conf.bssid;
2303 peer_addr = vif->addr;
2305 key->hw_key_idx = key->keyidx;
2307 /* the peer should not disappear in mid-way (unless FW goes awry) since
2308 * we already hold conf_mutex. we just make sure its there now. */
2309 spin_lock_bh(&ar->data_lock);
2310 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
2311 spin_unlock_bh(&ar->data_lock);
2314 if (cmd == SET_KEY) {
2315 ath10k_warn("cannot install key for non-existent peer %pM\n",
2320 /* if the peer doesn't exist there is no key to disable
2328 arvif->wep_keys[key->keyidx] = key;
2330 arvif->wep_keys[key->keyidx] = NULL;
2332 if (cmd == DISABLE_KEY)
2333 ath10k_clear_vdev_key(arvif, key);
2336 ret = ath10k_install_key(arvif, key, cmd, peer_addr);
2338 ath10k_warn("ath10k_install_key failed (%d)\n", ret);
2342 spin_lock_bh(&ar->data_lock);
2343 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
2344 if (peer && cmd == SET_KEY)
2345 peer->keys[key->keyidx] = key;
2346 else if (peer && cmd == DISABLE_KEY)
2347 peer->keys[key->keyidx] = NULL;
2348 else if (peer == NULL)
2349 /* impossible unless FW goes crazy */
2350 ath10k_warn("peer %pM disappeared!\n", peer_addr);
2351 spin_unlock_bh(&ar->data_lock);
2354 mutex_unlock(&ar->conf_mutex);
2358 static int ath10k_sta_state(struct ieee80211_hw *hw,
2359 struct ieee80211_vif *vif,
2360 struct ieee80211_sta *sta,
2361 enum ieee80211_sta_state old_state,
2362 enum ieee80211_sta_state new_state)
2364 struct ath10k *ar = hw->priv;
2365 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2368 mutex_lock(&ar->conf_mutex);
2370 if (old_state == IEEE80211_STA_NOTEXIST &&
2371 new_state == IEEE80211_STA_NONE &&
2372 vif->type != NL80211_IFTYPE_STATION) {
2374 * New station addition.
2376 ret = ath10k_peer_create(ar, arvif->vdev_id, sta->addr);
2378 ath10k_warn("Failed to add peer: %pM for VDEV: %d\n",
2379 sta->addr, arvif->vdev_id);
2381 ath10k_dbg(ATH10K_DBG_MAC,
2382 "Added peer: %pM for VDEV: %d\n",
2383 sta->addr, arvif->vdev_id);
2384 } else if ((old_state == IEEE80211_STA_NONE &&
2385 new_state == IEEE80211_STA_NOTEXIST)) {
2387 * Existing station deletion.
2389 ret = ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
2391 ath10k_warn("Failed to delete peer: %pM for VDEV: %d\n",
2392 sta->addr, arvif->vdev_id);
2394 ath10k_dbg(ATH10K_DBG_MAC,
2395 "Removed peer: %pM for VDEV: %d\n",
2396 sta->addr, arvif->vdev_id);
2398 if (vif->type == NL80211_IFTYPE_STATION)
2399 ath10k_bss_disassoc(hw, vif);
2400 } else if (old_state == IEEE80211_STA_AUTH &&
2401 new_state == IEEE80211_STA_ASSOC &&
2402 (vif->type == NL80211_IFTYPE_AP ||
2403 vif->type == NL80211_IFTYPE_ADHOC)) {
2407 ret = ath10k_station_assoc(ar, arvif, sta);
2409 ath10k_warn("Failed to associate station: %pM\n",
2412 ath10k_dbg(ATH10K_DBG_MAC,
2413 "Station %pM moved to assoc state\n",
2415 } else if (old_state == IEEE80211_STA_ASSOC &&
2416 new_state == IEEE80211_STA_AUTH &&
2417 (vif->type == NL80211_IFTYPE_AP ||
2418 vif->type == NL80211_IFTYPE_ADHOC)) {
2422 ret = ath10k_station_disassoc(ar, arvif, sta);
2424 ath10k_warn("Failed to disassociate station: %pM\n",
2427 ath10k_dbg(ATH10K_DBG_MAC,
2428 "Station %pM moved to disassociated state\n",
2432 mutex_unlock(&ar->conf_mutex);
2436 static int ath10k_conf_tx_uapsd(struct ath10k *ar, struct ieee80211_vif *vif,
2437 u16 ac, bool enable)
2439 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2443 lockdep_assert_held(&ar->conf_mutex);
2445 if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
2449 case IEEE80211_AC_VO:
2450 value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN |
2451 WMI_STA_PS_UAPSD_AC3_TRIGGER_EN;
2453 case IEEE80211_AC_VI:
2454 value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN |
2455 WMI_STA_PS_UAPSD_AC2_TRIGGER_EN;
2457 case IEEE80211_AC_BE:
2458 value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN |
2459 WMI_STA_PS_UAPSD_AC1_TRIGGER_EN;
2461 case IEEE80211_AC_BK:
2462 value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN |
2463 WMI_STA_PS_UAPSD_AC0_TRIGGER_EN;
2468 arvif->u.sta.uapsd |= value;
2470 arvif->u.sta.uapsd &= ~value;
2472 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
2473 WMI_STA_PS_PARAM_UAPSD,
2474 arvif->u.sta.uapsd);
2476 ath10k_warn("could not set uapsd params %d\n", ret);
2480 if (arvif->u.sta.uapsd)
2481 value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD;
2483 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
2485 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
2486 WMI_STA_PS_PARAM_RX_WAKE_POLICY,
2489 ath10k_warn("could not set rx wake param %d\n", ret);
2495 static int ath10k_conf_tx(struct ieee80211_hw *hw,
2496 struct ieee80211_vif *vif, u16 ac,
2497 const struct ieee80211_tx_queue_params *params)
2499 struct ath10k *ar = hw->priv;
2500 struct wmi_wmm_params_arg *p = NULL;
2503 mutex_lock(&ar->conf_mutex);
2506 case IEEE80211_AC_VO:
2507 p = &ar->wmm_params.ac_vo;
2509 case IEEE80211_AC_VI:
2510 p = &ar->wmm_params.ac_vi;
2512 case IEEE80211_AC_BE:
2513 p = &ar->wmm_params.ac_be;
2515 case IEEE80211_AC_BK:
2516 p = &ar->wmm_params.ac_bk;
2525 p->cwmin = params->cw_min;
2526 p->cwmax = params->cw_max;
2527 p->aifs = params->aifs;
2530 * The channel time duration programmed in the HW is in absolute
2531 * microseconds, while mac80211 gives the txop in units of
2534 p->txop = params->txop * 32;
2536 /* FIXME: FW accepts wmm params per hw, not per vif */
2537 ret = ath10k_wmi_pdev_set_wmm_params(ar, &ar->wmm_params);
2539 ath10k_warn("could not set wmm params %d\n", ret);
2543 ret = ath10k_conf_tx_uapsd(ar, vif, ac, params->uapsd);
2545 ath10k_warn("could not set sta uapsd %d\n", ret);
2548 mutex_unlock(&ar->conf_mutex);
2552 #define ATH10K_ROC_TIMEOUT_HZ (2*HZ)
2554 static int ath10k_remain_on_channel(struct ieee80211_hw *hw,
2555 struct ieee80211_vif *vif,
2556 struct ieee80211_channel *chan,
2558 enum ieee80211_roc_type type)
2560 struct ath10k *ar = hw->priv;
2561 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2562 struct wmi_start_scan_arg arg;
2565 mutex_lock(&ar->conf_mutex);
2567 spin_lock_bh(&ar->data_lock);
2568 if (ar->scan.in_progress) {
2569 spin_unlock_bh(&ar->data_lock);
2574 INIT_COMPLETION(ar->scan.started);
2575 INIT_COMPLETION(ar->scan.completed);
2576 INIT_COMPLETION(ar->scan.on_channel);
2577 ar->scan.in_progress = true;
2578 ar->scan.aborting = false;
2579 ar->scan.is_roc = true;
2580 ar->scan.vdev_id = arvif->vdev_id;
2581 ar->scan.roc_freq = chan->center_freq;
2582 spin_unlock_bh(&ar->data_lock);
2584 memset(&arg, 0, sizeof(arg));
2585 ath10k_wmi_start_scan_init(ar, &arg);
2586 arg.vdev_id = arvif->vdev_id;
2587 arg.scan_id = ATH10K_SCAN_ID;
2589 arg.channels[0] = chan->center_freq;
2590 arg.dwell_time_active = duration;
2591 arg.dwell_time_passive = duration;
2592 arg.max_scan_time = 2 * duration;
2593 arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
2594 arg.scan_ctrl_flags |= WMI_SCAN_FILTER_PROBE_REQ;
2596 ret = ath10k_start_scan(ar, &arg);
2598 ath10k_warn("could not start roc scan (%d)\n", ret);
2599 spin_lock_bh(&ar->data_lock);
2600 ar->scan.in_progress = false;
2601 spin_unlock_bh(&ar->data_lock);
2605 ret = wait_for_completion_timeout(&ar->scan.on_channel, 3*HZ);
2607 ath10k_warn("could not switch to channel for roc scan\n");
2608 ath10k_abort_scan(ar);
2615 mutex_unlock(&ar->conf_mutex);
2619 static int ath10k_cancel_remain_on_channel(struct ieee80211_hw *hw)
2621 struct ath10k *ar = hw->priv;
2623 mutex_lock(&ar->conf_mutex);
2624 ath10k_abort_scan(ar);
2625 mutex_unlock(&ar->conf_mutex);
2631 * Both RTS and Fragmentation threshold are interface-specific
2632 * in ath10k, but device-specific in mac80211.
2634 static void ath10k_set_rts_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
2636 struct ath10k_generic_iter *ar_iter = data;
2637 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2638 u32 rts = ar_iter->ar->hw->wiphy->rts_threshold;
2640 lockdep_assert_held(&arvif->ar->conf_mutex);
2642 rts = min_t(u32, rts, ATH10K_RTS_MAX);
2644 ar_iter->ret = ath10k_wmi_vdev_set_param(ar_iter->ar, arvif->vdev_id,
2645 WMI_VDEV_PARAM_RTS_THRESHOLD,
2648 ath10k_warn("Failed to set RTS threshold for VDEV: %d\n",
2651 ath10k_dbg(ATH10K_DBG_MAC,
2652 "Set RTS threshold: %d for VDEV: %d\n",
2653 rts, arvif->vdev_id);
2656 static int ath10k_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
2658 struct ath10k_generic_iter ar_iter;
2659 struct ath10k *ar = hw->priv;
2661 memset(&ar_iter, 0, sizeof(struct ath10k_generic_iter));
2664 mutex_lock(&ar->conf_mutex);
2665 ieee80211_iterate_active_interfaces_atomic(
2666 hw, IEEE80211_IFACE_ITER_NORMAL,
2667 ath10k_set_rts_iter, &ar_iter);
2668 mutex_unlock(&ar->conf_mutex);
2673 static void ath10k_set_frag_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
2675 struct ath10k_generic_iter *ar_iter = data;
2676 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2677 u32 frag = ar_iter->ar->hw->wiphy->frag_threshold;
2680 lockdep_assert_held(&arvif->ar->conf_mutex);
2682 frag = clamp_t(u32, frag,
2683 ATH10K_FRAGMT_THRESHOLD_MIN,
2684 ATH10K_FRAGMT_THRESHOLD_MAX);
2686 ret = ath10k_wmi_vdev_set_param(ar_iter->ar, arvif->vdev_id,
2687 WMI_VDEV_PARAM_FRAGMENTATION_THRESHOLD,
2692 ath10k_warn("Failed to set frag threshold for VDEV: %d\n",
2695 ath10k_dbg(ATH10K_DBG_MAC,
2696 "Set frag threshold: %d for VDEV: %d\n",
2697 frag, arvif->vdev_id);
2700 static int ath10k_set_frag_threshold(struct ieee80211_hw *hw, u32 value)
2702 struct ath10k_generic_iter ar_iter;
2703 struct ath10k *ar = hw->priv;
2705 memset(&ar_iter, 0, sizeof(struct ath10k_generic_iter));
2708 mutex_lock(&ar->conf_mutex);
2709 ieee80211_iterate_active_interfaces_atomic(
2710 hw, IEEE80211_IFACE_ITER_NORMAL,
2711 ath10k_set_frag_iter, &ar_iter);
2712 mutex_unlock(&ar->conf_mutex);
2717 static void ath10k_flush(struct ieee80211_hw *hw, u32 queues, bool drop)
2719 struct ath10k *ar = hw->priv;
2722 /* mac80211 doesn't care if we really xmit queued frames or not
2723 * we'll collect those frames either way if we stop/delete vdevs */
2727 mutex_lock(&ar->conf_mutex);
2729 ret = wait_event_timeout(ar->htt.empty_tx_wq, ({
2731 spin_lock_bh(&ar->htt.tx_lock);
2732 empty = bitmap_empty(ar->htt.used_msdu_ids,
2733 ar->htt.max_num_pending_tx);
2734 spin_unlock_bh(&ar->htt.tx_lock);
2736 }), ATH10K_FLUSH_TIMEOUT_HZ);
2738 ath10k_warn("tx not flushed\n");
2740 mutex_unlock(&ar->conf_mutex);
2743 /* TODO: Implement this function properly
2744 * For now it is needed to reply to Probe Requests in IBSS mode.
2745 * Propably we need this information from FW.
2747 static int ath10k_tx_last_beacon(struct ieee80211_hw *hw)
2752 static const struct ieee80211_ops ath10k_ops = {
2754 .start = ath10k_start,
2755 .stop = ath10k_stop,
2756 .config = ath10k_config,
2757 .add_interface = ath10k_add_interface,
2758 .remove_interface = ath10k_remove_interface,
2759 .configure_filter = ath10k_configure_filter,
2760 .bss_info_changed = ath10k_bss_info_changed,
2761 .hw_scan = ath10k_hw_scan,
2762 .cancel_hw_scan = ath10k_cancel_hw_scan,
2763 .set_key = ath10k_set_key,
2764 .sta_state = ath10k_sta_state,
2765 .conf_tx = ath10k_conf_tx,
2766 .remain_on_channel = ath10k_remain_on_channel,
2767 .cancel_remain_on_channel = ath10k_cancel_remain_on_channel,
2768 .set_rts_threshold = ath10k_set_rts_threshold,
2769 .set_frag_threshold = ath10k_set_frag_threshold,
2770 .flush = ath10k_flush,
2771 .tx_last_beacon = ath10k_tx_last_beacon,
2774 #define RATETAB_ENT(_rate, _rateid, _flags) { \
2775 .bitrate = (_rate), \
2776 .flags = (_flags), \
2777 .hw_value = (_rateid), \
2780 #define CHAN2G(_channel, _freq, _flags) { \
2781 .band = IEEE80211_BAND_2GHZ, \
2782 .hw_value = (_channel), \
2783 .center_freq = (_freq), \
2784 .flags = (_flags), \
2785 .max_antenna_gain = 0, \
2789 #define CHAN5G(_channel, _freq, _flags) { \
2790 .band = IEEE80211_BAND_5GHZ, \
2791 .hw_value = (_channel), \
2792 .center_freq = (_freq), \
2793 .flags = (_flags), \
2794 .max_antenna_gain = 0, \
2798 static const struct ieee80211_channel ath10k_2ghz_channels[] = {
2808 CHAN2G(10, 2457, 0),
2809 CHAN2G(11, 2462, 0),
2810 CHAN2G(12, 2467, 0),
2811 CHAN2G(13, 2472, 0),
2812 CHAN2G(14, 2484, 0),
2815 static const struct ieee80211_channel ath10k_5ghz_channels[] = {
2816 CHAN5G(36, 5180, 0),
2817 CHAN5G(40, 5200, 0),
2818 CHAN5G(44, 5220, 0),
2819 CHAN5G(48, 5240, 0),
2820 CHAN5G(52, 5260, 0),
2821 CHAN5G(56, 5280, 0),
2822 CHAN5G(60, 5300, 0),
2823 CHAN5G(64, 5320, 0),
2824 CHAN5G(100, 5500, 0),
2825 CHAN5G(104, 5520, 0),
2826 CHAN5G(108, 5540, 0),
2827 CHAN5G(112, 5560, 0),
2828 CHAN5G(116, 5580, 0),
2829 CHAN5G(120, 5600, 0),
2830 CHAN5G(124, 5620, 0),
2831 CHAN5G(128, 5640, 0),
2832 CHAN5G(132, 5660, 0),
2833 CHAN5G(136, 5680, 0),
2834 CHAN5G(140, 5700, 0),
2835 CHAN5G(149, 5745, 0),
2836 CHAN5G(153, 5765, 0),
2837 CHAN5G(157, 5785, 0),
2838 CHAN5G(161, 5805, 0),
2839 CHAN5G(165, 5825, 0),
2842 static struct ieee80211_rate ath10k_rates[] = {
2844 RATETAB_ENT(10, 0x82, 0),
2845 RATETAB_ENT(20, 0x84, 0),
2846 RATETAB_ENT(55, 0x8b, 0),
2847 RATETAB_ENT(110, 0x96, 0),
2849 RATETAB_ENT(60, 0x0c, 0),
2850 RATETAB_ENT(90, 0x12, 0),
2851 RATETAB_ENT(120, 0x18, 0),
2852 RATETAB_ENT(180, 0x24, 0),
2853 RATETAB_ENT(240, 0x30, 0),
2854 RATETAB_ENT(360, 0x48, 0),
2855 RATETAB_ENT(480, 0x60, 0),
2856 RATETAB_ENT(540, 0x6c, 0),
2859 #define ath10k_a_rates (ath10k_rates + 4)
2860 #define ath10k_a_rates_size (ARRAY_SIZE(ath10k_rates) - 4)
2861 #define ath10k_g_rates (ath10k_rates + 0)
2862 #define ath10k_g_rates_size (ARRAY_SIZE(ath10k_rates))
2864 struct ath10k *ath10k_mac_create(void)
2866 struct ieee80211_hw *hw;
2869 hw = ieee80211_alloc_hw(sizeof(struct ath10k), &ath10k_ops);
2879 void ath10k_mac_destroy(struct ath10k *ar)
2881 ieee80211_free_hw(ar->hw);
2884 static const struct ieee80211_iface_limit ath10k_if_limits[] = {
2887 .types = BIT(NL80211_IFTYPE_STATION)
2888 | BIT(NL80211_IFTYPE_P2P_CLIENT)
2889 | BIT(NL80211_IFTYPE_P2P_GO)
2890 | BIT(NL80211_IFTYPE_AP)
2894 static const struct ieee80211_iface_combination ath10k_if_comb = {
2895 .limits = ath10k_if_limits,
2896 .n_limits = ARRAY_SIZE(ath10k_if_limits),
2897 .max_interfaces = 8,
2898 .num_different_channels = 1,
2899 .beacon_int_infra_match = true,
2902 static struct ieee80211_sta_vht_cap ath10k_create_vht_cap(struct ath10k *ar)
2904 struct ieee80211_sta_vht_cap vht_cap = {0};
2907 vht_cap.vht_supported = 1;
2908 vht_cap.cap = ar->vht_cap_info;
2910 /* FIXME: check dynamically how many streams board supports */
2911 mcs_map = IEEE80211_VHT_MCS_SUPPORT_0_9 << 0 |
2912 IEEE80211_VHT_MCS_SUPPORT_0_9 << 2 |
2913 IEEE80211_VHT_MCS_SUPPORT_0_9 << 4 |
2914 IEEE80211_VHT_MCS_NOT_SUPPORTED << 6 |
2915 IEEE80211_VHT_MCS_NOT_SUPPORTED << 8 |
2916 IEEE80211_VHT_MCS_NOT_SUPPORTED << 10 |
2917 IEEE80211_VHT_MCS_NOT_SUPPORTED << 12 |
2918 IEEE80211_VHT_MCS_NOT_SUPPORTED << 14;
2920 vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(mcs_map);
2921 vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(mcs_map);
2926 static struct ieee80211_sta_ht_cap ath10k_get_ht_cap(struct ath10k *ar)
2929 struct ieee80211_sta_ht_cap ht_cap = {0};
2931 if (!(ar->ht_cap_info & WMI_HT_CAP_ENABLED))
2934 ht_cap.ht_supported = 1;
2935 ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
2936 ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_8;
2937 ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
2938 ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
2939 ht_cap.cap |= WLAN_HT_CAP_SM_PS_STATIC << IEEE80211_HT_CAP_SM_PS_SHIFT;
2941 if (ar->ht_cap_info & WMI_HT_CAP_HT20_SGI)
2942 ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
2944 if (ar->ht_cap_info & WMI_HT_CAP_HT40_SGI)
2945 ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
2947 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) {
2950 smps = WLAN_HT_CAP_SM_PS_DYNAMIC;
2951 smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT;
2956 if (ar->ht_cap_info & WMI_HT_CAP_TX_STBC)
2957 ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC;
2959 if (ar->ht_cap_info & WMI_HT_CAP_RX_STBC) {
2962 stbc = ar->ht_cap_info;
2963 stbc &= WMI_HT_CAP_RX_STBC;
2964 stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT;
2965 stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT;
2966 stbc &= IEEE80211_HT_CAP_RX_STBC;
2971 if (ar->ht_cap_info & WMI_HT_CAP_LDPC)
2972 ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
2974 if (ar->ht_cap_info & WMI_HT_CAP_L_SIG_TXOP_PROT)
2975 ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
2977 /* max AMSDU is implicitly taken from vht_cap_info */
2978 if (ar->vht_cap_info & WMI_VHT_CAP_MAX_MPDU_LEN_MASK)
2979 ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU;
2981 for (i = 0; i < WMI_MAX_SPATIAL_STREAM; i++)
2982 ht_cap.mcs.rx_mask[i] = 0xFF;
2984 ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
2990 static void ath10k_get_arvif_iter(void *data, u8 *mac,
2991 struct ieee80211_vif *vif)
2993 struct ath10k_vif_iter *arvif_iter = data;
2994 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2996 if (arvif->vdev_id == arvif_iter->vdev_id)
2997 arvif_iter->arvif = arvif;
3000 struct ath10k_vif *ath10k_get_arvif(struct ath10k *ar, u32 vdev_id)
3002 struct ath10k_vif_iter arvif_iter;
3005 memset(&arvif_iter, 0, sizeof(struct ath10k_vif_iter));
3006 arvif_iter.vdev_id = vdev_id;
3008 flags = IEEE80211_IFACE_ITER_RESUME_ALL;
3009 ieee80211_iterate_active_interfaces_atomic(ar->hw,
3011 ath10k_get_arvif_iter,
3013 if (!arvif_iter.arvif) {
3014 ath10k_warn("No VIF found for VDEV: %d\n", vdev_id);
3018 return arvif_iter.arvif;
3021 int ath10k_mac_register(struct ath10k *ar)
3023 struct ieee80211_supported_band *band;
3024 struct ieee80211_sta_vht_cap vht_cap;
3025 struct ieee80211_sta_ht_cap ht_cap;
3029 SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr);
3031 SET_IEEE80211_DEV(ar->hw, ar->dev);
3033 ht_cap = ath10k_get_ht_cap(ar);
3034 vht_cap = ath10k_create_vht_cap(ar);
3036 if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) {
3037 channels = kmemdup(ath10k_2ghz_channels,
3038 sizeof(ath10k_2ghz_channels),
3043 band = &ar->mac.sbands[IEEE80211_BAND_2GHZ];
3044 band->n_channels = ARRAY_SIZE(ath10k_2ghz_channels);
3045 band->channels = channels;
3046 band->n_bitrates = ath10k_g_rates_size;
3047 band->bitrates = ath10k_g_rates;
3048 band->ht_cap = ht_cap;
3050 /* vht is not supported in 2.4 GHz */
3052 ar->hw->wiphy->bands[IEEE80211_BAND_2GHZ] = band;
3055 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) {
3056 channels = kmemdup(ath10k_5ghz_channels,
3057 sizeof(ath10k_5ghz_channels),
3060 if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) {
3061 band = &ar->mac.sbands[IEEE80211_BAND_2GHZ];
3062 kfree(band->channels);
3067 band = &ar->mac.sbands[IEEE80211_BAND_5GHZ];
3068 band->n_channels = ARRAY_SIZE(ath10k_5ghz_channels);
3069 band->channels = channels;
3070 band->n_bitrates = ath10k_a_rates_size;
3071 band->bitrates = ath10k_a_rates;
3072 band->ht_cap = ht_cap;
3073 band->vht_cap = vht_cap;
3074 ar->hw->wiphy->bands[IEEE80211_BAND_5GHZ] = band;
3077 ar->hw->wiphy->interface_modes =
3078 BIT(NL80211_IFTYPE_STATION) |
3079 BIT(NL80211_IFTYPE_ADHOC) |
3080 BIT(NL80211_IFTYPE_AP) |
3081 BIT(NL80211_IFTYPE_P2P_CLIENT) |
3082 BIT(NL80211_IFTYPE_P2P_GO);
3084 ar->hw->flags = IEEE80211_HW_SIGNAL_DBM |
3085 IEEE80211_HW_SUPPORTS_PS |
3086 IEEE80211_HW_SUPPORTS_DYNAMIC_PS |
3087 IEEE80211_HW_SUPPORTS_UAPSD |
3088 IEEE80211_HW_MFP_CAPABLE |
3089 IEEE80211_HW_REPORTS_TX_ACK_STATUS |
3090 IEEE80211_HW_HAS_RATE_CONTROL |
3091 IEEE80211_HW_SUPPORTS_STATIC_SMPS |
3092 IEEE80211_HW_WANT_MONITOR_VIF |
3093 IEEE80211_HW_AP_LINK_PS;
3095 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS)
3096 ar->hw->flags |= IEEE80211_HW_SUPPORTS_DYNAMIC_SMPS;
3098 if (ar->ht_cap_info & WMI_HT_CAP_ENABLED) {
3099 ar->hw->flags |= IEEE80211_HW_AMPDU_AGGREGATION;
3100 ar->hw->flags |= IEEE80211_HW_TX_AMPDU_SETUP_IN_HW;
3103 ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID;
3104 ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN;
3106 ar->hw->vif_data_size = sizeof(struct ath10k_vif);
3108 ar->hw->channel_change_time = 5000;
3109 ar->hw->max_listen_interval = ATH10K_MAX_HW_LISTEN_INTERVAL;
3111 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
3112 ar->hw->wiphy->max_remain_on_channel_duration = 5000;
3114 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
3116 * on LL hardware queues are managed entirely by the FW
3117 * so we only advertise to mac we can do the queues thing
3121 ar->hw->wiphy->iface_combinations = &ath10k_if_comb;
3122 ar->hw->wiphy->n_iface_combinations = 1;
3124 ret = ath_regd_init(&ar->ath_common.regulatory, ar->hw->wiphy,
3125 ath10k_reg_notifier);
3127 ath10k_err("Regulatory initialization failed\n");
3131 ret = ieee80211_register_hw(ar->hw);
3133 ath10k_err("ieee80211 registration failed: %d\n", ret);
3137 if (!ath_is_world_regd(&ar->ath_common.regulatory)) {
3138 ret = regulatory_hint(ar->hw->wiphy,
3139 ar->ath_common.regulatory.alpha2);
3146 ieee80211_unregister_hw(ar->hw);
3150 void ath10k_mac_unregister(struct ath10k *ar)
3152 ieee80211_unregister_hw(ar->hw);
3154 kfree(ar->mac.sbands[IEEE80211_BAND_2GHZ].channels);
3155 kfree(ar->mac.sbands[IEEE80211_BAND_5GHZ].channels);
3157 SET_IEEE80211_DEV(ar->hw, NULL);