iwlwifi: recognize missing PNVM data and then log filename
authorLuca Coelho <luciano.coelho@intel.com>
Fri, 10 Dec 2021 07:06:20 +0000 (09:06 +0200)
committerLuca Coelho <luciano.coelho@intel.com>
Tue, 21 Dec 2021 10:35:05 +0000 (12:35 +0200)
We can detect that a FW SYSASSERT is due to missing PNVM data by
checking the assertion code.  When this happens, it's is useful for
the user if we print the filename where the driver is looking for the
data.

Add the PNVM missing assertion code to the dump list and print out the
name of the file we're looking for when this happens.

Reported-by: Sam Edwards <CFSworks@gmail.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
Link: https://lore.kernel.org/r/iwlwifi.20211210090244.1d8725b7518a.I0c36617a7282bd445cda484d97ac4a83022706ee@changeid
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
drivers/net/wireless/intel/iwlwifi/fw/dump.c
drivers/net/wireless/intel/iwlwifi/fw/img.c
drivers/net/wireless/intel/iwlwifi/fw/img.h

index 6c59506ea00db4e04cfe7fad68ac4f878dcd1ac7..81acb7df73d703896640fd333a34a2393b5ab768 100644 (file)
@@ -12,6 +12,7 @@
 #include "iwl-io.h"
 #include "iwl-prph.h"
 #include "iwl-csr.h"
+#include "pnvm.h"
 
 /*
  * Note: This structure is read from the device with IO accesses,
@@ -100,6 +101,7 @@ static void iwl_fwrt_dump_umac_error_log(struct iwl_fw_runtime *fwrt)
        struct iwl_trans *trans = fwrt->trans;
        struct iwl_umac_error_event_table table = {};
        u32 base = fwrt->trans->dbg.umac_error_event_table;
+       char pnvm_name[MAX_PNVM_NAME];
 
        if (!base &&
            !(fwrt->trans->dbg.error_event_table_tlv_status &
@@ -117,6 +119,13 @@ static void iwl_fwrt_dump_umac_error_log(struct iwl_fw_runtime *fwrt)
                        fwrt->trans->status, table.valid);
        }
 
+       if ((table.error_id & ~FW_SYSASSERT_CPU_MASK) ==
+           FW_SYSASSERT_PNVM_MISSING) {
+               iwl_pnvm_get_fs_name(trans, pnvm_name, sizeof(pnvm_name));
+               IWL_ERR(fwrt, "PNVM data is missing, please install %s\n",
+                       pnvm_name);
+       }
+
        IWL_ERR(fwrt, "0x%08X | %s\n", table.error_id,
                iwl_fw_lookup_assert_desc(table.error_id));
        IWL_ERR(fwrt, "0x%08X | umac branchlink1\n", table.blink1);
index 24a9666736913041aeb54d54591e0aceaa4417ae..530674a35eeb2c904b80ab2e8fea51afc579d297 100644 (file)
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
 /*
- * Copyright(c) 2019 - 2020 Intel Corporation
+ * Copyright(c) 2019 - 2021 Intel Corporation
  */
 
 #include "img.h"
@@ -49,10 +49,9 @@ u8 iwl_fw_lookup_notif_ver(const struct iwl_fw *fw, u8 grp, u8 cmd, u8 def)
 }
 EXPORT_SYMBOL_GPL(iwl_fw_lookup_notif_ver);
 
-#define FW_SYSASSERT_CPU_MASK 0xf0000000
 static const struct {
        const char *name;
-       u8 num;
+       u32 num;
 } advanced_lookup[] = {
        { "NMI_INTERRUPT_WDG", 0x34 },
        { "SYSASSERT", 0x35 },
@@ -73,6 +72,7 @@ static const struct {
        { "NMI_INTERRUPT_ACTION_PT", 0x7C },
        { "NMI_INTERRUPT_UNKNOWN", 0x84 },
        { "NMI_INTERRUPT_INST_ACTION_PT", 0x86 },
+       { "PNVM_MISSING", FW_SYSASSERT_PNVM_MISSING },
        { "ADVANCED_SYSASSERT", 0 },
 };
 
index 993bda17fa309f0858023cdd4d4d5aac4b78de49..fa7b1780064c2703f11c10aa4630bf74303abfb3 100644 (file)
@@ -279,4 +279,8 @@ u8 iwl_fw_lookup_cmd_ver(const struct iwl_fw *fw, u8 grp, u8 cmd, u8 def);
 
 u8 iwl_fw_lookup_notif_ver(const struct iwl_fw *fw, u8 grp, u8 cmd, u8 def);
 const char *iwl_fw_lookup_assert_desc(u32 num);
+
+#define FW_SYSASSERT_CPU_MASK          0xf0000000
+#define FW_SYSASSERT_PNVM_MISSING      0x0010070d
+
 #endif  /* __iwl_fw_img_h__ */