struct ath_softc *sc = (struct ath_softc *)data;
        u32 status = sc->intrstatus;
 
+       ath9k_ps_wakeup(sc);
+
        if (status & ATH9K_INT_FATAL) {
                ath_reset(sc, false);
+               ath9k_ps_restore(sc);
                return;
        }
 
 
        /* re-enable hardware interrupt */
        ath9k_hw_set_interrupts(sc->sc_ah, sc->imask);
+       ath9k_ps_restore(sc);
 }
 
 irqreturn_t ath_isr(int irq, void *dev)
        if (sc->sc_flags & SC_OP_INVALID)
                return IRQ_NONE;
 
-       ath9k_ps_wakeup(sc);
 
        /* shared irq, not for us */
 
-       if (!ath9k_hw_intrpend(ah)) {
-               ath9k_ps_restore(sc);
+       if (!ath9k_hw_intrpend(ah))
                return IRQ_NONE;
-       }
 
        /*
         * Figure out the reason(s) for the interrupt.  Note
         * If there are no status bits set, then this interrupt was not
         * for me (should have been caught above).
         */
-       if (!status) {
-               ath9k_ps_restore(sc);
+       if (!status)
                return IRQ_NONE;
-       }
 
        /* Cache the status */
        sc->intrstatus = status;
                ath9k_hw_set_interrupts(ah, sc->imask);
        }
 
-       if (status & ATH9K_INT_TIM_TIMER) {
-               if (!(ah->caps.hw_caps & ATH9K_HW_CAP_AUTOSLEEP)) {
+       if (!(ah->caps.hw_caps & ATH9K_HW_CAP_AUTOSLEEP))
+               if (status & ATH9K_INT_TIM_TIMER) {
                        /* Clear RxAbort bit so that we can
                         * receive frames */
                        ath9k_hw_setpower(ah, ATH9K_PM_AWAKE);
-                       ath9k_hw_setrxabort(ah, 0);
-                       sched = true;
+                       ath9k_hw_setrxabort(sc->sc_ah, 0);
                        sc->sc_flags |= SC_OP_WAIT_FOR_BEACON;
                }
-       }
 
 chip_reset:
 
-       ath9k_ps_restore(sc);
        ath_debug_stat_interrupt(sc, status);
 
        if (sched) {
 
 static void ath_rx_ps_back_to_sleep(struct ath_softc *sc)
 {
        sc->sc_flags &= ~(SC_OP_WAIT_FOR_BEACON | SC_OP_WAIT_FOR_CAB);
-       if (sc->hw->conf.flags & IEEE80211_CONF_PS)
-               ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_NETWORK_SLEEP);
 }
 
 static void ath_rx_ps_beacon(struct ath_softc *sc, struct sk_buff *skb)