Commit 76868642 authored by Wojtek Wasko's avatar Wojtek Wasko Committed by David S. Miller
Browse files

testptp: Add option to open PHC in readonly mode



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: default avatarRichard Cochran <richardcochran@gmail.com>
Reviewed-by: default avatarVadim Fedorenko <vadim.fedorenko@linux.dev>
Signed-off-by: default avatarWojtek Wasko <wwasko@nvidia.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b4e53b15
Loading
Loading
Loading
Loading
+23 −14
Original line number Diff line number Diff line
@@ -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,6 +441,7 @@ int main(int argc, char *argv[])
	}

	if (extts) {
		if (!readonly) {
			memset(&extts_request, 0, sizeof(extts_request));
			extts_request.index = index;
			extts_request.flags = PTP_ENABLE_FEATURE;
@@ -445,6 +451,7 @@ int main(int argc, char *argv[])
			} else {
				puts("external time stamp request okay");
			}
		}
		for (; extts; extts--) {
			cnt = read(fd, &event, sizeof(event));
			if (cnt != sizeof(event)) {
@@ -455,12 +462,14 @@ int main(int argc, char *argv[])
			       event.t.sec, event.t.nsec);
			fflush(stdout);
		}
		if (!readonly) {
			/* Disable the feature again. */
			extts_request.flags = 0;
			if (ioctl(fd, PTP_EXTTS_REQUEST, &extts_request)) {
				perror("PTP_EXTTS_REQUEST");
			}
		}
	}

	if (flagtest) {
		do_flag_test(fd, index);