diff options
author | Nick Kossifidis <mick@madwifi-project.org> | 2009-08-09 20:27:59 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2009-08-14 09:13:56 -0400 |
commit | d1cb0bdac180a4afdd3c001acb2618d2a62d9abe (patch) | |
tree | c27715544627c038bbf5f032a46a864342ab8394 /drivers/net/wireless/ath | |
parent | c38e7a9348f725be0ea2493454db9e6d44fb7e0c (diff) |
ath5k: Linear PCDAC code fixes
* Set correct xpd curve indices for high/low gain curves during
rfbuffer setup on RF5112B with both calibration curves available.
* Don't return zero min power when we have the same pcdac value
twice because it breaks interpolation. Instead return the right
x barrier as we do when we have equal power levels for 2 different
pcdac values.
Signed-off-by: Nick Kossifidis <mickflemm@gmail.com>
Acked-by: Bob Copeland <me@bobcopeland.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/ath')
-rw-r--r-- | drivers/net/wireless/ath/ath5k/phy.c | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/drivers/net/wireless/ath/ath5k/phy.c b/drivers/net/wireless/ath/ath5k/phy.c index 2075ba993966..6afba98f6adb 100644 --- a/drivers/net/wireless/ath/ath5k/phy.c +++ b/drivers/net/wireless/ath/ath5k/phy.c | |||
@@ -740,13 +740,22 @@ int ath5k_hw_rfregs_init(struct ath5k_hw *ah, struct ieee80211_channel *channel, | |||
740 | AR5K_RF_XPD_GAIN, true); | 740 | AR5K_RF_XPD_GAIN, true); |
741 | 741 | ||
742 | } else { | 742 | } else { |
743 | /* TODO: Set high and low gain bits */ | 743 | u8 *pdg_curve_to_idx = ee->ee_pdc_to_idx[ee_mode]; |
744 | ath5k_hw_rfb_op(ah, rf_regs, | 744 | if (ee->ee_pd_gains[ee_mode] > 1) { |
745 | ee->ee_x_gain[ee_mode], | 745 | ath5k_hw_rfb_op(ah, rf_regs, |
746 | pdg_curve_to_idx[0], | ||
746 | AR5K_RF_PD_GAIN_LO, true); | 747 | AR5K_RF_PD_GAIN_LO, true); |
747 | ath5k_hw_rfb_op(ah, rf_regs, | 748 | ath5k_hw_rfb_op(ah, rf_regs, |
748 | ee->ee_x_gain[ee_mode], | 749 | pdg_curve_to_idx[1], |
749 | AR5K_RF_PD_GAIN_HI, true); | 750 | AR5K_RF_PD_GAIN_HI, true); |
751 | } else { | ||
752 | ath5k_hw_rfb_op(ah, rf_regs, | ||
753 | pdg_curve_to_idx[0], | ||
754 | AR5K_RF_PD_GAIN_LO, true); | ||
755 | ath5k_hw_rfb_op(ah, rf_regs, | ||
756 | pdg_curve_to_idx[0], | ||
757 | AR5K_RF_PD_GAIN_HI, true); | ||
758 | } | ||
750 | 759 | ||
751 | /* Lower synth voltage on Rev 2 */ | 760 | /* Lower synth voltage on Rev 2 */ |
752 | ath5k_hw_rfb_op(ah, rf_regs, 2, | 761 | ath5k_hw_rfb_op(ah, rf_regs, 2, |
@@ -1896,8 +1905,9 @@ ath5k_get_linear_pcdac_min(const u8 *stepL, const u8 *stepR, | |||
1896 | s16 min_pwrL, min_pwrR; | 1905 | s16 min_pwrL, min_pwrR; |
1897 | s16 pwr_i; | 1906 | s16 pwr_i; |
1898 | 1907 | ||
1899 | if (WARN_ON(stepL[0] == stepL[1] || stepR[0] == stepR[1])) | 1908 | /* Some vendors write the same pcdac value twice !!! */ |
1900 | return 0; | 1909 | if (stepL[0] == stepL[1] || stepR[0] == stepR[1]) |
1910 | return max(pwrL[0], pwrR[0]); | ||
1901 | 1911 | ||
1902 | if (pwrL[0] == pwrL[1]) | 1912 | if (pwrL[0] == pwrL[1]) |
1903 | min_pwrL = pwrL[0]; | 1913 | min_pwrL = pwrL[0]; |