patches for DPDK stable branches
 help / color / mirror / Atom feed
* [PATCH 21.11 0/2] net/hns3: backport FEC capability patch to 21.11
@ 2023-07-28  4:18 Jie Hai
  2023-07-28  4:18 ` [PATCH 21.11 1/2] net/hns3: fix missing FEC capability Jie Hai
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Jie Hai @ 2023-07-28  4:18 UTC (permalink / raw)
  To: stable, ktraynor

Backport this patchset to dpdk 21.11.

Jie Hai (2):
  net/hns3: fix missing FEC capability
  net/hns3: get FEC capability from firmware

 drivers/net/hns3/hns3_cmd.h    |   9 +-
 drivers/net/hns3/hns3_ethdev.c | 158 +++++++++++++++------------------
 drivers/net/hns3/hns3_ethdev.h |   2 +
 3 files changed, 83 insertions(+), 86 deletions(-)

-- 
2.33.0


^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH 21.11 1/2] net/hns3: fix missing FEC capability
  2023-07-28  4:18 [PATCH 21.11 0/2] net/hns3: backport FEC capability patch to 21.11 Jie Hai
@ 2023-07-28  4:18 ` Jie Hai
  2023-07-28  4:18 ` [PATCH 21.11 2/2] net/hns3: get FEC capability from firmware Jie Hai
  2023-07-31  9:13 ` [PATCH 21.11 0/2] net/hns3: backport FEC capability patch to 21.11 Kevin Traynor
  2 siblings, 0 replies; 4+ messages in thread
From: Jie Hai @ 2023-07-28  4:18 UTC (permalink / raw)
  To: stable, ktraynor, Min Hu (Connor),
	Yisen Zhuang, Lijun Ou, Wei Hu (Xavier),
	Chengchang Tang, Chengwen Feng

[ upstream commit 062242821503aae6e02fed47f10652b852c8f01e ]

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")

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 3fe6ed7f91a2..2afc0d0a9d36 100644
--- a/drivers/net/hns3/hns3_ethdev.c
+++ b/drivers/net/hns3/hns3_ethdev.c
@@ -62,6 +62,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) |
@@ -5955,56 +5962,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
@@ -6013,28 +5991,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)
 {
@@ -6172,52 +6150,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.33.0


^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH 21.11 2/2] net/hns3: get FEC capability from firmware
  2023-07-28  4:18 [PATCH 21.11 0/2] net/hns3: backport FEC capability patch to 21.11 Jie Hai
  2023-07-28  4:18 ` [PATCH 21.11 1/2] net/hns3: fix missing FEC capability Jie Hai
@ 2023-07-28  4:18 ` Jie Hai
  2023-07-31  9:13 ` [PATCH 21.11 0/2] net/hns3: backport FEC capability patch to 21.11 Kevin Traynor
  2 siblings, 0 replies; 4+ messages in thread
From: Jie Hai @ 2023-07-28  4:18 UTC (permalink / raw)
  To: stable, ktraynor, Min Hu (Connor), Yisen Zhuang, Lijun Ou

[ upstream commit cd41a2715457aa65f234b08e81c2246be24274f2 ]

Obtain the supported FEC capability from the firmware to
enhance code compatibility.

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, 38 insertions(+), 2 deletions(-)

diff --git a/drivers/net/hns3/hns3_cmd.h b/drivers/net/hns3/hns3_cmd.h
index ebe1a657d64d..79b902360235 100644
--- a/drivers/net/hns3/hns3_cmd.h
+++ b/drivers/net/hns3/hns3_cmd.h
@@ -785,6 +785,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)
+
 struct hns3_sfp_info_cmd {
 	uint32_t sfp_speed;
 	uint8_t query_type; /* 0: sfp speed, 1: active */
@@ -794,7 +800,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 rsv1[8];
+	uint8_t fec_ability; /* supported fec modes, see HNS3_FIBER_FEC_XXX_BIT */
+	uint8_t rsv1[7];
 };
 
 #define HNS3_MAC_CFG_FEC_AUTO_EN_B	0
diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c
index 2afc0d0a9d36..ed85caa7bd55 100644
--- a/drivers/net/hns3/hns3_ethdev.c
+++ b/drivers/net/hns3/hns3_ethdev.c
@@ -4058,6 +4058,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;
 	} else {
 		mac_info->query_type = HNS3_DEFAULT_QUERY;
 	}
@@ -4140,7 +4141,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;
 		return 0;
 	}
 
@@ -6149,11 +6150,37 @@ 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_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 ff666c4979c7..3496be6f7374 100644
--- a/drivers/net/hns3/hns3_ethdev.h
+++ b/drivers/net/hns3/hns3_ethdev.h
@@ -216,6 +216,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.33.0


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH 21.11 0/2] net/hns3: backport FEC capability patch to 21.11
  2023-07-28  4:18 [PATCH 21.11 0/2] net/hns3: backport FEC capability patch to 21.11 Jie Hai
  2023-07-28  4:18 ` [PATCH 21.11 1/2] net/hns3: fix missing FEC capability Jie Hai
  2023-07-28  4:18 ` [PATCH 21.11 2/2] net/hns3: get FEC capability from firmware Jie Hai
@ 2023-07-31  9:13 ` Kevin Traynor
  2 siblings, 0 replies; 4+ messages in thread
From: Kevin Traynor @ 2023-07-31  9:13 UTC (permalink / raw)
  To: Jie Hai, stable

On 28/07/2023 05:18, Jie Hai wrote:
> Backport this patchset to dpdk 21.11.
> 
> Jie Hai (2):
>    net/hns3: fix missing FEC capability
>    net/hns3: get FEC capability from firmware
> 
>   drivers/net/hns3/hns3_cmd.h    |   9 +-
>   drivers/net/hns3/hns3_ethdev.c | 158 +++++++++++++++------------------
>   drivers/net/hns3/hns3_ethdev.h |   2 +
>   3 files changed, 83 insertions(+), 86 deletions(-)
> 

Thanks for rebasing these patches. Applied locally. Will push to 21.11 
branch after checking with CI.

Kevin.


^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2023-07-31  9:14 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-07-28  4:18 [PATCH 21.11 0/2] net/hns3: backport FEC capability patch to 21.11 Jie Hai
2023-07-28  4:18 ` [PATCH 21.11 1/2] net/hns3: fix missing FEC capability Jie Hai
2023-07-28  4:18 ` [PATCH 21.11 2/2] net/hns3: get FEC capability from firmware Jie Hai
2023-07-31  9:13 ` [PATCH 21.11 0/2] net/hns3: backport FEC capability patch to 21.11 Kevin Traynor

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).