ath9k: Fix temperature compensation
authorSujith Manoharan <c_manoha@qca.qualcomm.com>
Mon, 17 Mar 2014 09:32:48 +0000 (15:02 +0530)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 17 Mar 2014 17:44:16 +0000 (13:44 -0400)
The registers for temperature compensation need to
be programmed only for active chains. Use the TX chainmask
to make sure that this is done properly for QCA953x.

Signed-off-by: Sujith Manoharan <c_manoha@qca.qualcomm.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath9k/ar9003_eeprom.c

index d7625ecb63871b4cb8c5e51c094e2c9eda76ffb1..235053ba773765392d08427916bfb398ff52d053 100644 (file)
@@ -4792,43 +4792,54 @@ static void ar9003_hw_power_control_override(struct ath_hw *ah,
 
 tempslope:
        if (AR_SREV_9550(ah) || AR_SREV_9531(ah)) {
+               u8 txmask = (eep->baseEepHeader.txrxMask & 0xf0) >> 4;
+
                /*
                 * AR955x has tempSlope register for each chain.
                 * Check whether temp_compensation feature is enabled or not.
                 */
                if (eep->baseEepHeader.featureEnable & 0x1) {
                        if (frequency < 4000) {
-                               REG_RMW_FIELD(ah, AR_PHY_TPC_19,
-                                             AR_PHY_TPC_19_ALPHA_THERM,
-                                             eep->base_ext2.tempSlopeLow);
-                               REG_RMW_FIELD(ah, AR_PHY_TPC_19_B1,
-                                             AR_PHY_TPC_19_ALPHA_THERM,
-                                             temp_slope);
-                               REG_RMW_FIELD(ah, AR_PHY_TPC_19_B2,
-                                             AR_PHY_TPC_19_ALPHA_THERM,
-                                             eep->base_ext2.tempSlopeHigh);
+                               if (txmask & BIT(0))
+                                       REG_RMW_FIELD(ah, AR_PHY_TPC_19,
+                                                     AR_PHY_TPC_19_ALPHA_THERM,
+                                                     eep->base_ext2.tempSlopeLow);
+                               if (txmask & BIT(1))
+                                       REG_RMW_FIELD(ah, AR_PHY_TPC_19_B1,
+                                                     AR_PHY_TPC_19_ALPHA_THERM,
+                                                     temp_slope);
+                               if (txmask & BIT(2))
+                                       REG_RMW_FIELD(ah, AR_PHY_TPC_19_B2,
+                                                     AR_PHY_TPC_19_ALPHA_THERM,
+                                                     eep->base_ext2.tempSlopeHigh);
                        } else {
-                               REG_RMW_FIELD(ah, AR_PHY_TPC_19,
-                                             AR_PHY_TPC_19_ALPHA_THERM,
-                                             temp_slope);
-                               REG_RMW_FIELD(ah, AR_PHY_TPC_19_B1,
-                                             AR_PHY_TPC_19_ALPHA_THERM,
-                                             temp_slope1);
-                               REG_RMW_FIELD(ah, AR_PHY_TPC_19_B2,
-                                             AR_PHY_TPC_19_ALPHA_THERM,
-                                             temp_slope2);
+                               if (txmask & BIT(0))
+                                       REG_RMW_FIELD(ah, AR_PHY_TPC_19,
+                                                     AR_PHY_TPC_19_ALPHA_THERM,
+                                                     temp_slope);
+                               if (txmask & BIT(1))
+                                       REG_RMW_FIELD(ah, AR_PHY_TPC_19_B1,
+                                                     AR_PHY_TPC_19_ALPHA_THERM,
+                                                     temp_slope1);
+                               if (txmask & BIT(2))
+                                       REG_RMW_FIELD(ah, AR_PHY_TPC_19_B2,
+                                                     AR_PHY_TPC_19_ALPHA_THERM,
+                                                     temp_slope2);
                        }
                } else {
                        /*
                         * If temp compensation is not enabled,
                         * set all registers to 0.
                         */
-                       REG_RMW_FIELD(ah, AR_PHY_TPC_19,
-                                     AR_PHY_TPC_19_ALPHA_THERM, 0);
-                       REG_RMW_FIELD(ah, AR_PHY_TPC_19_B1,
-                                     AR_PHY_TPC_19_ALPHA_THERM, 0);
-                       REG_RMW_FIELD(ah, AR_PHY_TPC_19_B2,
-                                     AR_PHY_TPC_19_ALPHA_THERM, 0);
+                       if (txmask & BIT(0))
+                               REG_RMW_FIELD(ah, AR_PHY_TPC_19,
+                                             AR_PHY_TPC_19_ALPHA_THERM, 0);
+                       if (txmask & BIT(1))
+                               REG_RMW_FIELD(ah, AR_PHY_TPC_19_B1,
+                                             AR_PHY_TPC_19_ALPHA_THERM, 0);
+                       if (txmask & BIT(2))
+                               REG_RMW_FIELD(ah, AR_PHY_TPC_19_B2,
+                                             AR_PHY_TPC_19_ALPHA_THERM, 0);
                }
        } else {
                REG_RMW_FIELD(ah, AR_PHY_TPC_19,