]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
selftests/ptp: Add -x option for testing PTP_SYS_OFFSET_EXTENDED
authorAlex Maftei <alex.maftei@amd.com>
Tue, 25 Jul 2023 21:53:33 +0000 (22:53 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 6 Feb 2026 15:44:03 +0000 (16:44 +0100)
[ Upstream commit c8ba75c4eb846888f8f2730690b99cb5bf7b337c ]

The -x option (where 'x' stands for eXtended) takes an argument which
represents the number of samples to request from the PTP device.
The help message will display the maximum number of samples allowed.
Providing an invalid argument will also display the maximum number of
samples allowed.

Signed-off-by: Alex Maftei <alex.maftei@amd.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Stable-dep-of: 76868642e427 ("testptp: Add option to open PHC in readonly mode")
Signed-off-by: Sasha Levin <sashal@kernel.org>
tools/testing/selftests/ptp/testptp.c

index 9c3d36a40309b75c2d330c8e6009a4fa1912930a..2db6ff0316e7a2a2165229af286ee1c98fe7b504 100644 (file)
@@ -143,8 +143,9 @@ static void usage(char *progname)
                " -S         set the system time from the ptp clock time\n"
                " -t val     shift the ptp clock time by 'val' seconds\n"
                " -T val     set the ptp clock time to 'val' seconds\n"
+               " -x val     get an extended ptp clock time with the desired number of samples (up to %d)\n"
                " -z         test combinations of rising/falling external time stamp flags\n",
-               progname);
+               progname, PTP_MAX_SAMPLES);
 }
 
 int main(int argc, char *argv[])
@@ -158,6 +159,7 @@ int main(int argc, char *argv[])
        struct timex tx;
        struct ptp_clock_time *pct;
        struct ptp_sys_offset *sysoff;
+       struct ptp_sys_offset_extended *soe;
 
        char *progname;
        unsigned int i;
@@ -176,6 +178,7 @@ int main(int argc, char *argv[])
        int index = 0;
        int list_pins = 0;
        int pct_offset = 0;
+       int getextended = 0;
        int n_samples = 0;
        int pin_index = -1, pin_func;
        int pps = -1;
@@ -190,7 +193,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:ghH:i:k:lL:n:o:p:P:sSt:T:w:z"))) {
+       while (EOF != (c = getopt(argc, argv, "cd:e:f:ghH:i:k:lL:n:o:p:P:sSt:T:w:x:z"))) {
                switch (c) {
                case 'c':
                        capabilities = 1;
@@ -255,6 +258,15 @@ int main(int argc, char *argv[])
                case 'w':
                        pulsewidth = atoi(optarg);
                        break;
+               case 'x':
+                       getextended = atoi(optarg);
+                       if (getextended < 1 || getextended > PTP_MAX_SAMPLES) {
+                               fprintf(stderr,
+                                       "number of extended timestamp samples must be between 1 and %d; was asked for %d\n",
+                                       PTP_MAX_SAMPLES, getextended);
+                               return -1;
+                       }
+                       break;
                case 'z':
                        flagtest = 1;
                        break;
@@ -533,6 +545,34 @@ int main(int argc, char *argv[])
                free(sysoff);
        }
 
+       if (getextended) {
+               soe = calloc(1, sizeof(*soe));
+               if (!soe) {
+                       perror("calloc");
+                       return -1;
+               }
+
+               soe->n_samples = getextended;
+
+               if (ioctl(fd, PTP_SYS_OFFSET_EXTENDED, soe)) {
+                       perror("PTP_SYS_OFFSET_EXTENDED");
+               } else {
+                       printf("extended timestamp request returned %d samples\n",
+                              getextended);
+
+                       for (i = 0; i < getextended; i++) {
+                               printf("sample #%2d: system time before: %lld.%09u\n",
+                                      i, soe->ts[i][0].sec, soe->ts[i][0].nsec);
+                               printf("            phc time: %lld.%09u\n",
+                                      soe->ts[i][1].sec, soe->ts[i][1].nsec);
+                               printf("            system time after: %lld.%09u\n",
+                                      soe->ts[i][2].sec, soe->ts[i][2].nsec);
+                       }
+               }
+
+               free(soe);
+       }
+
        close(fd);
        return 0;
 }