ath5k: Update gain_F calibration code and add documentation
PATCH 2/5 ath5k: Update gain_F calibration code and add documentation
* Update and cleanup rf gain optimization code
* Add comments and refferences to docs and use sane function names
* Use only step index on ath5k_gain, no need to have a pointer to the current step since we can determine te step from it's index, this also allows us to put all other structs on rfgain.h and cleanup ath5k.h a little
* No need for ah_rfgain variable, we use ah_gain.g_state for everything
* Tested on RF2112B chip but gain_F calibration is not yet done
(we will finish this on the next patch where we'll rewrite rf-buffer handling)
* Use initial rf gain settings for 2316 and 2317 SoCs introduced on a previous patch
It seems big but it's mostly cleanup, very few functional changes have been made on phy.c
--- drivers/net/wireless/ath5k/ath5k.h | 51 +---- drivers/net/wireless/ath5k/attach.c | 2 +- drivers/net/wireless/ath5k/base.c | 2 +- drivers/net/wireless/ath5k/phy.c | 403 +++++++++++++++++++++----------- drivers/net/wireless/ath5k/reset.c | 5 +- drivers/net/wireless/ath5k/rfbuffer.h | 3 + drivers/net/wireless/ath5k/rfgain.h | 40 +++- 7 files changed, 319 insertions(+), 187 deletions(-)
drivers/net/wireless/ath5k/ath5k.h +11 -40
@@ -649,49 +649,21 @@ struct ath5k_beacon_state {enum ath5k_rfgain {AR5K_RFGAIN_INACTIVE =0 , +AR5K_RFGAIN_ACTIVE ,AR5K_RFGAIN_READ_REQUESTED ,AR5K_RFGAIN_NEED_CHANGE , }; -#define AR5K_GAIN_CRN_FIX_BITS_5111 4 -#define AR5K_GAIN_CRN_FIX_BITS_5112 7 -#define AR5K_GAIN_CRN_MAX_FIX_BITS AR5K_GAIN_CRN_FIX_BITS_5112 -#define AR5K_GAIN_DYN_ADJUST_HI_MARGIN 15 -#define AR5K_GAIN_DYN_ADJUST_LO_MARGIN 20 -#define AR5K_GAIN_CCK_PROBE_CORR 5 -#define AR5K_GAIN_CCK_OFDM_GAIN_DELTA 15 -#define AR5K_GAIN_STEP_COUNT 10 -#define AR5K_GAIN_PARAM_TX_CLIP 0 -#define AR5K_GAIN_PARAM_PD_90 1 -#define AR5K_GAIN_PARAM_PD_84 2 -#define AR5K_GAIN_PARAM_GAIN_SEL 3 -#define AR5K_GAIN_PARAM_MIX_ORN 0 -#define AR5K_GAIN_PARAM_PD_138 1 -#define AR5K_GAIN_PARAM_PD_137 2 -#define AR5K_GAIN_PARAM_PD_136 3 -#define AR5K_GAIN_PARAM_PD_132 4 -#define AR5K_GAIN_PARAM_PD_131 5 -#define AR5K_GAIN_PARAM_PD_130 6 -#define AR5K_GAIN_CHECK_ADJUST (_g) \ - ((_g)->g_current <= (_g)->g_low || (_g)->g_current >= (_g)->g_high) - -struct ath5k_gain_opt_step { -s16 gos_param[AR5K_GAIN_CRN_MAX_FIX_BITS ]; -s32 gos_gain; -}; -struct ath5k_gain { -u32 g_step_idx; -u32 g_current; -u32 g_target; -u32 g_low; -u32 g_high; -u32 g_f_corr; -u32 g_active; -const struct ath5k_gain_opt_step *g_step; +u8 g_step_idx; +u8 g_current; +u8 g_target; +u8 g_low; +u8 g_high; +u8 g_f_corr; +u8 g_state; }; -/********************\ COMMON DEFINITIONS \********************/
@@ -1053,7 +1025,6 @@ struct ath5k_hw {bool ah_running;bool ah_single_chip;bool ah_combined_mic; -enum ath5k_rfgain ah_rf_gain;u32 ah_mac_srev;u16 ah_mac_version;
@@ -1262,9 +1233,9 @@ extern int ath5k_hw_write_initvals(struct ath5k_hw *ah, u8 mode, bool change_cha/* Initialize RF */ extern int ath5k_hw_rfregs (struct ath5k_hw *ah,struct ieee80211_channel *channel,unsigned int mode); -extern int ath5k_hw_rfgain (struct ath5k_hw *ah,unsigned int freq); -extern enum ath5k_rfgain ath5k_hw_get_rf_gain (struct ath5k_hw *ah); -extern int ath5k_hw_set_rfgain_opt (struct ath5k_hw *ah); +extern int ath5k_hw_rfgain_init (struct ath5k_hw *ah,unsigned int freq); +extern enum ath5k_rfgain ath5k_hw_gainf_calibrate (struct ath5k_hw *ah); +extern int ath5k_hw_rfgain_opt_init (struct ath5k_hw *ah);/* PHY/RF channel functions */ extern bool ath5k_channel_ok (struct ath5k_hw *ah,u16 freq,unsigned int flags);extern int ath5k_hw_channel (struct ath5k_hw *ah,struct ieee80211_channel *channel);
drivers/net/wireless/ath5k/attach.c +1 -1
@@ -331,7 +331,7 @@ struct ath5k_hw *ath5k_hw_attach(struct ath5k_softc *sc, u8 mac_version)ath5k_hw_set_associd (ah, ah->ah_bssid,0 );ath5k_hw_set_opmode (ah); -ath5k_hw_set_rfgain_opt (ah); +ath5k_hw_rfgain_opt_init (ah);return ah; err_free:
drivers/net/wireless/ath5k/base.c +1 -1
@@ -2505,7 +2505,7 @@ ath5k_calibrate(unsigned long data)ieee80211_frequency_to_channel (sc->curchan->center_freq), sc->curchan->hw_value); -if (ath5k_hw_get_rf_gain (ah) ==AR5K_RFGAIN_NEED_CHANGE ) { +if (ath5k_hw_gainf_calibrate (ah) ==AR5K_RFGAIN_NEED_CHANGE ) {/* * Rfgain is out of bounds, reset the chip * to load new gain values.
drivers/net/wireless/ath5k/phy.c +264 -139
514 lines not on this page · raw message
drivers/net/wireless/ath5k/reset.c +1 -4
@@ -441,9 +441,6 @@ int ath5k_hw_reset(struct ath5k_hw *ah, enum nl80211_iftype op_mode, s_led[1 ] =ath5k_hw_reg_read (ah,AR5K_GPIOCR ); s_led[2 ] =ath5k_hw_reg_read (ah,AR5K_GPIODO ); -if (change_channel && ah->ah_rf_banks !=NULL ) -ath5k_hw_get_rf_gain (ah); -/*Wakeup the device*/ ret =ath5k_hw_nic_wakeup (ah, channel->hw_value, false);
@@ -530,7 +527,7 @@ int ath5k_hw_reset(struct ath5k_hw *ah, enum nl80211_iftype op_mode,* Write initial RF gain settings * This should work for both 5111/5112 */ - ret =ath5k_hw_rfgain (ah, freq); + ret =ath5k_hw_rfgain_init (ah, freq);if (ret)return ret;
drivers/net/wireless/ath5k/rfbuffer.h +3 -0
@@ -111,6 +111,7 @@ enum ath5k_rf_regs_idx {#define AR5K_RF5111_GAIN_I { 6, 29, 0 }#define AR5K_RF5111_PLO_SEL { 1, 4, 0 }#define AR5K_RF5111_RFGAIN_SEL { 1, 36, 0 } +#define AR5K_RF5111_RFGAIN_STEP { 6, 37, 0 }/* Only on AR5212 BaseBand and up */ #define AR5K_RF5111_WAIT_S { 5, 19, 0 }#define AR5K_RF5111_WAIT_I { 5, 24, 0 }
@@ -235,7 +236,9 @@ static const struct ath5k_ini_rfbuffer rfb_5111[] = {/* BANK 7 (Common) len pos col */ #define AR5K_RF5112X_GAIN_I { 6, 14, 0 } +#define AR5K_RF5112X_MIXVGA_OVR { 1, 36, 0 }#define AR5K_RF5112X_MIXGAIN_OVR { 2, 37, 0 } +#define AR5K_RF5112X_MIXGAIN_STEP { 4, 32, 0 }#define AR5K_RF5112X_PD_DELAY_A { 4, 58, 0 }#define AR5K_RF5112X_PD_DELAY_B { 4, 62, 0 }#define AR5K_RF5112X_PD_DELAY_XR { 4, 66, 0 }
drivers/net/wireless/ath5k/rfgain.h +38 -2
@@ -441,12 +441,38 @@ static const struct ath5k_ini_rfgain rfgain_2425[] = { { AR5K_RF_GAIN(63), { 0x00000000, 0x000000f9 } }, }; +#define AR5K_GAIN_CRN_FIX_BITS_5111 4 +#define AR5K_GAIN_CRN_FIX_BITS_5112 7 +#define AR5K_GAIN_CRN_MAX_FIX_BITS AR5K_GAIN_CRN_FIX_BITS_5112 +#define AR5K_GAIN_DYN_ADJUST_HI_MARGIN 15 +#define AR5K_GAIN_DYN_ADJUST_LO_MARGIN 20 +#define AR5K_GAIN_CCK_PROBE_CORR 5 +#define AR5K_GAIN_CCK_OFDM_GAIN_DELTA 15 +#define AR5K_GAIN_STEP_COUNT 10 + +/* Check if our current measurement is inside our +* current variable attenuation window */ +#define AR5K_GAIN_CHECK_ADJUST (_g) \ + ((_g)->g_current <= (_g)->g_low || (_g)->g_current >= (_g)->g_high) + +struct ath5k_gain_opt_step { +s8 gos_param[AR5K_GAIN_CRN_MAX_FIX_BITS ]; +s8 gos_gain; +}; +struct ath5k_gain_opt { -u32 go_default; -u32 go_steps_count; +u8 go_default; +u8 go_steps_count;const struct ath5k_gain_opt_step go_step[AR5K_GAIN_STEP_COUNT ]; }; +/* +* Parameters on gos_param: +* 1) Tx clip PHY register +* 2) PWD 90 RF register +* 3) PWD 84 RF register +* 4) RFGainSel RF register +*/ static const struct ath5k_gain_opt rfgain_opt_5111 = {4 ,9 ,
@@ -463,6 +489,16 @@ static const struct ath5k_gain_opt rfgain_opt_5111 = { } }; +/* +* Parameters on gos_param: +* 1) Mixgain ovr RF register +* 2) PWD 138 RF register +* 3) PWD 137 RF register +* 4) PWD 136 RF register +* 5) PWD 132 RF register +* 6) PWD 131 RF register +* 7) PWD 130 RF register +*/ static const struct ath5k_gain_opt rfgain_opt_5112 = {1 ,8 ,