2 OHCI transfer scheduling routines.
4 Copyright (c) 2013-2015 Intel Corporation.
6 SPDX-License-Identifier: BSD-2-Clause-Patent
15 Convert Error code from OHCI format to EFI format
17 @Param ErrorCode ErrorCode in OHCI format
19 @retval ErrorCode in EFI format
27 UINT32 TransferResult
;
31 TransferResult
= EFI_USB_NOERROR
;
34 case TD_TOBE_PROCESSED
:
35 case TD_TOBE_PROCESSED_2
:
36 TransferResult
= EFI_USB_ERR_NOTEXECUTE
;
40 TransferResult
= EFI_USB_ERR_STALL
;
43 case TD_BUFFER_OVERRUN
:
44 case TD_BUFFER_UNDERRUN
:
45 TransferResult
= EFI_USB_ERR_BUFFER
;
49 TransferResult
= EFI_USB_ERR_CRC
;
53 TransferResult
= EFI_USB_ERR_TIMEOUT
;
56 case TD_BITSTUFFING_ERROR
:
57 TransferResult
= EFI_USB_ERR_BITSTUFF
;
61 TransferResult
= EFI_USB_ERR_SYSTEM
;
64 return TransferResult
;
72 @Param Ohc UHC private data
73 @Param Td TD_DESCRIPTOR
74 @Param Result Result to return
77 @retval FLASE means Error or Short packet
82 IN USB_OHCI_HC_DEV
*Ohc
,
87 UINT32 TdCompletionCode
;
89 *Result
= EFI_USB_NOERROR
;
92 TdCompletionCode
= Td
->Word0
.ConditionCode
;
94 *Result
|= ConvertErrorCode(TdCompletionCode
);
96 // if any error encountered, stop processing the left TDs.
102 Td
= Td
->NextTDPointer
;
111 Check the task status on an ED
113 @Param Ed Pointer to the ED task that TD hooked on
114 @Param HeadTd TD header for current transaction
116 @retval Task Status Code
122 IN ED_DESCRIPTOR
*Ed
,
123 IN TD_DESCRIPTOR
*HeadTd
126 while(HeadTd
!= NULL
) {
127 if (HeadTd
->Word0
.ConditionCode
!= 0) {
128 return HeadTd
->Word0
.ConditionCode
;
130 HeadTd
= HeadTd
->NextTDPointer
;
133 if (OhciGetEDField (Ed
, ED_TDHEAD_PTR
) != OhciGetEDField (Ed
, ED_TDTAIL_PTR
)) {
134 return TD_TOBE_PROCESSED
;
142 Check the task status
144 @Param Ohc UHC private data
145 @Param ListType Pipe type
146 @Param Ed Pointer to the ED task hooked on
147 @Param HeadTd Head of TD corresponding to the task
148 @Param ErrorCode return the ErrorCode
150 @retval EFI_SUCCESS Task done
151 @retval EFI_NOT_READY Task on processing
152 @retval EFI_DEVICE_ERROR Some error occured
157 IN USB_OHCI_HC_DEV
*Ohc
,
158 IN DESCRIPTOR_LIST_TYPE ListType
,
159 IN ED_DESCRIPTOR
*Ed
,
160 IN TD_DESCRIPTOR
*HeadTd
,
161 OUT UINT32
*ErrorCode
164 *ErrorCode
= TD_TOBE_PROCESSED
;
168 if (OhciGetHcCommandStatus (Ohc
, CONTROL_LIST_FILLED
) != 0) {
169 return EFI_NOT_READY
;
174 if (OhciGetHcCommandStatus (Ohc
, BULK_LIST_FILLED
) != 0) {
175 return EFI_NOT_READY
;
183 *ErrorCode
= CheckEDStatus (Ed
, HeadTd
);
186 if (*ErrorCode
== TD_NO_ERROR
) {
188 } else if (*ErrorCode
== TD_TOBE_PROCESSED
) {
189 return EFI_NOT_READY
;
191 return EFI_DEVICE_ERROR
;
198 Convert TD condition code to Efi Status
200 @Param ConditionCode Condition code to convert
202 @retval EFI_SUCCESS No error occured
203 @retval EFI_NOT_READY TD still on processing
204 @retval EFI_DEVICE_ERROR Error occured in processing TD
209 OhciTDConditionCodeToStatus (
210 IN UINT32 ConditionCode
213 if (ConditionCode
== TD_NO_ERROR
) {
217 if (ConditionCode
== TD_TOBE_PROCESSED
) {
218 return EFI_NOT_READY
;
221 return EFI_DEVICE_ERROR
;