aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/firewire/core-cdev.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/firewire/core-cdev.c')
-rw-r--r--drivers/firewire/core-cdev.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/drivers/firewire/core-cdev.c b/drivers/firewire/core-cdev.c
index 31863cf8b6c4..f40098dec14b 100644
--- a/drivers/firewire/core-cdev.c
+++ b/drivers/firewire/core-cdev.c
@@ -50,8 +50,9 @@
50/* 50/*
51 * ABI version history is documented in linux/firewire-cdev.h. 51 * ABI version history is documented in linux/firewire-cdev.h.
52 */ 52 */
53#define FW_CDEV_KERNEL_VERSION 4 53#define FW_CDEV_KERNEL_VERSION 4
54#define FW_CDEV_VERSION_EVENT_REQUEST2 4 54#define FW_CDEV_VERSION_EVENT_REQUEST2 4
55#define FW_CDEV_VERSION_ALLOCATE_REGION_END 4
55 56
56struct client { 57struct client {
57 u32 version; 58 u32 version;
@@ -773,7 +774,11 @@ static int ioctl_allocate(struct client *client, union ioctl_arg *arg)
773 return -ENOMEM; 774 return -ENOMEM;
774 775
775 region.start = a->offset; 776 region.start = a->offset;
776 region.end = a->offset + a->length; 777 if (client->version < FW_CDEV_VERSION_ALLOCATE_REGION_END)
778 region.end = a->offset + a->length;
779 else
780 region.end = a->region_end;
781
777 r->handler.length = a->length; 782 r->handler.length = a->length;
778 r->handler.address_callback = handle_request; 783 r->handler.address_callback = handle_request;
779 r->handler.callback_data = r; 784 r->handler.callback_data = r;
@@ -785,6 +790,7 @@ static int ioctl_allocate(struct client *client, union ioctl_arg *arg)
785 kfree(r); 790 kfree(r);
786 return ret; 791 return ret;
787 } 792 }
793 a->offset = r->handler.offset;
788 794
789 r->resource.release = release_address_handler; 795 r->resource.release = release_address_handler;
790 ret = add_client_resource(client, &r->resource, GFP_KERNEL); 796 ret = add_client_resource(client, &r->resource, GFP_KERNEL);