ath9k: Prevent radar detection and spectral scan to be used concurrently

Message ID 7d04126f-0f24-b4a4-6d13-6f52046d7671@neratec.com
State New
Headers show

Commit Message

Zefir Kurtisi Nov. 21, 2016, 2:41 p.m.
On 11/21/2016 03:04 PM, Benjamin Berg wrote:
> In the case that a spectral scan is enabled the PHY errors sent by the

> hardware as part of the scanning might trigger the radar detection and

> channels might be marked as 'unusable' incorrectly. This patch fixes

> the issue by preventing the spectral scan to be enabled if DFS is used

> and only analysing the PHY errors for DFS if radar detection is enabled.

> 

> [...]


From the relevant source code portion in channel.c:ath_set_channel()

80         /* Enable radar pulse detection if on a DFS channel. Spectral
81          * scanning and radar detection can not be used concurrently.
82          */
83         if (hw->conf.radar_enabled) {
84                 u32 rxfilter;
85
86                 rxfilter = ath9k_hw_getrxfilter(ah);
87                 rxfilter |= ATH9K_RX_FILTER_PHYRADAR |
88                                 ATH9K_RX_FILTER_PHYERR;
89                 ath9k_hw_setrxfilter(ah, rxfilter);
90                 ath_dbg(common, DFS, "DFS enabled at freq %d\n",
91                         chan->center_freq);
92         } else {
93                 /* perform spectral scan if requested. */
94                 if (test_bit(ATH_OP_SCANNING, &common->op_flags) &&
95                         sc->spec_priv.spectral_mode == SPECTRAL_CHANSCAN)
96                         ath9k_cmn_spectral_scan_trigger(common, &sc->spec_priv);
97         }

it seems that spectral can't ever be activated while operating on a DFS channel.

If you need to catch the opposite case, i.e. prevent feeding pseudo-radar pulses
into the pattern detector, you just need to ensure that they depend on
hw->conf.radar_enabled. A patch like the attached one should be enough.


Cheers,
Zefir

Comments

Michal Kazior Nov. 21, 2016, 3:10 p.m. | #1
On 21 November 2016 at 15:41, Zefir Kurtisi <zefir.kurtisi@neratec.com> wrote:
> On 11/21/2016 03:04 PM, Benjamin Berg wrote:

>> In the case that a spectral scan is enabled the PHY errors sent by the

>> hardware as part of the scanning might trigger the radar detection and

>> channels might be marked as 'unusable' incorrectly. This patch fixes

>> the issue by preventing the spectral scan to be enabled if DFS is used

>> and only analysing the PHY errors for DFS if radar detection is enabled.

>>

>> [...]

>

> From the relevant source code portion in channel.c:ath_set_channel()

>

> 80         /* Enable radar pulse detection if on a DFS channel. Spectral

> 81          * scanning and radar detection can not be used concurrently.

> 82          */

> 83         if (hw->conf.radar_enabled) {

> 84                 u32 rxfilter;

> 85

> 86                 rxfilter = ath9k_hw_getrxfilter(ah);

> 87                 rxfilter |= ATH9K_RX_FILTER_PHYRADAR |

> 88                                 ATH9K_RX_FILTER_PHYERR;

> 89                 ath9k_hw_setrxfilter(ah, rxfilter);

> 90                 ath_dbg(common, DFS, "DFS enabled at freq %d\n",

> 91                         chan->center_freq);

> 92         } else {

> 93                 /* perform spectral scan if requested. */

> 94                 if (test_bit(ATH_OP_SCANNING, &common->op_flags) &&

> 95                         sc->spec_priv.spectral_mode == SPECTRAL_CHANSCAN)

> 96                         ath9k_cmn_spectral_scan_trigger(common, &sc->spec_priv);

> 97         }

>

> it seems that spectral can't ever be activated while operating on a DFS channel.

>

> If you need to catch the opposite case, i.e. prevent feeding pseudo-radar pulses

> into the pattern detector, you just need to ensure that they depend on

> hw->conf.radar_enabled. A patch like the attached one should be enough.


Good point. I guess set_channel could be oversimplified as well. I
mean, it makes sense to consider radar and spectral mutually exclusive
if they use the same phyerr code. However some chips actually seem (as
per the comment I mentioned) to distinguish the two so I don't know if
the "mutually exclusive" is true for all chips per se. Just thinking
out loud.

I also wonder if calling ieee80211_radar_detect() should have any
effect if there are no radar operated interfaces in the first place?


Michał

Patch hide | download patch | download mbox

From c24edf82e1f509490ba9dd3e34eec3ac3b309321 Mon Sep 17 00:00:00 2001
From: Zefir Kurtisi <zefir.kurtisi@neratec.com>
Date: Mon, 21 Nov 2016 15:33:45 +0100
Subject: [PATCH] ath9k: feed DFS detector only if operating on radar channel

---
 drivers/net/wireless/ath/ath9k/recv.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c
index 6697342..e4701a7 100644
--- a/drivers/net/wireless/ath/ath9k/recv.c
+++ b/drivers/net/wireless/ath/ath9k/recv.c
@@ -867,7 +867,8 @@  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 (hw->conf.radar_enabled)
+			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))
 			RX_STAT_INC(rx_spectral);
 
-- 
2.7.4