Commit 7aabde39 authored by Ivan Vecera's avatar Ivan Vecera Committed by David S. Miller

i40e: Split and refactor i40e_nvm_version_str()

The function formats NVM version string according adapter's
EETrackID value. If this value OEM specific (0xffffffff) then
the reported version is with format:
"<gen>.<snap>.<release>"
and in other case
"<nvm_maj>.<nvm_min> <eetrackid> <cvid_maj>.<cvid_bld>.<cvid_min>"

These versions are reported in the subsequent patch in this series
that implements devlink .info_get but separately.

So split the function into separate ones, refactor it to use them
and remove ugly static string buffer.
Additionally convert NVM/OEM version mask macros to use GENMASK and
use FIELD_GET/FIELD_PREP for them in i40e_nvm_version_str() and
i40e_get_oem_version(). This makes code more readable and allows
us to remove related shift macros.
Signed-off-by: default avatarIvan Vecera <ivecera@redhat.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 9e479d64
...@@ -49,23 +49,19 @@ ...@@ -49,23 +49,19 @@
#define I40E_QUEUE_WAIT_RETRY_LIMIT 10 #define I40E_QUEUE_WAIT_RETRY_LIMIT 10
#define I40E_INT_NAME_STR_LEN (IFNAMSIZ + 16) #define I40E_INT_NAME_STR_LEN (IFNAMSIZ + 16)
#define I40E_NVM_VERSION_LO_SHIFT 0
#define I40E_NVM_VERSION_LO_MASK (0xff << I40E_NVM_VERSION_LO_SHIFT)
#define I40E_NVM_VERSION_HI_SHIFT 12
#define I40E_NVM_VERSION_HI_MASK (0xf << I40E_NVM_VERSION_HI_SHIFT)
#define I40E_OEM_VER_BUILD_MASK 0xffff
#define I40E_OEM_VER_PATCH_MASK 0xff
#define I40E_OEM_VER_BUILD_SHIFT 8
#define I40E_OEM_VER_SHIFT 24
#define I40E_PHY_DEBUG_ALL \ #define I40E_PHY_DEBUG_ALL \
(I40E_AQ_PHY_DEBUG_DISABLE_LINK_FW | \ (I40E_AQ_PHY_DEBUG_DISABLE_LINK_FW | \
I40E_AQ_PHY_DEBUG_DISABLE_ALL_LINK_FW) I40E_AQ_PHY_DEBUG_DISABLE_ALL_LINK_FW)
#define I40E_OEM_EETRACK_ID 0xffffffff #define I40E_OEM_EETRACK_ID 0xffffffff
#define I40E_OEM_GEN_SHIFT 24 #define I40E_NVM_VERSION_LO_MASK GENMASK(7, 0)
#define I40E_OEM_SNAP_MASK 0x00ff0000 #define I40E_NVM_VERSION_HI_MASK GENMASK(15, 12)
#define I40E_OEM_SNAP_SHIFT 16 #define I40E_OEM_VER_BUILD_MASK GENMASK(23, 8)
#define I40E_OEM_RELEASE_MASK 0x0000ffff #define I40E_OEM_VER_PATCH_MASK GENMASK(7, 0)
#define I40E_OEM_VER_MASK GENMASK(31, 24)
#define I40E_OEM_GEN_MASK GENMASK(31, 24)
#define I40E_OEM_SNAP_MASK GENMASK(23, 16)
#define I40E_OEM_RELEASE_MASK GENMASK(15, 0)
#define I40E_RX_DESC(R, i) \ #define I40E_RX_DESC(R, i) \
(&(((union i40e_rx_desc *)((R)->desc))[i])) (&(((union i40e_rx_desc *)((R)->desc))[i]))
...@@ -954,43 +950,104 @@ struct i40e_device { ...@@ -954,43 +950,104 @@ struct i40e_device {
}; };
/** /**
* i40e_nvm_version_str - format the NVM version strings * i40e_info_nvm_ver - format the NVM version string
* @hw: ptr to the hardware info * @hw: ptr to the hardware info
* @buf: string buffer to store
* @len: buffer size
*
* Formats NVM version string as:
* <gen>.<snap>.<release> when eetrackid == I40E_OEM_EETRACK_ID
* <nvm_major>.<nvm_minor> otherwise
**/ **/
static inline char *i40e_nvm_version_str(struct i40e_hw *hw) static inline void i40e_info_nvm_ver(struct i40e_hw *hw, char *buf, size_t len)
{ {
static char buf[32]; struct i40e_nvm_info *nvm = &hw->nvm;
u32 full_ver;
full_ver = hw->nvm.oem_ver; if (nvm->eetrack == I40E_OEM_EETRACK_ID) {
u32 full_ver = nvm->oem_ver;
if (hw->nvm.eetrack == I40E_OEM_EETRACK_ID) {
u8 gen, snap; u8 gen, snap;
u16 release; u16 release;
gen = (u8)(full_ver >> I40E_OEM_GEN_SHIFT); gen = FIELD_GET(I40E_OEM_GEN_MASK, full_ver);
snap = (u8)((full_ver & I40E_OEM_SNAP_MASK) >> snap = FIELD_GET(I40E_OEM_SNAP_MASK, full_ver);
I40E_OEM_SNAP_SHIFT); release = FIELD_GET(I40E_OEM_RELEASE_MASK, full_ver);
release = (u16)(full_ver & I40E_OEM_RELEASE_MASK); snprintf(buf, len, "%x.%x.%x", gen, snap, release);
snprintf(buf, sizeof(buf), "%x.%x.%x", gen, snap, release);
} else { } else {
u8 ver, patch; u8 major, minor;
major = FIELD_GET(I40E_NVM_VERSION_HI_MASK, nvm->version);
minor = FIELD_GET(I40E_NVM_VERSION_LO_MASK, nvm->version);
snprintf(buf, len, "%x.%02x", major, minor);
}
}
/**
* i40e_info_eetrack - format the EETrackID string
* @hw: ptr to the hardware info
* @buf: string buffer to store
* @len: buffer size
*
* Returns hexadecimally formated EETrackID if it is
* different from I40E_OEM_EETRACK_ID or empty string.
**/
static inline void i40e_info_eetrack(struct i40e_hw *hw, char *buf, size_t len)
{
struct i40e_nvm_info *nvm = &hw->nvm;
buf[0] = '\0';
if (nvm->eetrack != I40E_OEM_EETRACK_ID)
snprintf(buf, len, "0x%08x", nvm->eetrack);
}
/**
* i40e_info_civd_ver - format the NVM version strings
* @hw: ptr to the hardware info
* @buf: string buffer to store
* @len: buffer size
*
* Returns formated combo image version if adapter's EETrackID is
* different from I40E_OEM_EETRACK_ID or empty string.
**/
static inline void i40e_info_civd_ver(struct i40e_hw *hw, char *buf, size_t len)
{
struct i40e_nvm_info *nvm = &hw->nvm;
buf[0] = '\0';
if (nvm->eetrack != I40E_OEM_EETRACK_ID) {
u32 full_ver = nvm->oem_ver;
u8 major, minor;
u16 build; u16 build;
ver = (u8)(full_ver >> I40E_OEM_VER_SHIFT); major = FIELD_GET(I40E_OEM_VER_MASK, full_ver);
build = (u16)((full_ver >> I40E_OEM_VER_BUILD_SHIFT) & build = FIELD_GET(I40E_OEM_VER_BUILD_MASK, full_ver);
I40E_OEM_VER_BUILD_MASK); minor = FIELD_GET(I40E_OEM_VER_PATCH_MASK, full_ver);
patch = (u8)(full_ver & I40E_OEM_VER_PATCH_MASK); snprintf(buf, len, "%d.%d.%d", major, build, minor);
snprintf(buf, sizeof(buf),
"%x.%02x 0x%x %d.%d.%d",
(hw->nvm.version & I40E_NVM_VERSION_HI_MASK) >>
I40E_NVM_VERSION_HI_SHIFT,
(hw->nvm.version & I40E_NVM_VERSION_LO_MASK) >>
I40E_NVM_VERSION_LO_SHIFT,
hw->nvm.eetrack, ver, build, patch);
} }
}
/**
* i40e_nvm_version_str - format the NVM version strings
* @hw: ptr to the hardware info
* @buf: string buffer to store
* @len: buffer size
**/
static inline char *i40e_nvm_version_str(struct i40e_hw *hw, char *buf,
size_t len)
{
char ver[16] = " ";
/* Get NVM version */
i40e_info_nvm_ver(hw, buf, len);
/* Append EETrackID if provided */
i40e_info_eetrack(hw, &ver[1], sizeof(ver) - 1);
if (strlen(ver) > 1)
strlcat(buf, ver, len);
/* Append combo image version if provided */
i40e_info_civd_ver(hw, &ver[1], sizeof(ver) - 1);
if (strlen(ver) > 1)
strlcat(buf, ver, len);
return buf; return buf;
} }
......
...@@ -2006,7 +2006,7 @@ static void i40e_get_drvinfo(struct net_device *netdev, ...@@ -2006,7 +2006,7 @@ static void i40e_get_drvinfo(struct net_device *netdev,
struct i40e_pf *pf = vsi->back; struct i40e_pf *pf = vsi->back;
strscpy(drvinfo->driver, i40e_driver_name, sizeof(drvinfo->driver)); strscpy(drvinfo->driver, i40e_driver_name, sizeof(drvinfo->driver));
strscpy(drvinfo->fw_version, i40e_nvm_version_str(&pf->hw), i40e_nvm_version_str(&pf->hw, drvinfo->fw_version,
sizeof(drvinfo->fw_version)); sizeof(drvinfo->fw_version));
strscpy(drvinfo->bus_info, pci_name(pf->pdev), strscpy(drvinfo->bus_info, pci_name(pf->pdev),
sizeof(drvinfo->bus_info)); sizeof(drvinfo->bus_info));
......
...@@ -10798,7 +10798,9 @@ static void i40e_get_oem_version(struct i40e_hw *hw) ...@@ -10798,7 +10798,9 @@ static void i40e_get_oem_version(struct i40e_hw *hw)
&gen_snap); &gen_snap);
i40e_read_nvm_word(hw, block_offset + I40E_NVM_OEM_RELEASE_OFFSET, i40e_read_nvm_word(hw, block_offset + I40E_NVM_OEM_RELEASE_OFFSET,
&release); &release);
hw->nvm.oem_ver = (gen_snap << I40E_OEM_SNAP_SHIFT) | release; hw->nvm.oem_ver =
FIELD_PREP(I40E_OEM_GEN_MASK | I40E_OEM_SNAP_MASK, gen_snap) |
FIELD_PREP(I40E_OEM_RELEASE_MASK, release);
hw->nvm.eetrack = I40E_OEM_EETRACK_ID; hw->nvm.eetrack = I40E_OEM_EETRACK_ID;
} }
...@@ -15674,6 +15676,7 @@ static int i40e_probe(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -15674,6 +15676,7 @@ static int i40e_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
struct i40e_hw *hw; struct i40e_hw *hw;
static u16 pfs_found; static u16 pfs_found;
u16 wol_nvm_bits; u16 wol_nvm_bits;
char nvm_ver[32];
u16 link_status; u16 link_status;
#ifdef CONFIG_I40E_DCB #ifdef CONFIG_I40E_DCB
int status; int status;
...@@ -15845,11 +15848,12 @@ static int i40e_probe(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -15845,11 +15848,12 @@ static int i40e_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
i40e_get_oem_version(hw); i40e_get_oem_version(hw);
/* provide nvm, fw, api versions, vendor:device id, subsys vendor:device id */ /* provide nvm, fw, api versions, vendor:device id, subsys vendor:device id */
i40e_nvm_version_str(hw, nvm_ver, sizeof(nvm_ver));
dev_info(&pdev->dev, "fw %d.%d.%05d api %d.%d nvm %s [%04x:%04x] [%04x:%04x]\n", dev_info(&pdev->dev, "fw %d.%d.%05d api %d.%d nvm %s [%04x:%04x] [%04x:%04x]\n",
hw->aq.fw_maj_ver, hw->aq.fw_min_ver, hw->aq.fw_build, hw->aq.fw_maj_ver, hw->aq.fw_min_ver, hw->aq.fw_build,
hw->aq.api_maj_ver, hw->aq.api_min_ver, hw->aq.api_maj_ver, hw->aq.api_min_ver, nvm_ver,
i40e_nvm_version_str(hw), hw->vendor_id, hw->device_id, hw->vendor_id, hw->device_id, hw->subsystem_vendor_id,
hw->subsystem_vendor_id, hw->subsystem_device_id); hw->subsystem_device_id);
if (hw->aq.api_maj_ver == I40E_FW_API_VERSION_MAJOR && if (hw->aq.api_maj_ver == I40E_FW_API_VERSION_MAJOR &&
hw->aq.api_min_ver > I40E_FW_MINOR_VERSION(hw)) hw->aq.api_min_ver > I40E_FW_MINOR_VERSION(hw))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment