OSDN Git Service

xhci: refactor xhci_urb_enqueue a bit with minor changes
authorMathias Nyman <mathias.nyman@linux.intel.com>
Fri, 16 Mar 2018 14:33:03 +0000 (16:33 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 16 Mar 2018 14:40:18 +0000 (15:40 +0100)
make the local ep_state variable a pointer to the actual ring ep_state.
This allows us to read fresh ep_state values every time, will be useful
later.

Also move the streams check out from bulk only case. Even if only
bulk tranfers can use streams we shouldn't continue if those flags
are set. Main reason for this change is really code readability and
grouping functionality

Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/host/xhci.c

index 25d4b74..f9d8a32 100644 (file)
@@ -1287,7 +1287,8 @@ static int xhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, gfp_t mem_flag
        struct xhci_hcd *xhci = hcd_to_xhci(hcd);
        unsigned long flags;
        int ret = 0;
-       unsigned int slot_id, ep_index, ep_state;
+       unsigned int slot_id, ep_index;
+       unsigned int *ep_state;
        struct urb_priv *urb_priv;
        int num_tds;
 
@@ -1297,6 +1298,7 @@ static int xhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, gfp_t mem_flag
 
        slot_id = urb->dev->slot_id;
        ep_index = xhci_get_endpoint_index(&urb->ep->desc);
+       ep_state = &xhci->devs[slot_id]->eps[ep_index].ep_state;
 
        if (!HCD_HW_ACCESSIBLE(hcd)) {
                if (!in_interrupt())
@@ -1348,6 +1350,12 @@ static int xhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, gfp_t mem_flag
                ret = -ESHUTDOWN;
                goto free_priv;
        }
+       if (*ep_state & (EP_GETTING_STREAMS | EP_GETTING_NO_STREAMS)) {
+               xhci_warn(xhci, "WARN: Can't enqueue URB, ep in streams transition state %x\n",
+                         *ep_state);
+               ret = -EINVAL;
+               goto free_priv;
+       }
 
        switch (usb_endpoint_type(&urb->ep->desc)) {
 
@@ -1356,23 +1364,13 @@ static int xhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, gfp_t mem_flag
                                         slot_id, ep_index);
                break;
        case USB_ENDPOINT_XFER_BULK:
-               ep_state = xhci->devs[slot_id]->eps[ep_index].ep_state;
-               if (ep_state & (EP_GETTING_STREAMS | EP_GETTING_NO_STREAMS)) {
-                       xhci_warn(xhci, "WARN: Can't enqueue URB, ep in streams transition state %x\n",
-                                 ep_state);
-                       ret = -EINVAL;
-                       break;
-               }
                ret = xhci_queue_bulk_tx(xhci, GFP_ATOMIC, urb,
                                         slot_id, ep_index);
                break;
-
-
        case USB_ENDPOINT_XFER_INT:
                ret = xhci_queue_intr_tx(xhci, GFP_ATOMIC, urb,
                                slot_id, ep_index);
                break;
-
        case USB_ENDPOINT_XFER_ISOC:
                ret = xhci_queue_isoc_tx_prepare(xhci, GFP_ATOMIC, urb,
                                slot_id, ep_index);