]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
testptp: add option to enable external timestamping edges
authorMiroslav Lichvar <mlichvar@redhat.com>
Thu, 19 Jun 2025 13:53:42 +0000 (15:53 +0200)
committerDavid S. Miller <davem@davemloft.net>
Mon, 23 Jun 2025 12:32:14 +0000 (13:32 +0100)
Some drivers (e.g. ice) don't enable any edges by default when external
timestamping is requested by the PTP_EXTTS_REQUEST ioctl, which makes
testptp -e unusable for testing hardware supported by these drivers.

Add -E option to specify if the rising, falling, or both edges should
be enabled by the ioctl.

Signed-off-by: Miroslav Lichvar <mlichvar@redhat.com>
Cc: Richard Cochran <richardcochran@gmail.com>
Cc: Jacob Keller <jacob.e.keller@intel.com>
Reviewed-by: Vadim Fedorenko <vadim.fedorenko@linux.dev>
Signed-off-by: David S. Miller <davem@davemloft.net>
tools/testing/selftests/ptp/testptp.c

index edc08a4433fd41f903498a6b5e73279e7dde5648..ed1e2886ba3c4c836ba0dd90cef50aeb3b2dc31a 100644 (file)
@@ -120,6 +120,7 @@ static void usage(char *progname)
                " -c         query the ptp clock's capabilities\n"
                " -d name    device to open\n"
                " -e val     read 'val' external time stamp events\n"
+               " -E val     enable rising (1), falling (2), or both (3) edges\n"
                " -f val     adjust the ptp clock frequency by 'val' ppb\n"
                " -F chan    Enable single channel mask and keep device open for debugfs verification.\n"
                " -g         get the ptp clock time\n"
@@ -178,6 +179,7 @@ int main(int argc, char *argv[])
        int adjphase = 0;
        int capabilities = 0;
        int extts = 0;
+       int edge = 0;
        int flagtest = 0;
        int gettime = 0;
        int index = 0;
@@ -202,7 +204,7 @@ int main(int argc, char *argv[])
 
        progname = strrchr(argv[0], '/');
        progname = progname ? 1+progname : argv[0];
-       while (EOF != (c = getopt(argc, argv, "cd:e:f:F:ghH:i:k:lL:n:o:p:P:rsSt:T:w:x:Xy:z"))) {
+       while (EOF != (c = getopt(argc, argv, "cd:e:E:f:F:ghH:i:k:lL:n:o:p:P:rsSt:T:w:x:Xy:z"))) {
                switch (c) {
                case 'c':
                        capabilities = 1;
@@ -213,6 +215,11 @@ int main(int argc, char *argv[])
                case 'e':
                        extts = atoi(optarg);
                        break;
+               case 'E':
+                       edge = atoi(optarg);
+                       edge = (edge & 1 ? PTP_RISING_EDGE : 0) |
+                               (edge & 2 ? PTP_FALLING_EDGE : 0);
+                       break;
                case 'f':
                        adjfreq = atoi(optarg);
                        break;
@@ -444,7 +451,7 @@ int main(int argc, char *argv[])
                if (!readonly) {
                        memset(&extts_request, 0, sizeof(extts_request));
                        extts_request.index = index;
-                       extts_request.flags = PTP_ENABLE_FEATURE;
+                       extts_request.flags = PTP_ENABLE_FEATURE | edge;
                        if (ioctl(fd, PTP_EXTTS_REQUEST, &extts_request)) {
                                perror("PTP_EXTTS_REQUEST");
                                extts = 0;