]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.c
Fix CrytoPkg issue in GCC X64 tip.
[mirror_edk2.git] / MdeModulePkg / Bus / Pci / XhciDxe / XhciSched.c
index 370b8ea44178ee361c8aaf7c0269830b76a2cd81..49cc2619eb4dbd9f986d853080009281fa1e5219 100644 (file)
@@ -15,167 +15,10 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 #include "Xhci.h"\r
 \r
-/**\r
-  Allocates a buffer of a certain pool type at a specified alignment.\r
-\r
-  Allocates the number bytes specified by AllocationSize of a certain pool type with an alignment\r
-  specified by Alignment.  The allocated buffer is returned.  If AllocationSize is 0, then a valid\r
-  buffer of 0 size is returned.  If there is not enough memory at the specified alignment remaining\r
-  to satisfy the request, then NULL is returned.\r
-  If Alignment is not a power of two and Alignment is not zero, then ASSERT().\r
-\r
-  @param  PoolType              The type of pool to allocate.\r
-  @param  AllocationSize        The number of bytes to allocate.\r
-  @param  Alignment             The requested alignment of the allocation.  Must be a power of two.\r
-                                If Alignment is zero, then byte alignment is used.\r
-\r
-  @return A pointer to the allocated buffer or NULL if allocation fails.\r
-\r
-**/\r
-VOID *\r
-InternalAllocateAlignedPool (\r
-  IN EFI_MEMORY_TYPE  PoolType,\r
-  IN UINTN            AllocationSize,\r
-  IN UINTN            Alignment\r
-  )\r
-{\r
-  VOID        *RawAddress;\r
-  UINTN       AlignedAddress;\r
-  UINTN       AlignmentMask;\r
-  UINTN       OverAllocationSize;\r
-  UINTN       RealAllocationSize;\r
-  VOID        **FreePointer;\r
-\r
-  //\r
-  // Alignment must be a power of two or zero.\r
-  //\r
-  ASSERT ((Alignment & (Alignment - 1)) == 0);\r
-\r
-  if (Alignment == 0) {\r
-    AlignmentMask = Alignment;\r
-  } else {\r
-    AlignmentMask = Alignment - 1;\r
-  }\r
-  //\r
-  // Calculate the extra memory size, over-allocate memory pool and get the aligned memory address.\r
-  //\r
-  OverAllocationSize  = sizeof (RawAddress) + AlignmentMask;\r
-  RealAllocationSize  = AllocationSize + OverAllocationSize;\r
-  //\r
-  // Make sure that AllocationSize plus OverAllocationSize does not overflow.\r
-  //\r
-  ASSERT (RealAllocationSize > AllocationSize);\r
-\r
-  RawAddress = NULL;\r
-  gBS->AllocatePool (PoolType, RealAllocationSize, &RawAddress);\r
-  if (RawAddress == NULL) {\r
-    return NULL;\r
-  }\r
-  AlignedAddress      = ((UINTN) RawAddress + OverAllocationSize) & ~AlignmentMask;\r
-  //\r
-  // Save the original memory address just before the aligned address.\r
-  //\r
-  FreePointer         = (VOID **)(AlignedAddress - sizeof (RawAddress));\r
-  *FreePointer        = RawAddress;\r
-\r
-  return (VOID *) AlignedAddress;\r
-}\r
-\r
-/**\r
-  Allocates and zeros a buffer of a certain pool type at a specified alignment.\r
-\r
-  Allocates the number bytes specified by AllocationSize of a certain pool type with an alignment\r
-  specified by Alignment, clears the buffer with zeros, and returns a pointer to the allocated\r
-  buffer.  If AllocationSize is 0, then a valid buffer of 0 size is returned.  If there is not\r
-  enough memory at the specified alignment remaining to satisfy the request, then NULL is returned.\r
-  If Alignment is not a power of two and Alignment is not zero, then ASSERT().\r
-\r
-  @param  PoolType              The type of pool to allocate.\r
-  @param  AllocationSize        The number of bytes to allocate.\r
-  @param  Alignment             The requested alignment of the allocation.  Must be a power of two.\r
-                                If Alignment is zero, then byte alignment is used.\r
-\r
-  @return A pointer to the allocated buffer or NULL if allocation fails.\r
-\r
-**/\r
-VOID *\r
-InternalAllocateAlignedZeroPool (\r
-  IN EFI_MEMORY_TYPE  PoolType,\r
-  IN UINTN            AllocationSize,\r
-  IN UINTN            Alignment\r
-  )\r
-{\r
-  VOID    *Memory;\r
-  Memory = InternalAllocateAlignedPool (PoolType, AllocationSize, Alignment);\r
-  if (Memory != NULL) {\r
-    ZeroMem (Memory, AllocationSize);\r
-  }\r
-  return Memory;\r
-}\r
-\r
-/**\r
-  Allocates and zeros a buffer of type EfiBootServicesData at a specified alignment.\r
-\r
-  Allocates the number bytes specified by AllocationSize of type EfiBootServicesData with an\r
-  alignment specified by Alignment, clears the buffer with zeros, and returns a pointer to the\r
-  allocated buffer.  If AllocationSize is 0, then a valid buffer of 0 size is returned.  If there\r
-  is not enough memory at the specified alignment remaining to satisfy the request, then NULL is\r
-  returned.\r
-  If Alignment is not a power of two and Alignment is not zero, then ASSERT().\r
-\r
-  @param  AllocationSize        The number of bytes to allocate.\r
-  @param  Alignment             The requested alignment of the allocation.  Must be a power of two.\r
-                                If Alignment is zero, then byte alignment is used.\r
-\r
-  @return A pointer to the allocated buffer or NULL if allocation fails.\r
-\r
-**/\r
-VOID *\r
-EFIAPI\r
-AllocateAlignedZeroPool (\r
-  IN UINTN  AllocationSize,\r
-  IN UINTN  Alignment\r
-  )\r
-{\r
-  return InternalAllocateAlignedZeroPool (EfiBootServicesData, AllocationSize, Alignment);\r
-}\r
-\r
-/**\r
-  Frees a buffer that was previously allocated with one of the aligned pool allocation functions\r
-  in the Memory Allocation Library.\r
-\r
-  Frees the buffer specified by Buffer.  Buffer must have been allocated on a previous call to the\r
-  aligned pool allocation services of the Memory Allocation Library.\r
-  If Buffer was not allocated with an aligned pool allocation function in the Memory Allocation\r
-  Library, then ASSERT().\r
-\r
-  @param  Buffer                Pointer to the buffer to free.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-FreeAlignedPool (\r
-  IN VOID   *Buffer\r
-  )\r
-{\r
-  VOID        *RawAddress;\r
-  VOID        **FreePointer;\r
-  EFI_STATUS  Status;\r
-\r
-  //\r
-  // Get the pre-saved original address in the over-allocate pool.\r
-  //\r
-  FreePointer = (VOID **)((UINTN) Buffer - sizeof (RawAddress));\r
-  RawAddress  = *FreePointer;\r
-\r
-  Status = gBS->FreePool (RawAddress);\r
-  ASSERT_EFI_ERROR (Status);\r
-}\r
-\r
 /**\r
   Create a command transfer TRB to support XHCI command interfaces.\r
 \r
-  @param  Xhc       The XHCI device.\r
+  @param  Xhc       The XHCI Instance.\r
   @param  CmdTrb    The cmd TRB to be executed.\r
 \r
   @return Created URB or NULL.\r
@@ -183,8 +26,8 @@ FreeAlignedPool (
 **/\r
 URB*\r
 XhcCreateCmdTrb (\r
-  IN USB_XHCI_DEV    *Xhc,\r
-  IN TRB             *CmdTrb\r
+  IN USB_XHCI_INSTANCE  *Xhc,\r
+  IN TRB_TEMPLATE       *CmdTrb\r
   )\r
 {\r
   URB    *Urb;\r
@@ -200,7 +43,7 @@ XhcCreateCmdTrb (
   XhcSyncTrsRing (Xhc, Urb->Ring);\r
   Urb->TrbNum     = 1;\r
   Urb->TrbStart   = Urb->Ring->RingEnqueue;\r
-  CopyMem (Urb->TrbStart, CmdTrb, sizeof (TRB));\r
+  CopyMem (Urb->TrbStart, CmdTrb, sizeof (TRB_TEMPLATE));\r
   Urb->TrbStart->CycleBit = Urb->Ring->RingPCS & BIT0;\r
   Urb->TrbEnd             = Urb->TrbStart;\r
 \r
@@ -214,9 +57,9 @@ XhcCreateCmdTrb (
 /**\r
   Execute a XHCI cmd TRB pointed by CmdTrb.\r
 \r
-  @param  Xhc                   The XHCI device.\r
+  @param  Xhc                   The XHCI Instance.\r
   @param  CmdTrb                The cmd TRB to be executed.\r
-  @param  TimeOut               Indicates the maximum time, in millisecond, which the\r
+  @param  Timeout               Indicates the maximum time, in millisecond, which the\r
                                 transfer is allowed to complete.\r
   @param  EvtTrb                The event TRB corresponding to the cmd TRB.\r
 \r
@@ -229,10 +72,10 @@ XhcCreateCmdTrb (
 EFI_STATUS\r
 EFIAPI\r
 XhcCmdTransfer (\r
-  IN  USB_XHCI_DEV          *Xhc,\r
-  IN  TRB                   *CmdTrb,\r
-  IN  UINTN                 TimeOut,\r
-  OUT TRB                   **EvtTrb\r
+  IN  USB_XHCI_INSTANCE     *Xhc,\r
+  IN  TRB_TEMPLATE          *CmdTrb,\r
+  IN  UINTN                 Timeout,\r
+  OUT TRB_TEMPLATE          **EvtTrb\r
   )\r
 {\r
   EFI_STATUS      Status;\r
@@ -265,7 +108,7 @@ XhcCmdTransfer (
 \r
   ASSERT (Urb->EvtRing == &Xhc->CmdEventRing);\r
 \r
-  Status  = XhcExecTransfer (Xhc, TRUE, Urb, TimeOut);\r
+  Status  = XhcExecTransfer (Xhc, TRUE, Urb, Timeout);\r
   *EvtTrb = Urb->EvtTrbStart;\r
 \r
   if (Urb->Result == EFI_USB_NOERROR) {\r
@@ -281,7 +124,7 @@ ON_EXIT:
 /**\r
   Create a new URB for a new transaction.\r
 \r
-  @param  Xhc       The XHCI device\r
+  @param  Xhc       The XHCI Instance\r
   @param  DevAddr   The device address\r
   @param  EpAddr    Endpoint addrress\r
   @param  DevSpeed  The device speed\r
@@ -298,7 +141,7 @@ ON_EXIT:
 **/\r
 URB*\r
 XhcCreateUrb (\r
-  IN USB_XHCI_DEV                       *Xhc,\r
+  IN USB_XHCI_INSTANCE                  *Xhc,\r
   IN UINT8                              DevAddr,\r
   IN UINT8                              EpAddr,\r
   IN UINT8                              DevSpeed,\r
@@ -338,6 +181,7 @@ XhcCreateUrb (
   Urb->Context  = Context;\r
 \r
   Status = XhcCreateTransferTrb (Xhc, Urb);\r
+  ASSERT_EFI_ERROR (Status);\r
 \r
   return Urb;\r
 }\r
@@ -345,7 +189,7 @@ XhcCreateUrb (
 /**\r
   Create a transfer TRB.\r
 \r
-  @param  Xhc     The XHCI device\r
+  @param  Xhc     The XHCI Instance\r
   @param  Urb     The urb used to construct the transfer TRB.\r
 \r
   @return Created TRB or NULL\r
@@ -353,11 +197,11 @@ XhcCreateUrb (
 **/\r
 EFI_STATUS\r
 XhcCreateTransferTrb (\r
-  IN USB_XHCI_DEV               *Xhc,\r
+  IN USB_XHCI_INSTANCE          *Xhc,\r
   IN URB                        *Urb\r
   )\r
 {\r
-  DEVICE_CONTEXT                *OutputDevContxt;\r
+  DEVICE_CONTEXT                *OutputContext;\r
   TRANSFER_RING                 *EPRing;\r
   UINT8                         EPType;\r
   UINT8                         SlotId;\r
@@ -367,12 +211,13 @@ XhcCreateTransferTrb (
   UINTN                         Len;\r
   UINTN                         TrbNum;\r
 \r
-  SlotId    = XhcDevAddrToSlotId(Urb->Ep.DevAddr);\r
+  SlotId    = XhcDevAddrToSlotId(Xhc, Urb->Ep.DevAddr);\r
   Dci       = XhcEndpointToDci (Urb->Ep.EpAddr, (UINT8)(Urb->Ep.Direction));\r
-  EPRing    = (TRANSFER_RING *)(UINTN) UsbDevContext[SlotId].EndpointTransferRing[Dci-1];\r
+  ASSERT (Dci < 32);\r
+  EPRing    = (TRANSFER_RING *)(UINTN) Xhc->UsbDevContext[SlotId].EndpointTransferRing[Dci-1];\r
   Urb->Ring = EPRing;\r
-  OutputDevContxt = (DEVICE_CONTEXT *)(UINTN) Xhc->DCBAA[SlotId];\r
-  EPType    = (UINT8) OutputDevContxt->EP[Dci-1].EPType;\r
+  OutputContext = (DEVICE_CONTEXT *)(UINTN) Xhc->DCBAA[SlotId];\r
+  EPType    = (UINT8) OutputContext->EP[Dci-1].EPType;\r
 \r
   //\r
   // Construct the TRB\r
@@ -387,28 +232,28 @@ XhcCreateTransferTrb (
       //\r
       // For control transfer, create SETUP_STAGE_TRB first.\r
       //\r
-      TrbStart = EPRing->RingEnqueue;\r
-      ((TRANSFER_TRB_CONTROL_SETUP *) TrbStart)->bmRequestType = Urb->Request->RequestType;\r
-      ((TRANSFER_TRB_CONTROL_SETUP *) TrbStart)->bRequest      = Urb->Request->Request;\r
-      ((TRANSFER_TRB_CONTROL_SETUP *) TrbStart)->wValue        = Urb->Request->Value;\r
-      ((TRANSFER_TRB_CONTROL_SETUP *) TrbStart)->wIndex        = Urb->Request->Index;\r
-      ((TRANSFER_TRB_CONTROL_SETUP *) TrbStart)->wLength       = Urb->Request->Length;\r
-      ((TRANSFER_TRB_CONTROL_SETUP *) TrbStart)->Lenth         = 8;\r
-      ((TRANSFER_TRB_CONTROL_SETUP *) TrbStart)->IntTarget     = Urb->EvtRing->EventInterrupter;\r
-      ((TRANSFER_TRB_CONTROL_SETUP *) TrbStart)->IOC           = 1;\r
-      ((TRANSFER_TRB_CONTROL_SETUP *) TrbStart)->IDT           = 1;\r
-      ((TRANSFER_TRB_CONTROL_SETUP *) TrbStart)->Type          = TRB_TYPE_SETUP_STAGE;\r
+      TrbStart = (TRB *)(UINTN)EPRing->RingEnqueue;\r
+      TrbStart->TrbCtrSetup.bmRequestType = Urb->Request->RequestType;\r
+      TrbStart->TrbCtrSetup.bRequest      = Urb->Request->Request;\r
+      TrbStart->TrbCtrSetup.wValue        = Urb->Request->Value;\r
+      TrbStart->TrbCtrSetup.wIndex        = Urb->Request->Index;\r
+      TrbStart->TrbCtrSetup.wLength       = Urb->Request->Length;\r
+      TrbStart->TrbCtrSetup.Lenth         = 8;\r
+      TrbStart->TrbCtrSetup.IntTarget     = Urb->EvtRing->EventInterrupter;\r
+      TrbStart->TrbCtrSetup.IOC           = 1;\r
+      TrbStart->TrbCtrSetup.IDT           = 1;\r
+      TrbStart->TrbCtrSetup.Type          = TRB_TYPE_SETUP_STAGE;\r
       if (Urb->Ep.Direction == EfiUsbDataIn) {\r
-        ((TRANSFER_TRB_CONTROL_SETUP *) TrbStart)->TRT = 3;\r
+        TrbStart->TrbCtrSetup.TRT = 3;\r
       } else if (Urb->Ep.Direction == EfiUsbDataOut) {\r
-        ((TRANSFER_TRB_CONTROL_SETUP *) TrbStart)->TRT = 2;\r
+        TrbStart->TrbCtrSetup.TRT = 2;\r
       } else {\r
-        ((TRANSFER_TRB_CONTROL_SETUP *) TrbStart)->TRT = 0;\r
+        TrbStart->TrbCtrSetup.TRT = 0;\r
       }\r
       //\r
       // Update the cycle bit\r
       //\r
-      ((TRANSFER_TRB_CONTROL_SETUP *) TrbStart)->CycleBit = EPRing->RingPCS & BIT0;\r
+      TrbStart->TrbCtrSetup.CycleBit = EPRing->RingPCS & BIT0;\r
       Urb->TrbNum++;\r
 \r
       //\r
@@ -416,28 +261,28 @@ XhcCreateTransferTrb (
       //\r
       if (Urb->DataLen > 0) {\r
         XhcSyncTrsRing (Xhc, EPRing);\r
-        TrbStart = EPRing->RingEnqueue;\r
-        ((TRANSFER_TRB_CONTROL_DATA *) TrbStart)->TRBPtrLo  = XHC_LOW_32BIT(Urb->Data);\r
-        ((TRANSFER_TRB_CONTROL_DATA *) TrbStart)->TRBPtrHi  = XHC_HIGH_32BIT(Urb->Data);\r
-        ((TRANSFER_TRB_CONTROL_DATA *) TrbStart)->Lenth     = (UINT32) Urb->DataLen;\r
-        ((TRANSFER_TRB_CONTROL_DATA *) TrbStart)->TDSize    = 0;\r
-        ((TRANSFER_TRB_CONTROL_DATA *) TrbStart)->IntTarget = Urb->EvtRing->EventInterrupter;\r
-        ((TRANSFER_TRB_CONTROL_DATA *) TrbStart)->ISP       = 1;\r
-        ((TRANSFER_TRB_CONTROL_DATA *) TrbStart)->IOC       = 1;\r
-        ((TRANSFER_TRB_CONTROL_DATA *) TrbStart)->IDT       = 0;\r
-        ((TRANSFER_TRB_CONTROL_DATA *) TrbStart)->CH        = 0;\r
-        ((TRANSFER_TRB_CONTROL_DATA *) TrbStart)->Type      = TRB_TYPE_DATA_STAGE;\r
+        TrbStart = (TRB *)(UINTN)EPRing->RingEnqueue;\r
+        TrbStart->TrbCtrData.TRBPtrLo  = XHC_LOW_32BIT(Urb->Data);\r
+        TrbStart->TrbCtrData.TRBPtrHi  = XHC_HIGH_32BIT(Urb->Data);\r
+        TrbStart->TrbCtrData.Lenth     = (UINT32) Urb->DataLen;\r
+        TrbStart->TrbCtrData.TDSize    = 0;\r
+        TrbStart->TrbCtrData.IntTarget = Urb->EvtRing->EventInterrupter;\r
+        TrbStart->TrbCtrData.ISP       = 1;\r
+        TrbStart->TrbCtrData.IOC       = 1;\r
+        TrbStart->TrbCtrData.IDT       = 0;\r
+        TrbStart->TrbCtrData.CH        = 0;\r
+        TrbStart->TrbCtrData.Type      = TRB_TYPE_DATA_STAGE;\r
         if (Urb->Ep.Direction == EfiUsbDataIn) {\r
-          ((TRANSFER_TRB_CONTROL_DATA *) TrbStart)->DIR = 1;\r
+          TrbStart->TrbCtrData.DIR = 1;\r
         } else if (Urb->Ep.Direction == EfiUsbDataOut) {\r
-          ((TRANSFER_TRB_CONTROL_DATA *) TrbStart)->DIR = 0;\r
+          TrbStart->TrbCtrData.DIR = 0;\r
         } else {\r
-          ((TRANSFER_TRB_CONTROL_DATA *) TrbStart)->DIR = 0;\r
+          TrbStart->TrbCtrData.DIR = 0;\r
         }\r
         //\r
         // Update the cycle bit\r
         //\r
-        ((TRANSFER_TRB_CONTROL_DATA *) TrbStart)->CycleBit = EPRing->RingPCS & BIT0;\r
+        TrbStart->TrbCtrData.CycleBit = EPRing->RingPCS & BIT0;\r
         Urb->TrbNum++;\r
       }\r
       //\r
@@ -445,28 +290,28 @@ XhcCreateTransferTrb (
       // Get the pointer to next TRB for status stage use\r
       //\r
       XhcSyncTrsRing (Xhc, EPRing);\r
-      TrbStart = EPRing->RingEnqueue;\r
-      ((TRANSFER_TRB_CONTROL_STATUS *) TrbStart)->IntTarget = Urb->EvtRing->EventInterrupter;\r
-      ((TRANSFER_TRB_CONTROL_STATUS *) TrbStart)->IOC       = 1;\r
-      ((TRANSFER_TRB_CONTROL_STATUS *) TrbStart)->CH        = 0;\r
-      ((TRANSFER_TRB_CONTROL_STATUS *) TrbStart)->Type      = TRB_TYPE_STATUS_STAGE;\r
+      TrbStart = (TRB *)(UINTN)EPRing->RingEnqueue;\r
+      TrbStart->TrbCtrStatus.IntTarget = Urb->EvtRing->EventInterrupter;\r
+      TrbStart->TrbCtrStatus.IOC       = 1;\r
+      TrbStart->TrbCtrStatus.CH        = 0;\r
+      TrbStart->TrbCtrStatus.Type      = TRB_TYPE_STATUS_STAGE;\r
       if (Urb->Ep.Direction == EfiUsbDataIn) {\r
-        ((TRANSFER_TRB_CONTROL_STATUS *) TrbStart)->DIR = 0;\r
+        TrbStart->TrbCtrStatus.DIR = 0;\r
       } else if (Urb->Ep.Direction == EfiUsbDataOut) {\r
-        ((TRANSFER_TRB_CONTROL_STATUS *) TrbStart)->DIR = 1;\r
+        TrbStart->TrbCtrStatus.DIR = 1;\r
       } else {\r
-        ((TRANSFER_TRB_CONTROL_STATUS *) TrbStart)->DIR = 0;\r
+        TrbStart->TrbCtrStatus.DIR = 0;\r
       }\r
       //\r
       // Update the cycle bit\r
       //\r
-      ((TRANSFER_TRB_CONTROL_STATUS *) TrbStart)->CycleBit = EPRing->RingPCS & BIT0;\r
+      TrbStart->TrbCtrStatus.CycleBit = EPRing->RingPCS & BIT0;\r
       //\r
       // Update the enqueue pointer\r
       //\r
       XhcSyncTrsRing (Xhc, EPRing);\r
       Urb->TrbNum++;\r
-      Urb->TrbEnd = TrbStart;\r
+      Urb->TrbEnd = (TRB_TEMPLATE *)(UINTN)TrbStart;\r
 \r
       break;\r
 \r
@@ -479,26 +324,26 @@ XhcCreateTransferTrb (
       TotalLen = 0;\r
       Len      = 0;\r
       TrbNum   = 0;\r
-      TrbStart = EPRing->RingEnqueue;\r
+      TrbStart = (TRB *)(UINTN)EPRing->RingEnqueue;\r
       while (TotalLen < Urb->DataLen) {\r
         if ((TotalLen + 0x10000) >= Urb->DataLen) {\r
           Len = Urb->DataLen - TotalLen;\r
         } else {\r
           Len = 0x10000;\r
         }\r
-        TrbStart = EPRing->RingEnqueue;\r
-        ((TRANSFER_TRB_NORMAL *) TrbStart)->TRBPtrLo  = XHC_LOW_32BIT((UINT8 *) Urb->Data + TotalLen);\r
-        ((TRANSFER_TRB_NORMAL *) TrbStart)->TRBPtrHi  = XHC_HIGH_32BIT((UINT8 *) Urb->Data + TotalLen);\r
-        ((TRANSFER_TRB_NORMAL *) TrbStart)->Lenth     = (UINT32) Len;\r
-        ((TRANSFER_TRB_NORMAL *) TrbStart)->TDSize    = 0;\r
-        ((TRANSFER_TRB_NORMAL *) TrbStart)->IntTarget = Urb->EvtRing->EventInterrupter;\r
-        ((TRANSFER_TRB_NORMAL *) TrbStart)->ISP       = 1;\r
-        ((TRANSFER_TRB_NORMAL *) TrbStart)->IOC       = 1;\r
-        ((TRANSFER_TRB_NORMAL *) TrbStart)->Type      = TRB_TYPE_NORMAL;\r
+        TrbStart = (TRB *)(UINTN)EPRing->RingEnqueue;\r
+        TrbStart->TrbNormal.TRBPtrLo  = XHC_LOW_32BIT((UINT8 *) Urb->Data + TotalLen);\r
+        TrbStart->TrbNormal.TRBPtrHi  = XHC_HIGH_32BIT((UINT8 *) Urb->Data + TotalLen);\r
+        TrbStart->TrbNormal.Lenth     = (UINT32) Len;\r
+        TrbStart->TrbNormal.TDSize    = 0;\r
+        TrbStart->TrbNormal.IntTarget = Urb->EvtRing->EventInterrupter;\r
+        TrbStart->TrbNormal.ISP       = 1;\r
+        TrbStart->TrbNormal.IOC       = 1;\r
+        TrbStart->TrbNormal.Type      = TRB_TYPE_NORMAL;\r
         //\r
         // Update the cycle bit\r
         //\r
-        ((TRANSFER_TRB_NORMAL *) TrbStart)->CycleBit = EPRing->RingPCS & BIT0;\r
+        TrbStart->TrbNormal.CycleBit = EPRing->RingPCS & BIT0;\r
 \r
         XhcSyncTrsRing (Xhc, EPRing);\r
         TrbNum++;\r
@@ -506,7 +351,7 @@ XhcCreateTransferTrb (
       }\r
 \r
       Urb->TrbNum = TrbNum;\r
-      Urb->TrbEnd = TrbStart;\r
+      Urb->TrbEnd = (TRB_TEMPLATE *)(UINTN)TrbStart;\r
       break;\r
 \r
     case ED_INTERRUPT_OUT:\r
@@ -525,26 +370,26 @@ XhcCreateTransferTrb (
       TotalLen = 0;\r
       Len      = 0;\r
       TrbNum   = 0;\r
-      TrbStart = EPRing->RingEnqueue;\r
+      TrbStart = (TRB *)(UINTN)EPRing->RingEnqueue;\r
       while (TotalLen < Urb->DataLen) {\r
         if ((TotalLen + 0x10000) >= Urb->DataLen) {\r
           Len = Urb->DataLen - TotalLen;\r
         } else {\r
           Len = 0x10000;\r
         }\r
-        TrbStart = EPRing->RingEnqueue;\r
-        ((TRANSFER_TRB_NORMAL *) TrbStart)->TRBPtrLo  = XHC_LOW_32BIT((UINT8 *) Urb->Data + TotalLen);\r
-        ((TRANSFER_TRB_NORMAL *) TrbStart)->TRBPtrHi  = XHC_HIGH_32BIT((UINT8 *) Urb->Data + TotalLen);\r
-        ((TRANSFER_TRB_NORMAL *) TrbStart)->Lenth     = (UINT32) Len;\r
-        ((TRANSFER_TRB_NORMAL *) TrbStart)->TDSize    = 0;\r
-        ((TRANSFER_TRB_NORMAL *) TrbStart)->IntTarget = Urb->EvtRing->EventInterrupter;\r
-        ((TRANSFER_TRB_NORMAL *) TrbStart)->ISP       = 1;\r
-        ((TRANSFER_TRB_NORMAL *) TrbStart)->IOC       = 1;\r
-        ((TRANSFER_TRB_NORMAL *) TrbStart)->Type      = TRB_TYPE_NORMAL;\r
+        TrbStart = (TRB *)(UINTN)EPRing->RingEnqueue;\r
+        TrbStart->TrbNormal.TRBPtrLo  = XHC_LOW_32BIT((UINT8 *) Urb->Data + TotalLen);\r
+        TrbStart->TrbNormal.TRBPtrHi  = XHC_HIGH_32BIT((UINT8 *) Urb->Data + TotalLen);\r
+        TrbStart->TrbNormal.Lenth     = (UINT32) Len;\r
+        TrbStart->TrbNormal.TDSize    = 0;\r
+        TrbStart->TrbNormal.IntTarget = Urb->EvtRing->EventInterrupter;\r
+        TrbStart->TrbNormal.ISP       = 1;\r
+        TrbStart->TrbNormal.IOC       = 1;\r
+        TrbStart->TrbNormal.Type      = TRB_TYPE_NORMAL;\r
         //\r
         // Update the cycle bit\r
         //\r
-        ((TRANSFER_TRB_NORMAL *) TrbStart)->CycleBit = EPRing->RingPCS & BIT0;\r
+        TrbStart->TrbNormal.CycleBit = EPRing->RingPCS & BIT0;\r
 \r
         XhcSyncTrsRing (Xhc, EPRing);\r
         TrbNum++;\r
@@ -552,7 +397,7 @@ XhcCreateTransferTrb (
       }\r
 \r
       Urb->TrbNum = TrbNum;\r
-      Urb->TrbEnd = TrbStart;\r
+      Urb->TrbEnd = (TRB_TEMPLATE *)(UINTN)TrbStart;\r
       break;\r
 \r
     default:\r
@@ -568,12 +413,12 @@ XhcCreateTransferTrb (
 /**\r
   Initialize the XHCI host controller for schedule.\r
 \r
-  @param  Xhc        The XHCI device to be initialized.\r
+  @param  Xhc        The XHCI Instance to be initialized.\r
 \r
 **/\r
 VOID\r
 XhcInitSched (\r
-  IN USB_XHCI_DEV         *Xhc\r
+  IN USB_XHCI_INSTANCE    *Xhc\r
   )\r
 {\r
   VOID                  *Dcbaa;\r
@@ -599,8 +444,9 @@ XhcInitSched (
   // Software shall set Device Context Base Address Array entries for unallocated Device Slots to '0'.\r
   //\r
   Entries = (Xhc->MaxSlotsEn + 1) * sizeof(UINT64);\r
-  Dcbaa   = AllocateAlignedZeroPool(Entries, 64);\r
+  Dcbaa   = AllocatePages (EFI_SIZE_TO_PAGES (Entries));\r
   ASSERT (Dcbaa != NULL);\r
+  ZeroMem (Dcbaa, Entries);\r
 \r
   //\r
   // A Scratchpad Buffer is a PAGESIZE block of system memory located on a PAGESIZE boundary.\r
@@ -611,12 +457,15 @@ XhcInitSched (
   Xhc->MaxScratchpadBufs = MaxScratchpadBufs;\r
   ASSERT (MaxScratchpadBufs <= 1023);\r
   if (MaxScratchpadBufs != 0) {\r
-    ScratchBuf      = AllocateAlignedZeroPool(MaxScratchpadBufs * sizeof (UINT64), Xhc->PageSize);\r
+    ScratchBuf = AllocateAlignedPages (EFI_SIZE_TO_PAGES (MaxScratchpadBufs * sizeof (UINT64)), Xhc->PageSize);\r
     ASSERT (ScratchBuf != NULL);\r
+    ZeroMem (ScratchBuf, MaxScratchpadBufs * sizeof (UINT64));\r
     Xhc->ScratchBuf = ScratchBuf;\r
 \r
     for (Index = 0; Index < MaxScratchpadBufs; Index++) {\r
-      ScratchEntryBuf = AllocateAlignedZeroPool(Xhc->PageSize, Xhc->PageSize);\r
+      ScratchEntryBuf = AllocateAlignedPages (EFI_SIZE_TO_PAGES (Xhc->PageSize), Xhc->PageSize);\r
+      ASSERT (ScratchEntryBuf != NULL);\r
+      ZeroMem (ScratchEntryBuf, Xhc->PageSize);\r
       *ScratchBuf++   = (UINT64)(UINTN)ScratchEntryBuf;\r
     }\r
 \r
@@ -631,7 +480,7 @@ XhcInitSched (
   // Program the Device Context Base Address Array Pointer (DCBAAP) register (5.4.6) with\r
   // a 64-bit address pointing to where the Device Context Base Address Array is located.\r
   //\r
-  Xhc->DCBAA     = (UINT64 *)(UINTN)Dcbaa;\r
+  Xhc->DCBAA = (UINT64 *)(UINTN)Dcbaa;\r
   XhcWriteOpReg64 (Xhc, XHC_DCBAAP_OFFSET, (UINT64)(UINTN)Xhc->DCBAA);\r
   DEBUG ((EFI_D_INFO, "XhcInitSched:DCBAA=0x%x\n", (UINT64)(UINTN)Xhc->DCBAA));\r
 \r
@@ -670,8 +519,8 @@ XhcInitSched (
   CreateEventRing (Xhc, CMD_INTER, &Xhc->CmdEventRing);\r
   CreateEventRing (Xhc, CTRL_INTER, &Xhc->CtrlTrEventRing);\r
   CreateEventRing (Xhc, BULK_INTER, &Xhc->BulkTrEventRing);\r
-  CreateEventRing (Xhc, INT_INTER,  &Xhc->IntTrEventRing);\r
-  CreateEventRing (Xhc, INT_INTER_ASYNC,  &Xhc->AsynIntTrEventRing);\r
+  CreateEventRing (Xhc, INT_INTER, &Xhc->IntTrEventRing);\r
+  CreateEventRing (Xhc, INT_INTER_ASYNC, &Xhc->AsynIntTrEventRing);\r
 }\r
 \r
 /**\r
@@ -681,7 +530,7 @@ XhcInitSched (
   reenabled. The next write to the Doorbell of the Endpoint will transition the Endpoint Context from the\r
   Stopped to the Running state.\r
 \r
-  @param  Xhc                   The XHCI device.\r
+  @param  Xhc                   The XHCI Instance.\r
   @param  Urb                   The urb which makes the endpoint halted.\r
 \r
   @retval EFI_SUCCESS           The recovery is successful.\r
@@ -691,19 +540,19 @@ XhcInitSched (
 EFI_STATUS\r
 EFIAPI\r
 XhcRecoverHaltedEndpoint (\r
-  IN  USB_XHCI_DEV        *Xhc,\r
+  IN  USB_XHCI_INSTANCE   *Xhc,\r
   IN  URB                 *Urb\r
   )\r
 {\r
-  EFI_STATUS                 Status;\r
-  EVT_TRB_COMMAND            *EvtTrb;\r
-  CMD_TRB_RESET_ED           CmdTrbResetED;\r
-  CMD_SET_TR_DEQ             CmdSetTRDeq;\r
-  UINT8                      Dci;\r
-  UINT8                      SlotId;\r
+  EFI_STATUS                  Status;\r
+  EVT_TRB_COMMAND_COMPLETION  *EvtTrb;\r
+  CMD_TRB_RESET_ENDPOINT      CmdTrbResetED;\r
+  CMD_SET_TR_DEQ_POINTER      CmdSetTRDeq;\r
+  UINT8                       Dci;\r
+  UINT8                       SlotId;\r
 \r
   Status     = EFI_SUCCESS;\r
-  SlotId     = XhcDevAddrToSlotId(Urb->Ep.DevAddr);\r
+  SlotId     = XhcDevAddrToSlotId(Xhc, Urb->Ep.DevAddr);\r
   Dci        = XhcEndpointToDci(Urb->Ep.EpAddr, (UINT8)(Urb->Ep.Direction));\r
 \r
   DEBUG ((EFI_D_INFO, "Recovery Halted Slot = %x,Dci = %x\n", SlotId, Dci));\r
@@ -718,9 +567,9 @@ XhcRecoverHaltedEndpoint (
   CmdTrbResetED.SlotId   = SlotId;\r
   Status = XhcCmdTransfer (\r
              Xhc,\r
-             (TRB *) (UINTN) &CmdTrbResetED,\r
+             (TRB_TEMPLATE *) (UINTN) &CmdTrbResetED,\r
              XHC_GENERIC_TIMEOUT,\r
-             (TRB **) (UINTN) &EvtTrb\r
+             (TRB_TEMPLATE **) (UINTN) &EvtTrb\r
              );\r
   ASSERT (!EFI_ERROR(Status));\r
 \r
@@ -736,9 +585,9 @@ XhcRecoverHaltedEndpoint (
   CmdSetTRDeq.SlotId   = SlotId;\r
   Status = XhcCmdTransfer (\r
              Xhc,\r
-             (TRB *) (UINTN) &CmdSetTRDeq,\r
+             (TRB_TEMPLATE *) (UINTN) &CmdSetTRDeq,\r
              XHC_GENERIC_TIMEOUT,\r
-             (TRB **) (UINTN) &EvtTrb\r
+             (TRB_TEMPLATE **) (UINTN) &EvtTrb\r
              );\r
   ASSERT (!EFI_ERROR(Status));\r
 \r
@@ -753,14 +602,14 @@ XhcRecoverHaltedEndpoint (
 /**\r
   Create XHCI event ring.\r
 \r
-  @param  Xhc                 The XHCI device.\r
+  @param  Xhc                 The XHCI Instance.\r
   @param  EventInterrupter    The interrupter of event.\r
   @param  EventRing           The created event ring.\r
 \r
 **/\r
 VOID\r
 CreateEventRing (\r
-  IN  USB_XHCI_DEV          *Xhc,\r
+  IN  USB_XHCI_INSTANCE     *Xhc,\r
   IN  UINT8                 EventInterrupter,\r
   OUT EVENT_RING            *EventRing\r
   )\r
@@ -770,24 +619,26 @@ CreateEventRing (
 \r
   ASSERT (EventRing != NULL);\r
 \r
-  Buf = AllocateAlignedZeroPool(sizeof (TRB) * EVENT_RING_TRB_NUMBER, 64);\r
+  Buf = AllocatePages (EFI_SIZE_TO_PAGES (sizeof (TRB_TEMPLATE) * EVENT_RING_TRB_NUMBER));\r
   ASSERT (Buf != NULL);\r
   ASSERT (((UINTN) Buf & 0x3F) == 0);\r
+  ZeroMem (Buf, sizeof (TRB_TEMPLATE) * EVENT_RING_TRB_NUMBER);\r
 \r
   EventRing->EventRingSeg0    = Buf;\r
   EventRing->EventInterrupter = EventInterrupter;\r
   EventRing->TrbNumber        = EVENT_RING_TRB_NUMBER;\r
-  EventRing->EventRingDequeue = (TRB *) EventRing->EventRingSeg0;\r
-  EventRing->EventRingEnqueue = (TRB *) EventRing->EventRingSeg0;\r
+  EventRing->EventRingDequeue = (TRB_TEMPLATE *) EventRing->EventRingSeg0;\r
+  EventRing->EventRingEnqueue = (TRB_TEMPLATE *) EventRing->EventRingSeg0;\r
   //\r
   // Software maintains an Event Ring Consumer Cycle State (CCS) bit, initializing it to '1'\r
   // and toggling it every time the Event Ring Dequeue Pointer wraps back to the beginning of the Event Ring.\r
   //\r
   EventRing->EventRingCCS = 1;\r
 \r
-  Buf = AllocateAlignedZeroPool(sizeof (EVENT_RING_SEG_TABLE_ENTRY) * ERST_NUMBER, 64);\r
+  Buf = AllocatePages (EFI_SIZE_TO_PAGES (sizeof (EVENT_RING_SEG_TABLE_ENTRY) * ERST_NUMBER));\r
   ASSERT (Buf != NULL);\r
   ASSERT (((UINTN) Buf & 0x3F) == 0);\r
+  ZeroMem (Buf, sizeof (EVENT_RING_SEG_TABLE_ENTRY) * ERST_NUMBER);\r
 \r
   ERSTBase              = (EVENT_RING_SEG_TABLE_ENTRY *) Buf;\r
   EventRing->ERSTBase   = ERSTBase;\r
@@ -828,36 +679,37 @@ CreateEventRing (
 /**\r
   Create XHCI transfer ring.\r
 \r
-  @param  Xhc               The XHCI device.\r
+  @param  Xhc               The XHCI Instance.\r
   @param  TrbNum            The number of TRB in the ring.\r
   @param  TransferRing           The created transfer ring.\r
 \r
 **/\r
 VOID\r
 CreateTransferRing (\r
-  IN  USB_XHCI_DEV          *Xhc,\r
+  IN  USB_XHCI_INSTANCE     *Xhc,\r
   IN  UINTN                 TrbNum,\r
   OUT TRANSFER_RING         *TransferRing\r
   )\r
 {\r
   VOID                  *Buf;\r
-  LNK_TRB               *EndTrb;\r
+  LINK_TRB              *EndTrb;\r
 \r
-  Buf = AllocateAlignedZeroPool(sizeof (TRB) * TrbNum, 64);\r
+  Buf = AllocatePages (EFI_SIZE_TO_PAGES (sizeof (TRB_TEMPLATE) * TrbNum));\r
   ASSERT (Buf != NULL);\r
   ASSERT (((UINTN) Buf & 0x3F) == 0);\r
+  ZeroMem (Buf, sizeof (TRB_TEMPLATE) * TrbNum);\r
 \r
   TransferRing->RingSeg0     = Buf;\r
   TransferRing->TrbNumber    = TrbNum;\r
-  TransferRing->RingEnqueue  = (TRB *) TransferRing->RingSeg0;\r
-  TransferRing->RingDequeue  = (TRB *) TransferRing->RingSeg0;\r
+  TransferRing->RingEnqueue  = (TRB_TEMPLATE *) TransferRing->RingSeg0;\r
+  TransferRing->RingDequeue  = (TRB_TEMPLATE *) TransferRing->RingSeg0;\r
   TransferRing->RingPCS      = 1;\r
   //\r
   // 4.9.2 Transfer Ring Management\r
   // To form a ring (or circular queue) a Link TRB may be inserted at the end of a ring to\r
   // point to the first TRB in the ring.\r
   //\r
-  EndTrb        = (LNK_TRB*) ((UINTN)Buf + sizeof (TRB) * (TrbNum - 1));\r
+  EndTrb        = (LINK_TRB *) ((UINTN)Buf + sizeof (TRB_TEMPLATE) * (TrbNum - 1));\r
   EndTrb->Type  = TRB_TYPE_LINK;\r
   EndTrb->PtrLo = XHC_LOW_32BIT (Buf);\r
   EndTrb->PtrHi = XHC_HIGH_32BIT (Buf);\r
@@ -874,14 +726,14 @@ CreateTransferRing (
 /**\r
   Free XHCI event ring.\r
 \r
-  @param  Xhc                 The XHCI device.\r
+  @param  Xhc                 The XHCI Instance.\r
   @param  EventRing           The event ring to be freed.\r
 \r
 **/\r
 EFI_STATUS\r
 EFIAPI\r
 XhcFreeEventRing (\r
-  IN  USB_XHCI_DEV        *Xhc,\r
+  IN  USB_XHCI_INSTANCE   *Xhc,\r
   IN  EVENT_RING          *EventRing\r
 )\r
 {\r
@@ -889,13 +741,11 @@ XhcFreeEventRing (
   EVENT_RING_SEG_TABLE_ENTRY    *TablePtr;\r
   VOID                          *RingBuf;\r
   EVENT_RING_SEG_TABLE_ENTRY    *EventRingPtr;\r
-  UINTN                         InterrupterTarget;\r
 \r
   if(EventRing->EventRingSeg0 == NULL) {\r
     return EFI_SUCCESS;\r
   }\r
 \r
-  InterrupterTarget = EventRing->EventInterrupter;\r
   //\r
   // Get the Event Ring Segment Table base address\r
   //\r
@@ -909,43 +759,47 @@ XhcFreeEventRing (
     RingBuf      = (VOID *)(UINTN)(EventRingPtr->PtrLo | ((UINT64)EventRingPtr->PtrHi << 32));\r
 \r
     if(RingBuf != NULL) {\r
-      FreeAlignedPool (RingBuf);\r
+      FreePages (RingBuf, EFI_SIZE_TO_PAGES (sizeof (TRB_TEMPLATE) * EVENT_RING_TRB_NUMBER));\r
       ZeroMem (EventRingPtr, sizeof (EVENT_RING_SEG_TABLE_ENTRY));\r
     }\r
   }\r
 \r
-  FreeAlignedPool (TablePtr);\r
+  FreePages (TablePtr, EFI_SIZE_TO_PAGES (sizeof (EVENT_RING_SEG_TABLE_ENTRY) * ERST_NUMBER));\r
   return EFI_SUCCESS;\r
 }\r
 \r
 /**\r
   Free the resouce allocated at initializing schedule.\r
 \r
-  @param  Xhc        The XHCI device.\r
+  @param  Xhc        The XHCI Instance.\r
 \r
 **/\r
 VOID\r
 XhcFreeSched (\r
-  IN USB_XHCI_DEV         *Xhc\r
+  IN USB_XHCI_INSTANCE    *Xhc\r
   )\r
 {\r
   UINT32    Index;\r
+  UINT64    *ScratchBuf;\r
 \r
   if (Xhc->ScratchBuf != NULL) {\r
+    ScratchBuf = Xhc->ScratchBuf;\r
     for (Index = 0; Index < Xhc->MaxScratchpadBufs; Index++) {\r
-      FreeAlignedPool ((VOID*)(UINTN)*Xhc->ScratchBuf++);\r
+      FreeAlignedPages ((VOID*)(UINTN)*ScratchBuf++, EFI_SIZE_TO_PAGES (Xhc->PageSize));\r
     }\r
+    FreeAlignedPages (Xhc->ScratchBuf, EFI_SIZE_TO_PAGES (Xhc->MaxScratchpadBufs * sizeof (UINT64)));\r
   }\r
 \r
   if (Xhc->DCBAA != NULL) {\r
-    FreeAlignedPool (Xhc->DCBAA);\r
+    FreePages (Xhc->DCBAA, EFI_SIZE_TO_PAGES((Xhc->MaxSlotsEn + 1) * sizeof(UINT64)));\r
     Xhc->DCBAA = NULL;\r
   }\r
 \r
   if (Xhc->CmdRing.RingSeg0 != NULL){\r
-    FreeAlignedPool (Xhc->CmdRing.RingSeg0);\r
+    FreePages (Xhc->CmdRing.RingSeg0, EFI_SIZE_TO_PAGES (sizeof (TRB_TEMPLATE) * CMD_RING_TRB_NUMBER));\r
     Xhc->CmdRing.RingSeg0 = NULL;\r
   }\r
+\r
   XhcFreeEventRing (Xhc,&Xhc->CmdEventRing);\r
   XhcFreeEventRing (Xhc,&Xhc->CtrlTrEventRing);\r
   XhcFreeEventRing (Xhc,&Xhc->BulkTrEventRing);\r
@@ -966,11 +820,11 @@ XhcFreeSched (
 BOOLEAN\r
 IsTransferRingTrb (\r
   IN  TRANSFER_RING       *Ring,\r
-  IN  TRB                 *Trb\r
+  IN  TRB_TEMPLATE        *Trb\r
   )\r
 {\r
   BOOLEAN       Flag;\r
-  TRB           *Trb1;\r
+  TRB_TEMPLATE  *Trb1;\r
   UINTN         Index;\r
 \r
   Trb1 = Ring->RingSeg0;\r
@@ -993,7 +847,7 @@ IsTransferRingTrb (
   Check the URB's execution result and update the URB's\r
   result accordingly.\r
 \r
-  @param  Xhc             The XHCI device.\r
+  @param  Xhc             The XHCI Instance.\r
   @param  Urb             The URB to check result.\r
 \r
   @return Whether the result of URB transfer is finialized.\r
@@ -1001,14 +855,14 @@ IsTransferRingTrb (
 **/\r
 EFI_STATUS\r
 XhcCheckUrbResult (\r
-  IN  USB_XHCI_DEV        *Xhc,\r
+  IN  USB_XHCI_INSTANCE   *Xhc,\r
   IN  URB                 *Urb\r
   )\r
 {\r
   BOOLEAN                 StartDone;\r
   BOOLEAN                 EndDone;\r
   EVT_TRB_TRANSFER        *EvtTrb;\r
-  TRB                     *TRBPtr;\r
+  TRB_TEMPLATE            *TRBPtr;\r
   UINTN                   Index;\r
   UINT8                   TRBType;\r
   EFI_STATUS              Status;\r
@@ -1034,47 +888,47 @@ XhcCheckUrbResult (
   Urb->EvtRing->EventRingDequeue = Urb->EvtTrbStart;\r
   for (Index = 0; Index < Urb->EvtRing->TrbNumber; Index++) {\r
     XhcSyncEventRing (Xhc, Urb->EvtRing);\r
-    Status = XhcCheckNewEvent (Xhc, Urb->EvtRing, ((TRB **)&EvtTrb));\r
+    Status = XhcCheckNewEvent (Xhc, Urb->EvtRing, ((TRB_TEMPLATE **)&EvtTrb));\r
     if (Status == EFI_NOT_READY) {\r
       Urb->Result |= EFI_USB_ERR_TIMEOUT;\r
       goto EXIT;\r
     }\r
 \r
-    TRBPtr = (TRB *)(UINTN)(EvtTrb->TRBPtrLo | (UINT64) EvtTrb->TRBPtrHi << 32);\r
+    TRBPtr = (TRB_TEMPLATE *)(UINTN)(EvtTrb->TRBPtrLo | (UINT64) EvtTrb->TRBPtrHi << 32);\r
 \r
-    switch (EvtTrb->Completcode) {\r
+    switch (EvtTrb->Completecode) {\r
       case TRB_COMPLETION_STALL_ERROR:\r
         Urb->Result |= EFI_USB_ERR_STALL;\r
         Status       = EFI_DEVICE_ERROR;\r
-        DEBUG ((EFI_D_ERROR, "XhcCheckUrbResult: STALL_ERROR! Completcode = %x\n",EvtTrb->Completcode));\r
+        DEBUG ((EFI_D_ERROR, "XhcCheckUrbResult: STALL_ERROR! Completecode = %x\n",EvtTrb->Completecode));\r
         goto EXIT;\r
         break;\r
 \r
       case TRB_COMPLETION_BABBLE_ERROR:\r
         Urb->Result |= EFI_USB_ERR_BABBLE;\r
         Status       = EFI_DEVICE_ERROR;\r
-        DEBUG ((EFI_D_ERROR, "XhcCheckUrbResult: BABBLE_ERROR! Completcode = %x\n",EvtTrb->Completcode));\r
+        DEBUG ((EFI_D_ERROR, "XhcCheckUrbResult: BABBLE_ERROR! Completecode = %x\n",EvtTrb->Completecode));\r
         goto EXIT;\r
         break;\r
 \r
       case TRB_COMPLETION_DATA_BUFFER_ERROR:\r
         Urb->Result |= EFI_USB_ERR_BUFFER;\r
         Status       = EFI_DEVICE_ERROR;\r
-        DEBUG ((EFI_D_ERROR, "XhcCheckUrbResult: ERR_BUFFER! Completcode = %x\n",EvtTrb->Completcode));\r
+        DEBUG ((EFI_D_ERROR, "XhcCheckUrbResult: ERR_BUFFER! Completecode = %x\n",EvtTrb->Completecode));\r
         goto EXIT;\r
         break;\r
 \r
       case TRB_COMPLETION_USB_TRANSACTION_ERROR:\r
         Urb->Result |= EFI_USB_ERR_TIMEOUT;\r
         Status       = EFI_DEVICE_ERROR;\r
-        DEBUG ((EFI_D_ERROR, "XhcCheckUrbResult: TRANSACTION_ERROR! Completcode = %x\n",EvtTrb->Completcode));\r
+        DEBUG ((EFI_D_ERROR, "XhcCheckUrbResult: TRANSACTION_ERROR! Completecode = %x\n",EvtTrb->Completecode));\r
         goto EXIT;\r
         break;\r
 \r
       case TRB_COMPLETION_SHORT_PACKET:\r
       case TRB_COMPLETION_SUCCESS:\r
         if (IsTransferRingTrb (Urb->Ring, TRBPtr)) {\r
-          if (EvtTrb->Completcode == TRB_COMPLETION_SHORT_PACKET) {\r
+          if (EvtTrb->Completecode == TRB_COMPLETION_SHORT_PACKET) {\r
             DEBUG ((EFI_D_ERROR, "XhcCheckUrbResult: short packet happens!\n"));\r
           }\r
           TRBType = (UINT8) (TRBPtr->Type);\r
@@ -1088,7 +942,7 @@ XhcCheckUrbResult (
         break;\r
 \r
       default:\r
-        DEBUG ((EFI_D_ERROR, "Transfer Default Error Occur! Completcode = 0x%x!\n",EvtTrb->Completcode));\r
+        DEBUG ((EFI_D_ERROR, "Transfer Default Error Occur! Completecode = 0x%x!\n",EvtTrb->Completecode));\r
         Urb->Result |= EFI_USB_ERR_TIMEOUT;\r
         Status = EFI_DEVICE_ERROR;\r
         goto EXIT;\r
@@ -1119,10 +973,10 @@ EXIT:
 /**\r
   Execute the transfer by polling the URB. This is a synchronous operation.\r
 \r
-  @param  Xhc               The XHCI device.\r
+  @param  Xhc               The XHCI Instance.\r
   @param  CmdTransfer       The executed URB is for cmd transfer or not.\r
   @param  Urb               The URB to execute.\r
-  @param  TimeOut           The time to wait before abort, in millisecond.\r
+  @param  Timeout           The time to wait before abort, in millisecond.\r
 \r
   @return EFI_DEVICE_ERROR  The transfer failed due to transfer error.\r
   @return EFI_TIMEOUT       The transfer failed due to time out.\r
@@ -1131,10 +985,10 @@ EXIT:
 **/\r
 EFI_STATUS\r
 XhcExecTransfer (\r
-  IN  USB_XHCI_DEV        *Xhc,\r
+  IN  USB_XHCI_INSTANCE   *Xhc,\r
   IN  BOOLEAN             CmdTransfer,\r
   IN  URB                 *Urb,\r
-  IN  UINTN               TimeOut\r
+  IN  UINTN               Timeout\r
   )\r
 {\r
   EFI_STATUS              Status;\r
@@ -1147,13 +1001,13 @@ XhcExecTransfer (
     SlotId = 0;\r
     Dci    = 0;\r
   } else {\r
-    SlotId = XhcDevAddrToSlotId(Urb->Ep.DevAddr);\r
+    SlotId = XhcDevAddrToSlotId(Xhc, Urb->Ep.DevAddr);\r
     Dci    = XhcEndpointToDci(Urb->Ep.EpAddr, (UINT8)(Urb->Ep.Direction));\r
   }\r
 \r
   Status = EFI_SUCCESS;\r
-  Loop   = (TimeOut * XHC_1_MILLISECOND / XHC_SYNC_POLL_INTERVAL) + 1;\r
-  if (TimeOut == 0) {\r
+  Loop   = (Timeout * XHC_1_MILLISECOND / XHC_POLL_DELAY) + 1;\r
+  if (Timeout == 0) {\r
     Loop = 0xFFFFFFFF;\r
   }\r
 \r
@@ -1164,7 +1018,7 @@ XhcExecTransfer (
     if ((Status != EFI_NOT_READY)) {\r
       break;\r
     }\r
-    gBS->Stall (XHC_SYNC_POLL_INTERVAL);\r
+    gBS->Stall (XHC_POLL_DELAY);\r
   }\r
 \r
   return Status;\r
@@ -1174,7 +1028,7 @@ XhcExecTransfer (
   Delete a single asynchronous interrupt transfer for\r
   the device and endpoint.\r
 \r
-  @param  Xhc                   The XHCI device.\r
+  @param  Xhc                   The XHCI Instance.\r
   @param  DevAddr               The address of the target device.\r
   @param  EpNum                 The endpoint of the target.\r
 \r
@@ -1184,7 +1038,7 @@ XhcExecTransfer (
 **/\r
 EFI_STATUS\r
 XhciDelAsyncIntTransfer (\r
-  IN  USB_XHCI_DEV        *Xhc,\r
+  IN  USB_XHCI_INSTANCE   *Xhc,\r
   IN  UINT8               DevAddr,\r
   IN  UINT8               EpNum\r
   )\r
@@ -1193,12 +1047,10 @@ XhciDelAsyncIntTransfer (
   LIST_ENTRY              *Next;\r
   URB                     *Urb;\r
   EFI_USB_DATA_DIRECTION  Direction;\r
-  BOOLEAN                 Found;\r
 \r
   Direction = ((EpNum & 0x80) != 0) ? EfiUsbDataIn : EfiUsbDataOut;\r
   EpNum    &= 0x0F;\r
 \r
-  Found = FALSE;\r
   Urb   = NULL;\r
 \r
   EFI_LIST_FOR_EACH_SAFE (Entry, Next, &Xhc->AsyncIntTransfers) {\r
@@ -1219,12 +1071,12 @@ XhciDelAsyncIntTransfer (
 /**\r
   Remove all the asynchronous interrutp transfers.\r
 \r
-  @param  Xhc    The XHCI device.\r
+  @param  Xhc    The XHCI Instance.\r
 \r
 **/\r
 VOID\r
 XhciDelAllAsyncIntTransfers (\r
-  IN USB_XHCI_DEV         *Xhc\r
+  IN USB_XHCI_INSTANCE    *Xhc\r
   )\r
 {\r
   LIST_ENTRY              *Entry;\r
@@ -1242,13 +1094,13 @@ XhciDelAllAsyncIntTransfers (
 /**\r
   Update the queue head for next round of asynchronous transfer\r
 \r
-  @param  Xhc     The XHCI device.\r
+  @param  Xhc     The XHCI Instance.\r
   @param  Urb     The URB to update\r
 \r
 **/\r
 VOID\r
 XhcUpdateAsyncRequest (\r
-  IN USB_XHCI_DEV*            Xhc,\r
+  IN USB_XHCI_INSTANCE        *Xhc,\r
   IN URB                      *Urb\r
   )\r
 {\r
@@ -1267,7 +1119,7 @@ XhcUpdateAsyncRequest (
   Interrupt transfer periodic check handler.\r
 \r
   @param  Event                 Interrupt event.\r
-  @param  Context               Pointer to USB_XHCI_DEV.\r
+  @param  Context               Pointer to USB_XHCI_INSTANCE.\r
 \r
 **/\r
 VOID\r
@@ -1277,7 +1129,7 @@ XhcMonitorAsyncRequests (
   IN VOID                 *Context\r
   )\r
 {\r
-  USB_XHCI_DEV            *Xhc;\r
+  USB_XHCI_INSTANCE       *Xhc;\r
   LIST_ENTRY              *Entry;\r
   LIST_ENTRY              *Next;\r
   UINT8                   *ProcBuf;\r
@@ -1288,7 +1140,7 @@ XhcMonitorAsyncRequests (
 \r
   OldTpl = gBS->RaiseTPL (XHC_TPL);\r
 \r
-  Xhc    = (USB_XHCI_DEV*) Context;\r
+  Xhc    = (USB_XHCI_INSTANCE*) Context;\r
 \r
   EFI_LIST_FOR_EACH_SAFE (Entry, Next, &Xhc->AsyncIntTransfers) {\r
     Urb = EFI_LIST_CONTAINER (Entry, URB, UrbList);\r
@@ -1296,7 +1148,7 @@ XhcMonitorAsyncRequests (
     //\r
     // Make sure that the device is available before every check.\r
     //\r
-    SlotId = XhcDevAddrToSlotId(Urb->Ep.DevAddr);\r
+    SlotId = XhcDevAddrToSlotId(Xhc, Urb->Ep.DevAddr);\r
     if (SlotId == 0) {\r
       continue;\r
     }\r
@@ -1320,7 +1172,7 @@ XhcMonitorAsyncRequests (
     if (Urb->Result == EFI_USB_NOERROR) {\r
       ASSERT (Urb->Completed <= Urb->DataLen);\r
 \r
-      ProcBuf = AllocatePool (Urb->Completed);\r
+      ProcBuf = AllocateZeroPool (Urb->Completed);\r
 \r
       if (ProcBuf == NULL) {\r
         XhcUpdateAsyncRequest (Xhc, Urb);\r
@@ -1362,7 +1214,7 @@ XhcMonitorAsyncRequests (
 /**\r
   Monitor the port status change. Enable/Disable device slot if there is a device attached/detached.\r
 \r
-  @param  Xhc                   The XHCI device.\r
+  @param  Xhc                   The XHCI Instance.\r
   @param  ParentRouteChart      The route string pointed to the parent device if it exists.\r
   @param  Port                  The port to be polled.\r
   @param  PortState             The port state.\r
@@ -1374,7 +1226,7 @@ XhcMonitorAsyncRequests (
 EFI_STATUS\r
 EFIAPI\r
 XhcPollPortStatusChange (\r
-  IN  USB_XHCI_DEV*         Xhc,\r
+  IN  USB_XHCI_INSTANCE     *Xhc,\r
   IN  USB_DEV_ROUTE         ParentRouteChart,\r
   IN  UINT8                 Port,\r
   IN  EFI_USB_PORT_STATUS   *PortState\r
@@ -1388,17 +1240,17 @@ XhcPollPortStatusChange (
   Status = EFI_SUCCESS;\r
 \r
   if (ParentRouteChart.Dword == 0) {\r
-    RouteChart.Field.RouteString = 0;\r
-    RouteChart.Field.RootPortNum = Port + 1;\r
-    RouteChart.Field.TierNum     = 1;\r
+    RouteChart.Route.RouteString = 0;\r
+    RouteChart.Route.RootPortNum = Port + 1;\r
+    RouteChart.Route.TierNum     = 1;\r
   } else {\r
     if(Port < 14) {\r
-      RouteChart.Field.RouteString = ParentRouteChart.Field.RouteString | (Port << (4 * (ParentRouteChart.Field.TierNum - 1)));\r
+      RouteChart.Route.RouteString = ParentRouteChart.Route.RouteString | (Port << (4 * (ParentRouteChart.Route.TierNum - 1)));\r
     } else {\r
-      RouteChart.Field.RouteString = ParentRouteChart.Field.RouteString | (15 << (4 * (ParentRouteChart.Field.TierNum - 1)));\r
+      RouteChart.Route.RouteString = ParentRouteChart.Route.RouteString | (15 << (4 * (ParentRouteChart.Route.TierNum - 1)));\r
     }\r
-    RouteChart.Field.RootPortNum   = ParentRouteChart.Field.RootPortNum;\r
-    RouteChart.Field.TierNum       = ParentRouteChart.Field.TierNum + 1;\r
+    RouteChart.Route.RootPortNum   = ParentRouteChart.Route.RootPortNum;\r
+    RouteChart.Route.TierNum       = ParentRouteChart.Route.TierNum + 1;\r
   }\r
 \r
   if (((PortState->PortStatus & USB_PORT_STAT_ENABLE) != 0) &&\r
@@ -1417,7 +1269,7 @@ XhcPollPortStatusChange (
     //\r
     // Execute Enable_Slot cmd for attached device, initialize device context and assign device address.\r
     //\r
-    SlotId = XhcRouteStringToSlotId (RouteChart);\r
+    SlotId = XhcRouteStringToSlotId (Xhc, RouteChart);\r
     if (SlotId == 0) {\r
       Status = XhcInitializeDeviceSlot (Xhc, ParentRouteChart, Port, RouteChart, Speed);\r
       ASSERT_EFI_ERROR (Status);\r
@@ -1426,7 +1278,7 @@ XhcPollPortStatusChange (
     //\r
     // Device is detached. Disable the allocated device slot and release resource.\r
     //\r
-    SlotId = XhcRouteStringToSlotId (RouteChart);\r
+    SlotId = XhcRouteStringToSlotId (Xhc, RouteChart);\r
     if (SlotId != 0) {\r
       Status = XhcDisableSlotCmd (Xhc, SlotId);\r
       ASSERT_EFI_ERROR (Status);\r
@@ -1467,6 +1319,7 @@ XhcEndpointToDci (
 /**\r
   Find out the slot id according to device address assigned by XHCI's Address_Device cmd.\r
 \r
+  @param  Xhc             The XHCI Instance.\r
   @param  DevAddr         The device address of the target device.\r
 \r
   @return The slot id used by the device.\r
@@ -1474,15 +1327,16 @@ XhcEndpointToDci (
 **/\r
 UINT8\r
 XhcDevAddrToSlotId (\r
-  IN  UINT8       DevAddr\r
+  IN  USB_XHCI_INSTANCE  *Xhc,\r
+  IN  UINT8              DevAddr\r
   )\r
 {\r
   UINT8  Index;\r
 \r
   for (Index = 0; Index < 255; Index++) {\r
-    if (UsbDevContext[Index + 1].Enabled &&\r
-        (UsbDevContext[Index + 1].SlotId != 0) &&\r
-        (UsbDevContext[Index + 1].XhciDevAddr == DevAddr)) {\r
+    if (Xhc->UsbDevContext[Index + 1].Enabled &&\r
+        (Xhc->UsbDevContext[Index + 1].SlotId != 0) &&\r
+        (Xhc->UsbDevContext[Index + 1].XhciDevAddr == DevAddr)) {\r
       break;\r
     }\r
   }\r
@@ -1491,13 +1345,14 @@ XhcDevAddrToSlotId (
     return 0;\r
   }\r
 \r
-  return UsbDevContext[Index + 1].SlotId;\r
+  return Xhc->UsbDevContext[Index + 1].SlotId;\r
 }\r
 \r
 /**\r
   Find out the actual device address according to the requested device address from UsbBus.\r
 \r
-  @param  BusDevAddr       The requested device address by UsbBus upper driver.\r
+  @param  Xhc             The XHCI Instance.\r
+  @param  BusDevAddr      The requested device address by UsbBus upper driver.\r
 \r
   @return The actual device address assigned to the device.\r
 \r
@@ -1505,15 +1360,16 @@ XhcDevAddrToSlotId (
 UINT8\r
 EFIAPI\r
 XhcBusDevAddrToSlotId (\r
-  IN  UINT8       BusDevAddr\r
+  IN  USB_XHCI_INSTANCE  *Xhc,\r
+  IN  UINT8              BusDevAddr\r
   )\r
 {\r
   UINT8  Index;\r
 \r
   for (Index = 0; Index < 255; Index++) {\r
-    if (UsbDevContext[Index + 1].Enabled &&\r
-        (UsbDevContext[Index + 1].SlotId != 0) &&\r
-        (UsbDevContext[Index + 1].BusDevAddr == BusDevAddr)) {\r
+    if (Xhc->UsbDevContext[Index + 1].Enabled &&\r
+        (Xhc->UsbDevContext[Index + 1].SlotId != 0) &&\r
+        (Xhc->UsbDevContext[Index + 1].BusDevAddr == BusDevAddr)) {\r
       break;\r
     }\r
   }\r
@@ -1522,13 +1378,14 @@ XhcBusDevAddrToSlotId (
     return 0;\r
   }\r
 \r
-  return UsbDevContext[Index + 1].SlotId;\r
+  return Xhc->UsbDevContext[Index + 1].SlotId;\r
 }\r
 \r
 /**\r
   Find out the slot id according to the device's route string.\r
 \r
-  @param  RouteString      The route string described the device location.\r
+  @param  Xhc             The XHCI Instance.\r
+  @param  RouteString     The route string described the device location.\r
 \r
   @return The slot id used by the device.\r
 \r
@@ -1536,15 +1393,16 @@ XhcBusDevAddrToSlotId (
 UINT8\r
 EFIAPI\r
 XhcRouteStringToSlotId (\r
-  IN  USB_DEV_ROUTE     RouteString\r
+  IN  USB_XHCI_INSTANCE  *Xhc,\r
+  IN  USB_DEV_ROUTE      RouteString\r
   )\r
 {\r
   UINT8  Index;\r
 \r
   for (Index = 0; Index < 255; Index++) {\r
-    if (UsbDevContext[Index + 1].Enabled &&\r
-        (UsbDevContext[Index + 1].SlotId != 0) &&\r
-        (UsbDevContext[Index + 1].RouteString.Dword == RouteString.Dword)) {\r
+    if (Xhc->UsbDevContext[Index + 1].Enabled &&\r
+        (Xhc->UsbDevContext[Index + 1].SlotId != 0) &&\r
+        (Xhc->UsbDevContext[Index + 1].RouteString.Dword == RouteString.Dword)) {\r
       break;\r
     }\r
   }\r
@@ -1553,13 +1411,13 @@ XhcRouteStringToSlotId (
     return 0;\r
   }\r
 \r
-  return UsbDevContext[Index + 1].SlotId;\r
+  return Xhc->UsbDevContext[Index + 1].SlotId;\r
 }\r
 \r
 /**\r
   Synchronize the specified event ring to update the enqueue and dequeue pointer.\r
 \r
-  @param  Xhc         The XHCI device.\r
+  @param  Xhc         The XHCI Instance.\r
   @param  EvtRing     The event ring to sync.\r
 \r
   @retval EFI_SUCCESS The event ring is synchronized successfully.\r
@@ -1568,14 +1426,14 @@ XhcRouteStringToSlotId (
 EFI_STATUS\r
 EFIAPI\r
 XhcSyncEventRing (\r
-  IN USB_XHCI_DEV         *Xhc,\r
+  IN USB_XHCI_INSTANCE    *Xhc,\r
   IN EVENT_RING           *EvtRing\r
   )\r
 {\r
   UINTN               Index;\r
-  TRB                 *EvtTrb1;\r
-  TRB                 *EvtTrb2;\r
-  TRB                 *XhcDequeue;\r
+  TRB_TEMPLATE        *EvtTrb1;\r
+  TRB_TEMPLATE        *EvtTrb2;\r
+  TRB_TEMPLATE        *XhcDequeue;\r
 \r
   ASSERT (EvtRing != NULL);\r
 \r
@@ -1604,10 +1462,10 @@ XhcSyncEventRing (
   //\r
   // Apply the EventRingDequeue to Xhc\r
   //\r
-  XhcDequeue = (TRB *)(UINTN) XhcReadRuntimeReg64 (\r
-                                Xhc,\r
-                                XHC_ERDP_OFFSET + (32 * EvtRing->EventInterrupter)\r
-                                );\r
+  XhcDequeue = (TRB_TEMPLATE *)(UINTN) XhcReadRuntimeReg64 (\r
+                                         Xhc,\r
+                                         XHC_ERDP_OFFSET + (32 * EvtRing->EventInterrupter)\r
+                                         );\r
 \r
   if (((UINT64)(UINTN)XhcDequeue & (~0x0F)) != ((UINT64)(UINTN)EvtRing->EventRingDequeue & (~0x0F))) {\r
     XhcWriteRuntimeReg64 (\r
@@ -1623,7 +1481,7 @@ XhcSyncEventRing (
 /**\r
   Synchronize the specified transfer ring to update the enqueue and dequeue pointer.\r
 \r
-  @param  Xhc         The XHCI device.\r
+  @param  Xhc         The XHCI Instance.\r
   @param  TrsRing     The transfer ring to sync.\r
 \r
   @retval EFI_SUCCESS The transfer ring is synchronized successfully.\r
@@ -1632,12 +1490,12 @@ XhcSyncEventRing (
 EFI_STATUS\r
 EFIAPI\r
 XhcSyncTrsRing (\r
-  IN USB_XHCI_DEV         *Xhc,\r
+  IN USB_XHCI_INSTANCE    *Xhc,\r
   IN TRANSFER_RING        *TrsRing\r
   )\r
 {\r
   UINTN               Index;\r
-  TRB                 *TrsTrb;\r
+  TRB_TEMPLATE        *TrsTrb;\r
 \r
   ASSERT (TrsRing != NULL);\r
   //\r
@@ -1652,16 +1510,16 @@ XhcSyncTrsRing (
     }\r
     TrsTrb++;\r
     if ((UINT8) TrsTrb->Type == TRB_TYPE_LINK) {\r
-      ASSERT (((LNK_TRB*)TrsTrb)->TC != 0);\r
+      ASSERT (((LINK_TRB*)TrsTrb)->TC != 0);\r
       //\r
       // set cycle bit in Link TRB as normal\r
       //\r
-      ((LNK_TRB*)TrsTrb)->CycleBit = TrsRing->RingPCS & BIT0;\r
+      ((LINK_TRB*)TrsTrb)->CycleBit = TrsRing->RingPCS & BIT0;\r
       //\r
       // Toggle PCS maintained by software\r
       //\r
       TrsRing->RingPCS = (TrsRing->RingPCS & BIT0) ? 0 : 1;\r
-      TrsTrb           = (TRB*)(UINTN)((TrsTrb->Dword1 | ((UINT64)TrsTrb->Dword2 << 32)) & ~0x0F);\r
+      TrsTrb           = (TRB_TEMPLATE *)(UINTN)((TrsTrb->Parameter1 | ((UINT64)TrsTrb->Parameter2 << 32)) & ~0x0F);\r
     }\r
   }\r
 \r
@@ -1674,12 +1532,12 @@ XhcSyncTrsRing (
   //\r
   // Clear the Trb context for enqueue, but reserve the PCS bit\r
   //\r
-  TrsTrb->Dword1  = 0;\r
-  TrsTrb->Dword2  = 0;\r
-  TrsTrb->Dword3  = 0;\r
-  TrsTrb->RsvdZ1  = 0;\r
-  TrsTrb->Type    = 0;\r
-  TrsTrb->RsvdZ2  = 0;\r
+  TrsTrb->Parameter1 = 0;\r
+  TrsTrb->Parameter2 = 0;\r
+  TrsTrb->Status     = 0;\r
+  TrsTrb->RsvdZ1     = 0;\r
+  TrsTrb->Type       = 0;\r
+  TrsTrb->Control    = 0;\r
 \r
   return EFI_SUCCESS;\r
 }\r
@@ -1687,7 +1545,7 @@ XhcSyncTrsRing (
 /**\r
   Check if there is a new generated event.\r
 \r
-  @param  Xhc           The XHCI device.\r
+  @param  Xhc           The XHCI Instance.\r
   @param  EvtRing       The event ring to check.\r
   @param  NewEvtTrb     The new event TRB found.\r
 \r
@@ -1698,13 +1556,13 @@ XhcSyncTrsRing (
 EFI_STATUS\r
 EFIAPI\r
 XhcCheckNewEvent (\r
-  IN  USB_XHCI_DEV            *Xhc,\r
+  IN  USB_XHCI_INSTANCE       *Xhc,\r
   IN  EVENT_RING              *EvtRing,\r
-  OUT TRB                     **NewEvtTrb\r
+  OUT TRB_TEMPLATE            **NewEvtTrb\r
   )\r
 {\r
   EFI_STATUS  Status;\r
-  TRB         *EvtTrb;\r
+  TRB_TEMPLATE*EvtTrb;\r
 \r
   ASSERT (EvtRing != NULL);\r
 \r
@@ -1717,7 +1575,7 @@ XhcCheckNewEvent (
 \r
   Status = EFI_SUCCESS;\r
 \r
-  if (((EvtTrb->Dword3 >> 24) & 0xFF) != TRB_COMPLETION_SUCCESS) {\r
+  if (((EvtTrb->Status >> 24) & 0xFF) != TRB_COMPLETION_SUCCESS) {\r
     Status = EFI_DEVICE_ERROR;\r
   }\r
 \r
@@ -1725,7 +1583,7 @@ XhcCheckNewEvent (
   //\r
   // If the dequeue pointer is beyond the ring, then roll-back it to the begining of the ring.\r
   //\r
-  if ((UINTN)EvtRing->EventRingDequeue >=  ((UINTN) EvtRing->EventRingSeg0 + sizeof (TRB) * EvtRing->TrbNumber)) {\r
+  if ((UINTN)EvtRing->EventRingDequeue >=  ((UINTN) EvtRing->EventRingSeg0 + sizeof (TRB_TEMPLATE) * EvtRing->TrbNumber)) {\r
     EvtRing->EventRingDequeue = EvtRing->EventRingSeg0;\r
   }\r
 \r
@@ -1735,7 +1593,7 @@ XhcCheckNewEvent (
 /**\r
   Ring the door bell to notify XHCI there is a transaction to be executed.\r
 \r
-  @param  Xhc           The XHCI device.\r
+  @param  Xhc           The XHCI Instance.\r
   @param  SlotId        The slot id of the target device.\r
   @param  Dci           The device context index of the target slot or endpoint.\r
 \r
@@ -1745,7 +1603,7 @@ XhcCheckNewEvent (
 EFI_STATUS\r
 EFIAPI\r
 XhcRingDoorBell (\r
-  IN USB_XHCI_DEV         *Xhc,\r
+  IN USB_XHCI_INSTANCE    *Xhc,\r
   IN UINT8                SlotId,\r
   IN UINT8                Dci\r
   )\r
@@ -1762,7 +1620,7 @@ XhcRingDoorBell (
 /**\r
   Ring the door bell to notify XHCI there is a transaction to be executed through URB.\r
 \r
-  @param  Xhc           The XHCI device.\r
+  @param  Xhc           The XHCI Instance.\r
   @param  Urb           The URB to be rung.\r
 \r
   @retval EFI_SUCCESS   Successfully ring the door bell.\r
@@ -1770,14 +1628,14 @@ XhcRingDoorBell (
 **/\r
 EFI_STATUS\r
 RingIntTransferDoorBell (\r
-  IN  USB_XHCI_DEV        *Xhc,\r
+  IN  USB_XHCI_INSTANCE   *Xhc,\r
   IN  URB                 *Urb\r
   )\r
 {\r
   UINT8                SlotId;\r
   UINT8                Dci;\r
 \r
-  SlotId = XhcDevAddrToSlotId(Urb->Ep.DevAddr);\r
+  SlotId = XhcDevAddrToSlotId(Xhc, Urb->Ep.DevAddr);\r
   Dci    = XhcEndpointToDci(Urb->Ep.EpAddr, (UINT8)(Urb->Ep.Direction));\r
   XhcRingDoorBell (Xhc, SlotId, Dci);\r
   return EFI_SUCCESS;\r
@@ -1786,7 +1644,7 @@ RingIntTransferDoorBell (
 /**\r
   Assign and initialize the device slot for a new device.\r
 \r
-  @param  Xhc                 The XHCI device.\r
+  @param  Xhc                 The XHCI Instance.\r
   @param  ParentRouteChart    The route string pointed to the parent device.\r
   @param  ParentPort          The port at which the device is located.\r
   @param  RouteChart          The route string pointed to the device.\r
@@ -1798,34 +1656,34 @@ RingIntTransferDoorBell (
 EFI_STATUS\r
 EFIAPI\r
 XhcInitializeDeviceSlot (\r
-  IN  USB_XHCI_DEV              *Xhc,\r
+  IN  USB_XHCI_INSTANCE         *Xhc,\r
   IN  USB_DEV_ROUTE             ParentRouteChart,\r
   IN  UINT16                    ParentPort,\r
   IN  USB_DEV_ROUTE             RouteChart,\r
   IN  UINT8                     DeviceSpeed\r
   )\r
 {\r
-  EFI_STATUS            Status;\r
-  EVT_TRB_COMMAND       *EvtTrb;\r
-  INPUT_CONTEXT         *InputContext;\r
-  DEVICE_CONTEXT        *OutputDevContxt;\r
-  TRANSFER_RING         *EndpointTransferRing;\r
-  CMD_TRB_ADDR_DEV      CmdTrbAddr;\r
-  UINT8                 DeviceAddress;\r
-  CMD_TRB_EN_SLOT       CmdTrb;\r
-  UINT8                 SlotId;\r
-  UINT8                 ParentSlotId;\r
-  DEVICE_CONTEXT        *ParentDeviceContext;\r
-\r
-  ZeroMem (&CmdTrb, sizeof (CMD_TRB_EN_SLOT));\r
+  EFI_STATUS                  Status;\r
+  EVT_TRB_COMMAND_COMPLETION  *EvtTrb;\r
+  INPUT_CONTEXT               *InputContext;\r
+  DEVICE_CONTEXT              *OutputContext;\r
+  TRANSFER_RING               *EndpointTransferRing;\r
+  CMD_TRB_ADDRESS_DEVICE      CmdTrbAddr;\r
+  UINT8                       DeviceAddress;\r
+  CMD_TRB_ENABLE_SLOT         CmdTrb;\r
+  UINT8                       SlotId;\r
+  UINT8                       ParentSlotId;\r
+  DEVICE_CONTEXT              *ParentDeviceContext;\r
+\r
+  ZeroMem (&CmdTrb, sizeof (CMD_TRB_ENABLE_SLOT));\r
   CmdTrb.CycleBit = 1;\r
   CmdTrb.Type     = TRB_TYPE_EN_SLOT;\r
 \r
   Status = XhcCmdTransfer (\r
               Xhc,\r
-              (TRB *) (UINTN) &CmdTrb,\r
+              (TRB_TEMPLATE *) (UINTN) &CmdTrb,\r
               XHC_GENERIC_TIMEOUT,\r
-              (TRB **) (UINTN) &EvtTrb\r
+              (TRB_TEMPLATE **) (UINTN) &EvtTrb\r
               );\r
   ASSERT_EFI_ERROR (Status);\r
   ASSERT (EvtTrb->SlotId <= Xhc->MaxSlotsEn);\r
@@ -1833,21 +1691,22 @@ XhcInitializeDeviceSlot (
   SlotId = (UINT8)EvtTrb->SlotId;\r
   ASSERT (SlotId != 0);\r
 \r
-  ZeroMem (&UsbDevContext[SlotId], sizeof (USB_DEV_CONTEXT));\r
-  UsbDevContext[SlotId].Enabled                 = TRUE;\r
-  UsbDevContext[SlotId].SlotId                  = SlotId;\r
-  UsbDevContext[SlotId].RouteString.Dword       = RouteChart.Dword;\r
-  UsbDevContext[SlotId].ParentRouteString.Dword = ParentRouteChart.Dword;\r
+  ZeroMem (&Xhc->UsbDevContext[SlotId], sizeof (USB_DEV_CONTEXT));\r
+  Xhc->UsbDevContext[SlotId].Enabled                 = TRUE;\r
+  Xhc->UsbDevContext[SlotId].SlotId                  = SlotId;\r
+  Xhc->UsbDevContext[SlotId].RouteString.Dword       = RouteChart.Dword;\r
+  Xhc->UsbDevContext[SlotId].ParentRouteString.Dword = ParentRouteChart.Dword;\r
 \r
   //\r
   // 4.3.3 Device Slot Initialization\r
   // 1) Allocate an Input Context data structure (6.2.5) and initialize all fields to '0'.\r
   //\r
-  InputContext = AllocateAlignedZeroPool(sizeof (INPUT_CONTEXT), 64);\r
+  InputContext = AllocatePages (EFI_SIZE_TO_PAGES (sizeof (INPUT_CONTEXT)));\r
   ASSERT (InputContext != NULL);\r
   ASSERT (((UINTN) InputContext & 0x3F) == 0);\r
+  ZeroMem (InputContext, sizeof (INPUT_CONTEXT));\r
 \r
-  UsbDevContext[SlotId].InputContext = (VOID *) InputContext;\r
+  Xhc->UsbDevContext[SlotId].InputContext = (VOID *) InputContext;\r
 \r
   //\r
   // 2) Initialize the Input Control Context (6.2.5.1) of the Input Context by setting the A0 and A1\r
@@ -1859,21 +1718,21 @@ XhcInitializeDeviceSlot (
   //\r
   // 3) Initialize the Input Slot Context data structure\r
   //\r
-  InputContext->Slot.RouteStr       = RouteChart.Field.RouteString;\r
+  InputContext->Slot.RouteString    = RouteChart.Route.RouteString;\r
   InputContext->Slot.Speed          = DeviceSpeed + 1;\r
   InputContext->Slot.ContextEntries = 1;\r
-  InputContext->Slot.RootHubPortNum = RouteChart.Field.RootPortNum;\r
+  InputContext->Slot.RootHubPortNum = RouteChart.Route.RootPortNum;\r
 \r
-  if (RouteChart.Field.RouteString) {\r
+  if (RouteChart.Route.RouteString) {\r
     //\r
     // The device is behind of hub device.\r
     //\r
-    ParentSlotId = XhcRouteStringToSlotId(ParentRouteChart);\r
+    ParentSlotId = XhcRouteStringToSlotId(Xhc, ParentRouteChart);\r
     ASSERT (ParentSlotId != 0);\r
     //\r
     //if the Full/Low device attached to a High Speed Hub, Init the TTPortNum and TTHubSlotId field of slot context\r
     //\r
-    ParentDeviceContext = (DEVICE_CONTEXT *)UsbDevContext[ParentSlotId].OutputDevContxt;\r
+    ParentDeviceContext = (DEVICE_CONTEXT *)Xhc->UsbDevContext[ParentSlotId].OutputContext;\r
     if ((ParentDeviceContext->Slot.TTPortNum == 0) &&\r
         (ParentDeviceContext->Slot.TTHubSlotId == 0)) {\r
       if ((ParentDeviceContext->Slot.Speed == (EFI_USB_SPEED_HIGH + 1)) && (DeviceSpeed < EFI_USB_SPEED_HIGH)) {\r
@@ -1902,9 +1761,9 @@ XhcInitializeDeviceSlot (
   //\r
   // 4) Allocate and initialize the Transfer Ring for the Default Control Endpoint.\r
   //\r
-  EndpointTransferRing = AllocateAlignedZeroPool(sizeof (TRANSFER_RING), 64);\r
-  UsbDevContext[SlotId].EndpointTransferRing[0] = EndpointTransferRing;\r
-  CreateTransferRing(Xhc, TR_RING_TRB_NUMBER, (TRANSFER_RING *)UsbDevContext[SlotId].EndpointTransferRing[0]);\r
+  EndpointTransferRing = AllocateZeroPool (sizeof (TRANSFER_RING));\r
+  Xhc->UsbDevContext[SlotId].EndpointTransferRing[0] = EndpointTransferRing;\r
+  CreateTransferRing(Xhc, TR_RING_TRB_NUMBER, (TRANSFER_RING *)Xhc->UsbDevContext[SlotId].EndpointTransferRing[0]);\r
   //\r
   // 5) Initialize the Input default control Endpoint 0 Context (6.2.3).\r
   //\r
@@ -1931,45 +1790,46 @@ XhcInitializeDeviceSlot (
   //\r
   // Init the DCS(dequeue cycle state) as the transfer ring's CCS\r
   //\r
-  InputContext->EP[0].PtrLo = XHC_LOW_32BIT (((TRANSFER_RING *)(UINTN)UsbDevContext[SlotId].EndpointTransferRing[0])->RingSeg0) | BIT0;\r
-  InputContext->EP[0].PtrHi = XHC_HIGH_32BIT (((TRANSFER_RING *)(UINTN)UsbDevContext[SlotId].EndpointTransferRing[0])->RingSeg0);\r
+  InputContext->EP[0].PtrLo = XHC_LOW_32BIT (((TRANSFER_RING *)(UINTN)Xhc->UsbDevContext[SlotId].EndpointTransferRing[0])->RingSeg0) | BIT0;\r
+  InputContext->EP[0].PtrHi = XHC_HIGH_32BIT (((TRANSFER_RING *)(UINTN)Xhc->UsbDevContext[SlotId].EndpointTransferRing[0])->RingSeg0);\r
 \r
   //\r
   // 6) Allocate the Output Device Context data structure (6.2.1) and initialize it to '0'.\r
   //\r
-  OutputDevContxt = AllocateAlignedZeroPool(sizeof (DEVICE_CONTEXT), 64);\r
-  ASSERT (OutputDevContxt != NULL);\r
-  ASSERT (((UINTN) OutputDevContxt & 0x3F) == 0);\r
+  OutputContext = AllocatePages (EFI_SIZE_TO_PAGES (sizeof (DEVICE_CONTEXT)));\r
+  ASSERT (OutputContext != NULL);\r
+  ASSERT (((UINTN) OutputContext & 0x3F) == 0);\r
+  ZeroMem (OutputContext, sizeof (DEVICE_CONTEXT));\r
 \r
-  UsbDevContext[SlotId].OutputDevContxt = OutputDevContxt;\r
+  Xhc->UsbDevContext[SlotId].OutputContext = OutputContext;\r
   //\r
   // 7) Load the appropriate (Device Slot ID) entry in the Device Context Base Address Array (5.4.6) with\r
   //    a pointer to the Output Device Context data structure (6.2.1).\r
   //\r
-  Xhc->DCBAA[SlotId] = (UINT64) (UINTN) OutputDevContxt;\r
+  Xhc->DCBAA[SlotId] = (UINT64) (UINTN) OutputContext;\r
 \r
   //\r
   // 8) Issue an Address Device Command for the Device Slot, where the command points to the Input\r
   //    Context data structure described above.\r
   //\r
   ZeroMem (&CmdTrbAddr, sizeof (CmdTrbAddr));\r
-  CmdTrbAddr.PtrLo    = XHC_LOW_32BIT (UsbDevContext[SlotId].InputContext);\r
-  CmdTrbAddr.PtrHi    = XHC_HIGH_32BIT (UsbDevContext[SlotId].InputContext);\r
+  CmdTrbAddr.PtrLo    = XHC_LOW_32BIT (Xhc->UsbDevContext[SlotId].InputContext);\r
+  CmdTrbAddr.PtrHi    = XHC_HIGH_32BIT (Xhc->UsbDevContext[SlotId].InputContext);\r
   CmdTrbAddr.CycleBit = 1;\r
   CmdTrbAddr.Type     = TRB_TYPE_ADDRESS_DEV;\r
-  CmdTrbAddr.SlotId   = UsbDevContext[SlotId].SlotId;\r
+  CmdTrbAddr.SlotId   = Xhc->UsbDevContext[SlotId].SlotId;\r
   Status = XhcCmdTransfer (\r
              Xhc,\r
-             (TRB *) (UINTN) &CmdTrbAddr,\r
+             (TRB_TEMPLATE *) (UINTN) &CmdTrbAddr,\r
              XHC_GENERIC_TIMEOUT,\r
-             (TRB **) (UINTN) &EvtTrb\r
+             (TRB_TEMPLATE **) (UINTN) &EvtTrb\r
              );\r
   ASSERT (!EFI_ERROR(Status));\r
 \r
-  DeviceAddress = (UINT8) ((DEVICE_CONTEXT *) OutputDevContxt)->Slot.DeviceAddress;\r
+  DeviceAddress = (UINT8) ((DEVICE_CONTEXT *) OutputContext)->Slot.DeviceAddress;\r
   DEBUG ((EFI_D_INFO, "    Address %d assigned succeefully\n", DeviceAddress));\r
 \r
-  UsbDevContext[SlotId].XhciDevAddr = DeviceAddress;\r
+  Xhc->UsbDevContext[SlotId].XhciDevAddr = DeviceAddress;\r
 \r
   return Status;\r
 }\r
@@ -1977,7 +1837,7 @@ XhcInitializeDeviceSlot (
 /**\r
   Disable the specified device slot.\r
 \r
-  @param  Xhc           The XHCI device.\r
+  @param  Xhc           The XHCI Instance.\r
   @param  SlotId        The slot id to be disabled.\r
 \r
   @retval EFI_SUCCESS   Successfully disable the device slot.\r
@@ -1986,13 +1846,13 @@ XhcInitializeDeviceSlot (
 EFI_STATUS\r
 EFIAPI\r
 XhcDisableSlotCmd (\r
-  IN USB_XHCI_DEV              *Xhc,\r
+  IN USB_XHCI_INSTANCE         *Xhc,\r
   IN UINT8                     SlotId\r
   )\r
 {\r
   EFI_STATUS            Status;\r
-  TRB                   *EvtTrb;\r
-  CMD_TRB_DIS_SLOT      CmdTrbDisSlot;\r
+  TRB_TEMPLATE          *EvtTrb;\r
+  CMD_TRB_DISABLE_SLOT  CmdTrbDisSlot;\r
   UINT8                 Index;\r
   VOID                  *RingSeg;\r
 \r
@@ -2001,17 +1861,17 @@ XhcDisableSlotCmd (
   // Entry 0 is reserved.\r
   //\r
   for (Index = 0; Index < 255; Index++) {\r
-    if (!UsbDevContext[Index + 1].Enabled ||\r
-        (UsbDevContext[Index + 1].SlotId == 0) ||\r
-        (UsbDevContext[Index + 1].ParentRouteString.Dword != UsbDevContext[SlotId].RouteString.Dword)) {\r
+    if (!Xhc->UsbDevContext[Index + 1].Enabled ||\r
+        (Xhc->UsbDevContext[Index + 1].SlotId == 0) ||\r
+        (Xhc->UsbDevContext[Index + 1].ParentRouteString.Dword != Xhc->UsbDevContext[SlotId].RouteString.Dword)) {\r
       continue;\r
     }\r
 \r
-    Status = XhcDisableSlotCmd (Xhc, UsbDevContext[Index + 1].SlotId);\r
+    Status = XhcDisableSlotCmd (Xhc, Xhc->UsbDevContext[Index + 1].SlotId);\r
 \r
     if (EFI_ERROR (Status)) {\r
       DEBUG ((EFI_D_ERROR, "XhcDisableSlotCmd: failed to disable child, ignore error\n"));\r
-      UsbDevContext[Index + 1].SlotId = 0;\r
+      Xhc->UsbDevContext[Index + 1].SlotId = 0;\r
     }\r
   }\r
 \r
@@ -2026,9 +1886,9 @@ XhcDisableSlotCmd (
   CmdTrbDisSlot.SlotId   = SlotId;\r
   Status = XhcCmdTransfer (\r
              Xhc,\r
-             (TRB *) (UINTN) &CmdTrbDisSlot,\r
+             (TRB_TEMPLATE *) (UINTN) &CmdTrbDisSlot,\r
              XHC_GENERIC_TIMEOUT,\r
-             (TRB **) (UINTN) &EvtTrb\r
+             (TRB_TEMPLATE **) (UINTN) &EvtTrb\r
              );\r
   ASSERT_EFI_ERROR(Status);\r
   //\r
@@ -2040,34 +1900,34 @@ XhcDisableSlotCmd (
   // Free the slot related data structure\r
   //\r
   for (Index = 0; Index < 31; Index++) {\r
-    if (UsbDevContext[SlotId].EndpointTransferRing[Index] != NULL) {\r
-      RingSeg = ((TRANSFER_RING *)(UINTN)UsbDevContext[SlotId].EndpointTransferRing[Index])->RingSeg0;\r
+    if (Xhc->UsbDevContext[SlotId].EndpointTransferRing[Index] != NULL) {\r
+      RingSeg = ((TRANSFER_RING *)(UINTN)Xhc->UsbDevContext[SlotId].EndpointTransferRing[Index])->RingSeg0;\r
       if (RingSeg != NULL) {\r
-        FreeAlignedPool(RingSeg);\r
+        FreePages (RingSeg, EFI_SIZE_TO_PAGES (sizeof (TRB_TEMPLATE) * TR_RING_TRB_NUMBER));\r
       }\r
-      FreeAlignedPool(UsbDevContext[SlotId].EndpointTransferRing[Index]);\r
+      FreePool (Xhc->UsbDevContext[SlotId].EndpointTransferRing[Index]);\r
     }\r
   }\r
 \r
-  for (Index = 0; Index < UsbDevContext[SlotId].DevDesc.NumConfigurations; Index++) {\r
-    if (UsbDevContext[SlotId].ConfDesc[Index] != NULL) {\r
-      FreePool (UsbDevContext[SlotId].ConfDesc[Index]);\r
+  for (Index = 0; Index < Xhc->UsbDevContext[SlotId].DevDesc.NumConfigurations; Index++) {\r
+    if (Xhc->UsbDevContext[SlotId].ConfDesc[Index] != NULL) {\r
+      FreePool (Xhc->UsbDevContext[SlotId].ConfDesc[Index]);\r
     }\r
   }\r
 \r
-  if (UsbDevContext[SlotId].InputContext != NULL) {\r
-    FreeAlignedPool (UsbDevContext[SlotId].InputContext);\r
+  if (Xhc->UsbDevContext[SlotId].InputContext != NULL) {\r
+    FreePages (Xhc->UsbDevContext[SlotId].InputContext, EFI_SIZE_TO_PAGES (sizeof (INPUT_CONTEXT)));\r
   }\r
 \r
-  if (UsbDevContext[SlotId].OutputDevContxt != NULL) {\r
-    FreeAlignedPool (UsbDevContext[SlotId].OutputDevContxt);\r
+  if (Xhc->UsbDevContext[SlotId].OutputContext != NULL) {\r
+    FreePages (Xhc->UsbDevContext[SlotId].OutputContext, EFI_SIZE_TO_PAGES (sizeof (DEVICE_CONTEXT)));\r
   }\r
   //\r
   // Doesn't zero the entry because XhcAsyncInterruptTransfer() may be invoked to remove the established\r
   // asynchronous interrupt pipe after the device is disabled. It needs the device address mapping info to\r
   // remove urb from XHCI's asynchronous transfer list.\r
   //\r
-  UsbDevContext[SlotId].Enabled = FALSE;\r
+  Xhc->UsbDevContext[SlotId].Enabled = FALSE;\r
 \r
   return Status;\r
 }\r
@@ -2075,7 +1935,7 @@ XhcDisableSlotCmd (
 /**\r
   Configure all the device endpoints through XHCI's Configure_Endpoint cmd.\r
 \r
-  @param  Xhc           The XHCI device.\r
+  @param  Xhc           The XHCI Instance.\r
   @param  SlotId        The slot id to be configured.\r
   @param  DeviceSpeed   The device's speed.\r
   @param  ConfigDesc    The pointer to the usb device configuration descriptor.\r
@@ -2086,38 +1946,38 @@ XhcDisableSlotCmd (
 EFI_STATUS\r
 EFIAPI\r
 XhcSetConfigCmd (\r
-  IN USB_XHCI_DEV             *Xhc,\r
+  IN USB_XHCI_INSTANCE        *Xhc,\r
   IN UINT8                    SlotId,\r
-  IN  UINT8                   DeviceSpeed,\r
+  IN UINT8                    DeviceSpeed,\r
   IN USB_CONFIG_DESCRIPTOR    *ConfigDesc\r
   )\r
 {\r
-  EFI_STATUS                 Status;\r
-\r
-  USB_INTERFACE_DESCRIPTOR   *IfDesc;\r
-  USB_ENDPOINT_DESCRIPTOR    *EpDesc;\r
-  UINT8                      Index;\r
-  UINTN                      NumEp;\r
-  UINTN                      EpIndex;\r
-  UINT8                      EpAddr;\r
-  UINT8                      Direction;\r
-  UINT8                      Dci;\r
-  UINT8                      MaxDci;\r
-  UINT32                     PhyAddr;\r
-  UINT8                      Interval;\r
-\r
-  TRANSFER_RING              *EndpointTransferRing;\r
-  CMD_CFG_ED                 CmdTrbCfgEP;\r
-  INPUT_CONTEXT              *InputContext;\r
-  DEVICE_CONTEXT             *OutputDevContxt;\r
-  EVT_TRB_COMMAND            *EvtTrb;\r
+  EFI_STATUS                  Status;\r
+\r
+  USB_INTERFACE_DESCRIPTOR    *IfDesc;\r
+  USB_ENDPOINT_DESCRIPTOR     *EpDesc;\r
+  UINT8                       Index;\r
+  UINTN                       NumEp;\r
+  UINTN                       EpIndex;\r
+  UINT8                       EpAddr;\r
+  UINT8                       Direction;\r
+  UINT8                       Dci;\r
+  UINT8                       MaxDci;\r
+  UINT32                      PhyAddr;\r
+  UINT8                       Interval;\r
+\r
+  TRANSFER_RING               *EndpointTransferRing;\r
+  CMD_TRB_CONFIG_ENDPOINT     CmdTrbCfgEP;\r
+  INPUT_CONTEXT               *InputContext;\r
+  DEVICE_CONTEXT              *OutputContext;\r
+  EVT_TRB_COMMAND_COMPLETION  *EvtTrb;\r
   //\r
   // 4.6.6 Configure Endpoint\r
   //\r
-  InputContext    = UsbDevContext[SlotId].InputContext;\r
-  OutputDevContxt = UsbDevContext[SlotId].OutputDevContxt;\r
+  InputContext  = Xhc->UsbDevContext[SlotId].InputContext;\r
+  OutputContext = Xhc->UsbDevContext[SlotId].OutputContext;\r
   ZeroMem (InputContext, sizeof (INPUT_CONTEXT));\r
-  CopyMem (&InputContext->Slot, &OutputDevContxt->Slot, sizeof (SLOT_CONTEXT));\r
+  CopyMem (&InputContext->Slot, &OutputContext->Slot, sizeof (SLOT_CONTEXT));\r
 \r
   ASSERT (ConfigDesc != NULL);\r
 \r
@@ -2141,6 +2001,7 @@ XhcSetConfigCmd (
       Direction = (UINT8)((EpDesc->EndpointAddress & 0x80) ? EfiUsbDataIn : EfiUsbDataOut);\r
 \r
       Dci = XhcEndpointToDci (EpAddr, Direction);\r
+      ASSERT (Dci < 32);\r
       if (Dci > MaxDci) {\r
         MaxDci = Dci;\r
       }\r
@@ -2168,10 +2029,10 @@ XhcSetConfigCmd (
           }\r
 \r
           InputContext->EP[Dci-1].AverageTRBLength = 0x1000;\r
-          if (UsbDevContext[SlotId].EndpointTransferRing[Dci-1] == NULL) {\r
-            EndpointTransferRing = AllocateAlignedZeroPool(sizeof (TRANSFER_RING), 64);\r
-            UsbDevContext[SlotId].EndpointTransferRing[Dci-1] = (VOID *) EndpointTransferRing;\r
-            CreateTransferRing(Xhc, TR_RING_TRB_NUMBER, (TRANSFER_RING *)UsbDevContext[SlotId].EndpointTransferRing[Dci-1]);\r
+          if (Xhc->UsbDevContext[SlotId].EndpointTransferRing[Dci-1] == NULL) {\r
+            EndpointTransferRing = AllocateZeroPool(sizeof (TRANSFER_RING));\r
+            Xhc->UsbDevContext[SlotId].EndpointTransferRing[Dci-1] = (VOID *) EndpointTransferRing;\r
+            CreateTransferRing(Xhc, TR_RING_TRB_NUMBER, (TRANSFER_RING *)Xhc->UsbDevContext[SlotId].EndpointTransferRing[Dci-1]);\r
           }\r
 \r
           break;\r
@@ -2200,22 +2061,26 @@ XhcSetConfigCmd (
           if ((DeviceSpeed == EFI_USB_SPEED_FULL) || (DeviceSpeed == EFI_USB_SPEED_LOW)) {\r
             Interval = EpDesc->Interval;\r
             //\r
-            // BUGBUG: Hard code the interval to MAX\r
+            // Hard code the interval to MAX first, need calculate through the bInterval field of Endpoint descriptor.\r
             //\r
             InputContext->EP[Dci-1].Interval = 6;\r
-          } else if (DeviceSpeed == EFI_USB_SPEED_SUPER) {\r
+          } else if ((DeviceSpeed == EFI_USB_SPEED_HIGH) || (DeviceSpeed == EFI_USB_SPEED_SUPER)) {\r
             Interval = EpDesc->Interval;\r
-            InputContext->EP[Dci-1].Interval         = 0x0F;\r
+            ASSERT (Interval >= 1 && Interval <= 16);\r
+            //\r
+            // Refer to XHCI 1.0 spec section 6.2.3.6, table 61\r
+            //\r
+            InputContext->EP[Dci-1].Interval         = Interval - 1;\r
             InputContext->EP[Dci-1].AverageTRBLength = 0x1000;\r
             InputContext->EP[Dci-1].MaxESITPayload   = 0x0002;\r
             InputContext->EP[Dci-1].MaxBurstSize     = 0x0;\r
             InputContext->EP[Dci-1].CErr             = 3;\r
           }\r
 \r
-          if (UsbDevContext[SlotId].EndpointTransferRing[Dci-1] == NULL) {\r
-            EndpointTransferRing = AllocateAlignedZeroPool(sizeof (TRANSFER_RING), 64);\r
-            UsbDevContext[SlotId].EndpointTransferRing[Dci-1] = (VOID *) EndpointTransferRing;\r
-            CreateTransferRing(Xhc, TR_RING_TRB_NUMBER, (TRANSFER_RING *)UsbDevContext[SlotId].EndpointTransferRing[Dci-1]);\r
+          if (Xhc->UsbDevContext[SlotId].EndpointTransferRing[Dci-1] == NULL) {\r
+            EndpointTransferRing = AllocateZeroPool(sizeof (TRANSFER_RING));\r
+            Xhc->UsbDevContext[SlotId].EndpointTransferRing[Dci-1] = (VOID *) EndpointTransferRing;\r
+            CreateTransferRing(Xhc, TR_RING_TRB_NUMBER, (TRANSFER_RING *)Xhc->UsbDevContext[SlotId].EndpointTransferRing[Dci-1]);\r
           }\r
           break;\r
 \r
@@ -2225,11 +2090,11 @@ XhcSetConfigCmd (
           break;\r
       }\r
 \r
-      PhyAddr  = XHC_LOW_32BIT (((TRANSFER_RING *)(UINTN)UsbDevContext[SlotId].EndpointTransferRing[Dci-1])->RingSeg0);\r
+      PhyAddr  = XHC_LOW_32BIT (((TRANSFER_RING *)(UINTN)Xhc->UsbDevContext[SlotId].EndpointTransferRing[Dci-1])->RingSeg0);\r
       PhyAddr &= ~(0x0F);\r
-      PhyAddr |= ((TRANSFER_RING *)(UINTN)UsbDevContext[SlotId].EndpointTransferRing[Dci-1])->RingPCS;\r
+      PhyAddr |= ((TRANSFER_RING *)(UINTN)Xhc->UsbDevContext[SlotId].EndpointTransferRing[Dci-1])->RingPCS;\r
       InputContext->EP[Dci-1].PtrLo = PhyAddr;\r
-      InputContext->EP[Dci-1].PtrHi = XHC_HIGH_32BIT (((TRANSFER_RING *)(UINTN)UsbDevContext[SlotId].EndpointTransferRing[Dci-1])->RingSeg0);\r
+      InputContext->EP[Dci-1].PtrHi = XHC_HIGH_32BIT (((TRANSFER_RING *)(UINTN)Xhc->UsbDevContext[SlotId].EndpointTransferRing[Dci-1])->RingSeg0);\r
 \r
       EpDesc = (USB_ENDPOINT_DESCRIPTOR *)((UINTN)EpDesc + EpDesc->Length);\r
     }\r
@@ -2246,13 +2111,13 @@ XhcSetConfigCmd (
   CmdTrbCfgEP.PtrHi    = XHC_HIGH_32BIT (InputContext);\r
   CmdTrbCfgEP.CycleBit = 1;\r
   CmdTrbCfgEP.Type     = TRB_TYPE_CON_ENDPOINT;\r
-  CmdTrbCfgEP.SlotId   = UsbDevContext[SlotId].SlotId;\r
+  CmdTrbCfgEP.SlotId   = Xhc->UsbDevContext[SlotId].SlotId;\r
   DEBUG ((EFI_D_INFO, "Configure Endpoint\n"));\r
   Status = XhcCmdTransfer (\r
              Xhc,\r
-             (TRB *) (UINTN) &CmdTrbCfgEP,\r
+             (TRB_TEMPLATE *) (UINTN) &CmdTrbCfgEP,\r
              XHC_GENERIC_TIMEOUT,\r
-             (TRB **) (UINTN) &EvtTrb\r
+             (TRB_TEMPLATE **) (UINTN) &EvtTrb\r
              );\r
   ASSERT_EFI_ERROR(Status);\r
 \r
@@ -2262,7 +2127,7 @@ XhcSetConfigCmd (
 /**\r
   Evaluate the endpoint 0 context through XHCI's Evaluate_Context cmd.\r
 \r
-  @param  Xhc           The XHCI device.\r
+  @param  Xhc           The XHCI Instance.\r
   @param  SlotId        The slot id to be evaluated.\r
   @param  MaxPacketSize The max packet size supported by the device control transfer.\r
 \r
@@ -2272,22 +2137,22 @@ XhcSetConfigCmd (
 EFI_STATUS\r
 EFIAPI\r
 XhcEvaluateContext (\r
-  IN USB_XHCI_DEV             *Xhc,\r
+  IN USB_XHCI_INSTANCE        *Xhc,\r
   IN UINT8                    SlotId,\r
   IN UINT32                   MaxPacketSize\r
   )\r
 {\r
-  EFI_STATUS            Status;\r
-  CMD_TRB_EVALU_CONTX   CmdTrbEvalu;\r
-  EVT_TRB_COMMAND       *EvtTrb;\r
-  INPUT_CONTEXT         *InputContext;\r
+  EFI_STATUS                  Status;\r
+  CMD_TRB_EVALUATE_CONTEXT    CmdTrbEvalu;\r
+  EVT_TRB_COMMAND_COMPLETION  *EvtTrb;\r
+  INPUT_CONTEXT               *InputContext;\r
 \r
-  ASSERT (UsbDevContext[SlotId].SlotId != 0);\r
+  ASSERT (Xhc->UsbDevContext[SlotId].SlotId != 0);\r
 \r
   //\r
   // 4.6.7 Evaluate Context\r
   //\r
-  InputContext = UsbDevContext[SlotId].InputContext;\r
+  InputContext = Xhc->UsbDevContext[SlotId].InputContext;\r
   ZeroMem (InputContext, sizeof (INPUT_CONTEXT));\r
 \r
   InputContext->InputControlContext.Dword2 |= BIT1;\r
@@ -2298,13 +2163,13 @@ XhcEvaluateContext (
   CmdTrbEvalu.PtrHi    = XHC_HIGH_32BIT (InputContext);\r
   CmdTrbEvalu.CycleBit = 1;\r
   CmdTrbEvalu.Type     = TRB_TYPE_EVALU_CONTXT;\r
-  CmdTrbEvalu.SlotId   = UsbDevContext[SlotId].SlotId;\r
+  CmdTrbEvalu.SlotId   = Xhc->UsbDevContext[SlotId].SlotId;\r
   DEBUG ((EFI_D_INFO, "Evaluate context\n"));\r
   Status = XhcCmdTransfer (\r
              Xhc,\r
-             (TRB *) (UINTN) &CmdTrbEvalu,\r
+             (TRB_TEMPLATE *) (UINTN) &CmdTrbEvalu,\r
              XHC_GENERIC_TIMEOUT,\r
-             (TRB **) (UINTN) &EvtTrb\r
+             (TRB_TEMPLATE **) (UINTN) &EvtTrb\r
              );\r
   ASSERT (!EFI_ERROR(Status));\r
 \r
@@ -2314,7 +2179,7 @@ XhcEvaluateContext (
 /**\r
   Evaluate the slot context for hub device through XHCI's Configure_Endpoint cmd.\r
 \r
-  @param  Xhc           The XHCI device.\r
+  @param  Xhc           The XHCI Instance.\r
   @param  SlotId        The slot id to be configured.\r
   @param  PortNum       The total number of downstream port supported by the hub.\r
   @param  TTT           The TT think time of the hub device.\r
@@ -2325,23 +2190,23 @@ XhcEvaluateContext (
 **/\r
 EFI_STATUS\r
 XhcConfigHubContext (\r
-  IN USB_XHCI_DEV             *Xhc,\r
+  IN USB_XHCI_INSTANCE        *Xhc,\r
   IN UINT8                    SlotId,\r
   IN UINT8                    PortNum,\r
   IN UINT8                    TTT,\r
   IN UINT8                    MTT\r
   )\r
 {\r
-  EFI_STATUS            Status;\r
+  EFI_STATUS                  Status;\r
 \r
-  EVT_TRB_COMMAND       *EvtTrb;\r
-  INPUT_CONTEXT         *InputContext;\r
-  DEVICE_CONTEXT        *OutputDevContxt;\r
-  CMD_CFG_ED            CmdTrbCfgEP;\r
+  EVT_TRB_COMMAND_COMPLETION  *EvtTrb;\r
+  INPUT_CONTEXT               *InputContext;\r
+  DEVICE_CONTEXT              *OutputContext;\r
+  CMD_TRB_CONFIG_ENDPOINT     CmdTrbCfgEP;\r
 \r
-  ASSERT (UsbDevContext[SlotId].SlotId != 0);\r
-  InputContext    = UsbDevContext[SlotId].InputContext;\r
-  OutputDevContxt = UsbDevContext[SlotId].OutputDevContxt;\r
+  ASSERT (Xhc->UsbDevContext[SlotId].SlotId != 0);\r
+  InputContext  = Xhc->UsbDevContext[SlotId].InputContext;\r
+  OutputContext = Xhc->UsbDevContext[SlotId].OutputContext;\r
 \r
   //\r
   // 4.6.7 Evaluate Context\r
@@ -2353,7 +2218,7 @@ XhcConfigHubContext (
   //\r
   // Copy the slot context from OutputContext to Input context\r
   //\r
-  CopyMem(&(InputContext->Slot), &(OutputDevContxt->Slot), sizeof (SLOT_CONTEXT));\r
+  CopyMem(&(InputContext->Slot), &(OutputContext->Slot), sizeof (SLOT_CONTEXT));\r
   InputContext->Slot.Hub     = 1;\r
   InputContext->Slot.PortNum = PortNum;\r
   InputContext->Slot.TTT     = TTT;\r
@@ -2364,13 +2229,13 @@ XhcConfigHubContext (
   CmdTrbCfgEP.PtrHi    = XHC_HIGH_32BIT (InputContext);\r
   CmdTrbCfgEP.CycleBit = 1;\r
   CmdTrbCfgEP.Type     = TRB_TYPE_CON_ENDPOINT;\r
-  CmdTrbCfgEP.SlotId   = UsbDevContext[SlotId].SlotId;\r
+  CmdTrbCfgEP.SlotId   = Xhc->UsbDevContext[SlotId].SlotId;\r
   DEBUG ((EFI_D_INFO, "Configure Hub Slot Context\n"));\r
   Status = XhcCmdTransfer (\r
               Xhc,\r
-              (TRB *) (UINTN) &CmdTrbCfgEP,\r
+              (TRB_TEMPLATE *) (UINTN) &CmdTrbCfgEP,\r
               XHC_GENERIC_TIMEOUT,\r
-              (TRB **) (UINTN) &EvtTrb\r
+              (TRB_TEMPLATE **) (UINTN) &EvtTrb\r
               );\r
   ASSERT (!EFI_ERROR(Status));\r
 \r