Skip to content

Commit

Permalink
drivers/net: fix FW version query
Browse files Browse the repository at this point in the history
[ upstream commit d345d6c ]

Fixes a few different things:
* Remove 'fw_version' NULL checks, it is allowed if the 'fw_size' is
  zero, 'fw_version' being NULL but 'fw_size' not zero condition checked
  in ethdev layer
* Be sure required buffer size is returned if provided one is not big
  enough, instead of returning success (0)
* Document in doxygen comment the '-EINVAL' is a valid return type
* Take into account that 'snprintf' can return negative value
* Cast length to 'size_t' to compare it with 'fw_size'

Fixes: bb42aa9 ("net/atlantic: configure device start/stop")
Fixes: ff70acd ("net/axgbe: support reading FW version")
Fixes: e2652b0 ("net/bnxt: support get FW version")
Fixes: cf0fab1 ("net/dpaa: support firmware version get API")
Fixes: 748eccb ("net/dpaa2: add support for firmware version get")
Fixes: b883c06 ("net/e1000: add firmware version get")
Fixes: 2934306 ("net/enic: add handler to return firmware version")
Fixes: 1f5ca0b ("net/hns3: support some device operations")
Fixes: bd5b867 ("net/hns3: modify format for firmware version")
Fixes: ed0dfdd ("net/i40e: add firmware version get")
Fixes: e31cb9a ("net/ice: support FW version getting")
Fixes: 4f09bc5 ("net/igc: implement device base operations")
Fixes: eec10fb ("net/ionic: support FW version")
Fixes: 8b0b565 ("net/ixgbe: add firmware version get")
Fixes: 4d9f5b8 ("net/octeontx2: add FW version get operation")
Fixes: f97b56f ("net/qede: support FW version query")
Fixes: 83fef46 ("net/sfc: add callback to retrieve FW version")
Fixes: bc84ac0 ("net/txgbe: support getting FW version")
Fixes: 2191347 ("ethdev: add firmware version get")

Signed-off-by: Ferruh Yigit <ferruh.yigit@intel.com>
Acked-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
Acked-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
Acked-by: Haiyue Wang <haiyue.wang@intel.com>
Acked-by: Rasesh Mody <rmody@marvell.com>
Acked-by: Jiawen Wu <jiawenwu@trustnetic.com>
Acked-by: Beilei Xing <beilei.xing@intel.com>
Acked-by: Hemant Agrawal <hemant.agrawal@nxp.com>
  • Loading branch information
Ferruh Yigit authored and steevenlee committed Jun 8, 2021
1 parent b65e812 commit 3ab9cfb
Show file tree
Hide file tree
Showing 17 changed files with 60 additions and 38 deletions.
7 changes: 4 additions & 3 deletions drivers/net/atlantic/atl_ethdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -1073,18 +1073,19 @@ atl_fw_version_get(struct rte_eth_dev *dev, char *fw_version, size_t fw_size)
{
struct aq_hw_s *hw = ATL_DEV_PRIVATE_TO_HW(dev->data->dev_private);
uint32_t fw_ver = 0;
unsigned int ret = 0;
int ret = 0;

ret = hw_atl_utils_get_fw_version(hw, &fw_ver);
if (ret)
return -EIO;

ret = snprintf(fw_version, fw_size, "%u.%u.%u", fw_ver >> 24,
(fw_ver >> 16) & 0xFFU, fw_ver & 0xFFFFU);
if (ret < 0)
return -EINVAL;

ret += 1; /* add string null-terminator */

if (fw_size < ret)
if (fw_size < (size_t)ret)
return ret;

return 0;
Expand Down
4 changes: 3 additions & 1 deletion drivers/net/bnxt/bnxt_ethdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -2763,9 +2763,11 @@ bnxt_fw_version_get(struct rte_eth_dev *dev, char *fw_version, size_t fw_size)

ret = snprintf(fw_version, fw_size, "%d.%d.%d.%d",
fw_major, fw_minor, fw_updt, fw_rsvd);
if (ret < 0)
return -EINVAL;

ret += 1; /* add the size of '\0' */
if (fw_size < (uint32_t)ret)
if (fw_size < (size_t)ret)
return ret;
else
return 0;
Expand Down
6 changes: 4 additions & 2 deletions drivers/net/dpaa/dpaa_ethdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -538,9 +538,11 @@ dpaa_fw_version_get(struct rte_eth_dev *dev __rte_unused,

ret = snprintf(fw_version, fw_size, "SVR:%x-fman-v%x",
svr_ver, fman_ip_rev);
ret += 1; /* add the size of '\0' */
if (ret < 0)
return -EINVAL;

if (fw_size < (uint32_t)ret)
ret += 1; /* add the size of '\0' */
if (fw_size < (size_t)ret)
return ret;
else
return 0;
Expand Down
4 changes: 3 additions & 1 deletion drivers/net/dpaa2/dpaa2_ethdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -225,9 +225,11 @@ dpaa2_fw_version_get(struct rte_eth_dev *dev,
mc_ver_info.major,
mc_ver_info.minor,
mc_ver_info.revision);
if (ret < 0)
return -EINVAL;

ret += 1; /* add the size of '\0' */
if (fw_size < (uint32_t)ret)
if (fw_size < (size_t)ret)
return ret;
else
return 0;
Expand Down
4 changes: 3 additions & 1 deletion drivers/net/e1000/igb_ethdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -2161,9 +2161,11 @@ eth_igb_fw_version_get(struct rte_eth_dev *dev, char *fw_version,
}
break;
}
if (ret < 0)
return -EINVAL;

ret += 1; /* add the size of '\0' */
if (fw_size < (u32)ret)
if (fw_size < (size_t)ret)
return ret;
else
return 0;
Expand Down
15 changes: 10 additions & 5 deletions drivers/net/enic/enic_ethdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -1061,16 +1061,21 @@ static int enicpmd_dev_fw_version_get(struct rte_eth_dev *eth_dev,
int ret;

ENICPMD_FUNC_TRACE();
if (fw_version == NULL || fw_size <= 0)
return -EINVAL;

enic = pmd_priv(eth_dev);
ret = vnic_dev_fw_info(enic->vdev, &info);
if (ret)
return ret;
snprintf(fw_version, fw_size, "%s %s",
ret = snprintf(fw_version, fw_size, "%s %s",
info->fw_version, info->fw_build);
fw_version[fw_size - 1] = '\0';
return 0;
if (ret < 0)
return -EINVAL;

ret += 1; /* add the size of '\0' */
if (fw_size < (size_t)ret)
return ret;
else
return 0;
}

static const struct eth_dev_ops enicpmd_eth_dev_ops = {
Expand Down
5 changes: 4 additions & 1 deletion drivers/net/hns3/hns3_ethdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -2647,8 +2647,11 @@ hns3_fw_version_get(struct rte_eth_dev *eth_dev, char *fw_version,
HNS3_FW_VERSION_BYTE1_S),
hns3_get_field(version, HNS3_FW_VERSION_BYTE0_M,
HNS3_FW_VERSION_BYTE0_S));
if (ret < 0)
return -EINVAL;

ret += 1; /* add the size of '\0' */
if (fw_size < (uint32_t)ret)
if (fw_size < (size_t)ret)
return ret;
else
return 0;
Expand Down
5 changes: 4 additions & 1 deletion drivers/net/hns3/hns3_ethdev_vf.c
Original file line number Diff line number Diff line change
Expand Up @@ -2046,8 +2046,11 @@ hns3vf_fw_version_get(struct rte_eth_dev *eth_dev, char *fw_version,
HNS3_FW_VERSION_BYTE1_S),
hns3_get_field(version, HNS3_FW_VERSION_BYTE0_M,
HNS3_FW_VERSION_BYTE0_S));
if (ret < 0)
return -EINVAL;

ret += 1; /* add the size of '\0' */
if (fw_size < (uint32_t)ret)
if (fw_size < (size_t)ret)
return ret;
else
return 0;
Expand Down
4 changes: 3 additions & 1 deletion drivers/net/i40e/i40e_ethdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -3743,9 +3743,11 @@ i40e_fw_version_get(struct rte_eth_dev *dev, char *fw_version, size_t fw_size)
((hw->nvm.version >> 4) & 0xff),
(hw->nvm.version & 0xf), hw->nvm.eetrack,
ver, build, patch);
if (ret < 0)
return -EINVAL;

ret += 1; /* add the size of '\0' */
if (fw_size < (u32)ret)
if (fw_size < (size_t)ret)
return ret;
else
return 0;
Expand Down
4 changes: 3 additions & 1 deletion drivers/net/ice/ice_ethdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -4579,10 +4579,12 @@ ice_fw_version_get(struct rte_eth_dev *dev, char *fw_version, size_t fw_size)
hw->flash.nvm.minor,
hw->flash.nvm.eetrack,
ver, build, patch);
if (ret < 0)
return -EINVAL;

/* add the size of '\0' */
ret += 1;
if (fw_size < (u32)ret)
if (fw_size < (size_t)ret)
return ret;
else
return 0;
Expand Down
4 changes: 3 additions & 1 deletion drivers/net/igc/igc_ethdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -1476,9 +1476,11 @@ eth_igc_fw_version_get(struct rte_eth_dev *dev, char *fw_version,
fw.eep_build);
}
}
if (ret < 0)
return -EINVAL;

ret += 1; /* add the size of '\0' */
if (fw_size < (u32)ret)
if (fw_size < (size_t)ret)
return ret;
else
return 0;
Expand Down
15 changes: 9 additions & 6 deletions drivers/net/ionic/ionic_ethdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -218,15 +218,18 @@ ionic_dev_fw_version_get(struct rte_eth_dev *eth_dev,
{
struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev);
struct ionic_adapter *adapter = lif->adapter;
int ret;

if (fw_version == NULL || fw_size <= 0)
return -EINVAL;

snprintf(fw_version, fw_size, "%s",
ret = snprintf(fw_version, fw_size, "%s",
adapter->fw_version);
fw_version[fw_size - 1] = '\0';
if (ret < 0)
return -EINVAL;

return 0;
ret += 1; /* add the size of '\0' */
if (fw_size < (size_t)ret)
return ret;
else
return 0;
}

/*
Expand Down
4 changes: 3 additions & 1 deletion drivers/net/ixgbe/ixgbe_ethdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -3808,9 +3808,11 @@ ixgbe_fw_version_get(struct rte_eth_dev *dev, char *fw_version, size_t fw_size)

etrack_id = (eeprom_verh << 16) | eeprom_verl;
ret = snprintf(fw_version, fw_size, "0x%08x", etrack_id);
if (ret < 0)
return -EINVAL;

ret += 1; /* add the size of '\0' */
if (fw_size < (u32)ret)
if (fw_size < (size_t)ret)
return ret;
else
return 0;
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/octeontx2/otx2_ethdev_ops.c
Original file line number Diff line number Diff line change
Expand Up @@ -453,7 +453,7 @@ otx2_nix_fw_version_get(struct rte_eth_dev *eth_dev, char *fw_version,
rc = strlcpy(fw_version, (char *)dev->mkex_pfl_name, rc);

rc += 1; /* Add the size of '\0' */
if (fw_size < (uint32_t)rc)
if (fw_size < (size_t)rc)
return rc;

return 0;
Expand Down
3 changes: 0 additions & 3 deletions drivers/net/qede/qede_ethdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -237,9 +237,6 @@ qede_fw_version_get(struct rte_eth_dev *dev, char *fw_ver, size_t fw_size)
static char ver_str[QEDE_PMD_DRV_VER_STR_SIZE];
size_t size;

if (fw_ver == NULL)
return 0;

if (IS_PF(edev))
snprintf(ver_str, QEDE_PMD_DRV_VER_STR_SIZE, "%s",
QEDE_PMD_FW_VERSION);
Expand Down
8 changes: 0 additions & 8 deletions drivers/net/sfc/sfc_ethdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -46,14 +46,6 @@ sfc_fw_version_get(struct rte_eth_dev *dev, char *fw_version, size_t fw_size)
int ret;
int rc;

/*
* Return value of the callback is likely supposed to be
* equal to or greater than 0, nevertheless, if an error
* occurs, it will be desirable to pass it to the caller
*/
if ((fw_version == NULL) || (fw_size == 0))
return -EINVAL;

rc = efx_nic_get_fw_version(sa->nic, &enfi);
if (rc != 0)
return -rc;
Expand Down
4 changes: 3 additions & 1 deletion drivers/net/txgbe/txgbe_ethdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -2313,9 +2313,11 @@ txgbe_fw_version_get(struct rte_eth_dev *dev, char *fw_version, size_t fw_size)

etrack_id = (eeprom_verh << 16) | eeprom_verl;
ret = snprintf(fw_version, fw_size, "0x%08x", etrack_id);
if (ret < 0)
return -EINVAL;

ret += 1; /* add the size of '\0' */
if (fw_size < (u32)ret)
if (fw_size < (size_t)ret)
return ret;
else
return 0;
Expand Down

0 comments on commit 3ab9cfb

Please sign in to comment.