diff options
Diffstat (limited to 'drivers/net/wireless/ath/ath9k/ar9003_rtt.c')
| -rw-r--r-- | drivers/net/wireless/ath/ath9k/ar9003_rtt.c | 58 | 
1 files changed, 54 insertions, 4 deletions
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_rtt.c b/drivers/net/wireless/ath/ath9k/ar9003_rtt.c index 74de3539c2c..934418872e8 100644 --- a/drivers/net/wireless/ath/ath9k/ar9003_rtt.c +++ b/drivers/net/wireless/ath/ath9k/ar9003_rtt.c @@ -118,6 +118,27 @@ void ar9003_hw_rtt_load_hist(struct ath_hw *ah)  	}  } +static void ar9003_hw_patch_rtt(struct ath_hw *ah, int index, int chain) +{ +	int agc, caldac; + +	if (!test_bit(SW_PKDET_DONE, &ah->caldata->cal_flags)) +		return; + +	if ((index != 5) || (chain >= 2)) +		return; + +	agc = REG_READ_FIELD(ah, AR_PHY_65NM_RXRF_AGC(chain), +			     AR_PHY_65NM_RXRF_AGC_AGC_OVERRIDE); +	if (!agc) +		return; + +	caldac = ah->caldata->caldac[chain]; +	ah->caldata->rtt_table[chain][index] &= 0xFFFF05FF; +	caldac = (caldac & 0x20) | ((caldac & 0x1F) << 7); +	ah->caldata->rtt_table[chain][index] |= (caldac << 4); +} +  static int ar9003_hw_rtt_fill_hist_entry(struct ath_hw *ah, u8 chain, u32 index)  {  	u32 val; @@ -155,13 +176,16 @@ void ar9003_hw_rtt_fill_hist(struct ath_hw *ah)  		for (i = 0; i < MAX_RTT_TABLE_ENTRY; i++) {  			ah->caldata->rtt_table[chain][i] =  				ar9003_hw_rtt_fill_hist_entry(ah, chain, i); + +			ar9003_hw_patch_rtt(ah, i, chain); +  			ath_dbg(ath9k_hw_common(ah), CALIBRATE,  				"RTT value at idx %d, chain %d is: 0x%x\n",  				i, chain, ah->caldata->rtt_table[chain][i]);  		}  	} -	ah->caldata->rtt_done = true; +	set_bit(RTT_DONE, &ah->caldata->cal_flags);  }  void ar9003_hw_rtt_clear_hist(struct ath_hw *ah) @@ -176,7 +200,7 @@ void ar9003_hw_rtt_clear_hist(struct ath_hw *ah)  	}  	if (ah->caldata) -		ah->caldata->rtt_done = false; +		clear_bit(RTT_DONE, &ah->caldata->cal_flags);  }  bool ar9003_hw_rtt_restore(struct ath_hw *ah, struct ath9k_channel *chan) @@ -186,11 +210,37 @@ bool ar9003_hw_rtt_restore(struct ath_hw *ah, struct ath9k_channel *chan)  	if (!ah->caldata)  		return false; -	if (!ah->caldata->rtt_done) +	if (test_bit(SW_PKDET_DONE, &ah->caldata->cal_flags)) { +		if (IS_CHAN_2GHZ(chan)){ +			REG_RMW_FIELD(ah, AR_PHY_65NM_RXRF_AGC(0), +				      AR_PHY_65NM_RXRF_AGC_AGC2G_CALDAC_OVR, +				      ah->caldata->caldac[0]); +			REG_RMW_FIELD(ah, AR_PHY_65NM_RXRF_AGC(1), +				      AR_PHY_65NM_RXRF_AGC_AGC2G_CALDAC_OVR, +				      ah->caldata->caldac[1]); +		} else { +			REG_RMW_FIELD(ah, AR_PHY_65NM_RXRF_AGC(0), +				      AR_PHY_65NM_RXRF_AGC_AGC5G_CALDAC_OVR, +				      ah->caldata->caldac[0]); +			REG_RMW_FIELD(ah, AR_PHY_65NM_RXRF_AGC(1), +				      AR_PHY_65NM_RXRF_AGC_AGC5G_CALDAC_OVR, +				      ah->caldata->caldac[1]); +		} +		REG_RMW_FIELD(ah, AR_PHY_65NM_RXRF_AGC(1), +			      AR_PHY_65NM_RXRF_AGC_AGC_OVERRIDE, 0x1); +		REG_RMW_FIELD(ah, AR_PHY_65NM_RXRF_AGC(0), +			      AR_PHY_65NM_RXRF_AGC_AGC_OVERRIDE, 0x1); +	} + +	if (!test_bit(RTT_DONE, &ah->caldata->cal_flags))  		return false;  	ar9003_hw_rtt_enable(ah); -	ar9003_hw_rtt_set_mask(ah, 0x10); + +	if (test_bit(SW_PKDET_DONE, &ah->caldata->cal_flags)) +		ar9003_hw_rtt_set_mask(ah, 0x30); +	else +		ar9003_hw_rtt_set_mask(ah, 0x10);  	if (!ath9k_hw_rfbus_req(ah)) {  		ath_err(ath9k_hw_common(ah), "Could not stop baseband\n");  | 
