mirror of https://gitee.com/openkylin/linux.git
xhci: refactor xhci_urb_enqueue a bit with minor changes
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>
This commit is contained in:
parent
a38fe33889
commit
15febf5eed
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue