@@ -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