void ath9k_btcoex_timer_pause(struct ath_softc *sc);
 void ath9k_btcoex_handle_interrupt(struct ath_softc *sc, u32 status);
 u16 ath9k_btcoex_aggr_limit(struct ath_softc *sc, u32 max_4ms_framelen);
+void ath9k_btcoex_stop_gen_timer(struct ath_softc *sc);
 #else
 static inline int ath9k_init_btcoex(struct ath_softc *sc)
 {
 {
        return 0;
 }
+static inline void ath9k_btcoex_stop_gen_timer(struct ath_softc *sc)
+{
+}
 #endif /* CONFIG_ATH9K_BTCOEX_SUPPORT */
 
 /********************/
 
        struct ath_mci_profile *mci = &btcoex->mci;
        u32 timer_period;
        bool is_btscan;
+       unsigned long flags;
+
+       spin_lock_irqsave(&sc->sc_pm_lock, flags);
+       if (sc->sc_ah->power_mode == ATH9K_PM_NETWORK_SLEEP) {
+               spin_unlock_irqrestore(&sc->sc_pm_lock, flags);
+               goto skip_hw_wakeup;
+       }
+       spin_unlock_irqrestore(&sc->sc_pm_lock, flags);
 
        ath9k_ps_wakeup(sc);
        if (!(ah->caps.hw_caps & ATH9K_HW_CAP_MCI))
        }
 
        ath9k_ps_restore(sc);
+skip_hw_wakeup:
        timer_period = btcoex->btcoex_period;
        mod_timer(&btcoex->period_timer, jiffies + msecs_to_jiffies(timer_period));
 }
        btcoex->hw_timer_enabled = false;
 }
 
+void ath9k_btcoex_stop_gen_timer(struct ath_softc *sc)
+{
+       struct ath_btcoex *btcoex = &sc->btcoex;
+
+       ath9k_gen_timer_stop(sc->sc_ah, btcoex->no_stomp_timer);
+}
+
 u16 ath9k_btcoex_aggr_limit(struct ath_softc *sc, u32 max_4ms_framelen)
 {
        struct ath_btcoex *btcoex = &sc->btcoex;
 
                                     PS_WAIT_FOR_PSPOLL_DATA |
                                     PS_WAIT_FOR_TX_ACK))) {
                mode = ATH9K_PM_NETWORK_SLEEP;
+               if (ath9k_hw_btcoex_is_enabled(sc->sc_ah))
+                       ath9k_btcoex_stop_gen_timer(sc);
        } else {
                goto unlock;
        }