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

Commit 214f76f7 authored by Sarah Sharp's avatar Sarah Sharp
Browse files

xhci: Always use usb_hcd in URB instead of converting xhci_hcd.



Make sure to call into the USB core's link, unlink, and giveback URB
functions with the usb_hcd pointer found by using urb->dev->bus.  This
will avoid confusion later, when the xHCI driver will deal with URBs from
two separate buses (the USB 3.0 roothub and the faked USB 2.0 roothub).

Assume xhci_urb_dequeue() will be called with the proper usb_hcd.

Signed-off-by: default avatarSarah Sharp <sarah.a.sharp@linux.intel.com>
parent aa1b13ef
Loading
Loading
Loading
Loading
+5 −4
Original line number Diff line number Diff line
@@ -594,13 +594,14 @@ static inline void xhci_stop_watchdog_timer_in_irq(struct xhci_hcd *xhci,
static void xhci_giveback_urb_in_irq(struct xhci_hcd *xhci,
		struct xhci_td *cur_td, int status, char *adjective)
{
	struct usb_hcd *hcd = xhci_to_hcd(xhci);
	struct usb_hcd *hcd;
	struct urb	*urb;
	struct urb_priv	*urb_priv;

	urb = cur_td->urb;
	urb_priv = urb->hcpriv;
	urb_priv->td_cnt++;
	hcd = bus_to_hcd(urb->dev->bus);

	/* Only giveback urb when this is the last td in urb */
	if (urb_priv->td_cnt == urb_priv->length) {
@@ -1982,12 +1983,12 @@ static int handle_tx_event(struct xhci_hcd *xhci,
					trb_comp_code != COMP_BABBLE))
				xhci_urb_free_priv(xhci, urb_priv);

			usb_hcd_unlink_urb_from_ep(xhci_to_hcd(xhci), urb);
			usb_hcd_unlink_urb_from_ep(bus_to_hcd(urb->dev->bus), urb);
			xhci_dbg(xhci, "Giveback URB %p, len = %d, "
					"status = %d\n",
					urb, urb->actual_length, status);
			spin_unlock(&xhci->lock);
			usb_hcd_giveback_urb(xhci_to_hcd(xhci), urb, status);
			usb_hcd_giveback_urb(bus_to_hcd(urb->dev->bus), urb, status);
			spin_lock(&xhci->lock);
		}

@@ -2323,7 +2324,7 @@ static int prepare_transfer(struct xhci_hcd *xhci,
	INIT_LIST_HEAD(&td->cancelled_td_list);

	if (td_index == 0) {
		ret = usb_hcd_link_urb_to_ep(xhci_to_hcd(xhci), urb);
		ret = usb_hcd_link_urb_to_ep(bus_to_hcd(urb->dev->bus), urb);
		if (unlikely(ret)) {
			xhci_urb_free_priv(xhci, urb_priv);
			urb->hcpriv = NULL;
+1 −1
Original line number Diff line number Diff line
@@ -1154,7 +1154,7 @@ int xhci_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status)

		usb_hcd_unlink_urb_from_ep(hcd, urb);
		spin_unlock_irqrestore(&xhci->lock, flags);
		usb_hcd_giveback_urb(xhci_to_hcd(xhci), urb, -ESHUTDOWN);
		usb_hcd_giveback_urb(hcd, urb, -ESHUTDOWN);
		xhci_urb_free_priv(xhci, urb_priv);
		return ret;
	}