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