void ath9k_queue_reset(struct ath_softc *sc, enum ath_reset_type type);
 void ath_ps_full_sleep(unsigned long data);
 void __ath9k_flush(struct ieee80211_hw *hw, u32 queues, bool drop,
-                  bool sw_pending);
+                  bool sw_pending, bool timeout_override);
 
 /**********/
 /* BTCOEX */
 
                ath9k_chanctx_stop_queues(sc, sc->cur_chan);
                queues_stopped = true;
 
-               __ath9k_flush(sc->hw, ~0, true, false);
+               __ath9k_flush(sc->hw, ~0, true, false, false);
 
                if (ath_chanctx_send_ps_frame(sc, true))
                        __ath9k_flush(sc->hw, BIT(IEEE80211_AC_VO),
-                                     false, false);
+                                     false, false, false);
 
                send_ps = true;
                spin_lock_bh(&sc->chan_lock);
 
                        u32 queues, bool drop)
 {
        struct ath_softc *sc = hw->priv;
+       struct ath_common *common = ath9k_hw_common(sc->sc_ah);
+
+       if (ath9k_is_chanctx_enabled()) {
+               if (!test_bit(ATH_OP_MULTI_CHANNEL, &common->op_flags))
+                       goto flush;
 
+               /*
+                * If MCC is active, extend the flush timeout
+                * and wait for the HW/SW queues to become
+                * empty. This needs to be done outside the
+                * sc->mutex lock to allow the channel scheduler
+                * to switch channel contexts.
+                *
+                * The vif queues have been stopped in mac80211,
+                * so there won't be any incoming frames.
+                */
+               __ath9k_flush(hw, queues, drop, true, true);
+               return;
+       }
+flush:
        mutex_lock(&sc->mutex);
-       __ath9k_flush(hw, queues, drop, true);
+       __ath9k_flush(hw, queues, drop, true, false);
        mutex_unlock(&sc->mutex);
 }
 
 void __ath9k_flush(struct ieee80211_hw *hw, u32 queues, bool drop,
-                  bool sw_pending)
+                  bool sw_pending, bool timeout_override)
 {
        struct ath_softc *sc = hw->priv;
        struct ath_hw *ah = sc->sc_ah;
        }
 
        spin_lock_bh(&sc->chan_lock);
-       timeout = sc->cur_chan->flush_timeout;
+       if (timeout_override)
+               timeout = HZ / 5;
+       else
+               timeout = sc->cur_chan->flush_timeout;
        spin_unlock_bh(&sc->chan_lock);
 
        ath_dbg(common, CHAN_CTX,