ath9k_hw: Read and apply thermometer settings from EEPROM
authorRajkumar Manoharan <rmanohar@qca.qualcomm.com>
Fri, 7 Sep 2012 06:45:15 +0000 (12:15 +0530)
committerJohn W. Linville <linville@tuxdriver.com>
Tue, 11 Sep 2012 19:13:53 +0000 (15:13 -0400)
Signed-off-by: Rajkumar Manoharan <rmanohar@qca.qualcomm.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
drivers/net/wireless/ath/ath9k/ar9003_phy.h

index c37fe96..2d60940 100644 (file)
@@ -3977,6 +3977,44 @@ static void ar9003_hw_xlna_bias_strength_apply(struct ath_hw *ah, bool is2ghz)
                      bias & 0x3);
 }
 
+static int ar9003_hw_get_thermometer(struct ath_hw *ah)
+{
+       struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
+       struct ar9300_base_eep_hdr *pBase = &eep->baseEepHeader;
+       int thermometer =  (pBase->miscConfiguration >> 1) & 0x3;
+
+       return --thermometer;
+}
+
+static void ar9003_hw_thermometer_apply(struct ath_hw *ah)
+{
+       int thermometer = ar9003_hw_get_thermometer(ah);
+       u8 therm_on = (thermometer < 0) ? 0 : 1;
+
+       REG_RMW_FIELD(ah, AR_PHY_65NM_CH0_RXTX4,
+                     AR_PHY_65NM_CH0_RXTX4_THERM_ON_OVR, therm_on);
+       if (ah->caps.tx_chainmask & BIT(1))
+               REG_RMW_FIELD(ah, AR_PHY_65NM_CH1_RXTX4,
+                             AR_PHY_65NM_CH0_RXTX4_THERM_ON_OVR, therm_on);
+       if (ah->caps.tx_chainmask & BIT(2))
+               REG_RMW_FIELD(ah, AR_PHY_65NM_CH2_RXTX4,
+                             AR_PHY_65NM_CH0_RXTX4_THERM_ON_OVR, therm_on);
+
+       therm_on = (thermometer < 0) ? 0 : (thermometer == 0);
+       REG_RMW_FIELD(ah, AR_PHY_65NM_CH0_RXTX4,
+                     AR_PHY_65NM_CH0_RXTX4_THERM_ON, therm_on);
+       if (ah->caps.tx_chainmask & BIT(1)) {
+               therm_on = (thermometer < 0) ? 0 : (thermometer == 1);
+               REG_RMW_FIELD(ah, AR_PHY_65NM_CH1_RXTX4,
+                             AR_PHY_65NM_CH0_RXTX4_THERM_ON, therm_on);
+       }
+       if (ah->caps.tx_chainmask & BIT(2)) {
+               therm_on = (thermometer < 0) ? 0 : (thermometer == 2);
+               REG_RMW_FIELD(ah, AR_PHY_65NM_CH2_RXTX4,
+                             AR_PHY_65NM_CH0_RXTX4_THERM_ON, therm_on);
+       }
+}
+
 static void ath9k_hw_ar9300_set_board_values(struct ath_hw *ah,
                                             struct ath9k_channel *chan)
 {
@@ -3992,6 +4030,7 @@ static void ath9k_hw_ar9300_set_board_values(struct ath_hw *ah,
                ar9003_hw_internal_regulator_apply(ah);
        ar9003_hw_apply_tuning_caps(ah);
        ar9003_hw_txend_to_xpa_off_apply(ah, is2ghz);
+       ar9003_hw_thermometer_apply(ah);
 }
 
 static void ath9k_hw_ar9300_set_addac(struct ath_hw *ah,
index 84d3d49..25d8181 100644 (file)
 
 #define AR_PHY_65NM_CH0_RXTX4_THERM_ON          0x10000000
 #define AR_PHY_65NM_CH0_RXTX4_THERM_ON_S        28
+#define AR_PHY_65NM_CH0_RXTX4_THERM_ON_OVR      0x20000000
+#define AR_PHY_65NM_CH0_RXTX4_THERM_ON_OVR_S    29
 
 #define AR_PHY_65NM_RXTX4_XLNA_BIAS            0xC0000000
 #define AR_PHY_65NM_RXTX4_XLNA_BIAS_S          30