Add an AR5416 workaround - force a different bias based on 2.4ghz channel frequency.
Obtained from: Linux ath9k
This commit is contained in:
parent
0ea2e01412
commit
b868c6d0b1
@ -57,6 +57,65 @@ ar2133WriteRegs(struct ath_hal *ah, u_int modesIndex, u_int freqIndex,
|
||||
freqIndex, writes);
|
||||
}
|
||||
|
||||
/*
|
||||
* Fix on 2.4 GHz band for orientation sensitivity issue by increasing
|
||||
* rf_pwd_icsyndiv.
|
||||
*
|
||||
* Theoretical Rules:
|
||||
* if 2 GHz band
|
||||
* if forceBiasAuto
|
||||
* if synth_freq < 2412
|
||||
* bias = 0
|
||||
* else if 2412 <= synth_freq <= 2422
|
||||
* bias = 1
|
||||
* else // synth_freq > 2422
|
||||
* bias = 2
|
||||
* else if forceBias > 0
|
||||
* bias = forceBias & 7
|
||||
* else
|
||||
* no change, use value from ini file
|
||||
* else
|
||||
* no change, invalid band
|
||||
*
|
||||
* 1st Mod:
|
||||
* 2422 also uses value of 2
|
||||
* <approved>
|
||||
*
|
||||
* 2nd Mod:
|
||||
* Less than 2412 uses value of 0, 2412 and above uses value of 2
|
||||
*/
|
||||
static void
|
||||
ar2133ForceBias(struct ath_hal *ah, uint16_t synth_freq)
|
||||
{
|
||||
uint32_t tmp_reg;
|
||||
int reg_writes = 0;
|
||||
uint32_t new_bias = 0;
|
||||
struct ar2133State *priv = AR2133(ah);
|
||||
|
||||
/* XXX this is a bit of a silly check for 2.4ghz channels -adrian */
|
||||
if (synth_freq >= 3000)
|
||||
return;
|
||||
|
||||
if (synth_freq < 2412)
|
||||
new_bias = 0;
|
||||
else if (synth_freq < 2422)
|
||||
new_bias = 1;
|
||||
else
|
||||
new_bias = 2;
|
||||
|
||||
/* pre-reverse this field */
|
||||
tmp_reg = ath_hal_reverseBits(new_bias, 3);
|
||||
|
||||
HALDEBUG(ah, HAL_DEBUG_ANY, "%s: Force rf_pwd_icsyndiv to %1d on %4d\n",
|
||||
__func__, new_bias, synth_freq);
|
||||
|
||||
/* swizzle rf_pwd_icsyndiv */
|
||||
ar5416ModifyRfBuffer(priv->Bank6Data, tmp_reg, 3, 181, 3);
|
||||
|
||||
/* write Bank 6 with new params */
|
||||
ath_hal_ini_bank_write(ah, &AH5416(ah)->ah_ini_bank6, priv->Bank6Data, reg_writes);
|
||||
}
|
||||
|
||||
/*
|
||||
* Take the MHz channel value and set the Channel value
|
||||
*
|
||||
@ -125,6 +184,10 @@ ar2133SetChannel(struct ath_hal *ah, const struct ieee80211_channel *chan)
|
||||
return AH_FALSE;
|
||||
}
|
||||
|
||||
/* Workaround for hw bug - AR5416 specific */
|
||||
if (AR_SREV_OWL(ah))
|
||||
ar2133ForceBias(ah, freq);
|
||||
|
||||
reg32 = (channelSel << 8) | (aModeRefSel << 2) | (bModeSynth << 1) |
|
||||
(1 << 5) | 0x1;
|
||||
|
||||
|
@ -588,6 +588,10 @@
|
||||
#define AR_XSREV_REVISION_KITE_11 1 /* Kite 1.1 */
|
||||
#define AR_XSREV_REVISION_KITE_12 2 /* Kite 1.2 */
|
||||
|
||||
#define AR_SREV_OWL(_ah) \
|
||||
((AH_PRIVATE((_ah))->ah_macVersion == AR_XSREV_VERSION_OWL_PCI) || \
|
||||
(AH_PRIVATE((_ah))->ah_macVersion == AR_XSREV_VERSION_OWL_PCIE))
|
||||
|
||||
#define AR_SREV_OWL_20_OR_LATER(_ah) \
|
||||
(AH_PRIVATE((_ah))->ah_macVersion >= AR_XSREV_VERSION_SOWL || \
|
||||
AH_PRIVATE((_ah))->ah_macRev >= AR_XSREV_REVISION_OWL_20)
|
||||
|
Loading…
Reference in New Issue
Block a user