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

Commit 7fa68034 authored by Michal Nazarewicz's avatar Michal Nazarewicz Committed by Felipe Balbi
Browse files

usb: gadget: f_fs: remove loop from I/O function



When endpoint changes (due to it being disabled or alt setting changed),
mimic the action as if the change happened after the request has been
queued, instead of retrying with the new endpoint.

Signed-off-by: default avatarMichal Nazarewicz <mina86@mina86.com>
Cc: David Cohen <david.a.cohen@linux.intel.com>
Signed-off-by: default avatarFelipe Balbi <balbi@ti.com>
parent 0b2d2bba
Loading
Loading
Loading
Loading
+40 −54
Original line number Original line Diff line number Diff line
@@ -758,12 +758,6 @@ static ssize_t ffs_epfile_io(struct file *file,
	ssize_t ret;
	ssize_t ret;
	int halt;
	int halt;


	goto first_try;
	do {
		spin_unlock_irq(&epfile->ffs->eps_lock);
		mutex_unlock(&epfile->mutex);

first_try:
	/* Are we still active? */
	/* Are we still active? */
	if (WARN_ON(epfile->ffs->state != FFS_ACTIVE)) {
	if (WARN_ON(epfile->ffs->state != FFS_ACTIVE)) {
		ret = -ENODEV;
		ret = -ENODEV;
@@ -778,8 +772,8 @@ static ssize_t ffs_epfile_io(struct file *file,
			goto error;
			goto error;
		}
		}


			if (wait_event_interruptible(epfile->wait,
		ret = wait_event_interruptible(epfile->wait, (ep = epfile->ep));
						     (ep = epfile->ep))) {
		if (ret) {
			ret = -EINTR;
			ret = -EINTR;
			goto error;
			goto error;
		}
		}
@@ -793,38 +787,30 @@ static ssize_t ffs_epfile_io(struct file *file,
	}
	}


	/* Allocate & copy */
	/* Allocate & copy */
		if (!halt && !data) {
	if (!halt) {
			data = kzalloc(len, GFP_KERNEL);
		data = kmalloc(len, GFP_KERNEL);
		if (unlikely(!data))
		if (unlikely(!data))
			return -ENOMEM;
			return -ENOMEM;


			if (!read &&
		if (!read && unlikely(copy_from_user(data, buf, len))) {
			    unlikely(__copy_from_user(data, buf, len))) {
			ret = -EFAULT;
			ret = -EFAULT;
			goto error;
			goto error;
		}
		}
	}
	}


	/* We will be using request */
	/* We will be using request */
		ret = ffs_mutex_lock(&epfile->mutex,
	ret = ffs_mutex_lock(&epfile->mutex, file->f_flags & O_NONBLOCK);
				     file->f_flags & O_NONBLOCK);
	if (unlikely(ret))
	if (unlikely(ret))
		goto error;
		goto error;


		/*
		 * We're called from user space, we can use _irq rather then
		 * _irqsave
		 */
	spin_lock_irq(&epfile->ffs->eps_lock);
	spin_lock_irq(&epfile->ffs->eps_lock);


		/*
	if (epfile->ep != ep) {
		 * While we were acquiring mutex endpoint got disabled
		/* In the meantime, endpoint got disabled or changed. */
		 * or changed?
		ret = -ESHUTDOWN;
		 */
		spin_unlock_irq(&epfile->ffs->eps_lock);
	} while (unlikely(epfile->ep != ep));
	} else if (halt) {

		/* Halt */
		/* Halt */
	if (unlikely(halt)) {
		if (likely(epfile->ep == ep) && !WARN_ON(!ep->ep))
		if (likely(epfile->ep == ep) && !WARN_ON(!ep->ep))
			usb_ep_set_halt(ep->ep);
			usb_ep_set_halt(ep->ep);
		spin_unlock_irq(&epfile->ffs->eps_lock);
		spin_unlock_irq(&epfile->ffs->eps_lock);