ice_dpll_tspll_state_on_dpll_set() notifies the TSPLL device from a callback of the TIME_REF pin. This pin belongs to an external DPLL and the DPLL core is going to run its callbacks under a lock of the pin's owner, which does not cover the TSPLL device.
Only update dpll_state in the callback, so a device get reports the new state right away, and leave prev_dpll_state to ice_dpll_periodic_work_e825(), which then sends the notification. It now arrives up to 500 ms later and after the reply to the request. Refresh dpll_state on every run of the work, as the state written by the callback can be transient and the lock status can return to prev_dpll_state before the next run. No notification is sent in this case. Signed-off-by: Ivan Vecera <[email protected]> --- drivers/net/ethernet/intel/ice/ice_dpll.c | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/drivers/net/ethernet/intel/ice/ice_dpll.c b/drivers/net/ethernet/intel/ice/ice_dpll.c index ade1fb3dd06743..bdbcf7af296eb4 100644 --- a/drivers/net/ethernet/intel/ice/ice_dpll.c +++ b/drivers/net/ethernet/intel/ice/ice_dpll.c @@ -2914,7 +2914,6 @@ ice_dpll_tspll_state_on_dpll_set(const struct dpll_pin *pin, void *pin_priv, struct ice_dpll_pin *p = pin_priv; struct ice_pf *pf = p->pf; enum ice_clk_src clk_src; - bool changed = false; struct ice_dpll *tp; int ret; @@ -2947,15 +2946,12 @@ ice_dpll_tspll_state_on_dpll_set(const struct dpll_pin *pin, void *pin_priv, WRITE_ONCE(pf->ptp.tspll_locked, new_state == DPLL_LOCK_STATUS_LOCKED); - if (tp->prev_dpll_state != new_state) { - tp->dpll_state = new_state; - tp->prev_dpll_state = new_state; - changed = true; - } + /* ice_dpll_periodic_work_e825() compares the state with + * prev_dpll_state and sends the notification. + */ + tp->dpll_state = new_state; } mutex_unlock(&pf->dplls.lock); - if (changed) - __dpll_device_change_ntf(tp->dpll); /* TSPLL reconfiguration may complete before lock is reacquired. * PTP periodic monitoring tracks and restores the final lock state. */ @@ -3372,8 +3368,8 @@ static void ice_dpll_periodic_work_e825(struct ice_pf *pf) mutex_lock(&pf->dplls.lock); new_state = ice_dpll_tspll_lock_status_get(pf, true); + tp->dpll_state = new_state; if (tp->prev_dpll_state != new_state) { - tp->dpll_state = new_state; tp->prev_dpll_state = new_state; changed = true; } -- 2.56.0
