From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtpbguseast1.qq.com (smtpbguseast1.qq.com [54.204.34.129]) (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 2EDED28643A for ; Tue, 30 Jun 2026 03:11:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=54.204.34.129 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782789099; cv=none; b=cLj0WwyeCSR6Enf/T2EMT2RuzAqny8sytkKjU9NbsoJf3K1xb2RvmjmNFehE6cXLkjsZvbJtPEwEKS6YTr+3yguEHHhLB1+ZvRVAvkVy6HApa6+whbhVUgDYRk9XLiBibCuIMwPed9i+oIZfwzii+2KSPfTUl4mJ+nerFkNOF54= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782789099; c=relaxed/simple; bh=m/d4z24YEMKc9SvVLqnCo775ZOrBSefiZcDcf3+zdx8=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=TMepg5ZWHQKwAWvHeTeptBFqA6ma3njvPoUc3Jwfu3Ras2R2J3cS2WpC1q5M+BpeOZJkP91PE01A/ub5yaoTy+nsp/Kss+PfwUc9ezCKkfJGoa1vm7ezIdlYjzQeMAZJ95O3u5ssqGKEnvA9/TeiNY5ARiKyqqYttK96xUlqtWA= 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.204.34.129 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: zesmtpgz8t1782789045tcf547166 X-QQ-Originating-IP: Ph3CsosLaIiAV3xnsrBD2qhYG9CDzyfg0wVWo1QJacQ= Received: from lap-jiawenwu.trustnetic.com ( [36.24.190.76]) by bizesmtp.qq.com (ESMTP) with id ; Tue, 30 Jun 2026 11:10:43 +0800 (CST) X-QQ-SSF: 0000000000000000000000000000000 X-QQ-GoodBg: 0 X-BIZMAIL-ID: 5943307429947664262 EX-QQ-RecipientCnt: 22 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 , Jacob Keller , Michal Swiatkowski , Simon Horman , Kees Cook , Greg Kroah-Hartman , Thomas Gleixner , Breno Leitao , Larysa Zaremba , =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig=20=28The=20Capable=20Hub=29?= , Rongguang Wei , Fabio Baltieri , Jiawen Wu Subject: [PATCH net-next v8 4/5] net: wangxun: implement soft quiesce for PCIe error recovery Date: Tue, 30 Jun 2026 11:10:15 +0800 Message-Id: <20260630031016.19820-5-jiawenwu@trustnetic.com> X-Mailer: git-send-email 2.21.0.windows.1 In-Reply-To: <20260630031016.19820-1-jiawenwu@trustnetic.com> References: <20260630031016.19820-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: zesmtpgz:trustnetic.com:qybglogicsvrgz:qybglogicsvrgz6b-0 X-QQ-XMAILINFO: OKTkcuNDab7vhfN6QzGUQek6V0w749GWrPoKcuDWumMWSowtPjVD7nNk Hcy9sKb1ZKLZPYBPoABM9zg8AlsXj6VgNr0Qnmmcbm+z3rHcfcxTlWCMryA7wYuT1oUInd8 JMT2Y5dJF+5ktDfruFOh+hEw0yVMWho7BV+8lDoV6ET36u5A6qKEFe1LS6VxNiOHrDVdCM+ 3Pe/7V4EPIsONFpVNsXau48Xf3DHs4f41ekgle6m5fSZIC9FsWvCA6go6oOBulXEtScZSAd MJJyzB2ibo4BskwUeTLKF9B8KOe0QbFex6vxGSmcck6DI98ho8sY/iyFPSxjziIVHuB7Uzq 07Ss3Dj75uBbc8rVvJim5ViX7vKgdRPtxAiRyCa4GzzKedQacNUFGh+ChVAS3v7qnaErPK9 DootKeilKqP0NfnB5mI+COWtcMSp6H87gHDtaSv5z2lziWkD8ElMNOUx1zvzlYR+4LXgN0Z kwYQGcvnvg3pTCK3wxzhHgMKnKEBZ+VlSXVDUxgu93Wbfi4kNPdH59SmFK9jegr+owGSVRS sg0ry4At4y1iCFFSPY/NTTGm1FQIvx/ttok5emal0MUH6mnFhI5H872pS9ynTxGAUB2oNdZ JBYOSh545D3aIwicgTvoAcNCoRexKBnqsKSPHjwpQEQN1jjwMcVSKtRw7cXmPj4RhEc5Jee tzHkhC5oknSE+RYrycW1MPqp3NIMYCtpvYRXRVemG1A6i9jO+uE7QeqZxnlNUldBHg+7Ozy VCi7FsjXrqWH2BWNUutzQa7HX/s+j3nslxSAw2U6pmtEiGQ+lARrWU3mnpkUdl/6tiy+mue VJbczT54HA+LtLN0FGDsg6NjQTbUYolEX870ASgIKi3Fr0XsosbHQnwsierktmyaCUAIYhi uhx9Jq8ScQ6pAwsVn/h/GjMKE8Ysvf52+FdJ3DCOtfhlEvOaHXL2f25cvEC7Dl59qYJGbi0 9g5RFJHC0FIUurI513vNtAGt0T0FZEqug2aU9H9E33ySXVKl9AAXxq16lcmMmEw/UG0ZJfa HMi8CTSlxl5EvVefxSLKNGbxb3N3i/zA43LCVjnLaJTeAvRRTlI+O5Jphpw8KDWHhLzjDzk esoabUNLiHrNWojCXUi8bw= X-QQ-XMRINFO: OWPUhxQsoeAVwkVaQIEGSKwwgKCxK/fD5g== 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 | 18 ++++++++++++++++++ drivers/net/ethernet/wangxun/libwx/wx_ptp.h | 1 + .../net/ethernet/wangxun/txgbe/txgbe_main.c | 8 ++++++++ 5 files changed, 46 insertions(+) diff --git a/drivers/net/ethernet/wangxun/libwx/wx_lib.c b/drivers/net/ethernet/wangxun/libwx/wx_lib.c index e5a45356ba00..d3340b2b0682 100644 --- a/drivers/net/ethernet/wangxun/libwx/wx_lib.c +++ b/drivers/net/ethernet/wangxun/libwx/wx_lib.c @@ -3382,5 +3382,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 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..7068c6845b62 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,21 @@ 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); +} +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 a8773712cff8..a7bde03a98fe 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