mirror of
https://github.com/coolsnowwolf/lede.git
synced 2025-04-16 14:23:38 +00:00
169 lines
6.1 KiB
Diff
169 lines
6.1 KiB
Diff
From 1cae9c0009d35cec94ad8e1b06ebcb2d704626bf Mon Sep 17 00:00:00 2001
|
|
From: Karthikeyan Periyasamy <periyasa@codeaurora.org>
|
|
Date: Fri, 24 Sep 2021 16:52:46 +0300
|
|
Subject: [PATCH 013/120] ath11k: Introduce spectral hw configurable param
|
|
|
|
Below parameters have been identified as configurable across the platforms.
|
|
So to scale the spectral across the platforms, move these parameter
|
|
into hw param.
|
|
|
|
1. Maximum FFT bins
|
|
2. Summary report pad size
|
|
3. FFT report header length
|
|
|
|
Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.4.0.1-01492-QCAHKSWPL_SILICONZ-1
|
|
Tested-on: IPQ6018 hw1.0 AHB WLAN.HK.2.4.0.1-00330-QCAHKSWPL_SILICONZ-1
|
|
|
|
Signed-off-by: Karthikeyan Periyasamy <periyasa@codeaurora.org>
|
|
Signed-off-by: Jouni Malinen <jouni@codeaurora.org>
|
|
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
|
Link: https://lore.kernel.org/r/20210721180809.90960-3-jouni@codeaurora.org
|
|
---
|
|
drivers/net/wireless/ath/ath11k/core.c | 12 +++++++++
|
|
drivers/net/wireless/ath/ath11k/hw.h | 3 +++
|
|
drivers/net/wireless/ath/ath11k/spectral.c | 29 +++++++++++-----------
|
|
3 files changed, 30 insertions(+), 14 deletions(-)
|
|
|
|
--- a/drivers/net/wireless/ath/ath11k/core.c
|
|
+++ b/drivers/net/wireless/ath/ath11k/core.c
|
|
@@ -66,6 +66,9 @@ static const struct ath11k_hw_params ath
|
|
* so added pad size as 2 bytes to compensate the BIN size
|
|
*/
|
|
.fft_pad_sz = 2,
|
|
+ .summary_pad_sz = 0,
|
|
+ .fft_hdr_len = 16,
|
|
+ .max_fft_bins = 512,
|
|
},
|
|
|
|
.interface_modes = BIT(NL80211_IFTYPE_STATION) |
|
|
@@ -111,6 +114,9 @@ static const struct ath11k_hw_params ath
|
|
.spectral = {
|
|
.fft_sz = 4,
|
|
.fft_pad_sz = 0,
|
|
+ .summary_pad_sz = 0,
|
|
+ .fft_hdr_len = 16,
|
|
+ .max_fft_bins = 512,
|
|
},
|
|
|
|
.interface_modes = BIT(NL80211_IFTYPE_STATION) |
|
|
@@ -156,6 +162,9 @@ static const struct ath11k_hw_params ath
|
|
.spectral = {
|
|
.fft_sz = 0,
|
|
.fft_pad_sz = 0,
|
|
+ .summary_pad_sz = 0,
|
|
+ .fft_hdr_len = 0,
|
|
+ .max_fft_bins = 0,
|
|
},
|
|
|
|
.interface_modes = BIT(NL80211_IFTYPE_STATION) |
|
|
@@ -244,6 +253,9 @@ static const struct ath11k_hw_params ath
|
|
.spectral = {
|
|
.fft_sz = 0,
|
|
.fft_pad_sz = 0,
|
|
+ .summary_pad_sz = 0,
|
|
+ .fft_hdr_len = 0,
|
|
+ .max_fft_bins = 0,
|
|
},
|
|
|
|
.interface_modes = BIT(NL80211_IFTYPE_STATION) |
|
|
--- a/drivers/net/wireless/ath/ath11k/hw.h
|
|
+++ b/drivers/net/wireless/ath/ath11k/hw.h
|
|
@@ -157,6 +157,9 @@ struct ath11k_hw_params {
|
|
struct {
|
|
u8 fft_sz;
|
|
u8 fft_pad_sz;
|
|
+ u8 summary_pad_sz;
|
|
+ u8 fft_hdr_len;
|
|
+ u16 max_fft_bins;
|
|
} spectral;
|
|
|
|
u16 interface_modes;
|
|
--- a/drivers/net/wireless/ath/ath11k/spectral.c
|
|
+++ b/drivers/net/wireless/ath/ath11k/spectral.c
|
|
@@ -11,20 +11,20 @@
|
|
#define ATH11K_SPECTRAL_EVENT_TIMEOUT_MS 1
|
|
|
|
#define ATH11K_SPECTRAL_DWORD_SIZE 4
|
|
-#define ATH11K_SPECTRAL_ATH11K_MIN_BINS 64
|
|
-#define ATH11K_SPECTRAL_ATH11K_MIN_IB_BINS 32
|
|
-#define ATH11K_SPECTRAL_ATH11K_MAX_IB_BINS 256
|
|
+#define ATH11K_SPECTRAL_MIN_BINS 64
|
|
+#define ATH11K_SPECTRAL_MIN_IB_BINS (ATH11K_SPECTRAL_MIN_BINS >> 1)
|
|
+#define ATH11K_SPECTRAL_MAX_IB_BINS(x) ((x)->hw_params.spectral.max_fft_bins >> 1)
|
|
|
|
#define ATH11K_SPECTRAL_SCAN_COUNT_MAX 4095
|
|
|
|
/* Max channel computed by sum of 2g and 5g band channels */
|
|
#define ATH11K_SPECTRAL_TOTAL_CHANNEL 41
|
|
#define ATH11K_SPECTRAL_SAMPLES_PER_CHANNEL 70
|
|
-#define ATH11K_SPECTRAL_PER_SAMPLE_SIZE (sizeof(struct fft_sample_ath11k) + \
|
|
- ATH11K_SPECTRAL_ATH11K_MAX_IB_BINS)
|
|
+#define ATH11K_SPECTRAL_PER_SAMPLE_SIZE(x) (sizeof(struct fft_sample_ath11k) + \
|
|
+ ATH11K_SPECTRAL_MAX_IB_BINS(x))
|
|
#define ATH11K_SPECTRAL_TOTAL_SAMPLE (ATH11K_SPECTRAL_TOTAL_CHANNEL * \
|
|
ATH11K_SPECTRAL_SAMPLES_PER_CHANNEL)
|
|
-#define ATH11K_SPECTRAL_SUB_BUFF_SIZE ATH11K_SPECTRAL_PER_SAMPLE_SIZE
|
|
+#define ATH11K_SPECTRAL_SUB_BUFF_SIZE(x) ATH11K_SPECTRAL_PER_SAMPLE_SIZE(x)
|
|
#define ATH11K_SPECTRAL_NUM_SUB_BUF ATH11K_SPECTRAL_TOTAL_SAMPLE
|
|
|
|
#define ATH11K_SPECTRAL_20MHZ 20
|
|
@@ -446,8 +446,8 @@ static ssize_t ath11k_write_file_spectra
|
|
if (kstrtoul(buf, 0, &val))
|
|
return -EINVAL;
|
|
|
|
- if (val < ATH11K_SPECTRAL_ATH11K_MIN_BINS ||
|
|
- val > SPECTRAL_ATH11K_MAX_NUM_BINS)
|
|
+ if (val < ATH11K_SPECTRAL_MIN_BINS ||
|
|
+ val > ar->ab->hw_params.spectral.max_fft_bins)
|
|
return -EINVAL;
|
|
|
|
if (!is_power_of_2(val))
|
|
@@ -598,7 +598,7 @@ int ath11k_spectral_process_fft(struct a
|
|
tlv_len = FIELD_GET(SPECTRAL_TLV_HDR_LEN, __le32_to_cpu(tlv->header));
|
|
/* convert Dword into bytes */
|
|
tlv_len *= ATH11K_SPECTRAL_DWORD_SIZE;
|
|
- bin_len = tlv_len - (sizeof(*fft_report) - sizeof(*tlv));
|
|
+ bin_len = tlv_len - ab->hw_params.spectral.fft_hdr_len;
|
|
|
|
if (data_len < (bin_len + sizeof(*fft_report))) {
|
|
ath11k_warn(ab, "mismatch in expected bin len %d and data len %d\n",
|
|
@@ -611,8 +611,8 @@ int ath11k_spectral_process_fft(struct a
|
|
/* Only In-band bins are useful to user for visualize */
|
|
num_bins >>= 1;
|
|
|
|
- if (num_bins < ATH11K_SPECTRAL_ATH11K_MIN_IB_BINS ||
|
|
- num_bins > ATH11K_SPECTRAL_ATH11K_MAX_IB_BINS ||
|
|
+ if (num_bins < ATH11K_SPECTRAL_MIN_IB_BINS ||
|
|
+ num_bins > ATH11K_SPECTRAL_MAX_IB_BINS(ab) ||
|
|
!is_power_of_2(num_bins)) {
|
|
ath11k_warn(ab, "Invalid num of bins %d\n", num_bins);
|
|
return -EINVAL;
|
|
@@ -693,7 +693,7 @@ static int ath11k_spectral_process_data(
|
|
goto unlock;
|
|
}
|
|
|
|
- sample_sz = sizeof(*fft_sample) + ATH11K_SPECTRAL_ATH11K_MAX_IB_BINS;
|
|
+ sample_sz = sizeof(*fft_sample) + ATH11K_SPECTRAL_MAX_IB_BINS(ab);
|
|
fft_sample = kmalloc(sample_sz, GFP_ATOMIC);
|
|
if (!fft_sample) {
|
|
ret = -ENOBUFS;
|
|
@@ -741,7 +741,8 @@ static int ath11k_spectral_process_data(
|
|
* is 4 DWORD size (16 bytes).
|
|
* Need to remove this workaround once HW bug fixed
|
|
*/
|
|
- tlv_len = sizeof(*summary) - sizeof(*tlv);
|
|
+ tlv_len = sizeof(*summary) - sizeof(*tlv) +
|
|
+ ab->hw_params.spectral.summary_pad_sz;
|
|
|
|
if (tlv_len < (sizeof(*summary) - sizeof(*tlv))) {
|
|
ath11k_warn(ab, "failed to parse spectral summary at bytes %d tlv_len:%d\n",
|
|
@@ -904,7 +905,7 @@ static inline int ath11k_spectral_debug_
|
|
|
|
ar->spectral.rfs_scan = relay_open("spectral_scan",
|
|
ar->debug.debugfs_pdev,
|
|
- ATH11K_SPECTRAL_SUB_BUFF_SIZE,
|
|
+ ATH11K_SPECTRAL_SUB_BUFF_SIZE(ar->ab),
|
|
ATH11K_SPECTRAL_NUM_SUB_BUF,
|
|
&rfs_scan_cb, NULL);
|
|
if (!ar->spectral.rfs_scan) {
|