]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Bus/Pci/XhciPei/XhcPeim.c
MdeModulePkg Xhci: Also RecoverHaltedEndpoint for BABBLE_ERROR
[mirror_edk2.git] / MdeModulePkg / Bus / Pci / XhciPei / XhcPeim.c
index a58739fb4a681edcfedfb76ab00a9a6c08dfc94c..38f0d2184cff71e3ec7739c9e8e7d7ed910c5c07 100644 (file)
@@ -2,7 +2,7 @@
 PEIM to produce gPeiUsb2HostControllerPpiGuid based on gPeiUsbControllerPpiGuid\r
 which is used to enable recovery function from USB Drivers.\r
 \r
-Copyright (c) 2014 - 2016, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2014 - 2017, Intel Corporation. All rights reserved.<BR>\r
 \r
 This program and the accompanying materials\r
 are licensed and made available under the terms and conditions\r
@@ -407,6 +407,12 @@ XhcPeiResetHC (
   }\r
 \r
   XhcPeiSetOpRegBit (Xhc, XHC_USBCMD_OFFSET, XHC_USBCMD_RESET);\r
+  //\r
+  // Some XHCI host controllers require to have extra 1ms delay before accessing any MMIO register during reset.\r
+  // Otherwise there may have the timeout case happened.\r
+  // The below is a workaround to solve such problem.\r
+  //\r
+  MicroSecondDelay (1000);\r
   Status = XhcPeiWaitOpRegBit (Xhc, XHC_USBCMD_OFFSET, XHC_USBCMD_RESET, FALSE, Timeout);\r
 ON_EXIT:\r
   DEBUG ((EFI_D_INFO, "XhcPeiResetHC: %r\n", Status));\r
@@ -660,7 +666,7 @@ XhcPeiControlTransfer (
   } else {\r
     if (*TransferResult == EFI_USB_NOERROR) {\r
       Status = EFI_SUCCESS;\r
-    } else if (*TransferResult == EFI_USB_ERR_STALL) {\r
+    } else if ((*TransferResult == EFI_USB_ERR_STALL) || (*TransferResult == EFI_USB_ERR_BABBLE)) {\r
       RecoveryStatus = XhcPeiRecoverHaltedEndpoint(Xhc, Urb);\r
       if (EFI_ERROR (RecoveryStatus)) {\r
         DEBUG ((EFI_D_ERROR, "XhcPeiControlTransfer: XhcPeiRecoverHaltedEndpoint failed\n"));\r
@@ -982,7 +988,7 @@ XhcPeiBulkTransfer (
   } else {\r
     if (*TransferResult == EFI_USB_NOERROR) {\r
       Status = EFI_SUCCESS;\r
-    } else if (*TransferResult == EFI_USB_ERR_STALL) {\r
+    } else if ((*TransferResult == EFI_USB_ERR_STALL) || (*TransferResult == EFI_USB_ERR_BABBLE)) {\r
       RecoveryStatus = XhcPeiRecoverHaltedEndpoint(Xhc, Urb);\r
       if (EFI_ERROR (RecoveryStatus)) {\r
         DEBUG ((EFI_D_ERROR, "XhcPeiBulkTransfer: XhcPeiRecoverHaltedEndpoint failed\n"));\r