Commit 44b7d483 authored by Michal Kazior's avatar Michal Kazior Committed by Kalle Valo

ath10k: fix inconsistent survey reports

In some cases some channel survey data was
reported incorrect.

Channel info events were expected to come in pairs
without and with COMPLETE flag set respectively
for each channel visit during scan.

The known deviation from this is rule for last
scan chan info and first (next) scan chan info
both have COMPLETE flag set. This was either
programmed with the intent of providing BSS cycle
count info or this is an artefact of firmware scan
state machine. Either way this is useless due to
short wraparound time, wraparound quirks and no
overflow notification.

Survey dumps now include only data gathered during
scan channel visits that can be computed
correctly.

This should improve hostapd ACS a little bit.
Reported-by: default avatarSrinivasa Duvvuri <sduvvuri@chromium.org>
Signed-off-by: default avatarMichal Kazior <michal.kazior@tieto.com>
Signed-off-by: default avatarKalle Valo <kvalo@qca.qualcomm.com>
parent 587f7031
...@@ -701,6 +701,14 @@ struct ath10k { ...@@ -701,6 +701,14 @@ struct ath10k {
u32 survey_last_cycle_count; u32 survey_last_cycle_count;
struct survey_info survey[ATH10K_NUM_CHANS]; struct survey_info survey[ATH10K_NUM_CHANS];
/* Channel info events are expected to come in pairs without and with
* COMPLETE flag set respectively for each channel visit during scan.
*
* However there are deviations from this rule. This flag is used to
* avoid reporting garbage data.
*/
bool ch_info_can_report_survey;
struct dfs_pattern_detector *dfs_detector; struct dfs_pattern_detector *dfs_detector;
unsigned long tx_paused; /* see ATH10K_TX_PAUSE_ */ unsigned long tx_paused; /* see ATH10K_TX_PAUSE_ */
......
...@@ -1637,20 +1637,22 @@ void ath10k_wmi_event_chan_info(struct ath10k *ar, struct sk_buff *skb) ...@@ -1637,20 +1637,22 @@ void ath10k_wmi_event_chan_info(struct ath10k *ar, struct sk_buff *skb)
} }
if (cmd_flags & WMI_CHAN_INFO_FLAG_COMPLETE) { if (cmd_flags & WMI_CHAN_INFO_FLAG_COMPLETE) {
/* During scanning chan info is reported twice for each if (ar->ch_info_can_report_survey) {
* visited channel. The reported cycle count is global survey = &ar->survey[idx];
* and per-channel cycle count must be calculated */ survey->noise = noise_floor;
survey->filled = SURVEY_INFO_NOISE_DBM;
survey = &ar->survey[idx];
survey->noise = noise_floor; ath10k_hw_fill_survey_time(ar,
survey->filled = SURVEY_INFO_NOISE_DBM; survey,
cycle_count,
ath10k_hw_fill_survey_time(ar, rx_clear_count,
survey, ar->survey_last_cycle_count,
cycle_count, ar->survey_last_rx_clear_count);
rx_clear_count, }
ar->survey_last_cycle_count,
ar->survey_last_rx_clear_count); ar->ch_info_can_report_survey = false;
} else {
ar->ch_info_can_report_survey = true;
} }
ar->survey_last_rx_clear_count = rx_clear_count; ar->survey_last_rx_clear_count = rx_clear_count;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment