diff options
Diffstat (limited to 'drivers/usb/host/xhci-ring.c')
| -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)) { |
