aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorAlex He <alex.he@amd.com>2011-06-03 03:58:25 -0400
committerSarah Sharp <sarah.a.sharp@linux.intel.com>2011-06-15 17:37:14 -0400
commite1cf486d881d853d710e2d86a7adfc5fd260990f (patch)
tree73d63dac735e213e1aee47f1ebbbbd02d62e086d /drivers
parentd23336329fa4c157ed6256d4279a73b87486a1b6 (diff)
xHCI 1.0: Force Stopped Event(FSE)
FSE shall occur on the TD natural boundary. The software ep_ring dequeue pointer exceed the hardware ep_ring dequeue pointer in these cases of Table-3. As a result, the event_trb(pointed by hardware dequeue pointer) of the FSE can't be found in the current TD(pointed by software dequeue pointer). What should we do is to figured out the FSE case and skip over it. Signed-off-by: Alex He <alex.he@amd.com> Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/usb/host/xhci-ring.c14
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)) {