diff options
| author | Sujith Manoharan <c_manoha@qca.qualcomm.com> | 2013-12-18 09:53:27 +0530 | 
|---|---|---|
| committer | John W. Linville <linville@tuxdriver.com> | 2013-12-18 15:23:51 -0500 | 
| commit | d7df7a55cbac30acf8edade8f06458d35900ebfa (patch) | |
| tree | 6a3ae828a3575178d29619f0a09065c0c26cb653 | |
| parent | 4dc78c437a0a2ac152a2b2c5e91a814a6ef3599e (diff) | |
| download | talos-op-linux-d7df7a55cbac30acf8edade8f06458d35900ebfa.tar.gz talos-op-linux-d7df7a55cbac30acf8edade8f06458d35900ebfa.zip | |
ath9k: Use a subroutine for the AR9330 reset WAR
Signed-off-by: Sujith Manoharan <c_manoha@qca.qualcomm.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
| -rw-r--r-- | drivers/net/wireless/ath/ath9k/hw.c | 70 | ||||
| -rw-r--r-- | drivers/net/wireless/ath/ath9k/init.c | 1 | 
2 files changed, 38 insertions, 33 deletions
| diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c index 3ca682f3c704..0e548a461f55 100644 --- a/drivers/net/wireless/ath/ath9k/hw.c +++ b/drivers/net/wireless/ath/ath9k/hw.c @@ -1272,6 +1272,42 @@ void ath9k_hw_get_delta_slope_vals(struct ath_hw *ah, u32 coef_scaled,  	*coef_exponent = coef_exp - 16;  } +/* AR9330 WAR: + * call external reset function to reset WMAC if: + * - doing a cold reset + * - we have pending frames in the TX queues. + */ +static bool ath9k_hw_ar9330_reset_war(struct ath_hw *ah, int type) +{ +	int i, npend = 0; + +	for (i = 0; i < AR_NUM_QCU; i++) { +		npend = ath9k_hw_numtxpending(ah, i); +		if (npend) +			break; +	} + +	if (ah->external_reset && +	    (npend || type == ATH9K_RESET_COLD)) { +		int reset_err = 0; + +		ath_dbg(ath9k_hw_common(ah), RESET, +			"reset MAC via external reset\n"); + +		reset_err = ah->external_reset(); +		if (reset_err) { +			ath_err(ath9k_hw_common(ah), +				"External reset failed, err=%d\n", +				reset_err); +			return false; +		} + +		REG_WRITE(ah, AR_RTC_RESET, 1); +	} + +	return true; +} +  static bool ath9k_hw_set_reset(struct ath_hw *ah, int type)  {  	u32 rst_flags; @@ -1322,38 +1358,8 @@ static bool ath9k_hw_set_reset(struct ath_hw *ah, int type)  	}  	if (AR_SREV_9330(ah)) { -		int npend = 0; -		int i; - -		/* AR9330 WAR: -		 * call external reset function to reset WMAC if: -		 * - doing a cold reset -		 * - we have pending frames in the TX queues -		 */ - -		for (i = 0; i < AR_NUM_QCU; i++) { -			npend = ath9k_hw_numtxpending(ah, i); -			if (npend) -				break; -		} - -		if (ah->external_reset && -		    (npend || type == ATH9K_RESET_COLD)) { -			int reset_err = 0; - -			ath_dbg(ath9k_hw_common(ah), RESET, -				"reset MAC via external reset\n"); - -			reset_err = ah->external_reset(); -			if (reset_err) { -				ath_err(ath9k_hw_common(ah), -					"External reset failed, err=%d\n", -					reset_err); -				return false; -			} - -			REG_WRITE(ah, AR_RTC_RESET, 1); -		} +		if (!ath9k_hw_ar9330_reset_war(ah, type)) +			return false;  	}  	if (ath9k_hw_mci_is_enabled(ah)) diff --git a/drivers/net/wireless/ath/ath9k/init.c b/drivers/net/wireless/ath/ath9k/init.c index ea67c0100af2..e63465b7eab9 100644 --- a/drivers/net/wireless/ath/ath9k/init.c +++ b/drivers/net/wireless/ath/ath9k/init.c @@ -470,7 +470,6 @@ static int ath9k_init_queues(struct ath_softc *sc)  	sc->beacon.beaconq = ath9k_hw_beaconq_setup(sc->sc_ah);  	sc->beacon.cabq = ath_txq_setup(sc, ATH9K_TX_QUEUE_CAB, 0); -  	ath_cabq_update(sc);  	sc->tx.uapsdq = ath_txq_setup(sc, ATH9K_TX_QUEUE_UAPSD, 0); | 

