ath9k_hw: Configure chain switch table and attenuation control only for active chains
Signed-off-by: Vasanthakumar Thiagarajan <vasanth@atheros.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
2be7bfe0b4
commit
2976bc5ebf
|
@ -3501,23 +3501,28 @@ static u16 ar9003_hw_ant_ctrl_chain_get(struct ath_hw *ah,
|
||||||
|
|
||||||
static void ar9003_hw_ant_ctrl_apply(struct ath_hw *ah, bool is2ghz)
|
static void ar9003_hw_ant_ctrl_apply(struct ath_hw *ah, bool is2ghz)
|
||||||
{
|
{
|
||||||
|
int chain;
|
||||||
|
static const u32 switch_chain_reg[AR9300_MAX_CHAINS] = {
|
||||||
|
AR_PHY_SWITCH_CHAIN_0,
|
||||||
|
AR_PHY_SWITCH_CHAIN_1,
|
||||||
|
AR_PHY_SWITCH_CHAIN_2,
|
||||||
|
};
|
||||||
|
|
||||||
u32 value = ar9003_hw_ant_ctrl_common_get(ah, is2ghz);
|
u32 value = ar9003_hw_ant_ctrl_common_get(ah, is2ghz);
|
||||||
|
|
||||||
REG_RMW_FIELD(ah, AR_PHY_SWITCH_COM, AR_SWITCH_TABLE_COM_ALL, value);
|
REG_RMW_FIELD(ah, AR_PHY_SWITCH_COM, AR_SWITCH_TABLE_COM_ALL, value);
|
||||||
|
|
||||||
value = ar9003_hw_ant_ctrl_common_2_get(ah, is2ghz);
|
value = ar9003_hw_ant_ctrl_common_2_get(ah, is2ghz);
|
||||||
REG_RMW_FIELD(ah, AR_PHY_SWITCH_COM_2, AR_SWITCH_TABLE_COM2_ALL, value);
|
REG_RMW_FIELD(ah, AR_PHY_SWITCH_COM_2, AR_SWITCH_TABLE_COM2_ALL, value);
|
||||||
|
|
||||||
value = ar9003_hw_ant_ctrl_chain_get(ah, 0, is2ghz);
|
for (chain = 0; chain < AR9300_MAX_CHAINS; chain++) {
|
||||||
REG_RMW_FIELD(ah, AR_PHY_SWITCH_CHAIN_0, AR_SWITCH_TABLE_ALL, value);
|
if ((ah->rxchainmask & BIT(chain)) ||
|
||||||
|
(ah->txchainmask & BIT(chain))) {
|
||||||
if (!AR_SREV_9485(ah)) {
|
value = ar9003_hw_ant_ctrl_chain_get(ah, chain,
|
||||||
value = ar9003_hw_ant_ctrl_chain_get(ah, 1, is2ghz);
|
is2ghz);
|
||||||
REG_RMW_FIELD(ah, AR_PHY_SWITCH_CHAIN_1, AR_SWITCH_TABLE_ALL,
|
REG_RMW_FIELD(ah, switch_chain_reg[chain],
|
||||||
value);
|
AR_SWITCH_TABLE_ALL, value);
|
||||||
|
}
|
||||||
value = ar9003_hw_ant_ctrl_chain_get(ah, 2, is2ghz);
|
|
||||||
REG_RMW_FIELD(ah, AR_PHY_SWITCH_CHAIN_2, AR_SWITCH_TABLE_ALL,
|
|
||||||
value);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (AR_SREV_9485(ah)) {
|
if (AR_SREV_9485(ah)) {
|
||||||
|
@ -3638,13 +3643,16 @@ static void ar9003_hw_atten_apply(struct ath_hw *ah, struct ath9k_channel *chan)
|
||||||
|
|
||||||
/* Test value. if 0 then attenuation is unused. Don't load anything. */
|
/* Test value. if 0 then attenuation is unused. Don't load anything. */
|
||||||
for (i = 0; i < 3; i++) {
|
for (i = 0; i < 3; i++) {
|
||||||
value = ar9003_hw_atten_chain_get(ah, i, chan);
|
if (ah->txchainmask & BIT(i)) {
|
||||||
REG_RMW_FIELD(ah, ext_atten_reg[i],
|
value = ar9003_hw_atten_chain_get(ah, i, chan);
|
||||||
AR_PHY_EXT_ATTEN_CTL_XATTEN1_DB, value);
|
REG_RMW_FIELD(ah, ext_atten_reg[i],
|
||||||
|
AR_PHY_EXT_ATTEN_CTL_XATTEN1_DB, value);
|
||||||
|
|
||||||
value = ar9003_hw_atten_chain_get_margin(ah, i, chan);
|
value = ar9003_hw_atten_chain_get_margin(ah, i, chan);
|
||||||
REG_RMW_FIELD(ah, ext_atten_reg[i],
|
REG_RMW_FIELD(ah, ext_atten_reg[i],
|
||||||
AR_PHY_EXT_ATTEN_CTL_XATTEN1_MARGIN, value);
|
AR_PHY_EXT_ATTEN_CTL_XATTEN1_MARGIN,
|
||||||
|
value);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue