From d11f0ea045f598e08b414eeba4f8a74ac1b4ca0b Mon Sep 17 00:00:00 2001 From: "Cai, Xianglei" Date: Thu, 21 Sep 2023 11:57:40 +0800 Subject: MdeModulePkg/XhciDxe: Abort the Address Device cmd when time out https://bugzilla.tianocore.org/show_bug.cgi?id=4552 Following XHCI spec 4.6.1.2, software may abort the execution of Address Device Command when command failed due to timeout. Cc: Hao A Wu Cc: Ray Ni Cc: Jian J Wang Cc: Liming Gao Cc: More Shih Cc: Jenny Huang Signed-off-by: Xianglei Cai Reviewed-by: Hao A Wu --- MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.c | 36 ++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.c b/MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.c index 613b1485f1..7542782049 100644 --- a/MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.c +++ b/MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.c @@ -2107,6 +2107,26 @@ RingIntTransferDoorBell ( return EFI_SUCCESS; } +/** + Set Command abort + + @param Xhc The XHCI Instance. + @param SlotId The slot id to be disabled. + +**/ +VOID +XhcCmdRingCmdAbort ( + IN USB_XHCI_INSTANCE *Xhc, + IN UINT8 SlotId + ) +{ + // + // Set XHC_CRCR_CA bit in XHC_CRCR_OFFSET to abort command. + // + DEBUG ((DEBUG_INFO, "Command Ring Control set Command Abort, SlotId: %d\n", SlotId)); + XhcSetOpRegBit (Xhc, XHC_CRCR_OFFSET, XHC_CRCR_CA); +} + /** Assign and initialize the device slot for a new device. @@ -2317,6 +2337,14 @@ XhcInitializeDeviceSlot ( Xhc->UsbDevContext[SlotId].XhciDevAddr = DeviceAddress; } else { DEBUG ((DEBUG_ERROR, " Slot %d address not assigned successfully. Status = %r\n", SlotId, Status)); + // + // Software may abort the execution of Address Device Command when command failed + // due to timeout by following XHCI spec. 4.6.1.2. + // + if (Status == EFI_TIMEOUT) { + XhcCmdRingCmdAbort (Xhc, SlotId); + } + XhcDisableSlotCmd (Xhc, SlotId); } @@ -2533,6 +2561,14 @@ XhcInitializeDeviceSlot64 ( Xhc->UsbDevContext[SlotId].XhciDevAddr = DeviceAddress; } else { DEBUG ((DEBUG_ERROR, " Slot %d address not assigned successfully. Status = %r\n", SlotId, Status)); + // + // Software may abort the execution of Address Device Command when command failed + // due to timeout by following XHCI spec. 4.6.1.2. + // + if (Status == EFI_TIMEOUT) { + XhcCmdRingCmdAbort (Xhc, SlotId); + } + XhcDisableSlotCmd64 (Xhc, SlotId); } -- cgit v1.2.3