Patch "Revert "xhci: don't finish a TD if we get a short-transfer event mid TD"" has been added to the 4.4-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
Revert "xhci: don't finish a TD if we get a short-transfer event mid TD"
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
revert-xhci-don-t-finish-a-td-if-we-get-a-short-transfer-event-mid-td.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
a6835090716a85f2297668ba593bd00e1051e662Mon Sep 17 00:00:00 2001
From: Mathias Nyman <[email protected]>
Date: Tue, 26 Jan 2016 17:50:04 +0200
Subject: Revert "xhci: don't finish a TD if we get a short-transfer event mid TD"
From: Mathias Nyman <[email protected]>
commit a6835090716a85f2297668ba593bd00e1051e662 upstream.
This reverts commit e210c422b6fd ("xhci: don't finish a TD if we get a short transfer event mid TD")
Turns out that most host controllers do not follow the xHCI specs and never send the second event for the last TRB in the TD if there was a short event mid-TD.
Returning the URB directly after the first short-transfer event is far better than never returning the URB. (class drivers usually timeout after 30sec). For the hosts that do send the second event we will go back to treating it as misplaced event and print an error message for it.
The origial patch was sent to stable kernels and needs to be reverted from there as well
--- drivers/usb/host/xhci-ring.c | 10 ---------- 1 file changed, 10 deletions(-)
drivers/usb/host/xhci-ring.c +0 -10
@@ -2192,10 +2192,6 @@ static int process_bulk_intr_td(struct x }/* Fast path - was this the last TRB in the TD for this URB? */ }else if (event_trb == td->last_trb) { -if (td->urb_length_set && trb_comp_code ==COMP_SHORT_TX ) -return finish_td (xhci, td, event_trb, event, ep, - status, false); -if (EVENT_TRB_LEN (le32_to_cpu (event->transfer_len)) !=0 ) { td->urb->actual_length = td->urb->transfer_buffer_length -
@@ -2247,12 +2243,6 @@ static int process_bulk_intr_td(struct x td->urb->actual_length +=TRB_LEN (le32_to_cpu (cur_trb->generic.field[2 ])) -EVENT_TRB_LEN (le32_to_cpu (event->transfer_len)); - -if (trb_comp_code ==COMP_SHORT_TX ) { -xhci_dbg (xhci,"mid bulk/intr SP, wait for last TRB event\n" ); - td->urb_length_set = true; -return 0 ; - } }return finish_td (xhci, td, event_trb, event, ep, status, false);
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/xhci-fix-list-corruption-in-urb-dequeue-at-host-removal.patch queue-4.4/revert-xhci-don-t-finish-a-td-if-we-get-a-short-transfer-event-mid-td.patch