From 7c97a7846f6f111a655619b6c2c2e7b3bd26a4aa Mon Sep 17 00:00:00 2001 From: Augustin Cavalier Date: Thu, 24 Feb 2022 21:05:54 -0500 Subject: [PATCH] XHCI: Handle fragmented transfers failing to submit the next fragment. Previously they would just get "lost" and never signal completion. (Considering how rare fragmented transfers are, this may not fix any real problems.) --- src/add-ons/kernel/busses/usb/xhci.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/add-ons/kernel/busses/usb/xhci.cpp b/src/add-ons/kernel/busses/usb/xhci.cpp index af331ab333..f94415e7fa 100644 --- a/src/add-ons/kernel/busses/usb/xhci.cpp +++ b/src/add-ons/kernel/busses/usb/xhci.cpp @@ -2986,13 +2986,16 @@ XHCI::FinishTransfers() FreeDescriptor(td); // this transfer may still have data left + bool finished = true; transfer->AdvanceByFragment(actualLength); if (completionCode == COMP_SUCCESS && transfer->FragmentLength() > 0) { TRACE("still %" B_PRIuSIZE " bytes left on transfer\n", transfer->FragmentLength()); - SubmitTransfer(transfer); - } else { + callbackStatus = SubmitTransfer(transfer); + finished = (callbackStatus != B_OK); + } + if (finished) { // The actualLength was already handled in AdvanceByFragment. transfer->Finished(callbackStatus, 0); delete transfer;