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 --- 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