From 293430677e9cd91638db9fd4ad1472b40383074c Mon Sep 17 00:00:00 2001 From: Hyong Youb Kim Date: Mon, 10 Dec 2018 10:28:54 -0800 Subject: [PATCH] net/enic: add handler to return firmware version Cisco VIC adapters run firmware. Add the fw_version_get handler to help diagnostics. Signed-off-by: Hyong Youb Kim Reviewed-by: John Daley --- doc/guides/nics/features/enic.ini | 1 + doc/guides/rel_notes/release_19_02.rst | 1 + drivers/net/enic/base/vnic_dev.c | 26 ++++++++++++++++++++++++++ drivers/net/enic/enic_ethdev.c | 21 +++++++++++++++++++++ 4 files changed, 49 insertions(+) diff --git a/doc/guides/nics/features/enic.ini b/doc/guides/nics/features/enic.ini index 8a4bad29fa..020b75cf0e 100644 --- a/doc/guides/nics/features/enic.ini +++ b/doc/guides/nics/features/enic.ini @@ -31,6 +31,7 @@ Inner L3 checksum = Y Inner L4 checksum = Y Packet type parsing = Y Basic stats = Y +FW version = Y Multiprocess aware = Y BSD nic_uio = Y Linux UIO = Y diff --git a/doc/guides/rel_notes/release_19_02.rst b/doc/guides/rel_notes/release_19_02.rst index 6012b52f46..a0be086215 100644 --- a/doc/guides/rel_notes/release_19_02.rst +++ b/doc/guides/rel_notes/release_19_02.rst @@ -57,6 +57,7 @@ New Features * **Updated the enic driver.** * Added support for ``RTE_ETH_DEV_CLOSE_REMOVE`` flag. + * Added the handler to get firmware version string. Removed Items diff --git a/drivers/net/enic/base/vnic_dev.c b/drivers/net/enic/base/vnic_dev.c index fd303fece7..1e5b12a80c 100644 --- a/drivers/net/enic/base/vnic_dev.c +++ b/drivers/net/enic/base/vnic_dev.c @@ -458,6 +458,32 @@ int vnic_dev_cmd_args(struct vnic_dev *vdev, enum vnic_devcmd_cmd cmd, } } +int vnic_dev_fw_info(struct vnic_dev *vdev, + struct vnic_devcmd_fw_info **fw_info) +{ + char name[NAME_MAX]; + u64 a0, a1 = 0; + int wait = 1000; + int err = 0; + static u32 instance; + + if (!vdev->fw_info) { + snprintf((char *)name, sizeof(name), "vnic_fw_info-%u", + instance++); + vdev->fw_info = vdev->alloc_consistent(vdev->priv, + sizeof(struct vnic_devcmd_fw_info), + &vdev->fw_info_pa, (u8 *)name); + if (!vdev->fw_info) + return -ENOMEM; + a0 = vdev->fw_info_pa; + a1 = sizeof(struct vnic_devcmd_fw_info); + err = vnic_dev_cmd(vdev, CMD_MCPU_FW_INFO, + &a0, &a1, wait); + } + *fw_info = vdev->fw_info; + return err; +} + static int vnic_dev_advanced_filters_cap(struct vnic_dev *vdev, u64 *args, int nargs) { diff --git a/drivers/net/enic/enic_ethdev.c b/drivers/net/enic/enic_ethdev.c index ed8dda5686..9b206e8f08 100644 --- a/drivers/net/enic/enic_ethdev.c +++ b/drivers/net/enic/enic_ethdev.c @@ -887,6 +887,26 @@ static int enicpmd_dev_udp_tunnel_port_del(struct rte_eth_dev *eth_dev, return update_vxlan_port(enic, ENIC_DEFAULT_VXLAN_PORT); } +static int enicpmd_dev_fw_version_get(struct rte_eth_dev *eth_dev, + char *fw_version, size_t fw_size) +{ + struct vnic_devcmd_fw_info *info; + struct enic *enic; + 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", + info->fw_version, info->fw_build); + fw_version[fw_size - 1] = '\0'; + return 0; +} + static const struct eth_dev_ops enicpmd_eth_dev_ops = { .dev_configure = enicpmd_dev_configure, .dev_start = enicpmd_dev_start, @@ -938,6 +958,7 @@ static const struct eth_dev_ops enicpmd_eth_dev_ops = { .rss_hash_update = enicpmd_dev_rss_hash_update, .udp_tunnel_port_add = enicpmd_dev_udp_tunnel_port_add, .udp_tunnel_port_del = enicpmd_dev_udp_tunnel_port_del, + .fw_version_get = enicpmd_dev_fw_version_get, }; static int enic_parse_zero_one(const char *key, -- 2.20.1