diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/usb/host/xhci-ring.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c index 800f417c7309..0c008497edfd 100644 --- a/drivers/usb/host/xhci-ring.c +++ b/drivers/usb/host/xhci-ring.c | |||
@@ -2063,6 +2063,20 @@ static int handle_tx_event(struct xhci_hcd *xhci, | |||
2063 | /* Is this a TRB in the currently executing TD? */ | 2063 | /* Is this a TRB in the currently executing TD? */ |
2064 | event_seg = trb_in_td(ep_ring->deq_seg, ep_ring->dequeue, | 2064 | event_seg = trb_in_td(ep_ring->deq_seg, ep_ring->dequeue, |
2065 | td->last_trb, event_dma); | 2065 | td->last_trb, event_dma); |
2066 | |||
2067 | /* | ||
2068 | * Skip the Force Stopped Event. The event_trb(event_dma) of FSE | ||
2069 | * is not in the current TD pointed by ep_ring->dequeue because | ||
2070 | * that the hardware dequeue pointer still at the previous TRB | ||
2071 | * of the current TD. The previous TRB maybe a Link TD or the | ||
2072 | * last TRB of the previous TD. The command completion handle | ||
2073 | * will take care the rest. | ||
2074 | */ | ||
2075 | if (!event_seg && trb_comp_code == COMP_STOP_INVAL) { | ||
2076 | ret = 0; | ||
2077 | goto cleanup; | ||
2078 | } | ||
2079 | |||
2066 | if (!event_seg) { | 2080 | if (!event_seg) { |
2067 | if (!ep->skip || | 2081 | if (!ep->skip || |
2068 | !usb_endpoint_xfer_isoc(&td->urb->ep->desc)) { | 2082 | !usb_endpoint_xfer_isoc(&td->urb->ep->desc)) { |