Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

bnxt_en: Provide stored devlink "fw" version on older firmware

On older firmware that doesn't support the HWRM_NVM_GET_DEV_INFO
command that returns detailed stored firmware versions, fallback
to use the same firmware package version that is reported to ethtool.
Refactor bnxt_get_pkgver() in bnxt_ethtool.c so that devlink can call
and get the package version.

Signed-off-by: Vikas Gupta <vikas.gupta@broadcom.com>
Reviewed-by: Edwin Peer <edwin.peer@broadcom.com>
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Vikas Gupta and committed by
David S. Miller
63185eb3 3c415339

+37 -14
+6 -1
drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c
··· 915 915 916 916 rc = bnxt_hwrm_nvm_get_dev_info(bp, &nvm_dev_info); 917 917 if (rc || 918 - !(nvm_dev_info.flags & NVM_GET_DEV_INFO_RESP_FLAGS_FW_VER_VALID)) 918 + !(nvm_dev_info.flags & NVM_GET_DEV_INFO_RESP_FLAGS_FW_VER_VALID)) { 919 + if (!bnxt_get_pkginfo(bp->dev, buf, sizeof(buf))) 920 + return bnxt_dl_info_put(bp, req, BNXT_VERSION_STORED, 921 + DEVLINK_INFO_VERSION_GENERIC_FW, 922 + buf); 919 923 return 0; 924 + } 920 925 921 926 buf[0] = 0; 922 927 strncat(buf, nvm_dev_info.pkg_name, HWRM_FW_VER_STR_LEN);
+30 -13
drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
··· 2832 2832 return retval; 2833 2833 } 2834 2834 2835 - static void bnxt_get_pkgver(struct net_device *dev) 2835 + int bnxt_get_pkginfo(struct net_device *dev, char *ver, int size) 2836 2836 { 2837 2837 struct bnxt *bp = netdev_priv(dev); 2838 2838 u16 index = 0; 2839 2839 char *pkgver; 2840 2840 u32 pkglen; 2841 2841 u8 *pkgbuf; 2842 - int len; 2842 + int rc; 2843 2843 2844 - if (bnxt_find_nvram_item(dev, BNX_DIR_TYPE_PKG_LOG, 2845 - BNX_DIR_ORDINAL_FIRST, BNX_DIR_EXT_NONE, 2846 - &index, NULL, &pkglen) != 0) 2847 - return; 2844 + rc = bnxt_find_nvram_item(dev, BNX_DIR_TYPE_PKG_LOG, 2845 + BNX_DIR_ORDINAL_FIRST, BNX_DIR_EXT_NONE, 2846 + &index, NULL, &pkglen); 2847 + if (rc) 2848 + return rc; 2848 2849 2849 2850 pkgbuf = kzalloc(pkglen, GFP_KERNEL); 2850 2851 if (!pkgbuf) { 2851 2852 dev_err(&bp->pdev->dev, "Unable to allocate memory for pkg version, length = %u\n", 2852 2853 pkglen); 2853 - return; 2854 + return -ENOMEM; 2854 2855 } 2855 2856 2856 - if (bnxt_get_nvram_item(dev, index, 0, pkglen, pkgbuf)) 2857 + rc = bnxt_get_nvram_item(dev, index, 0, pkglen, pkgbuf); 2858 + if (rc) 2857 2859 goto err; 2858 2860 2859 2861 pkgver = bnxt_parse_pkglog(BNX_PKG_LOG_FIELD_IDX_PKG_VERSION, pkgbuf, 2860 2862 pkglen); 2861 - if (pkgver && *pkgver != 0 && isdigit(*pkgver)) { 2862 - len = strlen(bp->fw_ver_str); 2863 - snprintf(bp->fw_ver_str + len, FW_VER_STR_LEN - len - 1, 2864 - "/pkg %s", pkgver); 2865 - } 2863 + if (pkgver && *pkgver != 0 && isdigit(*pkgver)) 2864 + strscpy(ver, pkgver, size); 2865 + else 2866 + rc = -ENOENT; 2867 + 2866 2868 err: 2867 2869 kfree(pkgbuf); 2870 + 2871 + return rc; 2872 + } 2873 + 2874 + static void bnxt_get_pkgver(struct net_device *dev) 2875 + { 2876 + struct bnxt *bp = netdev_priv(dev); 2877 + char buf[FW_VER_STR_LEN]; 2878 + int len; 2879 + 2880 + if (!bnxt_get_pkginfo(dev, buf, sizeof(buf))) { 2881 + len = strlen(bp->fw_ver_str); 2882 + snprintf(bp->fw_ver_str + len, FW_VER_STR_LEN - len - 1, 2883 + "/pkg %s", buf); 2884 + } 2868 2885 } 2869 2886 2870 2887 static int bnxt_get_eeprom(struct net_device *dev,
+1
drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.h
··· 55 55 u8 self_reset, u8 flags); 56 56 int bnxt_flash_package_from_fw_obj(struct net_device *dev, const struct firmware *fw, 57 57 u32 install_type); 58 + int bnxt_get_pkginfo(struct net_device *dev, char *ver, int size); 58 59 void bnxt_ethtool_init(struct bnxt *bp); 59 60 void bnxt_ethtool_free(struct bnxt *bp); 60 61