Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9472316b authored by Kristian Høgsberg's avatar Kristian Høgsberg Committed by Stefan Richter
Browse files

firewire: Implement deallocation of address ranges.

parent eb0306ea
Loading
Loading
Loading
Loading
+28 −0
Original line number Diff line number Diff line
@@ -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:
+11 −6
Original line number Diff line number Diff line
@@ -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