]> git.proxmox.com Git - mirror_edk2.git/blob - QuarkSocPkg/QuarkSouthCluster/Usb/Ohci/Pei/OhciSched.c
QuarkSocPkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / QuarkSocPkg / QuarkSouthCluster / Usb / Ohci / Pei / OhciSched.c
1 /** @file
2 OHCI transfer scheduling routines.
3
4 Copyright (c) 2013-2015 Intel Corporation.
5
6 SPDX-License-Identifier: BSD-2-Clause-Patent
7
8 **/
9
10
11 #include "OhcPeim.h"
12
13 /**
14
15 Convert Error code from OHCI format to EFI format
16
17 @Param ErrorCode ErrorCode in OHCI format
18
19 @retval ErrorCode in EFI format
20
21 **/
22 UINT32
23 ConvertErrorCode (
24 IN UINT32 ErrorCode
25 )
26 {
27 UINT32 TransferResult;
28
29 switch (ErrorCode) {
30 case TD_NO_ERROR:
31 TransferResult = EFI_USB_NOERROR;
32 break;
33
34 case TD_TOBE_PROCESSED:
35 case TD_TOBE_PROCESSED_2:
36 TransferResult = EFI_USB_ERR_NOTEXECUTE;
37 break;
38
39 case TD_DEVICE_STALL:
40 TransferResult = EFI_USB_ERR_STALL;
41 break;
42
43 case TD_BUFFER_OVERRUN:
44 case TD_BUFFER_UNDERRUN:
45 TransferResult = EFI_USB_ERR_BUFFER;
46 break;
47
48 case TD_CRC_ERROR:
49 TransferResult = EFI_USB_ERR_CRC;
50 break;
51
52 case TD_NO_RESPONSE:
53 TransferResult = EFI_USB_ERR_TIMEOUT;
54 break;
55
56 case TD_BITSTUFFING_ERROR:
57 TransferResult = EFI_USB_ERR_BITSTUFF;
58 break;
59
60 default:
61 TransferResult = EFI_USB_ERR_SYSTEM;
62 }
63
64 return TransferResult;
65 }
66
67
68 /**
69
70 Check TDs Results
71
72 @Param Ohc UHC private data
73 @Param Td TD_DESCRIPTOR
74 @Param Result Result to return
75
76 @retval TRUE means OK
77 @retval FLASE means Error or Short packet
78
79 **/
80 BOOLEAN
81 OhciCheckTDsResults (
82 IN USB_OHCI_HC_DEV *Ohc,
83 IN TD_DESCRIPTOR *Td,
84 OUT UINT32 *Result
85 )
86 {
87 UINT32 TdCompletionCode;
88
89 *Result = EFI_USB_NOERROR;
90
91 while (Td) {
92 TdCompletionCode = Td->Word0.ConditionCode;
93
94 *Result |= ConvertErrorCode(TdCompletionCode);
95 //
96 // if any error encountered, stop processing the left TDs.
97 //
98 if (*Result) {
99 return FALSE;
100 }
101
102 Td = Td->NextTDPointer;
103 }
104 return TRUE;
105
106 }
107
108
109 /**
110
111 Check the task status on an ED
112
113 @Param Ed Pointer to the ED task that TD hooked on
114 @Param HeadTd TD header for current transaction
115
116 @retval Task Status Code
117
118 **/
119
120 UINT32
121 CheckEDStatus (
122 IN ED_DESCRIPTOR *Ed,
123 IN TD_DESCRIPTOR *HeadTd
124 )
125 {
126 while(HeadTd != NULL) {
127 if (HeadTd->Word0.ConditionCode != 0) {
128 return HeadTd->Word0.ConditionCode;
129 }
130 HeadTd = HeadTd->NextTDPointer;
131 }
132
133 if (OhciGetEDField (Ed, ED_TDHEAD_PTR) != OhciGetEDField (Ed, ED_TDTAIL_PTR)) {
134 return TD_TOBE_PROCESSED;
135 }
136
137 return TD_NO_ERROR;
138 }
139
140 /**
141
142 Check the task status
143
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
149
150 @retval EFI_SUCCESS Task done
151 @retval EFI_NOT_READY Task on processing
152 @retval EFI_DEVICE_ERROR Some error occured
153
154 **/
155 EFI_STATUS
156 CheckIfDone (
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
162 )
163 {
164 *ErrorCode = TD_TOBE_PROCESSED;
165
166 switch (ListType) {
167 case CONTROL_LIST:
168 if (OhciGetHcCommandStatus (Ohc, CONTROL_LIST_FILLED) != 0) {
169 return EFI_NOT_READY;
170 }
171 break;
172
173 case BULK_LIST:
174 if (OhciGetHcCommandStatus (Ohc, BULK_LIST_FILLED) != 0) {
175 return EFI_NOT_READY;
176 }
177 break;
178
179 default:
180 break;
181 }
182
183 *ErrorCode = CheckEDStatus (Ed, HeadTd);
184
185
186 if (*ErrorCode == TD_NO_ERROR) {
187 return EFI_SUCCESS;
188 } else if (*ErrorCode == TD_TOBE_PROCESSED) {
189 return EFI_NOT_READY;
190 } else {
191 return EFI_DEVICE_ERROR;
192 }
193 }
194
195
196 /**
197
198 Convert TD condition code to Efi Status
199
200 @Param ConditionCode Condition code to convert
201
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
205
206 **/
207
208 EFI_STATUS
209 OhciTDConditionCodeToStatus (
210 IN UINT32 ConditionCode
211 )
212 {
213 if (ConditionCode == TD_NO_ERROR) {
214 return EFI_SUCCESS;
215 }
216
217 if (ConditionCode == TD_TOBE_PROCESSED) {
218 return EFI_NOT_READY;
219 }
220
221 return EFI_DEVICE_ERROR;
222 }
223