From patchwork Thu Sep 24 13:05:42 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "humin (Q)" X-Patchwork-Id: 78748 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 792C1A04B1; Thu, 24 Sep 2020 15:08:44 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id AECFA1DEE8; Thu, 24 Sep 2020 15:08:28 +0200 (CEST) Received: from huawei.com (szxga06-in.huawei.com [45.249.212.32]) by dpdk.org (Postfix) with ESMTP id 0CC3E1DDED for ; Thu, 24 Sep 2020 15:08:25 +0200 (CEST) Received: from DGGEMS404-HUB.china.huawei.com (unknown [172.30.72.60]) by Forcepoint Email with ESMTP id E1C13BAF110A4AD072DB; Thu, 24 Sep 2020 21:08:22 +0800 (CST) Received: from localhost.localdomain (10.69.192.56) by DGGEMS404-HUB.china.huawei.com (10.3.19.204) with Microsoft SMTP Server id 14.3.487.0; Thu, 24 Sep 2020 21:08:14 +0800 From: "Min Hu (Connor)" To: CC: , , , , Date: Thu, 24 Sep 2020 21:05:42 +0800 Message-ID: <1600952745-55993-2-git-send-email-humin29@huawei.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1600952745-55993-1-git-send-email-humin29@huawei.com> References: <1599534347-20430-1-git-send-email-humin29@huawei.com> <1600952745-55993-1-git-send-email-humin29@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.69.192.56] X-CFilter-Loop: Reflected Subject: [dpdk-dev] [PATCH V12 1/4] ethdev: introduce FEC API 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 Forward error correction(FEC) support for ethdev. Introduce APIs which support query and config FEC information in hardware. Signed-off-by: Min Hu (Connor) Reviewed-by: Wei Hu (Xavier) Reviewed-by: Chengwen Feng Reviewed-by: Chengchang Tang Reviewed-by: Ajit Khaparde Acked-by: Konstantin Ananyev --- v10->v11: allow to report capabilities per link speed. specify what should be reported if link is down when get FEC. change mode to capa bitmask. --- v9->v10: add macro RTE_ETH_FEC_MODE_CAPA_MASK(x) to indicate different FEC mode capa. --- v8->v9: added reviewed-by and acked-by. --- v7->v8: put AUTO just after NOFEC in rte_fec_mode definition. --- v6->v7: deleted RTE_ETH_FEC_NUM to prevent ABI breakage. add new macro to indicate translation from fec mode to capa. --- v5->v6: modified release notes. deleted check duplicated for FEC API fixed code styles according to DPDK coding style. added _eth prefix. --- v4->v5: Modifies FEC capa definitions using macros. Add RTE_ prefix for public FEC mode enum. add release notes about FEC for dpdk20_11. --- v2->v3: add function return value "-ENOTSUP" for API. --- lib/librte_ethdev/rte_ethdev.c | 37 +++++++++++++ lib/librte_ethdev/rte_ethdev.h | 91 ++++++++++++++++++++++++++++++++ lib/librte_ethdev/rte_ethdev_driver.h | 82 ++++++++++++++++++++++++++++ lib/librte_ethdev/rte_ethdev_version.map | 3 ++ 4 files changed, 213 insertions(+) diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c index dfe5c1b..b614bfc 100644 --- a/lib/librte_ethdev/rte_ethdev.c +++ b/lib/librte_ethdev/rte_ethdev.c @@ -3679,6 +3679,43 @@ rte_eth_led_off(uint16_t port_id) return eth_err(port_id, (*dev->dev_ops->dev_led_off)(dev)); } +int +rte_eth_fec_get_capability(uint16_t port_id, uint32_t *num, + struct rte_eth_fec_capa *speed_fec_capa) +{ + struct rte_eth_dev *dev; + + if (num == NULL || speed_fec_capa == NULL) + return -EINVAL; + + RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV); + dev = &rte_eth_devices[port_id]; + RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->fec_get_capability, -ENOTSUP); + return eth_err(port_id, (*dev->dev_ops->fec_get_capability)(dev, num, + speed_fec_capa)); +} + +int +rte_eth_fec_get(uint16_t port_id, uint32_t *mode) +{ + struct rte_eth_dev *dev; + + RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV); + dev = &rte_eth_devices[port_id]; + RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->fec_get, -ENOTSUP); + return eth_err(port_id, (*dev->dev_ops->fec_get)(dev, mode)); +} + +int +rte_eth_fec_set(uint16_t port_id, uint32_t mode) +{ + struct rte_eth_dev *dev; + + dev = &rte_eth_devices[port_id]; + RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->fec_set, -ENOTSUP); + return eth_err(port_id, (*dev->dev_ops->fec_set)(dev, mode)); +} + /* * Returns index into MAC address array of addr. Use 00:00:00:00:00:00 to find * an empty spot. diff --git a/lib/librte_ethdev/rte_ethdev.h b/lib/librte_ethdev/rte_ethdev.h index 645a186..104181d 100644 --- a/lib/librte_ethdev/rte_ethdev.h +++ b/lib/librte_ethdev/rte_ethdev.h @@ -1544,6 +1544,29 @@ struct rte_eth_dcb_info { struct rte_eth_dcb_tc_queue_mapping tc_queue; }; +/** + * This enum indicates the possible (forward error correction)FEC modes + * of an ethdev port. + */ +enum rte_eth_fec_mode { + RTE_ETH_FEC_NOFEC = 0, /**< FEC is off */ + RTE_ETH_FEC_AUTO, /**< FEC autonegotiation modes */ + RTE_ETH_FEC_BASER, /**< FEC using common algorithm */ + RTE_ETH_FEC_RS, /**< FEC using RS algorithm */ +}; + +/* Translate from FEC mode to FEC capa */ +#define RTE_ETH_FEC_MODE_TO_CAPA(x) (1U << (x)) + +/* This macro indicates FEC capa mask*/ +#define RTE_ETH_FEC_MODE_CAPA_MASK(x) (1U << (RTE_ETH_FEC_ ## x)) + +/* A structure used to get capabilities per link speed */ +struct rte_eth_fec_capa { + uint32_t speed; /**< Link speed (see ETH_SPEED_NUM_*) */ + uint32_t capa; /**< FEC capabilities bitmask (see RTE_FEC_CAPA_*) */ +}; + #define RTE_ETH_ALL RTE_MAX_ETHPORTS /* Macros to check for valid port */ @@ -3397,6 +3420,74 @@ int rte_eth_led_on(uint16_t port_id); int rte_eth_led_off(uint16_t port_id); /** + * @warning + * @b EXPERIMENTAL: this API may change, or be removed, without prior notice + * + * Get Forward Error Correction(FEC) capability. + * + * @param port_id + * The port identifier of the Ethernet device. + * @param num + * the num is in/out with a number of elements in an array. + * @param speed_fec_capa + * speed_fec_capa is out only with per-speed capabilities. + * + * @return + * - (0) if successful. + * - (-ENOTSUP) if underlying hardware OR driver doesn't support. + * that operation. + * - (-EIO) if device is removed. + * - (-ENODEV) if *port_id* invalid. + * - (-EINVAL) if *num* or *speed_fec_capa* invalid + */ +__rte_experimental +int rte_eth_fec_get_capability(uint16_t port_id, uint32_t *num, + struct rte_eth_fec_capa *speed_fec_capa); + +/** + * @warning + * @b EXPERIMENTAL: this API may change, or be removed, without prior notice + * + * Get current Forward Error Correction(FEC) mode. + * If link is down and AUTO is enabled, AUTO is returned, otherwise, + * configured FEC mode is returned. + * If link is up, current FEC mode is returned. + * + * @param port_id + * The port identifier of the Ethernet device. + * @param mode + * returns the FEC mode from the device. + * @return + * - (0) if successful. + * - (-ENOTSUP) if underlying hardware OR driver doesn't support. + * that operation. + * - (-EIO) if device is removed. + * - (-ENODEV) if *port_id* invalid. + */ +__rte_experimental +int rte_eth_fec_get(uint16_t port_id, uint32_t *mode); + +/** + * @warning + * @b EXPERIMENTAL: this API may change, or be removed, without prior notice + * + * Set Forward Error Correction(FEC) mode. + * + * @param port_id + * The port identifier of the Ethernet device. + * @param mode + * the FEC mode. + * @return + * - (0) if successful. + * - (-EINVAL) if the FEC mode is not valid. + * - (-ENOTSUP) if underlying hardware OR driver doesn't support. + * - (-EIO) if device is removed. + * - (-ENODEV) if *port_id* invalid. + */ +__rte_experimental +int rte_eth_fec_set(uint16_t port_id, uint32_t mode); + +/** * Get current status of the Ethernet link flow control for Ethernet device * * @param port_id diff --git a/lib/librte_ethdev/rte_ethdev_driver.h b/lib/librte_ethdev/rte_ethdev_driver.h index 23cc1e0..625b8c5 100644 --- a/lib/librte_ethdev/rte_ethdev_driver.h +++ b/lib/librte_ethdev/rte_ethdev_driver.h @@ -575,6 +575,81 @@ typedef int (*eth_tx_hairpin_queue_setup_t) const struct rte_eth_hairpin_conf *hairpin_conf); /** + * @internal + * Get Forward Error Correction(FEC) capability. + * + * @param dev + * ethdev handle of port. + * @param num + * the num is in/out with a number of elements in an array. + * @param speed_fec_capa + * speed_fec_capa is out only with per-speed capabilities. + * + * @return + * Negative errno value on error, 0 on success. + * + * @retval 0 + * Success, get FEC success. + * @retval -ENOTSUP + * operation is not supported. + * @retval -EIO + * device is removed. + * @retval -ENODEV + * Device is gone. + * @retval -EINVAL + * *num* or *speed_fec_capa* invalid. + */ +typedef int (*eth_fec_get_capability_t)(struct rte_eth_dev *dev, uint32_t *num, + struct rte_eth_fec_capa *speed_fec_capa); + +/** + * @internal + * Get Forward Error Correction(FEC) mode. + * + * @param dev + * ethdev handle of port. + * @param mode + * returns the FEC mode from the device. + * + * @return + * Negative errno value on error, 0 on success. + * + * @retval 0 + * Success, get FEC success. + * @retval -ENOTSUP + * operation is not supported. + * @retval -EIO + * device is removed. + * @retval -ENODEV + * Device is gone. + */ +typedef int (*eth_fec_get_t)(struct rte_eth_dev *dev, + uint32_t *mode); + +/** + * @internal + * Set Forward Error Correction(FEC) mode. + * + * @param dev + * ethdev handle of port. + * @param mode + * the FEC mode. + * + * @return + * Negative errno value on error, 0 on success. + * + * @retval 0 + * Success, set FEC success. + * @retval -ENOTSUP + * operation is not supported. + * @retval -EIO + * device is removed. + * @retval -ENODEV + * Device is gone. + */ +typedef int (*eth_fec_set_t)(struct rte_eth_dev *dev, uint32_t mode); + +/** * @internal A structure containing the functions exported by an Ethernet driver. */ struct eth_dev_ops { @@ -713,6 +788,13 @@ struct eth_dev_ops { /**< Set up device RX hairpin queue. */ eth_tx_hairpin_queue_setup_t tx_hairpin_queue_setup; /**< Set up device TX hairpin queue. */ + + eth_fec_get_capability_t fec_get_capability; + /**< Get Forward Error Correction(FEC) capability; */ + eth_fec_get_t fec_get; + /**< Get Forward Error Correction(FEC) mode; */ + eth_fec_set_t fec_set; + /**< Set Forward Error Correction(FEC) mode; */ }; /** diff --git a/lib/librte_ethdev/rte_ethdev_version.map b/lib/librte_ethdev/rte_ethdev_version.map index c95ef51..b9ace3a 100644 --- a/lib/librte_ethdev/rte_ethdev_version.map +++ b/lib/librte_ethdev/rte_ethdev_version.map @@ -229,6 +229,9 @@ EXPERIMENTAL { # added in 20.11 rte_eth_link_speed_to_str; rte_eth_link_to_str; + rte_eth_fec_get_capability; + rte_eth_fec_get; + rte_eth_fec_set; }; INTERNAL { From patchwork Thu Sep 24 13:05:43 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "humin (Q)" X-Patchwork-Id: 78747 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id C232AA04B1; Thu, 24 Sep 2020 15:08:31 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 520F81DED4; Thu, 24 Sep 2020 15:08:27 +0200 (CEST) Received: from huawei.com (szxga05-in.huawei.com [45.249.212.191]) by dpdk.org (Postfix) with ESMTP id 5B7591DDED for ; Thu, 24 Sep 2020 15:08:24 +0200 (CEST) Received: from DGGEMS404-HUB.china.huawei.com (unknown [172.30.72.60]) by Forcepoint Email with ESMTP id AECDCCDAAC7FD93FD2A4; Thu, 24 Sep 2020 21:08:22 +0800 (CST) Received: from localhost.localdomain (10.69.192.56) by DGGEMS404-HUB.china.huawei.com (10.3.19.204) with Microsoft SMTP Server id 14.3.487.0; Thu, 24 Sep 2020 21:08:14 +0800 From: "Min Hu (Connor)" To: CC: , , , , Date: Thu, 24 Sep 2020 21:05:43 +0800 Message-ID: <1600952745-55993-3-git-send-email-humin29@huawei.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1600952745-55993-1-git-send-email-humin29@huawei.com> References: <1599534347-20430-1-git-send-email-humin29@huawei.com> <1600952745-55993-1-git-send-email-humin29@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.69.192.56] X-CFilter-Loop: Reflected Subject: [dpdk-dev] [PATCH V12 2/4] net/hns3: support FEC 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" Forward error correction (FEC) is a bit error correction mode. It adds error correction information to data packets at the transmit end, and uses the error correction information to correct the bit errors generated during data packet transmission at the receive end. This improves signal quality but also brings a delay to signals. This function can be enabled or disabled as required. This patch adds FEC support for ethdev.Introduce ethdev operations which support query and config FEC information in hardware. Signed-off-by: Min Hu (Connor) Reviewed-by: Wei Hu (Xavier) Reviewed-by: Chengwen Feng Reviewed-by: Chengchang Tang --- v11->v12: fix coding warning. v10->v11: allow to report capabilities per link speed. specify what should be reported if link is down when get FEC. change mode to capa bitmask. --- v9->v10: use RTE_ETH_FEC_MODE_CAPA_MASK(x) which is just defined. --- v7->v8: FEC mode order defined in hns3 hardware is inconsistend with that defined in the ethdev library. So the sequence needs to be converted. --- v5->v6: fixed code styles according to DPDK coding style. added _eth prefix. --- v4->v5: Data type for fec_cap is changed from uint8_t to uint32_t for possible future expansion. --- v2->v3: adjust the return value of function. --- drivers/net/hns3/hns3_cmd.h | 19 ++- drivers/net/hns3/hns3_ethdev.c | 357 +++++++++++++++++++++++++++++++++++++++++ drivers/net/hns3/hns3_ethdev.h | 1 + 3 files changed, 376 insertions(+), 1 deletion(-) diff --git a/drivers/net/hns3/hns3_cmd.h b/drivers/net/hns3/hns3_cmd.h index 87d6053..a1e9604 100644 --- a/drivers/net/hns3/hns3_cmd.h +++ b/drivers/net/hns3/hns3_cmd.h @@ -100,6 +100,7 @@ enum hns3_opcode_type { HNS3_OPC_QUERY_LINK_STATUS = 0x0307, HNS3_OPC_CONFIG_MAX_FRM_SIZE = 0x0308, HNS3_OPC_CONFIG_SPEED_DUP = 0x0309, + HNS3_OPC_CONFIG_FEC_MODE = 0x031A, /* PFC/Pause commands */ HNS3_OPC_CFG_MAC_PAUSE_EN = 0x0701, @@ -684,9 +685,25 @@ struct hns3_config_auto_neg_cmd { uint8_t rsv[20]; }; +#define HNS3_MAC_CFG_FEC_AUTO_EN_B 0 +#define HNS3_MAC_CFG_FEC_MODE_S 1 +#define HNS3_MAC_CFG_FEC_MODE_M GENMASK(3, 1) +#define HNS3_MAC_FEC_OFF 0 +#define HNS3_MAC_FEC_BASER 1 +#define HNS3_MAC_FEC_RS 2 + struct hns3_sfp_speed_cmd { uint32_t sfp_speed; - uint32_t rsv[5]; + uint8_t query_type; /* 0: sfp speed, 1: active fec */ + uint8_t active_fec; /* current FEC mode */ + uint16_t rsv1; + uint32_t rsv2[4]; +}; + +/* Configure FEC mode, opcode:0x031A */ +struct hns3_config_fec_cmd { + uint8_t fec_mode; + uint8_t rsv[23]; }; #define HNS3_MAC_MGR_MASK_VLAN_B BIT(0) diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c index 73d5042..f06b5b1 100644 --- a/drivers/net/hns3/hns3_ethdev.c +++ b/drivers/net/hns3/hns3_ethdev.c @@ -63,6 +63,11 @@ #define HNS3_RESET_WAIT_MS 100 #define HNS3_RESET_WAIT_CNT 200 +/* FEC mode order defined in HNS3 hardware */ +#define HNS3_HW_FEC_MODE_NOFEC 0 +#define HNS3_HW_FEC_MODE_BASER 1 +#define HNS3_HW_FEC_MODE_RS 2 + enum hns3_evt_cause { HNS3_VECTOR0_EVENT_RST, HNS3_VECTOR0_EVENT_MBX, @@ -70,6 +75,34 @@ enum hns3_evt_cause { HNS3_VECTOR0_EVENT_OTHER, }; +static const struct rte_eth_fec_capa speed_fec_capa_tbl[] = { + { ETH_SPEED_NUM_10G, RTE_ETH_FEC_MODE_CAPA_MASK(NOFEC) | + RTE_ETH_FEC_MODE_CAPA_MASK(AUTO) | + RTE_ETH_FEC_MODE_CAPA_MASK(BASER) }, + + { ETH_SPEED_NUM_25G, RTE_ETH_FEC_MODE_CAPA_MASK(NOFEC) | + RTE_ETH_FEC_MODE_CAPA_MASK(AUTO) | + RTE_ETH_FEC_MODE_CAPA_MASK(BASER) | + RTE_ETH_FEC_MODE_CAPA_MASK(RS) }, + + { ETH_SPEED_NUM_40G, RTE_ETH_FEC_MODE_CAPA_MASK(NOFEC) | + RTE_ETH_FEC_MODE_CAPA_MASK(AUTO) | + RTE_ETH_FEC_MODE_CAPA_MASK(BASER) }, + + { ETH_SPEED_NUM_50G, RTE_ETH_FEC_MODE_CAPA_MASK(NOFEC) | + RTE_ETH_FEC_MODE_CAPA_MASK(AUTO) | + RTE_ETH_FEC_MODE_CAPA_MASK(BASER) | + RTE_ETH_FEC_MODE_CAPA_MASK(RS) }, + + { ETH_SPEED_NUM_100G, RTE_ETH_FEC_MODE_CAPA_MASK(NOFEC) | + RTE_ETH_FEC_MODE_CAPA_MASK(AUTO) | + RTE_ETH_FEC_MODE_CAPA_MASK(RS) }, + + { ETH_SPEED_NUM_200G, RTE_ETH_FEC_MODE_CAPA_MASK(NOFEC) | + RTE_ETH_FEC_MODE_CAPA_MASK(AUTO) | + RTE_ETH_FEC_MODE_CAPA_MASK(RS) } +}; + static enum hns3_reset_level hns3_get_reset_level(struct hns3_adapter *hns, uint64_t *levels); static int hns3_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu); @@ -81,6 +114,8 @@ static int hns3_add_mc_addr(struct hns3_hw *hw, struct rte_ether_addr *mac_addr); static int hns3_remove_mc_addr(struct hns3_hw *hw, struct rte_ether_addr *mac_addr); +static int hns3_restore_fec(struct hns3_hw *hw); +static int hns3_query_dev_fec_info(struct rte_eth_dev *dev); static void hns3_pf_disable_irq0(struct hns3_hw *hw) @@ -2889,6 +2924,13 @@ hns3_get_capability(struct hns3_hw *hw) device_id == HNS3_DEV_ID_200G_RDMA) hns3_set_bit(hw->capability, HNS3_DEV_SUPPORT_DCB_B, 1); + ret = hns3_query_dev_fec_info(eth_dev); + if (ret) { + PMD_INIT_LOG(ERR, + "failed to query FEC information, ret = %d", ret); + return ret; + } + /* Get PCI revision id */ ret = rte_pci_read_config(pci_dev, &revision, HNS3_PCI_REVISION_ID_LEN, HNS3_PCI_REVISION_ID); @@ -5446,6 +5488,10 @@ hns3_restore_conf(struct hns3_adapter *hns) if (ret) goto err_promisc; + ret = hns3_restore_fec(hw); + if (ret) + goto err_promisc; + if (hns->hw.adapter_state == HNS3_NIC_STARTED) { ret = hns3_do_start(hns, false); if (ret) @@ -5524,6 +5570,314 @@ hns3_reset_service(void *param) hns3_msix_process(hns, reset_level); } +static int +hns3_get_speed_capa_num(uint16_t device_id) +{ + uint32_t num; + + switch (device_id) { + case HNS3_DEV_ID_25GE: + case HNS3_DEV_ID_25GE_RDMA: + num = 2; + break; + case HNS3_DEV_ID_100G_RDMA_MACSEC: + case HNS3_DEV_ID_200G_RDMA: + num = 1; + break; + default: + num = 0; + break; + } + + return num; +} + +static int +hns3_get_speed_fec_capa(struct rte_eth_fec_capa *speed_fec_capa, + uint16_t device_id) +{ + switch (device_id) { + case HNS3_DEV_ID_25GE: + /* fallthrough */ + case HNS3_DEV_ID_25GE_RDMA: + speed_fec_capa[0].speed = speed_fec_capa_tbl[1].speed; + speed_fec_capa[0].capa = speed_fec_capa_tbl[1].capa; + + /* In HNS3 device, the 25G NIC is compatible with 10G rate */ + speed_fec_capa[1].speed = speed_fec_capa_tbl[0].speed; + speed_fec_capa[1].capa = speed_fec_capa_tbl[0].capa; + break; + case HNS3_DEV_ID_100G_RDMA_MACSEC: + speed_fec_capa[0].speed = speed_fec_capa_tbl[4].speed; + speed_fec_capa[0].capa = speed_fec_capa_tbl[4].capa; + break; + case HNS3_DEV_ID_200G_RDMA: + speed_fec_capa[0].speed = speed_fec_capa_tbl[5].speed; + speed_fec_capa[0].capa = speed_fec_capa_tbl[5].capa; + break; + default: + return -ENOTSUP; + } + + return 0; +} + +static int +hns3_fec_get_capability(struct rte_eth_dev *dev, uint32_t *num, + struct rte_eth_fec_capa *speed_fec_capa) +{ + struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private); + struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev); + uint16_t device_id = pci_dev->id.device_id; + uint32_t capa_num; + int ret; + + capa_num = hns3_get_speed_capa_num(device_id); + if (capa_num == 0) { + hns3_err(hw, "device(0x%x) is not supported by hns3 PMD", + device_id); + return -ENOTSUP; + } else if (*num < capa_num) { + hns3_err(hw, "insufficient num, num should be no less than %u", + capa_num); + return -EINVAL; + } + + ret = hns3_get_speed_fec_capa(speed_fec_capa, device_id); + if (ret) + return -ENOTSUP; + + *num = capa_num; + return 0; +} + +static int +get_current_fec_auto_state(struct hns3_hw *hw, uint8_t *state) +{ + struct hns3_config_fec_cmd *req; + struct hns3_cmd_desc desc; + int ret; + + hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_CONFIG_FEC_MODE, true); + req = (struct hns3_config_fec_cmd *)desc.data; + ret = hns3_cmd_send(hw, &desc, 1); + if (ret) { + hns3_err(hw, "get current fec auto state failed, ret = %d", + ret); + return ret; + } + + *state = req->fec_mode & (1U << HNS3_MAC_CFG_FEC_AUTO_EN_B); + return 0; +} + +static int +hns3_fec_get(struct rte_eth_dev *dev, uint32_t *mode) +{ +#define QUERY_ACTIVE_SPEED 1 + struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private); + struct hns3_sfp_speed_cmd *resp; + uint32_t tmp_mode; + uint8_t auto_state; + struct hns3_cmd_desc desc; + int ret; + + /* + * If link is down and AUTO is enabled, AUTO is returned, otherwise, + * configured FEC mode is returned. + * If link is up, current FEC mode is returned. + */ + if (hw->mac.link_status == ETH_LINK_DOWN) { + ret = get_current_fec_auto_state(hw, &auto_state); + if (ret) + return ret; + + if (auto_state == 0x1) { + *mode = RTE_ETH_FEC_MODE_CAPA_MASK(AUTO); + return 0; + } + } + + hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_SFP_GET_SPEED, true); + resp = (struct hns3_sfp_speed_cmd *)desc.data; + resp->query_type = QUERY_ACTIVE_SPEED; + + ret = hns3_cmd_send(hw, &desc, 1); + if (ret == -EOPNOTSUPP) { + hns3_err(hw, "IMP do not support get FEC, ret = %d", ret); + return ret; + } else if (ret) { + hns3_err(hw, "get FEC failed, ret = %d", ret); + return ret; + } + + /* + * FEC mode order defined in hns3 hardware is inconsistend with + * that defined in the ethdev library. So the sequence needs + * to be converted. + */ + switch (resp->active_fec) { + case HNS3_HW_FEC_MODE_NOFEC: + tmp_mode = RTE_ETH_FEC_MODE_CAPA_MASK(NOFEC); + break; + case HNS3_HW_FEC_MODE_BASER: + tmp_mode = RTE_ETH_FEC_MODE_CAPA_MASK(BASER); + break; + case HNS3_HW_FEC_MODE_RS: + tmp_mode = RTE_ETH_FEC_MODE_CAPA_MASK(RS); + break; + default: + tmp_mode = RTE_ETH_FEC_MODE_CAPA_MASK(NOFEC); + break; + } + + *mode = tmp_mode; + return 0; +} + +static int +hns3_set_fec_hw(struct hns3_hw *hw, uint32_t mode) +{ + struct hns3_config_fec_cmd *req; + struct hns3_cmd_desc desc; + int ret; + + hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_CONFIG_FEC_MODE, false); + + req = (struct hns3_config_fec_cmd *)desc.data; + switch (mode) { + case RTE_ETH_FEC_MODE_CAPA_MASK(NOFEC): + hns3_set_field(req->fec_mode, HNS3_MAC_CFG_FEC_MODE_M, + HNS3_MAC_CFG_FEC_MODE_S, HNS3_MAC_FEC_OFF); + break; + case RTE_ETH_FEC_MODE_CAPA_MASK(BASER): + hns3_set_field(req->fec_mode, HNS3_MAC_CFG_FEC_MODE_M, + HNS3_MAC_CFG_FEC_MODE_S, HNS3_MAC_FEC_BASER); + break; + case RTE_ETH_FEC_MODE_CAPA_MASK(RS): + hns3_set_field(req->fec_mode, HNS3_MAC_CFG_FEC_MODE_M, + HNS3_MAC_CFG_FEC_MODE_S, HNS3_MAC_FEC_RS); + break; + case RTE_ETH_FEC_MODE_CAPA_MASK(AUTO): + hns3_set_bit(req->fec_mode, HNS3_MAC_CFG_FEC_AUTO_EN_B, 1); + break; + default: + return 0; + } + ret = hns3_cmd_send(hw, &desc, 1); + if (ret) + hns3_err(hw, "set fec mode failed, ret = %d", ret); + + return ret; +} + +static uint32_t +get_current_speed_fec_cap(struct hns3_hw *hw, struct rte_eth_fec_capa *fec_capa) +{ + struct hns3_mac *mac = &hw->mac; + uint32_t cur_capa; + + switch (mac->link_speed) { + case ETH_SPEED_NUM_10G: + cur_capa = fec_capa[1].capa; + break; + case ETH_SPEED_NUM_25G: + case ETH_SPEED_NUM_100G: + case ETH_SPEED_NUM_200G: + cur_capa = fec_capa[0].capa; + break; + default: + cur_capa = 0; + break; + } + + return cur_capa; +} + +static bool +is_fec_mode_one_bit_set(uint32_t mode) +{ + int cnt = 0; + uint8_t i; + + for (i = 0; i < sizeof(mode); i++) + if (mode >> i & 0x1) + cnt++; + + return cnt == 1 ? true : false; +} + +static int +hns3_fec_set(struct rte_eth_dev *dev, uint32_t mode) +{ +#define FEC_CAPA_NUM 2 + struct hns3_adapter *hns = dev->data->dev_private; + struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(hns); + struct hns3_pf *pf = &hns->pf; + + struct rte_eth_fec_capa fec_capa[FEC_CAPA_NUM]; + uint32_t cur_capa; + uint32_t num = FEC_CAPA_NUM; + int ret; + + ret = hns3_fec_get_capability(dev, &num, fec_capa); + if (ret != 0) + return ret; + + /* HNS3 PMD driver only support one bit set mode, e.g. 0x1, 0x4 */ + if (!is_fec_mode_one_bit_set(mode)) + hns3_err(hw, "FEC mode(0x%x) not supported in HNS3 PMD," + "FEC mode should be only one bit set", mode); + + /* + * Check whether the configured mode is within the FEC capability. + * If not, the configured mode will not be supported. + */ + cur_capa = get_current_speed_fec_cap(hw, fec_capa); + if (!(cur_capa & mode)) { + hns3_err(hw, "unsupported FEC mode = 0x%x", mode); + return -EINVAL; + } + + ret = hns3_set_fec_hw(hw, mode); + if (ret) + return ret; + + pf->fec_mode = mode; + return 0; +} + +static int +hns3_restore_fec(struct hns3_hw *hw) +{ + struct hns3_adapter *hns = HNS3_DEV_HW_TO_ADAPTER(hw); + struct hns3_pf *pf = &hns->pf; + uint32_t mode = pf->fec_mode; + int ret; + + ret = hns3_set_fec_hw(hw, mode); + if (ret) + hns3_err(hw, "restore fec mode(0x%x) failed, ret = %d", + mode, ret); + + return ret; +} + +static int +hns3_query_dev_fec_info(struct rte_eth_dev *dev) +{ + struct hns3_adapter *hns = dev->data->dev_private; + struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(hns); + struct hns3_pf *pf = &hns->pf; + int ret; + + ret = hns3_fec_get(dev, &pf->fec_mode); + if (ret) + hns3_err(hw, "query device FEC info failed, ret = %d", ret); + + return ret; +} + static const struct eth_dev_ops hns3_eth_dev_ops = { .dev_configure = hns3_dev_configure, .dev_start = hns3_dev_start, @@ -5573,6 +5927,9 @@ static const struct eth_dev_ops hns3_eth_dev_ops = { .get_reg = hns3_get_regs, .get_dcb_info = hns3_get_dcb_info, .dev_supported_ptypes_get = hns3_dev_supported_ptypes_get, + .fec_get_capability = hns3_fec_get_capability, + .fec_get = hns3_fec_get, + .fec_set = hns3_fec_set, }; static const struct hns3_reset_ops hns3_reset_ops = { diff --git a/drivers/net/hns3/hns3_ethdev.h b/drivers/net/hns3/hns3_ethdev.h index fd6a9f9..393b91f 100644 --- a/drivers/net/hns3/hns3_ethdev.h +++ b/drivers/net/hns3/hns3_ethdev.h @@ -620,6 +620,7 @@ struct hns3_pf { struct hns3_err_msix_intr_stats abn_int_stats; bool support_sfp_query; + uint32_t fec_mode; /* current FEC mode for ethdev */ struct hns3_vtag_cfg vtag_config; LIST_HEAD(vlan_tbl, hns3_user_vlan_table) vlan_list; From patchwork Thu Sep 24 13:05:44 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "humin (Q)" X-Patchwork-Id: 78746 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 247EFA04B1; Thu, 24 Sep 2020 15:08:26 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 039EE1DE32; Thu, 24 Sep 2020 15:08:26 +0200 (CEST) Received: from huawei.com (szxga06-in.huawei.com [45.249.212.32]) by dpdk.org (Postfix) with ESMTP id 65EA01DE32 for ; Thu, 24 Sep 2020 15:08:24 +0200 (CEST) Received: from DGGEMS404-HUB.china.huawei.com (unknown [172.30.72.60]) by Forcepoint Email with ESMTP id E78C4D3B420162E86DAE; Thu, 24 Sep 2020 21:08:22 +0800 (CST) Received: from localhost.localdomain (10.69.192.56) by DGGEMS404-HUB.china.huawei.com (10.3.19.204) with Microsoft SMTP Server id 14.3.487.0; Thu, 24 Sep 2020 21:08:14 +0800 From: "Min Hu (Connor)" To: CC: , , , , Date: Thu, 24 Sep 2020 21:05:44 +0800 Message-ID: <1600952745-55993-4-git-send-email-humin29@huawei.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1600952745-55993-1-git-send-email-humin29@huawei.com> References: <1599534347-20430-1-git-send-email-humin29@huawei.com> <1600952745-55993-1-git-send-email-humin29@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.69.192.56] X-CFilter-Loop: Reflected Subject: [dpdk-dev] [PATCH V12 3/4] app/testpmd: add FEC command 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 commit adds testpmd capability to query and config FEC function of device. This includes: - show FEC capabilities, example: testpmd> show port 0 fec capabilities - show FEC mode, example: testpmd> show port 0 fec_mode - config FEC mode, example: testpmd> set port 0 where: auto|off|rs|baser are four kinds of FEC mode which dev support according to MAC link speed. Signed-off-by: Min Hu (Connor) Reviewed-by: Wei Hu (Xavier) Reviewed-by: Chengwen Feng Reviewed-by: Chengchang Tang Acked-by: Ajit Khaparde --- v10->v11: change mode to capa bitmask. --- v8->v9: added acked-by. --- v6->v7: used RTE_DIM(fec_mode_name) instead of RTE_ETH_FEC_NUM --- v5->v6: fixed code styles according to DPDK coding style. added _eth prefix. --- v4->v5: Add RTE_ prefix for public FEC mode enum. --- v3->v4: adjust the display format of FEC mode --- v2->v3: adjust the display format of FEC capability. --- app/test-pmd/cmdline.c | 221 +++++++++++++++++++++++++++++++++++++++++++++++++ app/test-pmd/config.c | 91 ++++++++++++++++++++ app/test-pmd/testpmd.h | 2 + 3 files changed, 314 insertions(+) diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index 5f93409..445726f 100644 --- a/app/test-pmd/cmdline.c +++ b/app/test-pmd/cmdline.c @@ -19161,6 +19161,224 @@ cmdline_parse_inst_t cmd_show_tx_metadata = { }, }; +/* *** show fec capability per port configuration *** */ +struct cmd_show_fec_capability_result { + cmdline_fixed_string_t cmd_show; + cmdline_fixed_string_t cmd_port; + cmdline_fixed_string_t cmd_fec; + cmdline_fixed_string_t cmd_keyword; + portid_t cmd_pid; +}; + +static void +cmd_show_fec_capability_parsed(void *parsed_result, + __rte_unused struct cmdline *cl, + __rte_unused void *data) +{ +#define FEC_CAP_NUM 2 + struct cmd_show_fec_capability_result *res = parsed_result; + struct rte_eth_fec_capa speed_fec_capa[FEC_CAP_NUM]; + uint32_t num = FEC_CAP_NUM; + int ret; + + if (!rte_eth_dev_is_valid_port(res->cmd_pid)) { + printf("Invalid port id %u\n", res->cmd_pid); + return; + } + + ret = rte_eth_fec_get_capability(res->cmd_pid, &num, speed_fec_capa); + if (ret == -ENOTSUP) { + printf("Function not implemented\n"); + return; + } else if (ret < 0) { + printf("Get FEC capability failed\n"); + return; + } + + show_fec_capability(num, speed_fec_capa); +} + +cmdline_parse_token_string_t cmd_show_fec_capability_show = + TOKEN_STRING_INITIALIZER(struct cmd_show_fec_capability_result, + cmd_show, "show"); +cmdline_parse_token_string_t cmd_show_fec_capability_port = + TOKEN_STRING_INITIALIZER(struct cmd_show_fec_capability_result, + cmd_port, "port"); +cmdline_parse_token_num_t cmd_show_fec_capability_pid = + TOKEN_NUM_INITIALIZER(struct cmd_show_fec_capability_result, + cmd_pid, UINT16); +cmdline_parse_token_string_t cmd_show_fec_capability_fec = + TOKEN_STRING_INITIALIZER(struct cmd_show_fec_capability_result, + cmd_fec, "fec"); +cmdline_parse_token_string_t cmd_show_fec_capability_keyword = + TOKEN_STRING_INITIALIZER(struct cmd_show_fec_capability_result, + cmd_keyword, "capabilities"); + +cmdline_parse_inst_t cmd_show_capability = { + .f = cmd_show_fec_capability_parsed, + .data = NULL, + .help_str = "show port fec capabilities", + .tokens = { + (void *)&cmd_show_fec_capability_show, + (void *)&cmd_show_fec_capability_port, + (void *)&cmd_show_fec_capability_pid, + (void *)&cmd_show_fec_capability_fec, + (void *)&cmd_show_fec_capability_keyword, + NULL, + }, +}; + +/* *** show fec mode per port configuration *** */ +struct cmd_show_fec_metadata_result { + cmdline_fixed_string_t cmd_show; + cmdline_fixed_string_t cmd_port; + cmdline_fixed_string_t cmd_keyword; + portid_t cmd_pid; +}; + +static void +cmd_show_fec_mode_parsed(void *parsed_result, + __rte_unused struct cmdline *cl, + __rte_unused void *data) +{ +#define FEC_NAME_SIZE 16 + struct cmd_show_fec_metadata_result *res = parsed_result; + uint32_t mode; + char buf[FEC_NAME_SIZE]; + int ret; + + if (!rte_eth_dev_is_valid_port(res->cmd_pid)) { + printf("Invalid port id %u\n", res->cmd_pid); + return; + } + ret = rte_eth_fec_get(res->cmd_pid, &mode); + if (ret == -ENOTSUP) { + printf("Function not implemented\n"); + return; + } else if (ret < 0) { + printf("Get FEC mode failed\n"); + return; + } + + switch (mode) { + case RTE_ETH_FEC_MODE_CAPA_MASK(NOFEC): + strlcpy(buf, "off", sizeof(buf)); + break; + case RTE_ETH_FEC_MODE_CAPA_MASK(AUTO): + strlcpy(buf, "auto", sizeof(buf)); + break; + case RTE_ETH_FEC_MODE_CAPA_MASK(BASER): + strlcpy(buf, "baser", sizeof(buf)); + break; + case RTE_ETH_FEC_MODE_CAPA_MASK(RS): + strlcpy(buf, "rs", sizeof(buf)); + break; + default: + return; + } + + printf("%s\n", buf); +} + +cmdline_parse_token_string_t cmd_show_fec_mode_show = + TOKEN_STRING_INITIALIZER(struct cmd_show_fec_metadata_result, + cmd_show, "show"); +cmdline_parse_token_string_t cmd_show_fec_mode_port = + TOKEN_STRING_INITIALIZER(struct cmd_show_fec_metadata_result, + cmd_port, "port"); +cmdline_parse_token_num_t cmd_show_fec_mode_pid = + TOKEN_NUM_INITIALIZER(struct cmd_show_fec_metadata_result, + cmd_pid, UINT16); +cmdline_parse_token_string_t cmd_show_fec_mode_keyword = + TOKEN_STRING_INITIALIZER(struct cmd_show_fec_metadata_result, + cmd_keyword, "fec_mode"); + +cmdline_parse_inst_t cmd_show_fec_mode = { + .f = cmd_show_fec_mode_parsed, + .data = NULL, + .help_str = "show port fec_mode", + .tokens = { + (void *)&cmd_show_fec_mode_show, + (void *)&cmd_show_fec_mode_port, + (void *)&cmd_show_fec_mode_pid, + (void *)&cmd_show_fec_mode_keyword, + NULL, + }, +}; + +/* *** set fec mode per port configuration *** */ +struct cmd_set_port_fec_mode { + cmdline_fixed_string_t set; + cmdline_fixed_string_t port; + portid_t port_id; + cmdline_fixed_string_t fec_mode; + cmdline_fixed_string_t fec_value; +}; + +/* Common CLI fields for set fec mode */ +cmdline_parse_token_string_t cmd_set_port_fec_mode_set = + TOKEN_STRING_INITIALIZER + (struct cmd_set_port_fec_mode, + set, "set"); +cmdline_parse_token_string_t cmd_set_port_fec_mode_port = + TOKEN_STRING_INITIALIZER + (struct cmd_set_port_fec_mode, + port, "port"); +cmdline_parse_token_num_t cmd_set_port_fec_mode_port_id = + TOKEN_NUM_INITIALIZER + (struct cmd_set_port_fec_mode, + port_id, UINT16); +cmdline_parse_token_string_t cmd_set_port_fec_mode_str = + TOKEN_STRING_INITIALIZER + (struct cmd_set_port_fec_mode, + fec_mode, "fec_mode"); +cmdline_parse_token_string_t cmd_set_port_fec_mode_value = + TOKEN_STRING_INITIALIZER + (struct cmd_set_port_fec_mode, + fec_value, NULL); + +static void +cmd_set_port_fec_mode_parsed( + void *parsed_result, + __rte_unused struct cmdline *cl, + __rte_unused void *data) +{ + struct cmd_set_port_fec_mode *res = parsed_result; + uint16_t port_id = res->port_id; + uint32_t mode; + int ret; + + ret = parse_fec_mode(res->fec_value, &mode); + if (ret < 0) { + printf("Unknown fec mode: %s for Port %d\n", res->fec_value, + port_id); + return; + } + + ret = rte_eth_fec_set(port_id, mode); + if (ret == -ENOTSUP) { + printf("Function not implemented\n"); + return; + } else if (ret < 0) { + printf("Set FEC mode failed\n"); + return; + } +} + +cmdline_parse_inst_t cmd_set_fec_mode = { + .f = cmd_set_port_fec_mode_parsed, + .data = NULL, + .help_str = "set port fec_mode ", + .tokens = { + (void *)&cmd_set_port_fec_mode_set, + (void *)&cmd_set_port_fec_mode_port, + (void *)&cmd_set_port_fec_mode_port_id, + (void *)&cmd_set_port_fec_mode_str, + (void *)&cmd_set_port_fec_mode_value, + NULL, + }, +}; + /* show port supported ptypes */ /* Common result structure for show port ptypes */ @@ -19795,6 +20013,9 @@ cmdline_parse_ctx_t main_ctx[] = { (cmdline_parse_inst_t *)&cmd_show_set_raw, (cmdline_parse_inst_t *)&cmd_show_set_raw_all, (cmdline_parse_inst_t *)&cmd_config_tx_dynf_specific, + (cmdline_parse_inst_t *)&cmd_show_fec_mode, + (cmdline_parse_inst_t *)&cmd_set_fec_mode, + (cmdline_parse_inst_t *)&cmd_show_capability, NULL, }; diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c index 2d9a456..a6269c1 100644 --- a/app/test-pmd/config.c +++ b/app/test-pmd/config.c @@ -138,6 +138,58 @@ const struct rss_type_info rss_type_table[] = { { NULL, 0 }, }; +static const struct { + enum rte_eth_fec_mode mode; + const char *name; +} fec_mode_name[] = { + { + .mode = RTE_ETH_FEC_NOFEC, + .name = "off", + }, + { + .mode = RTE_ETH_FEC_AUTO, + .name = "auto", + }, + { + .mode = RTE_ETH_FEC_BASER, + .name = "baser", + }, + { + .mode = RTE_ETH_FEC_RS, + .name = "rs", + }, +}; + +static const struct { + uint32_t speed; + const char *name; +} eth_speed_name[] = { + { + .speed = ETH_SPEED_NUM_10G, + .name = "Speed 10G", + }, + { + .speed = ETH_SPEED_NUM_25G, + .name = "Speed 25G", + }, + { + .speed = ETH_SPEED_NUM_40G, + .name = "Speed 40G", + }, + { + .speed = ETH_SPEED_NUM_50G, + .name = "Speed 50G", + }, + { + .speed = ETH_SPEED_NUM_100G, + .name = "Speed 100G", + }, + { + .speed = ETH_SPEED_NUM_200G, + .name = "Speed 200G", + }, +}; + static void print_ethaddr(const char *name, struct rte_ether_addr *eth_addr) { @@ -2969,6 +3021,45 @@ set_tx_pkt_split(const char *name) printf("unknown value: \"%s\"\n", name); } +int +parse_fec_mode(const char *name, uint32_t *mode) +{ + uint8_t i; + + for (i = 0; i < RTE_DIM(fec_mode_name); i++) { + if (strcmp(fec_mode_name[i].name, name) == 0) { + *mode = RTE_ETH_FEC_MODE_TO_CAPA(fec_mode_name[i].mode); + return 0; + } + } + return -1; +} + +void +show_fec_capability(uint32_t num, struct rte_eth_fec_capa *speed_fec_capa) +{ + uint32_t i, j, k; + + printf("FEC capabilities:\n"); + + for (i = 0; i < num; i++) { + for (j = 0; j < RTE_DIM(eth_speed_name); j++) { + if (eth_speed_name[j].speed == + speed_fec_capa[i].speed) { + printf("%s : ", eth_speed_name[j].name); + break; + } + } + + for (k = RTE_ETH_FEC_AUTO; k < RTE_DIM(fec_mode_name); k++) { + if (RTE_ETH_FEC_MODE_TO_CAPA(k) & + speed_fec_capa[i].capa) + printf("%s ", fec_mode_name[k].name); + } + printf("\n"); + } +} + void show_tx_pkt_segments(void) { diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h index f139fe7..85ea030 100644 --- a/app/test-pmd/testpmd.h +++ b/app/test-pmd/testpmd.h @@ -804,6 +804,8 @@ void show_tx_pkt_segments(void); void set_tx_pkt_times(unsigned int *tx_times); void show_tx_pkt_times(void); void set_tx_pkt_split(const char *name); +int parse_fec_mode(const char *name, enum rte_eth_fec_mode *mode); +void show_fec_capability(uint32_t num, struct rte_eth_fec_capa *speed_fec_capa); void set_nb_pkt_per_burst(uint16_t pkt_burst); char *list_pkt_forwarding_modes(void); char *list_pkt_forwarding_retry_modes(void); From patchwork Thu Sep 24 13:05:45 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "humin (Q)" X-Patchwork-Id: 78750 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 16F8EA04B1; Thu, 24 Sep 2020 15:09:03 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 8F8BD1DFE6; Thu, 24 Sep 2020 15:08:32 +0200 (CEST) Received: from huawei.com (szxga05-in.huawei.com [45.249.212.191]) by dpdk.org (Postfix) with ESMTP id 3807F1DE39 for ; Thu, 24 Sep 2020 15:08:25 +0200 (CEST) Received: from DGGEMS404-HUB.china.huawei.com (unknown [172.30.72.60]) by Forcepoint Email with ESMTP id B5061979CD6C458ADD0E; Thu, 24 Sep 2020 21:08:22 +0800 (CST) Received: from localhost.localdomain (10.69.192.56) by DGGEMS404-HUB.china.huawei.com (10.3.19.204) with Microsoft SMTP Server id 14.3.487.0; Thu, 24 Sep 2020 21:08:15 +0800 From: "Min Hu (Connor)" To: CC: , , , , Date: Thu, 24 Sep 2020 21:05:45 +0800 Message-ID: <1600952745-55993-5-git-send-email-humin29@huawei.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1600952745-55993-1-git-send-email-humin29@huawei.com> References: <1599534347-20430-1-git-send-email-humin29@huawei.com> <1600952745-55993-1-git-send-email-humin29@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.69.192.56] X-CFilter-Loop: Reflected Subject: [dpdk-dev] [PATCH V12 4/4] doc: add FEC API and PMD information 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" Added the FEC API, and hns3 FEC PMD information in release 20.11.rst file. Signed-off-by: Min Hu (Connor) Reviewed-by: Wei Hu (Xavier) Reviewed-by: Chengwen Feng Reviewed-by: Chengchang Tang --- doc/guides/rel_notes/release_20_11.rst | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/doc/guides/rel_notes/release_20_11.rst b/doc/guides/rel_notes/release_20_11.rst index c6642f5..de2c8e4 100644 --- a/doc/guides/rel_notes/release_20_11.rst +++ b/doc/guides/rel_notes/release_20_11.rst @@ -78,6 +78,15 @@ New Features ``--portmask=N`` where N represents the hexadecimal bitmask of ports used. +* **Added the FEC API, for a generic FEC query and config.** + + Added the FEC API which provides functions for query FEC capabilities and + current FEC mode from device. Also, API for configuring FEC mode is also provided. + +* **Added hns3 FEC PMD, for supporting query and config FEC mode.** + + Added the FEC PMD which provides functions for query FEC capabilities and + current FEC mode from device. Also, PMD for configuring FEC mode is also provided. Removed Items -------------