firewire: adopt read cycle timer ABI from raw1394
This duplicates the read cycle timer feature of raw1394 (added in Linux 2.6.21) in firewire-core's userspace ABI. The argument to the ioctl is reordered though to ensure 32/64 bit compatibility. Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de> Signed-off-by: Kristian Høgsberg <krh@redhat.com>
This commit is contained in:
parent
02ff8f8ee1
commit
a64408b96b
2 changed files with 41 additions and 0 deletions
|
@ -25,11 +25,14 @@
|
||||||
#include <linux/device.h>
|
#include <linux/device.h>
|
||||||
#include <linux/vmalloc.h>
|
#include <linux/vmalloc.h>
|
||||||
#include <linux/poll.h>
|
#include <linux/poll.h>
|
||||||
|
#include <linux/preempt.h>
|
||||||
|
#include <linux/time.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/idr.h>
|
#include <linux/idr.h>
|
||||||
#include <linux/compat.h>
|
#include <linux/compat.h>
|
||||||
#include <linux/firewire-cdev.h>
|
#include <linux/firewire-cdev.h>
|
||||||
|
#include <asm/system.h>
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include "fw-transaction.h"
|
#include "fw-transaction.h"
|
||||||
#include "fw-topology.h"
|
#include "fw-topology.h"
|
||||||
|
@ -811,6 +814,28 @@ static int ioctl_stop_iso(struct client *client, void *buffer)
|
||||||
return fw_iso_context_stop(client->iso_context);
|
return fw_iso_context_stop(client->iso_context);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int ioctl_get_cycle_timer(struct client *client, void *buffer)
|
||||||
|
{
|
||||||
|
struct fw_cdev_get_cycle_timer *request = buffer;
|
||||||
|
struct fw_card *card = client->device->card;
|
||||||
|
unsigned long long bus_time;
|
||||||
|
struct timeval tv;
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
|
preempt_disable();
|
||||||
|
local_irq_save(flags);
|
||||||
|
|
||||||
|
bus_time = card->driver->get_bus_time(card);
|
||||||
|
do_gettimeofday(&tv);
|
||||||
|
|
||||||
|
local_irq_restore(flags);
|
||||||
|
preempt_enable();
|
||||||
|
|
||||||
|
request->local_time = tv.tv_sec * 1000000ULL + tv.tv_usec;
|
||||||
|
request->cycle_timer = bus_time & 0xffffffff;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int (* const ioctl_handlers[])(struct client *client, void *buffer) = {
|
static int (* const ioctl_handlers[])(struct client *client, void *buffer) = {
|
||||||
ioctl_get_info,
|
ioctl_get_info,
|
||||||
ioctl_send_request,
|
ioctl_send_request,
|
||||||
|
@ -824,6 +849,7 @@ static int (* const ioctl_handlers[])(struct client *client, void *buffer) = {
|
||||||
ioctl_queue_iso,
|
ioctl_queue_iso,
|
||||||
ioctl_start_iso,
|
ioctl_start_iso,
|
||||||
ioctl_stop_iso,
|
ioctl_stop_iso,
|
||||||
|
ioctl_get_cycle_timer,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
|
|
@ -178,6 +178,7 @@ union fw_cdev_event {
|
||||||
#define FW_CDEV_IOC_QUEUE_ISO _IOWR('#', 0x09, struct fw_cdev_queue_iso)
|
#define FW_CDEV_IOC_QUEUE_ISO _IOWR('#', 0x09, struct fw_cdev_queue_iso)
|
||||||
#define FW_CDEV_IOC_START_ISO _IOW('#', 0x0a, struct fw_cdev_start_iso)
|
#define FW_CDEV_IOC_START_ISO _IOW('#', 0x0a, struct fw_cdev_start_iso)
|
||||||
#define FW_CDEV_IOC_STOP_ISO _IOW('#', 0x0b, struct fw_cdev_stop_iso)
|
#define FW_CDEV_IOC_STOP_ISO _IOW('#', 0x0b, struct fw_cdev_stop_iso)
|
||||||
|
#define FW_CDEV_IOC_GET_CYCLE_TIMER _IOR('#', 0x0c, struct fw_cdev_get_cycle_timer)
|
||||||
|
|
||||||
/* FW_CDEV_VERSION History
|
/* FW_CDEV_VERSION History
|
||||||
*
|
*
|
||||||
|
@ -459,4 +460,18 @@ struct fw_cdev_stop_iso {
|
||||||
__u32 handle;
|
__u32 handle;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* struct fw_cdev_get_cycle_timer - read cycle timer register
|
||||||
|
* @local_time: system time, in microseconds since the Epoch
|
||||||
|
* @cycle_timer: isochronous cycle timer, as per OHCI 1.1 clause 5.13
|
||||||
|
*
|
||||||
|
* The %FW_CDEV_IOC_GET_CYCLE_TIMER ioctl reads the isochronous cycle timer
|
||||||
|
* and also the system clock. This allows to express the receive time of an
|
||||||
|
* isochronous packet as a system time with microsecond accuracy.
|
||||||
|
*/
|
||||||
|
struct fw_cdev_get_cycle_timer {
|
||||||
|
__u64 local_time;
|
||||||
|
__u32 cycle_timer;
|
||||||
|
};
|
||||||
|
|
||||||
#endif /* _LINUX_FIREWIRE_CDEV_H */
|
#endif /* _LINUX_FIREWIRE_CDEV_H */
|
||||||
|
|
Loading…
Reference in a new issue