On Tue, Aug 04, 2020 at 04:23:35PM -0700, Richard Cochran wrote: > On Mon, Aug 03, 2020 at 10:49:21PM +0300, Vladimir Oltean wrote: > > @@ -218,6 +218,19 @@ long ptp_ioctl(struct posix_clock *pc, unsigned int > > cmd, unsigned long arg) > > break; > > } > > } > > + if (perout->flags & PTP_PEROUT_PHASE) { > > + /* > > + * The phase should be specified modulo the > > + * period, therefore anything larger than 1 > > + * period is invalid. > > + */ > > + if (perout->phase.sec > perout->period.sec || > > + (perout->phase.sec == perout->period.sec && > > + perout->phase.nsec > perout->period.nsec)) > > { > > + err = -ERANGE; > > + break; > > + } > > So if perout->period={1,0} and perout->phase={1,0} then the phase has > wrapped 360 degrees back to zero. > > Shouldn't this code catch that case as well? > > So why not test for (perout->phase.nsec >= perout->period.nsec) instead? > > Thanks, > Richard
Oof, I guess this is what one would call 'brain fart'. In my mind, checking for equality between period and phase required an extra 'if', which I was reluctant to add (or to even think about, it seems). I converted the nsec check to >= and it works as it should (I checked with a modified ts2phc). ts2phc[326.764]: config item /dev/ptp1.ts2phc.perout_phase is 1000000000 ts2phc[326.764]: config item /dev/ptp1.ts2phc.pulsewidth is 500000000 ts2phc[326.764]: PTP_PEROUT_REQUEST2 failed: Numerical result out of range I'm sending a v2 with your change very soon. Thanks. -Vladimir