/** @file\r
\r
-Copyright (c) 2007, Intel Corporation\r
+ The EHCI register operation routines.\r
+\r
+Copyright (c) 2007 - 2008, 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
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
- UhciSched.c\r
-\r
-Abstract:\r
-\r
- The EHCI register operation routines.\r
-\r
-Revision History\r
-\r
-\r
**/\r
\r
#include "Uhci.h"\r
\r
\r
/**\r
- Create Frame List Structure\r
+ Create Frame List Structure.\r
\r
- @param Uhc UHCI device\r
+ @param Uhc UHCI device.\r
\r
- @retval EFI_OUT_OF_RESOURCES Can't allocate memory resources\r
- @retval EFI_UNSUPPORTED Map memory fail\r
- @retval EFI_SUCCESS Success\r
+ @retval EFI_OUT_OF_RESOURCES Can't allocate memory resources.\r
+ @retval EFI_UNSUPPORTED Map memory fail.\r
+ @retval EFI_SUCCESS Success.\r
\r
**/\r
EFI_STATUS\r
// in supporting the full speed bandwidth reclamation in the previous\r
// mentioned form. Most new platforms don't suffer it.\r
//\r
-#ifdef UHCI_NO_BW_RECLAMATION\r
- Uhc->BulkQh->QhHw.HorizonLink = QH_HLINK (NULL, TRUE);\r
-#else\r
Uhc->BulkQh->QhHw.HorizonLink = QH_HLINK (Uhc->BulkQh, FALSE);\r
-#endif\r
\r
Uhc->BulkQh->NextQh = NULL;\r
\r
\r
\r
/**\r
- Destory FrameList buffer\r
+ Destory FrameList buffer.\r
\r
- @param Uhc The UHCI device\r
+ @param Uhc The UHCI device.\r
\r
- @return VOID\r
+ @return None.\r
\r
**/\r
VOID\r
\r
/**\r
Convert the poll rate to the maxium 2^n that is smaller\r
- than Interval\r
+ than Interval.\r
\r
- @param Interval The poll rate to convert\r
+ @param Interval The poll rate to convert.\r
\r
- @return The converted poll rate\r
+ @return The converted poll rate.\r
\r
**/\r
UINTN\r
Link a queue head (for asynchronous interrupt transfer) to\r
the frame list.\r
\r
- @param FrameBase The base of the frame list\r
- @param Qh The queue head to link into\r
+ @param FrameBase The base of the frame list.\r
+ @param Qh The queue head to link into.\r
\r
- @return None\r
+ @return None.\r
\r
**/\r
VOID\r
the precedence node, and pointer there next to QhSw's\r
next.\r
\r
- @param FrameBase The base address of the frame list\r
- @param Qh The queue head to unlink\r
+ @param FrameBase The base address of the frame list.\r
+ @param Qh The queue head to unlink.\r
\r
- @return None\r
+ @return None.\r
\r
**/\r
VOID\r
\r
\r
/**\r
- Check TDs Results\r
+ Check TDs Results.\r
\r
- @param Uhc This UHCI device\r
- @param Td UHCI_TD_SW to check\r
- @param IsLow Is Low Speed Device\r
- @param QhResult Return the result of this TD list\r
+ @param Uhc This UHCI device.\r
+ @param Td UHCI_TD_SW to check.\r
+ @param IsLow Is Low Speed Device.\r
+ @param QhResult Return the result of this TD list.\r
\r
@return Whether the TD's result is finialized.\r
\r
**/\r
-STATIC\r
BOOLEAN\r
UhciCheckTdStatus (\r
IN USB_HC_DEV *Uhc,\r
// upper layer won't distinguish these condtions. So, only\r
// set these bits when TD is actually halted.\r
//\r
- if (State & USBTD_STALLED) {\r
- if (State & USBTD_BABBLE) {\r
+ if ((State & USBTD_STALLED) != 0) {\r
+ if ((State & USBTD_BABBLE) != 0) {\r
QhResult->Result |= EFI_USB_ERR_BABBLE;\r
\r
} else if (TdHw->ErrorCount != 0) {\r
QhResult->Result |= EFI_USB_ERR_STALL;\r
}\r
\r
- if (State & USBTD_CRC) {\r
+ if ((State & USBTD_CRC) != 0) {\r
QhResult->Result |= EFI_USB_ERR_CRC;\r
}\r
\r
- if (State & USBTD_BUFFERR) {\r
+ if ((State & USBTD_BUFFERR) != 0) {\r
QhResult->Result |= EFI_USB_ERR_BUFFER;\r
}\r
\r
- if (Td->TdHw.Status & USBTD_BITSTUFF) {\r
+ if ((Td->TdHw.Status & USBTD_BITSTUFF) != 0) {\r
QhResult->Result |= EFI_USB_ERR_BITSTUFF;\r
}\r
\r
Finished = TRUE;\r
goto ON_EXIT;\r
\r
- } else if (State & USBTD_ACTIVE) {\r
+ } else if ((State & USBTD_ACTIVE) != 0) {\r
//\r
// The TD is still active, no need to check further.\r
//\r
// terminate the transfer\r
//\r
if (!IsLow && (TdHw->ShortPacket == 1) && (Len < Td->DataLen)) {\r
- UHCI_DEBUG (("UhciCheckTdStatus: short packet read occured\n"));\r
+ DEBUG ((EFI_D_INFO, "UhciCheckTdStatus: short packet read occured\n"));\r
\r
Finished = TRUE;\r
goto ON_EXIT;\r
}\r
\r
\r
-\r
/**\r
- Check the result of the transfer\r
+ Check the result of the transfer.\r
\r
- @param Uhc The UHCI device\r
- @param Td The first TDs of the transfer\r
- @param TimeOut TimeOut value in milliseconds\r
- @param IsLow Is Low Speed Device\r
- @param QhResult The variable to return result\r
+ @param Uhc The UHCI device.\r
+ @param Qh The queue head of the transfer.\r
+ @param Td The first TDs of the transfer.\r
+ @param TimeOut TimeOut value in milliseconds.\r
+ @param IsLow Is Low Speed Device.\r
+ @param QhResult The variable to return result.\r
\r
- @retval EFI_SUCCESS The transfer finished with success\r
- @retval EFI_DEVICE_ERROR Transfer failed\r
+ @retval EFI_SUCCESS The transfer finished with success.\r
+ @retval EFI_DEVICE_ERROR Transfer failed.\r
\r
**/\r
EFI_STATUS\r
\r
Finished = FALSE;\r
Status = EFI_SUCCESS;\r
- Delay = (TimeOut * STALL_1_MS / UHC_SYN_POLL) + 1;\r
+ Delay = (TimeOut * UHC_1_MILLISECOND / UHC_SYNC_POLL_INTERVAL) + 1;\r
\r
for (Index = 0; Index < Delay; Index++) {\r
Finished = UhciCheckTdStatus (Uhc, Td, IsLow, QhResult);\r
break;\r
}\r
\r
- gBS->Stall (UHC_SYN_POLL);\r
+ gBS->Stall (UHC_SYNC_POLL_INTERVAL);\r
}\r
\r
if (!Finished) {\r
- UHCI_ERROR (("UhciExecuteTransfer: execution not finished for %dms\n", TimeOut));\r
- UHCI_DUMP_QH ((Qh));\r
- UHCI_DUMP_TDS ((Td));\r
+ DEBUG ((EFI_D_ERROR, "UhciExecuteTransfer: execution not finished for %dms\n", (UINT32)TimeOut));\r
+ UhciDumpQh (Qh);\r
+ UhciDumpTds (Td);\r
\r
Status = EFI_TIMEOUT;\r
\r
} else if (QhResult->Result != EFI_USB_NOERROR) {\r
- UHCI_ERROR (("UhciExecuteTransfer: execution failed with result %x\n", QhResult->Result));\r
- UHCI_DUMP_QH ((Qh));\r
- UHCI_DUMP_TDS ((Td));\r
+ DEBUG ((EFI_D_ERROR, "UhciExecuteTransfer: execution failed with result %x\n", QhResult->Result));\r
+ UhciDumpQh (Qh);\r
+ UhciDumpTds (Td);\r
\r
Status = EFI_DEVICE_ERROR;\r
}\r
\r
\r
/**\r
- Update Async Request, QH and TDs\r
+ Update Async Request, QH and TDs.\r
\r
- @param AsyncReq The UHCI asynchronous transfer to update\r
- @param Result Transfer reslut\r
- @param ErrTdPos Error TD Position\r
+ @param AsyncReq The UHCI asynchronous transfer to update.\r
+ @param Result Transfer reslut.\r
+ @param NextToggle The toggle of next data.\r
\r
- @return VOID\r
+ @return None.\r
\r
**/\r
-STATIC\r
VOID\r
UhciUpdateAsyncReq (\r
IN UHCI_ASYNC_REQUEST *AsyncReq,\r
\r
\r
/**\r
- Create Async Request node, and Link to List\r
-\r
- @param Uhc The UHCI device\r
- @param Qh The queue head of the transfer\r
- @param FirstTd First TD of the transfer\r
- @param DevAddr Device Address\r
- @param EndPoint EndPoint Address\r
- @param DataLen Data length\r
- @param Interval Polling Interval when inserted to frame list\r
- @param Mapping Mapping value\r
- @param Data Data buffer, unmapped\r
- @param Callback Callback after interrupt transfeer\r
- @param Context Callback Context passed as function parameter\r
- @param IsLow Is Low Speed\r
-\r
- @retval EFI_SUCCESS An asynchronous transfer is created\r
- @retval EFI_INVALID_PARAMETER Paremeter is error\r
+ Create Async Request node, and Link to List.\r
+\r
+ @param Uhc The UHCI device.\r
+ @param Qh The queue head of the transfer.\r
+ @param FirstTd First TD of the transfer.\r
+ @param DevAddr Device Address.\r
+ @param EndPoint EndPoint Address.\r
+ @param DataLen Data length.\r
+ @param Interval Polling Interval when inserted to frame list.\r
+ @param Mapping Mapping value.\r
+ @param Data Data buffer, unmapped.\r
+ @param Callback Callback after interrupt transfeer.\r
+ @param Context Callback Context passed as function parameter.\r
+ @param IsLow Is Low Speed.\r
+\r
+ @retval EFI_SUCCESS An asynchronous transfer is created.\r
+ @retval EFI_INVALID_PARAMETER Paremeter is error.\r
@retval EFI_OUT_OF_RESOURCES Failed because of resource shortage.\r
\r
**/\r
AsyncReq->DevAddr = DevAddr;\r
AsyncReq->EndPoint = EndPoint;\r
AsyncReq->DataLen = DataLen;\r
- AsyncReq->Interval = Interval;\r
+ AsyncReq->Interval = UhciConvertPollRate(Interval);\r
AsyncReq->Mapping = Mapping;\r
AsyncReq->Data = Data;\r
AsyncReq->Callback = Callback;\r
}\r
\r
\r
-\r
/**\r
- Free an asynchronous request's resource such as memory\r
+ Free an asynchronous request's resource such as memory.\r
\r
- @param Uhc The UHCI device\r
- @param AsyncReq The asynchronous request to free\r
+ @param Uhc The UHCI device.\r
+ @param AsyncReq The asynchronous request to free.\r
\r
- @return None\r
+ @return None.\r
\r
**/\r
-STATIC\r
VOID\r
UhciFreeAsyncReq (\r
IN USB_HC_DEV *Uhc,\r
UHC's recycle list to wait for a while before release the memory.\r
Until then, hardware won't hold point to the request.\r
\r
- @param Uhc The UHCI device\r
- @param AsyncReq The asynchronous request to free\r
+ @param Uhc The UHCI device.\r
+ @param AsyncReq The asynchronous request to free.\r
@param FreeNow If TRUE, free the resource immediately, otherwise\r
add the request to recycle wait list.\r
\r
- @return None\r
+ @return None.\r
\r
**/\r
-STATIC\r
VOID\r
UhciUnlinkAsyncReq (\r
IN USB_HC_DEV *Uhc,\r
\r
\r
/**\r
- Delete Async Interrupt QH and TDs\r
+ Delete Async Interrupt QH and TDs.\r
\r
- @param Uhc The UHCI device\r
- @param DevAddr Device Address\r
- @param EndPoint EndPoint Address\r
- @param Toggle The next data toggle to use\r
+ @param Uhc The UHCI device.\r
+ @param DevAddr Device Address.\r
+ @param EndPoint EndPoint Address.\r
+ @param Toggle The next data toggle to use.\r
\r
- @retval EFI_SUCCESS The request is deleted\r
- @retval EFI_INVALID_PARAMETER Paremeter is error\r
- @retval EFI_NOT_FOUND The asynchronous isn't found\r
+ @retval EFI_SUCCESS The request is deleted.\r
+ @retval EFI_INVALID_PARAMETER Paremeter is error.\r
+ @retval EFI_NOT_FOUND The asynchronous isn't found.\r
\r
**/\r
EFI_STATUS\r
existing for at least 50ms, far enough for the hardware\r
to clear its cache.\r
\r
- @param Uhc The UHCI device\r
+ @param Uhc The UHCI device.\r
\r
- @return None\r
+ @return None.\r
\r
**/\r
-STATIC\r
VOID\r
UhciRecycleAsyncReq (\r
IN USB_HC_DEV *Uhc\r
/**\r
Release all the asynchronous transfers on the lsit.\r
\r
- @param Uhc The UHCI device\r
+ @param Uhc The UHCI device.\r
\r
- @return VOID\r
+ @return None.\r
\r
**/\r
VOID\r
\r
\r
/**\r
- Interrupt transfer periodic check handler\r
+ Interrupt transfer periodic check handler.\r
\r
- @param Event The event of the time\r
- @param Context Context of the event, pointer to USB_HC_DEV\r
+ @param Event The event of the time.\r
+ @param Context Context of the event, pointer to USB_HC_DEV.\r
\r
- @return VOID\r
+ @return None.\r
\r
**/\r
VOID\r