Lines Matching +full:ieee80211 +full:- +full:freq +full:- +full:limit
1 // SPDX-License-Identifier: BSD-3-Clause-Clear
3 * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
4 * Copyright (c) 2021-2025 Qualcomm Innovation Center, Inc. All rights reserved.
17 struct ath12k *ar = file->private_data; in ath12k_write_simulate_radar()
20 wiphy_lock(ath12k_ar_to_hw(ar)->wiphy); in ath12k_write_simulate_radar()
27 wiphy_unlock(ath12k_ar_to_hw(ar)->wiphy); in ath12k_write_simulate_radar()
40 struct ath12k *ar = file->private_data; in ath12k_write_tpc_stats_type()
49 return -EINVAL; in ath12k_write_tpc_stats_type()
51 spin_lock_bh(&ar->data_lock); in ath12k_write_tpc_stats_type()
52 ar->debug.tpc_stats_type = type; in ath12k_write_tpc_stats_type()
53 spin_unlock_bh(&ar->data_lock); in ath12k_write_tpc_stats_type()
61 struct ath12k_base *ab = ar->ab; in ath12k_debug_tpc_stats_request()
64 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_debug_tpc_stats_request()
66 reinit_completion(&ar->debug.tpc_complete); in ath12k_debug_tpc_stats_request()
68 spin_lock_bh(&ar->data_lock); in ath12k_debug_tpc_stats_request()
69 ar->debug.tpc_request = true; in ath12k_debug_tpc_stats_request()
70 tpc_stats_sub_id = ar->debug.tpc_stats_type; in ath12k_debug_tpc_stats_request()
71 spin_unlock_bh(&ar->data_lock); in ath12k_debug_tpc_stats_request()
76 spin_lock_bh(&ar->data_lock); in ath12k_debug_tpc_stats_request()
77 ar->debug.tpc_request = false; in ath12k_debug_tpc_stats_request()
78 spin_unlock_bh(&ar->data_lock); in ath12k_debug_tpc_stats_request()
88 u32 chan_freq = le32_to_cpu(tpc_stats->tpc_config.chan_freq); in ath12k_get_tpc_ctl_mode_idx()
194 chain_idx = num_chains - 1; in ath12k_tpc_get_rate()
195 stm_idx = num_streams - 1; in ath12k_tpc_get_rate()
196 mode = -1; in ath12k_tpc_get_rate()
200 ath12k_warn(ar->ab, "Invalid mode index received\n"); in ath12k_tpc_get_rate()
210 if (le32_to_cpu(tpc_stats->tpc_config.num_tx_chain) <= 1) { in ath12k_tpc_get_rate()
230 rate2 = tpc_stats->rates_array2.rate_array[eht_rate_idx]; in ath12k_tpc_get_rate()
236 rate1 = tpc_stats->rates_array1.rate_array[rate_idx]; in ath12k_tpc_get_rate()
243 if (tpc_stats->tlvs_rcvd & WMI_TPC_CTL_PWR_ARRAY) { in ath12k_tpc_get_rate()
244 tot_nss = le32_to_cpu(tpc_stats->ctl_array.tpc_ctl_pwr.d1); in ath12k_tpc_get_rate()
245 tot_modes = le32_to_cpu(tpc_stats->ctl_array.tpc_ctl_pwr.d2); in ath12k_tpc_get_rate()
246 txbf_on_off = le32_to_cpu(tpc_stats->ctl_array.tpc_ctl_pwr.d3); in ath12k_tpc_get_rate()
251 tpc_ctl = *(tpc_stats->ctl_array.ctl_pwr_table + in ath12k_tpc_get_rate()
256 ath12k_warn(ar->ab, in ath12k_tpc_get_rate()
262 reg_pwr = tpc_stats->max_reg_allowed_power.reg_pwr_array[chain_idx]; in ath12k_tpc_get_rate()
269 /* MODULATION_LIMIT is the maximum power limit,tpc should not exceed in ath12k_tpc_get_rate()
270 * modulation limit even if min tpc of all three array is greater in ath12k_tpc_get_rate()
271 * modulation limit in ath12k_tpc_get_rate()
322 mcs_rate -= 2; in ath12k_get_ratecode()
330 static bool ath12k_he_supports_extra_mcs(struct ath12k *ar, int freq) in ath12k_he_supports_extra_mcs() argument
332 struct ath12k_pdev_cap *cap = &ar->pdev->cap; in ath12k_he_supports_extra_mcs()
336 if (freq <= ATH12K_2GHZ_MAX_FREQUENCY) in ath12k_he_supports_extra_mcs()
337 cap_band = &cap->band[NL80211_BAND_2GHZ]; in ath12k_he_supports_extra_mcs()
338 else if (freq <= ATH12K_5GHZ_MAX_FREQUENCY) in ath12k_he_supports_extra_mcs()
339 cap_band = &cap->band[NL80211_BAND_5GHZ]; in ath12k_he_supports_extra_mcs()
341 cap_band = &cap->band[NL80211_BAND_6GHZ]; in ath12k_he_supports_extra_mcs()
343 extra_mcs_supported = u32_get_bits(cap_band->he_cap_info[1], in ath12k_he_supports_extra_mcs()
354 struct wmi_tpc_stats_arg *tpc_stats = ar->debug.tpc_stats; in ath12k_tpc_fill_pream()
385 active_tx_chains = ar->num_tx_chains; in ath12k_tpc_fill_pream()
405 len += scnprintf(buf + len, buf_len - len, in ath12k_tpc_fill_pream()
412 buf_len - len, in ath12k_tpc_fill_pream()
423 buf_len - len, "\tNA"); in ath12k_tpc_fill_pream()
426 buf_len - len, "\t%d", in ath12k_tpc_fill_pream()
431 len += scnprintf(buf + len, buf_len - len, "\n"); in ath12k_tpc_fill_pream()
533 chan_freq = le32_to_cpu(tpc_stats->tpc_config.chan_freq); in ath12k_tpc_stats_print()
534 num_tx_chain = le32_to_cpu(tpc_stats->tpc_config.num_tx_chain); in ath12k_tpc_stats_print()
535 caps = le32_to_cpu(tpc_stats->tpc_config.caps); in ath12k_tpc_stats_print()
537 active_tx_chains = ar->num_tx_chains; in ath12k_tpc_stats_print()
557 nss = (max_nss[i - 1] < num_tx_chain ? in ath12k_tpc_stats_print()
558 max_nss[i - 1] : num_tx_chain); in ath12k_tpc_stats_print()
560 rate_idx[i] = rate_idx[i - 1] + max_rates[i - 1] * nss; in ath12k_tpc_stats_print()
563 eht_rate_idx[j] = eht_rate_idx[j - 1] + max_rates[i] * nss; in ath12k_tpc_stats_print()
574 len += scnprintf(buf + len, buf_len - len, in ath12k_tpc_stats_print()
575 "No.of rates-%d\n", total_rates); in ath12k_tpc_stats_print()
577 len += scnprintf(buf + len, buf_len - len, in ath12k_tpc_stats_print()
580 len += scnprintf(buf + len, buf_len - len, in ath12k_tpc_stats_print()
582 len += scnprintf(buf + len, buf_len - len, in ath12k_tpc_stats_print()
586 len += scnprintf(buf + len, buf_len - len, in ath12k_tpc_stats_print()
587 "\t%d-Chain", i); in ath12k_tpc_stats_print()
590 len += scnprintf(buf + len, buf_len - len, "\n"); in ath12k_tpc_stats_print()
609 nss = (max_nss[i] < ar->num_tx_chains ? max_nss[i] : ar->num_tx_chains); in ath12k_tpc_stats_print()
643 ath12k_warn(ar->ab, "failed to find tpc stats\n"); in ath12k_tpc_stats_fill()
647 spin_lock_bh(&ar->data_lock); in ath12k_tpc_stats_fill()
649 tpc = &tpc_stats->tpc_config; in ath12k_tpc_stats_fill()
650 len += scnprintf(buf + len, buf_len - len, "\n"); in ath12k_tpc_stats_fill()
651 len += scnprintf(buf + len, buf_len - len, in ath12k_tpc_stats_fill()
653 len += scnprintf(buf + len, buf_len - len, in ath12k_tpc_stats_fill()
655 len += scnprintf(buf + len, buf_len - len, in ath12k_tpc_stats_fill()
656 "reg domain-%d\t\tchan freq-%d\n", in ath12k_tpc_stats_fill()
657 tpc->reg_domain, tpc->chan_freq); in ath12k_tpc_stats_fill()
658 len += scnprintf(buf + len, buf_len - len, in ath12k_tpc_stats_fill()
659 "power limit-%d\t\tmax reg-domain Power-%d\n", in ath12k_tpc_stats_fill()
660 le32_to_cpu(tpc->twice_max_reg_power) / 2, tpc->power_limit); in ath12k_tpc_stats_fill()
661 len += scnprintf(buf + len, buf_len - len, in ath12k_tpc_stats_fill()
662 "No.of tx chain-%d\t", in ath12k_tpc_stats_fill()
663 ar->num_tx_chains); in ath12k_tpc_stats_fill()
666 ar->debug.tpc_stats_type); in ath12k_tpc_stats_fill()
668 spin_unlock_bh(&ar->data_lock); in ath12k_tpc_stats_fill()
673 struct ath12k *ar = inode->i_private; in ath12k_open_tpc_stats()
677 guard(wiphy)(ath12k_ar_to_hw(ar)->wiphy); in ath12k_open_tpc_stats()
679 if (ah->state != ATH12K_HW_STATE_ON) { in ath12k_open_tpc_stats()
680 ath12k_warn(ar->ab, "Interface not up\n"); in ath12k_open_tpc_stats()
681 return -ENETDOWN; in ath12k_open_tpc_stats()
686 return -ENOMEM; in ath12k_open_tpc_stats()
690 ath12k_warn(ar->ab, "failed to request tpc stats: %d\n", in ath12k_open_tpc_stats()
695 if (!wait_for_completion_timeout(&ar->debug.tpc_complete, TPC_STATS_WAIT_TIME)) { in ath12k_open_tpc_stats()
696 spin_lock_bh(&ar->data_lock); in ath12k_open_tpc_stats()
698 ar->debug.tpc_request = false; in ath12k_open_tpc_stats()
699 spin_unlock_bh(&ar->data_lock); in ath12k_open_tpc_stats()
700 return -ETIMEDOUT; in ath12k_open_tpc_stats()
703 ath12k_tpc_stats_fill(ar, ar->debug.tpc_stats, buf); in ath12k_open_tpc_stats()
704 file->private_data = no_free_ptr(buf); in ath12k_open_tpc_stats()
706 spin_lock_bh(&ar->data_lock); in ath12k_open_tpc_stats()
708 spin_unlock_bh(&ar->data_lock); in ath12k_open_tpc_stats()
717 const char *buf = file->private_data; in ath12k_read_tpc_stats()
726 kfree(file->private_data); in ath12k_release_tpc_stats()
748 struct ath12k *ar = file->private_data; in ath12k_write_extd_rx_stats()
755 return -EINVAL; in ath12k_write_extd_rx_stats()
757 wiphy_lock(ath12k_ar_to_hw(ar)->wiphy); in ath12k_write_extd_rx_stats()
759 if (!ar->ab->hw_params->rxdma1_enable) { in ath12k_write_extd_rx_stats()
764 if (ar->ah->state != ATH12K_HW_STATE_ON) { in ath12k_write_extd_rx_stats()
765 ret = -ENETDOWN; in ath12k_write_extd_rx_stats()
769 if (enable == ar->debug.extd_rx_stats) { in ath12k_write_extd_rx_stats()
793 ar->debug.rx_filter = tlv_filter.rx_filter; in ath12k_write_extd_rx_stats()
795 for (i = 0; i < ar->ab->hw_params->num_rxdma_per_pdev; i++) { in ath12k_write_extd_rx_stats()
796 ring_id = ar->dp.rxdma_mon_dst_ring[i].ring_id; in ath12k_write_extd_rx_stats()
797 ret = ath12k_dp_tx_htt_rx_filter_setup(ar->ab, ring_id, ar->dp.mac_id + i, in ath12k_write_extd_rx_stats()
802 ath12k_warn(ar->ab, "failed to set rx filter for monitor status ring\n"); in ath12k_write_extd_rx_stats()
807 ar->debug.extd_rx_stats = !!enable; in ath12k_write_extd_rx_stats()
810 wiphy_unlock(ath12k_ar_to_hw(ar)->wiphy); in ath12k_write_extd_rx_stats()
818 struct ath12k *ar = file->private_data; in ath12k_read_extd_rx_stats()
822 wiphy_lock(ath12k_ar_to_hw(ar)->wiphy); in ath12k_read_extd_rx_stats()
823 len = scnprintf(buf, sizeof(buf) - len, "%d\n", in ath12k_read_extd_rx_stats()
824 ar->debug.extd_rx_stats); in ath12k_read_extd_rx_stats()
825 wiphy_unlock(ath12k_ar_to_hw(ar)->wiphy); in ath12k_read_extd_rx_stats()
853 scnprintf(soc_name, sizeof(soc_name), "%s-%s", ath12k_bus_str(ab->hif.bus), in ath12k_debugfs_soc_create()
854 dev_name(ab->dev)); in ath12k_debugfs_soc_create()
856 ab->debugfs_soc = debugfs_create_dir(soc_name, debugfs_ath12k); in ath12k_debugfs_soc_create()
864 debugfs_remove_recursive(ab->debugfs_soc); in ath12k_debugfs_soc_destroy()
865 ab->debugfs_soc = NULL; in ath12k_debugfs_soc_destroy()
878 list_del(&i->list); in ath12k_fw_stats_pdevs_free()
888 list_del(&i->list); in ath12k_fw_stats_bcn_free()
898 list_del(&i->list); in ath12k_fw_stats_vdevs_free()
905 spin_lock_bh(&ar->data_lock); in ath12k_debugfs_fw_stats_reset()
906 ar->fw_stats.fw_stats_done = false; in ath12k_debugfs_fw_stats_reset()
907 ath12k_fw_stats_vdevs_free(&ar->fw_stats.vdevs); in ath12k_debugfs_fw_stats_reset()
908 ath12k_fw_stats_bcn_free(&ar->fw_stats.bcn); in ath12k_debugfs_fw_stats_reset()
909 ath12k_fw_stats_pdevs_free(&ar->fw_stats.pdevs); in ath12k_debugfs_fw_stats_reset()
910 spin_unlock_bh(&ar->data_lock); in ath12k_debugfs_fw_stats_reset()
916 struct ath12k_base *ab = ar->ab; in ath12k_debugfs_fw_stats_request()
920 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); in ath12k_debugfs_fw_stats_request()
922 /* FW stats can get split when exceeding the stats data buffer limit. in ath12k_debugfs_fw_stats_request()
923 * In that case, since there is no end marking for the back-to-back in ath12k_debugfs_fw_stats_request()
931 reinit_completion(&ar->fw_stats_complete); in ath12k_debugfs_fw_stats_request()
933 ret = ath12k_wmi_send_stats_request_cmd(ar, param->stats_id, in ath12k_debugfs_fw_stats_request()
934 param->vdev_id, param->pdev_id); in ath12k_debugfs_fw_stats_request()
942 time_left = wait_for_completion_timeout(&ar->fw_stats_complete, in ath12k_debugfs_fw_stats_request()
944 /* If the wait timed out, return -ETIMEDOUT */ in ath12k_debugfs_fw_stats_request()
946 return -ETIMEDOUT; in ath12k_debugfs_fw_stats_request()
948 /* Firmware sends WMI_UPDATE_STATS_EVENTID back-to-back in ath12k_debugfs_fw_stats_request()
949 * when stats data buffer limit is reached. fw_stats_complete in ath12k_debugfs_fw_stats_request()
959 spin_lock_bh(&ar->data_lock); in ath12k_debugfs_fw_stats_request()
960 if (ar->fw_stats.fw_stats_done) { in ath12k_debugfs_fw_stats_request()
961 spin_unlock_bh(&ar->data_lock); in ath12k_debugfs_fw_stats_request()
964 spin_unlock_bh(&ar->data_lock); in ath12k_debugfs_fw_stats_request()
973 struct ath12k_base *ab = ar->ab; in ath12k_debugfs_fw_stats_process()
980 if (stats->stats_id == WMI_REQUEST_VDEV_STAT) { in ath12k_debugfs_fw_stats_process()
981 if (list_empty(&stats->vdevs)) { in ath12k_debugfs_fw_stats_process()
986 * hence limit until the count of all VDEVs started in ath12k_debugfs_fw_stats_process()
989 for (i = 0; i < ab->num_radios; i++) { in ath12k_debugfs_fw_stats_process()
990 pdev = rcu_dereference(ab->pdevs_active[i]); in ath12k_debugfs_fw_stats_process()
991 if (pdev && pdev->ar) in ath12k_debugfs_fw_stats_process()
992 total_vdevs_started += pdev->ar->num_started_vdevs; in ath12k_debugfs_fw_stats_process()
998 list_splice_tail_init(&stats->vdevs, in ath12k_debugfs_fw_stats_process()
999 &ar->fw_stats.vdevs); in ath12k_debugfs_fw_stats_process()
1002 ar->fw_stats.fw_stats_done = true; in ath12k_debugfs_fw_stats_process()
1007 if (stats->stats_id == WMI_REQUEST_BCN_STAT) { in ath12k_debugfs_fw_stats_process()
1008 if (list_empty(&stats->bcn)) { in ath12k_debugfs_fw_stats_process()
1015 is_end = ((++num_bcn) == ar->num_started_vdevs); in ath12k_debugfs_fw_stats_process()
1017 list_splice_tail_init(&stats->bcn, in ath12k_debugfs_fw_stats_process()
1018 &ar->fw_stats.bcn); in ath12k_debugfs_fw_stats_process()
1021 ar->fw_stats.fw_stats_done = true; in ath12k_debugfs_fw_stats_process()
1025 if (stats->stats_id == WMI_REQUEST_PDEV_STAT) { in ath12k_debugfs_fw_stats_process()
1026 list_splice_tail_init(&stats->pdevs, &ar->fw_stats.pdevs); in ath12k_debugfs_fw_stats_process()
1027 ar->fw_stats.fw_stats_done = true; in ath12k_debugfs_fw_stats_process()
1033 struct ath12k *ar = inode->i_private; in ath12k_open_vdev_stats()
1038 guard(wiphy)(ath12k_ar_to_hw(ar)->wiphy); in ath12k_open_vdev_stats()
1041 return -ENETDOWN; in ath12k_open_vdev_stats()
1043 if (ah->state != ATH12K_HW_STATE_ON) in ath12k_open_vdev_stats()
1044 return -ENETDOWN; in ath12k_open_vdev_stats()
1048 return -ENOMEM; in ath12k_open_vdev_stats()
1057 ath12k_warn(ar->ab, "failed to request fw vdev stats: %d\n", ret); in ath12k_open_vdev_stats()
1061 ath12k_wmi_fw_stats_dump(ar, &ar->fw_stats, param.stats_id, in ath12k_open_vdev_stats()
1064 file->private_data = no_free_ptr(buf); in ath12k_open_vdev_stats()
1071 kfree(file->private_data); in ath12k_release_vdev_stats()
1080 const char *buf = file->private_data; in ath12k_read_vdev_stats()
1096 struct ath12k *ar = inode->i_private; in ath12k_open_bcn_stats()
1102 guard(wiphy)(ath12k_ar_to_hw(ar)->wiphy); in ath12k_open_bcn_stats()
1104 if (ah && ah->state != ATH12K_HW_STATE_ON) in ath12k_open_bcn_stats()
1105 return -ENETDOWN; in ath12k_open_bcn_stats()
1109 return -ENOMEM; in ath12k_open_bcn_stats()
1115 list_for_each_entry(arvif, &ar->arvifs, list) { in ath12k_open_bcn_stats()
1116 if (!arvif->is_up) in ath12k_open_bcn_stats()
1119 param.vdev_id = arvif->vdev_id; in ath12k_open_bcn_stats()
1122 ath12k_warn(ar->ab, "failed to request fw bcn stats: %d\n", ret); in ath12k_open_bcn_stats()
1127 ath12k_wmi_fw_stats_dump(ar, &ar->fw_stats, param.stats_id, in ath12k_open_bcn_stats()
1132 spin_lock_bh(&ar->data_lock); in ath12k_open_bcn_stats()
1133 ath12k_fw_stats_bcn_free(&ar->fw_stats.bcn); in ath12k_open_bcn_stats()
1134 spin_unlock_bh(&ar->data_lock); in ath12k_open_bcn_stats()
1136 file->private_data = no_free_ptr(buf); in ath12k_open_bcn_stats()
1143 kfree(file->private_data); in ath12k_release_bcn_stats()
1152 const char *buf = file->private_data; in ath12k_read_bcn_stats()
1168 struct ath12k *ar = inode->i_private; in ath12k_open_pdev_stats()
1170 struct ath12k_base *ab = ar->ab; in ath12k_open_pdev_stats()
1174 guard(wiphy)(ath12k_ar_to_hw(ar)->wiphy); in ath12k_open_pdev_stats()
1176 if (ah && ah->state != ATH12K_HW_STATE_ON) in ath12k_open_pdev_stats()
1177 return -ENETDOWN; in ath12k_open_pdev_stats()
1181 return -ENOMEM; in ath12k_open_pdev_stats()
1193 ath12k_wmi_fw_stats_dump(ar, &ar->fw_stats, param.stats_id, in ath12k_open_pdev_stats()
1196 file->private_data = no_free_ptr(buf); in ath12k_open_pdev_stats()
1203 kfree(file->private_data); in ath12k_release_pdev_stats()
1212 const char *buf = file->private_data; in ath12k_read_pdev_stats()
1230 ar->debug.debugfs_pdev); in ath12k_debugfs_fw_stats_register()
1242 INIT_LIST_HEAD(&ar->fw_stats.vdevs); in ath12k_debugfs_fw_stats_register()
1243 INIT_LIST_HEAD(&ar->fw_stats.bcn); in ath12k_debugfs_fw_stats_register()
1244 INIT_LIST_HEAD(&ar->fw_stats.pdevs); in ath12k_debugfs_fw_stats_register()
1246 init_completion(&ar->fw_stats_complete); in ath12k_debugfs_fw_stats_register()
1251 struct ath12k_base *ab = ar->ab; in ath12k_debugfs_register()
1252 struct ieee80211_hw *hw = ar->ah->hw; in ath12k_debugfs_register()
1256 scnprintf(pdev_name, sizeof(pdev_name), "%s%d", "mac", ar->pdev_idx); in ath12k_debugfs_register()
1258 ar->debug.debugfs_pdev = debugfs_create_dir(pdev_name, ab->debugfs_soc); in ath12k_debugfs_register()
1260 /* Create a symlink under ieee80211/phy* */ in ath12k_debugfs_register()
1261 scnprintf(buf, sizeof(buf), "../../ath12k/%pd2", ar->debug.debugfs_pdev); in ath12k_debugfs_register()
1262 ar->debug.debugfs_pdev_symlink = debugfs_create_symlink("ath12k", in ath12k_debugfs_register()
1263 hw->wiphy->debugfsdir, in ath12k_debugfs_register()
1266 if (ar->mac.sbands[NL80211_BAND_5GHZ].channels) { in ath12k_debugfs_register()
1268 ar->debug.debugfs_pdev, ar, in ath12k_debugfs_register()
1272 debugfs_create_file("tpc_stats", 0400, ar->debug.debugfs_pdev, ar, in ath12k_debugfs_register()
1274 debugfs_create_file("tpc_stats_type", 0200, ar->debug.debugfs_pdev, in ath12k_debugfs_register()
1276 init_completion(&ar->debug.tpc_complete); in ath12k_debugfs_register()
1282 ar->debug.debugfs_pdev, ar, in ath12k_debugfs_register()
1288 if (!ar->debug.debugfs_pdev) in ath12k_debugfs_unregister()
1291 /* Remove symlink under ieee80211/phy* */ in ath12k_debugfs_unregister()
1292 debugfs_remove(ar->debug.debugfs_pdev_symlink); in ath12k_debugfs_unregister()
1293 debugfs_remove_recursive(ar->debug.debugfs_pdev); in ath12k_debugfs_unregister()
1294 ar->debug.debugfs_pdev_symlink = NULL; in ath12k_debugfs_unregister()
1295 ar->debug.debugfs_pdev = NULL; in ath12k_debugfs_unregister()