|
@@ -495,6 +495,20 @@ void xhci_find_new_dequeue_state(struct xhci_hcd *xhci,
|
|
|
state->new_cycle_state = ~(state->new_cycle_state) & 0x1;
|
|
|
next_trb(xhci, ep_ring, &state->new_deq_seg, &state->new_deq_ptr);
|
|
|
|
|
|
+ /*
|
|
|
+ * If there is only one segment in a ring, find_trb_seg()'s while loop
|
|
|
+ * will not run, and it will return before it has a chance to see if it
|
|
|
+ * needs to toggle the cycle bit. It can't tell if the stalled transfer
|
|
|
+ * ended just before the link TRB on a one-segment ring, or if the TD
|
|
|
+ * wrapped around the top of the ring, because it doesn't have the TD in
|
|
|
+ * question. Look for the one-segment case where stalled TRB's address
|
|
|
+ * is greater than the new dequeue pointer address.
|
|
|
+ */
|
|
|
+ if (ep_ring->first_seg == ep_ring->first_seg->next &&
|
|
|
+ state->new_deq_ptr < dev->eps[ep_index].stopped_trb)
|
|
|
+ state->new_cycle_state ^= 0x1;
|
|
|
+ xhci_dbg(xhci, "Cycle state = 0x%x\n", state->new_cycle_state);
|
|
|
+
|
|
|
/* Don't update the ring cycle state for the producer (us). */
|
|
|
xhci_dbg(xhci, "New dequeue segment = %p (virtual)\n",
|
|
|
state->new_deq_seg);
|