From df935336aeb675e60d4ee1ffe8805c6d95732bdf Mon Sep 17 00:00:00 2001 From: Alex He Date: Fri, 3 Jun 2011 15:58:25 +0800 Subject: [PATCH] --- yaml --- r: 254155 b: refs/heads/master c: e1cf486d881d853d710e2d86a7adfc5fd260990f h: refs/heads/master i: 254153: 97dcaa803677b66ae3abb117471de76b8d4f43a7 254151: 9e3a1c430cbb4a4fdea7ba913f97e0923f807049 v: v3 --- [refs] | 2 +- trunk/drivers/usb/host/xhci-ring.c | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index da2de2629b3b..2cc580e9d0ef 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: d23336329fa4c157ed6256d4279a73b87486a1b6 +refs/heads/master: e1cf486d881d853d710e2d86a7adfc5fd260990f diff --git a/trunk/drivers/usb/host/xhci-ring.c b/trunk/drivers/usb/host/xhci-ring.c index 800f417c7309..0c008497edfd 100644 --- a/trunk/drivers/usb/host/xhci-ring.c +++ b/trunk/drivers/usb/host/xhci-ring.c @@ -2063,6 +2063,20 @@ static int handle_tx_event(struct xhci_hcd *xhci, /* Is this a TRB in the currently executing TD? */ event_seg = trb_in_td(ep_ring->deq_seg, ep_ring->dequeue, td->last_trb, event_dma); + + /* + * Skip the Force Stopped Event. The event_trb(event_dma) of FSE + * is not in the current TD pointed by ep_ring->dequeue because + * that the hardware dequeue pointer still at the previous TRB + * of the current TD. The previous TRB maybe a Link TD or the + * last TRB of the previous TD. The command completion handle + * will take care the rest. + */ + if (!event_seg && trb_comp_code == COMP_STOP_INVAL) { + ret = 0; + goto cleanup; + } + if (!event_seg) { if (!ep->skip || !usb_endpoint_xfer_isoc(&td->urb->ep->desc)) {