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