u64 bus_reset_closure;
struct fw_iso_context *iso_context;
+ u64 iso_closure;
struct fw_iso_buffer buffer;
unsigned long vm_start;
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);
return -EINVAL;
}
+ client->iso_closure = request->closure;
client->iso_context = fw_iso_context_create(client->device->card,
request->type,
request->channel,
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;
}
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
{
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;
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);
}
#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
*
__u32 header_size;
__u32 channel;
__u32 speed;
+ __u64 closure;
+ __u32 handle;
};
struct fw_cdev_iso_packet {
__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 */