]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
i40e: check_recovery_mode had wrong if statement
authorAdrian Podlawski <adrian.podlawski@intel.com>
Tue, 23 Jul 2019 10:01:35 +0000 (06:01 -0400)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Thu, 22 Aug 2019 20:24:13 +0000 (13:24 -0700)
Function check_recovery_mode had wrong if statement.
Now we check proper FWS1B register values, which are responsible for
the recovery mode. Recovery mode has 4 values for x710 and 2 for x722.
That's why we need 6 different flags which are defined in the code.
Now in the if statement, we recognize type of mac address
and register value.
Without those changes driver could show wrong state.

Signed-off-by: Adrian Podlawski <adrian.podlawski@intel.com>
Tested-by: Andrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/i40e/i40e_main.c
drivers/net/ethernet/intel/i40e/i40e_register.h

index b807dd6b1417394a692ef642660863e51819b4a5..4551d97771c97462dd7b1609f5858c6c9057b51f 100644 (file)
@@ -14578,9 +14578,20 @@ void i40e_set_fec_in_flags(u8 fec_cfg, u32 *flags)
  **/
 static bool i40e_check_recovery_mode(struct i40e_pf *pf)
 {
-       u32 val = rd32(&pf->hw, I40E_GL_FWSTS);
-
-       if (val & I40E_GL_FWSTS_FWS1B_MASK) {
+       u32 val = rd32(&pf->hw, I40E_GL_FWSTS) & I40E_GL_FWSTS_FWS1B_MASK;
+       bool is_recovery_mode = false;
+
+       if (pf->hw.mac.type == I40E_MAC_XL710)
+               is_recovery_mode =
+               val == I40E_XL710_GL_FWSTS_FWS1B_REC_MOD_CORER_MASK ||
+               val == I40E_XL710_GL_FWSTS_FWS1B_REC_MOD_GLOBR_MASK ||
+               val == I40E_XL710_GL_FWSTS_FWS1B_REC_MOD_TRANSITION_MASK ||
+               val == I40E_XL710_GL_FWSTS_FWS1B_REC_MOD_NVM_MASK;
+       if (pf->hw.mac.type == I40E_MAC_X722)
+               is_recovery_mode =
+               val == I40E_X722_GL_FWSTS_FWS1B_REC_MOD_CORER_MASK ||
+               val == I40E_X722_GL_FWSTS_FWS1B_REC_MOD_GLOBR_MASK;
+       if (is_recovery_mode) {
                dev_notice(&pf->pdev->dev, "Firmware recovery mode detected. Limiting functionality.\n");
                dev_notice(&pf->pdev->dev, "Refer to the Intel(R) Ethernet Adapters and Devices User Guide for details on firmware recovery mode.\n");
                set_bit(__I40E_RECOVERY_MODE, pf->state);
index 330ac19a5daed1e6c2f2f117014fe5b50007d23e..d35d690ca10fbab44495b3f53fd1957b556023a1 100644 (file)
 #define I40E_GL_FWSTS_FWRI_MASK I40E_MASK(0x1, I40E_GL_FWSTS_FWRI_SHIFT)
 #define I40E_GL_FWSTS_FWS1B_SHIFT 16
 #define I40E_GL_FWSTS_FWS1B_MASK I40E_MASK(0xFF, I40E_GL_FWSTS_FWS1B_SHIFT)
+#define I40E_XL710_GL_FWSTS_FWS1B_REC_MOD_CORER_MASK I40E_MASK(0x30, I40E_GL_FWSTS_FWS1B_SHIFT)
+#define I40E_XL710_GL_FWSTS_FWS1B_REC_MOD_GLOBR_MASK I40E_MASK(0x31, I40E_GL_FWSTS_FWS1B_SHIFT)
+#define I40E_XL710_GL_FWSTS_FWS1B_REC_MOD_TRANSITION_MASK I40E_MASK(0x32, I40E_GL_FWSTS_FWS1B_SHIFT)
+#define I40E_XL710_GL_FWSTS_FWS1B_REC_MOD_NVM_MASK I40E_MASK(0x33, I40E_GL_FWSTS_FWS1B_SHIFT)
+#define I40E_X722_GL_FWSTS_FWS1B_REC_MOD_CORER_MASK I40E_MASK(0xB, I40E_GL_FWSTS_FWS1B_SHIFT)
+#define I40E_X722_GL_FWSTS_FWS1B_REC_MOD_GLOBR_MASK I40E_MASK(0xC, I40E_GL_FWSTS_FWS1B_SHIFT)
 #define I40E_GLGEN_CLKSTAT 0x000B8184 /* Reset: POR */
 #define I40E_GLGEN_CLKSTAT_CLKMODE_SHIFT 0
 #define I40E_GLGEN_CLKSTAT_CLKMODE_MASK I40E_MASK(0x1, I40E_GLGEN_CLKSTAT_CLKMODE_SHIFT)