From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtpbgbr2.qq.com (smtpbgbr2.qq.com [54.207.22.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F3523402BB8 for ; Fri, 24 Jul 2026 10:14:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=54.207.22.56 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784888048; cv=none; b=mFmWCjyWbzllRWiAD2/uEk1oEgRXw1jaqhgisRnm7FYueoJbfBksh0a5kqiGsgrqG56G2bPGY9+BM8VKqGqG+44r1sKEj6uHGTzkkmL+aGvJdqCtV9RfQooL9/8wZH7nbpBxX90uZrFpEv55OyhY3SZ6u9v50AfoQn3+vvsSOLA= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784888048; c=relaxed/simple; bh=v7fyT+QxUMz+TdUzk7MdkBhUqda1U7x3Q4FrMHjogys=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=TeDZ6T89iBXelw2kZoxgwVMXTaD7Sddfb7HpB9xnV3JzN5pz1KArad9ltDLi/87cFiwXTNgZgnNj4st742v1cwqr4w+t10BW5E8aS/KfUhBarlU/1mlo2b/xj/hTxkEEOiPM4mQVHPqgJbWB3EZVtNjNBImJszCtDh2BJEHui7c= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=trustnetic.com; spf=pass smtp.mailfrom=trustnetic.com; arc=none smtp.client-ip=54.207.22.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=trustnetic.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=trustnetic.com X-QQ-mid: esmtpsz18t1784888014t0ef9e2f9 X-QQ-Originating-IP: JyYap2BoOcK4z1XhdKDHsmITnDgGpzYn9gVe3BzyHks= Received: from lap-jiawenwu.trustnetic.com ( [115.227.112.172]) by bizesmtp.qq.com (ESMTP) with id ; Fri, 24 Jul 2026 18:13:31 +0800 (CST) X-QQ-SSF: 0000000000000000000000000000000 X-QQ-GoodBg: 0 X-BIZMAIL-ID: 16165676477834021164 EX-QQ-RecipientCnt: 21 From: Jiawen Wu To: netdev@vger.kernel.org Cc: Mengyuan Lou , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Richard Cochran , Russell King , Aleksandr Loktionov , Michal Swiatkowski , Jacob Keller , Kees Cook , Simon Horman , Joe Damato , Larysa Zaremba , Rongguang Wei , =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig=20=28The=20Capable=20Hub=29?= , Chenguang Zhao , Fabio Baltieri , Jiawen Wu Subject: [PATCH net-next v12 4/5] net: wangxun: implement soft quiesce for PCIe error recovery Date: Fri, 24 Jul 2026 18:13:08 +0800 Message-Id: <20260724101309.23472-5-jiawenwu@trustnetic.com> X-Mailer: git-send-email 2.21.0.windows.1 In-Reply-To: <20260724101309.23472-1-jiawenwu@trustnetic.com> References: <20260724101309.23472-1-jiawenwu@trustnetic.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-QQ-SENDSIZE: 520 Feedback-ID: esmtpsz:trustnetic.com:qybglogicsvrgz:qybglogicsvrgz6b-0 X-QQ-XMAILINFO: OYcWkDQesdWFEPUFQVjlRb3uWKBVtqc3hP/B6fCOhrhtTQ7ogd0+bMXr ZTXTt3yS0Pkatlul23XDRcHQI9p+e56d6paUIiImQ6Ls0u0hlfHu7Xmx0q8t6RNDwaruvOr ZonM2s7BoaZam8asoDZ0Y3yFWyO05sCoP6HcD3RcO0u/LxyiKzxHy+AGWsc6cFr67sgaTeU noJbIYWpQkeAVrdaVZdhx7H++xxD86FDsA3/izEcdfR+9YHCrGyrjRtAPHojf1ZM2ApgoEn 1CPbVFFon6f8KOIbUc8dB+Zy3m547q5/AVCNjHCfkEYqRHKzoCfWohAN3OQT4DrW/vIHKs4 wpc/Kq8GHdbt7mLgra0knrqrB2TrOKnbYUjDvMD0UFhSkHLaaz+WtudUKTAhbKHKYG2/UiI EfRwvvvks/OJiXxW8LkI5r48RJPeXtKJEOcgIoFGsY5OhDnvoc1P02cVDGBXP88P/X+bHVR +uzaAmNXZHZJVXfjyM/vkmL3SPxZ63QGr0vGih5cIM7HQd0OdXuTsPXWKtNVpSwfPWjIUPd HXkoKtwZmTAU8L1OZ6kjlKrO3i0KXe5lgBEoB74e4OWqFBQ6fs1owq7891zwuVLkXv5Okwf rf9p7mwZhJ0k9QGIzumgw08hu4tLXsG/3aw0c25bPnLFSEYJTnfVxnDNHR4q/ojNnnkZrJi ZgTsERXtrEoDIYPH6dVr8+mOHaskPD5V0WhxWRSTjG6nJLb57EgZyhE6v9NnSPe5WSCH/Ne eQsnMc+DFZJttepEd5z//7IA9eAafcvaXQRsgrPpUX04A1vfm7nQYTc2P8JYSxn45kzlrzr /ZwM/8Cqh8tUAMW/BQOIxDTARQfumxFYoFiCdikvJ3+TB8z24BScxx1fEyfco+cBOj3ar2D vh12Sd5/d04PSMK7kn25FrsatvJ8zJOJfDv4M1rdjpPIVRnQK0H82fXmn8paiZlShvlmvUs 32+9jUXZEh2y3k2GbEYzkkGSvp6EAoqaMypDxbHF3XbJnW24Im++RfHghFO+r032TgY57B9 dhaqvY/TVkDv/ZJFupNmkLl6wz8vYlmq9fL4CvLWbpCAEGvNC2DHHBuIF6wh0gI1ErhFFfz sbt3l8LzFLvMWR+NqrsGvAuvjIFI5dcgzcn3WRgG3NF X-QQ-XMRINFO: NS+P29fieYNwqS3WCnRCOn9D1NpZuCnCRA== X-QQ-RECHKSPAM: 0 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 relevant work item. Signed-off-by: Jiawen Wu Reviewed-by: Aleksandr Loktionov --- drivers/net/ethernet/wangxun/libwx/wx_lib.c | 18 +++++++++++++ drivers/net/ethernet/wangxun/libwx/wx_lib.h | 1 + drivers/net/ethernet/wangxun/libwx/wx_ptp.c | 27 +++++++++++++++++++ drivers/net/ethernet/wangxun/libwx/wx_ptp.h | 1 + .../net/ethernet/wangxun/txgbe/txgbe_main.c | 16 +++++++++++ 5 files changed, 63 insertions(+) diff --git a/drivers/net/ethernet/wangxun/libwx/wx_lib.c b/drivers/net/ethernet/wangxun/libwx/wx_lib.c index 3373df34744c..f32f12463863 100644 --- a/drivers/net/ethernet/wangxun/libwx/wx_lib.c +++ b/drivers/net/ethernet/wangxun/libwx/wx_lib.c @@ -3408,5 +3408,23 @@ void wx_service_timer(struct timer_list *t) } EXPORT_SYMBOL(wx_service_timer); +void wx_soft_quiesce(struct wx *wx) +{ + if (!netif_running(wx->netdev) || + test_and_set_bit(WX_STATE_DOWN, wx->state)) + return; + + 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); + wx_ptp_quiesce(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 bc671786978e..9d85d399e17f 100644 --- a/drivers/net/ethernet/wangxun/libwx/wx_lib.h +++ b/drivers/net/ethernet/wangxun/libwx/wx_lib.h @@ -41,5 +41,6 @@ int 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..3eea647c4742 100644 --- a/drivers/net/ethernet/wangxun/libwx/wx_ptp.c +++ b/drivers/net/ethernet/wangxun/libwx/wx_ptp.c @@ -321,6 +321,9 @@ static long wx_ptp_do_aux_work(struct ptp_clock_info *ptp) struct wx *wx = container_of(ptp, struct wx, ptp_caps); int ts_done; + if (!test_bit(WX_STATE_PTP_RUNNING, wx->state)) + return HZ; + ts_done = wx_ptp_tx_hwtstamp_work(wx); wx_ptp_overflow_check(wx); @@ -842,6 +845,30 @@ 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_clock) + ptp_cancel_worker_sync(wx->ptp_clock); + + 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->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 dea5506dc9d2..11ac4b04f5ee 100644 --- a/drivers/net/ethernet/wangxun/txgbe/txgbe_main.c +++ b/drivers/net/ethernet/wangxun/txgbe/txgbe_main.c @@ -94,12 +94,24 @@ 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; /* wait for SFF module ready */ msleep(200); + /* Re-check state to avoid racing with down/reset paths. + * Module identification is deferred to the next up event, + * so it is safe to bail out here. + */ + if (test_bit(WX_STATE_DOWN, wx->state) || + test_bit(WX_STATE_RESETTING, wx->state)) + return; + err = txgbe_identify_module(wx); if (err == -ENODEV) set_bit(WX_FLAG_NEED_MODULE_RESET, wx->flags); @@ -107,6 +119,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