net/ice/base: support NVM rollback detection
This patch adds code to detect NVM rollback. The rollback detection is done as part of the HW init flow. When NVM rollback is detected, a warning message is printed along with the FW/NVM version data. To do this, this patch adds a helper function ice_get_nvm_version. Also, a pointer to hw->nvm is already available in ice_init_nvm. Just use this instead of &hw->nvm. Signed-off-by: Anirudh Venkataramanan <anirudh.venkataramanan@intel.com> Signed-off-by: Paul M Stillwell Jr <paul.m.stillwell.jr@intel.com> Signed-off-by: Qi Zhang <qi.z.zhang@intel.com> Acked-by: Xiaolong Ye <xiaolong.ye@intel.com>
This commit is contained in:
parent
6277fc33e2
commit
5b674b57e7
@ -813,6 +813,49 @@ static void ice_get_itr_intrl_gran(struct ice_hw *hw)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* ice_get_nvm_version - get cached NVM version data
|
||||
* @hw: pointer to the hardware structure
|
||||
* @oem_ver: 8 bit NVM version
|
||||
* @oem_build: 16 bit NVM build number
|
||||
* @oem_patch: 8 NVM patch number
|
||||
* @ver_hi: high 16 bits of the NVM version
|
||||
* @ver_lo: low 16 bits of the NVM version
|
||||
*/
|
||||
void
|
||||
ice_get_nvm_version(struct ice_hw *hw, u8 *oem_ver, u16 *oem_build,
|
||||
u8 *oem_patch, u8 *ver_hi, u8 *ver_lo)
|
||||
{
|
||||
struct ice_nvm_info *nvm = &hw->nvm;
|
||||
|
||||
*oem_ver = (u8)((nvm->oem_ver & ICE_OEM_VER_MASK) >> ICE_OEM_VER_SHIFT);
|
||||
*oem_patch = (u8)(nvm->oem_ver & ICE_OEM_VER_PATCH_MASK);
|
||||
*oem_build = (u16)((nvm->oem_ver & ICE_OEM_VER_BUILD_MASK) >>
|
||||
ICE_OEM_VER_BUILD_SHIFT);
|
||||
*ver_hi = (nvm->ver & ICE_NVM_VER_HI_MASK) >> ICE_NVM_VER_HI_SHIFT;
|
||||
*ver_lo = (nvm->ver & ICE_NVM_VER_LO_MASK) >> ICE_NVM_VER_LO_SHIFT;
|
||||
}
|
||||
|
||||
/**
|
||||
* ice_print_rollback_msg - print FW rollback message
|
||||
* @hw: pointer to the hardware structure
|
||||
*/
|
||||
void ice_print_rollback_msg(struct ice_hw *hw)
|
||||
{
|
||||
char nvm_str[ICE_NVM_VER_LEN] = { 0 };
|
||||
u8 oem_ver, oem_patch, ver_hi, ver_lo;
|
||||
u16 oem_build;
|
||||
|
||||
ice_get_nvm_version(hw, &oem_ver, &oem_build, &oem_patch, &ver_hi,
|
||||
&ver_lo);
|
||||
SNPRINTF(nvm_str, sizeof(nvm_str), "%x.%02x 0x%x %d.%d.%d", ver_hi,
|
||||
ver_lo, hw->nvm.eetrack, oem_ver, oem_build, oem_patch);
|
||||
|
||||
ice_warn(hw,
|
||||
"Firmware rollback mode detected. Current version is NVM: %s, FW: %d.%d. Device may exhibit limited functionality. Refer to the Intel(R) Ethernet Adapters and Devices User Guide for details on firmware rollback mode",
|
||||
nvm_str, hw->fw_maj_ver, hw->fw_min_ver);
|
||||
}
|
||||
|
||||
/**
|
||||
* ice_init_hw - main hardware initialization routine
|
||||
* @hw: pointer to the hardware structure
|
||||
@ -848,6 +891,9 @@ enum ice_status ice_init_hw(struct ice_hw *hw)
|
||||
if (status)
|
||||
goto err_unroll_cqinit;
|
||||
|
||||
if (ice_get_fw_mode(hw) == ICE_FW_MODE_ROLLBACK)
|
||||
ice_print_rollback_msg(hw);
|
||||
|
||||
/* Enable FW logging. Not fatal if this fails. */
|
||||
status = ice_cfg_fw_log(hw, true);
|
||||
if (status)
|
||||
|
@ -198,7 +198,11 @@ ice_stat_update40(struct ice_hw *hw, u32 reg, bool prev_stat_loaded,
|
||||
void
|
||||
ice_stat_update32(struct ice_hw *hw, u32 reg, bool prev_stat_loaded,
|
||||
u64 *prev_stat, u64 *cur_stat);
|
||||
void
|
||||
ice_get_nvm_version(struct ice_hw *hw, u8 *oem_ver, u16 *oem_build,
|
||||
u8 *oem_patch, u8 *ver_hi, u8 *ver_lo);
|
||||
enum ice_fw_modes ice_get_fw_mode(struct ice_hw *hw);
|
||||
void ice_print_rollback_msg(struct ice_hw *hw);
|
||||
enum ice_status
|
||||
ice_sched_query_elem(struct ice_hw *hw, u32 node_teid,
|
||||
struct ice_aqc_get_elem *buf);
|
||||
|
@ -292,7 +292,7 @@ enum ice_status ice_init_nvm(struct ice_hw *hw)
|
||||
return status;
|
||||
}
|
||||
|
||||
status = ice_read_sr_word(hw, ICE_SR_NVM_DEV_STARTER_VER, &hw->nvm.ver);
|
||||
status = ice_read_sr_word(hw, ICE_SR_NVM_DEV_STARTER_VER, &nvm->ver);
|
||||
if (status) {
|
||||
ice_debug(hw, ICE_DBG_INIT,
|
||||
"Failed to read DEV starter version.\n");
|
||||
@ -310,7 +310,7 @@ enum ice_status ice_init_nvm(struct ice_hw *hw)
|
||||
return status;
|
||||
}
|
||||
|
||||
hw->nvm.eetrack = (eetrack_hi << 16) | eetrack_lo;
|
||||
nvm->eetrack = (eetrack_hi << 16) | eetrack_lo;
|
||||
|
||||
status = ice_read_sr_word(hw, ICE_SR_BOOT_CFG_PTR, &cfg_ptr);
|
||||
if (status) {
|
||||
@ -331,7 +331,7 @@ enum ice_status ice_init_nvm(struct ice_hw *hw)
|
||||
return status;
|
||||
}
|
||||
|
||||
hw->nvm.oem_ver = ((u32)oem_hi << 16) | oem_lo;
|
||||
nvm->oem_ver = ((u32)oem_hi << 16) | oem_lo;
|
||||
return status;
|
||||
}
|
||||
|
||||
|
@ -436,10 +436,12 @@ struct ice_nvm_info {
|
||||
u32 eetrack; /* NVM data version */
|
||||
u32 oem_ver; /* OEM version info */
|
||||
u16 sr_words; /* Shadow RAM size in words */
|
||||
u16 ver; /* NVM package version */
|
||||
u16 ver; /* dev starter version */
|
||||
u8 blank_nvm_mode; /* is NVM empty (no FW present)*/
|
||||
};
|
||||
|
||||
#define ICE_NVM_VER_LEN 32
|
||||
|
||||
/* Max number of port to queue branches w.r.t topology */
|
||||
#define ICE_TXSCHED_MAX_BRANCHES ICE_MAX_TRAFFIC_CLASS
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user