From: =?utf-8?q?Kristian_H=C3=B8gsberg?= Subject: firewire: Future proof the iso ioctls by adding a handle for the iso context. Date: Mon, 30 Apr 2007 15:03:14 -0400 Currently create context always returns 0 and the other iso ioctls will expect user space to pass that in for subsequent ioctls. Signed-off-by: Kristian Høgsberg Signed-off-by: Stefan Richter --- drivers/firewire/fw-device-cdev.c | 16 ++++++++++++++-- drivers/firewire/fw-device-cdev.h | 12 ++++++++++-- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/drivers/firewire/fw-device-cdev.c b/drivers/firewire/fw-device-cdev.c index d2b867f..2910db6 100644 --- a/drivers/firewire/fw-device-cdev.c +++ b/drivers/firewire/fw-device-cdev.c @@ -80,6 +80,7 @@ struct client { u64 bus_reset_closure; struct fw_iso_context *iso_context; + u64 iso_closure; struct fw_iso_buffer buffer; unsigned long vm_start; @@ -626,7 +627,7 @@ iso_callback(struct fw_iso_context *context, u32 cycle, return; interrupt->interrupt.type = FW_CDEV_EVENT_ISO_INTERRUPT; - interrupt->interrupt.closure = 0; + interrupt->interrupt.closure = client->iso_closure; interrupt->interrupt.cycle = cycle; interrupt->interrupt.header_length = header_length; memcpy(interrupt->interrupt.header, header, header_length); @@ -659,6 +660,7 @@ static int ioctl_create_iso_context(struct client *client, void *buffer) return -EINVAL; } + client->iso_closure = request->closure; client->iso_context = fw_iso_context_create(client->device->card, request->type, request->channel, @@ -668,6 +670,9 @@ static int ioctl_create_iso_context(struct client *client, void *buffer) if (IS_ERR(client->iso_context)) return PTR_ERR(client->iso_context); + /* We only support one context at this time. */ + request->handle = 0; + return 0; } @@ -683,7 +688,7 @@ static int ioctl_queue_iso(struct client *client, void *buffer) u8 header[256]; } u; - if (ctx == NULL) + if (ctx == NULL || request->handle != 0) return -EINVAL; /* If the user passes a non-NULL data pointer, has mmap()'ed @@ -759,6 +764,8 @@ static int ioctl_start_iso(struct client *client, void *buffer) { struct fw_cdev_start_iso *request = buffer; + if (request->handle != 0) + return -EINVAL; if (client->iso_context->type == FW_ISO_CONTEXT_RECEIVE) { if (request->tags == 0 || request->tags > 15) return -EINVAL; @@ -773,6 +780,11 @@ static int ioctl_start_iso(struct client *client, void *buffer) static int ioctl_stop_iso(struct client *client, void *buffer) { + struct fw_cdev_stop_iso *request = buffer; + + if (request->handle != 0) + return -EINVAL; + return fw_iso_context_stop(client->iso_context); } diff --git a/drivers/firewire/fw-device-cdev.h b/drivers/firewire/fw-device-cdev.h index f2355e0..026c768 100644 --- a/drivers/firewire/fw-device-cdev.h +++ b/drivers/firewire/fw-device-cdev.h @@ -133,10 +133,10 @@ union fw_cdev_event { #define FW_CDEV_IOC_ADD_DESCRIPTOR _IOWR('#', 0x06, struct fw_cdev_add_descriptor) #define FW_CDEV_IOC_REMOVE_DESCRIPTOR _IOW('#', 0x07, struct fw_cdev_remove_descriptor) -#define FW_CDEV_IOC_CREATE_ISO_CONTEXT _IOW('#', 0x08, struct fw_cdev_create_iso_context) +#define FW_CDEV_IOC_CREATE_ISO_CONTEXT _IOWR('#', 0x08, struct fw_cdev_create_iso_context) #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_STOP_ISO _IO('#', 0x0b) +#define FW_CDEV_IOC_STOP_ISO _IOW('#', 0x0b, struct fw_cdev_stop_iso) /* FW_CDEV_VERSION History * @@ -233,6 +233,8 @@ struct fw_cdev_create_iso_context { __u32 header_size; __u32 channel; __u32 speed; + __u64 closure; + __u32 handle; }; struct fw_cdev_iso_packet { @@ -249,12 +251,18 @@ struct fw_cdev_queue_iso { __u64 packets; __u64 data; __u32 size; + __u32 handle; }; struct fw_cdev_start_iso { __s32 cycle; __u32 sync; __u32 tags; + __u32 handle; +}; + +struct fw_cdev_stop_iso { + __u32 handle; }; #endif /* __fw_cdev_h */ -- 1.5.0.5