]> www.infradead.org Git - users/hch/misc.git/commitdiff
testptp: Add option to open PHC in readonly mode
authorWojtek Wasko <wwasko@nvidia.com>
Mon, 3 Mar 2025 16:13:45 +0000 (18:13 +0200)
committerDavid S. Miller <davem@davemloft.net>
Wed, 5 Mar 2025 12:43:54 +0000 (12:43 +0000)
PTP Hardware Clocks no longer require WRITE permission to perform
readonly operations, such as listing device capabilities or listening to
EXTTS events once they have been enabled by a process with WRITE
permissions.

Add '-r' option to testptp to open the PHC in readonly mode instead of
the default read-write mode. Skip enabling EXTTS if readonly mode is
requested.

Acked-by: Richard Cochran <richardcochran@gmail.com>
Reviewed-by: Vadim Fedorenko <vadim.fedorenko@linux.dev>
Signed-off-by: Wojtek Wasko <wwasko@nvidia.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
tools/testing/selftests/ptp/testptp.c

index 58064151f2c8923ee64b079ca16e441726c290b5..edc08a4433fd41f903498a6b5e73279e7dde5648 100644 (file)
@@ -140,6 +140,7 @@ static void usage(char *progname)
                " -H val     set output phase to 'val' nanoseconds (requires -p)\n"
                " -w val     set output pulse width to 'val' nanoseconds (requires -p)\n"
                " -P val     enable or disable (val=1|0) the system clock PPS\n"
+               " -r         open the ptp clock in readonly mode\n"
                " -s         set the ptp clock time from the system time\n"
                " -S         set the system time from the ptp clock time\n"
                " -t val     shift the ptp clock time by 'val' seconds\n"
@@ -188,6 +189,7 @@ int main(int argc, char *argv[])
        int pin_index = -1, pin_func;
        int pps = -1;
        int seconds = 0;
+       int readonly = 0;
        int settime = 0;
        int channel = -1;
        clockid_t ext_clockid = CLOCK_REALTIME;
@@ -200,7 +202,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:sSt:T:w:x:Xy:z"))) {
+       while (EOF != (c = getopt(argc, argv, "cd:e:f:F:ghH:i:k:lL:n:o:p:P:rsSt:T:w:x:Xy:z"))) {
                switch (c) {
                case 'c':
                        capabilities = 1;
@@ -252,6 +254,9 @@ int main(int argc, char *argv[])
                case 'P':
                        pps = atoi(optarg);
                        break;
+               case 'r':
+                       readonly = 1;
+                       break;
                case 's':
                        settime = 1;
                        break;
@@ -308,7 +313,7 @@ int main(int argc, char *argv[])
                }
        }
 
-       fd = open(device, O_RDWR);
+       fd = open(device, readonly ? O_RDONLY : O_RDWR);
        if (fd < 0) {
                fprintf(stderr, "opening %s: %s\n", device, strerror(errno));
                return -1;
@@ -436,14 +441,16 @@ int main(int argc, char *argv[])
        }
 
        if (extts) {
-               memset(&extts_request, 0, sizeof(extts_request));
-               extts_request.index = index;
-               extts_request.flags = PTP_ENABLE_FEATURE;
-               if (ioctl(fd, PTP_EXTTS_REQUEST, &extts_request)) {
-                       perror("PTP_EXTTS_REQUEST");
-                       extts = 0;
-               } else {
-                       puts("external time stamp request okay");
+               if (!readonly) {
+                       memset(&extts_request, 0, sizeof(extts_request));
+                       extts_request.index = index;
+                       extts_request.flags = PTP_ENABLE_FEATURE;
+                       if (ioctl(fd, PTP_EXTTS_REQUEST, &extts_request)) {
+                               perror("PTP_EXTTS_REQUEST");
+                               extts = 0;
+                       } else {
+                               puts("external time stamp request okay");
+                       }
                }
                for (; extts; extts--) {
                        cnt = read(fd, &event, sizeof(event));
@@ -455,10 +462,12 @@ int main(int argc, char *argv[])
                               event.t.sec, event.t.nsec);
                        fflush(stdout);
                }
-               /* Disable the feature again. */
-               extts_request.flags = 0;
-               if (ioctl(fd, PTP_EXTTS_REQUEST, &extts_request)) {
-                       perror("PTP_EXTTS_REQUEST");
+               if (!readonly) {
+                       /* Disable the feature again. */
+                       extts_request.flags = 0;
+                       if (ioctl(fd, PTP_EXTTS_REQUEST, &extts_request)) {
+                               perror("PTP_EXTTS_REQUEST");
+                       }
                }
        }