From: Shahar S Matityahu <[email protected]>

Differentiate between SW and HW error interrupts and support ini HW
error trigger.

Signed-off-by: Shahar S Matityahu <[email protected]>
Signed-off-by: Luca Coelho <[email protected]>
---
 drivers/net/wireless/intel/iwlwifi/fw/dbg.h    | 10 ++++++++++
 drivers/net/wireless/intel/iwlwifi/iwl-trans.h |  2 ++
 drivers/net/wireless/intel/iwlwifi/mvm/ops.c   |  7 +++----
 drivers/net/wireless/intel/iwlwifi/pcie/rx.c   |  1 +
 4 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/drivers/net/wireless/intel/iwlwifi/fw/dbg.h 
b/drivers/net/wireless/intel/iwlwifi/fw/dbg.h
index 13cb164a4fb9..cccf91db74c4 100644
--- a/drivers/net/wireless/intel/iwlwifi/fw/dbg.h
+++ b/drivers/net/wireless/intel/iwlwifi/fw/dbg.h
@@ -458,4 +458,14 @@ static inline void iwl_fw_umac_set_alive_err_table(struct 
iwl_trans *trans,
 /* This bit is used to differentiate the legacy dump from the ini dump */
 #define INI_DUMP_BIT BIT(31)
 
+static inline void iwl_fw_error_collect(struct iwl_fw_runtime *fwrt)
+{
+       if (fwrt->trans->ini_valid && fwrt->trans->hw_error) {
+               _iwl_fw_dbg_ini_collect(fwrt, IWL_FW_TRIGGER_ID_FW_HW_ERROR);
+               fwrt->trans->hw_error = false;
+       } else {
+               iwl_fw_dbg_collect_desc(fwrt, &iwl_dump_desc_assert, false, 0);
+       }
+}
+
 #endif  /* __iwl_fw_dbg_h__ */
diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-trans.h 
b/drivers/net/wireless/intel/iwlwifi/iwl-trans.h
index cef045d3f1bf..2235978adf70 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-trans.h
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-trans.h
@@ -768,6 +768,7 @@ struct iwl_self_init_dram {
  * @umac_error_event_table: addr of umac error table
  * @error_event_table_tlv_status: bitmap that indicates what error table
  *     pointers was recevied via TLV. use enum &iwl_error_event_table_status
+ * @hw_error: equals true if hw error interrupt was received from the FW
  */
 struct iwl_trans {
        const struct iwl_trans_ops *ops;
@@ -831,6 +832,7 @@ struct iwl_trans {
        u32 umac_error_event_table;
        unsigned int error_event_table_tlv_status;
        wait_queue_head_t fw_halt_waitq;
+       bool hw_error;
 
        /* pointer to trans specific struct */
        /*Ensure that this pointer will always be aligned to sizeof pointer */
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/ops.c 
b/drivers/net/wireless/intel/iwlwifi/mvm/ops.c
index 3cc6048d6a10..8e2e4fa7914e 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/ops.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/ops.c
@@ -1291,8 +1291,7 @@ void iwl_mvm_nic_restart(struct iwl_mvm *mvm, bool 
fw_error)
         * can't recover this since we're already half suspended.
         */
        if (!mvm->fw_restart && fw_error) {
-               iwl_fw_dbg_collect_desc(&mvm->fwrt, &iwl_dump_desc_assert,
-                                       false, 0);
+               iwl_fw_error_collect(&mvm->fwrt);
        } else if (test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status)) {
                struct iwl_mvm_reprobe *reprobe;
 
@@ -1340,8 +1339,8 @@ void iwl_mvm_nic_restart(struct iwl_mvm *mvm, bool 
fw_error)
                        }
                }
 
-               iwl_fw_dbg_collect_desc(&mvm->fwrt, &iwl_dump_desc_assert,
-                                       false, 0);
+               iwl_fw_error_collect(&mvm->fwrt);
+
                if (fw_error && mvm->fw_restart > 0)
                        mvm->fw_restart--;
                set_bit(IWL_MVM_STATUS_HW_RESTART_REQUESTED, &mvm->status);
diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/rx.c 
b/drivers/net/wireless/intel/iwlwifi/pcie/rx.c
index abe40196266b..69fcfa930791 100644
--- a/drivers/net/wireless/intel/iwlwifi/pcie/rx.c
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/rx.c
@@ -2207,6 +2207,7 @@ irqreturn_t iwl_pcie_irq_msix_handler(int irq, void 
*dev_id)
                        "Hardware error detected. Restarting.\n");
 
                isr_stats->hw++;
+               trans->hw_error = true;
                iwl_pcie_irq_handle_error(trans);
        }
 
-- 
2.20.1

Reply via email to