ath9k: feed only active spectral / dfs-detector
authorZefir Kurtisi <zefir.kurtisi@neratec.com>
Fri, 25 Nov 2016 15:51:58 +0000 (17:51 +0200)
committerKalle Valo <kvalo@qca.qualcomm.com>
Thu, 1 Dec 2016 10:29:24 +0000 (12:29 +0200)
Radar pulse and spectral scan reports are provided by the HW
with the ATH9K_RXERR_PHY flag set. Those are forwarded to
the dfs-detector and spectral module for further processing.

For some older chips, the pre-conditions checked in those
modules are ambiguous, since ATH9K_PHYERR_RADAR is used to
tag both types. As a result, spectral frames are fed into
the dfs-detector and vice versa.

This could lead to a false radar detection on a non-DFS
channel (which is uncritical), but more relevant it causes
useless CPU load for processing invalid frames.

This commit ensures that the dfs-detector and spectral
collector are only fed when they are active.

Signed-off-by: Zefir Kurtisi <zefir.kurtisi@neratec.com>
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
drivers/net/wireless/ath/ath9k/recv.c

index 66973425266439a72474f9c5387be9b70c29bf89..fb4ba27d92b7b8010d1d6ce8c5b155635c088fbf 100644 (file)
@@ -867,10 +867,21 @@ static int ath9k_rx_skb_preprocess(struct ath_softc *sc,
         * can be dropped.
         */
        if (rx_stats->rs_status & ATH9K_RXERR_PHY) {
-               ath9k_dfs_process_phyerr(sc, hdr, rx_stats, rx_status->mactime);
-               if (ath_cmn_process_fft(&sc->spec_priv, hdr, rx_stats, rx_status->mactime))
+               /*
+                * DFS and spectral are mutually exclusive
+                *
+                * Since some chips use PHYERR_RADAR as indication for both, we
+                * need to double check which feature is enabled to prevent
+                * feeding spectral or dfs-detector with wrong frames.
+                */
+               if (hw->conf.radar_enabled) {
+                       ath9k_dfs_process_phyerr(sc, hdr, rx_stats,
+                                                rx_status->mactime);
+               } else if (sc->spec_priv.spectral_mode != SPECTRAL_DISABLED &&
+                          ath_cmn_process_fft(&sc->spec_priv, hdr, rx_stats,
+                                              rx_status->mactime)) {
                        RX_STAT_INC(rx_spectral);
-
+               }
                return -EINVAL;
        }