}
 }
 
-void iwl_pcie_handle_rfkill_irq(struct iwl_trans *trans);
+void iwl_pcie_handle_rfkill_irq(struct iwl_trans *trans, bool from_irq);
 
 static inline bool iwl_is_rfkill_set(struct iwl_trans *trans)
 {
        return (trans->dbg.dest_tlv || iwl_trans_dbg_ini_valid(trans));
 }
 
-void iwl_trans_pcie_rf_kill(struct iwl_trans *trans, bool state);
+void iwl_trans_pcie_rf_kill(struct iwl_trans *trans, bool state, bool from_irq);
 void iwl_trans_pcie_dump_regs(struct iwl_trans *trans);
 
 #ifdef CONFIG_IWLWIFI_DEBUGFS
 
        return inta;
 }
 
-void iwl_pcie_handle_rfkill_irq(struct iwl_trans *trans)
+void iwl_pcie_handle_rfkill_irq(struct iwl_trans *trans, bool from_irq)
 {
        struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
        struct isr_statistics *isr_stats = &trans_pcie->isr_stats;
        isr_stats->rfkill++;
 
        if (prev != report)
-               iwl_trans_pcie_rf_kill(trans, report);
+               iwl_trans_pcie_rf_kill(trans, report, from_irq);
        mutex_unlock(&trans_pcie->mutex);
 
        if (hw_rfkill) {
 
        /* HW RF KILL switch toggled */
        if (inta & CSR_INT_BIT_RF_KILL) {
-               iwl_pcie_handle_rfkill_irq(trans);
+               iwl_pcie_handle_rfkill_irq(trans, true);
                handled |= CSR_INT_BIT_RF_KILL;
        }
 
 
        /* HW RF KILL switch toggled */
        if (inta_hw & MSIX_HW_INT_CAUSES_REG_RF_KILL)
-               iwl_pcie_handle_rfkill_irq(trans);
+               iwl_pcie_handle_rfkill_irq(trans, true);
 
        if (inta_hw & MSIX_HW_INT_CAUSES_REG_HW_ERR) {
                IWL_ERR(trans,
 
        report = test_bit(STATUS_RFKILL_OPMODE, &trans->status);
 
        if (prev != report)
-               iwl_trans_pcie_rf_kill(trans, report);
+               iwl_trans_pcie_rf_kill(trans, report, false);
 
        return hw_rfkill;
 }
        trans_pcie->hw_mask = trans_pcie->hw_init_mask;
 }
 
-static void _iwl_trans_pcie_stop_device(struct iwl_trans *trans)
+static void _iwl_trans_pcie_stop_device(struct iwl_trans *trans, bool from_irq)
 {
        struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
 
        if (test_and_clear_bit(STATUS_DEVICE_ENABLED, &trans->status)) {
                IWL_DEBUG_INFO(trans,
                               "DEVICE_ENABLED bit was set and is now cleared\n");
-               iwl_pcie_synchronize_irqs(trans);
+               if (!from_irq)
+                       iwl_pcie_synchronize_irqs(trans);
                iwl_pcie_rx_napi_sync(trans);
                iwl_pcie_tx_stop(trans);
                iwl_pcie_rx_stop(trans);
                clear_bit(STATUS_RFKILL_OPMODE, &trans->status);
        }
        if (hw_rfkill != was_in_rfkill)
-               iwl_trans_pcie_rf_kill(trans, hw_rfkill);
+               iwl_trans_pcie_rf_kill(trans, hw_rfkill, false);
 }
 
 static void iwl_trans_pcie_stop_device(struct iwl_trans *trans)
        mutex_lock(&trans_pcie->mutex);
        trans_pcie->opmode_down = true;
        was_in_rfkill = test_bit(STATUS_RFKILL_OPMODE, &trans->status);
-       _iwl_trans_pcie_stop_device(trans);
+       _iwl_trans_pcie_stop_device(trans, false);
        iwl_trans_pcie_handle_stop_rfkill(trans, was_in_rfkill);
        mutex_unlock(&trans_pcie->mutex);
 }
 
-void iwl_trans_pcie_rf_kill(struct iwl_trans *trans, bool state)
+void iwl_trans_pcie_rf_kill(struct iwl_trans *trans, bool state, bool from_irq)
 {
        struct iwl_trans_pcie __maybe_unused *trans_pcie =
                IWL_TRANS_GET_PCIE_TRANS(trans);
                if (trans->trans_cfg->gen2)
                        _iwl_trans_pcie_gen2_stop_device(trans);
                else
-                       _iwl_trans_pcie_stop_device(trans);
+                       _iwl_trans_pcie_stop_device(trans, from_irq);
        }
 }
 
        IWL_WARN(trans, "changing debug rfkill %d->%d\n",
                 trans_pcie->debug_rfkill, new_value);
        trans_pcie->debug_rfkill = new_value;
-       iwl_pcie_handle_rfkill_irq(trans);
+       iwl_pcie_handle_rfkill_irq(trans, false);
 
        return count;
 }