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 This program and the accompanying materials
8 are licensed and made available under the terms and conditions of the BSD License
9 which accompanies this distribution. The full text of the license may be found at
10 http://opensource.org/licenses/bsd-license.php
12 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
13 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
26 @Param Ohc UHC private data
28 @retval TD structure pointer
33 IN USB_OHCI_HC_DEV
*Ohc
38 Td
= UsbHcAllocateMem(Ohc
->MemPool
, sizeof(TD_DESCRIPTOR
));
42 Td
->CurrBufferPointer
= NULL
;
44 Td
->BufferEndPointer
= NULL
;
45 Td
->NextTDPointer
= NULL
;
55 @Param Ohc UHC private data
56 @Param Td Pointer to a TD to free
58 @retval EFI_SUCCESS TD freed
63 IN USB_OHCI_HC_DEV
*Ohc
,
70 UsbHcFreeMem(Ohc
->MemPool
, Td
, sizeof(TD_DESCRIPTOR
));
80 @Param Ohc Device private data
82 @retval ED descriptor pointer
91 Ed
= UsbHcAllocateMem(Ohc
->MemPool
, sizeof (ED_DESCRIPTOR
));
96 Ed
->TdTailPointer
= NULL
;
97 Ed
->Word2
.TdHeadPointer
= RIGHT_SHIFT_4 ((UINT32
) NULL
);
107 @Param Ohc UHC private data
108 @Param Ed Pointer to a ED to free
110 @retval EFI_SUCCESS ED freed
116 IN USB_OHCI_HC_DEV
*Ohc
,
123 UsbHcFreeMem(Ohc
->MemPool
, Ed
, sizeof(ED_DESCRIPTOR
));
132 @Param Ohc Device private data
133 @Param Ed Pointer to a ED to free
135 @retval EFI_SUCCESS ED freed
139 OhciFreeAllTDFromED (
140 IN USB_OHCI_HC_DEV
*Ohc
,
144 TD_DESCRIPTOR
*HeadTd
;
145 TD_DESCRIPTOR
*TailTd
;
147 TD_DESCRIPTOR
*TempTd
;
153 HeadTd
= TD_PTR (Ed
->Word2
.TdHeadPointer
);
154 TailTd
= Ed
->TdTailPointer
;
157 while (Td
!= TailTd
) {
159 Td
= Td
->NextTDPointer
;
160 OhciFreeTD (Ohc
, TempTd
);
170 @Param Ed Ed to be attached
171 @Param NewEd Ed to attach
173 @retval EFI_SUCCESS NewEd attached to Ed
174 @retval EFI_INVALID_PARAMETER Ed is NULL
179 IN ED_DESCRIPTOR
*Ed
,
180 IN ED_DESCRIPTOR
*NewEd
186 return EFI_INVALID_PARAMETER
;
189 if (Ed
->NextED
== NULL
){
194 NewEd
->NextED
= Temp
;
201 Attach an ED to an ED list
203 @Param OHC UHC private data
204 @Param ListType Type of the ED list
205 @Param Ed ED to attach
206 @Param EdList ED list to be attached
208 @retval EFI_SUCCESS ED attached to ED list
213 IN USB_OHCI_HC_DEV
*Ohc
,
214 IN DESCRIPTOR_LIST_TYPE ListType
,
215 IN ED_DESCRIPTOR
*Ed
,
216 IN ED_DESCRIPTOR
*EdList
219 ED_DESCRIPTOR
*HeadEd
;
223 HeadEd
= (ED_DESCRIPTOR
*) OhciGetMemoryPointer (Ohc
, HC_CONTROL_HEAD
);
224 if (HeadEd
== NULL
) {
225 OhciSetMemoryPointer (Ohc
, HC_CONTROL_HEAD
, Ed
);
227 OhciAttachED (HeadEd
, Ed
);
232 HeadEd
= (ED_DESCRIPTOR
*) OhciGetMemoryPointer (Ohc
, HC_BULK_HEAD
);
233 if (HeadEd
== NULL
) {
234 OhciSetMemoryPointer (Ohc
, HC_BULK_HEAD
, Ed
);
236 OhciAttachED (HeadEd
, Ed
);
241 OhciAttachED (EdList
, Ed
);
252 Link Td2 to the end of Td1
254 @Param Td1 TD to be linked
255 @Param Td2 TD to link
257 @retval EFI_SUCCESS TD successfully linked
258 @retval EFI_INVALID_PARAMETER Td1 is NULL
263 IN TD_DESCRIPTOR
*Td1
,
264 IN TD_DESCRIPTOR
*Td2
267 TD_DESCRIPTOR
*TempTd
;
270 return EFI_INVALID_PARAMETER
;
278 while (TempTd
->NextTD
!= NULL
) {
279 TempTd
= TempTd
->NextTD
;
282 TempTd
->NextTD
= Td2
;
283 TempTd
->NextTDPointer
= Td2
;
293 @Param Ed ED which TD list attach on
294 @Param HeadTd Head of the TD list to attach
296 @retval EFI_SUCCESS TD list attached on the ED
300 OhciAttachTDListToED (
301 IN ED_DESCRIPTOR
*Ed
,
302 IN TD_DESCRIPTOR
*HeadTd
305 TD_DESCRIPTOR
*TempTd
;
307 TempTd
= TD_PTR (Ed
->Word2
.TdHeadPointer
);
309 if (TempTd
!= NULL
) {
310 while (TempTd
->NextTD
!= NULL
) {
311 TempTd
= TempTd
->NextTD
;
313 TempTd
->NextTD
= HeadTd
;
314 TempTd
->NextTDPointer
= HeadTd
;
316 Ed
->Word2
.TdHeadPointer
= RIGHT_SHIFT_4 ((UINT32
) HeadTd
);
325 Set value to ED specific field
327 @Param Ed ED to be set
328 @Param Field Field to be set
329 @Param Value Value to set
331 @retval EFI_SUCCESS Value set
336 IN ED_DESCRIPTOR
*Ed
,
341 if (Field
& ED_FUNC_ADD
) {
342 Ed
->Word0
.FunctionAddress
= Value
;
344 if (Field
& ED_ENDPT_NUM
) {
345 Ed
->Word0
.EndPointNum
= Value
;
347 if (Field
& ED_DIR
) {
348 Ed
->Word0
.Direction
= Value
;
350 if (Field
& ED_SPEED
) {
351 Ed
->Word0
.Speed
= Value
;
353 if (Field
& ED_SKIP
) {
354 Ed
->Word0
.Skip
= Value
;
356 if (Field
& ED_FORMAT
) {
357 Ed
->Word0
.Format
= Value
;
359 if (Field
& ED_MAX_PACKET
) {
360 Ed
->Word0
.MaxPacketSize
= Value
;
362 if (Field
& ED_PDATA
) {
363 Ed
->Word0
.FreeSpace
= Value
;
365 if (Field
& ED_ZERO
) {
366 Ed
->Word2
.Zero
= Value
;
368 if (Field
& ED_TDTAIL_PTR
) {
369 Ed
->TdTailPointer
= (VOID
*) Value
;
372 if (Field
& ED_HALTED
) {
373 Ed
->Word2
.Halted
= Value
;
375 if (Field
& ED_DTTOGGLE
) {
376 Ed
->Word2
.ToggleCarry
= Value
;
378 if (Field
& ED_TDHEAD_PTR
) {
379 Ed
->Word2
.TdHeadPointer
= RIGHT_SHIFT_4 (Value
);
382 if (Field
& ED_NEXT_EDPTR
) {
383 Ed
->NextED
= (VOID
*) Value
;
391 Get value from an ED's specific field
394 @Param Field Field to get value from
396 @retval Value of the field
401 IN ED_DESCRIPTOR
*Ed
,
407 return Ed
->Word0
.FunctionAddress
;
410 return Ed
->Word0
.EndPointNum
;
413 return Ed
->Word0
.Direction
;
416 return Ed
->Word0
.Speed
;
419 return Ed
->Word0
.Skip
;
422 return Ed
->Word0
.Format
;
425 return Ed
->Word0
.MaxPacketSize
;
429 return (UINT32
) Ed
->TdTailPointer
;
433 return Ed
->Word2
.Halted
;
437 return Ed
->Word2
.ToggleCarry
;
441 return Ed
->Word2
.TdHeadPointer
<< 4;
445 return (UINT32
) Ed
->NextED
;
458 Set value to TD specific field
460 @Param Td TD to be set
461 @Param Field Field to be set
462 @Param Value Value to set
464 @retval EFI_SUCCESS Value set
469 IN TD_DESCRIPTOR
*Td
,
474 if (Field
& TD_PDATA
) {
475 Td
->Word0
.Reserved
= Value
;
477 if (Field
& TD_BUFFER_ROUND
) {
478 Td
->Word0
.BufferRounding
= Value
;
480 if (Field
& TD_DIR_PID
) {
481 Td
->Word0
.DirPID
= Value
;
483 if (Field
& TD_DELAY_INT
) {
484 Td
->Word0
.DelayInterrupt
= Value
;
486 if (Field
& TD_DT_TOGGLE
) {
487 Td
->Word0
.DataToggle
= Value
| 0x2;
489 if (Field
& TD_ERROR_CNT
) {
490 Td
->Word0
.ErrorCount
= Value
;
492 if (Field
& TD_COND_CODE
) {
493 Td
->Word0
.ConditionCode
= Value
;
496 if (Field
& TD_CURR_BUFFER_PTR
) {
497 Td
->CurrBufferPointer
= (VOID
*) Value
;
501 if (Field
& TD_NEXT_PTR
) {
502 Td
->NextTD
= (VOID
*) Value
;
505 if (Field
& TD_BUFFER_END_PTR
) {
506 Td
->BufferEndPointer
= (VOID
*) Value
;
515 Get value from ED specific field
518 @Param Field Field to get value from
520 @retval Value of the field
526 IN TD_DESCRIPTOR
*Td
,
531 case TD_BUFFER_ROUND
:
532 return Td
->Word0
.BufferRounding
;
535 return Td
->Word0
.DirPID
;
538 return Td
->Word0
.DelayInterrupt
;
541 return Td
->Word0
.DataToggle
;
544 return Td
->Word0
.ErrorCount
;
547 return Td
->Word0
.ConditionCode
;
549 case TD_CURR_BUFFER_PTR
:
550 return (UINT32
) Td
->CurrBufferPointer
;
554 return (UINT32
) Td
->NextTD
;
557 case TD_BUFFER_END_PTR
:
558 return (UINT32
) Td
->BufferEndPointer
;