OSDN Git Service

firewire: Future proof the iso ioctls by adding a handle for the iso context.
authorKristian Høgsberg <krh@redhat.com>
Mon, 30 Apr 2007 19:03:14 +0000 (15:03 -0400)
committerStefan Richter <stefanr@s5r6.in-berlin.de>
Mon, 30 Apr 2007 21:08:13 +0000 (23:08 +0200)
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 <krh@redhat.com>
Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
drivers/firewire/fw-device-cdev.c
drivers/firewire/fw-device-cdev.h

index d2b867f..2910db6 100644 (file)
@@ -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);
 }
 
index f2355e0..026c768 100644 (file)
@@ -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 */