]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Bus/Pci/XhciDxe/Xhci.c
MdeModulePkg/XhciDxe: Check timeout URB again after stopping endpoint
[mirror_edk2.git] / MdeModulePkg / Bus / Pci / XhciDxe / Xhci.c
index e3cbdbc800387670d060ada28fe2f0b755c876b4..20ad3f1611979ff187abb7fb47c0ed800be32fa8 100644 (file)
@@ -780,26 +780,32 @@ XhcTransfer (
 \r
   Status = XhcExecTransfer (Xhc, FALSE, Urb, Timeout);\r
 \r
-  *TransferResult = Urb->Result;\r
-  *DataLength     = Urb->Completed;\r
-\r
   if (Status == EFI_TIMEOUT) {\r
     //\r
     // The transfer timed out. Abort the transfer by dequeueing of the TD.\r
     //\r
-    RecoveryStatus = XhcDequeueTrbFromEndpoint (Xhc, Urb);\r
-    if (EFI_ERROR (RecoveryStatus)) {\r
-      DEBUG((DEBUG_ERROR, "XhcTransfer[Type=%d]: XhcDequeueTrbFromEndpoint failed\n", Type));\r
-    }\r
-  } else {\r
-    if (*TransferResult == EFI_USB_NOERROR) {\r
+    RecoveryStatus = XhcDequeueTrbFromEndpoint(Xhc, Urb);\r
+    if (RecoveryStatus == EFI_ALREADY_STARTED) {\r
+      //\r
+      // The URB is finished just before stopping endpoint.\r
+      // Change returning status from EFI_TIMEOUT to EFI_SUCCESS.\r
+      //\r
+      ASSERT (Urb->Result == EFI_USB_NOERROR);\r
       Status = EFI_SUCCESS;\r
-    } else if (*TransferResult == EFI_USB_ERR_STALL) {\r
-      RecoveryStatus = XhcRecoverHaltedEndpoint (Xhc, Urb);\r
-      if (EFI_ERROR (RecoveryStatus)) {\r
-        DEBUG ((DEBUG_ERROR, "XhcTransfer[Type=%d]: XhcRecoverHaltedEndpoint failed\n", Type));\r
-      }\r
-      Status = EFI_DEVICE_ERROR;\r
+      DEBUG ((DEBUG_ERROR, "XhcTransfer[Type=%d]: pending URB is finished, Length = %d.\n", Type, Urb->Completed));\r
+    } else if (EFI_ERROR(RecoveryStatus)) {\r
+      DEBUG((DEBUG_ERROR, "XhcTransfer[Type=%d]: XhcDequeueTrbFromEndpoint failed!\n", Type));\r
+    }\r
+  }\r
+\r
+  *TransferResult = Urb->Result;\r
+  *DataLength     = Urb->Completed;\r
+\r
+  if (*TransferResult == EFI_USB_ERR_STALL) {\r
+    ASSERT (Status == EFI_DEVICE_ERROR);\r
+    RecoveryStatus = XhcRecoverHaltedEndpoint(Xhc, Urb);\r
+    if (EFI_ERROR (RecoveryStatus)) {\r
+      DEBUG ((DEBUG_ERROR, "XhcTransfer[Type=%d]: XhcRecoverHaltedEndpoint failed!\n", Type));\r
     }\r
   }\r
 \r