4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPrivate Header file for Usb Host Controller PEIM
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCopyright (c) 2010, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncThis program and the accompanying materials
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncare licensed and made available under the terms and conditions
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncof the BSD License which accompanies this distribution. The
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfull text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynchttp://opensource.org/licenses/bsd-license.php
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncTHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifndef _EFI_EHCI_URB_H_
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define _EFI_EHCI_URB_H_
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct _PEI_EHC_QTD PEI_EHC_QTD;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct _PEI_EHC_QH PEI_EHC_QH;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct _PEI_URB PEI_URB;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define EHC_CTRL_TRANSFER 0x01
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define EHC_BULK_TRANSFER 0x02
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define EHC_INT_TRANSFER_SYNC 0x04
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define EHC_INT_TRANSFER_ASYNC 0x08
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define EHC_QTD_SIG SIGNATURE_32 ('U', 'S', 'B', 'T')
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define EHC_QH_SIG SIGNATURE_32 ('U', 'S', 'B', 'H')
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define EHC_URB_SIG SIGNATURE_32 ('U', 'S', 'B', 'R')
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// Hardware related bit definitions
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define EHC_TYPE_ITD 0x00
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define EHC_TYPE_QH 0x02
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define EHC_TYPE_SITD 0x04
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define EHC_TYPE_FSTN 0x06
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define QH_NAK_RELOAD 3
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define QH_HSHBW_MULTI 1
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define QTD_MAX_ERR 3
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define QTD_PID_OUTPUT 0x00
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define QTD_PID_INPUT 0x01
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define QTD_PID_SETUP 0x02
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define QTD_STAT_DO_OUT 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define QTD_STAT_DO_SS 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define QTD_STAT_DO_PING 0x01
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define QTD_STAT_DO_CS 0x02
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define QTD_STAT_TRANS_ERR 0x08
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define QTD_STAT_BABBLE_ERR 0x10
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define QTD_STAT_BUFF_ERR 0x20
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define QTD_STAT_HALTED 0x40
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define QTD_STAT_ACTIVE 0x80
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define QTD_STAT_ERR_MASK (QTD_STAT_TRANS_ERR | QTD_STAT_BABBLE_ERR | QTD_STAT_BUFF_ERR)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define QTD_MAX_BUFFER 4
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define QTD_BUF_LEN 4096
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define QTD_BUF_MASK 0x0FFF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define QH_MICROFRAME_0 0x01
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define QH_MICROFRAME_1 0x02
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define QH_MICROFRAME_2 0x04
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define QH_MICROFRAME_3 0x08
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define QH_MICROFRAME_4 0x10
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define QH_MICROFRAME_5 0x20
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define QH_MICROFRAME_6 0x40
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define QH_MICROFRAME_7 0x80
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define USB_ERR_SHORT_PACKET 0x200
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// Fill in the hardware link point: pass in a EHC_QH/QH_HW
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// pointer to QH_LINK; A EHC_QTD/QTD_HW pointer to QTD_LINK
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define QH_LINK(Addr, Type, Term) \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ((UINT32) ((EHC_LOW_32BIT (Addr) & 0xFFFFFFE0) | (Type) | ((Term) ? 1 : 0)))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define QTD_LINK(Addr, Term) QH_LINK((Addr), 0, (Term))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// The defination of EHCI hardware used data structure for
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// little endian architecture. The QTD and QH structures
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// are required to be 32 bytes aligned. Don't add members
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// to the head of the associated software strucuture.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#pragma pack(1)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 NextQtd;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 AltNext;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 Status : 8;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 Pid : 2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 ErrCnt : 2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 CurPage : 3;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 Ioc : 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 TotalBytes : 15;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 DataToggle : 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 Page[5];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 PageHigh[5];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} QTD_HW;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 HorizonLink;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Endpoint capabilities/Characteristics DWord 1 and DWord 2
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 DeviceAddr : 7;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 Inactive : 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 EpNum : 4;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 EpSpeed : 2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 DtCtrl : 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 ReclaimHead : 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 MaxPacketLen : 11;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 CtrlEp : 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 NakReload : 4;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 SMask : 8;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 CMask : 8;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 HubAddr : 7;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 PortNum : 7;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 Multiplier : 2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Transaction execution overlay area
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 CurQtd;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 NextQtd;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 AltQtd;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 Status : 8;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 Pid : 2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 ErrCnt : 2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 CurPage : 3;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 Ioc : 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 TotalBytes : 15;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 DataToggle : 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 Page[5];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 PageHigh[5];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} QH_HW;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#pragma pack()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// Endpoint address and its capabilities
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct _USB_ENDPOINT {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 DevAddr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 EpAddr; // Endpoint address, no direction encoded in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_USB_DATA_DIRECTION Direction;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 DevSpeed;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN MaxPacket;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 HubAddr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 HubPort;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 Toggle; // Data toggle, not used for control transfer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Type;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN PollRate; // Polling interval used by EHCI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} USB_ENDPOINT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// Software QTD strcture, this is used to manage all the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// QTD generated from a URB. Don't add fields before QtdHw.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstruct _PEI_EHC_QTD {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync QTD_HW QtdHw;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 Signature;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_LIST_ENTRY QtdList; // The list of QTDs to one end point
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *Data; // Buffer of the original data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN DataLen; // Original amount of data in this QTD
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync};
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// Software QH structure. All three different transaction types
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// supported by UEFI USB, that is the control/bulk/interrupt
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// transfers use the queue head and queue token strcuture.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// Interrupt QHs are linked to periodic frame list in the reversed
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// 2^N tree. Each interrupt QH is linked to the list starting at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// frame 0. There is a dummy interrupt QH linked to each frame as
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// a sentinental whose polling interval is 1. Synchronous interrupt
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// transfer is linked after this dummy QH.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// For control/bulk transfer, only synchronous (in the sense of UEFI)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// transfer is supported. A dummy QH is linked to EHCI AsyncListAddr
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// as the reclamation header. New transfer is inserted after this QH.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstruct _PEI_EHC_QH {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync QH_HW QhHw;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 Signature;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PEI_EHC_QH *NextQh; // The queue head pointed to by horizontal link
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_LIST_ENTRY Qtds; // The list of QTDs to this queue head
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Interval;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync};
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// URB (Usb Request Block) contains information for all kinds of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// usb requests.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstruct _PEI_URB {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 Signature;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_LIST_ENTRY UrbList;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Transaction information
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync USB_ENDPOINT Ep;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_USB_DEVICE_REQUEST *Request; // Control transfer only
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID *RequestPhy; // Address of the mapped request
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID *RequestMap;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID *Data;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN DataLen;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID *DataPhy; // Address of the mapped user data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID *DataMap;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_ASYNC_USB_TRANSFER_CALLBACK Callback;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID *Context;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Schedule data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PEI_EHC_QH *Qh;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Transaction result
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 Result;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Completed; // completed data length
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 DataToggle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync};
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Delete a single asynchronous interrupt transfer for
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the device and endpoint.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Ehc The EHCI device.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Data Current data not associated with a QTD.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param DataLen The length of the data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param PktId Packet ID to use in the QTD.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Toggle Data toggle to use in the QTD.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param MaxPacket Maximu packet length of the endpoint.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval the pointer to the created QTD or NULL if failed to create one.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPEI_EHC_QTD *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEhcCreateQtd (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN PEI_USB2_HC_DEV *Ehc,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 *Data,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN DataLen,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 PktId,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 Toggle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN MaxPacket
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Allocate and initialize a EHCI queue head.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Ehci The EHCI device.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Ep The endpoint to create queue head for.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval the pointer to the created queue head or NULL if failed to create one.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPEI_EHC_QH *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEhcCreateQh (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN PEI_USB2_HC_DEV *Ehci,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN USB_ENDPOINT *Ep
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Free an allocated URB. It is possible for it to be partially inited.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Ehc The EHCI device.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Urb The URB to free.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEhcFreeUrb (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN PEI_USB2_HC_DEV *Ehc,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN PEI_URB *Urb
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Create a new URB and its associated QTD.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Ehc The EHCI device.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param DevAddr The device address.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param EpAddr Endpoint addrress & its direction.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param DevSpeed The device speed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Toggle Initial data toggle to use.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param MaxPacket The max packet length of the endpoint.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Hub The transaction translator to use.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Type The transaction type.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Request The standard USB request for control transfer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Data The user data to transfer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param DataLen The length of data buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Callback The function to call when data is transferred.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Context The context to the callback.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Interval The interval for interrupt transfer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval the pointer to the created URB or NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPEI_URB *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEhcCreateUrb (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN PEI_USB2_HC_DEV *Ehc,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 DevAddr,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 EpAddr,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 DevSpeed,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 Toggle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN MaxPacket,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Hub,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Type,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_USB_DEVICE_REQUEST *Request,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Data,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN DataLen,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_ASYNC_USB_TRANSFER_CALLBACK Callback,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Context,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Interval
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif