/*++\r
\r
-Copyright (c) 2006, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
+Copyright (c) 2006, Intel Corporation\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution. The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
\r
Module Name:\r
\r
EhciSched.c\r
- \r
-Abstract: \r
- \r
+\r
+Abstract:\r
+\r
\r
Revision History\r
--*/\r
\r
#include "Ehci.h"\r
\r
+\r
+EFI_STATUS\r
+SetAndWaitDoorBell (\r
+ IN USB2_HC_DEV *HcDev,\r
+ IN UINTN Timeout\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+ Set DoorBell and wait it to complete\r
+\r
+Arguments:\r
+\r
+ HcDev - USB2_HC_DEV\r
+\r
+Returns:\r
+\r
+ EFI_SUCCESS Success\r
+ EFI_DEVICE_ERROR Fail\r
+\r
+--*/\r
+{\r
+ EFI_STATUS Status;\r
+ UINT32 Data;\r
+ UINTN Delay;\r
+\r
+ Status = ReadEhcOperationalReg (\r
+ HcDev,\r
+ USBCMD,\r
+ &Data\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ Status = EFI_DEVICE_ERROR;\r
+ goto exit;\r
+ }\r
+\r
+ Data |= USBCMD_IAAD;\r
+ Status = WriteEhcOperationalReg (\r
+ HcDev,\r
+ USBCMD,\r
+ Data\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ Status = EFI_DEVICE_ERROR;\r
+ }\r
+\r
+ //\r
+ // Timeout is in US unit\r
+ //\r
+ Delay = (Timeout / 50) + 1;\r
+ do {\r
+ Status = ReadEhcOperationalReg (\r
+ HcDev,\r
+ USBSTS,\r
+ &Data\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ Status = EFI_DEVICE_ERROR;\r
+ goto exit;\r
+ }\r
+\r
+ if ((Data & USBSTS_IAA) == USBSTS_IAA) {\r
+ break;\r
+ }\r
+\r
+ gBS->Stall (EHCI_GENERIC_RECOVERY_TIME);\r
+\r
+ } while (Delay--);\r
+\r
+ Data = Data & 0xFFFFFFC0;\r
+ Data |= USBSTS_IAA;\r
+ Status = WriteEhcOperationalReg (\r
+ HcDev,\r
+ USBSTS,\r
+ Data\r
+ );\r
+\r
+exit:\r
+ return Status;\r
+}\r
+\r
+\r
+\r
+\r
+\r
+EFI_STATUS\r
+CreateNULLQH (\r
+ IN USB2_HC_DEV *HcDev\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+ Create the NULL QH to make it as the Async QH header\r
+\r
+Arguments:\r
+\r
+ HcDev - USB2_HC_DEV\r
+\r
+Returns:\r
+\r
+ EFI_SUCCESS Success\r
+--*/\r
+{\r
+ EFI_STATUS Status;\r
+ EHCI_QH_ENTITY *NULLQhPtr;\r
+ //\r
+ // Allocate memory for Qh structure\r
+ //\r
+ Status = EhciAllocatePool (\r
+ HcDev,\r
+ (UINT8 **) &NULLQhPtr,\r
+ sizeof (EHCI_QH_ENTITY)\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+\r
+ NULLQhPtr->Qh.Status = QTD_STATUS_HALTED;\r
+ NULLQhPtr->Qh.HeadReclamationFlag = 1;\r
+ NULLQhPtr->Qh.QhHorizontalPointer = (UINT32) (GET_0B_TO_31B (&(NULLQhPtr->Qh) >> 5));\r
+ NULLQhPtr->Qh.SelectType = QH_SELECT_TYPE;\r
+ NULLQhPtr->Qh.NextQtdTerminate = 1;\r
+\r
+ NULLQhPtr->Next = NULLQhPtr;\r
+ NULLQhPtr->Prev = NULLQhPtr;\r
+\r
+ HcDev->NULLQH = NULLQhPtr;\r
+\r
+ return Status;\r
+}\r
+\r
+\r
+\r
+VOID\r
+DestroyNULLQH (\r
+ IN USB2_HC_DEV *HcDev\r
+ )\r
+{\r
+\r
+ if (HcDev->NULLQH != NULL) {\r
+ EhciFreePool (HcDev, (UINT8 *)HcDev->NULLQH, sizeof (EHCI_QH_ENTITY));\r
+ HcDev->NULLQH = NULL;\r
+ }\r
+}\r
+\r
+\r
+\r
EFI_STATUS\r
InitialPeriodicFrameList (\r
IN USB2_HC_DEV *HcDev,\r
\r
HcDev - USB2_HC_DEV\r
Length - Frame List Length\r
- \r
+\r
Returns:\r
\r
EFI_SUCCESS Success\r
UINTN BufferSizeInBytes;\r
UINTN FrameIndex;\r
FRAME_LIST_ENTRY *FrameEntryPtr;\r
- \r
+\r
//\r
// The Frame List is a common buffer that will be\r
// accessed by both the cpu and the usb bus master\r
}\r
\r
//\r
- // Put high 32bit into CtrlDataStructSeg reg \r
+ // Put high 32bit into CtrlDataStructSeg reg\r
// when 64bit addressing range capability\r
//\r
if (HcDev->Is64BitCapable != 0) {\r
goto unmap_buffer;\r
}\r
}\r
- \r
+\r
//\r
// Tell the Host Controller where the Frame List lies,\r
// by set the Frame List Base Address Register.\r
Returns:\r
\r
VOID\r
- \r
+\r
--*/\r
{\r
HcDev->PciIo->Unmap (HcDev->PciIo, HcDev->PeriodicFrameListMap);\r
\r
HcDev - USB2_HC_DEV\r
NotifyFunction - Timer Notify Function\r
- \r
+\r
Returns:\r
- \r
+\r
EFI_SUCCESS Success\r
EFI_DEVICE_ERROR Fail\r
- \r
+\r
--*/\r
{\r
return gBS->CreateEvent (\r
Arguments:\r
\r
HcDev - USB2_HC_DEV\r
- \r
+\r
Returns:\r
\r
EFI_SUCCESS Success\r
EFI_DEVICE_ERROR Fail\r
- \r
+\r
--*/\r
{\r
return gBS->CloseEvent (HcDev->AsyncRequestEvent);\r
Arguments:\r
\r
HcDev - USB2_HC_DEV\r
- \r
+\r
Returns:\r
\r
EFI_SUCCESS Success\r
EFI_DEVICE_ERROR Fail\r
- \r
+\r
--*/\r
{\r
return gBS->SetTimer (\r
Arguments:\r
\r
HcDev - USB2_HC_DEV\r
- \r
+\r
Returns:\r
\r
EFI_SUCCESS Success\r
EFI_DEVICE_ERROR Fail\r
- \r
+\r
--*/\r
{\r
return gBS->SetTimer (\r
\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
+ HcDev - USB2_HC_DEV\r
DeviceAddr - Address of Device\r
Endpoint - Endpoint Number\r
DeviceSpeed - Device Speed\r
MaxPacketLen - Max Length of one Packet\r
QhPtrPtr - A pointer of pointer to Qh for return\r
- \r
+\r
Returns:\r
\r
EFI_SUCCESS Success\r
EFI_OUT_OF_RESOURCES Cannot allocate resources\r
- \r
+\r
--*/\r
{\r
EFI_STATUS Status;\r
Status = EFI_OUT_OF_RESOURCES;\r
goto exit;\r
}\r
- //\r
- // Init fields in Qh\r
- //\r
- ZeroMem (*QhPtrPtr, sizeof (EHCI_QH_ENTITY));\r
\r
//\r
// Software field\r
QhHwPtr->SelectType = 0;\r
QhHwPtr->MaxPacketLen = (UINT32) MaxPacketLen;\r
QhHwPtr->EndpointSpeed = (DeviceSpeed & 0x3);\r
- QhHwPtr->EndpointNum = (Endpoint & 0x0f);\r
- QhHwPtr->DeviceAddr = (DeviceAddr & 0x7f);\r
+ QhHwPtr->EndpointNum = (Endpoint & 0x0F);\r
+ QhHwPtr->DeviceAddr = (DeviceAddr & 0x7F);\r
QhHwPtr->Multiplier = HIGH_BANDWIDTH_PIPE_MULTIPLIER;\r
QhHwPtr->Rsvd1 = 0;\r
QhHwPtr->Rsvd2 = 0;\r
\r
Routine Description:\r
\r
- Destory Qh Structure \r
- \r
+ Destory Qh Structure\r
+\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
+ HcDev - USB2_HC_DEV\r
QhPtr - A pointer to Qh\r
- \r
+\r
Returns:\r
\r
EFI_SUCCESS Success\r
EFI_DEVICE_ERROR Fail\r
- \r
+\r
--*/\r
{\r
ASSERT (HcDev);\r
\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
+ HcDev - USB2_HC_DEV\r
DeviceAddr - Address of Device\r
DeviceSpeed - Device Speed\r
MaxPacketLen - Max Length of one Packet\r
Translator - Translator Transaction for SplitX\r
QhPtrPtr - A pointer of pointer to Qh for return\r
- \r
+\r
Returns:\r
\r
EFI_SUCCESS Success\r
EFI_OUT_OF_RESOURCES Cannot allocate resources\r
- \r
+\r
--*/\r
{\r
EFI_STATUS Status;\r
(*QhPtrPtr)->Qh.QhHorizontalPointer = (UINT32) (GET_0B_TO_31B (&((*QhPtrPtr)->Qh)) >> 5);\r
(*QhPtrPtr)->Qh.SelectType = QH_SELECT_TYPE;\r
(*QhPtrPtr)->Qh.QhTerminate = FALSE;\r
- (*QhPtrPtr)->Qh.ControlEndpointFlag = TRUE;\r
+ if (EFI_USB_SPEED_HIGH != DeviceSpeed) {\r
+ (*QhPtrPtr)->Qh.ControlEndpointFlag = TRUE;\r
+ }\r
(*QhPtrPtr)->Qh.NakCountReload = NAK_COUNT_RELOAD;\r
if (NULL != Translator) {\r
(*QhPtrPtr)->Qh.PortNum = Translator->TranslatorPortNumber;\r
\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
+ HcDev - USB2_HC_DEV\r
DeviceAddr - Address of Device\r
EndPointAddr - Address of Endpoint\r
DeviceSpeed - Device Speed\r
MaxPacketLen - Max Length of one Packet\r
Translator - Translator Transaction for SplitX\r
QhPtrPtr - A pointer of pointer to Qh for return\r
- \r
+\r
Returns:\r
\r
EFI_SUCCESS Success\r
EFI_OUT_OF_RESOURCES Cannot allocate resources\r
- \r
+\r
--*/\r
{\r
EFI_STATUS Status;\r
Status = EFI_OUT_OF_RESOURCES;\r
goto exit;\r
}\r
- \r
+\r
//\r
// Software fields\r
//\r
//\r
// BulkTransfer don't use DataToggleControl\r
//\r
- (*QhPtrPtr)->Qh.DataToggleControl = FALSE; \r
+ (*QhPtrPtr)->Qh.DataToggleControl = FALSE;\r
(*QhPtrPtr)->Qh.QhHorizontalPointer = (UINT32) (GET_0B_TO_31B (&((*QhPtrPtr)->Qh)) >> 5);\r
(*QhPtrPtr)->Qh.SelectType = QH_SELECT_TYPE;\r
(*QhPtrPtr)->Qh.QhTerminate = FALSE;\r
\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
+ HcDev - USB2_HC_DEV\r
DeviceAddr - Address of Device\r
EndPointAddr - Address of Endpoint\r
DeviceSpeed - Device Speed\r
Interval - value of interval\r
Translator - Translator Transaction for SplitX\r
QhPtrPtr - A pointer of pointer to Qh for return\r
- \r
+\r
Returns:\r
\r
EFI_SUCCESS Success\r
EFI_OUT_OF_RESOURCES Cannot allocate resources\r
- \r
+\r
--*/\r
{\r
EFI_STATUS Status;\r
Status = EFI_OUT_OF_RESOURCES;\r
goto exit;\r
}\r
- \r
+\r
//\r
// Software fields\r
//\r
\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
+ HcDev - USB2_HC_DEV\r
DataPtr - A pointer to user data buffer to transfer\r
DataLen - Length of user data to transfer\r
PktId - Packet Identification of this Qtd\r
Toggle - Data Toggle of this Qtd\r
QtdStatus - Default value of status of this Qtd\r
QtdPtrPtr - A pointer of pointer to Qtd for return\r
- \r
+\r
Returns:\r
\r
EFI_SUCCESS Success\r
EFI_OUT_OF_RESOURCES Cannot allocate resources\r
- \r
+\r
--*/\r
{\r
EFI_STATUS Status;\r
Status = EFI_OUT_OF_RESOURCES;\r
goto exit;\r
}\r
- //\r
- // Init fields in Qtd\r
- //\r
-\r
- ZeroMem (*QtdPtrPtr, sizeof (EHCI_QTD_ENTITY));\r
\r
//\r
// Software field\r
Status = EFI_INVALID_PARAMETER;\r
goto exit;\r
}\r
- \r
+\r
//\r
// Set Data Buffer Pointers\r
//\r
\r
Routine Description:\r
\r
- Create Qtd Structure for Setup \r
+ Create Qtd Structure for Setup\r
\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
+ HcDev - USB2_HC_DEV\r
DevReqPtr - A pointer to Device Request Data\r
QtdPtrPtr - A pointer of pointer to Qtd for return\r
- \r
+\r
Returns:\r
\r
EFI_SUCCESS Success\r
EFI_OUT_OF_RESOURCES Cannot allocate resources\r
- \r
+\r
--*/\r
{\r
return CreateQtd (\r
\r
Routine Description:\r
\r
- Create Qtd Structure for data \r
+ Create Qtd Structure for data\r
\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
+ HcDev - USB2_HC_DEV\r
DataPtr - A pointer to user data buffer to transfer\r
DataLen - Length of user data to transfer\r
PktId - Packet Identification of this Qtd\r
Toggle - Data Toggle of this Qtd\r
QtdPtrPtr - A pointer of pointer to Qtd for return\r
- \r
+\r
Returns:\r
\r
EFI_SUCCESS Success\r
EFI_OUT_OF_RESOURCES Cannot allocate resources\r
- \r
+\r
--*/\r
{\r
return CreateQtd (\r
\r
Routine Description:\r
\r
- Create Qtd Structure for Alternative \r
+ Create Qtd Structure for Alternative\r
\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
+ HcDev - USB2_HC_DEV\r
PktId - Packet Identification of this Qtd\r
QtdPtrPtr - A pointer of pointer to Qtd for return\r
- \r
+\r
Returns:\r
\r
EFI_SUCCESS Success\r
EFI_OUT_OF_RESOURCES Cannot allocate resources\r
- \r
+\r
--*/\r
{\r
return CreateQtd (\r
\r
Routine Description:\r
\r
- Create Qtd Structure for status \r
+ Create Qtd Structure for status\r
\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
+ HcDev - USB2_HC_DEV\r
PktId - Packet Identification of this Qtd\r
QtdPtrPtr - A pointer of pointer to Qtd for return\r
- \r
+\r
Returns:\r
\r
EFI_SUCCESS Success\r
EFI_OUT_OF_RESOURCES Cannot allocate resources\r
- \r
+\r
--*/\r
{\r
return CreateQtd (\r
\r
Routine Description:\r
\r
- Create Qtds list for Control Transfer \r
+ Create Qtds list for Control Transfer\r
\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
+ HcDev - USB2_HC_DEV\r
DataPktId - Packet Identification of Data Qtds\r
RequestCursor - A pointer to request structure buffer to transfer\r
DataCursor - A pointer to user data buffer to transfer\r
DataLen - Length of user data to transfer\r
ControlQtdsHead - A pointer of pointer to first Qtd for control tranfer for return\r
- \r
+\r
Returns:\r
\r
EFI_SUCCESS Success\r
EFI_OUT_OF_RESOURCES Cannot allocate resources\r
- \r
+\r
--*/\r
{\r
EFI_STATUS Status;\r
UINTN CapacityOfQtd;\r
UINTN SizePerQtd;\r
UINTN DataCount;\r
- UINTN Xnum;\r
- \r
+\r
QtdPtr = NULL;\r
PreQtdPtr = NULL;\r
SetupQtdPtr = NULL;\r
Status = EFI_OUT_OF_RESOURCES;\r
goto exit;\r
}\r
- \r
+\r
//\r
// Data Stage of Control Transfer\r
//\r
LinkQtdToQtd (PreQtdPtr, QtdPtr);\r
}\r
\r
- //\r
- // Reverse Data Toggle or not determined by parity of transactions of one qtd\r
- //\r
- Xnum = Translator ? GetNumberOfTransaction (SizePerQtd, EHCI_BLOCK_SIZE_WITH_TT) : GetNumberOfTransaction (SizePerQtd, EHCI_BLOCK_SIZE);\r
- if (Xnum % 2 != 0) {\r
- DataToggle ^= 1;\r
- }\r
- \r
+ DataToggle ^= 1;\r
+\r
PreQtdPtr = QtdPtr;\r
DataCursor += SizePerQtd;\r
DataCount -= SizePerQtd;\r
Status = EFI_OUT_OF_RESOURCES;\r
goto destory_qtds;\r
}\r
- \r
+\r
//\r
// Link setup Qtd -> data Qtds -> status Qtd\r
//\r
\r
Routine Description:\r
\r
- Create Qtds list for Bulk or Interrupt Transfer \r
+ Create Qtds list for Bulk or Interrupt Transfer\r
\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
+ HcDev - USB2_HC_DEV\r
PktId - Packet Identification of Qtds\r
DataCursor - A pointer to user data buffer to transfer\r
DataLen - Length of user data to transfer\r
DataToggle - Data Toggle to start\r
Translator - Translator Transaction for SplitX\r
QtdsHead - A pointer of pointer to first Qtd for control tranfer for return\r
- \r
+\r
Returns:\r
\r
EFI_SUCCESS Success\r
EFI_OUT_OF_RESOURCES Cannot allocate resources\r
- \r
+\r
--*/\r
{\r
EFI_STATUS Status;\r
DataCursor += SizePerQtd;\r
DataCount -= SizePerQtd;\r
}\r
- \r
+\r
//\r
// Set Alternate Qtd\r
//\r
- if (INPUT_PACKET_ID == PktId && 1 < GetNumberOfQtd (FirstQtdPtr)) {\r
+ if (INPUT_PACKET_ID == PktId && 0 < GetNumberOfQtd (FirstQtdPtr)) {\r
Status = CreateAltQtd (\r
HcDev,\r
PktId,\r
\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
- FirstQtdPtr - A pointer to first Qtd in the list \r
- \r
+ HcDev - USB2_HC_DEV\r
+ FirstQtdPtr - A pointer to first Qtd in the list\r
+\r
Returns:\r
\r
VOID\r
Routine Description:\r
\r
Number of Qtds in the list\r
- \r
+\r
Arguments:\r
\r
FirstQtdPtr - A pointer to first Qtd in the list\r
- \r
+\r
Returns:\r
\r
Number of Qtds in the list\r
Count = 0;\r
QtdPtr = FirstQtdPtr;\r
\r
- ;\r
-\r
while (NULL != QtdPtr) {\r
Count++;\r
QtdPtr = QtdPtr->Next;\r
return Count;\r
}\r
\r
-UINTN\r
-GetNumberOfTransaction (\r
- IN UINTN SizeOfData,\r
- IN UINTN SizeOfTransaction\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Number of Transactions in one Qtd\r
- \r
-Arguments:\r
-\r
- SizeOfData - Size of one Qtd\r
- SizeOfTransaction - Size of one Transaction\r
- \r
-Returns:\r
-\r
- Number of Transactions in this Qtd\r
-\r
---*/\r
-{\r
-\r
- return ((SizeOfData & (SizeOfTransaction - 1)) ? SizeOfData / SizeOfTransaction + 1 : SizeOfData / SizeOfTransaction);\r
-\r
-}\r
-\r
UINTN\r
GetCapacityOfQtd (\r
IN UINT8 *BufferCursor\r
Routine Description:\r
\r
Get Size of First Qtd\r
- \r
+\r
Arguments:\r
\r
BufferCursor - BufferCursor of the Qtd\r
- \r
+\r
Returns:\r
\r
Size of First Qtd\r
--*/\r
{\r
\r
- return (EHCI_MAX_QTD_CAPACITY - (EHCI_BLOCK_SIZE * GetNumberOfTransaction (EFI_PAGE_MASK & GET_0B_TO_31B (BufferCursor), EHCI_BLOCK_SIZE)));\r
+ if (EFI_PAGE_MASK & GET_0B_TO_31B (BufferCursor)) {\r
+ return EFI_PAGE_SIZE * 4;\r
+ } else {\r
+ return EFI_PAGE_SIZE * 5;\r
+ }\r
\r
}\r
\r
Routine Description:\r
\r
Get the approximate value in the 2 index sequence\r
- \r
+\r
Arguments:\r
\r
Interval - the value of interval\r
- \r
+\r
Returns:\r
\r
approximate value of interval in the 2 index sequence\r
- \r
+\r
--*/\r
{\r
UINTN Orignate;\r
Routine Description:\r
\r
Get Qtd alternate next pointer field\r
- \r
+\r
Arguments:\r
\r
HwQtdPtr - A pointer to hardware Qtd structure\r
- \r
+\r
Returns:\r
\r
A pointer to hardware alternate Qtd\r
- \r
+\r
--*/\r
{\r
EHCI_QTD_HW *Value;\r
Routine Description:\r
\r
Get Qtd next pointer field\r
- \r
+\r
Arguments:\r
\r
HwQtdPtr - A pointer to hardware Qtd structure\r
- \r
+\r
Returns:\r
\r
A pointer to next hardware Qtd structure\r
- \r
+\r
--*/\r
{\r
EHCI_QTD_HW *Value;\r
return Value;\r
}\r
\r
-VOID LinkQtdToQtd (\r
- IN EHCI_QTD_ENTITY * PreQtdPtr, \r
+VOID\r
+LinkQtdToQtd (\r
+ IN EHCI_QTD_ENTITY * PreQtdPtr,\r
IN EHCI_QTD_ENTITY * QtdPtr\r
)\r
/*++\r
Routine Description:\r
\r
Link Qtds together\r
- \r
+\r
Arguments:\r
\r
PreQtdPtr - A pointer to pre Qtd\r
QtdPtr - A pointer to next Qtd\r
- \r
+\r
Returns:\r
\r
VOID\r
}\r
\r\r
\r
-VOID LinkQtdsToAltQtd (\r
- IN EHCI_QTD_ENTITY * FirstQtdPtr, \r
+VOID\r
+LinkQtdsToAltQtd (\r
+ IN EHCI_QTD_ENTITY * FirstQtdPtr,\r
IN EHCI_QTD_ENTITY * AltQtdPtr\r
)\r
/*++\r
Routine Description:\r
\r
Link AlterQtds together\r
- \r
+\r
Arguments:\r
\r
FirstQtdPtr - A pointer to first Qtd in the list\r
AltQtdPtr - A pointer to alternative Qtd\r
- \r
+\r
Returns:\r
\r
VOID\r
\r
AltQtdHwPtr = &(AltQtdPtr->Qtd);\r
QtdPtr = FirstQtdPtr;\r
- \r
+\r
while (NULL != QtdPtr) {\r
//\r
// Software link\r
Routine Description:\r
\r
Link Qtds list to Qh\r
- \r
+\r
Arguments:\r
\r
QhPtr - A pointer to Qh\r
QtdPtr - A pointer to first Qtd in the list\r
- \r
+\r
Returns:\r
\r
VOID\r
QhPtr->Qh.NextQtdPointer = (UINT32) (GET_0B_TO_31B (QtdHwPtr) >> 5);\r
QhPtr->Qh.NextQtdTerminate = FALSE;\r
\r
+ QhPtr->Qh.AltNextQtdPointer = 0;\r
+ QhPtr->Qh.AltNextQtdTerminate = TRUE;\r
+\r
+\r
+ if ((QtdPtr->Qtd.PidCode == OUTPUT_PACKET_PID_CODE) &&\r
+ (QhPtr->TransferType == BULK_TRANSFER)) {\r
+ //\r
+ //Start PING first\r
+ //\r
+ QhPtr->Qh.Status |= QTD_STATUS_DO_PING;\r
+ }\r
+\r
return ;\r
}\r
\r
Routine Description:\r
\r
Link Qh to Async Schedule List\r
- \r
+\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
+ HcDev - USB2_HC_DEV\r
QhPtr - A pointer to Qh\r
- \r
+\r
Returns:\r
\r
EFI_SUCCESS Success\r
EFI_DEVICE_ERROR Fail\r
- \r
+\r
--*/\r
{\r
EFI_STATUS Status;\r
ASSERT (HcDev);\r
ASSERT (QhPtr);\r
\r
- QhPtr->Qh.HeadReclamationFlag = TRUE;\r
\r
- Status = SetAsyncListAddr (HcDev, QhPtr);\r
+ //\r
+ // NULL QH created before\r
+ //\r
+\r
+ HcDev->NULLQH->Next = QhPtr;\r
+ HcDev->NULLQH->Prev = QhPtr;\r
+\r
+ QhPtr->Next = HcDev->NULLQH;\r
+ QhPtr->Prev = HcDev->NULLQH;\r
+\r
+\r
+ HcDev->NULLQH->Qh.QhHorizontalPointer = (UINT32) (GET_0B_TO_31B (&(QhPtr->Qh) >> 5));\r
+ QhPtr->Qh.QhHorizontalPointer = (UINT32) (GET_0B_TO_31B (&(HcDev->NULLQH->Qh) >> 5));\r
+\r
+\r
+ Status = SetAsyncListAddr (HcDev, HcDev->NULLQH);\r
if (EFI_ERROR (Status)) {\r
Status = EFI_DEVICE_ERROR;\r
goto exit;\r
\r
Status = WaitForAsyncScheduleEnable (HcDev, EHCI_GENERIC_TIMEOUT);\r
if (EFI_ERROR (Status)) {\r
- DEBUG ((gEHCDebugLevel, "WaitForAsyncScheduleEnable TimeOut"));\r
+ DEBUG ((gEHCDebugLevel, "EHCI: WaitForAsyncScheduleEnable TimeOut"));\r
Status = EFI_TIMEOUT;\r
goto exit;\r
}\r
Routine Description:\r
\r
Unlink Qh from Async Schedule List\r
- \r
+\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
+ HcDev - USB2_HC_DEV\r
QhPtr - A pointer to Qh\r
- \r
+\r
Returns:\r
\r
EFI_SUCCESS Success\r
EFI_DEVICE_ERROR Fail\r
- \r
+\r
--*/\r
{\r
EFI_STATUS Status;\r
ASSERT (HcDev);\r
ASSERT (QhPtr);\r
\r
- if (QhPtr == QhPtr->Next) {\r
\r
- Status = DisableAsynchronousSchedule (HcDev);\r
- if (EFI_ERROR (Status)) {\r
- Status = EFI_DEVICE_ERROR;\r
- goto exit;\r
- }\r
+ HcDev->NULLQH->Next = HcDev->NULLQH;\r
+ HcDev->NULLQH->Prev = HcDev->NULLQH;\r
\r
- Status = WaitForAsyncScheduleDisable (HcDev, EHCI_GENERIC_TIMEOUT);\r
- if (EFI_ERROR (Status)) {\r
- DEBUG ((gEHCErrorLevel, "WaitForAsyncScheduleDisable TimeOut\n"));\r
- Status = EFI_TIMEOUT;\r
- goto exit;\r
- }\r
\r
+ QhPtr->Next = QhPtr;\r
+ QhPtr->Prev = QhPtr;\r
+\r
+ HcDev->NULLQH->Qh.QhHorizontalPointer = (UINT32) (GET_0B_TO_31B (&(HcDev->NULLQH->Qh) >> 5));\r
+\r
+\r
+ SetAndWaitDoorBell (HcDev, 2 * EHCI_GENERIC_TIMEOUT);\r
+\r
+ QhPtr->Qh.QhTerminate = 1;\r
+ QhPtr->Qh.QhHorizontalPointer = 0;\r
+\r
+\r
+ Status = DisableAsynchronousSchedule (HcDev);\r
+ if (EFI_ERROR (Status)) {\r
+ Status = EFI_DEVICE_ERROR;\r
+ goto exit;\r
}\r
\r
+ Status = WaitForAsyncScheduleDisable (HcDev, EHCI_GENERIC_TIMEOUT);\r
+ if (EFI_ERROR (Status)) {\r
+ DEBUG ((gEHCErrorLevel, "EHCI: WaitForAsyncScheduleDisable TimeOut\n"));\r
+ Status = EFI_TIMEOUT;\r
+ goto exit;\r
+ }\r
+\r
+\r
exit:\r
return Status;\r
}\r
Routine Description:\r
\r
Link Qh to Periodic Schedule List\r
- \r
+\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
+ HcDev - USB2_HC_DEV\r
QhPtr - A pointer to Qh\r
- \r
+\r
Returns:\r
\r
VOID\r
- \r
+\r
--*/\r
{\r
FRAME_LIST_ENTRY *FrameEntryPtr;\r
//\r
// AsyncInterruptTransfer Qh\r
//\r
- \r
+\r
//\r
// Link to Frame[0] List\r
//\r
}\r
}\r
} else {\r
- \r
+\r
//\r
// SyncInterruptTransfer Qh\r
//\r
- \r
+\r
if (!FrameEntryPtr->LinkTerminate) {\r
//\r
// Not Null FrameList\r
Routine Description:\r
\r
Unlink Qh from Periodic Schedule List\r
- \r
+\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
+ HcDev - USB2_HC_DEV\r
QhPtr - A pointer to Qh\r
Interval - Interval of this periodic transfer\r
- \r
+\r
Returns:\r
\r
VOID\r
- \r
+\r
--*/\r
{\r
FRAME_LIST_ENTRY *FrameEntryPtr;\r
FrameEntryPtr = (FRAME_LIST_ENTRY *) HcDev->PeriodicFrameListBuffer;\r
\r
if (QhPtr->TransferType == ASYNC_INTERRUPT_TRANSFER) {\r
- \r
+\r
//\r
// AsyncInterruptTransfer Qh\r
//\r
- \r
+\r
if (NULL == QhPtr->Prev) {\r
//\r
// Qh is the First one on Frame[0] List\r
}\r
}\r
} else {\r
- \r
+\r
//\r
// Not First one on Frame[0] List\r
//\r
Routine Description:\r
\r
Llink AsyncRequest Entry to Async Request List\r
- \r
+\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
+ HcDev - USB2_HC_DEV\r
AsyncRequestPtr - A pointer to Async Request Entry\r
- \r
+\r
Returns:\r
\r
VOID\r
- \r
+\r
--*/\r
{\r
EHCI_ASYNC_REQUEST *CurrentPtr;\r
Routine Description:\r
\r
Unlink AsyncRequest Entry from Async Request List\r
- \r
+\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
+ HcDev - USB2_HC_DEV\r
AsyncRequestPtr - A pointer to Async Request Entry\r
- \r
+\r
Returns:\r
\r
VOID\r
- \r
+\r
--*/\r
{\r
if (NULL == AsyncRequestPtr->Prev) {\r
\r
Arguments:\r
\r
- QtdHwPtr - A pointer to Qtd hardware structure \r
+ QtdHwPtr - A pointer to Qtd hardware structure\r
DataPtr - A pointer to user data buffer\r
DataLen - Length of the user data buffer\r
- \r
+\r
Returns:\r
\r
VOID\r
{\r
UINTN RemainLen;\r
\r
- RemainLen = DataLen;\r
ASSERT (QtdHwPtr);\r
+ ASSERT (DataLen <= 5 * EFI_PAGE_SIZE);\r
\r
+ RemainLen = DataLen;\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
- QtdHwPtr->BufferPointer0 = (UINT32) (GET_0B_TO_31B (DataPtr) >> 12);\r
+ QtdHwPtr->BufferPointer0 = (UINT32) (GET_0B_TO_31B (DataPtr) >> EFI_PAGE_SHIFT);\r
QtdHwPtr->CurrentOffset = (UINT32) (GET_0B_TO_31B (DataPtr) & EFI_PAGE_MASK);\r
- QtdHwPtr->ExtBufferPointer0 = (UINT32) GET_32B_TO_63B (DataPtr);\r
\r
//\r
// Set BufferPointer1 and ExtBufferPointer1\r
}\r
\r
QtdHwPtr->BufferPointer1 = QtdHwPtr->BufferPointer0 + 1;\r
- QtdHwPtr->ExtBufferPointer1 = (QtdHwPtr->BufferPointer1 == 0) ? (QtdHwPtr->ExtBufferPointer0 + 1) : QtdHwPtr->ExtBufferPointer0;\r
\r
//\r
// Set BufferPointer2 and ExtBufferPointer2\r
}\r
\r
QtdHwPtr->BufferPointer2 = QtdHwPtr->BufferPointer1 + 1;\r
- QtdHwPtr->ExtBufferPointer2 = (QtdHwPtr->BufferPointer2 == 0) ? (QtdHwPtr->ExtBufferPointer1 + 1) : QtdHwPtr->ExtBufferPointer1;\r
\r
//\r
// Set BufferPointer3 and ExtBufferPointer3\r
}\r
\r
QtdHwPtr->BufferPointer3 = QtdHwPtr->BufferPointer2 + 1;\r
- QtdHwPtr->ExtBufferPointer3 = (QtdHwPtr->BufferPointer2 == 0) ? (QtdHwPtr->ExtBufferPointer2 + 1) : QtdHwPtr->ExtBufferPointer2;\r
\r
//\r
// Set BufferPointer4 and ExtBufferPointer4\r
}\r
\r
QtdHwPtr->BufferPointer4 = QtdHwPtr->BufferPointer3 + 1;\r
- QtdHwPtr->ExtBufferPointer4 = (QtdHwPtr->BufferPointer3 == 0) ? (QtdHwPtr->ExtBufferPointer3 + 1) : QtdHwPtr->ExtBufferPointer3;\r
\r
exit:\r
return ;\r
Routine Description:\r
\r
Whether Qtd status is active or not\r
- \r
+\r
Arguments:\r
\r
HwQtdPtr - A pointer to hardware Qtd structure\r
- \r
+\r
Returns:\r
\r
TRUE Active\r
FALSE Inactive\r
- \r
+\r
--*/\r
{\r
UINT8 QtdStatus;\r
\r
QtdStatus = (UINT8) (HwQtdPtr->Status);\r
Value = (BOOLEAN) (QtdStatus & QTD_STATUS_ACTIVE);\r
+ //DEBUG ((gEHCErrorLevel, "EHCI: IsQtdStatusActive 0x%X, Address = %x\r\n",HwQtdPtr->Status, HwQtdPtr));\r
\r
return Value;\r
}\r
Routine Description:\r
\r
Whether Qtd status is halted or not\r
- \r
+\r
Arguments:\r
\r
HwQtdPtr - A pointer to hardware Qtd structure\r
- \r
+\r
Returns:\r
\r
TRUE Halted\r
FALSE Not halted\r
- \r
+\r
--*/\r
{\r
UINT8 QtdStatus;\r
Routine Description:\r
\r
Whether Qtd status is buffer error or not\r
- \r
+\r
Arguments:\r
\r
HwQtdPtr - A pointer to hardware Qtd structure\r
- \r
+\r
Returns:\r
\r
TRUE Buffer error\r
FALSE No buffer error\r
- \r
+\r
--*/\r
{\r
UINT8 QtdStatus;\r
Routine Description:\r
\r
Whether Qtd status is babble error or not\r
- \r
+\r
Arguments:\r
\r
HwQtdPtr - A pointer to hardware Qtd structure\r
- \r
+\r
Returns:\r
\r
TRUE Babble error\r
FALSE No babble error\r
- \r
+\r
--*/\r
{\r
UINT8 QtdStatus;\r
Routine Description:\r
\r
Whether Qtd status is transaction error or not\r
- \r
+\r
Arguments:\r
\r
HwQtdPtr - A pointer to hardware Qtd structure\r
- \r
+\r
Returns:\r
\r
TRUE Transaction error\r
FALSE No transaction error\r
- \r
+\r
--*/\r
{\r
UINT8 QtdStatus;\r
Routine Description:\r
\r
Whether is a DataIn direction transfer\r
- \r
+\r
Arguments:\r
\r
- EndPointAddress - address of the endpoint \r
- \r
+ EndPointAddress - address of the endpoint\r
+\r
Returns:\r
\r
TRUE DataIn\r
FALSE DataOut\r
- \r
+\r
--*/\r
{\r
BOOLEAN Value;\r
Routine Description:\r
\r
Map address of user data buffer\r
- \r
+\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
+ HcDev - USB2_HC_DEV\r
TransferDirection - direction of transfer\r
- Data - A pointer to user data buffer \r
+ Data - A pointer to user data buffer\r
DataLength - length of user data\r
PktId - Packte Identificaion\r
DataCursor - mapped address to return\r
DataMap - identificaion of this mapping to return\r
- \r
+\r
Returns:\r
\r
EFI_SUCCESS Success\r
EFI_DEVICE_ERROR Fail\r
- \r
+\r
--*/\r
{\r
EFI_STATUS Status;\r
DataMap\r
);\r
if (EFI_ERROR (Status)) {\r
- DEBUG ((gEHCDebugLevel, "MapDataBuffer Failed\n"));\r
+ DEBUG ((gEHCDebugLevel, "EHCI: MapDataBuffer Failed\n"));\r
Status = EFI_DEVICE_ERROR;\r
goto exit;\r
}\r
Routine Description:\r
\r
Map address of request structure buffer\r
- \r
+\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
+ HcDev - USB2_HC_DEV\r
Request - A pointer to request structure\r
RequestCursor - Mapped address of request structure to return\r
RequestMap - Identificaion of this mapping to return\r
- \r
+\r
Returns:\r
\r
EFI_SUCCESS Success\r
EFI_DEVICE_ERROR Fail\r
- \r
+\r
--*/\r
{\r
EFI_STATUS Status;\r
Routine Description:\r
\r
Delete all asynchronous request transfer\r
- \r
+\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
+ HcDev - USB2_HC_DEV\r
DeviceAddress - address of usb device\r
EndPointAddress - address of endpoint\r
DataToggle - stored data toggle\r
- \r
+\r
Returns:\r
\r
EFI_SUCCESS Success\r
EFI_DEVICE_ERROR Fail\r
- \r
+\r
--*/\r
{\r
EFI_STATUS Status;\r
\r
Status = WaitForPeriodicScheduleDisable (HcDev, EHCI_GENERIC_TIMEOUT);\r
if (EFI_ERROR (Status)) {\r
- DEBUG ((gEHCErrorLevel, "WaitForPeriodicScheduleDisable TimeOut\n"));\r
+ DEBUG ((gEHCErrorLevel, "EHCI: WaitForPeriodicScheduleDisable TimeOut\n"));\r
Status = EFI_TIMEOUT;\r
goto exit;\r
}\r
\r
Status = WaitForPeriodicScheduleEnable (HcDev, EHCI_GENERIC_TIMEOUT);\r
if (EFI_ERROR (Status)) {\r
- DEBUG ((gEHCErrorLevel, "WaitForPeriodicScheduleEnable TimeOut\n"));\r
+ DEBUG ((gEHCErrorLevel, "EHCI: WaitForPeriodicScheduleEnable TimeOut\n"));\r
Status = EFI_TIMEOUT;\r
goto exit;\r
}\r
Routine Description:\r
\r
Clean up all asynchronous request transfer\r
- \r
+\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
- \r
+ HcDev - USB2_HC_DEV\r
+\r
Returns:\r
\r
VOID\r
- \r
+\r
--*/\r
{\r
EHCI_ASYNC_REQUEST *AsyncRequestPtr;\r
Routine Description:\r
\r
Zero out the fields in Qh structure\r
- \r
+\r
Arguments:\r
\r
QhPtr - A pointer to Qh structure\r
- \r
+\r
Returns:\r
\r
VOID\r
- \r
+\r
--*/\r
{\r
QhPtr->Qh.CurrentQtdPointer = 0;\r
QhPtr->Qh.FrameTag = 0;\r
QhPtr->Qh.BufferPointer3 = 0;\r
QhPtr->Qh.BufferPointer4 = 0;\r
- QhPtr->Qh.ExtBufferPointer0 = 0;\r
- QhPtr->Qh.ExtBufferPointer1 = 0;\r
- QhPtr->Qh.ExtBufferPointer2 = 0;\r
- QhPtr->Qh.ExtBufferPointer3 = 0;\r
- QhPtr->Qh.ExtBufferPointer4 = 0;\r
}\r
\r
VOID\r
Routine Description:\r
\r
Update asynchronous request transfer\r
- \r
+\r
Arguments:\r
\r
- AsyncRequestPtr - A pointer to async request \r
- TransferResult - transfer result \r
+ AsyncRequestPtr - A pointer to async request\r
+ TransferResult - transfer result\r
ErrQtdPos - postion of error Qtd\r
- \r
+\r
Returns:\r
\r
VOID\r
- \r
+\r
--*/\r
{\r
EHCI_QTD_ENTITY *QtdPtr;\r
QtdPtr = NULL;\r
\r
if (EFI_USB_NOERROR == TransferResult) {\r
- \r
+\r
//\r
// Update Qh for next trigger\r
//\r
\r
TRUE Qtds finished\r
FALSE Not finish\r
- \r
+\r
--*/\r
{\r
UINTN ActualLenPerQtd;\r
QtdHwPtr = &(QtdPtr->Qtd);\r
\r
while (NULL != QtdHwPtr) {\r
-\r
if (IsQtdStatusActive (QtdHwPtr)) {\r
*Result |= EFI_USB_ERR_NOTEXECUTE;\r
}\r
\r
if (IsQtdStatusHalted (QtdHwPtr)) {\r
+\r
+ DEBUG ((gEHCErrorLevel, "EHCI: QTD_STATUS_HALTED 0x%X\n", QtdHwPtr->Status));\r
*Result |= EFI_USB_ERR_STALL;\r
}\r
\r
if (IsQtdStatusBufferError (QtdHwPtr)) {\r
+ DEBUG ((gEHCErrorLevel, "EHCI: QTD_STATUS_BUFFER_ERR 0x%X\n", QtdHwPtr->Status));\r
*Result |= EFI_USB_ERR_BUFFER;\r
}\r
\r
if (IsQtdStatusBabbleError (QtdHwPtr)) {\r
+ DEBUG ((gEHCErrorLevel, "EHCI: StatusBufferError 0x%X\n", QtdHwPtr->Status));\r
*Result |= EFI_USB_ERR_BABBLE;\r
}\r
\r
if (IsQtdStatusTransactionError (QtdHwPtr)) {\r
- *Result |= EFI_USB_ERR_TIMEOUT;\r
+\r
+ //\r
+ //Exclude Special Case\r
+ //\r
+ if (((QtdHwPtr->Status & QTD_STATUS_HALTED) == QTD_STATUS_HALTED) ||\r
+ ((QtdHwPtr->Status & QTD_STATUS_ACTIVE) == QTD_STATUS_ACTIVE) ||\r
+ ((QtdHwPtr->ErrorCount != QTD_ERROR_COUNTER))) {\r
+ *Result |= EFI_USB_ERR_TIMEOUT;\r
+ DEBUG ((gEHCErrorLevel, "EHCI: QTD_STATUS_TRANSACTION_ERR: 0x%X\n", QtdHwPtr->Status));\r
+ }\r
}\r
\r
ActualLenPerQtd = QtdPtr->TotalBytes - QtdHwPtr->TotalBytes;\r
break;\r
}\r
\r
- if ((!IsControl) && (QtdPtr->TotalBytes > 0)) {\r
+ if ((INPUT_PACKET_PID_CODE == QtdHwPtr->PidCode)&& (QtdPtr->TotalBytes > 0)) {\r
//\r
- // Did something, but isn't full workload\r
+ // Short Packet: IN, Short\r
//\r
+ DEBUG ((gEHCDebugLevel, "EHCI: Short Packet Status: 0x%x\n", QtdHwPtr->Status));\r
break;\r
}\r
\r
- (*ErrQtdPos)++;\r
- QtdPtr = QtdPtr->Next;\r
- QtdHwPtr = &(QtdPtr->Qtd);\r
+ if (QtdPtr->Next != NULL) {\r
+ (*ErrQtdPos)++;\r
+ QtdPtr = QtdPtr->Next;\r
+ QtdHwPtr = &(QtdPtr->Qtd);\r
+ } else {\r
+ QtdHwPtr = NULL;\r
+ }\r
\r
}\r
\r
HcDev - USB2_HC_DEV\r
IsControl - Is control transfer or not\r
QhPtr - A pointer to Qh\r
- ActualLen - Actual transfered Len \r
+ ActualLen - Actual transfered Len\r
DataToggle - Data Toggle\r
TimeOut - TimeOut threshold\r
TransferResult - Transfer result\r
- \r
+\r
Returns:\r
\r
EFI_SUCCESS Sucess\r
EFI_DEVICE_ERROR Fail\r
- \r
+\r
--*/\r
{\r
EFI_STATUS Status;\r
*ActualLen = 0;\r
Finished = FALSE;\r
\r
- Delay = (TimeOut * STALL_1_MILLI_SECOND / 50) + 1;\r
+ Delay = (TimeOut * STALL_1_MILLI_SECOND / 50);\r
\r
do {\r
*TransferResult = 0;\r
\r
if (EFI_USB_NOERROR != *TransferResult) {\r
if (0 == Delay) {\r
+ DEBUG((gEHCErrorLevel, "EHCI: QTDS TimeOut\n"));\r
Status = EFI_TIMEOUT;\r
} else {\r
Status = EFI_DEVICE_ERROR;\r
// Special for Bulk and Interrupt Transfer\r
//\r
*DataToggle = (UINT8) QhPtr->Qh.DataToggle;\r
- \r
+\r
return Status;\r
}\r
\r
)\r
/*++\r
Routine Description:\r
- \r
+\r
Interrupt transfer periodic check handler\r
- \r
+\r
Arguments:\r
Event - Interrupt event\r
Context - Pointer to USB2_HC_DEV\r
- \r
+\r
Returns:\r
\r
EFI_SUCCESS Success\r
EFI_DEVICE_ERROR Fail\r
- \r
+\r
--*/\r
{\r
EFI_STATUS Status;\r
USB2_HC_DEV *HcDev;\r
EHCI_ASYNC_REQUEST *AsyncRequestPtr;\r
+ EHCI_ASYNC_REQUEST *NextPtr;\r
EHCI_QTD_HW *QtdHwPtr;\r
UINTN ErrQtdPos;\r
UINTN ActualLen;\r
UINT32 TransferResult;\r
UINT8 *ReceiveBuffer;\r
UINT8 *ProcessBuffer;\r
- EHCI_ASYNC_REQUEST *NextPtr;\r
\r
Status = EFI_SUCCESS;\r
QtdHwPtr = NULL;\r
ActualLen = 0;\r
\r
CheckQtdsTransferResult (\r
- FALSE, \r
- AsyncRequestPtr->QhPtr, \r
- &TransferResult, \r
- &ErrQtdPos, \r
+ FALSE,\r
+ AsyncRequestPtr->QhPtr,\r
+ &TransferResult,\r
+ &ErrQtdPos,\r
&ActualLen\r
);\r
\r
}\r
\r
QtdHwPtr = &(AsyncRequestPtr->QhPtr->FirstQtdPtr->Qtd);\r
- ReceiveBuffer = (UINT8 *) GET_0B_TO_31B ((QtdHwPtr->BufferPointer0 << 12) | AsyncRequestPtr->QhPtr->FirstQtdPtr->StaticCurrentOffset);\r
+ ReceiveBuffer = (UINT8 *) GET_0B_TO_31B ((QtdHwPtr->BufferPointer0 << EFI_PAGE_SHIFT) | AsyncRequestPtr->QhPtr->FirstQtdPtr->StaticCurrentOffset);\r
CopyMem (\r
ProcessBuffer,\r
ReceiveBuffer,\r
} else {\r
\r
//\r
- // leave error recovery to its related device driver. A common case of \r
+ // leave error recovery to its related device driver. A common case of\r
// the error recovery is to re-submit the interrupt transfer.\r
// When an interrupt transfer is re-submitted, its position in the linked\r
// list is changed. It is inserted to the head of the linked list, while\r