diff options
Diffstat (limited to 'drivers/net/wireless/ath/ath5k/reset.c')
| -rw-r--r-- | drivers/net/wireless/ath/ath5k/reset.c | 38 | 
1 files changed, 25 insertions, 13 deletions
diff --git a/drivers/net/wireless/ath/ath5k/reset.c b/drivers/net/wireless/ath/ath5k/reset.c index cbf28e37984..44bbbf2a6ed 100644 --- a/drivers/net/wireless/ath/ath5k/reset.c +++ b/drivers/net/wireless/ath/ath5k/reset.c @@ -19,8 +19,6 @@   *   */ -#define _ATH5K_RESET -  /*****************************\    Reset functions and helpers  \*****************************/ @@ -34,6 +32,27 @@  #include "base.h"  #include "debug.h" +/* + * Check if a register write has been completed + */ +int ath5k_hw_register_timeout(struct ath5k_hw *ah, u32 reg, u32 flag, u32 val, +			      bool is_set) +{ +	int i; +	u32 data; + +	for (i = AR5K_TUNE_REGISTER_TIMEOUT; i > 0; i--) { +		data = ath5k_hw_reg_read(ah, reg); +		if (is_set && (data & flag)) +			break; +		else if ((data & flag) == val) +			break; +		udelay(15); +	} + +	return (i <= 0) ? -EAGAIN : 0; +} +  /**   * ath5k_hw_write_ofdm_timings - set OFDM timings on AR5212   * @@ -221,8 +240,8 @@ static int ath5k_hw_nic_reset(struct ath5k_hw *ah, u32 val)  /*   * Sleep control   */ -int ath5k_hw_set_power(struct ath5k_hw *ah, enum ath5k_power_mode mode, -		bool set_chip, u16 sleep_duration) +static int ath5k_hw_set_power(struct ath5k_hw *ah, enum ath5k_power_mode mode, +			      bool set_chip, u16 sleep_duration)  {  	unsigned int i;  	u32 staid, data; @@ -1017,11 +1036,6 @@ int ath5k_hw_reset(struct ath5k_hw *ah, enum nl80211_iftype op_mode,  	if (ret)  		return ret; -	/* -	 * Initialize operating mode -	 */ -	ah->ah_op_mode = op_mode; -  	/* PHY access enable */  	if (ah->ah_mac_srev >= AR5K_SREV_AR5211)  		ath5k_hw_reg_write(ah, AR5K_PHY_SHIFT_5GHZ, AR5K_PHY(0)); @@ -1192,7 +1206,7 @@ int ath5k_hw_reset(struct ath5k_hw *ah, enum nl80211_iftype op_mode,  	ath5k_hw_set_associd(ah);  	/* Set PCU config */ -	ath5k_hw_set_opmode(ah); +	ath5k_hw_set_opmode(ah, op_mode);  	/* Clear any pending interrupts  	 * PISR/SISR Not available on 5210 */ @@ -1378,7 +1392,7 @@ int ath5k_hw_reset(struct ath5k_hw *ah, enum nl80211_iftype op_mode,  	 * external 32KHz crystal when sleeping if one  	 * exists */  	if (ah->ah_version == AR5K_AR5212 && -	    ah->ah_op_mode != NL80211_IFTYPE_AP) +	    op_mode != NL80211_IFTYPE_AP)  		ath5k_hw_set_sleep_clock(ah, true);  	/* @@ -1388,5 +1402,3 @@ int ath5k_hw_reset(struct ath5k_hw *ah, enum nl80211_iftype op_mode,  	ath5k_hw_reset_tsf(ah);  	return 0;  } - -#undef _ATH5K_RESET  |