From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 78014A2EDB for ; Mon, 30 Sep 2019 15:50:04 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id BD9021BEB0; Mon, 30 Sep 2019 15:49:31 +0200 (CEST) Received: from huawei.com (szxga05-in.huawei.com [45.249.212.191]) by dpdk.org (Postfix) with ESMTP id 3D6FC1BEAE for ; Mon, 30 Sep 2019 15:49:30 +0200 (CEST) Received: from DGGEMS413-HUB.china.huawei.com (unknown [172.30.72.59]) by Forcepoint Email with ESMTP id CBDDB8C87AC06EEA30D7 for ; Mon, 30 Sep 2019 21:49:28 +0800 (CST) Received: from tester.localdomain (10.175.119.39) by DGGEMS413-HUB.china.huawei.com (10.3.19.213) with Microsoft SMTP Server id 14.3.439.0; Mon, 30 Sep 2019 21:49:18 +0800 From: Xiaoyun wang To: CC: , , , , , , , Xiaoyun wang Date: Mon, 30 Sep 2019 22:00:51 +0800 Message-ID: <78e7874ff668111d2230aa696e141baf0b1865f6.1569850827.git.cloud.wangxiaoyun@huawei.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: References: MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.175.119.39] X-CFilter-Loop: Reflected Subject: [dpdk-dev] [PATCH v3 13/19] net/hinic: get firmware version X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" This patch adds support for getting firmware version. Signed-off-by: Xiaoyun wang --- doc/guides/nics/features/hinic.ini | 1 + doc/guides/nics/hinic.rst | 1 + drivers/net/hinic/base/hinic_pmd_cmd.h | 2 ++ drivers/net/hinic/base/hinic_pmd_niccfg.c | 40 +++++++++++++++++++++++++++++++ drivers/net/hinic/base/hinic_pmd_niccfg.h | 13 ++++++++++ drivers/net/hinic/hinic_pmd_ethdev.c | 23 ++++++++++++++++++ 6 files changed, 80 insertions(+) diff --git a/doc/guides/nics/features/hinic.ini b/doc/guides/nics/features/hinic.ini index a7cb33e..2c9d845 100644 --- a/doc/guides/nics/features/hinic.ini +++ b/doc/guides/nics/features/hinic.ini @@ -33,6 +33,7 @@ Basic stats = Y Extended stats = Y Stats per queue = Y Flow director = Y +FW version = Y Linux UIO = Y Linux VFIO = Y BSD nic_uio = N diff --git a/doc/guides/nics/hinic.rst b/doc/guides/nics/hinic.rst index 9a9fcbe..ed607eb 100644 --- a/doc/guides/nics/hinic.rst +++ b/doc/guides/nics/hinic.rst @@ -32,6 +32,7 @@ Features - Multicast MAC filter - Flow director - Set Link down or up +- FW version Prerequisites ------------- diff --git a/drivers/net/hinic/base/hinic_pmd_cmd.h b/drivers/net/hinic/base/hinic_pmd_cmd.h index 55d4292..e0633bd 100644 --- a/drivers/net/hinic/base/hinic_pmd_cmd.h +++ b/drivers/net/hinic/base/hinic_pmd_cmd.h @@ -85,6 +85,8 @@ enum hinic_port_cmd { HINIC_PORT_CMD_GET_JUMBO_FRAME_SIZE = 0x4a, HINIC_PORT_CMD_SET_JUMBO_FRAME_SIZE, + HINIC_PORT_CMD_GET_MGMT_VERSION = 0x58, + HINIC_PORT_CMD_GET_PORT_TYPE = 0x5b, HINIC_PORT_CMD_GET_VPORT_ENABLE = 0x5c, diff --git a/drivers/net/hinic/base/hinic_pmd_niccfg.c b/drivers/net/hinic/base/hinic_pmd_niccfg.c index 9f23fdd..2dc431e 100644 --- a/drivers/net/hinic/base/hinic_pmd_niccfg.c +++ b/drivers/net/hinic/base/hinic_pmd_niccfg.c @@ -1293,6 +1293,46 @@ int hinic_set_rx_mode(void *hwdev, u32 enable) return 0; } +/** + * hinic_get_mgmt_version - Get mgmt module version from chip. + * + * @param hwdev + * The hardware interface of a nic device. + * @param fw + * Firmware version. + * + * @return + * 0 on success. + * negative error value otherwise. + */ +int hinic_get_mgmt_version(void *hwdev, char *fw) +{ + struct hinic_version_info fw_ver; + u16 out_size = sizeof(fw_ver); + int err; + + if (!hwdev || !fw) { + PMD_DRV_LOG(ERR, "Hwdev or fw is NULL"); + return -EINVAL; + } + + memset(&fw_ver, 0, sizeof(fw_ver)); + fw_ver.mgmt_msg_head.resp_aeq_num = HINIC_AEQ1; + + err = l2nic_msg_to_mgmt_sync(hwdev, HINIC_PORT_CMD_GET_MGMT_VERSION, + &fw_ver, sizeof(fw_ver), &fw_ver, + &out_size); + if (err || !out_size || fw_ver.mgmt_msg_head.status) { + PMD_DRV_LOG(ERR, "Failed to get mgmt version, err: %d, status: 0x%x, out size: 0x%x\n", + err, fw_ver.mgmt_msg_head.status, out_size); + return -EINVAL; + } + + snprintf(fw, HINIC_MGMT_VERSION_MAX_LEN, "%s", fw_ver.ver); + + return 0; +} + int hinic_set_rx_csum_offload(void *hwdev, u32 en) { struct hinic_checksum_offload rx_csum_cfg; diff --git a/drivers/net/hinic/base/hinic_pmd_niccfg.h b/drivers/net/hinic/base/hinic_pmd_niccfg.h index beab630..b9e037e 100644 --- a/drivers/net/hinic/base/hinic_pmd_niccfg.h +++ b/drivers/net/hinic/base/hinic_pmd_niccfg.h @@ -471,6 +471,17 @@ struct hinic_rx_mode_config { u32 rx_mode; }; +#define HINIC_MGMT_VERSION_MAX_LEN 32 +#define HINIC_COMPILE_TIME_LEN 20 +#define HINIC_FW_VERSION_NAME 16 + +struct hinic_version_info { + struct hinic_mgmt_msg_head mgmt_msg_head; + + u8 ver[HINIC_FW_VERSION_NAME]; + u8 time[HINIC_COMPILE_TIME_LEN]; +}; + /* rss */ struct nic_rss_indirect_tbl { u32 group_index; @@ -807,6 +818,8 @@ int hinic_get_rss_type(void *hwdev, u32 tmpl_idx, int hinic_set_rx_mode(void *hwdev, u32 enable); +int hinic_get_mgmt_version(void *hwdev, char *fw); + int hinic_set_rx_csum_offload(void *hwdev, u32 en); int hinic_set_link_status_follow(void *hwdev, diff --git a/drivers/net/hinic/hinic_pmd_ethdev.c b/drivers/net/hinic/hinic_pmd_ethdev.c index ea39ff0..48ec467 100644 --- a/drivers/net/hinic/hinic_pmd_ethdev.c +++ b/drivers/net/hinic/hinic_pmd_ethdev.c @@ -752,6 +752,27 @@ static void hinic_get_speed_capa(struct rte_eth_dev *dev, uint32_t *speed_capa) return 0; } +static int hinic_fw_version_get(struct rte_eth_dev *dev, char *fw_version, + size_t fw_size) +{ + struct hinic_nic_dev *nic_dev = HINIC_ETH_DEV_TO_PRIVATE_NIC_DEV(dev); + char fw_ver[HINIC_MGMT_VERSION_MAX_LEN] = {0}; + int err; + + err = hinic_get_mgmt_version(nic_dev->hwdev, fw_ver); + if (err) { + PMD_DRV_LOG(ERR, "Failed to get fw version\n"); + return -EINVAL; + } + + if (fw_size < strlen(fw_ver) + 1) + return (strlen(fw_ver) + 1); + + snprintf(fw_version, fw_size, "%s", fw_ver); + + return 0; +} + static int hinic_config_rx_mode(struct hinic_nic_dev *nic_dev, u32 rx_mode_ctrl) { int err; @@ -2813,6 +2834,7 @@ static void hinic_dev_close(struct rte_eth_dev *dev) static const struct eth_dev_ops hinic_pmd_ops = { .dev_configure = hinic_dev_configure, .dev_infos_get = hinic_dev_infos_get, + .fw_version_get = hinic_fw_version_get, .rx_queue_setup = hinic_rx_queue_setup, .tx_queue_setup = hinic_tx_queue_setup, .dev_start = hinic_dev_start, @@ -2849,6 +2871,7 @@ static void hinic_dev_close(struct rte_eth_dev *dev) static const struct eth_dev_ops hinic_pmd_vf_ops = { .dev_configure = hinic_dev_configure, .dev_infos_get = hinic_dev_infos_get, + .fw_version_get = hinic_fw_version_get, .rx_queue_setup = hinic_rx_queue_setup, .tx_queue_setup = hinic_tx_queue_setup, .dev_start = hinic_dev_start, -- 1.8.3.1