Skip to content

Commit 6398dc0

Browse files
Sujithlinvjw
authored andcommitted
ath9k_hw: fix noisefloor history buffer usage on AR9271
Noisefloor calibration involves querying hardware for samples and storing this information on a history buffer in hardware for actual noisefloor calibration processing in hardware. The history buffer supports collecting information for all Atheros hardware, one history buffer slot for each chain on each channel used for MIMO operation. For current hardware this means one history buffer slot for each chain on both the control (or primary) channel and the extension (or secondary) channel. We know which noisefloor registers to poke for collecting noisefloor data through the chainmask. For AR9285 and AR9271 devices, both 1x1, the chaimmask is defined as 0x9 = 0b0001001. The first four bits represent each chain out of a maximum of 4 chains [0-3] on the primary channel. The last four bits represent each chain on the extension channel. A chainmask of 0x9 therefore indicates chain 1 is active on both the primary and the extension channel. AR9271 only requires collecting and storing noisefloor history buffer data for the first chain on both the control and extension channel (nfarray[0] and nfarray[3]) so fix the code and avoid which reads and writes to the history buffer for the other chains. Since the noisefloor varies depending on the number of chains your device supports also initialize the noisefloor history buffer with reasonable values seen on 1x1 devices such as AR9285. Signed-off-by: Sujith <[email protected]> Signed-off-by: Vasanthakumar Thiagarajan <[email protected]> Signed-off-by: Luis R. Rodriguez <[email protected]> Signed-off-by: John W. Linville <[email protected]>
1 parent 14b3af3 commit 6398dc0

File tree

1 file changed

+4
-4
lines changed
  • drivers/net/wireless/ath/ath9k

1 file changed

+4
-4
lines changed

drivers/net/wireless/ath/ath9k/calib.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ static void ath9k_hw_do_getnf(struct ath_hw *ah,
103103
"NF calibrated [ctl] [chain 0] is %d\n", nf);
104104
nfarray[0] = nf;
105105

106-
if (!AR_SREV_9285(ah)) {
106+
if (!AR_SREV_9285(ah) && !AR_SREV_9271(ah)) {
107107
if (AR_SREV_9280_10_OR_LATER(ah))
108108
nf = MS(REG_READ(ah, AR_PHY_CH1_CCA),
109109
AR9280_PHY_CH1_MINCCA_PWR);
@@ -141,7 +141,7 @@ static void ath9k_hw_do_getnf(struct ath_hw *ah,
141141
"NF calibrated [ext] [chain 0] is %d\n", nf);
142142
nfarray[3] = nf;
143143

144-
if (!AR_SREV_9285(ah)) {
144+
if (!AR_SREV_9285(ah) && !AR_SREV_9271(ah)) {
145145
if (AR_SREV_9280_10_OR_LATER(ah))
146146
nf = MS(REG_READ(ah, AR_PHY_CH1_EXT_CCA),
147147
AR9280_PHY_CH1_EXT_MINCCA_PWR);
@@ -621,7 +621,7 @@ void ath9k_hw_loadnf(struct ath_hw *ah, struct ath9k_channel *chan)
621621
u8 chainmask, rx_chain_status;
622622

623623
rx_chain_status = REG_READ(ah, AR_PHY_RX_CHAINMASK);
624-
if (AR_SREV_9285(ah))
624+
if (AR_SREV_9285(ah) || AR_SREV_9271(ah))
625625
chainmask = 0x9;
626626
else if (AR_SREV_9280(ah) || AR_SREV_9287(ah)) {
627627
if ((rx_chain_status & 0x2) || (rx_chain_status & 0x4))
@@ -715,7 +715,7 @@ void ath9k_init_nfcal_hist_buffer(struct ath_hw *ah)
715715

716716
if (AR_SREV_9280(ah))
717717
noise_floor = AR_PHY_CCA_MAX_AR9280_GOOD_VALUE;
718-
else if (AR_SREV_9285(ah))
718+
else if (AR_SREV_9285(ah) || AR_SREV_9271(ah))
719719
noise_floor = AR_PHY_CCA_MAX_AR9285_GOOD_VALUE;
720720
else if (AR_SREV_9287(ah))
721721
noise_floor = AR_PHY_CCA_MAX_AR9287_GOOD_VALUE;

0 commit comments

Comments
 (0)