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>
22 #include <linux/acpi.h>
40 static struct ieee80211_rate ath10k_rates[] = {
42 .hw_value = ATH10K_HW_RATE_CCK_LP_1M },
44 .hw_value = ATH10K_HW_RATE_CCK_LP_2M,
45 .hw_value_short = ATH10K_HW_RATE_CCK_SP_2M,
46 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
48 .hw_value = ATH10K_HW_RATE_CCK_LP_5_5M,
49 .hw_value_short = ATH10K_HW_RATE_CCK_SP_5_5M,
50 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
52 .hw_value = ATH10K_HW_RATE_CCK_LP_11M,
53 .hw_value_short = ATH10K_HW_RATE_CCK_SP_11M,
54 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
56 { .bitrate = 60, .hw_value = ATH10K_HW_RATE_OFDM_6M },
57 { .bitrate = 90, .hw_value = ATH10K_HW_RATE_OFDM_9M },
58 { .bitrate = 120, .hw_value = ATH10K_HW_RATE_OFDM_12M },
59 { .bitrate = 180, .hw_value = ATH10K_HW_RATE_OFDM_18M },
60 { .bitrate = 240, .hw_value = ATH10K_HW_RATE_OFDM_24M },
61 { .bitrate = 360, .hw_value = ATH10K_HW_RATE_OFDM_36M },
62 { .bitrate = 480, .hw_value = ATH10K_HW_RATE_OFDM_48M },
63 { .bitrate = 540, .hw_value = ATH10K_HW_RATE_OFDM_54M },
66 static struct ieee80211_rate ath10k_rates_rev2[] = {
68 .hw_value = ATH10K_HW_RATE_REV2_CCK_LP_1M },
70 .hw_value = ATH10K_HW_RATE_REV2_CCK_LP_2M,
71 .hw_value_short = ATH10K_HW_RATE_REV2_CCK_SP_2M,
72 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
74 .hw_value = ATH10K_HW_RATE_REV2_CCK_LP_5_5M,
75 .hw_value_short = ATH10K_HW_RATE_REV2_CCK_SP_5_5M,
76 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
78 .hw_value = ATH10K_HW_RATE_REV2_CCK_LP_11M,
79 .hw_value_short = ATH10K_HW_RATE_REV2_CCK_SP_11M,
80 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
82 { .bitrate = 60, .hw_value = ATH10K_HW_RATE_OFDM_6M },
83 { .bitrate = 90, .hw_value = ATH10K_HW_RATE_OFDM_9M },
84 { .bitrate = 120, .hw_value = ATH10K_HW_RATE_OFDM_12M },
85 { .bitrate = 180, .hw_value = ATH10K_HW_RATE_OFDM_18M },
86 { .bitrate = 240, .hw_value = ATH10K_HW_RATE_OFDM_24M },
87 { .bitrate = 360, .hw_value = ATH10K_HW_RATE_OFDM_36M },
88 { .bitrate = 480, .hw_value = ATH10K_HW_RATE_OFDM_48M },
89 { .bitrate = 540, .hw_value = ATH10K_HW_RATE_OFDM_54M },
92 #define ATH10K_MAC_FIRST_OFDM_RATE_IDX 4
94 #define ath10k_a_rates (ath10k_rates + ATH10K_MAC_FIRST_OFDM_RATE_IDX)
95 #define ath10k_a_rates_size (ARRAY_SIZE(ath10k_rates) - \
96 ATH10K_MAC_FIRST_OFDM_RATE_IDX)
97 #define ath10k_g_rates (ath10k_rates + 0)
98 #define ath10k_g_rates_size (ARRAY_SIZE(ath10k_rates))
100 #define ath10k_g_rates_rev2 (ath10k_rates_rev2 + 0)
101 #define ath10k_g_rates_rev2_size (ARRAY_SIZE(ath10k_rates_rev2))
103 static bool ath10k_mac_bitrate_is_cck(int bitrate)
116 static u8 ath10k_mac_bitrate_to_rate(int bitrate)
118 return DIV_ROUND_UP(bitrate, 5) |
119 (ath10k_mac_bitrate_is_cck(bitrate) ? BIT(7) : 0);
122 u8 ath10k_mac_hw_rate_to_idx(const struct ieee80211_supported_band *sband,
123 u8 hw_rate, bool cck)
125 const struct ieee80211_rate *rate;
128 for (i = 0; i < sband->n_bitrates; i++) {
129 rate = &sband->bitrates[i];
131 if (ath10k_mac_bitrate_is_cck(rate->bitrate) != cck)
134 if (rate->hw_value == hw_rate)
136 else if (rate->flags & IEEE80211_RATE_SHORT_PREAMBLE &&
137 rate->hw_value_short == hw_rate)
144 u8 ath10k_mac_bitrate_to_idx(const struct ieee80211_supported_band *sband,
149 for (i = 0; i < sband->n_bitrates; i++)
150 if (sband->bitrates[i].bitrate == bitrate)
156 static int ath10k_mac_get_max_vht_mcs_map(u16 mcs_map, int nss)
158 switch ((mcs_map >> (2 * nss)) & 0x3) {
159 case IEEE80211_VHT_MCS_SUPPORT_0_7: return BIT(8) - 1;
160 case IEEE80211_VHT_MCS_SUPPORT_0_8: return BIT(9) - 1;
161 case IEEE80211_VHT_MCS_SUPPORT_0_9: return BIT(10) - 1;
167 ath10k_mac_max_ht_nss(const u8 ht_mcs_mask[IEEE80211_HT_MCS_MASK_LEN])
171 for (nss = IEEE80211_HT_MCS_MASK_LEN - 1; nss >= 0; nss--)
172 if (ht_mcs_mask[nss])
179 ath10k_mac_max_vht_nss(const u16 vht_mcs_mask[NL80211_VHT_NSS_MAX])
183 for (nss = NL80211_VHT_NSS_MAX - 1; nss >= 0; nss--)
184 if (vht_mcs_mask[nss])
190 int ath10k_mac_ext_resource_config(struct ath10k *ar, u32 val)
192 enum wmi_host_platform_type platform_type;
195 if (test_bit(WMI_SERVICE_TX_MODE_DYNAMIC, ar->wmi.svc_map))
196 platform_type = WMI_HOST_PLATFORM_LOW_PERF;
198 platform_type = WMI_HOST_PLATFORM_HIGH_PERF;
200 ret = ath10k_wmi_ext_resource_config(ar, platform_type, val);
202 if (ret && ret != -EOPNOTSUPP) {
203 ath10k_warn(ar, "failed to configure ext resource: %d\n", ret);
214 static int ath10k_send_key(struct ath10k_vif *arvif,
215 struct ieee80211_key_conf *key,
216 enum set_key_cmd cmd,
217 const u8 *macaddr, u32 flags)
219 struct ath10k *ar = arvif->ar;
220 struct wmi_vdev_install_key_arg arg = {
221 .vdev_id = arvif->vdev_id,
222 .key_idx = key->keyidx,
223 .key_len = key->keylen,
224 .key_data = key->key,
229 lockdep_assert_held(&arvif->ar->conf_mutex);
231 switch (key->cipher) {
232 case WLAN_CIPHER_SUITE_CCMP:
233 arg.key_cipher = WMI_CIPHER_AES_CCM;
234 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT;
236 case WLAN_CIPHER_SUITE_TKIP:
237 arg.key_cipher = WMI_CIPHER_TKIP;
238 arg.key_txmic_len = 8;
239 arg.key_rxmic_len = 8;
241 case WLAN_CIPHER_SUITE_WEP40:
242 case WLAN_CIPHER_SUITE_WEP104:
243 arg.key_cipher = WMI_CIPHER_WEP;
245 case WLAN_CIPHER_SUITE_AES_CMAC:
249 ath10k_warn(ar, "cipher %d is not supported\n", key->cipher);
253 if (test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags))
254 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
256 if (cmd == DISABLE_KEY) {
257 arg.key_cipher = WMI_CIPHER_NONE;
261 return ath10k_wmi_vdev_install_key(arvif->ar, &arg);
264 static int ath10k_install_key(struct ath10k_vif *arvif,
265 struct ieee80211_key_conf *key,
266 enum set_key_cmd cmd,
267 const u8 *macaddr, u32 flags)
269 struct ath10k *ar = arvif->ar;
271 unsigned long time_left;
273 lockdep_assert_held(&ar->conf_mutex);
275 reinit_completion(&ar->install_key_done);
277 if (arvif->nohwcrypt)
280 ret = ath10k_send_key(arvif, key, cmd, macaddr, flags);
284 time_left = wait_for_completion_timeout(&ar->install_key_done, 3 * HZ);
291 static int ath10k_install_peer_wep_keys(struct ath10k_vif *arvif,
294 struct ath10k *ar = arvif->ar;
295 struct ath10k_peer *peer;
300 lockdep_assert_held(&ar->conf_mutex);
302 if (WARN_ON(arvif->vif->type != NL80211_IFTYPE_AP &&
303 arvif->vif->type != NL80211_IFTYPE_ADHOC &&
304 arvif->vif->type != NL80211_IFTYPE_MESH_POINT))
307 spin_lock_bh(&ar->data_lock);
308 peer = ath10k_peer_find(ar, arvif->vdev_id, addr);
309 spin_unlock_bh(&ar->data_lock);
314 for (i = 0; i < ARRAY_SIZE(arvif->wep_keys); i++) {
315 if (arvif->wep_keys[i] == NULL)
318 switch (arvif->vif->type) {
319 case NL80211_IFTYPE_AP:
320 flags = WMI_KEY_PAIRWISE;
322 if (arvif->def_wep_key_idx == i)
323 flags |= WMI_KEY_TX_USAGE;
325 ret = ath10k_install_key(arvif, arvif->wep_keys[i],
326 SET_KEY, addr, flags);
330 case NL80211_IFTYPE_ADHOC:
331 ret = ath10k_install_key(arvif, arvif->wep_keys[i],
337 ret = ath10k_install_key(arvif, arvif->wep_keys[i],
338 SET_KEY, addr, WMI_KEY_GROUP);
347 spin_lock_bh(&ar->data_lock);
348 peer->keys[i] = arvif->wep_keys[i];
349 spin_unlock_bh(&ar->data_lock);
352 /* In some cases (notably with static WEP IBSS with multiple keys)
353 * multicast Tx becomes broken. Both pairwise and groupwise keys are
354 * installed already. Using WMI_KEY_TX_USAGE in different combinations
355 * didn't seem help. Using def_keyid vdev parameter seems to be
356 * effective so use that.
358 * FIXME: Revisit. Perhaps this can be done in a less hacky way.
360 if (arvif->vif->type != NL80211_IFTYPE_ADHOC)
363 if (arvif->def_wep_key_idx == -1)
366 ret = ath10k_wmi_vdev_set_param(arvif->ar,
368 arvif->ar->wmi.vdev_param->def_keyid,
369 arvif->def_wep_key_idx);
371 ath10k_warn(ar, "failed to re-set def wpa key idxon vdev %i: %d\n",
372 arvif->vdev_id, ret);
379 static int ath10k_clear_peer_keys(struct ath10k_vif *arvif,
382 struct ath10k *ar = arvif->ar;
383 struct ath10k_peer *peer;
389 lockdep_assert_held(&ar->conf_mutex);
391 spin_lock_bh(&ar->data_lock);
392 peer = ath10k_peer_find(ar, arvif->vdev_id, addr);
393 spin_unlock_bh(&ar->data_lock);
398 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
399 if (peer->keys[i] == NULL)
402 /* key flags are not required to delete the key */
403 ret = ath10k_install_key(arvif, peer->keys[i],
404 DISABLE_KEY, addr, flags);
405 if (ret < 0 && first_errno == 0)
409 ath10k_warn(ar, "failed to remove peer wep key %d: %d\n",
412 spin_lock_bh(&ar->data_lock);
413 peer->keys[i] = NULL;
414 spin_unlock_bh(&ar->data_lock);
420 bool ath10k_mac_is_peer_wep_key_set(struct ath10k *ar, const u8 *addr,
423 struct ath10k_peer *peer;
426 lockdep_assert_held(&ar->data_lock);
428 /* We don't know which vdev this peer belongs to,
429 * since WMI doesn't give us that information.
431 * FIXME: multi-bss needs to be handled.
433 peer = ath10k_peer_find(ar, 0, addr);
437 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
438 if (peer->keys[i] && peer->keys[i]->keyidx == keyidx)
445 static int ath10k_clear_vdev_key(struct ath10k_vif *arvif,
446 struct ieee80211_key_conf *key)
448 struct ath10k *ar = arvif->ar;
449 struct ath10k_peer *peer;
456 lockdep_assert_held(&ar->conf_mutex);
459 /* since ath10k_install_key we can't hold data_lock all the
460 * time, so we try to remove the keys incrementally */
461 spin_lock_bh(&ar->data_lock);
463 list_for_each_entry(peer, &ar->peers, list) {
464 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
465 if (peer->keys[i] == key) {
466 ether_addr_copy(addr, peer->addr);
467 peer->keys[i] = NULL;
472 if (i < ARRAY_SIZE(peer->keys))
475 spin_unlock_bh(&ar->data_lock);
477 if (i == ARRAY_SIZE(peer->keys))
479 /* key flags are not required to delete the key */
480 ret = ath10k_install_key(arvif, key, DISABLE_KEY, addr, flags);
481 if (ret < 0 && first_errno == 0)
485 ath10k_warn(ar, "failed to remove key for %pM: %d\n",
492 static int ath10k_mac_vif_update_wep_key(struct ath10k_vif *arvif,
493 struct ieee80211_key_conf *key)
495 struct ath10k *ar = arvif->ar;
496 struct ath10k_peer *peer;
499 lockdep_assert_held(&ar->conf_mutex);
501 list_for_each_entry(peer, &ar->peers, list) {
502 if (ether_addr_equal(peer->addr, arvif->vif->addr))
505 if (ether_addr_equal(peer->addr, arvif->bssid))
508 if (peer->keys[key->keyidx] == key)
511 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vif vdev %i update key %i needs update\n",
512 arvif->vdev_id, key->keyidx);
514 ret = ath10k_install_peer_wep_keys(arvif, peer->addr);
516 ath10k_warn(ar, "failed to update wep keys on vdev %i for peer %pM: %d\n",
517 arvif->vdev_id, peer->addr, ret);
525 /*********************/
526 /* General utilities */
527 /*********************/
529 static inline enum wmi_phy_mode
530 chan_to_phymode(const struct cfg80211_chan_def *chandef)
532 enum wmi_phy_mode phymode = MODE_UNKNOWN;
534 switch (chandef->chan->band) {
535 case NL80211_BAND_2GHZ:
536 switch (chandef->width) {
537 case NL80211_CHAN_WIDTH_20_NOHT:
538 if (chandef->chan->flags & IEEE80211_CHAN_NO_OFDM)
543 case NL80211_CHAN_WIDTH_20:
544 phymode = MODE_11NG_HT20;
546 case NL80211_CHAN_WIDTH_40:
547 phymode = MODE_11NG_HT40;
549 case NL80211_CHAN_WIDTH_5:
550 case NL80211_CHAN_WIDTH_10:
551 case NL80211_CHAN_WIDTH_80:
552 case NL80211_CHAN_WIDTH_80P80:
553 case NL80211_CHAN_WIDTH_160:
554 phymode = MODE_UNKNOWN;
558 case NL80211_BAND_5GHZ:
559 switch (chandef->width) {
560 case NL80211_CHAN_WIDTH_20_NOHT:
563 case NL80211_CHAN_WIDTH_20:
564 phymode = MODE_11NA_HT20;
566 case NL80211_CHAN_WIDTH_40:
567 phymode = MODE_11NA_HT40;
569 case NL80211_CHAN_WIDTH_80:
570 phymode = MODE_11AC_VHT80;
572 case NL80211_CHAN_WIDTH_5:
573 case NL80211_CHAN_WIDTH_10:
574 case NL80211_CHAN_WIDTH_80P80:
575 case NL80211_CHAN_WIDTH_160:
576 phymode = MODE_UNKNOWN;
584 WARN_ON(phymode == MODE_UNKNOWN);
588 static u8 ath10k_parse_mpdudensity(u8 mpdudensity)
591 * 802.11n D2.0 defined values for "Minimum MPDU Start Spacing":
592 * 0 for no restriction
601 switch (mpdudensity) {
607 /* Our lower layer calculations limit our precision to
623 int ath10k_mac_vif_chan(struct ieee80211_vif *vif,
624 struct cfg80211_chan_def *def)
626 struct ieee80211_chanctx_conf *conf;
629 conf = rcu_dereference(vif->chanctx_conf);
641 static void ath10k_mac_num_chanctxs_iter(struct ieee80211_hw *hw,
642 struct ieee80211_chanctx_conf *conf,
650 static int ath10k_mac_num_chanctxs(struct ath10k *ar)
654 ieee80211_iter_chan_contexts_atomic(ar->hw,
655 ath10k_mac_num_chanctxs_iter,
662 ath10k_mac_get_any_chandef_iter(struct ieee80211_hw *hw,
663 struct ieee80211_chanctx_conf *conf,
666 struct cfg80211_chan_def **def = data;
671 static int ath10k_peer_create(struct ath10k *ar,
672 struct ieee80211_vif *vif,
673 struct ieee80211_sta *sta,
676 enum wmi_peer_type peer_type)
678 struct ath10k_vif *arvif;
679 struct ath10k_peer *peer;
683 lockdep_assert_held(&ar->conf_mutex);
685 num_peers = ar->num_peers;
687 /* Each vdev consumes a peer entry as well */
688 list_for_each_entry(arvif, &ar->arvifs, list)
691 if (num_peers >= ar->max_num_peers)
694 ret = ath10k_wmi_peer_create(ar, vdev_id, addr, peer_type);
696 ath10k_warn(ar, "failed to create wmi peer %pM on vdev %i: %i\n",
701 ret = ath10k_wait_for_peer_created(ar, vdev_id, addr);
703 ath10k_warn(ar, "failed to wait for created wmi peer %pM on vdev %i: %i\n",
708 spin_lock_bh(&ar->data_lock);
710 peer = ath10k_peer_find(ar, vdev_id, addr);
712 spin_unlock_bh(&ar->data_lock);
713 ath10k_warn(ar, "failed to find peer %pM on vdev %i after creation\n",
715 ath10k_wmi_peer_delete(ar, vdev_id, addr);
722 spin_unlock_bh(&ar->data_lock);
729 static int ath10k_mac_set_kickout(struct ath10k_vif *arvif)
731 struct ath10k *ar = arvif->ar;
735 param = ar->wmi.pdev_param->sta_kickout_th;
736 ret = ath10k_wmi_pdev_set_param(ar, param,
737 ATH10K_KICKOUT_THRESHOLD);
739 ath10k_warn(ar, "failed to set kickout threshold on vdev %i: %d\n",
740 arvif->vdev_id, ret);
744 param = ar->wmi.vdev_param->ap_keepalive_min_idle_inactive_time_secs;
745 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
746 ATH10K_KEEPALIVE_MIN_IDLE);
748 ath10k_warn(ar, "failed to set keepalive minimum idle time on vdev %i: %d\n",
749 arvif->vdev_id, ret);
753 param = ar->wmi.vdev_param->ap_keepalive_max_idle_inactive_time_secs;
754 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
755 ATH10K_KEEPALIVE_MAX_IDLE);
757 ath10k_warn(ar, "failed to set keepalive maximum idle time on vdev %i: %d\n",
758 arvif->vdev_id, ret);
762 param = ar->wmi.vdev_param->ap_keepalive_max_unresponsive_time_secs;
763 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
764 ATH10K_KEEPALIVE_MAX_UNRESPONSIVE);
766 ath10k_warn(ar, "failed to set keepalive maximum unresponsive time on vdev %i: %d\n",
767 arvif->vdev_id, ret);
774 static int ath10k_mac_set_rts(struct ath10k_vif *arvif, u32 value)
776 struct ath10k *ar = arvif->ar;
779 vdev_param = ar->wmi.vdev_param->rts_threshold;
780 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, value);
783 static int ath10k_peer_delete(struct ath10k *ar, u32 vdev_id, const u8 *addr)
787 lockdep_assert_held(&ar->conf_mutex);
789 ret = ath10k_wmi_peer_delete(ar, vdev_id, addr);
793 ret = ath10k_wait_for_peer_deleted(ar, vdev_id, addr);
802 static void ath10k_peer_cleanup(struct ath10k *ar, u32 vdev_id)
804 struct ath10k_peer *peer, *tmp;
808 lockdep_assert_held(&ar->conf_mutex);
810 spin_lock_bh(&ar->data_lock);
811 list_for_each_entry_safe(peer, tmp, &ar->peers, list) {
812 if (peer->vdev_id != vdev_id)
815 ath10k_warn(ar, "removing stale peer %pM from vdev_id %d\n",
816 peer->addr, vdev_id);
818 for_each_set_bit(peer_id, peer->peer_ids,
819 ATH10K_MAX_NUM_PEER_IDS) {
820 ar->peer_map[peer_id] = NULL;
823 /* Double check that peer is properly un-referenced from
826 for (i = 0; i < ARRAY_SIZE(ar->peer_map); i++) {
827 if (ar->peer_map[i] == peer) {
828 ath10k_warn(ar, "removing stale peer_map entry for %pM (ptr %pK idx %d)\n",
829 peer->addr, peer, i);
830 ar->peer_map[i] = NULL;
834 list_del(&peer->list);
838 spin_unlock_bh(&ar->data_lock);
841 static void ath10k_peer_cleanup_all(struct ath10k *ar)
843 struct ath10k_peer *peer, *tmp;
846 lockdep_assert_held(&ar->conf_mutex);
848 spin_lock_bh(&ar->data_lock);
849 list_for_each_entry_safe(peer, tmp, &ar->peers, list) {
850 list_del(&peer->list);
854 for (i = 0; i < ARRAY_SIZE(ar->peer_map); i++)
855 ar->peer_map[i] = NULL;
857 spin_unlock_bh(&ar->data_lock);
860 ar->num_stations = 0;
863 static int ath10k_mac_tdls_peer_update(struct ath10k *ar, u32 vdev_id,
864 struct ieee80211_sta *sta,
865 enum wmi_tdls_peer_state state)
868 struct wmi_tdls_peer_update_cmd_arg arg = {};
869 struct wmi_tdls_peer_capab_arg cap = {};
870 struct wmi_channel_arg chan_arg = {};
872 lockdep_assert_held(&ar->conf_mutex);
874 arg.vdev_id = vdev_id;
875 arg.peer_state = state;
876 ether_addr_copy(arg.addr, sta->addr);
878 cap.peer_max_sp = sta->max_sp;
879 cap.peer_uapsd_queues = sta->uapsd_queues;
881 if (state == WMI_TDLS_PEER_STATE_CONNECTED &&
882 !sta->tdls_initiator)
883 cap.is_peer_responder = 1;
885 ret = ath10k_wmi_tdls_peer_update(ar, &arg, &cap, &chan_arg);
887 ath10k_warn(ar, "failed to update tdls peer %pM on vdev %i: %i\n",
888 arg.addr, vdev_id, ret);
895 /************************/
896 /* Interface management */
897 /************************/
899 void ath10k_mac_vif_beacon_free(struct ath10k_vif *arvif)
901 struct ath10k *ar = arvif->ar;
903 lockdep_assert_held(&ar->data_lock);
908 if (!arvif->beacon_buf)
909 dma_unmap_single(ar->dev, ATH10K_SKB_CB(arvif->beacon)->paddr,
910 arvif->beacon->len, DMA_TO_DEVICE);
912 if (WARN_ON(arvif->beacon_state != ATH10K_BEACON_SCHEDULED &&
913 arvif->beacon_state != ATH10K_BEACON_SENT))
916 dev_kfree_skb_any(arvif->beacon);
918 arvif->beacon = NULL;
919 arvif->beacon_state = ATH10K_BEACON_SCHEDULED;
922 static void ath10k_mac_vif_beacon_cleanup(struct ath10k_vif *arvif)
924 struct ath10k *ar = arvif->ar;
926 lockdep_assert_held(&ar->data_lock);
928 ath10k_mac_vif_beacon_free(arvif);
930 if (arvif->beacon_buf) {
931 dma_free_coherent(ar->dev, IEEE80211_MAX_FRAME_LEN,
932 arvif->beacon_buf, arvif->beacon_paddr);
933 arvif->beacon_buf = NULL;
937 static inline int ath10k_vdev_setup_sync(struct ath10k *ar)
939 unsigned long time_left;
941 lockdep_assert_held(&ar->conf_mutex);
943 if (test_bit(ATH10K_FLAG_CRASH_FLUSH, &ar->dev_flags))
946 time_left = wait_for_completion_timeout(&ar->vdev_setup_done,
947 ATH10K_VDEV_SETUP_TIMEOUT_HZ);
954 static int ath10k_monitor_vdev_start(struct ath10k *ar, int vdev_id)
956 struct cfg80211_chan_def *chandef = NULL;
957 struct ieee80211_channel *channel = NULL;
958 struct wmi_vdev_start_request_arg arg = {};
961 lockdep_assert_held(&ar->conf_mutex);
963 ieee80211_iter_chan_contexts_atomic(ar->hw,
964 ath10k_mac_get_any_chandef_iter,
966 if (WARN_ON_ONCE(!chandef))
969 channel = chandef->chan;
971 arg.vdev_id = vdev_id;
972 arg.channel.freq = channel->center_freq;
973 arg.channel.band_center_freq1 = chandef->center_freq1;
975 /* TODO setup this dynamically, what in case we
976 don't have any vifs? */
977 arg.channel.mode = chan_to_phymode(chandef);
978 arg.channel.chan_radar =
979 !!(channel->flags & IEEE80211_CHAN_RADAR);
981 arg.channel.min_power = 0;
982 arg.channel.max_power = channel->max_power * 2;
983 arg.channel.max_reg_power = channel->max_reg_power * 2;
984 arg.channel.max_antenna_gain = channel->max_antenna_gain * 2;
986 reinit_completion(&ar->vdev_setup_done);
988 ret = ath10k_wmi_vdev_start(ar, &arg);
990 ath10k_warn(ar, "failed to request monitor vdev %i start: %d\n",
995 ret = ath10k_vdev_setup_sync(ar);
997 ath10k_warn(ar, "failed to synchronize setup for monitor vdev %i start: %d\n",
1002 ret = ath10k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr);
1004 ath10k_warn(ar, "failed to put up monitor vdev %i: %d\n",
1009 ar->monitor_vdev_id = vdev_id;
1011 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %i started\n",
1012 ar->monitor_vdev_id);
1016 ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
1018 ath10k_warn(ar, "failed to stop monitor vdev %i after start failure: %d\n",
1019 ar->monitor_vdev_id, ret);
1024 static int ath10k_monitor_vdev_stop(struct ath10k *ar)
1028 lockdep_assert_held(&ar->conf_mutex);
1030 ret = ath10k_wmi_vdev_down(ar, ar->monitor_vdev_id);
1032 ath10k_warn(ar, "failed to put down monitor vdev %i: %d\n",
1033 ar->monitor_vdev_id, ret);
1035 reinit_completion(&ar->vdev_setup_done);
1037 ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
1039 ath10k_warn(ar, "failed to to request monitor vdev %i stop: %d\n",
1040 ar->monitor_vdev_id, ret);
1042 ret = ath10k_vdev_setup_sync(ar);
1044 ath10k_warn(ar, "failed to synchronize monitor vdev %i stop: %d\n",
1045 ar->monitor_vdev_id, ret);
1047 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %i stopped\n",
1048 ar->monitor_vdev_id);
1052 static int ath10k_monitor_vdev_create(struct ath10k *ar)
1056 lockdep_assert_held(&ar->conf_mutex);
1058 if (ar->free_vdev_map == 0) {
1059 ath10k_warn(ar, "failed to find free vdev id for monitor vdev\n");
1063 bit = __ffs64(ar->free_vdev_map);
1065 ar->monitor_vdev_id = bit;
1067 ret = ath10k_wmi_vdev_create(ar, ar->monitor_vdev_id,
1068 WMI_VDEV_TYPE_MONITOR,
1071 ath10k_warn(ar, "failed to request monitor vdev %i creation: %d\n",
1072 ar->monitor_vdev_id, ret);
1076 ar->free_vdev_map &= ~(1LL << ar->monitor_vdev_id);
1077 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %d created\n",
1078 ar->monitor_vdev_id);
1083 static int ath10k_monitor_vdev_delete(struct ath10k *ar)
1087 lockdep_assert_held(&ar->conf_mutex);
1089 ret = ath10k_wmi_vdev_delete(ar, ar->monitor_vdev_id);
1091 ath10k_warn(ar, "failed to request wmi monitor vdev %i removal: %d\n",
1092 ar->monitor_vdev_id, ret);
1096 ar->free_vdev_map |= 1LL << ar->monitor_vdev_id;
1098 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %d deleted\n",
1099 ar->monitor_vdev_id);
1103 static int ath10k_monitor_start(struct ath10k *ar)
1107 lockdep_assert_held(&ar->conf_mutex);
1109 ret = ath10k_monitor_vdev_create(ar);
1111 ath10k_warn(ar, "failed to create monitor vdev: %d\n", ret);
1115 ret = ath10k_monitor_vdev_start(ar, ar->monitor_vdev_id);
1117 ath10k_warn(ar, "failed to start monitor vdev: %d\n", ret);
1118 ath10k_monitor_vdev_delete(ar);
1122 ar->monitor_started = true;
1123 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor started\n");
1128 static int ath10k_monitor_stop(struct ath10k *ar)
1132 lockdep_assert_held(&ar->conf_mutex);
1134 ret = ath10k_monitor_vdev_stop(ar);
1136 ath10k_warn(ar, "failed to stop monitor vdev: %d\n", ret);
1140 ret = ath10k_monitor_vdev_delete(ar);
1142 ath10k_warn(ar, "failed to delete monitor vdev: %d\n", ret);
1146 ar->monitor_started = false;
1147 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor stopped\n");
1152 static bool ath10k_mac_monitor_vdev_is_needed(struct ath10k *ar)
1156 /* At least one chanctx is required to derive a channel to start
1159 num_ctx = ath10k_mac_num_chanctxs(ar);
1163 /* If there's already an existing special monitor interface then don't
1164 * bother creating another monitor vdev.
1166 if (ar->monitor_arvif)
1169 return ar->monitor ||
1170 (!test_bit(ATH10K_FW_FEATURE_ALLOWS_MESH_BCAST,
1171 ar->running_fw->fw_file.fw_features) &&
1172 (ar->filter_flags & FIF_OTHER_BSS)) ||
1173 test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
1176 static bool ath10k_mac_monitor_vdev_is_allowed(struct ath10k *ar)
1180 num_ctx = ath10k_mac_num_chanctxs(ar);
1182 /* FIXME: Current interface combinations and cfg80211/mac80211 code
1183 * shouldn't allow this but make sure to prevent handling the following
1184 * case anyway since multi-channel DFS hasn't been tested at all.
1186 if (test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags) && num_ctx > 1)
1192 static int ath10k_monitor_recalc(struct ath10k *ar)
1198 lockdep_assert_held(&ar->conf_mutex);
1200 needed = ath10k_mac_monitor_vdev_is_needed(ar);
1201 allowed = ath10k_mac_monitor_vdev_is_allowed(ar);
1203 ath10k_dbg(ar, ATH10K_DBG_MAC,
1204 "mac monitor recalc started? %d needed? %d allowed? %d\n",
1205 ar->monitor_started, needed, allowed);
1207 if (WARN_ON(needed && !allowed)) {
1208 if (ar->monitor_started) {
1209 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor stopping disallowed monitor\n");
1211 ret = ath10k_monitor_stop(ar);
1213 ath10k_warn(ar, "failed to stop disallowed monitor: %d\n",
1221 if (needed == ar->monitor_started)
1225 return ath10k_monitor_start(ar);
1227 return ath10k_monitor_stop(ar);
1230 static int ath10k_recalc_rtscts_prot(struct ath10k_vif *arvif)
1232 struct ath10k *ar = arvif->ar;
1233 u32 vdev_param, rts_cts = 0;
1235 lockdep_assert_held(&ar->conf_mutex);
1237 vdev_param = ar->wmi.vdev_param->enable_rtscts;
1239 rts_cts |= SM(WMI_RTSCTS_ENABLED, WMI_RTSCTS_SET);
1241 if (arvif->num_legacy_stations > 0)
1242 rts_cts |= SM(WMI_RTSCTS_ACROSS_SW_RETRIES,
1243 WMI_RTSCTS_PROFILE);
1245 rts_cts |= SM(WMI_RTSCTS_FOR_SECOND_RATESERIES,
1246 WMI_RTSCTS_PROFILE);
1248 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
1252 static int ath10k_start_cac(struct ath10k *ar)
1256 lockdep_assert_held(&ar->conf_mutex);
1258 set_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
1260 ret = ath10k_monitor_recalc(ar);
1262 ath10k_warn(ar, "failed to start monitor (cac): %d\n", ret);
1263 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
1267 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac cac start monitor vdev %d\n",
1268 ar->monitor_vdev_id);
1273 static int ath10k_stop_cac(struct ath10k *ar)
1275 lockdep_assert_held(&ar->conf_mutex);
1277 /* CAC is not running - do nothing */
1278 if (!test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags))
1281 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
1282 ath10k_monitor_stop(ar);
1284 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac cac finished\n");
1289 static void ath10k_mac_has_radar_iter(struct ieee80211_hw *hw,
1290 struct ieee80211_chanctx_conf *conf,
1295 if (!*ret && conf->radar_enabled)
1299 static bool ath10k_mac_has_radar_enabled(struct ath10k *ar)
1301 bool has_radar = false;
1303 ieee80211_iter_chan_contexts_atomic(ar->hw,
1304 ath10k_mac_has_radar_iter,
1310 static void ath10k_recalc_radar_detection(struct ath10k *ar)
1314 lockdep_assert_held(&ar->conf_mutex);
1316 ath10k_stop_cac(ar);
1318 if (!ath10k_mac_has_radar_enabled(ar))
1321 if (ar->num_started_vdevs > 0)
1324 ret = ath10k_start_cac(ar);
1327 * Not possible to start CAC on current channel so starting
1328 * radiation is not allowed, make this channel DFS_UNAVAILABLE
1329 * by indicating that radar was detected.
1331 ath10k_warn(ar, "failed to start CAC: %d\n", ret);
1332 ieee80211_radar_detected(ar->hw);
1336 static int ath10k_vdev_stop(struct ath10k_vif *arvif)
1338 struct ath10k *ar = arvif->ar;
1341 lockdep_assert_held(&ar->conf_mutex);
1343 reinit_completion(&ar->vdev_setup_done);
1345 ret = ath10k_wmi_vdev_stop(ar, arvif->vdev_id);
1347 ath10k_warn(ar, "failed to stop WMI vdev %i: %d\n",
1348 arvif->vdev_id, ret);
1352 ret = ath10k_vdev_setup_sync(ar);
1354 ath10k_warn(ar, "failed to syncronise setup for vdev %i: %d\n",
1355 arvif->vdev_id, ret);
1359 WARN_ON(ar->num_started_vdevs == 0);
1361 if (ar->num_started_vdevs != 0) {
1362 ar->num_started_vdevs--;
1363 ath10k_recalc_radar_detection(ar);
1369 static int ath10k_vdev_start_restart(struct ath10k_vif *arvif,
1370 const struct cfg80211_chan_def *chandef,
1373 struct ath10k *ar = arvif->ar;
1374 struct wmi_vdev_start_request_arg arg = {};
1377 lockdep_assert_held(&ar->conf_mutex);
1379 reinit_completion(&ar->vdev_setup_done);
1381 arg.vdev_id = arvif->vdev_id;
1382 arg.dtim_period = arvif->dtim_period;
1383 arg.bcn_intval = arvif->beacon_interval;
1385 arg.channel.freq = chandef->chan->center_freq;
1386 arg.channel.band_center_freq1 = chandef->center_freq1;
1387 arg.channel.mode = chan_to_phymode(chandef);
1389 arg.channel.min_power = 0;
1390 arg.channel.max_power = chandef->chan->max_power * 2;
1391 arg.channel.max_reg_power = chandef->chan->max_reg_power * 2;
1392 arg.channel.max_antenna_gain = chandef->chan->max_antenna_gain * 2;
1394 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
1395 arg.ssid = arvif->u.ap.ssid;
1396 arg.ssid_len = arvif->u.ap.ssid_len;
1397 arg.hidden_ssid = arvif->u.ap.hidden_ssid;
1399 /* For now allow DFS for AP mode */
1400 arg.channel.chan_radar =
1401 !!(chandef->chan->flags & IEEE80211_CHAN_RADAR);
1402 } else if (arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
1403 arg.ssid = arvif->vif->bss_conf.ssid;
1404 arg.ssid_len = arvif->vif->bss_conf.ssid_len;
1407 ath10k_dbg(ar, ATH10K_DBG_MAC,
1408 "mac vdev %d start center_freq %d phymode %s\n",
1409 arg.vdev_id, arg.channel.freq,
1410 ath10k_wmi_phymode_str(arg.channel.mode));
1413 ret = ath10k_wmi_vdev_restart(ar, &arg);
1415 ret = ath10k_wmi_vdev_start(ar, &arg);
1418 ath10k_warn(ar, "failed to start WMI vdev %i: %d\n",
1423 ret = ath10k_vdev_setup_sync(ar);
1426 "failed to synchronize setup for vdev %i restart %d: %d\n",
1427 arg.vdev_id, restart, ret);
1431 ar->num_started_vdevs++;
1432 ath10k_recalc_radar_detection(ar);
1437 static int ath10k_vdev_start(struct ath10k_vif *arvif,
1438 const struct cfg80211_chan_def *def)
1440 return ath10k_vdev_start_restart(arvif, def, false);
1443 static int ath10k_vdev_restart(struct ath10k_vif *arvif,
1444 const struct cfg80211_chan_def *def)
1446 return ath10k_vdev_start_restart(arvif, def, true);
1449 static int ath10k_mac_setup_bcn_p2p_ie(struct ath10k_vif *arvif,
1450 struct sk_buff *bcn)
1452 struct ath10k *ar = arvif->ar;
1453 struct ieee80211_mgmt *mgmt;
1457 if (arvif->vif->type != NL80211_IFTYPE_AP || !arvif->vif->p2p)
1460 mgmt = (void *)bcn->data;
1461 p2p_ie = cfg80211_find_vendor_ie(WLAN_OUI_WFA, WLAN_OUI_TYPE_WFA_P2P,
1462 mgmt->u.beacon.variable,
1463 bcn->len - (mgmt->u.beacon.variable -
1468 ret = ath10k_wmi_p2p_go_bcn_ie(ar, arvif->vdev_id, p2p_ie);
1470 ath10k_warn(ar, "failed to submit p2p go bcn ie for vdev %i: %d\n",
1471 arvif->vdev_id, ret);
1478 static int ath10k_mac_remove_vendor_ie(struct sk_buff *skb, unsigned int oui,
1479 u8 oui_type, size_t ie_offset)
1486 if (WARN_ON(skb->len < ie_offset))
1489 ie = (u8 *)cfg80211_find_vendor_ie(oui, oui_type,
1490 skb->data + ie_offset,
1491 skb->len - ie_offset);
1496 end = skb->data + skb->len;
1499 if (WARN_ON(next > end))
1502 memmove(ie, next, end - next);
1503 skb_trim(skb, skb->len - len);
1508 static int ath10k_mac_setup_bcn_tmpl(struct ath10k_vif *arvif)
1510 struct ath10k *ar = arvif->ar;
1511 struct ieee80211_hw *hw = ar->hw;
1512 struct ieee80211_vif *vif = arvif->vif;
1513 struct ieee80211_mutable_offsets offs = {};
1514 struct sk_buff *bcn;
1517 if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map))
1520 if (arvif->vdev_type != WMI_VDEV_TYPE_AP &&
1521 arvif->vdev_type != WMI_VDEV_TYPE_IBSS)
1524 bcn = ieee80211_beacon_get_template(hw, vif, &offs);
1526 ath10k_warn(ar, "failed to get beacon template from mac80211\n");
1530 ret = ath10k_mac_setup_bcn_p2p_ie(arvif, bcn);
1532 ath10k_warn(ar, "failed to setup p2p go bcn ie: %d\n", ret);
1537 /* P2P IE is inserted by firmware automatically (as configured above)
1538 * so remove it from the base beacon template to avoid duplicate P2P
1539 * IEs in beacon frames.
1541 ath10k_mac_remove_vendor_ie(bcn, WLAN_OUI_WFA, WLAN_OUI_TYPE_WFA_P2P,
1542 offsetof(struct ieee80211_mgmt,
1543 u.beacon.variable));
1545 ret = ath10k_wmi_bcn_tmpl(ar, arvif->vdev_id, offs.tim_offset, bcn, 0,
1550 ath10k_warn(ar, "failed to submit beacon template command: %d\n",
1558 static int ath10k_mac_setup_prb_tmpl(struct ath10k_vif *arvif)
1560 struct ath10k *ar = arvif->ar;
1561 struct ieee80211_hw *hw = ar->hw;
1562 struct ieee80211_vif *vif = arvif->vif;
1563 struct sk_buff *prb;
1566 if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map))
1569 if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
1572 prb = ieee80211_proberesp_get(hw, vif);
1574 ath10k_warn(ar, "failed to get probe resp template from mac80211\n");
1578 ret = ath10k_wmi_prb_tmpl(ar, arvif->vdev_id, prb);
1582 ath10k_warn(ar, "failed to submit probe resp template command: %d\n",
1590 static int ath10k_mac_vif_fix_hidden_ssid(struct ath10k_vif *arvif)
1592 struct ath10k *ar = arvif->ar;
1593 struct cfg80211_chan_def def;
1596 /* When originally vdev is started during assign_vif_chanctx() some
1597 * information is missing, notably SSID. Firmware revisions with beacon
1598 * offloading require the SSID to be provided during vdev (re)start to
1599 * handle hidden SSID properly.
1601 * Vdev restart must be done after vdev has been both started and
1602 * upped. Otherwise some firmware revisions (at least 10.2) fail to
1603 * deliver vdev restart response event causing timeouts during vdev
1604 * syncing in ath10k.
1606 * Note: The vdev down/up and template reinstallation could be skipped
1607 * since only wmi-tlv firmware are known to have beacon offload and
1608 * wmi-tlv doesn't seem to misbehave like 10.2 wrt vdev restart
1609 * response delivery. It's probably more robust to keep it as is.
1611 if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map))
1614 if (WARN_ON(!arvif->is_started))
1617 if (WARN_ON(!arvif->is_up))
1620 if (WARN_ON(ath10k_mac_vif_chan(arvif->vif, &def)))
1623 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
1625 ath10k_warn(ar, "failed to bring down ap vdev %i: %d\n",
1626 arvif->vdev_id, ret);
1630 /* Vdev down reset beacon & presp templates. Reinstall them. Otherwise
1631 * firmware will crash upon vdev up.
1634 ret = ath10k_mac_setup_bcn_tmpl(arvif);
1636 ath10k_warn(ar, "failed to update beacon template: %d\n", ret);
1640 ret = ath10k_mac_setup_prb_tmpl(arvif);
1642 ath10k_warn(ar, "failed to update presp template: %d\n", ret);
1646 ret = ath10k_vdev_restart(arvif, &def);
1648 ath10k_warn(ar, "failed to restart ap vdev %i: %d\n",
1649 arvif->vdev_id, ret);
1653 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
1656 ath10k_warn(ar, "failed to bring up ap vdev %i: %d\n",
1657 arvif->vdev_id, ret);
1664 static void ath10k_control_beaconing(struct ath10k_vif *arvif,
1665 struct ieee80211_bss_conf *info)
1667 struct ath10k *ar = arvif->ar;
1670 lockdep_assert_held(&arvif->ar->conf_mutex);
1672 if (!info->enable_beacon) {
1673 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
1675 ath10k_warn(ar, "failed to down vdev_id %i: %d\n",
1676 arvif->vdev_id, ret);
1678 arvif->is_up = false;
1680 spin_lock_bh(&arvif->ar->data_lock);
1681 ath10k_mac_vif_beacon_free(arvif);
1682 spin_unlock_bh(&arvif->ar->data_lock);
1687 arvif->tx_seq_no = 0x1000;
1690 ether_addr_copy(arvif->bssid, info->bssid);
1692 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
1695 ath10k_warn(ar, "failed to bring up vdev %d: %i\n",
1696 arvif->vdev_id, ret);
1700 arvif->is_up = true;
1702 ret = ath10k_mac_vif_fix_hidden_ssid(arvif);
1704 ath10k_warn(ar, "failed to fix hidden ssid for vdev %i, expect trouble: %d\n",
1705 arvif->vdev_id, ret);
1709 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d up\n", arvif->vdev_id);
1712 static void ath10k_control_ibss(struct ath10k_vif *arvif,
1713 struct ieee80211_bss_conf *info,
1714 const u8 self_peer[ETH_ALEN])
1716 struct ath10k *ar = arvif->ar;
1720 lockdep_assert_held(&arvif->ar->conf_mutex);
1722 if (!info->ibss_joined) {
1723 if (is_zero_ether_addr(arvif->bssid))
1726 eth_zero_addr(arvif->bssid);
1731 vdev_param = arvif->ar->wmi.vdev_param->atim_window;
1732 ret = ath10k_wmi_vdev_set_param(arvif->ar, arvif->vdev_id, vdev_param,
1733 ATH10K_DEFAULT_ATIM);
1735 ath10k_warn(ar, "failed to set IBSS ATIM for vdev %d: %d\n",
1736 arvif->vdev_id, ret);
1739 static int ath10k_mac_vif_recalc_ps_wake_threshold(struct ath10k_vif *arvif)
1741 struct ath10k *ar = arvif->ar;
1746 lockdep_assert_held(&arvif->ar->conf_mutex);
1748 if (arvif->u.sta.uapsd)
1749 value = WMI_STA_PS_TX_WAKE_THRESHOLD_NEVER;
1751 value = WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS;
1753 param = WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD;
1754 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param, value);
1756 ath10k_warn(ar, "failed to submit ps wake threshold %u on vdev %i: %d\n",
1757 value, arvif->vdev_id, ret);
1764 static int ath10k_mac_vif_recalc_ps_poll_count(struct ath10k_vif *arvif)
1766 struct ath10k *ar = arvif->ar;
1771 lockdep_assert_held(&arvif->ar->conf_mutex);
1773 if (arvif->u.sta.uapsd)
1774 value = WMI_STA_PS_PSPOLL_COUNT_UAPSD;
1776 value = WMI_STA_PS_PSPOLL_COUNT_NO_MAX;
1778 param = WMI_STA_PS_PARAM_PSPOLL_COUNT;
1779 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
1782 ath10k_warn(ar, "failed to submit ps poll count %u on vdev %i: %d\n",
1783 value, arvif->vdev_id, ret);
1790 static int ath10k_mac_num_vifs_started(struct ath10k *ar)
1792 struct ath10k_vif *arvif;
1795 lockdep_assert_held(&ar->conf_mutex);
1797 list_for_each_entry(arvif, &ar->arvifs, list)
1798 if (arvif->is_started)
1804 static int ath10k_mac_vif_setup_ps(struct ath10k_vif *arvif)
1806 struct ath10k *ar = arvif->ar;
1807 struct ieee80211_vif *vif = arvif->vif;
1808 struct ieee80211_conf *conf = &ar->hw->conf;
1809 enum wmi_sta_powersave_param param;
1810 enum wmi_sta_ps_mode psmode;
1815 lockdep_assert_held(&arvif->ar->conf_mutex);
1817 if (arvif->vif->type != NL80211_IFTYPE_STATION)
1820 enable_ps = arvif->ps;
1822 if (enable_ps && ath10k_mac_num_vifs_started(ar) > 1 &&
1823 !test_bit(ATH10K_FW_FEATURE_MULTI_VIF_PS_SUPPORT,
1824 ar->running_fw->fw_file.fw_features)) {
1825 ath10k_warn(ar, "refusing to enable ps on vdev %i: not supported by fw\n",
1830 if (!arvif->is_started) {
1831 /* mac80211 can update vif powersave state while disconnected.
1832 * Firmware doesn't behave nicely and consumes more power than
1833 * necessary if PS is disabled on a non-started vdev. Hence
1834 * force-enable PS for non-running vdevs.
1836 psmode = WMI_STA_PS_MODE_ENABLED;
1837 } else if (enable_ps) {
1838 psmode = WMI_STA_PS_MODE_ENABLED;
1839 param = WMI_STA_PS_PARAM_INACTIVITY_TIME;
1841 ps_timeout = conf->dynamic_ps_timeout;
1842 if (ps_timeout == 0) {
1843 /* Firmware doesn't like 0 */
1844 ps_timeout = ieee80211_tu_to_usec(
1845 vif->bss_conf.beacon_int) / 1000;
1848 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param,
1851 ath10k_warn(ar, "failed to set inactivity time for vdev %d: %i\n",
1852 arvif->vdev_id, ret);
1856 psmode = WMI_STA_PS_MODE_DISABLED;
1859 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d psmode %s\n",
1860 arvif->vdev_id, psmode ? "enable" : "disable");
1862 ret = ath10k_wmi_set_psmode(ar, arvif->vdev_id, psmode);
1864 ath10k_warn(ar, "failed to set PS Mode %d for vdev %d: %d\n",
1865 psmode, arvif->vdev_id, ret);
1872 static int ath10k_mac_vif_disable_keepalive(struct ath10k_vif *arvif)
1874 struct ath10k *ar = arvif->ar;
1875 struct wmi_sta_keepalive_arg arg = {};
1878 lockdep_assert_held(&arvif->ar->conf_mutex);
1880 if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
1883 if (!test_bit(WMI_SERVICE_STA_KEEP_ALIVE, ar->wmi.svc_map))
1886 /* Some firmware revisions have a bug and ignore the `enabled` field.
1887 * Instead use the interval to disable the keepalive.
1889 arg.vdev_id = arvif->vdev_id;
1891 arg.method = WMI_STA_KEEPALIVE_METHOD_NULL_FRAME;
1892 arg.interval = WMI_STA_KEEPALIVE_INTERVAL_DISABLE;
1894 ret = ath10k_wmi_sta_keepalive(ar, &arg);
1896 ath10k_warn(ar, "failed to submit keepalive on vdev %i: %d\n",
1897 arvif->vdev_id, ret);
1904 static void ath10k_mac_vif_ap_csa_count_down(struct ath10k_vif *arvif)
1906 struct ath10k *ar = arvif->ar;
1907 struct ieee80211_vif *vif = arvif->vif;
1910 lockdep_assert_held(&arvif->ar->conf_mutex);
1912 if (WARN_ON(!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map)))
1915 if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
1918 if (!vif->csa_active)
1924 if (!ieee80211_csa_is_complete(vif)) {
1925 ieee80211_csa_update_counter(vif);
1927 ret = ath10k_mac_setup_bcn_tmpl(arvif);
1929 ath10k_warn(ar, "failed to update bcn tmpl during csa: %d\n",
1932 ret = ath10k_mac_setup_prb_tmpl(arvif);
1934 ath10k_warn(ar, "failed to update prb tmpl during csa: %d\n",
1937 ieee80211_csa_finish(vif);
1941 static void ath10k_mac_vif_ap_csa_work(struct work_struct *work)
1943 struct ath10k_vif *arvif = container_of(work, struct ath10k_vif,
1945 struct ath10k *ar = arvif->ar;
1947 mutex_lock(&ar->conf_mutex);
1948 ath10k_mac_vif_ap_csa_count_down(arvif);
1949 mutex_unlock(&ar->conf_mutex);
1952 static void ath10k_mac_handle_beacon_iter(void *data, u8 *mac,
1953 struct ieee80211_vif *vif)
1955 struct sk_buff *skb = data;
1956 struct ieee80211_mgmt *mgmt = (void *)skb->data;
1957 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1959 if (vif->type != NL80211_IFTYPE_STATION)
1962 if (!ether_addr_equal(mgmt->bssid, vif->bss_conf.bssid))
1965 cancel_delayed_work(&arvif->connection_loss_work);
1968 void ath10k_mac_handle_beacon(struct ath10k *ar, struct sk_buff *skb)
1970 ieee80211_iterate_active_interfaces_atomic(ar->hw,
1971 IEEE80211_IFACE_ITER_NORMAL,
1972 ath10k_mac_handle_beacon_iter,
1976 static void ath10k_mac_handle_beacon_miss_iter(void *data, u8 *mac,
1977 struct ieee80211_vif *vif)
1979 u32 *vdev_id = data;
1980 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1981 struct ath10k *ar = arvif->ar;
1982 struct ieee80211_hw *hw = ar->hw;
1984 if (arvif->vdev_id != *vdev_id)
1990 ieee80211_beacon_loss(vif);
1992 /* Firmware doesn't report beacon loss events repeatedly. If AP probe
1993 * (done by mac80211) succeeds but beacons do not resume then it
1994 * doesn't make sense to continue operation. Queue connection loss work
1995 * which can be cancelled when beacon is received.
1997 ieee80211_queue_delayed_work(hw, &arvif->connection_loss_work,
1998 ATH10K_CONNECTION_LOSS_HZ);
2001 void ath10k_mac_handle_beacon_miss(struct ath10k *ar, u32 vdev_id)
2003 ieee80211_iterate_active_interfaces_atomic(ar->hw,
2004 IEEE80211_IFACE_ITER_NORMAL,
2005 ath10k_mac_handle_beacon_miss_iter,
2009 static void ath10k_mac_vif_sta_connection_loss_work(struct work_struct *work)
2011 struct ath10k_vif *arvif = container_of(work, struct ath10k_vif,
2012 connection_loss_work.work);
2013 struct ieee80211_vif *vif = arvif->vif;
2018 ieee80211_connection_loss(vif);
2021 /**********************/
2022 /* Station management */
2023 /**********************/
2025 static u32 ath10k_peer_assoc_h_listen_intval(struct ath10k *ar,
2026 struct ieee80211_vif *vif)
2028 /* Some firmware revisions have unstable STA powersave when listen
2029 * interval is set too high (e.g. 5). The symptoms are firmware doesn't
2030 * generate NullFunc frames properly even if buffered frames have been
2031 * indicated in Beacon TIM. Firmware would seldom wake up to pull
2032 * buffered frames. Often pinging the device from AP would simply fail.
2034 * As a workaround set it to 1.
2036 if (vif->type == NL80211_IFTYPE_STATION)
2039 return ar->hw->conf.listen_interval;
2042 static void ath10k_peer_assoc_h_basic(struct ath10k *ar,
2043 struct ieee80211_vif *vif,
2044 struct ieee80211_sta *sta,
2045 struct wmi_peer_assoc_complete_arg *arg)
2047 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2050 lockdep_assert_held(&ar->conf_mutex);
2052 if (vif->type == NL80211_IFTYPE_STATION)
2053 aid = vif->bss_conf.aid;
2057 ether_addr_copy(arg->addr, sta->addr);
2058 arg->vdev_id = arvif->vdev_id;
2059 arg->peer_aid = aid;
2060 arg->peer_flags |= arvif->ar->wmi.peer_flags->auth;
2061 arg->peer_listen_intval = ath10k_peer_assoc_h_listen_intval(ar, vif);
2062 arg->peer_num_spatial_streams = 1;
2063 arg->peer_caps = vif->bss_conf.assoc_capability;
2066 static void ath10k_peer_assoc_h_crypto(struct ath10k *ar,
2067 struct ieee80211_vif *vif,
2068 struct ieee80211_sta *sta,
2069 struct wmi_peer_assoc_complete_arg *arg)
2071 struct ieee80211_bss_conf *info = &vif->bss_conf;
2072 struct cfg80211_chan_def def;
2073 struct cfg80211_bss *bss;
2074 const u8 *rsnie = NULL;
2075 const u8 *wpaie = NULL;
2077 lockdep_assert_held(&ar->conf_mutex);
2079 if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2082 bss = cfg80211_get_bss(ar->hw->wiphy, def.chan, info->bssid, NULL, 0,
2083 IEEE80211_BSS_TYPE_ANY, IEEE80211_PRIVACY_ANY);
2085 const struct cfg80211_bss_ies *ies;
2088 rsnie = ieee80211_bss_get_ie(bss, WLAN_EID_RSN);
2090 ies = rcu_dereference(bss->ies);
2092 wpaie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
2093 WLAN_OUI_TYPE_MICROSOFT_WPA,
2097 cfg80211_put_bss(ar->hw->wiphy, bss);
2100 /* FIXME: base on RSN IE/WPA IE is a correct idea? */
2101 if (rsnie || wpaie) {
2102 ath10k_dbg(ar, ATH10K_DBG_WMI, "%s: rsn ie found\n", __func__);
2103 arg->peer_flags |= ar->wmi.peer_flags->need_ptk_4_way;
2107 ath10k_dbg(ar, ATH10K_DBG_WMI, "%s: wpa ie found\n", __func__);
2108 arg->peer_flags |= ar->wmi.peer_flags->need_gtk_2_way;
2112 test_bit(ATH10K_FW_FEATURE_MFP_SUPPORT,
2113 ar->running_fw->fw_file.fw_features)) {
2114 arg->peer_flags |= ar->wmi.peer_flags->pmf;
2118 static void ath10k_peer_assoc_h_rates(struct ath10k *ar,
2119 struct ieee80211_vif *vif,
2120 struct ieee80211_sta *sta,
2121 struct wmi_peer_assoc_complete_arg *arg)
2123 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2124 struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates;
2125 struct cfg80211_chan_def def;
2126 const struct ieee80211_supported_band *sband;
2127 const struct ieee80211_rate *rates;
2128 enum nl80211_band band;
2133 lockdep_assert_held(&ar->conf_mutex);
2135 if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2138 band = def.chan->band;
2139 sband = ar->hw->wiphy->bands[band];
2140 ratemask = sta->supp_rates[band];
2141 ratemask &= arvif->bitrate_mask.control[band].legacy;
2142 rates = sband->bitrates;
2144 rateset->num_rates = 0;
2146 for (i = 0; i < 32; i++, ratemask >>= 1, rates++) {
2147 if (!(ratemask & 1))
2150 rate = ath10k_mac_bitrate_to_rate(rates->bitrate);
2151 rateset->rates[rateset->num_rates] = rate;
2152 rateset->num_rates++;
2157 ath10k_peer_assoc_h_ht_masked(const u8 ht_mcs_mask[IEEE80211_HT_MCS_MASK_LEN])
2161 for (nss = 0; nss < IEEE80211_HT_MCS_MASK_LEN; nss++)
2162 if (ht_mcs_mask[nss])
2169 ath10k_peer_assoc_h_vht_masked(const u16 vht_mcs_mask[NL80211_VHT_NSS_MAX])
2173 for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++)
2174 if (vht_mcs_mask[nss])
2180 static void ath10k_peer_assoc_h_ht(struct ath10k *ar,
2181 struct ieee80211_vif *vif,
2182 struct ieee80211_sta *sta,
2183 struct wmi_peer_assoc_complete_arg *arg)
2185 const struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
2186 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2187 struct cfg80211_chan_def def;
2188 enum nl80211_band band;
2189 const u8 *ht_mcs_mask;
2190 const u16 *vht_mcs_mask;
2195 lockdep_assert_held(&ar->conf_mutex);
2197 if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2200 if (!ht_cap->ht_supported)
2203 band = def.chan->band;
2204 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
2205 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2207 if (ath10k_peer_assoc_h_ht_masked(ht_mcs_mask) &&
2208 ath10k_peer_assoc_h_vht_masked(vht_mcs_mask))
2211 arg->peer_flags |= ar->wmi.peer_flags->ht;
2212 arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
2213 ht_cap->ampdu_factor)) - 1;
2215 arg->peer_mpdu_density =
2216 ath10k_parse_mpdudensity(ht_cap->ampdu_density);
2218 arg->peer_ht_caps = ht_cap->cap;
2219 arg->peer_rate_caps |= WMI_RC_HT_FLAG;
2221 if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING)
2222 arg->peer_flags |= ar->wmi.peer_flags->ldbc;
2224 if (sta->bandwidth >= IEEE80211_STA_RX_BW_40) {
2225 arg->peer_flags |= ar->wmi.peer_flags->bw40;
2226 arg->peer_rate_caps |= WMI_RC_CW40_FLAG;
2229 if (arvif->bitrate_mask.control[band].gi != NL80211_TXRATE_FORCE_LGI) {
2230 if (ht_cap->cap & IEEE80211_HT_CAP_SGI_20)
2231 arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
2233 if (ht_cap->cap & IEEE80211_HT_CAP_SGI_40)
2234 arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
2237 if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) {
2238 arg->peer_rate_caps |= WMI_RC_TX_STBC_FLAG;
2239 arg->peer_flags |= ar->wmi.peer_flags->stbc;
2242 if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) {
2243 stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC;
2244 stbc = stbc >> IEEE80211_HT_CAP_RX_STBC_SHIFT;
2245 stbc = stbc << WMI_RC_RX_STBC_FLAG_S;
2246 arg->peer_rate_caps |= stbc;
2247 arg->peer_flags |= ar->wmi.peer_flags->stbc;
2250 if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2])
2251 arg->peer_rate_caps |= WMI_RC_TS_FLAG;
2252 else if (ht_cap->mcs.rx_mask[1])
2253 arg->peer_rate_caps |= WMI_RC_DS_FLAG;
2255 for (i = 0, n = 0, max_nss = 0; i < IEEE80211_HT_MCS_MASK_LEN * 8; i++)
2256 if ((ht_cap->mcs.rx_mask[i / 8] & BIT(i % 8)) &&
2257 (ht_mcs_mask[i / 8] & BIT(i % 8))) {
2258 max_nss = (i / 8) + 1;
2259 arg->peer_ht_rates.rates[n++] = i;
2263 * This is a workaround for HT-enabled STAs which break the spec
2264 * and have no HT capabilities RX mask (no HT RX MCS map).
2266 * As per spec, in section 20.3.5 Modulation and coding scheme (MCS),
2267 * MCS 0 through 7 are mandatory in 20MHz with 800 ns GI at all STAs.
2269 * Firmware asserts if such situation occurs.
2272 arg->peer_ht_rates.num_rates = 8;
2273 for (i = 0; i < arg->peer_ht_rates.num_rates; i++)
2274 arg->peer_ht_rates.rates[i] = i;
2276 arg->peer_ht_rates.num_rates = n;
2277 arg->peer_num_spatial_streams = min(sta->rx_nss, max_nss);
2280 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n",
2282 arg->peer_ht_rates.num_rates,
2283 arg->peer_num_spatial_streams);
2286 static int ath10k_peer_assoc_qos_ap(struct ath10k *ar,
2287 struct ath10k_vif *arvif,
2288 struct ieee80211_sta *sta)
2294 lockdep_assert_held(&ar->conf_mutex);
2296 if (sta->wme && sta->uapsd_queues) {
2297 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac uapsd_queues 0x%x max_sp %d\n",
2298 sta->uapsd_queues, sta->max_sp);
2300 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO)
2301 uapsd |= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN |
2302 WMI_AP_PS_UAPSD_AC3_TRIGGER_EN;
2303 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI)
2304 uapsd |= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN |
2305 WMI_AP_PS_UAPSD_AC2_TRIGGER_EN;
2306 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK)
2307 uapsd |= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN |
2308 WMI_AP_PS_UAPSD_AC1_TRIGGER_EN;
2309 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE)
2310 uapsd |= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN |
2311 WMI_AP_PS_UAPSD_AC0_TRIGGER_EN;
2313 if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP)
2314 max_sp = sta->max_sp;
2316 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
2318 WMI_AP_PS_PEER_PARAM_UAPSD,
2321 ath10k_warn(ar, "failed to set ap ps peer param uapsd for vdev %i: %d\n",
2322 arvif->vdev_id, ret);
2326 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
2328 WMI_AP_PS_PEER_PARAM_MAX_SP,
2331 ath10k_warn(ar, "failed to set ap ps peer param max sp for vdev %i: %d\n",
2332 arvif->vdev_id, ret);
2336 /* TODO setup this based on STA listen interval and
2337 beacon interval. Currently we don't know
2338 sta->listen_interval - mac80211 patch required.
2339 Currently use 10 seconds */
2340 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id, sta->addr,
2341 WMI_AP_PS_PEER_PARAM_AGEOUT_TIME,
2344 ath10k_warn(ar, "failed to set ap ps peer param ageout time for vdev %i: %d\n",
2345 arvif->vdev_id, ret);
2354 ath10k_peer_assoc_h_vht_limit(u16 tx_mcs_set,
2355 const u16 vht_mcs_limit[NL80211_VHT_NSS_MAX])
2362 for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) {
2363 mcs_map = ath10k_mac_get_max_vht_mcs_map(tx_mcs_set, nss) &
2367 idx_limit = fls(mcs_map) - 1;
2371 switch (idx_limit) {
2372 case 0: /* fall through */
2373 case 1: /* fall through */
2374 case 2: /* fall through */
2375 case 3: /* fall through */
2376 case 4: /* fall through */
2377 case 5: /* fall through */
2378 case 6: /* fall through */
2380 /* see ath10k_mac_can_set_bitrate_mask() */
2384 mcs = IEEE80211_VHT_MCS_NOT_SUPPORTED;
2387 mcs = IEEE80211_VHT_MCS_SUPPORT_0_7;
2390 mcs = IEEE80211_VHT_MCS_SUPPORT_0_8;
2393 mcs = IEEE80211_VHT_MCS_SUPPORT_0_9;
2397 tx_mcs_set &= ~(0x3 << (nss * 2));
2398 tx_mcs_set |= mcs << (nss * 2);
2404 static void ath10k_peer_assoc_h_vht(struct ath10k *ar,
2405 struct ieee80211_vif *vif,
2406 struct ieee80211_sta *sta,
2407 struct wmi_peer_assoc_complete_arg *arg)
2409 const struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
2410 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2411 struct cfg80211_chan_def def;
2412 enum nl80211_band band;
2413 const u16 *vht_mcs_mask;
2416 if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2419 if (!vht_cap->vht_supported)
2422 band = def.chan->band;
2423 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2425 if (ath10k_peer_assoc_h_vht_masked(vht_mcs_mask))
2428 arg->peer_flags |= ar->wmi.peer_flags->vht;
2430 if (def.chan->band == NL80211_BAND_2GHZ)
2431 arg->peer_flags |= ar->wmi.peer_flags->vht_2g;
2433 arg->peer_vht_caps = vht_cap->cap;
2435 ampdu_factor = (vht_cap->cap &
2436 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >>
2437 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
2439 /* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to
2440 * zero in VHT IE. Using it would result in degraded throughput.
2441 * arg->peer_max_mpdu at this point contains HT max_mpdu so keep
2442 * it if VHT max_mpdu is smaller. */
2443 arg->peer_max_mpdu = max(arg->peer_max_mpdu,
2444 (1U << (IEEE80211_HT_MAX_AMPDU_FACTOR +
2445 ampdu_factor)) - 1);
2447 if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
2448 arg->peer_flags |= ar->wmi.peer_flags->bw80;
2450 arg->peer_vht_rates.rx_max_rate =
2451 __le16_to_cpu(vht_cap->vht_mcs.rx_highest);
2452 arg->peer_vht_rates.rx_mcs_set =
2453 __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map);
2454 arg->peer_vht_rates.tx_max_rate =
2455 __le16_to_cpu(vht_cap->vht_mcs.tx_highest);
2456 arg->peer_vht_rates.tx_mcs_set = ath10k_peer_assoc_h_vht_limit(
2457 __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map), vht_mcs_mask);
2459 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vht peer %pM max_mpdu %d flags 0x%x\n",
2460 sta->addr, arg->peer_max_mpdu, arg->peer_flags);
2463 static void ath10k_peer_assoc_h_qos(struct ath10k *ar,
2464 struct ieee80211_vif *vif,
2465 struct ieee80211_sta *sta,
2466 struct wmi_peer_assoc_complete_arg *arg)
2468 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2470 switch (arvif->vdev_type) {
2471 case WMI_VDEV_TYPE_AP:
2473 arg->peer_flags |= arvif->ar->wmi.peer_flags->qos;
2475 if (sta->wme && sta->uapsd_queues) {
2476 arg->peer_flags |= arvif->ar->wmi.peer_flags->apsd;
2477 arg->peer_rate_caps |= WMI_RC_UAPSD_FLAG;
2480 case WMI_VDEV_TYPE_STA:
2481 if (vif->bss_conf.qos)
2482 arg->peer_flags |= arvif->ar->wmi.peer_flags->qos;
2484 case WMI_VDEV_TYPE_IBSS:
2486 arg->peer_flags |= arvif->ar->wmi.peer_flags->qos;
2492 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac peer %pM qos %d\n",
2493 sta->addr, !!(arg->peer_flags &
2494 arvif->ar->wmi.peer_flags->qos));
2497 static bool ath10k_mac_sta_has_ofdm_only(struct ieee80211_sta *sta)
2499 return sta->supp_rates[NL80211_BAND_2GHZ] >>
2500 ATH10K_MAC_FIRST_OFDM_RATE_IDX;
2503 static void ath10k_peer_assoc_h_phymode(struct ath10k *ar,
2504 struct ieee80211_vif *vif,
2505 struct ieee80211_sta *sta,
2506 struct wmi_peer_assoc_complete_arg *arg)
2508 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2509 struct cfg80211_chan_def def;
2510 enum nl80211_band band;
2511 const u8 *ht_mcs_mask;
2512 const u16 *vht_mcs_mask;
2513 enum wmi_phy_mode phymode = MODE_UNKNOWN;
2515 if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2518 band = def.chan->band;
2519 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
2520 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2523 case NL80211_BAND_2GHZ:
2524 if (sta->vht_cap.vht_supported &&
2525 !ath10k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
2526 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
2527 phymode = MODE_11AC_VHT40;
2529 phymode = MODE_11AC_VHT20;
2530 } else if (sta->ht_cap.ht_supported &&
2531 !ath10k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
2532 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
2533 phymode = MODE_11NG_HT40;
2535 phymode = MODE_11NG_HT20;
2536 } else if (ath10k_mac_sta_has_ofdm_only(sta)) {
2543 case NL80211_BAND_5GHZ:
2547 if (sta->vht_cap.vht_supported &&
2548 !ath10k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
2549 if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
2550 phymode = MODE_11AC_VHT80;
2551 else if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
2552 phymode = MODE_11AC_VHT40;
2553 else if (sta->bandwidth == IEEE80211_STA_RX_BW_20)
2554 phymode = MODE_11AC_VHT20;
2555 } else if (sta->ht_cap.ht_supported &&
2556 !ath10k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
2557 if (sta->bandwidth >= IEEE80211_STA_RX_BW_40)
2558 phymode = MODE_11NA_HT40;
2560 phymode = MODE_11NA_HT20;
2570 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac peer %pM phymode %s\n",
2571 sta->addr, ath10k_wmi_phymode_str(phymode));
2573 arg->peer_phymode = phymode;
2574 WARN_ON(phymode == MODE_UNKNOWN);
2577 static int ath10k_peer_assoc_prepare(struct ath10k *ar,
2578 struct ieee80211_vif *vif,
2579 struct ieee80211_sta *sta,
2580 struct wmi_peer_assoc_complete_arg *arg)
2582 lockdep_assert_held(&ar->conf_mutex);
2584 memset(arg, 0, sizeof(*arg));
2586 ath10k_peer_assoc_h_basic(ar, vif, sta, arg);
2587 ath10k_peer_assoc_h_crypto(ar, vif, sta, arg);
2588 ath10k_peer_assoc_h_rates(ar, vif, sta, arg);
2589 ath10k_peer_assoc_h_ht(ar, vif, sta, arg);
2590 ath10k_peer_assoc_h_vht(ar, vif, sta, arg);
2591 ath10k_peer_assoc_h_qos(ar, vif, sta, arg);
2592 ath10k_peer_assoc_h_phymode(ar, vif, sta, arg);
2597 static const u32 ath10k_smps_map[] = {
2598 [WLAN_HT_CAP_SM_PS_STATIC] = WMI_PEER_SMPS_STATIC,
2599 [WLAN_HT_CAP_SM_PS_DYNAMIC] = WMI_PEER_SMPS_DYNAMIC,
2600 [WLAN_HT_CAP_SM_PS_INVALID] = WMI_PEER_SMPS_PS_NONE,
2601 [WLAN_HT_CAP_SM_PS_DISABLED] = WMI_PEER_SMPS_PS_NONE,
2604 static int ath10k_setup_peer_smps(struct ath10k *ar, struct ath10k_vif *arvif,
2606 const struct ieee80211_sta_ht_cap *ht_cap)
2610 if (!ht_cap->ht_supported)
2613 smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
2614 smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
2616 if (smps >= ARRAY_SIZE(ath10k_smps_map))
2619 return ath10k_wmi_peer_set_param(ar, arvif->vdev_id, addr,
2620 WMI_PEER_SMPS_STATE,
2621 ath10k_smps_map[smps]);
2624 static int ath10k_mac_vif_recalc_txbf(struct ath10k *ar,
2625 struct ieee80211_vif *vif,
2626 struct ieee80211_sta_vht_cap vht_cap)
2628 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2633 if (ath10k_wmi_get_txbf_conf_scheme(ar) != WMI_TXBF_CONF_AFTER_ASSOC)
2636 if (!(ar->vht_cap_info &
2637 (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
2638 IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE |
2639 IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
2640 IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)))
2643 param = ar->wmi.vdev_param->txbf;
2646 if (WARN_ON(param == WMI_VDEV_PARAM_UNSUPPORTED))
2649 /* The following logic is correct. If a remote STA advertises support
2650 * for being a beamformer then we should enable us being a beamformee.
2653 if (ar->vht_cap_info &
2654 (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
2655 IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)) {
2656 if (vht_cap.cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)
2657 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
2659 if (vht_cap.cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)
2660 value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFEE;
2663 if (ar->vht_cap_info &
2664 (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
2665 IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)) {
2666 if (vht_cap.cap & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)
2667 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
2669 if (vht_cap.cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)
2670 value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFER;
2673 if (value & WMI_VDEV_PARAM_TXBF_MU_TX_BFEE)
2674 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
2676 if (value & WMI_VDEV_PARAM_TXBF_MU_TX_BFER)
2677 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
2679 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param, value);
2681 ath10k_warn(ar, "failed to submit vdev param txbf 0x%x: %d\n",
2689 /* can be called only in mac80211 callbacks due to `key_count` usage */
2690 static void ath10k_bss_assoc(struct ieee80211_hw *hw,
2691 struct ieee80211_vif *vif,
2692 struct ieee80211_bss_conf *bss_conf)
2694 struct ath10k *ar = hw->priv;
2695 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2696 struct ieee80211_sta_ht_cap ht_cap;
2697 struct ieee80211_sta_vht_cap vht_cap;
2698 struct wmi_peer_assoc_complete_arg peer_arg;
2699 struct ieee80211_sta *ap_sta;
2702 lockdep_assert_held(&ar->conf_mutex);
2704 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i assoc bssid %pM aid %d\n",
2705 arvif->vdev_id, arvif->bssid, arvif->aid);
2709 ap_sta = ieee80211_find_sta(vif, bss_conf->bssid);
2711 ath10k_warn(ar, "failed to find station entry for bss %pM vdev %i\n",
2712 bss_conf->bssid, arvif->vdev_id);
2717 /* ap_sta must be accessed only within rcu section which must be left
2718 * before calling ath10k_setup_peer_smps() which might sleep. */
2719 ht_cap = ap_sta->ht_cap;
2720 vht_cap = ap_sta->vht_cap;
2722 ret = ath10k_peer_assoc_prepare(ar, vif, ap_sta, &peer_arg);
2724 ath10k_warn(ar, "failed to prepare peer assoc for %pM vdev %i: %d\n",
2725 bss_conf->bssid, arvif->vdev_id, ret);
2732 ret = ath10k_wmi_peer_assoc(ar, &peer_arg);
2734 ath10k_warn(ar, "failed to run peer assoc for %pM vdev %i: %d\n",
2735 bss_conf->bssid, arvif->vdev_id, ret);
2739 ret = ath10k_setup_peer_smps(ar, arvif, bss_conf->bssid, &ht_cap);
2741 ath10k_warn(ar, "failed to setup peer SMPS for vdev %i: %d\n",
2742 arvif->vdev_id, ret);
2746 ret = ath10k_mac_vif_recalc_txbf(ar, vif, vht_cap);
2748 ath10k_warn(ar, "failed to recalc txbf for vdev %i on bss %pM: %d\n",
2749 arvif->vdev_id, bss_conf->bssid, ret);
2753 ath10k_dbg(ar, ATH10K_DBG_MAC,
2754 "mac vdev %d up (associated) bssid %pM aid %d\n",
2755 arvif->vdev_id, bss_conf->bssid, bss_conf->aid);
2757 WARN_ON(arvif->is_up);
2759 arvif->aid = bss_conf->aid;
2760 ether_addr_copy(arvif->bssid, bss_conf->bssid);
2762 ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid);
2764 ath10k_warn(ar, "failed to set vdev %d up: %d\n",
2765 arvif->vdev_id, ret);
2769 arvif->is_up = true;
2771 /* Workaround: Some firmware revisions (tested with qca6174
2772 * WLAN.RM.2.0-00073) have buggy powersave state machine and must be
2773 * poked with peer param command.
2775 ret = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, arvif->bssid,
2776 WMI_PEER_DUMMY_VAR, 1);
2778 ath10k_warn(ar, "failed to poke peer %pM param for ps workaround on vdev %i: %d\n",
2779 arvif->bssid, arvif->vdev_id, ret);
2784 static void ath10k_bss_disassoc(struct ieee80211_hw *hw,
2785 struct ieee80211_vif *vif)
2787 struct ath10k *ar = hw->priv;
2788 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2789 struct ieee80211_sta_vht_cap vht_cap = {};
2792 lockdep_assert_held(&ar->conf_mutex);
2794 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i disassoc bssid %pM\n",
2795 arvif->vdev_id, arvif->bssid);
2797 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
2799 ath10k_warn(ar, "failed to down vdev %i: %d\n",
2800 arvif->vdev_id, ret);
2802 arvif->def_wep_key_idx = -1;
2804 ret = ath10k_mac_vif_recalc_txbf(ar, vif, vht_cap);
2806 ath10k_warn(ar, "failed to recalc txbf for vdev %i: %d\n",
2807 arvif->vdev_id, ret);
2811 arvif->is_up = false;
2813 cancel_delayed_work_sync(&arvif->connection_loss_work);
2816 static int ath10k_station_assoc(struct ath10k *ar,
2817 struct ieee80211_vif *vif,
2818 struct ieee80211_sta *sta,
2821 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2822 struct wmi_peer_assoc_complete_arg peer_arg;
2825 lockdep_assert_held(&ar->conf_mutex);
2827 ret = ath10k_peer_assoc_prepare(ar, vif, sta, &peer_arg);
2829 ath10k_warn(ar, "failed to prepare WMI peer assoc for %pM vdev %i: %i\n",
2830 sta->addr, arvif->vdev_id, ret);
2834 ret = ath10k_wmi_peer_assoc(ar, &peer_arg);
2836 ath10k_warn(ar, "failed to run peer assoc for STA %pM vdev %i: %d\n",
2837 sta->addr, arvif->vdev_id, ret);
2841 /* Re-assoc is run only to update supported rates for given station. It
2842 * doesn't make much sense to reconfigure the peer completely.
2845 ret = ath10k_setup_peer_smps(ar, arvif, sta->addr,
2848 ath10k_warn(ar, "failed to setup peer SMPS for vdev %d: %d\n",
2849 arvif->vdev_id, ret);
2853 ret = ath10k_peer_assoc_qos_ap(ar, arvif, sta);
2855 ath10k_warn(ar, "failed to set qos params for STA %pM for vdev %i: %d\n",
2856 sta->addr, arvif->vdev_id, ret);
2861 arvif->num_legacy_stations++;
2862 ret = ath10k_recalc_rtscts_prot(arvif);
2864 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
2865 arvif->vdev_id, ret);
2870 /* Plumb cached keys only for static WEP */
2871 if (arvif->def_wep_key_idx != -1) {
2872 ret = ath10k_install_peer_wep_keys(arvif, sta->addr);
2874 ath10k_warn(ar, "failed to install peer wep keys for vdev %i: %d\n",
2875 arvif->vdev_id, ret);
2884 static int ath10k_station_disassoc(struct ath10k *ar,
2885 struct ieee80211_vif *vif,
2886 struct ieee80211_sta *sta)
2888 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2891 lockdep_assert_held(&ar->conf_mutex);
2894 arvif->num_legacy_stations--;
2895 ret = ath10k_recalc_rtscts_prot(arvif);
2897 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
2898 arvif->vdev_id, ret);
2903 ret = ath10k_clear_peer_keys(arvif, sta->addr);
2905 ath10k_warn(ar, "failed to clear all peer wep keys for vdev %i: %d\n",
2906 arvif->vdev_id, ret);
2917 static int ath10k_update_channel_list(struct ath10k *ar)
2919 struct ieee80211_hw *hw = ar->hw;
2920 struct ieee80211_supported_band **bands;
2921 enum nl80211_band band;
2922 struct ieee80211_channel *channel;
2923 struct wmi_scan_chan_list_arg arg = {0};
2924 struct wmi_channel_arg *ch;
2930 lockdep_assert_held(&ar->conf_mutex);
2932 bands = hw->wiphy->bands;
2933 for (band = 0; band < NUM_NL80211_BANDS; band++) {
2937 for (i = 0; i < bands[band]->n_channels; i++) {
2938 if (bands[band]->channels[i].flags &
2939 IEEE80211_CHAN_DISABLED)
2946 len = sizeof(struct wmi_channel_arg) * arg.n_channels;
2947 arg.channels = kzalloc(len, GFP_KERNEL);
2952 for (band = 0; band < NUM_NL80211_BANDS; band++) {
2956 for (i = 0; i < bands[band]->n_channels; i++) {
2957 channel = &bands[band]->channels[i];
2959 if (channel->flags & IEEE80211_CHAN_DISABLED)
2962 ch->allow_ht = true;
2964 /* FIXME: when should we really allow VHT? */
2965 ch->allow_vht = true;
2968 !(channel->flags & IEEE80211_CHAN_NO_IR);
2971 !(channel->flags & IEEE80211_CHAN_NO_HT40PLUS);
2974 !!(channel->flags & IEEE80211_CHAN_RADAR);
2976 passive = channel->flags & IEEE80211_CHAN_NO_IR;
2977 ch->passive = passive;
2979 ch->freq = channel->center_freq;
2980 ch->band_center_freq1 = channel->center_freq;
2982 ch->max_power = channel->max_power * 2;
2983 ch->max_reg_power = channel->max_reg_power * 2;
2984 ch->max_antenna_gain = channel->max_antenna_gain * 2;
2985 ch->reg_class_id = 0; /* FIXME */
2987 /* FIXME: why use only legacy modes, why not any
2988 * HT/VHT modes? Would that even make any
2990 if (channel->band == NL80211_BAND_2GHZ)
2991 ch->mode = MODE_11G;
2993 ch->mode = MODE_11A;
2995 if (WARN_ON_ONCE(ch->mode == MODE_UNKNOWN))
2998 ath10k_dbg(ar, ATH10K_DBG_WMI,
2999 "mac channel [%zd/%d] freq %d maxpower %d regpower %d antenna %d mode %d\n",
3000 ch - arg.channels, arg.n_channels,
3001 ch->freq, ch->max_power, ch->max_reg_power,
3002 ch->max_antenna_gain, ch->mode);
3008 ret = ath10k_wmi_scan_chan_list(ar, &arg);
3009 kfree(arg.channels);
3014 static enum wmi_dfs_region
3015 ath10k_mac_get_dfs_region(enum nl80211_dfs_regions dfs_region)
3017 switch (dfs_region) {
3018 case NL80211_DFS_UNSET:
3019 return WMI_UNINIT_DFS_DOMAIN;
3020 case NL80211_DFS_FCC:
3021 return WMI_FCC_DFS_DOMAIN;
3022 case NL80211_DFS_ETSI:
3023 return WMI_ETSI_DFS_DOMAIN;
3024 case NL80211_DFS_JP:
3025 return WMI_MKK4_DFS_DOMAIN;
3027 return WMI_UNINIT_DFS_DOMAIN;
3030 static void ath10k_regd_update(struct ath10k *ar)
3032 struct reg_dmn_pair_mapping *regpair;
3034 enum wmi_dfs_region wmi_dfs_reg;
3035 enum nl80211_dfs_regions nl_dfs_reg;
3037 lockdep_assert_held(&ar->conf_mutex);
3039 ret = ath10k_update_channel_list(ar);
3041 ath10k_warn(ar, "failed to update channel list: %d\n", ret);
3043 regpair = ar->ath_common.regulatory.regpair;
3045 if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) {
3046 nl_dfs_reg = ar->dfs_detector->region;
3047 wmi_dfs_reg = ath10k_mac_get_dfs_region(nl_dfs_reg);
3049 wmi_dfs_reg = WMI_UNINIT_DFS_DOMAIN;
3052 /* Target allows setting up per-band regdomain but ath_common provides
3053 * a combined one only */
3054 ret = ath10k_wmi_pdev_set_regdomain(ar,
3055 regpair->reg_domain,
3056 regpair->reg_domain, /* 2ghz */
3057 regpair->reg_domain, /* 5ghz */
3058 regpair->reg_2ghz_ctl,
3059 regpair->reg_5ghz_ctl,
3062 ath10k_warn(ar, "failed to set pdev regdomain: %d\n", ret);
3065 static void ath10k_reg_notifier(struct wiphy *wiphy,
3066 struct regulatory_request *request)
3068 struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
3069 struct ath10k *ar = hw->priv;
3072 ath_reg_notifier_apply(wiphy, request, &ar->ath_common.regulatory);
3074 if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) {
3075 ath10k_dbg(ar, ATH10K_DBG_REGULATORY, "dfs region 0x%x\n",
3076 request->dfs_region);
3077 result = ar->dfs_detector->set_dfs_domain(ar->dfs_detector,
3078 request->dfs_region);
3080 ath10k_warn(ar, "DFS region 0x%X not supported, will trigger radar for every pulse\n",
3081 request->dfs_region);
3084 mutex_lock(&ar->conf_mutex);
3085 if (ar->state == ATH10K_STATE_ON)
3086 ath10k_regd_update(ar);
3087 mutex_unlock(&ar->conf_mutex);
3094 enum ath10k_mac_tx_path {
3096 ATH10K_MAC_TX_HTT_MGMT,
3097 ATH10K_MAC_TX_WMI_MGMT,
3098 ATH10K_MAC_TX_UNKNOWN,
3101 void ath10k_mac_tx_lock(struct ath10k *ar, int reason)
3103 lockdep_assert_held(&ar->htt.tx_lock);
3105 WARN_ON(reason >= ATH10K_TX_PAUSE_MAX);
3106 ar->tx_paused |= BIT(reason);
3107 ieee80211_stop_queues(ar->hw);
3110 static void ath10k_mac_tx_unlock_iter(void *data, u8 *mac,
3111 struct ieee80211_vif *vif)
3113 struct ath10k *ar = data;
3114 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3116 if (arvif->tx_paused)
3119 ieee80211_wake_queue(ar->hw, arvif->vdev_id);
3122 void ath10k_mac_tx_unlock(struct ath10k *ar, int reason)
3124 lockdep_assert_held(&ar->htt.tx_lock);
3126 WARN_ON(reason >= ATH10K_TX_PAUSE_MAX);
3127 ar->tx_paused &= ~BIT(reason);
3132 ieee80211_iterate_active_interfaces_atomic(ar->hw,
3133 IEEE80211_IFACE_ITER_RESUME_ALL,
3134 ath10k_mac_tx_unlock_iter,
3137 ieee80211_wake_queue(ar->hw, ar->hw->offchannel_tx_hw_queue);
3140 void ath10k_mac_vif_tx_lock(struct ath10k_vif *arvif, int reason)
3142 struct ath10k *ar = arvif->ar;
3144 lockdep_assert_held(&ar->htt.tx_lock);
3146 WARN_ON(reason >= BITS_PER_LONG);
3147 arvif->tx_paused |= BIT(reason);
3148 ieee80211_stop_queue(ar->hw, arvif->vdev_id);
3151 void ath10k_mac_vif_tx_unlock(struct ath10k_vif *arvif, int reason)
3153 struct ath10k *ar = arvif->ar;
3155 lockdep_assert_held(&ar->htt.tx_lock);
3157 WARN_ON(reason >= BITS_PER_LONG);
3158 arvif->tx_paused &= ~BIT(reason);
3163 if (arvif->tx_paused)
3166 ieee80211_wake_queue(ar->hw, arvif->vdev_id);
3169 static void ath10k_mac_vif_handle_tx_pause(struct ath10k_vif *arvif,
3170 enum wmi_tlv_tx_pause_id pause_id,
3171 enum wmi_tlv_tx_pause_action action)
3173 struct ath10k *ar = arvif->ar;
3175 lockdep_assert_held(&ar->htt.tx_lock);
3178 case WMI_TLV_TX_PAUSE_ACTION_STOP:
3179 ath10k_mac_vif_tx_lock(arvif, pause_id);
3181 case WMI_TLV_TX_PAUSE_ACTION_WAKE:
3182 ath10k_mac_vif_tx_unlock(arvif, pause_id);
3185 ath10k_dbg(ar, ATH10K_DBG_BOOT,
3186 "received unknown tx pause action %d on vdev %i, ignoring\n",
3187 action, arvif->vdev_id);
3192 struct ath10k_mac_tx_pause {
3194 enum wmi_tlv_tx_pause_id pause_id;
3195 enum wmi_tlv_tx_pause_action action;
3198 static void ath10k_mac_handle_tx_pause_iter(void *data, u8 *mac,
3199 struct ieee80211_vif *vif)
3201 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3202 struct ath10k_mac_tx_pause *arg = data;
3204 if (arvif->vdev_id != arg->vdev_id)
3207 ath10k_mac_vif_handle_tx_pause(arvif, arg->pause_id, arg->action);
3210 void ath10k_mac_handle_tx_pause_vdev(struct ath10k *ar, u32 vdev_id,
3211 enum wmi_tlv_tx_pause_id pause_id,
3212 enum wmi_tlv_tx_pause_action action)
3214 struct ath10k_mac_tx_pause arg = {
3216 .pause_id = pause_id,
3220 spin_lock_bh(&ar->htt.tx_lock);
3221 ieee80211_iterate_active_interfaces_atomic(ar->hw,
3222 IEEE80211_IFACE_ITER_RESUME_ALL,
3223 ath10k_mac_handle_tx_pause_iter,
3225 spin_unlock_bh(&ar->htt.tx_lock);
3228 static enum ath10k_hw_txrx_mode
3229 ath10k_mac_tx_h_get_txmode(struct ath10k *ar,
3230 struct ieee80211_vif *vif,
3231 struct ieee80211_sta *sta,
3232 struct sk_buff *skb)
3234 const struct ieee80211_hdr *hdr = (void *)skb->data;
3235 __le16 fc = hdr->frame_control;
3237 if (!vif || vif->type == NL80211_IFTYPE_MONITOR)
3238 return ATH10K_HW_TXRX_RAW;
3240 if (ieee80211_is_mgmt(fc))
3241 return ATH10K_HW_TXRX_MGMT;
3245 * NullFunc frames are mostly used to ping if a client or AP are still
3246 * reachable and responsive. This implies tx status reports must be
3247 * accurate - otherwise either mac80211 or userspace (e.g. hostapd) can
3248 * come to a conclusion that the other end disappeared and tear down
3249 * BSS connection or it can never disconnect from BSS/client (which is
3252 * Firmware with HTT older than 3.0 delivers incorrect tx status for
3253 * NullFunc frames to driver. However there's a HTT Mgmt Tx command
3254 * which seems to deliver correct tx reports for NullFunc frames. The
3255 * downside of using it is it ignores client powersave state so it can
3256 * end up disconnecting sleeping clients in AP mode. It should fix STA
3257 * mode though because AP don't sleep.
3259 if (ar->htt.target_version_major < 3 &&
3260 (ieee80211_is_nullfunc(fc) || ieee80211_is_qos_nullfunc(fc)) &&
3261 !test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX,
3262 ar->running_fw->fw_file.fw_features))
3263 return ATH10K_HW_TXRX_MGMT;
3267 * Some wmi-tlv firmwares for qca6174 have broken Tx key selection for
3268 * NativeWifi txmode - it selects AP key instead of peer key. It seems
3269 * to work with Ethernet txmode so use it.
3271 * FIXME: Check if raw mode works with TDLS.
3273 if (ieee80211_is_data_present(fc) && sta && sta->tdls)
3274 return ATH10K_HW_TXRX_ETHERNET;
3276 if (test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags))
3277 return ATH10K_HW_TXRX_RAW;
3279 return ATH10K_HW_TXRX_NATIVE_WIFI;
3282 static bool ath10k_tx_h_use_hwcrypto(struct ieee80211_vif *vif,
3283 struct sk_buff *skb)
3285 const struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
3286 const struct ieee80211_hdr *hdr = (void *)skb->data;
3287 const u32 mask = IEEE80211_TX_INTFL_DONT_ENCRYPT |
3288 IEEE80211_TX_CTL_INJECTED;
3290 if (!ieee80211_has_protected(hdr->frame_control))
3293 if ((info->flags & mask) == mask)
3297 return !ath10k_vif_to_arvif(vif)->nohwcrypt;
3302 /* HTT Tx uses Native Wifi tx mode which expects 802.11 frames without QoS
3303 * Control in the header.
3305 static void ath10k_tx_h_nwifi(struct ieee80211_hw *hw, struct sk_buff *skb)
3307 struct ieee80211_hdr *hdr = (void *)skb->data;
3308 struct ath10k_skb_cb *cb = ATH10K_SKB_CB(skb);
3311 if (!ieee80211_is_data_qos(hdr->frame_control))
3314 qos_ctl = ieee80211_get_qos_ctl(hdr);
3315 memmove(skb->data + IEEE80211_QOS_CTL_LEN,
3316 skb->data, (void *)qos_ctl - (void *)skb->data);
3317 skb_pull(skb, IEEE80211_QOS_CTL_LEN);
3319 /* Some firmware revisions don't handle sending QoS NullFunc well.
3320 * These frames are mainly used for CQM purposes so it doesn't really
3321 * matter whether QoS NullFunc or NullFunc are sent.
3323 hdr = (void *)skb->data;
3324 if (ieee80211_is_qos_nullfunc(hdr->frame_control))
3325 cb->flags &= ~ATH10K_SKB_F_QOS;
3327 hdr->frame_control &= ~__cpu_to_le16(IEEE80211_STYPE_QOS_DATA);
3330 static void ath10k_tx_h_8023(struct sk_buff *skb)
3332 struct ieee80211_hdr *hdr;
3333 struct rfc1042_hdr *rfc1042;
3340 hdr = (void *)skb->data;
3341 hdrlen = ieee80211_hdrlen(hdr->frame_control);
3342 rfc1042 = (void *)skb->data + hdrlen;
3344 ether_addr_copy(da, ieee80211_get_DA(hdr));
3345 ether_addr_copy(sa, ieee80211_get_SA(hdr));
3346 type = rfc1042->snap_type;
3348 skb_pull(skb, hdrlen + sizeof(*rfc1042));
3349 skb_push(skb, sizeof(*eth));
3351 eth = (void *)skb->data;
3352 ether_addr_copy(eth->h_dest, da);
3353 ether_addr_copy(eth->h_source, sa);
3354 eth->h_proto = type;
3357 static void ath10k_tx_h_add_p2p_noa_ie(struct ath10k *ar,
3358 struct ieee80211_vif *vif,
3359 struct sk_buff *skb)
3361 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
3362 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3364 /* This is case only for P2P_GO */
3365 if (vif->type != NL80211_IFTYPE_AP || !vif->p2p)
3368 if (unlikely(ieee80211_is_probe_resp(hdr->frame_control))) {
3369 spin_lock_bh(&ar->data_lock);
3370 if (arvif->u.ap.noa_data)
3371 if (!pskb_expand_head(skb, 0, arvif->u.ap.noa_len,
3373 memcpy(skb_put(skb, arvif->u.ap.noa_len),
3374 arvif->u.ap.noa_data,
3375 arvif->u.ap.noa_len);
3376 spin_unlock_bh(&ar->data_lock);
3380 static void ath10k_mac_tx_h_fill_cb(struct ath10k *ar,
3381 struct ieee80211_vif *vif,
3382 struct ieee80211_txq *txq,
3383 struct sk_buff *skb)
3385 struct ieee80211_hdr *hdr = (void *)skb->data;
3386 struct ath10k_skb_cb *cb = ATH10K_SKB_CB(skb);
3389 if (!ath10k_tx_h_use_hwcrypto(vif, skb))
3390 cb->flags |= ATH10K_SKB_F_NO_HWCRYPT;
3392 if (ieee80211_is_mgmt(hdr->frame_control))
3393 cb->flags |= ATH10K_SKB_F_MGMT;
3395 if (ieee80211_is_data_qos(hdr->frame_control))
3396 cb->flags |= ATH10K_SKB_F_QOS;
3402 bool ath10k_mac_tx_frm_has_freq(struct ath10k *ar)
3404 /* FIXME: Not really sure since when the behaviour changed. At some
3405 * point new firmware stopped requiring creation of peer entries for
3406 * offchannel tx (and actually creating them causes issues with wmi-htc
3407 * tx credit replenishment and reliability). Assuming it's at least 3.4
3408 * because that's when the `freq` was introduced to TX_FRM HTT command.
3410 return (ar->htt.target_version_major >= 3 &&
3411 ar->htt.target_version_minor >= 4 &&
3412 ar->running_fw->fw_file.htt_op_version == ATH10K_FW_HTT_OP_VERSION_TLV);
3415 static int ath10k_mac_tx_wmi_mgmt(struct ath10k *ar, struct sk_buff *skb)
3417 struct sk_buff_head *q = &ar->wmi_mgmt_tx_queue;
3420 spin_lock_bh(&ar->data_lock);
3422 if (skb_queue_len(q) == ATH10K_MAX_NUM_MGMT_PENDING) {
3423 ath10k_warn(ar, "wmi mgmt tx queue is full\n");
3428 __skb_queue_tail(q, skb);
3429 ieee80211_queue_work(ar->hw, &ar->wmi_mgmt_tx_work);
3432 spin_unlock_bh(&ar->data_lock);
3437 static enum ath10k_mac_tx_path
3438 ath10k_mac_tx_h_get_txpath(struct ath10k *ar,
3439 struct sk_buff *skb,
3440 enum ath10k_hw_txrx_mode txmode)
3443 case ATH10K_HW_TXRX_RAW:
3444 case ATH10K_HW_TXRX_NATIVE_WIFI:
3445 case ATH10K_HW_TXRX_ETHERNET:
3446 return ATH10K_MAC_TX_HTT;
3447 case ATH10K_HW_TXRX_MGMT:
3448 if (test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX,
3449 ar->running_fw->fw_file.fw_features))
3450 return ATH10K_MAC_TX_WMI_MGMT;
3451 else if (ar->htt.target_version_major >= 3)
3452 return ATH10K_MAC_TX_HTT;
3454 return ATH10K_MAC_TX_HTT_MGMT;
3457 return ATH10K_MAC_TX_UNKNOWN;
3460 static int ath10k_mac_tx_submit(struct ath10k *ar,
3461 enum ath10k_hw_txrx_mode txmode,
3462 enum ath10k_mac_tx_path txpath,
3463 struct sk_buff *skb)
3465 struct ath10k_htt *htt = &ar->htt;
3469 case ATH10K_MAC_TX_HTT:
3470 ret = ath10k_htt_tx(htt, txmode, skb);
3472 case ATH10K_MAC_TX_HTT_MGMT:
3473 ret = ath10k_htt_mgmt_tx(htt, skb);
3475 case ATH10K_MAC_TX_WMI_MGMT:
3476 ret = ath10k_mac_tx_wmi_mgmt(ar, skb);
3478 case ATH10K_MAC_TX_UNKNOWN:
3485 ath10k_warn(ar, "failed to transmit packet, dropping: %d\n",
3487 ieee80211_free_txskb(ar->hw, skb);
3493 /* This function consumes the sk_buff regardless of return value as far as
3494 * caller is concerned so no freeing is necessary afterwards.
3496 static int ath10k_mac_tx(struct ath10k *ar,
3497 struct ieee80211_vif *vif,
3498 struct ieee80211_sta *sta,
3499 enum ath10k_hw_txrx_mode txmode,
3500 enum ath10k_mac_tx_path txpath,
3501 struct sk_buff *skb)
3503 struct ieee80211_hw *hw = ar->hw;
3504 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
3507 /* We should disable CCK RATE due to P2P */
3508 if (info->flags & IEEE80211_TX_CTL_NO_CCK_RATE)
3509 ath10k_dbg(ar, ATH10K_DBG_MAC, "IEEE80211_TX_CTL_NO_CCK_RATE\n");
3512 case ATH10K_HW_TXRX_MGMT:
3513 case ATH10K_HW_TXRX_NATIVE_WIFI:
3514 ath10k_tx_h_nwifi(hw, skb);
3515 ath10k_tx_h_add_p2p_noa_ie(ar, vif, skb);
3516 ath10k_tx_h_seq_no(vif, skb);
3518 case ATH10K_HW_TXRX_ETHERNET:
3519 ath10k_tx_h_8023(skb);
3521 case ATH10K_HW_TXRX_RAW:
3522 if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) {
3524 ieee80211_free_txskb(hw, skb);
3529 if (info->flags & IEEE80211_TX_CTL_TX_OFFCHAN) {
3530 if (!ath10k_mac_tx_frm_has_freq(ar)) {
3531 ath10k_dbg(ar, ATH10K_DBG_MAC, "queued offchannel skb %pK\n",
3534 skb_queue_tail(&ar->offchan_tx_queue, skb);
3535 ieee80211_queue_work(hw, &ar->offchan_tx_work);
3540 ret = ath10k_mac_tx_submit(ar, txmode, txpath, skb);
3542 ath10k_warn(ar, "failed to submit frame: %d\n", ret);
3549 void ath10k_offchan_tx_purge(struct ath10k *ar)
3551 struct sk_buff *skb;
3554 skb = skb_dequeue(&ar->offchan_tx_queue);
3558 ieee80211_free_txskb(ar->hw, skb);
3562 void ath10k_offchan_tx_work(struct work_struct *work)
3564 struct ath10k *ar = container_of(work, struct ath10k, offchan_tx_work);
3565 struct ath10k_peer *peer;
3566 struct ath10k_vif *arvif;
3567 enum ath10k_hw_txrx_mode txmode;
3568 enum ath10k_mac_tx_path txpath;
3569 struct ieee80211_hdr *hdr;
3570 struct ieee80211_vif *vif;
3571 struct ieee80211_sta *sta;
3572 struct sk_buff *skb;
3573 const u8 *peer_addr;
3576 unsigned long time_left;
3577 bool tmp_peer_created = false;
3579 /* FW requirement: We must create a peer before FW will send out
3580 * an offchannel frame. Otherwise the frame will be stuck and
3581 * never transmitted. We delete the peer upon tx completion.
3582 * It is unlikely that a peer for offchannel tx will already be
3583 * present. However it may be in some rare cases so account for that.
3584 * Otherwise we might remove a legitimate peer and break stuff. */
3587 skb = skb_dequeue(&ar->offchan_tx_queue);
3591 mutex_lock(&ar->conf_mutex);
3593 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac offchannel skb %pK\n",
3596 hdr = (struct ieee80211_hdr *)skb->data;
3597 peer_addr = ieee80211_get_DA(hdr);
3599 spin_lock_bh(&ar->data_lock);
3600 vdev_id = ar->scan.vdev_id;
3601 peer = ath10k_peer_find(ar, vdev_id, peer_addr);
3602 spin_unlock_bh(&ar->data_lock);
3605 /* FIXME: should this use ath10k_warn()? */
3606 ath10k_dbg(ar, ATH10K_DBG_MAC, "peer %pM on vdev %d already present\n",
3607 peer_addr, vdev_id);
3610 ret = ath10k_peer_create(ar, NULL, NULL, vdev_id,
3612 WMI_PEER_TYPE_DEFAULT);
3614 ath10k_warn(ar, "failed to create peer %pM on vdev %d: %d\n",
3615 peer_addr, vdev_id, ret);
3616 tmp_peer_created = (ret == 0);
3619 spin_lock_bh(&ar->data_lock);
3620 reinit_completion(&ar->offchan_tx_completed);
3621 ar->offchan_tx_skb = skb;
3622 spin_unlock_bh(&ar->data_lock);
3624 /* It's safe to access vif and sta - conf_mutex guarantees that
3625 * sta_state() and remove_interface() are locked exclusively
3626 * out wrt to this offchannel worker.
3628 arvif = ath10k_get_arvif(ar, vdev_id);
3631 sta = ieee80211_find_sta(vif, peer_addr);
3637 txmode = ath10k_mac_tx_h_get_txmode(ar, vif, sta, skb);
3638 txpath = ath10k_mac_tx_h_get_txpath(ar, skb, txmode);
3640 ret = ath10k_mac_tx(ar, vif, sta, txmode, txpath, skb);
3642 ath10k_warn(ar, "failed to transmit offchannel frame: %d\n",
3648 wait_for_completion_timeout(&ar->offchan_tx_completed, 3 * HZ);
3650 ath10k_warn(ar, "timed out waiting for offchannel skb %pK\n",
3653 if (!peer && tmp_peer_created) {
3654 ret = ath10k_peer_delete(ar, vdev_id, peer_addr);
3656 ath10k_warn(ar, "failed to delete peer %pM on vdev %d: %d\n",
3657 peer_addr, vdev_id, ret);
3660 mutex_unlock(&ar->conf_mutex);
3664 void ath10k_mgmt_over_wmi_tx_purge(struct ath10k *ar)
3666 struct sk_buff *skb;
3669 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
3673 ieee80211_free_txskb(ar->hw, skb);
3677 void ath10k_mgmt_over_wmi_tx_work(struct work_struct *work)
3679 struct ath10k *ar = container_of(work, struct ath10k, wmi_mgmt_tx_work);
3680 struct sk_buff *skb;
3684 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
3688 ret = ath10k_wmi_mgmt_tx(ar, skb);
3690 ath10k_warn(ar, "failed to transmit management frame via WMI: %d\n",
3692 ieee80211_free_txskb(ar->hw, skb);
3697 static void ath10k_mac_txq_init(struct ieee80211_txq *txq)
3699 struct ath10k_txq *artxq;
3704 artxq = (void *)txq->drv_priv;
3705 INIT_LIST_HEAD(&artxq->list);
3708 static void ath10k_mac_txq_unref(struct ath10k *ar, struct ieee80211_txq *txq)
3710 struct ath10k_txq *artxq;
3711 struct ath10k_skb_cb *cb;
3712 struct sk_buff *msdu;
3718 artxq = (void *)txq->drv_priv;
3719 spin_lock_bh(&ar->txqs_lock);
3720 if (!list_empty(&artxq->list))
3721 list_del_init(&artxq->list);
3722 spin_unlock_bh(&ar->txqs_lock);
3724 spin_lock_bh(&ar->htt.tx_lock);
3725 idr_for_each_entry(&ar->htt.pending_tx, msdu, msdu_id) {
3726 cb = ATH10K_SKB_CB(msdu);
3730 spin_unlock_bh(&ar->htt.tx_lock);
3733 struct ieee80211_txq *ath10k_mac_txq_lookup(struct ath10k *ar,
3737 struct ath10k_peer *peer;
3739 lockdep_assert_held(&ar->data_lock);
3741 peer = ar->peer_map[peer_id];
3746 return peer->sta->txq[tid];
3748 return peer->vif->txq;
3753 static bool ath10k_mac_tx_can_push(struct ieee80211_hw *hw,
3754 struct ieee80211_txq *txq)
3756 struct ath10k *ar = hw->priv;
3757 struct ath10k_txq *artxq = (void *)txq->drv_priv;
3759 /* No need to get locks */
3761 if (ar->htt.tx_q_state.mode == HTT_TX_MODE_SWITCH_PUSH)
3764 if (ar->htt.num_pending_tx < ar->htt.tx_q_state.num_push_allowed)
3767 if (artxq->num_fw_queued < artxq->num_push_allowed)
3773 int ath10k_mac_tx_push_txq(struct ieee80211_hw *hw,
3774 struct ieee80211_txq *txq)
3776 struct ath10k *ar = hw->priv;
3777 struct ath10k_htt *htt = &ar->htt;
3778 struct ath10k_txq *artxq = (void *)txq->drv_priv;
3779 struct ieee80211_vif *vif = txq->vif;
3780 struct ieee80211_sta *sta = txq->sta;
3781 enum ath10k_hw_txrx_mode txmode;
3782 enum ath10k_mac_tx_path txpath;
3783 struct sk_buff *skb;
3784 struct ieee80211_hdr *hdr;
3786 bool is_mgmt, is_presp;
3789 spin_lock_bh(&ar->htt.tx_lock);
3790 ret = ath10k_htt_tx_inc_pending(htt);
3791 spin_unlock_bh(&ar->htt.tx_lock);
3796 skb = ieee80211_tx_dequeue(hw, txq);
3798 spin_lock_bh(&ar->htt.tx_lock);
3799 ath10k_htt_tx_dec_pending(htt);
3800 spin_unlock_bh(&ar->htt.tx_lock);
3805 ath10k_mac_tx_h_fill_cb(ar, vif, txq, skb);
3808 txmode = ath10k_mac_tx_h_get_txmode(ar, vif, sta, skb);
3809 txpath = ath10k_mac_tx_h_get_txpath(ar, skb, txmode);
3810 is_mgmt = (txpath == ATH10K_MAC_TX_HTT_MGMT);
3813 hdr = (struct ieee80211_hdr *)skb->data;
3814 is_presp = ieee80211_is_probe_resp(hdr->frame_control);
3816 spin_lock_bh(&ar->htt.tx_lock);
3817 ret = ath10k_htt_tx_mgmt_inc_pending(htt, is_mgmt, is_presp);
3820 ath10k_htt_tx_dec_pending(htt);
3821 spin_unlock_bh(&ar->htt.tx_lock);
3824 spin_unlock_bh(&ar->htt.tx_lock);
3827 ret = ath10k_mac_tx(ar, vif, sta, txmode, txpath, skb);
3828 if (unlikely(ret)) {
3829 ath10k_warn(ar, "failed to push frame: %d\n", ret);
3831 spin_lock_bh(&ar->htt.tx_lock);
3832 ath10k_htt_tx_dec_pending(htt);
3834 ath10k_htt_tx_mgmt_dec_pending(htt);
3835 spin_unlock_bh(&ar->htt.tx_lock);
3840 spin_lock_bh(&ar->htt.tx_lock);
3841 artxq->num_fw_queued++;
3842 spin_unlock_bh(&ar->htt.tx_lock);
3847 void ath10k_mac_tx_push_pending(struct ath10k *ar)
3849 struct ieee80211_hw *hw = ar->hw;
3850 struct ieee80211_txq *txq;
3851 struct ath10k_txq *artxq;
3852 struct ath10k_txq *last;
3856 if (ar->htt.num_pending_tx >= (ar->htt.max_num_pending_tx / 2))
3859 spin_lock_bh(&ar->txqs_lock);
3862 last = list_last_entry(&ar->txqs, struct ath10k_txq, list);
3863 while (!list_empty(&ar->txqs)) {
3864 artxq = list_first_entry(&ar->txqs, struct ath10k_txq, list);
3865 txq = container_of((void *)artxq, struct ieee80211_txq,
3868 /* Prevent aggressive sta/tid taking over tx queue */
3871 while (ath10k_mac_tx_can_push(hw, txq) && max--) {
3872 ret = ath10k_mac_tx_push_txq(hw, txq);
3877 list_del_init(&artxq->list);
3879 list_add_tail(&artxq->list, &ar->txqs);
3881 ath10k_htt_tx_txq_update(hw, txq);
3883 if (artxq == last || (ret < 0 && ret != -ENOENT))
3888 spin_unlock_bh(&ar->txqs_lock);
3895 void __ath10k_scan_finish(struct ath10k *ar)
3897 lockdep_assert_held(&ar->data_lock);
3899 switch (ar->scan.state) {
3900 case ATH10K_SCAN_IDLE:
3902 case ATH10K_SCAN_RUNNING:
3903 case ATH10K_SCAN_ABORTING:
3904 if (!ar->scan.is_roc) {
3905 struct cfg80211_scan_info info = {
3906 .aborted = (ar->scan.state ==
3907 ATH10K_SCAN_ABORTING),
3910 ieee80211_scan_completed(ar->hw, &info);
3911 } else if (ar->scan.roc_notify) {
3912 ieee80211_remain_on_channel_expired(ar->hw);
3915 case ATH10K_SCAN_STARTING:
3916 ar->scan.state = ATH10K_SCAN_IDLE;
3917 ar->scan_channel = NULL;
3918 ar->scan.roc_freq = 0;
3919 ath10k_offchan_tx_purge(ar);
3920 cancel_delayed_work(&ar->scan.timeout);
3921 complete(&ar->scan.completed);
3926 void ath10k_scan_finish(struct ath10k *ar)
3928 spin_lock_bh(&ar->data_lock);
3929 __ath10k_scan_finish(ar);
3930 spin_unlock_bh(&ar->data_lock);
3933 static int ath10k_scan_stop(struct ath10k *ar)
3935 struct wmi_stop_scan_arg arg = {
3936 .req_id = 1, /* FIXME */
3937 .req_type = WMI_SCAN_STOP_ONE,
3938 .u.scan_id = ATH10K_SCAN_ID,
3942 lockdep_assert_held(&ar->conf_mutex);
3944 ret = ath10k_wmi_stop_scan(ar, &arg);
3946 ath10k_warn(ar, "failed to stop wmi scan: %d\n", ret);
3950 ret = wait_for_completion_timeout(&ar->scan.completed, 3 * HZ);
3952 ath10k_warn(ar, "failed to receive scan abortion completion: timed out\n");
3954 } else if (ret > 0) {
3959 /* Scan state should be updated upon scan completion but in case
3960 * firmware fails to deliver the event (for whatever reason) it is
3961 * desired to clean up scan state anyway. Firmware may have just
3962 * dropped the scan completion event delivery due to transport pipe
3963 * being overflown with data and/or it can recover on its own before
3964 * next scan request is submitted.
3966 spin_lock_bh(&ar->data_lock);
3967 if (ar->scan.state != ATH10K_SCAN_IDLE)
3968 __ath10k_scan_finish(ar);
3969 spin_unlock_bh(&ar->data_lock);
3974 static void ath10k_scan_abort(struct ath10k *ar)
3978 lockdep_assert_held(&ar->conf_mutex);
3980 spin_lock_bh(&ar->data_lock);
3982 switch (ar->scan.state) {
3983 case ATH10K_SCAN_IDLE:
3984 /* This can happen if timeout worker kicked in and called
3985 * abortion while scan completion was being processed.
3988 case ATH10K_SCAN_STARTING:
3989 case ATH10K_SCAN_ABORTING:
3990 ath10k_warn(ar, "refusing scan abortion due to invalid scan state: %s (%d)\n",
3991 ath10k_scan_state_str(ar->scan.state),
3994 case ATH10K_SCAN_RUNNING:
3995 ar->scan.state = ATH10K_SCAN_ABORTING;
3996 spin_unlock_bh(&ar->data_lock);
3998 ret = ath10k_scan_stop(ar);
4000 ath10k_warn(ar, "failed to abort scan: %d\n", ret);
4002 spin_lock_bh(&ar->data_lock);
4006 spin_unlock_bh(&ar->data_lock);
4009 void ath10k_scan_timeout_work(struct work_struct *work)
4011 struct ath10k *ar = container_of(work, struct ath10k,
4014 mutex_lock(&ar->conf_mutex);
4015 ath10k_scan_abort(ar);
4016 mutex_unlock(&ar->conf_mutex);
4019 static int ath10k_start_scan(struct ath10k *ar,
4020 const struct wmi_start_scan_arg *arg)
4024 lockdep_assert_held(&ar->conf_mutex);
4026 ret = ath10k_wmi_start_scan(ar, arg);
4030 ret = wait_for_completion_timeout(&ar->scan.started, 1 * HZ);
4032 ret = ath10k_scan_stop(ar);
4034 ath10k_warn(ar, "failed to stop scan: %d\n", ret);
4039 /* If we failed to start the scan, return error code at
4040 * this point. This is probably due to some issue in the
4041 * firmware, but no need to wedge the driver due to that...
4043 spin_lock_bh(&ar->data_lock);
4044 if (ar->scan.state == ATH10K_SCAN_IDLE) {
4045 spin_unlock_bh(&ar->data_lock);
4048 spin_unlock_bh(&ar->data_lock);
4053 /**********************/
4054 /* mac80211 callbacks */
4055 /**********************/
4057 static void ath10k_mac_op_tx(struct ieee80211_hw *hw,
4058 struct ieee80211_tx_control *control,
4059 struct sk_buff *skb)
4061 struct ath10k *ar = hw->priv;
4062 struct ath10k_htt *htt = &ar->htt;
4063 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
4064 struct ieee80211_vif *vif = info->control.vif;
4065 struct ieee80211_sta *sta = control->sta;
4066 struct ieee80211_txq *txq = NULL;
4067 struct ieee80211_hdr *hdr = (void *)skb->data;
4068 enum ath10k_hw_txrx_mode txmode;
4069 enum ath10k_mac_tx_path txpath;
4075 ath10k_mac_tx_h_fill_cb(ar, vif, txq, skb);
4077 txmode = ath10k_mac_tx_h_get_txmode(ar, vif, sta, skb);
4078 txpath = ath10k_mac_tx_h_get_txpath(ar, skb, txmode);
4079 is_htt = (txpath == ATH10K_MAC_TX_HTT ||
4080 txpath == ATH10K_MAC_TX_HTT_MGMT);
4081 is_mgmt = (txpath == ATH10K_MAC_TX_HTT_MGMT);
4084 spin_lock_bh(&ar->htt.tx_lock);
4085 is_presp = ieee80211_is_probe_resp(hdr->frame_control);
4087 ret = ath10k_htt_tx_inc_pending(htt);
4089 ath10k_warn(ar, "failed to increase tx pending count: %d, dropping\n",
4091 spin_unlock_bh(&ar->htt.tx_lock);
4092 ieee80211_free_txskb(ar->hw, skb);
4096 ret = ath10k_htt_tx_mgmt_inc_pending(htt, is_mgmt, is_presp);
4098 ath10k_dbg(ar, ATH10K_DBG_MAC, "failed to increase tx mgmt pending count: %d, dropping\n",
4100 ath10k_htt_tx_dec_pending(htt);
4101 spin_unlock_bh(&ar->htt.tx_lock);
4102 ieee80211_free_txskb(ar->hw, skb);
4105 spin_unlock_bh(&ar->htt.tx_lock);
4108 ret = ath10k_mac_tx(ar, vif, sta, txmode, txpath, skb);
4110 ath10k_warn(ar, "failed to transmit frame: %d\n", ret);
4112 spin_lock_bh(&ar->htt.tx_lock);
4113 ath10k_htt_tx_dec_pending(htt);
4115 ath10k_htt_tx_mgmt_dec_pending(htt);
4116 spin_unlock_bh(&ar->htt.tx_lock);
4122 static void ath10k_mac_op_wake_tx_queue(struct ieee80211_hw *hw,
4123 struct ieee80211_txq *txq)
4125 struct ath10k *ar = hw->priv;
4126 struct ath10k_txq *artxq = (void *)txq->drv_priv;
4127 struct ieee80211_txq *f_txq;
4128 struct ath10k_txq *f_artxq;
4132 spin_lock_bh(&ar->txqs_lock);
4133 if (list_empty(&artxq->list))
4134 list_add_tail(&artxq->list, &ar->txqs);
4136 f_artxq = list_first_entry(&ar->txqs, struct ath10k_txq, list);
4137 f_txq = container_of((void *)f_artxq, struct ieee80211_txq, drv_priv);
4138 list_del_init(&f_artxq->list);
4140 while (ath10k_mac_tx_can_push(hw, f_txq) && max--) {
4141 ret = ath10k_mac_tx_push_txq(hw, f_txq);
4146 list_add_tail(&f_artxq->list, &ar->txqs);
4147 spin_unlock_bh(&ar->txqs_lock);
4149 ath10k_htt_tx_txq_update(hw, f_txq);
4150 ath10k_htt_tx_txq_update(hw, txq);
4153 /* Must not be called with conf_mutex held as workers can use that also. */
4154 void ath10k_drain_tx(struct ath10k *ar)
4156 /* make sure rcu-protected mac80211 tx path itself is drained */
4159 ath10k_offchan_tx_purge(ar);
4160 ath10k_mgmt_over_wmi_tx_purge(ar);
4162 cancel_work_sync(&ar->offchan_tx_work);
4163 cancel_work_sync(&ar->wmi_mgmt_tx_work);
4166 void ath10k_halt(struct ath10k *ar)
4168 struct ath10k_vif *arvif;
4170 lockdep_assert_held(&ar->conf_mutex);
4172 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
4173 ar->filter_flags = 0;
4174 ar->monitor = false;
4175 ar->monitor_arvif = NULL;
4177 if (ar->monitor_started)
4178 ath10k_monitor_stop(ar);
4180 ar->monitor_started = false;
4183 ath10k_scan_finish(ar);
4184 ath10k_peer_cleanup_all(ar);
4185 ath10k_core_stop(ar);
4186 ath10k_hif_power_down(ar);
4188 spin_lock_bh(&ar->data_lock);
4189 list_for_each_entry(arvif, &ar->arvifs, list)
4190 ath10k_mac_vif_beacon_cleanup(arvif);
4191 spin_unlock_bh(&ar->data_lock);
4194 static int ath10k_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant)
4196 struct ath10k *ar = hw->priv;
4198 mutex_lock(&ar->conf_mutex);
4200 *tx_ant = ar->cfg_tx_chainmask;
4201 *rx_ant = ar->cfg_rx_chainmask;
4203 mutex_unlock(&ar->conf_mutex);
4208 static void ath10k_check_chain_mask(struct ath10k *ar, u32 cm, const char *dbg)
4210 /* It is not clear that allowing gaps in chainmask
4211 * is helpful. Probably it will not do what user
4212 * is hoping for, so warn in that case.
4214 if (cm == 15 || cm == 7 || cm == 3 || cm == 1 || cm == 0)
4217 ath10k_warn(ar, "mac %s antenna chainmask may be invalid: 0x%x. Suggested values: 15, 7, 3, 1 or 0.\n",
4221 static int ath10k_mac_get_vht_cap_bf_sts(struct ath10k *ar)
4223 int nsts = ar->vht_cap_info;
4225 nsts &= IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
4226 nsts >>= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
4228 /* If firmware does not deliver to host number of space-time
4229 * streams supported, assume it support up to 4 BF STS and return
4230 * the value for VHT CAP: nsts-1)
4238 static int ath10k_mac_get_vht_cap_bf_sound_dim(struct ath10k *ar)
4240 int sound_dim = ar->vht_cap_info;
4242 sound_dim &= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
4243 sound_dim >>= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
4245 /* If the sounding dimension is not advertised by the firmware,
4246 * let's use a default value of 1
4254 static struct ieee80211_sta_vht_cap ath10k_create_vht_cap(struct ath10k *ar)
4256 struct ieee80211_sta_vht_cap vht_cap = {0};
4261 vht_cap.vht_supported = 1;
4262 vht_cap.cap = ar->vht_cap_info;
4264 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
4265 IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)) {
4266 val = ath10k_mac_get_vht_cap_bf_sts(ar);
4267 val <<= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
4268 val &= IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
4273 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
4274 IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)) {
4275 val = ath10k_mac_get_vht_cap_bf_sound_dim(ar);
4276 val <<= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
4277 val &= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
4283 for (i = 0; i < 8; i++) {
4284 if ((i < ar->num_rf_chains) && (ar->cfg_tx_chainmask & BIT(i)))
4285 mcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
4287 mcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
4290 if (ar->cfg_tx_chainmask <= 1)
4291 vht_cap.cap &= ~IEEE80211_VHT_CAP_TXSTBC;
4293 vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(mcs_map);
4294 vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(mcs_map);
4299 static struct ieee80211_sta_ht_cap ath10k_get_ht_cap(struct ath10k *ar)
4302 struct ieee80211_sta_ht_cap ht_cap = {0};
4304 if (!(ar->ht_cap_info & WMI_HT_CAP_ENABLED))
4307 ht_cap.ht_supported = 1;
4308 ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
4309 ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_8;
4310 ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
4311 ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
4313 WLAN_HT_CAP_SM_PS_DISABLED << IEEE80211_HT_CAP_SM_PS_SHIFT;
4315 if (ar->ht_cap_info & WMI_HT_CAP_HT20_SGI)
4316 ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
4318 if (ar->ht_cap_info & WMI_HT_CAP_HT40_SGI)
4319 ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
4321 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) {
4324 smps = WLAN_HT_CAP_SM_PS_DYNAMIC;
4325 smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT;
4330 if (ar->ht_cap_info & WMI_HT_CAP_TX_STBC && (ar->cfg_tx_chainmask > 1))
4331 ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC;
4333 if (ar->ht_cap_info & WMI_HT_CAP_RX_STBC) {
4336 stbc = ar->ht_cap_info;
4337 stbc &= WMI_HT_CAP_RX_STBC;
4338 stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT;
4339 stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT;
4340 stbc &= IEEE80211_HT_CAP_RX_STBC;
4345 if (ar->ht_cap_info & WMI_HT_CAP_LDPC)
4346 ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
4348 if (ar->ht_cap_info & WMI_HT_CAP_L_SIG_TXOP_PROT)
4349 ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
4351 /* max AMSDU is implicitly taken from vht_cap_info */
4352 if (ar->vht_cap_info & WMI_VHT_CAP_MAX_MPDU_LEN_MASK)
4353 ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU;
4355 for (i = 0; i < ar->num_rf_chains; i++) {
4356 if (ar->cfg_rx_chainmask & BIT(i))
4357 ht_cap.mcs.rx_mask[i] = 0xFF;
4360 ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
4365 static void ath10k_mac_setup_ht_vht_cap(struct ath10k *ar)
4367 struct ieee80211_supported_band *band;
4368 struct ieee80211_sta_vht_cap vht_cap;
4369 struct ieee80211_sta_ht_cap ht_cap;
4371 ht_cap = ath10k_get_ht_cap(ar);
4372 vht_cap = ath10k_create_vht_cap(ar);
4374 if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) {
4375 band = &ar->mac.sbands[NL80211_BAND_2GHZ];
4376 band->ht_cap = ht_cap;
4378 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) {
4379 band = &ar->mac.sbands[NL80211_BAND_5GHZ];
4380 band->ht_cap = ht_cap;
4381 band->vht_cap = vht_cap;
4385 static int __ath10k_set_antenna(struct ath10k *ar, u32 tx_ant, u32 rx_ant)
4389 lockdep_assert_held(&ar->conf_mutex);
4391 ath10k_check_chain_mask(ar, tx_ant, "tx");
4392 ath10k_check_chain_mask(ar, rx_ant, "rx");
4394 ar->cfg_tx_chainmask = tx_ant;
4395 ar->cfg_rx_chainmask = rx_ant;
4397 if ((ar->state != ATH10K_STATE_ON) &&
4398 (ar->state != ATH10K_STATE_RESTARTED))
4401 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->tx_chain_mask,
4404 ath10k_warn(ar, "failed to set tx-chainmask: %d, req 0x%x\n",
4409 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->rx_chain_mask,
4412 ath10k_warn(ar, "failed to set rx-chainmask: %d, req 0x%x\n",
4417 /* Reload HT/VHT capability */
4418 ath10k_mac_setup_ht_vht_cap(ar);
4423 static int ath10k_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)
4425 struct ath10k *ar = hw->priv;
4428 mutex_lock(&ar->conf_mutex);
4429 ret = __ath10k_set_antenna(ar, tx_ant, rx_ant);
4430 mutex_unlock(&ar->conf_mutex);
4434 static int ath10k_start(struct ieee80211_hw *hw)
4436 struct ath10k *ar = hw->priv;
4441 * This makes sense only when restarting hw. It is harmless to call
4442 * unconditionally. This is necessary to make sure no HTT/WMI tx
4443 * commands will be submitted while restarting.
4445 ath10k_drain_tx(ar);
4447 mutex_lock(&ar->conf_mutex);
4449 switch (ar->state) {
4450 case ATH10K_STATE_OFF:
4451 ar->state = ATH10K_STATE_ON;
4453 case ATH10K_STATE_RESTARTING:
4454 ar->state = ATH10K_STATE_RESTARTED;
4456 case ATH10K_STATE_ON:
4457 case ATH10K_STATE_RESTARTED:
4458 case ATH10K_STATE_WEDGED:
4462 case ATH10K_STATE_UTF:
4467 ret = ath10k_hif_power_up(ar);
4469 ath10k_err(ar, "Could not init hif: %d\n", ret);
4473 ret = ath10k_core_start(ar, ATH10K_FIRMWARE_MODE_NORMAL,
4474 &ar->normal_mode_fw);
4476 ath10k_err(ar, "Could not init core: %d\n", ret);
4477 goto err_power_down;
4480 param = ar->wmi.pdev_param->pmf_qos;
4481 ret = ath10k_wmi_pdev_set_param(ar, param, 1);
4483 ath10k_warn(ar, "failed to enable PMF QOS: %d\n", ret);
4487 param = ar->wmi.pdev_param->dynamic_bw;
4488 ret = ath10k_wmi_pdev_set_param(ar, param, 1);
4490 ath10k_warn(ar, "failed to enable dynamic BW: %d\n", ret);
4494 if (test_bit(WMI_SERVICE_ADAPTIVE_OCS, ar->wmi.svc_map)) {
4495 ret = ath10k_wmi_adaptive_qcs(ar, true);
4497 ath10k_warn(ar, "failed to enable adaptive qcs: %d\n",
4503 if (test_bit(WMI_SERVICE_BURST, ar->wmi.svc_map)) {
4504 param = ar->wmi.pdev_param->burst_enable;
4505 ret = ath10k_wmi_pdev_set_param(ar, param, 0);
4507 ath10k_warn(ar, "failed to disable burst: %d\n", ret);
4512 __ath10k_set_antenna(ar, ar->cfg_tx_chainmask, ar->cfg_rx_chainmask);
4515 * By default FW set ARP frames ac to voice (6). In that case ARP
4516 * exchange is not working properly for UAPSD enabled AP. ARP requests
4517 * which arrives with access category 0 are processed by network stack
4518 * and send back with access category 0, but FW changes access category
4519 * to 6. Set ARP frames access category to best effort (0) solves
4523 param = ar->wmi.pdev_param->arp_ac_override;
4524 ret = ath10k_wmi_pdev_set_param(ar, param, 0);
4526 ath10k_warn(ar, "failed to set arp ac override parameter: %d\n",
4531 if (test_bit(ATH10K_FW_FEATURE_SUPPORTS_ADAPTIVE_CCA,
4532 ar->running_fw->fw_file.fw_features)) {
4533 ret = ath10k_wmi_pdev_enable_adaptive_cca(ar, 1,
4534 WMI_CCA_DETECT_LEVEL_AUTO,
4535 WMI_CCA_DETECT_MARGIN_AUTO);
4537 ath10k_warn(ar, "failed to enable adaptive cca: %d\n",
4543 param = ar->wmi.pdev_param->ani_enable;
4544 ret = ath10k_wmi_pdev_set_param(ar, param, 1);
4546 ath10k_warn(ar, "failed to enable ani by default: %d\n",
4551 ar->ani_enabled = true;
4553 if (ath10k_peer_stats_enabled(ar)) {
4554 param = ar->wmi.pdev_param->peer_stats_update_period;
4555 ret = ath10k_wmi_pdev_set_param(ar, param,
4556 PEER_DEFAULT_STATS_UPDATE_PERIOD);
4559 "failed to set peer stats period : %d\n",
4565 param = ar->wmi.pdev_param->enable_btcoex;
4566 if (test_bit(WMI_SERVICE_COEX_GPIO, ar->wmi.svc_map) &&
4567 test_bit(ATH10K_FW_FEATURE_BTCOEX_PARAM,
4568 ar->running_fw->fw_file.fw_features)) {
4569 ret = ath10k_wmi_pdev_set_param(ar, param, 0);
4572 "failed to set btcoex param: %d\n", ret);
4575 clear_bit(ATH10K_FLAG_BTCOEX, &ar->dev_flags);
4578 ar->num_started_vdevs = 0;
4579 ath10k_regd_update(ar);
4581 ath10k_spectral_start(ar);
4582 ath10k_thermal_set_throttling(ar);
4584 mutex_unlock(&ar->conf_mutex);
4588 ath10k_core_stop(ar);
4591 ath10k_hif_power_down(ar);
4594 ar->state = ATH10K_STATE_OFF;
4597 mutex_unlock(&ar->conf_mutex);
4601 static void ath10k_stop(struct ieee80211_hw *hw)
4603 struct ath10k *ar = hw->priv;
4605 ath10k_drain_tx(ar);
4607 mutex_lock(&ar->conf_mutex);
4608 if (ar->state != ATH10K_STATE_OFF) {
4610 ar->state = ATH10K_STATE_OFF;
4612 mutex_unlock(&ar->conf_mutex);
4614 cancel_delayed_work_sync(&ar->scan.timeout);
4615 cancel_work_sync(&ar->restart_work);
4618 static int ath10k_config_ps(struct ath10k *ar)
4620 struct ath10k_vif *arvif;
4623 lockdep_assert_held(&ar->conf_mutex);
4625 list_for_each_entry(arvif, &ar->arvifs, list) {
4626 ret = ath10k_mac_vif_setup_ps(arvif);
4628 ath10k_warn(ar, "failed to setup powersave: %d\n", ret);
4636 static int ath10k_mac_txpower_setup(struct ath10k *ar, int txpower)
4641 lockdep_assert_held(&ar->conf_mutex);
4643 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac txpower %d\n", txpower);
4645 param = ar->wmi.pdev_param->txpower_limit2g;
4646 ret = ath10k_wmi_pdev_set_param(ar, param, txpower * 2);
4648 ath10k_warn(ar, "failed to set 2g txpower %d: %d\n",
4653 param = ar->wmi.pdev_param->txpower_limit5g;
4654 ret = ath10k_wmi_pdev_set_param(ar, param, txpower * 2);
4656 ath10k_warn(ar, "failed to set 5g txpower %d: %d\n",
4664 static int ath10k_mac_txpower_recalc(struct ath10k *ar)
4666 struct ath10k_vif *arvif;
4667 int ret, txpower = -1;
4669 lockdep_assert_held(&ar->conf_mutex);
4671 list_for_each_entry(arvif, &ar->arvifs, list) {
4672 WARN_ON(arvif->txpower < 0);
4675 txpower = arvif->txpower;
4677 txpower = min(txpower, arvif->txpower);
4680 if (WARN_ON(txpower == -1))
4683 ret = ath10k_mac_txpower_setup(ar, txpower);
4685 ath10k_warn(ar, "failed to setup tx power %d: %d\n",
4693 static int ath10k_config(struct ieee80211_hw *hw, u32 changed)
4695 struct ath10k *ar = hw->priv;
4696 struct ieee80211_conf *conf = &hw->conf;
4699 mutex_lock(&ar->conf_mutex);
4701 if (changed & IEEE80211_CONF_CHANGE_PS)
4702 ath10k_config_ps(ar);
4704 if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
4705 ar->monitor = conf->flags & IEEE80211_CONF_MONITOR;
4706 ret = ath10k_monitor_recalc(ar);
4708 ath10k_warn(ar, "failed to recalc monitor: %d\n", ret);
4711 mutex_unlock(&ar->conf_mutex);
4715 static u32 get_nss_from_chainmask(u16 chain_mask)
4717 if ((chain_mask & 0xf) == 0xf)
4719 else if ((chain_mask & 0x7) == 0x7)
4721 else if ((chain_mask & 0x3) == 0x3)
4726 static int ath10k_mac_set_txbf_conf(struct ath10k_vif *arvif)
4729 struct ath10k *ar = arvif->ar;
4733 if (ath10k_wmi_get_txbf_conf_scheme(ar) != WMI_TXBF_CONF_BEFORE_ASSOC)
4736 nsts = ath10k_mac_get_vht_cap_bf_sts(ar);
4737 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
4738 IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE))
4739 value |= SM(nsts, WMI_TXBF_STS_CAP_OFFSET);
4741 sound_dim = ath10k_mac_get_vht_cap_bf_sound_dim(ar);
4742 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
4743 IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE))
4744 value |= SM(sound_dim, WMI_BF_SOUND_DIM_OFFSET);
4749 if (ar->vht_cap_info & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)
4750 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
4752 if (ar->vht_cap_info & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)
4753 value |= (WMI_VDEV_PARAM_TXBF_MU_TX_BFER |
4754 WMI_VDEV_PARAM_TXBF_SU_TX_BFER);
4756 if (ar->vht_cap_info & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)
4757 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
4759 if (ar->vht_cap_info & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)
4760 value |= (WMI_VDEV_PARAM_TXBF_MU_TX_BFEE |
4761 WMI_VDEV_PARAM_TXBF_SU_TX_BFEE);
4763 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
4764 ar->wmi.vdev_param->txbf, value);
4769 * Figure out how to handle WMI_VDEV_SUBTYPE_P2P_DEVICE,
4770 * because we will send mgmt frames without CCK. This requirement
4771 * for P2P_FIND/GO_NEG should be handled by checking CCK flag
4774 static int ath10k_add_interface(struct ieee80211_hw *hw,
4775 struct ieee80211_vif *vif)
4777 struct ath10k *ar = hw->priv;
4778 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4779 struct ath10k_peer *peer;
4780 enum wmi_sta_powersave_param param;
4787 vif->driver_flags |= IEEE80211_VIF_SUPPORTS_UAPSD;
4789 mutex_lock(&ar->conf_mutex);
4791 memset(arvif, 0, sizeof(*arvif));
4792 ath10k_mac_txq_init(vif->txq);
4797 INIT_LIST_HEAD(&arvif->list);
4798 INIT_WORK(&arvif->ap_csa_work, ath10k_mac_vif_ap_csa_work);
4799 INIT_DELAYED_WORK(&arvif->connection_loss_work,
4800 ath10k_mac_vif_sta_connection_loss_work);
4802 for (i = 0; i < ARRAY_SIZE(arvif->bitrate_mask.control); i++) {
4803 arvif->bitrate_mask.control[i].legacy = 0xffffffff;
4804 memset(arvif->bitrate_mask.control[i].ht_mcs, 0xff,
4805 sizeof(arvif->bitrate_mask.control[i].ht_mcs));
4806 memset(arvif->bitrate_mask.control[i].vht_mcs, 0xff,
4807 sizeof(arvif->bitrate_mask.control[i].vht_mcs));
4810 if (ar->num_peers >= ar->max_num_peers) {
4811 ath10k_warn(ar, "refusing vdev creation due to insufficient peer entry resources in firmware\n");
4816 if (ar->free_vdev_map == 0) {
4817 ath10k_warn(ar, "Free vdev map is empty, no more interfaces allowed.\n");
4821 bit = __ffs64(ar->free_vdev_map);
4823 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac create vdev %i map %llx\n",
4824 bit, ar->free_vdev_map);
4826 arvif->vdev_id = bit;
4827 arvif->vdev_subtype =
4828 ath10k_wmi_get_vdev_subtype(ar, WMI_VDEV_SUBTYPE_NONE);
4830 switch (vif->type) {
4831 case NL80211_IFTYPE_P2P_DEVICE:
4832 arvif->vdev_type = WMI_VDEV_TYPE_STA;
4833 arvif->vdev_subtype = ath10k_wmi_get_vdev_subtype
4834 (ar, WMI_VDEV_SUBTYPE_P2P_DEVICE);
4836 case NL80211_IFTYPE_UNSPECIFIED:
4837 case NL80211_IFTYPE_STATION:
4838 arvif->vdev_type = WMI_VDEV_TYPE_STA;
4840 arvif->vdev_subtype = ath10k_wmi_get_vdev_subtype
4841 (ar, WMI_VDEV_SUBTYPE_P2P_CLIENT);
4843 case NL80211_IFTYPE_ADHOC:
4844 arvif->vdev_type = WMI_VDEV_TYPE_IBSS;
4846 case NL80211_IFTYPE_MESH_POINT:
4847 if (test_bit(WMI_SERVICE_MESH_11S, ar->wmi.svc_map)) {
4848 arvif->vdev_subtype = ath10k_wmi_get_vdev_subtype
4849 (ar, WMI_VDEV_SUBTYPE_MESH_11S);
4850 } else if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) {
4852 ath10k_warn(ar, "must load driver with rawmode=1 to add mesh interfaces\n");
4855 arvif->vdev_type = WMI_VDEV_TYPE_AP;
4857 case NL80211_IFTYPE_AP:
4858 arvif->vdev_type = WMI_VDEV_TYPE_AP;
4861 arvif->vdev_subtype = ath10k_wmi_get_vdev_subtype
4862 (ar, WMI_VDEV_SUBTYPE_P2P_GO);
4864 case NL80211_IFTYPE_MONITOR:
4865 arvif->vdev_type = WMI_VDEV_TYPE_MONITOR;
4872 /* Using vdev_id as queue number will make it very easy to do per-vif
4873 * tx queue locking. This shouldn't wrap due to interface combinations
4874 * but do a modulo for correctness sake and prevent using offchannel tx
4875 * queues for regular vif tx.
4877 vif->cab_queue = arvif->vdev_id % (IEEE80211_MAX_QUEUES - 1);
4878 for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++)
4879 vif->hw_queue[i] = arvif->vdev_id % (IEEE80211_MAX_QUEUES - 1);
4881 /* Some firmware revisions don't wait for beacon tx completion before
4882 * sending another SWBA event. This could lead to hardware using old
4883 * (freed) beacon data in some cases, e.g. tx credit starvation
4884 * combined with missed TBTT. This is very very rare.
4886 * On non-IOMMU-enabled hosts this could be a possible security issue
4887 * because hw could beacon some random data on the air. On
4888 * IOMMU-enabled hosts DMAR faults would occur in most cases and target
4889 * device would crash.
4891 * Since there are no beacon tx completions (implicit nor explicit)
4892 * propagated to host the only workaround for this is to allocate a
4893 * DMA-coherent buffer for a lifetime of a vif and use it for all
4894 * beacon tx commands. Worst case for this approach is some beacons may
4895 * become corrupted, e.g. have garbled IEs or out-of-date TIM bitmap.
4897 if (vif->type == NL80211_IFTYPE_ADHOC ||
4898 vif->type == NL80211_IFTYPE_MESH_POINT ||
4899 vif->type == NL80211_IFTYPE_AP) {
4900 arvif->beacon_buf = dma_zalloc_coherent(ar->dev,
4901 IEEE80211_MAX_FRAME_LEN,
4902 &arvif->beacon_paddr,
4904 if (!arvif->beacon_buf) {
4906 ath10k_warn(ar, "failed to allocate beacon buffer: %d\n",
4911 if (test_bit(ATH10K_FLAG_HW_CRYPTO_DISABLED, &ar->dev_flags))
4912 arvif->nohwcrypt = true;
4914 if (arvif->nohwcrypt &&
4915 !test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) {
4916 ath10k_warn(ar, "cryptmode module param needed for sw crypto\n");
4920 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev create %d (add interface) type %d subtype %d bcnmode %s\n",
4921 arvif->vdev_id, arvif->vdev_type, arvif->vdev_subtype,
4922 arvif->beacon_buf ? "single-buf" : "per-skb");
4924 ret = ath10k_wmi_vdev_create(ar, arvif->vdev_id, arvif->vdev_type,
4925 arvif->vdev_subtype, vif->addr);
4927 ath10k_warn(ar, "failed to create WMI vdev %i: %d\n",
4928 arvif->vdev_id, ret);
4932 ar->free_vdev_map &= ~(1LL << arvif->vdev_id);
4933 spin_lock_bh(&ar->data_lock);
4934 list_add(&arvif->list, &ar->arvifs);
4935 spin_unlock_bh(&ar->data_lock);
4937 /* It makes no sense to have firmware do keepalives. mac80211 already
4938 * takes care of this with idle connection polling.
4940 ret = ath10k_mac_vif_disable_keepalive(arvif);
4942 ath10k_warn(ar, "failed to disable keepalive on vdev %i: %d\n",
4943 arvif->vdev_id, ret);
4944 goto err_vdev_delete;
4947 arvif->def_wep_key_idx = -1;
4949 vdev_param = ar->wmi.vdev_param->tx_encap_type;
4950 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
4951 ATH10K_HW_TXRX_NATIVE_WIFI);
4952 /* 10.X firmware does not support this VDEV parameter. Do not warn */
4953 if (ret && ret != -EOPNOTSUPP) {
4954 ath10k_warn(ar, "failed to set vdev %i TX encapsulation: %d\n",
4955 arvif->vdev_id, ret);
4956 goto err_vdev_delete;
4959 /* Configuring number of spatial stream for monitor interface is causing
4960 * target assert in qca9888 and qca6174.
4962 if (ar->cfg_tx_chainmask && (vif->type != NL80211_IFTYPE_MONITOR)) {
4963 u16 nss = get_nss_from_chainmask(ar->cfg_tx_chainmask);
4965 vdev_param = ar->wmi.vdev_param->nss;
4966 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
4969 ath10k_warn(ar, "failed to set vdev %i chainmask 0x%x, nss %i: %d\n",
4970 arvif->vdev_id, ar->cfg_tx_chainmask, nss,
4972 goto err_vdev_delete;
4976 if (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
4977 arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
4978 ret = ath10k_peer_create(ar, vif, NULL, arvif->vdev_id,
4979 vif->addr, WMI_PEER_TYPE_DEFAULT);
4981 ath10k_warn(ar, "failed to create vdev %i peer for AP/IBSS: %d\n",
4982 arvif->vdev_id, ret);
4983 goto err_vdev_delete;
4986 spin_lock_bh(&ar->data_lock);
4988 peer = ath10k_peer_find(ar, arvif->vdev_id, vif->addr);
4990 ath10k_warn(ar, "failed to lookup peer %pM on vdev %i\n",
4991 vif->addr, arvif->vdev_id);
4992 spin_unlock_bh(&ar->data_lock);
4994 goto err_peer_delete;
4997 arvif->peer_id = find_first_bit(peer->peer_ids,
4998 ATH10K_MAX_NUM_PEER_IDS);
5000 spin_unlock_bh(&ar->data_lock);
5002 arvif->peer_id = HTT_INVALID_PEERID;
5005 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
5006 ret = ath10k_mac_set_kickout(arvif);
5008 ath10k_warn(ar, "failed to set vdev %i kickout parameters: %d\n",
5009 arvif->vdev_id, ret);
5010 goto err_peer_delete;
5014 if (arvif->vdev_type == WMI_VDEV_TYPE_STA) {
5015 param = WMI_STA_PS_PARAM_RX_WAKE_POLICY;
5016 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
5017 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
5020 ath10k_warn(ar, "failed to set vdev %i RX wake policy: %d\n",
5021 arvif->vdev_id, ret);
5022 goto err_peer_delete;
5025 ret = ath10k_mac_vif_recalc_ps_wake_threshold(arvif);
5027 ath10k_warn(ar, "failed to recalc ps wake threshold on vdev %i: %d\n",
5028 arvif->vdev_id, ret);
5029 goto err_peer_delete;
5032 ret = ath10k_mac_vif_recalc_ps_poll_count(arvif);
5034 ath10k_warn(ar, "failed to recalc ps poll count on vdev %i: %d\n",
5035 arvif->vdev_id, ret);
5036 goto err_peer_delete;
5040 ret = ath10k_mac_set_txbf_conf(arvif);
5042 ath10k_warn(ar, "failed to set txbf for vdev %d: %d\n",
5043 arvif->vdev_id, ret);
5044 goto err_peer_delete;
5047 ret = ath10k_mac_set_rts(arvif, ar->hw->wiphy->rts_threshold);
5049 ath10k_warn(ar, "failed to set rts threshold for vdev %d: %d\n",
5050 arvif->vdev_id, ret);
5051 goto err_peer_delete;
5054 arvif->txpower = vif->bss_conf.txpower;
5055 ret = ath10k_mac_txpower_recalc(ar);
5057 ath10k_warn(ar, "failed to recalc tx power: %d\n", ret);
5058 goto err_peer_delete;
5061 if (vif->type == NL80211_IFTYPE_MONITOR) {
5062 ar->monitor_arvif = arvif;
5063 ret = ath10k_monitor_recalc(ar);
5065 ath10k_warn(ar, "failed to recalc monitor: %d\n", ret);
5066 goto err_peer_delete;
5070 spin_lock_bh(&ar->htt.tx_lock);
5072 ieee80211_wake_queue(ar->hw, arvif->vdev_id);
5073 spin_unlock_bh(&ar->htt.tx_lock);
5075 mutex_unlock(&ar->conf_mutex);
5079 if (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
5080 arvif->vdev_type == WMI_VDEV_TYPE_IBSS)
5081 ath10k_wmi_peer_delete(ar, arvif->vdev_id, vif->addr);
5084 ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
5085 ar->free_vdev_map |= 1LL << arvif->vdev_id;
5086 spin_lock_bh(&ar->data_lock);
5087 list_del(&arvif->list);
5088 spin_unlock_bh(&ar->data_lock);
5091 if (arvif->beacon_buf) {
5092 dma_free_coherent(ar->dev, IEEE80211_MAX_FRAME_LEN,
5093 arvif->beacon_buf, arvif->beacon_paddr);
5094 arvif->beacon_buf = NULL;
5097 mutex_unlock(&ar->conf_mutex);
5102 static void ath10k_mac_vif_tx_unlock_all(struct ath10k_vif *arvif)
5106 for (i = 0; i < BITS_PER_LONG; i++)
5107 ath10k_mac_vif_tx_unlock(arvif, i);
5110 static void ath10k_remove_interface(struct ieee80211_hw *hw,
5111 struct ieee80211_vif *vif)
5113 struct ath10k *ar = hw->priv;
5114 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
5115 struct ath10k_peer *peer;
5119 cancel_work_sync(&arvif->ap_csa_work);
5120 cancel_delayed_work_sync(&arvif->connection_loss_work);
5122 mutex_lock(&ar->conf_mutex);
5124 spin_lock_bh(&ar->data_lock);
5125 ath10k_mac_vif_beacon_cleanup(arvif);
5126 spin_unlock_bh(&ar->data_lock);
5128 ret = ath10k_spectral_vif_stop(arvif);
5130 ath10k_warn(ar, "failed to stop spectral for vdev %i: %d\n",
5131 arvif->vdev_id, ret);
5133 ar->free_vdev_map |= 1LL << arvif->vdev_id;
5134 spin_lock_bh(&ar->data_lock);
5135 list_del(&arvif->list);
5136 spin_unlock_bh(&ar->data_lock);
5138 if (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
5139 arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
5140 ret = ath10k_wmi_peer_delete(arvif->ar, arvif->vdev_id,
5143 ath10k_warn(ar, "failed to submit AP/IBSS self-peer removal on vdev %i: %d\n",
5144 arvif->vdev_id, ret);
5146 kfree(arvif->u.ap.noa_data);
5149 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i delete (remove interface)\n",
5152 ret = ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
5154 ath10k_warn(ar, "failed to delete WMI vdev %i: %d\n",
5155 arvif->vdev_id, ret);
5157 /* Some firmware revisions don't notify host about self-peer removal
5158 * until after associated vdev is deleted.
5160 if (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
5161 arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
5162 ret = ath10k_wait_for_peer_deleted(ar, arvif->vdev_id,
5165 ath10k_warn(ar, "failed to remove AP self-peer on vdev %i: %d\n",
5166 arvif->vdev_id, ret);
5168 spin_lock_bh(&ar->data_lock);
5170 spin_unlock_bh(&ar->data_lock);
5173 spin_lock_bh(&ar->data_lock);
5174 for (i = 0; i < ARRAY_SIZE(ar->peer_map); i++) {
5175 peer = ar->peer_map[i];
5179 if (peer->vif == vif) {
5180 ath10k_warn(ar, "found vif peer %pM entry on vdev %i after it was supposedly removed\n",
5181 vif->addr, arvif->vdev_id);
5185 spin_unlock_bh(&ar->data_lock);
5187 ath10k_peer_cleanup(ar, arvif->vdev_id);
5188 ath10k_mac_txq_unref(ar, vif->txq);
5190 if (vif->type == NL80211_IFTYPE_MONITOR) {
5191 ar->monitor_arvif = NULL;
5192 ret = ath10k_monitor_recalc(ar);
5194 ath10k_warn(ar, "failed to recalc monitor: %d\n", ret);
5197 spin_lock_bh(&ar->htt.tx_lock);
5198 ath10k_mac_vif_tx_unlock_all(arvif);
5199 spin_unlock_bh(&ar->htt.tx_lock);
5201 ath10k_mac_txq_unref(ar, vif->txq);
5203 mutex_unlock(&ar->conf_mutex);
5207 * FIXME: Has to be verified.
5209 #define SUPPORTED_FILTERS \
5214 FIF_BCN_PRBRESP_PROMISC | \
5218 static void ath10k_configure_filter(struct ieee80211_hw *hw,
5219 unsigned int changed_flags,
5220 unsigned int *total_flags,
5223 struct ath10k *ar = hw->priv;
5226 mutex_lock(&ar->conf_mutex);
5228 changed_flags &= SUPPORTED_FILTERS;
5229 *total_flags &= SUPPORTED_FILTERS;
5230 ar->filter_flags = *total_flags;
5232 ret = ath10k_monitor_recalc(ar);
5234 ath10k_warn(ar, "failed to recalc monitor: %d\n", ret);
5236 mutex_unlock(&ar->conf_mutex);
5239 static void ath10k_bss_info_changed(struct ieee80211_hw *hw,
5240 struct ieee80211_vif *vif,
5241 struct ieee80211_bss_conf *info,
5244 struct ath10k *ar = hw->priv;
5245 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
5247 u32 vdev_param, pdev_param, slottime, preamble;
5249 mutex_lock(&ar->conf_mutex);
5251 if (changed & BSS_CHANGED_IBSS)
5252 ath10k_control_ibss(arvif, info, vif->addr);
5254 if (changed & BSS_CHANGED_BEACON_INT) {
5255 arvif->beacon_interval = info->beacon_int;
5256 vdev_param = ar->wmi.vdev_param->beacon_interval;
5257 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
5258 arvif->beacon_interval);
5259 ath10k_dbg(ar, ATH10K_DBG_MAC,
5260 "mac vdev %d beacon_interval %d\n",
5261 arvif->vdev_id, arvif->beacon_interval);
5264 ath10k_warn(ar, "failed to set beacon interval for vdev %d: %i\n",
5265 arvif->vdev_id, ret);
5268 if (changed & BSS_CHANGED_BEACON) {
5269 ath10k_dbg(ar, ATH10K_DBG_MAC,
5270 "vdev %d set beacon tx mode to staggered\n",
5273 pdev_param = ar->wmi.pdev_param->beacon_tx_mode;
5274 ret = ath10k_wmi_pdev_set_param(ar, pdev_param,
5275 WMI_BEACON_STAGGERED_MODE);
5277 ath10k_warn(ar, "failed to set beacon mode for vdev %d: %i\n",
5278 arvif->vdev_id, ret);
5280 ret = ath10k_mac_setup_bcn_tmpl(arvif);
5282 ath10k_warn(ar, "failed to update beacon template: %d\n",
5285 if (ieee80211_vif_is_mesh(vif)) {
5286 /* mesh doesn't use SSID but firmware needs it */
5287 strncpy(arvif->u.ap.ssid, "mesh",
5288 sizeof(arvif->u.ap.ssid));
5289 arvif->u.ap.ssid_len = 4;
5293 if (changed & BSS_CHANGED_AP_PROBE_RESP) {
5294 ret = ath10k_mac_setup_prb_tmpl(arvif);
5296 ath10k_warn(ar, "failed to setup probe resp template on vdev %i: %d\n",
5297 arvif->vdev_id, ret);
5300 if (changed & (BSS_CHANGED_BEACON_INFO | BSS_CHANGED_BEACON)) {
5301 arvif->dtim_period = info->dtim_period;
5303 ath10k_dbg(ar, ATH10K_DBG_MAC,
5304 "mac vdev %d dtim_period %d\n",
5305 arvif->vdev_id, arvif->dtim_period);
5307 vdev_param = ar->wmi.vdev_param->dtim_period;
5308 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
5309 arvif->dtim_period);
5311 ath10k_warn(ar, "failed to set dtim period for vdev %d: %i\n",
5312 arvif->vdev_id, ret);
5315 if (changed & BSS_CHANGED_SSID &&
5316 vif->type == NL80211_IFTYPE_AP) {
5317 arvif->u.ap.ssid_len = info->ssid_len;
5319 memcpy(arvif->u.ap.ssid, info->ssid, info->ssid_len);
5320 arvif->u.ap.hidden_ssid = info->hidden_ssid;
5323 if (changed & BSS_CHANGED_BSSID && !is_zero_ether_addr(info->bssid))
5324 ether_addr_copy(arvif->bssid, info->bssid);
5326 if (changed & BSS_CHANGED_BEACON_ENABLED)
5327 ath10k_control_beaconing(arvif, info);
5329 if (changed & BSS_CHANGED_ERP_CTS_PROT) {
5330 arvif->use_cts_prot = info->use_cts_prot;
5331 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d cts_prot %d\n",
5332 arvif->vdev_id, info->use_cts_prot);
5334 ret = ath10k_recalc_rtscts_prot(arvif);
5336 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
5337 arvif->vdev_id, ret);
5339 vdev_param = ar->wmi.vdev_param->protection_mode;
5340 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
5341 info->use_cts_prot ? 1 : 0);
5343 ath10k_warn(ar, "failed to set protection mode %d on vdev %i: %d\n",
5344 info->use_cts_prot, arvif->vdev_id, ret);
5347 if (changed & BSS_CHANGED_ERP_SLOT) {
5348 if (info->use_short_slot)
5349 slottime = WMI_VDEV_SLOT_TIME_SHORT; /* 9us */
5352 slottime = WMI_VDEV_SLOT_TIME_LONG; /* 20us */
5354 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d slot_time %d\n",
5355 arvif->vdev_id, slottime);
5357 vdev_param = ar->wmi.vdev_param->slot_time;
5358 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
5361 ath10k_warn(ar, "failed to set erp slot for vdev %d: %i\n",
5362 arvif->vdev_id, ret);
5365 if (changed & BSS_CHANGED_ERP_PREAMBLE) {
5366 if (info->use_short_preamble)
5367 preamble = WMI_VDEV_PREAMBLE_SHORT;
5369 preamble = WMI_VDEV_PREAMBLE_LONG;
5371 ath10k_dbg(ar, ATH10K_DBG_MAC,
5372 "mac vdev %d preamble %dn",
5373 arvif->vdev_id, preamble);
5375 vdev_param = ar->wmi.vdev_param->preamble;
5376 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
5379 ath10k_warn(ar, "failed to set preamble for vdev %d: %i\n",
5380 arvif->vdev_id, ret);
5383 if (changed & BSS_CHANGED_ASSOC) {
5385 /* Workaround: Make sure monitor vdev is not running
5386 * when associating to prevent some firmware revisions
5387 * (e.g. 10.1 and 10.2) from crashing.
5389 if (ar->monitor_started)
5390 ath10k_monitor_stop(ar);
5391 ath10k_bss_assoc(hw, vif, info);
5392 ath10k_monitor_recalc(ar);
5394 ath10k_bss_disassoc(hw, vif);
5398 if (changed & BSS_CHANGED_TXPOWER) {
5399 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev_id %i txpower %d\n",
5400 arvif->vdev_id, info->txpower);
5402 arvif->txpower = info->txpower;
5403 ret = ath10k_mac_txpower_recalc(ar);
5405 ath10k_warn(ar, "failed to recalc tx power: %d\n", ret);
5408 if (changed & BSS_CHANGED_PS) {
5409 arvif->ps = vif->bss_conf.ps;
5411 ret = ath10k_config_ps(ar);
5413 ath10k_warn(ar, "failed to setup ps on vdev %i: %d\n",
5414 arvif->vdev_id, ret);
5417 mutex_unlock(&ar->conf_mutex);
5420 static void ath10k_mac_op_set_coverage_class(struct ieee80211_hw *hw, s16 value)
5422 struct ath10k *ar = hw->priv;
5424 /* This function should never be called if setting the coverage class
5425 * is not supported on this hardware.
5427 if (!ar->hw_params.hw_ops->set_coverage_class) {
5431 ar->hw_params.hw_ops->set_coverage_class(ar, value);
5434 static int ath10k_hw_scan(struct ieee80211_hw *hw,
5435 struct ieee80211_vif *vif,
5436 struct ieee80211_scan_request *hw_req)
5438 struct ath10k *ar = hw->priv;
5439 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
5440 struct cfg80211_scan_request *req = &hw_req->req;
5441 struct wmi_start_scan_arg arg;
5445 mutex_lock(&ar->conf_mutex);
5447 spin_lock_bh(&ar->data_lock);
5448 switch (ar->scan.state) {
5449 case ATH10K_SCAN_IDLE:
5450 reinit_completion(&ar->scan.started);
5451 reinit_completion(&ar->scan.completed);
5452 ar->scan.state = ATH10K_SCAN_STARTING;
5453 ar->scan.is_roc = false;
5454 ar->scan.vdev_id = arvif->vdev_id;
5457 case ATH10K_SCAN_STARTING:
5458 case ATH10K_SCAN_RUNNING:
5459 case ATH10K_SCAN_ABORTING:
5463 spin_unlock_bh(&ar->data_lock);
5468 memset(&arg, 0, sizeof(arg));
5469 ath10k_wmi_start_scan_init(ar, &arg);
5470 arg.vdev_id = arvif->vdev_id;
5471 arg.scan_id = ATH10K_SCAN_ID;
5474 arg.ie_len = req->ie_len;
5475 memcpy(arg.ie, req->ie, arg.ie_len);
5479 arg.n_ssids = req->n_ssids;
5480 for (i = 0; i < arg.n_ssids; i++) {
5481 arg.ssids[i].len = req->ssids[i].ssid_len;
5482 arg.ssids[i].ssid = req->ssids[i].ssid;
5485 arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
5488 if (req->n_channels) {
5489 arg.n_channels = req->n_channels;
5490 for (i = 0; i < arg.n_channels; i++)
5491 arg.channels[i] = req->channels[i]->center_freq;
5494 ret = ath10k_start_scan(ar, &arg);
5496 ath10k_warn(ar, "failed to start hw scan: %d\n", ret);
5497 spin_lock_bh(&ar->data_lock);
5498 ar->scan.state = ATH10K_SCAN_IDLE;
5499 spin_unlock_bh(&ar->data_lock);
5502 /* Add a 200ms margin to account for event/command processing */
5503 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
5504 msecs_to_jiffies(arg.max_scan_time +
5508 mutex_unlock(&ar->conf_mutex);
5512 static void ath10k_cancel_hw_scan(struct ieee80211_hw *hw,
5513 struct ieee80211_vif *vif)
5515 struct ath10k *ar = hw->priv;
5517 mutex_lock(&ar->conf_mutex);
5518 ath10k_scan_abort(ar);
5519 mutex_unlock(&ar->conf_mutex);
5521 cancel_delayed_work_sync(&ar->scan.timeout);
5524 static void ath10k_set_key_h_def_keyidx(struct ath10k *ar,
5525 struct ath10k_vif *arvif,
5526 enum set_key_cmd cmd,
5527 struct ieee80211_key_conf *key)
5529 u32 vdev_param = arvif->ar->wmi.vdev_param->def_keyid;
5532 /* 10.1 firmware branch requires default key index to be set to group
5533 * key index after installing it. Otherwise FW/HW Txes corrupted
5534 * frames with multi-vif APs. This is not required for main firmware
5535 * branch (e.g. 636).
5537 * This is also needed for 636 fw for IBSS-RSN to work more reliably.
5539 * FIXME: It remains unknown if this is required for multi-vif STA
5540 * interfaces on 10.1.
5543 if (arvif->vdev_type != WMI_VDEV_TYPE_AP &&
5544 arvif->vdev_type != WMI_VDEV_TYPE_IBSS)
5547 if (key->cipher == WLAN_CIPHER_SUITE_WEP40)
5550 if (key->cipher == WLAN_CIPHER_SUITE_WEP104)
5553 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
5559 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
5562 ath10k_warn(ar, "failed to set vdev %i group key as default key: %d\n",
5563 arvif->vdev_id, ret);
5566 static int ath10k_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
5567 struct ieee80211_vif *vif, struct ieee80211_sta *sta,
5568 struct ieee80211_key_conf *key)
5570 struct ath10k *ar = hw->priv;
5571 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
5572 struct ath10k_peer *peer;
5573 const u8 *peer_addr;
5574 bool is_wep = key->cipher == WLAN_CIPHER_SUITE_WEP40 ||
5575 key->cipher == WLAN_CIPHER_SUITE_WEP104;
5581 /* this one needs to be done in software */
5582 if (key->cipher == WLAN_CIPHER_SUITE_AES_CMAC)
5585 if (arvif->nohwcrypt)
5588 if (key->keyidx > WMI_MAX_KEY_INDEX)
5591 mutex_lock(&ar->conf_mutex);
5594 peer_addr = sta->addr;
5595 else if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
5596 peer_addr = vif->bss_conf.bssid;
5598 peer_addr = vif->addr;
5600 key->hw_key_idx = key->keyidx;
5604 arvif->wep_keys[key->keyidx] = key;
5606 arvif->wep_keys[key->keyidx] = NULL;
5609 /* the peer should not disappear in mid-way (unless FW goes awry) since
5610 * we already hold conf_mutex. we just make sure its there now. */
5611 spin_lock_bh(&ar->data_lock);
5612 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
5613 spin_unlock_bh(&ar->data_lock);
5616 if (cmd == SET_KEY) {
5617 ath10k_warn(ar, "failed to install key for non-existent peer %pM\n",
5622 /* if the peer doesn't exist there is no key to disable
5628 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
5629 flags |= WMI_KEY_PAIRWISE;
5631 flags |= WMI_KEY_GROUP;
5634 if (cmd == DISABLE_KEY)
5635 ath10k_clear_vdev_key(arvif, key);
5637 /* When WEP keys are uploaded it's possible that there are
5638 * stations associated already (e.g. when merging) without any
5639 * keys. Static WEP needs an explicit per-peer key upload.
5641 if (vif->type == NL80211_IFTYPE_ADHOC &&
5643 ath10k_mac_vif_update_wep_key(arvif, key);
5645 /* 802.1x never sets the def_wep_key_idx so each set_key()
5646 * call changes default tx key.
5648 * Static WEP sets def_wep_key_idx via .set_default_unicast_key
5649 * after first set_key().
5651 if (cmd == SET_KEY && arvif->def_wep_key_idx == -1)
5652 flags |= WMI_KEY_TX_USAGE;
5655 ret = ath10k_install_key(arvif, key, cmd, peer_addr, flags);
5658 ath10k_warn(ar, "failed to install key for vdev %i peer %pM: %d\n",
5659 arvif->vdev_id, peer_addr, ret);
5663 /* mac80211 sets static WEP keys as groupwise while firmware requires
5664 * them to be installed twice as both pairwise and groupwise.
5666 if (is_wep && !sta && vif->type == NL80211_IFTYPE_STATION) {
5668 flags2 &= ~WMI_KEY_GROUP;
5669 flags2 |= WMI_KEY_PAIRWISE;
5671 ret = ath10k_install_key(arvif, key, cmd, peer_addr, flags2);
5674 ath10k_warn(ar, "failed to install (ucast) key for vdev %i peer %pM: %d\n",
5675 arvif->vdev_id, peer_addr, ret);
5676 ret2 = ath10k_install_key(arvif, key, DISABLE_KEY,
5680 ath10k_warn(ar, "failed to disable (mcast) key for vdev %i peer %pM: %d\n",
5681 arvif->vdev_id, peer_addr, ret2);
5687 ath10k_set_key_h_def_keyidx(ar, arvif, cmd, key);
5689 spin_lock_bh(&ar->data_lock);
5690 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
5691 if (peer && cmd == SET_KEY)
5692 peer->keys[key->keyidx] = key;
5693 else if (peer && cmd == DISABLE_KEY)
5694 peer->keys[key->keyidx] = NULL;
5695 else if (peer == NULL)
5696 /* impossible unless FW goes crazy */
5697 ath10k_warn(ar, "Peer %pM disappeared!\n", peer_addr);
5698 spin_unlock_bh(&ar->data_lock);
5701 mutex_unlock(&ar->conf_mutex);
5705 static void ath10k_set_default_unicast_key(struct ieee80211_hw *hw,
5706 struct ieee80211_vif *vif,
5709 struct ath10k *ar = hw->priv;
5710 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
5713 mutex_lock(&arvif->ar->conf_mutex);
5715 if (arvif->ar->state != ATH10K_STATE_ON)
5718 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d set keyidx %d\n",
5719 arvif->vdev_id, keyidx);
5721 ret = ath10k_wmi_vdev_set_param(arvif->ar,
5723 arvif->ar->wmi.vdev_param->def_keyid,
5727 ath10k_warn(ar, "failed to update wep key index for vdev %d: %d\n",
5733 arvif->def_wep_key_idx = keyidx;
5736 mutex_unlock(&arvif->ar->conf_mutex);
5739 static void ath10k_sta_rc_update_wk(struct work_struct *wk)
5742 struct ath10k_vif *arvif;
5743 struct ath10k_sta *arsta;
5744 struct ieee80211_sta *sta;
5745 struct cfg80211_chan_def def;
5746 enum nl80211_band band;
5747 const u8 *ht_mcs_mask;
5748 const u16 *vht_mcs_mask;
5749 u32 changed, bw, nss, smps;
5752 arsta = container_of(wk, struct ath10k_sta, update_wk);
5753 sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv);
5754 arvif = arsta->arvif;
5757 if (WARN_ON(ath10k_mac_vif_chan(arvif->vif, &def)))
5760 band = def.chan->band;
5761 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
5762 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
5764 spin_lock_bh(&ar->data_lock);
5766 changed = arsta->changed;
5773 spin_unlock_bh(&ar->data_lock);
5775 mutex_lock(&ar->conf_mutex);
5777 nss = max_t(u32, 1, nss);
5778 nss = min(nss, max(ath10k_mac_max_ht_nss(ht_mcs_mask),
5779 ath10k_mac_max_vht_nss(vht_mcs_mask)));
5781 if (changed & IEEE80211_RC_BW_CHANGED) {
5782 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM peer bw %d\n",
5785 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
5786 WMI_PEER_CHAN_WIDTH, bw);
5788 ath10k_warn(ar, "failed to update STA %pM peer bw %d: %d\n",
5789 sta->addr, bw, err);
5792 if (changed & IEEE80211_RC_NSS_CHANGED) {
5793 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM nss %d\n",
5796 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
5799 ath10k_warn(ar, "failed to update STA %pM nss %d: %d\n",
5800 sta->addr, nss, err);
5803 if (changed & IEEE80211_RC_SMPS_CHANGED) {
5804 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM smps %d\n",
5807 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
5808 WMI_PEER_SMPS_STATE, smps);
5810 ath10k_warn(ar, "failed to update STA %pM smps %d: %d\n",
5811 sta->addr, smps, err);
5814 if (changed & IEEE80211_RC_SUPP_RATES_CHANGED ||
5815 changed & IEEE80211_RC_NSS_CHANGED) {
5816 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM supp rates/nss\n",
5819 err = ath10k_station_assoc(ar, arvif->vif, sta, true);
5821 ath10k_warn(ar, "failed to reassociate station: %pM\n",
5825 mutex_unlock(&ar->conf_mutex);
5828 static int ath10k_mac_inc_num_stations(struct ath10k_vif *arvif,
5829 struct ieee80211_sta *sta)
5831 struct ath10k *ar = arvif->ar;
5833 lockdep_assert_held(&ar->conf_mutex);
5835 if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
5838 if (ar->num_stations >= ar->max_num_stations)
5846 static void ath10k_mac_dec_num_stations(struct ath10k_vif *arvif,
5847 struct ieee80211_sta *sta)
5849 struct ath10k *ar = arvif->ar;
5851 lockdep_assert_held(&ar->conf_mutex);
5853 if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
5859 struct ath10k_mac_tdls_iter_data {
5860 u32 num_tdls_stations;
5861 struct ieee80211_vif *curr_vif;
5864 static void ath10k_mac_tdls_vif_stations_count_iter(void *data,
5865 struct ieee80211_sta *sta)
5867 struct ath10k_mac_tdls_iter_data *iter_data = data;
5868 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
5869 struct ieee80211_vif *sta_vif = arsta->arvif->vif;
5871 if (sta->tdls && sta_vif == iter_data->curr_vif)
5872 iter_data->num_tdls_stations++;
5875 static int ath10k_mac_tdls_vif_stations_count(struct ieee80211_hw *hw,
5876 struct ieee80211_vif *vif)
5878 struct ath10k_mac_tdls_iter_data data = {};
5880 data.curr_vif = vif;
5882 ieee80211_iterate_stations_atomic(hw,
5883 ath10k_mac_tdls_vif_stations_count_iter,
5885 return data.num_tdls_stations;
5888 static void ath10k_mac_tdls_vifs_count_iter(void *data, u8 *mac,
5889 struct ieee80211_vif *vif)
5891 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
5892 int *num_tdls_vifs = data;
5894 if (vif->type != NL80211_IFTYPE_STATION)
5897 if (ath10k_mac_tdls_vif_stations_count(arvif->ar->hw, vif) > 0)
5901 static int ath10k_mac_tdls_vifs_count(struct ieee80211_hw *hw)
5903 int num_tdls_vifs = 0;
5905 ieee80211_iterate_active_interfaces_atomic(hw,
5906 IEEE80211_IFACE_ITER_NORMAL,
5907 ath10k_mac_tdls_vifs_count_iter,
5909 return num_tdls_vifs;
5912 static int ath10k_sta_state(struct ieee80211_hw *hw,
5913 struct ieee80211_vif *vif,
5914 struct ieee80211_sta *sta,
5915 enum ieee80211_sta_state old_state,
5916 enum ieee80211_sta_state new_state)
5918 struct ath10k *ar = hw->priv;
5919 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
5920 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
5921 struct ath10k_peer *peer;
5925 if (old_state == IEEE80211_STA_NOTEXIST &&
5926 new_state == IEEE80211_STA_NONE) {
5927 memset(arsta, 0, sizeof(*arsta));
5928 arsta->arvif = arvif;
5929 INIT_WORK(&arsta->update_wk, ath10k_sta_rc_update_wk);
5931 for (i = 0; i < ARRAY_SIZE(sta->txq); i++)
5932 ath10k_mac_txq_init(sta->txq[i]);
5935 /* cancel must be done outside the mutex to avoid deadlock */
5936 if ((old_state == IEEE80211_STA_NONE &&
5937 new_state == IEEE80211_STA_NOTEXIST))
5938 cancel_work_sync(&arsta->update_wk);
5940 mutex_lock(&ar->conf_mutex);
5942 if (old_state == IEEE80211_STA_NOTEXIST &&
5943 new_state == IEEE80211_STA_NONE) {
5945 * New station addition.
5947 enum wmi_peer_type peer_type = WMI_PEER_TYPE_DEFAULT;
5948 u32 num_tdls_stations;
5951 ath10k_dbg(ar, ATH10K_DBG_MAC,
5952 "mac vdev %d peer create %pM (new sta) sta %d / %d peer %d / %d\n",
5953 arvif->vdev_id, sta->addr,
5954 ar->num_stations + 1, ar->max_num_stations,
5955 ar->num_peers + 1, ar->max_num_peers);
5957 ret = ath10k_mac_inc_num_stations(arvif, sta);
5959 ath10k_warn(ar, "refusing to associate station: too many connected already (%d)\n",
5960 ar->max_num_stations);
5965 peer_type = WMI_PEER_TYPE_TDLS;
5967 ret = ath10k_peer_create(ar, vif, sta, arvif->vdev_id,
5968 sta->addr, peer_type);
5970 ath10k_warn(ar, "failed to add peer %pM for vdev %d when adding a new sta: %i\n",
5971 sta->addr, arvif->vdev_id, ret);
5972 ath10k_mac_dec_num_stations(arvif, sta);
5976 spin_lock_bh(&ar->data_lock);
5978 peer = ath10k_peer_find(ar, arvif->vdev_id, sta->addr);
5980 ath10k_warn(ar, "failed to lookup peer %pM on vdev %i\n",
5981 vif->addr, arvif->vdev_id);
5982 spin_unlock_bh(&ar->data_lock);
5983 ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
5984 ath10k_mac_dec_num_stations(arvif, sta);
5989 arsta->peer_id = find_first_bit(peer->peer_ids,
5990 ATH10K_MAX_NUM_PEER_IDS);
5992 spin_unlock_bh(&ar->data_lock);
5997 num_tdls_stations = ath10k_mac_tdls_vif_stations_count(hw, vif);
5998 num_tdls_vifs = ath10k_mac_tdls_vifs_count(hw);
6000 if (num_tdls_vifs >= ar->max_num_tdls_vdevs &&
6001 num_tdls_stations == 0) {
6002 ath10k_warn(ar, "vdev %i exceeded maximum number of tdls vdevs %i\n",
6003 arvif->vdev_id, ar->max_num_tdls_vdevs);
6004 ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
6005 ath10k_mac_dec_num_stations(arvif, sta);
6010 if (num_tdls_stations == 0) {
6011 /* This is the first tdls peer in current vif */
6012 enum wmi_tdls_state state = WMI_TDLS_ENABLE_ACTIVE;
6014 ret = ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id,
6017 ath10k_warn(ar, "failed to update fw tdls state on vdev %i: %i\n",
6018 arvif->vdev_id, ret);
6019 ath10k_peer_delete(ar, arvif->vdev_id,
6021 ath10k_mac_dec_num_stations(arvif, sta);
6026 ret = ath10k_mac_tdls_peer_update(ar, arvif->vdev_id, sta,
6027 WMI_TDLS_PEER_STATE_PEERING);
6030 "failed to update tdls peer %pM for vdev %d when adding a new sta: %i\n",
6031 sta->addr, arvif->vdev_id, ret);
6032 ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
6033 ath10k_mac_dec_num_stations(arvif, sta);
6035 if (num_tdls_stations != 0)
6037 ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id,
6040 } else if ((old_state == IEEE80211_STA_NONE &&
6041 new_state == IEEE80211_STA_NOTEXIST)) {
6043 * Existing station deletion.
6045 ath10k_dbg(ar, ATH10K_DBG_MAC,
6046 "mac vdev %d peer delete %pM sta %pK (sta gone)\n",
6047 arvif->vdev_id, sta->addr, sta);
6049 ret = ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
6051 ath10k_warn(ar, "failed to delete peer %pM for vdev %d: %i\n",
6052 sta->addr, arvif->vdev_id, ret);
6054 ath10k_mac_dec_num_stations(arvif, sta);
6056 spin_lock_bh(&ar->data_lock);
6057 for (i = 0; i < ARRAY_SIZE(ar->peer_map); i++) {
6058 peer = ar->peer_map[i];
6062 if (peer->sta == sta) {
6063 ath10k_warn(ar, "found sta peer %pM (ptr %pK id %d) entry on vdev %i after it was supposedly removed\n",
6064 sta->addr, peer, i, arvif->vdev_id);
6067 /* Clean up the peer object as well since we
6068 * must have failed to do this above.
6070 list_del(&peer->list);
6071 ar->peer_map[i] = NULL;
6076 spin_unlock_bh(&ar->data_lock);
6078 for (i = 0; i < ARRAY_SIZE(sta->txq); i++)
6079 ath10k_mac_txq_unref(ar, sta->txq[i]);
6084 if (ath10k_mac_tdls_vif_stations_count(hw, vif))
6087 /* This was the last tdls peer in current vif */
6088 ret = ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id,
6091 ath10k_warn(ar, "failed to update fw tdls state on vdev %i: %i\n",
6092 arvif->vdev_id, ret);
6094 } else if (old_state == IEEE80211_STA_AUTH &&
6095 new_state == IEEE80211_STA_ASSOC &&
6096 (vif->type == NL80211_IFTYPE_AP ||
6097 vif->type == NL80211_IFTYPE_MESH_POINT ||
6098 vif->type == NL80211_IFTYPE_ADHOC)) {
6102 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac sta %pM associated\n",
6105 ret = ath10k_station_assoc(ar, vif, sta, false);
6107 ath10k_warn(ar, "failed to associate station %pM for vdev %i: %i\n",
6108 sta->addr, arvif->vdev_id, ret);
6109 } else if (old_state == IEEE80211_STA_ASSOC &&
6110 new_state == IEEE80211_STA_AUTHORIZED &&
6113 * Tdls station authorized.
6115 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac tdls sta %pM authorized\n",
6118 ret = ath10k_station_assoc(ar, vif, sta, false);
6120 ath10k_warn(ar, "failed to associate tdls station %pM for vdev %i: %i\n",
6121 sta->addr, arvif->vdev_id, ret);
6125 ret = ath10k_mac_tdls_peer_update(ar, arvif->vdev_id, sta,
6126 WMI_TDLS_PEER_STATE_CONNECTED);
6128 ath10k_warn(ar, "failed to update tdls peer %pM for vdev %i: %i\n",
6129 sta->addr, arvif->vdev_id, ret);
6130 } else if (old_state == IEEE80211_STA_ASSOC &&
6131 new_state == IEEE80211_STA_AUTH &&
6132 (vif->type == NL80211_IFTYPE_AP ||
6133 vif->type == NL80211_IFTYPE_MESH_POINT ||
6134 vif->type == NL80211_IFTYPE_ADHOC)) {
6138 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac sta %pM disassociated\n",
6141 ret = ath10k_station_disassoc(ar, vif, sta);
6143 ath10k_warn(ar, "failed to disassociate station: %pM vdev %i: %i\n",
6144 sta->addr, arvif->vdev_id, ret);
6147 mutex_unlock(&ar->conf_mutex);
6151 static int ath10k_conf_tx_uapsd(struct ath10k *ar, struct ieee80211_vif *vif,
6152 u16 ac, bool enable)
6154 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
6155 struct wmi_sta_uapsd_auto_trig_arg arg = {};
6156 u32 prio = 0, acc = 0;
6160 lockdep_assert_held(&ar->conf_mutex);
6162 if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
6166 case IEEE80211_AC_VO:
6167 value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN |
6168 WMI_STA_PS_UAPSD_AC3_TRIGGER_EN;
6172 case IEEE80211_AC_VI:
6173 value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN |
6174 WMI_STA_PS_UAPSD_AC2_TRIGGER_EN;
6178 case IEEE80211_AC_BE:
6179 value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN |
6180 WMI_STA_PS_UAPSD_AC1_TRIGGER_EN;
6184 case IEEE80211_AC_BK:
6185 value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN |
6186 WMI_STA_PS_UAPSD_AC0_TRIGGER_EN;
6193 arvif->u.sta.uapsd |= value;
6195 arvif->u.sta.uapsd &= ~value;
6197 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
6198 WMI_STA_PS_PARAM_UAPSD,
6199 arvif->u.sta.uapsd);
6201 ath10k_warn(ar, "failed to set uapsd params: %d\n", ret);
6205 if (arvif->u.sta.uapsd)
6206 value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD;
6208 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
6210 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
6211 WMI_STA_PS_PARAM_RX_WAKE_POLICY,
6214 ath10k_warn(ar, "failed to set rx wake param: %d\n", ret);
6216 ret = ath10k_mac_vif_recalc_ps_wake_threshold(arvif);
6218 ath10k_warn(ar, "failed to recalc ps wake threshold on vdev %i: %d\n",
6219 arvif->vdev_id, ret);
6223 ret = ath10k_mac_vif_recalc_ps_poll_count(arvif);
6225 ath10k_warn(ar, "failed to recalc ps poll count on vdev %i: %d\n",
6226 arvif->vdev_id, ret);
6230 if (test_bit(WMI_SERVICE_STA_UAPSD_BASIC_AUTO_TRIG, ar->wmi.svc_map) ||
6231 test_bit(WMI_SERVICE_STA_UAPSD_VAR_AUTO_TRIG, ar->wmi.svc_map)) {
6232 /* Only userspace can make an educated decision when to send
6233 * trigger frame. The following effectively disables u-UAPSD
6234 * autotrigger in firmware (which is enabled by default
6235 * provided the autotrigger service is available).
6239 arg.user_priority = prio;
6240 arg.service_interval = 0;
6241 arg.suspend_interval = WMI_STA_UAPSD_MAX_INTERVAL_MSEC;
6242 arg.delay_interval = WMI_STA_UAPSD_MAX_INTERVAL_MSEC;
6244 ret = ath10k_wmi_vdev_sta_uapsd(ar, arvif->vdev_id,
6245 arvif->bssid, &arg, 1);
6247 ath10k_warn(ar, "failed to set uapsd auto trigger %d\n",
6257 static int ath10k_conf_tx(struct ieee80211_hw *hw,
6258 struct ieee80211_vif *vif, u16 ac,
6259 const struct ieee80211_tx_queue_params *params)
6261 struct ath10k *ar = hw->priv;
6262 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
6263 struct wmi_wmm_params_arg *p = NULL;
6266 mutex_lock(&ar->conf_mutex);
6269 case IEEE80211_AC_VO:
6270 p = &arvif->wmm_params.ac_vo;
6272 case IEEE80211_AC_VI:
6273 p = &arvif->wmm_params.ac_vi;
6275 case IEEE80211_AC_BE:
6276 p = &arvif->wmm_params.ac_be;
6278 case IEEE80211_AC_BK:
6279 p = &arvif->wmm_params.ac_bk;
6288 p->cwmin = params->cw_min;
6289 p->cwmax = params->cw_max;
6290 p->aifs = params->aifs;
6293 * The channel time duration programmed in the HW is in absolute
6294 * microseconds, while mac80211 gives the txop in units of
6297 p->txop = params->txop * 32;
6299 if (ar->wmi.ops->gen_vdev_wmm_conf) {
6300 ret = ath10k_wmi_vdev_wmm_conf(ar, arvif->vdev_id,
6301 &arvif->wmm_params);
6303 ath10k_warn(ar, "failed to set vdev wmm params on vdev %i: %d\n",
6304 arvif->vdev_id, ret);
6308 /* This won't work well with multi-interface cases but it's
6309 * better than nothing.
6311 ret = ath10k_wmi_pdev_set_wmm_params(ar, &arvif->wmm_params);
6313 ath10k_warn(ar, "failed to set wmm params: %d\n", ret);
6318 ret = ath10k_conf_tx_uapsd(ar, vif, ac, params->uapsd);
6320 ath10k_warn(ar, "failed to set sta uapsd: %d\n", ret);
6323 mutex_unlock(&ar->conf_mutex);
6327 #define ATH10K_ROC_TIMEOUT_HZ (2 * HZ)
6329 static int ath10k_remain_on_channel(struct ieee80211_hw *hw,
6330 struct ieee80211_vif *vif,
6331 struct ieee80211_channel *chan,
6333 enum ieee80211_roc_type type)
6335 struct ath10k *ar = hw->priv;
6336 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
6337 struct wmi_start_scan_arg arg;
6341 mutex_lock(&ar->conf_mutex);
6343 spin_lock_bh(&ar->data_lock);
6344 switch (ar->scan.state) {
6345 case ATH10K_SCAN_IDLE:
6346 reinit_completion(&ar->scan.started);
6347 reinit_completion(&ar->scan.completed);
6348 reinit_completion(&ar->scan.on_channel);
6349 ar->scan.state = ATH10K_SCAN_STARTING;
6350 ar->scan.is_roc = true;
6351 ar->scan.vdev_id = arvif->vdev_id;
6352 ar->scan.roc_freq = chan->center_freq;
6353 ar->scan.roc_notify = true;
6356 case ATH10K_SCAN_STARTING:
6357 case ATH10K_SCAN_RUNNING:
6358 case ATH10K_SCAN_ABORTING:
6362 spin_unlock_bh(&ar->data_lock);
6367 scan_time_msec = ar->hw->wiphy->max_remain_on_channel_duration * 2;
6369 memset(&arg, 0, sizeof(arg));
6370 ath10k_wmi_start_scan_init(ar, &arg);
6371 arg.vdev_id = arvif->vdev_id;
6372 arg.scan_id = ATH10K_SCAN_ID;
6374 arg.channels[0] = chan->center_freq;
6375 arg.dwell_time_active = scan_time_msec;
6376 arg.dwell_time_passive = scan_time_msec;
6377 arg.max_scan_time = scan_time_msec;
6378 arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
6379 arg.scan_ctrl_flags |= WMI_SCAN_FILTER_PROBE_REQ;
6380 arg.burst_duration_ms = duration;
6382 ret = ath10k_start_scan(ar, &arg);
6384 ath10k_warn(ar, "failed to start roc scan: %d\n", ret);
6385 spin_lock_bh(&ar->data_lock);
6386 ar->scan.state = ATH10K_SCAN_IDLE;
6387 spin_unlock_bh(&ar->data_lock);
6391 ret = wait_for_completion_timeout(&ar->scan.on_channel, 3 * HZ);
6393 ath10k_warn(ar, "failed to switch to channel for roc scan\n");
6395 ret = ath10k_scan_stop(ar);
6397 ath10k_warn(ar, "failed to stop scan: %d\n", ret);
6403 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
6404 msecs_to_jiffies(duration));
6408 mutex_unlock(&ar->conf_mutex);
6412 static int ath10k_cancel_remain_on_channel(struct ieee80211_hw *hw)
6414 struct ath10k *ar = hw->priv;
6416 mutex_lock(&ar->conf_mutex);
6418 spin_lock_bh(&ar->data_lock);
6419 ar->scan.roc_notify = false;
6420 spin_unlock_bh(&ar->data_lock);
6422 ath10k_scan_abort(ar);
6424 mutex_unlock(&ar->conf_mutex);
6426 cancel_delayed_work_sync(&ar->scan.timeout);
6432 * Both RTS and Fragmentation threshold are interface-specific
6433 * in ath10k, but device-specific in mac80211.
6436 static int ath10k_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
6438 struct ath10k *ar = hw->priv;
6439 struct ath10k_vif *arvif;
6442 mutex_lock(&ar->conf_mutex);
6443 list_for_each_entry(arvif, &ar->arvifs, list) {
6444 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d rts threshold %d\n",
6445 arvif->vdev_id, value);
6447 ret = ath10k_mac_set_rts(arvif, value);
6449 ath10k_warn(ar, "failed to set rts threshold for vdev %d: %d\n",
6450 arvif->vdev_id, ret);
6454 mutex_unlock(&ar->conf_mutex);
6459 static int ath10k_mac_op_set_frag_threshold(struct ieee80211_hw *hw, u32 value)
6461 /* Even though there's a WMI enum for fragmentation threshold no known
6462 * firmware actually implements it. Moreover it is not possible to rely
6463 * frame fragmentation to mac80211 because firmware clears the "more
6464 * fragments" bit in frame control making it impossible for remote
6465 * devices to reassemble frames.
6467 * Hence implement a dummy callback just to say fragmentation isn't
6468 * supported. This effectively prevents mac80211 from doing frame
6469 * fragmentation in software.
6474 static void ath10k_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
6475 u32 queues, bool drop)
6477 struct ath10k *ar = hw->priv;
6481 /* mac80211 doesn't care if we really xmit queued frames or not
6482 * we'll collect those frames either way if we stop/delete vdevs */
6486 mutex_lock(&ar->conf_mutex);
6488 if (ar->state == ATH10K_STATE_WEDGED)
6491 time_left = wait_event_timeout(ar->htt.empty_tx_wq, ({
6494 spin_lock_bh(&ar->htt.tx_lock);
6495 empty = (ar->htt.num_pending_tx == 0);
6496 spin_unlock_bh(&ar->htt.tx_lock);
6498 skip = (ar->state == ATH10K_STATE_WEDGED) ||
6499 test_bit(ATH10K_FLAG_CRASH_FLUSH,
6503 }), ATH10K_FLUSH_TIMEOUT_HZ);
6505 if (time_left == 0 || skip)
6506 ath10k_warn(ar, "failed to flush transmit queue (skip %i ar-state %i): %ld\n",
6507 skip, ar->state, time_left);
6510 mutex_unlock(&ar->conf_mutex);
6513 /* TODO: Implement this function properly
6514 * For now it is needed to reply to Probe Requests in IBSS mode.
6515 * Propably we need this information from FW.
6517 static int ath10k_tx_last_beacon(struct ieee80211_hw *hw)
6522 static void ath10k_reconfig_complete(struct ieee80211_hw *hw,
6523 enum ieee80211_reconfig_type reconfig_type)
6525 struct ath10k *ar = hw->priv;
6527 if (reconfig_type != IEEE80211_RECONFIG_TYPE_RESTART)
6530 mutex_lock(&ar->conf_mutex);
6532 /* If device failed to restart it will be in a different state, e.g.
6533 * ATH10K_STATE_WEDGED */
6534 if (ar->state == ATH10K_STATE_RESTARTED) {
6535 ath10k_info(ar, "device successfully recovered\n");
6536 ar->state = ATH10K_STATE_ON;
6537 ieee80211_wake_queues(ar->hw);
6540 mutex_unlock(&ar->conf_mutex);
6544 ath10k_mac_update_bss_chan_survey(struct ath10k *ar,
6545 struct ieee80211_channel *channel)
6548 enum wmi_bss_survey_req_type type = WMI_BSS_SURVEY_REQ_TYPE_READ_CLEAR;
6550 lockdep_assert_held(&ar->conf_mutex);
6552 if (!test_bit(WMI_SERVICE_BSS_CHANNEL_INFO_64, ar->wmi.svc_map) ||
6553 (ar->rx_channel != channel))
6556 if (ar->scan.state != ATH10K_SCAN_IDLE) {
6557 ath10k_dbg(ar, ATH10K_DBG_MAC, "ignoring bss chan info request while scanning..\n");
6561 reinit_completion(&ar->bss_survey_done);
6563 ret = ath10k_wmi_pdev_bss_chan_info_request(ar, type);
6565 ath10k_warn(ar, "failed to send pdev bss chan info request\n");
6569 ret = wait_for_completion_timeout(&ar->bss_survey_done, 3 * HZ);
6571 ath10k_warn(ar, "bss channel survey timed out\n");
6576 static int ath10k_get_survey(struct ieee80211_hw *hw, int idx,
6577 struct survey_info *survey)
6579 struct ath10k *ar = hw->priv;
6580 struct ieee80211_supported_band *sband;
6581 struct survey_info *ar_survey = &ar->survey[idx];
6584 mutex_lock(&ar->conf_mutex);
6586 sband = hw->wiphy->bands[NL80211_BAND_2GHZ];
6587 if (sband && idx >= sband->n_channels) {
6588 idx -= sband->n_channels;
6593 sband = hw->wiphy->bands[NL80211_BAND_5GHZ];
6595 if (!sband || idx >= sband->n_channels) {
6600 ath10k_mac_update_bss_chan_survey(ar, &sband->channels[idx]);
6602 spin_lock_bh(&ar->data_lock);
6603 memcpy(survey, ar_survey, sizeof(*survey));
6604 spin_unlock_bh(&ar->data_lock);
6606 survey->channel = &sband->channels[idx];
6608 if (ar->rx_channel == survey->channel)
6609 survey->filled |= SURVEY_INFO_IN_USE;
6612 mutex_unlock(&ar->conf_mutex);
6617 ath10k_mac_bitrate_mask_has_single_rate(struct ath10k *ar,
6618 enum nl80211_band band,
6619 const struct cfg80211_bitrate_mask *mask)
6624 num_rates += hweight32(mask->control[band].legacy);
6626 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++)
6627 num_rates += hweight8(mask->control[band].ht_mcs[i]);
6629 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++)
6630 num_rates += hweight16(mask->control[band].vht_mcs[i]);
6632 return num_rates == 1;
6636 ath10k_mac_bitrate_mask_get_single_nss(struct ath10k *ar,
6637 enum nl80211_band band,
6638 const struct cfg80211_bitrate_mask *mask,
6641 struct ieee80211_supported_band *sband = &ar->mac.sbands[band];
6642 u16 vht_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
6644 u8 vht_nss_mask = 0;
6647 if (mask->control[band].legacy)
6650 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) {
6651 if (mask->control[band].ht_mcs[i] == 0)
6653 else if (mask->control[band].ht_mcs[i] ==
6654 sband->ht_cap.mcs.rx_mask[i])
6655 ht_nss_mask |= BIT(i);
6660 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
6661 if (mask->control[band].vht_mcs[i] == 0)
6663 else if (mask->control[band].vht_mcs[i] ==
6664 ath10k_mac_get_max_vht_mcs_map(vht_mcs_map, i))
6665 vht_nss_mask |= BIT(i);
6670 if (ht_nss_mask != vht_nss_mask)
6673 if (ht_nss_mask == 0)
6676 if (BIT(fls(ht_nss_mask)) - 1 != ht_nss_mask)
6679 *nss = fls(ht_nss_mask);
6685 ath10k_mac_bitrate_mask_get_single_rate(struct ath10k *ar,
6686 enum nl80211_band band,
6687 const struct cfg80211_bitrate_mask *mask,
6690 struct ieee80211_supported_band *sband = &ar->mac.sbands[band];
6697 if (hweight32(mask->control[band].legacy) == 1) {
6698 rate_idx = ffs(mask->control[band].legacy) - 1;
6700 hw_rate = sband->bitrates[rate_idx].hw_value;
6701 bitrate = sband->bitrates[rate_idx].bitrate;
6703 if (ath10k_mac_bitrate_is_cck(bitrate))
6704 preamble = WMI_RATE_PREAMBLE_CCK;
6706 preamble = WMI_RATE_PREAMBLE_OFDM;
6709 *rate = preamble << 6 |
6716 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) {
6717 if (hweight8(mask->control[band].ht_mcs[i]) == 1) {
6719 *rate = WMI_RATE_PREAMBLE_HT << 6 |
6721 (ffs(mask->control[band].ht_mcs[i]) - 1);
6727 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
6728 if (hweight16(mask->control[band].vht_mcs[i]) == 1) {
6730 *rate = WMI_RATE_PREAMBLE_VHT << 6 |
6732 (ffs(mask->control[band].vht_mcs[i]) - 1);
6741 static int ath10k_mac_set_fixed_rate_params(struct ath10k_vif *arvif,
6742 u8 rate, u8 nss, u8 sgi, u8 ldpc)
6744 struct ath10k *ar = arvif->ar;
6748 lockdep_assert_held(&ar->conf_mutex);
6750 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac set fixed rate params vdev %i rate 0x%02hhx nss %hhu sgi %hhu\n",
6751 arvif->vdev_id, rate, nss, sgi);
6753 vdev_param = ar->wmi.vdev_param->fixed_rate;
6754 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, rate);
6756 ath10k_warn(ar, "failed to set fixed rate param 0x%02x: %d\n",
6761 vdev_param = ar->wmi.vdev_param->nss;
6762 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, nss);
6764 ath10k_warn(ar, "failed to set nss param %d: %d\n", nss, ret);
6768 vdev_param = ar->wmi.vdev_param->sgi;
6769 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, sgi);
6771 ath10k_warn(ar, "failed to set sgi param %d: %d\n", sgi, ret);
6775 vdev_param = ar->wmi.vdev_param->ldpc;
6776 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, ldpc);
6778 ath10k_warn(ar, "failed to set ldpc param %d: %d\n", ldpc, ret);
6786 ath10k_mac_can_set_bitrate_mask(struct ath10k *ar,
6787 enum nl80211_band band,
6788 const struct cfg80211_bitrate_mask *mask)
6793 /* Due to firmware limitation in WMI_PEER_ASSOC_CMDID it is impossible
6794 * to express all VHT MCS rate masks. Effectively only the following
6795 * ranges can be used: none, 0-7, 0-8 and 0-9.
6797 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
6798 vht_mcs = mask->control[band].vht_mcs[i];
6807 ath10k_warn(ar, "refusing bitrate mask with missing 0-7 VHT MCS rates\n");
6815 static void ath10k_mac_set_bitrate_mask_iter(void *data,
6816 struct ieee80211_sta *sta)
6818 struct ath10k_vif *arvif = data;
6819 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
6820 struct ath10k *ar = arvif->ar;
6822 if (arsta->arvif != arvif)
6825 spin_lock_bh(&ar->data_lock);
6826 arsta->changed |= IEEE80211_RC_SUPP_RATES_CHANGED;
6827 spin_unlock_bh(&ar->data_lock);
6829 ieee80211_queue_work(ar->hw, &arsta->update_wk);
6832 static int ath10k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw,
6833 struct ieee80211_vif *vif,
6834 const struct cfg80211_bitrate_mask *mask)
6836 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
6837 struct cfg80211_chan_def def;
6838 struct ath10k *ar = arvif->ar;
6839 enum nl80211_band band;
6840 const u8 *ht_mcs_mask;
6841 const u16 *vht_mcs_mask;
6849 if (ath10k_mac_vif_chan(vif, &def))
6852 band = def.chan->band;
6853 ht_mcs_mask = mask->control[band].ht_mcs;
6854 vht_mcs_mask = mask->control[band].vht_mcs;
6855 ldpc = !!(ar->ht_cap_info & WMI_HT_CAP_LDPC);
6857 sgi = mask->control[band].gi;
6858 if (sgi == NL80211_TXRATE_FORCE_LGI)
6861 if (ath10k_mac_bitrate_mask_has_single_rate(ar, band, mask)) {
6862 ret = ath10k_mac_bitrate_mask_get_single_rate(ar, band, mask,
6865 ath10k_warn(ar, "failed to get single rate for vdev %i: %d\n",
6866 arvif->vdev_id, ret);
6869 } else if (ath10k_mac_bitrate_mask_get_single_nss(ar, band, mask,
6871 rate = WMI_FIXED_RATE_NONE;
6874 rate = WMI_FIXED_RATE_NONE;
6875 nss = min(ar->num_rf_chains,
6876 max(ath10k_mac_max_ht_nss(ht_mcs_mask),
6877 ath10k_mac_max_vht_nss(vht_mcs_mask)));
6879 if (!ath10k_mac_can_set_bitrate_mask(ar, band, mask))
6882 mutex_lock(&ar->conf_mutex);
6884 arvif->bitrate_mask = *mask;
6885 ieee80211_iterate_stations_atomic(ar->hw,
6886 ath10k_mac_set_bitrate_mask_iter,
6889 mutex_unlock(&ar->conf_mutex);
6892 mutex_lock(&ar->conf_mutex);
6894 ret = ath10k_mac_set_fixed_rate_params(arvif, rate, nss, sgi, ldpc);
6896 ath10k_warn(ar, "failed to set fixed rate params on vdev %i: %d\n",
6897 arvif->vdev_id, ret);
6902 mutex_unlock(&ar->conf_mutex);
6907 static void ath10k_sta_rc_update(struct ieee80211_hw *hw,
6908 struct ieee80211_vif *vif,
6909 struct ieee80211_sta *sta,
6912 struct ath10k *ar = hw->priv;
6913 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
6916 spin_lock_bh(&ar->data_lock);
6918 ath10k_dbg(ar, ATH10K_DBG_MAC,
6919 "mac sta rc update for %pM changed %08x bw %d nss %d smps %d\n",
6920 sta->addr, changed, sta->bandwidth, sta->rx_nss,
6923 if (changed & IEEE80211_RC_BW_CHANGED) {
6924 bw = WMI_PEER_CHWIDTH_20MHZ;
6926 switch (sta->bandwidth) {
6927 case IEEE80211_STA_RX_BW_20:
6928 bw = WMI_PEER_CHWIDTH_20MHZ;
6930 case IEEE80211_STA_RX_BW_40:
6931 bw = WMI_PEER_CHWIDTH_40MHZ;
6933 case IEEE80211_STA_RX_BW_80:
6934 bw = WMI_PEER_CHWIDTH_80MHZ;
6936 case IEEE80211_STA_RX_BW_160:
6937 ath10k_warn(ar, "Invalid bandwidth %d in rc update for %pM\n",
6938 sta->bandwidth, sta->addr);
6939 bw = WMI_PEER_CHWIDTH_20MHZ;
6946 if (changed & IEEE80211_RC_NSS_CHANGED)
6947 arsta->nss = sta->rx_nss;
6949 if (changed & IEEE80211_RC_SMPS_CHANGED) {
6950 smps = WMI_PEER_SMPS_PS_NONE;
6952 switch (sta->smps_mode) {
6953 case IEEE80211_SMPS_AUTOMATIC:
6954 case IEEE80211_SMPS_OFF:
6955 smps = WMI_PEER_SMPS_PS_NONE;
6957 case IEEE80211_SMPS_STATIC:
6958 smps = WMI_PEER_SMPS_STATIC;
6960 case IEEE80211_SMPS_DYNAMIC:
6961 smps = WMI_PEER_SMPS_DYNAMIC;
6963 case IEEE80211_SMPS_NUM_MODES:
6964 ath10k_warn(ar, "Invalid smps %d in sta rc update for %pM\n",
6965 sta->smps_mode, sta->addr);
6966 smps = WMI_PEER_SMPS_PS_NONE;
6973 arsta->changed |= changed;
6975 spin_unlock_bh(&ar->data_lock);
6977 ieee80211_queue_work(hw, &arsta->update_wk);
6980 static void ath10k_offset_tsf(struct ieee80211_hw *hw,
6981 struct ieee80211_vif *vif, s64 tsf_offset)
6983 struct ath10k *ar = hw->priv;
6984 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
6985 u32 offset, vdev_param;
6988 if (tsf_offset < 0) {
6989 vdev_param = ar->wmi.vdev_param->dec_tsf;
6990 offset = -tsf_offset;
6992 vdev_param = ar->wmi.vdev_param->inc_tsf;
6993 offset = tsf_offset;
6996 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
6997 vdev_param, offset);
6999 if (ret && ret != -EOPNOTSUPP)
7000 ath10k_warn(ar, "failed to set tsf offset %d cmd %d: %d\n",
7001 offset, vdev_param, ret);
7004 static int ath10k_ampdu_action(struct ieee80211_hw *hw,
7005 struct ieee80211_vif *vif,
7006 struct ieee80211_ampdu_params *params)
7008 struct ath10k *ar = hw->priv;
7009 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
7010 struct ieee80211_sta *sta = params->sta;
7011 enum ieee80211_ampdu_mlme_action action = params->action;
7012 u16 tid = params->tid;
7014 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac ampdu vdev_id %i sta %pM tid %hu action %d\n",
7015 arvif->vdev_id, sta->addr, tid, action);
7018 case IEEE80211_AMPDU_RX_START:
7019 case IEEE80211_AMPDU_RX_STOP:
7020 /* HTT AddBa/DelBa events trigger mac80211 Rx BA session
7021 * creation/removal. Do we need to verify this?
7024 case IEEE80211_AMPDU_TX_START:
7025 case IEEE80211_AMPDU_TX_STOP_CONT:
7026 case IEEE80211_AMPDU_TX_STOP_FLUSH:
7027 case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
7028 case IEEE80211_AMPDU_TX_OPERATIONAL:
7029 /* Firmware offloads Tx aggregation entirely so deny mac80211
7030 * Tx aggregation requests.
7039 ath10k_mac_update_rx_channel(struct ath10k *ar,
7040 struct ieee80211_chanctx_conf *ctx,
7041 struct ieee80211_vif_chanctx_switch *vifs,
7044 struct cfg80211_chan_def *def = NULL;
7046 /* Both locks are required because ar->rx_channel is modified. This
7047 * allows readers to hold either lock.
7049 lockdep_assert_held(&ar->conf_mutex);
7050 lockdep_assert_held(&ar->data_lock);
7052 WARN_ON(ctx && vifs);
7053 WARN_ON(vifs && n_vifs != 1);
7055 /* FIXME: Sort of an optimization and a workaround. Peers and vifs are
7056 * on a linked list now. Doing a lookup peer -> vif -> chanctx for each
7057 * ppdu on Rx may reduce performance on low-end systems. It should be
7058 * possible to make tables/hashmaps to speed the lookup up (be vary of
7059 * cpu data cache lines though regarding sizes) but to keep the initial
7060 * implementation simple and less intrusive fallback to the slow lookup
7061 * only for multi-channel cases. Single-channel cases will remain to
7062 * use the old channel derival and thus performance should not be
7066 if (!ctx && ath10k_mac_num_chanctxs(ar) == 1) {
7067 ieee80211_iter_chan_contexts_atomic(ar->hw,
7068 ath10k_mac_get_any_chandef_iter,
7072 def = &vifs[0].new_ctx->def;
7074 ar->rx_channel = def->chan;
7075 } else if ((ctx && ath10k_mac_num_chanctxs(ar) == 0) ||
7076 (ctx && (ar->state == ATH10K_STATE_RESTARTED))) {
7077 /* During driver restart due to firmware assert, since mac80211
7078 * already has valid channel context for given radio, channel
7079 * context iteration return num_chanctx > 0. So fix rx_channel
7080 * when restart is in progress.
7082 ar->rx_channel = ctx->def.chan;
7084 ar->rx_channel = NULL;
7090 ath10k_mac_update_vif_chan(struct ath10k *ar,
7091 struct ieee80211_vif_chanctx_switch *vifs,
7094 struct ath10k_vif *arvif;
7098 lockdep_assert_held(&ar->conf_mutex);
7100 /* First stop monitor interface. Some FW versions crash if there's a
7101 * lone monitor interface.
7103 if (ar->monitor_started)
7104 ath10k_monitor_stop(ar);
7106 for (i = 0; i < n_vifs; i++) {
7107 arvif = ath10k_vif_to_arvif(vifs[i].vif);
7109 ath10k_dbg(ar, ATH10K_DBG_MAC,
7110 "mac chanctx switch vdev_id %i freq %hu->%hu width %d->%d\n",
7112 vifs[i].old_ctx->def.chan->center_freq,
7113 vifs[i].new_ctx->def.chan->center_freq,
7114 vifs[i].old_ctx->def.width,
7115 vifs[i].new_ctx->def.width);
7117 if (WARN_ON(!arvif->is_started))
7120 if (WARN_ON(!arvif->is_up))
7123 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
7125 ath10k_warn(ar, "failed to down vdev %d: %d\n",
7126 arvif->vdev_id, ret);
7131 /* All relevant vdevs are downed and associated channel resources
7132 * should be available for the channel switch now.
7135 spin_lock_bh(&ar->data_lock);
7136 ath10k_mac_update_rx_channel(ar, NULL, vifs, n_vifs);
7137 spin_unlock_bh(&ar->data_lock);
7139 for (i = 0; i < n_vifs; i++) {
7140 arvif = ath10k_vif_to_arvif(vifs[i].vif);
7142 if (WARN_ON(!arvif->is_started))
7145 if (WARN_ON(!arvif->is_up))
7148 ret = ath10k_mac_setup_bcn_tmpl(arvif);
7150 ath10k_warn(ar, "failed to update bcn tmpl during csa: %d\n",
7153 ret = ath10k_mac_setup_prb_tmpl(arvif);
7155 ath10k_warn(ar, "failed to update prb tmpl during csa: %d\n",
7158 ret = ath10k_vdev_restart(arvif, &vifs[i].new_ctx->def);
7160 ath10k_warn(ar, "failed to restart vdev %d: %d\n",
7161 arvif->vdev_id, ret);
7165 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
7168 ath10k_warn(ar, "failed to bring vdev up %d: %d\n",
7169 arvif->vdev_id, ret);
7174 ath10k_monitor_recalc(ar);
7178 ath10k_mac_op_add_chanctx(struct ieee80211_hw *hw,
7179 struct ieee80211_chanctx_conf *ctx)
7181 struct ath10k *ar = hw->priv;
7183 ath10k_dbg(ar, ATH10K_DBG_MAC,
7184 "mac chanctx add freq %hu width %d ptr %pK\n",
7185 ctx->def.chan->center_freq, ctx->def.width, ctx);
7187 mutex_lock(&ar->conf_mutex);
7189 spin_lock_bh(&ar->data_lock);
7190 ath10k_mac_update_rx_channel(ar, ctx, NULL, 0);
7191 spin_unlock_bh(&ar->data_lock);
7193 ath10k_recalc_radar_detection(ar);
7194 ath10k_monitor_recalc(ar);
7196 mutex_unlock(&ar->conf_mutex);
7202 ath10k_mac_op_remove_chanctx(struct ieee80211_hw *hw,
7203 struct ieee80211_chanctx_conf *ctx)
7205 struct ath10k *ar = hw->priv;
7207 ath10k_dbg(ar, ATH10K_DBG_MAC,
7208 "mac chanctx remove freq %hu width %d ptr %pK\n",
7209 ctx->def.chan->center_freq, ctx->def.width, ctx);
7211 mutex_lock(&ar->conf_mutex);
7213 spin_lock_bh(&ar->data_lock);
7214 ath10k_mac_update_rx_channel(ar, NULL, NULL, 0);
7215 spin_unlock_bh(&ar->data_lock);
7217 ath10k_recalc_radar_detection(ar);
7218 ath10k_monitor_recalc(ar);
7220 mutex_unlock(&ar->conf_mutex);
7223 struct ath10k_mac_change_chanctx_arg {
7224 struct ieee80211_chanctx_conf *ctx;
7225 struct ieee80211_vif_chanctx_switch *vifs;
7231 ath10k_mac_change_chanctx_cnt_iter(void *data, u8 *mac,
7232 struct ieee80211_vif *vif)
7234 struct ath10k_mac_change_chanctx_arg *arg = data;
7236 if (rcu_access_pointer(vif->chanctx_conf) != arg->ctx)
7243 ath10k_mac_change_chanctx_fill_iter(void *data, u8 *mac,
7244 struct ieee80211_vif *vif)
7246 struct ath10k_mac_change_chanctx_arg *arg = data;
7247 struct ieee80211_chanctx_conf *ctx;
7249 ctx = rcu_access_pointer(vif->chanctx_conf);
7250 if (ctx != arg->ctx)
7253 if (WARN_ON(arg->next_vif == arg->n_vifs))
7256 arg->vifs[arg->next_vif].vif = vif;
7257 arg->vifs[arg->next_vif].old_ctx = ctx;
7258 arg->vifs[arg->next_vif].new_ctx = ctx;
7263 ath10k_mac_op_change_chanctx(struct ieee80211_hw *hw,
7264 struct ieee80211_chanctx_conf *ctx,
7267 struct ath10k *ar = hw->priv;
7268 struct ath10k_mac_change_chanctx_arg arg = { .ctx = ctx };
7270 mutex_lock(&ar->conf_mutex);
7272 ath10k_dbg(ar, ATH10K_DBG_MAC,
7273 "mac chanctx change freq %hu width %d ptr %pK changed %x\n",
7274 ctx->def.chan->center_freq, ctx->def.width, ctx, changed);
7276 /* This shouldn't really happen because channel switching should use
7277 * switch_vif_chanctx().
7279 if (WARN_ON(changed & IEEE80211_CHANCTX_CHANGE_CHANNEL))
7282 if (changed & IEEE80211_CHANCTX_CHANGE_WIDTH) {
7283 ieee80211_iterate_active_interfaces_atomic(
7285 IEEE80211_IFACE_ITER_NORMAL,
7286 ath10k_mac_change_chanctx_cnt_iter,
7288 if (arg.n_vifs == 0)
7291 arg.vifs = kcalloc(arg.n_vifs, sizeof(arg.vifs[0]),
7296 ieee80211_iterate_active_interfaces_atomic(
7298 IEEE80211_IFACE_ITER_NORMAL,
7299 ath10k_mac_change_chanctx_fill_iter,
7301 ath10k_mac_update_vif_chan(ar, arg.vifs, arg.n_vifs);
7306 ath10k_recalc_radar_detection(ar);
7308 /* FIXME: How to configure Rx chains properly? */
7310 /* No other actions are actually necessary. Firmware maintains channel
7311 * definitions per vdev internally and there's no host-side channel
7312 * context abstraction to configure, e.g. channel width.
7316 mutex_unlock(&ar->conf_mutex);
7320 ath10k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw,
7321 struct ieee80211_vif *vif,
7322 struct ieee80211_chanctx_conf *ctx)
7324 struct ath10k *ar = hw->priv;
7325 struct ath10k_vif *arvif = (void *)vif->drv_priv;
7328 mutex_lock(&ar->conf_mutex);
7330 ath10k_dbg(ar, ATH10K_DBG_MAC,
7331 "mac chanctx assign ptr %pK vdev_id %i\n",
7332 ctx, arvif->vdev_id);
7334 if (WARN_ON(arvif->is_started)) {
7335 mutex_unlock(&ar->conf_mutex);
7339 ret = ath10k_vdev_start(arvif, &ctx->def);
7341 ath10k_warn(ar, "failed to start vdev %i addr %pM on freq %d: %d\n",
7342 arvif->vdev_id, vif->addr,
7343 ctx->def.chan->center_freq, ret);
7347 arvif->is_started = true;
7349 ret = ath10k_mac_vif_setup_ps(arvif);
7351 ath10k_warn(ar, "failed to update vdev %i ps: %d\n",
7352 arvif->vdev_id, ret);
7356 if (vif->type == NL80211_IFTYPE_MONITOR) {
7357 ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, 0, vif->addr);
7359 ath10k_warn(ar, "failed to up monitor vdev %i: %d\n",
7360 arvif->vdev_id, ret);
7364 arvif->is_up = true;
7367 mutex_unlock(&ar->conf_mutex);
7371 ath10k_vdev_stop(arvif);
7372 arvif->is_started = false;
7373 ath10k_mac_vif_setup_ps(arvif);
7376 mutex_unlock(&ar->conf_mutex);
7381 ath10k_mac_op_unassign_vif_chanctx(struct ieee80211_hw *hw,
7382 struct ieee80211_vif *vif,
7383 struct ieee80211_chanctx_conf *ctx)
7385 struct ath10k *ar = hw->priv;
7386 struct ath10k_vif *arvif = (void *)vif->drv_priv;
7389 mutex_lock(&ar->conf_mutex);
7391 ath10k_dbg(ar, ATH10K_DBG_MAC,
7392 "mac chanctx unassign ptr %pK vdev_id %i\n",
7393 ctx, arvif->vdev_id);
7395 WARN_ON(!arvif->is_started);
7397 if (vif->type == NL80211_IFTYPE_MONITOR) {
7398 WARN_ON(!arvif->is_up);
7400 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
7402 ath10k_warn(ar, "failed to down monitor vdev %i: %d\n",
7403 arvif->vdev_id, ret);
7405 arvif->is_up = false;
7408 ret = ath10k_vdev_stop(arvif);
7410 ath10k_warn(ar, "failed to stop vdev %i: %d\n",
7411 arvif->vdev_id, ret);
7413 arvif->is_started = false;
7415 mutex_unlock(&ar->conf_mutex);
7419 ath10k_mac_op_switch_vif_chanctx(struct ieee80211_hw *hw,
7420 struct ieee80211_vif_chanctx_switch *vifs,
7422 enum ieee80211_chanctx_switch_mode mode)
7424 struct ath10k *ar = hw->priv;
7426 mutex_lock(&ar->conf_mutex);
7428 ath10k_dbg(ar, ATH10K_DBG_MAC,
7429 "mac chanctx switch n_vifs %d mode %d\n",
7431 ath10k_mac_update_vif_chan(ar, vifs, n_vifs);
7433 mutex_unlock(&ar->conf_mutex);
7437 static const struct ieee80211_ops ath10k_ops = {
7438 .tx = ath10k_mac_op_tx,
7439 .wake_tx_queue = ath10k_mac_op_wake_tx_queue,
7440 .start = ath10k_start,
7441 .stop = ath10k_stop,
7442 .config = ath10k_config,
7443 .add_interface = ath10k_add_interface,
7444 .remove_interface = ath10k_remove_interface,
7445 .configure_filter = ath10k_configure_filter,
7446 .bss_info_changed = ath10k_bss_info_changed,
7447 .set_coverage_class = ath10k_mac_op_set_coverage_class,
7448 .hw_scan = ath10k_hw_scan,
7449 .cancel_hw_scan = ath10k_cancel_hw_scan,
7450 .set_key = ath10k_set_key,
7451 .set_default_unicast_key = ath10k_set_default_unicast_key,
7452 .sta_state = ath10k_sta_state,
7453 .conf_tx = ath10k_conf_tx,
7454 .remain_on_channel = ath10k_remain_on_channel,
7455 .cancel_remain_on_channel = ath10k_cancel_remain_on_channel,
7456 .set_rts_threshold = ath10k_set_rts_threshold,
7457 .set_frag_threshold = ath10k_mac_op_set_frag_threshold,
7458 .flush = ath10k_flush,
7459 .tx_last_beacon = ath10k_tx_last_beacon,
7460 .set_antenna = ath10k_set_antenna,
7461 .get_antenna = ath10k_get_antenna,
7462 .reconfig_complete = ath10k_reconfig_complete,
7463 .get_survey = ath10k_get_survey,
7464 .set_bitrate_mask = ath10k_mac_op_set_bitrate_mask,
7465 .sta_rc_update = ath10k_sta_rc_update,
7466 .offset_tsf = ath10k_offset_tsf,
7467 .ampdu_action = ath10k_ampdu_action,
7468 .get_et_sset_count = ath10k_debug_get_et_sset_count,
7469 .get_et_stats = ath10k_debug_get_et_stats,
7470 .get_et_strings = ath10k_debug_get_et_strings,
7471 .add_chanctx = ath10k_mac_op_add_chanctx,
7472 .remove_chanctx = ath10k_mac_op_remove_chanctx,
7473 .change_chanctx = ath10k_mac_op_change_chanctx,
7474 .assign_vif_chanctx = ath10k_mac_op_assign_vif_chanctx,
7475 .unassign_vif_chanctx = ath10k_mac_op_unassign_vif_chanctx,
7476 .switch_vif_chanctx = ath10k_mac_op_switch_vif_chanctx,
7478 CFG80211_TESTMODE_CMD(ath10k_tm_cmd)
7481 .suspend = ath10k_wow_op_suspend,
7482 .resume = ath10k_wow_op_resume,
7484 #ifdef CONFIG_MAC80211_DEBUGFS
7485 .sta_add_debugfs = ath10k_sta_add_debugfs,
7486 .sta_statistics = ath10k_sta_statistics,
7490 #define CHAN2G(_channel, _freq, _flags) { \
7491 .band = NL80211_BAND_2GHZ, \
7492 .hw_value = (_channel), \
7493 .center_freq = (_freq), \
7494 .flags = (_flags), \
7495 .max_antenna_gain = 0, \
7499 #define CHAN5G(_channel, _freq, _flags) { \
7500 .band = NL80211_BAND_5GHZ, \
7501 .hw_value = (_channel), \
7502 .center_freq = (_freq), \
7503 .flags = (_flags), \
7504 .max_antenna_gain = 0, \
7508 static const struct ieee80211_channel ath10k_2ghz_channels[] = {
7518 CHAN2G(10, 2457, 0),
7519 CHAN2G(11, 2462, 0),
7520 CHAN2G(12, 2467, 0),
7521 CHAN2G(13, 2472, 0),
7522 CHAN2G(14, 2484, 0),
7525 static const struct ieee80211_channel ath10k_5ghz_channels[] = {
7526 CHAN5G(36, 5180, 0),
7527 CHAN5G(40, 5200, 0),
7528 CHAN5G(44, 5220, 0),
7529 CHAN5G(48, 5240, 0),
7530 CHAN5G(52, 5260, 0),
7531 CHAN5G(56, 5280, 0),
7532 CHAN5G(60, 5300, 0),
7533 CHAN5G(64, 5320, 0),
7534 CHAN5G(100, 5500, 0),
7535 CHAN5G(104, 5520, 0),
7536 CHAN5G(108, 5540, 0),
7537 CHAN5G(112, 5560, 0),
7538 CHAN5G(116, 5580, 0),
7539 CHAN5G(120, 5600, 0),
7540 CHAN5G(124, 5620, 0),
7541 CHAN5G(128, 5640, 0),
7542 CHAN5G(132, 5660, 0),
7543 CHAN5G(136, 5680, 0),
7544 CHAN5G(140, 5700, 0),
7545 CHAN5G(144, 5720, 0),
7546 CHAN5G(149, 5745, 0),
7547 CHAN5G(153, 5765, 0),
7548 CHAN5G(157, 5785, 0),
7549 CHAN5G(161, 5805, 0),
7550 CHAN5G(165, 5825, 0),
7553 struct ath10k *ath10k_mac_create(size_t priv_size)
7555 struct ieee80211_hw *hw;
7556 struct ieee80211_ops *ops;
7559 ops = kmemdup(&ath10k_ops, sizeof(ath10k_ops), GFP_KERNEL);
7563 hw = ieee80211_alloc_hw(sizeof(struct ath10k) + priv_size, ops);
7576 void ath10k_mac_destroy(struct ath10k *ar)
7578 struct ieee80211_ops *ops = ar->ops;
7580 ieee80211_free_hw(ar->hw);
7584 static const struct ieee80211_iface_limit ath10k_if_limits[] = {
7587 .types = BIT(NL80211_IFTYPE_STATION)
7588 | BIT(NL80211_IFTYPE_P2P_CLIENT)
7592 .types = BIT(NL80211_IFTYPE_P2P_GO)
7596 .types = BIT(NL80211_IFTYPE_P2P_DEVICE)
7600 .types = BIT(NL80211_IFTYPE_AP)
7601 #ifdef CONFIG_MAC80211_MESH
7602 | BIT(NL80211_IFTYPE_MESH_POINT)
7607 static const struct ieee80211_iface_limit ath10k_10x_if_limits[] = {
7610 .types = BIT(NL80211_IFTYPE_AP)
7611 #ifdef CONFIG_MAC80211_MESH
7612 | BIT(NL80211_IFTYPE_MESH_POINT)
7617 .types = BIT(NL80211_IFTYPE_STATION)
7621 static const struct ieee80211_iface_combination ath10k_if_comb[] = {
7623 .limits = ath10k_if_limits,
7624 .n_limits = ARRAY_SIZE(ath10k_if_limits),
7625 .max_interfaces = 8,
7626 .num_different_channels = 1,
7627 .beacon_int_infra_match = true,
7631 static const struct ieee80211_iface_combination ath10k_10x_if_comb[] = {
7633 .limits = ath10k_10x_if_limits,
7634 .n_limits = ARRAY_SIZE(ath10k_10x_if_limits),
7635 .max_interfaces = 8,
7636 .num_different_channels = 1,
7637 .beacon_int_infra_match = true,
7638 #ifdef CONFIG_ATH10K_DFS_CERTIFIED
7639 .radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
7640 BIT(NL80211_CHAN_WIDTH_20) |
7641 BIT(NL80211_CHAN_WIDTH_40) |
7642 BIT(NL80211_CHAN_WIDTH_80),
7647 static const struct ieee80211_iface_limit ath10k_tlv_if_limit[] = {
7650 .types = BIT(NL80211_IFTYPE_STATION),
7654 .types = BIT(NL80211_IFTYPE_AP) |
7655 #ifdef CONFIG_MAC80211_MESH
7656 BIT(NL80211_IFTYPE_MESH_POINT) |
7658 BIT(NL80211_IFTYPE_P2P_CLIENT) |
7659 BIT(NL80211_IFTYPE_P2P_GO),
7663 .types = BIT(NL80211_IFTYPE_P2P_DEVICE),
7667 static const struct ieee80211_iface_limit ath10k_tlv_qcs_if_limit[] = {
7670 .types = BIT(NL80211_IFTYPE_STATION),
7674 .types = BIT(NL80211_IFTYPE_P2P_CLIENT),
7678 .types = BIT(NL80211_IFTYPE_AP) |
7679 #ifdef CONFIG_MAC80211_MESH
7680 BIT(NL80211_IFTYPE_MESH_POINT) |
7682 BIT(NL80211_IFTYPE_P2P_GO),
7686 .types = BIT(NL80211_IFTYPE_P2P_DEVICE),
7690 static const struct ieee80211_iface_limit ath10k_tlv_if_limit_ibss[] = {
7693 .types = BIT(NL80211_IFTYPE_STATION),
7697 .types = BIT(NL80211_IFTYPE_ADHOC),
7701 /* FIXME: This is not thouroughly tested. These combinations may over- or
7702 * underestimate hw/fw capabilities.
7704 static struct ieee80211_iface_combination ath10k_tlv_if_comb[] = {
7706 .limits = ath10k_tlv_if_limit,
7707 .num_different_channels = 1,
7708 .max_interfaces = 4,
7709 .n_limits = ARRAY_SIZE(ath10k_tlv_if_limit),
7712 .limits = ath10k_tlv_if_limit_ibss,
7713 .num_different_channels = 1,
7714 .max_interfaces = 2,
7715 .n_limits = ARRAY_SIZE(ath10k_tlv_if_limit_ibss),
7719 static struct ieee80211_iface_combination ath10k_tlv_qcs_if_comb[] = {
7721 .limits = ath10k_tlv_if_limit,
7722 .num_different_channels = 1,
7723 .max_interfaces = 4,
7724 .n_limits = ARRAY_SIZE(ath10k_tlv_if_limit),
7727 .limits = ath10k_tlv_qcs_if_limit,
7728 .num_different_channels = 2,
7729 .max_interfaces = 4,
7730 .n_limits = ARRAY_SIZE(ath10k_tlv_qcs_if_limit),
7733 .limits = ath10k_tlv_if_limit_ibss,
7734 .num_different_channels = 1,
7735 .max_interfaces = 2,
7736 .n_limits = ARRAY_SIZE(ath10k_tlv_if_limit_ibss),
7740 static const struct ieee80211_iface_limit ath10k_10_4_if_limits[] = {
7743 .types = BIT(NL80211_IFTYPE_STATION),
7747 .types = BIT(NL80211_IFTYPE_AP)
7748 #ifdef CONFIG_MAC80211_MESH
7749 | BIT(NL80211_IFTYPE_MESH_POINT)
7754 static const struct ieee80211_iface_combination ath10k_10_4_if_comb[] = {
7756 .limits = ath10k_10_4_if_limits,
7757 .n_limits = ARRAY_SIZE(ath10k_10_4_if_limits),
7758 .max_interfaces = 16,
7759 .num_different_channels = 1,
7760 .beacon_int_infra_match = true,
7761 #ifdef CONFIG_ATH10K_DFS_CERTIFIED
7762 .radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
7763 BIT(NL80211_CHAN_WIDTH_20) |
7764 BIT(NL80211_CHAN_WIDTH_40) |
7765 BIT(NL80211_CHAN_WIDTH_80),
7770 static void ath10k_get_arvif_iter(void *data, u8 *mac,
7771 struct ieee80211_vif *vif)
7773 struct ath10k_vif_iter *arvif_iter = data;
7774 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
7776 if (arvif->vdev_id == arvif_iter->vdev_id)
7777 arvif_iter->arvif = arvif;
7780 struct ath10k_vif *ath10k_get_arvif(struct ath10k *ar, u32 vdev_id)
7782 struct ath10k_vif_iter arvif_iter;
7785 memset(&arvif_iter, 0, sizeof(struct ath10k_vif_iter));
7786 arvif_iter.vdev_id = vdev_id;
7788 flags = IEEE80211_IFACE_ITER_RESUME_ALL;
7789 ieee80211_iterate_active_interfaces_atomic(ar->hw,
7791 ath10k_get_arvif_iter,
7793 if (!arvif_iter.arvif) {
7794 ath10k_warn(ar, "No VIF found for vdev %d\n", vdev_id);
7798 return arvif_iter.arvif;
7801 #define WRD_METHOD "WRDD"
7802 #define WRDD_WIFI (0x07)
7804 static u32 ath10k_mac_wrdd_get_mcc(struct ath10k *ar, union acpi_object *wrdd)
7806 union acpi_object *mcc_pkg;
7807 union acpi_object *domain_type;
7808 union acpi_object *mcc_value;
7811 if (wrdd->type != ACPI_TYPE_PACKAGE ||
7812 wrdd->package.count < 2 ||
7813 wrdd->package.elements[0].type != ACPI_TYPE_INTEGER ||
7814 wrdd->package.elements[0].integer.value != 0) {
7815 ath10k_warn(ar, "ignoring malformed/unsupported wrdd structure\n");
7819 for (i = 1; i < wrdd->package.count; ++i) {
7820 mcc_pkg = &wrdd->package.elements[i];
7822 if (mcc_pkg->type != ACPI_TYPE_PACKAGE)
7824 if (mcc_pkg->package.count < 2)
7826 if (mcc_pkg->package.elements[0].type != ACPI_TYPE_INTEGER ||
7827 mcc_pkg->package.elements[1].type != ACPI_TYPE_INTEGER)
7830 domain_type = &mcc_pkg->package.elements[0];
7831 if (domain_type->integer.value != WRDD_WIFI)
7834 mcc_value = &mcc_pkg->package.elements[1];
7835 return mcc_value->integer.value;
7840 static int ath10k_mac_get_wrdd_regulatory(struct ath10k *ar, u16 *rd)
7842 struct pci_dev __maybe_unused *pdev = to_pci_dev(ar->dev);
7843 acpi_handle root_handle;
7845 struct acpi_buffer wrdd = {ACPI_ALLOCATE_BUFFER, NULL};
7850 root_handle = ACPI_HANDLE(&pdev->dev);
7854 status = acpi_get_handle(root_handle, (acpi_string)WRD_METHOD, &handle);
7855 if (ACPI_FAILURE(status)) {
7856 ath10k_dbg(ar, ATH10K_DBG_BOOT,
7857 "failed to get wrd method %d\n", status);
7861 status = acpi_evaluate_object(handle, NULL, NULL, &wrdd);
7862 if (ACPI_FAILURE(status)) {
7863 ath10k_dbg(ar, ATH10K_DBG_BOOT,
7864 "failed to call wrdc %d\n", status);
7868 alpha2_code = ath10k_mac_wrdd_get_mcc(ar, wrdd.pointer);
7869 kfree(wrdd.pointer);
7873 alpha2[0] = (alpha2_code >> 8) & 0xff;
7874 alpha2[1] = (alpha2_code >> 0) & 0xff;
7877 ath10k_dbg(ar, ATH10K_DBG_BOOT,
7878 "regulatory hint from WRDD (alpha2-code): %s\n", alpha2);
7880 *rd = ath_regd_find_country_by_name(alpha2);
7884 *rd |= COUNTRY_ERD_FLAG;
7888 static int ath10k_mac_init_rd(struct ath10k *ar)
7893 ret = ath10k_mac_get_wrdd_regulatory(ar, &rd);
7895 ath10k_dbg(ar, ATH10K_DBG_BOOT,
7896 "fallback to eeprom programmed regulatory settings\n");
7897 rd = ar->hw_eeprom_rd;
7900 ar->ath_common.regulatory.current_rd = rd;
7904 int ath10k_mac_register(struct ath10k *ar)
7906 static const u32 cipher_suites[] = {
7907 WLAN_CIPHER_SUITE_WEP40,
7908 WLAN_CIPHER_SUITE_WEP104,
7909 WLAN_CIPHER_SUITE_TKIP,
7910 WLAN_CIPHER_SUITE_CCMP,
7911 WLAN_CIPHER_SUITE_AES_CMAC,
7913 struct ieee80211_supported_band *band;
7917 SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr);
7919 SET_IEEE80211_DEV(ar->hw, ar->dev);
7921 BUILD_BUG_ON((ARRAY_SIZE(ath10k_2ghz_channels) +
7922 ARRAY_SIZE(ath10k_5ghz_channels)) !=
7925 if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) {
7926 channels = kmemdup(ath10k_2ghz_channels,
7927 sizeof(ath10k_2ghz_channels),
7934 band = &ar->mac.sbands[NL80211_BAND_2GHZ];
7935 band->n_channels = ARRAY_SIZE(ath10k_2ghz_channels);
7936 band->channels = channels;
7938 if (ar->hw_params.cck_rate_map_rev2) {
7939 band->n_bitrates = ath10k_g_rates_rev2_size;
7940 band->bitrates = ath10k_g_rates_rev2;
7942 band->n_bitrates = ath10k_g_rates_size;
7943 band->bitrates = ath10k_g_rates;
7946 ar->hw->wiphy->bands[NL80211_BAND_2GHZ] = band;
7949 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) {
7950 channels = kmemdup(ath10k_5ghz_channels,
7951 sizeof(ath10k_5ghz_channels),
7958 band = &ar->mac.sbands[NL80211_BAND_5GHZ];
7959 band->n_channels = ARRAY_SIZE(ath10k_5ghz_channels);
7960 band->channels = channels;
7961 band->n_bitrates = ath10k_a_rates_size;
7962 band->bitrates = ath10k_a_rates;
7963 ar->hw->wiphy->bands[NL80211_BAND_5GHZ] = band;
7966 ath10k_mac_setup_ht_vht_cap(ar);
7968 ar->hw->wiphy->interface_modes =
7969 BIT(NL80211_IFTYPE_STATION) |
7970 BIT(NL80211_IFTYPE_AP) |
7971 BIT(NL80211_IFTYPE_MESH_POINT);
7973 ar->hw->wiphy->available_antennas_rx = ar->cfg_rx_chainmask;
7974 ar->hw->wiphy->available_antennas_tx = ar->cfg_tx_chainmask;
7976 if (!test_bit(ATH10K_FW_FEATURE_NO_P2P, ar->normal_mode_fw.fw_file.fw_features))
7977 ar->hw->wiphy->interface_modes |=
7978 BIT(NL80211_IFTYPE_P2P_DEVICE) |
7979 BIT(NL80211_IFTYPE_P2P_CLIENT) |
7980 BIT(NL80211_IFTYPE_P2P_GO);
7982 ieee80211_hw_set(ar->hw, SIGNAL_DBM);
7983 ieee80211_hw_set(ar->hw, SUPPORTS_PS);
7984 ieee80211_hw_set(ar->hw, SUPPORTS_DYNAMIC_PS);
7985 ieee80211_hw_set(ar->hw, MFP_CAPABLE);
7986 ieee80211_hw_set(ar->hw, REPORTS_TX_ACK_STATUS);
7987 ieee80211_hw_set(ar->hw, HAS_RATE_CONTROL);
7988 ieee80211_hw_set(ar->hw, AP_LINK_PS);
7989 ieee80211_hw_set(ar->hw, SPECTRUM_MGMT);
7990 ieee80211_hw_set(ar->hw, SUPPORT_FAST_XMIT);
7991 ieee80211_hw_set(ar->hw, CONNECTION_MONITOR);
7992 ieee80211_hw_set(ar->hw, SUPPORTS_PER_STA_GTK);
7993 ieee80211_hw_set(ar->hw, WANT_MONITOR_VIF);
7994 ieee80211_hw_set(ar->hw, CHANCTX_STA_CSA);
7995 ieee80211_hw_set(ar->hw, QUEUE_CONTROL);
7996 ieee80211_hw_set(ar->hw, SUPPORTS_TX_FRAG);
7997 ieee80211_hw_set(ar->hw, REPORTS_LOW_ACK);
7999 if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags))
8000 ieee80211_hw_set(ar->hw, SW_CRYPTO_CONTROL);
8002 ar->hw->wiphy->features |= NL80211_FEATURE_STATIC_SMPS;
8003 ar->hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
8005 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS)
8006 ar->hw->wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS;
8008 if (ar->ht_cap_info & WMI_HT_CAP_ENABLED) {
8009 ieee80211_hw_set(ar->hw, AMPDU_AGGREGATION);
8010 ieee80211_hw_set(ar->hw, TX_AMPDU_SETUP_IN_HW);
8013 ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID;
8014 ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN;
8016 ar->hw->vif_data_size = sizeof(struct ath10k_vif);
8017 ar->hw->sta_data_size = sizeof(struct ath10k_sta);
8018 ar->hw->txq_data_size = sizeof(struct ath10k_txq);
8020 ar->hw->max_listen_interval = ATH10K_MAX_HW_LISTEN_INTERVAL;
8022 if (test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map)) {
8023 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD;
8025 /* Firmware delivers WPS/P2P Probe Requests frames to driver so
8026 * that userspace (e.g. wpa_supplicant/hostapd) can generate
8027 * correct Probe Responses. This is more of a hack advert..
8029 ar->hw->wiphy->probe_resp_offload |=
8030 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS |
8031 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS2 |
8032 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_P2P;
8035 if (test_bit(WMI_SERVICE_TDLS, ar->wmi.svc_map))
8036 ar->hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS;
8038 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
8039 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
8040 ar->hw->wiphy->max_remain_on_channel_duration = 5000;
8042 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
8043 ar->hw->wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE |
8044 NL80211_FEATURE_AP_SCAN;
8046 ar->hw->wiphy->max_ap_assoc_sta = ar->max_num_stations;
8048 ret = ath10k_wow_init(ar);
8050 ath10k_warn(ar, "failed to init wow: %d\n", ret);
8054 wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_VHT_IBSS);
8057 * on LL hardware queues are managed entirely by the FW
8058 * so we only advertise to mac we can do the queues thing
8060 ar->hw->queues = IEEE80211_MAX_QUEUES;
8062 /* vdev_ids are used as hw queue numbers. Make sure offchan tx queue is
8063 * something that vdev_ids can't reach so that we don't stop the queue
8066 ar->hw->offchannel_tx_hw_queue = IEEE80211_MAX_QUEUES - 1;
8068 switch (ar->running_fw->fw_file.wmi_op_version) {
8069 case ATH10K_FW_WMI_OP_VERSION_MAIN:
8070 ar->hw->wiphy->iface_combinations = ath10k_if_comb;
8071 ar->hw->wiphy->n_iface_combinations =
8072 ARRAY_SIZE(ath10k_if_comb);
8073 ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC);
8075 case ATH10K_FW_WMI_OP_VERSION_TLV:
8076 if (test_bit(WMI_SERVICE_ADAPTIVE_OCS, ar->wmi.svc_map)) {
8077 ar->hw->wiphy->iface_combinations =
8078 ath10k_tlv_qcs_if_comb;
8079 ar->hw->wiphy->n_iface_combinations =
8080 ARRAY_SIZE(ath10k_tlv_qcs_if_comb);
8082 ar->hw->wiphy->iface_combinations = ath10k_tlv_if_comb;
8083 ar->hw->wiphy->n_iface_combinations =
8084 ARRAY_SIZE(ath10k_tlv_if_comb);
8086 ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC);
8088 case ATH10K_FW_WMI_OP_VERSION_10_1:
8089 case ATH10K_FW_WMI_OP_VERSION_10_2:
8090 case ATH10K_FW_WMI_OP_VERSION_10_2_4:
8091 ar->hw->wiphy->iface_combinations = ath10k_10x_if_comb;
8092 ar->hw->wiphy->n_iface_combinations =
8093 ARRAY_SIZE(ath10k_10x_if_comb);
8095 case ATH10K_FW_WMI_OP_VERSION_10_4:
8096 ar->hw->wiphy->iface_combinations = ath10k_10_4_if_comb;
8097 ar->hw->wiphy->n_iface_combinations =
8098 ARRAY_SIZE(ath10k_10_4_if_comb);
8100 case ATH10K_FW_WMI_OP_VERSION_UNSET:
8101 case ATH10K_FW_WMI_OP_VERSION_MAX:
8107 if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags))
8108 ar->hw->netdev_features = NETIF_F_HW_CSUM;
8110 if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED)) {
8111 /* Init ath dfs pattern detector */
8112 ar->ath_common.debug_mask = ATH_DBG_DFS;
8113 ar->dfs_detector = dfs_pattern_detector_init(&ar->ath_common,
8116 if (!ar->dfs_detector)
8117 ath10k_warn(ar, "failed to initialise DFS pattern detector\n");
8120 /* Current wake_tx_queue implementation imposes a significant
8121 * performance penalty in some setups. The tx scheduling code needs
8122 * more work anyway so disable the wake_tx_queue unless firmware
8123 * supports the pull-push mechanism.
8125 if (!test_bit(ATH10K_FW_FEATURE_PEER_FLOW_CONTROL,
8126 ar->running_fw->fw_file.fw_features))
8127 ar->ops->wake_tx_queue = NULL;
8129 ret = ath10k_mac_init_rd(ar);
8131 ath10k_err(ar, "failed to derive regdom: %d\n", ret);
8132 goto err_dfs_detector_exit;
8135 /* Disable set_coverage_class for chipsets that do not support it. */
8136 if (!ar->hw_params.hw_ops->set_coverage_class)
8137 ar->ops->set_coverage_class = NULL;
8139 ret = ath_regd_init(&ar->ath_common.regulatory, ar->hw->wiphy,
8140 ath10k_reg_notifier);
8142 ath10k_err(ar, "failed to initialise regulatory: %i\n", ret);
8143 goto err_dfs_detector_exit;
8146 ar->hw->wiphy->cipher_suites = cipher_suites;
8147 ar->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
8149 ret = ieee80211_register_hw(ar->hw);
8151 ath10k_err(ar, "failed to register ieee80211: %d\n", ret);
8152 goto err_dfs_detector_exit;
8155 if (!ath_is_world_regd(&ar->ath_common.regulatory)) {
8156 ret = regulatory_hint(ar->hw->wiphy,
8157 ar->ath_common.regulatory.alpha2);
8159 goto err_unregister;
8165 ieee80211_unregister_hw(ar->hw);
8167 err_dfs_detector_exit:
8168 if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector)
8169 ar->dfs_detector->exit(ar->dfs_detector);
8172 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
8173 kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels);
8175 SET_IEEE80211_DEV(ar->hw, NULL);
8179 void ath10k_mac_unregister(struct ath10k *ar)
8181 ieee80211_unregister_hw(ar->hw);
8183 if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector)
8184 ar->dfs_detector->exit(ar->dfs_detector);
8186 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
8187 kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels);
8189 SET_IEEE80211_DEV(ar->hw, NULL);