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

Commit 079cdb09 authored by Arvid Brodin's avatar Arvid Brodin Committed by Greg Kroah-Hartman
Browse files

usb/isp1760: Move function isp1760_endpoint_disable() within file.



Preparation for patch #2. The function isp1760_endpoint_disable() does almost
the same thing as urb_dequeue(). In patch #2 I change these to use a common
helper function instead of calling each other - for clarity but also to
avoid releasing the spinlock while in a "questionable" state. It seemed
proper to have these functions close to each other in the code.

Signed-off-by: default avatarArvid Brodin <arvid.brodin@enea.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 69fff59d
Loading
Loading
Loading
Loading
+34 −34
Original line number Diff line number Diff line
@@ -1558,6 +1558,40 @@ static int isp1760_urb_dequeue(struct usb_hcd *hcd, struct urb *urb,
	return retval;
}

static void isp1760_endpoint_disable(struct usb_hcd *hcd,
		struct usb_host_endpoint *ep)
{
	struct isp1760_hcd *priv = hcd_to_priv(hcd);
	struct isp1760_qh *qh;
	struct isp1760_qtd *qtd;
	unsigned long spinflags;
	int do_iter;

	spin_lock_irqsave(&priv->lock, spinflags);
	qh = ep->hcpriv;
	if (!qh)
		goto out;

	do_iter = !list_empty(&qh->qtd_list);
	while (do_iter) {
		do_iter = 0;
		list_for_each_entry(qtd, &qh->qtd_list, qtd_list) {
			if (qtd->urb->ep == ep) {
				spin_unlock_irqrestore(&priv->lock, spinflags);
				isp1760_urb_dequeue(hcd, qtd->urb, -ECONNRESET);
				spin_lock_irqsave(&priv->lock, spinflags);
				do_iter = 1;
				break; /* Restart iteration */
			}
		}
	}
	ep->hcpriv = NULL;
	/* Cannot free qh here since it will be parsed by schedule_ptds() */

out:
	spin_unlock_irqrestore(&priv->lock, spinflags);
}

static int isp1760_hub_status_data(struct usb_hcd *hcd, char *buf)
{
	struct isp1760_hcd *priv = hcd_to_priv(hcd);
@@ -1927,40 +1961,6 @@ static int isp1760_hub_control(struct usb_hcd *hcd, u16 typeReq,
	return retval;
}

static void isp1760_endpoint_disable(struct usb_hcd *hcd,
		struct usb_host_endpoint *ep)
{
	struct isp1760_hcd *priv = hcd_to_priv(hcd);
	struct isp1760_qh *qh;
	struct isp1760_qtd *qtd;
	unsigned long spinflags;
	int do_iter;

	spin_lock_irqsave(&priv->lock, spinflags);
	qh = ep->hcpriv;
	if (!qh)
		goto out;

	do_iter = !list_empty(&qh->qtd_list);
	while (do_iter) {
		do_iter = 0;
		list_for_each_entry(qtd, &qh->qtd_list, qtd_list) {
			if (qtd->urb->ep == ep) {
				spin_unlock_irqrestore(&priv->lock, spinflags);
				isp1760_urb_dequeue(hcd, qtd->urb, -ECONNRESET);
				spin_lock_irqsave(&priv->lock, spinflags);
				do_iter = 1;
				break; /* Restart iteration */
			}
		}
	}
	ep->hcpriv = NULL;
	/* Cannot free qh here since it will be parsed by schedule_ptds() */

out:
	spin_unlock_irqrestore(&priv->lock, spinflags);
}

static int isp1760_get_frame(struct usb_hcd *hcd)
{
	struct isp1760_hcd *priv = hcd_to_priv(hcd);