2 This file contains URB request, each request is warpped in a
3 URB (Usb Request Block).
5 Copyright (c) 2013-2015 Intel Corporation.
7 SPDX-License-Identifier: BSD-2-Clause-Patent
20 @Param Ohc UHC private data
22 @retval TD structure pointer
27 IN USB_OHCI_HC_DEV
*Ohc
32 Td
= UsbHcAllocateMem(Ohc
->MemPool
, sizeof(TD_DESCRIPTOR
));
36 Td
->CurrBufferPointer
= NULL
;
38 Td
->BufferEndPointer
= NULL
;
39 Td
->NextTDPointer
= NULL
;
49 @Param Ohc UHC private data
50 @Param Td Pointer to a TD to free
52 @retval EFI_SUCCESS TD freed
57 IN USB_OHCI_HC_DEV
*Ohc
,
64 UsbHcFreeMem(Ohc
->MemPool
, Td
, sizeof(TD_DESCRIPTOR
));
74 @Param Ohc Device private data
76 @retval ED descriptor pointer
85 Ed
= UsbHcAllocateMem(Ohc
->MemPool
, sizeof (ED_DESCRIPTOR
));
90 Ed
->TdTailPointer
= NULL
;
91 Ed
->Word2
.TdHeadPointer
= RIGHT_SHIFT_4 ((UINT32
) NULL
);
101 @Param Ohc UHC private data
102 @Param Ed Pointer to a ED to free
104 @retval EFI_SUCCESS ED freed
110 IN USB_OHCI_HC_DEV
*Ohc
,
117 UsbHcFreeMem(Ohc
->MemPool
, Ed
, sizeof(ED_DESCRIPTOR
));
126 @Param Ohc Device private data
127 @Param Ed Pointer to a ED to free
129 @retval EFI_SUCCESS ED freed
133 OhciFreeAllTDFromED (
134 IN USB_OHCI_HC_DEV
*Ohc
,
138 TD_DESCRIPTOR
*HeadTd
;
139 TD_DESCRIPTOR
*TailTd
;
141 TD_DESCRIPTOR
*TempTd
;
147 HeadTd
= TD_PTR (Ed
->Word2
.TdHeadPointer
);
148 TailTd
= Ed
->TdTailPointer
;
151 while (Td
!= TailTd
) {
153 Td
= Td
->NextTDPointer
;
154 OhciFreeTD (Ohc
, TempTd
);
164 @Param Ed Ed to be attached
165 @Param NewEd Ed to attach
167 @retval EFI_SUCCESS NewEd attached to Ed
168 @retval EFI_INVALID_PARAMETER Ed is NULL
173 IN ED_DESCRIPTOR
*Ed
,
174 IN ED_DESCRIPTOR
*NewEd
180 return EFI_INVALID_PARAMETER
;
183 if (Ed
->NextED
== NULL
){
188 NewEd
->NextED
= Temp
;
195 Attach an ED to an ED list
197 @Param OHC UHC private data
198 @Param ListType Type of the ED list
199 @Param Ed ED to attach
200 @Param EdList ED list to be attached
202 @retval EFI_SUCCESS ED attached to ED list
207 IN USB_OHCI_HC_DEV
*Ohc
,
208 IN DESCRIPTOR_LIST_TYPE ListType
,
209 IN ED_DESCRIPTOR
*Ed
,
210 IN ED_DESCRIPTOR
*EdList
213 ED_DESCRIPTOR
*HeadEd
;
217 HeadEd
= (ED_DESCRIPTOR
*) OhciGetMemoryPointer (Ohc
, HC_CONTROL_HEAD
);
218 if (HeadEd
== NULL
) {
219 OhciSetMemoryPointer (Ohc
, HC_CONTROL_HEAD
, Ed
);
221 OhciAttachED (HeadEd
, Ed
);
226 HeadEd
= (ED_DESCRIPTOR
*) OhciGetMemoryPointer (Ohc
, HC_BULK_HEAD
);
227 if (HeadEd
== NULL
) {
228 OhciSetMemoryPointer (Ohc
, HC_BULK_HEAD
, Ed
);
230 OhciAttachED (HeadEd
, Ed
);
235 OhciAttachED (EdList
, Ed
);
246 Link Td2 to the end of Td1
248 @Param Td1 TD to be linked
249 @Param Td2 TD to link
251 @retval EFI_SUCCESS TD successfully linked
252 @retval EFI_INVALID_PARAMETER Td1 is NULL
257 IN TD_DESCRIPTOR
*Td1
,
258 IN TD_DESCRIPTOR
*Td2
261 TD_DESCRIPTOR
*TempTd
;
264 return EFI_INVALID_PARAMETER
;
272 while (TempTd
->NextTD
!= NULL
) {
273 TempTd
= TempTd
->NextTD
;
276 TempTd
->NextTD
= Td2
;
277 TempTd
->NextTDPointer
= Td2
;
287 @Param Ed ED which TD list attach on
288 @Param HeadTd Head of the TD list to attach
290 @retval EFI_SUCCESS TD list attached on the ED
294 OhciAttachTDListToED (
295 IN ED_DESCRIPTOR
*Ed
,
296 IN TD_DESCRIPTOR
*HeadTd
299 TD_DESCRIPTOR
*TempTd
;
301 TempTd
= TD_PTR (Ed
->Word2
.TdHeadPointer
);
303 if (TempTd
!= NULL
) {
304 while (TempTd
->NextTD
!= NULL
) {
305 TempTd
= TempTd
->NextTD
;
307 TempTd
->NextTD
= HeadTd
;
308 TempTd
->NextTDPointer
= HeadTd
;
310 Ed
->Word2
.TdHeadPointer
= RIGHT_SHIFT_4 ((UINT32
) HeadTd
);
319 Set value to ED specific field
321 @Param Ed ED to be set
322 @Param Field Field to be set
323 @Param Value Value to set
325 @retval EFI_SUCCESS Value set
330 IN ED_DESCRIPTOR
*Ed
,
335 if (Field
& ED_FUNC_ADD
) {
336 Ed
->Word0
.FunctionAddress
= Value
;
338 if (Field
& ED_ENDPT_NUM
) {
339 Ed
->Word0
.EndPointNum
= Value
;
341 if (Field
& ED_DIR
) {
342 Ed
->Word0
.Direction
= Value
;
344 if (Field
& ED_SPEED
) {
345 Ed
->Word0
.Speed
= Value
;
347 if (Field
& ED_SKIP
) {
348 Ed
->Word0
.Skip
= Value
;
350 if (Field
& ED_FORMAT
) {
351 Ed
->Word0
.Format
= Value
;
353 if (Field
& ED_MAX_PACKET
) {
354 Ed
->Word0
.MaxPacketSize
= Value
;
356 if (Field
& ED_PDATA
) {
357 Ed
->Word0
.FreeSpace
= Value
;
359 if (Field
& ED_ZERO
) {
360 Ed
->Word2
.Zero
= Value
;
362 if (Field
& ED_TDTAIL_PTR
) {
363 Ed
->TdTailPointer
= (VOID
*) Value
;
366 if (Field
& ED_HALTED
) {
367 Ed
->Word2
.Halted
= Value
;
369 if (Field
& ED_DTTOGGLE
) {
370 Ed
->Word2
.ToggleCarry
= Value
;
372 if (Field
& ED_TDHEAD_PTR
) {
373 Ed
->Word2
.TdHeadPointer
= RIGHT_SHIFT_4 (Value
);
376 if (Field
& ED_NEXT_EDPTR
) {
377 Ed
->NextED
= (VOID
*) Value
;
385 Get value from an ED's specific field
388 @Param Field Field to get value from
390 @retval Value of the field
395 IN ED_DESCRIPTOR
*Ed
,
401 return Ed
->Word0
.FunctionAddress
;
404 return Ed
->Word0
.EndPointNum
;
407 return Ed
->Word0
.Direction
;
410 return Ed
->Word0
.Speed
;
413 return Ed
->Word0
.Skip
;
416 return Ed
->Word0
.Format
;
419 return Ed
->Word0
.MaxPacketSize
;
423 return (UINT32
) Ed
->TdTailPointer
;
427 return Ed
->Word2
.Halted
;
431 return Ed
->Word2
.ToggleCarry
;
435 return Ed
->Word2
.TdHeadPointer
<< 4;
439 return (UINT32
) Ed
->NextED
;
452 Set value to TD specific field
454 @Param Td TD to be set
455 @Param Field Field to be set
456 @Param Value Value to set
458 @retval EFI_SUCCESS Value set
463 IN TD_DESCRIPTOR
*Td
,
468 if (Field
& TD_PDATA
) {
469 Td
->Word0
.Reserved
= Value
;
471 if (Field
& TD_BUFFER_ROUND
) {
472 Td
->Word0
.BufferRounding
= Value
;
474 if (Field
& TD_DIR_PID
) {
475 Td
->Word0
.DirPID
= Value
;
477 if (Field
& TD_DELAY_INT
) {
478 Td
->Word0
.DelayInterrupt
= Value
;
480 if (Field
& TD_DT_TOGGLE
) {
481 Td
->Word0
.DataToggle
= Value
| 0x2;
483 if (Field
& TD_ERROR_CNT
) {
484 Td
->Word0
.ErrorCount
= Value
;
486 if (Field
& TD_COND_CODE
) {
487 Td
->Word0
.ConditionCode
= Value
;
490 if (Field
& TD_CURR_BUFFER_PTR
) {
491 Td
->CurrBufferPointer
= (VOID
*) Value
;
495 if (Field
& TD_NEXT_PTR
) {
496 Td
->NextTD
= (VOID
*) Value
;
499 if (Field
& TD_BUFFER_END_PTR
) {
500 Td
->BufferEndPointer
= (VOID
*) Value
;
509 Get value from ED specific field
512 @Param Field Field to get value from
514 @retval Value of the field
520 IN TD_DESCRIPTOR
*Td
,
525 case TD_BUFFER_ROUND
:
526 return Td
->Word0
.BufferRounding
;
529 return Td
->Word0
.DirPID
;
532 return Td
->Word0
.DelayInterrupt
;
535 return Td
->Word0
.DataToggle
;
538 return Td
->Word0
.ErrorCount
;
541 return Td
->Word0
.ConditionCode
;
543 case TD_CURR_BUFFER_PTR
:
544 return (UINT32
) Td
->CurrBufferPointer
;
548 return (UINT32
) Td
->NextTD
;
551 case TD_BUFFER_END_PTR
:
552 return (UINT32
) Td
->BufferEndPointer
;