[PATCH 5/5] ice: quiesce PTP periodic work before system suspend
From: Aaron Ma
Date: Mon Oct 19 2026 - 06:55:23 EST
ice_suspend() stops the main service task but leaves PTP work active.
The PTP kworker is not freezable, so it can continue issuing MMIO
accesses after the PCI function has entered D3hot. Both the periodic
work updating the cached PHC time and the E822 offset calibration work,
which reschedules itself while calibration is pending, are affected.
Synchronously cancel both works when PTP is ready, after disabling the
VSIs and before shutting down the control queues.
Fixes: 77a781155a65 ("ice: enable receive hardware timestamping")
Fixes: a69f1cb62aec ("ice: exit bypass mode once hardware finishes timestamp calibration")
Signed-off-by: Aaron Ma <aaron.ma@xxxxxxxxxxxxx>
---
drivers/net/ethernet/intel/ice/ice_main.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c
index ddebb28b2454f..3962910759067 100644
--- a/drivers/net/ethernet/intel/ice/ice_main.c
+++ b/drivers/net/ethernet/intel/ice/ice_main.c
@@ -5450,6 +5450,12 @@ static void ice_prepare_for_shutdown(struct ice_pf *pf)
/* disable the VSIs and their queues that are not already DOWN */
ice_pf_dis_all_vsi(pf, false);
+ if (test_bit(ICE_FLAG_PTP_SUPPORTED, pf->flags) &&
+ pf->ptp.state == ICE_PTP_READY) {
+ kthread_cancel_delayed_work_sync(&pf->ptp.work);
+ kthread_cancel_delayed_work_sync(&pf->ptp.port.ov_work);
+ }
+
ice_for_each_vsi(pf, v)
if (pf->vsi[v])
pf->vsi[v]->vsi_num = 0;
--
2.53.0