ath_dbg(common, ATH_DBG_RESET, "Possible baseband hang, "
                "busy=%d (try %d)\n", busy, sc->hw_busy_count + 1);
        if (busy >= 99) {
-               if (++sc->hw_busy_count >= 3)
+               if (++sc->hw_busy_count >= 3) {
+                       spin_lock_bh(&sc->sc_pcu_lock);
                        ath_reset(sc, true);
+                       spin_unlock_bh(&sc->sc_pcu_lock);
+               }
        } else if (busy >= 0)
                sc->hw_busy_count = 0;
 
                        /* Rx is hung for more than 500ms. Reset it */
                        ath_dbg(common, ATH_DBG_RESET,
                                "Possible RX hang, resetting");
+                       spin_lock_bh(&sc->sc_pcu_lock);
                        ath_reset(sc, true);
+                       spin_unlock_bh(&sc->sc_pcu_lock);
                        count = 0;
                }
        } else
 
        if ((status & ATH9K_INT_FATAL) ||
            (status & ATH9K_INT_BB_WATCHDOG)) {
+               spin_lock(&sc->sc_pcu_lock);
                ath_reset(sc, true);
+               spin_unlock(&sc->sc_pcu_lock);
                return;
        }
 
        del_timer_sync(&common->ani.timer);
 
        ath9k_ps_wakeup(sc);
-       spin_lock_bh(&sc->sc_pcu_lock);
 
        ieee80211_stop_queues(hw);
 
        }
 
        ieee80211_wake_queues(hw);
-       spin_unlock_bh(&sc->sc_pcu_lock);
 
        /* Start ANI */
        if (!common->disable_ani)
        ath9k_ps_wakeup(sc);
        spin_lock_bh(&sc->sc_pcu_lock);
        drain_txq = ath_drain_all_txq(sc, false);
-       spin_unlock_bh(&sc->sc_pcu_lock);
        if (!drain_txq)
                ath_reset(sc, false);
+       spin_unlock_bh(&sc->sc_pcu_lock);
        ath9k_ps_restore(sc);
        ieee80211_wake_queues(hw);
 
 
 
        rcu_read_unlock();
 
-       if (needreset) {
-               spin_unlock_bh(&sc->sc_pcu_lock);
+       if (needreset)
                ath_reset(sc, false);
-               spin_lock_bh(&sc->sc_pcu_lock);
-       }
 }
 
 static u32 ath_lookup_rate(struct ath_softc *sc, struct ath_buf *bf,
        if (needreset) {
                ath_dbg(ath9k_hw_common(sc->sc_ah), ATH_DBG_RESET,
                        "tx hung, resetting the chip\n");
+               spin_lock_bh(&sc->sc_pcu_lock);
                ath_reset(sc, true);
+               spin_unlock_bh(&sc->sc_pcu_lock);
        }
 
        ieee80211_queue_delayed_work(sc->hw, &sc->tx_complete_work,