2 * SPDX-License-Identifier: ISC
4 * Copyright (c) 2012 Qualcomm Atheros, All Rights Reserved.
6 * Permission to use, copy, modify, and/or distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
23 #include "ah_internal.h"
25 #include "ah_desc.h" /* NB: for HAL_PHYERR* */
27 #include "ar5416/ar5416.h"
28 #include "ar5416/ar5416reg.h"
29 #include "ar5416/ar5416phy.h"
32 * Default AR9280 spectral scan parameters
34 #define AR5416_SPECTRAL_SCAN_ENA 0
35 #define AR5416_SPECTRAL_SCAN_ACTIVE 0
36 #define AR5416_SPECTRAL_SCAN_FFT_PERIOD 8
37 #define AR5416_SPECTRAL_SCAN_PERIOD 1
38 #define AR5416_SPECTRAL_SCAN_COUNT 16 //used to be 128
39 #define AR5416_SPECTRAL_SCAN_SHORT_REPEAT 1
42 #define MAX_RADAR_RSSI_THRESH 0x3f
43 #define MAX_RADAR_HEIGHT 0x3f
44 #define ENABLE_ALL_PHYERR 0xffffffff
46 static void ar5416DisableRadar(struct ath_hal *ah);
47 static void ar5416PrepSpectralScan(struct ath_hal *ah);
50 ar5416DisableRadar(struct ath_hal *ah)
55 val = OS_REG_READ(ah, AR_PHY_RADAR_0);
56 val |= AR_PHY_RADAR_0_FFT_ENA;
58 // set radar detect thresholds to max to effectively disable radar
59 val &= ~AR_PHY_RADAR_0_RRSSI;
60 val |= SM(MAX_RADAR_RSSI_THRESH, AR_PHY_RADAR_0_RRSSI);
62 val &= ~AR_PHY_RADAR_0_HEIGHT;
63 val |= SM(MAX_RADAR_HEIGHT, AR_PHY_RADAR_0_HEIGHT);
65 val &= ~(AR_PHY_RADAR_0_ENA);
66 OS_REG_WRITE(ah, AR_PHY_RADAR_0, val);
68 // disable extension radar detect
69 val = OS_REG_READ(ah, AR_PHY_RADAR_EXT);
70 OS_REG_WRITE(ah, AR_PHY_RADAR_EXT, val & ~AR_PHY_RADAR_EXT_ENA);
72 val = OS_REG_READ(ah, AR_RX_FILTER);
74 OS_REG_WRITE(ah, AR_RX_FILTER, val);
78 ar5416PrepSpectralScan(struct ath_hal *ah)
81 ar5416DisableRadar(ah);
82 OS_REG_WRITE(ah, AR_PHY_ERR, ENABLE_ALL_PHYERR);
86 ar5416ConfigureSpectralScan(struct ath_hal *ah, HAL_SPECTRAL_PARAM *ss)
90 ar5416PrepSpectralScan(ah);
92 val = OS_REG_READ(ah, AR_PHY_SPECTRAL_SCAN);
94 if (ss->ss_fft_period != HAL_SPECTRAL_PARAM_NOVAL) {
95 val &= ~AR_PHY_SPECTRAL_SCAN_FFT_PERIOD;
96 val |= SM(ss->ss_fft_period, AR_PHY_SPECTRAL_SCAN_FFT_PERIOD);
99 if (ss->ss_period != HAL_SPECTRAL_PARAM_NOVAL) {
100 val &= ~AR_PHY_SPECTRAL_SCAN_PERIOD;
101 val |= SM(ss->ss_period, AR_PHY_SPECTRAL_SCAN_PERIOD);
104 if (ss->ss_period != HAL_SPECTRAL_PARAM_NOVAL) {
105 val &= ~AR_PHY_SPECTRAL_SCAN_PERIOD;
106 val |= SM(ss->ss_period, AR_PHY_SPECTRAL_SCAN_PERIOD);
109 /* This section is different for Kiwi and Merlin */
110 if (AR_SREV_MERLIN(ah) ) {
111 if (ss->ss_count != HAL_SPECTRAL_PARAM_NOVAL) {
112 val &= ~AR_PHY_SPECTRAL_SCAN_COUNT;
113 val |= SM(ss->ss_count, AR_PHY_SPECTRAL_SCAN_COUNT);
116 if (ss->ss_short_report == AH_TRUE) {
117 val |= AR_PHY_SPECTRAL_SCAN_SHORT_REPEAT;
118 } else if (ss->ss_short_report != HAL_SPECTRAL_PARAM_NOVAL) {
119 val &= ~AR_PHY_SPECTRAL_SCAN_SHORT_REPEAT;
122 if (ss->ss_count != HAL_SPECTRAL_PARAM_NOVAL) {
124 * In Merlin, for continuous scan, scan_count = 128.
125 * In case of Kiwi, this value should be 0
127 if (ss->ss_count == 128)
129 val &= ~AR_PHY_SPECTRAL_SCAN_COUNT_KIWI;
130 val |= SM(ss->ss_count, AR_PHY_SPECTRAL_SCAN_COUNT_KIWI);
133 if (ss->ss_short_report == AH_TRUE) {
134 val |= AR_PHY_SPECTRAL_SCAN_SHORT_REPEAT_KIWI;
135 } else if (ss->ss_short_report != HAL_SPECTRAL_PARAM_NOVAL) {
136 val &= ~AR_PHY_SPECTRAL_SCAN_SHORT_REPEAT_KIWI;
139 //Select the mask to be same as before
140 val |= AR_PHY_SPECTRAL_SCAN_PHYERR_MASK_SELECT_KIWI;
142 // Enable spectral scan
143 OS_REG_WRITE(ah, AR_PHY_SPECTRAL_SCAN, val | AR_PHY_SPECTRAL_SCAN_ENA);
145 ar5416GetSpectralParams(ah, ss);
149 * Get the spectral parameter values and return them in the pe
153 ar5416GetSpectralParams(struct ath_hal *ah, HAL_SPECTRAL_PARAM *ss)
157 val = OS_REG_READ(ah, AR_PHY_SPECTRAL_SCAN);
159 ss->ss_fft_period = MS(val, AR_PHY_SPECTRAL_SCAN_FFT_PERIOD);
160 ss->ss_period = MS(val, AR_PHY_SPECTRAL_SCAN_PERIOD);
161 if (AR_SREV_MERLIN(ah) ) {
162 ss->ss_count = MS(val, AR_PHY_SPECTRAL_SCAN_COUNT);
163 ss->ss_short_report = MS(val, AR_PHY_SPECTRAL_SCAN_SHORT_REPEAT);
165 ss->ss_count = MS(val, AR_PHY_SPECTRAL_SCAN_COUNT_KIWI);
166 ss->ss_short_report = MS(val, AR_PHY_SPECTRAL_SCAN_SHORT_REPEAT_KIWI);
168 val = OS_REG_READ(ah, AR_PHY_RADAR_1);
169 ss->radar_bin_thresh_sel = MS(val, AR_PHY_RADAR_1_BIN_THRESH_SELECT);
173 ar5416IsSpectralActive(struct ath_hal *ah)
177 val = OS_REG_READ(ah, AR_PHY_SPECTRAL_SCAN);
178 return MS(val, AR_PHY_SPECTRAL_SCAN_ACTIVE);
182 ar5416IsSpectralEnabled(struct ath_hal *ah)
186 val = OS_REG_READ(ah, AR_PHY_SPECTRAL_SCAN);
187 return MS(val,AR_PHY_SPECTRAL_SCAN_ENA);
191 ar5416StartSpectralScan(struct ath_hal *ah)
195 ar5416PrepSpectralScan(ah);
197 // Activate spectral scan
198 val = OS_REG_READ(ah, AR_PHY_SPECTRAL_SCAN);
199 val |= AR_PHY_SPECTRAL_SCAN_ENA;
200 val |= AR_PHY_SPECTRAL_SCAN_ACTIVE;
201 OS_REG_WRITE(ah, AR_PHY_SPECTRAL_SCAN, val);
202 val = OS_REG_READ(ah, AR_PHY_SPECTRAL_SCAN);
203 val = OS_REG_READ(ah, AR_PHY_ERR_MASK_REG);
204 OS_REG_WRITE(ah, AR_PHY_ERR_MASK_REG, val | AR_PHY_ERR_RADAR);
208 ar5416StopSpectralScan(struct ath_hal *ah)
211 val = OS_REG_READ(ah, AR_PHY_SPECTRAL_SCAN);
213 // Deactivate spectral scan
214 val &= ~AR_PHY_SPECTRAL_SCAN_ENA;
215 val &= ~AR_PHY_SPECTRAL_SCAN_ACTIVE;
216 OS_REG_WRITE(ah, AR_PHY_SPECTRAL_SCAN, val);
217 val = OS_REG_READ(ah, AR_PHY_SPECTRAL_SCAN);
218 val = OS_REG_READ(ah, AR_PHY_ERR_MASK_REG) & (~AR_PHY_ERR_RADAR);
219 OS_REG_WRITE(ah, AR_PHY_ERR_MASK_REG, val);
223 ar5416GetSpectralConfig(struct ath_hal *ah)
227 val = OS_REG_READ(ah, AR_PHY_SPECTRAL_SCAN);
232 ar5416RestoreSpectralConfig(struct ath_hal *ah, uint32_t restoreval)
236 ar5416PrepSpectralScan(ah);
238 curval = OS_REG_READ(ah, AR_PHY_SPECTRAL_SCAN);
240 if (restoreval != curval) {
241 restoreval |= AR_PHY_SPECTRAL_SCAN_SHORT_REPEAT;
242 OS_REG_WRITE(ah, AR_PHY_SPECTRAL_SCAN, restoreval);