aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@redhat.com>2007-03-14 17:34:55 -0400
committerStefan Richter <stefanr@s5r6.in-berlin.de>2007-03-15 18:21:36 +0100
commit9472316b6eab3500ded544f6e86700c33541ef4e (patch)
treef155121d72e4881793113ff1890fcc79f37a2c71
parenteb0306eac0aad0b7da18d8fbfb777f155b2c010d (diff)
firewire: Implement deallocation of address ranges.
Signed-off-by: Kristian Høgsberg <krh@redhat.com> Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
-rw-r--r--drivers/firewire/fw-device-cdev.c28
-rw-r--r--drivers/firewire/fw-device-cdev.h17
2 files changed, 39 insertions, 6 deletions
diff --git a/drivers/firewire/fw-device-cdev.c b/drivers/firewire/fw-device-cdev.c
index 175ea042ba3..ebf0d100805 100644
--- a/drivers/firewire/fw-device-cdev.c
+++ b/drivers/firewire/fw-device-cdev.c
@@ -467,6 +467,32 @@ static int ioctl_allocate(struct client *client, void __user *arg)
return 0;
}
+static int ioctl_deallocate(struct client *client, void __user *arg)
+{
+ struct fw_cdev_deallocate request;
+ struct address_handler *handler;
+ unsigned long flags;
+
+ if (copy_from_user(&request, arg, sizeof request))
+ return -EFAULT;
+
+ spin_lock_irqsave(&client->lock, flags);
+ list_for_each_entry(handler, &client->handler_list, link) {
+ if (handler->handler.offset == request.offset) {
+ list_del(&handler->link);
+ break;
+ }
+ }
+ spin_unlock_irqrestore(&client->lock, flags);
+
+ if (&handler->link == &client->handler_list)
+ return -EINVAL;
+
+ fw_core_remove_address_handler(&handler->handler);
+
+ return 0;
+}
+
static int ioctl_send_response(struct client *client, void __user *arg)
{
struct fw_cdev_send_response request;
@@ -696,6 +722,8 @@ dispatch_ioctl(struct client *client, unsigned int cmd, void __user *arg)
return ioctl_send_request(client, arg);
case FW_CDEV_IOC_ALLOCATE:
return ioctl_allocate(client, arg);
+ case FW_CDEV_IOC_DEALLOCATE:
+ return ioctl_deallocate(client, arg);
case FW_CDEV_IOC_SEND_RESPONSE:
return ioctl_send_response(client, arg);
case FW_CDEV_IOC_INITIATE_BUS_RESET:
diff --git a/drivers/firewire/fw-device-cdev.h b/drivers/firewire/fw-device-cdev.h
index 3437a360d7d..10b83222db6 100644
--- a/drivers/firewire/fw-device-cdev.h
+++ b/drivers/firewire/fw-device-cdev.h
@@ -113,12 +113,13 @@ struct fw_cdev_event_iso_interrupt {
#define FW_CDEV_IOC_GET_INFO _IO('#', 0x00)
#define FW_CDEV_IOC_SEND_REQUEST _IO('#', 0x01)
#define FW_CDEV_IOC_ALLOCATE _IO('#', 0x02)
-#define FW_CDEV_IOC_SEND_RESPONSE _IO('#', 0x03)
-#define FW_CDEV_IOC_INITIATE_BUS_RESET _IO('#', 0x04)
-#define FW_CDEV_IOC_CREATE_ISO_CONTEXT _IO('#', 0x05)
-#define FW_CDEV_IOC_QUEUE_ISO _IO('#', 0x06)
-#define FW_CDEV_IOC_START_ISO _IO('#', 0x07)
-#define FW_CDEV_IOC_STOP_ISO _IO('#', 0x08)
+#define FW_CDEV_IOC_DEALLOCATE _IO('#', 0x03)
+#define FW_CDEV_IOC_SEND_RESPONSE _IO('#', 0x04)
+#define FW_CDEV_IOC_INITIATE_BUS_RESET _IO('#', 0x05)
+#define FW_CDEV_IOC_CREATE_ISO_CONTEXT _IO('#', 0x06)
+#define FW_CDEV_IOC_QUEUE_ISO _IO('#', 0x07)
+#define FW_CDEV_IOC_START_ISO _IO('#', 0x08)
+#define FW_CDEV_IOC_STOP_ISO _IO('#', 0x09)
/* FW_CDEV_VERSION History
*
@@ -173,6 +174,10 @@ struct fw_cdev_allocate {
__u32 length;
};
+struct fw_cdev_deallocate {
+ __u64 offset;
+};
+
#define FW_CDEV_LONG_RESET 0
#define FW_CDEV_SHORT_RESET 1