aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/firewire/fw-device-cdev.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/firewire/fw-device-cdev.c')
-rw-r--r--drivers/firewire/fw-device-cdev.c16
1 files changed, 14 insertions, 2 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