Reading of the PHC can occasionally fail with some drivers, e.g. the ice driver returns EBUSY when it fails to get a lock. Continue in the loop instead of exiting on the error.
Signed-off-by: Miroslav Lichvar <mlich...@redhat.com> --- phc2sys.c | 50 +++++++++++++++++++++++++++++--------------------- 1 file changed, 29 insertions(+), 21 deletions(-) diff --git a/phc2sys.c b/phc2sys.c index 599f9bd..2445c55 100644 --- a/phc2sys.c +++ b/phc2sys.c @@ -622,6 +622,7 @@ static int do_pps_loop(struct phc2sys_private *priv, struct clock *clock, int64_t pps_offset, phc_offset, phc_delay; uint64_t pps_ts, phc_ts; clockid_t src = priv->master->clkid; + int err; priv->master->source_label = "pps"; @@ -640,10 +641,13 @@ static int do_pps_loop(struct phc2sys_private *priv, struct clock *clock, /* If a PHC is available, use it to get the whole number of seconds in the offset and PPS for the rest. */ if (src != CLOCK_INVALID) { - if (clockadj_compare(src, clock->clkid, - priv->phc_readings, - &phc_offset, &phc_ts, - &phc_delay)) + err = clockadj_compare(src, clock->clkid, + priv->phc_readings, + &phc_offset, &phc_ts, + &phc_delay); + if (err == -EBUSY) + continue; + if (err) return -1; /* Convert the time stamp to the PHC time. */ @@ -691,6 +695,7 @@ static int do_loop(struct phc2sys_private *priv) struct clock *clock; uint64_t ts; int64_t offset, delay; + int err; interval.tv_sec = priv->phc_interval; interval.tv_nsec = (priv->phc_interval - interval.tv_sec) * 1e9; @@ -727,29 +732,32 @@ static int do_loop(struct phc2sys_private *priv) if (clock->clkid == CLOCK_REALTIME && priv->master->sysoff_method >= 0) { /* use sysoff */ - if (sysoff_measure(CLOCKID_TO_FD(priv->master->clkid), - priv->master->sysoff_method, - priv->phc_readings, - &offset, &ts, &delay) < 0) - return -1; + err = sysoff_measure(CLOCKID_TO_FD(priv->master->clkid), + priv->master->sysoff_method, + priv->phc_readings, + &offset, &ts, &delay); } else if (priv->master->clkid == CLOCK_REALTIME && clock->sysoff_method >= 0) { /* use reversed sysoff */ - if (sysoff_measure(CLOCKID_TO_FD(clock->clkid), - clock->sysoff_method, - priv->phc_readings, - &offset, &ts, &delay) < 0) - return -1; - offset = -offset; - ts += offset; + err = sysoff_measure(CLOCKID_TO_FD(clock->clkid), + clock->sysoff_method, + priv->phc_readings, + &offset, &ts, &delay); + if (!err) { + offset = -offset; + ts += offset; + } } else { /* use phc */ - if (clockadj_compare(priv->master->clkid, - clock->clkid, - priv->phc_readings, - &offset, &ts, &delay)) - return -1; + err = clockadj_compare(priv->master->clkid, + clock->clkid, + priv->phc_readings, + &offset, &ts, &delay); } + if (err == -EBUSY) + continue; + if (err) + return -1; update_clock(priv, clock, offset, ts, delay); } } -- 2.35.1 _______________________________________________ Linuxptp-devel mailing list Linuxptp-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linuxptp-devel