aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ath/ath9k/ar9003_paprd.c
diff options
context:
space:
mode:
authorMohammed Shafi Shajakhan <mohammed@qca.qualcomm.com>2011-06-23 10:33:38 -0400
committerJohn W. Linville <linville@tuxdriver.com>2011-06-27 15:09:40 -0400
commitf68e20f0f8bc57dc91d132eaa66956e9ba5aafcf (patch)
treee704a8ece6d6abc36329af4a45669d87dda1434b /drivers/net/wireless/ath/ath9k/ar9003_paprd.c
parentdcfcbd590d91e8385eb554aaed419bdebaf4c72a (diff)
ath9k_hw: Add carrier leak correction in desired gain calculation
Cc: muddin@qca.qualcomm.com Signed-off-by: Mohammed Shafi Shajakhan <mohammed@qca.qualcomm.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/ath/ath9k/ar9003_paprd.c')
-rw-r--r--drivers/net/wireless/ath/ath9k/ar9003_paprd.c34
1 files changed, 24 insertions, 10 deletions
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_paprd.c b/drivers/net/wireless/ath/ath9k/ar9003_paprd.c
index 8f6d11dfa37..6e9e892e528 100644
--- a/drivers/net/wireless/ath/ath9k/ar9003_paprd.c
+++ b/drivers/net/wireless/ath/ath9k/ar9003_paprd.c
@@ -246,13 +246,13 @@ static void ar9003_paprd_get_gain_table(struct ath_hw *ah)
246static unsigned int ar9003_get_desired_gain(struct ath_hw *ah, int chain, 246static unsigned int ar9003_get_desired_gain(struct ath_hw *ah, int chain,
247 int target_power) 247 int target_power)
248{ 248{
249 int olpc_gain_delta = 0; 249 int olpc_gain_delta = 0, cl_gain_mod;
250 int alpha_therm, alpha_volt; 250 int alpha_therm, alpha_volt;
251 int therm_cal_value, volt_cal_value; 251 int therm_cal_value, volt_cal_value;
252 int therm_value, volt_value; 252 int therm_value, volt_value;
253 int thermal_gain_corr, voltage_gain_corr; 253 int thermal_gain_corr, voltage_gain_corr;
254 int desired_scale, desired_gain = 0; 254 int desired_scale, desired_gain = 0;
255 u32 reg; 255 u32 reg_olpc = 0, reg_cl_gain = 0;
256 256
257 REG_CLR_BIT(ah, AR_PHY_PAPRD_TRAINER_STAT1, 257 REG_CLR_BIT(ah, AR_PHY_PAPRD_TRAINER_STAT1,
258 AR_PHY_PAPRD_TRAINER_STAT1_PAPRD_TRAIN_DONE); 258 AR_PHY_PAPRD_TRAINER_STAT1_PAPRD_TRAIN_DONE);
@@ -271,15 +271,29 @@ static unsigned int ar9003_get_desired_gain(struct ath_hw *ah, int chain,
271 volt_value = REG_READ_FIELD(ah, AR_PHY_BB_THERM_ADC_4, 271 volt_value = REG_READ_FIELD(ah, AR_PHY_BB_THERM_ADC_4,
272 AR_PHY_BB_THERM_ADC_4_LATEST_VOLT_VALUE); 272 AR_PHY_BB_THERM_ADC_4_LATEST_VOLT_VALUE);
273 273
274 if (chain == 0) 274 switch (chain) {
275 reg = AR_PHY_TPC_11_B0; 275 case 0:
276 else if (chain == 1) 276 reg_olpc = AR_PHY_TPC_11_B0;
277 reg = AR_PHY_TPC_11_B1; 277 reg_cl_gain = AR_PHY_CL_TAB_0;
278 else 278 break;
279 reg = AR_PHY_TPC_11_B2; 279 case 1:
280 reg_olpc = AR_PHY_TPC_11_B1;
281 reg_cl_gain = AR_PHY_CL_TAB_1;
282 break;
283 case 2:
284 reg_olpc = AR_PHY_TPC_11_B2;
285 reg_cl_gain = AR_PHY_CL_TAB_2;
286 break;
287 default:
288 ath_dbg(ath9k_hw_common(ah), ATH_DBG_CALIBRATE,
289 "Invalid chainmask: %d\n", chain);
290 break;
291 }
280 292
281 olpc_gain_delta = REG_READ_FIELD(ah, reg, 293 olpc_gain_delta = REG_READ_FIELD(ah, reg_olpc,
282 AR_PHY_TPC_11_OLPC_GAIN_DELTA); 294 AR_PHY_TPC_11_OLPC_GAIN_DELTA);
295 cl_gain_mod = REG_READ_FIELD(ah, reg_cl_gain,
296 AR_PHY_CL_TAB_CL_GAIN_MOD);
283 297
284 if (olpc_gain_delta >= 128) 298 if (olpc_gain_delta >= 128)
285 olpc_gain_delta = olpc_gain_delta - 256; 299 olpc_gain_delta = olpc_gain_delta - 256;
@@ -289,7 +303,7 @@ static unsigned int ar9003_get_desired_gain(struct ath_hw *ah, int chain,
289 voltage_gain_corr = (alpha_volt * (volt_value - volt_cal_value) + 303 voltage_gain_corr = (alpha_volt * (volt_value - volt_cal_value) +
290 (128 / 2)) / 128; 304 (128 / 2)) / 128;
291 desired_gain = target_power - olpc_gain_delta - thermal_gain_corr - 305 desired_gain = target_power - olpc_gain_delta - thermal_gain_corr -
292 voltage_gain_corr + desired_scale; 306 voltage_gain_corr + desired_scale + cl_gain_mod;
293 307
294 return desired_gain; 308 return desired_gain;
295} 309}