mirror of https://gitee.com/openkylin/linux.git
ath5k: new function for setting the antenna switch table
Collect all pieces concering the antenna switch table into one function. Previously it was split up between ath5k_hw_reset() and ath5k_hw_commit_eeprom_settings(). Also we need to set the antenna switch table when ath5k_hw_set_antenna_mode() is called manually (by "iw phy0 antenna set", for example). I'm not sure if we need to set the switchtable at the same place in ath5k_hw_reset() as it was before - it is set later thru ath5k_hw_set_antenna_mode() anyways - but i leave it there to avoid problems(?). Plus print switchtable registers in the debugfs file. Signed-off-by: Bruno Randolf <br1@einfach.org> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
39d5b2c83c
commit
0ca74027ac
|
@ -1286,6 +1286,7 @@ u16 ath5k_hw_radio_revision(struct ath5k_hw *ah, unsigned int chan);
|
||||||
int ath5k_hw_phy_disable(struct ath5k_hw *ah);
|
int ath5k_hw_phy_disable(struct ath5k_hw *ah);
|
||||||
/* Antenna control */
|
/* Antenna control */
|
||||||
void ath5k_hw_set_antenna_mode(struct ath5k_hw *ah, u8 ant_mode);
|
void ath5k_hw_set_antenna_mode(struct ath5k_hw *ah, u8 ant_mode);
|
||||||
|
void ath5k_hw_set_antenna_switch(struct ath5k_hw *ah, u8 ee_mode);
|
||||||
/* TX power setup */
|
/* TX power setup */
|
||||||
int ath5k_hw_txpower(struct ath5k_hw *ah, struct ieee80211_channel *channel,
|
int ath5k_hw_txpower(struct ath5k_hw *ah, struct ieee80211_channel *channel,
|
||||||
u8 ee_mode, u8 txpower);
|
u8 ee_mode, u8 txpower);
|
||||||
|
|
|
@ -425,6 +425,13 @@ static ssize_t read_file_antenna(struct file *file, char __user *user_buf,
|
||||||
"AR5K_PHY_FAST_ANT_DIV_EN\t%d\n",
|
"AR5K_PHY_FAST_ANT_DIV_EN\t%d\n",
|
||||||
(v & AR5K_PHY_FAST_ANT_DIV_EN) != 0);
|
(v & AR5K_PHY_FAST_ANT_DIV_EN) != 0);
|
||||||
|
|
||||||
|
v = ath5k_hw_reg_read(sc->ah, AR5K_PHY_ANT_SWITCH_TABLE_0);
|
||||||
|
len += snprintf(buf+len, sizeof(buf)-len,
|
||||||
|
"\nAR5K_PHY_ANT_SWITCH_TABLE_0\t0x%08x\n", v);
|
||||||
|
v = ath5k_hw_reg_read(sc->ah, AR5K_PHY_ANT_SWITCH_TABLE_1);
|
||||||
|
len += snprintf(buf+len, sizeof(buf)-len,
|
||||||
|
"AR5K_PHY_ANT_SWITCH_TABLE_1\t0x%08x\n", v);
|
||||||
|
|
||||||
return simple_read_from_buffer(user_buf, count, ppos, buf, len);
|
return simple_read_from_buffer(user_buf, count, ppos, buf, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1781,6 +1781,37 @@ ath5k_hw_set_fast_div(struct ath5k_hw *ah, u8 ee_mode, bool enable)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ath5k_hw_set_antenna_switch(struct ath5k_hw *ah, u8 ee_mode)
|
||||||
|
{
|
||||||
|
u8 ant0, ant1;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* In case a fixed antenna was set as default
|
||||||
|
* use the same switch table twice.
|
||||||
|
*/
|
||||||
|
if (ah->ah_ant_mode == AR5K_ANTMODE_FIXED_A)
|
||||||
|
ant0 = ant1 = AR5K_ANT_SWTABLE_A;
|
||||||
|
else if (ah->ah_ant_mode == AR5K_ANTMODE_FIXED_B)
|
||||||
|
ant0 = ant1 = AR5K_ANT_SWTABLE_B;
|
||||||
|
else {
|
||||||
|
ant0 = AR5K_ANT_SWTABLE_A;
|
||||||
|
ant1 = AR5K_ANT_SWTABLE_B;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set antenna idle switch table */
|
||||||
|
AR5K_REG_WRITE_BITS(ah, AR5K_PHY_ANT_CTL,
|
||||||
|
AR5K_PHY_ANT_CTL_SWTABLE_IDLE,
|
||||||
|
(ah->ah_ant_ctl[ee_mode][AR5K_ANT_CTL] |
|
||||||
|
AR5K_PHY_ANT_CTL_TXRX_EN));
|
||||||
|
|
||||||
|
/* Set antenna switch tables */
|
||||||
|
ath5k_hw_reg_write(ah, ah->ah_ant_ctl[ee_mode][ant0],
|
||||||
|
AR5K_PHY_ANT_SWITCH_TABLE_0);
|
||||||
|
ath5k_hw_reg_write(ah, ah->ah_ant_ctl[ee_mode][ant1],
|
||||||
|
AR5K_PHY_ANT_SWITCH_TABLE_1);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set antenna operating mode
|
* Set antenna operating mode
|
||||||
*/
|
*/
|
||||||
|
@ -1900,6 +1931,7 @@ ath5k_hw_set_antenna_mode(struct ath5k_hw *ah, u8 ant_mode)
|
||||||
if (sta_id1)
|
if (sta_id1)
|
||||||
AR5K_REG_ENABLE_BITS(ah, AR5K_STA_ID1, sta_id1);
|
AR5K_REG_ENABLE_BITS(ah, AR5K_STA_ID1, sta_id1);
|
||||||
|
|
||||||
|
ath5k_hw_set_antenna_switch(ah, ee_mode);
|
||||||
/* Note: set diversity before default antenna
|
/* Note: set diversity before default antenna
|
||||||
* because it won't work correctly */
|
* because it won't work correctly */
|
||||||
ath5k_hw_set_fast_div(ah, ee_mode, fast_div);
|
ath5k_hw_set_fast_div(ah, ee_mode, fast_div);
|
||||||
|
|
|
@ -729,7 +729,7 @@ static void ath5k_hw_tweak_initval_settings(struct ath5k_hw *ah,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ath5k_hw_commit_eeprom_settings(struct ath5k_hw *ah,
|
static void ath5k_hw_commit_eeprom_settings(struct ath5k_hw *ah,
|
||||||
struct ieee80211_channel *channel, u8 *ant, u8 ee_mode)
|
struct ieee80211_channel *channel, u8 ee_mode)
|
||||||
{
|
{
|
||||||
struct ath5k_eeprom_info *ee = &ah->ah_capabilities.cap_eeprom;
|
struct ath5k_eeprom_info *ee = &ah->ah_capabilities.cap_eeprom;
|
||||||
s16 cck_ofdm_pwr_delta;
|
s16 cck_ofdm_pwr_delta;
|
||||||
|
@ -763,17 +763,9 @@ static void ath5k_hw_commit_eeprom_settings(struct ath5k_hw *ah,
|
||||||
ee->ee_cck_ofdm_gain_delta;
|
ee->ee_cck_ofdm_gain_delta;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set antenna idle switch table */
|
/* XXX: necessary here? is called from ath5k_hw_set_antenna_mode()
|
||||||
AR5K_REG_WRITE_BITS(ah, AR5K_PHY_ANT_CTL,
|
* too */
|
||||||
AR5K_PHY_ANT_CTL_SWTABLE_IDLE,
|
ath5k_hw_set_antenna_switch(ah, ee_mode);
|
||||||
(ah->ah_ant_ctl[ee_mode][0] |
|
|
||||||
AR5K_PHY_ANT_CTL_TXRX_EN));
|
|
||||||
|
|
||||||
/* Set antenna switch tables */
|
|
||||||
ath5k_hw_reg_write(ah, ah->ah_ant_ctl[ee_mode][ant[0]],
|
|
||||||
AR5K_PHY_ANT_SWITCH_TABLE_0);
|
|
||||||
ath5k_hw_reg_write(ah, ah->ah_ant_ctl[ee_mode][ant[1]],
|
|
||||||
AR5K_PHY_ANT_SWITCH_TABLE_1);
|
|
||||||
|
|
||||||
/* Noise floor threshold */
|
/* Noise floor threshold */
|
||||||
ath5k_hw_reg_write(ah,
|
ath5k_hw_reg_write(ah,
|
||||||
|
@ -887,7 +879,7 @@ int ath5k_hw_reset(struct ath5k_hw *ah, enum nl80211_iftype op_mode,
|
||||||
struct ath_common *common = ath5k_hw_common(ah);
|
struct ath_common *common = ath5k_hw_common(ah);
|
||||||
u32 s_seq[10], s_ant, s_led[3], staid1_flags, tsf_up, tsf_lo;
|
u32 s_seq[10], s_ant, s_led[3], staid1_flags, tsf_up, tsf_lo;
|
||||||
u32 phy_tst1;
|
u32 phy_tst1;
|
||||||
u8 mode, freq, ee_mode, ant[2];
|
u8 mode, freq, ee_mode;
|
||||||
int i, ret;
|
int i, ret;
|
||||||
|
|
||||||
s_ant = 0;
|
s_ant = 0;
|
||||||
|
@ -1110,21 +1102,8 @@ int ath5k_hw_reset(struct ath5k_hw *ah, enum nl80211_iftype op_mode,
|
||||||
AR5K_TXCFG_B_MODE);
|
AR5K_TXCFG_B_MODE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* In case a fixed antenna was set as default
|
|
||||||
* use the same switch table twice.
|
|
||||||
*/
|
|
||||||
if (ah->ah_ant_mode == AR5K_ANTMODE_FIXED_A)
|
|
||||||
ant[0] = ant[1] = AR5K_ANT_SWTABLE_A;
|
|
||||||
else if (ah->ah_ant_mode == AR5K_ANTMODE_FIXED_B)
|
|
||||||
ant[0] = ant[1] = AR5K_ANT_SWTABLE_B;
|
|
||||||
else {
|
|
||||||
ant[0] = AR5K_ANT_SWTABLE_A;
|
|
||||||
ant[1] = AR5K_ANT_SWTABLE_B;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Commit values from EEPROM */
|
/* Commit values from EEPROM */
|
||||||
ath5k_hw_commit_eeprom_settings(ah, channel, ant, ee_mode);
|
ath5k_hw_commit_eeprom_settings(ah, channel, ee_mode);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue