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 AB780A0613 for ; Wed, 25 Sep 2019 16:17:44 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 4DA501BEF1; Wed, 25 Sep 2019 16:17:00 +0200 (CEST) Received: from huawei.com (szxga06-in.huawei.com [45.249.212.32]) by dpdk.org (Postfix) with ESMTP id 36D1D1BEE4 for ; Wed, 25 Sep 2019 16:16:58 +0200 (CEST) Received: from DGGEMS402-HUB.china.huawei.com (unknown [172.30.72.59]) by Forcepoint Email with ESMTP id 26061515FE58A68B18A4 for ; Wed, 25 Sep 2019 22:16:57 +0800 (CST) Received: from tester.localdomain (10.175.119.39) by DGGEMS402-HUB.china.huawei.com (10.3.19.202) with Microsoft SMTP Server id 14.3.439.0; Wed, 25 Sep 2019 22:16:48 +0800 From: Xiaoyun wang To: CC: , , , , , , , Xiaoyun wang Date: Wed, 25 Sep 2019 22:30:40 +0800 Message-ID: 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 v2 12/17] net/hinic: set link down and up 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 supports setting link down and up, Also adds support for geting firmware version. Signed-off-by: Xiaoyun wang --- drivers/net/hinic/base/hinic_pmd_cmd.h | 4 ++ drivers/net/hinic/base/hinic_pmd_niccfg.c | 78 ++++++++++++++++++++++++++++ drivers/net/hinic/base/hinic_pmd_niccfg.h | 22 ++++++++ drivers/net/hinic/hinic_pmd_ethdev.c | 85 +++++++++++++++++++++++++++++++ 4 files changed, 189 insertions(+) diff --git a/drivers/net/hinic/base/hinic_pmd_cmd.h b/drivers/net/hinic/base/hinic_pmd_cmd.h index 6b3dcf3..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, @@ -119,6 +121,8 @@ enum hinic_port_cmd { HINIC_PORT_CMD_SET_IPSU_MAC = 0xcb, HINIC_PORT_CMD_GET_IPSU_MAC = 0xcc, + HINIC_PORT_CMD_SET_XSFP_STATUS = 0xD4, + HINIC_PORT_CMD_GET_LINK_MODE = 0xD9, HINIC_PORT_CMD_SET_SPEED = 0xDA, HINIC_PORT_CMD_SET_AUTONEG = 0xDB, diff --git a/drivers/net/hinic/base/hinic_pmd_niccfg.c b/drivers/net/hinic/base/hinic_pmd_niccfg.c index 53d981b..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; @@ -1613,6 +1653,44 @@ int hinic_get_link_mode(void *hwdev, u32 *supported, u32 *advertised) } /** + * hinic_set_xsfp_tx_status - Enable or disable the fiber in + * tx direction when set link up or down. + * + * @param hwdev + * The hardware interface of a nic device. + * @param enable + * Enable or Disable. + * + * @return + * 0 on success. + * negative error value otherwise. + */ +int hinic_set_xsfp_tx_status(void *hwdev, bool enable) +{ + struct hinic_set_xsfp_status xsfp_status; + u16 out_size = sizeof(struct hinic_set_xsfp_status); + int err; + + memset(&xsfp_status, 0, sizeof(xsfp_status)); + xsfp_status.mgmt_msg_head.resp_aeq_num = HINIC_AEQ1; + xsfp_status.port_id = hinic_global_func_id(hwdev); + xsfp_status.xsfp_tx_dis = ((enable == 0) ? 1 : 0); + + err = l2nic_msg_to_mgmt_sync(hwdev, HINIC_PORT_CMD_SET_XSFP_STATUS, + &xsfp_status, sizeof(struct hinic_set_xsfp_status), + &xsfp_status, &out_size); + if (err || !out_size || xsfp_status.mgmt_msg_head.status) { + PMD_DRV_LOG(ERR, + "Failed to %s port xsfp status, err: %d, status: 0x%x, out size: 0x%x\n", + enable ? "Disable" : "Enable", err, + xsfp_status.mgmt_msg_head.status, out_size); + return -EFAULT; + } + + return 0; +} + +/** * hinic_flush_qp_res - Flush tx && rx chip resources in case of set vport * fake failed when device start. * diff --git a/drivers/net/hinic/base/hinic_pmd_niccfg.h b/drivers/net/hinic/base/hinic_pmd_niccfg.h index e8ce332..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; @@ -578,6 +589,13 @@ struct hinic_link_mode_cmd { u16 advertised; }; +struct hinic_set_xsfp_status { + struct hinic_mgmt_msg_head mgmt_msg_head; + + u32 port_id; + u32 xsfp_tx_dis; /* 0: tx enable; 1: tx disable */ +}; + struct hinic_clear_qp_resource { struct hinic_mgmt_msg_head mgmt_msg_head; @@ -800,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, @@ -807,6 +827,8 @@ int hinic_set_link_status_follow(void *hwdev, int hinic_get_link_mode(void *hwdev, u32 *supported, u32 *advertised); +int hinic_set_xsfp_tx_status(void *hwdev, bool enable); + int hinic_flush_qp_res(void *hwdev); int hinic_init_function_table(void *hwdev, u16 rx_buf_sz); diff --git a/drivers/net/hinic/hinic_pmd_ethdev.c b/drivers/net/hinic/hinic_pmd_ethdev.c index 2c329d1..8ea5998 100644 --- a/drivers/net/hinic/hinic_pmd_ethdev.c +++ b/drivers/net/hinic/hinic_pmd_ethdev.c @@ -750,6 +750,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; @@ -881,6 +902,66 @@ static int hinic_link_update(struct rte_eth_dev *dev, int wait_to_complete) } /** + * DPDK callback to bring the link UP. + * + * @param dev + * Pointer to Ethernet device structure. + * + * @return + * 0 on success, negative errno value on failure. + */ +static int hinic_dev_set_link_up(struct rte_eth_dev *dev) +{ + struct hinic_nic_dev *nic_dev = HINIC_ETH_DEV_TO_PRIVATE_NIC_DEV(dev); + int ret; + + ret = hinic_set_xsfp_tx_status(nic_dev->hwdev, true); + if (ret) { + PMD_DRV_LOG(ERR, "Enable port tx xsfp failed, dev_name: %s, port_id: %d", + nic_dev->proc_dev_name, dev->data->port_id); + return ret; + } + + /* link status follow phy port status, up will open pma */ + ret = hinic_set_port_enable(nic_dev->hwdev, true); + if (ret) + PMD_DRV_LOG(ERR, "Set mac link up failed, dev_name: %s, port_id: %d", + nic_dev->proc_dev_name, dev->data->port_id); + + return ret; +} + +/** + * DPDK callback to bring the link DOWN. + * + * @param dev + * Pointer to Ethernet device structure. + * + * @return + * 0 on success, negative errno value on failure. + */ +static int hinic_dev_set_link_down(struct rte_eth_dev *dev) +{ + struct hinic_nic_dev *nic_dev = HINIC_ETH_DEV_TO_PRIVATE_NIC_DEV(dev); + int ret; + + ret = hinic_set_xsfp_tx_status(nic_dev->hwdev, false); + if (ret) { + PMD_DRV_LOG(ERR, "Disable port tx xsfp failed, dev_name: %s, port_id: %d", + nic_dev->proc_dev_name, dev->data->port_id); + return ret; + } + + /* link status follow phy port status, up will close pma */ + ret = hinic_set_port_enable(nic_dev->hwdev, false); + if (ret) + PMD_DRV_LOG(ERR, "Set mac link down failed, dev_name: %s, port_id: %d", + nic_dev->proc_dev_name, dev->data->port_id); + + return ret; +} + +/** * DPDK callback to start the device. * * @param dev @@ -2751,9 +2832,12 @@ 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, + .dev_set_link_up = hinic_dev_set_link_up, + .dev_set_link_down = hinic_dev_set_link_down, .link_update = hinic_link_update, .rx_queue_release = hinic_rx_queue_release, .tx_queue_release = hinic_tx_queue_release, @@ -2785,6 +2869,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