patch 'net/ngbe: fix link status in no LSC mode' has been queued to stable release 22.11.3

Xueming Li xuemingl at nvidia.com
Thu Aug 10 01:47:51 CEST 2023


Hi,

FYI, your patch has been queued to stable release 22.11.3

Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet.
It will be pushed if I get no objections before 08/11/23. So please
shout if anyone has objections.

Also note that after the patch there's a diff of the upstream commit vs the
patch applied to the branch. This will indicate if there was any rebasing
needed to apply to the stable branch. If there were code changes for rebasing
(ie: not only metadata diffs), please double check that the rebase was
correctly done.

Queued patches are on a temporary branch at:
https://git.dpdk.org/dpdk-stable/log/?h=22.11-staging

This queued commit can be viewed at:
https://git.dpdk.org/dpdk-stable/commit/?h=22.11-staging&id=e66f9e3fdfd22a69c9443fc7bf8b613ff0c46cb5

Thanks.

Xueming Li <xuemingl at nvidia.com>

---
>From e66f9e3fdfd22a69c9443fc7bf8b613ff0c46cb5 Mon Sep 17 00:00:00 2001
From: Jiawen Wu <jiawenwu at trustnetic.com>
Date: Wed, 14 Jun 2023 10:34:28 +0800
Subject: [PATCH] net/ngbe: fix link status in no LSC mode
Cc: Xueming Li <xuemingl at nvidia.com>

[ upstream commit 21f702d556fabbc50e5e8d43c7ad3dfbe9dac1bd ]

When using no LSC mode, device link status is sometimes get incorrectly.
Introduce hw->lsc to fix this issue.

Fixes: 3d0af7066759 ("net/ngbe: setup PHY link")
Fixes: 3518df5774c7 ("net/ngbe: support device start/stop")

Signed-off-by: Jiawen Wu <jiawenwu at trustnetic.com>
---
 drivers/net/ngbe/base/ngbe_hw.c      | 10 +++++++---
 drivers/net/ngbe/base/ngbe_phy_rtl.c | 20 ++++++++++++++++++++
 drivers/net/ngbe/base/ngbe_phy_rtl.h |  2 ++
 drivers/net/ngbe/base/ngbe_phy_yt.c  | 16 +++++++++-------
 drivers/net/ngbe/base/ngbe_type.h    |  1 +
 drivers/net/ngbe/ngbe_ethdev.c       |  2 ++
 6 files changed, 41 insertions(+), 10 deletions(-)

diff --git a/drivers/net/ngbe/base/ngbe_hw.c b/drivers/net/ngbe/base/ngbe_hw.c
index 283cdca367..27243d85c8 100644
--- a/drivers/net/ngbe/base/ngbe_hw.c
+++ b/drivers/net/ngbe/base/ngbe_hw.c
@@ -1541,11 +1541,15 @@ s32 ngbe_clear_vfta(struct ngbe_hw *hw)
 s32 ngbe_check_mac_link_em(struct ngbe_hw *hw, u32 *speed,
 			bool *link_up, bool link_up_wait_to_complete)
 {
-	u32 i, reg;
+	u32 i;
 	s32 status = 0;
 
-	reg = rd32(hw, NGBE_GPIOINTSTAT);
-	wr32(hw, NGBE_GPIOEOI, reg);
+	if (hw->lsc) {
+		u32 reg;
+
+		reg = rd32(hw, NGBE_GPIOINTSTAT);
+		wr32(hw, NGBE_GPIOEOI, reg);
+	}
 
 	if (link_up_wait_to_complete) {
 		for (i = 0; i < hw->mac.max_link_up_time; i++) {
diff --git a/drivers/net/ngbe/base/ngbe_phy_rtl.c b/drivers/net/ngbe/base/ngbe_phy_rtl.c
index 88bacec114..b0eb6c97c0 100644
--- a/drivers/net/ngbe/base/ngbe_phy_rtl.c
+++ b/drivers/net/ngbe/base/ngbe_phy_rtl.c
@@ -392,6 +392,26 @@ s32 ngbe_check_phy_link_rtl(struct ngbe_hw *hw, u32 *speed, bool *link_up)
 			*speed = NGBE_LINK_SPEED_10M_FULL;
 	}
 
+	if (hw->lsc)
+		return status;
+
+	/*
+	 * Because of the slow speed of getting link state, RTL_PHYSR
+	 * may still be up while the actual link state is down.
+	 * So we read RTL_GBSR to get accurate state when speed is 1G
+	 * in polling mode.
+	 */
+	if (*speed == NGBE_LINK_SPEED_1GB_FULL) {
+		status = hw->phy.read_reg(hw, RTL_GBSR,
+				RTL_DEV_ZERO, &phy_data);
+		phy_link = phy_data & RTL_GBSR_LRS;
+
+		/* Only need to detect link down */
+		if (!phy_link) {
+			*link_up = false;
+			*speed = NGBE_LINK_SPEED_UNKNOWN;
+		}
+	}
 	return status;
 }
 
diff --git a/drivers/net/ngbe/base/ngbe_phy_rtl.h b/drivers/net/ngbe/base/ngbe_phy_rtl.h
index b2fbc4f74d..6093ee7d5c 100644
--- a/drivers/net/ngbe/base/ngbe_phy_rtl.h
+++ b/drivers/net/ngbe/base/ngbe_phy_rtl.h
@@ -35,6 +35,8 @@
 #define   RTL_ANLPAR_LP			MS16(10, 0x3)
 #define RTL_GBCR			0x9
 #define   RTL_GBCR_1000F		MS16(9, 0x1)
+#define RTL_GBSR			0xA
+#define   RTL_GBSR_LRS			MS16(13, 0x1)
 /* Page 0xa42*/
 #define RTL_GSR				0x10
 #define   RTL_GSR_ST			MS16(0, 0x7)
diff --git a/drivers/net/ngbe/base/ngbe_phy_yt.c b/drivers/net/ngbe/base/ngbe_phy_yt.c
index 726d6c8ef5..754faadd6a 100644
--- a/drivers/net/ngbe/base/ngbe_phy_yt.c
+++ b/drivers/net/ngbe/base/ngbe_phy_yt.c
@@ -102,13 +102,15 @@ s32 ngbe_init_phy_yt(struct ngbe_hw *hw)
 {
 	rte_spinlock_init(&hw->phy_lock);
 
-	rte_spinlock_lock(&hw->phy_lock);
-	/* close sds area register */
-	ngbe_write_phy_reg_ext_yt(hw, YT_SMI_PHY, 0, 0);
-	/* enable interrupts */
-	ngbe_write_phy_reg_mdi(hw, YT_INTR, 0,
-				YT_INTR_ENA_MASK | YT_SDS_INTR_ENA_MASK);
-	rte_spinlock_unlock(&hw->phy_lock);
+	if (hw->lsc) {
+		rte_spinlock_lock(&hw->phy_lock);
+		/* close sds area register */
+		ngbe_write_phy_reg_ext_yt(hw, YT_SMI_PHY, 0, 0);
+		/* enable interrupts */
+		ngbe_write_phy_reg_mdi(hw, YT_INTR, 0,
+					YT_INTR_ENA_MASK | YT_SDS_INTR_ENA_MASK);
+		rte_spinlock_unlock(&hw->phy_lock);
+	}
 
 	hw->phy.set_phy_power(hw, false);
 
diff --git a/drivers/net/ngbe/base/ngbe_type.h b/drivers/net/ngbe/base/ngbe_type.h
index 05804eeab7..37be288a74 100644
--- a/drivers/net/ngbe/base/ngbe_type.h
+++ b/drivers/net/ngbe/base/ngbe_type.h
@@ -431,6 +431,7 @@ struct ngbe_hw {
 	bool offset_loaded;
 	bool is_pf;
 	bool gpio_ctl;
+	bool lsc;
 	u32 led_conf;
 	bool init_phy;
 	rte_spinlock_t phy_lock;
diff --git a/drivers/net/ngbe/ngbe_ethdev.c b/drivers/net/ngbe/ngbe_ethdev.c
index f719172749..30952a5632 100644
--- a/drivers/net/ngbe/ngbe_ethdev.c
+++ b/drivers/net/ngbe/ngbe_ethdev.c
@@ -1052,6 +1052,8 @@ ngbe_dev_start(struct rte_eth_dev *dev)
 	if (hw->is_pf && dev->data->dev_conf.lpbk_mode)
 		goto skip_link_setup;
 
+	hw->lsc = dev->data->dev_conf.intr_conf.lsc;
+
 	err = hw->mac.check_link(hw, &speed, &link_up, 0);
 	if (err != 0)
 		goto error;
-- 
2.25.1

---
  Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- -	2023-08-09 21:51:19.016576000 +0800
+++ 0029-net-ngbe-fix-link-status-in-no-LSC-mode.patch	2023-08-09 21:51:18.154352000 +0800
@@ -1 +1 @@
-From 21f702d556fabbc50e5e8d43c7ad3dfbe9dac1bd Mon Sep 17 00:00:00 2001
+From e66f9e3fdfd22a69c9443fc7bf8b613ff0c46cb5 Mon Sep 17 00:00:00 2001
@@ -4,0 +5,3 @@
+Cc: Xueming Li <xuemingl at nvidia.com>
+
+[ upstream commit 21f702d556fabbc50e5e8d43c7ad3dfbe9dac1bd ]
@@ -11 +13,0 @@
-Cc: stable at dpdk.org
@@ -130 +132 @@
-index 836ecfa2da..317ad6999c 100644
+index f719172749..30952a5632 100644


More information about the stable mailing list