|
@@ -20,20 +20,13 @@
|
|
|
* TX polling - checks if the TX engine is stuck somewhere
|
|
|
* and issues a chip reset if so.
|
|
|
*/
|
|
|
-void ath_tx_complete_poll_work(struct work_struct *work)
|
|
|
+static bool ath_tx_complete_check(struct ath_softc *sc)
|
|
|
{
|
|
|
- struct ath_softc *sc = container_of(work, struct ath_softc,
|
|
|
- tx_complete_work.work);
|
|
|
struct ath_txq *txq;
|
|
|
int i;
|
|
|
- bool needreset = false;
|
|
|
-
|
|
|
|
|
|
- if (sc->tx99_state) {
|
|
|
- ath_dbg(ath9k_hw_common(sc->sc_ah), RESET,
|
|
|
- "skip tx hung detection on tx99\n");
|
|
|
- return;
|
|
|
- }
|
|
|
+ if (sc->tx99_state)
|
|
|
+ return true;
|
|
|
|
|
|
for (i = 0; i < IEEE80211_NUM_ACS; i++) {
|
|
|
txq = sc->tx.txq_map[i];
|
|
@@ -41,25 +34,36 @@ void ath_tx_complete_poll_work(struct work_struct *work)
|
|
|
ath_txq_lock(sc, txq);
|
|
|
if (txq->axq_depth) {
|
|
|
if (txq->axq_tx_inprogress) {
|
|
|
- needreset = true;
|
|
|
ath_txq_unlock(sc, txq);
|
|
|
- break;
|
|
|
- } else {
|
|
|
- txq->axq_tx_inprogress = true;
|
|
|
+ goto reset;
|
|
|
}
|
|
|
+
|
|
|
+ txq->axq_tx_inprogress = true;
|
|
|
}
|
|
|
ath_txq_unlock(sc, txq);
|
|
|
}
|
|
|
|
|
|
- if (needreset) {
|
|
|
- ath_dbg(ath9k_hw_common(sc->sc_ah), RESET,
|
|
|
- "tx hung, resetting the chip\n");
|
|
|
- ath9k_queue_reset(sc, RESET_TYPE_TX_HANG);
|
|
|
+ return true;
|
|
|
+
|
|
|
+reset:
|
|
|
+ ath_dbg(ath9k_hw_common(sc->sc_ah), RESET,
|
|
|
+ "tx hung, resetting the chip\n");
|
|
|
+ ath9k_queue_reset(sc, RESET_TYPE_TX_HANG);
|
|
|
+ return false;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+void ath_hw_check_work(struct work_struct *work)
|
|
|
+{
|
|
|
+ struct ath_softc *sc = container_of(work, struct ath_softc,
|
|
|
+ hw_check_work.work);
|
|
|
+
|
|
|
+ if (!ath_hw_check(sc) ||
|
|
|
+ !ath_tx_complete_check(sc))
|
|
|
return;
|
|
|
- }
|
|
|
|
|
|
- ieee80211_queue_delayed_work(sc->hw, &sc->tx_complete_work,
|
|
|
- msecs_to_jiffies(ATH_TX_COMPLETE_POLL_INT));
|
|
|
+ ieee80211_queue_delayed_work(sc->hw, &sc->hw_check_work,
|
|
|
+ msecs_to_jiffies(ATH_HW_CHECK_POLL_INT));
|
|
|
}
|
|
|
|
|
|
/*
|