commit:     d935f504f8fe5c97868abc23c401bfdb91c7cc4a
Author:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
AuthorDate: Thu Dec  7 18:52:37 2023 +0000
Commit:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
CommitDate: Thu Dec  7 18:52:37 2023 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=d935f504

Remove revert, add upstream proposed fix

Removed:
2400_rvrt-iwlwifi-pcie-sycn-IRQs-before-NAPI.patch

See: https://bugzilla.kernel.org/show_bug.cgi?id=218206

Signed-off-by: Mike Pagano <mpagano <AT> gentoo.org>

 0000_README                                        |   6 +-
 2400_rvrt-iwlwifi-pcie-sycn-IRQs-before-NAPI.patch |  20 ---
 2410_iwlwifi-rfkill-fix.patch                      | 170 +++++++++++++++++++++
 3 files changed, 173 insertions(+), 23 deletions(-)

diff --git a/0000_README b/0000_README
index 31c2e3cb..dab55135 100644
--- a/0000_README
+++ b/0000_README
@@ -83,9 +83,9 @@ Patch:  2010_Fix_randomize_layout_crash_in_struct_neigh.patch
 From:   
https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git/commit/?id=45b3fae4675d
 Desc:   neighbour: Fix __randomize_layout crash in struct neighbour
 
-Patch:  2400_rvrt-iwlwifi-pcie-sycn-IRQs-before-NAPI.patch
-From:   https://bugs.gentoo.org/918128
-Desc:   revert: wifi: iwlwifi: pcie: synchronize IRQs before NAPI
+Patch:  2410_iwlwifi-rfkill-fix.patch
+From:   https://bugzilla.kernel.org/show_bug.cgi?id=218206
+Desc:   fix for iwlwifi pcie synchronization of IRQs before NAPI
 
 Patch:  2900_tmp513-Fix-build-issue-by-selecting-CONFIG_REG.patch
 From:   https://bugs.gentoo.org/710790

diff --git a/2400_rvrt-iwlwifi-pcie-sycn-IRQs-before-NAPI.patch 
b/2400_rvrt-iwlwifi-pcie-sycn-IRQs-before-NAPI.patch
deleted file mode 100644
index 8f6996aa..00000000
--- a/2400_rvrt-iwlwifi-pcie-sycn-IRQs-before-NAPI.patch
+++ /dev/null
@@ -1,20 +0,0 @@
---- a/drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c     2023-12-03 
06:18:46.682462627 -0500
-+++ b//drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c    2023-12-03 
06:20:00.912230659 -0500
-@@ -161,7 +161,6 @@ void _iwl_trans_pcie_gen2_stop_device(st
-       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);
-               iwl_pcie_rx_napi_sync(trans);
-               iwl_txq_gen2_tx_free(trans);
-               iwl_pcie_rx_stop(trans);
---- a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c  2023-12-03 
06:18:54.135764993 -0500
-+++ b//drivers/net/wireless/intel/iwlwifi/pcie/trans.c 2023-12-03 
06:20:20.688858491 -0500
-@@ -1263,7 +1263,6 @@ static void _iwl_trans_pcie_stop_device(
-       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);
-               iwl_pcie_rx_napi_sync(trans);
-               iwl_pcie_tx_stop(trans);
-               iwl_pcie_rx_stop(trans);

diff --git a/2410_iwlwifi-rfkill-fix.patch b/2410_iwlwifi-rfkill-fix.patch
new file mode 100644
index 00000000..02994243
--- /dev/null
+++ b/2410_iwlwifi-rfkill-fix.patch
@@ -0,0 +1,170 @@
+diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/internal.h 
b/drivers/net/wireless/intel/iwlwifi/pcie/internal.h
+index 56def20374f3..abdb687e7274 100644
+--- a/drivers/net/wireless/intel/iwlwifi/pcie/internal.h
++++ b/drivers/net/wireless/intel/iwlwifi/pcie/internal.h
+@@ -770,7 +770,7 @@ static inline void iwl_enable_rfkill_int(struct iwl_trans 
*trans)
+       }
+ }
+ 
+-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)
+ {
+@@ -817,7 +817,7 @@ static inline bool iwl_pcie_dbg_on(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
+@@ -853,7 +853,7 @@ void iwl_trans_pcie_gen2_fw_alive(struct iwl_trans *trans, 
u32 scd_addr);
+ int iwl_trans_pcie_gen2_send_hcmd(struct iwl_trans *trans,
+                                 struct iwl_host_cmd *cmd);
+ void iwl_trans_pcie_gen2_stop_device(struct iwl_trans *trans);
+-void _iwl_trans_pcie_gen2_stop_device(struct iwl_trans *trans);
++void _iwl_trans_pcie_gen2_stop_device(struct iwl_trans *trans, bool from_irq);
+ void iwl_pcie_d3_complete_suspend(struct iwl_trans *trans,
+                                 bool test, bool reset);
+ int iwl_pcie_gen2_enqueue_hcmd(struct iwl_trans *trans,
+diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/rx.c 
b/drivers/net/wireless/intel/iwlwifi/pcie/rx.c
+index 146bc7bd14fb..a0d10df0c11a 100644
+--- a/drivers/net/wireless/intel/iwlwifi/pcie/rx.c
++++ b/drivers/net/wireless/intel/iwlwifi/pcie/rx.c
+@@ -1783,7 +1783,7 @@ static u32 iwl_pcie_int_cause_ict(struct iwl_trans 
*trans)
+       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;
+@@ -1807,7 +1807,7 @@ void iwl_pcie_handle_rfkill_irq(struct iwl_trans *trans)
+       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) {
+@@ -1947,7 +1947,7 @@ irqreturn_t iwl_pcie_irq_handler(int irq, void *dev_id)
+ 
+       /* 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;
+       }
+ 
+@@ -2370,7 +2370,7 @@ irqreturn_t iwl_pcie_irq_msix_handler(int irq, void 
*dev_id)
+ 
+       /* 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,
+diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c 
b/drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c
+index c9e5bda8f0b7..a3b90c6422b9 100644
+--- a/drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c
++++ b/drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c
+@@ -130,7 +130,7 @@ static void iwl_trans_pcie_fw_reset_handshake(struct 
iwl_trans *trans)
+       trans_pcie->fw_reset_state = FW_RESET_IDLE;
+ }
+ 
+-void _iwl_trans_pcie_gen2_stop_device(struct iwl_trans *trans)
++void _iwl_trans_pcie_gen2_stop_device(struct iwl_trans *trans, bool from_irq)
+ {
+       struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
+ 
+@@ -221,7 +221,7 @@ void iwl_trans_pcie_gen2_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_gen2_stop_device(trans);
++      _iwl_trans_pcie_gen2_stop_device(trans, false);
+       iwl_trans_pcie_handle_stop_rfkill(trans, was_in_rfkill);
+       mutex_unlock(&trans_pcie->mutex);
+ }
+diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c 
b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
+index a468e5efeecd..bffd2293a9b8 100644
+--- a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
++++ b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
+@@ -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);
+@@ -1485,9 +1486,9 @@ void iwl_trans_pcie_rf_kill(struct iwl_trans *trans, 
bool state)
+                state ? "disabled" : "enabled");
+       if (iwl_op_mode_hw_rf_kill(trans->op_mode, state)) {
+               if (trans->trans_cfg->gen2)
+-                      _iwl_trans_pcie_gen2_stop_device(trans);
++                      _iwl_trans_pcie_gen2_stop_device(trans, from_irq);
+               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;
+ }

Reply via email to