Thread (9 messages) 9 messages, 3 authors, 21d ago

RE: [PATCH net-next v5 4/5] net: wangxun: implement soft quiesce for PCIe error recovery

From: Loktionov, Aleksandr <hidden>
Date: 2026-06-08 08:48:00

quoted hunk ↗ jump to hunk
-----Original Message-----
From: Jiawen Wu <jiawenwu@trustnetic.com>
Sent: Thursday, June 4, 2026 10:57 AM
To: netdev@vger.kernel.org
Cc: Mengyuan Lou <mengyuanlou@net-swift.com>; Andrew Lunn
[off-list ref]; David S. Miller [off-list ref]; Eric
Dumazet [off-list ref]; Jakub Kicinski [off-list ref]; Paolo
Abeni [off-list ref]; Richard Cochran [off-list ref];
Russell King [off-list ref]; Keller, Jacob E
[off-list ref]; Michal Swiatkowski
[off-list ref]; Simon Horman [off-list ref];
Kees Cook [off-list ref]; Zaremba, Larysa
[off-list ref]; Joe Damato [off-list ref]; Breno Leitao
[off-list ref]; Loktionov, Aleksandr
[off-list ref]; Uwe Kleine-König (The Capable Hub)
[off-list ref]; Fabio Baltieri
[off-list ref]; Thomas Gleixner [off-list ref]; Greg
Kroah-Hartman [off-list ref]; Jiawen Wu
[off-list ref]
Subject: [PATCH net-next v5 4/5] net: wangxun: implement soft quiesce
for PCIe error recovery

Function wx_soft_quiesce() provide a lightweight shutdown path during
PCIe error recovery. It avoids MMIO-dependent operations in PCIe error
status.

Waiting for the service task to complete may unnecessarily delay PCIe
error recovery, especially if the work item is already blocked by the
hardware failure that triggered AER. So the service task is not
explicitly cancelled in quiesce path. As a measure to block the
service task, the checking of WX_STATE_DOWN and WX_STATE_RESETTING is
added at the entry of every work item.

Signed-off-by: Jiawen Wu <jiawenwu@trustnetic.com>
---
 drivers/net/ethernet/wangxun/libwx/wx_lib.c   | 14 +++++++++++++
 drivers/net/ethernet/wangxun/libwx/wx_lib.h   |  1 +
 drivers/net/ethernet/wangxun/libwx/wx_ptp.c   | 21
+++++++++++++++++++
 drivers/net/ethernet/wangxun/libwx/wx_ptp.h   |  1 +
 .../net/ethernet/wangxun/txgbe/txgbe_main.c   |  8 +++++++
 5 files changed, 45 insertions(+)
diff --git a/drivers/net/ethernet/wangxun/libwx/wx_lib.c
b/drivers/net/ethernet/wangxun/libwx/wx_lib.c
index e5a45356ba00..0667eb1fe5fe 100644
--- a/drivers/net/ethernet/wangxun/libwx/wx_lib.c
+++ b/drivers/net/ethernet/wangxun/libwx/wx_lib.c
@@ -3382,5 +3382,19 @@ void wx_service_timer(struct timer_list *t)  }
EXPORT_SYMBOL(wx_service_timer);

+void wx_soft_quiesce(struct wx *wx)
+{
+	wx_ptp_quiesce(wx);
+	pci_clear_master(wx->pdev);
+	netif_tx_stop_all_queues(wx->netdev);
+	netif_carrier_off(wx->netdev);
+	netif_tx_disable(wx->netdev);
+	wx_napi_disable_all(wx);
+
+	clear_bit(WX_FLAG_NEED_PF_RESET, wx->flags);
+	timer_delete_sync(&wx->service_timer);
+}
+EXPORT_SYMBOL(wx_soft_quiesce);
+
 MODULE_DESCRIPTION("Common library for Wangxun(R) Ethernet
drivers.");  MODULE_LICENSE("GPL"); diff --git
a/drivers/net/ethernet/wangxun/libwx/wx_lib.h
b/drivers/net/ethernet/wangxun/libwx/wx_lib.h
index aed6ea8cf0d6..11bd79985e17 100644
--- a/drivers/net/ethernet/wangxun/libwx/wx_lib.h
+++ b/drivers/net/ethernet/wangxun/libwx/wx_lib.h
@@ -41,5 +41,6 @@ void wx_set_ring(struct wx *wx, u32 new_tx_count,
void wx_service_event_schedule(struct wx *wx);  void
wx_service_event_complete(struct wx *wx);  void
wx_service_timer(struct timer_list *t);
+void wx_soft_quiesce(struct wx *wx);

 #endif /* _WX_LIB_H_ */
diff --git a/drivers/net/ethernet/wangxun/libwx/wx_ptp.c
b/drivers/net/ethernet/wangxun/libwx/wx_ptp.c
index 44f3e6505246..dcc8b3ae1445 100644
--- a/drivers/net/ethernet/wangxun/libwx/wx_ptp.c
+++ b/drivers/net/ethernet/wangxun/libwx/wx_ptp.c
@@ -842,6 +842,27 @@ void wx_ptp_stop(struct wx *wx)  }
EXPORT_SYMBOL(wx_ptp_stop);

+void wx_ptp_quiesce(struct wx *wx)
+{
+	if (!test_and_clear_bit(WX_STATE_PTP_RUNNING, wx->state))
+		return;
+
+	clear_bit(WX_FLAG_PTP_PPS_ENABLED, wx->flags);
+
+	if (wx->ptp_tx_skb) {
+		dev_kfree_skb_any(wx->ptp_tx_skb);
+		wx->ptp_tx_skb = NULL;
+	}
+	clear_bit_unlock(WX_STATE_PTP_TX_IN_PROGRESS, wx->state);
+
+	if (wx->ptp_clock) {
+		ptp_clock_unregister(wx->ptp_clock);
+		wx->ptp_clock = NULL;
+		dev_info(&wx->pdev->dev, "removed PHC on %s\n", wx-
quoted
netdev->name);
+	}
+}
+EXPORT_SYMBOL(wx_ptp_quiesce);
+
 /**
  * wx_ptp_rx_hwtstamp - utility function which checks for RX time
stamp
  * @wx: pointer to wx struct
diff --git a/drivers/net/ethernet/wangxun/libwx/wx_ptp.h
b/drivers/net/ethernet/wangxun/libwx/wx_ptp.h
index 50db90a6e3ee..ad2f824875d5 100644
--- a/drivers/net/ethernet/wangxun/libwx/wx_ptp.h
+++ b/drivers/net/ethernet/wangxun/libwx/wx_ptp.h
@@ -10,6 +10,7 @@ void wx_ptp_reset(struct wx *wx);  void
wx_ptp_init(struct wx *wx);  void wx_ptp_suspend(struct wx *wx);  void
wx_ptp_stop(struct wx *wx);
+void wx_ptp_quiesce(struct wx *wx);
 void wx_ptp_rx_hwtstamp(struct wx *wx, struct sk_buff *skb);  int
wx_hwtstamp_get(struct net_device *dev,
 		    struct kernel_hwtstamp_config *cfg); diff --git
a/drivers/net/ethernet/wangxun/txgbe/txgbe_main.c
b/drivers/net/ethernet/wangxun/txgbe/txgbe_main.c
index 9251e7a1d416..f6e596eb9217 100644
--- a/drivers/net/ethernet/wangxun/txgbe/txgbe_main.c
+++ b/drivers/net/ethernet/wangxun/txgbe/txgbe_main.c
@@ -94,6 +94,10 @@ static void txgbe_module_detection_subtask(struct
wx *wx)  {
 	int err;

+	if (test_bit(WX_STATE_DOWN, wx->state) ||
+	    test_bit(WX_STATE_RESETTING, wx->state))
+		return;
+
 	if (!test_and_clear_bit(WX_FLAG_NEED_MODULE_RESET, wx->flags))
 		return;
@@ -107,6 +111,10 @@ static void txgbe_module_detection_subtask(struct
wx *wx)

 static void txgbe_link_config_subtask(struct wx *wx)  {
+	if (test_bit(WX_STATE_DOWN, wx->state) ||
+	    test_bit(WX_STATE_RESETTING, wx->state))
+		return;
+
 	if (!test_and_clear_bit(WX_FLAG_NEED_LINK_CONFIG, wx->flags))
 		return;

--
2.51.0
Reviewed-by: Aleksandr Loktionov <redacted>
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help