From 38d2a39d9316890f439e584e01cdb6be4cbcb016 Mon Sep 17 00:00:00 2001 From: Xianglei Cai Date: Tue, 7 May 2024 09:19:32 +0800 Subject: [PATCH] MdeModulePkg/XhciDxe: Reset endpoint while USB Transaction error https://bugzilla.tianocore.org/show_bug.cgi?id=4556 Based on XHCI spec 4.8.3, software should do the reset endpoint while USB Transaction occur. Add the error code for USB Transaction error since UEFI spec don't have the related definition. Cc: Ray Ni Cc: Liming Gao Cc: Krzysztof Lewandowski Cc: Jenny Huang Cc: More Shih Signed-off-by: Xianglei Cai Reviewed-by: Krzysztof Lewandowski Reviewed-by: Liming Gao --- MdeModulePkg/Bus/Pci/XhciDxe/Xhci.c | 5 ++++- MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.c | 5 ++++- MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.h | 7 +++++++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/MdeModulePkg/Bus/Pci/XhciDxe/Xhci.c b/MdeModulePkg/Bus/Pci/XhciDxe/Xhci.c index 7f64f9c7c982..636ed875297b 100644 --- a/MdeModulePkg/Bus/Pci/XhciDxe/Xhci.c +++ b/MdeModulePkg/Bus/Pci/XhciDxe/Xhci.c @@ -803,7 +803,10 @@ XhcTransfer ( *TransferResult = Urb->Result; *DataLength = Urb->Completed; - if ((*TransferResult == EFI_USB_ERR_STALL) || (*TransferResult == EFI_USB_ERR_BABBLE)) { + // + // Based on XHCI spec 4.8.3, software should do the reset endpoint while USB Transaction occur. + // + if ((*TransferResult == EFI_USB_ERR_STALL) || (*TransferResult == EFI_USB_ERR_BABBLE) || (*TransferResult == EDKII_USB_ERR_TRANSACTION)) { ASSERT (Status == EFI_DEVICE_ERROR); RecoveryStatus = XhcRecoverHaltedEndpoint(Xhc, Urb); if (EFI_ERROR (RecoveryStatus)) { diff --git a/MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.c b/MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.c index 75959ae08363..b006501551d9 100644 --- a/MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.c +++ b/MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.c @@ -1174,8 +1174,11 @@ XhcCheckUrbResult ( DEBUG ((EFI_D_ERROR, "XhcCheckUrbResult: ERR_BUFFER! Completecode = %x\n",EvtTrb->Completecode)); goto EXIT; + // + // Based on XHCI spec 4.8.3, software should do the reset endpoint while USB Transaction occur. + // case TRB_COMPLETION_USB_TRANSACTION_ERROR: - CheckedUrb->Result |= EFI_USB_ERR_TIMEOUT; + CheckedUrb->Result |= EDKII_USB_ERR_TRANSACTION; CheckedUrb->Finished = TRUE; DEBUG ((EFI_D_ERROR, "XhcCheckUrbResult: TRANSACTION_ERROR! Completecode = %x\n",EvtTrb->Completecode)); goto EXIT; diff --git a/MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.h b/MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.h index b5e192c3b589..d180c1aa2e9a 100644 --- a/MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.h +++ b/MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.h @@ -83,6 +83,13 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #define TRB_COMPLETION_STOPPED 26 #define TRB_COMPLETION_STOPPED_LENGTH_INVALID 27 +// +// USB Transfer Results Internal Definition +// Based on XHCI spec 4.8.3, software should do the reset endpoint while USB Transaction occur. +// Add the error code for USB Transaction error since UEFI spec don't have the related definition. +// +#define EDKII_USB_ERR_TRANSACTION 0x200 + // // The topology string used to present usb device location //