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"