157 lines
5.6 KiB
Diff
157 lines
5.6 KiB
Diff
|
From 2e9bcd0d73243f5e49daf92508d64cc33c30da01 Mon Sep 17 00:00:00 2001
|
||
|
From: Karthikeyan Periyasamy <periyasa@codeaurora.org>
|
||
|
Date: Tue, 29 May 2018 17:01:13 +0530
|
||
|
Subject: [PATCH] ath10k: fix spectral scan for QCA9984 and QCA9888 chipsets
|
||
|
|
||
|
The spectral scan has been always broken on QCA9984 and QCA9888.
|
||
|
|
||
|
Introduce a hardware parameter 'spectral_bin_offset' to resolve this issue for
|
||
|
QCA9984 and QCA9888 chipsets. For other chipsets, the hardware parameter
|
||
|
'spectral_bin_offset' is zero so that existing behaviour is retained as it is.
|
||
|
|
||
|
In QCA9984 and QCA9888 chipsets, hardware param value 'spectral_bin_discard'
|
||
|
is 12 bytes. This 12 bytes is derived as the sum of segment index (4 bytes),
|
||
|
extra bins before the actual data (4 bytes) and extra bins after the actual
|
||
|
data (4 bytes). Always discarding (12 bytes) happens at end of the samples and
|
||
|
incorrect samples got dumped, so that user can find incorrect arrangement
|
||
|
samples in spectral scan dump.
|
||
|
|
||
|
To fix this issue, we have to discard first 8 bytes and last 4 bytes in every
|
||
|
samples, so totally 12 bytes are discarded. In every sample we need to consider
|
||
|
the offset while taking the actual spectral data. For QCA9984, QCA9888 the
|
||
|
offset is 8 bytes (segment index + extra bins before actual data).
|
||
|
|
||
|
Hardware tested: QCA9984 and QCA9888
|
||
|
Firmware tested: 10.4-3.5.3-00053
|
||
|
|
||
|
Signed-off-by: Karthikeyan Periyasamy <periyasa@codeaurora.org>
|
||
|
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||
|
---
|
||
|
drivers/net/wireless/ath/ath10k/core.c | 13 +++++++++++++
|
||
|
drivers/net/wireless/ath/ath10k/hw.h | 3 +++
|
||
|
drivers/net/wireless/ath/ath10k/spectral.c | 2 +-
|
||
|
3 files changed, 17 insertions(+), 1 deletion(-)
|
||
|
|
||
|
--- a/drivers/net/wireless/ath/ath10k/core.c
|
||
|
+++ b/drivers/net/wireless/ath/ath10k/core.c
|
||
|
@@ -72,6 +72,7 @@ static const struct ath10k_hw_params ath
|
||
|
.hw_ops = &qca988x_ops,
|
||
|
.decap_align_bytes = 4,
|
||
|
.spectral_bin_discard = 0,
|
||
|
+ .spectral_bin_offset = 0,
|
||
|
.vht160_mcs_rx_highest = 0,
|
||
|
.vht160_mcs_tx_highest = 0,
|
||
|
.n_cipher_suites = 8,
|
||
|
@@ -96,6 +97,7 @@ static const struct ath10k_hw_params ath
|
||
|
.hw_ops = &qca988x_ops,
|
||
|
.decap_align_bytes = 4,
|
||
|
.spectral_bin_discard = 0,
|
||
|
+ .spectral_bin_offset = 0,
|
||
|
.vht160_mcs_rx_highest = 0,
|
||
|
.vht160_mcs_tx_highest = 0,
|
||
|
.n_cipher_suites = 8,
|
||
|
@@ -119,6 +121,7 @@ static const struct ath10k_hw_params ath
|
||
|
.hw_ops = &qca988x_ops,
|
||
|
.decap_align_bytes = 4,
|
||
|
.spectral_bin_discard = 0,
|
||
|
+ .spectral_bin_offset = 0,
|
||
|
.vht160_mcs_rx_highest = 0,
|
||
|
.vht160_mcs_tx_highest = 0,
|
||
|
.n_cipher_suites = 8,
|
||
|
@@ -142,6 +145,7 @@ static const struct ath10k_hw_params ath
|
||
|
.hw_ops = &qca988x_ops,
|
||
|
.decap_align_bytes = 4,
|
||
|
.spectral_bin_discard = 0,
|
||
|
+ .spectral_bin_offset = 0,
|
||
|
.vht160_mcs_rx_highest = 0,
|
||
|
.vht160_mcs_tx_highest = 0,
|
||
|
.n_cipher_suites = 8,
|
||
|
@@ -165,6 +169,8 @@ static const struct ath10k_hw_params ath
|
||
|
.hw_ops = &qca988x_ops,
|
||
|
.decap_align_bytes = 4,
|
||
|
.spectral_bin_discard = 0,
|
||
|
+ .spectral_bin_offset = 0,
|
||
|
+ .spectral_bin_offset = 0,
|
||
|
.vht160_mcs_rx_highest = 0,
|
||
|
.vht160_mcs_tx_highest = 0,
|
||
|
.n_cipher_suites = 8,
|
||
|
@@ -191,6 +197,7 @@ static const struct ath10k_hw_params ath
|
||
|
.target_cpu_freq = 176000000,
|
||
|
.decap_align_bytes = 4,
|
||
|
.spectral_bin_discard = 0,
|
||
|
+ .spectral_bin_offset = 0,
|
||
|
.vht160_mcs_rx_highest = 0,
|
||
|
.vht160_mcs_tx_highest = 0,
|
||
|
.n_cipher_suites = 8,
|
||
|
@@ -220,6 +227,7 @@ static const struct ath10k_hw_params ath
|
||
|
.hw_ops = &qca99x0_ops,
|
||
|
.decap_align_bytes = 1,
|
||
|
.spectral_bin_discard = 4,
|
||
|
+ .spectral_bin_offset = 0,
|
||
|
.vht160_mcs_rx_highest = 0,
|
||
|
.vht160_mcs_tx_highest = 0,
|
||
|
.n_cipher_suites = 11,
|
||
|
@@ -250,6 +258,7 @@ static const struct ath10k_hw_params ath
|
||
|
.hw_ops = &qca99x0_ops,
|
||
|
.decap_align_bytes = 1,
|
||
|
.spectral_bin_discard = 12,
|
||
|
+ .spectral_bin_offset = 8,
|
||
|
|
||
|
/* Can do only 2x2 VHT160 or 80+80. 1560Mbps is 4x4 80Mhz
|
||
|
* or 2x2 160Mhz, long-guard-interval.
|
||
|
@@ -283,6 +292,7 @@ static const struct ath10k_hw_params ath
|
||
|
.hw_ops = &qca99x0_ops,
|
||
|
.decap_align_bytes = 1,
|
||
|
.spectral_bin_discard = 12,
|
||
|
+ .spectral_bin_offset = 8,
|
||
|
|
||
|
/* Can do only 1x1 VHT160 or 80+80. 780Mbps is 2x2 80Mhz or
|
||
|
* 1x1 160Mhz, long-guard-interval.
|
||
|
@@ -310,6 +320,7 @@ static const struct ath10k_hw_params ath
|
||
|
.hw_ops = &qca988x_ops,
|
||
|
.decap_align_bytes = 4,
|
||
|
.spectral_bin_discard = 0,
|
||
|
+ .spectral_bin_offset = 0,
|
||
|
.vht160_mcs_rx_highest = 0,
|
||
|
.vht160_mcs_tx_highest = 0,
|
||
|
.n_cipher_suites = 8,
|
||
|
@@ -335,6 +346,7 @@ static const struct ath10k_hw_params ath
|
||
|
.target_cpu_freq = 176000000,
|
||
|
.decap_align_bytes = 4,
|
||
|
.spectral_bin_discard = 0,
|
||
|
+ .spectral_bin_offset = 0,
|
||
|
.vht160_mcs_rx_highest = 0,
|
||
|
.vht160_mcs_tx_highest = 0,
|
||
|
.n_cipher_suites = 8,
|
||
|
@@ -365,6 +377,7 @@ static const struct ath10k_hw_params ath
|
||
|
.hw_ops = &qca99x0_ops,
|
||
|
.decap_align_bytes = 1,
|
||
|
.spectral_bin_discard = 4,
|
||
|
+ .spectral_bin_offset = 0,
|
||
|
.vht160_mcs_rx_highest = 0,
|
||
|
.vht160_mcs_tx_highest = 0,
|
||
|
.n_cipher_suites = 11,
|
||
|
--- a/drivers/net/wireless/ath/ath10k/hw.h
|
||
|
+++ b/drivers/net/wireless/ath/ath10k/hw.h
|
||
|
@@ -553,6 +553,9 @@ struct ath10k_hw_params {
|
||
|
|
||
|
/* Number of ciphers supported (i.e First N) in cipher_suites array */
|
||
|
int n_cipher_suites;
|
||
|
+
|
||
|
+ /* Number of bytes to be the offset for each FFT sample */
|
||
|
+ int spectral_bin_offset;
|
||
|
};
|
||
|
|
||
|
struct htt_rx_desc;
|
||
|
--- a/drivers/net/wireless/ath/ath10k/spectral.c
|
||
|
+++ b/drivers/net/wireless/ath/ath10k/spectral.c
|
||
|
@@ -145,7 +145,7 @@ int ath10k_spectral_process_fft(struct a
|
||
|
fft_sample->noise = __cpu_to_be16(phyerr->nf_chains[chain_idx]);
|
||
|
|
||
|
bins = (u8 *)fftr;
|
||
|
- bins += sizeof(*fftr);
|
||
|
+ bins += sizeof(*fftr) + ar->hw_params.spectral_bin_offset;
|
||
|
|
||
|
fft_sample->tsf = __cpu_to_be64(tsf);
|
||
|
|