Lines Matching +full:cm +full:- +full:poll +full:- +full:interval
1 // SPDX-License-Identifier: ISC
3 * Copyright (c) 2005-2011 Atheros Communications Inc.
4 * Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
5 * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.
6 * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
25 #include "wmi-tlv.h"
26 #include "wmi-ops.h"
99 #define ath10k_a_rates_size (ARRAY_SIZE(ath10k_rates) - \
134 for (i = 0; i < sband->n_bitrates; i++) { in ath10k_mac_hw_rate_to_idx()
135 rate = &sband->bitrates[i]; in ath10k_mac_hw_rate_to_idx()
137 if (ath10k_mac_bitrate_is_cck(rate->bitrate) != cck) in ath10k_mac_hw_rate_to_idx()
140 if (rate->hw_value == hw_rate) in ath10k_mac_hw_rate_to_idx()
142 else if (rate->flags & IEEE80211_RATE_SHORT_PREAMBLE && in ath10k_mac_hw_rate_to_idx()
143 rate->hw_value_short == hw_rate) in ath10k_mac_hw_rate_to_idx()
155 for (i = 0; i < sband->n_bitrates; i++) in ath10k_mac_bitrate_to_idx()
156 if (sband->bitrates[i].bitrate == bitrate) in ath10k_mac_bitrate_to_idx()
175 return -EINVAL; in ath10k_mac_get_rate_hw_value()
181 case IEEE80211_VHT_MCS_SUPPORT_0_7: return BIT(8) - 1; in ath10k_mac_get_max_vht_mcs_map()
182 case IEEE80211_VHT_MCS_SUPPORT_0_8: return BIT(9) - 1; in ath10k_mac_get_max_vht_mcs_map()
183 case IEEE80211_VHT_MCS_SUPPORT_0_9: return BIT(10) - 1; in ath10k_mac_get_max_vht_mcs_map()
193 for (nss = IEEE80211_HT_MCS_MASK_LEN - 1; nss >= 0; nss--) in ath10k_mac_max_ht_nss()
205 for (nss = NL80211_VHT_NSS_MAX - 1; nss >= 0; nss--) in ath10k_mac_max_vht_nss()
217 if (test_bit(WMI_SERVICE_TX_MODE_DYNAMIC, ar->wmi.svc_map)) in ath10k_mac_ext_resource_config()
224 if (ret && ret != -EOPNOTSUPP) { in ath10k_mac_ext_resource_config()
241 struct ath10k *ar = arvif->ar; in ath10k_send_key()
243 .vdev_id = arvif->vdev_id, in ath10k_send_key()
244 .key_idx = key->keyidx, in ath10k_send_key()
245 .key_len = key->keylen, in ath10k_send_key()
246 .key_data = key->key, in ath10k_send_key()
251 lockdep_assert_held(&arvif->ar->conf_mutex); in ath10k_send_key()
253 switch (key->cipher) { in ath10k_send_key()
255 arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_AES_CCM]; in ath10k_send_key()
256 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT; in ath10k_send_key()
259 arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_TKIP]; in ath10k_send_key()
265 arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_WEP]; in ath10k_send_key()
268 arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_AES_CCM]; in ath10k_send_key()
272 arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_AES_GCM]; in ath10k_send_key()
273 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT; in ath10k_send_key()
280 return -EINVAL; in ath10k_send_key()
282 ath10k_warn(ar, "cipher %d is not supported\n", key->cipher); in ath10k_send_key()
283 return -EOPNOTSUPP; in ath10k_send_key()
286 if (test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) in ath10k_send_key()
287 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV; in ath10k_send_key()
290 arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_NONE]; in ath10k_send_key()
294 return ath10k_wmi_vdev_install_key(arvif->ar, &arg); in ath10k_send_key()
302 struct ath10k *ar = arvif->ar; in ath10k_install_key()
306 lockdep_assert_held(&ar->conf_mutex); in ath10k_install_key()
308 reinit_completion(&ar->install_key_done); in ath10k_install_key()
310 if (arvif->nohwcrypt) in ath10k_install_key()
317 time_left = wait_for_completion_timeout(&ar->install_key_done, 3 * HZ); in ath10k_install_key()
319 return -ETIMEDOUT; in ath10k_install_key()
327 struct ath10k *ar = arvif->ar; in ath10k_install_peer_wep_keys()
333 lockdep_assert_held(&ar->conf_mutex); in ath10k_install_peer_wep_keys()
335 if (WARN_ON(arvif->vif->type != NL80211_IFTYPE_AP && in ath10k_install_peer_wep_keys()
336 arvif->vif->type != NL80211_IFTYPE_ADHOC && in ath10k_install_peer_wep_keys()
337 arvif->vif->type != NL80211_IFTYPE_MESH_POINT)) in ath10k_install_peer_wep_keys()
338 return -EINVAL; in ath10k_install_peer_wep_keys()
340 spin_lock_bh(&ar->data_lock); in ath10k_install_peer_wep_keys()
341 peer = ath10k_peer_find(ar, arvif->vdev_id, addr); in ath10k_install_peer_wep_keys()
342 spin_unlock_bh(&ar->data_lock); in ath10k_install_peer_wep_keys()
345 return -ENOENT; in ath10k_install_peer_wep_keys()
347 for (i = 0; i < ARRAY_SIZE(arvif->wep_keys); i++) { in ath10k_install_peer_wep_keys()
348 if (arvif->wep_keys[i] == NULL) in ath10k_install_peer_wep_keys()
351 switch (arvif->vif->type) { in ath10k_install_peer_wep_keys()
355 if (arvif->def_wep_key_idx == i) in ath10k_install_peer_wep_keys()
358 ret = ath10k_install_key(arvif, arvif->wep_keys[i], in ath10k_install_peer_wep_keys()
364 ret = ath10k_install_key(arvif, arvif->wep_keys[i], in ath10k_install_peer_wep_keys()
370 ret = ath10k_install_key(arvif, arvif->wep_keys[i], in ath10k_install_peer_wep_keys()
377 return -EINVAL; in ath10k_install_peer_wep_keys()
380 spin_lock_bh(&ar->data_lock); in ath10k_install_peer_wep_keys()
381 peer->keys[i] = arvif->wep_keys[i]; in ath10k_install_peer_wep_keys()
382 spin_unlock_bh(&ar->data_lock); in ath10k_install_peer_wep_keys()
393 if (arvif->vif->type != NL80211_IFTYPE_ADHOC) in ath10k_install_peer_wep_keys()
396 if (arvif->def_wep_key_idx == -1) in ath10k_install_peer_wep_keys()
399 ret = ath10k_wmi_vdev_set_param(arvif->ar, in ath10k_install_peer_wep_keys()
400 arvif->vdev_id, in ath10k_install_peer_wep_keys()
401 arvif->ar->wmi.vdev_param->def_keyid, in ath10k_install_peer_wep_keys()
402 arvif->def_wep_key_idx); in ath10k_install_peer_wep_keys()
404 ath10k_warn(ar, "failed to re-set def wpa key idxon vdev %i: %d\n", in ath10k_install_peer_wep_keys()
405 arvif->vdev_id, ret); in ath10k_install_peer_wep_keys()
415 struct ath10k *ar = arvif->ar; in ath10k_clear_peer_keys()
422 lockdep_assert_held(&ar->conf_mutex); in ath10k_clear_peer_keys()
424 spin_lock_bh(&ar->data_lock); in ath10k_clear_peer_keys()
425 peer = ath10k_peer_find(ar, arvif->vdev_id, addr); in ath10k_clear_peer_keys()
426 spin_unlock_bh(&ar->data_lock); in ath10k_clear_peer_keys()
429 return -ENOENT; in ath10k_clear_peer_keys()
431 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) { in ath10k_clear_peer_keys()
432 if (peer->keys[i] == NULL) in ath10k_clear_peer_keys()
436 ret = ath10k_install_key(arvif, peer->keys[i], in ath10k_clear_peer_keys()
445 spin_lock_bh(&ar->data_lock); in ath10k_clear_peer_keys()
446 peer->keys[i] = NULL; in ath10k_clear_peer_keys()
447 spin_unlock_bh(&ar->data_lock); in ath10k_clear_peer_keys()
459 lockdep_assert_held(&ar->data_lock); in ath10k_mac_is_peer_wep_key_set()
464 * FIXME: multi-bss needs to be handled. in ath10k_mac_is_peer_wep_key_set()
470 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) { in ath10k_mac_is_peer_wep_key_set()
471 if (peer->keys[i] && peer->keys[i]->keyidx == keyidx) in ath10k_mac_is_peer_wep_key_set()
481 struct ath10k *ar = arvif->ar; in ath10k_clear_vdev_key()
489 lockdep_assert_held(&ar->conf_mutex); in ath10k_clear_vdev_key()
495 spin_lock_bh(&ar->data_lock); in ath10k_clear_vdev_key()
497 list_for_each_entry(peer, &ar->peers, list) { in ath10k_clear_vdev_key()
498 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) { in ath10k_clear_vdev_key()
499 if (peer->keys[i] == key) { in ath10k_clear_vdev_key()
500 ether_addr_copy(addr, peer->addr); in ath10k_clear_vdev_key()
501 peer->keys[i] = NULL; in ath10k_clear_vdev_key()
506 if (i < ARRAY_SIZE(peer->keys)) in ath10k_clear_vdev_key()
509 spin_unlock_bh(&ar->data_lock); in ath10k_clear_vdev_key()
511 if (i == ARRAY_SIZE(peer->keys)) in ath10k_clear_vdev_key()
529 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_update_wep_key()
533 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_vif_update_wep_key()
535 list_for_each_entry(peer, &ar->peers, list) { in ath10k_mac_vif_update_wep_key()
536 if (ether_addr_equal(peer->addr, arvif->vif->addr)) in ath10k_mac_vif_update_wep_key()
539 if (ether_addr_equal(peer->addr, arvif->bssid)) in ath10k_mac_vif_update_wep_key()
542 if (peer->keys[key->keyidx] == key) in ath10k_mac_vif_update_wep_key()
546 arvif->vdev_id, key->keyidx); in ath10k_mac_vif_update_wep_key()
548 ret = ath10k_install_peer_wep_keys(arvif, peer->addr); in ath10k_mac_vif_update_wep_key()
551 arvif->vdev_id, peer->addr, ret); in ath10k_mac_vif_update_wep_key()
568 switch (chandef->chan->band) { in chan_to_phymode()
570 switch (chandef->width) { in chan_to_phymode()
572 if (chandef->chan->flags & IEEE80211_CHAN_NO_OFDM) in chan_to_phymode()
589 switch (chandef->width) { in chan_to_phymode()
663 conf = rcu_dereference(vif->bss_conf.chanctx_conf); in ath10k_mac_vif_chan()
666 return -ENOENT; in ath10k_mac_vif_chan()
669 *def = conf->def; in ath10k_mac_vif_chan()
688 ieee80211_iter_chan_contexts_atomic(ar->hw, in ath10k_mac_num_chanctxs()
702 *def = &conf->def; in ath10k_mac_get_any_chandef_iter()
711 if (test_bit(WMI_SERVICE_SYNC_DELETE_CMDS, ar->wmi.svc_map)) { in ath10k_wait_for_peer_delete_done()
718 time_left = wait_for_completion_timeout(&ar->peer_delete_done, in ath10k_wait_for_peer_delete_done()
737 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_create()
739 num_peers = ar->num_peers; in ath10k_peer_create()
742 list_for_each_entry(arvif, &ar->arvifs, list) in ath10k_peer_create()
745 if (num_peers >= ar->max_num_peers) in ath10k_peer_create()
746 return -ENOBUFS; in ath10k_peer_create()
762 spin_lock_bh(&ar->data_lock); in ath10k_peer_create()
766 spin_unlock_bh(&ar->data_lock); in ath10k_peer_create()
770 return -ENOENT; in ath10k_peer_create()
773 peer->vif = vif; in ath10k_peer_create()
774 peer->sta = sta; in ath10k_peer_create()
776 spin_unlock_bh(&ar->data_lock); in ath10k_peer_create()
778 ar->num_peers++; in ath10k_peer_create()
785 struct ath10k *ar = arvif->ar; in ath10k_mac_set_kickout()
789 param = ar->wmi.pdev_param->sta_kickout_th; in ath10k_mac_set_kickout()
794 arvif->vdev_id, ret); in ath10k_mac_set_kickout()
798 param = ar->wmi.vdev_param->ap_keepalive_min_idle_inactive_time_secs; in ath10k_mac_set_kickout()
799 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param, in ath10k_mac_set_kickout()
803 arvif->vdev_id, ret); in ath10k_mac_set_kickout()
807 param = ar->wmi.vdev_param->ap_keepalive_max_idle_inactive_time_secs; in ath10k_mac_set_kickout()
808 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param, in ath10k_mac_set_kickout()
812 arvif->vdev_id, ret); in ath10k_mac_set_kickout()
816 param = ar->wmi.vdev_param->ap_keepalive_max_unresponsive_time_secs; in ath10k_mac_set_kickout()
817 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param, in ath10k_mac_set_kickout()
821 arvif->vdev_id, ret); in ath10k_mac_set_kickout()
830 struct ath10k *ar = arvif->ar; in ath10k_mac_set_rts()
833 vdev_param = ar->wmi.vdev_param->rts_threshold; in ath10k_mac_set_rts()
834 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, value); in ath10k_mac_set_rts()
841 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_delete()
851 if (test_bit(WMI_SERVICE_SYNC_DELETE_CMDS, ar->wmi.svc_map)) { in ath10k_peer_delete()
855 (&ar->peer_delete_done, 5 * HZ); in ath10k_peer_delete()
859 return -ETIMEDOUT; in ath10k_peer_delete()
863 ar->num_peers--; in ath10k_peer_delete()
872 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_map_cleanup()
874 for_each_set_bit(peer_id, peer->peer_ids, in ath10k_peer_map_cleanup()
876 ar->peer_map[peer_id] = NULL; in ath10k_peer_map_cleanup()
879 /* Double check that peer is properly un-referenced from in ath10k_peer_map_cleanup()
882 for (i = 0; i < ARRAY_SIZE(ar->peer_map); i++) { in ath10k_peer_map_cleanup()
883 if (ar->peer_map[i] == peer) { in ath10k_peer_map_cleanup()
885 peer->addr, peer, i); in ath10k_peer_map_cleanup()
886 ar->peer_map[i] = NULL; in ath10k_peer_map_cleanup()
890 list_del(&peer->list); in ath10k_peer_map_cleanup()
892 ar->num_peers--; in ath10k_peer_map_cleanup()
899 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_cleanup()
901 spin_lock_bh(&ar->data_lock); in ath10k_peer_cleanup()
902 list_for_each_entry_safe(peer, tmp, &ar->peers, list) { in ath10k_peer_cleanup()
903 if (peer->vdev_id != vdev_id) in ath10k_peer_cleanup()
907 peer->addr, vdev_id); in ath10k_peer_cleanup()
911 spin_unlock_bh(&ar->data_lock); in ath10k_peer_cleanup()
919 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_cleanup_all()
921 spin_lock_bh(&ar->data_lock); in ath10k_peer_cleanup_all()
922 list_for_each_entry_safe(peer, tmp, &ar->peers, list) { in ath10k_peer_cleanup_all()
923 list_del(&peer->list); in ath10k_peer_cleanup_all()
927 for (i = 0; i < ARRAY_SIZE(ar->peer_map); i++) in ath10k_peer_cleanup_all()
928 ar->peer_map[i] = NULL; in ath10k_peer_cleanup_all()
930 spin_unlock_bh(&ar->data_lock); in ath10k_peer_cleanup_all()
932 ar->num_peers = 0; in ath10k_peer_cleanup_all()
933 ar->num_stations = 0; in ath10k_peer_cleanup_all()
945 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_tdls_peer_update()
949 ether_addr_copy(arg.addr, sta->addr); in ath10k_mac_tdls_peer_update()
951 cap.peer_max_sp = sta->max_sp; in ath10k_mac_tdls_peer_update()
952 cap.peer_uapsd_queues = sta->uapsd_queues; in ath10k_mac_tdls_peer_update()
955 !sta->tdls_initiator) in ath10k_mac_tdls_peer_update()
974 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_beacon_free()
976 lockdep_assert_held(&ar->data_lock); in ath10k_mac_vif_beacon_free()
978 if (!arvif->beacon) in ath10k_mac_vif_beacon_free()
981 if (!arvif->beacon_buf) in ath10k_mac_vif_beacon_free()
982 dma_unmap_single(ar->dev, ATH10K_SKB_CB(arvif->beacon)->paddr, in ath10k_mac_vif_beacon_free()
983 arvif->beacon->len, DMA_TO_DEVICE); in ath10k_mac_vif_beacon_free()
985 if (WARN_ON(arvif->beacon_state != ATH10K_BEACON_SCHEDULED && in ath10k_mac_vif_beacon_free()
986 arvif->beacon_state != ATH10K_BEACON_SENT)) in ath10k_mac_vif_beacon_free()
989 dev_kfree_skb_any(arvif->beacon); in ath10k_mac_vif_beacon_free()
991 arvif->beacon = NULL; in ath10k_mac_vif_beacon_free()
992 arvif->beacon_state = ATH10K_BEACON_SCHEDULED; in ath10k_mac_vif_beacon_free()
997 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_beacon_cleanup()
999 lockdep_assert_held(&ar->data_lock); in ath10k_mac_vif_beacon_cleanup()
1003 if (arvif->beacon_buf) { in ath10k_mac_vif_beacon_cleanup()
1004 if (ar->bus_param.dev_type == ATH10K_DEV_TYPE_HL) in ath10k_mac_vif_beacon_cleanup()
1005 kfree(arvif->beacon_buf); in ath10k_mac_vif_beacon_cleanup()
1007 dma_free_coherent(ar->dev, IEEE80211_MAX_FRAME_LEN, in ath10k_mac_vif_beacon_cleanup()
1008 arvif->beacon_buf, in ath10k_mac_vif_beacon_cleanup()
1009 arvif->beacon_paddr); in ath10k_mac_vif_beacon_cleanup()
1010 arvif->beacon_buf = NULL; in ath10k_mac_vif_beacon_cleanup()
1018 lockdep_assert_held(&ar->conf_mutex); in ath10k_vdev_setup_sync()
1020 if (test_bit(ATH10K_FLAG_CRASH_FLUSH, &ar->dev_flags)) in ath10k_vdev_setup_sync()
1021 return -ESHUTDOWN; in ath10k_vdev_setup_sync()
1023 time_left = wait_for_completion_timeout(&ar->vdev_setup_done, in ath10k_vdev_setup_sync()
1026 return -ETIMEDOUT; in ath10k_vdev_setup_sync()
1028 return ar->last_wmi_vdev_start_status; in ath10k_vdev_setup_sync()
1038 lockdep_assert_held(&ar->conf_mutex); in ath10k_monitor_vdev_start()
1040 ieee80211_iter_chan_contexts_atomic(ar->hw, in ath10k_monitor_vdev_start()
1044 return -ENOENT; in ath10k_monitor_vdev_start()
1046 channel = chandef->chan; in ath10k_monitor_vdev_start()
1049 arg.channel.freq = channel->center_freq; in ath10k_monitor_vdev_start()
1050 arg.channel.band_center_freq1 = chandef->center_freq1; in ath10k_monitor_vdev_start()
1051 arg.channel.band_center_freq2 = chandef->center_freq2; in ath10k_monitor_vdev_start()
1058 !!(channel->flags & IEEE80211_CHAN_RADAR); in ath10k_monitor_vdev_start()
1061 arg.channel.max_power = channel->max_power * 2; in ath10k_monitor_vdev_start()
1062 arg.channel.max_reg_power = channel->max_reg_power * 2; in ath10k_monitor_vdev_start()
1063 arg.channel.max_antenna_gain = channel->max_antenna_gain; in ath10k_monitor_vdev_start()
1065 reinit_completion(&ar->vdev_setup_done); in ath10k_monitor_vdev_start()
1066 reinit_completion(&ar->vdev_delete_done); in ath10k_monitor_vdev_start()
1082 ret = ath10k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr); in ath10k_monitor_vdev_start()
1089 ar->monitor_vdev_id = vdev_id; in ath10k_monitor_vdev_start()
1092 ar->monitor_vdev_id); in ath10k_monitor_vdev_start()
1096 ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id); in ath10k_monitor_vdev_start()
1099 ar->monitor_vdev_id, ret); in ath10k_monitor_vdev_start()
1108 lockdep_assert_held(&ar->conf_mutex); in ath10k_monitor_vdev_stop()
1110 ret = ath10k_wmi_vdev_down(ar, ar->monitor_vdev_id); in ath10k_monitor_vdev_stop()
1113 ar->monitor_vdev_id, ret); in ath10k_monitor_vdev_stop()
1115 reinit_completion(&ar->vdev_setup_done); in ath10k_monitor_vdev_stop()
1116 reinit_completion(&ar->vdev_delete_done); in ath10k_monitor_vdev_stop()
1118 ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id); in ath10k_monitor_vdev_stop()
1121 ar->monitor_vdev_id, ret); in ath10k_monitor_vdev_stop()
1126 ar->monitor_vdev_id, ret); in ath10k_monitor_vdev_stop()
1129 ar->monitor_vdev_id); in ath10k_monitor_vdev_stop()
1137 lockdep_assert_held(&ar->conf_mutex); in ath10k_monitor_vdev_create()
1139 if (ar->free_vdev_map == 0) { in ath10k_monitor_vdev_create()
1141 return -ENOMEM; in ath10k_monitor_vdev_create()
1144 bit = __ffs64(ar->free_vdev_map); in ath10k_monitor_vdev_create()
1146 ar->monitor_vdev_id = bit; in ath10k_monitor_vdev_create()
1148 ret = ath10k_wmi_vdev_create(ar, ar->monitor_vdev_id, in ath10k_monitor_vdev_create()
1150 0, ar->mac_addr); in ath10k_monitor_vdev_create()
1153 ar->monitor_vdev_id, ret); in ath10k_monitor_vdev_create()
1157 ar->free_vdev_map &= ~(1LL << ar->monitor_vdev_id); in ath10k_monitor_vdev_create()
1159 ar->monitor_vdev_id); in ath10k_monitor_vdev_create()
1168 lockdep_assert_held(&ar->conf_mutex); in ath10k_monitor_vdev_delete()
1170 ret = ath10k_wmi_vdev_delete(ar, ar->monitor_vdev_id); in ath10k_monitor_vdev_delete()
1173 ar->monitor_vdev_id, ret); in ath10k_monitor_vdev_delete()
1177 ar->free_vdev_map |= 1LL << ar->monitor_vdev_id; in ath10k_monitor_vdev_delete()
1180 ar->monitor_vdev_id); in ath10k_monitor_vdev_delete()
1188 lockdep_assert_held(&ar->conf_mutex); in ath10k_monitor_start()
1196 ret = ath10k_monitor_vdev_start(ar, ar->monitor_vdev_id); in ath10k_monitor_start()
1203 ar->monitor_started = true; in ath10k_monitor_start()
1213 lockdep_assert_held(&ar->conf_mutex); in ath10k_monitor_stop()
1227 ar->monitor_started = false; in ath10k_monitor_stop()
1247 if (ar->monitor_arvif) in ath10k_mac_monitor_vdev_is_needed()
1250 return ar->monitor || in ath10k_mac_monitor_vdev_is_needed()
1252 ar->running_fw->fw_file.fw_features) && in ath10k_mac_monitor_vdev_is_needed()
1253 (ar->filter_flags & FIF_OTHER_BSS)) || in ath10k_mac_monitor_vdev_is_needed()
1254 test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags); in ath10k_mac_monitor_vdev_is_needed()
1265 * case anyway since multi-channel DFS hasn't been tested at all. in ath10k_mac_monitor_vdev_is_allowed()
1267 if (test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags) && num_ctx > 1) in ath10k_mac_monitor_vdev_is_allowed()
1279 lockdep_assert_held(&ar->conf_mutex); in ath10k_monitor_recalc()
1286 ar->monitor_started, needed, allowed); in ath10k_monitor_recalc()
1289 if (ar->monitor_started) { in ath10k_monitor_recalc()
1299 return -EPERM; in ath10k_monitor_recalc()
1302 if (needed == ar->monitor_started) in ath10k_monitor_recalc()
1313 struct ath10k *ar = arvif->ar; in ath10k_mac_can_set_cts_prot()
1315 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_can_set_cts_prot()
1317 if (!arvif->is_started) { in ath10k_mac_can_set_cts_prot()
1327 struct ath10k *ar = arvif->ar; in ath10k_mac_set_cts_prot()
1330 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_set_cts_prot()
1332 vdev_param = ar->wmi.vdev_param->protection_mode; in ath10k_mac_set_cts_prot()
1335 arvif->vdev_id, arvif->use_cts_prot); in ath10k_mac_set_cts_prot()
1337 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_mac_set_cts_prot()
1338 arvif->use_cts_prot ? 1 : 0); in ath10k_mac_set_cts_prot()
1343 struct ath10k *ar = arvif->ar; in ath10k_recalc_rtscts_prot()
1346 lockdep_assert_held(&ar->conf_mutex); in ath10k_recalc_rtscts_prot()
1348 vdev_param = ar->wmi.vdev_param->enable_rtscts; in ath10k_recalc_rtscts_prot()
1352 if (arvif->num_legacy_stations > 0) in ath10k_recalc_rtscts_prot()
1360 arvif->vdev_id, rts_cts); in ath10k_recalc_rtscts_prot()
1362 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_recalc_rtscts_prot()
1370 lockdep_assert_held(&ar->conf_mutex); in ath10k_start_cac()
1372 set_bit(ATH10K_CAC_RUNNING, &ar->dev_flags); in ath10k_start_cac()
1377 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags); in ath10k_start_cac()
1382 ar->monitor_vdev_id); in ath10k_start_cac()
1389 lockdep_assert_held(&ar->conf_mutex); in ath10k_stop_cac()
1391 /* CAC is not running - do nothing */ in ath10k_stop_cac()
1392 if (!test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags)) in ath10k_stop_cac()
1395 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags); in ath10k_stop_cac()
1409 if (!*ret && conf->radar_enabled) in ath10k_mac_has_radar_iter()
1417 ieee80211_iter_chan_contexts_atomic(ar->hw, in ath10k_mac_has_radar_enabled()
1428 lockdep_assert_held(&ar->conf_mutex); in ath10k_recalc_radar_detection()
1435 if (ar->num_started_vdevs > 0) in ath10k_recalc_radar_detection()
1446 ieee80211_radar_detected(ar->hw); in ath10k_recalc_radar_detection()
1452 struct ath10k *ar = arvif->ar; in ath10k_vdev_stop()
1455 lockdep_assert_held(&ar->conf_mutex); in ath10k_vdev_stop()
1457 reinit_completion(&ar->vdev_setup_done); in ath10k_vdev_stop()
1458 reinit_completion(&ar->vdev_delete_done); in ath10k_vdev_stop()
1460 ret = ath10k_wmi_vdev_stop(ar, arvif->vdev_id); in ath10k_vdev_stop()
1463 arvif->vdev_id, ret); in ath10k_vdev_stop()
1470 arvif->vdev_id, ret); in ath10k_vdev_stop()
1474 WARN_ON(ar->num_started_vdevs == 0); in ath10k_vdev_stop()
1476 if (ar->num_started_vdevs != 0) { in ath10k_vdev_stop()
1477 ar->num_started_vdevs--; in ath10k_vdev_stop()
1488 struct ath10k *ar = arvif->ar; in ath10k_vdev_start_restart()
1492 lockdep_assert_held(&ar->conf_mutex); in ath10k_vdev_start_restart()
1494 reinit_completion(&ar->vdev_setup_done); in ath10k_vdev_start_restart()
1495 reinit_completion(&ar->vdev_delete_done); in ath10k_vdev_start_restart()
1497 arg.vdev_id = arvif->vdev_id; in ath10k_vdev_start_restart()
1498 arg.dtim_period = arvif->dtim_period; in ath10k_vdev_start_restart()
1499 arg.bcn_intval = arvif->beacon_interval; in ath10k_vdev_start_restart()
1501 arg.channel.freq = chandef->chan->center_freq; in ath10k_vdev_start_restart()
1502 arg.channel.band_center_freq1 = chandef->center_freq1; in ath10k_vdev_start_restart()
1503 arg.channel.band_center_freq2 = chandef->center_freq2; in ath10k_vdev_start_restart()
1507 arg.channel.max_power = chandef->chan->max_power * 2; in ath10k_vdev_start_restart()
1508 arg.channel.max_reg_power = chandef->chan->max_reg_power * 2; in ath10k_vdev_start_restart()
1509 arg.channel.max_antenna_gain = chandef->chan->max_antenna_gain; in ath10k_vdev_start_restart()
1511 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) { in ath10k_vdev_start_restart()
1512 arg.ssid = arvif->u.ap.ssid; in ath10k_vdev_start_restart()
1513 arg.ssid_len = arvif->u.ap.ssid_len; in ath10k_vdev_start_restart()
1514 arg.hidden_ssid = arvif->u.ap.hidden_ssid; in ath10k_vdev_start_restart()
1518 !!(chandef->chan->flags & IEEE80211_CHAN_RADAR); in ath10k_vdev_start_restart()
1519 } else if (arvif->vdev_type == WMI_VDEV_TYPE_IBSS) { in ath10k_vdev_start_restart()
1520 arg.ssid = arvif->vif->cfg.ssid; in ath10k_vdev_start_restart()
1521 arg.ssid_len = arvif->vif->cfg.ssid_len; in ath10k_vdev_start_restart()
1548 ar->num_started_vdevs++; in ath10k_vdev_start_restart()
1569 struct ath10k *ar = arvif->ar; in ath10k_mac_setup_bcn_p2p_ie()
1574 if (arvif->vif->type != NL80211_IFTYPE_AP || !arvif->vif->p2p) in ath10k_mac_setup_bcn_p2p_ie()
1577 mgmt = (void *)bcn->data; in ath10k_mac_setup_bcn_p2p_ie()
1579 mgmt->u.beacon.variable, in ath10k_mac_setup_bcn_p2p_ie()
1580 bcn->len - (mgmt->u.beacon.variable - in ath10k_mac_setup_bcn_p2p_ie()
1581 bcn->data)); in ath10k_mac_setup_bcn_p2p_ie()
1583 return -ENOENT; in ath10k_mac_setup_bcn_p2p_ie()
1585 ret = ath10k_wmi_p2p_go_bcn_ie(ar, arvif->vdev_id, p2p_ie); in ath10k_mac_setup_bcn_p2p_ie()
1588 arvif->vdev_id, ret); in ath10k_mac_setup_bcn_p2p_ie()
1603 if (WARN_ON(skb->len < ie_offset)) in ath10k_mac_remove_vendor_ie()
1604 return -EINVAL; in ath10k_mac_remove_vendor_ie()
1607 skb->data + ie_offset, in ath10k_mac_remove_vendor_ie()
1608 skb->len - ie_offset); in ath10k_mac_remove_vendor_ie()
1610 return -ENOENT; in ath10k_mac_remove_vendor_ie()
1613 end = skb->data + skb->len; in ath10k_mac_remove_vendor_ie()
1617 return -EINVAL; in ath10k_mac_remove_vendor_ie()
1619 memmove(ie, next, end - next); in ath10k_mac_remove_vendor_ie()
1620 skb_trim(skb, skb->len - len); in ath10k_mac_remove_vendor_ie()
1627 struct ath10k *ar = arvif->ar; in ath10k_mac_setup_bcn_tmpl()
1628 struct ieee80211_hw *hw = ar->hw; in ath10k_mac_setup_bcn_tmpl()
1629 struct ieee80211_vif *vif = arvif->vif; in ath10k_mac_setup_bcn_tmpl()
1634 if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map)) in ath10k_mac_setup_bcn_tmpl()
1637 if (arvif->vdev_type != WMI_VDEV_TYPE_AP && in ath10k_mac_setup_bcn_tmpl()
1638 arvif->vdev_type != WMI_VDEV_TYPE_IBSS) in ath10k_mac_setup_bcn_tmpl()
1644 return -EPERM; in ath10k_mac_setup_bcn_tmpl()
1662 ret = ath10k_wmi_bcn_tmpl(ar, arvif->vdev_id, offs.tim_offset, bcn, 0, in ath10k_mac_setup_bcn_tmpl()
1677 struct ath10k *ar = arvif->ar; in ath10k_mac_setup_prb_tmpl()
1678 struct ieee80211_hw *hw = ar->hw; in ath10k_mac_setup_prb_tmpl()
1679 struct ieee80211_vif *vif = arvif->vif; in ath10k_mac_setup_prb_tmpl()
1683 if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map)) in ath10k_mac_setup_prb_tmpl()
1686 if (arvif->vdev_type != WMI_VDEV_TYPE_AP) in ath10k_mac_setup_prb_tmpl()
1696 return -EPERM; in ath10k_mac_setup_prb_tmpl()
1699 ret = ath10k_wmi_prb_tmpl(ar, arvif->vdev_id, prb); in ath10k_mac_setup_prb_tmpl()
1713 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_fix_hidden_ssid()
1728 * since only wmi-tlv firmware are known to have beacon offload and in ath10k_mac_vif_fix_hidden_ssid()
1729 * wmi-tlv doesn't seem to misbehave like 10.2 wrt vdev restart in ath10k_mac_vif_fix_hidden_ssid()
1732 if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map)) in ath10k_mac_vif_fix_hidden_ssid()
1735 if (WARN_ON(!arvif->is_started)) in ath10k_mac_vif_fix_hidden_ssid()
1736 return -EINVAL; in ath10k_mac_vif_fix_hidden_ssid()
1738 if (WARN_ON(!arvif->is_up)) in ath10k_mac_vif_fix_hidden_ssid()
1739 return -EINVAL; in ath10k_mac_vif_fix_hidden_ssid()
1741 if (WARN_ON(ath10k_mac_vif_chan(arvif->vif, &def))) in ath10k_mac_vif_fix_hidden_ssid()
1742 return -EINVAL; in ath10k_mac_vif_fix_hidden_ssid()
1744 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id); in ath10k_mac_vif_fix_hidden_ssid()
1747 arvif->vdev_id, ret); in ath10k_mac_vif_fix_hidden_ssid()
1770 arvif->vdev_id, ret); in ath10k_mac_vif_fix_hidden_ssid()
1774 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid, in ath10k_mac_vif_fix_hidden_ssid()
1775 arvif->bssid); in ath10k_mac_vif_fix_hidden_ssid()
1778 arvif->vdev_id, ret); in ath10k_mac_vif_fix_hidden_ssid()
1788 struct ath10k *ar = arvif->ar; in ath10k_control_beaconing()
1791 lockdep_assert_held(&arvif->ar->conf_mutex); in ath10k_control_beaconing()
1793 if (!info->enable_beacon) { in ath10k_control_beaconing()
1794 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id); in ath10k_control_beaconing()
1797 arvif->vdev_id, ret); in ath10k_control_beaconing()
1799 arvif->is_up = false; in ath10k_control_beaconing()
1801 spin_lock_bh(&arvif->ar->data_lock); in ath10k_control_beaconing()
1803 spin_unlock_bh(&arvif->ar->data_lock); in ath10k_control_beaconing()
1808 arvif->tx_seq_no = 0x1000; in ath10k_control_beaconing()
1810 arvif->aid = 0; in ath10k_control_beaconing()
1811 ether_addr_copy(arvif->bssid, info->bssid); in ath10k_control_beaconing()
1813 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid, in ath10k_control_beaconing()
1814 arvif->bssid); in ath10k_control_beaconing()
1817 arvif->vdev_id, ret); in ath10k_control_beaconing()
1821 arvif->is_up = true; in ath10k_control_beaconing()
1826 arvif->vdev_id, ret); in ath10k_control_beaconing()
1830 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d up\n", arvif->vdev_id); in ath10k_control_beaconing()
1836 struct ath10k *ar = arvif->ar; in ath10k_control_ibss()
1840 lockdep_assert_held(&arvif->ar->conf_mutex); in ath10k_control_ibss()
1842 if (!vif->cfg.ibss_joined) { in ath10k_control_ibss()
1843 if (is_zero_ether_addr(arvif->bssid)) in ath10k_control_ibss()
1846 eth_zero_addr(arvif->bssid); in ath10k_control_ibss()
1851 vdev_param = arvif->ar->wmi.vdev_param->atim_window; in ath10k_control_ibss()
1852 ret = ath10k_wmi_vdev_set_param(arvif->ar, arvif->vdev_id, vdev_param, in ath10k_control_ibss()
1856 arvif->vdev_id, ret); in ath10k_control_ibss()
1861 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_recalc_ps_wake_threshold()
1866 lockdep_assert_held(&arvif->ar->conf_mutex); in ath10k_mac_vif_recalc_ps_wake_threshold()
1868 if (arvif->u.sta.uapsd) in ath10k_mac_vif_recalc_ps_wake_threshold()
1874 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param, value); in ath10k_mac_vif_recalc_ps_wake_threshold()
1877 value, arvif->vdev_id, ret); in ath10k_mac_vif_recalc_ps_wake_threshold()
1886 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_recalc_ps_poll_count()
1891 lockdep_assert_held(&arvif->ar->conf_mutex); in ath10k_mac_vif_recalc_ps_poll_count()
1893 if (arvif->u.sta.uapsd) in ath10k_mac_vif_recalc_ps_poll_count()
1899 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath10k_mac_vif_recalc_ps_poll_count()
1902 ath10k_warn(ar, "failed to submit ps poll count %u on vdev %i: %d\n", in ath10k_mac_vif_recalc_ps_poll_count()
1903 value, arvif->vdev_id, ret); in ath10k_mac_vif_recalc_ps_poll_count()
1915 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_num_vifs_started()
1917 list_for_each_entry(arvif, &ar->arvifs, list) in ath10k_mac_num_vifs_started()
1918 if (arvif->is_started) in ath10k_mac_num_vifs_started()
1926 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_setup_ps()
1927 struct ieee80211_vif *vif = arvif->vif; in ath10k_mac_vif_setup_ps()
1928 struct ieee80211_conf *conf = &ar->hw->conf; in ath10k_mac_vif_setup_ps()
1935 lockdep_assert_held(&arvif->ar->conf_mutex); in ath10k_mac_vif_setup_ps()
1937 if (arvif->vif->type != NL80211_IFTYPE_STATION) in ath10k_mac_vif_setup_ps()
1940 enable_ps = arvif->ps; in ath10k_mac_vif_setup_ps()
1944 ar->running_fw->fw_file.fw_features)) { in ath10k_mac_vif_setup_ps()
1946 arvif->vdev_id); in ath10k_mac_vif_setup_ps()
1950 if (!arvif->is_started) { in ath10k_mac_vif_setup_ps()
1953 * necessary if PS is disabled on a non-started vdev. Hence in ath10k_mac_vif_setup_ps()
1954 * force-enable PS for non-running vdevs. in ath10k_mac_vif_setup_ps()
1961 ps_timeout = conf->dynamic_ps_timeout; in ath10k_mac_vif_setup_ps()
1965 vif->bss_conf.beacon_int) / 1000; in ath10k_mac_vif_setup_ps()
1968 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param, in ath10k_mac_vif_setup_ps()
1972 arvif->vdev_id, ret); in ath10k_mac_vif_setup_ps()
1980 arvif->vdev_id, psmode ? "enable" : "disable"); in ath10k_mac_vif_setup_ps()
1982 ret = ath10k_wmi_set_psmode(ar, arvif->vdev_id, psmode); in ath10k_mac_vif_setup_ps()
1985 psmode, arvif->vdev_id, ret); in ath10k_mac_vif_setup_ps()
1994 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_disable_keepalive()
1998 lockdep_assert_held(&arvif->ar->conf_mutex); in ath10k_mac_vif_disable_keepalive()
2000 if (arvif->vdev_type != WMI_VDEV_TYPE_STA) in ath10k_mac_vif_disable_keepalive()
2003 if (!test_bit(WMI_SERVICE_STA_KEEP_ALIVE, ar->wmi.svc_map)) in ath10k_mac_vif_disable_keepalive()
2007 * Instead use the interval to disable the keepalive. in ath10k_mac_vif_disable_keepalive()
2009 arg.vdev_id = arvif->vdev_id; in ath10k_mac_vif_disable_keepalive()
2012 arg.interval = WMI_STA_KEEPALIVE_INTERVAL_DISABLE; in ath10k_mac_vif_disable_keepalive()
2017 arvif->vdev_id, ret); in ath10k_mac_vif_disable_keepalive()
2026 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_ap_csa_count_down()
2027 struct ieee80211_vif *vif = arvif->vif; in ath10k_mac_vif_ap_csa_count_down()
2030 lockdep_assert_held(&arvif->ar->conf_mutex); in ath10k_mac_vif_ap_csa_count_down()
2032 if (WARN_ON(!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map))) in ath10k_mac_vif_ap_csa_count_down()
2035 if (arvif->vdev_type != WMI_VDEV_TYPE_AP) in ath10k_mac_vif_ap_csa_count_down()
2038 if (!vif->bss_conf.csa_active) in ath10k_mac_vif_ap_csa_count_down()
2041 if (!arvif->is_up) in ath10k_mac_vif_ap_csa_count_down()
2065 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_ap_csa_work()
2067 mutex_lock(&ar->conf_mutex); in ath10k_mac_vif_ap_csa_work()
2069 mutex_unlock(&ar->conf_mutex); in ath10k_mac_vif_ap_csa_work()
2076 struct ieee80211_mgmt *mgmt = (void *)skb->data; in ath10k_mac_handle_beacon_iter()
2077 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_mac_handle_beacon_iter()
2079 if (vif->type != NL80211_IFTYPE_STATION) in ath10k_mac_handle_beacon_iter()
2082 if (!ether_addr_equal(mgmt->bssid, vif->bss_conf.bssid)) in ath10k_mac_handle_beacon_iter()
2085 cancel_delayed_work(&arvif->connection_loss_work); in ath10k_mac_handle_beacon_iter()
2090 ieee80211_iterate_active_interfaces_atomic(ar->hw, in ath10k_mac_handle_beacon()
2100 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_mac_handle_beacon_miss_iter()
2101 struct ath10k *ar = arvif->ar; in ath10k_mac_handle_beacon_miss_iter()
2102 struct ieee80211_hw *hw = ar->hw; in ath10k_mac_handle_beacon_miss_iter()
2104 if (arvif->vdev_id != *vdev_id) in ath10k_mac_handle_beacon_miss_iter()
2107 if (!arvif->is_up) in ath10k_mac_handle_beacon_miss_iter()
2117 ieee80211_queue_delayed_work(hw, &arvif->connection_loss_work, in ath10k_mac_handle_beacon_miss_iter()
2123 ieee80211_iterate_active_interfaces_atomic(ar->hw, in ath10k_mac_handle_beacon_miss()
2133 struct ieee80211_vif *vif = arvif->vif; in ath10k_mac_vif_sta_connection_loss_work()
2135 if (!arvif->is_up) in ath10k_mac_vif_sta_connection_loss_work()
2149 * interval is set too high (e.g. 5). The symptoms are firmware doesn't in ath10k_peer_assoc_h_listen_intval()
2156 if (vif->type == NL80211_IFTYPE_STATION) in ath10k_peer_assoc_h_listen_intval()
2159 return ar->hw->conf.listen_interval; in ath10k_peer_assoc_h_listen_intval()
2167 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_peer_assoc_h_basic()
2170 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_assoc_h_basic()
2172 if (vif->type == NL80211_IFTYPE_STATION) in ath10k_peer_assoc_h_basic()
2173 aid = vif->cfg.aid; in ath10k_peer_assoc_h_basic()
2175 aid = sta->aid; in ath10k_peer_assoc_h_basic()
2177 ether_addr_copy(arg->addr, sta->addr); in ath10k_peer_assoc_h_basic()
2178 arg->vdev_id = arvif->vdev_id; in ath10k_peer_assoc_h_basic()
2179 arg->peer_aid = aid; in ath10k_peer_assoc_h_basic()
2180 arg->peer_flags |= arvif->ar->wmi.peer_flags->auth; in ath10k_peer_assoc_h_basic()
2181 arg->peer_listen_intval = ath10k_peer_assoc_h_listen_intval(ar, vif); in ath10k_peer_assoc_h_basic()
2182 arg->peer_num_spatial_streams = 1; in ath10k_peer_assoc_h_basic()
2183 arg->peer_caps = vif->bss_conf.assoc_capability; in ath10k_peer_assoc_h_basic()
2191 struct ieee80211_bss_conf *info = &vif->bss_conf; in ath10k_peer_assoc_h_crypto()
2197 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_assoc_h_crypto()
2202 bss = cfg80211_get_bss(ar->hw->wiphy, def.chan, info->bssid, in ath10k_peer_assoc_h_crypto()
2203 vif->cfg.ssid_len ? vif->cfg.ssid : NULL, in ath10k_peer_assoc_h_crypto()
2204 vif->cfg.ssid_len, in ath10k_peer_assoc_h_crypto()
2212 ies = rcu_dereference(bss->ies); in ath10k_peer_assoc_h_crypto()
2216 ies->data, in ath10k_peer_assoc_h_crypto()
2217 ies->len); in ath10k_peer_assoc_h_crypto()
2219 cfg80211_put_bss(ar->hw->wiphy, bss); in ath10k_peer_assoc_h_crypto()
2225 arg->peer_flags |= ar->wmi.peer_flags->need_ptk_4_way; in ath10k_peer_assoc_h_crypto()
2230 arg->peer_flags |= ar->wmi.peer_flags->need_gtk_2_way; in ath10k_peer_assoc_h_crypto()
2233 if (sta->mfp && in ath10k_peer_assoc_h_crypto()
2235 ar->running_fw->fw_file.fw_features)) { in ath10k_peer_assoc_h_crypto()
2236 arg->peer_flags |= ar->wmi.peer_flags->pmf; in ath10k_peer_assoc_h_crypto()
2245 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_peer_assoc_h_rates()
2246 struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates; in ath10k_peer_assoc_h_rates()
2255 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_assoc_h_rates()
2260 band = def.chan->band; in ath10k_peer_assoc_h_rates()
2261 sband = ar->hw->wiphy->bands[band]; in ath10k_peer_assoc_h_rates()
2262 ratemask = sta->deflink.supp_rates[band]; in ath10k_peer_assoc_h_rates()
2263 ratemask &= arvif->bitrate_mask.control[band].legacy; in ath10k_peer_assoc_h_rates()
2264 rates = sband->bitrates; in ath10k_peer_assoc_h_rates()
2266 rateset->num_rates = 0; in ath10k_peer_assoc_h_rates()
2272 rate = ath10k_mac_bitrate_to_rate(rates->bitrate); in ath10k_peer_assoc_h_rates()
2273 rateset->rates[rateset->num_rates] = rate; in ath10k_peer_assoc_h_rates()
2274 rateset->num_rates++; in ath10k_peer_assoc_h_rates()
2307 const struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap; in ath10k_peer_assoc_h_ht()
2308 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_peer_assoc_h_ht()
2317 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_assoc_h_ht()
2322 if (!ht_cap->ht_supported) in ath10k_peer_assoc_h_ht()
2325 band = def.chan->band; in ath10k_peer_assoc_h_ht()
2326 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs; in ath10k_peer_assoc_h_ht()
2327 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs; in ath10k_peer_assoc_h_ht()
2333 arg->peer_flags |= ar->wmi.peer_flags->ht; in ath10k_peer_assoc_h_ht()
2334 arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR + in ath10k_peer_assoc_h_ht()
2335 ht_cap->ampdu_factor)) - 1; in ath10k_peer_assoc_h_ht()
2337 arg->peer_mpdu_density = in ath10k_peer_assoc_h_ht()
2338 ath10k_parse_mpdudensity(ht_cap->ampdu_density); in ath10k_peer_assoc_h_ht()
2340 arg->peer_ht_caps = ht_cap->cap; in ath10k_peer_assoc_h_ht()
2341 arg->peer_rate_caps |= WMI_RC_HT_FLAG; in ath10k_peer_assoc_h_ht()
2343 if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING) in ath10k_peer_assoc_h_ht()
2344 arg->peer_flags |= ar->wmi.peer_flags->ldbc; in ath10k_peer_assoc_h_ht()
2346 if (sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40) { in ath10k_peer_assoc_h_ht()
2347 arg->peer_flags |= ar->wmi.peer_flags->bw40; in ath10k_peer_assoc_h_ht()
2348 arg->peer_rate_caps |= WMI_RC_CW40_FLAG; in ath10k_peer_assoc_h_ht()
2351 if (arvif->bitrate_mask.control[band].gi != NL80211_TXRATE_FORCE_LGI) { in ath10k_peer_assoc_h_ht()
2352 if (ht_cap->cap & IEEE80211_HT_CAP_SGI_20) in ath10k_peer_assoc_h_ht()
2353 arg->peer_rate_caps |= WMI_RC_SGI_FLAG; in ath10k_peer_assoc_h_ht()
2355 if (ht_cap->cap & IEEE80211_HT_CAP_SGI_40) in ath10k_peer_assoc_h_ht()
2356 arg->peer_rate_caps |= WMI_RC_SGI_FLAG; in ath10k_peer_assoc_h_ht()
2359 if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) { in ath10k_peer_assoc_h_ht()
2360 arg->peer_rate_caps |= WMI_RC_TX_STBC_FLAG; in ath10k_peer_assoc_h_ht()
2361 arg->peer_flags |= ar->wmi.peer_flags->stbc; in ath10k_peer_assoc_h_ht()
2364 if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) { in ath10k_peer_assoc_h_ht()
2365 stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC; in ath10k_peer_assoc_h_ht()
2368 arg->peer_rate_caps |= stbc; in ath10k_peer_assoc_h_ht()
2369 arg->peer_flags |= ar->wmi.peer_flags->stbc; in ath10k_peer_assoc_h_ht()
2372 if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2]) in ath10k_peer_assoc_h_ht()
2373 arg->peer_rate_caps |= WMI_RC_TS_FLAG; in ath10k_peer_assoc_h_ht()
2374 else if (ht_cap->mcs.rx_mask[1]) in ath10k_peer_assoc_h_ht()
2375 arg->peer_rate_caps |= WMI_RC_DS_FLAG; in ath10k_peer_assoc_h_ht()
2378 if ((ht_cap->mcs.rx_mask[i / 8] & BIT(i % 8)) && in ath10k_peer_assoc_h_ht()
2381 arg->peer_ht_rates.rates[n++] = i; in ath10k_peer_assoc_h_ht()
2385 * This is a workaround for HT-enabled STAs which break the spec in ath10k_peer_assoc_h_ht()
2394 arg->peer_ht_rates.num_rates = 8; in ath10k_peer_assoc_h_ht()
2395 for (i = 0; i < arg->peer_ht_rates.num_rates; i++) in ath10k_peer_assoc_h_ht()
2396 arg->peer_ht_rates.rates[i] = i; in ath10k_peer_assoc_h_ht()
2398 arg->peer_ht_rates.num_rates = n; in ath10k_peer_assoc_h_ht()
2399 arg->peer_num_spatial_streams = min(sta->deflink.rx_nss, in ath10k_peer_assoc_h_ht()
2404 arg->addr, in ath10k_peer_assoc_h_ht()
2405 arg->peer_ht_rates.num_rates, in ath10k_peer_assoc_h_ht()
2406 arg->peer_num_spatial_streams); in ath10k_peer_assoc_h_ht()
2417 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_assoc_qos_ap()
2419 if (sta->wme && sta->uapsd_queues) { in ath10k_peer_assoc_qos_ap()
2421 sta->uapsd_queues, sta->max_sp); in ath10k_peer_assoc_qos_ap()
2423 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO) in ath10k_peer_assoc_qos_ap()
2426 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI) in ath10k_peer_assoc_qos_ap()
2429 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK) in ath10k_peer_assoc_qos_ap()
2432 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE) in ath10k_peer_assoc_qos_ap()
2436 if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP) in ath10k_peer_assoc_qos_ap()
2437 max_sp = sta->max_sp; in ath10k_peer_assoc_qos_ap()
2439 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id, in ath10k_peer_assoc_qos_ap()
2440 sta->addr, in ath10k_peer_assoc_qos_ap()
2445 arvif->vdev_id, ret); in ath10k_peer_assoc_qos_ap()
2449 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id, in ath10k_peer_assoc_qos_ap()
2450 sta->addr, in ath10k_peer_assoc_qos_ap()
2455 arvif->vdev_id, ret); in ath10k_peer_assoc_qos_ap()
2459 /* TODO setup this based on STA listen interval and in ath10k_peer_assoc_qos_ap()
2460 * beacon interval. Currently we don't know in ath10k_peer_assoc_qos_ap()
2461 * sta->listen_interval - mac80211 patch required. in ath10k_peer_assoc_qos_ap()
2464 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id, sta->addr, in ath10k_peer_assoc_qos_ap()
2469 arvif->vdev_id, ret); in ath10k_peer_assoc_qos_ap()
2491 idx_limit = fls(mcs_map) - 1; in ath10k_peer_assoc_h_vht_limit()
2493 idx_limit = -1; in ath10k_peer_assoc_h_vht_limit()
2507 case -1: in ath10k_peer_assoc_h_vht_limit()
2557 const struct ieee80211_sta_vht_cap *vht_cap = &sta->deflink.vht_cap; in ath10k_peer_assoc_h_vht()
2558 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_peer_assoc_h_vht()
2559 struct ath10k_hw_params *hw = &ar->hw_params; in ath10k_peer_assoc_h_vht()
2570 if (!vht_cap->vht_supported) in ath10k_peer_assoc_h_vht()
2573 band = def.chan->band; in ath10k_peer_assoc_h_vht()
2574 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs; in ath10k_peer_assoc_h_vht()
2579 arg->peer_flags |= ar->wmi.peer_flags->vht; in ath10k_peer_assoc_h_vht()
2581 if (def.chan->band == NL80211_BAND_2GHZ) in ath10k_peer_assoc_h_vht()
2582 arg->peer_flags |= ar->wmi.peer_flags->vht_2g; in ath10k_peer_assoc_h_vht()
2584 arg->peer_vht_caps = vht_cap->cap; in ath10k_peer_assoc_h_vht()
2586 ampdu_factor = (vht_cap->cap & in ath10k_peer_assoc_h_vht()
2590 /* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to in ath10k_peer_assoc_h_vht()
2592 * arg->peer_max_mpdu at this point contains HT max_mpdu so keep in ath10k_peer_assoc_h_vht()
2595 arg->peer_max_mpdu = max(arg->peer_max_mpdu, in ath10k_peer_assoc_h_vht()
2597 ampdu_factor)) - 1); in ath10k_peer_assoc_h_vht()
2599 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80) in ath10k_peer_assoc_h_vht()
2600 arg->peer_flags |= ar->wmi.peer_flags->bw80; in ath10k_peer_assoc_h_vht()
2602 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160) in ath10k_peer_assoc_h_vht()
2603 arg->peer_flags |= ar->wmi.peer_flags->bw160; in ath10k_peer_assoc_h_vht()
2609 vht_mcs = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map) >> in ath10k_peer_assoc_h_vht()
2616 arg->peer_num_spatial_streams = min(sta->deflink.rx_nss, max_nss); in ath10k_peer_assoc_h_vht()
2617 arg->peer_vht_rates.rx_max_rate = in ath10k_peer_assoc_h_vht()
2618 __le16_to_cpu(vht_cap->vht_mcs.rx_highest); in ath10k_peer_assoc_h_vht()
2619 arg->peer_vht_rates.rx_mcs_set = in ath10k_peer_assoc_h_vht()
2620 __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map); in ath10k_peer_assoc_h_vht()
2621 arg->peer_vht_rates.tx_max_rate = in ath10k_peer_assoc_h_vht()
2622 __le16_to_cpu(vht_cap->vht_mcs.tx_highest); in ath10k_peer_assoc_h_vht()
2623 arg->peer_vht_rates.tx_mcs_set = ath10k_peer_assoc_h_vht_limit( in ath10k_peer_assoc_h_vht()
2624 __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map), vht_mcs_mask); in ath10k_peer_assoc_h_vht()
2626 /* Configure bandwidth-NSS mapping to FW in ath10k_peer_assoc_h_vht()
2629 if (arg->peer_phymode == MODE_11AC_VHT160 || in ath10k_peer_assoc_h_vht()
2630 arg->peer_phymode == MODE_11AC_VHT80_80) { in ath10k_peer_assoc_h_vht()
2634 max_rate = arg->peer_vht_rates.rx_max_rate; in ath10k_peer_assoc_h_vht()
2638 rx_nss = arg->peer_num_spatial_streams; in ath10k_peer_assoc_h_vht()
2640 rx_nss = min(arg->peer_num_spatial_streams, rx_nss); in ath10k_peer_assoc_h_vht()
2642 max_rate = hw->vht160_mcs_tx_highest; in ath10k_peer_assoc_h_vht()
2645 arg->peer_bw_rxnss_override = in ath10k_peer_assoc_h_vht()
2647 FIELD_PREP(WMI_PEER_NSS_160MHZ_MASK, (rx_nss - 1)); in ath10k_peer_assoc_h_vht()
2649 if (arg->peer_phymode == MODE_11AC_VHT80_80) { in ath10k_peer_assoc_h_vht()
2650 arg->peer_bw_rxnss_override |= in ath10k_peer_assoc_h_vht()
2651 FIELD_PREP(WMI_PEER_NSS_80_80MHZ_MASK, (rx_nss - 1)); in ath10k_peer_assoc_h_vht()
2656 sta->addr, arg->peer_max_mpdu, in ath10k_peer_assoc_h_vht()
2657 arg->peer_flags, arg->peer_bw_rxnss_override); in ath10k_peer_assoc_h_vht()
2665 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_peer_assoc_h_qos()
2667 switch (arvif->vdev_type) { in ath10k_peer_assoc_h_qos()
2669 if (sta->wme) in ath10k_peer_assoc_h_qos()
2670 arg->peer_flags |= arvif->ar->wmi.peer_flags->qos; in ath10k_peer_assoc_h_qos()
2672 if (sta->wme && sta->uapsd_queues) { in ath10k_peer_assoc_h_qos()
2673 arg->peer_flags |= arvif->ar->wmi.peer_flags->apsd; in ath10k_peer_assoc_h_qos()
2674 arg->peer_rate_caps |= WMI_RC_UAPSD_FLAG; in ath10k_peer_assoc_h_qos()
2678 if (sta->wme) in ath10k_peer_assoc_h_qos()
2679 arg->peer_flags |= arvif->ar->wmi.peer_flags->qos; in ath10k_peer_assoc_h_qos()
2682 if (sta->wme) in ath10k_peer_assoc_h_qos()
2683 arg->peer_flags |= arvif->ar->wmi.peer_flags->qos; in ath10k_peer_assoc_h_qos()
2690 sta->addr, !!(arg->peer_flags & in ath10k_peer_assoc_h_qos()
2691 arvif->ar->wmi.peer_flags->qos)); in ath10k_peer_assoc_h_qos()
2696 return sta->deflink.supp_rates[NL80211_BAND_2GHZ] >> in ath10k_mac_sta_has_ofdm_only()
2703 struct ieee80211_sta_vht_cap *vht_cap = &sta->deflink.vht_cap; in ath10k_mac_get_phymode_vht()
2705 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160) { in ath10k_mac_get_phymode_vht()
2706 switch (vht_cap->cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK) { in ath10k_mac_get_phymode_vht()
2717 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80) in ath10k_mac_get_phymode_vht()
2720 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40) in ath10k_mac_get_phymode_vht()
2723 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_20) in ath10k_mac_get_phymode_vht()
2734 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_peer_assoc_h_phymode()
2744 band = def.chan->band; in ath10k_peer_assoc_h_phymode()
2745 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs; in ath10k_peer_assoc_h_phymode()
2746 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs; in ath10k_peer_assoc_h_phymode()
2750 if (sta->deflink.vht_cap.vht_supported && in ath10k_peer_assoc_h_phymode()
2752 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40) in ath10k_peer_assoc_h_phymode()
2756 } else if (sta->deflink.ht_cap.ht_supported && in ath10k_peer_assoc_h_phymode()
2758 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40) in ath10k_peer_assoc_h_phymode()
2773 if (sta->deflink.vht_cap.vht_supported && in ath10k_peer_assoc_h_phymode()
2776 } else if (sta->deflink.ht_cap.ht_supported && in ath10k_peer_assoc_h_phymode()
2778 if (sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40) in ath10k_peer_assoc_h_phymode()
2792 sta->addr, ath10k_wmi_phymode_str(phymode)); in ath10k_peer_assoc_h_phymode()
2794 arg->peer_phymode = phymode; in ath10k_peer_assoc_h_phymode()
2803 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_assoc_prepare()
2831 if (!ht_cap->ht_supported) in ath10k_setup_peer_smps()
2834 smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS; in ath10k_setup_peer_smps()
2838 return -EINVAL; in ath10k_setup_peer_smps()
2840 return ath10k_wmi_peer_set_param(ar, arvif->vdev_id, addr, in ath10k_setup_peer_smps()
2841 ar->wmi.peer_param->smps_state, in ath10k_setup_peer_smps()
2849 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_mac_vif_recalc_txbf()
2857 if (!(ar->vht_cap_info & in ath10k_mac_vif_recalc_txbf()
2864 param = ar->wmi.vdev_param->txbf; in ath10k_mac_vif_recalc_txbf()
2874 if (ar->vht_cap_info & in ath10k_mac_vif_recalc_txbf()
2884 if (ar->vht_cap_info & in ath10k_mac_vif_recalc_txbf()
2900 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param, value); in ath10k_mac_vif_recalc_txbf()
2914 list_for_each_entry(arvif, &ar->arvifs, list) { in ath10k_mac_is_connected()
2915 if (arvif->is_up && arvif->vdev_type == WMI_VDEV_TYPE_STA) in ath10k_mac_is_connected()
2929 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_txpower_setup()
2937 if (connected && ar->tx_power_2g_limit) in ath10k_mac_txpower_setup()
2938 if (tx_power_2g > ar->tx_power_2g_limit) in ath10k_mac_txpower_setup()
2939 tx_power_2g = ar->tx_power_2g_limit; in ath10k_mac_txpower_setup()
2941 if (connected && ar->tx_power_5g_limit) in ath10k_mac_txpower_setup()
2942 if (tx_power_5g > ar->tx_power_5g_limit) in ath10k_mac_txpower_setup()
2943 tx_power_5g = ar->tx_power_5g_limit; in ath10k_mac_txpower_setup()
2948 param = ar->wmi.pdev_param->txpower_limit2g; in ath10k_mac_txpower_setup()
2956 param = ar->wmi.pdev_param->txpower_limit5g; in ath10k_mac_txpower_setup()
2970 int ret, txpower = -1; in ath10k_mac_txpower_recalc()
2972 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_txpower_recalc()
2974 list_for_each_entry(arvif, &ar->arvifs, list) { in ath10k_mac_txpower_recalc()
2976 if (arvif->txpower == INT_MIN) in ath10k_mac_txpower_recalc()
2979 if (txpower == -1) in ath10k_mac_txpower_recalc()
2980 txpower = arvif->txpower; in ath10k_mac_txpower_recalc()
2982 txpower = min(txpower, arvif->txpower); in ath10k_mac_txpower_recalc()
2985 if (txpower == -1) in ath10k_mac_txpower_recalc()
3000 if (!ar->hw_params.dynamic_sar_support) in ath10k_mac_set_sar_power()
3001 return -EOPNOTSUPP; in ath10k_mac_set_sar_power()
3006 /* if connected, then arvif->txpower must be valid */ in ath10k_mac_set_sar_power()
3014 struct ath10k *ar = hw->priv; in ath10k_mac_set_sar_specs()
3018 mutex_lock(&ar->conf_mutex); in ath10k_mac_set_sar_specs()
3020 if (!ar->hw_params.dynamic_sar_support) { in ath10k_mac_set_sar_specs()
3021 ret = -EOPNOTSUPP; in ath10k_mac_set_sar_specs()
3025 if (!sar || sar->type != NL80211_SAR_TYPE_POWER || in ath10k_mac_set_sar_specs()
3026 sar->num_sub_specs == 0) { in ath10k_mac_set_sar_specs()
3027 ret = -EINVAL; in ath10k_mac_set_sar_specs()
3031 sub_specs = sar->sub_specs; in ath10k_mac_set_sar_specs()
3036 ar->tx_power_2g_limit = 0; in ath10k_mac_set_sar_specs()
3037 ar->tx_power_5g_limit = 0; in ath10k_mac_set_sar_specs()
3042 for (i = 0; i < sar->num_sub_specs; i++) { in ath10k_mac_set_sar_specs()
3043 if (sub_specs->freq_range_index == 0) in ath10k_mac_set_sar_specs()
3044 ar->tx_power_2g_limit = sub_specs->power / 2; in ath10k_mac_set_sar_specs()
3045 else if (sub_specs->freq_range_index == 1) in ath10k_mac_set_sar_specs()
3046 ar->tx_power_5g_limit = sub_specs->power / 2; in ath10k_mac_set_sar_specs()
3058 mutex_unlock(&ar->conf_mutex); in ath10k_mac_set_sar_specs()
3067 struct ath10k *ar = hw->priv; in ath10k_bss_assoc()
3068 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_bss_assoc()
3075 lockdep_assert_held(&ar->conf_mutex); in ath10k_bss_assoc()
3078 arvif->vdev_id, arvif->bssid, arvif->aid); in ath10k_bss_assoc()
3082 ap_sta = ieee80211_find_sta(vif, bss_conf->bssid); in ath10k_bss_assoc()
3085 bss_conf->bssid, arvif->vdev_id); in ath10k_bss_assoc()
3093 ht_cap = ap_sta->deflink.ht_cap; in ath10k_bss_assoc()
3094 vht_cap = ap_sta->deflink.vht_cap; in ath10k_bss_assoc()
3099 bss_conf->bssid, arvif->vdev_id, ret); in ath10k_bss_assoc()
3109 bss_conf->bssid, arvif->vdev_id, ret); in ath10k_bss_assoc()
3113 ret = ath10k_setup_peer_smps(ar, arvif, bss_conf->bssid, &ht_cap); in ath10k_bss_assoc()
3116 arvif->vdev_id, ret); in ath10k_bss_assoc()
3123 arvif->vdev_id, bss_conf->bssid, ret); in ath10k_bss_assoc()
3129 arvif->vdev_id, bss_conf->bssid, vif->cfg.aid); in ath10k_bss_assoc()
3131 WARN_ON(arvif->is_up); in ath10k_bss_assoc()
3133 arvif->aid = vif->cfg.aid; in ath10k_bss_assoc()
3134 ether_addr_copy(arvif->bssid, bss_conf->bssid); in ath10k_bss_assoc()
3137 ar->wmi.pdev_param->peer_stats_info_enable, 1); in ath10k_bss_assoc()
3141 ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid); in ath10k_bss_assoc()
3144 arvif->vdev_id, ret); in ath10k_bss_assoc()
3148 arvif->is_up = true; in ath10k_bss_assoc()
3153 * WLAN.RM.2.0-00073) have buggy powersave state machine and must be in ath10k_bss_assoc()
3156 ret = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, arvif->bssid, in ath10k_bss_assoc()
3157 ar->wmi.peer_param->dummy_var, 1); in ath10k_bss_assoc()
3160 arvif->bssid, arvif->vdev_id, ret); in ath10k_bss_assoc()
3168 struct ath10k *ar = hw->priv; in ath10k_bss_disassoc()
3169 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_bss_disassoc()
3173 lockdep_assert_held(&ar->conf_mutex); in ath10k_bss_disassoc()
3176 arvif->vdev_id, arvif->bssid); in ath10k_bss_disassoc()
3178 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id); in ath10k_bss_disassoc()
3181 arvif->vdev_id, ret); in ath10k_bss_disassoc()
3183 arvif->def_wep_key_idx = -1; in ath10k_bss_disassoc()
3188 arvif->vdev_id, ret); in ath10k_bss_disassoc()
3192 arvif->is_up = false; in ath10k_bss_disassoc()
3196 cancel_delayed_work_sync(&arvif->connection_loss_work); in ath10k_bss_disassoc()
3204 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv; in ath10k_new_peer_tid_config()
3210 if (arvif->retry_long[i] || arvif->ampdu[i] || in ath10k_new_peer_tid_config()
3211 arvif->rate_ctrl[i] || arvif->rtscts[i]) { in ath10k_new_peer_tid_config()
3214 arg.vdev_id = arvif->vdev_id; in ath10k_new_peer_tid_config()
3215 arg.retry_count = arvif->retry_long[i]; in ath10k_new_peer_tid_config()
3216 arg.aggr_control = arvif->ampdu[i]; in ath10k_new_peer_tid_config()
3217 arg.rate_ctrl = arvif->rate_ctrl[i]; in ath10k_new_peer_tid_config()
3218 arg.rcode_flags = arvif->rate_code[i]; in ath10k_new_peer_tid_config()
3220 if (arvif->rtscts[i]) in ath10k_new_peer_tid_config()
3226 arg.rtscts_ctrl = arvif->rtscts[i]; in ath10k_new_peer_tid_config()
3229 if (arvif->noack[i]) { in ath10k_new_peer_tid_config()
3230 arg.ack_policy = arvif->noack[i]; in ath10k_new_peer_tid_config()
3236 /* Assign default value(-1) to newly connected station. in ath10k_new_peer_tid_config()
3240 arsta->retry_long[i] = -1; in ath10k_new_peer_tid_config()
3241 arsta->noack[i] = -1; in ath10k_new_peer_tid_config()
3242 arsta->ampdu[i] = -1; in ath10k_new_peer_tid_config()
3247 ether_addr_copy(arg.peer_macaddr.addr, sta->addr); in ath10k_new_peer_tid_config()
3252 sta->addr, ret); in ath10k_new_peer_tid_config()
3267 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_station_assoc()
3271 lockdep_assert_held(&ar->conf_mutex); in ath10k_station_assoc()
3276 sta->addr, arvif->vdev_id, ret); in ath10k_station_assoc()
3283 sta->addr, arvif->vdev_id, ret); in ath10k_station_assoc()
3287 /* Re-assoc is run only to update supported rates for given station. It in ath10k_station_assoc()
3291 ret = ath10k_setup_peer_smps(ar, arvif, sta->addr, in ath10k_station_assoc()
3292 &sta->deflink.ht_cap); in ath10k_station_assoc()
3295 arvif->vdev_id, ret); in ath10k_station_assoc()
3302 sta->addr, arvif->vdev_id, ret); in ath10k_station_assoc()
3306 if (!sta->wme) { in ath10k_station_assoc()
3307 arvif->num_legacy_stations++; in ath10k_station_assoc()
3311 arvif->vdev_id, ret); in ath10k_station_assoc()
3317 if ((arvif->def_wep_key_idx != -1) && (!sta->tdls)) { in ath10k_station_assoc()
3318 ret = ath10k_install_peer_wep_keys(arvif, sta->addr); in ath10k_station_assoc()
3321 arvif->vdev_id, ret); in ath10k_station_assoc()
3327 if (!test_bit(WMI_SERVICE_PEER_TID_CONFIGS_SUPPORT, ar->wmi.svc_map)) in ath10k_station_assoc()
3337 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_station_disassoc()
3340 lockdep_assert_held(&ar->conf_mutex); in ath10k_station_disassoc()
3342 if (!sta->wme) { in ath10k_station_disassoc()
3343 arvif->num_legacy_stations--; in ath10k_station_disassoc()
3347 arvif->vdev_id, ret); in ath10k_station_disassoc()
3352 ret = ath10k_clear_peer_keys(arvif, sta->addr); in ath10k_station_disassoc()
3355 arvif->vdev_id, ret); in ath10k_station_disassoc()
3368 struct ieee80211_hw *hw = ar->hw; in ath10k_update_channel_list()
3379 lockdep_assert_held(&ar->conf_mutex); in ath10k_update_channel_list()
3381 bands = hw->wiphy->bands; in ath10k_update_channel_list()
3386 for (i = 0; i < bands[band]->n_channels; i++) { in ath10k_update_channel_list()
3387 if (bands[band]->channels[i].flags & in ath10k_update_channel_list()
3398 return -ENOMEM; in ath10k_update_channel_list()
3405 for (i = 0; i < bands[band]->n_channels; i++) { in ath10k_update_channel_list()
3406 channel = &bands[band]->channels[i]; in ath10k_update_channel_list()
3408 if (channel->flags & IEEE80211_CHAN_DISABLED) in ath10k_update_channel_list()
3411 ch->allow_ht = true; in ath10k_update_channel_list()
3414 ch->allow_vht = true; in ath10k_update_channel_list()
3416 ch->allow_ibss = in ath10k_update_channel_list()
3417 !(channel->flags & IEEE80211_CHAN_NO_IR); in ath10k_update_channel_list()
3419 ch->ht40plus = in ath10k_update_channel_list()
3420 !(channel->flags & IEEE80211_CHAN_NO_HT40PLUS); in ath10k_update_channel_list()
3422 ch->chan_radar = in ath10k_update_channel_list()
3423 !!(channel->flags & IEEE80211_CHAN_RADAR); in ath10k_update_channel_list()
3425 passive = channel->flags & IEEE80211_CHAN_NO_IR; in ath10k_update_channel_list()
3426 ch->passive = passive; in ath10k_update_channel_list()
3433 ch->passive |= ch->chan_radar; in ath10k_update_channel_list()
3435 ch->freq = channel->center_freq; in ath10k_update_channel_list()
3436 ch->band_center_freq1 = channel->center_freq; in ath10k_update_channel_list()
3437 ch->min_power = 0; in ath10k_update_channel_list()
3438 ch->max_power = channel->max_power * 2; in ath10k_update_channel_list()
3439 ch->max_reg_power = channel->max_reg_power * 2; in ath10k_update_channel_list()
3440 ch->max_antenna_gain = channel->max_antenna_gain; in ath10k_update_channel_list()
3441 ch->reg_class_id = 0; /* FIXME */ in ath10k_update_channel_list()
3447 if (channel->band == NL80211_BAND_2GHZ) in ath10k_update_channel_list()
3448 ch->mode = MODE_11G; in ath10k_update_channel_list()
3450 ch->mode = MODE_11A; in ath10k_update_channel_list()
3452 if (WARN_ON_ONCE(ch->mode == MODE_UNKNOWN)) in ath10k_update_channel_list()
3457 ch - arg.channels, arg.n_channels, in ath10k_update_channel_list()
3458 ch->freq, ch->max_power, ch->max_reg_power, in ath10k_update_channel_list()
3459 ch->max_antenna_gain, ch->mode); in ath10k_update_channel_list()
3494 lockdep_assert_held(&ar->conf_mutex); in ath10k_regd_update()
3500 regpair = ar->ath_common.regulatory.regpair; in ath10k_regd_update()
3502 if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) { in ath10k_regd_update()
3503 nl_dfs_reg = ar->dfs_detector->region; in ath10k_regd_update()
3509 /* Target allows setting up per-band regdomain but ath_common provides in ath10k_regd_update()
3513 regpair->reg_domain, in ath10k_regd_update()
3514 regpair->reg_domain, /* 2ghz */ in ath10k_regd_update()
3515 regpair->reg_domain, /* 5ghz */ in ath10k_regd_update()
3516 regpair->reg_2ghz_ctl, in ath10k_regd_update()
3517 regpair->reg_5ghz_ctl, in ath10k_regd_update()
3528 if (ar->low_5ghz_chan && ar->high_5ghz_chan) { in ath10k_mac_update_channel_list()
3529 for (i = 0; i < band->n_channels; i++) { in ath10k_mac_update_channel_list()
3530 if (band->channels[i].center_freq < ar->low_5ghz_chan || in ath10k_mac_update_channel_list()
3531 band->channels[i].center_freq > ar->high_5ghz_chan) in ath10k_mac_update_channel_list()
3532 band->channels[i].flags |= in ath10k_mac_update_channel_list()
3542 struct ath10k *ar = hw->priv; in ath10k_reg_notifier()
3545 ath_reg_notifier_apply(wiphy, request, &ar->ath_common.regulatory); in ath10k_reg_notifier()
3547 if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) { in ath10k_reg_notifier()
3549 request->dfs_region); in ath10k_reg_notifier()
3550 result = ar->dfs_detector->set_dfs_domain(ar->dfs_detector, in ath10k_reg_notifier()
3551 request->dfs_region); in ath10k_reg_notifier()
3554 request->dfs_region); in ath10k_reg_notifier()
3557 mutex_lock(&ar->conf_mutex); in ath10k_reg_notifier()
3558 if (ar->state == ATH10K_STATE_ON) in ath10k_reg_notifier()
3560 mutex_unlock(&ar->conf_mutex); in ath10k_reg_notifier()
3562 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) in ath10k_reg_notifier()
3564 ar->hw->wiphy->bands[NL80211_BAND_5GHZ]); in ath10k_reg_notifier()
3569 spin_lock_bh(&ar->data_lock); in ath10k_stop_radar_confirmation()
3570 ar->radar_conf_state = ATH10K_RADAR_CONFIRMATION_STOPPED; in ath10k_stop_radar_confirmation()
3571 spin_unlock_bh(&ar->data_lock); in ath10k_stop_radar_confirmation()
3573 cancel_work_sync(&ar->radar_confirmation_work); in ath10k_stop_radar_confirmation()
3589 lockdep_assert_held(&ar->htt.tx_lock); in ath10k_mac_tx_lock()
3592 ar->tx_paused |= BIT(reason); in ath10k_mac_tx_lock()
3593 ieee80211_stop_queues(ar->hw); in ath10k_mac_tx_lock()
3600 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_mac_tx_unlock_iter()
3602 if (arvif->tx_paused) in ath10k_mac_tx_unlock_iter()
3605 ieee80211_wake_queue(ar->hw, arvif->vdev_id); in ath10k_mac_tx_unlock_iter()
3610 lockdep_assert_held(&ar->htt.tx_lock); in ath10k_mac_tx_unlock()
3613 ar->tx_paused &= ~BIT(reason); in ath10k_mac_tx_unlock()
3615 if (ar->tx_paused) in ath10k_mac_tx_unlock()
3618 ieee80211_iterate_active_interfaces_atomic(ar->hw, in ath10k_mac_tx_unlock()
3623 ieee80211_wake_queue(ar->hw, ar->hw->offchannel_tx_hw_queue); in ath10k_mac_tx_unlock()
3628 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_tx_lock()
3630 lockdep_assert_held(&ar->htt.tx_lock); in ath10k_mac_vif_tx_lock()
3633 arvif->tx_paused |= BIT(reason); in ath10k_mac_vif_tx_lock()
3634 ieee80211_stop_queue(ar->hw, arvif->vdev_id); in ath10k_mac_vif_tx_lock()
3639 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_tx_unlock()
3641 lockdep_assert_held(&ar->htt.tx_lock); in ath10k_mac_vif_tx_unlock()
3644 arvif->tx_paused &= ~BIT(reason); in ath10k_mac_vif_tx_unlock()
3646 if (ar->tx_paused) in ath10k_mac_vif_tx_unlock()
3649 if (arvif->tx_paused) in ath10k_mac_vif_tx_unlock()
3652 ieee80211_wake_queue(ar->hw, arvif->vdev_id); in ath10k_mac_vif_tx_unlock()
3659 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_handle_tx_pause()
3661 lockdep_assert_held(&ar->htt.tx_lock); in ath10k_mac_vif_handle_tx_pause()
3673 action, arvif->vdev_id); in ath10k_mac_vif_handle_tx_pause()
3687 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_mac_handle_tx_pause_iter()
3690 if (arvif->vdev_id != arg->vdev_id) in ath10k_mac_handle_tx_pause_iter()
3693 ath10k_mac_vif_handle_tx_pause(arvif, arg->pause_id, arg->action); in ath10k_mac_handle_tx_pause_iter()
3706 spin_lock_bh(&ar->htt.tx_lock); in ath10k_mac_handle_tx_pause_vdev()
3707 ieee80211_iterate_active_interfaces_atomic(ar->hw, in ath10k_mac_handle_tx_pause_vdev()
3711 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_handle_tx_pause_vdev()
3720 const struct ieee80211_hdr *hdr = (void *)skb->data; in ath10k_mac_tx_h_get_txmode()
3722 __le16 fc = hdr->frame_control; in ath10k_mac_tx_h_get_txmode()
3724 if (IEEE80211_SKB_CB(skb)->flags & IEEE80211_TX_CTL_HW_80211_ENCAP) in ath10k_mac_tx_h_get_txmode()
3727 if (!vif || vif->type == NL80211_IFTYPE_MONITOR) in ath10k_mac_tx_h_get_txmode()
3737 * accurate - otherwise either mac80211 or userspace (e.g. hostapd) can in ath10k_mac_tx_h_get_txmode()
3749 if (ar->htt.target_version_major < 3 && in ath10k_mac_tx_h_get_txmode()
3752 ar->running_fw->fw_file.fw_features)) in ath10k_mac_tx_h_get_txmode()
3757 * Some wmi-tlv firmwares for qca6174 have broken Tx key selection for in ath10k_mac_tx_h_get_txmode()
3758 * NativeWifi txmode - it selects AP key instead of peer key. It seems in ath10k_mac_tx_h_get_txmode()
3763 if (ieee80211_is_data_present(fc) && sta && sta->tdls) in ath10k_mac_tx_h_get_txmode()
3766 if (test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags) || in ath10k_mac_tx_h_get_txmode()
3767 skb_cb->flags & ATH10K_SKB_F_RAW_TX) in ath10k_mac_tx_h_get_txmode()
3777 const struct ieee80211_hdr *hdr = (void *)skb->data; in ath10k_tx_h_use_hwcrypto()
3781 if (!ieee80211_has_protected(hdr->frame_control)) in ath10k_tx_h_use_hwcrypto()
3784 if ((info->flags & mask) == mask) in ath10k_tx_h_use_hwcrypto()
3788 return !((struct ath10k_vif *)vif->drv_priv)->nohwcrypt; in ath10k_tx_h_use_hwcrypto()
3798 struct ieee80211_hdr *hdr = (void *)skb->data; in ath10k_tx_h_nwifi()
3802 if (!ieee80211_is_data_qos(hdr->frame_control)) in ath10k_tx_h_nwifi()
3806 memmove(skb->data + IEEE80211_QOS_CTL_LEN, in ath10k_tx_h_nwifi()
3807 skb->data, (void *)qos_ctl - (void *)skb->data); in ath10k_tx_h_nwifi()
3814 hdr = (void *)skb->data; in ath10k_tx_h_nwifi()
3815 if (ieee80211_is_qos_nullfunc(hdr->frame_control)) in ath10k_tx_h_nwifi()
3816 cb->flags &= ~ATH10K_SKB_F_QOS; in ath10k_tx_h_nwifi()
3818 hdr->frame_control &= ~__cpu_to_le16(IEEE80211_STYPE_QOS_DATA); in ath10k_tx_h_nwifi()
3831 hdr = (void *)skb->data; in ath10k_tx_h_8023()
3832 hdrlen = ieee80211_hdrlen(hdr->frame_control); in ath10k_tx_h_8023()
3833 rfc1042 = (void *)skb->data + hdrlen; in ath10k_tx_h_8023()
3837 type = rfc1042->snap_type; in ath10k_tx_h_8023()
3842 eth = (void *)skb->data; in ath10k_tx_h_8023()
3843 ether_addr_copy(eth->h_dest, da); in ath10k_tx_h_8023()
3844 ether_addr_copy(eth->h_source, sa); in ath10k_tx_h_8023()
3845 eth->h_proto = type; in ath10k_tx_h_8023()
3852 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; in ath10k_tx_h_add_p2p_noa_ie()
3853 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_tx_h_add_p2p_noa_ie()
3856 if (vif->type != NL80211_IFTYPE_AP || !vif->p2p) in ath10k_tx_h_add_p2p_noa_ie()
3859 if (unlikely(ieee80211_is_probe_resp(hdr->frame_control))) { in ath10k_tx_h_add_p2p_noa_ie()
3860 spin_lock_bh(&ar->data_lock); in ath10k_tx_h_add_p2p_noa_ie()
3861 if (arvif->u.ap.noa_data) in ath10k_tx_h_add_p2p_noa_ie()
3862 if (!pskb_expand_head(skb, 0, arvif->u.ap.noa_len, in ath10k_tx_h_add_p2p_noa_ie()
3864 skb_put_data(skb, arvif->u.ap.noa_data, in ath10k_tx_h_add_p2p_noa_ie()
3865 arvif->u.ap.noa_len); in ath10k_tx_h_add_p2p_noa_ie()
3866 spin_unlock_bh(&ar->data_lock); in ath10k_tx_h_add_p2p_noa_ie()
3876 struct ieee80211_hdr *hdr = (void *)skb->data; in ath10k_mac_tx_h_fill_cb()
3879 bool is_data = ieee80211_is_data(hdr->frame_control) || in ath10k_mac_tx_h_fill_cb()
3880 ieee80211_is_data_qos(hdr->frame_control); in ath10k_mac_tx_h_fill_cb()
3881 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_mac_tx_h_fill_cb()
3886 cb->flags = 0; in ath10k_mac_tx_h_fill_cb()
3888 if (info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP) { in ath10k_mac_tx_h_fill_cb()
3889 cb->flags |= ATH10K_SKB_F_QOS; /* Assume data frames are QoS */ in ath10k_mac_tx_h_fill_cb()
3894 cb->flags |= ATH10K_SKB_F_NO_HWCRYPT; in ath10k_mac_tx_h_fill_cb()
3896 if (ieee80211_is_mgmt(hdr->frame_control)) in ath10k_mac_tx_h_fill_cb()
3897 cb->flags |= ATH10K_SKB_F_MGMT; in ath10k_mac_tx_h_fill_cb()
3899 if (ieee80211_is_data_qos(hdr->frame_control)) { in ath10k_mac_tx_h_fill_cb()
3900 cb->flags |= ATH10K_SKB_F_QOS; in ath10k_mac_tx_h_fill_cb()
3904 if (arvif->noack[tid] == WMI_PEER_TID_CONFIG_NOACK) in ath10k_mac_tx_h_fill_cb()
3908 arsta = (struct ath10k_sta *)sta->drv_priv; in ath10k_mac_tx_h_fill_cb()
3910 if (arsta->noack[tid] == WMI_PEER_TID_CONFIG_NOACK) in ath10k_mac_tx_h_fill_cb()
3913 if (arsta->noack[tid] == WMI_PEER_TID_CONFIG_ACK) in ath10k_mac_tx_h_fill_cb()
3918 cb->flags |= ATH10K_SKB_F_NOACK_TID; in ath10k_mac_tx_h_fill_cb()
3925 if (is_data && ieee80211_has_protected(hdr->frame_control) && in ath10k_mac_tx_h_fill_cb()
3926 !info->control.hw_key) { in ath10k_mac_tx_h_fill_cb()
3927 cb->flags |= ATH10K_SKB_F_NO_HWCRYPT; in ath10k_mac_tx_h_fill_cb()
3928 cb->flags |= ATH10K_SKB_F_RAW_TX; in ath10k_mac_tx_h_fill_cb()
3932 cb->vif = vif; in ath10k_mac_tx_h_fill_cb()
3933 cb->txq = txq; in ath10k_mac_tx_h_fill_cb()
3934 cb->airtime_est = airtime; in ath10k_mac_tx_h_fill_cb()
3936 arsta = (struct ath10k_sta *)sta->drv_priv; in ath10k_mac_tx_h_fill_cb()
3937 spin_lock_bh(&ar->data_lock); in ath10k_mac_tx_h_fill_cb()
3938 cb->ucast_cipher = arsta->ucast_cipher; in ath10k_mac_tx_h_fill_cb()
3939 spin_unlock_bh(&ar->data_lock); in ath10k_mac_tx_h_fill_cb()
3947 * offchannel tx (and actually creating them causes issues with wmi-htc in ath10k_mac_tx_frm_has_freq()
3951 return (ar->htt.target_version_major >= 3 && in ath10k_mac_tx_frm_has_freq()
3952 ar->htt.target_version_minor >= 4 && in ath10k_mac_tx_frm_has_freq()
3953 ar->running_fw->fw_file.htt_op_version == ATH10K_FW_HTT_OP_VERSION_TLV); in ath10k_mac_tx_frm_has_freq()
3958 struct sk_buff_head *q = &ar->wmi_mgmt_tx_queue; in ath10k_mac_tx_wmi_mgmt()
3962 return -ENOSPC; in ath10k_mac_tx_wmi_mgmt()
3966 ieee80211_queue_work(ar->hw, &ar->wmi_mgmt_tx_work); in ath10k_mac_tx_wmi_mgmt()
3983 ar->running_fw->fw_file.fw_features) || in ath10k_mac_tx_h_get_txpath()
3985 ar->wmi.svc_map)) in ath10k_mac_tx_h_get_txpath()
3987 else if (ar->htt.target_version_major >= 3) in ath10k_mac_tx_h_get_txpath()
4001 struct ath10k_htt *htt = &ar->htt; in ath10k_mac_tx_submit()
4002 int ret = -EINVAL; in ath10k_mac_tx_submit()
4016 ret = -EINVAL; in ath10k_mac_tx_submit()
4023 ieee80211_free_txskb(ar->hw, skb); in ath10k_mac_tx_submit()
4038 struct ieee80211_hw *hw = ar->hw; in ath10k_mac_tx()
4044 if (info->flags & IEEE80211_TX_CTL_NO_CCK_RATE) in ath10k_mac_tx()
4055 /* Convert 802.11->802.3 header only if the frame was earlier in ath10k_mac_tx()
4058 if (!(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP)) in ath10k_mac_tx()
4062 if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags) && in ath10k_mac_tx()
4063 !(skb_cb->flags & ATH10K_SKB_F_RAW_TX)) { in ath10k_mac_tx()
4066 return -ENOTSUPP; in ath10k_mac_tx()
4070 if (!noque_offchan && info->flags & IEEE80211_TX_CTL_TX_OFFCHAN) { in ath10k_mac_tx()
4073 skb, skb->len); in ath10k_mac_tx()
4075 skb_queue_tail(&ar->offchan_tx_queue, skb); in ath10k_mac_tx()
4076 ieee80211_queue_work(hw, &ar->offchan_tx_work); in ath10k_mac_tx()
4095 skb = skb_dequeue(&ar->offchan_tx_queue); in ath10k_offchan_tx_purge()
4099 ieee80211_free_txskb(ar->hw, skb); in ath10k_offchan_tx_purge()
4129 skb = skb_dequeue(&ar->offchan_tx_queue); in ath10k_offchan_tx_work()
4133 mutex_lock(&ar->conf_mutex); in ath10k_offchan_tx_work()
4136 skb, skb->len); in ath10k_offchan_tx_work()
4138 hdr = (struct ieee80211_hdr *)skb->data; in ath10k_offchan_tx_work()
4141 spin_lock_bh(&ar->data_lock); in ath10k_offchan_tx_work()
4142 vdev_id = ar->scan.vdev_id; in ath10k_offchan_tx_work()
4144 spin_unlock_bh(&ar->data_lock); in ath10k_offchan_tx_work()
4159 spin_lock_bh(&ar->data_lock); in ath10k_offchan_tx_work()
4160 reinit_completion(&ar->offchan_tx_completed); in ath10k_offchan_tx_work()
4161 ar->offchan_tx_skb = skb; in ath10k_offchan_tx_work()
4162 spin_unlock_bh(&ar->data_lock); in ath10k_offchan_tx_work()
4164 /* It's safe to access vif and sta - conf_mutex guarantees that in ath10k_offchan_tx_work()
4170 vif = arvif->vif; in ath10k_offchan_tx_work()
4188 wait_for_completion_timeout(&ar->offchan_tx_completed, 3 * HZ); in ath10k_offchan_tx_work()
4191 skb, skb->len); in ath10k_offchan_tx_work()
4200 mutex_unlock(&ar->conf_mutex); in ath10k_offchan_tx_work()
4209 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue); in ath10k_mgmt_over_wmi_tx_purge()
4213 ieee80211_free_txskb(ar->hw, skb); in ath10k_mgmt_over_wmi_tx_purge()
4225 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue); in ath10k_mgmt_over_wmi_tx_work()
4230 ar->running_fw->fw_file.fw_features)) { in ath10k_mgmt_over_wmi_tx_work()
4231 paddr = dma_map_single(ar->dev, skb->data, in ath10k_mgmt_over_wmi_tx_work()
4232 skb->len, DMA_TO_DEVICE); in ath10k_mgmt_over_wmi_tx_work()
4233 if (dma_mapping_error(ar->dev, paddr)) { in ath10k_mgmt_over_wmi_tx_work()
4234 ieee80211_free_txskb(ar->hw, skb); in ath10k_mgmt_over_wmi_tx_work()
4244 dma_unmap_single(ar->dev, paddr, skb->len, in ath10k_mgmt_over_wmi_tx_work()
4246 ieee80211_free_txskb(ar->hw, skb); in ath10k_mgmt_over_wmi_tx_work()
4253 ieee80211_free_txskb(ar->hw, skb); in ath10k_mgmt_over_wmi_tx_work()
4266 artxq = (void *)txq->drv_priv; in ath10k_mac_txq_init()
4267 INIT_LIST_HEAD(&artxq->list); in ath10k_mac_txq_init()
4279 spin_lock_bh(&ar->htt.tx_lock); in ath10k_mac_txq_unref()
4280 idr_for_each_entry(&ar->htt.pending_tx, msdu, msdu_id) { in ath10k_mac_txq_unref()
4282 if (cb->txq == txq) in ath10k_mac_txq_unref()
4283 cb->txq = NULL; in ath10k_mac_txq_unref()
4285 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_txq_unref()
4294 lockdep_assert_held(&ar->data_lock); in ath10k_mac_txq_lookup()
4296 peer = ar->peer_map[peer_id]; in ath10k_mac_txq_lookup()
4300 if (peer->removed) in ath10k_mac_txq_lookup()
4303 if (peer->sta) in ath10k_mac_txq_lookup()
4304 return peer->sta->txq[tid]; in ath10k_mac_txq_lookup()
4305 else if (peer->vif) in ath10k_mac_txq_lookup()
4306 return peer->vif->txq; in ath10k_mac_txq_lookup()
4314 struct ath10k *ar = hw->priv; in ath10k_mac_tx_can_push()
4315 struct ath10k_txq *artxq = (void *)txq->drv_priv; in ath10k_mac_tx_can_push()
4318 if (ar->htt.tx_q_state.mode == HTT_TX_MODE_SWITCH_PUSH) in ath10k_mac_tx_can_push()
4321 if (ar->htt.num_pending_tx < ar->htt.tx_q_state.num_push_allowed) in ath10k_mac_tx_can_push()
4324 if (artxq->num_fw_queued < artxq->num_push_allowed) in ath10k_mac_tx_can_push()
4346 if (!txq || !txq->sta) in ath10k_mac_update_airtime()
4349 if (test_bit(WMI_SERVICE_REPORT_AIRTIME, ar->wmi.svc_map)) in ath10k_mac_update_airtime()
4352 spin_lock_bh(&ar->data_lock); in ath10k_mac_update_airtime()
4353 arsta = (struct ath10k_sta *)txq->sta->drv_priv; in ath10k_mac_update_airtime()
4355 pktlen = skb->len + 38; /* Assume MAC header 30, SNAP 8 for most case */ in ath10k_mac_update_airtime()
4356 if (arsta->last_tx_bitrate) { in ath10k_mac_update_airtime()
4359 / arsta->last_tx_bitrate; in ath10k_mac_update_airtime()
4371 spin_unlock_bh(&ar->data_lock); in ath10k_mac_update_airtime()
4379 struct ath10k *ar = hw->priv; in ath10k_mac_tx_push_txq()
4380 struct ath10k_htt *htt = &ar->htt; in ath10k_mac_tx_push_txq()
4381 struct ath10k_txq *artxq = (void *)txq->drv_priv; in ath10k_mac_tx_push_txq()
4382 struct ieee80211_vif *vif = txq->vif; in ath10k_mac_tx_push_txq()
4383 struct ieee80211_sta *sta = txq->sta; in ath10k_mac_tx_push_txq()
4393 spin_lock_bh(&ar->htt.tx_lock); in ath10k_mac_tx_push_txq()
4395 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_tx_push_txq()
4402 spin_lock_bh(&ar->htt.tx_lock); in ath10k_mac_tx_push_txq()
4404 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_tx_push_txq()
4406 return -ENOENT; in ath10k_mac_tx_push_txq()
4412 skb_len = skb->len; in ath10k_mac_tx_push_txq()
4418 hdr = (struct ieee80211_hdr *)skb->data; in ath10k_mac_tx_push_txq()
4419 is_presp = ieee80211_is_probe_resp(hdr->frame_control); in ath10k_mac_tx_push_txq()
4421 spin_lock_bh(&ar->htt.tx_lock); in ath10k_mac_tx_push_txq()
4426 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_tx_push_txq()
4429 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_tx_push_txq()
4436 spin_lock_bh(&ar->htt.tx_lock); in ath10k_mac_tx_push_txq()
4440 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_tx_push_txq()
4445 spin_lock_bh(&ar->htt.tx_lock); in ath10k_mac_tx_push_txq()
4446 artxq->num_fw_queued++; in ath10k_mac_tx_push_txq()
4447 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_tx_push_txq()
4466 if (ret == -EBUSY) in ath10k_mac_schedule_txq()
4476 struct ieee80211_hw *hw = ar->hw; in ath10k_mac_tx_push_pending()
4479 if (ar->htt.tx_q_state.mode != HTT_TX_MODE_SWITCH_PUSH) in ath10k_mac_tx_push_pending()
4482 if (ar->htt.num_pending_tx >= (ar->htt.max_num_pending_tx / 2)) in ath10k_mac_tx_push_pending()
4487 if (ath10k_mac_schedule_txq(hw, ac) == -EBUSY) in ath10k_mac_tx_push_pending()
4500 lockdep_assert_held(&ar->data_lock); in __ath10k_scan_finish()
4502 switch (ar->scan.state) { in __ath10k_scan_finish()
4507 if (!ar->scan.is_roc) { in __ath10k_scan_finish()
4509 .aborted = (ar->scan.state == in __ath10k_scan_finish()
4513 ieee80211_scan_completed(ar->hw, &info); in __ath10k_scan_finish()
4514 } else if (ar->scan.roc_notify) { in __ath10k_scan_finish()
4515 ieee80211_remain_on_channel_expired(ar->hw); in __ath10k_scan_finish()
4519 ar->scan.state = ATH10K_SCAN_IDLE; in __ath10k_scan_finish()
4520 ar->scan_channel = NULL; in __ath10k_scan_finish()
4521 ar->scan.roc_freq = 0; in __ath10k_scan_finish()
4523 cancel_delayed_work(&ar->scan.timeout); in __ath10k_scan_finish()
4524 complete(&ar->scan.completed); in __ath10k_scan_finish()
4531 spin_lock_bh(&ar->data_lock); in ath10k_scan_finish()
4533 spin_unlock_bh(&ar->data_lock); in ath10k_scan_finish()
4545 lockdep_assert_held(&ar->conf_mutex); in ath10k_scan_stop()
4553 ret = wait_for_completion_timeout(&ar->scan.completed, 3 * HZ); in ath10k_scan_stop()
4556 ret = -ETIMEDOUT; in ath10k_scan_stop()
4569 spin_lock_bh(&ar->data_lock); in ath10k_scan_stop()
4570 if (ar->scan.state != ATH10K_SCAN_IDLE) in ath10k_scan_stop()
4572 spin_unlock_bh(&ar->data_lock); in ath10k_scan_stop()
4581 lockdep_assert_held(&ar->conf_mutex); in ath10k_scan_abort()
4583 spin_lock_bh(&ar->data_lock); in ath10k_scan_abort()
4585 switch (ar->scan.state) { in ath10k_scan_abort()
4594 ath10k_scan_state_str(ar->scan.state), in ath10k_scan_abort()
4595 ar->scan.state); in ath10k_scan_abort()
4598 ar->scan.state = ATH10K_SCAN_ABORTING; in ath10k_scan_abort()
4599 spin_unlock_bh(&ar->data_lock); in ath10k_scan_abort()
4605 spin_lock_bh(&ar->data_lock); in ath10k_scan_abort()
4609 spin_unlock_bh(&ar->data_lock); in ath10k_scan_abort()
4617 mutex_lock(&ar->conf_mutex); in ath10k_scan_timeout_work()
4619 mutex_unlock(&ar->conf_mutex); in ath10k_scan_timeout_work()
4627 lockdep_assert_held(&ar->conf_mutex); in ath10k_start_scan()
4633 ret = wait_for_completion_timeout(&ar->scan.started, 1 * HZ); in ath10k_start_scan()
4639 return -ETIMEDOUT; in ath10k_start_scan()
4646 spin_lock_bh(&ar->data_lock); in ath10k_start_scan()
4647 if (ar->scan.state == ATH10K_SCAN_IDLE) { in ath10k_start_scan()
4648 spin_unlock_bh(&ar->data_lock); in ath10k_start_scan()
4649 return -EINVAL; in ath10k_start_scan()
4651 spin_unlock_bh(&ar->data_lock); in ath10k_start_scan()
4664 struct ath10k *ar = hw->priv; in ath10k_mac_op_tx()
4665 struct ath10k_htt *htt = &ar->htt; in ath10k_mac_op_tx()
4667 struct ieee80211_vif *vif = info->control.vif; in ath10k_mac_op_tx()
4668 struct ieee80211_sta *sta = control->sta; in ath10k_mac_op_tx()
4689 spin_lock_bh(&ar->htt.tx_lock); in ath10k_mac_op_tx()
4690 if (!(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP)) { in ath10k_mac_op_tx()
4691 struct ieee80211_hdr *hdr = (void *)skb->data; in ath10k_mac_op_tx()
4693 is_presp = ieee80211_is_probe_resp(hdr->frame_control); in ath10k_mac_op_tx()
4700 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_op_tx()
4701 ieee80211_free_txskb(ar->hw, skb); in ath10k_mac_op_tx()
4710 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_op_tx()
4711 ieee80211_free_txskb(ar->hw, skb); in ath10k_mac_op_tx()
4714 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_op_tx()
4721 spin_lock_bh(&ar->htt.tx_lock); in ath10k_mac_op_tx()
4725 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_op_tx()
4734 struct ath10k *ar = hw->priv; in ath10k_mac_op_wake_tx_queue()
4736 u8 ac = txq->ac; in ath10k_mac_op_wake_tx_queue()
4739 if (ar->htt.tx_q_state.mode != HTT_TX_MODE_SWITCH_PUSH) in ath10k_mac_op_wake_tx_queue()
4742 spin_lock_bh(&ar->queue_lock[ac]); in ath10k_mac_op_wake_tx_queue()
4758 spin_unlock_bh(&ar->queue_lock[ac]); in ath10k_mac_op_wake_tx_queue()
4764 lockdep_assert_not_held(&ar->conf_mutex); in ath10k_drain_tx()
4766 /* make sure rcu-protected mac80211 tx path itself is drained */ in ath10k_drain_tx()
4772 cancel_work_sync(&ar->offchan_tx_work); in ath10k_drain_tx()
4773 cancel_work_sync(&ar->wmi_mgmt_tx_work); in ath10k_drain_tx()
4780 lockdep_assert_held(&ar->conf_mutex); in ath10k_halt()
4782 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags); in ath10k_halt()
4783 ar->filter_flags = 0; in ath10k_halt()
4784 ar->monitor = false; in ath10k_halt()
4785 ar->monitor_arvif = NULL; in ath10k_halt()
4787 if (ar->monitor_started) in ath10k_halt()
4790 ar->monitor_started = false; in ath10k_halt()
4791 ar->tx_paused = 0; in ath10k_halt()
4799 spin_lock_bh(&ar->data_lock); in ath10k_halt()
4800 list_for_each_entry(arvif, &ar->arvifs, list) in ath10k_halt()
4802 spin_unlock_bh(&ar->data_lock); in ath10k_halt()
4807 struct ath10k *ar = hw->priv; in ath10k_get_antenna()
4809 mutex_lock(&ar->conf_mutex); in ath10k_get_antenna()
4811 *tx_ant = ar->cfg_tx_chainmask; in ath10k_get_antenna()
4812 *rx_ant = ar->cfg_rx_chainmask; in ath10k_get_antenna()
4814 mutex_unlock(&ar->conf_mutex); in ath10k_get_antenna()
4819 static bool ath10k_check_chain_mask(struct ath10k *ar, u32 cm, const char *dbg) in ath10k_check_chain_mask() argument
4825 if (cm == 15 || cm == 7 || cm == 3 || cm == 1 || cm == 0) in ath10k_check_chain_mask()
4829 dbg, cm); in ath10k_check_chain_mask()
4835 int nsts = ar->vht_cap_info; in ath10k_mac_get_vht_cap_bf_sts()
4840 /* If firmware does not deliver to host number of space-time in ath10k_mac_get_vht_cap_bf_sts()
4842 * the value for VHT CAP: nsts-1) in ath10k_mac_get_vht_cap_bf_sts()
4852 int sound_dim = ar->vht_cap_info; in ath10k_mac_get_vht_cap_bf_sound_dim()
4869 struct ath10k_hw_params *hw = &ar->hw_params; in ath10k_create_vht_cap()
4875 vht_cap.cap = ar->vht_cap_info; in ath10k_create_vht_cap()
4877 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE | in ath10k_create_vht_cap()
4886 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE | in ath10k_create_vht_cap()
4897 if ((i < ar->num_rf_chains) && (ar->cfg_tx_chainmask & BIT(i))) in ath10k_create_vht_cap()
4903 if (ar->cfg_tx_chainmask <= 1) in ath10k_create_vht_cap()
4911 * user-space a clue if that is the case. in ath10k_create_vht_cap()
4914 (hw->vht160_mcs_rx_highest != 0 || in ath10k_create_vht_cap()
4915 hw->vht160_mcs_tx_highest != 0)) { in ath10k_create_vht_cap()
4916 vht_cap.vht_mcs.rx_highest = cpu_to_le16(hw->vht160_mcs_rx_highest); in ath10k_create_vht_cap()
4917 vht_cap.vht_mcs.tx_highest = cpu_to_le16(hw->vht160_mcs_tx_highest); in ath10k_create_vht_cap()
4928 if (!(ar->ht_cap_info & WMI_HT_CAP_ENABLED)) in ath10k_get_ht_cap()
4939 if (ar->ht_cap_info & WMI_HT_CAP_HT20_SGI) in ath10k_get_ht_cap()
4942 if (ar->ht_cap_info & WMI_HT_CAP_HT40_SGI) in ath10k_get_ht_cap()
4945 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) { in ath10k_get_ht_cap()
4954 if (ar->ht_cap_info & WMI_HT_CAP_TX_STBC && (ar->cfg_tx_chainmask > 1)) in ath10k_get_ht_cap()
4957 if (ar->ht_cap_info & WMI_HT_CAP_RX_STBC) { in ath10k_get_ht_cap()
4960 stbc = ar->ht_cap_info; in ath10k_get_ht_cap()
4969 if (ar->ht_cap_info & WMI_HT_CAP_LDPC || (ar->ht_cap_info & in ath10k_get_ht_cap()
4970 WMI_HT_CAP_RX_LDPC && (ar->ht_cap_info & WMI_HT_CAP_TX_LDPC))) in ath10k_get_ht_cap()
4973 if (ar->ht_cap_info & WMI_HT_CAP_L_SIG_TXOP_PROT) in ath10k_get_ht_cap()
4977 if (ar->vht_cap_info & WMI_VHT_CAP_MAX_MPDU_LEN_MASK) in ath10k_get_ht_cap()
4980 for (i = 0; i < ar->num_rf_chains; i++) { in ath10k_get_ht_cap()
4981 if (ar->cfg_rx_chainmask & BIT(i)) in ath10k_get_ht_cap()
4999 if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) { in ath10k_mac_setup_ht_vht_cap()
5000 band = &ar->mac.sbands[NL80211_BAND_2GHZ]; in ath10k_mac_setup_ht_vht_cap()
5001 band->ht_cap = ht_cap; in ath10k_mac_setup_ht_vht_cap()
5003 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) { in ath10k_mac_setup_ht_vht_cap()
5004 band = &ar->mac.sbands[NL80211_BAND_5GHZ]; in ath10k_mac_setup_ht_vht_cap()
5005 band->ht_cap = ht_cap; in ath10k_mac_setup_ht_vht_cap()
5006 band->vht_cap = vht_cap; in ath10k_mac_setup_ht_vht_cap()
5015 lockdep_assert_held(&ar->conf_mutex); in __ath10k_set_antenna()
5021 return -EINVAL; in __ath10k_set_antenna()
5023 ar->cfg_tx_chainmask = tx_ant; in __ath10k_set_antenna()
5024 ar->cfg_rx_chainmask = rx_ant; in __ath10k_set_antenna()
5026 if ((ar->state != ATH10K_STATE_ON) && in __ath10k_set_antenna()
5027 (ar->state != ATH10K_STATE_RESTARTED)) in __ath10k_set_antenna()
5030 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->tx_chain_mask, in __ath10k_set_antenna()
5033 ath10k_warn(ar, "failed to set tx-chainmask: %d, req 0x%x\n", in __ath10k_set_antenna()
5038 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->rx_chain_mask, in __ath10k_set_antenna()
5041 ath10k_warn(ar, "failed to set rx-chainmask: %d, req 0x%x\n", in __ath10k_set_antenna()
5054 struct ath10k *ar = hw->priv; in ath10k_set_antenna()
5057 mutex_lock(&ar->conf_mutex); in ath10k_set_antenna()
5059 mutex_unlock(&ar->conf_mutex); in ath10k_set_antenna()
5070 node = ar->dev->of_node; in __ath10k_fetch_bb_timing_dt()
5072 return -ENOENT; in __ath10k_fetch_bb_timing_dt()
5074 ret = of_property_read_string_index(node, "ext-fem-name", 0, &fem_name); in __ath10k_fetch_bb_timing_dt()
5076 return -ENOENT; in __ath10k_fetch_bb_timing_dt()
5083 if (!strcmp("microsemi-lx5586", fem_name)) { in __ath10k_fetch_bb_timing_dt()
5084 bb_timing->bb_tx_timing = 0x00; in __ath10k_fetch_bb_timing_dt()
5085 bb_timing->bb_xpa_timing = 0x0101; in __ath10k_fetch_bb_timing_dt()
5087 return -ENOENT; in __ath10k_fetch_bb_timing_dt()
5091 bb_timing->bb_tx_timing, bb_timing->bb_xpa_timing); in __ath10k_fetch_bb_timing_dt()
5100 if (ar->hw_values->rfkill_pin == 0) { in ath10k_mac_rfkill_config()
5102 return -EOPNOTSUPP; in ath10k_mac_rfkill_config()
5107 ar->hw_values->rfkill_pin, ar->hw_values->rfkill_cfg, in ath10k_mac_rfkill_config()
5108 ar->hw_values->rfkill_on_level); in ath10k_mac_rfkill_config()
5111 ar->hw_values->rfkill_on_level) | in ath10k_mac_rfkill_config()
5113 ar->hw_values->rfkill_pin) | in ath10k_mac_rfkill_config()
5115 ar->hw_values->rfkill_cfg); in ath10k_mac_rfkill_config()
5118 ar->wmi.pdev_param->rfkill_config, in ath10k_mac_rfkill_config()
5141 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->rfkill_enable, in ath10k_mac_rfkill_enable_radio()
5154 struct ath10k *ar = hw->priv; in ath10k_start()
5166 mutex_lock(&ar->conf_mutex); in ath10k_start()
5168 switch (ar->state) { in ath10k_start()
5170 ar->state = ATH10K_STATE_ON; in ath10k_start()
5173 ar->state = ATH10K_STATE_RESTARTED; in ath10k_start()
5179 ret = -EINVAL; in ath10k_start()
5182 ret = -EBUSY; in ath10k_start()
5186 spin_lock_bh(&ar->data_lock); in ath10k_start()
5188 if (ar->hw_rfkill_on) { in ath10k_start()
5189 ar->hw_rfkill_on = false; in ath10k_start()
5190 spin_unlock_bh(&ar->data_lock); in ath10k_start()
5194 spin_unlock_bh(&ar->data_lock); in ath10k_start()
5203 &ar->normal_mode_fw); in ath10k_start()
5209 if (ar->sys_cap_info & WMI_TLV_SYS_CAP_INFO_RFKILL) { in ath10k_start()
5211 if (ret && ret != -EOPNOTSUPP) { in ath10k_start()
5217 param = ar->wmi.pdev_param->pmf_qos; in ath10k_start()
5224 param = ar->wmi.pdev_param->dynamic_bw; in ath10k_start()
5231 if (test_bit(WMI_SERVICE_SPOOF_MAC_SUPPORT, ar->wmi.svc_map)) { in ath10k_start()
5232 ret = ath10k_wmi_scan_prob_req_oui(ar, ar->mac_addr); in ath10k_start()
5239 if (test_bit(WMI_SERVICE_ADAPTIVE_OCS, ar->wmi.svc_map)) { in ath10k_start()
5248 if (test_bit(WMI_SERVICE_BURST, ar->wmi.svc_map)) { in ath10k_start()
5249 param = ar->wmi.pdev_param->burst_enable; in ath10k_start()
5257 param = ar->wmi.pdev_param->idle_ps_config; in ath10k_start()
5259 if (ret && ret != -EOPNOTSUPP) { in ath10k_start()
5264 __ath10k_set_antenna(ar, ar->cfg_tx_chainmask, ar->cfg_rx_chainmask); in ath10k_start()
5275 param = ar->wmi.pdev_param->arp_ac_override; in ath10k_start()
5284 ar->running_fw->fw_file.fw_features)) { in ath10k_start()
5295 param = ar->wmi.pdev_param->ani_enable; in ath10k_start()
5303 ar->ani_enabled = true; in ath10k_start()
5306 param = ar->wmi.pdev_param->peer_stats_update_period; in ath10k_start()
5317 param = ar->wmi.pdev_param->enable_btcoex; in ath10k_start()
5318 if (test_bit(WMI_SERVICE_COEX_GPIO, ar->wmi.svc_map) && in ath10k_start()
5320 ar->running_fw->fw_file.fw_features) && in ath10k_start()
5321 ar->coex_support) { in ath10k_start()
5328 clear_bit(ATH10K_FLAG_BTCOEX, &ar->dev_flags); in ath10k_start()
5331 if (test_bit(WMI_SERVICE_BB_TIMING_CONFIG_SUPPORT, ar->wmi.svc_map)) { in ath10k_start()
5344 ar->num_started_vdevs = 0; in ath10k_start()
5350 ar->radar_conf_state = ATH10K_RADAR_CONFIRMATION_IDLE; in ath10k_start()
5352 mutex_unlock(&ar->conf_mutex); in ath10k_start()
5362 ar->state = ATH10K_STATE_OFF; in ath10k_start()
5365 mutex_unlock(&ar->conf_mutex); in ath10k_start()
5371 struct ath10k *ar = hw->priv; in ath10k_stop()
5376 mutex_lock(&ar->conf_mutex); in ath10k_stop()
5377 if (ar->state != ATH10K_STATE_OFF) { in ath10k_stop()
5378 if (!ar->hw_rfkill_on) { in ath10k_stop()
5384 if (ar->state != ATH10K_STATE_RESTARTING) { in ath10k_stop()
5395 ar->state = ATH10K_STATE_OFF; in ath10k_stop()
5397 mutex_unlock(&ar->conf_mutex); in ath10k_stop()
5399 cancel_work_sync(&ar->set_coverage_class_work); in ath10k_stop()
5400 cancel_delayed_work_sync(&ar->scan.timeout); in ath10k_stop()
5401 cancel_work_sync(&ar->restart_work); in ath10k_stop()
5409 lockdep_assert_held(&ar->conf_mutex); in ath10k_config_ps()
5411 list_for_each_entry(arvif, &ar->arvifs, list) { in ath10k_config_ps()
5424 struct ath10k *ar = hw->priv; in ath10k_config()
5425 struct ieee80211_conf *conf = &hw->conf; in ath10k_config()
5428 mutex_lock(&ar->conf_mutex); in ath10k_config()
5434 ar->monitor = conf->flags & IEEE80211_CONF_MONITOR; in ath10k_config()
5440 mutex_unlock(&ar->conf_mutex); in ath10k_config()
5458 struct ath10k *ar = arvif->ar; in ath10k_mac_set_txbf_conf()
5466 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE | in ath10k_mac_set_txbf_conf()
5471 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE | in ath10k_mac_set_txbf_conf()
5478 if (ar->vht_cap_info & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE) in ath10k_mac_set_txbf_conf()
5481 if (ar->vht_cap_info & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE) in ath10k_mac_set_txbf_conf()
5485 if (ar->vht_cap_info & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE) in ath10k_mac_set_txbf_conf()
5488 if (ar->vht_cap_info & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE) in ath10k_mac_set_txbf_conf()
5492 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, in ath10k_mac_set_txbf_conf()
5493 ar->wmi.vdev_param->txbf, value); in ath10k_mac_set_txbf_conf()
5499 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_update_vif_offload()
5500 struct ath10k *ar = hw->priv; in ath10k_update_vif_offload()
5505 ar->wmi.vdev_param->tx_encap_type == WMI_VDEV_PARAM_UNSUPPORTED || in ath10k_update_vif_offload()
5506 (vif->type != NL80211_IFTYPE_STATION && in ath10k_update_vif_offload()
5507 vif->type != NL80211_IFTYPE_AP)) in ath10k_update_vif_offload()
5508 vif->offload_flags &= ~IEEE80211_OFFLOAD_ENCAP_ENABLED; in ath10k_update_vif_offload()
5510 vdev_param = ar->wmi.vdev_param->tx_encap_type; in ath10k_update_vif_offload()
5511 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_update_vif_offload()
5514 if (ret && ret != -EOPNOTSUPP) { in ath10k_update_vif_offload()
5516 arvif->vdev_id, ret); in ath10k_update_vif_offload()
5530 struct ath10k *ar = hw->priv; in ath10k_add_interface()
5531 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_add_interface()
5540 vif->driver_flags |= IEEE80211_VIF_SUPPORTS_UAPSD; in ath10k_add_interface()
5542 mutex_lock(&ar->conf_mutex); in ath10k_add_interface()
5545 ath10k_mac_txq_init(vif->txq); in ath10k_add_interface()
5547 arvif->ar = ar; in ath10k_add_interface()
5548 arvif->vif = vif; in ath10k_add_interface()
5550 INIT_LIST_HEAD(&arvif->list); in ath10k_add_interface()
5551 INIT_WORK(&arvif->ap_csa_work, ath10k_mac_vif_ap_csa_work); in ath10k_add_interface()
5552 INIT_DELAYED_WORK(&arvif->connection_loss_work, in ath10k_add_interface()
5555 for (i = 0; i < ARRAY_SIZE(arvif->bitrate_mask.control); i++) { in ath10k_add_interface()
5556 arvif->bitrate_mask.control[i].legacy = 0xffffffff; in ath10k_add_interface()
5557 memset(arvif->bitrate_mask.control[i].ht_mcs, 0xff, in ath10k_add_interface()
5558 sizeof(arvif->bitrate_mask.control[i].ht_mcs)); in ath10k_add_interface()
5559 memset(arvif->bitrate_mask.control[i].vht_mcs, 0xff, in ath10k_add_interface()
5560 sizeof(arvif->bitrate_mask.control[i].vht_mcs)); in ath10k_add_interface()
5563 if (ar->num_peers >= ar->max_num_peers) { in ath10k_add_interface()
5565 ret = -ENOBUFS; in ath10k_add_interface()
5569 if (ar->free_vdev_map == 0) { in ath10k_add_interface()
5571 ret = -EBUSY; in ath10k_add_interface()
5574 bit = __ffs64(ar->free_vdev_map); in ath10k_add_interface()
5577 bit, ar->free_vdev_map); in ath10k_add_interface()
5579 arvif->vdev_id = bit; in ath10k_add_interface()
5580 arvif->vdev_subtype = in ath10k_add_interface()
5583 switch (vif->type) { in ath10k_add_interface()
5585 arvif->vdev_type = WMI_VDEV_TYPE_STA; in ath10k_add_interface()
5586 arvif->vdev_subtype = ath10k_wmi_get_vdev_subtype in ath10k_add_interface()
5591 arvif->vdev_type = WMI_VDEV_TYPE_STA; in ath10k_add_interface()
5592 if (vif->p2p) in ath10k_add_interface()
5593 arvif->vdev_subtype = ath10k_wmi_get_vdev_subtype in ath10k_add_interface()
5597 arvif->vdev_type = WMI_VDEV_TYPE_IBSS; in ath10k_add_interface()
5600 if (test_bit(WMI_SERVICE_MESH_11S, ar->wmi.svc_map)) { in ath10k_add_interface()
5601 arvif->vdev_subtype = ath10k_wmi_get_vdev_subtype in ath10k_add_interface()
5603 } else if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) { in ath10k_add_interface()
5604 ret = -EINVAL; in ath10k_add_interface()
5608 arvif->vdev_type = WMI_VDEV_TYPE_AP; in ath10k_add_interface()
5611 arvif->vdev_type = WMI_VDEV_TYPE_AP; in ath10k_add_interface()
5613 if (vif->p2p) in ath10k_add_interface()
5614 arvif->vdev_subtype = ath10k_wmi_get_vdev_subtype in ath10k_add_interface()
5618 arvif->vdev_type = WMI_VDEV_TYPE_MONITOR; in ath10k_add_interface()
5625 /* Using vdev_id as queue number will make it very easy to do per-vif in ath10k_add_interface()
5630 vif->cab_queue = arvif->vdev_id % (IEEE80211_MAX_QUEUES - 1); in ath10k_add_interface()
5631 for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++) in ath10k_add_interface()
5632 vif->hw_queue[i] = arvif->vdev_id % (IEEE80211_MAX_QUEUES - 1); in ath10k_add_interface()
5639 * On non-IOMMU-enabled hosts this could be a possible security issue in ath10k_add_interface()
5641 * IOMMU-enabled hosts DMAR faults would occur in most cases and target in ath10k_add_interface()
5646 * DMA-coherent buffer for a lifetime of a vif and use it for all in ath10k_add_interface()
5648 * become corrupted, e.g. have garbled IEs or out-of-date TIM bitmap. in ath10k_add_interface()
5650 if (vif->type == NL80211_IFTYPE_ADHOC || in ath10k_add_interface()
5651 vif->type == NL80211_IFTYPE_MESH_POINT || in ath10k_add_interface()
5652 vif->type == NL80211_IFTYPE_AP) { in ath10k_add_interface()
5653 if (ar->bus_param.dev_type == ATH10K_DEV_TYPE_HL) { in ath10k_add_interface()
5654 arvif->beacon_buf = kmalloc(IEEE80211_MAX_FRAME_LEN, in ath10k_add_interface()
5660 * known-invalid address token instead, which in ath10k_add_interface()
5664 arvif->beacon_paddr = DMA_MAPPING_ERROR; in ath10k_add_interface()
5666 arvif->beacon_buf = in ath10k_add_interface()
5667 dma_alloc_coherent(ar->dev, in ath10k_add_interface()
5669 &arvif->beacon_paddr, in ath10k_add_interface()
5672 if (!arvif->beacon_buf) { in ath10k_add_interface()
5673 ret = -ENOMEM; in ath10k_add_interface()
5679 if (test_bit(ATH10K_FLAG_HW_CRYPTO_DISABLED, &ar->dev_flags)) in ath10k_add_interface()
5680 arvif->nohwcrypt = true; in ath10k_add_interface()
5682 if (arvif->nohwcrypt && in ath10k_add_interface()
5683 !test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) { in ath10k_add_interface()
5684 ret = -EINVAL; in ath10k_add_interface()
5690 arvif->vdev_id, arvif->vdev_type, arvif->vdev_subtype, in ath10k_add_interface()
5691 arvif->beacon_buf ? "single-buf" : "per-skb"); in ath10k_add_interface()
5693 ret = ath10k_wmi_vdev_create(ar, arvif->vdev_id, arvif->vdev_type, in ath10k_add_interface()
5694 arvif->vdev_subtype, vif->addr); in ath10k_add_interface()
5697 arvif->vdev_id, ret); in ath10k_add_interface()
5702 ar->wmi.svc_map)) { in ath10k_add_interface()
5703 vdev_param = ar->wmi.vdev_param->disable_4addr_src_lrn; in ath10k_add_interface()
5704 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_add_interface()
5706 if (ret && ret != -EOPNOTSUPP) { in ath10k_add_interface()
5708 arvif->vdev_id, ret); in ath10k_add_interface()
5712 ar->free_vdev_map &= ~(1LL << arvif->vdev_id); in ath10k_add_interface()
5713 spin_lock_bh(&ar->data_lock); in ath10k_add_interface()
5714 list_add(&arvif->list, &ar->arvifs); in ath10k_add_interface()
5715 spin_unlock_bh(&ar->data_lock); in ath10k_add_interface()
5723 arvif->vdev_id, ret); in ath10k_add_interface()
5727 arvif->def_wep_key_idx = -1; in ath10k_add_interface()
5734 if (ar->cfg_tx_chainmask && (vif->type != NL80211_IFTYPE_MONITOR)) { in ath10k_add_interface()
5735 u16 nss = get_nss_from_chainmask(ar->cfg_tx_chainmask); in ath10k_add_interface()
5737 vdev_param = ar->wmi.vdev_param->nss; in ath10k_add_interface()
5738 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_add_interface()
5742 arvif->vdev_id, ar->cfg_tx_chainmask, nss, in ath10k_add_interface()
5748 if (arvif->vdev_type == WMI_VDEV_TYPE_AP || in ath10k_add_interface()
5749 arvif->vdev_type == WMI_VDEV_TYPE_IBSS) { in ath10k_add_interface()
5750 ret = ath10k_peer_create(ar, vif, NULL, arvif->vdev_id, in ath10k_add_interface()
5751 vif->addr, WMI_PEER_TYPE_DEFAULT); in ath10k_add_interface()
5754 arvif->vdev_id, ret); in ath10k_add_interface()
5758 spin_lock_bh(&ar->data_lock); in ath10k_add_interface()
5760 peer = ath10k_peer_find(ar, arvif->vdev_id, vif->addr); in ath10k_add_interface()
5763 vif->addr, arvif->vdev_id); in ath10k_add_interface()
5764 spin_unlock_bh(&ar->data_lock); in ath10k_add_interface()
5765 ret = -ENOENT; in ath10k_add_interface()
5769 arvif->peer_id = find_first_bit(peer->peer_ids, in ath10k_add_interface()
5772 spin_unlock_bh(&ar->data_lock); in ath10k_add_interface()
5774 arvif->peer_id = HTT_INVALID_PEERID; in ath10k_add_interface()
5777 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) { in ath10k_add_interface()
5781 arvif->vdev_id, ret); in ath10k_add_interface()
5786 if (arvif->vdev_type == WMI_VDEV_TYPE_STA) { in ath10k_add_interface()
5789 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath10k_add_interface()
5793 arvif->vdev_id, ret); in ath10k_add_interface()
5800 arvif->vdev_id, ret); in ath10k_add_interface()
5806 ath10k_warn(ar, "failed to recalc ps poll count on vdev %i: %d\n", in ath10k_add_interface()
5807 arvif->vdev_id, ret); in ath10k_add_interface()
5815 arvif->vdev_id, ret); in ath10k_add_interface()
5819 ret = ath10k_mac_set_rts(arvif, ar->hw->wiphy->rts_threshold); in ath10k_add_interface()
5822 arvif->vdev_id, ret); in ath10k_add_interface()
5826 arvif->txpower = vif->bss_conf.txpower; in ath10k_add_interface()
5833 if (test_bit(WMI_SERVICE_RTT_RESPONDER_ROLE, ar->wmi.svc_map)) { in ath10k_add_interface()
5834 vdev_param = ar->wmi.vdev_param->rtt_responder_role; in ath10k_add_interface()
5835 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_add_interface()
5836 arvif->ftm_responder); in ath10k_add_interface()
5839 if (ret && ret != -EOPNOTSUPP) in ath10k_add_interface()
5841 arvif->vdev_id, ret); in ath10k_add_interface()
5844 if (vif->type == NL80211_IFTYPE_MONITOR) { in ath10k_add_interface()
5845 ar->monitor_arvif = arvif; in ath10k_add_interface()
5853 spin_lock_bh(&ar->htt.tx_lock); in ath10k_add_interface()
5854 if (!ar->tx_paused) in ath10k_add_interface()
5855 ieee80211_wake_queue(ar->hw, arvif->vdev_id); in ath10k_add_interface()
5856 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_add_interface()
5858 mutex_unlock(&ar->conf_mutex); in ath10k_add_interface()
5862 if (arvif->vdev_type == WMI_VDEV_TYPE_AP || in ath10k_add_interface()
5863 arvif->vdev_type == WMI_VDEV_TYPE_IBSS) { in ath10k_add_interface()
5864 ath10k_wmi_peer_delete(ar, arvif->vdev_id, vif->addr); in ath10k_add_interface()
5865 ath10k_wait_for_peer_delete_done(ar, arvif->vdev_id, in ath10k_add_interface()
5866 vif->addr); in ath10k_add_interface()
5870 ath10k_wmi_vdev_delete(ar, arvif->vdev_id); in ath10k_add_interface()
5871 ar->free_vdev_map |= 1LL << arvif->vdev_id; in ath10k_add_interface()
5872 spin_lock_bh(&ar->data_lock); in ath10k_add_interface()
5873 list_del(&arvif->list); in ath10k_add_interface()
5874 spin_unlock_bh(&ar->data_lock); in ath10k_add_interface()
5877 if (arvif->beacon_buf) { in ath10k_add_interface()
5878 if (ar->bus_param.dev_type == ATH10K_DEV_TYPE_HL) in ath10k_add_interface()
5879 kfree(arvif->beacon_buf); in ath10k_add_interface()
5881 dma_free_coherent(ar->dev, IEEE80211_MAX_FRAME_LEN, in ath10k_add_interface()
5882 arvif->beacon_buf, in ath10k_add_interface()
5883 arvif->beacon_paddr); in ath10k_add_interface()
5884 arvif->beacon_buf = NULL; in ath10k_add_interface()
5887 mutex_unlock(&ar->conf_mutex); in ath10k_add_interface()
5903 struct ath10k *ar = hw->priv; in ath10k_remove_interface()
5904 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_remove_interface()
5910 cancel_work_sync(&arvif->ap_csa_work); in ath10k_remove_interface()
5911 cancel_delayed_work_sync(&arvif->connection_loss_work); in ath10k_remove_interface()
5913 mutex_lock(&ar->conf_mutex); in ath10k_remove_interface()
5918 arvif->vdev_id, ret); in ath10k_remove_interface()
5920 ar->free_vdev_map |= 1LL << arvif->vdev_id; in ath10k_remove_interface()
5921 spin_lock_bh(&ar->data_lock); in ath10k_remove_interface()
5922 list_del(&arvif->list); in ath10k_remove_interface()
5923 spin_unlock_bh(&ar->data_lock); in ath10k_remove_interface()
5925 if (arvif->vdev_type == WMI_VDEV_TYPE_AP || in ath10k_remove_interface()
5926 arvif->vdev_type == WMI_VDEV_TYPE_IBSS) { in ath10k_remove_interface()
5927 ret = ath10k_wmi_peer_delete(arvif->ar, arvif->vdev_id, in ath10k_remove_interface()
5928 vif->addr); in ath10k_remove_interface()
5930 ath10k_warn(ar, "failed to submit AP/IBSS self-peer removal on vdev %i: %d\n", in ath10k_remove_interface()
5931 arvif->vdev_id, ret); in ath10k_remove_interface()
5933 ath10k_wait_for_peer_delete_done(ar, arvif->vdev_id, in ath10k_remove_interface()
5934 vif->addr); in ath10k_remove_interface()
5935 kfree(arvif->u.ap.noa_data); in ath10k_remove_interface()
5939 arvif->vdev_id); in ath10k_remove_interface()
5941 ret = ath10k_wmi_vdev_delete(ar, arvif->vdev_id); in ath10k_remove_interface()
5944 arvif->vdev_id, ret); in ath10k_remove_interface()
5946 if (test_bit(WMI_SERVICE_SYNC_DELETE_CMDS, ar->wmi.svc_map)) { in ath10k_remove_interface()
5947 time_left = wait_for_completion_timeout(&ar->vdev_delete_done, in ath10k_remove_interface()
5955 /* Some firmware revisions don't notify host about self-peer removal in ath10k_remove_interface()
5958 if (arvif->vdev_type == WMI_VDEV_TYPE_AP || in ath10k_remove_interface()
5959 arvif->vdev_type == WMI_VDEV_TYPE_IBSS) { in ath10k_remove_interface()
5960 ret = ath10k_wait_for_peer_deleted(ar, arvif->vdev_id, in ath10k_remove_interface()
5961 vif->addr); in ath10k_remove_interface()
5963 ath10k_warn(ar, "failed to remove AP self-peer on vdev %i: %d\n", in ath10k_remove_interface()
5964 arvif->vdev_id, ret); in ath10k_remove_interface()
5966 spin_lock_bh(&ar->data_lock); in ath10k_remove_interface()
5967 ar->num_peers--; in ath10k_remove_interface()
5968 spin_unlock_bh(&ar->data_lock); in ath10k_remove_interface()
5971 spin_lock_bh(&ar->data_lock); in ath10k_remove_interface()
5972 for (i = 0; i < ARRAY_SIZE(ar->peer_map); i++) { in ath10k_remove_interface()
5973 peer = ar->peer_map[i]; in ath10k_remove_interface()
5977 if (peer->vif == vif) { in ath10k_remove_interface()
5979 vif->addr, arvif->vdev_id); in ath10k_remove_interface()
5980 peer->vif = NULL; in ath10k_remove_interface()
5988 spin_unlock_bh(&ar->data_lock); in ath10k_remove_interface()
5990 ath10k_peer_cleanup(ar, arvif->vdev_id); in ath10k_remove_interface()
5991 ath10k_mac_txq_unref(ar, vif->txq); in ath10k_remove_interface()
5993 if (vif->type == NL80211_IFTYPE_MONITOR) { in ath10k_remove_interface()
5994 ar->monitor_arvif = NULL; in ath10k_remove_interface()
6004 spin_lock_bh(&ar->htt.tx_lock); in ath10k_remove_interface()
6006 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_remove_interface()
6008 ath10k_mac_txq_unref(ar, vif->txq); in ath10k_remove_interface()
6011 mutex_unlock(&ar->conf_mutex); in ath10k_remove_interface()
6031 struct ath10k *ar = hw->priv; in ath10k_configure_filter()
6034 mutex_lock(&ar->conf_mutex); in ath10k_configure_filter()
6037 ar->filter_flags = *total_flags; in ath10k_configure_filter()
6043 mutex_unlock(&ar->conf_mutex); in ath10k_configure_filter()
6050 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_recalculate_mgmt_rate()
6058 lockdep_assert_held(&ar->conf_mutex); in ath10k_recalculate_mgmt_rate()
6060 sband = ar->hw->wiphy->bands[def->chan->band]; in ath10k_recalculate_mgmt_rate()
6061 basic_rate_idx = ffs(vif->bss_conf.basic_rates) - 1; in ath10k_recalculate_mgmt_rate()
6062 bitrate = sband->bitrates[basic_rate_idx].bitrate; in ath10k_recalculate_mgmt_rate()
6070 vdev_param = ar->wmi.vdev_param->mgmt_rate; in ath10k_recalculate_mgmt_rate()
6071 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_recalculate_mgmt_rate()
6082 struct ath10k *ar = hw->priv; in ath10k_bss_info_changed()
6083 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_bss_info_changed()
6091 mutex_lock(&ar->conf_mutex); in ath10k_bss_info_changed()
6097 arvif->beacon_interval = info->beacon_int; in ath10k_bss_info_changed()
6098 vdev_param = ar->wmi.vdev_param->beacon_interval; in ath10k_bss_info_changed()
6099 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_bss_info_changed()
6100 arvif->beacon_interval); in ath10k_bss_info_changed()
6103 arvif->vdev_id, arvif->beacon_interval); in ath10k_bss_info_changed()
6106 ath10k_warn(ar, "failed to set beacon interval for vdev %d: %i\n", in ath10k_bss_info_changed()
6107 arvif->vdev_id, ret); in ath10k_bss_info_changed()
6113 arvif->vdev_id); in ath10k_bss_info_changed()
6115 pdev_param = ar->wmi.pdev_param->beacon_tx_mode; in ath10k_bss_info_changed()
6120 arvif->vdev_id, ret); in ath10k_bss_info_changed()
6129 strncpy(arvif->u.ap.ssid, "mesh", in ath10k_bss_info_changed()
6130 sizeof(arvif->u.ap.ssid)); in ath10k_bss_info_changed()
6131 arvif->u.ap.ssid_len = 4; in ath10k_bss_info_changed()
6139 arvif->vdev_id, ret); in ath10k_bss_info_changed()
6143 arvif->dtim_period = info->dtim_period; in ath10k_bss_info_changed()
6147 arvif->vdev_id, arvif->dtim_period); in ath10k_bss_info_changed()
6149 vdev_param = ar->wmi.vdev_param->dtim_period; in ath10k_bss_info_changed()
6150 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_bss_info_changed()
6151 arvif->dtim_period); in ath10k_bss_info_changed()
6154 arvif->vdev_id, ret); in ath10k_bss_info_changed()
6158 vif->type == NL80211_IFTYPE_AP) { in ath10k_bss_info_changed()
6159 arvif->u.ap.ssid_len = vif->cfg.ssid_len; in ath10k_bss_info_changed()
6160 if (vif->cfg.ssid_len) in ath10k_bss_info_changed()
6161 memcpy(arvif->u.ap.ssid, vif->cfg.ssid, in ath10k_bss_info_changed()
6162 vif->cfg.ssid_len); in ath10k_bss_info_changed()
6163 arvif->u.ap.hidden_ssid = info->hidden_ssid; in ath10k_bss_info_changed()
6166 if (changed & BSS_CHANGED_BSSID && !is_zero_ether_addr(info->bssid)) in ath10k_bss_info_changed()
6167 ether_addr_copy(arvif->bssid, info->bssid); in ath10k_bss_info_changed()
6170 arvif->ftm_responder != info->ftm_responder && in ath10k_bss_info_changed()
6171 test_bit(WMI_SERVICE_RTT_RESPONDER_ROLE, ar->wmi.svc_map)) { in ath10k_bss_info_changed()
6172 arvif->ftm_responder = info->ftm_responder; in ath10k_bss_info_changed()
6174 vdev_param = ar->wmi.vdev_param->rtt_responder_role; in ath10k_bss_info_changed()
6175 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_bss_info_changed()
6176 arvif->ftm_responder); in ath10k_bss_info_changed()
6180 arvif->vdev_id, arvif->ftm_responder, ret); in ath10k_bss_info_changed()
6187 arvif->use_cts_prot = info->use_cts_prot; in ath10k_bss_info_changed()
6192 arvif->vdev_id, ret); in ath10k_bss_info_changed()
6198 arvif->vdev_id, ret); in ath10k_bss_info_changed()
6203 if (info->use_short_slot) in ath10k_bss_info_changed()
6210 arvif->vdev_id, slottime); in ath10k_bss_info_changed()
6212 vdev_param = ar->wmi.vdev_param->slot_time; in ath10k_bss_info_changed()
6213 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_bss_info_changed()
6217 arvif->vdev_id, ret); in ath10k_bss_info_changed()
6221 if (info->use_short_preamble) in ath10k_bss_info_changed()
6228 arvif->vdev_id, preamble); in ath10k_bss_info_changed()
6230 vdev_param = ar->wmi.vdev_param->preamble; in ath10k_bss_info_changed()
6231 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_bss_info_changed()
6235 arvif->vdev_id, ret); in ath10k_bss_info_changed()
6239 if (vif->cfg.assoc) { in ath10k_bss_info_changed()
6244 if (ar->monitor_started) in ath10k_bss_info_changed()
6255 arvif->vdev_id, info->txpower); in ath10k_bss_info_changed()
6257 arvif->txpower = info->txpower; in ath10k_bss_info_changed()
6264 arvif->ps = vif->cfg.ps; in ath10k_bss_info_changed()
6269 arvif->vdev_id, ret); in ath10k_bss_info_changed()
6273 !ath10k_mac_vif_chan(arvif->vif, &def)) { in ath10k_bss_info_changed()
6274 band = def.chan->band; in ath10k_bss_info_changed()
6275 mcast_rate = vif->bss_conf.mcast_rate[band]; in ath10k_bss_info_changed()
6277 rateidx = mcast_rate - 1; in ath10k_bss_info_changed()
6279 rateidx = ffs(vif->bss_conf.basic_rates) - 1; in ath10k_bss_info_changed()
6281 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) in ath10k_bss_info_changed()
6295 arvif->vdev_id, rate); in ath10k_bss_info_changed()
6297 vdev_param = ar->wmi.vdev_param->mcast_data_rate; in ath10k_bss_info_changed()
6298 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, in ath10k_bss_info_changed()
6303 arvif->vdev_id, ret); in ath10k_bss_info_changed()
6305 vdev_param = ar->wmi.vdev_param->bcast_data_rate; in ath10k_bss_info_changed()
6306 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, in ath10k_bss_info_changed()
6311 arvif->vdev_id, ret); in ath10k_bss_info_changed()
6315 !ath10k_mac_vif_chan(arvif->vif, &def)) in ath10k_bss_info_changed()
6318 mutex_unlock(&ar->conf_mutex); in ath10k_bss_info_changed()
6323 struct ath10k *ar = hw->priv; in ath10k_mac_op_set_coverage_class()
6328 if (!ar->hw_params.hw_ops->set_coverage_class) { in ath10k_mac_op_set_coverage_class()
6332 ar->hw_params.hw_ops->set_coverage_class(ar, value); in ath10k_mac_op_set_coverage_class()
6344 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv; in ath10k_mac_tdls_vif_stations_count_iter()
6345 struct ieee80211_vif *sta_vif = arsta->arvif->vif; in ath10k_mac_tdls_vif_stations_count_iter()
6347 if (sta->tdls && sta_vif == iter_data->curr_vif) in ath10k_mac_tdls_vif_stations_count_iter()
6348 iter_data->num_tdls_stations++; in ath10k_mac_tdls_vif_stations_count_iter()
6368 struct ath10k *ar = hw->priv; in ath10k_hw_scan()
6369 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_hw_scan()
6370 struct cfg80211_scan_request *req = &hw_req->req; in ath10k_hw_scan()
6376 mutex_lock(&ar->conf_mutex); in ath10k_hw_scan()
6379 ret = -EBUSY; in ath10k_hw_scan()
6383 spin_lock_bh(&ar->data_lock); in ath10k_hw_scan()
6384 switch (ar->scan.state) { in ath10k_hw_scan()
6386 reinit_completion(&ar->scan.started); in ath10k_hw_scan()
6387 reinit_completion(&ar->scan.completed); in ath10k_hw_scan()
6388 ar->scan.state = ATH10K_SCAN_STARTING; in ath10k_hw_scan()
6389 ar->scan.is_roc = false; in ath10k_hw_scan()
6390 ar->scan.vdev_id = arvif->vdev_id; in ath10k_hw_scan()
6396 ret = -EBUSY; in ath10k_hw_scan()
6399 spin_unlock_bh(&ar->data_lock); in ath10k_hw_scan()
6406 arg.vdev_id = arvif->vdev_id; in ath10k_hw_scan()
6409 if (req->ie_len) { in ath10k_hw_scan()
6410 arg.ie_len = req->ie_len; in ath10k_hw_scan()
6411 memcpy(arg.ie, req->ie, arg.ie_len); in ath10k_hw_scan()
6414 if (req->n_ssids) { in ath10k_hw_scan()
6415 arg.n_ssids = req->n_ssids; in ath10k_hw_scan()
6417 arg.ssids[i].len = req->ssids[i].ssid_len; in ath10k_hw_scan()
6418 arg.ssids[i].ssid = req->ssids[i].ssid; in ath10k_hw_scan()
6424 if (req->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) { in ath10k_hw_scan()
6426 ether_addr_copy(arg.mac_addr.addr, req->mac_addr); in ath10k_hw_scan()
6427 ether_addr_copy(arg.mac_mask.addr, req->mac_addr_mask); in ath10k_hw_scan()
6430 if (req->n_channels) { in ath10k_hw_scan()
6431 arg.n_channels = req->n_channels; in ath10k_hw_scan()
6433 arg.channels[i] = req->channels[i]->center_freq; in ath10k_hw_scan()
6437 if (req->duration) { in ath10k_hw_scan()
6438 arg.dwell_time_active = req->duration; in ath10k_hw_scan()
6439 arg.dwell_time_passive = req->duration; in ath10k_hw_scan()
6440 arg.burst_duration_ms = req->duration; in ath10k_hw_scan()
6443 (arg.n_channels - 1) + (req->duration + in ath10k_hw_scan()
6456 spin_lock_bh(&ar->data_lock); in ath10k_hw_scan()
6457 ar->scan.state = ATH10K_SCAN_IDLE; in ath10k_hw_scan()
6458 spin_unlock_bh(&ar->data_lock); in ath10k_hw_scan()
6461 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout, in ath10k_hw_scan()
6465 mutex_unlock(&ar->conf_mutex); in ath10k_hw_scan()
6472 struct ath10k *ar = hw->priv; in ath10k_cancel_hw_scan()
6474 mutex_lock(&ar->conf_mutex); in ath10k_cancel_hw_scan()
6476 mutex_unlock(&ar->conf_mutex); in ath10k_cancel_hw_scan()
6478 cancel_delayed_work_sync(&ar->scan.timeout); in ath10k_cancel_hw_scan()
6486 u32 vdev_param = arvif->ar->wmi.vdev_param->def_keyid; in ath10k_set_key_h_def_keyidx()
6491 * frames with multi-vif APs. This is not required for main firmware in ath10k_set_key_h_def_keyidx()
6494 * This is also needed for 636 fw for IBSS-RSN to work more reliably. in ath10k_set_key_h_def_keyidx()
6496 * FIXME: It remains unknown if this is required for multi-vif STA in ath10k_set_key_h_def_keyidx()
6500 if (arvif->vdev_type != WMI_VDEV_TYPE_AP && in ath10k_set_key_h_def_keyidx()
6501 arvif->vdev_type != WMI_VDEV_TYPE_IBSS) in ath10k_set_key_h_def_keyidx()
6504 if (key->cipher == WLAN_CIPHER_SUITE_WEP40) in ath10k_set_key_h_def_keyidx()
6507 if (key->cipher == WLAN_CIPHER_SUITE_WEP104) in ath10k_set_key_h_def_keyidx()
6510 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) in ath10k_set_key_h_def_keyidx()
6516 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_set_key_h_def_keyidx()
6517 key->keyidx); in ath10k_set_key_h_def_keyidx()
6520 arvif->vdev_id, ret); in ath10k_set_key_h_def_keyidx()
6527 struct ath10k *ar = hw->priv; in ath10k_set_key()
6528 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_set_key()
6532 bool is_wep = key->cipher == WLAN_CIPHER_SUITE_WEP40 || in ath10k_set_key()
6533 key->cipher == WLAN_CIPHER_SUITE_WEP104; in ath10k_set_key()
6540 if (key->cipher == WLAN_CIPHER_SUITE_AES_CMAC || in ath10k_set_key()
6541 key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_128 || in ath10k_set_key()
6542 key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_256 || in ath10k_set_key()
6543 key->cipher == WLAN_CIPHER_SUITE_BIP_CMAC_256) in ath10k_set_key()
6546 if (arvif->nohwcrypt) in ath10k_set_key()
6549 if (key->keyidx > WMI_MAX_KEY_INDEX) in ath10k_set_key()
6550 return -ENOSPC; in ath10k_set_key()
6552 mutex_lock(&ar->conf_mutex); in ath10k_set_key()
6555 arsta = (struct ath10k_sta *)sta->drv_priv; in ath10k_set_key()
6556 peer_addr = sta->addr; in ath10k_set_key()
6557 spin_lock_bh(&ar->data_lock); in ath10k_set_key()
6558 arsta->ucast_cipher = key->cipher; in ath10k_set_key()
6559 spin_unlock_bh(&ar->data_lock); in ath10k_set_key()
6560 } else if (arvif->vdev_type == WMI_VDEV_TYPE_STA) { in ath10k_set_key()
6561 peer_addr = vif->bss_conf.bssid; in ath10k_set_key()
6563 peer_addr = vif->addr; in ath10k_set_key()
6566 key->hw_key_idx = key->keyidx; in ath10k_set_key()
6570 arvif->wep_keys[key->keyidx] = key; in ath10k_set_key()
6572 arvif->wep_keys[key->keyidx] = NULL; in ath10k_set_key()
6575 /* the peer should not disappear in mid-way (unless FW goes awry) since in ath10k_set_key()
6578 spin_lock_bh(&ar->data_lock); in ath10k_set_key()
6579 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr); in ath10k_set_key()
6580 spin_unlock_bh(&ar->data_lock); in ath10k_set_key()
6584 ath10k_warn(ar, "failed to install key for non-existent peer %pM\n", in ath10k_set_key()
6586 ret = -EOPNOTSUPP; in ath10k_set_key()
6594 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) in ath10k_set_key()
6605 * keys. Static WEP needs an explicit per-peer key upload. in ath10k_set_key()
6607 if (vif->type == NL80211_IFTYPE_ADHOC && in ath10k_set_key()
6617 if (cmd == SET_KEY && arvif->def_wep_key_idx == -1) in ath10k_set_key()
6625 arvif->vdev_id, peer_addr, ret); in ath10k_set_key()
6632 if (is_wep && !sta && vif->type == NL80211_IFTYPE_STATION) { in ath10k_set_key()
6641 arvif->vdev_id, peer_addr, ret); in ath10k_set_key()
6647 arvif->vdev_id, peer_addr, ret2); in ath10k_set_key()
6655 spin_lock_bh(&ar->data_lock); in ath10k_set_key()
6656 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr); in ath10k_set_key()
6658 peer->keys[key->keyidx] = key; in ath10k_set_key()
6660 peer->keys[key->keyidx] = NULL; in ath10k_set_key()
6664 spin_unlock_bh(&ar->data_lock); in ath10k_set_key()
6666 if (sta && sta->tdls) in ath10k_set_key()
6667 ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr, in ath10k_set_key()
6668 ar->wmi.peer_param->authorize, 1); in ath10k_set_key()
6669 else if (sta && cmd == SET_KEY && (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)) in ath10k_set_key()
6670 ath10k_wmi_peer_set_param(ar, arvif->vdev_id, peer_addr, in ath10k_set_key()
6671 ar->wmi.peer_param->authorize, 1); in ath10k_set_key()
6674 mutex_unlock(&ar->conf_mutex); in ath10k_set_key()
6682 struct ath10k *ar = hw->priv; in ath10k_set_default_unicast_key()
6683 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_set_default_unicast_key()
6686 mutex_lock(&arvif->ar->conf_mutex); in ath10k_set_default_unicast_key()
6688 if (arvif->ar->state != ATH10K_STATE_ON) in ath10k_set_default_unicast_key()
6692 arvif->vdev_id, keyidx); in ath10k_set_default_unicast_key()
6694 ret = ath10k_wmi_vdev_set_param(arvif->ar, in ath10k_set_default_unicast_key()
6695 arvif->vdev_id, in ath10k_set_default_unicast_key()
6696 arvif->ar->wmi.vdev_param->def_keyid, in ath10k_set_default_unicast_key()
6701 arvif->vdev_id, in ath10k_set_default_unicast_key()
6706 arvif->def_wep_key_idx = keyidx; in ath10k_set_default_unicast_key()
6709 mutex_unlock(&arvif->ar->conf_mutex); in ath10k_set_default_unicast_key()
6727 arvif = arsta->arvif; in ath10k_sta_rc_update_wk()
6728 ar = arvif->ar; in ath10k_sta_rc_update_wk()
6730 if (WARN_ON(ath10k_mac_vif_chan(arvif->vif, &def))) in ath10k_sta_rc_update_wk()
6733 band = def.chan->band; in ath10k_sta_rc_update_wk()
6734 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs; in ath10k_sta_rc_update_wk()
6735 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs; in ath10k_sta_rc_update_wk()
6737 spin_lock_bh(&ar->data_lock); in ath10k_sta_rc_update_wk()
6739 changed = arsta->changed; in ath10k_sta_rc_update_wk()
6740 arsta->changed = 0; in ath10k_sta_rc_update_wk()
6742 bw = arsta->bw; in ath10k_sta_rc_update_wk()
6743 nss = arsta->nss; in ath10k_sta_rc_update_wk()
6744 smps = arsta->smps; in ath10k_sta_rc_update_wk()
6746 spin_unlock_bh(&ar->data_lock); in ath10k_sta_rc_update_wk()
6748 mutex_lock(&ar->conf_mutex); in ath10k_sta_rc_update_wk()
6759 sta->addr, bw, mode); in ath10k_sta_rc_update_wk()
6761 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr, in ath10k_sta_rc_update_wk()
6762 ar->wmi.peer_param->phymode, mode); in ath10k_sta_rc_update_wk()
6765 sta->addr, mode, err); in ath10k_sta_rc_update_wk()
6769 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr, in ath10k_sta_rc_update_wk()
6770 ar->wmi.peer_param->chan_width, bw); in ath10k_sta_rc_update_wk()
6773 sta->addr, bw, err); in ath10k_sta_rc_update_wk()
6778 sta->addr, nss); in ath10k_sta_rc_update_wk()
6780 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr, in ath10k_sta_rc_update_wk()
6781 ar->wmi.peer_param->nss, nss); in ath10k_sta_rc_update_wk()
6784 sta->addr, nss, err); in ath10k_sta_rc_update_wk()
6789 sta->addr, smps); in ath10k_sta_rc_update_wk()
6791 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr, in ath10k_sta_rc_update_wk()
6792 ar->wmi.peer_param->smps_state, smps); in ath10k_sta_rc_update_wk()
6795 sta->addr, smps, err); in ath10k_sta_rc_update_wk()
6800 sta->addr); in ath10k_sta_rc_update_wk()
6802 err = ath10k_station_assoc(ar, arvif->vif, sta, true); in ath10k_sta_rc_update_wk()
6805 sta->addr); in ath10k_sta_rc_update_wk()
6809 mutex_unlock(&ar->conf_mutex); in ath10k_sta_rc_update_wk()
6815 struct ath10k *ar = arvif->ar; in ath10k_mac_inc_num_stations()
6817 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_inc_num_stations()
6819 if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls) in ath10k_mac_inc_num_stations()
6822 if (ar->num_stations >= ar->max_num_stations) in ath10k_mac_inc_num_stations()
6823 return -ENOBUFS; in ath10k_mac_inc_num_stations()
6825 ar->num_stations++; in ath10k_mac_inc_num_stations()
6833 struct ath10k *ar = arvif->ar; in ath10k_mac_dec_num_stations()
6835 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_dec_num_stations()
6837 if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls) in ath10k_mac_dec_num_stations()
6840 ar->num_stations--; in ath10k_mac_dec_num_stations()
6847 struct ath10k *ar = hw->priv; in ath10k_sta_set_txpwr()
6848 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_sta_set_txpwr()
6852 if (sta->deflink.txpwr.type == NL80211_TX_POWER_AUTOMATIC) { in ath10k_sta_set_txpwr()
6855 txpwr = sta->deflink.txpwr.power; in ath10k_sta_set_txpwr()
6857 return -EINVAL; in ath10k_sta_set_txpwr()
6861 return -EINVAL; in ath10k_sta_set_txpwr()
6863 mutex_lock(&ar->conf_mutex); in ath10k_sta_set_txpwr()
6865 ret = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr, in ath10k_sta_set_txpwr()
6866 ar->wmi.peer_param->use_fixed_power, txpwr); in ath10k_sta_set_txpwr()
6874 mutex_unlock(&ar->conf_mutex); in ath10k_sta_set_txpwr()
6893 num_rates += hweight32(mask->control[band].legacy); in ath10k_mac_bitrate_mask_has_single_rate()
6895 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) in ath10k_mac_bitrate_mask_has_single_rate()
6896 num_rates += hweight8(mask->control[band].ht_mcs[i]); in ath10k_mac_bitrate_mask_has_single_rate()
6899 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) { in ath10k_mac_bitrate_mask_has_single_rate()
6900 tmp = hweight16(mask->control[band].vht_mcs[i]); in ath10k_mac_bitrate_mask_has_single_rate()
6923 if (hweight32(mask->control[band].legacy) == 1) { in ath10k_mac_bitrate_mask_get_single_rate()
6924 rate_idx = ffs(mask->control[band].legacy) - 1; in ath10k_mac_bitrate_mask_get_single_rate()
6926 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) in ath10k_mac_bitrate_mask_get_single_rate()
6939 (*nss - 1) << 4 | in ath10k_mac_bitrate_mask_get_single_rate()
6945 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) { in ath10k_mac_bitrate_mask_get_single_rate()
6946 if (hweight8(mask->control[band].ht_mcs[i]) == 1) { in ath10k_mac_bitrate_mask_get_single_rate()
6949 (*nss - 1) << 4 | in ath10k_mac_bitrate_mask_get_single_rate()
6950 (ffs(mask->control[band].ht_mcs[i]) - 1); in ath10k_mac_bitrate_mask_get_single_rate()
6957 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) { in ath10k_mac_bitrate_mask_get_single_rate()
6958 if (hweight16(mask->control[band].vht_mcs[i]) == 1) { in ath10k_mac_bitrate_mask_get_single_rate()
6961 (*nss - 1) << 4 | in ath10k_mac_bitrate_mask_get_single_rate()
6962 (ffs(mask->control[band].vht_mcs[i]) - 1); in ath10k_mac_bitrate_mask_get_single_rate()
6968 return -EINVAL; in ath10k_mac_bitrate_mask_get_single_rate()
6975 struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap; in ath10k_mac_validate_rate_mask()
6976 struct ieee80211_sta_vht_cap *vht_cap = &sta->deflink.vht_cap; in ath10k_mac_validate_rate_mask()
6978 if (nss > sta->deflink.rx_nss) { in ath10k_mac_validate_rate_mask()
6980 nss, sta->deflink.rx_nss); in ath10k_mac_validate_rate_mask()
6981 return -EINVAL; in ath10k_mac_validate_rate_mask()
6985 if (!vht_cap->vht_supported) { in ath10k_mac_validate_rate_mask()
6987 sta->addr); in ath10k_mac_validate_rate_mask()
6988 return -EINVAL; in ath10k_mac_validate_rate_mask()
6991 if (!ht_cap->ht_supported || vht_cap->vht_supported) { in ath10k_mac_validate_rate_mask()
6993 sta->addr); in ath10k_mac_validate_rate_mask()
6994 return -EINVAL; in ath10k_mac_validate_rate_mask()
6997 if (ht_cap->ht_supported || vht_cap->vht_supported) in ath10k_mac_validate_rate_mask()
6998 return -EINVAL; in ath10k_mac_validate_rate_mask()
7018 return -EINVAL; in ath10k_mac_tid_bitrate_config()
7026 band = def.chan->band; in ath10k_mac_tid_bitrate_config()
7030 return -EINVAL; in ath10k_mac_tid_bitrate_config()
7044 return -EINVAL; in ath10k_mac_tid_bitrate_config()
7050 ar->wmi.svc_map))) in ath10k_mac_tid_bitrate_config()
7053 return -EOPNOTSUPP; in ath10k_mac_tid_bitrate_config()
7062 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_mac_set_tid_config()
7067 if (!sta->wme) in ath10k_mac_set_tid_config()
7068 return -ENOTSUPP; in ath10k_mac_set_tid_config()
7070 arsta = (struct ath10k_sta *)sta->drv_priv; in ath10k_mac_set_tid_config()
7073 if ((arsta->retry_long[arg->tid] > 0 || in ath10k_mac_set_tid_config()
7074 arsta->rate_code[arg->tid] > 0 || in ath10k_mac_set_tid_config()
7075 arsta->ampdu[arg->tid] == in ath10k_mac_set_tid_config()
7077 arg->ack_policy == WMI_PEER_TID_CONFIG_NOACK) { in ath10k_mac_set_tid_config()
7079 arg->ack_policy = 0; in ath10k_mac_set_tid_config()
7080 arg->aggr_control = 0; in ath10k_mac_set_tid_config()
7081 arg->rate_ctrl = 0; in ath10k_mac_set_tid_config()
7082 arg->rcode_flags = 0; in ath10k_mac_set_tid_config()
7087 if (arsta->noack[arg->tid] == WMI_PEER_TID_CONFIG_NOACK || in ath10k_mac_set_tid_config()
7088 arvif->noack[arg->tid] == WMI_PEER_TID_CONFIG_NOACK) { in ath10k_mac_set_tid_config()
7089 arg->aggr_control = 0; in ath10k_mac_set_tid_config()
7096 if (arsta->noack[arg->tid] == WMI_PEER_TID_CONFIG_NOACK || in ath10k_mac_set_tid_config()
7097 arvif->noack[arg->tid] == WMI_PEER_TID_CONFIG_NOACK) { in ath10k_mac_set_tid_config()
7098 arg->rate_ctrl = 0; in ath10k_mac_set_tid_config()
7099 arg->rcode_flags = 0; in ath10k_mac_set_tid_config()
7103 ether_addr_copy(arg->peer_macaddr.addr, sta->addr); in ath10k_mac_set_tid_config()
7111 arsta->noack[arg->tid] = arg->ack_policy; in ath10k_mac_set_tid_config()
7112 arg->ack_policy = 0; in ath10k_mac_set_tid_config()
7113 arg->aggr_control = 0; in ath10k_mac_set_tid_config()
7114 arg->rate_ctrl = 0; in ath10k_mac_set_tid_config()
7115 arg->rcode_flags = 0; in ath10k_mac_set_tid_config()
7119 arsta->retry_long[arg->tid] = arg->retry_count; in ath10k_mac_set_tid_config()
7120 arg->retry_count = 0; in ath10k_mac_set_tid_config()
7124 arsta->ampdu[arg->tid] = arg->aggr_control; in ath10k_mac_set_tid_config()
7125 arg->aggr_control = 0; in ath10k_mac_set_tid_config()
7130 arsta->rate_ctrl[arg->tid] = arg->rate_ctrl; in ath10k_mac_set_tid_config()
7131 arg->rate_ctrl = 0; in ath10k_mac_set_tid_config()
7132 arg->rcode_flags = 0; in ath10k_mac_set_tid_config()
7136 arsta->rtscts[arg->tid] = arg->rtscts_ctrl; in ath10k_mac_set_tid_config()
7137 arg->ext_tid_cfg_bitmap = 0; in ath10k_mac_set_tid_config()
7141 if ((arvif->retry_long[arg->tid] || in ath10k_mac_set_tid_config()
7142 arvif->rate_code[arg->tid] || in ath10k_mac_set_tid_config()
7143 arvif->ampdu[arg->tid] == in ath10k_mac_set_tid_config()
7145 arg->ack_policy == WMI_PEER_TID_CONFIG_NOACK) { in ath10k_mac_set_tid_config()
7148 arvif->noack[arg->tid] = arg->ack_policy; in ath10k_mac_set_tid_config()
7149 arvif->ampdu[arg->tid] = arg->aggr_control; in ath10k_mac_set_tid_config()
7150 arvif->rate_ctrl[arg->tid] = arg->rate_ctrl; in ath10k_mac_set_tid_config()
7155 if (arvif->noack[arg->tid] == WMI_PEER_TID_CONFIG_NOACK) in ath10k_mac_set_tid_config()
7158 arvif->retry_long[arg->tid] = arg->retry_count; in ath10k_mac_set_tid_config()
7162 if (arvif->noack[arg->tid] == WMI_PEER_TID_CONFIG_NOACK) in ath10k_mac_set_tid_config()
7165 arvif->ampdu[arg->tid] = arg->aggr_control; in ath10k_mac_set_tid_config()
7170 if (arvif->noack[arg->tid] == WMI_PEER_TID_CONFIG_NOACK) { in ath10k_mac_set_tid_config()
7174 arvif->rate_ctrl[arg->tid] = arg->rate_ctrl; in ath10k_mac_set_tid_config()
7175 arvif->rate_code[arg->tid] = arg->rcode_flags; in ath10k_mac_set_tid_config()
7180 arvif->rtscts[arg->tid] = arg->rtscts_ctrl; in ath10k_mac_set_tid_config()
7181 arg->ext_tid_cfg_bitmap = 0; in ath10k_mac_set_tid_config()
7185 arvif->tid_conf_changed[arg->tid] |= changed; in ath10k_mac_set_tid_config()
7198 u32 changed = tid_conf->mask; in ath10k_mac_parse_tid_config()
7202 return -EINVAL; in ath10k_mac_parse_tid_config()
7205 if (!(tid_conf->tids & BIT(i))) { in ath10k_mac_parse_tid_config()
7210 arg->tid = i; in ath10k_mac_parse_tid_config()
7213 if (tid_conf->noack == NL80211_TID_CONFIG_ENABLE) { in ath10k_mac_parse_tid_config()
7214 arg->ack_policy = WMI_PEER_TID_CONFIG_NOACK; in ath10k_mac_parse_tid_config()
7215 arg->rate_ctrl = in ath10k_mac_parse_tid_config()
7217 arg->aggr_control = in ath10k_mac_parse_tid_config()
7220 arg->ack_policy = in ath10k_mac_parse_tid_config()
7222 arg->rate_ctrl = in ath10k_mac_parse_tid_config()
7224 arg->aggr_control = in ath10k_mac_parse_tid_config()
7230 arg->retry_count = tid_conf->retry_long; in ath10k_mac_parse_tid_config()
7233 if (tid_conf->noack == NL80211_TID_CONFIG_ENABLE) in ath10k_mac_parse_tid_config()
7234 arg->aggr_control = WMI_TID_CONFIG_AGGR_CONTROL_ENABLE; in ath10k_mac_parse_tid_config()
7236 arg->aggr_control = WMI_TID_CONFIG_AGGR_CONTROL_DISABLE; in ath10k_mac_parse_tid_config()
7242 &arg->rcode_flags, in ath10k_mac_parse_tid_config()
7243 &arg->rate_ctrl, in ath10k_mac_parse_tid_config()
7244 tid_conf->txrate_type, in ath10k_mac_parse_tid_config()
7245 &tid_conf->txrate_mask); in ath10k_mac_parse_tid_config()
7249 arg->rcode_flags = 0; in ath10k_mac_parse_tid_config()
7250 arg->rate_ctrl = 0; in ath10k_mac_parse_tid_config()
7255 if (tid_conf->rtscts) in ath10k_mac_parse_tid_config()
7256 arg->rtscts_ctrl = tid_conf->rtscts; in ath10k_mac_parse_tid_config()
7258 arg->ext_tid_cfg_bitmap = WMI_EXT_TID_RTS_CTS_CONFIG; in ath10k_mac_parse_tid_config()
7275 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv; in ath10k_mac_reset_tid_config()
7279 arg.vdev_id = arvif->vdev_id; in ath10k_mac_reset_tid_config()
7294 ether_addr_copy(arg.peer_macaddr.addr, sta->addr); in ath10k_mac_reset_tid_config()
7300 if (!arvif->tids_rst) { in ath10k_mac_reset_tid_config()
7301 arsta->retry_long[i] = -1; in ath10k_mac_reset_tid_config()
7302 arsta->noack[i] = -1; in ath10k_mac_reset_tid_config()
7303 arsta->ampdu[i] = -1; in ath10k_mac_reset_tid_config()
7304 arsta->rate_code[i] = -1; in ath10k_mac_reset_tid_config()
7305 arsta->rate_ctrl[i] = 0; in ath10k_mac_reset_tid_config()
7306 arsta->rtscts[i] = -1; in ath10k_mac_reset_tid_config()
7308 arvif->retry_long[i] = 0; in ath10k_mac_reset_tid_config()
7309 arvif->noack[i] = 0; in ath10k_mac_reset_tid_config()
7310 arvif->ampdu[i] = 0; in ath10k_mac_reset_tid_config()
7311 arvif->rate_code[i] = 0; in ath10k_mac_reset_tid_config()
7312 arvif->rate_ctrl[i] = 0; in ath10k_mac_reset_tid_config()
7313 arvif->rtscts[i] = 0; in ath10k_mac_reset_tid_config()
7336 arvif = arsta->arvif; in ath10k_sta_tid_cfg_wk()
7337 ar = arvif->ar; in ath10k_sta_tid_cfg_wk()
7339 mutex_lock(&ar->conf_mutex); in ath10k_sta_tid_cfg_wk()
7341 if (arvif->tids_rst) { in ath10k_sta_tid_cfg_wk()
7343 arvif->tids_rst); in ath10k_sta_tid_cfg_wk()
7347 ether_addr_copy(arg.peer_macaddr.addr, sta->addr); in ath10k_sta_tid_cfg_wk()
7351 changed = arvif->tid_conf_changed[i]; in ath10k_sta_tid_cfg_wk()
7354 if (arsta->noack[i] != -1) { in ath10k_sta_tid_cfg_wk()
7358 arg.ack_policy = arvif->noack[i]; in ath10k_sta_tid_cfg_wk()
7359 arg.aggr_control = arvif->ampdu[i]; in ath10k_sta_tid_cfg_wk()
7360 arg.rate_ctrl = arvif->rate_ctrl[i]; in ath10k_sta_tid_cfg_wk()
7365 if (arsta->retry_long[i] != -1 || in ath10k_sta_tid_cfg_wk()
7366 arsta->noack[i] == WMI_PEER_TID_CONFIG_NOACK || in ath10k_sta_tid_cfg_wk()
7367 arvif->noack[i] == WMI_PEER_TID_CONFIG_NOACK) { in ath10k_sta_tid_cfg_wk()
7370 arg.retry_count = arvif->retry_long[i]; in ath10k_sta_tid_cfg_wk()
7376 if (arsta->ampdu[i] != -1 || in ath10k_sta_tid_cfg_wk()
7377 arsta->noack[i] == WMI_PEER_TID_CONFIG_NOACK || in ath10k_sta_tid_cfg_wk()
7378 arvif->noack[i] == WMI_PEER_TID_CONFIG_NOACK) { in ath10k_sta_tid_cfg_wk()
7381 arg.aggr_control = arvif->ampdu[i]; in ath10k_sta_tid_cfg_wk()
7388 nss = ATH10K_HW_NSS(arvif->rate_code[i]); in ath10k_sta_tid_cfg_wk()
7390 arvif->rate_code[i], in ath10k_sta_tid_cfg_wk()
7393 arvif->rate_ctrl[i] > WMI_TID_CONFIG_RATE_CONTROL_AUTO) { in ath10k_sta_tid_cfg_wk()
7398 if (arsta->rate_ctrl[i] > in ath10k_sta_tid_cfg_wk()
7400 arsta->noack[i] == WMI_PEER_TID_CONFIG_NOACK || in ath10k_sta_tid_cfg_wk()
7401 arvif->noack[i] == WMI_PEER_TID_CONFIG_NOACK) { in ath10k_sta_tid_cfg_wk()
7405 arg.rate_ctrl = arvif->rate_ctrl[i]; in ath10k_sta_tid_cfg_wk()
7406 arg.rcode_flags = arvif->rate_code[i]; in ath10k_sta_tid_cfg_wk()
7412 if (arsta->rtscts[i]) { in ath10k_sta_tid_cfg_wk()
7416 arg.rtscts_ctrl = arvif->rtscts[i] - 1; in ath10k_sta_tid_cfg_wk()
7429 sta->addr, ret); in ath10k_sta_tid_cfg_wk()
7440 mutex_unlock(&ar->conf_mutex); in ath10k_sta_tid_cfg_wk()
7446 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv; in ath10k_mac_vif_stations_tid_conf()
7448 struct ieee80211_vif *sta_vif = arsta->arvif->vif; in ath10k_mac_vif_stations_tid_conf()
7450 if (sta_vif != iter_data->curr_vif || !sta->wme) in ath10k_mac_vif_stations_tid_conf()
7453 ieee80211_queue_work(iter_data->ar->hw, &arsta->tid_config_wk); in ath10k_mac_vif_stations_tid_conf()
7462 struct ath10k *ar = hw->priv; in ath10k_sta_state()
7463 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_sta_state()
7464 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv; in ath10k_sta_state()
7472 arsta->arvif = arvif; in ath10k_sta_state()
7473 arsta->peer_ps_state = WMI_PEER_PS_STATE_DISABLED; in ath10k_sta_state()
7474 INIT_WORK(&arsta->update_wk, ath10k_sta_rc_update_wk); in ath10k_sta_state()
7475 INIT_WORK(&arsta->tid_config_wk, ath10k_sta_tid_cfg_wk); in ath10k_sta_state()
7477 for (i = 0; i < ARRAY_SIZE(sta->txq); i++) in ath10k_sta_state()
7478 ath10k_mac_txq_init(sta->txq[i]); in ath10k_sta_state()
7484 cancel_work_sync(&arsta->update_wk); in ath10k_sta_state()
7485 cancel_work_sync(&arsta->tid_config_wk); in ath10k_sta_state()
7488 mutex_lock(&ar->conf_mutex); in ath10k_sta_state()
7500 arvif->vdev_id, sta->addr, in ath10k_sta_state()
7501 ar->num_stations + 1, ar->max_num_stations, in ath10k_sta_state()
7502 ar->num_peers + 1, ar->max_num_peers); in ath10k_sta_state()
7506 if (sta->tdls) { in ath10k_sta_state()
7507 if (num_tdls_stations >= ar->max_num_tdls_vdevs) { in ath10k_sta_state()
7509 arvif->vdev_id, in ath10k_sta_state()
7510 ar->max_num_tdls_vdevs); in ath10k_sta_state()
7511 ret = -ELNRNG; in ath10k_sta_state()
7520 ar->max_num_stations); in ath10k_sta_state()
7525 arsta->tx_stats = kzalloc(sizeof(*arsta->tx_stats), in ath10k_sta_state()
7527 if (!arsta->tx_stats) { in ath10k_sta_state()
7529 ret = -ENOMEM; in ath10k_sta_state()
7534 ret = ath10k_peer_create(ar, vif, sta, arvif->vdev_id, in ath10k_sta_state()
7535 sta->addr, peer_type); in ath10k_sta_state()
7538 sta->addr, arvif->vdev_id, ret); in ath10k_sta_state()
7540 kfree(arsta->tx_stats); in ath10k_sta_state()
7544 spin_lock_bh(&ar->data_lock); in ath10k_sta_state()
7546 peer = ath10k_peer_find(ar, arvif->vdev_id, sta->addr); in ath10k_sta_state()
7549 vif->addr, arvif->vdev_id); in ath10k_sta_state()
7550 spin_unlock_bh(&ar->data_lock); in ath10k_sta_state()
7551 ath10k_peer_delete(ar, arvif->vdev_id, sta->addr); in ath10k_sta_state()
7553 kfree(arsta->tx_stats); in ath10k_sta_state()
7554 ret = -ENOENT; in ath10k_sta_state()
7558 arsta->peer_id = find_first_bit(peer->peer_ids, in ath10k_sta_state()
7561 spin_unlock_bh(&ar->data_lock); in ath10k_sta_state()
7563 if (!sta->tdls) in ath10k_sta_state()
7566 ret = ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id, in ath10k_sta_state()
7570 arvif->vdev_id, ret); in ath10k_sta_state()
7571 ath10k_peer_delete(ar, arvif->vdev_id, in ath10k_sta_state()
7572 sta->addr); in ath10k_sta_state()
7574 kfree(arsta->tx_stats); in ath10k_sta_state()
7578 ret = ath10k_mac_tdls_peer_update(ar, arvif->vdev_id, sta, in ath10k_sta_state()
7583 sta->addr, arvif->vdev_id, ret); in ath10k_sta_state()
7584 ath10k_peer_delete(ar, arvif->vdev_id, sta->addr); in ath10k_sta_state()
7586 kfree(arsta->tx_stats); in ath10k_sta_state()
7590 ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id, in ath10k_sta_state()
7600 arvif->vdev_id, sta->addr, sta); in ath10k_sta_state()
7602 if (sta->tdls) { in ath10k_sta_state()
7603 ret = ath10k_mac_tdls_peer_update(ar, arvif->vdev_id, in ath10k_sta_state()
7608 sta->addr, in ath10k_sta_state()
7612 ret = ath10k_peer_delete(ar, arvif->vdev_id, sta->addr); in ath10k_sta_state()
7615 sta->addr, arvif->vdev_id, ret); in ath10k_sta_state()
7619 spin_lock_bh(&ar->data_lock); in ath10k_sta_state()
7620 for (i = 0; i < ARRAY_SIZE(ar->peer_map); i++) { in ath10k_sta_state()
7621 peer = ar->peer_map[i]; in ath10k_sta_state()
7625 if (peer->sta == sta) { in ath10k_sta_state()
7627 sta->addr, peer, i, arvif->vdev_id); in ath10k_sta_state()
7628 peer->sta = NULL; in ath10k_sta_state()
7636 spin_unlock_bh(&ar->data_lock); in ath10k_sta_state()
7639 kfree(arsta->tx_stats); in ath10k_sta_state()
7640 arsta->tx_stats = NULL; in ath10k_sta_state()
7643 for (i = 0; i < ARRAY_SIZE(sta->txq); i++) in ath10k_sta_state()
7644 ath10k_mac_txq_unref(ar, sta->txq[i]); in ath10k_sta_state()
7646 if (!sta->tdls) in ath10k_sta_state()
7653 ret = ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id, in ath10k_sta_state()
7657 arvif->vdev_id, ret); in ath10k_sta_state()
7661 (vif->type == NL80211_IFTYPE_AP || in ath10k_sta_state()
7662 vif->type == NL80211_IFTYPE_MESH_POINT || in ath10k_sta_state()
7663 vif->type == NL80211_IFTYPE_ADHOC)) { in ath10k_sta_state()
7668 sta->addr); in ath10k_sta_state()
7673 sta->addr, arvif->vdev_id, ret); in ath10k_sta_state()
7676 sta->tdls) { in ath10k_sta_state()
7681 sta->addr); in ath10k_sta_state()
7686 sta->addr, arvif->vdev_id, ret); in ath10k_sta_state()
7690 ret = ath10k_mac_tdls_peer_update(ar, arvif->vdev_id, sta, in ath10k_sta_state()
7694 sta->addr, arvif->vdev_id, ret); in ath10k_sta_state()
7697 (vif->type == NL80211_IFTYPE_AP || in ath10k_sta_state()
7698 vif->type == NL80211_IFTYPE_MESH_POINT || in ath10k_sta_state()
7699 vif->type == NL80211_IFTYPE_ADHOC)) { in ath10k_sta_state()
7704 sta->addr); in ath10k_sta_state()
7709 sta->addr, arvif->vdev_id, ret); in ath10k_sta_state()
7712 mutex_unlock(&ar->conf_mutex); in ath10k_sta_state()
7719 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_conf_tx_uapsd()
7725 lockdep_assert_held(&ar->conf_mutex); in ath10k_conf_tx_uapsd()
7727 if (arvif->vdev_type != WMI_VDEV_TYPE_STA) in ath10k_conf_tx_uapsd()
7758 arvif->u.sta.uapsd |= value; in ath10k_conf_tx_uapsd()
7760 arvif->u.sta.uapsd &= ~value; in ath10k_conf_tx_uapsd()
7762 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath10k_conf_tx_uapsd()
7764 arvif->u.sta.uapsd); in ath10k_conf_tx_uapsd()
7770 if (arvif->u.sta.uapsd) in ath10k_conf_tx_uapsd()
7775 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath10k_conf_tx_uapsd()
7784 arvif->vdev_id, ret); in ath10k_conf_tx_uapsd()
7790 ath10k_warn(ar, "failed to recalc ps poll count on vdev %i: %d\n", in ath10k_conf_tx_uapsd()
7791 arvif->vdev_id, ret); in ath10k_conf_tx_uapsd()
7795 if (test_bit(WMI_SERVICE_STA_UAPSD_BASIC_AUTO_TRIG, ar->wmi.svc_map) || in ath10k_conf_tx_uapsd()
7796 test_bit(WMI_SERVICE_STA_UAPSD_VAR_AUTO_TRIG, ar->wmi.svc_map)) { in ath10k_conf_tx_uapsd()
7798 * trigger frame. The following effectively disables u-UAPSD in ath10k_conf_tx_uapsd()
7809 ret = ath10k_wmi_vdev_sta_uapsd(ar, arvif->vdev_id, in ath10k_conf_tx_uapsd()
7810 arvif->bssid, &arg, 1); in ath10k_conf_tx_uapsd()
7827 struct ath10k *ar = hw->priv; in ath10k_conf_tx()
7828 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_conf_tx()
7832 mutex_lock(&ar->conf_mutex); in ath10k_conf_tx()
7836 p = &arvif->wmm_params.ac_vo; in ath10k_conf_tx()
7839 p = &arvif->wmm_params.ac_vi; in ath10k_conf_tx()
7842 p = &arvif->wmm_params.ac_be; in ath10k_conf_tx()
7845 p = &arvif->wmm_params.ac_bk; in ath10k_conf_tx()
7850 ret = -EINVAL; in ath10k_conf_tx()
7854 p->cwmin = params->cw_min; in ath10k_conf_tx()
7855 p->cwmax = params->cw_max; in ath10k_conf_tx()
7856 p->aifs = params->aifs; in ath10k_conf_tx()
7863 p->txop = params->txop * 32; in ath10k_conf_tx()
7865 if (ar->wmi.ops->gen_vdev_wmm_conf) { in ath10k_conf_tx()
7866 ret = ath10k_wmi_vdev_wmm_conf(ar, arvif->vdev_id, in ath10k_conf_tx()
7867 &arvif->wmm_params); in ath10k_conf_tx()
7870 arvif->vdev_id, ret); in ath10k_conf_tx()
7874 /* This won't work well with multi-interface cases but it's in ath10k_conf_tx()
7877 ret = ath10k_wmi_pdev_set_wmm_params(ar, &arvif->wmm_params); in ath10k_conf_tx()
7884 ret = ath10k_conf_tx_uapsd(ar, vif, ac, params->uapsd); in ath10k_conf_tx()
7889 mutex_unlock(&ar->conf_mutex); in ath10k_conf_tx()
7899 struct ath10k *ar = hw->priv; in ath10k_remain_on_channel()
7900 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_remain_on_channel()
7905 mutex_lock(&ar->conf_mutex); in ath10k_remain_on_channel()
7908 ret = -EBUSY; in ath10k_remain_on_channel()
7912 spin_lock_bh(&ar->data_lock); in ath10k_remain_on_channel()
7913 switch (ar->scan.state) { in ath10k_remain_on_channel()
7915 reinit_completion(&ar->scan.started); in ath10k_remain_on_channel()
7916 reinit_completion(&ar->scan.completed); in ath10k_remain_on_channel()
7917 reinit_completion(&ar->scan.on_channel); in ath10k_remain_on_channel()
7918 ar->scan.state = ATH10K_SCAN_STARTING; in ath10k_remain_on_channel()
7919 ar->scan.is_roc = true; in ath10k_remain_on_channel()
7920 ar->scan.vdev_id = arvif->vdev_id; in ath10k_remain_on_channel()
7921 ar->scan.roc_freq = chan->center_freq; in ath10k_remain_on_channel()
7922 ar->scan.roc_notify = true; in ath10k_remain_on_channel()
7928 ret = -EBUSY; in ath10k_remain_on_channel()
7931 spin_unlock_bh(&ar->data_lock); in ath10k_remain_on_channel()
7936 scan_time_msec = ar->hw->wiphy->max_remain_on_channel_duration * 2; in ath10k_remain_on_channel()
7940 arg.vdev_id = arvif->vdev_id; in ath10k_remain_on_channel()
7943 arg.channels[0] = chan->center_freq; in ath10k_remain_on_channel()
7954 spin_lock_bh(&ar->data_lock); in ath10k_remain_on_channel()
7955 ar->scan.state = ATH10K_SCAN_IDLE; in ath10k_remain_on_channel()
7956 spin_unlock_bh(&ar->data_lock); in ath10k_remain_on_channel()
7960 ret = wait_for_completion_timeout(&ar->scan.on_channel, 3 * HZ); in ath10k_remain_on_channel()
7968 ret = -ETIMEDOUT; in ath10k_remain_on_channel()
7972 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout, in ath10k_remain_on_channel()
7977 mutex_unlock(&ar->conf_mutex); in ath10k_remain_on_channel()
7984 struct ath10k *ar = hw->priv; in ath10k_cancel_remain_on_channel()
7986 mutex_lock(&ar->conf_mutex); in ath10k_cancel_remain_on_channel()
7988 spin_lock_bh(&ar->data_lock); in ath10k_cancel_remain_on_channel()
7989 ar->scan.roc_notify = false; in ath10k_cancel_remain_on_channel()
7990 spin_unlock_bh(&ar->data_lock); in ath10k_cancel_remain_on_channel()
7994 mutex_unlock(&ar->conf_mutex); in ath10k_cancel_remain_on_channel()
7996 cancel_delayed_work_sync(&ar->scan.timeout); in ath10k_cancel_remain_on_channel()
8002 * Both RTS and Fragmentation threshold are interface-specific
8003 * in ath10k, but device-specific in mac80211.
8008 struct ath10k *ar = hw->priv; in ath10k_set_rts_threshold()
8012 mutex_lock(&ar->conf_mutex); in ath10k_set_rts_threshold()
8013 list_for_each_entry(arvif, &ar->arvifs, list) { in ath10k_set_rts_threshold()
8015 arvif->vdev_id, value); in ath10k_set_rts_threshold()
8020 arvif->vdev_id, ret); in ath10k_set_rts_threshold()
8024 mutex_unlock(&ar->conf_mutex); in ath10k_set_rts_threshold()
8041 return -EOPNOTSUPP; in ath10k_mac_op_set_frag_threshold()
8053 if (ar->state == ATH10K_STATE_WEDGED) in ath10k_mac_wait_tx_complete()
8056 time_left = wait_event_timeout(ar->htt.empty_tx_wq, ({ in ath10k_mac_wait_tx_complete()
8059 spin_lock_bh(&ar->htt.tx_lock); in ath10k_mac_wait_tx_complete()
8060 empty = (ar->htt.num_pending_tx == 0); in ath10k_mac_wait_tx_complete()
8061 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_wait_tx_complete()
8063 skip = (ar->state == ATH10K_STATE_WEDGED) || in ath10k_mac_wait_tx_complete()
8065 &ar->dev_flags); in ath10k_mac_wait_tx_complete()
8071 ath10k_warn(ar, "failed to flush transmit queue (skip %i ar-state %i): %ld\n", in ath10k_mac_wait_tx_complete()
8072 skip, ar->state, time_left); in ath10k_mac_wait_tx_complete()
8078 struct ath10k *ar = hw->priv; in ath10k_flush()
8083 if (vif && vif->type == NL80211_IFTYPE_STATION) { in ath10k_flush()
8085 list_for_each_entry(arvif, &ar->arvifs, list) { in ath10k_flush()
8086 if (arvif->vdev_type == WMI_VDEV_TYPE_STA) in ath10k_flush()
8087 ath10k_wmi_peer_flush(ar, arvif->vdev_id, in ath10k_flush()
8088 arvif->bssid, bitmap); in ath10k_flush()
8090 ath10k_htt_flush_tx(&ar->htt); in ath10k_flush()
8095 mutex_lock(&ar->conf_mutex); in ath10k_flush()
8097 mutex_unlock(&ar->conf_mutex); in ath10k_flush()
8112 struct ath10k *ar = hw->priv; in ath10k_reconfig_complete()
8118 mutex_lock(&ar->conf_mutex); in ath10k_reconfig_complete()
8123 if (ar->state == ATH10K_STATE_RESTARTED) { in ath10k_reconfig_complete()
8125 ar->state = ATH10K_STATE_ON; in ath10k_reconfig_complete()
8126 ieee80211_wake_queues(ar->hw); in ath10k_reconfig_complete()
8127 clear_bit(ATH10K_FLAG_RESTARTING, &ar->dev_flags); in ath10k_reconfig_complete()
8128 if (ar->hw_params.hw_restart_disconnect) { in ath10k_reconfig_complete()
8129 list_for_each_entry(arvif, &ar->arvifs, list) { in ath10k_reconfig_complete()
8130 if (arvif->is_up && arvif->vdev_type == WMI_VDEV_TYPE_STA) in ath10k_reconfig_complete()
8131 ieee80211_hw_restart_disconnect(arvif->vif); in ath10k_reconfig_complete()
8136 mutex_unlock(&ar->conf_mutex); in ath10k_reconfig_complete()
8146 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_update_bss_chan_survey()
8148 if (!test_bit(WMI_SERVICE_BSS_CHANNEL_INFO_64, ar->wmi.svc_map) || in ath10k_mac_update_bss_chan_survey()
8149 (ar->rx_channel != channel)) in ath10k_mac_update_bss_chan_survey()
8152 if (ar->scan.state != ATH10K_SCAN_IDLE) { in ath10k_mac_update_bss_chan_survey()
8157 reinit_completion(&ar->bss_survey_done); in ath10k_mac_update_bss_chan_survey()
8165 ret = wait_for_completion_timeout(&ar->bss_survey_done, 3 * HZ); in ath10k_mac_update_bss_chan_survey()
8175 struct ath10k *ar = hw->priv; in ath10k_get_survey()
8177 struct survey_info *ar_survey = &ar->survey[idx]; in ath10k_get_survey()
8180 mutex_lock(&ar->conf_mutex); in ath10k_get_survey()
8182 sband = hw->wiphy->bands[NL80211_BAND_2GHZ]; in ath10k_get_survey()
8183 if (sband && idx >= sband->n_channels) { in ath10k_get_survey()
8184 idx -= sband->n_channels; in ath10k_get_survey()
8189 sband = hw->wiphy->bands[NL80211_BAND_5GHZ]; in ath10k_get_survey()
8191 if (!sband || idx >= sband->n_channels) { in ath10k_get_survey()
8192 ret = -ENOENT; in ath10k_get_survey()
8196 ath10k_mac_update_bss_chan_survey(ar, &sband->channels[idx]); in ath10k_get_survey()
8198 spin_lock_bh(&ar->data_lock); in ath10k_get_survey()
8200 spin_unlock_bh(&ar->data_lock); in ath10k_get_survey()
8202 survey->channel = &sband->channels[idx]; in ath10k_get_survey()
8204 if (ar->rx_channel == survey->channel) in ath10k_get_survey()
8205 survey->filled |= SURVEY_INFO_IN_USE; in ath10k_get_survey()
8208 mutex_unlock(&ar->conf_mutex); in ath10k_get_survey()
8218 struct ieee80211_supported_band *sband = &ar->mac.sbands[band]; in ath10k_mac_bitrate_mask_get_single_nss()
8219 u16 vht_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map); in ath10k_mac_bitrate_mask_get_single_nss()
8224 if (mask->control[band].legacy) in ath10k_mac_bitrate_mask_get_single_nss()
8227 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) { in ath10k_mac_bitrate_mask_get_single_nss()
8228 if (mask->control[band].ht_mcs[i] == 0) in ath10k_mac_bitrate_mask_get_single_nss()
8230 else if (mask->control[band].ht_mcs[i] == in ath10k_mac_bitrate_mask_get_single_nss()
8231 sband->ht_cap.mcs.rx_mask[i]) in ath10k_mac_bitrate_mask_get_single_nss()
8237 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) { in ath10k_mac_bitrate_mask_get_single_nss()
8238 if (mask->control[band].vht_mcs[i] == 0) in ath10k_mac_bitrate_mask_get_single_nss()
8240 else if (mask->control[band].vht_mcs[i] == in ath10k_mac_bitrate_mask_get_single_nss()
8253 if (BIT(fls(ht_nss_mask)) - 1 != ht_nss_mask) in ath10k_mac_bitrate_mask_get_single_nss()
8264 struct ath10k *ar = arvif->ar; in ath10k_mac_set_fixed_rate_params()
8268 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_set_fixed_rate_params()
8271 arvif->vdev_id, rate, nss, sgi); in ath10k_mac_set_fixed_rate_params()
8273 vdev_param = ar->wmi.vdev_param->fixed_rate; in ath10k_mac_set_fixed_rate_params()
8274 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, rate); in ath10k_mac_set_fixed_rate_params()
8281 vdev_param = ar->wmi.vdev_param->nss; in ath10k_mac_set_fixed_rate_params()
8282 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, nss); in ath10k_mac_set_fixed_rate_params()
8288 vdev_param = ar->wmi.vdev_param->sgi; in ath10k_mac_set_fixed_rate_params()
8289 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, sgi); in ath10k_mac_set_fixed_rate_params()
8295 vdev_param = ar->wmi.vdev_param->ldpc; in ath10k_mac_set_fixed_rate_params()
8296 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, ldpc); in ath10k_mac_set_fixed_rate_params()
8316 * ranges can be used: none, 0-7, 0-8 and 0-9. in ath10k_mac_can_set_bitrate_mask()
8319 vht_mcs = mask->control[band].vht_mcs[i]; in ath10k_mac_can_set_bitrate_mask()
8323 case BIT(8) - 1: in ath10k_mac_can_set_bitrate_mask()
8324 case BIT(9) - 1: in ath10k_mac_can_set_bitrate_mask()
8325 case BIT(10) - 1: in ath10k_mac_can_set_bitrate_mask()
8329 ath10k_warn(ar, "refusing bitrate mask with missing 0-7 VHT MCS rates\n"); in ath10k_mac_can_set_bitrate_mask()
8342 u8 rate = arvif->vht_pfr; in ath10k_mac_set_vht_bitrate_mask_fixup()
8345 if (!sta->deflink.vht_cap.vht_supported || arvif->vht_num_rates != 1) in ath10k_mac_set_vht_bitrate_mask_fixup()
8348 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr, in ath10k_mac_set_vht_bitrate_mask_fixup()
8352 sta->addr, err); in ath10k_mac_set_vht_bitrate_mask_fixup()
8361 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv; in ath10k_mac_set_bitrate_mask_iter()
8362 struct ath10k *ar = arvif->ar; in ath10k_mac_set_bitrate_mask_iter()
8364 if (arsta->arvif != arvif) in ath10k_mac_set_bitrate_mask_iter()
8370 spin_lock_bh(&ar->data_lock); in ath10k_mac_set_bitrate_mask_iter()
8371 arsta->changed |= IEEE80211_RC_SUPP_RATES_CHANGED; in ath10k_mac_set_bitrate_mask_iter()
8372 spin_unlock_bh(&ar->data_lock); in ath10k_mac_set_bitrate_mask_iter()
8374 ieee80211_queue_work(ar->hw, &arsta->update_wk); in ath10k_mac_set_bitrate_mask_iter()
8381 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv; in ath10k_mac_clr_bitrate_mask_iter()
8382 struct ath10k *ar = arvif->ar; in ath10k_mac_clr_bitrate_mask_iter()
8386 if (arsta->arvif != arvif || !sta->deflink.vht_cap.vht_supported) in ath10k_mac_clr_bitrate_mask_iter()
8389 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr, in ath10k_mac_clr_bitrate_mask_iter()
8394 sta->addr, err); in ath10k_mac_clr_bitrate_mask_iter()
8401 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_mac_op_set_bitrate_mask()
8403 struct ath10k *ar = arvif->ar; in ath10k_mac_op_set_bitrate_mask()
8418 return -EPERM; in ath10k_mac_op_set_bitrate_mask()
8420 band = def.chan->band; in ath10k_mac_op_set_bitrate_mask()
8421 ht_mcs_mask = mask->control[band].ht_mcs; in ath10k_mac_op_set_bitrate_mask()
8422 vht_mcs_mask = mask->control[band].vht_mcs; in ath10k_mac_op_set_bitrate_mask()
8423 ldpc = !!(ar->ht_cap_info & WMI_HT_CAP_LDPC); in ath10k_mac_op_set_bitrate_mask()
8425 sgi = mask->control[band].gi; in ath10k_mac_op_set_bitrate_mask()
8427 return -EINVAL; in ath10k_mac_op_set_bitrate_mask()
8430 ar->normal_mode_fw.fw_file.fw_features); in ath10k_mac_op_set_bitrate_mask()
8432 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_set_bitrate_mask()
8433 ieee80211_iterate_stations_atomic(ar->hw, in ath10k_mac_op_set_bitrate_mask()
8436 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_set_bitrate_mask()
8446 arvif->vdev_id, ret); in ath10k_mac_op_set_bitrate_mask()
8455 nss = min(ar->num_rf_chains, in ath10k_mac_op_set_bitrate_mask()
8464 return -EINVAL; in ath10k_mac_op_set_bitrate_mask()
8479 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_set_bitrate_mask()
8482 arvif->bitrate_mask = *mask; in ath10k_mac_op_set_bitrate_mask()
8483 arvif->vht_num_rates = vht_num_rates; in ath10k_mac_op_set_bitrate_mask()
8484 arvif->vht_pfr = vht_pfr; in ath10k_mac_op_set_bitrate_mask()
8485 ieee80211_iterate_stations_atomic(ar->hw, in ath10k_mac_op_set_bitrate_mask()
8489 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_set_bitrate_mask()
8492 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_set_bitrate_mask()
8497 arvif->vdev_id, ret); in ath10k_mac_op_set_bitrate_mask()
8502 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_set_bitrate_mask()
8512 struct ath10k *ar = hw->priv; in ath10k_sta_rc_update()
8513 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv; in ath10k_sta_rc_update()
8514 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_sta_rc_update()
8518 spin_lock_bh(&ar->data_lock); in ath10k_sta_rc_update()
8520 peer = ath10k_peer_find(ar, arvif->vdev_id, sta->addr); in ath10k_sta_rc_update()
8522 spin_unlock_bh(&ar->data_lock); in ath10k_sta_rc_update()
8524 sta->addr, arvif->vdev_id); in ath10k_sta_rc_update()
8530 sta->addr, changed, sta->deflink.bandwidth, in ath10k_sta_rc_update()
8531 sta->deflink.rx_nss, in ath10k_sta_rc_update()
8532 sta->deflink.smps_mode); in ath10k_sta_rc_update()
8537 switch (sta->deflink.bandwidth) { in ath10k_sta_rc_update()
8552 sta->deflink.bandwidth, sta->addr); in ath10k_sta_rc_update()
8557 arsta->bw = bw; in ath10k_sta_rc_update()
8561 arsta->nss = sta->deflink.rx_nss; in ath10k_sta_rc_update()
8566 switch (sta->deflink.smps_mode) { in ath10k_sta_rc_update()
8579 sta->deflink.smps_mode, sta->addr); in ath10k_sta_rc_update()
8584 arsta->smps = smps; in ath10k_sta_rc_update()
8587 arsta->changed |= changed; in ath10k_sta_rc_update()
8589 spin_unlock_bh(&ar->data_lock); in ath10k_sta_rc_update()
8591 ieee80211_queue_work(hw, &arsta->update_wk); in ath10k_sta_rc_update()
8597 struct ath10k *ar = hw->priv; in ath10k_offset_tsf()
8598 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_offset_tsf()
8603 vdev_param = ar->wmi.vdev_param->dec_tsf; in ath10k_offset_tsf()
8604 offset = -tsf_offset; in ath10k_offset_tsf()
8606 vdev_param = ar->wmi.vdev_param->inc_tsf; in ath10k_offset_tsf()
8610 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, in ath10k_offset_tsf()
8613 if (ret && ret != -EOPNOTSUPP) in ath10k_offset_tsf()
8622 struct ath10k *ar = hw->priv; in ath10k_ampdu_action()
8623 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_ampdu_action()
8624 struct ieee80211_sta *sta = params->sta; in ath10k_ampdu_action()
8625 enum ieee80211_ampdu_mlme_action action = params->action; in ath10k_ampdu_action()
8626 u16 tid = params->tid; in ath10k_ampdu_action()
8629 arvif->vdev_id, sta->addr, tid, action); in ath10k_ampdu_action()
8646 return -EOPNOTSUPP; in ath10k_ampdu_action()
8649 return -EINVAL; in ath10k_ampdu_action()
8660 /* Both locks are required because ar->rx_channel is modified. This in ath10k_mac_update_rx_channel()
8663 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_update_rx_channel()
8664 lockdep_assert_held(&ar->data_lock); in ath10k_mac_update_rx_channel()
8670 * on a linked list now. Doing a lookup peer -> vif -> chanctx for each in ath10k_mac_update_rx_channel()
8671 * ppdu on Rx may reduce performance on low-end systems. It should be in ath10k_mac_update_rx_channel()
8675 * only for multi-channel cases. Single-channel cases will remain to in ath10k_mac_update_rx_channel()
8681 ieee80211_iter_chan_contexts_atomic(ar->hw, in ath10k_mac_update_rx_channel()
8686 def = &vifs[0].new_ctx->def; in ath10k_mac_update_rx_channel()
8688 ar->rx_channel = def->chan; in ath10k_mac_update_rx_channel()
8690 (ctx && (ar->state == ATH10K_STATE_RESTARTED))) { in ath10k_mac_update_rx_channel()
8696 ar->rx_channel = ctx->def.chan; in ath10k_mac_update_rx_channel()
8698 ar->rx_channel = NULL; in ath10k_mac_update_rx_channel()
8712 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_update_vif_chan()
8717 if (ar->monitor_started) in ath10k_mac_update_vif_chan()
8721 arvif = (void *)vifs[i].vif->drv_priv; in ath10k_mac_update_vif_chan()
8724 "mac chanctx switch vdev_id %i freq %u->%u width %d->%d\n", in ath10k_mac_update_vif_chan()
8725 arvif->vdev_id, in ath10k_mac_update_vif_chan()
8726 vifs[i].old_ctx->def.chan->center_freq, in ath10k_mac_update_vif_chan()
8727 vifs[i].new_ctx->def.chan->center_freq, in ath10k_mac_update_vif_chan()
8728 vifs[i].old_ctx->def.width, in ath10k_mac_update_vif_chan()
8729 vifs[i].new_ctx->def.width); in ath10k_mac_update_vif_chan()
8731 if (WARN_ON(!arvif->is_started)) in ath10k_mac_update_vif_chan()
8734 if (WARN_ON(!arvif->is_up)) in ath10k_mac_update_vif_chan()
8737 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id); in ath10k_mac_update_vif_chan()
8740 arvif->vdev_id, ret); in ath10k_mac_update_vif_chan()
8749 spin_lock_bh(&ar->data_lock); in ath10k_mac_update_vif_chan()
8751 spin_unlock_bh(&ar->data_lock); in ath10k_mac_update_vif_chan()
8754 arvif = (void *)vifs[i].vif->drv_priv; in ath10k_mac_update_vif_chan()
8756 if (WARN_ON(!arvif->is_started)) in ath10k_mac_update_vif_chan()
8759 if (WARN_ON(!arvif->is_up)) in ath10k_mac_update_vif_chan()
8772 ret = ath10k_vdev_restart(arvif, &vifs[i].new_ctx->def); in ath10k_mac_update_vif_chan()
8775 arvif->vdev_id, ret); in ath10k_mac_update_vif_chan()
8779 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid, in ath10k_mac_update_vif_chan()
8780 arvif->bssid); in ath10k_mac_update_vif_chan()
8783 arvif->vdev_id, ret); in ath10k_mac_update_vif_chan()
8795 struct ath10k *ar = hw->priv; in ath10k_mac_op_add_chanctx()
8799 ctx->def.chan->center_freq, ctx->def.width, ctx); in ath10k_mac_op_add_chanctx()
8801 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_add_chanctx()
8803 spin_lock_bh(&ar->data_lock); in ath10k_mac_op_add_chanctx()
8805 spin_unlock_bh(&ar->data_lock); in ath10k_mac_op_add_chanctx()
8810 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_add_chanctx()
8819 struct ath10k *ar = hw->priv; in ath10k_mac_op_remove_chanctx()
8823 ctx->def.chan->center_freq, ctx->def.width, ctx); in ath10k_mac_op_remove_chanctx()
8825 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_remove_chanctx()
8827 spin_lock_bh(&ar->data_lock); in ath10k_mac_op_remove_chanctx()
8829 spin_unlock_bh(&ar->data_lock); in ath10k_mac_op_remove_chanctx()
8834 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_remove_chanctx()
8850 if (rcu_access_pointer(vif->bss_conf.chanctx_conf) != arg->ctx) in ath10k_mac_change_chanctx_cnt_iter()
8853 arg->n_vifs++; in ath10k_mac_change_chanctx_cnt_iter()
8863 ctx = rcu_access_pointer(vif->bss_conf.chanctx_conf); in ath10k_mac_change_chanctx_fill_iter()
8864 if (ctx != arg->ctx) in ath10k_mac_change_chanctx_fill_iter()
8867 if (WARN_ON(arg->next_vif == arg->n_vifs)) in ath10k_mac_change_chanctx_fill_iter()
8870 arg->vifs[arg->next_vif].vif = vif; in ath10k_mac_change_chanctx_fill_iter()
8871 arg->vifs[arg->next_vif].old_ctx = ctx; in ath10k_mac_change_chanctx_fill_iter()
8872 arg->vifs[arg->next_vif].new_ctx = ctx; in ath10k_mac_change_chanctx_fill_iter()
8873 arg->next_vif++; in ath10k_mac_change_chanctx_fill_iter()
8881 struct ath10k *ar = hw->priv; in ath10k_mac_op_change_chanctx()
8884 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_change_chanctx()
8888 ctx->def.chan->center_freq, ctx->def.width, ctx, changed); in ath10k_mac_op_change_chanctx()
8925 * definitions per vdev internally and there's no host-side channel in ath10k_mac_op_change_chanctx()
8930 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_change_chanctx()
8939 struct ath10k *ar = hw->priv; in ath10k_mac_op_assign_vif_chanctx()
8940 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_mac_op_assign_vif_chanctx()
8943 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_assign_vif_chanctx()
8947 ctx, arvif->vdev_id); in ath10k_mac_op_assign_vif_chanctx()
8949 if (WARN_ON(arvif->is_started)) { in ath10k_mac_op_assign_vif_chanctx()
8950 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_assign_vif_chanctx()
8951 return -EBUSY; in ath10k_mac_op_assign_vif_chanctx()
8954 ret = ath10k_vdev_start(arvif, &ctx->def); in ath10k_mac_op_assign_vif_chanctx()
8957 arvif->vdev_id, vif->addr, in ath10k_mac_op_assign_vif_chanctx()
8958 ctx->def.chan->center_freq, ret); in ath10k_mac_op_assign_vif_chanctx()
8962 arvif->is_started = true; in ath10k_mac_op_assign_vif_chanctx()
8967 arvif->vdev_id, ret); in ath10k_mac_op_assign_vif_chanctx()
8971 if (vif->type == NL80211_IFTYPE_MONITOR) { in ath10k_mac_op_assign_vif_chanctx()
8972 ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, 0, vif->addr); in ath10k_mac_op_assign_vif_chanctx()
8975 arvif->vdev_id, ret); in ath10k_mac_op_assign_vif_chanctx()
8979 arvif->is_up = true; in ath10k_mac_op_assign_vif_chanctx()
8986 arvif->vdev_id, ret); in ath10k_mac_op_assign_vif_chanctx()
8990 ar->hw_params.tx_stats_over_pktlog) { in ath10k_mac_op_assign_vif_chanctx()
8991 ar->pktlog_filter |= ATH10K_PKTLOG_PEER_STATS; in ath10k_mac_op_assign_vif_chanctx()
8993 ar->pktlog_filter); in ath10k_mac_op_assign_vif_chanctx()
9000 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_assign_vif_chanctx()
9005 arvif->is_started = false; in ath10k_mac_op_assign_vif_chanctx()
9009 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_assign_vif_chanctx()
9019 struct ath10k *ar = hw->priv; in ath10k_mac_op_unassign_vif_chanctx()
9020 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_mac_op_unassign_vif_chanctx()
9023 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_unassign_vif_chanctx()
9027 ctx, arvif->vdev_id); in ath10k_mac_op_unassign_vif_chanctx()
9029 WARN_ON(!arvif->is_started); in ath10k_mac_op_unassign_vif_chanctx()
9031 if (vif->type == NL80211_IFTYPE_MONITOR) { in ath10k_mac_op_unassign_vif_chanctx()
9032 WARN_ON(!arvif->is_up); in ath10k_mac_op_unassign_vif_chanctx()
9034 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id); in ath10k_mac_op_unassign_vif_chanctx()
9037 arvif->vdev_id, ret); in ath10k_mac_op_unassign_vif_chanctx()
9039 arvif->is_up = false; in ath10k_mac_op_unassign_vif_chanctx()
9045 arvif->vdev_id, ret); in ath10k_mac_op_unassign_vif_chanctx()
9047 arvif->is_started = false; in ath10k_mac_op_unassign_vif_chanctx()
9049 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_unassign_vif_chanctx()
9058 struct ath10k *ar = hw->priv; in ath10k_mac_op_switch_vif_chanctx()
9060 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_switch_vif_chanctx()
9067 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_switch_vif_chanctx()
9078 ar = hw->priv; in ath10k_mac_op_sta_pre_rcu_remove()
9080 list_for_each_entry(peer, &ar->peers, list) in ath10k_mac_op_sta_pre_rcu_remove()
9081 if (peer->sta == sta) in ath10k_mac_op_sta_pre_rcu_remove()
9082 peer->removed = true; in ath10k_mac_op_sta_pre_rcu_remove()
9159 index = mcs - len_nss1; in ath10k_mac_get_rate_flags_ht()
9245 rate->flags = flags; in ath10k_mac_parse_bitrate()
9246 rate->bw = bw; in ath10k_mac_parse_bitrate()
9247 rate->legacy = bitrate_kbps / 100; in ath10k_mac_parse_bitrate()
9248 rate->nss = nss; in ath10k_mac_parse_bitrate()
9249 rate->mcs = mcs; in ath10k_mac_parse_bitrate()
9256 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv; in ath10k_mac_sta_get_peer_stats_info()
9261 if (!(ar->hw_params.supports_peer_stats_info && in ath10k_mac_sta_get_peer_stats_info()
9262 arsta->arvif->vdev_type == WMI_VDEV_TYPE_STA)) in ath10k_mac_sta_get_peer_stats_info()
9265 spin_lock_bh(&ar->data_lock); in ath10k_mac_sta_get_peer_stats_info()
9266 peer = ath10k_peer_find(ar, arsta->arvif->vdev_id, sta->addr); in ath10k_mac_sta_get_peer_stats_info()
9267 spin_unlock_bh(&ar->data_lock); in ath10k_mac_sta_get_peer_stats_info()
9271 reinit_completion(&ar->peer_stats_info_complete); in ath10k_mac_sta_get_peer_stats_info()
9274 arsta->arvif->vdev_id, in ath10k_mac_sta_get_peer_stats_info()
9276 arsta->arvif->bssid, in ath10k_mac_sta_get_peer_stats_info()
9278 if (ret && ret != -EOPNOTSUPP) { in ath10k_mac_sta_get_peer_stats_info()
9283 time_left = wait_for_completion_timeout(&ar->peer_stats_info_complete, 3 * HZ); in ath10k_mac_sta_get_peer_stats_info()
9289 if (arsta->rx_rate_code != 0 && arsta->rx_bitrate_kbps != 0) { in ath10k_mac_sta_get_peer_stats_info()
9290 ath10k_mac_parse_bitrate(ar, arsta->rx_rate_code, in ath10k_mac_sta_get_peer_stats_info()
9291 arsta->rx_bitrate_kbps, in ath10k_mac_sta_get_peer_stats_info()
9292 &sinfo->rxrate); in ath10k_mac_sta_get_peer_stats_info()
9294 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_BITRATE); in ath10k_mac_sta_get_peer_stats_info()
9295 arsta->rx_rate_code = 0; in ath10k_mac_sta_get_peer_stats_info()
9296 arsta->rx_bitrate_kbps = 0; in ath10k_mac_sta_get_peer_stats_info()
9299 if (arsta->tx_rate_code != 0 && arsta->tx_bitrate_kbps != 0) { in ath10k_mac_sta_get_peer_stats_info()
9300 ath10k_mac_parse_bitrate(ar, arsta->tx_rate_code, in ath10k_mac_sta_get_peer_stats_info()
9301 arsta->tx_bitrate_kbps, in ath10k_mac_sta_get_peer_stats_info()
9302 &sinfo->txrate); in ath10k_mac_sta_get_peer_stats_info()
9304 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE); in ath10k_mac_sta_get_peer_stats_info()
9305 arsta->tx_rate_code = 0; in ath10k_mac_sta_get_peer_stats_info()
9306 arsta->tx_bitrate_kbps = 0; in ath10k_mac_sta_get_peer_stats_info()
9315 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv; in ath10k_sta_statistics()
9316 struct ath10k *ar = arsta->arvif->ar; in ath10k_sta_statistics()
9321 mutex_lock(&ar->conf_mutex); in ath10k_sta_statistics()
9323 mutex_unlock(&ar->conf_mutex); in ath10k_sta_statistics()
9325 sinfo->rx_duration = arsta->rx_duration; in ath10k_sta_statistics()
9326 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_DURATION); in ath10k_sta_statistics()
9328 if (arsta->txrate.legacy || arsta->txrate.nss) { in ath10k_sta_statistics()
9329 if (arsta->txrate.legacy) { in ath10k_sta_statistics()
9330 sinfo->txrate.legacy = arsta->txrate.legacy; in ath10k_sta_statistics()
9332 sinfo->txrate.mcs = arsta->txrate.mcs; in ath10k_sta_statistics()
9333 sinfo->txrate.nss = arsta->txrate.nss; in ath10k_sta_statistics()
9334 sinfo->txrate.bw = arsta->txrate.bw; in ath10k_sta_statistics()
9336 sinfo->txrate.flags = arsta->txrate.flags; in ath10k_sta_statistics()
9337 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE); in ath10k_sta_statistics()
9340 if (ar->htt.disable_tx_comp) { in ath10k_sta_statistics()
9341 sinfo->tx_failed = arsta->tx_failed; in ath10k_sta_statistics()
9342 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_FAILED); in ath10k_sta_statistics()
9345 sinfo->tx_retries = arsta->tx_retries; in ath10k_sta_statistics()
9346 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_RETRIES); in ath10k_sta_statistics()
9356 struct ath10k *ar = hw->priv; in ath10k_mac_op_set_tid_config()
9357 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_mac_op_set_tid_config()
9362 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_set_tid_config()
9363 arg.vdev_id = arvif->vdev_id; in ath10k_mac_op_set_tid_config()
9365 arvif->tids_rst = 0; in ath10k_mac_op_set_tid_config()
9366 memset(arvif->tid_conf_changed, 0, sizeof(arvif->tid_conf_changed)); in ath10k_mac_op_set_tid_config()
9368 for (i = 0; i < tid_config->n_tid_conf; i++) { in ath10k_mac_op_set_tid_config()
9370 &tid_config->tid_conf[i], in ath10k_mac_op_set_tid_config()
9381 arvif->tids_rst = 0; in ath10k_mac_op_set_tid_config()
9389 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_set_tid_config()
9398 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_mac_op_reset_tid_config()
9400 struct ath10k *ar = hw->priv; in ath10k_mac_op_reset_tid_config()
9403 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_reset_tid_config()
9406 arvif->tids_rst = 0; in ath10k_mac_op_reset_tid_config()
9411 arvif->tids_rst = tids; in ath10k_mac_op_reset_tid_config()
9418 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_reset_tid_config()
9565 ar = hw->priv; in ath10k_mac_create()
9566 ar->hw = hw; in ath10k_mac_create()
9567 ar->ops = ops; in ath10k_mac_create()
9574 struct ieee80211_ops *ops = ar->ops; in ath10k_mac_destroy()
9576 ieee80211_free_hw(ar->hw); in ath10k_mac_destroy()
9698 /* FIXME: This is not thoroughly tested. These combinations may over- or
9794 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_get_arvif_iter()
9796 if (arvif->vdev_id == arvif_iter->vdev_id) in ath10k_get_arvif_iter()
9797 arvif_iter->arvif = arvif; in ath10k_get_arvif_iter()
9807 ieee80211_iterate_active_interfaces_atomic(ar->hw, in ath10k_get_arvif()
9829 if (wrdd->type != ACPI_TYPE_PACKAGE || in ath10k_mac_wrdd_get_mcc()
9830 wrdd->package.count < 2 || in ath10k_mac_wrdd_get_mcc()
9831 wrdd->package.elements[0].type != ACPI_TYPE_INTEGER || in ath10k_mac_wrdd_get_mcc()
9832 wrdd->package.elements[0].integer.value != 0) { in ath10k_mac_wrdd_get_mcc()
9837 for (i = 1; i < wrdd->package.count; ++i) { in ath10k_mac_wrdd_get_mcc()
9838 mcc_pkg = &wrdd->package.elements[i]; in ath10k_mac_wrdd_get_mcc()
9840 if (mcc_pkg->type != ACPI_TYPE_PACKAGE) in ath10k_mac_wrdd_get_mcc()
9842 if (mcc_pkg->package.count < 2) in ath10k_mac_wrdd_get_mcc()
9844 if (mcc_pkg->package.elements[0].type != ACPI_TYPE_INTEGER || in ath10k_mac_wrdd_get_mcc()
9845 mcc_pkg->package.elements[1].type != ACPI_TYPE_INTEGER) in ath10k_mac_wrdd_get_mcc()
9848 domain_type = &mcc_pkg->package.elements[0]; in ath10k_mac_wrdd_get_mcc()
9849 if (domain_type->integer.value != WRDD_WIFI) in ath10k_mac_wrdd_get_mcc()
9852 mcc_value = &mcc_pkg->package.elements[1]; in ath10k_mac_wrdd_get_mcc()
9853 return mcc_value->integer.value; in ath10k_mac_wrdd_get_mcc()
9867 root_handle = ACPI_HANDLE(ar->dev); in ath10k_mac_get_wrdd_regulatory()
9869 return -EOPNOTSUPP; in ath10k_mac_get_wrdd_regulatory()
9875 return -EIO; in ath10k_mac_get_wrdd_regulatory()
9882 return -EIO; in ath10k_mac_get_wrdd_regulatory()
9888 return -EIO; in ath10k_mac_get_wrdd_regulatory()
9895 "regulatory hint from WRDD (alpha2-code): %s\n", alpha2); in ath10k_mac_get_wrdd_regulatory()
9899 return -EIO; in ath10k_mac_get_wrdd_regulatory()
9914 rd = ar->hw_eeprom_rd; in ath10k_mac_init_rd()
9917 ar->ath_common.regulatory.current_rd = rd; in ath10k_mac_init_rd()
9938 /* Only QCA99x0 and QCA4019 variants support GCMP-128, GCMP-256 in ath10k_mac_register()
9939 * and CCMP-256 in hardware. in ath10k_mac_register()
9949 if (!is_valid_ether_addr(ar->mac_addr)) { in ath10k_mac_register()
9951 eth_random_addr(ar->mac_addr); in ath10k_mac_register()
9953 SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr); in ath10k_mac_register()
9955 SET_IEEE80211_DEV(ar->hw, ar->dev); in ath10k_mac_register()
9961 if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) { in ath10k_mac_register()
9966 ret = -ENOMEM; in ath10k_mac_register()
9970 band = &ar->mac.sbands[NL80211_BAND_2GHZ]; in ath10k_mac_register()
9971 band->n_channels = ARRAY_SIZE(ath10k_2ghz_channels); in ath10k_mac_register()
9972 band->channels = channels; in ath10k_mac_register()
9974 if (ar->hw_params.cck_rate_map_rev2) { in ath10k_mac_register()
9975 band->n_bitrates = ath10k_g_rates_rev2_size; in ath10k_mac_register()
9976 band->bitrates = ath10k_g_rates_rev2; in ath10k_mac_register()
9978 band->n_bitrates = ath10k_g_rates_size; in ath10k_mac_register()
9979 band->bitrates = ath10k_g_rates; in ath10k_mac_register()
9982 ar->hw->wiphy->bands[NL80211_BAND_2GHZ] = band; in ath10k_mac_register()
9985 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) { in ath10k_mac_register()
9990 ret = -ENOMEM; in ath10k_mac_register()
9994 band = &ar->mac.sbands[NL80211_BAND_5GHZ]; in ath10k_mac_register()
9995 band->n_channels = ARRAY_SIZE(ath10k_5ghz_channels); in ath10k_mac_register()
9996 band->channels = channels; in ath10k_mac_register()
9997 band->n_bitrates = ath10k_a_rates_size; in ath10k_mac_register()
9998 band->bitrates = ath10k_a_rates; in ath10k_mac_register()
9999 ar->hw->wiphy->bands[NL80211_BAND_5GHZ] = band; in ath10k_mac_register()
10002 wiphy_read_of_freq_limits(ar->hw->wiphy); in ath10k_mac_register()
10005 ar->hw->wiphy->interface_modes = in ath10k_mac_register()
10010 ar->hw->wiphy->available_antennas_rx = ar->cfg_rx_chainmask; in ath10k_mac_register()
10011 ar->hw->wiphy->available_antennas_tx = ar->cfg_tx_chainmask; in ath10k_mac_register()
10013 if (!test_bit(ATH10K_FW_FEATURE_NO_P2P, ar->normal_mode_fw.fw_file.fw_features)) in ath10k_mac_register()
10014 ar->hw->wiphy->interface_modes |= in ath10k_mac_register()
10019 ieee80211_hw_set(ar->hw, SIGNAL_DBM); in ath10k_mac_register()
10022 ar->running_fw->fw_file.fw_features)) { in ath10k_mac_register()
10023 ieee80211_hw_set(ar->hw, SUPPORTS_PS); in ath10k_mac_register()
10024 ieee80211_hw_set(ar->hw, SUPPORTS_DYNAMIC_PS); in ath10k_mac_register()
10027 ieee80211_hw_set(ar->hw, MFP_CAPABLE); in ath10k_mac_register()
10028 ieee80211_hw_set(ar->hw, REPORTS_TX_ACK_STATUS); in ath10k_mac_register()
10029 ieee80211_hw_set(ar->hw, HAS_RATE_CONTROL); in ath10k_mac_register()
10030 ieee80211_hw_set(ar->hw, AP_LINK_PS); in ath10k_mac_register()
10031 ieee80211_hw_set(ar->hw, SPECTRUM_MGMT); in ath10k_mac_register()
10032 ieee80211_hw_set(ar->hw, SUPPORT_FAST_XMIT); in ath10k_mac_register()
10033 ieee80211_hw_set(ar->hw, CONNECTION_MONITOR); in ath10k_mac_register()
10034 ieee80211_hw_set(ar->hw, SUPPORTS_PER_STA_GTK); in ath10k_mac_register()
10035 ieee80211_hw_set(ar->hw, WANT_MONITOR_VIF); in ath10k_mac_register()
10036 ieee80211_hw_set(ar->hw, CHANCTX_STA_CSA); in ath10k_mac_register()
10037 ieee80211_hw_set(ar->hw, QUEUE_CONTROL); in ath10k_mac_register()
10038 ieee80211_hw_set(ar->hw, SUPPORTS_TX_FRAG); in ath10k_mac_register()
10039 ieee80211_hw_set(ar->hw, REPORTS_LOW_ACK); in ath10k_mac_register()
10041 if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) in ath10k_mac_register()
10042 ieee80211_hw_set(ar->hw, SW_CRYPTO_CONTROL); in ath10k_mac_register()
10044 ar->hw->wiphy->features |= NL80211_FEATURE_STATIC_SMPS; in ath10k_mac_register()
10045 ar->hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN; in ath10k_mac_register()
10047 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) in ath10k_mac_register()
10048 ar->hw->wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS; in ath10k_mac_register()
10050 if (ar->ht_cap_info & WMI_HT_CAP_ENABLED) { in ath10k_mac_register()
10051 ieee80211_hw_set(ar->hw, AMPDU_AGGREGATION); in ath10k_mac_register()
10052 ieee80211_hw_set(ar->hw, TX_AMPDU_SETUP_IN_HW); in ath10k_mac_register()
10055 ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID; in ath10k_mac_register()
10056 ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN; in ath10k_mac_register()
10058 if (test_bit(WMI_SERVICE_NLO, ar->wmi.svc_map)) { in ath10k_mac_register()
10059 ar->hw->wiphy->max_sched_scan_ssids = WMI_PNO_MAX_SUPP_NETWORKS; in ath10k_mac_register()
10060 ar->hw->wiphy->max_match_sets = WMI_PNO_MAX_SUPP_NETWORKS; in ath10k_mac_register()
10061 ar->hw->wiphy->max_sched_scan_ie_len = WMI_PNO_MAX_IE_LENGTH; in ath10k_mac_register()
10062 ar->hw->wiphy->max_sched_scan_plans = WMI_PNO_MAX_SCHED_SCAN_PLANS; in ath10k_mac_register()
10063 ar->hw->wiphy->max_sched_scan_plan_interval = in ath10k_mac_register()
10065 ar->hw->wiphy->max_sched_scan_plan_iterations = in ath10k_mac_register()
10067 ar->hw->wiphy->features |= NL80211_FEATURE_ND_RANDOM_MAC_ADDR; in ath10k_mac_register()
10070 ar->hw->vif_data_size = sizeof(struct ath10k_vif); in ath10k_mac_register()
10071 ar->hw->sta_data_size = sizeof(struct ath10k_sta); in ath10k_mac_register()
10072 ar->hw->txq_data_size = sizeof(struct ath10k_txq); in ath10k_mac_register()
10074 ar->hw->max_listen_interval = ATH10K_MAX_HW_LISTEN_INTERVAL; in ath10k_mac_register()
10076 if (test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map)) { in ath10k_mac_register()
10077 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD; in ath10k_mac_register()
10083 ar->hw->wiphy->probe_resp_offload |= in ath10k_mac_register()
10089 if (test_bit(WMI_SERVICE_TDLS, ar->wmi.svc_map) || in ath10k_mac_register()
10090 test_bit(WMI_SERVICE_TDLS_EXPLICIT_MODE_ONLY, ar->wmi.svc_map)) { in ath10k_mac_register()
10091 ar->hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS; in ath10k_mac_register()
10092 if (test_bit(WMI_SERVICE_TDLS_WIDER_BANDWIDTH, ar->wmi.svc_map)) in ath10k_mac_register()
10093 ieee80211_hw_set(ar->hw, TDLS_WIDER_BW); in ath10k_mac_register()
10096 if (test_bit(WMI_SERVICE_TDLS_UAPSD_BUFFER_STA, ar->wmi.svc_map)) in ath10k_mac_register()
10097 ieee80211_hw_set(ar->hw, SUPPORTS_TDLS_BUFFER_STA); in ath10k_mac_register()
10100 if (ar->wmi.vdev_param->tx_encap_type != in ath10k_mac_register()
10102 ieee80211_hw_set(ar->hw, SUPPORTS_TX_ENCAP_OFFLOAD); in ath10k_mac_register()
10105 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL; in ath10k_mac_register()
10106 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH; in ath10k_mac_register()
10107 ar->hw->wiphy->max_remain_on_channel_duration = 5000; in ath10k_mac_register()
10109 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD; in ath10k_mac_register()
10110 ar->hw->wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE | in ath10k_mac_register()
10113 ar->hw->wiphy->max_ap_assoc_sta = ar->max_num_stations; in ath10k_mac_register()
10121 wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_VHT_IBSS); in ath10k_mac_register()
10122 wiphy_ext_feature_set(ar->hw->wiphy, in ath10k_mac_register()
10124 wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_AQL); in ath10k_mac_register()
10126 if (test_bit(WMI_SERVICE_TX_DATA_ACK_RSSI, ar->wmi.svc_map) || in ath10k_mac_register()
10127 test_bit(WMI_SERVICE_HTT_MGMT_TX_COMP_VALID_FLAGS, ar->wmi.svc_map)) in ath10k_mac_register()
10128 wiphy_ext_feature_set(ar->hw->wiphy, in ath10k_mac_register()
10132 test_bit(WMI_SERVICE_REPORT_AIRTIME, ar->wmi.svc_map)) in ath10k_mac_register()
10133 wiphy_ext_feature_set(ar->hw->wiphy, in ath10k_mac_register()
10136 if (test_bit(WMI_SERVICE_RTT_RESPONDER_ROLE, ar->wmi.svc_map)) in ath10k_mac_register()
10137 wiphy_ext_feature_set(ar->hw->wiphy, in ath10k_mac_register()
10140 if (test_bit(WMI_SERVICE_TX_PWR_PER_PEER, ar->wmi.svc_map)) in ath10k_mac_register()
10141 wiphy_ext_feature_set(ar->hw->wiphy, in ath10k_mac_register()
10144 if (test_bit(WMI_SERVICE_PEER_TID_CONFIGS_SUPPORT, ar->wmi.svc_map)) { in ath10k_mac_register()
10145 ar->hw->wiphy->tid_config_support.vif |= in ath10k_mac_register()
10154 ar->wmi.svc_map)) { in ath10k_mac_register()
10155 ar->hw->wiphy->tid_config_support.vif |= in ath10k_mac_register()
10159 ar->hw->wiphy->tid_config_support.peer = in ath10k_mac_register()
10160 ar->hw->wiphy->tid_config_support.vif; in ath10k_mac_register()
10161 ar->hw->wiphy->max_data_retry_count = ATH10K_MAX_RETRY_COUNT; in ath10k_mac_register()
10163 ar->ops->set_tid_config = NULL; in ath10k_mac_register()
10169 ar->hw->queues = IEEE80211_MAX_QUEUES; in ath10k_mac_register()
10175 ar->hw->offchannel_tx_hw_queue = IEEE80211_MAX_QUEUES - 1; in ath10k_mac_register()
10177 switch (ar->running_fw->fw_file.wmi_op_version) { in ath10k_mac_register()
10179 ar->hw->wiphy->iface_combinations = ath10k_if_comb; in ath10k_mac_register()
10180 ar->hw->wiphy->n_iface_combinations = in ath10k_mac_register()
10182 ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC); in ath10k_mac_register()
10185 if (test_bit(WMI_SERVICE_ADAPTIVE_OCS, ar->wmi.svc_map)) { in ath10k_mac_register()
10186 ar->hw->wiphy->iface_combinations = in ath10k_mac_register()
10188 ar->hw->wiphy->n_iface_combinations = in ath10k_mac_register()
10191 ar->hw->wiphy->iface_combinations = ath10k_tlv_if_comb; in ath10k_mac_register()
10192 ar->hw->wiphy->n_iface_combinations = in ath10k_mac_register()
10195 ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC); in ath10k_mac_register()
10200 ar->hw->wiphy->iface_combinations = ath10k_10x_if_comb; in ath10k_mac_register()
10201 ar->hw->wiphy->n_iface_combinations = in ath10k_mac_register()
10205 ar->hw->wiphy->iface_combinations = ath10k_10_4_if_comb; in ath10k_mac_register()
10206 ar->hw->wiphy->n_iface_combinations = in ath10k_mac_register()
10209 ar->wmi.svc_map)) { in ath10k_mac_register()
10210 ar->hw->wiphy->iface_combinations = in ath10k_mac_register()
10212 ar->hw->wiphy->n_iface_combinations = in ath10k_mac_register()
10219 ret = -EINVAL; in ath10k_mac_register()
10223 if (ar->hw_params.dynamic_sar_support) in ath10k_mac_register()
10224 ar->hw->wiphy->sar_capa = &ath10k_sar_capa; in ath10k_mac_register()
10226 if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) in ath10k_mac_register()
10227 ar->hw->netdev_features = NETIF_F_HW_CSUM; in ath10k_mac_register()
10231 ar->ath_common.debug_mask = ATH_DBG_DFS; in ath10k_mac_register()
10232 ar->dfs_detector = dfs_pattern_detector_init(&ar->ath_common, in ath10k_mac_register()
10235 if (!ar->dfs_detector) in ath10k_mac_register()
10246 if (!ar->hw_params.hw_ops->set_coverage_class) in ath10k_mac_register()
10247 ar->ops->set_coverage_class = NULL; in ath10k_mac_register()
10249 ret = ath_regd_init(&ar->ath_common.regulatory, ar->hw->wiphy, in ath10k_mac_register()
10256 if (test_bit(WMI_SERVICE_SPOOF_MAC_SUPPORT, ar->wmi.svc_map)) { in ath10k_mac_register()
10257 ar->hw->wiphy->features |= in ath10k_mac_register()
10261 ar->hw->wiphy->cipher_suites = cipher_suites; in ath10k_mac_register()
10263 /* QCA988x and QCA6174 family chips do not support CCMP-256, GCMP-128 in ath10k_mac_register()
10264 * and GCMP-256 ciphers in hardware. Fetch number of ciphers supported in ath10k_mac_register()
10267 if (!ar->hw_params.n_cipher_suites || in ath10k_mac_register()
10268 ar->hw_params.n_cipher_suites > ARRAY_SIZE(cipher_suites)) { in ath10k_mac_register()
10270 ar->hw_params.n_cipher_suites); in ath10k_mac_register()
10271 ar->hw_params.n_cipher_suites = 8; in ath10k_mac_register()
10273 ar->hw->wiphy->n_cipher_suites = ar->hw_params.n_cipher_suites; in ath10k_mac_register()
10275 wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST); in ath10k_mac_register()
10277 ar->hw->weight_multiplier = ATH10K_AIRTIME_WEIGHT_MULTIPLIER; in ath10k_mac_register()
10279 ret = ieee80211_register_hw(ar->hw); in ath10k_mac_register()
10285 if (test_bit(WMI_SERVICE_PER_PACKET_SW_ENCRYPT, ar->wmi.svc_map)) { in ath10k_mac_register()
10286 ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_AP_VLAN); in ath10k_mac_register()
10287 ar->hw->wiphy->software_iftypes |= BIT(NL80211_IFTYPE_AP_VLAN); in ath10k_mac_register()
10290 if (!ath_is_world_regd(&ar->ath_common.reg_world_copy) && in ath10k_mac_register()
10291 !ath_is_world_regd(&ar->ath_common.regulatory)) { in ath10k_mac_register()
10292 ret = regulatory_hint(ar->hw->wiphy, in ath10k_mac_register()
10293 ar->ath_common.regulatory.alpha2); in ath10k_mac_register()
10301 ieee80211_unregister_hw(ar->hw); in ath10k_mac_register()
10304 if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) in ath10k_mac_register()
10305 ar->dfs_detector->exit(ar->dfs_detector); in ath10k_mac_register()
10308 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); in ath10k_mac_register()
10309 kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels); in ath10k_mac_register()
10311 SET_IEEE80211_DEV(ar->hw, NULL); in ath10k_mac_register()
10317 ieee80211_unregister_hw(ar->hw); in ath10k_mac_unregister()
10319 if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) in ath10k_mac_unregister()
10320 ar->dfs_detector->exit(ar->dfs_detector); in ath10k_mac_unregister()
10322 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); in ath10k_mac_unregister()
10323 kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels); in ath10k_mac_unregister()
10325 SET_IEEE80211_DEV(ar->hw, NULL); in ath10k_mac_unregister()