Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

usb: xhci: Complete 'error mid TD' transfers when handling Missed Service

Missed Service Error after an error mid TD means that the failed TD has
already been passed by the xHC without acknowledgment of the final TRB,
a known hardware bug. So don't wait any more and give back the TD.

Reproduced on NEC uPD720200 under conditions of ludicrously bad USB link
quality, confirmed to behave as expected using dynamic debug.

Signed-off-by: Michal Pecio <michal.pecio@gmail.com>
Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
Link: https://lore.kernel.org/r/20250306144954.3507700-5-mathias.nyman@linux.intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Michal Pecio and committed by
Greg Kroah-Hartman
bfa84599 58d0a3fa

+5 -1
+5 -1
drivers/usb/host/xhci-ring.c
··· 2752 2752 xhci_dbg(xhci, 2753 2753 "Miss service interval error for slot %u ep %u, set skip flag\n", 2754 2754 slot_id, ep_index); 2755 - return 0; 2755 + break; 2756 2756 case COMP_NO_PING_RESPONSE_ERROR: 2757 2757 ep->skip = true; 2758 2758 xhci_dbg(xhci, ··· 2799 2799 xhci_dbg(xhci, "Missing TD completion event after mid TD error\n"); 2800 2800 xhci_dequeue_td(xhci, td, ep_ring, td->status); 2801 2801 } 2802 + 2803 + /* Missed TDs will be skipped on the next event */ 2804 + if (trb_comp_code == COMP_MISSED_SERVICE_ERROR) 2805 + return 0; 2802 2806 2803 2807 if (list_empty(&ep_ring->td_list)) { 2804 2808 /*