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)
This commit is contained in:
chenjiji09 2023-06-02 10:59:31 +08:00 committed by openeuler-sync-bot
parent 28c3f01148
commit 3c37f75e18
8 changed files with 723 additions and 1 deletions

View File

@ -0,0 +1,36 @@
From 6c8780bfc15e2a039dca70e615a3568032ebcf21 Mon Sep 17 00:00:00 2001
From: Jie Hai <haijie1@huawei.com>
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 <haijie1@huawei.com>
Signed-off-by: Dongdong Liu <liudongdong3@huawei.com>
---
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

View File

@ -0,0 +1,108 @@
From be516a78df6de13d6e87aaae19dad374819fca19 Mon Sep 17 00:00:00 2001
From: Jie Hai <haijie1@huawei.com>
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 <haijie1@huawei.com>
Signed-off-by: Dongdong Liu <liudongdong3@huawei.com>
---
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

View File

@ -0,0 +1,222 @@
From 19c77a23c28779fdbaca1e477749bcb3a9c3ecdd Mon Sep 17 00:00:00 2001
From: Jie Hai <haijie1@huawei.com>
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 <haijie1@huawei.com>
Signed-off-by: Dongdong Liu <liudongdong3@huawei.com>
---
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

View File

@ -0,0 +1,33 @@
From 7b36a2f27f2dbe8cd518885461473349a2c04314 Mon Sep 17 00:00:00 2001
From: Jie Hai <haijie1@huawei.com>
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 <haijie1@huawei.com>
Signed-off-by: Dongdong Liu <liudongdong3@huawei.com>
Acked-by: Ferruh Yigit <ferruh.yigit@amd.com>
---
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

View File

@ -0,0 +1,72 @@
From 8f50b71d99a1a071b62c3b36a11a95398fc863c3 Mon Sep 17 00:00:00 2001
From: Jie Hai <haijie1@huawei.com>
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 <haijie1@huawei.com>
Signed-off-by: Dongdong Liu <liudongdong3@huawei.com>
Acked-by: Aman Singh <aman.deep.singh@intel.com>
---
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 <port_id> fec_mode auto|off|rs|baser",
+ .help_str = "set port <port_id> 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

View File

@ -0,0 +1,111 @@
From 85597c087e93576197c6e11d41caab7d8f43dbeb Mon Sep 17 00:00:00 2001
From: Jie Hai <haijie1@huawei.com>
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 <haijie1@huawei.com>
Signed-off-by: Dongdong Liu <liudongdong3@huawei.com>
---
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

View File

@ -0,0 +1,122 @@
From 02fad185915874c196d03966947a5b705b9bdff4 Mon Sep 17 00:00:00 2001
From: Jie Hai <haijie1@huawei.com>
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 <haijie1@huawei.com>
Signed-off-by: Dongdong Liu <liudongdong3@huawei.com>
---
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

View File

@ -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 <chenjiji09@163.com> - 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 <jiangheng14@huawei.com> - 21.11-44
- examples use static libraries to avoid unlinked dynamic libraries