+++ /dev/null
-/** @file\r
-OHCI transfer scheduling routines.\r
-\r
-Copyright (c) 2013-2015 Intel Corporation.\r
-\r
-SPDX-License-Identifier: BSD-2-Clause-Patent\r
-\r
-**/\r
-\r
-\r
-#include "OhcPeim.h"\r
-\r
-/**\r
-\r
- Convert Error code from OHCI format to EFI format\r
-\r
- @Param ErrorCode ErrorCode in OHCI format\r
-\r
- @retval ErrorCode in EFI format\r
-\r
-**/\r
-UINT32\r
-ConvertErrorCode (\r
- IN UINT32 ErrorCode\r
- )\r
-{\r
- UINT32 TransferResult;\r
-\r
- switch (ErrorCode) {\r
- case TD_NO_ERROR:\r
- TransferResult = EFI_USB_NOERROR;\r
- break;\r
-\r
- case TD_TOBE_PROCESSED:\r
- case TD_TOBE_PROCESSED_2:\r
- TransferResult = EFI_USB_ERR_NOTEXECUTE;\r
- break;\r
-\r
- case TD_DEVICE_STALL:\r
- TransferResult = EFI_USB_ERR_STALL;\r
- break;\r
-\r
- case TD_BUFFER_OVERRUN:\r
- case TD_BUFFER_UNDERRUN:\r
- TransferResult = EFI_USB_ERR_BUFFER;\r
- break;\r
-\r
- case TD_CRC_ERROR:\r
- TransferResult = EFI_USB_ERR_CRC;\r
- break;\r
-\r
- case TD_NO_RESPONSE:\r
- TransferResult = EFI_USB_ERR_TIMEOUT;\r
- break;\r
-\r
- case TD_BITSTUFFING_ERROR:\r
- TransferResult = EFI_USB_ERR_BITSTUFF;\r
- break;\r
-\r
- default:\r
- TransferResult = EFI_USB_ERR_SYSTEM;\r
- }\r
-\r
- return TransferResult;\r
-}\r
-\r
-\r
-/**\r
-\r
- Check TDs Results\r
-\r
- @Param Ohc UHC private data\r
- @Param Td TD_DESCRIPTOR\r
- @Param Result Result to return\r
-\r
- @retval TRUE means OK\r
- @retval FLASE means Error or Short packet\r
-\r
-**/\r
-BOOLEAN\r
-OhciCheckTDsResults (\r
- IN USB_OHCI_HC_DEV *Ohc,\r
- IN TD_DESCRIPTOR *Td,\r
- OUT UINT32 *Result\r
- )\r
-{\r
- UINT32 TdCompletionCode;\r
-\r
- *Result = EFI_USB_NOERROR;\r
-\r
- while (Td) {\r
- TdCompletionCode = Td->Word0.ConditionCode;\r
-\r
- *Result |= ConvertErrorCode(TdCompletionCode);\r
- //\r
- // if any error encountered, stop processing the left TDs.\r
- //\r
- if (*Result) {\r
- return FALSE;\r
- }\r
-\r
- Td = Td->NextTDPointer;\r
- }\r
- return TRUE;\r
-\r
-}\r
-\r
-\r
-/**\r
-\r
- Check the task status on an ED\r
-\r
- @Param Ed Pointer to the ED task that TD hooked on\r
- @Param HeadTd TD header for current transaction\r
-\r
- @retval Task Status Code\r
-\r
-**/\r
-\r
-UINT32\r
-CheckEDStatus (\r
- IN ED_DESCRIPTOR *Ed,\r
- IN TD_DESCRIPTOR *HeadTd\r
- )\r
-{\r
- while(HeadTd != NULL) {\r
- if (HeadTd->Word0.ConditionCode != 0) {\r
- return HeadTd->Word0.ConditionCode;\r
- }\r
- HeadTd = HeadTd->NextTDPointer;\r
- }\r
-\r
- if (OhciGetEDField (Ed, ED_TDHEAD_PTR) != OhciGetEDField (Ed, ED_TDTAIL_PTR)) {\r
- return TD_TOBE_PROCESSED;\r
- }\r
-\r
- return TD_NO_ERROR;\r
-}\r
-\r
-/**\r
-\r
- Check the task status\r
-\r
- @Param Ohc UHC private data\r
- @Param ListType Pipe type\r
- @Param Ed Pointer to the ED task hooked on\r
- @Param HeadTd Head of TD corresponding to the task\r
- @Param ErrorCode return the ErrorCode\r
-\r
- @retval EFI_SUCCESS Task done\r
- @retval EFI_NOT_READY Task on processing\r
- @retval EFI_DEVICE_ERROR Some error occured\r
-\r
-**/\r
-EFI_STATUS\r
-CheckIfDone (\r
- IN USB_OHCI_HC_DEV *Ohc,\r
- IN DESCRIPTOR_LIST_TYPE ListType,\r
- IN ED_DESCRIPTOR *Ed,\r
- IN TD_DESCRIPTOR *HeadTd,\r
- OUT UINT32 *ErrorCode\r
- )\r
-{\r
- *ErrorCode = TD_TOBE_PROCESSED;\r
-\r
- switch (ListType) {\r
- case CONTROL_LIST:\r
- if (OhciGetHcCommandStatus (Ohc, CONTROL_LIST_FILLED) != 0) {\r
- return EFI_NOT_READY;\r
- }\r
- break;\r
-\r
- case BULK_LIST:\r
- if (OhciGetHcCommandStatus (Ohc, BULK_LIST_FILLED) != 0) {\r
- return EFI_NOT_READY;\r
- }\r
- break;\r
-\r
- default:\r
- break;\r
- }\r
-\r
- *ErrorCode = CheckEDStatus (Ed, HeadTd);\r
-\r
-\r
- if (*ErrorCode == TD_NO_ERROR) {\r
- return EFI_SUCCESS;\r
- } else if (*ErrorCode == TD_TOBE_PROCESSED) {\r
- return EFI_NOT_READY;\r
- } else {\r
- return EFI_DEVICE_ERROR;\r
- }\r
-}\r
-\r
-\r
-/**\r
-\r
- Convert TD condition code to Efi Status\r
-\r
- @Param ConditionCode Condition code to convert\r
-\r
- @retval EFI_SUCCESS No error occured\r
- @retval EFI_NOT_READY TD still on processing\r
- @retval EFI_DEVICE_ERROR Error occured in processing TD\r
-\r
-**/\r
-\r
-EFI_STATUS\r
-OhciTDConditionCodeToStatus (\r
- IN UINT32 ConditionCode\r
- )\r
-{\r
- if (ConditionCode == TD_NO_ERROR) {\r
- return EFI_SUCCESS;\r
- }\r
-\r
- if (ConditionCode == TD_TOBE_PROCESSED) {\r
- return EFI_NOT_READY;\r
- }\r
-\r
- return EFI_DEVICE_ERROR;\r
-}\r
-\r