Merge tag 'x86-asm-2024-01-08' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
[linux-2.6-microblaze.git] / drivers / net / wireless / intel / iwlwifi / pcie / trans.c
index 9225326..d102080 100644 (file)
@@ -1082,7 +1082,7 @@ bool iwl_pcie_check_hw_rf_kill(struct iwl_trans *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;
 }
@@ -1237,7 +1237,7 @@ static void iwl_pcie_init_msix(struct iwl_trans_pcie *trans_pcie)
        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);
 
@@ -1264,7 +1264,8 @@ static void _iwl_trans_pcie_stop_device(struct iwl_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);
@@ -1454,7 +1455,7 @@ void iwl_trans_pcie_handle_stop_rfkill(struct iwl_trans *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)
@@ -1469,12 +1470,12 @@ 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);
@@ -1487,7 +1488,7 @@ void iwl_trans_pcie_rf_kill(struct iwl_trans *trans, bool state)
                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);
        }
 }
 
@@ -2887,7 +2888,7 @@ static ssize_t iwl_dbgfs_rfkill_write(struct file *file,
        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;
 }