]> git.droids-corp.org - dpdk.git/commitdiff
drivers/net: fix FW version query
authorFerruh Yigit <ferruh.yigit@intel.com>
Wed, 21 Apr 2021 16:20:57 +0000 (17:20 +0100)
committerFerruh Yigit <ferruh.yigit@intel.com>
Mon, 26 Apr 2021 11:50:42 +0000 (13:50 +0200)
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: bb42aa9ffe4e ("net/atlantic: configure device start/stop")
Fixes: ff70acdf4299 ("net/axgbe: support reading FW version")
Fixes: e2652b0a20a0 ("net/bnxt: support get FW version")
Fixes: cf0fab1d2ca5 ("net/dpaa: support firmware version get API")
Fixes: 748eccb97cdc ("net/dpaa2: add support for firmware version get")
Fixes: b883c0644a24 ("net/e1000: add firmware version get")
Fixes: 293430677e9c ("net/enic: add handler to return firmware version")
Fixes: 1f5ca0b460cd ("net/hns3: support some device operations")
Fixes: bd5b86732bc7 ("net/hns3: modify format for firmware version")
Fixes: ed0dfdd0e976 ("net/i40e: add firmware version get")
Fixes: e31cb9a36298 ("net/ice: support FW version getting")
Fixes: 4f09bc55ac3d ("net/igc: implement device base operations")
Fixes: eec10fb0ce6b ("net/ionic: support FW version")
Fixes: 8b0b56574269 ("net/ixgbe: add firmware version get")
Fixes: 4d9f5b8adc02 ("net/octeontx2: add FW version get operation")
Fixes: f97b56f9f12e ("net/qede: support FW version query")
Fixes: 83fef46a22b2 ("net/sfc: add callback to retrieve FW version")
Fixes: bc84ac0fadef ("net/txgbe: support getting FW version")
Fixes: 21913471202f ("ethdev: add firmware version get")
Cc: stable@dpdk.org
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>
18 files changed:
drivers/net/atlantic/atl_ethdev.c
drivers/net/axgbe/axgbe_rxtx.c
drivers/net/bnxt/bnxt_ethdev.c
drivers/net/dpaa/dpaa_ethdev.c
drivers/net/dpaa2/dpaa2_ethdev.c
drivers/net/e1000/igb_ethdev.c
drivers/net/enic/enic_ethdev.c
drivers/net/hns3/hns3_ethdev.c
drivers/net/hns3/hns3_ethdev_vf.c
drivers/net/i40e/i40e_ethdev.c
drivers/net/ice/ice_ethdev.c
drivers/net/igc/igc_ethdev.c
drivers/net/ionic/ionic_ethdev.c
drivers/net/ixgbe/ixgbe_ethdev.c
drivers/net/octeontx2/otx2_ethdev_ops.c
drivers/net/qede/qede_ethdev.c
drivers/net/sfc/sfc_ethdev.c
drivers/net/txgbe/txgbe_ethdev.c

index 473f6209f6aa4d20f177e586da63c534356becbd..ce7f814f255d9978e274fa63ccca289ba4c5bafd 100644 (file)
@@ -1073,7 +1073,7 @@ 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)
@@ -1081,10 +1081,11 @@ atl_fw_version_get(struct rte_eth_dev *dev, char *fw_version, size_t fw_size)
 
        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;
index e34bb6d448fc6b50d85f103cbb915abd7f03bd3d..33f709a6bb02df456f7670ef171e407e1ad0f787 100644 (file)
@@ -623,9 +623,6 @@ int axgbe_dev_fw_version_get(struct rte_eth_dev *eth_dev,
        pdata = (struct axgbe_port *)eth_dev->data->dev_private;
        hw_feat = &pdata->hw_feat;
 
-       if (fw_version == NULL)
-               return -EINVAL;
-
        ret = snprintf(fw_version, fw_size, "%d.%d.%d",
                        AXGMAC_GET_BITS(hw_feat->version, MAC_VR, USERVER),
                        AXGMAC_GET_BITS(hw_feat->version, MAC_VR, DEVID),
@@ -634,7 +631,6 @@ int axgbe_dev_fw_version_get(struct rte_eth_dev *eth_dev,
                return -EINVAL;
 
        ret += 1; /* add the size of '\0' */
-
        if (fw_size < (size_t)ret)
                return ret;
        else
index f5d2dc85907d565a41f65adc609b3e067d49bf21..dba5b9f94df44c270dab769b95e08926832bcefc 100644 (file)
@@ -2794,9 +2794,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;
index 176943a8eae629c1021ac2fd5c688dc5c1e8a89f..57ee660c5e5756a298d578049aacbe88a9916c0b 100644 (file)
@@ -532,9 +532,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;
index 9011dcfc124232d46a0ced3a6c3100034522ace3..95e8d9abe869524b6339c44b161f785f9519bca0 100644 (file)
@@ -226,9 +226,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;
index 3fdffe3294836b10d4e41a66e339bd122bf64f6c..10ee0f33415af1f2a0d387b161c952afc60d0aef 100644 (file)
@@ -2159,9 +2159,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;
index d91c2cdc8c54332a8f260bda60e01a54fa6e1c2c..e1a393b8476284ed717a62a8a9894537f1cff3c9 100644 (file)
@@ -1050,16 +1050,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 = {
index 60267e1ec115bbbc290ac112e4dba3f716e96973..bd0699af58449b409c23502633f80a7b1e65ee61 100644 (file)
@@ -2828,8 +2828,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;
index 7a7a6bfa7cc01e577ef3665f2f9fe83fd9aa0178..06a26fb9be926e390c0f2ceea0e463f76180693c 100644 (file)
@@ -2181,8 +2181,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;
index e6206a7e5100e32b589e7543cc2c977f4dc050e1..66d23d698ea0b5b6ee9a26ae81de3d6a73e4f503 100644 (file)
@@ -3687,9 +3687,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;
index da9e85bd7c9e3db66255842bfd4e7788bf436810..c37a2e09ceb0fc256541bb7884f7ab6f23670e21 100644 (file)
@@ -4646,10 +4646,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;
index 31c99dca099f343abf441928b75b6815a2531385..b1c58fb3deb9c330b37e93dabf65e79b74735d19 100644 (file)
@@ -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;
index cffe899c078c870ab76128a122890f6149843f7e..5ec474dbf5390267e00f7a0ce554f191a2abe3d7 100644 (file)
@@ -215,15 +215,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;
 }
 
 /*
index ff65145f5526fdc38837e1887ea246bb490f5078..a5c191fe1b171faa972b7025a4c4f056f8398069 100644 (file)
@@ -3814,9 +3814,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;
index 6f0cdc585422a4761726d94336313ed0c31a56ad..5a4501208e9e33feb79c681246a30c63ea344c24 100644 (file)
@@ -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;
index 057a7b00e2dc4182514e4d31bd5f9e1fae0e8260..c2c8de867501b00febe067a73d93533ba328ef0e 100644 (file)
@@ -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);
index 52ba7b67b052762becffc82ad5c77aa55b621b7e..c50ecea0b993a88165c0cb345865d133654bbac6 100644 (file)
@@ -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;
index 97796f040b43587d1859d59fbdf5b825ef726298..8dbe3da5c2c99ba780a364830bf2f8a99ed60b38 100644 (file)
@@ -2582,9 +2582,11 @@ txgbe_fw_version_get(struct rte_eth_dev *dev, char *fw_version, size_t fw_size)
        hw->phy.get_fw_version(hw, &etrack_id);
 
        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;