Thread (57 messages) 57 messages, 13 authors, 2010-09-22

Re: [PATCH 1/5] ptp: Added a brand new class driver for ptp clocks.

From: Arnd Bergmann <hidden>
Date: 2010-08-16 14:26:28
Also in: linux-arm-kernel, linuxppc-dev, lkml, netdev

On Monday 16 August 2010, Richard Cochran wrote:
This patch adds an infrastructure for hardware clocks that implement
IEEE 1588, the Precision Time Protocol (PTP). A class driver offers a
registration method to particular hardware clock drivers. Each clock is
exposed to user space as a character device with ioctls that allow tuning
of the PTP clock.
Have you considered integrating the subsystem into the Posix clock/timer
framework?

I can't really tell from reading the source if this is possible or
not, but my feeling is that if it can be done, that would be a much
nicer interface. We already have clock_gettime/clock_settime/
timer_settime/... system calls, and while you'd need to add another
clockid and some syscalls, my feeling is that it will be more
usable in the end.
+static const struct file_operations ptp_fops = {
+       .owner          = THIS_MODULE,
+       .ioctl          = ptp_ioctl,
+       .open           = ptp_open,
+       .poll           = ptp_poll,
+       .read           = ptp_read,
+       .release        = ptp_release,
+};
.ioctl is gone, you have to use .unlocked_ioctl and make sure that
your ptp_ioctl function can handle being called concurrently.

You should also add a .compat_ioctl function, ideally one that
points to ptp_ioctl so you don't have to list every command as
being compatible. Right now, some commands are incompatible,
which means you need more changes to the interface.
+struct ptp_clock_timer {
+       int alarm_index;       /* Which alarm to query or configure. */
+       int signum;            /* Requested signal. */
+       int flags;             /* Zero or TIMER_ABSTIME, see TIMER_SETTIME(2) */
+       struct itimerspec tsp; /* See TIMER_SETTIME(2) */
+};
This data structure is incompatible between 32 and 64 bit user space,
so you would need a compat_ioctl() function to convert between the
two formats. Better define the structure in a compatible way, avoiding
variable-length fields and implicit padding.
+struct ptp_clock_request {
+       int type;  /* One of the ptp_request_types enumeration values. */
+       int index; /* Which channel to configure. */
+       struct timespec ts; /* For period signals, the desired period. */
+       int flags; /* Bit field for PTP_ENABLE_FEATURE or other flags. */
+};
Same problem here, timespec is either 64 or 128 bits long and has different
alignment.
+struct ptp_extts_event {
+       int index;
+       struct timespec ts;
+};
here too.
+#define PTP_CLOCK_VERSION 0x00000001
+
+#define PTP_CLK_MAGIC '='
+
+#define PTP_CLOCK_APIVERS _IOR (PTP_CLK_MAGIC, 1, __u32)
Try avoiding versioned ABIs. It's better to just add new ioctls
or syscalls when you need some extra functionality and leave the
old ones around.
+#define PTP_CLOCK_ADJTIME _IOW (PTP_CLK_MAGIC, 3, struct timespec)
+#define PTP_CLOCK_GETTIME _IOR (PTP_CLK_MAGIC, 4, struct timespec)
+#define PTP_CLOCK_SETTIME _IOW (PTP_CLK_MAGIC, 5, struct timespec)
These are also incompatible.

	Arnd
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help