OSDN Git Service

ath9k_hw: Configure chain switch table and attenuation control only for active chains
authorVasanthakumar Thiagarajan <vasanth@atheros.com>
Tue, 19 Apr 2011 13:59:15 +0000 (19:29 +0530)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 25 Apr 2011 18:50:12 +0000 (14:50 -0400)
Signed-off-by: Vasanthakumar Thiagarajan <vasanth@atheros.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath9k/ar9003_eeprom.c

index 262fb62..fd9b8c4 100644 (file)
@@ -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)
 {
+       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);
+
        REG_RMW_FIELD(ah, AR_PHY_SWITCH_COM, AR_SWITCH_TABLE_COM_ALL, value);
 
        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);
 
-       value = ar9003_hw_ant_ctrl_chain_get(ah, 0, is2ghz);
-       REG_RMW_FIELD(ah, AR_PHY_SWITCH_CHAIN_0, AR_SWITCH_TABLE_ALL, value);
-
-       if (!AR_SREV_9485(ah)) {
-               value = ar9003_hw_ant_ctrl_chain_get(ah, 1, is2ghz);
-               REG_RMW_FIELD(ah, AR_PHY_SWITCH_CHAIN_1, 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);
+       for (chain = 0; chain < AR9300_MAX_CHAINS; chain++) {
+               if ((ah->rxchainmask & BIT(chain)) ||
+                   (ah->txchainmask & BIT(chain))) {
+                       value = ar9003_hw_ant_ctrl_chain_get(ah, chain,
+                                                            is2ghz);
+                       REG_RMW_FIELD(ah, switch_chain_reg[chain],
+                                     AR_SWITCH_TABLE_ALL, value);
+               }
        }
 
        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. */
        for (i = 0; i < 3; i++) {
-               value = ar9003_hw_atten_chain_get(ah, i, chan);
-               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);
-               REG_RMW_FIELD(ah, ext_atten_reg[i],
-                             AR_PHY_EXT_ATTEN_CTL_XATTEN1_MARGIN, value);
+               if (ah->txchainmask & BIT(i)) {
+                       value = ar9003_hw_atten_chain_get(ah, i, chan);
+                       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);
+                       REG_RMW_FIELD(ah, ext_atten_reg[i],
+                                     AR_PHY_EXT_ATTEN_CTL_XATTEN1_MARGIN,
+                                     value);
+               }
        }
 }