|
@@ -1934,8 +1934,10 @@ static int handle_tx_event(struct xhci_hcd *xhci,
|
|
|
int status = -EINPROGRESS;
|
|
|
struct urb_priv *urb_priv;
|
|
|
struct xhci_ep_ctx *ep_ctx;
|
|
|
+ struct list_head *tmp;
|
|
|
u32 trb_comp_code;
|
|
|
int ret = 0;
|
|
|
+ int td_num = 0;
|
|
|
|
|
|
slot_id = TRB_TO_SLOT_ID(le32_to_cpu(event->flags));
|
|
|
xdev = xhci->devs[slot_id];
|
|
@@ -1957,6 +1959,12 @@ static int handle_tx_event(struct xhci_hcd *xhci,
|
|
|
return -ENODEV;
|
|
|
}
|
|
|
|
|
|
+ /* Count current td numbers if ep->skip is set */
|
|
|
+ if (ep->skip) {
|
|
|
+ list_for_each(tmp, &ep_ring->td_list)
|
|
|
+ td_num++;
|
|
|
+ }
|
|
|
+
|
|
|
event_dma = le64_to_cpu(event->buffer);
|
|
|
trb_comp_code = GET_COMP_CODE(le32_to_cpu(event->transfer_len));
|
|
|
/* Look for common error cases */
|
|
@@ -2068,7 +2076,18 @@ static int handle_tx_event(struct xhci_hcd *xhci,
|
|
|
goto cleanup;
|
|
|
}
|
|
|
|
|
|
+ /* We've skipped all the TDs on the ep ring when ep->skip set */
|
|
|
+ if (ep->skip && td_num == 0) {
|
|
|
+ ep->skip = false;
|
|
|
+ xhci_dbg(xhci, "All tds on the ep_ring skipped. "
|
|
|
+ "Clear skip flag.\n");
|
|
|
+ ret = 0;
|
|
|
+ goto cleanup;
|
|
|
+ }
|
|
|
+
|
|
|
td = list_entry(ep_ring->td_list.next, struct xhci_td, td_list);
|
|
|
+ if (ep->skip)
|
|
|
+ td_num--;
|
|
|
|
|
|
/* Is this a TRB in the currently executing TD? */
|
|
|
event_seg = trb_in_td(ep_ring->deq_seg, ep_ring->dequeue,
|