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.

2. Find another way to test for the bonded PHC feature.

Martin

Attachment: smime.p7s
Description: Elektronicky podpis S/MIME

_______________________________________________
Linuxptp-devel mailing list
Linuxptp-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxptp-devel

Reply via email to