| From fe49df60cdb7c2975aa743dc295f8786e4b7db10 Mon Sep 17 00:00:00 2001 |
| From: Mathias Nyman <mathias.nyman@linux.intel.com> |
| Date: Wed, 16 Oct 2024 16:59:58 +0300 |
| Subject: xhci: Mitigate failed set dequeue pointer commands |
| |
| From: Mathias Nyman <mathias.nyman@linux.intel.com> |
| |
| commit fe49df60cdb7c2975aa743dc295f8786e4b7db10 upstream. |
| |
| 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 | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/drivers/usb/host/xhci-ring.c |
| +++ b/drivers/usb/host/xhci-ring.c |
| @@ -1046,7 +1046,7 @@ static int xhci_invalidate_cancelled_tds |
| 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; |