]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
xhci: Mitigate failed set dequeue pointer commands
authorMathias Nyman <mathias.nyman@linux.intel.com>
Wed, 16 Oct 2024 13:59:58 +0000 (16:59 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 17 Oct 2024 06:45:36 +0000 (08:45 +0200)
Avoid xHC host from processing a cancelled URB by always turning
cancelled URB TDs into no-op TRBs before queuing a 'Set TR Deq' command.

If the command fails then xHC will start processing the cancelled TD
instead of skipping it once endpoint is restarted, causing issues like
Babble error.

This is not a complete solution as a failed 'Set TR Deq' command does not
guarantee xHC TRB caches are cleared.

Fixes: 4db356924a50 ("xhci: turn cancelled td cleanup to its own function")
Cc: stable@vger.kernel.org
Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
Link: https://lore.kernel.org/r/20241016140000.783905-3-mathias.nyman@linux.intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/host/xhci-ring.c

index 4d664ba53fe9a45a7ed5bb36624a905497267f89..7dedf31bbddd0445bb5ec417119c2f810f82ac9a 100644 (file)
@@ -1023,7 +1023,7 @@ static int xhci_invalidate_cancelled_tds(struct xhci_virt_ep *ep)
                                        td_to_noop(xhci, ring, cached_td, false);
                                        cached_td->cancel_status = TD_CLEARED;
                                }
-
+                               td_to_noop(xhci, ring, td, false);
                                td->cancel_status = TD_CLEARING_CACHE;
                                cached_td = td;
                                break;