⬢ DragonFlyBSD Kernel Audit
DF-5113 / fix.diff
← back to finding ↓ download raw
@@ -44,11 +44,26 @@
 static void ar5416DisableRadar(struct ath_hal *ah);
 static void ar5416PrepSpectralScan(struct ath_hal *ah);
 
+/*
+ * Radar-detect register state saved by ar5416PrepSpectralScan() so that
+ * ar5416StopSpectralScan() can restore it.  Spectral scan is per-chip
+ * (single radio), so one save area is sufficient.
+ */
+static int ar5416_spectral_radar_saved = 0;
+static uint32_t ar5416_radar0_saved, ar5416_radar_ext_saved;
+static uint32_t ar5416_rx_filter_saved;
+
 static void
 ar5416DisableRadar(struct ath_hal *ah)
 {
 	uint32_t val;
 
+	/* save the radar-detect configuration before clobbering it */
+	ar5416_radar0_saved = OS_REG_READ(ah, AR_PHY_RADAR_0);
+	ar5416_radar_ext_saved = OS_REG_READ(ah, AR_PHY_RADAR_EXT);
+	ar5416_rx_filter_saved = OS_REG_READ(ah, AR_RX_FILTER);
+	ar5416_spectral_radar_saved = 1;
+
 	// Enable radar FFT
 	val = OS_REG_READ(ah, AR_PHY_RADAR_0);
 	val |= AR_PHY_RADAR_0_FFT_ENA;
@@ -212,9 +227,16 @@
 	val &= ~AR_PHY_SPECTRAL_SCAN_ENA;
 	val &= ~AR_PHY_SPECTRAL_SCAN_ACTIVE;
 	OS_REG_WRITE(ah, AR_PHY_SPECTRAL_SCAN, val);
-	val = OS_REG_READ(ah, AR_PHY_SPECTRAL_SCAN);
 	val = OS_REG_READ(ah, AR_PHY_ERR_MASK_REG) & (~AR_PHY_ERR_RADAR);
 	OS_REG_WRITE(ah, AR_PHY_ERR_MASK_REG, val);
+
+	/* restore the radar-detect configuration PrepSpectralScan disabled */
+	if (ar5416_spectral_radar_saved) {
+		OS_REG_WRITE(ah, AR_PHY_RADAR_0, ar5416_radar0_saved);
+		OS_REG_WRITE(ah, AR_PHY_RADAR_EXT, ar5416_radar_ext_saved);
+		OS_REG_WRITE(ah, AR_RX_FILTER, ar5416_rx_filter_saved);
+		ar5416_spectral_radar_saved = 0;
+	}
 }
 
 uint32_t