aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/firewire
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/firewire')
-rw-r--r--drivers/firewire/fw-device-cdev.c16
-rw-r--r--drivers/firewire/fw-device-cdev.h12
2 files changed, 24 insertions, 4 deletions
diff --git a/drivers/firewire/fw-device-cdev.c b/drivers/firewire/fw-device-cdev.c
index d2b867f44348..2910db69ec2c 100644
--- a/drivers/firewire/fw-device-cdev.c
+++ b/drivers/firewire/fw-device-cdev.c
@@ -80,6 +80,7 @@ struct client {
80 u64 bus_reset_closure; 80 u64 bus_reset_closure;
81 81
82 struct fw_iso_context *iso_context; 82 struct fw_iso_context *iso_context;
83 u64 iso_closure;
83 struct fw_iso_buffer buffer; 84 struct fw_iso_buffer buffer;
84 unsigned long vm_start; 85 unsigned long vm_start;
85 86
@@ -626,7 +627,7 @@ iso_callback(struct fw_iso_context *context, u32 cycle,
626 return; 627 return;
627 628
628 interrupt->interrupt.type = FW_CDEV_EVENT_ISO_INTERRUPT; 629 interrupt->interrupt.type = FW_CDEV_EVENT_ISO_INTERRUPT;
629 interrupt->interrupt.closure = 0; 630 interrupt->interrupt.closure = client->iso_closure;
630 interrupt->interrupt.cycle = cycle; 631 interrupt->interrupt.cycle = cycle;
631 interrupt->interrupt.header_length = header_length; 632 interrupt->interrupt.header_length = header_length;
632 memcpy(interrupt->interrupt.header, header, header_length); 633 memcpy(interrupt->interrupt.header, header, header_length);
@@ -659,6 +660,7 @@ static int ioctl_create_iso_context(struct client *client, void *buffer)
659 return -EINVAL; 660 return -EINVAL;
660 } 661 }
661 662
663 client->iso_closure = request->closure;
662 client->iso_context = fw_iso_context_create(client->device->card, 664 client->iso_context = fw_iso_context_create(client->device->card,
663 request->type, 665 request->type,
664 request->channel, 666 request->channel,
@@ -668,6 +670,9 @@ static int ioctl_create_iso_context(struct client *client, void *buffer)
668 if (IS_ERR(client->iso_context)) 670 if (IS_ERR(client->iso_context))
669 return PTR_ERR(client->iso_context); 671 return PTR_ERR(client->iso_context);
670 672
673 /* We only support one context at this time. */
674 request->handle = 0;
675
671 return 0; 676 return 0;
672} 677}
673 678
@@ -683,7 +688,7 @@ static int ioctl_queue_iso(struct client *client, void *buffer)
683 u8 header[256]; 688 u8 header[256];
684 } u; 689 } u;
685 690
686 if (ctx == NULL) 691 if (ctx == NULL || request->handle != 0)
687 return -EINVAL; 692 return -EINVAL;
688 693
689 /* If the user passes a non-NULL data pointer, has mmap()'ed 694 /* 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)
759{ 764{
760 struct fw_cdev_start_iso *request = buffer; 765 struct fw_cdev_start_iso *request = buffer;
761 766
767 if (request->handle != 0)
768 return -EINVAL;
762 if (client->iso_context->type == FW_ISO_CONTEXT_RECEIVE) { 769 if (client->iso_context->type == FW_ISO_CONTEXT_RECEIVE) {
763 if (request->tags == 0 || request->tags > 15) 770 if (request->tags == 0 || request->tags > 15)
764 return -EINVAL; 771 return -EINVAL;
@@ -773,6 +780,11 @@ static int ioctl_start_iso(struct client *client, void *buffer)
773 780
774static int ioctl_stop_iso(struct client *client, void *buffer) 781static int ioctl_stop_iso(struct client *client, void *buffer)
775{ 782{
783 struct fw_cdev_stop_iso *request = buffer;
784
785 if (request->handle != 0)
786 return -EINVAL;
787
776 return fw_iso_context_stop(client->iso_context); 788 return fw_iso_context_stop(client->iso_context);
777} 789}
778 790
diff --git a/drivers/firewire/fw-device-cdev.h b/drivers/firewire/fw-device-cdev.h
index f2355e034eb4..026c768e3bf1 100644
--- a/drivers/firewire/fw-device-cdev.h
+++ b/drivers/firewire/fw-device-cdev.h
@@ -133,10 +133,10 @@ union fw_cdev_event {
133#define FW_CDEV_IOC_ADD_DESCRIPTOR _IOWR('#', 0x06, struct fw_cdev_add_descriptor) 133#define FW_CDEV_IOC_ADD_DESCRIPTOR _IOWR('#', 0x06, struct fw_cdev_add_descriptor)
134#define FW_CDEV_IOC_REMOVE_DESCRIPTOR _IOW('#', 0x07, struct fw_cdev_remove_descriptor) 134#define FW_CDEV_IOC_REMOVE_DESCRIPTOR _IOW('#', 0x07, struct fw_cdev_remove_descriptor)
135 135
136#define FW_CDEV_IOC_CREATE_ISO_CONTEXT _IOW('#', 0x08, struct fw_cdev_create_iso_context) 136#define FW_CDEV_IOC_CREATE_ISO_CONTEXT _IOWR('#', 0x08, struct fw_cdev_create_iso_context)
137#define FW_CDEV_IOC_QUEUE_ISO _IOWR('#', 0x09, struct fw_cdev_queue_iso) 137#define FW_CDEV_IOC_QUEUE_ISO _IOWR('#', 0x09, struct fw_cdev_queue_iso)
138#define FW_CDEV_IOC_START_ISO _IOW('#', 0x0a, struct fw_cdev_start_iso) 138#define FW_CDEV_IOC_START_ISO _IOW('#', 0x0a, struct fw_cdev_start_iso)
139#define FW_CDEV_IOC_STOP_ISO _IO('#', 0x0b) 139#define FW_CDEV_IOC_STOP_ISO _IOW('#', 0x0b, struct fw_cdev_stop_iso)
140 140
141/* FW_CDEV_VERSION History 141/* FW_CDEV_VERSION History
142 * 142 *
@@ -233,6 +233,8 @@ struct fw_cdev_create_iso_context {
233 __u32 header_size; 233 __u32 header_size;
234 __u32 channel; 234 __u32 channel;
235 __u32 speed; 235 __u32 speed;
236 __u64 closure;
237 __u32 handle;
236}; 238};
237 239
238struct fw_cdev_iso_packet { 240struct fw_cdev_iso_packet {
@@ -249,12 +251,18 @@ struct fw_cdev_queue_iso {
249 __u64 packets; 251 __u64 packets;
250 __u64 data; 252 __u64 data;
251 __u32 size; 253 __u32 size;
254 __u32 handle;
252}; 255};
253 256
254struct fw_cdev_start_iso { 257struct fw_cdev_start_iso {
255 __s32 cycle; 258 __s32 cycle;
256 __u32 sync; 259 __u32 sync;
257 __u32 tags; 260 __u32 tags;
261 __u32 handle;
262};
263
264struct fw_cdev_stop_iso {
265 __u32 handle;
258}; 266};
259 267
260#endif /* __fw_cdev_h */ 268#endif /* __fw_cdev_h */