Skip to content

Commit

Permalink
ath9k: Use a subroutine for the AR9330 reset WAR
Browse files Browse the repository at this point in the history
Signed-off-by: Sujith Manoharan <c_manoha@qca.qualcomm.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Sujith Manoharan authored and John W. Linville committed Dec 18, 2013
1 parent 4dc78c4 commit d7df7a5
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 33 deletions.
70 changes: 38 additions & 32 deletions drivers/net/wireless/ath/ath9k/hw.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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))
Expand Down
1 change: 0 additions & 1 deletion drivers/net/wireless/ath/ath9k/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit d7df7a5

Please sign in to comment.