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

Commit 15febf5e authored by Mathias Nyman's avatar Mathias Nyman Committed by Greg Kroah-Hartman
Browse files

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: default avatarMathias Nyman <mathias.nyman@linux.intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent a38fe338
Loading
Loading
Loading
Loading
+9 −11
Original line number Original line Diff line number Diff line
@@ -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);
	struct xhci_hcd *xhci = hcd_to_xhci(hcd);
	unsigned long flags;
	unsigned long flags;
	int ret = 0;
	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;
	struct urb_priv	*urb_priv;
	int num_tds;
	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;
	slot_id = urb->dev->slot_id;
	ep_index = xhci_get_endpoint_index(&urb->ep->desc);
	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 (!HCD_HW_ACCESSIBLE(hcd)) {
		if (!in_interrupt())
		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;
		ret = -ESHUTDOWN;
		goto free_priv;
		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)) {
	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);
					 slot_id, ep_index);
		break;
		break;
	case USB_ENDPOINT_XFER_BULK:
	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,
		ret = xhci_queue_bulk_tx(xhci, GFP_ATOMIC, urb,
					 slot_id, ep_index);
					 slot_id, ep_index);
		break;
		break;


	case USB_ENDPOINT_XFER_INT:
	case USB_ENDPOINT_XFER_INT:
		ret = xhci_queue_intr_tx(xhci, GFP_ATOMIC, urb,
		ret = xhci_queue_intr_tx(xhci, GFP_ATOMIC, urb,
				slot_id, ep_index);
				slot_id, ep_index);
		break;
		break;

	case USB_ENDPOINT_XFER_ISOC:
	case USB_ENDPOINT_XFER_ISOC:
		ret = xhci_queue_isoc_tx_prepare(xhci, GFP_ATOMIC, urb,
		ret = xhci_queue_isoc_tx_prepare(xhci, GFP_ATOMIC, urb,
				slot_id, ep_index);
				slot_id, ep_index);