Message ID | 20210721180809.90960-2-jouni@codeaurora.org |
---|---|
State | New |
Headers | show |
Series | ath11k: Add spectral scan support for QCN9074 | expand |
Jouni Malinen <jouni@codeaurora.org> writes: > From: Karthikeyan Periyasamy <periyasa@codeaurora.org> > > In IPQ8074, actual FFT bin size is two bytes but hardware reports it > with extra pad size of two bytes for each FFT bin. So finally each FFT > bin advertise as four bytes size in the collected data. This FFT pad is > not advertised in IPQ6018 platform. To accommodate this different > behavior across the platforms, introduce the hw param fft_pad_sz and use > it in spectral process. Also group all the spectral params under the new > structure in hw param structure for scalable in future. > > 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> > --- > drivers/net/wireless/ath/ath11k/core.c | 27 +++++++++++++++------- > drivers/net/wireless/ath/ath11k/hw.h | 6 ++++- > drivers/net/wireless/ath/ath11k/spectral.c | 13 +++++------ > 3 files changed, 30 insertions(+), 16 deletions(-) > > diff --git a/drivers/net/wireless/ath/ath11k/core.c b/drivers/net/wireless/ath/ath11k/core.c > index 3179495cb3c9..2a81a544b6a9 100644 > --- a/drivers/net/wireless/ath/ath11k/core.c > +++ b/drivers/net/wireless/ath/ath11k/core.c > @@ -59,8 +59,13 @@ static const struct ath11k_hw_params ath11k_hw_params[] = { > .vdev_start_delay = false, > .htt_peer_map_v2 = true, > .tcl_0_only = false, > - .spectral_fft_sz = 2, > - > + .spectral = { > + .fft_sz = 2, > + /* HW bug, expected BIN size is 2 bytes but HW report as 4 bytes. > + * so added pad size as 2 bytes to compensate the BIN size > + */ > + .fft_pad_sz = 2, > + }, > .interface_modes = BIT(NL80211_IFTYPE_STATION) | > BIT(NL80211_IFTYPE_AP) | > BIT(NL80211_IFTYPE_MESH_POINT), > @@ -101,8 +106,10 @@ static const struct ath11k_hw_params ath11k_hw_params[] = { > .vdev_start_delay = false, > .htt_peer_map_v2 = true, > .tcl_0_only = false, > - .spectral_fft_sz = 4, > - > + .spectral = { > + .fft_sz = 4, > + .fft_pad_sz = 0, > + }, > .interface_modes = BIT(NL80211_IFTYPE_STATION) | > BIT(NL80211_IFTYPE_AP) | > BIT(NL80211_IFTYPE_MESH_POINT), > @@ -143,8 +150,10 @@ static const struct ath11k_hw_params ath11k_hw_params[] = { > .vdev_start_delay = true, > .htt_peer_map_v2 = false, > .tcl_0_only = true, > - .spectral_fft_sz = 0, > - > + .spectral = { > + .fft_sz = 0, > + .fft_pad_sz = 0, > + }, > .interface_modes = BIT(NL80211_IFTYPE_STATION) | > BIT(NL80211_IFTYPE_AP), > .supports_monitor = false, > @@ -223,8 +232,10 @@ static const struct ath11k_hw_params ath11k_hw_params[] = { > .vdev_start_delay = true, > .htt_peer_map_v2 = false, > .tcl_0_only = true, > - .spectral_fft_sz = 0, > - > + .spectral = { > + .fft_sz = 0, > + .fft_pad_sz = 0, > + }, > .interface_modes = BIT(NL80211_IFTYPE_STATION) | > BIT(NL80211_IFTYPE_AP), > .supports_monitor = false, QCN9074 hw1.0 didn't have an entry. I suspect what happened was that support for wcn6855 was added between writing the patch and me committing wcn6855 patches, which confused git. I changed it so that both qcn9074 and wcn6855 have this: .spectral = { .fft_sz = 0, .fft_pad_sz = 0, }, -- https://patchwork.kernel.org/project/linux-wireless/list/ https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches
Jouni Malinen <jouni@codeaurora.org> wrote: > In IPQ8074, actual FFT bin size is two bytes but hardware reports it > with extra pad size of two bytes for each FFT bin. So finally each FFT > bin advertise as four bytes size in the collected data. This FFT pad is > not advertised in IPQ6018 platform. To accommodate this different > behavior across the platforms, introduce the hw param fft_pad_sz and use > it in spectral process. Also group all the spectral params under the new > structure in hw param structure for scalable in future. > > 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> 4 patches applied to ath-next branch of ath.git, thanks. cc2ad7541486 ath11k: Refactor spectral FFT bin size 1cae9c0009d3 ath11k: Introduce spectral hw configurable param 6dfd20c8a6cd ath11k: Fix the spectral minimum FFT bin count b72e86c07e98 ath11k: Add spectral scan support for QCN9074 -- https://patchwork.kernel.org/project/linux-wireless/patch/20210721180809.90960-2-jouni@codeaurora.org/ https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches
diff --git a/drivers/net/wireless/ath/ath11k/core.c b/drivers/net/wireless/ath/ath11k/core.c index 3179495cb3c9..2a81a544b6a9 100644 --- a/drivers/net/wireless/ath/ath11k/core.c +++ b/drivers/net/wireless/ath/ath11k/core.c @@ -59,8 +59,13 @@ static const struct ath11k_hw_params ath11k_hw_params[] = { .vdev_start_delay = false, .htt_peer_map_v2 = true, .tcl_0_only = false, - .spectral_fft_sz = 2, - + .spectral = { + .fft_sz = 2, + /* HW bug, expected BIN size is 2 bytes but HW report as 4 bytes. + * so added pad size as 2 bytes to compensate the BIN size + */ + .fft_pad_sz = 2, + }, .interface_modes = BIT(NL80211_IFTYPE_STATION) | BIT(NL80211_IFTYPE_AP) | BIT(NL80211_IFTYPE_MESH_POINT), @@ -101,8 +106,10 @@ static const struct ath11k_hw_params ath11k_hw_params[] = { .vdev_start_delay = false, .htt_peer_map_v2 = true, .tcl_0_only = false, - .spectral_fft_sz = 4, - + .spectral = { + .fft_sz = 4, + .fft_pad_sz = 0, + }, .interface_modes = BIT(NL80211_IFTYPE_STATION) | BIT(NL80211_IFTYPE_AP) | BIT(NL80211_IFTYPE_MESH_POINT), @@ -143,8 +150,10 @@ static const struct ath11k_hw_params ath11k_hw_params[] = { .vdev_start_delay = true, .htt_peer_map_v2 = false, .tcl_0_only = true, - .spectral_fft_sz = 0, - + .spectral = { + .fft_sz = 0, + .fft_pad_sz = 0, + }, .interface_modes = BIT(NL80211_IFTYPE_STATION) | BIT(NL80211_IFTYPE_AP), .supports_monitor = false, @@ -223,8 +232,10 @@ static const struct ath11k_hw_params ath11k_hw_params[] = { .vdev_start_delay = true, .htt_peer_map_v2 = false, .tcl_0_only = true, - .spectral_fft_sz = 0, - + .spectral = { + .fft_sz = 0, + .fft_pad_sz = 0, + }, .interface_modes = BIT(NL80211_IFTYPE_STATION) | BIT(NL80211_IFTYPE_AP), .supports_monitor = false, diff --git a/drivers/net/wireless/ath/ath11k/hw.h b/drivers/net/wireless/ath/ath11k/hw.h index 5b7ce4c7e489..f0349c277026 100644 --- a/drivers/net/wireless/ath/ath11k/hw.h +++ b/drivers/net/wireless/ath/ath11k/hw.h @@ -153,7 +153,11 @@ struct ath11k_hw_params { bool vdev_start_delay; bool htt_peer_map_v2; bool tcl_0_only; - u8 spectral_fft_sz; + + struct { + u8 fft_sz; + u8 fft_pad_sz; + } spectral; u16 interface_modes; bool supports_monitor; diff --git a/drivers/net/wireless/ath/ath11k/spectral.c b/drivers/net/wireless/ath/ath11k/spectral.c index 1afe67759659..11b9fec746a2 100644 --- a/drivers/net/wireless/ath/ath11k/spectral.c +++ b/drivers/net/wireless/ath/ath11k/spectral.c @@ -11,8 +11,6 @@ #define ATH11K_SPECTRAL_EVENT_TIMEOUT_MS 1 #define ATH11K_SPECTRAL_DWORD_SIZE 4 -/* HW bug, expected BIN size is 2 bytes but HW report as 4 bytes */ -#define ATH11K_SPECTRAL_BIN_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 @@ -581,12 +579,12 @@ int ath11k_spectral_process_fft(struct ath11k *ar, struct spectral_tlv *tlv; int tlv_len, bin_len, num_bins; u16 length, freq; - u8 chan_width_mhz; + u8 chan_width_mhz, bin_sz; int ret; lockdep_assert_held(&ar->spectral.lock); - if (!ab->hw_params.spectral_fft_sz) { + if (!ab->hw_params.spectral.fft_sz) { ath11k_warn(ab, "invalid bin size type for hw rev %d\n", ab->hw_rev); return -EINVAL; @@ -604,7 +602,8 @@ int ath11k_spectral_process_fft(struct ath11k *ar, return -EINVAL; } - num_bins = bin_len / ATH11K_SPECTRAL_BIN_SIZE; + bin_sz = ab->hw_params.spectral.fft_sz + ab->hw_params.spectral.fft_pad_sz; + num_bins = bin_len / bin_sz; /* Only In-band bins are useful to user for visualize */ num_bins >>= 1; @@ -654,7 +653,7 @@ int ath11k_spectral_process_fft(struct ath11k *ar, fft_sample->freq2 = __cpu_to_be16(freq); ath11k_spectral_parse_fft(fft_sample->data, fft_report->bins, num_bins, - ab->hw_params.spectral_fft_sz); + ab->hw_params.spectral.fft_sz); fft_sample->max_exp = ath11k_spectral_get_max_exp(fft_sample->max_index, search.peak_mag, @@ -962,7 +961,7 @@ int ath11k_spectral_init(struct ath11k_base *ab) ab->wmi_ab.svc_map)) return 0; - if (!ab->hw_params.spectral_fft_sz) + if (!ab->hw_params.spectral.fft_sz) return 0; for (i = 0; i < ab->num_radios; i++) {