From 3c37f75e18dd07b9fa4def615e604b9835f3a3b4 Mon Sep 17 00:00:00 2001 From: chenjiji09 Date: Fri, 2 Jun 2023 10:59:31 +0800 Subject: [PATCH] net/hns3: add LLRS FEC mode support for 200G ports Sync some patchs from upstreaming about FEC feature. Patchs are as follow: - net/hns3: fix FEC mode for 200G ports - net/hns3: fix FEC mode check error - net/hns3: fix missing FEC capability - ethdev: introduce low latency RS FEC - app/testpmd: add setting and querying of LLRS FEC mode - net/hns3: add LLRS FEC mode support for 200G ports - net/hns3: get current FEC capability from firmware (cherry picked from commit 9266c3e618cf38cde9cd630c88a1a571064f825f) --- ...net-hns3-fix-FEC-mode-for-200G-ports.patch | 36 +++ 0294-net-hns3-fix-FEC-mode-check-error.patch | 108 +++++++++ ...-net-hns3-fix-missing-FEC-capability.patch | 222 ++++++++++++++++++ ...-ethdev-introduce-low-latency-RS-FEC.patch | 33 +++ ...setting-and-querying-of-LLRS-FEC-mod.patch | 72 ++++++ ...LLRS-FEC-mode-support-for-200G-ports.patch | 111 +++++++++ ...current-FEC-capability-from-firmware.patch | 122 ++++++++++ dpdk.spec | 20 +- 8 files changed, 723 insertions(+), 1 deletion(-) create mode 100644 0293-net-hns3-fix-FEC-mode-for-200G-ports.patch create mode 100644 0294-net-hns3-fix-FEC-mode-check-error.patch create mode 100644 0295-net-hns3-fix-missing-FEC-capability.patch create mode 100644 0296-ethdev-introduce-low-latency-RS-FEC.patch create mode 100644 0297-app-testpmd-add-setting-and-querying-of-LLRS-FEC-mod.patch create mode 100644 0298-net-hns3-add-LLRS-FEC-mode-support-for-200G-ports.patch create mode 100644 0299-net-hns3-get-current-FEC-capability-from-firmware.patch diff --git a/0293-net-hns3-fix-FEC-mode-for-200G-ports.patch b/0293-net-hns3-fix-FEC-mode-for-200G-ports.patch new file mode 100644 index 0000000..57c720c --- /dev/null +++ b/0293-net-hns3-fix-FEC-mode-for-200G-ports.patch @@ -0,0 +1,36 @@ +From 6c8780bfc15e2a039dca70e615a3568032ebcf21 Mon Sep 17 00:00:00 2001 +From: Jie Hai +Date: Sat, 8 Apr 2023 10:27:33 +0800 +Subject: net/hns3: fix FEC mode for 200G ports + +[ upstream commit 0ed9d6d08faf83dcaef02dc22edff2ee0f18c41a ] + +The hardware does not support NOFEC for 200G ports. So delete this +bit. + +Fixes: 9bf2ea8dbc65 ("net/hns3: support FEC") +Cc: stable@dpdk.org + +Signed-off-by: Jie Hai +Signed-off-by: Dongdong Liu +--- + drivers/net/hns3/hns3_ethdev.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c +index 2fb9e68039..06d4752ab1 100644 +--- a/drivers/net/hns3/hns3_ethdev.c ++++ b/drivers/net/hns3/hns3_ethdev.c +@@ -83,8 +83,7 @@ static const struct rte_eth_fec_capa speed_fec_capa_tbl[] = { + RTE_ETH_FEC_MODE_CAPA_MASK(AUTO) | + RTE_ETH_FEC_MODE_CAPA_MASK(RS) }, + +- { RTE_ETH_SPEED_NUM_200G, RTE_ETH_FEC_MODE_CAPA_MASK(NOFEC) | +- RTE_ETH_FEC_MODE_CAPA_MASK(AUTO) | ++ { RTE_ETH_SPEED_NUM_200G, RTE_ETH_FEC_MODE_CAPA_MASK(AUTO) | + RTE_ETH_FEC_MODE_CAPA_MASK(RS) } + }; + +-- +2.23.0 + diff --git a/0294-net-hns3-fix-FEC-mode-check-error.patch b/0294-net-hns3-fix-FEC-mode-check-error.patch new file mode 100644 index 0000000..8249486 --- /dev/null +++ b/0294-net-hns3-fix-FEC-mode-check-error.patch @@ -0,0 +1,108 @@ +From be516a78df6de13d6e87aaae19dad374819fca19 Mon Sep 17 00:00:00 2001 +From: Jie Hai +Date: Sat, 8 Apr 2023 10:27:34 +0800 +Subject: net/hns3: fix FEC mode check error + +[ upstream commit 5aba4e41d02222c5cf414b48876cff829f0b6a6f ] + +The function is_fec_mode_one_bit_set() is used to check whether +the binary of the mode from user only contains one '1'. But it +uses the bytes number this mode variable occupied to calculate +the count. So this patch uses __builtin_popcount() to replace it. + +This patch also extracts the code for verifying mode parameter into +a function. + +Fixes: 9bf2ea8dbc65 ("net/hns3: support FEC") +Cc: stable@dpdk.org + +Signed-off-by: Jie Hai +Signed-off-by: Dongdong Liu +--- + drivers/net/hns3/hns3_ethdev.c | 50 ++++++++++++++++------------------ + 1 file changed, 24 insertions(+), 26 deletions(-) + +diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c +index 06d4752ab1..74e785c0cf 100644 +--- a/drivers/net/hns3/hns3_ethdev.c ++++ b/drivers/net/hns3/hns3_ethdev.c +@@ -6139,52 +6139,50 @@ get_current_speed_fec_cap(struct hns3_hw *hw, struct rte_eth_fec_capa *fec_capa) + 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) ++hns3_fec_mode_valid(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; ++ uint32_t cur_capa; + int ret; + +- ret = hns3_fec_get_capability(dev, fec_capa, num); +- if (ret < 0) +- return ret; +- +- /* HNS3 PMD 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); ++ if (__builtin_popcount(mode) != 1) { ++ hns3_err(hw, "FEC mode(0x%x) should be only one bit set", mode); + return -EINVAL; + } + ++ ret = hns3_fec_get_capability(dev, fec_capa, num); ++ if (ret < 0) ++ return ret; + /* + * 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); ++ if ((cur_capa & mode) == 0) { ++ hns3_err(hw, "unsupported FEC mode(0x%x)", mode); + return -EINVAL; + } + ++ return 0; ++} ++ ++static int ++hns3_fec_set(struct rte_eth_dev *dev, uint32_t mode) ++{ ++ 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_mode_valid(dev, mode); ++ if (ret != 0) ++ return ret; ++ + rte_spinlock_lock(&hw->lock); + ret = hns3_set_fec_hw(hw, mode); + if (ret) { +-- +2.23.0 + diff --git a/0295-net-hns3-fix-missing-FEC-capability.patch b/0295-net-hns3-fix-missing-FEC-capability.patch new file mode 100644 index 0000000..7e8e303 --- /dev/null +++ b/0295-net-hns3-fix-missing-FEC-capability.patch @@ -0,0 +1,222 @@ +From 19c77a23c28779fdbaca1e477749bcb3a9c3ecdd Mon Sep 17 00:00:00 2001 +From: Jie Hai +Date: Sat, 8 Apr 2023 10:27:35 +0800 +Subject: net/hns3: fix missing FEC capability + +[ upstream commit f611c42363f434d62500b7c7f4b7ecaa46774bdd ] + +Currently, FEC capabilities are reported based on the device ID. +And a device ID is bound to only one or two rates. So some cases +hns3 driver only reports the FEC capabilities corresponding to +the rate. But hns3 supports speed switching function, which causes +the FEC capabilities of other rates are not reported. So this patch +reports the FEC capabilities by the speed capabilities of the +network port. + +Fixes: 9bf2ea8dbc65 ("net/hns3: support FEC") +Cc: stable@dpdk.org + +Signed-off-by: Jie Hai +Signed-off-by: Dongdong Liu +--- + drivers/net/hns3/hns3_ethdev.c | 129 ++++++++++++--------------------- + 1 file changed, 45 insertions(+), 84 deletions(-) + +diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c +index 74e785c0cf..05d489a12b 100644 +--- a/drivers/net/hns3/hns3_ethdev.c ++++ b/drivers/net/hns3/hns3_ethdev.c +@@ -60,6 +60,13 @@ enum hns3_evt_cause { + HNS3_VECTOR0_EVENT_OTHER, + }; + ++#define HNS3_SPEEDS_SUPP_FEC (RTE_ETH_LINK_SPEED_10G | \ ++ RTE_ETH_LINK_SPEED_25G | \ ++ RTE_ETH_LINK_SPEED_40G | \ ++ RTE_ETH_LINK_SPEED_50G | \ ++ RTE_ETH_LINK_SPEED_100G | \ ++ RTE_ETH_LINK_SPEED_200G) ++ + static const struct rte_eth_fec_capa speed_fec_capa_tbl[] = { + { RTE_ETH_SPEED_NUM_10G, RTE_ETH_FEC_MODE_CAPA_MASK(NOFEC) | + RTE_ETH_FEC_MODE_CAPA_MASK(AUTO) | +@@ -5900,56 +5907,27 @@ hns3_reset_service(void *param) + hns3_msix_process(hns, reset_level); + } + +-static unsigned int +-hns3_get_speed_capa_num(uint16_t device_id) ++static uint32_t ++hns3_get_speed_fec_capa(struct rte_eth_fec_capa *speed_fec_capa, ++ uint32_t speed_capa) + { +- unsigned int 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; +- } ++ uint32_t speed_bit; ++ uint32_t num = 0; ++ uint32_t i; + +- return num; +-} ++ for (i = 0; i < RTE_DIM(speed_fec_capa_tbl); i++) { ++ speed_bit = ++ rte_eth_speed_bitflag(speed_fec_capa_tbl[i].speed, ++ RTE_ETH_LINK_FULL_DUPLEX); ++ if ((speed_capa & speed_bit) == 0) ++ continue; + +-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; ++ speed_fec_capa[num].speed = speed_fec_capa_tbl[i].speed; ++ speed_fec_capa[num].capa = speed_fec_capa_tbl[i].capa; ++ num++; + } + +- return 0; ++ return num; + } + + static int +@@ -5958,28 +5936,28 @@ hns3_fec_get_capability(struct rte_eth_dev *dev, + unsigned int num) + { + 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; +- unsigned int capa_num; +- int ret; ++ unsigned int speed_num; ++ uint32_t speed_capa; + +- 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); ++ speed_capa = hns3_get_speed_capa(hw); ++ /* speed_num counts number of speed capabilities */ ++ speed_num = __builtin_popcount(speed_capa & HNS3_SPEEDS_SUPP_FEC); ++ if (speed_num == 0) + return -ENOTSUP; +- } + +- if (speed_fec_capa == NULL || num < capa_num) +- return capa_num; ++ if (speed_fec_capa == NULL) ++ return speed_num; + +- ret = hns3_get_speed_fec_capa(speed_fec_capa, device_id); +- if (ret) +- return -ENOTSUP; ++ if (num < speed_num) { ++ hns3_err(hw, "not enough array size(%u) to store FEC capabilities, should not be less than %u", ++ num, speed_num); ++ return -EINVAL; ++ } + +- return capa_num; ++ return hns3_get_speed_fec_capa(speed_fec_capa, speed_capa); + } + ++ + static int + get_current_fec_auto_state(struct hns3_hw *hw, uint8_t *state) + { +@@ -6117,52 +6095,35 @@ hns3_set_fec_hw(struct hns3_hw *hw, uint32_t mode) + } + + static uint32_t +-get_current_speed_fec_cap(struct hns3_hw *hw, struct rte_eth_fec_capa *fec_capa) ++hns3_get_current_speed_fec_cap(struct hns3_mac *mac) + { +- struct hns3_mac *mac = &hw->mac; +- uint32_t cur_capa; ++ uint32_t i; + +- switch (mac->link_speed) { +- case RTE_ETH_SPEED_NUM_10G: +- cur_capa = fec_capa[1].capa; +- break; +- case RTE_ETH_SPEED_NUM_25G: +- case RTE_ETH_SPEED_NUM_100G: +- case RTE_ETH_SPEED_NUM_200G: +- cur_capa = fec_capa[0].capa; +- break; +- default: +- cur_capa = 0; +- break; ++ for (i = 0; i < RTE_DIM(speed_fec_capa_tbl); i++) { ++ if (mac->link_speed == speed_fec_capa_tbl[i].speed) ++ return speed_fec_capa_tbl[i].capa; + } + +- return cur_capa; ++ return 0; + } + + static int + hns3_fec_mode_valid(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 rte_eth_fec_capa fec_capa[FEC_CAPA_NUM]; +- uint32_t num = FEC_CAPA_NUM; + uint32_t cur_capa; +- int ret; + + if (__builtin_popcount(mode) != 1) { + hns3_err(hw, "FEC mode(0x%x) should be only one bit set", mode); + return -EINVAL; + } + +- ret = hns3_fec_get_capability(dev, fec_capa, num); +- if (ret < 0) +- return ret; + /* + * 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); ++ cur_capa = hns3_get_current_speed_fec_cap(&hw->mac); + if ((cur_capa & mode) == 0) { + hns3_err(hw, "unsupported FEC mode(0x%x)", mode); + return -EINVAL; +-- +2.23.0 + diff --git a/0296-ethdev-introduce-low-latency-RS-FEC.patch b/0296-ethdev-introduce-low-latency-RS-FEC.patch new file mode 100644 index 0000000..a396ccd --- /dev/null +++ b/0296-ethdev-introduce-low-latency-RS-FEC.patch @@ -0,0 +1,33 @@ +From 7b36a2f27f2dbe8cd518885461473349a2c04314 Mon Sep 17 00:00:00 2001 +From: Jie Hai +Date: Sat, 8 Apr 2023 10:27:36 +0800 +Subject: ethdev: introduce low latency RS FEC + +[ upstream commit 371c8ec7498f9ea41c84d5d1fe0ab7d44e1325b9 ] + +This patch introduces LLRS (low latency Reed Solomon FEC). +LLRS supports for 25 Gbps, 50 Gbps, 100 Gbps, 200 Gbps and +400 Gbps Ethernet networks. + +Signed-off-by: Jie Hai +Signed-off-by: Dongdong Liu +Acked-by: Ferruh Yigit +--- + lib/ethdev/rte_ethdev.h | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/lib/ethdev/rte_ethdev.h b/lib/ethdev/rte_ethdev.h +index 9df50c30b4..2064d439c8 100644 +--- a/lib/ethdev/rte_ethdev.h ++++ b/lib/ethdev/rte_ethdev.h +@@ -1973,6 +1973,7 @@ enum rte_eth_fec_mode { + RTE_ETH_FEC_AUTO, /**< FEC autonegotiation modes */ + RTE_ETH_FEC_BASER, /**< FEC using common algorithm */ + RTE_ETH_FEC_RS, /**< FEC using RS algorithm */ ++ RTE_ETH_FEC_LLRS, /**< FEC using LLRS algorithm */ + }; + + /* Translate from FEC mode to FEC capa */ +-- +2.23.0 + diff --git a/0297-app-testpmd-add-setting-and-querying-of-LLRS-FEC-mod.patch b/0297-app-testpmd-add-setting-and-querying-of-LLRS-FEC-mod.patch new file mode 100644 index 0000000..0d974e3 --- /dev/null +++ b/0297-app-testpmd-add-setting-and-querying-of-LLRS-FEC-mod.patch @@ -0,0 +1,72 @@ +From 8f50b71d99a1a071b62c3b36a11a95398fc863c3 Mon Sep 17 00:00:00 2001 +From: Jie Hai +Date: Sat, 8 Apr 2023 10:27:37 +0800 +Subject: app/testpmd: add setting and querying of LLRS FEC mode + +[ upstream commit 6cb1eaa6f2cd024a8c56e15e4a23ada7f9006aae ] + +This patch supports setting and querying of LLRS FEC mode. + +Signed-off-by: Jie Hai +Signed-off-by: Dongdong Liu +Acked-by: Aman Singh +--- + app/test-pmd/cmdline.c | 5 ++++- + app/test-pmd/config.c | 4 ++++ + doc/guides/testpmd_app_ug/testpmd_funcs.rst | 2 +- + 3 files changed, 9 insertions(+), 2 deletions(-) + +diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c +index 9e0e725913..0d9c7d449c 100644 +--- a/app/test-pmd/cmdline.c ++++ b/app/test-pmd/cmdline.c +@@ -17078,6 +17078,9 @@ cmd_show_fec_mode_parsed(void *parsed_result, + case RTE_ETH_FEC_MODE_CAPA_MASK(RS): + strlcpy(buf, "rs", sizeof(buf)); + break; ++ case RTE_ETH_FEC_MODE_CAPA_MASK(LLRS): ++ strlcpy(buf, "llrs", sizeof(buf)); ++ break; + default: + return; + } +@@ -17173,7 +17176,7 @@ cmd_set_port_fec_mode_parsed( + cmdline_parse_inst_t cmd_set_fec_mode = { + .f = cmd_set_port_fec_mode_parsed, + .data = NULL, +- .help_str = "set port fec_mode auto|off|rs|baser", ++ .help_str = "set port fec_mode auto|off|rs|baser|llrs", + .tokens = { + (void *)&cmd_set_port_fec_mode_set, + (void *)&cmd_set_port_fec_mode_port, +diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c +index 78af232a8a..22c63e214e 100644 +--- a/app/test-pmd/config.c ++++ b/app/test-pmd/config.c +@@ -167,6 +167,10 @@ static const struct { + .mode = RTE_ETH_FEC_RS, + .name = "rs", + }, ++ { ++ .mode = RTE_ETH_FEC_LLRS, ++ .name = "llrs", ++ }, + }; + + static void +diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst +index e0edd349bc..ecf89aa46c 100644 +--- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst ++++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst +@@ -1993,7 +1993,7 @@ Set fec mode + + Set fec mode for a specific port:: + +- testpmd> set port (port_id) fec_mode auto|off|rs|baser ++ testpmd> set port (port_id) fec_mode auto|off|rs|baser|llrs + + Config Sample actions list + ~~~~~~~~~~~~~~~~~~~~~~~~~~ +-- +2.23.0 + diff --git a/0298-net-hns3-add-LLRS-FEC-mode-support-for-200G-ports.patch b/0298-net-hns3-add-LLRS-FEC-mode-support-for-200G-ports.patch new file mode 100644 index 0000000..3fecbb1 --- /dev/null +++ b/0298-net-hns3-add-LLRS-FEC-mode-support-for-200G-ports.patch @@ -0,0 +1,111 @@ +From 85597c087e93576197c6e11d41caab7d8f43dbeb Mon Sep 17 00:00:00 2001 +From: Jie Hai +Date: Sat, 8 Apr 2023 10:27:38 +0800 +Subject: net/hns3: add LLRS FEC mode support for 200G ports + +[ upstream commit cddeaee10f974bda1202e82e36a3d8f09450e80a ] + +This patch supports the query and configuration of LLRS FEC mode. + +Signed-off-by: Jie Hai +Signed-off-by: Dongdong Liu +--- + drivers/net/hns3/hns3_cmd.c | 1 + + drivers/net/hns3/hns3_cmd.h | 2 ++ + drivers/net/hns3/hns3_ethdev.c | 21 ++++++++++++--------- + 3 files changed, 15 insertions(+), 9 deletions(-) + +diff --git a/drivers/net/hns3/hns3_cmd.c b/drivers/net/hns3/hns3_cmd.c +index d0a3853656..ca1d3f1b8c 100644 +--- a/drivers/net/hns3/hns3_cmd.c ++++ b/drivers/net/hns3/hns3_cmd.c +@@ -666,6 +666,7 @@ hns3_firmware_compat_config(struct hns3_hw *hw, bool is_init) + if (is_init) { + hns3_set_bit(compat, HNS3_LINK_EVENT_REPORT_EN_B, 1); + hns3_set_bit(compat, HNS3_NCSI_ERROR_REPORT_EN_B, 0); ++ hns3_set_bit(compat, HNS3_LLRS_FEC_EN_B, 1); + if (hns3_dev_get_support(hw, COPPER)) + hns3_set_bit(compat, HNS3_FIRMWARE_PHY_DRIVER_EN_B, 1); + if (hns3_dev_get_support(hw, FC_AUTO)) +diff --git a/drivers/net/hns3/hns3_cmd.h b/drivers/net/hns3/hns3_cmd.h +index d78c1b401e..929278521f 100644 +--- a/drivers/net/hns3/hns3_cmd.h ++++ b/drivers/net/hns3/hns3_cmd.h +@@ -668,6 +668,7 @@ enum hns3_promisc_type { + #define HNS3_NCSI_ERROR_REPORT_EN_B 1 + #define HNS3_FIRMWARE_PHY_DRIVER_EN_B 2 + ++#define HNS3_LLRS_FEC_EN_B 5 + #define HNS3_MAC_FC_AUTONEG_EN_B 6 + + struct hns3_firmware_compat_cmd { +@@ -825,6 +826,7 @@ struct hns3_sfp_info_cmd { + #define HNS3_MAC_FEC_OFF 0 + #define HNS3_MAC_FEC_BASER 1 + #define HNS3_MAC_FEC_RS 2 ++#define HNS3_MAC_FEC_LLRS 3 + + /* Configure FEC mode, opcode:0x031A */ + struct hns3_config_fec_cmd { +diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c +index 05d489a12b..2ca5e4ced5 100644 +--- a/drivers/net/hns3/hns3_ethdev.c ++++ b/drivers/net/hns3/hns3_ethdev.c +@@ -47,11 +47,6 @@ + #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, +@@ -91,7 +86,8 @@ static const struct rte_eth_fec_capa speed_fec_capa_tbl[] = { + RTE_ETH_FEC_MODE_CAPA_MASK(RS) }, + + { RTE_ETH_SPEED_NUM_200G, RTE_ETH_FEC_MODE_CAPA_MASK(AUTO) | +- RTE_ETH_FEC_MODE_CAPA_MASK(RS) } ++ RTE_ETH_FEC_MODE_CAPA_MASK(RS) | ++ RTE_ETH_FEC_MODE_CAPA_MASK(LLRS) } + }; + + static enum hns3_reset_level hns3_get_reset_level(struct hns3_adapter *hns, +@@ -6032,15 +6028,18 @@ hns3_fec_get_internal(struct hns3_hw *hw, uint32_t *fec_capa) + * to be converted. + */ + switch (resp->active_fec) { +- case HNS3_HW_FEC_MODE_NOFEC: ++ case HNS3_MAC_FEC_OFF: + tmp_fec_capa = RTE_ETH_FEC_MODE_CAPA_MASK(NOFEC); + break; +- case HNS3_HW_FEC_MODE_BASER: ++ case HNS3_MAC_FEC_BASER: + tmp_fec_capa = RTE_ETH_FEC_MODE_CAPA_MASK(BASER); + break; +- case HNS3_HW_FEC_MODE_RS: ++ case HNS3_MAC_FEC_RS: + tmp_fec_capa = RTE_ETH_FEC_MODE_CAPA_MASK(RS); + break; ++ case HNS3_MAC_FEC_LLRS: ++ tmp_fec_capa = RTE_ETH_FEC_MODE_CAPA_MASK(LLRS); ++ break; + default: + tmp_fec_capa = RTE_ETH_FEC_MODE_CAPA_MASK(NOFEC); + break; +@@ -6081,6 +6080,10 @@ hns3_set_fec_hw(struct hns3_hw *hw, uint32_t mode) + 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(LLRS): ++ hns3_set_field(req->fec_mode, HNS3_MAC_CFG_FEC_MODE_M, ++ HNS3_MAC_CFG_FEC_MODE_S, HNS3_MAC_FEC_LLRS); ++ break; + case RTE_ETH_FEC_MODE_CAPA_MASK(AUTO): + hns3_set_bit(req->fec_mode, HNS3_MAC_CFG_FEC_AUTO_EN_B, 1); + break; +-- +2.23.0 + diff --git a/0299-net-hns3-get-current-FEC-capability-from-firmware.patch b/0299-net-hns3-get-current-FEC-capability-from-firmware.patch new file mode 100644 index 0000000..b0baa4b --- /dev/null +++ b/0299-net-hns3-get-current-FEC-capability-from-firmware.patch @@ -0,0 +1,122 @@ +From 02fad185915874c196d03966947a5b705b9bdff4 Mon Sep 17 00:00:00 2001 +From: Jie Hai +Date: Sat, 8 Apr 2023 10:27:39 +0800 +Subject: net/hns3: get current FEC capability from firmware + +[ upstream commit 7a475771aeb1d4f74a6bfd03a68462eb85151738 ] + +Obtain the supported FEC capability from the firmware to +enhance code compatibility. + +Cc: stable@dpdk.org + +Signed-off-by: Jie Hai +Signed-off-by: Dongdong Liu +--- + drivers/net/hns3/hns3_cmd.h | 9 ++++++++- + drivers/net/hns3/hns3_ethdev.c | 29 +++++++++++++++++++++++++++++ + drivers/net/hns3/hns3_ethdev.h | 2 ++ + 3 files changed, 39 insertions(+), 1 deletion(-) + +diff --git a/drivers/net/hns3/hns3_cmd.h b/drivers/net/hns3/hns3_cmd.h +index 929278521f..3f2bb4fd29 100644 +--- a/drivers/net/hns3/hns3_cmd.h ++++ b/drivers/net/hns3/hns3_cmd.h +@@ -795,6 +795,12 @@ struct hns3_sfp_type { + #define HNS3_FIBER_LINK_SPEED_10M_BIT BIT(7) + #define HNS3_FIBER_LINK_SPEED_200G_BIT BIT(8) + ++#define HNS3_FIBER_FEC_AUTO_BIT BIT(0) ++#define HNS3_FIBER_FEC_BASER_BIT BIT(1) ++#define HNS3_FIBER_FEC_RS_BIT BIT(2) ++#define HNS3_FIBER_FEC_LLRS_BIT BIT(3) ++#define HNS3_FIBER_FEC_NOFEC_BIT BIT(4) ++ + /* Flags for pause status field */ + #define HNS3_FIBER_LOCAL_PAUSE_BIT BIT(0) + #define HNS3_FIBER_LOCAL_ASYM_PAUSE_BIT BIT(1) +@@ -815,7 +821,8 @@ struct hns3_sfp_info_cmd { + uint8_t autoneg_ability; + uint32_t supported_speed; /* speed supported by current media */ + uint32_t module_type; +- uint8_t rsv[2]; ++ uint8_t fec_ability; /* supported fec modes, see HNS3_FIBER_FEC_XXX_BIT */ ++ uint8_t rsv0; + uint8_t pause_status; + uint8_t rsv1[5]; + }; +diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c +index 2ca5e4ced5..d6214415b7 100644 +--- a/drivers/net/hns3/hns3_ethdev.c ++++ b/drivers/net/hns3/hns3_ethdev.c +@@ -4028,6 +4028,7 @@ hns3_get_sfp_info(struct hns3_hw *hw, struct hns3_mac *mac_info) + mac_info->support_autoneg = resp->autoneg_ability; + mac_info->link_autoneg = (resp->autoneg == 0) ? RTE_ETH_LINK_FIXED + : RTE_ETH_LINK_AUTONEG; ++ mac_info->fec_capa = resp->fec_ability; + local_pause = resp->pause_status & HNS3_FIBER_LOCAL_PAUSE_MASK; + lp_pause = (resp->pause_status & HNS3_FIBER_LP_PAUSE_MASK) >> + HNS3_FIBER_LP_PAUSE_S; +@@ -4117,6 +4118,7 @@ hns3_update_fiber_link_info(struct hns3_hw *hw) + mac->supported_speed = mac_info.supported_speed; + mac->support_autoneg = mac_info.support_autoneg; + mac->link_autoneg = mac_info.link_autoneg; ++ mac->fec_capa = mac_info.fec_capa; + mac->advertising = mac_info.advertising; + mac->lp_advertising = mac_info.lp_advertising; + +@@ -6097,11 +6099,38 @@ hns3_set_fec_hw(struct hns3_hw *hw, uint32_t mode) + return ret; + } + ++static uint32_t ++hns3_parse_hw_fec_capa(uint8_t hw_fec_capa) ++{ ++ const struct { ++ uint32_t hw_fec_capa; ++ uint32_t fec_capa; ++ } fec_capa_map[] = { ++ { HNS3_FIBER_FEC_AUTO_BIT, RTE_ETH_FEC_MODE_CAPA_MASK(AUTO) }, ++ { HNS3_FIBER_FEC_BASER_BIT, RTE_ETH_FEC_MODE_CAPA_MASK(BASER) }, ++ { HNS3_FIBER_FEC_RS_BIT, RTE_ETH_FEC_MODE_CAPA_MASK(RS) }, ++ { HNS3_FIBER_FEC_LLRS_BIT, RTE_ETH_FEC_MODE_CAPA_MASK(LLRS) }, ++ { HNS3_FIBER_FEC_NOFEC_BIT, RTE_ETH_FEC_MODE_CAPA_MASK(NOFEC) }, ++ }; ++ uint32_t capa = 0; ++ uint32_t i; ++ ++ for (i = 0; i < RTE_DIM(fec_capa_map); i++) { ++ if ((hw_fec_capa & fec_capa_map[i].hw_fec_capa) != 0) ++ capa |= fec_capa_map[i].fec_capa; ++ } ++ ++ return capa; ++} ++ + static uint32_t + hns3_get_current_speed_fec_cap(struct hns3_mac *mac) + { + uint32_t i; + ++ if (mac->fec_capa != 0) ++ return hns3_parse_hw_fec_capa(mac->fec_capa); ++ + for (i = 0; i < RTE_DIM(speed_fec_capa_tbl); i++) { + if (mac->link_speed == speed_fec_capa_tbl[i].speed) + return speed_fec_capa_tbl[i].capa; +diff --git a/drivers/net/hns3/hns3_ethdev.h b/drivers/net/hns3/hns3_ethdev.h +index 88146f5054..c04edf622f 100644 +--- a/drivers/net/hns3/hns3_ethdev.h ++++ b/drivers/net/hns3/hns3_ethdev.h +@@ -214,6 +214,8 @@ struct hns3_mac { + uint32_t advertising; /* advertised capability in the local part */ + uint32_t lp_advertising; /* advertised capability in the link partner */ + uint8_t support_autoneg; ++ /* current supported fec modes. see HNS3_FIBER_FEC_XXX_BIT */ ++ uint32_t fec_capa; + }; + + struct hns3_fake_queue_data { +-- +2.23.0 + diff --git a/dpdk.spec b/dpdk.spec index 1622f11..24d6d4c 100644 --- a/dpdk.spec +++ b/dpdk.spec @@ -1,6 +1,6 @@ Name: dpdk Version: 21.11 -Release: 44 +Release: 45 Packager: packaging@6wind.com URL: http://dpdk.org %global source_version 21.11 @@ -311,6 +311,13 @@ Patch9289: 0289-net-hns3-add-flow-control-autoneg-for-fiber-port.patch Patch9290: 0290-net-hns3-fix-variable-type-mismatch.patch Patch9291: 0291-net-hns3-fix-Rx-multiple-firmware-reset-interrupts.patch Patch9292: 0292-net-hns3-add-Tx-Rx-descriptor-logs.patch +Patch9293: 0293-net-hns3-fix-FEC-mode-for-200G-ports.patch +Patch9294: 0294-net-hns3-fix-FEC-mode-check-error.patch +Patch9295: 0295-net-hns3-fix-missing-FEC-capability.patch +Patch9296: 0296-ethdev-introduce-low-latency-RS-FEC.patch +Patch9297: 0297-app-testpmd-add-setting-and-querying-of-LLRS-FEC-mod.patch +Patch9298: 0298-net-hns3-add-LLRS-FEC-mode-support-for-200G-ports.patch +Patch9299: 0299-net-hns3-get-current-FEC-capability-from-firmware.patch Summary: Data Plane Development Kit core Group: System Environment/Libraries @@ -455,6 +462,17 @@ strip -g $RPM_BUILD_ROOT/lib/modules/%{kern_devel_ver}/extra/dpdk/igb_uio.ko /usr/sbin/depmod %changelog +* Fri Jun 02 2023 chenjiji - 21.11-45 + Sync some patchs from upstreaming about FEC feature. Patchs + are as follow: + - net/hns3: fix FEC mode for 200G ports + - net/hns3: fix FEC mode check error + - net/hns3: fix missing FEC capability + - ethdev: introduce low latency RS FEC + - app/testpmd: add setting and querying of LLRS FEC mode + - net/hns3: add LLRS FEC mode support for 200G ports + - net/hns3: get current FEC capability from firmware + * Sat May 27 2023 jiangheng - 21.11-44 - examples use static libraries to avoid unlinked dynamic libraries