xhci: Always use usb_hcd in URB instead of converting xhci_hcd.
authorSarah Sharp <sarah.a.sharp@linux.intel.com>
Tue, 26 Oct 2010 18:22:02 +0000 (11:22 -0700)
committerSarah Sharp <sarah.a.sharp@linux.intel.com>
Mon, 14 Mar 2011 01:07:13 +0000 (18:07 -0700)
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: Sarah Sharp <sarah.a.sharp@linux.intel.com>
drivers/usb/host/xhci-ring.c
drivers/usb/host/xhci.c

index 6bca2526d54aaf993387db8a04f658eb06222ad7..9e2b26c3da40e359e89fc0fa1de926e3499be3dd 100644 (file)
@@ -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 @@ cleanup:
                                        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;
index 883b4c402c6a5180255fe4809228c9b4d04500ae..a95108cba7d4b648f047bc83f899865f2272a20f 100644 (file)
@@ -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;
        }