From: Christopher Griffin On a QCN9074 (and the QCN9072, which uses its hw_params) the noise floor in WMI_CHAN_INFO_EVENTID's START_RESP is a fixed value, not a measurement. On an Arista C-360 the QCN9072 scan radio read -107 dBm +-1 on every 2.4, 5 and 6 GHz channel it visited (150 ms dwells), busy or quiet: 5540 at 52 % busy read -110, its lowest. The IPQ8074's own radios, on the same channels at the same time, read -95 to -98 and followed the channel (-96, -97, -96 on 5200/5220/5240; -95 on 5785, -98 on 5885), where the QCN9072 read -108, -107, -107, -107 and -106. -107 is also below the ~-101 dBm thermal noise of 20 MHz. Leave the noise out of a QCN9074's off-channel survey entries, so that nothing takes the placeholder for a noise floor; their time and busy counts are unchanged, as is every other chip. Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.5.r4-00683-QCAHKSWPL_SILICONZ-1 Assisted-by: Claude:claude-opus-5-5 Signed-off-by: Christopher Griffin --- drivers/net/wireless/ath/ath11k/core.c | 1 + drivers/net/wireless/ath/ath11k/hw.h | 2 ++ drivers/net/wireless/ath/ath11k/wmi.c | 8 +++++--- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/drivers/net/wireless/ath/ath11k/core.c b/drivers/net/wireless/ath/ath11k/core.c index 766ae27306f43..d6848789dcff4 100644 --- a/drivers/net/wireless/ath/ath11k/core.c +++ b/drivers/net/wireless/ath/ath11k/core.c @@ -392,6 +392,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = { .cfr_support = false, .cfr_num_stream_bufs = 0, .cfr_stream_buf_size = 0, + .chan_info_nf_invalid = true, }, { .name = "wcn6855 hw2.0", diff --git a/drivers/net/wireless/ath/ath11k/hw.h b/drivers/net/wireless/ath/ath11k/hw.h index 4996536fbd14f..202430fa5b0da 100644 --- a/drivers/net/wireless/ath/ath11k/hw.h +++ b/drivers/net/wireless/ath/ath11k/hw.h @@ -231,6 +231,8 @@ struct ath11k_hw_params { bool cfr_support; u32 cfr_num_stream_bufs; u32 cfr_stream_buf_size; + /* chan-info's noise floor is a fixed value, not a measurement */ + bool chan_info_nf_invalid; }; struct ath11k_hw_ops { diff --git a/drivers/net/wireless/ath/ath11k/wmi.c b/drivers/net/wireless/ath/ath11k/wmi.c index 08fd6795ed9e7..7c8b605b622cd 100644 --- a/drivers/net/wireless/ath/ath11k/wmi.c +++ b/drivers/net/wireless/ath/ath11k/wmi.c @@ -8031,9 +8031,11 @@ static void ath11k_chan_info_event(struct ath11k_base *ab, struct sk_buff *skb) if (ch_info_ev.cmd_flags == WMI_CHAN_INFO_START_RESP) { survey = &ar->survey[idx]; memset(survey, 0, sizeof(*survey)); - survey->noise = ch_info_ev.noise_floor; - survey->filled = SURVEY_INFO_NOISE_DBM | SURVEY_INFO_TIME | - SURVEY_INFO_TIME_BUSY; + survey->filled = SURVEY_INFO_TIME | SURVEY_INFO_TIME_BUSY; + if (!ab->hw_params.chan_info_nf_invalid) { + survey->noise = ch_info_ev.noise_floor; + survey->filled |= SURVEY_INFO_NOISE_DBM; + } survey->time = div_u64(ch_info_ev.cycle_count, cc_freq_hz); survey->time_busy = div_u64(ch_info_ev.rx_clear_count, cc_freq_hz); } --- base-commit: a3ddbb45768717b5c9f923489387cf55c838d1ad change-id: 20261101-b90-qcn9074-chan-info-nf-d80a35857ba2 Best regards, -- Christopher Griffin