wifi: iwlwifi: mld: dump data in case we have a crash upon WOWLAN resume
This was not handled until now
Just align the behavior with iwlmvm.
The only different is that we set STATUS_FW_ERROR bit in
trans->status at a later stage in iwlmld.
I am not sure it really matters.
type=feature
ticket=none
Change-Id: I3475fe627d9ce080f5096cb7e46d5aba6fdc158d
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Reviewed-on: https://gerritwcs.ir.intel.com/c/iwlwifi-stack-dev/+/169035
automatic-review: iil_jenkins iil_jenkins <EC.GER.UNIX.IIL.JENKINS@INTEL.COM>
tested: iil_jenkins iil_jenkins <EC.GER.UNIX.IIL.JENKINS@INTEL.COM>
Reviewed-by: Miriam Rachel Korenblit <miriam.rachel.korenblit@intel.com>
x-iwlwifi-stack-dev: 1bf74f164232ba0348989c076b21f6187f1acc9c
diff --git a/drivers/net/wireless/intel/iwlwifi/mld/d3.c b/drivers/net/wireless/intel/iwlwifi/mld/d3.c
index ac81651..43509ef 100644
--- a/drivers/net/wireless/intel/iwlwifi/mld/d3.c
+++ b/drivers/net/wireless/intel/iwlwifi/mld/d3.c
@@ -204,8 +204,14 @@
}
#endif
-static bool iwl_mld_check_err_tables(struct iwl_mld *mld,
- struct ieee80211_vif *vif)
+enum rt_status {
+ FW_ALIVE,
+ FW_NEEDS_RESET,
+ FW_ERROR,
+};
+
+static enum rt_status iwl_mld_check_err_tables(struct iwl_mld *mld,
+ struct ieee80211_vif *vif)
{
u32 err_id;
@@ -219,23 +225,43 @@
};
ieee80211_report_wowlan_wakeup(vif, &wakeup,
GFP_KERNEL);
+
+ return FW_NEEDS_RESET;
}
- return true;
+ return FW_ERROR;
}
/* check if we have lmac2 set and check for error */
if (iwl_fwrt_read_err_table(mld->trans,
mld->trans->dbg.lmac_error_event_table[1],
NULL))
- return true;
+ return FW_ERROR;
/* check for umac error */
if (iwl_fwrt_read_err_table(mld->trans,
mld->trans->dbg.umac_error_event_table,
NULL))
- return true;
+ return FW_ERROR;
- return false;
+ return FW_ALIVE;
+}
+
+static bool iwl_mld_fw_needs_restart(struct iwl_mld *mld,
+ struct ieee80211_vif *vif)
+{
+ enum rt_status rt_status = iwl_mld_check_err_tables(mld, vif);
+
+ if (rt_status == FW_ALIVE)
+ return false;
+
+ if (rt_status == FW_ERROR) {
+ IWL_ERR(mld, "FW Error occurred during suspend\n");
+ iwl_fwrt_dump_error_logs(&mld->fwrt);
+ iwl_dbg_tlv_time_point(&mld->fwrt,
+ IWL_FW_INI_TIME_POINT_FW_ASSERT, NULL);
+ }
+
+ return true;
}
static
@@ -1368,7 +1394,7 @@
mld->fw_status.in_d3 = false;
iwl_fw_dbg_read_d3_debug_data(&mld->fwrt);
- if (iwl_mld_check_err_tables(mld, NULL))
+ if (iwl_mld_fw_needs_restart(mld, NULL))
ret = -ENODEV;
else
ret = iwl_mld_wait_d3_notif(mld, &resume_data, false);
@@ -1922,7 +1948,7 @@
iwl_fw_dbg_read_d3_debug_data(&mld->fwrt);
- if (iwl_mld_check_err_tables(mld, bss_vif)) {
+ if (iwl_mld_fw_needs_restart(mld, bss_vif)) {
fw_err = true;
goto err;
}
diff --git a/versions b/versions
index 69868ec..6cd0cef 100644
--- a/versions
+++ b/versions
@@ -2,4 +2,4 @@
BACKPORTED_KERNEL_VERSION="(see git)"
BACKPORTED_KERNEL_NAME="iwlwifi"
BACKPORTS_BUILD_TSTAMP=__DATE__ \" \" __TIME__
-BACKPORTS_GIT_TRACKED="iwlwifi-stack-public:master:13359:7ef8a8a5"
+BACKPORTS_GIT_TRACKED="iwlwifi-stack-public:master:13360:1bf74f16"