This is a note to let you know that I've just added the patch titled

    xhci: Fix cycle bit calculation during stall handling.

to the 2.6.32-longterm tree which can be found at:
    
http://www.kernel.org/git/?p=linux/kernel/git/longterm/longterm-queue-2.6.32.git;a=summary

The filename of the patch is:
     xhci-fix-cycle-bit-calculation-during-stall-handling.patch
and it can be found in the queue-2.6.32 subdirectory.

If you, or anyone else, feels it should not be added to the 2.6.32 longterm 
tree,
please let <[email protected]> know about it.


>From 01a1fdb9a7afa5e3c14c9316d6f380732750b4e4 Mon Sep 17 00:00:00 2001
From: Sarah Sharp <[email protected]>
Date: Wed, 23 Feb 2011 18:12:29 -0800
Subject: xhci: Fix cycle bit calculation during stall handling.

From: Sarah Sharp <[email protected]>

commit 01a1fdb9a7afa5e3c14c9316d6f380732750b4e4 upstream.

When an endpoint stalls, we need to update the xHCI host's internal
dequeue pointer to move it past the stalled transfer.  This includes
updating the cycle bit (TRB ownership bit) if we have moved the dequeue
pointer past a link TRB with the toggle cycle bit set.

When we're trying to find the new dequeue segment, find_trb_seg() is
supposed to keep track of whether we've passed any link TRBs with the
toggle cycle bit set.  However, this while loop's body

        while (cur_seg->trbs > trb ||
                        &cur_seg->trbs[TRBS_PER_SEGMENT - 1] < trb) {

Will never get executed if the ring only contains one segment.
find_trb_seg() will return immediately, without updating the new cycle
bit.  Since find_trb_seg() has no idea where in the segment the TD that
stalled was, make the caller, xhci_find_new_dequeue_state(), check for
this special case and update the cycle bit accordingly.

This patch should be queued to kernels all the way back to 2.6.31.

Signed-off-by: Sarah Sharp <[email protected]>
Tested-by: Takashi Iwai <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>

---
 drivers/usb/host/xhci-ring.c |   14 ++++++++++++++
 1 file changed, 14 insertions(+)

--- a/drivers/usb/host/xhci-ring.c
+++ b/drivers/usb/host/xhci-ring.c
@@ -417,6 +417,20 @@ void xhci_find_new_dequeue_state(struct
                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);


Patches currently in longterm-queue-2.6.32 which might be from 
[email protected] are

/home/gregkh/linux/longterm/longterm-queue-2.6.32/queue-2.6.32/xhci-fix-cycle-bit-calculation-during-stall-handling.patch

_______________________________________________
stable mailing list
[email protected]
http://linux.kernel.org/mailman/listinfo/stable

Reply via email to