git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@1117 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			2682 lines
		
	
	
		
			48 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			2682 lines
		
	
	
		
			48 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*++
 | |
| 
 | |
| Copyright (c) 2006, Intel Corporation                                                         
 | |
| All rights reserved. This program and the accompanying materials                          
 | |
| are licensed and made available under the terms and conditions of the BSD License         
 | |
| which accompanies this distribution.  The full text of the license may be found at        
 | |
| http://opensource.org/licenses/bsd-license.php                                            
 | |
|                                                                                           
 | |
| THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
 | |
| WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             
 | |
| 
 | |
| Module Name:
 | |
| 
 | |
|     Ehci.h
 | |
|     
 | |
| Abstract: 
 | |
|     
 | |
| 
 | |
| Revision History
 | |
| --*/
 | |
| 
 | |
| #ifndef _EHCI_H
 | |
| #define _EHCI_H
 | |
| 
 | |
| //
 | |
| // Universal Host Controller Interface data structures and defines
 | |
| //
 | |
| #include <IndustryStandard/pci22.h>
 | |
| 
 | |
| extern UINTN  gEHCDebugLevel;
 | |
| extern UINTN  gEHCErrorLevel;
 | |
| 
 | |
| #define STALL_1_MACRO_SECOND              1
 | |
| #define STALL_1_MILLI_SECOND              1000 * STALL_1_MACRO_SECOND
 | |
| #define STALL_1_SECOND                    1000 * STALL_1_MILLI_SECOND
 | |
| 
 | |
| #define SETUP_PACKET_PID_CODE             0x02
 | |
| #define INPUT_PACKET_PID_CODE             0x01
 | |
| #define OUTPUT_PACKET_PID_CODE            0x0
 | |
| 
 | |
| #define ITD_SELECT_TYPE                   0x0
 | |
| #define QH_SELECT_TYPE                    0x01
 | |
| #define SITD_SELECT_TYPE                  0x02
 | |
| #define FSTN_SELECT_TYPE                  0x03
 | |
| 
 | |
| #define EHCI_SET_PORT_RESET_RECOVERY_TIME     50 * STALL_1_MILLI_SECOND
 | |
| #define EHCI_CLEAR_PORT_RESET_RECOVERY_TIME   STALL_1_MILLI_SECOND
 | |
| #define EHCI_GENERIC_TIMEOUT                  50 * STALL_1_MILLI_SECOND
 | |
| #define EHCI_GENERIC_RECOVERY_TIME            50 * STALL_1_MACRO_SECOND
 | |
| #define EHCI_SYNC_REQUEST_POLLING_TIME        50 * STALL_1_MACRO_SECOND
 | |
| #define EHCI_ASYNC_REQUEST_POLLING_TIME       50 * STALL_1_MILLI_SECOND
 | |
| 
 | |
| #define USB_BAR_INDEX                     0 /* how many bytes away from USB_BASE to 0x10 */
 | |
| 
 | |
| #define NORMAL_MEMORY_BLOCK_UNIT_IN_PAGES 1
 | |
| 
 | |
| #define EHCI_MIN_PACKET_SIZE              8
 | |
| #define EHCI_MAX_PACKET_SIZE              1024
 | |
| #define EHCI_MAX_FRAME_LIST_LENGTH        1024
 | |
| #define EHCI_BLOCK_SIZE_WITH_TT           64
 | |
| #define EHCI_BLOCK_SIZE                   512
 | |
| #define EHCI_MAX_QTD_CAPACITY             (EFI_PAGE_SIZE * 5)
 | |
| 
 | |
| #define NAK_COUNT_RELOAD                  3
 | |
| #define QTD_ERROR_COUNTER                 1
 | |
| #define HIGH_BANDWIDTH_PIPE_MULTIPLIER    1
 | |
| 
 | |
| #define QTD_STATUS_ACTIVE                 0x80
 | |
| #define QTD_STATUS_HALTED                 0x40
 | |
| #define QTD_STATUS_BUFFER_ERR             0x20
 | |
| #define QTD_STATUS_BABBLE_ERR             0x10
 | |
| #define QTD_STATUS_TRANSACTION_ERR        0x08
 | |
| #define QTD_STATUS_DO_STOP_SPLIT          0x02
 | |
| #define QTD_STATUS_DO_START_SPLIT         0
 | |
| #define QTD_STATUS_DO_PING                0x01
 | |
| #define QTD_STATUS_DO_OUT                 0
 | |
| 
 | |
| #define DATA0                             0
 | |
| #define DATA1                             1
 | |
| 
 | |
| #define MICRO_FRAME_0_CHANNEL             0x01
 | |
| #define MICRO_FRAME_1_CHANNEL             0x02
 | |
| #define MICRO_FRAME_2_CHANNEL             0x04
 | |
| #define MICRO_FRAME_3_CHANNEL             0x08
 | |
| #define MICRO_FRAME_4_CHANNEL             0x10
 | |
| #define MICRO_FRAME_5_CHANNEL             0x20
 | |
| #define MICRO_FRAME_6_CHANNEL             0x40
 | |
| #define MICRO_FRAME_7_CHANNEL             0x80
 | |
| 
 | |
| #define CONTROL_TRANSFER                  0x01
 | |
| #define BULK_TRANSFER                     0x02
 | |
| #define SYNC_INTERRUPT_TRANSFER           0x04
 | |
| #define ASYNC_INTERRUPT_TRANSFER          0x08
 | |
| #define SYNC_ISOCHRONOUS_TRANSFER         0x10
 | |
| #define ASYNC_ISOCHRONOUS_TRANSFER        0x20
 | |
| 
 | |
| 
 | |
| //
 | |
| // Enhanced Host Controller Registers definitions
 | |
| //
 | |
| extern UINT32                       mUsbCapabilityLen;
 | |
| extern EFI_DRIVER_BINDING_PROTOCOL  gEhciDriverBinding;
 | |
| extern EFI_COMPONENT_NAME_PROTOCOL  gEhciComponentName;
 | |
| 
 | |
| #define USBCMD            0x0     /* Command Register Offset 00-03h */
 | |
| #define USBCMD_RS         0x01    /* Run / Stop */
 | |
| #define USBCMD_HCRESET    0x02    /* Host controller reset */
 | |
| #define USBCMD_FLS_512    0x04    /* 512 elements (2048bytes) in Frame List */
 | |
| #define USBCMD_FLS_256    0x08    /* 256 elements (1024bytes) in Frame List */
 | |
| #define USBCMD_PSE        0x10    /* Periodic schedule enable */
 | |
| #define USBCMD_ASE        0x20    /* Asynchronous schedule enable */
 | |
| #define USBCMD_IAAD       0x40    /* Interrupt on async advance doorbell */
 | |
| 
 | |
| #define USBSTS            0x04    /* Statue Register Offset 04-07h */
 | |
| #define USBSTS_HSE        0x10    /* Host system error */
 | |
| #define USBSTS_IAA        0x20    /* Interrupt on async advance */
 | |
| #define USBSTS_HCH        0x1000  /* Host controller halted */
 | |
| #define USBSTS_PSS        0x4000  /* Periodic schedule status */
 | |
| #define USBSTS_ASS        0x8000  /* Asynchronous schedule status */
 | |
| 
 | |
| #define USBINTR           0x08    /* Command Register Offset 08-0bh */
 | |
| 
 | |
| #define FRINDEX           0x0c    /* Frame Index Offset 0c-0fh */
 | |
| 
 | |
| #define CTRLDSSGMENT      0x10    /* 4G Segment Selector Offset 10-13h */
 | |
| 
 | |
| #define PERIODICLISTBASE  0x14    /* Frame List Base Address Offset 14-17h */
 | |
| 
 | |
| #define ASYNCLISTADDR     0x18    /* Next Asynchronous List Address Offset 18-1bh */
 | |
| 
 | |
| #define CONFIGFLAG        0x40    /* Configured Flag Register Offset 40-43h */
 | |
| #define CONFIGFLAG_CF     0x01    /* Configure Flag */
 | |
| 
 | |
| #define PORTSC            0x44    /* Port Status/Control Offset 44-47h */
 | |
| #define PORTSC_CCS        0x01    /* Current Connect Status*/
 | |
| #define PORTSC_CSC        0x02    /* Connect Status Change */
 | |
| #define PORTSC_PED        0x04    /* Port Enable / Disable */
 | |
| #define PORTSC_PEDC       0x08    /* Port Enable / Disable Change */
 | |
| #define PORTSC_OCA        0x10    /* Over current Active */
 | |
| #define PORTSC_OCC        0x20    /* Over current Change */
 | |
| #define PORTSC_FPR        0x40    /* Force Port Resume */
 | |
| #define PORTSC_SUSP       0x80    /* Port Suspend State */
 | |
| #define PORTSC_PR         0x100   /* Port Reset */
 | |
| #define PORTSC_LS_KSTATE  0x400   /* Line Status K-state */
 | |
| #define PORTSC_LS_JSTATE  0x800   /* Line Status J-state */
 | |
| #define PORTSC_PP         0x1000  /* Port Power */
 | |
| #define PORTSC_PO         0x2000  /* Port Owner */
 | |
| 
 | |
| #define CAPLENGTH         0       /* Capability Register Length 00h */
 | |
| 
 | |
| #define HCIVERSION        0x02    /* Interface Version Number  02-03h */
 | |
| 
 | |
| #define HCSPARAMS         0x04    /* Structural Parameters 04-07h */
 | |
| #define HCSP_NPORTS       0x0f    /* Number of physical downstream ports on host controller */
 | |
| 
 | |
| #define HCCPARAMS         0x08    /* Capability Parameters 08-0bh */
 | |
| #define HCCP_64BIT        0x01    /* 64-bit Addressing Capability */
 | |
| #define HCCP_PFLF         0x02    /* Programmable Frame List Flag */
 | |
| #define HCCP_EECP         0xff00  /* EHCI Extemded Capabilities Pointer */
 | |
| 
 | |
| #define HCSPPORTROUTE     0x0c    /* Companion Port Route Description 60b */
 | |
| 
 | |
| #define CLASSC            0x09    /* Class Code 09-0bh */
 | |
| 
 | |
| #define USBBASE           0x10    /* Base Address to Memory-mapped Host Controller Register Space 10-13h */
 | |
| 
 | |
| #define SBRN              0x60    /* Serial Bus Release Number 60h */
 | |
| 
 | |
| #define FLADJ             0x61    /* Frame Length Adjustment Register 61h */
 | |
| 
 | |
| #define PORTWAKECAP       0x62    /* Port wake capablilities register(OPIONAL)  61-62h */
 | |
| 
 | |
| //
 | |
| // PCI Configuration Registers
 | |
| //
 | |
| #define EHCI_PCI_CLASSC         0x09
 | |
| #define EHCI_PCI_MEMORY_BASE    0x10
 | |
| 
 | |
| //
 | |
| // Memory Offset Registers
 | |
| //
 | |
| #define EHCI_MEMORY_CAPLENGTH   0x0
 | |
| #define EHCI_MEMORY_CONFIGFLAG  0x40
 | |
| 
 | |
| //
 | |
| // USB Base Class Code,Sub-Class Code and Programming Interface
 | |
| //
 | |
| #define PCI_CLASSC_PI_EHCI      0x20
 | |
| 
 | |
| #define SETUP_PACKET_ID         0x2D
 | |
| #define INPUT_PACKET_ID         0x69
 | |
| #define OUTPUT_PACKET_ID        0xE1
 | |
| #define ERROR_PACKET_ID         0x55
 | |
| 
 | |
| #define bit(a)                  1 << (a)
 | |
| 
 | |
| #define GET_0B_TO_31B(Addr)     (UINT32) (UINTN) (Addr)
 | |
| #define GET_32B_TO_63B(Addr)    (UINT32) (RShiftU64(((UINT64) (UINTN) (Addr)), 32) & 0xffffffff)
 | |
| 
 | |
| //
 | |
| // Ehci Data and Ctrl Structures
 | |
| //
 | |
| #pragma pack(1)
 | |
| 
 | |
| typedef struct {
 | |
|   UINT8 PI;
 | |
|   UINT8 SubClassCode;
 | |
|   UINT8 BaseCode;
 | |
| } USB_CLASSC;
 | |
| 
 | |
| typedef struct {
 | |
|   UINT32  NextQtdTerminate : 1;
 | |
|   UINT32  Rsvd1 : 4;
 | |
|   UINT32  NextQtdPointer : 27;
 | |
| 
 | |
|   UINT32  AltNextQtdTerminate : 1;
 | |
|   UINT32  Rsvd2 : 4;
 | |
|   UINT32  AltNextQtdPointer : 27;
 | |
| 
 | |
|   UINT32  Status : 8;
 | |
|   UINT32  PidCode : 2;
 | |
|   UINT32  ErrorCount : 2;
 | |
|   UINT32  CurrentPage : 3;
 | |
|   UINT32  InterruptOnComplete : 1;
 | |
|   UINT32  TotalBytes : 15;
 | |
|   UINT32  DataToggle : 1;
 | |
| 
 | |
|   UINT32  CurrentOffset : 12;
 | |
|   UINT32  BufferPointer0 : 20;
 | |
| 
 | |
|   UINT32  Rsvd3 : 12;
 | |
|   UINT32  BufferPointer1 : 20;
 | |
| 
 | |
|   UINT32  Rsvd4 : 12;
 | |
|   UINT32  BufferPointer2 : 20;
 | |
| 
 | |
|   UINT32  Rsvd5 : 12;
 | |
|   UINT32  BufferPointer3 : 20;
 | |
| 
 | |
|   UINT32  Rsvd6 : 12;
 | |
|   UINT32  BufferPointer4 : 20;
 | |
| 
 | |
|   UINT32  ExtBufferPointer0;
 | |
|   UINT32  ExtBufferPointer1;
 | |
|   UINT32  ExtBufferPointer2;
 | |
|   UINT32  ExtBufferPointer3;
 | |
|   UINT32  ExtBufferPointer4;
 | |
| } EHCI_QTD_HW;
 | |
| 
 | |
| typedef struct {
 | |
|   UINT32  QhTerminate : 1;
 | |
|   UINT32  SelectType : 2;
 | |
|   UINT32  Rsvd1 : 2;
 | |
|   UINT32  QhHorizontalPointer : 27;
 | |
| 
 | |
|   UINT32  DeviceAddr : 7;
 | |
|   UINT32  Inactive : 1;
 | |
|   UINT32  EndpointNum : 4;
 | |
|   UINT32  EndpointSpeed : 2;
 | |
|   UINT32  DataToggleControl : 1;
 | |
|   UINT32  HeadReclamationFlag : 1;
 | |
|   UINT32  MaxPacketLen : 11;
 | |
|   UINT32  ControlEndpointFlag : 1;
 | |
|   UINT32  NakCountReload : 4;
 | |
| 
 | |
|   UINT32  InerruptScheduleMask : 8;
 | |
|   UINT32  SplitComletionMask : 8;
 | |
|   UINT32  HubAddr : 7;
 | |
|   UINT32  PortNum : 7;
 | |
|   UINT32  Multiplier : 2;
 | |
| 
 | |
|   UINT32  Rsvd2 : 5;
 | |
|   UINT32  CurrentQtdPointer : 27;
 | |
| 
 | |
|   UINT32  NextQtdTerminate : 1;
 | |
|   UINT32  Rsvd3 : 4;
 | |
|   UINT32  NextQtdPointer : 27;
 | |
| 
 | |
|   UINT32  AltNextQtdTerminate : 1;
 | |
|   UINT32  NakCount : 4;
 | |
|   UINT32  AltNextQtdPointer : 27;
 | |
| 
 | |
|   UINT32  Status : 8;
 | |
|   UINT32  PidCode : 2;
 | |
|   UINT32  ErrorCount : 2;
 | |
|   UINT32  CurrentPage : 3;
 | |
|   UINT32  InterruptOnComplete : 1;
 | |
|   UINT32  TotalBytes : 15;
 | |
|   UINT32  DataToggle : 1;
 | |
| 
 | |
|   UINT32  CurrentOffset : 12;
 | |
|   UINT32  BufferPointer0 : 20;
 | |
| 
 | |
|   UINT32  CompleteSplitMask : 8;
 | |
|   UINT32  Rsvd4 : 4;
 | |
|   UINT32  BufferPointer1 : 20;
 | |
| 
 | |
|   UINT32  FrameTag : 5;
 | |
|   UINT32  SplitBytes : 7;
 | |
|   UINT32  BufferPointer2 : 20;
 | |
| 
 | |
|   UINT32  Rsvd5 : 12;
 | |
|   UINT32  BufferPointer3 : 20;
 | |
| 
 | |
|   UINT32  Rsvd6 : 12;
 | |
|   UINT32  BufferPointer4 : 20;
 | |
| 
 | |
|   UINT32  ExtBufferPointer0;
 | |
|   UINT32  ExtBufferPointer1;
 | |
|   UINT32  ExtBufferPointer2;
 | |
|   UINT32  ExtBufferPointer3;
 | |
|   UINT32  ExtBufferPointer4;
 | |
| } EHCI_QH_HW;
 | |
| 
 | |
| typedef struct {
 | |
|   UINT32  LinkTerminate : 1;
 | |
|   UINT32  SelectType : 2;
 | |
|   UINT32  Rsvd : 2;
 | |
|   UINT32  LinkPointer : 27;
 | |
| } FRAME_LIST_ENTRY;
 | |
| 
 | |
| #pragma pack()
 | |
| 
 | |
| typedef struct _EHCI_QTD_ENTITY     EHCI_QTD_ENTITY;
 | |
| typedef struct _EHCI_QH_ENTITY      EHCI_QH_ENTITY;
 | |
| typedef struct _EHCI_ASYNC_REQUEST  EHCI_ASYNC_REQUEST;
 | |
| 
 | |
| struct _EHCI_QTD_ENTITY {
 | |
|   EHCI_QTD_HW     Qtd;
 | |
|   UINT32          TotalBytes;
 | |
|   UINT32          StaticTotalBytes;
 | |
|   UINT32          StaticCurrentOffset;
 | |
|   EHCI_QTD_ENTITY *Prev;
 | |
|   EHCI_QTD_ENTITY *Next;
 | |
|   EHCI_QTD_ENTITY *AltNext;
 | |
|   EHCI_QH_ENTITY  *SelfQh;
 | |
| };
 | |
| 
 | |
| struct _EHCI_QH_ENTITY {
 | |
|   EHCI_QH_HW      Qh;
 | |
|   EHCI_QH_ENTITY  *Next;
 | |
|   EHCI_QH_ENTITY  *Prev;
 | |
|   EHCI_QTD_ENTITY *FirstQtdPtr;
 | |
|   EHCI_QTD_ENTITY *LastQtdPtr;
 | |
|   EHCI_QTD_ENTITY *AltQtdPtr;
 | |
|   UINTN           Interval;
 | |
|   UINT8           TransferType;
 | |
| };
 | |
| 
 | |
| #define GET_QH_ENTITY_ADDR(a)   ((EHCI_QH_ENTITY *) a)
 | |
| #define GET_QTD_ENTITY_ADDR(a)  ((EHCI_QTD_ENTITY *) a)
 | |
| 
 | |
| 
 | |
| //
 | |
| // Ehci Managment Structures
 | |
| //
 | |
| #define USB2_HC_DEV_FROM_THIS(a)  CR (a, USB2_HC_DEV, Usb2Hc, USB2_HC_DEV_SIGNATURE)
 | |
| 
 | |
| #define USB2_HC_DEV_SIGNATURE     EFI_SIGNATURE_32 ('e', 'h', 'c', 'i')
 | |
| 
 | |
| struct _EHCI_ASYNC_REQUEST {
 | |
|   UINT8                           TransferType;
 | |
|   EFI_ASYNC_USB_TRANSFER_CALLBACK CallBackFunc;
 | |
|   VOID                            *Context;
 | |
|   EHCI_ASYNC_REQUEST              *Prev;
 | |
|   EHCI_ASYNC_REQUEST              *Next;
 | |
|   EHCI_QH_ENTITY                  *QhPtr;
 | |
| };
 | |
| 
 | |
| typedef struct _MEMORY_MANAGE_HEADER {
 | |
|   UINT8                         *BitArrayPtr;
 | |
|   UINTN                         BitArraySizeInBytes;
 | |
|   UINT8                         *MemoryBlockPtr;
 | |
|   UINTN                         MemoryBlockSizeInBytes;
 | |
|   VOID                          *Mapping;
 | |
|   struct _MEMORY_MANAGE_HEADER  *Next;
 | |
| } MEMORY_MANAGE_HEADER;
 | |
| 
 | |
| typedef struct _USB2_HC_DEV {
 | |
|   UINTN                     Signature;
 | |
|   EFI_PCI_IO_PROTOCOL       *PciIo;
 | |
|   EFI_USB2_HC_PROTOCOL      Usb2Hc;
 | |
|   UINTN                     PeriodicFrameListLength;
 | |
|   VOID                      *PeriodicFrameListBuffer;
 | |
|   VOID                      *PeriodicFrameListMap;
 | |
|   VOID                      *AsyncList;
 | |
|   EHCI_ASYNC_REQUEST        *AsyncRequestList;
 | |
|   EFI_EVENT                 AsyncRequestEvent;
 | |
|   EFI_UNICODE_STRING_TABLE  *ControllerNameTable;
 | |
|   MEMORY_MANAGE_HEADER      *MemoryHeader;
 | |
|   UINT8						Is64BitCapable;
 | |
|   UINT32                    High32BitAddr;
 | |
| } USB2_HC_DEV;
 | |
| 
 | |
| 
 | |
| //
 | |
| // Internal Functions Declaration
 | |
| //
 | |
| 
 | |
| //
 | |
| // EhciMem Functions
 | |
| //
 | |
| EFI_STATUS
 | |
| CreateMemoryBlock (
 | |
|   IN  USB2_HC_DEV               *HcDev,
 | |
|   OUT MEMORY_MANAGE_HEADER      **MemoryHeader,
 | |
|   IN  UINTN                     MemoryBlockSizeInPages
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Use PciIo->AllocateBuffer to allocate common buffer for the memory block,
 | |
|   and use PciIo->Map to map the common buffer for Bus Master Read/Write.
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   HcDev                  - USB2_HC_DEV
 | |
|   MemoryHeader           - MEMORY_MANAGE_HEADER to output
 | |
|   MemoryBlockSizeInPages - MemoryBlockSizeInPages
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS           Success
 | |
|   EFI_OUT_OF_RESOURCES  Fail for no resources
 | |
|   EFI_UNSUPPORTED       Unsupported currently
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| EFI_STATUS
 | |
| FreeMemoryHeader (
 | |
|   IN USB2_HC_DEV               *HcDev,
 | |
|   IN MEMORY_MANAGE_HEADER      *MemoryHeader
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Free Memory Header
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   HcDev         - USB2_HC_DEV
 | |
|   MemoryHeader  - MemoryHeader to be freed
 | |
| 
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS            Success
 | |
|   EFI_INVALID_PARAMETER  Parameter is error
 | |
| 
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| VOID
 | |
| InsertMemoryHeaderToList (
 | |
|   IN MEMORY_MANAGE_HEADER     *MemoryHeader,
 | |
|   IN MEMORY_MANAGE_HEADER     *NewMemoryHeader
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Insert Memory Header To List
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   MemoryHeader    - MEMORY_MANAGE_HEADER
 | |
|   NewMemoryHeader - MEMORY_MANAGE_HEADER
 | |
| 
 | |
| Returns:
 | |
| 
 | |
|   VOID
 | |
| 
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| EFI_STATUS
 | |
| AllocMemInMemoryBlock (
 | |
|   IN  MEMORY_MANAGE_HEADER     *MemoryHeader,
 | |
|   OUT VOID                     **Pool,
 | |
|   IN  UINTN                    NumberOfMemoryUnit
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Alloc Memory In MemoryBlock
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   MemoryHeader        - MEMORY_MANAGE_HEADER
 | |
|   Pool                - Place to store pointer to memory
 | |
|   NumberOfMemoryUnit  - Number Of Memory Unit
 | |
| 
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS    Success
 | |
|   EFI_NOT_FOUND  Can't find the free memory 
 | |
| 
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| BOOLEAN
 | |
| IsMemoryBlockEmptied (
 | |
|   IN MEMORY_MANAGE_HEADER     *MemoryHeaderPtr
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Is Memory Block Emptied
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   MemoryHeaderPtr - MEMORY_MANAGE_HEADER
 | |
| 
 | |
| Returns:
 | |
| 
 | |
|   TRUE    Empty
 | |
|   FALSE   Not Empty 
 | |
| 
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| VOID
 | |
| DelinkMemoryBlock (
 | |
|   IN MEMORY_MANAGE_HEADER     *FirstMemoryHeader,
 | |
|   IN MEMORY_MANAGE_HEADER     *NeedFreeMemoryHeader
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Delink Memory Block
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   FirstMemoryHeader     - MEMORY_MANAGE_HEADER
 | |
|   NeedFreeMemoryHeader  - MEMORY_MANAGE_HEADER
 | |
| 
 | |
| Returns:
 | |
| 
 | |
|   VOID
 | |
| 
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| EFI_STATUS
 | |
| InitialMemoryManagement (
 | |
|   IN USB2_HC_DEV     *HcDev
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Initialize Memory Management
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   HcDev - USB2_HC_DEV
 | |
| 
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS        Success
 | |
|   EFI_DEVICE_ERROR   Fail
 | |
| 
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| EFI_STATUS
 | |
| DeinitialMemoryManagement (
 | |
|   IN USB2_HC_DEV     *HcDev
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Deinitialize Memory Management
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   HcDev - USB2_HC_DEV
 | |
| 
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS        Success
 | |
|   EFI_DEVICE_ERROR   Fail
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| EFI_STATUS
 | |
| EhciAllocatePool (
 | |
|   IN  USB2_HC_DEV     *HcDev,
 | |
|   OUT UINT8           **Pool,
 | |
|   IN  UINTN           AllocSize
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Ehci Allocate Pool
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   HcDev     - USB2_HC_DEV
 | |
|   Pool      - Place to store pointer to the memory buffer
 | |
|   AllocSize - Alloc Size
 | |
| 
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS        Success
 | |
|   EFI_DEVICE_ERROR   Fail
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| VOID
 | |
| EhciFreePool (
 | |
|   IN USB2_HC_DEV     *HcDev,
 | |
|   IN UINT8           *Pool,
 | |
|   IN UINTN           AllocSize
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Uhci Free Pool
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   HcDev     - USB_HC_DEV
 | |
|   Pool      - Pool to free
 | |
|   AllocSize - Pool size
 | |
| 
 | |
| Returns:
 | |
| 
 | |
|   VOID
 | |
| 
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| //
 | |
| // EhciReg Functions
 | |
| //
 | |
| EFI_STATUS
 | |
| ReadEhcCapabiltiyReg (
 | |
|   IN USB2_HC_DEV             *HcDev,
 | |
|   IN UINT32                  CapabiltiyRegAddr,
 | |
|   IN OUT UINT32              *Data
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Read  Ehc Capabitlity register
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   HcDev             - USB2_HC_DEV 
 | |
|   CapabiltiyRegAddr - Ehc Capability register address
 | |
|   Data              - A pointer to data read from register
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS        Success
 | |
|   EFI_DEVICE_ERROR   Fail
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| EFI_STATUS
 | |
| ReadEhcOperationalReg (
 | |
|   IN USB2_HC_DEV             *HcDev,
 | |
|   IN UINT32                  OperationalRegAddr,
 | |
|   IN OUT UINT32              *Data
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Read  Ehc Operation register
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   HcDev                - USB2_HC_DEV 
 | |
|   OperationalRegAddr   - Ehc Operation register address
 | |
|   Data                 - A pointer to data read from register
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS        Success
 | |
|   EFI_DEVICE_ERROR   Fail
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| EFI_STATUS
 | |
| WriteEhcOperationalReg (
 | |
|   IN USB2_HC_DEV             *HcDev,
 | |
|   IN UINT32                  OperationalRegAddr,
 | |
|   IN UINT32                  Data
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Write  Ehc Operation register
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   HcDev                - USB2_HC_DEV 
 | |
|   OperationalRegAddr   - Ehc Operation register address
 | |
|   Data                 - 32bit write to register
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS        Success
 | |
|   EFI_DEVICE_ERROR   Fail
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| EFI_STATUS
 | |
| SetEhcDoorbell (
 | |
|   IN  USB2_HC_DEV     *HcDev
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Set Ehc door bell bit
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   HcDev - USB2_HC_DEV 
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS       Success
 | |
|   EFI_DEVICE_ERROR  Fail
 | |
|      
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| EFI_STATUS
 | |
| SetFrameListLen (
 | |
|   IN USB2_HC_DEV     *HcDev,
 | |
|   IN UINTN           Length
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Set the length of Frame List
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   HcDev    - USB2_HC_DEV 
 | |
|   Length   - the required length of frame list
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS            Success
 | |
|   EFI_INVALID_PARAMETER  Invalid parameter
 | |
|   EFI_DEVICE_ERROR       Fail
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| BOOLEAN
 | |
| IsFrameListProgrammable (
 | |
|   IN  USB2_HC_DEV     *HcDev
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Whether frame list is programmable
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   HcDev - USB2_HC_DEV 
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   TRUE   Programmable
 | |
|   FALSE  Unprogrammable
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| BOOLEAN
 | |
| IsPeriodicScheduleEnabled (
 | |
|   IN  USB2_HC_DEV     *HcDev
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Whether periodic schedule is enabled
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   HcDev - USB2_HC_DEV 
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   TRUE   Enabled
 | |
|   FALSE  Disabled
 | |
|    
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| BOOLEAN
 | |
| IsAsyncScheduleEnabled (
 | |
|   IN  USB2_HC_DEV     *HcDev
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Whether asynchronous schedule is enabled
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   HcDev - USB2_HC_DEV 
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   TRUE   Enabled
 | |
|   FALSE  Disabled
 | |
|     
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| BOOLEAN
 | |
| IsEhcPortEnabled (
 | |
|   IN  USB2_HC_DEV     *HcDev,
 | |
|   IN  UINT8           PortNum
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Whether port is enabled
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   HcDev - USB2_HC_DEV 
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   TRUE   Enabled
 | |
|   FALSE  Disabled
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| BOOLEAN
 | |
| IsEhcReseted (
 | |
|   IN  USB2_HC_DEV     *HcDev
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Whether Ehc is halted
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   HcDev - USB2_HC_DEV 
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   TRUE   Reseted
 | |
|   FALSE  Unreseted
 | |
|     
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| BOOLEAN
 | |
| IsEhcHalted (
 | |
|   IN  USB2_HC_DEV     *HcDev
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Whether Ehc is halted
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   HcDev  - USB2_HC_DEV 
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   TRUE   Halted
 | |
|   FALSE  Not halted
 | |
|     
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| BOOLEAN
 | |
| IsEhcSysError (
 | |
|   IN  USB2_HC_DEV     *HcDev
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Whether Ehc is system error
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   HcDev  - USB2_HC_DEV 
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   TRUE   System error
 | |
|   FALSE  No system error
 | |
|     
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| BOOLEAN
 | |
| IsHighSpeedDevice (
 | |
|   IN EFI_USB2_HC_PROTOCOL *This,
 | |
|   IN UINT8                PortNum 
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Whether high speed device attached
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   HcDev - USB2_HC_DEV 
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   TRUE   High speed
 | |
|   FALSE  Full speed
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| EFI_STATUS
 | |
| WaitForEhcReset (
 | |
|   IN USB2_HC_DEV             *HcDev,
 | |
|   IN UINTN                   Timeout
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   wait for Ehc reset or timeout
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   HcDev   - USB2_HC_DEV 
 | |
|   Timeout - timeout threshold
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS    Success
 | |
|   EFI_TIMEOUT    Timeout
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| EFI_STATUS
 | |
| WaitForEhcHalt (
 | |
|   IN USB2_HC_DEV             *HcDev,
 | |
|   IN UINTN                   Timeout
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   wait for Ehc halt or timeout
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   HcDev   - USB2_HC_DEV 
 | |
|   Timeout - timeout threshold
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS    Success
 | |
|   EFI_TIMEOUT    Timeout
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| EFI_STATUS
 | |
| WaitForEhcNotHalt (
 | |
|   IN USB2_HC_DEV             *HcDev,
 | |
|   IN UINTN                   Timeout
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   wait for Ehc not halt or timeout
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   HcDev   - USB2_HC_DEV 
 | |
|   Timeout - timeout threshold
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS    Success
 | |
|   EFI_TIMEOUT    Timeout
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| EFI_STATUS
 | |
| WaitForEhcDoorbell (
 | |
|   IN  USB2_HC_DEV            *HcDev,
 | |
|   IN UINTN                   Timeout
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Wait for periodic schedule disable or timeout
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   HcDev   - USB2_HC_DEV 
 | |
|   Timeout - timeout threshold
 | |
| 
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS    Success
 | |
|   EFI_TIMEOUT    Timeout
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| EFI_STATUS
 | |
| WaitForAsyncScheduleEnable (
 | |
|   IN USB2_HC_DEV             *HcDev,
 | |
|   IN UINTN                   Timeout
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Wait for Ehc asynchronous schedule enable or timeout
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   HcDev   - USB2_HC_DEV 
 | |
|   Timeout - timeout threshold
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS    Success
 | |
|   EFI_TIMEOUT    Timeout
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| EFI_STATUS
 | |
| WaitForAsyncScheduleDisable (
 | |
|   IN USB2_HC_DEV             *HcDev,
 | |
|   IN UINTN                   Timeout
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Wait for Ehc asynchronous schedule disable or timeout
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   HcDev   - USB2_HC_DEV 
 | |
|   Timeout - timeout threshold
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS    Success
 | |
|   EFI_TIMEOUT    Timeout
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| EFI_STATUS
 | |
| WaitForPeriodicScheduleEnable (
 | |
|   IN USB2_HC_DEV             *HcDev,
 | |
|   IN UINTN                   Timeout
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Wait for Ehc periodic schedule enable or timeout
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   HcDev   - USB2_HC_DEV 
 | |
|   Timeout - timeout threshold
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS    Success
 | |
|   EFI_TIMEOUT    Timeout
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| EFI_STATUS
 | |
| WaitForPeriodicScheduleDisable (
 | |
|   IN USB2_HC_DEV             *HcDev,
 | |
|   IN UINTN                   Timeout
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Wait for periodic schedule disable or timeout
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   HcDev   - USB2_HC_DEV 
 | |
|   Timeout - timeout threshold
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS    Success
 | |
|   EFI_TIMEOUT    Timeout
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| EFI_STATUS
 | |
| GetCapabilityLen (
 | |
|   IN USB2_HC_DEV     *HcDev
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Get the length of capability register
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   HcDev - USB2_HC_DEV 
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS       Success
 | |
|   EFI_DEVICE_ERROR  Fail
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| EFI_STATUS
 | |
| SetFrameListBaseAddr (
 | |
|   IN USB2_HC_DEV     *HcDev,
 | |
|   IN UINT32          FrameBuffer
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Set base address of frame list first entry
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   HcDev       - USB2_HC_DEV 
 | |
|   FrameBuffer - base address of first entry of frame list
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS       Success
 | |
|   EFI_DEVICE_ERROR  Fail
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| EFI_STATUS
 | |
| SetAsyncListAddr (
 | |
|   IN USB2_HC_DEV        *HcDev,
 | |
|   IN EHCI_QH_ENTITY     *QhPtr
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Set address of first Async schedule Qh
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   HcDev    - USB2_HC_DEV 
 | |
|   QhPtr    - A pointer to first Qh in the Async schedule
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS       Success
 | |
|   EFI_DEVICE_ERROR  Fail
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| EFI_STATUS
 | |
| SetCtrlDataStructSeg (
 | |
|   IN USB2_HC_DEV     *HcDev
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Set address of first Async schedule Qh
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   HcDev    - USB2_HC_DEV 
 | |
|   QhPtr    - A pointer to first Qh in the Async schedule
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS       Success
 | |
|   EFI_DEVICE_ERROR  Fail
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| EFI_STATUS
 | |
| SetPortRoutingEhc (
 | |
|   IN USB2_HC_DEV     *HcDev
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Set Ehc port routing bit
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   HcDev - USB2_HC_DEV 
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS       Success
 | |
|   EFI_DEVICE_ERROR  Fail
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| EFI_STATUS
 | |
| EnablePeriodicSchedule (
 | |
|   IN  USB2_HC_DEV     *HcDev
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Enable periodic schedule
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   HcDev - USB2_HC_DEV 
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS       Success
 | |
|   EFI_DEVICE_ERROR  Fail
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| EFI_STATUS
 | |
| DisablePeriodicSchedule (
 | |
|   IN  USB2_HC_DEV     *HcDev
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Disable periodic schedule
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   HcDev - USB2_HC_DEV 
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS       Success
 | |
|   EFI_DEVICE_ERROR  Fail
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| EFI_STATUS
 | |
| EnableAsynchronousSchedule (
 | |
|   IN  USB2_HC_DEV     *HcDev
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Enable asynchrounous schedule
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   HcDev - USB2_HC_DEV 
 | |
|   
 | |
| Returns:
 | |
| 
 | |
| 
 | |
|   EFI_SUCCESS       Success
 | |
|   EFI_DEVICE_ERROR  Fail
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| EFI_STATUS
 | |
| DisableAsynchronousSchedule (
 | |
|   IN  USB2_HC_DEV     *HcDev
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Disable asynchrounous schedule
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   HcDev - USB2_HC_DEV 
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS       Success
 | |
|   EFI_DEVICE_ERROR  Fail
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| EFI_STATUS
 | |
| StartScheduleExecution (
 | |
|   IN  USB2_HC_DEV     *HcDev
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Start Ehc schedule execution
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   HcDev - USB2_HC_DEV 
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS       Success
 | |
|   EFI_DEVICE_ERROR  Fail
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| EFI_STATUS
 | |
| ResetEhc (
 | |
|   IN  USB2_HC_DEV     *HcDev
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Reset Ehc
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   HcDev - USB2_HC_DEV 
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS       Success
 | |
|   EFI_DEVICE_ERROR  Fail
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| EFI_STATUS
 | |
| ClearEhcAllStatus (
 | |
|   IN  USB2_HC_DEV     *HcDev
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Clear Ehc all status bits
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   HcDev - USB2_HC_DEV 
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS        Success
 | |
|   EFI_DEVICE_ERROR   Fail
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| //
 | |
| // EhciSched Functions
 | |
| //
 | |
| EFI_STATUS
 | |
| InitialPeriodicFrameList (
 | |
|   IN USB2_HC_DEV      *HcDev,
 | |
|   IN UINTN            Length
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Initialize Periodic Schedule Frame List
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   HcDev   - USB2_HC_DEV
 | |
|   Length  - Frame List Length
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS        Success
 | |
|   EFI_DEVICE_ERROR   Fail
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| VOID
 | |
| DeinitialPeriodicFrameList (
 | |
|   IN  USB2_HC_DEV     *HcDev
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Deinitialize Periodic Schedule Frame List
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   HcDev - USB2_HC_DEV
 | |
| 
 | |
| Returns:
 | |
| 
 | |
|   VOID
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| EFI_STATUS
 | |
| CreatePollingTimer (
 | |
|   IN  USB2_HC_DEV      *HcDev,
 | |
|   IN  EFI_EVENT_NOTIFY NotifyFunction
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Create Async Request Polling Timer
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   HcDev          - USB2_HC_DEV
 | |
|   NotifyFunction - Timer Notify Function
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS        Success
 | |
|   EFI_DEVICE_ERROR   Fail
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| EFI_STATUS
 | |
| DestoryPollingTimer (
 | |
|   IN  USB2_HC_DEV *HcDev
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Destory Async Request Polling Timer
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   HcDev - USB2_HC_DEV
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS        Success
 | |
|   EFI_DEVICE_ERROR   Fail
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| EFI_STATUS
 | |
| StartPollingTimer (
 | |
|   IN  USB2_HC_DEV *HcDev
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Start Async Request Polling Timer
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   HcDev - USB2_HC_DEV
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS        Success
 | |
|   EFI_DEVICE_ERROR   Fail
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| EFI_STATUS
 | |
| StopPollingTimer (
 | |
|   IN  USB2_HC_DEV *HcDev
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Stop Async Request Polling Timer
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   HcDev - USB2_HC_DEV
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS        Success
 | |
|   EFI_DEVICE_ERROR   Fail
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| EFI_STATUS
 | |
| CreateQh (
 | |
|   IN  USB2_HC_DEV         *HcDev,
 | |
|   IN  UINT8               DeviceAddr,
 | |
|   IN  UINT8               Endpoint,
 | |
|   IN  UINT8               DeviceSpeed,
 | |
|   IN  UINTN               MaxPacketLen,
 | |
|   OUT EHCI_QH_ENTITY      **QhPtrPtr
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Create Qh Structure and Pre-Initialize
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   HcDev          - USB2_HC_DEV 
 | |
|   DeviceAddr     - Address of Device
 | |
|   Endpoint       - Endpoint Number
 | |
|   DeviceSpeed    - Device Speed
 | |
|   MaxPacketLen   - Max Length of one Packet
 | |
|   QhPtrPtr       - A pointer of pointer to Qh for return
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS       Success
 | |
|   EFI_DEVICE_ERROR  Fail
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| EFI_STATUS
 | |
| CreateControlQh (
 | |
|   IN  USB2_HC_DEV                       *HcDev,
 | |
|   IN  UINT8                             DeviceAddr,
 | |
|   IN  UINT8                             DeviceSpeed,
 | |
|   IN UINTN                              MaxPacketLen,
 | |
|   IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Translator,
 | |
|   OUT EHCI_QH_ENTITY                    **QhPtrPtr
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Create Qh for Control Transfer
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   HcDev         - USB2_HC_DEV 
 | |
|   DeviceAddr    - Address of Device
 | |
|   DeviceSpeed   - Device Speed
 | |
|   MaxPacketLen  - Max Length of one Packet
 | |
|   Translator    - Translator Transaction for SplitX
 | |
|   QhPtrPtr      - A pointer of pointer to Qh for return
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS       Success
 | |
|   EFI_DEVICE_ERROR  Fail
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| EFI_STATUS
 | |
| CreateBulkQh (
 | |
|   IN  USB2_HC_DEV                         *HcDev,
 | |
|   IN  UINT8                               DeviceAddr,
 | |
|   IN  UINT8                               EndPointAddr,
 | |
|   IN  UINT8                               DeviceSpeed,
 | |
|   IN  UINT8                               DataToggle,
 | |
|   IN  UINTN                               MaxPacketLen,
 | |
|   IN  EFI_USB2_HC_TRANSACTION_TRANSLATOR  *Translator,
 | |
|   OUT EHCI_QH_ENTITY                      **QhPtrPtr
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Create Qh for Bulk Transfer
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   HcDev         - USB2_HC_DEV 
 | |
|   DeviceAddr    - Address of Device
 | |
|   EndPointAddr  - Address of Endpoint
 | |
|   DeviceSpeed   - Device Speed
 | |
|   MaxPacketLen  - Max Length of one Packet
 | |
|   Translator    - Translator Transaction for SplitX
 | |
|   QhPtrPtr      - A pointer of pointer to Qh for return
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS       Success
 | |
|   EFI_DEVICE_ERROR  Fail
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| EFI_STATUS
 | |
| CreateInterruptQh (
 | |
|   IN  USB2_HC_DEV                        *HcDev,
 | |
|   IN  UINT8                              DeviceAddr,
 | |
|   IN  UINT8                              EndPointAddr,
 | |
|   IN  UINT8                              DeviceSpeed,
 | |
|   IN  UINT8                              DataToggle,
 | |
|   IN  UINTN                              MaxPacketLen,
 | |
|   IN  UINTN                              Interval,
 | |
|   IN  EFI_USB2_HC_TRANSACTION_TRANSLATOR *Translator,
 | |
|   OUT EHCI_QH_ENTITY                     **QhPtrPtr
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Create Qh for Control Transfer
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   HcDev        - USB2_HC_DEV 
 | |
|   DeviceAddr   - Address of Device
 | |
|   EndPointAddr - Address of Endpoint
 | |
|   DeviceSpeed  - Device Speed
 | |
|   MaxPacketLen - Max Length of one Packet
 | |
|   Interval     - value of interval
 | |
|   Translator   - Translator Transaction for SplitX
 | |
|   QhPtrPtr     - A pointer of pointer to Qh for return
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS       Success
 | |
|   EFI_DEVICE_ERROR  Fail
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| VOID
 | |
| DestoryQh (
 | |
|   IN  USB2_HC_DEV        *HcDev,
 | |
|   IN EHCI_QH_ENTITY      *QhPtr
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Destory Qh Structure 
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   HcDev - USB2_HC_DEV 
 | |
|   QhPtr - A pointer to Qh
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   VOID
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| EFI_STATUS
 | |
| CreateQtd (
 | |
|   IN  USB2_HC_DEV          *HcDev,
 | |
|   IN  UINT8                *DataPtr,
 | |
|   IN  UINTN                DataLen,
 | |
|   IN  UINT8                PktId,
 | |
|   IN  UINT8                Toggle,
 | |
|   IN  UINT8                QtdStatus,
 | |
|   OUT EHCI_QTD_ENTITY      **QtdPtrPtr
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Create Qtd Structure and Pre-Initialize it
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   HcDev       - USB2_HC_DEV 
 | |
|   DataPtr     - A pointer to user data buffer to transfer
 | |
|   DataLen     - Length of user data to transfer
 | |
|   PktId       - Packet Identification of this Qtd
 | |
|   Toggle      - Data Toggle of this Qtd
 | |
|   QtdStatus   - Default value of status of this Qtd
 | |
|   QtdPtrPtr   - A pointer of pointer to Qtd for return
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS            Success
 | |
|   EFI_OUT_OF_RESOURCES   Cannot allocate resources
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| EFI_STATUS
 | |
| CreateSetupQtd (
 | |
|   IN  USB2_HC_DEV          *HcDev,
 | |
|   IN  UINT8                *DevReqPtr,
 | |
|   OUT EHCI_QTD_ENTITY      **QtdPtrPtr
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Create Qtd Structure for Setup 
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   HcDev      - USB2_HC_DEV 
 | |
|   DevReqPtr  - A pointer to Device Request Data
 | |
|   QtdPtrPtr  - A pointer of pointer to Qtd for return
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS            Success
 | |
|   EFI_OUT_OF_RESOURCES   Cannot allocate resources
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| EFI_STATUS
 | |
| CreateDataQtd (
 | |
|   IN  USB2_HC_DEV           *HcDev,
 | |
|   IN  UINT8                 *DataPtr,
 | |
|   IN  UINTN                 DataLen,
 | |
|   IN  UINT8                 PktId,
 | |
|   IN  UINT8                 Toggle,
 | |
|   OUT EHCI_QTD_ENTITY       **QtdPtrPtr
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Create Qtd Structure for data 
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   HcDev       - USB2_HC_DEV 
 | |
|   DataPtr     - A pointer to user data buffer to transfer
 | |
|   DataLen     - Length of user data to transfer
 | |
|   PktId       - Packet Identification of this Qtd
 | |
|   Toggle      - Data Toggle of this Qtd
 | |
|   QtdPtrPtr   - A pointer of pointer to Qtd for return
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS            Success
 | |
|   EFI_OUT_OF_RESOURCES   Cannot allocate resources
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| EFI_STATUS
 | |
| CreateStatusQtd (
 | |
|   IN  USB2_HC_DEV           *HcDev,
 | |
|   IN  UINT8                 PktId,
 | |
|   OUT EHCI_QTD_ENTITY       **QtdPtrPtr
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Create Qtd Structure for status 
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   HcDev       - USB2_HC_DEV 
 | |
|   PktId       - Packet Identification of this Qtd
 | |
|   QtdPtrPtr   - A pointer of pointer to Qtd for return
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS            Success
 | |
|   EFI_OUT_OF_RESOURCES   Cannot allocate resources
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| EFI_STATUS
 | |
| CreateAltQtd (
 | |
|   IN  USB2_HC_DEV           *HcDev,
 | |
|   IN  UINT8                 PktId,
 | |
|   OUT EHCI_QTD_ENTITY       **QtdPtrPtr
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Create Qtd Structure for Alternative 
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   HcDev      - USB2_HC_DEV 
 | |
|   PktId      - Packet Identification of this Qtd
 | |
|   QtdPtrPtr  - A pointer of pointer to Qtd for return
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS            Success
 | |
|   EFI_OUT_OF_RESOURCES   Cannot allocate resources
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| EFI_STATUS
 | |
| CreateControlQtds (
 | |
|   IN  USB2_HC_DEV                         *HcDev,
 | |
|   IN UINT8                                DataPktId,
 | |
|   IN UINT8                                *RequestCursor,
 | |
|   IN UINT8                                *DataCursor,
 | |
|   IN UINTN                                DataLen,
 | |
|   IN  EFI_USB2_HC_TRANSACTION_TRANSLATOR  *Translator,
 | |
|   OUT EHCI_QTD_ENTITY                     **ControlQtdsHead
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Create Qtds list for Control Transfer 
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   HcDev           - USB2_HC_DEV 
 | |
|   DataPktId       - Packet Identification of Data Qtds
 | |
|   RequestCursor   - A pointer to request structure buffer to transfer
 | |
|   DataCursor      - A pointer to user data buffer to transfer
 | |
|   DataLen         - Length of user data to transfer
 | |
|   ControlQtdsHead - A pointer of pointer to first Qtd for control tranfer for return
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS       Success
 | |
|   EFI_DEVICE_ERROR  Fail
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| EFI_STATUS
 | |
| CreateBulkOrInterruptQtds (
 | |
|   IN  USB2_HC_DEV                          *HcDev,
 | |
|   IN  UINT8                                PktId,
 | |
|   IN  UINT8                                *DataCursor,
 | |
|   IN  UINTN                                DataLen,
 | |
|   IN  EFI_USB2_HC_TRANSACTION_TRANSLATOR   *Translator,
 | |
|   OUT EHCI_QTD_ENTITY                      **QtdsHead
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Create Qtds list for Bulk or Interrupt Transfer 
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   HcDev        - USB2_HC_DEV 
 | |
|   PktId        - Packet Identification of Qtds
 | |
|   DataCursor   - A pointer to user data buffer to transfer
 | |
|   DataLen      - Length of user data to transfer
 | |
|   DataToggle   - Data Toggle to start
 | |
|   Translator   - Translator Transaction for SplitX
 | |
|   QtdsHead     - A pointer of pointer to first Qtd for control tranfer for return
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS       Success
 | |
|   EFI_DEVICE_ERROR  Fail
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| VOID
 | |
| DestoryQtds (
 | |
|   IN USB2_HC_DEV          *HcDev,
 | |
|   IN EHCI_QTD_ENTITY      *FirstQtdPtr
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Destory all Qtds in the list
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   HcDev        - USB2_HC_DEV 
 | |
|   FirstQtdPtr  - A pointer to first Qtd in the list 
 | |
|     
 | |
| Returns:
 | |
| 
 | |
|   VOID
 | |
| 
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| VOID
 | |
| LinkQtdToQtd (
 | |
|   IN EHCI_QTD_ENTITY     *PreQtdPtr,
 | |
|   IN EHCI_QTD_ENTITY     *QtdPtr
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Link Qtds together
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   PreQtdPtr  - A pointer to pre Qtd
 | |
|   QtdPtr     - A pointer to next Qtd
 | |
|     
 | |
| Returns:
 | |
| 
 | |
|   VOID
 | |
| 
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| VOID
 | |
| LinkQtdsToAltQtd (
 | |
|   IN EHCI_QTD_ENTITY     *FirstQtdPtr,
 | |
|   IN EHCI_QTD_ENTITY     *AltQtdPtr
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Link AlterQtds together
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   FirstQtdPtr - A pointer to first Qtd in the list
 | |
|   AltQtdPtr - A pointer to alternative Qtd
 | |
|     
 | |
| Returns:
 | |
|   VOID
 | |
| 
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| VOID
 | |
| LinkQtdToQh (
 | |
|   IN EHCI_QH_ENTITY      *QhPtr,
 | |
|   IN EHCI_QTD_ENTITY     *QtdEntryPtr
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Link Qtds list to Qh
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   QhPtr   - A pointer to Qh
 | |
|   QtdPtr  - A pointer to first Qtd in the list
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   VOID
 | |
| 
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| EFI_STATUS
 | |
| LinkQhToAsyncList (
 | |
|   IN  USB2_HC_DEV       *HcDev,
 | |
|   IN EHCI_QH_ENTITY     *QhPtr
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Link Qh to Async Schedule List
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   HcDev - USB2_HC_DEV 
 | |
|   QhPtr - A pointer to Qh
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS       Success
 | |
|   EFI_DEVICE_ERROR  Fail
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| EFI_STATUS
 | |
| UnlinkQhFromAsyncList (
 | |
|   IN USB2_HC_DEV         *HcDev,
 | |
|   IN EHCI_QH_ENTITY      *QhPtr
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Unlink Qh from Async Schedule List
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   HcDev   - USB2_HC_DEV 
 | |
|   QhPtr   - A pointer to Qh
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS       Success
 | |
|   EFI_DEVICE_ERROR  Fail
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| VOID
 | |
| LinkQhToPeriodicList (
 | |
|   IN USB2_HC_DEV        *HcDev,
 | |
|   IN EHCI_QH_ENTITY     *QhPtr
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Link Qh to Periodic Schedule List
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   HcDev   - USB2_HC_DEV 
 | |
|   QhPtr   - A pointer to Qh
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   VOID
 | |
| 
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| VOID
 | |
| UnlinkQhFromPeriodicList (
 | |
|   IN USB2_HC_DEV         *HcDev,
 | |
|   IN EHCI_QH_ENTITY      *QhPtr,
 | |
|   IN UINTN                Interval
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Unlink Qh from Periodic Schedule List
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   HcDev     - USB2_HC_DEV 
 | |
|   QhPtr     - A pointer to Qh
 | |
|   Interval  - Interval of this periodic transfer
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   VOID
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| VOID
 | |
| LinkToAsyncReqeust (
 | |
|   IN  USB2_HC_DEV        *HcDev,
 | |
|   IN  EHCI_ASYNC_REQUEST *AsyncRequestPtr
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Llink AsyncRequest Entry to Async Request List
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   HcDev           - USB2_HC_DEV 
 | |
|   AsyncRequestPtr - A pointer to Async Request Entry
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   VOID
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| VOID
 | |
| UnlinkFromAsyncReqeust (
 | |
|   IN  USB2_HC_DEV        *HcDev,
 | |
|   IN  EHCI_ASYNC_REQUEST *AsyncRequestPtr
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Unlink AsyncRequest Entry from Async Request List
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   HcDev           - USB2_HC_DEV 
 | |
|   AsyncRequestPtr - A pointer to Async Request Entry
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   VOID
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| UINTN
 | |
| GetNumberOfQtd (
 | |
|   IN EHCI_QTD_ENTITY    *FirstQtdPtr
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Number of Qtds in the list
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   FirstQtdPtr - A pointer to first Qtd in the list
 | |
|     
 | |
| Returns:
 | |
| 
 | |
|   Number of Qtds in the list
 | |
| 
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| UINTN
 | |
| GetNumberOfTransaction (
 | |
|   IN UINTN    SizeOfData,
 | |
|   IN UINTN    SizeOfTransaction
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Number of Transactions in one Qtd
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   SizeOfData           - Size of one Qtd
 | |
|   SizeOfTransaction    - Size of one Transaction
 | |
|    
 | |
| Returns:
 | |
| 
 | |
|   Number of Transactions in this Qtd
 | |
| 
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| UINTN
 | |
| GetCapacityOfQtd (
 | |
|   IN UINT8    *BufferCursor
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Get Capacity of Qtd
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   BufferCursor  - BufferCursor of the Qtd
 | |
|    
 | |
| Returns:
 | |
| 
 | |
|   Capacity of Qtd
 | |
| 
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| UINTN
 | |
| GetApproxiOfInterval (
 | |
|   IN UINTN  Interval
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Get the approximate value in the 2 index sequence
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   Interval - the value of interval
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   approximate value of interval in the 2 index sequence
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| EHCI_QTD_HW *
 | |
| GetQtdNextPointer (
 | |
|   IN EHCI_QTD_HW *HwQtdPtr
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Get Qtd next pointer field
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   HwQtdPtr - A pointer to hardware Qtd structure
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   A pointer to next hardware Qtd structure
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| BOOLEAN
 | |
| IsQtdStatusActive (
 | |
|   IN EHCI_QTD_HW *HwQtdPtr
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Whether Qtd status is active or not
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   HwQtdPtr - A pointer to hardware Qtd structure
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   TRUE    Active
 | |
|   FALSE   Inactive
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| BOOLEAN
 | |
| IsQtdStatusHalted (
 | |
|   IN EHCI_QTD_HW *HwQtdPtr
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Whether Qtd status is halted or not
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   HwQtdPtr - A pointer to hardware Qtd structure
 | |
|   
 | |
| Returns:
 | |
| 
 | |
| 
 | |
|   TRUE    Halted
 | |
|   FALSE   Not halted
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| BOOLEAN
 | |
| IsQtdStatusBufferError (
 | |
|   IN EHCI_QTD_HW *HwQtdPtr
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Whether Qtd status is buffer error or not
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   HwQtdPtr - A pointer to hardware Qtd structure
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   TRUE    Buffer error
 | |
|   FALSE   No buffer error
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| BOOLEAN
 | |
| IsQtdStatusBabbleError (
 | |
|   IN EHCI_QTD_HW *HwQtdPtr
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Whether Qtd status is babble error or not
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   HwQtdPtr - A pointer to hardware Qtd structure
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   TRUE    Babble error
 | |
|   FALSE   No babble error
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| BOOLEAN
 | |
| IsQtdStatusTransactionError (
 | |
|   IN EHCI_QTD_HW *HwQtdPtr
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Whether Qtd status is transaction error or not
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   HwQtdPtr - A pointer to hardware Qtd structure
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   TRUE    Transaction error
 | |
|   FALSE   No transaction error
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| BOOLEAN
 | |
| IsDataInTransfer (
 | |
|   IN  UINT8     EndPointAddress
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Whether is a DataIn direction transfer
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   EndPointAddress - address of the endpoint 
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   TRUE    DataIn
 | |
|   FALSE   DataOut
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| EFI_STATUS
 | |
| MapDataBuffer (
 | |
|   IN  USB2_HC_DEV             *HcDev,
 | |
|   IN  EFI_USB_DATA_DIRECTION  TransferDirection,
 | |
|   IN  OUT VOID                *Data,
 | |
|   IN  OUT UINTN               *DataLength,
 | |
|   OUT UINT8                   *PktId,
 | |
|   OUT UINT8                   **DataCursor,
 | |
|   OUT VOID                    **DataMap
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Map address of user data buffer
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   HcDev             - USB2_HC_DEV 
 | |
|   TransferDirection - direction of transfer
 | |
|   Data              - A pointer to user data buffer 
 | |
|   DataLength        - length of user data
 | |
|   PktId             - Packte Identificaion
 | |
|   DataCursor        - mapped address to return
 | |
|   DataMap           - identificaion of this mapping to return
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS        Success
 | |
|   EFI_DEVICE_ERROR   Fail
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| EFI_STATUS
 | |
| MapRequestBuffer (
 | |
|   IN  USB2_HC_DEV             *HcDev,
 | |
|   IN  OUT VOID                *Request,
 | |
|   OUT UINT8                   **RequestCursor,
 | |
|   OUT VOID                    **RequestMap
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Map address of request structure buffer
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   HcDev           - USB2_HC_DEV 
 | |
|   Request         - A pointer to request structure
 | |
|   RequestCursor   - Mapped address of request structure to return
 | |
|   RequestMap      - Identificaion of this mapping to return
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS        Success
 | |
|   EFI_DEVICE_ERROR   Fail
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| VOID
 | |
| SetQtdBufferPointer (
 | |
|   IN EHCI_QTD_HW *QtdHwPtr,
 | |
|   IN VOID        *DataPtr,
 | |
|   IN UINTN       DataLen
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Set data buffer pointers in Qtd
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   QtdHwPtr  - A pointer to Qtd hardware structure 
 | |
|   DataPtr   - A pointer to user data buffer
 | |
|   DataLen   - Length of the user data buffer
 | |
|     
 | |
| Returns:
 | |
| 
 | |
|   VOID
 | |
| 
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| EHCI_QTD_HW *
 | |
| GetQtdAlternateNextPointer (
 | |
|   IN EHCI_QTD_HW *HwQtdPtr
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Get Qtd alternate next pointer field
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   HwQtdPtr - A pointer to hardware Qtd structure
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   A pointer to hardware alternate Qtd
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| VOID
 | |
| ZeroOutQhOverlay (
 | |
|   IN EHCI_QH_ENTITY *QhPtr
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Zero out the fields in Qh structure
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   QhPtr - A pointer to Qh structure
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   VOID
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| VOID
 | |
| UpdateAsyncRequestTransfer (
 | |
|   IN EHCI_ASYNC_REQUEST *AsyncRequestPtr,
 | |
|   IN UINT32             TransferResult,
 | |
|   IN UINTN              ErrTDPos
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Update asynchronous request transfer
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   AsyncRequestPtr  - A pointer to async request  
 | |
|   TransferResult   - transfer result 
 | |
|   ErrQtdPos        - postion of error Qtd
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   VOID
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| 
 | |
| EFI_STATUS
 | |
| DeleteAsyncRequestTransfer (
 | |
|   IN  USB2_HC_DEV     *HcDev,
 | |
|   IN  UINT8           DeviceAddress,
 | |
|   IN  UINT8           EndPointAddress,
 | |
|   OUT UINT8           *DataToggle
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Delete all asynchronous request transfer
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   HcDev           - USB2_HC_DEV 
 | |
|   DeviceAddress   - address of usb device
 | |
|   EndPointAddress - address of endpoint
 | |
|   DataToggle      - stored data toggle
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS        Success
 | |
|   EFI_DEVICE_ERROR   Fail
 | |
| 
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| VOID
 | |
| CleanUpAllAsyncRequestTransfer (
 | |
|   IN  USB2_HC_DEV *HcDev
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Clean up all asynchronous request transfer
 | |
|   
 | |
| Arguments:
 | |
| 
 | |
|   HcDev - USB2_HC_DEV 
 | |
|   
 | |
| Returns:
 | |
|   VOID
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| EFI_STATUS
 | |
| ExecuteTransfer (
 | |
|   IN  USB2_HC_DEV         *HcDev,
 | |
|   IN BOOLEAN              IsControl,
 | |
|   IN  EHCI_QH_ENTITY      *QhPtr,
 | |
|   IN OUT UINTN            *ActualLen,
 | |
|   OUT UINT8               *DataToggle,
 | |
|   IN  UINTN               TimeOut,
 | |
|   OUT UINT32              *TransferResult
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Execute Bulk or SyncInterrupt Transfer
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   HcDev            - USB2_HC_DEV
 | |
|   IsControl        - Is control transfer or not
 | |
|   QhPtr            - A pointer to Qh
 | |
|   ActualLen        - Actual transfered Len 
 | |
|   DataToggle       - Data Toggle
 | |
|   TimeOut          - TimeOut threshold
 | |
|   TransferResult   - Transfer result
 | |
|   
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS        Sucess
 | |
|   EFI_DEVICE_ERROR   Error
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| BOOLEAN
 | |
| CheckQtdsTransferResult (
 | |
|   IN BOOLEAN             IsControl,
 | |
|   IN  EHCI_QH_ENTITY     *QhPtr,
 | |
|   OUT UINT32             *Result,
 | |
|   OUT UINTN              *ErrQtdPos,
 | |
|   OUT UINTN              *ActualLen
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Check transfer result of Qtds
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   IsControl     - Is control transfer or not
 | |
|   QhPtr         - A pointer to Qh
 | |
|   Result        - Transfer result
 | |
|   ErrQtdPos     - Error TD Position
 | |
|   ActualLen     - Actual Transfer Size
 | |
| 
 | |
| Returns:
 | |
| 
 | |
|   TRUE    Qtds finished
 | |
|   FALSE   Not finish
 | |
|   
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| EFI_STATUS
 | |
| AsyncRequestMoniter (
 | |
|   IN EFI_EVENT     Event,
 | |
|   IN VOID          *Context
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
|   
 | |
|   Interrupt transfer periodic check handler
 | |
|     
 | |
| Arguments:
 | |
| 
 | |
|   Event     - Interrupt event
 | |
|   Context   - Pointer to USB2_HC_DEV
 | |
|     
 | |
| Returns:
 | |
|   
 | |
|   EFI_SUCCESS        Success
 | |
|   EFI_DEVICE_ERROR   Fail
 | |
|     
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| #endif
 |