On Mon, 1 May 2023 at 18:30, Martin Pecka <pecka...@fel.cvut.cz> wrote:
> > This code in hwts_init is wrong: > > cfg.flags = HWTSTAMP_FLAG_BONDED_PHC_INDEX; > /* Fall back without flag if user run new build on old kernel */ > if (ioctl(fd, SIOCGHWTSTAMP, &ifreq) == -EINVAL) > init_ifreq(&ifreq, &cfg, device); > > As `man ioctl` says: > > RETURN VALUE > Usually, on success zero is returned. A few ioctl() requests use the > return value as an output parameter and return a nonnegative value on > success. On error, -1 is returned, and errno is set appropriately. > > So I think what you meant to write is this: > > cfg.flags = HWTSTAMP_FLAG_BONDED_PHC_INDEX; > err = ioctl(fd, SIOCGHWTSTAMP, &ifreq); > if (err < 0) { > /* Fall back without flag if user run new build on old kernel */ > if (errno == EINVAL) { > init_ifreq(&ifreq, &cfg, device); > } else { > pr_err("ioctl SIOCGHWTSTAMP failed: %m"); > return err; > } > } > > > Agree. Applying this fix reveals the real error - EOPNOTSUPP. > > @Martin would that also fix your issue? > > No. Getting the real error code, I went after the source of EOPNOTSUPP, > and... > > $ sudo hwstamp_ctl -i eth0 > Device driver does not have support for non-destructive SIOCGHWTSTAMP. > > This is it! The nvidia eqos driver does not support SIOCGHWTSTAMP (but it > does support SIOCSHWTSTAMP). Evidence can be found in > https://github.com/OE4T/linux-tegra-4.9/blob/oe4t-patches-l4t-r32.7.3/nvidia/drivers/net/ethernet/nvidia/eqos/drv.c#L3979 > (function eqos_ioctl). > > According to > https://www.kernel.org/doc/Documentation/networking/timestamping.txt, > section 3.1: > > A driver which supports hardware time stamping must support the > SIOCSHWTSTAMP ioctl and update the supplied struct hwtstamp_config with > the actual values as described in the section on SIOCSHWTSTAMP. It > should also support SIOCGHWTSTAMP. > > The support for SIOCGHWTSTAMP is optional. > > So it seems to me wrong to test for the bonded PHC support using this > ioctl, which is only optional. > > To add importance to this issue, I've found out it not only affects the > pretty old Jetson TX2 I used for the test, but all Jetson models up to the > newest AGX Orin (included). Meaning no Jetson can run ptp4l from master > branch now. I really wonder I'm the first one complaining... > > Regarding possible solutions I can think of: > > 1. Check errno not only for EINVAL, but also for EOPNOTSUPP. This would > solve the issue for me (and Jetsons in general), but would probably leave > some users with bonded PHCs whose drivers do not support SIOCGHWTSTAMP > without the possibility to use the bonded PHC. > On a second review. I think you have a point. This get ioctl (SIOCGHWTSTAMP) was added for VLAN over bond support. On normal run, the get ioctl is only used with HWTS_FILTER_CHECK. So the user can switch to HWTS_FILTER_FULL or HWTS_FILTER_NORMAL and skip the get ioctl. But the get ioctl with bonded PHC index, can not be skipped. > 2. Find another way to test for the bonded PHC feature. > Perhaps a flag? Erez > Martin >
_______________________________________________ Linuxptp-devel mailing list Linuxptp-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linuxptp-devel