#define ATH_PAPRD_TIMEOUT      100 /* msecs */
 
+void ath_hw_check(struct work_struct *work);
 void ath_paprd_calibrate(struct work_struct *work);
 void ath_ani_calibrate(unsigned long data);
 
        spinlock_t sc_pm_lock;
        struct mutex mutex;
        struct work_struct paprd_work;
+       struct work_struct hw_check_work;
        struct completion paprd_complete;
 
        u32 intrstatus;
 
                        goto error_world;
        }
 
+       INIT_WORK(&sc->hw_check_work, ath_hw_check);
        INIT_WORK(&sc->paprd_work, ath_paprd_calibrate);
        INIT_WORK(&sc->chan_work, ath9k_wiphy_chan_work);
        INIT_DELAYED_WORK(&sc->wiphy_work, ath9k_wiphy_work);
 
                ath_tx_node_cleanup(sc, an);
 }
 
+void ath_hw_check(struct work_struct *work)
+{
+       struct ath_softc *sc = container_of(work, struct ath_softc, hw_check_work);
+       int i;
+
+       ath9k_ps_wakeup(sc);
+
+       for (i = 0; i < 3; i++) {
+               if (ath9k_hw_check_alive(sc->sc_ah))
+                       goto out;
+
+               msleep(1);
+       }
+       ath_reset(sc, false);
+
+out:
+       ath9k_ps_restore(sc);
+}
+
 void ath9k_tasklet(unsigned long data)
 {
        struct ath_softc *sc = (struct ath_softc *)data;
 
        ath9k_ps_wakeup(sc);
 
-       if ((status & ATH9K_INT_FATAL) ||
-           !ath9k_hw_check_alive(ah)) {
+       if (status & ATH9K_INT_FATAL) {
                ath_reset(sc, false);
                ath9k_ps_restore(sc);
                return;
        }
 
+       if (!ath9k_hw_check_alive(ah))
+               ieee80211_queue_work(sc->hw, &sc->hw_check_work);
+
        if (ah->caps.hw_caps & ATH9K_HW_CAP_EDMA)
                rxmask = (ATH9K_INT_RXHP | ATH9K_INT_RXLP | ATH9K_INT_RXEOL |
                          ATH9K_INT_RXORN);
 
        cancel_delayed_work_sync(&sc->tx_complete_work);
        cancel_work_sync(&sc->paprd_work);
+       cancel_work_sync(&sc->hw_check_work);
 
        if (!sc->num_sec_wiphy) {
                cancel_delayed_work_sync(&sc->wiphy_work);
        sc->sc_flags |= SC_OP_SCANNING;
        del_timer_sync(&common->ani.timer);
        cancel_work_sync(&sc->paprd_work);
+       cancel_work_sync(&sc->hw_check_work);
        cancel_delayed_work_sync(&sc->tx_complete_work);
        mutex_unlock(&sc->mutex);
 }