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: Sarah Sharp <sarah.a.sharp@linux.intel.com>
This commit is contained in:
parent
aa1b13efb7
commit
214f76f7d9
|
@ -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,
|
static void xhci_giveback_urb_in_irq(struct xhci_hcd *xhci,
|
||||||
struct xhci_td *cur_td, int status, char *adjective)
|
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 *urb;
|
||||||
struct urb_priv *urb_priv;
|
struct urb_priv *urb_priv;
|
||||||
|
|
||||||
urb = cur_td->urb;
|
urb = cur_td->urb;
|
||||||
urb_priv = urb->hcpriv;
|
urb_priv = urb->hcpriv;
|
||||||
urb_priv->td_cnt++;
|
urb_priv->td_cnt++;
|
||||||
|
hcd = bus_to_hcd(urb->dev->bus);
|
||||||
|
|
||||||
/* Only giveback urb when this is the last td in urb */
|
/* Only giveback urb when this is the last td in urb */
|
||||||
if (urb_priv->td_cnt == urb_priv->length) {
|
if (urb_priv->td_cnt == urb_priv->length) {
|
||||||
|
@ -1982,12 +1983,12 @@ cleanup:
|
||||||
trb_comp_code != COMP_BABBLE))
|
trb_comp_code != COMP_BABBLE))
|
||||||
xhci_urb_free_priv(xhci, urb_priv);
|
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, "
|
xhci_dbg(xhci, "Giveback URB %p, len = %d, "
|
||||||
"status = %d\n",
|
"status = %d\n",
|
||||||
urb, urb->actual_length, status);
|
urb, urb->actual_length, status);
|
||||||
spin_unlock(&xhci->lock);
|
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);
|
spin_lock(&xhci->lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2323,7 +2324,7 @@ static int prepare_transfer(struct xhci_hcd *xhci,
|
||||||
INIT_LIST_HEAD(&td->cancelled_td_list);
|
INIT_LIST_HEAD(&td->cancelled_td_list);
|
||||||
|
|
||||||
if (td_index == 0) {
|
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)) {
|
if (unlikely(ret)) {
|
||||||
xhci_urb_free_priv(xhci, urb_priv);
|
xhci_urb_free_priv(xhci, urb_priv);
|
||||||
urb->hcpriv = NULL;
|
urb->hcpriv = NULL;
|
||||||
|
|
|
@ -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);
|
usb_hcd_unlink_urb_from_ep(hcd, urb);
|
||||||
spin_unlock_irqrestore(&xhci->lock, flags);
|
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);
|
xhci_urb_free_priv(xhci, urb_priv);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue