Fri, Jan 12, 2024 at 10:59:45AM CET, jedrzej.jagiel...@intel.com wrote:
>Currently after entering FW Recovery Mode we have no info in logs
>regarding current FW state.
>
>Add function reading content of the alternate RAM storing that info and
>print it into the log. Additionally print state of CSR register.
>
>Reviewed-by: Jan Sokolowski <jan.sokolow...@intel.com>
>Signed-off-by: Jedrzej Jagielski <jedrzej.jagiel...@intel.com>
>---
> drivers/net/ethernet/intel/i40e/i40e.h        |  2 ++
> drivers/net/ethernet/intel/i40e/i40e_main.c   | 35 +++++++++++++++++++
> .../net/ethernet/intel/i40e/i40e_register.h   |  2 ++
> drivers/net/ethernet/intel/i40e/i40e_type.h   |  5 +++
> 4 files changed, 44 insertions(+)
>
>diff --git a/drivers/net/ethernet/intel/i40e/i40e.h 
>b/drivers/net/ethernet/intel/i40e/i40e.h
>index ba24f3fa92c3..6ebd2fd15e0e 100644
>--- a/drivers/net/ethernet/intel/i40e/i40e.h
>+++ b/drivers/net/ethernet/intel/i40e/i40e.h
>@@ -23,6 +23,8 @@
> /* Useful i40e defaults */
> #define I40E_MAX_VEB                  16
> 
>+#define I40_BYTES_PER_WORD            2
>+
> #define I40E_MAX_NUM_DESCRIPTORS      4096
> #define I40E_MAX_NUM_DESCRIPTORS_XL710        8160
> #define I40E_MAX_CSR_SPACE            (4 * 1024 * 1024 - 64 * 1024)
>diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c 
>b/drivers/net/ethernet/intel/i40e/i40e_main.c
>index 4977ff391fed..f5abe8c9a88d 100644
>--- a/drivers/net/ethernet/intel/i40e/i40e_main.c
>+++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
>@@ -15414,6 +15414,39 @@ static int i40e_handle_resets(struct i40e_pf *pf)
>       return is_empr ? -EIO : pfr;
> }
> 
>+/**
>+ * i40e_log_fw_recovery_mode - log current FW state in Recovery Mode
>+ * @pf: board private structure
>+ *
>+ * Read alternate RAM and CSR registers and print them to the log
>+ **/
>+static void i40e_log_fw_recovery_mode(struct i40e_pf *pf)
>+{
>+      u8 buf[I40E_FW_STATE_BUFF_SIZE] = {0};
>+      struct i40e_hw *hw = &pf->hw;
>+      u8 fws0b, fws1b;
>+      u32 fwsts;
>+      int ret;
>+
>+      ret = i40e_aq_alternate_read_indirect(hw, I40E_ALT_CANARY,
>+                                            I40E_ALT_BUFF_DWORD_SIZE, buf);
>+      if (ret) {
>+              dev_warn(&pf->pdev->dev,
>+                       "Cannot get FW trace buffer due to FW err %d aq_err 
>%s\n",
>+                       ret, i40e_aq_str(hw, hw->aq.asq_last_status));
>+              return;
>+      }
>+
>+      fwsts = rd32(&pf->hw, I40E_GL_FWSTS);
>+      fws0b = FIELD_GET(I40E_GL_FWSTS_FWS0B_MASK, fwsts);
>+      fws1b = FIELD_GET(I40E_GL_FWSTS_FWS1B_MASK, fwsts);
>+
>+      print_hex_dump(KERN_DEBUG, "Trace Buffer: ", DUMP_PREFIX_NONE,
>+                     BITS_PER_BYTE * I40_BYTES_PER_WORD, 1, buf,
>+                     I40E_FW_STATE_BUFF_SIZE, true);

I don't follow. Why exactly you want to pollute dmesg with another
messages? Can't you use some other interface? Devlink health reporter
looks like a suitable alternative for this kind of operations.



>+      dev_dbg(&pf->pdev->dev, "FWS0B=0x%x, FWS1B=0x%x\n", fws0b, fws1b);
>+}
>+
> /**
>  * i40e_init_recovery_mode - initialize subsystems needed in recovery mode
>  * @pf: board private structure
>@@ -15497,6 +15530,8 @@ static int i40e_init_recovery_mode(struct i40e_pf *pf, 
>struct i40e_hw *hw)
>       mod_timer(&pf->service_timer,
>                 round_jiffies(jiffies + pf->service_timer_period));
> 
>+      i40e_log_fw_recovery_mode(pf);
>+
>       return 0;
> 
> err_switch_setup:
>diff --git a/drivers/net/ethernet/intel/i40e/i40e_register.h 
>b/drivers/net/ethernet/intel/i40e/i40e_register.h
>index 14ab642cafdb..8e254ff9c035 100644
>--- a/drivers/net/ethernet/intel/i40e/i40e_register.h
>+++ b/drivers/net/ethernet/intel/i40e/i40e_register.h
>@@ -169,6 +169,8 @@
> #define I40E_PRTDCB_TPFCTS_PFCTIMER_SHIFT 0
> #define I40E_PRTDCB_TPFCTS_PFCTIMER_MASK I40E_MASK(0x3FFF, 
> I40E_PRTDCB_TPFCTS_PFCTIMER_SHIFT)
> #define I40E_GL_FWSTS 0x00083048 /* Reset: POR */
>+#define I40E_GL_FWSTS_FWS0B_SHIFT 0
>+#define I40E_GL_FWSTS_FWS0B_MASK  I40E_MASK(0xFF, I40E_GL_FWSTS_FWS0B_SHIFT)
> #define I40E_GL_FWSTS_FWS1B_SHIFT 16
> #define I40E_GL_FWSTS_FWS1B_MASK I40E_MASK(0xFF, I40E_GL_FWSTS_FWS1B_SHIFT)
> #define I40E_GL_FWSTS_FWS1B_EMPR_0 I40E_MASK(0x20, I40E_GL_FWSTS_FWS1B_SHIFT)
>diff --git a/drivers/net/ethernet/intel/i40e/i40e_type.h 
>b/drivers/net/ethernet/intel/i40e/i40e_type.h
>index 725da7edbca3..0372a8d519ad 100644
>--- a/drivers/net/ethernet/intel/i40e/i40e_type.h
>+++ b/drivers/net/ethernet/intel/i40e/i40e_type.h
>@@ -1372,6 +1372,11 @@ struct i40e_lldp_variables {
> #define I40E_ALT_BW_VALUE_MASK                0xFF
> #define I40E_ALT_BW_VALID_MASK                0x80000000
> 
>+/* Alternate Ram Trace Buffer*/
>+#define I40E_ALT_CANARY                               0xABCDEFAB
>+#define I40E_ALT_BUFF_DWORD_SIZE              0x14 /* in dwords */
>+#define I40E_FW_STATE_BUFF_SIZE                       80
>+
> /* RSS Hash Table Size */
> #define I40E_PFQF_CTL_0_HASHLUTSIZE_512       0x00010000
> 
>-- 
>2.31.1
>
>

Reply via email to