OSDN Git Service

selftests/ptp: Add -X option for testing PTP_SYS_OFFSET_PRECISE
authorAlex Maftei <alex.maftei@amd.com>
Tue, 25 Jul 2023 21:53:34 +0000 (22:53 +0100)
committerDavid S. Miller <davem@davemloft.net>
Fri, 28 Jul 2023 09:59:40 +0000 (10:59 +0100)
The -X option was chosen because X looks like a cross, and the underlying
callback is 'get cross timestamp'.

Signed-off-by: Alex Maftei <alex.maftei@amd.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
tools/testing/selftests/ptp/testptp.c

index 71ceb64..c9f6cca 100644 (file)
@@ -144,6 +144,7 @@ static void usage(char *progname)
                " -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"
+               " -X         get a ptp clock cross timestamp\n"
                " -z         test combinations of rising/falling external time stamp flags\n",
                progname, PTP_MAX_SAMPLES);
 }
@@ -160,6 +161,7 @@ int main(int argc, char *argv[])
        struct ptp_clock_time *pct;
        struct ptp_sys_offset *sysoff;
        struct ptp_sys_offset_extended *soe;
+       struct ptp_sys_offset_precise *xts;
 
        char *progname;
        unsigned int i;
@@ -179,6 +181,7 @@ int main(int argc, char *argv[])
        int list_pins = 0;
        int pct_offset = 0;
        int getextended = 0;
+       int getcross = 0;
        int n_samples = 0;
        int pin_index = -1, pin_func;
        int pps = -1;
@@ -193,7 +196,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:x:z"))) {
+       while (EOF != (c = getopt(argc, argv, "cd:e:f:ghH:i:k:lL:n:o:p:P:sSt:T:w:x:Xz"))) {
                switch (c) {
                case 'c':
                        capabilities = 1;
@@ -267,6 +270,9 @@ int main(int argc, char *argv[])
                                return -1;
                        }
                        break;
+               case 'X':
+                       getcross = 1;
+                       break;
                case 'z':
                        flagtest = 1;
                        break;
@@ -575,6 +581,29 @@ int main(int argc, char *argv[])
                free(soe);
        }
 
+       if (getcross) {
+               xts = calloc(1, sizeof(*xts));
+               if (!xts) {
+                       perror("calloc");
+                       return -1;
+               }
+
+               if (ioctl(fd, PTP_SYS_OFFSET_PRECISE, xts)) {
+                       perror("PTP_SYS_OFFSET_PRECISE");
+               } else {
+                       puts("system and phc crosstimestamping request okay");
+
+                       printf("device time: %lld.%09u\n",
+                              xts->device.sec, xts->device.nsec);
+                       printf("system time: %lld.%09u\n",
+                              xts->sys_realtime.sec, xts->sys_realtime.nsec);
+                       printf("monoraw time: %lld.%09u\n",
+                              xts->sys_monoraw.sec, xts->sys_monoraw.nsec);
+               }
+
+               free(xts);
+       }
+
        close(fd);
        return 0;
 }