Go to:
Gentoo Home
Documentation
Forums
Lists
Bugs
Planet
Store
Wiki
Get Gentoo!
Gentoo's Bugzilla – Attachment 877977 Details for
Bug 918128
sys-kernel/gentoo-sources-6.6.2: Rfkill switch on laptop (hardblock) freezes system, requires forced poweroff
Home
|
New
–
[Ex]
|
Browse
|
Search
|
Privacy Policy
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Upstream patch
iwlwifi-rfkill-fix.patch (text/plain), 6.91 KB, created by
Mike Pagano
on 2023-12-07 00:05:34 UTC
(
hide
)
Description:
Upstream patch
Filename:
MIME Type:
Creator:
Mike Pagano
Created:
2023-12-07 00:05:34 UTC
Size:
6.91 KB
patch
obsolete
>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; > }
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 918128
:
875513
|
875711
|
875733
|
875734
| 877977