]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkModulePkg/Bus/Pci/Ehci/Dxe/EhciSched.c
AsyncRequestPtr maybe NULL after its callback function is invoke. So Caching it tempo...
[mirror_edk2.git] / EdkModulePkg / Bus / Pci / Ehci / Dxe / EhciSched.c
index 3dc1ff74af2cc30f0c4fa6db66a006342e457667..1a947058be0a378edcc86987aeac920c7b549bed 100644 (file)
@@ -340,7 +340,7 @@ Returns:
   //\r
   // Init fields in Qh\r
   //\r
-  gBS->SetMem (*QhPtrPtr, sizeof (EHCI_QH_ENTITY), 0);\r
+  ZeroMem (*QhPtrPtr, sizeof (EHCI_QH_ENTITY));\r
 \r
   //\r
   // Software field\r
@@ -699,7 +699,8 @@ Returns:
   //\r
   // Init fields in Qtd\r
   //\r
-  gBS->SetMem (*QtdPtrPtr, sizeof (EHCI_QTD_ENTITY), 0);\r
+\r
+  ZeroMem (*QtdPtrPtr, sizeof (EHCI_QTD_ENTITY));\r
 \r
   //\r
   // Software field\r
@@ -2109,6 +2110,12 @@ Returns:
   RemainLen = DataLen;\r
   ASSERT (QtdHwPtr);\r
 \r
+  //\r
+  // Allow buffer address range across 4G.\r
+  // But EFI_USB_MAX_BULK_BUFFER_NUM = 1, so don't allow\r
+  // seperate buffer array.\r
+  //\r
+\r
   //\r
   // Set BufferPointer0, ExtBufferPointer0 and Offset\r
   //\r
@@ -2125,7 +2132,7 @@ Returns:
   }\r
 \r
   QtdHwPtr->BufferPointer1    = QtdHwPtr->BufferPointer0 + 1;\r
-  QtdHwPtr->ExtBufferPointer1 = QtdHwPtr->ExtBufferPointer0;\r
+  QtdHwPtr->ExtBufferPointer1 = (QtdHwPtr->BufferPointer1 == 0) ? (QtdHwPtr->ExtBufferPointer0 + 1) : QtdHwPtr->ExtBufferPointer0;\r
 \r
   //\r
   // Set BufferPointer2 and ExtBufferPointer2\r
@@ -2136,7 +2143,7 @@ Returns:
   }\r
 \r
   QtdHwPtr->BufferPointer2    = QtdHwPtr->BufferPointer1 + 1;\r
-  QtdHwPtr->ExtBufferPointer2 = QtdHwPtr->ExtBufferPointer0;\r
+  QtdHwPtr->ExtBufferPointer2 = (QtdHwPtr->BufferPointer2 == 0) ? (QtdHwPtr->ExtBufferPointer1 + 1) : QtdHwPtr->ExtBufferPointer1;\r
 \r
   //\r
   // Set BufferPointer3 and ExtBufferPointer3\r
@@ -2147,7 +2154,7 @@ Returns:
   }\r
 \r
   QtdHwPtr->BufferPointer3    = QtdHwPtr->BufferPointer2 + 1;\r
-  QtdHwPtr->ExtBufferPointer3 = QtdHwPtr->ExtBufferPointer0;\r
+  QtdHwPtr->ExtBufferPointer3 = (QtdHwPtr->BufferPointer2 == 0) ? (QtdHwPtr->ExtBufferPointer2 + 1) : QtdHwPtr->ExtBufferPointer2;\r
 \r
   //\r
   // Set BufferPointer4 and ExtBufferPointer4\r
@@ -2158,7 +2165,7 @@ Returns:
   }\r
 \r
   QtdHwPtr->BufferPointer4    = QtdHwPtr->BufferPointer3 + 1;\r
-  QtdHwPtr->ExtBufferPointer4 = QtdHwPtr->ExtBufferPointer0;\r
+  QtdHwPtr->ExtBufferPointer4 = (QtdHwPtr->BufferPointer3 == 0) ? (QtdHwPtr->ExtBufferPointer3 + 1) : QtdHwPtr->ExtBufferPointer3;\r
 \r
 exit:\r
   return ;\r
@@ -2865,8 +2872,8 @@ Returns:
     }\r
 \r
     (*ErrQtdPos)++;\r
-    QtdHwPtr = GetQtdNextPointer (QtdHwPtr);\r
-    QtdPtr = (EHCI_QTD_ENTITY *) GET_QTD_ENTITY_ADDR (QtdHwPtr);\r
+    QtdPtr   = QtdPtr->Next;\r
+    QtdHwPtr = &(QtdPtr->Qtd);\r
 \r
   }\r
 \r
@@ -2990,6 +2997,7 @@ Returns:
   UINT32              TransferResult;\r
   UINT8               *ReceiveBuffer;\r
   UINT8               *ProcessBuffer;\r
+  EHCI_ASYNC_REQUEST  *NextPtr;\r
 \r
   Status          = EFI_SUCCESS;\r
   QtdHwPtr        = NULL;\r
@@ -3035,6 +3043,8 @@ Returns:
 \r
     UpdateAsyncRequestTransfer (AsyncRequestPtr, TransferResult, ErrQtdPos);\r
 \r
+    NextPtr = AsyncRequestPtr->Next;\r
+\r
     if (EFI_USB_NOERROR == TransferResult) {\r
 \r
       if (AsyncRequestPtr->CallBackFunc != NULL) {\r
@@ -3062,8 +3072,7 @@ Returns:
       gBS->FreePool (ProcessBuffer);\r
     }\r
 \r
-    AsyncRequestPtr = AsyncRequestPtr->Next;\r
-\r
+    AsyncRequestPtr = NextPtr;\r
   }\r
 \r
 exit:\r