138a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin/*
238a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * Copyright (c) 2014 Stefan Sørensen <stefan.sorensen@spectralink.com>
338a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * Copyright (c) 2014-2015 Dmitry V. Levin <ldv@altlinux.org>
438a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * All rights reserved.
538a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin *
638a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * Redistribution and use in source and binary forms, with or without
738a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * modification, are permitted provided that the following conditions
838a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * are met:
938a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * 1. Redistributions of source code must retain the above copyright
1038a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin *    notice, this list of conditions and the following disclaimer.
1138a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * 2. Redistributions in binary form must reproduce the above copyright
1238a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin *    notice, this list of conditions and the following disclaimer in the
1338a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin *    documentation and/or other materials provided with the distribution.
1438a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * 3. The name of the author may not be used to endorse or promote products
1538a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin *    derived from this software without specific prior written permission.
1638a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin *
1738a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
1838a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
1938a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
2038a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
2138a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
2238a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2338a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2438a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2538a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
2638a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2738a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin */
2838a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin
29b88a6f877eb08e6d45130374fc1a1867371db703Stefan Sørensen#include "defs.h"
30317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin#include <linux/ioctl.h>
31b88a6f877eb08e6d45130374fc1a1867371db703Stefan Sørensen#include <linux/ptp_clock.h>
32b88a6f877eb08e6d45130374fc1a1867371db703Stefan Sørensen
330ed617bd66624cec6138102545d73b2e2346f1f6Dmitry V. Levin#include "xlat/ptp_flags_options.h"
34b88a6f877eb08e6d45130374fc1a1867371db703Stefan Sørensen
35c7afb4881f14e44968f3a78ae5988f04ecc66b68Dmitry V. Levinint
36317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levinptp_ioctl(struct tcb *tcp, const unsigned int code, const long arg)
37b88a6f877eb08e6d45130374fc1a1867371db703Stefan Sørensen{
38b88a6f877eb08e6d45130374fc1a1867371db703Stefan Sørensen	if (!verbose(tcp))
39317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin		return RVAL_DECODED;
40b88a6f877eb08e6d45130374fc1a1867371db703Stefan Sørensen
41b88a6f877eb08e6d45130374fc1a1867371db703Stefan Sørensen	switch (code) {
42317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin	case PTP_EXTTS_REQUEST: {
43317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin		struct ptp_extts_request extts;
44b88a6f877eb08e6d45130374fc1a1867371db703Stefan Sørensen
45317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin		tprints(", ");
46317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin		if (umove_or_printaddr(tcp, arg, &extts))
47317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin			break;
48b88a6f877eb08e6d45130374fc1a1867371db703Stefan Sørensen
49317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin		tprintf("{index=%d, flags=", extts.index);
50317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin		printflags(ptp_flags_options, extts.flags, "PTP_???");
51317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin		tprints("}");
52317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin		break;
53317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin	}
54b88a6f877eb08e6d45130374fc1a1867371db703Stefan Sørensen
55317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin	case PTP_PEROUT_REQUEST: {
56317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin		struct ptp_perout_request perout;
57b88a6f877eb08e6d45130374fc1a1867371db703Stefan Sørensen
58317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin		tprints(", ");
59317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin		if (umove_or_printaddr(tcp, arg, &perout))
60317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin			break;
61b88a6f877eb08e6d45130374fc1a1867371db703Stefan Sørensen
62317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin		tprintf("{start={%" PRId64 ", %" PRIu32 "}"
63317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin			   ", period={%" PRId64 ", %" PRIu32 "}"
64317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin			   ", index=%d, flags=",
65317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin			(int64_t)perout.start.sec, perout.start.nsec,
66317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin			(int64_t)perout.period.sec, perout.period.nsec,
67317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin			perout.index);
68317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin		printflags(ptp_flags_options, perout.flags, "PTP_???");
69317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin		tprints("}");
70317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin		break;
71317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin	}
72b88a6f877eb08e6d45130374fc1a1867371db703Stefan Sørensen
73317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin	case PTP_ENABLE_PPS:
74317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin		tprintf(", %ld", arg);
75317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin		break;
76b88a6f877eb08e6d45130374fc1a1867371db703Stefan Sørensen
77317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin	case PTP_SYS_OFFSET: {
78317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin		struct ptp_sys_offset sysoff;
79317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin
80317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin		if (entering(tcp)) {
81317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin			tprints(", ");
82317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin			if (umove_or_printaddr(tcp, arg, &sysoff))
83317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin				break;
84b88a6f877eb08e6d45130374fc1a1867371db703Stefan Sørensen
85317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin			tprintf("{n_samples=%u", sysoff.n_samples);
86b88a6f877eb08e6d45130374fc1a1867371db703Stefan Sørensen			return 1;
87317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin		} else {
88317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin			unsigned int n_samples, i;
89b88a6f877eb08e6d45130374fc1a1867371db703Stefan Sørensen
90317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin			if (syserror(tcp)) {
91317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin				tprints("}");
92317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin				break;
93317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin			}
94b88a6f877eb08e6d45130374fc1a1867371db703Stefan Sørensen
95317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin			tprints(", ");
96317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin			if (umove(tcp, arg, &sysoff) < 0) {
97317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin				tprints("???}");
98317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin				break;
99317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin			}
100b88a6f877eb08e6d45130374fc1a1867371db703Stefan Sørensen
101317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin			tprints("ts=[");
102317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin			n_samples = sysoff.n_samples > PTP_MAX_SAMPLES ?
103317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin				PTP_MAX_SAMPLES : sysoff.n_samples;
104317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin			for (i = 0; i < 2 * n_samples + 1; ++i) {
105317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin				if (i > 0)
106317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin					tprints(", ");
107317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin				tprintf("{%" PRId64 ", %" PRIu32 "}",
108317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin					(int64_t)sysoff.ts[i].sec,
109317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin					sysoff.ts[i].nsec);
110b88a6f877eb08e6d45130374fc1a1867371db703Stefan Sørensen			}
111b88a6f877eb08e6d45130374fc1a1867371db703Stefan Sørensen			if (sysoff.n_samples > PTP_MAX_SAMPLES)
112317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin				tprints(", ...");
113317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin			tprints("]}");
114317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin			break;
115b88a6f877eb08e6d45130374fc1a1867371db703Stefan Sørensen		}
116317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin	}
117317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin	case PTP_CLOCK_GETCAPS: {
118317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin		struct ptp_clock_caps caps;
119b88a6f877eb08e6d45130374fc1a1867371db703Stefan Sørensen
120317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin		if (entering(tcp))
121b88a6f877eb08e6d45130374fc1a1867371db703Stefan Sørensen			return 0;
122317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin
123317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin		tprints(", ");
124317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin		if (umove_or_printaddr(tcp, arg, &caps))
125317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin			break;
126317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin
127317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin		tprintf("{max_adj=%d, n_alarm=%d, n_ext_ts=%d, n_per_out=%d, pps=%d}",
128317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin			caps.max_adj, caps.n_alarm, caps.n_ext_ts,
129317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin			caps.n_per_out, caps.pps);
130317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin		break;
131b88a6f877eb08e6d45130374fc1a1867371db703Stefan Sørensen	}
132317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin
133317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin	default:
134317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin		return RVAL_DECODED;
135317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin	}
136317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin
137317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin	return RVAL_DECODED | 1;
138b88a6f877eb08e6d45130374fc1a1867371db703Stefan Sørensen}
139