Lines Matching +full:ieee80211 +full:- +full:freq +full:- +full:limit
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-2024 Qualcomm Innovation Center, Inc. All rights reserved.
27 #include "wmi-tlv.h"
28 #include "wmi-ops.h"
102 #define ath10k_a_rates_size (ARRAY_SIZE(ath10k_rates) - \
137 for (i = 0; i < sband->n_bitrates; i++) { in ath10k_mac_hw_rate_to_idx()
138 rate = &sband->bitrates[i]; in ath10k_mac_hw_rate_to_idx()
140 if (ath10k_mac_bitrate_is_cck(rate->bitrate) != cck) in ath10k_mac_hw_rate_to_idx()
143 if (rate->hw_value == hw_rate) in ath10k_mac_hw_rate_to_idx()
145 else if (rate->flags & IEEE80211_RATE_SHORT_PREAMBLE && in ath10k_mac_hw_rate_to_idx()
146 rate->hw_value_short == hw_rate) in ath10k_mac_hw_rate_to_idx()
158 for (i = 0; i < sband->n_bitrates; i++) in ath10k_mac_bitrate_to_idx()
159 if (sband->bitrates[i].bitrate == bitrate) in ath10k_mac_bitrate_to_idx()
178 return -EINVAL; in ath10k_mac_get_rate_hw_value()
184 case IEEE80211_VHT_MCS_SUPPORT_0_7: return BIT(8) - 1; in ath10k_mac_get_max_vht_mcs_map()
185 case IEEE80211_VHT_MCS_SUPPORT_0_8: return BIT(9) - 1; in ath10k_mac_get_max_vht_mcs_map()
186 case IEEE80211_VHT_MCS_SUPPORT_0_9: return BIT(10) - 1; in ath10k_mac_get_max_vht_mcs_map()
196 for (nss = IEEE80211_HT_MCS_MASK_LEN - 1; nss >= 0; nss--) in ath10k_mac_max_ht_nss()
208 for (nss = NL80211_VHT_NSS_MAX - 1; nss >= 0; nss--) in ath10k_mac_max_vht_nss()
220 if (test_bit(WMI_SERVICE_TX_MODE_DYNAMIC, ar->wmi.svc_map)) in ath10k_mac_ext_resource_config()
227 if (ret && ret != -EOPNOTSUPP) { in ath10k_mac_ext_resource_config()
244 struct ath10k *ar = arvif->ar; in ath10k_send_key()
246 .vdev_id = arvif->vdev_id, in ath10k_send_key()
247 .key_idx = key->keyidx, in ath10k_send_key()
248 .key_len = key->keylen, in ath10k_send_key()
249 .key_data = key->key, in ath10k_send_key()
254 lockdep_assert_held(&arvif->ar->conf_mutex); in ath10k_send_key()
256 switch (key->cipher) { in ath10k_send_key()
258 arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_AES_CCM]; in ath10k_send_key()
259 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT; in ath10k_send_key()
262 arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_TKIP]; in ath10k_send_key()
268 arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_WEP]; in ath10k_send_key()
271 arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_AES_CCM]; in ath10k_send_key()
275 arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_AES_GCM]; in ath10k_send_key()
276 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT; in ath10k_send_key()
283 return -EINVAL; in ath10k_send_key()
285 ath10k_warn(ar, "cipher %d is not supported\n", key->cipher); in ath10k_send_key()
286 return -EOPNOTSUPP; in ath10k_send_key()
289 if (test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) in ath10k_send_key()
290 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV; in ath10k_send_key()
293 arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_NONE]; in ath10k_send_key()
297 return ath10k_wmi_vdev_install_key(arvif->ar, &arg); in ath10k_send_key()
305 struct ath10k *ar = arvif->ar; in ath10k_install_key()
309 lockdep_assert_held(&ar->conf_mutex); in ath10k_install_key()
311 reinit_completion(&ar->install_key_done); in ath10k_install_key()
313 if (arvif->nohwcrypt) in ath10k_install_key()
320 time_left = wait_for_completion_timeout(&ar->install_key_done, 3 * HZ); in ath10k_install_key()
322 return -ETIMEDOUT; in ath10k_install_key()
330 struct ath10k *ar = arvif->ar; in ath10k_install_peer_wep_keys()
336 lockdep_assert_held(&ar->conf_mutex); in ath10k_install_peer_wep_keys()
338 if (WARN_ON(arvif->vif->type != NL80211_IFTYPE_AP && in ath10k_install_peer_wep_keys()
339 arvif->vif->type != NL80211_IFTYPE_ADHOC && in ath10k_install_peer_wep_keys()
340 arvif->vif->type != NL80211_IFTYPE_MESH_POINT)) in ath10k_install_peer_wep_keys()
341 return -EINVAL; in ath10k_install_peer_wep_keys()
343 spin_lock_bh(&ar->data_lock); in ath10k_install_peer_wep_keys()
344 peer = ath10k_peer_find(ar, arvif->vdev_id, addr); in ath10k_install_peer_wep_keys()
345 spin_unlock_bh(&ar->data_lock); in ath10k_install_peer_wep_keys()
348 return -ENOENT; in ath10k_install_peer_wep_keys()
350 for (i = 0; i < ARRAY_SIZE(arvif->wep_keys); i++) { in ath10k_install_peer_wep_keys()
351 if (arvif->wep_keys[i] == NULL) in ath10k_install_peer_wep_keys()
354 switch (arvif->vif->type) { in ath10k_install_peer_wep_keys()
358 if (arvif->def_wep_key_idx == i) in ath10k_install_peer_wep_keys()
361 ret = ath10k_install_key(arvif, arvif->wep_keys[i], in ath10k_install_peer_wep_keys()
367 ret = ath10k_install_key(arvif, arvif->wep_keys[i], in ath10k_install_peer_wep_keys()
373 ret = ath10k_install_key(arvif, arvif->wep_keys[i], in ath10k_install_peer_wep_keys()
380 return -EINVAL; in ath10k_install_peer_wep_keys()
383 spin_lock_bh(&ar->data_lock); in ath10k_install_peer_wep_keys()
384 peer->keys[i] = arvif->wep_keys[i]; in ath10k_install_peer_wep_keys()
385 spin_unlock_bh(&ar->data_lock); in ath10k_install_peer_wep_keys()
396 if (arvif->vif->type != NL80211_IFTYPE_ADHOC) in ath10k_install_peer_wep_keys()
399 if (arvif->def_wep_key_idx == -1) in ath10k_install_peer_wep_keys()
402 ret = ath10k_wmi_vdev_set_param(arvif->ar, in ath10k_install_peer_wep_keys()
403 arvif->vdev_id, in ath10k_install_peer_wep_keys()
404 arvif->ar->wmi.vdev_param->def_keyid, in ath10k_install_peer_wep_keys()
405 arvif->def_wep_key_idx); in ath10k_install_peer_wep_keys()
407 ath10k_warn(ar, "failed to re-set def wpa key idxon vdev %i: %d\n", in ath10k_install_peer_wep_keys()
408 arvif->vdev_id, ret); in ath10k_install_peer_wep_keys()
418 struct ath10k *ar = arvif->ar; in ath10k_clear_peer_keys()
425 lockdep_assert_held(&ar->conf_mutex); in ath10k_clear_peer_keys()
427 spin_lock_bh(&ar->data_lock); in ath10k_clear_peer_keys()
428 peer = ath10k_peer_find(ar, arvif->vdev_id, addr); in ath10k_clear_peer_keys()
429 spin_unlock_bh(&ar->data_lock); in ath10k_clear_peer_keys()
432 return -ENOENT; in ath10k_clear_peer_keys()
434 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) { in ath10k_clear_peer_keys()
435 if (peer->keys[i] == NULL) in ath10k_clear_peer_keys()
439 ret = ath10k_install_key(arvif, peer->keys[i], in ath10k_clear_peer_keys()
448 spin_lock_bh(&ar->data_lock); in ath10k_clear_peer_keys()
449 peer->keys[i] = NULL; in ath10k_clear_peer_keys()
450 spin_unlock_bh(&ar->data_lock); in ath10k_clear_peer_keys()
462 lockdep_assert_held(&ar->data_lock); in ath10k_mac_is_peer_wep_key_set()
467 * FIXME: multi-bss needs to be handled. in ath10k_mac_is_peer_wep_key_set()
473 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) { in ath10k_mac_is_peer_wep_key_set()
474 if (peer->keys[i] && peer->keys[i]->keyidx == keyidx) in ath10k_mac_is_peer_wep_key_set()
484 struct ath10k *ar = arvif->ar; in ath10k_clear_vdev_key()
492 lockdep_assert_held(&ar->conf_mutex); in ath10k_clear_vdev_key()
498 spin_lock_bh(&ar->data_lock); in ath10k_clear_vdev_key()
500 list_for_each_entry(peer, &ar->peers, list) { in ath10k_clear_vdev_key()
501 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) { in ath10k_clear_vdev_key()
502 if (peer->keys[i] == key) { in ath10k_clear_vdev_key()
503 ether_addr_copy(addr, peer->addr); in ath10k_clear_vdev_key()
504 peer->keys[i] = NULL; in ath10k_clear_vdev_key()
509 if (i < ARRAY_SIZE(peer->keys)) in ath10k_clear_vdev_key()
512 spin_unlock_bh(&ar->data_lock); in ath10k_clear_vdev_key()
514 if (i == ARRAY_SIZE(peer->keys)) in ath10k_clear_vdev_key()
532 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_update_wep_key()
536 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_vif_update_wep_key()
538 list_for_each_entry(peer, &ar->peers, list) { in ath10k_mac_vif_update_wep_key()
539 if (ether_addr_equal(peer->addr, arvif->vif->addr)) in ath10k_mac_vif_update_wep_key()
542 if (ether_addr_equal(peer->addr, arvif->bssid)) in ath10k_mac_vif_update_wep_key()
545 if (peer->keys[key->keyidx] == key) in ath10k_mac_vif_update_wep_key()
549 arvif->vdev_id, key->keyidx); in ath10k_mac_vif_update_wep_key()
551 ret = ath10k_install_peer_wep_keys(arvif, peer->addr); in ath10k_mac_vif_update_wep_key()
554 arvif->vdev_id, peer->addr, ret); in ath10k_mac_vif_update_wep_key()
571 switch (chandef->chan->band) { in chan_to_phymode()
573 switch (chandef->width) { in chan_to_phymode()
575 if (chandef->chan->flags & IEEE80211_CHAN_NO_OFDM) in chan_to_phymode()
592 switch (chandef->width) { in chan_to_phymode()
643 /* Our lower layer calculations limit our precision to in ath10k_parse_mpdudensity()
666 conf = rcu_dereference(vif->bss_conf.chanctx_conf); in ath10k_mac_vif_chan()
669 return -ENOENT; in ath10k_mac_vif_chan()
672 *def = conf->def; in ath10k_mac_vif_chan()
691 ieee80211_iter_chan_contexts_atomic(ar->hw, in ath10k_mac_num_chanctxs()
705 *def = &conf->def; in ath10k_mac_get_any_chandef_iter()
714 if (test_bit(WMI_SERVICE_SYNC_DELETE_CMDS, ar->wmi.svc_map)) { in ath10k_wait_for_peer_delete_done()
721 time_left = wait_for_completion_timeout(&ar->peer_delete_done, in ath10k_wait_for_peer_delete_done()
738 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_create()
741 if (ar->num_peers + list_count_nodes(&ar->arvifs) >= ar->max_num_peers) in ath10k_peer_create()
742 return -ENOBUFS; in ath10k_peer_create()
758 spin_lock_bh(&ar->data_lock); in ath10k_peer_create()
762 spin_unlock_bh(&ar->data_lock); in ath10k_peer_create()
766 return -ENOENT; in ath10k_peer_create()
769 peer->vif = vif; in ath10k_peer_create()
770 peer->sta = sta; in ath10k_peer_create()
772 spin_unlock_bh(&ar->data_lock); in ath10k_peer_create()
774 ar->num_peers++; in ath10k_peer_create()
781 struct ath10k *ar = arvif->ar; in ath10k_mac_set_kickout()
785 param = ar->wmi.pdev_param->sta_kickout_th; in ath10k_mac_set_kickout()
790 arvif->vdev_id, ret); in ath10k_mac_set_kickout()
794 param = ar->wmi.vdev_param->ap_keepalive_min_idle_inactive_time_secs; in ath10k_mac_set_kickout()
795 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param, in ath10k_mac_set_kickout()
799 arvif->vdev_id, ret); in ath10k_mac_set_kickout()
803 param = ar->wmi.vdev_param->ap_keepalive_max_idle_inactive_time_secs; in ath10k_mac_set_kickout()
804 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param, in ath10k_mac_set_kickout()
808 arvif->vdev_id, ret); in ath10k_mac_set_kickout()
812 param = ar->wmi.vdev_param->ap_keepalive_max_unresponsive_time_secs; in ath10k_mac_set_kickout()
813 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param, in ath10k_mac_set_kickout()
817 arvif->vdev_id, ret); in ath10k_mac_set_kickout()
826 struct ath10k *ar = arvif->ar; in ath10k_mac_set_rts()
829 vdev_param = ar->wmi.vdev_param->rts_threshold; in ath10k_mac_set_rts()
830 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, value); in ath10k_mac_set_rts()
837 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_delete()
847 if (test_bit(WMI_SERVICE_SYNC_DELETE_CMDS, ar->wmi.svc_map)) { in ath10k_peer_delete()
851 (&ar->peer_delete_done, 5 * HZ); in ath10k_peer_delete()
855 return -ETIMEDOUT; in ath10k_peer_delete()
859 ar->num_peers--; in ath10k_peer_delete()
868 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_map_cleanup()
870 for_each_set_bit(peer_id, peer->peer_ids, in ath10k_peer_map_cleanup()
872 ar->peer_map[peer_id] = NULL; in ath10k_peer_map_cleanup()
875 /* Double check that peer is properly un-referenced from in ath10k_peer_map_cleanup()
878 for (i = 0; i < ARRAY_SIZE(ar->peer_map); i++) { in ath10k_peer_map_cleanup()
879 if (ar->peer_map[i] == peer) { in ath10k_peer_map_cleanup()
881 peer->addr, peer, i); in ath10k_peer_map_cleanup()
882 ar->peer_map[i] = NULL; in ath10k_peer_map_cleanup()
886 list_del(&peer->list); in ath10k_peer_map_cleanup()
888 ar->num_peers--; in ath10k_peer_map_cleanup()
895 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_cleanup()
897 spin_lock_bh(&ar->data_lock); in ath10k_peer_cleanup()
898 list_for_each_entry_safe(peer, tmp, &ar->peers, list) { in ath10k_peer_cleanup()
899 if (peer->vdev_id != vdev_id) in ath10k_peer_cleanup()
903 peer->addr, vdev_id); in ath10k_peer_cleanup()
907 spin_unlock_bh(&ar->data_lock); in ath10k_peer_cleanup()
915 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_cleanup_all()
917 spin_lock_bh(&ar->data_lock); in ath10k_peer_cleanup_all()
918 list_for_each_entry_safe(peer, tmp, &ar->peers, list) { in ath10k_peer_cleanup_all()
919 list_del(&peer->list); in ath10k_peer_cleanup_all()
923 for (i = 0; i < ARRAY_SIZE(ar->peer_map); i++) in ath10k_peer_cleanup_all()
924 ar->peer_map[i] = NULL; in ath10k_peer_cleanup_all()
926 spin_unlock_bh(&ar->data_lock); in ath10k_peer_cleanup_all()
928 ar->num_peers = 0; in ath10k_peer_cleanup_all()
929 ar->num_stations = 0; in ath10k_peer_cleanup_all()
941 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_tdls_peer_update()
945 ether_addr_copy(arg.addr, sta->addr); in ath10k_mac_tdls_peer_update()
947 cap.peer_max_sp = sta->max_sp; in ath10k_mac_tdls_peer_update()
948 cap.peer_uapsd_queues = sta->uapsd_queues; in ath10k_mac_tdls_peer_update()
951 !sta->tdls_initiator) in ath10k_mac_tdls_peer_update()
970 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_beacon_free()
972 lockdep_assert_held(&ar->data_lock); in ath10k_mac_vif_beacon_free()
974 if (!arvif->beacon) in ath10k_mac_vif_beacon_free()
977 if (!arvif->beacon_buf) in ath10k_mac_vif_beacon_free()
978 dma_unmap_single(ar->dev, ATH10K_SKB_CB(arvif->beacon)->paddr, in ath10k_mac_vif_beacon_free()
979 arvif->beacon->len, DMA_TO_DEVICE); in ath10k_mac_vif_beacon_free()
981 if (WARN_ON(arvif->beacon_state != ATH10K_BEACON_SCHEDULED && in ath10k_mac_vif_beacon_free()
982 arvif->beacon_state != ATH10K_BEACON_SENT)) in ath10k_mac_vif_beacon_free()
985 dev_kfree_skb_any(arvif->beacon); in ath10k_mac_vif_beacon_free()
987 arvif->beacon = NULL; in ath10k_mac_vif_beacon_free()
988 arvif->beacon_state = ATH10K_BEACON_SCHEDULED; in ath10k_mac_vif_beacon_free()
993 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_beacon_cleanup()
995 lockdep_assert_held(&ar->data_lock); in ath10k_mac_vif_beacon_cleanup()
999 if (arvif->beacon_buf) { in ath10k_mac_vif_beacon_cleanup()
1000 if (ar->bus_param.dev_type == ATH10K_DEV_TYPE_HL) in ath10k_mac_vif_beacon_cleanup()
1001 kfree(arvif->beacon_buf); in ath10k_mac_vif_beacon_cleanup()
1003 dma_free_coherent(ar->dev, IEEE80211_MAX_FRAME_LEN, in ath10k_mac_vif_beacon_cleanup()
1004 arvif->beacon_buf, in ath10k_mac_vif_beacon_cleanup()
1005 arvif->beacon_paddr); in ath10k_mac_vif_beacon_cleanup()
1006 arvif->beacon_buf = NULL; in ath10k_mac_vif_beacon_cleanup()
1014 lockdep_assert_held(&ar->conf_mutex); in ath10k_vdev_setup_sync()
1016 if (test_bit(ATH10K_FLAG_CRASH_FLUSH, &ar->dev_flags)) in ath10k_vdev_setup_sync()
1017 return -ESHUTDOWN; in ath10k_vdev_setup_sync()
1019 time_left = wait_for_completion_timeout(&ar->vdev_setup_done, in ath10k_vdev_setup_sync()
1022 return -ETIMEDOUT; in ath10k_vdev_setup_sync()
1024 return ar->last_wmi_vdev_start_status; in ath10k_vdev_setup_sync()
1031 lockdep_assert_held(&ar->conf_mutex); in ath10k_vdev_delete_sync()
1033 if (!test_bit(WMI_SERVICE_SYNC_DELETE_CMDS, ar->wmi.svc_map)) in ath10k_vdev_delete_sync()
1036 if (test_bit(ATH10K_FLAG_CRASH_FLUSH, &ar->dev_flags)) in ath10k_vdev_delete_sync()
1037 return -ESHUTDOWN; in ath10k_vdev_delete_sync()
1039 time_left = wait_for_completion_timeout(&ar->vdev_delete_done, in ath10k_vdev_delete_sync()
1042 return -ETIMEDOUT; in ath10k_vdev_delete_sync()
1054 lockdep_assert_held(&ar->conf_mutex); in ath10k_monitor_vdev_start()
1056 ieee80211_iter_chan_contexts_atomic(ar->hw, in ath10k_monitor_vdev_start()
1060 return -ENOENT; in ath10k_monitor_vdev_start()
1062 channel = chandef->chan; in ath10k_monitor_vdev_start()
1065 arg.channel.freq = channel->center_freq; in ath10k_monitor_vdev_start()
1066 arg.channel.band_center_freq1 = chandef->center_freq1; in ath10k_monitor_vdev_start()
1067 arg.channel.band_center_freq2 = chandef->center_freq2; in ath10k_monitor_vdev_start()
1074 !!(channel->flags & IEEE80211_CHAN_RADAR); in ath10k_monitor_vdev_start()
1077 arg.channel.max_power = channel->max_power * 2; in ath10k_monitor_vdev_start()
1078 arg.channel.max_reg_power = channel->max_reg_power * 2; in ath10k_monitor_vdev_start()
1079 arg.channel.max_antenna_gain = channel->max_antenna_gain; in ath10k_monitor_vdev_start()
1081 reinit_completion(&ar->vdev_setup_done); in ath10k_monitor_vdev_start()
1082 reinit_completion(&ar->vdev_delete_done); in ath10k_monitor_vdev_start()
1098 ret = ath10k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr); in ath10k_monitor_vdev_start()
1105 ar->monitor_vdev_id = vdev_id; in ath10k_monitor_vdev_start()
1108 ar->monitor_vdev_id); in ath10k_monitor_vdev_start()
1112 ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id); in ath10k_monitor_vdev_start()
1115 ar->monitor_vdev_id, ret); in ath10k_monitor_vdev_start()
1124 lockdep_assert_held(&ar->conf_mutex); in ath10k_monitor_vdev_stop()
1126 ret = ath10k_wmi_vdev_down(ar, ar->monitor_vdev_id); in ath10k_monitor_vdev_stop()
1129 ar->monitor_vdev_id, ret); in ath10k_monitor_vdev_stop()
1131 reinit_completion(&ar->vdev_setup_done); in ath10k_monitor_vdev_stop()
1132 reinit_completion(&ar->vdev_delete_done); in ath10k_monitor_vdev_stop()
1134 ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id); in ath10k_monitor_vdev_stop()
1137 ar->monitor_vdev_id, ret); in ath10k_monitor_vdev_stop()
1142 ar->monitor_vdev_id, ret); in ath10k_monitor_vdev_stop()
1145 ar->monitor_vdev_id); in ath10k_monitor_vdev_stop()
1153 lockdep_assert_held(&ar->conf_mutex); in ath10k_monitor_vdev_create()
1155 if (ar->free_vdev_map == 0) { in ath10k_monitor_vdev_create()
1157 return -ENOMEM; in ath10k_monitor_vdev_create()
1160 bit = __ffs64(ar->free_vdev_map); in ath10k_monitor_vdev_create()
1162 ar->monitor_vdev_id = bit; in ath10k_monitor_vdev_create()
1164 ret = ath10k_wmi_vdev_create(ar, ar->monitor_vdev_id, in ath10k_monitor_vdev_create()
1166 0, ar->mac_addr); in ath10k_monitor_vdev_create()
1169 ar->monitor_vdev_id, ret); in ath10k_monitor_vdev_create()
1173 ar->free_vdev_map &= ~(1LL << ar->monitor_vdev_id); in ath10k_monitor_vdev_create()
1175 ar->monitor_vdev_id); in ath10k_monitor_vdev_create()
1184 lockdep_assert_held(&ar->conf_mutex); in ath10k_monitor_vdev_delete()
1186 ret = ath10k_wmi_vdev_delete(ar, ar->monitor_vdev_id); in ath10k_monitor_vdev_delete()
1189 ar->monitor_vdev_id, ret); in ath10k_monitor_vdev_delete()
1193 ar->free_vdev_map |= 1LL << ar->monitor_vdev_id; in ath10k_monitor_vdev_delete()
1196 ar->monitor_vdev_id); in ath10k_monitor_vdev_delete()
1204 lockdep_assert_held(&ar->conf_mutex); in ath10k_monitor_start()
1212 ret = ath10k_monitor_vdev_start(ar, ar->monitor_vdev_id); in ath10k_monitor_start()
1219 ar->monitor_started = true; in ath10k_monitor_start()
1229 lockdep_assert_held(&ar->conf_mutex); in ath10k_monitor_stop()
1243 ar->monitor_started = false; in ath10k_monitor_stop()
1263 if (ar->monitor_arvif) in ath10k_mac_monitor_vdev_is_needed()
1266 return ar->monitor || in ath10k_mac_monitor_vdev_is_needed()
1268 ar->running_fw->fw_file.fw_features) && in ath10k_mac_monitor_vdev_is_needed()
1269 (ar->filter_flags & (FIF_OTHER_BSS | FIF_MCAST_ACTION))) || in ath10k_mac_monitor_vdev_is_needed()
1270 test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags); in ath10k_mac_monitor_vdev_is_needed()
1281 * case anyway since multi-channel DFS hasn't been tested at all. in ath10k_mac_monitor_vdev_is_allowed()
1283 if (test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags) && num_ctx > 1) in ath10k_mac_monitor_vdev_is_allowed()
1295 lockdep_assert_held(&ar->conf_mutex); in ath10k_monitor_recalc()
1302 ar->monitor_started, needed, allowed); in ath10k_monitor_recalc()
1305 if (ar->monitor_started) { in ath10k_monitor_recalc()
1315 return -EPERM; in ath10k_monitor_recalc()
1318 if (needed == ar->monitor_started) in ath10k_monitor_recalc()
1329 struct ath10k *ar = arvif->ar; in ath10k_mac_can_set_cts_prot()
1331 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_can_set_cts_prot()
1333 if (!arvif->is_started) { in ath10k_mac_can_set_cts_prot()
1343 struct ath10k *ar = arvif->ar; in ath10k_mac_set_cts_prot()
1346 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_set_cts_prot()
1348 vdev_param = ar->wmi.vdev_param->protection_mode; in ath10k_mac_set_cts_prot()
1351 arvif->vdev_id, arvif->use_cts_prot); in ath10k_mac_set_cts_prot()
1353 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_mac_set_cts_prot()
1354 arvif->use_cts_prot ? 1 : 0); in ath10k_mac_set_cts_prot()
1359 struct ath10k *ar = arvif->ar; in ath10k_recalc_rtscts_prot()
1362 lockdep_assert_held(&ar->conf_mutex); in ath10k_recalc_rtscts_prot()
1364 vdev_param = ar->wmi.vdev_param->enable_rtscts; in ath10k_recalc_rtscts_prot()
1368 if (arvif->num_legacy_stations > 0) in ath10k_recalc_rtscts_prot()
1376 arvif->vdev_id, rts_cts); in ath10k_recalc_rtscts_prot()
1378 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_recalc_rtscts_prot()
1386 lockdep_assert_held(&ar->conf_mutex); in ath10k_start_cac()
1388 set_bit(ATH10K_CAC_RUNNING, &ar->dev_flags); in ath10k_start_cac()
1393 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags); in ath10k_start_cac()
1398 ar->monitor_vdev_id); in ath10k_start_cac()
1405 lockdep_assert_held(&ar->conf_mutex); in ath10k_stop_cac()
1407 /* CAC is not running - do nothing */ in ath10k_stop_cac()
1408 if (!test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags)) in ath10k_stop_cac()
1411 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags); in ath10k_stop_cac()
1425 if (!*ret && conf->radar_enabled) in ath10k_mac_has_radar_iter()
1433 ieee80211_iter_chan_contexts_atomic(ar->hw, in ath10k_mac_has_radar_enabled()
1444 lockdep_assert_held(&ar->conf_mutex); in ath10k_recalc_radar_detection()
1451 if (ar->num_started_vdevs > 0) in ath10k_recalc_radar_detection()
1462 ieee80211_radar_detected(ar->hw, NULL); in ath10k_recalc_radar_detection()
1468 struct ath10k *ar = arvif->ar; in ath10k_vdev_stop()
1471 lockdep_assert_held(&ar->conf_mutex); in ath10k_vdev_stop()
1473 reinit_completion(&ar->vdev_setup_done); in ath10k_vdev_stop()
1474 reinit_completion(&ar->vdev_delete_done); in ath10k_vdev_stop()
1476 ret = ath10k_wmi_vdev_stop(ar, arvif->vdev_id); in ath10k_vdev_stop()
1479 arvif->vdev_id, ret); in ath10k_vdev_stop()
1486 arvif->vdev_id, ret); in ath10k_vdev_stop()
1490 WARN_ON(ar->num_started_vdevs == 0); in ath10k_vdev_stop()
1492 if (ar->num_started_vdevs != 0) { in ath10k_vdev_stop()
1493 ar->num_started_vdevs--; in ath10k_vdev_stop()
1504 struct ath10k *ar = arvif->ar; in ath10k_vdev_start_restart()
1508 lockdep_assert_held(&ar->conf_mutex); in ath10k_vdev_start_restart()
1510 reinit_completion(&ar->vdev_setup_done); in ath10k_vdev_start_restart()
1511 reinit_completion(&ar->vdev_delete_done); in ath10k_vdev_start_restart()
1513 arg.vdev_id = arvif->vdev_id; in ath10k_vdev_start_restart()
1514 arg.dtim_period = arvif->dtim_period; in ath10k_vdev_start_restart()
1515 arg.bcn_intval = arvif->beacon_interval; in ath10k_vdev_start_restart()
1517 arg.channel.freq = chandef->chan->center_freq; in ath10k_vdev_start_restart()
1518 arg.channel.band_center_freq1 = chandef->center_freq1; in ath10k_vdev_start_restart()
1519 arg.channel.band_center_freq2 = chandef->center_freq2; in ath10k_vdev_start_restart()
1523 arg.channel.max_power = chandef->chan->max_power * 2; in ath10k_vdev_start_restart()
1524 arg.channel.max_reg_power = chandef->chan->max_reg_power * 2; in ath10k_vdev_start_restart()
1525 arg.channel.max_antenna_gain = chandef->chan->max_antenna_gain; in ath10k_vdev_start_restart()
1527 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) { in ath10k_vdev_start_restart()
1528 arg.ssid = arvif->u.ap.ssid; in ath10k_vdev_start_restart()
1529 arg.ssid_len = arvif->u.ap.ssid_len; in ath10k_vdev_start_restart()
1530 arg.hidden_ssid = arvif->u.ap.hidden_ssid; in ath10k_vdev_start_restart()
1534 !!(chandef->chan->flags & IEEE80211_CHAN_RADAR); in ath10k_vdev_start_restart()
1535 } else if (arvif->vdev_type == WMI_VDEV_TYPE_IBSS) { in ath10k_vdev_start_restart()
1536 arg.ssid = arvif->vif->cfg.ssid; in ath10k_vdev_start_restart()
1537 arg.ssid_len = arvif->vif->cfg.ssid_len; in ath10k_vdev_start_restart()
1542 arg.vdev_id, arg.channel.freq, in ath10k_vdev_start_restart()
1564 ar->num_started_vdevs++; in ath10k_vdev_start_restart()
1585 struct ath10k *ar = arvif->ar; in ath10k_mac_setup_bcn_p2p_ie()
1590 if (arvif->vif->type != NL80211_IFTYPE_AP || !arvif->vif->p2p) in ath10k_mac_setup_bcn_p2p_ie()
1593 mgmt = (void *)bcn->data; in ath10k_mac_setup_bcn_p2p_ie()
1595 mgmt->u.beacon.variable, in ath10k_mac_setup_bcn_p2p_ie()
1596 bcn->len - (mgmt->u.beacon.variable - in ath10k_mac_setup_bcn_p2p_ie()
1597 bcn->data)); in ath10k_mac_setup_bcn_p2p_ie()
1599 return -ENOENT; in ath10k_mac_setup_bcn_p2p_ie()
1601 ret = ath10k_wmi_p2p_go_bcn_ie(ar, arvif->vdev_id, p2p_ie); in ath10k_mac_setup_bcn_p2p_ie()
1604 arvif->vdev_id, ret); in ath10k_mac_setup_bcn_p2p_ie()
1619 if (WARN_ON(skb->len < ie_offset)) in ath10k_mac_remove_vendor_ie()
1620 return -EINVAL; in ath10k_mac_remove_vendor_ie()
1623 skb->data + ie_offset, in ath10k_mac_remove_vendor_ie()
1624 skb->len - ie_offset); in ath10k_mac_remove_vendor_ie()
1626 return -ENOENT; in ath10k_mac_remove_vendor_ie()
1629 end = skb->data + skb->len; in ath10k_mac_remove_vendor_ie()
1633 return -EINVAL; in ath10k_mac_remove_vendor_ie()
1635 memmove(ie, next, end - next); in ath10k_mac_remove_vendor_ie()
1636 skb_trim(skb, skb->len - len); in ath10k_mac_remove_vendor_ie()
1643 struct ath10k *ar = arvif->ar; in ath10k_mac_setup_bcn_tmpl()
1644 struct ieee80211_hw *hw = ar->hw; in ath10k_mac_setup_bcn_tmpl()
1645 struct ieee80211_vif *vif = arvif->vif; in ath10k_mac_setup_bcn_tmpl()
1650 if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map)) in ath10k_mac_setup_bcn_tmpl()
1653 if (arvif->vdev_type != WMI_VDEV_TYPE_AP && in ath10k_mac_setup_bcn_tmpl()
1654 arvif->vdev_type != WMI_VDEV_TYPE_IBSS) in ath10k_mac_setup_bcn_tmpl()
1660 return -EPERM; in ath10k_mac_setup_bcn_tmpl()
1678 ret = ath10k_wmi_bcn_tmpl(ar, arvif->vdev_id, offs.tim_offset, bcn, 0, in ath10k_mac_setup_bcn_tmpl()
1693 struct ath10k *ar = arvif->ar; in ath10k_mac_setup_prb_tmpl()
1694 struct ieee80211_hw *hw = ar->hw; in ath10k_mac_setup_prb_tmpl()
1695 struct ieee80211_vif *vif = arvif->vif; in ath10k_mac_setup_prb_tmpl()
1699 if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map)) in ath10k_mac_setup_prb_tmpl()
1702 if (arvif->vdev_type != WMI_VDEV_TYPE_AP) in ath10k_mac_setup_prb_tmpl()
1712 return -EPERM; in ath10k_mac_setup_prb_tmpl()
1715 ret = ath10k_wmi_prb_tmpl(ar, arvif->vdev_id, prb); in ath10k_mac_setup_prb_tmpl()
1729 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_fix_hidden_ssid()
1744 * since only wmi-tlv firmware are known to have beacon offload and in ath10k_mac_vif_fix_hidden_ssid()
1745 * wmi-tlv doesn't seem to misbehave like 10.2 wrt vdev restart in ath10k_mac_vif_fix_hidden_ssid()
1748 if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map)) in ath10k_mac_vif_fix_hidden_ssid()
1751 if (WARN_ON(!arvif->is_started)) in ath10k_mac_vif_fix_hidden_ssid()
1752 return -EINVAL; in ath10k_mac_vif_fix_hidden_ssid()
1754 if (WARN_ON(!arvif->is_up)) in ath10k_mac_vif_fix_hidden_ssid()
1755 return -EINVAL; in ath10k_mac_vif_fix_hidden_ssid()
1757 if (WARN_ON(ath10k_mac_vif_chan(arvif->vif, &def))) in ath10k_mac_vif_fix_hidden_ssid()
1758 return -EINVAL; in ath10k_mac_vif_fix_hidden_ssid()
1760 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id); in ath10k_mac_vif_fix_hidden_ssid()
1763 arvif->vdev_id, ret); in ath10k_mac_vif_fix_hidden_ssid()
1786 arvif->vdev_id, ret); in ath10k_mac_vif_fix_hidden_ssid()
1790 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid, in ath10k_mac_vif_fix_hidden_ssid()
1791 arvif->bssid); in ath10k_mac_vif_fix_hidden_ssid()
1794 arvif->vdev_id, ret); in ath10k_mac_vif_fix_hidden_ssid()
1804 struct ath10k *ar = arvif->ar; in ath10k_control_beaconing()
1807 lockdep_assert_held(&arvif->ar->conf_mutex); in ath10k_control_beaconing()
1809 if (!info->enable_beacon) { in ath10k_control_beaconing()
1810 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id); in ath10k_control_beaconing()
1813 arvif->vdev_id, ret); in ath10k_control_beaconing()
1815 arvif->is_up = false; in ath10k_control_beaconing()
1817 spin_lock_bh(&arvif->ar->data_lock); in ath10k_control_beaconing()
1819 spin_unlock_bh(&arvif->ar->data_lock); in ath10k_control_beaconing()
1824 arvif->tx_seq_no = 0x1000; in ath10k_control_beaconing()
1826 arvif->aid = 0; in ath10k_control_beaconing()
1827 ether_addr_copy(arvif->bssid, info->bssid); in ath10k_control_beaconing()
1829 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid, in ath10k_control_beaconing()
1830 arvif->bssid); in ath10k_control_beaconing()
1833 arvif->vdev_id, ret); in ath10k_control_beaconing()
1837 arvif->is_up = true; in ath10k_control_beaconing()
1842 arvif->vdev_id, ret); in ath10k_control_beaconing()
1846 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d up\n", arvif->vdev_id); in ath10k_control_beaconing()
1852 struct ath10k *ar = arvif->ar; in ath10k_control_ibss()
1856 lockdep_assert_held(&arvif->ar->conf_mutex); in ath10k_control_ibss()
1858 if (!vif->cfg.ibss_joined) { in ath10k_control_ibss()
1859 if (is_zero_ether_addr(arvif->bssid)) in ath10k_control_ibss()
1862 eth_zero_addr(arvif->bssid); in ath10k_control_ibss()
1867 vdev_param = arvif->ar->wmi.vdev_param->atim_window; in ath10k_control_ibss()
1868 ret = ath10k_wmi_vdev_set_param(arvif->ar, arvif->vdev_id, vdev_param, in ath10k_control_ibss()
1872 arvif->vdev_id, ret); in ath10k_control_ibss()
1877 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_recalc_ps_wake_threshold()
1882 lockdep_assert_held(&arvif->ar->conf_mutex); in ath10k_mac_vif_recalc_ps_wake_threshold()
1884 if (arvif->u.sta.uapsd) in ath10k_mac_vif_recalc_ps_wake_threshold()
1890 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param, value); in ath10k_mac_vif_recalc_ps_wake_threshold()
1893 value, arvif->vdev_id, ret); in ath10k_mac_vif_recalc_ps_wake_threshold()
1902 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_recalc_ps_poll_count()
1907 lockdep_assert_held(&arvif->ar->conf_mutex); in ath10k_mac_vif_recalc_ps_poll_count()
1909 if (arvif->u.sta.uapsd) in ath10k_mac_vif_recalc_ps_poll_count()
1915 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath10k_mac_vif_recalc_ps_poll_count()
1919 value, arvif->vdev_id, ret); in ath10k_mac_vif_recalc_ps_poll_count()
1931 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_num_vifs_started()
1933 list_for_each_entry(arvif, &ar->arvifs, list) in ath10k_mac_num_vifs_started()
1934 if (arvif->is_started) in ath10k_mac_num_vifs_started()
1942 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_setup_ps()
1943 struct ieee80211_vif *vif = arvif->vif; in ath10k_mac_vif_setup_ps()
1944 struct ieee80211_conf *conf = &ar->hw->conf; in ath10k_mac_vif_setup_ps()
1951 lockdep_assert_held(&arvif->ar->conf_mutex); in ath10k_mac_vif_setup_ps()
1953 if (arvif->vif->type != NL80211_IFTYPE_STATION) in ath10k_mac_vif_setup_ps()
1956 enable_ps = arvif->ps; in ath10k_mac_vif_setup_ps()
1960 ar->running_fw->fw_file.fw_features)) { in ath10k_mac_vif_setup_ps()
1962 arvif->vdev_id); in ath10k_mac_vif_setup_ps()
1966 if (!arvif->is_started) { in ath10k_mac_vif_setup_ps()
1969 * necessary if PS is disabled on a non-started vdev. Hence in ath10k_mac_vif_setup_ps()
1970 * force-enable PS for non-running vdevs. in ath10k_mac_vif_setup_ps()
1977 ps_timeout = conf->dynamic_ps_timeout; in ath10k_mac_vif_setup_ps()
1981 vif->bss_conf.beacon_int) / 1000; in ath10k_mac_vif_setup_ps()
1984 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param, in ath10k_mac_vif_setup_ps()
1988 arvif->vdev_id, ret); in ath10k_mac_vif_setup_ps()
1996 arvif->vdev_id, psmode ? "enable" : "disable"); in ath10k_mac_vif_setup_ps()
1998 ret = ath10k_wmi_set_psmode(ar, arvif->vdev_id, psmode); in ath10k_mac_vif_setup_ps()
2001 psmode, arvif->vdev_id, ret); in ath10k_mac_vif_setup_ps()
2010 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_disable_keepalive()
2014 lockdep_assert_held(&arvif->ar->conf_mutex); in ath10k_mac_vif_disable_keepalive()
2016 if (arvif->vdev_type != WMI_VDEV_TYPE_STA) in ath10k_mac_vif_disable_keepalive()
2019 if (!test_bit(WMI_SERVICE_STA_KEEP_ALIVE, ar->wmi.svc_map)) in ath10k_mac_vif_disable_keepalive()
2025 arg.vdev_id = arvif->vdev_id; in ath10k_mac_vif_disable_keepalive()
2033 arvif->vdev_id, ret); in ath10k_mac_vif_disable_keepalive()
2042 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_ap_csa_count_down()
2043 struct ieee80211_vif *vif = arvif->vif; in ath10k_mac_vif_ap_csa_count_down()
2046 lockdep_assert_held(&arvif->ar->conf_mutex); in ath10k_mac_vif_ap_csa_count_down()
2048 if (WARN_ON(!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map))) in ath10k_mac_vif_ap_csa_count_down()
2051 if (arvif->vdev_type != WMI_VDEV_TYPE_AP) in ath10k_mac_vif_ap_csa_count_down()
2054 if (!vif->bss_conf.csa_active) in ath10k_mac_vif_ap_csa_count_down()
2057 if (!arvif->is_up) in ath10k_mac_vif_ap_csa_count_down()
2081 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_ap_csa_work()
2083 mutex_lock(&ar->conf_mutex); in ath10k_mac_vif_ap_csa_work()
2085 mutex_unlock(&ar->conf_mutex); in ath10k_mac_vif_ap_csa_work()
2092 struct ieee80211_mgmt *mgmt = (void *)skb->data; in ath10k_mac_handle_beacon_iter()
2093 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_mac_handle_beacon_iter()
2095 if (vif->type != NL80211_IFTYPE_STATION) in ath10k_mac_handle_beacon_iter()
2098 if (!ether_addr_equal(mgmt->bssid, vif->bss_conf.bssid)) in ath10k_mac_handle_beacon_iter()
2101 cancel_delayed_work(&arvif->connection_loss_work); in ath10k_mac_handle_beacon_iter()
2106 ieee80211_iterate_active_interfaces_atomic(ar->hw, in ath10k_mac_handle_beacon()
2116 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_mac_handle_beacon_miss_iter()
2117 struct ath10k *ar = arvif->ar; in ath10k_mac_handle_beacon_miss_iter()
2118 struct ieee80211_hw *hw = ar->hw; in ath10k_mac_handle_beacon_miss_iter()
2120 if (arvif->vdev_id != *vdev_id) in ath10k_mac_handle_beacon_miss_iter()
2123 if (!arvif->is_up) in ath10k_mac_handle_beacon_miss_iter()
2133 ieee80211_queue_delayed_work(hw, &arvif->connection_loss_work, in ath10k_mac_handle_beacon_miss_iter()
2139 ieee80211_iterate_active_interfaces_atomic(ar->hw, in ath10k_mac_handle_beacon_miss()
2149 struct ieee80211_vif *vif = arvif->vif; in ath10k_mac_vif_sta_connection_loss_work()
2151 if (!arvif->is_up) in ath10k_mac_vif_sta_connection_loss_work()
2172 if (vif->type == NL80211_IFTYPE_STATION) in ath10k_peer_assoc_h_listen_intval()
2175 return ar->hw->conf.listen_interval; in ath10k_peer_assoc_h_listen_intval()
2183 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_peer_assoc_h_basic()
2186 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_assoc_h_basic()
2188 if (vif->type == NL80211_IFTYPE_STATION) in ath10k_peer_assoc_h_basic()
2189 aid = vif->cfg.aid; in ath10k_peer_assoc_h_basic()
2191 aid = sta->aid; in ath10k_peer_assoc_h_basic()
2193 ether_addr_copy(arg->addr, sta->addr); in ath10k_peer_assoc_h_basic()
2194 arg->vdev_id = arvif->vdev_id; in ath10k_peer_assoc_h_basic()
2195 arg->peer_aid = aid; in ath10k_peer_assoc_h_basic()
2196 arg->peer_flags |= arvif->ar->wmi.peer_flags->auth; in ath10k_peer_assoc_h_basic()
2197 arg->peer_listen_intval = ath10k_peer_assoc_h_listen_intval(ar, vif); in ath10k_peer_assoc_h_basic()
2198 arg->peer_num_spatial_streams = 1; in ath10k_peer_assoc_h_basic()
2199 arg->peer_caps = vif->bss_conf.assoc_capability; in ath10k_peer_assoc_h_basic()
2207 struct ieee80211_bss_conf *info = &vif->bss_conf; in ath10k_peer_assoc_h_crypto()
2213 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_assoc_h_crypto()
2218 bss = cfg80211_get_bss(ar->hw->wiphy, def.chan, info->bssid, in ath10k_peer_assoc_h_crypto()
2219 vif->cfg.ssid_len ? vif->cfg.ssid : NULL, in ath10k_peer_assoc_h_crypto()
2220 vif->cfg.ssid_len, in ath10k_peer_assoc_h_crypto()
2228 ies = rcu_dereference(bss->ies); in ath10k_peer_assoc_h_crypto()
2232 ies->data, in ath10k_peer_assoc_h_crypto()
2233 ies->len); in ath10k_peer_assoc_h_crypto()
2235 cfg80211_put_bss(ar->hw->wiphy, bss); in ath10k_peer_assoc_h_crypto()
2241 arg->peer_flags |= ar->wmi.peer_flags->need_ptk_4_way; in ath10k_peer_assoc_h_crypto()
2246 arg->peer_flags |= ar->wmi.peer_flags->need_gtk_2_way; in ath10k_peer_assoc_h_crypto()
2249 if (sta->mfp && in ath10k_peer_assoc_h_crypto()
2251 ar->running_fw->fw_file.fw_features)) { in ath10k_peer_assoc_h_crypto()
2252 arg->peer_flags |= ar->wmi.peer_flags->pmf; in ath10k_peer_assoc_h_crypto()
2261 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_peer_assoc_h_rates()
2262 struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates; in ath10k_peer_assoc_h_rates()
2271 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_assoc_h_rates()
2276 band = def.chan->band; in ath10k_peer_assoc_h_rates()
2277 sband = ar->hw->wiphy->bands[band]; in ath10k_peer_assoc_h_rates()
2278 ratemask = sta->deflink.supp_rates[band]; in ath10k_peer_assoc_h_rates()
2279 ratemask &= arvif->bitrate_mask.control[band].legacy; in ath10k_peer_assoc_h_rates()
2280 rates = sband->bitrates; in ath10k_peer_assoc_h_rates()
2282 rateset->num_rates = 0; in ath10k_peer_assoc_h_rates()
2288 rate = ath10k_mac_bitrate_to_rate(rates->bitrate); in ath10k_peer_assoc_h_rates()
2289 rateset->rates[rateset->num_rates] = rate; in ath10k_peer_assoc_h_rates()
2290 rateset->num_rates++; in ath10k_peer_assoc_h_rates()
2323 const struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap; in ath10k_peer_assoc_h_ht()
2324 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_peer_assoc_h_ht()
2333 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_assoc_h_ht()
2338 if (!ht_cap->ht_supported) in ath10k_peer_assoc_h_ht()
2341 band = def.chan->band; in ath10k_peer_assoc_h_ht()
2342 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs; in ath10k_peer_assoc_h_ht()
2343 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs; in ath10k_peer_assoc_h_ht()
2349 arg->peer_flags |= ar->wmi.peer_flags->ht; in ath10k_peer_assoc_h_ht()
2350 arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR + in ath10k_peer_assoc_h_ht()
2351 ht_cap->ampdu_factor)) - 1; in ath10k_peer_assoc_h_ht()
2353 arg->peer_mpdu_density = in ath10k_peer_assoc_h_ht()
2354 ath10k_parse_mpdudensity(ht_cap->ampdu_density); in ath10k_peer_assoc_h_ht()
2356 arg->peer_ht_caps = ht_cap->cap; in ath10k_peer_assoc_h_ht()
2357 arg->peer_rate_caps |= WMI_RC_HT_FLAG; in ath10k_peer_assoc_h_ht()
2359 if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING) in ath10k_peer_assoc_h_ht()
2360 arg->peer_flags |= ar->wmi.peer_flags->ldbc; in ath10k_peer_assoc_h_ht()
2362 if (sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40) { in ath10k_peer_assoc_h_ht()
2363 arg->peer_flags |= ar->wmi.peer_flags->bw40; in ath10k_peer_assoc_h_ht()
2364 arg->peer_rate_caps |= WMI_RC_CW40_FLAG; in ath10k_peer_assoc_h_ht()
2367 if (arvif->bitrate_mask.control[band].gi != NL80211_TXRATE_FORCE_LGI) { in ath10k_peer_assoc_h_ht()
2368 if (ht_cap->cap & IEEE80211_HT_CAP_SGI_20) in ath10k_peer_assoc_h_ht()
2369 arg->peer_rate_caps |= WMI_RC_SGI_FLAG; in ath10k_peer_assoc_h_ht()
2371 if (ht_cap->cap & IEEE80211_HT_CAP_SGI_40) in ath10k_peer_assoc_h_ht()
2372 arg->peer_rate_caps |= WMI_RC_SGI_FLAG; in ath10k_peer_assoc_h_ht()
2375 if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) { in ath10k_peer_assoc_h_ht()
2376 arg->peer_rate_caps |= WMI_RC_TX_STBC_FLAG; in ath10k_peer_assoc_h_ht()
2377 arg->peer_flags |= ar->wmi.peer_flags->stbc; in ath10k_peer_assoc_h_ht()
2380 if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) { in ath10k_peer_assoc_h_ht()
2381 stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC; in ath10k_peer_assoc_h_ht()
2384 arg->peer_rate_caps |= stbc; in ath10k_peer_assoc_h_ht()
2385 arg->peer_flags |= ar->wmi.peer_flags->stbc; in ath10k_peer_assoc_h_ht()
2388 if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2]) in ath10k_peer_assoc_h_ht()
2389 arg->peer_rate_caps |= WMI_RC_TS_FLAG; in ath10k_peer_assoc_h_ht()
2390 else if (ht_cap->mcs.rx_mask[1]) in ath10k_peer_assoc_h_ht()
2391 arg->peer_rate_caps |= WMI_RC_DS_FLAG; in ath10k_peer_assoc_h_ht()
2394 if ((ht_cap->mcs.rx_mask[i / 8] & BIT(i % 8)) && in ath10k_peer_assoc_h_ht()
2397 arg->peer_ht_rates.rates[n++] = i; in ath10k_peer_assoc_h_ht()
2401 * This is a workaround for HT-enabled STAs which break the spec in ath10k_peer_assoc_h_ht()
2410 arg->peer_ht_rates.num_rates = 8; in ath10k_peer_assoc_h_ht()
2411 for (i = 0; i < arg->peer_ht_rates.num_rates; i++) in ath10k_peer_assoc_h_ht()
2412 arg->peer_ht_rates.rates[i] = i; in ath10k_peer_assoc_h_ht()
2414 arg->peer_ht_rates.num_rates = n; in ath10k_peer_assoc_h_ht()
2415 arg->peer_num_spatial_streams = min(sta->deflink.rx_nss, in ath10k_peer_assoc_h_ht()
2420 arg->addr, in ath10k_peer_assoc_h_ht()
2421 arg->peer_ht_rates.num_rates, in ath10k_peer_assoc_h_ht()
2422 arg->peer_num_spatial_streams); in ath10k_peer_assoc_h_ht()
2433 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_assoc_qos_ap()
2435 if (sta->wme && sta->uapsd_queues) { in ath10k_peer_assoc_qos_ap()
2437 sta->uapsd_queues, sta->max_sp); in ath10k_peer_assoc_qos_ap()
2439 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO) in ath10k_peer_assoc_qos_ap()
2442 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI) in ath10k_peer_assoc_qos_ap()
2445 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK) in ath10k_peer_assoc_qos_ap()
2448 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE) in ath10k_peer_assoc_qos_ap()
2452 if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP) in ath10k_peer_assoc_qos_ap()
2453 max_sp = sta->max_sp; in ath10k_peer_assoc_qos_ap()
2455 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id, in ath10k_peer_assoc_qos_ap()
2456 sta->addr, in ath10k_peer_assoc_qos_ap()
2461 arvif->vdev_id, ret); in ath10k_peer_assoc_qos_ap()
2465 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id, in ath10k_peer_assoc_qos_ap()
2466 sta->addr, in ath10k_peer_assoc_qos_ap()
2471 arvif->vdev_id, ret); in ath10k_peer_assoc_qos_ap()
2477 * sta->listen_interval - mac80211 patch required. in ath10k_peer_assoc_qos_ap()
2480 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id, sta->addr, in ath10k_peer_assoc_qos_ap()
2485 arvif->vdev_id, ret); in ath10k_peer_assoc_qos_ap()
2507 idx_limit = fls(mcs_map) - 1; in ath10k_peer_assoc_h_vht_limit()
2509 idx_limit = -1; in ath10k_peer_assoc_h_vht_limit()
2523 case -1: in ath10k_peer_assoc_h_vht_limit()
2573 const struct ieee80211_sta_vht_cap *vht_cap = &sta->deflink.vht_cap; in ath10k_peer_assoc_h_vht()
2574 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_peer_assoc_h_vht()
2575 struct ath10k_hw_params *hw = &ar->hw_params; in ath10k_peer_assoc_h_vht()
2586 if (!vht_cap->vht_supported) in ath10k_peer_assoc_h_vht()
2589 band = def.chan->band; in ath10k_peer_assoc_h_vht()
2590 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs; in ath10k_peer_assoc_h_vht()
2595 arg->peer_flags |= ar->wmi.peer_flags->vht; in ath10k_peer_assoc_h_vht()
2597 if (def.chan->band == NL80211_BAND_2GHZ) in ath10k_peer_assoc_h_vht()
2598 arg->peer_flags |= ar->wmi.peer_flags->vht_2g; in ath10k_peer_assoc_h_vht()
2600 arg->peer_vht_caps = vht_cap->cap; in ath10k_peer_assoc_h_vht()
2602 ampdu_factor = (vht_cap->cap & in ath10k_peer_assoc_h_vht()
2606 /* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to in ath10k_peer_assoc_h_vht()
2608 * arg->peer_max_mpdu at this point contains HT max_mpdu so keep in ath10k_peer_assoc_h_vht()
2611 arg->peer_max_mpdu = max(arg->peer_max_mpdu, in ath10k_peer_assoc_h_vht()
2613 ampdu_factor)) - 1); in ath10k_peer_assoc_h_vht()
2615 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80) in ath10k_peer_assoc_h_vht()
2616 arg->peer_flags |= ar->wmi.peer_flags->bw80; in ath10k_peer_assoc_h_vht()
2618 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160) in ath10k_peer_assoc_h_vht()
2619 arg->peer_flags |= ar->wmi.peer_flags->bw160; in ath10k_peer_assoc_h_vht()
2625 vht_mcs = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map) >> in ath10k_peer_assoc_h_vht()
2632 arg->peer_num_spatial_streams = min(sta->deflink.rx_nss, max_nss); in ath10k_peer_assoc_h_vht()
2633 arg->peer_vht_rates.rx_max_rate = in ath10k_peer_assoc_h_vht()
2634 __le16_to_cpu(vht_cap->vht_mcs.rx_highest); in ath10k_peer_assoc_h_vht()
2635 arg->peer_vht_rates.rx_mcs_set = in ath10k_peer_assoc_h_vht()
2636 __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map); in ath10k_peer_assoc_h_vht()
2637 arg->peer_vht_rates.tx_max_rate = in ath10k_peer_assoc_h_vht()
2638 __le16_to_cpu(vht_cap->vht_mcs.tx_highest); in ath10k_peer_assoc_h_vht()
2639 arg->peer_vht_rates.tx_mcs_set = ath10k_peer_assoc_h_vht_limit( in ath10k_peer_assoc_h_vht()
2640 __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map), vht_mcs_mask); in ath10k_peer_assoc_h_vht()
2642 /* Configure bandwidth-NSS mapping to FW in ath10k_peer_assoc_h_vht()
2645 if (arg->peer_phymode == MODE_11AC_VHT160 || in ath10k_peer_assoc_h_vht()
2646 arg->peer_phymode == MODE_11AC_VHT80_80) { in ath10k_peer_assoc_h_vht()
2650 max_rate = arg->peer_vht_rates.rx_max_rate; in ath10k_peer_assoc_h_vht()
2654 rx_nss = arg->peer_num_spatial_streams; in ath10k_peer_assoc_h_vht()
2656 rx_nss = min(arg->peer_num_spatial_streams, rx_nss); in ath10k_peer_assoc_h_vht()
2658 max_rate = hw->vht160_mcs_tx_highest; in ath10k_peer_assoc_h_vht()
2661 arg->peer_bw_rxnss_override = in ath10k_peer_assoc_h_vht()
2663 FIELD_PREP(WMI_PEER_NSS_160MHZ_MASK, (rx_nss - 1)); in ath10k_peer_assoc_h_vht()
2665 if (arg->peer_phymode == MODE_11AC_VHT80_80) { in ath10k_peer_assoc_h_vht()
2666 arg->peer_bw_rxnss_override |= in ath10k_peer_assoc_h_vht()
2667 FIELD_PREP(WMI_PEER_NSS_80_80MHZ_MASK, (rx_nss - 1)); in ath10k_peer_assoc_h_vht()
2672 sta->addr, arg->peer_max_mpdu, in ath10k_peer_assoc_h_vht()
2673 arg->peer_flags, arg->peer_bw_rxnss_override); in ath10k_peer_assoc_h_vht()
2681 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_peer_assoc_h_qos()
2683 switch (arvif->vdev_type) { in ath10k_peer_assoc_h_qos()
2685 if (sta->wme) in ath10k_peer_assoc_h_qos()
2686 arg->peer_flags |= arvif->ar->wmi.peer_flags->qos; in ath10k_peer_assoc_h_qos()
2688 if (sta->wme && sta->uapsd_queues) { in ath10k_peer_assoc_h_qos()
2689 arg->peer_flags |= arvif->ar->wmi.peer_flags->apsd; in ath10k_peer_assoc_h_qos()
2690 arg->peer_rate_caps |= WMI_RC_UAPSD_FLAG; in ath10k_peer_assoc_h_qos()
2694 if (sta->wme) in ath10k_peer_assoc_h_qos()
2695 arg->peer_flags |= arvif->ar->wmi.peer_flags->qos; in ath10k_peer_assoc_h_qos()
2698 if (sta->wme) in ath10k_peer_assoc_h_qos()
2699 arg->peer_flags |= arvif->ar->wmi.peer_flags->qos; in ath10k_peer_assoc_h_qos()
2706 sta->addr, !!(arg->peer_flags & in ath10k_peer_assoc_h_qos()
2707 arvif->ar->wmi.peer_flags->qos)); in ath10k_peer_assoc_h_qos()
2712 return sta->deflink.supp_rates[NL80211_BAND_2GHZ] >> in ath10k_mac_sta_has_ofdm_only()
2719 struct ieee80211_sta_vht_cap *vht_cap = &sta->deflink.vht_cap; in ath10k_mac_get_phymode_vht()
2721 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160) { in ath10k_mac_get_phymode_vht()
2722 switch (vht_cap->cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK) { in ath10k_mac_get_phymode_vht()
2733 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80) in ath10k_mac_get_phymode_vht()
2736 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40) in ath10k_mac_get_phymode_vht()
2739 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_20) in ath10k_mac_get_phymode_vht()
2750 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_peer_assoc_h_phymode()
2760 band = def.chan->band; in ath10k_peer_assoc_h_phymode()
2761 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs; in ath10k_peer_assoc_h_phymode()
2762 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs; in ath10k_peer_assoc_h_phymode()
2766 if (sta->deflink.vht_cap.vht_supported && in ath10k_peer_assoc_h_phymode()
2768 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40) in ath10k_peer_assoc_h_phymode()
2772 } else if (sta->deflink.ht_cap.ht_supported && in ath10k_peer_assoc_h_phymode()
2774 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40) in ath10k_peer_assoc_h_phymode()
2789 if (sta->deflink.vht_cap.vht_supported && in ath10k_peer_assoc_h_phymode()
2792 } else if (sta->deflink.ht_cap.ht_supported && in ath10k_peer_assoc_h_phymode()
2794 if (sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40) in ath10k_peer_assoc_h_phymode()
2808 sta->addr, ath10k_wmi_phymode_str(phymode)); in ath10k_peer_assoc_h_phymode()
2810 arg->peer_phymode = phymode; in ath10k_peer_assoc_h_phymode()
2819 lockdep_assert_held(&ar->conf_mutex); in ath10k_peer_assoc_prepare()
2847 if (!ht_cap->ht_supported) in ath10k_setup_peer_smps()
2850 smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS; in ath10k_setup_peer_smps()
2854 return -EINVAL; in ath10k_setup_peer_smps()
2856 return ath10k_wmi_peer_set_param(ar, arvif->vdev_id, addr, in ath10k_setup_peer_smps()
2857 ar->wmi.peer_param->smps_state, in ath10k_setup_peer_smps()
2865 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_mac_vif_recalc_txbf()
2873 if (!(ar->vht_cap_info & in ath10k_mac_vif_recalc_txbf()
2880 param = ar->wmi.vdev_param->txbf; in ath10k_mac_vif_recalc_txbf()
2890 if (ar->vht_cap_info & in ath10k_mac_vif_recalc_txbf()
2900 if (ar->vht_cap_info & in ath10k_mac_vif_recalc_txbf()
2916 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param, value); in ath10k_mac_vif_recalc_txbf()
2930 list_for_each_entry(arvif, &ar->arvifs, list) { in ath10k_mac_is_connected()
2931 if (arvif->is_up && arvif->vdev_type == WMI_VDEV_TYPE_STA) in ath10k_mac_is_connected()
2945 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_txpower_setup()
2953 if (connected && ar->tx_power_2g_limit) in ath10k_mac_txpower_setup()
2954 if (tx_power_2g > ar->tx_power_2g_limit) in ath10k_mac_txpower_setup()
2955 tx_power_2g = ar->tx_power_2g_limit; in ath10k_mac_txpower_setup()
2957 if (connected && ar->tx_power_5g_limit) in ath10k_mac_txpower_setup()
2958 if (tx_power_5g > ar->tx_power_5g_limit) in ath10k_mac_txpower_setup()
2959 tx_power_5g = ar->tx_power_5g_limit; in ath10k_mac_txpower_setup()
2964 param = ar->wmi.pdev_param->txpower_limit2g; in ath10k_mac_txpower_setup()
2972 param = ar->wmi.pdev_param->txpower_limit5g; in ath10k_mac_txpower_setup()
2986 int ret, txpower = -1; in ath10k_mac_txpower_recalc()
2988 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_txpower_recalc()
2990 list_for_each_entry(arvif, &ar->arvifs, list) { in ath10k_mac_txpower_recalc()
2992 if (arvif->txpower == INT_MIN) in ath10k_mac_txpower_recalc()
2995 if (txpower == -1) in ath10k_mac_txpower_recalc()
2996 txpower = arvif->txpower; in ath10k_mac_txpower_recalc()
2998 txpower = min(txpower, arvif->txpower); in ath10k_mac_txpower_recalc()
3001 if (txpower == -1) in ath10k_mac_txpower_recalc()
3016 if (!ar->hw_params.dynamic_sar_support) in ath10k_mac_set_sar_power()
3017 return -EOPNOTSUPP; in ath10k_mac_set_sar_power()
3022 /* if connected, then arvif->txpower must be valid */ in ath10k_mac_set_sar_power()
3030 struct ath10k *ar = hw->priv; in ath10k_mac_set_sar_specs()
3034 mutex_lock(&ar->conf_mutex); in ath10k_mac_set_sar_specs()
3036 if (!ar->hw_params.dynamic_sar_support) { in ath10k_mac_set_sar_specs()
3037 ret = -EOPNOTSUPP; in ath10k_mac_set_sar_specs()
3041 if (!sar || sar->type != NL80211_SAR_TYPE_POWER || in ath10k_mac_set_sar_specs()
3042 sar->num_sub_specs == 0) { in ath10k_mac_set_sar_specs()
3043 ret = -EINVAL; in ath10k_mac_set_sar_specs()
3047 sub_specs = sar->sub_specs; in ath10k_mac_set_sar_specs()
3052 ar->tx_power_2g_limit = 0; in ath10k_mac_set_sar_specs()
3053 ar->tx_power_5g_limit = 0; in ath10k_mac_set_sar_specs()
3058 for (i = 0; i < sar->num_sub_specs; i++) { in ath10k_mac_set_sar_specs()
3059 if (sub_specs->freq_range_index == 0) in ath10k_mac_set_sar_specs()
3060 ar->tx_power_2g_limit = sub_specs->power / 2; in ath10k_mac_set_sar_specs()
3061 else if (sub_specs->freq_range_index == 1) in ath10k_mac_set_sar_specs()
3062 ar->tx_power_5g_limit = sub_specs->power / 2; in ath10k_mac_set_sar_specs()
3074 mutex_unlock(&ar->conf_mutex); in ath10k_mac_set_sar_specs()
3083 struct ath10k *ar = hw->priv; in ath10k_bss_assoc()
3084 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_bss_assoc()
3091 lockdep_assert_held(&ar->conf_mutex); in ath10k_bss_assoc()
3094 arvif->vdev_id, arvif->bssid, arvif->aid); in ath10k_bss_assoc()
3098 ap_sta = ieee80211_find_sta(vif, bss_conf->bssid); in ath10k_bss_assoc()
3101 bss_conf->bssid, arvif->vdev_id); in ath10k_bss_assoc()
3109 ht_cap = ap_sta->deflink.ht_cap; in ath10k_bss_assoc()
3110 vht_cap = ap_sta->deflink.vht_cap; in ath10k_bss_assoc()
3115 bss_conf->bssid, arvif->vdev_id, ret); in ath10k_bss_assoc()
3125 bss_conf->bssid, arvif->vdev_id, ret); in ath10k_bss_assoc()
3129 ret = ath10k_setup_peer_smps(ar, arvif, bss_conf->bssid, &ht_cap); in ath10k_bss_assoc()
3132 arvif->vdev_id, ret); in ath10k_bss_assoc()
3139 arvif->vdev_id, bss_conf->bssid, ret); in ath10k_bss_assoc()
3145 arvif->vdev_id, bss_conf->bssid, vif->cfg.aid); in ath10k_bss_assoc()
3147 WARN_ON(arvif->is_up); in ath10k_bss_assoc()
3149 arvif->aid = vif->cfg.aid; in ath10k_bss_assoc()
3150 ether_addr_copy(arvif->bssid, bss_conf->bssid); in ath10k_bss_assoc()
3153 ar->wmi.pdev_param->peer_stats_info_enable, 1); in ath10k_bss_assoc()
3157 ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid); in ath10k_bss_assoc()
3160 arvif->vdev_id, ret); in ath10k_bss_assoc()
3164 arvif->is_up = true; in ath10k_bss_assoc()
3169 * WLAN.RM.2.0-00073) have buggy powersave state machine and must be in ath10k_bss_assoc()
3172 ret = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, arvif->bssid, in ath10k_bss_assoc()
3173 ar->wmi.peer_param->dummy_var, 1); in ath10k_bss_assoc()
3176 arvif->bssid, arvif->vdev_id, ret); in ath10k_bss_assoc()
3184 struct ath10k *ar = hw->priv; in ath10k_bss_disassoc()
3185 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_bss_disassoc()
3189 lockdep_assert_held(&ar->conf_mutex); in ath10k_bss_disassoc()
3192 arvif->vdev_id, arvif->bssid); in ath10k_bss_disassoc()
3194 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id); in ath10k_bss_disassoc()
3197 arvif->vdev_id, ret); in ath10k_bss_disassoc()
3199 arvif->def_wep_key_idx = -1; in ath10k_bss_disassoc()
3204 arvif->vdev_id, ret); in ath10k_bss_disassoc()
3208 arvif->is_up = false; in ath10k_bss_disassoc()
3212 cancel_delayed_work_sync(&arvif->connection_loss_work); in ath10k_bss_disassoc()
3220 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv; in ath10k_new_peer_tid_config()
3226 if (arvif->retry_long[i] || arvif->ampdu[i] || in ath10k_new_peer_tid_config()
3227 arvif->rate_ctrl[i] || arvif->rtscts[i]) { in ath10k_new_peer_tid_config()
3230 arg.vdev_id = arvif->vdev_id; in ath10k_new_peer_tid_config()
3231 arg.retry_count = arvif->retry_long[i]; in ath10k_new_peer_tid_config()
3232 arg.aggr_control = arvif->ampdu[i]; in ath10k_new_peer_tid_config()
3233 arg.rate_ctrl = arvif->rate_ctrl[i]; in ath10k_new_peer_tid_config()
3234 arg.rcode_flags = arvif->rate_code[i]; in ath10k_new_peer_tid_config()
3236 if (arvif->rtscts[i]) in ath10k_new_peer_tid_config()
3242 arg.rtscts_ctrl = arvif->rtscts[i]; in ath10k_new_peer_tid_config()
3245 if (arvif->noack[i]) { in ath10k_new_peer_tid_config()
3246 arg.ack_policy = arvif->noack[i]; in ath10k_new_peer_tid_config()
3252 /* Assign default value(-1) to newly connected station. in ath10k_new_peer_tid_config()
3256 arsta->retry_long[i] = -1; in ath10k_new_peer_tid_config()
3257 arsta->noack[i] = -1; in ath10k_new_peer_tid_config()
3258 arsta->ampdu[i] = -1; in ath10k_new_peer_tid_config()
3263 ether_addr_copy(arg.peer_macaddr.addr, sta->addr); in ath10k_new_peer_tid_config()
3268 sta->addr, ret); in ath10k_new_peer_tid_config()
3283 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_station_assoc()
3287 lockdep_assert_held(&ar->conf_mutex); in ath10k_station_assoc()
3292 sta->addr, arvif->vdev_id, ret); in ath10k_station_assoc()
3299 sta->addr, arvif->vdev_id, ret); in ath10k_station_assoc()
3303 /* Re-assoc is run only to update supported rates for given station. It in ath10k_station_assoc()
3307 ret = ath10k_setup_peer_smps(ar, arvif, sta->addr, in ath10k_station_assoc()
3308 &sta->deflink.ht_cap); in ath10k_station_assoc()
3311 arvif->vdev_id, ret); in ath10k_station_assoc()
3318 sta->addr, arvif->vdev_id, ret); in ath10k_station_assoc()
3322 if (!sta->wme) { in ath10k_station_assoc()
3323 arvif->num_legacy_stations++; in ath10k_station_assoc()
3327 arvif->vdev_id, ret); in ath10k_station_assoc()
3333 if ((arvif->def_wep_key_idx != -1) && (!sta->tdls)) { in ath10k_station_assoc()
3334 ret = ath10k_install_peer_wep_keys(arvif, sta->addr); in ath10k_station_assoc()
3337 arvif->vdev_id, ret); in ath10k_station_assoc()
3343 if (!test_bit(WMI_SERVICE_PEER_TID_CONFIGS_SUPPORT, ar->wmi.svc_map)) in ath10k_station_assoc()
3353 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_station_disassoc()
3356 lockdep_assert_held(&ar->conf_mutex); in ath10k_station_disassoc()
3358 if (!sta->wme) { in ath10k_station_disassoc()
3359 arvif->num_legacy_stations--; in ath10k_station_disassoc()
3363 arvif->vdev_id, ret); in ath10k_station_disassoc()
3368 ret = ath10k_clear_peer_keys(arvif, sta->addr); in ath10k_station_disassoc()
3371 arvif->vdev_id, ret); in ath10k_station_disassoc()
3384 struct ieee80211_hw *hw = ar->hw; in ath10k_update_channel_list()
3395 lockdep_assert_held(&ar->conf_mutex); in ath10k_update_channel_list()
3397 bands = hw->wiphy->bands; in ath10k_update_channel_list()
3402 for (i = 0; i < bands[band]->n_channels; i++) { in ath10k_update_channel_list()
3403 if (bands[band]->channels[i].flags & in ath10k_update_channel_list()
3414 return -ENOMEM; in ath10k_update_channel_list()
3421 for (i = 0; i < bands[band]->n_channels; i++) { in ath10k_update_channel_list()
3422 channel = &bands[band]->channels[i]; in ath10k_update_channel_list()
3424 if (channel->flags & IEEE80211_CHAN_DISABLED) in ath10k_update_channel_list()
3427 ch->allow_ht = true; in ath10k_update_channel_list()
3430 ch->allow_vht = true; in ath10k_update_channel_list()
3432 ch->allow_ibss = in ath10k_update_channel_list()
3433 !(channel->flags & IEEE80211_CHAN_NO_IR); in ath10k_update_channel_list()
3435 ch->ht40plus = in ath10k_update_channel_list()
3436 !(channel->flags & IEEE80211_CHAN_NO_HT40PLUS); in ath10k_update_channel_list()
3438 ch->chan_radar = in ath10k_update_channel_list()
3439 !!(channel->flags & IEEE80211_CHAN_RADAR); in ath10k_update_channel_list()
3441 passive = channel->flags & IEEE80211_CHAN_NO_IR; in ath10k_update_channel_list()
3442 ch->passive = passive; in ath10k_update_channel_list()
3449 ch->passive |= ch->chan_radar; in ath10k_update_channel_list()
3451 ch->freq = channel->center_freq; in ath10k_update_channel_list()
3452 ch->band_center_freq1 = channel->center_freq; in ath10k_update_channel_list()
3453 ch->min_power = 0; in ath10k_update_channel_list()
3454 ch->max_power = channel->max_power * 2; in ath10k_update_channel_list()
3455 ch->max_reg_power = channel->max_reg_power * 2; in ath10k_update_channel_list()
3456 ch->max_antenna_gain = channel->max_antenna_gain; in ath10k_update_channel_list()
3457 ch->reg_class_id = 0; /* FIXME */ in ath10k_update_channel_list()
3463 if (channel->band == NL80211_BAND_2GHZ) in ath10k_update_channel_list()
3464 ch->mode = MODE_11G; in ath10k_update_channel_list()
3466 ch->mode = MODE_11A; in ath10k_update_channel_list()
3468 if (WARN_ON_ONCE(ch->mode == MODE_UNKNOWN)) in ath10k_update_channel_list()
3472 "mac channel [%zd/%d] freq %d maxpower %d regpower %d antenna %d mode %d\n", in ath10k_update_channel_list()
3473 ch - arg.channels, arg.n_channels, in ath10k_update_channel_list()
3474 ch->freq, ch->max_power, ch->max_reg_power, in ath10k_update_channel_list()
3475 ch->max_antenna_gain, ch->mode); in ath10k_update_channel_list()
3510 lockdep_assert_held(&ar->conf_mutex); in ath10k_regd_update()
3516 regpair = ar->ath_common.regulatory.regpair; in ath10k_regd_update()
3518 if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) { in ath10k_regd_update()
3519 nl_dfs_reg = ar->dfs_detector->region; in ath10k_regd_update()
3525 /* Target allows setting up per-band regdomain but ath_common provides in ath10k_regd_update()
3529 regpair->reg_domain, in ath10k_regd_update()
3530 regpair->reg_domain, /* 2ghz */ in ath10k_regd_update()
3531 regpair->reg_domain, /* 5ghz */ in ath10k_regd_update()
3532 regpair->reg_2ghz_ctl, in ath10k_regd_update()
3533 regpair->reg_5ghz_ctl, in ath10k_regd_update()
3544 if (ar->low_5ghz_chan && ar->high_5ghz_chan) { in ath10k_mac_update_channel_list()
3545 for (i = 0; i < band->n_channels; i++) { in ath10k_mac_update_channel_list()
3546 if (band->channels[i].center_freq < ar->low_5ghz_chan || in ath10k_mac_update_channel_list()
3547 band->channels[i].center_freq > ar->high_5ghz_chan) in ath10k_mac_update_channel_list()
3548 band->channels[i].flags |= in ath10k_mac_update_channel_list()
3558 struct ath10k *ar = hw->priv; in ath10k_reg_notifier()
3561 ath_reg_notifier_apply(wiphy, request, &ar->ath_common.regulatory); in ath10k_reg_notifier()
3563 if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) { in ath10k_reg_notifier()
3565 request->dfs_region); in ath10k_reg_notifier()
3566 result = ar->dfs_detector->set_dfs_domain(ar->dfs_detector, in ath10k_reg_notifier()
3567 request->dfs_region); in ath10k_reg_notifier()
3570 request->dfs_region); in ath10k_reg_notifier()
3573 mutex_lock(&ar->conf_mutex); in ath10k_reg_notifier()
3574 if (ar->state == ATH10K_STATE_ON) in ath10k_reg_notifier()
3576 mutex_unlock(&ar->conf_mutex); in ath10k_reg_notifier()
3578 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) in ath10k_reg_notifier()
3580 ar->hw->wiphy->bands[NL80211_BAND_5GHZ]); in ath10k_reg_notifier()
3585 spin_lock_bh(&ar->data_lock); in ath10k_stop_radar_confirmation()
3586 ar->radar_conf_state = ATH10K_RADAR_CONFIRMATION_STOPPED; in ath10k_stop_radar_confirmation()
3587 spin_unlock_bh(&ar->data_lock); in ath10k_stop_radar_confirmation()
3589 cancel_work_sync(&ar->radar_confirmation_work); in ath10k_stop_radar_confirmation()
3605 lockdep_assert_held(&ar->htt.tx_lock); in ath10k_mac_tx_lock()
3608 ar->tx_paused |= BIT(reason); in ath10k_mac_tx_lock()
3609 ieee80211_stop_queues(ar->hw); in ath10k_mac_tx_lock()
3616 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_mac_tx_unlock_iter()
3618 if (arvif->tx_paused) in ath10k_mac_tx_unlock_iter()
3621 ieee80211_wake_queue(ar->hw, arvif->vdev_id); in ath10k_mac_tx_unlock_iter()
3626 lockdep_assert_held(&ar->htt.tx_lock); in ath10k_mac_tx_unlock()
3629 ar->tx_paused &= ~BIT(reason); in ath10k_mac_tx_unlock()
3631 if (ar->tx_paused) in ath10k_mac_tx_unlock()
3634 ieee80211_iterate_active_interfaces_atomic(ar->hw, in ath10k_mac_tx_unlock()
3639 ieee80211_wake_queue(ar->hw, ar->hw->offchannel_tx_hw_queue); in ath10k_mac_tx_unlock()
3644 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_tx_lock()
3646 lockdep_assert_held(&ar->htt.tx_lock); in ath10k_mac_vif_tx_lock()
3649 arvif->tx_paused |= BIT(reason); in ath10k_mac_vif_tx_lock()
3650 ieee80211_stop_queue(ar->hw, arvif->vdev_id); in ath10k_mac_vif_tx_lock()
3655 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_tx_unlock()
3657 lockdep_assert_held(&ar->htt.tx_lock); in ath10k_mac_vif_tx_unlock()
3660 arvif->tx_paused &= ~BIT(reason); in ath10k_mac_vif_tx_unlock()
3662 if (ar->tx_paused) in ath10k_mac_vif_tx_unlock()
3665 if (arvif->tx_paused) in ath10k_mac_vif_tx_unlock()
3668 ieee80211_wake_queue(ar->hw, arvif->vdev_id); in ath10k_mac_vif_tx_unlock()
3675 struct ath10k *ar = arvif->ar; in ath10k_mac_vif_handle_tx_pause()
3677 lockdep_assert_held(&ar->htt.tx_lock); in ath10k_mac_vif_handle_tx_pause()
3689 action, arvif->vdev_id); in ath10k_mac_vif_handle_tx_pause()
3703 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_mac_handle_tx_pause_iter()
3706 if (arvif->vdev_id != arg->vdev_id) in ath10k_mac_handle_tx_pause_iter()
3709 ath10k_mac_vif_handle_tx_pause(arvif, arg->pause_id, arg->action); in ath10k_mac_handle_tx_pause_iter()
3722 spin_lock_bh(&ar->htt.tx_lock); in ath10k_mac_handle_tx_pause_vdev()
3723 ieee80211_iterate_active_interfaces_atomic(ar->hw, in ath10k_mac_handle_tx_pause_vdev()
3727 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_handle_tx_pause_vdev()
3736 const struct ieee80211_hdr *hdr = (void *)skb->data; in ath10k_mac_tx_h_get_txmode()
3738 __le16 fc = hdr->frame_control; in ath10k_mac_tx_h_get_txmode()
3740 if (IEEE80211_SKB_CB(skb)->flags & IEEE80211_TX_CTL_HW_80211_ENCAP) in ath10k_mac_tx_h_get_txmode()
3743 if (!vif || vif->type == NL80211_IFTYPE_MONITOR) in ath10k_mac_tx_h_get_txmode()
3753 * accurate - otherwise either mac80211 or userspace (e.g. hostapd) can in ath10k_mac_tx_h_get_txmode()
3765 if (ar->htt.target_version_major < 3 && in ath10k_mac_tx_h_get_txmode()
3768 ar->running_fw->fw_file.fw_features)) in ath10k_mac_tx_h_get_txmode()
3773 * Some wmi-tlv firmwares for qca6174 have broken Tx key selection for in ath10k_mac_tx_h_get_txmode()
3774 * NativeWifi txmode - it selects AP key instead of peer key. It seems in ath10k_mac_tx_h_get_txmode()
3779 if (ieee80211_is_data_present(fc) && sta && sta->tdls) in ath10k_mac_tx_h_get_txmode()
3782 if (test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags) || in ath10k_mac_tx_h_get_txmode()
3783 skb_cb->flags & ATH10K_SKB_F_RAW_TX) in ath10k_mac_tx_h_get_txmode()
3793 const struct ieee80211_hdr *hdr = (void *)skb->data; in ath10k_tx_h_use_hwcrypto()
3797 if (!ieee80211_has_protected(hdr->frame_control)) in ath10k_tx_h_use_hwcrypto()
3800 if ((info->flags & mask) == mask) in ath10k_tx_h_use_hwcrypto()
3804 return !((struct ath10k_vif *)vif->drv_priv)->nohwcrypt; in ath10k_tx_h_use_hwcrypto()
3814 struct ieee80211_hdr *hdr = (void *)skb->data; in ath10k_tx_h_nwifi()
3818 if (!ieee80211_is_data_qos(hdr->frame_control)) in ath10k_tx_h_nwifi()
3822 memmove(skb->data + IEEE80211_QOS_CTL_LEN, in ath10k_tx_h_nwifi()
3823 skb->data, (void *)qos_ctl - (void *)skb->data); in ath10k_tx_h_nwifi()
3830 hdr = (void *)skb->data; in ath10k_tx_h_nwifi()
3831 if (ieee80211_is_qos_nullfunc(hdr->frame_control)) in ath10k_tx_h_nwifi()
3832 cb->flags &= ~ATH10K_SKB_F_QOS; in ath10k_tx_h_nwifi()
3834 hdr->frame_control &= ~__cpu_to_le16(IEEE80211_STYPE_QOS_DATA); in ath10k_tx_h_nwifi()
3847 hdr = (void *)skb->data; in ath10k_tx_h_8023()
3848 hdrlen = ieee80211_hdrlen(hdr->frame_control); in ath10k_tx_h_8023()
3849 rfc1042 = (void *)skb->data + hdrlen; in ath10k_tx_h_8023()
3853 type = rfc1042->snap_type; in ath10k_tx_h_8023()
3858 eth = (void *)skb->data; in ath10k_tx_h_8023()
3859 ether_addr_copy(eth->h_dest, da); in ath10k_tx_h_8023()
3860 ether_addr_copy(eth->h_source, sa); in ath10k_tx_h_8023()
3861 eth->h_proto = type; in ath10k_tx_h_8023()
3868 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; in ath10k_tx_h_add_p2p_noa_ie()
3869 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_tx_h_add_p2p_noa_ie()
3872 if (vif->type != NL80211_IFTYPE_AP || !vif->p2p) in ath10k_tx_h_add_p2p_noa_ie()
3875 if (unlikely(ieee80211_is_probe_resp(hdr->frame_control))) { in ath10k_tx_h_add_p2p_noa_ie()
3876 spin_lock_bh(&ar->data_lock); in ath10k_tx_h_add_p2p_noa_ie()
3877 if (arvif->u.ap.noa_data) in ath10k_tx_h_add_p2p_noa_ie()
3878 if (!pskb_expand_head(skb, 0, arvif->u.ap.noa_len, in ath10k_tx_h_add_p2p_noa_ie()
3880 skb_put_data(skb, arvif->u.ap.noa_data, in ath10k_tx_h_add_p2p_noa_ie()
3881 arvif->u.ap.noa_len); in ath10k_tx_h_add_p2p_noa_ie()
3882 spin_unlock_bh(&ar->data_lock); in ath10k_tx_h_add_p2p_noa_ie()
3892 struct ieee80211_hdr *hdr = (void *)skb->data; in ath10k_mac_tx_h_fill_cb()
3895 bool is_data = ieee80211_is_data(hdr->frame_control) || in ath10k_mac_tx_h_fill_cb()
3896 ieee80211_is_data_qos(hdr->frame_control); in ath10k_mac_tx_h_fill_cb()
3897 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_mac_tx_h_fill_cb()
3902 cb->flags = 0; in ath10k_mac_tx_h_fill_cb()
3904 if (info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP) { in ath10k_mac_tx_h_fill_cb()
3905 cb->flags |= ATH10K_SKB_F_QOS; /* Assume data frames are QoS */ in ath10k_mac_tx_h_fill_cb()
3910 cb->flags |= ATH10K_SKB_F_NO_HWCRYPT; in ath10k_mac_tx_h_fill_cb()
3912 if (ieee80211_is_mgmt(hdr->frame_control)) in ath10k_mac_tx_h_fill_cb()
3913 cb->flags |= ATH10K_SKB_F_MGMT; in ath10k_mac_tx_h_fill_cb()
3915 if (ieee80211_is_data_qos(hdr->frame_control)) { in ath10k_mac_tx_h_fill_cb()
3916 cb->flags |= ATH10K_SKB_F_QOS; in ath10k_mac_tx_h_fill_cb()
3920 if (arvif->noack[tid] == WMI_PEER_TID_CONFIG_NOACK) in ath10k_mac_tx_h_fill_cb()
3924 arsta = (struct ath10k_sta *)sta->drv_priv; in ath10k_mac_tx_h_fill_cb()
3926 if (arsta->noack[tid] == WMI_PEER_TID_CONFIG_NOACK) in ath10k_mac_tx_h_fill_cb()
3929 if (arsta->noack[tid] == WMI_PEER_TID_CONFIG_ACK) in ath10k_mac_tx_h_fill_cb()
3934 cb->flags |= ATH10K_SKB_F_NOACK_TID; in ath10k_mac_tx_h_fill_cb()
3941 if (is_data && ieee80211_has_protected(hdr->frame_control) && in ath10k_mac_tx_h_fill_cb()
3942 !info->control.hw_key) { in ath10k_mac_tx_h_fill_cb()
3943 cb->flags |= ATH10K_SKB_F_NO_HWCRYPT; in ath10k_mac_tx_h_fill_cb()
3944 cb->flags |= ATH10K_SKB_F_RAW_TX; in ath10k_mac_tx_h_fill_cb()
3948 cb->vif = vif; in ath10k_mac_tx_h_fill_cb()
3949 cb->txq = txq; in ath10k_mac_tx_h_fill_cb()
3950 cb->airtime_est = airtime; in ath10k_mac_tx_h_fill_cb()
3952 arsta = (struct ath10k_sta *)sta->drv_priv; in ath10k_mac_tx_h_fill_cb()
3953 spin_lock_bh(&ar->data_lock); in ath10k_mac_tx_h_fill_cb()
3954 cb->ucast_cipher = arsta->ucast_cipher; in ath10k_mac_tx_h_fill_cb()
3955 spin_unlock_bh(&ar->data_lock); in ath10k_mac_tx_h_fill_cb()
3963 * offchannel tx (and actually creating them causes issues with wmi-htc in ath10k_mac_tx_frm_has_freq()
3965 * because that's when the `freq` was introduced to TX_FRM HTT command. in ath10k_mac_tx_frm_has_freq()
3967 return (ar->htt.target_version_major >= 3 && in ath10k_mac_tx_frm_has_freq()
3968 ar->htt.target_version_minor >= 4 && in ath10k_mac_tx_frm_has_freq()
3969 ar->running_fw->fw_file.htt_op_version == ATH10K_FW_HTT_OP_VERSION_TLV); in ath10k_mac_tx_frm_has_freq()
3974 struct sk_buff_head *q = &ar->wmi_mgmt_tx_queue; in ath10k_mac_tx_wmi_mgmt()
3978 return -ENOSPC; in ath10k_mac_tx_wmi_mgmt()
3982 ieee80211_queue_work(ar->hw, &ar->wmi_mgmt_tx_work); in ath10k_mac_tx_wmi_mgmt()
3999 ar->running_fw->fw_file.fw_features) || in ath10k_mac_tx_h_get_txpath()
4001 ar->wmi.svc_map)) in ath10k_mac_tx_h_get_txpath()
4003 else if (ar->htt.target_version_major >= 3) in ath10k_mac_tx_h_get_txpath()
4017 struct ath10k_htt *htt = &ar->htt; in ath10k_mac_tx_submit()
4018 int ret = -EINVAL; in ath10k_mac_tx_submit()
4032 ret = -EINVAL; in ath10k_mac_tx_submit()
4039 ieee80211_free_txskb(ar->hw, skb); in ath10k_mac_tx_submit()
4054 struct ieee80211_hw *hw = ar->hw; in ath10k_mac_tx()
4060 if (info->flags & IEEE80211_TX_CTL_NO_CCK_RATE) in ath10k_mac_tx()
4071 /* Convert 802.11->802.3 header only if the frame was earlier in ath10k_mac_tx()
4074 if (!(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP)) in ath10k_mac_tx()
4078 if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags) && in ath10k_mac_tx()
4079 !(skb_cb->flags & ATH10K_SKB_F_RAW_TX)) { in ath10k_mac_tx()
4082 return -EOPNOTSUPP; in ath10k_mac_tx()
4086 if (!noque_offchan && info->flags & IEEE80211_TX_CTL_TX_OFFCHAN) { in ath10k_mac_tx()
4089 skb, skb->len); in ath10k_mac_tx()
4091 skb_queue_tail(&ar->offchan_tx_queue, skb); in ath10k_mac_tx()
4092 ieee80211_queue_work(hw, &ar->offchan_tx_work); in ath10k_mac_tx()
4111 skb = skb_dequeue(&ar->offchan_tx_queue); in ath10k_offchan_tx_purge()
4115 ieee80211_free_txskb(ar->hw, skb); in ath10k_offchan_tx_purge()
4145 skb = skb_dequeue(&ar->offchan_tx_queue); in ath10k_offchan_tx_work()
4149 mutex_lock(&ar->conf_mutex); in ath10k_offchan_tx_work()
4152 skb, skb->len); in ath10k_offchan_tx_work()
4154 hdr = (struct ieee80211_hdr *)skb->data; in ath10k_offchan_tx_work()
4157 spin_lock_bh(&ar->data_lock); in ath10k_offchan_tx_work()
4158 vdev_id = ar->scan.vdev_id; in ath10k_offchan_tx_work()
4160 spin_unlock_bh(&ar->data_lock); in ath10k_offchan_tx_work()
4175 spin_lock_bh(&ar->data_lock); in ath10k_offchan_tx_work()
4176 reinit_completion(&ar->offchan_tx_completed); in ath10k_offchan_tx_work()
4177 ar->offchan_tx_skb = skb; in ath10k_offchan_tx_work()
4178 spin_unlock_bh(&ar->data_lock); in ath10k_offchan_tx_work()
4180 /* It's safe to access vif and sta - conf_mutex guarantees that in ath10k_offchan_tx_work()
4186 vif = arvif->vif; in ath10k_offchan_tx_work()
4204 wait_for_completion_timeout(&ar->offchan_tx_completed, 3 * HZ); in ath10k_offchan_tx_work()
4207 skb, skb->len); in ath10k_offchan_tx_work()
4216 mutex_unlock(&ar->conf_mutex); in ath10k_offchan_tx_work()
4225 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue); in ath10k_mgmt_over_wmi_tx_purge()
4229 ieee80211_free_txskb(ar->hw, skb); in ath10k_mgmt_over_wmi_tx_purge()
4241 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue); in ath10k_mgmt_over_wmi_tx_work()
4246 ar->running_fw->fw_file.fw_features)) { in ath10k_mgmt_over_wmi_tx_work()
4247 paddr = dma_map_single(ar->dev, skb->data, in ath10k_mgmt_over_wmi_tx_work()
4248 skb->len, DMA_TO_DEVICE); in ath10k_mgmt_over_wmi_tx_work()
4249 if (dma_mapping_error(ar->dev, paddr)) { in ath10k_mgmt_over_wmi_tx_work()
4250 ieee80211_free_txskb(ar->hw, skb); in ath10k_mgmt_over_wmi_tx_work()
4260 dma_unmap_single(ar->dev, paddr, skb->len, in ath10k_mgmt_over_wmi_tx_work()
4262 ieee80211_free_txskb(ar->hw, skb); in ath10k_mgmt_over_wmi_tx_work()
4269 ieee80211_free_txskb(ar->hw, skb); in ath10k_mgmt_over_wmi_tx_work()
4282 artxq = (void *)txq->drv_priv; in ath10k_mac_txq_init()
4283 INIT_LIST_HEAD(&artxq->list); in ath10k_mac_txq_init()
4295 spin_lock_bh(&ar->htt.tx_lock); in ath10k_mac_txq_unref()
4296 idr_for_each_entry(&ar->htt.pending_tx, msdu, msdu_id) { in ath10k_mac_txq_unref()
4298 if (cb->txq == txq) in ath10k_mac_txq_unref()
4299 cb->txq = NULL; in ath10k_mac_txq_unref()
4301 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_txq_unref()
4310 lockdep_assert_held(&ar->data_lock); in ath10k_mac_txq_lookup()
4312 peer = ar->peer_map[peer_id]; in ath10k_mac_txq_lookup()
4316 if (peer->removed) in ath10k_mac_txq_lookup()
4319 if (peer->sta) in ath10k_mac_txq_lookup()
4320 return peer->sta->txq[tid]; in ath10k_mac_txq_lookup()
4321 else if (peer->vif) in ath10k_mac_txq_lookup()
4322 return peer->vif->txq; in ath10k_mac_txq_lookup()
4330 struct ath10k *ar = hw->priv; in ath10k_mac_tx_can_push()
4331 struct ath10k_txq *artxq = (void *)txq->drv_priv; in ath10k_mac_tx_can_push()
4334 if (ar->htt.tx_q_state.mode == HTT_TX_MODE_SWITCH_PUSH) in ath10k_mac_tx_can_push()
4337 if (ar->htt.num_pending_tx < ar->htt.tx_q_state.num_push_allowed) in ath10k_mac_tx_can_push()
4340 if (artxq->num_fw_queued < artxq->num_push_allowed) in ath10k_mac_tx_can_push()
4362 if (!txq || !txq->sta) in ath10k_mac_update_airtime()
4365 if (test_bit(WMI_SERVICE_REPORT_AIRTIME, ar->wmi.svc_map)) in ath10k_mac_update_airtime()
4368 spin_lock_bh(&ar->data_lock); in ath10k_mac_update_airtime()
4369 arsta = (struct ath10k_sta *)txq->sta->drv_priv; in ath10k_mac_update_airtime()
4371 pktlen = skb->len + 38; /* Assume MAC header 30, SNAP 8 for most case */ in ath10k_mac_update_airtime()
4372 if (arsta->last_tx_bitrate) { in ath10k_mac_update_airtime()
4375 / arsta->last_tx_bitrate; in ath10k_mac_update_airtime()
4387 spin_unlock_bh(&ar->data_lock); in ath10k_mac_update_airtime()
4395 struct ath10k *ar = hw->priv; in ath10k_mac_tx_push_txq()
4396 struct ath10k_htt *htt = &ar->htt; in ath10k_mac_tx_push_txq()
4397 struct ath10k_txq *artxq = (void *)txq->drv_priv; in ath10k_mac_tx_push_txq()
4398 struct ieee80211_vif *vif = txq->vif; in ath10k_mac_tx_push_txq()
4399 struct ieee80211_sta *sta = txq->sta; in ath10k_mac_tx_push_txq()
4409 spin_lock_bh(&ar->htt.tx_lock); in ath10k_mac_tx_push_txq()
4411 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_tx_push_txq()
4418 spin_lock_bh(&ar->htt.tx_lock); in ath10k_mac_tx_push_txq()
4420 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_tx_push_txq()
4422 return -ENOENT; in ath10k_mac_tx_push_txq()
4428 skb_len = skb->len; in ath10k_mac_tx_push_txq()
4434 hdr = (struct ieee80211_hdr *)skb->data; in ath10k_mac_tx_push_txq()
4435 is_presp = ieee80211_is_probe_resp(hdr->frame_control); in ath10k_mac_tx_push_txq()
4437 spin_lock_bh(&ar->htt.tx_lock); in ath10k_mac_tx_push_txq()
4442 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_tx_push_txq()
4445 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_tx_push_txq()
4452 spin_lock_bh(&ar->htt.tx_lock); in ath10k_mac_tx_push_txq()
4456 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_tx_push_txq()
4461 spin_lock_bh(&ar->htt.tx_lock); in ath10k_mac_tx_push_txq()
4462 artxq->num_fw_queued++; in ath10k_mac_tx_push_txq()
4463 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_tx_push_txq()
4482 if (ret == -EBUSY) in ath10k_mac_schedule_txq()
4492 struct ieee80211_hw *hw = ar->hw; in ath10k_mac_tx_push_pending()
4495 if (ar->htt.tx_q_state.mode != HTT_TX_MODE_SWITCH_PUSH) in ath10k_mac_tx_push_pending()
4498 if (ar->htt.num_pending_tx >= (ar->htt.max_num_pending_tx / 2)) in ath10k_mac_tx_push_pending()
4503 if (ath10k_mac_schedule_txq(hw, ac) == -EBUSY) in ath10k_mac_tx_push_pending()
4516 lockdep_assert_held(&ar->data_lock); in __ath10k_scan_finish()
4518 switch (ar->scan.state) { in __ath10k_scan_finish()
4523 if (ar->scan.is_roc && ar->scan.roc_notify) in __ath10k_scan_finish()
4524 ieee80211_remain_on_channel_expired(ar->hw); in __ath10k_scan_finish()
4527 if (!ar->scan.is_roc) { in __ath10k_scan_finish()
4529 .aborted = ((ar->scan.state == in __ath10k_scan_finish()
4531 (ar->scan.state == in __ath10k_scan_finish()
4535 ieee80211_scan_completed(ar->hw, &info); in __ath10k_scan_finish()
4538 ar->scan.state = ATH10K_SCAN_IDLE; in __ath10k_scan_finish()
4539 ar->scan_channel = NULL; in __ath10k_scan_finish()
4540 ar->scan.roc_freq = 0; in __ath10k_scan_finish()
4542 cancel_delayed_work(&ar->scan.timeout); in __ath10k_scan_finish()
4543 complete(&ar->scan.completed); in __ath10k_scan_finish()
4550 spin_lock_bh(&ar->data_lock); in ath10k_scan_finish()
4552 spin_unlock_bh(&ar->data_lock); in ath10k_scan_finish()
4564 lockdep_assert_held(&ar->conf_mutex); in ath10k_scan_stop()
4572 ret = wait_for_completion_timeout(&ar->scan.completed, 3 * HZ); in ath10k_scan_stop()
4575 ret = -ETIMEDOUT; in ath10k_scan_stop()
4588 spin_lock_bh(&ar->data_lock); in ath10k_scan_stop()
4589 if (ar->scan.state != ATH10K_SCAN_IDLE) in ath10k_scan_stop()
4591 spin_unlock_bh(&ar->data_lock); in ath10k_scan_stop()
4600 lockdep_assert_held(&ar->conf_mutex); in ath10k_scan_abort()
4602 spin_lock_bh(&ar->data_lock); in ath10k_scan_abort()
4604 switch (ar->scan.state) { in ath10k_scan_abort()
4613 ath10k_scan_state_str(ar->scan.state), in ath10k_scan_abort()
4614 ar->scan.state); in ath10k_scan_abort()
4617 ar->scan.state = ATH10K_SCAN_ABORTING; in ath10k_scan_abort()
4618 spin_unlock_bh(&ar->data_lock); in ath10k_scan_abort()
4624 spin_lock_bh(&ar->data_lock); in ath10k_scan_abort()
4628 spin_unlock_bh(&ar->data_lock); in ath10k_scan_abort()
4636 mutex_lock(&ar->conf_mutex); in ath10k_scan_timeout_work()
4638 mutex_unlock(&ar->conf_mutex); in ath10k_scan_timeout_work()
4646 lockdep_assert_held(&ar->conf_mutex); in ath10k_start_scan()
4652 ret = wait_for_completion_timeout(&ar->scan.started, 1 * HZ); in ath10k_start_scan()
4658 return -ETIMEDOUT; in ath10k_start_scan()
4665 spin_lock_bh(&ar->data_lock); in ath10k_start_scan()
4666 if (ar->scan.state == ATH10K_SCAN_IDLE) { in ath10k_start_scan()
4667 spin_unlock_bh(&ar->data_lock); in ath10k_start_scan()
4668 return -EINVAL; in ath10k_start_scan()
4670 spin_unlock_bh(&ar->data_lock); in ath10k_start_scan()
4683 struct ath10k *ar = hw->priv; in ath10k_mac_op_tx()
4684 struct ath10k_htt *htt = &ar->htt; in ath10k_mac_op_tx()
4686 struct ieee80211_vif *vif = info->control.vif; in ath10k_mac_op_tx()
4687 struct ieee80211_sta *sta = control->sta; in ath10k_mac_op_tx()
4708 spin_lock_bh(&ar->htt.tx_lock); in ath10k_mac_op_tx()
4709 if (!(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP)) { in ath10k_mac_op_tx()
4710 struct ieee80211_hdr *hdr = (void *)skb->data; in ath10k_mac_op_tx()
4712 is_presp = ieee80211_is_probe_resp(hdr->frame_control); in ath10k_mac_op_tx()
4719 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_op_tx()
4720 ieee80211_free_txskb(ar->hw, skb); in ath10k_mac_op_tx()
4729 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_op_tx()
4730 ieee80211_free_txskb(ar->hw, skb); in ath10k_mac_op_tx()
4733 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_op_tx()
4740 spin_lock_bh(&ar->htt.tx_lock); in ath10k_mac_op_tx()
4744 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_op_tx()
4753 struct ath10k *ar = hw->priv; in ath10k_mac_op_wake_tx_queue()
4755 u8 ac = txq->ac; in ath10k_mac_op_wake_tx_queue()
4758 if (ar->htt.tx_q_state.mode != HTT_TX_MODE_SWITCH_PUSH) in ath10k_mac_op_wake_tx_queue()
4761 spin_lock_bh(&ar->queue_lock[ac]); in ath10k_mac_op_wake_tx_queue()
4777 spin_unlock_bh(&ar->queue_lock[ac]); in ath10k_mac_op_wake_tx_queue()
4783 lockdep_assert_not_held(&ar->conf_mutex); in ath10k_drain_tx()
4785 /* make sure rcu-protected mac80211 tx path itself is drained */ in ath10k_drain_tx()
4791 cancel_work_sync(&ar->offchan_tx_work); in ath10k_drain_tx()
4792 cancel_work_sync(&ar->wmi_mgmt_tx_work); in ath10k_drain_tx()
4799 lockdep_assert_held(&ar->conf_mutex); in ath10k_halt()
4801 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags); in ath10k_halt()
4802 ar->filter_flags = 0; in ath10k_halt()
4803 ar->monitor = false; in ath10k_halt()
4804 ar->monitor_arvif = NULL; in ath10k_halt()
4806 if (ar->monitor_started) in ath10k_halt()
4809 ar->monitor_started = false; in ath10k_halt()
4810 ar->tx_paused = 0; in ath10k_halt()
4818 spin_lock_bh(&ar->data_lock); in ath10k_halt()
4819 list_for_each_entry(arvif, &ar->arvifs, list) in ath10k_halt()
4821 spin_unlock_bh(&ar->data_lock); in ath10k_halt()
4827 struct ath10k *ar = hw->priv; in ath10k_get_antenna()
4829 mutex_lock(&ar->conf_mutex); in ath10k_get_antenna()
4831 *tx_ant = ar->cfg_tx_chainmask; in ath10k_get_antenna()
4832 *rx_ant = ar->cfg_rx_chainmask; in ath10k_get_antenna()
4834 mutex_unlock(&ar->conf_mutex); in ath10k_get_antenna()
4855 int nsts = ar->vht_cap_info; in ath10k_mac_get_vht_cap_bf_sts()
4860 /* If firmware does not deliver to host number of space-time in ath10k_mac_get_vht_cap_bf_sts()
4862 * the value for VHT CAP: nsts-1) in ath10k_mac_get_vht_cap_bf_sts()
4872 int sound_dim = ar->vht_cap_info; in ath10k_mac_get_vht_cap_bf_sound_dim()
4889 struct ath10k_hw_params *hw = &ar->hw_params; in ath10k_create_vht_cap()
4895 vht_cap.cap = ar->vht_cap_info; in ath10k_create_vht_cap()
4897 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE | in ath10k_create_vht_cap()
4906 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE | in ath10k_create_vht_cap()
4917 if ((i < ar->num_rf_chains) && (ar->cfg_tx_chainmask & BIT(i))) in ath10k_create_vht_cap()
4923 if (ar->cfg_tx_chainmask <= 1) in ath10k_create_vht_cap()
4931 * user-space a clue if that is the case. in ath10k_create_vht_cap()
4934 (hw->vht160_mcs_rx_highest != 0 || in ath10k_create_vht_cap()
4935 hw->vht160_mcs_tx_highest != 0)) { in ath10k_create_vht_cap()
4936 vht_cap.vht_mcs.rx_highest = cpu_to_le16(hw->vht160_mcs_rx_highest); in ath10k_create_vht_cap()
4937 vht_cap.vht_mcs.tx_highest = cpu_to_le16(hw->vht160_mcs_tx_highest); in ath10k_create_vht_cap()
4948 if (!(ar->ht_cap_info & WMI_HT_CAP_ENABLED)) in ath10k_get_ht_cap()
4959 if (ar->ht_cap_info & WMI_HT_CAP_HT20_SGI) in ath10k_get_ht_cap()
4962 if (ar->ht_cap_info & WMI_HT_CAP_HT40_SGI) in ath10k_get_ht_cap()
4965 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) { in ath10k_get_ht_cap()
4974 if (ar->ht_cap_info & WMI_HT_CAP_TX_STBC && (ar->cfg_tx_chainmask > 1)) in ath10k_get_ht_cap()
4977 if (ar->ht_cap_info & WMI_HT_CAP_RX_STBC) { in ath10k_get_ht_cap()
4980 stbc = ar->ht_cap_info; in ath10k_get_ht_cap()
4989 if (ar->ht_cap_info & WMI_HT_CAP_LDPC || (ar->ht_cap_info & in ath10k_get_ht_cap()
4990 WMI_HT_CAP_RX_LDPC && (ar->ht_cap_info & WMI_HT_CAP_TX_LDPC))) in ath10k_get_ht_cap()
4993 if (ar->ht_cap_info & WMI_HT_CAP_L_SIG_TXOP_PROT) in ath10k_get_ht_cap()
4997 if (ar->vht_cap_info & WMI_VHT_CAP_MAX_MPDU_LEN_MASK) in ath10k_get_ht_cap()
5000 for (i = 0; i < ar->num_rf_chains; i++) { in ath10k_get_ht_cap()
5001 if (ar->cfg_rx_chainmask & BIT(i)) in ath10k_get_ht_cap()
5019 if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) { in ath10k_mac_setup_ht_vht_cap()
5020 band = &ar->mac.sbands[NL80211_BAND_2GHZ]; in ath10k_mac_setup_ht_vht_cap()
5021 band->ht_cap = ht_cap; in ath10k_mac_setup_ht_vht_cap()
5023 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) { in ath10k_mac_setup_ht_vht_cap()
5024 band = &ar->mac.sbands[NL80211_BAND_5GHZ]; in ath10k_mac_setup_ht_vht_cap()
5025 band->ht_cap = ht_cap; in ath10k_mac_setup_ht_vht_cap()
5026 band->vht_cap = vht_cap; in ath10k_mac_setup_ht_vht_cap()
5035 lockdep_assert_held(&ar->conf_mutex); in __ath10k_set_antenna()
5041 return -EINVAL; in __ath10k_set_antenna()
5043 ar->cfg_tx_chainmask = tx_ant; in __ath10k_set_antenna()
5044 ar->cfg_rx_chainmask = rx_ant; in __ath10k_set_antenna()
5046 if ((ar->state != ATH10K_STATE_ON) && in __ath10k_set_antenna()
5047 (ar->state != ATH10K_STATE_RESTARTED)) in __ath10k_set_antenna()
5050 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->tx_chain_mask, in __ath10k_set_antenna()
5053 ath10k_warn(ar, "failed to set tx-chainmask: %d, req 0x%x\n", in __ath10k_set_antenna()
5058 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->rx_chain_mask, in __ath10k_set_antenna()
5061 ath10k_warn(ar, "failed to set rx-chainmask: %d, req 0x%x\n", in __ath10k_set_antenna()
5075 struct ath10k *ar = hw->priv; in ath10k_set_antenna()
5078 mutex_lock(&ar->conf_mutex); in ath10k_set_antenna()
5080 mutex_unlock(&ar->conf_mutex); in ath10k_set_antenna()
5091 node = ar->dev->of_node; in __ath10k_fetch_bb_timing_dt()
5093 return -ENOENT; in __ath10k_fetch_bb_timing_dt()
5095 ret = of_property_read_string_index(node, "ext-fem-name", 0, &fem_name); in __ath10k_fetch_bb_timing_dt()
5097 return -ENOENT; in __ath10k_fetch_bb_timing_dt()
5104 if (!strcmp("microsemi-lx5586", fem_name)) { in __ath10k_fetch_bb_timing_dt()
5105 bb_timing->bb_tx_timing = 0x00; in __ath10k_fetch_bb_timing_dt()
5106 bb_timing->bb_xpa_timing = 0x0101; in __ath10k_fetch_bb_timing_dt()
5108 return -ENOENT; in __ath10k_fetch_bb_timing_dt()
5112 bb_timing->bb_tx_timing, bb_timing->bb_xpa_timing); in __ath10k_fetch_bb_timing_dt()
5121 if (ar->hw_values->rfkill_pin == 0) { in ath10k_mac_rfkill_config()
5123 return -EOPNOTSUPP; in ath10k_mac_rfkill_config()
5128 ar->hw_values->rfkill_pin, ar->hw_values->rfkill_cfg, in ath10k_mac_rfkill_config()
5129 ar->hw_values->rfkill_on_level); in ath10k_mac_rfkill_config()
5132 ar->hw_values->rfkill_on_level) | in ath10k_mac_rfkill_config()
5134 ar->hw_values->rfkill_pin) | in ath10k_mac_rfkill_config()
5136 ar->hw_values->rfkill_cfg); in ath10k_mac_rfkill_config()
5139 ar->wmi.pdev_param->rfkill_config, in ath10k_mac_rfkill_config()
5162 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->rfkill_enable, in ath10k_mac_rfkill_enable_radio()
5175 struct ath10k *ar = hw->priv; in ath10k_start()
5187 mutex_lock(&ar->conf_mutex); in ath10k_start()
5189 switch (ar->state) { in ath10k_start()
5191 ar->state = ATH10K_STATE_ON; in ath10k_start()
5194 ar->state = ATH10K_STATE_RESTARTED; in ath10k_start()
5200 ret = -EINVAL; in ath10k_start()
5203 ret = -EBUSY; in ath10k_start()
5207 spin_lock_bh(&ar->data_lock); in ath10k_start()
5209 if (ar->hw_rfkill_on) { in ath10k_start()
5210 ar->hw_rfkill_on = false; in ath10k_start()
5211 spin_unlock_bh(&ar->data_lock); in ath10k_start()
5215 spin_unlock_bh(&ar->data_lock); in ath10k_start()
5224 &ar->normal_mode_fw); in ath10k_start()
5230 if (ar->sys_cap_info & WMI_TLV_SYS_CAP_INFO_RFKILL) { in ath10k_start()
5232 if (ret && ret != -EOPNOTSUPP) { in ath10k_start()
5238 param = ar->wmi.pdev_param->pmf_qos; in ath10k_start()
5245 param = ar->wmi.pdev_param->dynamic_bw; in ath10k_start()
5252 if (test_bit(WMI_SERVICE_SPOOF_MAC_SUPPORT, ar->wmi.svc_map)) { in ath10k_start()
5253 ret = ath10k_wmi_scan_prob_req_oui(ar, ar->mac_addr); in ath10k_start()
5260 if (test_bit(WMI_SERVICE_ADAPTIVE_OCS, ar->wmi.svc_map)) { in ath10k_start()
5269 if (test_bit(WMI_SERVICE_BURST, ar->wmi.svc_map)) { in ath10k_start()
5270 param = ar->wmi.pdev_param->burst_enable; in ath10k_start()
5278 param = ar->wmi.pdev_param->idle_ps_config; in ath10k_start()
5280 if (ret && ret != -EOPNOTSUPP) { in ath10k_start()
5285 __ath10k_set_antenna(ar, ar->cfg_tx_chainmask, ar->cfg_rx_chainmask); in ath10k_start()
5296 param = ar->wmi.pdev_param->arp_ac_override; in ath10k_start()
5305 ar->running_fw->fw_file.fw_features)) { in ath10k_start()
5316 param = ar->wmi.pdev_param->ani_enable; in ath10k_start()
5324 ar->ani_enabled = true; in ath10k_start()
5327 param = ar->wmi.pdev_param->peer_stats_update_period; in ath10k_start()
5338 param = ar->wmi.pdev_param->enable_btcoex; in ath10k_start()
5339 if (test_bit(WMI_SERVICE_COEX_GPIO, ar->wmi.svc_map) && in ath10k_start()
5341 ar->running_fw->fw_file.fw_features) && in ath10k_start()
5342 ar->coex_support) { in ath10k_start()
5349 clear_bit(ATH10K_FLAG_BTCOEX, &ar->dev_flags); in ath10k_start()
5352 if (test_bit(WMI_SERVICE_BB_TIMING_CONFIG_SUPPORT, ar->wmi.svc_map)) { in ath10k_start()
5365 ar->num_started_vdevs = 0; in ath10k_start()
5371 ar->radar_conf_state = ATH10K_RADAR_CONFIRMATION_IDLE; in ath10k_start()
5373 mutex_unlock(&ar->conf_mutex); in ath10k_start()
5383 ar->state = ATH10K_STATE_OFF; in ath10k_start()
5386 mutex_unlock(&ar->conf_mutex); in ath10k_start()
5392 struct ath10k *ar = hw->priv; in ath10k_stop()
5397 mutex_lock(&ar->conf_mutex); in ath10k_stop()
5398 if (ar->state != ATH10K_STATE_OFF) { in ath10k_stop()
5399 if (!ar->hw_rfkill_on) { in ath10k_stop()
5405 if (ar->state != ATH10K_STATE_RESTARTING) { in ath10k_stop()
5416 ar->state = ATH10K_STATE_OFF; in ath10k_stop()
5418 mutex_unlock(&ar->conf_mutex); in ath10k_stop()
5420 cancel_work_sync(&ar->set_coverage_class_work); in ath10k_stop()
5421 cancel_delayed_work_sync(&ar->scan.timeout); in ath10k_stop()
5422 cancel_work_sync(&ar->restart_work); in ath10k_stop()
5430 lockdep_assert_held(&ar->conf_mutex); in ath10k_config_ps()
5432 list_for_each_entry(arvif, &ar->arvifs, list) { in ath10k_config_ps()
5445 struct ath10k *ar = hw->priv; in ath10k_config()
5446 struct ieee80211_conf *conf = &hw->conf; in ath10k_config()
5449 mutex_lock(&ar->conf_mutex); in ath10k_config()
5455 ar->monitor = conf->flags & IEEE80211_CONF_MONITOR; in ath10k_config()
5461 mutex_unlock(&ar->conf_mutex); in ath10k_config()
5479 struct ath10k *ar = arvif->ar; in ath10k_mac_set_txbf_conf()
5487 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE | in ath10k_mac_set_txbf_conf()
5492 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE | in ath10k_mac_set_txbf_conf()
5499 if (ar->vht_cap_info & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE) in ath10k_mac_set_txbf_conf()
5502 if (ar->vht_cap_info & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE) in ath10k_mac_set_txbf_conf()
5506 if (ar->vht_cap_info & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE) in ath10k_mac_set_txbf_conf()
5509 if (ar->vht_cap_info & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE) in ath10k_mac_set_txbf_conf()
5513 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, in ath10k_mac_set_txbf_conf()
5514 ar->wmi.vdev_param->txbf, value); in ath10k_mac_set_txbf_conf()
5520 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_update_vif_offload()
5521 struct ath10k *ar = hw->priv; in ath10k_update_vif_offload()
5526 ar->wmi.vdev_param->tx_encap_type == WMI_VDEV_PARAM_UNSUPPORTED || in ath10k_update_vif_offload()
5527 (vif->type != NL80211_IFTYPE_STATION && in ath10k_update_vif_offload()
5528 vif->type != NL80211_IFTYPE_AP)) in ath10k_update_vif_offload()
5529 vif->offload_flags &= ~IEEE80211_OFFLOAD_ENCAP_ENABLED; in ath10k_update_vif_offload()
5531 vdev_param = ar->wmi.vdev_param->tx_encap_type; in ath10k_update_vif_offload()
5532 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_update_vif_offload()
5535 if (ret && ret != -EOPNOTSUPP) { in ath10k_update_vif_offload()
5537 arvif->vdev_id, ret); in ath10k_update_vif_offload()
5551 struct ath10k *ar = hw->priv; in ath10k_add_interface()
5552 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_add_interface()
5561 vif->driver_flags |= IEEE80211_VIF_SUPPORTS_UAPSD; in ath10k_add_interface()
5563 mutex_lock(&ar->conf_mutex); in ath10k_add_interface()
5566 ath10k_mac_txq_init(vif->txq); in ath10k_add_interface()
5568 arvif->ar = ar; in ath10k_add_interface()
5569 arvif->vif = vif; in ath10k_add_interface()
5571 INIT_LIST_HEAD(&arvif->list); in ath10k_add_interface()
5572 INIT_WORK(&arvif->ap_csa_work, ath10k_mac_vif_ap_csa_work); in ath10k_add_interface()
5573 INIT_DELAYED_WORK(&arvif->connection_loss_work, in ath10k_add_interface()
5576 for (i = 0; i < ARRAY_SIZE(arvif->bitrate_mask.control); i++) { in ath10k_add_interface()
5577 arvif->bitrate_mask.control[i].legacy = 0xffffffff; in ath10k_add_interface()
5578 memset(arvif->bitrate_mask.control[i].ht_mcs, 0xff, in ath10k_add_interface()
5579 sizeof(arvif->bitrate_mask.control[i].ht_mcs)); in ath10k_add_interface()
5580 memset(arvif->bitrate_mask.control[i].vht_mcs, 0xff, in ath10k_add_interface()
5581 sizeof(arvif->bitrate_mask.control[i].vht_mcs)); in ath10k_add_interface()
5584 if (ar->num_peers >= ar->max_num_peers) { in ath10k_add_interface()
5586 ret = -ENOBUFS; in ath10k_add_interface()
5590 if (ar->free_vdev_map == 0) { in ath10k_add_interface()
5592 ret = -EBUSY; in ath10k_add_interface()
5595 bit = __ffs64(ar->free_vdev_map); in ath10k_add_interface()
5598 bit, ar->free_vdev_map); in ath10k_add_interface()
5600 arvif->vdev_id = bit; in ath10k_add_interface()
5601 arvif->vdev_subtype = in ath10k_add_interface()
5604 switch (vif->type) { in ath10k_add_interface()
5606 arvif->vdev_type = WMI_VDEV_TYPE_STA; in ath10k_add_interface()
5607 arvif->vdev_subtype = ath10k_wmi_get_vdev_subtype in ath10k_add_interface()
5612 arvif->vdev_type = WMI_VDEV_TYPE_STA; 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_IBSS; in ath10k_add_interface()
5621 if (test_bit(WMI_SERVICE_MESH_11S, ar->wmi.svc_map)) { in ath10k_add_interface()
5622 arvif->vdev_subtype = ath10k_wmi_get_vdev_subtype in ath10k_add_interface()
5624 } else if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) { in ath10k_add_interface()
5625 ret = -EINVAL; in ath10k_add_interface()
5629 arvif->vdev_type = WMI_VDEV_TYPE_AP; in ath10k_add_interface()
5632 arvif->vdev_type = WMI_VDEV_TYPE_AP; in ath10k_add_interface()
5634 if (vif->p2p) in ath10k_add_interface()
5635 arvif->vdev_subtype = ath10k_wmi_get_vdev_subtype in ath10k_add_interface()
5639 arvif->vdev_type = WMI_VDEV_TYPE_MONITOR; in ath10k_add_interface()
5646 /* Using vdev_id as queue number will make it very easy to do per-vif in ath10k_add_interface()
5651 vif->cab_queue = arvif->vdev_id % (IEEE80211_MAX_QUEUES - 1); in ath10k_add_interface()
5652 for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++) in ath10k_add_interface()
5653 vif->hw_queue[i] = arvif->vdev_id % (IEEE80211_MAX_QUEUES - 1); in ath10k_add_interface()
5660 * On non-IOMMU-enabled hosts this could be a possible security issue in ath10k_add_interface()
5662 * IOMMU-enabled hosts DMAR faults would occur in most cases and target in ath10k_add_interface()
5667 * DMA-coherent buffer for a lifetime of a vif and use it for all in ath10k_add_interface()
5669 * become corrupted, e.g. have garbled IEs or out-of-date TIM bitmap. in ath10k_add_interface()
5671 if (vif->type == NL80211_IFTYPE_ADHOC || in ath10k_add_interface()
5672 vif->type == NL80211_IFTYPE_MESH_POINT || in ath10k_add_interface()
5673 vif->type == NL80211_IFTYPE_AP) { in ath10k_add_interface()
5674 if (ar->bus_param.dev_type == ATH10K_DEV_TYPE_HL) { in ath10k_add_interface()
5675 arvif->beacon_buf = kmalloc(IEEE80211_MAX_FRAME_LEN, in ath10k_add_interface()
5681 * known-invalid address token instead, which in ath10k_add_interface()
5685 arvif->beacon_paddr = DMA_MAPPING_ERROR; in ath10k_add_interface()
5687 arvif->beacon_buf = in ath10k_add_interface()
5688 dma_alloc_coherent(ar->dev, in ath10k_add_interface()
5690 &arvif->beacon_paddr, in ath10k_add_interface()
5693 if (!arvif->beacon_buf) { in ath10k_add_interface()
5694 ret = -ENOMEM; in ath10k_add_interface()
5700 if (test_bit(ATH10K_FLAG_HW_CRYPTO_DISABLED, &ar->dev_flags)) in ath10k_add_interface()
5701 arvif->nohwcrypt = true; in ath10k_add_interface()
5703 if (arvif->nohwcrypt && in ath10k_add_interface()
5704 !test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) { in ath10k_add_interface()
5705 ret = -EINVAL; in ath10k_add_interface()
5711 arvif->vdev_id, arvif->vdev_type, arvif->vdev_subtype, in ath10k_add_interface()
5712 arvif->beacon_buf ? "single-buf" : "per-skb"); in ath10k_add_interface()
5714 ret = ath10k_wmi_vdev_create(ar, arvif->vdev_id, arvif->vdev_type, in ath10k_add_interface()
5715 arvif->vdev_subtype, vif->addr); in ath10k_add_interface()
5718 arvif->vdev_id, ret); in ath10k_add_interface()
5723 ar->wmi.svc_map)) { in ath10k_add_interface()
5724 vdev_param = ar->wmi.vdev_param->disable_4addr_src_lrn; in ath10k_add_interface()
5725 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_add_interface()
5727 if (ret && ret != -EOPNOTSUPP) { in ath10k_add_interface()
5729 arvif->vdev_id, ret); in ath10k_add_interface()
5733 ar->free_vdev_map &= ~(1LL << arvif->vdev_id); in ath10k_add_interface()
5734 spin_lock_bh(&ar->data_lock); in ath10k_add_interface()
5735 list_add(&arvif->list, &ar->arvifs); in ath10k_add_interface()
5736 spin_unlock_bh(&ar->data_lock); in ath10k_add_interface()
5744 arvif->vdev_id, ret); in ath10k_add_interface()
5748 arvif->def_wep_key_idx = -1; in ath10k_add_interface()
5755 if (ar->cfg_tx_chainmask && (vif->type != NL80211_IFTYPE_MONITOR)) { in ath10k_add_interface()
5756 u16 nss = get_nss_from_chainmask(ar->cfg_tx_chainmask); in ath10k_add_interface()
5758 vdev_param = ar->wmi.vdev_param->nss; in ath10k_add_interface()
5759 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_add_interface()
5763 arvif->vdev_id, ar->cfg_tx_chainmask, nss, in ath10k_add_interface()
5769 if (arvif->vdev_type == WMI_VDEV_TYPE_AP || in ath10k_add_interface()
5770 arvif->vdev_type == WMI_VDEV_TYPE_IBSS) { in ath10k_add_interface()
5771 ret = ath10k_peer_create(ar, vif, NULL, arvif->vdev_id, in ath10k_add_interface()
5772 vif->addr, WMI_PEER_TYPE_DEFAULT); in ath10k_add_interface()
5775 arvif->vdev_id, ret); in ath10k_add_interface()
5779 spin_lock_bh(&ar->data_lock); in ath10k_add_interface()
5781 peer = ath10k_peer_find(ar, arvif->vdev_id, vif->addr); in ath10k_add_interface()
5784 vif->addr, arvif->vdev_id); in ath10k_add_interface()
5785 spin_unlock_bh(&ar->data_lock); in ath10k_add_interface()
5786 ret = -ENOENT; in ath10k_add_interface()
5790 arvif->peer_id = find_first_bit(peer->peer_ids, in ath10k_add_interface()
5793 spin_unlock_bh(&ar->data_lock); in ath10k_add_interface()
5795 arvif->peer_id = HTT_INVALID_PEERID; in ath10k_add_interface()
5798 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) { in ath10k_add_interface()
5802 arvif->vdev_id, ret); in ath10k_add_interface()
5807 if (arvif->vdev_type == WMI_VDEV_TYPE_STA) { in ath10k_add_interface()
5810 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath10k_add_interface()
5814 arvif->vdev_id, ret); in ath10k_add_interface()
5821 arvif->vdev_id, ret); in ath10k_add_interface()
5828 arvif->vdev_id, ret); in ath10k_add_interface()
5836 arvif->vdev_id, ret); in ath10k_add_interface()
5840 ret = ath10k_mac_set_rts(arvif, ar->hw->wiphy->rts_threshold); in ath10k_add_interface()
5843 arvif->vdev_id, ret); in ath10k_add_interface()
5847 arvif->txpower = vif->bss_conf.txpower; in ath10k_add_interface()
5854 if (test_bit(WMI_SERVICE_RTT_RESPONDER_ROLE, ar->wmi.svc_map)) { in ath10k_add_interface()
5855 vdev_param = ar->wmi.vdev_param->rtt_responder_role; in ath10k_add_interface()
5856 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_add_interface()
5857 arvif->ftm_responder); in ath10k_add_interface()
5860 if (ret && ret != -EOPNOTSUPP) in ath10k_add_interface()
5862 arvif->vdev_id, ret); in ath10k_add_interface()
5865 if (vif->type == NL80211_IFTYPE_MONITOR) { in ath10k_add_interface()
5866 ar->monitor_arvif = arvif; in ath10k_add_interface()
5874 spin_lock_bh(&ar->htt.tx_lock); in ath10k_add_interface()
5875 if (!ar->tx_paused) in ath10k_add_interface()
5876 ieee80211_wake_queue(ar->hw, arvif->vdev_id); in ath10k_add_interface()
5877 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_add_interface()
5879 mutex_unlock(&ar->conf_mutex); in ath10k_add_interface()
5883 if (arvif->vdev_type == WMI_VDEV_TYPE_AP || in ath10k_add_interface()
5884 arvif->vdev_type == WMI_VDEV_TYPE_IBSS) { in ath10k_add_interface()
5885 ath10k_wmi_peer_delete(ar, arvif->vdev_id, vif->addr); in ath10k_add_interface()
5886 ath10k_wait_for_peer_delete_done(ar, arvif->vdev_id, in ath10k_add_interface()
5887 vif->addr); in ath10k_add_interface()
5891 ath10k_wmi_vdev_delete(ar, arvif->vdev_id); in ath10k_add_interface()
5892 ar->free_vdev_map |= 1LL << arvif->vdev_id; in ath10k_add_interface()
5893 spin_lock_bh(&ar->data_lock); in ath10k_add_interface()
5894 list_del(&arvif->list); in ath10k_add_interface()
5895 spin_unlock_bh(&ar->data_lock); in ath10k_add_interface()
5898 if (arvif->beacon_buf) { in ath10k_add_interface()
5899 if (ar->bus_param.dev_type == ATH10K_DEV_TYPE_HL) in ath10k_add_interface()
5900 kfree(arvif->beacon_buf); in ath10k_add_interface()
5902 dma_free_coherent(ar->dev, IEEE80211_MAX_FRAME_LEN, in ath10k_add_interface()
5903 arvif->beacon_buf, in ath10k_add_interface()
5904 arvif->beacon_paddr); in ath10k_add_interface()
5905 arvif->beacon_buf = NULL; in ath10k_add_interface()
5908 mutex_unlock(&ar->conf_mutex); in ath10k_add_interface()
5924 struct ath10k *ar = hw->priv; in ath10k_remove_interface()
5925 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_remove_interface()
5930 cancel_work_sync(&arvif->ap_csa_work); in ath10k_remove_interface()
5931 cancel_delayed_work_sync(&arvif->connection_loss_work); in ath10k_remove_interface()
5933 mutex_lock(&ar->conf_mutex); in ath10k_remove_interface()
5938 arvif->vdev_id, ret); in ath10k_remove_interface()
5940 ar->free_vdev_map |= 1LL << arvif->vdev_id; in ath10k_remove_interface()
5941 spin_lock_bh(&ar->data_lock); in ath10k_remove_interface()
5942 list_del(&arvif->list); in ath10k_remove_interface()
5943 spin_unlock_bh(&ar->data_lock); in ath10k_remove_interface()
5945 if (arvif->vdev_type == WMI_VDEV_TYPE_AP || in ath10k_remove_interface()
5946 arvif->vdev_type == WMI_VDEV_TYPE_IBSS) { in ath10k_remove_interface()
5947 ret = ath10k_wmi_peer_delete(arvif->ar, arvif->vdev_id, in ath10k_remove_interface()
5948 vif->addr); in ath10k_remove_interface()
5950 ath10k_warn(ar, "failed to submit AP/IBSS self-peer removal on vdev %i: %d\n", in ath10k_remove_interface()
5951 arvif->vdev_id, ret); in ath10k_remove_interface()
5953 ath10k_wait_for_peer_delete_done(ar, arvif->vdev_id, in ath10k_remove_interface()
5954 vif->addr); in ath10k_remove_interface()
5955 kfree(arvif->u.ap.noa_data); in ath10k_remove_interface()
5959 arvif->vdev_id); in ath10k_remove_interface()
5961 ret = ath10k_wmi_vdev_delete(ar, arvif->vdev_id); in ath10k_remove_interface()
5964 arvif->vdev_id, ret); in ath10k_remove_interface()
5972 /* Some firmware revisions don't notify host about self-peer removal in ath10k_remove_interface()
5975 if (arvif->vdev_type == WMI_VDEV_TYPE_AP || in ath10k_remove_interface()
5976 arvif->vdev_type == WMI_VDEV_TYPE_IBSS) { in ath10k_remove_interface()
5977 ret = ath10k_wait_for_peer_deleted(ar, arvif->vdev_id, in ath10k_remove_interface()
5978 vif->addr); in ath10k_remove_interface()
5980 ath10k_warn(ar, "failed to remove AP self-peer on vdev %i: %d\n", in ath10k_remove_interface()
5981 arvif->vdev_id, ret); in ath10k_remove_interface()
5983 spin_lock_bh(&ar->data_lock); in ath10k_remove_interface()
5984 ar->num_peers--; in ath10k_remove_interface()
5985 spin_unlock_bh(&ar->data_lock); in ath10k_remove_interface()
5988 spin_lock_bh(&ar->data_lock); in ath10k_remove_interface()
5989 for (i = 0; i < ARRAY_SIZE(ar->peer_map); i++) { in ath10k_remove_interface()
5990 peer = ar->peer_map[i]; in ath10k_remove_interface()
5994 if (peer->vif == vif) { in ath10k_remove_interface()
5996 vif->addr, arvif->vdev_id); in ath10k_remove_interface()
5997 peer->vif = NULL; in ath10k_remove_interface()
6005 spin_unlock_bh(&ar->data_lock); in ath10k_remove_interface()
6007 ath10k_peer_cleanup(ar, arvif->vdev_id); in ath10k_remove_interface()
6008 ath10k_mac_txq_unref(ar, vif->txq); in ath10k_remove_interface()
6010 if (vif->type == NL80211_IFTYPE_MONITOR) { in ath10k_remove_interface()
6011 ar->monitor_arvif = NULL; in ath10k_remove_interface()
6021 spin_lock_bh(&ar->htt.tx_lock); in ath10k_remove_interface()
6023 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_remove_interface()
6025 ath10k_mac_txq_unref(ar, vif->txq); in ath10k_remove_interface()
6028 mutex_unlock(&ar->conf_mutex); in ath10k_remove_interface()
6048 struct ath10k *ar = hw->priv; in ath10k_configure_filter()
6052 mutex_lock(&ar->conf_mutex); in ath10k_configure_filter()
6054 if (ar->hw_params.mcast_frame_registration) in ath10k_configure_filter()
6059 ar->filter_flags = *total_flags; in ath10k_configure_filter()
6065 mutex_unlock(&ar->conf_mutex); in ath10k_configure_filter()
6072 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_recalculate_mgmt_rate()
6080 lockdep_assert_held(&ar->conf_mutex); in ath10k_recalculate_mgmt_rate()
6082 sband = ar->hw->wiphy->bands[def->chan->band]; in ath10k_recalculate_mgmt_rate()
6083 basic_rate_idx = ffs(vif->bss_conf.basic_rates) - 1; in ath10k_recalculate_mgmt_rate()
6084 bitrate = sband->bitrates[basic_rate_idx].bitrate; in ath10k_recalculate_mgmt_rate()
6092 vdev_param = ar->wmi.vdev_param->mgmt_rate; in ath10k_recalculate_mgmt_rate()
6093 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_recalculate_mgmt_rate()
6104 struct ath10k *ar = hw->priv; in ath10k_bss_info_changed()
6105 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_bss_info_changed()
6113 mutex_lock(&ar->conf_mutex); in ath10k_bss_info_changed()
6119 arvif->beacon_interval = info->beacon_int; in ath10k_bss_info_changed()
6120 vdev_param = ar->wmi.vdev_param->beacon_interval; in ath10k_bss_info_changed()
6121 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_bss_info_changed()
6122 arvif->beacon_interval); in ath10k_bss_info_changed()
6125 arvif->vdev_id, arvif->beacon_interval); in ath10k_bss_info_changed()
6129 arvif->vdev_id, ret); in ath10k_bss_info_changed()
6135 arvif->vdev_id); in ath10k_bss_info_changed()
6137 pdev_param = ar->wmi.pdev_param->beacon_tx_mode; in ath10k_bss_info_changed()
6142 arvif->vdev_id, ret); in ath10k_bss_info_changed()
6151 arvif->u.ap.ssid_len = 4; in ath10k_bss_info_changed()
6152 memcpy(arvif->u.ap.ssid, "mesh", arvif->u.ap.ssid_len); in ath10k_bss_info_changed()
6160 arvif->vdev_id, ret); in ath10k_bss_info_changed()
6164 arvif->dtim_period = info->dtim_period; in ath10k_bss_info_changed()
6168 arvif->vdev_id, arvif->dtim_period); in ath10k_bss_info_changed()
6170 vdev_param = ar->wmi.vdev_param->dtim_period; in ath10k_bss_info_changed()
6171 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_bss_info_changed()
6172 arvif->dtim_period); in ath10k_bss_info_changed()
6175 arvif->vdev_id, ret); in ath10k_bss_info_changed()
6179 vif->type == NL80211_IFTYPE_AP) { in ath10k_bss_info_changed()
6180 arvif->u.ap.ssid_len = vif->cfg.ssid_len; in ath10k_bss_info_changed()
6181 if (vif->cfg.ssid_len) in ath10k_bss_info_changed()
6182 memcpy(arvif->u.ap.ssid, vif->cfg.ssid, in ath10k_bss_info_changed()
6183 vif->cfg.ssid_len); in ath10k_bss_info_changed()
6184 arvif->u.ap.hidden_ssid = info->hidden_ssid; in ath10k_bss_info_changed()
6187 if (changed & BSS_CHANGED_BSSID && !is_zero_ether_addr(info->bssid)) in ath10k_bss_info_changed()
6188 ether_addr_copy(arvif->bssid, info->bssid); in ath10k_bss_info_changed()
6191 arvif->ftm_responder != info->ftm_responder && in ath10k_bss_info_changed()
6192 test_bit(WMI_SERVICE_RTT_RESPONDER_ROLE, ar->wmi.svc_map)) { in ath10k_bss_info_changed()
6193 arvif->ftm_responder = info->ftm_responder; in ath10k_bss_info_changed()
6195 vdev_param = ar->wmi.vdev_param->rtt_responder_role; in ath10k_bss_info_changed()
6196 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_bss_info_changed()
6197 arvif->ftm_responder); in ath10k_bss_info_changed()
6201 arvif->vdev_id, arvif->ftm_responder, ret); in ath10k_bss_info_changed()
6208 arvif->use_cts_prot = info->use_cts_prot; in ath10k_bss_info_changed()
6213 arvif->vdev_id, ret); in ath10k_bss_info_changed()
6219 arvif->vdev_id, ret); in ath10k_bss_info_changed()
6224 if (info->use_short_slot) in ath10k_bss_info_changed()
6231 arvif->vdev_id, slottime); in ath10k_bss_info_changed()
6233 vdev_param = ar->wmi.vdev_param->slot_time; in ath10k_bss_info_changed()
6234 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_bss_info_changed()
6238 arvif->vdev_id, ret); in ath10k_bss_info_changed()
6242 if (info->use_short_preamble) in ath10k_bss_info_changed()
6249 arvif->vdev_id, preamble); in ath10k_bss_info_changed()
6251 vdev_param = ar->wmi.vdev_param->preamble; in ath10k_bss_info_changed()
6252 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_bss_info_changed()
6256 arvif->vdev_id, ret); in ath10k_bss_info_changed()
6260 if (vif->cfg.assoc) { in ath10k_bss_info_changed()
6265 if (ar->monitor_started) in ath10k_bss_info_changed()
6276 arvif->vdev_id, info->txpower); in ath10k_bss_info_changed()
6278 arvif->txpower = info->txpower; in ath10k_bss_info_changed()
6285 arvif->ps = vif->cfg.ps; in ath10k_bss_info_changed()
6290 arvif->vdev_id, ret); in ath10k_bss_info_changed()
6294 !ath10k_mac_vif_chan(arvif->vif, &def)) { in ath10k_bss_info_changed()
6295 band = def.chan->band; in ath10k_bss_info_changed()
6296 mcast_rate = vif->bss_conf.mcast_rate[band]; in ath10k_bss_info_changed()
6298 rateidx = mcast_rate - 1; in ath10k_bss_info_changed()
6300 rateidx = ffs(vif->bss_conf.basic_rates) - 1; in ath10k_bss_info_changed()
6302 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) in ath10k_bss_info_changed()
6316 arvif->vdev_id, rate); in ath10k_bss_info_changed()
6318 vdev_param = ar->wmi.vdev_param->mcast_data_rate; in ath10k_bss_info_changed()
6319 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, in ath10k_bss_info_changed()
6324 arvif->vdev_id, ret); in ath10k_bss_info_changed()
6326 vdev_param = ar->wmi.vdev_param->bcast_data_rate; in ath10k_bss_info_changed()
6327 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, in ath10k_bss_info_changed()
6332 arvif->vdev_id, ret); in ath10k_bss_info_changed()
6336 !ath10k_mac_vif_chan(arvif->vif, &def)) in ath10k_bss_info_changed()
6339 mutex_unlock(&ar->conf_mutex); in ath10k_bss_info_changed()
6345 struct ath10k *ar = hw->priv; in ath10k_mac_op_set_coverage_class()
6350 if (!ar->hw_params.hw_ops->set_coverage_class) { in ath10k_mac_op_set_coverage_class()
6354 ar->hw_params.hw_ops->set_coverage_class(ar, -1, value); in ath10k_mac_op_set_coverage_class()
6366 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv; in ath10k_mac_tdls_vif_stations_count_iter()
6367 struct ieee80211_vif *sta_vif = arsta->arvif->vif; in ath10k_mac_tdls_vif_stations_count_iter()
6369 if (sta->tdls && sta_vif == iter_data->curr_vif) in ath10k_mac_tdls_vif_stations_count_iter()
6370 iter_data->num_tdls_stations++; in ath10k_mac_tdls_vif_stations_count_iter()
6390 struct ath10k *ar = hw->priv; in ath10k_hw_scan()
6391 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_hw_scan()
6392 struct cfg80211_scan_request *req = &hw_req->req; in ath10k_hw_scan()
6398 mutex_lock(&ar->conf_mutex); in ath10k_hw_scan()
6401 ret = -EBUSY; in ath10k_hw_scan()
6405 spin_lock_bh(&ar->data_lock); in ath10k_hw_scan()
6406 switch (ar->scan.state) { in ath10k_hw_scan()
6408 reinit_completion(&ar->scan.started); in ath10k_hw_scan()
6409 reinit_completion(&ar->scan.completed); in ath10k_hw_scan()
6410 ar->scan.state = ATH10K_SCAN_STARTING; in ath10k_hw_scan()
6411 ar->scan.is_roc = false; in ath10k_hw_scan()
6412 ar->scan.vdev_id = arvif->vdev_id; in ath10k_hw_scan()
6418 ret = -EBUSY; in ath10k_hw_scan()
6421 spin_unlock_bh(&ar->data_lock); in ath10k_hw_scan()
6428 ret = -ENOMEM; in ath10k_hw_scan()
6433 arg->vdev_id = arvif->vdev_id; in ath10k_hw_scan()
6434 arg->scan_id = ATH10K_SCAN_ID; in ath10k_hw_scan()
6436 if (req->ie_len) { in ath10k_hw_scan()
6437 arg->ie_len = req->ie_len; in ath10k_hw_scan()
6438 memcpy(arg->ie, req->ie, arg->ie_len); in ath10k_hw_scan()
6441 if (req->n_ssids) { in ath10k_hw_scan()
6442 arg->n_ssids = req->n_ssids; in ath10k_hw_scan()
6443 for (i = 0; i < arg->n_ssids; i++) { in ath10k_hw_scan()
6444 arg->ssids[i].len = req->ssids[i].ssid_len; in ath10k_hw_scan()
6445 arg->ssids[i].ssid = req->ssids[i].ssid; in ath10k_hw_scan()
6448 arg->scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE; in ath10k_hw_scan()
6451 if (req->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) { in ath10k_hw_scan()
6452 arg->scan_ctrl_flags |= WMI_SCAN_ADD_SPOOFED_MAC_IN_PROBE_REQ; in ath10k_hw_scan()
6453 ether_addr_copy(arg->mac_addr.addr, req->mac_addr); in ath10k_hw_scan()
6454 ether_addr_copy(arg->mac_mask.addr, req->mac_addr_mask); in ath10k_hw_scan()
6457 if (req->n_channels) { in ath10k_hw_scan()
6458 arg->n_channels = req->n_channels; in ath10k_hw_scan()
6459 for (i = 0; i < arg->n_channels; i++) in ath10k_hw_scan()
6460 arg->channels[i] = req->channels[i]->center_freq; in ath10k_hw_scan()
6464 if (req->duration) { in ath10k_hw_scan()
6465 arg->dwell_time_active = req->duration; in ath10k_hw_scan()
6466 arg->dwell_time_passive = req->duration; in ath10k_hw_scan()
6467 arg->burst_duration_ms = req->duration; in ath10k_hw_scan()
6469 scan_timeout = min_t(u32, arg->max_rest_time * in ath10k_hw_scan()
6470 (arg->n_channels - 1) + (req->duration + in ath10k_hw_scan()
6472 arg->n_channels, arg->max_scan_time); in ath10k_hw_scan()
6474 scan_timeout = arg->max_scan_time; in ath10k_hw_scan()
6483 spin_lock_bh(&ar->data_lock); in ath10k_hw_scan()
6484 ar->scan.state = ATH10K_SCAN_IDLE; in ath10k_hw_scan()
6485 spin_unlock_bh(&ar->data_lock); in ath10k_hw_scan()
6488 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout, in ath10k_hw_scan()
6494 mutex_unlock(&ar->conf_mutex); in ath10k_hw_scan()
6501 struct ath10k *ar = hw->priv; in ath10k_cancel_hw_scan()
6503 mutex_lock(&ar->conf_mutex); in ath10k_cancel_hw_scan()
6505 mutex_unlock(&ar->conf_mutex); in ath10k_cancel_hw_scan()
6507 cancel_delayed_work_sync(&ar->scan.timeout); in ath10k_cancel_hw_scan()
6515 u32 vdev_param = arvif->ar->wmi.vdev_param->def_keyid; in ath10k_set_key_h_def_keyidx()
6520 * frames with multi-vif APs. This is not required for main firmware in ath10k_set_key_h_def_keyidx()
6523 * This is also needed for 636 fw for IBSS-RSN to work more reliably. in ath10k_set_key_h_def_keyidx()
6525 * FIXME: It remains unknown if this is required for multi-vif STA in ath10k_set_key_h_def_keyidx()
6529 if (arvif->vdev_type != WMI_VDEV_TYPE_AP && in ath10k_set_key_h_def_keyidx()
6530 arvif->vdev_type != WMI_VDEV_TYPE_IBSS) in ath10k_set_key_h_def_keyidx()
6533 if (key->cipher == WLAN_CIPHER_SUITE_WEP40) in ath10k_set_key_h_def_keyidx()
6536 if (key->cipher == WLAN_CIPHER_SUITE_WEP104) in ath10k_set_key_h_def_keyidx()
6539 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) in ath10k_set_key_h_def_keyidx()
6545 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, in ath10k_set_key_h_def_keyidx()
6546 key->keyidx); in ath10k_set_key_h_def_keyidx()
6549 arvif->vdev_id, ret); in ath10k_set_key_h_def_keyidx()
6556 struct ath10k *ar = hw->priv; in ath10k_set_key()
6557 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_set_key()
6561 bool is_wep = key->cipher == WLAN_CIPHER_SUITE_WEP40 || in ath10k_set_key()
6562 key->cipher == WLAN_CIPHER_SUITE_WEP104; in ath10k_set_key()
6569 if (key->cipher == WLAN_CIPHER_SUITE_AES_CMAC || in ath10k_set_key()
6570 key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_128 || in ath10k_set_key()
6571 key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_256 || in ath10k_set_key()
6572 key->cipher == WLAN_CIPHER_SUITE_BIP_CMAC_256) in ath10k_set_key()
6575 if (arvif->nohwcrypt) in ath10k_set_key()
6578 if (key->keyidx > WMI_MAX_KEY_INDEX) in ath10k_set_key()
6579 return -ENOSPC; in ath10k_set_key()
6581 mutex_lock(&ar->conf_mutex); in ath10k_set_key()
6584 arsta = (struct ath10k_sta *)sta->drv_priv; in ath10k_set_key()
6585 peer_addr = sta->addr; in ath10k_set_key()
6586 spin_lock_bh(&ar->data_lock); in ath10k_set_key()
6587 arsta->ucast_cipher = key->cipher; in ath10k_set_key()
6588 spin_unlock_bh(&ar->data_lock); in ath10k_set_key()
6589 } else if (arvif->vdev_type == WMI_VDEV_TYPE_STA) { in ath10k_set_key()
6590 peer_addr = vif->bss_conf.bssid; in ath10k_set_key()
6592 peer_addr = vif->addr; in ath10k_set_key()
6595 key->hw_key_idx = key->keyidx; in ath10k_set_key()
6599 arvif->wep_keys[key->keyidx] = key; in ath10k_set_key()
6601 arvif->wep_keys[key->keyidx] = NULL; in ath10k_set_key()
6604 /* the peer should not disappear in mid-way (unless FW goes awry) since in ath10k_set_key()
6607 spin_lock_bh(&ar->data_lock); in ath10k_set_key()
6608 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr); in ath10k_set_key()
6609 spin_unlock_bh(&ar->data_lock); in ath10k_set_key()
6613 ath10k_warn(ar, "failed to install key for non-existent peer %pM\n", in ath10k_set_key()
6615 ret = -EOPNOTSUPP; in ath10k_set_key()
6623 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) in ath10k_set_key()
6634 * keys. Static WEP needs an explicit per-peer key upload. in ath10k_set_key()
6636 if (vif->type == NL80211_IFTYPE_ADHOC && in ath10k_set_key()
6646 if (cmd == SET_KEY && arvif->def_wep_key_idx == -1) in ath10k_set_key()
6654 arvif->vdev_id, peer_addr, ret); in ath10k_set_key()
6661 if (is_wep && !sta && vif->type == NL80211_IFTYPE_STATION) { in ath10k_set_key()
6670 arvif->vdev_id, peer_addr, ret); in ath10k_set_key()
6676 arvif->vdev_id, peer_addr, ret2); in ath10k_set_key()
6684 spin_lock_bh(&ar->data_lock); in ath10k_set_key()
6685 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr); in ath10k_set_key()
6687 peer->keys[key->keyidx] = key; in ath10k_set_key()
6689 peer->keys[key->keyidx] = NULL; in ath10k_set_key()
6693 spin_unlock_bh(&ar->data_lock); in ath10k_set_key()
6695 if (sta && sta->tdls) in ath10k_set_key()
6696 ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr, in ath10k_set_key()
6697 ar->wmi.peer_param->authorize, 1); in ath10k_set_key()
6698 else if (sta && cmd == SET_KEY && (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)) in ath10k_set_key()
6699 ath10k_wmi_peer_set_param(ar, arvif->vdev_id, peer_addr, in ath10k_set_key()
6700 ar->wmi.peer_param->authorize, 1); in ath10k_set_key()
6703 mutex_unlock(&ar->conf_mutex); in ath10k_set_key()
6711 struct ath10k *ar = hw->priv; in ath10k_set_default_unicast_key()
6712 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_set_default_unicast_key()
6715 mutex_lock(&arvif->ar->conf_mutex); in ath10k_set_default_unicast_key()
6717 if (arvif->ar->state != ATH10K_STATE_ON) in ath10k_set_default_unicast_key()
6721 arvif->vdev_id, keyidx); in ath10k_set_default_unicast_key()
6723 ret = ath10k_wmi_vdev_set_param(arvif->ar, in ath10k_set_default_unicast_key()
6724 arvif->vdev_id, in ath10k_set_default_unicast_key()
6725 arvif->ar->wmi.vdev_param->def_keyid, in ath10k_set_default_unicast_key()
6730 arvif->vdev_id, in ath10k_set_default_unicast_key()
6735 arvif->def_wep_key_idx = keyidx; in ath10k_set_default_unicast_key()
6738 mutex_unlock(&arvif->ar->conf_mutex); in ath10k_set_default_unicast_key()
6756 arvif = arsta->arvif; in ath10k_sta_rc_update_wk()
6757 ar = arvif->ar; in ath10k_sta_rc_update_wk()
6759 if (WARN_ON(ath10k_mac_vif_chan(arvif->vif, &def))) in ath10k_sta_rc_update_wk()
6762 band = def.chan->band; in ath10k_sta_rc_update_wk()
6763 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs; in ath10k_sta_rc_update_wk()
6764 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs; in ath10k_sta_rc_update_wk()
6766 spin_lock_bh(&ar->data_lock); in ath10k_sta_rc_update_wk()
6768 changed = arsta->changed; in ath10k_sta_rc_update_wk()
6769 arsta->changed = 0; in ath10k_sta_rc_update_wk()
6771 bw = arsta->bw; in ath10k_sta_rc_update_wk()
6772 nss = arsta->nss; in ath10k_sta_rc_update_wk()
6773 smps = arsta->smps; in ath10k_sta_rc_update_wk()
6775 spin_unlock_bh(&ar->data_lock); in ath10k_sta_rc_update_wk()
6777 mutex_lock(&ar->conf_mutex); in ath10k_sta_rc_update_wk()
6788 sta->addr, bw, mode); in ath10k_sta_rc_update_wk()
6790 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr, in ath10k_sta_rc_update_wk()
6791 ar->wmi.peer_param->phymode, mode); in ath10k_sta_rc_update_wk()
6794 sta->addr, mode, err); in ath10k_sta_rc_update_wk()
6798 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr, in ath10k_sta_rc_update_wk()
6799 ar->wmi.peer_param->chan_width, bw); in ath10k_sta_rc_update_wk()
6802 sta->addr, bw, err); in ath10k_sta_rc_update_wk()
6807 sta->addr, nss); in ath10k_sta_rc_update_wk()
6809 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr, in ath10k_sta_rc_update_wk()
6810 ar->wmi.peer_param->nss, nss); in ath10k_sta_rc_update_wk()
6813 sta->addr, nss, err); in ath10k_sta_rc_update_wk()
6818 sta->addr, smps); in ath10k_sta_rc_update_wk()
6820 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr, in ath10k_sta_rc_update_wk()
6821 ar->wmi.peer_param->smps_state, smps); in ath10k_sta_rc_update_wk()
6824 sta->addr, smps, err); in ath10k_sta_rc_update_wk()
6829 sta->addr); in ath10k_sta_rc_update_wk()
6831 err = ath10k_station_assoc(ar, arvif->vif, sta, true); in ath10k_sta_rc_update_wk()
6834 sta->addr); in ath10k_sta_rc_update_wk()
6838 mutex_unlock(&ar->conf_mutex); in ath10k_sta_rc_update_wk()
6844 struct ath10k *ar = arvif->ar; in ath10k_mac_inc_num_stations()
6846 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_inc_num_stations()
6848 if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls) in ath10k_mac_inc_num_stations()
6851 if (ar->num_stations >= ar->max_num_stations) in ath10k_mac_inc_num_stations()
6852 return -ENOBUFS; in ath10k_mac_inc_num_stations()
6854 ar->num_stations++; in ath10k_mac_inc_num_stations()
6862 struct ath10k *ar = arvif->ar; in ath10k_mac_dec_num_stations()
6864 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_dec_num_stations()
6866 if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls) in ath10k_mac_dec_num_stations()
6869 ar->num_stations--; in ath10k_mac_dec_num_stations()
6876 struct ath10k *ar = hw->priv; in ath10k_sta_set_txpwr()
6877 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_sta_set_txpwr()
6881 if (sta->deflink.txpwr.type == NL80211_TX_POWER_AUTOMATIC) { in ath10k_sta_set_txpwr()
6884 txpwr = sta->deflink.txpwr.power; in ath10k_sta_set_txpwr()
6886 return -EINVAL; in ath10k_sta_set_txpwr()
6890 return -EINVAL; in ath10k_sta_set_txpwr()
6892 mutex_lock(&ar->conf_mutex); in ath10k_sta_set_txpwr()
6894 ret = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr, in ath10k_sta_set_txpwr()
6895 ar->wmi.peer_param->use_fixed_power, txpwr); in ath10k_sta_set_txpwr()
6903 mutex_unlock(&ar->conf_mutex); in ath10k_sta_set_txpwr()
6922 num_rates += hweight32(mask->control[band].legacy); in ath10k_mac_bitrate_mask_has_single_rate()
6924 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) in ath10k_mac_bitrate_mask_has_single_rate()
6925 num_rates += hweight8(mask->control[band].ht_mcs[i]); in ath10k_mac_bitrate_mask_has_single_rate()
6928 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) { in ath10k_mac_bitrate_mask_has_single_rate()
6929 tmp = hweight16(mask->control[band].vht_mcs[i]); in ath10k_mac_bitrate_mask_has_single_rate()
6952 if (hweight32(mask->control[band].legacy) == 1) { in ath10k_mac_bitrate_mask_get_single_rate()
6953 rate_idx = ffs(mask->control[band].legacy) - 1; in ath10k_mac_bitrate_mask_get_single_rate()
6955 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) in ath10k_mac_bitrate_mask_get_single_rate()
6968 (*nss - 1) << 4 | in ath10k_mac_bitrate_mask_get_single_rate()
6974 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) { in ath10k_mac_bitrate_mask_get_single_rate()
6975 if (hweight8(mask->control[band].ht_mcs[i]) == 1) { in ath10k_mac_bitrate_mask_get_single_rate()
6978 (*nss - 1) << 4 | in ath10k_mac_bitrate_mask_get_single_rate()
6979 (ffs(mask->control[band].ht_mcs[i]) - 1); in ath10k_mac_bitrate_mask_get_single_rate()
6986 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) { in ath10k_mac_bitrate_mask_get_single_rate()
6987 if (hweight16(mask->control[band].vht_mcs[i]) == 1) { in ath10k_mac_bitrate_mask_get_single_rate()
6990 (*nss - 1) << 4 | in ath10k_mac_bitrate_mask_get_single_rate()
6991 (ffs(mask->control[band].vht_mcs[i]) - 1); in ath10k_mac_bitrate_mask_get_single_rate()
6997 return -EINVAL; in ath10k_mac_bitrate_mask_get_single_rate()
7004 struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap; in ath10k_mac_validate_rate_mask()
7005 struct ieee80211_sta_vht_cap *vht_cap = &sta->deflink.vht_cap; in ath10k_mac_validate_rate_mask()
7007 if (nss > sta->deflink.rx_nss) { in ath10k_mac_validate_rate_mask()
7008 ath10k_warn(ar, "Invalid nss field, configured %u limit %u\n", in ath10k_mac_validate_rate_mask()
7009 nss, sta->deflink.rx_nss); in ath10k_mac_validate_rate_mask()
7010 return -EINVAL; in ath10k_mac_validate_rate_mask()
7014 if (!vht_cap->vht_supported) { in ath10k_mac_validate_rate_mask()
7016 sta->addr); in ath10k_mac_validate_rate_mask()
7017 return -EINVAL; in ath10k_mac_validate_rate_mask()
7020 if (!ht_cap->ht_supported || vht_cap->vht_supported) { in ath10k_mac_validate_rate_mask()
7022 sta->addr); in ath10k_mac_validate_rate_mask()
7023 return -EINVAL; in ath10k_mac_validate_rate_mask()
7026 if (ht_cap->ht_supported || vht_cap->vht_supported) in ath10k_mac_validate_rate_mask()
7027 return -EINVAL; in ath10k_mac_validate_rate_mask()
7047 return -EINVAL; in ath10k_mac_tid_bitrate_config()
7055 band = def.chan->band; in ath10k_mac_tid_bitrate_config()
7059 return -EINVAL; in ath10k_mac_tid_bitrate_config()
7073 return -EINVAL; in ath10k_mac_tid_bitrate_config()
7079 ar->wmi.svc_map))) in ath10k_mac_tid_bitrate_config()
7082 return -EOPNOTSUPP; in ath10k_mac_tid_bitrate_config()
7091 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_mac_set_tid_config()
7096 if (!sta->wme) in ath10k_mac_set_tid_config()
7097 return -EOPNOTSUPP; in ath10k_mac_set_tid_config()
7099 arsta = (struct ath10k_sta *)sta->drv_priv; in ath10k_mac_set_tid_config()
7102 if ((arsta->retry_long[arg->tid] > 0 || in ath10k_mac_set_tid_config()
7103 arsta->rate_code[arg->tid] > 0 || in ath10k_mac_set_tid_config()
7104 arsta->ampdu[arg->tid] == in ath10k_mac_set_tid_config()
7106 arg->ack_policy == WMI_PEER_TID_CONFIG_NOACK) { in ath10k_mac_set_tid_config()
7108 arg->ack_policy = 0; in ath10k_mac_set_tid_config()
7109 arg->aggr_control = 0; in ath10k_mac_set_tid_config()
7110 arg->rate_ctrl = 0; in ath10k_mac_set_tid_config()
7111 arg->rcode_flags = 0; in ath10k_mac_set_tid_config()
7116 if (arsta->noack[arg->tid] == WMI_PEER_TID_CONFIG_NOACK || in ath10k_mac_set_tid_config()
7117 arvif->noack[arg->tid] == WMI_PEER_TID_CONFIG_NOACK) { in ath10k_mac_set_tid_config()
7118 arg->aggr_control = 0; in ath10k_mac_set_tid_config()
7125 if (arsta->noack[arg->tid] == WMI_PEER_TID_CONFIG_NOACK || in ath10k_mac_set_tid_config()
7126 arvif->noack[arg->tid] == WMI_PEER_TID_CONFIG_NOACK) { in ath10k_mac_set_tid_config()
7127 arg->rate_ctrl = 0; in ath10k_mac_set_tid_config()
7128 arg->rcode_flags = 0; in ath10k_mac_set_tid_config()
7132 ether_addr_copy(arg->peer_macaddr.addr, sta->addr); in ath10k_mac_set_tid_config()
7140 arsta->noack[arg->tid] = arg->ack_policy; in ath10k_mac_set_tid_config()
7141 arg->ack_policy = 0; in ath10k_mac_set_tid_config()
7142 arg->aggr_control = 0; in ath10k_mac_set_tid_config()
7143 arg->rate_ctrl = 0; in ath10k_mac_set_tid_config()
7144 arg->rcode_flags = 0; in ath10k_mac_set_tid_config()
7148 arsta->retry_long[arg->tid] = arg->retry_count; in ath10k_mac_set_tid_config()
7149 arg->retry_count = 0; in ath10k_mac_set_tid_config()
7153 arsta->ampdu[arg->tid] = arg->aggr_control; in ath10k_mac_set_tid_config()
7154 arg->aggr_control = 0; in ath10k_mac_set_tid_config()
7159 arsta->rate_ctrl[arg->tid] = arg->rate_ctrl; in ath10k_mac_set_tid_config()
7160 arg->rate_ctrl = 0; in ath10k_mac_set_tid_config()
7161 arg->rcode_flags = 0; in ath10k_mac_set_tid_config()
7165 arsta->rtscts[arg->tid] = arg->rtscts_ctrl; in ath10k_mac_set_tid_config()
7166 arg->ext_tid_cfg_bitmap = 0; in ath10k_mac_set_tid_config()
7170 if ((arvif->retry_long[arg->tid] || in ath10k_mac_set_tid_config()
7171 arvif->rate_code[arg->tid] || in ath10k_mac_set_tid_config()
7172 arvif->ampdu[arg->tid] == in ath10k_mac_set_tid_config()
7174 arg->ack_policy == WMI_PEER_TID_CONFIG_NOACK) { in ath10k_mac_set_tid_config()
7177 arvif->noack[arg->tid] = arg->ack_policy; in ath10k_mac_set_tid_config()
7178 arvif->ampdu[arg->tid] = arg->aggr_control; in ath10k_mac_set_tid_config()
7179 arvif->rate_ctrl[arg->tid] = arg->rate_ctrl; in ath10k_mac_set_tid_config()
7184 if (arvif->noack[arg->tid] == WMI_PEER_TID_CONFIG_NOACK) in ath10k_mac_set_tid_config()
7187 arvif->retry_long[arg->tid] = arg->retry_count; in ath10k_mac_set_tid_config()
7191 if (arvif->noack[arg->tid] == WMI_PEER_TID_CONFIG_NOACK) in ath10k_mac_set_tid_config()
7194 arvif->ampdu[arg->tid] = arg->aggr_control; in ath10k_mac_set_tid_config()
7199 if (arvif->noack[arg->tid] == WMI_PEER_TID_CONFIG_NOACK) { in ath10k_mac_set_tid_config()
7203 arvif->rate_ctrl[arg->tid] = arg->rate_ctrl; in ath10k_mac_set_tid_config()
7204 arvif->rate_code[arg->tid] = arg->rcode_flags; in ath10k_mac_set_tid_config()
7209 arvif->rtscts[arg->tid] = arg->rtscts_ctrl; in ath10k_mac_set_tid_config()
7210 arg->ext_tid_cfg_bitmap = 0; in ath10k_mac_set_tid_config()
7214 arvif->tid_conf_changed[arg->tid] |= changed; in ath10k_mac_set_tid_config()
7227 u32 changed = tid_conf->mask; in ath10k_mac_parse_tid_config()
7231 return -EINVAL; in ath10k_mac_parse_tid_config()
7234 if (!(tid_conf->tids & BIT(i))) { in ath10k_mac_parse_tid_config()
7239 arg->tid = i; in ath10k_mac_parse_tid_config()
7242 if (tid_conf->noack == NL80211_TID_CONFIG_ENABLE) { in ath10k_mac_parse_tid_config()
7243 arg->ack_policy = WMI_PEER_TID_CONFIG_NOACK; in ath10k_mac_parse_tid_config()
7244 arg->rate_ctrl = in ath10k_mac_parse_tid_config()
7246 arg->aggr_control = in ath10k_mac_parse_tid_config()
7249 arg->ack_policy = in ath10k_mac_parse_tid_config()
7251 arg->rate_ctrl = in ath10k_mac_parse_tid_config()
7253 arg->aggr_control = in ath10k_mac_parse_tid_config()
7259 arg->retry_count = tid_conf->retry_long; in ath10k_mac_parse_tid_config()
7262 if (tid_conf->noack == NL80211_TID_CONFIG_ENABLE) in ath10k_mac_parse_tid_config()
7263 arg->aggr_control = WMI_TID_CONFIG_AGGR_CONTROL_ENABLE; in ath10k_mac_parse_tid_config()
7265 arg->aggr_control = WMI_TID_CONFIG_AGGR_CONTROL_DISABLE; in ath10k_mac_parse_tid_config()
7271 &arg->rcode_flags, in ath10k_mac_parse_tid_config()
7272 &arg->rate_ctrl, in ath10k_mac_parse_tid_config()
7273 tid_conf->txrate_type, in ath10k_mac_parse_tid_config()
7274 &tid_conf->txrate_mask); in ath10k_mac_parse_tid_config()
7278 arg->rcode_flags = 0; in ath10k_mac_parse_tid_config()
7279 arg->rate_ctrl = 0; in ath10k_mac_parse_tid_config()
7284 if (tid_conf->rtscts) in ath10k_mac_parse_tid_config()
7285 arg->rtscts_ctrl = tid_conf->rtscts; in ath10k_mac_parse_tid_config()
7287 arg->ext_tid_cfg_bitmap = WMI_EXT_TID_RTS_CTS_CONFIG; in ath10k_mac_parse_tid_config()
7304 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv; in ath10k_mac_reset_tid_config()
7308 arg.vdev_id = arvif->vdev_id; in ath10k_mac_reset_tid_config()
7323 ether_addr_copy(arg.peer_macaddr.addr, sta->addr); in ath10k_mac_reset_tid_config()
7329 if (!arvif->tids_rst) { in ath10k_mac_reset_tid_config()
7330 arsta->retry_long[i] = -1; in ath10k_mac_reset_tid_config()
7331 arsta->noack[i] = -1; in ath10k_mac_reset_tid_config()
7332 arsta->ampdu[i] = -1; in ath10k_mac_reset_tid_config()
7333 arsta->rate_code[i] = -1; in ath10k_mac_reset_tid_config()
7334 arsta->rate_ctrl[i] = 0; in ath10k_mac_reset_tid_config()
7335 arsta->rtscts[i] = -1; in ath10k_mac_reset_tid_config()
7337 arvif->retry_long[i] = 0; in ath10k_mac_reset_tid_config()
7338 arvif->noack[i] = 0; in ath10k_mac_reset_tid_config()
7339 arvif->ampdu[i] = 0; in ath10k_mac_reset_tid_config()
7340 arvif->rate_code[i] = 0; in ath10k_mac_reset_tid_config()
7341 arvif->rate_ctrl[i] = 0; in ath10k_mac_reset_tid_config()
7342 arvif->rtscts[i] = 0; in ath10k_mac_reset_tid_config()
7365 arvif = arsta->arvif; in ath10k_sta_tid_cfg_wk()
7366 ar = arvif->ar; in ath10k_sta_tid_cfg_wk()
7368 mutex_lock(&ar->conf_mutex); in ath10k_sta_tid_cfg_wk()
7370 if (arvif->tids_rst) { in ath10k_sta_tid_cfg_wk()
7372 arvif->tids_rst); in ath10k_sta_tid_cfg_wk()
7376 ether_addr_copy(arg.peer_macaddr.addr, sta->addr); in ath10k_sta_tid_cfg_wk()
7380 changed = arvif->tid_conf_changed[i]; in ath10k_sta_tid_cfg_wk()
7383 if (arsta->noack[i] != -1) { in ath10k_sta_tid_cfg_wk()
7387 arg.ack_policy = arvif->noack[i]; in ath10k_sta_tid_cfg_wk()
7388 arg.aggr_control = arvif->ampdu[i]; in ath10k_sta_tid_cfg_wk()
7389 arg.rate_ctrl = arvif->rate_ctrl[i]; in ath10k_sta_tid_cfg_wk()
7394 if (arsta->retry_long[i] != -1 || in ath10k_sta_tid_cfg_wk()
7395 arsta->noack[i] == WMI_PEER_TID_CONFIG_NOACK || in ath10k_sta_tid_cfg_wk()
7396 arvif->noack[i] == WMI_PEER_TID_CONFIG_NOACK) { in ath10k_sta_tid_cfg_wk()
7399 arg.retry_count = arvif->retry_long[i]; in ath10k_sta_tid_cfg_wk()
7405 if (arsta->ampdu[i] != -1 || in ath10k_sta_tid_cfg_wk()
7406 arsta->noack[i] == WMI_PEER_TID_CONFIG_NOACK || in ath10k_sta_tid_cfg_wk()
7407 arvif->noack[i] == WMI_PEER_TID_CONFIG_NOACK) { in ath10k_sta_tid_cfg_wk()
7410 arg.aggr_control = arvif->ampdu[i]; in ath10k_sta_tid_cfg_wk()
7417 nss = ATH10K_HW_NSS(arvif->rate_code[i]); in ath10k_sta_tid_cfg_wk()
7419 arvif->rate_code[i], in ath10k_sta_tid_cfg_wk()
7422 arvif->rate_ctrl[i] > WMI_TID_CONFIG_RATE_CONTROL_AUTO) { in ath10k_sta_tid_cfg_wk()
7427 if (arsta->rate_ctrl[i] > in ath10k_sta_tid_cfg_wk()
7429 arsta->noack[i] == WMI_PEER_TID_CONFIG_NOACK || in ath10k_sta_tid_cfg_wk()
7430 arvif->noack[i] == WMI_PEER_TID_CONFIG_NOACK) { in ath10k_sta_tid_cfg_wk()
7434 arg.rate_ctrl = arvif->rate_ctrl[i]; in ath10k_sta_tid_cfg_wk()
7435 arg.rcode_flags = arvif->rate_code[i]; in ath10k_sta_tid_cfg_wk()
7441 if (arsta->rtscts[i]) { in ath10k_sta_tid_cfg_wk()
7445 arg.rtscts_ctrl = arvif->rtscts[i] - 1; in ath10k_sta_tid_cfg_wk()
7458 sta->addr, ret); in ath10k_sta_tid_cfg_wk()
7469 mutex_unlock(&ar->conf_mutex); in ath10k_sta_tid_cfg_wk()
7475 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv; in ath10k_mac_vif_stations_tid_conf()
7477 struct ieee80211_vif *sta_vif = arsta->arvif->vif; in ath10k_mac_vif_stations_tid_conf()
7479 if (sta_vif != iter_data->curr_vif || !sta->wme) in ath10k_mac_vif_stations_tid_conf()
7482 ieee80211_queue_work(iter_data->ar->hw, &arsta->tid_config_wk); in ath10k_mac_vif_stations_tid_conf()
7491 struct ath10k *ar = hw->priv; in ath10k_sta_state()
7492 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_sta_state()
7493 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv; in ath10k_sta_state()
7501 arsta->arvif = arvif; in ath10k_sta_state()
7502 arsta->peer_ps_state = WMI_PEER_PS_STATE_DISABLED; in ath10k_sta_state()
7503 INIT_WORK(&arsta->update_wk, ath10k_sta_rc_update_wk); in ath10k_sta_state()
7504 INIT_WORK(&arsta->tid_config_wk, ath10k_sta_tid_cfg_wk); in ath10k_sta_state()
7506 for (i = 0; i < ARRAY_SIZE(sta->txq); i++) in ath10k_sta_state()
7507 ath10k_mac_txq_init(sta->txq[i]); in ath10k_sta_state()
7513 cancel_work_sync(&arsta->update_wk); in ath10k_sta_state()
7514 cancel_work_sync(&arsta->tid_config_wk); in ath10k_sta_state()
7517 mutex_lock(&ar->conf_mutex); in ath10k_sta_state()
7529 arvif->vdev_id, sta->addr, in ath10k_sta_state()
7530 ar->num_stations + 1, ar->max_num_stations, in ath10k_sta_state()
7531 ar->num_peers + 1, ar->max_num_peers); in ath10k_sta_state()
7535 if (sta->tdls) { in ath10k_sta_state()
7536 if (num_tdls_stations >= ar->max_num_tdls_vdevs) { in ath10k_sta_state()
7538 arvif->vdev_id, in ath10k_sta_state()
7539 ar->max_num_tdls_vdevs); in ath10k_sta_state()
7540 ret = -ELNRNG; in ath10k_sta_state()
7549 ar->max_num_stations); in ath10k_sta_state()
7554 arsta->tx_stats = kzalloc(sizeof(*arsta->tx_stats), in ath10k_sta_state()
7556 if (!arsta->tx_stats) { in ath10k_sta_state()
7558 ret = -ENOMEM; in ath10k_sta_state()
7563 ret = ath10k_peer_create(ar, vif, sta, arvif->vdev_id, in ath10k_sta_state()
7564 sta->addr, peer_type); in ath10k_sta_state()
7567 sta->addr, arvif->vdev_id, ret); in ath10k_sta_state()
7569 kfree(arsta->tx_stats); in ath10k_sta_state()
7573 spin_lock_bh(&ar->data_lock); in ath10k_sta_state()
7575 peer = ath10k_peer_find(ar, arvif->vdev_id, sta->addr); in ath10k_sta_state()
7578 vif->addr, arvif->vdev_id); in ath10k_sta_state()
7579 spin_unlock_bh(&ar->data_lock); in ath10k_sta_state()
7580 ath10k_peer_delete(ar, arvif->vdev_id, sta->addr); in ath10k_sta_state()
7582 kfree(arsta->tx_stats); in ath10k_sta_state()
7583 ret = -ENOENT; in ath10k_sta_state()
7587 arsta->peer_id = find_first_bit(peer->peer_ids, in ath10k_sta_state()
7590 spin_unlock_bh(&ar->data_lock); in ath10k_sta_state()
7592 if (!sta->tdls) in ath10k_sta_state()
7595 ret = ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id, in ath10k_sta_state()
7599 arvif->vdev_id, ret); in ath10k_sta_state()
7600 ath10k_peer_delete(ar, arvif->vdev_id, in ath10k_sta_state()
7601 sta->addr); in ath10k_sta_state()
7603 kfree(arsta->tx_stats); in ath10k_sta_state()
7607 ret = ath10k_mac_tdls_peer_update(ar, arvif->vdev_id, sta, in ath10k_sta_state()
7612 sta->addr, arvif->vdev_id, ret); in ath10k_sta_state()
7613 ath10k_peer_delete(ar, arvif->vdev_id, sta->addr); in ath10k_sta_state()
7615 kfree(arsta->tx_stats); in ath10k_sta_state()
7619 ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id, in ath10k_sta_state()
7629 arvif->vdev_id, sta->addr, sta); in ath10k_sta_state()
7631 if (sta->tdls) { in ath10k_sta_state()
7632 ret = ath10k_mac_tdls_peer_update(ar, arvif->vdev_id, in ath10k_sta_state()
7637 sta->addr, in ath10k_sta_state()
7641 ret = ath10k_peer_delete(ar, arvif->vdev_id, sta->addr); in ath10k_sta_state()
7644 sta->addr, arvif->vdev_id, ret); in ath10k_sta_state()
7648 spin_lock_bh(&ar->data_lock); in ath10k_sta_state()
7649 for (i = 0; i < ARRAY_SIZE(ar->peer_map); i++) { in ath10k_sta_state()
7650 peer = ar->peer_map[i]; in ath10k_sta_state()
7654 if (peer->sta == sta) { in ath10k_sta_state()
7656 sta->addr, peer, i, arvif->vdev_id); in ath10k_sta_state()
7657 peer->sta = NULL; in ath10k_sta_state()
7665 spin_unlock_bh(&ar->data_lock); in ath10k_sta_state()
7668 kfree(arsta->tx_stats); in ath10k_sta_state()
7669 arsta->tx_stats = NULL; in ath10k_sta_state()
7672 for (i = 0; i < ARRAY_SIZE(sta->txq); i++) in ath10k_sta_state()
7673 ath10k_mac_txq_unref(ar, sta->txq[i]); in ath10k_sta_state()
7675 if (!sta->tdls) in ath10k_sta_state()
7682 ret = ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id, in ath10k_sta_state()
7686 arvif->vdev_id, ret); in ath10k_sta_state()
7690 (vif->type == NL80211_IFTYPE_AP || in ath10k_sta_state()
7691 vif->type == NL80211_IFTYPE_MESH_POINT || in ath10k_sta_state()
7692 vif->type == NL80211_IFTYPE_ADHOC)) { in ath10k_sta_state()
7697 sta->addr); in ath10k_sta_state()
7702 sta->addr, arvif->vdev_id, ret); in ath10k_sta_state()
7705 sta->tdls) { in ath10k_sta_state()
7710 sta->addr); in ath10k_sta_state()
7715 sta->addr, arvif->vdev_id, ret); in ath10k_sta_state()
7719 ret = ath10k_mac_tdls_peer_update(ar, arvif->vdev_id, sta, in ath10k_sta_state()
7723 sta->addr, arvif->vdev_id, ret); in ath10k_sta_state()
7726 (vif->type == NL80211_IFTYPE_AP || in ath10k_sta_state()
7727 vif->type == NL80211_IFTYPE_MESH_POINT || in ath10k_sta_state()
7728 vif->type == NL80211_IFTYPE_ADHOC)) { in ath10k_sta_state()
7733 sta->addr); in ath10k_sta_state()
7738 sta->addr, arvif->vdev_id, ret); in ath10k_sta_state()
7741 mutex_unlock(&ar->conf_mutex); in ath10k_sta_state()
7748 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_conf_tx_uapsd()
7754 lockdep_assert_held(&ar->conf_mutex); in ath10k_conf_tx_uapsd()
7756 if (arvif->vdev_type != WMI_VDEV_TYPE_STA) in ath10k_conf_tx_uapsd()
7787 arvif->u.sta.uapsd |= value; in ath10k_conf_tx_uapsd()
7789 arvif->u.sta.uapsd &= ~value; in ath10k_conf_tx_uapsd()
7791 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath10k_conf_tx_uapsd()
7793 arvif->u.sta.uapsd); in ath10k_conf_tx_uapsd()
7799 if (arvif->u.sta.uapsd) in ath10k_conf_tx_uapsd()
7804 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath10k_conf_tx_uapsd()
7813 arvif->vdev_id, ret); in ath10k_conf_tx_uapsd()
7820 arvif->vdev_id, ret); in ath10k_conf_tx_uapsd()
7824 if (test_bit(WMI_SERVICE_STA_UAPSD_BASIC_AUTO_TRIG, ar->wmi.svc_map) || in ath10k_conf_tx_uapsd()
7825 test_bit(WMI_SERVICE_STA_UAPSD_VAR_AUTO_TRIG, ar->wmi.svc_map)) { in ath10k_conf_tx_uapsd()
7827 * trigger frame. The following effectively disables u-UAPSD in ath10k_conf_tx_uapsd()
7838 ret = ath10k_wmi_vdev_sta_uapsd(ar, arvif->vdev_id, in ath10k_conf_tx_uapsd()
7839 arvif->bssid, &arg, 1); in ath10k_conf_tx_uapsd()
7856 struct ath10k *ar = hw->priv; in ath10k_conf_tx()
7857 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_conf_tx()
7861 mutex_lock(&ar->conf_mutex); in ath10k_conf_tx()
7865 p = &arvif->wmm_params.ac_vo; in ath10k_conf_tx()
7868 p = &arvif->wmm_params.ac_vi; in ath10k_conf_tx()
7871 p = &arvif->wmm_params.ac_be; in ath10k_conf_tx()
7874 p = &arvif->wmm_params.ac_bk; in ath10k_conf_tx()
7879 ret = -EINVAL; in ath10k_conf_tx()
7883 p->cwmin = params->cw_min; in ath10k_conf_tx()
7884 p->cwmax = params->cw_max; in ath10k_conf_tx()
7885 p->aifs = params->aifs; in ath10k_conf_tx()
7892 p->txop = params->txop * 32; in ath10k_conf_tx()
7894 if (ar->wmi.ops->gen_vdev_wmm_conf) { in ath10k_conf_tx()
7895 ret = ath10k_wmi_vdev_wmm_conf(ar, arvif->vdev_id, in ath10k_conf_tx()
7896 &arvif->wmm_params); in ath10k_conf_tx()
7899 arvif->vdev_id, ret); in ath10k_conf_tx()
7903 /* This won't work well with multi-interface cases but it's in ath10k_conf_tx()
7906 ret = ath10k_wmi_pdev_set_wmm_params(ar, &arvif->wmm_params); in ath10k_conf_tx()
7913 ret = ath10k_conf_tx_uapsd(ar, vif, ac, params->uapsd); in ath10k_conf_tx()
7918 mutex_unlock(&ar->conf_mutex); in ath10k_conf_tx()
7928 struct ath10k *ar = hw->priv; in ath10k_remain_on_channel()
7929 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_remain_on_channel()
7934 mutex_lock(&ar->conf_mutex); in ath10k_remain_on_channel()
7937 ret = -EBUSY; in ath10k_remain_on_channel()
7941 spin_lock_bh(&ar->data_lock); in ath10k_remain_on_channel()
7942 switch (ar->scan.state) { in ath10k_remain_on_channel()
7944 reinit_completion(&ar->scan.started); in ath10k_remain_on_channel()
7945 reinit_completion(&ar->scan.completed); in ath10k_remain_on_channel()
7946 reinit_completion(&ar->scan.on_channel); in ath10k_remain_on_channel()
7947 ar->scan.state = ATH10K_SCAN_STARTING; in ath10k_remain_on_channel()
7948 ar->scan.is_roc = true; in ath10k_remain_on_channel()
7949 ar->scan.vdev_id = arvif->vdev_id; in ath10k_remain_on_channel()
7950 ar->scan.roc_freq = chan->center_freq; in ath10k_remain_on_channel()
7951 ar->scan.roc_notify = true; in ath10k_remain_on_channel()
7957 ret = -EBUSY; in ath10k_remain_on_channel()
7960 spin_unlock_bh(&ar->data_lock); in ath10k_remain_on_channel()
7965 scan_time_msec = ar->hw->wiphy->max_remain_on_channel_duration * 2; in ath10k_remain_on_channel()
7969 ret = -ENOMEM; in ath10k_remain_on_channel()
7974 arg->vdev_id = arvif->vdev_id; in ath10k_remain_on_channel()
7975 arg->scan_id = ATH10K_SCAN_ID; in ath10k_remain_on_channel()
7976 arg->n_channels = 1; in ath10k_remain_on_channel()
7977 arg->channels[0] = chan->center_freq; in ath10k_remain_on_channel()
7978 arg->dwell_time_active = scan_time_msec; in ath10k_remain_on_channel()
7979 arg->dwell_time_passive = scan_time_msec; in ath10k_remain_on_channel()
7980 arg->max_scan_time = scan_time_msec; in ath10k_remain_on_channel()
7981 arg->scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE; in ath10k_remain_on_channel()
7982 arg->scan_ctrl_flags |= WMI_SCAN_FILTER_PROBE_REQ; in ath10k_remain_on_channel()
7983 arg->burst_duration_ms = duration; in ath10k_remain_on_channel()
7988 spin_lock_bh(&ar->data_lock); in ath10k_remain_on_channel()
7989 ar->scan.state = ATH10K_SCAN_IDLE; in ath10k_remain_on_channel()
7990 spin_unlock_bh(&ar->data_lock); in ath10k_remain_on_channel()
7994 ret = wait_for_completion_timeout(&ar->scan.on_channel, 3 * HZ); in ath10k_remain_on_channel()
8002 ret = -ETIMEDOUT; in ath10k_remain_on_channel()
8006 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout, in ath10k_remain_on_channel()
8013 mutex_unlock(&ar->conf_mutex); in ath10k_remain_on_channel()
8020 struct ath10k *ar = hw->priv; in ath10k_cancel_remain_on_channel()
8022 mutex_lock(&ar->conf_mutex); in ath10k_cancel_remain_on_channel()
8024 spin_lock_bh(&ar->data_lock); in ath10k_cancel_remain_on_channel()
8025 ar->scan.roc_notify = false; in ath10k_cancel_remain_on_channel()
8026 spin_unlock_bh(&ar->data_lock); in ath10k_cancel_remain_on_channel()
8030 mutex_unlock(&ar->conf_mutex); in ath10k_cancel_remain_on_channel()
8032 cancel_delayed_work_sync(&ar->scan.timeout); in ath10k_cancel_remain_on_channel()
8038 * Both RTS and Fragmentation threshold are interface-specific
8039 * in ath10k, but device-specific in mac80211.
8045 struct ath10k *ar = hw->priv; in ath10k_set_rts_threshold()
8049 mutex_lock(&ar->conf_mutex); in ath10k_set_rts_threshold()
8050 list_for_each_entry(arvif, &ar->arvifs, list) { in ath10k_set_rts_threshold()
8052 arvif->vdev_id, value); in ath10k_set_rts_threshold()
8057 arvif->vdev_id, ret); in ath10k_set_rts_threshold()
8061 mutex_unlock(&ar->conf_mutex); in ath10k_set_rts_threshold()
8079 return -EOPNOTSUPP; in ath10k_mac_op_set_frag_threshold()
8091 if (ar->state == ATH10K_STATE_WEDGED) in ath10k_mac_wait_tx_complete()
8094 time_left = wait_event_timeout(ar->htt.empty_tx_wq, ({ in ath10k_mac_wait_tx_complete()
8097 spin_lock_bh(&ar->htt.tx_lock); in ath10k_mac_wait_tx_complete()
8098 empty = (ar->htt.num_pending_tx == 0); in ath10k_mac_wait_tx_complete()
8099 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_mac_wait_tx_complete()
8101 skip = (ar->state == ATH10K_STATE_WEDGED) || in ath10k_mac_wait_tx_complete()
8103 &ar->dev_flags); in ath10k_mac_wait_tx_complete()
8109 ath10k_warn(ar, "failed to flush transmit queue (skip %i ar-state %i): %ld\n", in ath10k_mac_wait_tx_complete()
8110 skip, ar->state, time_left); in ath10k_mac_wait_tx_complete()
8116 struct ath10k *ar = hw->priv; in ath10k_flush()
8121 if (vif && vif->type == NL80211_IFTYPE_STATION) { in ath10k_flush()
8123 list_for_each_entry(arvif, &ar->arvifs, list) { in ath10k_flush()
8124 if (arvif->vdev_type == WMI_VDEV_TYPE_STA) in ath10k_flush()
8125 ath10k_wmi_peer_flush(ar, arvif->vdev_id, in ath10k_flush()
8126 arvif->bssid, bitmap); in ath10k_flush()
8128 ath10k_htt_flush_tx(&ar->htt); in ath10k_flush()
8133 mutex_lock(&ar->conf_mutex); in ath10k_flush()
8135 mutex_unlock(&ar->conf_mutex); in ath10k_flush()
8150 struct ath10k *ar = hw->priv; in ath10k_reconfig_complete()
8156 mutex_lock(&ar->conf_mutex); in ath10k_reconfig_complete()
8161 if (ar->state == ATH10K_STATE_RESTARTED) { in ath10k_reconfig_complete()
8163 ar->state = ATH10K_STATE_ON; in ath10k_reconfig_complete()
8164 ieee80211_wake_queues(ar->hw); in ath10k_reconfig_complete()
8167 complete(&ar->driver_recovery); in ath10k_reconfig_complete()
8168 atomic_set(&ar->fail_cont_count, 0); in ath10k_reconfig_complete()
8169 atomic_set(&ar->pending_recovery, 0); in ath10k_reconfig_complete()
8171 if (ar->hw_params.hw_restart_disconnect) { in ath10k_reconfig_complete()
8172 list_for_each_entry(arvif, &ar->arvifs, list) { in ath10k_reconfig_complete()
8173 if (arvif->is_up && arvif->vdev_type == WMI_VDEV_TYPE_STA) in ath10k_reconfig_complete()
8174 ieee80211_hw_restart_disconnect(arvif->vif); in ath10k_reconfig_complete()
8179 mutex_unlock(&ar->conf_mutex); in ath10k_reconfig_complete()
8189 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_update_bss_chan_survey()
8191 if (!test_bit(WMI_SERVICE_BSS_CHANNEL_INFO_64, ar->wmi.svc_map) || in ath10k_mac_update_bss_chan_survey()
8192 (ar->rx_channel != channel)) in ath10k_mac_update_bss_chan_survey()
8195 if (ar->scan.state != ATH10K_SCAN_IDLE) { in ath10k_mac_update_bss_chan_survey()
8200 reinit_completion(&ar->bss_survey_done); in ath10k_mac_update_bss_chan_survey()
8208 ret = wait_for_completion_timeout(&ar->bss_survey_done, 3 * HZ); in ath10k_mac_update_bss_chan_survey()
8218 struct ath10k *ar = hw->priv; in ath10k_get_survey()
8220 struct survey_info *ar_survey = &ar->survey[idx]; in ath10k_get_survey()
8223 mutex_lock(&ar->conf_mutex); in ath10k_get_survey()
8225 sband = hw->wiphy->bands[NL80211_BAND_2GHZ]; in ath10k_get_survey()
8226 if (sband && idx >= sband->n_channels) { in ath10k_get_survey()
8227 idx -= sband->n_channels; in ath10k_get_survey()
8232 sband = hw->wiphy->bands[NL80211_BAND_5GHZ]; in ath10k_get_survey()
8234 if (!sband || idx >= sband->n_channels) { in ath10k_get_survey()
8235 ret = -ENOENT; in ath10k_get_survey()
8239 ath10k_mac_update_bss_chan_survey(ar, &sband->channels[idx]); in ath10k_get_survey()
8241 spin_lock_bh(&ar->data_lock); in ath10k_get_survey()
8243 spin_unlock_bh(&ar->data_lock); in ath10k_get_survey()
8245 survey->channel = &sband->channels[idx]; in ath10k_get_survey()
8247 if (ar->rx_channel == survey->channel) in ath10k_get_survey()
8248 survey->filled |= SURVEY_INFO_IN_USE; in ath10k_get_survey()
8251 mutex_unlock(&ar->conf_mutex); in ath10k_get_survey()
8261 struct ieee80211_supported_band *sband = &ar->mac.sbands[band]; in ath10k_mac_bitrate_mask_get_single_nss()
8262 u16 vht_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map); in ath10k_mac_bitrate_mask_get_single_nss()
8267 if (mask->control[band].legacy) in ath10k_mac_bitrate_mask_get_single_nss()
8270 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) { in ath10k_mac_bitrate_mask_get_single_nss()
8271 if (mask->control[band].ht_mcs[i] == 0) in ath10k_mac_bitrate_mask_get_single_nss()
8273 else if (mask->control[band].ht_mcs[i] == in ath10k_mac_bitrate_mask_get_single_nss()
8274 sband->ht_cap.mcs.rx_mask[i]) in ath10k_mac_bitrate_mask_get_single_nss()
8280 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) { in ath10k_mac_bitrate_mask_get_single_nss()
8281 if (mask->control[band].vht_mcs[i] == 0) in ath10k_mac_bitrate_mask_get_single_nss()
8283 else if (mask->control[band].vht_mcs[i] == in ath10k_mac_bitrate_mask_get_single_nss()
8296 if (BIT(fls(ht_nss_mask)) - 1 != ht_nss_mask) in ath10k_mac_bitrate_mask_get_single_nss()
8307 struct ath10k *ar = arvif->ar; in ath10k_mac_set_fixed_rate_params()
8311 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_set_fixed_rate_params()
8314 arvif->vdev_id, rate, nss, sgi); in ath10k_mac_set_fixed_rate_params()
8316 vdev_param = ar->wmi.vdev_param->fixed_rate; in ath10k_mac_set_fixed_rate_params()
8317 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, rate); in ath10k_mac_set_fixed_rate_params()
8324 vdev_param = ar->wmi.vdev_param->nss; in ath10k_mac_set_fixed_rate_params()
8325 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, nss); in ath10k_mac_set_fixed_rate_params()
8331 vdev_param = ar->wmi.vdev_param->sgi; in ath10k_mac_set_fixed_rate_params()
8332 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, sgi); in ath10k_mac_set_fixed_rate_params()
8338 vdev_param = ar->wmi.vdev_param->ldpc; in ath10k_mac_set_fixed_rate_params()
8339 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, ldpc); in ath10k_mac_set_fixed_rate_params()
8359 * ranges can be used: none, 0-7, 0-8 and 0-9. in ath10k_mac_can_set_bitrate_mask()
8362 vht_mcs = mask->control[band].vht_mcs[i]; in ath10k_mac_can_set_bitrate_mask()
8366 case BIT(8) - 1: in ath10k_mac_can_set_bitrate_mask()
8367 case BIT(9) - 1: in ath10k_mac_can_set_bitrate_mask()
8368 case BIT(10) - 1: in ath10k_mac_can_set_bitrate_mask()
8372 ath10k_warn(ar, "refusing bitrate mask with missing 0-7 VHT MCS rates\n"); in ath10k_mac_can_set_bitrate_mask()
8385 u8 rate = arvif->vht_pfr; in ath10k_mac_set_vht_bitrate_mask_fixup()
8388 if (!sta->deflink.vht_cap.vht_supported || arvif->vht_num_rates != 1) in ath10k_mac_set_vht_bitrate_mask_fixup()
8391 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr, in ath10k_mac_set_vht_bitrate_mask_fixup()
8395 sta->addr, err); in ath10k_mac_set_vht_bitrate_mask_fixup()
8404 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv; in ath10k_mac_set_bitrate_mask_iter()
8405 struct ath10k *ar = arvif->ar; in ath10k_mac_set_bitrate_mask_iter()
8407 if (arsta->arvif != arvif) in ath10k_mac_set_bitrate_mask_iter()
8413 spin_lock_bh(&ar->data_lock); in ath10k_mac_set_bitrate_mask_iter()
8414 arsta->changed |= IEEE80211_RC_SUPP_RATES_CHANGED; in ath10k_mac_set_bitrate_mask_iter()
8415 spin_unlock_bh(&ar->data_lock); in ath10k_mac_set_bitrate_mask_iter()
8417 ieee80211_queue_work(ar->hw, &arsta->update_wk); in ath10k_mac_set_bitrate_mask_iter()
8424 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv; in ath10k_mac_clr_bitrate_mask_iter()
8425 struct ath10k *ar = arvif->ar; in ath10k_mac_clr_bitrate_mask_iter()
8429 if (arsta->arvif != arvif || !sta->deflink.vht_cap.vht_supported) in ath10k_mac_clr_bitrate_mask_iter()
8432 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr, in ath10k_mac_clr_bitrate_mask_iter()
8437 sta->addr, err); in ath10k_mac_clr_bitrate_mask_iter()
8444 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_mac_op_set_bitrate_mask()
8446 struct ath10k *ar = arvif->ar; in ath10k_mac_op_set_bitrate_mask()
8461 return -EPERM; in ath10k_mac_op_set_bitrate_mask()
8463 band = def.chan->band; in ath10k_mac_op_set_bitrate_mask()
8464 ht_mcs_mask = mask->control[band].ht_mcs; in ath10k_mac_op_set_bitrate_mask()
8465 vht_mcs_mask = mask->control[band].vht_mcs; in ath10k_mac_op_set_bitrate_mask()
8466 ldpc = !!(ar->ht_cap_info & WMI_HT_CAP_LDPC); in ath10k_mac_op_set_bitrate_mask()
8468 sgi = mask->control[band].gi; in ath10k_mac_op_set_bitrate_mask()
8470 return -EINVAL; in ath10k_mac_op_set_bitrate_mask()
8473 ar->normal_mode_fw.fw_file.fw_features); in ath10k_mac_op_set_bitrate_mask()
8475 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_set_bitrate_mask()
8476 ieee80211_iterate_stations_atomic(ar->hw, in ath10k_mac_op_set_bitrate_mask()
8479 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_set_bitrate_mask()
8489 arvif->vdev_id, ret); in ath10k_mac_op_set_bitrate_mask()
8498 nss = min(ar->num_rf_chains, in ath10k_mac_op_set_bitrate_mask()
8507 return -EINVAL; in ath10k_mac_op_set_bitrate_mask()
8522 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_set_bitrate_mask()
8525 arvif->bitrate_mask = *mask; in ath10k_mac_op_set_bitrate_mask()
8526 arvif->vht_num_rates = vht_num_rates; in ath10k_mac_op_set_bitrate_mask()
8527 arvif->vht_pfr = vht_pfr; in ath10k_mac_op_set_bitrate_mask()
8528 ieee80211_iterate_stations_atomic(ar->hw, in ath10k_mac_op_set_bitrate_mask()
8532 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_set_bitrate_mask()
8535 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_set_bitrate_mask()
8540 arvif->vdev_id, ret); in ath10k_mac_op_set_bitrate_mask()
8545 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_set_bitrate_mask()
8555 struct ieee80211_sta *sta = link_sta->sta; in ath10k_sta_rc_update()
8556 struct ath10k *ar = hw->priv; in ath10k_sta_rc_update()
8557 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv; in ath10k_sta_rc_update()
8558 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_sta_rc_update()
8562 spin_lock_bh(&ar->data_lock); in ath10k_sta_rc_update()
8564 peer = ath10k_peer_find(ar, arvif->vdev_id, sta->addr); in ath10k_sta_rc_update()
8566 spin_unlock_bh(&ar->data_lock); in ath10k_sta_rc_update()
8568 sta->addr, arvif->vdev_id); in ath10k_sta_rc_update()
8574 sta->addr, changed, sta->deflink.bandwidth, in ath10k_sta_rc_update()
8575 sta->deflink.rx_nss, in ath10k_sta_rc_update()
8576 sta->deflink.smps_mode); in ath10k_sta_rc_update()
8581 switch (sta->deflink.bandwidth) { in ath10k_sta_rc_update()
8596 sta->deflink.bandwidth, sta->addr); in ath10k_sta_rc_update()
8601 arsta->bw = bw; in ath10k_sta_rc_update()
8605 arsta->nss = sta->deflink.rx_nss; in ath10k_sta_rc_update()
8610 switch (sta->deflink.smps_mode) { in ath10k_sta_rc_update()
8623 sta->deflink.smps_mode, sta->addr); in ath10k_sta_rc_update()
8628 arsta->smps = smps; in ath10k_sta_rc_update()
8631 arsta->changed |= changed; in ath10k_sta_rc_update()
8633 spin_unlock_bh(&ar->data_lock); in ath10k_sta_rc_update()
8635 ieee80211_queue_work(hw, &arsta->update_wk); in ath10k_sta_rc_update()
8641 struct ath10k *ar = hw->priv; in ath10k_offset_tsf()
8642 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_offset_tsf()
8647 vdev_param = ar->wmi.vdev_param->dec_tsf; in ath10k_offset_tsf()
8648 offset = -tsf_offset; in ath10k_offset_tsf()
8650 vdev_param = ar->wmi.vdev_param->inc_tsf; in ath10k_offset_tsf()
8654 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, in ath10k_offset_tsf()
8657 if (ret && ret != -EOPNOTSUPP) in ath10k_offset_tsf()
8666 struct ath10k *ar = hw->priv; in ath10k_ampdu_action()
8667 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_ampdu_action()
8668 struct ieee80211_sta *sta = params->sta; in ath10k_ampdu_action()
8669 enum ieee80211_ampdu_mlme_action action = params->action; in ath10k_ampdu_action()
8670 u16 tid = params->tid; in ath10k_ampdu_action()
8673 arvif->vdev_id, sta->addr, tid, action); in ath10k_ampdu_action()
8690 return -EOPNOTSUPP; in ath10k_ampdu_action()
8693 return -EINVAL; in ath10k_ampdu_action()
8704 /* Both locks are required because ar->rx_channel is modified. This in ath10k_mac_update_rx_channel()
8707 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_update_rx_channel()
8708 lockdep_assert_held(&ar->data_lock); in ath10k_mac_update_rx_channel()
8714 * on a linked list now. Doing a lookup peer -> vif -> chanctx for each in ath10k_mac_update_rx_channel()
8715 * ppdu on Rx may reduce performance on low-end systems. It should be in ath10k_mac_update_rx_channel()
8719 * only for multi-channel cases. Single-channel cases will remain to in ath10k_mac_update_rx_channel()
8725 ieee80211_iter_chan_contexts_atomic(ar->hw, in ath10k_mac_update_rx_channel()
8730 def = &vifs[0].new_ctx->def; in ath10k_mac_update_rx_channel()
8732 ar->rx_channel = def->chan; in ath10k_mac_update_rx_channel()
8734 (ctx && (ar->state == ATH10K_STATE_RESTARTED))) { in ath10k_mac_update_rx_channel()
8740 ar->rx_channel = ctx->def.chan; in ath10k_mac_update_rx_channel()
8742 ar->rx_channel = NULL; in ath10k_mac_update_rx_channel()
8756 lockdep_assert_held(&ar->conf_mutex); in ath10k_mac_update_vif_chan()
8761 if (ar->monitor_started) in ath10k_mac_update_vif_chan()
8765 arvif = (void *)vifs[i].vif->drv_priv; in ath10k_mac_update_vif_chan()
8768 "mac chanctx switch vdev_id %i freq %u->%u width %d->%d\n", in ath10k_mac_update_vif_chan()
8769 arvif->vdev_id, in ath10k_mac_update_vif_chan()
8770 vifs[i].old_ctx->def.chan->center_freq, in ath10k_mac_update_vif_chan()
8771 vifs[i].new_ctx->def.chan->center_freq, in ath10k_mac_update_vif_chan()
8772 vifs[i].old_ctx->def.width, in ath10k_mac_update_vif_chan()
8773 vifs[i].new_ctx->def.width); in ath10k_mac_update_vif_chan()
8775 if (WARN_ON(!arvif->is_started)) in ath10k_mac_update_vif_chan()
8778 if (WARN_ON(!arvif->is_up)) in ath10k_mac_update_vif_chan()
8781 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id); in ath10k_mac_update_vif_chan()
8784 arvif->vdev_id, ret); in ath10k_mac_update_vif_chan()
8793 spin_lock_bh(&ar->data_lock); in ath10k_mac_update_vif_chan()
8795 spin_unlock_bh(&ar->data_lock); in ath10k_mac_update_vif_chan()
8798 arvif = (void *)vifs[i].vif->drv_priv; in ath10k_mac_update_vif_chan()
8800 if (WARN_ON(!arvif->is_started)) in ath10k_mac_update_vif_chan()
8803 if (WARN_ON(!arvif->is_up)) in ath10k_mac_update_vif_chan()
8816 ret = ath10k_vdev_restart(arvif, &vifs[i].new_ctx->def); in ath10k_mac_update_vif_chan()
8819 arvif->vdev_id, ret); in ath10k_mac_update_vif_chan()
8823 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid, in ath10k_mac_update_vif_chan()
8824 arvif->bssid); in ath10k_mac_update_vif_chan()
8827 arvif->vdev_id, ret); in ath10k_mac_update_vif_chan()
8839 struct ath10k *ar = hw->priv; in ath10k_mac_op_add_chanctx()
8842 "mac chanctx add freq %u width %d ptr %p\n", in ath10k_mac_op_add_chanctx()
8843 ctx->def.chan->center_freq, ctx->def.width, ctx); in ath10k_mac_op_add_chanctx()
8845 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_add_chanctx()
8847 spin_lock_bh(&ar->data_lock); in ath10k_mac_op_add_chanctx()
8849 spin_unlock_bh(&ar->data_lock); in ath10k_mac_op_add_chanctx()
8854 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_add_chanctx()
8863 struct ath10k *ar = hw->priv; in ath10k_mac_op_remove_chanctx()
8866 "mac chanctx remove freq %u width %d ptr %p\n", in ath10k_mac_op_remove_chanctx()
8867 ctx->def.chan->center_freq, ctx->def.width, ctx); in ath10k_mac_op_remove_chanctx()
8869 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_remove_chanctx()
8871 spin_lock_bh(&ar->data_lock); in ath10k_mac_op_remove_chanctx()
8873 spin_unlock_bh(&ar->data_lock); in ath10k_mac_op_remove_chanctx()
8878 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_remove_chanctx()
8894 if (rcu_access_pointer(vif->bss_conf.chanctx_conf) != arg->ctx) in ath10k_mac_change_chanctx_cnt_iter()
8897 arg->n_vifs++; in ath10k_mac_change_chanctx_cnt_iter()
8907 ctx = rcu_access_pointer(vif->bss_conf.chanctx_conf); in ath10k_mac_change_chanctx_fill_iter()
8908 if (ctx != arg->ctx) in ath10k_mac_change_chanctx_fill_iter()
8911 if (WARN_ON(arg->next_vif == arg->n_vifs)) in ath10k_mac_change_chanctx_fill_iter()
8914 arg->vifs[arg->next_vif].vif = vif; in ath10k_mac_change_chanctx_fill_iter()
8915 arg->vifs[arg->next_vif].old_ctx = ctx; in ath10k_mac_change_chanctx_fill_iter()
8916 arg->vifs[arg->next_vif].new_ctx = ctx; in ath10k_mac_change_chanctx_fill_iter()
8917 arg->next_vif++; in ath10k_mac_change_chanctx_fill_iter()
8925 struct ath10k *ar = hw->priv; in ath10k_mac_op_change_chanctx()
8928 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_change_chanctx()
8931 "mac chanctx change freq %u width %d ptr %p changed %x\n", in ath10k_mac_op_change_chanctx()
8932 ctx->def.chan->center_freq, ctx->def.width, ctx, changed); in ath10k_mac_op_change_chanctx()
8969 * definitions per vdev internally and there's no host-side channel in ath10k_mac_op_change_chanctx()
8974 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_change_chanctx()
8983 struct ath10k *ar = hw->priv; in ath10k_mac_op_assign_vif_chanctx()
8984 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_mac_op_assign_vif_chanctx()
8987 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_assign_vif_chanctx()
8991 ctx, arvif->vdev_id); in ath10k_mac_op_assign_vif_chanctx()
8993 if (WARN_ON(arvif->is_started)) { in ath10k_mac_op_assign_vif_chanctx()
8994 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_assign_vif_chanctx()
8995 return -EBUSY; in ath10k_mac_op_assign_vif_chanctx()
8998 ret = ath10k_vdev_start(arvif, &ctx->def); in ath10k_mac_op_assign_vif_chanctx()
9000 ath10k_warn(ar, "failed to start vdev %i addr %pM on freq %d: %d\n", in ath10k_mac_op_assign_vif_chanctx()
9001 arvif->vdev_id, vif->addr, in ath10k_mac_op_assign_vif_chanctx()
9002 ctx->def.chan->center_freq, ret); in ath10k_mac_op_assign_vif_chanctx()
9006 arvif->is_started = true; in ath10k_mac_op_assign_vif_chanctx()
9011 arvif->vdev_id, ret); in ath10k_mac_op_assign_vif_chanctx()
9015 if (vif->type == NL80211_IFTYPE_MONITOR) { in ath10k_mac_op_assign_vif_chanctx()
9016 ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, 0, vif->addr); in ath10k_mac_op_assign_vif_chanctx()
9019 arvif->vdev_id, ret); in ath10k_mac_op_assign_vif_chanctx()
9023 arvif->is_up = true; in ath10k_mac_op_assign_vif_chanctx()
9030 arvif->vdev_id, ret); in ath10k_mac_op_assign_vif_chanctx()
9034 ar->hw_params.tx_stats_over_pktlog) { in ath10k_mac_op_assign_vif_chanctx()
9035 ar->pktlog_filter |= ATH10K_PKTLOG_PEER_STATS; in ath10k_mac_op_assign_vif_chanctx()
9037 ar->pktlog_filter); in ath10k_mac_op_assign_vif_chanctx()
9044 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_assign_vif_chanctx()
9049 arvif->is_started = false; in ath10k_mac_op_assign_vif_chanctx()
9053 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_assign_vif_chanctx()
9063 struct ath10k *ar = hw->priv; in ath10k_mac_op_unassign_vif_chanctx()
9064 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_mac_op_unassign_vif_chanctx()
9067 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_unassign_vif_chanctx()
9071 ctx, arvif->vdev_id); in ath10k_mac_op_unassign_vif_chanctx()
9073 WARN_ON(!arvif->is_started); in ath10k_mac_op_unassign_vif_chanctx()
9075 if (vif->type == NL80211_IFTYPE_MONITOR) { in ath10k_mac_op_unassign_vif_chanctx()
9076 WARN_ON(!arvif->is_up); in ath10k_mac_op_unassign_vif_chanctx()
9078 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id); in ath10k_mac_op_unassign_vif_chanctx()
9081 arvif->vdev_id, ret); in ath10k_mac_op_unassign_vif_chanctx()
9083 arvif->is_up = false; in ath10k_mac_op_unassign_vif_chanctx()
9089 arvif->vdev_id, ret); in ath10k_mac_op_unassign_vif_chanctx()
9091 arvif->is_started = false; in ath10k_mac_op_unassign_vif_chanctx()
9093 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_unassign_vif_chanctx()
9102 struct ath10k *ar = hw->priv; in ath10k_mac_op_switch_vif_chanctx()
9104 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_switch_vif_chanctx()
9111 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_switch_vif_chanctx()
9122 ar = hw->priv; in ath10k_mac_op_sta_pre_rcu_remove()
9124 list_for_each_entry(peer, &ar->peers, list) in ath10k_mac_op_sta_pre_rcu_remove()
9125 if (peer->sta == sta) in ath10k_mac_op_sta_pre_rcu_remove()
9126 peer->removed = true; in ath10k_mac_op_sta_pre_rcu_remove()
9203 index = mcs - len_nss1; in ath10k_mac_get_rate_flags_ht()
9289 rate->flags = flags; in ath10k_mac_parse_bitrate()
9290 rate->bw = bw; in ath10k_mac_parse_bitrate()
9291 rate->legacy = bitrate_kbps / 100; in ath10k_mac_parse_bitrate()
9292 rate->nss = nss; in ath10k_mac_parse_bitrate()
9293 rate->mcs = mcs; in ath10k_mac_parse_bitrate()
9300 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv; in ath10k_mac_sta_get_peer_stats_info()
9305 if (!(ar->hw_params.supports_peer_stats_info && in ath10k_mac_sta_get_peer_stats_info()
9306 arsta->arvif->vdev_type == WMI_VDEV_TYPE_STA)) in ath10k_mac_sta_get_peer_stats_info()
9309 spin_lock_bh(&ar->data_lock); in ath10k_mac_sta_get_peer_stats_info()
9310 peer = ath10k_peer_find(ar, arsta->arvif->vdev_id, sta->addr); in ath10k_mac_sta_get_peer_stats_info()
9311 spin_unlock_bh(&ar->data_lock); in ath10k_mac_sta_get_peer_stats_info()
9315 reinit_completion(&ar->peer_stats_info_complete); in ath10k_mac_sta_get_peer_stats_info()
9318 arsta->arvif->vdev_id, in ath10k_mac_sta_get_peer_stats_info()
9320 arsta->arvif->bssid, in ath10k_mac_sta_get_peer_stats_info()
9322 if (ret && ret != -EOPNOTSUPP) { in ath10k_mac_sta_get_peer_stats_info()
9327 time_left = wait_for_completion_timeout(&ar->peer_stats_info_complete, 3 * HZ); in ath10k_mac_sta_get_peer_stats_info()
9333 if (arsta->rx_rate_code != 0 && arsta->rx_bitrate_kbps != 0) { in ath10k_mac_sta_get_peer_stats_info()
9334 ath10k_mac_parse_bitrate(ar, arsta->rx_rate_code, in ath10k_mac_sta_get_peer_stats_info()
9335 arsta->rx_bitrate_kbps, in ath10k_mac_sta_get_peer_stats_info()
9336 &sinfo->rxrate); in ath10k_mac_sta_get_peer_stats_info()
9338 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_BITRATE); in ath10k_mac_sta_get_peer_stats_info()
9339 arsta->rx_rate_code = 0; in ath10k_mac_sta_get_peer_stats_info()
9340 arsta->rx_bitrate_kbps = 0; in ath10k_mac_sta_get_peer_stats_info()
9343 if (arsta->tx_rate_code != 0 && arsta->tx_bitrate_kbps != 0) { in ath10k_mac_sta_get_peer_stats_info()
9344 ath10k_mac_parse_bitrate(ar, arsta->tx_rate_code, in ath10k_mac_sta_get_peer_stats_info()
9345 arsta->tx_bitrate_kbps, in ath10k_mac_sta_get_peer_stats_info()
9346 &sinfo->txrate); in ath10k_mac_sta_get_peer_stats_info()
9348 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE); in ath10k_mac_sta_get_peer_stats_info()
9349 arsta->tx_rate_code = 0; in ath10k_mac_sta_get_peer_stats_info()
9350 arsta->tx_bitrate_kbps = 0; in ath10k_mac_sta_get_peer_stats_info()
9359 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv; in ath10k_sta_statistics()
9360 struct ath10k *ar = arsta->arvif->ar; in ath10k_sta_statistics()
9365 mutex_lock(&ar->conf_mutex); in ath10k_sta_statistics()
9367 mutex_unlock(&ar->conf_mutex); in ath10k_sta_statistics()
9369 sinfo->rx_duration = arsta->rx_duration; in ath10k_sta_statistics()
9370 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_DURATION); in ath10k_sta_statistics()
9372 if (arsta->txrate.legacy || arsta->txrate.nss) { in ath10k_sta_statistics()
9373 if (arsta->txrate.legacy) { in ath10k_sta_statistics()
9374 sinfo->txrate.legacy = arsta->txrate.legacy; in ath10k_sta_statistics()
9376 sinfo->txrate.mcs = arsta->txrate.mcs; in ath10k_sta_statistics()
9377 sinfo->txrate.nss = arsta->txrate.nss; in ath10k_sta_statistics()
9378 sinfo->txrate.bw = arsta->txrate.bw; in ath10k_sta_statistics()
9380 sinfo->txrate.flags = arsta->txrate.flags; in ath10k_sta_statistics()
9381 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE); in ath10k_sta_statistics()
9384 if (ar->htt.disable_tx_comp) { in ath10k_sta_statistics()
9385 sinfo->tx_failed = arsta->tx_failed; in ath10k_sta_statistics()
9386 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_FAILED); in ath10k_sta_statistics()
9389 sinfo->tx_retries = arsta->tx_retries; in ath10k_sta_statistics()
9390 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_RETRIES); in ath10k_sta_statistics()
9400 struct ath10k *ar = hw->priv; in ath10k_mac_op_set_tid_config()
9401 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_mac_op_set_tid_config()
9406 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_set_tid_config()
9407 arg.vdev_id = arvif->vdev_id; in ath10k_mac_op_set_tid_config()
9409 arvif->tids_rst = 0; in ath10k_mac_op_set_tid_config()
9410 memset(arvif->tid_conf_changed, 0, sizeof(arvif->tid_conf_changed)); in ath10k_mac_op_set_tid_config()
9412 for (i = 0; i < tid_config->n_tid_conf; i++) { in ath10k_mac_op_set_tid_config()
9414 &tid_config->tid_conf[i], in ath10k_mac_op_set_tid_config()
9425 arvif->tids_rst = 0; in ath10k_mac_op_set_tid_config()
9433 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_set_tid_config()
9442 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_mac_op_reset_tid_config()
9444 struct ath10k *ar = hw->priv; in ath10k_mac_op_reset_tid_config()
9447 mutex_lock(&ar->conf_mutex); in ath10k_mac_op_reset_tid_config()
9450 arvif->tids_rst = 0; in ath10k_mac_op_reset_tid_config()
9455 arvif->tids_rst = tids; in ath10k_mac_op_reset_tid_config()
9462 mutex_unlock(&ar->conf_mutex); in ath10k_mac_op_reset_tid_config()
9609 ar = hw->priv; in ath10k_mac_create()
9610 ar->hw = hw; in ath10k_mac_create()
9611 ar->ops = ops; in ath10k_mac_create()
9618 struct ieee80211_ops *ops = ar->ops; in ath10k_mac_destroy()
9620 ieee80211_free_hw(ar->hw); in ath10k_mac_destroy()
9742 /* FIXME: This is not thoroughly tested. These combinations may over- or
9838 struct ath10k_vif *arvif = (void *)vif->drv_priv; in ath10k_get_arvif_iter()
9840 if (arvif->vdev_id == arvif_iter->vdev_id) in ath10k_get_arvif_iter()
9841 arvif_iter->arvif = arvif; in ath10k_get_arvif_iter()
9851 ieee80211_iterate_active_interfaces_atomic(ar->hw, in ath10k_get_arvif()
9873 if (wrdd->type != ACPI_TYPE_PACKAGE || in ath10k_mac_wrdd_get_mcc()
9874 wrdd->package.count < 2 || in ath10k_mac_wrdd_get_mcc()
9875 wrdd->package.elements[0].type != ACPI_TYPE_INTEGER || in ath10k_mac_wrdd_get_mcc()
9876 wrdd->package.elements[0].integer.value != 0) { in ath10k_mac_wrdd_get_mcc()
9881 for (i = 1; i < wrdd->package.count; ++i) { in ath10k_mac_wrdd_get_mcc()
9882 mcc_pkg = &wrdd->package.elements[i]; in ath10k_mac_wrdd_get_mcc()
9884 if (mcc_pkg->type != ACPI_TYPE_PACKAGE) in ath10k_mac_wrdd_get_mcc()
9886 if (mcc_pkg->package.count < 2) in ath10k_mac_wrdd_get_mcc()
9888 if (mcc_pkg->package.elements[0].type != ACPI_TYPE_INTEGER || in ath10k_mac_wrdd_get_mcc()
9889 mcc_pkg->package.elements[1].type != ACPI_TYPE_INTEGER) in ath10k_mac_wrdd_get_mcc()
9892 domain_type = &mcc_pkg->package.elements[0]; in ath10k_mac_wrdd_get_mcc()
9893 if (domain_type->integer.value != WRDD_WIFI) in ath10k_mac_wrdd_get_mcc()
9896 mcc_value = &mcc_pkg->package.elements[1]; in ath10k_mac_wrdd_get_mcc()
9897 return mcc_value->integer.value; in ath10k_mac_wrdd_get_mcc()
9911 root_handle = ACPI_HANDLE(ar->dev); in ath10k_mac_get_wrdd_regulatory()
9913 return -EOPNOTSUPP; in ath10k_mac_get_wrdd_regulatory()
9919 return -EIO; in ath10k_mac_get_wrdd_regulatory()
9926 return -EIO; in ath10k_mac_get_wrdd_regulatory()
9932 return -EIO; in ath10k_mac_get_wrdd_regulatory()
9939 "regulatory hint from WRDD (alpha2-code): %s\n", alpha2); in ath10k_mac_get_wrdd_regulatory()
9943 return -EIO; in ath10k_mac_get_wrdd_regulatory()
9958 rd = ar->hw_eeprom_rd; in ath10k_mac_init_rd()
9961 ar->ath_common.regulatory.current_rd = rd; in ath10k_mac_init_rd()
9982 /* Only QCA99x0 and QCA4019 variants support GCMP-128, GCMP-256 in ath10k_mac_register()
9983 * and CCMP-256 in hardware. in ath10k_mac_register()
9993 if (!is_valid_ether_addr(ar->mac_addr)) { in ath10k_mac_register()
9995 eth_random_addr(ar->mac_addr); in ath10k_mac_register()
9997 SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr); in ath10k_mac_register()
9999 SET_IEEE80211_DEV(ar->hw, ar->dev); in ath10k_mac_register()
10005 if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) { in ath10k_mac_register()
10010 ret = -ENOMEM; in ath10k_mac_register()
10014 band = &ar->mac.sbands[NL80211_BAND_2GHZ]; in ath10k_mac_register()
10015 band->n_channels = ARRAY_SIZE(ath10k_2ghz_channels); in ath10k_mac_register()
10016 band->channels = channels; in ath10k_mac_register()
10018 if (ar->hw_params.cck_rate_map_rev2) { in ath10k_mac_register()
10019 band->n_bitrates = ath10k_g_rates_rev2_size; in ath10k_mac_register()
10020 band->bitrates = ath10k_g_rates_rev2; in ath10k_mac_register()
10022 band->n_bitrates = ath10k_g_rates_size; in ath10k_mac_register()
10023 band->bitrates = ath10k_g_rates; in ath10k_mac_register()
10026 ar->hw->wiphy->bands[NL80211_BAND_2GHZ] = band; in ath10k_mac_register()
10029 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) { in ath10k_mac_register()
10034 ret = -ENOMEM; in ath10k_mac_register()
10038 band = &ar->mac.sbands[NL80211_BAND_5GHZ]; in ath10k_mac_register()
10039 band->n_channels = ARRAY_SIZE(ath10k_5ghz_channels); in ath10k_mac_register()
10040 band->channels = channels; in ath10k_mac_register()
10041 band->n_bitrates = ath10k_a_rates_size; in ath10k_mac_register()
10042 band->bitrates = ath10k_a_rates; in ath10k_mac_register()
10043 ar->hw->wiphy->bands[NL80211_BAND_5GHZ] = band; in ath10k_mac_register()
10046 wiphy_read_of_freq_limits(ar->hw->wiphy); in ath10k_mac_register()
10049 ar->hw->wiphy->interface_modes = in ath10k_mac_register()
10054 ar->hw->wiphy->available_antennas_rx = ar->cfg_rx_chainmask; in ath10k_mac_register()
10055 ar->hw->wiphy->available_antennas_tx = ar->cfg_tx_chainmask; in ath10k_mac_register()
10057 if (!test_bit(ATH10K_FW_FEATURE_NO_P2P, ar->normal_mode_fw.fw_file.fw_features)) in ath10k_mac_register()
10058 ar->hw->wiphy->interface_modes |= in ath10k_mac_register()
10063 ieee80211_hw_set(ar->hw, SIGNAL_DBM); in ath10k_mac_register()
10066 ar->running_fw->fw_file.fw_features)) { in ath10k_mac_register()
10067 ieee80211_hw_set(ar->hw, SUPPORTS_PS); in ath10k_mac_register()
10068 ieee80211_hw_set(ar->hw, SUPPORTS_DYNAMIC_PS); in ath10k_mac_register()
10071 ieee80211_hw_set(ar->hw, MFP_CAPABLE); in ath10k_mac_register()
10072 ieee80211_hw_set(ar->hw, REPORTS_TX_ACK_STATUS); in ath10k_mac_register()
10073 ieee80211_hw_set(ar->hw, HAS_RATE_CONTROL); in ath10k_mac_register()
10074 ieee80211_hw_set(ar->hw, AP_LINK_PS); in ath10k_mac_register()
10075 ieee80211_hw_set(ar->hw, SPECTRUM_MGMT); in ath10k_mac_register()
10076 ieee80211_hw_set(ar->hw, SUPPORT_FAST_XMIT); in ath10k_mac_register()
10077 ieee80211_hw_set(ar->hw, CONNECTION_MONITOR); in ath10k_mac_register()
10078 ieee80211_hw_set(ar->hw, SUPPORTS_PER_STA_GTK); in ath10k_mac_register()
10079 ieee80211_hw_set(ar->hw, WANT_MONITOR_VIF); in ath10k_mac_register()
10080 ieee80211_hw_set(ar->hw, CHANCTX_STA_CSA); in ath10k_mac_register()
10081 ieee80211_hw_set(ar->hw, QUEUE_CONTROL); in ath10k_mac_register()
10082 ieee80211_hw_set(ar->hw, SUPPORTS_TX_FRAG); in ath10k_mac_register()
10083 ieee80211_hw_set(ar->hw, REPORTS_LOW_ACK); in ath10k_mac_register()
10085 if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) in ath10k_mac_register()
10086 ieee80211_hw_set(ar->hw, SW_CRYPTO_CONTROL); in ath10k_mac_register()
10088 ar->hw->wiphy->features |= NL80211_FEATURE_STATIC_SMPS; in ath10k_mac_register()
10089 ar->hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN; in ath10k_mac_register()
10091 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) in ath10k_mac_register()
10092 ar->hw->wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS; in ath10k_mac_register()
10094 if (ar->ht_cap_info & WMI_HT_CAP_ENABLED) { in ath10k_mac_register()
10095 ieee80211_hw_set(ar->hw, AMPDU_AGGREGATION); in ath10k_mac_register()
10096 ieee80211_hw_set(ar->hw, TX_AMPDU_SETUP_IN_HW); in ath10k_mac_register()
10099 ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID; in ath10k_mac_register()
10100 ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN; in ath10k_mac_register()
10102 if (test_bit(WMI_SERVICE_NLO, ar->wmi.svc_map)) { in ath10k_mac_register()
10103 ar->hw->wiphy->max_sched_scan_ssids = WMI_PNO_MAX_SUPP_NETWORKS; in ath10k_mac_register()
10104 ar->hw->wiphy->max_match_sets = WMI_PNO_MAX_SUPP_NETWORKS; in ath10k_mac_register()
10105 ar->hw->wiphy->max_sched_scan_ie_len = WMI_PNO_MAX_IE_LENGTH; in ath10k_mac_register()
10106 ar->hw->wiphy->max_sched_scan_plans = WMI_PNO_MAX_SCHED_SCAN_PLANS; in ath10k_mac_register()
10107 ar->hw->wiphy->max_sched_scan_plan_interval = in ath10k_mac_register()
10109 ar->hw->wiphy->max_sched_scan_plan_iterations = in ath10k_mac_register()
10111 ar->hw->wiphy->features |= NL80211_FEATURE_ND_RANDOM_MAC_ADDR; in ath10k_mac_register()
10114 ar->hw->vif_data_size = sizeof(struct ath10k_vif); in ath10k_mac_register()
10115 ar->hw->sta_data_size = sizeof(struct ath10k_sta); in ath10k_mac_register()
10116 ar->hw->txq_data_size = sizeof(struct ath10k_txq); in ath10k_mac_register()
10118 ar->hw->max_listen_interval = ATH10K_MAX_HW_LISTEN_INTERVAL; in ath10k_mac_register()
10120 if (test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map)) { in ath10k_mac_register()
10121 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD; in ath10k_mac_register()
10127 ar->hw->wiphy->probe_resp_offload |= in ath10k_mac_register()
10133 if (test_bit(WMI_SERVICE_TDLS, ar->wmi.svc_map) || in ath10k_mac_register()
10134 test_bit(WMI_SERVICE_TDLS_EXPLICIT_MODE_ONLY, ar->wmi.svc_map)) { in ath10k_mac_register()
10135 ar->hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS; in ath10k_mac_register()
10136 if (test_bit(WMI_SERVICE_TDLS_WIDER_BANDWIDTH, ar->wmi.svc_map)) in ath10k_mac_register()
10137 ieee80211_hw_set(ar->hw, TDLS_WIDER_BW); in ath10k_mac_register()
10140 if (test_bit(WMI_SERVICE_TDLS_UAPSD_BUFFER_STA, ar->wmi.svc_map)) in ath10k_mac_register()
10141 ieee80211_hw_set(ar->hw, SUPPORTS_TDLS_BUFFER_STA); in ath10k_mac_register()
10144 if (ar->wmi.vdev_param->tx_encap_type != in ath10k_mac_register()
10146 ieee80211_hw_set(ar->hw, SUPPORTS_TX_ENCAP_OFFLOAD); in ath10k_mac_register()
10149 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL; in ath10k_mac_register()
10150 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH; in ath10k_mac_register()
10151 ar->hw->wiphy->max_remain_on_channel_duration = 5000; in ath10k_mac_register()
10153 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD; in ath10k_mac_register()
10154 ar->hw->wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE | in ath10k_mac_register()
10157 ar->hw->wiphy->max_ap_assoc_sta = ar->max_num_stations; in ath10k_mac_register()
10165 wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_VHT_IBSS); in ath10k_mac_register()
10166 wiphy_ext_feature_set(ar->hw->wiphy, in ath10k_mac_register()
10168 wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_AQL); in ath10k_mac_register()
10170 if (ar->hw_params.mcast_frame_registration) in ath10k_mac_register()
10171 wiphy_ext_feature_set(ar->hw->wiphy, in ath10k_mac_register()
10174 if (test_bit(WMI_SERVICE_TX_DATA_ACK_RSSI, ar->wmi.svc_map) || in ath10k_mac_register()
10175 test_bit(WMI_SERVICE_HTT_MGMT_TX_COMP_VALID_FLAGS, ar->wmi.svc_map)) in ath10k_mac_register()
10176 wiphy_ext_feature_set(ar->hw->wiphy, in ath10k_mac_register()
10180 test_bit(WMI_SERVICE_REPORT_AIRTIME, ar->wmi.svc_map)) in ath10k_mac_register()
10181 wiphy_ext_feature_set(ar->hw->wiphy, in ath10k_mac_register()
10184 if (test_bit(WMI_SERVICE_RTT_RESPONDER_ROLE, ar->wmi.svc_map)) in ath10k_mac_register()
10185 wiphy_ext_feature_set(ar->hw->wiphy, in ath10k_mac_register()
10188 if (test_bit(WMI_SERVICE_TX_PWR_PER_PEER, ar->wmi.svc_map)) in ath10k_mac_register()
10189 wiphy_ext_feature_set(ar->hw->wiphy, in ath10k_mac_register()
10192 if (test_bit(WMI_SERVICE_PEER_TID_CONFIGS_SUPPORT, ar->wmi.svc_map)) { in ath10k_mac_register()
10193 ar->hw->wiphy->tid_config_support.vif |= in ath10k_mac_register()
10202 ar->wmi.svc_map)) { in ath10k_mac_register()
10203 ar->hw->wiphy->tid_config_support.vif |= in ath10k_mac_register()
10207 ar->hw->wiphy->tid_config_support.peer = in ath10k_mac_register()
10208 ar->hw->wiphy->tid_config_support.vif; in ath10k_mac_register()
10209 ar->hw->wiphy->max_data_retry_count = ATH10K_MAX_RETRY_COUNT; in ath10k_mac_register()
10211 ar->ops->set_tid_config = NULL; in ath10k_mac_register()
10217 ar->hw->queues = IEEE80211_MAX_QUEUES; in ath10k_mac_register()
10223 ar->hw->offchannel_tx_hw_queue = IEEE80211_MAX_QUEUES - 1; in ath10k_mac_register()
10225 switch (ar->running_fw->fw_file.wmi_op_version) { in ath10k_mac_register()
10227 ar->hw->wiphy->iface_combinations = ath10k_if_comb; in ath10k_mac_register()
10228 ar->hw->wiphy->n_iface_combinations = in ath10k_mac_register()
10230 ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC); in ath10k_mac_register()
10233 if (test_bit(WMI_SERVICE_ADAPTIVE_OCS, ar->wmi.svc_map)) { in ath10k_mac_register()
10234 ar->hw->wiphy->iface_combinations = in ath10k_mac_register()
10236 ar->hw->wiphy->n_iface_combinations = in ath10k_mac_register()
10239 ar->hw->wiphy->iface_combinations = ath10k_tlv_if_comb; in ath10k_mac_register()
10240 ar->hw->wiphy->n_iface_combinations = in ath10k_mac_register()
10243 ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC); in ath10k_mac_register()
10248 ar->hw->wiphy->iface_combinations = ath10k_10x_if_comb; in ath10k_mac_register()
10249 ar->hw->wiphy->n_iface_combinations = in ath10k_mac_register()
10253 ar->hw->wiphy->iface_combinations = ath10k_10_4_if_comb; in ath10k_mac_register()
10254 ar->hw->wiphy->n_iface_combinations = in ath10k_mac_register()
10257 ar->wmi.svc_map)) { in ath10k_mac_register()
10258 ar->hw->wiphy->iface_combinations = in ath10k_mac_register()
10260 ar->hw->wiphy->n_iface_combinations = in ath10k_mac_register()
10267 ret = -EINVAL; in ath10k_mac_register()
10271 if (ar->hw_params.dynamic_sar_support) in ath10k_mac_register()
10272 ar->hw->wiphy->sar_capa = &ath10k_sar_capa; in ath10k_mac_register()
10274 if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) in ath10k_mac_register()
10275 ar->hw->netdev_features = NETIF_F_HW_CSUM; in ath10k_mac_register()
10279 ar->ath_common.debug_mask = ATH_DBG_DFS; in ath10k_mac_register()
10280 ar->dfs_detector = dfs_pattern_detector_init(&ar->ath_common, in ath10k_mac_register()
10283 if (!ar->dfs_detector) in ath10k_mac_register()
10294 if (!ar->hw_params.hw_ops->set_coverage_class) in ath10k_mac_register()
10295 ar->ops->set_coverage_class = NULL; in ath10k_mac_register()
10297 ret = ath_regd_init(&ar->ath_common.regulatory, ar->hw->wiphy, in ath10k_mac_register()
10304 if (test_bit(WMI_SERVICE_SPOOF_MAC_SUPPORT, ar->wmi.svc_map)) { in ath10k_mac_register()
10305 ar->hw->wiphy->features |= in ath10k_mac_register()
10309 ar->hw->wiphy->cipher_suites = cipher_suites; in ath10k_mac_register()
10311 /* QCA988x and QCA6174 family chips do not support CCMP-256, GCMP-128 in ath10k_mac_register()
10312 * and GCMP-256 ciphers in hardware. Fetch number of ciphers supported in ath10k_mac_register()
10315 if (!ar->hw_params.n_cipher_suites || in ath10k_mac_register()
10316 ar->hw_params.n_cipher_suites > ARRAY_SIZE(cipher_suites)) { in ath10k_mac_register()
10318 ar->hw_params.n_cipher_suites); in ath10k_mac_register()
10319 ar->hw_params.n_cipher_suites = 8; in ath10k_mac_register()
10321 ar->hw->wiphy->n_cipher_suites = ar->hw_params.n_cipher_suites; in ath10k_mac_register()
10323 wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST); in ath10k_mac_register()
10325 ar->hw->weight_multiplier = ATH10K_AIRTIME_WEIGHT_MULTIPLIER; in ath10k_mac_register()
10327 ret = ieee80211_register_hw(ar->hw); in ath10k_mac_register()
10329 ath10k_err(ar, "failed to register ieee80211: %d\n", ret); in ath10k_mac_register()
10333 if (test_bit(WMI_SERVICE_PER_PACKET_SW_ENCRYPT, ar->wmi.svc_map)) { in ath10k_mac_register()
10334 ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_AP_VLAN); in ath10k_mac_register()
10335 ar->hw->wiphy->software_iftypes |= BIT(NL80211_IFTYPE_AP_VLAN); in ath10k_mac_register()
10338 if (!ath_is_world_regd(&ar->ath_common.reg_world_copy) && in ath10k_mac_register()
10339 !ath_is_world_regd(&ar->ath_common.regulatory)) { in ath10k_mac_register()
10340 ret = regulatory_hint(ar->hw->wiphy, in ath10k_mac_register()
10341 ar->ath_common.regulatory.alpha2); in ath10k_mac_register()
10349 ieee80211_unregister_hw(ar->hw); in ath10k_mac_register()
10352 if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) in ath10k_mac_register()
10353 ar->dfs_detector->exit(ar->dfs_detector); in ath10k_mac_register()
10356 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); in ath10k_mac_register()
10357 kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels); in ath10k_mac_register()
10359 SET_IEEE80211_DEV(ar->hw, NULL); in ath10k_mac_register()
10365 ieee80211_unregister_hw(ar->hw); in ath10k_mac_unregister()
10367 if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) in ath10k_mac_unregister()
10368 ar->dfs_detector->exit(ar->dfs_detector); in ath10k_mac_unregister()
10370 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); in ath10k_mac_unregister()
10371 kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels); in ath10k_mac_unregister()
10373 SET_IEEE80211_DEV(ar->hw, NULL); in ath10k_mac_unregister()